@provoly/dashboard 1.3.8 → 1.3.9

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 (200) hide show
  1. package/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.d.ts +5 -2
  2. package/admin/components/admin-fields/admin-fields-form/admin-fields-form.component.d.ts +47 -18
  3. package/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.d.ts +6 -2
  4. package/admin/components/admin-fields/admin-fields.component.d.ts +4 -1
  5. package/admin/components/admin-fields/store/admin-fields.model.d.ts +1 -1
  6. package/admin/components/admin-fields/store/fields.actions.d.ts +19 -12
  7. package/admin/components/admin-fields/store/fields.effects.d.ts +16 -3
  8. package/admin/i18n/en.translations.d.ts +33 -14
  9. package/admin/i18n/fr.translations.d.ts +33 -14
  10. package/components/checkbox/checkbox.component.d.ts +4 -2
  11. package/components/data-format/data-format.pipe.d.ts +11 -1
  12. package/components/paginator/index.d.ts +5 -0
  13. package/components/paginator/paginator.component.d.ts +19 -0
  14. package/components/paginator/paginator.module.d.ts +10 -0
  15. package/components/paginator/public-api.d.ts +3 -0
  16. package/components/paginator/style/_o-pry-paginator.scss +11 -0
  17. package/components/paginator/style/css.component.d.ts +5 -0
  18. package/dataset/components/dataset-detail/dataset-detail.component.d.ts +5 -8
  19. package/dataset/dataset.module.d.ts +1 -1
  20. package/dataset/i18n/en.translations.d.ts +0 -12
  21. package/dataset/i18n/fr.translations.d.ts +0 -12
  22. package/esm2022/admin/components/admin-abac-rules/components/attribute-condition/attribute-condition.component.mjs +4 -6
  23. package/esm2022/admin/components/admin-classes/admin-classes-customize/symbol/admin-classes-customize-symbol.component.mjs +1 -1
  24. package/esm2022/admin/components/admin-classes/admin-classes-customize/tooltip/admin-classes-customize-tooltip.component.mjs +1 -1
  25. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-attributes-form/admin-attributes-form.component.mjs +10 -12
  26. package/esm2022/admin/components/admin-classes/admin-classes-view/admin-classes-view.component.mjs +6 -5
  27. package/esm2022/admin/components/admin-dataset/admin-select-dataset/admin-select-dataset.component.mjs +2 -2
  28. package/esm2022/admin/components/admin-fields/admin-fields-form/admin-fields-form.component.mjs +142 -63
  29. package/esm2022/admin/components/admin-fields/admin-fields-select/admin-fields-select.component.mjs +7 -8
  30. package/esm2022/admin/components/admin-fields/admin-fields.component.mjs +15 -11
  31. package/esm2022/admin/components/admin-fields/store/admin-fields.model.mjs +1 -1
  32. package/esm2022/admin/components/admin-fields/store/fields.actions.mjs +6 -5
  33. package/esm2022/admin/components/admin-fields/store/fields.effects.mjs +12 -6
  34. package/esm2022/admin/i18n/en.translations.mjs +34 -15
  35. package/esm2022/admin/i18n/fr.translations.mjs +34 -15
  36. package/esm2022/components/checkbox/checkbox.component.mjs +15 -7
  37. package/esm2022/components/data-format/data-format.pipe.mjs +88 -7
  38. package/esm2022/components/paginator/paginator.component.mjs +51 -0
  39. package/esm2022/components/paginator/paginator.module.mjs +20 -0
  40. package/esm2022/components/paginator/provoly-dashboard-components-paginator.mjs +5 -0
  41. package/esm2022/components/paginator/public-api.mjs +4 -0
  42. package/esm2022/components/paginator/style/css.component.mjs +11 -0
  43. package/esm2022/dataset/components/dataset-detail/dataset-detail.component.mjs +16 -26
  44. package/esm2022/dataset/dataset.module.mjs +2 -5
  45. package/esm2022/dataset/i18n/en.translations.mjs +1 -13
  46. package/esm2022/dataset/i18n/fr.translations.mjs +2 -14
  47. package/esm2022/import/components/form/import-form.component.mjs +174 -0
  48. package/esm2022/import/components/list/import-list.component.mjs +73 -0
  49. package/esm2022/import/components/version-modal/version-modal.component.mjs +26 -0
  50. package/esm2022/import/i18n/en.translations.mjs +16 -2
  51. package/esm2022/import/i18n/fr.translations.mjs +16 -2
  52. package/esm2022/import/import-routing.module.mjs +3 -3
  53. package/esm2022/import/import.module.mjs +25 -10
  54. package/esm2022/import/public-api.mjs +4 -2
  55. package/esm2022/import/style/css.component.mjs +2 -2
  56. package/esm2022/lib/core/components/select/select.component.mjs +3 -3
  57. package/esm2022/lib/core/components/share/legacy-share/share.component.mjs +8 -8
  58. package/esm2022/lib/core/components/status-modal/status-modal.component.mjs +48 -0
  59. package/esm2022/lib/core/components/{modal-status/modal-status.module.mjs → status-modal/status-modal.module.mjs} +9 -9
  60. package/esm2022/lib/core/core.module.mjs +5 -5
  61. package/esm2022/lib/core/i18n/en.translations.mjs +35 -2
  62. package/esm2022/lib/core/i18n/fr.translations.mjs +37 -2
  63. package/esm2022/lib/core/model/admin-api.model.mjs +5 -69
  64. package/esm2022/lib/core/model/widget-analytic-manifest.interface.mjs +1 -1
  65. package/esm2022/lib/core/model/widget-table-manifest.interface.mjs +1 -1
  66. package/esm2022/lib/core/public-api.mjs +3 -3
  67. package/esm2022/lib/core/store/class/class.interface.mjs +1 -1
  68. package/esm2022/lib/core/store/class/class.selectors.mjs +2 -2
  69. package/esm2022/lib/core/store/data-source/data-source.actions.mjs +3 -3
  70. package/esm2022/lib/core/store/data-source/data-source.effects.mjs +7 -4
  71. package/esm2022/lib/core/store/data-source/data-source.model.mjs +1 -1
  72. package/esm2022/lib/core/store/data-source/data-source.reducer.mjs +5 -3
  73. package/esm2022/lib/core/store/data-source/data-source.selectors.mjs +3 -11
  74. package/esm2022/lib/core/store/data-source/data-source.service.mjs +23 -5
  75. package/esm2022/lib/core/store/field/field.interface.mjs +1 -3
  76. package/esm2022/lib/core/store/field/field.service.mjs +7 -2
  77. package/esm2022/lib/dashboard/components/context-menu/object-edition/object-edition.component.mjs +3 -3
  78. package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-card/datasource-card.component.mjs +3 -11
  79. package/esm2022/lib/dashboard/components/widgets/datasource-selector/datasource-list/datasource-list.component.mjs +2 -2
  80. package/esm2022/lib/dashboard/item-utils.mjs +5 -5
  81. package/esm2022/lib/dashboard/store/dashboard.actions.mjs +1 -4
  82. package/esm2022/lib/dashboard/store/dashboard.effects.mjs +1 -19
  83. package/esm2022/lib/dashboard/store/dashboard.reducers.mjs +1 -26
  84. package/esm2022/lib/dashboard/tooltip/components/default/default.tooltip.component.mjs +3 -3
  85. package/esm2022/lib/dashboard/tooltip/tooltip-factory.service.mjs +3 -2
  86. package/esm2022/search/search-mono-class/components/search-condition/search-condition.component.mjs +4 -4
  87. package/esm2022/search/search-mono-class/components/search-order/search-order.component.mjs +3 -3
  88. package/esm2022/search/search-mono-class/components/search-select-attribute/search-select-attribute.component.mjs +4 -5
  89. package/esm2022/search/search-mono-class/store/search-mono-class.effects.mjs +2 -2
  90. package/esm2022/search/search-mono-class/store/search-mono-class.service.mjs +5 -6
  91. package/esm2022/search/search-multi-class/store/search-multi-class.service.mjs +4 -4
  92. package/esm2022/toolbox/components/filter-settings/filter-settings.component.mjs +3 -3
  93. package/esm2022/tooltips/attribute/attribute-tooltip.component.mjs +17 -19
  94. package/esm2022/tooltips/attribute/attribute-tooltip.module.mjs +5 -4
  95. package/esm2022/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.mjs +54 -37
  96. package/esm2022/widgets/widget-analytic/component/widget-analytic.component.mjs +4 -16
  97. package/esm2022/widgets/widget-chart/component/widget-chart.component.mjs +9 -9
  98. package/esm2022/widgets/widget-detail/component/widget-detail.component.mjs +5 -5
  99. package/esm2022/widgets/widget-map/component/widget-map.component.mjs +30 -32
  100. package/esm2022/widgets/widget-map/pipe/widget-map-geometry-fields-for.pipe.mjs +2 -5
  101. package/esm2022/widgets/widget-map/utils/cql-utils.class.mjs +2 -2
  102. package/esm2022/widgets/widget-map/utils/widget-map.utils.mjs +6 -10
  103. package/esm2022/widgets/widget-table/component/widget-table.component.mjs +18 -14
  104. package/esm2022/widgets/widget-table/expand-value/expand-value.component.mjs +9 -5
  105. package/esm2022/widgets/widget-table/get-value/get-value.pipe.mjs +2 -2
  106. package/esm2022/widgets/widget-table/public-api.mjs +1 -2
  107. package/esm2022/widgets/widget-table/widget-table.module.mjs +12 -7
  108. package/esm2022/widgets/widget-tile/component/widget-tile.component.mjs +10 -15
  109. package/esm2022/widgets/widget-tile/widget-tile.module.mjs +8 -4
  110. package/esm2022/widgets/widget-vega/component/widget-vega.component.mjs +2 -2
  111. package/fesm2022/provoly-dashboard-admin.mjs +249 -126
  112. package/fesm2022/provoly-dashboard-admin.mjs.map +1 -1
  113. package/fesm2022/provoly-dashboard-components-checkbox.mjs +14 -6
  114. package/fesm2022/provoly-dashboard-components-checkbox.mjs.map +1 -1
  115. package/fesm2022/provoly-dashboard-components-data-format.mjs +88 -7
  116. package/fesm2022/provoly-dashboard-components-data-format.mjs.map +1 -1
  117. package/fesm2022/provoly-dashboard-components-paginator.mjs +82 -0
  118. package/fesm2022/provoly-dashboard-components-paginator.mjs.map +1 -0
  119. package/fesm2022/provoly-dashboard-dataset.mjs +21 -58
  120. package/fesm2022/provoly-dashboard-dataset.mjs.map +1 -1
  121. package/fesm2022/provoly-dashboard-import.mjs +249 -116
  122. package/fesm2022/provoly-dashboard-import.mjs.map +1 -1
  123. package/fesm2022/provoly-dashboard-search.mjs +15 -16
  124. package/fesm2022/provoly-dashboard-search.mjs.map +1 -1
  125. package/fesm2022/provoly-dashboard-toolbox.mjs +2 -2
  126. package/fesm2022/provoly-dashboard-toolbox.mjs.map +1 -1
  127. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs +20 -21
  128. package/fesm2022/provoly-dashboard-tooltips-attribute.mjs.map +1 -1
  129. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs +53 -36
  130. package/fesm2022/provoly-dashboard-widgets-widget-aggregated-chart.mjs.map +1 -1
  131. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs +3 -15
  132. package/fesm2022/provoly-dashboard-widgets-widget-analytic.mjs.map +1 -1
  133. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs +9 -9
  134. package/fesm2022/provoly-dashboard-widgets-widget-chart.mjs.map +1 -1
  135. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs +4 -4
  136. package/fesm2022/provoly-dashboard-widgets-widget-detail.mjs.map +1 -1
  137. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs +36 -45
  138. package/fesm2022/provoly-dashboard-widgets-widget-map.mjs.map +1 -1
  139. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs +32 -38
  140. package/fesm2022/provoly-dashboard-widgets-widget-table.mjs.map +1 -1
  141. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs +16 -17
  142. package/fesm2022/provoly-dashboard-widgets-widget-tile.mjs.map +1 -1
  143. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs +1 -1
  144. package/fesm2022/provoly-dashboard-widgets-widget-vega.mjs.map +1 -1
  145. package/fesm2022/provoly-dashboard.mjs +278 -330
  146. package/fesm2022/provoly-dashboard.mjs.map +1 -1
  147. package/import/components/{import.component.d.ts → form/import-form.component.d.ts} +8 -4
  148. package/import/components/list/import-list.component.d.ts +34 -0
  149. package/import/components/version-modal/version-modal.component.d.ts +13 -0
  150. package/import/i18n/en.translations.d.ts +14 -0
  151. package/import/i18n/fr.translations.d.ts +14 -0
  152. package/import/import.module.d.ts +13 -10
  153. package/import/public-api.d.ts +3 -1
  154. package/import/style/_o-import.scss +50 -6
  155. package/lib/core/components/share/legacy-share/share.component.d.ts +1 -1
  156. package/lib/core/components/{modal-status/modal-status.component.d.ts → status-modal/status-modal.component.d.ts} +10 -6
  157. package/lib/core/components/{modal-status/modal-status.module.d.ts → status-modal/status-modal.module.d.ts} +5 -5
  158. package/lib/core/core.module.d.ts +2 -2
  159. package/lib/core/i18n/en.translations.d.ts +33 -0
  160. package/lib/core/i18n/fr.translations.d.ts +35 -0
  161. package/lib/core/model/admin-api.model.d.ts +6 -8
  162. package/lib/core/model/widget-analytic-manifest.interface.d.ts +0 -3
  163. package/lib/core/model/widget-table-manifest.interface.d.ts +2 -0
  164. package/lib/core/public-api.d.ts +2 -2
  165. package/lib/core/store/class/class.interface.d.ts +2 -1
  166. package/lib/core/store/class/class.selectors.d.ts +10 -10
  167. package/lib/core/store/data-source/data-source.actions.d.ts +21 -1
  168. package/lib/core/store/data-source/data-source.effects.d.ts +11 -1
  169. package/lib/core/store/data-source/data-source.model.d.ts +3 -2
  170. package/lib/core/store/data-source/data-source.reducer.d.ts +1 -0
  171. package/lib/core/store/data-source/data-source.selectors.d.ts +3 -3
  172. package/lib/core/store/data-source/data-source.service.d.ts +11 -2
  173. package/lib/core/store/field/field.interface.d.ts +8 -4
  174. package/lib/core/store/field/field.service.d.ts +1 -0
  175. package/lib/dashboard/components/context-menu/object-edition/object-edition.component.d.ts +1 -1
  176. package/lib/dashboard/components/widgets/datasource-selector/datasource-card/datasource-card.component.d.ts +3 -7
  177. package/lib/dashboard/item-utils.d.ts +1 -1
  178. package/lib/dashboard/store/dashboard.actions.d.ts +0 -11
  179. package/lib/dashboard/store/dashboard.effects.d.ts +0 -3
  180. package/lib/dashboard/tooltip/tooltip-factory.service.d.ts +2 -1
  181. package/package.json +25 -19
  182. package/styles/base/_utils.scss +9 -1
  183. package/styles/components/_a-btn.scss +7 -0
  184. package/styles/components/_a-table.scss +2 -16
  185. package/styles/layout/_o-workspace.scss +1 -0
  186. package/tooltips/attribute/attribute-tooltip.component.d.ts +6 -6
  187. package/tooltips/attribute/attribute-tooltip.module.d.ts +2 -1
  188. package/widgets/widget-aggregated-chart/component/widget-aggregated-chart.component.d.ts +16 -3
  189. package/widgets/widget-analytic/component/widget-analytic.component.d.ts +2 -3
  190. package/widgets/widget-detail/component/widget-detail.component.d.ts +1 -4
  191. package/widgets/widget-table/component/widget-table.component.d.ts +1 -0
  192. package/widgets/widget-table/expand-value/expand-value.component.d.ts +4 -2
  193. package/widgets/widget-table/public-api.d.ts +0 -1
  194. package/widgets/widget-table/widget-table.module.d.ts +9 -8
  195. package/widgets/widget-tile/component/widget-tile.component.d.ts +1 -0
  196. package/widgets/widget-tile/widget-tile.module.d.ts +2 -1
  197. package/esm2022/import/components/import.component.mjs +0 -167
  198. package/esm2022/lib/core/components/modal-status/modal-status.component.mjs +0 -45
  199. package/esm2022/widgets/widget-table/expand-value/format-number.pipe.mjs +0 -24
  200. package/widgets/widget-table/expand-value/format-number.pipe.d.ts +0 -10
