@indice/ng-components 0.2.113 → 0.2.116

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.
Files changed (83) hide show
  1. package/bundles/indice-ng-components.umd.js +3725 -0
  2. package/bundles/indice-ng-components.umd.js.map +1 -0
  3. package/{esm2020/indice-ng-components.mjs → esm2015/indice-ng-components.js} +0 -0
  4. package/{esm2020/lib/controls/avatar-initials/avatar-initials.component.mjs → esm2015/lib/controls/avatar-initials/avatar-initials.component.js} +8 -5
  5. package/esm2015/lib/controls/collapsible-panel/collapsible-panel.component.js +23 -0
  6. package/esm2015/lib/controls/date-picker/date-picker.component.js +269 -0
  7. package/esm2015/lib/controls/drop-down-menu/drop-down-menu.component.js +72 -0
  8. package/{esm2020/lib/controls/kpi-tile/kpi-tile.component.mjs → esm2015/lib/controls/kpi-tile/kpi-tile.component.js} +8 -5
  9. package/{esm2020/lib/controls/list-view/list-column.component.mjs → esm2015/lib/controls/list-view/list-column.component.js} +3 -3
  10. package/{esm2020/lib/controls/list-view/list-details-section.component.mjs → esm2015/lib/controls/list-view/list-details-section.component.js} +3 -3
  11. package/{esm2020/lib/controls/list-view/list-tile.component.mjs → esm2015/lib/controls/list-view/list-tile.component.js} +3 -3
  12. package/esm2015/lib/controls/list-view/list-view-empty-state.component.js +32 -0
  13. package/esm2015/lib/controls/list-view/list-view.component.js +186 -0
  14. package/{esm2020/lib/controls/pager/pager.component.mjs → esm2015/lib/controls/pager/pager.component.js} +8 -5
  15. package/esm2015/lib/controls/side-pane/side-pane.component.js +76 -0
  16. package/esm2015/lib/controls/skeleton-loader/skeleton-loader.component.js +29 -0
  17. package/{esm2020/lib/controls/toaster/toaster-container.component.mjs → esm2015/lib/controls/toaster/toaster-container.component.js} +8 -5
  18. package/esm2015/lib/controls/toaster/toaster.component.js +34 -0
  19. package/{esm2020/lib/controls/toggle/toggle.component.mjs → esm2015/lib/controls/toggle/toggle.component.js} +10 -6
  20. package/{esm2020/lib/directives/click-outside.directive.mjs → esm2015/lib/directives/click-outside.directive.js} +3 -3
  21. package/{esm2020/lib/directives/dynamic-component-host.directive.mjs → esm2015/lib/directives/dynamic-component-host.directive.js} +3 -3
  22. package/esm2015/lib/helpers/base-list.component.js +182 -0
  23. package/{esm2020/lib/icons.mjs → esm2015/lib/icons.js} +0 -0
  24. package/{esm2020/lib/layouts/shell/shell-footer/shell-footer.component.mjs → esm2015/lib/layouts/shell/shell-footer/shell-footer.component.js} +8 -5
  25. package/esm2015/lib/layouts/shell/shell-header/shell-header.component.js +118 -0
  26. package/esm2015/lib/layouts/shell/shell-layout/shell-layout.component.js +106 -0
  27. package/esm2015/lib/layouts/views/form-layout/form-layout.component.js +85 -0
  28. package/esm2015/lib/layouts/views/model-view-layout/model-view-layout.component.js +55 -0
  29. package/{esm2020/lib/layouts/views/side-view-layout/side-view-layout.component.mjs → esm2015/lib/layouts/views/side-view-layout/side-view-layout.component.js} +8 -5
  30. package/esm2015/lib/layouts/views/view-layout/view-layout.component.js +110 -0
  31. package/{esm2020/lib/ng-components.module.mjs → esm2015/lib/ng-components.module.js} +4 -4
  32. package/{esm2020/lib/pages/auth/auth-callback/auth-callback.component.mjs → esm2015/lib/pages/auth/auth-callback/auth-callback.component.js} +10 -6
  33. package/{esm2020/lib/pages/auth/auth-renew/auth-renew.component.mjs → esm2015/lib/pages/auth/auth-renew/auth-renew.component.js} +3 -3
  34. package/{esm2020/lib/pages/auth/logged-out/logged-out.component.mjs → esm2015/lib/pages/auth/logged-out/logged-out.component.js} +9 -5
  35. package/esm2015/lib/pages/http-status/error/error.component.js +20 -0
  36. package/esm2015/lib/pages/http-status/page-not-found/page-not-found.component.js +18 -0
  37. package/esm2015/lib/pages/http-status/unauthorized/unauthorized.component.js +17 -0
  38. package/{esm2020/lib/pipes/address.pipe.mjs → esm2015/lib/pipes/address.pipe.js} +3 -3
  39. package/{esm2020/lib/pipes/duration-format.pipe.mjs → esm2015/lib/pipes/duration-format.pipe.js} +3 -3
  40. package/{esm2020/lib/services/component-loader/component-loader-options.class.mjs → esm2015/lib/services/component-loader/component-loader-options.class.js} +0 -0
  41. package/esm2015/lib/services/component-loader/component-loader.class.js +192 -0
  42. package/{esm2020/lib/services/component-loader/component-loader.factory.mjs → esm2015/lib/services/component-loader/component-loader.factory.js} +3 -3
  43. package/{esm2020/lib/services/component-loader/content-ref.class.mjs → esm2015/lib/services/component-loader/content-ref.class.js} +0 -0
  44. package/{esm2020/lib/services/modal-service/modal-backdrop-component.mjs → esm2015/lib/services/modal-service/modal-backdrop-component.js} +5 -5
  45. package/esm2015/lib/services/modal-service/modal-container-component.js +128 -0
  46. package/esm2015/lib/services/modal-service/modal-options.class.js +35 -0
  47. package/esm2015/lib/services/modal-service/modal-service.js +220 -0
  48. package/{esm2020/lib/services/modal-service/modal-styles.class.mjs → esm2015/lib/services/modal-service/modal-styles.class.js} +0 -0
  49. package/{esm2020/lib/services/modal-service/modal.class.mjs → esm2015/lib/services/modal-service/modal.class.js} +3 -3
  50. package/{esm2020/lib/services/toaster.service.mjs → esm2015/lib/services/toaster.service.js} +3 -3
  51. package/{esm2020/lib/tokens.mjs → esm2015/lib/tokens.js} +0 -0
  52. package/{esm2020/lib/types.mjs → esm2015/lib/types.js} +0 -0
  53. package/esm2015/public-api.js +52 -0
  54. package/{fesm2020/indice-ng-components.mjs → fesm2015/indice-ng-components.js} +305 -202
  55. package/fesm2015/indice-ng-components.js.map +1 -0
  56. package/lib/ng-components.module.d.ts +1 -4
  57. package/lib/services/modal-service/modal-options.class.d.ts +2 -1
  58. package/package.json +6 -19
  59. package/esm2020/lib/controls/collapsible-panel/collapsible-panel.component.mjs +0 -20
  60. package/esm2020/lib/controls/date-picker/date-picker.component.mjs +0 -260
  61. package/esm2020/lib/controls/drop-down-menu/drop-down-menu.component.mjs +0 -68
  62. package/esm2020/lib/controls/list-view/list-view-empty-state.component.mjs +0 -29
  63. package/esm2020/lib/controls/list-view/list-view.component.mjs +0 -184
  64. package/esm2020/lib/controls/side-pane/side-pane.component.mjs +0 -72
  65. package/esm2020/lib/controls/skeleton-loader/skeleton-loader.component.mjs +0 -25
  66. package/esm2020/lib/controls/toaster/toaster.component.mjs +0 -31
  67. package/esm2020/lib/helpers/base-list.component.mjs +0 -181
  68. package/esm2020/lib/layouts/shell/shell-header/shell-header.component.mjs +0 -113
  69. package/esm2020/lib/layouts/shell/shell-layout/shell-layout.component.mjs +0 -101
  70. package/esm2020/lib/layouts/views/form-layout/form-layout.component.mjs +0 -80
  71. package/esm2020/lib/layouts/views/model-view-layout/model-view-layout.component.mjs +0 -51
  72. package/esm2020/lib/layouts/views/view-layout/view-layout.component.mjs +0 -104
  73. package/esm2020/lib/pages/http-status/error/error.component.mjs +0 -17
  74. package/esm2020/lib/pages/http-status/page-not-found/page-not-found.component.mjs +0 -15
  75. package/esm2020/lib/pages/http-status/unauthorized/unauthorized.component.mjs +0 -14
  76. package/esm2020/lib/services/component-loader/component-loader.class.mjs +0 -188
  77. package/esm2020/lib/services/modal-service/modal-container-component.mjs +0 -126
  78. package/esm2020/lib/services/modal-service/modal-options.class.mjs +0 -34
  79. package/esm2020/lib/services/modal-service/modal-service.mjs +0 -219
  80. package/esm2020/public-api.mjs +0 -54
  81. package/fesm2015/indice-ng-components.mjs +0 -3129
  82. package/fesm2015/indice-ng-components.mjs.map +0 -1
  83. package/fesm2020/indice-ng-components.mjs.map +0 -1
