@esfaenza/core 15.2.42-beta1 → 15.2.42-beta2

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 (146) hide show
  1. package/README.md +24 -24
  2. package/components/components.module.d.ts +22 -16
  3. package/components/{sidebar → page-structure/sidebar}/sidebar.component.d.ts +1 -0
  4. package/components/public-api.d.ts +20 -15
  5. package/components/search/es-filters/es-filters.component.d.ts +27 -0
  6. package/components/search/es-filters/es-filters.service.d.ts +6 -0
  7. package/components/search/filters-sidebar/filters-sidebar.component.d.ts +20 -0
  8. package/components/search/filters-sidebar-item/filters-sidebar-item.component.d.ts +16 -0
  9. package/components/search/filters-sidebar-section/filters-sidebar-section.component.d.ts +9 -0
  10. package/components/search/filters-topbar/filters-topbar.component.d.ts +38 -0
  11. package/domain/models/decorators/decorators.d.ts +1 -0
  12. package/domain/models/user/ChangePasswordDto.d.ts +9 -0
  13. package/domain/models/user/ChangeProfilePictureDto.d.ts +4 -0
  14. package/domain/models/user/UpdateAccountRecoverySettingsDto.d.ts +6 -0
  15. package/domain/public-api.d.ts +4 -0
  16. package/esm2020/components/components.module.mjs +76 -22
  17. package/esm2020/components/es-modal/es-modal-head/es-modal-head.component.mjs +4 -4
  18. package/esm2020/components/es-modal/es-modal.component.mjs +4 -4
  19. package/esm2020/components/page-structure/back-top/back-top.component.mjs +43 -0
  20. package/esm2020/components/page-structure/base/base.component.mjs +55 -0
  21. package/esm2020/components/page-structure/base/reactive.component.mjs +26 -0
  22. package/esm2020/components/page-structure/breadcrumb/breadcrumb.component.mjs +70 -0
  23. package/esm2020/components/page-structure/error/404/pagenotfound.component.mjs +30 -0
  24. package/esm2020/components/page-structure/error/500/servererror.component.mjs +39 -0
  25. package/esm2020/components/page-structure/error/Angular/angularerror.component.mjs +55 -0
  26. package/esm2020/components/page-structure/external-page/external_pages.component.mjs +47 -0
  27. package/esm2020/components/page-structure/jace-login/jace-login.component.mjs +18 -0
  28. package/esm2020/components/page-structure/jace-resource/jace-resource.component.mjs +65 -0
  29. package/esm2020/components/page-structure/navbar/modules-board/jace-modules-board.component.mjs +40 -0
  30. package/esm2020/components/page-structure/navbar/navbar.component.loc.mjs +36 -0
  31. package/esm2020/components/page-structure/navbar/navbar.component.mjs +161 -0
  32. package/esm2020/components/page-structure/page/pages.component.mjs +60 -0
  33. package/esm2020/components/page-structure/redirecter/redirecter.component.mjs +53 -0
  34. package/esm2020/components/page-structure/sidebar/sidebar.component.mjs +302 -0
  35. package/esm2020/components/public-api.mjs +21 -16
  36. package/esm2020/components/search/es-filters/es-filters.component.mjs +56 -0
  37. package/esm2020/components/search/es-filters/es-filters.service.mjs +19 -0
  38. package/esm2020/components/search/filters-sidebar/filters-sidebar.component.mjs +65 -0
  39. package/esm2020/components/search/filters-sidebar-item/filters-sidebar-item.component.mjs +39 -0
  40. package/esm2020/components/search/filters-sidebar-section/filters-sidebar-section.component.mjs +22 -0
  41. package/esm2020/components/search/filters-topbar/filters-topbar.component.mjs +94 -0
  42. package/esm2020/directives/componentHost/componentHost.directive.mjs +4 -4
  43. package/esm2020/directives/directives.module.mjs +5 -5
  44. package/esm2020/directives/draggable/draggable.directive.mjs +4 -4
  45. package/esm2020/directives/es-modal/es-modal.directive.mjs +4 -4
  46. package/esm2020/directives/es-routerLink/es-routerLink.directive.mjs +4 -4
  47. package/esm2020/directives/slim-scroll/slim-scroll.directive.mjs +4 -4
  48. package/esm2020/directives/widget/widget.directive.mjs +4 -4
  49. package/esm2020/domain/models/decorators/decorators.mjs +6 -0
  50. package/esm2020/domain/models/user/ChangePasswordDto.mjs +11 -0
  51. package/esm2020/domain/models/user/ChangeProfilePictureDto.mjs +6 -0
  52. package/esm2020/domain/models/user/UpdateAccountRecoverySettingsDto.mjs +8 -0
  53. package/esm2020/domain/public-api.mjs +5 -1
  54. package/esm2020/lib/app.component.mjs +5 -5
  55. package/esm2020/lib/core.module.mjs +5 -5
  56. package/esm2020/modules/classes/_shared.module.mjs +5 -5
  57. package/esm2020/modules/classes/t_c.module.mjs +5 -5
  58. package/esm2020/pipes/classes/included_in.pipe.mjs +4 -4
  59. package/esm2020/pipes/classes/safe_html.pipe.mjs +4 -4
  60. package/esm2020/pipes/classes/safe_script.pipe.mjs +4 -4
  61. package/esm2020/pipes/classes/safe_style.pipe.mjs +4 -4
  62. package/esm2020/pipes/classes/safe_url.pipe.mjs +4 -4
  63. package/esm2020/pipes/pipes.module.mjs +5 -5
  64. package/esm2020/public-api.mjs +1 -1
  65. package/esm2020/services/classes/app.accesstoken.mjs +4 -4
  66. package/esm2020/services/classes/app.completedjobredirection.mjs +4 -4
  67. package/esm2020/services/classes/app.errorhandler.mjs +4 -4
  68. package/esm2020/services/classes/app.event.mjs +4 -4
  69. package/esm2020/services/classes/app.globalsearch.mjs +4 -4
  70. package/esm2020/services/classes/app.httpextensions.loc.mjs +4 -4
  71. package/esm2020/services/classes/app.httpextensions.mjs +4 -4
  72. package/esm2020/services/classes/app.menufilter.mjs +4 -4
  73. package/esm2020/services/classes/app.routeguard.mjs +4 -4
  74. package/esm2020/services/classes/app.session.mjs +4 -4
  75. package/esm2020/services/classes/app.state.mjs +4 -4
  76. package/esm2020/services/classes/preferences/app.cache.persistor.mjs +4 -4
  77. package/esm2020/services/classes/preferences/app.preference.persistor.mjs +4 -4
  78. package/esm2020/services/classes/preferences/user/app.userpreferences.base.mjs +76 -0
  79. package/esm2020/services/public-api.mjs +2 -1
  80. package/fesm2015/esfaenza-core-components.mjs +413 -82
  81. package/fesm2015/esfaenza-core-components.mjs.map +1 -1
  82. package/fesm2015/esfaenza-core-directives.mjs +22 -22
  83. package/fesm2015/esfaenza-core-directives.mjs.map +1 -1
  84. package/fesm2015/esfaenza-core-domain.mjs +32 -1
  85. package/fesm2015/esfaenza-core-domain.mjs.map +1 -1
  86. package/fesm2015/esfaenza-core-modules.mjs +8 -8
  87. package/fesm2015/esfaenza-core-modules.mjs.map +1 -1
  88. package/fesm2015/esfaenza-core-pipes.mjs +19 -19
  89. package/fesm2015/esfaenza-core-pipes.mjs.map +1 -1
  90. package/fesm2015/esfaenza-core-services.mjs +124 -44
  91. package/fesm2015/esfaenza-core-services.mjs.map +1 -1
  92. package/fesm2015/esfaenza-core.mjs +8 -8
  93. package/fesm2015/esfaenza-core.mjs.map +1 -1
  94. package/fesm2020/esfaenza-core-components.mjs +410 -82
  95. package/fesm2020/esfaenza-core-components.mjs.map +1 -1
  96. package/fesm2020/esfaenza-core-directives.mjs +22 -22
  97. package/fesm2020/esfaenza-core-directives.mjs.map +1 -1
  98. package/fesm2020/esfaenza-core-domain.mjs +32 -1
  99. package/fesm2020/esfaenza-core-domain.mjs.map +1 -1
  100. package/fesm2020/esfaenza-core-modules.mjs +8 -8
  101. package/fesm2020/esfaenza-core-modules.mjs.map +1 -1
  102. package/fesm2020/esfaenza-core-pipes.mjs +19 -19
  103. package/fesm2020/esfaenza-core-pipes.mjs.map +1 -1
  104. package/fesm2020/esfaenza-core-services.mjs +111 -44
  105. package/fesm2020/esfaenza-core-services.mjs.map +1 -1
  106. package/fesm2020/esfaenza-core.mjs +8 -8
  107. package/fesm2020/esfaenza-core.mjs.map +1 -1
  108. package/lib/core.module.d.ts +2 -1
  109. package/package.json +1 -1
  110. package/services/classes/preferences/user/app.userpreferences.base.d.ts +23 -0
  111. package/services/public-api.d.ts +1 -0
  112. package/theme/styles/_project-override.scss +63 -1
  113. package/theme/styles/_variables.scss +1 -1
  114. package/theme/styles/skins/enuma.scss +1 -0
  115. package/theme/styles/skins/jace.scss +63 -0
  116. package/esm2020/components/back-top/back-top.component.mjs +0 -43
  117. package/esm2020/components/base/base.component.mjs +0 -55
  118. package/esm2020/components/base/reactive.component.mjs +0 -26
  119. package/esm2020/components/breadcrumb/breadcrumb.component.mjs +0 -70
  120. package/esm2020/components/error/404/pagenotfound.component.mjs +0 -30
  121. package/esm2020/components/error/500/servererror.component.mjs +0 -39
  122. package/esm2020/components/error/Angular/angularerror.component.mjs +0 -55
  123. package/esm2020/components/external-page/external_pages.component.mjs +0 -47
  124. package/esm2020/components/jace-login/jace-login.component.mjs +0 -18
  125. package/esm2020/components/jace-resource/jace-resource.component.mjs +0 -65
  126. package/esm2020/components/navbar/modules-board/jace-modules-board.component.mjs +0 -40
  127. package/esm2020/components/navbar/navbar.component.loc.mjs +0 -36
  128. package/esm2020/components/navbar/navbar.component.mjs +0 -161
  129. package/esm2020/components/page/pages.component.mjs +0 -60
  130. package/esm2020/components/redirecter/redirecter.component.mjs +0 -53
  131. package/esm2020/components/sidebar/sidebar.component.mjs +0 -293
  132. /package/components/{back-top → page-structure/back-top}/back-top.component.d.ts +0 -0
  133. /package/components/{base → page-structure/base}/base.component.d.ts +0 -0
  134. /package/components/{base → page-structure/base}/reactive.component.d.ts +0 -0
  135. /package/components/{breadcrumb → page-structure/breadcrumb}/breadcrumb.component.d.ts +0 -0
  136. /package/components/{error → page-structure/error}/404/pagenotfound.component.d.ts +0 -0
  137. /package/components/{error → page-structure/error}/500/servererror.component.d.ts +0 -0
  138. /package/components/{error → page-structure/error}/Angular/angularerror.component.d.ts +0 -0
  139. /package/components/{external-page → page-structure/external-page}/external_pages.component.d.ts +0 -0
  140. /package/components/{jace-login → page-structure/jace-login}/jace-login.component.d.ts +0 -0
  141. /package/components/{jace-resource → page-structure/jace-resource}/jace-resource.component.d.ts +0 -0
  142. /package/components/{navbar → page-structure/navbar}/modules-board/jace-modules-board.component.d.ts +0 -0
  143. /package/components/{navbar → page-structure/navbar}/navbar.component.d.ts +0 -0
  144. /package/components/{navbar → page-structure/navbar}/navbar.component.loc.d.ts +0 -0
  145. /package/components/{page → page-structure/page}/pages.component.d.ts +0 -0
  146. /package/components/{redirecter → page-structure/redirecter}/redirecter.component.d.ts +0 -0
