@netgrif/components-core 6.3.2 → 6.4.0-beta.10

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 (331) hide show
  1. package/esm2020/assets/i18n/de.json +15 -2
  2. package/esm2020/assets/i18n/en.json +15 -2
  3. package/esm2020/assets/i18n/sk.json +15 -2
  4. package/esm2020/lib/actions/front-action.module.mjs +28 -0
  5. package/esm2020/lib/actions/model/front-action-definition.mjs +2 -0
  6. package/esm2020/lib/actions/model/router-action-definitions.mjs +8 -0
  7. package/esm2020/lib/actions/model/task-action-definitions.mjs +16 -0
  8. package/esm2020/lib/actions/public-api.mjs +6 -0
  9. package/esm2020/lib/actions/services/front-action.service.mjs +27 -0
  10. package/esm2020/lib/data-fields/base-component/abstract-base-data-field.component.mjs +51 -0
  11. package/esm2020/lib/data-fields/boolean-field/abstract-boolean-field.component.mjs +7 -26
  12. package/esm2020/lib/data-fields/boolean-field/boolean-default-field/abstract-boolean-default-field.component.mjs +46 -0
  13. package/esm2020/lib/data-fields/boolean-field/models/boolean-field.mjs +9 -1
  14. package/esm2020/lib/data-fields/button-field/abstract-button-field.component.mjs +7 -39
  15. package/esm2020/lib/data-fields/button-field/button-default-field/abstract-button-default-field.component.mjs +58 -0
  16. package/esm2020/lib/data-fields/button-field/models/button-field.mjs +5 -1
  17. package/esm2020/lib/data-fields/case-ref-field/case-ref-default/case-ref-default.component.mjs +75 -0
  18. package/esm2020/lib/data-fields/case-ref-field/model/case-ref-field.mjs +11 -0
  19. package/esm2020/lib/data-fields/case-ref-field/model/case-ref-injection-tokens.mjs +5 -0
  20. package/esm2020/lib/data-fields/data-field-template/abstract-data-field-template.component.mjs +51 -6
  21. package/esm2020/lib/data-fields/data-fields.module.mjs +1 -1
  22. package/esm2020/lib/data-fields/date-field/abstract-date-field.component.mjs +10 -21
  23. package/esm2020/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.mjs +29 -0
  24. package/esm2020/lib/data-fields/date-field/models/date-field.mjs +5 -1
  25. package/esm2020/lib/data-fields/date-time-field/abstract-date-time-field.component.mjs +10 -21
  26. package/esm2020/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.mjs +29 -0
  27. package/esm2020/lib/data-fields/date-time-field/models/date-time-field.mjs +5 -1
  28. package/esm2020/lib/data-fields/enumeration-field/abstract-enumeration-field.component.mjs +4 -1
  29. package/esm2020/lib/data-fields/enumeration-field/enumeration-autocomplete-dynamic-field/abstract-enumeration-autocomplete-dynamic-field.component.mjs +23 -20
  30. package/esm2020/lib/data-fields/enumeration-field/enumeration-autocomplete-select-field/abstract-enumeration-autocomplete-select-field.component.mjs +20 -21
  31. package/esm2020/lib/data-fields/enumeration-field/enumeration-caseref-field/abstract-enumeration-caseref-field.component.mjs +71 -0
  32. package/esm2020/lib/data-fields/enumeration-field/enumeration-icon-field/abstract-enumeration-icon-field.component.mjs +26 -19
  33. package/esm2020/lib/data-fields/enumeration-field/enumeration-list-field/abstract-enumeration-list-field.component.mjs +16 -12
  34. package/esm2020/lib/data-fields/enumeration-field/enumeration-select-field/abstract-enumeration-select-field.component.mjs +16 -12
  35. package/esm2020/lib/data-fields/enumeration-field/enumeration-stepper-field/abstract-enumeration-stepper-field.component.mjs +26 -21
  36. package/esm2020/lib/data-fields/enumeration-field/models/enumeration-field.mjs +21 -1
  37. package/esm2020/lib/data-fields/file-field/abstract-file-field.component.mjs +11 -420
  38. package/esm2020/lib/data-fields/file-field/file-default-field/abstract-file-default-field.component.mjs +456 -0
  39. package/esm2020/lib/data-fields/file-field/models/file-field-constants.mjs +5 -0
  40. package/esm2020/lib/data-fields/file-field/models/file-field.mjs +6 -1
  41. package/esm2020/lib/data-fields/file-list-field/abstract-file-list-field.component.mjs +11 -278
  42. package/esm2020/lib/data-fields/file-list-field/file-list-default-field/abstract-file-list-default-field.component.mjs +304 -0
  43. package/esm2020/lib/data-fields/file-list-field/models/file-list-field.mjs +6 -1
  44. package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.mjs +4 -4
  45. package/esm2020/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.mjs +4 -4
  46. package/esm2020/lib/data-fields/filter-field/abstract-filter-field.component.mjs +8 -20
  47. package/esm2020/lib/data-fields/filter-field/filter-default-field/abstract-filter-default-field.component.mjs +38 -0
  48. package/esm2020/lib/data-fields/filter-field/models/filter-field.mjs +5 -1
  49. package/esm2020/lib/data-fields/i18n-field/abstract-i18n-errors.component.mjs +18 -16
  50. package/esm2020/lib/data-fields/i18n-field/abstract-i18n-field.component.mjs +4 -1
  51. package/esm2020/lib/data-fields/i18n-field/i18n-divider-field/abstract-i18n-divider-field.component.mjs +24 -20
  52. package/esm2020/lib/data-fields/i18n-field/i18n-text-field/abstract-i18n-text-field.component.mjs +35 -32
  53. package/esm2020/lib/data-fields/i18n-field/models/i18n-field.mjs +6 -2
  54. package/esm2020/lib/data-fields/models/abstract-data-field-component.mjs +4 -1
  55. package/esm2020/lib/data-fields/models/abstract-data-field.mjs +14 -2
  56. package/esm2020/lib/data-fields/models/changed-fields.mjs +1 -1
  57. package/esm2020/lib/data-fields/models/component.mjs +22 -2
  58. package/esm2020/lib/data-fields/models/data-field-portal-data-injection-token.mjs +3 -0
  59. package/esm2020/lib/data-fields/models/update-strategy.mjs +7 -0
  60. package/esm2020/lib/data-fields/multichoice-field/abstract-multichoice-field.component.mjs +4 -1
  61. package/esm2020/lib/data-fields/multichoice-field/models/multichoice-field.mjs +17 -1
  62. package/esm2020/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.mjs +30 -30
  63. package/esm2020/lib/data-fields/multichoice-field/multichoice-caseref-field/abstract-multichoice-caseref-field.component.mjs +67 -0
  64. package/esm2020/lib/data-fields/multichoice-field/multichoice-list-field/abstract-multichoice-list-field.component.mjs +16 -12
  65. package/esm2020/lib/data-fields/multichoice-field/multichoice-select-field/abstract-multichoice-select-field.component.mjs +16 -12
  66. package/esm2020/lib/data-fields/number-field/abstract-number-errors.component.mjs +17 -15
  67. package/esm2020/lib/data-fields/number-field/abstract-number-field.component.mjs +4 -1
  68. package/esm2020/lib/data-fields/number-field/currency-number-field/abstract-currency-number-field.component.mjs +21 -15
  69. package/esm2020/lib/data-fields/number-field/models/number-field.mjs +5 -1
  70. package/esm2020/lib/data-fields/number-field/number-default-field/abstract-default-number-field.component.mjs +12 -6
  71. package/esm2020/lib/data-fields/public-api.mjs +21 -2
  72. package/esm2020/lib/data-fields/string-collection-field/models/string-collection-field.mjs +11 -0
  73. package/esm2020/lib/data-fields/string-collection-field/string-collection-default-field/abstract-string-collection-default-field.component.mjs +60 -0
  74. package/esm2020/lib/data-fields/task-ref-field/abstract-task-ref-field.component.mjs +10 -116
  75. package/esm2020/lib/data-fields/task-ref-field/model/task-ref-field.mjs +5 -1
  76. package/esm2020/lib/data-fields/task-ref-field/task-ref-dashboard-field/abstract-task-ref-dashboard-field.component.mjs +130 -0
  77. package/esm2020/lib/data-fields/task-ref-field/task-ref-list-field/abstract-task-ref-list-field.component.mjs +54 -0
  78. package/esm2020/lib/data-fields/text-field/abstract-dashboard-text-field.component.mjs +14 -14
  79. package/esm2020/lib/data-fields/text-field/abstract-text-errors.component.mjs +23 -3
  80. package/esm2020/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.mjs +12 -6
  81. package/esm2020/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.mjs +12 -6
  82. package/esm2020/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.mjs +12 -6
  83. package/esm2020/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.mjs +12 -6
  84. package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.mjs +12 -6
  85. package/esm2020/lib/data-fields/text-field/html-textarea-field/abstract-html-textarea-field.component.mjs +16 -16
  86. package/esm2020/lib/data-fields/text-field/models/text-field.mjs +8 -4
  87. package/esm2020/lib/data-fields/text-field/password-text-field/abstract-password-text-field.component.mjs +14 -14
  88. package/esm2020/lib/data-fields/text-field/rich-textarea-field/abstract-rich-textarea-field.component.mjs +14 -14
  89. package/esm2020/lib/data-fields/text-field/simple-text-field/abstract-simple-text-field.component.mjs +14 -14
  90. package/esm2020/lib/data-fields/text-field/textarea-field/abstract-textarea-field.component.mjs +17 -17
  91. package/esm2020/lib/data-fields/time-instance-abstract-field/abstract-time-instance-field.component.mjs +13 -38
  92. package/esm2020/lib/data-fields/time-instance-abstract-field/models/abstract-time-instance-field.mjs +5 -5
  93. package/esm2020/lib/data-fields/user-field/abstract-user-field.component.mjs +7 -42
  94. package/esm2020/lib/data-fields/user-field/models/user-field.mjs +5 -1
  95. package/esm2020/lib/data-fields/user-field/user-default-field/abstract-user-default-field.component.mjs +70 -0
  96. package/esm2020/lib/data-fields/user-list-field/abstract-user-list-field.component.mjs +7 -45
  97. package/esm2020/lib/data-fields/user-list-field/models/user-list-field.mjs +5 -1
  98. package/esm2020/lib/data-fields/user-list-field/user-list-default-field/abstract-user-list-default-field.component.mjs +60 -0
  99. package/esm2020/lib/dialog/injection-tokens.mjs +10 -0
  100. package/esm2020/lib/dialog/public-api.mjs +2 -1
  101. package/esm2020/lib/event/model/event-constants.mjs +5 -1
  102. package/esm2020/lib/event/services/event.service.mjs +23 -1
  103. package/esm2020/lib/filter/models/case-search-request-body.mjs +1 -1
  104. package/esm2020/lib/filter/models/task-search-request-body.mjs +1 -1
  105. package/esm2020/lib/filter/user-filters.service.mjs +22 -15
  106. package/esm2020/lib/header/abstract-header.component.mjs +28 -7
  107. package/esm2020/lib/header/header-modes/abstract-header-mode.component.mjs +10 -2
  108. package/esm2020/lib/impersonation/services/impersonation-user-select.service.mjs +24 -17
  109. package/esm2020/lib/navigation/group-navigation-component-resolver/group-navigation-component-resolver.service.mjs +1 -10
  110. package/esm2020/lib/navigation/model/group-navigation-constants.mjs +120 -35
  111. package/esm2020/lib/navigation/model/navigation-configs.mjs +16 -0
  112. package/esm2020/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.mjs +239 -127
  113. package/esm2020/lib/navigation/navigation-tree/abstract-navigation-tree.component.mjs +3 -126
  114. package/esm2020/lib/navigation/public-api.mjs +2 -1
  115. package/esm2020/lib/navigation/service/uri.service.mjs +24 -3
  116. package/esm2020/lib/navigation/utility/filter-extraction.service.mjs +34 -10
  117. package/esm2020/lib/navigation/utility/navigation-item-task-utility-methods.mjs +38 -4
  118. package/esm2020/lib/panel/case-panel/abstract-case-panel.component.mjs +9 -2
  119. package/esm2020/lib/panel/task-panel/abstract-task-panel.component.mjs +33 -4
  120. package/esm2020/lib/panel/task-panel-list/default-task-panel-list/abstract-default-task-list.component.mjs +18 -2
  121. package/esm2020/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.mjs +5 -3
  122. package/esm2020/lib/panel/task-panel-single/abstract-single-task.component.mjs +11 -5
  123. package/esm2020/lib/panel/workflow-panel/abstract-workflow-panel.component.mjs +6 -2
  124. package/esm2020/lib/public/factories/public-search-factory.mjs +15 -4
  125. package/esm2020/lib/registry/component-registry.service.mjs +38 -0
  126. package/esm2020/lib/registry/front-action-registry.service.mjs +34 -0
  127. package/esm2020/lib/registry/public-api.mjs +3 -0
  128. package/esm2020/lib/resources/interface/case-get-request-body.mjs +1 -1
  129. package/esm2020/lib/resources/interface/event-outcome.mjs +1 -1
  130. package/esm2020/lib/routing/routing-builder/routing-builder.service.mjs +7 -5
  131. package/esm2020/lib/search/fulltext-search-component/abstract-fulltext-search.component.mjs +14 -4
  132. package/esm2020/lib/search/search-component/abstract-search.component.mjs +5 -3
  133. package/esm2020/lib/side-menu/content-components/import-net/abstract-import-net.component.mjs +10 -7
  134. package/esm2020/lib/side-menu/content-components/injection-tokens.mjs +2 -1
  135. package/esm2020/lib/side-menu/content-components/new-case/abstract-new-case.component.mjs +1 -6
  136. package/esm2020/lib/side-menu/content-components/new-case/model/new-case-injection-data.mjs +1 -1
  137. package/esm2020/lib/side-menu/content-components/public-api.mjs +3 -1
  138. package/esm2020/lib/side-menu/content-components/task-view/model/task-view-injection-data.mjs +2 -0
  139. package/esm2020/lib/side-menu/models/side-menu-control.mjs +2 -10
  140. package/esm2020/lib/tabs/classes/tab-view.mjs +3 -2
  141. package/esm2020/lib/task/services/task-data.service.mjs +30 -28
  142. package/esm2020/lib/task-content/field-component-resolver/abstract-field-component-resolver.component.mjs +24 -5
  143. package/esm2020/lib/task-content/model/field-type-resource.mjs +3 -1
  144. package/esm2020/lib/task-content/services/field-converter.service.mjs +14 -2
  145. package/esm2020/lib/task-content/services/single-task-content.service.mjs +4 -4
  146. package/esm2020/lib/task-content/services/task-content.service.mjs +25 -22
  147. package/esm2020/lib/task-content/services/unlimited-task-content.service.mjs +4 -4
  148. package/esm2020/lib/task-content/task-content/abstract-task-content.component.mjs +20 -7
  149. package/esm2020/lib/utility/navigation-item-default-headers-factory.mjs +27 -0
  150. package/esm2020/lib/utility/public-api.mjs +2 -1
  151. package/esm2020/lib/view/abstract/netgrif-paginator-intl.mjs +36 -0
  152. package/esm2020/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.mjs +8 -4
  153. package/esm2020/lib/view/case-view/components/default-case-list/abstract-default-case-list.component.mjs +18 -5
  154. package/esm2020/lib/view/case-view/service/case-view-service.mjs +28 -20
  155. package/esm2020/lib/view/case-view/tabbed-case-view.mjs +1 -1
  156. package/esm2020/lib/view/public-api.mjs +2 -1
  157. package/esm2020/lib/view/task-view/abstract-single-task-view.component.mjs +18 -34
  158. package/esm2020/lib/view/workflow-view/abstract-workflow-view.component.mjs +20 -11
  159. package/esm2020/lib/view/workflow-view/workflow-view.service.mjs +2 -2
  160. package/esm2020/public-api.mjs +3 -2
  161. package/fesm2015/netgrif-components-core.mjs +4583 -3179
  162. package/fesm2015/netgrif-components-core.mjs.map +1 -1
  163. package/fesm2020/netgrif-components-core.mjs +4278 -2981
  164. package/fesm2020/netgrif-components-core.mjs.map +1 -1
  165. package/lib/actions/front-action.module.d.ts +9 -0
  166. package/lib/actions/model/front-action-definition.d.ts +5 -0
  167. package/lib/actions/model/router-action-definitions.d.ts +2 -0
  168. package/lib/actions/model/task-action-definitions.d.ts +3 -0
  169. package/lib/actions/public-api.d.ts +5 -0
  170. package/lib/actions/services/front-action.service.d.ts +15 -0
  171. package/lib/data-fields/base-component/abstract-base-data-field.component.d.ts +18 -0
  172. package/lib/data-fields/boolean-field/abstract-boolean-field.component.d.ts +5 -7
  173. package/lib/data-fields/boolean-field/boolean-default-field/abstract-boolean-default-field.component.d.ts +14 -0
  174. package/lib/data-fields/boolean-field/models/boolean-field.d.ts +3 -0
  175. package/lib/data-fields/button-field/abstract-button-field.component.d.ts +5 -16
  176. package/lib/data-fields/button-field/button-default-field/abstract-button-default-field.component.d.ts +23 -0
  177. package/lib/data-fields/button-field/models/button-field.d.ts +1 -0
  178. package/lib/data-fields/case-ref-field/case-ref-default/case-ref-default.component.d.ts +19 -0
  179. package/lib/data-fields/case-ref-field/model/case-ref-field.d.ts +9 -0
  180. package/lib/data-fields/case-ref-field/model/case-ref-injection-tokens.d.ts +5 -0
  181. package/lib/data-fields/data-field-template/abstract-data-field-template.component.d.ts +22 -3
  182. package/lib/data-fields/date-field/abstract-date-field.component.d.ts +7 -12
  183. package/lib/data-fields/date-field/date-default-field/abstract-date-default-field.component.d.ts +12 -0
  184. package/lib/data-fields/date-field/models/date-field.d.ts +1 -0
  185. package/lib/data-fields/date-time-field/abstract-date-time-field.component.d.ts +7 -12
  186. package/lib/data-fields/date-time-field/date-time-default-field/abstract-date-time-default-field.component.d.ts +12 -0
  187. package/lib/data-fields/date-time-field/models/date-time-field.d.ts +1 -0
  188. package/lib/data-fields/enumeration-field/abstract-enumeration-field.component.d.ts +3 -0
  189. package/lib/data-fields/enumeration-field/enumeration-autocomplete-dynamic-field/abstract-enumeration-autocomplete-dynamic-field.component.d.ts +8 -10
  190. package/lib/data-fields/enumeration-field/enumeration-autocomplete-select-field/abstract-enumeration-autocomplete-select-field.component.d.ts +6 -10
  191. package/lib/data-fields/enumeration-field/enumeration-caseref-field/abstract-enumeration-caseref-field.component.d.ts +19 -0
  192. package/lib/data-fields/enumeration-field/enumeration-icon-field/abstract-enumeration-icon-field.component.d.ts +9 -9
  193. package/lib/data-fields/enumeration-field/enumeration-list-field/abstract-enumeration-list-field.component.d.ts +6 -8
  194. package/lib/data-fields/enumeration-field/enumeration-select-field/abstract-enumeration-select-field.component.d.ts +6 -8
  195. package/lib/data-fields/enumeration-field/enumeration-stepper-field/abstract-enumeration-stepper-field.component.d.ts +8 -9
  196. package/lib/data-fields/enumeration-field/models/enumeration-field.d.ts +8 -1
  197. package/lib/data-fields/file-field/abstract-file-field.component.d.ts +9 -147
  198. package/lib/data-fields/file-field/file-default-field/abstract-file-default-field.component.d.ts +151 -0
  199. package/lib/data-fields/file-field/models/file-field-constants.d.ts +4 -0
  200. package/lib/data-fields/file-field/models/file-field.d.ts +1 -0
  201. package/lib/data-fields/file-list-field/abstract-file-list-field.component.d.ts +8 -71
  202. package/lib/data-fields/file-list-field/file-list-default-field/abstract-file-list-default-field.component.d.ts +76 -0
  203. package/lib/data-fields/file-list-field/models/file-list-field.d.ts +1 -0
  204. package/lib/data-fields/filter-field/abstract-filter-field-tab-view-content.component.d.ts +3 -3
  205. package/lib/data-fields/filter-field/abstract-filter-field-tab-view.component.d.ts +3 -3
  206. package/lib/data-fields/filter-field/abstract-filter-field.component.d.ts +6 -11
  207. package/lib/data-fields/filter-field/filter-default-field/abstract-filter-default-field.component.d.ts +18 -0
  208. package/lib/data-fields/filter-field/models/filter-field.d.ts +1 -0
  209. package/lib/data-fields/i18n-field/abstract-i18n-errors.component.d.ts +6 -9
  210. package/lib/data-fields/i18n-field/abstract-i18n-field.component.d.ts +3 -0
  211. package/lib/data-fields/i18n-field/i18n-divider-field/abstract-i18n-divider-field.component.d.ts +6 -8
  212. package/lib/data-fields/i18n-field/i18n-text-field/abstract-i18n-text-field.component.d.ts +5 -8
  213. package/lib/data-fields/i18n-field/models/i18n-field.d.ts +1 -0
  214. package/lib/data-fields/models/abstract-data-field-component.d.ts +1 -0
  215. package/lib/data-fields/models/abstract-data-field.d.ts +9 -0
  216. package/lib/data-fields/models/changed-fields.d.ts +7 -6
  217. package/lib/data-fields/models/component.d.ts +20 -0
  218. package/lib/data-fields/models/data-field-portal-data-injection-token.d.ts +13 -0
  219. package/lib/data-fields/models/update-strategy.d.ts +6 -0
  220. package/lib/data-fields/multichoice-field/abstract-multichoice-field.component.d.ts +3 -0
  221. package/lib/data-fields/multichoice-field/models/multichoice-field.d.ts +7 -0
  222. package/lib/data-fields/multichoice-field/multichoice-autocomplete-field/abstract-multichoice-autocomplete-field-component.component.d.ts +6 -9
  223. package/lib/data-fields/multichoice-field/multichoice-caseref-field/abstract-multichoice-caseref-field.component.d.ts +16 -0
  224. package/lib/data-fields/multichoice-field/multichoice-list-field/abstract-multichoice-list-field.component.d.ts +6 -7
  225. package/lib/data-fields/multichoice-field/multichoice-select-field/abstract-multichoice-select-field.component.d.ts +6 -8
  226. package/lib/data-fields/number-field/abstract-number-errors.component.d.ts +6 -9
  227. package/lib/data-fields/number-field/abstract-number-field.component.d.ts +3 -0
  228. package/lib/data-fields/number-field/currency-number-field/abstract-currency-number-field.component.d.ts +4 -2
  229. package/lib/data-fields/number-field/models/number-field.d.ts +1 -0
  230. package/lib/data-fields/number-field/number-default-field/abstract-default-number-field.component.d.ts +4 -2
  231. package/lib/data-fields/public-api.d.ts +20 -1
  232. package/lib/data-fields/string-collection-field/models/string-collection-field.d.ts +9 -0
  233. package/lib/data-fields/string-collection-field/string-collection-default-field/abstract-string-collection-default-field.component.d.ts +18 -0
  234. package/lib/data-fields/task-ref-field/abstract-task-ref-field.component.d.ts +6 -13
  235. package/lib/data-fields/task-ref-field/model/task-ref-field.d.ts +1 -0
  236. package/lib/data-fields/task-ref-field/task-ref-dashboard-field/abstract-task-ref-dashboard-field.component.d.ts +20 -0
  237. package/lib/data-fields/task-ref-field/task-ref-list-field/abstract-task-ref-list-field.component.d.ts +16 -0
  238. package/lib/data-fields/text-field/abstract-dashboard-text-field.component.d.ts +7 -10
  239. package/lib/data-fields/text-field/abstract-text-errors.component.d.ts +7 -2
  240. package/lib/data-fields/text-field/dashboard-bar-chart-text-field/abstract-dashboard-bar-chart-text-field.component.d.ts +4 -2
  241. package/lib/data-fields/text-field/dashboard-iframe-text-field/abstract-dashboard-iframe-text-field.component.d.ts +4 -2
  242. package/lib/data-fields/text-field/dashboard-line-chart-text-field/abstract-dashboard-line-chart-text-field.component.d.ts +4 -2
  243. package/lib/data-fields/text-field/dashboard-pie-chart-text-field/abstract-dashboard-pie-chart-text-field.component.d.ts +4 -2
  244. package/lib/data-fields/text-field/dashboard-portal-text-field/abstract-dashboard-portal-text-field.component.d.ts +4 -2
  245. package/lib/data-fields/text-field/html-textarea-field/abstract-html-textarea-field.component.d.ts +5 -9
  246. package/lib/data-fields/text-field/models/text-field.d.ts +3 -2
  247. package/lib/data-fields/text-field/password-text-field/abstract-password-text-field.component.d.ts +5 -9
  248. package/lib/data-fields/text-field/rich-textarea-field/abstract-rich-textarea-field.component.d.ts +5 -9
  249. package/lib/data-fields/text-field/simple-text-field/abstract-simple-text-field.component.d.ts +5 -9
  250. package/lib/data-fields/text-field/textarea-field/abstract-textarea-field.component.d.ts +6 -9
  251. package/lib/data-fields/time-instance-abstract-field/abstract-time-instance-field.component.d.ts +6 -15
  252. package/lib/data-fields/user-field/abstract-user-field.component.d.ts +5 -28
  253. package/lib/data-fields/user-field/models/user-field.d.ts +1 -0
  254. package/lib/data-fields/user-field/user-default-field/abstract-user-default-field.component.d.ts +34 -0
  255. package/lib/data-fields/user-list-field/abstract-user-list-field.component.d.ts +5 -25
  256. package/lib/data-fields/user-list-field/models/user-list-field.d.ts +1 -0
  257. package/lib/data-fields/user-list-field/user-list-default-field/abstract-user-list-default-field.component.d.ts +24 -0
  258. package/lib/dialog/injection-tokens.d.ts +10 -0
  259. package/lib/dialog/public-api.d.ts +1 -0
  260. package/lib/event/model/event-constants.d.ts +5 -1
  261. package/lib/event/services/event.service.d.ts +3 -0
  262. package/lib/filter/models/case-search-request-body.d.ts +3 -0
  263. package/lib/filter/models/task-search-request-body.d.ts +9 -0
  264. package/lib/filter/user-filters.service.d.ts +4 -2
  265. package/lib/header/abstract-header.component.d.ts +10 -2
  266. package/lib/header/header-modes/abstract-header-mode.component.d.ts +6 -1
  267. package/lib/impersonation/services/impersonation-user-select.service.d.ts +3 -3
  268. package/lib/navigation/group-navigation-component-resolver/group-navigation-component-resolver.service.d.ts +0 -1
  269. package/lib/navigation/model/group-navigation-constants.d.ts +119 -34
  270. package/lib/navigation/model/navigation-configs.d.ts +25 -0
  271. package/lib/navigation/navigation-double-drawer/abstract-navigation-double-drawer.d.ts +42 -39
  272. package/lib/navigation/navigation-tree/abstract-navigation-tree.component.d.ts +2 -27
  273. package/lib/navigation/public-api.d.ts +1 -0
  274. package/lib/navigation/service/uri.service.d.ts +6 -0
  275. package/lib/navigation/utility/filter-extraction.service.d.ts +9 -2
  276. package/lib/navigation/utility/navigation-item-task-utility-methods.d.ts +16 -1
  277. package/lib/panel/case-panel/abstract-case-panel.component.d.ts +5 -1
  278. package/lib/panel/task-panel/abstract-task-panel.component.d.ts +9 -3
  279. package/lib/panel/task-panel-list/default-task-panel-list/abstract-default-task-list.component.d.ts +5 -2
  280. package/lib/panel/task-panel-list/task-panel-list-pagination/abstract-task-list-pagination.component.d.ts +2 -1
  281. package/lib/panel/task-panel-single/abstract-single-task.component.d.ts +5 -3
  282. package/lib/panel/workflow-panel/abstract-workflow-panel.component.d.ts +3 -1
  283. package/lib/public/factories/public-search-factory.d.ts +3 -0
  284. package/lib/{data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.d.ts → registry/component-registry.service.d.ts} +6 -5
  285. package/lib/registry/front-action-registry.service.d.ts +13 -0
  286. package/lib/registry/public-api.d.ts +2 -0
  287. package/lib/resources/interface/case-get-request-body.d.ts +3 -0
  288. package/lib/resources/interface/event-outcome.d.ts +5 -0
  289. package/lib/routing/routing-builder/routing-builder.service.d.ts +2 -0
  290. package/lib/search/fulltext-search-component/abstract-fulltext-search.component.d.ts +2 -1
  291. package/lib/search/search-component/abstract-search.component.d.ts +2 -1
  292. package/lib/side-menu/content-components/import-net/abstract-import-net.component.d.ts +3 -1
  293. package/lib/side-menu/content-components/injection-tokens.d.ts +1 -0
  294. package/lib/side-menu/content-components/new-case/model/new-case-injection-data.d.ts +2 -1
  295. package/lib/side-menu/content-components/public-api.d.ts +2 -0
  296. package/lib/side-menu/content-components/task-view/model/task-view-injection-data.d.ts +4 -0
  297. package/lib/side-menu/models/side-menu-control.d.ts +0 -2
  298. package/lib/task/services/task-data.service.d.ts +10 -8
  299. package/lib/task-content/field-component-resolver/abstract-field-component-resolver.component.d.ts +7 -3
  300. package/lib/task-content/model/field-type-resource.d.ts +3 -1
  301. package/lib/task-content/services/single-task-content.service.d.ts +2 -2
  302. package/lib/task-content/services/task-content.service.d.ts +20 -23
  303. package/lib/task-content/services/unlimited-task-content.service.d.ts +2 -2
  304. package/lib/task-content/task-content/abstract-task-content.component.d.ts +5 -1
  305. package/lib/utility/navigation-item-default-headers-factory.d.ts +3 -0
  306. package/lib/utility/public-api.d.ts +1 -0
  307. package/lib/view/abstract/netgrif-paginator-intl.d.ts +19 -0
  308. package/lib/view/case-view/components/case-list-paginator/abstract-case-list-paginator.component.d.ts +3 -1
  309. package/lib/view/case-view/components/default-case-list/abstract-default-case-list.component.d.ts +4 -2
  310. package/lib/view/case-view/service/case-view-service.d.ts +5 -5
  311. package/lib/view/public-api.d.ts +1 -0
  312. package/lib/view/task-view/abstract-single-task-view.component.d.ts +9 -7
  313. package/lib/view/workflow-view/abstract-workflow-view.component.d.ts +3 -3
  314. package/package.json +1 -1
  315. package/public-api.d.ts +2 -1
  316. package/src/assets/i18n/de.json +15 -2
  317. package/src/assets/i18n/en.json +15 -2
  318. package/src/assets/i18n/sk.json +15 -2
  319. package/esm2020/lib/data-fields/text-field/dashboard-portal-text-field/dashboard-portal-component-registry.service.mjs +0 -35
  320. package/esm2020/lib/providers/base-filter/base-filter-factory.provider.mjs +0 -24
  321. package/esm2020/lib/providers/case-resource/case-resource-service.provider.mjs +0 -28
  322. package/esm2020/lib/providers/petrinet-resource/petrinet-resource-service.provider.mjs +0 -28
  323. package/esm2020/lib/providers/process-service/process-service.provider.mjs +0 -30
  324. package/esm2020/lib/providers/public-api.mjs +0 -6
  325. package/esm2020/lib/providers/task-resource/task-resource-service.provider.mjs +0 -32
  326. package/lib/providers/base-filter/base-filter-factory.provider.d.ts +0 -14
  327. package/lib/providers/case-resource/case-resource-service.provider.d.ts +0 -14
  328. package/lib/providers/petrinet-resource/petrinet-resource-service.provider.d.ts +0 -14
  329. package/lib/providers/process-service/process-service.provider.d.ts +0 -15
  330. package/lib/providers/public-api.d.ts +0 -5
  331. package/lib/providers/task-resource/task-resource-service.provider.d.ts +0 -16
