UNPKG

@alfresco/adf-content-services

Version:
111 lines 19.8 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Component, Inject, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { NodesApiService } from '../../common/services/nodes-api.service'; import { DownloadZipService } from './services/download-zip.service'; import { ContentService } from '../../common/services/content.service'; import { FileDownloadStatus } from '@alfresco/js-api'; import * as i0 from "@angular/core"; import * as i1 from "@angular/material/dialog"; import * as i2 from "./services/download-zip.service"; import * as i3 from "../../common/services/nodes-api.service"; import * as i4 from "../../common/services/content.service"; import * as i5 from "@angular/material/progress-bar"; import * as i6 from "@angular/material/button"; import * as i7 from "@ngx-translate/core"; export class DownloadZipDialogComponent { constructor(dialogRef, data, downloadZipService, nodeService, contentService) { this.dialogRef = dialogRef; this.data = data; this.downloadZipService = downloadZipService; this.nodeService = nodeService; this.contentService = contentService; // flag for async threads this.cancelled = false; this.percentageDone = 0; } ngOnInit() { if (this.data?.nodeIds?.length > 0) { if (!this.cancelled) { this.downloadZip(this.data.nodeIds); } } } cancelDownload() { this.cancelled = true; this.downloadZipService.cancelDownload(this.downloadId); this.dialogRef.close(false); } downloadZip(nodeIds) { if (nodeIds && nodeIds.length > 0) { this.downloadZipService.createDownload({ nodeIds }).subscribe((data) => { if (data?.entry?.id) { const url = this.contentService.getContentUrl(data.entry.id, true); this.nodeService.getNode(data.entry.id).subscribe((downloadNode) => { const fileName = downloadNode.name; this.downloadId = data.entry.id; this.waitAndDownload(data.entry.id, url, fileName); }); } }); } } waitAndDownload(downloadId, url, fileName) { if (this.cancelled) { return; } this.downloadZipService.getDownload(downloadId).subscribe((downloadEntry) => { if (downloadEntry.entry) { if (downloadEntry.entry.status === FileDownloadStatus.IN_PROGRESS) { this.percentageDone = Number(((downloadEntry.entry.bytesAdded * 100) / downloadEntry.entry.totalBytes).toFixed(2)); } if (downloadEntry.entry.status === FileDownloadStatus.DONE) { this.percentageDone = 100; this.download(url, fileName); } else { setTimeout(() => { this.waitAndDownload(downloadId, url, fileName); }, 1000); } } }); } download(url, fileName) { if (url && fileName) { const link = document.createElement('a'); link.style.display = 'none'; link.download = fileName; link.href = url; document.body.appendChild(link); link.click(); document.body.removeChild(link); } this.dialogRef.close(true); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DownloadZipDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DownloadZipService }, { token: i3.NodesApiService }, { token: i4.ContentService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: DownloadZipDialogComponent, selector: "adf-download-zip-dialog", host: { classAttribute: "adf-download-zip-dialog" }, ngImport: i0, template: "<h1 matDialogTitle>{{ 'CORE.DIALOG.DOWNLOAD_ZIP.TITLE' | translate }}</h1>\n<div mat-dialog-content class=\"adf-dialog-content\">\n <mat-progress-bar value=\"{{ percentageDone }}\" color=\"primary\" mode=\"determinate\" />\n <div class=\"adf-dialog-content-progress-text\">\n <span class=\"adf-dialog-content-progress-text-percentage\">\n {{ percentageDone }}%\n </span>\n {{ 'CORE.DIALOG.DOWNLOAD_ZIP.COMPLETE' | translate }}\n </div>\n</div>\n<mat-dialog-actions align=\"end\">\n <button class=\"adf-download-zip-dialog-button\" mat-button color=\"primary\" id=\"cancel-button\" (click)=\"cancelDownload()\">\n {{ 'CORE.DIALOG.DOWNLOAD_ZIP.ACTIONS.CANCEL' | translate }}\n </button>\n</mat-dialog-actions>\n", styles: [".adf-download-zip-dialog-button{text-transform:uppercase}.adf-dialog-content:has(.adf-dialog-content-progress-text){padding:0}.adf-dialog-content:has(.adf-dialog-content-progress-text) .adf-dialog-content-progress-text{margin-top:4px}.adf-dialog-content:has(.adf-dialog-content-progress-text) .adf-dialog-content-progress-text-percentage{font-weight:900}\n"], dependencies: [{ kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i5.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: DownloadZipDialogComponent, decorators: [{ type: Component, args: [{ selector: 'adf-download-zip-dialog', host: { class: 'adf-download-zip-dialog' }, encapsulation: ViewEncapsulation.None, template: "<h1 matDialogTitle>{{ 'CORE.DIALOG.DOWNLOAD_ZIP.TITLE' | translate }}</h1>\n<div mat-dialog-content class=\"adf-dialog-content\">\n <mat-progress-bar value=\"{{ percentageDone }}\" color=\"primary\" mode=\"determinate\" />\n <div class=\"adf-dialog-content-progress-text\">\n <span class=\"adf-dialog-content-progress-text-percentage\">\n {{ percentageDone }}%\n </span>\n {{ 'CORE.DIALOG.DOWNLOAD_ZIP.COMPLETE' | translate }}\n </div>\n</div>\n<mat-dialog-actions align=\"end\">\n <button class=\"adf-download-zip-dialog-button\" mat-button color=\"primary\" id=\"cancel-button\" (click)=\"cancelDownload()\">\n {{ 'CORE.DIALOG.DOWNLOAD_ZIP.ACTIONS.CANCEL' | translate }}\n </button>\n</mat-dialog-actions>\n", styles: [".adf-download-zip-dialog-button{text-transform:uppercase}.adf-dialog-content:has(.adf-dialog-content-progress-text){padding:0}.adf-dialog-content:has(.adf-dialog-content-progress-text) .adf-dialog-content-progress-text{margin-top:4px}.adf-dialog-content:has(.adf-dialog-content-progress-text) .adf-dialog-content-progress-text-percentage{font-weight:900}\n"] }] }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA] }] }, { type: i2.DownloadZipService }, { type: i3.NodesApiService }, { type: i4.ContentService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQtemlwLmRpYWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlhbG9ncy9kb3dubG9hZC16aXAvZG93bmxvYWQtemlwLmRpYWxvZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlhbG9ncy9kb3dubG9hZC16aXAvZG93bmxvYWQtemlwLmRpYWxvZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7O0FBU3RELE1BQU0sT0FBTywwQkFBMEI7SUFNbkMsWUFDWSxTQUFtRCxFQUVwRCxJQUFTLEVBQ1Isa0JBQXNDLEVBQ3RDLFdBQTRCLEVBQzVCLGNBQThCO1FBTDlCLGNBQVMsR0FBVCxTQUFTLENBQTBDO1FBRXBELFNBQUksR0FBSixJQUFJLENBQUs7UUFDUix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFYMUMseUJBQXlCO1FBQ3pCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFbEIsbUJBQWMsR0FBRyxDQUFD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RUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDYixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDbEMsSUFBSSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFDekIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7WUFFaEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2IsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7OEdBakZRLDBCQUEwQiw4Q0FRdkIsZUFBZTtrR0FSbEIsMEJBQTBCLG9IQy9CdkMsNnZCQWVBOzsyRkRnQmEsMEJBQTBCO2tCQVB0QyxTQUFTOytCQUNJLHlCQUF5QixRQUc3QixFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxpQkFDM0IsaUJBQWlCLENBQUMsSUFBSTs7MEJBVWhDLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE5vZGVzQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9zZXJ2aWNlcy9ub2Rlcy1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBEb3dubG9hZFppcFNlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL2Rvd25sb2FkLXppcC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRG93bmxvYWRTdGF0dXMgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtZG93bmxvYWQtemlwLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Rvd25sb2FkLXppcC5kaWFsb2cuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZG93bmxvYWQtemlwLmRpYWxvZy5zY3NzJ10sXG4gICAgaG9zdDogeyBjbGFzczogJ2FkZi1kb3dubG9hZC16aXAtZGlhbG9nJyB9LFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRG93bmxvYWRaaXBEaWFsb2dDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8vIGZsYWcgZm9yIGFzeW5jIHRocmVhZHNcbiAgICBjYW5jZWxsZWQgPSBmYWxzZTtcbiAgICBkb3dubG9hZElkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZURvbmUgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RG93bmxvYWRaaXBEaWFsb2dDb21wb25lbnQ+LFxuICAgICAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSlcbiAgICAgICAgcHVibGljIGRhdGE6IGFueSxcbiAgICAgICAgcHJpdmF0ZSBkb3dubG9hZFppcFNlcnZpY2U6IERvd25sb2FkWmlwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBub2RlU2VydmljZTogTm9kZXNBcGlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZVxuICAgICkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhPy5ub2RlSWRzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZFppcCh0aGlzLmRhdGEubm9kZUlkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYW5jZWxEb3dubG9hZCgpIHtcbiAgICAgICAgdGhpcy5jYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmRvd25sb2FkWmlwU2VydmljZS5jYW5jZWxEb3dubG9hZCh0aGlzLmRvd25sb2FkSWQpO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShmYWxzZSk7XG4gICAgfVxuXG4gICAgZG93bmxvYWRaaXAobm9kZUlkczogc3RyaW5nW10pIHtcbiAgICAgICAgaWYgKG5vZGVJZHMgJiYgbm9kZUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkWmlwU2VydmljZS5jcmVhdGVEb3dubG9hZCh7IG5vZGVJZHMgfSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGE/LmVudHJ5Py5pZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmNvbnRlbnRTZXJ2aWNlLmdldENvbnRlbnRVcmwoZGF0YS5lbnRyeS5pZCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlU2VydmljZS5nZXROb2RlKGRhdGEuZW50cnkuaWQpLnN1YnNjcmliZSgoZG93bmxvYWROb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGRvd25sb2FkTm9kZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZElkID0gZGF0YS5lbnRyeS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2FpdEFuZERvd25sb2FkKGRhdGEuZW50cnkuaWQsIHVybCwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHdhaXRBbmREb3dubG9hZChkb3dubG9hZElkOiBzdHJpbmcsIHVybDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kb3dubG9hZFppcFNlcnZpY2UuZ2V0RG93bmxvYWQoZG93bmxvYWRJZCkuc3Vic2NyaWJlKChkb3dubG9hZEVudHJ5KSA9PiB7XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRFbnRyeS5lbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmIChkb3dubG9hZEVudHJ5LmVudHJ5LnN0YXR1cyA9PT0gRmlsZURvd25sb2FkU3RhdHVzLklOX1BST0dSRVNTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyY2VudGFnZURvbmUgPSBOdW1iZXIoKChkb3dubG9hZEVudHJ5LmVudHJ5LmJ5dGVzQWRkZWQgKiAxMDApIC8gZG93bmxvYWRFbnRyeS5lbnRyeS50b3RhbEJ5dGVzKS50b0ZpeGVkKDIpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRFbnRyeS5lbnRyeS5zdGF0dXMgPT09IEZpbGVEb3dubG9hZFN0YXR1cy5ET05FKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVyY2VudGFnZURvbmUgPSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWQodXJsLCBmaWxlTmFtZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhaXRBbmREb3dubG9hZChkb3dubG9hZElkLCB1cmwsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb3dubG9hZCh1cmw6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZykge1xuICAgICAgICBpZiAodXJsICYmIGZpbGVOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuXG4gICAgICAgICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBsaW5rLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gICAgICAgICAgICBsaW5rLmhyZWYgPSB1cmw7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG4gICAgICAgICAgICBsaW5rLmNsaWNrKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGxpbmspO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHRydWUpO1xuICAgIH1cbn1cbiIsIjxoMSBtYXREaWFsb2dUaXRsZT57eyAnQ09SRS5ESUFMT0cuRE9XTkxPQURfWklQLlRJVExFJyB8IHRyYW5zbGF0ZSB9fTwvaDE+XG48ZGl2IG1hdC1kaWFsb2ctY29udGVudCBjbGFzcz1cImFkZi1kaWFsb2ctY29udGVudFwiPlxuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIHZhbHVlPVwie3sgcGVyY2VudGFnZURvbmUgfX1cIiBjb2xvcj1cInByaW1hcnlcIiBtb2RlPVwiZGV0ZXJtaW5hdGVcIiAvPlxuICAgIDxkaXYgY2xhc3M9XCJhZGYtZGlhbG9nLWNvbnRlbnQtcHJvZ3Jlc3MtdGV4dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImFkZi1kaWFsb2ctY29udGVudC1wcm9ncmVzcy10ZXh0LXBlcmNlbnRhZ2VcIj5cbiAgICAgICAgICAgIHt7IHBlcmNlbnRhZ2VEb25lIH19JVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIHt7ICdDT1JFLkRJQUxPRy5ET1dOTE9BRF9aSVAuQ09NUExFVEUnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxtYXQtZGlhbG9nLWFjdGlvbnMgYWxpZ249XCJlbmRcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYWRmLWRvd25sb2FkLXppcC1kaWFsb2ctYnV0dG9uXCIgbWF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBpZD1cImNhbmNlbC1idXR0b25cIiAoY2xpY2spPVwiY2FuY2VsRG93bmxvYWQoKVwiPlxuICAgICAgICB7eyAnQ09SRS5ESUFMT0cuRE9XTkxPQURfWklQLkFDVElPTlMuQ0FOQ0VMJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuPC9tYXQtZGlhbG9nLWFjdGlvbnM+XG4iXX0=