@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
298 lines • 32.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { v4 as uuid } from 'uuid';
import { Injectable, Inject } from '@angular/core';
import { Subject } from 'rxjs';
import { Annotation, Comment } from './annotation-set.model';
import { Utils } from './utils';
import { WINDOW } from '@ng-toolkit/universal';
import { EmLoggerService } from '../logging/em-logger.service';
export class PdfAdapter {
/**
* @param {?} log
* @param {?} utils
* @param {?} window
*/
constructor(log, utils, window) {
this.log = log;
this.utils = utils;
this.window = window;
this.annotationChangeSubject = new Subject();
log.setClass('PdfAdapter');
}
/**
* @return {?}
*/
getAnnotationChangeSubject() {
return this.annotationChangeSubject;
}
/**
* @param {?} annotationSet
* @return {?}
*/
setStoreData(annotationSet) {
this.annotationSet = annotationSet;
this.annotations = annotationSet.annotations;
this.commentData = [];
this.annotations.forEach((annotation) => {
annotation.comments.forEach((comment) => {
this.commentData.push(comment);
});
});
this.annotationSetId = annotationSet.id;
}
/**
* @param {?} comment
* @return {?}
*/
editComment(comment) {
this.annotations.forEach((annotation) => {
annotation.comments
.filter(storeComment => storeComment.id === comment.id)
.map(storeComment => {
this.log.info('Editing comment:' + comment.id);
storeComment.content = comment.content;
this.annotationChangeSubject.next({ 'type': 'editComment', 'annotation': annotation });
});
});
}
/**
* @param {?} documentId
* @param {?} comment
* @return {?}
*/
updateComments(documentId, comment) {
this.commentData.push(comment);
}
/**
* @param {?} documentId
* @return {?}
*/
_getAnnotations(documentId) {
return this.annotations || [];
}
/**
* @param {?} documentId
* @return {?}
*/
_getComments(documentId) {
return this.commentData || [];
}
/**
* @return {?}
*/
clearSelection() {
/** @type {?} */
const sel = this.window.getSelection();
if (sel) {
if (sel.removeAllRanges) {
sel.removeAllRanges();
}
else if (sel.empty) {
sel.empty();
}
}
}
/**
* @param {?} comment
* @return {?}
*/
isDraftComment(comment) {
return (comment.content === null || comment.content === '');
}
/**
* @return {?}
*/
getStoreAdapter() {
/** @type {?} */
const getAnnotations = (documentId, pageNumber) => {
return new Promise((resolve, reject) => {
/** @type {?} */
const annotations = this._getAnnotations(documentId).filter(function (i) {
return i.page === pageNumber;
});
resolve({
documentId: documentId,
pageNumber: pageNumber,
annotations: annotations
});
});
};
/** @type {?} */
const getComments = (documentId, annotationId) => {
return new Promise((resolve, reject) => {
resolve(this._getComments(documentId).filter(function (i) {
return i.annotationId === annotationId;
}));
});
};
/** @type {?} */
const getAnnotation = (documentId, annotationId) => {
return new Promise((resolve, reject) => {
/** @type {?} */
const annotation = this._getAnnotations(documentId).find(function (i) {
return i.id === annotationId;
});
resolve(annotation);
});
};
/** @type {?} */
const addAnnotation = (documentId, pageNumber, annotation) => {
return new Promise((resolve, reject) => {
this.clearSelection();
/** @type {?} */
const persistAnnotation = new Annotation();
persistAnnotation.id = uuid();
persistAnnotation.page = pageNumber;
persistAnnotation.color = annotation.color;
persistAnnotation.type = annotation.type;
persistAnnotation.comments = [];
persistAnnotation.annotationSetId = this.annotationSetId;
/** @type {?} */
const rectangles = [];
this.log.info('Generating efficient rectangles for new annotation:' + persistAnnotation.id);
this.utils.generateRectanglePerLine(annotation.rectangles, rectangles);
rectangles.forEach((rectangle) => {
rectangle.id = uuid();
});
persistAnnotation.rectangles = rectangles;
/** @type {?} */
const annotations = this._getAnnotations(documentId);
annotations.push(persistAnnotation);
this.log.info('Added annotation:' + annotation.id);
this.annotationChangeSubject.next({ 'type': 'addAnnotation', 'annotation': persistAnnotation });
resolve(persistAnnotation);
});
};
/** @type {?} */
const deleteAnnotation = (documentId, annotationId) => {
return new Promise((resolve, reject) => {
/** @type {?} */
const annotation = this.findById(this.annotations, annotationId);
this.remove(this.annotations, annotationId);
this.log.info('Deleted annotation:' + annotationId);
this.annotationChangeSubject.next({ 'type': 'deleteAnnotation', 'annotation': annotation });
resolve(this.annotations);
});
};
/** @type {?} */
const addComment = (documentId, annotationId, content) => {
return new Promise((resolve, reject) => {
/** @type {?} */
const comment = new Comment(uuid(), annotationId, null, null, new Date(), null, null, null, content);
this.updateComments(documentId, comment);
/** @type {?} */
const annotation = this.findById(this.annotations, annotationId);
this.log.info('Comment:' + comment.id + ' has been added to annotation:' + annotationId);
annotation.comments.push(comment);
if (this.isDraftComment(comment)) {
this.log.info('Removing comment box because no content exists');
resolve(comment);
}
else {
this.log.info('Add comment:' + comment.id + '-' + 'annotationId:' + annotation.id);
this.annotationChangeSubject.next({ 'type': 'addComment', 'annotation': annotation });
resolve(comment);
}
});
};
/** @type {?} */
const deleteComment = (documentId, commentId) => {
return new Promise((resolve, reject) => {
/** @type {?} */
const comment = this.findById(this.commentData, commentId);
/** @type {?} */
const annotation = this.findById(this.annotations, comment.annotationId);
this.remove(this.commentData, commentId);
this.remove(annotation.comments, commentId);
if (this.isDraftComment(comment)) {
this.log.info('Removing comment box because no content exists');
resolve(comment);
}
else {
this.log.info('Deleted comment:' + commentId + '-' + 'annotationId:' + annotation.id);
this.annotationChangeSubject.next({ 'type': 'deleteComment', 'annotation': annotation });
resolve(this.annotations);
}
});
};
// Unused
/** @type {?} */
const editAnnotation = (documentId, pageNumber, annotation) => {
return new Promise((resolve, reject) => {
this.annotationChangeSubject.next({ 'type': 'editAnnotation', 'annotation': annotation });
resolve(this.commentData);
});
};
return {
getAnnotations,
getComments,
getAnnotation,
addAnnotation,
editAnnotation,
deleteAnnotation,
addComment,
deleteComment
};
}
/**
* @param {?} array
* @param {?} id
* @return {?}
*/
findById(array, id) {
return array.find(e => e.id === id);
}
/**
* @param {?} array
* @param {?} id
* @return {?}
*/
remove(array, id) {
return array.splice(array.findIndex(e => e.id === id), 1);
}
}
PdfAdapter.decorators = [
{ type: Injectable }
];
PdfAdapter.ctorParameters = () => [
{ type: EmLoggerService },
{ type: Utils },
{ type: undefined, decorators: [{ type: Inject, args: [WINDOW,] }] }
];
if (false) {
/** @type {?} */
PdfAdapter.prototype.annotationSet;
/** @type {?} */
PdfAdapter.prototype.annotations;
/**
* @type {?}
* @private
*/
PdfAdapter.prototype.commentData;
/** @type {?} */
PdfAdapter.prototype.annotationSetId;
/**
* @type {?}
* @private
*/
PdfAdapter.prototype.annotationChangeSubject;
/**
* @type {?}
* @private
*/
PdfAdapter.prototype.log;
/**
* @type {?}
* @private
*/
PdfAdapter.prototype.utils;
/**
* @type {?}
* @private
*/
PdfAdapter.prototype.window;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaG1jdHMvYW5ub3RhdGlvbi11aS1saWIvIiwic291cmNlcyI6WyJsaWIvZGF0YS9wZGYtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsVUFBVSxFQUFpQixPQUFPLEVBQVksTUFBTSx3QkFBd0IsQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHL0QsTUFBTTs7Ozs7O0lBT0YsWUFBb0IsR0FBb0IsRUFDcEIsS0FBWSxFQUNJLE1BQU07UUFGdEIsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNJLFdBQU0sR0FBTixNQUFNLENBQUE7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLElBQUksT0FBTyxFQUE0QyxDQUFDO1FBQ3ZGLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7OztJQUVELDBCQUEwQjtRQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3hDLENBQUM7Ozs7O0lBRUQsWUFBWSxDQUFDLGFBQTRCO1FBQ3JDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxJQUFJLENBQUMsV0FBVyxHQUFH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QUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Ozs7OztJQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7OztZQXZOSixVQUFVOzs7WUFGRixlQUFlO1lBRmhCLEtBQUs7NENBY0ksTUFBTSxTQUFDLE1BQU07Ozs7SUFSMUIsbUNBQTZCOztJQUM3QixpQ0FBMEI7Ozs7O0lBQzFCLGlDQUErQjs7SUFDL0IscUNBQXdCOzs7OztJQUN4Qiw2Q0FBbUY7Ozs7O0lBRXZFLHlCQUE0Qjs7Ozs7SUFDNUIsMkJBQW9COzs7OztJQUNwQiw0QkFBOEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3Y0IGFzIHV1aWR9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7QW5ub3RhdGlvbiwgQW5ub3RhdGlvblNldCwgQ29tbWVudCwgUmVjdGFuZ2xlfSBmcm9tICcuL2Fubm90YXRpb24tc2V0Lm1vZGVsJztcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgV0lORE9XIH0gZnJvbSAnQG5nLXRvb2xraXQvdW5pdmVyc2FsJztcbmltcG9ydCB7IEVtTG9nZ2VyU2VydmljZSB9IGZyb20gJy4uL2xvZ2dpbmcvZW0tbG9nZ2VyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGRmQWRhcHRlciB7XG4gICAgYW5ub3RhdGlvblNldDogQW5ub3RhdGlvblNldDtcbiAgICBhbm5vdGF0aW9uczogQW5ub3RhdGlvbltdO1xuICAgIHByaXZhdGUgY29tbWVudERhdGE6IENvbW1lbnRbXTtcbiAgICBhbm5vdGF0aW9uU2V0SWQ6IHN0cmluZztcbiAgICBwcml2YXRlIGFubm90YXRpb25DaGFuZ2VTdWJqZWN0OiBTdWJqZWN0PHsgdHlwZTogc3RyaW5nLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uIH0+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHV0aWxzOiBVdGlscyxcbiAgICAgICAgICAgICAgICBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW5kb3cpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHsgdHlwZTogc3RyaW5nLCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uIH0+KCk7XG4gICAgICAgIGxvZy5zZXRDbGFzcygnUGRmQWRhcHRlcicpO1xuICAgIH1cblxuICAgIGdldEFubm90YXRpb25DaGFuZ2VTdWJqZWN0KCk6IFN1YmplY3Q8eyB0eXBlOiBzdHJpbmcsIGFubm90YXRpb246IEFubm90YXRpb24gfT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRTdG9yZURhdGEoYW5ub3RhdGlvblNldDogQW5ub3RhdGlvblNldCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TZXQgPSBhbm5vdGF0aW9uU2V0O1xuICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvblNldC5hbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5jb21tZW50RGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIGFubm90YXRpb24uY29tbWVudHMuZm9yRWFjaCgoY29tbWVudDogQ29tbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tbWVudERhdGEucHVzaChjb21tZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU2V0SWQgPSBhbm5vdGF0aW9uU2V0LmlkO1xuICAgIH1cblxuICAgIGVkaXRDb21tZW50KGNvbW1lbnQ6IENvbW1lbnQpIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uLmNvbW1lbnRzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihzdG9yZUNvbW1lbnQgPT4gc3RvcmVDb21tZW50LmlkID09PSBjb21tZW50LmlkKVxuICAgICAgICAgICAgICAgIC5tYXAoc3RvcmVDb21tZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnRWRpdGluZyBjb21tZW50OicgKyBjb21tZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVDb21tZW50LmNvbnRlbnQgPSBjb21tZW50LmNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YmplY3QubmV4dCh7J3R5cGUnOiAnZWRpdENvbW1lbnQnLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlQ29tbWVudHMoZG9jdW1lbnRJZCwgY29tbWVudCkge1xuICAgICAgICB0aGlzLmNvbW1lbnREYXRhLnB1c2goY29tbWVudCk7XG4gICAgfVxuXG4gICAgX2dldEFubm90YXRpb25zKGRvY3VtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMgfHwgW107XG4gICAgfVxuXG4gICAgX2dldENvbW1lbnRzKGRvY3VtZW50SWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudERhdGEgfHwgW107XG4gICAgfVxuXG4gICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNlbCA9IHRoaXMud2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBpZiAoc2VsKSB7XG4gICAgICAgICAgICBpZiAoc2VsLnJlbW92ZUFsbFJhbmdlcykge1xuICAgICAgICAgICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VsLmVtcHR5KSB7XG4gICAgICAgICAgICAgICAgc2VsLmVtcHR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0RyYWZ0Q29tbWVudChjb21tZW50OiBDb21tZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoY29tbWVudC5jb250ZW50ID09PSBudWxsIHx8IGNvbW1lbnQuY29udGVudCA9PT0gJycpO1xuICAgIH1cblxuICAgIGdldFN0b3JlQWRhcHRlcigpIHtcbiAgICAgICAgY29uc3QgZ2V0QW5ub3RhdGlvbnMgPSAoZG9jdW1lbnRJZCwgcGFnZU51bWJlcikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHRoaXMuX2dldEFubm90YXRpb25zKGRvY3VtZW50SWQpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5wYWdlID09PSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudElkOiBkb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICBwYWdlTnVtYmVyOiBwYWdlTnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogYW5ub3RhdGlvbnNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGdldENvbW1lbnRzID0gKGRvY3VtZW50SWQsIGFubm90YXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX2dldENvbW1lbnRzKGRvY3VtZW50SWQpLmZpbHRlcihmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5hbm5vdGF0aW9uSWQgPT09IGFubm90YXRpb25JZDtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBnZXRBbm5vdGF0aW9uID0gKGRvY3VtZW50SWQsIGFubm90YXRpb25JZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uID0gdGhpcy5fZ2V0QW5ub3RhdGlvbnMoZG9jdW1lbnRJZCkuZmluZChmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5pZCA9PT0gYW5ub3RhdGlvbklkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhZGRBbm5vdGF0aW9uID0gKGRvY3VtZW50SWQsIHBhZ2VOdW1iZXIsIGFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcGVyc2lzdEFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbigpO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmlkID0gdXVpZCgpO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLnBhZ2UgPSBwYWdlTnVtYmVyO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmNvbG9yID0gYW5ub3RhdGlvbi5jb2xvcjtcbiAgICAgICAgICAgICAgICBwZXJzaXN0QW5ub3RhdGlvbi50eXBlID0gYW5ub3RhdGlvbi50eXBlO1xuICAgICAgICAgICAgICAgIHBlcnNpc3RBbm5vdGF0aW9uLmNvbW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgcGVyc2lzdEFubm90YXRpb24uYW5ub3RhdGlvblNldElkID0gdGhpcy5hbm5vdGF0aW9uU2V0SWQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWN0YW5nbGVzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnR2VuZXJhdGluZyBlZmZpY2llbnQgcmVjdGFuZ2xlcyBmb3IgbmV3IGFubm90YXRpb246JyArIHBlcnNpc3RBbm5vdGF0aW9uLmlkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWxzLmdlbmVyYXRlUmVjdGFuZ2xlUGVyTGluZShhbm5vdGF0aW9uLnJlY3RhbmdsZXMsIHJlY3RhbmdsZXMpO1xuXG4gICAgICAgICAgICAgICAgcmVjdGFuZ2xlcy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAocmVjdGFuZ2xlOiBSZWN0YW5nbGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZS5pZCA9IHV1aWQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBwZXJzaXN0QW5ub3RhdGlvbi5yZWN0YW5nbGVzID0gcmVjdGFuZ2xlcztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gdGhpcy5fZ2V0QW5ub3RhdGlvbnMoZG9jdW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMucHVzaChwZXJzaXN0QW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnQWRkZWQgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3ViamVjdC5uZXh0KHsndHlwZSc6ICdhZGRBbm5vdGF0aW9uJywgJ2Fubm90YXRpb24nOiBwZXJzaXN0QW5ub3RhdGlvbn0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocGVyc2lzdEFubm90YXRpb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGVsZXRlQW5ub3RhdGlvbiA9IChkb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IHRoaXMuZmluZEJ5SWQodGhpcy5hbm5vdGF0aW9ucywgYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSh0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0RlbGV0ZWQgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbklkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2RlbGV0ZUFubm90YXRpb24nLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuYW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWRkQ29tbWVudCA9IChkb2N1bWVudElkLCBhbm5vdGF0aW9uSWQsIGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IG5ldyBDb21tZW50KFxuICAgICAgICAgICAgICAgICAgICB1dWlkKCksXG4gICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb21tZW50cyhkb2N1bWVudElkLCBjb21tZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9uOiBBbm5vdGF0aW9uID0gdGhpcy5maW5kQnlJZCh0aGlzLmFubm90YXRpb25zLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0NvbW1lbnQ6JyArIGNvbW1lbnQuaWQgKyAnIGhhcyBiZWVuIGFkZGVkIHRvIGFubm90YXRpb246JyArIGFubm90YXRpb25JZCk7XG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbi5jb21tZW50cy5wdXNoKGNvbW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNEcmFmdENvbW1lbnQoY29tbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVtb3ZpbmcgY29tbWVudCBib3ggYmVjYXVzZSBubyBjb250ZW50IGV4aXN0cycpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ0FkZCBjb21tZW50OicgKyBjb21tZW50LmlkICsgJy0nICsgJ2Fubm90YXRpb25JZDonICsgYW5ub3RhdGlvbi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YmplY3QubmV4dCh7J3R5cGUnOiAnYWRkQ29tbWVudCcsICdhbm5vdGF0aW9uJzogYW5ub3RhdGlvbn0pO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZUNvbW1lbnQgPSAoZG9jdW1lbnRJZCwgY29tbWVudElkKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmZpbmRCeUlkKHRoaXMuY29tbWVudERhdGEsIGNvbW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbjogQW5ub3RhdGlvbiA9IHRoaXMuZmluZEJ5SWQodGhpcy5hbm5vdGF0aW9ucywgY29tbWVudC5hbm5vdGF0aW9uSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMuY29tbWVudERhdGEsIGNvbW1lbnRJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoYW5ub3RhdGlvbi5jb21tZW50cywgY29tbWVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzRHJhZnRDb21tZW50KGNvbW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1JlbW92aW5nIGNvbW1lbnQgYm94IGJlY2F1c2Ugbm8gY29udGVudCBleGlzdHMnKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShjb21tZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdEZWxldGVkIGNvbW1lbnQ6JyArIGNvbW1lbnRJZCArICctJyArICdhbm5vdGF0aW9uSWQ6JyArIGFubm90YXRpb24uaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2RlbGV0ZUNvbW1lbnQnLCAnYW5ub3RhdGlvbic6IGFubm90YXRpb259KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBVbnVzZWRcbiAgICAgICAgY29uc3QgZWRpdEFubm90YXRpb24gPSAoZG9jdW1lbnRJZCwgcGFnZU51bWJlciwgYW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25DaGFuZ2VTdWJqZWN0Lm5leHQoeyd0eXBlJzogJ2VkaXRBbm5vdGF0aW9uJywgJ2Fubm90YXRpb24nOiBhbm5vdGF0aW9ufSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmNvbW1lbnREYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBnZXRBbm5vdGF0aW9ucyxcbiAgICAgICAgICAgIGdldENvbW1lbnRzLFxuICAgICAgICAgICAgZ2V0QW5ub3RhdGlvbixcbiAgICAgICAgICAgIGFkZEFubm90YXRpb24sXG4gICAgICAgICAgICBlZGl0QW5ub3RhdGlvbixcbiAgICAgICAgICAgIGRlbGV0ZUFubm90YXRpb24sXG4gICAgICAgICAgICBhZGRDb21tZW50LFxuICAgICAgICAgICAgZGVsZXRlQ29tbWVudFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZpbmRCeUlkKGFycmF5LCBpZCkge1xuICAgICAgICByZXR1cm4gYXJyYXkuZmluZChlID0+IGUuaWQgPT09IGlkKTtcbiAgICB9XG5cbiAgICByZW1vdmUoYXJyYXksIGlkKSB7XG4gICAgICAgIHJldHVybiBhcnJheS5zcGxpY2UoYXJyYXkuZmluZEluZGV4KGUgPT4gZS5pZCA9PT0gaWQpLCAxKTtcbiAgICB9XG59XG4iXX0=