@bizdoc/core 3.2.9 → 3.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (455) hide show
  1. package/assets/themes/brown.min.css +1 -1
  2. package/assets/themes/dark.min.css +3 -3
  3. package/assets/themes/deep-purple-light-blue.min.css +1 -1
  4. package/assets/themes/deep-purple-teal.min.css +1 -1
  5. package/assets/themes/default.min.css +8 -8
  6. package/assets/themes/green.min.css +1 -1
  7. package/assets/themes/indigo-amber.min.css +1 -1
  8. package/assets/themes/indigo.min.css +1 -1
  9. package/fesm2022/bizdoc-core.mjs +2152 -1924
  10. package/fesm2022/bizdoc-core.mjs.map +1 -1
  11. package/lib/admin/admin-menu.component.d.ts +1 -3
  12. package/lib/admin/architecture/designer.base.d.ts +3 -3
  13. package/lib/admin/architecture/elements/form.component.d.ts +1 -1
  14. package/lib/bizdoc.module.d.ts +6 -7
  15. package/lib/compose/trace/trace.base.d.ts +1 -1
  16. package/lib/core/base.d.ts +5 -0
  17. package/lib/core/configuration.d.ts +3 -0
  18. package/lib/core/fields/options.base.d.ts +2 -2
  19. package/lib/core/functions.d.ts +1 -1
  20. package/lib/core/inputs/combination-picker-body.d.ts +0 -2
  21. package/lib/core/inputs/combination-picker.d.ts +1 -1
  22. package/lib/core/session.service.d.ts +2 -2
  23. package/lib/core/slots/slots.component.d.ts +1 -0
  24. package/lib/core/tagging/edit-input.component.d.ts +7 -3
  25. package/lib/core/tagging/tagging.component-base.d.ts +2 -2
  26. package/lib/core/translate.service.d.ts +2 -2
  27. package/lib/core/window-title.service.d.ts +1 -0
  28. package/lib/cube/matrix/matrix.base.d.ts +1 -1
  29. package/lib/cube/view-base.d.ts +1 -1
  30. package/lib/dashboard/cube/cube-analysis.base.d.ts +1 -1
  31. package/lib/home/home-base.component.d.ts +1 -1
  32. package/lib/home/home.desktop.component.d.ts +5 -3
  33. package/lib/notifications/types/notification-base.d.ts +1 -1
  34. package/lib/reports/cube/usage-base.d.ts +1 -1
  35. package/lib/routes.mobile.d.ts +1 -1
  36. package/lib/views/cube/cube-base.d.ts +1 -1
  37. package/package.json +31 -33
  38. package/esm2022/bizdoc-core.mjs +0 -5
  39. package/esm2022/lib/admin/admin-dismiss.service.mjs +0 -28
  40. package/esm2022/lib/admin/admin-menu.component.mjs +0 -24
  41. package/esm2022/lib/admin/architecture/cube-axes-filter.component.mjs +0 -93
  42. package/esm2022/lib/admin/architecture/declarations.mjs +0 -79
  43. package/esm2022/lib/admin/architecture/designer-element.component.mjs +0 -270
  44. package/esm2022/lib/admin/architecture/designer-privileges.component.mjs +0 -96
  45. package/esm2022/lib/admin/architecture/designer.base.mjs +0 -136
  46. package/esm2022/lib/admin/architecture/designer.component.mjs +0 -396
  47. package/esm2022/lib/admin/architecture/elements/action.component.mjs +0 -43
  48. package/esm2022/lib/admin/architecture/elements/analysis-view.component.mjs +0 -50
  49. package/esm2022/lib/admin/architecture/elements/analysis-widget.component.mjs +0 -49
  50. package/esm2022/lib/admin/architecture/elements/anomaly-rule.component.mjs +0 -29
  51. package/esm2022/lib/admin/architecture/elements/attribute.component.mjs +0 -35
  52. package/esm2022/lib/admin/architecture/elements/box-form.component.mjs +0 -49
  53. package/esm2022/lib/admin/architecture/elements/configuration-datasource.component.mjs +0 -66
  54. package/esm2022/lib/admin/architecture/elements/control.component.mjs +0 -21
  55. package/esm2022/lib/admin/architecture/elements/cube-index-utility.component.mjs +0 -32
  56. package/esm2022/lib/admin/architecture/elements/cube-view.component.mjs +0 -34
  57. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +0 -254
  58. package/esm2022/lib/admin/architecture/elements/document-state-widget.component.mjs +0 -40
  59. package/esm2022/lib/admin/architecture/elements/documents-report.component.mjs +0 -34
  60. package/esm2022/lib/admin/architecture/elements/documents-widget.component.mjs +0 -40
  61. package/esm2022/lib/admin/architecture/elements/explore-view.component.mjs +0 -35
  62. package/esm2022/lib/admin/architecture/elements/folder.component.mjs +0 -56
  63. package/esm2022/lib/admin/architecture/elements/form-invite.dialog.mjs +0 -126
  64. package/esm2022/lib/admin/architecture/elements/form.component.mjs +0 -156
  65. package/esm2022/lib/admin/architecture/elements/guide.component.mjs +0 -53
  66. package/esm2022/lib/admin/architecture/elements/job.component.mjs +0 -57
  67. package/esm2022/lib/admin/architecture/elements/matrix-view.component.mjs +0 -98
  68. package/esm2022/lib/admin/architecture/elements/node.component.mjs +0 -18
  69. package/esm2022/lib/admin/architecture/elements/parallel-view.component.mjs +0 -38
  70. package/esm2022/lib/admin/architecture/elements/performance-report.component.mjs +0 -32
  71. package/esm2022/lib/admin/architecture/elements/performance-widget.component.mjs +0 -34
  72. package/esm2022/lib/admin/architecture/elements/pivot-view.component.mjs +0 -40
  73. package/esm2022/lib/admin/architecture/elements/policy.component.mjs +0 -18
  74. package/esm2022/lib/admin/architecture/elements/report.component.mjs +0 -29
  75. package/esm2022/lib/admin/architecture/elements/return-to-role-action.component.mjs +0 -33
  76. package/esm2022/lib/admin/architecture/elements/role.component.mjs +0 -43
  77. package/esm2022/lib/admin/architecture/elements/rule.component.mjs +0 -18
  78. package/esm2022/lib/admin/architecture/elements/source.component.mjs +0 -25
  79. package/esm2022/lib/admin/architecture/elements/state.component.mjs +0 -44
  80. package/esm2022/lib/admin/architecture/elements/sum-view.component.mjs +0 -38
  81. package/esm2022/lib/admin/architecture/elements/tasks-report.component.mjs +0 -39
  82. package/esm2022/lib/admin/architecture/elements/type.component.mjs +0 -83
  83. package/esm2022/lib/admin/architecture/elements/usage-report.component.mjs +0 -64
  84. package/esm2022/lib/admin/architecture/elements/utility.component.mjs +0 -18
  85. package/esm2022/lib/admin/architecture/elements/view.component.mjs +0 -18
  86. package/esm2022/lib/admin/architecture/elements/widget.component.mjs +0 -29
  87. package/esm2022/lib/admin/architecture/icon-picker.component.mjs +0 -173
  88. package/esm2022/lib/admin/core/ace.input.mjs +0 -144
  89. package/esm2022/lib/admin/core/color-picker.input.mjs +0 -183
  90. package/esm2022/lib/admin/core/localized-string.component.mjs +0 -129
  91. package/esm2022/lib/admin/core/search.input.mjs +0 -52
  92. package/esm2022/lib/admin/diff/configuration-diff.component.mjs +0 -573
  93. package/esm2022/lib/admin/document-trace/document-trace.component.mjs +0 -537
  94. package/esm2022/lib/admin/document-trace/reassign.dialog.mjs +0 -39
  95. package/esm2022/lib/admin/document-trace/timeline.mjs +0 -2
  96. package/esm2022/lib/admin/document-trace/trace-element.component.mjs +0 -125
  97. package/esm2022/lib/admin/form/designer/box-designer.component.mjs +0 -270
  98. package/esm2022/lib/admin/form/designer/declarations.mjs +0 -2
  99. package/esm2022/lib/admin/form/designer/design-control.component.mjs +0 -41
  100. package/esm2022/lib/admin/form/designer/properties.component.mjs +0 -71
  101. package/esm2022/lib/admin/form/designer/section.component.mjs +0 -53
  102. package/esm2022/lib/admin/form/designer/settings.component.mjs +0 -51
  103. package/esm2022/lib/admin/form/form.resolve.service.mjs +0 -18
  104. package/esm2022/lib/admin/form/workflow/node-ref.mjs +0 -8
  105. package/esm2022/lib/admin/form/workflow/node.component.mjs +0 -156
  106. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +0 -88
  107. package/esm2022/lib/admin/form/workflow/workflow.component.mjs +0 -586
  108. package/esm2022/lib/admin/indices/manage-cube-index.component.mjs +0 -160
  109. package/esm2022/lib/admin/patterns/patterns.component.mjs +0 -180
  110. package/esm2022/lib/admin/permissions/permissions.component.mjs +0 -98
  111. package/esm2022/lib/admin/positions/positions-popup.component.mjs +0 -75
  112. package/esm2022/lib/admin/positions/positions.component.mjs +0 -463
  113. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +0 -156
  114. package/esm2022/lib/admin/profiler/profiler.component.mjs +0 -284
  115. package/esm2022/lib/admin/system.service.mjs +0 -127
  116. package/esm2022/lib/admin/utility-ref.mjs +0 -39
  117. package/esm2022/lib/admin/utility-wrapper.component.mjs +0 -53
  118. package/esm2022/lib/admin/utility.pane.component.mjs +0 -48
  119. package/esm2022/lib/app.component.mjs +0 -73
  120. package/esm2022/lib/bizdoc.module.mjs +0 -100
  121. package/esm2022/lib/browse/browse-items.component.mjs +0 -496
  122. package/esm2022/lib/browse/browse.mobile.component.mjs +0 -102
  123. package/esm2022/lib/browse/browse.pane.component.mjs +0 -169
  124. package/esm2022/lib/browse/expanded-item/expanded-item.component.mjs +0 -316
  125. package/esm2022/lib/browse/filter/filter.component.mjs +0 -140
  126. package/esm2022/lib/browse/folders-menu.component.mjs +0 -49
  127. package/esm2022/lib/chat/chat-info.mjs +0 -77
  128. package/esm2022/lib/chat/chat.mobile.component.mjs +0 -24
  129. package/esm2022/lib/chat/chat.service.mjs +0 -122
  130. package/esm2022/lib/chat/contacts.component.mjs +0 -107
  131. package/esm2022/lib/chat/contacts.pane.component.mjs +0 -26
  132. package/esm2022/lib/chat/conversation.component.mjs +0 -196
  133. package/esm2022/lib/chat/conversation.pane.component.mjs +0 -46
  134. package/esm2022/lib/compose/action/action-picker.component.mjs +0 -82
  135. package/esm2022/lib/compose/action/action-ref.mjs +0 -19
  136. package/esm2022/lib/compose/action/action.base.mjs +0 -50
  137. package/esm2022/lib/compose/action/action.dialog.mjs +0 -62
  138. package/esm2022/lib/compose/action/action.pane.dialog.exp.mjs +0 -68
  139. package/esm2022/lib/compose/action/assign-action.component.mjs +0 -77
  140. package/esm2022/lib/compose/action/moveto-action.component.mjs +0 -90
  141. package/esm2022/lib/compose/action/return-action.component.mjs +0 -51
  142. package/esm2022/lib/compose/attachments/attachments.component.mjs +0 -130
  143. package/esm2022/lib/compose/attachments/preview/attachment-preview.component.mjs +0 -157
  144. package/esm2022/lib/compose/attachments/progress-button.directive.mjs +0 -25
  145. package/esm2022/lib/compose/box/box.component.mjs +0 -44
  146. package/esm2022/lib/compose/box/control.component.mjs +0 -50
  147. package/esm2022/lib/compose/box/row.component.mjs +0 -41
  148. package/esm2022/lib/compose/can-deactivate-changes.service.mjs +0 -27
  149. package/esm2022/lib/compose/comments/comment.component.mjs +0 -188
  150. package/esm2022/lib/compose/comments/comments.component.mjs +0 -226
  151. package/esm2022/lib/compose/comments/comments.pane.component.mjs +0 -40
  152. package/esm2022/lib/compose/comments/edit-comment.component.mjs +0 -32
  153. package/esm2022/lib/compose/comments/edits.component.mjs +0 -30
  154. package/esm2022/lib/compose/comments/quick-comment.component.exp.mjs +0 -64
  155. package/esm2022/lib/compose/comments/votes.component.mjs +0 -42
  156. package/esm2022/lib/compose/compose-resolve.service.mjs +0 -34
  157. package/esm2022/lib/compose/compose.mobile.component.mjs +0 -114
  158. package/esm2022/lib/compose/compose.pane.component.mjs +0 -202
  159. package/esm2022/lib/compose/copy/copy.dialog.mjs +0 -45
  160. package/esm2022/lib/compose/dismiss.service.mjs +0 -25
  161. package/esm2022/lib/compose/document-resolve.service.mjs +0 -33
  162. package/esm2022/lib/compose/document-resolver.service.mjs +0 -17
  163. package/esm2022/lib/compose/document.component.mjs +0 -48
  164. package/esm2022/lib/compose/document.mobile.component.mjs +0 -23
  165. package/esm2022/lib/compose/document.pane.component.mjs +0 -27
  166. package/esm2022/lib/compose/events/events.component.mjs +0 -29
  167. package/esm2022/lib/compose/form-ref.mjs +0 -43
  168. package/esm2022/lib/compose/form-selector/form-selector.sheet.mjs +0 -57
  169. package/esm2022/lib/compose/form.component.mjs +0 -512
  170. package/esm2022/lib/compose/new-menu.component.mjs +0 -94
  171. package/esm2022/lib/compose/overlay.component.exp.mjs +0 -71
  172. package/esm2022/lib/compose/privilage.directive.mjs +0 -64
  173. package/esm2022/lib/compose/recipient-resolver.service.mjs +0 -18
  174. package/esm2022/lib/compose/state.component.mjs +0 -37
  175. package/esm2022/lib/compose/tag/tags.component.mjs +0 -89
  176. package/esm2022/lib/compose/trace/flow.component.mjs +0 -687
  177. package/esm2022/lib/compose/trace/people.component.mjs +0 -39
  178. package/esm2022/lib/compose/trace/trace.base.mjs +0 -79
  179. package/esm2022/lib/compose/trace/trace.component.mjs +0 -353
  180. package/esm2022/lib/compose/trace/trace.pane.component.mjs +0 -48
  181. package/esm2022/lib/compose/version-compare/version-compare.component.mjs +0 -58
  182. package/esm2022/lib/compose/version-compare/version-compare.directive.mjs +0 -345
  183. package/esm2022/lib/compose/version-compare/version.pane.component.mjs +0 -53
  184. package/esm2022/lib/core/account.service.mjs +0 -38
  185. package/esm2022/lib/core/animated-icon/animated-icon.directive.mjs +0 -17
  186. package/esm2022/lib/core/animations.mjs +0 -168
  187. package/esm2022/lib/core/authentication.mjs +0 -4
  188. package/esm2022/lib/core/avatar/avatar.component.mjs +0 -111
  189. package/esm2022/lib/core/base.mjs +0 -2
  190. package/esm2022/lib/core/checkbox.mjs +0 -38
  191. package/esm2022/lib/core/colors.mjs +0 -322
  192. package/esm2022/lib/core/component-factory-resolver.mjs +0 -48
  193. package/esm2022/lib/core/configuration.mjs +0 -17
  194. package/esm2022/lib/core/datasource.service.mjs +0 -75
  195. package/esm2022/lib/core/decorators.mjs +0 -46
  196. package/esm2022/lib/core/document-factory.service.mjs +0 -156
  197. package/esm2022/lib/core/fields/address.designer.mjs +0 -39
  198. package/esm2022/lib/core/fields/address.field.mjs +0 -65
  199. package/esm2022/lib/core/fields/autocomplete.field.mjs +0 -136
  200. package/esm2022/lib/core/fields/axes-picker.designer.mjs +0 -59
  201. package/esm2022/lib/core/fields/axes-picker.field.mjs +0 -46
  202. package/esm2022/lib/core/fields/checkbox.designer.mjs +0 -38
  203. package/esm2022/lib/core/fields/checkbox.field.mjs +0 -35
  204. package/esm2022/lib/core/fields/checklist.designer.mjs +0 -98
  205. package/esm2022/lib/core/fields/checklist.field.mjs +0 -36
  206. package/esm2022/lib/core/fields/date-range.designer.mjs +0 -43
  207. package/esm2022/lib/core/fields/date-range.field.mjs +0 -46
  208. package/esm2022/lib/core/fields/date.designer.mjs +0 -40
  209. package/esm2022/lib/core/fields/date.field.mjs +0 -40
  210. package/esm2022/lib/core/fields/expression.field.mjs +0 -87
  211. package/esm2022/lib/core/fields/file.designer.mjs +0 -39
  212. package/esm2022/lib/core/fields/file.field.mjs +0 -35
  213. package/esm2022/lib/core/fields/html.designer.mjs +0 -61
  214. package/esm2022/lib/core/fields/html.field.mjs +0 -44
  215. package/esm2022/lib/core/fields/input.designer.mjs +0 -38
  216. package/esm2022/lib/core/fields/input.field.mjs +0 -54
  217. package/esm2022/lib/core/fields/localized-string.field.mjs +0 -49
  218. package/esm2022/lib/core/fields/numeric.designer.mjs +0 -72
  219. package/esm2022/lib/core/fields/numeric.field.mjs +0 -37
  220. package/esm2022/lib/core/fields/options.base.mjs +0 -41
  221. package/esm2022/lib/core/fields/options.component.mjs +0 -58
  222. package/esm2022/lib/core/fields/radio-button.designer.mjs +0 -39
  223. package/esm2022/lib/core/fields/radio-button.field.mjs +0 -33
  224. package/esm2022/lib/core/fields/select.designer.mjs +0 -104
  225. package/esm2022/lib/core/fields/select.field.mjs +0 -36
  226. package/esm2022/lib/core/fields/signature.designer.mjs +0 -37
  227. package/esm2022/lib/core/fields/signature.field.mjs +0 -52
  228. package/esm2022/lib/core/fields/switch.field.mjs +0 -35
  229. package/esm2022/lib/core/fields/tags.designer.mjs +0 -28
  230. package/esm2022/lib/core/fields/tags.field.mjs +0 -51
  231. package/esm2022/lib/core/fields/textarea.designer.mjs +0 -33
  232. package/esm2022/lib/core/fields/textarea.field.mjs +0 -37
  233. package/esm2022/lib/core/fields/time.designer.mjs +0 -41
  234. package/esm2022/lib/core/fields/time.field.mjs +0 -39
  235. package/esm2022/lib/core/fields/timespan.field.mjs +0 -82
  236. package/esm2022/lib/core/fields/yesno.designer.mjs +0 -52
  237. package/esm2022/lib/core/fields/yesno.field.mjs +0 -34
  238. package/esm2022/lib/core/firebase.service.mjs +0 -51
  239. package/esm2022/lib/core/functions.mjs +0 -225
  240. package/esm2022/lib/core/guide/guide.component.mjs +0 -220
  241. package/esm2022/lib/core/guide/guide.service.mjs +0 -124
  242. package/esm2022/lib/core/guide/help-tip.component.mjs +0 -52
  243. package/esm2022/lib/core/http.interceptor.mjs +0 -63
  244. package/esm2022/lib/core/hub.service.mjs +0 -117
  245. package/esm2022/lib/core/identity/identity.component.mjs +0 -66
  246. package/esm2022/lib/core/info/attachment-info.service.mjs +0 -53
  247. package/esm2022/lib/core/info/document-info.service.mjs +0 -21
  248. package/esm2022/lib/core/info/location-info.component.mjs +0 -60
  249. package/esm2022/lib/core/info/map-info.mjs +0 -42
  250. package/esm2022/lib/core/inputs/address.input.mjs +0 -203
  251. package/esm2022/lib/core/inputs/auto-complete.input.mjs +0 -273
  252. package/esm2022/lib/core/inputs/combination-picker-body.mjs +0 -171
  253. package/esm2022/lib/core/inputs/combination-picker.mjs +0 -285
  254. package/esm2022/lib/core/inputs/combination-pool.mjs +0 -105
  255. package/esm2022/lib/core/inputs/file.input.mjs +0 -432
  256. package/esm2022/lib/core/inputs/select.input.mjs +0 -254
  257. package/esm2022/lib/core/inputs/signature.input.mjs +0 -150
  258. package/esm2022/lib/core/inputs/time-picker.mjs +0 -195
  259. package/esm2022/lib/core/inputs/timespan.input.mjs +0 -180
  260. package/esm2022/lib/core/layout.component.mjs +0 -93
  261. package/esm2022/lib/core/lottie-animation.exp.mjs +0 -49
  262. package/esm2022/lib/core/mailbox.service.mjs +0 -445
  263. package/esm2022/lib/core/models.mjs +0 -25
  264. package/esm2022/lib/core/none.component.mjs +0 -37
  265. package/esm2022/lib/core/pipes/action.pipe.mjs +0 -25
  266. package/esm2022/lib/core/pipes/calendar.pipe.mjs +0 -72
  267. package/esm2022/lib/core/pipes/date-format.pipe.mjs +0 -19
  268. package/esm2022/lib/core/pipes/daterange.pipe.mjs +0 -62
  269. package/esm2022/lib/core/pipes/difference.pipe.mjs +0 -15
  270. package/esm2022/lib/core/pipes/duration-format.pipe.mjs +0 -48
  271. package/esm2022/lib/core/pipes/duration.pipe.mjs +0 -19
  272. package/esm2022/lib/core/pipes/filter.pipe.mjs +0 -25
  273. package/esm2022/lib/core/pipes/form.pipe.mjs +0 -25
  274. package/esm2022/lib/core/pipes/join.pipe.mjs +0 -18
  275. package/esm2022/lib/core/pipes/localized-string.pipe.mjs +0 -26
  276. package/esm2022/lib/core/pipes/role.pipe.mjs +0 -25
  277. package/esm2022/lib/core/pipes/sanitize-html.pipe.mjs +0 -18
  278. package/esm2022/lib/core/pipes/sort.pipe.mjs +0 -42
  279. package/esm2022/lib/core/pipes/state.pipe.mjs +0 -25
  280. package/esm2022/lib/core/pipes/time-ago.pipe.mjs +0 -51
  281. package/esm2022/lib/core/pipes/to-now.pipe.mjs +0 -66
  282. package/esm2022/lib/core/pipes/translate.pipe.mjs +0 -58
  283. package/esm2022/lib/core/pipes/type-value.pipe.mjs +0 -42
  284. package/esm2022/lib/core/pipes/user-name.pipe.mjs +0 -21
  285. package/esm2022/lib/core/popup/popup-ref.mjs +0 -20
  286. package/esm2022/lib/core/popup/popup.component.mjs +0 -36
  287. package/esm2022/lib/core/popup/popup.service.mjs +0 -158
  288. package/esm2022/lib/core/popup/tooltip.directive.mjs +0 -81
  289. package/esm2022/lib/core/prompt/ask/ask.dialog.mjs +0 -29
  290. package/esm2022/lib/core/prompt/mask/mask.component.mjs +0 -21
  291. package/esm2022/lib/core/prompt.service.mjs +0 -88
  292. package/esm2022/lib/core/router.mjs +0 -37
  293. package/esm2022/lib/core/save-changes.dialog.mjs +0 -18
  294. package/esm2022/lib/core/session.service.mjs +0 -291
  295. package/esm2022/lib/core/slots/pane-ref.mjs +0 -152
  296. package/esm2022/lib/core/slots/router.directive.mjs +0 -68
  297. package/esm2022/lib/core/slots/router.service.mjs +0 -40
  298. package/esm2022/lib/core/slots/slots.component.mjs +0 -1191
  299. package/esm2022/lib/core/sticky-toolbar.exp.mjs +0 -33
  300. package/esm2022/lib/core/tagging/documents.component.mjs +0 -25
  301. package/esm2022/lib/core/tagging/edit-input.component.mjs +0 -231
  302. package/esm2022/lib/core/tagging/emoji.component.mjs +0 -35
  303. package/esm2022/lib/core/tagging/tagging-item.directive.mjs +0 -39
  304. package/esm2022/lib/core/tagging/tagging.component-base.mjs +0 -29
  305. package/esm2022/lib/core/tagging/tagging.directive.mjs +0 -137
  306. package/esm2022/lib/core/tagging/tagging.pipe.mjs +0 -72
  307. package/esm2022/lib/core/tagging/users.component.mjs +0 -32
  308. package/esm2022/lib/core/translate.service.mjs +0 -125
  309. package/esm2022/lib/core/translations.mjs +0 -1068
  310. package/esm2022/lib/core/virtual-tabs.component.exp.mjs +0 -84
  311. package/esm2022/lib/core/window-title.service.mjs +0 -61
  312. package/esm2022/lib/cube/accum/accum.component.mjs +0 -262
  313. package/esm2022/lib/cube/chart/chart.component.mjs +0 -345
  314. package/esm2022/lib/cube/cube-info.service.mjs +0 -103
  315. package/esm2022/lib/cube/cube-menu.component.mjs +0 -25
  316. package/esm2022/lib/cube/cube-view.component.mjs +0 -186
  317. package/esm2022/lib/cube/cube.service.mjs +0 -446
  318. package/esm2022/lib/cube/declarations.mjs +0 -2
  319. package/esm2022/lib/cube/explore/document-item.component.mjs +0 -38
  320. package/esm2022/lib/cube/explore/explore-item.component.mjs +0 -27
  321. package/esm2022/lib/cube/explore/explore-items.component.mjs +0 -193
  322. package/esm2022/lib/cube/explore/explore.pane.component.mjs +0 -78
  323. package/esm2022/lib/cube/explore/item-resolver.service.mjs +0 -30
  324. package/esm2022/lib/cube/explore/item.pane.component.mjs +0 -21
  325. package/esm2022/lib/cube/filter/filter-tags.component.exp.mjs +0 -75
  326. package/esm2022/lib/cube/filter/filter.component.mjs +0 -137
  327. package/esm2022/lib/cube/grid/grid.component.mjs +0 -210
  328. package/esm2022/lib/cube/matrix/matrix.base.mjs +0 -124
  329. package/esm2022/lib/cube/matrix/matrix.mobile.component.mjs +0 -67
  330. package/esm2022/lib/cube/matrix/matrix.pane.component.mjs +0 -78
  331. package/esm2022/lib/cube/matrix/popup.component.mjs +0 -70
  332. package/esm2022/lib/cube/matrix/table.component.mjs +0 -512
  333. package/esm2022/lib/cube/parallel/item.mjs +0 -40
  334. package/esm2022/lib/cube/parallel/parallel.component.mjs +0 -162
  335. package/esm2022/lib/cube/pivot/pivot.component.mjs +0 -564
  336. package/esm2022/lib/cube/spreadsheet/spreadsheet.component.mjs +0 -382
  337. package/esm2022/lib/cube/spreadsheet/spreadsheet.container.exp.mjs +0 -19
  338. package/esm2022/lib/cube/sum/sum.component.mjs +0 -403
  339. package/esm2022/lib/cube/view-base.mjs +0 -74
  340. package/esm2022/lib/cube/view.mobile.component.mjs +0 -121
  341. package/esm2022/lib/cube/view.pane.component.mjs +0 -99
  342. package/esm2022/lib/dashboard/actions/actions.widget.mjs +0 -127
  343. package/esm2022/lib/dashboard/cube/accum-cube.widget.mjs +0 -151
  344. package/esm2022/lib/dashboard/cube/compare.widget.mjs +0 -216
  345. package/esm2022/lib/dashboard/cube/cube-analysis.base.mjs +0 -117
  346. package/esm2022/lib/dashboard/cube/cube-analysis.widget.mjs +0 -50
  347. package/esm2022/lib/dashboard/cube/cube-chart.widget.mjs +0 -146
  348. package/esm2022/lib/dashboard/cube/document-state.widget.mjs +0 -85
  349. package/esm2022/lib/dashboard/cube/documents.widget.mjs +0 -66
  350. package/esm2022/lib/dashboard/cube/filter/filter.component.mjs +0 -61
  351. package/esm2022/lib/dashboard/dashboard.component.mjs +0 -67
  352. package/esm2022/lib/dashboard/dashboard.pane.component.mjs +0 -18
  353. package/esm2022/lib/dashboard/recents/recents.widget.mjs +0 -98
  354. package/esm2022/lib/dashboard/score/activity.widget.mjs +0 -177
  355. package/esm2022/lib/dashboard/score/compare-groups.widget.mjs +0 -215
  356. package/esm2022/lib/dashboard/score/peers-performance.widget.mjs +0 -251
  357. package/esm2022/lib/dashboard/score/pending-results.widget.mjs +0 -59
  358. package/esm2022/lib/dashboard/score/personal-score.widget.mjs +0 -222
  359. package/esm2022/lib/dashboard/widget-item.component.mjs +0 -91
  360. package/esm2022/lib/dashboard/widget-ref.mjs +0 -18
  361. package/esm2022/lib/designer.module.mjs +0 -106
  362. package/esm2022/lib/desktop.module.mjs +0 -140
  363. package/esm2022/lib/home/about/about.dialog.mjs +0 -25
  364. package/esm2022/lib/home/home-base.component.mjs +0 -92
  365. package/esm2022/lib/home/home.desktop.component.mjs +0 -286
  366. package/esm2022/lib/home/home.mobile.component.mjs +0 -131
  367. package/esm2022/lib/home/notifications/notifications.component.mjs +0 -64
  368. package/esm2022/lib/home/outofoffice/outofoffice.component.mjs +0 -37
  369. package/esm2022/lib/home/sign/sign.component.mjs +0 -56
  370. package/esm2022/lib/impersonate/impersonate.component.mjs +0 -77
  371. package/esm2022/lib/mobile.module.mjs +0 -61
  372. package/esm2022/lib/modules/chart.module.mjs +0 -44
  373. package/esm2022/lib/modules/circular-gauge.module.mjs +0 -20
  374. package/esm2022/lib/modules/date.adapter.mjs +0 -23
  375. package/esm2022/lib/modules/datepicker.intl.mjs +0 -41
  376. package/esm2022/lib/modules/dayjs.module.mjs +0 -43
  377. package/esm2022/lib/modules/diagram.module.mjs +0 -39
  378. package/esm2022/lib/modules/gantt.module.mjs +0 -22
  379. package/esm2022/lib/modules/grid.module.mjs +0 -26
  380. package/esm2022/lib/modules/linear-gauge.module.mjs +0 -17
  381. package/esm2022/lib/modules/material.module.mjs +0 -182
  382. package/esm2022/lib/modules/paginator.intl.mjs +0 -21
  383. package/esm2022/lib/modules/pivot.module.mjs +0 -24
  384. package/esm2022/lib/modules/schedule.module.mjs +0 -24
  385. package/esm2022/lib/modules/spreadsheet.module.mjs +0 -28
  386. package/esm2022/lib/modules/stepper.intl.mjs +0 -17
  387. package/esm2022/lib/modules/texteditor.module.mjs +0 -26
  388. package/esm2022/lib/notifications/filter.component.mjs +0 -24
  389. package/esm2022/lib/notifications/notifications-table.component.mjs +0 -105
  390. package/esm2022/lib/notifications/notifications.component-base.mjs +0 -50
  391. package/esm2022/lib/notifications/notifications.mobile.component.mjs +0 -20
  392. package/esm2022/lib/notifications/notifications.pane.component.mjs +0 -21
  393. package/esm2022/lib/notifications/notifications.service.mjs +0 -78
  394. package/esm2022/lib/notifications/types/commented.notification.mjs +0 -60
  395. package/esm2022/lib/notifications/types/cube-anomaly.notification.mjs +0 -58
  396. package/esm2022/lib/notifications/types/escalated.notification.mjs +0 -33
  397. package/esm2022/lib/notifications/types/invite.notification.mjs +0 -45
  398. package/esm2022/lib/notifications/types/liked.notification.mjs +0 -58
  399. package/esm2022/lib/notifications/types/long-running-task.notification.mjs +0 -31
  400. package/esm2022/lib/notifications/types/notification-base.mjs +0 -40
  401. package/esm2022/lib/notifications/types/nudge.notification.mjs +0 -31
  402. package/esm2022/lib/notifications/types/state-changed.notification.mjs +0 -30
  403. package/esm2022/lib/notifications/types/tagged.notification.mjs +0 -43
  404. package/esm2022/lib/notifications/types/text.notification.mjs +0 -23
  405. package/esm2022/lib/notifications/types/upcoming-event.notification.mjs +0 -36
  406. package/esm2022/lib/options/options.component.mjs +0 -308
  407. package/esm2022/lib/options/options.desktop.component.mjs +0 -26
  408. package/esm2022/lib/options/options.mobile.component.mjs +0 -23
  409. package/esm2022/lib/reports/arguments-component.mjs +0 -81
  410. package/esm2022/lib/reports/cube/documents.component.mjs +0 -38
  411. package/esm2022/lib/reports/cube/grid-documents.component.mjs +0 -72
  412. package/esm2022/lib/reports/cube/performance-hilo.component.mjs +0 -260
  413. package/esm2022/lib/reports/cube/performance-wind.component.mjs +0 -269
  414. package/esm2022/lib/reports/cube/table-documents.component.mjs +0 -57
  415. package/esm2022/lib/reports/cube/usage-args.component.mjs +0 -62
  416. package/esm2022/lib/reports/cube/usage-base.mjs +0 -79
  417. package/esm2022/lib/reports/cube/usage-chart.component.mjs +0 -354
  418. package/esm2022/lib/reports/cube/usage-pivot.component.mjs +0 -257
  419. package/esm2022/lib/reports/cube/usage.component.mjs +0 -40
  420. package/esm2022/lib/reports/report-ref.mjs +0 -38
  421. package/esm2022/lib/reports/report-viewer.component.mjs +0 -156
  422. package/esm2022/lib/reports/report.mobile.component.mjs +0 -127
  423. package/esm2022/lib/reports/report.pane.component.mjs +0 -109
  424. package/esm2022/lib/reports/reports-menu.component.mjs +0 -24
  425. package/esm2022/lib/reports/substitution/substitution.component.mjs +0 -39
  426. package/esm2022/lib/reports/table/table-view.component.mjs +0 -40
  427. package/esm2022/lib/reports/tasks/tasks.component.mjs +0 -95
  428. package/esm2022/lib/routes.desktop.mjs +0 -209
  429. package/esm2022/lib/routes.mobile.mjs +0 -85
  430. package/esm2022/lib/scheduler/schedule.component.mjs +0 -164
  431. package/esm2022/lib/scheduler/scheduler.mobile.component.mjs +0 -37
  432. package/esm2022/lib/scheduler/scheduler.pane.component.mjs +0 -50
  433. package/esm2022/lib/search/cube.component.mjs +0 -47
  434. package/esm2022/lib/search/declarations.mjs +0 -7
  435. package/esm2022/lib/search/document.component.mjs +0 -41
  436. package/esm2022/lib/search/guide.component.mjs +0 -28
  437. package/esm2022/lib/search/path.component.mjs +0 -44
  438. package/esm2022/lib/search/search.service.mjs +0 -155
  439. package/esm2022/lib/shared.module.mjs +0 -622
  440. package/esm2022/lib/system.module.mjs +0 -562
  441. package/esm2022/lib/views/cube/chart.component.mjs +0 -74
  442. package/esm2022/lib/views/cube/cube-base.mjs +0 -101
  443. package/esm2022/lib/views/cube/explore.component.mjs +0 -85
  444. package/esm2022/lib/views/cube/matrix.component.mjs +0 -101
  445. package/esm2022/lib/views/cube/parallel.component.mjs +0 -53
  446. package/esm2022/lib/views/cube/pivot.component.mjs +0 -50
  447. package/esm2022/lib/views/cube/sum.component.mjs +0 -66
  448. package/esm2022/lib/views/cube/view.component.mjs +0 -101
  449. package/esm2022/lib/views/document-view-ref.mjs +0 -27
  450. package/esm2022/lib/views/timeline/timeline.component.mjs +0 -329
  451. package/esm2022/lib/views/view-item.component.mjs +0 -68
  452. package/esm2022/lib/views/views.component.mjs +0 -32
  453. package/esm2022/lib/views/views.mobile.component.mjs +0 -21
  454. package/esm2022/lib/views/views.pane.component.mjs +0 -29
  455. package/esm2022/public-api.mjs +0 -182
