@hug/ngx-layout 1.1.11 → 2.0.0

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 CHANGED
@@ -1,148 +1,172 @@
1
- ## 1.1.11 (2024-07-26)
1
+ # 2.0.0 (2024-09-11)
2
2
 
3
3
 
4
- ### 🐛 Fixes
4
+ ### 🚀 Features
5
5
 
6
- - **ngx-layout:** remove deprecated/unused input options ([73defb9](https://github.com/DSI-HUG/ngx-components/commit/73defb9))
6
+ - update to angular 15 - FC-67 ([6bad712](https://github.com/DSI-HUG/ngx-components/commit/6bad712))
7
7
 
8
+ - update material to angular 15 - FC-67 ([44406c1](https://github.com/DSI-HUG/ngx-components/commit/44406c1))
8
9
 
9
- ### ❤️ Thank You
10
+ - update material to angular 15 - FC-67 ([5af2c75](https://github.com/DSI-HUG/ngx-components/commit/5af2c75))
10
11
 
11
- - damien-guillermet
12
+ - layout angular15 ([02777f7](https://github.com/DSI-HUG/ngx-components/commit/02777f7))
12
13
 
13
- ## 1.1.10 (2024-07-25)
14
+ - apply angular material 18 ([f65d64c](https://github.com/DSI-HUG/ngx-components/commit/f65d64c))
15
+
16
+ - layout storybook ([6ae63c1](https://github.com/DSI-HUG/ngx-components/commit/6ae63c1))
17
+
18
+ - prettier ([2aa36f0](https://github.com/DSI-HUG/ngx-components/commit/2aa36f0))
19
+
20
+ - format to ng18 ([3b78bdf](https://github.com/DSI-HUG/ngx-components/commit/3b78bdf))
21
+
22
+ - **ng18:** remove no more necessary files ([54c46a1](https://github.com/DSI-HUG/ngx-components/commit/54c46a1))
14
23
 
15
24
 
16
25
  ### 🐛 Fixes
17
26
 
18
- - **ngx-layout:** update patch version ([0cb3d44](https://github.com/DSI-HUG/ngx-components/commit/0cb3d44))
27
+ - layout css button ([f042a32](https://github.com/DSI-HUG/ngx-components/commit/f042a32))
28
+
29
+ - correctif passage compelt ng18 ([3fe864e](https://github.com/DSI-HUG/ngx-components/commit/3fe864e))
30
+
31
+ - **ci:** tests ([9387ba8](https://github.com/DSI-HUG/ngx-components/commit/9387ba8))
19
32
 
20
33
 
21
34
  ### 🌱 Dependencies
22
35
 
23
- - **@hug/ngx-sidenav:** upgrade to v1.1.8 ([88b29fb](https://github.com/DSI-HUG/ngx-components/commit/88b29fb))
36
+ - **@hug/ngx-sidenav:** upgrade to v2.0.0 ([243d31f](https://github.com/DSI-HUG/ngx-components/commit/243d31f))
24
37
 
25
- - **@hug/ngx-core:** upgrade to v1.1.14 ([12ee5d4](https://github.com/DSI-HUG/ngx-components/commit/12ee5d4))
38
+ - **@hug/ngx-core:** upgrade to v2.0.0 ([ce6226c](https://github.com/DSI-HUG/ngx-components/commit/ce6226c))
26
39
 
27
40
 
28
41
  ### ❤️ Thank You
29
42
 
43
+ - Badisi
30
44
  - dsi-hug-bot @dsi-hug-bot
31
- - Serge
45
+ - rfrt
32
46
 
33
- ## 1.1.9 (2024-07-25)
47
+ ## 1.1.11 (2024-07-26)
34
48
 
49
+ ### 🐛 Fixes
35
50
 
36
- ### 🌱 Dependencies
51
+ - **ngx-layout:** remove deprecated/unused input options ([73defb9](https://github.com/DSI-HUG/ngx-components/commit/73defb9))
37
52
 
38
- - **@hug/ngx-core:** upgrade to v1.1.13 ([15e11d7](https://github.com/DSI-HUG/ngx-components/commit/15e11d7))
53
+ ### ❤️ Thank You
39
54
 
55
+ - damien-guillermet
40
56
 
41
- ### ❤️ Thank You
57
+ ## 1.1.10 (2024-07-25)
42
58
 
43
- - dsi-hug-bot @dsi-hug-bot
59
+ ### 🐛 Fixes
44
60
 
45
- ## 1.1.8 (2024-07-24)
61
+ - **ngx-layout:** update patch version ([0cb3d44](https://github.com/DSI-HUG/ngx-components/commit/0cb3d44))
46
62
 
63
+ ### 🌱 Dependencies
47
64
 
48
- ### 🐛 Fixes
65
+ - **@hug/ngx-sidenav:** upgrade to v1.1.8 ([88b29fb](https://github.com/DSI-HUG/ngx-components/commit/88b29fb))
66
+
67
+ - **@hug/ngx-core:** upgrade to v1.1.14 ([12ee5d4](https://github.com/DSI-HUG/ngx-components/commit/12ee5d4))
68
+
69
+ ### ❤️ Thank You
49
70
 
50
- - **ngx-layout:** update patch version ([2a03908](https://github.com/DSI-HUG/ngx-components/commit/2a03908))
71
+ - dsi-hug-bot @dsi-hug-bot
72
+ - Serge
51
73
 
74
+ ## 1.1.9 (2024-07-25)
52
75
 
53
76
  ### 🌱 Dependencies
54
77
 
55
- - **@hug/ngx-sidenav:** upgrade to v1.1.6 ([72246b0](https://github.com/DSI-HUG/ngx-components/commit/72246b0))
78
+ - **@hug/ngx-core:** upgrade to v1.1.13 ([15e11d7](https://github.com/DSI-HUG/ngx-components/commit/15e11d7))
56
79
 
57
- - **@hug/ngx-core:** upgrade to v1.1.12 ([78a2936](https://github.com/DSI-HUG/ngx-components/commit/78a2936))
80
+ ### ❤️ Thank You
58
81
 
82
+ - dsi-hug-bot @dsi-hug-bot
59
83
 
60
- ### ❤️ Thank You
84
+ ## 1.1.8 (2024-07-24)
61
85
 
62
- - dsi-hug-bot @dsi-hug-bot
63
- - Serge
86
+ ### 🐛 Fixes
64
87
 
65
- ## 1.1.7 (2024-07-24)
88
+ - **ngx-layout:** update patch version ([2a03908](https://github.com/DSI-HUG/ngx-components/commit/2a03908))
66
89
 
90
+ ### 🌱 Dependencies
67
91
 
68
- ### 🐛 Fixes
92
+ - **@hug/ngx-sidenav:** upgrade to v1.1.6 ([72246b0](https://github.com/DSI-HUG/ngx-components/commit/72246b0))
69
93
 
70
- - **ngx-layout:** update patch version ([1e19c96](https://github.com/DSI-HUG/ngx-components/commit/1e19c96))
94
+ - **@hug/ngx-core:** upgrade to v1.1.12 ([78a2936](https://github.com/DSI-HUG/ngx-components/commit/78a2936))
71
95
 
96
+ ### ❤️ Thank You
72
97
 
73
- ### 🌱 Dependencies
98
+ - dsi-hug-bot @dsi-hug-bot
99
+ - Serge
74
100
 
75
- - **@hug/ngx-core:** upgrade to v1.1.11 ([bda1d8c](https://github.com/DSI-HUG/ngx-components/commit/bda1d8c))
101
+ ## 1.1.7 (2024-07-24)
76
102
 
77
- - **@hug/ngx-sidenav:** upgrade to v1.1.5 ([7b0ce30](https://github.com/DSI-HUG/ngx-components/commit/7b0ce30))
103
+ ### 🐛 Fixes
78
104
 
105
+ - **ngx-layout:** update patch version ([1e19c96](https://github.com/DSI-HUG/ngx-components/commit/1e19c96))
79
106
 
80
- ### ❤️ Thank You
107
+ ### 🌱 Dependencies
81
108
 
82
- - dsi-hug-bot @dsi-hug-bot
83
- - Serge
109
+ - **@hug/ngx-core:** upgrade to v1.1.11 ([bda1d8c](https://github.com/DSI-HUG/ngx-components/commit/bda1d8c))
84
110
 
85
- ## 1.1.6 (2024-07-23)
111
+ - **@hug/ngx-sidenav:** upgrade to v1.1.5 ([7b0ce30](https://github.com/DSI-HUG/ngx-components/commit/7b0ce30))
86
112
 
113
+ ### ❤️ Thank You
87
114
 
88
- ### 🐛 Fixes
115
+ - dsi-hug-bot @dsi-hug-bot
116
+ - Serge
89
117
 
90
- - **ngx-core:** ngx prefix ([e08e71a](https://github.com/DSI-HUG/ngx-components/commit/e08e71a))
118
+ ## 1.1.6 (2024-07-23)
91
119
 
92
- - **ngx-layout:** compile path ([f9f464e](https://github.com/DSI-HUG/ngx-components/commit/f9f464e))
120
+ ### 🐛 Fixes
93
121
 
122
+ - **ngx-core:** ngx prefix ([e08e71a](https://github.com/DSI-HUG/ngx-components/commit/e08e71a))
94
123
 
95
- ### 🌱 Dependencies
124
+ - **ngx-layout:** compile path ([f9f464e](https://github.com/DSI-HUG/ngx-components/commit/f9f464e))
96
125
 
97
- - **@hug/ngx-core:** upgrade to v1.1.9 ([3692c68](https://github.com/DSI-HUG/ngx-components/commit/3692c68))
126
+ ### 🌱 Dependencies
98
127
 
99
- - **@hug/ngx-sidenav:** upgrade to v1.1.4 ([47676fa](https://github.com/DSI-HUG/ngx-components/commit/47676fa))
128
+ - **@hug/ngx-core:** upgrade to v1.1.9 ([3692c68](https://github.com/DSI-HUG/ngx-components/commit/3692c68))
100
129
 
101
- - **@hug/ngx-core:** upgrade to v1.1.10 ([78dbe21](https://github.com/DSI-HUG/ngx-components/commit/78dbe21))
130
+ - **@hug/ngx-sidenav:** upgrade to v1.1.4 ([47676fa](https://github.com/DSI-HUG/ngx-components/commit/47676fa))
102
131
 
132
+ - **@hug/ngx-core:** upgrade to v1.1.10 ([78dbe21](https://github.com/DSI-HUG/ngx-components/commit/78dbe21))
103
133
 
104
- ### ❤️ Thank You
134
+ ### ❤️ Thank You
105
135
 
106
- - dsi-hug-bot @dsi-hug-bot
107
- - Serge
136
+ - dsi-hug-bot @dsi-hug-bot
137
+ - Serge
108
138
 
109
139
  ## 1.1.5 (2024-07-23)
110
140
 
111
-
112
141
  ### 🐛 Fixes
113
142
 
114
- - **ngx-list-loader:** improve encapsulation ([550e79a](https://github.com/DSI-HUG/ngx-components/commit/550e79a))
115
-
116
- - **ngx-layout:** ngx prefix ([d5a4b08](https://github.com/DSI-HUG/ngx-components/commit/d5a4b08))
143
+ - **ngx-list-loader:** improve encapsulation ([550e79a](https://github.com/DSI-HUG/ngx-components/commit/550e79a))
117
144
 
145
+ - **ngx-layout:** ngx prefix ([d5a4b08](https://github.com/DSI-HUG/ngx-components/commit/d5a4b08))
118
146
 
119
147
  ### 🌱 Dependencies
120
148
 
121
- - **@hug/ngx-sidenav:** upgrade to v1.1.3 ([3d9afa7](https://github.com/DSI-HUG/ngx-components/commit/3d9afa7))
149
+ - **@hug/ngx-sidenav:** upgrade to v1.1.3 ([3d9afa7](https://github.com/DSI-HUG/ngx-components/commit/3d9afa7))
122
150
 
151
+ ### ❤️ Thank You
123
152
 
124
- ### ❤️ Thank You
125
-
126
- - dsi-hug-bot @dsi-hug-bot
127
- - Serge
153
+ - dsi-hug-bot @dsi-hug-bot
154
+ - Serge
128
155
 
129
156
  ## 1.1.4 (2024-07-23)
130
157
 
131
-
132
158
  ### 🐛 Fixes
133
159
 
134
- - **ngx-layout:** use inject ([b44b216](https://github.com/DSI-HUG/ngx-components/commit/b44b216))
135
-
160
+ - **ngx-layout:** use inject ([b44b216](https://github.com/DSI-HUG/ngx-components/commit/b44b216))
136
161
 
137
162
  ### 🌱 Dependencies
138
163
 
139
- - **@hug/ngx-core:** upgrade to v1.1.8 ([26f0d10](https://github.com/DSI-HUG/ngx-components/commit/26f0d10))
164
+ - **@hug/ngx-core:** upgrade to v1.1.8 ([26f0d10](https://github.com/DSI-HUG/ngx-components/commit/26f0d10))
140
165
 
166
+ ### ❤️ Thank You
141
167
 
142
- ### ❤️ Thank You
143
-
144
- - dsi-hug-bot @dsi-hug-bot
145
- - Serge
168
+ - dsi-hug-bot @dsi-hug-bot
169
+ - Serge
146
170
 
147
171
  ## 1.1.3 (2024-07-08)
148
172
 
package/README.md CHANGED
@@ -1,4 +1,5 @@
1
- # @hug/layout
1
+ @hug/layout
2
+ =======
2
3
 
3
4
  The sources for this package are in the main [DSI-HUG/ngx-components](https://github.com/dsi-hug/ngx-components) repo. Please file issues and pull requests against that repo.
4
5
 
@@ -7,19 +7,19 @@
7
7
  $foreground: map-get($theme, foreground);
8
8
 
9
9
  ngx-layout > .mat-toolbar.mat-primary {
10
- background-color: mat.get-color-from-palette($primary, darker);
11
- color: mat.get-color-from-palette($primary, darker-contrast);
10
+ background-color: mat.m2-get-color-from-palette($primary, darker);
11
+ color: mat.m2-get-color-from-palette($primary, darker-contrast);
12
12
 
13
- .mat-icon-button:not([disabled]) .mat-icon {
14
- color: mat.get-color-from-palette($primary, darker-contrast);
13
+ .mat-mdc-icon-button:not([disabled]) .mat-icon {
14
+ color: mat.m2-get-color-from-palette($primary, darker-contrast);
15
15
  }
16
16
 
17
17
  &:not(:first-of-type) {
18
- background-color: mat.get-color-from-palette($primary);
19
- color: mat.get-color-from-palette($primary, default-contrast);
18
+ background-color: mat.m2-get-color-from-palette($primary);
19
+ color: mat.m2-get-color-from-palette($primary, default-contrast);
20
20
 
21
- .mat-icon-button:not([disabled]) .mat-icon {
22
- color: mat.get-color-from-palette($primary, default-contrast);
21
+ .mat-mdc-icon-button:not([disabled]) .mat-icon {
22
+ color: mat.m2-get-color-from-palette($primary, default-contrast);
23
23
  }
24
24
  }
25
25
  }
@@ -28,37 +28,37 @@
28
28
  mat-drawer {
29
29
  &.right {
30
30
  [filters-title] {
31
- color: mat.get-color-from-palette($foreground, secondary-text);
32
- background-color: mat.get-color-from-palette($background, disabled-button-toggle);
31
+ color: mat.m2-get-color-from-palette($foreground, secondary-text);
32
+ background-color: mat.m2-get-color-from-palette($background, disabled-button-toggle);
33
33
  }
34
34
 
35
35
  [filters-subtitle] {
36
- color: mat.get-color-from-palette($foreground, secondary-text);
37
- background-color: mat.get-color-from-palette($background, hover);
36
+ color: mat.m2-get-color-from-palette($foreground, secondary-text);
37
+ background-color: mat.m2-get-color-from-palette($background, hover);
38
38
  }
39
39
 
40
40
  [filters-icon] {
41
- color: mat.get-color-from-palette($foreground, text);
41
+ color: mat.m2-get-color-from-palette($foreground, text);
42
42
 
43
43
  &:hover {
44
- color: mat.get-color-from-palette($foreground, secondary-text);
44
+ color: mat.m2-get-color-from-palette($foreground, secondary-text);
45
45
  }
46
46
  }
47
47
 
48
48
  [filters-chip-list] {
49
- .mat-standard-chip {
50
- background-color: mat.get-color-from-palette($accent);
51
- color: mat.get-color-from-palette($background, background);
49
+ .mat-mdc-chip {
50
+ background-color: mat.m2-get-color-from-palette($accent);
51
+ color: mat.m2-get-color-from-palette($background, background);
52
52
  }
53
53
 
54
- .mat-standard-chip {
54
+ .mat-mdc-chip {
55
55
  &:not([disabled]) {
56
56
  &:hover {
57
- background-color: mat.get-color-from-palette($accent, 700);
58
- color: mat.get-color-from-palette($accent, 600);
57
+ background-color: mat.m2-get-color-from-palette($accent, 700);
58
+ color: mat.m2-get-color-from-palette($accent, 600);
59
59
 
60
60
  &:before {
61
- color: mat.get-color-from-palette($background, background);
61
+ color: mat.m2-get-color-from-palette($background, background);
62
62
  }
63
63
  }
64
64
  }
@@ -67,17 +67,17 @@
67
67
 
68
68
  [filters-toggle-group] {
69
69
  .mat-button-toggle {
70
- color: mat.get-color-from-palette($foreground, secondary-text);
70
+ color: mat.m2-get-color-from-palette($foreground, secondary-text);
71
71
 
72
72
  &.mat-button-toggle-checked {
73
- background-color: mat.get-color-from-palette($accent);
74
- color: mat.get-color-from-palette($background, background);
73
+ background-color: mat.m2-get-color-from-palette($accent);
74
+ color: mat.m2-get-color-from-palette($background, background);
75
75
  }
76
76
 
77
77
  &:not(:has(button[disabled])) {
78
78
  &:hover {
79
- background-color: mat.get-color-from-palette($accent, 200);
80
- color: mat.get-color-from-palette($background, background);
79
+ background-color: mat.m2-get-color-from-palette($accent, 200);
80
+ color: mat.m2-get-color-from-palette($background, background);
81
81
  }
82
82
  }
83
83
  }
@@ -90,7 +90,7 @@
90
90
  mat-button-toggle {
91
91
  button {
92
92
  .mat-button-toggle-label-content {
93
- color: mat.get-color-from-palette($foreground, secondary-text);
93
+ color: mat.m2-get-color-from-palette($foreground, secondary-text);
94
94
  }
95
95
  }
96
96
  }
@@ -102,13 +102,13 @@
102
102
  .info-boxes-container {
103
103
  .info-box {
104
104
  &.accent {
105
- background-color: mat.get-color-from-palette($accent);
106
- color: mat.get-color-from-palette($accent, default-contrast);
105
+ background-color: mat.m2-get-color-from-palette($accent);
106
+ color: mat.m2-get-color-from-palette($accent, default-contrast);
107
107
  }
108
108
 
109
109
  &.primary {
110
- background-color: mat.get-color-from-palette($primary, 800);
111
- color: mat.get-color-from-palette($primary, default-contrast);
110
+ background-color: mat.m2-get-color-from-palette($primary, 800);
111
+ color: mat.m2-get-color-from-palette($primary, default-contrast);
112
112
  }
113
113
  }
114
114
  }
@@ -117,20 +117,20 @@
117
117
 
118
118
  // Custom scrollbar
119
119
  ::-webkit-scrollbar-track {
120
- background-color: mat.get-color-from-palette($background, background);
120
+ background-color: mat.m2-get-color-from-palette($background, background);
121
121
  }
122
122
 
123
123
  ::-webkit-scrollbar-thumb {
124
- background-color: mat.get-color-from-palette($foreground, hint-text);
125
- border: 2px solid mat.get-color-from-palette($background, background);
124
+ background-color: mat.m2-get-color-from-palette($foreground, hint-text);
125
+ border: 2px solid mat.m2-get-color-from-palette($background, background);
126
126
  }
127
127
 
128
128
  ::-webkit-scrollbar-thumb:hover {
129
- background-color: mat.get-color-from-palette($foreground, secondary-text);
129
+ background-color: mat.m2-get-color-from-palette($foreground, secondary-text);
130
130
  }
131
131
 
132
132
  .editor-toolbar-wrapper {
133
- background-color: mat.get-color-from-palette($background, background);
133
+ background-color: mat.m2-get-color-from-palette($background, background);
134
134
  }
135
135
  }
136
136
  }
@@ -0,0 +1,158 @@
1
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
2
+ import { AsyncPipe, NgTemplateOutlet } from '@angular/common';
3
+ import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostBinding, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
4
+ import { MatIconButton } from '@angular/material/button';
5
+ import { MatIcon } from '@angular/material/icon';
6
+ import { MatDrawer, MatDrawerContainer, MatDrawerContent } from '@angular/material/sidenav';
7
+ import { MatToolbar } from '@angular/material/toolbar';
8
+ import { MatTooltip } from '@angular/material/tooltip';
9
+ import { NgxMediaService } from '@hug/ngx-core';
10
+ import { NgxSidenavService } from '@hug/ngx-sidenav';
11
+ import * as i0 from "@angular/core";
12
+ export class NgxLayoutComponent {
13
+ toolbarColor = 'primary';
14
+ editorToolbarId = 'editor-toolbar';
15
+ closeButtonLabel = 'Fermer';
16
+ backButtonLabel = 'Retour';
17
+ layoutToolbarExternal;
18
+ layoutPrimaryActionExternal;
19
+ layoutActionsExternal;
20
+ layoutInfoBoxesExternal;
21
+ layoutRightExternal;
22
+ closeButtonClicked = new EventEmitter();
23
+ backButtonClicked = new EventEmitter();
24
+ sideFilterClosed = new EventEmitter();
25
+ sideFilterOpened = new EventEmitter();
26
+ layoutToolbarContent;
27
+ layoutPrimaryActionContent;
28
+ layoutActionsContent;
29
+ layoutInfoBoxesContent;
30
+ layoutRightContent;
31
+ noRight = false;
32
+ sideFilter;
33
+ mediaService = inject(NgxMediaService);
34
+ sidenavService = inject(NgxSidenavService);
35
+ get layoutToolbar() {
36
+ return this.layoutToolbarExternal ?? this.layoutToolbarContent;
37
+ }
38
+ get layoutPrimaryAction() {
39
+ return this.layoutPrimaryActionExternal ?? this.layoutPrimaryActionContent;
40
+ }
41
+ get layoutActions() {
42
+ return this.layoutActionsExternal ?? this.layoutActionsContent;
43
+ }
44
+ get layoutInfoBoxes() {
45
+ return this.layoutInfoBoxesExternal ?? this.layoutInfoBoxesContent;
46
+ }
47
+ get layoutRight() {
48
+ const value = this.layoutRightExternal ?? this.layoutRightContent;
49
+ this.noRight = !value;
50
+ return value;
51
+ }
52
+ _withSidenav = false;
53
+ set withSidenav(value) {
54
+ this._withSidenav = coerceBooleanProperty(value);
55
+ }
56
+ get withSidenav() {
57
+ return this._withSidenav;
58
+ }
59
+ _keepFilterButtonDisplayed = true;
60
+ set keepFilterButtonDisplayed(value) {
61
+ this._keepFilterButtonDisplayed = coerceBooleanProperty(value);
62
+ }
63
+ get keepFilterButtonDisplayed() {
64
+ return this._keepFilterButtonDisplayed;
65
+ }
66
+ _withCloseButton = false;
67
+ set withCloseButton(value) {
68
+ this._withCloseButton = coerceBooleanProperty(value);
69
+ }
70
+ get withCloseButton() {
71
+ return this._withCloseButton;
72
+ }
73
+ _withBackButton = false;
74
+ set withBackButton(value) {
75
+ this._withBackButton = coerceBooleanProperty(value);
76
+ }
77
+ get withBackButton() {
78
+ return this._withBackButton;
79
+ }
80
+ closeSideFilter() {
81
+ void this.sideFilter?.close();
82
+ }
83
+ openSideFilter() {
84
+ void this.sideFilter?.open();
85
+ }
86
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NgxLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
87
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.3", type: NgxLayoutComponent, isStandalone: true, selector: "ngx-layout", inputs: { toolbarColor: "toolbarColor", editorToolbarId: "editorToolbarId", closeButtonLabel: "closeButtonLabel", backButtonLabel: "backButtonLabel", layoutToolbarExternal: "layoutToolbarExternal", layoutPrimaryActionExternal: "layoutPrimaryActionExternal", layoutActionsExternal: "layoutActionsExternal", layoutInfoBoxesExternal: "layoutInfoBoxesExternal", layoutRightExternal: "layoutRightExternal", withSidenav: "withSidenav", keepFilterButtonDisplayed: "keepFilterButtonDisplayed", withCloseButton: "withCloseButton", withBackButton: "withBackButton" }, outputs: { closeButtonClicked: "closeButtonClicked", backButtonClicked: "backButtonClicked", sideFilterClosed: "sideFilterClosed", sideFilterOpened: "sideFilterOpened" }, host: { properties: { "class.no-right": "this.noRight" } }, queries: [{ propertyName: "layoutToolbarContent", first: true, predicate: ["layoutToolbar"], descendants: true }, { propertyName: "layoutPrimaryActionContent", first: true, predicate: ["layoutPrimaryAction"], descendants: true }, { propertyName: "layoutActionsContent", first: true, predicate: ["layoutActions"], descendants: true }, { propertyName: "layoutInfoBoxesContent", first: true, predicate: ["layoutInfoBoxes"], descendants: true }, { propertyName: "layoutRightContent", first: true, predicate: ["layoutRight"], descendants: true }], viewQueries: [{ propertyName: "sideFilter", first: true, predicate: ["sideFilter"], descendants: true }], ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"filter\"></ng-container>\n\n<ng-template #content>\n <div class=\"main-content\">\n @if (\n layoutPrimaryAction && !((layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false)\n ) {\n <span class=\"primary-action-container\" [class.bottom]=\"mediaService.isHandset$ | async\">\n <ng-template [ngTemplateOutlet]=\"layoutPrimaryAction\"></ng-template>\n </span>\n }\n <ng-content></ng-content>\n </div>\n @if ((mediaService.isHandset$ | async) && actionsToolbar) {\n <ng-container *ngTemplateOutlet=\"actionsToolbar\"></ng-container>\n }\n</ng-template>\n\n<ng-template #actionsToolbar>\n <mat-toolbar\n id=\"actions-toolbar\"\n class=\"actions\"\n [color]=\"toolbarColor\"\n [class.bottom]=\"mediaService.isHandset$ | async\">\n @if (layoutPrimaryAction && (layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false) {\n <span class=\"primary-action-container\">\n <ng-template [ngTemplateOutlet]=\"layoutPrimaryAction\"></ng-template>\n </span>\n }\n @if (layoutActions) {\n <ng-template [ngTemplateOutlet]=\"layoutActions\"></ng-template>\n }\n @if (layoutInfoBoxes && (mediaService.isHandset$ | async) === false) {\n <div class=\"info-boxes-container\">\n <ng-template [ngTemplateOutlet]=\"layoutInfoBoxes\"></ng-template>\n </div>\n }\n </mat-toolbar>\n</ng-template>\n\n<ng-template #filter>\n @if (layoutToolbar || layoutRight) {\n <mat-toolbar id=\"toolbar\" [color]=\"toolbarColor\">\n @if (withSidenav && (mediaService.isHandset$ | async) && (sidenavService.openChanged$ | async) === false) {\n <button type=\"button\" id=\"sidenav-button\" mat-icon-button (click)=\"sidenavService.toggle()\">\n <mat-icon>menu</mat-icon>\n </button>\n }\n @if (withBackButton) {\n <button\n type=\"button\"\n id=\"back-button\"\n mat-icon-button\n (click)=\"this.backButtonClicked.emit($event)\"\n [matTooltip]=\"backButtonLabel\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n }\n <div id=\"toolbar-content-container\">\n @if (layoutToolbar) {\n <ng-template [ngTemplateOutlet]=\"layoutToolbar\"></ng-template>\n }\n </div>\n @if (sideFilter && (keepFilterButtonDisplayed || (mediaService.isHandset$ | async)) && layoutRight) {\n <button\n type=\"button\"\n id=\"filter-button\"\n mat-icon-button\n (click)=\"sideFilter.toggle()\"\n matTooltip=\"Afficher/Masquer les filtres\">\n <mat-icon>tune</mat-icon>\n </button>\n }\n @if (withCloseButton) {\n <button\n type=\"button\"\n id=\"close-button\"\n mat-icon-button\n (click)=\"this.closeButtonClicked.emit($event)\"\n [matTooltip]=\"closeButtonLabel\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-toolbar>\n }\n\n @if ((layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false) {\n <ng-container *ngTemplateOutlet=\"actionsToolbar\"></ng-container>\n }\n @if (layoutRight) {\n <mat-drawer-container autosize=\"true\">\n <mat-drawer-content>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </mat-drawer-content>\n <mat-drawer\n id=\"side-filter\"\n #sideFilter\n (closed)=\"sideFilterClosed.emit()\"\n (openedChange)=\"sideFilterOpened.emit()\"\n class=\"right\"\n position=\"end\"\n [attr.role]=\"(mediaService.isHandset$ | async) ? 'dialog' : 'navigation'\"\n [mode]=\"(mediaService.isHandset$ | async) ? 'over' : 'side'\"\n [opened]=\"(mediaService.isHandset$ | async) === false\">\n <ng-template [ngTemplateOutlet]=\"layoutRight\"></ng-template>\n </mat-drawer>\n </mat-drawer-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</ng-template>\n", styles: ["ngx-layout{display:flex;flex-direction:column;position:absolute;inset:0}ngx-layout.no-left.no-right .main-content{padding:0}ngx-layout mat-sidenav-container{position:absolute;inset:0}ngx-layout mat-drawer-content,ngx-layout mat-sidenav-content{display:flex!important;flex-direction:column}ngx-layout mat-sidenav{width:200px}ngx-layout mat-drawer{width:220px}ngx-layout mat-drawer.right{padding:.3rem}ngx-layout mat-drawer.right [filters-title]{font-size:1.2rem;display:flex;align-items:center;justify-content:space-between;flex:1 1 auto;font-weight:700;padding:.6rem;margin-bottom:.3rem}ngx-layout mat-drawer.right [filters-subtitle]{font-size:1rem;display:flex;align-items:center;justify-content:space-between;flex:1 1 auto;font-weight:600;padding:.4rem .6rem;margin-bottom:.3rem;margin-top:.3rem}ngx-layout mat-drawer.right [icons-container]{display:flex;align-items:center}ngx-layout mat-drawer.right [filters-icon]{cursor:pointer;transition:color .3s ease-in-out}ngx-layout mat-drawer.right [filters-chip-list] mat-chip-listbox{margin:0;max-height:20vh;overflow-y:auto}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip{position:relative;padding:.5rem;margin:.1rem;font-size:.75rem;transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip:not([disabled]){cursor:pointer}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip:not([disabled]):hover:before{font-family:Material Icons;content:\"close\";display:flex;align-items:center;justify-content:center;position:absolute;inset:0;font-weight:700;font-size:1.2rem;cursor:pointer;transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-toggle-group]{display:flex}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle{transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle mat-icon{margin-right:1rem}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle .mat-button-toggle-label-content{text-align:start}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle .mat-button-toggle-focus-overlay{height:100%}ngx-layout mat-drawer.right mat-form-field{width:100%}ngx-layout mat-drawer.right .mat-mdc-form-field-infix{width:inherit}ngx-layout mat-drawer.right.mat-drawer-side{box-shadow:-3px 0 5px -1px #0003;z-index:10}ngx-layout mat-drawer-container{flex:1}ngx-layout .mat-toolbar:not(.actions){display:flex;box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f;z-index:10}ngx-layout .mat-toolbar:not(.actions) #toolbar-content-container{display:flex;flex-grow:1;overflow:hidden}ngx-layout .mat-toolbar:not(.actions) [toolbar-title]{overflow:hidden;text-overflow:ellipsis}ngx-layout .mat-toolbar:not(.actions)>div{display:flex;align-items:center}ngx-layout .mat-toolbar .mat-mdc-icon-button{height:40px;line-height:40px;width:40px;display:flex;justify-content:center;align-items:center;padding:0}ngx-layout .mat-toolbar#actions-toolbar{flex:0 0 auto;height:40px;font-size:inherit;padding-right:0}ngx-layout .mat-toolbar#actions-toolbar .info-boxes-container{display:flex;flex:1 1 auto;justify-content:flex-end}ngx-layout .mat-toolbar#actions-toolbar .info-boxes-container .info-box{display:flex;flex-grow:0;line-height:40px;padding-left:2rem;padding-right:2rem;box-shadow:-3px 0 5px -1px #0003}ngx-layout .mat-toolbar#actions-toolbar.bottom#actions-toolbar{display:flex;width:100%;justify-content:space-around}ngx-layout .mat-toolbar#actions-toolbar .primary-action-container{z-index:20}ngx-layout .mat-toolbar#actions-toolbar .primary-action-container button{background-color:#009688}ngx-layout .main-content{position:relative;display:flex;flex:1 1 auto;overflow:hidden}ngx-layout .main-content .primary-action-container{position:absolute;z-index:20;opacity:.8;transition:.3s ease-in-out}ngx-layout .main-content .primary-action-container:hover{opacity:1}ngx-layout .main-content .primary-action-container.bottom{right:1rem;bottom:1rem}ngx-layout .main-content .primary-action-container:not(.bottom){top:1rem;left:1rem}ngx-layout ::-webkit-scrollbar{width:12px;height:12px}ngx-layout ::-webkit-scrollbar-thumb{transition:.3s ease-in-out;border-radius:6px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { kind: "component", type: MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { kind: "component", type: MatDrawerContent, selector: "mat-drawer-content" }, { kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.3", ngImport: i0, type: NgxLayoutComponent, decorators: [{
90
+ type: Component,
91
+ args: [{ selector: 'ngx-layout', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
92
+ NgTemplateOutlet,
93
+ AsyncPipe,
94
+ MatIconButton,
95
+ MatIcon,
96
+ MatDrawer,
97
+ MatDrawerContainer,
98
+ MatDrawerContent,
99
+ MatToolbar,
100
+ MatTooltip
101
+ ], template: "<ng-container *ngTemplateOutlet=\"filter\"></ng-container>\n\n<ng-template #content>\n <div class=\"main-content\">\n @if (\n layoutPrimaryAction && !((layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false)\n ) {\n <span class=\"primary-action-container\" [class.bottom]=\"mediaService.isHandset$ | async\">\n <ng-template [ngTemplateOutlet]=\"layoutPrimaryAction\"></ng-template>\n </span>\n }\n <ng-content></ng-content>\n </div>\n @if ((mediaService.isHandset$ | async) && actionsToolbar) {\n <ng-container *ngTemplateOutlet=\"actionsToolbar\"></ng-container>\n }\n</ng-template>\n\n<ng-template #actionsToolbar>\n <mat-toolbar\n id=\"actions-toolbar\"\n class=\"actions\"\n [color]=\"toolbarColor\"\n [class.bottom]=\"mediaService.isHandset$ | async\">\n @if (layoutPrimaryAction && (layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false) {\n <span class=\"primary-action-container\">\n <ng-template [ngTemplateOutlet]=\"layoutPrimaryAction\"></ng-template>\n </span>\n }\n @if (layoutActions) {\n <ng-template [ngTemplateOutlet]=\"layoutActions\"></ng-template>\n }\n @if (layoutInfoBoxes && (mediaService.isHandset$ | async) === false) {\n <div class=\"info-boxes-container\">\n <ng-template [ngTemplateOutlet]=\"layoutInfoBoxes\"></ng-template>\n </div>\n }\n </mat-toolbar>\n</ng-template>\n\n<ng-template #filter>\n @if (layoutToolbar || layoutRight) {\n <mat-toolbar id=\"toolbar\" [color]=\"toolbarColor\">\n @if (withSidenav && (mediaService.isHandset$ | async) && (sidenavService.openChanged$ | async) === false) {\n <button type=\"button\" id=\"sidenav-button\" mat-icon-button (click)=\"sidenavService.toggle()\">\n <mat-icon>menu</mat-icon>\n </button>\n }\n @if (withBackButton) {\n <button\n type=\"button\"\n id=\"back-button\"\n mat-icon-button\n (click)=\"this.backButtonClicked.emit($event)\"\n [matTooltip]=\"backButtonLabel\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n }\n <div id=\"toolbar-content-container\">\n @if (layoutToolbar) {\n <ng-template [ngTemplateOutlet]=\"layoutToolbar\"></ng-template>\n }\n </div>\n @if (sideFilter && (keepFilterButtonDisplayed || (mediaService.isHandset$ | async)) && layoutRight) {\n <button\n type=\"button\"\n id=\"filter-button\"\n mat-icon-button\n (click)=\"sideFilter.toggle()\"\n matTooltip=\"Afficher/Masquer les filtres\">\n <mat-icon>tune</mat-icon>\n </button>\n }\n @if (withCloseButton) {\n <button\n type=\"button\"\n id=\"close-button\"\n mat-icon-button\n (click)=\"this.closeButtonClicked.emit($event)\"\n [matTooltip]=\"closeButtonLabel\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-toolbar>\n }\n\n @if ((layoutActions || layoutInfoBoxes) && (mediaService.isHandset$ | async) === false) {\n <ng-container *ngTemplateOutlet=\"actionsToolbar\"></ng-container>\n }\n @if (layoutRight) {\n <mat-drawer-container autosize=\"true\">\n <mat-drawer-content>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </mat-drawer-content>\n <mat-drawer\n id=\"side-filter\"\n #sideFilter\n (closed)=\"sideFilterClosed.emit()\"\n (openedChange)=\"sideFilterOpened.emit()\"\n class=\"right\"\n position=\"end\"\n [attr.role]=\"(mediaService.isHandset$ | async) ? 'dialog' : 'navigation'\"\n [mode]=\"(mediaService.isHandset$ | async) ? 'over' : 'side'\"\n [opened]=\"(mediaService.isHandset$ | async) === false\">\n <ng-template [ngTemplateOutlet]=\"layoutRight\"></ng-template>\n </mat-drawer>\n </mat-drawer-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</ng-template>\n", styles: ["ngx-layout{display:flex;flex-direction:column;position:absolute;inset:0}ngx-layout.no-left.no-right .main-content{padding:0}ngx-layout mat-sidenav-container{position:absolute;inset:0}ngx-layout mat-drawer-content,ngx-layout mat-sidenav-content{display:flex!important;flex-direction:column}ngx-layout mat-sidenav{width:200px}ngx-layout mat-drawer{width:220px}ngx-layout mat-drawer.right{padding:.3rem}ngx-layout mat-drawer.right [filters-title]{font-size:1.2rem;display:flex;align-items:center;justify-content:space-between;flex:1 1 auto;font-weight:700;padding:.6rem;margin-bottom:.3rem}ngx-layout mat-drawer.right [filters-subtitle]{font-size:1rem;display:flex;align-items:center;justify-content:space-between;flex:1 1 auto;font-weight:600;padding:.4rem .6rem;margin-bottom:.3rem;margin-top:.3rem}ngx-layout mat-drawer.right [icons-container]{display:flex;align-items:center}ngx-layout mat-drawer.right [filters-icon]{cursor:pointer;transition:color .3s ease-in-out}ngx-layout mat-drawer.right [filters-chip-list] mat-chip-listbox{margin:0;max-height:20vh;overflow-y:auto}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip{position:relative;padding:.5rem;margin:.1rem;font-size:.75rem;transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip:not([disabled]){cursor:pointer}ngx-layout mat-drawer.right [filters-chip-list] .mat-mdc-chip:not([disabled]):hover:before{font-family:Material Icons;content:\"close\";display:flex;align-items:center;justify-content:center;position:absolute;inset:0;font-weight:700;font-size:1.2rem;cursor:pointer;transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-toggle-group]{display:flex}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle{transition:.3s ease-in-out}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle mat-icon{margin-right:1rem}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle .mat-button-toggle-label-content{text-align:start}ngx-layout mat-drawer.right [filters-toggle-group] .mat-button-toggle .mat-button-toggle-focus-overlay{height:100%}ngx-layout mat-drawer.right mat-form-field{width:100%}ngx-layout mat-drawer.right .mat-mdc-form-field-infix{width:inherit}ngx-layout mat-drawer.right.mat-drawer-side{box-shadow:-3px 0 5px -1px #0003;z-index:10}ngx-layout mat-drawer-container{flex:1}ngx-layout .mat-toolbar:not(.actions){display:flex;box-shadow:0 3px 5px -1px #0003,0 6px 10px #00000024,0 1px 18px #0000001f;z-index:10}ngx-layout .mat-toolbar:not(.actions) #toolbar-content-container{display:flex;flex-grow:1;overflow:hidden}ngx-layout .mat-toolbar:not(.actions) [toolbar-title]{overflow:hidden;text-overflow:ellipsis}ngx-layout .mat-toolbar:not(.actions)>div{display:flex;align-items:center}ngx-layout .mat-toolbar .mat-mdc-icon-button{height:40px;line-height:40px;width:40px;display:flex;justify-content:center;align-items:center;padding:0}ngx-layout .mat-toolbar#actions-toolbar{flex:0 0 auto;height:40px;font-size:inherit;padding-right:0}ngx-layout .mat-toolbar#actions-toolbar .info-boxes-container{display:flex;flex:1 1 auto;justify-content:flex-end}ngx-layout .mat-toolbar#actions-toolbar .info-boxes-container .info-box{display:flex;flex-grow:0;line-height:40px;padding-left:2rem;padding-right:2rem;box-shadow:-3px 0 5px -1px #0003}ngx-layout .mat-toolbar#actions-toolbar.bottom#actions-toolbar{display:flex;width:100%;justify-content:space-around}ngx-layout .mat-toolbar#actions-toolbar .primary-action-container{z-index:20}ngx-layout .mat-toolbar#actions-toolbar .primary-action-container button{background-color:#009688}ngx-layout .main-content{position:relative;display:flex;flex:1 1 auto;overflow:hidden}ngx-layout .main-content .primary-action-container{position:absolute;z-index:20;opacity:.8;transition:.3s ease-in-out}ngx-layout .main-content .primary-action-container:hover{opacity:1}ngx-layout .main-content .primary-action-container.bottom{right:1rem;bottom:1rem}ngx-layout .main-content .primary-action-container:not(.bottom){top:1rem;left:1rem}ngx-layout ::-webkit-scrollbar{width:12px;height:12px}ngx-layout ::-webkit-scrollbar-thumb{transition:.3s ease-in-out;border-radius:6px}\n"] }]
102
+ }], propDecorators: { toolbarColor: [{
103
+ type: Input
104
+ }], editorToolbarId: [{
105
+ type: Input
106
+ }], closeButtonLabel: [{
107
+ type: Input
108
+ }], backButtonLabel: [{
109
+ type: Input
110
+ }], layoutToolbarExternal: [{
111
+ type: Input
112
+ }], layoutPrimaryActionExternal: [{
113
+ type: Input
114
+ }], layoutActionsExternal: [{
115
+ type: Input
116
+ }], layoutInfoBoxesExternal: [{
117
+ type: Input
118
+ }], layoutRightExternal: [{
119
+ type: Input
120
+ }], closeButtonClicked: [{
121
+ type: Output
122
+ }], backButtonClicked: [{
123
+ type: Output
124
+ }], sideFilterClosed: [{
125
+ type: Output
126
+ }], sideFilterOpened: [{
127
+ type: Output
128
+ }], layoutToolbarContent: [{
129
+ type: ContentChild,
130
+ args: ['layoutToolbar']
131
+ }], layoutPrimaryActionContent: [{
132
+ type: ContentChild,
133
+ args: ['layoutPrimaryAction']
134
+ }], layoutActionsContent: [{
135
+ type: ContentChild,
136
+ args: ['layoutActions']
137
+ }], layoutInfoBoxesContent: [{
138
+ type: ContentChild,
139
+ args: ['layoutInfoBoxes']
140
+ }], layoutRightContent: [{
141
+ type: ContentChild,
142
+ args: ['layoutRight']
143
+ }], noRight: [{
144
+ type: HostBinding,
145
+ args: ['class.no-right']
146
+ }], sideFilter: [{
147
+ type: ViewChild,
148
+ args: ['sideFilter']
149
+ }], withSidenav: [{
150
+ type: Input
151
+ }], keepFilterButtonDisplayed: [{
152
+ type: Input
153
+ }], withCloseButton: [{
154
+ type: Input
155
+ }], withBackButton: [{
156
+ type: Input
157
+ }] } });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9zcmMvbGF5b3V0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3Byb2plY3RzL2xheW91dC9zcmMvbGF5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUssT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOztBQXFCckQsTUFBTSxPQUFPLGtCQUFrQjtJQUNYLFlBQVksR0FBRyxTQUFTLENBQUM7SUFDekIsZUFBZSxHQUFHLGdCQUFnQixDQUFDO0lBRW5DLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztJQUM1QixlQUFlLEdBQUcsUUFBUSxDQUFDO0lBRTNCLHFCQUFx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VUFBVTtzQkFBNUMsU0FBUzt1QkFBQyxZQUFZO2dCQThCWixXQUFXO3NCQURyQixLQUFLO2dCQVlLLHlCQUF5QjtzQkFEbkMsS0FBSztnQkFZSyxlQUFlO3NCQUR6QixLQUFLO2dCQVlLLGNBQWM7c0JBRHhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uQnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdEljb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdERyYXdlciwgTWF0RHJhd2VyQ29udGFpbmVyLCBNYXREcmF3ZXJDb250ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2lkZW5hdic7XG5pbXBvcnQgeyBNYXRUb29sYmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbGJhcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBOZ3hNZWRpYVNlcnZpY2UgfSBmcm9tICdAaHVnL25neC1jb3JlJztcbmltcG9ydCB7IE5neFNpZGVuYXZTZXJ2aWNlIH0gZnJvbSAnQGh1Zy9uZ3gtc2lkZW5hdic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd4LWxheW91dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xheW91dC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbGF5b3V0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICAgICAgQXN5bmNQaXBlLFxuICAgICAgICBNYXRJY29uQnV0dG9uLFxuICAgICAgICBNYXRJY29uLFxuICAgICAgICBNYXREcmF3ZXIsXG4gICAgICAgIE1hdERyYXdlckNvbnRhaW5lcixcbiAgICAgICAgTWF0RHJhd2VyQ29udGVudCxcbiAgICAgICAgTWF0VG9vbGJhcixcbiAgICAgICAgTWF0VG9vbHRpcFxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTmd4TGF5b3V0Q29tcG9uZW50IHtcbiAgICBASW5wdXQoKSBwdWJsaWMgdG9vbGJhckNvbG9yID0gJ3ByaW1hcnknO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBlZGl0b3JUb29sYmFySWQgPSAnZWRpdG9yLXRvb2xiYXInO1xuXG4gICAgQElucHV0KCkgcHVibGljIGNsb3NlQnV0dG9uTGFiZWwgPSAnRmVybWVyJztcbiAgICBASW5wdXQoKSBwdWJsaWMgYmFja0J1dHRvbkxhYmVsID0gJ1JldG91cic7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0VG9vbGJhckV4dGVybmFsPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgQElucHV0KCkgcHVibGljIGxheW91dFByaW1hcnlBY3Rpb25FeHRlcm5hbD86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYXlvdXRBY3Rpb25zRXh0ZXJuYWw/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0SW5mb0JveGVzRXh0ZXJuYWw/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbGF5b3V0UmlnaHRFeHRlcm5hbD86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBjbG9zZUJ1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBiYWNrQnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcbiAgICBAT3V0cHV0KCkgcHVibGljIHJlYWRvbmx5IHNpZGVGaWx0ZXJDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyByZWFkb25seSBzaWRlRmlsdGVyT3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgQENvbnRlbnRDaGlsZCgnbGF5b3V0VG9vbGJhcicpIHByb3RlY3RlZCBsYXlvdXRUb29sYmFyQ29udGVudD86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICAgIEBDb250ZW50Q2hpbGQoJ2xheW91dFByaW1hcnlBY3Rpb24nKSBwcm90ZWN0ZWQgbGF5b3V0UHJpbWFyeUFjdGlvbkNvbnRlbnQ/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBAQ29udGVudENoaWxkKCdsYXlvdXRBY3Rpb25zJykgcHJvdGVjdGVkIGxheW91dEFjdGlvbnNDb250ZW50PzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG4gICAgQENvbnRlbnRDaGlsZCgnbGF5b3V0SW5mb0JveGVzJykgcHJvdGVjdGVkIGxheW91dEluZm9Cb3hlc0NvbnRlbnQ/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgICBAQ29udGVudENoaWxkKCdsYXlvdXRSaWdodCcpIHByb3RlY3RlZCBsYXlvdXRSaWdodENvbnRlbnQ/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAgIEBIb3N0QmluZGluZygnY2xhc3Mubm8tcmlnaHQnKSBwcm90ZWN0ZWQgbm9SaWdodCA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZCgnc2lkZUZpbHRlcicpIHByb3RlY3RlZCBzaWRlRmlsdGVyPzogTWF0RHJhd2VyO1xuXG4gICAgcHJvdGVjdGVkIG1lZGlhU2VydmljZSA9IGluamVjdChOZ3hNZWRpYVNlcnZpY2UpO1xuICAgIHByb3RlY3RlZCBzaWRlbmF2U2VydmljZSA9IGluamVjdChOZ3hTaWRlbmF2U2VydmljZSk7XG5cbiAgICBwdWJsaWMgZ2V0IGxheW91dFRvb2xiYXIoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRUb29sYmFyRXh0ZXJuYWwgPz8gdGhpcy5sYXlvdXRUb29sYmFyQ29udGVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxheW91dFByaW1hcnlBY3Rpb24oKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRQcmltYXJ5QWN0aW9uRXh0ZXJuYWwgPz8gdGhpcy5sYXlvdXRQcmltYXJ5QWN0aW9uQ29udGVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxheW91dEFjdGlvbnMoKTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXRBY3Rpb25zRXh0ZXJuYWwgPz8gdGhpcy5sYXlvdXRBY3Rpb25zQ29udGVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxheW91dEluZm9Cb3hlcygpOiBUZW1wbGF0ZVJlZjx1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dEluZm9Cb3hlc0V4dGVybmFsID8/IHRoaXMubGF5b3V0SW5mb0JveGVzQ29udGVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxheW91dFJpZ2h0KCk6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmxheW91dFJpZ2h0RXh0ZXJuYWwgPz8gdGhpcy5sYXlvdXRSaWdodENvbnRlbnQ7XG4gICAgICAgIHRoaXMubm9SaWdodCA9ICF2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3dpdGhTaWRlbmF2ID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgd2l0aFNpZGVuYXYodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgICAgICB0aGlzLl93aXRoU2lkZW5hdiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB3aXRoU2lkZW5hdigpOiBCb29sZWFuSW5wdXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2l0aFNpZGVuYXY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfa2VlcEZpbHRlckJ1dHRvbkRpc3BsYXllZCA9IHRydWU7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQga2VlcEZpbHRlckJ1dHRvbkRpc3BsYXllZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgICAgIHRoaXMuX2tlZXBGaWx0ZXJCdXR0b25EaXNwbGF5ZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQga2VlcEZpbHRlckJ1dHRvbkRpc3BsYXllZCgpOiBCb29sZWFuSW5wdXQge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2VlcEZpbHRlckJ1dHRvbkRpc3BsYXllZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF93aXRoQ2xvc2VCdXR0b24gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB3aXRoQ2xvc2VCdXR0b24odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgICAgICB0aGlzLl93aXRoQ2xvc2VCdXR0b24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgd2l0aENsb3NlQnV0dG9uKCk6IEJvb2xlYW5JbnB1dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aXRoQ2xvc2VCdXR0b247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfd2l0aEJhY2tCdXR0b24gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCB3aXRoQmFja0J1dHRvbih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgICAgIHRoaXMuX3dpdGhCYWNrQnV0dG9uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHdpdGhCYWNrQnV0dG9uKCk6IEJvb2xlYW5JbnB1dCB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aXRoQmFja0J1dHRvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xvc2VTaWRlRmlsdGVyKCk6IHZvaWQge1xuICAgICAgICB2b2lkIHRoaXMuc2lkZUZpbHRlcj8uY2xvc2UoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3BlblNpZGVGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIHZvaWQgdGhpcy5zaWRlRmlsdGVyPy5vcGVuKCk7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlclwiPjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gICAgPGRpdiBjbGFzcz1cIm1haW4tY29udGVudFwiPlxuICAgICAgICBAaWYgKFxuICAgICAgICAgICAgbGF5b3V0UHJpbWFyeUFjdGlvbiAmJiAhKChsYXlvdXRBY3Rpb25zIHx8IGxheW91dEluZm9Cb3hlcykgJiYgKG1lZGlhU2VydmljZS5pc0hhbmRzZXQkIHwgYXN5bmMpID09PSBmYWxzZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByaW1hcnktYWN0aW9uLWNvbnRhaW5lclwiIFtjbGFzcy5ib3R0b21dPVwibWVkaWFTZXJ2aWNlLmlzSGFuZHNldCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYXlvdXRQcmltYXJ5QWN0aW9uXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgPC9kaXY+XG4gICAgQGlmICgobWVkaWFTZXJ2aWNlLmlzSGFuZHNldCQgfCBhc3luYykgJiYgYWN0aW9uc1Rvb2xiYXIpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImFjdGlvbnNUb29sYmFyXCI+PC9uZy1jb250YWluZXI+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhY3Rpb25zVG9vbGJhcj5cbiAgICA8bWF0LXRvb2xiYXJcbiAgICAgICAgaWQ9XCJhY3Rpb25zLXRvb2xiYXJcIlxuICAgICAgICBjbGFzcz1cImFjdGlvbnNcIlxuICAgICAgICBbY29sb3JdPVwidG9vbGJhckNvbG9yXCJcbiAgICAgICAgW2NsYXNzLmJvdHRvbV09XCJtZWRpYVNlcnZpY2UuaXNIYW5kc2V0JCB8IGFzeW5jXCI+XG4gICAgICAgIEBpZiAobGF5b3V0UHJpbWFyeUFjdGlvbiAmJiAobGF5b3V0QWN0aW9ucyB8fCBsYXlvdXRJbmZvQm94ZXMpICYmIChtZWRpYVNlcnZpY2UuaXNIYW5kc2V0JCB8IGFzeW5jKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJpbWFyeS1hY3Rpb24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxheW91dFByaW1hcnlBY3Rpb25cIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGF5b3V0QWN0aW9ucykge1xuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxheW91dEFjdGlvbnNcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICB9XG4gICAgICAgIEBpZiAobGF5b3V0SW5mb0JveGVzICYmIChtZWRpYVNlcnZpY2UuaXNIYW5kc2V0JCB8IGFzeW5jKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWJveGVzLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJsYXlvdXRJbmZvQm94ZXNcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L21hdC10b29sYmFyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNmaWx0ZXI+XG4gICAgQGlmIChsYXlvdXRUb29sYmFyIHx8IGxheW91dFJpZ2h0KSB7XG4gICAgICAgIDxtYXQtdG9vbGJhciBpZD1cInRvb2xiYXJcIiBbY29sb3JdPVwidG9vbGJhckNvbG9yXCI+XG4gICAgICAgICAgICBAaWYgKHdpdGhTaWRlbmF2ICYmIChtZWRpYVNlcnZpY2UuaXNIYW5kc2V0JCB8IGFzeW5jKSAmJiAoc2lkZW5hdlNlcnZpY2Uub3BlbkNoYW5nZWQkIHwgYXN5bmMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwic2lkZW5hdi1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNpZGVuYXZTZXJ2aWNlLnRvZ2dsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAod2l0aEJhY2tCdXR0b24pIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBpZD1cImJhY2stYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0aGlzLmJhY2tCdXR0b25DbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImJhY2tCdXR0b25MYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfYmFjazwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8ZGl2IGlkPVwidG9vbGJhci1jb250ZW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIEBpZiAobGF5b3V0VG9vbGJhcikge1xuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGF5b3V0VG9vbGJhclwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBAaWYgKHNpZGVGaWx0ZXIgJiYgKGtlZXBGaWx0ZXJCdXR0b25EaXNwbGF5ZWQgfHwgKG1lZGlhU2VydmljZS5pc0hhbmRzZXQkIHwgYXN5bmMpKSAmJiBsYXlvdXRSaWdodCkge1xuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGlkPVwiZmlsdGVyLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2lkZUZpbHRlci50b2dnbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJBZmZpY2hlci9NYXNxdWVyIGxlcyBmaWx0cmVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj50dW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAod2l0aENsb3NlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJjbG9zZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRoaXMuY2xvc2VCdXR0b25DbGlja2VkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cImNsb3NlQnV0dG9uTGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9tYXQtdG9vbGJhcj5cbiAgICB9XG5cbiAgICBAaWYgKChsYXlvdXRBY3Rpb25zIHx8IGxheW91dEluZm9Cb3hlcykgJiYgKG1lZGlhU2VydmljZS5pc0hhbmRzZXQkIHwgYXN5bmMpID09PSBmYWxzZSkge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYWN0aW9uc1Rvb2xiYXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICB9XG4gICAgQGlmIChsYXlvdXRSaWdodCkge1xuICAgICAgICA8bWF0LWRyYXdlci1jb250YWluZXIgYXV0b3NpemU9XCJ0cnVlXCI+XG4gICAgICAgICAgICA8bWF0LWRyYXdlci1jb250ZW50PlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L21hdC1kcmF3ZXItY29udGVudD5cbiAgICAgICAgICAgIDxtYXQtZHJhd2VyXG4gICAgICAgICAgICAgICAgaWQ9XCJzaWRlLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgI3NpZGVGaWx0ZXJcbiAgICAgICAgICAgICAgICAoY2xvc2VkKT1cInNpZGVGaWx0ZXJDbG9zZWQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cInNpZGVGaWx0ZXJPcGVuZWQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbj1cImVuZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCIobWVkaWFTZXJ2aWNlLmlzSGFuZHNldCQgfCBhc3luYykgPyAnZGlhbG9nJyA6ICduYXZpZ2F0aW9uJ1wiXG4gICAgICAgICAgICAgICAgW21vZGVdPVwiKG1lZGlhU2VydmljZS5pc0hhbmRzZXQkIHwgYXN5bmMpID8gJ292ZXInIDogJ3NpZGUnXCJcbiAgICAgICAgICAgICAgICBbb3BlbmVkXT1cIihtZWRpYVNlcnZpY2UuaXNIYW5kc2V0JCB8IGFzeW5jKSA9PT0gZmFsc2VcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGF5b3V0UmlnaHRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9tYXQtZHJhd2VyPlxuICAgICAgICA8L21hdC1kcmF3ZXItY29udGFpbmVyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICAgIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=