@provoly/dashboard 1.4.14 → 1.4.16

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 (203) hide show
  1. package/esm2022/admin/components/admin-abac-rules/admin-abac-rules-form/admin-abac-rules-form.component.mjs +7 -7
  2. package/esm2022/admin/components/admin-abac-rules/admin-abac-rules.component.mjs +3 -3
  3. package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +7 -7
  4. package/esm2022/admin/components/admin-abac-rules/components/composed-condition/composed-condition.component.mjs +10 -10
  5. package/esm2022/admin/components/admin-abac-rules/components/metadata-condition/metadata-condition.component.mjs +6 -6
  6. package/esm2022/admin/components/admin-abac-rules/components/select-attribute/select-attribute.component.mjs +3 -3
  7. package/esm2022/admin/components/admin-abac-rules/components/select-metadata/select-metadata.component.mjs +3 -3
  8. package/esm2022/admin/components/admin-classes/admin-classes-customize/admin-classes-customize.component.mjs +10 -10
  9. package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +10 -15
  10. package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +8 -8
  11. package/esm2022/admin/components/admin-classes/admin-classes-edit/admin-classes-edit.component.mjs +5 -5
  12. package/esm2022/admin/components/admin-classes/admin-classes-form/admin-classes-form.component.mjs +5 -5
  13. package/esm2022/admin/components/admin-classes/admin-classes-select/admin-classes-select.component.mjs +6 -6
  14. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-edit/admin-attributes-edit.component.mjs +5 -5
  15. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +3 -3
  16. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-new/admin-attributes-new.component.mjs +5 -5
  17. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-select/admin-attributes-select.component.mjs +6 -6
  18. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-classes-view.component.mjs +3 -3
  19. package/esm2022/admin/components/admin-classes/admin-classes.component.mjs +5 -5
  20. package/esm2022/admin/components/admin-dataset/admin-dataset.component.mjs +6 -6
  21. package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +7 -7
  22. package/esm2022/admin/components/admin-environment/admin-environment-form/admin-environment-form.component.mjs +3 -3
  23. package/esm2022/admin/components/admin-environment/admin-environment-select/admin-environment-select.component.mjs +5 -5
  24. package/esm2022/admin/components/admin-environment/admin-environment-update/admin-environment-update.component.mjs +5 -5
  25. package/esm2022/admin/components/admin-environment/admin-environment.component.mjs +5 -5
  26. package/esm2022/admin/components/admin-fields/admin-fields-edit/admin-fields-edit.component.mjs +5 -5
  27. package/esm2022/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.mjs +3 -3
  28. package/esm2022/admin/components/admin-layout/admin-layout.component.mjs +3 -3
  29. package/esm2022/admin/components/admin-links/admin-links-new/admin-links-new.component.mjs +5 -5
  30. package/esm2022/admin/components/admin-links/admin-links.component.mjs +5 -5
  31. package/esm2022/admin/components/admin-menu/admin-menu.component.mjs +5 -5
  32. package/esm2022/admin/components/admin-metadata/admin-edit-metadata/admin-edit-metadata.component.mjs +5 -5
  33. package/esm2022/admin/components/admin-metadata/admin-select-metadata/admin-select-metadata.component.mjs +5 -5
  34. package/esm2022/admin/components/admin-metadata/shared/form-metadata/form-metadata.component.mjs +4 -5
  35. package/esm2022/admin/components/admin-metadata/shared/list-metadata/pry-list-metadata.component.mjs +5 -6
  36. package/esm2022/admin/components/admin-metadata-rules/admin-metadata-rules.component.mjs +5 -5
  37. package/esm2022/admin/components/admin-metadata-rules/admin-select-metadata-rules/admin-select-metadata-rules.component.mjs +5 -5
  38. package/esm2022/admin/components/admin-metadata-rules/shared/admin-form-metadata-rules/admin-form-metadata-rules.component.mjs +4 -5
  39. package/esm2022/admin/components/admin-metadata-user/admin-user-edit-metadata/admin-user-edit-metadata.component.mjs +5 -5
  40. package/esm2022/admin/components/admin-metadata-user/admin-user-select-metadata/admin-user-select-metadata.component.mjs +5 -5
  41. package/esm2022/admin/components/admin-predicates/admin-predicates-form/admin-predicates-form.component.mjs +5 -5
  42. package/esm2022/admin/components/admin-predicates/admin-predicates-select/admin-predicates-select.component.mjs +5 -5
  43. package/esm2022/admin/components/admin-predicates/admin-predicates-update/admin-predicates-update.component.mjs +5 -5
  44. package/esm2022/admin/components/admin-predicates/admin-predicates.component.mjs +5 -5
  45. package/esm2022/admin/components/admin-relation-types/admin-relation-types-modal/admin-relation-types-modal.component.mjs +4 -5
  46. package/esm2022/admin/components/admin-relation-types/admin-relation-types-select/admin-relation-types-select.component.mjs +5 -5
  47. package/esm2022/admin/components/admin-relation-types/admin-relation-types.component.mjs +6 -6
  48. package/esm2022/admin/components/admin-user/admin-user-select/admin-user-select.component.mjs +6 -6
  49. package/esm2022/admin/components/admin-user/admin-user.component.mjs +5 -5
  50. package/esm2022/admin/components/association/association.component.mjs +4 -5
  51. package/esm2022/components/card/card.component.mjs +5 -6
  52. package/esm2022/components/metadata-editor/metadata-editor.component.mjs +6 -6
  53. package/esm2022/components/scheme-picker/scheme-picker.component.mjs +7 -7
  54. package/esm2022/components/stepper/stepper.component.mjs +3 -4
  55. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +5 -5
  56. package/esm2022/dataset/components/dataset-version-form/dataset-version-form.component.mjs +6 -7
  57. package/esm2022/filters/date/date-filter.component.mjs +5 -6
  58. package/esm2022/filters/list/list-filter.component.mjs +6 -7
  59. package/esm2022/filters/number/number-filter.component.mjs +5 -6
  60. package/esm2022/filters/text/text-filter.component.mjs +5 -6
  61. package/esm2022/lib/core/components/about/about.component.mjs +3 -3
  62. package/esm2022/lib/core/components/accordion/accordion-item/accordion-item.component.mjs +7 -7
  63. package/esm2022/lib/core/components/base-menu/base-menu.component.mjs +6 -6
  64. package/esm2022/lib/core/components/base-toolbox/base-toolbox.component.mjs +6 -6
  65. package/esm2022/lib/core/components/base-toolbox-action/base-toolbox-action.component.mjs +6 -7
  66. package/esm2022/lib/core/components/date-picker/date-picker.component.mjs +4 -4
  67. package/esm2022/lib/core/components/date-picker/time-picker/loop-scroll-column/loop-scroll-column.component.mjs +3 -4
  68. package/esm2022/lib/core/components/date-picker/time-picker/time-picker.component.mjs +6 -6
  69. package/esm2022/lib/core/components/edit-input/edit-input.component.mjs +7 -8
  70. package/esm2022/lib/core/components/icon/icon.component.mjs +3 -3
  71. package/esm2022/lib/core/components/modal/modal.component.mjs +5 -6
  72. package/esm2022/lib/core/components/nq-color-selector/nq-color-selector.component.mjs +5 -5
  73. package/esm2022/lib/core/components/overlay/dialog-confirm.component.mjs +3 -3
  74. package/esm2022/lib/core/components/range/range.component.mjs +5 -6
  75. package/esm2022/lib/core/components/select/select.component.mjs +3 -3
  76. package/esm2022/lib/core/components/select-image/select-image.component.mjs +5 -5
  77. package/esm2022/lib/core/components/share/group-share/group-share.component.mjs +6 -6
  78. package/esm2022/lib/core/components/snackbar/snackbar/snackbar.component.mjs +3 -3
  79. package/esm2022/lib/core/components/status-modal/status-modal.component.mjs +5 -5
  80. package/esm2022/lib/core/components/tabs/tab-group.component.mjs +3 -3
  81. package/esm2022/lib/core/components/toggle/toggle.component.mjs +4 -4
  82. package/esm2022/lib/core/store/data-source/data-source.effects.mjs +9 -9
  83. package/esm2022/lib/core/store/search/search.effects.mjs +4 -2
  84. package/esm2022/lib/core/store/search/search.service.mjs +3 -7
  85. package/esm2022/lib/core/toolbox/toolbox-manifest.service.mjs +3 -3
  86. package/esm2022/lib/dashboard/action-bus/service/bus.service.mjs +2 -2
  87. package/esm2022/lib/dashboard/components/context-menu/context-menu.component.mjs +8 -8
  88. package/esm2022/lib/dashboard/components/dashboard.component.mjs +12 -12
  89. package/esm2022/lib/dashboard/components/manifests/manifests.component.mjs +5 -5
  90. package/esm2022/lib/dashboard/components/metadata/metadata.component.mjs +5 -6
  91. package/esm2022/lib/dashboard/components/vizualize-raw/vizualize-raw.component.mjs +3 -3
  92. package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-selector.component.mjs +6 -6
  93. package/esm2022/lib/dashboard/components/widgets/header/widget-header.component.mjs +10 -10
  94. package/esm2022/lib/dashboard/components/widgets/widget-filler/widget-filler.component.mjs +2 -2
  95. package/esm2022/lib/dashboard/components/widgets/widget-placement/widget-placement.utils.mjs +2 -2
  96. package/esm2022/lib/dashboard/filter/components/filter-group/filter-group.component.mjs +7 -7
  97. package/esm2022/lib/dashboard/resultset-utils.mjs +7 -8
  98. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +4 -4
  99. package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +13 -24
  100. package/esm2022/lib/dashboard/tooltip/components/default/default.tooltip.component.mjs +3 -3
  101. package/esm2022/notification/components/notification/content/notification-content.component.mjs +3 -3
  102. package/esm2022/notification/components/notification/notification.component.mjs +5 -5
  103. package/esm2022/pipeline/components/pipeline-details/pipeline-details.component.mjs +7 -7
  104. package/esm2022/pipeline/components/pipeline-editor/graph-serializer.utils.mjs +2 -2
  105. package/esm2022/pipeline/components/pipeline-editor/pipeline-editor.component.mjs +5 -5
  106. package/esm2022/pipeline/components/pipeline-list/pipeline-list.component.mjs +9 -9
  107. package/esm2022/presentation/components/add-edit-presentation/add-edit-presentation.component.mjs +6 -6
  108. package/esm2022/presentation/components/presentation.component.mjs +6 -6
  109. package/esm2022/presentation/components/title-presentation/title-presentation.component.mjs +5 -5
  110. package/esm2022/restitution/components/restitution/restitution.component.mjs +3 -3
  111. package/esm2022/restitution/components/restitution-catalog/restitution-catalog.component.mjs +9 -9
  112. package/esm2022/restitution/components/restitution-list-item/restitution-list-item.component.mjs +3 -3
  113. package/esm2022/search/components/choose-widget/choose-widget.component.mjs +5 -5
  114. package/esm2022/search/components/edit-named-query/edit-named-query.component.mjs +9 -9
  115. package/esm2022/search/search-fulltext/search-fulltext/search-fulltext.component.mjs +3 -3
  116. package/esm2022/search/search-home/search-home.component.mjs +3 -3
  117. package/esm2022/search/search-mono-class/components/search-composed/search-composed.component.mjs +3 -3
  118. package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +3 -3
  119. package/esm2022/search/search-mono-class/components/search-mono-class/search-mono-class.component.mjs +8 -8
  120. package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +6 -6
  121. package/esm2022/search/search-mono-class/components/search-select-attribute/search-select-attribute.component.mjs +3 -3
  122. package/esm2022/search/search-multi-class/components/multi-class-condition/multi-class-condition.component.mjs +7 -7
  123. package/esm2022/search/search-multi-class/components/multi-class-field-selection/multi-class-field-selection.component.mjs +6 -6
  124. package/esm2022/search/search-multi-class/components/search-multi-class/search-multi-class.component.mjs +7 -7
  125. package/esm2022/search/search-tools/search-tools.component.mjs +13 -13
  126. package/esm2022/toolbox/components/named-query/named-query.component.mjs +5 -5
  127. package/esm2022/toolbox/components/save-view/save-view.component.mjs +10 -10
  128. package/esm2022/toolbox/components/select-grid-layout/select-grid-layout.component.mjs +8 -8
  129. package/esm2022/toolbox/shared/presentation-form/presentation-form.component.mjs +5 -6
  130. package/esm2022/tooltips/attribute/attribute-tooltip.component.mjs +3 -3
  131. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +4 -4
  132. package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +2 -2
  133. package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +12 -12
  134. package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +13 -7
  135. package/esm2022/widgets/widget-graph/component/widget-graph.component.mjs +7 -7
  136. package/esm2022/widgets/widget-iframe/component/widget-iframe.component.mjs +7 -7
  137. package/esm2022/widgets/widget-iframe/messaging/iframe-messaging.service.mjs +2 -2
  138. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +10 -10
  139. package/esm2022/widgets/widget-map/utils/widget-map.utils.mjs +2 -2
  140. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +2 -2
  141. package/esm2022/widgets/widget-table/expand-value/expand-value.component.mjs +4 -5
  142. package/esm2022/widgets/widget-template/component/widget-template.component.mjs +7 -7
  143. package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +10 -10
  144. package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +9 -9
  145. package/fesm2022/provoly-dashboard-admin.mjs +171 -175
  146. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  147. package/fesm2022/provoly-dashboard-components-card.mjs +4 -5
  148. package/fesm2022/provoly-dashboard-components-card.mjs.map +1 -1
  149. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs +4 -4
  150. package/fesm2022/provoly-dashboard-components-metadata-editor.mjs.map +1 -1
  151. package/fesm2022/provoly-dashboard-components-scheme-picker.mjs +6 -6
  152. package/fesm2022/provoly-dashboard-components-scheme-picker.mjs.map +1 -1
  153. package/fesm2022/provoly-dashboard-components-stepper.mjs +2 -3
  154. package/fesm2022/provoly-dashboard-components-stepper.mjs.map +1 -1
  155. package/fesm2022/provoly-dashboard-dataset.mjs +14 -14
  156. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  157. package/fesm2022/provoly-dashboard-filters-date.mjs +4 -5
  158. package/fesm2022/provoly-dashboard-filters-date.mjs.map +1 -1
  159. package/fesm2022/provoly-dashboard-filters-list.mjs +4 -5
  160. package/fesm2022/provoly-dashboard-filters-list.mjs.map +1 -1
  161. package/fesm2022/provoly-dashboard-filters-number.mjs +4 -5
  162. package/fesm2022/provoly-dashboard-filters-number.mjs.map +1 -1
  163. package/fesm2022/provoly-dashboard-filters-text.mjs +4 -5
  164. package/fesm2022/provoly-dashboard-filters-text.mjs.map +1 -1
  165. package/fesm2022/provoly-dashboard-notification.mjs +4 -4
  166. package/fesm2022/provoly-dashboard-notification.mjs.map +1 -1
  167. package/fesm2022/provoly-dashboard-pipeline.mjs +21 -21
  168. package/fesm2022/provoly-dashboard-pipeline.mjs.map +1 -1
  169. package/fesm2022/provoly-dashboard-presentation.mjs +14 -14
  170. package/fesm2022/provoly-dashboard-presentation.mjs.map +1 -1
  171. package/fesm2022/provoly-dashboard-restitution.mjs +6 -6
  172. package/fesm2022/provoly-dashboard-restitution.mjs.map +1 -1
  173. package/fesm2022/provoly-dashboard-search.mjs +35 -35
  174. package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
  175. package/fesm2022/provoly-dashboard-toolbox.mjs +25 -25
  176. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  177. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs +2 -2
  178. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs.map +1 -1
  179. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +3 -3
  180. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  181. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +1 -1
  182. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
  183. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +10 -10
  184. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
  185. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +11 -5
  186. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
  187. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs +5 -5
  188. package/fesm2022/provoly-dashboard-widgets-widget-graph.mjs.map +1 -1
  189. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs +8 -8
  190. package/fesm2022/provoly-dashboard-widgets-widget-iframe.mjs.map +1 -1
  191. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +9 -9
  192. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  193. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +6 -6
  194. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  195. package/fesm2022/provoly-dashboard-widgets-widget-template.mjs +7 -7
  196. package/fesm2022/provoly-dashboard-widgets-widget-template.mjs.map +1 -1
  197. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +11 -11
  198. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
  199. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +7 -7
  200. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  201. package/fesm2022/provoly-dashboard.mjs +204 -219
  202. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  203. package/package.json +1 -1
@@ -5,8 +5,8 @@ import { map, tap } from 'rxjs/operators';
5
5
  import * as i0 from "@angular/core";
6
6
  import * as i1 from "@ngrx/store";
7
7
  import * as i2 from "@provoly/dashboard";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "../style/css.component";
8
+ import * as i3 from "../style/css.component";
9
+ import * as i4 from "@angular/common";
10
10
  import * as i5 from "@provoly/dashboard/components/data-format";
11
11
  export class WidgetDetailComponent extends BaseWidgetComponent {
12
12
  static { this.widgetIdGenerator = 0; }
@@ -62,7 +62,7 @@ export class WidgetDetailComponent extends BaseWidgetComponent {
62
62
  categories: categoriesWithProps
63
63
  };
64
64
  })));
65
- this.subscriptions.add(this.options$.subscribe((options) => (this.optionsCopy = JSON.parse(JSON.stringify(options)))));
65
+ this.subscriptions.add(this.options$.subscribe((options) => (this.optionsCopy = structuredClone(options))));
66
66
  this.subscriptions.add(this.itemsToDisplay$.subscribe((items) => (this.itemsForPin = items.map((item) => item.id))));
67
67
  this.subscriptions.add(this.store.select(FieldSelectors.fields).subscribe((fields) => (this.fields = fields)));
68
68
  this.detailledWidgetManifest$ = this.itemsToDisplay$.pipe(map((items) => ({
@@ -116,17 +116,23 @@ export class WidgetDetailComponent extends BaseWidgetComponent {
116
116
  contextMenu($event, item) {
117
117
  if (this.manifest.contextMenu !== false) {
118
118
  $event.preventDefault();
119
- this.store.dispatch(ContextMenuActions.open({ itemId: item.id, clientX: $event.clientX, clientY: $event.clientY, from: 'detail', allowObjectCreation: false }));
119
+ this.store.dispatch(ContextMenuActions.open({
120
+ itemId: item.id,
121
+ clientX: $event.clientX,
122
+ clientY: $event.clientY,
123
+ from: 'detail',
124
+ allowObjectCreation: false
125
+ }));
120
126
  }
121
127
  }
122
128
  isRaw(attribute) {
123
129
  return attribute.field?.type === FieldType.RAW;
124
130
  }
125
131
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetDetailComponent, deps: [{ token: i1.Store }, { token: i2.PryI18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: WidgetDetailComponent, selector: "pry-widget-detail", usesInheritance: true, ngImport: i0, template: "<pry-widget-detail-css></pry-widget-detail-css>\n<div class=\"o-widget o-widget--detail\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"detailledWidgetManifest$ | async\"\n [additionalOptions]=\"additionalOptions$ | async\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [displayCount]=\"false\"\n >\n </pry-widget-header>\n\n <p class=\"is-empty\" *ngIf=\"!(itemAndCategories$ | async) || (itemAndCategories$ | async)?.length === 0\">\n {{ '@pry.widget.detail.noItems' | i18n }}\n </p>\n\n <div class=\"o-widget--detail__content\" *ngFor=\"let couple of itemAndCategories$ | async; let itemIndex = index\">\n <ng-container *ngIf=\"!((options$ | async)?.header === false)\">\n <div\n class=\"o-widget--detail__header\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n title=\"{{ '@pry.widget.itemId' | i18n }}: {{ couple.item.id }}\"\n >\n <img [height]=\"25\" [width]=\"25\" [src]=\"couple.item | translateItemToSymbol | async\" [alt]=\"couple\" />\n <h3 class=\"o-widget--detail__header__title\">\n {{ '@pry.widget.class' | i18n }}:\n {{\n couple.item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\"\n [attr.aria-controls]=\"'item-' + widgetId + '-' + itemIndex\"\n (click)=\"toggle(itemIndex)\"\n >\n <pry-icon *ngIf=\"!!panelOpened[itemIndex] && panelOpened[itemIndex].item\" iconSvg=\"fleche_haut\"></pry-icon>\n <pry-icon *ngIf=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\" iconSvg=\"fleche_bas\"></pry-icon>\n </button>\n </div>\n <div class=\"o-widget--detail__datas\" *ngIf=\"hasMetadata(couple.item)\">\n <pry-metadata [item]=\"couple.item\"></pry-metadata>\n </div>\n </ng-container>\n\n <div\n *ngIf=\"!!panelOpened[itemIndex] && panelOpened[itemIndex].item\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n class=\"o-widget--detail__datas\"\n [id]=\"'item-' + widgetId + '-' + itemIndex\"\n >\n <ng-container *ngFor=\"let category of couple.categories; let categoryIndex = index\">\n <div class=\"o-widget--detail__category\">\n <p>{{ '@pry.widget.detail.category' | i18n }}: {{ category.name }}</p>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n [attr.aria-controls]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n (click)=\"toggle(itemIndex, categoryIndex)\"\n >\n <pry-icon\n *ngIf=\"panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]\"\n iconSvg=\"fleche_haut\"\n >\n </pry-icon>\n <pry-icon\n *ngIf=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n iconSvg=\"fleche_bas\"\n >\n </pry-icon>\n </button>\n </div>\n\n <div\n class=\"o-properties\"\n [id]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n *ngIf=\"panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]\"\n >\n <ul class=\"o-properties__list\">\n <ng-container>\n <ng-container *ngFor=\"let property of category.properties\">\n <li\n *ngFor=\"let value of getValue(couple.item, property.attribute); let i = index; let c = count\"\n class=\"o-properties__list__item\"\n >\n <p class=\"o-properties__list__item__label\" *ngIf=\"i === 0\">{{ property.name }}:</p>\n <p class=\"o-properties__list__item__value\" *ngIf=\"!isRaw(property.attribute)\">\n {{ value?.value | dataFormat: property.attribute.field }}\n </p>\n <p class=\"o-properties__list__item__raw\" *ngIf=\"isRaw(property.attribute)\">\n <pry-vizualize-raw [item]=\"couple.item\" [propertyName]=\"property.name\"></pry-vizualize-raw>\n </p>\n <ng-container *ngIf=\"hasMetadata(value)\">\n <pry-metadata [item]=\"value\"></pry-metadata>\n </ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.VizualizeRawComponent, selector: "pry-vizualize-raw", inputs: ["item", "propertyName", "alt"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i4.PryWidgetDetailCssComponent, selector: "pry-widget-detail-css" }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i2.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i5.DataFormatPipe, name: "dataFormat" }] }); }
132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: WidgetDetailComponent, selector: "pry-widget-detail", usesInheritance: true, ngImport: i0, template: "<pry-widget-detail-css></pry-widget-detail-css>\n<div class=\"o-widget o-widget--detail\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"detailledWidgetManifest$ | async\"\n [additionalOptions]=\"additionalOptions$ | async\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [displayCount]=\"false\"\n >\n </pry-widget-header>\n }\n\n @if (!(itemAndCategories$ | async) || (itemAndCategories$ | async)?.length === 0) {\n <p class=\"is-empty\">\n {{ '@pry.widget.detail.noItems' | i18n }}\n </p>\n }\n\n @for (couple of itemAndCategories$ | async; track couple; let itemIndex = $index) {\n <div class=\"o-widget--detail__content\">\n @if (!((options$ | async)?.header === false)) {\n <div\n class=\"o-widget--detail__header\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n title=\"{{ '@pry.widget.itemId' | i18n }}: {{ couple.item.id }}\"\n >\n <img [height]=\"25\" [width]=\"25\" [src]=\"couple.item | translateItemToSymbol | async\" [alt]=\"couple\" />\n <h3 class=\"o-widget--detail__header__title\">\n {{ '@pry.widget.class' | i18n }}:\n {{\n couple.item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\"\n [attr.aria-controls]=\"'item-' + widgetId + '-' + itemIndex\"\n (click)=\"toggle(itemIndex)\"\n >\n @if (!!panelOpened[itemIndex] && panelOpened[itemIndex].item) {\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n }\n @if (!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)) {\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n }\n </button>\n </div>\n @if (hasMetadata(couple.item)) {\n <div class=\"o-widget--detail__datas\">\n <pry-metadata [item]=\"couple.item\"></pry-metadata>\n </div>\n }\n }\n @if (!!panelOpened[itemIndex] && panelOpened[itemIndex].item) {\n <div\n (contextmenu)=\"contextMenu($event, couple.item)\"\n class=\"o-widget--detail__datas\"\n [id]=\"'item-' + widgetId + '-' + itemIndex\"\n >\n @for (category of couple.categories; track category; let categoryIndex = $index) {\n <div class=\"o-widget--detail__category\">\n <p>{{ '@pry.widget.detail.category' | i18n }}: {{ category.name }}</p>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n [attr.aria-controls]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n (click)=\"toggle(itemIndex, categoryIndex)\"\n >\n @if (panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]) {\n <pry-icon\n iconSvg=\"fleche_haut\"\n >\n </pry-icon>\n }\n @if (!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])) {\n <pry-icon\n iconSvg=\"fleche_bas\"\n >\n </pry-icon>\n }\n </button>\n </div>\n @if (panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]) {\n <div\n class=\"o-properties\"\n [id]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n >\n <ul class=\"o-properties__list\">\n <ng-container>\n @for (property of category.properties; track property) {\n @for (value of getValue(couple.item, property.attribute); track value; let i = $index; let c = $count) {\n <li\n class=\"o-properties__list__item\"\n >\n @if (i === 0) {\n <p class=\"o-properties__list__item__label\">{{ property.name }}:</p>\n }\n @if (!isRaw(property.attribute)) {\n <p class=\"o-properties__list__item__value\">\n {{ value?.value | dataFormat: property.attribute.field }}\n </p>\n }\n @if (isRaw(property.attribute)) {\n <p class=\"o-properties__list__item__raw\">\n <pry-vizualize-raw [item]=\"couple.item\" [propertyName]=\"property.name\"></pry-vizualize-raw>\n </p>\n }\n @if (hasMetadata(value)) {\n <pry-metadata [item]=\"value\"></pry-metadata>\n }\n </li>\n }\n }\n </ng-container>\n </ul>\n </div>\n }\n }\n </div>\n }\n </div>\n}\n</div>\n", dependencies: [{ kind: "component", type: i2.MetadataComponent, selector: "pry-metadata", inputs: ["item"] }, { kind: "component", type: i2.PryWidgetHeaderComponent, selector: "pry-widget-header", inputs: ["manifest", "openData$", "additionalOptions", "headerOptions", "displayCount", "datasourceIds", "widgetIndex"], outputs: ["manifestModified"] }, { kind: "component", type: i2.VizualizeRawComponent, selector: "pry-vizualize-raw", inputs: ["item", "propertyName", "alt"] }, { kind: "component", type: i2.PryIconComponent, selector: "pry-icon", inputs: ["color", "iconSvg", "animation", "iconImage", "alt", "width", "height", "classes"] }, { kind: "component", type: i3.PryWidgetDetailCssComponent, selector: "pry-widget-detail-css" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.TranslateIdPipe, name: "translateId" }, { kind: "pipe", type: i2.TranslateItemToSymbolPipe, name: "translateItemToSymbol" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }, { kind: "pipe", type: i5.DataFormatPipe, name: "dataFormat" }] }); }
127
133
  }
128
134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: WidgetDetailComponent, decorators: [{
129
135
  type: Component,
130
- args: [{ selector: 'pry-widget-detail', template: "<pry-widget-detail-css></pry-widget-detail-css>\n<div class=\"o-widget o-widget--detail\">\n <pry-widget-header\n *ngIf=\"displayHeader$ | async\"\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"detailledWidgetManifest$ | async\"\n [additionalOptions]=\"additionalOptions$ | async\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [displayCount]=\"false\"\n >\n </pry-widget-header>\n\n <p class=\"is-empty\" *ngIf=\"!(itemAndCategories$ | async) || (itemAndCategories$ | async)?.length === 0\">\n {{ '@pry.widget.detail.noItems' | i18n }}\n </p>\n\n <div class=\"o-widget--detail__content\" *ngFor=\"let couple of itemAndCategories$ | async; let itemIndex = index\">\n <ng-container *ngIf=\"!((options$ | async)?.header === false)\">\n <div\n class=\"o-widget--detail__header\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n title=\"{{ '@pry.widget.itemId' | i18n }}: {{ couple.item.id }}\"\n >\n <img [height]=\"25\" [width]=\"25\" [src]=\"couple.item | translateItemToSymbol | async\" [alt]=\"couple\" />\n <h3 class=\"o-widget--detail__header__title\">\n {{ '@pry.widget.class' | i18n }}:\n {{\n couple.item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\"\n [attr.aria-controls]=\"'item-' + widgetId + '-' + itemIndex\"\n (click)=\"toggle(itemIndex)\"\n >\n <pry-icon *ngIf=\"!!panelOpened[itemIndex] && panelOpened[itemIndex].item\" iconSvg=\"fleche_haut\"></pry-icon>\n <pry-icon *ngIf=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\" iconSvg=\"fleche_bas\"></pry-icon>\n </button>\n </div>\n <div class=\"o-widget--detail__datas\" *ngIf=\"hasMetadata(couple.item)\">\n <pry-metadata [item]=\"couple.item\"></pry-metadata>\n </div>\n </ng-container>\n\n <div\n *ngIf=\"!!panelOpened[itemIndex] && panelOpened[itemIndex].item\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n class=\"o-widget--detail__datas\"\n [id]=\"'item-' + widgetId + '-' + itemIndex\"\n >\n <ng-container *ngFor=\"let category of couple.categories; let categoryIndex = index\">\n <div class=\"o-widget--detail__category\">\n <p>{{ '@pry.widget.detail.category' | i18n }}: {{ category.name }}</p>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n [attr.aria-controls]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n (click)=\"toggle(itemIndex, categoryIndex)\"\n >\n <pry-icon\n *ngIf=\"panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]\"\n iconSvg=\"fleche_haut\"\n >\n </pry-icon>\n <pry-icon\n *ngIf=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n iconSvg=\"fleche_bas\"\n >\n </pry-icon>\n </button>\n </div>\n\n <div\n class=\"o-properties\"\n [id]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n *ngIf=\"panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]\"\n >\n <ul class=\"o-properties__list\">\n <ng-container>\n <ng-container *ngFor=\"let property of category.properties\">\n <li\n *ngFor=\"let value of getValue(couple.item, property.attribute); let i = index; let c = count\"\n class=\"o-properties__list__item\"\n >\n <p class=\"o-properties__list__item__label\" *ngIf=\"i === 0\">{{ property.name }}:</p>\n <p class=\"o-properties__list__item__value\" *ngIf=\"!isRaw(property.attribute)\">\n {{ value?.value | dataFormat: property.attribute.field }}\n </p>\n <p class=\"o-properties__list__item__raw\" *ngIf=\"isRaw(property.attribute)\">\n <pry-vizualize-raw [item]=\"couple.item\" [propertyName]=\"property.name\"></pry-vizualize-raw>\n </p>\n <ng-container *ngIf=\"hasMetadata(value)\">\n <pry-metadata [item]=\"value\"></pry-metadata>\n </ng-container>\n </li>\n </ng-container>\n </ng-container>\n </ul>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n" }]
136
+ args: [{ selector: 'pry-widget-detail', template: "<pry-widget-detail-css></pry-widget-detail-css>\n<div class=\"o-widget o-widget--detail\">\n @if (displayHeader$ | async) {\n <pry-widget-header\n [widgetIndex]=\"widgetIndex\"\n [manifest]=\"detailledWidgetManifest$ | async\"\n [additionalOptions]=\"additionalOptions$ | async\"\n [headerOptions]=\"(displayHeader$ | async) ?? {}\"\n [displayCount]=\"false\"\n >\n </pry-widget-header>\n }\n\n @if (!(itemAndCategories$ | async) || (itemAndCategories$ | async)?.length === 0) {\n <p class=\"is-empty\">\n {{ '@pry.widget.detail.noItems' | i18n }}\n </p>\n }\n\n @for (couple of itemAndCategories$ | async; track couple; let itemIndex = $index) {\n <div class=\"o-widget--detail__content\">\n @if (!((options$ | async)?.header === false)) {\n <div\n class=\"o-widget--detail__header\"\n (contextmenu)=\"contextMenu($event, couple.item)\"\n title=\"{{ '@pry.widget.itemId' | i18n }}: {{ couple.item.id }}\"\n >\n <img [height]=\"25\" [width]=\"25\" [src]=\"couple.item | translateItemToSymbol | async\" [alt]=\"couple\" />\n <h3 class=\"o-widget--detail__header__title\">\n {{ '@pry.widget.class' | i18n }}:\n {{\n couple.item.oClass\n | translateId\n : {\n type: 'class',\n output: 'name'\n }\n | async\n }}\n </h3>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)\"\n [attr.aria-controls]=\"'item-' + widgetId + '-' + itemIndex\"\n (click)=\"toggle(itemIndex)\"\n >\n @if (!!panelOpened[itemIndex] && panelOpened[itemIndex].item) {\n <pry-icon iconSvg=\"fleche_haut\"></pry-icon>\n }\n @if (!(!!panelOpened[itemIndex] && panelOpened[itemIndex].item)) {\n <pry-icon iconSvg=\"fleche_bas\"></pry-icon>\n }\n </button>\n </div>\n @if (hasMetadata(couple.item)) {\n <div class=\"o-widget--detail__datas\">\n <pry-metadata [item]=\"couple.item\"></pry-metadata>\n </div>\n }\n }\n @if (!!panelOpened[itemIndex] && panelOpened[itemIndex].item) {\n <div\n (contextmenu)=\"contextMenu($event, couple.item)\"\n class=\"o-widget--detail__datas\"\n [id]=\"'item-' + widgetId + '-' + itemIndex\"\n >\n @for (category of couple.categories; track category; let categoryIndex = $index) {\n <div class=\"o-widget--detail__category\">\n <p>{{ '@pry.widget.detail.category' | i18n }}: {{ category.name }}</p>\n <button\n type=\"button\"\n class=\"a-btn a-btn--icon-only\"\n [attr.aria-expanded]=\"!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])\"\n [attr.aria-controls]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n (click)=\"toggle(itemIndex, categoryIndex)\"\n >\n @if (panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]) {\n <pry-icon\n iconSvg=\"fleche_haut\"\n >\n </pry-icon>\n }\n @if (!(panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex])) {\n <pry-icon\n iconSvg=\"fleche_bas\"\n >\n </pry-icon>\n }\n </button>\n </div>\n @if (panelOpened[itemIndex] && panelOpened[itemIndex].categories[categoryIndex]) {\n <div\n class=\"o-properties\"\n [id]=\"'properties-' + widgetId + '-' + itemIndex + '-' + categoryIndex\"\n >\n <ul class=\"o-properties__list\">\n <ng-container>\n @for (property of category.properties; track property) {\n @for (value of getValue(couple.item, property.attribute); track value; let i = $index; let c = $count) {\n <li\n class=\"o-properties__list__item\"\n >\n @if (i === 0) {\n <p class=\"o-properties__list__item__label\">{{ property.name }}:</p>\n }\n @if (!isRaw(property.attribute)) {\n <p class=\"o-properties__list__item__value\">\n {{ value?.value | dataFormat: property.attribute.field }}\n </p>\n }\n @if (isRaw(property.attribute)) {\n <p class=\"o-properties__list__item__raw\">\n <pry-vizualize-raw [item]=\"couple.item\" [propertyName]=\"property.name\"></pry-vizualize-raw>\n </p>\n }\n @if (hasMetadata(value)) {\n <pry-metadata [item]=\"value\"></pry-metadata>\n }\n </li>\n }\n }\n </ng-container>\n </ul>\n </div>\n }\n }\n </div>\n }\n </div>\n}\n</div>\n" }]
131
137
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.PryI18nService }, { type: i0.ElementRef }] });
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1kZXRhaWwvY29tcG9uZW50L3dpZGdldC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtZGV0YWlsL2NvbXBvbmVudC93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBR2xCLGNBQWMsRUFDZCxTQUFTLEVBR1QsU0FBUyxFQUdWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTTFDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxtQkFBbUI7YUFjckQsc0JBQWlCLEdBQUcsQ0FBQyxBQUFKLENBQUs7SUFFN0IsWUFDRSxLQUFpQixFQUNULGdCQUFnQyxFQUN4QyxFQUFjO1FBRWQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhULHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0I7UUFmMUMsZ0JBQVcsR0FBK0MsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBTy9GLFdBQU0sR0FBWSxFQUFFLENBQUM7UUFZbkIsSUFB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bSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQXR0cmlidXRlU2ltcGxlVmFsdWUsXG4gIEJhc2VXaWRnZXRDb21wb25lbnQsXG4gIENhdGVnb3J5U2VsZWN0b3JzLFxuICBDbGFzc1NlbGVjdG9ycyxcbiAgQ29udGV4dE1lbnVBY3Rpb25zLFxuICBEYXNoYm9hcmRBY3Rpb25zLFxuICBEYXNoYm9hcmRTZWxlY3RvcnMsXG4gIERldGFpbFdpZGdldE9wdGlvbnMsXG4gIEZpZWxkLFxuICBGaWVsZFNlbGVjdG9ycyxcbiAgRmllbGRUeXBlLFxuICBIZWFkZXJBY3Rpb24sXG4gIEl0ZW0sXG4gIEl0ZW1VdGlscyxcbiAgUHJ5STE4blNlcnZpY2UsXG4gIFdpZGdldE1hbmlmZXN0XG59IGZyb20gJ0Bwcm92b2x5L2Rhc2hib2FyZCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncHJ5LXdpZGdldC1kZXRhaWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0LWRldGFpbC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0RGV0YWlsQ29tcG9uZW50IGV4dGVuZHMgQmFzZVdpZGdldENvbXBvbmVudCB7XG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPERldGFpbFdpZGdldE9wdGlvbnM+O1xuICBpdGVtc1RvRGlzcGxheSQ6IE9ic2VydmFibGU8SXRlbVtdPjtcbiAgcGFuZWxPcGVuZWQ6IHsgaXRlbTogYm9vbGVhbjsgY2F0ZWdvcmllczogYm9vbGVhbltdIH1bXSA9IFt7IGl0ZW06IHRydWUsIGNhdGVnb3JpZXM6IFt0cnVlXSB9XTtcbiAgaXRlbUFuZENhdGVnb3JpZXMkOiBPYnNlcnZhYmxlPFxuICAgIHsgaXRlbTogSXRlbTsgY2F0ZWdvcmllczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHByb3BlcnRpZXM6IHsgbmFtZTogc3RyaW5nOyBhdHRyaWJ1dGU6IEF0dHJpYnV0ZSB9W10gfVtdIH1bXVxuICA+O1xuICBwaW5uZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBvcHRpb25zQ29weT86IERldGFpbFdpZGdldE9wdGlvbnM7XG4gIGl0ZW1zRm9yUGluPzogc3RyaW5nW107XG4gIGZpZWxkczogRmllbGRbXSA9IFtdO1xuICBkZXRhaWxsZWRXaWRnZXRNYW5pZmVzdCQ6IE9ic2VydmFibGU8V2lkZ2V0TWFuaWZlc3Q+O1xuICBhZGRpdGlvbmFsT3B0aW9ucyQ6IE9ic2VydmFibGU8SGVhZGVyQWN0aW9uW10+O1xuICB3aWRnZXRJZDogbnVtYmVyO1xuICBzdGF0aWMgd2lkZ2V0SWRHZW5lcmF0b3IgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0b3JlOiBTdG9yZTxhbnk+LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogUHJ5STE4blNlcnZpY2UsXG4gICAgZWw6IEVsZW1lbnRSZWZcbiAgKSB7XG4gICAgc3VwZXIoc3RvcmUsIGVsKTtcbiAgICB0aGlzLndpZGdldElkID0gV2lkZ2V0RGV0YWlsQ29tcG9uZW50LndpZGdldElkR2VuZXJhdG9yKys7XG4gICAgdGhpcy5vcHRpb25zJCA9IHRoaXMubWFuaWZlc3QkLnBpcGUobWFwKChtYW5pZmVzdCkgPT4gKG1hbmlmZXN0Lm9wdGlvbnMgPz8ge30pIGFzIERldGFpbFdpZGdldE9wdGlvbnMpKTtcbiAgICB0aGlzLnBpbm5lZCQgPSB0aGlzLm9wdGlvbnMkLnBpcGUobWFwKChvcHRpb25zKSA9PiAhIW9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMCkpO1xuICAgIHRoaXMuaXRlbXNUb0Rpc3BsYXkkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuc2VsZWN0ZWRJdGVtcyksXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChEYXNoYm9hcmRTZWxlY3RvcnMuYWxsSXRlbXMpLFxuICAgICAgdGhpcy5vcHRpb25zJCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5vYmplY3REZXRhaWxzKVxuICAgIF0pLnBpcGUoXG4gICAgICB0YXAoKFtfLCBhbGxJdGVtcywgb3B0aW9ucywgb2JqZWN0RGV0YWlsc10pID0+IHtcbiAgICAgICAgLy8gZ28gc2VhcmNoIGZvciBkZXRhaWwgaXRlbSBpZiBub3QgYWxyZWFkeSBmb3VuZCBpbiBhbGxJdGVtcyBMaXN0XG4gICAgICAgIGlmIChvcHRpb25zLml0ZW1JZHMgJiYgb3B0aW9ucy5pdGVtSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBtaXNzaW5nSXRlbXMgPSBvcHRpb25zLml0ZW1JZHNcbiAgICAgICAgICAgIC5tYXAoKGlkKSA9PiAoIWFsbEl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gaWQpID8gaWQgOiAobnVsbCBhcyB1bmtub3duIGFzIHN0cmluZykpKVxuICAgICAgICAgICAgLmZpbHRlcigoaXQpID0+ICEhaXQpXG4gICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gIU9iamVjdC5rZXlzKG9iamVjdERldGFpbHMpLmluY2x1ZGVzKGl0KSk7XG5cbiAgICAgICAgICBpZiAobWlzc2luZ0l0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goRGFzaGJvYXJkQWN0aW9ucy5mZXRjaE9iamVjdHNEZXRhaWxzKHsgaWRzOiBtaXNzaW5nSXRlbXMgfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBtYXAoKFtnbG9iYWxTZWxlY3Rpb25JdGVtcywgYWxsSXRlbXMsIG9wdGlvbnMsIG9iamVjdERldGFpbHNdKSA9PlxuICAgICAgICBvcHRpb25zLml0ZW1JZHMgJiYgb3B0aW9ucy5pdGVtSWRzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IG9wdGlvbnMuaXRlbUlkcy5tYXAoKGlkKSA9PiBhbGxJdGVtcy5maW5kKChpdCkgPT4gaXQuaWQgPT09IGlkKSA/PyBvYmplY3REZXRhaWxzW2lkXSlcbiAgICAgICAgICA6IGdsb2JhbFNlbGVjdGlvbkl0ZW1zXG4gICAgICApLFxuICAgICAgbWFwKChpdGVtcykgPT4gaXRlbXMuZmlsdGVyKChpdCkgPT4gISFpdCkgYXMgSXRlbVtdKVxuICAgICk7XG5cbiAgICB0aGlzLml0ZW1BbmRDYXRlZ29yaWVzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5pdGVtc1RvRGlzcGxheSQsXG4gICAgICB0aGlzLnN0b3JlLnNlbGVjdChDbGFzc1NlbGVjdG9ycy5jbGFzc2VzKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENhdGVnb3J5U2VsZWN0b3JzLmNhdGVnb3JpZXMpXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2l0ZW1zLCBjbGFzc2VzLCBjYXRlZ29yaWVzXSkgPT5cbiAgICAgICAgaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0Q2xhc3MgPSBjbGFzc2VzLmZpbmQoKG9DbGFzcykgPT4gb0NsYXNzLmlkID09PSBpdGVtLm9DbGFzcykgPz8geyBhdHRyaWJ1dGVzOiBbXSB9O1xuICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNXaXRoUHJvcHMgPSBbXSBhcyB7XG4gICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgcHJvcGVydGllczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZTogQXR0cmlidXRlIH1bXTtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB9W107XG4gICAgICAgICAgb2JqZWN0Q2xhc3MuYXR0cmlidXRlcy5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gYXR0ci5jYXRlZ29yeSA/PyBjYXRlZ29yaWVzLmZpbmQoKGNhdCkgPT4gY2F0Lm5hbWUgPT09ICdkZWZhdWx0Jyk/LmlkID8/ICdkZWZhdWx0LWlkJztcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcmllc1dpdGhQcm9wcy5maW5kKChjYXQpID0+IGNhdC5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgICAgICAgY2F0ZWdvcmllc1dpdGhQcm9wcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBpZDogY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICAgICAgICAgICAgICBuYW1lOiBjYXRlZ29yaWVzLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKT8ubmFtZSA/PyAnZGVmYXVsdCdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRlZ29yaWVzV2l0aFByb3BzXG4gICAgICAgICAgICAgIC5maW5kKChjYXQpID0+IGNhdC5pZCA9PT0gY2F0ZWdvcnlJZClcbiAgICAgICAgICAgICAgPy5wcm9wZXJ0aWVzLnB1c2goeyBuYW1lOiBhdHRyLm5hbWUsIGF0dHJpYnV0ZTogYXR0ciB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXRlbSxcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IGNhdGVnb3JpZXNXaXRoUHJvcHNcbiAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5vcHRpb25zJC5zdWJzY3JpYmUoKG9wdGlvbnMpID0+ICh0aGlzLm9wdGlvbnNDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvcHRpb25zKSkpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxuICAgICAgdGhpcy5pdGVtc1RvRGlzcGxheSQuc3Vic2NyaWJlKChpdGVtcykgPT4gKHRoaXMuaXRlbXNGb3JQaW4gPSBpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uaWQpKSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnN0b3JlLnNlbGVjdChGaWVsZFNlbGVjdG9ycy5maWVsZHMpLnN1YnNjcmliZSgoZmllbGRzKSA9PiAodGhpcy5maWVsZHMgPSBmaWVsZHMpKSk7XG5cbiAgICB0aGlzLmRldGFpbGxlZFdpZGdldE1hbmlmZXN0JCA9IHRoaXMuaXRlbXNUb0Rpc3BsYXkkLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChpdGVtcykgPT5cbiAgICAgICAgICAoe1xuICAgICAgICAgICAgLi4udGhpcy5tYW5pZmVzdCxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnQHByeS53aWRnZXQuZGV0YWlsLnRpdGxlJywgeyBpdGVtc05iOiBpdGVtcy5sZW5ndGggfSlcbiAgICAgICAgICB9KSBhcyBXaWRnZXRNYW5pZmVzdFxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLmFkZGl0aW9uYWxPcHRpb25zJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucGlubmVkJCwgdGhpcy5pdGVtc1RvRGlzcGxheSRdKS5waXBlKFxuICAgICAgbWFwKChbaXNQaW5uZWQsIGl0ZW1zXSkgPT4gW1xuICAgICAgICB7XG4gICAgICAgICAgbGFiZWw6IGlzUGlubmVkID8gJ0Bwcnkud2lkZ2V0LmRldGFpbC51bnBpbicgOiAnQHByeS53aWRnZXQuZGV0YWlsLnBpbicsXG4gICAgICAgICAgYWN0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZVBpbigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaWNvbjogaXNQaW5uZWQgPyAndW5wdWJsaXNoZWQnIDogJ3B1Ymxpc2hlZF93aXRoX2NoYW5nZXMnLFxuICAgICAgICAgIGRpc2FibGVkOiAoKSA9PiBpdGVtcy5sZW5ndGggPT09IDBcbiAgICAgICAgfVxuICAgICAgXSlcbiAgICApO1xuICB9XG5cbiAgdG9nZ2xlKGl0ZW1JbmRleDogbnVtYmVyLCBjYXRlZ29yeUluZGV4PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0pIHtcbiAgICAgIHRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XSA9IHsgaXRlbTogZmFsc2UsIGNhdGVnb3JpZXM6IFtdIH07XG4gICAgfVxuICAgIGlmIChjYXRlZ29yeUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtID0gIXRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XSA9ICF0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XTtcbiAgICB9XG4gIH1cblxuICBnZXRWYWx1ZShpdGVtOiBJdGVtLCBwcm9wZXJ0eTogQXR0cmlidXRlKTogQXR0cmlidXRlU2ltcGxlVmFsdWVbXSB7XG4gICAgY29uc3QgdmFsdWUgPSBJdGVtVXRpbHMuZ2V0QXR0cmlidXRlVmFsdWUoaXRlbSwgcHJvcGVydHkpO1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTtcbiAgfVxuXG4gIHRvZ2dsZVBpbigpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9uc0NvcHkpIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkgPSB7fTtcbiAgICB9XG4gICAgaWYgKCEhdGhpcy5vcHRpb25zQ29weS5pdGVtSWRzICYmIHRoaXMub3B0aW9uc0NvcHkuaXRlbUlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBkZWxldGUgdGhpcy5vcHRpb25zQ29weS5pdGVtSWRzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHMgPSB0aGlzLml0ZW1zRm9yUGluO1xuICAgIH1cblxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICBEYXNoYm9hcmRBY3Rpb25zLnVwZGF0ZVdpZGdldE1hbmlmZXN0KHtcbiAgICAgICAgbWFuaWZlc3Q6IHsgLi4udGhpcy5tYW5pZmVzdCwgb3B0aW9uczogdGhpcy5vcHRpb25zQ29weSB9LFxuICAgICAgICBpbmRleDogdGhpcy53aWRnZXRJbmRleFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaGFzTWV0YWRhdGEodmFsdWU6IEF0dHJpYnV0ZVNpbXBsZVZhbHVlIHwgSXRlbSkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh2YWx1ZT8ubWV0YWRhdGEgPz8ge30pLmxlbmd0aCA+IDA7XG4gIH1cblxuICBjb250ZXh0TWVudSgkZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IEl0ZW0pIHtcbiAgICBpZiAodGhpcy5tYW5pZmVzdC5jb250ZXh0TWVudSAhPT0gZmFsc2UpIHtcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgQ29udGV4dE1lbnVBY3Rpb25zLm9wZW4oeyBpdGVtSWQ6IGl0ZW0uaWQsIGNsaWVudFg6ICRldmVudC5jbGllbnRYLCBjbGllbnRZOiAkZXZlbnQuY2xpZW50WSwgZnJvbTogJ2RldGFpbCcsYWxsb3dPYmplY3RDcmVhdGlvbjogZmFsc2UgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaXNSYXcoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlLmZpZWxkPy50eXBlID09PSBGaWVsZFR5cGUuUkFXO1xuICB9XG59XG4iLCI8cHJ5LXdpZGdldC1kZXRhaWwtY3NzPjwvcHJ5LXdpZGdldC1kZXRhaWwtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1kZXRhaWxcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgKm5nSWY9XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgIFttYW5pZmVzdF09XCJkZXRhaWxsZWRXaWRnZXRNYW5pZmVzdCQgfCBhc3luY1wiXG4gICAgW2FkZGl0aW9uYWxPcHRpb25zXT1cImFkZGl0aW9uYWxPcHRpb25zJCB8IGFzeW5jXCJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgIFtkaXNwbGF5Q291bnRdPVwiZmFsc2VcIlxuICA+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPHAgY2xhc3M9XCJpcy1lbXB0eVwiICpuZ0lmPVwiIShpdGVtQW5kQ2F0ZWdvcmllcyQgfCBhc3luYykgfHwgKGl0ZW1BbmRDYXRlZ29yaWVzJCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwXCI+XG4gICAge3sgJ0Bwcnkud2lkZ2V0LmRldGFpbC5ub0l0ZW1zJyB8IGkxOG4gfX1cbiAgPC9wPlxuXG4gIDxkaXYgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19jb250ZW50XCIgKm5nRm9yPVwibGV0IGNvdXBsZSBvZiBpdGVtQW5kQ2F0ZWdvcmllcyQgfCBhc3luYzsgbGV0IGl0ZW1JbmRleCA9IGluZGV4XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoKG9wdGlvbnMkIHwgYXN5bmMpPy5oZWFkZXIgPT09IGZhbHNlKVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm8td2lkZ2V0LS1kZXRhaWxfX2hlYWRlclwiXG4gICAgICAgIChjb250ZXh0bWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQsIGNvdXBsZS5pdGVtKVwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0Bwcnkud2lkZ2V0Lml0ZW1JZCcgfCBpMThuIH19OiB7eyBjb3VwbGUuaXRlbS5pZCB9fVwiXG4gICAgICA+XG4gICAgICAgIDxpbWcgW2hlaWdodF09XCIyNVwiIFt3aWR0aF09XCIyNVwiIFtzcmNdPVwiY291cGxlLml0ZW0gfCB0cmFuc2xhdGVJdGVtVG9TeW1ib2wgfCBhc3luY1wiIFthbHRdPVwiY291cGxlXCIgLz5cbiAgICAgICAgPGgzIGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9faGVhZGVyX190aXRsZVwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5jbGFzcycgfCBpMThuIH19OlxuICAgICAgICAgIHt7XG4gICAgICAgICAgICBjb3VwbGUuaXRlbS5vQ2xhc3NcbiAgICAgICAgICAgICAgfCB0cmFuc2xhdGVJZFxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xhc3MnLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICduYW1lJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgfX1cbiAgICAgICAgPC9oMz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhKCEhcGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW0pXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidpdGVtLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShpdGVtSW5kZXgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiAqbmdJZj1cIiEhcGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW1cIiBpY29uU3ZnPVwiZmxlY2hlX2hhdXRcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxwcnktaWNvbiAqbmdJZj1cIiEoISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbSlcIiBpY29uU3ZnPVwiZmxlY2hlX2Jhc1wiPjwvcHJ5LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fZGF0YXNcIiAqbmdJZj1cImhhc01ldGFkYXRhKGNvdXBsZS5pdGVtKVwiPlxuICAgICAgICA8cHJ5LW1ldGFkYXRhIFtpdGVtXT1cImNvdXBsZS5pdGVtXCI+PC9wcnktbWV0YWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbVwiXG4gICAgICAoY29udGV4dG1lbnUpPVwiY29udGV4dE1lbnUoJGV2ZW50LCBjb3VwbGUuaXRlbSlcIlxuICAgICAgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19kYXRhc1wiXG4gICAgICBbaWRdPVwiJ2l0ZW0tJyArIHdpZGdldElkICsgJy0nICsgaXRlbUluZGV4XCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBjb3VwbGUuY2F0ZWdvcmllczsgbGV0IGNhdGVnb3J5SW5kZXggPSBpbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8cD57eyAnQHByeS53aWRnZXQuZGV0YWlsLmNhdGVnb3J5JyB8IGkxOG4gfX06IHt7IGNhdGVnb3J5Lm5hbWUgfX08L3A+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhKHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidwcm9wZXJ0aWVzLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleCArICctJyArIGNhdGVnb3J5SW5kZXhcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShpdGVtSW5kZXgsIGNhdGVnb3J5SW5kZXgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XVwiXG4gICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ByeS1pY29uPlxuICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XSlcIlxuICAgICAgICAgICAgICBpY29uU3ZnPVwiZmxlY2hlX2Jhc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ByeS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJvLXByb3BlcnRpZXNcIlxuICAgICAgICAgIFtpZF09XCIncHJvcGVydGllcy0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXggKyAnLScgKyBjYXRlZ29yeUluZGV4XCJcbiAgICAgICAgICAqbmdJZj1cInBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx1bCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgY2F0ZWdvcnkucHJvcGVydGllc1wiPlxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIGdldFZhbHVlKGNvdXBsZS5pdGVtLCBwcm9wZXJ0eS5hdHRyaWJ1dGUpOyBsZXQgaSA9IGluZGV4OyBsZXQgYyA9IGNvdW50XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdF9faXRlbV9fbGFiZWxcIiAqbmdJZj1cImkgPT09IDBcIj57eyBwcm9wZXJ0eS5uYW1lIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtX192YWx1ZVwiICpuZ0lmPVwiIWlzUmF3KHByb3BlcnR5LmF0dHJpYnV0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdmFsdWU/LnZhbHVlIHwgZGF0YUZvcm1hdDogcHJvcGVydHkuYXR0cmlidXRlLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdF9faXRlbV9fcmF3XCIgKm5nSWY9XCJpc1Jhdyhwcm9wZXJ0eS5hdHRyaWJ1dGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktdml6dWFsaXplLXJhdyBbaXRlbV09XCJjb3VwbGUuaXRlbVwiIFtwcm9wZXJ0eU5hbWVdPVwicHJvcGVydHkubmFtZVwiPjwvcHJ5LXZpenVhbGl6ZS1yYXc+XG4gICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzTWV0YWRhdGEodmFsdWUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwcnktbWV0YWRhdGEgW2l0ZW1dPVwidmFsdWVcIj48L3ByeS1tZXRhZGF0YT5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1kZXRhaWwvY29tcG9uZW50L3dpZGdldC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtZGV0YWlsL2NvbXBvbmVudC93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBR2xCLGNBQWMsRUFDZCxTQUFTLEVBR1QsU0FBUyxFQUdWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBTTFDLE1BQU0sT0FBTyxxQkFBc0IsU0FBUSxtQkFBbUI7YUFjckQsc0JBQWlCLEdBQUcsQ0FBQyxBQUFKLENBQUs7SUFFN0IsWUFDRSxLQUFpQixFQUNULGdCQUFnQyxFQUN4QyxFQUFjO1FBRWQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUhULHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBZ0I7UUFmMUMsZ0JBQVcsR0FBK0MsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBTy9GLFdBQU0sR0FBWSxFQUFFLENBQUM7UUFZbkIsSUFB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LGdCQUFnQixDQUFDLG9CQUFvQixDQUFDO1lBQ3BDLFFBQVEsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN6RCxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDeEIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVyxDQUFDLEtBQWtDO1FBQzVDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFrQixFQUFFLElBQVU7UUFDeEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN4QyxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQ2pCLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUNmLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDdkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxtQkFBbUIsRUFBRSxLQUFLO2FBQzNCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsU0FBb0I7UUFDeEIsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDO0lBQ2pELENBQUM7OEdBN0tVLHFCQUFxQjtrR0FBckIscUJBQXFCLGdGQzVCbEMscTBLQW9JQTs7MkZEeEdhLHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSxcbiAgQmFzZVdpZGdldENvbXBvbmVudCxcbiAgQ2F0ZWdvcnlTZWxlY3RvcnMsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb250ZXh0TWVudUFjdGlvbnMsXG4gIERhc2hib2FyZEFjdGlvbnMsXG4gIERhc2hib2FyZFNlbGVjdG9ycyxcbiAgRGV0YWlsV2lkZ2V0T3B0aW9ucyxcbiAgRmllbGQsXG4gIEZpZWxkU2VsZWN0b3JzLFxuICBGaWVsZFR5cGUsXG4gIEhlYWRlckFjdGlvbixcbiAgSXRlbSxcbiAgSXRlbVV0aWxzLFxuICBQcnlJMThuU2VydmljZSxcbiAgV2lkZ2V0TWFuaWZlc3Rcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXREZXRhaWxDb21wb25lbnQgZXh0ZW5kcyBCYXNlV2lkZ2V0Q29tcG9uZW50IHtcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8RGV0YWlsV2lkZ2V0T3B0aW9ucz47XG4gIGl0ZW1zVG9EaXNwbGF5JDogT2JzZXJ2YWJsZTxJdGVtW10+O1xuICBwYW5lbE9wZW5lZDogeyBpdGVtOiBib29sZWFuOyBjYXRlZ29yaWVzOiBib29sZWFuW10gfVtdID0gW3sgaXRlbTogdHJ1ZSwgY2F0ZWdvcmllczogW3RydWVdIH1dO1xuICBpdGVtQW5kQ2F0ZWdvcmllcyQ6IE9ic2VydmFibGU8XG4gICAgeyBpdGVtOiBJdGVtOyBjYXRlZ29yaWVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcHJvcGVydGllczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZTogQXR0cmlidXRlIH1bXSB9W10gfVtdXG4gID47XG4gIHBpbm5lZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG9wdGlvbnNDb3B5PzogRGV0YWlsV2lkZ2V0T3B0aW9ucztcbiAgaXRlbXNGb3JQaW4/OiBzdHJpbmdbXTtcbiAgZmllbGRzOiBGaWVsZFtdID0gW107XG4gIGRldGFpbGxlZFdpZGdldE1hbmlmZXN0JDogT2JzZXJ2YWJsZTxXaWRnZXRNYW5pZmVzdD47XG4gIGFkZGl0aW9uYWxPcHRpb25zJDogT2JzZXJ2YWJsZTxIZWFkZXJBY3Rpb25bXT47XG4gIHdpZGdldElkOiBudW1iZXI7XG4gIHN0YXRpYyB3aWRnZXRJZEdlbmVyYXRvciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcihzdG9yZSwgZWwpO1xuICAgIHRoaXMud2lkZ2V0SWQgPSBXaWRnZXREZXRhaWxDb21wb25lbnQud2lkZ2V0SWRHZW5lcmF0b3IrKztcbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgRGV0YWlsV2lkZ2V0T3B0aW9ucykpO1xuICAgIHRoaXMucGlubmVkJCA9IHRoaXMub3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+ICEhb3B0aW9ucy5pdGVtSWRzICYmIG9wdGlvbnMuaXRlbUlkcy5sZW5ndGggPiAwKSk7XG4gICAgdGhpcy5pdGVtc1RvRGlzcGxheSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5zZWxlY3RlZEl0ZW1zKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5hbGxJdGVtcyksXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLm9iamVjdERldGFpbHMpXG4gICAgXSkucGlwZShcbiAgICAgIHRhcCgoW18sIGFsbEl0ZW1zLCBvcHRpb25zLCBvYmplY3REZXRhaWxzXSkgPT4ge1xuICAgICAgICAvLyBnbyBzZWFyY2ggZm9yIGRldGFpbCBpdGVtIGlmIG5vdCBhbHJlYWR5IGZvdW5kIGluIGFsbEl0ZW1zIExpc3RcbiAgICAgICAgaWYgKG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IG9wdGlvbnMuaXRlbUlkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+ICghYWxsSXRlbXMuZmluZCgoaXQpID0+IGl0LmlkID09PSBpZCkgPyBpZCA6IChudWxsIGFzIHVua25vd24gYXMgc3RyaW5nKSkpXG4gICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gISFpdClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiAhT2JqZWN0LmtleXMob2JqZWN0RGV0YWlscykuaW5jbHVkZXMoaXQpKTtcblxuICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmZldGNoT2JqZWN0c0RldGFpbHMoeyBpZHM6IG1pc3NpbmdJdGVtcyB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoW2dsb2JhbFNlbGVjdGlvbkl0ZW1zLCBhbGxJdGVtcywgb3B0aW9ucywgb2JqZWN0RGV0YWlsc10pID0+XG4gICAgICAgIG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gb3B0aW9ucy5pdGVtSWRzLm1hcCgoaWQpID0+IGFsbEl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gaWQpID8/IG9iamVjdERldGFpbHNbaWRdKVxuICAgICAgICAgIDogZ2xvYmFsU2VsZWN0aW9uSXRlbXNcbiAgICAgICksXG4gICAgICBtYXAoKGl0ZW1zKSA9PiBpdGVtcy5maWx0ZXIoKGl0KSA9PiAhIWl0KSBhcyBJdGVtW10pXG4gICAgKTtcblxuICAgIHRoaXMuaXRlbUFuZENhdGVnb3JpZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLml0ZW1zVG9EaXNwbGF5JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ2F0ZWdvcnlTZWxlY3RvcnMuY2F0ZWdvcmllcylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbaXRlbXMsIGNsYXNzZXMsIGNhdGVnb3JpZXNdKSA9PlxuICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBvYmplY3RDbGFzcyA9IGNsYXNzZXMuZmluZCgob0NsYXNzKSA9PiBvQ2xhc3MuaWQgPT09IGl0ZW0ub0NsYXNzKSA/PyB7IGF0dHJpYnV0ZXM6IFtdIH07XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllc1dpdGhQcm9wcyA9IFtdIGFzIHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7IG5hbWU6IHN0cmluZzsgYXR0cmlidXRlOiBBdHRyaWJ1dGUgfVtdO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgICBvYmplY3RDbGFzcy5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBhdHRyLmNhdGVnb3J5ID8/IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQubmFtZSA9PT0gJ2RlZmF1bHQnKT8uaWQgPz8gJ2RlZmF1bHQtaWQnO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzV2l0aFByb3BzLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKSkge1xuICAgICAgICAgICAgICBjYXRlZ29yaWVzV2l0aFByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBjYXRlZ29yeUlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQuaWQgPT09IGNhdGVnb3J5SWQpPy5uYW1lID8/ICdkZWZhdWx0J1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGVnb3JpZXNXaXRoUHJvcHNcbiAgICAgICAgICAgICAgLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKVxuICAgICAgICAgICAgICA/LnByb3BlcnRpZXMucHVzaCh7IG5hbWU6IGF0dHIubmFtZSwgYXR0cmlidXRlOiBhdHRyIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1dpdGhQcm9wc1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5vcHRpb25zJC5zdWJzY3JpYmUoKG9wdGlvbnMpID0+ICh0aGlzLm9wdGlvbnNDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wdGlvbnMpKSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMuaXRlbXNUb0Rpc3BsYXkkLnN1YnNjcmliZSgoaXRlbXMpID0+ICh0aGlzLml0ZW1zRm9yUGluID0gaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLmlkKSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5zdG9yZS5zZWxlY3QoRmllbGRTZWxlY3RvcnMuZmllbGRzKS5zdWJzY3JpYmUoKGZpZWxkcykgPT4gKHRoaXMuZmllbGRzID0gZmllbGRzKSkpO1xuXG4gICAgdGhpcy5kZXRhaWxsZWRXaWRnZXRNYW5pZmVzdCQgPSB0aGlzLml0ZW1zVG9EaXNwbGF5JC5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoaXRlbXMpID0+XG4gICAgICAgICAgKHtcbiAgICAgICAgICAgIC4uLnRoaXMubWFuaWZlc3QsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ0Bwcnkud2lkZ2V0LmRldGFpbC50aXRsZScsIHsgaXRlbXNOYjogaXRlbXMubGVuZ3RoIH0pXG4gICAgICAgICAgfSkgYXMgV2lkZ2V0TWFuaWZlc3RcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5hZGRpdGlvbmFsT3B0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnBpbm5lZCQsIHRoaXMuaXRlbXNUb0Rpc3BsYXkkXSkucGlwZShcbiAgICAgIG1hcCgoW2lzUGlubmVkLCBpdGVtc10pID0+IFtcbiAgICAgICAge1xuICAgICAgICAgIGxhYmVsOiBpc1Bpbm5lZCA/ICdAcHJ5LndpZGdldC5kZXRhaWwudW5waW4nIDogJ0Bwcnkud2lkZ2V0LmRldGFpbC5waW4nLFxuICAgICAgICAgIGFjdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVQaW4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGljb246IGlzUGlubmVkID8gJ3VucHVibGlzaGVkJyA6ICdwdWJsaXNoZWRfd2l0aF9jaGFuZ2VzJyxcbiAgICAgICAgICBkaXNhYmxlZDogKCkgPT4gaXRlbXMubGVuZ3RoID09PSAwXG4gICAgICAgIH1cbiAgICAgIF0pXG4gICAgKTtcbiAgfVxuXG4gIHRvZ2dsZShpdGVtSW5kZXg6IG51bWJlciwgY2F0ZWdvcnlJbmRleD86IG51bWJlcikge1xuICAgIGlmICghdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdKSB7XG4gICAgICB0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gPSB7IGl0ZW06IGZhbHNlLCBjYXRlZ29yaWVzOiBbXSB9O1xuICAgIH1cbiAgICBpZiAoY2F0ZWdvcnlJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbSA9ICF0aGlzLnBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF0gPSAhdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF07XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWUoaXRlbTogSXRlbSwgcHJvcGVydHk6IEF0dHJpYnV0ZSk6IEF0dHJpYnV0ZVNpbXBsZVZhbHVlW10ge1xuICAgIGNvbnN0IHZhbHVlID0gSXRlbVV0aWxzLmdldEF0dHJpYnV0ZVZhbHVlKGl0ZW0sIHByb3BlcnR5KTtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV07XG4gIH1cblxuICB0b2dnbGVQaW4oKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnNDb3B5KSB7XG4gICAgICB0aGlzLm9wdGlvbnNDb3B5ID0ge307XG4gICAgfVxuICAgIGlmICghIXRoaXMub3B0aW9uc0NvcHkuaXRlbUlkcyAmJiB0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHMubGVuZ3RoID4gMCkge1xuICAgICAgZGVsZXRlIHRoaXMub3B0aW9uc0NvcHkuaXRlbUlkcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcHRpb25zQ29weS5pdGVtSWRzID0gdGhpcy5pdGVtc0ZvclBpbjtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgRGFzaGJvYXJkQWN0aW9ucy51cGRhdGVXaWRnZXRNYW5pZmVzdCh7XG4gICAgICAgIG1hbmlmZXN0OiB7IC4uLnRoaXMubWFuaWZlc3QsIG9wdGlvbnM6IHRoaXMub3B0aW9uc0NvcHkgfSxcbiAgICAgICAgaW5kZXg6IHRoaXMud2lkZ2V0SW5kZXhcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGhhc01ldGFkYXRhKHZhbHVlOiBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSB8IEl0ZW0pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModmFsdWU/Lm1ldGFkYXRhID8/IHt9KS5sZW5ndGggPiAwO1xuICB9XG5cbiAgY29udGV4dE1lbnUoJGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBJdGVtKSB7XG4gICAgaWYgKHRoaXMubWFuaWZlc3QuY29udGV4dE1lbnUgIT09IGZhbHNlKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goXG4gICAgICAgIENvbnRleHRNZW51QWN0aW9ucy5vcGVuKHtcbiAgICAgICAgICBpdGVtSWQ6IGl0ZW0uaWQsXG4gICAgICAgICAgY2xpZW50WDogJGV2ZW50LmNsaWVudFgsXG4gICAgICAgICAgY2xpZW50WTogJGV2ZW50LmNsaWVudFksXG4gICAgICAgICAgZnJvbTogJ2RldGFpbCcsXG4gICAgICAgICAgYWxsb3dPYmplY3RDcmVhdGlvbjogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaXNSYXcoYXR0cmlidXRlOiBBdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXR0cmlidXRlLmZpZWxkPy50eXBlID09PSBGaWVsZFR5cGUuUkFXO1xuICB9XG59XG4iLCI8cHJ5LXdpZGdldC1kZXRhaWwtY3NzPjwvcHJ5LXdpZGdldC1kZXRhaWwtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1kZXRhaWxcIj5cbiAgQGlmIChkaXNwbGF5SGVhZGVyJCB8IGFzeW5jKSB7XG4gICAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgICAgW21hbmlmZXN0XT1cImRldGFpbGxlZFdpZGdldE1hbmlmZXN0JCB8IGFzeW5jXCJcbiAgICAgIFthZGRpdGlvbmFsT3B0aW9uc109XCJhZGRpdGlvbmFsT3B0aW9ucyQgfCBhc3luY1wiXG4gICAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgICAgW2Rpc3BsYXlDb3VudF09XCJmYWxzZVwiXG4gICAgICA+XG4gICAgPC9wcnktd2lkZ2V0LWhlYWRlcj5cbiAgfVxuXG4gIEBpZiAoIShpdGVtQW5kQ2F0ZWdvcmllcyQgfCBhc3luYykgfHwgKGl0ZW1BbmRDYXRlZ29yaWVzJCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwKSB7XG4gICAgPHAgY2xhc3M9XCJpcy1lbXB0eVwiPlxuICAgICAge3sgJ0Bwcnkud2lkZ2V0LmRldGFpbC5ub0l0ZW1zJyB8IGkxOG4gfX1cbiAgICA8L3A+XG4gIH1cblxuICBAZm9yIChjb3VwbGUgb2YgaXRlbUFuZENhdGVnb3JpZXMkIHwgYXN5bmM7IHRyYWNrIGNvdXBsZTsgbGV0IGl0ZW1JbmRleCA9ICRpbmRleCkge1xuICAgIDxkaXYgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19jb250ZW50XCI+XG4gICAgICBAaWYgKCEoKG9wdGlvbnMkIHwgYXN5bmMpPy5oZWFkZXIgPT09IGZhbHNlKSkge1xuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19oZWFkZXJcIlxuICAgICAgICAgIChjb250ZXh0bWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQsIGNvdXBsZS5pdGVtKVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQHByeS53aWRnZXQuaXRlbUlkJyB8IGkxOG4gfX06IHt7IGNvdXBsZS5pdGVtLmlkIH19XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPGltZyBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgW3NyY109XCJjb3VwbGUuaXRlbSB8IHRyYW5zbGF0ZUl0ZW1Ub1N5bWJvbCB8IGFzeW5jXCIgW2FsdF09XCJjb3VwbGVcIiAvPlxuICAgICAgICAgIDxoMyBjbGFzcz1cIm8td2lkZ2V0LS1kZXRhaWxfX2hlYWRlcl9fdGl0bGVcIj5cbiAgICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5jbGFzcycgfCBpMThuIH19OlxuICAgICAgICAgICAge3tcbiAgICAgICAgICAgIGNvdXBsZS5pdGVtLm9DbGFzc1xuICAgICAgICAgICAgfCB0cmFuc2xhdGVJZFxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xhc3MnLFxuICAgICAgICAgICAgb3V0cHV0OiAnbmFtZSdcbiAgICAgICAgICB9XG4gICAgICAgICAgfCBhc3luY1xuICAgICAgICAgIH19XG4gICAgICAgIDwvaDM+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiISghIXBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCInaXRlbS0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXhcIlxuICAgICAgICAgIChjbGljayk9XCJ0b2dnbGUoaXRlbUluZGV4KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIEBpZiAoISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbSkge1xuICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBpZiAoISghIXBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtKSkge1xuICAgICAgICAgICAgPHByeS1pY29uIGljb25Tdmc9XCJmbGVjaGVfYmFzXCI+PC9wcnktaWNvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKGhhc01ldGFkYXRhKGNvdXBsZS5pdGVtKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fZGF0YXNcIj5cbiAgICAgICAgICA8cHJ5LW1ldGFkYXRhIFtpdGVtXT1cImNvdXBsZS5pdGVtXCI+PC9wcnktbWV0YWRhdGE+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIH1cbiAgICBAaWYgKCEhcGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW0pIHtcbiAgICAgIDxkaXZcbiAgICAgICAgKGNvbnRleHRtZW51KT1cImNvbnRleHRNZW51KCRldmVudCwgY291cGxlLml0ZW0pXCJcbiAgICAgICAgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19kYXRhc1wiXG4gICAgICAgIFtpZF09XCInaXRlbS0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGNvdXBsZS5jYXRlZ29yaWVzOyB0cmFjayBjYXRlZ29yeTsgbGV0IGNhdGVnb3J5SW5kZXggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fY2F0ZWdvcnlcIj5cbiAgICAgICAgICAgIDxwPnt7ICdAcHJ5LndpZGdldC5kZXRhaWwuY2F0ZWdvcnknIHwgaTE4biB9fToge3sgY2F0ZWdvcnkubmFtZSB9fTwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiIShwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidwcm9wZXJ0aWVzLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleCArICctJyArIGNhdGVnb3J5SW5kZXhcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGl0ZW1JbmRleCwgY2F0ZWdvcnlJbmRleClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEBpZiAocGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF0pIHtcbiAgICAgICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKCEocGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICAgICBpY29uU3ZnPVwiZmxlY2hlX2Jhc1wiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9wcnktaWNvbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgQGlmIChwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cIm8tcHJvcGVydGllc1wiXG4gICAgICAgICAgICAgIFtpZF09XCIncHJvcGVydGllcy0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXggKyAnLScgKyBjYXRlZ29yeUluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJvLXByb3BlcnRpZXNfX2xpc3RcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgQGZvciAocHJvcGVydHkgb2YgY2F0ZWdvcnkucHJvcGVydGllczsgdHJhY2sgcHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgQGZvciAodmFsdWUgb2YgZ2V0VmFsdWUoY291cGxlLml0ZW0sIHByb3BlcnR5LmF0dHJpYnV0ZSk7IHRyYWNrIHZhbHVlOyBsZXQgaSA9ICRpbmRleDsgbGV0IGMgPSAkY291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdF9faXRlbV9fbGFiZWxcIj57eyBwcm9wZXJ0eS5uYW1lIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoIWlzUmF3KHByb3BlcnR5LmF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJvLXByb3BlcnRpZXNfX2xpc3RfX2l0ZW1fX3ZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgdmFsdWU/LnZhbHVlIHwgZGF0YUZvcm1hdDogcHJvcGVydHkuYXR0cmlidXRlLmZpZWxkIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXNSYXcocHJvcGVydHkuYXR0cmlidXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdF9faXRlbV9fcmF3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS12aXp1YWxpemUtcmF3IFtpdGVtXT1cImNvdXBsZS5pdGVtXCIgW3Byb3BlcnR5TmFtZV09XCJwcm9wZXJ0eS5uYW1lXCI+PC9wcnktdml6dWFsaXplLXJhdz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChoYXNNZXRhZGF0YSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHByeS1tZXRhZGF0YSBbaXRlbV09XCJ2YWx1ZVwiPjwvcHJ5LW1ldGFkYXRhPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbn1cbjwvZGl2PlxuIl19