@mobilelivenpm/fds-angular-qa
Version:
This library was generated with [Nx](https://nx.dev).
362 lines • 38.1 kB
JavaScript
import { Component, ElementRef, Input, Output, EventEmitter, ContentChildren, ViewContainerRef, ChangeDetectorRef, ChangeDetectionStrategy, ViewEncapsulation, ViewChild, forwardRef, Inject, HostListener, ViewChildren } from '@angular/core';
import { DomHandler } from '../shared/helpers';
import { Template } from '../shared/template.directive';
import { FocusTrapFactory, FocusMonitor, ListKeyManager } from '@angular/cdk/a11y';
let idx = 0;
export class TabPanel {
constructor(tabView, viewContainer, cd) {
this.viewContainer = viewContainer;
this.cd = cd;
this.cache = true;
this.id = `fds--tabpanel--${idx++}`;
this.tabView = tabView;
}
ngAfterContentInit() {
this.templates.forEach(item => {
switch (item.getType()) {
case 'header':
this.headerTemplate = item.template;
break;
case 'content':
this.contentTemplate = item.template;
break;
default:
this.contentTemplate = item.template;
break;
}
});
}
get selected() {
return this._selected;
}
set selected(val) {
this._selected = val;
if (!this.loaded) {
this.cd.detectChanges();
}
if (val)
this.loaded = true;
}
get disabled() {
return this._disabled;
}
set disabled(disabled) {
this._disabled = disabled;
this.tabView.cd.markForCheck();
}
get header() {
return this._header;
}
set header(header) {
this._header = header;
this.tabView.cd.markForCheck();
}
get leftIcon() {
return this._leftIcon;
}
set leftIcon(leftIcon) {
this._leftIcon = leftIcon;
this.tabView.cd.markForCheck();
}
get rightIcon() {
return this._rightIcon;
}
set rightIcon(rightIcon) {
this._rightIcon = rightIcon;
this.tabView.cd.markForCheck();
}
ngOnDestroy() {
this.view = null;
}
}
TabPanel.decorators = [
{ type: Component, args: [{
selector: 'fds-tabPanel',
template: `
<div
[attr.id]="id"
class="fds--tabview--panel"
[hidden]="!selected"
role="tabpanel"
[attr.aria-hidden]="!selected"
[attr.aria-labelledby]="id + '-label'"
*ngIf="!closed"
>
<ng-content></ng-content>
<ng-container *ngIf="contentTemplate && (cache ? loaded : selected)">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</ng-container>
</div>
`
},] }
];
TabPanel.ctorParameters = () => [
{ type: undefined, decorators: [{ type: Inject, args: [forwardRef(() => TabView),] }] },
{ type: ViewContainerRef },
{ type: ChangeDetectorRef }
];
TabPanel.propDecorators = {
closable: [{ type: Input }],
headerStyle: [{ type: Input }],
headerStyleClass: [{ type: Input }],
cache: [{ type: Input }],
templates: [{ type: ContentChildren, args: [Template,] }],
selected: [{ type: Input }],
disabled: [{ type: Input }],
header: [{ type: Input }],
leftIcon: [{ type: Input }],
rightIcon: [{ type: Input }]
};
export class TabView {
constructor(el, cd, focusTrap, focusMonitor) {
this.el = el;
this.cd = cd;
this.focusTrap = focusTrap;
this.focusMonitor = focusMonitor;
this.orientation = 'top';
this.onChange = new EventEmitter();
this.onClose = new EventEmitter();
this.activeIndexChange = new EventEmitter();
}
ngAfterContentInit() {
this.initTabs();
this.tabPanels.changes.subscribe(_ => {
this.initTabs();
});
}
ngAfterViewInit() {
this.keyManager = new ListKeyManager(this.tabLinks);
this.keyManager.withHorizontalOrientation('ltr'); // Arrow navigation options
this.keyManager
.withWrap()
.skipPredicate(item => item.nativeElement.ariaDisabled); // Skip Disabled
}
ngAfterViewChecked() {
if (this.tabChanged) {
this.updateInkBar();
this.tabChanged = false;
}
}
initTabs() {
this.tabs = this.tabPanels.toArray();
let selectedTab = this.findSelectedTab();
if (!selectedTab && this.tabs.length) {
if (this.activeIndex != null && this.tabs.length > this.activeIndex)
this.tabs[this.activeIndex].selected = true;
else
this.tabs[0].selected = true;
this.tabChanged = true;
}
this.cd.markForCheck();
}
keyFunc(event) {
if (event.code !== 'Tab') {
this.keyManager.onKeydown(event);
this.focusMonitor.focusVia(this.keyManager.activeItem.nativeElement, 'keyboard');
}
else {
// 'artificially' updates the active element in case the user uses Tab instead of arrows
this.keyManager.onKeydown(event);
this.keyManager.setNextItemActive();
}
}
open(event, tab) {
if (tab.disabled) {
if (event) {
event.preventDefault();
}
return;
}
if (!tab.selected) {
let selectedTab = this.findSelectedTab();
if (selectedTab) {
selectedTab.selected = false;
}
this.tabChanged = true;
tab.selected = true;
let selectedTabIndex = this.findTabIndex(tab);
this.preventActiveIndexPropagation = true;
this.activeIndexChange.emit(selectedTabIndex);
this.onChange.emit({ originalEvent: event, index: selectedTabIndex });
}
if (event) {
event.preventDefault();
}
}
close(event, tab) {
if (this.controlClose) {
this.onClose.emit({
originalEvent: event,
index: this.findTabIndex(tab),
close: () => {
this.closeTab(tab);
}
});
}
else {
this.closeTab(tab);
this.onClose.emit({
originalEvent: event,
index: this.findTabIndex(tab)
});
}
event.stopPropagation();
}
closeTab(tab) {
if (tab.disabled) {
return;
}
if (tab.selected) {
this.tabChanged = true;
tab.selected = false;
for (let i = 0; i < this.tabs.length; i++) {
let tabPanel = this.tabs[i];
if (!tabPanel.closed && !tab.disabled) {
tabPanel.selected = true;
break;
}
}
}
tab.closed = true;
}
findSelectedTab() {
for (let i = 0; i < this.tabs.length; i++) {
if (this.tabs[i].selected) {
return this.tabs[i];
}
}
return null;
}
findTabIndex(tab) {
let index = -1;
for (let i = 0; i < this.tabs.length; i++) {
if (this.tabs[i] == tab) {
index = i;
break;
}
}
return index;
}
getBlockableElement() {
return this.el.nativeElement.children[0];
}
get activeIndex() {
return this._activeIndex;
}
set activeIndex(val) {
this._activeIndex = val;
if (this.preventActiveIndexPropagation) {
this.preventActiveIndexPropagation = false;
return;
}
if (this.tabs &&
this.tabs.length &&
this._activeIndex != null &&
this.tabs.length > this._activeIndex) {
this.findSelectedTab().selected = false;
this.tabs[this._activeIndex].selected = true;
}
}
updateInkBar() {
let tabHeader = DomHandler.findSingle(this.navbar.nativeElement, 'li.fds--active');
this.inkbar.nativeElement.style.width =
DomHandler.getWidth(tabHeader) + 'px';
this.inkbar.nativeElement.style.left =
DomHandler.getOffset(tabHeader).left -
DomHandler.getOffset(this.navbar.nativeElement).left +
'px';
}
}
TabView.decorators = [
{ type: Component, args: [{
selector: 'fds-tabView',
template: `
<div
[ngClass]="'fds--tabview fds--component'"
[ngStyle]="style"
[class]="styleClass"
>
<ul #navbar class="fds--tabview--nav" role="tablist">
<ng-template ngFor let-tab [ngForOf]="tabs">
<li
role="presentation"
[ngClass]="{
'fds--active': tab.selected,
'fds-disabled': tab.disabled
}"
[ngStyle]="tab.headerStyle"
[class]="tab.headerStyleClass"
*ngIf="!tab.closed"
>
<a
#tabLink
role="tab"
class="fds--tabview--nav--link"
[attr.aria-disabled]="tab.disabled ? true : null"
[attr.disabled]="tab.disabled ? true : null"
[attr.id]="tab.id + '-label'"
[attr.aria-selected]="tab.selected"
[attr.aria-controls]="tab.id"
[attr.aria-selected]="tab.selected"
(click)="open($event, tab)"
(keydown.enter)="open($event, tab)"
[attr.tabindex]="tab.disabled ? null : '0'"
>
<ng-container *ngIf="!tab.headerTemplate">
<span
class="fds--tabview--left--icon"
[ngClass]="tab.leftIcon"
*ngIf="tab.leftIcon"
></span>
<span class="fds--tabview--title">{{ tab.header }}</span>
<span
class="fds--tabview--right--icon"
[ngClass]="tab.rightIcon"
*ngIf="tab.rightIcon"
></span>
</ng-container>
<ng-container
*ngTemplateOutlet="tab.headerTemplate"
></ng-container>
<span
*ngIf="tab.closable"
class="fds--tabview--close icon-cross"
(click)="close($event, tab)"
></span>
</a>
</li>
</ng-template>
<li #inkbar class="fds--tabview--ink--bar"></li>
</ul>
<div class="fds-tabview-panels">
<ng-content></ng-content>
</div>
</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
encapsulation: ViewEncapsulation.None,
styles: [".fds--tabview--nav{margin:0;padding:0;display:flex;flex-wrap:wrap;line-height:22px;background:#fff;list-style-type:none;border:solid #dee2e6;border-width:0 0 1px}.fds--tabview--nav li{padding:0 1rem}.fds--tabview--nav li.fds--active .fds--tabview--nav--link{color:#2196f3;background:#fff;border-color:#2196f3}.fds--tabview--nav .fds--tabview--nav--link{display:flex;cursor:pointer;font-weight:600;overflow:hidden;color:#6c757d;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;background:#fff;padding:.75rem 0;align-items:center;text-decoration:none;border:solid #fff;border-width:0 0 4px}.fds--tabview--nav .fds--tabview--nav--link strong{padding:0 .75rem}.fds--tabview--nav .fds--tabview--nav--link:hover{color:#2196f3;background:#fff;border-color:#2196f3}.fds--tabview--nav .fds--tabview--title{padding:0 .75rem}.fds--tabview--nav .fds--tabview--close{z-index:1}.fds--tabview--ink--bar{z-index:1;display:none}.fds-disabled,.fds-disabled *{cursor:default!important;pointer-events:none}.fds-component:disabled,.fds-disabled{opacity:.5}.fds--tabview--panel{padding:10px}"]
},] }
];
TabView.ctorParameters = () => [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: FocusTrapFactory },
{ type: FocusMonitor }
];
TabView.propDecorators = {
orientation: [{ type: Input }],
style: [{ type: Input }],
styleClass: [{ type: Input }],
controlClose: [{ type: Input }],
navbar: [{ type: ViewChild, args: ['navbar',] }],
inkbar: [{ type: ViewChild, args: ['inkbar',] }],
tabLinks: [{ type: ViewChildren, args: ['tabLink',] }],
tabPanels: [{ type: ContentChildren, args: [TabPanel,] }],
onChange: [{ type: Output }],
onClose: [{ type: Output }],
activeIndexChange: [{ type: Output }],
keyFunc: [{ type: HostListener, args: ['keyup', ['$event'],] }],
activeIndex: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zcmMvbGliL3RhYnMvdGFicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFVBQVUsRUFFVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixlQUFlLEVBSWYsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFFVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBRWIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFVBQVUsRUFBZSxNQUFNLG1CQUFtQixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixjQUFjLEVBQ2YsTUFBTSxtQkFBbUIsQ0FBQztBQUUzQixJQUFJLEdBQUcsR0FBVyxDQUFDLENBQUM7QUFxQnBCLE1BQU0sT0FBTyxRQUFRO0lBbUNuQixZQUNxQyxPQUFPLEVBQ25DLGFBQStCLEVBQy9CLEVBQXFCO1FBRHJCLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQS9CckIsVUFBSyxHQUFZLElBQUksQ0FBQztRQW9CL0IsT0FBRSxHQUFXLGtCQUFrQixHQUFHLEVBQUUsRUFBRSxDQUFDO1FBYXJDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBa0IsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN0QixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENB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QUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUk7Z0JBQ3BELElBQUksQ0FBQztJQUNULENBQUM7OztZQS9SRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4RFQ7Z0JBQ0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07Z0JBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUV0Qzs7O1lBM09DLFVBQVU7WUFXVixpQkFBaUI7WUFjakIsZ0JBQWdCO1lBQ2hCLFlBQVk7OzswQkFvTlgsS0FBSztvQkFFTCxLQUFLO3lCQUVMLEtBQUs7MkJBRUwsS0FBSztxQkFFTCxTQUFTLFNBQUMsUUFBUTtxQkFFbEIsU0FBUyxTQUFDLFFBQVE7dUJBRWxCLFlBQVksU0FBQyxTQUFTO3dCQUV0QixlQUFlLFNBQUMsUUFBUTt1QkFFeEIsTUFBTTtzQkFFTixNQUFNO2dDQUVOLE1BQU07c0JBMEROLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7MEJBeUdoQyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBPbkRlc3Ryb3ksXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIFRlbXBsYXRlUmVmLFxuICBFbWJlZGRlZFZpZXdSZWYsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIFZpZXdDaGlsZCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgZm9yd2FyZFJlZixcbiAgSW5qZWN0LFxuICBIb3N0TGlzdGVuZXIsXG4gIFZpZXdDaGlsZHJlbixcbiAgQWZ0ZXJWaWV3SW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbUhhbmRsZXIsIEJsb2NrYWJsZVVJIH0gZnJvbSAnLi4vc2hhcmVkL2hlbHBlcnMnO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi9zaGFyZWQvdGVtcGxhdGUuZGlyZWN0aXZlJztcbmltcG9ydCB7XG4gIEZvY3VzVHJhcEZhY3RvcnksXG4gIEZvY3VzTW9uaXRvcixcbiAgTGlzdEtleU1hbmFnZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuXG5sZXQgaWR4OiBudW1iZXIgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmZHMtdGFiUGFuZWwnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIFthdHRyLmlkXT1cImlkXCJcbiAgICAgIGNsYXNzPVwiZmRzLS10YWJ2aWV3LS1wYW5lbFwiXG4gICAgICBbaGlkZGVuXT1cIiFzZWxlY3RlZFwiXG4gICAgICByb2xlPVwidGFicGFuZWxcIlxuICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXNlbGVjdGVkXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZCArICctbGFiZWwnXCJcbiAgICAgICpuZ0lmPVwiIWNsb3NlZFwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRUZW1wbGF0ZSAmJiAoY2FjaGUgPyBsb2FkZWQgOiBzZWxlY3RlZClcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgVGFiUGFuZWwgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjbG9zYWJsZTogYm9vbGVhbjtcblxuICBASW5wdXQoKSBoZWFkZXJTdHlsZTogYW55O1xuXG4gIEBJbnB1dCgpIGhlYWRlclN0eWxlQ2xhc3M6IHN0cmluZztcblxuICBASW5wdXQoKSBjYWNoZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihUZW1wbGF0ZSkgdGVtcGxhdGVzOiBRdWVyeUxpc3Q8YW55PjtcblxuICBjbG9zZWQ6IGJvb2xlYW47XG5cbiAgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT47XG5cbiAgX3NlbGVjdGVkOiBib29sZWFuO1xuXG4gIF9kaXNhYmxlZDogYm9vbGVhbjtcblxuICBfaGVhZGVyOiBzdHJpbmc7XG5cbiAgX2xlZnRJY29uOiBzdHJpbmc7XG5cbiAgX3JpZ2h0SWNvbjogc3RyaW5nO1xuXG4gIGxvYWRlZDogYm9vbGVhbjtcblxuICBpZDogc3RyaW5nID0gYGZkcy0tdGFicGFuZWwtLSR7aWR4Kyt9YDtcblxuICBjb250ZW50VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgdGFiVmlldzogVGFiVmlldztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gVGFiVmlldykpIHRhYlZpZXcsXG4gICAgcHVibGljIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHVibGljIGNkOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLnRhYlZpZXcgPSB0YWJWaWV3IGFzIFRhYlZpZXc7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy50ZW1wbGF0ZXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIHN3aXRjaCAoaXRlbS5nZXRUeXBlKCkpIHtcbiAgICAgICAgY2FzZSAnaGVhZGVyJzpcbiAgICAgICAgICB0aGlzLmhlYWRlclRlbXBsYXRlID0gaXRlbS50ZW1wbGF0ZTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjb250ZW50JzpcbiAgICAgICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aGlzLmNvbnRlbnRUZW1wbGF0ZSA9IGl0ZW0udGVtcGxhdGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBASW5wdXQoKSBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkO1xuICB9XG5cbiAgc2V0IHNlbGVjdGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlbGVjdGVkID0gdmFsO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlZCkge1xuICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbCkgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICB9XG5cbiAgQElucHV0KCkgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgdGhpcy50YWJWaWV3LmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgQElucHV0KCkgZ2V0IGhlYWRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oZWFkZXI7XG4gIH1cblxuICBzZXQgaGVhZGVyKGhlYWRlcjogc3RyaW5nKSB7XG4gICAgdGhpcy5faGVhZGVyID0gaGVhZGVyO1xuICAgIHRoaXMudGFiVmlldy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGdldCBsZWZ0SWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sZWZ0SWNvbjtcbiAgfVxuXG4gIHNldCBsZWZ0SWNvbihsZWZ0SWNvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGVmdEljb24gPSBsZWZ0SWNvbjtcbiAgICB0aGlzLnRhYlZpZXcuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBASW5wdXQoKSBnZXQgcmlnaHRJY29uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JpZ2h0SWNvbjtcbiAgfVxuXG4gIHNldCByaWdodEljb24ocmlnaHRJY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yaWdodEljb24gPSByaWdodEljb247XG4gICAgdGhpcy50YWJWaWV3LmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52aWV3ID0gbnVsbDtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmZHMtdGFiVmlldycsXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdlxuICAgICAgW25nQ2xhc3NdPVwiJ2Zkcy0tdGFidmlldyBmZHMtLWNvbXBvbmVudCdcIlxuICAgICAgW25nU3R5bGVdPVwic3R5bGVcIlxuICAgICAgW2NsYXNzXT1cInN0eWxlQ2xhc3NcIlxuICAgID5cbiAgICAgIDx1bCAjbmF2YmFyIGNsYXNzPVwiZmRzLS10YWJ2aWV3LS1uYXZcIiByb2xlPVwidGFibGlzdFwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LXRhYiBbbmdGb3JPZl09XCJ0YWJzXCI+XG4gICAgICAgICAgPGxpXG4gICAgICAgICAgICByb2xlPVwicHJlc2VudGF0aW9uXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ2Zkcy0tYWN0aXZlJzogdGFiLnNlbGVjdGVkLFxuICAgICAgICAgICAgICAnZmRzLWRpc2FibGVkJzogdGFiLmRpc2FibGVkXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRhYi5oZWFkZXJTdHlsZVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwidGFiLmhlYWRlclN0eWxlQ2xhc3NcIlxuICAgICAgICAgICAgKm5nSWY9XCIhdGFiLmNsb3NlZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgI3RhYkxpbmtcbiAgICAgICAgICAgICAgcm9sZT1cInRhYlwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmRzLS10YWJ2aWV3LS1uYXYtLWxpbmtcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cInRhYi5kaXNhYmxlZCA/IHRydWUgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwidGFiLmRpc2FibGVkID8gdHJ1ZSA6IG51bGxcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ0YWIuaWQgKyAnLWxhYmVsJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwidGFiLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJ0YWIuaWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInRhYi5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvcGVuKCRldmVudCwgdGFiKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW4oJGV2ZW50LCB0YWIpXCJcbiAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwidGFiLmRpc2FibGVkID8gbnVsbCA6ICcwJ1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdGFiLmhlYWRlclRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmRzLS10YWJ2aWV3LS1sZWZ0LS1pY29uXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInRhYi5sZWZ0SWNvblwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInRhYi5sZWZ0SWNvblwiXG4gICAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZkcy0tdGFidmlldy0tdGl0bGVcIj57eyB0YWIuaGVhZGVyIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZkcy0tdGFidmlldy0tcmlnaHQtLWljb25cIlxuICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwidGFiLnJpZ2h0SWNvblwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cInRhYi5yaWdodEljb25cIlxuICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWIuaGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJ0YWIuY2xvc2FibGVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmRzLS10YWJ2aWV3LS1jbG9zZSBpY29uLWNyb3NzXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvc2UoJGV2ZW50LCB0YWIpXCJcbiAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bGkgI2lua2JhciBjbGFzcz1cImZkcy0tdGFidmlldy0taW5rLS1iYXJcIj48L2xpPlxuICAgICAgPC91bD5cbiAgICAgIDxkaXYgY2xhc3M9XCJmZHMtdGFidmlldy1wYW5lbHNcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi90YWJzLnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBUYWJWaWV3XG4gIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCwgQmxvY2thYmxlVUkge1xuICBASW5wdXQoKSBvcmllbnRhdGlvbjogc3RyaW5nID0gJ3RvcCc7XG5cbiAgQElucHV0KCkgc3R5bGU6IGFueTtcblxuICBASW5wdXQoKSBzdHlsZUNsYXNzOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY29udHJvbENsb3NlOiBib29sZWFuO1xuXG4gIEBWaWV3Q2hpbGQoJ25hdmJhcicpIG5hdmJhcjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbmtiYXInKSBpbmtiYXI6IEVsZW1lbnRSZWY7XG5cbiAgQFZpZXdDaGlsZHJlbigndGFiTGluaycpIHRhYkxpbmtzOiBRdWVyeUxpc3Q8YW55PjtcblxuICBAQ29udGVudENoaWxkcmVuKFRhYlBhbmVsKSB0YWJQYW5lbHM6IFF1ZXJ5TGlzdDxUYWJQYW5lbD47XG5cbiAgQE91dHB1dCgpIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KCkgb25DbG9zZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpIGFjdGl2ZUluZGV4Q2hhbmdlOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBpbml0aWFsaXplZDogYm9vbGVhbjtcblxuICB0YWJzOiBUYWJQYW5lbFtdO1xuXG4gIF9hY3RpdmVJbmRleDogbnVtYmVyO1xuXG4gIHByZXZlbnRBY3RpdmVJbmRleFByb3BhZ2F0aW9uOiBib29sZWFuO1xuXG4gIHRhYkNoYW5nZWQ6IGJvb2xlYW47XG5cbiAga2V5TWFuYWdlcjogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICBwdWJsaWMgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9jdXNUcmFwOiBGb2N1c1RyYXBGYWN0b3J5LFxuICAgIHByaXZhdGUgZm9jdXNNb25pdG9yOiBGb2N1c01vbml0b3JcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLmluaXRUYWJzKCk7XG5cbiAgICB0aGlzLnRhYlBhbmVscy5jaGFuZ2VzLnN1YnNjcmliZShfID0+IHtcbiAgICAgIHRoaXMuaW5pdFRhYnMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmtleU1hbmFnZXIgPSBuZXcgTGlzdEtleU1hbmFnZXIodGhpcy50YWJMaW5rcyk7XG4gICAgdGhpcy5rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24oJ2x0cicpOyAvLyBBcnJvdyBuYXZpZ2F0aW9uIG9wdGlvbnNcbiAgICB0aGlzLmtleU1hbmFnZXJcbiAgICAgIC53aXRoV3JhcCgpXG4gICAgICAuc2tpcFByZWRpY2F0ZShpdGVtID0+IGl0ZW0ubmF0aXZlRWxlbWVudC5hcmlhRGlzYWJsZWQpOyAvLyBTa2lwIERpc2FibGVkXG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgaWYgKHRoaXMudGFiQ2hhbmdlZCkge1xuICAgICAgdGhpcy51cGRhdGVJbmtCYXIoKTtcbiAgICAgIHRoaXMudGFiQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGluaXRUYWJzKCk6IHZvaWQge1xuICAgIHRoaXMudGFicyA9IHRoaXMudGFiUGFuZWxzLnRvQXJyYXkoKTtcbiAgICBsZXQgc2VsZWN0ZWRUYWI6IFRhYlBhbmVsID0gdGhpcy5maW5kU2VsZWN0ZWRUYWIoKTtcbiAgICBpZiAoIXNlbGVjdGVkVGFiICYmIHRoaXMudGFicy5sZW5ndGgpIHtcbiAgICAgIGlmICh0aGlzLmFjdGl2ZUluZGV4ICE9IG51bGwgJiYgdGhpcy50YWJzLmxlbmd0aCA+IHRoaXMuYWN0aXZlSW5kZXgpXG4gICAgICAgIHRoaXMudGFic1t0aGlzLmFjdGl2ZUluZGV4XS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICBlbHNlIHRoaXMudGFic1swXS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICAgIHRoaXMudGFiQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleXVwJywgWyckZXZlbnQnXSlcbiAga2V5RnVuYyhldmVudCkge1xuICAgIGlmIChldmVudC5jb2RlICE9PSAnVGFiJykge1xuICAgICAgdGhpcy5rZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICB0aGlzLmZvY3VzTW9uaXRvci5mb2N1c1ZpYShcbiAgICAgICAgdGhpcy5rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0ubmF0aXZlRWxlbWVudCxcbiAgICAgICAgJ2tleWJvYXJkJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gJ2FydGlmaWNpYWxseScgdXBkYXRlcyB0aGUgYWN0aXZlIGVsZW1lbnQgaW4gY2FzZSB0aGUgdXNlciB1c2VzIFRhYiBpbnN0ZWFkIG9mIGFycm93c1xuICAgICAgdGhpcy5rZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7XG4gICAgICB0aGlzLmtleU1hbmFnZXIuc2V0TmV4dEl0ZW1BY3RpdmUoKTtcbiAgICB9XG4gIH1cblxuICBvcGVuKGV2ZW50OiBFdmVudCwgdGFiOiBUYWJQYW5lbCkge1xuICAgIGlmICh0YWIuZGlzYWJsZWQpIHtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGFiLnNlbGVjdGVkKSB7XG4gICAgICBsZXQgc2VsZWN0ZWRUYWI6IFRhYlBhbmVsID0gdGhpcy5maW5kU2VsZWN0ZWRUYWIoKTtcbiAgICAgIGlmIChzZWxlY3RlZFRhYikge1xuICAgICAgICBzZWxlY3RlZFRhYi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRhYkNoYW5nZWQgPSB0cnVlO1xuICAgICAgdGFiLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGxldCBzZWxlY3RlZFRhYkluZGV4ID0gdGhpcy5maW5kVGFiSW5kZXgodGFiKTtcbiAgICAgIHRoaXMucHJldmVudEFjdGl2ZUluZGV4UHJvcGFnYXRpb24gPSB0cnVlO1xuICAgICAgdGhpcy5hY3RpdmVJbmRleENoYW5nZS5lbWl0KHNlbGVjdGVkVGFiSW5kZXgpO1xuICAgICAgdGhpcy5vbkNoYW5nZS5lbWl0KHsgb3JpZ2luYWxFdmVudDogZXZlbnQsIGluZGV4OiBzZWxlY3RlZFRhYkluZGV4IH0pO1xuICAgIH1cblxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShldmVudDogRXZlbnQsIHRhYjogVGFiUGFuZWwpIHtcbiAgICBpZiAodGhpcy5jb250cm9sQ2xvc2UpIHtcbiAgICAgIHRoaXMub25DbG9zZS5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgIGluZGV4OiB0aGlzLmZpbmRUYWJJbmRleCh0YWIpLFxuICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xvc2VUYWIodGFiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2xvc2VUYWIodGFiKTtcbiAgICAgIHRoaXMub25DbG9zZS5lbWl0KHtcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZXZlbnQsXG4gICAgICAgIGluZGV4OiB0aGlzLmZpbmRUYWJJbmRleCh0YWIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGNsb3NlVGFiKHRhYjogVGFiUGFuZWwpIHtcbiAgICBpZiAodGFiLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0YWIuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMudGFiQ2hhbmdlZCA9IHRydWU7XG4gICAgICB0YWIuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB0YWJQYW5lbCA9IHRoaXMudGFic1tpXTtcbiAgICAgICAgaWYgKCF0YWJQYW5lbC5jbG9zZWQgJiYgIXRhYi5kaXNhYmxlZCkge1xuICAgICAgICAgIHRhYlBhbmVsLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhYi5jbG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgZmluZFNlbGVjdGVkVGFiKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50YWJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy50YWJzW2ldLnNlbGVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhYnNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZmluZFRhYkluZGV4KHRhYjogVGFiUGFuZWwpIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFicy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMudGFic1tpXSA9PSB0YWIpIHtcbiAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgZ2V0QmxvY2thYmxlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlblswXTtcbiAgfVxuXG4gIEBJbnB1dCgpIGdldCBhY3RpdmVJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVJbmRleDtcbiAgfVxuXG4gIHNldCBhY3RpdmVJbmRleCh2YWw6IG51bWJlcikge1xuICAgIHRoaXMuX2FjdGl2ZUluZGV4ID0gdmFsO1xuICAgIGlmICh0aGlzLnByZXZlbnRBY3RpdmVJbmRleFByb3BhZ2F0aW9uKSB7XG4gICAgICB0aGlzLnByZXZlbnRBY3RpdmVJbmRleFByb3BhZ2F0aW9uID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy50YWJzICYmXG4gICAgICB0aGlzLnRhYnMubGVuZ3RoICYmXG4gICAgICB0aGlzLl9hY3RpdmVJbmRleCAhPSBudWxsICYmXG4gICAgICB0aGlzLnRhYnMubGVuZ3RoID4gdGhpcy5fYWN0aXZlSW5kZXhcbiAgICApIHtcbiAgICAgIHRoaXMuZmluZFNlbGVjdGVkVGFiKCkuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudGFic1t0aGlzLl9hY3RpdmVJbmRleF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUlua0JhcigpIHtcbiAgICBsZXQgdGFiSGVhZGVyID0gRG9tSGFuZGxlci5maW5kU2luZ2xlKFxuICAgICAgdGhpcy5uYXZiYXIubmF0aXZlRWxlbWVudCxcbiAgICAgICdsaS5mZHMtLWFjdGl2ZSdcbiAgICApO1xuICAgIHRoaXMuaW5rYmFyLm5hdGl2ZUVsZW1lbnQuc3R5bGUud2lkdGggPVxuICAgICAgRG9tSGFuZGxlci5nZXRXaWR0aCh0YWJIZWFkZXIpICsgJ3B4JztcbiAgICB0aGlzLmlua2Jhci5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPVxuICAgICAgRG9tSGFuZGxlci5nZXRPZmZzZXQodGFiSGVhZGVyKS5sZWZ0IC1cbiAgICAgIERvbUhhbmRsZXIuZ2V0T2Zmc2V0KHRoaXMubmF2YmFyLm5hdGl2ZUVsZW1lbnQpLmxlZnQgK1xuICAgICAgJ3B4JztcbiAgfVxufVxuIl19