UNPKG

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.

224 lines 25.4 kB
import { Component, ContentChild, Input, ViewChild, effect } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "./pdf-shy-button-service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "../../pdf-notification-service"; import * as i4 from "../../pdf-csp-policy.service"; export class PdfShyButtonComponent { pdfShyButtonServiceService; sanitizer; renderer; pdfCspPolicyService; primaryToolbarId; secondaryMenuId; cssClass = 'invisible'; eventBusName = undefined; l10nId; l10nLabel; title; toggled; disabled; order; action = undefined; closeOnClick = true; onlySecondaryMenu = false; ariaHasPopup = false; ariaControls; role; PDFViewerApplication; renderContent = false; buttonRef; nestedContent = null; _imageHtml; get imageHtml() { if (this._imageHtml) { // allow non-literal svg tags (sanitized in the setter) return this.sanitizer.bypassSecurityTrustHtml(this._imageHtml); // NOSONAR } return undefined; } set image(value) { const svgTags = [ // 'a' is not allowed! 'animate', 'animateMotion', 'animateTransform', 'audio', 'canvas', 'circle', 'clipPath', 'defs', 'desc', 'discard', 'ellipse', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence', 'filter', 'foreignObject', 'g', 'iframe', 'image', 'line', 'linearGradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialGradient', 'rect', 'script', 'set', 'stop', 'style', 'svg', 'switch', 'symbol', 'text', 'textPath', 'title', 'tspan', 'unknown', 'use', 'video', 'view', ]; // only <svg> and SVG tags are allowed const tags = value.split('<').filter((tag) => tag.length > 0); const legal = tags.every((tag) => tag.startsWith('svg') || tag.startsWith('/') || svgTags.includes(tag.split(/\s|>/)[0])); if (!legal) { throw new Error('Illegal image for PDFShyButton. Only SVG images are allowed. Please use only the tags <svg> and <path>. ' + value); } this._imageHtml = this.pdfCspPolicyService.sanitizeHTML(value); } constructor(pdfShyButtonServiceService, sanitizer, renderer, notificationService, pdfCspPolicyService) { this.pdfShyButtonServiceService = pdfShyButtonServiceService; this.sanitizer = sanitizer; this.renderer = renderer; this.pdfCspPolicyService = pdfCspPolicyService; effect(() => { this.PDFViewerApplication = notificationService.onPDFJSInitSignal(); }); } ngAfterViewInit() { this.updateButtonImage(); } ngOnInit() { this.pdfShyButtonServiceService.add(this); } ngOnChanges(changes) { this.pdfShyButtonServiceService.update(this); } onClick(htmlEvent) { if (htmlEvent instanceof KeyboardEvent && htmlEvent.key !== 'Enter' && htmlEvent.key !== ' ') { return; } if (this.action) { this.action(htmlEvent, false); htmlEvent.preventDefault(); } else if (this.eventBusName) { this.PDFViewerApplication?.eventBus.dispatch(this.eventBusName); htmlEvent.preventDefault(); } } updateButtonImage() { if (this.buttonRef) { const el = this.buttonRef.nativeElement; if (this._imageHtml) { const temp = this.renderer.createElement('div'); this.pdfCspPolicyService.addTrustedHTML(temp, this._imageHtml); const image = temp.children[0]; if (!el.innerHTML.includes(image.innerHTML)) { // if using SSR, the HTML code may already be there this.renderer.appendChild(el, image); } } else { const childNodes = el.childNodes; for (let child of childNodes) { this.renderer.removeChild(el, child); } } } } ngAfterContentInit() { if (this.primaryToolbarId === 'nestedComponent') { this.renderContent = !!this.nestedContent; console.log('renderContent', this.renderContent); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfShyButtonComponent, deps: [{ token: i1.PdfShyButtonService }, { token: i2.DomSanitizer }, { token: i0.Renderer2 }, { token: i3.PDFNotificationService }, { token: i4.PdfCspPolicyService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: PdfShyButtonComponent, selector: "pdf-shy-button", inputs: { primaryToolbarId: "primaryToolbarId", secondaryMenuId: "secondaryMenuId", cssClass: "cssClass", eventBusName: "eventBusName", l10nId: "l10nId", l10nLabel: "l10nLabel", title: "title", toggled: "toggled", disabled: "disabled", order: "order", action: "action", closeOnClick: "closeOnClick", onlySecondaryMenu: "onlySecondaryMenu", ariaHasPopup: "ariaHasPopup", ariaControls: "ariaControls", role: "role", image: "image" }, queries: [{ propertyName: "nestedContent", first: true, predicate: ["nestedContent"], descendants: true }], viewQueries: [{ propertyName: "buttonRef", first: true, predicate: ["buttonRef"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (!onlySecondaryMenu) {\n@if (nestedContent) {\n<span (click)=\"onClick($event)\" onKeyDown=\"onClick($event)\" [class]=\"cssClass\">\n <ng-content></ng-content>\n</span>\n}\n@else {\n<button type=\"button\" [id]=\"primaryToolbarId\" class=\"toolbarButton\" [class]=\"cssClass\" [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\" [class.toggled]=\"toggled\" [disabled]=\"disabled\" (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\" [attr.role]=\"role\" [attr.aria-expanded]=\"toggled ? 'true' : (ariaHasPopup ? 'false' : null)\"\n [attr.aria-haspopup]=\"ariaHasPopup\" [attr.aria-controls]=\"ariaControls\" #buttonRef></button>\n}\n}", styles: [".hidden,.always-in-secondary-menu,.visibleXXSView,.visibleTinyView,.visibleSmallView,.visibleMediumView,.visibleLargeView,.visibleXLView,.visibleXXLView{display:none}\n"] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PdfShyButtonComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-shy-button', template: "@if (!onlySecondaryMenu) {\n@if (nestedContent) {\n<span (click)=\"onClick($event)\" onKeyDown=\"onClick($event)\" [class]=\"cssClass\">\n <ng-content></ng-content>\n</span>\n}\n@else {\n<button type=\"button\" [id]=\"primaryToolbarId\" class=\"toolbarButton\" [class]=\"cssClass\" [title]=\"title\"\n [attr.data-l10n-id]=\"l10nId\" [class.toggled]=\"toggled\" [disabled]=\"disabled\" (click)=\"onClick($event)\"\n [attr.aria-label]=\"title\" [attr.role]=\"role\" [attr.aria-expanded]=\"toggled ? 'true' : (ariaHasPopup ? 'false' : null)\"\n [attr.aria-haspopup]=\"ariaHasPopup\" [attr.aria-controls]=\"ariaControls\" #buttonRef></button>\n}\n}", styles: [".hidden,.always-in-secondary-menu,.visibleXXSView,.visibleTinyView,.visibleSmallView,.visibleMediumView,.visibleLargeView,.visibleXLView,.visibleXXLView{display:none}\n"] }] }], ctorParameters: () => [{ type: i1.PdfShyButtonService }, { type: i2.DomSanitizer }, { type: i0.Renderer2 }, { type: i3.PDFNotificationService }, { type: i4.PdfCspPolicyService }], propDecorators: { primaryToolbarId: [{ type: Input }], secondaryMenuId: [{ type: Input }], cssClass: [{ type: Input }], eventBusName: [{ type: Input }], l10nId: [{ type: Input }], l10nLabel: [{ type: Input }], title: [{ type: Input }], toggled: [{ type: Input }], disabled: [{ type: Input }], order: [{ type: Input }], action: [{ type: Input }], closeOnClick: [{ type: Input }], onlySecondaryMenu: [{ type: Input }], ariaHasPopup: [{ type: Input }], ariaControls: [{ type: Input }], role: [{ type: Input }], buttonRef: [{ type: ViewChild, args: ['buttonRef', { static: false }] }], nestedContent: [{ type: ContentChild, args: ['nestedContent', { static: false }] }], image: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNoeS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3BkZi1zaHktYnV0dG9uL3BkZi1zaHktYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvdG9vbGJhci9wZGYtc2h5LWJ1dHRvbi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW1DLFNBQVMsRUFBRSxZQUFZLEVBQWMsS0FBSyxFQUFnQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFhN0osTUFBTSxPQUFPLHFCQUFxQjtJQXVKdEI7SUFDQTtJQUNBO0lBRUE7SUF6SkgsZ0JBQWdCLENBQVM7SUFHekIsZUFBZSxDQUFTO0lBR3hCLFFBQVEsR0FBdUIsV0FBVyxDQUFDO0lBRzNDLFlBQVksR0FBdUIsU0FBUyxDQUFDO0lBRzdDLE1BQU0sQ0FBUztJQUdmLFNBQVMsQ0FBUztJQUdsQixLQUFLLENBQVM7SUFHZCxPQUFPLENBQVU7SUFHakIsUUFBUSxDQUFVO0lBR2xCLEtBQUssQ0FBUztJQUdkLE1BQU0sR0FBMEUsU0FBUyxDQUFDO0lBRzFGLFlBQVksR0FBWSxJQUFJLENBQUM7SUFHN0IsaUJBQWlCLEdBQVksS0FBSyxDQUFDO0lBR25DLFlBQVksR0FBeUMsS0FBSyxDQUFDO0lBRzNELFlBQVksQ0FBcUI7SUFHakMsSUFBSSxDQUFxQjtJQUV4QixvQkFBb0IsQ0FBb0M7SUFFekQsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUVjLFNBQVMsQ0FBYTtJQUVmLGFBQWEsR0FBc0IsSUFBSSxDQUFDO0lBRWxGLFVBQVUsQ0FBcUI7SUFFdkMsSUFBVyxTQUFT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RGxCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxJQUFJO3NCQURWLEtBQUs7Z0JBT3FDLFNBQVM7c0JBQW5ELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFUyxhQUFhO3NCQUE5RCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBYXJDLEtBQUs7c0JBRGYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIFJlbmRlcmVyMiwgVmlld0NoaWxkLCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IElQREZWaWV3ZXJBcHBsaWNhdGlvbiB9IGZyb20gJy4uLy4uL29wdGlvbnMvcGRmLXZpZXdlci1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBQZGZDc3BQb2xpY3lTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcGRmLWNzcC1wb2xpY3kuc2VydmljZSc7XG5pbXBvcnQgeyBQREZOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vcGRmLW5vdGlmaWNhdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IFJlc3BvbnNpdmVDU1NDbGFzcyB9IGZyb20gJy4uLy4uL3Jlc3BvbnNpdmUtdmlzaWJpbGl0eSc7XG5pbXBvcnQgeyBQZGZTaHlCdXR0b25TZXJ2aWNlIH0gZnJvbSAnLi9wZGYtc2h5LWJ1dHRvbi1zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLXNoeS1idXR0b24nLFxuICBzdHlsZVVybHM6IFsnLi9wZGYtc2h5LWJ1dHRvbi5jb21wb25lbnQuc2NzcyddLFxuICB0ZW1wbGF0ZVVybDogJy4vcGRmLXNoeS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQZGZTaHlCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwcmltYXJ5VG9vbGJhcklkOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNlY29uZGFyeU1lbnVJZDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjc3NDbGFzczogUmVzcG9uc2l2ZUNTU0NsYXNzID0gJ2ludmlzaWJsZSc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGV2ZW50QnVzTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsMTBuSWQ6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbDEwbkxhYmVsOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHRvZ2dsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBvcmRlcjogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhY3Rpb246ICgoaHRtbEV2ZW50PzogRXZlbnQsIGlzU2Vjb25kYXJ5TWVudWU/OiBib29sZWFuKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY2xvc2VPbkNsaWNrOiBib29sZWFuID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgb25seVNlY29uZGFyeU1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUhhc1BvcHVwOiBib29sZWFuIHwgJ3RydWUnIHwgJ21lbnUnIHwgJ2RpYWxvZycgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIFBERlZpZXdlckFwcGxpY2F0aW9uOiBJUERGVmlld2VyQXBwbGljYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHJlbmRlckNvbnRlbnQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdidXR0b25SZWYnLCB7IHN0YXRpYzogZmFsc2UgfSkgYnV0dG9uUmVmOiBFbGVtZW50UmVmO1xuXG4gIEBDb250ZW50Q2hpbGQoJ25lc3RlZENvbnRlbnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgbmVzdGVkQ29udGVudDogRWxlbWVudFJlZiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2ltYWdlSHRtbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBnZXQgaW1hZ2VIdG1sKCk6IHN0cmluZyB8IFNhZmVIdG1sIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5faW1hZ2VIdG1sKSB7XG4gICAgICAvLyBhbGxvdyBub24tbGl0ZXJhbCBzdmcgdGFncyAoc2FuaXRpemVkIGluIHRoZSBzZXR0ZXIpXG4gICAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5faW1hZ2VIdG1sKTsgLy8gTk9TT05BUlxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBpbWFnZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3ZnVGFncyA9IFtcbiAgICAgIC8vICdhJyBpcyBub3QgYWxsb3dlZCFcbiAgICAgICdhbmltYXRlJyxcbiAgICAgICdhbmltYXRlTW90aW9uJyxcbiAgICAgICdhbmltYXRlVHJhbnNmb3JtJyxcbiAgICAgICdhdWRpbycsXG4gICAgICAnY2FudmFzJyxcbiAgICAgICdjaXJjbGUnLFxuICAgICAgJ2NsaXBQYXRoJyxcbiAgICAgICdkZWZzJyxcbiAgICAgICdkZXNjJyxcbiAgICAgICdkaXNjYXJkJyxcbiAgICAgICdlbGxpcHNlJyxcbiAgICAgICdmZUJsZW5kJyxcbiAgICAgICdmZUNvbG9yTWF0cml4JyxcbiAgICAgICdmZUNvbXBvbmVudFRyYW5zZmVyJyxcbiAgICAgICdmZUNvbXBvc2l0ZScsXG4gICAgICAnZmVDb252b2x2ZU1hdHJpeCcsXG4gICAgICAnZmVEaWZmdXNlTGlnaHRpbmcnLFxuICAgICAgJ2ZlRGlzcGxhY2VtZW50TWFwJyxcbiAgICAgICdmZURpc3RhbnRMaWdodCcsXG4gICAgICAnZmVEcm9wU2hhZG93JyxcbiAgICAgICdmZUZsb29kJyxcbiAgICAgICdmZUZ1bmNBJyxcbiAgICAgICdmZUZ1bmNCJyxcbiAgICAgICdmZUZ1bmNHJyxcbiAgICAgICdmZUZ1bmNSJyxcbiAgICAgICdmZUdhdXNzaWFuQmx1cicsXG4gICAgICAnZmVJbWFnZScsXG4gICAgICAnZmVNZXJnZScsXG4gICAgICAnZmVNZXJnZU5vZGUnLFxuICAgICAgJ2ZlTW9ycGhvbG9neScsXG4gICAgICAnZmVPZmZzZXQnLFxuICAgICAgJ2ZlUG9pbnRMaWdodCcsXG4gICAgICAnZmVTcGVjdWxhckxpZ2h0aW5nJyxcbiAgICAgICdmZVNwb3RMaWdodCcsXG4gICAgICAnZmVUaWxlJyxcbiAgICAgICdmZVR1cmJ1bGVuY2UnLFxuICAgICAgJ2ZpbHRlcicsXG4gICAgICAnZm9yZWlnbk9iamVjdCcsXG4gICAgICAnZycsXG4gICAgICAnaWZyYW1lJyxcbiAgICAgICdpbWFnZScsXG4gICAgICAnbGluZScsXG4gICAgICAnbGluZWFyR3JhZGllbnQnLFxuICAgICAgJ21hcmtlcicsXG4gICAgICAnbWFzaycsXG4gICAgICAnbWV0YWRhdGEnLFxuICAgICAgJ21wYXRoJyxcbiAgICAgICdwYXRoJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwb2x5Z29uJyxcbiAgICAgICdwb2x5bGluZScsXG4gICAgICAncmFkaWFsR3JhZGllbnQnLFxuICAgICAgJ3JlY3QnLFxuICAgICAgJ3NjcmlwdCcsXG4gICAgICAnc2V0JyxcbiAgICAgICdzdG9wJyxcbiAgICAgICdzdHlsZScsXG4gICAgICAnc3ZnJyxcbiAgICAgICdzd2l0Y2gnLFxuICAgICAgJ3N5bWJvbCcsXG4gICAgICAndGV4dCcsXG4gICAgICAndGV4dFBhdGgnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0c3BhbicsXG4gICAgICAndW5rbm93bicsXG4gICAgICAndXNlJyxcbiAgICAgICd2aWRlbycsXG4gICAgICAndmlldycsXG4gICAgXTtcblxuICAgIC8vIG9ubHkgPHN2Zz4gYW5kIFNWRyB0YWdzIGFyZSBhbGxvd2VkXG4gICAgY29uc3QgdGFncyA9IHZhbHVlLnNwbGl0KCc8JykuZmlsdGVyKCh0YWcpID0+IHRhZy5sZW5ndGggPiAwKTtcbiAgICBjb25zdCBsZWdhbCA9IHRhZ3MuZXZlcnkoKHRhZykgPT4gdGFnLnN0YXJ0c1dpdGgoJ3N2ZycpIHx8IHRhZy5zdGFydHNXaXRoKCcvJykgfHwgc3ZnVGFncy5pbmNsdWRlcyh0YWcuc3BsaXQoL1xcc3w+LylbMF0pKTtcbiAgICBpZiAoIWxlZ2FsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lsbGVnYWwgaW1hZ2UgZm9yIFBERlNoeUJ1dHRvbi4gT25seSBTVkcgaW1hZ2VzIGFyZSBhbGxvd2VkLiBQbGVhc2UgdXNlIG9ubHkgdGhlIHRhZ3MgPHN2Zz4gYW5kIDxwYXRoPi4gJyArIHZhbHVlKTtcbiAgICB9XG4gICAgdGhpcy5faW1hZ2VIdG1sID0gdGhpcy5wZGZDc3BQb2xpY3lTZXJ2aWNlLnNhbml0aXplSFRNTCh2YWx1ZSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBkZlNoeUJ1dHRvblNlcnZpY2VTZXJ2aWNlOiBQZGZTaHlCdXR0b25TZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2U6IFBERk5vdGlmaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZGZDc3BQb2xpY3lTZXJ2aWNlOiBQZGZDc3BQb2xpY3lTZXJ2aWNlLFxuICApIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5QREZWaWV3ZXJBcHBsaWNhdGlvbiA9IG5vdGlmaWNhdGlvblNlcnZpY2Uub25QREZKU0luaXRTaWduYWwoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVCdXR0b25JbWFnZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucGRmU2h5QnV0dG9uU2VydmljZVNlcnZpY2UuYWRkKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMucGRmU2h5QnV0dG9uU2VydmljZVNlcnZpY2UudXBkYXRlKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2soaHRtbEV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmIChodG1sRXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGh0bWxFdmVudC5rZXkgIT09ICdFbnRlcicgJiYgaHRtbEV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWN0aW9uKSB7XG4gICAgICB0aGlzLmFjdGlvbihodG1sRXZlbnQsIGZhbHNlKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudEJ1c05hbWUpIHtcbiAgICAgIHRoaXMuUERGVmlld2VyQXBwbGljYXRpb24/LmV2ZW50QnVzLmRpc3BhdGNoKHRoaXMuZXZlbnRCdXNOYW1lKTtcbiAgICAgIGh0bWxFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVCdXR0b25JbWFnZSgpIHtcbiAgICBpZiAodGhpcy5idXR0b25SZWYpIHtcbiAgICAgIGNvbnN0IGVsID0gdGhpcy5idXR0b25SZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICh0aGlzLl9pbWFnZUh0bWwpIHtcbiAgICAgICAgY29uc3QgdGVtcCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucGRmQ3NwUG9saWN5U2VydmljZS5hZGRUcnVzdGVkSFRNTCh0ZW1wLCB0aGlzLl9pbWFnZUh0bWwpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IHRlbXAuY2hpbGRyZW5bMF07XG4gICAgICAgIGlmICghZWwuaW5uZXJIVE1MLmluY2x1ZGVzKGltYWdlLmlubmVySFRNTCkpIHtcbiAgICAgICAgICAvLyBpZiB1c2luZyBTU1IsIHRoZSBIVE1MIGNvZGUgbWF5IGFscmVhZHkgYmUgdGhlcmVcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGVsLCBpbWFnZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZE5vZGVzKSB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChlbCwgY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLnByaW1hcnlUb29sYmFySWQgPT09ICduZXN0ZWRDb21wb25lbnQnKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbnRlbnQgPSAhIXRoaXMubmVzdGVkQ29udGVudDtcbiAgICAgIGNvbnNvbGUubG9nKCdyZW5kZXJDb250ZW50JywgdGhpcy5yZW5kZXJDb250ZW50KTtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAoIW9ubHlTZWNvbmRhcnlNZW51KSB7XG5AaWYgKG5lc3RlZENvbnRlbnQpIHtcbjxzcGFuIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIiBvbktleURvd249XCJvbkNsaWNrKCRldmVudClcIiBbY2xhc3NdPVwiY3NzQ2xhc3NcIj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9zcGFuPlxufVxuQGVsc2Uge1xuPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2lkXT1cInByaW1hcnlUb29sYmFySWRcIiBjbGFzcz1cInRvb2xiYXJCdXR0b25cIiBbY2xhc3NdPVwiY3NzQ2xhc3NcIiBbdGl0bGVdPVwidGl0bGVcIlxuICBbYXR0ci5kYXRhLWwxMG4taWRdPVwibDEwbklkXCIgW2NsYXNzLnRvZ2dsZWRdPVwidG9nZ2xlZFwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiIChjbGljayk9XCJvbkNsaWNrKCRldmVudClcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cInRpdGxlXCIgW2F0dHIucm9sZV09XCJyb2xlXCIgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJ0b2dnbGVkID8gJ3RydWUnIDogKGFyaWFIYXNQb3B1cCA/ICdmYWxzZScgOiBudWxsKVwiXG4gIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiYXJpYUhhc1BvcHVwXCIgW2F0dHIuYXJpYS1jb250cm9sc109XCJhcmlhQ29udHJvbHNcIiAjYnV0dG9uUmVmPjwvYnV0dG9uPlxufVxufSJdfQ==