@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
175 lines • 25.8 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, EventEmitter, HostListener, Injector, Input, Output, ViewChild } from '@angular/core';
import { Yield } from '@microsoft/windows-admin-center-sdk/core/base/decorators/yield.decorator';
import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom';
import { mergeMap, take } from 'rxjs/operators';
import { ExtensionBrokerService } from '../../service/extension-broker.service';
import { CoreBaseComponent } from '../common/base.component';
import { SME_LAYOUT_PROVIDER } from '../common/layout';
import * as i0 from "@angular/core";
import * as i1 from "../../service/extension-broker.service";
import * as i2 from "@angular/common";
import * as i3 from "../loading-wheel/loading-wheel.component";
const _c0 = ["placeholder"];
function SnapInExtensionComponent_sme_loading_wheel_2_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelement(0, "sme-loading-wheel");
} }
export class SnapInExtensionComponent extends CoreBaseComponent {
constructor(injector, extensionBrokerService) {
super(injector);
this.extensionBrokerService = extensionBrokerService;
this.output = new EventEmitter();
this.layout = injector.get(SME_LAYOUT_PROVIDER, null, { optional: true });
this.loading = true;
}
onScroll() {
this.onLayoutChanged();
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'SnapInExtensionComponent';
}
ngAfterViewInit() {
this.subscriptions.push(this.extensionBrokerService.createSnapIn(this.extensionId).pipe(mergeMap((instance) => {
this.instance = instance;
if (this.input) {
this.instance.call('input', 0, [this.input]).pipe(take(1)).subscribe();
}
this.loading = false;
// TODO: figure out if we need the timeout
setTimeout(() => this.onLayoutChanged(), 200);
this.scrollEventHandler = this.onLayoutChanged.bind(this);
this.subscriptions.push(this.layout.layoutChanged.subscribe(() => this.onLayoutChanged()));
return this.instance.listen('output');
})).subscribe(output => {
if (output) {
this.processEventOutput(output.data);
this.output.emit(output);
}
}));
super.ngAfterViewInit();
}
ngOnDestroy() {
if (this.instance) {
this.instance.destroy();
}
super.ngOnDestroy();
}
/**
* On layout changed event handler, occurs every time the layout has been changed.
*/
onLayoutChanged() {
if (this.instance) {
if (this.overflowElement) {
this.overflowElement.removeEventListener('scroll', this.scrollEventHandler);
}
const element = this.placeholder.nativeElement;
const placeholderRect = element.getBoundingClientRect();
const extensionRect = {
bottom: placeholderRect.bottom,
height: placeholderRect.height,
left: placeholderRect.left,
right: placeholderRect.right,
top: placeholderRect.top,
width: placeholderRect.width
};
const overflowParent = Dom.getOverflowAncestor(element);
if (overflowParent) {
const overflowParentRect = overflowParent.getBoundingClientRect();
extensionRect.overflowParent = {
scrollHeight: overflowParent.scrollHeight,
scrollWidth: overflowParent.scrollWidth,
clientHeight: overflowParent.clientHeight,
clientWidth: overflowParent.clientWidth,
top: overflowParentRect.top,
right: overflowParentRect.right,
bottom: overflowParentRect.bottom,
left: overflowParentRect.left
};
this.overflowElement = overflowParent;
this.overflowElement.addEventListener('scroll', this.scrollEventHandler);
}
this.instance.move(extensionRect).pipe(take(1)).subscribe();
}
}
processEventOutput(outputData) {
if (outputData) {
if (outputData.deltaY) {
this.overflowElement.scrollTop += outputData.deltaY;
}
else if (outputData.focusedElementRect) {
this.handleFocusEvent(outputData.focusedElementRect);
}
}
}
handleFocusEvent(focusedRect) {
const element = this.placeholder.nativeElement;
const placeholderRect = element.getBoundingClientRect();
const overflowParentRect = this.overflowElement.getBoundingClientRect();
// get the focused elements location relative to the placeholder's frame
const top = placeholderRect.top + focusedRect.top;
const bottom = placeholderRect.top + focusedRect.bottom;
const left = placeholderRect.left + focusedRect.left;
const right = placeholderRect.left + focusedRect.right;
// TODO: edge cases for these for example, focusRect is bigger than overflowParent
if (top < overflowParentRect.top) {
// above viewport, move to be under view port
const deltaY = top - overflowParentRect.top;
this.overflowElement.scrollTop += deltaY;
}
if (bottom > overflowParentRect.bottom) {
// below viewport
const deltaY = bottom - overflowParentRect.bottom;
this.overflowElement.scrollTop += deltaY;
}
if (left < overflowParentRect.left) {
const deltaX = left - overflowParentRect.left;
this.overflowElement.scrollLeft += deltaX;
}
if (right > overflowParentRect.right) {
const deltaX = right - overflowParentRect.right;
this.overflowElement.scrollLeft += deltaX;
}
}
}
/** @nocollapse */ SnapInExtensionComponent.ɵfac = function SnapInExtensionComponent_Factory(t) { return new (t || SnapInExtensionComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.ExtensionBrokerService)); };
/** @nocollapse */ SnapInExtensionComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SnapInExtensionComponent, selectors: [["sme-snap-in-extension"]], viewQuery: function SnapInExtensionComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.placeholder = _t.first);
} }, hostBindings: function SnapInExtensionComponent_HostBindings(rf, ctx) { if (rf & 1) {
i0.ɵɵlistener("scroll", function SnapInExtensionComponent_scroll_HostBindingHandler() { return ctx.onScroll(); }, false, i0.ɵɵresolveWindow);
} }, inputs: { extensionId: "extensionId", input: "input" }, outputs: { output: "output" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "sme-position-stretch-v", "sme-position-stretch-h"], ["placeholder", ""], [4, "ngIf"]], template: function SnapInExtensionComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0, 1);
i0.ɵɵtemplate(2, SnapInExtensionComponent_sme_loading_wheel_2_Template, 1, 0, "sme-loading-wheel", 2);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵadvance(2);
i0.ɵɵproperty("ngIf", ctx.loading);
} }, dependencies: [i2.NgIf, i3.LoadingWheelComponent], encapsulation: 2 });
__decorate([
Yield(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SnapInExtensionComponent.prototype, "onLayoutChanged", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SnapInExtensionComponent, [{
type: Component,
args: [{ selector: 'sme-snap-in-extension', template: "<div #placeholder class=\"sme-position-stretch-v sme-position-stretch-h\">\r\n <sme-loading-wheel *ngIf=\"loading\"></sme-loading-wheel>\r\n</div>\r\n" }]
}], function () { return [{ type: i0.Injector }, { type: i1.ExtensionBrokerService }]; }, { placeholder: [{
type: ViewChild,
args: ['placeholder']
}], extensionId: [{
type: Input
}], input: [{
type: Input
}], output: [{
type: Output
}], onScroll: [{
type: HostListener,
args: ['window:scroll']
}], onLayoutChanged: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUM5RyxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFHakcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7SUNWN0Qsb0NBQXVEOztBRGdCekQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGlCQUFpQjtJQXFDM0QsWUFBWSxRQUFrQixFQUFVLHNCQUE4QztRQUNsRixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFEb0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXJCL0UsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBd0J2RCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxH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LENBQUMsSUFBSSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztRQUVELElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRTtZQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztJQUNMLENBQUM7O21IQW5LUSx3QkFBd0I7MEdBQXhCLHdCQUF3Qjs7Ozs7O3VHQUF4QixjQUFVOztRQ2pCdkIsaUNBQXdFO1FBQ3RFLHFHQUF1RDtRQUN6RCxpQkFBTTs7UUFEZ0IsZUFBYTtRQUFiLGtDQUFhOztBRGtHL0I7SUFBQyxLQUFLLEVBQUU7Ozs7K0RBb0NQO3VGQXRIUSx3QkFBd0I7Y0FKcEMsU0FBUzsyQkFDSSx1QkFBdUI7Z0dBVTFCLFdBQVc7a0JBRGpCLFNBQVM7bUJBQUMsYUFBYTtZQUlqQixXQUFXO2tCQURqQixLQUFLO1lBSUMsS0FBSztrQkFEWCxLQUFLO1lBSUMsTUFBTTtrQkFEWixNQUFNO1lBV3dCLFFBQVE7a0JBQXRDLFlBQVk7bUJBQUMsZUFBZTtZQXlEckIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IFNuYXBJbkV4dGVuc2lvbkluc3RhbmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2V4dGVuc2lvbi1icm9rZXIvbW9kZWwvZXh0ZW5zaW9uLWluc3RhbmNlJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uUmVjdCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9leHRlbnNpb24tYnJva2VyL21vZGVsL2V4dGVuc2lvbi1yZWN0JztcclxuaW1wb3J0IHsgRG9tIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kb20vZG9tJztcclxuaW1wb3J0IHsgbWVyZ2VNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFNuYXBJbk91dHB1dCB9IGZyb20gJy4uLy4uL2RhdGEvZXh0ZW5zaW9uLWJyb2tlci9zbmFwLWluLWxpc3RlbmVyJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uQnJva2VyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvZXh0ZW5zaW9uLWJyb2tlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXQsIFNNRV9MQVlPVVRfUFJPVklERVIgfSBmcm9tICcuLi9jb21tb24vbGF5b3V0JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdzbWUtc25hcC1pbi1leHRlbnNpb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NuYXAtaW4tZXh0ZW5zaW9uLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU25hcEluRXh0ZW5zaW9uQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uSW5pdCB7XHJcbiAgICAvKipcclxuICAgICogSW5qZWN0ZWQgQHNlZSBMYXlvdXQgcGFyZW50IGluc3RhbmNlIGJvdW5kIHRvIHRoaXMgY29tcG9uZW50LlxyXG4gICAgKi9cclxuICAgIHByaXZhdGUgbGF5b3V0OiBMYXlvdXQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgncGxhY2Vob2xkZXInKVxyXG4gICAgcHVibGljIHBsYWNlaG9sZGVyOiBhbnk7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBleHRlbnNpb25JZDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgaW5wdXQ6IGFueTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBvdXRwdXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gICAgcHVibGljIGluc3RhbmNlOiBTbmFwSW5FeHRlbnNpb25JbnN0YW5jZTtcclxuXHJcbiAgICBwdWJsaWMgbG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBwdWJsaWMgb3ZlcmZsb3dFbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICBwdWJsaWMgc2Nyb2xsRXZlbnRIYW5kbGVyOiAoKSA9PiB2b2lkO1xyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKSBvblNjcm9sbCgpIHtcclxuICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIHNvdXJjZSBuYW1lIHRvIHVzZSBmb3IgbG9nZ2luZ1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgZ2V0IGxvZ1NvdXJjZU5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuICdTbmFwSW5FeHRlbnNpb25Db21wb25lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKGluamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBleHRlbnNpb25Ccm9rZXJTZXJ2aWNlOiBFeHRlbnNpb25Ccm9rZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLmxheW91dCA9IGluamVjdG9yLmdldChTTUVfTEFZT1VUX1BST1ZJREVSLCBudWxsLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaCh0aGlzLmV4dGVuc2lvbkJyb2tlclNlcnZpY2UuY3JlYXRlU25hcEluKHRoaXMuZXh0ZW5zaW9uSWQpLnBpcGUoXHJcbiAgICAgICAgICAgIG1lcmdlTWFwKChpbnN0YW5jZTogU25hcEluRXh0ZW5zaW9uSW5zdGFuY2UpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuY2FsbCgnaW5wdXQnLCAwLCBbdGhpcy5pbnB1dF0pLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIHdlIG5lZWQgdGhlIHRpbWVvdXRcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uTGF5b3V0Q2hhbmdlZCgpLFxyXG4gICAgICAgICAgICAgICAgICAgIDIwMFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyID0gdGhpcy5vbkxheW91dENoYW5nZWQuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMubGF5b3V0LmxheW91dENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMub25MYXlvdXRDaGFuZ2VkKCkpKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmxpc3Rlbignb3V0cHV0Jyk7XHJcbiAgICAgICAgICAgIH0pKS5zdWJzY3JpYmUob3V0cHV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFdmVudE91dHB1dChvdXRwdXQuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXQuZW1pdChvdXRwdXQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgIHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9uIGxheW91dCBjaGFuZ2VkIGV2ZW50IGhhbmRsZXIsIG9jY3VycyBldmVyeSB0aW1lIHRoZSBsYXlvdXQgaGFzIGJlZW4gY2hhbmdlZC5cclxuICAgICAqL1xyXG4gICAgQFlpZWxkKClcclxuICAgIHByaXZhdGUgb25MYXlvdXRDaGFuZ2VkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5vdmVyZmxvd0VsZW1lbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50PnRoaXMucGxhY2Vob2xkZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uUmVjdDogRXh0ZW5zaW9uUmVjdCA9IHtcclxuICAgICAgICAgICAgICAgIGJvdHRvbTogcGxhY2Vob2xkZXJSZWN0LmJvdHRvbSxcclxuICAgICAgICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJSZWN0LmhlaWdodCxcclxuICAgICAgICAgICAgICAgIGxlZnQ6IHBsYWNlaG9sZGVyUmVjdC5sZWZ0LFxyXG4gICAgICAgICAgICAgICAgcmlnaHQ6IHBsYWNlaG9sZGVyUmVjdC5yaWdodCxcclxuICAgICAgICAgICAgICAgIHRvcDogcGxhY2Vob2xkZXJSZWN0LnRvcCxcclxuICAgICAgICAgICAgICAgIHdpZHRoOiBwbGFjZWhvbGRlclJlY3Qud2lkdGhcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93UGFyZW50ID0gRG9tLmdldE92ZXJmbG93QW5jZXN0b3IoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChvdmVyZmxvd1BhcmVudCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3dQYXJlbnRSZWN0ID0gb3ZlcmZsb3dQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBleHRlbnNpb25SZWN0Lm92ZXJmbG93UGFyZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbEhlaWdodDogb3ZlcmZsb3dQYXJlbnQuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFdpZHRoOiBvdmVyZmxvd1BhcmVudC5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IG92ZXJmbG93UGFyZW50LmNsaWVudEhlaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBjbGllbnRXaWR0aDogb3ZlcmZsb3dQYXJlbnQuY2xpZW50V2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgdG9wOiBvdmVyZmxvd1BhcmVudFJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgICAgIHJpZ2h0OiBvdmVyZmxvd1BhcmVudFJlY3QucmlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiBvdmVyZmxvd1BhcmVudFJlY3QuYm90dG9tLFxyXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IG92ZXJmbG93UGFyZW50UmVjdC5sZWZ0XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQgPSBvdmVyZmxvd1BhcmVudDtcclxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsRXZlbnRIYW5kbGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLm1vdmUoZXh0ZW5zaW9uUmVjdCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9jZXNzRXZlbnRPdXRwdXQob3V0cHV0RGF0YTogU25hcEluT3V0cHV0KSB7XHJcbiAgICAgICAgaWYgKG91dHB1dERhdGEpIHtcclxuICAgICAgICAgICAgaWYgKG91dHB1dERhdGEuZGVsdGFZKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxUb3AgKz0gb3V0cHV0RGF0YS5kZWx0YVk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0RGF0YS5mb2N1c2VkRWxlbWVudFJlY3QpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRm9jdXNFdmVudChvdXRwdXREYXRhLmZvY3VzZWRFbGVtZW50UmVjdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVGb2N1c0V2ZW50KGZvY3VzZWRSZWN0OiBET01SZWN0KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IDxIVE1MRWxlbWVudD50aGlzLnBsYWNlaG9sZGVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICBjb25zdCBvdmVyZmxvd1BhcmVudFJlY3QgPSB0aGlzLm92ZXJmbG93RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuXHJcbiAgICAgICAgLy8gZ2V0IHRoZSBmb2N1c2VkIGVsZW1lbnRzIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBwbGFjZWhvbGRlcidzIGZyYW1lXHJcbiAgICAgICAgY29uc3QgdG9wID0gcGxhY2Vob2xkZXJSZWN0LnRvcCArIGZvY3VzZWRSZWN0LnRvcDtcclxuICAgICAgICBjb25zdCBib3R0b20gPSBwbGFjZWhvbGRlclJlY3QudG9wICsgZm9jdXNlZFJlY3QuYm90dG9tO1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBwbGFjZWhvbGRlclJlY3QubGVmdCArIGZvY3VzZWRSZWN0LmxlZnQ7XHJcbiAgICAgICAgY29uc3QgcmlnaHQgPSBwbGFjZWhvbGRlclJlY3QubGVmdCArIGZvY3VzZWRSZWN0LnJpZ2h0O1xyXG5cclxuICAgICAgICAvLyBUT0RPOiBlZGdlIGNhc2VzIGZvciB0aGVzZSBmb3IgZXhhbXBsZSwgZm9jdXNSZWN0IGlzIGJpZ2dlciB0aGFuIG92ZXJmbG93UGFyZW50XHJcbiAgICAgICAgaWYgKHRvcCA8IG92ZXJmbG93UGFyZW50UmVjdC50b3ApIHtcclxuICAgICAgICAgICAgLy8gYWJvdmUgdmlld3BvcnQsIG1vdmUgdG8gYmUgdW5kZXIgdmlldyBwb3J0XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IHRvcCAtIG92ZXJmbG93UGFyZW50UmVjdC50b3A7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbFRvcCArPSBkZWx0YVk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYm90dG9tID4gb3ZlcmZsb3dQYXJlbnRSZWN0LmJvdHRvbSkge1xyXG4gICAgICAgICAgICAvLyBiZWxvdyB2aWV3cG9ydFxyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVkgPSBib3R0b20gLSBvdmVyZmxvd1BhcmVudFJlY3QuYm90dG9tO1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxUb3AgKz0gZGVsdGFZO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGxlZnQgPCBvdmVyZmxvd1BhcmVudFJlY3QubGVmdCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWx0YVggPSBsZWZ0IC0gb3ZlcmZsb3dQYXJlbnRSZWN0LmxlZnQ7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbExlZnQgKz0gZGVsdGFYO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJpZ2h0ID4gb3ZlcmZsb3dQYXJlbnRSZWN0LnJpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IHJpZ2h0IC0gb3ZlcmZsb3dQYXJlbnRSZWN0LnJpZ2h0O1xyXG4gICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudC5zY3JvbGxMZWZ0ICs9IGRlbHRhWDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjcGxhY2Vob2xkZXIgY2xhc3M9XCJzbWUtcG9zaXRpb24tc3RyZXRjaC12IHNtZS1wb3NpdGlvbi1zdHJldGNoLWhcIj5cclxuICA8c21lLWxvYWRpbmctd2hlZWwgKm5nSWY9XCJsb2FkaW5nXCI+PC9zbWUtbG9hZGluZy13aGVlbD5cclxuPC9kaXY+XHJcbiJdfQ==