@@ -1,512 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { formatCurrency, formatPercent, formatNumber } from '@angular/common';
3
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
4
- import { firstValueFrom, forkJoin } from 'rxjs';
5
- import { tap } from 'rxjs/operators';
6
- import { Workbook } from '@syncfusion/ej2-excel-export';
7
- import { isArray, isFunction } from '../../core/functions';
8
- import { errResource } from '../cube.service';
9
- import { matrixAnimation } from '../../core/animations';
10
- import * as i0 from "@angular/core";
11
- import * as i1 from "../../core/prompt.service";
12
- import * as i2 from "../cube.service";
13
- import * as i3 from "../../core/session.service";
14
- import * as i4 from "../../core/translate.service";
15
- import * as i5 from "../../core/datasource.service";
16
- const LOADING_INDICATOR_GRACE = 200;
17
- /** cube matrix component*/
18
- export class CubeMatrixComponent {
19
- set sum(val) {
20
- if (val)
21
- this._sum = (isArray(val) ? val : [val]).map(evalSumSettings);
22
- }
23
- get interactive() {
24
- return this._interactive;
25
- }
26
- set interactive(value) {
27
- this._interactive = coerceBooleanProperty(value);
28
- }
29
- constructor(_sb, _service, _session, _translate, _ds) {
30
- this._sb = _sb;
31
- this._service = _service;
32
- this._session = _session;
33
- this._translate = _translate;
34
- this._ds = _ds;
35
- this.PRECISION = this._service.digitsInfo;
36
- this.LANGUAGE = this._session.language;
37
- this.indexAt = 'Series';
38
- this.placeAt = 'Leading';
39
- this._interactive = true;
40
- this.onExplore = new EventEmitter();
41
- this.loadingChange = new EventEmitter();
42
- this.indices = [];
43
- }
44
- ngOnChanges(changes) {
45
- if (changes['_cube']) {
46
- this.cube = this._session.profile.cubes.find(c => c.name === this._cube);
47
- this.CURRENCY = this.cube.currencyCode /*|| this._service.currencyCode*/;
48
- }
49
- if (!this.cube) {
50
- this.cube = this._session.profile.cubes[0];
51
- this.CURRENCY = this.cube.currencyCode /*|| this._service.currencyCode*/;
52
- }
53
- if (this.CURRENCY)
54
- this.SYMBOL = this._service.getCurrencySymbol(this.CURRENCY);
55
- if (changes['_indices'] && this._indices) {
56
- if (!this.cube.indices)
57
- throw `cube ${this.cube.name} expects one or more indices.`;
58
- this.indices = this.cube.indices.filter(i => isArray(this._indices) ? this._indices.indexOf(i.name) > -1 : this._indices === i.name);
59
- }
60
- if (changes['_xAxis'] || changes['_series']) {
61
- this.xAxis = this.cube.axes.find(a => a.name === this._xAxis);
62
- this.series = this.cube.axes.find(a => a.name === this._series);
63
- this.data = undefined;
64
- this._prepare = firstValueFrom(forkJoin([
65
- this._ds.all(this.series.dataType).pipe(tap(r => this.rows = r)),
66
- this._ds.all(this.xAxis.dataType).pipe(tap(c => this.columns = c))
67
- ]).pipe(tap(this._addAccumHeaders.bind(this))));
68
- this.refresh();
69
- }
70
- else if (changes['filters'])
71
- this.refresh();
72
- }
73
- _addAccumHeaders() {
74
- if (this._indices) {
75
- const collection = this.indexAt === 'XAxis' ? this.columns : this.rows;
76
- this.indices.forEach((x, i) => {
77
- const header = {
78
- key: x.name,
79
- value: x.title,
80
- index: x,
81
- accumulate: x.accumulate
82
- };
83
- if (this.placeAt === 'Trailing')
84
- collection.push(header);
85
- else
86
- collection.splice(i, 0, header);
87
- });
88
- }
89
- this._sum && this._sum.forEach((s, i) => {
90
- const { title, axis, value } = s;
91
- const header = {
92
- key: '_sum' + i,
93
- value: title,
94
- accumulate: !isFunction(s.calculate) && s.calculate !== 'Sum',
95
- explorable: !isFunction(s.calculate) && s.explorable !== false,
96
- precision: s.precision,
97
- sum: s
98
- };
99
- let j = 0;
100
- if (axis === 'XAxis') {
101
- while (j < this.columns.length) {
102
- if (this.columns[j].key === value) {
103
- this.columns.splice(j + 1, 0, header);
104
- break;
105
- }
106
- j++;
107
- }
108
- if (j === this.columns.length)
109
- this.columns.push(header);
110
- }
111
- else {
112
- while (j < this.rows.length) {
113
- if (this.rows[j].key === value) {
114
- this.rows.splice(j + 1, 0, header);
115
- break;
116
- }
117
- j++;
118
- }
119
- if (j === this.rows.length)
120
- this.rows.push(header);
121
- }
122
- });
123
- }
124
- refresh() {
125
- const progressTask = setTimeout(() => this.loadingChange.next(this.loading = true), LOADING_INDICATOR_GRACE);
126
- this._prepare.then(() => this._service.series(this.cube.name, this._xAxis, {
127
- series: this._series,
128
- indices: this._indices,
129
- filters: this.filters,
130
- inverseIndices: this.indexAt === 'XAxis',
131
- scope: this.scope
132
- }).subscribe({
133
- next: r => {
134
- const map = this._map(r);
135
- this._clone(map);
136
- this._totals(map);
137
- this._stringify(map);
138
- this.data = map;
139
- },
140
- error: (e) => {
141
- this._sb.error(errResource(e));
142
- this.loadingChange.error(e);
143
- },
144
- complete: () => {
145
- clearTimeout(progressTask);
146
- this.loadingChange.next(this.loading = false);
147
- }
148
- }));
149
- }
150
- _map(series) {
151
- const map = {};
152
- series.forEach(s => {
153
- if (s.index) {
154
- if (this.indexAt === 'XAxis')
155
- s.points.forEach(p => {
156
- let row = map[p.x];
157
- if (!row)
158
- row = map[p.x] = {};
159
- row[s.index] = p.y;
160
- });
161
- else {
162
- const row = map[s.index] = {};
163
- s.points.forEach(p => row[p.x] = p.y);
164
- }
165
- }
166
- else {
167
- const row = map[s.name] = {};
168
- s.points.forEach(p => row[p.x] = p.y);
169
- }
170
- });
171
- return map;
172
- }
173
- _clone(data) {
174
- this._rawdata = {};
175
- this.rows.forEach(r => {
176
- const key = r.key;
177
- if (!data[key])
178
- data[key] = {};
179
- Object.assign(this._rawdata[key] = {}, data[key]);
180
- });
181
- }
182
- _totals(data) {
183
- this._sum?.forEach((s, i) => {
184
- const { axis, value: key, calculate } = s, name = '_sum' + i;
185
- if (axis === 'XAxis')
186
- this.rows.forEach(r => {
187
- if (r.accumulate === false)
188
- return;
189
- const datarow = data[r.key];
190
- if (!datarow)
191
- return;
192
- let sum = 0;
193
- for (const column of this.columns) {
194
- if (column.index || column.sum)
195
- continue;
196
- if (isFunction(calculate)) {
197
- const val = calculate(r.key, this._rawdata);
198
- if (val !== undefined && val !== null)
199
- sum += val;
200
- }
201
- else {
202
- const val = datarow[column.key];
203
- if (val !== undefined)
204
- sum += val;
205
- if (column.key === key)
206
- break;
207
- }
208
- }
209
- datarow[name] = sum;
210
- });
211
- else {
212
- const sumrow = data[name] = {};
213
- this.columns.forEach(column => {
214
- let sum = 0;
215
- for (const row of this.rows) {
216
- if (row.index || row.sum)
217
- continue;
218
- if (isFunction(calculate)) {
219
- const val = calculate(row.key, this._rawdata);
220
- if (val !== undefined && val !== null)
221
- sum += val;
222
- }
223
- else {
224
- const datarow = data[row.key];
225
- if (!datarow)
226
- continue;
227
- if (column.sum) {
228
- const val = datarow[column.key];
229
- if (val != undefined)
230
- sum += val;
231
- }
232
- else {
233
- const val = datarow[column.key];
234
- if (val !== undefined)
235
- sum += val;
236
- }
237
- if (row.key === key)
238
- break;
239
- }
240
- }
241
- sumrow[column.key] = sum;
242
- });
243
- }
244
- });
245
- let grand = 0;
246
- this.rows.forEach(r => {
247
- const datarow = data[r.key];
248
- if (datarow) {
249
- let columnTotal = 0;
250
- this.columns.forEach(c => {
251
- if (c.accumulate === false || c.sum !== undefined)
252
- return;
253
- const val = datarow[c.key];
254
- if (val !== undefined)
255
- columnTotal += this.indices.length === 0 || this.indexAt !== 'XAxis' ||
256
- c.index !== undefined ? val : -val;
257
- });
258
- datarow['_total'] = this._format(columnTotal, r);
259
- if (!r.sum)
260
- grand += this.indices.length === 0 ||
261
- this.indexAt === 'XAxis' ||
262
- r.index !== undefined ? columnTotal : -columnTotal;
263
- }
264
- else
265
- data[r.key] = {
266
- '_total': '0'
267
- };
268
- });
269
- this.totals = {};
270
- this.columns.forEach(c => {
271
- let rowTotal = 0;
272
- this.rows.forEach(row => {
273
- if (row.accumulate === false || row.sum !== undefined)
274
- return;
275
- const val = data[row.key][c.key];
276
- if (val !== undefined)
277
- rowTotal += this.indices.length === 0 || this.indexAt === 'XAxis' ||
278
- row.index !== undefined ? val : -val;
279
- });
280
- this.totals[c.key] = this._format(rowTotal, c);
281
- });
282
- this.totals['_grand'] = this._format(grand);
283
- }
284
- _stringify(data) {
285
- this.columns.forEach(c => {
286
- const series = c.key;
287
- this.rows.forEach(r => {
288
- const xAxis = r.key, value = data[xAxis][series];
289
- data[xAxis][series] =
290
- (c.sum ? this._format(value, c.sum) :
291
- r.sum ? this._format(value, r.sum) :
292
- this._format(value));
293
- });
294
- });
295
- }
296
- _format(val, options) {
297
- if (val === 0 || val === undefined)
298
- return '0';
299
- if (options) {
300
- if (options.format === 'Percent')
301
- return formatPercent(val, this.LANGUAGE, options.precision || this.PRECISION);
302
- else if (options.format === 'Currency')
303
- return formatCurrency(val, this.LANGUAGE, this.SYMBOL, this.CURRENCY, options.precision || this.PRECISION);
304
- }
305
- if (this.CURRENCY)
306
- return formatCurrency(val, this.LANGUAGE, this.SYMBOL, this.CURRENCY, this.PRECISION);
307
- else
308
- return formatNumber(val, this.LANGUAGE, this.PRECISION);
309
- }
310
- explore(column, row) {
311
- if (!this.interactive || column.explorable === false || row.explorable === false)
312
- return;
313
- let x, series, index;
314
- const axes = { ...this.filters };
315
- if (!column.sum)
316
- x = column.key;
317
- else {
318
- const { value, calculate } = column.sum;
319
- if (isFunction(calculate))
320
- return;
321
- x = [];
322
- for (const column of this.columns) {
323
- if (column.sum)
324
- continue;
325
- const key = column.key;
326
- x.push(key);
327
- if (key === value)
328
- break;
329
- }
330
- }
331
- axes[this.xAxis.name] = x;
332
- if (row.index)
333
- index = row.index.name;
334
- else {
335
- if (row.sum) {
336
- const { value, calculate } = row.sum;
337
- if (isFunction(calculate))
338
- return;
339
- series = [];
340
- for (const row of this.rows) {
341
- if (row.sum)
342
- continue;
343
- const key = row.key;
344
- series.push(key);
345
- if (key === value)
346
- break;
347
- }
348
- }
349
- else
350
- series = row.key;
351
- axes[this.series.name] = series;
352
- }
353
- this.onExplore.emit({ axes, index });
354
- }
355
- /** */
356
- export() {
357
- const numberFormat = this._service.getNumberFormat(this.cube.currencyCode), columns = this.columns.filter(c => !c.sum);
358
- const book = new Workbook({
359
- worksheets: [
360
- {
361
- enableRtl: this._session.inverse,
362
- name: this._translate.get('SheetN', 1),
363
- columns: columns.map((_, i) => ({ index: i + 1, width: 150 })),
364
- rows: [{
365
- index: 1, cells: columns.map((c, j) => ({
366
- index: j + 2,
367
- value: c.value, style: { bold: true }
368
- }))
369
- }, ...this.rows.filter(r => !r.sum).map((r, i) => {
370
- const data = this._rawdata[r.key];
371
- return {
372
- index: i + 2,
373
- cells: [{ index: 1, value: r.value, style: { bold: true } },
374
- ...columns.map((c, j) => ({
375
- type: 'number',
376
- index: j + 2,
377
- value: data && data[c.key] !== undefined ? data[c.key] : 0,
378
- style: {
379
- numberFormat,
380
- hAlign: 'right',
381
- }
382
- }))]
383
- };
384
- })],
385
- }
386
- ]
387
- }, 'xlsx');
388
- this._service.nameOf(this.filters, this.cube.name).subscribe(n => book.save(`${n || this._translate.get('Matrix')}.xlsx`));
389
- }
390
- /**
391
- *
392
- * @param x
393
- * @param y
394
- */
395
- _move(x, y) {
396
- let rowIndex = 0;
397
- for (let b = 0; b < this.tableElement.nativeElement.tBodies.length; b++) {
398
- const tBody = this.tableElement.nativeElement.tBodies.item(b);
399
- for (let r = 0; r < tBody.rows.length; r++) {
400
- const row = tBody.rows.item(r);
401
- for (let c = 0; c < row.cells.length; c++) {
402
- const cell = row.cells.item(c);
403
- if (c === x)
404
- cell.classList.add('cell-x');
405
- else
406
- cell.classList.remove('cell-x');
407
- if (rowIndex === y)
408
- cell.classList.add('cell-y');
409
- else
410
- cell.classList.remove('cell-y');
411
- }
412
- rowIndex++;
413
- }
414
- const tFoot = this.tableElement.nativeElement.tFoot, row = tFoot.rows[0];
415
- for (let c = 0; c < row.cells.length; c++) {
416
- const cell = row.cells.item(c);
417
- if (c === x)
418
- cell.classList.add('cell-x');
419
- else
420
- cell.classList.remove('cell-x');
421
- }
422
- }
423
- }
424
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: CubeMatrixComponent, deps: [{ token: i1.PromptService }, { token: i2.CubeService }, { token: i3.SessionService }, { token: i4.TranslateService }, { token: i5.DatasourceService }], target: i0.ɵɵFactoryTarget.Component }); }
425
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: CubeMatrixComponent, selector: "bizdoc-cube-matrix", inputs: { seriesTotalLabel: "seriesTotalLabel", xAxisTotalLabel: "xAxisTotalLabel", _cube: ["cube", "_cube"], _xAxis: ["xAxis", "_xAxis"], _series: ["series", "_series"], _indices: ["indices", "_indices"], indexAt: "indexAt", placeAt: "placeAt", scope: "scope", sum: "sum", filters: "filters", loading: "loading", interactive: "interactive" }, outputs: { onExplore: "explore", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["table"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (data) {\r\n <table #table class=\"mat-mdc-table cube-table\" (mouseleave)=\"_move(-1, -1)\">\r\n <thead>\r\n <!-- headers -->\r\n <tr class=\"mat-mdc-header-row\">\r\n <th></th>\r\n @for (column of columns; track column; let x = $index) {\r\n <th\r\n (mouseenter)=\"_move(x + 1, -2)\" class=\"mat-mdc-header-cell\">\r\n {{ column.value }}\r\n </th>\r\n }\r\n <th class=\"mat-mdc-header-cell\">{{xAxisTotalLabel}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <!-- rows -->\r\n @for (row of rows; track row; let y = $index) {\r\n <tr class=\"mat-mdc-row\"\r\n [class.cube-index]=\"row.index\">\r\n <th class=\"mat-mdc-header-cell\" (mouseenter)=\"_move(-2, y )\">{{ row.value }}</th>\r\n @for (column of columns; track column; let x = $index) {\r\n <td class=\"mat-mdc-cell figure\"\r\n (mouseenter)=\"_move(x + 1, y )\">\r\n @if (data[row.key][column.key] !== '0') {\r\n <span\r\n [class.explorable]=\"interactive && column.explorable !== false && row.explorable !== false\"\r\n (click)=\"explore(column, row)\">\r\n {{ data[row.key][column.key] }}\r\n </span>\r\n } @else {\r\n 0\r\n }\r\n </td>\r\n }\r\n <th class=\"mat-mdc-cell figure\" (mouseenter)=\"_move(-1, y )\">\r\n {{ data[row.key]['_total'] }}\r\n </th>\r\n </tr>\r\n }\r\n </tbody>\r\n <tfoot>\r\n <!-- footer -->\r\n <tr class=\"mat-mdc-footer-row\">\r\n <th class=\"mat-mdc-footer-cell\">{{seriesTotalLabel}}</th>\r\n @for (column of columns; track column; let x = $index) {\r\n <td class=\"mat-mdc-footer-cell figure\"\r\n (mouseenter)=\"_move(x + 1, -2)\"\r\n [class.negative-figure]=\"totals[column.key].startsWith('-')\">\r\n @if (totals[column.key] !== undefined) {\r\n {{ totals[column.key] }}\r\n }\r\n </td>\r\n }\r\n <th class=\"mat-mdc-footer-cell figure\">{{ totals['_grand'] }}</th>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n}\r\n", styles: [".cube-table{width:100%}.cube-table th{cursor:default}.cube-table th.figure{font-weight:500}.cube-table td,.cube-table th{padding-right:8px}.cube-table .explorable{cursor:pointer}.cube-table tbody tr th,.cube-table tfoot tr th{padding:0 8px}.cube-table tfoot tr>*{border-bottom:none}\n"], animations: [matrixAnimation] }); }
426
- }
427
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: CubeMatrixComponent, decorators: [{
428
- type: Component,
429
- args: [{ selector: 'bizdoc-cube-matrix', animations: [matrixAnimation], template: "@if (data) {\r\n <table #table class=\"mat-mdc-table cube-table\" (mouseleave)=\"_move(-1, -1)\">\r\n <thead>\r\n <!-- headers -->\r\n <tr class=\"mat-mdc-header-row\">\r\n <th></th>\r\n @for (column of columns; track column; let x = $index) {\r\n <th\r\n (mouseenter)=\"_move(x + 1, -2)\" class=\"mat-mdc-header-cell\">\r\n {{ column.value }}\r\n </th>\r\n }\r\n <th class=\"mat-mdc-header-cell\">{{xAxisTotalLabel}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <!-- rows -->\r\n @for (row of rows; track row; let y = $index) {\r\n <tr class=\"mat-mdc-row\"\r\n [class.cube-index]=\"row.index\">\r\n <th class=\"mat-mdc-header-cell\" (mouseenter)=\"_move(-2, y )\">{{ row.value }}</th>\r\n @for (column of columns; track column; let x = $index) {\r\n <td class=\"mat-mdc-cell figure\"\r\n (mouseenter)=\"_move(x + 1, y )\">\r\n @if (data[row.key][column.key] !== '0') {\r\n <span\r\n [class.explorable]=\"interactive && column.explorable !== false && row.explorable !== false\"\r\n (click)=\"explore(column, row)\">\r\n {{ data[row.key][column.key] }}\r\n </span>\r\n } @else {\r\n 0\r\n }\r\n </td>\r\n }\r\n <th class=\"mat-mdc-cell figure\" (mouseenter)=\"_move(-1, y )\">\r\n {{ data[row.key]['_total'] }}\r\n </th>\r\n </tr>\r\n }\r\n </tbody>\r\n <tfoot>\r\n <!-- footer -->\r\n <tr class=\"mat-mdc-footer-row\">\r\n <th class=\"mat-mdc-footer-cell\">{{seriesTotalLabel}}</th>\r\n @for (column of columns; track column; let x = $index) {\r\n <td class=\"mat-mdc-footer-cell figure\"\r\n (mouseenter)=\"_move(x + 1, -2)\"\r\n [class.negative-figure]=\"totals[column.key].startsWith('-')\">\r\n @if (totals[column.key] !== undefined) {\r\n {{ totals[column.key] }}\r\n }\r\n </td>\r\n }\r\n <th class=\"mat-mdc-footer-cell figure\">{{ totals['_grand'] }}</th>\r\n </tr>\r\n </tfoot>\r\n </table>\r\n}\r\n", styles: [".cube-table{width:100%}.cube-table th{cursor:default}.cube-table th.figure{font-weight:500}.cube-table td,.cube-table th{padding-right:8px}.cube-table .explorable{cursor:pointer}.cube-table tbody tr th,.cube-table tfoot tr th{padding:0 8px}.cube-table tfoot tr>*{border-bottom:none}\n"] }]
430
- }], ctorParameters: () => [{ type: i1.PromptService }, { type: i2.CubeService }, { type: i3.SessionService }, { type: i4.TranslateService }, { type: i5.DatasourceService }], propDecorators: { tableElement: [{
431
- type: ViewChild,
432
- args: ['table']
433
- }], seriesTotalLabel: [{
434
- type: Input
435
- }], xAxisTotalLabel: [{
436
- type: Input
437
- }], _cube: [{
438
- type: Input,
439
- args: ['cube']
440
- }], _xAxis: [{
441
- type: Input,
442
- args: ['xAxis']
443
- }], _series: [{
444
- type: Input,
445
- args: ['series']
446
- }], _indices: [{
447
- type: Input,
448
- args: ['indices']
449
- }], indexAt: [{
450
- type: Input
451
- }], placeAt: [{
452
- type: Input
453
- }], scope: [{
454
- type: Input
455
- }], sum: [{
456
- type: Input
457
- }], filters: [{
458
- type: Input
459
- }], loading: [{
460
- type: Input
461
- }], interactive: [{
462
- type: Input
463
- }], onExplore: [{
464
- type: Output,
465
- args: ['explore']
466
- }], loadingChange: [{
467
- type: Output
468
- }] } });
469
- function evalSumSettings(sum, index, array) {
470
- let value;
471
- if (sum.value)
472
- value = sum.value.toString();
473
- else if (sum.calculate)
474
- switch (sum.calculate) {
475
- case 'Month':
476
- {
477
- const month = new Date().getMonth() + 1;
478
- value = 'M' + ('0' + month.toString()).slice(-2);
479
- break;
480
- }
481
- case 'Year':
482
- {
483
- const date = new Date();
484
- let year = date.getFullYear();
485
- if (sum.startMonth) {
486
- const month = date.getMonth() + 1;
487
- if (month < sum.startMonth)
488
- year -= 1;
489
- }
490
- value = year.toString();
491
- break;
492
- }
493
- case 'Quarter':
494
- {
495
- let month = new Date().getMonth() + 1;
496
- if (sum.startMonth && sum.startMonth > 1)
497
- month = 12 - sum.startMonth >= month ?
498
- 12 - month + sum.startMonth
499
- : month - sum.startMonth;
500
- value = Math.ceil(month / 3).toString();
501
- break;
502
- }
503
- case 'Sum':
504
- // greater than any char, sums all columns / rows
505
- value = '~';
506
- }
507
- return {
508
- ...sum,
509
- value
510
- };
511
- }
512
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2N1YmUvbWF0cml4L3RhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9jdWJlL21hdHJpeC90YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQTBCLE1BQU0sOEJBQThCLENBQUM7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQWUsV0FBVyxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFNbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDOzs7Ozs7O0FBS3hELE1BQU0sdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0FBRXBDLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixJQUFhLEdBQUcsQ0FBQyxHQUFnQztRQUMvQyxJQUFJLEdBQUc7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMs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WUFDSCxLQUFLLEtBQUs7Z0JBQ1IsaURBQWlEO2dCQUNqRCxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLENBQUM7SUFDSCxPQUFPO1FBQ0wsR0FBRyxHQUFHO1FBQ04sS0FBSztLQUNOLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBmb3JtYXRQZXJjZW50LCBmb3JtYXROdW1iZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgV29ya2Jvb2ssIFdvcmtzaGVldCwgUm93LCBDb2x1bW4gfSBmcm9tICdAc3luY2Z1c2lvbi9lajItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgaXNBcnJheSwgaXNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQ3ViZVNlcnZpY2UsIGVyclJlc291cmNlLCBTZXJpZXMgfSBmcm9tICcuLi9jdWJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YXNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2RhdGFzb3VyY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBeGVzTWFwLCBBeGlzVmFsdWUsIEN1YmUsIEN1YmVBeGlzLCBDdWJlSW5kZXggfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IG1hdHJpeEFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IFNjb3BlVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEF4aXNDbGlja0V2ZW50IH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHsgQXhpc1BsYWNlLCBBeGlzVHlwZSB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucyc7XHJcblxyXG5jb25zdCBMT0FESU5HX0lORElDQVRPUl9HUkFDRSA9IDIwMDtcclxuXHJcbi8qKiBjdWJlIG1hdHJpeCBjb21wb25lbnQqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JpemRvYy1jdWJlLW1hdHJpeCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFttYXRyaXhBbmltYXRpb25dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdWJlTWF0cml4Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICByZWFkb25seSBQUkVDSVNJT04gPSB0aGlzLl9zZXJ2aWNlLmRpZ2l0c0luZm87XHJcbiAgcmVhZG9ubHkgTEFOR1VBR0UgPSB0aGlzLl9zZXNzaW9uLmxhbmd1YWdlO1xyXG4gIENVUlJFTkNZPzogc3RyaW5nO1xyXG4gIFNZTUJPTDogc3RyaW5nO1xyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJykgdGFibGVFbGVtZW50OiBFbGVtZW50UmVmPEhUTUxUYWJsZUVsZW1lbnQ+O1xyXG4gIEBJbnB1dCgpIHNlcmllc1RvdGFsTGFiZWw/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgeEF4aXNUb3RhbExhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgnY3ViZScpIF9jdWJlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgneEF4aXMnKSBfeEF4aXMhOiBzdHJpbmc7XHJcbiAgQElucHV0KCdzZXJpZXMnKSBfc2VyaWVzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaW5kaWNlcycpIF9pbmRpY2VzPzogc3RyaW5nW10gfCBzdHJpbmc7XHJcbiAgQElucHV0KCkgaW5kZXhBdD86IEF4aXNUeXBlID0gJ1Nlcmllcyc7XHJcbiAgQElucHV0KCkgcGxhY2VBdD86IEF4aXNQbGFjZSA9ICdMZWFkaW5nJztcclxuICBASW5wdXQoKSBzY29wZT86IFNjb3BlVHlwZTtcclxuICBwcml2YXRlIF9zdW06IFN1bVNldHRpbmdzW107XHJcbiAgQElucHV0KCkgc2V0IHN1bSh2YWw6IFN1bVNldHRpbmdzIHwgU3VtU2V0dGluZ3NbXSkge1xyXG4gICAgaWYgKHZhbCkgdGhpcy5fc3VtID0gKGlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdKS5tYXAoZXZhbFN1bVNldHRpbmdzKTtcclxuICB9XHJcbiAgQElucHV0KCkgZmlsdGVyczogQXhlc01hcDtcclxuICBASW5wdXQoKSBsb2FkaW5nOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2ludGVyYWN0aXZlID0gdHJ1ZTtcclxuICBwdWJsaWMgZ2V0IGludGVyYWN0aXZlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aXZlO1xyXG4gIH1cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBzZXQgaW50ZXJhY3RpdmUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2ludGVyYWN0aXZlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICB9XHJcbiAgQE91dHB1dCgnZXhwbG9yZScpIHJlYWRvbmx5IG9uRXhwbG9yZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXhpc0NsaWNrRXZlbnQ+KCk7XHJcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGxvYWRpbmdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgcm93czogSGVhZGVySW5mb1tdO1xyXG4gIGNvbHVtbnM6IEhlYWRlckluZm9bXTtcclxuICBpbmRpY2VzOiBDdWJlSW5kZXhbXSA9IFtdO1xyXG4gIGRhdGE/OiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9OyB9O1xyXG4gIHRvdGFsczogeyBbeEF4aXM6IHN0cmluZ106IHN0cmluZyB9O1xyXG4gIGN1YmU6IEN1YmU7XHJcbiAgeEF4aXM6IEN1YmVBeGlzO1xyXG4gIHNlcmllczogQ3ViZUF4aXM7XHJcbiAgcHJpdmF0ZSBfcmF3ZGF0YTogRGF0YU1hcDtcclxuICBwcml2YXRlIF9wcmVwYXJlOiBQcm9taXNlPGFueT47XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zYjogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IEN1YmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kczogRGF0YXNvdXJjZVNlcnZpY2UpIHtcclxuICB9XHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ19jdWJlJ10pIHtcclxuICAgICAgdGhpcy5jdWJlID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmN1YmVzLmZpbmQoYyA9PiBjLm5hbWUgPT09IHRoaXMuX2N1YmUpITtcclxuICAgICAgdGhpcy5DVVJSRU5DWSA9IHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUgLyp8fCB0aGlzLl9zZXJ2aWNlLmN1cnJlbmN5Q29kZSovO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLmN1YmUpIHtcclxuICAgICAgdGhpcy5jdWJlID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmN1YmVzWzBdO1xyXG4gICAgICB0aGlzLkNVUlJFTkNZID0gdGhpcy5jdWJlLmN1cnJlbmN5Q29kZSAvKnx8IHRoaXMuX3NlcnZpY2UuY3VycmVuY3lDb2RlKi87XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5DVVJSRU5DWSkgdGhpcy5TWU1CT0wgPSB0aGlzLl9zZXJ2aWNlLmdldEN1cnJlbmN5U3ltYm9sKHRoaXMuQ1VSUkVOQ1kpO1xyXG4gICAgaWYgKGNoYW5nZXNbJ19pbmRpY2VzJ10gJiYgdGhpcy5faW5kaWNlcykge1xyXG4gICAgICBpZiAoIXRoaXMuY3ViZS5pbmRpY2VzKSB0aHJvdyBgY3ViZSAke3RoaXMuY3ViZS5uYW1lfSBleHBlY3RzIG9uZSBvciBtb3JlIGluZGljZXMuYDtcclxuICAgICAgdGhpcy5pbmRpY2VzID0gdGhpcy5jdWJlLmluZGljZXMuZmlsdGVyKGkgPT4gaXNBcnJheSh0aGlzLl9pbmRpY2VzKSA/IHRoaXMuX2luZGljZXMuaW5kZXhPZihpLm5hbWUpID4gLTEgOiB0aGlzLl9pbmRpY2VzID09PSBpLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ194QXhpcyddIHx8IGNoYW5nZXNbJ19zZXJpZXMnXSkge1xyXG4gICAgICB0aGlzLnhBeGlzID0gdGhpcy5jdWJlLmF4ZXMuZmluZChhID0+IGEubmFtZSA9PT0gdGhpcy5feEF4aXMpITtcclxuICAgICAgdGhpcy5zZXJpZXMgPSB0aGlzLmN1YmUuYXhlcy5maW5kKGEgPT4gYS5uYW1lID09PSB0aGlzLl9zZXJpZXMpITtcclxuICAgICAgdGhpcy5kYXRhID0gdW5kZWZpbmVkO1xyXG4gICAgICB0aGlzLl9wcmVwYXJlID0gZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgZm9ya0pvaW4oW1xyXG4gICAgICAgICAgdGhpcy5fZHMuYWxsKHRoaXMuc2VyaWVzLmRhdGFUeXBlKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAociA9PlxyXG4gICAgICAgICAgICAgIHRoaXMucm93cyA9IHJcclxuICAgICAgICAgICAgKSksXHJcbiAgICAgICAgICB0aGlzLl9kcy5hbGwodGhpcy54QXhpcy5kYXRhVHlwZSkucGlwZShcclxuICAgICAgICAgICAgdGFwKGMgPT5cclxuICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjXHJcbiAgICAgICAgICAgICkpXSkucGlwZSh0YXAodGhpcy5fYWRkQWNjdW1IZWFkZXJzLmJpbmQodGhpcylcclxuICAgICAgICAgICAgKSkpO1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNoYW5nZXNbJ2ZpbHRlcnMnXSlcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FkZEFjY3VtSGVhZGVycygpIHtcclxuICAgIGlmICh0aGlzLl9pbmRpY2VzKSB7XHJcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycgPyB0aGlzLmNvbHVtbnMgOiB0aGlzLnJvd3M7XHJcbiAgICAgIHRoaXMuaW5kaWNlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgICAga2V5OiB4Lm5hbWUsXHJcbiAgICAgICAgICB2YWx1ZTogeC50aXRsZSxcclxuICAgICAgICAgIGluZGV4OiB4LFxyXG4gICAgICAgICAgYWNjdW11bGF0ZTogeC5hY2N1bXVsYXRlXHJcbiAgICAgICAgfSBhcyBIZWFkZXJJbmZvO1xyXG4gICAgICAgIGlmICh0aGlzLnBsYWNlQXQgPT09ICdUcmFpbGluZycpXHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goaGVhZGVyKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpLCAwLCBoZWFkZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3N1bSAmJiB0aGlzLl9zdW0uZm9yRWFjaCgocywgaSkgPT4ge1xyXG4gICAgICBjb25zdCB7IHRpdGxlLCBheGlzLCB2YWx1ZSB9ID0gcztcclxuICAgICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgIGtleTogJ19zdW0nICsgaSxcclxuICAgICAgICB2YWx1ZTogdGl0bGUsXHJcbiAgICAgICAgYWNjdW11bGF0ZTogIWlzRnVuY3Rpb24ocy5jYWxjdWxhdGUpICYmIHMuY2FsY3VsYXRlICE9PSAnU3VtJyxcclxuICAgICAgICBleHBsb3JhYmxlOiAhaXNGdW5jdGlvbihzLmNhbGN1bGF0ZSkgJiYgcy5leHBsb3JhYmxlICE9PSBmYWxzZSxcclxuICAgICAgICBwcmVjaXNpb246IHMucHJlY2lzaW9uLFxyXG4gICAgICAgIHN1bTogc1xyXG4gICAgICB9IGFzIEhlYWRlckluZm87XHJcbiAgICAgIGxldCBqID0gMDtcclxuICAgICAgaWYgKGF4aXMgPT09ICdYQXhpcycpIHtcclxuICAgICAgICB3aGlsZSAoaiA8IHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnNbal0ua2V5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGogKyAxLCAwLCBoZWFkZXIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGorKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGogPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChoZWFkZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHdoaWxlIChqIDwgdGhpcy5yb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMucm93c1tqXS5rZXkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm93cy5zcGxpY2UoaiArIDEsIDAsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaisrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaiA9PT0gdGhpcy5yb3dzLmxlbmd0aClcclxuICAgICAgICAgIHRoaXMucm93cy5wdXNoKGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpIHtcclxuICAgIGNvbnN0IHByb2dyZXNzVGFzayA9IHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gdHJ1ZSlcclxuICAgICAgLCBMT0FESU5HX0lORElDQVRPUl9HUkFDRSk7XHJcbiAgICB0aGlzLl9wcmVwYXJlLnRoZW4oKCkgPT5cclxuICAgICAgdGhpcy5fc2VydmljZS5zZXJpZXModGhpcy5jdWJlLm5hbWUsIHRoaXMuX3hBeGlzLCB7XHJcbiAgICAgICAgc2VyaWVzOiB0aGlzLl9zZXJpZXMsXHJcbiAgICAgICAgaW5kaWNlczogdGhpcy5faW5kaWNlcyxcclxuICAgICAgICBmaWx0ZXJzOiB0aGlzLmZpbHRlcnMsXHJcbiAgICAgICAgaW52ZXJzZUluZGljZXM6IHRoaXMuaW5kZXhBdCA9PT0gJ1hBeGlzJyxcclxuICAgICAgICBzY29wZTogdGhpcy5zY29wZVxyXG4gICAgICB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IHIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbWFwID0gdGhpcy5fbWFwKHIpO1xyXG4gICAgICAgICAgdGhpcy5fY2xvbmUobWFwKTtcclxuICAgICAgICAgIHRoaXMuX3RvdGFscyhtYXApO1xyXG4gICAgICAgICAgdGhpcy5fc3RyaW5naWZ5KG1hcCk7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSBtYXAgYXMgYW55O1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fc2IuZXJyb3IoZXJyUmVzb3VyY2UoZSkpO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLmVycm9yKGUpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIGNsZWFyVGltZW91dChwcm9ncmVzc1Rhc2spO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX21hcChzZXJpZXM6IFNlcmllc1tdKSB7XHJcbiAgICBjb25zdCBtYXAgPSB7fSBhcyBEYXRhTWFwO1xyXG4gICAgc2VyaWVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIGlmIChzLmluZGV4KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhBdCA9PT0gJ1hBeGlzJylcclxuICAgICAgICAgIHMucG9pbnRzLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBtYXBbcC54XTtcclxuICAgICAgICAgICAgaWYgKCFyb3cpXHJcbiAgICAgICAgICAgICAgcm93ID0gbWFwW3AueF0gPSB7fTtcclxuICAgICAgICAgICAgKHJvdyBhcyBhbnkpW3MuaW5kZXghXSA9IHAueTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0gbWFwW3MuaW5kZXhdID0ge307XHJcbiAgICAgICAgICBzLnBvaW50cy5mb3JFYWNoKHAgPT4gKHJvdyBhcyBhbnkpW3AueF0gPSBwLnkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gbWFwW3MubmFtZSFdID0ge307XHJcbiAgICAgICAgcy5wb2ludHMuZm9yRWFjaChwID0+IChyb3cgYXMgYW55KVtwLnhdID0gcC55KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gbWFwO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbG9uZShkYXRhOiBEYXRhTWFwKSB7XHJcbiAgICB0aGlzLl9yYXdkYXRhID0ge307XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgY29uc3Qga2V5ID0gci5rZXk7XHJcbiAgICAgIGlmICghZGF0YVtrZXldKSBkYXRhW2tleV0gPSB7fTtcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9yYXdkYXRhW2tleV0gPSB7fSwgZGF0YVtrZXldKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIF90b3RhbHMoZGF0YTogRGF0YU1hcCkge1xyXG4gICAgdGhpcy5fc3VtPy5mb3JFYWNoKChzLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgYXhpcywgdmFsdWU6IGtleSwgY2FsY3VsYXRlIH0gPSBzLFxyXG4gICAgICAgIG5hbWUgPSAnX3N1bScgKyBpO1xyXG4gICAgICBpZiAoYXhpcyA9PT0gJ1hBeGlzJylcclxuICAgICAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgIGlmIChyLmFjY3VtdWxhdGUgPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICAgICAgICBjb25zdCBkYXRhcm93ID0gZGF0YVtyLmtleV07XHJcbiAgICAgICAgICBpZiAoIWRhdGFyb3cpIHJldHVybjtcclxuICAgICAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaW5kZXggfHwgY29sdW1uLnN1bSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGN1bGF0ZSkpIHtcclxuICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY2FsY3VsYXRlIGFzIENhbGN1bGF0ZUZuKShyLmtleSwgdGhpcy5fcmF3ZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHN1bSArPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gZGF0YXJvd1tjb2x1bW4ua2V5XTtcclxuICAgICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICBzdW0gKz0gdmFsO1xyXG4gICAgICAgICAgICAgIGlmIChjb2x1bW4ua2V5ID09PSBrZXkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YXJvd1tuYW1lXSA9IHN1bTtcclxuICAgICAgICB9KTtcclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgY29uc3Qgc3Vtcm93ID0gZGF0YVtuYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgICAgICBsZXQgc3VtID0gMDtcclxuICAgICAgICAgIGZvciAoY29uc3Qgcm93IG9mIHRoaXMucm93cykge1xyXG4gICAgICAgICAgICBpZiAocm93LmluZGV4IHx8IHJvdy5zdW0pIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGNhbGN1bGF0ZSBhcyBDYWxjdWxhdGVGbikocm93LmtleSwgdGhpcy5fcmF3ZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHN1bSArPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0YXJvdyA9IGRhdGFbcm93LmtleV07XHJcbiAgICAgICAgICAgICAgaWYgKCFkYXRhcm93KSBjb250aW51ZTtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uLnN1bSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZGF0YXJvd1tjb2x1bW4ua2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT0gdW5kZWZpbmVkKSBzdW0gKz0gdmFsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGRhdGFyb3dbY29sdW1uLmtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgIHN1bSArPSB2YWw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGlmIChyb3cua2V5ID09PSBrZXkpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgKHN1bXJvdyBhcyBhbnkpW2NvbHVtbi5rZXldID0gc3VtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGxldCBncmFuZCA9IDA7XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgY29uc3QgZGF0YXJvdyA9IGRhdGFbci5rZXldO1xyXG4gICAgICBpZiAoZGF0YXJvdykge1xyXG4gICAgICAgIGxldCBjb2x1bW5Ub3RhbCA9IDA7XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICBpZiAoYy5hY2N1bXVsYXRlID09PSBmYWxzZSB8fCBjLnN1bSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgICBjb25zdCB2YWwgPSBkYXRhcm93W2Mua2V5XTtcclxuICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgY29sdW1uVG90YWwgKz0gdGhpcy5pbmRpY2VzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmluZGV4QXQgIT09ICdYQXhpcycgfHxcclxuICAgICAgICAgICAgICBjLmluZGV4ICE9PSB1bmRlZmluZWQgPyB2YWwgOiAtdmFsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGRhdGFyb3dbJ190b3RhbCddID0gdGhpcy5fZm9ybWF0KGNvbHVtblRvdGFsLCByKSBhcyBhbnk7XHJcbiAgICAgICAgaWYgKCFyLnN1bSlcclxuICAgICAgICAgIGdyYW5kICs9IHRoaXMuaW5kaWNlcy5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICAgICAgdGhpcy5pbmRleEF0ID09PSAnWEF4aXMnIHx8XHJcbiAgICAgICAgICAgIHIuaW5kZXggIT09IHVuZGVmaW5lZCA/IGNvbHVtblRvdGFsIDogLWNvbHVtblRvdGFsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBkYXRhW3Iua2V5XSA9IHtcclxuICAgICAgICAgICdfdG90YWwnOiAnMCcgYXMgYW55XHJcbiAgICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy50b3RhbHMgPSB7fTtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBsZXQgcm93VG90YWwgPSAwO1xyXG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICAgIGlmIChyb3cuYWNjdW11bGF0ZSA9PT0gZmFsc2UgfHwgcm93LnN1bSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdmFsID0gZGF0YVtyb3cua2V5XVtjLmtleV07XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgcm93VG90YWwgKz0gdGhpcy5pbmRpY2VzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycgfHxcclxuICAgICAgICAgICAgcm93LmluZGV4ICE9PSB1bmRlZmluZWQgPyB2YWwgOiAtdmFsO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy50b3RhbHNbYy5rZXldID0gdGhpcy5fZm9ybWF0KHJvd1RvdGFsLCBjKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy50b3RhbHNbJ19ncmFuZCddID0gdGhpcy5fZm9ybWF0KGdyYW5kKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfc3RyaW5naWZ5KGRhdGE6IERhdGFNYXApIHtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBjb25zdCBzZXJpZXMgPSBjLmtleTtcclxuICAgICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgY29uc3QgeEF4aXMgPSByLmtleSwgdmFsdWUgPSBkYXRhW3hBeGlzXVtzZXJpZXNdO1xyXG4gICAgICAgIGRhdGFbeEF4aXNdW3Nlcmllc10gPVxyXG4gICAgICAgICAgKGMuc3VtID8gdGhpcy5fZm9ybWF0KHZhbHVlLCBjLnN1bSkgOlxyXG4gICAgICAgICAgICByLnN1bSA/IHRoaXMuX2Zvcm1hdCh2YWx1ZSwgci5zdW0pIDpcclxuICAgICAgICAgICAgICB0aGlzLl9mb3JtYXQodmFsdWUpKSBhcyBhbnk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2Zvcm1hdCh2YWw6IG51bWJlciwgb3B0aW9ucz86IHsgZm9ybWF0PzogRm9ybWF0VHlwZSwgcHJlY2lzaW9uPzogc3RyaW5nIH0pOiBzdHJpbmcge1xyXG4gICAgaWYgKHZhbCA9PT0gMCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcwJztcclxuICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ1BlcmNlbnQnKVxyXG4gICAgICAgIHJldHVybiBmb3JtYXRQZXJjZW50KHZhbCwgdGhpcy5MQU5HVUFHRSwgb3B0aW9ucy5wcmVjaXNpb24gfHwgdGhpcy5QUkVDSVNJT04pO1xyXG4gICAgICBlbHNlIGlmIChvcHRpb25zLmZvcm1hdCA9PT0gJ0N1cnJlbmN5JylcclxuICAgICAgICByZXR1cm4gZm9ybWF0Q3VycmVuY3kodmFsLCB0aGlzLkxBTkdVQUdFLCB0aGlzLlNZTUJPTCwgdGhpcy5DVVJSRU5DWSwgb3B0aW9ucy5wcmVjaXNpb24gfHwgdGhpcy5QUkVDSVNJT04pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuQ1VSUkVOQ1kpXHJcbiAgICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWwsIHRoaXMuTEFOR1VBR0UsIHRoaXMuU1lNQk9MLCB0aGlzLkNVUlJFTkNZLCB0aGlzLlBSRUNJU0lPTik7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJldHVybiBmb3JtYXROdW1iZXIodmFsLCB0aGlzLkxBTkdVQUdFLCB0aGlzLlBSRUNJU0lPTik7XHJcbiAgfVxyXG4gIGV4cGxvcmUoY29sdW1uOiBIZWFkZXJJbmZvLCByb3c6IEhlYWRlckluZm8pIHtcclxuICAgIGlmICghdGhpcy5pbnRlcmFjdGl2ZSB8fCBjb2x1bW4uZXhwbG9yYWJsZSA9PT0gZmFsc2UgfHwgcm93LmV4cGxvcmFibGUgPT09IGZhbHNlKSByZXR1cm47XHJcbiAgICBsZXQgeDogQXhpc1ZhbHVlLCBzZXJpZXM6IEF4aXNWYWx1ZSwgaW5kZXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAgIGNvbnN0IGF4ZXMgPSB7IC4uLnRoaXMuZmlsdGVycyB9IGFzIEF4ZXNNYXA7XHJcbiAgICBpZiAoIWNvbHVtbi5zdW0pXHJcbiAgICAgIHggPSBjb2x1bW4ua2V5O1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHsgdmFsdWUsIGNhbGN1bGF0ZSB9ID0gY29sdW1uLnN1bTtcclxuICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsY3VsYXRlKSkgcmV0dXJuO1xyXG4gICAgICB4ID0gW10gYXMgc3RyaW5nW107XHJcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb2x1bW4uc3VtKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmtleTtcclxuICAgICAgICB4LnB1c2goa2V5KTtcclxuICAgICAgICBpZiAoa2V5ID09PSB2YWx1ZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBheGVzW3RoaXMueEF4aXMubmFtZV0gPSB4O1xyXG4gICAgaWYgKHJvdy5pbmRleClcclxuICAgICAgaW5kZXggPSByb3cuaW5kZXgubmFtZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocm93LnN1bSkge1xyXG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGNhbGN1bGF0ZSB9ID0gcm93LnN1bTtcclxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSByZXR1cm47XHJcbiAgICAgICAgc2VyaWVzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XHJcbiAgICAgICAgICBpZiAocm93LnN1bSlcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSByb3cua2V5O1xyXG4gICAgICAgICAgc2VyaWVzLnB1c2goa2V5KTtcclxuICAgICAgICAgIGlmIChrZXkgPT09IHZhbHVlKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcmllcyA9IHJvdy5rZXk7XHJcbiAgICAgIGF4ZXNbdGhpcy5zZXJpZXMubmFtZV0gPSBzZXJpZXM7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uRXhwbG9yZS5lbWl0KHsgYXhlcywgaW5kZXggfSk7XHJcbiAgfVxyXG4gIC8qKiAqL1xyXG4gIGV4cG9ydCgpIHtcclxuICAgIGNvbnN0IG51bWJlckZvcm1hdCA9IHRoaXMuX3NlcnZpY2UuZ2V0TnVtYmVyRm9ybWF0KHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUpLFxyXG4gICAgICBjb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+ICFjLnN1bSk7XHJcbiAgICBjb25zdCBib29rID0gbmV3IFdvcmtib29rKFxyXG4gICAgICB7XHJcbiAgICAgICAgd29ya3NoZWV0czogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBlbmFibGVSdGw6IHRoaXMuX3Nlc3Npb24uaW52ZXJzZSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnU2hlZXROJywgMSksXHJcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMubWFwKChfLCBpKSA9PiAoeyBpbmRleDogaSArIDEsIHdpZHRoOiAxNTAgfSBhcyBDb2x1bW4pKSxcclxuICAgICAgICAgICAgcm93czogW3tcclxuICAgICAgICAgICAgICBpbmRleDogMSwgY2VsbHM6IGNvbHVtbnMubWFwKChjLCBqKSA9PiAoe1xyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGogKyAyLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IGMudmFsdWUsIHN0eWxlOiB7IGJvbGQ6IHRydWUgfVxyXG4gICAgICAgICAgICAgIH0gYXMgQ2VsbCkpXHJcbiAgICAgICAgICAgIH0sIC4uLnRoaXMucm93cy5maWx0ZXIociA9PiAhci5zdW0pLm1hcCgociwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9yYXdkYXRhW3Iua2V5XTtcclxuICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaW5kZXg6IGkgKyAyLFxyXG4gICAgICAgICAgICAgICAgY2VsbHM6IFt7IGluZGV4OiAxLCB2YWx1ZTogci52YWx1ZSwgc3R5bGU6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgICAgICAuLi5jb2x1bW5zLm1hcCgoYywgaikgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgdHlwZTogJ251bWJlcicsXHJcbiAgICAgICAgICAgICAgICAgIGluZGV4OiBqICsgMixcclxuICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGEgJiYgZGF0YVtjLmtleV0gIT09IHVuZGVmaW5lZCA/IGRhdGFbYy5rZXldIDogMCxcclxuICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBudW1iZXJGb3JtYXQsXHJcbiAgICAgICAgICAgICAgICAgICAgaEFsaWduOiAncmlnaHQnLFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGFzIENlbGwpKV1cclxuICAgICAgICAgICAgICB9IGFzIFJvdztcclxuICAgICAgICAgICAgfSldLFxyXG4gICAgICAgICAgfSBhcyBXb3Jrc2hlZXRcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgICd4bHN4J1xyXG4gICAgKTtcclxuICAgIHRoaXMuX3NlcnZpY2UubmFtZU9mKHRoaXMuZmlsdGVycywgdGhpcy5jdWJlLm5hbWUpLnN1YnNjcmliZShuID0+XHJcbiAgICAgIGJvb2suc2F2ZShgJHtuIHx8IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ01hdHJpeCcpfS54bHN4YCkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0geFxyXG4gICAqIEBwYXJhbSB5XHJcbiAgICovXHJcbiAgX21vdmUoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgIGxldCByb3dJbmRleCA9IDA7XHJcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IHRoaXMudGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudEJvZGllcy5sZW5ndGg7IGIrKykge1xyXG4gICAgICBjb25zdCB0Qm9keSA9IHRoaXMudGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudEJvZGllcy5pdGVtKGIpITtcclxuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Qm9keS5yb3dzLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gdEJvZHkucm93cy5pdGVtKHIpITtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxscy5pdGVtKGMpITtcclxuICAgICAgICAgIGlmIChjID09PSB4KVxyXG4gICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ2NlbGwteCcpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2NlbGwteCcpO1xyXG4gICAgICAgICAgaWYgKHJvd0luZGV4ID09PSB5KVxyXG4gICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ2NlbGwteScpO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2NlbGwteScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByb3dJbmRleCsrO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHRGb290ID0gdGhpcy50YWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC50Rm9vdCEsXHJcbiAgICAgICAgcm93ID0gdEZvb3Qucm93c1swXTtcclxuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cuY2VsbHMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzLml0ZW0oYykhO1xyXG4gICAgICAgIGlmIChjID09PSB4KVxyXG4gICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdjZWxsLXgnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2NlbGwteCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbnR5cGUgRGF0YU1hcCA9IHsgW3Nlcmllczogc3RyaW5nXTogeyBbeEF4aXM6IHN0cmluZ106IG51bWJlcjsgfTsgfTtcclxuXHJcbmV4cG9ydCB0eXBlIFN1bVNldHRpbmdzID0ge1xyXG4gIHN0YXJ0TW9udGg/OiBudW1iZXI7XHJcbiAgdmFsdWU/OiBzdHJpbmcgfCBudW1iZXI7XHJcbiAgYXhpczogQXhpc1R5cGU7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBmb3JtYXQ/OiBGb3JtYXRUeXBlO1xyXG4gIHByZWNpc2lvbj86IHN0cmluZztcclxuICBleHBsb3JhYmxlPzogYm9vbGVhbjtcclxuICBwbGFjZT86IEF4aXNQbGFjZTtcclxuICBjYWxjdWxhdGU/OiBDYWxjdWxhdGVUeXBlO1xyXG59XHJcbmV4cG9ydCBkZWNsYXJlIHR5cGUgRm9ybWF0VHlwZSA9ICdQZXJjZW50JyB8ICdDdXJyZW5jeScgfCAnTnVtYmVyJztcclxuZXhwb3J0IGRlY2xhcmUgdHlwZSBDYWxjdWxhdGVUeXBlID0gJ1F1YXJ0ZXInIHwgJ1llYXInIHwgJ01vbnRoJyB8ICdTdW0nIHwgQ2FsY3VsYXRlRm47XHJcbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDYWxjdWxhdGVGbiB7XHJcbiAgKHZhbHVlOiBzdHJpbmcsIGRhdGE6IHsgW3Nlcmllczogc3RyaW5nXTogeyBbeEF4aXM6IHN0cmluZ106IG51bWJlcjsgfTsgfSk6IG51bWJlcjtcclxufVxyXG5cclxudHlwZSBIZWFkZXJJbmZvID0ge1xyXG4gIGtleTogc3RyaW5nO1xyXG4gIHZhbHVlOiBhbnk7XHJcbiAgcHJlY2lzaW9uPzogc3RyaW5nO1xyXG4gIGV4cGxvcmFibGU/OiBib29sZWFuO1xyXG4gIGFjY3VtdWxhdGU/OiBib29sZWFuO1xyXG4gIHN1bT86IFN1bVNldHRpbmdzO1xyXG4gIGluZGV4PzogQ3ViZUluZGV4O1xyXG59O1xyXG5pbnRlcmZhY2UgQ2VsbCB7IH1cclxuXHJcbmZ1bmN0aW9uIGV2YWxTdW1TZXR0aW5ncyhzdW06IFN1bVNldHRpbmdzLCBpbmRleDogbnVtYmVyLCBhcnJheTogU3VtU2V0dGluZ3NbXSk6IFN1bVNldHRpbmdzIHtcclxuICBsZXQgdmFsdWU7XHJcbiAgaWYgKHN1bS52YWx1ZSlcclxuICAgIHZhbHVlID0gc3VtLnZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgZWxzZSBpZiAoc3VtLmNhbGN1bGF0ZSlcclxuICAgIHN3aXRjaCAoc3VtLmNhbGN1bGF0ZSkge1xyXG4gICAgICBjYXNlICdNb250aCc6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgbW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgICAgdmFsdWUgPSAnTScgKyAoJzAnICsgbW9udGgudG9TdHJpbmcoKSkuc2xpY2UoLTIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdZZWFyJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgICAgIGxldCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgICAgICAgaWYgKHN1bS5zdGFydE1vbnRoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICAgICAgaWYgKG1vbnRoIDwgc3VtLnN0YXJ0TW9udGgpXHJcbiAgICAgICAgICAgICAgeWVhciAtPSAxO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdmFsdWUgPSB5ZWFyLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIGNhc2UgJ1F1YXJ0ZXInOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGxldCBtb250aCA9IG5ldyBEYXRlKCkuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgICBpZiAoc3VtLnN0YXJ0TW9udGggJiYgc3VtLnN0YXJ0TW9udGggPiAxKSBtb250aCA9IDEyIC0gc3VtLnN0YXJ0TW9udGggPj0gbW9udGggP1xyXG4gICAgICAgICAgICAxMiAtIG1vbnRoICsgc3VtLnN0YXJ0TW9udGhcclxuICAgICAgICAgICAgOiBtb250aCAtIHN1bS5zdGFydE1vbnRoO1xyXG4gICAgICAgICAgdmFsdWUgPSBNYXRoLmNlaWwobW9udGggLyAzKS50b1N0cmluZygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdTdW0nOlxyXG4gICAgICAgIC8vIGdyZWF0ZXIgdGhhbiBhbnkgY2hhciwgc3VtcyBhbGwgY29sdW1ucyAvIHJvd3NcclxuICAgICAgICB2YWx1ZSA9ICd+JztcclxuICAgIH1cclxuICByZXR1cm4ge1xyXG4gICAgLi4uc3VtLFxyXG4gICAgdmFsdWVcclxuICB9O1xyXG59XHJcbiIsIkBpZiAoZGF0YSkge1xyXG4gIDx0YWJsZSAjdGFibGUgY2xhc3M9XCJtYXQtbWRjLXRhYmxlIGN1YmUtdGFibGVcIiAobW91c2VsZWF2ZSk9XCJfbW92ZSgtMSwgLTEpXCI+XHJcbiAgICA8dGhlYWQ+XHJcbiAgICAgIDwhLS0gaGVhZGVycyAtLT5cclxuICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1oZWFkZXItcm93XCI+XHJcbiAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbjsgbGV0IHggPSAkaW5kZXgpIHtcclxuICAgICAgICAgIDx0aFxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJfbW92ZSh4ICsgMSwgLTIpXCIgY2xhc3M9XCJtYXQtbWRjLWhlYWRlci1jZWxsXCI+XHJcbiAgICAgICAgICAgIHt7IGNvbHVtbi52YWx1ZSB9fVxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICB9XHJcbiAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1oZWFkZXItY2VsbFwiPnt7eEF4aXNUb3RhbExhYmVsfX08L3RoPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIDx0Ym9keT5cclxuICAgICAgPCEtLSByb3dzIC0tPlxyXG4gICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93OyBsZXQgeSA9ICRpbmRleCkge1xyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtcm93XCJcclxuICAgICAgICAgIFtjbGFzcy5jdWJlLWluZGV4XT1cInJvdy5pbmRleFwiPlxyXG4gICAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1oZWFkZXItY2VsbFwiIChtb3VzZWVudGVyKT1cIl9tb3ZlKC0yLCB5IClcIj57eyByb3cudmFsdWUgfX08L3RoPlxyXG4gICAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbjsgbGV0IHggPSAkaW5kZXgpIHtcclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1jZWxsIGZpZ3VyZVwiXHJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiX21vdmUoeCArIDEsIHkgKVwiPlxyXG4gICAgICAgICAgICAgIEBpZiAoZGF0YVtyb3cua2V5XVtjb2x1bW4ua2V5XSAhPT0gJzAnKSB7XHJcbiAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZXhwbG9yYWJsZV09XCJpbnRlcmFjdGl2ZSAmJiBjb2x1bW4uZXhwbG9yYWJsZSAhPT0gZmFsc2UgJiYgcm93LmV4cGxvcmFibGUgIT09IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGxvcmUoY29sdW1uLCByb3cpXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IGRhdGFbcm93LmtleV1bY29sdW1uLmtleV0gfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDBcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICA8dGggY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmlndXJlXCIgKG1vdXNlZW50ZXIpPVwiX21vdmUoLTEsIHkgKVwiPlxyXG4gICAgICAgICAgICB7eyBkYXRhW3Jvdy5rZXldWydfdG90YWwnXSB9fVxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICB9XHJcbiAgICA8L3Rib2R5PlxyXG4gICAgPHRmb290PlxyXG4gICAgICA8IS0tIGZvb3RlciAtLT5cclxuICAgICAgPHRyIGNsYXNzPVwibWF0LW1kYy1mb290ZXItcm93XCI+XHJcbiAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1mb290ZXItY2VsbFwiPnt7c2VyaWVzVG90YWxMYWJlbH19PC90aD5cclxuICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uczsgdHJhY2sgY29sdW1uOyBsZXQgeCA9ICRpbmRleCkge1xyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1mb290ZXItY2VsbCBmaWd1cmVcIlxyXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJfbW92ZSh4ICsgMSwgLTIpXCJcclxuICAgICAgICAgICAgW2NsYXNzLm5lZ2F0aXZlLWZpZ3VyZV09XCJ0b3RhbHNbY29sdW1uLmtleV0uc3RhcnRzV2l0aCgnLScpXCI+XHJcbiAgICAgICAgICAgIEBpZiAodG90YWxzW2NvbHVtbi5rZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICB7eyB0b3RhbHNbY29sdW1uLmtleV0gfX1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICB9XHJcbiAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1mb290ZXItY2VsbCBmaWd1cmVcIj57eyB0b3RhbHNbJ19ncmFuZCddIH19PC90aD5cclxuICAgICAgPC90cj5cclxuICAgIDwvdGZvb3Q+XHJcbiAgPC90YWJsZT5cclxufVxyXG4iXX0=