ngx-image-cropper 7.2.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +10 -29
  2. package/esm2022/lib/component/image-cropper.component.mjs +636 -0
  3. package/esm2022/lib/interfaces/basic-event.interface.mjs +2 -0
  4. package/{esm2020 → esm2022}/lib/services/crop.service.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/services/cropper-position.service.mjs +16 -6
  6. package/esm2022/lib/services/load-image.service.mjs +201 -0
  7. package/{esm2020 → esm2022}/lib/utils/keyboard.utils.mjs +1 -1
  8. package/esm2022/public-api.mjs +7 -0
  9. package/{fesm2020 → fesm2022}/ngx-image-cropper.mjs +36 -47
  10. package/fesm2022/ngx-image-cropper.mjs.map +1 -0
  11. package/index.d.ts +5 -7
  12. package/lib/component/image-cropper.component.d.ts +5 -4
  13. package/lib/interfaces/basic-event.interface.d.ts +4 -0
  14. package/lib/interfaces/cropper-options.interface.d.ts +2 -2
  15. package/lib/services/cropper-position.service.d.ts +5 -4
  16. package/lib/utils/hammer.utils.d.ts +1 -1
  17. package/lib/utils/keyboard.utils.d.ts +2 -1
  18. package/package.json +10 -18
  19. package/public-api.d.ts +6 -1
  20. package/esm2020/index.mjs +0 -8
  21. package/esm2020/lib/component/image-cropper.component.mjs +0 -635
  22. package/esm2020/lib/image-cropper.module.mjs +0 -26
  23. package/esm2020/lib/services/load-image.service.mjs +0 -200
  24. package/esm2020/public-api.mjs +0 -2
  25. package/fesm2015/ngx-image-cropper.mjs +0 -1483
  26. package/fesm2015/ngx-image-cropper.mjs.map +0 -1
  27. package/fesm2020/ngx-image-cropper.mjs.map +0 -1
  28. package/lib/image-cropper.module.d.ts +0 -8
  29. package/ngx-image-cropper.d.ts +0 -5
  30. /package/{esm2020 → esm2022}/lib/interfaces/cropper-options.interface.mjs +0 -0
  31. /package/{esm2020 → esm2022}/lib/interfaces/cropper-position.interface.mjs +0 -0
  32. /package/{esm2020 → esm2022}/lib/interfaces/cropper.settings.mjs +0 -0
  33. /package/{esm2020 → esm2022}/lib/interfaces/dimensions.interface.mjs +0 -0
  34. /package/{esm2020 → esm2022}/lib/interfaces/exif-transform.interface.mjs +0 -0
  35. /package/{esm2020 → esm2022}/lib/interfaces/image-cropped-event.interface.mjs +0 -0
  36. /package/{esm2020 → esm2022}/lib/interfaces/image-transform.interface.mjs +0 -0
  37. /package/{esm2020 → esm2022}/lib/interfaces/index.mjs +0 -0
  38. /package/{esm2020 → esm2022}/lib/interfaces/loaded-image.interface.mjs +0 -0
  39. /package/{esm2020 → esm2022}/lib/interfaces/move-start.interface.mjs +0 -0
  40. /package/{esm2020 → esm2022}/lib/utils/blob.utils.mjs +0 -0
  41. /package/{esm2020 → esm2022}/lib/utils/exif.utils.mjs +0 -0
  42. /package/{esm2020 → esm2022}/lib/utils/hammer.utils.mjs +0 -0
  43. /package/{esm2020 → esm2022}/lib/utils/percentage.utils.mjs +0 -0
  44. /package/{esm2020 → esm2022}/lib/utils/resize.utils.mjs +0 -0
  45. /package/{esm2020 → esm2022}/ngx-image-cropper.mjs +0 -0
