ngx-image-cropper 9.1.2 → 9.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  import { resizeCanvas } from '../utils/resize.utils';
2
2
  import { percentage } from '../utils/percentage.utils';
3
3
  export class CropService {
4
- crop(cropperState, output) {
5
- const imagePosition = this.getImagePosition(cropperState);
4
+ crop(input, output) {
5
+ const imagePosition = this.getImagePosition(input);
6
6
  const width = imagePosition.x2 - imagePosition.x1;
7
7
  const height = imagePosition.y2 - imagePosition.y1;
8
8
  const cropCanvas = document.createElement('canvas');
@@ -12,77 +12,76 @@ export class CropService {
12
12
  if (!ctx) {
13
13
  return null;
14
14
  }
15
- if (cropperState.options.backgroundColor != null) {
16
- ctx.fillStyle = cropperState.options.backgroundColor;
15
+ if (input.options?.backgroundColor != null) {
16
+ ctx.fillStyle = input.options.backgroundColor;
17
17
  ctx.fillRect(0, 0, width, height);
18
18
  }
19
- const scaleX = (cropperState.transform.scale || 1) * (cropperState.transform.flipH ? -1 : 1);
20
- const scaleY = (cropperState.transform.scale || 1) * (cropperState.transform.flipV ? -1 : 1);
21
- const { translateH, translateV } = this.getCanvasTranslate(cropperState);
22
- const transformedImage = cropperState.loadedImage.transformed;
19
+ const scaleX = (input.transform?.scale || 1) * (input.transform?.flipH ? -1 : 1);
20
+ const scaleY = (input.transform?.scale || 1) * (input.transform?.flipV ? -1 : 1);
21
+ const { translateH, translateV } = this.getCanvasTranslate(input);
22
+ const transformedImage = input.loadedImage.transformed;
23
23
  ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
24
24
  ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
25
- ctx.rotate((cropperState.transform.rotate || 0) * Math.PI / 180);
25
+ ctx.rotate((input.transform?.rotate || 0) * Math.PI / 180);
26
26
  ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
27
27
  const result = {
28
28
  width, height,
29
29
  imagePosition,
30
- cropperPosition: { ...cropperState.cropper() }
30
+ cropperPosition: { ...input.cropper }
31
31
  };
32
- if (cropperState.options.containWithinAspectRatio) {
33
- result.offsetImagePosition = this.getOffsetImagePosition(cropperState);
32
+ if (input.options?.containWithinAspectRatio) {
33
+ result.offsetImagePosition = this.getOffsetImagePosition(input);
34
34
  }
35
- const resizeRatio = this.getResizeRatio(width, height, cropperState.options);
35
+ const resizeRatio = this.getResizeRatio(width, height, input.options);
36
36
  if (resizeRatio !== 1) {
37
37
  result.width = Math.round(width * resizeRatio);
38
- result.height = cropperState.options.maintainAspectRatio
39
- ? Math.round(result.width / cropperState.options.aspectRatio)
38
+ result.height = input.options?.maintainAspectRatio
39
+ ? Math.round(result.width / (input.options?.aspectRatio ?? 1))
40
40
  : Math.round(height * resizeRatio);
41
41
  resizeCanvas(cropCanvas, result.width, result.height);
42
42
  }
43
43
  if (output === 'blob') {
44
- return this.cropToBlob(result, cropCanvas, cropperState);
44
+ return this.cropToBlob(result, cropCanvas, input);
45
45
  }
46
46
  else {
47
- result.base64 = cropCanvas.toDataURL('image/' + cropperState.options.format, this.getQuality(cropperState.options));
47
+ result.base64 = cropCanvas.toDataURL('image/' + (input.options?.format ?? 'png'), this.getQuality(input.options));
48
48
  return result;
49
49
  }
50
50
  }
51
- async cropToBlob(output, cropCanvas, cropperState) {
52
- output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + cropperState.options.format, this.getQuality(cropperState.options)));
51
+ async cropToBlob(output, cropCanvas, input) {
52
+ output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + (input.options?.format ?? 'png'), this.getQuality(input.options)));
53
53
  if (output.blob) {
54
54
  output.objectUrl = URL.createObjectURL(output.blob);
55
55
  }
56
56
  return output;
57
57
  }
58
- getCanvasTranslate(cropperState) {
59
- if (cropperState.transform.translateUnit === 'px') {
60
- const ratio = this.getRatio(cropperState);
58
+ getCanvasTranslate(input) {
59
+ if (input.transform?.translateUnit === 'px') {
60
+ const ratio = this.getRatio(input);
61
61
  return {
62
- translateH: (cropperState.transform.translateH || 0) * ratio,
63
- translateV: (cropperState.transform.translateV || 0) * ratio
62
+ translateH: (input.transform?.translateH || 0) * ratio,
63
+ translateV: (input.transform?.translateV || 0) * ratio
64
64
  };
65
65
  }
66
66
  else {
67
67
  return {
68
- translateH: cropperState.transform.translateH ? percentage(cropperState.transform.translateH, cropperState.loadedImage.transformed.size.width) : 0,
69
- translateV: cropperState.transform.translateV ? percentage(cropperState.transform.translateV, cropperState.loadedImage.transformed.size.height) : 0
68
+ translateH: input.transform?.translateH ? percentage(input.transform.translateH, input.loadedImage.transformed.size.width) : 0,
69
+ translateV: input.transform?.translateV ? percentage(input.transform.translateV, input.loadedImage.transformed.size.height) : 0
70
70
  };
71
71
  }
72
72
  }
73
- getRatio(cropperState) {
74
- return cropperState.loadedImage.transformed.size.width / cropperState.maxSize().width;
73
+ getRatio(input) {
74
+ return input.loadedImage.transformed.size.width / input.maxSize.width;
75
75
  }
76
76
  getImagePosition(cropperState) {
77
77
  const ratio = this.getRatio(cropperState);
78
- const cropper = cropperState.cropper();
79
78
  const out = {
80
- x1: Math.round(cropper.x1 * ratio),
81
- y1: Math.round(cropper.y1 * ratio),
82
- x2: Math.round(cropper.x2 * ratio),
83
- y2: Math.round(cropper.y2 * ratio)
79
+ x1: Math.round(cropperState.cropper.x1 * ratio),
80
+ y1: Math.round(cropperState.cropper.y1 * ratio),
81
+ x2: Math.round(cropperState.cropper.x2 * ratio),
82
+ y2: Math.round(cropperState.cropper.y2 * ratio)
84
83
  };
85
- if (!cropperState.options.containWithinAspectRatio) {
84
+ if (!cropperState.options?.containWithinAspectRatio) {
86
85
  out.x1 = Math.max(out.x1, 0);
87
86
  out.y1 = Math.max(out.y1, 0);
88
87
  out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
@@ -90,52 +89,50 @@ export class CropService {
90
89
  }
91
90
  return out;
92
91
  }
93
- getOffsetImagePosition(cropperState) {
94
- const canvasRotation = cropperState.options.canvasRotation + cropperState.loadedImage.exifTransform.rotate;
95
- const ratio = this.getRatio(cropperState);
92
+ getOffsetImagePosition(input) {
93
+ const canvasRotation = (input.options?.canvasRotation ?? 0) + input.loadedImage.exifTransform.rotate;
94
+ const ratio = this.getRatio(input);
96
95
  let offsetX;
97
96
  let offsetY;
98
97
  if (canvasRotation % 2) {
99
- offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.height) / 2;
100
- offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.width) / 2;
98
+ offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.height) / 2;
99
+ offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.width) / 2;
101
100
  }
102
101
  else {
103
- offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.width) / 2;
104
- offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.height) / 2;
102
+ offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.width) / 2;
103
+ offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.height) / 2;
105
104
  }
106
- const cropper = cropperState.cropper();
105
+ const cropper = input.cropper;
107
106
  const out = {
108
107
  x1: Math.round(cropper.x1 * ratio) - offsetX,
109
108
  y1: Math.round(cropper.y1 * ratio) - offsetY,
110
109
  x2: Math.round(cropper.x2 * ratio) - offsetX,
111
110
  y2: Math.round(cropper.y2 * ratio) - offsetY
112
111
  };
113
- if (!cropperState.options.containWithinAspectRatio) {
112
+ if (!input.options?.containWithinAspectRatio) {
114
113
  out.x1 = Math.max(out.x1, 0);
115
114
  out.y1 = Math.max(out.y1, 0);
116
- out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
117
- out.y2 = Math.min(out.y2, cropperState.loadedImage.transformed.size.height);
115
+ out.x2 = Math.min(out.x2, input.loadedImage.transformed.size.width);
116
+ out.y2 = Math.min(out.y2, input.loadedImage.transformed.size.height);
118
117
  }
119
118
  return out;
120
119
  }
121
120
  getResizeRatio(width, height, options) {
122
- const ratioWidth = options.resizeToWidth / width;
123
- const ratioHeight = options.resizeToHeight / height;
124
121
  const ratios = new Array();
125
- if (options.resizeToWidth > 0) {
126
- ratios.push(ratioWidth);
122
+ if (options?.resizeToWidth && options.resizeToWidth > 0) {
123
+ ratios.push(options.resizeToWidth / width);
127
124
  }
128
- if (options.resizeToHeight > 0) {
129
- ratios.push(ratioHeight);
125
+ if (options?.resizeToHeight && options.resizeToHeight > 0) {
126
+ ratios.push(options.resizeToHeight / height);
130
127
  }
131
128
  const result = ratios.length === 0 ? 1 : Math.min(...ratios);
132
- if (result > 1 && !options.onlyScaleDown) {
129
+ if (result > 1 && !options?.onlyScaleDown) {
133
130
  return result;
134
131
  }
135
132
  return Math.min(result, 1);
136
133
  }
137
134
  getQuality(options) {
138
- return Math.min(1, Math.max(0, options.imageQuality / 100));
135
+ return Math.min(1, Math.max(0, options?.imageQuality ?? 92 / 100));
139
136
  }
140
137
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RCxNQUFNLE9BQU8sV0FBVztJQUl0QixJQUFJLENBQUMsWUFBMEIsRUFBRSxNQUFrQjtRQUNqRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakQsR0FBRyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUNyRCxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1B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QUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQXVCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENyb3BwZXJPcHRpb25zLCBDcm9wcGVyUG9zaXRpb24sIEltYWdlQ3JvcHBlZEV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDcm9wcGVyU3RhdGUgfSBmcm9tICcuLi9jb21wb25lbnQvY3JvcHBlci5zdGF0ZSc7XG5pbXBvcnQgeyByZXNpemVDYW52YXMgfSBmcm9tICcuLi91dGlscy9yZXNpemUudXRpbHMnO1xuaW1wb3J0IHsgcGVyY2VudGFnZSB9IGZyb20gJy4uL3V0aWxzL3BlcmNlbnRhZ2UudXRpbHMnO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci1vcHRpb25zLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDcm9wU2VydmljZSB7XG5cbiAgY3JvcChjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSwgb3V0cHV0OiAnYmxvYicpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB8IG51bGw7XG4gIGNyb3AoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG91dHB1dDogJ2Jhc2U2NCcpOiBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGw7XG4gIGNyb3AoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUsIG91dHB1dDogT3V0cHV0VHlwZSk6IFByb21pc2U8SW1hZ2VDcm9wcGVkRXZlbnQ+IHwgSW1hZ2VDcm9wcGVkRXZlbnQgfCBudWxsIHtcbiAgICBjb25zdCBpbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRJbWFnZVBvc2l0aW9uKGNyb3BwZXJTdGF0ZSk7XG4gICAgY29uc3Qgd2lkdGggPSBpbWFnZVBvc2l0aW9uLngyIC0gaW1hZ2VQb3NpdGlvbi54MTtcbiAgICBjb25zdCBoZWlnaHQgPSBpbWFnZVBvc2l0aW9uLnkyIC0gaW1hZ2VQb3NpdGlvbi55MTtcbiAgICBjb25zdCBjcm9wQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykgYXMgSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgY3JvcENhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNyb3BDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgY29uc3QgY3R4ID0gY3JvcENhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNyb3BwZXJTdGF0ZS5vcHRpb25zLmJhY2tncm91bmRDb2xvciAhPSBudWxsKSB7XG4gICAgICBjdHguZmlsbFN0eWxlID0gY3JvcHBlclN0YXRlLm9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlWCA9IChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0uZmxpcEggPyAtMSA6IDEpO1xuICAgIGNvbnN0IHNjYWxlWSA9IChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnNjYWxlIHx8IDEpICogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0uZmxpcFYgPyAtMSA6IDEpO1xuICAgIGNvbnN0IHt0cmFuc2xhdGVILCB0cmFuc2xhdGVWfSA9IHRoaXMuZ2V0Q2FudmFzVHJhbnNsYXRlKGNyb3BwZXJTdGF0ZSk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZEltYWdlID0gY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZDtcbiAgICBjdHguc2V0VHJhbnNmb3JtKHNjYWxlWCwgMCwgMCwgc2NhbGVZLCB0cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyICsgdHJhbnNsYXRlSCwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLmhlaWdodCAvIDIgKyB0cmFuc2xhdGVWKTtcbiAgICBjdHgudHJhbnNsYXRlKC1pbWFnZVBvc2l0aW9uLngxIC8gc2NhbGVYLCAtaW1hZ2VQb3NpdGlvbi55MSAvIHNjYWxlWSk7XG4gICAgY3R4LnJvdGF0ZSgoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS5yb3RhdGUgfHwgMCkgKiBNYXRoLlBJIC8gMTgwKTtcblxuICAgIGN0eC5kcmF3SW1hZ2UoXG4gICAgICB0cmFuc2Zvcm1lZEltYWdlLmltYWdlLFxuICAgICAgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS53aWR0aCAvIDIsXG4gICAgICAtdHJhbnNmb3JtZWRJbWFnZS5zaXplLmhlaWdodCAvIDJcbiAgICApO1xuXG4gICAgY29uc3QgcmVzdWx0OiBJbWFnZUNyb3BwZWRFdmVudCA9IHtcbiAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICBpbWFnZVBvc2l0aW9uLFxuICAgICAgY3JvcHBlclBvc2l0aW9uOiB7Li4uY3JvcHBlclN0YXRlLmNyb3BwZXIoKX1cbiAgICB9O1xuICAgIGlmIChjcm9wcGVyU3RhdGUub3B0aW9ucy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIHJlc3VsdC5vZmZzZXRJbWFnZVBvc2l0aW9uID0gdGhpcy5nZXRPZmZzZXRJbWFnZVBvc2l0aW9uKGNyb3BwZXJTdGF0ZSk7XG4gICAgfVxuICAgIGNvbnN0IHJlc2l6ZVJhdGlvID0gdGhpcy5nZXRSZXNpemVSYXRpbyh3aWR0aCwgaGVpZ2h0LCBjcm9wcGVyU3RhdGUub3B0aW9ucyk7XG4gICAgaWYgKHJlc2l6ZVJhdGlvICE9PSAxKSB7XG4gICAgICByZXN1bHQud2lkdGggPSBNYXRoLnJvdW5kKHdpZHRoICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzdWx0LmhlaWdodCA9IGNyb3BwZXJTdGF0ZS5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW9cbiAgICAgICAgPyBNYXRoLnJvdW5kKHJlc3VsdC53aWR0aCAvIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmFzcGVjdFJhdGlvKVxuICAgICAgICA6IE1hdGgucm91bmQoaGVpZ2h0ICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzaXplQ2FudmFzKGNyb3BDYW52YXMsIHJlc3VsdC53aWR0aCwgcmVzdWx0LmhlaWdodCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQgPT09ICdibG9iJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYihyZXN1bHQsIGNyb3BDYW52YXMsIGNyb3BwZXJTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5iYXNlNjQgPSBjcm9wQ2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvJyArIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmZvcm1hdCwgdGhpcy5nZXRRdWFsaXR5KGNyb3BwZXJTdGF0ZS5vcHRpb25zKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JvcFRvQmxvYihvdXRwdXQ6IEltYWdlQ3JvcHBlZEV2ZW50LCBjcm9wQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiBQcm9taXNlPEltYWdlQ3JvcHBlZEV2ZW50PiB7XG4gICAgb3V0cHV0LmJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4ocmVzb2x2ZSA9PiBjcm9wQ2FudmFzLnRvQmxvYihyZXNvbHZlLCAnaW1hZ2UvJyArIGNyb3BwZXJTdGF0ZS5vcHRpb25zLmZvcm1hdCwgdGhpcy5nZXRRdWFsaXR5KGNyb3BwZXJTdGF0ZS5vcHRpb25zKSkpO1xuICAgIGlmIChvdXRwdXQuYmxvYikge1xuICAgICAgb3V0cHV0Lm9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwob3V0cHV0LmJsb2IpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNUcmFuc2xhdGUoY3JvcHBlclN0YXRlOiBDcm9wcGVyU3RhdGUpOiB7IHRyYW5zbGF0ZUg6IG51bWJlciwgdHJhbnNsYXRlVjogbnVtYmVyIH0ge1xuICAgIGlmIChjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVVuaXQgPT09ICdweCcpIHtcbiAgICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhjcm9wcGVyU3RhdGUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHJhbnNsYXRlSDogKGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlSCB8fCAwKSAqIHJhdGlvLFxuICAgICAgICB0cmFuc2xhdGVWOiAoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVWIHx8IDApICogcmF0aW9cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zbGF0ZUg6IGNyb3BwZXJTdGF0ZS50cmFuc2Zvcm0udHJhbnNsYXRlSCA/IHBlcmNlbnRhZ2UoY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVILCBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGgpIDogMCxcbiAgICAgICAgdHJhbnNsYXRlVjogY3JvcHBlclN0YXRlLnRyYW5zZm9ybS50cmFuc2xhdGVWID8gcGVyY2VudGFnZShjcm9wcGVyU3RhdGUudHJhbnNmb3JtLnRyYW5zbGF0ZVYsIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQpIDogMFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJhdGlvKGNyb3BwZXJTdGF0ZTogQ3JvcHBlclN0YXRlKTogbnVtYmVyIHtcbiAgICByZXR1cm4gY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoIC8gY3JvcHBlclN0YXRlLm1heFNpemUoKS53aWR0aDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW1hZ2VQb3NpdGlvbihjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGNyb3BwZXJTdGF0ZSk7XG4gICAgY29uc3QgY3JvcHBlciA9IGNyb3BwZXJTdGF0ZS5jcm9wcGVyKCk7XG4gICAgY29uc3Qgb3V0OiBDcm9wcGVyUG9zaXRpb24gPSB7XG4gICAgICB4MTogTWF0aC5yb3VuZChjcm9wcGVyLngxICogcmF0aW8pLFxuICAgICAgeTE6IE1hdGgucm91bmQoY3JvcHBlci55MSAqIHJhdGlvKSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXIueDIgKiByYXRpbyksXG4gICAgICB5MjogTWF0aC5yb3VuZChjcm9wcGVyLnkyICogcmF0aW8pXG4gICAgfTtcblxuICAgIGlmICghY3JvcHBlclN0YXRlLm9wdGlvbnMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihjcm9wcGVyU3RhdGU6IENyb3BwZXJTdGF0ZSk6IENyb3BwZXJQb3NpdGlvbiB7XG4gICAgY29uc3QgY2FudmFzUm90YXRpb24gPSBjcm9wcGVyU3RhdGUub3B0aW9ucy5jYW52YXNSb3RhdGlvbiArIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEuZXhpZlRyYW5zZm9ybS5yb3RhdGU7XG4gICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGNyb3BwZXJTdGF0ZSk7XG4gICAgbGV0IG9mZnNldFg6IG51bWJlcjtcbiAgICBsZXQgb2Zmc2V0WTogbnVtYmVyO1xuXG4gICAgaWYgKGNhbnZhc1JvdGF0aW9uICUgMikge1xuICAgICAgb2Zmc2V0WCA9IChjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUuaGVpZ2h0KSAvIDI7XG4gICAgICBvZmZzZXRZID0gKGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQgLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0WCA9IChjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBjcm9wcGVyU3RhdGUubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICAgIG9mZnNldFkgPSAoY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGNyb3BwZXJTdGF0ZS5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICB9XG5cbiAgICBjb25zdCBjcm9wcGVyID0gY3JvcHBlclN0YXRlLmNyb3BwZXIoKTtcbiAgICBjb25zdCBvdXQ6IENyb3BwZXJQb3NpdGlvbiA9IHtcbiAgICAgIHgxOiBNYXRoLnJvdW5kKGNyb3BwZXIueDEgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTE6IE1hdGgucm91bmQoY3JvcHBlci55MSAqIHJhdGlvKSAtIG9mZnNldFksXG4gICAgICB4MjogTWF0aC5yb3VuZChjcm9wcGVyLngyICogcmF0aW8pIC0gb2Zmc2V0WCxcbiAgICAgIHkyOiBNYXRoLnJvdW5kKGNyb3BwZXIueTIgKiByYXRpbykgLSBvZmZzZXRZXG4gICAgfTtcblxuICAgIGlmICghY3JvcHBlclN0YXRlLm9wdGlvbnMuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvcHRpb25zOiBDcm9wcGVyT3B0aW9ucyk6IG51bWJlciB7XG4gICAgY29uc3QgcmF0aW9XaWR0aCA9IG9wdGlvbnMucmVzaXplVG9XaWR0aCAvIHdpZHRoO1xuICAgIGNvbnN0IHJhdGlvSGVpZ2h0ID0gb3B0aW9ucy5yZXNpemVUb0hlaWdodCAvIGhlaWdodDtcbiAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgaWYgKG9wdGlvbnMucmVzaXplVG9XaWR0aCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvV2lkdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKHJhdGlvSGVpZ2h0KTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSByYXRpb3MubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKC4uLnJhdGlvcyk7XG5cbiAgICBpZiAocmVzdWx0ID4gMSAmJiAhb3B0aW9ucy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmVzdWx0LCAxKTtcbiAgfVxuXG4gIGdldFF1YWxpdHkob3B0aW9uczogQ3JvcHBlck9wdGlvbnMpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRpb25zLmltYWdlUXVhbGl0eSAvIDEwMCkpO1xuICB9XG59XG4iXX0=
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9jcm9wLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUl2RCxNQUFNLE9BQU8sV0FBVztJQUl0QixJQUFJLENBQUMsS0FBZ0IsRUFBRSxNQUFrQjtRQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUN6RSxVQUFVLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUN6QixVQUFVLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUUzQixNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxlQUFlLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQztZQUM5QyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1B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S0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO1FBRTdELElBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUMxQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFDLE9BQW1DO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDcm9wcGVyUG9zaXRpb24sIEltYWdlQ3JvcHBlZEV2ZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyByZXNpemVDYW52YXMgfSBmcm9tICcuLi91dGlscy9yZXNpemUudXRpbHMnO1xuaW1wb3J0IHsgcGVyY2VudGFnZSB9IGZyb20gJy4uL3V0aWxzL3BlcmNlbnRhZ2UudXRpbHMnO1xuaW1wb3J0IHsgT3V0cHV0VHlwZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY3JvcHBlci1vcHRpb25zLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDcm9wSW5wdXQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nyb3AtaW5wdXQuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENyb3BTZXJ2aWNlIHtcblxuICBjcm9wKGlucHV0OiBDcm9wSW5wdXQsIG91dHB1dDogJ2Jsb2InKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBudWxsO1xuICBjcm9wKGlucHV0OiBDcm9wSW5wdXQsIG91dHB1dDogJ2Jhc2U2NCcpOiBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGw7XG4gIGNyb3AoaW5wdXQ6IENyb3BJbnB1dCwgb3V0cHV0OiBPdXRwdXRUeXBlKTogUHJvbWlzZTxJbWFnZUNyb3BwZWRFdmVudD4gfCBJbWFnZUNyb3BwZWRFdmVudCB8IG51bGwge1xuICAgIGNvbnN0IGltYWdlUG9zaXRpb24gPSB0aGlzLmdldEltYWdlUG9zaXRpb24oaW5wdXQpO1xuICAgIGNvbnN0IHdpZHRoID0gaW1hZ2VQb3NpdGlvbi54MiAtIGltYWdlUG9zaXRpb24ueDE7XG4gICAgY29uc3QgaGVpZ2h0ID0gaW1hZ2VQb3NpdGlvbi55MiAtIGltYWdlUG9zaXRpb24ueTE7XG4gICAgY29uc3QgY3JvcENhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpIGFzIEhUTUxDYW52YXNFbGVtZW50O1xuICAgIGNyb3BDYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBjcm9wQ2FudmFzLmhlaWdodCA9IGhlaWdodDtcblxuICAgIGNvbnN0IGN0eCA9IGNyb3BDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpbnB1dC5vcHRpb25zPy5iYWNrZ3JvdW5kQ29sb3IgIT0gbnVsbCkge1xuICAgICAgY3R4LmZpbGxTdHlsZSA9IGlucHV0Lm9wdGlvbnMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgY3R4LmZpbGxSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHNjYWxlWCA9IChpbnB1dC50cmFuc2Zvcm0/LnNjYWxlIHx8IDEpICogKGlucHV0LnRyYW5zZm9ybT8uZmxpcEggPyAtMSA6IDEpO1xuICAgIGNvbnN0IHNjYWxlWSA9IChpbnB1dC50cmFuc2Zvcm0/LnNjYWxlIHx8IDEpICogKGlucHV0LnRyYW5zZm9ybT8uZmxpcFYgPyAtMSA6IDEpO1xuICAgIGNvbnN0IHt0cmFuc2xhdGVILCB0cmFuc2xhdGVWfSA9IHRoaXMuZ2V0Q2FudmFzVHJhbnNsYXRlKGlucHV0KTtcblxuICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQ7XG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZVgsIDAsIDAsIHNjYWxlWSwgdHJhbnNmb3JtZWRJbWFnZS5zaXplLndpZHRoIC8gMiArIHRyYW5zbGF0ZUgsIHRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyICsgdHJhbnNsYXRlVik7XG4gICAgY3R4LnRyYW5zbGF0ZSgtaW1hZ2VQb3NpdGlvbi54MSAvIHNjYWxlWCwgLWltYWdlUG9zaXRpb24ueTEgLyBzY2FsZVkpO1xuICAgIGN0eC5yb3RhdGUoKGlucHV0LnRyYW5zZm9ybT8ucm90YXRlIHx8IDApICogTWF0aC5QSSAvIDE4MCk7XG5cbiAgICBjdHguZHJhd0ltYWdlKFxuICAgICAgdHJhbnNmb3JtZWRJbWFnZS5pbWFnZSxcbiAgICAgIC10cmFuc2Zvcm1lZEltYWdlLnNpemUud2lkdGggLyAyLFxuICAgICAgLXRyYW5zZm9ybWVkSW1hZ2Uuc2l6ZS5oZWlnaHQgLyAyXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdDogSW1hZ2VDcm9wcGVkRXZlbnQgPSB7XG4gICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgaW1hZ2VQb3NpdGlvbixcbiAgICAgIGNyb3BwZXJQb3NpdGlvbjogey4uLmlucHV0LmNyb3BwZXJ9XG4gICAgfTtcbiAgICBpZiAoaW5wdXQub3B0aW9ucz8uY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICByZXN1bHQub2Zmc2V0SW1hZ2VQb3NpdGlvbiA9IHRoaXMuZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihpbnB1dCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc2l6ZVJhdGlvID0gdGhpcy5nZXRSZXNpemVSYXRpbyh3aWR0aCwgaGVpZ2h0LCBpbnB1dC5vcHRpb25zKTtcbiAgICBpZiAocmVzaXplUmF0aW8gIT09IDEpIHtcbiAgICAgIHJlc3VsdC53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiByZXNpemVSYXRpbyk7XG4gICAgICByZXN1bHQuaGVpZ2h0ID0gaW5wdXQub3B0aW9ucz8ubWFpbnRhaW5Bc3BlY3RSYXRpb1xuICAgICAgICA/IE1hdGgucm91bmQocmVzdWx0LndpZHRoIC8gKGlucHV0Lm9wdGlvbnM/LmFzcGVjdFJhdGlvID8/IDEpKVxuICAgICAgICA6IE1hdGgucm91bmQoaGVpZ2h0ICogcmVzaXplUmF0aW8pO1xuICAgICAgcmVzaXplQ2FudmFzKGNyb3BDYW52YXMsIHJlc3VsdC53aWR0aCwgcmVzdWx0LmhlaWdodCk7XG4gICAgfVxuICAgIGlmIChvdXRwdXQgPT09ICdibG9iJykge1xuICAgICAgcmV0dXJuIHRoaXMuY3JvcFRvQmxvYihyZXN1bHQsIGNyb3BDYW52YXMsIGlucHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmJhc2U2NCA9IGNyb3BDYW52YXMudG9EYXRhVVJMKCdpbWFnZS8nICsgKGlucHV0Lm9wdGlvbnM/LmZvcm1hdCA/PyAncG5nJyksIHRoaXMuZ2V0UXVhbGl0eShpbnB1dC5vcHRpb25zKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JvcFRvQmxvYihvdXRwdXQ6IEltYWdlQ3JvcHBlZEV2ZW50LCBjcm9wQ2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCwgaW5wdXQ6IENyb3BJbnB1dCk6IFByb21pc2U8SW1hZ2VDcm9wcGVkRXZlbnQ+IHtcbiAgICBvdXRwdXQuYmxvYiA9IGF3YWl0IG5ldyBQcm9taXNlPEJsb2IgfCBudWxsPihyZXNvbHZlID0+IGNyb3BDYW52YXMudG9CbG9iKHJlc29sdmUsICdpbWFnZS8nICsgKGlucHV0Lm9wdGlvbnM/LmZvcm1hdCA/PyAncG5nJyksIHRoaXMuZ2V0UXVhbGl0eShpbnB1dC5vcHRpb25zKSkpO1xuICAgIGlmIChvdXRwdXQuYmxvYikge1xuICAgICAgb3V0cHV0Lm9iamVjdFVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwob3V0cHV0LmJsb2IpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYW52YXNUcmFuc2xhdGUoaW5wdXQ6IENyb3BJbnB1dCk6IHsgdHJhbnNsYXRlSDogbnVtYmVyLCB0cmFuc2xhdGVWOiBudW1iZXIgfSB7XG4gICAgaWYgKGlucHV0LnRyYW5zZm9ybT8udHJhbnNsYXRlVW5pdCA9PT0gJ3B4Jykge1xuICAgICAgY29uc3QgcmF0aW8gPSB0aGlzLmdldFJhdGlvKGlucHV0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zbGF0ZUg6IChpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZUggfHwgMCkgKiByYXRpbyxcbiAgICAgICAgdHJhbnNsYXRlVjogKGlucHV0LnRyYW5zZm9ybT8udHJhbnNsYXRlViB8fCAwKSAqIHJhdGlvXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0cmFuc2xhdGVIOiBpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZUggPyBwZXJjZW50YWdlKGlucHV0LnRyYW5zZm9ybS50cmFuc2xhdGVILCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCkgOiAwLFxuICAgICAgICB0cmFuc2xhdGVWOiBpbnB1dC50cmFuc2Zvcm0/LnRyYW5zbGF0ZVYgPyBwZXJjZW50YWdlKGlucHV0LnRyYW5zZm9ybS50cmFuc2xhdGVWLCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQpIDogMFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJhdGlvKGlucHV0OiBDcm9wSW5wdXQpOiBudW1iZXIge1xuICAgIHJldHVybiBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIGlucHV0Lm1heFNpemUud2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlUG9zaXRpb24oY3JvcHBlclN0YXRlOiBDcm9wSW5wdXQpOiBDcm9wcGVyUG9zaXRpb24ge1xuICAgIGNvbnN0IHJhdGlvID0gdGhpcy5nZXRSYXRpbyhjcm9wcGVyU3RhdGUpO1xuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueDEgKiByYXRpbyksXG4gICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyU3RhdGUuY3JvcHBlci55MSAqIHJhdGlvKSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXJTdGF0ZS5jcm9wcGVyLngyICogcmF0aW8pLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlclN0YXRlLmNyb3BwZXIueTIgKiByYXRpbylcbiAgICB9O1xuXG4gICAgaWYgKCFjcm9wcGVyU3RhdGUub3B0aW9ucz8uY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBvdXQueDEgPSBNYXRoLm1heChvdXQueDEsIDApO1xuICAgICAgb3V0LnkxID0gTWF0aC5tYXgob3V0LnkxLCAwKTtcbiAgICAgIG91dC54MiA9IE1hdGgubWluKG91dC54MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLndpZHRoKTtcbiAgICAgIG91dC55MiA9IE1hdGgubWluKG91dC55MiwgY3JvcHBlclN0YXRlLmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2Zmc2V0SW1hZ2VQb3NpdGlvbihpbnB1dDogQ3JvcElucHV0KTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IChpbnB1dC5vcHRpb25zPy5jYW52YXNSb3RhdGlvbiA/PyAwKSArIGlucHV0LmxvYWRlZEltYWdlIS5leGlmVHJhbnNmb3JtLnJvdGF0ZTtcbiAgICBjb25zdCByYXRpbyA9IHRoaXMuZ2V0UmF0aW8oaW5wdXQpO1xuICAgIGxldCBvZmZzZXRYOiBudW1iZXI7XG4gICAgbGV0IG9mZnNldFk6IG51bWJlcjtcblxuICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcbiAgICAgIG9mZnNldFggPSAoaW5wdXQubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUud2lkdGggLSBpbnB1dC5sb2FkZWRJbWFnZSEub3JpZ2luYWwuc2l6ZS5oZWlnaHQpIC8gMjtcbiAgICAgIG9mZnNldFkgPSAoaW5wdXQubG9hZGVkSW1hZ2UhLnRyYW5zZm9ybWVkLnNpemUuaGVpZ2h0IC0gaW5wdXQubG9hZGVkSW1hZ2UhLm9yaWdpbmFsLnNpemUud2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgb2Zmc2V0WCA9IChpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAtIGlucHV0LmxvYWRlZEltYWdlIS5vcmlnaW5hbC5zaXplLndpZHRoKSAvIDI7XG4gICAgICBvZmZzZXRZID0gKGlucHV0LmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCAtIGlucHV0LmxvYWRlZEltYWdlIS5vcmlnaW5hbC5zaXplLmhlaWdodCkgLyAyO1xuICAgIH1cblxuICAgIGNvbnN0IGNyb3BwZXIgPSBpbnB1dC5jcm9wcGVyO1xuICAgIGNvbnN0IG91dDogQ3JvcHBlclBvc2l0aW9uID0ge1xuICAgICAgeDE6IE1hdGgucm91bmQoY3JvcHBlci54MSAqIHJhdGlvKSAtIG9mZnNldFgsXG4gICAgICB5MTogTWF0aC5yb3VuZChjcm9wcGVyLnkxICogcmF0aW8pIC0gb2Zmc2V0WSxcbiAgICAgIHgyOiBNYXRoLnJvdW5kKGNyb3BwZXIueDIgKiByYXRpbykgLSBvZmZzZXRYLFxuICAgICAgeTI6IE1hdGgucm91bmQoY3JvcHBlci55MiAqIHJhdGlvKSAtIG9mZnNldFlcbiAgICB9O1xuXG4gICAgaWYgKCFpbnB1dC5vcHRpb25zPy5jb250YWluV2l0aGluQXNwZWN0UmF0aW8pIHtcbiAgICAgIG91dC54MSA9IE1hdGgubWF4KG91dC54MSwgMCk7XG4gICAgICBvdXQueTEgPSBNYXRoLm1heChvdXQueTEsIDApO1xuICAgICAgb3V0LngyID0gTWF0aC5taW4ob3V0LngyLCBpbnB1dC5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCk7XG4gICAgICBvdXQueTIgPSBNYXRoLm1pbihvdXQueTIsIGlucHV0LmxvYWRlZEltYWdlIS50cmFuc2Zvcm1lZC5zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIGdldFJlc2l6ZVJhdGlvKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvcHRpb25zPzoge1xuICAgIHJlc2l6ZVRvV2lkdGg/OiBudW1iZXI7XG4gICAgcmVzaXplVG9IZWlnaHQ/OiBudW1iZXI7XG4gICAgb25seVNjYWxlRG93bj86IGJvb2xlYW47XG4gIH0pOiBudW1iZXIge1xuICAgIGNvbnN0IHJhdGlvcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgaWYgKG9wdGlvbnM/LnJlc2l6ZVRvV2lkdGggJiYgb3B0aW9ucy5yZXNpemVUb1dpZHRoID4gMCkge1xuICAgICAgcmF0aW9zLnB1c2gob3B0aW9ucy5yZXNpemVUb1dpZHRoIC8gd2lkdGgpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8ucmVzaXplVG9IZWlnaHQgJiYgb3B0aW9ucy5yZXNpemVUb0hlaWdodCA+IDApIHtcbiAgICAgIHJhdGlvcy5wdXNoKG9wdGlvbnMucmVzaXplVG9IZWlnaHQgLyBoZWlnaHQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHJhdGlvcy5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4oLi4ucmF0aW9zKTtcblxuICAgIGlmIChyZXN1bHQgPiAxICYmICFvcHRpb25zPy5vbmx5U2NhbGVEb3duKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4ocmVzdWx0LCAxKTtcbiAgfVxuXG4gIGdldFF1YWxpdHkob3B0aW9ucz86IHsgaW1hZ2VRdWFsaXR5PzogbnVtYmVyIH0pOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBvcHRpb25zPy5pbWFnZVF1YWxpdHkgPz8gOTIgLyAxMDApKTtcbiAgfVxufVxuIl19
@@ -268,7 +268,7 @@ class CropperState {
268
268
  roundCropper: false,
269
269
  onlyScaleDown: false,
270
270
  imageQuality: 92,
271
- backgroundColor: null,
271
+ backgroundColor: undefined,
272
272
  containWithinAspectRatio: false,
273
273
  hideResizeSquares: false,
274
274
  alignImage: 'center',
@@ -429,6 +429,15 @@ class CropperState {
429
429
  y2: this.maxSize().height
430
430
  };
431
431
  }
432
+ toCropInput() {
433
+ return {
434
+ cropper: this.cropper(),
435
+ maxSize: this.maxSize(),
436
+ transform: this.transform,
437
+ loadedImage: this.loadedImage,
438
+ options: { ...this.options }
439
+ };
440
+ }
432
441
  }
433
442
 
434
443
  var MoveTypes;
@@ -519,8 +528,8 @@ function percentage(percent, totalValue) {
519
528
  }
520
529
 
521
530
  class CropService {
522
- crop(cropperState, output) {
523
- const imagePosition = this.getImagePosition(cropperState);
531
+ crop(input, output) {
532
+ const imagePosition = this.getImagePosition(input);
524
533
  const width = imagePosition.x2 - imagePosition.x1;
525
534
  const height = imagePosition.y2 - imagePosition.y1;
526
535
  const cropCanvas = document.createElement('canvas');
@@ -530,77 +539,76 @@ class CropService {
530
539
  if (!ctx) {
531
540
  return null;
532
541
  }
533
- if (cropperState.options.backgroundColor != null) {
534
- ctx.fillStyle = cropperState.options.backgroundColor;
542
+ if (input.options?.backgroundColor != null) {
543
+ ctx.fillStyle = input.options.backgroundColor;
535
544
  ctx.fillRect(0, 0, width, height);
536
545
  }
537
- const scaleX = (cropperState.transform.scale || 1) * (cropperState.transform.flipH ? -1 : 1);
538
- const scaleY = (cropperState.transform.scale || 1) * (cropperState.transform.flipV ? -1 : 1);
539
- const { translateH, translateV } = this.getCanvasTranslate(cropperState);
540
- const transformedImage = cropperState.loadedImage.transformed;
546
+ const scaleX = (input.transform?.scale || 1) * (input.transform?.flipH ? -1 : 1);
547
+ const scaleY = (input.transform?.scale || 1) * (input.transform?.flipV ? -1 : 1);
548
+ const { translateH, translateV } = this.getCanvasTranslate(input);
549
+ const transformedImage = input.loadedImage.transformed;
541
550
  ctx.setTransform(scaleX, 0, 0, scaleY, transformedImage.size.width / 2 + translateH, transformedImage.size.height / 2 + translateV);
542
551
  ctx.translate(-imagePosition.x1 / scaleX, -imagePosition.y1 / scaleY);
543
- ctx.rotate((cropperState.transform.rotate || 0) * Math.PI / 180);
552
+ ctx.rotate((input.transform?.rotate || 0) * Math.PI / 180);
544
553
  ctx.drawImage(transformedImage.image, -transformedImage.size.width / 2, -transformedImage.size.height / 2);
545
554
  const result = {
546
555
  width, height,
547
556
  imagePosition,
548
- cropperPosition: { ...cropperState.cropper() }
557
+ cropperPosition: { ...input.cropper }
549
558
  };
550
- if (cropperState.options.containWithinAspectRatio) {
551
- result.offsetImagePosition = this.getOffsetImagePosition(cropperState);
559
+ if (input.options?.containWithinAspectRatio) {
560
+ result.offsetImagePosition = this.getOffsetImagePosition(input);
552
561
  }
553
- const resizeRatio = this.getResizeRatio(width, height, cropperState.options);
562
+ const resizeRatio = this.getResizeRatio(width, height, input.options);
554
563
  if (resizeRatio !== 1) {
555
564
  result.width = Math.round(width * resizeRatio);
556
- result.height = cropperState.options.maintainAspectRatio
557
- ? Math.round(result.width / cropperState.options.aspectRatio)
565
+ result.height = input.options?.maintainAspectRatio
566
+ ? Math.round(result.width / (input.options?.aspectRatio ?? 1))
558
567
  : Math.round(height * resizeRatio);
559
568
  resizeCanvas(cropCanvas, result.width, result.height);
560
569
  }
561
570
  if (output === 'blob') {
562
- return this.cropToBlob(result, cropCanvas, cropperState);
571
+ return this.cropToBlob(result, cropCanvas, input);
563
572
  }
564
573
  else {
565
- result.base64 = cropCanvas.toDataURL('image/' + cropperState.options.format, this.getQuality(cropperState.options));
574
+ result.base64 = cropCanvas.toDataURL('image/' + (input.options?.format ?? 'png'), this.getQuality(input.options));
566
575
  return result;
567
576
  }
568
577
  }
569
- async cropToBlob(output, cropCanvas, cropperState) {
570
- output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + cropperState.options.format, this.getQuality(cropperState.options)));
578
+ async cropToBlob(output, cropCanvas, input) {
579
+ output.blob = await new Promise(resolve => cropCanvas.toBlob(resolve, 'image/' + (input.options?.format ?? 'png'), this.getQuality(input.options)));
571
580
  if (output.blob) {
572
581
  output.objectUrl = URL.createObjectURL(output.blob);
573
582
  }
574
583
  return output;
575
584
  }
576
- getCanvasTranslate(cropperState) {
577
- if (cropperState.transform.translateUnit === 'px') {
578
- const ratio = this.getRatio(cropperState);
585
+ getCanvasTranslate(input) {
586
+ if (input.transform?.translateUnit === 'px') {
587
+ const ratio = this.getRatio(input);
579
588
  return {
580
- translateH: (cropperState.transform.translateH || 0) * ratio,
581
- translateV: (cropperState.transform.translateV || 0) * ratio
589
+ translateH: (input.transform?.translateH || 0) * ratio,
590
+ translateV: (input.transform?.translateV || 0) * ratio
582
591
  };
583
592
  }
584
593
  else {
585
594
  return {
586
- translateH: cropperState.transform.translateH ? percentage(cropperState.transform.translateH, cropperState.loadedImage.transformed.size.width) : 0,
587
- translateV: cropperState.transform.translateV ? percentage(cropperState.transform.translateV, cropperState.loadedImage.transformed.size.height) : 0
595
+ translateH: input.transform?.translateH ? percentage(input.transform.translateH, input.loadedImage.transformed.size.width) : 0,
596
+ translateV: input.transform?.translateV ? percentage(input.transform.translateV, input.loadedImage.transformed.size.height) : 0
588
597
  };
589
598
  }
590
599
  }
591
- getRatio(cropperState) {
592
- return cropperState.loadedImage.transformed.size.width / cropperState.maxSize().width;
600
+ getRatio(input) {
601
+ return input.loadedImage.transformed.size.width / input.maxSize.width;
593
602
  }
594
603
  getImagePosition(cropperState) {
595
604
  const ratio = this.getRatio(cropperState);
596
- const cropper = cropperState.cropper();
597
605
  const out = {
598
- x1: Math.round(cropper.x1 * ratio),
599
- y1: Math.round(cropper.y1 * ratio),
600
- x2: Math.round(cropper.x2 * ratio),
601
- y2: Math.round(cropper.y2 * ratio)
606
+ x1: Math.round(cropperState.cropper.x1 * ratio),
607
+ y1: Math.round(cropperState.cropper.y1 * ratio),
608
+ x2: Math.round(cropperState.cropper.x2 * ratio),
609
+ y2: Math.round(cropperState.cropper.y2 * ratio)
602
610
  };
603
- if (!cropperState.options.containWithinAspectRatio) {
611
+ if (!cropperState.options?.containWithinAspectRatio) {
604
612
  out.x1 = Math.max(out.x1, 0);
605
613
  out.y1 = Math.max(out.y1, 0);
606
614
  out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
@@ -608,52 +616,50 @@ class CropService {
608
616
  }
609
617
  return out;
610
618
  }
611
- getOffsetImagePosition(cropperState) {
612
- const canvasRotation = cropperState.options.canvasRotation + cropperState.loadedImage.exifTransform.rotate;
613
- const ratio = this.getRatio(cropperState);
619
+ getOffsetImagePosition(input) {
620
+ const canvasRotation = (input.options?.canvasRotation ?? 0) + input.loadedImage.exifTransform.rotate;
621
+ const ratio = this.getRatio(input);
614
622
  let offsetX;
615
623
  let offsetY;
616
624
  if (canvasRotation % 2) {
617
- offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.height) / 2;
618
- offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.width) / 2;
625
+ offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.height) / 2;
626
+ offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.width) / 2;
619
627
  }
620
628
  else {
621
- offsetX = (cropperState.loadedImage.transformed.size.width - cropperState.loadedImage.original.size.width) / 2;
622
- offsetY = (cropperState.loadedImage.transformed.size.height - cropperState.loadedImage.original.size.height) / 2;
629
+ offsetX = (input.loadedImage.transformed.size.width - input.loadedImage.original.size.width) / 2;
630
+ offsetY = (input.loadedImage.transformed.size.height - input.loadedImage.original.size.height) / 2;
623
631
  }
624
- const cropper = cropperState.cropper();
632
+ const cropper = input.cropper;
625
633
  const out = {
626
634
  x1: Math.round(cropper.x1 * ratio) - offsetX,
627
635
  y1: Math.round(cropper.y1 * ratio) - offsetY,
628
636
  x2: Math.round(cropper.x2 * ratio) - offsetX,
629
637
  y2: Math.round(cropper.y2 * ratio) - offsetY
630
638
  };
631
- if (!cropperState.options.containWithinAspectRatio) {
639
+ if (!input.options?.containWithinAspectRatio) {
632
640
  out.x1 = Math.max(out.x1, 0);
633
641
  out.y1 = Math.max(out.y1, 0);
634
- out.x2 = Math.min(out.x2, cropperState.loadedImage.transformed.size.width);
635
- out.y2 = Math.min(out.y2, cropperState.loadedImage.transformed.size.height);
642
+ out.x2 = Math.min(out.x2, input.loadedImage.transformed.size.width);
643
+ out.y2 = Math.min(out.y2, input.loadedImage.transformed.size.height);
636
644
  }
637
645
  return out;
638
646
  }
639
647
  getResizeRatio(width, height, options) {
640
- const ratioWidth = options.resizeToWidth / width;
641
- const ratioHeight = options.resizeToHeight / height;
642
648
  const ratios = new Array();
643
- if (options.resizeToWidth > 0) {
644
- ratios.push(ratioWidth);
649
+ if (options?.resizeToWidth && options.resizeToWidth > 0) {
650
+ ratios.push(options.resizeToWidth / width);
645
651
  }
646
- if (options.resizeToHeight > 0) {
647
- ratios.push(ratioHeight);
652
+ if (options?.resizeToHeight && options.resizeToHeight > 0) {
653
+ ratios.push(options.resizeToHeight / height);
648
654
  }
649
655
  const result = ratios.length === 0 ? 1 : Math.min(...ratios);
650
- if (result > 1 && !options.onlyScaleDown) {
656
+ if (result > 1 && !options?.onlyScaleDown) {
651
657
  return result;
652
658
  }
653
659
  return Math.min(result, 1);
654
660
  }
655
661
  getQuality(options) {
656
- return Math.min(1, Math.max(0, options.imageQuality / 100));
662
+ return Math.min(1, Math.max(0, options?.imageQuality ?? 92 / 100));
657
663
  }
658
664
  }
659
665
 
@@ -1325,7 +1331,7 @@ class ImageCropperComponent {
1325
1331
  }
1326
1332
  cropToBlob() {
1327
1333
  return new Promise(async (resolve, reject) => {
1328
- const result = await this.cropService.crop(this.state, 'blob');
1334
+ const result = await this.cropService.crop(this.state.toCropInput(), 'blob');
1329
1335
  if (result) {
1330
1336
  this.imageCropped.emit(result);
1331
1337
  resolve(result);
@@ -1336,7 +1342,7 @@ class ImageCropperComponent {
1336
1342
  });
1337
1343
  }
1338
1344
  cropToBase64() {
1339
- const result = this.cropService.crop(this.state, 'base64');
1345
+ const result = this.cropService.crop(this.state.toCropInput(), 'base64');
1340
1346
  if (result) {
1341
1347
  this.imageCropped.emit(result);
1342
1348
  return result;