@@ -27,12 +27,13 @@ import * as i11 from "../../event-queue/services/event-queue.service";
27
27
  import * as i12 from "../../user/services/user-comparator.service";
28
28
  import * as i13 from "../../event/services/event.service";
29
29
  import * as i14 from "../../changed-fields/services/changed-fields.service";
30
+ import * as i15 from "../../actions/services/front-action.service";
30
31
  /**
31
32
  * Handles the loading and updating of data fields and behaviour of
32
33
  * a single Task object managed by a {@link TaskContentService} instance.
33
34
  */
34
35
  export class TaskDataService extends TaskHandlingService {
35
- constructor(_taskState, _translate, _log, _snackBar, _taskResourceService, _fieldConverterService, _taskEvent, _taskOperations, _selectedCaseService, _taskContentService, _afterActionFactory, _eventQueue, _userComparator, _eventService, _changedFieldsService) {
36
+ constructor(_taskState, _translate, _log, _snackBar, _taskResourceService, _fieldConverterService, _taskEvent, _taskOperations, _selectedCaseService, _taskContentService, _afterActionFactory, _eventQueue, _userComparator, _eventService, _changedFieldsService, _frontActionService) {
36
37
  super(_taskContentService, _selectedCaseService);
37
38
  this._taskState = _taskState;
38
39
  this._translate = _translate;
@@ -47,13 +48,10 @@ export class TaskDataService extends TaskHandlingService {
47
48
  this._userComparator = _userComparator;
48
49
  this._eventService = _eventService;
49
50
  this._changedFieldsService = _changedFieldsService;
51
+ this._frontActionService = _frontActionService;
50
52
  this._updateSuccess$ = new Subject();
51
53
  this._dataReloadSubscription = this._taskContentService.taskDataReloadRequest$.subscribe(queuedFrontendAction => {
52
- this.initializeTaskDataFields(this._afterActionFactory.create(success => {
53
- if (success && queuedFrontendAction) {
54
- this._taskContentService.performFrontendAction(queuedFrontendAction);
55
- }
56
- }), true);
54
+ this.initializeTaskDataFields(new AfterAction(), true);
57
55
  });
58
56
  }
59
57
  ngOnDestroy() {
@@ -265,7 +263,7 @@ export class TaskDataService extends TaskHandlingService {
265
263
  }
266
264
  const requestContext = this.createUpdateRequestContext();
267
265
  this._eventQueue.scheduleEvent(new QueuedEvent(() => this.isSetDataRequestStillValid(requestContext.body), nextEvent => {
268
- this.performSetDataRequest(setTaskId, requestContext, afterAction, nextEvent);
266
+ this.performSetDataRequest(setTaskId, requestContext.body, afterAction, nextEvent);
269
267
  }, nextEvent => {
270
268
  this.revertSetDataRequest(requestContext);
271
269
  nextEvent.resolve(false);
@@ -356,12 +354,12 @@ export class TaskDataService extends TaskHandlingService {
356
354
  /**
357
355
  * Performs a `setData` request on the task currently stored in the `taskContent` service
358
356
  * @param setTaskId ID of the task
359
- * @param context context of the `setData` request
357
+ * @param body content of the `setData` request
360
358
  * @param afterAction the action that should be performed after the request is processed
361
359
  * @param nextEvent indicates to the event queue that the next event can be processed
362
360
  */
363
- performSetDataRequest(setTaskId, context, afterAction, nextEvent) {
364
- if (Object.keys(context.body).length === 0) {
361
+ performSetDataRequest(setTaskId, body, afterAction, nextEvent) {
362
+ if (Object.keys(body).length === 0) {
365
363
  this.sendNotification(TaskEvent.SET_DATA, true);
366
364
  afterAction.resolve(true);
367
365
  nextEvent.resolve(true);
@@ -369,7 +367,7 @@ export class TaskDataService extends TaskHandlingService {
369
367
  }
370
368
  this._taskState.startLoading(setTaskId);
371
369
  this._taskState.startUpdating(setTaskId);
372
- this._taskResourceService.setData(this._safeTask.stringId, context.body).pipe(take(1))
370
+ this._taskResourceService.setData(this._safeTask.stringId, body).pipe(take(1))
373
371
  .subscribe((response) => {
374
372
  if (!this.isTaskRelevant(setTaskId)) {
375
373
  this._log.debug('current task changed before the set data response could be received, discarding...');
@@ -380,13 +378,13 @@ export class TaskDataService extends TaskHandlingService {
380
378
  return;
381
379
  }
382
380
  if (response.success) {
383
- this.processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context);
381
+ this.processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, body);
384
382
  }
385
383
  else if (response.error !== undefined) {
386
- this.processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context);
384
+ this.processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, body);
387
385
  }
388
386
  }, error => {
389
- this.processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, context);
387
+ this.processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, body);
390
388
  });
391
389
  }
392
390
  /**
@@ -397,7 +395,7 @@ export class TaskDataService extends TaskHandlingService {
397
395
  * @param nextEvent indicates to the event queue that the next event can be processed
398
396
  * @param body hold the data that was sent in request
399
397
  */
400
- processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context) {
398
+ processUnsuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, body) {
401
399
  if (response.error !== '') {
402
400
  this._snackBar.openErrorSnackBar(this._translate.instant(response.error));
403
401
  }
@@ -411,8 +409,8 @@ export class TaskDataService extends TaskHandlingService {
411
409
  this._changedFieldsService.emitChangedFields(changedFieldsMap);
412
410
  }
413
411
  }
414
- this.revertToPreviousValue(context);
415
- this.clearWaitingForResponseFlag(context.body);
412
+ this.revertToPreviousValue();
413
+ this.clearWaitingForResponseFlag(body);
416
414
  this.updateStateInfo(afterAction, false, setTaskId);
417
415
  nextEvent.resolve(false);
418
416
  this._taskOperations.reload();
@@ -423,15 +421,19 @@ export class TaskDataService extends TaskHandlingService {
423
421
  * @param response the resulting Event outcome of the set data request
424
422
  * @param afterAction the action that should be performed after the request is processed
425
423
  * @param nextEvent indicates to the event queue that the next event can be processed
426
- * @param context hold the data that was sent in request
424
+ * @param body hold the data that was sent in request
427
425
  */
428
- processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, context) {
426
+ processSuccessfulSetDataRequest(setTaskId, response, afterAction, nextEvent, body) {
429
427
  const outcome = response.outcome;
430
428
  const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(outcome);
429
+ const frontActions = this._eventService.parseFrontActionsFromOutcomeTree(outcome);
431
430
  if (Object.keys(changedFieldsMap).length > 0) {
432
431
  this._changedFieldsService.emitChangedFields(changedFieldsMap);
433
432
  }
434
- this.clearWaitingForResponseFlag(context.body);
433
+ if (!!frontActions && frontActions.length > 0) {
434
+ this._frontActionService.runAll(frontActions);
435
+ }
436
+ this.clearWaitingForResponseFlag(body);
435
437
  this._snackBar.openSuccessSnackBar(!!outcome.message ? outcome.message : this._translate.instant('tasks.snackbar.dataSaved'));
436
438
  this.updateStateInfo(afterAction, true, setTaskId);
437
439
  nextEvent.resolve(true);
@@ -444,7 +446,7 @@ export class TaskDataService extends TaskHandlingService {
444
446
  * @param nextEvent indicates to the event queue that the next event can be processed
445
447
  * @param body hold the data that was sent in request
446
448
  */
447
- processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, context) {
449
+ processErroneousSetDataRequest(setTaskId, error, afterAction, nextEvent, body) {
448
450
  this._log.debug('setting task data failed', error);
449
451
  if (!this.isTaskRelevant(setTaskId)) {
450
452
  this._log.debug('current task changed before the get data error could be received');
@@ -454,8 +456,8 @@ export class TaskDataService extends TaskHandlingService {
454
456
  nextEvent.resolve(false);
455
457
  return;
456
458
  }
457
- this.revertToPreviousValue(context);
458
- this.clearWaitingForResponseFlag(context.body);
459
+ this.revertToPreviousValue();
460
+ this.clearWaitingForResponseFlag(body);
459
461
  this._snackBar.openErrorSnackBar(this._translate.instant('tasks.snackbar.failedSave'));
460
462
  this.updateStateInfo(afterAction, false, setTaskId);
461
463
  nextEvent.resolve(false);
@@ -531,10 +533,10 @@ export class TaskDataService extends TaskHandlingService {
531
533
  sendNotification(event, success) {
532
534
  this._taskEvent.publishTaskEvent(createTaskEventNotification(this._safeTask, event, success));
533
535
  }
534
- revertToPreviousValue(context) {
536
+ revertToPreviousValue() {
535
537
  this._safeTask.dataGroups.forEach(dataGroup => {
536
538
  dataGroup.fields.forEach(field => {
537
- if (field.initialized && field.valid && Object.keys(context.previousValues).includes(field.stringId)) {
539
+ if (field.initialized && field.valid && field.changed) {
538
540
  field.revertToPreviousValue();
539
541
  }
540
542
  });
@@ -548,7 +550,7 @@ export class TaskDataService extends TaskHandlingService {
548
550
  });
549
551
  }
550
552
  }
551
- TaskDataService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TaskDataService, deps: [{ token: i1.TaskRequestStateService }, { token: i2.TranslateService }, { token: i3.LoggerService }, { token: i4.SnackBarService }, { token: i5.TaskResourceService }, { token: i6.FieldConverterService }, { token: i7.TaskEventService }, { token: NAE_TASK_OPERATIONS }, { token: i8.SelectedCaseService, optional: true }, { token: i9.TaskContentService }, { token: i10.CallChainService }, { token: i11.EventQueueService }, { token: i12.UserComparatorService }, { token: i13.EventService }, { token: i14.ChangedFieldsService }], target: i0.ɵɵFactoryTarget.Injectable });
553
+ TaskDataService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TaskDataService, deps: [{ token: i1.TaskRequestStateService }, { token: i2.TranslateService }, { token: i3.LoggerService }, { token: i4.SnackBarService }, { token: i5.TaskResourceService }, { token: i6.FieldConverterService }, { token: i7.TaskEventService }, { token: NAE_TASK_OPERATIONS }, { token: i8.SelectedCaseService, optional: true }, { token: i9.TaskContentService }, { token: i10.CallChainService }, { token: i11.EventQueueService }, { token: i12.UserComparatorService }, { token: i13.EventService }, { token: i14.ChangedFieldsService }, { token: i15.FrontActionService }], target: i0.ɵɵFactoryTarget.Injectable });
552
554
  TaskDataService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TaskDataService });
553
555
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: TaskDataService, decorators: [{
554
556
  type: Injectable
@@ -557,5 +559,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
557
559
  args: [NAE_TASK_OPERATIONS]
558
560
  }] }, { type: i8.SelectedCaseService, decorators: [{
559
561
  type: Optional
560
- }] }, { type: i9.TaskContentService }, { type: i10.CallChainService }, { type: i11.EventQueueService }, { type: i12.UserComparatorService }, { type: i13.EventService }, { type: i14.ChangedFieldsService }]; } });
561
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2svc2VydmljZXMvdGFzay1kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBYSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFVdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFOUUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXpFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBRzdHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFRbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFOUY7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGVBQWdCLFNBQVEsbUJBQW1CO0lBS3BELFlBQXNCLFVBQW1DLEVB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LENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDJCQUEyQixDQUFDLElBQTRCO1FBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEcsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OzZHQTNrQlEsZUFBZSw2UEFZSixtQkFBbUI7aUhBWjlCLGVBQWU7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVTs7MEJBYU0sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9tb2RlbHMvY2hhbmdlZC1maWVsZHMnO1xuaW1wb3J0IHtUYXNrQ29udGVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlfSBmcm9tICcuL3Rhc2stcmVxdWVzdC1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0xvZ2dlclNlcnZpY2V9IGZyb20gJy4uLy4uL2xvZ2dlci9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSAnLi4vLi4vc25hY2stYmFyL3NlcnZpY2VzL3NuYWNrLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1Jlc291cmNlU2VydmljZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2VuZ2luZS1lbmRwb2ludC90YXNrLXJlc291cmNlLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWVsZENvbnZlcnRlclNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy9maWVsZC1jb252ZXJ0ZXIuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tTZXREYXRhUmVxdWVzdEJvZHl9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvdGFzay1zZXQtZGF0YS1yZXF1ZXN0LWJvZHknO1xuaW1wb3J0IHtUYXNrSGFuZGxpbmdTZXJ2aWNlfSBmcm9tICcuL3Rhc2staGFuZGxpbmctc2VydmljZSc7XG5pbXBvcnQge05BRV9UQVNLX09QRVJBVElPTlN9IGZyb20gJy4uL21vZGVscy90YXNrLW9wZXJhdGlvbnMtaW5qZWN0aW9uLXRva2VuJztcbmltcG9ydCB7VGFza09wZXJhdGlvbnN9IGZyb20gJy4uL2ludGVyZmFjZXMvdGFzay1vcGVyYXRpb25zJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2V9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7RmlsZUZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9maWxlLWZpZWxkL21vZGVscy9maWxlLWZpZWxkJztcbmltcG9ydCB7U2VsZWN0ZWRDYXNlU2VydmljZX0gZnJvbSAnLi9zZWxlY3RlZC1jYXNlLnNlcnZpY2UnO1xuaW1wb3J0IHtGaWxlTGlzdEZpZWxkfSBmcm9tICcuLi8uLi9kYXRhLWZpZWxkcy9maWxlLWxpc3QtZmllbGQvbW9kZWxzL2ZpbGUtbGlzdC1maWVsZCc7XG5pbXBvcnQge2NyZWF0ZVRhc2tFdmVudE5vdGlmaWNhdGlvbn0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L21vZGVsL3Rhc2stZXZlbnQtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7VGFza0V2ZW50fSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudCc7XG5pbXBvcnQge1Rhc2tFdmVudFNlcnZpY2V9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9zZXJ2aWNlcy90YXNrLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtEYXRhRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9hYnN0cmFjdC1kYXRhLWZpZWxkJztcbmltcG9ydCB7Q2FsbENoYWluU2VydmljZX0gZnJvbSAnLi4vLi4vdXRpbGl0eS9jYWxsLWNoYWluL2NhbGwtY2hhaW4uc2VydmljZSc7XG5pbXBvcnQge3Rha2V9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RHluYW1pY0VudW1lcmF0aW9uRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2VudW1lcmF0aW9uLWZpZWxkL21vZGVscy9keW5hbWljLWVudW1lcmF0aW9uLWZpZWxkJztcbmltcG9ydCB7RGF0YUdyb3VwfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvaW50ZXJmYWNlL2RhdGEtZ3JvdXBzJztcbmltcG9ydCB7RXZlbnRRdWV1ZVNlcnZpY2V9IGZyb20gJy4uLy4uL2V2ZW50LXF1ZXVlL3NlcnZpY2VzL2V2ZW50LXF1ZXVlLnNlcnZpY2UnO1xuaW1wb3J0IHtRdWV1ZWRFdmVudH0gZnJvbSAnLi4vLi4vZXZlbnQtcXVldWUvbW9kZWwvcXVldWVkLWV2ZW50JztcbmltcG9ydCB7QWZ0ZXJBY3Rpb259IGZyb20gJy4uLy4uL3V0aWxpdHkvY2FsbC1jaGFpbi9hZnRlci1hY3Rpb24nO1xuaW1wb3J0IHtVc2VyQ29tcGFyYXRvclNlcnZpY2V9IGZyb20gJy4uLy4uL3VzZXIvc2VydmljZXMvdXNlci1jb21wYXJhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0fSBmcm9tICcuLi9tb2RlbHMvdGFzay1zZXQtZGF0YS1yZXF1ZXN0LWNvbnRleHQnO1xuaW1wb3J0IHtFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2V9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZSc7XG5pbXBvcnQge0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0NoYW5nZWRGaWVsZHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jaGFuZ2VkLWZpZWxkcy9zZXJ2aWNlcy9jaGFuZ2VkLWZpZWxkcy5zZXJ2aWNlJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc01hcH0gZnJvbSAnLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXAnO1xuaW1wb3J0IHtUYXNrRmllbGRzfSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1maWVsZHMnO1xuaW1wb3J0IHtFbnVtZXJhdGlvbkZpZWxkfSBmcm9tIFwiLi4vLi4vZGF0YS1maWVsZHMvZW51bWVyYXRpb24tZmllbGQvbW9kZWxzL2VudW1lcmF0aW9uLWZpZWxkXCI7XG5cbi8qKlxuICogSGFuZGxlcyB0aGUgbG9hZGluZyBhbmQgdXBkYXRpbmcgb2YgZGF0YSBmaWVsZHMgYW5kIGJlaGF2aW91ciBvZlxuICogYSBzaW5nbGUgVGFzayBvYmplY3QgbWFuYWdlZCBieSBhIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGluc3RhbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFza0RhdGFTZXJ2aWNlIGV4dGVuZHMgVGFza0hhbmRsaW5nU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBwcm90ZWN0ZWQgX3VwZGF0ZVN1Y2Nlc3MkOiBTdWJqZWN0PGJvb2xlYW4+O1xuICAgIHByb3RlY3RlZCBfZGF0YVJlbG9hZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIF90YXNrU3RhdGU6IFRhc2tSZXF1ZXN0U3RhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfbG9nOiBMb2dnZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfc25hY2tCYXI6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tSZXNvdXJjZVNlcnZpY2U6IFRhc2tSZXNvdXJjZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9maWVsZENvbnZlcnRlclNlcnZpY2U6IEZpZWxkQ29udmVydGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3Rhc2tFdmVudDogVGFza0V2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBASW5qZWN0KE5BRV9UQVNLX09QRVJBVElPTlMpIHByb3RlY3RlZCBfdGFza09wZXJhdGlvbnM6IFRhc2tPcGVyYXRpb25zLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIF9zZWxlY3RlZENhc2VTZXJ2aWNlOiBTZWxlY3RlZENhc2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIF90YXNrQ29udGVudFNlcnZpY2U6IFRhc2tDb250ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2FmdGVyQWN0aW9uRmFjdG9yeTogQ2FsbENoYWluU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50UXVldWU6IEV2ZW50UXVldWVTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfdXNlckNvbXBhcmF0b3I6IFVzZXJDb21wYXJhdG9yU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2V2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfY2hhbmdlZEZpZWxkc1NlcnZpY2U6IENoYW5nZWRGaWVsZHNTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgICAgICB0aGlzLl9kYXRhUmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tEYXRhUmVsb2FkUmVxdWVzdCQuc3Vic2NyaWJlKHF1ZXVlZEZyb250ZW5kQWN0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKHRoaXMuX2FmdGVyQWN0aW9uRmFjdG9yeS5jcmVhdGUoc3VjY2VzcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgJiYgcXVldWVkRnJvbnRlbmRBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnBlcmZvcm1Gcm9udGVuZEFjdGlvbihxdWV1ZWRGcm9udGVuZEFjdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5fZGF0YVJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICBpZiAodGhpcy5pc1Rhc2tQcmVzZW50KCkgJiYgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IGZpZWxkLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VjY2VzcyBvciBmYWlsdXJlIG9mIGJhY2tlbmRcbiAgICAgKiBjYWxscyBpbiBbdXBkYXRlVGFza0RhdGFGaWVsZHNde0BsaW5rIFRhc2tEYXRhU2VydmljZSN1cGRhdGVUYXNrRGF0YUZpZWxkc30gbWV0aG9kLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdXBkYXRlU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cGRhdGVTdWNjZXNzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgRGF0YSBGaWVsZHMgb2YgYW4gdW5pbml0aWFsaXplZCBUYXNrIGZyb20gYmFja2VuZFxuICAgICAqIGFuZCBwb3B1bGF0ZXMgdGhlIFRhc2sgbWFuYWdlZCBieSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBvYmplY3RzLlxuICAgICAqXG4gICAgICogQmV3YXJlIHRoYXQgaWYgdGhlIFRhc2sgaGFzIHNvbWUgZGF0YSBhbHJlYWR5IGxvYWRlZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZ1xuICAgICAqIGFuZCBvbmx5IHBhc3NlcyBgdHJ1ZWAgdG8gdGhlIGBhZnRlckFjdGlvbmAgYXJndW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdGFzayBoZWxkIHdpdGhpbiB0aGUge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gY2hhbmdlcyBiZWZvcmUgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgaWdub3JlZFxuICAgICAqIGFuZCB0aGUgYGFmdGVyQWN0aW9uYCB3aWxsIG5vdCBiZSBleGVjdXRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiBpZiB0aGUgcmVxdWVzdCBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IGVtaXRzIGB0cnVlYCBpbnRvIHRoZSBTdWJqZWN0LCBvdGhlcndpc2UgYGZhbHNlYCB3aWxsIGJlIGVtaXR0ZWRcbiAgICAgKiBAcGFyYW0gZm9yY2Ugc2V0IHRvIGB0cnVlYCBpZiB5b3UgbmVlZCBmb3JjZSByZWxvYWQgb2YgYWxsIHRhc2sgZGF0YVxuICAgICAqL1xuICAgIHB1YmxpYyBpbml0aWFsaXplVGFza0RhdGFGaWVsZHMoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uID0gbmV3IEFmdGVyQWN0aW9uKCksIGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1Rhc2tQcmVzZW50KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1HZXREYXRhUmVxdWVzdChhZnRlckFjdGlvbiwgZm9yY2UsIG5leHRFdmVudCk7XG4gICAgICAgICAgICB9LCBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgZ2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGZvcmNlIHNldCB0byBgdHJ1ZWAgaWYgeW91IG5lZWQgZm9yY2UgcmVsb2FkIG9mIGFsbCB0YXNrIGRhdGFcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBlcmZvcm1HZXREYXRhUmVxdWVzdChhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sIGZvcmNlOiBib29sZWFuLCBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24oVGFza0V2ZW50LkdFVF9EQVRBLCB0cnVlKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5uZXh0KHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBnb3R0ZW5UYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0TG9hZGluZyhnb3R0ZW5UYXNrSWQpO1xuXG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2UuZ2V0RGF0YShnb3R0ZW5UYXNrSWQpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKGRhdGFHcm91cHMgPT4ge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3VjY2Vzc2Z1bEdldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZCwgZGF0YUdyb3VwcywgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCk7XG4gICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9uZW91c0dldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZCwgZXJyb3IsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBzdWNjZXNzZnVsIG91dGNvbWUgb2YgYSBgZ2V0RGF0YWAgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBnb3R0ZW5UYXNrSWQgdGhlIElEIG9mIHRoZSB0YXNrIHdob3NlIGRhdGEgd2FzIHJlcXVlc3RlZFxuICAgICAqIEBwYXJhbSBkYXRhR3JvdXBzIHRoZSByZXR1cm5lZCBkYXRhIGdyb3VwcyBvZiB0aGUgdGFza1xuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NTdWNjZXNzZnVsR2V0RGF0YVJlcXVlc3QoZ290dGVuVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUdyb3VwczogQXJyYXk8RGF0YUdyb3VwPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoZ290dGVuVGFza0lkKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIGdldCBkYXRhIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkcyA9IHt9O1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4ID0ge307XG5cbiAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3VwcyA9IGRhdGFHcm91cHM7XG4gICAgICAgIGlmIChkYXRhR3JvdXBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmluZm8oJ1Rhc2sgaGFzIG5vIGRhdGEgJyArIHRoaXMuX3NhZmVUYXNrKTtcbiAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID0gMDtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRdID0ge30gYXMgVGFza0ZpZWxkcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbdGhpcy5fc2FmZVRhc2suY2FzZUlkXSA9IFt0aGlzLl9zYWZlVGFzay5zdHJpbmdJZF07XG4gICAgICAgICAgICBkYXRhR3JvdXBzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFHcm91cFBhcmVudENhc2VJZDogc3RyaW5nID0gZ3JvdXAucGFyZW50Q2FzZUlkID09PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlVGFzay5jYXNlSWQgOiBncm91cC5wYXJlbnRDYXNlSWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50VGFza0lkOiBzdHJpbmcgPSBncm91cC5wYXJlbnRUYXNrSWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkIDogZ3JvdXAucGFyZW50VGFza0lkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRyYW5zaXRpb25JZDogc3RyaW5nID0gZ3JvdXAucGFyZW50VHJhbnNpdGlvbklkID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay50cmFuc2l0aW9uSWQgOiBncm91cC5wYXJlbnRUcmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGFHcm91cFBhcmVudENhc2VJZCAhPT0gdGhpcy5fc2FmZVRhc2suY2FzZUlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkc1tkYXRhR3JvdXBQYXJlbnRDYXNlSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0gPSBbZ3JvdXAucGFyZW50VGFza0lkXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5wdXNoKGdyb3VwLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFHcm91cFBhcmVudENhc2VJZCA9PT0gdGhpcy5fc2FmZVRhc2suY2FzZUlkXG4gICAgICAgICAgICAgICAgICAgICYmIHBhcmVudFRhc2tJZCAhPT0gdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRcbiAgICAgICAgICAgICAgICAgICAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5pbmNsdWRlcyhwYXJlbnRUYXNrSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXS5wdXNoKGdyb3VwLnBhcmVudFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChncm91cC5maWVsZHMubGVuZ3RoID4gMCAmJiAhdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXSA9IHt9IGFzIFRhc2tGaWVsZHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChncm91cC5maWVsZHMubGVuZ3RoID4gMCAmJiAhdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3BhcmVudFRhc2tJZF0uZmllbGRzID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGdyb3VwLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLnRyYW5zaXRpb25JZCA9IHBhcmVudFRyYW5zaXRpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWVDaGFuZ2VzKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBEeW5hbWljRW51bWVyYXRpb25GaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUYXNrRGF0YUZpZWxkcyh0aGlzLl9hZnRlckFjdGlvbkZhY3RvcnkuY3JlYXRlKGJvb2wgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUYXNrRGF0YUZpZWxkcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIEZpbGVGaWVsZCB8fCBmaWVsZCBpbnN0YW5jZW9mIEZpbGVMaXN0RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmNoYW5nZWRGaWVsZHMkLnN1YnNjcmliZSgoY2hhbmdlOiBDaGFuZ2VkRmllbGRzTWFwKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlZEZpZWxkc1NlcnZpY2UuZW1pdENoYW5nZWRGaWVsZHMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID0gZ3JvdXAuZmllbGRzLmxlbmd0aCA6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplICs9IGdyb3VwLmZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgdHJ1ZSk7XG4gICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZS5uZXh0KHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpO1xuICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIubmV4dCh0aGlzLl90YXNrQ29udGVudFNlcnZpY2UuJHNob3VsZENyZWF0ZUNvdW50ZXIuZ2V0VmFsdWUoKSArIDEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvbmVvdXMgb3V0Y29tZSBvZiBhIGBnZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIGdvdHRlblRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgcmVxdWVzdGVkXG4gICAgICogQHBhcmFtIGVycm9yIHRoZSByZXR1cm5lZCBlcnJvclxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NFcnJvbmVvdXNHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSB8IEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoZ290dGVuVGFza0lkKTtcbiAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdnZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGdvdHRlblRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlICYmIGVycm9yLnN0YXR1cyA9PT0gNTAwICYmIGVycm9yLmVycm9yLm1lc3NhZ2UgJiYgZXJyb3IuZXJyb3IubWVzc2FnZS5zdGFydHNXaXRoKCdDb3VsZCBub3QgZmluZCB0YXNrIHdpdGggaWQnKSkge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3Blbldhcm5pbmdTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIubm9Mb25nZXJFeGlzdHMnKSk7XG4gICAgICAgICAgICB0aGlzLl90YXNrT3BlcmF0aW9ucy5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudChlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0JhcihgJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIubm9Hcm91cCcpfVxuICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFzay50aXRsZX0gJHt0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkVG9Mb2FkJyl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgZmFsc2UpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxlY3RzIGFsbCBjaGFuZ2VkIGRhdGEgZmllbGRzIGFuZCBub3RpZmllcyB0aGUgYmFja2VuZCBvZiB0aGUgY2hhbmdlcy5cbiAgICAgKlxuICAgICAqIElmIHRoZSByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgY2xlYXJzIHRoZSBbY2hhbmdlZF17QGxpbmsgRGF0YUZpZWxkI2NoYW5nZWR9IGZsYWcgb24gYWxsIGRhdGEgZmllbGRzIHRoYXQgd2VyZSBhIHBhcnQgb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBhbmQgZW1pdHMgYSB7QGxpbmsgQ2hhbmdlZEZpZWxkc30gb2JqZWN0IGludG8gdGhpcyBvYmplY3QncyBbY2hhbmdlZEZpZWxkcyRde0BsaW5rIFRhc2tEYXRhU2VydmljZSNjaGFuZ2VkRmllbGRzJH0gc3RyZWFtLlxuICAgICAqXG4gICAgICogSWYgdGhlIHRhc2sgaGVsZCB3aXRoaW4gdGhlIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGNoYW5nZXMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGlnbm9yZWRcbiAgICAgKiBhbmQgdGhlIGBhZnRlckFjdGlvbmAgd2lsbCBub3QgYmUgZXhlY3V0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgdGhlIHJlcXVlc3QgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBlbWl0cyBgdHJ1ZWAgaW50byB0aGUgU3ViamVjdCwgb3RoZXJ3aXNlIGBmYWxzZWAgd2lsbCBiZSBlbWl0dGVkXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVRhc2tEYXRhRmllbGRzKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnVGFzayBpcyBub3QgcHJlc2VudC4gVXBkYXRlIHJlcXVlc3QgaWdub3JlZC4nKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3NhZmVUYXNrLnVzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgaXMgbm90IGFzc2lnbmVkLi4uJyk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNldFRhc2tJZCA9IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkO1xuXG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA8PSAwKSB7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdENvbnRleHQgPSB0aGlzLmNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk7XG5cbiAgICAgICAgdGhpcy5fZXZlbnRRdWV1ZS5zY2hlZHVsZUV2ZW50KG5ldyBRdWV1ZWRFdmVudChcbiAgICAgICAgICAgICgpID0+IHRoaXMuaXNTZXREYXRhUmVxdWVzdFN0aWxsVmFsaWQocmVxdWVzdENvbnRleHQuYm9keSksXG4gICAgICAgICAgICBuZXh0RXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybVNldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgcmVxdWVzdENvbnRleHQsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRTZXREYXRhUmVxdWVzdChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICogR29lcyBvdmVyIGFsbCB0aGUgZGF0YSBmaWVsZHMgaW4gdGhlIG1hbmFnZWQgVGFzayBhbmQgaWYgdGhleSBhcmUgdmFsaWQgYW5kIGNoYW5nZWQgYWRkcyB0aGVtIHRvIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQge1xuICAgICAgICBjb25zdCBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0ID0ge1xuICAgICAgICAgICAgYm9keToge30sXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlczoge31cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZpbHRlcihkYXRhR3JvdXAgPT4gZGF0YUdyb3VwLnBhcmVudFRhc2tJZCA9PT0gdW5kZWZpbmVkKS5mb3JFYWNoKGRhdGFHcm91cCA9PiB7XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVt0aGlzLl90YXNrLnN0cmluZ0lkXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCB0aGlzLl90YXNrLnN0cmluZ0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZmlsdGVyKGRhdGFHcm91cCA9PiBkYXRhR3JvdXAucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhR3JvdXAuZmllbGRzLnNvbWUoZmllbGQgPT4gdGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVtkYXRhR3JvdXAucGFyZW50VGFza0lkXSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCBkYXRhR3JvdXAucGFyZW50VGFza0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhZGRGaWVsZFRvU2V0RGF0YVJlcXVlc3RCb2R5KGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIHRhc2tJZDogc3RyaW5nLCBmaWVsZDogRGF0YUZpZWxkPGFueT4pOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC5ib2R5W3Rhc2tJZF1bZmllbGQuc3RyaW5nSWRdID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGZpZWxkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9maWVsZENvbnZlcnRlclNlcnZpY2UuZm9ybWF0VmFsdWVGb3JCYWNrZW5kKGZpZWxkLCBmaWVsZC52YWx1ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZC5wcmV2aW91c1ZhbHVlO1xuICAgICAgICBmaWVsZC5jaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbntcbiAgICAgICAgcmV0dXJuIChmaWVsZCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQpICYmIChmaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdhdXRvY29tcGxldGUnKSAmJiAhZmllbGQudmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpZWxkIHRoZSBjaGVja2VkIGZpZWxkXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgZmllbGQgd2FzIHVwZGF0ZWQgb24gZnJvbnRlbmQgYW5kIHRodXMgdGhlIGJhY2tlbmQgc2hvdWxkIGJlIG5vdGlmaWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhc0ZpZWxkVXBkYXRlZChmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZC5pbml0aWFsaXplZCAmJiBmaWVsZC5jaGFuZ2VkICYmIChmaWVsZC52YWxpZCB8fCBmaWVsZC5zZW5kSW52YWxpZFZhbHVlcykgJiYgKCF0aGlzLmlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGNvdWxkIHN0aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgbG9nZ2VkIHVzZXJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1NldERhdGFSZXF1ZXN0U3RpbGxWYWxpZChyZXF1ZXN0OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2sudXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGhpcy5fc2FmZVRhc2sudXNlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrSWRzSW5SZXF1ZXN0OiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMocmVxdWVzdCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0lkIG9mIHRhc2tJZHNJblJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCkuaW5jbHVkZXModGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihgVGFzayBpZCAke3Rhc2tJZH0gaXMgbm90IHByZXNlbnQgaW4gdGFzayBmaWVsZHMgaW5kZXhgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkc09mUmVxdWVzdCA9IE9iamVjdC5rZXlzKHJlcXVlc3RbdGFza0lkXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHNPZlJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGFza0lkXS5maWVsZHNbZmllbGRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBVbmV4cGVjdGVkIHN0YXRlLiBEYXRhZmllbGQgJHtmaWVsZElkfSBvZiB0YXNrICR7dGFza0lkXG4gICAgICAgICAgICAgICAgICAgIH0gaW4gc2V0RGF0YSByZXF1ZXN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSB0YXNrLmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZmllbGQuYmVoYXZpb3IuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKGBGaWVsZCAke2ZpZWxkSWR9LCB3YXMgbWVhbnQgdG8gYmUgc2V0IHRvXG4gICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdFt0YXNrSWRdW2ZpZWxkSWRdKVxuICAgICAgICAgICAgICAgICAgICB9LCBidXQgaXMgbm8gbG9uZXIgZWRpdGFibGUuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgc2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIElEIG9mIHRoZSB0YXNrXG4gICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCBvZiB0aGUgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29udGV4dC5ib2R5KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuU0VUX0RBVEEsIHRydWUpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0TG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RhcnRVcGRhdGluZyhzZXRUYXNrSWQpO1xuXG4gICAgICAgIHRoaXMuX3Rhc2tSZXNvdXJjZVNlcnZpY2Uuc2V0RGF0YSh0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCwgY29udGV4dC5ib2R5KS5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KHNldFRhc2tJZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdjdXJyZW50IHRhc2sgY2hhbmdlZCBiZWZvcmUgdGhlIHNldCBkYXRhIHJlc3BvbnNlIGNvdWxkIGJlIHJlY2VpdmVkLCBkaXNjYXJkaW5nLi4uJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkLCByZXNwb25zZSwgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Vuc3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgcmVzcG9uc2UsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvbmVvdXNTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIGVycm9yLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBjb250ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiB1bnN1Y2Nlc3NmdWwgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXN1bHRpbmcgRXZlbnQgb3V0Y29tZSBvZiB0aGUgc2V0IGRhdGEgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGJvZHkgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Vuc3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6IEV2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvciAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KHJlc3BvbnNlLmVycm9yKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkU2F2ZScpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2Uub3V0Y29tZSkge1xuICAgICAgICAgICAgY29uc3Qgb3V0Y29tZSA9IHJlc3BvbnNlLm91dGNvbWU7XG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzTWFwOiBDaGFuZ2VkRmllbGRzTWFwID0gdGhpcy5fZXZlbnRTZXJ2aWNlLnBhcnNlQ2hhbmdlZEZpZWxkc0Zyb21PdXRjb21lVHJlZShvdXRjb21lKTtcblxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNoYW5nZWRGaWVsZHNNYXApLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldmVydFRvUHJldmlvdXNWYWx1ZShjb250ZXh0KTtcbiAgICAgICAgdGhpcy5jbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoY29udGV4dC5ib2R5KTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIGZhbHNlLCBzZXRUYXNrSWQpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIHN1Y2Nlc3NmdWwgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXN1bHRpbmcgRXZlbnQgb3V0Y29tZSBvZiB0aGUgc2V0IGRhdGEgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGNvbnRleHQgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1N1Y2Nlc3NmdWxTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RXZlbnQ6IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgY29uc3Qgb3V0Y29tZSA9IHJlc3BvbnNlLm91dGNvbWU7XG4gICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWUpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VkRmllbGRzTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyV2FpdGluZ0ZvclJlc3BvbnNlRmxhZyhjb250ZXh0LmJvZHkpO1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuU3VjY2Vzc1NuYWNrQmFyKCEhb3V0Y29tZS5tZXNzYWdlID8gb3V0Y29tZS5tZXNzYWdlIDogdGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmRhdGFTYXZlZCcpKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIHRydWUsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhbiBlcnJvbmVvdXMgb3V0Y29tZSBvZiBhIGBzZXREYXRhYCByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHRhc2sgd2hvc2UgZGF0YSB3YXMgc2V0XG4gICAgICogQHBhcmFtIGVycm9yIHRoZSByZXR1cm5lZCBlcnJvclxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgYWN0aW9uIHRoYXQgc2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciB0aGUgcmVxdWVzdCBpcyBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gbmV4dEV2ZW50IGluZGljYXRlcyB0byB0aGUgZXZlbnQgcXVldWUgdGhhdCB0aGUgbmV4dCBldmVudCBjYW4gYmUgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIGJvZHkgaG9sZCB0aGUgZGF0YSB0aGF0IHdhcyBzZW50IGluIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0Vycm9uZW91c1NldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fbG9nLmRlYnVnKCdzZXR0aW5nIHRhc2sgZGF0YSBmYWlsZWQnLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KHNldFRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSBlcnJvciBjb3VsZCBiZSByZWNlaXZlZCcpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoY29udGV4dCk7XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGNvbnRleHQuYm9keSk7XG4gICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5mYWlsZWRTYXZlJykpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5mbyhhZnRlckFjdGlvbiwgZmFsc2UsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJ0cyB0aGUgZWZmZWN0cyBvZiBhIGZhaWxlZCBgc2V0RGF0YWAgcmVxdWVzdCwgc28gdGhhdCB0aGUgdXNlciBzZWVzIGN1cnJlbnQgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBmYWlsZWQgcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZXZlcnRTZXREYXRhUmVxdWVzdChjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0KSB7XG4gICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uIGNvdWxkIGJlIGltcHJvdmVkIGlmIHdlIGhhZCBhIG1hcCBvZiBhbGwgdGhlIGRhdGEgZmllbGRzIGluIGEgdGFza1xuICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gT2JqZWN0LmtleXMoY29udGV4dC5ib2R5KS5sZW5ndGg7XG4gICAgICAgIGxldCBmb3VuZENvdW50ID0gMDtcblxuICAgICAgICBmb3IgKGNvbnN0IGRhdGFncm91cCBvZiB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGRhdGFncm91cC5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuYm9keVtmaWVsZC5zdHJpbmdJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLmZvcm1hdFZhbHVlRm9yQmFja2VuZChmaWVsZCwgZmllbGQudmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmJvZHlbZmllbGQuc3RyaW5nSWRdLnZhbHVlKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZVdpdGhvdXRDaGFuZ2UoY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvdW5kQ291bnQrKztcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb3VudCA9PT0gdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBJbnZhbGlkIHN0YXRlLiBTb21lIGRhdGEgZmllbGRzIG9mIHRhc2sgJHt0aGlzLl9zYWZlVGFzay5zdHJpbmdJZH0sIGFyZSBubyBsb25nZXIgcHJlc2VudCBpbiBpdCFgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0aGUgdmFsdWVzIHRoYXQgYXJlIGluIHRoZSBiYWNrZW5kIGNvbXBhdGlibGUgZm9ybWF0IGFzIGdpdmVuIGJ5IHRoZSB7QGxpbmsgRmllbGRDb252ZXJ0ZXJTZXJ2aWNlfVxuICAgICAqIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUsIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gY3VycmVudCB0aGUgY3VycmVudCB2YWx1ZSAoY2FuIGFsc28gYmUgY2FsbGVkIGB2YWx1ZTFgIG9yIGBsZWZ0YClcbiAgICAgKiBAcGFyYW0gb2xkIHRoZSBuZXcgdmFsdWUgKGNhbiBhbHNvIGJlIGNhbGxlZCBgdmFsdWUyYCBvciBgcmlnaHRgKVxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSB0aGUgc2FtZSBhbmQgYGZhbHNlYCBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY29tcGFyZUJhY2tlbmRGb3JtYXR0ZWRGaWVsZFZhbHVlcyhjdXJyZW50LCBvbGQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShvbGQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGFyZ3VtZW50cyEgQ2Fubm90IGNvbXBhcmUgYXJyYXkgdmFsdWUgdG8gbm9uLWFycmF5IHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCAhPT0gb2xkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZXZlcnkoKHZhbHVlLCBpbmRleCkgPT4gb2xkW2luZGV4XSA9PT0gdmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGN1cnJlbnQgPT09IG9sZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICpcbiAgICAgKiBzdG9wcyBsb2FkaW5nIGFuZCB1cGRhdGluZyBpbmRpY2F0b3JzLCBhbmQgZW1pdHMgdGhlIGByZXN1bHRgIHZhbHVlXG4gICAgICogdG8gYm90aCB0aGUgYGFmdGVyQWN0aW9uYCBhbmQgW191cGRhdGVTdWNjZXNzJF17QGxpbmsgVGFza0RhdGFTZXJ2aWNlI191cGRhdGVTdWNjZXNzJH0gc3RyZWFtcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhZnRlckFjdGlvbiB0aGUgY2FsbCBjaGFpbiBzdGVhbSBvZiB0aGUgdXBkYXRlIGRhdGEgbWV0aG9kXG4gICAgICogQHBhcmFtIHJlc3VsdCByZXN1bHQgb2YgdGhlIHVwZGF0ZSBkYXRhIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUge0BsaW5rIFRhc2t9LCB3aG8ncyBzdGF0ZSBzaG91bGQgYmUgdXBkYXRlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCB1cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCByZXN1bHQ6IGJvb2xlYW4sIHNldFRhc2tJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcFVwZGF0aW5nKHNldFRhc2tJZCk7XG4gICAgICAgIGlmICh0aGlzLl91cGRhdGVTdWNjZXNzJC5vYnNlcnZlcnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdWNjZXNzJC5uZXh0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5TRVRfREFUQSwgcmVzdWx0KTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1Ymxpc2hlcyBhIGdldC9zZXQgZGF0YSBub3RpZmljYXRpb24gdG8gdGhlIHtAbGluayBUYXNrRXZlbnRTZXJ2aWNlfVxuICAgICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdGhhdCBvY2N1cnJlZCB0byB0aGUgdGFza1xuICAgICAqIEBwYXJhbSBzdWNjZXNzIHdoZXRoZXIgdGhlIGdldC9zZXQgZGF0YSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgb3Igbm90XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHNlbmROb3RpZmljYXRpb24oZXZlbnQ6IFRhc2tFdmVudC5HRVRfREFUQSB8IFRhc2tFdmVudC5TRVRfREFUQSwgc3VjY2VzczogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrRXZlbnQucHVibGlzaFRhc2tFdmVudChjcmVhdGVUYXNrRXZlbnROb3RpZmljYXRpb24odGhpcy5fc2FmZVRhc2ssIGV2ZW50LCBzdWNjZXNzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXZlcnRUb1ByZXZpb3VzVmFsdWUoY29udGV4dDogVGFza1NldERhdGFSZXF1ZXN0Q29udGV4dCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGRhdGFHcm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVkICYmIGZpZWxkLnZhbGlkICYmIE9iamVjdC5rZXlzKGNvbnRleHQucHJldmlvdXNWYWx1ZXMpLmluY2x1ZGVzKGZpZWxkLnN0cmluZ0lkKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5yZXZlcnRUb1ByZXZpb3VzVmFsdWUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhcldhaXRpbmdGb3JSZXNwb25zZUZsYWcoYm9keTogVGFza1NldERhdGFSZXF1ZXN0Qm9keSkge1xuICAgICAgICBPYmplY3Qua2V5cyhib2R5KS5mb3JFYWNoKHRhc2tJZCA9PiB7XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhib2R5W3Rhc2tJZF0pLmZvckVhY2goZmllbGRJZCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFt0YXNrSWRdLmZpZWxkc1tmaWVsZElkXS53YWl0aW5nRm9yUmVzcG9uc2UgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
562
+ }] }, { type: i9.TaskContentService }, { type: i10.CallChainService }, { type: i11.EventQueueService }, { type: i12.UserComparatorService }, { type: i13.EventService }, { type: i14.ChangedFieldsService }, { type: i15.FrontActionService }]; } });
563
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZXRncmlmLWNvbXBvbmVudHMtY29yZS9zcmMvbGliL3Rhc2svc2VydmljZXMvdGFzay1kYXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQWEsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBYSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFVdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFFOUUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBRXpFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN2RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFJOUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNFQUFzRSxDQUFDO0FBRzdHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFRbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRzlGOzs7R0FHRztBQUVILE1BQU0sT0FBTyxlQUFnQixTQUFRLG1CQUFtQjtJQUtwRCxZQUFzQixVQUFtQyxF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SUFFTywyQkFBMkIsQ0FBQyxJQUE0QjtRQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1lBQ2hHLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzs2R0E1a0JRLGVBQWUsNlBBWUosbUJBQW1CO2lIQVo5QixlQUFlOzRGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQWFNLE1BQU07MkJBQUMsbUJBQW1COzswQkFDMUIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkcywgRnJvbnRBY3Rpb259IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL21vZGVscy9jaGFuZ2VkLWZpZWxkcyc7XG5pbXBvcnQge1Rhc2tDb250ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L3NlcnZpY2VzL3Rhc2stY29udGVudC5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1JlcXVlc3RTdGF0ZVNlcnZpY2V9IGZyb20gJy4vdGFzay1yZXF1ZXN0LXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TG9nZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7U25hY2tCYXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9zbmFjay1iYXIvc2VydmljZXMvc25hY2stYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHtUYXNrUmVzb3VyY2VTZXJ2aWNlfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZSc7XG5pbXBvcnQge0ZpZWxkQ29udmVydGVyU2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L3NlcnZpY2VzL2ZpZWxkLWNvbnZlcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7VGFza1NldERhdGFSZXF1ZXN0Qm9keX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS90YXNrLXNldC1kYXRhLXJlcXVlc3QtYm9keSc7XG5pbXBvcnQge1Rhc2tIYW5kbGluZ1NlcnZpY2V9IGZyb20gJy4vdGFzay1oYW5kbGluZy1zZXJ2aWNlJztcbmltcG9ydCB7TkFFX1RBU0tfT1BFUkFUSU9OU30gZnJvbSAnLi4vbW9kZWxzL3Rhc2stb3BlcmF0aW9ucy1pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHtUYXNrT3BlcmF0aW9uc30gZnJvbSAnLi4vaW50ZXJmYWNlcy90YXNrLW9wZXJhdGlvbnMnO1xuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtGaWxlRmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2ZpbGUtZmllbGQvbW9kZWxzL2ZpbGUtZmllbGQnO1xuaW1wb3J0IHtTZWxlY3RlZENhc2VTZXJ2aWNlfSBmcm9tICcuL3NlbGVjdGVkLWNhc2Uuc2VydmljZSc7XG5pbXBvcnQge0ZpbGVMaXN0RmllbGR9IGZyb20gJy4uLy4uL2RhdGEtZmllbGRzL2ZpbGUtbGlzdC1maWVsZC9tb2RlbHMvZmlsZS1saXN0LWZpZWxkJztcbmltcG9ydCB7Y3JlYXRlVGFza0V2ZW50Tm90aWZpY2F0aW9ufSBmcm9tICcuLi8uLi90YXNrLWNvbnRlbnQvbW9kZWwvdGFzay1ldmVudC1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHtUYXNrRXZlbnR9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWV2ZW50JztcbmltcG9ydCB7VGFza0V2ZW50U2VydmljZX0gZnJvbSAnLi4vLi4vdGFzay1jb250ZW50L3NlcnZpY2VzL3Rhc2stZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtDYWxsQ2hhaW5TZXJ2aWNlfSBmcm9tICcuLi8uLi91dGlsaXR5L2NhbGwtY2hhaW4vY2FsbC1jaGFpbi5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEeW5hbWljRW51bWVyYXRpb25GaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvZW51bWVyYXRpb24tZmllbGQvbW9kZWxzL2R5bmFtaWMtZW51bWVyYXRpb24tZmllbGQnO1xuaW1wb3J0IHtEYXRhR3JvdXB9IGZyb20gJy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvZGF0YS1ncm91cHMnO1xuaW1wb3J0IHtFdmVudFF1ZXVlU2VydmljZX0gZnJvbSAnLi4vLi4vZXZlbnQtcXVldWUvc2VydmljZXMvZXZlbnQtcXVldWUuc2VydmljZSc7XG5pbXBvcnQge1F1ZXVlZEV2ZW50fSBmcm9tICcuLi8uLi9ldmVudC1xdWV1ZS9tb2RlbC9xdWV1ZWQtZXZlbnQnO1xuaW1wb3J0IHtBZnRlckFjdGlvbn0gZnJvbSAnLi4vLi4vdXRpbGl0eS9jYWxsLWNoYWluL2FmdGVyLWFjdGlvbic7XG5pbXBvcnQge1VzZXJDb21wYXJhdG9yU2VydmljZX0gZnJvbSAnLi4vLi4vdXNlci9zZXJ2aWNlcy91c2VyLWNvbXBhcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQge1Rhc2tTZXREYXRhUmVxdWVzdENvbnRleHR9IGZyb20gJy4uL21vZGVscy90YXNrLXNldC1kYXRhLXJlcXVlc3QtY29udGV4dCc7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9tZXNzYWdlLXJlc291cmNlJztcbmltcG9ydCB7RXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi9ldmVudC9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7Q2hhbmdlZEZpZWxkc1NlcnZpY2V9IGZyb20gJy4uLy4uL2NoYW5nZWQtZmllbGRzL3NlcnZpY2VzL2NoYW5nZWQtZmllbGRzLnNlcnZpY2UnO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzTWFwfSBmcm9tICcuLi8uLi9ldmVudC9zZXJ2aWNlcy9pbnRlcmZhY2VzL2NoYW5nZWQtZmllbGRzLW1hcCc7XG5pbXBvcnQge1Rhc2tGaWVsZHN9IGZyb20gJy4uLy4uL3Rhc2stY29udGVudC9tb2RlbC90YXNrLWZpZWxkcyc7XG5pbXBvcnQge0VudW1lcmF0aW9uRmllbGR9IGZyb20gXCIuLi8uLi9kYXRhLWZpZWxkcy9lbnVtZXJhdGlvbi1maWVsZC9tb2RlbHMvZW51bWVyYXRpb24tZmllbGRcIjtcbmltcG9ydCB7RnJvbnRBY3Rpb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vYWN0aW9ucy9zZXJ2aWNlcy9mcm9udC1hY3Rpb24uc2VydmljZVwiO1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGxvYWRpbmcgYW5kIHVwZGF0aW5nIG9mIGRhdGEgZmllbGRzIGFuZCBiZWhhdmlvdXIgb2ZcbiAqIGEgc2luZ2xlIFRhc2sgb2JqZWN0IG1hbmFnZWQgYnkgYSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBpbnN0YW5jZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhc2tEYXRhU2VydmljZSBleHRlbmRzIFRhc2tIYW5kbGluZ1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gICAgcHJvdGVjdGVkIF91cGRhdGVTdWNjZXNzJDogU3ViamVjdDxib29sZWFuPjtcbiAgICBwcm90ZWN0ZWQgX2RhdGFSZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdGFza1N0YXRlOiBUYXNrUmVxdWVzdFN0YXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2xvZzogTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3NuYWNrQmFyOiBTbmFja0JhclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrUmVzb3VyY2VTZXJ2aWNlOiBUYXNrUmVzb3VyY2VTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZmllbGRDb252ZXJ0ZXJTZXJ2aWNlOiBGaWVsZENvbnZlcnRlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90YXNrRXZlbnQ6IFRhc2tFdmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgQEluamVjdChOQUVfVEFTS19PUEVSQVRJT05TKSBwcm90ZWN0ZWQgX3Rhc2tPcGVyYXRpb25zOiBUYXNrT3BlcmF0aW9ucyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBfc2VsZWN0ZWRDYXNlU2VydmljZTogU2VsZWN0ZWRDYXNlU2VydmljZSxcbiAgICAgICAgICAgICAgICBfdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9hZnRlckFjdGlvbkZhY3Rvcnk6IENhbGxDaGFpblNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFF1ZXVlOiBFdmVudFF1ZXVlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX3VzZXJDb21wYXJhdG9yOiBVc2VyQ29tcGFyYXRvclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9ldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2NoYW5nZWRGaWVsZHNTZXJ2aWNlOiBDaGFuZ2VkRmllbGRzU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgX2Zyb250QWN0aW9uU2VydmljZTogRnJvbnRBY3Rpb25TZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKF90YXNrQ29udGVudFNlcnZpY2UsIF9zZWxlY3RlZENhc2VTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgICAgICB0aGlzLl9kYXRhUmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tEYXRhUmVsb2FkUmVxdWVzdCQuc3Vic2NyaWJlKHF1ZXVlZEZyb250ZW5kQWN0aW9uID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKG5ldyBBZnRlckFjdGlvbigpLCB0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN1Y2Nlc3MkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2RhdGFSZWxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNUYXNrUHJlc2VudCgpICYmIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLmZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICBncm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiBmaWVsZC5kZXN0cm95KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiBiYWNrZW5kXG4gICAgICogY2FsbHMgaW4gW3VwZGF0ZVRhc2tEYXRhRmllbGRzXXtAbGluayBUYXNrRGF0YVNlcnZpY2UjdXBkYXRlVGFza0RhdGFGaWVsZHN9IG1ldGhvZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHVwZGF0ZVN1Y2Nlc3MkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlU3VjY2VzcyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIERhdGEgRmllbGRzIG9mIGFuIHVuaW5pdGlhbGl6ZWQgVGFzayBmcm9tIGJhY2tlbmRcbiAgICAgKiBhbmQgcG9wdWxhdGVzIHRoZSBUYXNrIG1hbmFnZWQgYnkge0BsaW5rIFRhc2tDb250ZW50U2VydmljZX0gd2l0aCB0aGUgYXBwcm9wcmlhdGUgb2JqZWN0cy5cbiAgICAgKlxuICAgICAqIEJld2FyZSB0aGF0IGlmIHRoZSBUYXNrIGhhcyBzb21lIGRhdGEgYWxyZWFkeSBsb2FkZWQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmdcbiAgICAgKiBhbmQgb25seSBwYXNzZXMgYHRydWVgIHRvIHRoZSBgYWZ0ZXJBY3Rpb25gIGFyZ3VtZW50LlxuICAgICAqXG4gICAgICogSWYgdGhlIHRhc2sgaGVsZCB3aXRoaW4gdGhlIHtAbGluayBUYXNrQ29udGVudFNlcnZpY2V9IGNoYW5nZXMgYmVmb3JlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQsIHRoZSByZXNwb25zZSB3aWxsIGJlIGlnbm9yZWRcbiAgICAgKiBhbmQgdGhlIGBhZnRlckFjdGlvbmAgd2lsbCBub3QgYmUgZXhlY3V0ZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gaWYgdGhlIHJlcXVlc3QgY29tcGxldGVzIHN1Y2Nlc3NmdWxseSBlbWl0cyBgdHJ1ZWAgaW50byB0aGUgU3ViamVjdCwgb3RoZXJ3aXNlIGBmYWxzZWAgd2lsbCBiZSBlbWl0dGVkXG4gICAgICogQHBhcmFtIGZvcmNlIHNldCB0byBgdHJ1ZWAgaWYgeW91IG5lZWQgZm9yY2UgcmVsb2FkIG9mIGFsbCB0YXNrIGRhdGFcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5pdGlhbGl6ZVRhc2tEYXRhRmllbGRzKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiA9IG5ldyBBZnRlckFjdGlvbigpLCBmb3JjZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNUYXNrUHJlc2VudCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtR2V0RGF0YVJlcXVlc3QoYWZ0ZXJBY3Rpb24sIGZvcmNlLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSwgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgYGdldERhdGFgIHJlcXVlc3Qgb24gdGhlIHRhc2sgY3VycmVudGx5IHN0b3JlZCBpbiB0aGUgYHRhc2tDb250ZW50YCBzZXJ2aWNlXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBmb3JjZSBzZXQgdG8gYHRydWVgIGlmIHlvdSBuZWVkIGZvcmNlIHJlbG9hZCBvZiBhbGwgdGFzayBkYXRhXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtR2V0RGF0YVJlcXVlc3QoYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLCBmb3JjZTogYm9vbGVhbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPiAwICYmICFmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5zZW5kTm90aWZpY2F0aW9uKFRhc2tFdmVudC5HRVRfREFUQSwgdHJ1ZSk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUubmV4dCh0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ290dGVuVGFza0lkID0gdGhpcy5fc2FmZVRhc2suc3RyaW5nSWQ7XG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoZ290dGVuVGFza0lkKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLmdldERhdGEoZ290dGVuVGFza0lkKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShkYXRhR3JvdXBzID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1Y2Nlc3NmdWxHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQsIGRhdGFHcm91cHMsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NFcnJvbmVvdXNHZXREYXRhUmVxdWVzdChnb3R0ZW5UYXNrSWQsIGVycm9yLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYGdldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gZ290dGVuVGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyByZXF1ZXN0ZWRcbiAgICAgKiBAcGFyYW0gZGF0YUdyb3VwcyB0aGUgcmV0dXJuZWQgZGF0YSBncm91cHMgb2YgdGhlIHRhc2tcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzU3VjY2Vzc2Z1bEdldERhdGFSZXF1ZXN0KGdvdHRlblRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFHcm91cHM6IEFycmF5PERhdGFHcm91cD4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVGFza1JlbGV2YW50KGdvdHRlblRhc2tJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGNoYW5nZWQgYmVmb3JlIHRoZSBnZXQgZGF0YSByZXNwb25zZSBjb3VsZCBiZSByZWNlaXZlZCwgZGlzY2FyZGluZy4uLicpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHMgPSB7fTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCA9IHt9O1xuXG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMgPSBkYXRhR3JvdXBzO1xuICAgICAgICBpZiAoZGF0YUdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5pbmZvKCdUYXNrIGhhcyBubyBkYXRhICcgKyB0aGlzLl9zYWZlVGFzayk7XG4gICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IDA7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3RoaXMuX3NhZmVUYXNrLnN0cmluZ0lkXSA9IHt9IGFzIFRhc2tGaWVsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW3RoaXMuX3NhZmVUYXNrLmNhc2VJZF0gPSBbdGhpcy5fc2FmZVRhc2suc3RyaW5nSWRdO1xuICAgICAgICAgICAgZGF0YUdyb3Vwcy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhR3JvdXBQYXJlbnRDYXNlSWQ6IHN0cmluZyA9IGdyb3VwLnBhcmVudENhc2VJZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5fc2FmZVRhc2suY2FzZUlkIDogZ3JvdXAucGFyZW50Q2FzZUlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFRhc2tJZDogc3RyaW5nID0gZ3JvdXAucGFyZW50VGFza0lkID09PSB1bmRlZmluZWQgPyB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZCA6IGdyb3VwLnBhcmVudFRhc2tJZDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUcmFuc2l0aW9uSWQ6IHN0cmluZyA9IGdyb3VwLnBhcmVudFRyYW5zaXRpb25JZCA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2FmZVRhc2sudHJhbnNpdGlvbklkIDogZ3JvdXAucGFyZW50VHJhbnNpdGlvbklkO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhR3JvdXBQYXJlbnRDYXNlSWQgIT09IHRoaXMuX3NhZmVUYXNrLmNhc2VJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS5yZWZlcmVuY2VkVGFza0FuZENhc2VJZHNbZGF0YUdyb3VwUGFyZW50Q2FzZUlkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnJlZmVyZW5jZWRUYXNrQW5kQ2FzZUlkc1tkYXRhR3JvdXBQYXJlbnRDYXNlSWRdID0gW2dyb3VwLnBhcmVudFRhc2tJZF07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0ucHVzaChncm91cC5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhR3JvdXBQYXJlbnRDYXNlSWQgPT09IHRoaXMuX3NhZmVUYXNrLmNhc2VJZFxuICAgICAgICAgICAgICAgICAgICAmJiBwYXJlbnRUYXNrSWQgIT09IHRoaXMuX3NhZmVUYXNrLnN0cmluZ0lkXG4gICAgICAgICAgICAgICAgICAgICYmICF0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0uaW5jbHVkZXMocGFyZW50VGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UucmVmZXJlbmNlZFRhc2tBbmRDYXNlSWRzW2RhdGFHcm91cFBhcmVudENhc2VJZF0ucHVzaChncm91cC5wYXJlbnRUYXNrSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ29udGVudFNlcnZpY2UudGFza0ZpZWxkc0luZGV4W3BhcmVudFRhc2tJZF0gPSB7fSBhcyBUYXNrRmllbGRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuZmllbGRzLmxlbmd0aCA+IDAgJiYgIXRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleFtwYXJlbnRUYXNrSWRdLmZpZWxkcyA9IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBncm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS50cmFuc2l0aW9uSWQgPSBwYXJlbnRUcmFuc2l0aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbcGFyZW50VGFza0lkXS5maWVsZHNbZmllbGQuc3RyaW5nSWRdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLnZhbHVlQ2hhbmdlcygpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgRHluYW1pY0VudW1lcmF0aW9uRmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0RhdGFGaWVsZHModGhpcy5fYWZ0ZXJBY3Rpb25GYWN0b3J5LmNyZWF0ZShib29sID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVGFza0RhdGFGaWVsZHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBGaWxlRmllbGQgfHwgZmllbGQgaW5zdGFuY2VvZiBGaWxlTGlzdEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5jaGFuZ2VkRmllbGRzJC5zdWJzY3JpYmUoKGNoYW5nZTogQ2hhbmdlZEZpZWxkc01hcCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFTaXplID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSA9IGdyb3VwLmZpZWxkcy5sZW5ndGggOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhU2l6ZSArPSBncm91cC5maWVsZHMubGVuZ3RoO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuR0VUX0RBVEEsIHRydWUpO1xuICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKHRydWUpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGUubmV4dCh0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzKTtcbiAgICAgICAgdGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLm5leHQodGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLiRzaG91bGRDcmVhdGVDb3VudGVyLmdldFZhbHVlKCkgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb25lb3VzIG91dGNvbWUgb2YgYSBgZ2V0RGF0YWAgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBnb3R0ZW5UYXNrSWQgdGhlIElEIG9mIHRoZSB0YXNrIHdob3NlIGRhdGEgd2FzIHJlcXVlc3RlZFxuICAgICAqIEBwYXJhbSBlcnJvciB0aGUgcmV0dXJuZWQgZXJyb3JcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzRXJyb25lb3VzR2V0RGF0YVJlcXVlc3QoZ290dGVuVGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKGdvdHRlblRhc2tJZCk7XG4gICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnZ2V0dGluZyB0YXNrIGRhdGEgZmFpbGVkJywgZXJyb3IpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tSZWxldmFudChnb3R0ZW5UYXNrSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgZ2V0IGRhdGEgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJiBlcnJvci5zdGF0dXMgPT09IDUwMCAmJiBlcnJvci5lcnJvci5tZXNzYWdlICYmIGVycm9yLmVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnQ291bGQgbm90IGZpbmQgdGFzayB3aXRoIGlkJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5XYXJuaW5nU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLm5vTG9uZ2VyRXhpc3RzJykpO1xuICAgICAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoZXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIoYCR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLm5vR3JvdXAnKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2sudGl0bGV9ICR7dGhpcy5fdHJhbnNsYXRlLmluc3RhbnQoJ3Rhc2tzLnNuYWNrYmFyLmZhaWxlZFRvTG9hZCcpfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuR0VUX0RBVEEsIGZhbHNlKTtcbiAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0cyBhbGwgY2hhbmdlZCBkYXRhIGZpZWxkcyBhbmQgbm90aWZpZXMgdGhlIGJhY2tlbmQgb2YgdGhlIGNoYW5nZXMuXG4gICAgICpcbiAgICAgKiBJZiB0aGUgcmVxdWVzdCBpcyBzdWNjZXNzZnVsIGNsZWFycyB0aGUgW2NoYW5nZWRde0BsaW5rIERhdGFGaWVsZCNjaGFuZ2VkfSBmbGFnIG9uIGFsbCBkYXRhIGZpZWxkcyB0aGF0IHdlcmUgYSBwYXJ0IG9mIHRoZSByZXF1ZXN0XG4gICAgICogYW5kIGVtaXRzIGEge0BsaW5rIENoYW5nZWRGaWVsZHN9IG9iamVjdCBpbnRvIHRoaXMgb2JqZWN0J3MgW2NoYW5nZWRGaWVsZHMkXXtAbGluayBUYXNrRGF0YVNlcnZpY2UjY2hhbmdlZEZpZWxkcyR9IHN0cmVhbS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB0YXNrIGhlbGQgd2l0aGluIHRoZSB7QGxpbmsgVGFza0NvbnRlbnRTZXJ2aWNlfSBjaGFuZ2VzIGJlZm9yZSBhIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBpZ25vcmVkXG4gICAgICogYW5kIHRoZSBgYWZ0ZXJBY3Rpb25gIHdpbGwgbm90IGJlIGV4ZWN1dGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkgZW1pdHMgYHRydWVgIGludG8gdGhlIFN1YmplY3QsIG90aGVyd2lzZSBgZmFsc2VgIHdpbGwgYmUgZW1pdHRlZFxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVUYXNrRGF0YUZpZWxkcyhhZnRlckFjdGlvbjogQWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJBY3Rpb24oKSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUHJlc2VudCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ1Rhc2sgaXMgbm90IHByZXNlbnQuIFVwZGF0ZSByZXF1ZXN0IGlnbm9yZWQuJyk7XG4gICAgICAgICAgICBhZnRlckFjdGlvbi5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zYWZlVGFzay51c2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvZy5kZWJ1ZygnY3VycmVudCB0YXNrIGlzIG5vdCBhc3NpZ25lZC4uLicpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXRUYXNrSWQgPSB0aGlzLl9zYWZlVGFzay5zdHJpbmdJZDtcblxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2suZGF0YVNpemUgPD0gMCkge1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24ucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gdGhpcy5jcmVhdGVVcGRhdGVSZXF1ZXN0Q29udGV4dCgpO1xuXG4gICAgICAgIHRoaXMuX2V2ZW50UXVldWUuc2NoZWR1bGVFdmVudChuZXcgUXVldWVkRXZlbnQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmlzU2V0RGF0YVJlcXVlc3RTdGlsbFZhbGlkKHJlcXVlc3RDb250ZXh0LmJvZHkpLFxuICAgICAgICAgICAgbmV4dEV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1TZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIHJlcXVlc3RDb250ZXh0LmJvZHksIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRFdmVudCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXZlcnRTZXREYXRhUmVxdWVzdChyZXF1ZXN0Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaWdub3JlXG4gICAgICogR29lcyBvdmVyIGFsbCB0aGUgZGF0YSBmaWVsZHMgaW4gdGhlIG1hbmFnZWQgVGFzayBhbmQgaWYgdGhleSBhcmUgdmFsaWQgYW5kIGNoYW5nZWQgYWRkcyB0aGVtIHRvIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVVwZGF0ZVJlcXVlc3RDb250ZXh0KCk6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQge1xuICAgICAgICBjb25zdCBjb250ZXh0OiBUYXNrU2V0RGF0YVJlcXVlc3RDb250ZXh0ID0ge1xuICAgICAgICAgICAgYm9keToge30sXG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlczoge31cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZpbHRlcihkYXRhR3JvdXAgPT4gZGF0YUdyb3VwLnBhcmVudFRhc2tJZCA9PT0gdW5kZWZpbmVkKS5mb3JFYWNoKGRhdGFHcm91cCA9PiB7XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVt0aGlzLl90YXNrLnN0cmluZ0lkXSA9IHt9O1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCB0aGlzLl90YXNrLnN0cmluZ0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuX3NhZmVUYXNrLmRhdGFHcm91cHMuZmlsdGVyKGRhdGFHcm91cCA9PiBkYXRhR3JvdXAucGFyZW50VGFza0lkICE9PSB1bmRlZmluZWQpLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhR3JvdXAuZmllbGRzLnNvbWUoZmllbGQgPT4gdGhpcy53YXNGaWVsZFVwZGF0ZWQoZmllbGQpKSkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuYm9keVtkYXRhR3JvdXAucGFyZW50VGFza0lkXSA9IHt9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhR3JvdXAuZmllbGRzLmZpbHRlcihmaWVsZCA9PiB0aGlzLndhc0ZpZWxkVXBkYXRlZChmaWVsZCkpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkRmllbGRUb1NldERhdGFSZXF1ZXN0Qm9keShjb250ZXh0LCBkYXRhR3JvdXAucGFyZW50VGFza0lkLCBmaWVsZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhZGRGaWVsZFRvU2V0RGF0YVJlcXVlc3RCb2R5KGNvbnRleHQ6IFRhc2tTZXREYXRhUmVxdWVzdENvbnRleHQsIHRhc2tJZDogc3RyaW5nLCBmaWVsZDogRGF0YUZpZWxkPGFueT4pOiB2b2lkIHtcbiAgICAgICAgY29udGV4dC5ib2R5W3Rhc2tJZF1bZmllbGQuc3RyaW5nSWRdID0ge1xuICAgICAgICAgICAgdHlwZTogdGhpcy5fZmllbGRDb252ZXJ0ZXJTZXJ2aWNlLnJlc29sdmVUeXBlKGZpZWxkKSxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl9maWVsZENvbnZlcnRlclNlcnZpY2UuZm9ybWF0VmFsdWVGb3JCYWNrZW5kKGZpZWxkLCBmaWVsZC52YWx1ZSlcbiAgICAgICAgfTtcbiAgICAgICAgY29udGV4dC5wcmV2aW91c1ZhbHVlc1tmaWVsZC5zdHJpbmdJZF0gPSBmaWVsZC5wcmV2aW91c1ZhbHVlO1xuICAgICAgICBmaWVsZC5jaGFuZ2VkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbntcbiAgICAgICAgcmV0dXJuIChmaWVsZCBpbnN0YW5jZW9mIEVudW1lcmF0aW9uRmllbGQpICYmIChmaWVsZC5nZXRDb21wb25lbnRUeXBlKCkgPT09ICdhdXRvY29tcGxldGUnKSAmJiAhZmllbGQudmFsaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGZpZWxkIHRoZSBjaGVja2VkIGZpZWxkXG4gICAgICogQHJldHVybnMgd2hldGhlciB0aGUgZmllbGQgd2FzIHVwZGF0ZWQgb24gZnJvbnRlbmQgYW5kIHRodXMgdGhlIGJhY2tlbmQgc2hvdWxkIGJlIG5vdGlmaWVkXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHdhc0ZpZWxkVXBkYXRlZChmaWVsZDogRGF0YUZpZWxkPHVua25vd24+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmaWVsZC5pbml0aWFsaXplZCAmJiBmaWVsZC5jaGFuZ2VkICYmIChmaWVsZC52YWxpZCB8fCBmaWVsZC5zZW5kSW52YWxpZFZhbHVlcykgJiYgKCF0aGlzLmlzQXV0b2NvbXBsZXRlRW51bUV4Y2VwdGlvbihmaWVsZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IGNvdWxkIHN0aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgbG9nZ2VkIHVzZXJcbiAgICAgKiBAcGFyYW0gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBpc1NldERhdGFSZXF1ZXN0U3RpbGxWYWxpZChyZXF1ZXN0OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tQcmVzZW50KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2FmZVRhc2sudXNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl91c2VyQ29tcGFyYXRvci5jb21wYXJlVXNlcnModGhpcy5fc2FmZVRhc2sudXNlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrSWRzSW5SZXF1ZXN0OiBBcnJheTxzdHJpbmc+ID0gT2JqZWN0LmtleXMocmVxdWVzdCk7XG4gICAgICAgIGZvciAoY29uc3QgdGFza0lkIG9mIHRhc2tJZHNJblJlcXVlc3QpIHtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LmtleXModGhpcy5fdGFza0NvbnRlbnRTZXJ2aWNlLnRhc2tGaWVsZHNJbmRleCkuaW5jbHVkZXModGFza0lkKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvZy5lcnJvcihgVGFzayBpZCAke3Rhc2tJZH0gaXMgbm90IHByZXNlbnQgaW4gdGFzayBmaWVsZHMgaW5kZXhgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZElkc09mUmVxdWVzdCA9IE9iamVjdC5rZXlzKHJlcXVlc3RbdGFza0lkXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkSWQgb2YgZmllbGRJZHNPZlJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGFza0lkXS5maWVsZHNbZmllbGRJZF07XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmVycm9yKGBVbmV4cGVjdGVkIHN0YXRlLiBEYXRhZmllbGQgJHtmaWVsZElkfSBvZiB0YXNrICR7dGFza0lkXG4gICAgICAgICAgICAgICAgICAgIH0gaW4gc2V0RGF0YSByZXF1ZXN0IGlzIG5vdCBwcmVzZW50IGluIHRoZSB0YXNrLmApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZmllbGQuYmVoYXZpb3IuZWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9nLmRlYnVnKGBGaWVsZCAke2ZpZWxkSWR9LCB3YXMgbWVhbnQgdG8gYmUgc2V0IHRvXG4gICAgICAgICAgICAgICAgICAgICR7SlNPTi5zdHJpbmdpZnkocmVxdWVzdFt0YXNrSWRdW2ZpZWxkSWRdKVxuICAgICAgICAgICAgICAgICAgICB9LCBidXQgaXMgbm8gbG9uZXIgZWRpdGFibGUuYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSBgc2V0RGF0YWAgcmVxdWVzdCBvbiB0aGUgdGFzayBjdXJyZW50bHkgc3RvcmVkIGluIHRoZSBgdGFza0NvbnRlbnRgIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIElEIG9mIHRoZSB0YXNrXG4gICAgICogQHBhcmFtIGJvZHkgY29udGVudCBvZiB0aGUgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwZXJmb3JtU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsIGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHksIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgbmV4dEV2ZW50OiBBZnRlckFjdGlvbikge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXMoYm9keSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24oVGFza0V2ZW50LlNFVF9EQVRBLCB0cnVlKTtcbiAgICAgICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdGFydExvYWRpbmcoc2V0VGFza0lkKTtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0YXJ0VXBkYXRpbmcoc2V0VGFza0lkKTtcblxuICAgICAgICB0aGlzLl90YXNrUmVzb3VyY2VTZXJ2aWNlLnNldERhdGEodGhpcy5fc2FmZVRhc2suc3RyaW5nSWQsIGJvZHkpLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNUYXNrUmVsZXZhbnQoc2V0VGFza0lkKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgc2V0IGRhdGEgcmVzcG9uc2UgY291bGQgYmUgcmVjZWl2ZWQsIGRpc2NhcmRpbmcuLi4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BMb2FkaW5nKHNldFRhc2tJZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wVXBkYXRpbmcoc2V0VGFza0lkKTtcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50LnJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N1Y2Nlc3NmdWxTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQsIHJlc3BvbnNlLCBhZnRlckFjdGlvbiwgbmV4dEV2ZW50LCBib2R5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzVW5zdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkLCByZXNwb25zZSwgYWZ0ZXJBY3Rpb24sIG5leHRFdmVudCwgYm9keSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9uZW91c1NldERhdGFSZXF1ZXN0KHNldFRhc2tJZCwgZXJyb3IsIGFmdGVyQWN0aW9uLCBuZXh0RXZlbnQsIGJvZHkpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGFuIHVuc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyBzZXRcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHJlc3VsdGluZyBFdmVudCBvdXRjb21lIG9mIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gYm9keSBob2xkIHRoZSBkYXRhIHRoYXQgd2FzIHNlbnQgaW4gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzVW5zdWNjZXNzZnVsU2V0RGF0YVJlcXVlc3Qoc2V0VGFza0lkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZTogRXZlbnRPdXRjb21lTWVzc2FnZVJlc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEV2ZW50OiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlbkVycm9yU25hY2tCYXIodGhpcy5fdHJhbnNsYXRlLmluc3RhbnQocmVzcG9uc2UuZXJyb3IpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NuYWNrQmFyLm9wZW5FcnJvclNuYWNrQmFyKHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5mYWlsZWRTYXZlJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNwb25zZS5vdXRjb21lKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRjb21lID0gcmVzcG9uc2Uub3V0Y29tZTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWVsZHNNYXA6IENoYW5nZWRGaWVsZHNNYXAgPSB0aGlzLl9ldmVudFNlcnZpY2UucGFyc2VDaGFuZ2VkRmllbGRzRnJvbU91dGNvbWVUcmVlKG91dGNvbWUpO1xuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZEZpZWxkc01hcCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHNTZXJ2aWNlLmVtaXRDaGFuZ2VkRmllbGRzKGNoYW5nZWRGaWVsZHNNYXApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucmV2ZXJ0VG9QcmV2aW91c1ZhbHVlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGJvZHkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXRlSW5mbyhhZnRlckFjdGlvbiwgZmFsc2UsIHNldFRhc2tJZCk7XG4gICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgdGhpcy5fdGFza09wZXJhdGlvbnMucmVsb2FkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2Vzc2VzIGEgc3VjY2Vzc2Z1bCBvdXRjb21lIG9mIGEgYHNldERhdGFgIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2V0VGFza0lkIHRoZSBJRCBvZiB0aGUgdGFzayB3aG9zZSBkYXRhIHdhcyBzZXRcbiAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHJlc3VsdGluZyBFdmVudCBvdXRjb21lIG9mIHRoZSBzZXQgZGF0YSByZXF1ZXN0XG4gICAgICogQHBhcmFtIGFmdGVyQWN0aW9uIHRoZSBhY3Rpb24gdGhhdCBzaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHRoZSByZXF1ZXN0IGlzIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBuZXh0RXZlbnQgaW5kaWNhdGVzIHRvIHRoZSBldmVudCBxdWV1ZSB0aGF0IHRoZSBuZXh0IGV2ZW50IGNhbiBiZSBwcm9jZXNzZWRcbiAgICAgKiBAcGFyYW0gYm9keSBob2xkIHRoZSBkYXRhIHRoYXQgd2FzIHNlbnQgaW4gcmVxdWVzdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwcm9jZXNzU3VjY2Vzc2Z1bFNldERhdGFSZXF1ZXN0KHNldFRhc2tJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlOiBFdmVudE91dGNvbWVNZXNzYWdlUmVzb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJBY3Rpb246IEFmdGVyQWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogVGFza1NldERhdGFSZXF1ZXN0Qm9keSkge1xuICAgICAgICBjb25zdCBvdXRjb21lID0gcmVzcG9uc2Uub3V0Y29tZTtcbiAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkc01hcDogQ2hhbmdlZEZpZWxkc01hcCA9IHRoaXMuX2V2ZW50U2VydmljZS5wYXJzZUNoYW5nZWRGaWVsZHNGcm9tT3V0Y29tZVRyZWUob3V0Y29tZSk7XG4gICAgICAgIGNvbnN0IGZyb250QWN0aW9uczogQXJyYXk8RnJvbnRBY3Rpb24+ID0gdGhpcy5fZXZlbnRTZXJ2aWNlLnBhcnNlRnJvbnRBY3Rpb25zRnJvbU91dGNvbWVUcmVlKG91dGNvbWUpO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VkRmllbGRzTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VkRmllbGRzU2VydmljZS5lbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2VkRmllbGRzTWFwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISFmcm9udEFjdGlvbnMgJiYgZnJvbnRBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX2Zyb250QWN0aW9uU2VydmljZS5ydW5BbGwoZnJvbnRBY3Rpb25zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFyV2FpdGluZ0ZvclJlc3BvbnNlRmxhZyhib2R5KTtcbiAgICAgICAgdGhpcy5fc25hY2tCYXIub3BlblN1Y2Nlc3NTbmFja0JhcighIW91dGNvbWUubWVzc2FnZSA/IG91dGNvbWUubWVzc2FnZSA6IHRoaXMuX3RyYW5zbGF0ZS5pbnN0YW50KCd0YXNrcy5zbmFja2Jhci5kYXRhU2F2ZWQnKSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGVJbmZvKGFmdGVyQWN0aW9uLCB0cnVlLCBzZXRUYXNrSWQpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYW4gZXJyb25lb3VzIG91dGNvbWUgb2YgYSBgc2V0RGF0YWAgcmVxdWVzdFxuICAgICAqIEBwYXJhbSBzZXRUYXNrSWQgdGhlIElEIG9mIHRoZSB0YXNrIHdob3NlIGRhdGEgd2FzIHNldFxuICAgICAqIEBwYXJhbSBlcnJvciB0aGUgcmV0dXJuZWQgZXJyb3JcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGFjdGlvbiB0aGF0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkXG4gICAgICogQHBhcmFtIG5leHRFdmVudCBpbmRpY2F0ZXMgdG8gdGhlIGV2ZW50IHF1ZXVlIHRoYXQgdGhlIG5leHQgZXZlbnQgY2FuIGJlIHByb2Nlc3NlZFxuICAgICAqIEBwYXJhbSBib2R5IGhvbGQgdGhlIGRhdGEgdGhhdCB3YXMgc2VudCBpbiByZXF1ZXN0XG4gICAgICovXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NFcnJvbmVvdXNTZXREYXRhUmVxdWVzdChzZXRUYXNrSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFdmVudDogQWZ0ZXJBY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBUYXNrU2V0RGF0YVJlcXVlc3RCb2R5KSB7XG4gICAgICAgIHRoaXMuX2xvZy5kZWJ1Zygnc2V0dGluZyB0YXNrIGRhdGEgZmFpbGVkJywgZXJyb3IpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1Rhc2tSZWxldmFudChzZXRUYXNrSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2cuZGVidWcoJ2N1cnJlbnQgdGFzayBjaGFuZ2VkIGJlZm9yZSB0aGUgZ2V0IGRhdGEgZXJyb3IgY291bGQgYmUgcmVjZWl2ZWQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rhc2tTdGF0ZS5zdG9wTG9hZGluZyhzZXRUYXNrSWQpO1xuICAgICAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BVcGRhdGluZyhzZXRUYXNrSWQpO1xuICAgICAgICAgICAgYWZ0ZXJBY3Rpb24uY29tcGxldGUoKTtcbiAgICAgICAgICAgIG5leHRFdmVudC5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmV2ZXJ0VG9QcmV2aW91c1ZhbHVlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGJvZHkpO1xuICAgICAgICB0aGlzLl9zbmFja0Jhci5vcGVuRXJyb3JTbmFja0Jhcih0aGlzLl90cmFuc2xhdGUuaW5zdGFudCgndGFza3Muc25hY2tiYXIuZmFpbGVkU2F2ZScpKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0ZUluZm8oYWZ0ZXJBY3Rpb24sIGZhbHNlLCBzZXRUYXNrSWQpO1xuICAgICAgICBuZXh0RXZlbnQucmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIHRoaXMuX3Rhc2tPcGVyYXRpb25zLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldmVydHMgdGhlIGVmZmVjdHMgb2YgYSBmYWlsZWQgYHNldERhdGFgIHJlcXVlc3QsIHNvIHRoYXQgdGhlIHVzZXIgc2VlcyBjdXJyZW50IHZhbHVlcy5cbiAgICAgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgZmFpbGVkIHJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmV2ZXJ0U2V0RGF0YVJlcXVlc3QoY29udGV4dDogVGFza1NldERhdGFSZXF1ZXN0Q29udGV4dCkge1xuICAgICAgICAvLyB0aGlzIGl0ZXJhdGlvbiBjb3VsZCBiZSBpbXByb3ZlZCBpZiB3ZSBoYWQgYSBtYXAgb2YgYWxsIHRoZSBkYXRhIGZpZWxkcyBpbiBhIHRhc2tcbiAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IE9iamVjdC5rZXlzKGNvbnRleHQuYm9keSkubGVuZ3RoO1xuICAgICAgICBsZXQgZm91bmRDb3VudCA9IDA7XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRhZ3JvdXAgb2YgdGhpcy5fc2FmZVRhc2suZGF0YUdyb3Vwcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBkYXRhZ3JvdXAuZmllbGRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0LmJvZHlbZmllbGQuc3RyaW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhcmVCYWNrZW5kRm9ybWF0dGVkRmllbGRWYWx1ZXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpZWxkQ29udmVydGVyU2VydmljZS5mb3JtYXRWYWx1ZUZvckJhY2tlbmQoZmllbGQsIGZpZWxkLnZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5ib2R5W2ZpZWxkLnN0cmluZ0lkXS52YWx1ZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWVXaXRob3V0Q2hhbmdlKGNvbnRleHQucHJldmlvdXNWYWx1ZXNbZmllbGQuc3RyaW5nSWRdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3VuZENvdW50Kys7XG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kQ291bnQgPT09IHRvdGFsQ291bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvZy5lcnJvcihgSW52YWxpZCBzdGF0ZS4gU29tZSBkYXRhIGZpZWxkcyBvZiB0YXNrICR7dGhpcy5fc2FmZVRhc2suc3RyaW5nSWR9LCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQgaW4gaXQhYCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhlIHZhbHVlcyB0aGF0IGFyZSBpbiB0aGUgYmFja2VuZCBjb21wYXRpYmxlIGZvcm1hdCBhcyBnaXZlbiBieSB0aGUge0BsaW5rIEZpZWxkQ29udmVydGVyU2VydmljZX1cbiAgICAgKiBhbmQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZXkgYXJlIHRoZSBzYW1lIHZhbHVlLCBvciBub3QuXG4gICAgICogQHBhcmFtIGN1cnJlbnQgdGhlIGN1cnJlbnQgdmFsdWUgKGNhbiBhbHNvIGJlIGNhbGxlZCBgdmFsdWUxYCBvciBgbGVmdGApXG4gICAgICogQHBhcmFtIG9sZCB0aGUgbmV3IHZhbHVlIChjYW4gYWxzbyBiZSBjYWxsZWQgYHZhbHVlMmAgb3IgYHJpZ2h0YClcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYW5kIGBmYWxzZWAgb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbXBhcmVCYWNrZW5kRm9ybWF0dGVkRmllbGRWYWx1ZXMoY3VycmVudCwgb2xkKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2xkKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudHMhIENhbm5vdCBjb21wYXJlIGFycmF5IHZhbHVlIHRvIG5vbi1hcnJheSB2YWx1ZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY3VycmVudC5sZW5ndGggIT09IG9sZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50LmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IG9sZFtpbmRleF0gPT09IHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdXJyZW50ID09PSBvbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGlnbm9yZVxuICAgICAqXG4gICAgICogc3RvcHMgbG9hZGluZyBhbmQgdXBkYXRpbmcgaW5kaWNhdG9ycywgYW5kIGVtaXRzIHRoZSBgcmVzdWx0YCB2YWx1ZVxuICAgICAqIHRvIGJvdGggdGhlIGBhZnRlckFjdGlvbmAgYW5kIFtfdXBkYXRlU3VjY2VzcyRde0BsaW5rIFRhc2tEYXRhU2VydmljZSNfdXBkYXRlU3VjY2VzcyR9IHN0cmVhbXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWZ0ZXJBY3Rpb24gdGhlIGNhbGwgY2hhaW4gc3RlYW0gb2YgdGhlIHVwZGF0ZSBkYXRhIG1ldGhvZFxuICAgICAqIEBwYXJhbSByZXN1bHQgcmVzdWx0IG9mIHRoZSB1cGRhdGUgZGF0YSByZXF1ZXN0XG4gICAgICogQHBhcmFtIHNldFRhc2tJZCB0aGUgSUQgb2YgdGhlIHtAbGluayBUYXNrfSwgd2hvJ3Mgc3RhdGUgc2hvdWxkIGJlIHVwZGF0ZWRcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlU3RhdGVJbmZvKGFmdGVyQWN0aW9uOiBBZnRlckFjdGlvbiwgcmVzdWx0OiBib29sZWFuLCBzZXRUYXNrSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl90YXNrU3RhdGUuc3RvcExvYWRpbmcoc2V0VGFza0lkKTtcbiAgICAgICAgdGhpcy5fdGFza1N0YXRlLnN0b3BVcGRhdGluZyhzZXRUYXNrSWQpO1xuICAgICAgICBpZiAodGhpcy5fdXBkYXRlU3VjY2VzcyQub2JzZXJ2ZXJzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3VjY2VzcyQubmV4dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbihUYXNrRXZlbnQuU0VUX0RBVEEsIHJlc3VsdCk7XG4gICAgICAgIGFmdGVyQWN0aW9uLnJlc29sdmUocmVzdWx0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaXNoZXMgYSBnZXQvc2V0IGRhdGEgbm90aWZpY2F0aW9uIHRvIHRoZSB7QGxpbmsgVGFza0V2ZW50U2VydmljZX1cbiAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRoYXQgb2NjdXJyZWQgdG8gdGhlIHRhc2tcbiAgICAgKiBAcGFyYW0gc3VjY2VzcyB3aGV0aGVyIHRoZSBnZXQvc2V0IGRhdGEgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIG9yIG5vdFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZW5kTm90aWZpY2F0aW9uKGV2ZW50OiBUYXNrRXZlbnQuR0VUX0RBVEEgfCBUYXNrRXZlbnQuU0VUX0RBVEEsIHN1Y2Nlc3M6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFza0V2ZW50LnB1Ymxpc2hUYXNrRXZlbnQoY3JlYXRlVGFza0V2ZW50Tm90aWZpY2F0aW9uKHRoaXMuX3NhZmVUYXNrLCBldmVudCwgc3VjY2VzcykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmV2ZXJ0VG9QcmV2aW91c1ZhbHVlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9zYWZlVGFzay5kYXRhR3JvdXBzLmZvckVhY2goZGF0YUdyb3VwID0+IHtcbiAgICAgICAgICAgIGRhdGFHcm91cC5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluaXRpYWxpemVkICYmIGZpZWxkLnZhbGlkICYmIGZpZWxkLmNoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQucmV2ZXJ0VG9QcmV2aW91c1ZhbHVlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJXYWl0aW5nRm9yUmVzcG9uc2VGbGFnKGJvZHk6IFRhc2tTZXREYXRhUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoYm9keSkuZm9yRWFjaCh0YXNrSWQgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoYm9keVt0YXNrSWRdKS5mb3JFYWNoKGZpZWxkSWQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rhc2tDb250ZW50U2VydmljZS50YXNrRmllbGRzSW5kZXhbdGFza0lkXS5maWVsZHNbZmllbGRJZF0ud2FpdGluZ0ZvclJlc3BvbnNlID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
@@ -1,17 +1,31 @@
1
- import { Component, Input } from '@angular/core';
1
+ import { Component, Inject, Input, Optional } from '@angular/core';
2
2
  import { TaskElementType } from '../model/task-content-element-type';