@@ -1,26 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { ImageCropperComponent } from './component/image-cropper.component';
4
- import * as i0 from "@angular/core";
5
- export class ImageCropperModule {
6
- }
7
- ImageCropperModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
8
- ImageCropperModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, declarations: [ImageCropperComponent], imports: [CommonModule], exports: [ImageCropperComponent] });
9
- ImageCropperModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, imports: [[
10
- CommonModule
11
- ]] });
12
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: ImageCropperModule, decorators: [{
13
- type: NgModule,
14
- args: [{
15
- imports: [
16
- CommonModule
17
- ],
18
- declarations: [
19
- ImageCropperComponent,
20
- ],
21
- exports: [
22
- ImageCropperComponent
23
- ]
24
- }]
25
- }] });
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtY3JvcHBlci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtaW1hZ2UtY3JvcHBlci9zcmMvbGliL2ltYWdlLWNyb3BwZXIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQWM1RSxNQUFNLE9BQU8sa0JBQWtCOztnSEFBbEIsa0JBQWtCO2lIQUFsQixrQkFBa0IsaUJBUDNCLHFCQUFxQixhQUhyQixZQUFZLGFBT1oscUJBQXFCO2lIQUdaLGtCQUFrQixZQVhwQjtZQUNQLFlBQVk7U0FDYjs0RkFTVSxrQkFBa0I7a0JBWjlCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7cUJBQ2I7b0JBQ0QsWUFBWSxFQUFFO3dCQUNaLHFCQUFxQjtxQkFFdEI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHFCQUFxQjtxQkFDdEI7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEltYWdlQ3JvcHBlckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2ltYWdlLWNyb3BwZXIuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZVxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBJbWFnZUNyb3BwZXJDb21wb25lbnQsXG5cbiAgXSxcbiAgZXhwb3J0czogW1xuICAgIEltYWdlQ3JvcHBlckNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlQ3JvcHBlck1vZHVsZSB7XG59XG4iXX0=
@@ -1,200 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
3
- import * as i0 from "@angular/core";
4
- export class LoadImageService {
5
- constructor() {
6
- this.autoRotateSupported = supportsAutomaticRotation();
7
- }
8
- async loadImageFile(file, cropperSettings) {
9
- const arrayBuffer = await file.arrayBuffer();
10
- return await this.checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, file.type, cropperSettings);
11
- }
12
- checkImageTypeAndLoadImageFromArrayBuffer(arrayBuffer, imageType, cropperSettings) {
13
- if (!this.isValidImageType(imageType)) {
14
- return Promise.reject(new Error('Invalid image type'));
15
- }
16
- return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType);
17
- }
18
- isValidImageType(type) {
19
- return /image\/(png|jpg|jpeg|bmp|gif|tiff|svg|webp|x-icon|vnd.microsoft.icon)/.test(type);
20
- }
21
- async loadImageFromURL(url, cropperSettings) {
22
- const res = await fetch(url);
23
- const buffer = await res.arrayBuffer();
24
- return await this.loadImageFromArrayBuffer(buffer, cropperSettings);
25
- }
26
- loadBase64Image(imageBase64, cropperSettings) {
27
- const arrayBuffer = this.base64ToArrayBuffer(imageBase64);
28
- return this.loadImageFromArrayBuffer(arrayBuffer, cropperSettings);
29
- }
30
- base64ToArrayBuffer(imageBase64) {
31
- imageBase64 = imageBase64.replace(/^data:([^;]+);base64,/gmi, '');
32
- const binaryString = atob(imageBase64);
33
- const len = binaryString.length;
34
- const bytes = new Uint8Array(len);
35
- for (let i = 0; i < len; i++) {
36
- bytes[i] = binaryString.charCodeAt(i);
37
- }
38
- return bytes.buffer;
39
- }
40
- async loadImageFromArrayBuffer(arrayBuffer, cropperSettings, imageType) {
41
- const res = await new Promise(async (resolve, reject) => {
42
- try {
43
- const blob = new Blob([arrayBuffer], imageType ? { type: imageType } : undefined);
44
- const objectUrl = URL.createObjectURL(blob);
45
- const originalImage = new Image();
46
- const isSvg = imageType === 'image/svg+xml';
47
- const originalImageSize = isSvg ? await this.getSvgImageSize(blob) : undefined;
48
- originalImage.onload = () => resolve({
49
- originalImage,
50
- originalImageSize,
51
- originalObjectUrl: objectUrl,
52
- originalArrayBuffer: arrayBuffer
53
- });
54
- originalImage.onerror = reject;
55
- originalImage.src = objectUrl;
56
- }
57
- catch (e) {
58
- reject(e);
59
- }
60
- });
61
- return await this.transformImageFromArrayBuffer(res, cropperSettings, res.originalImageSize != null);
62
- }
63
- async getSvgImageSize(blob) {
64
- const parser = new DOMParser();
65
- const doc = parser.parseFromString(await blob.text(), 'image/svg+xml');
66
- const svgElement = doc.querySelector('svg');
67
- if (!svgElement) {
68
- throw Error('Failed to parse SVG image');
69
- }
70
- const widthAttr = svgElement.getAttribute('width');
71
- const heightAttr = svgElement.getAttribute('height');
72
- if (widthAttr && heightAttr) {
73
- return null;
74
- }
75
- const viewBoxAttr = svgElement.getAttribute('viewBox')
76
- || svgElement.getAttribute('viewbox');
77
- if (viewBoxAttr) {
78
- const viewBox = viewBoxAttr.split(' ');
79
- return {
80
- width: +viewBox[2],
81
- height: +viewBox[3]
82
- };
83
- }
84
- throw Error('Failed to load SVG image. SVG must have width + height or viewBox definition.');
85
- }
86
- async transformImageFromArrayBuffer(res, cropperSettings, forceTransform = false) {
87
- const autoRotate = await this.autoRotateSupported;
88
- const exifTransform = getTransformationsFromExifData(autoRotate ? -1 : res.originalArrayBuffer);
89
- if (!res.originalImage || !res.originalImage.complete) {
90
- return Promise.reject(new Error('No image loaded'));
91
- }
92
- const loadedImage = {
93
- original: {
94
- objectUrl: res.originalObjectUrl,
95
- image: res.originalImage,
96
- size: res.originalImageSize ?? {
97
- width: res.originalImage.naturalWidth,
98
- height: res.originalImage.naturalHeight
99
- }
100
- },
101
- exifTransform
102
- };
103
- return this.transformLoadedImage(loadedImage, cropperSettings, forceTransform);
104
- }
105
- async transformLoadedImage(loadedImage, cropperSettings, forceTransform = false) {
106
- const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
107
- const originalSize = loadedImage.original.size;
108
- if (!forceTransform && canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
109
- return {
110
- original: {
111
- objectUrl: loadedImage.original.objectUrl,
112
- image: loadedImage.original.image,
113
- size: { ...originalSize }
114
- },
115
- transformed: {
116
- objectUrl: loadedImage.original.objectUrl,
117
- image: loadedImage.original.image,
118
- size: { ...originalSize }
119
- },
120
- exifTransform: loadedImage.exifTransform
121
- };
122
- }
123
- const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);
124
- const canvas = document.createElement('canvas');
125
- canvas.width = transformedSize.width;
126
- canvas.height = transformedSize.height;
127
- const ctx = canvas.getContext('2d');
128
- ctx?.setTransform(loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
129
- ctx?.rotate(Math.PI * (canvasRotation / 2));
130
- ctx?.drawImage(loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
131
- const blob = await new Promise(resolve => canvas.toBlob(resolve, cropperSettings.format));
132
- if (!blob) {
133
- throw new Error('Failed to get Blob for transformed image.');
134
- }
135
- const objectUrl = URL.createObjectURL(blob);
136
- const transformedImage = await this.loadImageFromObjectUrl(objectUrl);
137
- return {
138
- original: {
139
- objectUrl: loadedImage.original.objectUrl,
140
- image: loadedImage.original.image,
141
- size: { ...originalSize }
142
- },
143
- transformed: {
144
- objectUrl: objectUrl,
145
- image: transformedImage,
146
- size: {
147
- width: transformedImage.width,
148
- height: transformedImage.height
149
- }
150
- },
151
- exifTransform: loadedImage.exifTransform
152
- };
153
- }
154
- loadImageFromObjectUrl(objectUrl) {
155
- return new Promise(((resolve, reject) => {
156
- const image = new Image();
157
- image.onload = () => resolve(image);
158
- image.onerror = reject;
159
- image.src = objectUrl;
160
- }));
161
- }
162
- getTransformedSize(originalSize, exifTransform, cropperSettings) {
163
- const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;
164
- if (cropperSettings.containWithinAspectRatio) {
165
- if (canvasRotation % 2) {
166
- const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;
167
- const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;
168
- return {
169
- width: Math.max(originalSize.height, minWidthToContain),
170
- height: Math.max(originalSize.width, minHeightToContain)
171
- };
172
- }
173
- else {
174
- const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;
175
- const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;
176
- return {
177
- width: Math.max(originalSize.width, minWidthToContain),
178
- height: Math.max(originalSize.height, minHeightToContain)
179
- };
180
- }
181
- }
182
- if (canvasRotation % 2) {
183
- return {
184
- height: originalSize.width,
185
- width: originalSize.height
186
- };
187
- }
188
- return {
189
- width: originalSize.width,
190
- height: originalSize.height
191
- };
192
- }
193
- }
194
- LoadImageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
195
- LoadImageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, providedIn: 'root' });
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: LoadImageService, decorators: [{
197
- type: Injectable,
198
- args: [{ providedIn: 'root' }]
199
- }] });
200
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWltYWdlLWNyb3BwZXIvc3JjL2xpYi9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFVaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUQ3QjtRQUdVLHdCQUFtQixHQUFxQix5QkFBeUIsRUFBRSxDQUFDO0tBcU43RTtJQW5OQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQVUsRUFBRSxlQUFnQztRQUM5RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QyxPQUFPLE1BQU0sSUFBSSxDQUFDLHlDQUF5QyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFTyx5Q0FBeUMsQ0FBQyxXQUE0QixFQUFFLFNBQWlCLEVBQUUsZUFBZ0M7UUFDakksSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNyQyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxPQUFPLHVFQUF1RSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1RixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVcsRUFB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O2dCQUMxQixLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU07YUFDM0IsQ0FBQztTQUNIO1FBQ0QsT0FBTztZQUNMLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSztZQUN6QixNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU07U0FDNUIsQ0FBQztJQUNKLENBQUM7OzhHQXROVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURKLE1BQU07NEZBQ2xCLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaW1lbnNpb25zLCBMb2FkZWRJbWFnZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ3JvcHBlclNldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcm9wcGVyLnNldHRpbmdzJztcbmltcG9ydCB7IEV4aWZUcmFuc2Zvcm0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL2V4aWYtdHJhbnNmb3JtLmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXRUcmFuc2Zvcm1hdGlvbnNGcm9tRXhpZkRhdGEsIHN1cHBvcnRzQXV0b21hdGljUm90YXRpb24gfSBmcm9tICcuLi91dGlscy9leGlmLnV0aWxzJztcblxuaW50ZXJmYWNlIExvYWRJbWFnZUFycmF5QnVmZmVyIHtcbiAgb3JpZ2luYWxJbWFnZTogSFRNTEltYWdlRWxlbWVudDtcbiAgb3JpZ2luYWxBcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlO1xuICBvcmlnaW5hbE9iamVjdFVybDogc3RyaW5nO1xuICBvcmlnaW5hbEltYWdlU2l6ZT86IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH0gfCBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBMb2FkSW1hZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIGF1dG9Sb3RhdGVTdXBwb3J0ZWQ6IFByb21pc2U8Ym9vbGVhbj4gPSBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uKCk7XG5cbiAgYXN5bmMgbG9hZEltYWdlRmlsZShmaWxlOiBGaWxlLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jaGVja0ltYWdlVHlwZUFuZExvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgZmlsZS50eXBlLCBjcm9wcGVyU2V0dGluZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0ltYWdlVHlwZUFuZExvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcjogQXJyYXlCdWZmZXJMaWtlLCBpbWFnZVR5cGU6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRJbWFnZVR5cGUoaW1hZ2VUeXBlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignSW52YWxpZCBpbWFnZSB0eXBlJykpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXIsIGNyb3BwZXJTZXR0aW5ncywgaW1hZ2VUeXBlKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZEltYWdlVHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL2ltYWdlXFwvKHBuZ3xqcGd8anBlZ3xibXB8Z2lmfHRpZmZ8c3ZnfHdlYnB8eC1pY29ufHZuZC5taWNyb3NvZnQuaWNvbikvLnRlc3QodHlwZSk7XG4gIH1cblxuICBhc3luYyBsb2FkSW1hZ2VGcm9tVVJMKHVybDogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihidWZmZXIsIGNyb3BwZXJTZXR0aW5ncyk7XG4gIH1cblxuICBsb2FkQmFzZTY0SW1hZ2UoaW1hZ2VCYXNlNjQ6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgY29uc3QgYXJyYXlCdWZmZXIgPSB0aGlzLmJhc2U2NFRvQXJyYXlCdWZmZXIoaW1hZ2VCYXNlNjQpO1xuICAgIHJldHVybiB0aGlzLmxvYWRJbWFnZUZyb21BcnJheUJ1ZmZlcihhcnJheUJ1ZmZlciwgY3JvcHBlclNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYmFzZTY0VG9BcnJheUJ1ZmZlcihpbWFnZUJhc2U2NDogc3RyaW5nKTogQXJyYXlCdWZmZXJMaWtlIHtcbiAgICBpbWFnZUJhc2U2NCA9IGltYWdlQmFzZTY0LnJlcGxhY2UoL15kYXRhOihbXjtdKyk7YmFzZTY0LC9nbWksICcnKTtcbiAgICBjb25zdCBiaW5hcnlTdHJpbmcgPSBhdG9iKGltYWdlQmFzZTY0KTtcbiAgICBjb25zdCBsZW4gPSBiaW5hcnlTdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXMuYnVmZmVyO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkSW1hZ2VGcm9tQXJyYXlCdWZmZXIoYXJyYXlCdWZmZXI6IEFycmF5QnVmZmVyTGlrZSwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MsIGltYWdlVHlwZT86IHN0cmluZyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBuZXcgUHJvbWlzZTxMb2FkSW1hZ2VBcnJheUJ1ZmZlcj4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFthcnJheUJ1ZmZlcl0sIGltYWdlVHlwZSA/IHt0eXBlOiBpbWFnZVR5cGV9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBjb25zdCBpc1N2ZyA9IGltYWdlVHlwZSA9PT0gJ2ltYWdlL3N2Zyt4bWwnO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEltYWdlU2l6ZSA9IGlzU3ZnID8gYXdhaXQgdGhpcy5nZXRTdmdJbWFnZVNpemUoYmxvYikgOiB1bmRlZmluZWQ7XG4gICAgICAgIG9yaWdpbmFsSW1hZ2Uub25sb2FkID0gKCkgPT4gcmVzb2x2ZSh7XG4gICAgICAgICAgb3JpZ2luYWxJbWFnZSxcbiAgICAgICAgICBvcmlnaW5hbEltYWdlU2l6ZSxcbiAgICAgICAgICBvcmlnaW5hbE9iamVjdFVybDogb2JqZWN0VXJsLFxuICAgICAgICAgIG9yaWdpbmFsQXJyYXlCdWZmZXI6IGFycmF5QnVmZmVyXG4gICAgICAgIH0pO1xuICAgICAgICBvcmlnaW5hbEltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIG9yaWdpbmFsSW1hZ2Uuc3JjID0gb2JqZWN0VXJsO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMudHJhbnNmb3JtSW1hZ2VGcm9tQXJyYXlCdWZmZXIocmVzLCBjcm9wcGVyU2V0dGluZ3MsIHJlcy5vcmlnaW5hbEltYWdlU2l6ZSAhPSBudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0U3ZnSW1hZ2VTaXplKGJsb2I6IEJsb2IpOiBQcm9taXNlPHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXI7IH0gfCBudWxsPiB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoYXdhaXQgYmxvYi50ZXh0KCksICdpbWFnZS9zdmcreG1sJyk7XG4gICAgY29uc3Qgc3ZnRWxlbWVudCA9IGRvYy5xdWVyeVNlbGVjdG9yKCdzdmcnKTtcbiAgICBpZiAoIXN2Z0VsZW1lbnQpIHtcbiAgICAgIHRocm93IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgU1ZHIGltYWdlJyk7XG4gICAgfVxuICAgIGNvbnN0IHdpZHRoQXR0ciA9IHN2Z0VsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWR0aCcpO1xuICAgIGNvbnN0IGhlaWdodEF0dHIgPSBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgnaGVpZ2h0Jyk7XG4gICAgaWYgKHdpZHRoQXR0ciAmJiBoZWlnaHRBdHRyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgdmlld0JveEF0dHIgPSBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgndmlld0JveCcpXG4gICAgICB8fCBzdmdFbGVtZW50LmdldEF0dHJpYnV0ZSgndmlld2JveCcpO1xuICAgIGlmICh2aWV3Qm94QXR0cikge1xuICAgICAgY29uc3Qgdmlld0JveCA9IHZpZXdCb3hBdHRyLnNwbGl0KCcgJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogK3ZpZXdCb3hbMl0sXG4gICAgICAgIGhlaWdodDogK3ZpZXdCb3hbM11cbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBTVkcgaW1hZ2UuIFNWRyBtdXN0IGhhdmUgd2lkdGggKyBoZWlnaHQgb3Igdmlld0JveCBkZWZpbml0aW9uLicpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cmFuc2Zvcm1JbWFnZUZyb21BcnJheUJ1ZmZlcihyZXM6IExvYWRJbWFnZUFycmF5QnVmZmVyLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0gPSBmYWxzZSk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBhdXRvUm90YXRlID0gYXdhaXQgdGhpcy5hdXRvUm90YXRlU3VwcG9ydGVkO1xuICAgIGNvbnN0IGV4aWZUcmFuc2Zvcm0gPSBnZXRUcmFuc2Zvcm1hdGlvbnNGcm9tRXhpZkRhdGEoYXV0b1JvdGF0ZSA/IC0xIDogcmVzLm9yaWdpbmFsQXJyYXlCdWZmZXIpO1xuICAgIGlmICghcmVzLm9yaWdpbmFsSW1hZ2UgfHwgIXJlcy5vcmlnaW5hbEltYWdlLmNvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBpbWFnZSBsb2FkZWQnKSk7XG4gICAgfVxuICAgIGNvbnN0IGxvYWRlZEltYWdlID0ge1xuICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgb2JqZWN0VXJsOiByZXMub3JpZ2luYWxPYmplY3RVcmwsXG4gICAgICAgIGltYWdlOiByZXMub3JpZ2luYWxJbWFnZSxcbiAgICAgICAgc2l6ZTogcmVzLm9yaWdpbmFsSW1hZ2VTaXplID8/IHtcbiAgICAgICAgICB3aWR0aDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbFdpZHRoLFxuICAgICAgICAgIGhlaWdodDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbEhlaWdodFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXhpZlRyYW5zZm9ybVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtTG9hZGVkSW1hZ2UobG9hZGVkSW1hZ2UsIGNyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0pO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNmb3JtTG9hZGVkSW1hZ2UobG9hZGVkSW1hZ2U6IFBhcnRpYWw8TG9hZGVkSW1hZ2U+LCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncywgZm9yY2VUcmFuc2Zvcm0gPSBmYWxzZSk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLnJvdGF0ZTtcbiAgICBjb25zdCBvcmlnaW5hbFNpemUgPSBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuc2l6ZTtcbiAgICBpZiAoIWZvcmNlVHJhbnNmb3JtICYmIGNhbnZhc1JvdGF0aW9uID09PSAwICYmICFsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwICYmICFjcm9wcGVyU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgIG9iamVjdFVybDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLm9iamVjdFVybCxcbiAgICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgICAgIHNpemU6IHsuLi5vcmlnaW5hbFNpemV9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgb2JqZWN0VXJsOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEub2JqZWN0VXJsLFxuICAgICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXG4gICAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgICAgfSxcbiAgICAgICAgZXhpZlRyYW5zZm9ybTogbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSFcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNmb3JtZWRTaXplID0gdGhpcy5nZXRUcmFuc2Zvcm1lZFNpemUob3JpZ2luYWxTaXplLCBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtISwgY3JvcHBlclNldHRpbmdzKTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSB0cmFuc2Zvcm1lZFNpemUud2lkdGg7XG4gICAgY2FudmFzLmhlaWdodCA9IHRyYW5zZm9ybWVkU2l6ZS5oZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY3R4Py5zZXRUcmFuc2Zvcm0oXG4gICAgICBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwID8gLTEgOiAxLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgY2FudmFzLndpZHRoIC8gMixcbiAgICAgIGNhbnZhcy5oZWlnaHQgLyAyXG4gICAgKTtcbiAgICBjdHg/LnJvdGF0ZShNYXRoLlBJICogKGNhbnZhc1JvdGF0aW9uIC8gMikpO1xuICAgIGN0eD8uZHJhd0ltYWdlKFxuICAgICAgbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxuICAgICAgLW9yaWdpbmFsU2l6ZS53aWR0aCAvIDIsXG4gICAgICAtb3JpZ2luYWxTaXplLmhlaWdodCAvIDJcbiAgICApO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBuZXcgUHJvbWlzZTxCbG9iIHwgbnVsbD4ocmVzb2x2ZSA9PiBjYW52YXMudG9CbG9iKHJlc29sdmUsIGNyb3BwZXJTZXR0aW5ncy5mb3JtYXQpKTtcbiAgICBpZiAoIWJsb2IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBCbG9iIGZvciB0cmFuc2Zvcm1lZCBpbWFnZS4nKTtcbiAgICB9XG4gICAgY29uc3Qgb2JqZWN0VXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1lZEltYWdlID0gYXdhaXQgdGhpcy5sb2FkSW1hZ2VGcm9tT2JqZWN0VXJsKG9iamVjdFVybCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgIG9iamVjdFVybDogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLm9iamVjdFVybCxcbiAgICAgICAgaW1hZ2U6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZSxcbiAgICAgICAgc2l6ZTogey4uLm9yaWdpbmFsU2l6ZX1cbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm1lZDoge1xuICAgICAgICBvYmplY3RVcmw6IG9iamVjdFVybCxcbiAgICAgICAgaW1hZ2U6IHRyYW5zZm9ybWVkSW1hZ2UsXG4gICAgICAgIHNpemU6IHtcbiAgICAgICAgICB3aWR0aDogdHJhbnNmb3JtZWRJbWFnZS53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHRyYW5zZm9ybWVkSW1hZ2UuaGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBleGlmVHJhbnNmb3JtOiBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGxvYWRJbWFnZUZyb21PYmplY3RVcmwob2JqZWN0VXJsOiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGltYWdlKTtcbiAgICAgIGltYWdlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICBpbWFnZS5zcmMgPSBvYmplY3RVcmw7XG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUcmFuc2Zvcm1lZFNpemUoXG4gICAgb3JpZ2luYWxTaXplOiB7IHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyIH0sXG4gICAgZXhpZlRyYW5zZm9ybTogRXhpZlRyYW5zZm9ybSxcbiAgICBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5nc1xuICApOiBEaW1lbnNpb25zIHtcbiAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGV4aWZUcmFuc2Zvcm0ucm90YXRlO1xuICAgIGlmIChjcm9wcGVyU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XG4gICAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLndpZHRoICogY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICBjb25zdCBtaW5IZWlnaHRUb0NvbnRhaW4gPSBvcmlnaW5hbFNpemUuaGVpZ2h0IC8gY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChvcmlnaW5hbFNpemUuaGVpZ2h0LCBtaW5XaWR0aFRvQ29udGFpbiksXG4gICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChvcmlnaW5hbFNpemUud2lkdGgsIG1pbkhlaWdodFRvQ29udGFpbilcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAqIGNyb3BwZXJTZXR0aW5ncy5hc3BlY3RSYXRpbztcbiAgICAgICAgY29uc3QgbWluSGVpZ2h0VG9Db250YWluID0gb3JpZ2luYWxTaXplLndpZHRoIC8gY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHdpZHRoOiBNYXRoLm1heChvcmlnaW5hbFNpemUud2lkdGgsIG1pbldpZHRoVG9Db250YWluKSxcbiAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS5oZWlnaHQsIG1pbkhlaWdodFRvQ29udGFpbilcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FudmFzUm90YXRpb24gJSAyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsU2l6ZS53aWR0aCxcbiAgICAgICAgd2lkdGg6IG9yaWdpbmFsU2l6ZS5oZWlnaHRcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogb3JpZ2luYWxTaXplLndpZHRoLFxuICAgICAgaGVpZ2h0OiBvcmlnaW5hbFNpemUuaGVpZ2h0XG4gICAgfTtcbiAgfVxufVxuIl19
@@ -1,2 +0,0 @@
1
- export * from './index';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=