UNPKG

@alfresco/adf-content-services

Version:
218 lines 29 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. */ /* eslint-disable @angular-eslint/component-selector, @angular-eslint/no-input-rename */ import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core'; import { TrashcanApi } from '@alfresco/js-api'; import { forkJoin, from, of } from 'rxjs'; import { tap, mergeMap, map, catchError } from 'rxjs/operators'; import { TranslationService } from '@alfresco/adf-core'; import { AlfrescoApiService } from '../services/alfresco-api.service'; import * as i0 from "@angular/core"; import * as i1 from "../services/alfresco-api.service"; import * as i2 from "@alfresco/adf-core"; export class NodeRestoreDirective { get trashcanApi() { this._trashcanApi = this._trashcanApi ?? new TrashcanApi(this.alfrescoApiService.getInstance()); return this._trashcanApi; } onClick() { this.recover(this.selection); } constructor(alfrescoApiService, translation) { this.alfrescoApiService = alfrescoApiService; this.translation = translation; /** Emitted when restoration is complete. */ this.restore = new EventEmitter(); this.restoreProcessStatus = this.processStatus(); } recover(selection) { if (!selection.length) { return; } const nodesWithPath = this.getNodesWithPath(selection); if (selection.length && nodesWithPath.length) { this.restoreNodesBatch(nodesWithPath) .pipe(tap((restoredNodes) => { const status = this.processStatus(restoredNodes); this.restoreProcessStatus.fail.push(...status.fail); this.restoreProcessStatus.success.push(...status.success); }), mergeMap(() => this.getDeletedNodes())) .subscribe((deletedNodesList) => { const { entries: nodeList } = deletedNodesList.list; const { fail: restoreErrorNodes } = this.restoreProcessStatus; const selectedNodes = this.diff(restoreErrorNodes, selection, false); const remainingNodes = this.diff(selectedNodes, nodeList); if (!remainingNodes.length) { this.notification(); } else { this.recover(remainingNodes); } }); } else { this.restoreProcessStatus.fail.push(...selection); this.notification(); return; } } restoreNodesBatch(batch) { return forkJoin(batch.map((node) => this.restoreNode(node))); } getNodesWithPath(selection) { return selection.filter((node) => node.entry.path); } getDeletedNodes() { const promise = this.trashcanApi.listDeletedNodes({ include: ['path'] }); return from(promise); } restoreNode(node) { const { entry } = node; const promise = this.trashcanApi.restoreDeletedNode(entry.id); return from(promise).pipe(map(() => ({ status: 1, entry })), catchError((error) => { const { statusCode } = JSON.parse(error.message).error; return of({ status: 0, statusCode, entry }); })); } diff(selection, list, fromList = true) { const ids = selection.map((item) => item.entry.id); return list.filter((item) => { if (fromList) { return ids.includes(item.entry.id) ? item : null; } else { return !ids.includes(item.entry.id) ? item : null; } }); } processStatus(data = []) { const status = { fail: [], success: [], get someFailed() { return !!this.fail.length; }, get someSucceeded() { return !!this.success.length; }, get oneFailed() { return this.fail.length === 1; }, get oneSucceeded() { return this.success.length === 1; }, get allSucceeded() { return this.someSucceeded && !this.someFailed; }, get allFailed() { return this.someFailed && !this.someSucceeded; }, reset() { this.fail = []; this.success = []; } }; return data.reduce((acc, node) => { if (node.status) { acc.success.push(node); } else { acc.fail.push(node); } return acc; }, status); } getRestoreMessage() { const { restoreProcessStatus: status } = this; if (status.someFailed && !status.oneFailed) { return this.translation.instant('CORE.RESTORE_NODE.PARTIAL_PLURAL', { // eslint-disable-next-line id-blacklist number: status.fail.length }); } if (status.oneFailed && status.fail[0].statusCode) { if (status.fail[0].statusCode === 409) { return this.translation.instant('CORE.RESTORE_NODE.NODE_EXISTS', { name: status.fail[0].entry.name }); } else { return this.translation.instant('CORE.RESTORE_NODE.GENERIC', { name: status.fail[0].entry.name }); } } if (status.oneFailed && !status.fail[0].statusCode) { return this.translation.instant('CORE.RESTORE_NODE.LOCATION_MISSING', { name: status.fail[0].entry.name }); } if (status.allSucceeded && !status.oneSucceeded) { return this.translation.instant('CORE.RESTORE_NODE.PLURAL'); } if (status.allSucceeded && status.oneSucceeded) { return this.translation.instant('CORE.RESTORE_NODE.SINGULAR', { name: status.success[0].entry.name }); } return null; } notification() { const status = Object.assign({}, this.restoreProcessStatus); const message = this.getRestoreMessage(); this.reset(); const action = status.oneSucceeded && !status.someFailed ? this.translation.instant('CORE.RESTORE_NODE.VIEW') : ''; let path; if (status.success && status.success.length > 0) { path = status.success[0].entry.path; } this.restore.emit({ message, action, path }); } reset() { this.restoreProcessStatus.reset(); this.selection = []; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeRestoreDirective, deps: [{ token: i1.AlfrescoApiService }, { token: i2.TranslationService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.3", type: NodeRestoreDirective, isStandalone: true, selector: "[adf-restore]", inputs: { selection: ["adf-restore", "selection"] }, outputs: { restore: "restore" }, host: { listeners: { "click": "onClick()" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: NodeRestoreDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[adf-restore]' }] }], ctorParameters: () => [{ type: i1.AlfrescoApiService }, { type: i2.TranslationService }], propDecorators: { selection: [{ type: Input, args: ['adf-restore'] }], restore: [{ type: Output }], onClick: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1yZXN0b3JlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvZGlyZWN0aXZlcy9ub2RlLXJlc3RvcmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILHdGQUF3RjtBQUV4RixPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUUsV0FBVyxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBQ3JGLE9BQU8sRUFBYyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFeEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7Ozs7QUFNdEUsTUFBTSxPQUFPLG9CQUFvQjtJQUk3QixJQUFJLFdBQVc7UUFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDaEcsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFXRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFlBQW9CLGtCQUFzQyxFQUFVLFdBQStCO1FBQS9FLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFBVSxnQkFBVyxH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QUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU87WUFDUCxNQUFNO1lBQ04sSUFBSTtTQUNQLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxLQUFLO1FBQ1QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7OEdBck5RLG9CQUFvQjtrR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQUpoQyxTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsZUFBZTtpQkFDNUI7d0hBWUcsU0FBUztzQkFEUixLQUFLO3VCQUFDLGFBQWE7Z0JBS3BCLE9BQU87c0JBRE4sTUFBTTtnQkFJUCxPQUFPO3NCQUROLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciwgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZSAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcmFzaGNhbkFwaSwgRGVsZXRlZE5vZGVFbnRyeSwgRGVsZXRlZE5vZGVzUGFnaW5nIH0gZnJvbSAnQGFsZnJlc2NvL2pzLWFwaSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRhcCwgbWVyZ2VNYXAsIG1hcCwgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBSZXN0b3JlTWVzc2FnZU1vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXN0b3JlLW1lc3NhZ2UtbW9kZWwuaW50ZXJmYWNlJztcbmltcG9ydCB7IEFsZnJlc2NvQXBpU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FsZnJlc2NvLWFwaS5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1thZGYtcmVzdG9yZV0nXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVSZXN0b3JlRGlyZWN0aXZlIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc3RvcmVQcm9jZXNzU3RhdHVzO1xuXG4gICAgcHJpdmF0ZSBfdHJhc2hjYW5BcGk6IFRyYXNoY2FuQXBpO1xuICAgIGdldCB0cmFzaGNhbkFwaSgpOiBUcmFzaGNhbkFwaSB7XG4gICAgICAgIHRoaXMuX3RyYXNoY2FuQXBpID0gdGhpcy5fdHJhc2hjYW5BcGkgPz8gbmV3IFRyYXNoY2FuQXBpKHRoaXMuYWxmcmVzY29BcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhc2hjYW5BcGk7XG4gICAgfVxuXG4gICAgLyoqIEFycmF5IG9mIGRlbGV0ZWQgbm9kZXMgdG8gcmVzdG9yZS4gKi9cbiAgICBASW5wdXQoJ2FkZi1yZXN0b3JlJylcbiAgICBzZWxlY3Rpb246IERlbGV0ZWROb2RlRW50cnlbXTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gcmVzdG9yYXRpb24gaXMgY29tcGxldGUuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVzdG9yZTogRXZlbnRFbWl0dGVyPFJlc3RvcmVNZXNzYWdlTW9kZWw+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignY2xpY2snKVxuICAgIG9uQ2xpY2soKSB7XG4gICAgICAgIHRoaXMucmVjb3Zlcih0aGlzLnNlbGVjdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBhbGZyZXNjb0FwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGlvbjogVHJhbnNsYXRpb25TZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMucmVzdG9yZVByb2Nlc3NTdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY292ZXIoc2VsZWN0aW9uOiBhbnkpIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub2Rlc1dpdGhQYXRoID0gdGhpcy5nZXROb2Rlc1dpdGhQYXRoKHNlbGVjdGlvbik7XG5cbiAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggJiYgbm9kZXNXaXRoUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdG9yZU5vZGVzQmF0Y2gobm9kZXNXaXRoUGF0aClcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFwKChyZXN0b3JlZE5vZGVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMocmVzdG9yZWROb2Rlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVByb2Nlc3NTdGF0dXMuZmFpbC5wdXNoKC4uLnN0YXR1cy5mYWlsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdG9yZVByb2Nlc3NTdGF0dXMuc3VjY2Vzcy5wdXNoKC4uLnN0YXR1cy5zdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuZ2V0RGVsZXRlZE5vZGVzKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRlbGV0ZWROb2Rlc0xpc3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlbnRyaWVzOiBub2RlTGlzdCB9ID0gZGVsZXRlZE5vZGVzTGlzdC5saXN0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGZhaWw6IHJlc3RvcmVFcnJvck5vZGVzIH0gPSB0aGlzLnJlc3RvcmVQcm9jZXNzU3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZE5vZGVzID0gdGhpcy5kaWZmKHJlc3RvcmVFcnJvck5vZGVzLCBzZWxlY3Rpb24sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nTm9kZXMgPSB0aGlzLmRpZmYoc2VsZWN0ZWROb2Rlcywgbm9kZUxpc3QpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVtYWluaW5nTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvdmVyKHJlbWFpbmluZ05vZGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXN0b3JlUHJvY2Vzc1N0YXR1cy5mYWlsLnB1c2goLi4uc2VsZWN0aW9uKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVOb2Rlc0JhdGNoKGJhdGNoOiBEZWxldGVkTm9kZUVudHJ5W10pOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlRW50cnlbXT4ge1xuICAgICAgICByZXR1cm4gZm9ya0pvaW4oYmF0Y2gubWFwKChub2RlKSA9PiB0aGlzLnJlc3RvcmVOb2RlKG5vZGUpKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXROb2Rlc1dpdGhQYXRoKHNlbGVjdGlvbik6IERlbGV0ZWROb2RlRW50cnlbXSB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24uZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5LnBhdGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVsZXRlZE5vZGVzKCk6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVzUGFnaW5nPiB7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnRyYXNoY2FuQXBpLmxpc3REZWxldGVkTm9kZXMoeyBpbmNsdWRlOiBbJ3BhdGgnXSB9KTtcblxuICAgICAgICByZXR1cm4gZnJvbShwcm9taXNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc3RvcmVOb2RlKG5vZGUpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCB7IGVudHJ5IH0gPSBub2RlO1xuXG4gICAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnRyYXNoY2FuQXBpLnJlc3RvcmVEZWxldGVkTm9kZShlbnRyeS5pZCk7XG5cbiAgICAgICAgcmV0dXJuIGZyb20ocHJvbWlzZSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiAoe1xuICAgICAgICAgICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgICAgICAgICBlbnRyeVxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHN0YXR1c0NvZGUgfSA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSkuZXJyb3I7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1c0NvZGUsXG4gICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlmZihzZWxlY3Rpb24sIGxpc3QsIGZyb21MaXN0ID0gdHJ1ZSk6IGFueSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IHNlbGVjdGlvbi5tYXAoKGl0ZW0pID0+IGl0ZW0uZW50cnkuaWQpO1xuXG4gICAgICAgIHJldHVybiBsaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZyb21MaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gIWlkcy5pbmNsdWRlcyhpdGVtLmVudHJ5LmlkKSA/IGl0ZW0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NTdGF0dXMoZGF0YSA9IFtdKTogYW55IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0ge1xuICAgICAgICAgICAgZmFpbDogW10sXG4gICAgICAgICAgICBzdWNjZXNzOiBbXSxcbiAgICAgICAgICAgIGdldCBzb21lRmFpbGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZmFpbC5sZW5ndGg7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHNvbWVTdWNjZWVkZWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5zdWNjZXNzLmxlbmd0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgb25lRmFpbGVkKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZhaWwubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBvbmVTdWNjZWVkZWQoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzcy5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IGFsbFN1Y2NlZWRlZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zb21lU3VjY2VlZGVkICYmICF0aGlzLnNvbWVGYWlsZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IGFsbEZhaWxlZCgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zb21lRmFpbGVkICYmICF0aGlzLnNvbWVTdWNjZWVkZWQ7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzZXQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWlsID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5zdWNjZXNzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGRhdGEucmVkdWNlKChhY2MsIG5vZGUpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgIGFjYy5zdWNjZXNzLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjYy5mYWlsLnB1c2gobm9kZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHN0YXR1cyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZXN0b3JlTWVzc2FnZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgY29uc3QgeyByZXN0b3JlUHJvY2Vzc1N0YXR1czogc3RhdHVzIH0gPSB0aGlzO1xuXG4gICAgICAgIGlmIChzdGF0dXMuc29tZUZhaWxlZCAmJiAhc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQ09SRS5SRVNUT1JFX05PREUuUEFSVElBTF9QTFVSQUwnLCB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGlkLWJsYWNrbGlzdFxuICAgICAgICAgICAgICAgIG51bWJlcjogc3RhdHVzLmZhaWwubGVuZ3RoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMub25lRmFpbGVkICYmIHN0YXR1cy5mYWlsWzBdLnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgIGlmIChzdGF0dXMuZmFpbFswXS5zdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdDT1JFLlJFU1RPUkVfTk9ERS5OT0RFX0VYSVNUUycsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0uZW50cnkubmFtZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdDT1JFLlJFU1RPUkVfTk9ERS5HRU5FUklDJywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCAmJiAhc3RhdHVzLmZhaWxbMF0uc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQ09SRS5SRVNUT1JFX05PREUuTE9DQVRJT05fTUlTU0lORycsIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBzdGF0dXMuZmFpbFswXS5lbnRyeS5uYW1lXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdDT1JFLlJFU1RPUkVfTk9ERS5QTFVSQUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmIHN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0NPUkUuUkVTVE9SRV9OT0RFLlNJTkdVTEFSJywge1xuICAgICAgICAgICAgICAgIG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLmVudHJ5Lm5hbWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmVzdG9yZVByb2Nlc3NTdGF0dXMpO1xuXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldFJlc3RvcmVNZXNzYWdlKCk7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcblxuICAgICAgICBjb25zdCBhY3Rpb24gPSBzdGF0dXMub25lU3VjY2VlZGVkICYmICFzdGF0dXMuc29tZUZhaWxlZCA/IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnQ09SRS5SRVNUT1JFX05PREUuVklFVycpIDogJyc7XG5cbiAgICAgICAgbGV0IHBhdGg7XG4gICAgICAgIGlmIChzdGF0dXMuc3VjY2VzcyAmJiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBwYXRoID0gc3RhdHVzLnN1Y2Nlc3NbMF0uZW50cnkucGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc3RvcmUuZW1pdCh7XG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgcGF0aFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlc3RvcmVQcm9jZXNzU3RhdHVzLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gW107XG4gICAgfVxufVxuIl19