3
3
  import { FieldTypeResource } from '../model/field-type-resource';
4
+ import { NAE_INFORM_ABOUT_INVALID_DATA } from "../../data-fields/models/invalid-data-policy-token";
5
+ import { FormControl } from "@angular/forms";
4
6
  import * as i0 from "@angular/core";
5
7
  import * as i1 from "../services/task-content.service";
6
8
  /**
7
9
  * Resolves the correct {@link AbstractDataFieldComponent} implementation for the provided data field object.
8
10
  */
9
11
  export class AbstractFieldComponentResolverComponent {
10
- constructor(taskContentService) {
12
+ constructor(taskContentService, _informAboutInvalidData) {
11
13
  this.taskContentService = taskContentService;
14
+ this._informAboutInvalidData = _informAboutInvalidData;
12
15
  this.fieldTypeEnum = FieldTypeResource;
13
16
  this.taskElementEnum = TaskElementType;
14
17
  }
18
+ ngOnInit() {
19
+ if (!!this.gridElement.item) {
20
+ this.gridElement.item.registerFormControl(new FormControl('', { updateOn: this.gridElement.item.getUpdateOnStrategy() }));
21
+ this.gridElement.item.sendInvalidValues = this._informAboutInvalidData;
22
+ }
23
+ }
24
+ ngOnDestroy() {
25
+ if (!!this.gridElement?.item) {
26
+ this.gridElement.item.disconnectFormControl();
27
+ }
28
+ }
15
29
  isOffsetPresent() {
16
30
  return !!this.taskContentService.task && !!this.taskContentService.task.layout && !!this.taskContentService.task.layout.offset;
17
31
  }
@@ -40,7 +54,7 @@ export class AbstractFieldComponentResolverComponent {
40
54
  || (!!component.properties && 'plainText' in component.properties && component.properties.plaintText === 'true'));
41
55
  }
42
56
  }
