UNPKG

ng-yunzai-mobile

Version:

1. 适配yunzai_uni_app_x

360 lines 28.6 kB
/** * @fileoverview added by tsickle * Generated from: img-cropper/yz-img-cropper/yz-img-cropper.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { ToastService } from "ng-zorro-antd-mobile"; import imageCompression from "browser-image-compression"; var YzImgCropperComponent = /** @class */ (function () { function YzImgCropperComponent(dialogRef, _toast, data) { this.dialogRef = dialogRef; this._toast = _toast; this.data = data; this.cropperStyle = { height: window.innerHeight - 142 + 'px', width: '100%', padding: 0, display: 'flex', 'align-items': 'center', 'justify-content': 'center', 'align-content': 'center', 'flex-wrap': 'wrap' }; this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = null; this.croppedImage = null; this.showImg = false; this.imgInfo = { width: 0, height: 0 }; this.canvasRotation = 0; this.transform = {}; this.scale = 1; // 图片压缩进度 this.percent = 0; } /** * @return {?} */ YzImgCropperComponent.prototype.ngOnInit = /** * @return {?} */ function () { if (this.data.imgFile) { this.fileChangeEvent(this.data.imgFile); } else { this._toast.info('请选择上传图片!'); } }; /** * @param {?} event * @return {?} */ YzImgCropperComponent.prototype.fileChangeEvent = /** * @param {?} event * @return {?} */ function (event) { if (this.data.fileType == 'FileEvent' || !this.data.fileType) { this.imageChangedEvent = event; this.imageBase64 = null; this.imageBlobFile = null; } else if (this.data.fileType == 'Base64') { this.imageChangedEvent = null; this.imageBase64 = event; this.imageBlobFile = null; } else if (this.data.fileType == 'BlobFile') { this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = event; } }; // 每次裁剪图像时发出 // 每次裁剪图像时发出 /** * @param {?} event * @return {?} */ YzImgCropperComponent.prototype.imageCropped = // 每次裁剪图像时发出 /** * @param {?} event * @return {?} */ function (event) { this.croppedImage = event.base64; this.imgInfo = event; }; // 选择错误的文件类型时发出(仅允许png、gif和jpg) // 选择错误的文件类型时发出(仅允许png、gif和jpg) /** * @return {?} */ YzImgCropperComponent.prototype.loadImageFailed = // 选择错误的文件类型时发出(仅允许png、gif和jpg) /** * @return {?} */ function () { this._toast.info("\u56FE\u7247\u9009\u62E9\u5931\u8D25\uFF01"); }; // 还原图片大小 // 还原图片大小 /** * @return {?} */ YzImgCropperComponent.prototype.resetImage = // 还原图片大小 /** * @return {?} */ function () { this.scale = 1; this.canvasRotation = 0; this.transform = {}; }; // 取消裁剪 // 取消裁剪 /** * @return {?} */ YzImgCropperComponent.prototype.cancelCropper = // 取消裁剪 /** * @return {?} */ function () { this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = null; this.croppedImage = null; this.showImg = false; this.percent = 0; this.imgInfo = { width: 0, height: 0 }; this.dialogRef.close(); this.resetImage(); }; // 裁剪完毕=>压缩图片 // 裁剪完毕=>压缩图片 /** * @return {?} */ YzImgCropperComponent.prototype.confirmCropper = // 裁剪完毕=>压缩图片 /** * @return {?} */ function () { if (!this.croppedImage) return; this.dataURLtoFile(this.croppedImage, 'img_name'); }; /** * @param {?} dataurl * @param {?} filename * @return {?} */ YzImgCropperComponent.prototype.dataURLtoFile = /** * @param {?} dataurl * @param {?} filename * @return {?} */ function (dataurl, filename) { /** @type {?} */ var arr = dataurl.split(','); /** @type {?} */ var mime = arr[0].match(/:(.*?);/)[1]; /** @type {?} */ var bstr = atob(arr[1]); /** @type {?} */ var n = bstr.length; /** @type {?} */ var u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } /** @type {?} */ var file = new File([u8arr], filename, { type: mime }); this.compressImage(file); }; // 图片压缩 https://www.npmjs.com/package/browser-image-compression // 图片压缩 https://www.npmjs.com/package/browser-image-compression /** * @param {?} imageFile * @return {?} */ YzImgCropperComponent.prototype.compressImage = // 图片压缩 https://www.npmjs.com/package/browser-image-compression /** * @param {?} imageFile * @return {?} */ function (imageFile) { return tslib_1.__awaiter(this, void 0, void 0, function () { var options, compressedFile, error_1; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: options = { maxSizeMB: this.data.maxSizeMB, maxWidthOrHeight: this.data.maxWidthOrHeight, fileType: "image/" + this.data.format, useWebWorker: true, onProgress: (/** * @param {?} res * @return {?} */ function (res) { _this.percent = res; }) }; _a.label = 1; case 1: _a.trys.push([1, 3, , 4]); return [4 /*yield*/, imageCompression(imageFile, options)]; case 2: compressedFile = _a.sent(); this.blobToBase64(compressedFile, (/** * @param {?} dataurl * @return {?} */ function (dataurl) { _this.dialogRef.close(dataurl); })); this.cancelCropper(); return [3 /*break*/, 4]; case 3: error_1 = _a.sent(); console.error('图片压缩失败!'); return [3 /*break*/, 4]; case 4: return [2 /*return*/]; } }); }); }; /** * @param {?} blob * @param {?} callback * @return {?} */ YzImgCropperComponent.prototype.blobToBase64 = /** * @param {?} blob * @param {?} callback * @return {?} */ function (blob, callback) { /** @type {?} */ var fileReader = new FileReader(); fileReader.onload = (/** * @param {?} e * @return {?} */ function (e) { callback(e.target['result']); }); fileReader.readAsDataURL(blob); }; YzImgCropperComponent.decorators = [ { type: Component, args: [{ selector: 'yz-img-cropper', template: "<yz-loading-mask *ngIf=\"percent>0 && percent<100\"></yz-loading-mask>\r\n<div class=\"yz-img-cropper\">\r\n\r\n <image-cropper\r\n *ngIf=\"!showImg\"\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"imageBase64\"\r\n [imageFile]=\"imageBlobFile\"\r\n [containWithinAspectRatio]=\"data.containWithinAspectRatio\"\r\n [maintainAspectRatio]=\"true\"\r\n [format]=\"data.format\"\r\n [onlyScaleDown]=\"true\"\r\n [aspectRatio]=\"data.aspectRatio\"\r\n [imageQuality]=\"data.imageQuality\"\r\n [transform]=\"transform\"\r\n [canvasRotation]=\"canvasRotation\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n [ngStyle]=\"cropperStyle\"\r\n ></image-cropper>\r\n\r\n <!-- \u88C1\u526A\u540E\u7684\u56FE\u7247-->\r\n <div *ngIf=\"showImg\" class=\"yz-img-cropper-img\" [ngStyle]=\"cropperStyle\">\r\n <img [src]=\"croppedImage\"/>\r\n <b>\u50CF\u7D20\uFF1A{{imgInfo.width}}*{{imgInfo.height}}</b>\r\n </div>\r\n\r\n <div class=\"yz-img-cropper-btn\">\r\n <div Button [type]=\"'primary'\" *ngIf=\"!showImg\" (onClick)=\"showImg=true\">\u786E\u5B9A</div>\r\n <!--\u53D6\u6D88\u88C1\u526A-->\r\n <div Button *ngIf=\"!showImg\" (onClick)=\"cancelCropper()\">\u53D6\u6D88</div>\r\n\r\n <div Button [type]=\"'primary'\" *ngIf=\"showImg\" (onClick)=\"confirmCropper()\">\u5B8C\u6210</div>\r\n <!-- \u91CD\u65B0\u88C1\u526A-->\r\n <div Button *ngIf=\"showImg\" (onClick)=\"showImg=false\">\u53D6\u6D88</div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["::ng-deep .yz-img-cropper-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-img-cropper-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}::ng-deep .yz-img-cropper-btn{margin:16px}::ng-deep .yz-img-cropper-btn .am-button{margin-bottom:16px}.yz-img-cropper-img{width:100%;background:#fff}.yz-img-cropper-img img{display:block;max-width:100%;margin:0 auto 16px}.yz-img-cropper-img b{font-size:16px;text-align:center;display:block}"] }] } ]; /** @nocollapse */ YzImgCropperComponent.ctorParameters = function () { return [ { type: MatDialogRef }, { type: ToastService }, { type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] } ]; }; return YzImgCropperComponent; }()); export { YzImgCropperComponent }; if (false) { /** @type {?} */ YzImgCropperComponent.prototype.cropperStyle; /** @type {?} */ YzImgCropperComponent.prototype.imageChangedEvent; /** @type {?} */ YzImgCropperComponent.prototype.imageBase64; /** @type {?} */ YzImgCropperComponent.prototype.imageBlobFile; /** @type {?} */ YzImgCropperComponent.prototype.croppedImage; /** @type {?} */ YzImgCropperComponent.prototype.showImg; /** @type {?} */ YzImgCropperComponent.prototype.imgInfo; /** @type {?} */ YzImgCropperComponent.prototype.canvasRotation; /** @type {?} */ YzImgCropperComponent.prototype.transform; /** @type {?} */ YzImgCropperComponent.prototype.scale; /** @type {?} */ YzImgCropperComponent.prototype.percent; /** @type {?} */ YzImgCropperComponent.prototype.dialogRef; /** * @type {?} * @private */ YzImgCropperComponent.prototype._toast; /** @type {?} */ YzImgCropperComponent.prototype.data; } // 组件参数 var // 组件参数 ComponentOption = /** @class */ (function () { function ComponentOption() { // 上传的图片文件 this.fileType = 'FileEvent'; // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile' // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile' this.containWithinAspectRatio = false; // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false this.format = 'png'; // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png this.imageQuality = 92; // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。 // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。 this.aspectRatio = 1 / 1; // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1 // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1 this.maxSizeMB = 1; // 裁剪压缩后的图片大小的最大值,默认1MB // 裁剪压缩后的图片大小的最大值,默认1MB this.maxWidthOrHeight = 100; // 裁剪压缩后的图片的最大宽度或高度,默认100 } return ComponentOption; }()); // 组件参数 export { ComponentOption }; if (false) { /** @type {?} */ ComponentOption.prototype.imgFile; /** @type {?} */ ComponentOption.prototype.fileType; /** @type {?} */ ComponentOption.prototype.containWithinAspectRatio; /** @type {?} */ ComponentOption.prototype.format; /** @type {?} */ ComponentOption.prototype.imageQuality; /** @type {?} */ ComponentOption.prototype.aspectRatio; /** @type {?} */ ComponentOption.prototype.maxSizeMB; /** @type {?} */ ComponentOption.prototype.maxWidthOrHeight; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotaW1nLWNyb3BwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBRXpEO0lBb0NFLCtCQUFtQixTQUE4QyxFQUM3QyxNQUFvQixFQUNJLElBQXFCO1FBRjlDLGNBQVMsR0FBVCxTQUFTLENBQXFDO1FBQzdDLFdBQU0sR0FBTixNQUFNLENBQWM7UUFDSSxTQUFJLEdBQUosSUFBSSxDQUFpQjtRQS9CakUsaUJBQVksR0FBRztZQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsR0FBRyxJQUFJO1lBQ3ZDLEtBQUssRUFBRSxNQUFNO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsTUFBTTtZQUNmLGFBQWEsRUFBRSxRQUFRO1lBQ3ZCLGlCQUFpQixFQUFFLFFBQVE7WUFDM0IsZUFBZSxFQUFFLFFBQVE7WUFDekIsV0FBVyxFQUFFLE1BQU07U0FDcEIsQ0FBQztRQUVGLHNCQUFpQixHQUFRLElBQUksQ0FBQztRQUM5QixnQkFBVyxHQUFXLElBQUksQ0FBQztRQUMzQixrQkFBYSxHQUFTLElBQUksQ0FBQztRQUUzQixpQkFBWSxHQUFRLElBQUksQ0FBQztRQUN6QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBQ3pCLFlBQU8sR0FBRztZQUNSLEtBQUssRUFBRSxDQUFDO1lBQ1IsTUFBTSxFQUFFLENBQUM7U0FDVixDQUFDO1FBRUYsbUJBQWMsR0FBRyxDQUFDLENBQUM7UUFDbkIsY0FBUyxHQUFtQixFQUFFLENBQUM7UUFDL0IsVUFBSyxHQUFHLENBQUMsQ0FBQzs7UUFHVixZQUFPLEdBQUcsQ0FBQyxDQUFDO0lBS1osQ0FBQzs7OztJQUVELHdDQUFROzs7SUFBUjtRQUNFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7Ozs7O0lBRUQsK0NBQWU7Ozs7SUFBZixVQUFnQixLQUFVO1FBQ3hCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDNUQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUMvQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztTQUMzQjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDM0I7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLFVBQVUsRUFBRTtZQUMzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELFlBQVk7Ozs7OztJQUNaLDRDQUFZOzs7Ozs7SUFBWixVQUFhLEtBQXdCO1FBQ25DLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNqQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBRUQsK0JBQStCOzs7OztJQUMvQiwrQ0FBZTs7Ozs7SUFBZjtRQUNFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDRDQUFTLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBR0QsU0FBUzs7Ozs7SUFDVCwwQ0FBVTs7Ozs7SUFBVjtRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUdELE9BQU87Ozs7O0lBQ1AsNkNBQWE7Ozs7O0lBQWI7UUFDRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDYixLQUFLLEVBQUUsQ0FBQztZQUNSLE1BQU0sRUFBRSxDQUFDO1NBQ1YsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxhQUFhOzs7OztJQUNiLDhDQUFjOzs7OztJQUFkO1FBQ0UsSUFBRyxDQUFDLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDcEQsQ0FBQzs7Ozs7O0lBRUQsNkNBQWE7Ozs7O0lBQWIsVUFBYyxPQUFPLEVBQUUsUUFBUTs7WUFDdkIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDOztZQUN4QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBQ2pDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNyQixDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU07O1lBQ2IsS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQztRQUMvQixPQUFPLENBQUMsRUFBRSxFQUFFO1lBQ1YsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0I7O1lBQ0ssSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELCtEQUErRDs7Ozs7O0lBQ3pELDZDQUFhOzs7Ozs7SUFBbkIsVUFBb0IsU0FBUzs7Ozs7Ozt3QkFDckIsT0FBTyxHQUFHOzRCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7NEJBQzlCLGdCQUFnQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCOzRCQUM1QyxRQUFRLEVBQUUsV0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQVE7NEJBQ3JDLFlBQVksRUFBRSxJQUFJOzRCQUNsQixVQUFVOzs7OzRCQUFFLFVBQUMsR0FBRztnQ0FDZCxLQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQzs0QkFDckIsQ0FBQyxDQUFBO3lCQUNGOzs7O3dCQUV3QixxQkFBTSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLEVBQUE7O3dCQUEzRCxjQUFjLEdBQUcsU0FBMEM7d0JBQ2pFLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYzs7Ozt3QkFBRSxVQUFDLE9BQU87NEJBQ3hDLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUNoQyxDQUFDLEVBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Ozs7d0JBRXJCLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7Ozs7OztLQUU1Qjs7Ozs7O0lBRUQsNENBQVk7Ozs7O0lBQVosVUFBYSxJQUFJLEVBQUUsUUFBUTs7WUFDbkIsVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxNQUFNOzs7O1FBQUcsVUFBQyxDQUFDO1lBQ3BCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFBLENBQUM7UUFDRixVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7O2dCQXJKRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsb2lEQUE4Qzs7aUJBRS9DOzs7O2dCQVJ3QixZQUFZO2dCQUM3QixZQUFZO2dCQXlDZ0MsZUFBZSx1QkFBcEQsTUFBTSxTQUFDLGVBQWU7O0lBZ0hyQyw0QkFBQztDQUFBLEFBdEpELElBc0pDO1NBakpZLHFCQUFxQjs7O0lBRWhDLDZDQVNFOztJQUVGLGtEQUE4Qjs7SUFDOUIsNENBQTJCOztJQUMzQiw4Q0FBMkI7O0lBRTNCLDZDQUF5Qjs7SUFDekIsd0NBQXlCOztJQUN6Qix3Q0FHRTs7SUFFRiwrQ0FBbUI7O0lBQ25CLDBDQUErQjs7SUFDL0Isc0NBQVU7O0lBR1Ysd0NBQVk7O0lBRUEsMENBQXFEOzs7OztJQUNyRCx1Q0FBNEI7O0lBQzVCLHFDQUFxRDs7O0FBbUhuRTs7O0lBQUE7O1FBRUUsYUFBUSxHQUFZLFdBQVcsQ0FBQyxDQUFDLGdEQUFnRDs7UUFDakYsNkJBQXdCLEdBQWEsS0FBSyxDQUFDLENBQUMsc0NBQXNDOztRQUNsRixXQUFNLEdBQVksS0FBSyxDQUFDLENBQUMsa0VBQWtFOztRQUMzRixpQkFBWSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHlEQUF5RDs7UUFDckYsZ0JBQVcsR0FBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDOztRQUNyRSxjQUFTLEdBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCOztRQUMvQyxxQkFBZ0IsR0FBWSxHQUFHLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsQ0FBQztJQUFELHNCQUFDO0FBQUQsQ0FBQyxBQVRELElBU0M7Ozs7O0lBUkMsa0NBQWE7O0lBQ2IsbUNBQWdDOztJQUNoQyxtREFBMkM7O0lBQzNDLGlDQUF3Qjs7SUFDeEIsdUNBQTJCOztJQUMzQixzQ0FBNkI7O0lBQzdCLG9DQUF1Qjs7SUFDdkIsMkNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEluamVjdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtJbWFnZUNyb3BwZWRFdmVudCwgSW1hZ2VUcmFuc2Zvcm19IGZyb20gXCJuZ3gtaW1hZ2UtY3JvcHBlclwiO1xyXG5pbXBvcnQge01BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7VG9hc3RTZXJ2aWNlfSBmcm9tIFwibmctem9ycm8tYW50ZC1tb2JpbGVcIjtcclxuaW1wb3J0IGltYWdlQ29tcHJlc3Npb24gZnJvbSBcImJyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAneXotaW1nLWNyb3BwZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi95ei1pbWctY3JvcHBlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4veXotaW1nLWNyb3BwZXIuY29tcG9uZW50Lmxlc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgWXpJbWdDcm9wcGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY3JvcHBlclN0eWxlID0ge1xyXG4gICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxNDIgKyAncHgnLFxyXG4gICAgd2lkdGg6ICcxMDAlJyxcclxuICAgIHBhZGRpbmc6IDAsXHJcbiAgICBkaXNwbGF5OiAnZmxleCcsXHJcbiAgICAnYWxpZ24taXRlbXMnOiAnY2VudGVyJyxcclxuICAgICdqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJyxcclxuICAgICdhbGlnbi1jb250ZW50JzogJ2NlbnRlcicsXHJcbiAgICAnZmxleC13cmFwJzogJ3dyYXAnXHJcbiAgfTtcclxuXHJcbiAgaW1hZ2VDaGFuZ2VkRXZlbnQ6IGFueSA9IG51bGw7XHJcbiAgaW1hZ2VCYXNlNjQ6IHN0cmluZyA9IG51bGw7XHJcbiAgaW1hZ2VCbG9iRmlsZTogQmxvYiA9IG51bGw7XHJcblxyXG4gIGNyb3BwZWRJbWFnZTogYW55ID0gbnVsbDtcclxuICBzaG93SW1nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaW1nSW5mbyA9IHtcclxuICAgIHdpZHRoOiAwLFxyXG4gICAgaGVpZ2h0OiAwXHJcbiAgfTtcclxuXHJcbiAgY2FudmFzUm90YXRpb24gPSAwO1xyXG4gIHRyYW5zZm9ybTogSW1hZ2VUcmFuc2Zvcm0gPSB7fTtcclxuICBzY2FsZSA9IDE7XHJcblxyXG4gIC8vIOWbvueJh+WOi+e8qei/m+W6plxyXG4gIHBlcmNlbnQgPSAwO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8WXpJbWdDcm9wcGVyQ29tcG9uZW50PixcclxuICAgICAgICAgICAgICBwcml2YXRlIF90b2FzdDogVG9hc3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogQ29tcG9uZW50T3B0aW9uKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLmRhdGEuaW1nRmlsZSkge1xyXG4gICAgICB0aGlzLmZpbGVDaGFuZ2VFdmVudCh0aGlzLmRhdGEuaW1nRmlsZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl90b2FzdC5pbmZvKCfor7fpgInmi6nkuIrkvKDlm77niYfvvIEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdGaWxlRXZlbnQnIHx8ICF0aGlzLmRhdGEuZmlsZVR5cGUpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IGV2ZW50O1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdCYXNlNjQnKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VCbG9iRmlsZSA9IG51bGw7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5maWxlVHlwZSA9PSAnQmxvYkZpbGUnKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmFzZTY0ID0gbnVsbDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDmr4/mrKHoo4Hliarlm77lg4/ml7blj5Hlh7pcclxuICBpbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50KSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NDtcclxuICAgIHRoaXMuaW1nSW5mbyA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgLy8g6YCJ5oup6ZSZ6K+v55qE5paH5Lu257G75Z6L5pe25Y+R5Ye677yI5LuF5YWB6K64cG5n44CBZ2lm5ZKManBn77yJXHJcbiAgbG9hZEltYWdlRmFpbGVkKCkge1xyXG4gICAgdGhpcy5fdG9hc3QuaW5mbyhg5Zu+54mH6YCJ5oup5aSx6LSl77yBYCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8g6L+Y5Y6f5Zu+54mH5aSn5bCPXHJcbiAgcmVzZXRJbWFnZSgpIHtcclxuICAgIHRoaXMuc2NhbGUgPSAxO1xyXG4gICAgdGhpcy5jYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgICB0aGlzLnRyYW5zZm9ybSA9IHt9O1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIOWPlua2iOijgeWJqlxyXG4gIGNhbmNlbENyb3BwZXIoKSB7XHJcbiAgICB0aGlzLmltYWdlQ2hhbmdlZEV2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IG51bGw7XHJcbiAgICB0aGlzLnNob3dJbWcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVyY2VudCA9IDA7XHJcbiAgICB0aGlzLmltZ0luZm8gPSB7XHJcbiAgICAgIHdpZHRoOiAwLFxyXG4gICAgICBoZWlnaHQ6IDBcclxuICAgIH07XHJcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgpO1xyXG4gICAgdGhpcy5yZXNldEltYWdlKCk7XHJcbiAgfVxyXG5cclxuICAvLyDoo4Hliarlrozmr5U9PuWOi+e8qeWbvueJh1xyXG4gIGNvbmZpcm1Dcm9wcGVyKCkge1xyXG4gICAgaWYoIXRoaXMuY3JvcHBlZEltYWdlKSByZXR1cm47XHJcbiAgICB0aGlzLmRhdGFVUkx0b0ZpbGUodGhpcy5jcm9wcGVkSW1hZ2UsICdpbWdfbmFtZScpO1xyXG4gIH1cclxuXHJcbiAgZGF0YVVSTHRvRmlsZShkYXRhdXJsLCBmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgYXJyID0gZGF0YXVybC5zcGxpdCgnLCcpO1xyXG4gICAgY29uc3QgbWltZSA9IGFyclswXS5tYXRjaCgvOiguKj8pOy8pWzFdO1xyXG4gICAgY29uc3QgYnN0ciA9IGF0b2IoYXJyWzFdKTtcclxuICAgIGxldCBuID0gYnN0ci5sZW5ndGg7XHJcbiAgICBjb25zdCB1OGFyciA9IG5ldyBVaW50OEFycmF5KG4pO1xyXG4gICAgd2hpbGUgKG4tLSkge1xyXG4gICAgICB1OGFycltuXSA9IGJzdHIuY2hhckNvZGVBdChuKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbdThhcnJdLCBmaWxlbmFtZSwge3R5cGU6IG1pbWV9KTtcclxuICAgIHRoaXMuY29tcHJlc3NJbWFnZShmaWxlKTtcclxuICB9XHJcblxyXG4gIC8vIOWbvueJh+WOi+e8qSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9icm93c2VyLWltYWdlLWNvbXByZXNzaW9uXHJcbiAgYXN5bmMgY29tcHJlc3NJbWFnZShpbWFnZUZpbGUpIHtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XHJcbiAgICAgIG1heFNpemVNQjogdGhpcy5kYXRhLm1heFNpemVNQixcclxuICAgICAgbWF4V2lkdGhPckhlaWdodDogdGhpcy5kYXRhLm1heFdpZHRoT3JIZWlnaHQsXHJcbiAgICAgIGZpbGVUeXBlOiBgaW1hZ2UvJHt0aGlzLmRhdGEuZm9ybWF0fWAsXHJcbiAgICAgIHVzZVdlYldvcmtlcjogdHJ1ZSxcclxuICAgICAgb25Qcm9ncmVzczogKHJlcykgPT4ge1xyXG4gICAgICAgIHRoaXMucGVyY2VudCA9IHJlcztcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNvbXByZXNzZWRGaWxlID0gYXdhaXQgaW1hZ2VDb21wcmVzc2lvbihpbWFnZUZpbGUsIG9wdGlvbnMpO1xyXG4gICAgICB0aGlzLmJsb2JUb0Jhc2U2NChjb21wcmVzc2VkRmlsZSwgKGRhdGF1cmwpID0+IHtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShkYXRhdXJsKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuY2FuY2VsQ3JvcHBlcigpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcign5Zu+54mH5Y6L57yp5aSx6LSl77yBJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBibG9iVG9CYXNlNjQoYmxvYiwgY2FsbGJhY2spIHtcclxuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgZmlsZVJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICBjYWxsYmFjayhlLnRhcmdldFsncmVzdWx0J10pO1xyXG4gICAgfTtcclxuICAgIGZpbGVSZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOe7hOS7tuWPguaVsFxyXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50T3B0aW9uIHtcclxuICBpbWdGaWxlOiBhbnk7IC8vIOS4iuS8oOeahOWbvueJh+aWh+S7tlxyXG4gIGZpbGVUeXBlPzogc3RyaW5nID0gJ0ZpbGVFdmVudCc7IC8vIOS4iuS8oOeahOWbvueJh+aWh+S7tuexu+WeiyAnRmlsZUV2ZW50JyB8ICdCYXNlNjQnIHwgJ0Jsb2JGaWxlJ1xyXG4gIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbz86IGJvb2xlYW4gPSBmYWxzZTsgLy8g6K6+572u5Li6dHJ1ZeaXtu+8jOWwhuWcqOWbvuWDj+WRqOWbtOa3u+WKoOWhq+WFheS7peS9v+WFtumAguWQiOe6teaoquavlCzpu5jorqRmYWxzZVxyXG4gIGZvcm1hdD86IHN0cmluZyA9ICdwbmcnOyAvLyDovpPlh7rmoLzlvI/vvIhwbmfjgIFqcGVn44CBd2VicOOAgWJtcOOAgWljb++8ie+8iOW5tumdnuaJgOaciea1j+iniOWZqOmDveaUr+aMgeaJgOacieexu+Wei++8jOWni+e7iOaUr+aMgXBuZ++8jOWFtuS7luS4uuWPr+mAie+8ie+8jOm7mOiupHBuZ1xyXG4gIGltYWdlUXVhbGl0eT86IG51bWJlciA9IDkyOyAvLyDov5nku4XpgILnlKjkuo7kvb/nlKhqcGVn5oiWd2VicOS9nOS4uui+k+WHuuagvOW8j+aXtuOAgui+k+WFpeS7i+S6jjDlkowxMDDkuYvpl7TnmoTmlbDlrZflsIblhrPlrprovpPlh7rlm77lg4/nmoTotKjph4/vvIzpu5jorqQ5MuOAglxyXG4gIGFzcGVjdFJhdGlvPzogbnVtYmVyID0gMSAvIDE7IC8vIOWbvueJh+WuveW6pi/pq5jluqbmr5TvvIjkvovlpoLvvIzmraPmlrnlvaLkuLoxLzHvvIw0LzPvvIwxNi854oCm77yJ77yM6buY6K6kMS8xXHJcbiAgbWF4U2l6ZU1CPzogbnVtYmVyID0gMTsgLy8g6KOB5Ymq5Y6L57yp5ZCO55qE5Zu+54mH5aSn5bCP55qE5pyA5aSn5YC877yM6buY6K6kMU1CXHJcbiAgbWF4V2lkdGhPckhlaWdodD86IG51bWJlciA9IDEwMDsgLy8g6KOB5Ymq5Y6L57yp5ZCO55qE5Zu+54mH55qE5pyA5aSn5a695bqm5oiW6auY5bqm77yM6buY6K6kMTAwXHJcbn1cclxuIl19