@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
175 lines • 25.9 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvc25hcC1pbi1leHRlbnNpb24vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDWSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBVSxRQUFRLEVBQUUsS0FBSyxFQUErQixNQUFNLEVBQUUsU0FBUyxFQUNoSSxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sMEVBQTBFLENBQUM7QUFJakcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxFQUFVLG1CQUFtQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7SUNWN0Qsb0NBQXVEOztBRGdCekQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGlCQUFpQjtJQXFDM0QsWUFBWSxRQUFrQixFQUFVLHNCQUE4QztRQUNsRixLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFEb0IsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQXJCL0UsV0FBTSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBd0J2RCxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQWhCOEIsUUFBUTtRQUNuQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyxhQUFhO1FBQ3ZCLE9BQU8sMEJBQTBCLENBQUM7SUFDdEMsQ0FBQztJQVNNLGVBQWU7UUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNuRixRQUFRLENBQUMsQ0FBQyxRQUFpQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7WUFFekIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDMUU7WUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQiwwQ0FBMEM7WUFDMUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUNaLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFDdEIsR0FBRyxDQUNOLENBQUM7WUFDRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNuQixJQUFJLE1BQU0sRUFBRTtnQkFDUixJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM1QjtRQUNMLENBQUMsQ0FDQSxDQUFDLENBQUM7UUFDUCxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLFdBQVc7UUFDZCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzNCO1FBQ0QsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUVLLGVBQWU7UUFDbkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBRWYsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUMvRTtZQUNELE1BQU0sT0FBTyxHQUFnQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUM1RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN4RCxNQUFNLGFBQWEsR0FBa0I7Z0JBQ2pDLE1BQU0sRUFBRSxlQUFlLENBQUMsTUFBTTtnQkFDOUIsTUFBTSxFQUFFLGVBQWUsQ0FBQyxNQUFNO2dCQUM5QixJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUk7Z0JBQzFCLEtBQUssRUFBRSxlQUFlLENBQUMsS0FBSztnQkFDNUIsR0FBRyxFQUFFLGVBQWUsQ0FBQyxHQUFHO2dCQUN4QixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7YUFDL0IsQ0FBQztZQUVGLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN4RCxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsTUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDbEUsYUFBYSxDQUFDLGNBQWMsR0FBRztvQkFDM0IsWUFBWSxFQUFFLGNBQWMsQ0FBQyxZQUFZO29CQUN6QyxXQUFXLEVBQUUsY0FBYyxDQUFDLFdBQVc7b0JBQ3ZDLFlBQVksRUFBRSxjQUFjLENBQUMsWUFBWTtvQkFDekMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxXQUFXO29CQUN2QyxHQUFHLEVBQUUsa0JBQWtCLENBQUMsR0FBRztvQkFDM0IsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUs7b0JBQy9CLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO29CQUNqQyxJQUFJLEVBQUUsa0JBQWtCLENBQUMsSUFBSTtpQkFDaEMsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDNUU7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDL0Q7SUFDTCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsVUFBd0I7UUFDL0MsSUFBSSxVQUFVLEVBQUU7WUFDWixJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7YUFDdkQ7aUJBQU0sSUFBSSxVQUFVLENBQUMsa0JBQWtCLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUN4RDtTQUNKO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQW9CO1FBQ3pDLE1BQU0sT0FBTyxHQUFnQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztRQUM1RCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN4RCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUV4RSx3RUFBd0U7UUFDeEUsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUM7UUFDckQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBRXZELGtGQUFrRjtRQUNsRixJQUFJLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDOUIsNkNBQTZDO1lBQzdDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUM7WUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDO1NBQzVDO1FBRUQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxFQUFFO1lBQ3BDLGlCQUFpQjtZQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsTUFBTSxDQUFDO1lBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztTQUM1QztRQUVELElBQUksSUFBSSxHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRTtZQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1lBQzlDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztRQUVELElBQUksS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRTtZQUNsQyxNQUFNLE1BQU0sR0FBRyxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQ2hELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztTQUM3QztJQUNMLENBQUM7O21IQW5LUSx3QkFBd0I7MEdBQXhCLHdCQUF3Qjs7Ozs7O3VHQUF4QixjQUFVOztRQ2pCdkIsaUNBQXdFO1FBQ3RFLHFHQUF1RDtRQUN6RCxpQkFBTTs7UUFEZ0IsZUFBYTtRQUFiLGtDQUFhOztBRGtHL0I7SUFBQyxLQUFLLEVBQUU7Ozs7K0RBb0NQO3VGQXRIUSx3QkFBd0I7Y0FKcEMsU0FBUzsyQkFDSSx1QkFBdUI7Z0dBVTFCLFdBQVc7a0JBRGpCLFNBQVM7bUJBQUMsYUFBYTtZQUlqQixXQUFXO2tCQURqQixLQUFLO1lBSUMsS0FBSztrQkFEWCxLQUFLO1lBSUMsTUFBTTtrQkFEWixNQUFNO1lBV3dCLFFBQVE7a0JBQXRDLFlBQVk7bUJBQUMsZUFBZTtZQXlEckIsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbmplY3QsIEluamVjdG9yLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBZaWVsZCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL3lpZWxkLmRlY29yYXRvcic7XHJcbmltcG9ydCB7IFNuYXBJbkV4dGVuc2lvbkluc3RhbmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2V4dGVuc2lvbi1icm9rZXIvbW9kZWwvZXh0ZW5zaW9uLWluc3RhbmNlJztcclxuaW1wb3J0IHsgRXh0ZW5zaW9uUmVjdCB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZGF0YS9leHRlbnNpb24tYnJva2VyL21vZGVsL2V4dGVuc2lvbi1yZWN0JztcclxuaW1wb3J0IHsgU25hcEluT3V0cHV0IH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9kYXRhL2V4dGVuc2lvbi1icm9rZXIvc25hcC1pbi1saXN0ZW5lcic7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IG1lcmdlTWFwLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBFeHRlbnNpb25Ccm9rZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9leHRlbnNpb24tYnJva2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb3JlQmFzZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbW1vbi9iYXNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IExheW91dCwgU01FX0xBWU9VVF9QUk9WSURFUiB9IGZyb20gJy4uL2NvbW1vbi9sYXlvdXQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1zbmFwLWluLWV4dGVuc2lvbicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vc25hcC1pbi1leHRlbnNpb24uY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbmFwSW5FeHRlbnNpb25Db21wb25lbnQgZXh0ZW5kcyBDb3JlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25Jbml0IHtcclxuICAgIC8qKlxyXG4gICAgKiBJbmplY3RlZCBAc2VlIExheW91dCBwYXJlbnQgaW5zdGFuY2UgYm91bmQgdG8gdGhpcyBjb21wb25lbnQuXHJcbiAgICAqL1xyXG4gICAgcHJpdmF0ZSBsYXlvdXQ6IExheW91dDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdwbGFjZWhvbGRlcicpXHJcbiAgICBwdWJsaWMgcGxhY2Vob2xkZXI6IGFueTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGV4dGVuc2lvbklkOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyBpbnB1dDogYW55O1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIG91dHB1dDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgICBwdWJsaWMgaW5zdGFuY2U6IFNuYXBJbkV4dGVuc2lvbkluc3RhbmNlO1xyXG5cclxuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuO1xyXG5cclxuICAgIHB1YmxpYyBvdmVyZmxvd0VsZW1lbnQ6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIHB1YmxpYyBzY3JvbGxFdmVudEhhbmRsZXI6ICgpID0+IHZvaWQ7XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnNjcm9sbCcpIG9uU2Nyb2xsKCkge1xyXG4gICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1NuYXBJbkV4dGVuc2lvbkNvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBwcml2YXRlIGV4dGVuc2lvbkJyb2tlclNlcnZpY2U6IEV4dGVuc2lvbkJyb2tlclNlcnZpY2UpIHtcclxuICAgICAgICBzdXBlcihpbmplY3Rvcik7XHJcblxyXG4gICAgICAgIHRoaXMubGF5b3V0ID0gaW5qZWN0b3IuZ2V0KFNNRV9MQVlPVVRfUFJPVklERVIsIG51bGwsIHsgb3B0aW9uYWw6IHRydWUgfSk7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKHRoaXMuZXh0ZW5zaW9uQnJva2VyU2VydmljZS5jcmVhdGVTbmFwSW4odGhpcy5leHRlbnNpb25JZCkucGlwZShcclxuICAgICAgICAgICAgbWVyZ2VNYXAoKGluc3RhbmNlOiBTbmFwSW5FeHRlbnNpb25JbnN0YW5jZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlucHV0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5jYWxsKCdpbnB1dCcsIDAsIFt0aGlzLmlucHV0XSkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgd2UgbmVlZCB0aGUgdGltZW91dFxyXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25MYXlvdXRDaGFuZ2VkKCksXHJcbiAgICAgICAgICAgICAgICAgICAgMjAwXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxFdmVudEhhbmRsZXIgPSB0aGlzLm9uTGF5b3V0Q2hhbmdlZC5iaW5kKHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2godGhpcy5sYXlvdXQubGF5b3V0Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkxheW91dENoYW5nZWQoKSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UubGlzdGVuKCdvdXRwdXQnKTtcclxuICAgICAgICAgICAgfSkpLnN1YnNjcmliZShvdXRwdXQgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKG91dHB1dCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0V2ZW50T3V0cHV0KG91dHB1dC5kYXRhKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dC5lbWl0KG91dHB1dCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UuZGVzdHJveSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT24gbGF5b3V0IGNoYW5nZWQgZXZlbnQgaGFuZGxlciwgb2NjdXJzIGV2ZXJ5IHRpbWUgdGhlIGxheW91dCBoYXMgYmVlbiBjaGFuZ2VkLlxyXG4gICAgICovXHJcbiAgICBAWWllbGQoKVxyXG4gICAgcHJpdmF0ZSBvbkxheW91dENoYW5nZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UpIHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm92ZXJmbG93RWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSA8SFRNTEVsZW1lbnQ+dGhpcy5wbGFjZWhvbGRlci5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlclJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBleHRlbnNpb25SZWN0OiBFeHRlbnNpb25SZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBwbGFjZWhvbGRlclJlY3QuYm90dG9tLFxyXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBwbGFjZWhvbGRlclJlY3QuaGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgbGVmdDogcGxhY2Vob2xkZXJSZWN0LmxlZnQsXHJcbiAgICAgICAgICAgICAgICByaWdodDogcGxhY2Vob2xkZXJSZWN0LnJpZ2h0LFxyXG4gICAgICAgICAgICAgICAgdG9wOiBwbGFjZWhvbGRlclJlY3QudG9wLFxyXG4gICAgICAgICAgICAgICAgd2lkdGg6IHBsYWNlaG9sZGVyUmVjdC53aWR0aFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3dQYXJlbnQgPSBEb20uZ2V0T3ZlcmZsb3dBbmNlc3RvcihlbGVtZW50KTtcclxuICAgICAgICAgICAgaWYgKG92ZXJmbG93UGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvdmVyZmxvd1BhcmVudFJlY3QgPSBvdmVyZmxvd1BhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlY3Qub3ZlcmZsb3dQYXJlbnQgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsSGVpZ2h0OiBvdmVyZmxvd1BhcmVudC5zY3JvbGxIZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsV2lkdGg6IG92ZXJmbG93UGFyZW50LnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudEhlaWdodDogb3ZlcmZsb3dQYXJlbnQuY2xpZW50SGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFdpZHRoOiBvdmVyZmxvd1BhcmVudC5jbGllbnRXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICB0b3A6IG92ZXJmbG93UGFyZW50UmVjdC50b3AsXHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6IG92ZXJmbG93UGFyZW50UmVjdC5yaWdodCxcclxuICAgICAgICAgICAgICAgICAgICBib3R0b206IG92ZXJmbG93UGFyZW50UmVjdC5ib3R0b20sXHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdDogb3ZlcmZsb3dQYXJlbnRSZWN0LmxlZnRcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJmbG93RWxlbWVudCA9IG92ZXJmbG93UGFyZW50O1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxFdmVudEhhbmRsZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UubW92ZShleHRlbnNpb25SZWN0KS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHByb2Nlc3NFdmVudE91dHB1dChvdXRwdXREYXRhOiBTbmFwSW5PdXRwdXQpIHtcclxuICAgICAgICBpZiAob3V0cHV0RGF0YSkge1xyXG4gICAgICAgICAgICBpZiAob3V0cHV0RGF0YS5kZWx0YVkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbFRvcCArPSBvdXRwdXREYXRhLmRlbHRhWTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXREYXRhLmZvY3VzZWRFbGVtZW50UmVjdCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGb2N1c0V2ZW50KG91dHB1dERhdGEuZm9jdXNlZEVsZW1lbnRSZWN0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUZvY3VzRXZlbnQoZm9jdXNlZFJlY3Q6IERPTVJlY3QpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBlbGVtZW50ID0gPEhUTUxFbGVtZW50PnRoaXMucGxhY2Vob2xkZXIubmF0aXZlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJmbG93UGFyZW50UmVjdCA9IHRoaXMub3ZlcmZsb3dFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG5cclxuICAgICAgICAvLyBnZXQgdGhlIGZvY3VzZWQgZWxlbWVudHMgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIHBsYWNlaG9sZGVyJ3MgZnJhbWVcclxuICAgICAgICBjb25zdCB0b3AgPSBwbGFjZWhvbGRlclJlY3QudG9wICsgZm9jdXNlZFJlY3QudG9wO1xyXG4gICAgICAgIGNvbnN0IGJvdHRvbSA9IHBsYWNlaG9sZGVyUmVjdC50b3AgKyBmb2N1c2VkUmVjdC5ib3R0b207XHJcbiAgICAgICAgY29uc3QgbGVmdCA9IHBsYWNlaG9sZGVyUmVjdC5sZWZ0ICsgZm9jdXNlZFJlY3QubGVmdDtcclxuICAgICAgICBjb25zdCByaWdodCA9IHBsYWNlaG9sZGVyUmVjdC5sZWZ0ICsgZm9jdXNlZFJlY3QucmlnaHQ7XHJcblxyXG4gICAgICAgIC8vIFRPRE86IGVkZ2UgY2FzZXMgZm9yIHRoZXNlIGZvciBleGFtcGxlLCBmb2N1c1JlY3QgaXMgYmlnZ2VyIHRoYW4gb3ZlcmZsb3dQYXJlbnRcclxuICAgICAgICBpZiAodG9wIDwgb3ZlcmZsb3dQYXJlbnRSZWN0LnRvcCkge1xyXG4gICAgICAgICAgICAvLyBhYm92ZSB2aWV3cG9ydCwgbW92ZSB0byBiZSB1bmRlciB2aWV3IHBvcnRcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gdG9wIC0gb3ZlcmZsb3dQYXJlbnRSZWN0LnRvcDtcclxuICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQuc2Nyb2xsVG9wICs9IGRlbHRhWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChib3R0b20gPiBvdmVyZmxvd1BhcmVudFJlY3QuYm90dG9tKSB7XHJcbiAgICAgICAgICAgIC8vIGJlbG93IHZpZXdwb3J0XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IGJvdHRvbSAtIG92ZXJmbG93UGFyZW50UmVjdC5ib3R0b207XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbFRvcCArPSBkZWx0YVk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobGVmdCA8IG92ZXJmbG93UGFyZW50UmVjdC5sZWZ0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWCA9IGxlZnQgLSBvdmVyZmxvd1BhcmVudFJlY3QubGVmdDtcclxuICAgICAgICAgICAgdGhpcy5vdmVyZmxvd0VsZW1lbnQuc2Nyb2xsTGVmdCArPSBkZWx0YVg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmlnaHQgPiBvdmVyZmxvd1BhcmVudFJlY3QucmlnaHQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gcmlnaHQgLSBvdmVyZmxvd1BhcmVudFJlY3QucmlnaHQ7XHJcbiAgICAgICAgICAgIHRoaXMub3ZlcmZsb3dFbGVtZW50LnNjcm9sbExlZnQgKz0gZGVsdGFYO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iLCI8ZGl2ICNwbGFjZWhvbGRlciBjbGFzcz1cInNtZS1wb3NpdGlvbi1zdHJldGNoLXYgc21lLXBvc2l0aW9uLXN0cmV0Y2gtaFwiPlxyXG4gIDxzbWUtbG9hZGluZy13aGVlbCAqbmdJZj1cImxvYWRpbmdcIj48L3NtZS1sb2FkaW5nLXdoZWVsPlxyXG48L2Rpdj5cclxuIl19