{"version":3,"file":"ngx-image-cropper.mjs","sources":["../../../projects/ngx-image-cropper/src/lib/interfaces/cropper.settings.ts","../../../projects/ngx-image-cropper/src/lib/interfaces/move-start.interface.ts","../../../projects/ngx-image-cropper/src/lib/utils/keyboard.utils.ts","../../../projects/ngx-image-cropper/src/lib/utils/resize.utils.ts","../../../projects/ngx-image-cropper/src/lib/utils/percentage.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/crop.service.ts","../../../projects/ngx-image-cropper/src/lib/services/cropper-position.service.ts","../../../projects/ngx-image-cropper/src/lib/utils/exif.utils.ts","../../../projects/ngx-image-cropper/src/lib/services/load-image.service.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.ts","../../../projects/ngx-image-cropper/src/lib/component/image-cropper.component.html","../../../projects/ngx-image-cropper/src/lib/image-cropper.module.ts","../../../projects/ngx-image-cropper/src/lib/utils/blob.utils.ts","../../../projects/ngx-image-cropper/src/ngx-image-cropper.ts"],"sourcesContent":["import { CropperOptions, OutputFormat } from './cropper-options.interface';\r\nimport { ImageTransform } from './image-transform.interface';\r\nimport { SimpleChanges } from '@angular/core';\r\n\r\nexport class CropperSettings {\r\n\r\n  // From options\r\n  format: OutputFormat = 'png';\r\n  maintainAspectRatio = true;\r\n  transform: ImageTransform = {};\r\n  aspectRatio = 1;\r\n  resizeToWidth = 0;\r\n  resizeToHeight = 0;\r\n  cropperMinWidth = 0;\r\n  cropperMinHeight = 0;\r\n  cropperMaxHeight = 0;\r\n  cropperMaxWidth = 0;\r\n  cropperStaticWidth = 0;\r\n  cropperStaticHeight = 0;\r\n  canvasRotation = 0;\r\n  initialStepSize = 3;\r\n  roundCropper = false;\r\n  onlyScaleDown = false;\r\n  imageQuality = 92;\r\n  autoCrop = true;\r\n  backgroundColor: string | null = null;\r\n  containWithinAspectRatio = false;\r\n  hideResizeSquares = false;\r\n  alignImage: 'left' | 'center' = 'center';\r\n  fixAspectRatioBy: 'width' | 'height' | 'none' = 'width';\r\n  fixAspectRatioWidth = 0;\r\n  fixAspectRatioHeight = 0;\r\n  fixAttempts = 100;\r\n\r\n  // Internal\r\n  cropperScaledMinWidth = 20;\r\n  cropperScaledMinHeight = 20;\r\n  cropperScaledMaxWidth = 20;\r\n  cropperScaledMaxHeight = 20;\r\n  stepSize = this.initialStepSize;\r\n\r\n  setOptions(options: Partial<CropperOptions>): void {\r\n    Object.keys(options)\r\n      .filter((k) => k in this)\r\n      .forEach((k) => (this as any)[k] = (options as any)[k]);\r\n    this.validateOptions();\r\n  }\r\n\r\n  setOptionsFromChanges(changes: SimpleChanges): void {\r\n    Object.keys(changes)\r\n      .filter((k) => k in this)\r\n      .forEach((k) => (this as any)[k] = changes[k].currentValue);\r\n    this.validateOptions();\r\n  }\r\n\r\n  private validateOptions(): void {\r\n    if (this.maintainAspectRatio && !this.aspectRatio) {\r\n      throw new Error('`aspectRatio` should > 0 when `maintainAspectRatio` is enabled');\r\n    }\r\n  }\r\n}\r\n","import { ImageTransform } from './image-transform.interface';\r\n\r\nexport interface MoveStart {\r\n  active: boolean;\r\n  type: MoveTypes | null;\r\n  position: string | null;\r\n  transform?: ImageTransform;\r\n  x1: number;\r\n  y1: number;\r\n  x2: number;\r\n  y2: number;\r\n  clientX: number;\r\n  clientY: number;\r\n}\r\n\r\nexport enum MoveTypes {\r\n  Drag = 'drag',\r\n  Move = 'move',\r\n  Resize = 'resize',\r\n  Pinch = 'pinch'\r\n}\r\n","export function getPositionForKey(key: string): string {\r\n  switch (key) {\r\n    case 'ArrowUp':\r\n      return 'top';\r\n    case 'ArrowRight':\r\n      return 'right';\r\n    case 'ArrowDown':\r\n      return 'bottom';\r\n    case 'ArrowLeft':\r\n    default:\r\n      return 'left';\r\n  }\r\n}\r\n\r\nexport function getInvertedPositionForKey(key: string): string {\r\n  switch (key) {\r\n    case 'ArrowUp':\r\n      return 'bottom';\r\n    case 'ArrowRight':\r\n      return 'left';\r\n    case 'ArrowDown':\r\n      return 'top';\r\n    case 'ArrowLeft':\r\n    default:\r\n      return 'right';\r\n  }\r\n}\r\n\r\nexport function getEventForKey(key: string, stepSize: number): any {\r\n  switch (key) {\r\n    case 'ArrowUp':\r\n      return {clientX: 0, clientY: stepSize * -1};\r\n    case 'ArrowRight':\r\n      return {clientX: stepSize, clientY: 0};\r\n    case 'ArrowDown':\r\n      return {clientX: 0, clientY: stepSize};\r\n    case 'ArrowLeft':\r\n    default:\r\n      return {clientX: stepSize * -1, clientY: 0};\r\n  }\r\n}\r\n","/*\r\n * Hermite resize - fast image resize/resample using Hermite filter.\r\n * https://github.com/viliusle/Hermite-resize\r\n */\r\n\r\nexport function resizeCanvas(canvas: HTMLCanvasElement, width: number, height: number) {\r\n  const width_source = canvas.width;\r\n  const height_source = canvas.height;\r\n  width = Math.round(width);\r\n  height = Math.round(height);\r\n\r\n  const ratio_w = width_source / width;\r\n  const ratio_h = height_source / height;\r\n  const ratio_w_half = Math.ceil(ratio_w / 2);\r\n  const ratio_h_half = Math.ceil(ratio_h / 2);\r\n\r\n  const ctx = canvas.getContext('2d');\r\n  if (ctx) {\r\n    const img = ctx.getImageData(0, 0, width_source, height_source);\r\n    const img2 = ctx.createImageData(width, height);\r\n    const data = img.data;\r\n    const data2 = img2.data;\r\n\r\n    for (let j = 0; j < height; j++) {\r\n      for (let i = 0; i < width; i++) {\r\n        const x2 = (i + j * width) * 4;\r\n        const center_y = j * ratio_h;\r\n        let weight = 0;\r\n        let weights = 0;\r\n        let weights_alpha = 0;\r\n        let gx_r = 0;\r\n        let gx_g = 0;\r\n        let gx_b = 0;\r\n        let gx_a = 0;\r\n\r\n        const xx_start = Math.floor(i * ratio_w);\r\n        const yy_start = Math.floor(j * ratio_h);\r\n        let xx_stop = Math.ceil((i + 1) * ratio_w);\r\n        let yy_stop = Math.ceil((j + 1) * ratio_h);\r\n        xx_stop = Math.min(xx_stop, width_source);\r\n        yy_stop = Math.min(yy_stop, height_source);\r\n\r\n        for (let yy = yy_start; yy < yy_stop; yy++) {\r\n          const dy = Math.abs(center_y - yy) / ratio_h_half;\r\n          const center_x = i * ratio_w;\r\n          const w0 = dy * dy; //pre-calc part of w\r\n          for (let xx = xx_start; xx < xx_stop; xx++) {\r\n            const dx = Math.abs(center_x - xx) / ratio_w_half;\r\n            const w = Math.sqrt(w0 + dx * dx);\r\n            if (w >= 1) {\r\n              //pixel too far\r\n              continue;\r\n            }\r\n            //hermite filter\r\n            weight = 2 * w * w * w - 3 * w * w + 1;\r\n            const pos_x = 4 * (xx + yy * width_source);\r\n            //alpha\r\n            gx_a += weight * data[pos_x + 3];\r\n            weights_alpha += weight;\r\n            //colors\r\n            if (data[pos_x + 3] < 255)\r\n              weight = weight * data[pos_x + 3] / 250;\r\n            gx_r += weight * data[pos_x];\r\n            gx_g += weight * data[pos_x + 1];\r\n            gx_b += weight * data[pos_x + 2];\r\n            weights += weight;\r\n          }\r\n        }\r\n        data2[x2] = gx_r / weights;\r\n        data2[x2 + 1] = gx_g / weights;\r\n        data2[x2 + 2] = gx_b / weights;\r\n        data2[x2 + 3] = gx_a / weights_alpha;\r\n      }\r\n    }\r\n\r\n\r\n    canvas.width = width;\r\n    canvas.height = height;\r\n\r\n    //draw\r\n    ctx.putImageData(img2, 0, 0);\r\n  }\r\n}\r\n","export function percentage(percent: number, totalValue: number) {\r\n  return (percent / 100) * totalValue;\r\n} ","import { ElementRef, Injectable } from '@angular/core';\r\nimport { CropperPosition, ImageCroppedEvent, LoadedImage } from '../interfaces';\r\nimport { CropperSettings } from '../interfaces/cropper.settings';\r\nimport { resizeCanvas } from '../utils/resize.utils';\r\nimport { percentage } from '../utils/percentage.utils';\r\n\r\n@Injectable()\r\nexport class CropService {\r\n\r\n  crop(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): ImageCroppedEvent | null {\r\n    const imagePosition = this.getImagePosition(sourceImage, loadedImage, cropper, settings);\r\n    let width = imagePosition.x2 - imagePosition.x1;\r\n    let height = imagePosition.y2 - imagePosition.y1;\r\n    if (settings.fixAspectRatioWidth && settings.fixAspectRatioHeight) {\r\n      let currentFixAttempt = 0;\r\n      if (settings.fixAspectRatioBy === 'width') {\r\n        height = width / (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n        while (!Number.isInteger(height) && currentFixAttempt < settings.fixAttempts) {\r\n          width += 1;\r\n          height = width / (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n          if (height > loadedImage.original.size.height)\r\n            break;\r\n          currentFixAttempt += 1;\r\n        }\r\n        if (height > loadedImage.original.size.height) {\r\n          height = loadedImage.original.size.height;\r\n          width = height * (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n          while (!Number.isInteger(width) && currentFixAttempt < settings.fixAttempts) {\r\n            height -= 1;\r\n            width = height * (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n            currentFixAttempt += 1;\r\n          }\r\n        }\r\n      } else if (settings.fixAspectRatioBy === 'height') {\r\n        width = height * (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n        while (!Number.isInteger(width) && currentFixAttempt < settings.fixAttempts) {\r\n          height += 1;\r\n          width = height * (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n          if (width > loadedImage.original.size.width)\r\n            break;\r\n          currentFixAttempt += 1;\r\n        }\r\n        if (width > loadedImage.original.size.width) {\r\n          width = loadedImage.original.size.width;\r\n          height = width / (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n          while (!Number.isInteger(height) && currentFixAttempt < settings.fixAttempts) {\r\n            width -= 1;\r\n            height = width / (settings.fixAspectRatioWidth / settings.fixAspectRatioHeight);\r\n            currentFixAttempt += 1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    const cropCanvas = document.createElement('canvas') as HTMLCanvasElement;\r\n    cropCanvas.width = width;\r\n    cropCanvas.height = height;\r\n\r\n    const ctx = cropCanvas.getContext('2d');\r\n    if (!ctx) {\r\n      return null;\r\n    }\r\n    if (settings.backgroundColor != null) {\r\n      ctx.fillStyle = settings.backgroundColor;\r\n      ctx.fillRect(0, 0, width, height);\r\n    }\r\n\r\n    const scaleX = (settings.transform.scale || 1) * (settings.transform.flipH ? -1 : 1);\r\n    const scaleY = (settings.transform.scale || 1) * (settings.transform.flipV ? -1 : 1);\r\n\r\n    const transformedImage = loadedImage.transformed;\r\n    ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2, transformedImage.size.height / 2);\r\n    ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);\r\n    ctx.rotate((settings.transform.rotate || 0) * Math.PI / 180);\r\n\r\n    const { translateH, translateV } = this.getCanvasTranslate(sourceImage, loadedImage, settings);\r\n    ctx.drawImage(\r\n      transformedImage.image,\r\n      translateH - transformedImage.size.width / 2,\r\n      translateV - transformedImage.size.height / 2\r\n    );\r\n\r\n    const output: ImageCroppedEvent = {\r\n      width, height,\r\n      imagePosition,\r\n      cropperPosition: { ...cropper }\r\n    };\r\n    if (settings.containWithinAspectRatio) {\r\n      output.offsetImagePosition = this.getOffsetImagePosition(sourceImage, loadedImage, cropper, settings);\r\n    }\r\n    const resizeRatio = this.getResizeRatio(width, height, settings);\r\n    if (resizeRatio !== 1) {\r\n      output.width = Math.round(width * resizeRatio);\r\n      output.height = settings.maintainAspectRatio\r\n        ? Math.round(output.width / settings.aspectRatio)\r\n        : Math.round(height * resizeRatio);\r\n      resizeCanvas(cropCanvas, output.width, output.height);\r\n    }\r\n    output.base64 = cropCanvas.toDataURL('image/' + settings.format, this.getQuality(settings));\r\n    return output;\r\n  }\r\n\r\n  private getCanvasTranslate(sourceImage: ElementRef, loadedImage: LoadedImage, settings: CropperSettings): { translateH: number, translateV: number } {\r\n    if (settings.transform.translateUnit === 'px') {\r\n      const ratio = this.getRatio(sourceImage, loadedImage);\r\n      return {\r\n        translateH: (settings.transform.translateH || 0) * ratio,\r\n        translateV: (settings.transform.translateV || 0) * ratio\r\n      };\r\n    } else {\r\n      return {\r\n        translateH: settings.transform.translateH ? percentage(settings.transform.translateH, loadedImage.transformed.size.width) : 0,\r\n        translateV: settings.transform.translateV ? percentage(settings.transform.translateV, loadedImage.transformed.size.height) : 0\r\n      };\r\n    }\r\n  }\r\n\r\n  private getRatio(sourceImage: ElementRef, loadedImage: LoadedImage): number {\r\n    const sourceImageElement = sourceImage.nativeElement;\r\n    return loadedImage.transformed.size.width / sourceImageElement.offsetWidth;\r\n  }\r\n\r\n  private getImagePosition(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): CropperPosition {\r\n    const ratio = this.getRatio(sourceImage, loadedImage);\r\n    const out: CropperPosition = {\r\n      x1: Math.round(cropper.x1 * ratio),\r\n      y1: Math.round(cropper.y1 * ratio),\r\n      x2: Math.round(cropper.x2 * ratio),\r\n      y2: Math.round(cropper.y2 * ratio)\r\n    };\r\n\r\n    if (!settings.containWithinAspectRatio) {\r\n      out.x1 = Math.max(out.x1, 0);\r\n      out.y1 = Math.max(out.y1, 0);\r\n      out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\r\n      out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\r\n    }\r\n\r\n    return out;\r\n  }\r\n\r\n  private getOffsetImagePosition(sourceImage: ElementRef, loadedImage: LoadedImage, cropper: CropperPosition, settings: CropperSettings): CropperPosition {\r\n    const canvasRotation = settings.canvasRotation + loadedImage.exifTransform.rotate;\r\n    const sourceImageElement = sourceImage.nativeElement;\r\n    const ratio = loadedImage.transformed.size.width / sourceImageElement.offsetWidth;\r\n    let offsetX: number;\r\n    let offsetY: number;\r\n\r\n    if (canvasRotation % 2) {\r\n      offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.height) / 2;\r\n      offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.width) / 2;\r\n    } else {\r\n      offsetX = (loadedImage.transformed.size.width - loadedImage.original.size.width) / 2;\r\n      offsetY = (loadedImage.transformed.size.height - loadedImage.original.size.height) / 2;\r\n    }\r\n\r\n    const out: CropperPosition = {\r\n      x1: Math.round(cropper.x1 * ratio) - offsetX,\r\n      y1: Math.round(cropper.y1 * ratio) - offsetY,\r\n      x2: Math.round(cropper.x2 * ratio) - offsetX,\r\n      y2: Math.round(cropper.y2 * ratio) - offsetY\r\n    };\r\n\r\n    if (!settings.containWithinAspectRatio) {\r\n      out.x1 = Math.max(out.x1, 0);\r\n      out.y1 = Math.max(out.y1, 0);\r\n      out.x2 = Math.min(out.x2, loadedImage.transformed.size.width);\r\n      out.y2 = Math.min(out.y2, loadedImage.transformed.size.height);\r\n    }\r\n\r\n    return out;\r\n  }\r\n\r\n  getResizeRatio(width: number, height: number, settings: CropperSettings): number {\r\n    const ratioWidth = settings.resizeToWidth / width;\r\n    const ratioHeight = settings.resizeToHeight / height;\r\n    const ratios = new Array<number>();\r\n\r\n    if (settings.resizeToWidth > 0) {\r\n      ratios.push(ratioWidth);\r\n    }\r\n    if (settings.resizeToHeight > 0) {\r\n      ratios.push(ratioHeight);\r\n    }\r\n\r\n    const result = ratios.length === 0 ? 1 : Math.min(...ratios);\r\n\r\n    if (result > 1 && !settings.onlyScaleDown) {\r\n      return result;\r\n    }\r\n    return Math.min(result, 1);\r\n  }\r\n\r\n  getQuality(settings: CropperSettings): number {\r\n    return Math.min(1, Math.max(0, settings.imageQuality / 100));\r\n  }\r\n}\r\n","import { ElementRef, Injectable } from '@angular/core';\r\nimport { CropperPosition, Dimensions, MoveStart } from '../interfaces';\r\nimport { CropperSettings } from '../interfaces/cropper.settings';\r\n\r\n@Injectable()\r\nexport class CropperPositionService {\r\n\r\n  resetCropperPosition(sourceImage: ElementRef, cropperPosition: CropperPosition, settings: CropperSettings): void {\r\n    if (!sourceImage?.nativeElement) {\r\n      return;\r\n    }\r\n    const sourceImageElement = sourceImage.nativeElement;\r\n    if (settings.cropperStaticHeight && settings.cropperStaticWidth) {\r\n      cropperPosition.x1 = 0;\r\n      cropperPosition.x2 = sourceImageElement.offsetWidth > settings.cropperStaticWidth ?\r\n        settings.cropperStaticWidth : sourceImageElement.offsetWidth;\r\n      cropperPosition.y1 = 0;\r\n      cropperPosition.y2 = sourceImageElement.offsetHeight > settings.cropperStaticHeight ?\r\n        settings.cropperStaticHeight : sourceImageElement.offsetHeight;\r\n    } else {\r\n      const cropperWidth = Math.min(settings.cropperScaledMaxWidth, sourceImageElement.offsetWidth);\r\n      const cropperHeight = Math.min(settings.cropperScaledMaxHeight, sourceImageElement.offsetHeight);\r\n      if (!settings.maintainAspectRatio) {\r\n        cropperPosition.x1 = 0;\r\n        cropperPosition.x2 = cropperWidth;\r\n        cropperPosition.y1 = 0;\r\n        cropperPosition.y2 = cropperHeight;\r\n      } else if (sourceImageElement.offsetWidth / settings.aspectRatio < sourceImageElement.offsetHeight) {\r\n        cropperPosition.x1 = 0;\r\n        cropperPosition.x2 = cropperWidth;\r\n        const cropperHeightWithAspectRatio = cropperWidth / settings.aspectRatio;\r\n        cropperPosition.y1 = (sourceImageElement.offsetHeight - cropperHeightWithAspectRatio) / 2;\r\n        cropperPosition.y2 = cropperPosition.y1 + cropperHeightWithAspectRatio;\r\n      } else {\r\n        cropperPosition.y1 = 0;\r\n        cropperPosition.y2 = cropperHeight;\r\n        const cropperWidthWithAspectRatio = cropperHeight * settings.aspectRatio;\r\n        cropperPosition.x1 = (sourceImageElement.offsetWidth - cropperWidthWithAspectRatio) / 2;\r\n        cropperPosition.x2 = cropperPosition.x1 + cropperWidthWithAspectRatio;\r\n      }\r\n    }\r\n  }\r\n\r\n  move(event: any, moveStart: MoveStart, cropperPosition: CropperPosition) {\r\n    const diffX = this.getClientX(event) - moveStart.clientX;\r\n    const diffY = this.getClientY(event) - moveStart.clientY;\r\n\r\n    cropperPosition.x1 = moveStart.x1 + diffX;\r\n    cropperPosition.y1 = moveStart.y1 + diffY;\r\n    cropperPosition.x2 = moveStart.x2 + diffX;\r\n    cropperPosition.y2 = moveStart.y2 + diffY;\r\n  }\r\n\r\n  resize(event: any, moveStart: MoveStart, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\r\n    const moveX = this.getClientX(event) - moveStart.clientX;\r\n    const moveY = this.getClientY(event) - moveStart.clientY;\r\n    switch (moveStart.position) {\r\n      case 'left':\r\n        cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\r\n          cropperPosition.x2 - settings.cropperScaledMinWidth);\r\n        break;\r\n      case 'topleft':\r\n        cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\r\n          cropperPosition.x2 - settings.cropperScaledMinWidth);\r\n        cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\r\n          cropperPosition.y2 - settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'top':\r\n        cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\r\n          cropperPosition.y2 - settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'topright':\r\n        cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\r\n          cropperPosition.x1 + settings.cropperScaledMinWidth);\r\n        cropperPosition.y1 = Math.min(Math.max(moveStart.y1 + moveY, cropperPosition.y2 - settings.cropperScaledMaxHeight),\r\n          cropperPosition.y2 - settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'right':\r\n        cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\r\n          cropperPosition.x1 + settings.cropperScaledMinWidth);\r\n        break;\r\n      case 'bottomright':\r\n        cropperPosition.x2 = Math.max(Math.min(moveStart.x2 + moveX, cropperPosition.x1 + settings.cropperScaledMaxWidth),\r\n          cropperPosition.x1 + settings.cropperScaledMinWidth);\r\n        cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\r\n          cropperPosition.y1 + settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'bottom':\r\n        cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\r\n          cropperPosition.y1 + settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'bottomleft':\r\n        cropperPosition.x1 = Math.min(Math.max(moveStart.x1 + moveX, cropperPosition.x2 - settings.cropperScaledMaxWidth),\r\n          cropperPosition.x2 - settings.cropperScaledMinWidth);\r\n        cropperPosition.y2 = Math.max(Math.min(moveStart.y2 + moveY, cropperPosition.y1 + settings.cropperScaledMaxHeight),\r\n          cropperPosition.y1 + settings.cropperScaledMinHeight);\r\n        break;\r\n      case 'center':\r\n        const scale = event.scale;\r\n        const newWidth = Math.min(\r\n          Math.max(settings.cropperScaledMinWidth, (Math.abs(moveStart.x2 - moveStart.x1)) * scale),\r\n          settings.cropperScaledMaxWidth);\r\n        const newHeight = Math.min(\r\n          Math.max(settings.cropperScaledMinHeight, (Math.abs(moveStart.y2 - moveStart.y1)) * scale),\r\n          settings.cropperScaledMaxHeight);\r\n        cropperPosition.x1 = moveStart.clientX - newWidth / 2;\r\n        cropperPosition.x2 = moveStart.clientX + newWidth / 2;\r\n        cropperPosition.y1 = moveStart.clientY - newHeight / 2;\r\n        cropperPosition.y2 = moveStart.clientY + newHeight / 2;\r\n        if (cropperPosition.x1 < 0) {\r\n          cropperPosition.x2 -= cropperPosition.x1;\r\n          cropperPosition.x1 = 0;\r\n        } else if (cropperPosition.x2 > maxSize.width) {\r\n          cropperPosition.x1 -= (cropperPosition.x2 - maxSize.width);\r\n          cropperPosition.x2 = maxSize.width;\r\n        }\r\n        if (cropperPosition.y1 < 0) {\r\n          cropperPosition.y2 -= cropperPosition.y1;\r\n          cropperPosition.y1 = 0;\r\n        } else if (cropperPosition.y2 > maxSize.height) {\r\n          cropperPosition.y1 -= (cropperPosition.y2 - maxSize.height);\r\n          cropperPosition.y2 = maxSize.height;\r\n        }\r\n        break;\r\n    }\r\n\r\n    if (settings.maintainAspectRatio) {\r\n      this.checkAspectRatio(moveStart.position!, cropperPosition, maxSize, settings);\r\n    }\r\n  }\r\n\r\n  checkAspectRatio(position: string, cropperPosition: CropperPosition, maxSize: Dimensions, settings: CropperSettings): void {\r\n    let overflowX = 0;\r\n    let overflowY = 0;\r\n\r\n    switch (position) {\r\n      case 'top':\r\n        cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\r\n        overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\r\n        overflowY = Math.max(0 - cropperPosition.y1, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\r\n        }\r\n        break;\r\n      case 'bottom':\r\n        cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\r\n        overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\r\n        overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : (overflowX / settings.aspectRatio);\r\n        }\r\n        break;\r\n      case 'topleft':\r\n        cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\r\n        overflowX = Math.max(0 - cropperPosition.x1, 0);\r\n        overflowY = Math.max(0 - cropperPosition.y1, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\r\n        }\r\n        break;\r\n      case 'topright':\r\n        cropperPosition.y1 = cropperPosition.y2 - (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\r\n        overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\r\n        overflowY = Math.max(0 - cropperPosition.y1, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y1 += (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\r\n        }\r\n        break;\r\n      case 'right':\r\n      case 'bottomright':\r\n        cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\r\n        overflowX = Math.max(cropperPosition.x2 - maxSize.width, 0);\r\n        overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x2 -= (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\r\n        }\r\n        break;\r\n      case 'left':\r\n      case 'bottomleft':\r\n        cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\r\n        overflowX = Math.max(0 - cropperPosition.x1, 0);\r\n        overflowY = Math.max(cropperPosition.y2 - maxSize.height, 0);\r\n        if (overflowX > 0 || overflowY > 0) {\r\n          cropperPosition.x1 += (overflowY * settings.aspectRatio) > overflowX ? (overflowY * settings.aspectRatio) : overflowX;\r\n          cropperPosition.y2 -= (overflowY * settings.aspectRatio) > overflowX ? overflowY : overflowX / settings.aspectRatio;\r\n        }\r\n        break;\r\n      case 'center':\r\n        cropperPosition.x2 = cropperPosition.x1 + (cropperPosition.y2 - cropperPosition.y1) * settings.aspectRatio;\r\n        cropperPosition.y2 = cropperPosition.y1 + (cropperPosition.x2 - cropperPosition.x1) / settings.aspectRatio;\r\n        const overflowX1 = Math.max(0 - cropperPosition.x1, 0);\r\n        const overflowX2 = Math.max(cropperPosition.x2 - maxSize.width, 0);\r\n        const overflowY1 = Math.max(cropperPosition.y2 - maxSize.height, 0);\r\n        const overflowY2 = Math.max(0 - cropperPosition.y1, 0);\r\n        if (overflowX1 > 0 || overflowX2 > 0 || overflowY1 > 0 || overflowY2 > 0) {\r\n          cropperPosition.x1 += (overflowY1 * settings.aspectRatio) > overflowX1 ? (overflowY1 * settings.aspectRatio) : overflowX1;\r\n          cropperPosition.x2 -= (overflowY2 * settings.aspectRatio) > overflowX2 ? (overflowY2 * settings.aspectRatio) : overflowX2;\r\n          cropperPosition.y1 += (overflowY2 * settings.aspectRatio) > overflowX2 ? overflowY2 : overflowX2 / settings.aspectRatio;\r\n          cropperPosition.y2 -= (overflowY1 * settings.aspectRatio) > overflowX1 ? overflowY1 : overflowX1 / settings.aspectRatio;\r\n        }\r\n        break;\r\n    }\r\n  }\r\n\r\n  getClientX(event: any): number {\r\n    return event.touches?.[0].clientX || event.clientX || 0;\r\n  }\r\n\r\n  getClientY(event: any): number {\r\n    return event.touches?.[0].clientY || event.clientY || 0;\r\n  }\r\n}\r\n","import { ExifTransform } from '../interfaces/exif-transform.interface';\r\n\r\n// Black 2x1 JPEG, with the following meta information set:\r\n// - EXIF Orientation: 6 (Rotated 90° CCW)\r\n// Source: https://github.com/blueimp/JavaScript-Load-Image\r\nconst testAutoOrientationImageURL =\r\n  'data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAA' +\r\n  'AAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA' +\r\n  'QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQE' +\r\n  'BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/x' +\r\n  'ABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAA' +\r\n  'AAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==';\r\n\r\nexport function supportsAutomaticRotation(): Promise<boolean> {\r\n  return new Promise((resolve) => {\r\n    const img = new Image();\r\n    img.onload = () => {\r\n      // Check if browser supports automatic image orientation:\r\n      const supported = img.width === 1 && img.height === 2;\r\n      resolve(supported);\r\n    };\r\n    img.src = testAutoOrientationImageURL;\r\n  });\r\n}\r\n\r\nexport function getTransformationsFromExifData(exifRotationOrBase64Image: number | string): ExifTransform {\r\n  if (typeof exifRotationOrBase64Image === 'string') {\r\n    exifRotationOrBase64Image = getExifRotation(exifRotationOrBase64Image);\r\n  }\r\n  switch (exifRotationOrBase64Image) {\r\n    case 2:\r\n      return { rotate: 0, flip: true };\r\n    case 3:\r\n      return { rotate: 2, flip: false };\r\n    case 4:\r\n      return { rotate: 2, flip: true };\r\n    case 5:\r\n      return { rotate: 1, flip: true };\r\n    case 6:\r\n      return { rotate: 1, flip: false };\r\n    case 7:\r\n      return { rotate: 3, flip: true };\r\n    case 8:\r\n      return { rotate: 3, flip: false };\r\n    default:\r\n      return { rotate: 0, flip: false };\r\n  }\r\n}\r\n\r\nfunction getExifRotation(imageBase64: string): number {\r\n  const view = new DataView(base64ToArrayBuffer(imageBase64));\r\n  if (view.getUint16(0, false) !== 0xFFD8) {\r\n    return -2;\r\n  }\r\n  const length = view.byteLength;\r\n  let offset = 2;\r\n  while (offset < length) {\r\n    if (view.getUint16(offset + 2, false) <= 8) return -1;\r\n    const marker = view.getUint16(offset, false);\r\n    offset += 2;\r\n    if (marker == 0xFFE1) {\r\n      if (view.getUint32(offset += 2, false) !== 0x45786966) {\r\n        return -1;\r\n      }\r\n\r\n      const little = view.getUint16(offset += 6, false) == 0x4949;\r\n      offset += view.getUint32(offset + 4, little);\r\n      const tags = view.getUint16(offset, little);\r\n      offset += 2;\r\n      for (let i = 0; i < tags; i++) {\r\n        if (view.getUint16(offset + (i * 12), little) == 0x0112) {\r\n          return view.getUint16(offset + (i * 12) + 8, little);\r\n        }\r\n      }\r\n    } else if ((marker & 0xFF00) !== 0xFF00) {\r\n      break;\r\n    } else {\r\n      offset += view.getUint16(offset, false);\r\n    }\r\n  }\r\n  return -1;\r\n}\r\n\r\nfunction base64ToArrayBuffer(imageBase64: string) {\r\n  imageBase64 = imageBase64.replace(/^data\\:([^\\;]+)\\;base64,/gmi, '');\r\n  const binaryString = atob(imageBase64);\r\n  const len = binaryString.length;\r\n  const bytes = new Uint8Array(len);\r\n  for (let i = 0; i < len; i++) {\r\n    bytes[i] = binaryString.charCodeAt(i);\r\n  }\r\n  return bytes.buffer;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Dimensions, LoadedImage } from '../interfaces';\r\nimport { CropperSettings } from '../interfaces/cropper.settings';\r\nimport { ExifTransform } from '../interfaces/exif-transform.interface';\r\nimport { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';\r\n\r\ninterface LoadImageBase64 {\r\n  originalImage: HTMLImageElement;\r\n  originalBase64: string;\r\n}\r\n\r\n@Injectable()\r\nexport class LoadImageService {\r\n\r\n  private autoRotateSupported: Promise<boolean> = supportsAutomaticRotation();\r\n\r\n  loadImageFile(file: File, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    return new Promise((resolve, reject) => {\r\n      const fileReader = new FileReader();\r\n      fileReader.onload = (event: any) => {\r\n        this.loadImage(event.target.result, file.type, cropperSettings)\r\n          .then(resolve)\r\n          .catch(reject);\r\n      };\r\n      fileReader.readAsDataURL(file);\r\n    });\r\n  }\r\n\r\n  private loadImage(imageBase64: string, imageType: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    if (!this.isValidImageType(imageType)) {\r\n      return Promise.reject(new Error('Invalid image type'));\r\n    }\r\n    return this.loadBase64Image(imageBase64, cropperSettings);\r\n  }\r\n\r\n  private isValidImageType(type: string): boolean {\r\n    return /image\\/(png|jpg|jpeg|bmp|gif|tiff|webp|x-icon|vnd.microsoft.icon)/.test(type);\r\n  }\r\n\r\n  loadImageFromURL(url: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    return new Promise((resolve, reject) => {\r\n      const img = new Image();\r\n      img.onerror = () => reject;\r\n      img.onload = () => {\r\n        const canvas = document.createElement('canvas');\r\n        const context = canvas.getContext('2d');\r\n        canvas.width = img.width;\r\n        canvas.height = img.height;\r\n        context?.drawImage(img, 0, 0);\r\n        this.loadBase64Image(canvas.toDataURL(), cropperSettings).then(resolve);\r\n      };\r\n      img.crossOrigin = 'anonymous';\r\n      img.src = url;\r\n    });\r\n  }\r\n\r\n  loadBase64Image(imageBase64: string, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    return new Promise<LoadImageBase64>((resolve, reject) => {\r\n      const originalImage = new Image();\r\n      originalImage.onload = () => resolve({\r\n        originalImage,\r\n        originalBase64: imageBase64\r\n      });\r\n      originalImage.onerror = reject;\r\n      originalImage.src = imageBase64;\r\n    }).then((res: LoadImageBase64) => this.transformImageBase64(res, cropperSettings));\r\n  }\r\n\r\n  private async transformImageBase64(res: LoadImageBase64, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    const autoRotate = await this.autoRotateSupported;\r\n    const exifTransform = await getTransformationsFromExifData(autoRotate ? -1 : res.originalBase64);\r\n    if (!res.originalImage || !res.originalImage.complete) {\r\n      return Promise.reject(new Error('No image loaded'));\r\n    }\r\n    const loadedImage = {\r\n      original: {\r\n        base64: res.originalBase64,\r\n        image: res.originalImage,\r\n        size: {\r\n          width: res.originalImage.naturalWidth,\r\n          height: res.originalImage.naturalHeight\r\n        }\r\n      },\r\n      exifTransform\r\n    };\r\n    return this.transformLoadedImage(loadedImage, cropperSettings);\r\n  }\r\n\r\n  async transformLoadedImage(loadedImage: Partial<LoadedImage>, cropperSettings: CropperSettings): Promise<LoadedImage> {\r\n    const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform!.rotate;\r\n    const originalSize = {\r\n      width: loadedImage.original!.image.naturalWidth,\r\n      height: loadedImage.original!.image.naturalHeight\r\n    };\r\n    if (canvasRotation === 0 && !loadedImage.exifTransform!.flip && !cropperSettings.containWithinAspectRatio) {\r\n      return {\r\n        original: {\r\n          base64: loadedImage.original!.base64,\r\n          image: loadedImage.original!.image,\r\n          size: {...originalSize}\r\n        },\r\n        transformed: {\r\n          base64: loadedImage.original!.base64,\r\n          image: loadedImage.original!.image,\r\n          size: {...originalSize}\r\n        },\r\n        exifTransform: loadedImage.exifTransform!\r\n      };\r\n    }\r\n\r\n    const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform!, cropperSettings);\r\n    const canvas = document.createElement('canvas');\r\n    canvas.width = transformedSize.width;\r\n    canvas.height = transformedSize.height;\r\n    const ctx = canvas.getContext('2d');\r\n    ctx?.setTransform(\r\n      loadedImage.exifTransform!.flip ? -1 : 1,\r\n      0,\r\n      0,\r\n      1,\r\n      canvas.width / 2,\r\n      canvas.height / 2\r\n    );\r\n    ctx?.rotate(Math.PI * (canvasRotation / 2));\r\n    ctx?.drawImage(\r\n      loadedImage.original!.image,\r\n      -originalSize.width / 2,\r\n      -originalSize.height / 2\r\n    );\r\n    const transformedBase64 = canvas.toDataURL();\r\n    const transformedImage = await this.loadImageFromBase64(transformedBase64);\r\n    return {\r\n      original: {\r\n        base64: loadedImage.original!.base64,\r\n        image: loadedImage.original!.image,\r\n        size: {...originalSize}\r\n      },\r\n      transformed: {\r\n        base64: transformedBase64,\r\n        image: transformedImage,\r\n        size: {\r\n          width: transformedImage.width,\r\n          height: transformedImage.height\r\n        }\r\n      },\r\n      exifTransform: loadedImage.exifTransform!\r\n    };\r\n  }\r\n\r\n  private loadImageFromBase64(imageBase64: string): Promise<HTMLImageElement> {\r\n    return new Promise<HTMLImageElement>(((resolve, reject) => {\r\n      const image = new Image();\r\n      image.onload = () => resolve(image);\r\n      image.onerror = reject;\r\n      image.src = imageBase64;\r\n    }));\r\n  }\r\n\r\n  private getTransformedSize(\r\n    originalSize: { width: number, height: number },\r\n    exifTransform: ExifTransform,\r\n    cropperSettings: CropperSettings\r\n  ): Dimensions {\r\n    const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;\r\n    if (cropperSettings.containWithinAspectRatio) {\r\n      if (canvasRotation % 2) {\r\n        const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;\r\n        const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;\r\n        return {\r\n          width: Math.max(originalSize.height, minWidthToContain),\r\n          height: Math.max(originalSize.width, minHeightToContain)\r\n        };\r\n      } else {\r\n        const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;\r\n        const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;\r\n        return {\r\n          width: Math.max(originalSize.width, minWidthToContain),\r\n          height: Math.max(originalSize.height, minHeightToContain)\r\n        };\r\n      }\r\n    }\r\n\r\n    if (canvasRotation % 2) {\r\n      return {\r\n        height: originalSize.width,\r\n        width: originalSize.height\r\n      };\r\n    }\r\n    return {\r\n      width: originalSize.width,\r\n      height: originalSize.height\r\n    };\r\n  }\r\n}\r\n","import {\r\n  ChangeDetectionStrategy,\r\n  ChangeDetectorRef,\r\n  Component,\r\n  ElementRef,\r\n  EventEmitter,\r\n  HostBinding,\r\n  HostListener,\r\n  Input,\r\n  isDevMode,\r\n  OnChanges,\r\n  OnInit,\r\n  Output,\r\n  SimpleChanges,\r\n  ViewChild\r\n} from '@angular/core';\r\nimport { DomSanitizer, SafeStyle, SafeUrl } from '@angular/platform-browser';\r\nimport { CropperPosition, Dimensions, ImageCroppedEvent, ImageTransform, LoadedImage, MoveStart } from '../interfaces';\r\nimport { OutputFormat } from '../interfaces/cropper-options.interface';\r\nimport { CropperSettings } from '../interfaces/cropper.settings';\r\nimport { MoveTypes } from '../interfaces/move-start.interface';\r\nimport { CropService } from '../services/crop.service';\r\nimport { CropperPositionService } from '../services/cropper-position.service';\r\nimport { LoadImageService } from '../services/load-image.service';\r\nimport { HammerStatic } from '../utils/hammer.utils';\r\nimport { getEventForKey, getInvertedPositionForKey, getPositionForKey } from '../utils/keyboard.utils';\r\n\r\n@Component({\r\n  selector: 'image-cropper',\r\n  templateUrl: './image-cropper.component.html',\r\n  styleUrls: ['./image-cropper.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ImageCropperComponent implements OnChanges, OnInit {\r\n  private Hammer: HammerStatic = (window as any)?.['Hammer'] || null;\r\n  private settings = new CropperSettings();\r\n  private setImageMaxSizeRetries = 0;\r\n  private moveStart?: MoveStart;\r\n  private loadedImage?: LoadedImage;\r\n\r\n  safeImgDataUrl?: SafeUrl | string;\r\n  safeTransformStyle?: SafeStyle | string;\r\n  marginLeft: SafeStyle | string = '0px';\r\n  maxSize: Dimensions = {\r\n    width: 0,\r\n    height: 0\r\n  };\r\n  moveTypes = MoveTypes;\r\n  imageVisible = false;\r\n\r\n  @ViewChild('wrapper', {static: true}) wrapper!: ElementRef<HTMLDivElement>;\r\n  @ViewChild('sourceImage', {static: false}) sourceImage!: ElementRef<HTMLDivElement>;\r\n\r\n  @Input() imageChangedEvent?: any;\r\n  @Input() imageURL?: string;\r\n  @Input() imageBase64?: string;\r\n  @Input() imageFile?: File;\r\n  @Input() format: OutputFormat = this.settings.format;\r\n  @Input() transform: ImageTransform = {};\r\n  @Input() maintainAspectRatio = this.settings.maintainAspectRatio;\r\n  @Input() aspectRatio = this.settings.aspectRatio;\r\n  @Input() resizeToWidth = this.settings.resizeToWidth;\r\n  @Input() resizeToHeight = this.settings.resizeToHeight;\r\n  @Input() cropperMinWidth = this.settings.cropperMinWidth;\r\n  @Input() cropperMinHeight = this.settings.cropperMinHeight;\r\n  @Input() cropperMaxHeight = this.settings.cropperMaxHeight;\r\n  @Input() cropperMaxWidth = this.settings.cropperMaxWidth;\r\n  @Input() cropperStaticWidth = this.settings.cropperStaticWidth;\r\n  @Input() cropperStaticHeight = this.settings.cropperStaticHeight;\r\n  @Input() canvasRotation = this.settings.canvasRotation;\r\n  @Input() initialStepSize = this.settings.initialStepSize;\r\n  @Input() roundCropper = this.settings.roundCropper;\r\n  @Input() onlyScaleDown = this.settings.onlyScaleDown;\r\n  @Input() imageQuality = this.settings.imageQuality;\r\n  @Input() autoCrop = this.settings.autoCrop;\r\n  @Input() backgroundColor = this.settings.backgroundColor;\r\n  @Input() containWithinAspectRatio = this.settings.containWithinAspectRatio;\r\n  @Input() hideResizeSquares = this.settings.hideResizeSquares;\r\n  @Input() fixAspectRatioBy = this.settings.fixAspectRatioBy;\r\n  @Input() fixAspectRatioWidth = this.settings.fixAspectRatioWidth;\r\n  @Input() fixAspectRatioHeight = this.settings.fixAspectRatioHeight;\r\n  @Input() fixAttempts = this.settings.fixAttempts;\r\n  @Input() allowMoveImage = false;\r\n  @Input() cropper: CropperPosition = {\r\n    x1: -100,\r\n    y1: -100,\r\n    x2: 10000,\r\n    y2: 10000\r\n  };\r\n  @HostBinding('style.text-align')\r\n  @Input() alignImage: 'left' | 'center' = this.settings.alignImage;\r\n  @HostBinding('class.disabled')\r\n  @Input() disabled = false;\r\n\r\n  @Output() imageCropped = new EventEmitter<ImageCroppedEvent>();\r\n  @Output() startCropImage = new EventEmitter<void>();\r\n  @Output() imageLoaded = new EventEmitter<LoadedImage>();\r\n  @Output() cropperReady = new EventEmitter<Dimensions>();\r\n  @Output() loadImageFailed = new EventEmitter<void>();\r\n  @Output() transformChange = new EventEmitter<ImageTransform>();\r\n\r\n\r\n  constructor(\r\n    private cropService: CropService,\r\n    private cropperPositionService: CropperPositionService,\r\n    private loadImageService: LoadImageService,\r\n    private sanitizer: DomSanitizer,\r\n    private cd: ChangeDetectorRef\r\n  ) {\r\n    this.reset();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    this.onChangesUpdateSettings(changes);\r\n    this.onChangesInputImage(changes);\r\n\r\n    if (this.loadedImage?.original.image.complete && (changes['containWithinAspectRatio'] || changes['canvasRotation'])) {\r\n      this.loadImageService\r\n        .transformLoadedImage(this.loadedImage, this.settings)\r\n        .then((res) => this.setLoadedImage(res))\r\n        .catch((err) => this.loadImageError(err));\r\n    }\r\n    if (changes['cropper'] || changes['maintainAspectRatio'] || changes['aspectRatio']) {\r\n      this.setMaxSize();\r\n      this.setCropperScaledMinSize();\r\n      this.setCropperScaledMaxSize();\r\n      if (this.maintainAspectRatio && (changes['maintainAspectRatio'] || changes['aspectRatio'])) {\r\n        this.resetCropperPosition();\r\n      } else if (changes['cropper']) {\r\n        this.checkCropperPosition(false);\r\n        this.doAutoCrop();\r\n      }\r\n      this.cd.markForCheck();\r\n    }\r\n    if (changes['transform']) {\r\n      this.transform = this.transform || {};\r\n      this.setCssTransform();\r\n      this.doAutoCrop();\r\n      this.cd.markForCheck();\r\n    }\r\n  }\r\n\r\n  private onChangesUpdateSettings(changes: SimpleChanges) {\r\n    this.settings.setOptionsFromChanges(changes);\r\n\r\n    if (this.settings.cropperStaticHeight && this.settings.cropperStaticWidth) {\r\n      this.settings.setOptions({\r\n        hideResizeSquares: true,\r\n        cropperMinWidth: this.settings.cropperStaticWidth,\r\n        cropperMinHeight: this.settings.cropperStaticHeight,\r\n        cropperMaxHeight: this.settings.cropperStaticHeight,\r\n        cropperMaxWidth: this.settings.cropperStaticWidth,\r\n        maintainAspectRatio: false\r\n      });\r\n    }\r\n  }\r\n\r\n  private onChangesInputImage(changes: SimpleChanges): void {\r\n    if (changes['imageChangedEvent'] || changes['imageURL'] || changes['imageBase64'] || changes['imageFile']) {\r\n      this.reset();\r\n    }\r\n    if (changes['imageChangedEvent'] && this.isValidImageChangedEvent()) {\r\n      this.loadImageFile(this.imageChangedEvent.target.files[0]);\r\n    }\r\n    if (changes['imageURL'] && this.imageURL) {\r\n      this.loadImageFromURL(this.imageURL);\r\n    }\r\n    if (changes['imageBase64'] && this.imageBase64) {\r\n      this.loadBase64Image(this.imageBase64);\r\n    }\r\n    if (changes['imageFile'] && this.imageFile) {\r\n      this.loadImageFile(this.imageFile);\r\n    }\r\n  }\r\n\r\n  private isValidImageChangedEvent(): boolean {\r\n    return this.imageChangedEvent?.target?.files?.length > 0;\r\n  }\r\n\r\n  private setCssTransform() {\r\n    const translateUnit = this.transform?.translateUnit || '%';\r\n    this.safeTransformStyle = this.sanitizer.bypassSecurityTrustStyle(\r\n      'scaleX(' + (this.transform.scale || 1) * (this.transform.flipH ? -1 : 1) + ')' +\r\n      'scaleY(' + (this.transform.scale || 1) * (this.transform.flipV ? -1 : 1) + ')' +\r\n      'rotate(' + (this.transform.rotate || 0) + 'deg)' +\r\n      `translate(${this.transform.translateH || 0}${translateUnit}, ${this.transform.translateV || 0}${translateUnit})`\r\n    );\r\n  }\r\n\r\n  ngOnInit(): void {\r\n    this.settings.stepSize = this.initialStepSize;\r\n    this.activatePinchGesture();\r\n  }\r\n\r\n  private reset(): void {\r\n    this.imageVisible = false;\r\n    this.loadedImage = undefined;\r\n    this.safeImgDataUrl = 'data:image/png;base64,iVBORw0KGg'\r\n      + 'oAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAU'\r\n      + 'AAarVyFEAAAAASUVORK5CYII=';\r\n    this.moveStart = {\r\n      active: false,\r\n      type: null,\r\n      position: null,\r\n      x1: 0,\r\n      y1: 0,\r\n      x2: 0,\r\n      y2: 0,\r\n      clientX: 0,\r\n      clientY: 0\r\n    };\r\n    this.maxSize = {\r\n      width: 0,\r\n      height: 0\r\n    };\r\n    this.cropper.x1 = -100;\r\n    this.cropper.y1 = -100;\r\n    this.cropper.x2 = 10000;\r\n    this.cropper.y2 = 10000;\r\n  }\r\n\r\n  private loadImageFile(file: File): void {\r\n    this.loadImageService\r\n      .loadImageFile(file, this.settings)\r\n      .then((res) => this.setLoadedImage(res))\r\n      .catch((err) => this.loadImageError(err));\r\n  }\r\n\r\n  private loadBase64Image(imageBase64: string): void {\r\n    this.loadImageService\r\n      .loadBase64Image(imageBase64, this.settings)\r\n      .then((res) => this.setLoadedImage(res))\r\n      .catch((err) => this.loadImageError(err));\r\n  }\r\n\r\n  private loadImageFromURL(url: string): void {\r\n    this.loadImageService\r\n      .loadImageFromURL(url, this.settings)\r\n      .then((res) => this.setLoadedImage(res))\r\n      .catch((err) => this.loadImageError(err));\r\n  }\r\n\r\n  private setLoadedImage(loadedImage: LoadedImage): void {\r\n    this.loadedImage = loadedImage;\r\n    this.safeImgDataUrl = this.sanitizer.bypassSecurityTrustResourceUrl(loadedImage.transformed.base64);\r\n    this.cd.markForCheck();\r\n  }\r\n\r\n  private loadImageError(error: any): void {\r\n    console.error(error);\r\n    this.loadImageFailed.emit();\r\n  }\r\n\r\n  imageLoadedInView(): void {\r\n    if (this.loadedImage != null) {\r\n      this.imageLoaded.emit(this.loadedImage);\r\n      this.setImageMaxSizeRetries = 0;\r\n      setTimeout(() => this.checkImageMaxSizeRecursively());\r\n    }\r\n  }\r\n\r\n  private checkImageMaxSizeRecursively(): void {\r\n    if (this.setImageMaxSizeRetries > 40) {\r\n      this.loadImageFailed.emit();\r\n    } else if (this.sourceImageLoaded()) {\r\n      this.setMaxSize();\r\n      this.setCropperScaledMinSize();\r\n      this.setCropperScaledMaxSize();\r\n      this.resetCropperPosition();\r\n      this.cropperReady.emit({...this.maxSize});\r\n      this.cd.markForCheck();\r\n    } else {\r\n      this.setImageMaxSizeRetries++;\r\n      setTimeout(() => this.checkImageMaxSizeRecursively(), 50);\r\n    }\r\n  }\r\n\r\n  private sourceImageLoaded(): boolean {\r\n    return this.sourceImage?.nativeElement?.offsetWidth > 0;\r\n  }\r\n\r\n  @HostListener('window:resize')\r\n  onResize(): void {\r\n    if (!this.loadedImage) {\r\n      return;\r\n    }\r\n    this.resizeCropperPosition();\r\n    this.setMaxSize();\r\n    this.setCropperScaledMinSize();\r\n    this.setCropperScaledMaxSize();\r\n  }\r\n\r\n  private activatePinchGesture() {\r\n    if (this.Hammer) {\r\n      const hammer = new this.Hammer(this.wrapper.nativeElement);\r\n      hammer.get('pinch').set({enable: true});\r\n      hammer.on('pinchmove', this.onPinch.bind(this));\r\n      hammer.on('pinchend', this.pinchStop.bind(this));\r\n      hammer.on('pinchstart', this.startPinch.bind(this));\r\n    } else if (isDevMode()) {\r\n      console.warn('[NgxImageCropper] Could not find HammerJS - Pinch Gesture won\\'t work');\r\n    }\r\n  }\r\n\r\n  private resizeCropperPosition(): void {\r\n    const sourceImageElement = this.sourceImage.nativeElement;\r\n    if (this.maxSize.width !== sourceImageElement.offsetWidth || this.maxSize.height !== sourceImageElement.offsetHeight) {\r\n      this.cropper.x1 = this.cropper.x1 * sourceImageElement.offsetWidth / this.maxSize.width;\r\n      this.cropper.x2 = this.cropper.x2 * sourceImageElement.offsetWidth / this.maxSize.width;\r\n      this.cropper.y1 = this.cropper.y1 * sourceImageElement.offsetHeight / this.maxSize.height;\r\n      this.cropper.y2 = this.cropper.y2 * sourceImageElement.offsetHeight / this.maxSize.height;\r\n    }\r\n  }\r\n\r\n  resetCropperPosition(): void {\r\n    this.cropperPositionService.resetCropperPosition(this.sourceImage, this.cropper, this.settings);\r\n    this.doAutoCrop();\r\n    this.imageVisible = true;\r\n  }\r\n\r\n  keyboardAccess(event: KeyboardEvent) {\r\n    this.changeKeyboardStepSize(event);\r\n    this.keyboardMoveCropper(event);\r\n  }\r\n\r\n  private changeKeyboardStepSize(event: KeyboardEvent): void {\r\n    const key = +event.key;\r\n    if (key >= 1 && key <= 9) {\r\n      this.settings.stepSize = key;\r\n    }\r\n  }\r\n\r\n  private keyboardMoveCropper(event: any) {\r\n    const keyboardWhiteList: string[] = ['ArrowUp', 'ArrowDown', 'ArrowRight', 'ArrowLeft'];\r\n    if (!(keyboardWhiteList.includes(event.key))) {\r\n      return;\r\n    }\r\n    const moveType = event.shiftKey ? MoveTypes.Resize : MoveTypes.Move;\r\n    const position = event.altKey ? getInvertedPositionForKey(event.key) : getPositionForKey(event.key);\r\n    const moveEvent = getEventForKey(event.key, this.settings.stepSize);\r\n    event.preventDefault();\r\n    event.stopPropagation();\r\n    this.startMove({clientX: 0, clientY: 0}, moveType, position);\r\n    this.moveImg(moveEvent);\r\n    this.moveStop();\r\n  }\r\n\r\n  startMove(event: any, moveType: MoveTypes, position: string | null = null): void {\r\n    if (this.disabled\r\n      || this.moveStart?.active && this.moveStart?.type === MoveTypes.Pinch\r\n      || moveType === MoveTypes.Drag && !this.allowMoveImage) {\r\n      return;\r\n    }\r\n    if (event.preventDefault) {\r\n      event.preventDefault();\r\n    }\r\n    this.moveStart = {\r\n      active: true,\r\n      type: moveType,\r\n      position,\r\n      transform: {...this.transform},\r\n      clientX: this.cropperPositionService.getClientX(event),\r\n      clientY: this.cropperPositionService.getClientY(event),\r\n      ...this.cropper\r\n    };\r\n  }\r\n\r\n  startPinch(event: any) {\r\n    if (!this.safeImgDataUrl) {\r\n      return;\r\n    }\r\n    if (event.preventDefault) {\r\n      event.preventDefault();\r\n    }\r\n    this.moveStart = {\r\n      active: true,\r\n      type: MoveTypes.Pinch,\r\n      position: 'center',\r\n      clientX: this.cropper.x1 + (this.cropper.x2 - this.cropper.x1) / 2,\r\n      clientY: this.cropper.y1 + (this.cropper.y2 - this.cropper.y1) / 2,\r\n      ...this.cropper\r\n    };\r\n  }\r\n\r\n  @HostListener('document:mousemove', ['$event'])\r\n  @HostListener('document:touchmove', ['$event'])\r\n  moveImg(event: any): void {\r\n    if (this.moveStart!.active) {\r\n      if (event.stopPropagation) {\r\n        event.stopPropagation();\r\n      }\r\n      if (event.preventDefault) {\r\n        event.preventDefault();\r\n      }\r\n      if (this.moveStart!.type === MoveTypes.Move) {\r\n        this.cropperPositionService.move(event, this.moveStart!, this.cropper);\r\n        this.checkCropperPosition(true);\r\n      } else if (this.moveStart!.type === MoveTypes.Resize) {\r\n        if (!this.cropperStaticWidth && !this.cropperStaticHeight) {\r\n          this.cropperPositionService.resize(event, this.moveStart!, this.cropper, this.maxSize, this.settings);\r\n        }\r\n        this.checkCropperPosition(false);\r\n      } else if (this.moveStart!.type === MoveTypes.Drag) {\r\n        const diffX = this.cropperPositionService.getClientX(event) - this.moveStart!.clientX;\r\n        const diffY = this.cropperPositionService.getClientY(event) - this.moveStart!.clientY;\r\n        this.transform = {\r\n          ...this.transform,\r\n          translateH: (this.moveStart!.transform?.translateH || 0) + diffX,\r\n          translateV: (this.moveStart!.transform?.translateV || 0) + diffY\r\n        };\r\n        this.setCssTransform();\r\n      }\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  onPinch(event: any) {\r\n    if (this.moveStart!.active) {\r\n      if (event.stopPropagation) {\r\n        event.stopPropagation();\r\n      }\r\n      if (event.preventDefault) {\r\n        event.preventDefault();\r\n      }\r\n      if (this.moveStart!.type === MoveTypes.Pinch) {\r\n        this.cropperPositionService.resize(event, this.moveStart!, this.cropper, this.maxSize, this.settings);\r\n        this.checkCropperPosition(false);\r\n      }\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  private setMaxSize(): void {\r\n    if (this.sourceImage) {\r\n      const sourceImageElement = this.sourceImage.nativeElement;\r\n      this.maxSize.width = sourceImageElement.offsetWidth;\r\n      this.maxSize.height = sourceImageElement.offsetHeight;\r\n      this.marginLeft = this.sanitizer.bypassSecurityTrustStyle('calc(50% - ' + this.maxSize.width / 2 + 'px)');\r\n    }\r\n  }\r\n\r\n  private setCropperScaledMinSize(): void {\r\n    if (this.loadedImage?.transformed?.image) {\r\n      this.setCropperScaledMinWidth();\r\n      this.setCropperScaledMinHeight();\r\n    } else {\r\n      this.settings.cropperScaledMinWidth = 20;\r\n      this.settings.cropperScaledMinHeight = 20;\r\n    }\r\n  }\r\n\r\n  private setCropperScaledMinWidth(): void {\r\n    this.settings.cropperScaledMinWidth = this.cropperMinWidth > 0\r\n      ? Math.max(20, this.cropperMinWidth / this.loadedImage!.transformed.image.width * this.maxSize.width)\r\n      : 20;\r\n  }\r\n\r\n  private setCropperScaledMinHeight(): void {\r\n    if (this.maintainAspectRatio) {\r\n      this.settings.cropperScaledMinHeight = Math.max(20, this.settings.cropperScaledMinWidth / this.aspectRatio);\r\n    } else if (this.cropperMinHeight > 0) {\r\n      this.settings.cropperScaledMinHeight = Math.max(\r\n        20,\r\n        this.cropperMinHeight / this.loadedImage!.transformed.image.height * this.maxSize.height\r\n      );\r\n    } else {\r\n      this.settings.cropperScaledMinHeight = 20;\r\n    }\r\n  }\r\n\r\n  private setCropperScaledMaxSize(): void {\r\n    if (this.loadedImage?.transformed?.image) {\r\n      const ratio = this.loadedImage.transformed.size.width / this.maxSize.width;\r\n      this.settings.cropperScaledMaxWidth = this.cropperMaxWidth > 20 ? this.cropperMaxWidth / ratio : this.maxSize.width;\r\n      this.settings.cropperScaledMaxHeight = this.cropperMaxHeight > 20 ? this.cropperMaxHeight / ratio : this.maxSize.height;\r\n      if (this.maintainAspectRatio) {\r\n        if (this.settings.cropperScaledMaxWidth > this.settings.cropperScaledMaxHeight * this.aspectRatio) {\r\n          this.settings.cropperScaledMaxWidth = this.settings.cropperScaledMaxHeight * this.aspectRatio;\r\n        } else if (this.settings.cropperScaledMaxWidth < this.settings.cropperScaledMaxHeight * this.aspectRatio) {\r\n          this.settings.cropperScaledMaxHeight = this.settings.cropperScaledMaxWidth / this.aspectRatio;\r\n        }\r\n      }\r\n    } else {\r\n      this.settings.cropperScaledMaxWidth = this.maxSize.width;\r\n      this.settings.cropperScaledMaxHeight = this.maxSize.height;\r\n    }\r\n  }\r\n\r\n  private checkCropperPosition(maintainSize = false): void {\r\n    if (this.cropper.x1 < 0) {\r\n      this.cropper.x2 -= maintainSize ? this.cropper.x1 : 0;\r\n      this.cropper.x1 = 0;\r\n    }\r\n    if (this.cropper.y1 < 0) {\r\n      this.cropper.y2 -= maintainSize ? this.cropper.y1 : 0;\r\n      this.cropper.y1 = 0;\r\n    }\r\n    if (this.cropper.x2 > this.maxSize.width) {\r\n      this.cropper.x1 -= maintainSize ? (this.cropper.x2 - this.maxSize.width) : 0;\r\n      this.cropper.x2 = this.maxSize.width;\r\n    }\r\n    if (this.cropper.y2 > this.maxSize.height) {\r\n      this.cropper.y1 -= maintainSize ? (this.cropper.y2 - this.maxSize.height) : 0;\r\n      this.cropper.y2 = this.maxSize.height;\r\n    }\r\n  }\r\n\r\n  @HostListener('document:mouseup')\r\n  @HostListener('document:touchend')\r\n  moveStop(): void {\r\n    if (this.moveStart!.active) {\r\n      this.moveStart!.active = false;\r\n      if (this.moveStart?.type === MoveTypes.Drag) {\r\n        this.transformChange.emit(this.transform);\r\n      } else {\r\n        this.doAutoCrop();\r\n      }\r\n    }\r\n  }\r\n\r\n  pinchStop(): void {\r\n    if (this.moveStart!.active) {\r\n      this.moveStart!.active = false;\r\n      this.doAutoCrop();\r\n    }\r\n  }\r\n\r\n  private doAutoCrop(): void {\r\n    if (this.autoCrop) {\r\n      this.crop();\r\n    }\r\n  }\r\n\r\n  crop(): ImageCroppedEvent | null {\r\n    if (this.loadedImage?.transformed?.image != null) {\r\n      this.startCropImage.emit();\r\n      const output = this.cropService.crop(this.sourceImage, this.loadedImage, this.cropper, this.settings);\r\n      if (output != null) {\r\n        this.imageCropped.emit(output);\r\n      }\r\n      return output;\r\n    }\r\n    return null;\r\n  }\r\n}\r\n","<div\r\n  [style.background]=\"imageVisible && backgroundColor\"\r\n  #wrapper\r\n>\r\n  <img\r\n    #sourceImage\r\n    class=\"ngx-ic-source-image\"\r\n    *ngIf=\"safeImgDataUrl\"\r\n    [src]=\"safeImgDataUrl\"\r\n    [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n    [style.transform]=\"safeTransformStyle\"\r\n    [class.ngx-ic-draggable]=\"!disabled && allowMoveImage\"\r\n    (load)=\"imageLoadedInView()\"\r\n    (mousedown)=\"startMove($event, moveTypes.Drag)\"\r\n    (touchstart)=\"startMove($event, moveTypes.Drag)\"\r\n  >\r\n  <div\r\n    class=\"ngx-ic-overlay\"\r\n    [style.width.px]=\"maxSize.width\"\r\n    [style.height.px]=\"maxSize.height\"\r\n    [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\r\n  ></div>\r\n  <div class=\"ngx-ic-cropper\"\r\n       *ngIf=\"imageVisible\"\r\n       [class.ngx-ic-round]=\"roundCropper\"\r\n       [style.top.px]=\"cropper.y1\"\r\n       [style.left.px]=\"cropper.x1\"\r\n       [style.width.px]=\"cropper.x2 - cropper.x1\"\r\n       [style.height.px]=\"cropper.y2 - cropper.y1\"\r\n       [style.margin-left]=\"alignImage === 'center' ? marginLeft : null\"\r\n       [style.visibility]=\"imageVisible ? 'visible' : 'hidden'\"\r\n       (keydown)=\"keyboardAccess($event)\"\r\n       tabindex=\"0\"\r\n  >\r\n    <div\r\n      (mousedown)=\"startMove($event, moveTypes.Move)\"\r\n      (touchstart)=\"startMove($event, moveTypes.Move)\"\r\n      class=\"ngx-ic-move\">\r\n    </div>\r\n    <ng-container *ngIf=\"!hideResizeSquares\">\r\n            <span class=\"ngx-ic-resize ngx-ic-topleft\"\r\n                  (mousedown)=\"startMove($event, moveTypes.Resize, 'topleft')\"\r\n                  (touchstart)=\"startMove($event, moveTypes.Resize, 'topleft')\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-top\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-topright\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'topright')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'topright')\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-right\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-bottomright\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomright')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomright')\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-bottom\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-bottomleft\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'bottomleft')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'bottomleft')\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize ngx-ic-left\">\r\n                <span class=\"ngx-ic-square\"></span>\r\n            </span>\r\n      <span class=\"ngx-ic-resize-bar ngx-ic-top\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'top')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'top')\">\r\n            </span>\r\n      <span class=\"ngx-ic-resize-bar ngx-ic-right\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'right')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'right')\">\r\n            </span>\r\n      <span class=\"ngx-ic-resize-bar ngx-ic-bottom\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'bottom')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'bottom')\">\r\n            </span>\r\n      <span class=\"ngx-ic-resize-bar ngx-ic-left\"\r\n            (mousedown)=\"startMove($event, moveTypes.Resize, 'left')\"\r\n            (touchstart)=\"startMove($event, moveTypes.Resize, 'left')\">\r\n            </span>\r\n    </ng-container>\r\n  </div>\r\n</div>\r\n","import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ImageCropperComponent } from './component/image-cropper.component';\r\nimport { LoadImageService } from './services/load-image.service';\r\nimport { CropService } from '../public-api';\r\nimport { CropperPositionService } from './services/cropper-position.service';\r\n\r\n@NgModule({\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  declarations: [\r\n    ImageCropperComponent,\r\n\r\n  ],\r\n  providers: [\r\n    CropService,\r\n    CropperPositionService,\r\n    LoadImageService\r\n  ],\r\n  exports: [\r\n    ImageCropperComponent\r\n  ]\r\n})\r\nexport class ImageCropperModule {\r\n}\r\n","export function base64ToFile(base64Image: string): Blob {\r\n  const split = base64Image.split(',');\r\n  const type = split[0].replace('data:', '').replace(';base64', '');\r\n  const byteString = atob(split[1]);\r\n  const ab = new ArrayBuffer(byteString.length);\r\n  const ia = new Uint8Array(ab);\r\n  for (let i = 0; i < byteString.length; i += 1) {\r\n    ia[i] = byteString.charCodeAt(i);\r\n  }\r\n  return new Blob([ab], {type});\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}