@unifylib/ui-lib 1.1.3 → 1.1.4

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 (286) hide show
  1. package/esm2022/iq-ui-lib.mjs +5 -0
  2. package/esm2022/lib/base-model/SearchStrConfig.mjs +11 -0
  3. package/esm2022/lib/base-model/api-response.mjs +2 -0
  4. package/esm2022/lib/base-model/audit-log-entry.mjs +3 -0
  5. package/esm2022/lib/base-model/button-action-settings.mjs +16 -0
  6. package/esm2022/lib/base-model/column-def.model.mjs +28 -0
  7. package/esm2022/lib/base-model/do-action-request.mjs +8 -0
  8. package/esm2022/lib/base-model/field-action.mjs +6 -0
  9. package/esm2022/lib/base-model/field-filter.model.mjs +3 -0
  10. package/esm2022/lib/base-model/field-info.mjs +57 -0
  11. package/esm2022/lib/base-model/field-predicate.model.mjs +10 -0
  12. package/esm2022/lib/base-model/filter-request.mjs +13 -0
  13. package/esm2022/lib/base-model/filter.model.mjs +25 -0
  14. package/esm2022/lib/base-model/get-items-list.mjs +10 -0
  15. package/esm2022/lib/base-model/index.mjs +12 -0
  16. package/esm2022/lib/base-model/items-total.model.mjs +8 -0
  17. package/esm2022/lib/base-model/line-item.model.mjs +11 -0
  18. package/esm2022/lib/base-model/lookupItem.mjs +16 -0
  19. package/esm2022/lib/base-model/page-info.mjs +17 -0
  20. package/esm2022/lib/base-model/report-request.model.mjs +17 -0
  21. package/esm2022/lib/base-model/response-envelop.model.mjs +10 -0
  22. package/esm2022/lib/base-model/snack-message.model.mjs +11 -0
  23. package/esm2022/lib/base-model/table-column.interface.mjs +2 -0
  24. package/esm2022/lib/base-model/table-page-user-action.interface.mjs +21 -0
  25. package/esm2022/lib/base-model/workflow/workflow-steps.model.mjs +9 -0
  26. package/esm2022/lib/base-model/workflow/workflow.model.mjs +42 -0
  27. package/esm2022/lib/components/action-comment/action-comment.component.mjs +101 -0
  28. package/esm2022/lib/components/action-confirmation/action-confirmation.component.mjs +55 -0
  29. package/esm2022/lib/components/activity-report-form/activity-report-form.component.mjs +499 -0
  30. package/esm2022/lib/components/advanced-filter/field-filter/field-filter.component.mjs +41 -0
  31. package/esm2022/lib/components/advanced-filter/filter-builder/filter-builder.component.mjs +162 -0
  32. package/esm2022/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.mjs +70 -0
  33. package/esm2022/lib/components/audit-log-list/audit-log.component.mjs +99 -0
  34. package/esm2022/lib/components/auto-complete/auto-complete.component.mjs +292 -0
  35. package/esm2022/lib/components/base-form/base-form.component.mjs +297 -0
  36. package/esm2022/lib/components/base-form-canvas/base-form-canvas.component.mjs +591 -0
  37. package/esm2022/lib/components/base-input-dialog/base-input-dialog.component.mjs +72 -0
  38. package/esm2022/lib/components/base-table/base-table.component.mjs +514 -0
  39. package/esm2022/lib/components/button-actions/button-actions.component.mjs +70 -0
  40. package/esm2022/lib/components/editable-base-table/editable-base-table.component.mjs +496 -0
  41. package/esm2022/lib/components/equation-builder/equation-builder.component.mjs +112 -0
  42. package/esm2022/lib/components/item-line-editor/item-line-editor.component.mjs +299 -0
  43. package/esm2022/lib/components/multi-auto-complete/multi-auto-complete.component.mjs +278 -0
  44. package/esm2022/lib/components/paginator/paginator.component.mjs +91 -0
  45. package/esm2022/lib/components/report-details-dialog/report-details-dialog.component.mjs +102 -0
  46. package/esm2022/lib/components/report-form/report-form.component.mjs +498 -0
  47. package/esm2022/lib/components/search-bar/search-bar.component.mjs +62 -0
  48. package/esm2022/lib/components/section-form-canvas/section-form-canvas.component.mjs +81 -0
  49. package/esm2022/lib/components/shared/action-button/action-button.component.mjs +59 -0
  50. package/esm2022/lib/components/shared/action-card/action-card.component.mjs +93 -0
  51. package/esm2022/lib/components/shared/attachment-uploader/attachment-uploader.component.mjs +70 -0
  52. package/esm2022/lib/components/shared-list/shared-list.component.mjs +47 -0
  53. package/esm2022/lib/components/snackbar-static/snackbar-static.component.mjs +43 -0
  54. package/esm2022/lib/components/title-bar/title-bar.component.mjs +119 -0
  55. package/esm2022/lib/services/backend-service.mjs +240 -0
  56. package/esm2022/lib/services/index.mjs +4 -0
  57. package/esm2022/lib/services/top-panel.mjs +22 -0
  58. package/esm2022/lib/services/trigger-form.service.mjs +17 -0
  59. package/esm2022/lib/utils/base-utils.mjs +97 -0
  60. package/esm2022/lib/validators/date-range-validator.mjs +27 -0
  61. package/esm2022/lib/validators/index.mjs +4 -0
  62. package/esm2022/lib/validators/match-list.validator.mjs +9 -0
  63. package/esm2022/lib/validators/multi-email-validator.mjs +13 -0
  64. package/esm2022/public-api.mjs +29 -0
  65. package/esm2022/q-btech-ui-lib.mjs +5 -0
  66. package/esm2022/unifylib-ui-lib.mjs +5 -0
  67. package/fesm2022/iq-ui-lib.mjs +5625 -0
  68. package/fesm2022/iq-ui-lib.mjs.map +1 -0
  69. package/fesm2022/q-btech-ui-lib.mjs +5619 -0
  70. package/fesm2022/q-btech-ui-lib.mjs.map +1 -0
  71. package/fesm2022/unifylib-ui-lib.mjs +5625 -0
  72. package/fesm2022/unifylib-ui-lib.mjs.map +1 -0
  73. package/index.d.ts +5 -0
  74. package/lib/base-model/SearchStrConfig.d.ts +8 -0
  75. package/{src/lib/base-model/api-response.ts → lib/base-model/api-response.d.ts} +21 -23
  76. package/lib/base-model/audit-log-entry.d.ts +7 -0
  77. package/lib/base-model/button-action-settings.d.ts +15 -0
  78. package/lib/base-model/column-def.model.d.ts +11 -0
  79. package/lib/base-model/do-action-request.d.ts +10 -0
  80. package/lib/base-model/field-action.d.ts +6 -0
  81. package/lib/base-model/field-filter.model.d.ts +7 -0
  82. package/lib/base-model/field-info.d.ts +53 -0
  83. package/lib/base-model/field-predicate.model.d.ts +7 -0
  84. package/lib/base-model/filter-request.d.ts +15 -0
  85. package/lib/base-model/filter.model.d.ts +22 -0
  86. package/lib/base-model/get-items-list.d.ts +21 -0
  87. package/lib/base-model/index.d.ts +11 -0
  88. package/lib/base-model/items-total.model.d.ts +6 -0
  89. package/lib/base-model/line-item.model.d.ts +9 -0
  90. package/lib/base-model/lookupItem.d.ts +13 -0
  91. package/lib/base-model/page-info.d.ts +52 -0
  92. package/lib/base-model/report-request.model.d.ts +18 -0
  93. package/lib/base-model/response-envelop.model.d.ts +8 -0
  94. package/lib/base-model/snack-message.model.d.ts +7 -0
  95. package/lib/base-model/table-column.interface.d.ts +28 -0
  96. package/lib/base-model/table-page-user-action.interface.d.ts +14 -0
  97. package/lib/base-model/workflow/workflow-steps.model.d.ts +7 -0
  98. package/lib/base-model/workflow/workflow.model.d.ts +13 -0
  99. package/lib/components/action-comment/action-comment.component.d.ts +32 -0
  100. package/lib/components/action-confirmation/action-confirmation.component.d.ts +19 -0
  101. package/lib/components/activity-report-form/activity-report-form.component.d.ts +93 -0
  102. package/lib/components/advanced-filter/field-filter/field-filter.component.d.ts +20 -0
  103. package/lib/components/advanced-filter/filter-builder/filter-builder.component.d.ts +28 -0
  104. package/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.d.ts +25 -0
  105. package/lib/components/audit-log-list/audit-log.component.d.ts +36 -0
  106. package/lib/components/auto-complete/auto-complete.component.d.ts +51 -0
  107. package/lib/components/base-form/base-form.component.d.ts +59 -0
  108. package/lib/components/base-form-canvas/base-form-canvas.component.d.ts +124 -0
  109. package/lib/components/base-input-dialog/base-input-dialog.component.d.ts +23 -0
  110. package/lib/components/base-table/base-table.component.d.ts +128 -0
  111. package/lib/components/button-actions/button-actions.component.d.ts +17 -0
  112. package/lib/components/editable-base-table/editable-base-table.component.d.ts +106 -0
  113. package/lib/components/equation-builder/equation-builder.component.d.ts +23 -0
  114. package/lib/components/item-line-editor/item-line-editor.component.d.ts +64 -0
  115. package/lib/components/multi-auto-complete/multi-auto-complete.component.d.ts +51 -0
  116. package/lib/components/paginator/paginator.component.d.ts +26 -0
  117. package/lib/components/report-details-dialog/report-details-dialog.component.d.ts +34 -0
  118. package/lib/components/report-form/report-form.component.d.ts +92 -0
  119. package/lib/components/search-bar/search-bar.component.d.ts +29 -0
  120. package/lib/components/section-form-canvas/section-form-canvas.component.d.ts +27 -0
  121. package/lib/components/shared/action-button/action-button.component.d.ts +17 -0
  122. package/lib/components/shared/action-card/action-card.component.d.ts +37 -0
  123. package/lib/components/shared/attachment-uploader/attachment-uploader.component.d.ts +16 -0
  124. package/lib/components/shared-list/shared-list.component.d.ts +21 -0
  125. package/lib/components/snackbar-static/snackbar-static.component.d.ts +15 -0
  126. package/lib/components/title-bar/title-bar.component.d.ts +42 -0
  127. package/lib/services/backend-service.d.ts +59 -0
  128. package/{src/lib/services/index.ts → lib/services/index.d.ts} +3 -3
  129. package/lib/services/top-panel.d.ts +8 -0
  130. package/lib/services/trigger-form.service.d.ts +7 -0
  131. package/lib/utils/base-utils.d.ts +13 -0
  132. package/lib/validators/date-range-validator.d.ts +2 -0
  133. package/{src/lib/validators/index.ts → lib/validators/index.d.ts} +3 -3
  134. package/lib/validators/match-list.validator.d.ts +4 -0
  135. package/lib/validators/multi-email-validator.d.ts +6 -0
  136. package/package.json +27 -14
  137. package/{src/public-api.ts → public-api.d.ts} +25 -29
  138. package/ng-package.json +0 -7
  139. package/src/lib/base-model/SearchStrConfig.ts +0 -12
  140. package/src/lib/base-model/audit-log-entry.ts +0 -7
  141. package/src/lib/base-model/button-action-settings.ts +0 -29
  142. package/src/lib/base-model/column-def.model.ts +0 -34
  143. package/src/lib/base-model/do-action-request.ts +0 -11
  144. package/src/lib/base-model/feature-item.ts +0 -9
  145. package/src/lib/base-model/field-action.ts +0 -7
  146. package/src/lib/base-model/field-filter.model.ts +0 -7
  147. package/src/lib/base-model/field-info.ts +0 -102
  148. package/src/lib/base-model/field-predicate.model.ts +0 -7
  149. package/src/lib/base-model/filter-request.ts +0 -27
  150. package/src/lib/base-model/filter.model.ts +0 -49
  151. package/src/lib/base-model/get-items-list.ts +0 -24
  152. package/src/lib/base-model/index.ts +0 -11
  153. package/src/lib/base-model/items-total.model.ts +0 -12
  154. package/src/lib/base-model/line-item.model.ts +0 -18
  155. package/src/lib/base-model/lookupItem.ts +0 -21
  156. package/src/lib/base-model/null-snackmessage.ts +0 -9
  157. package/src/lib/base-model/page-info.ts +0 -54
  158. package/src/lib/base-model/report-request.model.ts +0 -33
  159. package/src/lib/base-model/response-envelop.model.ts +0 -15
  160. package/src/lib/base-model/snack-message.model.ts +0 -14
  161. package/src/lib/base-model/snackmessage-interface.ts +0 -7
  162. package/src/lib/base-model/table-column.interface.ts +0 -29
  163. package/src/lib/base-model/table-page-user-action.interface.ts +0 -33
  164. package/src/lib/base-model/workflow/workflow-steps.model.ts +0 -9
  165. package/src/lib/base-model/workflow/workflow.model.ts +0 -52
  166. package/src/lib/components/action-comment/action-comment.component.css +0 -52
  167. package/src/lib/components/action-comment/action-comment.component.html +0 -47
  168. package/src/lib/components/action-comment/action-comment.component.spec.ts +0 -23
  169. package/src/lib/components/action-comment/action-comment.component.ts +0 -102
  170. package/src/lib/components/action-confirmation/action-confirmation.component.css +0 -46
  171. package/src/lib/components/action-confirmation/action-confirmation.component.html +0 -32
  172. package/src/lib/components/action-confirmation/action-confirmation.component.spec.ts +0 -23
  173. package/src/lib/components/action-confirmation/action-confirmation.component.ts +0 -58
  174. package/src/lib/components/activity-report-form/activity-report-form.component.html +0 -110
  175. package/src/lib/components/activity-report-form/activity-report-form.component.scss +0 -69
  176. package/src/lib/components/activity-report-form/activity-report-form.component.spec.ts +0 -25
  177. package/src/lib/components/activity-report-form/activity-report-form.component.ts +0 -616
  178. package/src/lib/components/advanced-filter/field-filter/field-filter.component.html +0 -8
  179. package/src/lib/components/advanced-filter/field-filter/field-filter.component.scss +0 -0
  180. package/src/lib/components/advanced-filter/field-filter/field-filter.component.spec.ts +0 -25
  181. package/src/lib/components/advanced-filter/field-filter/field-filter.component.ts +0 -55
  182. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.html +0 -36
  183. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.scss +0 -130
  184. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.spec.ts +0 -25
  185. package/src/lib/components/advanced-filter/filter-builder/filter-builder.component.ts +0 -186
  186. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.css +0 -51
  187. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.html +0 -23
  188. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.spec.ts +0 -23
  189. package/src/lib/components/audit-log-details-dialog/audit-log-details-dialog.component.ts +0 -69
  190. package/src/lib/components/audit-log-list/audit-log.component.html +0 -26
  191. package/src/lib/components/audit-log-list/audit-log.component.scss +0 -50
  192. package/src/lib/components/audit-log-list/audit-log.component.spec.ts +0 -25
  193. package/src/lib/components/audit-log-list/audit-log.component.ts +0 -114
  194. package/src/lib/components/auto-complete/auto-complete.component.css +0 -55
  195. package/src/lib/components/auto-complete/auto-complete.component.html +0 -45
  196. package/src/lib/components/auto-complete/auto-complete.component.spec.ts +0 -23
  197. package/src/lib/components/auto-complete/auto-complete.component.ts +0 -331
  198. package/src/lib/components/base-form/base-form.component.html +0 -59
  199. package/src/lib/components/base-form/base-form.component.scss +0 -68
  200. package/src/lib/components/base-form/base-form.component.spec.ts +0 -25
  201. package/src/lib/components/base-form/base-form.component.ts +0 -323
  202. package/src/lib/components/base-form-canvas/base-form-canvas.component.css +0 -196
  203. package/src/lib/components/base-form-canvas/base-form-canvas.component.html +0 -1095
  204. package/src/lib/components/base-form-canvas/base-form-canvas.component.spec.ts +0 -23
  205. package/src/lib/components/base-form-canvas/base-form-canvas.component.ts +0 -680
  206. package/src/lib/components/base-input-dialog/base-input-dialog.component.css +0 -67
  207. package/src/lib/components/base-input-dialog/base-input-dialog.component.html +0 -47
  208. package/src/lib/components/base-input-dialog/base-input-dialog.component.spec.ts +0 -23
  209. package/src/lib/components/base-input-dialog/base-input-dialog.component.ts +0 -77
  210. package/src/lib/components/base-table/base-table.component.html +0 -268
  211. package/src/lib/components/base-table/base-table.component.scss +0 -140
  212. package/src/lib/components/base-table/base-table.component.spec.ts +0 -25
  213. package/src/lib/components/base-table/base-table.component.ts +0 -621
  214. package/src/lib/components/button-actions/button-actions.component.html +0 -27
  215. package/src/lib/components/button-actions/button-actions.component.scss +0 -101
  216. package/src/lib/components/button-actions/button-actions.component.spec.ts +0 -23
  217. package/src/lib/components/button-actions/button-actions.component.ts +0 -70
  218. package/src/lib/components/editable-base-table/editable-base-table.component.html +0 -337
  219. package/src/lib/components/editable-base-table/editable-base-table.component.scss +0 -126
  220. package/src/lib/components/editable-base-table/editable-base-table.component.spec.ts +0 -25
  221. package/src/lib/components/editable-base-table/editable-base-table.component.ts +0 -579
  222. package/src/lib/components/equation-builder/equation-builder.component.css +0 -39
  223. package/src/lib/components/equation-builder/equation-builder.component.html +0 -31
  224. package/src/lib/components/equation-builder/equation-builder.component.spec.ts +0 -23
  225. package/src/lib/components/equation-builder/equation-builder.component.ts +0 -119
  226. package/src/lib/components/item-line-editor/item-line-editor.component.html +0 -102
  227. package/src/lib/components/item-line-editor/item-line-editor.component.scss +0 -152
  228. package/src/lib/components/item-line-editor/item-line-editor.component.spec.ts +0 -23
  229. package/src/lib/components/item-line-editor/item-line-editor.component.ts +0 -306
  230. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.css +0 -19
  231. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.html +0 -38
  232. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.spec.ts +0 -23
  233. package/src/lib/components/multi-auto-complete/multi-auto-complete.component.ts +0 -315
  234. package/src/lib/components/paginator/paginator.component.css +0 -65
  235. package/src/lib/components/paginator/paginator.component.html +0 -30
  236. package/src/lib/components/paginator/paginator.component.ts +0 -87
  237. package/src/lib/components/report-details-dialog/report-details-dialog.component.css +0 -17
  238. package/src/lib/components/report-details-dialog/report-details-dialog.component.html +0 -16
  239. package/src/lib/components/report-details-dialog/report-details-dialog.component.spec.ts +0 -23
  240. package/src/lib/components/report-details-dialog/report-details-dialog.component.ts +0 -111
  241. package/src/lib/components/report-form/report-form.component.html +0 -92
  242. package/src/lib/components/report-form/report-form.component.scss +0 -51
  243. package/src/lib/components/report-form/report-form.component.spec.ts +0 -25
  244. package/src/lib/components/report-form/report-form.component.ts +0 -599
  245. package/src/lib/components/search-bar/search-bar.component.html +0 -51
  246. package/src/lib/components/search-bar/search-bar.component.scss +0 -63
  247. package/src/lib/components/search-bar/search-bar.component.spec.ts +0 -25
  248. package/src/lib/components/search-bar/search-bar.component.ts +0 -68
  249. package/src/lib/components/section-form-canvas/section-form-canvas.component.html +0 -43
  250. package/src/lib/components/section-form-canvas/section-form-canvas.component.scss +0 -81
  251. package/src/lib/components/section-form-canvas/section-form-canvas.component.spec.ts +0 -23
  252. package/src/lib/components/section-form-canvas/section-form-canvas.component.ts +0 -67
  253. package/src/lib/components/shared/action-button/action-button.component.html +0 -12
  254. package/src/lib/components/shared/action-button/action-button.component.scss +0 -45
  255. package/src/lib/components/shared/action-button/action-button.component.ts +0 -51
  256. package/src/lib/components/shared/action-card/action-card.component.html +0 -78
  257. package/src/lib/components/shared/action-card/action-card.component.scss +0 -238
  258. package/src/lib/components/shared/action-card/action-card.component.ts +0 -56
  259. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.css +0 -135
  260. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.html +0 -36
  261. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.spec.ts +0 -23
  262. package/src/lib/components/shared/attachment-uploader/attachment-uploader.component.ts +0 -71
  263. package/src/lib/components/shared-list/shared-list.component.css +0 -0
  264. package/src/lib/components/shared-list/shared-list.component.html +0 -17
  265. package/src/lib/components/shared-list/shared-list.component.spec.ts +0 -23
  266. package/src/lib/components/shared-list/shared-list.component.ts +0 -53
  267. package/src/lib/components/snackbar-static/snackbar-static.component.html +0 -20
  268. package/src/lib/components/snackbar-static/snackbar-static.component.scss +0 -135
  269. package/src/lib/components/snackbar-static/snackbar-static.component.ts +0 -26
  270. package/src/lib/components/title-bar/title-bar.component.css +0 -0
  271. package/src/lib/components/title-bar/title-bar.component.css.map +0 -1
  272. package/src/lib/components/title-bar/title-bar.component.html +0 -35
  273. package/src/lib/components/title-bar/title-bar.component.scss +0 -126
  274. package/src/lib/components/title-bar/title-bar.component.spec.ts +0 -23
  275. package/src/lib/components/title-bar/title-bar.component.ts +0 -126
  276. package/src/lib/services/backend-service.ts +0 -287
  277. package/src/lib/services/top-panel.ts +0 -17
  278. package/src/lib/services/trigger-form.service.ts +0 -11
  279. package/src/lib/share-module/shared-module.ts +0 -10
  280. package/src/lib/utils/base-utils.ts +0 -102
  281. package/src/lib/validators/date-range-validator.ts +0 -31
  282. package/src/lib/validators/match-list.validator.ts +0 -10
  283. package/src/lib/validators/multi-email-validator.ts +0 -15
  284. package/tsconfig.lib.json +0 -15
  285. package/tsconfig.lib.prod.json +0 -11
  286. package/tsconfig.spec.json +0 -15
