@skyux/tabs 4.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +218 -0
- package/README.md +5 -0
- package/bundles/skyux-tabs-testing.umd.js +395 -0
- package/bundles/skyux-tabs-testing.umd.js.map +1 -0
- package/bundles/skyux-tabs-testing.umd.min.js +16 -0
- package/bundles/skyux-tabs-testing.umd.min.js.map +1 -0
- package/bundles/skyux-tabs.umd.js +2414 -0
- package/bundles/skyux-tabs.umd.js.map +1 -0
- package/bundles/skyux-tabs.umd.min.js +16 -0
- package/bundles/skyux-tabs.umd.min.js.map +1 -0
- package/esm2015/modules/sectioned-form/sectioned-form-section.component.js +74 -0
- package/esm2015/modules/sectioned-form/sectioned-form.component.js +105 -0
- package/esm2015/modules/sectioned-form/sectioned-form.module.js +28 -0
- package/esm2015/modules/sectioned-form/sectioned-form.service.js +34 -0
- package/esm2015/modules/shared/tabs-resources.module.js +17 -0
- package/esm2015/modules/tabs/tab-button.component.js +71 -0
- package/esm2015/modules/tabs/tab-index.js +1 -0
- package/esm2015/modules/tabs/tab.component.js +144 -0
- package/esm2015/modules/tabs/tabs.module.js +41 -0
- package/esm2015/modules/tabs/tabset-active-tab-unregistered-args.js +1 -0
- package/esm2015/modules/tabs/tabset-adapter.service.js +53 -0
- package/esm2015/modules/tabs/tabset-buttons-display-mode.js +1 -0
- package/esm2015/modules/tabs/tabset-nav-button.component.js +122 -0
- package/esm2015/modules/tabs/tabset-permalink.service.js +123 -0
- package/esm2015/modules/tabs/tabset-style.js +1 -0
- package/esm2015/modules/tabs/tabset-tab-indexes-change.js +1 -0
- package/esm2015/modules/tabs/tabset.component.js +403 -0
- package/esm2015/modules/tabs/tabset.service.js +109 -0
- package/esm2015/modules/vertical-tabset/vertical-tab-media-query.service.js +71 -0
- package/esm2015/modules/vertical-tabset/vertical-tab.component.js +195 -0
- package/esm2015/modules/vertical-tabset/vertical-tabset-adapter.service.js +50 -0
- package/esm2015/modules/vertical-tabset/vertical-tabset-group.component.js +113 -0
- package/esm2015/modules/vertical-tabset/vertical-tabset.component.js +139 -0
- package/esm2015/modules/vertical-tabset/vertical-tabset.module.js +43 -0
- package/esm2015/modules/vertical-tabset/vertical-tabset.service.js +167 -0
- package/esm2015/plugin-resources/tabs-resources-provider.js +16 -0
- package/esm2015/public_api.js +10 -0
- package/esm2015/skyux-tabs.js +21 -0
- package/esm2015/testing/public_api.js +2 -0
- package/esm2015/testing/skyux-tabs-testing.js +5 -0
- package/esm2015/testing/tabs/tab-fixture-tab.js +1 -0
- package/esm2015/testing/tabs/tabset-fixture.js +141 -0
- package/esm5/modules/sectioned-form/sectioned-form-section.component.js +84 -0
- package/esm5/modules/sectioned-form/sectioned-form.component.js +111 -0
- package/esm5/modules/sectioned-form/sectioned-form.module.js +31 -0
- package/esm5/modules/sectioned-form/sectioned-form.service.js +35 -0
- package/esm5/modules/shared/tabs-resources.module.js +20 -0
- package/esm5/modules/tabs/tab-button.component.js +72 -0
- package/esm5/modules/tabs/tab-index.js +1 -0
- package/esm5/modules/tabs/tab.component.js +173 -0
- package/esm5/modules/tabs/tabs.module.js +44 -0
- package/esm5/modules/tabs/tabset-active-tab-unregistered-args.js +1 -0
- package/esm5/modules/tabs/tabset-adapter.service.js +58 -0
- package/esm5/modules/tabs/tabset-buttons-display-mode.js +1 -0
- package/esm5/modules/tabs/tabset-nav-button.component.js +145 -0
- package/esm5/modules/tabs/tabset-permalink.service.js +129 -0
- package/esm5/modules/tabs/tabset-style.js +1 -0
- package/esm5/modules/tabs/tabset-tab-indexes-change.js +1 -0
- package/esm5/modules/tabs/tabset.component.js +434 -0
- package/esm5/modules/tabs/tabset.service.js +122 -0
- package/esm5/modules/vertical-tabset/vertical-tab-media-query.service.js +76 -0
- package/esm5/modules/vertical-tabset/vertical-tab.component.js +214 -0
- package/esm5/modules/vertical-tabset/vertical-tabset-adapter.service.js +51 -0
- package/esm5/modules/vertical-tabset/vertical-tabset-group.component.js +119 -0
- package/esm5/modules/vertical-tabset/vertical-tabset.component.js +145 -0
- package/esm5/modules/vertical-tabset/vertical-tabset.module.js +46 -0
- package/esm5/modules/vertical-tabset/vertical-tabset.service.js +176 -0
- package/esm5/plugin-resources/tabs-resources-provider.js +17 -0
- package/esm5/public_api.js +10 -0
- package/esm5/skyux-tabs.js +21 -0
- package/esm5/testing/public_api.js +2 -0
- package/esm5/testing/skyux-tabs-testing.js +5 -0
- package/esm5/testing/tabs/tab-fixture-tab.js +1 -0
- package/esm5/testing/tabs/tabset-fixture.js +168 -0
- package/fesm2015/skyux-tabs-testing.js +148 -0
- package/fesm2015/skyux-tabs-testing.js.map +1 -0
- package/fesm2015/skyux-tabs.js +1998 -0
- package/fesm2015/skyux-tabs.js.map +1 -0
- package/fesm5/skyux-tabs-testing.js +174 -0
- package/fesm5/skyux-tabs-testing.js.map +1 -0
- package/fesm5/skyux-tabs.js +2182 -0
- package/fesm5/skyux-tabs.js.map +1 -0
- package/modules/sectioned-form/sectioned-form-section.component.d.ts +39 -0
- package/modules/sectioned-form/sectioned-form.component.d.ts +30 -0
- package/modules/sectioned-form/sectioned-form.module.d.ts +2 -0
- package/modules/sectioned-form/sectioned-form.service.d.ts +21 -0
- package/modules/shared/tabs-resources.module.d.ts +2 -0
- package/modules/tabs/tab-button.component.d.ts +21 -0
- package/modules/tabs/tab-index.d.ts +1 -0
- package/modules/tabs/tab.component.d.ts +77 -0
- package/modules/tabs/tabs.module.d.ts +2 -0
- package/modules/tabs/tabset-active-tab-unregistered-args.d.ts +10 -0
- package/modules/tabs/tabset-adapter.service.d.ts +21 -0
- package/modules/tabs/tabset-buttons-display-mode.d.ts +1 -0
- package/modules/tabs/tabset-nav-button.component.d.ts +24 -0
- package/modules/tabs/tabset-permalink.service.d.ts +43 -0
- package/modules/tabs/tabset-style.d.ts +1 -0
- package/modules/tabs/tabset-tab-indexes-change.d.ts +7 -0
- package/modules/tabs/tabset.component.d.ts +142 -0
- package/modules/tabs/tabset.service.d.ts +51 -0
- package/modules/vertical-tabset/vertical-tab-media-query.service.d.ts +15 -0
- package/modules/vertical-tabset/vertical-tab.component.d.ts +86 -0
- package/modules/vertical-tabset/vertical-tabset-adapter.service.d.ts +10 -0
- package/modules/vertical-tabset/vertical-tabset-group.component.d.ts +33 -0
- package/modules/vertical-tabset/vertical-tabset.component.d.ts +45 -0
- package/modules/vertical-tabset/vertical-tabset.module.d.ts +2 -0
- package/modules/vertical-tabset/vertical-tabset.service.d.ts +41 -0
- package/package.json +41 -0
- package/plugin-resources/tabs-resources-provider.d.ts +5 -0
- package/public_api.d.ts +9 -0
- package/skyux-tabs.d.ts +20 -0
- package/skyux-tabs.metadata.json +1 -0
- package/src/assets/img/guidelines/tabs/tabs-anatomy.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-behavior-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-3.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-layout-4.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-options-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-options-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-collapsed-closed.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-collapsed-open.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-hover.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-selected.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-state-unselected.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-1.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-2.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-3.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-4.png +0 -0
- package/src/assets/img/guidelines/tabs/tabs-usage-5.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-anatomy-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-anatomy-2.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-layout-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-hover.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-selected-group.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-selected.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-unselected-group.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-state-unselected.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-1.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-2.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-3.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-4.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-5.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-6.png +0 -0
- package/src/assets/img/guidelines/vertical-tabs/vertical-tabs-usage-7.png +0 -0
- package/src/assets/locales/resources_en_US.json +26 -0
- package/testing/package.json +13 -0
- package/testing/public_api.d.ts +2 -0
- package/testing/skyux-tabs-testing.d.ts +4 -0
- package/testing/skyux-tabs-testing.metadata.json +1 -0
- package/testing/tabs/tab-fixture-tab.d.ts +25 -0
- package/testing/tabs/tabset-fixture.d.ts +50 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { NgModule } from '@angular/core';
|
|
4
|
+
import { RouterModule } from '@angular/router';
|
|
5
|
+
import { SkyI18nModule } from '@skyux/i18n';
|
|
6
|
+
import { SkyIconModule } from '@skyux/indicators';
|
|
7
|
+
import { SkyDropdownModule } from '@skyux/popovers';
|
|
8
|
+
import { SkyThemeModule } from '@skyux/theme';
|
|
9
|
+
import { SkyTabsResourcesModule } from '../shared/tabs-resources.module';
|
|
10
|
+
import { SkyTabButtonComponent } from './tab-button.component';
|
|
11
|
+
import { SkyTabComponent } from './tab.component';
|
|
12
|
+
import { SkyTabsetNavButtonComponent } from './tabset-nav-button.component';
|
|
13
|
+
import { SkyTabsetComponent } from './tabset.component';
|
|
14
|
+
let SkyTabsModule = class SkyTabsModule {
|
|
15
|
+
};
|
|
16
|
+
SkyTabsModule = __decorate([
|
|
17
|
+
NgModule({
|
|
18
|
+
declarations: [
|
|
19
|
+
SkyTabButtonComponent,
|
|
20
|
+
SkyTabComponent,
|
|
21
|
+
SkyTabsetComponent,
|
|
22
|
+
SkyTabsetNavButtonComponent
|
|
23
|
+
],
|
|
24
|
+
imports: [
|
|
25
|
+
CommonModule,
|
|
26
|
+
RouterModule,
|
|
27
|
+
SkyDropdownModule,
|
|
28
|
+
SkyI18nModule,
|
|
29
|
+
SkyIconModule,
|
|
30
|
+
SkyTabsResourcesModule,
|
|
31
|
+
SkyThemeModule
|
|
32
|
+
],
|
|
33
|
+
exports: [
|
|
34
|
+
SkyTabComponent,
|
|
35
|
+
SkyTabsetComponent,
|
|
36
|
+
SkyTabsetNavButtonComponent
|
|
37
|
+
]
|
|
38
|
+
})
|
|
39
|
+
], SkyTabsModule);
|
|
40
|
+
export { SkyTabsModule };
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5tb2R1bGUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2t5dXgvdGFicy8iLCJzb3VyY2VzIjpbIm1vZHVsZXMvdGFicy90YWJzLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFlBQVksRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxRQUFRLEVBQ1QsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLFlBQVksRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFDTCxhQUFhLEVBQ2QsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLGFBQWEsRUFDZCxNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFDTixpQkFBaUIsRUFDakIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsY0FBYyxFQUNmLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdkIsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6QyxPQUFPLEVBQ0wscUJBQXFCLEVBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUNMLGVBQWUsRUFDaEIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQ0wsMkJBQTJCLEVBQzVCLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsT0FBTyxFQUNMLGtCQUFrQixFQUNuQixNQUFNLG9CQUFvQixDQUFDO0FBd0I1QixJQUFhLGFBQWEsR0FBMUIsTUFBYSxhQUFhO0NBQUksQ0FBQTtBQUFqQixhQUFhO0lBdEJ6QixRQUFRLENBQUM7UUFDUixZQUFZLEVBQUU7WUFDWixxQkFBcUI7WUFDckIsZUFBZTtZQUNmLGtCQUFrQjtZQUNsQiwyQkFBMkI7U0FDNUI7UUFDRCxPQUFPLEVBQUU7WUFDUCxZQUFZO1lBQ1osWUFBWTtZQUNaLGlCQUFpQjtZQUNqQixhQUFhO1lBQ2IsYUFBYTtZQUNiLHNCQUFzQjtZQUN0QixjQUFjO1NBQ2Y7UUFDRCxPQUFPLEVBQUU7WUFDUCxlQUFlO1lBQ2Ysa0JBQWtCO1lBQ2xCLDJCQUEyQjtTQUM1QjtLQUNGLENBQUM7R0FDVyxhQUFhLENBQUk7U0FBakIsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbW1vbk1vZHVsZVxufSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQge1xuICBOZ01vZHVsZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgUm91dGVyTW9kdWxlXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gIFNreUkxOG5Nb2R1bGVcbn0gZnJvbSAnQHNreXV4L2kxOG4nO1xuXG5pbXBvcnQge1xuICBTa3lJY29uTW9kdWxlXG59IGZyb20gJ0Bza3l1eC9pbmRpY2F0b3JzJztcblxuaW1wb3J0IHtcbiBTa3lEcm9wZG93bk1vZHVsZVxufSBmcm9tICdAc2t5dXgvcG9wb3ZlcnMnO1xuXG5pbXBvcnQge1xuICBTa3lUaGVtZU1vZHVsZVxufSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzUmVzb3VyY2VzTW9kdWxlXG59IGZyb20gJy4uL3NoYXJlZC90YWJzLXJlc291cmNlcy5tb2R1bGUnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJCdXR0b25Db21wb25lbnRcbn0gZnJvbSAnLi90YWItYnV0dG9uLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7XG4gIFNreVRhYkNvbXBvbmVudFxufSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXROYXZCdXR0b25Db21wb25lbnRcbn0gZnJvbSAnLi90YWJzZXQtbmF2LWJ1dHRvbi5jb21wb25lbnQnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJzZXRDb21wb25lbnRcbn0gZnJvbSAnLi90YWJzZXQuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgU2t5VGFiQnV0dG9uQ29tcG9uZW50LFxuICAgIFNreVRhYkNvbXBvbmVudCxcbiAgICBTa3lUYWJzZXRDb21wb25lbnQsXG4gICAgU2t5VGFic2V0TmF2QnV0dG9uQ29tcG9uZW50XG4gIF0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFNreURyb3Bkb3duTW9kdWxlLFxuICAgIFNreUkxOG5Nb2R1bGUsXG4gICAgU2t5SWNvbk1vZHVsZSxcbiAgICBTa3lUYWJzUmVzb3VyY2VzTW9kdWxlLFxuICAgIFNreVRoZW1lTW9kdWxlXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBTa3lUYWJDb21wb25lbnQsXG4gICAgU2t5VGFic2V0Q29tcG9uZW50LFxuICAgIFNreVRhYnNldE5hdkJ1dHRvbkNvbXBvbmVudFxuICBdXG59KVxuZXhwb3J0IGNsYXNzIFNreVRhYnNNb2R1bGUgeyB9XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LWFjdGl2ZS10YWItdW5yZWdpc3RlcmVkLWFyZ3MuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2t5dXgvdGFicy8iLCJzb3VyY2VzIjpbIm1vZHVsZXMvdGFicy90YWJzZXQtYWN0aXZlLXRhYi11bnJlZ2lzdGVyZWQtYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgYXJndW1lbnRzIGZvciB0aGUgdGFic2V0IHNlcnZpY2UncyBgYWN0aXZlVGFiVW5yZWdpc3RlcmVkYCBldmVudC5cbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNreVRhYnNldEFjdGl2ZVRhYlVucmVnaXN0ZXJlZEFyZ3Mge1xuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgaW5kZXggb2YgdGhlIGFjdGl2ZSB0YWIsIHdoZW4gaXQgaGFzIGJlZW4gdW5yZWdpc3RlcmVkLlxuICAgKi9cbiAgYXJyYXlJbmRleDogbnVtYmVyO1xuXG59XG4iXX0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Injectable } from '@angular/core';
|
|
3
|
+
import { BehaviorSubject } from 'rxjs';
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/
|
|
7
|
+
let SkyTabsetAdapterService = class SkyTabsetAdapterService {
|
|
8
|
+
constructor() {
|
|
9
|
+
this._overflowChange = new BehaviorSubject(false);
|
|
10
|
+
}
|
|
11
|
+
get overflowChange() {
|
|
12
|
+
return this._overflowChange.asObservable();
|
|
13
|
+
}
|
|
14
|
+
registerTabset(tabsetRef) {
|
|
15
|
+
this.tabsetRef = tabsetRef;
|
|
16
|
+
this.tabsOffsetLeft = this.getTabsOffsetLeft(tabsetRef.nativeElement);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Detects if the tab buttons are wider than the tabset container.
|
|
20
|
+
*/
|
|
21
|
+
detectOverflow() {
|
|
22
|
+
const nativeElement = this.tabsetRef.nativeElement;
|
|
23
|
+
const tabsetRect = nativeElement
|
|
24
|
+
.querySelector('.sky-tabset')
|
|
25
|
+
.getBoundingClientRect();
|
|
26
|
+
const tabButtonsRect = nativeElement
|
|
27
|
+
.querySelector('.sky-tabset-tabs')
|
|
28
|
+
.getBoundingClientRect();
|
|
29
|
+
const tabExtraButtonsRect = nativeElement
|
|
30
|
+
.querySelector('.sky-tabset-btns')
|
|
31
|
+
.getBoundingClientRect();
|
|
32
|
+
const tabButtonsWidth = tabButtonsRect.width + tabExtraButtonsRect.width + this.tabsOffsetLeft;
|
|
33
|
+
const newOverflow = (tabButtonsWidth > tabsetRect.width);
|
|
34
|
+
if (this.currentOverflow !== newOverflow) {
|
|
35
|
+
this.currentOverflow = newOverflow;
|
|
36
|
+
this._overflowChange.next(this.currentOverflow);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Returns the number of pixels to the left of the first tab.
|
|
41
|
+
*/
|
|
42
|
+
getTabsOffsetLeft(tabsetEl) {
|
|
43
|
+
const tabsetRect = tabsetEl.getBoundingClientRect();
|
|
44
|
+
// The dropdown element is the first "tab" and always exists in the DOM, even when hidden.
|
|
45
|
+
const firstTabRect = tabsetEl.querySelector('.sky-tabset-dropdown').getBoundingClientRect();
|
|
46
|
+
return firstTabRect.left - tabsetRect.left;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
SkyTabsetAdapterService = __decorate([
|
|
50
|
+
Injectable()
|
|
51
|
+
], SkyTabsetAdapterService);
|
|
52
|
+
export { SkyTabsetAdapterService };
|
|
53
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LWFkYXB0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC90YWJzLyIsInNvdXJjZXMiOlsibW9kdWxlcy90YWJzL3RhYnNldC1hZGFwdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLGVBQWUsRUFFaEIsTUFBTSxNQUFNLENBQUM7QUFFZDs7R0FFRztBQUVILElBQWEsdUJBQXVCLEdBQXBDLE1BQWEsdUJBQXVCO0lBQXBDO1FBWVUsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztJQTZDaEUsQ0FBQztJQXZEQyxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFVTSxjQUFjLENBQUMsU0FBcUI7UUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNJLGNBQWM7UUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7UUFFbkQsTUFBTSxVQUFVLEdBQUcsYUFBYTthQUM3QixhQUFhLENBQUMsYUFBYSxDQUFDO2FBQzVCLHFCQUFxQixFQUFFLENBQUM7UUFFM0IsTUFBTSxjQUFjLEdBQUcsYUFBYTthQUNqQyxhQUFhLENBQUMsa0JBQWtCLENBQUM7YUFDakMscUJBQXFCLEVBQUUsQ0FBQztRQUUzQixNQUFNLG1CQUFtQixHQUFHLGFBQWE7YUFDdEMsYUFBYSxDQUFDLGtCQUFrQixDQUFDO2FBQ2pDLHFCQUFxQixFQUFFLENBQUM7UUFFM0IsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUUvRixNQUFNLFdBQVcsR0FBRyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFdBQVcsRUFBRTtZQUN4QyxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FBQyxRQUFxQjtRQUM3QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUVwRCwwRkFBMEY7UUFDMUYsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFNUYsT0FBTyxZQUFZLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7SUFDN0MsQ0FBQztDQUNGLENBQUE7QUF6RFksdUJBQXVCO0lBRG5DLFVBQVUsRUFBRTtHQUNBLHVCQUF1QixDQXlEbkM7U0F6RFksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0YWJsZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlXG59IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2t5VGFic2V0QWRhcHRlclNlcnZpY2Uge1xuXG4gIHB1YmxpYyBnZXQgb3ZlcmZsb3dDaGFuZ2UoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX292ZXJmbG93Q2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjdXJyZW50T3ZlcmZsb3c6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSB0YWJzZXRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSB0YWJzT2Zmc2V0TGVmdDogbnVtYmVyO1xuXG4gIHByaXZhdGUgX292ZXJmbG93Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHVibGljIHJlZ2lzdGVyVGFic2V0KHRhYnNldFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMudGFic2V0UmVmID0gdGFic2V0UmVmO1xuICAgIHRoaXMudGFic09mZnNldExlZnQgPSB0aGlzLmdldFRhYnNPZmZzZXRMZWZ0KHRhYnNldFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIGlmIHRoZSB0YWIgYnV0dG9ucyBhcmUgd2lkZXIgdGhhbiB0aGUgdGFic2V0IGNvbnRhaW5lci5cbiAgICovXG4gIHB1YmxpYyBkZXRlY3RPdmVyZmxvdygpOiB2b2lkIHtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy50YWJzZXRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIGNvbnN0IHRhYnNldFJlY3QgPSBuYXRpdmVFbGVtZW50XG4gICAgICAucXVlcnlTZWxlY3RvcignLnNreS10YWJzZXQnKVxuICAgICAgLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgdGFiQnV0dG9uc1JlY3QgPSBuYXRpdmVFbGVtZW50XG4gICAgICAucXVlcnlTZWxlY3RvcignLnNreS10YWJzZXQtdGFicycpXG4gICAgICAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCB0YWJFeHRyYUJ1dHRvbnNSZWN0ID0gbmF0aXZlRWxlbWVudFxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5za3ktdGFic2V0LWJ0bnMnKVxuICAgICAgLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgdGFiQnV0dG9uc1dpZHRoID0gdGFiQnV0dG9uc1JlY3Qud2lkdGggKyB0YWJFeHRyYUJ1dHRvbnNSZWN0LndpZHRoICsgdGhpcy50YWJzT2Zmc2V0TGVmdDtcblxuICAgIGNvbnN0IG5ld092ZXJmbG93ID0gKHRhYkJ1dHRvbnNXaWR0aCA+IHRhYnNldFJlY3Qud2lkdGgpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRPdmVyZmxvdyAhPT0gbmV3T3ZlcmZsb3cpIHtcbiAgICAgIHRoaXMuY3VycmVudE92ZXJmbG93ID0gbmV3T3ZlcmZsb3c7XG4gICAgICB0aGlzLl9vdmVyZmxvd0NoYW5nZS5uZXh0KHRoaXMuY3VycmVudE92ZXJmbG93KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3QgdGFiLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUYWJzT2Zmc2V0TGVmdCh0YWJzZXRFbDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IHRhYnNldFJlY3QgPSB0YWJzZXRFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIC8vIFRoZSBkcm9wZG93biBlbGVtZW50IGlzIHRoZSBmaXJzdCBcInRhYlwiIGFuZCBhbHdheXMgZXhpc3RzIGluIHRoZSBET00sIGV2ZW4gd2hlbiBoaWRkZW4uXG4gICAgY29uc3QgZmlyc3RUYWJSZWN0ID0gdGFic2V0RWwucXVlcnlTZWxlY3RvcignLnNreS10YWJzZXQtZHJvcGRvd24nKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJldHVybiBmaXJzdFRhYlJlY3QubGVmdCAtIHRhYnNldFJlY3QubGVmdDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LWJ1dHRvbnMtZGlzcGxheS1tb2RlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNreXV4L3RhYnMvIiwic291cmNlcyI6WyJtb2R1bGVzL3RhYnMvdGFic2V0LWJ1dHRvbnMtZGlzcGxheS1tb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGUgPSAnZHJvcGRvd24nIHwgJ3RhYnMnO1xuIl19
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { AfterViewInit, ChangeDetectorRef, Component, Input } from '@angular/core';
|
|
3
|
+
import { SkyLibResourcesService } from '@skyux/i18n';
|
|
4
|
+
import { forkJoin } from 'rxjs';
|
|
5
|
+
import { take } from 'rxjs/operators';
|
|
6
|
+
const buttonTypeNext = 'next';
|
|
7
|
+
const buttonTypePrevious = 'previous';
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
let SkyTabsetNavButtonComponent = class SkyTabsetNavButtonComponent {
|
|
12
|
+
constructor(resourceService, changeDetector) {
|
|
13
|
+
this.resourceService = resourceService;
|
|
14
|
+
this.changeDetector = changeDetector;
|
|
15
|
+
}
|
|
16
|
+
set buttonText(value) {
|
|
17
|
+
this._buttonText = value;
|
|
18
|
+
}
|
|
19
|
+
get buttonText() {
|
|
20
|
+
if (this._buttonText) {
|
|
21
|
+
return this._buttonText;
|
|
22
|
+
}
|
|
23
|
+
switch (this.buttonType) {
|
|
24
|
+
case buttonTypePrevious:
|
|
25
|
+
return this.previousButtonText;
|
|
26
|
+
case buttonTypeNext:
|
|
27
|
+
return this.nextButtonText;
|
|
28
|
+
/* istanbul ignore next */
|
|
29
|
+
default:
|
|
30
|
+
return '';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
get disabled() {
|
|
34
|
+
let tabToSelect;
|
|
35
|
+
switch (this.buttonType) {
|
|
36
|
+
case buttonTypePrevious:
|
|
37
|
+
tabToSelect = this.previousTab;
|
|
38
|
+
break;
|
|
39
|
+
case buttonTypeNext:
|
|
40
|
+
tabToSelect = this.nextTab;
|
|
41
|
+
break;
|
|
42
|
+
/* istanbul ignore next */
|
|
43
|
+
default:
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
return !tabToSelect || tabToSelect.disabled;
|
|
47
|
+
}
|
|
48
|
+
get selectedTab() {
|
|
49
|
+
let selectedTab;
|
|
50
|
+
if (this.tabset && this.tabset.tabs) {
|
|
51
|
+
selectedTab = this.tabset.tabs.find((tab) => tab.tabIndex === this.tabset.lastActiveTabIndex);
|
|
52
|
+
}
|
|
53
|
+
return selectedTab;
|
|
54
|
+
}
|
|
55
|
+
get nextTab() {
|
|
56
|
+
let selectedTab = this.selectedTab;
|
|
57
|
+
if (selectedTab) {
|
|
58
|
+
let tabs = this.tabset.tabs.toArray();
|
|
59
|
+
return tabs[tabs.indexOf(selectedTab) + 1];
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
get previousTab() {
|
|
64
|
+
let selectedTab = this.selectedTab;
|
|
65
|
+
if (selectedTab) {
|
|
66
|
+
let tabs = this.tabset.tabs.toArray();
|
|
67
|
+
return tabs[tabs.indexOf(selectedTab) - 1];
|
|
68
|
+
}
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
ngAfterViewInit() {
|
|
72
|
+
forkJoin([
|
|
73
|
+
this.resourceService.getString('skyux_tabs_navigator_previous'),
|
|
74
|
+
this.resourceService.getString('skyux_tabs_navigator_next')
|
|
75
|
+
])
|
|
76
|
+
.pipe(take(1))
|
|
77
|
+
.subscribe(resources => {
|
|
78
|
+
this.previousButtonText = resources[0];
|
|
79
|
+
this.nextButtonText = resources[1];
|
|
80
|
+
this.changeDetector.detectChanges();
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
buttonClick() {
|
|
84
|
+
let tabToSelect;
|
|
85
|
+
switch (this.buttonType) {
|
|
86
|
+
case buttonTypePrevious:
|
|
87
|
+
tabToSelect = this.previousTab;
|
|
88
|
+
break;
|
|
89
|
+
case buttonTypeNext:
|
|
90
|
+
tabToSelect = this.nextTab;
|
|
91
|
+
break;
|
|
92
|
+
/* istanbul ignore next */
|
|
93
|
+
default:
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
/* istanbul ignore else */
|
|
97
|
+
if (tabToSelect && !tabToSelect.disabled) {
|
|
98
|
+
this.tabset.active = tabToSelect.tabIndex;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
SkyTabsetNavButtonComponent.ctorParameters = () => [
|
|
103
|
+
{ type: SkyLibResourcesService },
|
|
104
|
+
{ type: ChangeDetectorRef }
|
|
105
|
+
];
|
|
106
|
+
__decorate([
|
|
107
|
+
Input()
|
|
108
|
+
], SkyTabsetNavButtonComponent.prototype, "tabset", void 0);
|
|
109
|
+
__decorate([
|
|
110
|
+
Input()
|
|
111
|
+
], SkyTabsetNavButtonComponent.prototype, "buttonType", void 0);
|
|
112
|
+
__decorate([
|
|
113
|
+
Input()
|
|
114
|
+
], SkyTabsetNavButtonComponent.prototype, "buttonText", null);
|
|
115
|
+
SkyTabsetNavButtonComponent = __decorate([
|
|
116
|
+
Component({
|
|
117
|
+
selector: 'sky-tabset-nav-button',
|
|
118
|
+
template: "<button\n class=\"sky-btn sky-btn-default\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"buttonClick()\"\n>\n {{ buttonText }}\n</button>\n"
|
|
119
|
+
})
|
|
120
|
+
], SkyTabsetNavButtonComponent);
|
|
121
|
+
export { SkyTabsetNavButtonComponent };
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LW5hdi1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNreXV4L3RhYnMvIiwic291cmNlcyI6WyJtb2R1bGVzL3RhYnMvdGFic2V0LW5hdi1idXR0b24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxFQUNOLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdkIsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLFFBQVEsRUFDVCxNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFDTCxJQUFJLEVBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQVV4QixNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUM7QUFFOUIsTUFBTSxrQkFBa0IsR0FBRyxVQUFVLENBQUM7QUFFdEM7O0dBRUc7QUFLSCxJQUFhLDJCQUEyQixHQUF4QyxNQUFhLDJCQUEyQjtJQW1GdEMsWUFBb0IsZUFBdUMsRUFBVSxjQUFpQztRQUFsRixvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7SUFBSSxDQUFDO0lBMUUzRyxJQUFXLFVBQVUsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUN6QjtRQUVELFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN2QixLQUFLLGtCQUFrQjtnQkFDckIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDakMsS0FBSyxjQUFjO2dCQUNqQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDN0IsMEJBQTBCO1lBQzFCO2dCQUNFLE9BQU8sRUFBRSxDQUFD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QzNDO0lBQ0gsQ0FBQztDQUNGLENBQUE7O1lBbkNzQyxzQkFBc0I7WUFBMEIsaUJBQWlCOztBQWhGdEc7SUFEQyxLQUFLLEVBQUU7MkRBQzBCO0FBR2xDO0lBREMsS0FBSyxFQUFFOytEQUNrQjtBQUcxQjtJQURDLEtBQUssRUFBRTs2REFHUDtBQVhVLDJCQUEyQjtJQUp2QyxTQUFTLENBQUM7UUFDVCxRQUFRLEVBQUUsdUJBQXVCO1FBQ2pDLHVLQUFpRDtLQUNsRCxDQUFDO0dBQ1csMkJBQTJCLENBc0h2QztTQXRIWSwyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBJbnB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgU2t5TGliUmVzb3VyY2VzU2VydmljZVxufSBmcm9tICdAc2t5dXgvaTE4bic7XG5cbmltcG9ydCB7XG4gIGZvcmtKb2luXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICB0YWtlXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0Q29tcG9uZW50XG59IGZyb20gJy4vdGFic2V0LmNvbXBvbmVudCc7XG5cbmltcG9ydCB7XG4gIFNreVRhYkNvbXBvbmVudFxufSBmcm9tICcuL3RhYi5jb21wb25lbnQnO1xuXG5jb25zdCBidXR0b25UeXBlTmV4dCA9ICduZXh0JztcblxuY29uc3QgYnV0dG9uVHlwZVByZXZpb3VzID0gJ3ByZXZpb3VzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRhYnNldC1uYXYtYnV0dG9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYnNldC1uYXYtYnV0dG9uLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTa3lUYWJzZXROYXZCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgdGFic2V0OiBTa3lUYWJzZXRDb21wb25lbnQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGJ1dHRvblR5cGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGJ1dHRvblRleHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2J1dHRvblRleHQgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYnV0dG9uVGV4dCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9idXR0b25UZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fYnV0dG9uVGV4dDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMuYnV0dG9uVHlwZSkge1xuICAgICAgY2FzZSBidXR0b25UeXBlUHJldmlvdXM6XG4gICAgICAgIHJldHVybiB0aGlzLnByZXZpb3VzQnV0dG9uVGV4dDtcbiAgICAgIGNhc2UgYnV0dG9uVHlwZU5leHQ6XG4gICAgICAgIHJldHVybiB0aGlzLm5leHRCdXR0b25UZXh0O1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIGxldCB0YWJUb1NlbGVjdDogU2t5VGFiQ29tcG9uZW50O1xuXG4gICAgc3dpdGNoICh0aGlzLmJ1dHRvblR5cGUpIHtcbiAgICAgIGNhc2UgYnV0dG9uVHlwZVByZXZpb3VzOlxuICAgICAgICB0YWJUb1NlbGVjdCA9IHRoaXMucHJldmlvdXNUYWI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBidXR0b25UeXBlTmV4dDpcbiAgICAgICAgdGFiVG9TZWxlY3QgPSB0aGlzLm5leHRUYWI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiAhdGFiVG9TZWxlY3QgfHwgdGFiVG9TZWxlY3QuZGlzYWJsZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBzZWxlY3RlZFRhYigpOiBTa3lUYWJDb21wb25lbnQge1xuICAgIGxldCBzZWxlY3RlZFRhYjogU2t5VGFiQ29tcG9uZW50O1xuXG4gICAgaWYgKHRoaXMudGFic2V0ICYmIHRoaXMudGFic2V0LnRhYnMpIHtcbiAgICAgIHNlbGVjdGVkVGFiID0gdGhpcy50YWJzZXQudGFicy5maW5kKCh0YWIpID0+IHRhYi50YWJJbmRleCA9PT0gdGhpcy50YWJzZXQubGFzdEFjdGl2ZVRhYkluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRUYWI7XG4gIH1cblxuICBwcml2YXRlIGdldCBuZXh0VGFiKCk6IFNreVRhYkNvbXBvbmVudCB7XG4gICAgbGV0IHNlbGVjdGVkVGFiID0gdGhpcy5zZWxlY3RlZFRhYjtcblxuICAgIGlmIChzZWxlY3RlZFRhYikge1xuICAgICAgbGV0IHRhYnMgPSB0aGlzLnRhYnNldC50YWJzLnRvQXJyYXkoKTtcbiAgICAgIHJldHVybiB0YWJzW3RhYnMuaW5kZXhPZihzZWxlY3RlZFRhYikgKyAxXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgcHJldmlvdXNUYWIoKTogU2t5VGFiQ29tcG9uZW50IHtcbiAgICBsZXQgc2VsZWN0ZWRUYWIgPSB0aGlzLnNlbGVjdGVkVGFiO1xuXG4gICAgaWYgKHNlbGVjdGVkVGFiKSB7XG4gICAgICBsZXQgdGFicyA9IHRoaXMudGFic2V0LnRhYnMudG9BcnJheSgpO1xuICAgICAgcmV0dXJuIHRhYnNbdGFicy5pbmRleE9mKHNlbGVjdGVkVGFiKSAtIDFdO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF9idXR0b25UZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgcHJldmlvdXNCdXR0b25UZXh0OiBzdHJpbmc7XG4gIHByaXZhdGUgbmV4dEJ1dHRvblRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlc291cmNlU2VydmljZTogU2t5TGliUmVzb3VyY2VzU2VydmljZSwgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF90YWJzX25hdmlnYXRvcl9wcmV2aW91cycpLFxuICAgICAgdGhpcy5yZXNvdXJjZVNlcnZpY2UuZ2V0U3RyaW5nKCdza3l1eF90YWJzX25hdmlnYXRvcl9uZXh0JylcbiAgICBdKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUocmVzb3VyY2VzID0+IHtcbiAgICAgICAgdGhpcy5wcmV2aW91c0J1dHRvblRleHQgPSByZXNvdXJjZXNbMF07XG4gICAgICAgIHRoaXMubmV4dEJ1dHRvblRleHQgPSByZXNvdXJjZXNbMV07XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYnV0dG9uQ2xpY2soKSB7XG4gICAgbGV0IHRhYlRvU2VsZWN0OiBTa3lUYWJDb21wb25lbnQ7XG5cbiAgICBzd2l0Y2ggKHRoaXMuYnV0dG9uVHlwZSkge1xuICAgICAgY2FzZSBidXR0b25UeXBlUHJldmlvdXM6XG4gICAgICAgIHRhYlRvU2VsZWN0ID0gdGhpcy5wcmV2aW91c1RhYjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGJ1dHRvblR5cGVOZXh0OlxuICAgICAgICB0YWJUb1NlbGVjdCA9IHRoaXMubmV4dFRhYjtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodGFiVG9TZWxlY3QgJiYgIXRhYlRvU2VsZWN0LmRpc2FibGVkKSB7XG4gICAgICB0aGlzLnRhYnNldC5hY3RpdmUgPSB0YWJUb1NlbGVjdC50YWJJbmRleDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Location } from '@angular/common';
|
|
3
|
+
import { Injectable } from '@angular/core';
|
|
4
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
5
|
+
import { Subject } from 'rxjs';
|
|
6
|
+
/**
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
let SkyTabsetPermalinkService = class SkyTabsetPermalinkService {
|
|
10
|
+
constructor(activatedRoute, location, router) {
|
|
11
|
+
this.activatedRoute = activatedRoute;
|
|
12
|
+
this.location = location;
|
|
13
|
+
this.router = router;
|
|
14
|
+
this._popStateChange = new Subject();
|
|
15
|
+
}
|
|
16
|
+
get popStateChange() {
|
|
17
|
+
return this._popStateChange.asObservable();
|
|
18
|
+
}
|
|
19
|
+
ngOnDestroy() {
|
|
20
|
+
if (this.subscription) {
|
|
21
|
+
this.subscription.unsubscribe();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
init() {
|
|
25
|
+
this.subscription = this.location.subscribe(() => {
|
|
26
|
+
this._popStateChange.next();
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns the value of a URL query param.
|
|
31
|
+
*/
|
|
32
|
+
getParam(name) {
|
|
33
|
+
return this.getParams()[name];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Sets the value of a URL query param.
|
|
37
|
+
*/
|
|
38
|
+
setParam(name, value) {
|
|
39
|
+
const params = this.getParams();
|
|
40
|
+
if (value === null) {
|
|
41
|
+
delete params[name];
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
params[name] = value;
|
|
45
|
+
}
|
|
46
|
+
// Update the URL without triggering a navigation state change.
|
|
47
|
+
// See: https://stackoverflow.com/a/46486677
|
|
48
|
+
const url = this.router.createUrlTree(['.'], {
|
|
49
|
+
relativeTo: this.activatedRoute,
|
|
50
|
+
queryParams: params,
|
|
51
|
+
queryParamsHandling: 'merge'
|
|
52
|
+
}).toString();
|
|
53
|
+
// Abort redirect if the current URL is equal to the new URL.
|
|
54
|
+
if (this.location.isCurrentPathEqualTo(url)) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.location.go(url);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Removes the provided query param from the URL.
|
|
61
|
+
*/
|
|
62
|
+
clearParam(name) {
|
|
63
|
+
/*tslint:disable-next-line:no-null-keyword*/
|
|
64
|
+
this.setParam(name, null);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns a relative URL that includes the provided query parameter. The value is inteded to be
|
|
68
|
+
* used by an HTML anchor element.
|
|
69
|
+
*/
|
|
70
|
+
getParamHref(name, value) {
|
|
71
|
+
if (!name) {
|
|
72
|
+
/*tslint:disable-next-line:no-null-keyword*/
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const params = this.getParams();
|
|
76
|
+
params[name] = value;
|
|
77
|
+
const baseUrl = this.location.path().split('?')[0];
|
|
78
|
+
const paramString = Object.keys(params).map(k => `${k}=${params[k]}`).join('&');
|
|
79
|
+
return this.location.prepareExternalUrl(`${baseUrl}?${paramString}`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Converts the provided string into a value that can be safely used in a URL.
|
|
83
|
+
*/
|
|
84
|
+
urlify(value) {
|
|
85
|
+
if (!value) {
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
const sanitized = value.toLowerCase()
|
|
89
|
+
// Remove special characters.
|
|
90
|
+
.replace(/[\_\~\`\@\!\#\$\%\^\&\*\(\)\[\]\{\}\;\:\'\/\\\<\>\,\.\?\=\+\|"]/g, '')
|
|
91
|
+
// Replace space characters with a dash.
|
|
92
|
+
.replace(/\s/g, '-')
|
|
93
|
+
// Remove any double-dashes.
|
|
94
|
+
.replace(/--/g, '-');
|
|
95
|
+
return sanitized;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns all query params that exist in the current URL.
|
|
99
|
+
*/
|
|
100
|
+
getParams() {
|
|
101
|
+
const params = {};
|
|
102
|
+
const path = this.location.path();
|
|
103
|
+
if (path.indexOf('?') === -1) {
|
|
104
|
+
return params;
|
|
105
|
+
}
|
|
106
|
+
const existingParamPairs = path.split('?')[1].split('&');
|
|
107
|
+
existingParamPairs.forEach((pair) => {
|
|
108
|
+
const fragments = pair.split('=');
|
|
109
|
+
params[fragments[0]] = decodeURIComponent(fragments[1]);
|
|
110
|
+
});
|
|
111
|
+
return params;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
SkyTabsetPermalinkService.ctorParameters = () => [
|
|
115
|
+
{ type: ActivatedRoute },
|
|
116
|
+
{ type: Location },
|
|
117
|
+
{ type: Router }
|
|
118
|
+
];
|
|
119
|
+
SkyTabsetPermalinkService = __decorate([
|
|
120
|
+
Injectable()
|
|
121
|
+
], SkyTabsetPermalinkService);
|
|
122
|
+
export { SkyTabsetPermalinkService };
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNreXV4L3RhYnMvIiwic291cmNlcyI6WyJtb2R1bGVzL3RhYnMvdGFic2V0LXBlcm1hbGluay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNULE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLFVBQVUsRUFFWCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsY0FBYyxFQUNkLE1BQU0sRUFDUCxNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFFTCxPQUFPLEVBRVIsTUFBTSxNQUFNLENBQUM7QUFTZDs7R0FFRztBQUVILElBQWEseUJBQXlCLEdBQXRDLE1BQWEseUJBQXlCO0lBVXBDLFlBQ1UsY0FBOEIsRUFDOUIsUUFBa0IsRUFDbEIsTUFBYztRQUZkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFQaEIsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBUTFDLENBQUM7SUFaTCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFZTSxXQUFXO1FBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUMvQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUSxDQUFDLElBQVk7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QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUVGLENBQUE7O1lBekgyQixjQUFjO1lBQ3BCLFFBQVE7WUFDVixNQUFNOztBQWJiLHlCQUF5QjtJQURyQyxVQUFVLEVBQUU7R0FDQSx5QkFBeUIsQ0FvSXJDO1NBcElZLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIExvY2F0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIE9uRGVzdHJveVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgQWN0aXZhdGVkUm91dGUsXG4gIFJvdXRlclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb25MaWtlXG59IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgUGVybWFsaW5rUGFyYW1zIHtcbiAgW186IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreVRhYnNldFBlcm1hbGlua1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIHB1YmxpYyBnZXQgcG9wU3RhdGVDaGFuZ2UoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3BvcFN0YXRlQ2hhbmdlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcG9wU3RhdGVDaGFuZ2UgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25MaWtlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy5sb2NhdGlvbi5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5fcG9wU3RhdGVDaGFuZ2UubmV4dCgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgVVJMIHF1ZXJ5IHBhcmFtLlxuICAgKi9cbiAgcHVibGljIGdldFBhcmFtKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1zKClbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgb2YgYSBVUkwgcXVlcnkgcGFyYW0uXG4gICAqL1xuICBwdWJsaWMgc2V0UGFyYW0obmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuZ2V0UGFyYW1zKCk7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIGRlbGV0ZSBwYXJhbXNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgVVJMIHdpdGhvdXQgdHJpZ2dlcmluZyBhIG5hdmlnYXRpb24gc3RhdGUgY2hhbmdlLlxuICAgIC8vIFNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2NDg2Njc3XG4gICAgY29uc3QgdXJsID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbJy4nXSwge1xuICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmF0ZWRSb3V0ZSxcbiAgICAgIHF1ZXJ5UGFyYW1zOiBwYXJhbXMsXG4gICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnXG4gICAgfSkudG9TdHJpbmcoKTtcblxuICAgIC8vIEFib3J0IHJlZGlyZWN0IGlmIHRoZSBjdXJyZW50IFVSTCBpcyBlcXVhbCB0byB0aGUgbmV3IFVSTC5cbiAgICBpZiAodGhpcy5sb2NhdGlvbi5pc0N1cnJlbnRQYXRoRXF1YWxUbyh1cmwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2NhdGlvbi5nbyh1cmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtIGZyb20gdGhlIFVSTC5cbiAgICovXG4gIHB1YmxpYyBjbGVhclBhcmFtKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgdGhpcy5zZXRQYXJhbShuYW1lLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcmVsYXRpdmUgVVJMIHRoYXQgaW5jbHVkZXMgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIHZhbHVlIGlzIGludGVkZWQgdG8gYmVcbiAgICogdXNlZCBieSBhbiBIVE1MIGFuY2hvciBlbGVtZW50LlxuICAgKi9cbiAgcHVibGljIGdldFBhcmFtSHJlZihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtcygpO1xuICAgIHBhcmFtc1tuYW1lXSA9IHZhbHVlO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMubG9jYXRpb24ucGF0aCgpLnNwbGl0KCc/JylbMF07XG4gICAgY29uc3QgcGFyYW1TdHJpbmcgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChrID0+IGAke2t9PSR7cGFyYW1zW2tdfWApLmpvaW4oJyYnKTtcblxuICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChgJHtiYXNlVXJsfT8ke3BhcmFtU3RyaW5nfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwcm92aWRlZCBzdHJpbmcgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIHNhZmVseSB1c2VkIGluIGEgVVJMLlxuICAgKi9cbiAgcHVibGljIHVybGlmeSh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2FuaXRpemVkID0gdmFsdWUudG9Mb3dlckNhc2UoKVxuXG4gICAgICAvLyBSZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXJzLlxuICAgICAgLnJlcGxhY2UoL1tcXF9cXH5cXGBcXEBcXCFcXCNcXCRcXCVcXF5cXCZcXCpcXChcXClcXFtcXF1cXHtcXH1cXDtcXDpcXCdcXC9cXFxcXFw8XFw+XFwsXFwuXFw/XFw9XFwrXFx8XCJdL2csICcnKVxuXG4gICAgICAvLyBSZXBsYWNlIHNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIGRhc2guXG4gICAgICAucmVwbGFjZSgvXFxzL2csICctJylcblxuICAgICAgLy8gUmVtb3ZlIGFueSBkb3VibGUtZGFzaGVzLlxuICAgICAgLnJlcGxhY2UoLy0tL2csICctJyk7XG5cbiAgICByZXR1cm4gc2FuaXRpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWxsIHF1ZXJ5IHBhcmFtcyB0aGF0IGV4aXN0IGluIHRoZSBjdXJyZW50IFVSTC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UGFyYW1zKCk6IFBlcm1hbGlua1BhcmFtcyB7XG4gICAgY29uc3QgcGFyYW1zOiBQZXJtYWxpbmtQYXJhbXMgPSB7fTtcblxuICAgIGNvbnN0IHBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcbiAgICBpZiAocGF0aC5pbmRleE9mKCc/JykgPT09IC0xKSB7XG4gICAgICByZXR1cm4gcGFyYW1zO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nUGFyYW1QYWlycyA9IHBhdGguc3BsaXQoJz8nKVsxXS5zcGxpdCgnJicpO1xuICAgIGV4aXN0aW5nUGFyYW1QYWlycy5mb3JFYWNoKChwYWlyKSA9PiB7XG4gICAgICBjb25zdCBmcmFnbWVudHMgPSBwYWlyLnNwbGl0KCc9Jyk7XG4gICAgICBwYXJhbXNbZnJhZ21lbnRzWzBdXSA9IGRlY29kZVVSSUNvbXBvbmVudChmcmFnbWVudHNbMV0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXN0eWxlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNreXV4L3RhYnMvIiwic291cmNlcyI6WyJtb2R1bGVzL3RhYnMvdGFic2V0LXN0eWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBTa3lUYWJzZXRTdHlsZSA9ICd0YWJzJyB8ICd3aXphcmQnO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LXRhYi1pbmRleGVzLWNoYW5nZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC90YWJzLyIsInNvdXJjZXMiOlsibW9kdWxlcy90YWJzL3RhYnNldC10YWItaW5kZXhlcy1jaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFNreVRhYkluZGV4XG59IGZyb20gJy4vdGFiLWluZGV4JztcblxuZXhwb3J0IGludGVyZmFjZSBTa3lUYWJzZXRUYWJJbmRleGVzQ2hhbmdlIHtcblxuICB0YWJzPzoge1xuXG4gICAgdGFiSGVhZGluZzogc3RyaW5nO1xuXG4gICAgdGFiSW5kZXg6IFNreVRhYkluZGV4O1xuXG4gIH1bXTtcblxufVxuIl19
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, ElementRef, EventEmitter, Input, OnDestroy, Output, QueryList, ViewEncapsulation } from '@angular/core';
|
|
3
|
+
import { combineLatest, race, Subject } from 'rxjs';
|
|
4
|
+
import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
|
|
5
|
+
import { SkyTabComponent } from './tab.component';
|
|
6
|
+
import { SkyTabsetAdapterService } from './tabset-adapter.service';
|
|
7
|
+
import { SkyTabsetPermalinkService } from './tabset-permalink.service';
|
|
8
|
+
import { SkyTabsetService } from './tabset.service';
|
|
9
|
+
let SkyTabsetComponent = class SkyTabsetComponent {
|
|
10
|
+
constructor(changeDetector, elementRef, adapterService, permalinkService, tabsetService) {
|
|
11
|
+
this.changeDetector = changeDetector;
|
|
12
|
+
this.elementRef = elementRef;
|
|
13
|
+
this.adapterService = adapterService;
|
|
14
|
+
this.permalinkService = permalinkService;
|
|
15
|
+
this.tabsetService = tabsetService;
|
|
16
|
+
/**
|
|
17
|
+
* Fires when the active tab changes. This event emits the index of the active tab.
|
|
18
|
+
*/
|
|
19
|
+
this.activeChange = new EventEmitter();
|
|
20
|
+
/**
|
|
21
|
+
* Fires when users click the button to add a new tab.
|
|
22
|
+
* The new tab button is added to the tab area when you specify a listener for this event.
|
|
23
|
+
*/
|
|
24
|
+
this.newTab = new EventEmitter();
|
|
25
|
+
/**
|
|
26
|
+
* Fires when users click the button to open a tab.
|
|
27
|
+
* The open tab button is added to the tab area when you specify a listener for this event.
|
|
28
|
+
*/
|
|
29
|
+
this.openTab = new EventEmitter();
|
|
30
|
+
/**
|
|
31
|
+
* Fires when any tab's `tabIndex` value changes.
|
|
32
|
+
*/
|
|
33
|
+
this.tabIndexesChange = new EventEmitter();
|
|
34
|
+
this.tabButtons = [];
|
|
35
|
+
this.ngUnsubscribe = new Subject();
|
|
36
|
+
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Activates a tab by its `tabIndex` property.
|
|
40
|
+
*/
|
|
41
|
+
set active(value) {
|
|
42
|
+
if (value === undefined ||
|
|
43
|
+
this.tabsetService.tabIndexesEqual(value, this._active)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
this._active = value;
|
|
47
|
+
if (this.tabs) {
|
|
48
|
+
this.tabsetService.setActiveTabIndex(value);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// On init, wait for children tabs to render before broadcasting the active tab index.
|
|
52
|
+
setTimeout(() => {
|
|
53
|
+
if (this.tabsetService.isValidTabIndex(value)) {
|
|
54
|
+
// On init, yield to the permalink ID, if it exists.
|
|
55
|
+
if (this.getActiveTabIndexByPermalinkId() === undefined) {
|
|
56
|
+
this.tabsetService.setActiveTabIndex(value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
// Activate the first tab if the new tab index is invalid.
|
|
61
|
+
this._active = this.tabsetService.activateFirstTab();
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
get active() {
|
|
67
|
+
return this._active;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Distinguishes a tabset's unique state in the URL by generating a query parameter
|
|
71
|
+
* that is written as `?<queryParam>-active-tab=<sanitized-tab-heading>`.
|
|
72
|
+
* The query parameter's value is parsed automatically from the selected tab's heading text,
|
|
73
|
+
* but you can supply a custom query parameter value for each tab with its `permalinkValue`.
|
|
74
|
+
*/
|
|
75
|
+
set permalinkId(value) {
|
|
76
|
+
if (!value) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const sanitized = this.permalinkService.urlify(value);
|
|
80
|
+
this._permalinkId = `${sanitized}-active-tab`;
|
|
81
|
+
}
|
|
82
|
+
get permalinkId() {
|
|
83
|
+
return this._permalinkId || '';
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Specifies the behavior for a series of tabs.
|
|
87
|
+
* @deprecated The property was designed to create wizards by setting tabStyle="wizard" on tabsets in modals,
|
|
88
|
+
* but this wizard implementation was replaced by the
|
|
89
|
+
* [progress indicator component](https://developer.blackbaud.com/skyux/components/progress-indicator).
|
|
90
|
+
* @default 'tabs'
|
|
91
|
+
*/
|
|
92
|
+
set tabStyle(value) {
|
|
93
|
+
/*istanbul ignore else*/
|
|
94
|
+
if (value && value.toLowerCase() === 'wizard') {
|
|
95
|
+
console.warn('The tabset wizard is deprecated. Please implement the new approach using ' +
|
|
96
|
+
'progress indicator as documented here: https://developer.blackbaud.com/skyux/components/wizard.');
|
|
97
|
+
}
|
|
98
|
+
this._tabStyle = value;
|
|
99
|
+
}
|
|
100
|
+
get tabStyle() {
|
|
101
|
+
return this._tabStyle || 'tabs';
|
|
102
|
+
}
|
|
103
|
+
set tabDisplayMode(value) {
|
|
104
|
+
this._tabDisplayMode = value;
|
|
105
|
+
this.changeDetector.markForCheck();
|
|
106
|
+
}
|
|
107
|
+
get tabDisplayMode() {
|
|
108
|
+
return this._tabDisplayMode || 'tabs';
|
|
109
|
+
}
|
|
110
|
+
ngAfterViewInit() {
|
|
111
|
+
this.initTabComponents();
|
|
112
|
+
this.listenTabComponentsStructuralChange();
|
|
113
|
+
const initialTabIndex = this.getInitialTabIndex();
|
|
114
|
+
this.tabsetService.setActiveTabIndex(initialTabIndex);
|
|
115
|
+
this.listenTabButtonsOverflowChange();
|
|
116
|
+
this.listenLocationPopStateChange();
|
|
117
|
+
// If the currently active tab is getting unregistered, activate the next one.
|
|
118
|
+
this.tabsetService.activeTabUnregistered
|
|
119
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
120
|
+
.subscribe(tab => {
|
|
121
|
+
// Wait for the new tabs to render before activating.
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
this.tabsetService.activateNearestTab(tab.arrayIndex);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
// Let the tabset render the initial active index before listening for changes.
|
|
127
|
+
setTimeout(() => {
|
|
128
|
+
this.listenTabComponentsStateChange();
|
|
129
|
+
this.listenActiveIndexChange();
|
|
130
|
+
this.permalinkService.init();
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
ngOnDestroy() {
|
|
134
|
+
this.ngUnsubscribe.next();
|
|
135
|
+
this.ngUnsubscribe.complete();
|
|
136
|
+
this.unsubscribeTabComponentsStateChange();
|
|
137
|
+
this.permalinkService.clearParam(this.permalinkId);
|
|
138
|
+
}
|
|
139
|
+
onWindowResize() {
|
|
140
|
+
this.adapterService.detectOverflow();
|
|
141
|
+
}
|
|
142
|
+
onTabCloseClick(tabButton) {
|
|
143
|
+
const tabComponent = this.tabs.find(tab => this.tabsetService.tabIndexesEqual(tab.tabIndex, tabButton.tabIndex));
|
|
144
|
+
tabComponent.close.emit();
|
|
145
|
+
}
|
|
146
|
+
onTabButtonClick(tabButton) {
|
|
147
|
+
this.tabsetService.setActiveTabIndex(tabButton.tabIndex);
|
|
148
|
+
}
|
|
149
|
+
onNewTabClick() {
|
|
150
|
+
this.newTab.emit();
|
|
151
|
+
}
|
|
152
|
+
onOpenTabClick() {
|
|
153
|
+
this.openTab.emit();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Sets the initial active tab index based on the following criteria.
|
|
157
|
+
* 1. Does the URL include a query param that reflects this tabset's active tab?
|
|
158
|
+
* 2. Does one of the tab components have their `active` property set to `true`?
|
|
159
|
+
* 3. Is the tabset component's `active` property set to a specific tab index?
|
|
160
|
+
*/
|
|
161
|
+
getInitialTabIndex() {
|
|
162
|
+
var _a;
|
|
163
|
+
let activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
164
|
+
if (activeIndex === undefined) {
|
|
165
|
+
activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
166
|
+
if (activeIndex === undefined) {
|
|
167
|
+
activeIndex = this.active;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return activeIndex;
|
|
171
|
+
}
|
|
172
|
+
listenActiveIndexChange() {
|
|
173
|
+
this.tabsetService.activeTabIndex
|
|
174
|
+
.pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe))
|
|
175
|
+
.subscribe(activeIndex => {
|
|
176
|
+
this.updateTabsetComponent(activeIndex);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
listenTabComponentsStructuralChange() {
|
|
180
|
+
this.tabs.changes
|
|
181
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
182
|
+
.subscribe(() => {
|
|
183
|
+
this.resetTabComponents();
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
listenTabComponentsStateChange() {
|
|
187
|
+
combineLatest(this.tabs.map(tab => tab.activeChange))
|
|
188
|
+
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
189
|
+
.subscribe(() => {
|
|
190
|
+
// Wait for the tab components to render changes before finding the active one.
|
|
191
|
+
setTimeout(() => {
|
|
192
|
+
var _a;
|
|
193
|
+
const tabIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
194
|
+
this.tabsetService.setActiveTabIndex(tabIndex);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
combineLatest(this.tabs.map(tab => tab.tabIndexChange))
|
|
198
|
+
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
199
|
+
.subscribe(() => {
|
|
200
|
+
// Don't emit the first change.
|
|
201
|
+
if (this.lastActiveTabIndex !== undefined) {
|
|
202
|
+
// Wait for the tab components to render changes before updating the view.
|
|
203
|
+
setTimeout(() => {
|
|
204
|
+
this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
|
|
205
|
+
this.emitTabIndexChange();
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
combineLatest(this.tabs.map(tab => tab.stateChange))
|
|
210
|
+
.pipe(takeUntil(race(this.tabComponentsStateChangeUnsubscribe, this.ngUnsubscribe)))
|
|
211
|
+
.subscribe(() => {
|
|
212
|
+
// Wait for the tab components to render changes before finding the active one.
|
|
213
|
+
setTimeout(() => {
|
|
214
|
+
this.updateTabsetComponent(this.tabsetService.currentActiveTabIndex, true);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
initTabComponents() {
|
|
219
|
+
this.tabs.forEach(tab => tab.init());
|
|
220
|
+
}
|
|
221
|
+
resetTabComponents() {
|
|
222
|
+
var _a;
|
|
223
|
+
this.unsubscribeTabComponentsStateChange();
|
|
224
|
+
this.tabsetService.unregisterAll();
|
|
225
|
+
// If there are no tab components, do a hard reset of the view.
|
|
226
|
+
if (this.tabs.length === 0) {
|
|
227
|
+
this.updateTabsetComponent(0, true);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this.initTabComponents();
|
|
231
|
+
const activeIndex = (_a = this.getActiveTabComponent()) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
232
|
+
this.tabsetService.setActiveTabIndex(activeIndex, {
|
|
233
|
+
emitChange: false
|
|
234
|
+
});
|
|
235
|
+
this.listenTabComponentsStateChange();
|
|
236
|
+
}
|
|
237
|
+
emitTabIndexChange() {
|
|
238
|
+
this.tabIndexesChange.emit({
|
|
239
|
+
tabs: this.tabs.map(tab => ({
|
|
240
|
+
tabHeading: tab.tabHeading,
|
|
241
|
+
tabIndex: tab.tabIndex
|
|
242
|
+
}))
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
unsubscribeTabComponentsStateChange() {
|
|
246
|
+
this.tabComponentsStateChangeUnsubscribe.next();
|
|
247
|
+
this.tabComponentsStateChangeUnsubscribe.complete();
|
|
248
|
+
this.tabComponentsStateChangeUnsubscribe = new Subject();
|
|
249
|
+
}
|
|
250
|
+
listenTabButtonsOverflowChange() {
|
|
251
|
+
this.adapterService.registerTabset(this.elementRef);
|
|
252
|
+
this.adapterService.overflowChange
|
|
253
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
254
|
+
.subscribe(isOverflowing => {
|
|
255
|
+
this.tabDisplayMode = (isOverflowing) ? 'dropdown' : 'tabs';
|
|
256
|
+
this.changeDetector.markForCheck();
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Listen for back/forward history button presses to detect query param changes in the URL.
|
|
261
|
+
*/
|
|
262
|
+
listenLocationPopStateChange() {
|
|
263
|
+
this.permalinkService.popStateChange
|
|
264
|
+
.pipe(takeUntil(this.ngUnsubscribe))
|
|
265
|
+
.subscribe(() => {
|
|
266
|
+
this.setActiveTabIndexByPermalinkId();
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
setActiveTabIndexByPermalinkId() {
|
|
270
|
+
const activeIndex = this.getActiveTabIndexByPermalinkId();
|
|
271
|
+
this.tabsetService.setActiveTabIndex(activeIndex);
|
|
272
|
+
}
|
|
273
|
+
getActiveTabIndexByPermalinkId() {
|
|
274
|
+
var _a;
|
|
275
|
+
if (this.permalinkId) {
|
|
276
|
+
const paramValue = this.permalinkService.getParam(this.permalinkId);
|
|
277
|
+
if (paramValue) {
|
|
278
|
+
return (_a = this.tabs.find(tab => tab.permalinkValue === paramValue)) === null || _a === void 0 ? void 0 : _a.tabIndex;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
getActiveTabComponent() {
|
|
283
|
+
return this.tabs.toArray().reverse().find(tab => tab.active === true);
|
|
284
|
+
}
|
|
285
|
+
createTabButtons(activeIndex) {
|
|
286
|
+
return this.tabs.map(tab => ({
|
|
287
|
+
active: this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex),
|
|
288
|
+
closeable: tab.closeable,
|
|
289
|
+
ariaControls: tab.tabPanelId,
|
|
290
|
+
disabled: tab.disabled,
|
|
291
|
+
/*tslint:disable-next-line:no-null-keyword*/
|
|
292
|
+
buttonHref: (tab.disabled) ? null : this.permalinkService.getParamHref(this.permalinkId, tab.permalinkValue),
|
|
293
|
+
buttonId: tab.tabButtonId,
|
|
294
|
+
buttonTextCount: tab.tabHeaderCount,
|
|
295
|
+
buttonText: tab.tabHeading,
|
|
296
|
+
tabIndex: tab.tabIndex
|
|
297
|
+
}));
|
|
298
|
+
}
|
|
299
|
+
updateTabButtons(activeIndex) {
|
|
300
|
+
this.tabButtons.forEach(button => {
|
|
301
|
+
button.active = this.tabsetService.tabIndexesEqual(button.tabIndex, activeIndex);
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Updates the UI and state of the tabset component after the tab index or
|
|
306
|
+
* tab components have changed.
|
|
307
|
+
* @param activeIndex The currently active tab index.
|
|
308
|
+
* @param regenerateTabButtons Indicates if tab button view models should be regenerated.
|
|
309
|
+
* Setting this value to `false` will simply update the existing tab buttons. Setting this value
|
|
310
|
+
* to `true` is only necessary when the underlying tab components have changed and the tab
|
|
311
|
+
* buttons must reflect those changes.
|
|
312
|
+
*/
|
|
313
|
+
updateTabsetComponent(activeIndex, regenerateTabButtons = false) {
|
|
314
|
+
var _a;
|
|
315
|
+
// Activate/deactivate tab components.
|
|
316
|
+
this.tabs.forEach(tab => {
|
|
317
|
+
this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex)
|
|
318
|
+
? tab.activate()
|
|
319
|
+
: tab.deactivate();
|
|
320
|
+
});
|
|
321
|
+
// Update the tab button models.
|
|
322
|
+
if (regenerateTabButtons || !this.tabButtons.length) {
|
|
323
|
+
this.tabButtons = this.createTabButtons(activeIndex);
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
this.updateTabButtons(activeIndex);
|
|
327
|
+
}
|
|
328
|
+
// Update the dropdown trigger button text.
|
|
329
|
+
this.dropdownTriggerButtonText = (_a = this.tabButtons.find(b => {
|
|
330
|
+
return this.tabsetService.tabIndexesEqual(b.tabIndex, activeIndex);
|
|
331
|
+
})) === null || _a === void 0 ? void 0 : _a.buttonText;
|
|
332
|
+
// Set the query params based on active tab.
|
|
333
|
+
if (this.permalinkId) {
|
|
334
|
+
const activeTabComponent = this.tabs.find(tab => {
|
|
335
|
+
return this.tabsetService.tabIndexesEqual(tab.tabIndex, activeIndex);
|
|
336
|
+
});
|
|
337
|
+
this.permalinkService.setParam(this.permalinkId, activeTabComponent.permalinkValue);
|
|
338
|
+
}
|
|
339
|
+
// Wait for tab button view models to render before gauging dimensions.
|
|
340
|
+
setTimeout(() => {
|
|
341
|
+
this.adapterService.detectOverflow();
|
|
342
|
+
});
|
|
343
|
+
this.changeDetector.markForCheck();
|
|
344
|
+
// Emit the new active index value to consumers.
|
|
345
|
+
if (this.lastActiveTabIndex !== activeIndex) {
|
|
346
|
+
this.lastActiveTabIndex = activeIndex;
|
|
347
|
+
this.activeChange.emit(activeIndex);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
SkyTabsetComponent.ctorParameters = () => [
|
|
352
|
+
{ type: ChangeDetectorRef },
|
|
353
|
+
{ type: ElementRef },
|
|
354
|
+
{ type: SkyTabsetAdapterService },
|
|
355
|
+
{ type: SkyTabsetPermalinkService },
|
|
356
|
+
{ type: SkyTabsetService }
|
|
357
|
+
];
|
|
358
|
+
__decorate([
|
|
359
|
+
Input()
|
|
360
|
+
], SkyTabsetComponent.prototype, "active", null);
|
|
361
|
+
__decorate([
|
|
362
|
+
Input()
|
|
363
|
+
], SkyTabsetComponent.prototype, "ariaLabel", void 0);
|
|
364
|
+
__decorate([
|
|
365
|
+
Input()
|
|
366
|
+
], SkyTabsetComponent.prototype, "ariaLabelledBy", void 0);
|
|
367
|
+
__decorate([
|
|
368
|
+
Input()
|
|
369
|
+
], SkyTabsetComponent.prototype, "permalinkId", null);
|
|
370
|
+
__decorate([
|
|
371
|
+
Input()
|
|
372
|
+
], SkyTabsetComponent.prototype, "tabStyle", null);
|
|
373
|
+
__decorate([
|
|
374
|
+
Output()
|
|
375
|
+
], SkyTabsetComponent.prototype, "activeChange", void 0);
|
|
376
|
+
__decorate([
|
|
377
|
+
Output()
|
|
378
|
+
], SkyTabsetComponent.prototype, "newTab", void 0);
|
|
379
|
+
__decorate([
|
|
380
|
+
Output()
|
|
381
|
+
], SkyTabsetComponent.prototype, "openTab", void 0);
|
|
382
|
+
__decorate([
|
|
383
|
+
Output()
|
|
384
|
+
], SkyTabsetComponent.prototype, "tabIndexesChange", void 0);
|
|
385
|
+
__decorate([
|
|
386
|
+
ContentChildren(SkyTabComponent)
|
|
387
|
+
], SkyTabsetComponent.prototype, "tabs", void 0);
|
|
388
|
+
SkyTabsetComponent = __decorate([
|
|
389
|
+
Component({
|
|
390
|
+
selector: 'sky-tabset',
|
|
391
|
+
template: "<div\n class=\"sky-tabset\"\n role=\"tablist\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [ngClass]=\"'sky-tabset-mode-' + tabDisplayMode + ' sky-tabset-style-' + tabStyle\"\n (window:resize)=\"onWindowResize()\"\n>\n <span class=\"sky-tabset-dropdown\">\n <sky-dropdown *ngIf=\"tabDisplayMode === 'dropdown'\"\n buttonType=\"tab\"\n >\n <sky-dropdown-button>\n {{ dropdownTriggerButtonText }}\n </sky-dropdown-button>\n <sky-dropdown-menu>\n <sky-dropdown-item *ngFor=\"let tabButton of tabButtons\"\n class=\"sky-tab-dropdown-menu-item\"\n >\n <div\n class=\"sky-tab-dropdown-item\"\n [ngClass]=\"{\n 'sky-tab-dropdown-item-selected': tabButton.active\n }\"\n >\n <ng-container *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </div>\n </sky-dropdown-item>\n </sky-dropdown-menu>\n </sky-dropdown>\n </span>\n <span\n class=\"sky-tabset-tabs\"\n >\n <ng-container *ngFor=\"let tabButton of tabButtons\">\n <ng-container *ngTemplateOutlet=\"tabButtonTemplate; context: {\n $implicit: tabButton\n }\"></ng-container>\n </ng-container>\n </span>\n <span\n class=\"sky-tabset-btns\"\n >\n <button *ngIf=\"newTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-new sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_add' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onNewTabClick()\"\n >\n <sky-icon\n icon=\"plus-circle\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n <button *ngIf=\"openTab.observers.length > 0\"\n class=\"sky-btn sky-btn-icon sky-tabset-btn-open sky-margin-inline-compact\"\n type=\"button\"\n [attr.aria-label]=\"'skyux_tab_open' | skyLibResources\"\n [skyThemeClass]=\"{\n 'sky-margin-inline-sm': 'modern'\n }\"\n (click)=\"onOpenTabClick()\"\n >\n <sky-icon\n icon=\"folder-open-o\"\n size=\"lg\"\n >\n </sky-icon>\n </button>\n </span>\n</div>\n<ng-content></ng-content>\n\n<ng-template\n let-tabButton\n #tabButtonTemplate\n>\n <sky-tab-button\n [active]=\"tabButton.active\"\n [ariaControls]=\"tabButton.ariaControls\"\n [buttonHref]=\"tabButton.buttonHref\"\n [buttonId]=\"tabButton.buttonId\"\n [buttonText]=\"tabButton.buttonText\"\n [buttonTextCount]=\"tabButton.buttonTextCount\"\n [closeable]=\"tabButton.closeable\"\n [disabled]=\"tabButton.disabled\"\n [tabStyle]=\"tabStyle\"\n (buttonClick)=\"onTabButtonClick(tabButton)\"\n (closeClick)=\"onTabCloseClick(tabButton)\"\n ></sky-tab-button>\n</ng-template>\n",
|
|
392
|
+
providers: [
|
|
393
|
+
SkyTabsetAdapterService,
|
|
394
|
+
SkyTabsetPermalinkService,
|
|
395
|
+
SkyTabsetService
|
|
396
|
+
],
|
|
397
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
398
|
+
encapsulation: ViewEncapsulation.None,
|
|
399
|
+
styles: [".sky-tabset{align-items:center;border-bottom:2px solid #0974a1;display:flex;list-style-type:none;margin:0;overflow:hidden;padding:0 0 0 15px;white-space:nowrap}.sky-tabset.sky-tabset-style-wizard{border-bottom:none;padding-bottom:10px;padding-left:0}.sky-tabset-btns{order:1;padding-left:10px}.sky-tabset-dropdown{order:0;max-width:100%}.sky-tabset-mode-dropdown{line-height:0}.sky-tabset-mode-dropdown .sky-tabset-tabs{visibility:hidden;order:2}.sky-tab-dropdown-menu-item sky-tab-button{display:flex;min-width:300px}.sky-tab-dropdown-menu-item .sky-dropdown-item{margin:0}.sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{width:100%;margin-right:0}.sky-tab-dropdown-menu-item .sky-btn-tab{margin:0;border-radius:0;width:100%;display:flex}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-tab-heading{flex:1 1 auto}.sky-tab-dropdown-menu-item .sky-btn-tab>.sky-btn-tab-close{flex:0 1 auto}.sky-tabset-tabs{order:0;white-space:nowrap}.sky-tabset-btn-new,.sky-tabset-btn-open{color:#0974a1}.sky-theme-modern .sky-tabset{border-bottom:1px solid #d2d2d2;overflow:visible}.sky-theme-modern .sky-tab-dropdown-menu-item .sky-btn-tab-wrapper{margin-right:0}"]
|
|
400
|
+
})
|
|
401
|
+
], SkyTabsetComponent);
|
|
402
|
+
export { SkyTabsetComponent };
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC90YWJzLyIsInNvdXJjZXMiOlsibW9kdWxlcy90YWJzL3RhYnNldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDTCxhQUFhLEVBQ2IsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsYUFBYSxFQUNiLElBQUksRUFDSixPQUFPLEVBQ1IsTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLFNBQVMsRUFDVixNQUFNLGdCQUFnQixDQUFDO0FBVXhCLE9BQU8sRUFDTCxlQUFlLEVBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLHVCQUF1QixFQUN4QixNQUFNLDBCQUEwQixDQUFDO0FBTWxDLE9BQU8sRUFDTCx5QkFBeUIsRUFDMUIsTUFBTSw0QkFBNEIsQ0FBQztBQUVwQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2pCLE1BQU0sa0JBQWtCLENBQUM7QUFpQzFCLElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQWtCO0lBK0o3QixZQUNVLGNBQWlDLEVBQ2pDLFVBQXNCLEVBQ3RCLGNBQXVDLEVBQ3ZDLGdCQUEyQyxFQUMzQyxhQUErQjtRQUovQixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBeUI7UUFDdkMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUEyQjtRQUMzQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0I7UUFqRXpDOztXQUVHO1FBRUksaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBRXREOzs7V0FHRztRQUVJLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXpDOzs7V0FHRztRQUVJLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTFDOztXQUVHO1FBRUkscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQTZCLENBQUM7UUFzQmpFLGVBQVUsR0FBeUIsRUFBRSxDQUFDO1FBRXJDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUVwQyx3Q0FBbUMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBZ0I5RCxDQUFDO0lBbktMOztPQUVHO0lBRUgsSUFBVyxNQUFNLENBQUMsS0FBa0I7UUFDbEMsSUFDRSxLQUFLLEtBQUssU0FBUztZQUNuQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUN2RDtZQUNBLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNMLHNGQUFzRjtZQUN0RixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQzdDLG9EQUFvRDtvQkFDcEQsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUUsS0FBSyxTQUFTLEVBQUU7d0JBQ3ZELElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQzdDO2lCQUNGO3FCQUFNO29CQUNMLDBEQUEwRDtvQkFDMUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7aUJBQ3REO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7SUFFRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQW1CRDs7Ozs7T0FLRztJQUVILElBQVcsV0FBVyxDQUFDLEtBQWE7UUFDbEMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNWLE9BQU87U0FDUjtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLFNBQVMsYUFBYSxDQUFDO0lBQ2hELENBQUM7SUFFRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBRUgsSUFBVyxRQUFRLENBQUMsS0FBcUI7UUFDdkMsd0JBQXdCO1FBQ3hCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FDViwyRUFBMkU7Z0JBQzNFLGlHQUFpRyxDQUNsRyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7SUFDbEMsQ0FBQztJQTRCRCxJQUFXLGNBQWMsQ0FBQyxLQUFrQztRQUMxRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQztJQUN4QyxDQUFDO0lBbUNNLGVBQWU7UUFFcEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7UUFFM0MsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUI7YUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2YscURBQXFEO1lBQ3JELFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVMLCtFQUErRTtRQUMvRSxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxTQUE2QjtRQUNsRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDckUsQ0FBQztRQUVGLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVNLGdCQUFnQixDQUFDLFNBQTZCO1FBQ25ELElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0I7O1FBQ3hCLElBQUksV0FBVyxHQUFnQixJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNyRSxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7WUFDN0IsV0FBVyxTQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSwwQ0FBRSxRQUFRLENBQUM7WUFDckQsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO2dCQUM3QixXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUMzQjtTQUNGO1FBRUQsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWM7YUFDOUIsSUFBSSxDQUNILG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQzlCO2FBQ0EsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxtQ0FBbUM7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO2FBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDhCQUE4QjtRQUNwQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDbEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2FBQ25GLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCwrRUFBK0U7WUFDL0UsVUFBVSxDQUFDLEdBQUcsRUFBRTs7Z0JBQ2QsTUFBTSxRQUFRLFNBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLDBDQUFFLFFBQVEsQ0FBQztnQkFDeEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqRCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUwsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2FBQ3BELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUNuRixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsRUFBRTtnQkFDekMsMEVBQTBFO2dCQUMxRSxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUIsQ0FBQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUNuRixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsK0VBQStFO1lBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sa0JBQWtCOztRQUN4QixJQUFJLENBQUMsbUNBQW1DLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRW5DLCtEQUErRDtRQUMvRCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxTQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSwwQ0FBRSxRQUFRLENBQUM7UUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7WUFDaEQsVUFBVSxFQUFFLEtBQUs7U0FDbEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxHQUFHLENBQUMsVUFBVTtnQkFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO2FBQ3ZCLENBQUMsQ0FBQztTQUNKLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxtQ0FBbUM7UUFDekMsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsbUNBQW1DLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUNqRSxDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWM7YUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDbkMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDNUQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLDRCQUE0QjtRQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYzthQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNuQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVPLDhCQUE4Qjs7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BFLElBQUksVUFBVSxFQUFFO2dCQUNkLGFBQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsY0FBYyxLQUFLLFVBQVUsQ0FBQywwQ0FBRSxRQUFRLENBQUM7YUFDM0U7U0FDRjtJQUNILENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQXdCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQztZQUNyRSxTQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7WUFDeEIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzVCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0Qiw0Q0FBNEM7WUFDNUMsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQ3BFLElBQUksQ0FBQyxXQUFXLEVBQ2hCLEdBQUcsQ0FBQyxjQUFjLENBQ25CO1lBQ0QsUUFBUSxFQUFFLEdBQUcsQ0FBQyxXQUFXO1lBQ3pCLGVBQWUsRUFBRSxHQUFHLENBQUMsY0FBYztZQUNuQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7WUFDMUIsUUFBUSxFQUFFLEdBQUcsQ0FBQyxRQUFRO1NBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQXdCO1FBQy9DLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLHFCQUFxQixDQUMzQixXQUF3QixFQUN4QixvQkFBb0IsR0FBRyxLQUFLOztRQUc1QixzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUM7Z0JBQzNELENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNoQixDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0NBQWdDO1FBQ2hDLElBQUksb0JBQW9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsMkNBQTJDO1FBQzNDLElBQUksQ0FBQyx5QkFBeUIsU0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckUsQ0FBQyxDQUFDLDBDQUFFLFVBQVUsQ0FBQztRQUVmLDRDQUE0QztRQUM1QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDOUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsdUVBQXVFO1FBQ3ZFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVuQyxnREFBZ0Q7UUFDaEQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssV0FBVyxFQUFFO1lBQzNDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUM7WUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDckM7SUFDSCxDQUFDO0NBQ0YsQ0FBQTs7WUFwUzJCLGlCQUFpQjtZQUNyQixVQUFVO1lBQ04sdUJBQXVCO1lBQ3JCLHlCQUF5QjtZQUM1QixnQkFBZ0I7O0FBOUp6QztJQURDLEtBQUssRUFBRTtnREEyQlA7QUFZRDtJQURDLEtBQUssRUFBRTtxREFDaUI7QUFTekI7SUFEQyxLQUFLLEVBQUU7MERBQ3NCO0FBUzlCO0lBREMsS0FBSyxFQUFFO3FEQVFQO0FBY0Q7SUFEQyxLQUFLLEVBQUU7a0RBV1A7QUFVRDtJQURDLE1BQU0sRUFBRTt3REFDNkM7QUFPdEQ7SUFEQyxNQUFNLEVBQUU7a0RBQ2dDO0FBT3pDO0lBREMsTUFBTSxFQUFFO21EQUNpQztBQU0xQztJQURDLE1BQU0sRUFBRTs0REFDK0Q7QUFZeEU7SUFEQyxlQUFlLENBQUMsZUFBZSxDQUFDO2dEQUNPO0FBdkk3QixrQkFBa0I7SUFaOUIsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLFlBQVk7UUFFdEIsazRGQUFzQztRQUN0QyxTQUFTLEVBQUU7WUFDVCx1QkFBdUI7WUFDdkIseUJBQXlCO1lBQ3pCLGdCQUFnQjtTQUNqQjtRQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO1FBQy9DLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOztLQUN0QyxDQUFDO0dBQ1csa0JBQWtCLENBb2M5QjtTQXBjWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgcmFjZSxcbiAgU3ViamVjdFxufSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIHRha2VVbnRpbFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIFNreVRhYkluZGV4XG59IGZyb20gJy4vdGFiLWluZGV4JztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0U3R5bGVcbn0gZnJvbSAnLi90YWJzZXQtc3R5bGUnO1xuXG5pbXBvcnQge1xuICBTa3lUYWJDb21wb25lbnRcbn0gZnJvbSAnLi90YWIuY29tcG9uZW50JztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0QWRhcHRlclNlcnZpY2Vcbn0gZnJvbSAnLi90YWJzZXQtYWRhcHRlci5zZXJ2aWNlJztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlXG59IGZyb20gJy4vdGFic2V0LWJ1dHRvbnMtZGlzcGxheS1tb2RlJztcblxuaW1wb3J0IHtcbiAgU2t5VGFic2V0UGVybWFsaW5rU2VydmljZVxufSBmcm9tICcuL3RhYnNldC1wZXJtYWxpbmsuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldFNlcnZpY2Vcbn0gZnJvbSAnLi90YWJzZXQuc2VydmljZSc7XG5cbmltcG9ydCB7XG4gIFNreVRhYnNldFRhYkluZGV4ZXNDaGFuZ2Vcbn0gZnJvbSAnLi90YWJzZXQtdGFiLWluZGV4ZXMtY2hhbmdlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFRhYkJ1dHRvblZpZXdNb2RlbCB7XG4gIGFjdGl2ZTogYm9vbGVhbjtcbiAgYXJpYUNvbnRyb2xzOiBzdHJpbmc7XG4gIGJ1dHRvbkhyZWY6IHN0cmluZztcbiAgYnV0dG9uSWQ6IHN0cmluZztcbiAgYnV0dG9uVGV4dDogc3RyaW5nO1xuICBidXR0b25UZXh0Q291bnQ6IHN0cmluZztcbiAgY2xvc2VhYmxlOiBib29sZWFuO1xuICBkaXNhYmxlZDogYm9vbGVhbjtcbiAgdGFiSW5kZXg6IFNreVRhYkluZGV4O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdza3ktdGFic2V0JyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFic2V0LmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi90YWJzZXQuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICBTa3lUYWJzZXRBZGFwdGVyU2VydmljZSxcbiAgICBTa3lUYWJzZXRQZXJtYWxpbmtTZXJ2aWNlLFxuICAgIFNreVRhYnNldFNlcnZpY2VcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2t5VGFic2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQWN0aXZhdGVzIGEgdGFiIGJ5IGl0cyBgdGFiSW5kZXhgIHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBhY3RpdmUodmFsdWU6IFNreVRhYkluZGV4KSB7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh2YWx1ZSwgdGhpcy5fYWN0aXZlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMudGFicykge1xuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT24gaW5pdCwgd2FpdCBmb3IgY2hpbGRyZW4gdGFicyB0byByZW5kZXIgYmVmb3JlIGJyb2FkY2FzdGluZyB0aGUgYWN0aXZlIHRhYiBpbmRleC5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50YWJzZXRTZXJ2aWNlLmlzVmFsaWRUYWJJbmRleCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBPbiBpbml0LCB5aWVsZCB0byB0aGUgcGVybWFsaW5rIElELCBpZiBpdCBleGlzdHMuXG4gICAgICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQWN0aXZhdGUgdGhlIGZpcnN0IHRhYiBpZiB0aGUgbmV3IHRhYiBpbmRleCBpcyBpbnZhbGlkLlxuICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMudGFic2V0U2VydmljZS5hY3RpdmF0ZUZpcnN0VGFiKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IFNreVRhYkluZGV4IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhbiBBUklBIGxhYmVsIGZvciB0aGUgdGFic2V0LiBUaGlzIHNldHMgdGhlIHRhYnNldCdzIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBpbmNsdWRlcyBhIHZpc2libGUgbGFiZWwsIHVzZSBgYXJpYUxhYmVsbGVkQnlgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgSFRNTCBlbGVtZW50IElEICh3aXRob3V0IHRoZSBsZWFkaW5nIGAjYCkgb2YgdGhlIGVsZW1lbnQgdGhhdCBsYWJlbHNcbiAgICogdGhlIHRhYnNldC4gVGhpcyBzZXRzIHRoZSB0YWJzZXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogSWYgdGhlIHRhYnNldCBkb2VzIG5vdCBpbmNsdWRlIGEgdmlzaWJsZSBsYWJlbCwgdXNlIGBhcmlhTGFiZWxgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuICAvKipcbiAgICogRGlzdGluZ3Vpc2hlcyBhIHRhYnNldCdzIHVuaXF1ZSBzdGF0ZSBpbiB0aGUgVVJMIGJ5IGdlbmVyYXRpbmcgYSBxdWVyeSBwYXJhbWV0ZXJcbiAgICogdGhhdCBpcyB3cml0dGVuIGFzIGA/PHF1ZXJ5UGFyYW0+LWFjdGl2ZS10YWI9PHNhbml0aXplZC10YWItaGVhZGluZz5gLlxuICAgKiBUaGUgcXVlcnkgcGFyYW1ldGVyJ3MgdmFsdWUgaXMgcGFyc2VkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgc2VsZWN0ZWQgdGFiJ3MgaGVhZGluZyB0ZXh0LFxuICAgKiBidXQgeW91IGNhbiBzdXBwbHkgYSBjdXN0b20gcXVlcnkgcGFyYW1ldGVyIHZhbHVlIGZvciBlYWNoIHRhYiB3aXRoIGl0cyBgcGVybWFsaW5rVmFsdWVgLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBwZXJtYWxpbmtJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNhbml0aXplZCA9IHRoaXMucGVybWFsaW5rU2VydmljZS51cmxpZnkodmFsdWUpO1xuICAgIHRoaXMuX3Blcm1hbGlua0lkID0gYCR7c2FuaXRpemVkfS1hY3RpdmUtdGFiYDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVybWFsaW5rSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGVybWFsaW5rSWQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBiZWhhdmlvciBmb3IgYSBzZXJpZXMgb2YgdGFicy5cbiAgICogQGRlcHJlY2F0ZWQgVGhlIHByb3BlcnR5IHdhcyBkZXNpZ25lZCB0byBjcmVhdGUgd2l6YXJkcyBieSBzZXR0aW5nIHRhYlN0eWxlPVwid2l6YXJkXCIgb24gdGFic2V0cyBpbiBtb2RhbHMsXG4gICAqIGJ1dCB0aGlzIHdpemFyZCBpbXBsZW1lbnRhdGlvbiB3YXMgcmVwbGFjZWQgYnkgdGhlXG4gICAqIFtwcm9ncmVzcyBpbmRpY2F0b3IgY29tcG9uZW50XShodHRwczovL2RldmVsb3Blci5ibGFja2JhdWQuY29tL3NreXV4L2NvbXBvbmVudHMvcHJvZ3Jlc3MtaW5kaWNhdG9yKS5cbiAgICogQGRlZmF1bHQgJ3RhYnMnXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHRhYlN0eWxlKHZhbHVlOiBTa3lUYWJzZXRTdHlsZSkge1xuICAgIC8qaXN0YW5idWwgaWdub3JlIGVsc2UqL1xuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnd2l6YXJkJykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnVGhlIHRhYnNldCB3aXphcmQgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGltcGxlbWVudCB0aGUgbmV3IGFwcHJvYWNoIHVzaW5nICcgK1xuICAgICAgICAncHJvZ3Jlc3MgaW5kaWNhdG9yIGFzIGRvY3VtZW50ZWQgaGVyZTogaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9jb21wb25lbnRzL3dpemFyZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX3RhYlN0eWxlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRhYlN0eWxlKCk6IFNreVRhYnNldFN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiU3R5bGUgfHwgJ3RhYnMnO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGFjdGl2ZSB0YWIgY2hhbmdlcy4gVGhpcyBldmVudCBlbWl0cyB0aGUgaW5kZXggb2YgdGhlIGFjdGl2ZSB0YWIuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIGFjdGl2ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5VGFiSW5kZXg+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgY2xpY2sgdGhlIGJ1dHRvbiB0byBhZGQgYSBuZXcgdGFiLlxuICAgKiBUaGUgbmV3IHRhYiBidXR0b24gaXMgYWRkZWQgdG8gdGhlIHRhYiBhcmVhIHdoZW4geW91IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgdGhpcyBldmVudC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgbmV3VGFiID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIGNsaWNrIHRoZSBidXR0b24gdG8gb3BlbiBhIHRhYi5cbiAgICogVGhlIG9wZW4gdGFiIGJ1dHRvbiBpcyBhZGRlZCB0byB0aGUgdGFiIGFyZWEgd2hlbiB5b3Ugc3BlY2lmeSBhIGxpc3RlbmVyIGZvciB0aGlzIGV2ZW50LlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvcGVuVGFiID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIGFueSB0YWIncyBgdGFiSW5kZXhgIHZhbHVlIGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHRhYkluZGV4ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNreVRhYnNldFRhYkluZGV4ZXNDaGFuZ2U+KCk7XG5cbiAgcHVibGljIHNldCB0YWJEaXNwbGF5TW9kZSh2YWx1ZTogU2t5VGFic2V0QnV0dG9uc0Rpc3BsYXlNb2RlKSB7XG4gICAgdGhpcy5fdGFiRGlzcGxheU1vZGUgPSB2YWx1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJEaXNwbGF5TW9kZSgpOiBTa3lUYWJzZXRCdXR0b25zRGlzcGxheU1vZGUge1xuICAgIHJldHVybiB0aGlzLl90YWJEaXNwbGF5TW9kZSB8fCAndGFicyc7XG4gIH1cblxuICBAQ29udGVudENoaWxkcmVuKFNreVRhYkNvbXBvbmVudClcbiAgcHVibGljIHRhYnM6IFF1ZXJ5TGlzdDxTa3lUYWJDb21wb25lbnQ+O1xuXG4gIHB1YmxpYyBkcm9wZG93blRyaWdnZXJCdXR0b25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSB0aGUgZGVwcmVjYXRlZCB0YWJzZXQtbmF2LWJ1dHRvbiBjb21wb25lbnQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGxhc3RBY3RpdmVUYWJJbmRleDogU2t5VGFiSW5kZXg7XG5cbiAgcHVibGljIHRhYkJ1dHRvbnM6IFRhYkJ1dHRvblZpZXdNb2RlbFtdID0gW107XG5cbiAgcHJpdmF0ZSBuZ1Vuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIHRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9hY3RpdmU6IFNreVRhYkluZGV4O1xuXG4gIHByaXZhdGUgX3Blcm1hbGlua0lkOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfdGFiRGlzcGxheU1vZGU6IFNreVRhYnNldEJ1dHRvbnNEaXNwbGF5TW9kZTtcblxuICBwcml2YXRlIF90YWJTdHlsZTogU2t5VGFic2V0U3R5bGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgYWRhcHRlclNlcnZpY2U6IFNreVRhYnNldEFkYXB0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGVybWFsaW5rU2VydmljZTogU2t5VGFic2V0UGVybWFsaW5rU2VydmljZSxcbiAgICBwcml2YXRlIHRhYnNldFNlcnZpY2U6IFNreVRhYnNldFNlcnZpY2VcbiAgKSB7IH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5pbml0VGFiQ29tcG9uZW50cygpO1xuICAgIHRoaXMubGlzdGVuVGFiQ29tcG9uZW50c1N0cnVjdHVyYWxDaGFuZ2UoKTtcblxuICAgIGNvbnN0IGluaXRpYWxUYWJJbmRleCA9IHRoaXMuZ2V0SW5pdGlhbFRhYkluZGV4KCk7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KGluaXRpYWxUYWJJbmRleCk7XG5cbiAgICB0aGlzLmxpc3RlblRhYkJ1dHRvbnNPdmVyZmxvd0NoYW5nZSgpO1xuICAgIHRoaXMubGlzdGVuTG9jYXRpb25Qb3BTdGF0ZUNoYW5nZSgpO1xuXG4gICAgLy8gSWYgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiIGlzIGdldHRpbmcgdW5yZWdpc3RlcmVkLCBhY3RpdmF0ZSB0aGUgbmV4dCBvbmUuXG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2ZVRhYlVucmVnaXN0ZXJlZFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKHRhYiA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXcgdGFicyB0byByZW5kZXIgYmVmb3JlIGFjdGl2YXRpbmcuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGFic2V0U2VydmljZS5hY3RpdmF0ZU5lYXJlc3RUYWIodGFiLmFycmF5SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgLy8gTGV0IHRoZSB0YWJzZXQgcmVuZGVyIHRoZSBpbml0aWFsIGFjdGl2ZSBpbmRleCBiZWZvcmUgbGlzdGVuaW5nIGZvciBjaGFuZ2VzLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5saXN0ZW5UYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICAgIHRoaXMubGlzdGVuQWN0aXZlSW5kZXhDaGFuZ2UoKTtcbiAgICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5pbml0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk7XG4gICAgdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmNsZWFyUGFyYW0odGhpcy5wZXJtYWxpbmtJZCk7XG4gIH1cblxuICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5kZXRlY3RPdmVyZmxvdygpO1xuICB9XG5cbiAgcHVibGljIG9uVGFiQ2xvc2VDbGljayh0YWJCdXR0b246IFRhYkJ1dHRvblZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYkNvbXBvbmVudCA9IHRoaXMudGFicy5maW5kKHRhYiA9PlxuICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnRhYkluZGV4ZXNFcXVhbCh0YWIudGFiSW5kZXgsIHRhYkJ1dHRvbi50YWJJbmRleClcbiAgICApO1xuXG4gICAgdGFiQ29tcG9uZW50LmNsb3NlLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvblRhYkJ1dHRvbkNsaWNrKHRhYkJ1dHRvbjogVGFiQnV0dG9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHRhYkJ1dHRvbi50YWJJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgb25OZXdUYWJDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm5ld1RhYi5lbWl0KCk7XG4gIH1cblxuICBwdWJsaWMgb25PcGVuVGFiQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuVGFiLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbml0aWFsIGFjdGl2ZSB0YWIgaW5kZXggYmFzZWQgb24gdGhlIGZvbGxvd2luZyBjcml0ZXJpYS5cbiAgICogMS4gRG9lcyB0aGUgVVJMIGluY2x1ZGUgYSBxdWVyeSBwYXJhbSB0aGF0IHJlZmxlY3RzIHRoaXMgdGFic2V0J3MgYWN0aXZlIHRhYj9cbiAgICogMi4gRG9lcyBvbmUgb2YgdGhlIHRhYiBjb21wb25lbnRzIGhhdmUgdGhlaXIgYGFjdGl2ZWAgcHJvcGVydHkgc2V0IHRvIGB0cnVlYD9cbiAgICogMy4gSXMgdGhlIHRhYnNldCBjb21wb25lbnQncyBgYWN0aXZlYCBwcm9wZXJ0eSBzZXQgdG8gYSBzcGVjaWZpYyB0YWIgaW5kZXg/XG4gICAqL1xuICBwcml2YXRlIGdldEluaXRpYWxUYWJJbmRleCgpOiBTa3lUYWJJbmRleCB7XG4gICAgbGV0IGFjdGl2ZUluZGV4OiBTa3lUYWJJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk7XG4gICAgaWYgKGFjdGl2ZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJDb21wb25lbnQoKT8udGFiSW5kZXg7XG4gICAgICBpZiAoYWN0aXZlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY3RpdmVJbmRleCA9IHRoaXMuYWN0aXZlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhY3RpdmVJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuQWN0aXZlSW5kZXhDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzZXRTZXJ2aWNlLmFjdGl2ZVRhYkluZGV4XG4gICAgICAucGlwZShcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoYWN0aXZlSW5kZXggPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYnNldENvbXBvbmVudChhY3RpdmVJbmRleCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuVGFiQ29tcG9uZW50c1N0cnVjdHVyYWxDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJzLmNoYW5nZXNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVzZXRUYWJDb21wb25lbnRzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdGVuVGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlKCk6IHZvaWQge1xuICAgIGNvbWJpbmVMYXRlc3QodGhpcy50YWJzLm1hcCh0YWIgPT4gdGFiLmFjdGl2ZUNoYW5nZSkpXG4gICAgICAucGlwZSh0YWtlVW50aWwocmFjZSh0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLCB0aGlzLm5nVW5zdWJzY3JpYmUpKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIGZpbmRpbmcgdGhlIGFjdGl2ZSBvbmUuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhYkluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJDb21wb25lbnQoKT8udGFiSW5kZXg7XG4gICAgICAgICAgdGhpcy50YWJzZXRTZXJ2aWNlLnNldEFjdGl2ZVRhYkluZGV4KHRhYkluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QodGhpcy50YWJzLm1hcCh0YWIgPT4gdGFiLnRhYkluZGV4Q2hhbmdlKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbChyYWNlKHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUsIHRoaXMubmdVbnN1YnNjcmliZSkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIERvbid0IGVtaXQgdGhlIGZpcnN0IGNoYW5nZS5cbiAgICAgICAgaWYgKHRoaXMubGFzdEFjdGl2ZVRhYkluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgdGFiIGNvbXBvbmVudHMgdG8gcmVuZGVyIGNoYW5nZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSB2aWV3LlxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUYWJzZXRDb21wb25lbnQodGhpcy50YWJzZXRTZXJ2aWNlLmN1cnJlbnRBY3RpdmVUYWJJbmRleCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmVtaXRUYWJJbmRleENoYW5nZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QodGhpcy50YWJzLm1hcCh0YWIgPT4gdGFiLnN0YXRlQ2hhbmdlKSlcbiAgICAgIC5waXBlKHRha2VVbnRpbChyYWNlKHRoaXMudGFiQ29tcG9uZW50c1N0YXRlQ2hhbmdlVW5zdWJzY3JpYmUsIHRoaXMubmdVbnN1YnNjcmliZSkpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSB0YWIgY29tcG9uZW50cyB0byByZW5kZXIgY2hhbmdlcyBiZWZvcmUgZmluZGluZyB0aGUgYWN0aXZlIG9uZS5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy51cGRhdGVUYWJzZXRDb21wb25lbnQodGhpcy50YWJzZXRTZXJ2aWNlLmN1cnJlbnRBY3RpdmVUYWJJbmRleCwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRUYWJDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB0YWIuaW5pdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRUYWJDb21wb25lbnRzKCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmVUYWJDb21wb25lbnRzU3RhdGVDaGFuZ2UoKTtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2UudW5yZWdpc3RlckFsbCgpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHRhYiBjb21wb25lbnRzLCBkbyBhIGhhcmQgcmVzZXQgb2YgdGhlIHZpZXcuXG4gICAgaWYgKHRoaXMudGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudXBkYXRlVGFic2V0Q29tcG9uZW50KDAsIHRydWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdFRhYkNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlVGFiQ29tcG9uZW50KCk/LnRhYkluZGV4O1xuICAgIHRoaXMudGFic2V0U2VydmljZS5zZXRBY3RpdmVUYWJJbmRleChhY3RpdmVJbmRleCwge1xuICAgICAgZW1pdENoYW5nZTogZmFsc2VcbiAgICB9KTtcbiAgICB0aGlzLmxpc3RlblRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0VGFiSW5kZXhDaGFuZ2UoKTogdm9pZCB7XG4gICAgdGhpcy50YWJJbmRleGVzQ2hhbmdlLmVtaXQoe1xuICAgICAgdGFiczogdGhpcy50YWJzLm1hcCh0YWIgPT4gKHtcbiAgICAgICAgdGFiSGVhZGluZzogdGFiLnRhYkhlYWRpbmcsXG4gICAgICAgIHRhYkluZGV4OiB0YWIudGFiSW5kZXhcbiAgICAgIH0pKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZVRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLnRhYkNvbXBvbmVudHNTdGF0ZUNoYW5nZVVuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy50YWJDb21wb25lbnRzU3RhdGVDaGFuZ2VVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRhYkJ1dHRvbnNPdmVyZmxvd0NoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLnJlZ2lzdGVyVGFic2V0KHRoaXMuZWxlbWVudFJlZik7XG4gICAgdGhpcy5hZGFwdGVyU2VydmljZS5vdmVyZmxvd0NoYW5nZVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKGlzT3ZlcmZsb3dpbmcgPT4ge1xuICAgICAgICB0aGlzLnRhYkRpc3BsYXlNb2RlID0gKGlzT3ZlcmZsb3dpbmcpID8gJ2Ryb3Bkb3duJyA6ICd0YWJzJztcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBmb3IgYmFjay9mb3J3YXJkIGhpc3RvcnkgYnV0dG9uIHByZXNzZXMgdG8gZGV0ZWN0IHF1ZXJ5IHBhcmFtIGNoYW5nZXMgaW4gdGhlIFVSTC5cbiAgICovXG4gIHByaXZhdGUgbGlzdGVuTG9jYXRpb25Qb3BTdGF0ZUNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLnBlcm1hbGlua1NlcnZpY2UucG9wU3RhdGVDaGFuZ2VcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0QWN0aXZlVGFiSW5kZXhCeVBlcm1hbGlua0lkKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTtcbiAgICB0aGlzLnRhYnNldFNlcnZpY2Uuc2V0QWN0aXZlVGFiSW5kZXgoYWN0aXZlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3RpdmVUYWJJbmRleEJ5UGVybWFsaW5rSWQoKTogU2t5VGFiSW5kZXgge1xuICAgIGlmICh0aGlzLnBlcm1hbGlua0lkKSB7XG4gICAgICBjb25zdCBwYXJhbVZhbHVlID0gdGhpcy5wZXJtYWxpbmtTZXJ2aWNlLmdldFBhcmFtKHRoaXMucGVybWFsaW5rSWQpO1xuICAgICAgaWYgKHBhcmFtVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFicy5maW5kKHRhYiA9PiB0YWIucGVybWFsaW5rVmFsdWUgPT09IHBhcmFtVmFsdWUpPy50YWJJbmRleDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFjdGl2ZVRhYkNvbXBvbmVudCgpOiBTa3lUYWJDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLnRhYnMudG9BcnJheSgpLnJldmVyc2UoKS5maW5kKHRhYiA9PiB0YWIuYWN0aXZlID09PSB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleDogU2t5VGFiSW5kZXgpOiBUYWJCdXR0b25WaWV3TW9kZWxbXSB7XG4gICAgcmV0dXJuIHRoaXMudGFicy5tYXAodGFiID0+ICh7XG4gICAgICBhY3RpdmU6IHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleCksXG4gICAgICBjbG9zZWFibGU6IHRhYi5jbG9zZWFibGUsXG4gICAgICBhcmlhQ29udHJvbHM6IHRhYi50YWJQYW5lbElkLFxuICAgICAgZGlzYWJsZWQ6IHRhYi5kaXNhYmxlZCxcbiAgICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW51bGwta2V5d29yZCovXG4gICAgICBidXR0b25IcmVmOiAodGFiLmRpc2FibGVkKSA/IG51bGwgOiB0aGlzLnBlcm1hbGlua1NlcnZpY2UuZ2V0UGFyYW1IcmVmKFxuICAgICAgICB0aGlzLnBlcm1hbGlua0lkLFxuICAgICAgICB0YWIucGVybWFsaW5rVmFsdWVcbiAgICAgICksXG4gICAgICBidXR0b25JZDogdGFiLnRhYkJ1dHRvbklkLFxuICAgICAgYnV0dG9uVGV4dENvdW50OiB0YWIudGFiSGVhZGVyQ291bnQsXG4gICAgICBidXR0b25UZXh0OiB0YWIudGFiSGVhZGluZyxcbiAgICAgIHRhYkluZGV4OiB0YWIudGFiSW5kZXhcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYkJ1dHRvbnMoYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4KTogdm9pZCB7XG4gICAgdGhpcy50YWJCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgIGJ1dHRvbi5hY3RpdmUgPSB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKGJ1dHRvbi50YWJJbmRleCwgYWN0aXZlSW5kZXgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIFVJIGFuZCBzdGF0ZSBvZiB0aGUgdGFic2V0IGNvbXBvbmVudCBhZnRlciB0aGUgdGFiIGluZGV4IG9yXG4gICAqIHRhYiBjb21wb25lbnRzIGhhdmUgY2hhbmdlZC5cbiAgICogQHBhcmFtIGFjdGl2ZUluZGV4IFRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYiBpbmRleC5cbiAgICogQHBhcmFtIHJlZ2VuZXJhdGVUYWJCdXR0b25zIEluZGljYXRlcyBpZiB0YWIgYnV0dG9uIHZpZXcgbW9kZWxzIHNob3VsZCBiZSByZWdlbmVyYXRlZC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIGBmYWxzZWAgd2lsbCBzaW1wbHkgdXBkYXRlIHRoZSBleGlzdGluZyB0YWIgYnV0dG9ucy4gU2V0dGluZyB0aGlzIHZhbHVlXG4gICAqIHRvIGB0cnVlYCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSB1bmRlcmx5aW5nIHRhYiBjb21wb25lbnRzIGhhdmUgY2hhbmdlZCBhbmQgdGhlIHRhYlxuICAgKiBidXR0b25zIG11c3QgcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUYWJzZXRDb21wb25lbnQoXG4gICAgYWN0aXZlSW5kZXg6IFNreVRhYkluZGV4LFxuICAgIHJlZ2VuZXJhdGVUYWJCdXR0b25zID0gZmFsc2VcbiAgKTogdm9pZCB7XG5cbiAgICAvLyBBY3RpdmF0ZS9kZWFjdGl2YXRlIHRhYiBjb21wb25lbnRzLlxuICAgIHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB7XG4gICAgICB0aGlzLnRhYnNldFNlcnZpY2UudGFiSW5kZXhlc0VxdWFsKHRhYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpXG4gICAgICAgID8gdGFiLmFjdGl2YXRlKClcbiAgICAgICAgOiB0YWIuZGVhY3RpdmF0ZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRoZSB0YWIgYnV0dG9uIG1vZGVscy5cbiAgICBpZiAocmVnZW5lcmF0ZVRhYkJ1dHRvbnMgfHwgIXRoaXMudGFiQnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudGFiQnV0dG9ucyA9IHRoaXMuY3JlYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlVGFiQnV0dG9ucyhhY3RpdmVJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBkcm9wZG93biB0cmlnZ2VyIGJ1dHRvbiB0ZXh0LlxuICAgIHRoaXMuZHJvcGRvd25UcmlnZ2VyQnV0dG9uVGV4dCA9IHRoaXMudGFiQnV0dG9ucy5maW5kKGIgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwoYi50YWJJbmRleCwgYWN0aXZlSW5kZXgpO1xuICAgIH0pPy5idXR0b25UZXh0O1xuXG4gICAgLy8gU2V0IHRoZSBxdWVyeSBwYXJhbXMgYmFzZWQgb24gYWN0aXZlIHRhYi5cbiAgICBpZiAodGhpcy5wZXJtYWxpbmtJZCkge1xuICAgICAgY29uc3QgYWN0aXZlVGFiQ29tcG9uZW50ID0gdGhpcy50YWJzLmZpbmQodGFiID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFic2V0U2VydmljZS50YWJJbmRleGVzRXF1YWwodGFiLnRhYkluZGV4LCBhY3RpdmVJbmRleCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucGVybWFsaW5rU2VydmljZS5zZXRQYXJhbSh0aGlzLnBlcm1hbGlua0lkLCBhY3RpdmVUYWJDb21wb25lbnQucGVybWFsaW5rVmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFdhaXQgZm9yIHRhYiBidXR0b24gdmlldyBtb2RlbHMgdG8gcmVuZGVyIGJlZm9yZSBnYXVnaW5nIGRpbWVuc2lvbnMuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmFkYXB0ZXJTZXJ2aWNlLmRldGVjdE92ZXJmbG93KCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgLy8gRW1pdCB0aGUgbmV3IGFjdGl2ZSBpbmRleCB2YWx1ZSB0byBjb25zdW1lcnMuXG4gICAgaWYgKHRoaXMubGFzdEFjdGl2ZVRhYkluZGV4ICE9PSBhY3RpdmVJbmRleCkge1xuICAgICAgdGhpcy5sYXN0QWN0aXZlVGFiSW5kZXggPSBhY3RpdmVJbmRleDtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlLmVtaXQoYWN0aXZlSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuIl19
|