sdk-tabs
Version:
Simple to use (Angular) component for organizing your content and UI layout.
129 lines • 26.9 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "@angular/cdk/clipboard";
import * as i4 from "ng-dynamic-component";
import * as i5 from "sdk-message";
export class SDKTabsComponent {
constructor(route) {
this.route = route;
/**************************************************************************
* Input/Output Parameters
**************************************************************************/
this.tabs = []; // List of tabs.
this.fontFamily = ""; // Font to use for the tab titles.
this.fontColor = ""; // Color to use for the tab titles.
this.tabColor = ""; // Color of the tabs.
this.tabBorderColor = ""; // Border color of the tabs.
this.activeTabColor = ""; // Active tab color.
this.activeFontColor = ""; // Active tab font color.
this.height = ""; // Height of tabs. Default is auto.
this.share = false; // Enable share icon.
this.tabChangedEvent = new EventEmitter(); // Callback when active tab changes.
this.sharedUrl = "";
this.message = "";
}
//******************************************************************************
// Component Life-cycle Methods
//******************************************************************************
ngOnInit() {
this.route.queryParams.subscribe((params) => {
if (params?.tab) {
this.activeTab = this.tabs.find((tab) => tab.title === params.tab);
}
});
}
ngOnChanges(_args) {
if (_args.activeTab) {
if (_args.activeTab.firstChange && !_args.activeTab.currentValue) {
this.activeTab = _args.tabs.currentValue[0];
}
if (this.activeTab) {
this.setSharedUrl(this.activeTab);
}
}
if (_args.tabs) {
this.setSharedUrl(this.activeTab);
}
}
ngAfterViewInit() {
setTimeout(() => {
if (this.sdktabs) {
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-font-family", this.fontFamily);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-font-color", this.fontColor);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-color", this.tabColor);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-border-color", this.tabBorderColor);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-active-color", this.activeTabColor);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-active-font-color", this.activeFontColor);
this.sdktabs.nativeElement.style.setProperty("--sdk-tabs-height", this.height);
}
}, 1);
}
//*************************************************************************
// Protected Methods
//*************************************************************************
setActiveTab(tab) {
if (tab != this.activeTab && this.tabChangedEvent.observed) {
this.tabChangedEvent.emit({ from: this.activeTab, to: tab });
}
else {
this.activeTab = tab;
this.setSharedUrl(tab);
}
setTimeout(() => {
if (this.sdktabinfo) {
this.sdktabinfo.nativeElement.scrollTop = 0;
}
}, 10);
}
copied() {
this.message = "Link has been Copied!";
}
//*************************************************************************
// Private Methods
//*************************************************************************
setSharedUrl(tab) {
setTimeout(() => {
this.sharedUrl = `${window.location.href.split('?')[0]}?tab=${tab?.title}`;
if (tab && tab?.urlParams && tab?.urlParams !== "") {
this.sharedUrl += (tab.urlParams?.startsWith("&")) ? tab.urlParams : `&${tab.urlParams}`;
}
}, 100);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SDKTabsComponent, deps: [{ token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SDKTabsComponent, selector: "sdk-tabs", inputs: { tabs: "tabs", activeTab: "activeTab", fontFamily: "fontFamily", fontColor: "fontColor", tabColor: "tabColor", tabBorderColor: "tabBorderColor", activeTabColor: "activeTabColor", activeFontColor: "activeFontColor", height: "height", share: "share" }, outputs: { tabChangedEvent: "tabChangedEvent" }, viewQueries: [{ propertyName: "sdktabs", first: true, predicate: ["sdktabs"], descendants: true }, { propertyName: "sdktabinfo", first: true, predicate: ["sdktabinfo"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #sdktabs *ngIf=\"tabs.length > 0\" class=\"sdk-tabs\">\n <div class=\"tabs\">\n <div *ngFor=\"let tab of tabs\" class=\"tab\" (click)=\"setActiveTab(tab)\" [ngClass]=\"{'active': activeTab && activeTab.title === tab.title}\">\n <div class=\"title\">{{ tab.title }}</div>\n <div *ngIf=\"share && activeTab && activeTab.title === tab.title\" title=\"Share Information\" class=\"sdk-icon\" [cdkCopyToClipboard]=\"sharedUrl\" [cdkCopyToClipboardAttempts]=\"2\" (click)=\"copied()\">share</div>\n </div>\n <div class=\"tab empty\"></div>\n <sdk-message [(message)]=\"message\" height=\"100%\"></sdk-message>\n </div>\n <div #sdktabinfo *ngIf=\"activeTab && activeTab.type\" class=\"tab-info\">\n <ng-container [ngComponentOutlet]=\"activeTab.type\" [ndcDynamicInputs]=\"activeTab.inputs\" [ndcDynamicOutputs]=\"activeTab.outputs\"></ng-container>\n </div>\n</div>\n", styles: [".sdk-tabs{position:absolute;inset:0;z-index:1;overflow:hidden}.sdk-tabs .tabs{position:absolute;top:0;left:0;right:0;height:var(--sdk-tabs-height, 35px);display:flex}.sdk-tabs .tabs .tab{display:flex;align-items:center;justify-content:center;color:var(--sdk-tabs-font-color, rgb(219, 220, 221));background-color:var(--sdk-tabs-color, rgb(0, 102, 178));border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));border-bottom:1px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));padding:5px 20px;cursor:pointer}.sdk-tabs .tabs .tab *{cursor:pointer}.sdk-tabs .tabs .tab.active{color:var(--sdk-tabs-active-font-color, rgb(11, 45, 113));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255));border-bottom:none;cursor:default!important}.sdk-tabs .tabs .tab.active *{cursor:default!important}.sdk-tabs .tabs .tab.active:hover{border-bottom:none}.sdk-tabs .tabs .tab:hover{color:var(--sdk-tabs-active-font-color, rgb(11, 45, 113));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255))}.sdk-tabs .tabs .tab.empty{width:100%;cursor:default;border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221))}.sdk-tabs .tabs .tab.empty:hover{background-color:var(--sdk-tabs-color, rgb(0, 102, 178))}.sdk-tabs .tabs .tab .title{font-family:var(--sdk-tabs-font-family, unset);white-space:nowrap}.sdk-tabs .tabs .tab .sdk-icon{padding-left:10px;font-size:1.2em;font-weight:800;cursor:pointer!important}.sdk-tabs .tabs:hover{overflow-x:scroll;height:calc(var(--sdk-tabs-height, 35px) + 2px)}.sdk-tabs .tabs::-webkit-scrollbar{display:block;height:2px;width:0;background-color:#fff}.sdk-tabs .tabs::-webkit-scrollbar-thumb{display:block;height:2px;width:0;background-color:gray}.sdk-tabs .tab-info{position:absolute;top:calc(var(--sdk-tabs-height, 35px) + 2px);left:0;right:0;bottom:0;padding:10px;border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255));border-top:none;vertical-align:top;overflow:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "directive", type: i4.DynamicIoDirective, selector: "[ndcDynamicInputs],[ndcDynamicOutputs]", inputs: ["ndcDynamicInputs", "ndcDynamicOutputs"], exportAs: ["ndcDynamicIo"] }, { kind: "directive", type: i4.ComponentOutletInjectorDirective, selector: "[ngComponentOutlet]", exportAs: ["ndcComponentOutletInjector"] }, { kind: "component", type: i5.SDKMessageComponent, selector: "sdk-message", inputs: ["message", "height", "style", "timer"], outputs: ["messageChange"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SDKTabsComponent, decorators: [{
type: Component,
args: [{ selector: 'sdk-tabs', template: "<div #sdktabs *ngIf=\"tabs.length > 0\" class=\"sdk-tabs\">\n <div class=\"tabs\">\n <div *ngFor=\"let tab of tabs\" class=\"tab\" (click)=\"setActiveTab(tab)\" [ngClass]=\"{'active': activeTab && activeTab.title === tab.title}\">\n <div class=\"title\">{{ tab.title }}</div>\n <div *ngIf=\"share && activeTab && activeTab.title === tab.title\" title=\"Share Information\" class=\"sdk-icon\" [cdkCopyToClipboard]=\"sharedUrl\" [cdkCopyToClipboardAttempts]=\"2\" (click)=\"copied()\">share</div>\n </div>\n <div class=\"tab empty\"></div>\n <sdk-message [(message)]=\"message\" height=\"100%\"></sdk-message>\n </div>\n <div #sdktabinfo *ngIf=\"activeTab && activeTab.type\" class=\"tab-info\">\n <ng-container [ngComponentOutlet]=\"activeTab.type\" [ndcDynamicInputs]=\"activeTab.inputs\" [ndcDynamicOutputs]=\"activeTab.outputs\"></ng-container>\n </div>\n</div>\n", styles: [".sdk-tabs{position:absolute;inset:0;z-index:1;overflow:hidden}.sdk-tabs .tabs{position:absolute;top:0;left:0;right:0;height:var(--sdk-tabs-height, 35px);display:flex}.sdk-tabs .tabs .tab{display:flex;align-items:center;justify-content:center;color:var(--sdk-tabs-font-color, rgb(219, 220, 221));background-color:var(--sdk-tabs-color, rgb(0, 102, 178));border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));border-bottom:1px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));padding:5px 20px;cursor:pointer}.sdk-tabs .tabs .tab *{cursor:pointer}.sdk-tabs .tabs .tab.active{color:var(--sdk-tabs-active-font-color, rgb(11, 45, 113));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255));border-bottom:none;cursor:default!important}.sdk-tabs .tabs .tab.active *{cursor:default!important}.sdk-tabs .tabs .tab.active:hover{border-bottom:none}.sdk-tabs .tabs .tab:hover{color:var(--sdk-tabs-active-font-color, rgb(11, 45, 113));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255))}.sdk-tabs .tabs .tab.empty{width:100%;cursor:default;border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221))}.sdk-tabs .tabs .tab.empty:hover{background-color:var(--sdk-tabs-color, rgb(0, 102, 178))}.sdk-tabs .tabs .tab .title{font-family:var(--sdk-tabs-font-family, unset);white-space:nowrap}.sdk-tabs .tabs .tab .sdk-icon{padding-left:10px;font-size:1.2em;font-weight:800;cursor:pointer!important}.sdk-tabs .tabs:hover{overflow-x:scroll;height:calc(var(--sdk-tabs-height, 35px) + 2px)}.sdk-tabs .tabs::-webkit-scrollbar{display:block;height:2px;width:0;background-color:#fff}.sdk-tabs .tabs::-webkit-scrollbar-thumb{display:block;height:2px;width:0;background-color:gray}.sdk-tabs .tab-info{position:absolute;top:calc(var(--sdk-tabs-height, 35px) + 2px);left:0;right:0;bottom:0;padding:10px;border:.5px solid var(--sdk-tabs-border-color, rgb(219, 220, 221));background-color:var(--sdk-tabs-active-color, rgb(255, 255, 255));border-top:none;vertical-align:top;overflow:auto}\n"] }]
}], ctorParameters: () => [{ type: i1.ActivatedRoute }], propDecorators: { tabs: [{
type: Input
}], activeTab: [{
type: Input
}], fontFamily: [{
type: Input
}], fontColor: [{
type: Input
}], tabColor: [{
type: Input
}], tabBorderColor: [{
type: Input
}], activeTabColor: [{
type: Input
}], activeFontColor: [{
type: Input
}], height: [{
type: Input
}], share: [{
type: Input
}], tabChangedEvent: [{
type: Output
}], sdktabs: [{
type: ViewChild,
args: ['sdktabs']
}], sdktabinfo: [{
type: ViewChild,
args: ['sdktabinfo']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLXRhYnMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLXRhYnMvc3JjL2xpYi9zZGstdGFicy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGstdGFicy9zcmMvbGliL3Nkay10YWJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQVEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBaUJwRyxNQUFNLE9BQU8sZ0JBQWdCO0lBeUJ6QixZQUNZLEtBQXFCO1FBQXJCLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBekJqQzs7bUZBRTJFO1FBQ2xFLFNBQUksR0FBYSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7UUFFckMsZUFBVSxHQUFXLEVBQUUsQ0FBQyxDQUFDLGtDQUFrQztRQUMzRCxjQUFTLEdBQVcsRUFBRSxDQUFDLENBQUMsbUNBQW1DO1FBQzNELGFBQVEsR0FBVyxFQUFFLENBQUMsQ0FBQyxxQkFBcUI7UUFDNUMsbUJBQWMsR0FBVyxFQUFFLENBQUMsQ0FBQyw0QkFBNEI7UUFDekQsbUJBQWMsR0FBVyxFQUFFLENBQUMsQ0FBQyxvQkFBb0I7UUFDakQsb0JBQWUsR0FBVyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7UUFDdkQsV0FBTSxHQUFXLEVBQUUsQ0FBQyxDQUFDLG1DQUFtQztRQUN4RCxVQUFLLEdBQVksS0FBSyxDQUFDLENBQUMscUJBQXFCO1FBQzVDLG9CQUFlLEdBQXlDLElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQyxvQ0FBb0M7UUFRaEgsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQVcsRUFBRSxDQUFDO0lBSy9CLENBQUM7SUFFRCxnRkFBZ0Y7SUFDaEYsZ0NBQWdDO0lBQ2hDLGdGQUFnRjtJQUN0RSxRQUFRO1FB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QUFqQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxlQUFlO3NCQUF4QixNQUFNO2dCQUtlLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDSyxVQUFVO3NCQUFsQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVHlwZSwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU0RLVGFiIHtcbiAgICB0aXRsZTogc3RyaW5nOyAvLyBOYW1lIG9uIHRoZSB0YWIuXG4gICAgdHlwZT86IFR5cGU8YW55PjsgLy8gVGhlIGNvbXBvbmVudCB0byBkaXNwbGF5IHdoZW4gdGhlIHRhYiBpcyBzZWxlY3RlZC5cbiAgICBpbnB1dHM/OiBhbnk7IC8vIElucHV0IHByb3BlcnRpZXMgZm9yIHRoZSBjb21wb25lbnQgZGlzcGxheWVkLlxuICAgIG91dHB1dHM/OiBhbnkgLy8gT3V0cHV0IHByb3BlcnRpZXMgZm9yIHRoZSBjb21wb25lbnQgZGlzcGxheWVkLlxuICAgIHVybFBhcmFtcz86IHN0cmluZyAvLyBQYXJhbWV0ZXJzIHRvIGJlIHVzZWQgd2hlbiBzaGFyaW5nIHRoZSB0YWIuXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnc2RrLXRhYnMnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZGstdGFicy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2RrLXRhYnMuY29tcG9uZW50LnNjc3MnXVxufSlcblxuZXhwb3J0IGNsYXNzIFNES1RhYnNDb21wb25lbnQge1xuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICogSW5wdXQvT3V0cHV0IFBhcmFtZXRlcnNcbiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICBASW5wdXQoKSB0YWJzOiBTREtUYWJbXSA9IFtdOyAvLyBMaXN0IG9mIHRhYnMuXG4gICAgQElucHV0KCkgYWN0aXZlVGFiOiBTREtUYWIgfCB1bmRlZmluZWQ7IC8vIFNldCB0aGUgY3VycmVudCBhY3RpdmUgdGFiLiBUaGlzIGlzIHVzZWQgdG8gbG9hZCBhIHRhYiBmcm9tIGEgc2hhcmUuXG4gICAgQElucHV0KCkgZm9udEZhbWlseTogc3RyaW5nID0gXCJcIjsgLy8gRm9udCB0byB1c2UgZm9yIHRoZSB0YWIgdGl0bGVzLlxuICAgIEBJbnB1dCgpIGZvbnRDb2xvcjogc3RyaW5nID0gXCJcIjsgLy8gQ29sb3IgdG8gdXNlIGZvciB0aGUgdGFiIHRpdGxlcy5cbiAgICBASW5wdXQoKSB0YWJDb2xvcjogc3RyaW5nID0gXCJcIjsgLy8gQ29sb3Igb2YgdGhlIHRhYnMuXG4gICAgQElucHV0KCkgdGFiQm9yZGVyQ29sb3I6IHN0cmluZyA9IFwiXCI7IC8vIEJvcmRlciBjb2xvciBvZiB0aGUgdGFicy5cbiAgICBASW5wdXQoKSBhY3RpdmVUYWJDb2xvcjogc3RyaW5nID0gXCJcIjsgLy8gQWN0aXZlIHRhYiBjb2xvci5cbiAgICBASW5wdXQoKSBhY3RpdmVGb250Q29sb3I6IHN0cmluZyA9IFwiXCI7IC8vIEFjdGl2ZSB0YWIgZm9udCBjb2xvci5cbiAgICBASW5wdXQoKSBoZWlnaHQ6IHN0cmluZyA9IFwiXCI7IC8vIEhlaWdodCBvZiB0YWJzLiBEZWZhdWx0IGlzIGF1dG8uXG4gICAgQElucHV0KCkgc2hhcmU6IGJvb2xlYW4gPSBmYWxzZTsgLy8gRW5hYmxlIHNoYXJlIGljb24uXG4gICAgQE91dHB1dCgpIHRhYkNoYW5nZWRFdmVudDogRXZlbnRFbWl0dGVyPHsgZnJvbTogYW55LCB0bzogYW55IH0+ID0gbmV3IEV2ZW50RW1pdHRlcigpOyAvLyBDYWxsYmFjayB3aGVuIGFjdGl2ZSB0YWIgY2hhbmdlcy5cblxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICogQ29tcG9uZW50IFZhcmlhYmxlc1xuICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgIEBWaWV3Q2hpbGQoJ3Nka3RhYnMnKSBzZGt0YWJzITogRWxlbWVudFJlZjxhbnk+O1xuICAgIEBWaWV3Q2hpbGQoJ3Nka3RhYmluZm8nKSBzZGt0YWJpbmZvITogRWxlbWVudFJlZjxhbnk+O1xuXG4gICAgcHJvdGVjdGVkIHNoYXJlZFVybDogc3RyaW5nID0gXCJcIjtcbiAgICBwcm90ZWN0ZWQgbWVzc2FnZTogc3RyaW5nID0gXCJcIjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICApIHtcbiAgICB9XG5cbiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIC8vICBDb21wb25lbnQgTGlmZS1jeWNsZSBNZXRob2RzXG4gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBwcm90ZWN0ZWQgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtcz8udGFiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0aGlzLnRhYnMuZmluZCgodGFiOiBTREtUYWIpID0+IHRhYi50aXRsZSA9PT0gcGFyYW1zLnRhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBuZ09uQ2hhbmdlcyhfYXJnczogYW55KSB7XG4gICAgICAgIGlmIChfYXJncy5hY3RpdmVUYWIpIHtcbiAgICAgICAgICAgIGlmIChfYXJncy5hY3RpdmVUYWIuZmlyc3RDaGFuZ2UgJiYgIV9hcmdzLmFjdGl2ZVRhYi5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IF9hcmdzLnRhYnMuY3VycmVudFZhbHVlWzBdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUYWIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNoYXJlZFVybCh0aGlzLmFjdGl2ZVRhYik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX2FyZ3MudGFicykge1xuICAgICAgICAgICAgdGhpcy5zZXRTaGFyZWRVcmwodGhpcy5hY3RpdmVUYWIhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2RrdGFicykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2RrdGFicy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwiLS1zZGstdGFicy1mb250LWZhbWlseVwiLCB0aGlzLmZvbnRGYW1pbHkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2RrdGFicy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwiLS1zZGstdGFicy1mb250LWNvbG9yXCIsIHRoaXMuZm9udENvbG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNka3RhYnMubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tc2RrLXRhYnMtY29sb3JcIiwgdGhpcy50YWJDb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZGt0YWJzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCItLXNkay10YWJzLWJvcmRlci1jb2xvclwiLCB0aGlzLnRhYkJvcmRlckNvbG9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNka3RhYnMubmF0aXZlRWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tc2RrLXRhYnMtYWN0aXZlLWNvbG9yXCIsIHRoaXMuYWN0aXZlVGFiQ29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2RrdGFicy5uYXRpdmVFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwiLS1zZGstdGFicy1hY3RpdmUtZm9udC1jb2xvclwiLCB0aGlzLmFjdGl2ZUZvbnRDb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZGt0YWJzLm5hdGl2ZUVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCItLXNkay10YWJzLWhlaWdodFwiLCB0aGlzLmhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgIH1cblxuICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIC8vICBQcm90ZWN0ZWQgTWV0aG9kc1xuICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIHByb3RlY3RlZCBzZXRBY3RpdmVUYWIodGFiOiBhbnkpIHtcbiAgICAgICAgaWYgKHRhYiAhPSB0aGlzLmFjdGl2ZVRhYiAmJiB0aGlzLnRhYkNoYW5nZWRFdmVudC5vYnNlcnZlZCkge1xuICAgICAgICAgICAgdGhpcy50YWJDaGFuZ2VkRXZlbnQuZW1pdCh7IGZyb206IHRoaXMuYWN0aXZlVGFiLCB0bzogdGFiIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSB0YWI7XG5cbiAgICAgICAgICAgIHRoaXMuc2V0U2hhcmVkVXJsKHRhYik7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNka3RhYmluZm8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNka3RhYmluZm8ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNvcGllZCgpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gXCJMaW5rIGhhcyBiZWVuIENvcGllZCFcIjtcbiAgICB9XG5cbiAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAvLyAgUHJpdmF0ZSBNZXRob2RzXG4gICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgcHJpdmF0ZSBzZXRTaGFyZWRVcmwodGFiOiBTREtUYWIpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNoYXJlZFVybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF19P3RhYj0ke3RhYj8udGl0bGV9YDtcblxuICAgICAgICAgICAgaWYgKHRhYiAmJiB0YWI/LnVybFBhcmFtcyAmJiB0YWI/LnVybFBhcmFtcyAhPT0gXCJcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhcmVkVXJsICs9ICh0YWIudXJsUGFyYW1zPy5zdGFydHNXaXRoKFwiJlwiKSkgPyB0YWIudXJsUGFyYW1zIDogYCYke3RhYi51cmxQYXJhbXN9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG59XG4iLCI8ZGl2ICNzZGt0YWJzICpuZ0lmPVwidGFicy5sZW5ndGggPiAwXCIgY2xhc3M9XCJzZGstdGFic1wiPlxuICAgIDxkaXYgY2xhc3M9XCJ0YWJzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCIgY2xhc3M9XCJ0YWJcIiAoY2xpY2spPVwic2V0QWN0aXZlVGFiKHRhYilcIiBbbmdDbGFzc109XCJ7J2FjdGl2ZSc6IGFjdGl2ZVRhYiAmJiBhY3RpdmVUYWIudGl0bGUgPT09IHRhYi50aXRsZX1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZVwiPnt7IHRhYi50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNoYXJlICYmIGFjdGl2ZVRhYiAmJiBhY3RpdmVUYWIudGl0bGUgPT09IHRhYi50aXRsZVwiIHRpdGxlPVwiU2hhcmUgSW5mb3JtYXRpb25cIiBjbGFzcz1cInNkay1pY29uXCIgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJzaGFyZWRVcmxcIiBbY2RrQ29weVRvQ2xpcGJvYXJkQXR0ZW1wdHNdPVwiMlwiIChjbGljayk9XCJjb3BpZWQoKVwiPnNoYXJlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFiIGVtcHR5XCI+PC9kaXY+XG4gICAgICAgIDxzZGstbWVzc2FnZSBbKG1lc3NhZ2UpXT1cIm1lc3NhZ2VcIiBoZWlnaHQ9XCIxMDAlXCI+PC9zZGstbWVzc2FnZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNzZGt0YWJpbmZvICpuZ0lmPVwiYWN0aXZlVGFiICYmIGFjdGl2ZVRhYi50eXBlXCIgY2xhc3M9XCJ0YWItaW5mb1wiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ0NvbXBvbmVudE91dGxldF09XCJhY3RpdmVUYWIudHlwZVwiIFtuZGNEeW5hbWljSW5wdXRzXT1cImFjdGl2ZVRhYi5pbnB1dHNcIiBbbmRjRHluYW1pY091dHB1dHNdPVwiYWN0aXZlVGFiLm91dHB1dHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19