@@ -1,293 +0,0 @@
1
- // Angular
2
- import { ChangeDetectionStrategy, Component, HostListener, Inject, Optional, ViewChild, ViewEncapsulation } from "@angular/core";
3
- import { NavigationEnd, RouterLinkActive, RouterLink } from "@angular/router";
4
- import { NgClass, NgFor, NgTemplateOutlet, NgIf } from "@angular/common";
5
- // Configurazioni
6
- import { LocalizationModule } from "@esfaenza/localizations";
7
- // EsFaenza
8
- import { MENU, MENU_LOCALIZATION } from "@esfaenza/core/domain";
9
- import { SlimScroll } from "@esfaenza/core/directives";
10
- // Librerie
11
- import { firstValueFrom } from "rxjs";
12
- import { HttpParams } from "@angular/common/http";
13
- import { EsTableColumnsDefinition, EsTableModule } from "@esfaenza/es-table";
14
- import { FormsModule } from "@angular/forms";
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "@esfaenza/localizations";
17
- import * as i2 from "@angular/router";
18
- import * as i3 from "@esfaenza/core/services";
19
- import * as i4 from "@esfaenza/extensions";
20
- import * as i5 from "@esfaenza/access-control";
21
- import * as i6 from "@esfaenza/httpservice";
22
- import * as i7 from "@esfaenza/es-table";
23
- import * as i8 from "@angular/forms";
24
- // Chiamate ai Repository
25
- const GET_Users_GetProfilePicture = "/api/Users/GetProfilePicture";
26
- export class Sidebar {
27
- constructor(lc, lcMenu, cdr, _elementRef, _router, _state, zone, utiExts, aac, menuItemsRaw, menuFilteringService, sr, https, msgs, globalSearchService) {
28
- this.lc = lc;
29
- this.cdr = cdr;
30
- this._elementRef = _elementRef;
31
- this._router = _router;
32
- this._state = _state;
33
- this.zone = zone;
34
- this.utiExts = utiExts;
35
- this.aac = aac;
36
- this.menuItemsRaw = menuItemsRaw;
37
- this.menuFilteringService = menuFilteringService;
38
- this.sr = sr;
39
- this.https = https;
40
- this.msgs = msgs;
41
- this.globalSearchService = globalSearchService;
42
- this.isMenuCollapsed = false;
43
- this.isMenuShouldCollapsed = false;
44
- this.applicationVersion = myconfig.AppData.ComponentVersion;
45
- this.user = "";
46
- this.tenant = "";
47
- this.SearchModel = "";
48
- // TODO: Salvare dentro una service preferenze account
49
- this.safeprofilepic = null;
50
- // ***************************************** Gestione Ricerca Globale *****************************************
51
- this.SelectedResult = null;
52
- this.ShowSingleTable = false;
53
- this.searchingTerm = false;
54
- this.lc = this.lc.generateFromType(lcMenu);
55
- this._state.subscribe("menu.isCollapsed", (isCollapsed) => {
56
- this.isMenuCollapsed = isCollapsed;
57
- this.cdr.markForCheck();
58
- });
59
- this._state.subscribe("application.DeployAvailable", (available) => {
60
- if (available)
61
- this.ngOnInit();
62
- });
63
- this._router.events.subscribe(event => {
64
- if (event instanceof NavigationEnd) {
65
- let width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
66
- if (width <= 768)
67
- this._state.notifyDataChanged("menu.isCollapsed", true);
68
- window.scrollTo(0, 0);
69
- }
70
- });
71
- this.getUserProfileData();
72
- }
73
- async ngOnInit() {
74
- let tmpMenuItems = this.getMenuItems();
75
- this.menuItems = await firstValueFrom(this.menuFilteringService.filter(tmpMenuItems));
76
- if (this._shouldMenuCollapse())
77
- this.menuCollapse();
78
- this.updateSidebarHeight();
79
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
80
- this.cdr.markForCheck();
81
- }
82
- getMenuItems() {
83
- var items = [];
84
- for (let i = 0; i < this.menuItemsRaw.length; i++) {
85
- let t = this.menuItemsRaw[i];
86
- t.level = 1;
87
- if (!t.ac || this.aac.has(t.ac)) {
88
- if (!t.subMenu || t.subMenu.length == 0)
89
- items.push(t);
90
- else {
91
- var toPush = this.checkSubMenuOverClaims(t, 1);
92
- items.push(toPush);
93
- }
94
- }
95
- }
96
- return items;
97
- }
98
- checkSubMenuOverClaims(menuItem, level) {
99
- var item = this.utiExts.deepClone(menuItem);
100
- item.subMenu = [];
101
- for (let i = 0; i < menuItem.subMenu.length; i++) {
102
- let t = menuItem.subMenu[i];
103
- t.level = level + 1;
104
- if (!t.ac || this.aac.has(t.ac)) {
105
- if (!t.subMenu || t.subMenu.length == 0)
106
- item.subMenu.push(t);
107
- else {
108
- var toPush = this.checkSubMenuOverClaims(t, level + 1);
109
- item.subMenu.push(toPush);
110
- }
111
- }
112
- // Calcolo qui per non doverlo calcolare lato HTML
113
- t.padding_left = level > 2 ? (65 + ((level - 3) * 15) + 'px !important') : null;
114
- }
115
- return item;
116
- }
117
- //#region JQuery
118
- onWindowResize() {
119
- var isMenuShouldCollapsed = this._shouldMenuCollapse();
120
- if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
121
- this.menuCollapseStateChange(isMenuShouldCollapsed);
122
- }
123
- this.isMenuShouldCollapsed = isMenuShouldCollapsed;
124
- this.updateSidebarHeight();
125
- }
126
- _shouldMenuCollapse() {
127
- return window.innerWidth <= 768;
128
- }
129
- menuCollapse() {
130
- this.menuCollapseStateChange(true);
131
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
132
- }
133
- menuCollapseStateChange(isCollapsed) {
134
- this.isMenuCollapsed = isCollapsed;
135
- this._state.notifyDataChanged("menu.isCollapsed", this.isMenuCollapsed);
136
- }
137
- menuExpand() {
138
- this.menuCollapseStateChange(false);
139
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
140
- }
141
- hoverItem(jQueryevent) {
142
- this.showHoverElem = true;
143
- this.hoverElemHeight = jQueryevent.currentTarget.clientHeight;
144
- this.hoverElemTop = jQueryevent.currentTarget.getBoundingClientRect().top;
145
- jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
146
- jQuery(".sidebar-hover-elem").css("height", this.hoverElemHeight + "px");
147
- jQuery(".sidebar-hover-elem").addClass("show-hover-elem");
148
- }
149
- sendAwayHoverElement() {
150
- this.hoverElemTop = -200;
151
- jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
152
- }
153
- updateSidebarHeight() {
154
- let marginTop = 60 + 40;
155
- let footerHeight = 150;
156
- this.menuHeight = this._elementRef.nativeElement.children[0].clientHeight - marginTop - footerHeight;
157
- }
158
- //Nonostante questa funzione sia collegata con (click.out-zone) per qualche motivo angular le esegue comunque nella sua zone
159
- //generando un po' di irresponsività iniziale... succede solo col click... boh
160
- collapseMenu(jQueryevent, item) {
161
- if (this.isMenuCollapsed)
162
- this.menuExpand();
163
- if (!item.level)
164
- console.warn("Livello non presente in un oggetto del menu!");
165
- //N.B: Tutte le funzioni di JQuery le esguo fuori da Angular dato che c'� una buona probabilit� che siano eventi asincroni
166
- this.zone.runOutsideAngular(() => { this.outsideAngularClickHandler(jQueryevent, item); });
167
- return false;
168
- }
169
- outsideAngularClickHandler(jQueryevent, item) {
170
- let levelClass = item.level ? "level-" + (item.level) : "";
171
- let levelClassPlusOne = item.level ? "level-" + (item.level + 1) : "";
172
- let slidePeriod = 400;
173
- var link = jQuery(jQueryevent.currentTarget);
174
- //Se l'elemento non è espanso
175
- if (!link.closest(".sidebar-item-expanded" + "_" + levelClass).length) {
176
- //Tiro su tutti gli elementi dello stesso livello espansi e li chiudo
177
- //Se ho compresso un menu vado a vedere se c'è anche un altro menu di livello pi� basso da richiudere
178
- jQuery("ul.nav-sidebar li" + "." + (levelClassPlusOne)).each(function () {
179
- let closestLi = jQuery(this).closest("li");
180
- if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
181
- closestLi.children("ul").slideUp(slidePeriod);
182
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
183
- closestLi.removeClass("sidebar-item-expanded" + "_" + (levelClassPlusOne));
184
- closestLi.removeClass("sidebar-item-expanded");
185
- }
186
- });
187
- //Dopodich� richiudo tutti quelli del mio livello attuale
188
- jQuery("ul.nav-sidebar li" + "." + levelClass).each(function () {
189
- let closestLi = jQuery(this).closest("li");
190
- if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
191
- closestLi.children("ul").slideUp(slidePeriod);
192
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
193
- closestLi.removeClass("sidebar-item-expanded" + "_" + levelClass);
194
- closestLi.removeClass("sidebar-item-expanded");
195
- }
196
- });
197
- //Dopodich� espando quello attuale
198
- link.next().slideDown(slidePeriod);
199
- if (item.subMenu) {
200
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
201
- link.closest("li").addClass("sidebar-item-expanded" + "_" + levelClass);
202
- link.closest("li").addClass("sidebar-item-expanded");
203
- }
204
- }
205
- else {
206
- //Altrimenti, se l'elemento è già espanso lo chiudo
207
- if (item.subMenu) {
208
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
209
- link.closest("li").removeClass("sidebar-item-expanded" + "_" + levelClass);
210
- link.closest("li").removeClass("sidebar-item-expanded");
211
- }
212
- link.next().slideUp(slidePeriod);
213
- }
214
- }
215
- //#endregion
216
- onChangeTenant() {
217
- window.location.href = `${myconfig.AuthUrl}/login/tenant?client=${myconfig.Client}`;
218
- }
219
- onLogout() {
220
- window.location.href = `${myconfig.AuthUrl}/logout?client=${myconfig.Client}`;
221
- }
222
- getUserProfileData() {
223
- var identity = this.sr.getJaceIdentity();
224
- if (identity) {
225
- this.user = identity.FullName;
226
- this.tenant = identity.TenantName;
227
- // TODO: Mettere logica dentro una service preferenze account
228
- this.https.get(GET_Users_GetProfilePicture, new HttpParams().set('id', identity.IdAccount.toString())).subscribe(t => {
229
- //this._state.setSanitizerPicProfile(t.image);
230
- });
231
- }
232
- }
233
- onSearchRequest() {
234
- console.log("sent!");
235
- this.searchingTerm = true;
236
- this.searchResult = null;
237
- if (!this.globalSearchService.Enabled)
238
- return;
239
- this.globalSearchService.search(this.searchTerm).subscribe(t => {
240
- this.searchingTerm = false;
241
- this.searchResult = t;
242
- this.searchResult.results.forEach(t => {
243
- t.est_cols = t.columns.map(c => {
244
- let colLink = this.globalSearchService.generateColumnLink(c);
245
- return new EsTableColumnsDefinition(c.description, c.id, colLink?.routePath, colLink?.routeProperties);
246
- });
247
- });
248
- });
249
- }
250
- onSearchModelChanged() {
251
- console.log("changed!");
252
- if (!this.searchingTerm)
253
- this.closeSearch();
254
- }
255
- closeSearch() {
256
- this.searchingTerm = false;
257
- this.searchResult = null;
258
- }
259
- FilterSearchResults(item = null) {
260
- this.SelectedResult = null;
261
- this.ShowSingleTable = true;
262
- requestAnimationFrame(() => {
263
- if (item)
264
- this.SelectedResult = this.searchResult?.results?.find(f => f.description == item.description);
265
- else
266
- this.ShowSingleTable = false;
267
- });
268
- }
269
- }
270
- Sidebar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Sidebar, deps: [{ token: i1.LocalizationService }, { token: MENU_LOCALIZATION, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i2.Router }, { token: i3.AppState }, { token: i0.NgZone }, { token: i4.UtilityService }, { token: i5.AccessControlService }, { token: MENU }, { token: i3.MenuFilteringService }, { token: i3.TokenService }, { token: i6.HTTPService }, { token: i4.MessageService }, { token: i3.GlobalSearchService }], target: i0.ɵɵFactoryTarget.Component });
271
- Sidebar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: Sidebar, isStandalone: true, selector: "sidebar", host: { listeners: { "window:resize.out-zone": "onWindowResize()" } }, viewQueries: [{ propertyName: "sidebar", first: true, predicate: ["sidebar"], descendants: true, static: true }], ngImport: i0, template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-logo-img app-logo-placeholder d-flex\">\r\n <div class=\"app-margin-left-10\">\r\n <i style=\"color: #00aeef;\" class=\"fas fa-chevron-left\"></i>&nbsp;\r\n <i style=\"color: #01C38D;\" class=\"fas fa-chevron-right\"></i>&nbsp;&nbsp;\r\n </div>\r\n <div class=\"app-margin-left-10\">Template a15</div>\r\n </div>\r\n <!--<img *ngIf=\"!isMenuCollapsed\" class=\"app-logo-img\" src=\"../dist/assets/img/logo/logo.png\" alt=\"\">\r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"../dist/assets/img/logo/logo_sm.png\" alt=\"\">-->\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight}\">\r\n <li *ngFor=\"let item of menuItems; let last = last;\" \r\n class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\" \r\n [class.has-sub-menu]=\"item.subMenu\"\r\n [class.sidebar-item-expanded]=\"item.expanded\" \r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div class=\"app-padding-15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!safeprofilepic\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"safeprofilepic\">\r\n <img [src]=\"safeprofilepic\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile/user_info']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\">\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\"><i class=\"far fa-right-from-bracket\"></i>&nbsp;Logout</div>\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\"><i class=\"far fa-right-left\"></i>&nbsp;Cambia Tenant</div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link ? item.link : '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <li *ngFor=\"let subitem of item.subMenu\" class=\"sidebar-sublist-item level-{{subitem.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Lato&family=Sora&display=swap\";.app-sidebar{background:#132D46;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid #191E29}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-left:18px!important;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#0e2032}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#183a5a}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid #191E29}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;padding-left:30px!important;height:42px;line-height:42px}.sidebar-sublist li a:hover{background-color:#0e2032}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#183a5a}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#01c38d;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{color:#01c38d!important;font-weight:700!important;background-color:#183a5a}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#132d46;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid #191E29;color:#fff}.app-sidebar-search{height:39px}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-img{width:210px;margin:10px 0 0 10px}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#132d46}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#132d46,rgba(19,45,70,0));height:42px;width:230px;z-index:100}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid #191E29}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#01c38d;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#183a5a;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid #191E29}\n"], dependencies: [{ kind: "directive", type: SlimScroll, selector: "[slim-scroll]", inputs: ["slimScrollOptions"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }, { kind: "ngmodule", type: EsTableModule }, { kind: "component", type: i7.EsTableComponent, selector: "es-table", inputs: ["EsTableTemplate", "CornerMenuOptions", "ColumnsResizable", "ColumnsPinnable", "AutoUpdate", "Height", "EmptySpaceBackgroundColor", "EsTableHandledSearch", "MaxHeight", "ContainerClass", "XLSXExport", "CSVExport", "AllSearch", "HighCellDensity", "Selection", "ShowLoadingOnBootstrap", "Removal", "RemovalCondition", "Export", "ShiftClick", "CountLabel", "HidePaging", "HidePagingCount", "HidePagingButtons", "ContextMenu", "ExportFileName", "TableClass", "ExportFunction", "ExportOnlyVisibleColumns", "HasHeaderGroup", "HasSecondaryHeaderGroup", "HeaderHidden", "BodyHidden", "SelectionDisabled", "SingleSelection", "RowClassAssigner", "OrderByColumn", "MultipleOrderingDirectives", "HiddenColumns", "ColumnsOrdering", "SearchView", "SelectAll", "UseArrayModePaging", "DynamicRowColumnsDefinition", "DynamicOperations", "Hierarchy", "ParentKey", "OwnKey", "StartsExpanded", "SavePreferences", "DefaultAlignment", "PagingStyle", "RowGroupingPagingStyle", "ItemSourceProperty", "UseSelectionCache", "ShowItemGroupsColumns", "Editable", "RangeSelection", "SearchThrottle", "ArraymodeItemsPerPage"], outputs: ["onOrderChanged", "onSearchRequest", "onSelectionChanged", "onRemoval", "onAbortRemoval", "onModelChange", "onOpenContextMenu", "onCornerAction", "onDynamicOperation"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
272
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: Sidebar, decorators: [{
273
- type: Component,
274
- args: [{ selector: "sidebar", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgClass, SlimScroll, NgFor, NgTemplateOutlet, NgIf, RouterLinkActive, RouterLink, LocalizationModule, EsTableModule, FormsModule], template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-logo-img app-logo-placeholder d-flex\">\r\n <div class=\"app-margin-left-10\">\r\n <i style=\"color: #00aeef;\" class=\"fas fa-chevron-left\"></i>&nbsp;\r\n <i style=\"color: #01C38D;\" class=\"fas fa-chevron-right\"></i>&nbsp;&nbsp;\r\n </div>\r\n <div class=\"app-margin-left-10\">Template a15</div>\r\n </div>\r\n <!--<img *ngIf=\"!isMenuCollapsed\" class=\"app-logo-img\" src=\"../dist/assets/img/logo/logo.png\" alt=\"\">\r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"../dist/assets/img/logo/logo_sm.png\" alt=\"\">-->\r\n </div>\r\n </div>\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight}\">\r\n <li *ngFor=\"let item of menuItems; let last = last;\" \r\n class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\" \r\n [class.has-sub-menu]=\"item.subMenu\"\r\n [class.sidebar-item-expanded]=\"item.expanded\" \r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div class=\"app-padding-15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!safeprofilepic\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"safeprofilepic\">\r\n <img [src]=\"safeprofilepic\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile/user_info']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\">\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\"><i class=\"far fa-right-from-bracket\"></i>&nbsp;Logout</div>\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\"><i class=\"far fa-right-left\"></i>&nbsp;Cambia Tenant</div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link ? item.link : '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [attr.style.padding_left]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <li *ngFor=\"let subitem of item.subMenu\" class=\"sidebar-sublist-item level-{{subitem.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Lato&family=Sora&display=swap\";.app-sidebar{background:#132D46;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid #191E29}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-left:18px!important;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#0e2032}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#183a5a}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid #191E29}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;padding-left:30px!important;height:42px;line-height:42px}.sidebar-sublist li a:hover{background-color:#0e2032}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#183a5a}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#01c38d;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{color:#01c38d!important;font-weight:700!important;background-color:#183a5a}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#132d46;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid #191E29;color:#fff}.app-sidebar-search{height:39px}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-img{width:210px;margin:10px 0 0 10px}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#132d46}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#132d46,rgba(19,45,70,0));height:42px;width:230px;z-index:100}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid #191E29}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#01c38d;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#183a5a;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid #191E29}\n"] }]
275
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }, { type: i0.Type, decorators: [{
276
- type: Optional
277
- }, {
278
- type: Inject,
279
- args: [MENU_LOCALIZATION]
280
- }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i2.Router }, { type: i3.AppState }, { type: i0.NgZone }, { type: i4.UtilityService }, { type: i5.AccessControlService }, { type: undefined, decorators: [{
281
- type: Inject,
282
- args: [MENU]
283
- }] }, { type: i3.MenuFilteringService }, { type: i3.TokenService }, { type: i6.HTTPService }, { type: i4.MessageService }, { type: i3.GlobalSearchService }]; }, propDecorators: { sidebar: [{
284
- type: ViewChild,
285
- args: ["sidebar", { static: true }]
286
- }], onWindowResize: [{
287
- type: HostListener,
288
- args: ["window:resize.out-zone"]
289
- }] } });
290
- // TODO: Spostare nel modulo preferenze account
291
- export class ProfilePicture {
292
- }
293
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvc3JjL3NpZGViYXIvc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL2NvbXBvbmVudHMvc3JjL3NpZGViYXIvc2lkZWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBVSxRQUFRLEVBQVEsU0FBUyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlLLE9BQU8sRUFBRSxhQUFhLEVBQVUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekUsaUJBQWlCO0FBQ2pCLE9BQU8sRUFBdUIsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVsRixXQUFXO0FBQ1gsT0FBTyxFQUErQixJQUFJLEVBQUUsaUJBQWlCLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFJbEksT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXZELFdBQVc7QUFDWCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDN0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7O0FBRTdDLHlCQUF5QjtBQUN6QixNQUFNLDJCQUEy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Y0FBYztzQkFEcEIsWUFBWTt1QkFBQyx3QkFBd0I7O0FBeU0xQywrQ0FBK0M7QUFDL0MsTUFBTSxPQUFPLGNBQWM7Q0FFMUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIEluamVjdCwgTmdab25lLCBPcHRpb25hbCwgVHlwZSwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciwgUm91dGVyTGlua0FjdGl2ZSwgUm91dGVyTGluayB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuaW1wb3J0IHsgTmdDbGFzcywgTmdGb3IsIE5nVGVtcGxhdGVPdXRsZXQsIE5nSWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG4vLyBDb25maWd1cmF6aW9uaVxyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlLCBMb2NhbGl6YXRpb25Nb2R1bGUgfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIEVzRmFlbnphXHJcbmltcG9ydCB7IEFwcGxpY2F0aW9uTWVudSwgRW52T3B0aW9ucywgTUVOVSwgTUVOVV9MT0NBTElaQVRJT04sIFNlYXJjaFJlc3VsdCwgU2VhcmNoUmVzdWx0Q29udGFpbmVyIH0gZnJvbSBcIkBlc2ZhZW56YS9jb3JlL2RvbWFpblwiO1xyXG5pbXBvcnQgeyBBcHBTdGF0ZSwgR2xvYmFsU2VhcmNoU2VydmljZSwgTWVudUZpbHRlcmluZ1NlcnZpY2UsIFRva2VuU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvY29yZS9zZXJ2aWNlc1wiO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2FjY2Vzcy1jb250cm9sXCI7XHJcbmltcG9ydCB7IFNsaW1TY3JvbGwgfSBmcm9tIFwiQGVzZmFlbnphL2NvcmUvZGlyZWN0aXZlc1wiO1xyXG5cclxuLy8gTGlicmVyaWVcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBIVFRQU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvaHR0cHNlcnZpY2VcIjtcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBTYWZlUmVzb3VyY2VVcmwgfSBmcm9tIFwiQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlclwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb24sIEVzVGFibGVNb2R1bGUgfSBmcm9tIFwiQGVzZmFlbnphL2VzLXRhYmxlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG4vLyBDaGlhbWF0ZSBhaSBSZXBvc2l0b3J5XHJcbmNvbnN0IEdFVF9Vc2Vyc19HZXRQcm9maWxlUGljdHVyZTogc3RyaW5nID0gXCIvYXBpL1VzZXJzL0dldFByb2ZpbGVQaWN0dXJlXCI7XHJcblxyXG5kZWNsYXJlIHZhciBteWNvbmZpZzogRW52T3B0aW9ucztcclxuZGVjbGFyZSB2YXIgalF1ZXJ5O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJzaWRlYmFyXCIsXHJcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgICBzdHlsZVVybHM6IFtcIi4vc2lkZWJhci5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgIHRlbXBsYXRlVXJsOiBcIi4vc2lkZWJhci5jb21wb25lbnQuaHRtbFwiLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtOZ0NsYXNzLCBTbGltU2Nyb2xsLCBOZ0ZvciwgTmdUZW1wbGF0ZU91dGxldCwgTmdJZiwgUm91dGVyTGlua0FjdGl2ZSwgUm91dGVyTGluaywgTG9jYWxpemF0aW9uTW9kdWxlLCBFc1RhYmxlTW9kdWxlLCBGb3Jtc01vZHVsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFNpZGViYXIge1xyXG4gICAgcHVibGljIG1lbnVJdGVtczogQXJyYXk8YW55PjtcclxuICAgIHB1YmxpYyBtZW51SGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaXNNZW51Q29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNNZW51U2hvdWxkQ29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHVibGljIHNob3dIb3ZlckVsZW06IGJvb2xlYW47XHJcbiAgICBwdWJsaWMgaG92ZXJFbGVtSGVpZ2h0OiBudW1iZXI7XHJcbiAgICBwdWJsaWMgaG92ZXJFbGVtVG9wOiBudW1iZXI7XHJcblxyXG4gICAgcHVibGljIGFwcGxpY2F0aW9uVmVyc2lvbiA9IG15Y29uZmlnLkFwcERhdGEuQ29tcG9uZW50VmVyc2lvbjtcclxuICAgIHB1YmxpYyB1c2VyID0gXCJcIjtcclxuICAgIHB1YmxpYyB0ZW5hbnQgPSBcIlwiO1xyXG5cclxuICAgIHB1YmxpYyBTZWFyY2hNb2RlbCA9IFwiXCI7XHJcblxyXG4gICAgQFZpZXdDaGlsZChcInNpZGViYXJcIiwgeyBzdGF0aWM6IHRydWUgfSkgc2lkZWJhcjogRWxlbWVudFJlZjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwdWJsaWMgbGM6IExvY2FsaXphdGlvblNlcnZpY2UsIEBPcHRpb25hbCgpIEBJbmplY3QoTUVOVV9MT0NBTElaQVRJT04pIGxjTWVudTogVHlwZTxMb2NhbGl6YXRpb25TZXJ2aWNlPiwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgX3JvdXRlcjogUm91dGVyLCBwdWJsaWMgX3N0YXRlOiBBcHBTdGF0ZSwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsIHByaXZhdGUgdXRpRXh0czogVXRpbGl0eVNlcnZpY2UsIHByaXZhdGUgYWFjOiBBY2Nlc3NDb250cm9sU2VydmljZSwgQEluamVjdChNRU5VKSBwcml2YXRlIG1lbnVJdGVtc1JhdzogQXBwbGljYXRpb25NZW51W10sXHJcbiAgICAgICAgcHJpdmF0ZSBtZW51RmlsdGVyaW5nU2VydmljZTogTWVudUZpbHRlcmluZ1NlcnZpY2UsIHB1YmxpYyBzcjogVG9rZW5TZXJ2aWNlLCBwcml2YXRlIGh0dHBzOiBIVFRQU2VydmljZSwgcHJpdmF0ZSBtc2dzOiBNZXNzYWdlU2VydmljZSwgcHVibGljIGdsb2JhbFNlYXJjaFNlcnZpY2U6IEdsb2JhbFNlYXJjaFNlcnZpY2UpIHtcclxuXHJcbiAgICAgICAgdGhpcy5sYyA9IHRoaXMubGMuZ2VuZXJhdGVGcm9tVHlwZShsY01lbnUpO1xyXG5cclxuICAgICAgICB0aGlzLl9zdGF0ZS5zdWJzY3JpYmUoXCJtZW51LmlzQ29sbGFwc2VkXCIsIChpc0NvbGxhcHNlZCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzTWVudUNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fc3RhdGUuc3Vic2NyaWJlKFwiYXBwbGljYXRpb24uRGVwbG95QXZhaWxhYmxlXCIsIChhdmFpbGFibGU6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICAgICAgaWYgKGF2YWlsYWJsZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubmdPbkluaXQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2luZG93LmlubmVyV2lkdGggPiAwKSA/IHdpbmRvdy5pbm5lcldpZHRoIDogc2NyZWVuLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDw9IDc2OCkgXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUubm90aWZ5RGF0YUNoYW5nZWQoXCJtZW51LmlzQ29sbGFwc2VkXCIsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0VXNlclByb2ZpbGVEYXRhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGxldCB0bXBNZW51SXRlbXMgPSB0aGlzLmdldE1lbnVJdGVtcygpO1xyXG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5tZW51RmlsdGVyaW5nU2VydmljZS5maWx0ZXIodG1wTWVudUl0ZW1zKSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9zaG91bGRNZW51Q29sbGFwc2UoKSlcclxuICAgICAgICAgICAgdGhpcy5tZW51Q29sbGFwc2UoKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVTaWRlYmFySGVpZ2h0KCk7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUuc2V0U2lkZWJhcldpZHRoKHRoaXMuc2lkZWJhci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoKTtcclxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1lbnVJdGVtcygpOiBBcHBsaWNhdGlvbk1lbnVbXSB7XHJcbiAgICAgICAgdmFyIGl0ZW1zOiBBcHBsaWNhdGlvbk1lbnVbXSA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWVudUl0ZW1zUmF3Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0ID0gdGhpcy5tZW51SXRlbXNSYXdbaV07XHJcbiAgICAgICAgICAgICg8YW55PnQpLmxldmVsID0gMTtcclxuICAgICAgICAgICAgaWYgKCF0LmFjIHx8IHRoaXMuYWFjLmhhcyh0LmFjKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0LnN1Yk1lbnUgfHwgdC5zdWJNZW51Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2godCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgdG9QdXNoID0gdGhpcy5jaGVja1N1Yk1lbnVPdmVyQ2xhaW1zKHQsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2godG9QdXNoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tTdWJNZW51T3ZlckNsYWltcyhtZW51SXRlbTogQXBwbGljYXRpb25NZW51LCBsZXZlbDogbnVtYmVyKTogQXBwbGljYXRpb25NZW51IHtcclxuICAgICAgICB2YXIgaXRlbTogQXBwbGljYXRpb25NZW51ID0gdGhpcy51dGlFeHRzLmRlZXBDbG9uZShtZW51SXRlbSk7XHJcbiAgICAgICAgaXRlbS5zdWJNZW51ID0gW107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVudUl0ZW0uc3ViTWVudS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IG1lbnVJdGVtLnN1Yk1lbnVbaV07XHJcbiAgICAgICAgICAgICg8YW55PnQpLmxldmVsID0gbGV2ZWwrMTtcclxuICAgICAgICAgICAgaWYgKCF0LmFjIHx8IHRoaXMuYWFjLmhhcyh0LmFjKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0LnN1Yk1lbnUgfHwgdC5zdWJNZW51Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uc3ViTWVudS5wdXNoKHQpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRvUHVzaCA9IHRoaXMuY2hlY2tTdWJNZW51T3ZlckNsYWltcyh0LCBsZXZlbCsxKTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtLnN1Yk1lbnUucHVzaCh0b1B1c2gpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIENhbGNvbG8gcXVpIHBlciBub24gZG92ZXJsbyBjYWxjb2xhcmUgbGF0byBIVE1MXHJcbiAgICAgICAgICAgICg8YW55PnQpLnBhZGRpbmdfbGVmdCA9IGxldmVsID4gMiA/ICg2NSArICgobGV2ZWwgLSAzKSAqIDE1KSArICdweCAhaW1wb3J0YW50JykgOiBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vI3JlZ2lvbiBKUXVlcnlcclxuICAgIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6cmVzaXplLm91dC16b25lXCIpXHJcbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoKTogdm9pZCB7XHJcbiAgICAgICAgdmFyIGlzTWVudVNob3VsZENvbGxhcHNlZCA9IHRoaXMuX3Nob3VsZE1lbnVDb2xsYXBzZSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc01lbnVTaG91bGRDb2xsYXBzZWQgIT09IGlzTWVudVNob3VsZENvbGxhcHNlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1lbnVDb2xsYXBzZVN0YXRlQ2hhbmdlKGlzTWVudVNob3VsZENvbGxhcHNlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNNZW51U2hvdWxkQ29sbGFwc2VkID0gaXNNZW51U2hvdWxkQ29sbGFwc2VkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlU2lkZWJhckhlaWdodCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3Nob3VsZE1lbnVDb2xsYXBzZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gd2luZG93LmlubmVyV2lkdGggPD0gNzY4O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtZW51Q29sbGFwc2UoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tZW51Q29sbGFwc2VTdGF0ZUNoYW5nZSh0cnVlKTtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5zZXRTaWRlYmFyV2lkdGgodGhpcy5zaWRlYmFyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtZW51Q29sbGFwc2VTdGF0ZUNoYW5nZShpc0NvbGxhcHNlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNNZW51Q29sbGFwc2VkID0gaXNDb2xsYXBzZWQ7XHJcbiAgICAgICAgdGhpcy5fc3RhdGUubm90aWZ5RGF0YUNoYW5nZWQoXCJtZW51LmlzQ29sbGFwc2VkXCIsIHRoaXMuaXNNZW51Q29sbGFwc2VkKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWVudUV4cGFuZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLm1lbnVDb2xsYXBzZVN0YXRlQ2hhbmdlKGZhbHNlKTtcclxuICAgICAgICB0aGlzLl9zdGF0ZS5zZXRTaWRlYmFyV2lkdGgodGhpcy5zaWRlYmFyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBob3Zlckl0ZW0oalF1ZXJ5ZXZlbnQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNob3dIb3ZlckVsZW0gPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuaG92ZXJFbGVtSGVpZ2h0ID0galF1ZXJ5ZXZlbnQuY3VycmVudFRhcmdldC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgdGhpcy5ob3ZlckVsZW1Ub3AgPSBqUXVlcnlldmVudC5jdXJyZW50VGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxuXHJcbiAgICAgICAgalF1ZXJ5KFwiLnNpZGViYXItaG92ZXItZWxlbVwiKS5jc3MoXCJ0b3BcIiwgdGhpcy5ob3ZlckVsZW1Ub3AgKyBcInB4XCIpO1xyXG4gICAgICAgIGpRdWVyeShcIi5zaWRlYmFyLWhvdmVyLWVsZW1cIikuY3NzKFwiaGVpZ2h0XCIsIHRoaXMuaG92ZXJFbGVtSGVpZ2h0ICsgXCJweFwiKTtcclxuICAgICAgICBqUXVlcnkoXCIuc2lkZWJhci1ob3Zlci1lbGVtXCIpLmFkZENsYXNzKFwic2hvdy1ob3Zlci1lbGVtXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBzZW5kQXdheUhvdmVyRWxlbWVudCgpIHtcclxuICAgICAgICB0aGlzLmhvdmVyRWxlbVRvcCA9IC0yMDA7XHJcblxyXG4gICAgICAgIGpRdWVyeShcIi5zaWRlYmFyLWhvdmVyLWVsZW1cIikuY3NzKFwidG9wXCIsIHRoaXMuaG92ZXJFbGVtVG9wICsgXCJweFwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2lkZWJhckhlaWdodCgpOiB2b2lkIHtcclxuICAgICAgICBsZXQgbWFyZ2luVG9wID0gNjAgKyA0MDtcclxuICAgICAgICBsZXQgZm9vdGVySGVpZ2h0ID0gMTUwO1xyXG5cclxuICAgICAgICB0aGlzLm1lbnVIZWlnaHQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2hpbGRyZW5bMF0uY2xpZW50SGVpZ2h0IC0gbWFyZ2luVG9wIC0gZm9vdGVySGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vTm9ub3N0YW50ZSBxdWVzdGEgZnVuemlvbmUgc2lhIGNvbGxlZ2F0YSBjb24gKGNsaWNrLm91dC16b25lKSBwZXIgcXVhbGNoZSBtb3Rpdm8gYW5ndWxhciBsZSBlc2VndWUgY29tdW5xdWUgbmVsbGEgc3VhIHpvbmVcclxuICAgIC8vZ2VuZXJhbmRvIHVuIHBvJyBkaSBpcnJlc3BvbnNpdml0w6AgaW5pemlhbGUuLi4gc3VjY2VkZSBzb2xvIGNvbCBjbGljay4uLiBib2hcclxuICAgIHB1YmxpYyBjb2xsYXBzZU1lbnUoalF1ZXJ5ZXZlbnQsIGl0ZW0pOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodGhpcy5pc01lbnVDb2xsYXBzZWQpXHJcbiAgICAgICAgICAgIHRoaXMubWVudUV4cGFuZCgpO1xyXG5cclxuICAgICAgICBpZiAoIWl0ZW0ubGV2ZWwpXHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkxpdmVsbG8gbm9uIHByZXNlbnRlIGluIHVuIG9nZ2V0dG8gZGVsIG1lbnUhXCIpO1xyXG5cclxuICAgICAgICAvL04uQjogVHV0dGUgbGUgZnVuemlvbmkgZGkgSlF1ZXJ5IGxlIGVzZ3VvIGZ1b3JpIGRhIEFuZ3VsYXIgZGF0byBjaGUgYyfvv70gdW5hIGJ1b25hIHByb2JhYmlsaXTvv70gY2hlIHNpYW5vIGV2ZW50aSBhc2luY3JvbmlcclxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4geyB0aGlzLm91dHNpZGVBbmd1bGFyQ2xpY2tIYW5kbGVyKGpRdWVyeWV2ZW50LCBpdGVtKTsgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG91dHNpZGVBbmd1bGFyQ2xpY2tIYW5kbGVyKGpRdWVyeWV2ZW50LCBpdGVtKSB7XHJcbiAgICAgICAgbGV0IGxldmVsQ2xhc3MgPSBpdGVtLmxldmVsID8gXCJsZXZlbC1cIiArIChpdGVtLmxldmVsKSA6IFwiXCI7XHJcbiAgICAgICAgbGV0IGxldmVsQ2xhc3NQbHVzT25lID0gaXRlbS5sZXZlbCA/IFwibGV2ZWwtXCIgKyAoaXRlbS5sZXZlbCArIDEpIDogXCJcIjtcclxuICAgICAgICBsZXQgc2xpZGVQZXJpb2QgPSA0MDA7XHJcblxyXG4gICAgICAgIHZhciBsaW5rID0galF1ZXJ5KGpRdWVyeWV2ZW50LmN1cnJlbnRUYXJnZXQpO1xyXG5cclxuICAgICAgICAvL1NlIGwnZWxlbWVudG8gbm9uIMOoIGVzcGFuc29cclxuICAgICAgICBpZiAoIWxpbmsuY2xvc2VzdChcIi5zaWRlYmFyLWl0ZW0tZXhwYW5kZWRcIiArIFwiX1wiICsgbGV2ZWxDbGFzcykubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIC8vVGlybyBzdSB0dXR0aSBnbGkgZWxlbWVudGkgZGVsbG8gc3Rlc3NvIGxpdmVsbG8gZXNwYW5zaSBlIGxpIGNoaXVkb1xyXG5cclxuICAgICAgICAgICAgLy9TZSBobyBjb21wcmVzc28gdW4gbWVudSB2YWRvIGEgdmVkZXJlIHNlIGMnw6ggYW5jaGUgdW4gYWx0cm8gbWVudSBkaSBsaXZlbGxvIHBp77+9IGJhc3NvIGRhIHJpY2hpdWRlcmVcclxuICAgICAgICAgICAgalF1ZXJ5KFwidWwubmF2LXNpZGViYXIgbGlcIiArIFwiLlwiICsgKGxldmVsQ2xhc3NQbHVzT25lKSkuZWFjaChmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2xvc2VzdExpID0galF1ZXJ5KHRoaXMpLmNsb3Nlc3QoXCJsaVwiKTtcclxuICAgICAgICAgICAgICAgIGlmIChjbG9zZXN0TGkuY2hpbGRyZW4oXCJ1bFwiKS5sZW5ndGggJiYgY2xvc2VzdExpLmhhc0NsYXNzKFwic2lkZWJhci1pdGVtLWV4cGFuZGVkXCIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdExpLmNoaWxkcmVuKFwidWxcIikuc2xpZGVVcChzbGlkZVBlcmlvZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy9MZSB1c28gc2VtcHJlIGVudHJhbWJlIGluc2llbWUuIExhIHByaW1hIMOoIGxhIGNsYXNzZSBwZXIgbGEgbG9naWNhLCBsYSBzZWNvbmRhIHBlciBsZSBhbmltYXppb25pXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdExpLnJlbW92ZUNsYXNzKFwic2lkZWJhci1pdGVtLWV4cGFuZGVkXCIgKyBcIl9cIiArIChsZXZlbENsYXNzUGx1c09uZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RMaS5yZW1vdmVDbGFzcyhcInNpZGViYXItaXRlbS1leHBhbmRlZFwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvL0RvcG9kaWNo77+9IHJpY2hpdWRvIHR1dHRpIHF1ZWxsaSBkZWwgbWlvIGxpdmVsbG8gYXR0dWFsZVxyXG4gICAgICAgICAgICBqUXVlcnkoXCJ1bC5uYXYtc2lkZWJhciBsaVwiICsgXCIuXCIgKyBsZXZlbENsYXNzKS5lYWNoKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGxldCBjbG9zZXN0TGkgPSBqUXVlcnkodGhpcykuY2xvc2VzdChcImxpXCIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RMaS5jaGlsZHJlbihcInVsXCIpLmxlbmd0aCAmJiBjbG9zZXN0TGkuaGFzQ2xhc3MoXCJzaWRlYmFyLWl0ZW0tZXhwYW5kZWRcIikpIHtcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0TGkuY2hpbGRyZW4oXCJ1bFwiKS5zbGlkZVVwKHNsaWRlUGVyaW9kKTtcclxuICAgICAgICAgICAgICAgICAgICAvL0xlIHVzbyBzZW1wcmUgZW50cmFtYmUgaW5zaWVtZS4gTGEgcHJpbWEgw6ggbGEgY2xhc3NlIHBlciBsYSBsb2dpY2EsIGxhIHNlY29uZGEgcGVyIGxlIGFuaW1hemlvbmlcclxuICAgICAgICAgICAgICAgICAgICBjbG9zZXN0TGkucmVtb3ZlQ2xhc3MoXCJzaWRlYmFyLWl0ZW0tZXhwYW5kZWRcIiArIFwiX1wiICsgbGV2ZWxDbGFzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdExpLnJlbW92ZUNsYXNzKFwic2lkZWJhci1pdGVtLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vRG9wb2RpY2jvv70gZXNwYW5kbyBxdWVsbG8gYXR0dWFsZVxyXG4gICAgICAgICAgICBsaW5rLm5leHQoKS5zbGlkZURvd24oc2xpZGVQZXJpb2QpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW0uc3ViTWVudSkge1xyXG4gICAgICAgICAgICAgICAgLy9MZSB1c28gc2VtcHJlIGVudHJhbWJlIGluc2llbWUuIExhIHByaW1hIMOoIGxhIGNsYXNzZSBwZXIgbGEgbG9naWNhLCBsYSBzZWNvbmRhIHBlciBsZSBhbmltYXppb25pXHJcbiAgICAgICAgICAgICAgICBsaW5rLmNsb3Nlc3QoXCJsaVwiKS5hZGRDbGFzcyhcInNpZGViYXItaXRlbS1leHBhbmRlZFwiICsgXCJfXCIgKyBsZXZlbENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGxpbmsuY2xvc2VzdChcImxpXCIpLmFkZENsYXNzKFwic2lkZWJhci1pdGVtLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy9BbHRyaW1lbnRpLCBzZSBsJ2VsZW1lbnRvIMOoIGdpw6AgZXNwYW5zbyBsbyBjaGl1ZG9cclxuICAgICAgICAgICAgaWYgKGl0ZW0uc3ViTWVudSkge1xyXG4gICAgICAgICAgICAgICAgLy9MZSB1c28gc2VtcHJlIGVudHJhbWJlIGluc2llbWUuIExhIHByaW1hIMOoIGxhIGNsYXNzZSBwZXIgbGEgbG9naWNhLCBsYSBzZWNvbmRhIHBlciBsZSBhbmltYXppb25pXHJcbiAgICAgICAgICAgICAgICBsaW5rLmNsb3Nlc3QoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNpZGViYXItaXRlbS1leHBhbmRlZFwiICsgXCJfXCIgKyBsZXZlbENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGxpbmsuY2xvc2VzdChcImxpXCIpLnJlbW92ZUNsYXNzKFwic2lkZWJhci1pdGVtLWV4cGFuZGVkXCIpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsaW5rLm5leHQoKS5zbGlkZVVwKHNsaWRlUGVyaW9kKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyNlbmRyZWdpb25cclxuXHJcbiAgICBwdWJsaWMgb25DaGFuZ2VUZW5hbnQoKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBgJHtteWNvbmZpZy5BdXRoVXJsfS9sb2dpbi90ZW5hbnQ/Y2xpZW50PSR7bXljb25maWcuQ2xpZW50fWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uTG9nb3V0KCkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gYCR7bXljb25maWcuQXV0aFVybH0vbG9nb3V0P2NsaWVudD0ke215Y29uZmlnLkNsaWVudH1gO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRPRE86IFNhbHZhcmUgZGVudHJvIHVuYSBzZXJ2aWNlIHByZWZlcmVuemUgYWNjb3VudFxyXG4gICAgcHVibGljIHNhZmVwcm9maWxlcGljOiBTYWZlUmVzb3VyY2VVcmwgPSBudWxsO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlclByb2ZpbGVEYXRhKCkge1xyXG4gICAgICAgIHZhciBpZGVudGl0eSA9IHRoaXMuc3IuZ2V0SmFjZUlkZW50aXR5KCk7XHJcblxyXG4gICAgICAgIGlmIChpZGVudGl0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnVzZXIgPSBpZGVudGl0eS5GdWxsTmFtZTtcclxuICAgICAgICAgICAgdGhpcy50ZW5hbnQgPSBpZGVudGl0eS5UZW5hbnROYW1lO1xyXG5cclxuICAgICAgICAgICAgLy8gVE9ETzogTWV0dGVyZSBsb2dpY2EgZGVudHJvIHVuYSBzZXJ2aWNlIHByZWZlcmVuemUgYWNjb3VudFxyXG4gICAgICAgICAgICB0aGlzLmh0dHBzLmdldDxQcm9maWxlUGljdHVyZT4oR0VUX1VzZXJzX0dldFByb2ZpbGVQaWN0dXJlLCBuZXcgSHR0cFBhcmFtcygpLnNldCgnaWQnLCBpZGVudGl0eS5JZEFjY291bnQudG9TdHJpbmcoKSkpLnN1YnNjcmliZSh0ID0+IHtcclxuICAgICAgICAgICAgICAgIC8vdGhpcy5fc3RhdGUuc2V0U2FuaXRpemVyUGljUHJvZmlsZSh0LmltYWdlKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEdlc3Rpb25lIFJpY2VyY2EgR2xvYmFsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5cclxuICAgIHB1YmxpYyBTZWxlY3RlZFJlc3VsdDogU2VhcmNoUmVzdWx0ID0gbnVsbDtcclxuICAgIHB1YmxpYyBTaG93U2luZ2xlVGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzZWFyY2hUZXJtOiBzdHJpbmc7XHJcbiAgICBzZWFyY2hpbmdUZXJtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBzZWFyY2hSZXN1bHQ6IFNlYXJjaFJlc3VsdENvbnRhaW5lcjtcclxuXHJcbiAgICBvblNlYXJjaFJlcXVlc3QoKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJzZW50IVwiKVxyXG4gICAgICAgIHRoaXMuc2VhcmNoaW5nVGVybSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hSZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZ2xvYmFsU2VhcmNoU2VydmljZS5FbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZ2xvYmFsU2VhcmNoU2VydmljZS5zZWFyY2godGhpcy5zZWFyY2hUZXJtKS5zdWJzY3JpYmUodCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoaW5nVGVybSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdCA9IHQ7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdC5yZXN1bHRzLmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0LmVzdF9jb2xzID0gdC5jb2x1bW5zLm1hcChjID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29sTGluayA9IHRoaXMuZ2xvYmFsU2VhcmNoU2VydmljZS5nZW5lcmF0ZUNvbHVtbkxpbmsoYyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFc1RhYmxlQ29sdW1uc0RlZmluaXRpb24oYy5kZXNjcmlwdGlvbiwgYy5pZCwgY29sTGluaz8ucm91dGVQYXRoLCBjb2xMaW5rPy5yb3V0ZVByb3BlcnRpZXMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uU2VhcmNoTW9kZWxDaGFuZ2VkKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY2hhbmdlZCFcIilcclxuICAgICAgICBpZiAoIXRoaXMuc2VhcmNoaW5nVGVybSlcclxuICAgICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlU2VhcmNoKCkge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoaW5nVGVybSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBGaWx0ZXJTZWFyY2hSZXN1bHRzKGl0ZW06IFNlYXJjaFJlc3VsdCA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLlNlbGVjdGVkUmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLlNob3dTaW5nbGVUYWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5TZWxlY3RlZFJlc3VsdCA9IHRoaXMuc2VhcmNoUmVzdWx0Py5yZXN1bHRzPy5maW5kKGYgPT4gZi5kZXNjcmlwdGlvbiA9PSBpdGVtLmRlc2NyaXB0aW9uKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5TaG93U2luZ2xlVGFibGUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gVE9ETzogU3Bvc3RhcmUgbmVsIG1vZHVsbyBwcmVmZXJlbnplIGFjY291bnRcclxuZXhwb3J0IGNsYXNzIFByb2ZpbGVQaWN0dXJle1xyXG4gICAgaW1hZ2U6IHN0cmluZztcclxufSIsIjxkaXYgI3NpZGViYXIgY2xhc3M9XCJhcHAtc2lkZWJhclwiIFtjbGFzcy5tZW51LWNvbGxhcHNlZF09XCJpc01lbnVDb2xsYXBzZWRcIiAobW91c2VsZWF2ZS5vdXQtem9uZSk9XCJzZW5kQXdheUhvdmVyRWxlbWVudCgpO1wiPlxyXG4gICAgPCEtLUphY2UgTG9nby0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImFwcC1sb2dvLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtcG9pbnRlclwiIFtyb3V0ZXJMaW5rXT1cIlsnL3BhZ2VzL2Rhc2hib2FyZCddXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBvdmVyZmxvdzogaGlkZGVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNNZW51Q29sbGFwc2VkXCIgY2xhc3M9XCJhcHAtbG9nby1pbWcgYXBwLWxvZ28tcGxhY2Vob2xkZXIgZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW1hcmdpbi1sZWZ0LTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJjb2xvcjogIzAwYWVlZjtcIiBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnRcIj48L2k+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgc3R5bGU9XCJjb2xvcjogIzAxQzM4RDtcIiBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0XCI+PC9pPiZuYnNwOyZuYnNwO1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW1hcmdpbi1sZWZ0LTEwXCI+VGVtcGxhdGUgYTE1PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tPGltZyAqbmdJZj1cIiFpc01lbnVDb2xsYXBzZWRcIiBjbGFzcz1cImFwcC1sb2dvLWltZ1wiIHNyYz1cIi4uL2Rpc3QvYXNzZXRzL2ltZy9sb2dvL2xvZ28ucG5nXCIgYWx0PVwiXCI+XHJcbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJpc01lbnVDb2xsYXBzZWRcIiBjbGFzcz1cImFwcC1sb2dvLWltZy1zbVwiIHNyYz1cIi4uL2Rpc3QvYXNzZXRzL2ltZy9sb2dvL2xvZ29fc20ucG5nXCIgYWx0PVwiXCI+LS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCIhaXNNZW51Q29sbGFwc2VkXCIgY2xhc3M9XCJhcHAtc2lkZWJhci1zZWFyY2hcIj5cclxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIHJvbGU9XCJzZWFyY2hcIiBjbGFzcz1cImFwcC1zZWFyY2hcIiAobmdTdWJtaXQpPVwib25TZWFyY2hSZXF1ZXN0KClcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJSaWNlcmNhLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXJtXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hNb2RlbENoYW5nZWQoKVwiIG5hbWU9XCJzZWFyY2hcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxyXG4gICAgICAgICAgICA8YT48aSBjbGFzcz1cImZhciBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPjwvYT5cclxuICAgICAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwhLS1CYXJyYSBsYXRlcmFsZSBjb24gdHV0dGUgbGUgdm9jaSBkaSBNZW51LS0+XHJcbiAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXNpZGViYXIgZmxleC1jb2x1bW4gZmxleC1ub3dyYXBcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZTsgem9vbTogMVwiIHNsaW0tc2Nyb2xsIFtzbGltU2Nyb2xsT3B0aW9uc109XCJ7aGVpZ2h0OiBtZW51SGVpZ2h0fVwiPlxyXG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBtZW51SXRlbXM7IGxldCBsYXN0ID0gbGFzdDtcIiBcclxuICAgICAgICAgICAgY2xhc3M9XCJzaWRlYmFyLWxpc3QtaXRlbSBsZXZlbC17e2l0ZW0ubGV2ZWx9fVwiIFxyXG4gICAgICAgICAgICBbc3R5bGUubWFyZ2luLWJvdHRvbV09XCJsYXN0ID8gJzQycHgnIDogJzBweCdcIiBcclxuICAgICAgICAgICAgW2NsYXNzLmhhcy1zdWItbWVudV09XCJpdGVtLnN1Yk1lbnVcIlxyXG4gICAgICAgICAgICBbY2xhc3Muc2lkZWJhci1pdGVtLWV4cGFuZGVkXT1cIml0ZW0uZXhwYW5kZWRcIiBcclxuICAgICAgICAgICAgW2NsYXNzLnNpZGViYXItaXRlbS13aXBdPVwiaXRlbS53aXBcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1lbnVJdGVtOyBjb250ZXh0IDogeyAkaW1wbGljaXQ6IGl0ZW0gfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gICAgPCEtLVNlbGV0dG9yZSBCYXJyYSBkZWkgTWVudS0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInNpZGViYXItaG92ZXItZWxlbVwiPjwvZGl2PlxyXG4gICAgPCEtLUZvb3Rlci0tPlxyXG4gICAgPGRpdiAqbmdJZj1cIiFpc01lbnVDb2xsYXBzZWRcIiBjbGFzcz1cImFwcC1zaWRlYmFyLWZvb3RlclwiPlxyXG4gICAgICAgIDwhLS1NaW51c2NvbG8gZmFkZSB0cmEgc2lkZWJhciBlIGluaXppbyBmb290ZXItLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpZGViYXItZm9vdGVyLWZhZGVcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXBhZGRpbmctMTVcIj5cclxuICAgICAgICAgICAgPCEtLUluZm9ybWF6aW9uaSB1dGVudGUgY29sbGVnYXRvLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2lkZWJhci1mb290ZXItdXNlci1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDwhLS1NZW50cmUgc3RvIGFuY29yYSBjYXJpY2FuZG8gbGEgUHJvZmlsZVBpYyBtaSBhc3NpY3VybyBkaSBtb3N0cmFyZSB1biBwbGFjZWhvbGRlci0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFzYWZlcHJvZmlsZXBpY1wiIGNsYXNzPVwiYXBwLXNpZGViYXItZm9vdGVyLXVzZXItaW1nLXBsYWNlaG9sZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtMnggZmEtc3Bpbm5lciBmYS1zcGluLXB1bHNlXCIgc3R5bGU9XCJjb2xvcjogYmxhY2s7IG1hcmdpbi10b3A6IDVweDtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS1VbmEgdm9sdGEgY2FyaWNhdGEgbGEgUHJvZmlsZVBpYyBuYXNjb25kbyBpbCBwbGFjZWhvbGRlciBlIGxhIG1vc3Ryby0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNhZmVwcm9maWxlcGljXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInNhZmVwcm9maWxlcGljXCIgYWx0PVwiXCIgY2xhc3M9XCJhcHAtc2lkZWJhci1mb290ZXItdXNlci1pbWcgYXBwLXBvaW50ZXJcIiBbcm91dGVyTGlua109XCJbJy9wYWdlcy9wcm9maWxlL3VzZXJfaW5mbyddXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zaWRlYmFyLWZvb3Rlci11c2VyLXN0YXR1c1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8IS0tVXNlcm5hbWUgYW5pbWF0byBxdWFuZG8gc3VwZXJhIGkgMTUgY2FyYXR0ZXJpLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpZGViYXItZm9vdGVyLXVzZXItbmFtZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidXNlcm5hbWUtdGV4dFwiIFtjbGFzcy51c2VybmFtZS10ZXh0LWFuaW1hdG9yXT1cInVzZXI/Lmxlbmd0aCA+IDE1XCI+e3t1c2VyfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGVuYW50bmFtZS10ZXh0XCI+e3t0ZW5hbnR9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tT3BlcmF6aW9uaSByYXBpZGUgKExvZ291dCwgQ2FtYmlhIHRlbmFudCwgR3VpZGEsIFN1cHBvcnRvLC4uLiktLT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zaWRlYmFyLWZvb3Rlci1xdWljay1vcHNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uTG9nb3V0KCk7XCIgY2xhc3M9XCJhcHAtc2lkZWJhci1mb290ZXItb3AgYXBwLW5vLXNlbGVjdGlvblwiPjxpIGNsYXNzPVwiZmFyIGZhLXJpZ2h0LWZyb20tYnJhY2tldFwiPjwvaT4mbmJzcDtMb2dvdXQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uQ2hhbmdlVGVuYW50KCk7XCIgY2xhc3M9XCJhcHAtc2lkZWJhci1mb290ZXItb3AgYXBwLW5vLXNlbGVjdGlvblwiPjxpIGNsYXNzPVwiZmFyIGZhLXJpZ2h0LWxlZnRcIj48L2k+Jm5ic3A7Q2FtYmlhIFRlbmFudDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPCEtLVZlcnNpb25lIGNvcnJlbnRlIGFwcGxpY2F6aW9uZS0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNpZGViYXItZm9vdGVyLXZlclwiPlxyXG4gICAgICAgICAgICAgICAgdnt7YXBwbGljYXRpb25WZXJzaW9ufX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48bmctdGVtcGxhdGUgI21lbnVJdGVtIGxldC1pdGVtPlxyXG4gICAgPGEgW2F0dHIuc3R5bGUucGFkZGluZ19sZWZ0XT1cIml0ZW0ucGFkZGluZ19sZWZ0XCIgKm5nSWY9XCIoIWl0ZW0ucm91dGVyTGluayAmJiAhaXRlbS5zdWJNZW51KSB8fCBpdGVtLndpcFwiIFtocmVmXT1cIml0ZW0ubGluayA/IGl0ZW0ubGluayA6ICcjJ1wiIChjbGljayk9XCJpdGVtLndpcCAmJiAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwic2lkZWJhci1saXN0LWxpbmsge3tpdGVtLmNzc0NsYXNzIHx8ICcnfX1cIiAobW91c2VlbnRlci5vdXQtem9uZSk9XCJob3Zlckl0ZW0oJGV2ZW50KVwiPlxyXG4gICAgICAgIDxpICpuZ0lmPVwiaXRlbS5pY29uXCIgY2xhc3M9XCJ7eyBpdGVtLmljb24gfX1cIj48L2k+PHNwYW4+e3sgaXRlbS50aXRsZSB8IGxvY2FsaXplIDogbGMgfX08L3NwYW4+XHJcbiAgICA8L2E+XHJcblxyXG4gICAgPGEgW2F0dHIuc3R5bGUucGFkZGluZ19sZWZ0XT1cIml0ZW0ucGFkZGluZ19sZWZ0XCIgKm5nSWY9XCJpdGVtLnJvdXRlckxpbmsgJiYgIWl0ZW0uc3ViTWVudSAmJiAhaXRlbS53aXBcIiBjbGFzcz1cInNpZGViYXItbGlzdC1saW5rIHt7aXRlbS5jc3NDbGFzcyB8fCAnJ319XCIgW3JvdXRlckxpbmtdPVwiW2l0ZW0ucm91dGVyTGlua11cIiBbcXVlcnlQYXJhbXNdPVwiaXRlbS5xdWVyeVBhcmFtc1wiIHJvdXRlckxpbmtBY3RpdmU9XCJhY3RpdmUtbGlua1wiIChjbGljay5vdXQtem9uZSk9XCJjb2xsYXBzZU1lbnUoJGV2ZW50LCBpdGVtKVwiIChtb3VzZWVudGVyLm91dC16b25lKT1cImhvdmVySXRlbSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGkgKm5nSWY9XCJpdGVtLmljb25cIiBjbGFzcz1cInt7IGl0ZW0uaWNvbiB9fVwiPjwvaT48c3Bhbj57eyBpdGVtLnRpdGxlIHwgbG9jYWxpemUgOiBsYyB9fTwvc3Bhbj5cclxuICAgIDwvYT5cclxuXHJcbiAgICA8YSBbYXR0ci5zdHlsZS5wYWRkaW5nX2xlZnRdPVwiaXRlbS5wYWRkaW5nX2xlZnRcIiAqbmdJZj1cIml0ZW0uc3ViTWVudSAmJiAhaXRlbS53aXBcIiAoY2xpY2sub3V0LXpvbmUpPVwiY29sbGFwc2VNZW51KCRldmVudCwgaXRlbSlcIiBbYXR0ci5ocmVmXT1cIicnXCIgY2xhc3M9XCJzaWRlYmFyLWxpc3QtbGluayB7e2l0ZW0uY3NzQ2xhc3MgfHwgJyd9fVwiIChtb3VzZWVudGVyLm91dC16b25lKT1cImhvdmVySXRlbSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGkgKm5nSWY9XCJpdGVtLmljb25cIiBjbGFzcz1cInt7IGl0ZW0uaWNvbiB9fVwiPjwvaT48c3Bhbj57eyBpdGVtLnRpdGxlIHwgbG9jYWxpemUgOiBsYyB9fTwvc3Bhbj5cclxuICAgICAgICA8YiBjbGFzcz1cImZhIGZhLWFuZ2xlLWRvd25cIj48L2I+XHJcbiAgICA8L2E+XHJcblxyXG4gICAgPHVsICpuZ0lmPVwiaXRlbS5zdWJNZW51XCIgY2xhc3M9XCJzaWRlYmFyLXN1Ymxpc3RcIj5cclxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHN1Yml0ZW0gb2YgaXRlbS5zdWJNZW51XCIgY2xhc3M9XCJzaWRlYmFyLXN1Ymxpc3QtaXRlbSBsZXZlbC17e3N1Yml0ZW0ubGV2ZWx9fVwiIFtjbGFzcy5zaWRlYmFyLWl0ZW0td2lwXT1cInN1Yml0ZW0ud2lwXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtZW51SXRlbTsgY29udGV4dCA6IHskaW1wbGljaXQ6IHN1Yml0ZW19XCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48IS0tIE92ZXJsYXkgcGVyIGxhIHJpY2VyY2EgZ2xvYmFsZSAtLT5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaGluZ1Rlcm0gfHwgc2VhcmNoUmVzdWx0XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXBwLWFic29sdXRlIGFwcC1zZWFyY2gtYmFja2dyb3VuZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VhcmNoLXJlc3VsdC1ib3hcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaGluZ1Rlcm1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VhcmNoLWNhcmRcIj48aSBjbGFzcz1cImZhIGZhLXNwaW5uZXIgZmEtc3BpblwiPjwvaT5TdG8gZWZmZXR0dWFuZG8gbGEgcmljZXJjYS4uLjwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlYXJjaFJlc3VsdCAmJiAhc2VhcmNoaW5nVGVybVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3BhemlvIGEgc2luaXN0cmEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCbG9jY28gY29uIGxlIGNhdGVnb3JpZSBkZWkgcmlzdWx0YXRpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXNlYXJjaC1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLXJlbGF0aXZlXCI+PGEgY2xhc3M9XCJmYSBmYS10aW1lcyB0ZXh0LWRhbmdlciBhcHAtYWJzb2x1dGUgYXBwLXJpZ2h0LTAgYXBwLWZzLTIwIGFwcC1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlU2VhcmNoKCk7XCI+PC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0PkNhdGVnb3JpZSBkaSBSaWNlcmNhPC9oND5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtcG9pbnRlciBhcHAtbGlua1wiIFtjbGFzcy5hcHAtYm9sZF09XCIhU2VsZWN0ZWRSZXN1bHQgJiYgIVNob3dTaW5nbGVUYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJGaWx0ZXJTZWFyY2hSZXN1bHRzKClcIj57e1NlbGVjdGVkUmVzdWx0ID8gJy0nIDogJz4nfX0gTW9zdHJhIFR1dHRvPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlYXJjaFJlc3VsdC5yZXN1bHRzXCIgY2xhc3M9XCJhcHAtcG9pbnRlciBhcHAtbGlua1wiIFtjbGFzcy5hcHAtYm9sZF09XCJTZWxlY3RlZFJlc3VsdD8uZGVzY3JpcHRpb24gPT0gaXRlbS5kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIChjbGljayk9XCJGaWx0ZXJTZWFyY2hSZXN1bHRzKGl0ZW0pXCI+e3tTZWxlY3RlZFJlc3VsdD8uZGVzY3JpcHRpb24gPT0gaXRlbS5kZXNjcmlwdGlvbiA/ICc+JyA6ICctJ319IE1vc3RyYSB7e2l0ZW0uZGVzY3JpcHRpb259fSAoe3tpdGVtLml0ZW1zPy5sZW5ndGh9fSk8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEZXR0YWdsaW8gcmlzdWx0YXRpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFTZWxlY3RlZFJlc3VsdCAmJiAhU2hvd1NpbmdsZVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByZXMgb2Ygc2VhcmNoUmVzdWx0LnJlc3VsdHM7IGxldCBpID0gaW5kZXg7XCIgY2xhc3M9XCJhcHAtc2VhcmNoLWNhcmRcIiBbc3R5bGUubWFyZ2luLWJvdHRvbS5weF09XCJpID09IChzZWFyY2hSZXN1bHQucmVzdWx0cz8ubGVuZ3RoIC0gMSkgPyAyIDogMTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQ+e3tyZXMuZGVzY3JpcHRpb259fTwvaDQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVzLXRhYmxlIFsobmdNb2RlbCldPVwicmVzLml0ZW1zXCIgW0R5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbl09XCJyZXMuZXN0X2NvbHNcIiBbQXJyYXltb2RlSXRlbXNQZXJQYWdlXT1cIjEwXCI+PC9lcy10YWJsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNlbGVjdGVkUmVzdWx0ICYmIFNob3dTaW5nbGVUYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1zZWFyY2gtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoND57e1NlbGVjdGVkUmVzdWx0LmRlc2NyaXB0aW9ufX08L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlcy10YWJsZSBbKG5nTW9kZWwpXT1cIlNlbGVjdGVkUmVzdWx0Lml0ZW1zXCIgW0R5bmFtaWNSb3dDb2x1bW5zRGVmaW5pdGlvbl09XCJTZWxlY3RlZFJlc3VsdC5lc3RfY29sc1wiIFtBcnJheW1vZGVJdGVtc1BlclBhZ2VdPVwiMTBcIj48L2VzLXRhYmxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gU3BhemlvIGEgZGVzdHJhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==