43
- AbstractFieldComponentResolverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractFieldComponentResolverComponent, deps: [{ token: i1.TaskContentService }], target: i0.ɵɵFactoryTarget.Component });
57
+ AbstractFieldComponentResolverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractFieldComponentResolverComponent, deps: [{ token: i1.TaskContentService }, { token: NAE_INFORM_ABOUT_INVALID_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
44
58
  AbstractFieldComponentResolverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AbstractFieldComponentResolverComponent, selector: "ncc-abstract-field-component-resolver", inputs: { gridElement: "gridElement" }, ngImport: i0, template: '', isInline: true });
45
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AbstractFieldComponentResolverComponent, decorators: [{
46
60
  type: Component,
@@ -48,7 +62,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
48
62
  selector: 'ncc-abstract-field-component-resolver',
49
63
  template: ''
50
64
  }]
51
- }], ctorParameters: function () { return [{ type: i1.TaskContentService }]; }, propDecorators: { gridElement: [{
65
+ }], ctorParameters: function () { return [{ type: i1.TaskContentService }, { type: undefined, decorators: [{
66
+ type: Optional
67
+ }, {
68
+ type: Inject,
69
+ args: [NAE_INFORM_ABOUT_INVALID_DATA]
70
+ }] }]; }, propDecorators: { gridElement: [{
52
71
  type: Input
53
72
  }] } });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZmllbGQtY29tcG9uZW50LXJlc29sdmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L2ZpZWxkLWNvbXBvbmVudC1yZXNvbHZlci9hYnN0cmFjdC1maWVsZC1jb21wb25lbnQtcmVzb2x2ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRy9DLE9BQU8sRUFBeUIsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFM0YsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOEJBQThCLENBQUM7OztBQUUvRDs7R0FFRztBQUtILE1BQU0sT0FBZ0IsdUNBQXVDO0lBTXpELFlBQWdDLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBSC9ELGtCQUFhLEdBQUcsaUJBQWlCLENBQUM7UUFDbEMsb0JBQWUsR0FBRyxlQUFlLENBQUM7SUFHekMsQ0FBQztJQUVTLGVBQWU7UUFDckIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNuSSxDQUFDO0lBRUQsY0FBYztRQUNWLE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRUQsY0FBYztRQUNWLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUE4QixDQUFDO0lBQzNELENBQUM7SUFFRCxpQkFBaUI7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxZQUFZO1FBQ1IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNqQyxDQUFDO0lBRUQsU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDakQsQ0FBQztJQUVELE9BQU87UUFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssZUFBZSxDQUFDLGdCQUFnQixDQUFDO0lBQ3pILENBQUM7SUFFRCxjQUFjO1FBQ1YsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUYsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVM7ZUFDL0QsQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVM7bUJBQ3pCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLElBQUksV0FBVyxJQUFJLFNBQVMsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQ25ILENBQUM7SUFDVixDQUFDOztxSUEzQ2lCLHVDQUF1Qzt5SEFBdkMsdUNBQXVDLHFIQUYvQyxFQUFFOzRGQUVNLHVDQUF1QztrQkFKNUQsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsdUNBQXVDO29CQUNqRCxRQUFRLEVBQUUsRUFBRTtpQkFDZjt5R0FFWSxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50fSBmcm9tICcuLi9tb2RlbC9kYXRhZmllbGQtZ3JpZC1sYXlvdXQtZWxlbWVudCc7XG5pbXBvcnQge1Rhc2tDb250ZW50RWxlbWVudFR5cGUsIFRhc2tFbGVtZW50VHlwZX0gZnJvbSAnLi4vbW9kZWwvdGFzay1jb250ZW50LWVsZW1lbnQtdHlwZSc7XG5pbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGNvcnJlY3Qge0BsaW5rIEFic3RyYWN0RGF0YUZpZWxkQ29tcG9uZW50fSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByb3ZpZGVkIGRhdGEgZmllbGQgb2JqZWN0LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25jYy1hYnN0cmFjdC1maWVsZC1jb21wb25lbnQtcmVzb2x2ZXInLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpZWxkQ29tcG9uZW50UmVzb2x2ZXJDb21wb25lbnQge1xuICAgIEBJbnB1dCgpIGdyaWRFbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudDtcblxuICAgIHB1YmxpYyBmaWVsZFR5cGVFbnVtID0gRmllbGRUeXBlUmVzb3VyY2U7XG4gICAgcHVibGljIHRhc2tFbGVtZW50RW51bSA9IFRhc2tFbGVtZW50VHlwZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaXNPZmZzZXRQcmVzZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQgJiYgISF0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5vZmZzZXQ7XG4gICAgfVxuXG4gICAgZ2V0RmllbGRPZmZzZXQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNPZmZzZXRQcmVzZW50KCkgPyB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLmxheW91dC5vZmZzZXQgOiAwO1xuICAgIH1cblxuICAgIGdldEVsZW1lbnRUeXBlKCk6IFRhc2tDb250ZW50RWxlbWVudFR5cGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRWxlbWVudC50eXBlIGFzIFRhc2tDb250ZW50RWxlbWVudFR5cGU7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUdyb3VwVGl0bGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEVsZW1lbnQudGl0bGU7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUZpZWxkKCk6IERhdGFGaWVsZDx1bmtub3duPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRFbGVtZW50Lml0ZW07XG4gICAgfVxuXG4gICAgZ2V0VGFza0lkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRhc2tDb250ZW50U2VydmljZS50YXNrLnN0cmluZ0lkO1xuICAgIH1cblxuICAgIGlzRmllbGQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRFbGVtZW50LnR5cGUgIT09IFRhc2tFbGVtZW50VHlwZS5CTEFOSyAmJiB0aGlzLmdyaWRFbGVtZW50LnR5cGUgIT09IFRhc2tFbGVtZW50VHlwZS5EQVRBX0dST1VQX1RJVExFO1xuICAgIH1cblxuICAgIGlzQ3VzdG9tSGVpZ2h0KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSAhIXRoaXMuZ3JpZEVsZW1lbnQuaXRlbT8uY29tcG9uZW50ID8gdGhpcy5ncmlkRWxlbWVudC5pdGVtLmNvbXBvbmVudCA6IG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRFbGVtZW50LnR5cGUgPT09IEZpZWxkVHlwZVJlc291cmNlLkkxOE4gJiYgISFjb21wb25lbnRcbiAgICAgICAgICAgICYmIChjb21wb25lbnQubmFtZSA9PT0gJ2RpdmlkZXInXG4gICAgICAgICAgICAgICAgfHwgKCEhY29tcG9uZW50LnByb3BlcnRpZXMgJiYgJ3BsYWluVGV4dCcgaW4gY29tcG9uZW50LnByb3BlcnRpZXMgJiYgY29tcG9uZW50LnByb3BlcnRpZXMucGxhaW50VGV4dCA9PT0gJ3RydWUnKVxuICAgICAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZmllbGQtY29tcG9uZW50LXJlc29sdmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L2ZpZWxkLWNvbXBvbmVudC1yZXNvbHZlci9hYnN0cmFjdC1maWVsZC1jb21wb25lbnQtcmVzb2x2ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3BGLE9BQU8sRUFBeUIsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFM0YsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sb0RBQW9ELENBQUM7QUFDakcsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7QUFFM0M7O0dBRUc7QUFLSCxNQUFNLE9BQWdCLHVDQUF1QztJQU16RCxZQUFnQyxrQkFBc0MsRUFDYSx1QkFBdUM7UUFEMUYsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUNhLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBZ0I7UUFKbkgsa0JBQWEsR0FBRyxpQkFBaUIsQ0FBQztRQUNsQyxvQkFBZSxHQUFHLGVBQWUsQ0FBQztJQUl6QyxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hILElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztTQUMxRTtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUNqRDtJQUNMLENBQUM7SUFFUyxlQUFlO1FBQ3JCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkksQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBOEIsQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2IsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVM7UUFDTCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ2pELENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6SCxDQUFDO0lBRUQsY0FBYztRQUNWLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzlGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxTQUFTO2VBQy9ELENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTO21CQUN6QixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLFdBQVcsSUFBSSxTQUFTLENBQUMsVUFBVSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUNuSCxDQUFDO0lBQ1YsQ0FBQzs7cUlBekRpQix1Q0FBdUMsb0RBT2YsNkJBQTZCO3lIQVByRCx1Q0FBdUMscUhBRi9DLEVBQUU7NEZBRU0sdUNBQXVDO2tCQUo1RCxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx1Q0FBdUM7b0JBQ2pELFFBQVEsRUFBRSxFQUFFO2lCQUNmOzswQkFRMEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyw2QkFBNkI7NENBTjlELFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGFza0NvbnRlbnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy90YXNrLWNvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQge0RhdGFmaWVsZEdyaWRMYXlvdXRFbGVtZW50fSBmcm9tICcuLi9tb2RlbC9kYXRhZmllbGQtZ3JpZC1sYXlvdXQtZWxlbWVudCc7XG5pbXBvcnQge1Rhc2tDb250ZW50RWxlbWVudFR5cGUsIFRhc2tFbGVtZW50VHlwZX0gZnJvbSAnLi4vbW9kZWwvdGFzay1jb250ZW50LWVsZW1lbnQtdHlwZSc7XG5pbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtGaWVsZFR5cGVSZXNvdXJjZX0gZnJvbSAnLi4vbW9kZWwvZmllbGQtdHlwZS1yZXNvdXJjZSc7XG5pbXBvcnQge05BRV9JTkZPUk1fQUJPVVRfSU5WQUxJRF9EQVRBfSBmcm9tIFwiLi4vLi4vZGF0YS1maWVsZHMvbW9kZWxzL2ludmFsaWQtZGF0YS1wb2xpY3ktdG9rZW5cIjtcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBjb3JyZWN0IHtAbGluayBBYnN0cmFjdERhdGFGaWVsZENvbXBvbmVudH0gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcm92aWRlZCBkYXRhIGZpZWxkIG9iamVjdC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtZmllbGQtY29tcG9uZW50LXJlc29sdmVyJyxcbiAgICB0ZW1wbGF0ZTogJydcbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGaWVsZENvbXBvbmVudFJlc29sdmVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIGdyaWRFbGVtZW50OiBEYXRhZmllbGRHcmlkTGF5b3V0RWxlbWVudDtcblxuICAgIHB1YmxpYyBmaWVsZFR5cGVFbnVtID0gRmllbGRUeXBlUmVzb3VyY2U7XG4gICAgcHVibGljIHRhc2tFbGVtZW50RW51bSA9IFRhc2tFbGVtZW50VHlwZTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGFza0NvbnRlbnRTZXJ2aWNlOiBUYXNrQ29udGVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTkFFX0lORk9STV9BQk9VVF9JTlZBTElEX0RBVEEpIHByb3RlY3RlZCBfaW5mb3JtQWJvdXRJbnZhbGlkRGF0YTogYm9vbGVhbiB8IG51bGwpIHtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgaWYgKCEhdGhpcy5ncmlkRWxlbWVudC5pdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWRFbGVtZW50Lml0ZW0ucmVnaXN0ZXJGb3JtQ29udHJvbChuZXcgRm9ybUNvbnRyb2woJycsIHt1cGRhdGVPbjogdGhpcy5ncmlkRWxlbWVudC5pdGVtLmdldFVwZGF0ZU9uU3RyYXRlZ3koKX0pKTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZEVsZW1lbnQuaXRlbS5zZW5kSW52YWxpZFZhbHVlcyA9IHRoaXMuX2luZm9ybUFib3V0SW52YWxpZERhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKCEhdGhpcy5ncmlkRWxlbWVudD8uaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5ncmlkRWxlbWVudC5pdGVtLmRpc2Nvbm5lY3RGb3JtQ29udHJvbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzT2Zmc2V0UHJlc2VudCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzayAmJiAhIXRoaXMudGFza0NvbnRlbnRTZXJ2aWNlLnRhc2subGF5b3V0ICYmICEhdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQub2Zmc2V0O1xuICAgIH1cblxuICAgIGdldEZpZWxkT2Zmc2V0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzT2Zmc2V0UHJlc2VudCgpID8gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5sYXlvdXQub2Zmc2V0IDogMDtcbiAgICB9XG5cbiAgICBnZXRFbGVtZW50VHlwZSgpOiBUYXNrQ29udGVudEVsZW1lbnRUeXBlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZEVsZW1lbnQudHlwZSBhcyBUYXNrQ29udGVudEVsZW1lbnRUeXBlO1xuICAgIH1cblxuICAgIGdldERhdGFHcm91cFRpdGxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRFbGVtZW50LnRpdGxlO1xuICAgIH1cblxuICAgIGdldERhdGFGaWVsZCgpOiBEYXRhRmllbGQ8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRWxlbWVudC5pdGVtO1xuICAgIH1cblxuICAgIGdldFRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrQ29udGVudFNlcnZpY2UudGFzay5zdHJpbmdJZDtcbiAgICB9XG5cbiAgICBpc0ZpZWxkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRWxlbWVudC50eXBlICE9PSBUYXNrRWxlbWVudFR5cGUuQkxBTksgJiYgdGhpcy5ncmlkRWxlbWVudC50eXBlICE9PSBUYXNrRWxlbWVudFR5cGUuREFUQV9HUk9VUF9USVRMRTtcbiAgICB9XG5cbiAgICBpc0N1c3RvbUhlaWdodCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gISF0aGlzLmdyaWRFbGVtZW50Lml0ZW0/LmNvbXBvbmVudCA/IHRoaXMuZ3JpZEVsZW1lbnQuaXRlbS5jb21wb25lbnQgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkRWxlbWVudC50eXBlID09PSBGaWVsZFR5cGVSZXNvdXJjZS5JMThOICYmICEhY29tcG9uZW50XG4gICAgICAgICAgICAmJiAoY29tcG9uZW50Lm5hbWUgPT09ICdkaXZpZGVyJ1xuICAgICAgICAgICAgICAgIHx8ICghIWNvbXBvbmVudC5wcm9wZXJ0aWVzICYmICdwbGFpblRleHQnIGluIGNvbXBvbmVudC5wcm9wZXJ0aWVzICYmIGNvbXBvbmVudC5wcm9wZXJ0aWVzLnBsYWludFRleHQgPT09ICd0cnVlJylcbiAgICAgICAgICAgICk7XG4gICAgfVxufVxuIl19