@@ -1,181 +0,0 @@
1
- import { of } from 'rxjs';
2
- import { Component } from '@angular/core';
3
- import { RouterViewAction, ViewAction, ListViewType } from '../types';
4
- import { Icons } from '../icons';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/router";
7
- export class BaseListComponent {
8
- constructor(route$, router$) {
9
- this.route$ = route$;
10
- this.router$ = router$;
11
- this.items = null;
12
- this.view = ListViewType.Tiles;
13
- this.title = null;
14
- this.actions = [];
15
- this.loaderItems = [1, 2, 3, 4, 5];
16
- this.page = 1;
17
- this.pageSize = 20;
18
- this.count = 0;
19
- this.sort = '';
20
- this.sortdir = '-';
21
- this.search = '';
22
- this.sortOptions = [];
23
- this.metaItems = [];
24
- }
25
- ngOnDestroy() {
26
- if (this.routeSub$) {
27
- this.routeSub$.unsubscribe();
28
- }
29
- }
30
- getViewActions() {
31
- const actions = [
32
- new ViewAction('search', null, null, Icons.Search, 'αναζήτηση'),
33
- new ViewAction('refresh', null, null, Icons.Refresh, 'ανανέωση στοιχείων')
34
- ];
35
- if (this.newItemLink) {
36
- actions.push(new RouterViewAction(Icons.Add, this.newItemLink, 'rightpane', 'προσθήκη νέας εγγραφής;'));
37
- }
38
- return of(actions);
39
- }
40
- ngOnInit() {
41
- this.getViewActions().subscribe(actions => {
42
- this.actions = actions || [];
43
- });
44
- this.metaItems = [
45
- { key: 'count', icon: Icons.ItemsCount, text: 'παρακαλώ περιμένετε...' }
46
- ];
47
- // disabled external route changes monitoring due to sync issues - which is bad :) - refresh from url will not work
48
- // until i come up with a solution...
49
- this.routeSub$ = this.route$.queryParamMap.subscribe(params => {
50
- if (params.keys.length === 0) {
51
- return;
52
- }
53
- // changing the view mode does not require reloading...
54
- this.view = params.get('view') || ListViewType.Tiles;
55
- // console.log('route changes ', this.view);
56
- // if (params.get('search') !== this.search) {
57
- // this.searchChanged(params.get('search'));
58
- // }
59
- // const page = +(params.get('page') || 1);
60
- // if (page !== this.page) {
61
- // this.page = page;
62
- // }
63
- // const size = +(params.get('pagesize') || 20);
64
- // if (this.pageSize !== size) {
65
- // this.pageSize = size;
66
- // }
67
- // if (params.get('search') !== this.search) {
68
- // this.search = params.get('search');
69
- // }
70
- // if (params.get('sort') !== this.sort) {
71
- // this.sort = params.get('sort');
72
- // }
73
- // if (params.get('sortdir') !== this.sortdir) {
74
- // this.sortdir = params.get('sortdir');
75
- // }
76
- });
77
- // just to sync params in query
78
- this.setRouteParams(true);
79
- this.load();
80
- }
81
- setRouteParams(locationChange = false) {
82
- this.router$.navigate([], {
83
- relativeTo: this.route$, queryParams: {
84
- view: this.view,
85
- page: this.page,
86
- pagesize: this.pageSize,
87
- search: this.search,
88
- sort: this.sort,
89
- dir: this.sortdir
90
- }, queryParamsHandling: 'merge', skipLocationChange: locationChange
91
- });
92
- }
93
- actionHandler($event) {
94
- // console.log('BaseListComponent actionHandler', $event);
95
- if ($event.key === 'refresh') {
96
- this.refresh();
97
- }
98
- }
99
- load() {
100
- // console.log('BaseListComponent LOAD');
101
- this.count = 0;
102
- this.items = null;
103
- this.loadItems().subscribe(result => {
104
- this.count = result ? result.count : 0;
105
- this.items = result?.items;
106
- this.updateHeaderMeta();
107
- }, err => {
108
- this.count = 0;
109
- this.items = null;
110
- this.updateHeaderMeta();
111
- });
112
- }
113
- updateHeaderMeta() {
114
- const count = this.metaItems?.filter(m => m.key === 'count')[0];
115
- if (count) {
116
- this.count === 1 ? count.text = `${this.count} αποτέλεσμα` : count.text = `${this.count} αποτελέσματα`;
117
- }
118
- }
119
- clear() {
120
- this.count = 0;
121
- this.page = 1;
122
- this.items = null;
123
- this.search = null;
124
- this.setRouteParams();
125
- this.load();
126
- }
127
- refresh() {
128
- this.count = 0;
129
- this.page = 1;
130
- this.items = null;
131
- this.setRouteParams();
132
- this.load();
133
- }
134
- pageChanged(page) {
135
- if (this.page !== page) {
136
- this.page = page;
137
- this.setRouteParams();
138
- this.load();
139
- }
140
- }
141
- pageSizeChanged(pageSize) {
142
- if (this.pageSize !== pageSize) {
143
- this.pageSize = pageSize;
144
- this.page = 1;
145
- this.setRouteParams();
146
- this.refresh();
147
- }
148
- }
149
- sortChanged(sort) {
150
- // console.log('base-list sortChanged', sort);
151
- if (this.sort !== sort) {
152
- this.page = 1;
153
- this.sort = sort;
154
- this.setRouteParams();
155
- this.refresh();
156
- }
157
- }
158
- sortdirChanged(sortdir) {
159
- if (this.sortdir !== sortdir) {
160
- this.page = 1;
161
- this.sortdir = sortdir;
162
- this.setRouteParams();
163
- this.refresh();
164
- }
165
- }
166
- searchChanged(searchText) {
167
- this.count = 0;
168
- this.page = 1;
169
- this.items = null;
170
- this.search = searchText;
171
- this.setRouteParams();
172
- this.load();
173
- }
174
- }
175
- BaseListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
176
- BaseListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: BaseListComponent, selector: "ng-component", ngImport: i0, template: '', isInline: true });
177
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: BaseListComponent, decorators: [{
178
- type: Component,
179
- args: [{ template: '' }]
180
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }]; } });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9oZWxwZXJzL2Jhc2UtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUEwQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7OztBQUdqQyxNQUFNLE9BQWdCLGlCQUFpQjtJQWlCckMsWUFBb0IsTUFBc0IsRUFBVSxPQUFlO1FBQS9DLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQWhCNUQsVUFBSyxHQUEyQixJQUFJLENBQUM7UUFDckMsU0FBSSxHQUFXLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDbEMsVUFBSyxHQUFrQixJQUFJLENBQUM7UUFDNUIsWUFBTyxHQUFpQixFQUFFLENBQUM7UUFDM0IsZ0JBQVcsR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixTQUFJLEdBQWtCLEVBQUUsQ0FBQztRQUN6QixZQUFPLEdBQWtCLEdBQUcsQ0FBQztRQUM3QixXQUFNLEdBQWtCLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0IsY0FBUyxHQUFxQixFQUFFLENBQUM7SUFLeEMsQ0FBQztJQUVELFdBQVc7UUFD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QUMsSUFBSSxHQUFHLElBQUksQ0FBQztZQUNqQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVNLGNBQWMsQ0FBQyxPQUFlO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVNLGFBQWEsQ0FBQyxVQUF5QjtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7OzhHQW5NbUIsaUJBQWlCO2tHQUFqQixpQkFBaUIsb0RBRGhCLEVBQUU7MkZBQ0gsaUJBQWlCO2tCQUR0QyxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSGVhZGVyTWV0YUl0ZW0sIElSZXN1bHRTZXQsIE1lbnVPcHRpb24sIFJvdXRlclZpZXdBY3Rpb24sIFZpZXdBY3Rpb24sIExpc3RWaWV3VHlwZSB9IGZyb20gJy4uL3R5cGVzJztcclxuaW1wb3J0IHsgSWNvbnMgfSBmcm9tICcuLi9pY29ucyc7XHJcblxyXG5AQ29tcG9uZW50KHsgdGVtcGxhdGU6ICcnIH0pXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTGlzdENvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBwdWJsaWMgaXRlbXM6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xyXG4gIHB1YmxpYyB2aWV3OiBzdHJpbmcgPSBMaXN0Vmlld1R5cGUuVGlsZXM7XHJcbiAgcHVibGljIHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICBwdWJsaWMgYWN0aW9uczogVmlld0FjdGlvbltdID0gW107XHJcbiAgcHVibGljIGxvYWRlckl0ZW1zOiBhbnlbXSA9IFsxLCAyLCAzLCA0LCA1XTtcclxuICBwdWJsaWMgcGFnZSA9IDE7XHJcbiAgcHVibGljIHBhZ2VTaXplID0gMjA7XHJcbiAgcHVibGljIGNvdW50ID0gMDtcclxuICBwdWJsaWMgc29ydDogc3RyaW5nIHwgbnVsbCA9ICcnO1xyXG4gIHB1YmxpYyBzb3J0ZGlyOiBzdHJpbmcgfCBudWxsID0gJy0nO1xyXG4gIHB1YmxpYyBzZWFyY2g6IHN0cmluZyB8IG51bGwgPSAnJztcclxuICBwdWJsaWMgc29ydE9wdGlvbnM6IE1lbnVPcHRpb25bXSA9IFtdO1xyXG4gIHB1YmxpYyBtZXRhSXRlbXM6IEhlYWRlck1ldGFJdGVtW10gPSBbXTtcclxuICBwdWJsaWMgYWJzdHJhY3QgbmV3SXRlbUxpbms6IHN0cmluZyB8IG51bGw7XHJcbiAgcHJpdmF0ZSByb3V0ZVN1YiQ6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZSQ6IEFjdGl2YXRlZFJvdXRlLCBwcml2YXRlIHJvdXRlciQ6IFJvdXRlcikge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yb3V0ZVN1YiQpIHtcclxuICAgICAgdGhpcy5yb3V0ZVN1YiQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRWaWV3QWN0aW9ucygpOiBPYnNlcnZhYmxlPFZpZXdBY3Rpb25bXT4ge1xyXG4gICAgY29uc3QgYWN0aW9ucyA9IFtcclxuICAgICAgbmV3IFZpZXdBY3Rpb24oJ3NlYXJjaCcsIG51bGwsIG51bGwsIEljb25zLlNlYXJjaCwgJ86xzr3Osc62zq7PhM63z4POtycpLFxyXG4gICAgICBuZXcgVmlld0FjdGlvbigncmVmcmVzaCcsIG51bGwsIG51bGwsIEljb25zLlJlZnJlc2gsICfOsc69zrHOvc6tz4nPg863IM+Dz4TOv865z4fOtc6vz4nOvScpXHJcbiAgICBdO1xyXG4gICAgaWYgKHRoaXMubmV3SXRlbUxpbmspIHtcclxuICAgICAgYWN0aW9ucy5wdXNoKG5ldyBSb3V0ZXJWaWV3QWN0aW9uKEljb25zLkFkZCwgdGhpcy5uZXdJdGVtTGluaywgJ3JpZ2h0cGFuZScsICfPgM+Bzr/Pg864zq7Ous63IM69zq3Osc+CIM61zrPOs8+BzrHPhs6uz4I7JykpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9mKGFjdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldFZpZXdBY3Rpb25zKCkuc3Vic2NyaWJlKGFjdGlvbnMgPT4ge1xyXG4gICAgICB0aGlzLmFjdGlvbnMgPSBhY3Rpb25zIHx8IFtdO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5tZXRhSXRlbXMgPSBbXHJcbiAgICAgIHsga2V5OiAnY291bnQnLCBpY29uOiBJY29ucy5JdGVtc0NvdW50LCB0ZXh0OiAnz4DOsc+BzrHOus6xzrvPjiDPgM61z4HOuc68zq3Ovc61z4TOtS4uLicgfVxyXG4gICAgXTtcclxuXHJcbiAgICAvLyBkaXNhYmxlZCBleHRlcm5hbCByb3V0ZSBjaGFuZ2VzIG1vbml0b3JpbmcgZHVlIHRvIHN5bmMgaXNzdWVzIC0gd2hpY2ggaXMgYmFkIDopIC0gcmVmcmVzaCBmcm9tIHVybCB3aWxsIG5vdCB3b3JrXHJcbiAgICAvLyB1bnRpbCBpIGNvbWUgdXAgd2l0aCBhIHNvbHV0aW9uLi4uXHJcblxyXG4gICAgdGhpcy5yb3V0ZVN1YiQgPSB0aGlzLnJvdXRlJC5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShwYXJhbXMgPT4ge1xyXG4gICAgICBpZiAocGFyYW1zLmtleXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBjaGFuZ2luZyB0aGUgdmlldyBtb2RlIGRvZXMgbm90IHJlcXVpcmUgcmVsb2FkaW5nLi4uXHJcbiAgICAgIHRoaXMudmlldyA9IHBhcmFtcy5nZXQoJ3ZpZXcnKSB8fCBMaXN0Vmlld1R5cGUuVGlsZXM7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyb3V0ZSBjaGFuZ2VzICcsIHRoaXMudmlldyk7XHJcblxyXG4gICAgICAvLyBpZiAocGFyYW1zLmdldCgnc2VhcmNoJykgIT09IHRoaXMuc2VhcmNoKSB7XHJcbiAgICAgIC8vICAgdGhpcy5zZWFyY2hDaGFuZ2VkKHBhcmFtcy5nZXQoJ3NlYXJjaCcpKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gY29uc3QgcGFnZSA9ICsocGFyYW1zLmdldCgncGFnZScpIHx8IDEpO1xyXG4gICAgICAvLyBpZiAocGFnZSAhPT0gdGhpcy5wYWdlKSB7XHJcbiAgICAgIC8vICAgdGhpcy5wYWdlID0gcGFnZTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgICAgLy8gY29uc3Qgc2l6ZSA9ICsocGFyYW1zLmdldCgncGFnZXNpemUnKSB8fCAyMCk7XHJcbiAgICAgIC8vIGlmICh0aGlzLnBhZ2VTaXplICE9PSBzaXplKSB7XHJcbiAgICAgIC8vICAgdGhpcy5wYWdlU2l6ZSA9IHNpemU7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIGlmIChwYXJhbXMuZ2V0KCdzZWFyY2gnKSAhPT0gdGhpcy5zZWFyY2gpIHtcclxuICAgICAgLy8gICB0aGlzLnNlYXJjaCA9IHBhcmFtcy5nZXQoJ3NlYXJjaCcpO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyBpZiAocGFyYW1zLmdldCgnc29ydCcpICE9PSB0aGlzLnNvcnQpIHtcclxuICAgICAgLy8gICB0aGlzLnNvcnQgPSBwYXJhbXMuZ2V0KCdzb3J0Jyk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIGlmIChwYXJhbXMuZ2V0KCdzb3J0ZGlyJykgIT09IHRoaXMuc29ydGRpcikge1xyXG4gICAgICAvLyAgIHRoaXMuc29ydGRpciA9IHBhcmFtcy5nZXQoJ3NvcnRkaXInKTtcclxuICAgICAgLy8gfVxyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIGp1c3QgdG8gc3luYyBwYXJhbXMgaW4gcXVlcnlcclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbXModHJ1ZSk7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Um91dGVQYXJhbXMobG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZXIkLm5hdmlnYXRlKFtdLCB7XHJcbiAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUkLCBxdWVyeVBhcmFtczoge1xyXG4gICAgICAgIHZpZXc6IHRoaXMudmlldyxcclxuICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXHJcbiAgICAgICAgcGFnZXNpemU6IHRoaXMucGFnZVNpemUsXHJcbiAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaCxcclxuICAgICAgICBzb3J0OiB0aGlzLnNvcnQsXHJcbiAgICAgICAgZGlyOiB0aGlzLnNvcnRkaXJcclxuICAgICAgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJywgc2tpcExvY2F0aW9uQ2hhbmdlOiBsb2NhdGlvbkNoYW5nZVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWN0aW9uSGFuZGxlcigkZXZlbnQ6IFZpZXdBY3Rpb24pOiB2b2lkIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdCYXNlTGlzdENvbXBvbmVudCBhY3Rpb25IYW5kbGVyJywgJGV2ZW50KTtcclxuICAgIGlmICgkZXZlbnQua2V5ID09PSAncmVmcmVzaCcpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWQoKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnQmFzZUxpc3RDb21wb25lbnQgTE9BRCcpO1xyXG4gICAgdGhpcy5jb3VudCA9IDA7XHJcbiAgICB0aGlzLml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMubG9hZEl0ZW1zKCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMuY291bnQgPSByZXN1bHQgPyByZXN1bHQuY291bnQgOiAwO1xyXG4gICAgICB0aGlzLml0ZW1zID0gcmVzdWx0Py5pdGVtcztcclxuICAgICAgdGhpcy51cGRhdGVIZWFkZXJNZXRhKCk7XHJcbiAgICB9LCBlcnIgPT4ge1xyXG4gICAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgICAgdGhpcy5pdGVtcyA9IG51bGw7XHJcbiAgICAgIHRoaXMudXBkYXRlSGVhZGVyTWV0YSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUhlYWRlck1ldGEoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb3VudCA9IHRoaXMubWV0YUl0ZW1zPy5maWx0ZXIobSA9PiBtLmtleSA9PT0gJ2NvdW50JylbMF07XHJcbiAgICBpZiAoY291bnQpIHtcclxuICAgICAgdGhpcy5jb3VudCA9PT0gMSA/IGNvdW50LnRleHQgPSBgJHt0aGlzLmNvdW50fSDOsc+Azr/PhM6tzrvOtc+DzrzOsWAgOiBjb3VudC50ZXh0ID0gYCR7dGhpcy5jb3VudH0gzrHPgM6/z4TOtc67zq3Pg868zrHPhM6xYDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhYnN0cmFjdCBsb2FkSXRlbXMoKTogT2JzZXJ2YWJsZTxJUmVzdWx0U2V0PFQ+IHwgbnVsbCB8IHVuZGVmaW5lZD47XHJcblxyXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIHRoaXMuaXRlbXMgPSBudWxsO1xyXG4gICAgdGhpcy5zZWFyY2ggPSBudWxsO1xyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtcygpO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY291bnQgPSAwO1xyXG4gICAgdGhpcy5wYWdlID0gMTtcclxuICAgIHRoaXMuaXRlbXMgPSBudWxsO1xyXG4gICAgdGhpcy5zZXRSb3V0ZVBhcmFtcygpO1xyXG4gICAgdGhpcy5sb2FkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZUNoYW5nZWQocGFnZTogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5wYWdlICE9PSBwYWdlKSB7XHJcbiAgICAgIHRoaXMucGFnZSA9IHBhZ2U7XHJcbiAgICAgIHRoaXMuc2V0Um91dGVQYXJhbXMoKTtcclxuICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcGFnZVNpemVDaGFuZ2VkKHBhZ2VTaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnBhZ2VTaXplICE9PSBwYWdlU2l6ZSkge1xyXG4gICAgICB0aGlzLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc2V0Um91dGVQYXJhbXMoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydENoYW5nZWQoc29ydDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnYmFzZS1saXN0IHNvcnRDaGFuZ2VkJywgc29ydCk7XHJcbiAgICBpZiAodGhpcy5zb3J0ICE9PSBzb3J0KSB7XHJcbiAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc29ydCA9IHNvcnQ7XHJcbiAgICAgIHRoaXMuc2V0Um91dGVQYXJhbXMoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc29ydGRpckNoYW5nZWQoc29ydGRpcjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zb3J0ZGlyICE9PSBzb3J0ZGlyKSB7XHJcbiAgICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICAgIHRoaXMuc29ydGRpciA9IHNvcnRkaXI7XHJcbiAgICAgIHRoaXMuc2V0Um91dGVQYXJhbXMoKTtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VhcmNoQ2hhbmdlZChzZWFyY2hUZXh0OiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvdW50ID0gMDtcclxuICAgIHRoaXMucGFnZSA9IDE7XHJcbiAgICB0aGlzLml0ZW1zID0gbnVsbDtcclxuICAgIHRoaXMuc2VhcmNoID0gc2VhcmNoVGV4dDtcclxuICAgIHRoaXMuc2V0Um91dGVQYXJhbXMoKTtcclxuICAgIHRoaXMubG9hZCgpO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,113 +0,0 @@
1
- import { AuthService } from '@indice/ng-auth';
2
- import { Component, Inject, Input } from '@angular/core';
3
- import { NavigationStart, Router } from '@angular/router';
4
- import { filter } from 'rxjs/operators';
5
- import { APP_LINKS, SHELL_CONFIG } from '../../../tokens';
6
- import { of } from 'rxjs';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/router";
9
- import * as i2 from "@angular/common";
10
- import * as i3 from "../../../directives/click-outside.directive";
11
- import * as i4 from "@indice/ng-auth";
12
- export class ShellHeaderComponent {
13
- constructor(authService, router, config, links) {
14
- this.authService = authService;
15
- this.router = router;
16
- this.config = config;
17
- this.links = links;
18
- // tslint:disable-next-line:no-input-rename
19
- this.sectionLinksPath = 'main';
20
- // tslint:disable-next-line:no-input-rename
21
- this.profileMenuVisible = true;
22
- // tslint:disable-next-line:no-input-rename
23
- this.showUserNameOnHeader = false;
24
- this.border = true;
25
- this.sectionLinks = of([]);
26
- this.mobileMenuExpanded = false;
27
- this.userMenuExpanded = false;
28
- this.routerSub$ = null;
29
- this.userSub$ = null;
30
- this.statusSub$ = null;
31
- this.user = null;
32
- this.avatarName = null;
33
- this.routeSubject = this.router.events.pipe(filter((event) => event instanceof NavigationStart));
34
- }
35
- ngOnDestroy() {
36
- console.log(this.showUserNameOnHeader);
37
- if (this.routerSub$) {
38
- this.routerSub$.unsubscribe();
39
- }
40
- // TODO: check authenticated user here before we start polling server status
41
- if (this.statusSub$) {
42
- this.statusSub$.unsubscribe();
43
- }
44
- if (this.userSub$) {
45
- this.userSub$.unsubscribe();
46
- }
47
- }
48
- ngOnInit() {
49
- this.sectionLinks = this.links[this.sectionLinksPath];
50
- this.routerSub$ = this.routeSubject.subscribe((event) => {
51
- this.mobileMenuExpanded = false;
52
- this.userMenuExpanded = false;
53
- });
54
- this.authService.loadUser().subscribe((user) => {
55
- console.log(user);
56
- this.setCurrentUser(user);
57
- }, error => {
58
- console.error(error);
59
- });
60
- // Detect user changes and display / or not user info accordingly...
61
- this.userSub$ = this.authService.user$.subscribe((user) => {
62
- // console.log('ShellHeaderComponent user subscription');
63
- this.setCurrentUser(user);
64
- });
65
- }
66
- // tslint:disable-next-line:typedef
67
- onClickOutside($event) {
68
- this.userMenuExpanded = false;
69
- }
70
- signin(event) {
71
- if (event) {
72
- event.preventDefault();
73
- }
74
- this.authService.signinRedirect();
75
- }
76
- setCurrentUser(user) {
77
- this.user = user;
78
- if (this.user && this.user.profile) {
79
- this.avatarName = `${this.user.profile.given_name?.charAt(0)}${this.user.profile.family_name?.charAt(0)}`.toUpperCase();
80
- // console.log('load user', this.avatarName);
81
- }
82
- }
83
- }
84
- ShellHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ShellHeaderComponent, deps: [{ token: AuthService }, { token: Router }, { token: SHELL_CONFIG }, { token: APP_LINKS }], target: i0.ɵɵFactoryTarget.Component });
85
- ShellHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: ShellHeaderComponent, selector: "lib-shell-header", inputs: { sectionLinksPath: ["section-links", "sectionLinksPath"], profileMenuVisible: ["profile-menu", "profileMenuVisible"], showUserNameOnHeader: ["show-userName", "showUserNameOnHeader"], border: "border" }, ngImport: i0, template: "<nav>\r\n <div class=\"shell-header-paddings\">\r\n <div [class]=\"border ? 'shell-header-border' : ''\">\r\n <div class=\"shell-header-menu-container\">\r\n <div class=\"shell-header-links-no-grow-container\">\r\n <div>\r\n <a href=\"#\"\r\n [routerLink]=\"['/']\"><img class=\"app-logo\" [src]=\"config.appLogo\" [alt]=\"config.appLogoAlt\" /></a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"shell-header-link-container\">\r\n <ng-container *ngFor=\"let link of sectionLinks | async\">\r\n <a href=\"#\"\r\n [routerLink]=\"[link.path]\"\r\n [attr.target]=\"link.external ? '_blank' : '_self'\"\r\n [routerLinkActive]=\"['nav-link-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\"\r\n class=\"nav-link\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"shell-header-md-visible\">\r\n <div class=\"shell-header-links-no-grow-container\">\r\n\r\n <ng-container *ngFor=\"let link of links.profileActions | async\">\r\n <a class=\"shell-header-menu-rounded-button\"\r\n (clickOutside)=\"onClickOutside($event)\"\r\n [attr.href]=\"link.path\"\r\n [attr.target]=\"link.external ? '_blank' : '_self'\">\r\n <span class=\"sr-only\">{{ link.text }}</span>\r\n <i *ngIf=\"link.icon\"\r\n [class]=\"link.icon\"></i>\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Profile dropdown -->\r\n <div class=\"ml-2 relative\"\r\n (clickOutside)=\"onClickOutside($event)\"\r\n *ngIf=\"profileMenuVisible\">\r\n <div [ngClass]=\"{'shell-header-profile': showUserNameOnHeader}\">\r\n <div *ngIf=\"user && showUserNameOnHeader\"\r\n class=\"shell-header-profile-userName\">\r\n {{ user.profile.name }}\r\n </div>\r\n <button type=\"button\"\r\n *ngIf=\"user\"\r\n (click)=\"userMenuExpanded = !userMenuExpanded\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">Open user menu</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\">{{this.avatarName}}</span>\r\n </span>\r\n </button>\r\n\r\n <button type=\"button\"\r\n *ngIf=\"!user\"\r\n (click)=\"signin(null)\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">sign in</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\"><i class=\"ms-Icon ms-Icon--Signin\"></i></span>\r\n </span>\r\n </button>\r\n\r\n <div *ngIf=\"userMenuExpanded\"\r\n [ngClass]=\"showUserNameOnHeader ? 'shell-header-profile-dropdown-with-username' : 'shell-header-profile-dropdown'\"\r\n role=\"menu\"\r\n aria-orientation=\"vertical\"\r\n aria-labelledby=\"user-menu\">\r\n <!-- <a href=\"#\" class=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\" role=\"menuitem\">\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7</a> -->\r\n <ng-container *ngFor=\"let link of links.profile | async\">\r\n <!-- <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-profile\">\r\n {{ link.text }}\r\n </a> -->\r\n <a [routerLink]=\"link.path\" [routerLinkActive]=\"['nav-link-profile-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\" class=\"nav-link-profile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-menu-button-container\">\r\n <!-- Mobile menu button -->\r\n <button type=\"button\"\r\n (click)=\"mobileMenuExpanded = !mobileMenuExpanded\"\r\n class=\"mobile-menu-button\"\r\n aria-controls=\"mobile-menu\"\r\n [attr.aria-expanded]=\"mobileMenuExpanded\">\r\n <span class=\"sr-only\">Open main menu</span>\r\n <!--Heroicon name: outline/menu Menu open: \"hidden\", Menu closed: \"block\"-->\r\n <svg class=\"block h-6 w-6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M4 6h16M4 12h16M4 18h16\" />\r\n </svg>\r\n <!--Heroicon name: outline/x Menu open: \"block\", Menu closed: \"hidden\"-->\r\n <svg class=\"hidden h-6 w-6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Mobile menu, show/hide based on menu state. -->\r\n <div class=\"mobile-menu-container\"\r\n *ngIf=\"mobileMenuExpanded\"\r\n id=\"mobile-menu\">\r\n <div class=\"mobile-menu-link-container\">\r\n <ng-container *ngFor=\"let link of sectionLinks | async\">\r\n <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n <a *ngIf=\"!link.external\" [routerLink]=\"link.path\" [routerLinkActive]=\"['nav-link-mobile-active']\" [routerLinkActiveOptions]=\"{ exact: link.exact }\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf=\"!user\">\r\n <a href=\"#\" (click)=\"signin($event)\" class=\"nav-link-mobile\">\r\n <i class=\"ms-Icon ms-Icon--Signin mr-2\"></i>\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\r\n </a>\r\n </ng-container>\r\n </div>\r\n <div class=\"mobile-menu-user-info-container\" *ngIf=\"user\">\r\n <div class=\"mobile-menu-user-info-container-inner\">\r\n <div class=\"flex-shrink-0\">\r\n <span class=\"mobile-menu-avatar-container\">\r\n <span class=\"mobile-menu-avatar-name\">{{ this.avatarName }}</span>\r\n </span>\r\n </div>\r\n <div class=\"ml-3\">\r\n <div class=\"mobile-menu-user-name\">{{ user.profile.name }}</div>\r\n <div class=\"mobile-menu-user-email\">{{ user.profile.email }}</div>\r\n </div>\r\n <button class=\"mobile-menu-rounded-button\">\r\n <span class=\"sr-only\">View notifications</span>\r\n <!-- Heroicon name: outline/bell -->\r\n <svg class=\"mobile-menu-rounded-button-icon-style\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"mobile-menu-link-container\">\r\n <ng-container *ngFor=\"let link of links.profile | async\">\r\n <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n <a [routerLink]=\"link.path\"\r\n [routerLinkActive]=\"['nav-link-mobile-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\"\r\n class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n <!-- <a href=\"#\" class=\"block px-3 py-2 rounded-sm text-base font-medium text-gray-400 hover:text-white hover:bg-gray-700\">\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7</a> -->\r\n </div>\r\n </div>\r\n </div>\r\n</nav>\r\n", directives: [{ type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { type: i3.ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "async": i2.AsyncPipe } });
86
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ShellHeaderComponent, decorators: [{
87
- type: Component,
88
- args: [{ selector: 'lib-shell-header', template: "<nav>\r\n <div class=\"shell-header-paddings\">\r\n <div [class]=\"border ? 'shell-header-border' : ''\">\r\n <div class=\"shell-header-menu-container\">\r\n <div class=\"shell-header-links-no-grow-container\">\r\n <div>\r\n <a href=\"#\"\r\n [routerLink]=\"['/']\"><img class=\"app-logo\" [src]=\"config.appLogo\" [alt]=\"config.appLogoAlt\" /></a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"shell-header-link-container\">\r\n <ng-container *ngFor=\"let link of sectionLinks | async\">\r\n <a href=\"#\"\r\n [routerLink]=\"[link.path]\"\r\n [attr.target]=\"link.external ? '_blank' : '_self'\"\r\n [routerLinkActive]=\"['nav-link-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\"\r\n class=\"nav-link\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"shell-header-md-visible\">\r\n <div class=\"shell-header-links-no-grow-container\">\r\n\r\n <ng-container *ngFor=\"let link of links.profileActions | async\">\r\n <a class=\"shell-header-menu-rounded-button\"\r\n (clickOutside)=\"onClickOutside($event)\"\r\n [attr.href]=\"link.path\"\r\n [attr.target]=\"link.external ? '_blank' : '_self'\">\r\n <span class=\"sr-only\">{{ link.text }}</span>\r\n <i *ngIf=\"link.icon\"\r\n [class]=\"link.icon\"></i>\r\n </a>\r\n </ng-container>\r\n\r\n <!-- Profile dropdown -->\r\n <div class=\"ml-2 relative\"\r\n (clickOutside)=\"onClickOutside($event)\"\r\n *ngIf=\"profileMenuVisible\">\r\n <div [ngClass]=\"{'shell-header-profile': showUserNameOnHeader}\">\r\n <div *ngIf=\"user && showUserNameOnHeader\"\r\n class=\"shell-header-profile-userName\">\r\n {{ user.profile.name }}\r\n </div>\r\n <button type=\"button\"\r\n *ngIf=\"user\"\r\n (click)=\"userMenuExpanded = !userMenuExpanded\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">Open user menu</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\">{{this.avatarName}}</span>\r\n </span>\r\n </button>\r\n\r\n <button type=\"button\"\r\n *ngIf=\"!user\"\r\n (click)=\"signin(null)\"\r\n class=\"shell-header-profile-dropdown-button\"\r\n id=\"user-menu\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\">\r\n <span class=\"sr-only\">sign in</span>\r\n <span class=\"avatar-container\">\r\n <span class=\"avatar-text\"><i class=\"ms-Icon ms-Icon--Signin\"></i></span>\r\n </span>\r\n </button>\r\n\r\n <div *ngIf=\"userMenuExpanded\"\r\n [ngClass]=\"showUserNameOnHeader ? 'shell-header-profile-dropdown-with-username' : 'shell-header-profile-dropdown'\"\r\n role=\"menu\"\r\n aria-orientation=\"vertical\"\r\n aria-labelledby=\"user-menu\">\r\n <!-- <a href=\"#\" class=\"block px-4 py-2 text-sm text-gray-700 hover:bg-gray-100\" role=\"menuitem\">\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7</a> -->\r\n <ng-container *ngFor=\"let link of links.profile | async\">\r\n <!-- <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-profile\">\r\n {{ link.text }}\r\n </a> -->\r\n <a [routerLink]=\"link.path\" [routerLinkActive]=\"['nav-link-profile-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\" class=\"nav-link-profile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mobile-menu-button-container\">\r\n <!-- Mobile menu button -->\r\n <button type=\"button\"\r\n (click)=\"mobileMenuExpanded = !mobileMenuExpanded\"\r\n class=\"mobile-menu-button\"\r\n aria-controls=\"mobile-menu\"\r\n [attr.aria-expanded]=\"mobileMenuExpanded\">\r\n <span class=\"sr-only\">Open main menu</span>\r\n <!--Heroicon name: outline/menu Menu open: \"hidden\", Menu closed: \"block\"-->\r\n <svg class=\"block h-6 w-6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M4 6h16M4 12h16M4 18h16\" />\r\n </svg>\r\n <!--Heroicon name: outline/x Menu open: \"block\", Menu closed: \"hidden\"-->\r\n <svg class=\"hidden h-6 w-6\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M6 18L18 6M6 6l12 12\" />\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Mobile menu, show/hide based on menu state. -->\r\n <div class=\"mobile-menu-container\"\r\n *ngIf=\"mobileMenuExpanded\"\r\n id=\"mobile-menu\">\r\n <div class=\"mobile-menu-link-container\">\r\n <ng-container *ngFor=\"let link of sectionLinks | async\">\r\n <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n <a *ngIf=\"!link.external\" [routerLink]=\"link.path\" [routerLinkActive]=\"['nav-link-mobile-active']\" [routerLinkActiveOptions]=\"{ exact: link.exact }\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf=\"!user\">\r\n <a href=\"#\" (click)=\"signin($event)\" class=\"nav-link-mobile\">\r\n <i class=\"ms-Icon ms-Icon--Signin mr-2\"></i>\u03A3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7\r\n </a>\r\n </ng-container>\r\n </div>\r\n <div class=\"mobile-menu-user-info-container\" *ngIf=\"user\">\r\n <div class=\"mobile-menu-user-info-container-inner\">\r\n <div class=\"flex-shrink-0\">\r\n <span class=\"mobile-menu-avatar-container\">\r\n <span class=\"mobile-menu-avatar-name\">{{ this.avatarName }}</span>\r\n </span>\r\n </div>\r\n <div class=\"ml-3\">\r\n <div class=\"mobile-menu-user-name\">{{ user.profile.name }}</div>\r\n <div class=\"mobile-menu-user-email\">{{ user.profile.email }}</div>\r\n </div>\r\n <button class=\"mobile-menu-rounded-button\">\r\n <span class=\"sr-only\">View notifications</span>\r\n <!-- Heroicon name: outline/bell -->\r\n <svg class=\"mobile-menu-rounded-button-icon-style\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n stroke=\"currentColor\"\r\n aria-hidden=\"true\">\r\n <path stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n stroke-width=\"2\"\r\n d=\"M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9\" />\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"mobile-menu-link-container\">\r\n <ng-container *ngFor=\"let link of links.profile | async\">\r\n <a *ngIf=\"link.external\" [attr.href]=\"link.path\" [attr.target]=\"'_blank'\" class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n <a [routerLink]=\"link.path\"\r\n [routerLinkActive]=\"['nav-link-mobile-active']\"\r\n [routerLinkActiveOptions]=\"{ exact: link.exact }\"\r\n class=\"nav-link-mobile\">\r\n {{ link.text }}\r\n </a>\r\n </ng-container>\r\n <!-- <a href=\"#\" class=\"block px-3 py-2 rounded-sm text-base font-medium text-gray-400 hover:text-white hover:bg-gray-700\">\u0391\u03C0\u03BF\u03C3\u03CD\u03BD\u03B4\u03B5\u03C3\u03B7</a> -->\r\n </div>\r\n </div>\r\n </div>\r\n</nav>\r\n" }]
89
- }], ctorParameters: function () { return [{ type: i4.AuthService, decorators: [{
90
- type: Inject,
91
- args: [AuthService]
92
- }] }, { type: i1.Router, decorators: [{
93
- type: Inject,
94
- args: [Router]
95
- }] }, { type: undefined, decorators: [{
96
- type: Inject,
97
- args: [SHELL_CONFIG]
98
- }] }, { type: undefined, decorators: [{
99
- type: Inject,
100
- args: [APP_LINKS]
101
- }] }]; }, propDecorators: { sectionLinksPath: [{
102
- type: Input,
103
- args: ['section-links']
104
- }], profileMenuVisible: [{
105
- type: Input,
106
- args: ['profile-menu']
107
- }], showUserNameOnHeader: [{
108
- type: Input,
109
- args: ['show-userName']
110
- }], border: [{
111
- type: Input
112
- }] } });
113
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9sYXlvdXRzL3NoZWxsL3NoZWxsLWhlYWRlci9zaGVsbC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2xheW91dHMvc2hlbGwvc2hlbGwtaGVhZGVyL3NoZWxsLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RSxPQUFPLEVBQVMsZUFBZSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBeUQsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7QUFRakYsTUFBTSxPQUFPLG9CQUFvQjtJQWtCL0IsWUFDaUMsV0FBd0IsRUFDN0IsTUFBYyxFQUNYLE1BQVcsRUFDZCxLQUFVO1FBSEwsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDN0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNYLFdBQU0sR0FBTixNQUFNLENBQUs7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBckJ0QywyQ0FBMkM7UUFDbkIscUJBQWdCLEdBQUcsTUFBTSxDQUFDO1FBQ2xELDJDQUEyQztRQUNwQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDakQsMkNBQTJDO1FBQ25CLHlCQUFvQixH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LENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEgsNkNBQTZDO1NBQzlDO0lBQ0gsQ0FBQzs7aUhBaEZVLG9CQUFvQixrQkFtQnJCLFdBQVcsYUFDWCxNQUFNLGFBQ04sWUFBWSxhQUNaLFNBQVM7cUdBdEJSLG9CQUFvQiw0UUNmakMsczRTQW9NQTsyRkRyTGEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUVFLGtCQUFrQjs7MEJBc0J6QixNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixNQUFNOzJCQUFDLE1BQU07OzBCQUNiLE1BQU07MkJBQUMsWUFBWTs7MEJBQ25CLE1BQU07MkJBQUMsU0FBUzs0Q0FwQkssZ0JBQWdCO3NCQUF2QyxLQUFLO3VCQUFDLGVBQWU7Z0JBRUMsa0JBQWtCO3NCQUF4QyxLQUFLO3VCQUFDLGNBQWM7Z0JBRUcsb0JBQW9CO3NCQUEzQyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ2IsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICdAaW5kaWNlL25nLWF1dGgnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBJbmplY3QsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICdvaWRjLWNsaWVudCc7XHJcbmltcG9ydCB7IEV2ZW50LCBOYXZpZ2F0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTmF2TGluayB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcclxuaW1wb3J0IHsgQVBQX0xJTktTLCBTSEVMTF9DT05GSUcgfSBmcm9tICcuLi8uLi8uLi90b2tlbnMnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGlzT2JzZXJ2YWJsZSwgb2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXHJcbiAgc2VsZWN0b3I6ICdsaWItc2hlbGwtaGVhZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2hlbGwtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNoZWxsSGVhZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3NlY3Rpb24tbGlua3MnKSBzZWN0aW9uTGlua3NQYXRoID0gJ21haW4nO1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcclxuICBASW5wdXQoJ3Byb2ZpbGUtbWVudScpIHByb2ZpbGVNZW51VmlzaWJsZSA9IHRydWU7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxyXG4gIEBJbnB1dCgnc2hvdy11c2VyTmFtZScpIHNob3dVc2VyTmFtZU9uSGVhZGVyOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgYm9yZGVyID0gdHJ1ZTtcclxuICBwdWJsaWMgc2VjdGlvbkxpbmtzOiBPYnNlcnZhYmxlPE5hdkxpbmtbXT4gPSBvZihbXSk7XHJcbiAgcHVibGljIG1vYmlsZU1lbnVFeHBhbmRlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyB1c2VyTWVudUV4cGFuZGVkID0gZmFsc2U7XHJcbiAgcHJvdGVjdGVkIHJvdXRlU3ViamVjdDogT2JzZXJ2YWJsZTxFdmVudD47XHJcbiAgcHJvdGVjdGVkIHJvdXRlclN1YiQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHByb3RlY3RlZCB1c2VyU3ViJDogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIHN0YXR1c1N1YiQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyB1c2VyOiBVc2VyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIGF2YXRhck5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoQXV0aFNlcnZpY2UpIHByb3RlY3RlZCBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFJvdXRlcikgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxyXG4gICAgQEluamVjdChTSEVMTF9DT05GSUcpIHB1YmxpYyBjb25maWc6IGFueSxcclxuICAgIEBJbmplY3QoQVBQX0xJTktTKSBwdWJsaWMgbGlua3M6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5yb3V0ZVN1YmplY3QgPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShmaWx0ZXIoKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLnNob3dVc2VyTmFtZU9uSGVhZGVyKTtcclxuXHJcbiAgICBpZiAodGhpcy5yb3V0ZXJTdWIkKSB7XHJcbiAgICAgIHRoaXMucm91dGVyU3ViJC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogY2hlY2sgYXV0aGVudGljYXRlZCB1c2VyIGhlcmUgYmVmb3JlIHdlIHN0YXJ0IHBvbGxpbmcgc2VydmVyIHN0YXR1c1xyXG4gICAgaWYgKHRoaXMuc3RhdHVzU3ViJCkge1xyXG4gICAgICB0aGlzLnN0YXR1c1N1YiQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnVzZXJTdWIkKSB7XHJcbiAgICAgIHRoaXMudXNlclN1YiQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZWN0aW9uTGlua3MgPSB0aGlzLmxpbmtzW3RoaXMuc2VjdGlvbkxpbmtzUGF0aF0gYXMgT2JzZXJ2YWJsZTxOYXZMaW5rW10+O1xyXG4gICAgdGhpcy5yb3V0ZXJTdWIkID0gdGhpcy5yb3V0ZVN1YmplY3Quc3Vic2NyaWJlKChldmVudCkgPT4ge1xyXG4gICAgICB0aGlzLm1vYmlsZU1lbnVFeHBhbmRlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVzZXJNZW51RXhwYW5kZWQgPSBmYWxzZTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5sb2FkVXNlcigpLnN1YnNjcmliZSgodXNlcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZyh1c2VyKTtcclxuICAgICAgdGhpcy5zZXRDdXJyZW50VXNlcih1c2VyKTtcclxuICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICApO1xyXG4gICAgLy8gRGV0ZWN0IHVzZXIgY2hhbmdlcyBhbmQgZGlzcGxheSAvIG9yIG5vdCB1c2VyIGluZm8gYWNjb3JkaW5nbHkuLi5cclxuICAgIHRoaXMudXNlclN1YiQgPSB0aGlzLmF1dGhTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodXNlcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdTaGVsbEhlYWRlckNvbXBvbmVudCB1c2VyIHN1YnNjcmlwdGlvbicpO1xyXG4gICAgICB0aGlzLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHlwZWRlZlxyXG4gIHB1YmxpYyBvbkNsaWNrT3V0c2lkZSgkZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy51c2VyTWVudUV4cGFuZGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2lnbmluKGV2ZW50OiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYXV0aFNlcnZpY2Uuc2lnbmluUmVkaXJlY3QoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Q3VycmVudFVzZXIodXNlcjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXIgPSB1c2VyO1xyXG4gICAgaWYgKHRoaXMudXNlciAmJiB0aGlzLnVzZXIucHJvZmlsZSkge1xyXG4gICAgICB0aGlzLmF2YXRhck5hbWUgPSBgJHt0aGlzLnVzZXIucHJvZmlsZS5naXZlbl9uYW1lPy5jaGFyQXQoMCl9JHt0aGlzLnVzZXIucHJvZmlsZS5mYW1pbHlfbmFtZT8uY2hhckF0KDApfWAudG9VcHBlckNhc2UoKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ2xvYWQgdXNlcicsIHRoaXMuYXZhdGFyTmFtZSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxuYXY+XHJcbiAgPGRpdiBjbGFzcz1cInNoZWxsLWhlYWRlci1wYWRkaW5nc1wiPlxyXG4gICAgPGRpdiBbY2xhc3NdPVwiYm9yZGVyID8gJ3NoZWxsLWhlYWRlci1ib3JkZXInIDogJydcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNoZWxsLWhlYWRlci1tZW51LWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsbC1oZWFkZXItbGlua3Mtbm8tZ3Jvdy1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCJcclxuICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvJ11cIj48aW1nIGNsYXNzPVwiYXBwLWxvZ29cIiBbc3JjXT1cImNvbmZpZy5hcHBMb2dvXCIgW2FsdF09XCJjb25maWcuYXBwTG9nb0FsdFwiIC8+PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsbC1oZWFkZXItbGluay1jb250YWluZXJcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxpbmsgb2Ygc2VjdGlvbkxpbmtzIHwgYXN5bmNcIj5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIlxyXG4gICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJbbGluay5wYXRoXVwiXHJcbiAgICAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJsaW5rLmV4dGVybmFsID8gJ19ibGFuaycgOiAnX3NlbGYnXCJcclxuICAgICAgICAgICAgICAgW3JvdXRlckxpbmtBY3RpdmVdPVwiWyduYXYtbGluay1hY3RpdmUnXVwiXHJcbiAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7IGV4YWN0OiBsaW5rLmV4YWN0IH1cIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cIm5hdi1saW5rXCI+XHJcbiAgICAgICAgICAgICAge3sgbGluay50ZXh0IH19XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hlbGwtaGVhZGVyLW1kLXZpc2libGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGVsbC1oZWFkZXItbGlua3Mtbm8tZ3Jvdy1jb250YWluZXJcIj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxpbmsgb2YgbGlua3MucHJvZmlsZUFjdGlvbnMgfCBhc3luY1wiPlxyXG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwic2hlbGwtaGVhZGVyLW1lbnUtcm91bmRlZC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgIChjbGlja091dHNpZGUpPVwib25DbGlja091dHNpZGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgW2F0dHIuaHJlZl09XCJsaW5rLnBhdGhcIlxyXG4gICAgICAgICAgICAgICAgIFthdHRyLnRhcmdldF09XCJsaW5rLmV4dGVybmFsID8gJ19ibGFuaycgOiAnX3NlbGYnXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj57eyBsaW5rLnRleHQgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8aSAqbmdJZj1cImxpbmsuaWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwibGluay5pY29uXCI+PC9pPlxyXG4gICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFByb2ZpbGUgZHJvcGRvd24gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC0yIHJlbGF0aXZlXCJcclxuICAgICAgICAgICAgICAgICAoY2xpY2tPdXRzaWRlKT1cIm9uQ2xpY2tPdXRzaWRlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZmlsZU1lbnVWaXNpYmxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3NoZWxsLWhlYWRlci1wcm9maWxlJzogc2hvd1VzZXJOYW1lT25IZWFkZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXNlciAmJiBzaG93VXNlck5hbWVPbkhlYWRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hlbGwtaGVhZGVyLXByb2ZpbGUtdXNlck5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAge3sgdXNlci5wcm9maWxlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1c2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZXJNZW51RXhwYW5kZWQgPSAhdXNlck1lbnVFeHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2hlbGwtaGVhZGVyLXByb2ZpbGUtZHJvcGRvd24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ1c2VyLW1lbnVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5PcGVuIHVzZXIgbWVudTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhdmF0YXItdGV4dFwiPnt7dGhpcy5hdmF0YXJOYW1lfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXVzZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2lnbmluKG51bGwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGVsbC1oZWFkZXItcHJvZmlsZS1kcm9wZG93bi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cInVzZXItbWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPnNpZ24gaW48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXZhdGFyLXRleHRcIj48aSBjbGFzcz1cIm1zLUljb24gbXMtSWNvbi0tU2lnbmluXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInVzZXJNZW51RXhwYW5kZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJzaG93VXNlck5hbWVPbkhlYWRlciA/ICdzaGVsbC1oZWFkZXItcHJvZmlsZS1kcm9wZG93bi13aXRoLXVzZXJuYW1lJyA6ICdzaGVsbC1oZWFkZXItcHJvZmlsZS1kcm9wZG93bidcIlxyXG4gICAgICAgICAgICAgICAgICAgICByb2xlPVwibWVudVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtb3JpZW50YXRpb249XCJ2ZXJ0aWNhbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT1cInVzZXItbWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJibG9jayBweC00IHB5LTIgdGV4dC1zbSB0ZXh0LWdyYXktNzAwIGhvdmVyOmJnLWdyYXktMTAwXCIgcm9sZT1cIm1lbnVpdGVtXCI+zpHPgM6/z4PPjc69zrTOtc+Dzrc8L2E+IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIGxpbmtzLnByb2ZpbGUgfCBhc3luY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGEgKm5nSWY9XCJsaW5rLmV4dGVybmFsXCIgW2F0dHIuaHJlZl09XCJsaW5rLnBhdGhcIiBbYXR0ci50YXJnZXRdPVwiJ19ibGFuaydcIiBjbGFzcz1cIm5hdi1saW5rLXByb2ZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IGxpbmsudGV4dCB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT4gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgW3JvdXRlckxpbmtdPVwibGluay5wYXRoXCIgW3JvdXRlckxpbmtBY3RpdmVdPVwiWyduYXYtbGluay1wcm9maWxlLWFjdGl2ZSddXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZU9wdGlvbnNdPVwieyBleGFjdDogbGluay5leGFjdCB9XCIgY2xhc3M9XCJuYXYtbGluay1wcm9maWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBsaW5rLnRleHQgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgPCEtLSBNb2JpbGUgbWVudSBidXR0b24gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW9iaWxlTWVudUV4cGFuZGVkID0gIW1vYmlsZU1lbnVFeHBhbmRlZFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibW9iaWxlLW1lbnUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgYXJpYS1jb250cm9scz1cIm1vYmlsZS1tZW51XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtb2JpbGVNZW51RXhwYW5kZWRcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+T3BlbiBtYWluIG1lbnU8L3NwYW4+XHJcbiAgICAgICAgICAgIDwhLS1IZXJvaWNvbiBuYW1lOiBvdXRsaW5lL21lbnUgIE1lbnUgb3BlbjogXCJoaWRkZW5cIiwgTWVudSBjbG9zZWQ6IFwiYmxvY2tcIi0tPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYmxvY2sgaC02IHctNlwiXHJcbiAgICAgICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNNCA2aDE2TTQgMTJoMTZNNCAxOGgxNlwiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8IS0tSGVyb2ljb24gbmFtZTogb3V0bGluZS94IE1lbnUgb3BlbjogXCJibG9ja1wiLCBNZW51IGNsb3NlZDogXCJoaWRkZW5cIi0tPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwiaGlkZGVuIGgtNiB3LTZcIlxyXG4gICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcclxuICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcclxuICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTYgMThMMTggNk02IDZsMTIgMTJcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8IS0tIE1vYmlsZSBtZW51LCBzaG93L2hpZGUgYmFzZWQgb24gbWVudSBzdGF0ZS4gLS0+XHJcbiAgPGRpdiBjbGFzcz1cIm1vYmlsZS1tZW51LWNvbnRhaW5lclwiXHJcbiAgICAgICAqbmdJZj1cIm1vYmlsZU1lbnVFeHBhbmRlZFwiXHJcbiAgICAgICBpZD1cIm1vYmlsZS1tZW51XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtbGluay1jb250YWluZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGluayBvZiBzZWN0aW9uTGlua3MgfCBhc3luY1wiPlxyXG4gICAgICAgIDxhICpuZ0lmPVwibGluay5leHRlcm5hbFwiICBbYXR0ci5ocmVmXT1cImxpbmsucGF0aFwiIFthdHRyLnRhcmdldF09XCInX2JsYW5rJ1wiIGNsYXNzPVwibmF2LWxpbmstbW9iaWxlXCI+XHJcbiAgICAgICAgICB7eyBsaW5rLnRleHQgfX1cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPGEgKm5nSWY9XCIhbGluay5leHRlcm5hbFwiICBbcm91dGVyTGlua109XCJsaW5rLnBhdGhcIiBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ25hdi1saW5rLW1vYmlsZS1hY3RpdmUnXVwiIFtyb3V0ZXJMaW5rQWN0aXZlT3B0aW9uc109XCJ7IGV4YWN0OiBsaW5rLmV4YWN0IH1cIiBjbGFzcz1cIm5hdi1saW5rLW1vYmlsZVwiPlxyXG4gICAgICAgICAge3sgbGluay50ZXh0IH19XHJcbiAgICAgICAgICA8L2E+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXVzZXJcIj5cclxuICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJzaWduaW4oJGV2ZW50KVwiIGNsYXNzPVwibmF2LWxpbmstbW9iaWxlXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1zLUljb24gbXMtSWNvbi0tU2lnbmluIG1yLTJcIj48L2k+zqPPjc69zrTOtc+DzrdcclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtdXNlci1pbmZvLWNvbnRhaW5lclwiICpuZ0lmPVwidXNlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtdXNlci1pbmZvLWNvbnRhaW5lci1pbm5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LXNocmluay0wXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vYmlsZS1tZW51LWF2YXRhci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2JpbGUtbWVudS1hdmF0YXItbmFtZVwiPnt7IHRoaXMuYXZhdGFyTmFtZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1vYmlsZS1tZW51LXVzZXItbmFtZVwiPnt7IHVzZXIucHJvZmlsZS5uYW1lIH19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtdXNlci1lbWFpbFwiPnt7IHVzZXIucHJvZmlsZS5lbWFpbCB9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJtb2JpbGUtbWVudS1yb3VuZGVkLWJ1dHRvblwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+VmlldyBub3RpZmljYXRpb25zPC9zcGFuPlxyXG4gICAgICAgICAgPCEtLSBIZXJvaWNvbiBuYW1lOiBvdXRsaW5lL2JlbGwgLS0+XHJcbiAgICAgICAgICA8c3ZnIGNsYXNzPVwibW9iaWxlLW1lbnUtcm91bmRlZC1idXR0b24taWNvbi1zdHlsZVwiXHJcbiAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjQgMjRcIlxyXG4gICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIlxyXG4gICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXHJcbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTUgMTdoNWwtMS40MDUtMS40MDVBMi4wMzIgMi4wMzIgMCAwMTE4IDE0LjE1OFYxMWE2LjAwMiA2LjAwMiAwIDAwLTQtNS42NTlWNWEyIDIgMCAxMC00IDB2LjM0MUM3LjY3IDYuMTY1IDYgOC4zODggNiAxMXYzLjE1OWMwIC41MzgtLjIxNCAxLjA1NS0uNTk1IDEuNDM2TDQgMTdoNW02IDB2MWEzIDMgMCAxMS02IDB2LTFtNiAwSDlcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLW1lbnUtbGluay1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIGxpbmtzLnByb2ZpbGUgfCBhc3luY1wiPlxyXG4gICAgICAgICAgPGEgKm5nSWY9XCJsaW5rLmV4dGVybmFsXCIgW2F0dHIuaHJlZl09XCJsaW5rLnBhdGhcIiBbYXR0ci50YXJnZXRdPVwiJ19ibGFuaydcIiBjbGFzcz1cIm5hdi1saW5rLW1vYmlsZVwiPlxyXG4gICAgICAgICAgICB7eyBsaW5rLnRleHQgfX1cclxuICAgICAgICAgIDwvYT5cclxuICAgICAgICAgIDxhIFtyb3V0ZXJMaW5rXT1cImxpbmsucGF0aFwiXHJcbiAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZV09XCJbJ25hdi1saW5rLW1vYmlsZS1hY3RpdmUnXVwiXHJcbiAgICAgICAgICAgICBbcm91dGVyTGlua0FjdGl2ZU9wdGlvbnNdPVwieyBleGFjdDogbGluay5leGFjdCB9XCJcclxuICAgICAgICAgICAgIGNsYXNzPVwibmF2LWxpbmstbW9iaWxlXCI+XHJcbiAgICAgICAgICAgIHt7IGxpbmsudGV4dCB9fVxyXG4gICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwhLS0gPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJsb2NrIHB4LTMgcHktMiByb3VuZGVkLXNtIHRleHQtYmFzZSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNDAwIGhvdmVyOnRleHQtd2hpdGUgaG92ZXI6YmctZ3JheS03MDBcIj7Okc+Azr/Pg8+Nzr3OtM61z4POtzwvYT4gLS0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvbmF2PlxyXG4iXX0=
@@ -1,101 +0,0 @@
1
- import { SHELL_CONFIG } from './../../../tokens';
2
- import { DefaultShellConfig } from './../../../types';
3
- import { Component, Inject, ViewChildren } from '@angular/core';
4
- import { DOCUMENT } from '@angular/common';
5
- import { ActivationStart } from '@angular/router';
6
- import { filter } from 'rxjs/operators';
7
- import { DynamicComponentHostDirective } from '../../../directives/dynamic-component-host.directive';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/router";
10
- import * as i2 from "@angular/common";
11
- import * as i3 from "../../../services/component-loader/component-loader.factory";
12
- import * as i4 from "../shell-header/shell-header.component";
13
- import * as i5 from "../shell-footer/shell-footer.component";
14
- import * as i6 from "../../../controls/side-pane/side-pane.component";
15
- import * as i7 from "../../../controls/toaster/toaster-container.component";
16
- import * as i8 from "../../../directives/dynamic-component-host.directive";
17
- export class ShellLayoutComponent {
18
- constructor(document, router, location, config, componentLoaderFactory) {
19
- this.document = document;
20
- this.router = router;
21
- this.location = location;
22
- this.config = config;
23
- this.componentLoaderFactory = componentLoaderFactory;
24
- this.dynamicComponentHosts = null;
25
- this.showRightPaneSM = false;
26
- this.routerSub$ = null;
27
- this.activeConfig = new DefaultShellConfig();
28
- this.loaded = false;
29
- if (!config) {
30
- config = new DefaultShellConfig();
31
- }
32
- this.activeConfig = config;
33
- }
34
- ngAfterViewChecked() {
35
- setTimeout(() => { this.loaded = true; }, 200);
36
- }
37
- ngOnInit() {
38
- this.routerSub$ = this.router.events.pipe(filter((event) => event instanceof ActivationStart)).subscribe((e) => {
39
- // console.log('ShellLayoutComponent ActivationStart', e);
40
- if (e?.snapshot) {
41
- // console.log('ShellLayoutComponent ActivationStart snapshot', (e as ActivationStart)?.snapshot);
42
- if (e?.snapshot?.data) {
43
- // console.log('ShellLayoutComponent ActivationStart snapshot data', (e as ActivationStart)?.snapshot.data);
44
- if (e?.snapshot?.data.shell) {
45
- // console.log('ShellLayoutComponent ActivationStart snapshot data shell params',
46
- // (e as ActivationStart)?.snapshot.data.shell);
47
- this.activeConfig = e?.snapshot.data.shell;
48
- // console.log('ShellLayoutComponent activeConfig from route: ', this.activeConfig);
49
- if (this.activeConfig.customHeaderComponent) {
50
- this.initCustomComponents();
51
- }
52
- }
53
- else {
54
- this.activeConfig = this.config ? this.config : new DefaultShellConfig();
55
- // console.log('ShellLayoutComponent default activeConfig: ', this.activeConfig);
56
- }
57
- }
58
- }
59
- });
60
- }
61
- ngAfterViewInit() {
62
- this.initCustomComponents();
63
- }
64
- initCustomComponents() {
65
- if (this.dynamicComponentHosts && this.dynamicComponentHosts.length > 0) {
66
- this.loadCustomComponent(this.dynamicComponentHosts.find((_) => _.hostName === 'Header'));
67
- // since you're not using it...
68
- // this.loadCustomComponent(this.dynamicComponentHosts.find(_ => _.hostName === 'Footer'));
69
- }
70
- }
71
- ngOnDestroy() {
72
- if (this.routerSub$) {
73
- this.routerSub$.unsubscribe();
74
- }
75
- }
76
- loadCustomComponent(host) {
77
- if (host) {
78
- const viewContainerRef = host.viewContainerRef;
79
- if (viewContainerRef && this.activeConfig.customHeaderComponent) {
80
- const clf = this.componentLoaderFactory.createLoader(viewContainerRef);
81
- const headerCompRef = clf.attach(this.activeConfig.customHeaderComponent).to(viewContainerRef.element).show();
82
- }
83
- }
84
- }
85
- }
86
- ShellLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ShellLayoutComponent, deps: [{ token: DOCUMENT }, { token: i1.Router }, { token: i2.Location }, { token: SHELL_CONFIG }, { token: i3.ComponentLoaderFactory }], target: i0.ɵɵFactoryTarget.Component });
87
- ShellLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.0", type: ShellLayoutComponent, selector: "lib-shell-layout", viewQueries: [{ propertyName: "dynamicComponentHosts", predicate: DynamicComponentHostDirective, descendants: true }], ngImport: i0, template: "<div *ngIf=\"loaded\" [style.display]=\"!loaded ? 'none':'block'\" class=\"shell-container active-side-pane\">\r\n <div class=\"shell-header-container\" *ngIf=\"activeConfig.showHeader\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-header-container-inner-fluid' : 'shell-header-container-inner'\">\r\n\r\n <ng-container *ngIf=\"activeConfig.customHeaderComponent\">\r\n <div appDynamicComponentHost =\"Header\"></div>\r\n </ng-container>\r\n\r\n <lib-shell-header *ngIf=\"!activeConfig.customHeaderComponent\" [show-userName]=\"activeConfig.showUserNameOnHeader\"></lib-shell-header>\r\n </div>\r\n </div>\r\n\r\n <main [class]=\"activeConfig.showHeader ? 'shell-content-container' : 'shell-content-container-no-header'\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-content-container-inner-fluid' : 'shell-content-container-inner'\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n </main>\r\n\r\n <div class=\"shell-footer-container\" *ngIf=\"activeConfig.showFooter\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-footer-container-inner-fluid' : 'shell-footer-container-inner'\">\r\n <ng-container *ngIf=\"activeConfig.customFooterComponent\">\r\n <div appDynamicComponentHost hostName=\"Footer\"></div>\r\n </ng-container>\r\n <lib-shell-footer *ngIf=\"!activeConfig.customFooterComponent\"></lib-shell-footer>\r\n </div>\r\n </div>\r\n\r\n <lib-side-pane #rightPane>\r\n <router-outlet name=\"rightpane\" (activate)=\"rightPane.onSidePaneActivated($event)\" (deactivate)=\"rightPane.onSidePaneDeactivated($event)\"></router-outlet>\r\n </lib-side-pane>\r\n\r\n <lib-toaster-container></lib-toaster-container>\r\n\r\n</div>\r\n", components: [{ type: i4.ShellHeaderComponent, selector: "lib-shell-header", inputs: ["section-links", "profile-menu", "show-userName", "border"] }, { type: i5.ShellFooterComponent, selector: "lib-shell-footer" }, { type: i6.SidePaneComponent, selector: "lib-side-pane", inputs: ["visible"], outputs: ["onComplete"] }, { type: i7.ToasterContainerComponent, selector: "lib-toaster-container" }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.DynamicComponentHostDirective, selector: "[appDynamicComponentHost]", inputs: ["hostName"] }, { type: i1.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
88
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.0", ngImport: i0, type: ShellLayoutComponent, decorators: [{
89
- type: Component,
90
- args: [{ selector: 'lib-shell-layout', template: "<div *ngIf=\"loaded\" [style.display]=\"!loaded ? 'none':'block'\" class=\"shell-container active-side-pane\">\r\n <div class=\"shell-header-container\" *ngIf=\"activeConfig.showHeader\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-header-container-inner-fluid' : 'shell-header-container-inner'\">\r\n\r\n <ng-container *ngIf=\"activeConfig.customHeaderComponent\">\r\n <div appDynamicComponentHost =\"Header\"></div>\r\n </ng-container>\r\n\r\n <lib-shell-header *ngIf=\"!activeConfig.customHeaderComponent\" [show-userName]=\"activeConfig.showUserNameOnHeader\"></lib-shell-header>\r\n </div>\r\n </div>\r\n\r\n <main [class]=\"activeConfig.showHeader ? 'shell-content-container' : 'shell-content-container-no-header'\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-content-container-inner-fluid' : 'shell-content-container-inner'\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n </main>\r\n\r\n <div class=\"shell-footer-container\" *ngIf=\"activeConfig.showFooter\">\r\n <div [class]=\"activeConfig.fluid ? 'shell-footer-container-inner-fluid' : 'shell-footer-container-inner'\">\r\n <ng-container *ngIf=\"activeConfig.customFooterComponent\">\r\n <div appDynamicComponentHost hostName=\"Footer\"></div>\r\n </ng-container>\r\n <lib-shell-footer *ngIf=\"!activeConfig.customFooterComponent\"></lib-shell-footer>\r\n </div>\r\n </div>\r\n\r\n <lib-side-pane #rightPane>\r\n <router-outlet name=\"rightpane\" (activate)=\"rightPane.onSidePaneActivated($event)\" (deactivate)=\"rightPane.onSidePaneDeactivated($event)\"></router-outlet>\r\n </lib-side-pane>\r\n\r\n <lib-toaster-container></lib-toaster-container>\r\n\r\n</div>\r\n" }]
91
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
92
- type: Inject,
93
- args: [DOCUMENT]
94
- }] }, { type: i1.Router }, { type: i2.Location }, { type: undefined, decorators: [{
95
- type: Inject,
96
- args: [SHELL_CONFIG]
97
- }] }, { type: i3.ComponentLoaderFactory }]; }, propDecorators: { dynamicComponentHosts: [{
98
- type: ViewChildren,
99
- args: [DynamicComponentHostDirective]
100
- }] } });
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hlbGwtbGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9sYXlvdXRzL3NoZWxsL3NoZWxsLWxheW91dC9zaGVsbC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2xheW91dHMvc2hlbGwvc2hlbGwtbGF5b3V0L3NoZWxsLWxheW91dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFnQixrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BFLE9BQU8sRUFBaUIsU0FBUyxFQUFxQixNQUFNLEVBQUUsWUFBWSxFQUErQixNQUFNLGVBQWUsQ0FBQztBQUMvSCxPQUFPLEVBQUUsUUFBUSxFQUFZLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzREFBc0QsQ0FBQzs7Ozs7Ozs7OztBQVFyRyxNQUFNLE9BQU8sb0JBQW9CO0lBTy9CLFlBQzRCLFFBQWEsRUFDL0IsTUFBYyxFQUNkLFFBQWtCLEVBQ0ksTUFBMkIsRUFDakQsc0JBQThDO1FBSjVCLGFBQVEsR0FBUixRQUFRLENBQUs7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDSSxXQUFNLEdBQU4sTUFBTSxDQUFxQjtRQUNqRCwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBVnhELDBCQUFxQixHQUFvRCxJQUFJLENBQUM7UUFDdkUsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDdkIsZUFBVSxHQUF3QixJQUFJLENBQUM7UUFDeEMsaUJBQVksR0FBaUIsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3RELFdBQU0sR0FBRyxLQUFLLENBQUM7UUFRcEIsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7U0FDbkM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDN0csMERBQTBEO1lBQzFELElBQUssQ0FBcUIsRUFBRSxRQUFRLEVBQUU7Z0JBQ3BDLGtHQUFrRztnQkFDbEcsSUFBSyxDQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7b0JBQzFDLDRHQUE0RztvQkFDNUcsSUFBSyxDQUFxQixFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUNoRCxpRkFBaUY7d0JBQ2pGLGdEQUFnRDt3QkFDaEQsSUFBSSxDQUFDLFlBQVksR0FBSSxDQUFxQixFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBcUIsQ0FBQzt3QkFDaEYsb0ZBQW9GO3dCQUNwRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUU7NEJBQzNDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3lCQUM3QjtxQkFDRjt5QkFBTTt3QkFDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLEVBQUUsQ0FBQzt3QkFDekUsaUZBQWlGO3FCQUNsRjtpQkFDRjthQUNGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNiLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTyxvQkFBb0I7UUFDMUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxRiwrQkFBK0I7WUFDL0IsMkZBQTJGO1NBQzVGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxJQUErQztRQUN6RSxJQUFJLElBQUksRUFBRTtZQUNSLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQy9DLElBQUksZ0JBQWdCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRTtnQkFDL0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN2RSxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDL0c7U0FDRjtJQUNILENBQUM7O2lIQTFFVSxvQkFBb0Isa0JBUXJCLFFBQVEsMkRBR1IsWUFBWTtxR0FYWCxvQkFBb0Isa0dBQ2pCLDZCQUE2QixnRENoQjdDLDZyREFrQ0E7MkZEbkJhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFFRSxrQkFBa0I7OzBCQVd6QixNQUFNOzJCQUFDLFFBQVE7OzBCQUdmLE1BQU07MkJBQUMsWUFBWTtpRkFUdEIscUJBQXFCO3NCQURwQixZQUFZO3VCQUFDLDZCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNIRUxMX0NPTkZJRyB9IGZyb20gJy4vLi4vLi4vLi4vdG9rZW5zJztcclxuaW1wb3J0IHsgSVNoZWxsQ29uZmlnLCBEZWZhdWx0U2hlbGxDb25maWcgfSBmcm9tICcuLy4uLy4uLy4uL3R5cGVzJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSwgSW5qZWN0LCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBET0NVTUVOVCwgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBBY3RpdmF0aW9uU3RhcnQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50SG9zdERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMvZHluYW1pYy1jb21wb25lbnQtaG9zdC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRMb2FkZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY29tcG9uZW50LWxvYWRlci9jb21wb25lbnQtbG9hZGVyLmZhY3RvcnknO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnbGliLXNoZWxsLWxheW91dCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NoZWxsLWxheW91dC5jb21wb25lbnQuaHRtbCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaGVsbExheW91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcclxuICBAVmlld0NoaWxkcmVuKER5bmFtaWNDb21wb25lbnRIb3N0RGlyZWN0aXZlKVxyXG4gIGR5bmFtaWNDb21wb25lbnRIb3N0czogUXVlcnlMaXN0PER5bmFtaWNDb21wb25lbnRIb3N0RGlyZWN0aXZlPiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBzaG93UmlnaHRQYW5lU00gPSBmYWxzZTtcclxuICBwcml2YXRlIHJvdXRlclN1YiQ6IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBhY3RpdmVDb25maWc6IElTaGVsbENvbmZpZyA9IG5ldyBEZWZhdWx0U2hlbGxDb25maWcoKTtcclxuICBwdWJsaWMgbG9hZGVkID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICBASW5qZWN0KFNIRUxMX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IElTaGVsbENvbmZpZyB8IG51bGwsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudExvYWRlckZhY3Rvcnk6IENvbXBvbmVudExvYWRlckZhY3RvcnlcclxuICApIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgIGNvbmZpZyA9IG5ldyBEZWZhdWx0U2hlbGxDb25maWcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlQ29uZmlnID0gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMubG9hZGVkID0gdHJ1ZTsgfSwgMjAwKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5yb3V0ZXJTdWIkID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKChldmVudCkgPT4gZXZlbnQgaW5zdGFuY2VvZiBBY3RpdmF0aW9uU3RhcnQpKS5zdWJzY3JpYmUoKGUpID0+IHtcclxuICAgICAgLy8gY29uc29sZS5sb2coJ1NoZWxsTGF5b3V0Q29tcG9uZW50IEFjdGl2YXRpb25TdGFydCcsIGUpO1xyXG4gICAgICBpZiAoKGUgYXMgQWN0aXZhdGlvblN0YXJ0KT8uc25hcHNob3QpIHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnU2hlbGxMYXlvdXRDb21wb25lbnQgQWN0aXZhdGlvblN0YXJ0IHNuYXBzaG90JywgKGUgYXMgQWN0aXZhdGlvblN0YXJ0KT8uc25hcHNob3QpO1xyXG4gICAgICAgIGlmICgoZSBhcyBBY3RpdmF0aW9uU3RhcnQpPy5zbmFwc2hvdD8uZGF0YSkge1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ1NoZWxsTGF5b3V0Q29tcG9uZW50IEFjdGl2YXRpb25TdGFydCBzbmFwc2hvdCBkYXRhJywgKGUgYXMgQWN0aXZhdGlvblN0YXJ0KT8uc25hcHNob3QuZGF0YSk7XHJcbiAgICAgICAgICBpZiAoKGUgYXMgQWN0aXZhdGlvblN0YXJ0KT8uc25hcHNob3Q/LmRhdGEuc2hlbGwpIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ1NoZWxsTGF5b3V0Q29tcG9uZW50IEFjdGl2YXRpb25TdGFydCBzbmFwc2hvdCBkYXRhIHNoZWxsIHBhcmFtcycsXHJcbiAgICAgICAgICAgIC8vIChlIGFzIEFjdGl2YXRpb25TdGFydCk/LnNuYXBzaG90LmRhdGEuc2hlbGwpO1xyXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZUNvbmZpZyA9IChlIGFzIEFjdGl2YXRpb25TdGFydCk/LnNuYXBzaG90LmRhdGEuc2hlbGwgYXMgSVNoZWxsQ29uZmlnO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnU2hlbGxMYXlvdXRDb21wb25lbnQgYWN0aXZlQ29uZmlnIGZyb20gcm91dGU6ICcsIHRoaXMuYWN0aXZlQ29uZmlnKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ29uZmlnLmN1c3RvbUhlYWRlckNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuaW5pdEN1c3RvbUNvbXBvbmVudHMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDb25maWcgPSB0aGlzLmNvbmZpZyA/IHRoaXMuY29uZmlnIDogbmV3IERlZmF1bHRTaGVsbENvbmZpZygpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnU2hlbGxMYXlvdXRDb21wb25lbnQgZGVmYXVsdCBhY3RpdmVDb25maWc6ICcsIHRoaXMuYWN0aXZlQ29uZmlnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Q3VzdG9tQ29tcG9uZW50cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0Q3VzdG9tQ29tcG9uZW50cygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmR5bmFtaWNDb21wb25lbnRIb3N0cyAmJiB0aGlzLmR5bmFtaWNDb21wb25lbnRIb3N0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMubG9hZEN1c3RvbUNvbXBvbmVudCh0aGlzLmR5bmFtaWNDb21wb25lbnRIb3N0cy5maW5kKChfKSA9PiBfLmhvc3ROYW1lID09PSAnSGVhZGVyJykpO1xyXG4gICAgICAvLyBzaW5jZSB5b3UncmUgbm90IHVzaW5nIGl0Li4uXHJcbiAgICAgIC8vIHRoaXMubG9hZEN1c3RvbUNvbXBvbmVudCh0aGlzLmR5bmFtaWNDb21wb25lbnRIb3N0cy5maW5kKF8gPT4gXy5ob3N0TmFtZSA9PT0gJ0Zvb3RlcicpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucm91dGVyU3ViJCkge1xyXG4gICAgICB0aGlzLnJvdXRlclN1YiQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZEN1c3RvbUNvbXBvbmVudChob3N0OiBEeW5hbWljQ29tcG9uZW50SG9zdERpcmVjdGl2ZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgaWYgKGhvc3QpIHtcclxuICAgICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IGhvc3Qudmlld0NvbnRhaW5lclJlZjtcclxuICAgICAgaWYgKHZpZXdDb250YWluZXJSZWYgJiYgdGhpcy5hY3RpdmVDb25maWcuY3VzdG9tSGVhZGVyQ29tcG9uZW50KSB7XHJcbiAgICAgICAgY29uc3QgY2xmID0gdGhpcy5jb21wb25lbnRMb2FkZXJGYWN0b3J5LmNyZWF0ZUxvYWRlcih2aWV3Q29udGFpbmVyUmVmKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJDb21wUmVmID0gY2xmLmF0dGFjaCh0aGlzLmFjdGl2ZUNvbmZpZy5jdXN0b21IZWFkZXJDb21wb25lbnQpLnRvKHZpZXdDb250YWluZXJSZWYuZWxlbWVudCkuc2hvdygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgKm5nSWY9XCJsb2FkZWRcIiBbc3R5bGUuZGlzcGxheV09XCIhbG9hZGVkID8gJ25vbmUnOidibG9jaydcIiBjbGFzcz1cInNoZWxsLWNvbnRhaW5lciBhY3RpdmUtc2lkZS1wYW5lXCI+XHJcbiAgPGRpdiBjbGFzcz1cInNoZWxsLWhlYWRlci1jb250YWluZXJcIiAqbmdJZj1cImFjdGl2ZUNvbmZpZy5zaG93SGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgW2NsYXNzXT1cImFjdGl2ZUNvbmZpZy5mbHVpZCA/ICdzaGVsbC1oZWFkZXItY29udGFpbmVyLWlubmVyLWZsdWlkJyA6ICdzaGVsbC1oZWFkZXItY29udGFpbmVyLWlubmVyJ1wiPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZUNvbmZpZy5jdXN0b21IZWFkZXJDb21wb25lbnRcIj5cclxuICAgICAgICA8ZGl2IGFwcER5bmFtaWNDb21wb25lbnRIb3N0ID1cIkhlYWRlclwiPjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxsaWItc2hlbGwtaGVhZGVyICpuZ0lmPVwiIWFjdGl2ZUNvbmZpZy5jdXN0b21IZWFkZXJDb21wb25lbnRcIiBbc2hvdy11c2VyTmFtZV09XCJhY3RpdmVDb25maWcuc2hvd1VzZXJOYW1lT25IZWFkZXJcIj48L2xpYi1zaGVsbC1oZWFkZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPG1haW4gW2NsYXNzXT1cImFjdGl2ZUNvbmZpZy5zaG93SGVhZGVyID8gJ3NoZWxsLWNvbnRlbnQtY29udGFpbmVyJyA6ICdzaGVsbC1jb250ZW50LWNvbnRhaW5lci1uby1oZWFkZXInXCI+XHJcbiAgICA8ZGl2IFtjbGFzc109XCJhY3RpdmVDb25maWcuZmx1aWQgPyAnc2hlbGwtY29udGVudC1jb250YWluZXItaW5uZXItZmx1aWQnIDogJ3NoZWxsLWNvbnRlbnQtY29udGFpbmVyLWlubmVyJ1wiPlxyXG4gICAgICA8cm91dGVyLW91dGxldD48L3JvdXRlci1vdXRsZXQ+XHJcbiAgICA8L2Rpdj5cclxuICA8L21haW4+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJzaGVsbC1mb290ZXItY29udGFpbmVyXCIgKm5nSWY9XCJhY3RpdmVDb25maWcuc2hvd0Zvb3RlclwiPlxyXG4gICAgPGRpdiBbY2xhc3NdPVwiYWN0aXZlQ29uZmlnLmZsdWlkID8gJ3NoZWxsLWZvb3Rlci1jb250YWluZXItaW5uZXItZmx1aWQnIDogJ3NoZWxsLWZvb3Rlci1jb250YWluZXItaW5uZXInXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVDb25maWcuY3VzdG9tRm9vdGVyQ29tcG9uZW50XCI+XHJcbiAgICAgICAgPGRpdiBhcHBEeW5hbWljQ29tcG9uZW50SG9zdCBob3N0TmFtZT1cIkZvb3RlclwiPjwvZGl2PlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPGxpYi1zaGVsbC1mb290ZXIgKm5nSWY9XCIhYWN0aXZlQ29uZmlnLmN1c3RvbUZvb3RlckNvbXBvbmVudFwiPjwvbGliLXNoZWxsLWZvb3Rlcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bGliLXNpZGUtcGFuZSAjcmlnaHRQYW5lPlxyXG4gICAgPHJvdXRlci1vdXRsZXQgbmFtZT1cInJpZ2h0cGFuZVwiIChhY3RpdmF0ZSk9XCJyaWdodFBhbmUub25TaWRlUGFuZUFjdGl2YXRlZCgkZXZlbnQpXCIgKGRlYWN0aXZhdGUpPVwicmlnaHRQYW5lLm9uU2lkZVBhbmVEZWFjdGl2YXRlZCgkZXZlbnQpXCI+PC9yb3V0ZXItb3V0bGV0PlxyXG4gIDwvbGliLXNpZGUtcGFuZT5cclxuXHJcbiAgPGxpYi10b2FzdGVyLWNvbnRhaW5lcj48L2xpYi10b2FzdGVyLWNvbnRhaW5lcj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=