@@ -118,14 +118,14 @@ export class WidgetDetailComponent extends BaseWidgetComponent {
118
118
  this.store.dispatch(ContextMenuActions.open({ itemId: item.id, clientX: $event.clientX, clientY: $event.clientY, from: 'detail', allowObjectCreation: false }));
119
119
  }
120
120
  }
121
- isRaw(property) {
122
- return this.fields.find((field) => field.id === property.attribute.field)?.type === FieldType.RAW;
121
+ isRaw(attribute) {
122
+ return attribute.field?.type === FieldType.RAW;
123
123
  }
124
124
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetDetailComponent, deps: [{ token: i1.Store }, { token: i2.PryI18nService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
125
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", 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)\">{{ value?.value }}</p>\n <p class=\"o-properties__list__item__raw\" *ngIf=\"isRaw(property)\">\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" }] }); }
125
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", 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)\">{{ value?.value }}</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" }] }); }
126
126
  }
127
127
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: WidgetDetailComponent, decorators: [{
128
128
  type: Component,
129
- 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)\">{{ value?.value }}</p>\n <p class=\"o-properties__list__item__raw\" *ngIf=\"isRaw(property)\">\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" }]
129
+ 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)\">{{ value?.value }}</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" }]
130
130
  }], ctorParameters: () => [{ type: i1.Store }, { type: i2.PryI18nService }, { type: i0.ElementRef }] });
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1kZXRhaWwvY29tcG9uZW50L3dpZGdldC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtZGV0YWlsL2NvbXBvbmVudC93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBR2xCLGNBQWMsRUFDZCxTQUFTLEVBR1QsU0FBUyxFQUdWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFNMUMsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG1CQUFtQjthQWNyRCxzQkFBaUIsR0FBRyxDQUFDLEFBQUosQ0FBSztJQUU3QixZQUNFLEtBQWlCLEVBQ1QsZ0JBQWdDLEVBQ3hDLEVBQWM7UUFFZCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQWYxQyxnQkFBVyxHQUErQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFPL0YsV0FBTSxHQUFZLEVBQUUsQ0FBQztRQVluQixJQUFJ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LHFCQUFxQjtrQkFKakMsU0FBUzsrQkFDRSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSxcbiAgQmFzZVdpZGdldENvbXBvbmVudCxcbiAgQ2F0ZWdvcnlTZWxlY3RvcnMsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb250ZXh0TWVudUFjdGlvbnMsXG4gIERhc2hib2FyZEFjdGlvbnMsXG4gIERhc2hib2FyZFNlbGVjdG9ycyxcbiAgRGV0YWlsV2lkZ2V0T3B0aW9ucyxcbiAgRmllbGQsXG4gIEZpZWxkU2VsZWN0b3JzLFxuICBGaWVsZFR5cGUsXG4gIEhlYWRlckFjdGlvbixcbiAgSXRlbSxcbiAgSXRlbVV0aWxzLFxuICBQcnlJMThuU2VydmljZSxcbiAgV2lkZ2V0TWFuaWZlc3Rcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXREZXRhaWxDb21wb25lbnQgZXh0ZW5kcyBCYXNlV2lkZ2V0Q29tcG9uZW50IHtcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8RGV0YWlsV2lkZ2V0T3B0aW9ucz47XG4gIGl0ZW1zVG9EaXNwbGF5JDogT2JzZXJ2YWJsZTxJdGVtW10+O1xuICBwYW5lbE9wZW5lZDogeyBpdGVtOiBib29sZWFuOyBjYXRlZ29yaWVzOiBib29sZWFuW10gfVtdID0gW3sgaXRlbTogdHJ1ZSwgY2F0ZWdvcmllczogW3RydWVdIH1dO1xuICBpdGVtQW5kQ2F0ZWdvcmllcyQ6IE9ic2VydmFibGU8XG4gICAgeyBpdGVtOiBJdGVtOyBjYXRlZ29yaWVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcHJvcGVydGllczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZTogQXR0cmlidXRlIH1bXSB9W10gfVtdXG4gID47XG4gIHBpbm5lZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG9wdGlvbnNDb3B5PzogRGV0YWlsV2lkZ2V0T3B0aW9ucztcbiAgaXRlbXNGb3JQaW4/OiBzdHJpbmdbXTtcbiAgZmllbGRzOiBGaWVsZFtdID0gW107XG4gIGRldGFpbGxlZFdpZGdldE1hbmlmZXN0JDogT2JzZXJ2YWJsZTxXaWRnZXRNYW5pZmVzdD47XG4gIGFkZGl0aW9uYWxPcHRpb25zJDogT2JzZXJ2YWJsZTxIZWFkZXJBY3Rpb25bXT47XG4gIHdpZGdldElkOiBudW1iZXI7XG4gIHN0YXRpYyB3aWRnZXRJZEdlbmVyYXRvciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcihzdG9yZSwgZWwpO1xuICAgIHRoaXMud2lkZ2V0SWQgPSBXaWRnZXREZXRhaWxDb21wb25lbnQud2lkZ2V0SWRHZW5lcmF0b3IrKztcbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgRGV0YWlsV2lkZ2V0T3B0aW9ucykpO1xuICAgIHRoaXMucGlubmVkJCA9IHRoaXMub3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+ICEhb3B0aW9ucy5pdGVtSWRzICYmIG9wdGlvbnMuaXRlbUlkcy5sZW5ndGggPiAwKSk7XG4gICAgdGhpcy5pdGVtc1RvRGlzcGxheSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5zZWxlY3RlZEl0ZW1zKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5hbGxJdGVtcyksXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLm9iamVjdERldGFpbHMpXG4gICAgXSkucGlwZShcbiAgICAgIHRhcCgoW18sIGFsbEl0ZW1zLCBvcHRpb25zLCBvYmplY3REZXRhaWxzXSkgPT4ge1xuICAgICAgICAvLyBnbyBzZWFyY2ggZm9yIGRldGFpbCBpdGVtIGlmIG5vdCBhbHJlYWR5IGZvdW5kIGluIGFsbEl0ZW1zIExpc3RcbiAgICAgICAgaWYgKG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IG9wdGlvbnMuaXRlbUlkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+ICghYWxsSXRlbXMuZmluZCgoaXQpID0+IGl0LmlkID09PSBpZCkgPyBpZCA6IChudWxsIGFzIHVua25vd24gYXMgc3RyaW5nKSkpXG4gICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gISFpdClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiAhT2JqZWN0LmtleXMob2JqZWN0RGV0YWlscykuaW5jbHVkZXMoaXQpKTtcblxuICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmZldGNoT2JqZWN0c0RldGFpbHMoeyBpZHM6IG1pc3NpbmdJdGVtcyB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoW2dsb2JhbFNlbGVjdGlvbkl0ZW1zLCBhbGxJdGVtcywgb3B0aW9ucywgb2JqZWN0RGV0YWlsc10pID0+XG4gICAgICAgIG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gb3B0aW9ucy5pdGVtSWRzLm1hcCgoaWQpID0+IGFsbEl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gaWQpID8/IG9iamVjdERldGFpbHNbaWRdKVxuICAgICAgICAgIDogZ2xvYmFsU2VsZWN0aW9uSXRlbXNcbiAgICAgICksXG4gICAgICBtYXAoKGl0ZW1zKSA9PiBpdGVtcy5maWx0ZXIoKGl0KSA9PiAhIWl0KSBhcyBJdGVtW10pXG4gICAgKTtcblxuICAgIHRoaXMuaXRlbUFuZENhdGVnb3JpZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLml0ZW1zVG9EaXNwbGF5JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ2F0ZWdvcnlTZWxlY3RvcnMuY2F0ZWdvcmllcylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbaXRlbXMsIGNsYXNzZXMsIGNhdGVnb3JpZXNdKSA9PlxuICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBvYmplY3RDbGFzcyA9IGNsYXNzZXMuZmluZCgob0NsYXNzKSA9PiBvQ2xhc3MuaWQgPT09IGl0ZW0ub0NsYXNzKSA/PyB7IGF0dHJpYnV0ZXM6IFtdIH07XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllc1dpdGhQcm9wcyA9IFtdIGFzIHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7IG5hbWU6IHN0cmluZzsgYXR0cmlidXRlOiBBdHRyaWJ1dGUgfVtdO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgICBvYmplY3RDbGFzcy5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBhdHRyLmNhdGVnb3J5ID8/IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQubmFtZSA9PT0gJ2RlZmF1bHQnKT8uaWQgPz8gJ2RlZmF1bHQtaWQnO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzV2l0aFByb3BzLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKSkge1xuICAgICAgICAgICAgICBjYXRlZ29yaWVzV2l0aFByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBjYXRlZ29yeUlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQuaWQgPT09IGNhdGVnb3J5SWQpPy5uYW1lID8/ICdkZWZhdWx0J1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGVnb3JpZXNXaXRoUHJvcHNcbiAgICAgICAgICAgICAgLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKVxuICAgICAgICAgICAgICA/LnByb3BlcnRpZXMucHVzaCh7IG5hbWU6IGF0dHIubmFtZSwgYXR0cmlidXRlOiBhdHRyIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1dpdGhQcm9wc1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkLnN1YnNjcmliZSgob3B0aW9ucykgPT4gKHRoaXMub3B0aW9uc0NvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpKSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLml0ZW1zVG9EaXNwbGF5JC5zdWJzY3JpYmUoKGl0ZW1zKSA9PiAodGhpcy5pdGVtc0ZvclBpbiA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCkpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuc3RvcmUuc2VsZWN0KEZpZWxkU2VsZWN0b3JzLmZpZWxkcykuc3Vic2NyaWJlKChmaWVsZHMpID0+ICh0aGlzLmZpZWxkcyA9IGZpZWxkcykpKTtcblxuICAgIHRoaXMuZGV0YWlsbGVkV2lkZ2V0TWFuaWZlc3QkID0gdGhpcy5pdGVtc1RvRGlzcGxheSQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKGl0ZW1zKSA9PlxuICAgICAgICAgICh7XG4gICAgICAgICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5kZXRhaWwudGl0bGUnLCB7IGl0ZW1zTmI6IGl0ZW1zLmxlbmd0aCB9KVxuICAgICAgICAgIH0pIGFzIFdpZGdldE1hbmlmZXN0XG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuYWRkaXRpb25hbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5waW5uZWQkLCB0aGlzLml0ZW1zVG9EaXNwbGF5JF0pLnBpcGUoXG4gICAgICBtYXAoKFtpc1Bpbm5lZCwgaXRlbXNdKSA9PiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogaXNQaW5uZWQgPyAnQHByeS53aWRnZXQuZGV0YWlsLnVucGluJyA6ICdAcHJ5LndpZGdldC5kZXRhaWwucGluJyxcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUGluKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpY29uOiBpc1Bpbm5lZCA/ICd1bnB1Ymxpc2hlZCcgOiAncHVibGlzaGVkX3dpdGhfY2hhbmdlcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICgpID0+IGl0ZW1zLmxlbmd0aCA9PT0gMFxuICAgICAgICB9XG4gICAgICBdKVxuICAgICk7XG4gIH1cblxuICB0b2dnbGUoaXRlbUluZGV4OiBudW1iZXIsIGNhdGVnb3J5SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XSkge1xuICAgICAgdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdID0geyBpdGVtOiBmYWxzZSwgY2F0ZWdvcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKGNhdGVnb3J5SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW0gPSAhdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdID0gIXRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlKGl0ZW06IEl0ZW0sIHByb3BlcnR5OiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGVTaW1wbGVWYWx1ZVtdIHtcbiAgICBjb25zdCB2YWx1ZSA9IEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShpdGVtLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG5cbiAgdG9nZ2xlUGluKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weSkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weSA9IHt9O1xuICAgIH1cbiAgICBpZiAoISF0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHMgJiYgdGhpcy5vcHRpb25zQ29weS5pdGVtSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuaXRlbUlkcyA9IHRoaXMuaXRlbXNGb3JQaW47XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlV2lkZ2V0TWFuaWZlc3Qoe1xuICAgICAgICBtYW5pZmVzdDogeyAuLi50aGlzLm1hbmlmZXN0LCBvcHRpb25zOiB0aGlzLm9wdGlvbnNDb3B5IH0sXG4gICAgICAgIGluZGV4OiB0aGlzLndpZGdldEluZGV4XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBoYXNNZXRhZGF0YSh2YWx1ZTogQXR0cmlidXRlU2ltcGxlVmFsdWUgfCBJdGVtKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlPy5tZXRhZGF0YSA/PyB7fSkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNvbnRleHRNZW51KCRldmVudDogTW91c2VFdmVudCwgaXRlbTogSXRlbSkge1xuICAgIGlmICh0aGlzLm1hbmlmZXN0LmNvbnRleHRNZW51ICE9PSBmYWxzZSkge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBDb250ZXh0TWVudUFjdGlvbnMub3Blbih7IGl0ZW1JZDogaXRlbS5pZCwgY2xpZW50WDogJGV2ZW50LmNsaWVudFgsIGNsaWVudFk6ICRldmVudC5jbGllbnRZLCBmcm9tOiAnZGV0YWlsJyxhbGxvd09iamVjdENyZWF0aW9uOiBmYWxzZSB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpc1Jhdyhwcm9wZXJ0eTogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZTogQXR0cmlidXRlIH0pIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLmlkID09PSBwcm9wZXJ0eS5hdHRyaWJ1dGUuZmllbGQpPy50eXBlID09PSBGaWVsZFR5cGUuUkFXO1xuICB9XG59XG4iLCI8cHJ5LXdpZGdldC1kZXRhaWwtY3NzPjwvcHJ5LXdpZGdldC1kZXRhaWwtY3NzPlxuPGRpdiBjbGFzcz1cIm8td2lkZ2V0IG8td2lkZ2V0LS1kZXRhaWxcIj5cbiAgPHByeS13aWRnZXQtaGVhZGVyXG4gICAgKm5nSWY9XCJkaXNwbGF5SGVhZGVyJCB8IGFzeW5jXCJcbiAgICBbd2lkZ2V0SW5kZXhdPVwid2lkZ2V0SW5kZXhcIlxuICAgIFttYW5pZmVzdF09XCJkZXRhaWxsZWRXaWRnZXRNYW5pZmVzdCQgfCBhc3luY1wiXG4gICAgW2FkZGl0aW9uYWxPcHRpb25zXT1cImFkZGl0aW9uYWxPcHRpb25zJCB8IGFzeW5jXCJcbiAgICBbaGVhZGVyT3B0aW9uc109XCIoZGlzcGxheUhlYWRlciQgfCBhc3luYykgPz8ge31cIlxuICAgIFtkaXNwbGF5Q291bnRdPVwiZmFsc2VcIlxuICA+XG4gIDwvcHJ5LXdpZGdldC1oZWFkZXI+XG5cbiAgPHAgY2xhc3M9XCJpcy1lbXB0eVwiICpuZ0lmPVwiIShpdGVtQW5kQ2F0ZWdvcmllcyQgfCBhc3luYykgfHwgKGl0ZW1BbmRDYXRlZ29yaWVzJCB8IGFzeW5jKT8ubGVuZ3RoID09PSAwXCI+XG4gICAge3sgJ0Bwcnkud2lkZ2V0LmRldGFpbC5ub0l0ZW1zJyB8IGkxOG4gfX1cbiAgPC9wPlxuXG4gIDxkaXYgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19jb250ZW50XCIgKm5nRm9yPVwibGV0IGNvdXBsZSBvZiBpdGVtQW5kQ2F0ZWdvcmllcyQgfCBhc3luYzsgbGV0IGl0ZW1JbmRleCA9IGluZGV4XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoKG9wdGlvbnMkIHwgYXN5bmMpPy5oZWFkZXIgPT09IGZhbHNlKVwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm8td2lkZ2V0LS1kZXRhaWxfX2hlYWRlclwiXG4gICAgICAgIChjb250ZXh0bWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQsIGNvdXBsZS5pdGVtKVwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0Bwcnkud2lkZ2V0Lml0ZW1JZCcgfCBpMThuIH19OiB7eyBjb3VwbGUuaXRlbS5pZCB9fVwiXG4gICAgICA+XG4gICAgICAgIDxpbWcgW2hlaWdodF09XCIyNVwiIFt3aWR0aF09XCIyNVwiIFtzcmNdPVwiY291cGxlLml0ZW0gfCB0cmFuc2xhdGVJdGVtVG9TeW1ib2wgfCBhc3luY1wiIFthbHRdPVwiY291cGxlXCIgLz5cbiAgICAgICAgPGgzIGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9faGVhZGVyX190aXRsZVwiPlxuICAgICAgICAgIHt7ICdAcHJ5LndpZGdldC5jbGFzcycgfCBpMThuIH19OlxuICAgICAgICAgIHt7XG4gICAgICAgICAgICBjb3VwbGUuaXRlbS5vQ2xhc3NcbiAgICAgICAgICAgICAgfCB0cmFuc2xhdGVJZFxuICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY2xhc3MnLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXQ6ICduYW1lJ1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB8IGFzeW5jXG4gICAgICAgICAgfX1cbiAgICAgICAgPC9oMz5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhKCEhcGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW0pXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidpdGVtLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleFwiXG4gICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShpdGVtSW5kZXgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwcnktaWNvbiAqbmdJZj1cIiEhcGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW1cIiBpY29uU3ZnPVwiZmxlY2hlX2hhdXRcIj48L3ByeS1pY29uPlxuICAgICAgICAgIDxwcnktaWNvbiAqbmdJZj1cIiEoISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbSlcIiBpY29uU3ZnPVwiZmxlY2hlX2Jhc1wiPjwvcHJ5LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fZGF0YXNcIiAqbmdJZj1cImhhc01ldGFkYXRhKGNvdXBsZS5pdGVtKVwiPlxuICAgICAgICA8cHJ5LW1ldGFkYXRhIFtpdGVtXT1cImNvdXBsZS5pdGVtXCI+PC9wcnktbWV0YWRhdGE+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbVwiXG4gICAgICAoY29udGV4dG1lbnUpPVwiY29udGV4dE1lbnUoJGV2ZW50LCBjb3VwbGUuaXRlbSlcIlxuICAgICAgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19kYXRhc1wiXG4gICAgICBbaWRdPVwiJ2l0ZW0tJyArIHdpZGdldElkICsgJy0nICsgaXRlbUluZGV4XCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYXRlZ29yeSBvZiBjb3VwbGUuY2F0ZWdvcmllczsgbGV0IGNhdGVnb3J5SW5kZXggPSBpbmRleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9fY2F0ZWdvcnlcIj5cbiAgICAgICAgICA8cD57eyAnQHByeS53aWRnZXQuZGV0YWlsLmNhdGVnb3J5JyB8IGkxOG4gfX06IHt7IGNhdGVnb3J5Lm5hbWUgfX08L3A+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImEtYnRuIGEtYnRuLS1pY29uLW9ubHlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCIhKHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidwcm9wZXJ0aWVzLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleCArICctJyArIGNhdGVnb3J5SW5kZXhcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZShpdGVtSW5kZXgsIGNhdGVnb3J5SW5kZXgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCJwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XVwiXG4gICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ByeS1pY29uPlxuICAgICAgICAgICAgPHByeS1pY29uXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uY2F0ZWdvcmllc1tjYXRlZ29yeUluZGV4XSlcIlxuICAgICAgICAgICAgICBpY29uU3ZnPVwiZmxlY2hlX2Jhc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3ByeS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJvLXByb3BlcnRpZXNcIlxuICAgICAgICAgIFtpZF09XCIncHJvcGVydGllcy0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXggKyAnLScgKyBjYXRlZ29yeUluZGV4XCJcbiAgICAgICAgICAqbmdJZj1cInBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdXCJcbiAgICAgICAgPlxuICAgICAgICAgIDx1bCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgY2F0ZWdvcnkucHJvcGVydGllc1wiPlxuICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIGdldFZhbHVlKGNvdXBsZS5pdGVtLCBwcm9wZXJ0eS5hdHRyaWJ1dGUpOyBsZXQgaSA9IGluZGV4OyBsZXQgYyA9IGNvdW50XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm8tcHJvcGVydGllc19fbGlzdF9faXRlbV9fbGFiZWxcIiAqbmdJZj1cImkgPT09IDBcIj57eyBwcm9wZXJ0eS5uYW1lIH19OjwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtX192YWx1ZVwiICpuZ0lmPVwiIWlzUmF3KHByb3BlcnR5KVwiPnt7IHZhbHVlPy52YWx1ZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtX19yYXdcIiAqbmdJZj1cImlzUmF3KHByb3BlcnR5KVwiPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LXZpenVhbGl6ZS1yYXcgW2l0ZW1dPVwiY291cGxlLml0ZW1cIiBbcHJvcGVydHlOYW1lXT1cInByb3BlcnR5Lm5hbWVcIj48L3ByeS12aXp1YWxpemUtcmF3PlxuICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc01ldGFkYXRhKHZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8cHJ5LW1ldGFkYXRhIFtpdGVtXT1cInZhbHVlXCI+PC9wcnktbWV0YWRhdGE+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LWRldGFpbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcm92b2x5L2Rhc2hib2FyZC93aWRnZXRzL3dpZGdldC1kZXRhaWwvY29tcG9uZW50L3dpZGdldC1kZXRhaWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJvdm9seS9kYXNoYm9hcmQvd2lkZ2V0cy93aWRnZXQtZGV0YWlsL2NvbXBvbmVudC93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFFdEQsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBR2xCLGNBQWMsRUFDZCxTQUFTLEVBR1QsU0FBUyxFQUdWLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLGFBQWEsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFNMUMsTUFBTSxPQUFPLHFCQUFzQixTQUFRLG1CQUFtQjthQWNyRCxzQkFBaUIsR0FBRyxDQUFDLEFBQUosQ0FBSztJQUU3QixZQUNFLEtBQWlCLEVBQ1QsZ0JBQWdDLEVBQ3hDLEVBQWM7UUFFZCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSFQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQWYxQyxnQkFBVyxHQUErQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFPL0YsV0FBTSxHQUFZLEVBQUUsQ0FBQztRQVluQixJQUFJ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ICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBBdHRyaWJ1dGVTaW1wbGVWYWx1ZSxcbiAgQmFzZVdpZGdldENvbXBvbmVudCxcbiAgQ2F0ZWdvcnlTZWxlY3RvcnMsXG4gIENsYXNzU2VsZWN0b3JzLFxuICBDb250ZXh0TWVudUFjdGlvbnMsXG4gIERhc2hib2FyZEFjdGlvbnMsXG4gIERhc2hib2FyZFNlbGVjdG9ycyxcbiAgRGV0YWlsV2lkZ2V0T3B0aW9ucyxcbiAgRmllbGQsXG4gIEZpZWxkU2VsZWN0b3JzLFxuICBGaWVsZFR5cGUsXG4gIEhlYWRlckFjdGlvbixcbiAgSXRlbSxcbiAgSXRlbVV0aWxzLFxuICBQcnlJMThuU2VydmljZSxcbiAgV2lkZ2V0TWFuaWZlc3Rcbn0gZnJvbSAnQHByb3ZvbHkvZGFzaGJvYXJkJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwcnktd2lkZ2V0LWRldGFpbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtZGV0YWlsLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXREZXRhaWxDb21wb25lbnQgZXh0ZW5kcyBCYXNlV2lkZ2V0Q29tcG9uZW50IHtcbiAgb3B0aW9ucyQ6IE9ic2VydmFibGU8RGV0YWlsV2lkZ2V0T3B0aW9ucz47XG4gIGl0ZW1zVG9EaXNwbGF5JDogT2JzZXJ2YWJsZTxJdGVtW10+O1xuICBwYW5lbE9wZW5lZDogeyBpdGVtOiBib29sZWFuOyBjYXRlZ29yaWVzOiBib29sZWFuW10gfVtdID0gW3sgaXRlbTogdHJ1ZSwgY2F0ZWdvcmllczogW3RydWVdIH1dO1xuICBpdGVtQW5kQ2F0ZWdvcmllcyQ6IE9ic2VydmFibGU8XG4gICAgeyBpdGVtOiBJdGVtOyBjYXRlZ29yaWVzOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgcHJvcGVydGllczogeyBuYW1lOiBzdHJpbmc7IGF0dHJpYnV0ZTogQXR0cmlidXRlIH1bXSB9W10gfVtdXG4gID47XG4gIHBpbm5lZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIG9wdGlvbnNDb3B5PzogRGV0YWlsV2lkZ2V0T3B0aW9ucztcbiAgaXRlbXNGb3JQaW4/OiBzdHJpbmdbXTtcbiAgZmllbGRzOiBGaWVsZFtdID0gW107XG4gIGRldGFpbGxlZFdpZGdldE1hbmlmZXN0JDogT2JzZXJ2YWJsZTxXaWRnZXRNYW5pZmVzdD47XG4gIGFkZGl0aW9uYWxPcHRpb25zJDogT2JzZXJ2YWJsZTxIZWFkZXJBY3Rpb25bXT47XG4gIHdpZGdldElkOiBudW1iZXI7XG4gIHN0YXRpYyB3aWRnZXRJZEdlbmVyYXRvciA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc3RvcmU6IFN0b3JlPGFueT4sXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBQcnlJMThuU2VydmljZSxcbiAgICBlbDogRWxlbWVudFJlZlxuICApIHtcbiAgICBzdXBlcihzdG9yZSwgZWwpO1xuICAgIHRoaXMud2lkZ2V0SWQgPSBXaWRnZXREZXRhaWxDb21wb25lbnQud2lkZ2V0SWRHZW5lcmF0b3IrKztcbiAgICB0aGlzLm9wdGlvbnMkID0gdGhpcy5tYW5pZmVzdCQucGlwZShtYXAoKG1hbmlmZXN0KSA9PiAobWFuaWZlc3Qub3B0aW9ucyA/PyB7fSkgYXMgRGV0YWlsV2lkZ2V0T3B0aW9ucykpO1xuICAgIHRoaXMucGlubmVkJCA9IHRoaXMub3B0aW9ucyQucGlwZShtYXAoKG9wdGlvbnMpID0+ICEhb3B0aW9ucy5pdGVtSWRzICYmIG9wdGlvbnMuaXRlbUlkcy5sZW5ndGggPiAwKSk7XG4gICAgdGhpcy5pdGVtc1RvRGlzcGxheSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5zZWxlY3RlZEl0ZW1zKSxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KERhc2hib2FyZFNlbGVjdG9ycy5hbGxJdGVtcyksXG4gICAgICB0aGlzLm9wdGlvbnMkLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoRGFzaGJvYXJkU2VsZWN0b3JzLm9iamVjdERldGFpbHMpXG4gICAgXSkucGlwZShcbiAgICAgIHRhcCgoW18sIGFsbEl0ZW1zLCBvcHRpb25zLCBvYmplY3REZXRhaWxzXSkgPT4ge1xuICAgICAgICAvLyBnbyBzZWFyY2ggZm9yIGRldGFpbCBpdGVtIGlmIG5vdCBhbHJlYWR5IGZvdW5kIGluIGFsbEl0ZW1zIExpc3RcbiAgICAgICAgaWYgKG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IG1pc3NpbmdJdGVtcyA9IG9wdGlvbnMuaXRlbUlkc1xuICAgICAgICAgICAgLm1hcCgoaWQpID0+ICghYWxsSXRlbXMuZmluZCgoaXQpID0+IGl0LmlkID09PSBpZCkgPyBpZCA6IChudWxsIGFzIHVua25vd24gYXMgc3RyaW5nKSkpXG4gICAgICAgICAgICAuZmlsdGVyKChpdCkgPT4gISFpdClcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0KSA9PiAhT2JqZWN0LmtleXMob2JqZWN0RGV0YWlscykuaW5jbHVkZXMoaXQpKTtcblxuICAgICAgICAgIGlmIChtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChEYXNoYm9hcmRBY3Rpb25zLmZldGNoT2JqZWN0c0RldGFpbHMoeyBpZHM6IG1pc3NpbmdJdGVtcyB9KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoW2dsb2JhbFNlbGVjdGlvbkl0ZW1zLCBhbGxJdGVtcywgb3B0aW9ucywgb2JqZWN0RGV0YWlsc10pID0+XG4gICAgICAgIG9wdGlvbnMuaXRlbUlkcyAmJiBvcHRpb25zLml0ZW1JZHMubGVuZ3RoID4gMFxuICAgICAgICAgID8gb3B0aW9ucy5pdGVtSWRzLm1hcCgoaWQpID0+IGFsbEl0ZW1zLmZpbmQoKGl0KSA9PiBpdC5pZCA9PT0gaWQpID8/IG9iamVjdERldGFpbHNbaWRdKVxuICAgICAgICAgIDogZ2xvYmFsU2VsZWN0aW9uSXRlbXNcbiAgICAgICksXG4gICAgICBtYXAoKGl0ZW1zKSA9PiBpdGVtcy5maWx0ZXIoKGl0KSA9PiAhIWl0KSBhcyBJdGVtW10pXG4gICAgKTtcblxuICAgIHRoaXMuaXRlbUFuZENhdGVnb3JpZXMkID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLml0ZW1zVG9EaXNwbGF5JCxcbiAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KENsYXNzU2VsZWN0b3JzLmNsYXNzZXMpLFxuICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoQ2F0ZWdvcnlTZWxlY3RvcnMuY2F0ZWdvcmllcylcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbaXRlbXMsIGNsYXNzZXMsIGNhdGVnb3JpZXNdKSA9PlxuICAgICAgICBpdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBvYmplY3RDbGFzcyA9IGNsYXNzZXMuZmluZCgob0NsYXNzKSA9PiBvQ2xhc3MuaWQgPT09IGl0ZW0ub0NsYXNzKSA/PyB7IGF0dHJpYnV0ZXM6IFtdIH07XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllc1dpdGhQcm9wcyA9IFtdIGFzIHtcbiAgICAgICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiB7IG5hbWU6IHN0cmluZzsgYXR0cmlidXRlOiBBdHRyaWJ1dGUgfVtdO1xuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICAgIH1bXTtcbiAgICAgICAgICBvYmplY3RDbGFzcy5hdHRyaWJ1dGVzLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBhdHRyLmNhdGVnb3J5ID8/IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQubmFtZSA9PT0gJ2RlZmF1bHQnKT8uaWQgPz8gJ2RlZmF1bHQtaWQnO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzV2l0aFByb3BzLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKSkge1xuICAgICAgICAgICAgICBjYXRlZ29yaWVzV2l0aFByb3BzLnB1c2goe1xuICAgICAgICAgICAgICAgIGlkOiBjYXRlZ29yeUlkLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3JpZXMuZmluZCgoY2F0KSA9PiBjYXQuaWQgPT09IGNhdGVnb3J5SWQpPy5uYW1lID8/ICdkZWZhdWx0J1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGVnb3JpZXNXaXRoUHJvcHNcbiAgICAgICAgICAgICAgLmZpbmQoKGNhdCkgPT4gY2F0LmlkID09PSBjYXRlZ29yeUlkKVxuICAgICAgICAgICAgICA/LnByb3BlcnRpZXMucHVzaCh7IG5hbWU6IGF0dHIubmFtZSwgYXR0cmlidXRlOiBhdHRyIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpdGVtLFxuICAgICAgICAgICAgY2F0ZWdvcmllczogY2F0ZWdvcmllc1dpdGhQcm9wc1xuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm9wdGlvbnMkLnN1YnNjcmliZSgob3B0aW9ucykgPT4gKHRoaXMub3B0aW9uc0NvcHkgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpKSkpXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLml0ZW1zVG9EaXNwbGF5JC5zdWJzY3JpYmUoKGl0ZW1zKSA9PiAodGhpcy5pdGVtc0ZvclBpbiA9IGl0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS5pZCkpKVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuc3RvcmUuc2VsZWN0KEZpZWxkU2VsZWN0b3JzLmZpZWxkcykuc3Vic2NyaWJlKChmaWVsZHMpID0+ICh0aGlzLmZpZWxkcyA9IGZpZWxkcykpKTtcblxuICAgIHRoaXMuZGV0YWlsbGVkV2lkZ2V0TWFuaWZlc3QkID0gdGhpcy5pdGVtc1RvRGlzcGxheSQucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKGl0ZW1zKSA9PlxuICAgICAgICAgICh7XG4gICAgICAgICAgICAuLi50aGlzLm1hbmlmZXN0LFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdAcHJ5LndpZGdldC5kZXRhaWwudGl0bGUnLCB7IGl0ZW1zTmI6IGl0ZW1zLmxlbmd0aCB9KVxuICAgICAgICAgIH0pIGFzIFdpZGdldE1hbmlmZXN0XG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMuYWRkaXRpb25hbE9wdGlvbnMkID0gY29tYmluZUxhdGVzdChbdGhpcy5waW5uZWQkLCB0aGlzLml0ZW1zVG9EaXNwbGF5JF0pLnBpcGUoXG4gICAgICBtYXAoKFtpc1Bpbm5lZCwgaXRlbXNdKSA9PiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYWJlbDogaXNQaW5uZWQgPyAnQHByeS53aWRnZXQuZGV0YWlsLnVucGluJyA6ICdAcHJ5LndpZGdldC5kZXRhaWwucGluJyxcbiAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlUGluKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBpY29uOiBpc1Bpbm5lZCA/ICd1bnB1Ymxpc2hlZCcgOiAncHVibGlzaGVkX3dpdGhfY2hhbmdlcycsXG4gICAgICAgICAgZGlzYWJsZWQ6ICgpID0+IGl0ZW1zLmxlbmd0aCA9PT0gMFxuICAgICAgICB9XG4gICAgICBdKVxuICAgICk7XG4gIH1cblxuICB0b2dnbGUoaXRlbUluZGV4OiBudW1iZXIsIGNhdGVnb3J5SW5kZXg/OiBudW1iZXIpIHtcbiAgICBpZiAoIXRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XSkge1xuICAgICAgdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdID0geyBpdGVtOiBmYWxzZSwgY2F0ZWdvcmllczogW10gfTtcbiAgICB9XG4gICAgaWYgKGNhdGVnb3J5SW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW0gPSAhdGhpcy5wYW5lbE9wZW5lZFtpdGVtSW5kZXhdLml0ZW07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdID0gIXRoaXMucGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdO1xuICAgIH1cbiAgfVxuXG4gIGdldFZhbHVlKGl0ZW06IEl0ZW0sIHByb3BlcnR5OiBBdHRyaWJ1dGUpOiBBdHRyaWJ1dGVTaW1wbGVWYWx1ZVtdIHtcbiAgICBjb25zdCB2YWx1ZSA9IEl0ZW1VdGlscy5nZXRBdHRyaWJ1dGVWYWx1ZShpdGVtLCBwcm9wZXJ0eSk7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICB9XG5cbiAgdG9nZ2xlUGluKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zQ29weSkge1xuICAgICAgdGhpcy5vcHRpb25zQ29weSA9IHt9O1xuICAgIH1cbiAgICBpZiAoISF0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHMgJiYgdGhpcy5vcHRpb25zQ29weS5pdGVtSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNDb3B5Lml0ZW1JZHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9uc0NvcHkuaXRlbUlkcyA9IHRoaXMuaXRlbXNGb3JQaW47XG4gICAgfVxuXG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgIERhc2hib2FyZEFjdGlvbnMudXBkYXRlV2lkZ2V0TWFuaWZlc3Qoe1xuICAgICAgICBtYW5pZmVzdDogeyAuLi50aGlzLm1hbmlmZXN0LCBvcHRpb25zOiB0aGlzLm9wdGlvbnNDb3B5IH0sXG4gICAgICAgIGluZGV4OiB0aGlzLndpZGdldEluZGV4XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBoYXNNZXRhZGF0YSh2YWx1ZTogQXR0cmlidXRlU2ltcGxlVmFsdWUgfCBJdGVtKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHZhbHVlPy5tZXRhZGF0YSA/PyB7fSkubGVuZ3RoID4gMDtcbiAgfVxuXG4gIGNvbnRleHRNZW51KCRldmVudDogTW91c2VFdmVudCwgaXRlbTogSXRlbSkge1xuICAgIGlmICh0aGlzLm1hbmlmZXN0LmNvbnRleHRNZW51ICE9PSBmYWxzZSkge1xuICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKFxuICAgICAgICBDb250ZXh0TWVudUFjdGlvbnMub3Blbih7IGl0ZW1JZDogaXRlbS5pZCwgY2xpZW50WDogJGV2ZW50LmNsaWVudFgsIGNsaWVudFk6ICRldmVudC5jbGllbnRZLCBmcm9tOiAnZGV0YWlsJyxhbGxvd09iamVjdENyZWF0aW9uOiBmYWxzZSB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpc1JhdyhhdHRyaWJ1dGU6IEF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhdHRyaWJ1dGUuZmllbGQ/LnR5cGUgPT09IEZpZWxkVHlwZS5SQVc7XG4gIH1cbn1cbiIsIjxwcnktd2lkZ2V0LWRldGFpbC1jc3M+PC9wcnktd2lkZ2V0LWRldGFpbC1jc3M+XG48ZGl2IGNsYXNzPVwiby13aWRnZXQgby13aWRnZXQtLWRldGFpbFwiPlxuICA8cHJ5LXdpZGdldC1oZWFkZXJcbiAgICAqbmdJZj1cImRpc3BsYXlIZWFkZXIkIHwgYXN5bmNcIlxuICAgIFt3aWRnZXRJbmRleF09XCJ3aWRnZXRJbmRleFwiXG4gICAgW21hbmlmZXN0XT1cImRldGFpbGxlZFdpZGdldE1hbmlmZXN0JCB8IGFzeW5jXCJcbiAgICBbYWRkaXRpb25hbE9wdGlvbnNdPVwiYWRkaXRpb25hbE9wdGlvbnMkIHwgYXN5bmNcIlxuICAgIFtoZWFkZXJPcHRpb25zXT1cIihkaXNwbGF5SGVhZGVyJCB8IGFzeW5jKSA/PyB7fVwiXG4gICAgW2Rpc3BsYXlDb3VudF09XCJmYWxzZVwiXG4gID5cbiAgPC9wcnktd2lkZ2V0LWhlYWRlcj5cblxuICA8cCBjbGFzcz1cImlzLWVtcHR5XCIgKm5nSWY9XCIhKGl0ZW1BbmRDYXRlZ29yaWVzJCB8IGFzeW5jKSB8fCAoaXRlbUFuZENhdGVnb3JpZXMkIHwgYXN5bmMpPy5sZW5ndGggPT09IDBcIj5cbiAgICB7eyAnQHByeS53aWRnZXQuZGV0YWlsLm5vSXRlbXMnIHwgaTE4biB9fVxuICA8L3A+XG5cbiAgPGRpdiBjbGFzcz1cIm8td2lkZ2V0LS1kZXRhaWxfX2NvbnRlbnRcIiAqbmdGb3I9XCJsZXQgY291cGxlIG9mIGl0ZW1BbmRDYXRlZ29yaWVzJCB8IGFzeW5jOyBsZXQgaXRlbUluZGV4ID0gaW5kZXhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISgob3B0aW9ucyQgfCBhc3luYyk/LmhlYWRlciA9PT0gZmFsc2UpXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiby13aWRnZXQtLWRldGFpbF9faGVhZGVyXCJcbiAgICAgICAgKGNvbnRleHRtZW51KT1cImNvbnRleHRNZW51KCRldmVudCwgY291cGxlLml0ZW0pXCJcbiAgICAgICAgdGl0bGU9XCJ7eyAnQHByeS53aWRnZXQuaXRlbUlkJyB8IGkxOG4gfX06IHt7IGNvdXBsZS5pdGVtLmlkIH19XCJcbiAgICAgID5cbiAgICAgICAgPGltZyBbaGVpZ2h0XT1cIjI1XCIgW3dpZHRoXT1cIjI1XCIgW3NyY109XCJjb3VwbGUuaXRlbSB8IHRyYW5zbGF0ZUl0ZW1Ub1N5bWJvbCB8IGFzeW5jXCIgW2FsdF09XCJjb3VwbGVcIiAvPlxuICAgICAgICA8aDMgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19oZWFkZXJfX3RpdGxlXCI+XG4gICAgICAgICAge3sgJ0Bwcnkud2lkZ2V0LmNsYXNzJyB8IGkxOG4gfX06XG4gICAgICAgICAge3tcbiAgICAgICAgICAgIGNvdXBsZS5pdGVtLm9DbGFzc1xuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZUlkXG4gICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjbGFzcycsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dDogJ25hbWUnXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHwgYXN5bmNcbiAgICAgICAgICB9fVxuICAgICAgICA8L2gzPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJhLWJ0biBhLWJ0bi0taWNvbi1vbmx5XCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiEoISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbSlcIlxuICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ2l0ZW0tJyArIHdpZGdldElkICsgJy0nICsgaXRlbUluZGV4XCJcbiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGl0ZW1JbmRleClcIlxuICAgICAgICA+XG4gICAgICAgICAgPHByeS1pY29uICpuZ0lmPVwiISFwYW5lbE9wZW5lZFtpdGVtSW5kZXhdICYmIHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0uaXRlbVwiIGljb25Tdmc9XCJmbGVjaGVfaGF1dFwiPjwvcHJ5LWljb24+XG4gICAgICAgICAgPHByeS1pY29uICpuZ0lmPVwiISghIXBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtKVwiIGljb25Tdmc9XCJmbGVjaGVfYmFzXCI+PC9wcnktaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19kYXRhc1wiICpuZ0lmPVwiaGFzTWV0YWRhdGEoY291cGxlLml0ZW0pXCI+XG4gICAgICAgIDxwcnktbWV0YWRhdGEgW2l0ZW1dPVwiY291cGxlLml0ZW1cIj48L3ByeS1tZXRhZGF0YT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCIhIXBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5pdGVtXCJcbiAgICAgIChjb250ZXh0bWVudSk9XCJjb250ZXh0TWVudSgkZXZlbnQsIGNvdXBsZS5pdGVtKVwiXG4gICAgICBjbGFzcz1cIm8td2lkZ2V0LS1kZXRhaWxfX2RhdGFzXCJcbiAgICAgIFtpZF09XCInaXRlbS0nICsgd2lkZ2V0SWQgKyAnLScgKyBpdGVtSW5kZXhcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhdGVnb3J5IG9mIGNvdXBsZS5jYXRlZ29yaWVzOyBsZXQgY2F0ZWdvcnlJbmRleCA9IGluZGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvLXdpZGdldC0tZGV0YWlsX19jYXRlZ29yeVwiPlxuICAgICAgICAgIDxwPnt7ICdAcHJ5LndpZGdldC5kZXRhaWwuY2F0ZWdvcnknIHwgaTE4biB9fToge3sgY2F0ZWdvcnkubmFtZSB9fTwvcD5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYS1idG4gYS1idG4tLWljb24tb25seVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cIiEocGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF0pXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3Byb3BlcnRpZXMtJyArIHdpZGdldElkICsgJy0nICsgaXRlbUluZGV4ICsgJy0nICsgY2F0ZWdvcnlJbmRleFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKGl0ZW1JbmRleCwgY2F0ZWdvcnlJbmRleClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxwcnktaWNvblxuICAgICAgICAgICAgICAqbmdJZj1cInBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdXCJcbiAgICAgICAgICAgICAgaWNvblN2Zz1cImZsZWNoZV9oYXV0XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcHJ5LWljb24+XG4gICAgICAgICAgICA8cHJ5LWljb25cbiAgICAgICAgICAgICAgKm5nSWY9XCIhKHBhbmVsT3BlbmVkW2l0ZW1JbmRleF0gJiYgcGFuZWxPcGVuZWRbaXRlbUluZGV4XS5jYXRlZ29yaWVzW2NhdGVnb3J5SW5kZXhdKVwiXG4gICAgICAgICAgICAgIGljb25Tdmc9XCJmbGVjaGVfYmFzXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDwvcHJ5LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cIm8tcHJvcGVydGllc1wiXG4gICAgICAgICAgW2lkXT1cIidwcm9wZXJ0aWVzLScgKyB3aWRnZXRJZCArICctJyArIGl0ZW1JbmRleCArICctJyArIGNhdGVnb3J5SW5kZXhcIlxuICAgICAgICAgICpuZ0lmPVwicGFuZWxPcGVuZWRbaXRlbUluZGV4XSAmJiBwYW5lbE9wZW5lZFtpdGVtSW5kZXhdLmNhdGVnb3JpZXNbY2F0ZWdvcnlJbmRleF1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHVsIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiBjYXRlZ29yeS5wcm9wZXJ0aWVzXCI+XG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgZ2V0VmFsdWUoY291cGxlLml0ZW0sIHByb3BlcnR5LmF0dHJpYnV0ZSk7IGxldCBpID0gaW5kZXg7IGxldCBjID0gY291bnRcIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJvLXByb3BlcnRpZXNfX2xpc3RfX2l0ZW1cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtX19sYWJlbFwiICpuZ0lmPVwiaSA9PT0gMFwiPnt7IHByb3BlcnR5Lm5hbWUgfX06PC9wPlxuICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJvLXByb3BlcnRpZXNfX2xpc3RfX2l0ZW1fX3ZhbHVlXCIgKm5nSWY9XCIhaXNSYXcocHJvcGVydHkuYXR0cmlidXRlKVwiPnt7IHZhbHVlPy52YWx1ZSB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiby1wcm9wZXJ0aWVzX19saXN0X19pdGVtX19yYXdcIiAqbmdJZj1cImlzUmF3KHByb3BlcnR5LmF0dHJpYnV0ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHByeS12aXp1YWxpemUtcmF3IFtpdGVtXT1cImNvdXBsZS5pdGVtXCIgW3Byb3BlcnR5TmFtZV09XCJwcm9wZXJ0eS5uYW1lXCI+PC9wcnktdml6dWFsaXplLXJhdz5cbiAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNNZXRhZGF0YSh2YWx1ZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHByeS1tZXRhZGF0YSBbaXRlbV09XCJ2YWx1ZVwiPjwvcHJ5LW1ldGFkYXRhPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19