ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
206 lines • 22.8 kB
JavaScript
import { __decorate } from "tslib";
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { ChangeDetectionStrategy, Component, Input, ViewChild, ViewEncapsulation } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { WithConfig } from 'ng-zorro-antd/core/config';
import { warn } from 'ng-zorro-antd/core/logger';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { defaultImageSrcLoader } from './image-loader';
import { isFixedSize } from './utils';
import * as i0 from "@angular/core";
import * as i1 from "ng-zorro-antd/core/config";
import * as i2 from "ng-zorro-antd/core/services";
import * as i3 from "ng-zorro-antd/image";
export const NZ_CONFIG_MODULE_NAME = 'imageExperimental';
const sizeBreakpoints = [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840];
export class NzImageViewComponent {
constructor(cdr, nzConfigService, imagePreloadService) {
this.cdr = cdr;
this.nzConfigService = nzConfigService;
this.imagePreloadService = imagePreloadService;
this._nzModuleName = NZ_CONFIG_MODULE_NAME;
this.nzSrc = '';
this.nzAlt = '';
this.nzWidth = 'auto';
this.nzHeight = 'auto';
this.nzSrcLoader = defaultImageSrcLoader;
this.nzAutoSrcset = false;
this.nzPriority = false;
this.nzFallback = null;
this.nzPlaceholder = null;
this.nzDisablePreview = false;
this.src = '';
this.width = 'auto';
this.height = 'auto';
this.srcset = '';
this.destroy$ = new Subject();
this.reloadDisposeHandler = () => void 0;
this.nzConfigService
.getConfigChangeEventForComponent(NZ_CONFIG_MODULE_NAME)
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.composeImageAttrs();
this.cdr.markForCheck();
});
}
ngOnInit() {
if (this.nzPriority) {
this.preload();
}
}
ngOnChanges(changes) {
const { nzLoader, nzSrc, nzOptimize } = changes;
if (nzSrc || nzLoader || nzOptimize) {
this.composeImageAttrs();
}
}
ngOnDestroy() {
this.reloadDisposeHandler();
this.destroy$.next();
this.destroy$.complete();
}
preload() {
this.reloadDisposeHandler = this.imagePreloadService.addPreload({
src: this.src,
srcset: this.srcset
});
}
optimizable() {
if (this.nzAutoSrcset) {
if (!isFixedSize(this.nzWidth) || !isFixedSize(this.nzHeight)) {
warn(`When using "nzAutoSrcset" you should use a fixed size width and height, for more information please refer to CLS (https://web.dev/cls/) performance metrics`);
return false;
}
if (this.nzSrc.endsWith('.svg')) {
warn(`SVG does not need to be optimized`);
return false;
}
if (this.nzSrc.startsWith('data:')) {
warn(`Data URLs cannot be optimized`);
return false;
}
return true;
}
return false;
}
composeImageAttrs() {
const loader = this.getLoader();
if (!this.optimizable()) {
this.src = loader({ src: this.nzSrc });
this.width = this.nzWidth;
this.height = this.nzHeight;
return;
}
this.width = typeof this.nzWidth === 'number' ? this.nzWidth : parseInt(this.nzWidth, 10);
this.height = typeof this.nzHeight === 'number' ? this.nzHeight : parseInt(this.nzHeight, 10);
const widths = this.convertWidths(this.width, sizeBreakpoints);
this.src = loader({ src: this.nzSrc, width: widths[0] });
this.srcset = widths
.map((w, i) => `${loader({
src: this.nzSrc,
width: w
})} ${i + 1}x`)
.join(', ');
}
getLoader() {
return this.nzSrcLoader || defaultImageSrcLoader;
}
convertWidths(width, optimizeSizes) {
const allSizes = [...optimizeSizes].sort((a, b) => a - b);
return [
...new Set(
// 2x scale is sufficient
// https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html
[width, width * 2].map(w => allSizes.find(p => p >= w) || w))
];
}
}
NzImageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzImageViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NzConfigService }, { token: i2.ImagePreloadService }], target: i0.ɵɵFactoryTarget.Component });
NzImageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.5", type: NzImageViewComponent, selector: "nz-image", inputs: { nzSrc: "nzSrc", nzAlt: "nzAlt", nzWidth: "nzWidth", nzHeight: "nzHeight", nzSrcLoader: "nzSrcLoader", nzAutoSrcset: "nzAutoSrcset", nzPriority: "nzPriority", nzFallback: "nzFallback", nzPlaceholder: "nzPlaceholder", nzDisablePreview: "nzDisablePreview" }, viewQueries: [{ propertyName: "imageRef", first: true, predicate: ["imageRef"], descendants: true }], exportAs: ["nzImage"], usesOnChanges: true, ngImport: i0, template: `
<img
#imageRef
nz-image
[nzSrc]="src"
[nzSrcset]="srcset"
[nzDisablePreview]="nzDisablePreview"
[nzFallback]="nzFallback"
[nzPlaceholder]="nzPlaceholder"
[attr.width]="width"
[attr.height]="height"
[attr.srcset]="srcset"
[attr.alt]="nzAlt || null"
/>
`, isInline: true, directives: [{ type: i3.NzImageDirective, selector: "img[nz-image]", inputs: ["nzSrc", "nzSrcset", "nzDisablePreview", "nzFallback", "nzPlaceholder"], exportAs: ["nzImage"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzSrcLoader", void 0);
__decorate([
InputBoolean(),
WithConfig()
], NzImageViewComponent.prototype, "nzAutoSrcset", void 0);
__decorate([
InputBoolean()
], NzImageViewComponent.prototype, "nzPriority", void 0);
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzFallback", void 0);
__decorate([
WithConfig()
], NzImageViewComponent.prototype, "nzPlaceholder", void 0);
__decorate([
InputBoolean(),
WithConfig()
], NzImageViewComponent.prototype, "nzDisablePreview", void 0);
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzImageViewComponent, decorators: [{
type: Component,
args: [{
selector: 'nz-image',
exportAs: 'nzImage',
template: `
<img
#imageRef
nz-image
[nzSrc]="src"
[nzSrcset]="srcset"
[nzDisablePreview]="nzDisablePreview"
[nzFallback]="nzFallback"
[nzPlaceholder]="nzPlaceholder"
[attr.width]="width"
[attr.height]="height"
[attr.srcset]="srcset"
[attr.alt]="nzAlt || null"
/>
`,
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.NzConfigService }, { type: i2.ImagePreloadService }]; }, propDecorators: { nzSrc: [{
type: Input
}], nzAlt: [{
type: Input
}], nzWidth: [{
type: Input
}], nzHeight: [{
type: Input
}], nzSrcLoader: [{
type: Input
}], nzAutoSrcset: [{
type: Input
}], nzPriority: [{
type: Input
}], nzFallback: [{
type: Input
}], nzPlaceholder: [{
type: Input
}], nzDisablePreview: [{
type: Input
}], imageRef: [{
type: ViewChild,
args: ['imageRef']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29tcG9uZW50cy9leHBlcmltZW50YWwvaW1hZ2UvaW1hZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQ0wsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxLQUFLLEVBS0wsU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWdDLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdkQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7QUFFdEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWdCLG1CQUFtQixDQUFDO0FBQ3RFLE1BQU0sZUFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUF3QnpHLE1BQU0sT0FBTyxvQkFBb0I7SUE0Qi9CLFlBQ1UsR0FBc0IsRUFDdkIsZUFBZ0MsRUFDL0IsbUJBQXdDO1FBRnhDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3ZCLG9CQUFl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Ozs7Ozs7O0dBY1Q7b0JBQ0QsbUJBQW1CLEVBQUUsS0FBSztvQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2lCQUN0Qzt3S0FPVSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNpQixXQUFXO3NCQUFqQyxLQUFLO2dCQUNpQyxZQUFZO3NCQUFsRCxLQUFLO2dCQUNtQixVQUFVO3NCQUFsQyxLQUFLO2dCQUNpQixVQUFVO3NCQUFoQyxLQUFLO2dCQUNpQixhQUFhO3NCQUFuQyxLQUFLO2dCQUNpQyxnQkFBZ0I7c0JBQXRELEtBQUs7Z0JBQ2lCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTnpDb25maWdLZXksIE56Q29uZmlnU2VydmljZSwgV2l0aENvbmZpZyB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgd2FybiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9sb2dnZXInO1xuaW1wb3J0IHsgSW1hZ2VQcmVsb2FkU2VydmljZSwgUHJlbG9hZERpc3Bvc2VIYW5kbGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvc2VydmljZXMnO1xuaW1wb3J0IHsgQm9vbGVhbklucHV0IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcblxuaW1wb3J0IHsgZGVmYXVsdEltYWdlU3JjTG9hZGVyIH0gZnJvbSAnLi9pbWFnZS1sb2FkZXInO1xuaW1wb3J0IHsgTnpJbWFnZVNyY0xvYWRlciB9IGZyb20gJy4vdHlwaW5ncyc7XG5pbXBvcnQgeyBpc0ZpeGVkU2l6ZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgTlpfQ09ORklHX01PRFVMRV9OQU1FOiBOekNvbmZpZ0tleSA9ICdpbWFnZUV4cGVyaW1lbnRhbCc7XG5jb25zdCBzaXplQnJlYWtwb2ludHMgPSBbMTYsIDMyLCA0OCwgNjQsIDk2LCAxMjgsIDI1NiwgMzg0LCA2NDAsIDc1MCwgODI4LCAxMDgwLCAxMjAwLCAxOTIwLCAyMDQ4LCAzODQwXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotaW1hZ2UnLFxuICBleHBvcnRBczogJ256SW1hZ2UnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxpbWdcbiAgICAgICNpbWFnZVJlZlxuICAgICAgbnotaW1hZ2VcbiAgICAgIFtuelNyY109XCJzcmNcIlxuICAgICAgW256U3Jjc2V0XT1cInNyY3NldFwiXG4gICAgICBbbnpEaXNhYmxlUHJldmlld109XCJuekRpc2FibGVQcmV2aWV3XCJcbiAgICAgIFtuekZhbGxiYWNrXT1cIm56RmFsbGJhY2tcIlxuICAgICAgW256UGxhY2Vob2xkZXJdPVwibnpQbGFjZWhvbGRlclwiXG4gICAgICBbYXR0ci53aWR0aF09XCJ3aWR0aFwiXG4gICAgICBbYXR0ci5oZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgIFthdHRyLnNyY3NldF09XCJzcmNzZXRcIlxuICAgICAgW2F0dHIuYWx0XT1cIm56QWx0IHx8IG51bGxcIlxuICAgIC8+XG4gIGAsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBOekltYWdlVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICByZWFkb25seSBfbnpNb2R1bGVOYW1lOiBOekNvbmZpZ0tleSA9IE5aX0NPTkZJR19NT0RVTEVfTkFNRTtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256QXV0b1NyY3NldDogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpQcmlvcml0eTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpEaXNhYmxlUHJldmlldzogQm9vbGVhbklucHV0O1xuXG4gIEBJbnB1dCgpIG56U3JjOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgbnpBbHQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBueldpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnYXV0byc7XG4gIEBJbnB1dCgpIG56SGVpZ2h0OiBzdHJpbmcgfCBudW1iZXIgPSAnYXV0byc7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgbnpTcmNMb2FkZXI6IE56SW1hZ2VTcmNMb2FkZXIgPSBkZWZhdWx0SW1hZ2VTcmNMb2FkZXI7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBAV2l0aENvbmZpZygpIG56QXV0b1NyY3NldDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpQcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBAV2l0aENvbmZpZygpIG56RmFsbGJhY2s6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBAV2l0aENvbmZpZygpIG56UGxhY2Vob2xkZXI6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgQFdpdGhDb25maWcoKSBuekRpc2FibGVQcmV2aWV3OiBib29sZWFuID0gZmFsc2U7XG4gIEBWaWV3Q2hpbGQoJ2ltYWdlUmVmJykgaW1hZ2VSZWYhOiBFbGVtZW50UmVmPEhUTUxJbWFnZUVsZW1lbnQ+O1xuXG4gIHNyYyA9ICcnO1xuXG4gIHdpZHRoOiBzdHJpbmcgfCBudW1iZXIgPSAnYXV0byc7XG4gIGhlaWdodDogc3RyaW5nIHwgbnVtYmVyID0gJ2F1dG8nO1xuICBzcmNzZXQgPSAnJztcbiAgaW50ZXJuYWxJbWFnZSE6IEhUTUxJbWFnZUVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVsb2FkRGlzcG9zZUhhbmRsZXI6IFByZWxvYWREaXNwb3NlSGFuZGxlID0gKCkgPT4gdm9pZCAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgbnpDb25maWdTZXJ2aWNlOiBOekNvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbWFnZVByZWxvYWRTZXJ2aWNlOiBJbWFnZVByZWxvYWRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMubnpDb25maWdTZXJ2aWNlXG4gICAgICAuZ2V0Q29uZmlnQ2hhbmdlRXZlbnRGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY29tcG9zZUltYWdlQXR0cnMoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56UHJpb3JpdHkpIHtcbiAgICAgIHRoaXMucHJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56TG9hZGVyLCBuelNyYywgbnpPcHRpbWl6ZSB9ID0gY2hhbmdlcztcblxuICAgIGlmIChuelNyYyB8fCBuekxvYWRlciB8fCBuek9wdGltaXplKSB7XG4gICAgICB0aGlzLmNvbXBvc2VJbWFnZUF0dHJzKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWREaXNwb3NlSGFuZGxlcigpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlbG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbG9hZERpc3Bvc2VIYW5kbGVyID0gdGhpcy5pbWFnZVByZWxvYWRTZXJ2aWNlLmFkZFByZWxvYWQoe1xuICAgICAgc3JjOiB0aGlzLnNyYyxcbiAgICAgIHNyY3NldDogdGhpcy5zcmNzZXRcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb3B0aW1pemFibGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubnpBdXRvU3Jjc2V0KSB7XG4gICAgICBpZiAoIWlzRml4ZWRTaXplKHRoaXMubnpXaWR0aCkgfHwgIWlzRml4ZWRTaXplKHRoaXMubnpIZWlnaHQpKSB7XG4gICAgICAgIHdhcm4oXG4gICAgICAgICAgYFdoZW4gdXNpbmcgXCJuekF1dG9TcmNzZXRcIiB5b3Ugc2hvdWxkIHVzZSBhIGZpeGVkIHNpemUgd2lkdGggYW5kIGhlaWdodCwgZm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIENMUyAoaHR0cHM6Ly93ZWIuZGV2L2Nscy8pIHBlcmZvcm1hbmNlIG1ldHJpY3NgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm56U3JjLmVuZHNXaXRoKCcuc3ZnJykpIHtcbiAgICAgICAgd2FybihgU1ZHIGRvZXMgbm90IG5lZWQgdG8gYmUgb3B0aW1pemVkYCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm56U3JjLnN0YXJ0c1dpdGgoJ2RhdGE6JykpIHtcbiAgICAgICAgd2FybihgRGF0YSBVUkxzIGNhbm5vdCBiZSBvcHRpbWl6ZWRgKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9zZUltYWdlQXR0cnMoKTogdm9pZCB7XG4gICAgY29uc3QgbG9hZGVyID0gdGhpcy5nZXRMb2FkZXIoKTtcbiAgICBpZiAoIXRoaXMub3B0aW1pemFibGUoKSkge1xuICAgICAgdGhpcy5zcmMgPSBsb2FkZXIoeyBzcmM6IHRoaXMubnpTcmMgfSk7XG4gICAgICB0aGlzLndpZHRoID0gdGhpcy5ueldpZHRoO1xuICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLm56SGVpZ2h0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLndpZHRoID0gdHlwZW9mIHRoaXMubnpXaWR0aCA9PT0gJ251bWJlcicgPyB0aGlzLm56V2lkdGggOiBwYXJzZUludCh0aGlzLm56V2lkdGgsIDEwKTtcbiAgICB0aGlzLmhlaWdodCA9IHR5cGVvZiB0aGlzLm56SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHRoaXMubnpIZWlnaHQgOiBwYXJzZUludCh0aGlzLm56SGVpZ2h0LCAxMCk7XG4gICAgY29uc3Qgd2lkdGhzID0gdGhpcy5jb252ZXJ0V2lkdGhzKHRoaXMud2lkdGgsIHNpemVCcmVha3BvaW50cyk7XG4gICAgdGhpcy5zcmMgPSBsb2FkZXIoeyBzcmM6IHRoaXMubnpTcmMsIHdpZHRoOiB3aWR0aHNbMF0gfSk7XG4gICAgdGhpcy5zcmNzZXQgPSB3aWR0aHNcbiAgICAgIC5tYXAoXG4gICAgICAgICh3LCBpKSA9PlxuICAgICAgICAgIGAke2xvYWRlcih7XG4gICAgICAgICAgICBzcmM6IHRoaXMubnpTcmMsXG4gICAgICAgICAgICB3aWR0aDogd1xuICAgICAgICAgIH0pfSAke2kgKyAxfXhgXG4gICAgICApXG4gICAgICAuam9pbignLCAnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TG9hZGVyKCk6IE56SW1hZ2VTcmNMb2FkZXIge1xuICAgIHJldHVybiB0aGlzLm56U3JjTG9hZGVyIHx8IGRlZmF1bHRJbWFnZVNyY0xvYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFdpZHRocyh3aWR0aDogbnVtYmVyLCBvcHRpbWl6ZVNpemVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgICBjb25zdCBhbGxTaXplcyA9IFsuLi5vcHRpbWl6ZVNpemVzXS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIC8vIDJ4IHNjYWxlIGlzIHN1ZmZpY2llbnRcbiAgICAgICAgLy8gaHR0cHM6Ly9ibG9nLnR3aXR0ZXIuY29tL2VuZ2luZWVyaW5nL2VuX3VzL3RvcGljcy9pbmZyYXN0cnVjdHVyZS8yMDE5L2NhcHBpbmctaW1hZ2UtZmlkZWxpdHktb24tdWx0cmEtaGlnaC1yZXNvbHV0aW9uLWRldmljZXMuaHRtbFxuICAgICAgICBbd2lkdGgsIHdpZHRoICogMl0ubWFwKHcgPT4gYWxsU2l6ZXMuZmluZChwID0+IHAgPj0gdykgfHwgdylcbiAgICAgIClcbiAgICBdO1xuICB9XG59XG4iXX0=