@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
411 lines • 40.4 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';
export class CommentItemComponent {
/**
* @param {?} annotationStoreService
* @param {?} pdfService
* @param {?} pdfRenderService
* @param {?} ref
* @param {?} renderer
* @param {?} utils
* @param {?} log
*/
constructor(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 {?}
*/
ngOnInit() {
this.hideButton = true;
this.focused = false;
this.sliceComment = this.comment.content;
this.commentFocusSub = this.annotationStoreService.getCommentFocusSubject()
.subscribe((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((commentId) => {
(commentId === this.comment.id) ? this.handleShowBtn() : this.handleHideBtn();
});
this.dataLoadedSub = this.pdfRenderService.getDataLoadedSub()
.subscribe((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(() => {
if (this.focused) {
this.expandComment();
}
});
}
/**
* @return {?}
*/
setHeight() {
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 {?}
*/
ngOnDestroy() {
if (this.commentFocusSub) {
this.commentFocusSub.unsubscribe();
}
if (this.commentBtnSub) {
this.commentBtnSub.unsubscribe();
}
if (this.dataLoadedSub) {
this.dataLoadedSub.unsubscribe();
}
}
/**
* @return {?}
*/
onSubmit() {
/** @type {?} */
const comment = this.convertFormToComment(this.commentItem);
this.annotationStoreService.editComment(comment);
this.commentSubmitted.emit(this.annotation);
this.viewOnly();
}
/**
* @return {?}
*/
onEdit() {
this.editOnly();
}
/**
* @return {?}
*/
onCancel() {
this.renderer.setProperty(this.commentArea.nativeElement, 'value', this.comment.content);
this.viewOnly();
}
/**
* @return {?}
*/
viewOnly() {
this.renderer.addClass(this.commentArea.nativeElement, 'view-mode');
this.focused = false;
}
/**
* @return {?}
*/
editOnly() {
this.focused = true;
this.renderer.removeClass(this.commentArea.nativeElement, 'view-mode');
}
/**
* @return {?}
*/
isModified() {
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 {?}
*/
onBlur() {
if (!this.ref['destroyed']) {
this.ref.detectChanges();
}
}
/**
* @param {?} commentForm
* @return {?}
*/
convertFormToComment(commentForm) {
return new Comment(this.comment.id, this.comment.annotationId, null, null, new Date(), null, null, null, commentForm.value.content);
}
/**
* @return {?}
*/
handleDeleteComment() {
this.annotationStoreService.deleteComment(this.comment.id);
}
/**
* @param {?} event
* @return {?}
*/
handleCommentClick(event) {
event.stopPropagation();
this.annotationStoreService.setCommentBtnSubject(this.comment.id);
this.annotationStoreService.setAnnotationFocusSubject(this.annotation);
}
/**
* @return {?}
*/
handleShowBtn() {
new Promise(resolve => {
this.hideButton = false;
this.expandComment();
resolve('Success');
}).then(() => {
this.setHeight();
setTimeout(() => {
this.commentArea.nativeElement.focus();
});
});
}
/**
* @return {?}
*/
handleHideBtn() {
new Promise(resolve => {
if (!this.commentItem.value.content) {
this.annotationStoreService.deleteComment(this.comment.id);
}
this.focused = false;
this.hideButton = true;
this.collapseComment();
resolve('Success');
}).then(() => {
this.setHeight();
});
}
/**
* @return {?}
*/
collapseComment() {
new Promise(resolve => {
this.expandComment();
resolve('Success');
}).then(() => {
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 {?}
*/
isCommentEmpty() {
return this.comment.content === null;
}
/**
* @return {?}
*/
isShrinkable() {
return this.commentArea.nativeElement.scrollHeight > 31;
}
/**
* @return {?}
*/
shrinkComment() {
if (this.isShrinkable()) {
this.sliceComment = this.removeMultipleLines().slice(0, 20) + '...';
}
}
/**
* @return {?}
*/
removeMultipleLines() {
return this.comment.content.split('\n').join(' ');
}
/**
* @return {?}
*/
expandComment() {
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 {?}
*/
getRelativePosition(annotationId) {
/** @type {?} */
const svgSelector = this.pdfRenderService.getViewerElementRef().nativeElement
.querySelector(`g[data-pdf-annotate-id="${annotationId}"]`);
if (svgSelector === null) {
return null;
}
else {
/** @type {?} */
const highlightRect = (/** @type {?} */ (svgSelector.getBoundingClientRect()));
/** @type {?} */
const 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 = () => [
{ 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',] }]
};
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9jb21tZW50cy9jb21tZW50LWl0ZW0vY29tbWVudC1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLFNBQVMsRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQWEsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3SSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU92RSxNQUFNOzs7Ozs7Ozs7O0lBMkJGLFlBQW9CLHNCQUE4QyxFQUM5QyxVQUFzQixFQUN0QixnQkFBa0MsRUFDbEMsR0FBc0IsRUFDdEIsUUFBbUIsRUFDbkIsS0FBWSxFQUNaLEdBQW9CO1FBTnBCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFD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MUIsZ0RBQXlCOzs7OztJQUViLHNEQUFzRDs7Ozs7SUFDdEQsMENBQThCOzs7OztJQUM5QixnREFBMEM7Ozs7O0lBQzFDLG1DQUE4Qjs7Ozs7SUFDOUIsd0NBQTJCOzs7OztJQUMzQixxQ0FBb0I7Ozs7O0lBQ3BCLG1DQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBSZW5kZXJlcjJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbiwgQ29tbWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zZXQubW9kZWwnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGF0YS91dGlscyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFBkZlJlbmRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhL3BkZi1yZW5kZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWNvbW1lbnQtaXRlbScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnQtaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tbWVudC1pdGVtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudEl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwcml2YXRlIGNvbW1lbnRCdG5TdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGNvbW1lbnRGb2N1c1N1YjogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZGF0YUxvYWRlZFN1YjogU3Vic2NyaXB0aW9uO1xuICAgIGhpZGVCdXR0b246IGJvb2xlYW47XG4gICAgZm9jdXNlZDogYm9vbGVhbjtcbiAgICBzbGljZUNvbW1lbnQ6IHN0cmluZztcblxuICAgIEBJbnB1dCgpIGNvbW1lbnQ6IENvbW1lbnQ7XG4gICAgQElucHV0KCkgYW5ub3RhdGlvbjogQW5ub3RhdGlvbjtcblxuICAgIEBPdXRwdXQoKSBjb21tZW50U3VibWl0dGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBjb21tZW50UmVuZGVyZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudFNlbGVjdG9yJykgY29tbWVudFNlbGVjdG9yOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRBcmVhJykgY29tbWVudEFyZWE6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudEl0ZW0nKSBjb21tZW50SXRlbTogTmdGb3JtO1xuICAgIEBWaWV3Q2hpbGQoJ2RldGFpbHNXcmFwcGVyJykgZGV0YWlsc1dyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudERhdGUnKSBjb21tZW50RGF0ZTogRWxlbWVudFJlZjtcbiAgICBcbiAgICBtb2RlbCA9IG5ldyBDb21tZW50KG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpO1xuICAgIGNvbW1lbnRUb3BQb3M6IG51bWJlcjtcbiAgICBjb21tZW50SGVpZ2h0OiBudW1iZXI7XG4gICAgYW5ub3RhdGlvblRvcFBvczogbnVtYmVyO1xuICAgIGFubm90YXRpb25MZWZ0UG9zOiBudW1iZXI7XG4gICAgYW5ub3RhdGlvbkhlaWdodDogbnVtYmVyO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSkge1xuICAgICAgICB0aGlzLmxvZy5zZXRDbGFzcygnQ29tbWVudEl0ZW1Db21wb25lbnQnKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5oaWRlQnV0dG9uID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2xpY2VDb21tZW50ID0gdGhpcy5jb21tZW50LmNvbnRlbnQ7XG5cbiAgICAgICAgdGhpcy5jb21tZW50Rm9jdXNTdWIgPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0Q29tbWVudEZvY3VzU3ViamVjdCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5ub3RhdGlvbi5pZCA9PT0gdGhpcy5jb21tZW50LmFubm90YXRpb25JZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnNob3dCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25FZGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNob3dCdG4oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25CbHVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRCdG5TdWIgPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0Q29tbWVudEJ0blN1YmplY3QoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoY29tbWVudElkKSA9PiB7XG4gICAgICAgICAgICAgICAgKGNvbW1lbnRJZCA9PT0gdGhpcy5jb21tZW50LmlkKSA/IHRoaXMuaGFuZGxlU2hvd0J0bigpIDogdGhpcy5oYW5kbGVIaWRlQnRuKCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kYXRhTG9hZGVkU3ViID0gdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldERhdGFMb2FkZWRTdWIoKVxuICAgICAgICAgICAgLnN1YnNjcmliZSggKGRhdGFMb2FkZWQ6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25Ub3BQb3MgPSB0aGlzLmdldFJlbGF0aXZlUG9zaXRpb24odGhpcy5jb21tZW50LmFubm90YXRpb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudFRvcFBvcyA9IHRoaXMuYW5ub3RhdGlvblRvcFBvcztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlscy5zb3J0QnlYKHRoaXMuYW5ub3RhdGlvbi5yZWN0YW5nbGVzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uSGVpZ2h0ID0gdGhpcy51dGlscy5nZXRBbm5vdGF0aW9uTGluZUhlaWdodCh0aGlzLmFubm90YXRpb24ucmVjdGFuZ2xlcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkxlZnRQb3MgPSB0aGlzLmFubm90YXRpb24ucmVjdGFuZ2xlc1swXS54O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbW1lbnRSZW5kZXJlZC5lbWl0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ29tbWVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWVudEl0ZW0uc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cGFuZENvbW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsICdmaXQtY29udGVudCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsICh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0KSArICdweCcpO1xuICAgICAgICB0aGlzLmNvbW1lbnRIZWlnaHQgPSAgdGhpcy5jb21tZW50U2VsZWN0b3IubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIHRoaXMuY29tbWVudFJlbmRlcmVkLmVtaXQodHJ1ZSk7XG4gICAgICAgIGlmICghdGhpcy5yZWZbJ2Rlc3Ryb3llZCddKSB7XG4gICAgICAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tbWVudEZvY3VzU3ViKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRGb2N1c1N1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnRCdG5TdWIpIHtcbiAgICAgICAgICAgIHRoaXMuY29tbWVudEJ0blN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFMb2FkZWRTdWIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoKSB7XG4gICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmNvbnZlcnRGb3JtVG9Db21tZW50KHRoaXMuY29tbWVudEl0ZW0pO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZWRpdENvbW1lbnQoY29tbWVudCk7XG4gICAgICAgIHRoaXMuY29tbWVudFN1Ym1pdHRlZC5lbWl0KHRoaXMuYW5ub3RhdGlvbik7XG5cbiAgICAgICAgdGhpcy52aWV3T25seSgpO1xuICAgIH1cblxuICAgIG9uRWRpdCgpIHtcbiAgICAgICAgdGhpcy5lZGl0T25seSgpO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdGhpcy5jb21tZW50LmNvbnRlbnQpO1xuICAgICAgICB0aGlzLnZpZXdPbmx5KCk7XG4gICAgfVxuXG4gICAgdmlld09ubHkoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAndmlldy1tb2RlJyk7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGVkaXRPbmx5KCkge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ3ZpZXctbW9kZScpO1xuICAgIH1cblxuICAgIGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmNvbW1lbnQuY3JlYXRlZERhdGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1lbnQubGFzdE1vZGlmaWVkQnkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbW1lbnQuY3JlYXRlZERhdGUgPT09IHRoaXMuY29tbWVudC5sYXN0TW9kaWZpZWREYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZlsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnZlcnRGb3JtVG9Db21tZW50KGNvbW1lbnRGb3JtOiBOZ0Zvcm0pOiBDb21tZW50IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21tZW50KFxuICAgICAgICAgICAgdGhpcy5jb21tZW50LmlkLFxuICAgICAgICAgICAgdGhpcy5jb21tZW50LmFubm90YXRpb25JZCxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIGNvbW1lbnRGb3JtLnZhbHVlLmNvbnRlbnRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBoYW5kbGVEZWxldGVDb21tZW50KCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNvbW1lbnQuaWQpO1xuICAgIH1cblxuICAgIGhhbmRsZUNvbW1lbnRDbGljayhldmVudDogYW55KSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEJ0blN1YmplY3QodGhpcy5jb21tZW50LmlkKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QodGhpcy5hbm5vdGF0aW9uKTtcbiAgICB9XG5cbiAgICBoYW5kbGVTaG93QnRuKCkge1xuICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGlkZUJ1dHRvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5leHBhbmRDb21tZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKCdTdWNjZXNzJyk7XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGhhbmRsZUhpZGVCdG4oKSB7XG4gICAgICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbW1lbnRJdGVtLnZhbHVlLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNvbW1lbnQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmhpZGVCdXR0b24gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb2xsYXBzZUNvbW1lbnQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoJ1N1Y2Nlc3MnKTtcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjb2xsYXBzZUNvbW1lbnQoKSB7XG4gICAgICAgIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHBhbmRDb21tZW50KCk7XG4gICAgICAgICAgICByZXNvbHZlKCdTdWNjZXNzJyk7XG4gICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29tbWVudEVtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNocmlua0NvbW1lbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2V4cGFuZGVkJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZGV0YWlsc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmNvbW1lbnRBcmVhLm5hdGl2ZUVsZW1lbnQsICd2aWV3LW1vZGUnKTtcblxuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHQoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNDb21tZW50RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnQuY29udGVudCA9PT0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgaXNTaHJpbmthYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LnNjcm9sbEhlaWdodCA+IDMxO1xuICAgIH1cblxuICAgIHNocmlua0NvbW1lbnQoKSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2hyaW5rYWJsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWNlQ29tbWVudCA9IHRoaXMucmVtb3ZlTXVsdGlwbGVMaW5lcygpLnNsaWNlKDAsIDIwKSArICcuLi4nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVtb3ZlTXVsdGlwbGVMaW5lcygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50LmNvbnRlbnQuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBleHBhbmRDb21tZW50KCkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuY29tbWVudEFyZWEubmF0aXZlRWxlbWVudCwgJ2V4cGFuZGVkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5jb21tZW50QXJlYS5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5kZXRhaWxzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnY29sbGFwc2VkJyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5kZXRhaWxzV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnZXhwYW5kZWQnKTtcblxuICAgICAgICB0aGlzLnNsaWNlQ29tbWVudCA9IHRoaXMuY29tbWVudC5jb250ZW50O1xuICAgICAgICB0aGlzLnNldEhlaWdodCgpO1xuICAgIH1cblxuICAgIGdldFJlbGF0aXZlUG9zaXRpb24oYW5ub3RhdGlvbklkOiBzdHJpbmcpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBzdmdTZWxlY3RvciA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRWaWV3ZXJFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvcihgZ1tkYXRhLXBkZi1hbm5vdGF0ZS1pZD1cIiR7YW5ub3RhdGlvbklkfVwiXWApO1xuICAgICAgICBpZiAoc3ZnU2VsZWN0b3IgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaGlnaGxpZ2h0UmVjdCA9IDxET01SZWN0PiBzdmdTZWxlY3Rvci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJSZWN0ID0gPERPTVJlY3Q+IHRoaXMucGRmU2VydmljZS5nZXRBbm5vdGF0aW9uV3JhcHBlcigpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAgIHJldHVybiAoaGlnaGxpZ2h0UmVjdC55IC0gd3JhcHBlclJlY3QudG9wKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==