UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

334 lines 30.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChild, ElementRef, Input, ChangeDetectorRef, Renderer2 } from '@angular/core'; import { PdfService } from '../../data/pdf.service'; import { AnnotationStoreService } from '../../data/annotation-store.service'; import { Annotation } from '../../data/annotation-set.model'; import { NpaService } from '../../data/npa.service'; import { ApiHttpService } from '../../data/api-http.service'; import { Utils } from '../../data/utils'; import { PdfAnnotateWrapper } from '../../data/js-wrapper/pdf-annotate-wrapper'; import { CommentsComponent } from './comments/comments.component'; import { ContextualToolbarComponent } from './contextual-toolbar/contextual-toolbar.component'; import { EmLoggerService } from '../../logging/em-logger.service'; import { RenderOptions } from '../../data/js-wrapper/renderOptions.model'; import { PdfRenderService } from '../../data/pdf-render.service'; import { RotationFactoryService } from './rotation-toolbar/rotation-factory.service'; var AnnotationPdfViewerComponent = /** @class */ (function () { function AnnotationPdfViewerComponent(pdfService, npaService, apiHttpService, annotationStoreService, utils, ref, renderer, pdfAnnotateWrapper, pdfRenderService, rotationFactoryService, log) { this.pdfService = pdfService; this.npaService = npaService; this.apiHttpService = apiHttpService; this.annotationStoreService = annotationStoreService; this.utils = utils; this.ref = ref; this.renderer = renderer; this.pdfAnnotateWrapper = pdfAnnotateWrapper; this.pdfRenderService = pdfRenderService; this.rotationFactoryService = rotationFactoryService; this.log = log; this.rotationComponents = []; } /** * @return {?} */ AnnotationPdfViewerComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.loadAnnotations(this.annotate); this.pdfService.preRun(); this.pdfRenderService.setRenderOptions(new RenderOptions(this.url, null, parseFloat('1.33'), 0, [])); if (this.rotate) { this.pdfPageSubscription = this.pdfRenderService.listPagesSubject .subscribe(function (listPages) { _this.rotationComponents.forEach(function (rc) { return rc.destroy(); }); listPages.forEach(function (pageDetails) { _this.rotationComponents.push(_this.rotationFactoryService.addToDom(pageDetails)); }); }); } this.pdfRenderService.render(this.viewerElementRef); this.pdfService.setAnnotationWrapper(this.annotationWrapper); this.pageNumberSubscription = this.pdfService.getPageNumber() .subscribe(function (page) { return _this.page = page; }); this.focusedAnnotationSubscription = this.annotationStoreService.getAnnotationFocusSubject() .subscribe(function (focusedAnnotation) { return _this.focusHighlightStyle(focusedAnnotation); }); }; /** * @return {?} */ AnnotationPdfViewerComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { this.pdfAnnotateWrapper.getUi().addEventListener('annotation:click', this.handleAnnotationClick.bind(this)); }; /** * @return {?} */ AnnotationPdfViewerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.pageNumberSubscription) { this.pageNumberSubscription.unsubscribe(); } if (this.focusedAnnotationSubscription) { this.focusedAnnotationSubscription.unsubscribe(); } if (this.pdfPageSubscription) { this.pdfPageSubscription.unsubscribe(); } }; /** * @param {?} annotate * @return {?} */ AnnotationPdfViewerComponent.prototype.loadAnnotations = /** * @param {?} annotate * @return {?} */ function (annotate) { if (annotate) { this.log.info('annotations are enabled'); this.apiHttpService.setBaseUrl(this.baseUrl); this.annotationStoreService.preLoad(this.annotationSet); this.npaService.outputDmDocumentId.next(this.outputDmDocumentId); } else { this.log.info('annotations are disabled'); this.annotationStoreService.preLoad(null); } }; /** * @param {?} event * @param {?=} isPage * @return {?} */ AnnotationPdfViewerComponent.prototype.handleClick = /** * @param {?} event * @param {?=} isPage * @return {?} */ function (event, isPage) { if (this.annotate) { if (!this.utils.clickIsHighlight(event)) { this.unfocusAnnotation(); this.annotationStoreService.setToolBarUpdate(null, null); } this.commentsComponent.handleAnnotationBlur(); if (isPage) { this.pdfService.setPageNumber(this.utils.getClickedPage(event)); } } }; /** * @return {?} */ AnnotationPdfViewerComponent.prototype.renderComments = /** * @return {?} */ function () { this.unfocusAnnotation(); this.commentsComponent.showAllComments(); }; /** * @return {?} */ AnnotationPdfViewerComponent.prototype.unfocusAnnotation = /** * @return {?} */ function () { this.annotationStoreService.setAnnotationFocusSubject(new Annotation()); this.annotationStoreService.setCommentBtnSubject(null); this.annotationStoreService.setCommentFocusSubject(new Annotation(), null); }; /** * @param {?} event * @return {?} */ AnnotationPdfViewerComponent.prototype.handleAnnotationClick = /** * @param {?} event * @return {?} */ function (event) { var _this = this; if (!this.contextualToolbar.isShowToolbar) { /** @type {?} */ var annotationId = event.getAttribute('data-pdf-annotate-id'); this.annotationStoreService.getAnnotationById(annotationId) .then(function (annotation) { _this.annotationStoreService.setAnnotationFocusSubject(annotation); _this.annotationStoreService.setCommentFocusSubject(annotation); _this.annotationStoreService.setToolBarUpdate(annotation, true); }); } }; /** * @param {?} focusedAnnotation * @return {?} */ AnnotationPdfViewerComponent.prototype.focusHighlightStyle = /** * @param {?} focusedAnnotation * @return {?} */ function (focusedAnnotation) { var _this = this; Array.from(this.viewerElementRef.nativeElement.querySelector("#pageContainer" + this.page + " .annotationLayer").childNodes) .forEach(function (annotationDom) { if (annotationDom.dataset.pdfAnnotateId === focusedAnnotation.id) { _this.renderer.addClass(annotationDom, 'comment-selected'); } else { _this.renderer.removeClass(annotationDom, 'comment-selected'); } }); if (!this.ref['destroyed']) { this.ref.detectChanges(); } }; AnnotationPdfViewerComponent.decorators = [ { type: Component, args: [{ selector: 'app-annotation-pdf-viewer', template: "\n<app-comments (click)=\"handleClick($event, false)\" #commentsComponent\n *ngIf=\"annotate\"></app-comments>\n\n<div id=\"annotation-wrapper\" #annotationWrapper>\n <app-contextual-toolbar (deletedAnnotation)=\"renderComments()\" #contextualToolbar></app-contextual-toolbar>\n\n <div id=\"content-wrapper\"\n #contentWrapper\n (click)=\"handleClick($event, true)\">\n <div id=\"viewer\" #viewer class=\"pdfViewer\"></div>\n </div>\n</div>\n", styles: ["#annotation-wrapper{position:relative;width:100%}#content-wrapper{overflow:hidden}"] }] } ]; AnnotationPdfViewerComponent.ctorParameters = function () { return [ { type: PdfService }, { type: NpaService }, { type: ApiHttpService }, { type: AnnotationStoreService }, { type: Utils }, { type: ChangeDetectorRef }, { type: Renderer2 }, { type: PdfAnnotateWrapper }, { type: PdfRenderService }, { type: RotationFactoryService }, { type: EmLoggerService } ]; }; AnnotationPdfViewerComponent.propDecorators = { annotate: [{ type: Input }], dmDocumentId: [{ type: Input }], outputDmDocumentId: [{ type: Input }], url: [{ type: Input }], annotationSet: [{ type: Input }], baseUrl: [{ type: Input }], rotate: [{ type: Input }], contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }], viewerElementRef: [{ type: ViewChild, args: ['viewer',] }], annotationWrapper: [{ type: ViewChild, args: ['annotationWrapper',] }], commentsComponent: [{ type: ViewChild, args: ['commentsComponent',] }], contextualToolbar: [{ type: ViewChild, args: ['contextualToolbar',] }] }; return AnnotationPdfViewerComponent; }()); export { AnnotationPdfViewerComponent }; if (false) { /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotate; /** @type {?} */ AnnotationPdfViewerComponent.prototype.dmDocumentId; /** @type {?} */ AnnotationPdfViewerComponent.prototype.outputDmDocumentId; /** @type {?} */ AnnotationPdfViewerComponent.prototype.url; /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotationSet; /** @type {?} */ AnnotationPdfViewerComponent.prototype.baseUrl; /** @type {?} */ AnnotationPdfViewerComponent.prototype.rotate; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.page; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.focusedAnnotationSubscription; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pageNumberSubscription; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfPageSubscription; /** @type {?} */ AnnotationPdfViewerComponent.prototype.rotationComponents; /** @type {?} */ AnnotationPdfViewerComponent.prototype.contentWrapper; /** @type {?} */ AnnotationPdfViewerComponent.prototype.viewerElementRef; /** @type {?} */ AnnotationPdfViewerComponent.prototype.annotationWrapper; /** @type {?} */ AnnotationPdfViewerComponent.prototype.commentsComponent; /** @type {?} */ AnnotationPdfViewerComponent.prototype.contextualToolbar; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.npaService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.apiHttpService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.annotationStoreService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.utils; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.ref; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.renderer; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfAnnotateWrapper; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.pdfRenderService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.rotationFactoryService; /** * @type {?} * @private */ AnnotationPdfViewerComponent.prototype.log; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBeUMsTUFBTSxlQUFlLENBQUM7QUFFcEosT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBaUIsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUtyRjtJQTJCSSxzQ0FBb0IsVUFB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Q2hpbGQsIEVsZW1lbnRSZWYsIElucHV0LCBDaGFuZ2VEZXRlY3RvclJlZiwgUmVuZGVyZXIyLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIENvbXBvbmVudFJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7UGRmU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9wZGYuc2VydmljZSc7XG5pbXBvcnQge0Fubm90YXRpb25TdG9yZVNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7SUFubm90YXRpb25TZXQsIEFubm90YXRpb259IGZyb20gJy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHtOcGFTZXJ2aWNlfSBmcm9tICcuLi8uLi9kYXRhL25wYS5zZXJ2aWNlJztcbmltcG9ydCB7QXBpSHR0cFNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvYXBpLWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL2RhdGEvdXRpbHMnO1xuaW1wb3J0IHsgUGRmQW5ub3RhdGVXcmFwcGVyIH0gZnJvbSAnLi4vLi4vZGF0YS9qcy13cmFwcGVyL3BkZi1hbm5vdGF0ZS13cmFwcGVyJztcbmltcG9ydCB7IENvbW1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21tZW50cy9jb21tZW50cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGV4dHVhbFRvb2xiYXJDb21wb25lbnQgfSBmcm9tICcuL2NvbnRleHR1YWwtdG9vbGJhci9jb250ZXh0dWFsLXRvb2xiYXIuY29tcG9uZW50JztcbmltcG9ydCB7IEVtTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvZW0tbG9nZ2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVuZGVyT3B0aW9ucyB9IGZyb20gJy4uLy4uL2RhdGEvanMtd3JhcHBlci9yZW5kZXJPcHRpb25zLm1vZGVsJztcbmltcG9ydCB7IFBkZlJlbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9kYXRhL3BkZi1yZW5kZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSb3RhdGlvbkZhY3RvcnlTZXJ2aWNlIH0gZnJvbSAnLi9yb3RhdGlvbi10b29sYmFyL3JvdGF0aW9uLWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBSb3RhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vcm90YXRpb24tdG9vbGJhci9yb3RhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUm90YXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL3JvdGF0aW9uLWZhY3RvcnkubW9kZWwnO1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWFubm90YXRpb24tcGRmLXZpZXdlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Fubm90YXRpb24tcGRmLXZpZXdlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblBkZlZpZXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAgIEBJbnB1dCgpIGFubm90YXRlOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRtRG9jdW1lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG91dHB1dERtRG9jdW1lbnRJZDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFubm90YXRpb25TZXQ6IElBbm5vdGF0aW9uU2V0O1xuICAgIEBJbnB1dCgpIGJhc2VVcmw6IHN0cmluZztcbiAgICBASW5wdXQoKSByb3RhdGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHBhZ2U6IG51bWJlcjtcbiAgICBwcml2YXRlIGZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBwYWdlTnVtYmVyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBwZGZQYWdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcm90YXRpb25Db21wb25lbnRzOiBDb21wb25lbnRSZWY8Um90YXRpb25Db21wb25lbnQ+W10gPSBbXTtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbnRlbnRXcmFwcGVyJykgY29udGVudFdyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgndmlld2VyJykgdmlld2VyRWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdhbm5vdGF0aW9uV3JhcHBlcicpIGFubm90YXRpb25XcmFwcGVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRzQ29tcG9uZW50JykgY29tbWVudHNDb21wb25lbnQ6IENvbW1lbnRzQ29tcG9uZW50O1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRleHR1YWxUb29sYmFyJykgY29udGV4dHVhbFRvb2xiYXI6IENvbnRleHR1YWxUb29sYmFyQ29tcG9uZW50O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbnBhU2VydmljZTogTnBhU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwaUh0dHBTZXJ2aWNlOiBBcGlIdHRwU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFubm90YXRpb25TdG9yZVNlcnZpY2U6IEFubm90YXRpb25TdG9yZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZkFubm90YXRlV3JhcHBlcjogUGRmQW5ub3RhdGVXcmFwcGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmUmVuZGVyU2VydmljZTogUGRmUmVuZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJvdGF0aW9uRmFjdG9yeVNlcnZpY2U6IFJvdGF0aW9uRmFjdG9yeVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmxvYWRBbm5vdGF0aW9ucyh0aGlzLmFubm90YXRlKTtcbiAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLnByZVJ1bigpO1xuICAgICAgICB0aGlzLnBkZlJlbmRlclNlcnZpY2Uuc2V0UmVuZGVyT3B0aW9ucyhuZXcgUmVuZGVyT3B0aW9ucyhcbiAgICAgICAgICAgIHRoaXMudXJsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHBhcnNlRmxvYXQoJzEuMzMnKSxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICBbXVxuICAgICAgICApKTtcblxuICAgICAgICBpZiAodGhpcy5yb3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbiA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5saXN0UGFnZXNTdWJqZWN0XG4gICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3RQYWdlczogUm90YXRpb25Nb2RlbFtdKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbkNvbXBvbmVudHMuZm9yRWFjaChyYyA9PiByYy5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIGxpc3RQYWdlcy5mb3JFYWNoKHBhZ2VEZXRhaWxzID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Db21wb25lbnRzLnB1c2godGhpcy5yb3RhdGlvbkZhY3RvcnlTZXJ2aWNlLmFkZFRvRG9tKHBhZ2VEZXRhaWxzKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLnJlbmRlcih0aGlzLnZpZXdlckVsZW1lbnRSZWYpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0QW5ub3RhdGlvbldyYXBwZXIodGhpcy5hbm5vdGF0aW9uV3JhcHBlcik7XG5cbiAgICAgICAgdGhpcy5wYWdlTnVtYmVyU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZTZXJ2aWNlLmdldFBhZ2VOdW1iZXIoKVxuICAgICAgICAgICAgLnN1YnNjcmliZShwYWdlID0+IHRoaXMucGFnZSA9IHBhZ2UpO1xuICAgICAgICB0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uID0gdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldEFubm90YXRpb25Gb2N1c1N1YmplY3QoKVxuICAgICAgICAgICAgLnN1YnNjcmliZShmb2N1c2VkQW5ub3RhdGlvbiA9PiB0aGlzLmZvY3VzSGlnaGxpZ2h0U3R5bGUoZm9jdXNlZEFubm90YXRpb24pKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFVpKCkuYWRkRXZlbnRMaXN0ZW5lcignYW5ub3RhdGlvbjpjbGljaycsIHRoaXMuaGFuZGxlQW5ub3RhdGlvbkNsaWNrLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5wYWdlTnVtYmVyU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mb2N1c2VkQW5ub3RhdGlvblN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQW5ub3RhdGlvblN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnBkZlBhZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZEFubm90YXRpb25zKGFubm90YXRlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChhbm5vdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnYW5ub3RhdGlvbnMgYXJlIGVuYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMuYXBpSHR0cFNlcnZpY2Uuc2V0QmFzZVVybCh0aGlzLmJhc2VVcmwpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnByZUxvYWQodGhpcy5hbm5vdGF0aW9uU2V0KTtcbiAgICAgICAgICAgIHRoaXMubnBhU2VydmljZS5vdXRwdXREbURvY3VtZW50SWQubmV4dCh0aGlzLm91dHB1dERtRG9jdW1lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdhbm5vdGF0aW9ucyBhcmUgZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5wcmVMb2FkKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQ2xpY2soZXZlbnQ6IGFueSwgaXNQYWdlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5hbm5vdGF0ZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnV0aWxzLmNsaWNrSXNIaWdobGlnaHQoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRUb29sQmFyVXBkYXRlKG51bGwsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21tZW50c0NvbXBvbmVudC5oYW5kbGVBbm5vdGF0aW9uQmx1cigpO1xuXG4gICAgICAgICAgICBpZiAoaXNQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZGZTZXJ2aWNlLnNldFBhZ2VOdW1iZXIodGhpcy51dGlscy5nZXRDbGlja2VkUGFnZShldmVudCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVuZGVyQ29tbWVudHMoKSB7XG4gICAgICAgIHRoaXMudW5mb2N1c0Fubm90YXRpb24oKTtcbiAgICAgICAgdGhpcy5jb21tZW50c0NvbXBvbmVudC5zaG93QWxsQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICB1bmZvY3VzQW5ub3RhdGlvbigpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QobmV3IEFubm90YXRpb24oKSk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRDb21tZW50QnRuU3ViamVjdChudWxsKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRGb2N1c1N1YmplY3QobmV3IEFubm90YXRpb24oKSwgbnVsbCk7XG4gICAgfVxuXG4gICAgaGFuZGxlQW5ub3RhdGlvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy5jb250ZXh0dWFsVG9vbGJhci5pc1Nob3dUb29sYmFyKSB7XG4gICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uSWQgPSBldmVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcGRmLWFubm90YXRlLWlkJyk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbkJ5SWQoYW5ub3RhdGlvbklkKVxuICAgICAgICAgICAgICAgIC50aGVuKChhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRBbm5vdGF0aW9uRm9jdXNTdWJqZWN0KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEZvY3VzU3ViamVjdChhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldFRvb2xCYXJVcGRhdGUoYW5ub3RhdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb2N1c0hpZ2hsaWdodFN0eWxlKGZvY3VzZWRBbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSB7XG4gICAgICAgIEFycmF5LmZyb20odGhpcy52aWV3ZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgI3BhZ2VDb250YWluZXIke3RoaXMucGFnZX0gLmFubm90YXRpb25MYXllcmApLmNoaWxkTm9kZXMpXG4gICAgICAgICAgICAuZm9yRWFjaCgoYW5ub3RhdGlvbkRvbTogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRG9tLmRhdGFzZXQucGRmQW5ub3RhdGVJZCA9PT0gZm9jdXNlZEFubm90YXRpb24uaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhhbm5vdGF0aW9uRG9tLCAnY29tbWVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoYW5ub3RhdGlvbkRvbSwgJ2NvbW1lbnQtc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuIl19