ng-kinintel 0.0.397 → 20.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 (184) hide show
  1. package/fesm2022/ng-kinintel.mjs +11874 -0
  2. package/fesm2022/ng-kinintel.mjs.map +1 -0
  3. package/index.d.ts +2818 -5
  4. package/package.json +6 -14
  5. package/esm2020/lib/components/alert-groups/alert-groups.component.mjs +0 -76
  6. package/esm2020/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.mjs +0 -83
  7. package/esm2020/lib/components/dashboard-editor/configure-item/configure-item.component.mjs +0 -853
  8. package/esm2020/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.mjs +0 -56
  9. package/esm2020/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.mjs +0 -114
  10. package/esm2020/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.mjs +0 -163
  11. package/esm2020/lib/components/dashboard-editor/configure-item/vis-network-options.json +0 -135
  12. package/esm2020/lib/components/dashboard-editor/dashboard-editor.component.mjs +0 -580
  13. package/esm2020/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.mjs +0 -15
  14. package/esm2020/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.mjs +0 -50
  15. package/esm2020/lib/components/dashboard-editor/item-component/item-component.component.mjs +0 -1226
  16. package/esm2020/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.mjs +0 -111
  17. package/esm2020/lib/components/dashboards/dashboards.component.mjs +0 -163
  18. package/esm2020/lib/components/dashboards/view-dashboard/view-dashboard.component.mjs +0 -429
  19. package/esm2020/lib/components/data-explorer/change-source-warning/change-source-warning.component.mjs +0 -20
  20. package/esm2020/lib/components/data-explorer/data-explorer.component.mjs +0 -243
  21. package/esm2020/lib/components/data-explorer/export-data/export-data.component.mjs +0 -62
  22. package/esm2020/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.mjs +0 -70
  23. package/esm2020/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.mjs +0 -190
  24. package/esm2020/lib/components/data-picker/data-picker.component.mjs +0 -79
  25. package/esm2020/lib/components/data-search/data-search.component.mjs +0 -11
  26. package/esm2020/lib/components/data-sharing-invite/data-sharing-invite.component.mjs +0 -52
  27. package/esm2020/lib/components/dataset/create-dataset/create-dataset.component.mjs +0 -47
  28. package/esm2020/lib/components/dataset/dataset-editor/available-columns/available-columns.component.mjs +0 -28
  29. package/esm2020/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.mjs +0 -344
  30. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.mjs +0 -80
  31. package/esm2020/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.mjs +0 -54
  32. package/esm2020/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.mjs +0 -67
  33. package/esm2020/lib/components/dataset/dataset-editor/dataset-editor.component.mjs +0 -1134
  34. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.mjs +0 -201
  35. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.mjs +0 -25
  36. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.mjs +0 -72
  37. package/esm2020/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.mjs +0 -62
  38. package/esm2020/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.mjs +0 -41
  39. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.mjs +0 -78
  40. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.mjs +0 -39
  41. package/esm2020/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.mjs +0 -75
  42. package/esm2020/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.mjs +0 -107
  43. package/esm2020/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.mjs +0 -20
  44. package/esm2020/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.mjs +0 -20
  45. package/esm2020/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.mjs +0 -58
  46. package/esm2020/lib/components/dataset/dataset-editor/share-query/share-query.component.mjs +0 -110
  47. package/esm2020/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.mjs +0 -20
  48. package/esm2020/lib/components/dataset/dataset.component.mjs +0 -294
  49. package/esm2020/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.mjs +0 -130
  50. package/esm2020/lib/components/datasource/create-datasource/api-access/api-access.component.mjs +0 -132
  51. package/esm2020/lib/components/datasource/create-datasource/create-datasource.component.mjs +0 -729
  52. package/esm2020/lib/components/datasource/create-datasource/import-data/import-data.component.mjs +0 -146
  53. package/esm2020/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.mjs +0 -165
  54. package/esm2020/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.mjs +0 -145
  55. package/esm2020/lib/components/datasource/datasource.component.mjs +0 -162
  56. package/esm2020/lib/components/datasource/document-datasource/document-datasource.component.mjs +0 -297
  57. package/esm2020/lib/components/export-project/export-project.component.mjs +0 -29
  58. package/esm2020/lib/components/feeds/feed/feed.component.mjs +0 -92
  59. package/esm2020/lib/components/feeds/feeds.component.mjs +0 -145
  60. package/esm2020/lib/components/job-tasks/job-tasks.component.mjs +0 -25
  61. package/esm2020/lib/components/marketplace/marketplace.component.mjs +0 -65
  62. package/esm2020/lib/components/metadata/metadata.component.mjs +0 -65
  63. package/esm2020/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.mjs +0 -113
  64. package/esm2020/lib/components/notification-groups/notification-groups.component.mjs +0 -86
  65. package/esm2020/lib/components/project-picker/project-picker.component.mjs +0 -118
  66. package/esm2020/lib/components/project-settings/project-link-selection/project-link-selection.component.mjs +0 -104
  67. package/esm2020/lib/components/project-settings/project-settings.component.mjs +0 -155
  68. package/esm2020/lib/components/query-caching/edit-query-cache/edit-query-cache.component.mjs +0 -51
  69. package/esm2020/lib/components/query-caching/query-cache-view/query-cache-view.component.mjs +0 -121
  70. package/esm2020/lib/components/query-caching/query-caching.component.mjs +0 -162
  71. package/esm2020/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.mjs +0 -45
  72. package/esm2020/lib/components/shared-with-me/shared-with-me.component.mjs +0 -174
  73. package/esm2020/lib/components/snapshots/snapshots.component.mjs +0 -244
  74. package/esm2020/lib/components/tag-picker/tag-picker.component.mjs +0 -74
  75. package/esm2020/lib/components/task-time-periods/task-time-periods.component.mjs +0 -55
  76. package/esm2020/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.mjs +0 -40
  77. package/esm2020/lib/guards/dashboard-changes.guard.mjs +0 -22
  78. package/esm2020/lib/kinintel-config.mjs +0 -3
  79. package/esm2020/lib/ng-kinintel.module.mjs +0 -437
  80. package/esm2020/lib/objects/action-event.mjs +0 -16
  81. package/esm2020/lib/services/alert.service.mjs +0 -52
  82. package/esm2020/lib/services/dashboard.service.mjs +0 -75
  83. package/esm2020/lib/services/data-processor.service.mjs +0 -56
  84. package/esm2020/lib/services/data-search.service.mjs +0 -36
  85. package/esm2020/lib/services/dataset.service.mjs +0 -187
  86. package/esm2020/lib/services/datasource.service.mjs +0 -93
  87. package/esm2020/lib/services/external.service.mjs +0 -33
  88. package/esm2020/lib/services/feed.service.mjs +0 -50
  89. package/esm2020/lib/services/notification.service.mjs +0 -41
  90. package/esm2020/lib/services/project.service.mjs +0 -130
  91. package/esm2020/lib/services/tag.service.mjs +0 -63
  92. package/esm2020/ng-kinintel.mjs +0 -5
  93. package/esm2020/public-api.mjs +0 -43
  94. package/fesm2015/ng-kinintel.mjs +0 -12182
  95. package/fesm2015/ng-kinintel.mjs.map +0 -1
  96. package/fesm2020/ng-kinintel.mjs +0 -11872
  97. package/fesm2020/ng-kinintel.mjs.map +0 -1
  98. package/lib/components/alert-groups/alert-groups.component.d.ts +0 -30
  99. package/lib/components/alert-groups/edit-alert-group/edit-alert-group.component.d.ts +0 -28
  100. package/lib/components/dashboard-editor/configure-item/configure-item.component.d.ts +0 -256
  101. package/lib/components/dashboard-editor/configure-item/edit-dashboard-alert/edit-dashboard-alert.component.d.ts +0 -16
  102. package/lib/components/dashboard-editor/configure-item/html-documentation/html-documentation.component.d.ts +0 -59
  103. package/lib/components/dashboard-editor/configure-item/table-cell-formatter/table-cell-formatter.component.d.ts +0 -26
  104. package/lib/components/dashboard-editor/dashboard-editor.component.d.ts +0 -85
  105. package/lib/components/dashboard-editor/dashboard-parameter/dashboard-parameter.component.d.ts +0 -8
  106. package/lib/components/dashboard-editor/dashboard-settings/dashboard-settings.component.d.ts +0 -22
  107. package/lib/components/dashboard-editor/item-component/item-component.component.d.ts +0 -264
  108. package/lib/components/dashboard-editor/source-selector-dialog/source-selector-dialog.component.d.ts +0 -30
  109. package/lib/components/dashboards/dashboards.component.d.ts +0 -56
  110. package/lib/components/dashboards/view-dashboard/view-dashboard.component.d.ts +0 -81
  111. package/lib/components/data-explorer/change-source-warning/change-source-warning.component.d.ts +0 -11
  112. package/lib/components/data-explorer/data-explorer.component.d.ts +0 -61
  113. package/lib/components/data-explorer/export-data/export-data.component.d.ts +0 -17
  114. package/lib/components/data-explorer/snapshot-api-access/snapshot-api-access.component.d.ts +0 -25
  115. package/lib/components/data-explorer/snapshot-profile-dialog/snapshot-profile-dialog.component.d.ts +0 -44
  116. package/lib/components/data-picker/data-picker.component.d.ts +0 -32
  117. package/lib/components/data-search/data-search.component.d.ts +0 -5
  118. package/lib/components/data-sharing-invite/data-sharing-invite.component.d.ts +0 -21
  119. package/lib/components/dataset/create-dataset/create-dataset.component.d.ts +0 -17
  120. package/lib/components/dataset/dataset-editor/available-columns/available-columns.component.d.ts +0 -12
  121. package/lib/components/dataset/dataset-editor/dataset-add-join/dataset-add-join.component.d.ts +0 -61
  122. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-editor/dataset-column-editor.component.d.ts +0 -21
  123. package/lib/components/dataset/dataset-editor/dataset-column-settings/dataset-column-settings.component.d.ts +0 -20
  124. package/lib/components/dataset/dataset-editor/dataset-create-formula/dataset-create-formula.component.d.ts +0 -19
  125. package/lib/components/dataset/dataset-editor/dataset-editor.component.d.ts +0 -131
  126. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter/dataset-filter.component.d.ts +0 -63
  127. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-inclusion/dataset-filter-inclusion.component.d.ts +0 -11
  128. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filter-junction/dataset-filter-junction.component.d.ts +0 -20
  129. package/lib/components/dataset/dataset-editor/dataset-filters/dataset-filters.component.d.ts +0 -16
  130. package/lib/components/dataset/dataset-editor/dataset-name-dialog/dataset-name-dialog.component.d.ts +0 -18
  131. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-add-parameter/dataset-add-parameter.component.d.ts +0 -23
  132. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-type/dataset-parameter-type.component.d.ts +0 -13
  133. package/lib/components/dataset/dataset-editor/dataset-parameter-values/dataset-parameter-values.component.d.ts +0 -22
  134. package/lib/components/dataset/dataset-editor/dataset-summarise/dataset-summarise.component.d.ts +0 -27
  135. package/lib/components/dataset/dataset-editor/move-transformation-confirmation/move-transformation-confirmation.component.d.ts +0 -11
  136. package/lib/components/dataset/dataset-editor/remove-transformation-warning/remove-transformation-warning.component.d.ts +0 -11
  137. package/lib/components/dataset/dataset-editor/save-as-query/save-as-query.component.d.ts +0 -25
  138. package/lib/components/dataset/dataset-editor/share-query/share-query.component.d.ts +0 -41
  139. package/lib/components/dataset/dataset-editor/upstream-changes-confirmation/upstream-changes-confirmation.component.d.ts +0 -11
  140. package/lib/components/dataset/dataset.component.d.ts +0 -74
  141. package/lib/components/datasource/create-datasource/advanced-settings/advanced-settings.component.d.ts +0 -26
  142. package/lib/components/datasource/create-datasource/api-access/api-access.component.d.ts +0 -31
  143. package/lib/components/datasource/create-datasource/create-datasource.component.d.ts +0 -112
  144. package/lib/components/datasource/create-datasource/import-data/import-data.component.d.ts +0 -28
  145. package/lib/components/datasource/create-datasource/import-data/import-wizard/import-wizard.component.d.ts +0 -40
  146. package/lib/components/datasource/create-datasource/tabular-datasource/tabular-datasource.component.d.ts +0 -34
  147. package/lib/components/datasource/datasource.component.d.ts +0 -46
  148. package/lib/components/datasource/document-datasource/document-datasource.component.d.ts +0 -64
  149. package/lib/components/export-project/export-project.component.d.ts +0 -9
  150. package/lib/components/feeds/feed/feed.component.d.ts +0 -30
  151. package/lib/components/feeds/feeds.component.d.ts +0 -47
  152. package/lib/components/job-tasks/job-tasks.component.d.ts +0 -11
  153. package/lib/components/marketplace/marketplace.component.d.ts +0 -42
  154. package/lib/components/metadata/metadata.component.d.ts +0 -24
  155. package/lib/components/notification-groups/edit-notification-group/edit-notification-group.component.d.ts +0 -37
  156. package/lib/components/notification-groups/notification-groups.component.d.ts +0 -28
  157. package/lib/components/project-picker/project-picker.component.d.ts +0 -37
  158. package/lib/components/project-settings/project-link-selection/project-link-selection.component.d.ts +0 -32
  159. package/lib/components/project-settings/project-settings.component.d.ts +0 -40
  160. package/lib/components/query-caching/edit-query-cache/edit-query-cache.component.d.ts +0 -17
  161. package/lib/components/query-caching/query-cache-view/query-cache-view.component.d.ts +0 -35
  162. package/lib/components/query-caching/query-caching.component.d.ts +0 -38
  163. package/lib/components/shared-with-me/feed-api-modal/feed-api-modal.component.d.ts +0 -21
  164. package/lib/components/shared-with-me/shared-with-me.component.d.ts +0 -43
  165. package/lib/components/snapshots/snapshots.component.d.ts +0 -52
  166. package/lib/components/tag-picker/tag-picker.component.d.ts +0 -27
  167. package/lib/components/task-time-periods/task-time-periods.component.d.ts +0 -20
  168. package/lib/components/whitelisted-sql-functions/whitelisted-sql-functions.component.d.ts +0 -17
  169. package/lib/guards/dashboard-changes.guard.d.ts +0 -11
  170. package/lib/kinintel-config.d.ts +0 -10
  171. package/lib/ng-kinintel.module.d.ts +0 -116
  172. package/lib/objects/action-event.d.ts +0 -12
  173. package/lib/services/alert.service.d.ts +0 -17
  174. package/lib/services/dashboard.service.d.ts +0 -25
  175. package/lib/services/data-processor.service.d.ts +0 -18
  176. package/lib/services/data-search.service.d.ts +0 -14
  177. package/lib/services/dataset.service.d.ts +0 -56
  178. package/lib/services/datasource.service.d.ts +0 -34
  179. package/lib/services/external.service.d.ts +0 -12
  180. package/lib/services/feed.service.d.ts +0 -19
  181. package/lib/services/notification.service.d.ts +0 -16
  182. package/lib/services/project.service.d.ts +0 -27
  183. package/lib/services/tag.service.d.ts +0 -19
  184. package/public-api.d.ts +0 -38
@@ -1,104 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog';
3
- import { BehaviorSubject, merge } from 'rxjs';
4
- import { debounceTime, distinctUntilChanged, map, switchMap } from 'rxjs/operators';
5
- import * as _ from 'lodash';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/material/legacy-dialog";
8
- import * as i2 from "../../../services/dashboard.service";
9
- import * as i3 from "../../../services/dataset.service";
10
- import * as i4 from "../../../services/datasource.service";
11
- import * as i5 from "@angular/common";
12
- import * as i6 from "@angular/material/legacy-button";
13
- import * as i7 from "@angular/material/icon";
14
- import * as i8 from "@angular/cdk/drag-drop";
15
- export class ProjectLinkSelectionComponent {
16
- constructor(dialogRef, data, dashboardService, datasetService, datasourceService) {
17
- this.dialogRef = dialogRef;
18
- this.data = data;
19
- this.dashboardService = dashboardService;
20
- this.datasetService = datasetService;
21
- this.datasourceService = datasourceService;
22
- this.searchText = new BehaviorSubject('');
23
- this.projectDashboards = [];
24
- this.sharedDashboards = [];
25
- this.storedQueries = [];
26
- this.dataPackages = [];
27
- this.datasources = [];
28
- }
29
- ngOnInit() {
30
- merge(this.searchText)
31
- .pipe(debounceTime(300),
32
- // distinctUntilChanged(),
33
- switchMap(() => this.getProjectDashboards())).subscribe((dashboards) => {
34
- this.projectDashboards = dashboards;
35
- });
36
- merge(this.searchText)
37
- .pipe(debounceTime(300),
38
- // distinctUntilChanged(),
39
- switchMap(() => this.getSharedDashboards())).subscribe((dashboards) => {
40
- this.sharedDashboards = dashboards;
41
- });
42
- merge(this.searchText)
43
- .pipe(debounceTime(300),
44
- // distinctUntilChanged(),
45
- switchMap(() => this.getDatasets())).subscribe((datasets) => {
46
- this.storedQueries = datasets;
47
- });
48
- merge(this.searchText)
49
- .pipe(debounceTime(300),
50
- // distinctUntilChanged(),
51
- switchMap(() => this.getDataPackages())).subscribe((datasets) => {
52
- this.dataPackages = datasets;
53
- });
54
- merge(this.searchText)
55
- .pipe(debounceTime(300), distinctUntilChanged(), switchMap(() => this.getDatasources())).subscribe((sources) => {
56
- this.datasources = sources;
57
- });
58
- }
59
- selectDashboard(dashboard) {
60
- this.dialogRef.close(this.data.dashboardURL + '/view/' + dashboard.id);
61
- }
62
- selectQuery(query) {
63
- this.dialogRef.close(this.data.queryURL + '/' + query.id);
64
- }
65
- selectDatasource(datasource) {
66
- const datasourceURL = _.find(this.data.datasourceURLs, { type: datasource.type });
67
- this.dialogRef.close((datasourceURL ? datasourceURL.url : '') + '/' + datasource.key);
68
- }
69
- getSharedDashboards() {
70
- return this.dashboardService.getDashboards(this.searchText.getValue() || '', '5', '0', null).pipe(map((dashboards) => {
71
- return dashboards;
72
- }));
73
- }
74
- getProjectDashboards() {
75
- return this.dashboardService.getDashboards(this.searchText.getValue() || '', '5', '0', '').pipe(map((dashboards) => {
76
- return dashboards;
77
- }));
78
- }
79
- getDatasets() {
80
- return this.datasetService.getDatasets(this.searchText.getValue() || '', '5', '0', '').pipe(map((datasets) => {
81
- return datasets;
82
- }));
83
- }
84
- getDataPackages() {
85
- return this.datasetService.getDatasets(this.searchText.getValue() || '', '5', '0', null).pipe(map((datasets) => {
86
- return datasets;
87
- }));
88
- }
89
- getDatasources() {
90
- return this.datasourceService.getDatasources(this.searchText.getValue() || '', '5', '0').pipe(map((sources) => {
91
- return sources;
92
- }));
93
- }
94
- }
95
- ProjectLinkSelectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProjectLinkSelectionComponent, deps: [{ token: i1.MatLegacyDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.DashboardService }, { token: i3.DatasetService }, { token: i4.DatasourceService }], target: i0.ɵɵFactoryTarget.Component });
96
- ProjectLinkSelectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ProjectLinkSelectionComponent, selector: "ki-project-link-selection", host: { classAttribute: "dialog-wrapper" }, ngImport: i0, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Available Data Items</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div\n class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\"\n class=\"block w-full rounded-none pl-10 border-t-1 border-l-0 border-gray-300\"\n placeholder=\"Search for a dashboard, stored query, or other data item.\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n <table class=\"min-w-full\">\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Project Dashboards</th>\n </tr>\n\n <tr *ngFor=\"let dashboard of projectDashboards\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dashboard.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Shared Dashboards</th>\n </tr>\n\n <tr *ngFor=\"let dashboard of sharedDashboards\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">{{dashboard.title}}</td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Stored Queries</th>\n </tr>\n\n <tr *ngFor=\"let query of storedQueries\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{query.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(query)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n My Data</th>\n </tr>\n\n <tr *ngFor=\"let datasource of datasources\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{datasource.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDatasource(datasource)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Data Feed</th>\n </tr>\n\n <tr *ngFor=\"let dataPackage of dataPackages\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dataPackage.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(dataPackage)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <div></div>\n </div>\n\n</div>\n\n\n", styles: [""], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: i6.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i1.MatLegacyDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1.MatLegacyDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }] });
97
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProjectLinkSelectionComponent, decorators: [{
98
- type: Component,
99
- args: [{ selector: 'ki-project-link-selection', host: { class: 'dialog-wrapper' }, template: "<div class=\"dialog\" cdkDrag cdkDragRootElement=\".cdk-overlay-pane\">\n\n <div class=\"dialog-title\" cdkDragHandle>\n <h2 mat-dialog-title>Available Data Items</h2>\n\n <button mat-icon-button mat-dialog-close>\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n\n <div class=\"dialog-content p-0\">\n <div class=\"flex\">\n <div class=\"relative flex-grow focus-within:z-10\">\n <div\n class=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none\">\n <svg class=\"h-5 w-5 text-gray-400\" xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n <path fill-rule=\"evenodd\"\n d=\"M8 4a4 4 0 100 8 4 4 0 000-8zM2 8a6 6 0 1110.89 3.476l4.817 4.817a1 1 0 01-1.414 1.414l-4.816-4.816A6 6 0 012 8z\"\n clip-rule=\"evenodd\"/>\n </svg>\n </div>\n <input type=\"text\"\n class=\"block w-full rounded-none pl-10 border-t-1 border-l-0 border-gray-300\"\n placeholder=\"Search for a dashboard, stored query, or other data item.\"\n (keyup)=\"searchText.next($event.target.value)\">\n </div>\n </div>\n <table class=\"min-w-full\">\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Project Dashboards</th>\n </tr>\n\n <tr *ngFor=\"let dashboard of projectDashboards\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dashboard.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Shared Dashboards</th>\n </tr>\n\n <tr *ngFor=\"let dashboard of sharedDashboards\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">{{dashboard.title}}</td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDashboard(dashboard)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Stored Queries</th>\n </tr>\n\n <tr *ngFor=\"let query of storedQueries\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{query.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(query)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n My Data</th>\n </tr>\n\n <tr *ngFor=\"let datasource of datasources\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{datasource.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectDatasource(datasource)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n\n </tbody>\n <tbody class=\"bg-white\">\n <tr class=\"border-t border-gray-200\">\n <th colspan=\"5\" scope=\"colgroup\" class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n Data Feed</th>\n </tr>\n\n <tr *ngFor=\"let dataPackage of dataPackages\" class=\"border-t border-gray-300\">\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{dataPackage.title}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <a (click)=\"selectQuery(dataPackage)\" class=\"text-primary\">Select</a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div class=\"dialog-footer\">\n <button mat-button mat-dialog-close mat-stroked-button type=\"button\">Close</button>\n\n <div></div>\n </div>\n\n</div>\n\n\n" }]
100
- }], ctorParameters: function () { return [{ type: i1.MatLegacyDialogRef }, { type: undefined, decorators: [{
101
- type: Inject,
102
- args: [MAT_DIALOG_DATA]
103
- }] }, { type: i2.DashboardService }, { type: i3.DatasetService }, { type: i4.DatasourceService }]; } });
104
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1saW5rLXNlbGVjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvcHJvamVjdC1zZXR0aW5ncy9wcm9qZWN0LWxpbmstc2VsZWN0aW9uL3Byb2plY3QtbGluay1zZWxlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmcta2luaW50ZWwvc3JjL2xpYi9jb21wb25lbnRzL3Byb2plY3Qtc2V0dGluZ3MvcHJvamVjdC1saW5rLXNlbGVjdGlvbi9wcm9qZWN0LWxpbmstc2VsZWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBQyxzQkFBc0IsSUFBSSxlQUFlLEVBQXFDLE1BQU0saUNBQWlDLENBQUM7QUFDOUgsT0FBTyxFQUFDLGVBQWUsRUFBRSxLQUFLLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEYsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7Ozs7Ozs7Ozs7QUFRNUIsTUFBTSxPQUFPLDZCQUE2QjtJQVN0QyxZQUFtQixTQUFzRCxFQUM3QixJQUFTLEVBQ2pDLGdCQUFrQyxFQUNsQyxjQUE4QixFQUM5QixpQkFBb0M7UUFKckMsY0FBUyxHQUFULFNBQVMsQ0FBNkM7UUFDN0IsU0FBSSxHQUFKLElBQUksQ0FBSztRQUNqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1C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Y0FBYyxDQUFDLFdBQVcsQ0FDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQ2hDLEdBQUcsRUFDSCxHQUFHLEVBQ0gsSUFBSSxDQUNQLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sUUFBUSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDO0lBRU8sY0FBYztRQUNsQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUNoQyxHQUFHLEVBQ0gsR0FBRyxDQUNOLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQVksRUFBRSxFQUFFO1lBQ3BCLE9BQU8sT0FBTyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUNMLENBQUM7SUFDTixDQUFDOzsySEFoSlEsNkJBQTZCLG9EQVVsQixlQUFlOytHQVYxQiw2QkFBNkIsNkdDZjFDLHN0TEF3SEE7NEZEekdhLDZCQUE2QjtrQkFOekMsU0FBUzsrQkFDSSwyQkFBMkIsUUFHL0IsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUM7OzBCQVlsQixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNQVRfTEVHQUNZX0RJQUxPR19EQVRBIGFzIE1BVF9ESUFMT0dfREFUQSwgTWF0TGVnYWN5RGlhbG9nUmVmIGFzIE1hdERpYWxvZ1JlZn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgbWVyZ2UsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtEYXNoYm9hcmRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kYXNoYm9hcmQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFzZXRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9kYXRhc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZGF0YXNvdXJjZS5zZXJ2aWNlJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdraS1wcm9qZWN0LWxpbmstc2VsZWN0aW9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcHJvamVjdC1saW5rLXNlbGVjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcHJvamVjdC1saW5rLXNlbGVjdGlvbi5jb21wb25lbnQuc2FzcyddLFxuICAgIGhvc3Q6IHtjbGFzczogJ2RpYWxvZy13cmFwcGVyJ31cbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdExpbmtTZWxlY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgcHVibGljIHNlYXJjaFRleHQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgICBwdWJsaWMgcHJvamVjdERhc2hib2FyZHM6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBzaGFyZWREYXNoYm9hcmRzOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgc3RvcmVkUXVlcmllczogYW55ID0gW107XG4gICAgcHVibGljIGRhdGFQYWNrYWdlczogYW55ID0gW107XG4gICAgcHVibGljIGRhdGFzb3VyY2VzOiBhbnkgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxQcm9qZWN0TGlua1NlbGVjdGlvbkNvbXBvbmVudD4sXG4gICAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkYXNoYm9hcmRTZXJ2aWNlOiBEYXNoYm9hcmRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGF0YXNldFNlcnZpY2U6IERhdGFzZXRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGF0YXNvdXJjZVNlcnZpY2U6IERhdGFzb3VyY2VTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5zZWFyY2hUZXh0KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9qZWN0RGFzaGJvYXJkcygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGRhc2hib2FyZHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0RGFzaGJvYXJkcyA9IGRhc2hib2FyZHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lcmdlKHRoaXMuc2VhcmNoVGV4dClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgIC8vIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hhcmVkRGFzaGJvYXJkcygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGRhc2hib2FyZHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zaGFyZWREYXNoYm9hcmRzID0gZGFzaGJvYXJkcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbWVyZ2UodGhpcy5zZWFyY2hUZXh0KVxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgICAgICAgICAgLy8gZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhc2V0cygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGRhdGFzZXRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmVkUXVlcmllcyA9IGRhdGFzZXRzO1xuICAgICAgICB9KTtcblxuICAgICAgICBtZXJnZSh0aGlzLnNlYXJjaFRleHQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMzAwKSxcbiAgICAgICAgICAgICAgICAvLyBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERhdGFQYWNrYWdlcygpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKS5zdWJzY3JpYmUoKGRhdGFzZXRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVBhY2thZ2VzID0gZGF0YXNldHM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lcmdlKHRoaXMuc2VhcmNoVGV4dClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgzMDApLFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXNvdXJjZXMoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkuc3Vic2NyaWJlKChzb3VyY2VzOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZXMgPSBzb3VyY2VzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VsZWN0RGFzaGJvYXJkKGRhc2hib2FyZCkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLmRhdGEuZGFzaGJvYXJkVVJMICsgJy92aWV3LycgKyBkYXNoYm9hcmQuaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZWxlY3RRdWVyeShxdWVyeSkge1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSh0aGlzLmRhdGEucXVlcnlVUkwgKyAnLycgKyBxdWVyeS5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdERhdGFzb3VyY2UoZGF0YXNvdXJjZSkge1xuICAgICAgICBjb25zdCBkYXRhc291cmNlVVJMID0gXy5maW5kKHRoaXMuZGF0YS5kYXRhc291cmNlVVJMcywge3R5cGU6IGRhdGFzb3VyY2UudHlwZX0pO1xuICAgICAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZSgoZGF0YXNvdXJjZVVSTCA/IGRhdGFzb3VyY2VVUkwudXJsIDogJycpICsgJy8nICsgZGF0YXNvdXJjZS5rZXkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U2hhcmVkRGFzaGJvYXJkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGFzaGJvYXJkU2VydmljZS5nZXREYXNoYm9hcmRzKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmdldFZhbHVlKCkgfHwgJycsXG4gICAgICAgICAgICAnNScsXG4gICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICkucGlwZShtYXAoKGRhc2hib2FyZHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb2plY3REYXNoYm9hcmRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldERhc2hib2FyZHMoXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFRleHQuZ2V0VmFsdWUoKSB8fCAnJyxcbiAgICAgICAgICAgICc1JyxcbiAgICAgICAgICAgICcwJyxcbiAgICAgICAgICAgICcnXG4gICAgICAgICkucGlwZShtYXAoKGRhc2hib2FyZHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXNoYm9hcmRzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGFzZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhc2V0U2VydmljZS5nZXREYXRhc2V0cyhcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVGV4dC5nZXRWYWx1ZSgpIHx8ICcnLFxuICAgICAgICAgICAgJzUnLFxuICAgICAgICAgICAgJzAnLFxuICAgICAgICAgICAgJydcbiAgICAgICAgKS5waXBlKG1hcCgoZGF0YXNldHM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhc2V0cztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhUGFja2FnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzZXRTZXJ2aWNlLmdldERhdGFzZXRzKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmdldFZhbHVlKCkgfHwgJycsXG4gICAgICAgICAgICAnNScsXG4gICAgICAgICAgICAnMCcsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICkucGlwZShtYXAoKGRhdGFzZXRzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YXNldHM7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YXNvdXJjZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFzb3VyY2VTZXJ2aWNlLmdldERhdGFzb3VyY2VzKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hUZXh0LmdldFZhbHVlKCkgfHwgJycsXG4gICAgICAgICAgICAnNScsXG4gICAgICAgICAgICAnMCdcbiAgICAgICAgKS5waXBlKG1hcCgoc291cmNlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZXM7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkaWFsb2dcIiBjZGtEcmFnIGNka0RyYWdSb290RWxlbWVudD1cIi5jZGstb3ZlcmxheS1wYW5lXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwiZGlhbG9nLXRpdGxlXCIgY2RrRHJhZ0hhbmRsZT5cbiAgICAgICAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+QXZhaWxhYmxlIERhdGEgSXRlbXM8L2gyPlxuXG4gICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+XG4gICAgICAgICAgICA8bWF0LWljb24+Y2xlYXI8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJkaWFsb2ctY29udGVudCBwLTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXhcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4LWdyb3cgZm9jdXMtd2l0aGluOnotMTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWJzb2x1dGUgaW5zZXQteS0wIGxlZnQtMCBwbC0zIGZsZXggaXRlbXMtY2VudGVyIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImgtNSB3LTUgdGV4dC1ncmF5LTQwMFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsLXJ1bGU9XCJldmVub2RkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNOCA0YTQgNCAwIDEwMCA4IDQgNCAwIDAwMC04ek0yIDhhNiA2IDAgMTExMC44OSAzLjQ3Nmw0LjgxNyA0LjgxN2ExIDEgMCAwMS0xLjQxNCAxLjQxNGwtNC44MTYtNC44MTZBNiA2IDAgMDEyIDh6XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAtcnVsZT1cImV2ZW5vZGRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIHJvdW5kZWQtbm9uZSBwbC0xMCBib3JkZXItdC0xIGJvcmRlci1sLTAgYm9yZGVyLWdyYXktMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggZm9yIGEgZGFzaGJvYXJkLCBzdG9yZWQgcXVlcnksIG9yIG90aGVyIGRhdGEgaXRlbS5cIlxuICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXApPVwic2VhcmNoVGV4dC5uZXh0KCRldmVudC50YXJnZXQudmFsdWUpXCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDx0YWJsZSBjbGFzcz1cIm1pbi13LWZ1bGxcIj5cbiAgICAgICAgICAgIDx0Ym9keSBjbGFzcz1cImJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiNVwiIHNjb3BlPVwiY29sZ3JvdXBcIiBjbGFzcz1cImJnLWdyYXktNTAgcHgtNCBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBzbTpweC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0IERhc2hib2FyZHM8L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhc2hib2FyZCBvZiBwcm9qZWN0RGFzaGJvYXJkc1wiIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIHB5LTQgcGwtNCBwci0zIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBzbTpwbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2Rhc2hib2FyZC50aXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInJlbGF0aXZlIHdoaXRlc3BhY2Utbm93cmFwIHB5LTQgcGwtMyBwci00IHRleHQtcmlnaHQgdGV4dC1zbSBmb250LW1lZGl1bSBzbTpwci02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0RGFzaGJvYXJkKGRhc2hib2FyZClcIiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPlNlbGVjdDwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICA8L3Rib2R5PlxuXG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49XCI1XCIgc2NvcGU9XCJjb2xncm91cFwiIGNsYXNzPVwiYmctZ3JheS01MCBweC00IHB5LTIgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHNtOnB4LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgU2hhcmVkIERhc2hib2FyZHM8L3RoPlxuICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXNoYm9hcmQgb2Ygc2hhcmVkRGFzaGJvYXJkc1wiIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMzAwXCI+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgcHktNCBwbC00IHByLTMgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwIHNtOnBsLTZcIj57e2Rhc2hib2FyZC50aXRsZX19PC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyZWxhdGl2ZSB3aGl0ZXNwYWNlLW5vd3JhcCBweS00IHBsLTMgcHItNCB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1tZWRpdW0gc206cHItNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0RGFzaGJvYXJkKGRhc2hib2FyZClcIiBjbGFzcz1cInRleHQtcHJpbWFyeVwiPlNlbGVjdDwvYT5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cblxuICAgICAgICAgICAgPC90Ym9keT5cblxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiNVwiIHNjb3BlPVwiY29sZ3JvdXBcIiBjbGFzcz1cImJnLWdyYXktNTAgcHgtNCBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBzbTpweC02XCI+XG4gICAgICAgICAgICAgICAgICAgIFN0b3JlZCBRdWVyaWVzPC90aD5cbiAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcXVlcnkgb2Ygc3RvcmVkUXVlcmllc1wiIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMzAwXCI+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgcHktNCBwbC00IHByLTMgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwIHNtOnBsLTZcIj5cbiAgICAgICAgICAgICAgICAgICAge3txdWVyeS50aXRsZX19XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyZWxhdGl2ZSB3aGl0ZXNwYWNlLW5vd3JhcCBweS00IHBsLTMgcHItNCB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1tZWRpdW0gc206cHItNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0UXVlcnkocXVlcnkpXCIgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj5TZWxlY3Q8L2E+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICA8dGJvZHkgY2xhc3M9XCJiZy13aGl0ZVwiPlxuICAgICAgICAgICAgPHRyIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwXCI+XG4gICAgICAgICAgICAgICAgPHRoIGNvbHNwYW49XCI1XCIgc2NvcGU9XCJjb2xncm91cFwiIGNsYXNzPVwiYmctZ3JheS01MCBweC00IHB5LTIgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHNtOnB4LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgTXkgRGF0YTwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGFzb3VyY2Ugb2YgZGF0YXNvdXJjZXNcIiBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTMwMFwiPlxuICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIHB5LTQgcGwtNCBwci0zIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBzbTpwbC02XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0YXNvdXJjZS50aXRsZX19XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyZWxhdGl2ZSB3aGl0ZXNwYWNlLW5vd3JhcCBweS00IHBsLTMgcHItNCB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1tZWRpdW0gc206cHItNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0RGF0YXNvdXJjZShkYXRhc291cmNlKVwiIGNsYXNzPVwidGV4dC1wcmltYXJ5XCI+U2VsZWN0PC9hPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgPHRib2R5IGNsYXNzPVwiYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjb2xzcGFuPVwiNVwiIHNjb3BlPVwiY29sZ3JvdXBcIiBjbGFzcz1cImJnLWdyYXktNTAgcHgtNCBweS0yIHRleHQtbGVmdCB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ncmF5LTkwMCBzbTpweC02XCI+XG4gICAgICAgICAgICAgICAgICAgIERhdGEgRmVlZDwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGRhdGFQYWNrYWdlIG9mIGRhdGFQYWNrYWdlc1wiIGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMzAwXCI+XG4gICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgcHktNCBwbC00IHByLTMgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktOTAwIHNtOnBsLTZcIj5cbiAgICAgICAgICAgICAgICAgICAge3tkYXRhUGFja2FnZS50aXRsZX19XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyZWxhdGl2ZSB3aGl0ZXNwYWNlLW5vd3JhcCBweS00IHBsLTMgcHItNCB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1tZWRpdW0gc206cHItNlwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwic2VsZWN0UXVlcnkoZGF0YVBhY2thZ2UpXCIgY2xhc3M9XCJ0ZXh0LXByaW1hcnlcIj5TZWxlY3Q8L2E+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICA8L3RhYmxlPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImRpYWxvZy1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2UgbWF0LXN0cm9rZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIj5DbG9zZTwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXY+PC9kaXY+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG5cbiJdfQ==
@@ -1,155 +0,0 @@
1
- import { Component, Input } from '@angular/core';
2
- import { ProjectLinkSelectionComponent } from '../project-settings/project-link-selection/project-link-selection.component';
3
- import * as _ from 'lodash';
4
- import { moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../services/project.service";
7
- import * as i2 from "@angular/material/legacy-dialog";
8
- import * as i3 from "../../services/dashboard.service";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/material/legacy-button";
11
- import * as i6 from "@angular/material/icon";
12
- import * as i7 from "@angular/material/expansion";
13
- import * as i8 from "@angular/material/legacy-input";
14
- import * as i9 from "@angular/cdk/drag-drop";
15
- import * as i10 from "@angular/forms";
16
- import * as i11 from "@angular/material/legacy-slide-toggle";
17
- import * as i12 from "@angular/material/legacy-radio";
18
- export class ProjectSettingsComponent {
19
- constructor(projectService, dialog, dashboardService) {
20
- this.projectService = projectService;
21
- this.dialog = dialog;
22
- this.dashboardService = dashboardService;
23
- this.defaultColours = [''];
24
- this.projectSettings = {};
25
- this.categories = [];
26
- this.newShortcut = {};
27
- this.showNewShortcut = false;
28
- this.shortcuts = {};
29
- this.Object = Object;
30
- this.dashboards = [];
31
- this.sharedDashboards = [];
32
- }
33
- async ngOnInit() {
34
- this.activeProject = this.projectService.activeProject.getValue();
35
- this.dashboards = await this.dashboardService.getDashboards('', '100', '0').toPromise();
36
- this.sharedDashboards = await this.dashboardService.getDashboards('', '100', '0', null).toPromise();
37
- this.activeProjectSub = this.projectService.activeProject.subscribe(activeProject => {
38
- this.activeProject = activeProject;
39
- this.projectSettings = this.activeProject.settings ? (Array.isArray(this.activeProject.settings) ? {
40
- hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: [], palettes: []
41
- } : this.activeProject.settings) : {
42
- hideExisting: false, shortcutPosition: 'after', homeDashboard: {}, shortcutsMenu: [], palettes: []
43
- };
44
- if (!this.projectSettings.palettes || !this.projectSettings.palettes.length) {
45
- this.projectSettings.palettes = [{
46
- name: 'Default Palette',
47
- colours: this.defaultColours
48
- }];
49
- this.saveChanges();
50
- }
51
- this.getCategories();
52
- });
53
- }
54
- selectOption(c1, c2) {
55
- if (!c2) {
56
- return true;
57
- }
58
- return c1.value === c2.value;
59
- }
60
- selectLink() {
61
- const dialogRef = this.dialog.open(ProjectLinkSelectionComponent, {
62
- width: '1200px',
63
- height: '800px',
64
- data: {
65
- dashboardURL: this.dashboardURL,
66
- queryURL: this.queryURL,
67
- datasourceURLs: this.datasourceURLs || []
68
- }
69
- });
70
- dialogRef.afterClosed().subscribe(res => {
71
- this.newShortcut.link = res;
72
- });
73
- }
74
- saveNewShortcut() {
75
- if (this.newShortcut.newCategory) {
76
- this.newShortcut.category = this.newShortcut.newCategory;
77
- }
78
- if (!this.projectSettings.shortcutsMenu || !this.projectSettings.shortcutsMenu.length) {
79
- this.projectSettings.shortcutsMenu = [];
80
- }
81
- const existingCategory = _.find(this.projectSettings.shortcutsMenu, { category: this.newShortcut.category });
82
- if (existingCategory) {
83
- existingCategory.items.push(this.newShortcut);
84
- }
85
- else {
86
- this.projectSettings.shortcutsMenu.push({
87
- category: this.newShortcut.category,
88
- items: [this.newShortcut]
89
- });
90
- }
91
- this.cancelNew();
92
- this.getCategories();
93
- }
94
- cancelNew() {
95
- this.newShortcut = {};
96
- this.showNewShortcut = false;
97
- }
98
- removeShortcut(menus, index) {
99
- menus.splice(index, 1);
100
- this.getCategories();
101
- }
102
- removeShortcutItem(items, index) {
103
- items.splice(index, 1);
104
- }
105
- moveCategory(currentIndex, change) {
106
- const item = this.projectSettings.shortcutsMenu.splice(currentIndex, 1)[0];
107
- this.projectSettings.shortcutsMenu.splice(currentIndex + change, 0, item);
108
- }
109
- drop(event) {
110
- if (event.previousContainer === event.container) {
111
- moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
112
- }
113
- else {
114
- transferArrayItem(event.previousContainer.data, event.container.data, event.previousIndex, event.currentIndex);
115
- }
116
- }
117
- importColours(values, palette) {
118
- const colours = (values || '').split(',');
119
- palette.colours = [];
120
- colours.forEach(colour => {
121
- palette.colours.push(colour.trim());
122
- });
123
- }
124
- deletePalette(index) {
125
- const message = 'Are you sure you would like to delete this palette?';
126
- if (window.confirm(message)) {
127
- this.projectSettings.palettes.splice(index, 1);
128
- }
129
- }
130
- async saveChanges() {
131
- await this.projectService.updateProjectSettings(this.activeProject.projectKey, this.projectSettings);
132
- }
133
- getCategories() {
134
- if (this.projectSettings.shortcutsMenu) {
135
- this.categories = this.projectSettings.shortcutsMenu.map(shortcut => {
136
- return shortcut.category;
137
- });
138
- }
139
- }
140
- }
141
- ProjectSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProjectSettingsComponent, deps: [{ token: i1.ProjectService }, { token: i2.MatLegacyDialog }, { token: i3.DashboardService }], target: i0.ɵɵFactoryTarget.Component });
142
- ProjectSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ProjectSettingsComponent, selector: "ki-project-settings", inputs: { dashboardURL: "dashboardURL", queryURL: "queryURL", datasourceURLs: "datasourceURLs", defaultColours: "defaultColours" }, ngImport: i0, template: "<div class=\"p-4\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcuts</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Create categorised menu items for quick access to specific pages.\n </p>\n <button type=\"button\" (click)=\"showNewShortcut = true;\"\n class=\"flex items-center rounded-md border border-primary bg-white py-2 px-4 text-sm font-medium text-primary shadow-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\"\n stroke=\"currentColor\" class=\"w-6 h-6\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 6v12m6-6H6\"/>\n </svg>\n Add New Shortcut\n </button>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"shadow sm:overflow-hidden sm:rounded-md\">\n <div *ngIf=\"showNewShortcut\"\n class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div class=\"\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Add New Shortcut</h3>\n <p class=\"mt-0 text-sm text-gray-500\">Provide the category this shortcut belongs to, along\n with title and link.</p>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-4\">\n <label class=\"block text-sm font-medium text-gray-700\">Category</label>\n <select class=\"mb-4 block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\"\n [(ngModel)]=\"newShortcut.category\">\n <option [value]=\"category\" *ngFor=\"let category of categories\">{{category}}</option>\n </select>\n <p class=\"mt-2 mb-0 text-sm text-gray-500\">Select category above, or enter a new one\n below.</p>\n <div class=\"mt-1\">\n <input type=\"text\" [(ngModel)]=\"newShortcut.newCategory\"\n placeholder=\"Add new category\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n\n </div>\n\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Title</label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.title\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">This will be displayed in the menu.</p>\n </div>\n\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Icon </label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.icon\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Enter the name of the material icon to use. Full\n list can be found\n <a class=\"text-primary underline\"\n href=\"https://fonts.google.com/icons?icon.style=Filled&icon.set=Material+Icons\"\n target=\"_blank\">here</a>\n </p>\n </div>\n\n <div class=\"sm:col-span-6\">\n <div class=\"mt-1 \">\n <div class=\"flex items-center\">\n <button type=\"button\" (click)=\"selectLink()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-3 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 \">\n Select Link\n </button>\n\n <div class=\"ml-4\">{{newShortcut.link}}</div>\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Use Select to search for a dashboard, query or\n other data item to shortcut to.</p>\n </div>\n </div>\n\n\n </div>\n </div>\n <div class=\"pt-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\" (click)=\"cancelNew()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-4 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50\">\n Cancel\n </button>\n <button type=\"button\" (click)=\"saveNewShortcut()\"\n class=\"ml-3 inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Add Shortcut\n </button>\n </div>\n </div>\n </div>\n <div class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div>\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcut Settings</h3>\n <p class=\"mt-0 text-sm text-gray-500\"></p>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <mat-slide-toggle [(ngModel)]=\"projectSettings.hideExisting\">Hide existing menu\n </mat-slide-toggle>\n <p class=\"mt-2 text-sm text-gray-500\">Main menu will be hidden behind an 'Advanced'\n dropdown</p>\n </div>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Menu Positioning</label>\n <mat-radio-group [(ngModel)]=\"projectSettings.shortcutPosition\" class=\"mt-1\">\n <mat-radio-button value=\"before\">Before</mat-radio-button>\n <mat-radio-button value=\"after\" class=\"ml-4\">After</mat-radio-button>\n </mat-radio-group>\n <p class=\"mt-2 text-sm text-gray-500\">Display shortcuts before or after the main\n menu.</p>\n </div>\n </div>\n </div>\n </div>\n <table cdkDropListGroup class=\"min-w-full\">\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\" [cdkDropListData]=\"shortcut.items\"\n class=\"bg-white\" *ngFor=\"let shortcut of projectSettings.shortcutsMenu || []; let i = index\">\n <tr class=\"border-t border-gray-200\">\n <th class=\"bg-gray-50 w-1/8\">\n <div class=\"flex items-center\">\n <a class=\"text-primary up\" *ngIf=\"i > 0\" (click)=\"moveCategory(i, -1)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18\"/>\n </svg>\n </a>\n <a class=\"text-primary down\" (click)=\"moveCategory(i, 1)\"\n *ngIf=\"i < (Object.keys(shortcuts).length - 1)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3\"/>\n </svg>\n </a>\n </div>\n </th>\n <th colspan=\"2\"\n class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n {{shortcut.category}}\n </th>\n <th class=\"bg-gray-50 px-4 py-2 text-right text-sm font-semibold text-gray-900 sm:px-6\">\n <button mat-icon-button color=\"warn\"\n (click)=\"removeShortcut(projectSettings.shortcutsMenu, i)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </th>\n </tr>\n\n <tr cdkDrag\n *ngFor=\"let item of shortcut.items; let j = index\" class=\"border-t border-gray-300\">\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <mat-icon cdkDragHandle>drag_handle</mat-icon>\n </div>\n </td>\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{item.title}}\n </td>\n <td class=\"whitespace-nowrap px-3 py-4 text-sm text-gray-500\">\n {{item.link}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <button class=\"mr-8\" mat-icon-button color=\"warn\"\n (click)=\"removeShortcutItem(shortcut.items, j)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n\n\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Home Dashboard</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Select one of the dashboards in your account to view as your homepage.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <label class=\"mb-2\">\n Select Dashboard\n <select matNativeControl [(ngModel)]=\"projectSettings.homeDashboard\"\n [compareWith]=\"selectOption\">\n <option value=\"\">No Home Dashboard</option>\n <optgroup label=\"Dashboards\">\n <option *ngFor=\"let dashboard of dashboards\"\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n <option *ngFor=\"let dashboard of sharedDashboards\"\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n </optgroup>\n </select>\n <small class=\"font-normal\">Select the dashboard to view on your homepage.</small>\n </label>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Project Colour Palette</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n A selection of colours to use as default colours around the project in charts etc.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <mat-accordion displayMode=\"flat\">\n <mat-expansion-panel class=\"shadow-none border-b\" [expanded]=\"palette._opened\"\n *ngFor=\"let palette of projectSettings.palettes; let i = index\"\n (closed)=\"palette._opened = false;\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{palette.name}}\n </mat-panel-title>\n <mat-panel-description>\n <div class=\"flex items-center\">\n <div *ngFor=\"let colour of palette.colours\"\n class=\"h-4 w-4\" [ngStyle]=\"{'background-color': colour}\"></div>\n </div>\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <label class=\"mb-2\">\n Palette Name\n <input type=\"text\" placeholder=\"Enter palette name\"\n [(ngModel)]=\"palette.name\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </label>\n\n <label class=\"mb-2\">\n Import Colour Palette\n <input type=\"text\" #colourPalette placeholder=\"Enter each hex colour comma seperated\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n <button type=\"button\" (click)=\"importColours(colourPalette.value, palette)\"\n class=\"mt-2 inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">upload</mat-icon>\n Import Colours\n </button>\n </label>\n\n <label class=\"mb-2\">\n Select Palette Colours\n <ng-template ngFor let-colour [ngForOf]=\"palette.colours\" let-i=\"index\">\n <div class=\"my-2 flex items-center justify-between\">\n <input type=\"color\" [(ngModel)]=\"palette.colours[i]\">\n <button mat-icon-button color=\"warn\" (click)=\"palette.colours.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </ng-template>\n\n </label>\n\n <div class=\"flex items-center justify-between\">\n <button type=\"button\" (click)=\"deletePalette(i)\"\n class=\"inline-flex justify-center rounded-md border border-danger bg-white py-2 px-4 text-sm font-medium text-danger shadow-sm \">\n Delete Palette\n </button>\n <button type=\"button\" (click)=\"palette.colours.push('')\"\n class=\"inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Colour\n </button>\n </div>\n\n\n </mat-expansion-panel>\n </mat-accordion>\n\n <button type=\"button\" (click)=\"projectSettings.palettes.push({name: '', colours: [''], _opened: true})\"\n class=\"mt-4 inline-flex items-center justify-center rounded-md border border-secondary bg-white py-1.5 px-4 text-sm font-medium text-secondary shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Palette\n </button>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { kind: "directive", type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "directive", type: i7.MatExpansionPanelDescription, selector: "mat-panel-description" }, { kind: "directive", type: i8.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i10.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i10.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: i10.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i11.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: i12.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i12.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }] });
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ProjectSettingsComponent, decorators: [{
144
- type: Component,
145
- args: [{ selector: 'ki-project-settings', template: "<div class=\"p-4\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcuts</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Create categorised menu items for quick access to specific pages.\n </p>\n <button type=\"button\" (click)=\"showNewShortcut = true;\"\n class=\"flex items-center rounded-md border border-primary bg-white py-2 px-4 text-sm font-medium text-primary shadow-sm\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\"\n stroke=\"currentColor\" class=\"w-6 h-6\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 6v12m6-6H6\"/>\n </svg>\n Add New Shortcut\n </button>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"shadow sm:overflow-hidden sm:rounded-md\">\n <div *ngIf=\"showNewShortcut\"\n class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div class=\"\">\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Add New Shortcut</h3>\n <p class=\"mt-0 text-sm text-gray-500\">Provide the category this shortcut belongs to, along\n with title and link.</p>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-4\">\n <label class=\"block text-sm font-medium text-gray-700\">Category</label>\n <select class=\"mb-4 block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\"\n [(ngModel)]=\"newShortcut.category\">\n <option [value]=\"category\" *ngFor=\"let category of categories\">{{category}}</option>\n </select>\n <p class=\"mt-2 mb-0 text-sm text-gray-500\">Select category above, or enter a new one\n below.</p>\n <div class=\"mt-1\">\n <input type=\"text\" [(ngModel)]=\"newShortcut.newCategory\"\n placeholder=\"Add new category\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n\n </div>\n\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Title</label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.title\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">This will be displayed in the menu.</p>\n </div>\n\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Icon </label>\n <div class=\"mt-1\">\n <input type=\"text\" placeholder=\"Enter shortcut title\"\n [(ngModel)]=\"newShortcut.icon\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Enter the name of the material icon to use. Full\n list can be found\n <a class=\"text-primary underline\"\n href=\"https://fonts.google.com/icons?icon.style=Filled&icon.set=Material+Icons\"\n target=\"_blank\">here</a>\n </p>\n </div>\n\n <div class=\"sm:col-span-6\">\n <div class=\"mt-1 \">\n <div class=\"flex items-center\">\n <button type=\"button\" (click)=\"selectLink()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-3 text-sm font-medium leading-4 text-gray-700 shadow-sm hover:bg-gray-50 \">\n Select Link\n </button>\n\n <div class=\"ml-4\">{{newShortcut.link}}</div>\n </div>\n <p class=\"mt-2 text-sm text-gray-500\">Use Select to search for a dashboard, query or\n other data item to shortcut to.</p>\n </div>\n </div>\n\n\n </div>\n </div>\n <div class=\"pt-5\">\n <div class=\"flex justify-end\">\n <button type=\"button\" (click)=\"cancelNew()\"\n class=\"rounded-md border border-gray-300 bg-white py-2 px-4 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50\">\n Cancel\n </button>\n <button type=\"button\" (click)=\"saveNewShortcut()\"\n class=\"ml-3 inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Add Shortcut\n </button>\n </div>\n </div>\n </div>\n <div class=\"p-6 space-y-8 divide-y divide-gray-200 bg-white\">\n <div>\n <div>\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Shortcut Settings</h3>\n <p class=\"mt-0 text-sm text-gray-500\"></p>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <mat-slide-toggle [(ngModel)]=\"projectSettings.hideExisting\">Hide existing menu\n </mat-slide-toggle>\n <p class=\"mt-2 text-sm text-gray-500\">Main menu will be hidden behind an 'Advanced'\n dropdown</p>\n </div>\n </div>\n\n <div class=\"mt-6 grid grid-cols-1 gap-y-6 gap-x-4 sm:grid-cols-6\">\n <div class=\"sm:col-span-6\">\n <label class=\"block text-sm font-medium text-gray-700\">Shortcut Menu Positioning</label>\n <mat-radio-group [(ngModel)]=\"projectSettings.shortcutPosition\" class=\"mt-1\">\n <mat-radio-button value=\"before\">Before</mat-radio-button>\n <mat-radio-button value=\"after\" class=\"ml-4\">After</mat-radio-button>\n </mat-radio-group>\n <p class=\"mt-2 text-sm text-gray-500\">Display shortcuts before or after the main\n menu.</p>\n </div>\n </div>\n </div>\n </div>\n <table cdkDropListGroup class=\"min-w-full\">\n <tbody cdkDropList (cdkDropListDropped)=\"drop($event)\" [cdkDropListData]=\"shortcut.items\"\n class=\"bg-white\" *ngFor=\"let shortcut of projectSettings.shortcutsMenu || []; let i = index\">\n <tr class=\"border-t border-gray-200\">\n <th class=\"bg-gray-50 w-1/8\">\n <div class=\"flex items-center\">\n <a class=\"text-primary up\" *ngIf=\"i > 0\" (click)=\"moveCategory(i, -1)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M8.25 6.75L12 3m0 0l3.75 3.75M12 3v18\"/>\n </svg>\n </a>\n <a class=\"text-primary down\" (click)=\"moveCategory(i, 1)\"\n *ngIf=\"i < (Object.keys(shortcuts).length - 1)\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\" stroke=\"currentColor\" class=\"w-4 h-4\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M15.75 17.25L12 21m0 0l-3.75-3.75M12 21V3\"/>\n </svg>\n </a>\n </div>\n </th>\n <th colspan=\"2\"\n class=\"bg-gray-50 px-4 py-2 text-left text-sm font-semibold text-gray-900 sm:px-6\">\n {{shortcut.category}}\n </th>\n <th class=\"bg-gray-50 px-4 py-2 text-right text-sm font-semibold text-gray-900 sm:px-6\">\n <button mat-icon-button color=\"warn\"\n (click)=\"removeShortcut(projectSettings.shortcutsMenu, i)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </th>\n </tr>\n\n <tr cdkDrag\n *ngFor=\"let item of shortcut.items; let j = index\" class=\"border-t border-gray-300\">\n <td class=\"text-right\">\n <div class=\"flex items-center justify-end\">\n <mat-icon cdkDragHandle>drag_handle</mat-icon>\n </div>\n </td>\n <td class=\"whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6\">\n {{item.title}}\n </td>\n <td class=\"whitespace-nowrap px-3 py-4 text-sm text-gray-500\">\n {{item.link}}\n </td>\n <td class=\"relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6\">\n <button class=\"mr-8\" mat-icon-button color=\"warn\"\n (click)=\"removeShortcutItem(shortcut.items, j)\">\n <mat-icon>remove_circle_outline</mat-icon>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n\n\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm\">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Home Dashboard</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n Select one of the dashboards in your account to view as your homepage.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <label class=\"mb-2\">\n Select Dashboard\n <select matNativeControl [(ngModel)]=\"projectSettings.homeDashboard\"\n [compareWith]=\"selectOption\">\n <option value=\"\">No Home Dashboard</option>\n <optgroup label=\"Dashboards\">\n <option *ngFor=\"let dashboard of dashboards\"\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n </optgroup>\n <optgroup label=\"Shared Dashboards\">\n <option *ngFor=\"let dashboard of sharedDashboards\"\n [ngValue]=\"{value: dashboard.id, label: dashboard.title}\">\n {{dashboard.title}}\n </option>\n </optgroup>\n </select>\n <small class=\"font-normal\">Select the dashboard to view on your homepage.</small>\n </label>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"hidden sm:block\" aria-hidden=\"true\">\n <div class=\"py-5\">\n <div class=\"border-t border-gray-200\"></div>\n </div>\n </div>\n\n <div class=\"mt-10 sm:mt-0\">\n <div class=\"md:grid md:grid-cols-3 md:gap-6\">\n <div class=\"md:col-span-1\">\n <div class=\"px-4 sm:px-0\">\n <h3 class=\"text-lg font-medium leading-6 text-gray-900\">Project Colour Palette</h3>\n <p class=\"mt-1 text-sm text-gray-600\">\n A selection of colours to use as default colours around the project in charts etc.\n </p>\n </div>\n </div>\n <div class=\"mt-5 md:col-span-2 md:mt-0\">\n <div class=\"overflow-hidden shadow sm:rounded-md\">\n <div class=\"bg-white px-4 py-5 sm:p-6\">\n <mat-accordion displayMode=\"flat\">\n <mat-expansion-panel class=\"shadow-none border-b\" [expanded]=\"palette._opened\"\n *ngFor=\"let palette of projectSettings.palettes; let i = index\"\n (closed)=\"palette._opened = false;\">\n <mat-expansion-panel-header>\n <mat-panel-title>\n {{palette.name}}\n </mat-panel-title>\n <mat-panel-description>\n <div class=\"flex items-center\">\n <div *ngFor=\"let colour of palette.colours\"\n class=\"h-4 w-4\" [ngStyle]=\"{'background-color': colour}\"></div>\n </div>\n </mat-panel-description>\n </mat-expansion-panel-header>\n\n <label class=\"mb-2\">\n Palette Name\n <input type=\"text\" placeholder=\"Enter palette name\"\n [(ngModel)]=\"palette.name\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n </label>\n\n <label class=\"mb-2\">\n Import Colour Palette\n <input type=\"text\" #colourPalette placeholder=\"Enter each hex colour comma seperated\"\n class=\"block w-full min-w-0 flex-1 border-gray-300 sm:text-sm\">\n <button type=\"button\" (click)=\"importColours(colourPalette.value, palette)\"\n class=\"mt-2 inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">upload</mat-icon>\n Import Colours\n </button>\n </label>\n\n <label class=\"mb-2\">\n Select Palette Colours\n <ng-template ngFor let-colour [ngForOf]=\"palette.colours\" let-i=\"index\">\n <div class=\"my-2 flex items-center justify-between\">\n <input type=\"color\" [(ngModel)]=\"palette.colours[i]\">\n <button mat-icon-button color=\"warn\" (click)=\"palette.colours.splice(i, 1)\">\n <mat-icon>clear</mat-icon>\n </button>\n </div>\n </ng-template>\n\n </label>\n\n <div class=\"flex items-center justify-between\">\n <button type=\"button\" (click)=\"deletePalette(i)\"\n class=\"inline-flex justify-center rounded-md border border-danger bg-white py-2 px-4 text-sm font-medium text-danger shadow-sm \">\n Delete Palette\n </button>\n <button type=\"button\" (click)=\"palette.colours.push('')\"\n class=\"inline-flex items-center justify-center rounded-md border border-white bg-secondary py-1.5 px-4 text-sm font-medium text-white shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Colour\n </button>\n </div>\n\n\n </mat-expansion-panel>\n </mat-accordion>\n\n <button type=\"button\" (click)=\"projectSettings.palettes.push({name: '', colours: [''], _opened: true})\"\n class=\"mt-4 inline-flex items-center justify-center rounded-md border border-secondary bg-white py-1.5 px-4 text-sm font-medium text-secondary shadow-sm \">\n <mat-icon class=\"mr-2\">add</mat-icon>\n Add Palette\n </button>\n\n </div>\n <div class=\"bg-gray-50 px-4 py-3 text-right sm:px-6\">\n <button type=\"button\" (click)=\"saveChanges()\"\n class=\"inline-flex justify-center rounded-md border border-transparent bg-primary py-2 px-4 text-sm font-medium text-white shadow-sm \">\n Save Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n" }]
146
- }], ctorParameters: function () { return [{ type: i1.ProjectService }, { type: i2.MatLegacyDialog }, { type: i3.DashboardService }]; }, propDecorators: { dashboardURL: [{
147
- type: Input
148
- }], queryURL: [{
149
- type: Input
150
- }], datasourceURLs: [{
151
- type: Input
152
- }], defaultColours: [{
153
- type: Input
154
- }] } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1zZXR0aW5ncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1raW5pbnRlbC9zcmMvbGliL2NvbXBvbmVudHMvcHJvamVjdC1zZXR0aW5ncy9wcm9qZWN0LXNldHRpbmdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWtpbmludGVsL3NyYy9saWIvY29tcG9uZW50cy9wcm9qZWN0LXNldHRpbmdzL3Byb2plY3Qtc2V0dGluZ3MuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFHdkQsT0FBTyxFQUNILDZCQUE2QixFQUNoQyxNQUFNLDZFQUE2RSxDQUFDO0FBQ3JGLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFVMUUsTUFBTSxPQUFPLHdCQUF3QjtJQW1CakMsWUFBb0IsY0FBOEIsRUFDOUIsTUFBaUIsRUFDakIsZ0JBQWtDO1FBRmxDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFoQjdDLG1CQUFjLEdBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVsQyxvQkFBZSxHQUFRLEVBQUUsQ0FBQztRQUMxQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBQ3JCLGdCQUFXLEdBQVEsRUFBRSxDQUFDO1FBQ3RCLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFDcEIsV0FBTSxHQUFHLE1BQU0sQ0FBQztRQUNoQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBQ3JC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S0FBYTtRQUM5QixNQUFNLE9BQU8sR0FBRyxxREFBcUQsQ0FBQztRQUN0RSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsRDtJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsV0FBVztRQUNwQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pHLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEVBQUU7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2hFLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7c0hBL0pRLHdCQUF3QjswR0FBeEIsd0JBQXdCLCtMQ2pCckMsOHRxQkFpV0E7NEZEaFZhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDSSxxQkFBcUI7a0tBTXRCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1Byb2plY3RTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9wcm9qZWN0LnNlcnZpY2UnO1xuaW1wb3J0IHtNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcbmltcG9ydCB7XG4gICAgUHJvamVjdExpbmtTZWxlY3Rpb25Db21wb25lbnRcbn0gZnJvbSAnLi4vcHJvamVjdC1zZXR0aW5ncy9wcm9qZWN0LWxpbmstc2VsZWN0aW9uL3Byb2plY3QtbGluay1zZWxlY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7bW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0Rhc2hib2FyZFNlcnZpY2V9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rhc2hib2FyZC5zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2tpLXByb2plY3Qtc2V0dGluZ3MnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9qZWN0LXNldHRpbmdzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9qZWN0LXNldHRpbmdzLmNvbXBvbmVudC5zYXNzJ11cbn0pXG5leHBvcnQgY2xhc3MgUHJvamVjdFNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIGRhc2hib2FyZFVSTDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHF1ZXJ5VVJMOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGF0YXNvdXJjZVVSTHM6IGFueTtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q29sb3Vyczogc3RyaW5nW10gPSBbJyddO1xuXG4gICAgcHVibGljIHByb2plY3RTZXR0aW5nczogYW55ID0ge307XG4gICAgcHVibGljIGNhdGVnb3JpZXM6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBuZXdTaG9ydGN1dDogYW55ID0ge307XG4gICAgcHVibGljIHNob3dOZXdTaG9ydGN1dCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzaG9ydGN1dHM6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBPYmplY3QgPSBPYmplY3Q7XG4gICAgcHVibGljIGRhc2hib2FyZHM6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBzaGFyZWREYXNoYm9hcmRzOiBhbnkgPSBbXTtcblxuICAgIHByaXZhdGUgYWN0aXZlUHJvamVjdDogYW55O1xuICAgIHByaXZhdGUgYWN0aXZlUHJvamVjdFN1YjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwcm9qZWN0U2VydmljZTogUHJvamVjdFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGRhc2hib2FyZFNlcnZpY2U6IERhc2hib2FyZFNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICB0aGlzLmFjdGl2ZVByb2plY3QgPSB0aGlzLnByb2plY3RTZXJ2aWNlLmFjdGl2ZVByb2plY3QuZ2V0VmFsdWUoKTtcblxuICAgICAgICB0aGlzLmRhc2hib2FyZHMgPSBhd2FpdCB0aGlzLmRhc2hib2FyZFNlcnZpY2UuZ2V0RGFzaGJvYXJkcyhcbiAgICAgICAgICAgICcnLCAnMTAwJywgJzAnXG4gICAgICAgICkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgdGhpcy5zaGFyZWREYXNoYm9hcmRzID0gYXdhaXQgdGhpcy5kYXNoYm9hcmRTZXJ2aWNlLmdldERhc2hib2FyZHMoXG4gICAgICAgICAgICAnJywgJzEwMCcsICcwJywgbnVsbFxuICAgICAgICApLnRvUHJvbWlzZSgpO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlUHJvamVjdFN1YiA9IHRoaXMucHJvamVjdFNlcnZpY2UuYWN0aXZlUHJvamVjdC5zdWJzY3JpYmUoYWN0aXZlUHJvamVjdCA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVByb2plY3QgPSBhY3RpdmVQcm9qZWN0O1xuXG4gICAgICAgICAgICB0aGlzLnByb2plY3RTZXR0aW5ncyA9IHRoaXMuYWN0aXZlUHJvamVjdC5zZXR0aW5ncyA/IChBcnJheS5pc0FycmF5KHRoaXMuYWN0aXZlUHJvamVjdC5zZXR0aW5ncykgPyB7XG4gICAgICAgICAgICAgICAgaGlkZUV4aXN0aW5nOiBmYWxzZSwgc2hvcnRjdXRQb3NpdGlvbjogJ2FmdGVyJywgaG9tZURhc2hib2FyZDoge30sIHNob3J0Y3V0c01lbnU6IFtdLCBwYWxldHRlczogW11cbiAgICAgICAgICAgIH0gOiB0aGlzLmFjdGl2ZVByb2plY3Quc2V0dGluZ3MpIDoge1xuICAgICAgICAgICAgICAgIGhpZGVFeGlzdGluZzogZmFsc2UsIHNob3J0Y3V0UG9zaXRpb246ICdhZnRlcicsIGhvbWVEYXNoYm9hcmQ6IHt9LCBzaG9ydGN1dHNNZW51OiBbXSwgcGFsZXR0ZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJvamVjdFNldHRpbmdzLnBhbGV0dGVzIHx8ICF0aGlzLnByb2plY3RTZXR0aW5ncy5wYWxldHRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3RTZXR0aW5ncy5wYWxldHRlcyA9IFt7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdEZWZhdWx0IFBhbGV0dGUnLFxuICAgICAgICAgICAgICAgICAgICBjb2xvdXJzOiB0aGlzLmRlZmF1bHRDb2xvdXJzXG4gICAgICAgICAgICAgICAgfV07XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQ2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmdldENhdGVnb3JpZXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdE9wdGlvbihjMTogYW55LCBjMjogYW55KSB7XG4gICAgICAgIGlmICghYzIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjMS52YWx1ZSA9PT0gYzIudmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbGVjdExpbmsoKSB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUHJvamVjdExpbmtTZWxlY3Rpb25Db21wb25lbnQsIHtcbiAgICAgICAgICAgIHdpZHRoOiAnMTIwMHB4JyxcbiAgICAgICAgICAgIGhlaWdodDogJzgwMHB4JyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBkYXNoYm9hcmRVUkw6IHRoaXMuZGFzaGJvYXJkVVJMLFxuICAgICAgICAgICAgICAgIHF1ZXJ5VVJMOiB0aGlzLnF1ZXJ5VVJMLFxuICAgICAgICAgICAgICAgIGRhdGFzb3VyY2VVUkxzOiB0aGlzLmRhdGFzb3VyY2VVUkxzIHx8IFtdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5uZXdTaG9ydGN1dC5saW5rID0gcmVzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2F2ZU5ld1Nob3J0Y3V0KCkge1xuICAgICAgICBpZiAodGhpcy5uZXdTaG9ydGN1dC5uZXdDYXRlZ29yeSkge1xuICAgICAgICAgICAgdGhpcy5uZXdTaG9ydGN1dC5jYXRlZ29yeSA9IHRoaXMubmV3U2hvcnRjdXQubmV3Q2F0ZWdvcnk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucHJvamVjdFNldHRpbmdzLnNob3J0Y3V0c01lbnUgfHwgIXRoaXMucHJvamVjdFNldHRpbmdzLnNob3J0Y3V0c01lbnUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByb2plY3RTZXR0aW5ncy5zaG9ydGN1dHNNZW51ID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleGlzdGluZ0NhdGVnb3J5ID0gXy5maW5kKHRoaXMucHJvamVjdFNldHRpbmdzLnNob3J0Y3V0c01lbnUsIHtjYXRlZ29yeTogdGhpcy5uZXdTaG9ydGN1dC5jYXRlZ29yeX0pO1xuICAgICAgICBpZiAoZXhpc3RpbmdDYXRlZ29yeSkge1xuICAgICAgICAgICAgZXhpc3RpbmdDYXRlZ29yeS5pdGVtcy5wdXNoKHRoaXMubmV3U2hvcnRjdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0U2V0dGluZ3Muc2hvcnRjdXRzTWVudS5wdXNoKHtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5uZXdTaG9ydGN1dC5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgICBpdGVtczogW3RoaXMubmV3U2hvcnRjdXRdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FuY2VsTmV3KCk7XG4gICAgICAgIHRoaXMuZ2V0Q2F0ZWdvcmllcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5jZWxOZXcoKSB7XG4gICAgICAgIHRoaXMubmV3U2hvcnRjdXQgPSB7fTtcbiAgICAgICAgdGhpcy5zaG93TmV3U2hvcnRjdXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlU2hvcnRjdXQobWVudXMsIGluZGV4KSB7XG4gICAgICAgIG1lbnVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZ2V0Q2F0ZWdvcmllcygpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVTaG9ydGN1dEl0ZW0oaXRlbXMsIGluZGV4KSB7XG4gICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgcHVibGljIG1vdmVDYXRlZ29yeShjdXJyZW50SW5kZXgsIGNoYW5nZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5wcm9qZWN0U2V0dGluZ3Muc2hvcnRjdXRzTWVudS5zcGxpY2UoY3VycmVudEluZGV4LCAxKVswXTtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2V0dGluZ3Muc2hvcnRjdXRzTWVudS5zcGxpY2UoY3VycmVudEluZGV4ICsgY2hhbmdlLCAwLCBpdGVtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZHJvcChldmVudCkge1xuICAgICAgICBpZiAoZXZlbnQucHJldmlvdXNDb250YWluZXIgPT09IGV2ZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgbW92ZUl0ZW1JbkFycmF5KGV2ZW50LmNvbnRhaW5lci5kYXRhLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNmZXJBcnJheUl0ZW0oXG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmlvdXNDb250YWluZXIuZGF0YSxcbiAgICAgICAgICAgICAgICBldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICAgICAgICAgIGV2ZW50LmN1cnJlbnRJbmRleCxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaW1wb3J0Q29sb3Vycyh2YWx1ZXM6IHN0cmluZywgcGFsZXR0ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbG91cnMgPSAodmFsdWVzIHx8ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgICBwYWxldHRlLmNvbG91cnMgPSBbXTtcbiAgICAgICAgY29sb3Vycy5mb3JFYWNoKGNvbG91ciA9PiB7XG4gICAgICAgICAgICBwYWxldHRlLmNvbG91cnMucHVzaChjb2xvdXIudHJpbSgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlbGV0ZVBhbGV0dGUoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0FyZSB5b3Ugc3VyZSB5b3Ugd291bGQgbGlrZSB0byBkZWxldGUgdGhpcyBwYWxldHRlPyc7XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgdGhpcy5wcm9qZWN0U2V0dGluZ3MucGFsZXR0ZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzYXZlQ2hhbmdlcygpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5wcm9qZWN0U2VydmljZS51cGRhdGVQcm9qZWN0U2V0dGluZ3ModGhpcy5hY3RpdmVQcm9qZWN0LnByb2plY3RLZXksIHRoaXMucHJvamVjdFNldHRpbmdzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENhdGVnb3JpZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnByb2plY3RTZXR0aW5ncy5zaG9ydGN1dHNNZW51KSB7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSB0aGlzLnByb2plY3RTZXR0aW5ncy5zaG9ydGN1dHNNZW51Lm1hcChzaG9ydGN1dCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0Y3V0LmNhdGVnb3J5O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicC00XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1kOmdyaWQgbWQ6Z3JpZC1jb2xzLTMgbWQ6Z2FwLTZcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1kOmNvbC1zcGFuLTFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC00IHNtOnB4LTBcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtbWVkaXVtIGxlYWRpbmctNiB0ZXh0LWdyYXktOTAwXCI+U2hvcnRjdXRzPC9oMz5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm10LTEgdGV4dC1zbSB0ZXh0LWdyYXktNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgIENyZWF0ZSBjYXRlZ29yaXNlZCBtZW51IGl0ZW1zIGZvciBxdWljayBhY2Nlc3MgdG8gc3BlY2lmaWMgcGFnZXMuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzaG93TmV3U2hvcnRjdXQgPSB0cnVlO1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IGJnLXdoaXRlIHB5LTIgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtcHJpbWFyeSBzaGFkb3ctc21cIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBjbGFzcz1cInctNiBoLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNMTIgNnYxMm02LTZINlwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIEFkZCBOZXcgU2hvcnRjdXRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTUgbWQ6Y29sLXNwYW4tMiBtZDptdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hhZG93IHNtOm92ZXJmbG93LWhpZGRlbiBzbTpyb3VuZGVkLW1kXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dOZXdTaG9ydGN1dFwiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInAtNiBzcGFjZS15LTggZGl2aWRlLXkgZGl2aWRlLWdyYXktMjAwIGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1sZyBmb250LW1lZGl1bSBsZWFkaW5nLTYgdGV4dC1ncmF5LTkwMFwiPkFkZCBOZXcgU2hvcnRjdXQ8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMCB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5Qcm92aWRlIHRoZSBjYXRlZ29yeSB0aGlzIHNob3J0Y3V0IGJlbG9uZ3MgdG8sIGFsb25nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGl0bGUgYW5kIGxpbmsuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC02IGdyaWQgZ3JpZC1jb2xzLTEgZ2FwLXktNiBnYXAteC00IHNtOmdyaWQtY29scy02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtOmNvbC1zcGFuLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwXCI+Q2F0ZWdvcnk8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwibWItNCBibG9jayB3LWZ1bGwgbWluLXctMCBmbGV4LTEgYm9yZGVyLWdyYXktMzAwIHNtOnRleHQtc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmV3U2hvcnRjdXQuY2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImNhdGVnb3J5XCIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNhdGVnb3JpZXNcIj57e2NhdGVnb3J5fX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiBtYi0wIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlNlbGVjdCBjYXRlZ29yeSBhYm92ZSwgb3IgZW50ZXIgYSBuZXcgb25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWxvdy48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cIm5ld1Nob3J0Y3V0Lm5ld0NhdGVnb3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFkZCBuZXcgY2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIG1pbi13LTAgZmxleC0xIGJvcmRlci1ncmF5LTMwMCBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic206Y29sLXNwYW4tNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJibG9jayB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtZ3JheS03MDBcIj5TaG9ydGN1dCBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIHNob3J0Y3V0IHRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld1Nob3J0Y3V0LnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJsb2NrIHctZnVsbCBtaW4tdy0wIGZsZXgtMSBib3JkZXItZ3JheS0zMDAgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG1lbnUuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtOmNvbC1zcGFuLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwXCI+U2hvcnRjdXQgSWNvbiA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBzaG9ydGN1dCB0aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJuZXdTaG9ydGN1dC5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJsb2NrIHctZnVsbCBtaW4tdy0wIGZsZXgtMSBib3JkZXItZ3JheS0zMDAgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPkVudGVyIHRoZSBuYW1lIG9mIHRoZSBtYXRlcmlhbCBpY29uIHRvIHVzZS4gRnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBjYW4gYmUgZm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1wcmltYXJ5IHVuZGVybGluZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly9mb250cy5nb29nbGUuY29tL2ljb25zP2ljb24uc3R5bGU9RmlsbGVkJmljb24uc2V0PU1hdGVyaWFsK0ljb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPmhlcmU8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbTpjb2wtc3Bhbi02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0xIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdExpbmsoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBiZy13aGl0ZSBweS0yIHB4LTMgdGV4dC1zbSBmb250LW1lZGl1bSBsZWFkaW5nLTQgdGV4dC1ncmF5LTcwMCBzaGFkb3ctc20gaG92ZXI6YmctZ3JheS01MCBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtbC00XCI+e3tuZXdTaG9ydGN1dC5saW5rfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0yIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPlVzZSBTZWxlY3QgdG8gc2VhcmNoIGZvciBhIGRhc2hib2FyZCwgcXVlcnkgb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBkYXRhIGl0ZW0gdG8gc2hvcnRjdXQgdG8uPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjYW5jZWxOZXcoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1ncmF5LTMwMCBiZy13aGl0ZSBweS0yIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwIHNoYWRvdy1zbSBob3ZlcjpiZy1ncmF5LTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzYXZlTmV3U2hvcnRjdXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTMgaW5saW5lLWZsZXgganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgcHktMiBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBzaGFkb3ctc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIFNob3J0Y3V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtNiBzcGFjZS15LTggZGl2aWRlLXkgZGl2aWRlLWdyYXktMjAwIGJnLXdoaXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtbGcgZm9udC1tZWRpdW0gbGVhZGluZy02IHRleHQtZ3JheS05MDBcIj5TaG9ydGN1dCBTZXR0aW5nczwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJtdC0wIHRleHQtc20gdGV4dC1ncmF5LTUwMFwiPjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNiBncmlkIGdyaWQtY29scy0xIGdhcC15LTYgZ2FwLXgtNCBzbTpncmlkLWNvbHMtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbTpjb2wtc3Bhbi02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFsobmdNb2RlbCldPVwicHJvamVjdFNldHRpbmdzLmhpZGVFeGlzdGluZ1wiPkhpZGUgZXhpc3RpbmcgbWVudVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMiB0ZXh0LXNtIHRleHQtZ3JheS01MDBcIj5NYWluIG1lbnUgd2lsbCBiZSBoaWRkZW4gYmVoaW5kIGFuICdBZHZhbmNlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC02IGdyaWQgZ3JpZC1jb2xzLTEgZ2FwLXktNiBnYXAteC00IHNtOmdyaWQtY29scy02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtOmNvbC1zcGFuLTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYmxvY2sgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWdyYXktNzAwXCI+U2hvcnRjdXQgTWVudSBQb3NpdGlvbmluZzwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgWyhuZ01vZGVsKV09XCJwcm9qZWN0U2V0dGluZ3Muc2hvcnRjdXRQb3NpdGlvblwiIGNsYXNzPVwibXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJiZWZvcmVcIj5CZWZvcmU8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cImFmdGVyXCIgY2xhc3M9XCJtbC00XCI+QWZ0ZXI8L21hdC1yYWRpby1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm10LTIgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+RGlzcGxheSBzaG9ydGN1dHMgYmVmb3JlIG9yIGFmdGVyIHRoZSBtYWluXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2RrRHJvcExpc3RHcm91cCBjbGFzcz1cIm1pbi13LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRib2R5IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCIgW2Nka0Ryb3BMaXN0RGF0YV09XCJzaG9ydGN1dC5pdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJnLXdoaXRlXCIgKm5nRm9yPVwibGV0IHNob3J0Y3V0IG9mIHByb2plY3RTZXR0aW5ncy5zaG9ydGN1dHNNZW51IHx8IFtdOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cImJvcmRlci10IGJvcmRlci1ncmF5LTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiYmctZ3JheS01MCB3LTEvOFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInRleHQtcHJpbWFyeSB1cFwiICpuZ0lmPVwiaSA+IDBcIiAoY2xpY2spPVwibW92ZUNhdGVnb3J5KGksIC0xKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgZmlsbD1cIm5vbmVcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgY2xhc3M9XCJ3LTQgaC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTguMjUgNi43NUwxMiAzbTAgMGwzLjc1IDMuNzVNMTIgM3YxOFwiLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwidGV4dC1wcmltYXJ5IGRvd25cIiAoY2xpY2spPVwibW92ZUNhdGVnb3J5KGksIDEpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpIDwgKE9iamVjdC5rZXlzKHNob3J0Y3V0cykubGVuZ3RoIC0gMSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGZpbGw9XCJub25lXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIGNsYXNzPVwidy00IGgtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xNS43NSAxNy4yNUwxMiAyMW0wIDBsLTMuNzUtMy43NU0xMiAyMVYzXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY29sc3Bhbj1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmctZ3JheS01MCBweC00IHB5LTIgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHNtOnB4LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3Nob3J0Y3V0LmNhdGVnb3J5fX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJiZy1ncmF5LTUwIHB4LTQgcHktMiB0ZXh0LXJpZ2h0IHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWdyYXktOTAwIHNtOnB4LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNob3J0Y3V0KHByb2plY3RTZXR0aW5ncy5zaG9ydGN1dHNNZW51LCBpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+cmVtb3ZlX2NpcmNsZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNob3J0Y3V0Lml0ZW1zOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJib3JkZXItdCBib3JkZXItZ3JheS0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNka0RyYWdIYW5kbGU+ZHJhZ19oYW5kbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwIHB5LTQgcGwtNCBwci0zIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1ncmF5LTkwMCBzbTpwbC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCBweC0zIHB5LTQgdGV4dC1zbSB0ZXh0LWdyYXktNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmxpbmt9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInJlbGF0aXZlIHdoaXRlc3BhY2Utbm93cmFwIHB5LTQgcGwtMyBwci00IHRleHQtcmlnaHQgdGV4dC1zbSBmb250LW1lZGl1bSBzbTpwci02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cIm1yLThcIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTaG9ydGN1dEl0ZW0oc2hvcnRjdXQuaXRlbXMsIGopXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZW1vdmVfY2lyY2xlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuXG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctZ3JheS01MCBweC00IHB5LTMgdGV4dC1yaWdodCBzbTpweC02XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzYXZlQ2hhbmdlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBiZy1wcmltYXJ5IHB5LTIgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgc2hhZG93LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cblxuICAgIDxkaXYgY2xhc3M9XCJoaWRkZW4gc206YmxvY2tcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB5LTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJib3JkZXItdCBib3JkZXItZ3JheS0yMDBcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibXQtMTAgc206bXQtMFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWQ6Z3JpZCBtZDpncmlkLWNvbHMtMyBtZDpnYXAtNlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1kOmNvbC1zcGFuLTFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBzbTpweC0wXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInRleHQtbGcgZm9udC1tZWRpdW0gbGVhZGluZy02IHRleHQtZ3JheS05MDBcIj5Ib21lIERhc2hib2FyZDwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBvbmUgb2YgdGhlIGRhc2hib2FyZHMgaW4geW91ciBhY2NvdW50IHRvIHZpZXcgYXMgeW91ciBob21lcGFnZS5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNSBtZDpjb2wtc3Bhbi0yIG1kOm10LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuIHNoYWRvdyBzbTpyb3VuZGVkLW1kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBweC00IHB5LTUgc206cC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0IERhc2hib2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbWF0TmF0aXZlQ29udHJvbCBbKG5nTW9kZWwpXT1cInByb2plY3RTZXR0aW5ncy5ob21lRGFzaGJvYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYXJlV2l0aF09XCJzZWxlY3RPcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPk5vIEhvbWUgRGFzaGJvYXJkPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkRhc2hib2FyZHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRhc2hib2FyZCBvZiBkYXNoYm9hcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVmFsdWVdPVwie3ZhbHVlOiBkYXNoYm9hcmQuaWQsIGxhYmVsOiBkYXNoYm9hcmQudGl0bGV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkYXNoYm9hcmQudGl0bGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0Z3JvdXA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIlNoYXJlZCBEYXNoYm9hcmRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkYXNoYm9hcmQgb2Ygc2hhcmVkRGFzaGJvYXJkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1ZhbHVlXT1cInt2YWx1ZTogZGFzaGJvYXJkLmlkLCBsYWJlbDogZGFzaGJvYXJkLnRpdGxlfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGFzaGJvYXJkLnRpdGxlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGdyb3VwPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImZvbnQtbm9ybWFsXCI+U2VsZWN0IHRoZSBkYXNoYm9hcmQgdG8gdmlldyBvbiB5b3VyIGhvbWVwYWdlLjwvc21hbGw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmctZ3JheS01MCBweC00IHB5LTMgdGV4dC1yaWdodCBzbTpweC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2F2ZUNoYW5nZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5saW5lLWZsZXgganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgcHktMiBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBzaGFkb3ctc20gXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZSBDaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwiaGlkZGVuIHNtOmJsb2NrXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJweS01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9yZGVyLXQgYm9yZGVyLWdyYXktMjAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm10LTEwIHNtOm10LTBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1kOmdyaWQgbWQ6Z3JpZC1jb2xzLTMgbWQ6Z2FwLTZcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZDpjb2wtc3Bhbi0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgc206cHgtMFwiPlxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LWxnIGZvbnQtbWVkaXVtIGxlYWRpbmctNiB0ZXh0LWdyYXktOTAwXCI+UHJvamVjdCBDb2xvdXIgUGFsZXR0ZTwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibXQtMSB0ZXh0LXNtIHRleHQtZ3JheS02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEEgc2VsZWN0aW9uIG9mIGNvbG91cnMgdG8gdXNlIGFzIGRlZmF1bHQgY29sb3VycyBhcm91bmQgdGhlIHByb2plY3QgaW4gY2hhcnRzIGV0Yy5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNSBtZDpjb2wtc3Bhbi0yIG1kOm10LTBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuIHNoYWRvdyBzbTpyb3VuZGVkLW1kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy13aGl0ZSBweC00IHB5LTUgc206cC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWFjY29yZGlvbiBkaXNwbGF5TW9kZT1cImZsYXRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBjbGFzcz1cInNoYWRvdy1ub25lIGJvcmRlci1iXCIgW2V4cGFuZGVkXT1cInBhbGV0dGUuX29wZW5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHBhbGV0dGUgb2YgcHJvamVjdFNldHRpbmdzLnBhbGV0dGVzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvc2VkKT1cInBhbGV0dGUuX29wZW5lZCA9IGZhbHNlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cGFsZXR0ZS5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXBhbmVsLXRpdGxlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sb3VyIG9mIHBhbGV0dGUuY29sb3Vyc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtNCB3LTRcIiBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiBjb2xvdXJ9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1wYW5lbC1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgcGFsZXR0ZSBuYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInBhbGV0dGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJibG9jayB3LWZ1bGwgbWluLXctMCBmbGV4LTEgYm9yZGVyLWdyYXktMzAwIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnQgQ29sb3VyIFBhbGV0dGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICNjb2xvdXJQYWxldHRlICBwbGFjZWhvbGRlcj1cIkVudGVyIGVhY2ggaGV4IGNvbG91ciBjb21tYSBzZXBlcmF0ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmxvY2sgdy1mdWxsIG1pbi13LTAgZmxleC0xIGJvcmRlci1ncmF5LTMwMCBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiaW1wb3J0Q29sb3Vycyhjb2xvdXJQYWxldHRlLnZhbHVlLCBwYWxldHRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtMiBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXdoaXRlIGJnLXNlY29uZGFyeSBweS0xLjUgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtd2hpdGUgc2hhZG93LXNtIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1yLTJcIj51cGxvYWQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydCBDb2xvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3QgUGFsZXR0ZSBDb2xvdXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWNvbG91ciBbbmdGb3JPZl09XCJwYWxldHRlLmNvbG91cnNcIiBsZXQtaT1cImluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm15LTIgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBbKG5nTW9kZWwpXT1cInBhbGV0dGUuY29sb3Vyc1tpXVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIiAoY2xpY2spPVwicGFsZXR0ZS5jb2xvdXJzLnNwbGljZShpLCAxKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImRlbGV0ZVBhbGV0dGUoaSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1kYW5nZXIgYmctd2hpdGUgcHktMiBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1kYW5nZXIgc2hhZG93LXNtIFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBQYWxldHRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwYWxldHRlLmNvbG91cnMucHVzaCgnJylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItd2hpdGUgYmctc2Vjb25kYXJ5IHB5LTEuNSBweC00IHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC13aGl0ZSBzaGFkb3ctc20gXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibXItMlwiPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIENvbG91clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJwcm9qZWN0U2V0dGluZ3MucGFsZXR0ZXMucHVzaCh7bmFtZTogJycsIGNvbG91cnM6IFsnJ10sIF9vcGVuZWQ6IHRydWV9KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtNCBpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXNlY29uZGFyeSBiZy13aGl0ZSBweS0xLjUgcHgtNCB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtc2Vjb25kYXJ5IHNoYWRvdy1zbSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtci0yXCI+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgUGFsZXR0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZy1ncmF5LTUwIHB4LTQgcHktMyB0ZXh0LXJpZ2h0IHNtOnB4LTZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzYXZlQ2hhbmdlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtZmxleCBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgYmctcHJpbWFyeSBweS0yIHB4LTQgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXdoaXRlIHNoYWRvdy1zbSBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19