UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

265 lines 21.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewChildren, QueryList } from '@angular/core'; import { AnnotationStoreService } from '../../../data/annotation-store.service'; import { PdfService } from '../../../data/pdf.service'; import { Utils } from '../../../data/utils'; import { EmLoggerService } from '../../../logging/em-logger.service'; import { PdfRenderService } from '../../../data/pdf-render.service'; var CommentsComponent = /** @class */ (function () { function CommentsComponent(annotationStoreService, pdfService, utils, pdfRenderService, log) { this.annotationStoreService = annotationStoreService; this.pdfService = pdfService; this.utils = utils; this.pdfRenderService = pdfRenderService; this.log = log; this.log.setClass('CommentsComponent'); } /** * @return {?} */ CommentsComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.dataLoadedSub = this.pdfRenderService.getDataLoadedSub() .subscribe(function (isDataLoaded) { if (isDataLoaded) { _this.showAllComments(); _this.preRun(); } }); }; /** * @return {?} */ CommentsComponent.prototype.redrawCommentItemComponents = /** * @return {?} */ function () { var _this = this; setTimeout(function () { /** @type {?} */ var previousCommentItem; _this.sortCommentItemComponents().forEach(function (commentItem) { previousCommentItem = _this.isOverlapping(commentItem, previousCommentItem); }); }); }; /** * @return {?} */ CommentsComponent.prototype.sortCommentItemComponents = /** * @return {?} */ function () { var _this = this; return this.commentItems.map(function (commentItem) { return commentItem; }) .sort(function (a, b) { return _this.processSort(a, b); }); }; /** * @param {?} a * @param {?} b * @return {?} */ CommentsComponent.prototype.processSort = /** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { if (this.isAnnotationOnSameLine(a, b)) { if (a.annotationLeftPos < b.annotationLeftPos) { return -1; } if (a.annotationLeftPos >= b.annotationLeftPos) { return 1; } } if (a.annotationTopPos < b.annotationTopPos) { return -1; } if (a.annotationTopPos >= b.annotationTopPos) { return 1; } return 0; }; /** * @param {?} a * @param {?} b * @return {?} */ CommentsComponent.prototype.isAnnotationOnSameLine = /** * @param {?} a * @param {?} b * @return {?} */ function (a, b) { /** @type {?} */ var delta = (a.annotationHeight >= b.annotationHeight) ? a.annotationHeight : b.annotationHeight; if (this.utils.difference(a.annotationTopPos, b.annotationTopPos) > delta) { return false; } return true; }; /** * @param {?} commentItem * @param {?} previousCommentItem * @return {?} */ CommentsComponent.prototype.isOverlapping = /** * @param {?} commentItem * @param {?} previousCommentItem * @return {?} */ function (commentItem, previousCommentItem) { commentItem.commentTopPos = commentItem.annotationTopPos; if (previousCommentItem) { /** @type {?} */ var endOfPreviousCommentItem = (previousCommentItem.commentTopPos + previousCommentItem.commentHeight); if (commentItem.commentTopPos <= endOfPreviousCommentItem) { commentItem.commentTopPos = endOfPreviousCommentItem; } } return commentItem; }; /** * @return {?} */ CommentsComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.pageNumSub) { this.pageNumSub.unsubscribe(); } if (this.dataLoadedSub) { this.dataLoadedSub.unsubscribe(); } }; /** * @return {?} */ CommentsComponent.prototype.preRun = /** * @return {?} */ function () { var _this = this; this.pageNumSub = this.pdfService.getPageNumber().subscribe(function (pageNumber) { _this.pageNumber = pageNumber; }); }; /** * @return {?} */ CommentsComponent.prototype.showAllComments = /** * @return {?} */ function () { var _this = this; // todo - refactor this out of component this.annotations = []; for (var i = 0; i < this.pdfRenderService.getPdfPages() + 1; i++) { this.annotationStoreService.getAnnotationsForPage(i) .then(function (pageData) { _this.annotations = _this.annotations.concat(pageData.annotations.slice()); }); } }; /** * @return {?} */ CommentsComponent.prototype.handleAnnotationBlur = /** * @return {?} */ function () { this.showAllComments(); }; /** * @param {?} event * @return {?} */ CommentsComponent.prototype.handleAnnotationClick = /** * @param {?} event * @return {?} */ function (event) { var _this = this; /** @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); }); }; CommentsComponent.decorators = [ { type: Component, args: [{ selector: 'app-comments', template: "<div *ngIf=\"pageNumber\" id=\"comment-wrapper\">\n <div class=\"comment-list-container\">\n\n <div *ngFor=\"let annotation of annotations\" class=\"highlight-group\">\n <app-comment-item #commentItem\n *ngFor=\"let comment of annotation.comments\"\n [annotation]=\"annotation\"\n [comment]=\"comment\"\n (commentSubmitted)='showAllComments()'\n (commentRendered)='redrawCommentItemComponents()'\n ></app-comment-item>\n </div>\n </div>\n</div>\n", styles: ["#comment-wrapper{position:absolute;height:100%;width:380px;right:0;overflow:hidden;z-index:0;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-size:12px}#comment-wrapper .comment-list{font-size:12px;position:absolute;top:38px;left:0;right:0;bottom:0}#comment-wrapper .comment-list-container{position:absolute;top:0;left:0;right:0;bottom:47px;overflow-x:hidden;overflow-y:auto}"] }] } ]; CommentsComponent.ctorParameters = function () { return [ { type: AnnotationStoreService }, { type: PdfService }, { type: Utils }, { type: PdfRenderService }, { type: EmLoggerService } ]; }; CommentsComponent.propDecorators = { commentItems: [{ type: ViewChildren, args: ['commentItem',] }] }; return CommentsComponent; }()); export { CommentsComponent }; if (false) { /** * @type {?} * @private */ CommentsComponent.prototype.dataLoadedSub; /** @type {?} */ CommentsComponent.prototype.annotations; /** @type {?} */ CommentsComponent.prototype.pageNumber; /** * @type {?} * @private */ CommentsComponent.prototype.pageNumSub; /** @type {?} */ CommentsComponent.prototype.commentItems; /** * @type {?} * @private */ CommentsComponent.prototype.annotationStoreService; /** * @type {?} * @private */ CommentsComponent.prototype.pdfService; /** * @type {?} * @private */ CommentsComponent.prototype.utils; /** * @type {?} * @private */ CommentsComponent.prototype.pdfRenderService; /** * @type {?} * @private */ CommentsComponent.prototype.log; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL3ZpZXdlcnMvYW5ub3RhdGlvbi1wZGYtdmlld2VyL2NvbW1lbnRzL2NvbW1lbnRzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUVwRTtJQWFJLDJCQUFvQixzQkFBOEMsRUFDOUMsVUFBc0IsRUFDdEIsS0FBWSxFQUNaLGdCQUFrQyxFQUNsQyxHQUFvQjtRQUpwQiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUMzQyxDQUFDOzs7O0lBRUQsb0NBQVE7OztJQUFSO1FBQUEsaUJBUUM7UUFQRyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRTthQUN4RCxTQUFTLENBQUMsVUFBQSxZQUFZO1lBQ25CLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FB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ZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdDaGlsZHJlbiwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb21tZW50SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vY29tbWVudC1pdGVtL2NvbW1lbnQtaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbiB9IGZyb20gJy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS91dGlscyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlJlbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhL3BkZi1yZW5kZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNvbW1lbnRzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbW1lbnRzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudHNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIGRhdGFMb2FkZWRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBhbm5vdGF0aW9uczogQW5ub3RhdGlvbltdO1xuICAgIHBhZ2VOdW1iZXI6IG51bWJlcjtcbiAgICBwcml2YXRlIHBhZ2VOdW1TdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBAVmlld0NoaWxkcmVuKCdjb21tZW50SXRlbScpIGNvbW1lbnRJdGVtczogUXVlcnlMaXN0PENvbW1lbnRJdGVtQ29tcG9uZW50PjtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2cuc2V0Q2xhc3MoJ0NvbW1lbnRzQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1YiA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXREYXRhTG9hZGVkU3ViKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoaXNEYXRhTG9hZGVkID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEYXRhTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FsbENvbW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlUnVuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZWRyYXdDb21tZW50SXRlbUNvbXBvbmVudHMoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHByZXZpb3VzQ29tbWVudEl0ZW06IENvbW1lbnRJdGVtQ29tcG9uZW50O1xuICAgICAgICAgICAgdGhpcy5zb3J0Q29tbWVudEl0ZW1Db21wb25lbnRzKCkuZm9yRWFjaCgoY29tbWVudEl0ZW06IENvbW1lbnRJdGVtQ29tcG9uZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQ29tbWVudEl0ZW0gPSB0aGlzLmlzT3ZlcmxhcHBpbmcoY29tbWVudEl0ZW0sIHByZXZpb3VzQ29tbWVudEl0ZW0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzb3J0Q29tbWVudEl0ZW1Db21wb25lbnRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50SXRlbXMubWFwKChjb21tZW50SXRlbTogQ29tbWVudEl0ZW1Db21wb25lbnQpID0+IGNvbW1lbnRJdGVtKVxuICAgICAgICAgICAgLnNvcnQoKGE6IENvbW1lbnRJdGVtQ29tcG9uZW50LCBiOiBDb21tZW50SXRlbUNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NTb3J0KGEsIGIpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc1NvcnQoYTogQ29tbWVudEl0ZW1Db21wb25lbnQsIGI6IENvbW1lbnRJdGVtQ29tcG9uZW50KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuaXNBbm5vdGF0aW9uT25TYW1lTGluZShhLCBiKSkge1xuICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvbkxlZnRQb3MgPCBiLmFubm90YXRpb25MZWZ0UG9zKSB7IHJldHVybiAtMTsgfVxuICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvbkxlZnRQb3MgPj0gYi5hbm5vdGF0aW9uTGVmdFBvcykgeyByZXR1cm4gMTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhLmFubm90YXRpb25Ub3BQb3MgPCBiLmFubm90YXRpb25Ub3BQb3MpIHsgcmV0dXJuIC0xOyB9XG4gICAgICAgIGlmIChhLmFubm90YXRpb25Ub3BQb3MgPj0gYi5hbm5vdGF0aW9uVG9wUG9zKSB7IHJldHVybiAxOyB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgaXNBbm5vdGF0aW9uT25TYW1lTGluZShhOiBDb21tZW50SXRlbUNvbXBvbmVudCwgYjogQ29tbWVudEl0ZW1Db21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGVsdGEgPSAoYS5hbm5vdGF0aW9uSGVpZ2h0ID49IGIuYW5ub3RhdGlvbkhlaWdodCkgPyBhLmFubm90YXRpb25IZWlnaHQgOiBiLmFubm90YXRpb25IZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnV0aWxzLmRpZmZlcmVuY2UoYS5hbm5vdGF0aW9uVG9wUG9zLCBiLmFubm90YXRpb25Ub3BQb3MpID4gZGVsdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpc092ZXJsYXBwaW5nKGNvbW1lbnRJdGVtOiBDb21tZW50SXRlbUNvbXBvbmVudCwgcHJldmlvdXNDb21tZW50SXRlbTogQ29tbWVudEl0ZW1Db21wb25lbnQpOiBDb21tZW50SXRlbUNvbXBvbmVudCB7XG4gICAgICAgIGNvbW1lbnRJdGVtLmNvbW1lbnRUb3BQb3MgPSBjb21tZW50SXRlbS5hbm5vdGF0aW9uVG9wUG9zO1xuICAgICAgICBpZiAocHJldmlvdXNDb21tZW50SXRlbSkge1xuICAgICAgICAgICAgY29uc3QgZW5kT2ZQcmV2aW91c0NvbW1lbnRJdGVtID0gKHByZXZpb3VzQ29tbWVudEl0ZW0uY29tbWVudFRvcFBvcyArIHByZXZpb3VzQ29tbWVudEl0ZW0uY29tbWVudEhlaWdodCk7XG4gICAgICAgICAgICBpZiAoY29tbWVudEl0ZW0uY29tbWVudFRvcFBvcyA8PSBlbmRPZlByZXZpb3VzQ29tbWVudEl0ZW0pIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SXRlbS5jb21tZW50VG9wUG9zID0gZW5kT2ZQcmV2aW91c0NvbW1lbnRJdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50SXRlbTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZU51bVN1Yikge1xuICAgICAgICAgICAgdGhpcy5wYWdlTnVtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGF0YUxvYWRlZFN1Yikge1xuICAgICAgICAgICAgdGhpcy5kYXRhTG9hZGVkU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcmVSdW4oKSB7XG4gICAgICAgIHRoaXMucGFnZU51bVN1YiA9IHRoaXMucGRmU2VydmljZS5nZXRQYWdlTnVtYmVyKCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcGFnZU51bWJlciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlTnVtYmVyID0gcGFnZU51bWJlcjtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNob3dBbGxDb21tZW50cygpIHtcbiAgICAgICAgLy8gdG9kbyAtIHJlZmFjdG9yIHRoaXMgb3V0IG9mIGNvbXBvbmVudFxuICAgICAgICB0aGlzLmFubm90YXRpb25zID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFBkZlBhZ2VzKCkgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5nZXRBbm5vdGF0aW9uc0ZvclBhZ2UoaSlcbiAgICAgICAgICAgICAgICAudGhlbigocGFnZURhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25zID0gdGhpcy5hbm5vdGF0aW9ucy5jb25jYXQocGFnZURhdGEuYW5ub3RhdGlvbnMuc2xpY2UoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uQmx1cigpIHtcbiAgICAgICAgdGhpcy5zaG93QWxsQ29tbWVudHMoKTtcbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgY29uc3QgYW5ub3RhdGlvbklkID0gZXZlbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXBkZi1hbm5vdGF0ZS1pZCcpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbkJ5SWQoYW5ub3RhdGlvbklkKVxuICAgICAgICAgICAgLnRoZW4oKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdChhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEZvY3VzU3ViamVjdChhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0VG9vbEJhclVwZGF0ZShhbm5vdGF0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==