ngx-cropperjs-wrapper
Version:
This angular library is a wrapper of Javascript image cropper
301 lines (295 loc) • 34.3 kB
JavaScript
import { Component, EventEmitter, Input, Output, forwardRef, NgModule } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import Cropper from 'cropperjs';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class CropperComponent {
constructor() {
this.crop = new EventEmitter();
this.cropMove = new EventEmitter();
this.cropStart = new EventEmitter();
this.cropEnd = new EventEmitter();
this.ready = new EventEmitter();
this.zoom = new EventEmitter();
this.init = new EventEmitter();
this.fail = new EventEmitter();
this.fileChange = new EventEmitter();
this.options = /** @type {?} */ ({});
this.data = /** @type {?} */ ({});
this.propagateChange = (value) => value;
}
/**
* @return {?}
*/
get imageFile() {
return this.originalFile;
}
/**
* @param {?} value
* @return {?}
*/
set imageFile(value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
if (['image/gif', 'image/jpeg', 'image/png'].indexOf(value.type) === -1) {
this.fail.emit(new Error('Invalid input file type'));
return;
}
/** @type {?} */
const reader = new FileReader();
reader.onload = () => {
this.dataUrl = reader.result;
};
this.originalFile = value;
reader.readAsDataURL(this.originalFile);
}
/**
* @param {?} value
* @return {?}
*/
set imageUrl(value) {
delete this.dataUrl;
this.destroyCropperIfExists();
if (!value) {
return;
}
this.dataUrl = value;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.data = value;
if (this.data && this.cropper) {
this.cropper.setData(this.data);
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.propagateChange = fn;
}
/**
* @return {?}
*/
registerOnTouched() { }
/**
* @return {?}
*/
ngOnDestroy() {
this.destroyCropperIfExists();
}
/**
* @param {?} event
* @return {?}
*/
onImageLoad(event) {
/** @type {?} */
const img = /** @type {?} */ (event.target);
this.destroyCropperIfExists();
if ((this.options.minCropWidth && img.naturalWidth < this.options.minCropWidth)
|| (this.options.minCropHeight && img.naturalHeight < this.options.minCropHeight)) {
delete this.dataUrl;
this.fail.emit(new Error('Input image is too small'));
return;
}
this.isReady = false;
this.cropper = new Cropper(img, Object.assign({
crop: this.onCrop.bind(this),
cropmove: this.onCropMove.bind(this),
cropstart: this.onCropStart.bind(this),
cropend: this.onCropEnd.bind(this),
ready: this.onReady.bind(this),
zoom: this.onZoom.bind(this),
}, this.options));
this.init.emit(this.cropper);
}
/**
* @param {?} event
* @return {?}
*/
onCrop(event) {
if (this.options.viewMode !== 0) {
this.correctCropArea();
}
if (this.isReady) {
this.update();
}
this.crop.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropMove(event) {
if (this.options.viewMode === 0) {
this.correctCropArea();
}
this.update();
this.cropMove.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropStart(event) {
this.update();
this.cropStart.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onCropEnd(event) {
this.correctCropArea();
this.updateFile();
this.update();
this.cropEnd.emit(event);
}
/**
* @param {?} event
* @return {?}
*/
onReady(event) {
if (this.data) {
this.cropper.setData(this.data);
this.correctCropArea();
}
else {
this.correctCropArea();
this.update();
}
this.isReady = true;
this.ready.emit(event);
this.updateFile();
}
/**
* @param {?} event
* @return {?}
*/
onZoom(event) {
this.update();
this.zoom.emit(event);
}
/**
* @return {?}
*/
updateFile() {
/** @type {?} */
let name = 'cropped_file';
if (typeof this.dataUrl === 'string') {
/** @type {?} */
const urlParams = this.dataUrl.split('/');
name = urlParams[urlParams.length - 1];
}
/** @type {?} */
const mimeType = (this.options.outputOptions && this.options.outputOptions.mimeType) || 'image/png';
/** @type {?} */
const qualityArgument = (this.options.outputOptions && this.options.outputOptions.qualityArgument) || 0.9;
this.cropper.getCroppedCanvas().toBlob((blob) => {
blob.lastModifiedDate = new Date();
blob.name = this.originalFile ? this.originalFile.name : name;
this.fileChange.emit(blob);
}, mimeType, qualityArgument);
}
/**
* @return {?}
*/
correctCropArea() {
/** @type {?} */
const data = this.cropper.getData();
if (data.height < this.options.minCropHeight || data.width < this.options.minCropWidth) {
data.width = Math.max(data.width, this.options.minCropWidth || 0);
data.height = Math.max(data.height, this.options.minCropHeight || 0);
this.cropper.setData(data);
}
}
/**
* @return {?}
*/
update() {
this.data = this.cropper.getData();
this.propagateChange(this.data);
}
/**
* @return {?}
*/
destroyCropperIfExists() {
if (!this.cropper) {
return;
}
this.cropper.destroy();
delete this.cropper;
}
}
CropperComponent.decorators = [
{ type: Component, args: [{
selector: 'lib-cropper',
template: `<div class="cropper-component" *ngIf="dataUrl">
<img #image alt="image" [src]="dataUrl" (load)="onImageLoad($event)"/>
</div>
`,
styles: [`.cropper-component img{max-width:100%;max-height:100%}::ng-deep{/*!
* Cropper.js v1.4.0
* https://fengyuanchen.github.io/cropperjs
*
* Copyright 2015-present Chen Fengyuan
* Released under the MIT license
*
* Date: 2018-06-01T15:18:09.891Z
*/}::ng-deep .cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}::ng-deep .cropper-container img{display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}::ng-deep .cropper-canvas,::ng-deep .cropper-crop-box,::ng-deep .cropper-drag-box,::ng-deep .cropper-modal,::ng-deep .cropper-wrap-box{bottom:0;left:0;position:absolute;right:0;top:0}::ng-deep .cropper-canvas,::ng-deep .cropper-wrap-box{overflow:hidden}::ng-deep .cropper-drag-box{background-color:#fff;opacity:0}::ng-deep .cropper-modal{background-color:#000;opacity:.5}::ng-deep .cropper-view-box{display:block;height:100%;outline:#eee solid 1px;overflow:hidden;width:100%}::ng-deep .cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}::ng-deep .cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:33.33333%;left:0;top:33.33333%;width:100%}::ng-deep .cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:33.33333%;top:0;width:33.33333%}::ng-deep .cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}::ng-deep .cropper-center:after,::ng-deep .cropper-center:before{background-color:#eee;content:' ';display:block;position:absolute}::ng-deep .cropper-center:before{height:1px;left:-3px;top:0;width:7px}::ng-deep .cropper-center:after{height:7px;left:0;top:-3px;width:1px}::ng-deep .cropper-face,::ng-deep .cropper-line,::ng-deep .cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}::ng-deep .cropper-face{background-color:#fff;left:0;top:0}::ng-deep .cropper-line{background-color:#39f}::ng-deep .cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}::ng-deep .cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}::ng-deep .cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}::ng-deep .cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}::ng-deep .cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}::ng-deep .cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}::ng-deep .cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}::ng-deep .cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}::ng-deep .cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}::ng-deep .cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}::ng-deep .cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}::ng-deep .cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}::ng-deep .cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px} (min-width:768px){::ng-deep .cropper-point.point-se{height:15px;width:15px}} (min-width:992px){::ng-deep .cropper-point.point-se{height:10px;width:10px}} (min-width:1200px){::ng-deep .cropper-point.point-se{height:5px;opacity:.75;width:5px}}::ng-deep .cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:' ';display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}::ng-deep .cropper-invisible{opacity:0}::ng-deep .cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}::ng-deep .cropper-hide{display:block;height:0;position:absolute;width:0}::ng-deep .cropper-hidden{display:none!important}::ng-deep .cropper-move{cursor:move}::ng-deep .cropper-crop{cursor:crosshair}::ng-deep .cropper-disabled .cropper-drag-box,::ng-deep .cropper-disabled .cropper-face,::ng-deep .cropper-disabled .cropper-line,::ng-deep .cropper-disabled .cropper-point{cursor:not-allowed}::ng-deep .cropper-line,::ng-deep .cropper-point,::ng-deep .cropper-point.point-se::before{background-color:#eee}`],
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CropperComponent),
multi: true
}
],
},] },
];
CropperComponent.propDecorators = {
crop: [{ type: Output }],
cropMove: [{ type: Output }],
cropStart: [{ type: Output }],
cropEnd: [{ type: Output }],
ready: [{ type: Output }],
zoom: [{ type: Output }],
init: [{ type: Output }],
fail: [{ type: Output }],
fileChange: [{ type: Output }],
options: [{ type: Input }],
imageFile: [{ type: Input, args: ['imageFile',] }],
imageUrl: [{ type: Input, args: ['imageUrl',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
class NgxCropperJsModule {
}
NgxCropperJsModule.decorators = [
{ type: NgModule, args: [{
imports: [CommonModule],
declarations: [CropperComponent],
exports: [CropperComponent]
},] },
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { CropperComponent, NgxCropperJsModule };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWNyb3BwZXJqcy13cmFwcGVyLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZ3gtY3JvcHBlcmpzLXdyYXBwZXIvbGliL2Nyb3BwZXIvY3JvcHBlci5jb21wb25lbnQudHMiLCJuZzovL25neC1jcm9wcGVyanMtd3JhcHBlci9saWIvbmd4LWNyb3BwZXItanMubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCBDcm9wcGVyIGZyb20gJ2Nyb3BwZXJqcyc7XG5pbXBvcnQgeyBTYWZlVXJsIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JvcHBlck91dHB1dE9wdGlvbnMge1xuICBtaW1lVHlwZTogc3RyaW5nO1xuICBxdWFsaXR5QXJndW1lbnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcm9wcGVyT3B0aW9ucyBleHRlbmRzIENyb3BwZXIuT3B0aW9ucyB7XG4gIG1pbkNyb3BXaWR0aDogbnVtYmVyO1xuICBtaW5Dcm9wSGVpZ2h0OiBudW1iZXI7XG4gIG91dHB1dE9wdGlvbnM6IENyb3BwZXJPdXRwdXRPcHRpb25zO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItY3JvcHBlcicsXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNyb3BwZXItY29tcG9uZW50XCIgKm5nSWY9XCJkYXRhVXJsXCI+XG4gIDxpbWcgI2ltYWdlIGFsdD1cImltYWdlXCIgW3NyY109XCJkYXRhVXJsXCIgKGxvYWQpPVwib25JbWFnZUxvYWQoJGV2ZW50KVwiLz5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYC5jcm9wcGVyLWNvbXBvbmVudCBpbWd7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfTo6bmctZGVlcHsvKiFcbiAqIENyb3BwZXIuanMgdjEuNC4wXG4gKiBodHRwczovL2Zlbmd5dWFuY2hlbi5naXRodWIuaW8vY3JvcHBlcmpzXG4gKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCBDaGVuIEZlbmd5dWFuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTA2LTAxVDE1OjE4OjA5Ljg5MVpcbiAqL306Om5nLWRlZXAgLmNyb3BwZXItY29udGFpbmVye2RpcmVjdGlvbjpsdHI7Zm9udC1zaXplOjA7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTt0b3VjaC1hY3Rpb246bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmV9OjpuZy1kZWVwIC5jcm9wcGVyLWNvbnRhaW5lciBpbWd7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtpbWFnZS1vcmllbnRhdGlvbjowZGVnO21heC1oZWlnaHQ6bm9uZSFpbXBvcnRhbnQ7bWF4LXdpZHRoOm5vbmUhaW1wb3J0YW50O21pbi1oZWlnaHQ6MCFpbXBvcnRhbnQ7bWluLXdpZHRoOjAhaW1wb3J0YW50O3dpZHRoOjEwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItY3JvcC1ib3gsOjpuZy1kZWVwIC5jcm9wcGVyLWRyYWctYm94LDo6bmctZGVlcCAuY3JvcHBlci1tb2RhbCw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7Ym90dG9tOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNhbnZhcyw6Om5nLWRlZXAgLmNyb3BwZXItd3JhcC1ib3h7b3ZlcmZsb3c6aGlkZGVufTo6bmctZGVlcCAuY3JvcHBlci1kcmFnLWJveHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7b3BhY2l0eTowfTo6bmctZGVlcCAuY3JvcHBlci1tb2RhbHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDA7b3BhY2l0eTouNX06Om5nLWRlZXAgLmNyb3BwZXItdmlldy1ib3h7ZGlzcGxheTpibG9jaztoZWlnaHQ6MTAwJTtvdXRsaW5lOiNlZWUgc29saWQgMXB4O292ZXJmbG93OmhpZGRlbjt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWR7Ym9yZGVyOjAgZGFzaGVkICNlZWU7ZGlzcGxheTpibG9jaztvcGFjaXR5Oi41O3Bvc2l0aW9uOmFic29sdXRlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLWh7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHg7Ym9yZGVyLXRvcC13aWR0aDoxcHg7aGVpZ2h0OjMzLjMzMzMzJTtsZWZ0OjA7dG9wOjMzLjMzMzMzJTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1kYXNoZWQuZGFzaGVkLXZ7Ym9yZGVyLWxlZnQtd2lkdGg6MXB4O2JvcmRlci1yaWdodC13aWR0aDoxcHg7aGVpZ2h0OjEwMCU7bGVmdDozMy4zMzMzMyU7dG9wOjA7d2lkdGg6MzMuMzMzMzMlfTo6bmctZGVlcCAuY3JvcHBlci1jZW50ZXJ7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtsZWZ0OjUwJTtvcGFjaXR5Oi43NTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO3dpZHRoOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlciw6Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWU7Y29udGVudDonICc7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZX06Om5nLWRlZXAgLmNyb3BwZXItY2VudGVyOmJlZm9yZXtoZWlnaHQ6MXB4O2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo3cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWNlbnRlcjphZnRlcntoZWlnaHQ6N3B4O2xlZnQ6MDt0b3A6LTNweDt3aWR0aDoxcHh9OjpuZy1kZWVwIC5jcm9wcGVyLWZhY2UsOjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUsOjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCU7b3BhY2l0eTouMTtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlfTo6bmctZGVlcCAuY3JvcHBlci1mYWNle2JhY2tncm91bmQtY29sb3I6I2ZmZjtsZWZ0OjA7dG9wOjB9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmV7YmFja2dyb3VuZC1jb2xvcjojMzlmfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtZXtjdXJzb3I6ZXctcmVzaXplO3JpZ2h0Oi0zcHg7dG9wOjA7d2lkdGg6NXB4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtbntjdXJzb3I6bnMtcmVzaXplO2hlaWdodDo1cHg7bGVmdDowO3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1saW5lLmxpbmUtd3tjdXJzb3I6ZXctcmVzaXplO2xlZnQ6LTNweDt0b3A6MDt3aWR0aDo1cHh9OjpuZy1kZWVwIC5jcm9wcGVyLWxpbmUubGluZS1ze2JvdHRvbTotM3B4O2N1cnNvcjpucy1yZXNpemU7aGVpZ2h0OjVweDtsZWZ0OjB9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50e2JhY2tncm91bmQtY29sb3I6IzM5ZjtoZWlnaHQ6NXB4O29wYWNpdHk6Ljc1O3dpZHRoOjVweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtZXtjdXJzb3I6ZXctcmVzaXplO21hcmdpbi10b3A6LTNweDtyaWdodDotM3B4O3RvcDo1MCV9OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LW57Y3Vyc29yOm5zLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4O3RvcDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC13e2N1cnNvcjpldy1yZXNpemU7bGVmdDotM3B4O21hcmdpbi10b3A6LTNweDt0b3A6NTAlfTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1ze2JvdHRvbTotM3B4O2N1cnNvcjpzLXJlc2l6ZTtsZWZ0OjUwJTttYXJnaW4tbGVmdDotM3B4fTo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1uZXtjdXJzb3I6bmVzdy1yZXNpemU7cmlnaHQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtbnd7Y3Vyc29yOm53c2UtcmVzaXplO2xlZnQ6LTNweDt0b3A6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc3d7Ym90dG9tOi0zcHg7Y3Vyc29yOm5lc3ctcmVzaXplO2xlZnQ6LTNweH06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2V7Ym90dG9tOi0zcHg7Y3Vyc29yOm53c2UtcmVzaXplO2hlaWdodDoyMHB4O29wYWNpdHk6MTtyaWdodDotM3B4O3dpZHRoOjIwcHh9QG1lZGlhIChtaW4td2lkdGg6NzY4cHgpezo6bmctZGVlcCAuY3JvcHBlci1wb2ludC5wb2ludC1zZXtoZWlnaHQ6MTVweDt3aWR0aDoxNXB4fX1AbWVkaWEgKG1pbi13aWR0aDo5OTJweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDoxMHB4O3dpZHRoOjEwcHh9fUBtZWRpYSAobWluLXdpZHRoOjEyMDBweCl7OjpuZy1kZWVwIC5jcm9wcGVyLXBvaW50LnBvaW50LXNle2hlaWdodDo1cHg7b3BhY2l0eTouNzU7d2lkdGg6NXB4fX06Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6IzM5Zjtib3R0b206LTUwJTtjb250ZW50OicgJztkaXNwbGF5OmJsb2NrO2hlaWdodDoyMDAlO29wYWNpdHk6MDtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNTAlO3dpZHRoOjIwMCV9OjpuZy1kZWVwIC5jcm9wcGVyLWludmlzaWJsZXtvcGFjaXR5OjB9OjpuZy1kZWVwIC5jcm9wcGVyLWJne2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUFRTUFBQUFsUFcwaUFBQUFBM05DU1ZRSUNBamI0VS9nQUFBQUJsQk1WRVhNek16Ly8vL1RqUlYyQUFBQUNYQklXWE1BQUFyckFBQUs2d0dDaXcxYUFBQUFISFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JHYVhKbGQyOXlhM01nUTFNMjZMeXlqQUFBQUJGSlJFRlVDSmxqK00vQWdCVmhGLzBQQUg2L0QvSGtEeE9HQUFBQUFFbEZUa1N1UW1DQyl9OjpuZy1kZWVwIC5jcm9wcGVyLWhpZGV7ZGlzcGxheTpibG9jaztoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDowfTo6bmctZGVlcCAuY3JvcHBlci1oaWRkZW57ZGlzcGxheTpub25lIWltcG9ydGFudH06Om5nLWRlZXAgLmNyb3BwZXItbW92ZXtjdXJzb3I6bW92ZX06Om5nLWRlZXAgLmNyb3BwZXItY3JvcHtjdXJzb3I6Y3Jvc3NoYWlyfTo6bmctZGVlcCAuY3JvcHBlci1kaXNhYmxlZCAuY3JvcHBlci1kcmFnLWJveCw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItZmFjZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItbGluZSw6Om5nLWRlZXAgLmNyb3BwZXItZGlzYWJsZWQgLmNyb3BwZXItcG9pbnR7Y3Vyc29yOm5vdC1hbGxvd2VkfTo6bmctZGVlcCAuY3JvcHBlci1saW5lLDo6bmctZGVlcCAuY3JvcHBlci1wb2ludCw6Om5nLWRlZXAgLmNyb3BwZXItcG9pbnQucG9pbnQtc2U6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9YF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ3JvcHBlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ3JvcHBlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBPdXRwdXQoKSBjcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIGNyb3BTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcm9wRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4oKTtcbiAgQE91dHB1dCgpIHpvb20gPSBuZXcgRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PigpO1xuICBAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXI8Q3JvcHBlcj4oKTtcbiAgQE91dHB1dCgpIGZhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPEVycm9yPigpO1xuICBAT3V0cHV0KCkgZmlsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcblxuICBASW5wdXQoKSBvcHRpb25zID0ge30gYXMgQ3JvcHBlck9wdGlvbnM7XG5cbiAgZ2V0IGltYWdlRmlsZSgpOiBGaWxlIHtcbiAgICByZXR1cm4gdGhpcy5vcmlnaW5hbEZpbGU7XG4gIH1cblxuICBASW5wdXQoJ2ltYWdlRmlsZScpIHNldCBpbWFnZUZpbGUodmFsdWU6IEZpbGUpIHtcbiAgICBkZWxldGUgdGhpcy5kYXRhVXJsO1xuICAgIHRoaXMuZGVzdHJveUNyb3BwZXJJZkV4aXN0cygpO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChbJ2ltYWdlL2dpZicsICdpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZyddLmluZGV4T2YodmFsdWUudHlwZSkgPT09IC0xKSB7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgZmlsZSB0eXBlJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgIHRoaXMuZGF0YVVybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgfTtcblxuICAgIHRoaXMub3JpZ2luYWxGaWxlID0gdmFsdWU7XG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwodGhpcy5vcmlnaW5hbEZpbGUpO1xuICB9XG5cbiAgQElucHV0KCdpbWFnZVVybCcpIHNldCBpbWFnZVVybCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgZGVsZXRlIHRoaXMuZGF0YVVybDtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGFVcmwgPSB2YWx1ZTtcbiAgfVxuXG4gIGRhdGFVcmw6IHN0cmluZ3xTYWZlVXJsO1xuICBwcml2YXRlIGNyb3BwZXI6IENyb3BwZXI7XG4gIHByaXZhdGUgaXNSZWFkeTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBvcmlnaW5hbEZpbGU6IEZpbGU7XG4gIHByaXZhdGUgZGF0YSA9IHt9IGFzIENyb3BwZXIuU2V0RGF0YU9wdGlvbnM7XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSA9PiB2YWx1ZTtcblxuICB3cml0ZVZhbHVlKHZhbHVlOiBDcm9wcGVyLlNldERhdGFPcHRpb25zKSB7XG4gICAgdGhpcy5kYXRhID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuY3JvcHBlcikge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKCkge31cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKTtcbiAgfVxuXG4gIG9uSW1hZ2VMb2FkKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGltZyA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuXG4gICAgdGhpcy5kZXN0cm95Q3JvcHBlcklmRXhpc3RzKCk7XG5cbiAgICBpZiAoKHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGggJiYgaW1nLm5hdHVyYWxXaWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpXG4gICAgICB8fCAodGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgJiYgaW1nLm5hdHVyYWxIZWlnaHQgPCB0aGlzLm9wdGlvbnMubWluQ3JvcEhlaWdodCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmRhdGFVcmw7XG4gICAgICB0aGlzLmZhaWwuZW1pdChuZXcgRXJyb3IoJ0lucHV0IGltYWdlIGlzIHRvbyBzbWFsbCcpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmNyb3BwZXIgPSBuZXcgQ3JvcHBlcihpbWcsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgY3JvcDogdGhpcy5vbkNyb3AuYmluZCh0aGlzKSxcbiAgICAgIGNyb3Btb3ZlOiB0aGlzLm9uQ3JvcE1vdmUuYmluZCh0aGlzKSxcbiAgICAgIGNyb3BzdGFydDogdGhpcy5vbkNyb3BTdGFydC5iaW5kKHRoaXMpLFxuICAgICAgY3JvcGVuZDogdGhpcy5vbkNyb3BFbmQuYmluZCh0aGlzKSxcbiAgICAgIHJlYWR5OiB0aGlzLm9uUmVhZHkuYmluZCh0aGlzKSxcbiAgICAgIHpvb206IHRoaXMub25ab29tLmJpbmQodGhpcyksXG4gICAgfSwgdGhpcy5vcHRpb25zKSk7XG5cbiAgICB0aGlzLmluaXQuZW1pdCh0aGlzLmNyb3BwZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkNyb3AoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy52aWV3TW9kZSAhPT0gMCkge1xuICAgICAgdGhpcy5jb3JyZWN0Q3JvcEFyZWEoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1JlYWR5KSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuY3JvcC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wTW92ZShldmVudDogQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSAwKSB7XG4gICAgICB0aGlzLmNvcnJlY3RDcm9wQXJlYSgpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy5jcm9wTW92ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wU3RhcnQoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BTdGFydC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Dcm9wRW5kKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgdGhpcy51cGRhdGVGaWxlKCk7XG4gICAgdGhpcy51cGRhdGUoKTtcbiAgICB0aGlzLmNyb3BFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVhZHkoZXZlbnQ6IEN1c3RvbUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgdGhpcy5jcm9wcGVyLnNldERhdGEodGhpcy5kYXRhKTtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ycmVjdENyb3BBcmVhKCk7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXNSZWFkeSA9IHRydWU7XG4gICAgdGhpcy5yZWFkeS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnVwZGF0ZUZpbGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25ab29tKGV2ZW50OiBDdXN0b21FdmVudCkge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgdGhpcy56b29tLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWxlKCkge1xuICAgIGxldCBuYW1lID0gJ2Nyb3BwZWRfZmlsZSc7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuZGF0YVVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZGF0YVVybC5zcGxpdCgnLycpO1xuICAgICAgbmFtZSA9IHVybFBhcmFtc1t1cmxQYXJhbXMubGVuZ3RoIC0gMV07XG4gICAgfVxuXG5cbiAgICBjb25zdCBtaW1lVHlwZSA9ICh0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMub3V0cHV0T3B0aW9ucy5taW1lVHlwZSkgfHwgJ2ltYWdlL3BuZyc7XG4gICAgY29uc3QgcXVhbGl0eUFyZ3VtZW50ID0gKHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zICYmIHRoaXMub3B0aW9ucy5vdXRwdXRPcHRpb25zLnF1YWxpdHlBcmd1bWVudCkgfHwgMC45O1xuXG4gICAgdGhpcy5jcm9wcGVyLmdldENyb3BwZWRDYW52YXMoKS50b0Jsb2IoKGJsb2I6IGFueSkgPT4ge1xuICAgICAgYmxvYi5sYXN0TW9kaWZpZWREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgIGJsb2IubmFtZSA9IHRoaXMub3JpZ2luYWxGaWxlID8gdGhpcy5vcmlnaW5hbEZpbGUubmFtZSA6IG5hbWU7XG4gICAgICB0aGlzLmZpbGVDaGFuZ2UuZW1pdChibG9iKTtcbiAgICB9LCBtaW1lVHlwZSwgcXVhbGl0eUFyZ3VtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY29ycmVjdENyb3BBcmVhKCkge1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuXG4gICAgaWYgKGRhdGEuaGVpZ2h0IDwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgZGF0YS53aWR0aCA8IHRoaXMub3B0aW9ucy5taW5Dcm9wV2lkdGgpIHtcbiAgICAgIGRhdGEud2lkdGggPSBNYXRoLm1heChkYXRhLndpZHRoLCB0aGlzLm9wdGlvbnMubWluQ3JvcFdpZHRoIHx8IDApO1xuICAgICAgZGF0YS5oZWlnaHQgPSBNYXRoLm1heChkYXRhLmhlaWdodCwgdGhpcy5vcHRpb25zLm1pbkNyb3BIZWlnaHQgfHwgMCk7XG4gICAgICB0aGlzLmNyb3BwZXIuc2V0RGF0YShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZSgpIHtcbiAgICB0aGlzLmRhdGEgPSB0aGlzLmNyb3BwZXIuZ2V0RGF0YSgpO1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMuZGF0YSk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lDcm9wcGVySWZFeGlzdHMoKSB7XG4gICAgaWYgKCF0aGlzLmNyb3BwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNyb3BwZXIuZGVzdHJveSgpO1xuICAgIGRlbGV0ZSB0aGlzLmNyb3BwZXI7XG4gIH1cblxufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuL2Nyb3BwZXIvY3JvcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogW0Nyb3BwZXJDb21wb25lbnRdLFxuICBleHBvcnRzOiBbQ3JvcHBlckNvbXBvbmVudF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4Q3JvcHBlckpzTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztvQkF5Q21CLElBQUksWUFBWSxFQUFlO3dCQUMzQixJQUFJLFlBQVksRUFBZTt5QkFDOUIsSUFBSSxZQUFZLEVBQWU7dUJBQ2pDLElBQUksWUFBWSxFQUFlO3FCQUNqQyxJQUFJLFlBQVksRUFBZTtvQkFDaEMsSUFBSSxZQUFZLEVBQWU7b0JBQy9CLElBQUksWUFBWSxFQUFXO29CQUMzQixJQUFJLFlBQVksRUFBUzswQkFDbkIsSUFBSSxZQUFZLEVBQVE7eUNBRTVCLEVBQW9CO3NDQTJDeEIsRUFBNEI7K0JBRXpCLENBQUMsS0FBNkIsS0FBSyxLQUFLOzs7OztJQTNDMUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0tBQzFCOzs7OztJQUVELElBQXdCLFNBQVMsQ0FBQyxLQUFXO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7WUFDckQsT0FBTztTQUNSOztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLE1BQU0sR0FBRztZQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztTQUM5QixDQUFDO1FBRUYsSUFBSSxDQUFD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