UNPKG

angular-upcrop

Version:

Library with upload and crop feature for Angular 6+

227 lines (223 loc) 20.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ViewChild, Inject } from '@angular/core'; import { UpcropUploadComponent } from '../upcrop-upload/upcrop-upload.component'; import { UpcropCropComponent } from '../upcrop-crop/upcrop-crop.component'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material'; export class UpcropDialogComponent { /** * @param {?} dialogRef * @param {?} data */ constructor(dialogRef, data) { this.dialogRef = dialogRef; this.data = data; this.cropData = {}; this.uploadedImages = []; this.uploader = null; this.steps = { total: 2, options: [{ label: 'Subir imagens', number: 1, next: 2, nextDisabled: () => { return this.step1NextDisabled(); }, nextAction: () => { this.goToStep2(); } }, { label: 'Cortar imagens', number: 2, previus: 1, previusAction: () => { this.goToStep1(); } }], current: {} }; } /** * @return {?} */ ngOnInit() { // // Set first step this.steps.current = this.steps.options[0]; } /** * Go to step 1 * @return {?} */ goToStep1() { // // Reset crop this.upcropCrop.unsetCropping(); // // Change to step 1 this.steps.current = this.steps.options[0]; // // Reset crop this.upcropCrop.current = false; this.upcropCrop.currentNumber = false; } /** * Go to step 2 * @return {?} */ goToStep2() { // // Change to step 2 this.steps.current = this.steps.options[1]; // // Set crop this.upcropCrop.setCropping(this.upcropUpload.uploader); } /** * Finish * @return {?} */ finish() { // // On complete all files uplaod this.upcropUpload.uploader.onCompleteAll = () => { // // Remove loading this.upcropCrop.uploading = false; // // Close dialog with uploadedImages this.dialogRef.close(this.uploadedImages); }; // // Emit on crop image this.upcropCrop.emitOnCropImage(); // // Set crop data in additionalParameter this.upcropUpload.uploader.options.additionalParameter['cropData'] = this.cropData; // // Upload all this.upcropCrop.uploading = true; this.upcropUpload.uploader.uploadAll(); } /** * Step 1 next button disabled conditions * @return {?} */ step1NextDisabled() { return !this.upcropUpload.uploader.queue.length; } /** * On crop image event * @param {?} event * @return {?} */ onCropImage(event) { /** @type {?} */ const cropData = this.createUrlParams(event.data); // // Add crop to uploader file crop data this.upcropUpload.uploader.queue[event.file].url = this.data.uploadConfig.url + cropData; } /** * On upload image event * @param {?} event * @return {?} */ onUploadImage(event) { this.uploadedImages.push(event); } /** * Create url params * @param {?} obj * @return {?} */ createUrlParams(obj) { // // Validate obj if (!obj) return ''; /** @type {?} */ const url = '?'; /** @type {?} */ const params = Object.keys(obj).map(function (key) { return key + '=' + encodeURIComponent(obj[key]); }).join('&'); return url + params; } } UpcropDialogComponent.decorators = [ { type: Component, args: [{ selector: 'upcrop-dialog', template: `<h2 mat-dialog-title class="has-text-danger"> Upload de imagens <small>com corte</small> </h2> <mat-dialog-content> <!-- STEPS --> <div steps> <div steps-content fxLayout="row" fxLayoutAlign="start center"> <button mat-icon-button fxHide.xs [disabled]="!steps.current.previus || (steps.current.previusDisabled && steps.current.previusDisabled())" (click)="steps.current.previusAction()"> <mat-icon>keyboard_arrow_left</mat-icon> </button> <span fxFlex></span> <h3>Passo <b>{{steps.current.number}}</b> de <b>{{steps.total}}</b> / <span class="has-text-primary">{{steps.current.label}}</span> </h3> <span fxFlex></span> <button mat-icon-button fxHide.xs [disabled]="!steps.current.next || (steps.current.nextDisabled && steps.current.nextDisabled())" (click)="steps.current.nextAction()"> <mat-icon>keyboard_arrow_right</mat-icon> </button> </div> </div> <!-- STEP 1 / UPLOAD --> <div class="step-1" [hidden]="steps.current.number != 1"> <upcrop-upload #upcropUpload [config]="data.uploadConfig" (onUploadImage)="onUploadImage($event)"></upcrop-upload> </div> <!-- STEP 2 / CROP --> <div class="step-2" [hidden]="steps.current.number != 2"> <upcrop-crop #upcropCrop [config]="data.cropConfig" (onCropImage)="onCropImage($event)"></upcrop-crop> </div> </mat-dialog-content> <mat-dialog-actions *ngIf="steps.current.number == 1"> <button mat-button mat-dialog-close>Fechar</button> <button mat-button color="primary" [disabled]="!upcropUpload.uploader.queue.length" (click)="goToStep2()">Continuar</button> </mat-dialog-actions> <mat-dialog-actions *ngIf="steps.current.number == 2"> <button mat-button (click)="goToStep1()">Voltar</button> <button mat-button color="primary" [fxHide]="upcropCrop.uploader?.queue?.length == (upcropCrop.currentNumber + 1)" (click)="upcropCrop.goToNextCrop()">Próxima imagem</button> <button mat-button color="primary" [fxHide]="upcropCrop.uploader?.queue?.length > (upcropCrop.currentNumber + 1)" [disabled]="upcropCrop.uploading" (click)="finish()">Concluir</button> </mat-dialog-actions> `, styles: [`[mat-dialog-title] small{color:#b5b5b5!important;font:400 16px/28px Roboto,"Helvetica Neue",sans-serif!important;margin:0 0 16px!important}[steps]{margin:0 -24px 16px;padding-top:16px;padding-bottom:16px;background-color:rgba(0,0,0,.04)}[steps] .has-text-primary{color:#3f51b5!important}[mat-dialog-title] .has-text-danger{color:#f44336!important}`] },] }, ]; /** @nocollapse */ UpcropDialogComponent.ctorParameters = () => [ { type: MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] } ]; UpcropDialogComponent.propDecorators = { upcropUpload: [{ type: ViewChild, args: ['upcropUpload',] }], upcropCrop: [{ type: ViewChild, args: ['upcropCrop',] }] }; if (false) { /** @type {?} */ UpcropDialogComponent.prototype.upcropUpload; /** @type {?} */ UpcropDialogComponent.prototype.upcropCrop; /** @type {?} */ UpcropDialogComponent.prototype.cropData; /** @type {?} */ UpcropDialogComponent.prototype.uploadedImages; /** @type {?} */ UpcropDialogComponent.prototype.uploader; /** @type {?} */ UpcropDialogComponent.prototype.steps; /** @type {?} */ UpcropDialogComponent.prototype.dialogRef; /** @type {?} */ UpcropDialogComponent.prototype.data; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBjcm9wLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLXVwY3JvcC8iLCJzb3VyY2VzIjpbImxpYi91cGNyb3AtZGlhbG9nL3VwY3JvcC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQXNEbEUsTUFBTTs7Ozs7SUF5QkYsWUFDVyxXQUN5QixJQUFTO1FBRGxDLGNBQVMsR0FBVCxTQUFTO1FBQ2dCLFNBQUksR0FBSixJQUFJLENBQUs7d0JBdEIzQixFQUFFOzhCQUNJLEVBQUU7d0JBQ0gsSUFBSTtxQkFDUDtZQUNoQixLQUFLLEVBQUUsQ0FBQztZQUNSLE9BQU8sRUFBRSxDQUFDO29CQUNOLEtBQUssRUFBRSxlQUFlO29CQUN0QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxJQUFJLEVBQUUsQ0FBQztvQkFDUCxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUU7b0JBQ3hELFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRTtpQkFDMUMsRUFBRTtvQkFDQyxLQUFLLEVBQUUsZ0JBQWdCO29CQUN2QixNQUFNLEVBQUUsQ0FBQztvQkFDVCxPQUFPLEVBQUUsQ0FBQztvQkFDVixhQUFhLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUU7aUJBQzdDLENBQUM7WUFDRixPQUFP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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQStDYjtnQkFDRyxNQUFNLEVBQUUsQ0FBQyw2VkFBNlYsQ0FBQzthQUMxVzs7OztZQXJEUSxZQUFZOzRDQWlGWixNQUFNLFNBQUMsZUFBZTs7OzJCQXpCMUIsU0FBUyxTQUFDLGNBQWM7eUJBQ3hCLFNBQVMsU0FBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBVcGNyb3BVcGxvYWRDb21wb25lbnQgfSBmcm9tICcuLi91cGNyb3AtdXBsb2FkL3VwY3JvcC11cGxvYWQuY29tcG9uZW50JztcbmltcG9ydCB7IFVwY3JvcENyb3BDb21wb25lbnQgfSBmcm9tICcuLi91cGNyb3AtY3JvcC91cGNyb3AtY3JvcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAndXBjcm9wLWRpYWxvZycsXG4gICAgdGVtcGxhdGU6IGA8aDIgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cImhhcy10ZXh0LWRhbmdlclwiPlxuICAgIFVwbG9hZCBkZSBpbWFnZW5zXG4gICAgPHNtYWxsPmNvbSBjb3J0ZTwvc21hbGw+XG48L2gyPlxuPG1hdC1kaWFsb2ctY29udGVudD5cblxuICAgIDwhLS0gU1RFUFMgLS0+XG4gICAgPGRpdiBzdGVwcz5cbiAgICAgICAgPGRpdiBzdGVwcy1jb250ZW50IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gZnhIaWRlLnhzIFtkaXNhYmxlZF09XCIhc3RlcHMuY3VycmVudC5wcmV2aXVzIHx8IChzdGVwcy5jdXJyZW50LnByZXZpdXNEaXNhYmxlZCAmJiBzdGVwcy5jdXJyZW50LnByZXZpdXNEaXNhYmxlZCgpKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInN0ZXBzLmN1cnJlbnQucHJldml1c0FjdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2xlZnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8c3BhbiBmeEZsZXg+PC9zcGFuPlxuICAgICAgICAgICAgPGgzPlBhc3NvXG4gICAgICAgICAgICAgICAgPGI+e3tzdGVwcy5jdXJyZW50Lm51bWJlcn19PC9iPiBkZVxuICAgICAgICAgICAgICAgIDxiPnt7c3RlcHMudG90YWx9fTwvYj4gL1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFzLXRleHQtcHJpbWFyeVwiPnt7c3RlcHMuY3VycmVudC5sYWJlbH19PC9zcGFuPlxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgIDxzcGFuIGZ4RmxleD48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBmeEhpZGUueHMgW2Rpc2FibGVkXT1cIiFzdGVwcy5jdXJyZW50Lm5leHQgfHwgKHN0ZXBzLmN1cnJlbnQubmV4dERpc2FibGVkICYmIHN0ZXBzLmN1cnJlbnQubmV4dERpc2FibGVkKCkpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic3RlcHMuY3VycmVudC5uZXh0QWN0aW9uKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBTVEVQIDEgLyBVUExPQUQgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtMVwiIFtoaWRkZW5dPVwic3RlcHMuY3VycmVudC5udW1iZXIgIT0gMVwiPlxuICAgICAgICA8dXBjcm9wLXVwbG9hZCAjdXBjcm9wVXBsb2FkIFtjb25maWddPVwiZGF0YS51cGxvYWRDb25maWdcIiAob25VcGxvYWRJbWFnZSk9XCJvblVwbG9hZEltYWdlKCRldmVudClcIj48L3VwY3JvcC11cGxvYWQ+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFNURVAgMiAvIENST1AgLS0+XG4gICAgPGRpdiBjbGFzcz1cInN0ZXAtMlwiIFtoaWRkZW5dPVwic3RlcHMuY3VycmVudC5udW1iZXIgIT0gMlwiPlxuICAgICAgICA8dXBjcm9wLWNyb3AgI3VwY3JvcENyb3AgW2NvbmZpZ109XCJkYXRhLmNyb3BDb25maWdcIiAob25Dcm9wSW1hZ2UpPVwib25Dcm9wSW1hZ2UoJGV2ZW50KVwiPjwvdXBjcm9wLWNyb3A+XG4gICAgPC9kaXY+XG48L21hdC1kaWFsb2ctY29udGVudD5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgKm5nSWY9XCJzdGVwcy5jdXJyZW50Lm51bWJlciA9PSAxXCI+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+RmVjaGFyPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhdXBjcm9wVXBsb2FkLnVwbG9hZGVyLnF1ZXVlLmxlbmd0aFwiIChjbGljayk9XCJnb1RvU3RlcDIoKVwiPkNvbnRpbnVhcjwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG48bWF0LWRpYWxvZy1hY3Rpb25zICpuZ0lmPVwic3RlcHMuY3VycmVudC5udW1iZXIgPT0gMlwiPlxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZ29Ub1N0ZXAxKClcIj5Wb2x0YXI8L2J1dHRvbj5cbiAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Z4SGlkZV09XCJ1cGNyb3BDcm9wLnVwbG9hZGVyPy5xdWV1ZT8ubGVuZ3RoID09ICh1cGNyb3BDcm9wLmN1cnJlbnROdW1iZXIgKyAxKVwiIChjbGljayk9XCJ1cGNyb3BDcm9wLmdvVG9OZXh0Q3JvcCgpXCI+UHLDs3hpbWEgaW1hZ2VtPC9idXR0b24+XG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIFtmeEhpZGVdPVwidXBjcm9wQ3JvcC51cGxvYWRlcj8ucXVldWU/Lmxlbmd0aCA+ICh1cGNyb3BDcm9wLmN1cnJlbnROdW1iZXIgKyAxKVwiIFtkaXNhYmxlZF09XCJ1cGNyb3BDcm9wLnVwbG9hZGluZ1wiXG4gICAgICAgIChjbGljayk9XCJmaW5pc2goKVwiPkNvbmNsdWlyPC9idXR0b24+XG48L21hdC1kaWFsb2ctYWN0aW9ucz5cbmAsXG4gICAgc3R5bGVzOiBbYFttYXQtZGlhbG9nLXRpdGxlXSBzbWFsbHtjb2xvcjojYjViNWI1IWltcG9ydGFudDtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLFwiSGVsdmV0aWNhIE5ldWVcIixzYW5zLXNlcmlmIWltcG9ydGFudDttYXJnaW46MCAwIDE2cHghaW1wb3J0YW50fVtzdGVwc117bWFyZ2luOjAgLTI0cHggMTZweDtwYWRkaW5nLXRvcDoxNnB4O3BhZGRpbmctYm90dG9tOjE2cHg7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9W3N0ZXBzXSAuaGFzLXRleHQtcHJpbWFyeXtjb2xvcjojM2Y1MWI1IWltcG9ydGFudH1bbWF0LWRpYWxvZy10aXRsZV0gLmhhcy10ZXh0LWRhbmdlcntjb2xvcjojZjQ0MzM2IWltcG9ydGFudH1gXVxufSlcbmV4cG9ydCBjbGFzcyBVcGNyb3BEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQFZpZXdDaGlsZCgndXBjcm9wVXBsb2FkJykgcHVibGljIHVwY3JvcFVwbG9hZDogVXBjcm9wVXBsb2FkQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ3VwY3JvcENyb3AnKSBwdWJsaWMgdXBjcm9wQ3JvcDogVXBjcm9wQ3JvcENvbXBvbmVudDtcblxuICAgIHB1YmxpYyBjcm9wRGF0YSA9IHt9O1xuICAgIHB1YmxpYyB1cGxvYWRlZEltYWdlcyA9IFtdO1xuICAgIHB1YmxpYyB1cGxvYWRlcjogYW55ID0gbnVsbDtcbiAgICBwdWJsaWMgc3RlcHM6IGFueSA9IHtcbiAgICAgICAgdG90YWw6IDIsXG4gICAgICAgIG9wdGlvbnM6IFt7XG4gICAgICAgICAgICBsYWJlbDogJ1N1YmlyIGltYWdlbnMnLFxuICAgICAgICAgICAgbnVtYmVyOiAxLFxuICAgICAgICAgICAgbmV4dDogMixcbiAgICAgICAgICAgIG5leHREaXNhYmxlZDogKCkgPT4geyByZXR1cm4gdGhpcy5zdGVwMU5leHREaXNhYmxlZCgpOyB9LFxuICAgICAgICAgICAgbmV4dEFjdGlvbjogKCkgPT4geyB0aGlzLmdvVG9TdGVwMigpOyB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGxhYmVsOiAnQ29ydGFyIGltYWdlbnMnLFxuICAgICAgICAgICAgbnVtYmVyOiAyLFxuICAgICAgICAgICAgcHJldml1czogMSxcbiAgICAgICAgICAgIHByZXZpdXNBY3Rpb246ICgpID0+IHsgdGhpcy5nb1RvU3RlcDEoKTsgfVxuICAgICAgICB9XSxcbiAgICAgICAgY3VycmVudDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxVcGNyb3BEaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueVxuICAgICkgeyB9XG5cbiAgICBuZ09uSW5pdCgpIHtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBTZXQgZmlyc3Qgc3RlcFxuICAgICAgICB0aGlzLnN0ZXBzLmN1cnJlbnQgPSB0aGlzLnN0ZXBzLm9wdGlvbnNbMF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR28gdG8gc3RlcCAxXG4gICAgICovXG4gICAgZ29Ub1N0ZXAxKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFJlc2V0IGNyb3BcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLnVuc2V0Q3JvcHBpbmcoKTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBDaGFuZ2UgdG8gc3RlcCAxXG4gICAgICAgIHRoaXMuc3RlcHMuY3VycmVudCA9IHRoaXMuc3RlcHMub3B0aW9uc1swXTtcblxuICAgICAgICAvL1xuICAgICAgICAvLyBSZXNldCBjcm9wXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5jdXJyZW50TnVtYmVyID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR28gdG8gc3RlcCAyXG4gICAgICovXG4gICAgZ29Ub1N0ZXAyKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIENoYW5nZSB0byBzdGVwIDJcbiAgICAgICAgdGhpcy5zdGVwcy5jdXJyZW50ID0gdGhpcy5zdGVwcy5vcHRpb25zWzFdO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCBjcm9wXG4gICAgICAgIHRoaXMudXBjcm9wQ3JvcC5zZXRDcm9wcGluZyh0aGlzLnVwY3JvcFVwbG9hZC51cGxvYWRlcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluaXNoXG4gICAgICovXG4gICAgZmluaXNoKCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE9uIGNvbXBsZXRlIGFsbCBmaWxlcyB1cGxhb2RcbiAgICAgICAgdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIub25Db21wbGV0ZUFsbCA9ICgpID0+IHtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIFJlbW92ZSBsb2FkaW5nXG4gICAgICAgICAgICB0aGlzLnVwY3JvcENyb3AudXBsb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBDbG9zZSBkaWFsb2cgd2l0aCB1cGxvYWRlZEltYWdlc1xuICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy51cGxvYWRlZEltYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICAvLyBFbWl0IG9uIGNyb3AgaW1hZ2VcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLmVtaXRPbkNyb3BJbWFnZSgpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFNldCBjcm9wIGRhdGEgaW4gYWRkaXRpb25hbFBhcmFtZXRlclxuICAgICAgICB0aGlzLnVwY3JvcFVwbG9hZC51cGxvYWRlci5vcHRpb25zLmFkZGl0aW9uYWxQYXJhbWV0ZXJbJ2Nyb3BEYXRhJ10gPSB0aGlzLmNyb3BEYXRhO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFVwbG9hZCBhbGxcbiAgICAgICAgdGhpcy51cGNyb3BDcm9wLnVwbG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMudXBjcm9wVXBsb2FkLnVwbG9hZGVyLnVwbG9hZEFsbCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0ZXAgMSBuZXh0IGJ1dHRvbiBkaXNhYmxlZCBjb25kaXRpb25zXG4gICAgICovXG4gICAgc3RlcDFOZXh0RGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIucXVldWUubGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9uIGNyb3AgaW1hZ2UgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBvbkNyb3BJbWFnZShldmVudCkge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIENyZWF0ZSB1cmwgcGFyYW1zIHdpdGggY3JvcCBkYXRhXG4gICAgICAgIGNvbnN0IGNyb3BEYXRhID0gdGhpcy5jcmVhdGVVcmxQYXJhbXMoZXZlbnQuZGF0YSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gQWRkIGNyb3AgdG8gdXBsb2FkZXIgZmlsZSBjcm9wIGRhdGFcbiAgICAgICAgdGhpcy51cGNyb3BVcGxvYWQudXBsb2FkZXIucXVldWVbZXZlbnQuZmlsZV0udXJsID0gdGhpcy5kYXRhLnVwbG9hZENvbmZpZy51cmwgKyBjcm9wRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiB1cGxvYWQgaW1hZ2UgZXZlbnRcbiAgICAgKiBAcGFyYW0gZXZlbnRcbiAgICAgKi9cbiAgICBvblVwbG9hZEltYWdlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRJbWFnZXMucHVzaChldmVudCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHVybCBwYXJhbXNcbiAgICAgKiBAcGFyYW0gb2JqXG4gICAgICovXG4gICAgY3JlYXRlVXJsUGFyYW1zKG9iaikge1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFZhbGlkYXRlIG9ialxuICAgICAgICBpZiAoIW9iaikgcmV0dXJuICcnO1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEZpcnN0IHBhcmFtXG4gICAgICAgIGNvbnN0IHVybCA9ICc/JztcblxuICAgICAgICAvL1xuICAgICAgICAvLyBHZW5lcmF0ZSB1cmwgcGFyYW1cbiAgICAgICAgY29uc3QgcGFyYW1zID0gT2JqZWN0LmtleXMob2JqKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChvYmpba2V5XSk7XG4gICAgICAgIH0pLmpvaW4oJyYnKTtcblxuICAgICAgICByZXR1cm4gdXJsICsgcGFyYW1zO1xuICAgIH1cbn1cbiJdfQ==