@asoftwareworld/form-builder
Version:
ASW Form Builder helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same befor
190 lines • 29.9 kB
JavaScript
/**
* @license
* Copyright ASW (A Software World) All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file
*/
import { Injectable } from '@angular/core';
import { getTransformationsFromExifData, supportsAutomaticRotation } from '../utils/exif.utils';
import * as i0 from "@angular/core";
export class LoadImageService {
autoRotateSupported = supportsAutomaticRotation();
loadImageFile(file, cropperSettings) {
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.onload = (event) => {
this.loadImage(event.target.result, file.type, cropperSettings)
.then(resolve)
.catch(reject);
};
fileReader.readAsDataURL(file);
});
}
loadImage(imageBase64, imageType, cropperSettings) {
if (!this.isValidImageType(imageType)) {
return Promise.reject(new Error('Invalid image type'));
}
return this.loadBase64Image(imageBase64, cropperSettings);
}
isValidImageType(type) {
return /image\/(png|jpg|jpeg|bmp|gif|tiff|webp|x-icon|vnd.microsoft.icon)/.test(type);
}
loadImageFromURL(url, cropperSettings) {
return new Promise((resolve, reject) => {
const img = new Image();
img.onerror = () => reject;
img.onload = () => {
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = img.width;
canvas.height = img.height;
context?.drawImage(img, 0, 0);
this.loadBase64Image(canvas.toDataURL(), cropperSettings).then(resolve);
};
img.crossOrigin = 'anonymous';
img.src = url;
});
}
loadBase64Image(imageBase64, cropperSettings) {
return new Promise((resolve, reject) => {
const originalImage = new Image();
originalImage.onload = () => resolve({
originalImage,
originalBase64: imageBase64
});
originalImage.onerror = reject;
originalImage.src = imageBase64;
}).then((res) => this.transformImageBase64(res, cropperSettings));
}
async transformImageBase64(res, cropperSettings) {
const autoRotate = await this.autoRotateSupported;
const exifTransform = await getTransformationsFromExifData(autoRotate ? -1 : res.originalBase64);
if (!res.originalImage || !res.originalImage.complete) {
return Promise.reject(new Error('No image loaded'));
}
const loadedImage = {
original: {
base64: res.originalBase64,
image: res.originalImage,
size: {
width: res.originalImage.naturalWidth,
height: res.originalImage.naturalHeight
}
},
exifTransform
};
return this.transformLoadedImage(loadedImage, cropperSettings);
}
async transformLoadedImage(loadedImage, cropperSettings) {
// tslint:disable-next-line:no-non-null-assertion
const canvasRotation = cropperSettings.canvasRotation + loadedImage.exifTransform.rotate;
const originalSize = {
// tslint:disable-next-line:no-non-null-assertion
width: loadedImage.original.image.naturalWidth,
// tslint:disable-next-line:no-non-null-assertion
height: loadedImage.original.image.naturalHeight
};
// tslint:disable-next-line:no-non-null-assertion
if (canvasRotation === 0 && !loadedImage.exifTransform.flip && !cropperSettings.containWithinAspectRatio) {
return {
original: {
// tslint:disable-next-line:no-non-null-assertion
base64: loadedImage.original.base64,
// tslint:disable-next-line:no-non-null-assertion
image: loadedImage.original.image,
size: { ...originalSize }
},
transformed: {
// tslint:disable-next-line:no-non-null-assertion
base64: loadedImage.original.base64,
// tslint:disable-next-line:no-non-null-assertion
image: loadedImage.original.image,
size: { ...originalSize }
},
// tslint:disable-next-line:no-non-null-assertion
exifTransform: loadedImage.exifTransform
};
}
// tslint:disable-next-line:no-non-null-assertion
const transformedSize = this.getTransformedSize(originalSize, loadedImage.exifTransform, cropperSettings);
const canvas = document.createElement('canvas');
canvas.width = transformedSize.width;
canvas.height = transformedSize.height;
const ctx = canvas.getContext('2d');
ctx?.setTransform(
// tslint:disable-next-line:no-non-null-assertion
loadedImage.exifTransform.flip ? -1 : 1, 0, 0, 1, canvas.width / 2, canvas.height / 2);
ctx?.rotate(Math.PI * (canvasRotation / 2));
ctx?.drawImage(
// tslint:disable-next-line:no-non-null-assertion
loadedImage.original.image, -originalSize.width / 2, -originalSize.height / 2);
const transformedBase64 = canvas.toDataURL();
const transformedImage = await this.loadImageFromBase64(transformedBase64);
return {
original: {
// tslint:disable-next-line:no-non-null-assertion
base64: loadedImage.original.base64,
// tslint:disable-next-line:no-non-null-assertion
image: loadedImage.original.image,
size: { ...originalSize }
},
transformed: {
base64: transformedBase64,
image: transformedImage,
size: {
width: transformedImage.width,
height: transformedImage.height
}
},
// tslint:disable-next-line:no-non-null-assertion
exifTransform: loadedImage.exifTransform
};
}
loadImageFromBase64(imageBase64) {
return new Promise(((resolve, reject) => {
const image = new Image();
image.onload = () => resolve(image);
image.onerror = reject;
image.src = imageBase64;
}));
}
getTransformedSize(originalSize, exifTransform, cropperSettings) {
const canvasRotation = cropperSettings.canvasRotation + exifTransform.rotate;
if (cropperSettings.containWithinAspectRatio) {
if (canvasRotation % 2) {
const minWidthToContain = originalSize.width * cropperSettings.aspectRatio;
const minHeightToContain = originalSize.height / cropperSettings.aspectRatio;
return {
width: Math.max(originalSize.height, minWidthToContain),
height: Math.max(originalSize.width, minHeightToContain)
};
}
else {
const minWidthToContain = originalSize.height * cropperSettings.aspectRatio;
const minHeightToContain = originalSize.width / cropperSettings.aspectRatio;
return {
width: Math.max(originalSize.width, minWidthToContain),
height: Math.max(originalSize.height, minHeightToContain)
};
}
}
if (canvasRotation % 2) {
return {
height: originalSize.width,
width: originalSize.height
};
}
return {
width: originalSize.width,
height: originalSize.height
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LoadImageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LoadImageService, providedIn: 'root' });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: LoadImageService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC1pbWFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvaW1hZ2UtY3JvcC9zZXJ2aWNlcy9sb2FkLWltYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFRaEcsTUFBTSxPQUFPLGdCQUFnQjtJQUVqQixtQkFBbUIsR0FBcUIseUJBQXlCLEVBQUUsQ0FBQztJQUU1RSxhQUFhLENBQUMsSUFBVSxFQUFFLGVBQWdDO1FBQ3RELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNwQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUM7cUJBQzFELElBQUksQ0FBQyxPQUFPLENBQUM7cUJBQ2IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsQ0FBQztZQUNGLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sU0FBUyxDQUFDLFdBQW1CLEVBQUUsU0FBaUIsRUFBRSxlQUFnQztRQUN0RixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixD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NUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGxpY2Vuc2VcclxuICogQ29weXJpZ2h0IEFTVyAoQSBTb2Z0d2FyZSBXb3JsZCkgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cclxuICpcclxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcclxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGltZW5zaW9ucywgTG9hZGVkSW1hZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgQ3JvcHBlclNldHRpbmdzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jcm9wcGVyLnNldHRpbmdzJztcclxuaW1wb3J0IHsgRXhpZlRyYW5zZm9ybSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZXhpZi10cmFuc2Zvcm0uaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgZ2V0VHJhbnNmb3JtYXRpb25zRnJvbUV4aWZEYXRhLCBzdXBwb3J0c0F1dG9tYXRpY1JvdGF0aW9uIH0gZnJvbSAnLi4vdXRpbHMvZXhpZi51dGlscyc7XHJcblxyXG5pbnRlcmZhY2UgTG9hZEltYWdlQmFzZTY0IHtcclxuICAgIG9yaWdpbmFsSW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQ7XHJcbiAgICBvcmlnaW5hbEJhc2U2NDogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgTG9hZEltYWdlU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBhdXRvUm90YXRlU3VwcG9ydGVkOiBQcm9taXNlPGJvb2xlYW4+ID0gc3VwcG9ydHNBdXRvbWF0aWNSb3RhdGlvbigpO1xyXG5cclxuICAgIGxvYWRJbWFnZUZpbGUoZmlsZTogRmlsZSwgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICAgICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZEltYWdlKGV2ZW50LnRhcmdldC5yZXN1bHQsIGZpbGUudHlwZSwgY3JvcHBlclNldHRpbmdzKVxyXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXHJcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKHJlamVjdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGxvYWRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nLCBpbWFnZVR5cGU6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWRJbWFnZVR5cGUoaW1hZ2VUeXBlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdJbnZhbGlkIGltYWdlIHR5cGUnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NCwgY3JvcHBlclNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzVmFsaWRJbWFnZVR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIC9pbWFnZVxcLyhwbmd8anBnfGpwZWd8Ym1wfGdpZnx0aWZmfHdlYnB8eC1pY29ufHZuZC5taWNyb3NvZnQuaWNvbikvLnRlc3QodHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEltYWdlRnJvbVVSTCh1cmw6IHN0cmluZywgY3JvcHBlclNldHRpbmdzOiBDcm9wcGVyU2V0dGluZ3MpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XHJcbiAgICAgICAgICAgIGltZy5vbmVycm9yID0gKCkgPT4gcmVqZWN0O1xyXG4gICAgICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ/LmRyYXdJbWFnZShpbWcsIDAsIDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQmFzZTY0SW1hZ2UoY2FudmFzLnRvRGF0YVVSTCgpLCBjcm9wcGVyU2V0dGluZ3MpLnRoZW4ocmVzb2x2ZSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGltZy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xyXG4gICAgICAgICAgICBpbWcuc3JjID0gdXJsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRCYXNlNjRJbWFnZShpbWFnZUJhc2U2NDogc3RyaW5nLCBjcm9wcGVyU2V0dGluZ3M6IENyb3BwZXJTZXR0aW5ncyk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8TG9hZEltYWdlQmFzZTY0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgICAgICAgb3JpZ2luYWxJbWFnZS5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSW1hZ2UsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEJhc2U2NDogaW1hZ2VCYXNlNjRcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsSW1hZ2Uub25lcnJvciA9IHJlamVjdDtcclxuICAgICAgICAgICAgb3JpZ2luYWxJbWFnZS5zcmMgPSBpbWFnZUJhc2U2NDtcclxuICAgICAgICB9KS50aGVuKChyZXM6IExvYWRJbWFnZUJhc2U2NCkgPT4gdGhpcy50cmFuc2Zvcm1JbWFnZUJhc2U2NChyZXMsIGNyb3BwZXJTZXR0aW5ncykpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgdHJhbnNmb3JtSW1hZ2VCYXNlNjQocmVzOiBMb2FkSW1hZ2VCYXNlNjQsIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dG9Sb3RhdGUgPSBhd2FpdCB0aGlzLmF1dG9Sb3RhdGVTdXBwb3J0ZWQ7XHJcbiAgICAgICAgY29uc3QgZXhpZlRyYW5zZm9ybSA9IGF3YWl0IGdldFRyYW5zZm9ybWF0aW9uc0Zyb21FeGlmRGF0YShhdXRvUm90YXRlID8gLTEgOiByZXMub3JpZ2luYWxCYXNlNjQpO1xyXG4gICAgICAgIGlmICghcmVzLm9yaWdpbmFsSW1hZ2UgfHwgIXJlcy5vcmlnaW5hbEltYWdlLmNvbXBsZXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIGltYWdlIGxvYWRlZCcpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbG9hZGVkSW1hZ2UgPSB7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XHJcbiAgICAgICAgICAgICAgICBiYXNlNjQ6IHJlcy5vcmlnaW5hbEJhc2U2NCxcclxuICAgICAgICAgICAgICAgIGltYWdlOiByZXMub3JpZ2luYWxJbWFnZSxcclxuICAgICAgICAgICAgICAgIHNpemU6IHtcclxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogcmVzLm9yaWdpbmFsSW1hZ2UubmF0dXJhbEhlaWdodFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBleGlmVHJhbnNmb3JtXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm1Mb2FkZWRJbWFnZShsb2FkZWRJbWFnZSwgY3JvcHBlclNldHRpbmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB0cmFuc2Zvcm1Mb2FkZWRJbWFnZShsb2FkZWRJbWFnZTogUGFydGlhbDxMb2FkZWRJbWFnZT4sIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLnJvdGF0ZTtcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFNpemUgPSB7XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgd2lkdGg6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5pbWFnZS5uYXR1cmFsV2lkdGgsXHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgaGVpZ2h0OiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UubmF0dXJhbEhlaWdodFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgIGlmIChjYW52YXNSb3RhdGlvbiA9PT0gMCAmJiAhbG9hZGVkSW1hZ2UuZXhpZlRyYW5zZm9ybSEuZmxpcCAmJiAhY3JvcHBlclNldHRpbmdzLmNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbykge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgYmFzZTY0OiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuYmFzZTY0LFxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxyXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHsgLi4ub3JpZ2luYWxTaXplIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZDoge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgICAgICAgICBiYXNlNjQ6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5iYXNlNjQsXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGltYWdlOiBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyAuLi5vcmlnaW5hbFNpemUgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgICAgIGV4aWZUcmFuc2Zvcm06IGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFNpemUgPSB0aGlzLmdldFRyYW5zZm9ybWVkU2l6ZShvcmlnaW5hbFNpemUsIGxvYWRlZEltYWdlLmV4aWZUcmFuc2Zvcm0hLCBjcm9wcGVyU2V0dGluZ3MpO1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICAgIGNhbnZhcy53aWR0aCA9IHRyYW5zZm9ybWVkU2l6ZS53aWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gdHJhbnNmb3JtZWRTaXplLmhlaWdodDtcclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjdHg/LnNldFRyYW5zZm9ybShcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIS5mbGlwID8gLTEgOiAxLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAwLFxyXG4gICAgICAgICAgICAxLFxyXG4gICAgICAgICAgICBjYW52YXMud2lkdGggLyAyLFxyXG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0IC8gMlxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY3R4Py5yb3RhdGUoTWF0aC5QSSAqIChjYW52YXNSb3RhdGlvbiAvIDIpKTtcclxuICAgICAgICBjdHg/LmRyYXdJbWFnZShcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICBsb2FkZWRJbWFnZS5vcmlnaW5hbCEuaW1hZ2UsXHJcbiAgICAgICAgICAgIC1vcmlnaW5hbFNpemUud2lkdGggLyAyLFxyXG4gICAgICAgICAgICAtb3JpZ2luYWxTaXplLmhlaWdodCAvIDJcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkQmFzZTY0ID0gY2FudmFzLnRvRGF0YVVSTCgpO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkSW1hZ2UgPSBhd2FpdCB0aGlzLmxvYWRJbWFnZUZyb21CYXNlNjQodHJhbnNmb3JtZWRCYXNlNjQpO1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG9yaWdpbmFsOiB7XHJcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgICAgICBiYXNlNjQ6IGxvYWRlZEltYWdlLm9yaWdpbmFsIS5iYXNlNjQsXHJcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgICAgICBpbWFnZTogbG9hZGVkSW1hZ2Uub3JpZ2luYWwhLmltYWdlLFxyXG4gICAgICAgICAgICAgICAgc2l6ZTogeyAuLi5vcmlnaW5hbFNpemUgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0cmFuc2Zvcm1lZDoge1xyXG4gICAgICAgICAgICAgICAgYmFzZTY0OiB0cmFuc2Zvcm1lZEJhc2U2NCxcclxuICAgICAgICAgICAgICAgIGltYWdlOiB0cmFuc2Zvcm1lZEltYWdlLFxyXG4gICAgICAgICAgICAgICAgc2l6ZToge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0cmFuc2Zvcm1lZEltYWdlLndpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogdHJhbnNmb3JtZWRJbWFnZS5oZWlnaHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICBleGlmVHJhbnNmb3JtOiBsb2FkZWRJbWFnZS5leGlmVHJhbnNmb3JtIVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBsb2FkSW1hZ2VGcm9tQmFzZTY0KGltYWdlQmFzZTY0OiBzdHJpbmcpOiBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD4oKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4gcmVzb2x2ZShpbWFnZSk7XHJcbiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSByZWplY3Q7XHJcbiAgICAgICAgICAgIGltYWdlLnNyYyA9IGltYWdlQmFzZTY0O1xyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFRyYW5zZm9ybWVkU2l6ZShcclxuICAgICAgICBvcmlnaW5hbFNpemU6IHsgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIgfSxcclxuICAgICAgICBleGlmVHJhbnNmb3JtOiBFeGlmVHJhbnNmb3JtLFxyXG4gICAgICAgIGNyb3BwZXJTZXR0aW5nczogQ3JvcHBlclNldHRpbmdzXHJcbiAgICApOiBEaW1lbnNpb25zIHtcclxuICAgICAgICBjb25zdCBjYW52YXNSb3RhdGlvbiA9IGNyb3BwZXJTZXR0aW5ncy5jYW52YXNSb3RhdGlvbiArIGV4aWZUcmFuc2Zvcm0ucm90YXRlO1xyXG4gICAgICAgIGlmIChjcm9wcGVyU2V0dGluZ3MuY29udGFpbldpdGhpbkFzcGVjdFJhdGlvKSB7XHJcbiAgICAgICAgICAgIGlmIChjYW52YXNSb3RhdGlvbiAlIDIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLndpZHRoICogY3JvcHBlclNldHRpbmdzLmFzcGVjdFJhdGlvO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0VG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAvIGNyb3BwZXJTZXR0aW5ncy5hc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS5oZWlnaHQsIG1pbldpZHRoVG9Db250YWluKSxcclxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluSGVpZ2h0VG9Db250YWluKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pbldpZHRoVG9Db250YWluID0gb3JpZ2luYWxTaXplLmhlaWdodCAqIGNyb3BwZXJTZXR0aW5ncy5hc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodFRvQ29udGFpbiA9IG9yaWdpbmFsU2l6ZS53aWR0aCAvIGNyb3BwZXJTZXR0aW5ncy5hc3BlY3RSYXRpbztcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgubWF4KG9yaWdpbmFsU2l6ZS53aWR0aCwgbWluV2lkdGhUb0NvbnRhaW4pLFxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogTWF0aC5tYXgob3JpZ2luYWxTaXplLmhlaWdodCwgbWluSGVpZ2h0VG9Db250YWluKVxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNhbnZhc1JvdGF0aW9uICUgMikge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBvcmlnaW5hbFNpemUud2lkdGgsXHJcbiAgICAgICAgICAgICAgICB3aWR0aDogb3JpZ2luYWxTaXplLmhlaWdodFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3aWR0aDogb3JpZ2luYWxTaXplLndpZHRoLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsU2l6ZS5oZWlnaHRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==