@@ -0,0 +1,297 @@
1
+ import { Component, EventEmitter, Inject, Input, Output } from '@angular/core';
2
+ import { Filter, FilterRequest, NEW, SAVE_AND_COMPLETE, SnackMessage } from "../../base-model";
3
+ import { TranslateModule } from "@ngx-translate/core";
4
+ import { NgIf } from "@angular/common";
5
+ import { MatButton, MatButtonModule } from "@angular/material/button";
6
+ import { MatIconModule } from "@angular/material/icon";
7
+ import { TitleBarComponent } from "../title-bar/title-bar.component";
8
+ import { BaseFormCanvasComponent } from "../base-form-canvas/base-form-canvas.component";
9
+ import ClassicEditor from "@ckeditor/ckeditor5-build-classic";
10
+ import { DoActionRequest, SAVE } from "../../base-model/do-action-request";
11
+ import { ActionCommentComponent } from "../action-comment/action-comment.component";
12
+ import { BaseUtils, getNegativeWfActionKey, getPositiveWfActionKey, getWfActionId } from "../../utils/base-utils";
13
+ import { AuditLogComponent } from "../audit-log-list/audit-log.component";
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/material/dialog";
16
+ import * as i2 from "@angular/router";
17
+ import * as i3 from "@angular/cdk/bidi";
18
+ import * as i4 from "@angular/common";
19
+ import * as i5 from "../../services";
20
+ import * as i6 from "@angular/material/button";
21
+ import * as i7 from "@ngx-translate/core";
22
+ export class BaseFormComponent extends BaseUtils {
23
+ constructor(dialog, activatedRoute, router, directionality, location, securityManager, backendService) {
24
+ super();
25
+ this.dialog = dialog;
26
+ this.activatedRoute = activatedRoute;
27
+ this.router = router;
28
+ this.directionality = directionality;
29
+ this.location = location;
30
+ this.securityManager = securityManager;
31
+ this.backendService = backendService;
32
+ this.fields = [];
33
+ this.errors = [];
34
+ this.editable = false;
35
+ this.actionResultEmitter = new EventEmitter();
36
+ this.formUpdated = new EventEmitter();
37
+ this.itemLoaded = new EventEmitter();
38
+ this.extraAction = new EventEmitter();
39
+ this.item = {};
40
+ this.isLoaded = false;
41
+ this.hyperTextEvent = new EventEmitter();
42
+ this.isSaveDisabled = true;
43
+ this.isRejectDisabled = true;
44
+ this.hideBackButton = true;
45
+ this.SAVE = SAVE;
46
+ this.getPositiveWfActionKey = getPositiveWfActionKey;
47
+ this.getNegativeWfActionKey = getNegativeWfActionKey;
48
+ ClassicEditor.defaultConfig = {
49
+ toolbar: {
50
+ items: ['heading', '|', 'bold', 'italic', '|', 'bulletedList', 'numberedList']
51
+ },
52
+ image: {
53
+ toolbar: ['imageStyle:side', '|', 'imageTextAlternative']
54
+ },
55
+ table: {
56
+ contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells']
57
+ },
58
+ language: 'en'
59
+ };
60
+ }
61
+ ngOnInit() {
62
+ this.currentDirection = this.directionality.value;
63
+ this.directionality.change.subscribe((value) => {
64
+ this.currentDirection = value;
65
+ });
66
+ // console.log('editable', this.editable)
67
+ this.securityManager.loadPermissions().subscribe(x => {
68
+ console.log("before edit", this.editable);
69
+ this.loadItem();
70
+ console.log("after edit", this.editable);
71
+ });
72
+ }
73
+ ngOnChanges({ item, errors, fields }) {
74
+ }
75
+ isValid() {
76
+ return this.backendService.parentForm?.valid;
77
+ }
78
+ isMatchHeight() {
79
+ return this.pageInfo.pageHeight === 'match';
80
+ }
81
+ loadItem() {
82
+ this.editable = false;
83
+ const modeEncrypted = this.activatedRoute.snapshot.queryParams['mode'];
84
+ this.isPending = !!modeEncrypted && this.backendService.decrypt(modeEncrypted) === 'pending';
85
+ if (this.activatedRoute.snapshot.queryParams['token'] && this.activatedRoute.snapshot.queryParams['mode']) {
86
+ this.itemId = this.backendService.decrypt(this.activatedRoute.snapshot.queryParams['token']);
87
+ }
88
+ else {
89
+ // console.log(' ****** ****** ****** ****** error in url ')
90
+ }
91
+ if (this.itemId > 0) {
92
+ const filterRequest = new FilterRequest;
93
+ filterRequest.columns = this.fields.filter(c => c.type !== 'spacer').map(c => c.property);
94
+ filterRequest.pendingPage = this.isPending;
95
+ filterRequest.filters = [];
96
+ filterRequest.filters.push(new Filter({
97
+ key: 0,
98
+ fieldType: 'Long',
99
+ fieldName: 'id',
100
+ valueObject: this.itemId,
101
+ filterType: 'FILED_FILTER',
102
+ operator: 'EQUALS'
103
+ }));
104
+ ///audit-log
105
+ this.backendService.getItemAuditLog(filterRequest, this.pageInfo.apiUri).subscribe(resp => {
106
+ // console.log('resp', resp);
107
+ });
108
+ this.backendService.getItemsByFilter(filterRequest, this.pageInfo.apiUri).subscribe(resp => {
109
+ if (resp?.valid && resp.body?.length >= 0) {
110
+ this.item = resp.body[0];
111
+ this.editable = (!this.pageInfo.draftSupported || !this.isPending) && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
112
+ && (!this.pageInfo.draftSupported || this.item['stateType'] === 'COMPLETED');
113
+ this.itemLoaded.emit(this.item);
114
+ this.isLoaded = true;
115
+ }
116
+ });
117
+ }
118
+ else {
119
+ this.editable = this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT');
120
+ this.item = {};
121
+ this.itemLoaded.emit(this.item);
122
+ this.isLoaded = true;
123
+ }
124
+ }
125
+ buildDoActionSubject() {
126
+ const newVar = this.editable ? Object.assign(this.item, this.backendService.parentForm.value) : this.item;
127
+ if (this.itemId <= 0 && this.editable) {
128
+ //TODO this is like a hack and must be handled from backend
129
+ newVar['stateType'] = 'NEW';
130
+ }
131
+ this.fields.forEach(field => {
132
+ if (field.flattenBySubAttribute) {
133
+ newVar[field.property] = newVar[field.property][field.flattenBySubAttribute];
134
+ }
135
+ });
136
+ if (!this.pageInfo.draftSupported) {
137
+ newVar['status'] = true;
138
+ }
139
+ return newVar;
140
+ }
141
+ doSaveApproveAction() {
142
+ let actionId = getWfActionId(this.item.stateType);
143
+ if (this.itemId <= 0 && this.editable) {
144
+ actionId = NEW;
145
+ }
146
+ if (!this.pageInfo.draftSupported) {
147
+ actionId = SAVE_AND_COMPLETE;
148
+ }
149
+ if (this.editable && this.backendService.parentForm.valid !== true) {
150
+ this.backendService.topPanelMessage$.next(new SnackMessage('INVALID_INPUT_FORM', true, 'error'));
151
+ return;
152
+ }
153
+ const request = new DoActionRequest();
154
+ request.actionId = actionId;
155
+ request.subject = this.buildDoActionSubject();
156
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
157
+ data: { label: 'save', isTermination: false },
158
+ width: '600px',
159
+ height: 'auto',
160
+ direction: this.currentDirection
161
+ });
162
+ dialogRef.afterClosed().subscribe(result => {
163
+ if (result) {
164
+ request.comment = result.comment;
165
+ this.backendService.doActionWithAttachments(request, [], this.pageInfo).subscribe(resp => {
166
+ console.log('step', actionId);
167
+ this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
168
+ if (resp.valid) {
169
+ let message = 'approve_successfully';
170
+ switch (actionId) {
171
+ case 1:
172
+ message = 'saved_successfully';
173
+ break;
174
+ case 2:
175
+ message = 'updated_successfully';
176
+ break;
177
+ default:
178
+ message = 'approve_successfully';
179
+ }
180
+ this.backendService.topPanelMessage$.next(new SnackMessage(message, true, 'success'));
181
+ if (!this.pageInfo.stayOnPage) {
182
+ this.backToParent();
183
+ }
184
+ }
185
+ else {
186
+ request.subject['stateType'] = null;
187
+ if (resp.message[0].errorMessage.toLowerCase().includes('duplic'))
188
+ this.backendService.topPanelMessage$.next(new SnackMessage(this.pageInfo.labelsSection + '.' + resp.message[0].errorCode, true, 'error'));
189
+ }
190
+ });
191
+ }
192
+ });
193
+ }
194
+ backToParent() {
195
+ const idIdx = this.router.url.lastIndexOf('/');
196
+ this.router.navigateByUrl(this.router.url.substring(0, idIdx));
197
+ }
198
+ getTitle() {
199
+ return `${this.pageInfo.labelsSection}.${this.pageInfo.id}`;
200
+ }
201
+ updateForm($event) {
202
+ this.backendService.parentForm = $event;
203
+ this.formUpdated.emit($event);
204
+ }
205
+ doCancelRejectAction() {
206
+ if (!this.editable) {
207
+ let actionId = 3;
208
+ // console.log('actionId',actionId);
209
+ const request = new DoActionRequest();
210
+ request.actionId = actionId;
211
+ request.subject = this.buildDoActionSubject();
212
+ const dialogRef = this.dialog.open(ActionCommentComponent, {
213
+ data: { label: 'reject', acceptActionLabel: 'accept', rejectActionLabel: 'return' },
214
+ width: '600px',
215
+ height: 'auto',
216
+ direction: this.currentDirection
217
+ });
218
+ dialogRef.afterClosed().subscribe(result => {
219
+ if (result) {
220
+ request.comment = result.comment;
221
+ this.backendService.doActionWithAttachments(request, [], this.pageInfo).subscribe(resp => {
222
+ this.actionResultEmitter.emit({ valid: resp.valid, actionId: actionId });
223
+ if (resp.valid) {
224
+ this.backendService.topPanelMessage$.next(new SnackMessage('successful_reject_message', true, 'success'));
225
+ if (!this.pageInfo.stayOnPage) {
226
+ this.backToParent();
227
+ }
228
+ }
229
+ });
230
+ }
231
+ });
232
+ }
233
+ else {
234
+ this.location.back();
235
+ }
236
+ }
237
+ hasWfPermission() {
238
+ return (this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT')
239
+ || this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')
240
+ || this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE'));
241
+ }
242
+ hasWfPositivePermission() {
243
+ return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'COMPLETE')) ||
244
+ (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'));
245
+ }
246
+ hasWfNegativePermission() {
247
+ return (!this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'TERMINATE')) ||
248
+ (this.editable && this.securityManager.hasPagePermission(this.pageInfo.id, 'EDIT'));
249
+ }
250
+ doExtraAction() {
251
+ this.extraAction.emit();
252
+ }
253
+ disabledSaveButton(element) {
254
+ return (!this.isPending && element.stateType == 'PENDING') && this.pageInfo.draftSupported;
255
+ }
256
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFormComponent, deps: [{ token: i1.MatDialog }, { token: i2.ActivatedRoute }, { token: i2.Router }, { token: i3.Directionality }, { token: i4.Location }, { token: 'securityManager' }, { token: i5.BackendService }], target: i0.ɵɵFactoryTarget.Component }); }
257
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: BaseFormComponent, isStandalone: true, selector: "app-base-form", inputs: { pageInfo: "pageInfo", fields: "fields", errors: "errors", editable: "editable", itemId: "itemId", hideBackButton: "hideBackButton" }, outputs: { actionResultEmitter: "actionResultEmitter", formUpdated: "formUpdated", itemLoaded: "itemLoaded", extraAction: "extraAction", hyperTextEvent: "hyperTextEvent" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"page-container\">\r\n\r\n <div class=\"row full-width mt-2vh\">\r\n <div class=\"column full-width\">\r\n <app-title-bar\r\n [pageTitle]=\"getTitle()\"\r\n [newAction]=\"false\"\r\n [hideBackButton]=\"hideBackButton\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"editable\"\r\n [errors]=\"errors\"\r\n [item]=\"item\"\r\n (formUpdated)=\"updateForm($event)\">\r\n </app-base-form-canvas>\r\n\r\n <div class=\"row main-form-canvas mt-3vh\">\r\n <div class=\"column flex-49\">\r\n <div class=\"row row-center-start\">\r\n <button *ngIf=\"hasWfPositivePermission()\" color=\"primary\" mat-flat-button\r\n (click)=\"doSaveApproveAction()\"\r\n [disabled]=\"disabledSaveButton(item)\"\r\n class=\"action-button\"\r\n id=\"base-form-positive-btn\">\r\n {{ getPositiveWfActionKey(item?.stateType) | translate }}\r\n </button>\r\n <button *ngIf=\"hasWfNegativePermission()\" color=\"second\" mat-raised-button\r\n (click)=\"doCancelRejectAction()\"\r\n [disabled]=\"disabledSaveButton(item)\"\r\n class=\"action-button\"\r\n id=\"base-form-negative-btn\">\r\n {{ getNegativeWfActionKey(item?.stateType) | translate }}\r\n </button>\r\n <button *ngIf=\"pageInfo.hideExtractButton === false && itemId > 0 && editable\" color=\"primary\" mat-raised-button\r\n (click)=\"doExtraAction()\"\r\n class=\"action-button\"\r\n id=\"base-form-extra-btn\">\r\n {{ pageInfo.labelsSection + \".\" + \"EXTRA_BUTTON_NAME\" | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"column flex-49\"></div>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"!pageInfo.hideAuditLog\">\r\n <div class=\"row main-form-canvas mt-4vh pb-5vh\">\r\n <div class=\"column flex-95\">\r\n <app-audit-log [pageInfo]=\"pageInfo\" [fields]=\"fields\"></app-audit-log>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: [".page-container{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;gap:10px;width:100%;flex-wrap:wrap}.column{display:flex;flex-direction:column}.full-width{width:100%}.flex-49{flex:0 0 49%}.flex-95{flex:0 0 95%}.row-center-start{align-items:center;justify-content:flex-start}.mt-2vh{margin-top:2vh}.mt-3vh{margin-top:3vh}.mt-4vh{margin-top:4vh}.pb-5vh{padding-bottom:5vh}.action-button{font-weight:700;min-width:140px;max-width:200px;margin:0 10px}@media (max-width: 960px){.flex-49,.flex-95{flex:1 1 100%}}@media (max-width: 600px){.row{flex-direction:column;align-items:center}.action-button{width:100%;max-width:300px;margin:5px 0}}\n"], dependencies: [{ kind: "component", type: TitleBarComponent, selector: "app-title-bar", inputs: ["pageTitle", "showExtractButton", "totalElements", "titleMode", "subTitle", "statusDesc", "newAction", "extraButton", "showDetails", "showImport", "showButton", "extraData", "titleCorporateAdmin", "hideBackButton", "buttons"], outputs: ["newActionClicked", "extraButtonClicked", "extractReport", "buttonClicked"] }, { kind: "component", type: BaseFormCanvasComponent, selector: "app-base-form-canvas", inputs: ["pageInfo", "currency", "fields", "errors", "workflowEditableFields", "isWorkflowEditableManaged", "supportingAttributes", "editable", "emitOnValueChanges", "item", "equationSuggestedFields", "currentEquationValue"], outputs: ["attachmentEmitter", "actionEmitter", "formUpdated", "hyperTextEvent", "currentEquationValueChange"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: AuditLogComponent, selector: "app-audit-log", inputs: ["pageInfo", "fields", "showHiddenFields"] }] }); }
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFormComponent, decorators: [{
260
+ type: Component,
261
+ args: [{ selector: 'app-base-form', standalone: true, imports: [
262
+ TitleBarComponent,
263
+ BaseFormCanvasComponent,
264
+ MatButtonModule,
265
+ TranslateModule,
266
+ NgIf,
267
+ MatIconModule,
268
+ MatButton,
269
+ AuditLogComponent
270
+ ], template: "<div class=\"page-container\">\r\n\r\n <div class=\"row full-width mt-2vh\">\r\n <div class=\"column full-width\">\r\n <app-title-bar\r\n [pageTitle]=\"getTitle()\"\r\n [newAction]=\"false\"\r\n [hideBackButton]=\"hideBackButton\">\r\n </app-title-bar>\r\n </div>\r\n </div>\r\n\r\n <app-base-form-canvas\r\n [pageInfo]=\"pageInfo\"\r\n [fields]=\"fields\"\r\n [editable]=\"editable\"\r\n [errors]=\"errors\"\r\n [item]=\"item\"\r\n (formUpdated)=\"updateForm($event)\">\r\n </app-base-form-canvas>\r\n\r\n <div class=\"row main-form-canvas mt-3vh\">\r\n <div class=\"column flex-49\">\r\n <div class=\"row row-center-start\">\r\n <button *ngIf=\"hasWfPositivePermission()\" color=\"primary\" mat-flat-button\r\n (click)=\"doSaveApproveAction()\"\r\n [disabled]=\"disabledSaveButton(item)\"\r\n class=\"action-button\"\r\n id=\"base-form-positive-btn\">\r\n {{ getPositiveWfActionKey(item?.stateType) | translate }}\r\n </button>\r\n <button *ngIf=\"hasWfNegativePermission()\" color=\"second\" mat-raised-button\r\n (click)=\"doCancelRejectAction()\"\r\n [disabled]=\"disabledSaveButton(item)\"\r\n class=\"action-button\"\r\n id=\"base-form-negative-btn\">\r\n {{ getNegativeWfActionKey(item?.stateType) | translate }}\r\n </button>\r\n <button *ngIf=\"pageInfo.hideExtractButton === false && itemId > 0 && editable\" color=\"primary\" mat-raised-button\r\n (click)=\"doExtraAction()\"\r\n class=\"action-button\"\r\n id=\"base-form-extra-btn\">\r\n {{ pageInfo.labelsSection + \".\" + \"EXTRA_BUTTON_NAME\" | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"column flex-49\"></div>\r\n </div>\r\n\r\n\r\n <ng-container *ngIf=\"!pageInfo.hideAuditLog\">\r\n <div class=\"row main-form-canvas mt-4vh pb-5vh\">\r\n <div class=\"column flex-95\">\r\n <app-audit-log [pageInfo]=\"pageInfo\" [fields]=\"fields\"></app-audit-log>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n", styles: [".page-container{display:flex;flex-direction:column;width:100%}.row{display:flex;flex-direction:row;gap:10px;width:100%;flex-wrap:wrap}.column{display:flex;flex-direction:column}.full-width{width:100%}.flex-49{flex:0 0 49%}.flex-95{flex:0 0 95%}.row-center-start{align-items:center;justify-content:flex-start}.mt-2vh{margin-top:2vh}.mt-3vh{margin-top:3vh}.mt-4vh{margin-top:4vh}.pb-5vh{padding-bottom:5vh}.action-button{font-weight:700;min-width:140px;max-width:200px;margin:0 10px}@media (max-width: 960px){.flex-49,.flex-95{flex:1 1 100%}}@media (max-width: 600px){.row{flex-direction:column;align-items:center}.action-button{width:100%;max-width:300px;margin:5px 0}}\n"] }]
271
+ }], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.ActivatedRoute }, { type: i2.Router }, { type: i3.Directionality }, { type: i4.Location }, { type: undefined, decorators: [{
272
+ type: Inject,
273
+ args: ['securityManager']
274
+ }] }, { type: i5.BackendService }], propDecorators: { pageInfo: [{
275
+ type: Input
276
+ }], fields: [{
277
+ type: Input
278
+ }], errors: [{
279
+ type: Input
280
+ }], editable: [{
281
+ type: Input
282
+ }], itemId: [{
283
+ type: Input
284
+ }], actionResultEmitter: [{
285
+ type: Output
286
+ }], formUpdated: [{
287
+ type: Output
288
+ }], itemLoaded: [{
289
+ type: Output
290
+ }], extraAction: [{
291
+ type: Output
292
+ }], hyperTextEvent: [{
293
+ type: Output
294
+ }], hideBackButton: [{
295
+ type: Input
296
+ }] } });
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludm9pY2VxL3VpLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvYmFzZS1mb3JtL2Jhc2UtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZvaWNlcS91aS1saWIvc3JjL2xpYi9jb21wb25lbnRzL2Jhc2UtZm9ybS9iYXNlLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUMvRyxPQUFPLEVBQVksTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQVksaUJBQWlCLEVBQUUsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbEgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBR3BELE9BQU8sRUFBVyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUN2RixPQUFPLGFBQWEsTUFBTSxtQ0FBbUMsQ0FBQztBQUM5RCxPQUFPLEVBQUMsZUFBZSxFQUFFLElBQUksRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBRWxGLE9BQU8sRUFBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFaEgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7OztBQW1CeEUsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUE0QzVDLFlBQW1CLE1BQWlCLEVBQ2hCLGNBQThCLEVBQzlCLE1BQWEsRUFDYixjQUE4QixFQUM5QixRQUFpQixFQUNVLGVBQW9CLEVBQ2hELGNBQThCO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBUFMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNoQixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUNiLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ1Usb0JBQWUsR0FBZixlQUFlLENBQUs7UUFDaEQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBNUNuRCxXQUFNLEdBQWdCLEVBQUUsQ0FBQztRQUd6QixXQUFNLEdBQW1CLEVBQUUsQ0FBQztRQUc1QixhQUFRLEdBQVksS0FBSyxDQUFDO1FBTTFCLHdCQUFtQixHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR2pFLGdCQUFXLEdBQTRCLElBQUksWUFBWSxFQUFhLENBQUM7UUFHckUsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR3hELGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFFekQsU0FBSSxHQUFTLEVBQUUsQ0FBQztRQUNoQixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBRzNCLG1CQUFjLEdBQTBCLElBQUksWUFBWSxFQUFFLENBQUM7UUFHM0QsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDL0IscUJBQWdCLEdBQVksSUFBSSxDQUFDO1FBR2pDLG1CQUFjLEdBQVksSUFBSSxDQUFDO1FBQ1osU0FBSSxHQUFHLElBQUksQ0FBQztRQWlPWiwyQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQUNoRCwyQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztRQXZOOUQsYUFBYSxDQUFDLGFBQWEsR0FBRztZQUN6QixPQUFPLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsY0FBYyxDQUFDO2FBQ2pGO1lBQ0QsS0FBSyxFQUFFO2dCQUNILE9BQU8sRUFBRSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxzQkFBc0IsQ0FBQzthQUM1RDtZQUNELEtBQUssRUFBRTtnQkFDSCxjQUFjLEVBQUUsQ0FBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFFO2FBQ25FO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQztJQUNOLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzdDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUE7UUFFRix5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQWdCO0lBQ2pELENBQUM7SUFFRCxPQUFPO1FBQ0gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7SUFDakQsQ0FBQztJQUVELGFBQWE7UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxLQUFLLE9BQU8sQ0FBQztJQUNoRCxDQUFDO0lBRUssUUFBUTtRQUNkLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXRCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssU0FBUyxDQUFDO1FBRTdGLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQzthQUFNLENBQUM7WUFDTiw0REFBNEQ7UUFDOUQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixNQUFNLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUN4QyxhQUFhLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUYsYUFBYSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1lBRTNDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQzNCLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDO2dCQUNwQyxHQUFHLEVBQUUsQ0FBQztnQkFDTixTQUFTLEVBQUUsTUFBTTtnQkFDakIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUN4QixVQUFVLEVBQUUsY0FBYztnQkFDMUIsUUFBUSxFQUFFLFFBQVE7YUFDbkIsQ0FBQyxDQUFDLENBQUM7WUFDSixZQUFZO1lBQ1osSUFBSSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUN6Riw2QkFBNkI7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsUUFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUYsSUFBSSxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDOzJCQUNqSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLElBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxXQUFXLENBQUUsQ0FBQztvQkFDL0UsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztnQkFDdkIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDakYsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztJQUVILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFHLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRyxDQUFDO1lBQ3ZDLDJEQUEyRDtZQUMzRCxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzlCLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLEtBQUssQ0FBQyxxQkFBcUIsRUFBQyxDQUFDO2dCQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUE7WUFDOUUsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFDLENBQUM7WUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUdELG1CQUFtQjtRQUNqQixJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUcsQ0FBQztZQUN2QyxRQUFRLEdBQUcsR0FBRyxDQUFBO1FBQ2hCLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNsQyxRQUFRLEdBQUcsaUJBQWlCLENBQUE7UUFDOUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDakcsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDekQsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFDO1lBQzNDLEtBQUssRUFBRSxPQUFPO1lBQ2QsTUFBTSxFQUFFLE1BQU07WUFDZCxTQUFTLEVBQUcsSUFBSSxDQUFDLGdCQUFnQjtTQUNsQyxDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pDLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDeEYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztvQkFDekUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFHLENBQUM7d0JBQ2hCLElBQUksT0FBTyxHQUFHLHNCQUFzQixDQUFDO3dCQUNyQyxRQUFRLFFBQVEsRUFBRSxDQUFDOzRCQUNqQixLQUFLLENBQUM7Z0NBQ0osT0FBTyxHQUFHLG9CQUFvQixDQUFDO2dDQUMvQixNQUFNOzRCQUNSLEtBQUssQ0FBQztnQ0FDSixPQUFPLEdBQUcsc0JBQXNCLENBQUM7Z0NBQ2pDLE1BQU07NEJBQ1I7Z0NBQ0UsT0FBTyxHQUFHLHNCQUFzQixDQUFDO3dCQUNyQyxDQUFDO3dCQUNELElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzt3QkFDckYsSUFBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFDLENBQUM7NEJBQzVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDdEIsQ0FBQztvQkFDSixDQUFDO3lCQUNHLENBQUM7d0JBQ0gsT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3BDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQzs0QkFDakUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO29CQUM1SSxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFlBQVk7UUFDUixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFHRCxRQUFRO1FBQ0YsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUU7SUFDakUsQ0FBQztJQUVELFVBQVUsQ0FBQyxNQUFpQjtRQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVILG9CQUFvQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBQyxDQUFDO1lBQ2xCLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztZQUNqQixvQ0FBb0M7WUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUN0QyxPQUFPLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUM1QixPQUFPLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBRTlDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO2dCQUN6RCxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQUM7Z0JBQ2pGLEtBQUssRUFBRSxPQUFPO2dCQUNkLE1BQU0sRUFBRSxNQUFNO2dCQUNkLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO2FBQ2pDLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO29CQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDeEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO3dCQUN6RSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDZixJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQywyQkFBMkIsRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQzs0QkFDMUcsSUFBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFDLENBQUM7Z0NBQzVCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDdEIsQ0FBQzt3QkFDSCxDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN0QixDQUFDO0lBQ0QsQ0FBQztJQUVILGVBQWU7UUFDYixPQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUM7ZUFDdEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUM7ZUFDcEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO0lBQzNFLENBQUM7SUFLRCx1QkFBdUI7UUFDckIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzdGLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDdkYsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUYsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDekIsQ0FBQztJQUNELGtCQUFrQixDQUFDLE9BQU87UUFDeEIsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFFO0lBQzlGLENBQUM7K0dBNVJVLGlCQUFpQixxSkFpRE4saUJBQWlCO21HQWpENUIsaUJBQWlCLGtiQ3BDOUIsbXNFQTJEQSx3dEJEbkNJLGlCQUFpQiw2WEFDakIsdUJBQXVCLGtaQUN2QixlQUFlLDJOQUNmLGVBQWUsNEZBQ2YsSUFBSSw0RkFDSixhQUFhLCtCQUViLGlCQUFpQjs7NEZBS1IsaUJBQWlCO2tCQWhCN0IsU0FBUzsrQkFDSSxlQUFlLGNBQ2IsSUFBSSxXQUNUO3dCQUNQLGlCQUFpQjt3QkFDakIsdUJBQXVCO3dCQUN2QixlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsSUFBSTt3QkFDSixhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsaUJBQWlCO3FCQUNsQjs7MEJBcURjLE1BQU07MkJBQUMsaUJBQWlCO3NFQTlDOUIsUUFBUTtzQkFEaEIsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sTUFBTTtzQkFETCxLQUFLO2dCQUlOLFFBQVE7c0JBRFAsS0FBSztnQkFJTixNQUFNO3NCQURMLEtBQUs7Z0JBSU4sbUJBQW1CO3NCQURsQixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxVQUFVO3NCQURULE1BQU07Z0JBSVAsV0FBVztzQkFEVixNQUFNO2dCQU9QLGNBQWM7c0JBRGIsTUFBTTtnQkFRUCxjQUFjO3NCQURiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtGaWVsZEluZm8sIEZpbHRlciwgRmlsdGVyUmVxdWVzdCwgTkVXLCBQYWdlSW5mbywgU0FWRV9BTkRfQ09NUExFVEUsIFNuYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL2Jhc2UtbW9kZWxcIjtcclxuaW1wb3J0IHtGaWVsZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2FwaS1yZXNwb25zZVwiO1xyXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSBcIkBuZ3gtdHJhbnNsYXRlL2NvcmVcIjtcclxuaW1wb3J0IHtCYWNrZW5kU2VydmljZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XHJcbmltcG9ydCB7Rm9ybUdyb3VwfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcclxuaW1wb3J0IHtMb2NhdGlvbiwgTmdJZn0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQge01hdEJ1dHRvbiwgTWF0QnV0dG9uTW9kdWxlfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uXCI7XHJcbmltcG9ydCB7TWF0SWNvbk1vZHVsZX0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2ljb25cIjtcclxuaW1wb3J0IHtUaXRsZUJhckNvbXBvbmVudH0gZnJvbSBcIi4uL3RpdGxlLWJhci90aXRsZS1iYXIuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QmFzZUZvcm1DYW52YXNDb21wb25lbnR9IGZyb20gXCIuLi9iYXNlLWZvcm0tY2FudmFzL2Jhc2UtZm9ybS1jYW52YXMuY29tcG9uZW50XCI7XHJcbmltcG9ydCBDbGFzc2ljRWRpdG9yIGZyb20gXCJAY2tlZGl0b3IvY2tlZGl0b3I1LWJ1aWxkLWNsYXNzaWNcIjtcclxuaW1wb3J0IHtEb0FjdGlvblJlcXVlc3QsIFNBVkV9IGZyb20gXCIuLi8uLi9iYXNlLW1vZGVsL2RvLWFjdGlvbi1yZXF1ZXN0XCI7XHJcbmltcG9ydCB7QWN0aW9uQ29tbWVudENvbXBvbmVudH0gZnJvbSBcIi4uL2FjdGlvbi1jb21tZW50L2FjdGlvbi1jb21tZW50LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge01hdERpYWxvZ30gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQge0Jhc2VVdGlscywgZ2V0TmVnYXRpdmVXZkFjdGlvbktleSwgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSwgZ2V0V2ZBY3Rpb25JZH0gZnJvbSBcIi4uLy4uL3V0aWxzL2Jhc2UtdXRpbHNcIjtcclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7QXVkaXRMb2dDb21wb25lbnR9IGZyb20gXCIuLi9hdWRpdC1sb2ctbGlzdC9hdWRpdC1sb2cuY29tcG9uZW50XCI7XHJcbmltcG9ydCB7RGlyZWN0aW9uYWxpdHl9IGZyb20gXCJAYW5ndWxhci9jZGsvYmlkaVwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2FwcC1iYXNlLWZvcm0nLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBUaXRsZUJhckNvbXBvbmVudCxcclxuICAgIEJhc2VGb3JtQ2FudmFzQ29tcG9uZW50LFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxyXG4gICAgTmdJZixcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRCdXR0b24sXHJcbiAgICBBdWRpdExvZ0NvbXBvbmVudFxyXG4gIF0sXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFzZS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsOiAnLi9iYXNlLWZvcm0uY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlRm9ybUNvbXBvbmVudCBleHRlbmRzIEJhc2VVdGlscyBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQElucHV0KClcclxuICBvdmVycmlkZSBwYWdlSW5mbyE6IFBhZ2VJbmZvO1xyXG5cclxuICBASW5wdXQoKS8vIEB0cy1pZ25vcmVcclxuICBmaWVsZHM6IEZpZWxkSW5mb1tdID0gW107XHJcblxyXG4gIEBJbnB1dCgpLy8gQHRzLWlnbm9yZVxyXG4gIGVycm9yczogRmllbGRNZXNzYWdlW10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBlZGl0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGl0ZW1JZDogbnVtYmVyO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBhY3Rpb25SZXN1bHRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBmb3JtVXBkYXRlZDogRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgaXRlbUxvYWRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgZXh0cmFBY3Rpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIGl0ZW0gOiBhbnkgPSB7fTtcclxuICBpc0xvYWRlZCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgaHlwZXJUZXh0RXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgY3VycmVudERpcmVjdGlvbjogJ2x0cicgfCAncnRsJztcclxuICBpc1NhdmVEaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgaXNSZWplY3REaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgaGlkZUJhY2tCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBTQVZFID0gU0FWRTtcclxuICBwcml2YXRlIGlzUGVuZGluZzogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcm91dGVyOlJvdXRlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgZGlyZWN0aW9uYWxpdHk6IERpcmVjdGlvbmFsaXR5LFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjpMb2NhdGlvbixcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoJ3NlY3VyaXR5TWFuYWdlcicpIHByaXZhdGUgc2VjdXJpdHlNYW5hZ2VyOiBhbnksXHJcbiAgICAgICAgICAgICAgICBwdWJsaWMgYmFja2VuZFNlcnZpY2U6IEJhY2tlbmRTZXJ2aWNlKSB7XHJcbiAgICAgIHN1cGVyKCk7XHJcbiAgICAgICBDbGFzc2ljRWRpdG9yLmRlZmF1bHRDb25maWcgPSB7XHJcbiAgICAgICAgICAgIHRvb2xiYXI6IHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbJ2hlYWRpbmcnLCAnfCcsICdib2xkJywgJ2l0YWxpYycsICd8JywgJ2J1bGxldGVkTGlzdCcsICdudW1iZXJlZExpc3QnXVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBpbWFnZToge1xyXG4gICAgICAgICAgICAgICAgdG9vbGJhcjogWydpbWFnZVN0eWxlOnNpZGUnLCAnfCcsICdpbWFnZVRleHRBbHRlcm5hdGl2ZSddXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRhYmxlOiB7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50VG9vbGJhcjogWyAndGFibGVDb2x1bW4nLCAndGFibGVSb3cnLCAnbWVyZ2VUYWJsZUNlbGxzJyBdXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGxhbmd1YWdlOiAnZW4nXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gdGhpcy5kaXJlY3Rpb25hbGl0eS52YWx1ZTtcclxuICAgICAgdGhpcy5kaXJlY3Rpb25hbGl0eS5jaGFuZ2Uuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY3VycmVudERpcmVjdGlvbiA9IHZhbHVlO1xyXG4gICAgICB9KVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ2VkaXRhYmxlJywgdGhpcy5lZGl0YWJsZSlcclxuICAgICAgdGhpcy5zZWN1cml0eU1hbmFnZXIubG9hZFBlcm1pc3Npb25zKCkuc3Vic2NyaWJlKHggPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYmVmb3JlIGVkaXRcIiwgdGhpcy5lZGl0YWJsZSk7XHJcbiAgICAgICAgdGhpcy5sb2FkSXRlbSgpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiYWZ0ZXIgZWRpdFwiLCB0aGlzLmVkaXRhYmxlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkNoYW5nZXMoe2l0ZW0sIGVycm9ycywgZmllbGRzfTogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgfVxyXG5cclxuICAgIGlzVmFsaWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybT8udmFsaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNYXRjaEhlaWdodCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlSW5mby5wYWdlSGVpZ2h0ID09PSAnbWF0Y2gnO1xyXG4gICAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRJdGVtKCkge1xyXG4gICAgdGhpcy5lZGl0YWJsZSA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IG1vZGVFbmNyeXB0ZWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydtb2RlJ107XHJcbiAgICB0aGlzLmlzUGVuZGluZyA9ICEhbW9kZUVuY3J5cHRlZCAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRlY3J5cHQobW9kZUVuY3J5cHRlZCkgPT09ICdwZW5kaW5nJztcclxuXHJcbiAgICBpZiAodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sndG9rZW4nXSAmJiB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zWydtb2RlJ10pIHtcclxuICAgICAgdGhpcy5pdGVtSWQgPSB0aGlzLmJhY2tlbmRTZXJ2aWNlLmRlY3J5cHQodGhpcy5hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1sndG9rZW4nXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnICoqKioqKiAqKioqKiogKioqKioqICoqKioqKiBlcnJvciBpbiB1cmwgJylcclxuICAgIH1cclxuICAgIGlmICh0aGlzLml0ZW1JZCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsdGVyUmVxdWVzdCA9IG5ldyBGaWx0ZXJSZXF1ZXN0O1xyXG4gICAgICBmaWx0ZXJSZXF1ZXN0LmNvbHVtbnMgPSB0aGlzLmZpZWxkcy5maWx0ZXIoYyA9PiBjLnR5cGUgIT09ICdzcGFjZXInKS5tYXAoYyA9PiBjLnByb3BlcnR5KTtcclxuICAgICAgZmlsdGVyUmVxdWVzdC5wZW5kaW5nUGFnZSA9IHRoaXMuaXNQZW5kaW5nO1xyXG5cclxuICAgICAgZmlsdGVyUmVxdWVzdC5maWx0ZXJzID0gW107XHJcbiAgICAgIGZpbHRlclJlcXVlc3QuZmlsdGVycy5wdXNoKG5ldyBGaWx0ZXIoe1xyXG4gICAgICAgIGtleTogMCxcclxuICAgICAgICBmaWVsZFR5cGU6ICdMb25nJyxcclxuICAgICAgICBmaWVsZE5hbWU6ICdpZCcsXHJcbiAgICAgICAgdmFsdWVPYmplY3Q6IHRoaXMuaXRlbUlkLFxyXG4gICAgICAgIGZpbHRlclR5cGU6ICdGSUxFRF9GSUxURVInLFxyXG4gICAgICAgIG9wZXJhdG9yOiAnRVFVQUxTJ1xyXG4gICAgICB9KSk7XHJcbiAgICAgIC8vL2F1ZGl0LWxvZ1xyXG4gICAgICB0aGlzLmJhY2tlbmRTZXJ2aWNlLmdldEl0ZW1BdWRpdExvZyhmaWx0ZXJSZXF1ZXN0LCB0aGlzLnBhZ2VJbmZvIS5hcGlVcmkpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygncmVzcCcsIHJlc3ApO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5nZXRJdGVtc0J5RmlsdGVyKGZpbHRlclJlcXVlc3QsIHRoaXMucGFnZUluZm8hLmFwaVVyaSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwPy52YWxpZCAmJiByZXNwLmJvZHk/Lmxlbmd0aCA+PSAwKSB7XHJcbiAgICAgICAgICB0aGlzLml0ZW0gPSByZXNwLmJvZHlbMF07XHJcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlID0gKCF0aGlzLnBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkIHx8ICF0aGlzLmlzUGVuZGluZykgJiYgdGhpcy5zZWN1cml0eU1hbmFnZXIuaGFzUGFnZVBlcm1pc3Npb24odGhpcy5wYWdlSW5mby5pZCwgJ0VESVQnKVxyXG4gICAgICAgICAgICAmJiAoIXRoaXMucGFnZUluZm8uZHJhZnRTdXBwb3J0ZWQgfHx0aGlzLml0ZW1bJ3N0YXRlVHlwZSddID09PSAnQ09NUExFVEVEJyApO1xyXG4gICAgICAgICAgdGhpcy5pdGVtTG9hZGVkLmVtaXQodGhpcy5pdGVtKTtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmVkaXRhYmxlID0gdGhpcy5zZWN1cml0eU1hbmFnZXIuaGFzUGFnZVBlcm1pc3Npb24odGhpcy5wYWdlSW5mby5pZCwgJ0VESVQnKTtcclxuICAgICAgdGhpcy5pdGVtID0ge307XHJcbiAgICAgIHRoaXMuaXRlbUxvYWRlZC5lbWl0KHRoaXMuaXRlbSk7XHJcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGJ1aWxkRG9BY3Rpb25TdWJqZWN0KCk6IGFueSB7XHJcbiAgICBjb25zdCBuZXdWYXIgPSB0aGlzLmVkaXRhYmxlID8gT2JqZWN0LmFzc2lnbih0aGlzLml0ZW0sIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybS52YWx1ZSkgOiB0aGlzLml0ZW07XHJcbiAgICBpZiAodGhpcy5pdGVtSWQgPD0gMCAmJiB0aGlzLmVkaXRhYmxlICkge1xyXG4gICAgICAvL1RPRE8gdGhpcyBpcyBsaWtlIGEgaGFjayBhbmQgbXVzdCBiZSBoYW5kbGVkIGZyb20gYmFja2VuZFxyXG4gICAgICBuZXdWYXJbJ3N0YXRlVHlwZSddID0gJ05FVyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcclxuICAgICAgaWYgKGZpZWxkLmZsYXR0ZW5CeVN1YkF0dHJpYnV0ZSl7XHJcbiAgICAgICAgbmV3VmFyW2ZpZWxkLnByb3BlcnR5XSA9IG5ld1ZhcltmaWVsZC5wcm9wZXJ0eV1bZmllbGQuZmxhdHRlbkJ5U3ViQXR0cmlidXRlXVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgaWYgKCF0aGlzLnBhZ2VJbmZvLmRyYWZ0U3VwcG9ydGVkKXtcclxuICAgICAgbmV3VmFyWydzdGF0dXMnXSA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3VmFyO1xyXG4gIH1cclxuXHJcblxyXG4gIGRvU2F2ZUFwcHJvdmVBY3Rpb24oKSB7XHJcbiAgICBsZXQgYWN0aW9uSWQgPSBnZXRXZkFjdGlvbklkKHRoaXMuaXRlbS5zdGF0ZVR5cGUpO1xyXG4gICAgaWYgKHRoaXMuaXRlbUlkIDw9IDAgJiYgdGhpcy5lZGl0YWJsZSApIHtcclxuICAgICAgYWN0aW9uSWQgPSBORVdcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5wYWdlSW5mby5kcmFmdFN1cHBvcnRlZCkge1xyXG4gICAgICBhY3Rpb25JZCA9IFNBVkVfQU5EX0NPTVBMRVRFXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLmJhY2tlbmRTZXJ2aWNlLnBhcmVudEZvcm0udmFsaWQgIT09IHRydWUpIHtcclxuICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZSgnSU5WQUxJRF9JTlBVVF9GT1JNJywgdHJ1ZSwgJ2Vycm9yJykpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IERvQWN0aW9uUmVxdWVzdCgpO1xyXG4gICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgcmVxdWVzdC5zdWJqZWN0ID0gdGhpcy5idWlsZERvQWN0aW9uU3ViamVjdCgpO1xyXG5cclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQWN0aW9uQ29tbWVudENvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7bGFiZWw6ICdzYXZlJywgaXNUZXJtaW5hdGlvbjogZmFsc2V9LFxyXG4gICAgICB3aWR0aDogJzYwMHB4JyxcclxuICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgIGRpcmVjdGlvbjogIHRoaXMuY3VycmVudERpcmVjdGlvblxyXG4gICAgfSk7XHJcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJlcXVlc3QuY29tbWVudCA9IHJlc3VsdC5jb21tZW50O1xyXG4gICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UuZG9BY3Rpb25XaXRoQXR0YWNobWVudHMocmVxdWVzdCwgW10sIHRoaXMucGFnZUluZm8hKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnc3RlcCcsYWN0aW9uSWQpO1xyXG4gICAgICAgICAgdGhpcy5hY3Rpb25SZXN1bHRFbWl0dGVyLmVtaXQoeyB2YWxpZDogcmVzcC52YWxpZCwgYWN0aW9uSWQ6IGFjdGlvbklkIH0pO1xyXG4gICAgICAgICAgaWYgKHJlc3AudmFsaWQgKSB7XHJcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gJ2FwcHJvdmVfc3VjY2Vzc2Z1bGx5JztcclxuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25JZCkge1xyXG4gICAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnc2F2ZWRfc3VjY2Vzc2Z1bGx5JztcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAndXBkYXRlZF9zdWNjZXNzZnVsbHknO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnYXBwcm92ZV9zdWNjZXNzZnVsbHknO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UobWVzc2FnZSwgdHJ1ZSwgJ3N1Y2Nlc3MnKSk7XHJcbiAgICAgICAgICAgICBpZighdGhpcy5wYWdlSW5mby5zdGF5T25QYWdlKXtcclxuICAgICAgICAgICAgICAgdGhpcy5iYWNrVG9QYXJlbnQoKTtcclxuICAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHJlcXVlc3Quc3ViamVjdFsnc3RhdGVUeXBlJ10gPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAocmVzcC5tZXNzYWdlWzBdLmVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkdXBsaWMnKSlcclxuICAgICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS50b3BQYW5lbE1lc3NhZ2UkLm5leHQobmV3IFNuYWNrTWVzc2FnZSh0aGlzLnBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyAnLicgKyByZXNwLm1lc3NhZ2VbMF0uZXJyb3JDb2RlLCB0cnVlLCAnZXJyb3InKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYmFja1RvUGFyZW50KCkge1xyXG4gICAgICBjb25zdCBpZElkeCA9IHRoaXMucm91dGVyLnVybC5sYXN0SW5kZXhPZignLycpO1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMucm91dGVyLnVybC5zdWJzdHJpbmcoMCwgaWRJZHgpKTtcclxuICB9XHJcblxyXG5cclxuICBnZXRUaXRsZSgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5wYWdlSW5mby5sYWJlbHNTZWN0aW9ufS4ke3RoaXMucGFnZUluZm8uaWR9YCA7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlRm9ybSgkZXZlbnQ6IEZvcm1Hcm91cCkge1xyXG4gICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UucGFyZW50Rm9ybSA9ICRldmVudDtcclxuICAgICAgICB0aGlzLmZvcm1VcGRhdGVkLmVtaXQoJGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgZG9DYW5jZWxSZWplY3RBY3Rpb24oKSB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdGFibGUpe1xyXG4gICAgICBsZXQgYWN0aW9uSWQgPSAzO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnYWN0aW9uSWQnLGFjdGlvbklkKTtcclxuICAgICAgY29uc3QgcmVxdWVzdCA9IG5ldyBEb0FjdGlvblJlcXVlc3QoKTtcclxuICAgICAgcmVxdWVzdC5hY3Rpb25JZCA9IGFjdGlvbklkO1xyXG4gICAgICByZXF1ZXN0LnN1YmplY3QgPSB0aGlzLmJ1aWxkRG9BY3Rpb25TdWJqZWN0KCk7XHJcblxyXG4gICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFjdGlvbkNvbW1lbnRDb21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7bGFiZWw6ICdyZWplY3QnLCBhY2NlcHRBY3Rpb25MYWJlbDogJ2FjY2VwdCcsIHJlamVjdEFjdGlvbkxhYmVsOiAncmV0dXJuJ30sXHJcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXHJcbiAgICAgICAgaGVpZ2h0OiAnYXV0bycsXHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLmN1cnJlbnREaXJlY3Rpb25cclxuICAgICAgfSk7XHJcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICAgIHJlcXVlc3QuY29tbWVudCA9IHJlc3VsdC5jb21tZW50O1xyXG4gICAgICAgICAgdGhpcy5iYWNrZW5kU2VydmljZS5kb0FjdGlvbldpdGhBdHRhY2htZW50cyhyZXF1ZXN0LCBbXSwgdGhpcy5wYWdlSW5mbyEpLnN1YnNjcmliZShyZXNwID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hY3Rpb25SZXN1bHRFbWl0dGVyLmVtaXQoeyB2YWxpZDogcmVzcC52YWxpZCwgYWN0aW9uSWQ6IGFjdGlvbklkIH0pO1xyXG4gICAgICAgICAgICBpZiAocmVzcC52YWxpZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuYmFja2VuZFNlcnZpY2UudG9wUGFuZWxNZXNzYWdlJC5uZXh0KG5ldyBTbmFja01lc3NhZ2UoJ3N1Y2Nlc3NmdWxfcmVqZWN0X21lc3NhZ2UnLCB0cnVlLCAnc3VjY2VzcycpKTtcclxuICAgICAgICAgICAgICBpZighdGhpcy5wYWdlSW5mby5zdGF5T25QYWdlKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuYmFja1RvUGFyZW50KCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMubG9jYXRpb24uYmFjaygpXHJcbiAgICB9XHJcbiAgICB9XHJcblxyXG4gIGhhc1dmUGVybWlzc2lvbigpIHtcclxuICAgIHJldHVybiAgKHRoaXMuc2VjdXJpdHlNYW5hZ2VyLmhhc1BhZ2VQZXJtaXNzaW9uKHRoaXMucGFnZUluZm8uaWQsICdFRElUJylcclxuICAgIHx8IHRoaXMuc2VjdXJpdHlNYW5hZ2VyLmhhc1BhZ2VQZXJtaXNzaW9uKHRoaXMucGFnZUluZm8uaWQsICdDT01QTEVURScpXHJcbiAgICB8fCB0aGlzLnNlY3VyaXR5TWFuYWdlci5oYXNQYWdlUGVybWlzc2lvbih0aGlzLnBhZ2VJbmZvLmlkLCAnVEVSTUlOQVRFJykpXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2V0UG9zaXRpdmVXZkFjdGlvbktleSA9IGdldFBvc2l0aXZlV2ZBY3Rpb25LZXk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXkgPSBnZXROZWdhdGl2ZVdmQWN0aW9uS2V5O1xyXG5cclxuICBoYXNXZlBvc2l0aXZlUGVybWlzc2lvbigpIHtcclxuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgJiYgdGhpcy5zZWN1cml0eU1hbmFnZXIuaGFzUGFnZVBlcm1pc3Npb24odGhpcy5wYWdlSW5mby5pZCwgJ0NPTVBMRVRFJykpIHx8XHJcbiAgICAgICh0aGlzLmVkaXRhYmxlICYmIHRoaXMuc2VjdXJpdHlNYW5hZ2VyLmhhc1BhZ2VQZXJtaXNzaW9uKHRoaXMucGFnZUluZm8uaWQsICdFRElUJykpXHJcbiAgfVxyXG5cclxuICBoYXNXZk5lZ2F0aXZlUGVybWlzc2lvbigpIHtcclxuICAgIHJldHVybiAoIXRoaXMuZWRpdGFibGUgJiYgdGhpcy5zZWN1cml0eU1hbmFnZXIuaGFzUGFnZVBlcm1pc3Npb24odGhpcy5wYWdlSW5mby5pZCwgJ1RFUk1JTkFURScpKSB8fFxyXG4gICAgICAodGhpcy5lZGl0YWJsZSAmJiB0aGlzLnNlY3VyaXR5TWFuYWdlci5oYXNQYWdlUGVybWlzc2lvbih0aGlzLnBhZ2VJbmZvLmlkLCAnRURJVCcpKVxyXG4gIH1cclxuXHJcbiAgZG9FeHRyYUFjdGlvbigpIHtcclxuICAgIHRoaXMuZXh0cmFBY3Rpb24uZW1pdCgpXHJcbiAgfVxyXG4gIGRpc2FibGVkU2F2ZUJ1dHRvbihlbGVtZW50KSB7XHJcbiAgICByZXR1cm4gKCF0aGlzLmlzUGVuZGluZyAmJiBlbGVtZW50LnN0YXRlVHlwZSA9PSAnUEVORElORycpICYmIHRoaXMucGFnZUluZm8uZHJhZnRTdXBwb3J0ZWQgO1xyXG4gIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cInBhZ2UtY29udGFpbmVyXCI+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJyb3cgZnVsbC13aWR0aCBtdC0ydmhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4gZnVsbC13aWR0aFwiPlxyXG4gICAgICA8YXBwLXRpdGxlLWJhclxyXG4gICAgICAgIFtwYWdlVGl0bGVdPVwiZ2V0VGl0bGUoKVwiXHJcbiAgICAgICAgW25ld0FjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgW2hpZGVCYWNrQnV0dG9uXT1cImhpZGVCYWNrQnV0dG9uXCI+XHJcbiAgICAgIDwvYXBwLXRpdGxlLWJhcj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YXBwLWJhc2UtZm9ybS1jYW52YXNcclxuICAgIFtwYWdlSW5mb109XCJwYWdlSW5mb1wiXHJcbiAgICBbZmllbGRzXT1cImZpZWxkc1wiXHJcbiAgICBbZWRpdGFibGVdPVwiZWRpdGFibGVcIlxyXG4gICAgW2Vycm9yc109XCJlcnJvcnNcIlxyXG4gICAgW2l0ZW1dPVwiaXRlbVwiXHJcbiAgICAoZm9ybVVwZGF0ZWQpPVwidXBkYXRlRm9ybSgkZXZlbnQpXCI+XHJcbiAgPC9hcHAtYmFzZS1mb3JtLWNhbnZhcz5cclxuXHJcbiAgPGRpdiBjbGFzcz1cInJvdyBtYWluLWZvcm0tY2FudmFzIG10LTN2aFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBmbGV4LTQ5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcm93LWNlbnRlci1zdGFydFwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJoYXNXZlBvc2l0aXZlUGVybWlzc2lvbigpXCIgY29sb3I9XCJwcmltYXJ5XCIgbWF0LWZsYXQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9TYXZlQXBwcm92ZUFjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFNhdmVCdXR0b24oaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY3Rpb24tYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIGlkPVwiYmFzZS1mb3JtLXBvc2l0aXZlLWJ0blwiPlxyXG4gICAgICAgICAge3sgZ2V0UG9zaXRpdmVXZkFjdGlvbktleShpdGVtPy5zdGF0ZVR5cGUpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImhhc1dmTmVnYXRpdmVQZXJtaXNzaW9uKClcIiBjb2xvcj1cInNlY29uZFwiIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9DYW5jZWxSZWplY3RBY3Rpb24oKVwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRTYXZlQnV0dG9uKGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBpZD1cImJhc2UtZm9ybS1uZWdhdGl2ZS1idG5cIj5cclxuICAgICAgICAgIHt7IGdldE5lZ2F0aXZlV2ZBY3Rpb25LZXkoaXRlbT8uc3RhdGVUeXBlKSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJwYWdlSW5mby5oaWRlRXh0cmFjdEJ1dHRvbiA9PT0gZmFsc2UgJiYgaXRlbUlkID4gMCAmJiBlZGl0YWJsZVwiIGNvbG9yPVwicHJpbWFyeVwiIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9FeHRyYUFjdGlvbigpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBpZD1cImJhc2UtZm9ybS1leHRyYS1idG5cIj5cclxuICAgICAgICAgIHt7IHBhZ2VJbmZvLmxhYmVsc1NlY3Rpb24gKyBcIi5cIiArIFwiRVhUUkFfQlVUVE9OX05BTUVcIiB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbHVtbiBmbGV4LTQ5XCI+PC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXBhZ2VJbmZvLmhpZGVBdWRpdExvZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtYWluLWZvcm0tY2FudmFzIG10LTR2aCBwYi01dmhcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbiBmbGV4LTk1XCI+XHJcbiAgICAgICAgPGFwcC1hdWRpdC1sb2cgW3BhZ2VJbmZvXT1cInBhZ2VJbmZvXCIgW2ZpZWxkc109XCJmaWVsZHNcIj48L2FwcC1hdWRpdC1sb2c+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG48L2Rpdj5cclxuIl19