barsa-tiles 1.0.456 → 2.0.2

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 (172) hide show
  1. package/{esm2020 → esm2022}/barsa-tiles.mjs +4 -4
  2. package/esm2022/lib/action-item/action-item.component.mjs +17 -0
  3. package/{esm2020 → esm2022}/lib/action-links.pipe.mjs +16 -16
  4. package/esm2022/lib/actions-link/actions-link.component.mjs +41 -0
  5. package/esm2022/lib/app-finder/app-finder.component.mjs +52 -0
  6. package/esm2022/lib/app-finder-app-list/app-finder-app-list.component.mjs +39 -0
  7. package/esm2022/lib/app-finder-group/app-finder-group.component.mjs +41 -0
  8. package/esm2022/lib/app-finder.service.mjs +121 -0
  9. package/esm2022/lib/barsa-shellbar/barsa-shellbar.component.mjs +183 -0
  10. package/esm2022/lib/barsa-tiles.module.mjs +225 -0
  11. package/esm2022/lib/change-app-tile/change-app-tile.component.mjs +46 -0
  12. package/esm2022/lib/create-app-group/create-app-group.component.mjs +43 -0
  13. package/esm2022/lib/directives/emptylist.directive.mjs +36 -0
  14. package/esm2022/lib/feed-tile/feed-tile.component.mjs +31 -0
  15. package/{esm2020 → esm2022}/lib/footer-edit-tile/footer-edit-tile.component.mjs +13 -13
  16. package/esm2022/lib/footer-tile/footer-tile.component.mjs +27 -0
  17. package/esm2022/lib/form-app-finder/form-app-finder.component.mjs +95 -0
  18. package/esm2022/lib/form-tile/form-tile.component.mjs +34 -0
  19. package/esm2022/lib/logo-tile/logo-tile.component.mjs +23 -0
  20. package/{esm2020 → esm2022}/lib/micro-tile-chart-area/micro-tile-chart-area.component.mjs +40 -40
  21. package/{esm2020 → esm2022}/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.mjs +29 -29
  22. package/esm2022/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +26 -0
  23. package/{esm2020 → esm2022}/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.mjs +20 -20
  24. package/{esm2020 → esm2022}/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.mjs +31 -31
  25. package/{esm2020 → esm2022}/lib/micro-tile-chart-line/micro-tile-chart-line.component.mjs +32 -32
  26. package/{esm2020 → esm2022}/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.mjs +27 -27
  27. package/{esm2020 → esm2022}/lib/models/app-tile-footer-section.mjs +1 -1
  28. package/{esm2020 → esm2022}/lib/models/app-tile-footer.mjs +1 -1
  29. package/{esm2020 → esm2022}/lib/models/app-tile-group-pin.mjs +1 -1
  30. package/esm2022/lib/models/base-bt-tile-component.mjs +26 -0
  31. package/{esm2020 → esm2022}/lib/models/base-tile-component.mjs +58 -58
  32. package/{esm2020 → esm2022}/lib/models/base-tile-setting.mjs +1 -1
  33. package/{esm2020 → esm2022}/lib/models/feed-tile-setting.mjs +1 -1
  34. package/{esm2020 → esm2022}/lib/models/index.mjs +13 -13
  35. package/{esm2020 → esm2022}/lib/models/logo-tile-setting.mjs +1 -1
  36. package/{esm2020 → esm2022}/lib/models/micro-tile-chart-bullet-setting.mjs +1 -1
  37. package/{esm2020 → esm2022}/lib/models/news-tile-setting.mjs +1 -1
  38. package/{esm2020 → esm2022}/lib/models/numeric-tile-setting.mjs +1 -1
  39. package/{esm2020 → esm2022}/lib/models/profile-tile-setting.mjs +1 -1
  40. package/esm2022/lib/models/tile-setting.mjs +2 -0
  41. package/{esm2020 → esm2022}/lib/models/user-portal-settings.mjs +1 -1
  42. package/esm2022/lib/news-tile/news-tile.component.mjs +53 -0
  43. package/esm2022/lib/notification-group/notification-group.component.mjs +116 -0
  44. package/esm2022/lib/notification-group-header/notification-group-header.component.mjs +38 -0
  45. package/esm2022/lib/numeric-tile/numeric-tile.component.mjs +64 -0
  46. package/esm2022/lib/pin-tile/pin-tile.component.mjs +110 -0
  47. package/esm2022/lib/pipes/group-tiles.pipe.mjs +31 -0
  48. package/{esm2020 → esm2022}/lib/pipes/home-group.pipe.mjs +17 -17
  49. package/esm2022/lib/pipes/tile-home-filter.pipe.mjs +28 -0
  50. package/esm2022/lib/pipes/tile-prop.pipe.mjs +32 -0
  51. package/esm2022/lib/popover-app-finder/filter-apps-grouped.pipe.mjs +36 -0
  52. package/esm2022/lib/popover-app-finder/popover-app-finder.component.mjs +112 -0
  53. package/esm2022/lib/profile-tile/profile-tile.component.mjs +25 -0
  54. package/esm2022/lib/shellbar/shellbar.component.mjs +201 -0
  55. package/esm2022/lib/simple-tile/simple-tile.component.mjs +22 -0
  56. package/esm2022/lib/tile/tile.component.mjs +70 -0
  57. package/esm2022/lib/tile-renderer.directive.mjs +70 -0
  58. package/esm2022/lib/tile-style.directive.mjs +29 -0
  59. package/esm2022/lib/tiles-viewer/tiles-viewer.component.mjs +167 -0
  60. package/esm2022/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +164 -0
  61. package/esm2022/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +88 -0
  62. package/esm2022/lib/tiles-viewer.service.mjs +130 -0
  63. package/esm2022/lib/tiles.service.mjs +589 -0
  64. package/{esm2020 → esm2022}/public-api.mjs +46 -45
  65. package/fesm2022/barsa-tiles.mjs +3179 -0
  66. package/fesm2022/barsa-tiles.mjs.map +1 -0
  67. package/index.d.ts +5 -5
  68. package/lib/action-item/action-item.component.d.ts +6 -6
  69. package/lib/action-links.pipe.d.ts +7 -7
  70. package/lib/actions-link/actions-link.component.d.ts +17 -17
  71. package/lib/app-finder/app-finder.component.d.ts +24 -24
  72. package/lib/app-finder-app-list/app-finder-app-list.component.d.ts +20 -20
  73. package/lib/app-finder-group/app-finder-group.component.d.ts +14 -14
  74. package/lib/app-finder.service.d.ts +33 -33
  75. package/lib/barsa-shellbar/barsa-shellbar.component.d.ts +104 -97
  76. package/lib/barsa-tiles.module.d.ts +91 -86
  77. package/lib/change-app-tile/change-app-tile.component.d.ts +20 -20
  78. package/lib/create-app-group/create-app-group.component.d.ts +19 -19
  79. package/lib/directives/emptylist.directive.d.ts +14 -14
  80. package/lib/feed-tile/feed-tile.component.d.ts +11 -11
  81. package/lib/footer-edit-tile/footer-edit-tile.component.d.ts +6 -6
  82. package/lib/footer-tile/footer-tile.component.d.ts +11 -11
  83. package/lib/form-app-finder/form-app-finder.component.d.ts +38 -38
  84. package/lib/form-tile/form-tile.component.d.ts +24 -24
  85. package/lib/logo-tile/logo-tile.component.d.ts +7 -7
  86. package/lib/micro-tile-chart-area/micro-tile-chart-area.component.d.ts +8 -8
  87. package/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.d.ts +12 -12
  88. package/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.d.ts +16 -16
  89. package/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.d.ts +7 -7
  90. package/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.d.ts +8 -8
  91. package/lib/micro-tile-chart-line/micro-tile-chart-line.component.d.ts +8 -8
  92. package/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.d.ts +8 -8
  93. package/lib/models/app-tile-footer-section.d.ts +6 -6
  94. package/lib/models/app-tile-footer.d.ts +8 -8
  95. package/lib/models/app-tile-group-pin.d.ts +5 -5
  96. package/lib/models/base-bt-tile-component.d.ts +9 -9
  97. package/lib/models/base-tile-component.d.ts +26 -26
  98. package/lib/models/base-tile-setting.d.ts +5 -5
  99. package/lib/models/feed-tile-setting.d.ts +7 -7
  100. package/lib/models/index.d.ts +13 -13
  101. package/lib/models/logo-tile-setting.d.ts +6 -6
  102. package/lib/models/micro-tile-chart-bullet-setting.d.ts +10 -10
  103. package/lib/models/news-tile-setting.d.ts +4 -4
  104. package/lib/models/numeric-tile-setting.d.ts +9 -9
  105. package/lib/models/profile-tile-setting.d.ts +7 -7
  106. package/lib/models/tile-setting.d.ts +10 -10
  107. package/lib/models/user-portal-settings.d.ts +9 -9
  108. package/lib/news-tile/news-tile.component.d.ts +19 -19
  109. package/lib/notification-group/notification-group.component.d.ts +54 -55
  110. package/lib/notification-group-header/notification-group-header.component.d.ts +15 -15
  111. package/lib/numeric-tile/numeric-tile.component.d.ts +16 -12
  112. package/lib/pin-tile/pin-tile.component.d.ts +30 -30
  113. package/lib/pipes/group-tiles.pipe.d.ts +14 -14
  114. package/lib/pipes/home-group.pipe.d.ts +9 -9
  115. package/lib/pipes/tile-home-filter.pipe.d.ts +8 -8
  116. package/lib/pipes/tile-prop.pipe.d.ts +8 -8
  117. package/lib/popover-app-finder/filter-apps-grouped.pipe.d.ts +13 -0
  118. package/lib/popover-app-finder/popover-app-finder.component.d.ts +39 -0
  119. package/lib/profile-tile/profile-tile.component.d.ts +7 -7
  120. package/lib/shellbar/shellbar.component.d.ts +94 -94
  121. package/lib/simple-tile/simple-tile.component.d.ts +10 -10
  122. package/lib/tile/tile.component.d.ts +22 -20
  123. package/lib/tile-renderer.directive.d.ts +28 -28
  124. package/lib/tile-style.directive.d.ts +12 -0
  125. package/lib/tiles-viewer/tiles-viewer.component.d.ts +65 -63
  126. package/lib/tiles-viewer-container/tiles-viewer-container.component.d.ts +59 -57
  127. package/lib/tiles-viewer-group/tiles-viewer-group.component.d.ts +39 -39
  128. package/lib/tiles-viewer.service.d.ts +42 -42
  129. package/lib/tiles.service.d.ts +75 -75
  130. package/package.json +7 -13
  131. package/public-api.d.ts +42 -41
  132. package/esm2020/lib/action-item/action-item.component.mjs +0 -18
  133. package/esm2020/lib/actions-link/actions-link.component.mjs +0 -42
  134. package/esm2020/lib/app-finder/app-finder.component.mjs +0 -53
  135. package/esm2020/lib/app-finder-app-list/app-finder-app-list.component.mjs +0 -40
  136. package/esm2020/lib/app-finder-group/app-finder-group.component.mjs +0 -42
  137. package/esm2020/lib/app-finder.service.mjs +0 -121
  138. package/esm2020/lib/barsa-shellbar/barsa-shellbar.component.mjs +0 -166
  139. package/esm2020/lib/barsa-tiles.module.mjs +0 -206
  140. package/esm2020/lib/change-app-tile/change-app-tile.component.mjs +0 -47
  141. package/esm2020/lib/create-app-group/create-app-group.component.mjs +0 -44
  142. package/esm2020/lib/directives/emptylist.directive.mjs +0 -36
  143. package/esm2020/lib/feed-tile/feed-tile.component.mjs +0 -32
  144. package/esm2020/lib/footer-tile/footer-tile.component.mjs +0 -28
  145. package/esm2020/lib/form-app-finder/form-app-finder.component.mjs +0 -95
  146. package/esm2020/lib/form-tile/form-tile.component.mjs +0 -35
  147. package/esm2020/lib/logo-tile/logo-tile.component.mjs +0 -23
  148. package/esm2020/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +0 -27
  149. package/esm2020/lib/models/base-bt-tile-component.mjs +0 -30
  150. package/esm2020/lib/models/tile-setting.mjs +0 -2
  151. package/esm2020/lib/news-tile/news-tile.component.mjs +0 -54
  152. package/esm2020/lib/notification-group/notification-group.component.mjs +0 -116
  153. package/esm2020/lib/notification-group-header/notification-group-header.component.mjs +0 -39
  154. package/esm2020/lib/numeric-tile/numeric-tile.component.mjs +0 -34
  155. package/esm2020/lib/pin-tile/pin-tile.component.mjs +0 -111
  156. package/esm2020/lib/pipes/group-tiles.pipe.mjs +0 -31
  157. package/esm2020/lib/pipes/tile-home-filter.pipe.mjs +0 -28
  158. package/esm2020/lib/pipes/tile-prop.pipe.mjs +0 -32
  159. package/esm2020/lib/profile-tile/profile-tile.component.mjs +0 -26
  160. package/esm2020/lib/shellbar/shellbar.component.mjs +0 -200
  161. package/esm2020/lib/simple-tile/simple-tile.component.mjs +0 -23
  162. package/esm2020/lib/tile/tile.component.mjs +0 -61
  163. package/esm2020/lib/tile-renderer.directive.mjs +0 -70
  164. package/esm2020/lib/tiles-viewer/tiles-viewer.component.mjs +0 -157
  165. package/esm2020/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +0 -158
  166. package/esm2020/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +0 -88
  167. package/esm2020/lib/tiles-viewer.service.mjs +0 -130
  168. package/esm2020/lib/tiles.service.mjs +0 -589
  169. package/fesm2015/barsa-tiles.mjs +0 -2977
  170. package/fesm2015/barsa-tiles.mjs.map +0 -1
  171. package/fesm2020/barsa-tiles.mjs +0 -2941
  172. package/fesm2020/barsa-tiles.mjs.map +0 -1
