ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
314 lines • 30 kB
JavaScript
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { toCssPixel } from 'ng-zorro-antd/core/util';
import { NzMNContainerComponent } from 'ng-zorro-antd/message';
import { NzNotificationComponent } from './notification.component';
import * as i0 from "@angular/core";
import * as i1 from "ng-zorro-antd/core/config";
const NZ_CONFIG_MODULE_NAME = 'notification';
const NZ_NOTIFICATION_DEFAULT_CONFIG = {
nzTop: '24px',
nzBottom: '24px',
nzPlacement: 'topRight',
nzDuration: 4500,
nzMaxStack: 8,
nzPauseOnHover: true,
nzAnimate: true,
nzDirection: 'ltr'
};
export class NzNotificationContainerComponent extends NzMNContainerComponent {
constructor(cdr, nzConfigService) {
super(cdr, nzConfigService);
this.dir = 'ltr';
this.instances = [];
this.topLeftInstances = [];
this.topRightInstances = [];
this.bottomLeftInstances = [];
this.bottomRightInstances = [];
this.topInstances = [];
this.bottomInstances = [];
const config = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME);
this.dir = config?.nzDirection || 'ltr';
}
create(notification) {
const noti = this.onCreate(notification);
const key = noti.options.nzKey;
const notificationWithSameKey = this.instances.find(msg => msg.options.nzKey === notification.options.nzKey);
if (key && notificationWithSameKey) {
this.replaceNotification(notificationWithSameKey, noti);
}
else {
if (this.instances.length >= this.config.nzMaxStack) {
this.instances = this.instances.slice(1);
}
this.instances = [...this.instances, noti];
}
this.readyInstances();
return noti;
}
onCreate(instance) {
instance.options = this.mergeOptions(instance.options);
instance.onClose = new Subject();
instance.onClick = new Subject();
return instance;
}
subscribeConfigChange() {
this.nzConfigService
.getConfigChangeEventForComponent(NZ_CONFIG_MODULE_NAME)
.pipe(takeUntil(this.destroy$))
.subscribe(() => {
this.updateConfig();
const config = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME);
if (config) {
const { nzDirection } = config;
this.dir = nzDirection || this.dir;
}
});
}
updateConfig() {
this.config = {
...NZ_NOTIFICATION_DEFAULT_CONFIG,
...this.config,
...this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME)
};
this.top = toCssPixel(this.config.nzTop);
this.bottom = toCssPixel(this.config.nzBottom);
this.cdr.markForCheck();
}
replaceNotification(old, _new) {
old.title = _new.title;
old.content = _new.content;
old.template = _new.template;
old.type = _new.type;
old.options = _new.options;
}
readyInstances() {
const instancesMap = {
topLeft: [],
topRight: [],
bottomLeft: [],
bottomRight: [],
top: [],
bottom: []
};
this.instances.forEach(m => {
const placement = m.options.nzPlacement;
switch (placement) {
case 'topLeft':
instancesMap.topLeft.unshift(m);
break;
case 'topRight':
instancesMap.topRight.unshift(m);
break;
case 'bottomLeft':
instancesMap.bottomLeft.unshift(m);
break;
case 'bottomRight':
instancesMap.bottomRight.unshift(m);
break;
case 'top':
instancesMap.top.unshift(m);
break;
case 'bottom':
instancesMap.bottom.unshift(m);
break;
default:
instancesMap.topRight.unshift(m);
}
});
this.topLeftInstances = instancesMap.topLeft;
this.topRightInstances = instancesMap.topRight;
this.bottomLeftInstances = instancesMap.bottomLeft;
this.bottomRightInstances = instancesMap.bottomRight;
this.topInstances = instancesMap.top;
this.bottomInstances = instancesMap.bottom;
this.cdr.detectChanges();
}
mergeOptions(options) {
const { nzDuration, nzAnimate, nzPauseOnHover, nzPlacement } = this.config;
return { nzDuration, nzAnimate, nzPauseOnHover, nzPlacement, ...options };
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzNotificationContainerComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.NzConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.1.2", type: NzNotificationContainerComponent, isStandalone: true, selector: "nz-notification-container", exportAs: ["nzNotificationContainer"], usesInheritance: true, ngImport: i0, template: `
<div
class="ant-notification ant-notification-topLeft"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.left]="'0px'"
>
(instance of topLeftInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'topLeft'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-topRight"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.right]="'0px'"
>
(instance of topRightInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'topRight'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-bottomLeft"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.left]="'0px'"
>
(instance of bottomLeftInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottomLeft'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-bottomRight"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.right]="'0px'"
>
(instance of bottomRightInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottomRight'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-top"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.left]="'50%'"
[style.transform]="'translateX(-50%)'"
>
(instance of topInstances; track instance) {
<nz-notification [instance]="instance" [placement]="'top'" (destroyed)="remove($event.id, $event.userAction)" />
}
</div>
<div
class="ant-notification ant-notification-bottom"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.left]="'50%'"
[style.transform]="'translateX(-50%)'"
>
(instance of bottomInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottom'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
`, isInline: true, dependencies: [{ kind: "component", type: NzNotificationComponent, selector: "nz-notification", inputs: ["instance", "index", "placement"], outputs: ["destroyed"], exportAs: ["nzNotification"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.2", ngImport: i0, type: NzNotificationContainerComponent, decorators: [{
type: Component,
args: [{
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
selector: 'nz-notification-container',
exportAs: 'nzNotificationContainer',
preserveWhitespaces: false,
template: `
<div
class="ant-notification ant-notification-topLeft"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.left]="'0px'"
>
(instance of topLeftInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'topLeft'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-topRight"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.right]="'0px'"
>
(instance of topRightInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'topRight'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-bottomLeft"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.left]="'0px'"
>
(instance of bottomLeftInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottomLeft'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-bottomRight"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.right]="'0px'"
>
(instance of bottomRightInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottomRight'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
<div
class="ant-notification ant-notification-top"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.top]="top"
[style.left]="'50%'"
[style.transform]="'translateX(-50%)'"
>
(instance of topInstances; track instance) {
<nz-notification [instance]="instance" [placement]="'top'" (destroyed)="remove($event.id, $event.userAction)" />
}
</div>
<div
class="ant-notification ant-notification-bottom"
[class.ant-notification-rtl]="dir === 'rtl'"
[style.bottom]="bottom"
[style.left]="'50%'"
[style.transform]="'translateX(-50%)'"
>
(instance of bottomInstances; track instance) {
<nz-notification
[instance]="instance"
[placement]="'bottom'"
(destroyed)="remove($event.id, $event.userAction)"
/>
}
</div>
`,
imports: [NzNotificationComponent],
standalone: true
}]
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.NzConfigService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWNvbnRhaW5lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24tY29udGFpbmVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7OztBQUduRSxNQUFNLHFCQUFxQixHQUFHLGNBQWMsQ0FBQztBQUU3QyxNQUFNLDhCQUE4QixHQUFpQztJQUNuRSxLQUFLLEVBQUUsTUFBTTtJQUNiLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLFdBQVcsRUFBRSxVQUFVO0lBQ3ZCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsY0FBYyxFQUFFLElBQUk7SUFDcEIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsS0FBSztDQUNuQixDQUFDO0FBK0ZGLE1BQU0sT0FBTyxnQ0FBaUMsU0FBUSxzQkFBc0I7SUFhMUUsWUFBWSxHQUFzQixFQUFFLGVBQWdDO1FBQ2xFLEtBQUssQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFiOUIsUUFBRyxHQUFjLEtBQUssQ0FBQztRQUlkLGNBQVMsR0FBd0MsRUFBRSxDQUFDO1FBQzdELHFCQUFnQixHQUF3QyxFQUFFLENBQUM7UUFDM0Qsc0JBQWlCLEdBQXdD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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1GVCw0REFDUyx1QkFBdUI7OzJGQUd0QixnQ0FBZ0M7a0JBN0Y1QyxTQUFTO21CQUFDO29CQUNULGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTtvQkFDckMsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsUUFBUSxFQUFFLHlCQUF5QjtvQkFDbkMsbUJBQW1CLEVBQUUsS0FBSztvQkFDMUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1GVDtvQkFDRCxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgRGlyZWN0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IE5vdGlmaWNhdGlvbkNvbmZpZywgTnpDb25maWdTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL2NvbmZpZyc7XG5pbXBvcnQgeyB0b0Nzc1BpeGVsIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpNTkNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJ25nLXpvcnJvLWFudGQvbWVzc2FnZSc7XG5cbmltcG9ydCB7IE56Tm90aWZpY2F0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9ub3RpZmljYXRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE56Tm90aWZpY2F0aW9uRGF0YSwgTnpOb3RpZmljYXRpb25EYXRhT3B0aW9ucywgTnpOb3RpZmljYXRpb25QbGFjZW1lbnQgfSBmcm9tICcuL3R5cGluZ3MnO1xuXG5jb25zdCBOWl9DT05GSUdfTU9EVUxFX05BTUUgPSAnbm90aWZpY2F0aW9uJztcblxuY29uc3QgTlpfTk9USUZJQ0FUSU9OX0RFRkFVTFRfQ09ORklHOiBSZXF1aXJlZDxOb3RpZmljYXRpb25Db25maWc+ID0ge1xuICBuelRvcDogJzI0cHgnLFxuICBuekJvdHRvbTogJzI0cHgnLFxuICBuelBsYWNlbWVudDogJ3RvcFJpZ2h0JyxcbiAgbnpEdXJhdGlvbjogNDUwMCxcbiAgbnpNYXhTdGFjazogOCxcbiAgbnpQYXVzZU9uSG92ZXI6IHRydWUsXG4gIG56QW5pbWF0ZTogdHJ1ZSxcbiAgbnpEaXJlY3Rpb246ICdsdHInXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHNlbGVjdG9yOiAnbnotbm90aWZpY2F0aW9uLWNvbnRhaW5lcicsXG4gIGV4cG9ydEFzOiAnbnpOb3RpZmljYXRpb25Db250YWluZXInLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImFudC1ub3RpZmljYXRpb24gYW50LW5vdGlmaWNhdGlvbi10b3BMZWZ0XCJcbiAgICAgIFtjbGFzcy5hbnQtbm90aWZpY2F0aW9uLXJ0bF09XCJkaXIgPT09ICdydGwnXCJcbiAgICAgIFtzdHlsZS50b3BdPVwidG9wXCJcbiAgICAgIFtzdHlsZS5sZWZ0XT1cIicwcHgnXCJcbiAgICA+XG4gICAgICBAZm9yIChpbnN0YW5jZSBvZiB0b3BMZWZ0SW5zdGFuY2VzOyB0cmFjayBpbnN0YW5jZSkge1xuICAgICAgICA8bnotbm90aWZpY2F0aW9uXG4gICAgICAgICAgW2luc3RhbmNlXT1cImluc3RhbmNlXCJcbiAgICAgICAgICBbcGxhY2VtZW50XT1cIid0b3BMZWZ0J1wiXG4gICAgICAgICAgKGRlc3Ryb3llZCk9XCJyZW1vdmUoJGV2ZW50LmlkLCAkZXZlbnQudXNlckFjdGlvbilcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiYW50LW5vdGlmaWNhdGlvbiBhbnQtbm90aWZpY2F0aW9uLXRvcFJpZ2h0XCJcbiAgICAgIFtjbGFzcy5hbnQtbm90aWZpY2F0aW9uLXJ0bF09XCJkaXIgPT09ICdydGwnXCJcbiAgICAgIFtzdHlsZS50b3BdPVwidG9wXCJcbiAgICAgIFtzdHlsZS5yaWdodF09XCInMHB4J1wiXG4gICAgPlxuICAgICAgQGZvciAoaW5zdGFuY2Ugb2YgdG9wUmlnaHRJbnN0YW5jZXM7IHRyYWNrIGluc3RhbmNlKSB7XG4gICAgICAgIDxuei1ub3RpZmljYXRpb25cbiAgICAgICAgICBbaW5zdGFuY2VdPVwiaW5zdGFuY2VcIlxuICAgICAgICAgIFtwbGFjZW1lbnRdPVwiJ3RvcFJpZ2h0J1wiXG4gICAgICAgICAgKGRlc3Ryb3llZCk9XCJyZW1vdmUoJGV2ZW50LmlkLCAkZXZlbnQudXNlckFjdGlvbilcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwiYW50LW5vdGlmaWNhdGlvbiBhbnQtbm90aWZpY2F0aW9uLWJvdHRvbUxlZnRcIlxuICAgICAgW2NsYXNzLmFudC1ub3RpZmljYXRpb24tcnRsXT1cImRpciA9PT0gJ3J0bCdcIlxuICAgICAgW3N0eWxlLmJvdHRvbV09XCJib3R0b21cIlxuICAgICAgW3N0eWxlLmxlZnRdPVwiJzBweCdcIlxuICAgID5cbiAgICAgIEBmb3IgKGluc3RhbmNlIG9mIGJvdHRvbUxlZnRJbnN0YW5jZXM7IHRyYWNrIGluc3RhbmNlKSB7XG4gICAgICAgIDxuei1ub3RpZmljYXRpb25cbiAgICAgICAgICBbaW5zdGFuY2VdPVwiaW5zdGFuY2VcIlxuICAgICAgICAgIFtwbGFjZW1lbnRdPVwiJ2JvdHRvbUxlZnQnXCJcbiAgICAgICAgICAoZGVzdHJveWVkKT1cInJlbW92ZSgkZXZlbnQuaWQsICRldmVudC51c2VyQWN0aW9uKVwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJhbnQtbm90aWZpY2F0aW9uIGFudC1ub3RpZmljYXRpb24tYm90dG9tUmlnaHRcIlxuICAgICAgW2NsYXNzLmFudC1ub3RpZmljYXRpb24tcnRsXT1cImRpciA9PT0gJ3J0bCdcIlxuICAgICAgW3N0eWxlLmJvdHRvbV09XCJib3R0b21cIlxuICAgICAgW3N0eWxlLnJpZ2h0XT1cIicwcHgnXCJcbiAgICA+XG4gICAgICBAZm9yIChpbnN0YW5jZSBvZiBib3R0b21SaWdodEluc3RhbmNlczsgdHJhY2sgaW5zdGFuY2UpIHtcbiAgICAgICAgPG56LW5vdGlmaWNhdGlvblxuICAgICAgICAgIFtpbnN0YW5jZV09XCJpbnN0YW5jZVwiXG4gICAgICAgICAgW3BsYWNlbWVudF09XCInYm90dG9tUmlnaHQnXCJcbiAgICAgICAgICAoZGVzdHJveWVkKT1cInJlbW92ZSgkZXZlbnQuaWQsICRldmVudC51c2VyQWN0aW9uKVwiXG4gICAgICAgIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJhbnQtbm90aWZpY2F0aW9uIGFudC1ub3RpZmljYXRpb24tdG9wXCJcbiAgICAgIFtjbGFzcy5hbnQtbm90aWZpY2F0aW9uLXJ0bF09XCJkaXIgPT09ICdydGwnXCJcbiAgICAgIFtzdHlsZS50b3BdPVwidG9wXCJcbiAgICAgIFtzdHlsZS5sZWZ0XT1cIic1MCUnXCJcbiAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoLTUwJSknXCJcbiAgICA+XG4gICAgICBAZm9yIChpbnN0YW5jZSBvZiB0b3BJbnN0YW5jZXM7IHRyYWNrIGluc3RhbmNlKSB7XG4gICAgICAgIDxuei1ub3RpZmljYXRpb24gW2luc3RhbmNlXT1cImluc3RhbmNlXCIgW3BsYWNlbWVudF09XCIndG9wJ1wiIChkZXN0cm95ZWQpPVwicmVtb3ZlKCRldmVudC5pZCwgJGV2ZW50LnVzZXJBY3Rpb24pXCIgLz5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImFudC1ub3RpZmljYXRpb24gYW50LW5vdGlmaWNhdGlvbi1ib3R0b21cIlxuICAgICAgW2NsYXNzLmFudC1ub3RpZmljYXRpb24tcnRsXT1cImRpciA9PT0gJ3J0bCdcIlxuICAgICAgW3N0eWxlLmJvdHRvbV09XCJib3R0b21cIlxuICAgICAgW3N0eWxlLmxlZnRdPVwiJzUwJSdcIlxuICAgICAgW3N0eWxlLnRyYW5zZm9ybV09XCIndHJhbnNsYXRlWCgtNTAlKSdcIlxuICAgID5cbiAgICAgIEBmb3IgKGluc3RhbmNlIG9mIGJvdHRvbUluc3RhbmNlczsgdHJhY2sgaW5zdGFuY2UpIHtcbiAgICAgICAgPG56LW5vdGlmaWNhdGlvblxuICAgICAgICAgIFtpbnN0YW5jZV09XCJpbnN0YW5jZVwiXG4gICAgICAgICAgW3BsYWNlbWVudF09XCInYm90dG9tJ1wiXG4gICAgICAgICAgKGRlc3Ryb3llZCk9XCJyZW1vdmUoJGV2ZW50LmlkLCAkZXZlbnQudXNlckFjdGlvbilcIlxuICAgICAgICAvPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBpbXBvcnRzOiBbTnpOb3RpZmljYXRpb25Db21wb25lbnRdLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIE56Tm90aWZpY2F0aW9uQ29udGFpbmVyQ29tcG9uZW50IGV4dGVuZHMgTnpNTkNvbnRhaW5lckNvbXBvbmVudCB7XG4gIGRpcjogRGlyZWN0aW9uID0gJ2x0cic7XG4gIGJvdHRvbT86IHN0cmluZyB8IG51bGw7XG4gIHRvcD86IHN0cmluZyB8IG51bGw7XG4gIG92ZXJyaWRlIGNvbmZpZyE6IFJlcXVpcmVkPE5vdGlmaWNhdGlvbkNvbmZpZz47IC8vIGluaXRpYWxpemVkIGJ5IHBhcmVudCBjbGFzcyBjb25zdHJ1Y3RvclxuICBvdmVycmlkZSBpbnN0YW5jZXM6IEFycmF5PFJlcXVpcmVkPE56Tm90aWZpY2F0aW9uRGF0YT4+ID0gW107XG4gIHRvcExlZnRJbnN0YW5jZXM6IEFycmF5PFJlcXVpcmVkPE56Tm90aWZpY2F0aW9uRGF0YT4+ID0gW107XG4gIHRvcFJpZ2h0SW5zdGFuY2VzOiBBcnJheTxSZXF1aXJlZDxOek5vdGlmaWNhdGlvbkRhdGE+PiA9IFtdO1xuICBib3R0b21MZWZ0SW5zdGFuY2VzOiBBcnJheTxSZXF1aXJlZDxOek5vdGlmaWNhdGlvbkRhdGE+PiA9IFtdO1xuICBib3R0b21SaWdodEluc3RhbmNlczogQXJyYXk8UmVxdWlyZWQ8TnpOb3RpZmljYXRpb25EYXRhPj4gPSBbXTtcbiAgdG9wSW5zdGFuY2VzOiBBcnJheTxSZXF1aXJlZDxOek5vdGlmaWNhdGlvbkRhdGE+PiA9IFtdO1xuICBib3R0b21JbnN0YW5jZXM6IEFycmF5PFJlcXVpcmVkPE56Tm90aWZpY2F0aW9uRGF0YT4+ID0gW107XG5cbiAgY29uc3RydWN0b3IoY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgbnpDb25maWdTZXJ2aWNlOiBOekNvbmZpZ1NlcnZpY2UpIHtcbiAgICBzdXBlcihjZHIsIG56Q29uZmlnU2VydmljZSk7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5uekNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnRm9yQ29tcG9uZW50KE5aX0NPTkZJR19NT0RVTEVfTkFNRSk7XG4gICAgdGhpcy5kaXIgPSBjb25maWc/Lm56RGlyZWN0aW9uIHx8ICdsdHInO1xuICB9XG5cbiAgb3ZlcnJpZGUgY3JlYXRlKG5vdGlmaWNhdGlvbjogTnpOb3RpZmljYXRpb25EYXRhKTogUmVxdWlyZWQ8TnpOb3RpZmljYXRpb25EYXRhPiB7XG4gICAgY29uc3Qgbm90aSA9IHRoaXMub25DcmVhdGUobm90aWZpY2F0aW9uKTtcbiAgICBjb25zdCBrZXkgPSBub3RpLm9wdGlvbnMubnpLZXk7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uV2l0aFNhbWVLZXkgPSB0aGlzLmluc3RhbmNlcy5maW5kKFxuICAgICAgbXNnID0+IG1zZy5vcHRpb25zLm56S2V5ID09PSAobm90aWZpY2F0aW9uLm9wdGlvbnMgYXMgUmVxdWlyZWQ8TnpOb3RpZmljYXRpb25EYXRhT3B0aW9ucz4pLm56S2V5XG4gICAgKTtcbiAgICBpZiAoa2V5ICYmIG5vdGlmaWNhdGlvbldpdGhTYW1lS2V5KSB7XG4gICAgICB0aGlzLnJlcGxhY2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uV2l0aFNhbWVLZXksIG5vdGkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5pbnN0YW5jZXMubGVuZ3RoID49IHRoaXMuY29uZmlnLm56TWF4U3RhY2spIHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSB0aGlzLmluc3RhbmNlcy5zbGljZSgxKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5zdGFuY2VzID0gWy4uLnRoaXMuaW5zdGFuY2VzLCBub3RpXTtcbiAgICB9XG5cbiAgICB0aGlzLnJlYWR5SW5zdGFuY2VzKCk7XG5cbiAgICByZXR1cm4gbm90aTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvbkNyZWF0ZShpbnN0YW5jZTogTnpOb3RpZmljYXRpb25EYXRhKTogUmVxdWlyZWQ8TnpOb3RpZmljYXRpb25EYXRhPiB7XG4gICAgaW5zdGFuY2Uub3B0aW9ucyA9IHRoaXMubWVyZ2VPcHRpb25zKGluc3RhbmNlLm9wdGlvbnMpO1xuICAgIGluc3RhbmNlLm9uQ2xvc2UgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIGluc3RhbmNlLm9uQ2xpY2sgPSBuZXcgU3ViamVjdDxNb3VzZUV2ZW50PigpO1xuICAgIHJldHVybiBpbnN0YW5jZSBhcyBSZXF1aXJlZDxOek5vdGlmaWNhdGlvbkRhdGE+O1xuICB9XG5cbiAgcHJvdGVjdGVkIHN1YnNjcmliZUNvbmZpZ0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm56Q29uZmlnU2VydmljZVxuICAgICAgLmdldENvbmZpZ0NoYW5nZUV2ZW50Rm9yQ29tcG9uZW50KE5aX0NPTkZJR19NT0RVTEVfTkFNRSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZygpO1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKTtcbiAgICAgICAgaWYgKGNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHsgbnpEaXJlY3Rpb24gfSA9IGNvbmZpZztcbiAgICAgICAgICB0aGlzLmRpciA9IG56RGlyZWN0aW9uIHx8IHRoaXMuZGlyO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cGRhdGVDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi5OWl9OT1RJRklDQVRJT05fREVGQVVMVF9DT05GSUcsXG4gICAgICAuLi50aGlzLmNvbmZpZyxcbiAgICAgIC4uLnRoaXMubnpDb25maWdTZXJ2aWNlLmdldENvbmZpZ0ZvckNvbXBvbmVudChOWl9DT05GSUdfTU9EVUxFX05BTUUpXG4gICAgfTtcblxuICAgIHRoaXMudG9wID0gdG9Dc3NQaXhlbCh0aGlzLmNvbmZpZy5uelRvcCEpO1xuICAgIHRoaXMuYm90dG9tID0gdG9Dc3NQaXhlbCh0aGlzLmNvbmZpZy5uekJvdHRvbSEpO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIHJlcGxhY2VOb3RpZmljYXRpb24ob2xkOiBOek5vdGlmaWNhdGlvbkRhdGEsIF9uZXc6IE56Tm90aWZpY2F0aW9uRGF0YSk6IHZvaWQge1xuICAgIG9sZC50aXRsZSA9IF9uZXcudGl0bGU7XG4gICAgb2xkLmNvbnRlbnQgPSBfbmV3LmNvbnRlbnQ7XG4gICAgb2xkLnRlbXBsYXRlID0gX25ldy50ZW1wbGF0ZTtcbiAgICBvbGQudHlwZSA9IF9uZXcudHlwZTtcbiAgICBvbGQub3B0aW9ucyA9IF9uZXcub3B0aW9ucztcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSByZWFkeUluc3RhbmNlcygpOiB2b2lkIHtcbiAgICBjb25zdCBpbnN0YW5jZXNNYXA6IFJlY29yZDxOek5vdGlmaWNhdGlvblBsYWNlbWVudCwgQXJyYXk8UmVxdWlyZWQ8TnpOb3RpZmljYXRpb25EYXRhPj4+ID0ge1xuICAgICAgdG9wTGVmdDogW10sXG4gICAgICB0b3BSaWdodDogW10sXG4gICAgICBib3R0b21MZWZ0OiBbXSxcbiAgICAgIGJvdHRvbVJpZ2h0OiBbXSxcbiAgICAgIHRvcDogW10sXG4gICAgICBib3R0b206IFtdXG4gICAgfTtcbiAgICB0aGlzLmluc3RhbmNlcy5mb3JFYWNoKG0gPT4ge1xuICAgICAgY29uc3QgcGxhY2VtZW50ID0gbS5vcHRpb25zLm56UGxhY2VtZW50O1xuICAgICAgc3dpdGNoIChwbGFjZW1lbnQpIHtcbiAgICAgICAgY2FzZSAndG9wTGVmdCc6XG4gICAgICAgICAgaW5zdGFuY2VzTWFwLnRvcExlZnQudW5zaGlmdChtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndG9wUmlnaHQnOlxuICAgICAgICAgIGluc3RhbmNlc01hcC50b3BSaWdodC51bnNoaWZ0KG0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b21MZWZ0JzpcbiAgICAgICAgICBpbnN0YW5jZXNNYXAuYm90dG9tTGVmdC51bnNoaWZ0KG0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b21SaWdodCc6XG4gICAgICAgICAgaW5zdGFuY2VzTWFwLmJvdHRvbVJpZ2h0LnVuc2hpZnQobSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgaW5zdGFuY2VzTWFwLnRvcC51bnNoaWZ0KG0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIGluc3RhbmNlc01hcC5ib3R0b20udW5zaGlmdChtKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0YW5jZXNNYXAudG9wUmlnaHQudW5zaGlmdChtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRvcExlZnRJbnN0YW5jZXMgPSBpbnN0YW5jZXNNYXAudG9wTGVmdDtcbiAgICB0aGlzLnRvcFJpZ2h0SW5zdGFuY2VzID0gaW5zdGFuY2VzTWFwLnRvcFJpZ2h0O1xuICAgIHRoaXMuYm90dG9tTGVmdEluc3RhbmNlcyA9IGluc3RhbmNlc01hcC5ib3R0b21MZWZ0O1xuICAgIHRoaXMuYm90dG9tUmlnaHRJbnN0YW5jZXMgPSBpbnN0YW5jZXNNYXAuYm90dG9tUmlnaHQ7XG4gICAgdGhpcy50b3BJbnN0YW5jZXMgPSBpbnN0YW5jZXNNYXAudG9wO1xuICAgIHRoaXMuYm90dG9tSW5zdGFuY2VzID0gaW5zdGFuY2VzTWFwLmJvdHRvbTtcblxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtZXJnZU9wdGlvbnMob3B0aW9ucz86IE56Tm90aWZpY2F0aW9uRGF0YU9wdGlvbnMpOiBOek5vdGlmaWNhdGlvbkRhdGFPcHRpb25zIHtcbiAgICBjb25zdCB7IG56RHVyYXRpb24sIG56QW5pbWF0ZSwgbnpQYXVzZU9uSG92ZXIsIG56UGxhY2VtZW50IH0gPSB0aGlzLmNvbmZpZztcbiAgICByZXR1cm4geyBuekR1cmF0aW9uLCBuekFuaW1hdGUsIG56UGF1c2VPbkhvdmVyLCBuelBsYWNlbWVudCwgLi4ub3B0aW9ucyB9O1xuICB9XG59XG4iXX0=