@@ -18,7 +18,9 @@ export var FieldTypeResource;
18
18
  FieldTypeResource["ENUMERATION_MAP"] = "enumeration_map";
19
19
  FieldTypeResource["MULTICHOICE_MAP"] = "multichoice_map";
20
20
  FieldTypeResource["TASK_REF"] = "taskRef";
21
+ FieldTypeResource["CASE_REF"] = "caseRef";
21
22
  FieldTypeResource["FILTER"] = "filter";
22
23
  FieldTypeResource["I18N"] = "i18n";
24
+ FieldTypeResource["STRING_COLLECTION"] = "stringCollection";
23
25
  })(FieldTypeResource || (FieldTypeResource = {}));
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdHlwZS1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L21vZGVsL2ZpZWxkLXR5cGUtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxpQkFrQlg7QUFsQkQsV0FBWSxpQkFBaUI7SUFDekIsd0NBQW1CLENBQUE7SUFDbkIsa0NBQWEsQ0FBQTtJQUNiLHNDQUFpQixDQUFBO0lBQ2pCLGdEQUEyQixDQUFBO0lBQzNCLGdEQUEyQixDQUFBO0lBQzNCLGtDQUFhLENBQUE7SUFDYiwyQ0FBc0IsQ0FBQTtJQUN0QixrQ0FBYSxDQUFBO0lBQ2IsMkNBQXNCLENBQUE7SUFDdEIsc0NBQWlCLENBQUE7SUFDakIsa0NBQWEsQ0FBQTtJQUNiLDJDQUFzQixDQUFBO0lBQ3RCLHdEQUFtQyxDQUFBO0lBQ25DLHdEQUFtQyxDQUFBO0lBQ25DLHlDQUFvQixDQUFBO0lBQ3BCLHNDQUFpQixDQUFBO0lBQ2pCLGtDQUFhLENBQUE7QUFDakIsQ0FBQyxFQWxCVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBa0I1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29udGFpbnMgdHlwZXMgb2YgcmVuZGVyYWJsZSBkYXRhIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGVudW0gRmllbGRUeXBlUmVzb3VyY2Uge1xuICAgIEJPT0xFQU4gPSAnYm9vbGVhbicsXG4gICAgVEVYVCA9ICd0ZXh0JyxcbiAgICBOVU1CRVIgPSAnbnVtYmVyJyxcbiAgICBFTlVNRVJBVElPTiA9ICdlbnVtZXJhdGlvbicsXG4gICAgTVVMVElDSE9JQ0UgPSAnbXVsdGljaG9pY2UnLFxuICAgIERBVEUgPSAnZGF0ZScsXG4gICAgREFURV9USU1FID0gJ2RhdGVUaW1lJyxcbiAgICBVU0VSID0gJ3VzZXInLFxuICAgIFVTRVJfTElTVCA9ICd1c2VyTGlzdCcsXG4gICAgQlVUVE9OID0gJ2J1dHRvbicsXG4gICAgRklMRSA9ICdmaWxlJyxcbiAgICBGSUxFX0xJU1QgPSAnZmlsZUxpc3QnLFxuICAgIEVOVU1FUkFUSU9OX01BUCA9ICdlbnVtZXJhdGlvbl9tYXAnLFxuICAgIE1VTFRJQ0hPSUNFX01BUCA9ICdtdWx0aWNob2ljZV9tYXAnLFxuICAgIFRBU0tfUkVGID0gJ3Rhc2tSZWYnLFxuICAgIEZJTFRFUiA9ICdmaWx0ZXInLFxuICAgIEkxOE4gPSAnaTE4bidcbn1cbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQtdHlwZS1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvdGFzay1jb250ZW50L21vZGVsL2ZpZWxkLXR5cGUtcmVzb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxpQkFvQlg7QUFwQkQsV0FBWSxpQkFBaUI7SUFDekIsd0NBQW1CLENBQUE7SUFDbkIsa0NBQWEsQ0FBQTtJQUNiLHNDQUFpQixDQUFBO0lBQ2pCLGdEQUEyQixDQUFBO0lBQzNCLGdEQUEyQixDQUFBO0lBQzNCLGtDQUFhLENBQUE7SUFDYiwyQ0FBc0IsQ0FBQTtJQUN0QixrQ0FBYSxDQUFBO0lBQ2IsMkNBQXNCLENBQUE7SUFDdEIsc0NBQWlCLENBQUE7SUFDakIsa0NBQWEsQ0FBQTtJQUNiLDJDQUFzQixDQUFBO0lBQ3RCLHdEQUFtQyxDQUFBO0lBQ25DLHdEQUFtQyxDQUFBO0lBQ25DLHlDQUFvQixDQUFBO0lBQ3BCLHlDQUFvQixDQUFBO0lBQ3BCLHNDQUFpQixDQUFBO0lBQ2pCLGtDQUFhLENBQUE7SUFDYiwyREFBc0MsQ0FBQTtBQUMxQyxDQUFDLEVBcEJXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFvQjVCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb250YWlucyB0eXBlcyBvZiByZW5kZXJhYmxlIGRhdGEgZmllbGRzLlxuICovXG5leHBvcnQgZW51bSBGaWVsZFR5cGVSZXNvdXJjZSB7XG4gICAgQk9PTEVBTiA9ICdib29sZWFuJyxcbiAgICBURVhUID0gJ3RleHQnLFxuICAgIE5VTUJFUiA9ICdudW1iZXInLFxuICAgIEVOVU1FUkFUSU9OID0gJ2VudW1lcmF0aW9uJyxcbiAgICBNVUxUSUNIT0lDRSA9ICdtdWx0aWNob2ljZScsXG4gICAgREFURSA9ICdkYXRlJyxcbiAgICBEQVRFX1RJTUUgPSAnZGF0ZVRpbWUnLFxuICAgIFVTRVIgPSAndXNlcicsXG4gICAgVVNFUl9MSVNUID0gJ3VzZXJMaXN0JyxcbiAgICBCVVRUT04gPSAnYnV0dG9uJyxcbiAgICBGSUxFID0gJ2ZpbGUnLFxuICAgIEZJTEVfTElTVCA9ICdmaWxlTGlzdCcsXG4gICAgRU5VTUVSQVRJT05fTUFQID0gJ2VudW1lcmF0aW9uX21hcCcsXG4gICAgTVVMVElDSE9JQ0VfTUFQID0gJ211bHRpY2hvaWNlX21hcCcsXG4gICAgVEFTS19SRUYgPSAndGFza1JlZicsXG4gICAgQ0FTRV9SRUYgPSAnY2FzZVJlZicsXG4gICAgRklMVEVSID0gJ2ZpbHRlcicsXG4gICAgSTE4TiA9ICdpMThuJyxcbiAgICBTVFJJTkdfQ09MTEVDVElPTiA9ICdzdHJpbmdDb2xsZWN0aW9uJ1xufVxuIl19