@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
477 lines • 42.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectorRef, ElementRef, Renderer2 } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Annotation, Comment } from '../../../../data/annotation-set.model';
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 CommentItemComponent = /** @class */ (function () {
function CommentItemComponent(annotationStoreService, pdfService, pdfRenderService, ref, renderer, utils, log) {
this.annotationStoreService = annotationStoreService;
this.pdfService = pdfService;
this.pdfRenderService = pdfRenderService;
this.ref = ref;
this.renderer = renderer;
this.utils = utils;
this.log = log;
this.commentSubmitted = new EventEmitter();
this.commentRendered = new EventEmitter();
this.model = new Comment(null, null, null, null, null, null, null, null, null);
this.log.setClass('CommentItemComponent');
}
/**
* @return {?}
*/
CommentItemComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.hideButton = true;
this.focused = false;
this.sliceComment = this.comment.content;
this.commentFocusSub = this.annotationStoreService.getCommentFocusSubject()
.subscribe(function (options) {
if (options.annotation.id === _this.comment.annotationId) {
if (options.showButton) {
_this.onEdit();
}
else {
_this.handleShowBtn();
}
_this.ref.detectChanges();
}
else {
_this.onBlur();
}
});
this.commentBtnSub = this.annotationStoreService.getCommentBtnSubject()
.subscribe(function (commentId) {
(commentId === _this.comment.id) ? _this.handleShowBtn() : _this.handleHideBtn();
});
this.dataLoadedSub = this.pdfRenderService.getDataLoadedSub()
.subscribe(function (dataLoaded) {
if (dataLoaded) {
_this.annotationTopPos = _this.getRelativePosition(_this.comment.annotationId);
_this.commentTopPos = _this.annotationTopPos;
_this.utils.sortByX(_this.annotation.rectangles, true);
_this.annotationHeight = _this.utils.getAnnotationLineHeight(_this.annotation.rectangles);
_this.annotationLeftPos = _this.annotation.rectangles[0].x;
_this.commentRendered.emit(true);
_this.collapseComment();
}
});
this.commentItem.statusChanges.subscribe(function () {
if (_this.focused) {
_this.expandComment();
}
});
};
/**
* @return {?}
*/
CommentItemComponent.prototype.setHeight = /**
* @return {?}
*/
function () {
this.renderer.setStyle(this.commentArea.nativeElement, 'height', 'fit-content');
this.renderer.setStyle(this.commentArea.nativeElement, 'height', (this.commentArea.nativeElement.scrollHeight) + 'px');
this.commentHeight = this.commentSelector.nativeElement.getBoundingClientRect().height;
this.commentRendered.emit(true);
if (!this.ref['destroyed']) {
this.ref.detectChanges();
}
};
/**
* @return {?}
*/
CommentItemComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
if (this.commentFocusSub) {
this.commentFocusSub.unsubscribe();
}
if (this.commentBtnSub) {
this.commentBtnSub.unsubscribe();
}
if (this.dataLoadedSub) {
this.dataLoadedSub.unsubscribe();
}
};
/**
* @return {?}
*/
CommentItemComponent.prototype.onSubmit = /**
* @return {?}
*/
function () {
/** @type {?} */
var comment = this.convertFormToComment(this.commentItem);
this.annotationStoreService.editComment(comment);
this.commentSubmitted.emit(this.annotation);
this.viewOnly();
};
/**
* @return {?}
*/
CommentItemComponent.prototype.onEdit = /**
* @return {?}
*/
function () {
this.editOnly();
};
/**
* @return {?}
*/
CommentItemComponent.prototype.onCancel = /**
* @return {?}
*/
function () {
this.renderer.setProperty(this.commentArea.nativeElement, 'value', this.comment.content);
this.viewOnly();
};
/**
* @return {?}
*/
CommentItemComponent.prototype.viewOnly = /**
* @return {?}
*/
function () {
this.renderer.addClass(this.commentArea.nativeElement, 'view-mode');
this.focused = false;
};
/**
* @return {?}
*/
CommentItemComponent.prototype.editOnly = /**
* @return {?}
*/
function () {
this.focused = true;
this.renderer.removeClass(this.commentArea.nativeElement, 'view-mode');
};
/**
* @return {?}
*/
CommentItemComponent.prototype.isModified = /**
* @return {?}
*/
function () {
if (this.comment.createdDate === null) {
return false;
}
else if (this.comment.lastModifiedBy === null) {
return false;
}
else if (this.comment.createdDate === this.comment.lastModifiedDate) {
return false;
}
else {
return true;
}
};
/**
* @return {?}
*/
CommentItemComponent.prototype.onBlur = /**
* @return {?}
*/
function () {
if (!this.ref['destroyed']) {
this.ref.detectChanges();
}
};
/**
* @param {?} commentForm
* @return {?}
*/
CommentItemComponent.prototype.convertFormToComment = /**
* @param {?} commentForm
* @return {?}
*/
function (commentForm) {
return new Comment(this.comment.id, this.comment.annotationId, null, null, new Date(), null, null, null, commentForm.value.content);
};
/**
* @return {?}
*/
CommentItemComponent.prototype.handleDeleteComment = /**
* @return {?}
*/
function () {
this.annotationStoreService.deleteComment(this.comment.id);
};
/**
* @param {?} event
* @return {?}
*/
CommentItemComponent.prototype.handleCommentClick = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.stopPropagation();
this.annotationStoreService.setCommentBtnSubject(this.comment.id);
this.annotationStoreService.setAnnotationFocusSubject(this.annotation);
};
/**
* @return {?}
*/
CommentItemComponent.prototype.handleShowBtn = /**
* @return {?}
*/
function () {
var _this = this;
new Promise(function (resolve) {
_this.hideButton = false;
_this.expandComment();
resolve('Success');
}).then(function () {
_this.setHeight();
setTimeout(function () {
_this.commentArea.nativeElement.focus();
});
});
};
/**
* @return {?}
*/
CommentItemComponent.prototype.handleHideBtn = /**
* @return {?}
*/
function () {
var _this = this;
new Promise(function (resolve) {
if (!_this.commentItem.value.content) {
_this.annotationStoreService.deleteComment(_this.comment.id);
}
_this.focused = false;
_this.hideButton = true;
_this.collapseComment();
resolve('Success');
}).then(function () {
_this.setHeight();
});
};
/**
* @return {?}
*/
CommentItemComponent.prototype.collapseComment = /**
* @return {?}
*/
function () {
var _this = this;
new Promise(function (resolve) {
_this.expandComment();
resolve('Success');
}).then(function () {
if (!_this.isCommentEmpty()) {
_this.shrinkComment();
}
_this.renderer.addClass(_this.commentArea.nativeElement, 'collapsed');
_this.renderer.removeClass(_this.commentArea.nativeElement, 'expanded');
_this.renderer.addClass(_this.detailsWrapper.nativeElement, 'collapsed');
_this.renderer.addClass(_this.commentArea.nativeElement, 'view-mode');
_this.setHeight();
});
};
/**
* @return {?}
*/
CommentItemComponent.prototype.isCommentEmpty = /**
* @return {?}
*/
function () {
return this.comment.content === null;
};
/**
* @return {?}
*/
CommentItemComponent.prototype.isShrinkable = /**
* @return {?}
*/
function () {
return this.commentArea.nativeElement.scrollHeight > 31;
};
/**
* @return {?}
*/
CommentItemComponent.prototype.shrinkComment = /**
* @return {?}
*/
function () {
if (this.isShrinkable()) {
this.sliceComment = this.removeMultipleLines().slice(0, 20) + '...';
}
};
/**
* @return {?}
*/
CommentItemComponent.prototype.removeMultipleLines = /**
* @return {?}
*/
function () {
return this.comment.content.split('\n').join(' ');
};
/**
* @return {?}
*/
CommentItemComponent.prototype.expandComment = /**
* @return {?}
*/
function () {
this.renderer.addClass(this.commentArea.nativeElement, 'expanded');
this.renderer.removeClass(this.commentArea.nativeElement, 'collapsed');
this.renderer.removeClass(this.detailsWrapper.nativeElement, 'collapsed');
this.renderer.addClass(this.detailsWrapper.nativeElement, 'expanded');
this.sliceComment = this.comment.content;
this.setHeight();
};
/**
* @param {?} annotationId
* @return {?}
*/
CommentItemComponent.prototype.getRelativePosition = /**
* @param {?} annotationId
* @return {?}
*/
function (annotationId) {
/** @type {?} */
var svgSelector = this.pdfRenderService.getViewerElementRef().nativeElement
.querySelector("g[data-pdf-annotate-id=\"" + annotationId + "\"]");
if (svgSelector === null) {
return null;
}
else {
/** @type {?} */
var highlightRect = (/** @type {?} */ (svgSelector.getBoundingClientRect()));
/** @type {?} */
var wrapperRect = (/** @type {?} */ (this.pdfService.getAnnotationWrapper().nativeElement.getBoundingClientRect()));
return (highlightRect.y - wrapperRect.top);
}
};
CommentItemComponent.decorators = [
{ type: Component, args: [{
selector: 'app-comment-item',
template: "<form class=\"aui-comment comment-list-item\"\n (ngSubmit)=\"onSubmit()\"\n #commentSelector\n #commentItem=\"ngForm\"\n (click)=\"handleCommentClick($event)\"\n [style.top.px]=\"commentTopPos\">\n <div #detailsWrapper id=\"detailsWrapper\" class=\"aui-comment__header\">\n <span *ngIf=\"comment.createdByDetails\" class=\"aui-comment__author\">{{comment.createdByDetails.forename}} {{comment.createdByDetails.surname}}</span>\n <time #commentDate class=\"aui-comment__meta\" ng-controller=\"datCtrl\">{{ comment.createdDate | date: 'd MMMM y h:mm a' }}</time>\n <div *ngIf=\"false\">\n <span>modified By: {{comment.lastModifiedByDetails.forename}} {{comment.lastModifiedByDetails.surname}}</span>\n <time class=\"aui-comment__meta\" ng-controller=\"datCtrl\"><br>{{ comment.lastModifiedDate | date: 'd MMMM y h:mm a' }}</time>\n </div>\n </div>\n\n <textarea\n #commentArea\n (blur)=\"onBlur()\"\n type=\"text\"\n [class.mimic-focus]=\"focused\"\n class=\"aui-comment__content form-control mimic-focus view-mode\"\n required\n [ngModel]=\"sliceComment\" name=\"content\"\n value=\"comment.content\"\n [readonly]=\"!focused\"></textarea>\n\n <div [hidden]=\"hideButton\" class=\"aui-comment__footer commentBtns\">\n <button *ngIf=\"focused\" type=\"submit\" class=\"govuk-button\" role=\"button\">Save</button>\n <button *ngIf=\"!focused\" (click)=\"onEdit()\" class=\"govuk-button\" role=\"button\">Edit</button>\n <button\n *ngIf=\"!focused\"\n class=\"govuk-button hmcts hmcts-button--secondary\"\n role=\"button\"\n (click)=\"handleDeleteComment()\">Delete</button>\n <button\n *ngIf=\"focused\"\n class=\"govuk-button hmcts hmcts-button--secondary\"\n role=\"button\"\n (click)=\"onCancel()\">Cancel</button>\n </div>\n</form>\n",
styles: ["form{width:95%;margin-bottom:5px;position:absolute;background-color:#fff;padding:20px 20px 0}form textarea{width:95%;padding:2px;border:none;font-size:17px;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-weight:400;overflow:hidden;resize:none}.mimic-focus{outline-offset:-2px;outline:#0b0c0c auto 5px}textarea.view-mode:focus{outline:0}#detailsWrapper{padding:0}#detailsWrapper.expanded{margin-bottom:15px}.commentBtns{height:50px}.expanded{margin-top:0}.collapsed{height:30px}textarea.expanded{margin-bottom:10px}textarea.collapsed{margin-top:-25px;max-height:20px}.collapsed>time{display:none}"]
}] }
];
CommentItemComponent.ctorParameters = function () { return [
{ type: AnnotationStoreService },
{ type: PdfService },
{ type: PdfRenderService },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: Utils },
{ type: EmLoggerService }
]; };
CommentItemComponent.propDecorators = {
comment: [{ type: Input }],
annotation: [{ type: Input }],
commentSubmitted: [{ type: Output }],
commentRendered: [{ type: Output }],
commentSelector: [{ type: ViewChild, args: ['commentSelector',] }],
commentArea: [{ type: ViewChild, args: ['commentArea',] }],
commentItem: [{ type: ViewChild, args: ['commentItem',] }],
detailsWrapper: [{ type: ViewChild, args: ['detailsWrapper',] }],
commentDate: [{ type: ViewChild, args: ['commentDate',] }]
};
return CommentItemComponent;
}());
export { CommentItemComponent };
if (false) {
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.commentBtnSub;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.commentFocusSub;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.dataLoadedSub;
/** @type {?} */
CommentItemComponent.prototype.hideButton;
/** @type {?} */
CommentItemComponent.prototype.focused;
/** @type {?} */
CommentItemComponent.prototype.sliceComment;
/** @type {?} */
CommentItemComponent.prototype.comment;
/** @type {?} */
CommentItemComponent.prototype.annotation;
/** @type {?} */
CommentItemComponent.prototype.commentSubmitted;
/** @type {?} */
CommentItemComponent.prototype.commentRendered;
/** @type {?} */
CommentItemComponent.prototype.commentSelector;
/** @type {?} */
CommentItemComponent.prototype.commentArea;
/** @type {?} */
CommentItemComponent.prototype.commentItem;
/** @type {?} */
CommentItemComponent.prototype.detailsWrapper;
/** @type {?} */
CommentItemComponent.prototype.commentDate;
/** @type {?} */
CommentItemComponent.prototype.model;
/** @type {?} */
CommentItemComponent.prototype.commentTopPos;
/** @type {?} */
CommentItemComponent.prototype.commentHeight;
/** @type {?} */
CommentItemComponent.prototype.annotationTopPos;
/** @type {?} */
CommentItemComponent.prototype.annotationLeftPos;
/** @type {?} */
CommentItemComponent.prototype.annotationHeight;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.annotationStoreService;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.pdfService;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.pdfRenderService;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.ref;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.utils;
/**
* @type {?}
* @private
*/
CommentItemComponent.prototype.log;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9jb21tZW50cy9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWEsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RTtJQWdDSSw4QkFBb0Isc0JBQThDLEVBQzlDLFVBQXNCLEVBQ3RCLGdCQUFrQyxFQUNsQyxHQUFzQixFQUN0QixRQUFtQixFQUNuQixLQUFZLEVBQ1osR0FBb0I7UUFOcEIsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixVQUFLLEdBQUws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LGdEQUF3RTs7SUFDeEUsK0NBQXVFOztJQUN2RSwrQ0FBMEQ7O0lBQzFELDJDQUFrRDs7SUFDbEQsMkNBQThDOztJQUM5Qyw4Q0FBd0Q7O0lBQ3hELDJDQUFrRDs7SUFFbEQscUNBQTBFOztJQUMxRSw2Q0FBc0I7O0lBQ3RCLDZDQUFzQjs7SUFDdEIsZ0RBQXlCOztJQUN6QixpREFBMEI7O0lBQzFCLGdEQUF5Qjs7Ozs7SUFFYixzREFBc0Q7Ozs7O0lBQ3RELDBDQUE4Qjs7Ozs7SUFDOUIsZ0RBQTBDOzs7OztJQUMxQyxtQ0FBOEI7Ozs7O0lBQzlCLHdDQUEyQjs7Ozs7SUFDM0IscUNBQW9COzs7OztJQUNwQixtQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiwgUmVuZGVyZXIyfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TmdGb3JtfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFubm90YXRpb24sIENvbW1lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL2Fubm90YXRpb24tc2V0Lm1vZGVsJztcbmltcG9ydCB7IEFubm90YXRpb25TdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL2Fubm90YXRpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS9wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEvdXRpbHMnO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS9wZGYtcmVuZGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jb21tZW50LWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LWl0ZW0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbW1lbnQtaXRlbS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRJdGVtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBjb21tZW50QnRuU3ViOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBjb21tZW50Rm9jdXNTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGRhdGFMb2FkZWRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBoaWRlQnV0dG9uOiBib29sZWFuO1xuICAgIGZvY3VzZWQ6IGJvb2xlYW47XG4gICAgc2xpY2VDb21tZW50OiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBjb21tZW50OiBDb21tZW50O1xuICAgIEBJbnB1dCgpIGFubm90YXRpb246IEFubm90YXRpb247XG5cbiAgICBAT3V0cHV0KCkgY29tbWVudFN1Ym1pdHRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgY29tbWVudFJlbmRlcmVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRTZWxlY3RvcicpIGNvbW1lbnRTZWxlY3RvcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdjb21tZW50QXJlYScpIGNvbW1lbnRBcmVhOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRJdGVtJykgY29tbWVudEl0ZW06IE5nRm9ybTtcbiAgICBAVmlld0NoaWxkKCdkZXRhaWxzV3JhcHBlcicpIGRldGFpbHNXcmFwcGVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnREYXRlJykgY29tbWVudERhdGU6IEVsZW1lbnRSZWY7XG4gICAgXG4gICAgbW9kZWwgPSBuZXcgQ29tbWVudChudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTtcbiAgICBjb21tZW50VG9wUG9zOiBudW1iZXI7XG4gICAgY29tbWVudEhlaWdodDogbnVtYmVyO1xuICAgIGFubm90YXRpb25Ub3BQb3M6IG51bWJlcjtcbiAgICBhbm5vdGF0aW9uTGVmdFBvczogbnVtYmVyO1xuICAgIGFubm90YXRpb25IZWlnaHQ6IG51bWJlcjtcbiAgICBcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFubm90YXRpb25TdG9yZVNlcnZpY2U6IEFubm90YXRpb25TdG9yZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmUmVuZGVyU2VydmljZTogUGRmUmVuZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5sb2cuc2V0Q2xhc3MoJ0NvbW1lbnRJdGVtQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaGlkZUJ1dHRvbiA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNsaWNlQ29tbWVudCA9IHRoaXMuY29tbWVudC5jb250ZW50O1xuXG4gICAgICAgIHRoaXMuY29tbWVudEZvY3VzU3ViID0gdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldENvbW1lbnRGb2N1c1N1YmplY3QoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmFubm90YXRpb24uaWQgPT09IHRoaXMuY29tbWVudC5hbm5vdGF0aW9uSWQpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5zaG93QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRWRpdCgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTaG93QnRuKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQmx1cigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50QnRuU3ViID0gdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldENvbW1lbnRCdG5TdWJqZWN0KClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGNvbW1lbnRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIChjb21tZW50SWQgPT09IHRoaXMuY29tbWVudC5pZCkgPyB0aGlzLmhhbmRsZVNob3dCdG4oKSA6IHRoaXMuaGFuZGxlSGlkZUJ0bigpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1YiA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXREYXRhTG9hZGVkU3ViKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoIChkYXRhTG9hZGVkOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uVG9wUG9zID0gdGhpcy5nZXRSZWxhdGl2ZVBvc2l0aW9uKHRoaXMuY29tbWVudC5hbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRUb3BQb3MgPSB0aGlzLmFubm90YXRpb25Ub3BQb3M7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbHMuc29ydEJ5WCh0aGlzLmFubm90YXRpb24ucmVjdGFuZ2xlcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkhlaWdodCA9IHRoaXMudXRpbHMuZ2V0QW5ub3RhdGlvbkxpbmVIZWlnaHQodGhpcy5hbm5vdGF0aW9uLnJlY3RhbmdsZXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25MZWZ0UG9zID0gdGhpcy5hbm5vdGF0aW9uLnJlY3RhbmdsZXNbMF0ueDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21tZW50UmVuZGVyZWQuZW1pdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUNvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRJdGVtLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHBhbmRDb21tZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHNldEhlaWdodCgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCAnZml0LWNvbnRlbnQnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCAodGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCkgKyAncHgnKTtcbiAgICAgICAgdGhpcy5jb21tZW50SGVpZ2h0ID0gIHRoaXMuY29tbWVudFNlbGVjdG9yLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbW1lbnRSZW5kZXJlZC5lbWl0KHRydWUpO1xuICAgICAgICBpZiAoIXRoaXMucmVmWydkZXN0cm95ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnRGb2N1c1N1Yikge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50Rm9jdXNTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb21tZW50QnRuU3ViKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRCdG5TdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kYXRhTG9hZGVkU3ViKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWRTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU3VibWl0KCkge1xuICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5jb252ZXJ0Rm9ybVRvQ29tbWVudCh0aGlzLmNvbW1lbnRJdGVtKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmVkaXRDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICB0aGlzLmNvbW1lbnRTdWJtaXR0ZWQuZW1pdCh0aGlzLmFubm90YXRpb24pO1xuXG4gICAgICAgIHRoaXMudmlld09ubHkoKTtcbiAgICB9XG5cbiAgICBvbkVkaXQoKSB7XG4gICAgICAgIHRoaXMuZWRpdE9ubHkoKTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuY29tbWVudC5jb250ZW50KTtcbiAgICAgICAgdGhpcy52aWV3T25seSgpO1xuICAgIH1cblxuICAgIHZpZXdPbmx5KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ3ZpZXctbW9kZScpO1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBlZGl0T25seSgpIHtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICd2aWV3LW1vZGUnKTtcbiAgICB9XG5cbiAgICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jb21tZW50LmNyZWF0ZWREYXRlID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tZW50Lmxhc3RNb2RpZmllZEJ5ID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb21tZW50LmNyZWF0ZWREYXRlID09PSB0aGlzLmNvbW1lbnQubGFzdE1vZGlmaWVkRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkJsdXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWZbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb252ZXJ0Rm9ybVRvQ29tbWVudChjb21tZW50Rm9ybTogTmdGb3JtKTogQ29tbWVudCB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tbWVudChcbiAgICAgICAgICAgIHRoaXMuY29tbWVudC5pZCxcbiAgICAgICAgICAgIHRoaXMuY29tbWVudC5hbm5vdGF0aW9uSWQsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG5ldyBEYXRlKCksXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBjb21tZW50Rm9ybS52YWx1ZS5jb250ZW50XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaGFuZGxlRGVsZXRlQ29tbWVudCgpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQodGhpcy5jb21tZW50LmlkKTtcbiAgICB9XG5cbiAgICBoYW5kbGVDb21tZW50Q2xpY2soZXZlbnQ6IGFueSkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRCdG5TdWJqZWN0KHRoaXMuY29tbWVudC5pZCk7XG4gICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRBbm5vdGF0aW9uRm9jdXNTdWJqZWN0KHRoaXMuYW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgaGFuZGxlU2hvd0J0bigpIHtcbiAgICAgICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhpZGVCdXR0b24gPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kQ29tbWVudCgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgnU3VjY2VzcycpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBoYW5kbGVIaWRlQnRuKCkge1xuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb21tZW50SXRlbS52YWx1ZS5jb250ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmRlbGV0ZUNvbW1lbnQodGhpcy5jb21tZW50LmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5oaWRlQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuY29sbGFwc2VDb21tZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKCdTdWNjZXNzJyk7XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29sbGFwc2VDb21tZW50KCkge1xuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXhwYW5kQ29tbWVudCgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgnU3VjY2VzcycpO1xuICAgICAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0NvbW1lbnRFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaHJpbmtDb21tZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICdleHBhbmRlZCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmRldGFpbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdjb2xsYXBzZWQnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAndmlldy1tb2RlJyk7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzQ29tbWVudEVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50LmNvbnRlbnQgPT09IG51bGw7XG4gICAgfVxuICAgIFxuICAgIGlzU2hyaW5rYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudC5zY3JvbGxIZWlnaHQgPiAzMTtcbiAgICB9XG5cbiAgICBzaHJpbmtDb21tZW50KCkge1xuICAgICAgICBpZiAodGhpcy5pc1Nocmlua2FibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5zbGljZUNvbW1lbnQgPSB0aGlzLnJlbW92ZU11bHRpcGxlTGluZXMoKS5zbGljZSgwLCAyMCkgKyAnLi4uJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZU11bHRpcGxlTGluZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudC5jb250ZW50LnNwbGl0KCdcXG4nKS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgZXhwYW5kQ29tbWVudCgpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICdleHBhbmRlZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuZGV0YWlsc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZGV0YWlsc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2V4cGFuZGVkJyk7XG5cbiAgICAgICAgdGhpcy5zbGljZUNvbW1lbnQgPSB0aGlzLmNvbW1lbnQuY29udGVudDtcbiAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICB9XG5cbiAgICBnZXRSZWxhdGl2ZVBvc2l0aW9uKGFubm90YXRpb25JZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qgc3ZnU2VsZWN0b3IgPSB0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0Vmlld2VyRWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoYGdbZGF0YS1wZGYtYW5ub3RhdGUtaWQ9XCIke2Fubm90YXRpb25JZH1cIl1gKTtcbiAgICAgICAgaWYgKHN2Z1NlbGVjdG9yID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodFJlY3QgPSA8RE9NUmVjdD4gc3ZnU2VsZWN0b3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyUmVjdCA9IDxET01SZWN0PiB0aGlzLnBkZlNlcnZpY2UuZ2V0QW5ub3RhdGlvbldyYXBwZXIoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICByZXR1cm4gKGhpZ2hsaWdodFJlY3QueSAtIHdyYXBwZXJSZWN0LnRvcCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=