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.
241 lines (222 loc) • 18.4 kB
JavaScript
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
import { Component, Inject, Input, PLATFORM_ID } from '@angular/core';
import { PdfBreakpoints } from '../responsive-visibility';
import { addTrustedHTML } from '../theme/sanitized-css-injector';
import * as i0 from "@angular/core";
export class DynamicCssComponent {
renderer;
document;
platformId;
zoom = 1.0;
width = 3.14159265359;
xxs = 455;
xs = 490;
sm = 560;
md = 610;
lg = 660;
xl = 740;
xxl = 830;
get style() {
return `
#toolbarContainer .always-in-secondary-menu {
display: none;
}
#secondaryToolbar .always-in-secondary-menu {
display: inline-flex;
}
#outerContainer #mainContainer .visibleXXSView,
#outerContainer #mainContainer .visibleTinyView,
#outerContainer #mainContainer .visibleSmallView,
#outerContainer #mainContainer .visibleMediumView,
#outerContainer #mainContainer .visibleLargeView,
#outerContainer #mainContainer .visibleXLView,
#outerContainer #mainContainer .visibleXXLView {
display: none;
}
@media all and (max-width: ${this.xl}px) {
#toolbarViewerMiddle {
display: table;
margin: auto;
left: auto;
position: inherit;
transform: none;
}
}
@media all and (max-width: ${this.xxl}) {
#sidebarContent {
background-color: rgba(0, 0, 0, 0.7);
}
html[dir='ltr'] #outerContainer.sidebarOpen #viewerContainer {
left: 0px !important;
}
html[dir='rtl'] #outerContainer.sidebarOpen #viewerContainer {
right: 0px !important;
}
#outerContainer .hiddenLargeView,
#outerContainer .hiddenMediumView {
display: inherit;
}
}
@media all and (max-width: ${this.lg}px) {
.toolbarButtonSpacer {
width: 15px;
}
#outerContainer .hiddenLargeView {
display: none;
}
#outerContainer #mainContainer .visibleLargeView {
display: inherit;
}
}
@media all and (max-width: ${this.md}px) {
.toolbarButtonSpacer {
display: none;
}
#outerContainer .hiddenMediumView {
display: none;
}
#outerContainer #mainContainer .visibleMediumView {
display: inherit;
}
}
@media all and (max-width: ${this.sm}px) {
#outerContainer .hiddenSmallView,
#outerContainer .hiddenSmallView * {
display: none;
}
#outerContainer #mainContainer .visibleSmallView {
display: inherit;
}
.toolbarButtonSpacer {
width: 0;
}
html[dir='ltr'] .findbar {
left: 38px;
}
html[dir='rtl'] .findbar {
right: 38px;
}
}
@media all and (max-width: ${this.sm}px) {
#scaleSelectContainer {
display: none;
}
}
#outerContainer .visibleXLView,
#outerContainer .visibleXXLView,
#outerContainer .visibleTinyView {
display: none;
}
#outerContainer .hiddenXLView,
#outerContainer .hiddenXXLView {
display: unset;
}
@media all and (max-width: ${this.xl}px) {
#outerContainer .hiddenXLView {
display: none;
}
#outerContainer .visibleXLView {
display: inherit;
}
#toolbarViewerMiddle {
-webkit-transform: translateX(-36%);
transform: translateX(-36%);
display: unset;
margin: unset;
left: 50%;
position: absolute;
}
}
@media all and (max-width: ${this.xxl}px) {
#outerContainer .hiddenXXLView {
display: none;
}
#outerContainer #mainContainer .visibleXXLView {
display: inherit;
}
}
@media all and (max-width: ${this.md}px) {
#toolbarViewerMiddle {
-webkit-transform: translateX(-26%);
transform: translateX(-26%);
}
}
@media all and (max-width: ${this.xs}px) {
#outerContainer .hiddenTinyView,
#outerContainer .hiddenTinyView * {
display: none;
}
#outerContainer #mainContainer .visibleTinyView {
display: inherit;
}
}
@media all and (max-width: ${this.xxs}px) {
#outerContainer .hiddenXXSView,
#outerContainer .hiddenXXSView * {
display: none;
}
#outerContainer #mainContainer .visibleXXSView {
display: inherit;
}
}
`;
}
constructor(renderer, document, platformId) {
this.renderer = renderer;
this.document = document;
this.platformId = platformId;
if (isPlatformBrowser(this.platformId)) {
this.width = document.body.clientWidth;
}
}
ngOnInit() {
this.injectStyle();
}
ngOnChanges() {
const fullWith = this.document.body.clientWidth;
const partialViewScale = fullWith / this.width;
const scaleFactor = partialViewScale * (this.zoom ? this.zoom : 1);
this.xs = scaleFactor * PdfBreakpoints.xs;
this.sm = scaleFactor * PdfBreakpoints.sm;
this.md = scaleFactor * PdfBreakpoints.md;
this.lg = scaleFactor * PdfBreakpoints.lg;
this.xl = scaleFactor * PdfBreakpoints.xl;
this.xxl = scaleFactor * PdfBreakpoints.xxl;
let styles = this.document.getElementById('pdf-dynamic-css');
if (!styles) {
styles = this.document.createElement('STYLE');
styles.id = 'pdf-dynamic-css';
addTrustedHTML(styles, this.style);
this.renderer.appendChild(this.document.head, styles);
}
addTrustedHTML(styles, this.style);
}
injectStyle() {
if (this.width === 3.14159265359) {
setTimeout(() => this.ngOnChanges(), 1);
}
}
ngOnDestroy() {
const styles = this.document.getElementById('pdf-dynamic-css');
if (styles?.parentElement) {
styles.parentElement.removeChild(styles);
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: DynamicCssComponent, deps: [{ token: i0.Renderer2 }, { token: DOCUMENT }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: DynamicCssComponent, selector: "pdf-dynamic-css", inputs: { zoom: "zoom", width: "width" }, usesOnChanges: true, ngImport: i0, template: "", styles: [""] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: DynamicCssComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-dynamic-css', template: "" }]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: undefined, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }], propDecorators: { zoom: [{
type: Input
}], width: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1jc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWV4dGVuZGVkLXBkZi12aWV3ZXIvc3JjL2xpYi9keW5hbWljLWNzcy9keW5hbWljLWNzcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL2R5bmFtaWMtY3NzL2R5bmFtaWMtY3NzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWdDLFdBQVcsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOztBQU9qRSxNQUFNLE9BQU8sbUJBQW1CO0lBMExWO0lBQStDO0lBQWlEO0lBeEw3RyxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBR1gsS0FBSyxHQUFHLGFBQWEsQ0FBQztJQUV0QixHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRVYsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFVCxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBRVQsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUVULEVBQUUsR0FBRyxHQUFHLENBQUM7SUFFVCxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWpCLElBQVcsS0FBSztRQUNkLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7NkJBbUJrQixJQUFJLENBQUMsRUFBRTs7Ozs7Ozs7Ozs2QkFVUCxJQUFJLENBQUMsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQWtCUixJQUFJLENB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QWEsRUFBRTtZQUN4QixNQUFNLENBQUMsYUFBcUIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkQ7SUFDSCxDQUFDO3VHQXRPVSxtQkFBbUIsMkNBMExtQixRQUFRLGFBQXNDLFdBQVc7MkZBMUwvRixtQkFBbUIsc0hDVmhDLEVBQUE7OzJGRFVhLG1CQUFtQjtrQkFML0IsU0FBUzsrQkFDRSxpQkFBaUI7OzBCQThMZSxNQUFNOzJCQUFDLFFBQVE7OzBCQUErQixNQUFNOzJCQUFDLFdBQVc7eUNBeExuRyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgUExBVEZPUk1fSUQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGRmQnJlYWtwb2ludHMgfSBmcm9tICcuLi9yZXNwb25zaXZlLXZpc2liaWxpdHknO1xuaW1wb3J0IHsgYWRkVHJ1c3RlZEhUTUwgfSBmcm9tICcuLi90aGVtZS9zYW5pdGl6ZWQtY3NzLWluamVjdG9yJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLWR5bmFtaWMtY3NzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2R5bmFtaWMtY3NzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZHluYW1pYy1jc3MuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBEeW5hbWljQ3NzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB6b29tID0gMS4wO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3aWR0aCA9IDMuMTQxNTkyNjUzNTk7XG5cbiAgcHVibGljIHh4cyA9IDQ1NTtcblxuICBwdWJsaWMgeHMgPSA0OTA7XG5cbiAgcHVibGljIHNtID0gNTYwO1xuXG4gIHB1YmxpYyBtZCA9IDYxMDtcblxuICBwdWJsaWMgbGcgPSA2NjA7XG5cbiAgcHVibGljIHhsID0gNzQwO1xuXG4gIHB1YmxpYyB4eGwgPSA4MzA7XG5cbiAgcHVibGljIGdldCBzdHlsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4jdG9vbGJhckNvbnRhaW5lciAuYWx3YXlzLWluLXNlY29uZGFyeS1tZW51IHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuI3NlY29uZGFyeVRvb2xiYXIgLmFsd2F5cy1pbi1zZWNvbmRhcnktbWVudSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVYWFNWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcsXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVTbWFsbFZpZXcsXG4jb3V0ZXJDb250YWluZXIgI21haW5Db250YWluZXIgLnZpc2libGVNZWRpdW1WaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlTGFyZ2VWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlWExWaWV3LFxuI291dGVyQ29udGFpbmVyICNtYWluQ29udGFpbmVyIC52aXNpYmxlWFhMVmlldyB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICR7dGhpcy54bH1weCkge1xuICAjdG9vbGJhclZpZXdlck1pZGRsZSB7XG4gICAgZGlzcGxheTogdGFibGU7XG4gICAgbWFyZ2luOiBhdXRvO1xuICAgIGxlZnQ6IGF1dG87XG4gICAgcG9zaXRpb246IGluaGVyaXQ7XG4gICAgdHJhbnNmb3JtOiBub25lO1xuICB9XG59XG5cbkBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6ICR7dGhpcy54eGx9KSB7XG4gICNzaWRlYmFyQ29udGVudCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwLjcpO1xuICB9XG5cbiAgaHRtbFtkaXI9J2x0ciddICNvdXRlckNvbnRhaW5lci5zaWRlYmFyT3BlbiAjdmlld2VyQ29udGFpbmVyIHtcbiAgICBsZWZ0OiAwcHggIWltcG9ydGFudDtcbiAgfVxuICBodG1sW2Rpcj0ncnRsJ10gI291dGVyQ29udGFpbmVyLnNpZGViYXJPcGVuICN2aWV3ZXJDb250YWluZXIge1xuICAgIHJpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgfVxuXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTGFyZ2VWaWV3LFxuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlbk1lZGl1bVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLmxnfXB4KSB7XG4gIC50b29sYmFyQnV0dG9uU3BhY2VyIHtcbiAgICB3aWR0aDogMTVweDtcbiAgfVxuXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTGFyZ2VWaWV3IHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAgI21haW5Db250YWluZXIgLnZpc2libGVMYXJnZVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLm1kfXB4KSB7XG4gIC50b29sYmFyQnV0dG9uU3BhY2VyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuTWVkaXVtVmlldyB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAjb3V0ZXJDb250YWluZXIgICNtYWluQ29udGFpbmVyIC52aXNpYmxlTWVkaXVtVmlldyB7XG4gICAgZGlzcGxheTogaW5oZXJpdDtcbiAgfVxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAke3RoaXMuc219cHgpIHtcbiAgI291dGVyQ29udGFpbmVyIC5oaWRkZW5TbWFsbFZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuU21hbGxWaWV3ICoge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyICAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVNtYWxsVmlldyB7XG4gICAgZGlzcGxheTogaW5oZXJpdDtcbiAgfVxuICAudG9vbGJhckJ1dHRvblNwYWNlciB7XG4gICAgd2lkdGg6IDA7XG4gIH1cbiAgaHRtbFtkaXI9J2x0ciddIC5maW5kYmFyIHtcbiAgICBsZWZ0OiAzOHB4O1xuICB9XG4gIGh0bWxbZGlyPSdydGwnXSAuZmluZGJhciB7XG4gICAgcmlnaHQ6IDM4cHg7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnNtfXB4KSB7XG4gICNzY2FsZVNlbGVjdENvbnRhaW5lciB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxufVxuXG4jb3V0ZXJDb250YWluZXIgLnZpc2libGVYTFZpZXcsXG4jb3V0ZXJDb250YWluZXIgLnZpc2libGVYWExWaWV3LFxuI291dGVyQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4jb3V0ZXJDb250YWluZXIgLmhpZGRlblhMVmlldyxcbiNvdXRlckNvbnRhaW5lciAuaGlkZGVuWFhMVmlldyB7XG4gIGRpc3BsYXk6IHVuc2V0O1xufVxuXG5AbWVkaWEgYWxsIGFuZCAobWF4LXdpZHRoOiAke3RoaXMueGx9cHgpIHtcbiAgI291dGVyQ29udGFpbmVyIC5oaWRkZW5YTFZpZXcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyIC52aXNpYmxlWExWaWV3IHtcbiAgICBkaXNwbGF5OiBpbmhlcml0O1xuICB9XG5cbiAgI3Rvb2xiYXJWaWV3ZXJNaWRkbGUge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zNiUpO1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzYlKTtcbiAgICBkaXNwbGF5OiB1bnNldDtcbiAgICBtYXJnaW46IHVuc2V0O1xuICAgIGxlZnQ6IDUwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnh4bH1weCkge1xuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlblhYTFZpZXcge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbiAgI291dGVyQ29udGFpbmVyICAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVhYTFZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLm1kfXB4KSB7XG4gICN0b29sYmFyVmlld2VyTWlkZGxlIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMjYlKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTI2JSk7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnhzfXB4KSB7XG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuVGlueVZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuVGlueVZpZXcgKiB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuICAjb3V0ZXJDb250YWluZXIgICNtYWluQ29udGFpbmVyIC52aXNpYmxlVGlueVZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cblxuQG1lZGlhIGFsbCBhbmQgKG1heC13aWR0aDogJHt0aGlzLnh4c31weCkge1xuICAjb3V0ZXJDb250YWluZXIgLmhpZGRlblhYU1ZpZXcsXG4gICNvdXRlckNvbnRhaW5lciAuaGlkZGVuWFhTVmlldyAqIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG4gICNvdXRlckNvbnRhaW5lciAjbWFpbkNvbnRhaW5lciAudmlzaWJsZVhYU1ZpZXcge1xuICAgIGRpc3BsYXk6IGluaGVyaXQ7XG4gIH1cbn1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZCkge1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICB0aGlzLndpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbmplY3RTdHlsZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKCkge1xuICAgIGNvbnN0IGZ1bGxXaXRoID0gdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHBhcnRpYWxWaWV3U2NhbGUgPSBmdWxsV2l0aCAvIHRoaXMud2lkdGg7XG4gICAgY29uc3Qgc2NhbGVGYWN0b3IgPSBwYXJ0aWFsVmlld1NjYWxlICogKHRoaXMuem9vbSA/IHRoaXMuem9vbSA6IDEpO1xuXG4gICAgdGhpcy54cyA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMueHM7XG4gICAgdGhpcy5zbSA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMuc207XG4gICAgdGhpcy5tZCA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMubWQ7XG4gICAgdGhpcy5sZyA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMubGc7XG4gICAgdGhpcy54bCA9IHNjYWxlRmFjdG9yICogUGRmQnJlYWtwb2ludHMueGw7XG4gICAgdGhpcy54eGwgPSBzY2FsZUZhY3RvciAqIFBkZkJyZWFrcG9pbnRzLnh4bDtcblxuICAgIGxldCBzdHlsZXMgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwZGYtZHluYW1pYy1jc3MnKSBhcyBIVE1MU3R5bGVFbGVtZW50O1xuICAgIGlmICghc3R5bGVzKSB7XG4gICAgICBzdHlsZXMgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1NUWUxFJykgYXMgSFRNTFN0eWxlRWxlbWVudDtcbiAgICAgIHN0eWxlcy5pZCA9ICdwZGYtZHluYW1pYy1jc3MnO1xuICAgICAgYWRkVHJ1c3RlZEhUTUwoc3R5bGVzLCB0aGlzLnN0eWxlKTtcblxuICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmhlYWQsIHN0eWxlcyk7XG4gICAgfVxuICAgIGFkZFRydXN0ZWRIVE1MKHN0eWxlcywgdGhpcy5zdHlsZSk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFN0eWxlKCkge1xuICAgIGlmICh0aGlzLndpZHRoID09PSAzLjE0MTU5MjY1MzU5KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmdPbkNoYW5nZXMoKSwgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BkZi1keW5hbWljLWNzcycpIGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChzdHlsZXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIChzdHlsZXMucGFyZW50RWxlbWVudCBhcyBhbnkpLnJlbW92ZUNoaWxkKHN0eWxlcyk7XG4gICAgfVxuICB9XG59XG4iLCIiXX0=