@hmcts/media-viewer
Version:
91 lines • 21.8 kB
JavaScript
import { Component, Input } from '@angular/core';
import { select } from '@ngrx/store';
import { v4 as uuid } from 'uuid';
import { filter, take } from 'rxjs/operators';
import * as fromSelectors from '../../store/selectors/redaction.selectors';
import * as fromRedaSelectors from '../../store/selectors/redaction.selectors';
import * as fromDocument from '../../store/selectors/document.selectors';
import * as fromActions from '../../store/actions/redaction.actions';
import * as fromRedactionActions from '../../store/actions/redaction.actions';
import * as fromRedaActions from '../../store/actions/redaction.actions';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "../../viewers/viewer-event.service";
import * as i3 from "../../toolbar/toolbar-event.service";
import * as i4 from "@angular/common";
import * as i5 from "../../annotations/annotation-set/annotation-view/annotation-view.component";
import * as i6 from "../../annotations/annotation-set/annotation-create/box-highlight-create/box-highlight-create.component";
export class RedactionComponent {
constructor(store, viewerEvents, toolbarEvents) {
this.store = store;
this.viewerEvents = viewerEvents;
this.toolbarEvents = toolbarEvents;
}
ngOnInit() {
this.redactionsPerPage$ = this.store.pipe(select(fromSelectors.getRedactionsPerPage));
this.selectedRedaction$ = this.store.pipe(select(fromSelectors.getSelected));
this.$subscription = this.toolbarEvents.drawModeSubject.subscribe(drawMode => this.drawMode = drawMode);
this.$subscription.add(this.store.pipe(select(fromSelectors.getRedactedDocumentInfo), filter(value => !!value))
.subscribe(redactedDocInfo => this.downloadDocument(redactedDocInfo)));
this.$subscription.add(this.store.pipe(select(fromDocument.getDocumentId)).subscribe(docId => this.documentId = docId));
this.$subscription.add(this.viewerEvents.textHighlight.subscribe(highlight => this.markTextRedaction(highlight)));
this.toolbarEvents.applyRedactToDocument.subscribe(() => {
this.store.pipe(select(fromRedaSelectors.getRedactionArray), take(1)).subscribe(redactions => {
this.store.dispatch(new fromRedaActions.Redact(redactions));
});
});
this.toolbarEvents.clearAllRedactMarkers.subscribe(() => {
this.store.dispatch(new fromRedaActions.UnmarkAll(this.documentId));
});
}
ngOnDestroy() {
this.$subscription.unsubscribe();
}
markTextRedaction(highlight) {
const redactionHighlight = highlight.rectangles;
if (redactionHighlight && redactionHighlight.length) {
this.saveRedaction(highlight.page, [...redactionHighlight]);
}
this.toolbarEvents.highlightModeSubject.next(false);
}
markBoxRedaction({ rectangles, page }) {
this.saveRedaction(page, rectangles);
this.toolbarEvents.drawModeSubject.next(false);
}
saveRedaction(page, rectangles) {
const redaction = { page, rectangles, redactionId: uuid(), documentId: this.documentId };
this.store.dispatch(new fromRedactionActions.SaveRedaction(redaction));
}
onMarkerDelete(event) {
this.store.dispatch(new fromActions.DeleteRedaction(event));
}
selectRedaction(event) {
this.store.dispatch(new fromActions.SelectRedaction(event));
}
onMarkerUpdate(redaction) {
this.store.dispatch(new fromActions.SaveRedaction(redaction));
}
downloadDocument({ blob, filename }) {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
document.body.appendChild(a);
a.setAttribute('style', 'display: none');
a.href = url;
a.download = filename;
a.click();
a.remove();
URL.revokeObjectURL(url);
this.store.dispatch(new fromRedactionActions.ResetRedactedDocument());
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RedactionComponent, deps: [{ token: i1.Store }, { token: i2.ViewerEventService }, { token: i3.ToolbarEventService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RedactionComponent, selector: "mv-redactions", inputs: { zoom: "zoom", rotate: "rotate" }, ngImport: i0, template: "<div class=\"pageContainer\">\n <div *ngFor=\"let redaction of (redactionsPerPage$ | async); index as i\"\n class=\"pageContainer__page\"\n [ngStyle]=\"{\n 'width.px': redaction.styles.width,\n 'height.px': redaction.styles.height\n }\"\n [attr.redaction-page-num]=\"i+1\"\n [ngClass]=\"{ 'pageContainer__page--draw' : drawMode }\">\n <mv-box-highlight-create\n [page]=\"i + 1\"\n [pageHeight]=\"redaction.styles.height\"\n [pageWidth]=\"redaction.styles.width\"\n [rotate]=\"rotate\"\n [zoom]=\"zoom\"\n (saveSelection)=\"markBoxRedaction($event)\">\n </mv-box-highlight-create>\n <div class=\"pageContainer__page-item\">\n <ng-container *ngFor=\"let anno of redaction.anno\">\n <!-- TODO rename this to selection -->\n <mv-annotation [annotation]=\"anno\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [selectedAnnoId]=\"selectedRedaction$ | async\"\n [pageHeight]=\"redaction.styles.height\"\n [pageWidth]=\"redaction.styles.width\"\n (update)=\"onMarkerUpdate($event)\"\n (delete)=\"onMarkerDelete($event)\"\n (annotationClick)=\"selectRedaction($event)\">\n </mv-annotation>\n </ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.AnnotationViewComponent, selector: "mv-annotation", inputs: ["annotation", "zoom", "rotate", "selectedAnnoId", "pageHeight", "pageWidth"], outputs: ["update", "delete", "annotationClick"] }, { kind: "component", type: i6.BoxHighlightCreateComponent, selector: "mv-box-highlight-create", inputs: ["page", "pageHeight", "pageWidth", "rotate", "zoom", "container"], outputs: ["saveSelection"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RedactionComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-redactions', template: "<div class=\"pageContainer\">\n <div *ngFor=\"let redaction of (redactionsPerPage$ | async); index as i\"\n class=\"pageContainer__page\"\n [ngStyle]=\"{\n 'width.px': redaction.styles.width,\n 'height.px': redaction.styles.height\n }\"\n [attr.redaction-page-num]=\"i+1\"\n [ngClass]=\"{ 'pageContainer__page--draw' : drawMode }\">\n <mv-box-highlight-create\n [page]=\"i + 1\"\n [pageHeight]=\"redaction.styles.height\"\n [pageWidth]=\"redaction.styles.width\"\n [rotate]=\"rotate\"\n [zoom]=\"zoom\"\n (saveSelection)=\"markBoxRedaction($event)\">\n </mv-box-highlight-create>\n <div class=\"pageContainer__page-item\">\n <ng-container *ngFor=\"let anno of redaction.anno\">\n <!-- TODO rename this to selection -->\n <mv-annotation [annotation]=\"anno\"\n [zoom]=\"zoom\"\n [rotate]=\"rotate\"\n [selectedAnnoId]=\"selectedRedaction$ | async\"\n [pageHeight]=\"redaction.styles.height\"\n [pageWidth]=\"redaction.styles.width\"\n (update)=\"onMarkerUpdate($event)\"\n (delete)=\"onMarkerDelete($event)\"\n (annotationClick)=\"selectRedaction($event)\">\n </mv-annotation>\n </ng-container>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.ViewerEventService }, { type: i3.ToolbarEventService }], propDecorators: { zoom: [{
type: Input
}], rotate: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhLXZpZXdlci9zcmMvbGliL3JlZGFjdGlvbi9jb21wb25lbnRzL3JlZGFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYS12aWV3ZXIvc3JjL2xpYi9yZWRhY3Rpb24vY29tcG9uZW50cy9yZWRhY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRXBFLE9BQU8sRUFBRSxNQUFNLEVBQVMsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEtBQUssYUFBYSxNQUFNLDJDQUEyQyxDQUFDO0FBQzNFLE9BQU8sS0FBSyxpQkFBaUIsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEtBQUssWUFBWSxNQUFNLDBDQUEwQyxDQUFDO0FBQ3pFLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUNBQXVDLENBQUM7QUFDckUsT0FBTyxLQUFLLG9CQUFvQixNQUFNLHVDQUF1QyxDQUFDO0FBQzlFLE9BQU8sS0FBSyxlQUFlLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7O0FBVXpFLE1BQU0sT0FBTyxrQkFBa0I7SUFhN0IsWUFBb0IsS0FBNkIsRUFDOUIsWUFBZ0MsRUFDekMsYUFBa0M7UUFGeEIsVUFBSyxHQUFMLEtBQUssQ0FBd0I7UUFDOUIsaUJBQVksR0FBWixZQUFZLENBQW9CO1FBQ3pDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtJQUFJLENBQUM7SUFFakQsUUFBUTtRQUNOLElBQUks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LElBQUksR0FBRyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN0QixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWCxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksb0JBQW9CLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7a0lBaEZVLGtCQUFrQjtzSEFBbEIsa0JBQWtCLGlHQ3ZCL0IseTRDQWtDQTs7NEZEWGEsa0JBQWtCO2tCQUo5QixTQUFTOytCQUNFLGVBQWU7NklBS2hCLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZWN0YW5nbGUgfSBmcm9tICcuLi8uLi9hbm5vdGF0aW9ucy9hbm5vdGF0aW9uLXNldC9hbm5vdGF0aW9uLXZpZXcvcmVjdGFuZ2xlL3JlY3RhbmdsZS5tb2RlbCc7XG5pbXBvcnQgKiBhcyBmcm9tU3RvcmUgZnJvbSAnLi4vLi4vc3RvcmUvcmVkdWNlcnMvcmVkdWNlcnMnO1xuaW1wb3J0ICogYXMgZnJvbVNlbGVjdG9ycyBmcm9tICcuLi8uLi9zdG9yZS9zZWxlY3RvcnMvcmVkYWN0aW9uLnNlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBmcm9tUmVkYVNlbGVjdG9ycyBmcm9tICcuLi8uLi9zdG9yZS9zZWxlY3RvcnMvcmVkYWN0aW9uLnNlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBmcm9tRG9jdW1lbnQgZnJvbSAnLi4vLi4vc3RvcmUvc2VsZWN0b3JzL2RvY3VtZW50LnNlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBmcm9tQWN0aW9ucyBmcm9tICcuLi8uLi9zdG9yZS9hY3Rpb25zL3JlZGFjdGlvbi5hY3Rpb25zJztcbmltcG9ydCAqIGFzIGZyb21SZWRhY3Rpb25BY3Rpb25zIGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMvcmVkYWN0aW9uLmFjdGlvbnMnO1xuaW1wb3J0ICogYXMgZnJvbVJlZGFBY3Rpb25zIGZyb20gJy4uLy4uL3N0b3JlL2FjdGlvbnMvcmVkYWN0aW9uLmFjdGlvbnMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uQW5ub3RhdGlvbiB9IGZyb20gJy4uLy4uL2Fubm90YXRpb25zL21vZGVscy9ldmVudC1zZWxlY3QubW9kZWwnO1xuaW1wb3J0IHsgVmlld2VyRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdmlld2Vycy92aWV3ZXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBSZWRhY3Rpb24gfSBmcm9tICcuLi9zZXJ2aWNlcy9yZWRhY3Rpb24ubW9kZWwnO1xuaW1wb3J0IHsgVG9vbGJhckV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3Rvb2xiYXIvdG9vbGJhci1ldmVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbXYtcmVkYWN0aW9ucycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZWRhY3Rpb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSB6b29tOiBudW1iZXI7XG4gIEBJbnB1dCgpIHJvdGF0ZTogbnVtYmVyO1xuXG4gIHJlZGFjdGlvbnNQZXJQYWdlJDogT2JzZXJ2YWJsZTxhbnk+OyAvLyB0b2RvIGFkZCB0eXBlXG4gIHNlbGVjdGVkUmVkYWN0aW9uJDogT2JzZXJ2YWJsZTxTZWxlY3Rpb25Bbm5vdGF0aW9uIHwge30+O1xuICByZWN0YW5nbGVzOiBSZWN0YW5nbGVbXTtcbiAgZHJhd01vZGU6IGJvb2xlYW47XG4gIGRvY3VtZW50SWQ6IHN0cmluZztcblxuICBwcml2YXRlICRzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBTdG9yZTxmcm9tU3RvcmUuU3RhdGU+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld2VyRXZlbnRzOiBWaWV3ZXJFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b29sYmFyRXZlbnRzOiBUb29sYmFyRXZlbnRTZXJ2aWNlKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGlvbnNQZXJQYWdlJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZnJvbVNlbGVjdG9ycy5nZXRSZWRhY3Rpb25zUGVyUGFnZSkpO1xuICAgIHRoaXMuc2VsZWN0ZWRSZWRhY3Rpb24kID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChmcm9tU2VsZWN0b3JzLmdldFNlbGVjdGVkKSk7XG4gICAgdGhpcy4kc3Vic2NyaXB0aW9uID0gdGhpcy50b29sYmFyRXZlbnRzLmRyYXdNb2RlU3ViamVjdC5zdWJzY3JpYmUoZHJhd01vZGUgPT4gdGhpcy5kcmF3TW9kZSA9IGRyYXdNb2RlKTtcbiAgICB0aGlzLiRzdWJzY3JpcHRpb24uYWRkKHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZnJvbVNlbGVjdG9ycy5nZXRSZWRhY3RlZERvY3VtZW50SW5mbyksIGZpbHRlcih2YWx1ZSA9PiAhIXZhbHVlKSlcbiAgICAgIC5zdWJzY3JpYmUocmVkYWN0ZWREb2NJbmZvID0+IHRoaXMuZG93bmxvYWREb2N1bWVudChyZWRhY3RlZERvY0luZm8pKSk7XG4gICAgdGhpcy4kc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGZyb21Eb2N1bWVudC5nZXREb2N1bWVudElkKSkuc3Vic2NyaWJlKGRvY0lkID0+IHRoaXMuZG9jdW1lbnRJZCA9IGRvY0lkKSk7XG4gICAgdGhpcy4kc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnZpZXdlckV2ZW50cy50ZXh0SGlnaGxpZ2h0LnN1YnNjcmliZShoaWdobGlnaHQgPT4gdGhpcy5tYXJrVGV4dFJlZGFjdGlvbihoaWdobGlnaHQpKSk7XG4gICAgdGhpcy50b29sYmFyRXZlbnRzLmFwcGx5UmVkYWN0VG9Eb2N1bWVudC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zdG9yZS5waXBlKHNlbGVjdChmcm9tUmVkYVNlbGVjdG9ycy5nZXRSZWRhY3Rpb25BcnJheSksIHRha2UoMSkpLnN1YnNjcmliZShyZWRhY3Rpb25zID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgZnJvbVJlZGFBY3Rpb25zLlJlZGFjdChyZWRhY3Rpb25zKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnRvb2xiYXJFdmVudHMuY2xlYXJBbGxSZWRhY3RNYXJrZXJzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBmcm9tUmVkYUFjdGlvbnMuVW5tYXJrQWxsKHRoaXMuZG9jdW1lbnRJZCkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4kc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBtYXJrVGV4dFJlZGFjdGlvbihoaWdobGlnaHQpIHtcbiAgICBjb25zdCByZWRhY3Rpb25IaWdobGlnaHQgPSBoaWdobGlnaHQucmVjdGFuZ2xlcztcbiAgICBpZiAocmVkYWN0aW9uSGlnaGxpZ2h0ICYmIHJlZGFjdGlvbkhpZ2hsaWdodC5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc2F2ZVJlZGFjdGlvbihoaWdobGlnaHQucGFnZSwgWy4uLnJlZGFjdGlvbkhpZ2hsaWdodF0pO1xuICAgIH1cbiAgICB0aGlzLnRvb2xiYXJFdmVudHMuaGlnaGxpZ2h0TW9kZVN1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBtYXJrQm94UmVkYWN0aW9uKHsgcmVjdGFuZ2xlcywgcGFnZSB9KSB7XG4gICAgdGhpcy5zYXZlUmVkYWN0aW9uKHBhZ2UsIHJlY3RhbmdsZXMpO1xuICAgIHRoaXMudG9vbGJhckV2ZW50cy5kcmF3TW9kZVN1YmplY3QubmV4dChmYWxzZSk7XG4gIH1cblxuICBzYXZlUmVkYWN0aW9uKHBhZ2U6IG51bWJlciwgcmVjdGFuZ2xlczogUmVjdGFuZ2xlW10pIHtcbiAgICBjb25zdCByZWRhY3Rpb24gPSB7IHBhZ2UsIHJlY3RhbmdsZXMsIHJlZGFjdGlvbklkOiB1dWlkKCksIGRvY3VtZW50SWQ6IHRoaXMuZG9jdW1lbnRJZCB9O1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IGZyb21SZWRhY3Rpb25BY3Rpb25zLlNhdmVSZWRhY3Rpb24ocmVkYWN0aW9uKSk7XG4gIH1cblxuICBvbk1hcmtlckRlbGV0ZShldmVudCkge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IGZyb21BY3Rpb25zLkRlbGV0ZVJlZGFjdGlvbihldmVudCkpO1xuICB9XG5cbiAgc2VsZWN0UmVkYWN0aW9uKGV2ZW50KSB7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgZnJvbUFjdGlvbnMuU2VsZWN0UmVkYWN0aW9uKGV2ZW50KSk7XG4gIH1cblxuICBvbk1hcmtlclVwZGF0ZShyZWRhY3Rpb246IFJlZGFjdGlvbikge1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IGZyb21BY3Rpb25zLlNhdmVSZWRhY3Rpb24ocmVkYWN0aW9uKSk7XG4gIH1cblxuICBkb3dubG9hZERvY3VtZW50KHsgYmxvYiwgZmlsZW5hbWUgfSkge1xuICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBhLmNsaWNrKCk7XG4gICAgYS5yZW1vdmUoKTtcbiAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgZnJvbVJlZGFjdGlvbkFjdGlvbnMuUmVzZXRSZWRhY3RlZERvY3VtZW50KCkpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicGFnZUNvbnRhaW5lclwiPlxuICA8ZGl2ICpuZ0Zvcj1cImxldCByZWRhY3Rpb24gb2YgKHJlZGFjdGlvbnNQZXJQYWdlJCB8IGFzeW5jKTsgIGluZGV4IGFzIGlcIlxuICAgICAgIGNsYXNzPVwicGFnZUNvbnRhaW5lcl9fcGFnZVwiXG4gICAgICAgW25nU3R5bGVdPVwie1xuICAgICAgICd3aWR0aC5weCc6IHJlZGFjdGlvbi5zdHlsZXMud2lkdGgsXG4gICAgICAgJ2hlaWdodC5weCc6IHJlZGFjdGlvbi5zdHlsZXMuaGVpZ2h0XG4gICAgICAgfVwiXG4gICAgICBbYXR0ci5yZWRhY3Rpb24tcGFnZS1udW1dPVwiaSsxXCJcbiAgICAgICBbbmdDbGFzc109XCJ7ICdwYWdlQ29udGFpbmVyX19wYWdlLS1kcmF3JyA6IGRyYXdNb2RlIH1cIj5cbiAgICA8bXYtYm94LWhpZ2hsaWdodC1jcmVhdGVcbiAgICAgIFtwYWdlXT1cImkgKyAxXCJcbiAgICAgIFtwYWdlSGVpZ2h0XT1cInJlZGFjdGlvbi5zdHlsZXMuaGVpZ2h0XCJcbiAgICAgIFtwYWdlV2lkdGhdPVwicmVkYWN0aW9uLnN0eWxlcy53aWR0aFwiXG4gICAgICBbcm90YXRlXT1cInJvdGF0ZVwiXG4gICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgIChzYXZlU2VsZWN0aW9uKT1cIm1hcmtCb3hSZWRhY3Rpb24oJGV2ZW50KVwiPlxuICAgIDwvbXYtYm94LWhpZ2hsaWdodC1jcmVhdGU+XG4gICAgPGRpdiBjbGFzcz1cInBhZ2VDb250YWluZXJfX3BhZ2UtaXRlbVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYW5ubyBvZiByZWRhY3Rpb24uYW5ub1wiPlxuICAgICAgICA8IS0tICBUT0RPIHJlbmFtZSB0aGlzIHRvIHNlbGVjdGlvbiAtLT5cbiAgICAgICAgPG12LWFubm90YXRpb24gW2Fubm90YXRpb25dPVwiYW5ub1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFt6b29tXT1cInpvb21cIlxuICAgICAgICAgICAgICAgICAgICAgICBbcm90YXRlXT1cInJvdGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZEFubm9JZF09XCJzZWxlY3RlZFJlZGFjdGlvbiQgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtwYWdlSGVpZ2h0XT1cInJlZGFjdGlvbi5zdHlsZXMuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgW3BhZ2VXaWR0aF09XCJyZWRhY3Rpb24uc3R5bGVzLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSk9XCJvbk1hcmtlclVwZGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZSk9XCJvbk1hcmtlckRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGFubm90YXRpb25DbGljayk9XCJzZWxlY3RSZWRhY3Rpb24oJGV2ZW50KVwiPlxuICAgICAgICA8L212LWFubm90YXRpb24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==