ngx-extended-pdf-viewer
Version:
Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.
121 lines • 21.5 kB
JavaScript
import { Component, Input, ViewChild, EventEmitter, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
const THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // one pixel
export class PdfSidebarContentComponent {
constructor() {
this.hideSidebarToolbar = false;
this.mobileFriendlyZoomScale = 1.0;
this.thumbnailDrawn = new EventEmitter();
if (typeof window !== 'undefined') {
window.pdfThumbnailGeneratorReady = () => this.pdfThumbnailGeneratorReady();
window.pdfThumbnailGenerator = (pdfThumbnailView, linkService, id, container, thumbPageTitlePromise) => this.createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromise);
}
}
get top() {
let top = 0;
if (!this.hideSidebarToolbar) {
top = 32 * this.mobileFriendlyZoomScale;
if (top === 32) {
top = 33; // prevent the border of the sidebar toolbar from being cut off
}
}
return `${top}px`;
}
ngOnDestroy() {
this.linkService = undefined;
}
pdfThumbnailGeneratorReady() {
if (!this.thumbnailViewTemplate) {
return false;
}
const t = this.thumbnailViewTemplate.nativeElement;
return !!t && !!t.innerHTML && t.innerHTML.length > 0;
}
createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromise) {
this.linkService = linkService;
const template = this.thumbnailViewTemplate;
// get the inner HTML without the attributes and classes added by Angular
const inner = template.nativeElement.innerHTML
.split(/_ng\w+-\w+-\w+=""/g)
.join('')
.split(/ng-\w+-\w+/g)
.join('')
.split(/<!--[\s\S]*?-->/g)
.join('');
const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH;
const widthOfRing = `${pdfThumbnailView.canvasWidth + borderAdjustment}px`;
const heightOfRing = `${pdfThumbnailView.canvasHeight + borderAdjustment}px`;
const newHtml = inner.split('WIDTH_OF_RING').join(widthOfRing).split('HEIGHT_OF_RING').join(heightOfRing).split('PAGE_NUMBER').join(id);
const newElement = this.createElementFromHTML(newHtml);
newElement.classList.remove('pdf-viewer-template');
const anchor = newElement;
anchor.href = linkService.getAnchorUrl(`#page=${id}`);
thumbPageTitlePromise.then((msg) => {
anchor.title = msg;
});
anchor.onclick = () => {
linkService.page = id;
return false;
};
pdfThumbnailView.anchor = anchor;
const ring = newElement.getElementsByClassName('image-container')[0];
pdfThumbnailView.ring = ring;
pdfThumbnailView.div = newElement.getElementsByClassName('thumbnail')[0];
container.appendChild(newElement);
const thumbnailDrawnEvent = {
thumbnail: newElement,
container: container,
pageId: id,
};
this.thumbnailDrawn.emit(thumbnailDrawnEvent);
}
createElementFromHTML(htmlString) {
const div = document.createElement('div');
div.innerHTML = htmlString.trim();
// Change this to div.childNodes to support multiple top-level nodes
return div.firstChild;
}
onKeyDown(event) {
if (event.code === 'ArrowDown') {
if (this.linkService) {
if (event.ctrlKey || event.metaKey) {
this.linkService.page = this.linkService.pagesCount;
}
else if (this.linkService.page < this.linkService.pagesCount) {
this.linkService.page = this.linkService.page + 1;
}
event.preventDefault();
}
}
else if (event.code === 'ArrowUp') {
if (this.linkService) {
if (event.ctrlKey || event.metaKey) {
this.linkService.page = 1;
}
else if (this.linkService.page > 1) {
this.linkService.page = this.linkService.page - 1;
}
event.preventDefault();
}
}
}
}
PdfSidebarContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfSidebarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfSidebarContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: PdfSidebarContentComponent, selector: "pdf-sidebar-content", inputs: { customThumbnail: "customThumbnail", hideSidebarToolbar: "hideSidebarToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale" }, outputs: { thumbnailDrawn: "thumbnailDrawn" }, viewQueries: [{ propertyName: "thumbnailViewTemplate", first: true, predicate: ["thumbnailViewTemplate"], descendants: true }], ngImport: i0, template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"$page\">\n <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n", styles: [""], directives: [{ type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: PdfSidebarContentComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-sidebar-content', template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"$page\">\n <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n", styles: [""] }]
}], ctorParameters: function () { return []; }, propDecorators: { customThumbnail: [{
type: Input
}], hideSidebarToolbar: [{
type: Input
}], mobileFriendlyZoomScale: [{
type: Input
}], thumbnailViewTemplate: [{
type: ViewChild,
args: ['thumbnailViewTemplate']
}], thumbnailDrawn: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3NpZGViYXIvcGRmLXNpZGViYXIvcGRmLXNpZGViYXItY29udGVudC9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvc2lkZWJhci9wZGYtc2lkZWJhci9wZGYtc2lkZWJhci1jb250ZW50L3BkZi1zaWRlYmFyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWUsU0FBUyxFQUF5QixZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFpQnRILE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUMsWUFBWTtBQU9yRCxNQUFNLE9BQU8sMEJBQTBCO0lBNkJyQztRQXhCTyx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFHM0IsNEJBQXVCLEdBQUcsR0FBRyxDQUFDO1FBUTlCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFjakUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDaEMsTUFBYyxDQUFDLDBCQUEwQixHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ3BGLE1BQWMsQ0FBQyxxQkFBcUIsR0FBRyxDQUN0QyxnQkFBa0MsRUFDbEMsV0FBZ0IsRUFDaEIsRUFBVSxFQUNWLFNBQXlCLEVBQ3pCLHFCQUFzQyxFQUN0QyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLFNBQVMs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VyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7aUJBQ25EO2dCQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtTQUNGO2FBQU0sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNuQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3BCLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO29CQUNsQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7aUJBQzNCO3FCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7aUJBQ25EO2dCQUNELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQzs7dUhBdElVLDBCQUEwQjsyR0FBMUIsMEJBQTBCLHdYQ3hCdkMsdTJCQW9CQTsyRkRJYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UscUJBQXFCOzBFQU14QixlQUFlO3NCQURyQixLQUFLO2dCQUlDLGtCQUFrQjtzQkFEeEIsS0FBSztnQkFJQyx1QkFBdUI7c0JBRDdCLEtBQUs7Z0JBSUMscUJBQXFCO3NCQUQzQixTQUFTO3VCQUFDLHVCQUF1QjtnQkFNM0IsY0FBYztzQkFEcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBkZlRodW1ibmFpbERyYXduRXZlbnQgfSBmcm9tICcuLi8uLi8uLi9ldmVudHMvcGRmLXRodW1ibmFpbC1kcmF3bi1ldmVudCc7XG5cbmRlY2xhcmUgY2xhc3MgUERGVGh1bWJuYWlsVmlldyB7XG4gIGFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG4gIGRpdjogSFRNTEVsZW1lbnQ7XG4gIHJpbmc6IEhUTUxFbGVtZW50O1xuICBjYW52YXNXaWR0aDogbnVtYmVyO1xuICBjYW52YXNIZWlnaHQ6IG51bWJlcjtcbn1cblxuZGVjbGFyZSBjbGFzcyBQREZMaW5rU2VydmljZSB7XG4gIHB1YmxpYyBwYWdlOiBudW1iZXI7XG4gIHB1YmxpYyBwYWdlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBnZXRBbmNob3JVcmwodGFyZ2V0VXJsOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmNvbnN0IFRIVU1CTkFJTF9DQU5WQVNfQk9SREVSX1dJRFRIID0gMTsgLy8gb25lIHBpeGVsXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3BkZi1zaWRlYmFyLWNvbnRlbnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3BkZi1zaWRlYmFyLWNvbnRlbnQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBQZGZTaWRlYmFyQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjdXN0b21UaHVtYm5haWw6IFRlbXBsYXRlUmVmPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGhpZGVTaWRlYmFyVG9vbGJhciA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtb2JpbGVGcmllbmRseVpvb21TY2FsZSA9IDEuMDtcblxuICBAVmlld0NoaWxkKCd0aHVtYm5haWxWaWV3VGVtcGxhdGUnKVxuICBwdWJsaWMgdGh1bWJuYWlsVmlld1RlbXBsYXRlOiBFbGVtZW50UmVmO1xuXG4gIHByaXZhdGUgbGlua1NlcnZpY2U6IFBERkxpbmtTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdGh1bWJuYWlsRHJhd24gPSBuZXcgRXZlbnRFbWl0dGVyPFBkZlRodW1ibmFpbERyYXduRXZlbnQ+KCk7XG5cbiAgcHVibGljIGdldCB0b3AoKTogc3RyaW5nIHtcbiAgICBsZXQgdG9wID0gMDtcbiAgICBpZiAoIXRoaXMuaGlkZVNpZGViYXJUb29sYmFyKSB7XG4gICAgICB0b3AgPSAzMiAqIHRoaXMubW9iaWxlRnJpZW5kbHlab29tU2NhbGU7XG4gICAgICBpZiAodG9wID09PSAzMikge1xuICAgICAgICB0b3AgPSAzMzsgLy8gcHJldmVudCB0aGUgYm9yZGVyIG9mIHRoZSBzaWRlYmFyIHRvb2xiYXIgZnJvbSBiZWluZyBjdXQgb2ZmXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgJHt0b3B9cHhgO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAod2luZG93IGFzIGFueSkucGRmVGh1bWJuYWlsR2VuZXJhdG9yUmVhZHkgPSAoKSA9PiB0aGlzLnBkZlRodW1ibmFpbEdlbmVyYXRvclJlYWR5KCk7XG4gICAgICAod2luZG93IGFzIGFueSkucGRmVGh1bWJuYWlsR2VuZXJhdG9yID0gKFxuICAgICAgICBwZGZUaHVtYm5haWxWaWV3OiBQREZUaHVtYm5haWxWaWV3LFxuICAgICAgICBsaW5rU2VydmljZTogYW55LFxuICAgICAgICBpZDogbnVtYmVyLFxuICAgICAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50LFxuICAgICAgICB0aHVtYlBhZ2VUaXRsZVByb21pc2U6IFByb21pc2U8c3RyaW5nPlxuICAgICAgKSA9PiB0aGlzLmNyZWF0ZVRodW1ibmFpbChwZGZUaHVtYm5haWxWaWV3LCBsaW5rU2VydmljZSwgaWQsIGNvbnRhaW5lciwgdGh1bWJQYWdlVGl0bGVQcm9taXNlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBwZGZUaHVtYm5haWxHZW5lcmF0b3JSZWFkeSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudGh1bWJuYWlsVmlld1RlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB0aGlzLnRodW1ibmFpbFZpZXdUZW1wbGF0ZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIHJldHVybiAhIXQgJiYgISF0LmlubmVySFRNTCAmJiB0LmlubmVySFRNTC5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUaHVtYm5haWwoXG4gICAgcGRmVGh1bWJuYWlsVmlldzogUERGVGh1bWJuYWlsVmlldyxcbiAgICBsaW5rU2VydmljZTogUERGTGlua1NlcnZpY2UsXG4gICAgaWQ6IG51bWJlcixcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50LFxuICAgIHRodW1iUGFnZVRpdGxlUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+XG4gICkge1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSBsaW5rU2VydmljZTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGh1bWJuYWlsVmlld1RlbXBsYXRlO1xuICAgIC8vIGdldCB0aGUgaW5uZXIgSFRNTCB3aXRob3V0IHRoZSBhdHRyaWJ1dGVzIGFuZCBjbGFzc2VzIGFkZGVkIGJ5IEFuZ3VsYXJcbiAgICBjb25zdCBpbm5lciA9IHRlbXBsYXRlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MXG4gICAgICAuc3BsaXQoL19uZ1xcdystXFx3Ky1cXHcrPVwiXCIvZylcbiAgICAgIC5qb2luKCcnKVxuICAgICAgLnNwbGl0KC9uZy1cXHcrLVxcdysvZylcbiAgICAgIC5qb2luKCcnKVxuICAgICAgLnNwbGl0KC88IS0tW1xcc1xcU10qPy0tPi9nKVxuICAgICAgLmpvaW4oJycpO1xuXG4gICAgY29uc3QgYm9yZGVyQWRqdXN0bWVudCA9IDIgKiBUSFVNQk5BSUxfQ0FOVkFTX0JPUkRFUl9XSURUSDtcblxuICAgIGNvbnN0IHdpZHRoT2ZSaW5nID0gYCR7cGRmVGh1bWJuYWlsVmlldy5jYW52YXNXaWR0aCArIGJvcmRlckFkanVzdG1lbnR9cHhgO1xuICAgIGNvbnN0IGhlaWdodE9mUmluZyA9IGAke3BkZlRodW1ibmFpbFZpZXcuY2FudmFzSGVpZ2h0ICsgYm9yZGVyQWRqdXN0bWVudH1weGA7XG5cbiAgICBjb25zdCBuZXdIdG1sID0gaW5uZXIuc3BsaXQoJ1dJRFRIX09GX1JJTkcnKS5qb2luKHdpZHRoT2ZSaW5nKS5zcGxpdCgnSEVJR0hUX09GX1JJTkcnKS5qb2luKGhlaWdodE9mUmluZykuc3BsaXQoJ1BBR0VfTlVNQkVSJykuam9pbihpZCk7XG4gICAgY29uc3QgbmV3RWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudEZyb21IVE1MKG5ld0h0bWwpO1xuICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncGRmLXZpZXdlci10ZW1wbGF0ZScpO1xuXG4gICAgY29uc3QgYW5jaG9yID0gbmV3RWxlbWVudCBhcyBIVE1MQW5jaG9yRWxlbWVudDtcbiAgICBhbmNob3IuaHJlZiA9IGxpbmtTZXJ2aWNlLmdldEFuY2hvclVybChgI3BhZ2U9JHtpZH1gKTtcbiAgICB0aHVtYlBhZ2VUaXRsZVByb21pc2UudGhlbigobXNnKSA9PiB7XG4gICAgICBhbmNob3IudGl0bGUgPSBtc2c7XG4gICAgfSk7XG4gICAgYW5jaG9yLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBsaW5rU2VydmljZS5wYWdlID0gaWQ7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBwZGZUaHVtYm5haWxWaWV3LmFuY2hvciA9IGFuY2hvcjtcblxuICAgIGNvbnN0IHJpbmcgPSBuZXdFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2ltYWdlLWNvbnRhaW5lcicpWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgIHBkZlRodW1ibmFpbFZpZXcucmluZyA9IHJpbmc7XG4gICAgcGRmVGh1bWJuYWlsVmlldy5kaXYgPSBuZXdFbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RodW1ibmFpbCcpWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKG5ld0VsZW1lbnQpO1xuXG4gICAgY29uc3QgdGh1bWJuYWlsRHJhd25FdmVudDogUGRmVGh1bWJuYWlsRHJhd25FdmVudCA9IHtcbiAgICAgIHRodW1ibmFpbDogbmV3RWxlbWVudCxcbiAgICAgIGNvbnRhaW5lcjogY29udGFpbmVyLFxuICAgICAgcGFnZUlkOiBpZCxcbiAgICB9O1xuICAgIHRoaXMudGh1bWJuYWlsRHJhd24uZW1pdCh0aHVtYm5haWxEcmF3bkV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWxlbWVudEZyb21IVE1MKGh0bWxTdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmlubmVySFRNTCA9IGh0bWxTdHJpbmcudHJpbSgpO1xuXG4gICAgLy8gQ2hhbmdlIHRoaXMgdG8gZGl2LmNoaWxkTm9kZXMgdG8gc3VwcG9ydCBtdWx0aXBsZSB0b3AtbGV2ZWwgbm9kZXNcbiAgICByZXR1cm4gZGl2LmZpcnN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBpZiAodGhpcy5saW5rU2VydmljZSkge1xuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50O1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGlua1NlcnZpY2UucGFnZSA8IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudCkge1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IHRoaXMubGlua1NlcnZpY2UucGFnZSArIDE7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV2ZW50LmNvZGUgPT09ICdBcnJvd1VwJykge1xuICAgICAgaWYgKHRoaXMubGlua1NlcnZpY2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW5rU2VydmljZS5wYWdlID4gMSkge1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IHRoaXMubGlua1NlcnZpY2UucGFnZSAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgaWQ9XCJzaWRlYmFyQ29udGVudFwiIFtzdHlsZS50b3BdPVwidG9wXCI+XG4gIDxkaXYgI3RodW1ibmFpbFZpZXdUZW1wbGF0ZT5cbiAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRodW1ibmFpbCA/IGN1c3RvbVRodW1ibmFpbCA6IGRlZmF1bHRUaHVtYm5haWxcIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8ZGl2IGlkPVwidGh1bWJuYWlsVmlld1wiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCI+PC9kaXY+XG4gIDxkaXYgaWQ9XCJvdXRsaW5lVmlld1wiIGNsYXNzPVwiaGlkZGVuXCI+PC9kaXY+XG4gIDxkaXYgaWQ9XCJhdHRhY2htZW50c1ZpZXdcIiBjbGFzcz1cImhpZGRlblwiPjwvZGl2PlxuICA8ZGl2IGlkPVwibGF5ZXJzVmlld1wiIGNsYXNzPVwiaGlkZGVuXCI+PC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGh1bWJuYWlsPlxuICA8YSBjbGFzcz1cInBkZi12aWV3ZXItdGVtcGxhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgZGF0YS1wYWdlLW51bWJlcj1cIiRwYWdlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsU2VsZWN0aW9uUmluZyBpbWFnZS1jb250YWluZXJcIiBzdHlsZT1cIndpZHRoOiBXSURUSF9PRl9SSU5HOyBoZWlnaHQ6IEhFSUdIVF9PRl9SSU5HXCI+XG4gICAgICAgIDwhLS0gaW1hZ2UgaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBoZXJlIC0tPlxuICAgICAgICA8IS0tIDxpbWcgY2xhc3M9XCJ0aHVtYm5haWxJbWFnZVwiIHN0eWxlPVwid2lkdGg6IDk4cHg7IGhlaWdodDogNzNweDtcIiAvPiAtLT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19