@@ -0,0 +1,589 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, BehaviorSubject, of, from } from 'rxjs';
3
+ import { concatMap, distinctUntilChanged, filter, shareReplay, startWith, takeUntil, tap } from 'rxjs/operators';
4
+ import { BarsaApi } from 'barsa-novin-ray-core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "barsa-novin-ray-core";
7
+ import * as i2 from "@fundamental-ngx/core";
8
+ export class TilesService {
9
+ constructor(_portalService, _rtlService, _bbbTranslatePipe) {
10
+ this._portalService = _portalService;
11
+ this._rtlService = _rtlService;
12
+ this._bbbTranslatePipe = _bbbTranslatePipe;
13
+ this.shellbarSource = new Subject();
14
+ this._OnDestroy$ = new Subject();
15
+ this._homeAppTileGroupsSource = new BehaviorSubject([]);
16
+ this.pinTilesSource = new Subject();
17
+ this._appTileGroupsSource = new BehaviorSubject(null);
18
+ this._edithomeSource = new BehaviorSubject(false);
19
+ this._componentSettings$ = new Subject();
20
+ BarsaApi.Bw.TilesService = this;
21
+ this.homeAppTileGroups$ = this._homeAppTileGroupsSource.asObservable();
22
+ this.pinTiles$ = this.pinTilesSource.asObservable().pipe(startWith(null));
23
+ this.shellbarSource = new Subject();
24
+ this.shellbar$ = this.shellbarSource.asObservable().pipe(shareReplay(1));
25
+ this.appTileGroups$ = this._appTileGroupsSource.pipe(shareReplay(1));
26
+ this.edit$ = this._edithomeSource.asObservable().pipe(takeUntil(this._OnDestroy$), distinctUntilChanged());
27
+ this.deviceSize$ = this._portalService.deviceSize$;
28
+ this._rtlService.rtl.next(BarsaApi.LoginFormData.IsRtl);
29
+ this.loadAllAppTileGroups();
30
+ this.appTileGroups$
31
+ .pipe(filter((moForReportModel) => moForReportModel !== null), tap((moForReportModel) => {
32
+ if (moForReportModel) {
33
+ this._allAppsLoaded(moForReportModel);
34
+ }
35
+ }))
36
+ .subscribe();
37
+ BarsaApi.Ul.ApplicationCtrlr.on('GlobalRefreshTile', this._onApplication_GlobalRefreshTile.bind(this));
38
+ }
39
+ get componentSettings$() {
40
+ return this._componentSettings$.asObservable();
41
+ }
42
+ get appTileGroups() {
43
+ return this._appTileGroupsSource.getValue();
44
+ }
45
+ ngOnDestroy() {
46
+ this._OnDestroy$.next();
47
+ }
48
+ _onApplication_GlobalRefreshTile(sender, appTilesTitle) {
49
+ const allApps = this._appTileGroupsSource.getValue();
50
+ const appTiles = [];
51
+ if (allApps) {
52
+ appTilesTitle.forEach((c) => {
53
+ const selectedTile = this.findAppTileWithKey(allApps, 'A_App_AppKey', c);
54
+ if (selectedTile) {
55
+ appTiles.push(selectedTile);
56
+ }
57
+ });
58
+ this._updateAppTileFromNotification(allApps, appTiles);
59
+ this._appTileGroupsSource.next(allApps);
60
+ }
61
+ }
62
+ _updateAppTileFromNotification(allApps, appTiles) {
63
+ if (!appTiles?.length) {
64
+ return;
65
+ }
66
+ BarsaApi.Bw.RunBlMethodAsync({
67
+ Parameters: [appTiles.map((c) => (c.AppTile?.Id ? c.AppTile?.Id : c.Id))],
68
+ Method: 'RefreshAppTiles',
69
+ SuccessFn: (result) => {
70
+ result.MoDataList.forEach((c) => this.updateAppTile(allApps, c));
71
+ this._appTileGroupsSource.next({ ...allApps });
72
+ },
73
+ FailFn: () => { }
74
+ });
75
+ }
76
+ loadAppTileGroups(appTileGroup) {
77
+ if (!appTileGroup || appTileGroup.$TilesLoaded) {
78
+ return;
79
+ }
80
+ const allApps = this._appTileGroupsSource.getValue();
81
+ if (allApps) {
82
+ const selectedAppTilegroup = allApps?.MoDataList.find((c) => c.Id === appTileGroup.Id);
83
+ if (selectedAppTilegroup) {
84
+ this._loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps);
85
+ selectedAppTilegroup.$Children?.forEach((subGroup) => {
86
+ this._loadAppTilesOfAppTileGroup(subGroup, allApps);
87
+ });
88
+ }
89
+ }
90
+ }
91
+ saveTilesStackContent(tilesStackContent) {
92
+ const userPortalSettings = this._portalService.userPortalSettings['UserPortalSettings'];
93
+ if (userPortalSettings == null) {
94
+ return Promise.resolve();
95
+ }
96
+ userPortalSettings.TilesStackContent = tilesStackContent;
97
+ userPortalSettings.$State = 'Modified';
98
+ return this._saveUserPortalSettings(userPortalSettings).then(() => this._portalService.setUserPortalSettings(userPortalSettings));
99
+ }
100
+ loadUserPortalSettings() {
101
+ return this._portalService.getData('UserPortalSetting').pipe(concatMap((data) => {
102
+ if (data) {
103
+ return of(data);
104
+ }
105
+ else {
106
+ return this.loadFromServerUserPortalSetting();
107
+ }
108
+ }));
109
+ }
110
+ refreshTile(appTile) {
111
+ return new Promise((resolve, reject) => {
112
+ BarsaApi.Bw.RunBlMethodAsync({
113
+ Parameters: [appTile.Id],
114
+ Method: 'RefreshTile',
115
+ SuccessFn: (newAppTile) => {
116
+ if (newAppTile.MoDataList?.length) {
117
+ resolve(newAppTile.MoDataList[0]);
118
+ }
119
+ reject(`refresh tile not found apptile width title: ${appTile.Title}`);
120
+ },
121
+ FailFn: () => {
122
+ reject(null);
123
+ }
124
+ });
125
+ });
126
+ }
127
+ loadFromServerUserPortalSetting() {
128
+ return from(new Promise((resolve, reject) => {
129
+ BarsaApi.Bw.RunBlMethodAsync({
130
+ Parameters: [],
131
+ Method: 'GetUserPortalSettings',
132
+ SuccessFn: (userPortalSetting) => {
133
+ this._portalService.setData('UserPortalSetting', userPortalSetting);
134
+ resolve(userPortalSetting);
135
+ },
136
+ FailFn: () => {
137
+ reject(null);
138
+ }
139
+ });
140
+ }));
141
+ }
142
+ toggleAppGroupSettingVisible(appGroup) {
143
+ return from(new Promise((resolve, reject) => {
144
+ BarsaApi.Bw.RunBlMethodAsync({
145
+ Parameters: [appGroup.Id],
146
+ Method: 'ToggleAppTileGroupSettingVisible',
147
+ SuccessFn: (appGroupSetting) => {
148
+ this._updateAppTileGroupSettings(appGroup, appGroupSetting);
149
+ resolve(appGroupSetting);
150
+ },
151
+ FailFn: () => {
152
+ reject(null);
153
+ }
154
+ });
155
+ })).pipe(tap((appGroupSetting) => {
156
+ this._updateAppGroupSetting(appGroup, appGroupSetting);
157
+ }));
158
+ }
159
+ resetAppGroupSetting(appGroup) {
160
+ return from(new Promise((resolve, reject) => {
161
+ BarsaApi.Bw.RunBlMethodAsync({
162
+ Parameters: [appGroup.Id],
163
+ Method: 'ResetAppTileGroupSettingVisible',
164
+ SuccessFn: (appGroupSetting) => {
165
+ this._updateAppTileGroupSettings(appGroup, appGroupSetting);
166
+ resolve(appGroupSetting);
167
+ },
168
+ FailFn: () => {
169
+ reject(null);
170
+ }
171
+ });
172
+ })).pipe(tap((appGroupSetting) => {
173
+ this._updateAppGroupSetting(appGroup, appGroupSetting);
174
+ }));
175
+ }
176
+ deleteAppGroup(appGroup) {
177
+ return from(new Promise((resolve, reject) => {
178
+ BarsaApi.Bw.RunBlMethodAsync({
179
+ Parameters: [appGroup.Id],
180
+ Method: 'DeleteAppGroup',
181
+ SuccessFn: () => {
182
+ resolve(appGroup.Id);
183
+ },
184
+ FailFn: () => {
185
+ reject(null);
186
+ }
187
+ });
188
+ })).pipe(tap((appGroupId) => {
189
+ const allApps = this.appTileGroups;
190
+ if (allApps) {
191
+ allApps.MoDataList = allApps.MoDataList.filter((c) => c.Id !== appGroupId);
192
+ this._appTileGroupsSource.next(allApps);
193
+ }
194
+ }));
195
+ }
196
+ changeAppTileSetting(appTile) {
197
+ const allApps = this.appTileGroups;
198
+ const selectedGroup = this.findGroupWithAppTileId(allApps, appTile.Id);
199
+ if (selectedGroup === null) {
200
+ return of(null);
201
+ }
202
+ return from(new Promise((resolve, reject) => {
203
+ BarsaApi.Bw.RunBlMethodAsync({
204
+ Parameters: [selectedGroup.Id, appTile.Id, appTile.Title, appTile.Subtitle],
205
+ Method: 'ChangeAppTileSetting',
206
+ SuccessFn: () => {
207
+ this._nextAllAppTileGroups(allApps);
208
+ resolve(selectedGroup);
209
+ },
210
+ FailFn: () => {
211
+ reject(null);
212
+ }
213
+ });
214
+ })).pipe(tap((appGroupSetting) => this.updataAppTileSetting(selectedGroup, appGroupSetting)));
215
+ }
216
+ saveAppGroupOrders(appGroups) {
217
+ const groupOrders = appGroups.map((c) => c.Id);
218
+ return from(new Promise((resolve, reject) => {
219
+ BarsaApi.Bw.RunBlMethodAsync({
220
+ Parameters: [groupOrders],
221
+ Method: 'ChangeOrderAppTileGroups',
222
+ SuccessFn: () => {
223
+ resolve();
224
+ },
225
+ FailFn: () => {
226
+ reject(null);
227
+ }
228
+ });
229
+ })).pipe();
230
+ }
231
+ createAppGroup(title) {
232
+ return from(new Promise((resolve, reject) => {
233
+ BarsaApi.Bw.RunBlMethodAsync({
234
+ Parameters: [title],
235
+ Method: 'CreateAppTileGroup',
236
+ SuccessFn: (mo) => {
237
+ resolve(mo);
238
+ },
239
+ FailFn: () => {
240
+ reject(null);
241
+ }
242
+ });
243
+ })).pipe(tap((mo) => this.addAppGroup(mo)));
244
+ }
245
+ saveOrderAppTiles(appGroup, appTiles, isActionLink = false, appTileIdTransferedId = '0') {
246
+ BarsaApi.Bw.RunBlMethodAsync({
247
+ Parameters: [appGroup.Id, appTiles, isActionLink, appTileIdTransferedId],
248
+ Method: 'ChangeOrderAppTiles',
249
+ SuccessFn: () => { },
250
+ FailFn: () => { }
251
+ });
252
+ }
253
+ updateAppTile(allApps, appTile) {
254
+ const selectedAppTile = this.findAppTileWithKey(allApps, 'A_App_Component.Settings.Id', appTile.A_App_Component.Settings.Id);
255
+ if (selectedAppTile) {
256
+ BarsaApi.Common.Merger.FastMerge(selectedAppTile.A_App_Component.Settings, appTile.A_App_Component.Settings);
257
+ this._componentSettings$.next(selectedAppTile.A_App_Component.Settings);
258
+ }
259
+ }
260
+ updataAppTileSetting(selectedGroup, appGroupSetting) {
261
+ const allApps = this.appTileGroups;
262
+ allApps?.MoDataList.forEach((appGroup) => {
263
+ if (appGroup.Id === selectedGroup.Id) {
264
+ appGroup.UserAppTileGroupSetting = appGroupSetting;
265
+ }
266
+ });
267
+ this._appTileGroupsSource.next(allApps);
268
+ }
269
+ addAppGroup(mo) {
270
+ const allApps = this.appTileGroups;
271
+ if (allApps) {
272
+ allApps.MoDataList.push(mo);
273
+ this._appTileGroupsSource.next(allApps);
274
+ }
275
+ }
276
+ singlePinTileChanged(appTileId) {
277
+ const allApps = this.appTileGroups;
278
+ const group = this.findGroupWithAppTileId(allApps, appTileId);
279
+ if (group === null) {
280
+ return of(false);
281
+ }
282
+ return from(new Promise((resolve, reject) => {
283
+ BarsaApi.Bw.RunBlMethodAsync({
284
+ Parameters: [group.Id, appTileId],
285
+ Method: 'RemoveAppTileFromTileGroup',
286
+ SuccessFn: (setting) => {
287
+ this._updateAppTileGroupSettings(group, setting);
288
+ this._nextAllAppTileGroups(allApps);
289
+ resolve(true);
290
+ },
291
+ FailFn: () => {
292
+ reject(false);
293
+ }
294
+ });
295
+ }));
296
+ }
297
+ pinTileChanged(appTileGroupsPin, app, callback) {
298
+ const allApps = this.appTileGroups;
299
+ const visible = appTileGroupsPin.map((c) => c.visible);
300
+ const groupChanges = appTileGroupsPin.map((c) => new BarsaApi.Common.MetaObjectWeb({
301
+ Id: c.appTileGroup.Id,
302
+ TypeDefId: allApps?.TypeDefId
303
+ }));
304
+ BarsaApi.Bw.RunBlMethodAsync({
305
+ Parameters: [groupChanges, visible, app.Id],
306
+ Method: 'TilePinChanged',
307
+ SuccessFn: (settings) => {
308
+ this._tilePinChange(appTileGroupsPin, allApps);
309
+ callback(settings);
310
+ },
311
+ FailFn: () => {
312
+ // TODO show error
313
+ }
314
+ });
315
+ }
316
+ _tilePinChange(appTileGroupsPin, allApps) {
317
+ for (const appTileGroupPin of appTileGroupsPin) {
318
+ let selectedAppGroup;
319
+ const appGroupId = appTileGroupPin.appTileGroup.Id;
320
+ allApps?.MoDataList.forEach((c) => {
321
+ if (c.Id === appGroupId) {
322
+ selectedAppGroup = c;
323
+ }
324
+ else if (!selectedAppGroup) {
325
+ selectedAppGroup = c.$Children?.find((child) => child.Id === appGroupId);
326
+ }
327
+ });
328
+ if (selectedAppGroup && selectedAppGroup.$TilesLoaded) {
329
+ // let moDataList = selectedAppGroup.AppTiles.MoDataList;
330
+ // if (appTileGroups[i].visible)
331
+ // selectedAppGroup.AppTiles.MoDataList = [...moDataList, settings[i]];
332
+ // else
333
+ // selectedAppGroup.AppTiles.MoDataList = moDataList.filter(
334
+ // (c) => c.App.Id !== app.Id
335
+ // );
336
+ this._loadAppTilesOfAppTileGroup(selectedAppGroup, allApps);
337
+ }
338
+ }
339
+ this._nextAllAppTileGroups(allApps);
340
+ }
341
+ loadShellbar() {
342
+ BarsaApi.Bw.RunBlMethodAsync({
343
+ Parameters: [BarsaApi.LoginFormData.PortalId],
344
+ Method: 'LoadShellbarByPortalId',
345
+ SuccessFn: (shellbar) => {
346
+ this.shellbarSource.next(shellbar);
347
+ },
348
+ FailFn: () => {
349
+ // TODO show error
350
+ }
351
+ });
352
+ // this._portalService
353
+ // .ReportExecutePromise('Shellbar')
354
+ // .then((moForReportModel) => this.shellbarSource.next(moForReportModel.MoDataList[0]));
355
+ }
356
+ loadAllAppTileGroups() {
357
+ this._portalService
358
+ .ReportExecute('AllAppTileGroups')
359
+ .subscribe((allApps) => this._nextAllAppTileGroups(allApps));
360
+ }
361
+ _setTileInfo(appTile) {
362
+ {
363
+ const title = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Title', null);
364
+ appTile.TileTitle = !appTile.Title ? title : appTile.Title;
365
+ const subtitle = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Subtitle', null);
366
+ appTile.Subtitle = !appTile.Subtitle ? subtitle : appTile.Subtitle;
367
+ }
368
+ }
369
+ getTileGroups() {
370
+ return this._appTileGroupsSource.getValue();
371
+ }
372
+ setEditHome(edit) {
373
+ this._edithomeSource.next(edit);
374
+ }
375
+ _allAppsLoaded(moForReportModel) {
376
+ moForReportModel.MoDataList.forEach((c) => {
377
+ this._prepareNavigator(c);
378
+ });
379
+ this._setHomeAppTileGroups(moForReportModel.MoDataList);
380
+ }
381
+ _loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps) {
382
+ const callback = () => {
383
+ this._nextAllAppTileGroups(allApps);
384
+ };
385
+ if (!selectedAppTilegroup.UserAppTileGroupSetting) {
386
+ this._loadAppTilesByAppTileGroup(selectedAppTilegroup, callback);
387
+ }
388
+ else {
389
+ this._loadAppTilesByAppTileGroupSetting(selectedAppTilegroup, callback);
390
+ }
391
+ }
392
+ _loadAppTilesByAppTileGroup(appGroup, callback) {
393
+ BarsaApi.Bw.RunBlMethodAsync({
394
+ Parameters: [appGroup.Id],
395
+ Method: 'LoadAllAppTilesByAppTileGroup',
396
+ SuccessFn: (appTiles) => {
397
+ this._updateAppTilesOfAppTileGroup(appGroup, appTiles);
398
+ callback();
399
+ },
400
+ FailFn: () => {
401
+ // TODO show error
402
+ }
403
+ });
404
+ }
405
+ _updateAppTilesOfAppTileGroup(selectedAppTilegroup, appTiles) {
406
+ if (this.appTileGroups) {
407
+ selectedAppTilegroup = { ...selectedAppTilegroup, $TilesLoaded: true };
408
+ appTiles.MoDataList.forEach((element) => {
409
+ element.Component = element.A_App_Component ?? element.A_AppTile_App_Component;
410
+ element.DynamicCommand = element.A_App_DynamicCommand ?? element.A_AppTile_App_DynamicCommand;
411
+ element.Predefined = element.Predefined ?? element.A_AppTile_Predefined;
412
+ });
413
+ const apptileGroupIndex = this.appTileGroups?.MoDataList.findIndex((c) => c.Id === selectedAppTilegroup.Id || c.Id === selectedAppTilegroup.$ParentId);
414
+ selectedAppTilegroup.AppTiles = appTiles;
415
+ const tileGroup = this.appTileGroups.MoDataList[apptileGroupIndex];
416
+ if (selectedAppTilegroup.$ParentId) {
417
+ if (tileGroup.$Children) {
418
+ const idOfSubGroup = tileGroup.$Children.findIndex((c) => c.Id === selectedAppTilegroup.Id);
419
+ tileGroup.$Children[idOfSubGroup] = selectedAppTilegroup;
420
+ }
421
+ this.appTileGroups.MoDataList[apptileGroupIndex] = { ...tileGroup };
422
+ }
423
+ else {
424
+ this.appTileGroups.MoDataList[apptileGroupIndex] = selectedAppTilegroup;
425
+ }
426
+ }
427
+ }
428
+ _loadAppTilesByAppTileGroupSetting(appTileGroup, callback) {
429
+ BarsaApi.Bw.RunBlMethodAsync({
430
+ Parameters: [appTileGroup.Id],
431
+ Method: 'LoadAllAppTilesByUserAppTileGroupSettings',
432
+ SuccessFn: (appTiles) => {
433
+ this._updateAppTilesOfAppTileGroup(appTileGroup, appTiles);
434
+ callback();
435
+ },
436
+ FailFn: () => {
437
+ // TODO show error
438
+ }
439
+ });
440
+ }
441
+ _nextAllAppTileGroups(newAllApps = null) {
442
+ const allApps = newAllApps ?? this._appTileGroupsSource.getValue();
443
+ this._appTileGroupsSource.next(allApps ? { ...allApps } : null);
444
+ }
445
+ _setHomeAppTileGroups(appGroups) {
446
+ let newAppGroups = [...appGroups];
447
+ newAppGroups = newAppGroups
448
+ .filter((c) => c.Visible)
449
+ .sort((a, b) => Number(a.navigatorOrderItem) - Number(b.navigatorOrderItem));
450
+ this._homeAppTileGroupsSource.next(newAppGroups);
451
+ }
452
+ _saveUserPortalSettings(userPortalSettings) {
453
+ return new Promise((resolve, reject) => {
454
+ BarsaApi.Bw.RunBlMethodAsync({
455
+ Parameters: [new BarsaApi.Common.MetaObjectWeb(userPortalSettings)],
456
+ Method: 'SaveUserPortalSettings',
457
+ SuccessFn: () => {
458
+ resolve();
459
+ },
460
+ FailFn: () => {
461
+ reject(null);
462
+ }
463
+ });
464
+ });
465
+ }
466
+ _updateAppGroupSetting(appGroup, appGroupSetting) {
467
+ const allApps = this.appTileGroups;
468
+ const selectedAppGroup = allApps?.MoDataList.find((c) => c.Id === appGroup.Id);
469
+ if (selectedAppGroup && allApps) {
470
+ selectedAppGroup.UserAppTileGroupSetting = appGroupSetting;
471
+ this._nextAllAppTileGroups(allApps);
472
+ }
473
+ }
474
+ findAppTileWithKey(allApps, key, value) {
475
+ let selectedTile;
476
+ if (typeof value === 'string') {
477
+ value = BarsaApi.Common.Util.ReplaceArabicCharchter(value);
478
+ }
479
+ if (!allApps) {
480
+ return null;
481
+ }
482
+ allApps.MoDataList.forEach((appGroup) => {
483
+ if (selectedTile) {
484
+ return;
485
+ }
486
+ selectedTile = appGroup.navigatorTiles.find((c) => BarsaApi.Common.Util.TryGetValue(c, key, null) === value);
487
+ appGroup.$Children?.forEach((subGroup) => {
488
+ if (selectedTile) {
489
+ return;
490
+ }
491
+ selectedTile = subGroup.navigatorTiles.find((c) => BarsaApi.Common.Util.TryGetValue(c, key, null) === value);
492
+ });
493
+ });
494
+ return selectedTile;
495
+ }
496
+ findGroupWithAppTileId(allApps, appTileId) {
497
+ let selectedGroup;
498
+ if (!allApps) {
499
+ return null;
500
+ }
501
+ allApps.MoDataList.forEach((appGroup) => {
502
+ if (selectedGroup) {
503
+ return;
504
+ }
505
+ if (appGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
506
+ selectedGroup = appGroup;
507
+ return;
508
+ }
509
+ appGroup.$Children?.forEach((subGroup) => {
510
+ if (subGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
511
+ selectedGroup = subGroup;
512
+ return;
513
+ }
514
+ });
515
+ });
516
+ return selectedGroup;
517
+ }
518
+ _findGroupWithAppGroupId(allApps, appGroupId) {
519
+ let selectedGroup;
520
+ if (!allApps) {
521
+ return null;
522
+ }
523
+ allApps.MoDataList.forEach((appGroup) => {
524
+ if (selectedGroup) {
525
+ return;
526
+ }
527
+ if (appGroup.Id === appGroupId) {
528
+ selectedGroup = appGroup;
529
+ return;
530
+ }
531
+ appGroup.$Children?.forEach((subGroup) => {
532
+ if (subGroup.Id === appGroupId) {
533
+ selectedGroup = subGroup;
534
+ return;
535
+ }
536
+ });
537
+ });
538
+ return selectedGroup;
539
+ }
540
+ _updateAppTileGroupSettings(appTileGroup, setting) {
541
+ appTileGroup.UserAppTileGroupSetting = setting;
542
+ appTileGroup = JSON.parse(JSON.stringify(appTileGroup));
543
+ this._nextAllAppTileGroups();
544
+ return appTileGroup;
545
+ }
546
+ _prepareNavigator(appTileGroup) {
547
+ appTileGroup.$TileSettingChanged = false;
548
+ appTileGroup.$Disabledpin = false;
549
+ appTileGroup.navigatorTitle = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Title', appTileGroup.Title);
550
+ appTileGroup.navigatorTitle = appTileGroup.navigatorTitle =
551
+ appTileGroup.navigatorTitle === '' ? appTileGroup.Title : appTileGroup.navigatorTitle;
552
+ appTileGroup.navigatorTitle = this._bbbTranslatePipe.transform(appTileGroup.navigatorTitle);
553
+ const orderItem = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.OrderItem', null);
554
+ if (orderItem !== null) {
555
+ appTileGroup.navigatorOrderItem = orderItem;
556
+ }
557
+ else {
558
+ appTileGroup.navigatorOrderItem = appTileGroup.OrderItem;
559
+ }
560
+ const visible = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Visible', null);
561
+ if (visible !== null) {
562
+ appTileGroup.navigatorVisible = visible;
563
+ }
564
+ else {
565
+ appTileGroup.navigatorVisible = appTileGroup.Visible;
566
+ }
567
+ const appTiles = appTileGroup.AppTiles?.MoDataList ?? [];
568
+ appTileGroup.navigatorTiles = appTiles
569
+ .filter((c) => c.Visible && !c.IsActionLink)
570
+ .sort((a, b) => Number(a.OrderItem) - Number(b.OrderItem));
571
+ appTileGroup.navigatorActionLinks = appTiles
572
+ .filter((c) => c.Visible && c.IsActionLink)
573
+ .sort((a, b) => Number(a.OrderItemActionLink) - Number(b.OrderItemActionLink));
574
+ appTileGroup.navigatorTiles.forEach((appTile) => this._setTileInfo(appTile));
575
+ appTileGroup.navigatorActionLinks.forEach((appTile) => this._setTileInfo(appTile));
576
+ appTileGroup.$Children?.forEach((subAppTileGroup) => {
577
+ this._prepareNavigator(subAppTileGroup);
578
+ });
579
+ }
580
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TilesService, deps: [{ token: i1.PortalService }, { token: i2.RtlService }, { token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
581
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TilesService, providedIn: 'root' }); }
582
+ }
583
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TilesService, decorators: [{
584
+ type: Injectable,
585
+ args: [{
586
+ providedIn: 'root'
587
+ }]
588
+ }], ctorParameters: () => [{ type: i1.PortalService }, { type: i2.RtlService }, { type: i1.BbbTranslatePipe }] });
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXRpbGVzL3NyYy9saWIvdGlsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakgsT0FBTyxFQUFFLFFBQVEsRUFBMEUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14SCxNQUFNLE9BQU8sWUFBWTtJQWVyQixZQUNZLGNBQTZCLEVBQzdCLFdBQXVCLEVBQ3ZCLGlCQUFtQztRQUZuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZC9DLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFLNUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUMxRSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQzFFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsd0JBQW1CLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFNN0QsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxD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LEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7YUFDMUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1FBQ25GLFlBQVksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0UsWUFBWSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRW5GLFlBQVksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzVDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0FocEJRLFlBQVk7a0hBQVosWUFBWSxjQUZULE1BQU07OzJGQUVULFlBQVk7a0JBSHhCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YsIGZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgY29uY2F0TWFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBzaGFyZVJlcGxheSwgc3RhcnRXaXRoLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFJ0bFNlcnZpY2UgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUnO1xyXG5pbXBvcnQgeyBCYXJzYUFwaSwgQmJiVHJhbnNsYXRlUGlwZSwgTWV0YW9iamVjdERhdGFNb2RlbCwgTW9Gb3JSZXBvcnRNb2RlbCwgUG9ydGFsU2VydmljZSB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcclxuaW1wb3J0IHsgQXBwVGlsZUdyb3VwUGluLCBVc2VyUG9ydGFsU2V0dGluZ3MgfSBmcm9tICcuL21vZGVscyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpbGVzU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcbiAgICBkZXZpY2VTaXplJDogT2JzZXJ2YWJsZTwncycgfCAnbScgfCAnbCcgfCAneGwnPjtcclxuICAgIGhvbWVBcHBUaWxlR3JvdXBzJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsW10+O1xyXG4gICAgcGluVGlsZXMkOiBPYnNlcnZhYmxlPFBpblRpbGVJbmZvIHwgbnVsbD47XHJcbiAgICBzaGVsbGJhclNvdXJjZSA9IG5ldyBTdWJqZWN0PE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XHJcbiAgICBzaGVsbGJhciQ6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD47XHJcbiAgICBhcHBUaWxlR3JvdXBzJDogT2JzZXJ2YWJsZTxNb0ZvclJlcG9ydE1vZGVsIHwgbnVsbD47XHJcbiAgICBlZGl0JDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgICBwcml2YXRlIF9PbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2hvbWVBcHBUaWxlR3JvdXBzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcclxuICAgIHByaXZhdGUgcGluVGlsZXNTb3VyY2UgPSBuZXcgU3ViamVjdDxQaW5UaWxlSW5mbz4oKTtcclxuICAgIHByaXZhdGUgX2FwcFRpbGVHcm91cHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX2VkaXRob21lU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIF9jb21wb25lbnRTZXR0aW5ncyQgPSBuZXcgU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ydGxTZXJ2aWNlOiBSdGxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2JiYlRyYW5zbGF0ZVBpcGU6IEJiYlRyYW5zbGF0ZVBpcGVcclxuICAgICkge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlRpbGVzU2VydmljZSA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5ob21lQXBwVGlsZUdyb3VwcyQgPSB0aGlzLl9ob21lQXBwVGlsZUdyb3Vwc1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnBpblRpbGVzJCA9IHRoaXMucGluVGlsZXNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShzdGFydFdpdGgobnVsbCkpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXJTb3VyY2UgPSBuZXcgU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXIkID0gdGhpcy5zaGVsbGJhclNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuICAgICAgICB0aGlzLmFwcFRpbGVHcm91cHMkID0gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0JCA9IHRoaXMuX2VkaXRob21lU291cmNlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX09uRGVzdHJveSQpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcclxuICAgICAgICB0aGlzLmRldmljZVNpemUkID0gdGhpcy5fcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJDtcclxuICAgICAgICB0aGlzLl9ydGxTZXJ2aWNlLnJ0bC5uZXh0KEJhcnNhQXBpLkxvZ2luRm9ybURhdGEuSXNSdGwpO1xyXG4gICAgICAgIHRoaXMubG9hZEFsbEFwcFRpbGVHcm91cHMoKTtcclxuICAgICAgICB0aGlzLmFwcFRpbGVHcm91cHMkXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKChtb0ZvclJlcG9ydE1vZGVsKSA9PiBtb0ZvclJlcG9ydE1vZGVsICE9PSBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRhcCgobW9Gb3JSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtb0ZvclJlcG9ydE1vZGVsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FsbEFwcHNMb2FkZWQobW9Gb3JSZXBvcnRNb2RlbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgQmFyc2FBcGkuVWwuQXBwbGljYXRpb25DdHJsci5vbignR2xvYmFsUmVmcmVzaFRpbGUnLCB0aGlzLl9vbkFwcGxpY2F0aW9uX0dsb2JhbFJlZnJlc2hUaWxlLmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGNvbXBvbmVudFNldHRpbmdzJCgpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50U2V0dGluZ3MkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFwcFRpbGVHcm91cHMoKTogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9PbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIH1cclxuICAgIHByb3RlY3RlZCBfb25BcHBsaWNhdGlvbl9HbG9iYWxSZWZyZXNoVGlsZShzZW5kZXIsIGFwcFRpbGVzVGl0bGU6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBjb25zdCBhcHBUaWxlczogTWV0YW9iamVjdERhdGFNb2RlbFtdID0gW107XHJcbiAgICAgICAgaWYgKGFsbEFwcHMpIHtcclxuICAgICAgICAgICAgYXBwVGlsZXNUaXRsZS5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFRpbGUgPSB0aGlzLmZpbmRBcHBUaWxlV2l0aEtleShhbGxBcHBzLCAnQV9BcHBfQXBwS2V5JywgYyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRUaWxlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXBwVGlsZXMucHVzaChzZWxlY3RlZFRpbGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZUZyb21Ob3RpZmljYXRpb24oYWxsQXBwcywgYXBwVGlsZXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfdXBkYXRlQXBwVGlsZUZyb21Ob3RpZmljYXRpb24oYWxsQXBwczogTW9Gb3JSZXBvcnRNb2RlbCwgYXBwVGlsZXM6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghYXBwVGlsZXM/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwVGlsZXMubWFwKChjKSA9PiAoYy5BcHBUaWxlPy5JZCA/IGMuQXBwVGlsZT8uSWQgOiBjLklkKSldLFxyXG4gICAgICAgICAgICBNZXRob2Q6ICdSZWZyZXNoQXBwVGlsZXMnLFxyXG4gICAgICAgICAgICBTdWNjZXNzRm46IChyZXN1bHQ6IE1vRm9yUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHRoaXMudXBkYXRlQXBwVGlsZShhbGxBcHBzLCBjKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoeyAuLi5hbGxBcHBzIH0pO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsb2FkQXBwVGlsZUdyb3VwcyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWFwcFRpbGVHcm91cCB8fCBhcHBUaWxlR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoYWxsQXBwcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFwcFRpbGVncm91cCA9IGFsbEFwcHM/Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5JZCA9PT0gYXBwVGlsZUdyb3VwLklkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZWdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cCwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc3ViR3JvdXAsIGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzYXZlVGlsZXNTdGFja0NvbnRlbnQodGlsZXNTdGFja0NvbnRlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB1c2VyUG9ydGFsU2V0dGluZ3MgPSB0aGlzLl9wb3J0YWxTZXJ2aWNlLnVzZXJQb3J0YWxTZXR0aW5nc1snVXNlclBvcnRhbFNldHRpbmdzJ107XHJcbiAgICAgICAgaWYgKHVzZXJQb3J0YWxTZXR0aW5ncyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdXNlclBvcnRhbFNldHRpbmdzLlRpbGVzU3RhY2tDb250ZW50ID0gdGlsZXNTdGFja0NvbnRlbnQ7XHJcbiAgICAgICAgdXNlclBvcnRhbFNldHRpbmdzLiRTdGF0ZSA9ICdNb2RpZmllZCc7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NhdmVVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzKS50aGVuKCgpID0+XHJcbiAgICAgICAgICAgIHRoaXMuX3BvcnRhbFNlcnZpY2Uuc2V0VXNlclBvcnRhbFNldHRpbmdzKHVzZXJQb3J0YWxTZXR0aW5ncylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRVc2VyUG9ydGFsU2V0dGluZ3MoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsU2VydmljZS5nZXREYXRhKCdVc2VyUG9ydGFsU2V0dGluZycpLnBpcGUoXHJcbiAgICAgICAgICAgIGNvbmNhdE1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRGcm9tU2VydmVyVXNlclBvcnRhbFNldHRpbmcoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmVmcmVzaFRpbGUoYXBwVGlsZTogTWV0YW9iamVjdERhdGFNb2RlbCk6IFByb21pc2U8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcFRpbGUuSWRdLFxyXG4gICAgICAgICAgICAgICAgTWV0aG9kOiAnUmVmcmVzaFRpbGUnLFxyXG4gICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAobmV3QXBwVGlsZTogTW9Gb3JSZXBvcnRNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdBcHBUaWxlLk1vRGF0YUxpc3Q/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG5ld0FwcFRpbGUuTW9EYXRhTGlzdFswXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChgcmVmcmVzaCB0aWxlIG5vdCBmb3VuZCBhcHB0aWxlIHdpZHRoIHRpdGxlOiAke2FwcFRpbGUuVGl0bGV9YCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGxvYWRGcm9tU2VydmVyVXNlclBvcnRhbFNldHRpbmcoKTogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPFVzZXJQb3J0YWxTZXR0aW5ncz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW10sXHJcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnR2V0VXNlclBvcnRhbFNldHRpbmdzJyxcclxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46ICh1c2VyUG9ydGFsU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlLnNldERhdGEoJ1VzZXJQb3J0YWxTZXR0aW5nJywgdXNlclBvcnRhbFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHVzZXJQb3J0YWxTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHRvZ2dsZUFwcEdyb3VwU2V0dGluZ1Zpc2libGUoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8TWV0YW9iamVjdERhdGFNb2RlbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdUb2dnbGVBcHBUaWxlR3JvdXBTZXR0aW5nVmlzaWJsZScsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwR3JvdXBTZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVHcm91cFNldHRpbmdzKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkucGlwZShcclxuICAgICAgICAgICAgdGFwKChhcHBHcm91cFNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcEdyb3VwU2V0dGluZyhhcHBHcm91cCwgYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgcmVzZXRBcHBHcm91cFNldHRpbmcoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8TWV0YW9iamVjdERhdGFNb2RlbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdSZXNldEFwcFRpbGVHcm91cFNldHRpbmdWaXNpYmxlJyxcclxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZUdyb3VwU2V0dGluZ3MoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKGFwcEdyb3VwU2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlQXBwR3JvdXAoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnRGVsZXRlQXBwR3JvdXAnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFwcEdyb3VwLklkKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKGFwcEdyb3VwSWQpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsQXBwcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdCA9IGFsbEFwcHMuTW9EYXRhTGlzdC5maWx0ZXIoKGMpID0+IGMuSWQgIT09IGFwcEdyb3VwSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgY2hhbmdlQXBwVGlsZVNldHRpbmcoYXBwVGlsZTogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGw+IHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXAgPSB0aGlzLmZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZS5JZCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXAgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8TWV0YW9iamVjdERhdGFNb2RlbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW3NlbGVjdGVkR3JvdXAuSWQsIGFwcFRpbGUuSWQsIGFwcFRpbGUuVGl0bGUsIGFwcFRpbGUuU3VidGl0bGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NoYW5nZUFwcFRpbGVTZXR0aW5nJyxcclxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VsZWN0ZWRHcm91cCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkucGlwZSh0YXAoKGFwcEdyb3VwU2V0dGluZykgPT4gdGhpcy51cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwLCBhcHBHcm91cFNldHRpbmcpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUFwcEdyb3VwT3JkZXJzKGFwcEdyb3VwczogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBPcmRlcnMgPSBhcHBHcm91cHMubWFwKChjKSA9PiBjLklkKTtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2dyb3VwT3JkZXJzXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdDaGFuZ2VPcmRlckFwcFRpbGVHcm91cHMnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkucGlwZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUFwcEdyb3VwKHRpdGxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8TWV0YW9iamVjdERhdGFNb2RlbD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW3RpdGxlXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdDcmVhdGVBcHBUaWxlR3JvdXAnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKG1vOiBNZXRhb2JqZWN0RGF0YU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobW8pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnBpcGUodGFwKChtbykgPT4gdGhpcy5hZGRBcHBHcm91cChtbykpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlT3JkZXJBcHBUaWxlcyhcclxuICAgICAgICBhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCxcclxuICAgICAgICBhcHBUaWxlczogbnVtYmVyW10sXHJcbiAgICAgICAgaXNBY3Rpb25MaW5rID0gZmFsc2UsXHJcbiAgICAgICAgYXBwVGlsZUlkVHJhbnNmZXJlZElkOiBzdHJpbmcgPSAnMCdcclxuICAgICk6IHZvaWQge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWQsIGFwcFRpbGVzLCBpc0FjdGlvbkxpbmssIGFwcFRpbGVJZFRyYW5zZmVyZWRJZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ0NoYW5nZU9yZGVyQXBwVGlsZXMnLFxyXG4gICAgICAgICAgICBTdWNjZXNzRm46ICgpID0+IHt9LFxyXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHt9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQXBwVGlsZShhbGxBcHBzOiBNb0ZvclJlcG9ydE1vZGVsLCBhcHBUaWxlOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRBcHBUaWxlID0gdGhpcy5maW5kQXBwVGlsZVdpdGhLZXkoXHJcbiAgICAgICAgICAgIGFsbEFwcHMsXHJcbiAgICAgICAgICAgICdBX0FwcF9Db21wb25lbnQuU2V0dGluZ3MuSWQnLFxyXG4gICAgICAgICAgICBhcHBUaWxlLkFfQXBwX0NvbXBvbmVudC5TZXR0aW5ncy5JZFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZSkge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5Db21tb24uTWVyZ2VyLkZhc3RNZXJnZShcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZS5BX0FwcF9Db21wb25lbnQuU2V0dGluZ3MsXHJcbiAgICAgICAgICAgICAgICBhcHBUaWxlLkFfQXBwX0NvbXBvbmVudC5TZXR0aW5nc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLl9jb21wb25lbnRTZXR0aW5ncyQubmV4dChzZWxlY3RlZEFwcFRpbGUuQV9BcHBfQ29tcG9uZW50LlNldHRpbmdzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB1cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGFsbEFwcHM/Lk1vRGF0YUxpc3QuZm9yRWFjaCgoYXBwR3JvdXApID0+IHtcclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLklkID09PSBzZWxlY3RlZEdyb3VwLklkKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBHcm91cC5Vc2VyQXBwVGlsZUdyb3VwU2V0dGluZyA9IGFwcEdyb3VwU2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBcHBHcm91cChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgaWYgKGFsbEFwcHMpIHtcclxuICAgICAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LnB1c2gobW8pO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNpbmdsZVBpblRpbGVDaGFuZ2VkKGFwcFRpbGVJZCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZUlkKTtcclxuICAgICAgICBpZiAoZ3JvdXAgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cC5JZCwgYXBwVGlsZUlkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdSZW1vdmVBcHBUaWxlRnJvbVRpbGVHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhncm91cCwgc2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHBpblRpbGVDaGFuZ2VkKGFwcFRpbGVHcm91cHNQaW46IEFwcFRpbGVHcm91cFBpbltdLCBhcHA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBDaGFuZ2VzID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoXHJcbiAgICAgICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgICAgICAgbmV3IEJhcnNhQXBpLkNvbW1vbi5NZXRhT2JqZWN0V2ViKHtcclxuICAgICAgICAgICAgICAgICAgICBJZDogYy5hcHBUaWxlR3JvdXAuSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgVHlwZURlZklkOiBhbGxBcHBzPy5UeXBlRGVmSWRcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cENoYW5nZXMsIHZpc2libGUsIGFwcC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ1RpbGVQaW5DaGFuZ2VkJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbGVQaW5DaGFuZ2UoYXBwVGlsZUdyb3Vwc1BpbiwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF90aWxlUGluQ2hhbmdlKGFwcFRpbGVHcm91cHNQaW4sIGFsbEFwcHMpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGFwcFRpbGVHcm91cFBpbiBvZiBhcHBUaWxlR3JvdXBzUGluKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZEFwcEdyb3VwO1xyXG4gICAgICAgICAgICBjb25zdCBhcHBHcm91cElkID0gYXBwVGlsZUdyb3VwUGluLmFwcFRpbGVHcm91cC5JZDtcclxuICAgICAgICAgICAgYWxsQXBwcz8uTW9EYXRhTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYy5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2VsZWN0ZWRBcHBHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjLiRDaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLklkID09PSBhcHBHcm91cElkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcEdyb3VwICYmIHNlbGVjdGVkQXBwR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgbW9EYXRhTGlzdCA9IHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdDtcclxuICAgICAgICAgICAgICAgIC8vIGlmIChhcHBUaWxlR3JvdXBzW2ldLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IFsuLi5tb0RhdGFMaXN0LCBzZXR0aW5nc1tpXV07XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IG1vRGF0YUxpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIChjKSA9PiBjLkFwcC5JZCAhPT0gYXBwLklkXHJcbiAgICAgICAgICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcEdyb3VwLCBhbGxBcHBzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2hlbGxiYXIoKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLlBvcnRhbElkXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZFNoZWxsYmFyQnlQb3J0YWxJZCcsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHNoZWxsYmFyOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNoZWxsYmFyU291cmNlLm5leHQoc2hlbGxiYXIpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBGYWlsRm46ICgpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdyBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIHRoaXMuX3BvcnRhbFNlcnZpY2VcclxuICAgICAgICAvLyAgICAgLlJlcG9ydEV4ZWN1dGVQcm9taXNlKCdTaGVsbGJhcicpXHJcbiAgICAgICAgLy8gICAgIC50aGVuKChtb0ZvclJlcG9ydE1vZGVsKSA9PiB0aGlzLnNoZWxsYmFyU291cmNlLm5leHQobW9Gb3JSZXBvcnRNb2RlbC5Nb0RhdGFMaXN0WzBdKSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEFsbEFwcFRpbGVHcm91cHMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZVxyXG4gICAgICAgICAgICAuUmVwb3J0RXhlY3V0ZSgnQWxsQXBwVGlsZUdyb3VwcycpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGFsbEFwcHMpID0+IHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpKTtcclxuICAgIH1cclxuICAgIF9zZXRUaWxlSW5mbyhhcHBUaWxlKTogdm9pZCB7XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGFwcFRpbGUsICdDb21wb25lbnQuU2V0dGluZ3MuVGlsZVNldHRpbmcuVGl0bGUnLCBudWxsKTtcclxuICAgICAgICAgICAgYXBwVGlsZS5UaWxlVGl0bGUgPSAhYXBwVGlsZS5UaXRsZSA/IHRpdGxlIDogYXBwVGlsZS5UaXRsZTtcclxuICAgICAgICAgICAgY29uc3Qgc3VidGl0bGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShhcHBUaWxlLCAnQ29tcG9uZW50LlNldHRpbmdzLlRpbGVTZXR0aW5nLlN1YnRpdGxlJywgbnVsbCk7XHJcbiAgICAgICAgICAgIGFwcFRpbGUuU3VidGl0bGUgPSAhYXBwVGlsZS5TdWJ0aXRsZSA/IHN1YnRpdGxlIDogYXBwVGlsZS5TdWJ0aXRsZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlsZUdyb3VwcygpOiBNb0ZvclJlcG9ydE1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRFZGl0SG9tZShlZGl0OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZWRpdGhvbWVTb3VyY2UubmV4dChlZGl0KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2FsbEFwcHNMb2FkZWQobW9Gb3JSZXBvcnRNb2RlbDogTW9Gb3JSZXBvcnRNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIG1vRm9yUmVwb3J0TW9kZWwuTW9EYXRhTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVOYXZpZ2F0b3IoYyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fc2V0SG9tZUFwcFRpbGVHcm91cHMobW9Gb3JSZXBvcnRNb2RlbC5Nb0RhdGFMaXN0KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX2xvYWRBcHBUaWxlc09mQXBwVGlsZUdyb3VwKHNlbGVjdGVkQXBwVGlsZWdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhbGxBcHBzOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoYWxsQXBwcyk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoIXNlbGVjdGVkQXBwVGlsZWdyb3VwLlVzZXJBcHBUaWxlR3JvdXBTZXR0aW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRBcHBUaWxlc0J5QXBwVGlsZUdyb3VwKHNlbGVjdGVkQXBwVGlsZWdyb3VwLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXBTZXR0aW5nKHNlbGVjdGVkQXBwVGlsZWdyb3VwLCBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAoYXBwR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ0xvYWRBbGxBcHBUaWxlc0J5QXBwVGlsZUdyb3VwJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoYXBwR3JvdXAsIGFwcFRpbGVzKTtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGFwcFRpbGVzOiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuYXBwVGlsZUdyb3Vwcykge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cCA9IHsgLi4uc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsICRUaWxlc0xvYWRlZDogdHJ1ZSB9O1xyXG4gICAgICAgICAgICBhcHBUaWxlcy5Nb0RhdGFMaXN0LmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuQ29tcG9uZW50ID0gZWxlbWVudC5BX0FwcF9Db21wb25lbnQgPz8gZWxlbWVudC5BX0FwcFRpbGVfQXBwX0NvbXBvbmVudDtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuRHluYW1pY0NvbW1hbmQgPSBlbGVtZW50LkFfQXBwX0R5bmFtaWNDb21tYW5kID8/IGVsZW1lbnQuQV9BcHBUaWxlX0FwcF9EeW5hbWljQ29tbWFuZDtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQuUHJlZGVmaW5lZCA9IGVsZW1lbnQuUHJlZGVmaW5lZCA/PyBlbGVtZW50LkFfQXBwVGlsZV9QcmVkZWZpbmVkO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgYXBwdGlsZUdyb3VwSW5kZXggPSB0aGlzLmFwcFRpbGVHcm91cHM/Lk1vRGF0YUxpc3QuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgICAgKGMpID0+IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLklkIHx8IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLiRQYXJlbnRJZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cC5BcHBUaWxlcyA9IGFwcFRpbGVzO1xyXG4gICAgICAgICAgICBjb25zdCB0aWxlR3JvdXAgPSB0aGlzLmFwcFRpbGVHcm91cHMuTW9EYXRhTGlzdFthcHB0aWxlR3JvdXBJbmRleF07XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcFRpbGVncm91cC4kUGFyZW50SWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aWxlR3JvdXAuJENoaWxkcmVuKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRPZlN1Ykdyb3VwID0gdGlsZUdyb3VwLiRDaGlsZHJlbi5maW5kSW5kZXgoKGMpID0+IGMuSWQgPT09IHNlbGVjdGVkQXBwVGlsZWdyb3VwLklkKTtcclxuICAgICAgICAgICAgICAgICAgICB0aWxlR3JvdXAuJENoaWxkcmVuW2lkT2ZTdWJHcm91cF0gPSBzZWxlY3RlZEFwcFRpbGVncm91cDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XSA9IHsgLi4udGlsZUdyb3VwIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFwcFRpbGVHcm91cHMuTW9EYXRhTGlzdFthcHB0aWxlR3JvdXBJbmRleF0gPSBzZWxlY3RlZEFwcFRpbGVncm91cDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHByaXZhdGUgX2xvYWRBcHBUaWxlc0J5QXBwVGlsZUdyb3VwU2V0dGluZyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBUaWxlR3JvdXAuSWRdLFxyXG4gICAgICAgICAgICBNZXRob2Q6ICdMb2FkQWxsQXBwVGlsZXNCeVVzZXJBcHBUaWxlR3JvdXBTZXR0aW5ncycsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFwcFRpbGVzOiBNb0ZvclJlcG9ydE1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlc09mQXBwVGlsZUdyb3VwKGFwcFRpbGVHcm91cCwgYXBwVGlsZXMpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX25leHRBbGxBcHBUaWxlR3JvdXBzKG5ld0FsbEFwcHM6IE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSBuZXdBbGxBcHBzID8/IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyA/IHsgLi4uYWxsQXBwcyB9IDogbnVsbCk7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9zZXRIb21lQXBwVGlsZUdyb3VwcyhhcHBHcm91cHM6IE1ldGFvYmplY3REYXRhTW9kZWxbXSk6IHZvaWQge1xyXG4gICAgICAgIGxldCBuZXdBcHBHcm91cHMgPSBbLi4uYXBwR3JvdXBzXTtcclxuICAgICAgICBuZXdBcHBHcm91cHMgPSBuZXdBcHBHcm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5WaXNpYmxlKVxyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gTnVtYmVyKGEubmF2aWdhdG9yT3JkZXJJdGVtKSAtIE51bWJlcihiLm5hdmlnYXRvck9yZGVySXRlbSkpO1xyXG4gICAgICAgIHRoaXMuX2hvbWVBcHBUaWxlR3JvdXBzU291cmNlLm5leHQobmV3QXBwR3JvdXBzKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3NhdmVVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzOiBVc2VyUG9ydGFsU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtuZXcgQmFyc2FBcGkuQ29tbW9uLk1ldGFPYmplY3RXZWIodXNlclBvcnRhbFNldHRpbmdzKV0sXHJcbiAgICAgICAgICAgICAgICBNZXRob2Q6ICdTYXZlVXNlclBvcnRhbFNldHRpbmdzJyxcclxuICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcEdyb3VwU2V0dGluZyhhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgYXBwR3JvdXBTZXR0aW5nOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICBjb25zdCBzZWxlY3RlZEFwcEdyb3VwID0gYWxsQXBwcz8uTW9EYXRhTGlzdC5maW5kKChjKSA9PiBjLklkID09PSBhcHBHcm91cC5JZCk7XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkQXBwR3JvdXAgJiYgYWxsQXBwcykge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEFwcEdyb3VwLlVzZXJBcHBUaWxlR3JvdXBTZXR0aW5nID0gYXBwR3JvdXBTZXR0aW5nO1xyXG4gICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIGZpbmRBcHBUaWxlV2l0aEtleShhbGxBcHBzOiBNb0ZvclJlcG9ydE1vZGVsLCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUaWxlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuUmVwbGFjZUFyYWJpY0NoYXJjaHRlcih2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghYWxsQXBwcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LmZvckVhY2goKGFwcEdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFRpbGUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzZWxlY3RlZFRpbGUgPSBhcHBHcm91cC5uYXZpZ2F0b3JUaWxlcy5maW5kKFxyXG4gICAgICAgICAgICAgICAgKGMpID0+IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGMsIGtleSwgbnVsbCkgPT09IHZhbHVlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGFwcEdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViR3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRpbGUpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFRpbGUgPSBzdWJHcm91cC5uYXZpZ2F0b3JUaWxlcy5maW5kKFxyXG4gICAgICAgICAgICAgICAgICAgIChjKSA9PiBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShjLCBrZXksIG51bGwpID09PSB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkVGlsZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZmluZEdyb3VwV2l0aEFwcFRpbGVJZChhbGxBcHBzLCBhcHBUaWxlSWQ6IHN0cmluZyk6IE1ldGFvYmplY3REYXRhTW9kZWwgfCBudWxsIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRHcm91cDtcclxuXHJcbiAgICAgICAgaWYgKCFhbGxBcHBzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhbGxBcHBzLk1vRGF0YUxpc3QuZm9yRWFjaCgoYXBwR3JvdXApID0+IHtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoYXBwR3JvdXAubmF2aWdhdG9yVGlsZXMuc29tZSgoYXBwVGlsZSkgPT4gYXBwVGlsZS5JZCA9PT0gYXBwVGlsZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IGFwcEdyb3VwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFwcEdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViR3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJHcm91cC5uYXZpZ2F0b3JUaWxlcy5zb21lKChhcHBUaWxlKSA9PiBhcHBUaWxlLklkID09PSBhcHBUaWxlSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IHN1Ykdyb3VwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkR3JvdXA7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9maW5kR3JvdXBXaXRoQXBwR3JvdXBJZChhbGxBcHBzLCBhcHBHcm91cElkOiBzdHJpbmcpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkR3JvdXA7XHJcblxyXG4gICAgICAgIGlmICghYWxsQXBwcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LmZvckVhY2goKGFwcEdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLklkID09PSBhcHBHcm91cElkKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwID0gYXBwR3JvdXA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXBwR3JvdXAuJENoaWxkcmVuPy5mb3JFYWNoKChzdWJHcm91cCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1Ykdyb3VwLklkID09PSBhcHBHcm91cElkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IHN1Ykdyb3VwO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXBwVGlsZUdyb3VwU2V0dGluZ3MoXHJcbiAgICAgICAgYXBwVGlsZUdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgICAgIHNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWxcclxuICAgICk6IE1ldGFvYmplY3REYXRhTW9kZWwge1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5Vc2VyQXBwVGlsZUdyb3VwU2V0dGluZyA9IHNldHRpbmc7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhcHBUaWxlR3JvdXApKTtcclxuICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcygpO1xyXG4gICAgICAgIHJldHVybiBhcHBUaWxlR3JvdXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcHJlcGFyZU5hdmlnYXRvcihhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBhcHBUaWxlR3JvdXAuJFRpbGVTZXR0aW5nQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC4kRGlzYWJsZWRwaW4gPSBmYWxzZTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLFxyXG4gICAgICAgICAgICAnVXNlckFwcFRpbGVHcm91cFNldHRpbmcuVGl0bGUnLFxyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAuVGl0bGVcclxuICAgICAgICApO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9IGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9XHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9PT0gJycgPyBhcHBUaWxlR3JvdXAuVGl0bGUgOiBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGU7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlID0gdGhpcy5fYmJiVHJhbnNsYXRlUGlwZS50cmFuc2Zvcm0oYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlKTtcclxuICAgICAgICBjb25zdCBvcmRlckl0ZW0gPSBCYXJzYUFwaS5Db21tb24uVXRpbC5UcnlHZXRWYWx1ZShhcHBUaWxlR3JvdXAsICdVc2VyQXBwVGlsZUdyb3VwU2V0dGluZy5PcmRlckl0ZW0nLCBudWxsKTtcclxuICAgICAgICBpZiAob3JkZXJJdGVtICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JPcmRlckl0ZW0gPSBvcmRlckl0ZW07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvck9yZGVySXRlbSA9IGFwcFRpbGVHcm91cC5PcmRlckl0ZW07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZUdyb3VwLCAnVXNlckFwcFRpbGVHcm91cFNldHRpbmcuVmlzaWJsZScsIG51bGwpO1xyXG4gICAgICAgIGlmICh2aXNpYmxlICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JWaXNpYmxlID0gdmlzaWJsZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVmlzaWJsZSA9IGFwcFRpbGVHcm91cC5WaXNpYmxlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgYXBwVGlsZXMgPSBhcHBUaWxlR3JvdXAuQXBwVGlsZXM/Lk1vRGF0YUxpc3QgPz8gW107XHJcblxyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaWxlcyA9IGFwcFRpbGVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMuVmlzaWJsZSAmJiAhYy5Jc0FjdGlvbkxpbmspXHJcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYS5PcmRlckl0ZW0pIC0gTnVtYmVyKGIuT3JkZXJJdGVtKSk7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvckFjdGlvbkxpbmtzID0gYXBwVGlsZXNcclxuICAgICAgICAgICAgLmZpbHRlcigoYykgPT4gYy5WaXNpYmxlICYmIGMuSXNBY3Rpb25MaW5rKVxyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gTnVtYmVyKGEuT3JkZXJJdGVtQWN0aW9uTGluaykgLSBOdW1iZXIoYi5PcmRlckl0ZW1BY3Rpb25MaW5rKSk7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpbGVzLmZvckVhY2goKGFwcFRpbGUpID0+IHRoaXMuX3NldFRpbGVJbmZvKGFwcFRpbGUpKTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yQWN0aW9uTGlua3MuZm9yRWFjaCgoYXBwVGlsZSkgPT4gdGhpcy5fc2V0VGlsZUluZm8oYXBwVGlsZSkpO1xyXG5cclxuICAgICAgICBhcHBUaWxlR3JvdXAuJENoaWxkcmVuPy5mb3JFYWNoKChzdWJBcHBUaWxlR3JvdXApID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZU5hdmlnYXRvcihzdWJBcHBUaWxlR3JvdXApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbmludGVyZmFjZSBQaW5UaWxlSW5mbyB7XHJcbiAgICBncm91cHM6IE1ldGFvYmplY3REYXRhTW9kZWxbXTtcclxuICAgIHZpc2libGU6IGJvb2xlYW5bXTtcclxuICAgIHRpbGVJZDogc3RyaW5nO1xyXG59XHJcbiJdfQ==