@talrace/ngx-noder 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/README.md +75 -66
  2. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +67 -0
  3. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +7 -0
  4. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +47 -0
  5. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +32 -0
  6. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +64 -0
  7. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +89 -0
  8. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +22 -0
  9. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +117 -0
  10. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +37 -0
  11. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +49 -0
  12. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +90 -0
  13. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +81 -0
  14. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +28 -0
  15. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +22 -0
  16. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +53 -0
  17. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +18 -0
  18. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +27 -0
  19. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +71 -0
  20. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +94 -0
  21. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +24 -0
  22. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +65 -0
  23. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +84 -0
  24. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +90 -0
  25. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +117 -0
  26. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +8 -0
  27. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/numbering-templates.const.mjs +6 -6
  28. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +157 -0
  29. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +8 -0
  30. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +11 -0
  31. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.mjs +1 -1
  32. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +6 -0
  33. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +34 -0
  34. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +26 -0
  35. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +60 -0
  36. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +48 -0
  37. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +54 -0
  38. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +84 -0
  39. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +123 -0
  40. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +9 -0
  41. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +6 -0
  42. package/esm2022/lib/editor/components/edges/edge.component.mjs +99 -0
  43. package/esm2022/lib/editor/components/edges/edges.mjs +127 -0
  44. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +7 -0
  45. package/esm2022/lib/editor/components/editor.component.mjs +112 -0
  46. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +6 -0
  47. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +4 -0
  48. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +2 -0
  49. package/esm2022/lib/editor/components/external-element/external.component.mjs +41 -0
  50. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +9 -0
  51. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +11 -0
  52. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +15 -0
  53. package/esm2022/lib/editor/components/image/components/image.component.mjs +88 -0
  54. package/esm2022/lib/editor/components/image/image-api.service.mjs +36 -0
  55. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +55 -0
  56. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +2 -0
  57. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +19 -0
  58. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +12 -0
  59. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +106 -0
  60. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +2 -0
  61. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +52 -0
  62. package/esm2022/lib/editor/components/image/size.mjs +2 -0
  63. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +59 -0
  64. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +18 -0
  65. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +43 -0
  66. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +2 -0
  67. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +3 -0
  68. package/esm2022/lib/editor/components/shared/custom-content.mjs +2 -0
  69. package/esm2022/lib/editor/components/shared/services/component.service.mjs +64 -0
  70. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +129 -0
  71. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +55 -0
  72. package/esm2022/lib/editor/components/tab/tab.component.mjs +44 -0
  73. package/esm2022/lib/editor/components/tab/tab.helper.mjs +6 -0
  74. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +118 -0
  75. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +97 -0
  76. package/esm2022/lib/editor/components/table/components/table.component.mjs +410 -0
  77. package/esm2022/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.mjs +1 -1
  78. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +8 -0
  79. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +6 -0
  80. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +17 -0
  81. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +9 -0
  82. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +8 -0
  83. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +7 -0
  84. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +74 -0
  85. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +376 -0
  86. package/esm2022/lib/editor/content/constants/display-values.const.mjs +8 -0
  87. package/esm2022/lib/editor/content/constants/document-info.const.mjs +13 -0
  88. package/esm2022/lib/editor/content/constants/editor.const.mjs +70 -0
  89. package/esm2022/lib/editor/content/contents.interface.mjs +2 -0
  90. package/esm2022/lib/editor/content/display-data/display-data.mjs +839 -0
  91. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +12 -0
  92. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +10 -0
  93. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +11 -0
  94. package/esm2022/lib/editor/content/display-data/indent.model.mjs +9 -0
  95. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +9 -0
  96. package/esm2022/lib/editor/content/display-data/lines.mjs +96 -0
  97. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +8 -0
  98. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +2 -0
  99. package/esm2022/lib/editor/content/display-data/paragraph.mjs +56 -0
  100. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +35 -0
  101. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +2 -0
  102. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +78 -0
  103. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +62 -0
  104. package/esm2022/lib/{+shared/editor → editor/content}/helpers/format.helper.mjs +1 -1
  105. package/esm2022/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.mjs +1 -1
  106. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +9 -0
  107. package/esm2022/lib/editor/content/margin.model.mjs +16 -0
  108. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +9 -0
  109. package/esm2022/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.mjs +1 -1
  110. package/esm2022/lib/editor/core/event-emitting.mjs +56 -0
  111. package/esm2022/lib/editor/display/cell.interface.mjs +2 -0
  112. package/esm2022/lib/editor/display/event.helper.mjs +18 -0
  113. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +102 -0
  114. package/esm2022/lib/editor/display/layers/layer.config.mjs +2 -0
  115. package/esm2022/lib/editor/display/layers/pages.layer.mjs +97 -0
  116. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +7 -0
  117. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +7 -0
  118. package/esm2022/lib/editor/display/layers/selection.layer.mjs +119 -0
  119. package/esm2022/lib/editor/display/layers/text.layer.mjs +201 -0
  120. package/esm2022/lib/editor/display/print/print.helper.mjs +40 -0
  121. package/esm2022/lib/editor/display/print/print.renderer.mjs +67 -0
  122. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +7 -0
  123. package/esm2022/lib/editor/display/render-changes.interface.mjs +2 -0
  124. package/esm2022/lib/editor/display/render-changes.model.mjs +25 -0
  125. package/esm2022/lib/editor/display/renderer.mjs +206 -0
  126. package/esm2022/lib/editor/display/rendering.helper.mjs +185 -0
  127. package/esm2022/lib/editor/display/renderloop.mjs +26 -0
  128. package/esm2022/lib/editor/display/virtual.renderer.mjs +317 -0
  129. package/esm2022/lib/editor/display/visible-range.interface.mjs +2 -0
  130. package/esm2022/lib/editor/editor.module.mjs +67 -0
  131. package/esm2022/lib/editor/execution/distance.model.mjs +10 -0
  132. package/esm2022/lib/editor/execution/edit.session.mjs +561 -0
  133. package/esm2022/lib/editor/execution/editor.mjs +1387 -0
  134. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +42 -0
  135. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +32 -0
  136. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +12 -0
  137. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +12 -0
  138. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +41 -0
  139. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +177 -0
  140. package/esm2022/lib/editor/execution/regulator.service.mjs +206 -0
  141. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +19 -0
  142. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +15 -0
  143. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +8 -0
  144. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +3 -0
  145. package/esm2022/lib/editor/execution/targeting/session.model.mjs +10 -0
  146. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +2 -0
  147. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +2 -0
  148. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +88 -0
  149. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +206 -0
  150. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +2 -0
  151. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +7 -0
  152. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +9 -0
  153. package/esm2022/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.mjs +1 -1
  154. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +13 -0
  155. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +149 -0
  156. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +7 -0
  157. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +18 -0
  158. package/esm2022/lib/editor/gadgets/scrollbar.mjs +81 -0
  159. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +2 -0
  160. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +2 -0
  161. package/esm2022/lib/editor/gadgets/search/search.mjs +231 -0
  162. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +5 -0
  163. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +20 -0
  164. package/esm2022/lib/editor/interaction/base.handler.mjs +19 -0
  165. package/esm2022/lib/editor/interaction/document.handler.mjs +27 -0
  166. package/esm2022/lib/editor/interaction/editor.service.mjs +346 -0
  167. package/esm2022/lib/editor/interaction/input.handler.mjs +152 -0
  168. package/esm2022/lib/{+shared/enums → editor/interaction}/mode.enum.mjs +1 -1
  169. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +7 -0
  170. package/esm2022/lib/editor/interaction/mouse.handler.mjs +50 -0
  171. package/esm2022/lib/editor/interaction/text-input.mjs +53 -0
  172. package/esm2022/lib/editor/operations/commands.service.mjs +20 -0
  173. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +32 -0
  174. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +7 -0
  175. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +9 -0
  176. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +15 -0
  177. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +85 -0
  178. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +19 -0
  179. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +43 -0
  180. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +63 -0
  181. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +55 -0
  182. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +114 -0
  183. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +16 -0
  184. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +374 -0
  185. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +431 -0
  186. package/esm2022/lib/editor/operations/save-commands.helper.mjs +127 -0
  187. package/esm2022/lib/editor/operations/target-operations.helper.mjs +23 -0
  188. package/esm2022/lib/editor/positioning/alignments.const.mjs +8 -0
  189. package/esm2022/lib/editor/positioning/content.helper.mjs +36 -0
  190. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +13 -0
  191. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +2 -0
  192. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +2 -0
  193. package/esm2022/lib/editor/positioning/line-width.helper.mjs +13 -0
  194. package/esm2022/lib/editor/positioning/position.helper.mjs +196 -0
  195. package/esm2022/lib/editor/positioning/range.mjs +94 -0
  196. package/esm2022/lib/editor/positioning/selection.mjs +317 -0
  197. package/esm2022/lib/editor/revision.helper.mjs +92 -0
  198. package/esm2022/lib/models/generated/cell.model.mjs +1 -1
  199. package/esm2022/lib/models/generated/command.model.mjs +5 -1
  200. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +20 -0
  201. package/esm2022/lib/models/generated/replace.model.mjs +5 -1
  202. package/esm2022/public-api.mjs +37 -31
  203. package/fesm2022/talrace-ngx-noder.mjs +8169 -7285
  204. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  205. package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +26 -0
  206. package/lib/apart-components/add-link-dialog/validation.helper.d.ts +5 -0
  207. package/lib/apart-components/add-link-mobile/add-link-mobile.component.d.ts +19 -0
  208. package/lib/{+shared → apart-components}/confirm-dialog/confirm-dialog.component.d.ts +2 -1
  209. package/lib/{+shared → apart-components}/editor-search/editor-search-dialog.component.d.ts +6 -7
  210. package/lib/apart-components/editor-title/editor-title.component.d.ts +25 -0
  211. package/lib/apart-components/editor-title-mobile/editor-title-mobile.component.d.ts +6 -0
  212. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +49 -0
  213. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/color-picker/color-picker.component.d.ts +1 -1
  214. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/font.component.d.ts +2 -2
  215. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/font-size.component.d.ts +1 -1
  216. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/font-style.component.d.ts +1 -1
  217. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/format.component.d.ts +2 -2
  218. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/heading/heading.component.d.ts +1 -1
  219. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/numbering.component.d.ts +3 -3
  220. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/print/print.component.d.ts +1 -1
  221. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/undo-redo.component.d.ts +1 -1
  222. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/zoom/zoom.component.d.ts +1 -1
  223. package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +36 -0
  224. package/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.d.ts +14 -0
  225. package/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.d.ts +23 -0
  226. package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +26 -0
  227. package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +40 -0
  228. package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +32 -0
  229. package/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.d.ts +2 -0
  230. package/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.d.ts +6 -0
  231. package/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.d.ts +9 -0
  232. package/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.d.ts +14 -0
  233. package/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.d.ts +38 -0
  234. package/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.d.ts +4 -0
  235. package/lib/{+shared → apart-components}/insert-table/insert-table.component.d.ts +1 -1
  236. package/lib/apart-components/insert-table-mobile/insert-table-mobile.component.d.ts +30 -0
  237. package/lib/apart-components/text-format-mobile/text-format-mobile.component.d.ts +35 -0
  238. package/lib/{+shared/editor/core/models → editor/components/edges}/edge-element.model.d.ts +1 -1
  239. package/lib/editor/components/edges/edge.component.d.ts +44 -0
  240. package/lib/{+shared/editor/core → editor}/components/edges/edges.d.ts +7 -7
  241. package/lib/{+shared/editor → editor/components}/editor.component.d.ts +11 -11
  242. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-sidenav.interface.d.ts +1 -1
  243. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external.component.d.ts +4 -4
  244. package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-element.model.d.ts +2 -1
  245. package/lib/{+shared/editor/custom-components → editor/components}/image/components/image.component.d.ts +4 -4
  246. package/lib/editor/components/image/image-api.service.d.ts +17 -0
  247. package/lib/{+shared/editor/custom-components → editor/components}/image/input-handler/image-input.handler.d.ts +3 -0
  248. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/resizer.component.d.ts +2 -2
  249. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-wrapper.d.ts +1 -1
  250. package/lib/{+shared/editor/custom-components → editor/components}/shared/abstract/base.component.d.ts +6 -4
  251. package/lib/editor/components/shared/abstract/destroy.component.d.ts +9 -0
  252. package/lib/{+shared/editor/custom-components/shared/helpers → editor/components/shared}/custom-component.hepler.d.ts +3 -3
  253. package/lib/editor/components/shared/custom-components.interface.d.ts +13 -0
  254. package/lib/editor/components/shared/custom-content.d.ts +5 -0
  255. package/lib/{+shared/editor/custom-components/shared/services/component → editor/components/shared/services}/component.service.d.ts +1 -1
  256. package/lib/{+shared/editor/custom-components/shared/services/custom-content → editor/components/shared/services}/custom-content.service.d.ts +14 -13
  257. package/lib/{+shared/editor/custom-components → editor/components}/tab/tab.component.d.ts +2 -2
  258. package/lib/{+shared/editor/custom-components → editor/components}/table/cell-resizer/cell-resizer.d.ts +2 -1
  259. package/lib/editor/components/table/components/table-cell.component.d.ts +45 -0
  260. package/lib/{+shared/editor/custom-components → editor/components}/table/components/table.component.d.ts +27 -11
  261. package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-data.model.d.ts +1 -1
  262. package/lib/{+shared/editor/custom-components → editor/components}/table/overlay-menu/overlay-menu.component.d.ts +2 -2
  263. package/lib/{+shared/editor/custom-components → editor/components}/table/selection/table-selection.d.ts +5 -3
  264. package/lib/{+shared/editor/core → editor/content}/constants/editor.const.d.ts +5 -3
  265. package/lib/editor/content/contents.interface.d.ts +22 -0
  266. package/lib/editor/content/display-data/display-data.d.ts +103 -0
  267. package/lib/{+shared/editor/core/models → editor/content/display-data}/display-token.model.d.ts +1 -1
  268. package/lib/{+shared/editor/core/models → editor/content/display-data}/format-ext.model.d.ts +1 -1
  269. package/lib/editor/content/display-data/general-properties.model.d.ts +13 -0
  270. package/lib/{+shared/editor/core/models → editor/content/display-data}/line-info.model.d.ts +1 -0
  271. package/lib/{+shared/editor/core/layers → editor/content/display-data}/lines.d.ts +1 -1
  272. package/lib/editor/content/display-data/models/paragraph-info.model.d.ts +9 -0
  273. package/lib/{+shared/editor/core/paging → editor/content/display-data}/paragraph.d.ts +9 -5
  274. package/lib/{+shared/editor/core/paging → editor/content/display-data}/text-line-info.d.ts +5 -2
  275. package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/toolbar-styles.interface.d.ts +1 -1
  276. package/lib/editor/content/helpers/content-style.helper.d.ts +10 -0
  277. package/lib/editor/content/helpers/display-token.helper.d.ts +6 -0
  278. package/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.d.ts +1 -1
  279. package/lib/editor/content/helpers/scaling.helper.d.ts +4 -0
  280. package/lib/{+shared/editor/core/paging → editor/content}/page-vertical-data.model.d.ts +1 -1
  281. package/lib/{+shared/editor/core/base → editor/core}/event-emitting.d.ts +0 -5
  282. package/lib/{+shared/editor/core → editor/display}/layers/cursor.layer.d.ts +7 -8
  283. package/lib/{+shared/editor/core/interfaces → editor/display/layers}/layer.config.d.ts +2 -2
  284. package/lib/{+shared/editor/core → editor/display}/layers/pages.layer.d.ts +5 -6
  285. package/lib/editor/display/layers/print.text.layer.d.ts +4 -0
  286. package/lib/{+shared/editor/core → editor/display}/layers/selection.layer.d.ts +5 -6
  287. package/lib/editor/display/layers/text.layer.d.ts +33 -0
  288. package/lib/{+shared/helpers → editor/display/print}/print.helper.d.ts +3 -3
  289. package/lib/editor/display/print/print.renderer.d.ts +21 -0
  290. package/lib/{+shared/editor/core/helpers → editor/display/print}/print.rendering.helper.d.ts +2 -2
  291. package/lib/{+shared/editor/core/models → editor/display}/render-changes.model.d.ts +1 -1
  292. package/lib/{+shared/editor/core → editor/display}/renderer.d.ts +10 -13
  293. package/lib/{+shared/editor/core/helpers → editor/display}/rendering.helper.d.ts +10 -10
  294. package/lib/{+shared/editor/core/layers → editor/display}/renderloop.d.ts +2 -2
  295. package/lib/{+shared/editor/core → editor/display}/virtual.renderer.d.ts +14 -29
  296. package/lib/editor/editor.module.d.ts +31 -0
  297. package/lib/editor/execution/edit.session.d.ts +113 -0
  298. package/lib/{+shared/editor/core → editor/execution}/editor.d.ts +55 -46
  299. package/lib/{+shared/editor/core → editor/execution}/helpers/format-style.helper.d.ts +1 -5
  300. package/lib/editor/execution/helpers/image.helpet.d.ts +4 -0
  301. package/lib/{+shared/editor/core → editor/execution}/helpers/page.helper.d.ts +1 -1
  302. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph-style.helper.d.ts +1 -1
  303. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph.helper.d.ts +14 -8
  304. package/lib/{+shared/editor → editor}/execution/regulator.service.d.ts +16 -15
  305. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/cell-session-source.model.d.ts +3 -3
  306. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/edge-session-source.model.d.ts +3 -3
  307. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/main-session-source.model.d.ts +1 -1
  308. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session-source.model.d.ts +1 -1
  309. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session.model.d.ts +3 -3
  310. package/lib/{+shared/editor/core/helpers → editor/gadgets/font-metrics}/font-metrics.helper.d.ts +1 -1
  311. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation-history.d.ts +9 -7
  312. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation.type.d.ts +2 -1
  313. package/lib/{+shared/editor/core/models → editor/gadgets/numbering}/numbering-data.model.d.ts +1 -1
  314. package/lib/editor/gadgets/numbering/numbering-paragraph-style.model.d.ts +6 -0
  315. package/lib/editor/gadgets/numbering/numbering.helper.d.ts +26 -0
  316. package/lib/{+shared/editor/helpers → editor/gadgets/page-break}/break.helper.d.ts +2 -2
  317. package/lib/{+shared/editor/core/layers → editor/gadgets}/scrollbar.d.ts +9 -18
  318. package/lib/{+shared/editor/core → editor/gadgets/search}/search.d.ts +4 -4
  319. package/lib/editor/interaction/base.handler.d.ts +9 -0
  320. package/lib/editor/interaction/document.handler.d.ts +10 -0
  321. package/lib/{+shared/editor → editor}/interaction/editor.service.d.ts +36 -21
  322. package/lib/{+shared/editor → editor}/interaction/input.handler.d.ts +4 -5
  323. package/lib/{+shared/editor → editor}/interaction/mouse.handler.d.ts +1 -1
  324. package/lib/{+shared/editor → editor}/operations/enums/command-type.enum.d.ts +11 -10
  325. package/lib/{+shared/editor → editor}/operations/helpers/break-operations.helper.d.ts +2 -2
  326. package/lib/{+shared/editor → editor}/operations/helpers/format-operations.helper.d.ts +2 -2
  327. package/lib/editor/operations/helpers/image-operations.helper.d.ts +7 -0
  328. package/lib/{+shared/editor → editor}/operations/helpers/indexed-element-operations.helper.d.ts +1 -1
  329. package/lib/editor/operations/helpers/link-operations.helper.d.ts +8 -0
  330. package/lib/{+shared/editor → editor}/operations/helpers/numbering-operations.helper.d.ts +3 -3
  331. package/lib/{+shared/editor → editor}/operations/helpers/paragraph-operations.helper.d.ts +3 -2
  332. package/lib/{+shared/editor → editor}/operations/helpers/tab-operations.helper.d.ts +1 -1
  333. package/lib/{+shared/editor → editor}/operations/helpers/table-operations.helper.d.ts +6 -6
  334. package/lib/{+shared/editor/operations/helpers → editor/operations}/operations-helper.helper.d.ts +21 -19
  335. package/lib/{+shared/editor/operations/helpers → editor/operations}/save-commands.helper.d.ts +28 -22
  336. package/lib/editor/operations/target-operations.helper.d.ts +6 -0
  337. package/lib/editor/positioning/content.helper.d.ts +15 -0
  338. package/lib/editor/positioning/cursor-paragraph.d.ts +7 -0
  339. package/lib/{+shared/editor/core/interfaces → editor/positioning}/cursor-position.interface.d.ts +1 -1
  340. package/lib/{+shared/editor/core/helpers → editor/positioning}/line-width.helper.d.ts +2 -2
  341. package/lib/{+shared/editor/core/helpers → editor/positioning}/position.helper.d.ts +11 -11
  342. package/lib/{+shared/editor/core → editor/positioning}/range.d.ts +12 -12
  343. package/lib/{+shared/editor → editor}/positioning/selection.d.ts +13 -10
  344. package/lib/editor/revision.helper.d.ts +15 -0
  345. package/lib/models/generated/cell.model.d.ts +1 -0
  346. package/lib/models/generated/command.model.d.ts +2 -0
  347. package/lib/models/generated/insert-paragraph.model.d.ts +10 -0
  348. package/lib/models/generated/replace.model.d.ts +2 -0
  349. package/package.json +1 -1
  350. package/public-api.d.ts +36 -30
  351. package/src/_ngx-noder.theme.scss +49 -13
  352. package/src/assets/fonts/nc-iconfont.css +112 -106
  353. package/src/assets/fonts/nc-iconfont.eot +0 -0
  354. package/src/assets/fonts/nc-iconfont.svg +4 -1
  355. package/src/assets/fonts/nc-iconfont.ttf +0 -0
  356. package/src/assets/fonts/nc-iconfont.woff +0 -0
  357. package/src/lib/{+shared → apart-components}/add-link-dialog/_add-link-dialog.theme.scss +4 -4
  358. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +25 -0
  359. package/src/lib/apart-components/confirm-dialog/_theme.scss +30 -0
  360. package/src/lib/apart-components/editor-title/_editor-title.theme.scss +28 -0
  361. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +42 -0
  362. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +27 -0
  363. package/src/lib/apart-components/editor-toolbar/_theme.scss +25 -0
  364. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +12 -0
  365. package/src/lib/apart-components/editor-toolbar/components/buttons/font/_font.theme.scss +12 -0
  366. package/src/lib/apart-components/editor-toolbar/components/buttons/font-size/_font-size.theme.scss +14 -0
  367. package/src/lib/apart-components/editor-toolbar/components/buttons/font-style/_font-style.theme.scss +21 -0
  368. package/src/lib/apart-components/editor-toolbar/components/buttons/format/_format.theme.scss +21 -0
  369. package/src/lib/apart-components/editor-toolbar/components/buttons/numbering/_numbering.theme.scss +70 -0
  370. package/src/lib/apart-components/editor-toolbar/components/buttons/undo-redo/_undo-redo.theme.scss +16 -0
  371. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns/_menu-dropdowns.theme.scss +26 -0
  372. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +33 -0
  373. package/src/lib/apart-components/editor-toolbar/components/toolbar-actions/_toolbar-actions.theme.scss +22 -0
  374. package/src/lib/{+shared → apart-components}/insert-table/_insert-table.theme.scss +10 -7
  375. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +54 -0
  376. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +86 -0
  377. package/src/lib/editor/_theme.scss +5 -0
  378. package/src/lib/editor/components/_editor.theme.scss +112 -0
  379. package/src/scss/_fonts.scss +3 -0
  380. package/src/scss/base-editor.scss +329 -0
  381. package/src/styles.scss +3 -58
  382. package/esm2022/lib/+shared/abstract/base-api.service.mjs +0 -99
  383. package/esm2022/lib/+shared/abstract/observer.component.mjs +0 -24
  384. package/esm2022/lib/+shared/confirm-dialog/confirm-dialog.component.mjs +0 -28
  385. package/esm2022/lib/+shared/constants/default-file-name.const.mjs +0 -2
  386. package/esm2022/lib/+shared/constants/paginator-sizes.const.mjs +0 -3
  387. package/esm2022/lib/+shared/editor/core/base/event-emitting.mjs +0 -71
  388. package/esm2022/lib/+shared/editor/core/components/edges/edge-type.enum.mjs +0 -6
  389. package/esm2022/lib/+shared/editor/core/components/edges/edge.component.mjs +0 -100
  390. package/esm2022/lib/+shared/editor/core/components/edges/edges.mjs +0 -104
  391. package/esm2022/lib/+shared/editor/core/constants/alignments.const.mjs +0 -8
  392. package/esm2022/lib/+shared/editor/core/constants/clipboardEventTypes.const.mjs +0 -6
  393. package/esm2022/lib/+shared/editor/core/constants/content-style-change.const.mjs +0 -15
  394. package/esm2022/lib/+shared/editor/core/constants/display-values.const.mjs +0 -8
  395. package/esm2022/lib/+shared/editor/core/constants/document-info.const.mjs +0 -13
  396. package/esm2022/lib/+shared/editor/core/constants/editor-version.const.mjs +0 -2
  397. package/esm2022/lib/+shared/editor/core/constants/editor.const.mjs +0 -62
  398. package/esm2022/lib/+shared/editor/core/constants/unicode-chars.const.mjs +0 -5
  399. package/esm2022/lib/+shared/editor/core/document.mjs +0 -134
  400. package/esm2022/lib/+shared/editor/core/edit.session.mjs +0 -1102
  401. package/esm2022/lib/+shared/editor/core/editor.mjs +0 -1279
  402. package/esm2022/lib/+shared/editor/core/enums/break-types.enum.mjs +0 -7
  403. package/esm2022/lib/+shared/editor/core/enums/mouse-button.enum.mjs +0 -7
  404. package/esm2022/lib/+shared/editor/core/enums/page-type.enum.mjs +0 -7
  405. package/esm2022/lib/+shared/editor/core/helpers/content-style.helper.mjs +0 -156
  406. package/esm2022/lib/+shared/editor/core/helpers/delta.helper.mjs +0 -18
  407. package/esm2022/lib/+shared/editor/core/helpers/dom.helper.mjs +0 -42
  408. package/esm2022/lib/+shared/editor/core/helpers/event.helper.mjs +0 -18
  409. package/esm2022/lib/+shared/editor/core/helpers/font-metrics.helper.mjs +0 -88
  410. package/esm2022/lib/+shared/editor/core/helpers/format-style.helper.mjs +0 -72
  411. package/esm2022/lib/+shared/editor/core/helpers/line-width.helper.mjs +0 -13
  412. package/esm2022/lib/+shared/editor/core/helpers/numbering.helper.mjs +0 -83
  413. package/esm2022/lib/+shared/editor/core/helpers/page.helper.mjs +0 -12
  414. package/esm2022/lib/+shared/editor/core/helpers/paragraph-style.helper.mjs +0 -41
  415. package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +0 -132
  416. package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +0 -191
  417. package/esm2022/lib/+shared/editor/core/helpers/print.rendering.helper.mjs +0 -7
  418. package/esm2022/lib/+shared/editor/core/helpers/rendering.helper.mjs +0 -186
  419. package/esm2022/lib/+shared/editor/core/helpers/unicode.helper.mjs +0 -20
  420. package/esm2022/lib/+shared/editor/core/interfaces/cell.interface.mjs +0 -2
  421. package/esm2022/lib/+shared/editor/core/interfaces/cursor-position.interface.mjs +0 -2
  422. package/esm2022/lib/+shared/editor/core/interfaces/font-metric-size.interface.mjs +0 -2
  423. package/esm2022/lib/+shared/editor/core/interfaces/layer.config.mjs +0 -2
  424. package/esm2022/lib/+shared/editor/core/interfaces/paragraph-info.interface.mjs +0 -2
  425. package/esm2022/lib/+shared/editor/core/interfaces/render-changes.interface.mjs +0 -2
  426. package/esm2022/lib/+shared/editor/core/interfaces/replace.interface.mjs +0 -2
  427. package/esm2022/lib/+shared/editor/core/interfaces/search-iteration.interface.mjs +0 -2
  428. package/esm2022/lib/+shared/editor/core/interfaces/toolbar-styles.interface.mjs +0 -2
  429. package/esm2022/lib/+shared/editor/core/interfaces/visible-line-info.interface.mjs +0 -2
  430. package/esm2022/lib/+shared/editor/core/interfaces/visible-range.interface.mjs +0 -2
  431. package/esm2022/lib/+shared/editor/core/keyboard/text-input.mjs +0 -53
  432. package/esm2022/lib/+shared/editor/core/layers/cursor.layer.mjs +0 -103
  433. package/esm2022/lib/+shared/editor/core/layers/edges.layer.mjs +0 -99
  434. package/esm2022/lib/+shared/editor/core/layers/lines.mjs +0 -96
  435. package/esm2022/lib/+shared/editor/core/layers/pages.layer.mjs +0 -106
  436. package/esm2022/lib/+shared/editor/core/layers/print.edges.layer.mjs +0 -7
  437. package/esm2022/lib/+shared/editor/core/layers/print.pages.layer.mjs +0 -7
  438. package/esm2022/lib/+shared/editor/core/layers/print.text.layer.mjs +0 -7
  439. package/esm2022/lib/+shared/editor/core/layers/renderloop.mjs +0 -26
  440. package/esm2022/lib/+shared/editor/core/layers/scrollbar.mjs +0 -100
  441. package/esm2022/lib/+shared/editor/core/layers/selection.layer.mjs +0 -115
  442. package/esm2022/lib/+shared/editor/core/layers/text.layer.mjs +0 -124
  443. package/esm2022/lib/+shared/editor/core/models/display-token.model.mjs +0 -12
  444. package/esm2022/lib/+shared/editor/core/models/distance.model.mjs +0 -10
  445. package/esm2022/lib/+shared/editor/core/models/edge-element.model.mjs +0 -9
  446. package/esm2022/lib/+shared/editor/core/models/format-ext.model.mjs +0 -10
  447. package/esm2022/lib/+shared/editor/core/models/indent.model.mjs +0 -9
  448. package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +0 -9
  449. package/esm2022/lib/+shared/editor/core/models/margin.model.mjs +0 -16
  450. package/esm2022/lib/+shared/editor/core/models/numbering-data.model.mjs +0 -9
  451. package/esm2022/lib/+shared/editor/core/models/render-changes.model.mjs +0 -25
  452. package/esm2022/lib/+shared/editor/core/paging/page-vertical-data.model.mjs +0 -9
  453. package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +0 -219
  454. package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +0 -52
  455. package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +0 -34
  456. package/esm2022/lib/+shared/editor/core/point.mjs +0 -13
  457. package/esm2022/lib/+shared/editor/core/print.renderer.mjs +0 -72
  458. package/esm2022/lib/+shared/editor/core/range.mjs +0 -94
  459. package/esm2022/lib/+shared/editor/core/renderer.mjs +0 -217
  460. package/esm2022/lib/+shared/editor/core/search.mjs +0 -231
  461. package/esm2022/lib/+shared/editor/core/virtual.renderer.mjs +0 -356
  462. package/esm2022/lib/+shared/editor/custom-components/external-element/element-toolbar/element-toolbar.component.mjs +0 -35
  463. package/esm2022/lib/+shared/editor/custom-components/external-element/external-element.service.mjs +0 -6
  464. package/esm2022/lib/+shared/editor/custom-components/external-element/external-elements.const.mjs +0 -4
  465. package/esm2022/lib/+shared/editor/custom-components/external-element/external-sidenav.interface.mjs +0 -2
  466. package/esm2022/lib/+shared/editor/custom-components/external-element/external.component.mjs +0 -41
  467. package/esm2022/lib/+shared/editor/custom-components/external-element/models/element-data.model.mjs +0 -9
  468. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +0 -10
  469. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-sidenav.model.mjs +0 -15
  470. package/esm2022/lib/+shared/editor/custom-components/image/components/image.component.mjs +0 -87
  471. package/esm2022/lib/+shared/editor/custom-components/image/input-handler/image-input.handler.mjs +0 -38
  472. package/esm2022/lib/+shared/editor/custom-components/image/interfaces/size.mjs +0 -2
  473. package/esm2022/lib/+shared/editor/custom-components/image/resizer/coordinate.mjs +0 -2
  474. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction-wrapper.mjs +0 -19
  475. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction.enum.mjs +0 -12
  476. package/esm2022/lib/+shared/editor/custom-components/image/resizer/resizer.component.mjs +0 -106
  477. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-delta.mjs +0 -2
  478. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-wrapper.mjs +0 -52
  479. package/esm2022/lib/+shared/editor/custom-components/image/services/image-api.service.mjs +0 -14
  480. package/esm2022/lib/+shared/editor/custom-components/shared/abstract/base.component.mjs +0 -57
  481. package/esm2022/lib/+shared/editor/custom-components/shared/constants/custom-content-markers.const.mjs +0 -3
  482. package/esm2022/lib/+shared/editor/custom-components/shared/helpers/custom-component.hepler.mjs +0 -43
  483. package/esm2022/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.mjs +0 -2
  484. package/esm2022/lib/+shared/editor/custom-components/shared/services/component/component.service.mjs +0 -64
  485. package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +0 -120
  486. package/esm2022/lib/+shared/editor/custom-components/shared/services/overlay/overlay.service.mjs +0 -55
  487. package/esm2022/lib/+shared/editor/custom-components/shared/types/custom-content.mjs +0 -2
  488. package/esm2022/lib/+shared/editor/custom-components/tab/tab.component.mjs +0 -43
  489. package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +0 -118
  490. package/esm2022/lib/+shared/editor/custom-components/table/components/table-cell.component.mjs +0 -95
  491. package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +0 -293
  492. package/esm2022/lib/+shared/editor/custom-components/table/enums/reisizer-side.enum.mjs +0 -8
  493. package/esm2022/lib/+shared/editor/custom-components/table/enums/vertical-merge.enum.mjs +0 -6
  494. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-data.model.mjs +0 -18
  495. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-resizer-parameters.model.mjs +0 -9
  496. package/esm2022/lib/+shared/editor/custom-components/table/models/row-data.model.mjs +0 -8
  497. package/esm2022/lib/+shared/editor/custom-components/table/models/selection-range.model.mjs +0 -7
  498. package/esm2022/lib/+shared/editor/custom-components/table/overlay-menu/overlay-menu.component.mjs +0 -74
  499. package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +0 -358
  500. package/esm2022/lib/+shared/editor/editor.component.mjs +0 -103
  501. package/esm2022/lib/+shared/editor/editor.module.mjs +0 -85
  502. package/esm2022/lib/+shared/editor/execution/models/cell-session-source.model.mjs +0 -19
  503. package/esm2022/lib/+shared/editor/execution/models/edge-session-source.model.mjs +0 -15
  504. package/esm2022/lib/+shared/editor/execution/models/general-properties.model.mjs +0 -11
  505. package/esm2022/lib/+shared/editor/execution/models/main-session-source.model.mjs +0 -8
  506. package/esm2022/lib/+shared/editor/execution/models/session-source.model.mjs +0 -3
  507. package/esm2022/lib/+shared/editor/execution/models/session.model.mjs +0 -10
  508. package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +0 -193
  509. package/esm2022/lib/+shared/editor/helpers/break.helper.mjs +0 -18
  510. package/esm2022/lib/+shared/editor/helpers/content.helper.mjs +0 -30
  511. package/esm2022/lib/+shared/editor/helpers/tab.helper.mjs +0 -6
  512. package/esm2022/lib/+shared/editor/interaction/editor.service.mjs +0 -309
  513. package/esm2022/lib/+shared/editor/interaction/input.handler.mjs +0 -160
  514. package/esm2022/lib/+shared/editor/interaction/mouse.handler.mjs +0 -49
  515. package/esm2022/lib/+shared/editor/interfaces/contents.interface.mjs +0 -2
  516. package/esm2022/lib/+shared/editor/interfaces/insert-index.interface.mjs +0 -2
  517. package/esm2022/lib/+shared/editor/operation-history/operation-history.mjs +0 -184
  518. package/esm2022/lib/+shared/editor/operation-history/operation.type.mjs +0 -2
  519. package/esm2022/lib/+shared/editor/operation-history/operations-history-info.model.mjs +0 -7
  520. package/esm2022/lib/+shared/editor/operations/enums/command-type.enum.mjs +0 -31
  521. package/esm2022/lib/+shared/editor/operations/enums/target-type.enum.mjs +0 -7
  522. package/esm2022/lib/+shared/editor/operations/helpers/break-operations.helper.mjs +0 -9
  523. package/esm2022/lib/+shared/editor/operations/helpers/content-operations.helper.mjs +0 -15
  524. package/esm2022/lib/+shared/editor/operations/helpers/format-operations.helper.mjs +0 -56
  525. package/esm2022/lib/+shared/editor/operations/helpers/image-operations.helper.mjs +0 -19
  526. package/esm2022/lib/+shared/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  527. package/esm2022/lib/+shared/editor/operations/helpers/link-operations.helper.mjs +0 -28
  528. package/esm2022/lib/+shared/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  529. package/esm2022/lib/+shared/editor/operations/helpers/operations-helper.helper.mjs +0 -394
  530. package/esm2022/lib/+shared/editor/operations/helpers/paragraph-operations.helper.mjs +0 -83
  531. package/esm2022/lib/+shared/editor/operations/helpers/save-commands.helper.mjs +0 -118
  532. package/esm2022/lib/+shared/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  533. package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +0 -371
  534. package/esm2022/lib/+shared/editor/operations/helpers/target-operations.helper.mjs +0 -23
  535. package/esm2022/lib/+shared/editor/positioning/selection.mjs +0 -307
  536. package/esm2022/lib/+shared/editor/store/editor.actions.mjs +0 -13
  537. package/esm2022/lib/+shared/editor-header/editor-header.component.mjs +0 -314
  538. package/esm2022/lib/+shared/editor-search/editor-search-dialog.component.mjs +0 -71
  539. package/esm2022/lib/+shared/editor-toolbar/color-picker/color-picker.component.mjs +0 -32
  540. package/esm2022/lib/+shared/editor-toolbar/constants/svg-icons.const.mjs +0 -157
  541. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.component.mjs +0 -115
  542. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.module.mjs +0 -107
  543. package/esm2022/lib/+shared/editor-toolbar/enums/alignment.enum.mjs +0 -8
  544. package/esm2022/lib/+shared/editor-toolbar/enums/numbering-type.enum.mjs +0 -6
  545. package/esm2022/lib/+shared/editor-toolbar/font/font.component.mjs +0 -45
  546. package/esm2022/lib/+shared/editor-toolbar/font-size/font-size.component.mjs +0 -85
  547. package/esm2022/lib/+shared/editor-toolbar/font-style/font-style.component.mjs +0 -80
  548. package/esm2022/lib/+shared/editor-toolbar/format/format.component.mjs +0 -28
  549. package/esm2022/lib/+shared/editor-toolbar/heading/heading.component.mjs +0 -23
  550. package/esm2022/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.mjs +0 -55
  551. package/esm2022/lib/+shared/editor-toolbar/numbering/numbering.component.mjs +0 -53
  552. package/esm2022/lib/+shared/editor-toolbar/print/print.component.mjs +0 -18
  553. package/esm2022/lib/+shared/editor-toolbar/undo-redo/undo-redo.component.mjs +0 -27
  554. package/esm2022/lib/+shared/editor-toolbar/zoom/zoom.component.mjs +0 -74
  555. package/esm2022/lib/+shared/helpers/print.helper.mjs +0 -40
  556. package/esm2022/lib/+shared/insert-table/insert-table.component.mjs +0 -54
  557. package/esm2022/lib/+shared/services/commands.service.mjs +0 -20
  558. package/esm2022/lib/+shared/services/custom-icon.service.mjs +0 -34
  559. package/lib/+shared/abstract/base-api.service.d.ts +0 -23
  560. package/lib/+shared/abstract/observer.component.d.ts +0 -10
  561. package/lib/+shared/constants/default-file-name.const.d.ts +0 -1
  562. package/lib/+shared/constants/paginator-sizes.const.d.ts +0 -2
  563. package/lib/+shared/editor/core/components/edges/edge.component.d.ts +0 -45
  564. package/lib/+shared/editor/core/constants/clipboardEventTypes.const.d.ts +0 -5
  565. package/lib/+shared/editor/core/constants/content-style-change.const.d.ts +0 -14
  566. package/lib/+shared/editor/core/document.d.ts +0 -56
  567. package/lib/+shared/editor/core/edit.session.d.ts +0 -159
  568. package/lib/+shared/editor/core/helpers/content-style.helper.d.ts +0 -16
  569. package/lib/+shared/editor/core/helpers/delta.helper.d.ts +0 -6
  570. package/lib/+shared/editor/core/helpers/numbering.helper.d.ts +0 -19
  571. package/lib/+shared/editor/core/interfaces/visible-line-info.interface.d.ts +0 -5
  572. package/lib/+shared/editor/core/layers/edges.layer.d.ts +0 -24
  573. package/lib/+shared/editor/core/layers/print.edges.layer.d.ts +0 -4
  574. package/lib/+shared/editor/core/layers/print.text.layer.d.ts +0 -5
  575. package/lib/+shared/editor/core/layers/text.layer.d.ts +0 -22
  576. package/lib/+shared/editor/core/paging/pages.wrap.d.ts +0 -41
  577. package/lib/+shared/editor/core/point.d.ts +0 -7
  578. package/lib/+shared/editor/core/print.renderer.d.ts +0 -25
  579. package/lib/+shared/editor/custom-components/external-element/element-toolbar/element-toolbar.component.d.ts +0 -14
  580. package/lib/+shared/editor/custom-components/image/services/image-api.service.d.ts +0 -8
  581. package/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.d.ts +0 -13
  582. package/lib/+shared/editor/custom-components/shared/types/custom-content.d.ts +0 -5
  583. package/lib/+shared/editor/custom-components/table/components/table-cell.component.d.ts +0 -45
  584. package/lib/+shared/editor/editor.module.d.ts +0 -30
  585. package/lib/+shared/editor/execution/models/general-properties.model.d.ts +0 -7
  586. package/lib/+shared/editor/helpers/content.helper.d.ts +0 -9
  587. package/lib/+shared/editor/interfaces/contents.interface.d.ts +0 -22
  588. package/lib/+shared/editor/operations/helpers/image-operations.helper.d.ts +0 -7
  589. package/lib/+shared/editor/operations/helpers/link-operations.helper.d.ts +0 -6
  590. package/lib/+shared/editor/operations/helpers/target-operations.helper.d.ts +0 -6
  591. package/lib/+shared/editor/store/editor.actions.d.ts +0 -11
  592. package/lib/+shared/editor-header/editor-header.component.d.ts +0 -101
  593. package/lib/+shared/editor-toolbar/constants/numbering-templates.const.d.ts +0 -6
  594. package/lib/+shared/editor-toolbar/editor-toolbar.component.d.ts +0 -44
  595. package/lib/+shared/editor-toolbar/editor-toolbar.module.d.ts +0 -28
  596. package/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.d.ts +0 -6
  597. package/src/lib/+shared/editor/_editor.theme.scss +0 -35
  598. package/src/lib/+shared/editor/custom-components/external-element/element-toolbar/_element-toolbar.theme.scss +0 -10
  599. package/src/lib/+shared/editor-header/_editor-header.theme.scss +0 -106
  600. package/src/lib/+shared/editor-toolbar/_editor-toolbar.theme.scss +0 -33
  601. package/src/lib/+shared/editor-toolbar/numbering/_numbering.theme.scss +0 -29
  602. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/svg-icons.const.d.ts +0 -0
  603. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/alignment.enum.d.ts +0 -0
  604. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.d.ts +0 -0
  605. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-type.enum.d.ts +0 -0
  606. /package/lib/{+shared → apart-components/editor-toolbar/shared}/services/custom-icon.service.d.ts +0 -0
  607. /package/lib/{+shared/editor/core → editor}/components/edges/edge-type.enum.d.ts +0 -0
  608. /package/lib/{+shared/editor/core/enums → editor/components/edges}/page-type.enum.d.ts +0 -0
  609. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-element.service.d.ts +0 -0
  610. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-elements.const.d.ts +0 -0
  611. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/element-data.model.d.ts +0 -0
  612. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-sidenav.model.d.ts +0 -0
  613. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/coordinate.d.ts +0 -0
  614. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction-wrapper.d.ts +0 -0
  615. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction.enum.d.ts +0 -0
  616. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-delta.d.ts +0 -0
  617. /package/lib/{+shared/editor/custom-components/image/interfaces → editor/components/image}/size.d.ts +0 -0
  618. /package/lib/{+shared/editor/custom-components/shared/constants → editor/components/shared}/custom-content-markers.const.d.ts +0 -0
  619. /package/lib/{+shared/editor/custom-components/shared/services/overlay → editor/components/shared/services}/overlay.service.d.ts +0 -0
  620. /package/lib/{+shared/editor/helpers → editor/components/tab}/tab.helper.d.ts +0 -0
  621. /package/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.d.ts +0 -0
  622. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/reisizer-side.enum.d.ts +0 -0
  623. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/vertical-merge.enum.d.ts +0 -0
  624. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-resizer-parameters.model.d.ts +0 -0
  625. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/row-data.model.d.ts +0 -0
  626. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/selection-range.model.d.ts +0 -0
  627. /package/lib/{+shared/editor/core → editor/content}/constants/display-values.const.d.ts +0 -0
  628. /package/lib/{+shared/editor/core → editor/content}/constants/document-info.const.d.ts +0 -0
  629. /package/lib/{+shared/editor/core/models → editor/content/display-data}/indent.model.d.ts +0 -0
  630. /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/paragraph-info.interface.d.ts +0 -0
  631. /package/lib/{+shared/editor → editor/content}/helpers/format.helper.d.ts +0 -0
  632. /package/lib/{+shared/editor/core/models → editor/content}/margin.model.d.ts +0 -0
  633. /package/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.d.ts +0 -0
  634. /package/lib/{+shared/editor/core/interfaces → editor/display}/cell.interface.d.ts +0 -0
  635. /package/lib/{+shared/editor/core/helpers → editor/display}/event.helper.d.ts +0 -0
  636. /package/lib/{+shared/editor/core → editor/display}/layers/print.pages.layer.d.ts +0 -0
  637. /package/lib/{+shared/editor/core/interfaces → editor/display}/render-changes.interface.d.ts +0 -0
  638. /package/lib/{+shared/editor/core/interfaces → editor/display}/visible-range.interface.d.ts +0 -0
  639. /package/lib/{+shared/editor/core/models → editor/execution}/distance.model.d.ts +0 -0
  640. /package/lib/{+shared/editor/core → editor/execution}/helpers/dom.helper.d.ts +0 -0
  641. /package/lib/{+shared/editor/core/constants → editor/gadgets/font-metrics}/editor-version.const.d.ts +0 -0
  642. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/font-metrics}/font-metric-size.interface.d.ts +0 -0
  643. /package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operations-history-info.model.d.ts +0 -0
  644. /package/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.d.ts +0 -0
  645. /package/lib/{+shared/editor/core/enums → editor/gadgets/page-break}/break-types.enum.d.ts +0 -0
  646. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/replace.interface.d.ts +0 -0
  647. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/search-iteration.interface.d.ts +0 -0
  648. /package/lib/{+shared/editor/core/constants → editor/gadgets/unicode}/unicode-chars.const.d.ts +0 -0
  649. /package/lib/{+shared/editor/core/helpers → editor/gadgets/unicode}/unicode.helper.d.ts +0 -0
  650. /package/lib/{+shared/enums → editor/interaction}/mode.enum.d.ts +0 -0
  651. /package/lib/{+shared/editor/core/enums → editor/interaction}/mouse-button.enum.d.ts +0 -0
  652. /package/lib/{+shared/editor/core/keyboard → editor/interaction}/text-input.d.ts +0 -0
  653. /package/lib/{+shared/services → editor/operations}/commands.service.d.ts +0 -0
  654. /package/lib/{+shared/editor → editor}/operations/enums/target-type.enum.d.ts +0 -0
  655. /package/lib/{+shared/editor → editor}/operations/helpers/content-operations.helper.d.ts +0 -0
  656. /package/lib/{+shared/editor/core/constants → editor/positioning}/alignments.const.d.ts +0 -0
  657. /package/lib/{+shared/editor/interfaces → editor/positioning}/insert-index.interface.d.ts +0 -0
@@ -0,0 +1,1387 @@
1
+ import { AddNumberingModel } from '../../models/generated/add-numbering.model';
2
+ import { ApplyElementStyleModel } from '../../models/generated/apply-element-style.model';
3
+ import { ApplyImageStyleModel } from '../../models/generated/apply-image-style.model';
4
+ import { ApplyParagraphStyleModel } from '../../models/generated/apply-paragraph-style.model';
5
+ import { ApplyTextStyleModel } from '../../models/generated/apply-text-style.model';
6
+ import { BreakHelper } from '../gadgets/page-break/break.helper';
7
+ import { BreakModel } from '../../models/generated/break.model';
8
+ import { BreakTypes } from '../gadgets/page-break/break-types.enum';
9
+ import { ContentHelper } from '../positioning/content.helper';
10
+ import { ContentStyleHelper } from '../content/helpers/content-style.helper';
11
+ import { CursorParagraph } from '../positioning/cursor-paragraph';
12
+ import { CUSTOM_ELEMENT_MARKER, TABLE_MARKER } from '../components/shared/custom-content-markers.const';
13
+ import { DeleteModel } from '../../models/generated/delete.model';
14
+ import { DocumentHandler } from '../interaction/document.handler';
15
+ import { ElementModel } from '../../models/generated/element.model';
16
+ import { FormatHelper } from '../content/helpers/format.helper';
17
+ import { ImageHelper } from './helpers/image.helpet';
18
+ import { ImageModel } from '../../models/generated/image.model';
19
+ import { IndexedElementHelper } from '../content/helpers/indexed-element.helper';
20
+ import { InputHandler } from '../interaction/input.handler';
21
+ import { InsertBreakModel } from '../../models/generated/insert-break.model';
22
+ import { InsertElementModel } from '../../models/generated/insert-element.model';
23
+ import { InsertImageModel } from '../../models/generated/insert-image.model';
24
+ import { InsertLinkModel } from '../../models/generated/insert-link.model';
25
+ import { InsertParagraphModel } from '../../models/generated/insert-paragraph.model';
26
+ import { InsertStyledTextModel } from '../../models/generated/insert-styled-text.model';
27
+ import { InsertTableColumnsModel } from '../../models/generated/insert-table-columns.model';
28
+ import { InsertTableModel } from '../../models/generated/insert-table.model';
29
+ import { InsertTableRowsModel } from '../../models/generated/insert-table-rows.model';
30
+ import { InsertTabModel } from '../../models/generated/insert-tab.model';
31
+ import { InsertTextModel } from '../../models/generated/insert-text.model';
32
+ import { LinkModel } from '../../models/generated/link.model';
33
+ import { MouseHandler } from '../interaction/mouse.handler';
34
+ import { NEW_LINE_MARKUP } from '../content/constants/editor.const';
35
+ import { OperationHistory } from '../gadgets/history/operation-history';
36
+ import { ParagraphModel } from '../../models/generated/paragraph.model';
37
+ import { ParagraphStyleModel } from '../../models/generated/paragraph-style.model';
38
+ import { PositionHelper } from '../positioning/position.helper';
39
+ import { PrintHelper } from '../display/print/print.helper';
40
+ import { Range } from '../positioning/range';
41
+ import { RemoveNumberingsModel } from '../../models/generated/remove-numberings.model';
42
+ import { RemoveTableColumnsModel } from '../../models/generated/remove-table-columns.model';
43
+ import { RemoveTableRowsModel } from '../../models/generated/remove-table-rows.model';
44
+ import { ReplaceModel } from '../../models/generated/replace.model';
45
+ import { ResizeTableColumnsModel } from '../../models/generated/resize-table-columns.model';
46
+ import { RestoreModel } from '../../models/generated/restore.model';
47
+ import { RestoreNumberingsModel } from '../../models/generated/restore-numberings.model';
48
+ import { RestoreParagraphStylesModel } from '../../models/generated/restore-paragraph-styles.model';
49
+ import { RestoreTableModel } from '../../models/generated/restore-table.model';
50
+ import { RestoreTextStylesModel } from '../../models/generated/restore-text-styles.model';
51
+ import { SaveCommandsHelper } from '../operations/save-commands.helper';
52
+ import { ScalingHelper } from '../content/helpers/scaling.helper';
53
+ import { Search } from '../gadgets/search/search';
54
+ import { Selection } from '../positioning/selection';
55
+ import { TableModel } from '../../models/generated/table.model';
56
+ import { TabModel } from '../../models/generated/tab.model';
57
+ import { TextInput } from '../interaction/text-input';
58
+ import { TextStyleModel } from '../../models/generated/text-style.model';
59
+ export class Editor {
60
+ get mainSession() {
61
+ return this.regulatorService.mainSession.session;
62
+ }
63
+ get mainRenderer() {
64
+ return this.regulatorService.mainSession.renderer;
65
+ }
66
+ get session() {
67
+ return this.regulatorService.currentSession.session;
68
+ }
69
+ get renderer() {
70
+ return this.regulatorService.currentSession.renderer;
71
+ }
72
+ get isViewOnly() {
73
+ return this.editorService.isViewOnly;
74
+ }
75
+ get targets() {
76
+ return this.regulatorService.getCurrentSessionTargets();
77
+ }
78
+ constructor(model, container, editorService, regulatorService, commandsService, clipboard, externalElementTagNames, customPageWidth) {
79
+ this.model = model;
80
+ this.container = container;
81
+ this.editorService = editorService;
82
+ this.regulatorService = regulatorService;
83
+ this.commandsService = commandsService;
84
+ this.clipboard = clipboard;
85
+ this.externalElementTagNames = externalElementTagNames;
86
+ this.customPageWidth = customPageWidth;
87
+ this.MAX_COUNT = 999;
88
+ this.parentTagName = 'APP-NOD-EDITOR';
89
+ this.tableCellTagName = 'APP-NOD-TABLE-CELL';
90
+ this.edgeElementTagName = 'APP-NOD-EDGE';
91
+ this.imageTagName = 'APP-NOD-IMAGE';
92
+ this.subscriptions = [];
93
+ this.rerenderResize = () => {
94
+ this.mainRenderer.onResize(true);
95
+ };
96
+ this.onDocumentChange = (range) => {
97
+ let lastRow = range.start.row === range.end.row ? range.end.row : Infinity;
98
+ this.renderer.updateLines(range.start.row, lastRow);
99
+ // Update cursor because tab characters can influence the cursor position.
100
+ this.renderer.updateCursor();
101
+ };
102
+ this.customElementTagNames = [...this.externalElementTagNames, this.imageTagName, this.tableCellTagName, this.edgeElementTagName];
103
+ this.history = new OperationHistory(editorService, regulatorService);
104
+ this.selection = new Selection();
105
+ this.regulatorService.setSelection(this.selection);
106
+ this.initMainSession();
107
+ this.textInput = new TextInput(this.mainRenderer.container);
108
+ this.mainRenderer.textarea = this.textInput.input;
109
+ this.mouseHandler = new MouseHandler(this.mainRenderer.container, this);
110
+ this.inputHandler = new InputHandler(this.textInput.input, this);
111
+ this.documentHandler = new DocumentHandler(this);
112
+ this.initResizeListener();
113
+ this.focus();
114
+ this.session.applyToolbarStyles();
115
+ this.search = new Search();
116
+ this.search.set({ wrap: true });
117
+ this.subscriptions.push(this.searchOptionSubscription(), this.replaceSubscription(), this.setTextStylesSubscription(), this.setParagraphStylesSubscription(), this.changeElementStyleSubscription(), this.setNumberingTemplateTypeSubscription(), this.removeNumberingsSubscription(), this.setImageStyleSubscription(), this.createCustomComponentSubscription(), this.insertBreakSubscription(), this.insertImageSubscription(), this.insertLinkSubscription(), this.insertTextSubscription(), this.endMousePressSubscription(), this.disableSelectionSubscription(), this.changedTableSizeSubscription(), this.insertTableRowsSubscription(), this.insertTableColumnsSubscription(), this.removeTableRowsSubscription(), this.removeTableColumnsSubscription(), this.removedImageSubscription(), this.resizeTableColumnsSubscription(), this.insertTableSubscription(), this.rendererUpdatedSubscription(), this.edgeElementCopyUpdatedSubscription(), this.changedEdgeHeightSubscription(), this.undoSubscription(), this.redoSubscription(), this.clipboardDataSubscription(), this.cutSelectedSubscription(), this.copySelectedSubscription(), this.pasteFromClipboardSubscription(), this.selectAllSubscription(), this.removeSelectedSubscription(), this.printSubscription(), this.updateEdgeSubscription(), this.blurCustomComponentSubscription());
118
+ }
119
+ destroy() {
120
+ this.subscriptions.forEach(s => s?.unsubscribe());
121
+ this.destroyResizeListener();
122
+ this.mouseHandler.destroy();
123
+ this.inputHandler.destroy();
124
+ this.documentHandler.destroy();
125
+ this.blurCustomComponent();
126
+ }
127
+ selectPageDown() {
128
+ const config = this.mainRenderer.layerConfig;
129
+ const line = config.visibleRange.endScreenLine;
130
+ const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
131
+ this.selection.moveSelection(position);
132
+ this.mainRenderer.scrollBy(config.height);
133
+ this.scrollCursorIntoMainView(0.5);
134
+ this.onSelectionChange();
135
+ }
136
+ selectPageUp() {
137
+ const config = this.mainRenderer.layerConfig;
138
+ const line = config.visibleRange.startScreenLine;
139
+ const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
140
+ this.selection.moveSelection(position);
141
+ this.mainRenderer.scrollBy(-config.height);
142
+ this.scrollCursorIntoMainView(0.5);
143
+ this.onSelectionChange();
144
+ }
145
+ gotoPageDown() {
146
+ const config = this.mainRenderer.layerConfig;
147
+ const line = config.visibleRange.endScreenLine;
148
+ const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
149
+ this.selection.placeCursor(position);
150
+ this.mainRenderer.scrollBy(config.height);
151
+ this.scrollCursorIntoMainView(0.5);
152
+ this.onSelectionChange();
153
+ }
154
+ gotoPageUp() {
155
+ const config = this.mainRenderer.layerConfig;
156
+ const line = config.visibleRange.startScreenLine;
157
+ const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
158
+ this.selection.placeCursor(position);
159
+ this.mainRenderer.scrollBy(-config.height);
160
+ this.scrollCursorIntoMainView(0.5);
161
+ this.onSelectionChange();
162
+ }
163
+ cut() {
164
+ this.removeSelected();
165
+ }
166
+ insert(text) {
167
+ if (this.selection.isEmpty) {
168
+ const textStyle = ContentStyleHelper.combineTextStyles(null, this.editorService.styles);
169
+ this.insertText(text, textStyle);
170
+ }
171
+ else {
172
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
173
+ const insertText = new InsertTextModel({ insertIndex, text });
174
+ this.replaceBy(new ReplaceModel({ insertText }));
175
+ }
176
+ }
177
+ insertText(text, textStyle) {
178
+ const position = this.selection.cursor;
179
+ if (textStyle) {
180
+ this.saveInsertStyledTextToHistory(position.row, position.column, text, textStyle);
181
+ }
182
+ else {
183
+ this.saveInsertTextToHistory(position.row, position.column, text);
184
+ }
185
+ this.session.insertText(position, text, textStyle);
186
+ this.onSelectionChange();
187
+ }
188
+ removeLeft() {
189
+ if (this.selection.isEmpty) {
190
+ this.selection.selectLeft(this.session);
191
+ }
192
+ this.removeSelected();
193
+ }
194
+ removeRight() {
195
+ if (this.selection.isEmpty) {
196
+ this.selection.selectRight(this.session);
197
+ }
198
+ this.removeSelected();
199
+ }
200
+ insertBreak(breakType) {
201
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
202
+ const insertBreak = new InsertBreakModel({ insertIndex, breakType });
203
+ if (!this.selection.isEmpty) {
204
+ this.replaceBy(new ReplaceModel({ insertBreak }));
205
+ return;
206
+ }
207
+ if (breakType === BreakTypes.Column) {
208
+ return;
209
+ }
210
+ this.saveInsertBreakToHistory(insertBreak);
211
+ const endPoint = this.session.insertBreak(this.selection.cursor, breakType);
212
+ let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
213
+ this.renderer.updateLines(this.selection.cursor.row, lastRow);
214
+ this.renderer.updateCursor();
215
+ this.rerenderMarker();
216
+ this.scrollCursorIntoMainView(0.1);
217
+ }
218
+ insertTab() {
219
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
220
+ const insertTab = new InsertTabModel({ insertIndex });
221
+ if (!this.selection.isEmpty) {
222
+ this.replaceBy(new ReplaceModel({ insertTab }));
223
+ return;
224
+ }
225
+ this.saveInsertTabToHistory(insertTab);
226
+ const endPoint = this.session.insertTab(this.selection.cursor);
227
+ this.onDocumentChange(new Range(this.selection.cursor, endPoint));
228
+ this.onSelectionChange();
229
+ }
230
+ insertImage(imageData) {
231
+ const adjustedImage = ImageHelper.getImageWithAllowedSize(imageData, this.session.displayData.contentWidth);
232
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
233
+ const insertImage = new InsertImageModel({ insertIndex, imageData: adjustedImage });
234
+ if (!this.selection.isEmpty) {
235
+ this.replaceBy(new ReplaceModel({ insertImage }));
236
+ return;
237
+ }
238
+ this.saveInsertImageToHistory(insertImage);
239
+ const endPoint = this.session.insertImage(this.selection.cursor, adjustedImage);
240
+ let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
241
+ this.renderer.updateLines(this.selection.cursor.row, lastRow);
242
+ this.renderer.updateCursor();
243
+ this.rerenderMarker();
244
+ }
245
+ insertLink(linkDataModel) {
246
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
247
+ const insertLink = new InsertLinkModel({ insertIndex, endIndex: insertIndex + linkDataModel.text.length, linkDataModel });
248
+ if (!this.selection.isEmpty) {
249
+ this.replaceBy(new ReplaceModel({ insertLink }));
250
+ return;
251
+ }
252
+ this.saveInsertLinkToHistory(insertLink);
253
+ this.session.insertLink(this.selection.cursor, linkDataModel);
254
+ this.renderer.updateCursor();
255
+ this.rerenderMarker();
256
+ }
257
+ insertTable(tableData) {
258
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
259
+ const insertTable = new InsertTableModel({
260
+ insertIndex,
261
+ insertTableIndex: insertIndex,
262
+ rowsCount: tableData.rows,
263
+ columnsCount: tableData.columns,
264
+ content: TABLE_MARKER
265
+ });
266
+ if (this.session.displayData.paragraphs[this.selection.range.start.row].paragraphSettings.numberingData.numberingId ||
267
+ !this.session.displayData.paragraphs.some(x => x.startIndex === insertIndex) ||
268
+ !this.session.displayData.isNewLineSymbol(insertIndex)) {
269
+ this.insertTableInNewParagraph(insertTable, insertIndex);
270
+ }
271
+ else {
272
+ this.insertTableInCurrentParagraph(insertTable);
273
+ }
274
+ }
275
+ insertTableInNewParagraph(insertTable, insertIndex) {
276
+ const insertParagraph = new InsertParagraphModel({ insertIndex, insertTable });
277
+ if (!this.selection.isEmpty) {
278
+ this.replaceBy(new ReplaceModel({ insertParagraph }));
279
+ return;
280
+ }
281
+ this.saveInsertParagraphToHistory(insertParagraph);
282
+ const endPoint = this.session.insertParagraph(this.selection.cursor, insertParagraph);
283
+ let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
284
+ this.renderer.updateLines(this.selection.cursor.row, lastRow);
285
+ this.renderer.updateCursor();
286
+ this.rerenderMarker();
287
+ }
288
+ insertTableInCurrentParagraph(insertTable) {
289
+ if (!this.selection.isEmpty) {
290
+ this.replaceBy(new ReplaceModel({ insertTable }));
291
+ return;
292
+ }
293
+ this.saveInsertTableToHistory(insertTable);
294
+ const endPoint = this.session.insertTable(this.selection.cursor, insertTable);
295
+ let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
296
+ this.renderer.updateLines(this.selection.cursor.row, lastRow);
297
+ this.renderer.updateCursor();
298
+ this.rerenderMarker();
299
+ }
300
+ replaceBy(model) {
301
+ const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.session.displayData.paragraphs, this.selection.range);
302
+ model.delete = new DeleteModel({ startIndex: partIndexes.startIndex, endIndex: partIndexes.endIndex });
303
+ this.saveReplaceToHistory(this.selection.range, model);
304
+ const endPosition = this.session.replace(model);
305
+ this.onDocumentChange(new Range(this.selection.cursor, endPosition));
306
+ this.onSelectionChange();
307
+ }
308
+ removeToLineStart() {
309
+ if (this.selection.isEmpty) {
310
+ this.selection.selectLineStart(this.session);
311
+ }
312
+ this.removeSelected();
313
+ }
314
+ removeToLineEnd() {
315
+ if (this.selection.isEmpty) {
316
+ this.selection.selectLineEnd(this.session);
317
+ }
318
+ this.removeSelected();
319
+ }
320
+ removeWordLeft() {
321
+ if (this.selection.isEmpty) {
322
+ this.selection.selectWordLeft(this.session);
323
+ }
324
+ this.removeSelected();
325
+ }
326
+ removeWordRight() {
327
+ if (this.selection.isEmpty) {
328
+ this.selection.selectWordRight(this.session);
329
+ }
330
+ this.removeSelected();
331
+ }
332
+ applyTextStyleBold() {
333
+ this.applyTextStyles(new TextStyleModel({ bold: !this.session.editorService.styles.bold }));
334
+ }
335
+ applyTextStyleItalic() {
336
+ this.applyTextStyles(new TextStyleModel({ italic: !this.session.editorService.styles.italic }));
337
+ }
338
+ applyTextStyleUnderline() {
339
+ this.applyTextStyles(new TextStyleModel({ underline: !this.session.editorService.styles.underline }));
340
+ }
341
+ applyTextStyles(textStyle) {
342
+ this.blurCustomComponent();
343
+ if (!this.selection.isEmpty) {
344
+ const partIndexes = ContentHelper.getSelectedPartDocumentIndexes(this.session.displayData.paragraphs, this.selection.range);
345
+ this.saveApplyTextStyleToHistory(partIndexes.startIndex, partIndexes.endIndex, textStyle);
346
+ this.session.applyTextStyle(partIndexes.startIndex, partIndexes.endIndex, textStyle);
347
+ }
348
+ else {
349
+ this.setTextStyle(textStyle);
350
+ }
351
+ }
352
+ setTextStyle(textStyle) {
353
+ const index = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.cursor);
354
+ const isParagraph = this.session.model.contentLength === index || this.session.model.content[index] === NEW_LINE_MARKUP;
355
+ if (isParagraph) {
356
+ this.saveApplyTextStyleToHistory(index, index, textStyle);
357
+ this.session.applyTextStyle(index, index, textStyle);
358
+ }
359
+ else {
360
+ this.session.setTextStyle(textStyle);
361
+ }
362
+ this.renderer.updateCursor();
363
+ }
364
+ applyParagraphStyles(paragraphStyle) {
365
+ const range = this.selection.range;
366
+ const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
367
+ const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
368
+ this.saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle);
369
+ this.session.applyParagraphStyle(startIndex, endIndex, paragraphStyle);
370
+ }
371
+ applyElementStyle(current) {
372
+ this.saveApplyElementStyleToHistory(current);
373
+ this.session.applyElementStyle(new ApplyElementStyleModel(current));
374
+ }
375
+ setNumberingTemplate(templateLevels) {
376
+ const range = this.selection.range;
377
+ const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
378
+ const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
379
+ this.saveAddNumberingToHistory(templateLevels, startIndex, endIndex);
380
+ this.session.addNumbering(templateLevels, startIndex, endIndex);
381
+ this.renderer.updateCursor();
382
+ }
383
+ removeNumberingsFromParagraphs() {
384
+ const range = this.selection.range;
385
+ const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
386
+ const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
387
+ this.saveRemoveNumberingToHistory(startIndex, endIndex);
388
+ this.session.removeNumberings(startIndex, endIndex);
389
+ this.renderer.updateCursor();
390
+ }
391
+ applyImageStyles(image) {
392
+ this.saveApplyImageStyleToHistory(image);
393
+ const imageStyle = new ApplyImageStyleModel({ insertIndex: image.insertIndex, height: image.height, width: image.width });
394
+ this.session.applyImageStyle(imageStyle);
395
+ this.renderer.updateCursor();
396
+ }
397
+ focus() {
398
+ this.textInput.input.focus();
399
+ }
400
+ openSearch() {
401
+ this.editorService.openSearchDialog = true;
402
+ }
403
+ find(options) {
404
+ let range = this.selection.range;
405
+ if (options.term == null) {
406
+ let term = this.session.displayData.getTextRange(range) || this.search.options.term;
407
+ if (!term) {
408
+ range = this.session.getWordRange(range.start.row, range.start.column);
409
+ term = this.session.displayData.getTextRange(range);
410
+ }
411
+ options.term = term;
412
+ }
413
+ if (!options.start) {
414
+ options.start = range;
415
+ }
416
+ this.search.set(options);
417
+ const newRange = this.search.find(this.session);
418
+ if (newRange) {
419
+ this.selection.placeSelection(range.start, range.end);
420
+ this.onSelectionChange();
421
+ if (this.session === this.mainSession) {
422
+ this.mainRenderer.scrollSelectionIntoView(range.start, range.end, 0.5);
423
+ }
424
+ return newRange;
425
+ }
426
+ range.end = range.start;
427
+ this.selection.placeCursor(range.start);
428
+ this.onSelectionChange();
429
+ return null;
430
+ }
431
+ updateCounter() {
432
+ const regex = this.search.options.regex;
433
+ let all = 0;
434
+ let current = 0;
435
+ if (!regex) {
436
+ return { current: 0, total: 0 };
437
+ }
438
+ const value = this.session.displayData.getAllParagraphsContent().join('\n');
439
+ let offset = this.session.displayData.positionToIndex(this.selection.range.start);
440
+ regex.lastIndex = 0;
441
+ let regexResult;
442
+ while ((regexResult = regex.exec(value))) {
443
+ all++;
444
+ let last = regexResult.index;
445
+ if (last <= offset) {
446
+ current++;
447
+ }
448
+ if (all > this.MAX_COUNT) {
449
+ break;
450
+ }
451
+ }
452
+ return { current: current, total: all > this.MAX_COUNT ? this.MAX_COUNT : all };
453
+ }
454
+ replace(search, replace) {
455
+ if (this.selection.isEmpty) {
456
+ return;
457
+ }
458
+ if (search !== replace) {
459
+ if (replace) {
460
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
461
+ const insertText = new InsertTextModel({ insertIndex, text: replace });
462
+ this.replaceBy(new ReplaceModel({ insertText }));
463
+ }
464
+ else {
465
+ this.removeSelected();
466
+ }
467
+ }
468
+ this.find({ term: search, skipCurrent: true, backwards: false });
469
+ }
470
+ undo() {
471
+ const undo = this.history.popUndoOperation();
472
+ if (!undo) {
473
+ return;
474
+ }
475
+ this.regulatorService.setTargetedSessionAsCurrent(undo.targets);
476
+ this.applyOperation(undo.operation);
477
+ this.selection.placeSelection(undo.cursor, undo.anchor);
478
+ this.onSelectionChange();
479
+ }
480
+ redo() {
481
+ const redo = this.history.popRedoOperation();
482
+ if (!redo) {
483
+ return;
484
+ }
485
+ this.regulatorService.setTargetedSessionAsCurrent(redo.targets);
486
+ this.selection.placeSelection(redo.cursor, redo.anchor);
487
+ this.applyOperation(redo.operation);
488
+ this.onSelectionChange();
489
+ }
490
+ applyOperation(operation) {
491
+ let command = null;
492
+ if (operation instanceof InsertTextModel) {
493
+ this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, null);
494
+ const { text, insertIndex } = operation;
495
+ command = SaveCommandsHelper.getInsertTextCommand(text, insertIndex, this.targets);
496
+ }
497
+ else if (operation instanceof InsertParagraphModel) {
498
+ this.session.insertParagraphByDocumentIndex(operation);
499
+ command = SaveCommandsHelper.getInsertParagraphCommand(operation, this.targets);
500
+ }
501
+ else if (operation instanceof DeleteModel) {
502
+ this.session.removeByDocumentIndexes(operation.startIndex, operation.endIndex);
503
+ command = SaveCommandsHelper.getDeleteCommand(operation.startIndex, operation.endIndex, this.targets);
504
+ }
505
+ else if (operation instanceof InsertStyledTextModel) {
506
+ this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, new TextStyleModel(operation.textStyle));
507
+ const { text, insertIndex, textStyle } = operation;
508
+ command = SaveCommandsHelper.getInsertStyledTextCommand(text, insertIndex, textStyle, this.targets);
509
+ }
510
+ else if (operation instanceof RestoreModel) {
511
+ const deepCopy = structuredClone(operation);
512
+ this.session.restore(deepCopy);
513
+ command = SaveCommandsHelper.getRestoreCommand(deepCopy, this.targets);
514
+ }
515
+ else if (operation instanceof ApplyTextStyleModel) {
516
+ this.session.applyTextStyle(operation.startIndex, operation.endIndex, new TextStyleModel(operation.textStyle));
517
+ const { startIndex, endIndex, textStyle } = operation;
518
+ command = SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets);
519
+ }
520
+ else if (operation instanceof ApplyParagraphStyleModel) {
521
+ const copy = new ParagraphStyleModel(operation.paragraphStyle);
522
+ this.session.applyParagraphStyle(operation.startIndex, operation.endIndex, copy);
523
+ const { startIndex, endIndex, paragraphStyle } = operation;
524
+ command = SaveCommandsHelper.getApplyParagraphStyleCommand(startIndex, endIndex, paragraphStyle, this.targets);
525
+ }
526
+ else if (operation instanceof RestoreTextStylesModel) {
527
+ const deepCopy = structuredClone(operation);
528
+ this.session.restoreTextStyles(deepCopy.formats);
529
+ command = SaveCommandsHelper.getRestoreTextStylesCommand(deepCopy.formats, this.targets);
530
+ }
531
+ else if (operation instanceof RestoreParagraphStylesModel) {
532
+ const deepCopy = structuredClone(operation);
533
+ this.session.restoreParagraphStyles(deepCopy.paragraphs);
534
+ command = SaveCommandsHelper.getRestoreParagraphStylesCommand(deepCopy.paragraphs, this.targets);
535
+ }
536
+ else if (operation instanceof InsertElementModel) {
537
+ this.session.insertElementByDocumentIndex(operation);
538
+ command = SaveCommandsHelper.getInsertElementCommand(operation, this.targets);
539
+ }
540
+ else if (operation instanceof InsertBreakModel) {
541
+ this.session.insertBreakByDocumentIndex(operation);
542
+ command = SaveCommandsHelper.getInsertBreakCommand(operation, this.targets);
543
+ }
544
+ else if (operation instanceof ApplyElementStyleModel) {
545
+ this.session.applyElementStyle(operation);
546
+ command = SaveCommandsHelper.getApplyElementStyleCommand(operation, this.targets);
547
+ }
548
+ else if (operation instanceof InsertTabModel) {
549
+ this.session.insertTabByDocumentIndex(operation);
550
+ command = SaveCommandsHelper.getInsertTabCommand(operation, this.targets);
551
+ }
552
+ else if (operation instanceof InsertImageModel) {
553
+ this.session.insertImageByDocumentIndex(operation);
554
+ command = SaveCommandsHelper.getInsertImageCommand(operation, this.targets);
555
+ }
556
+ else if (operation instanceof ApplyImageStyleModel) {
557
+ this.session.applyImageStyle(operation);
558
+ const { height, width, insertIndex } = operation;
559
+ command = SaveCommandsHelper.getApplyImageStyleCommand(height, width, insertIndex, this.targets);
560
+ }
561
+ else if (operation instanceof AddNumberingModel) {
562
+ this.session.addNumbering(operation.levels, operation.startIndex, operation.endIndex);
563
+ const { startIndex, endIndex, levels } = operation;
564
+ command = SaveCommandsHelper.getAddNumberingCommand(startIndex, endIndex, levels, this.targets);
565
+ }
566
+ else if (operation instanceof RestoreNumberingsModel) {
567
+ this.session.restoreNumberings(operation.paragraphs, operation.numberings);
568
+ command = SaveCommandsHelper.getRestoreNumberingsCommand(operation, this.targets);
569
+ }
570
+ else if (operation instanceof InsertTableColumnsModel) {
571
+ this.session.insertTableColumns(operation.insertIndex, operation.columnsCount, operation.targetIndex, operation.inheritIndex);
572
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
573
+ const { columnsCount, inheritIndex, insertIndex, targetIndex } = operation;
574
+ command = SaveCommandsHelper.getInsertTableColumnsCommand(columnsCount, inheritIndex, insertIndex, targetIndex, this.targets);
575
+ }
576
+ else if (operation instanceof InsertTableRowsModel) {
577
+ this.session.insertTableRows(operation.insertIndex, operation.rowsCount, operation.targetIndex, operation.inheritIndex);
578
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
579
+ const { insertIndex, rowsCount, targetIndex, inheritIndex } = operation;
580
+ command = SaveCommandsHelper.getInsertTableRowsCommand(insertIndex, rowsCount, targetIndex, inheritIndex, this.targets);
581
+ }
582
+ else if (operation instanceof RemoveTableColumnsModel) {
583
+ this.session.removeTableColumns(operation.insertIndex, operation.startIndex, operation.endIndex);
584
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
585
+ const { insertIndex, startIndex, endIndex } = operation;
586
+ command = SaveCommandsHelper.getRemoveTableColumnsCommand(insertIndex, startIndex, endIndex, this.targets);
587
+ }
588
+ else if (operation instanceof RemoveTableRowsModel) {
589
+ this.session.removeTableRows(operation.insertIndex, operation.startIndex, operation.endIndex);
590
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
591
+ const { insertIndex, startIndex, endIndex } = operation;
592
+ command = SaveCommandsHelper.getRemoveTableRowsCommand(insertIndex, startIndex, endIndex, this.targets);
593
+ }
594
+ else if (operation instanceof ResizeTableColumnsModel) {
595
+ this.session.resizeTableColumns(operation);
596
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
597
+ command = SaveCommandsHelper.getResizeTableColumnsCommand(operation, this.targets);
598
+ }
599
+ else if (operation instanceof RestoreTableModel) {
600
+ this.session.restoreTable(operation.insertIndex, operation.oldTable);
601
+ this.changedTableSize(operation.insertIndex, this.session.sessionId);
602
+ command = SaveCommandsHelper.getRestoreTableCommand(operation, this.targets);
603
+ }
604
+ else if (operation instanceof InsertTableModel) {
605
+ this.session.insertTableByDocumentIndex(operation);
606
+ command = SaveCommandsHelper.getInsertTableCommand(operation, this.targets);
607
+ }
608
+ else if (operation instanceof RemoveNumberingsModel) {
609
+ this.session.removeNumberings(operation.startIndex, operation.endIndex);
610
+ const { startIndex, endIndex } = operation;
611
+ command = SaveCommandsHelper.getRemoveNumberingsCommand(startIndex, endIndex, this.targets);
612
+ }
613
+ else if (operation instanceof ReplaceModel) {
614
+ this.session.replace(operation);
615
+ command = SaveCommandsHelper.getReplaceCommand(operation, this.targets);
616
+ }
617
+ else {
618
+ throw new Error('Undo/redo is not implemented for the Operation');
619
+ }
620
+ this.commandsService.createCommand(command);
621
+ this.renderer.updateCursor();
622
+ }
623
+ saveRemoveToHistory(range) {
624
+ const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
625
+ const endIndex = restoreModel.endIndex;
626
+ restoreModel.endIndex = restoreModel.startIndex; // this is to restore in position without deleting/replacing anything in range
627
+ this.history.pushDelete(restoreModel);
628
+ this.commandsService.createCommand(SaveCommandsHelper.getDeleteCommand(restoreModel.startIndex, endIndex, this.targets));
629
+ }
630
+ saveInsertTextToHistory(paragraph, indexInParagraph, text) {
631
+ const index = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraph, indexInParagraph);
632
+ this.history.pushInsertText(index, text);
633
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertTextCommand(text, index, this.targets));
634
+ }
635
+ saveInsertParagraphToHistory(model) {
636
+ this.history.pushInsertParagraph(model, this.session.model.paragraphs);
637
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertParagraphCommand(model, this.targets));
638
+ }
639
+ saveInsertStyledTextToHistory(paragraph, indexInParagraph, text, style) {
640
+ const index = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraph, indexInParagraph);
641
+ this.history.pushInsertStyledText(index, text, style);
642
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertStyledTextCommand(text, index, style, this.targets));
643
+ }
644
+ saveInsertElementToHistory(model) {
645
+ this.history.pushInsertElement(model);
646
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertElementCommand(model, this.targets));
647
+ }
648
+ saveInsertBreakToHistory(model) {
649
+ model.isOnNewParagraph =
650
+ model.breakType === BreakTypes.Page &&
651
+ BreakHelper.getBreakType(this.session.model, CUSTOM_ELEMENT_MARKER, model.insertIndex - 1) !== BreakTypes.Page;
652
+ const endIndex = model.isOnNewParagraph ? model.insertIndex + NEW_LINE_MARKUP.length + 1 : model.insertIndex + 1;
653
+ this.history.pushInsertBreak(model, endIndex);
654
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertBreakCommand(model, this.targets));
655
+ }
656
+ saveInsertTabToHistory(model) {
657
+ this.history.pushInsertTab(model);
658
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertTabCommand(model, this.targets));
659
+ }
660
+ saveInsertImageToHistory(model) {
661
+ this.history.pushInsertImage(model);
662
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertImageCommand(model, this.targets));
663
+ }
664
+ saveInsertLinkToHistory(model) {
665
+ this.history.pushInsertLink(model);
666
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertLinkOperation(model, this.targets));
667
+ }
668
+ saveInsertTableToHistory(model) {
669
+ this.history.pushInsertTable(model);
670
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertTableCommand(model, this.targets));
671
+ }
672
+ saveApplyTextStyleToHistory(startIndex, endIndex, textStyle) {
673
+ const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
674
+ this.history.pushApplyTextStyle(startIndex, endIndex, textStyle, formats);
675
+ this.commandsService.createCommand(SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets));
676
+ }
677
+ saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle) {
678
+ const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
679
+ const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
680
+ this.history.pushApplyParagraphStyle(startIndex, endIndex, paragraphStyle, paragraphsDeepCopy);
681
+ this.commandsService.createCommand(SaveCommandsHelper.getApplyParagraphStyleCommand(startIndex, endIndex, paragraphStyle, this.targets));
682
+ }
683
+ saveApplyElementStyleToHistory(current) {
684
+ const previous = this.session.model.elements.find(x => x.insertIndex === current.insertIndex);
685
+ this.history.pushApplyElementStyle(previous, current);
686
+ this.commandsService.createCommand(SaveCommandsHelper.getApplyElementStyleCommand(current, this.targets));
687
+ }
688
+ saveAddNumberingToHistory(templateLevels, startIndex, endIndex) {
689
+ const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
690
+ const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
691
+ const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
692
+ const numberings = this.session.generalProperties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
693
+ this.history.pushAddNumbering(startIndex, endIndex, templateLevels, paragraphsDeepCopy, numberings);
694
+ this.commandsService.createCommand(SaveCommandsHelper.getAddNumberingCommand(startIndex, endIndex, templateLevels, this.targets));
695
+ }
696
+ saveRemoveNumberingToHistory(startIndex, endIndex) {
697
+ const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
698
+ const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
699
+ const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
700
+ const numberings = this.session.generalProperties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
701
+ this.history.pushRemoveNumberings(startIndex, endIndex, numberings, paragraphsDeepCopy);
702
+ this.commandsService.createCommand(SaveCommandsHelper.getRemoveNumberingsCommand(startIndex, endIndex, this.targets));
703
+ }
704
+ saveApplyImageStyleToHistory(image) {
705
+ const previous = this.session.model.images.find(x => x.insertIndex === image.insertIndex);
706
+ this.history.pushApplyImageStyle(previous, image);
707
+ this.commandsService.createCommand(SaveCommandsHelper.getApplyImageStyleCommand(image.height, image.width, image.insertIndex, this.targets));
708
+ }
709
+ saveReplaceToHistory(range, model) {
710
+ const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
711
+ restoreModel.endIndex = restoreModel.startIndex + (model.insertText?.text.length ?? 1); // this is to restore in range with deleting/replacing content within
712
+ this.history.pushReplace(restoreModel, model);
713
+ this.commandsService.createCommand(SaveCommandsHelper.getReplaceCommand(model, this.targets));
714
+ }
715
+ createRestoreFromSlice(paragraphStart, indexInStart, paragraphEnd, indexInEnd) {
716
+ const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraphStart, indexInStart);
717
+ const endIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, paragraphEnd, indexInEnd) - 1;
718
+ const text = this.session.model.content.slice(startIndex, endIndex + 1);
719
+ const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
720
+ const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex).map(x => new ParagraphModel(x));
721
+ const images = IndexedElementHelper.sliceSection(this.session.model.images, startIndex, endIndex).map(x => new ImageModel(x));
722
+ const tables = IndexedElementHelper.sliceSection(this.session.model.tables, startIndex, endIndex).map(x => new TableModel(x));
723
+ const elements = IndexedElementHelper.sliceSection(this.session.model.elements, startIndex, endIndex).map(x => new ElementModel(x));
724
+ const breaks = IndexedElementHelper.sliceSection(this.session.model.breaks, startIndex, endIndex).map(x => new BreakModel(x));
725
+ const tabs = IndexedElementHelper.sliceSection(this.session.model.tabs, startIndex, endIndex).map(x => new TabModel(x));
726
+ const links = IndexedElementHelper.sliceSection(this.session.model.links, startIndex, endIndex).map(x => new LinkModel(x));
727
+ return new RestoreModel({ startIndex, endIndex, text, formats, paragraphs, images, tables, elements, breaks, tabs, links });
728
+ }
729
+ createCustomElement(data) {
730
+ const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start.row, this.selection.range.start.column);
731
+ const insertElement = new InsertElementModel({ element: new ElementModel({ ...data, insertIndex }) });
732
+ if (!this.selection.isEmpty) {
733
+ this.replaceBy(new ReplaceModel({ insertElement }));
734
+ return;
735
+ }
736
+ this.saveInsertElementToHistory(insertElement);
737
+ const endPoint = this.session.insertElement(this.selection.cursor, data);
738
+ this.onDocumentChange(new Range(this.selection.cursor, endPoint));
739
+ this.onSelectionChange();
740
+ }
741
+ removeSelected() {
742
+ if (this.selection.isEmpty) {
743
+ return;
744
+ }
745
+ this.saveRemoveToHistory(this.selection.range);
746
+ this.session.remove(this.selection.range);
747
+ this.onSelectionChange();
748
+ }
749
+ onInput() {
750
+ const text = this.textInput.getInsertText();
751
+ if (!text) {
752
+ return;
753
+ }
754
+ const isEmptyNumberingParagraph = this.isEmptyNumberingParagraph(this.selection.cursor.row);
755
+ if (text === NEW_LINE_MARKUP && this.selection.isEmpty && isEmptyNumberingParagraph) {
756
+ this.removeNumberingsFromParagraphs();
757
+ }
758
+ else {
759
+ this.insert(text);
760
+ this.scrollCursorIntoMainView();
761
+ }
762
+ }
763
+ onCut(event) {
764
+ event.preventDefault();
765
+ const data = this.getSelectedText();
766
+ if (!data) {
767
+ return;
768
+ }
769
+ this.editorService.setClipboardData(data);
770
+ this.clipboard.copy(data);
771
+ this.cut();
772
+ this.scrollCursorIntoMainView();
773
+ }
774
+ onCopy(event) {
775
+ event.preventDefault();
776
+ const data = this.getSelectedText();
777
+ if (!data) {
778
+ return;
779
+ }
780
+ this.editorService.setClipboardData(data);
781
+ this.clipboard.copy(data);
782
+ }
783
+ onPaste(event) {
784
+ event.preventDefault();
785
+ const data = this.textInput.getClipboardData(event);
786
+ this.pasteData(data);
787
+ }
788
+ initResizeListener() {
789
+ window.addEventListener('resize', this.rerenderResize);
790
+ }
791
+ destroyResizeListener() {
792
+ window.removeEventListener('resize', this.rerenderResize);
793
+ }
794
+ rerenderMarker() {
795
+ this.renderer.loop.schedule({ marker: true });
796
+ }
797
+ onBlur() {
798
+ if (!this.textInput.isFocused) {
799
+ return;
800
+ }
801
+ this.textInput.isFocused = false;
802
+ this.renderer.hideCursor();
803
+ }
804
+ onFocus() {
805
+ if (this.textInput.isFocused) {
806
+ return;
807
+ }
808
+ this.blurCustomComponent();
809
+ this.textInput.isFocused = true;
810
+ this.renderer.showCursor();
811
+ }
812
+ onMouseClick(event) {
813
+ const customElement = this.setCurrentSession(event.clientY, event.target);
814
+ if (customElement && customElement.tagName !== this.tableCellTagName) {
815
+ this.focusCustomComponent(customElement);
816
+ }
817
+ else {
818
+ this.blurCustomComponent();
819
+ }
820
+ }
821
+ onLeftClick(event) {
822
+ const customElement = this.setCurrentSession(event.clientY, event.target);
823
+ if (customElement && customElement.tagName !== this.tableCellTagName) {
824
+ this.focusCustomComponent(customElement);
825
+ return;
826
+ }
827
+ this.blurCustomComponent();
828
+ if (!this.textInput.isFocused) {
829
+ this.textInput.input.focus();
830
+ }
831
+ const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
832
+ if (event.shiftKey) {
833
+ this.selection.moveSelection(position);
834
+ }
835
+ else if (event.ctrlKey) {
836
+ const linkModel = this.session.getLinkModel(position);
837
+ if (linkModel) {
838
+ window.open(linkModel.link);
839
+ event.preventDefault();
840
+ return;
841
+ }
842
+ }
843
+ else {
844
+ this.selection.placeCursor(position);
845
+ }
846
+ this.onSelectionChange();
847
+ event.preventDefault();
848
+ this.mouseHandler.startMousePress(this);
849
+ }
850
+ onDoubleClick(event) {
851
+ let isStartEditEdge = false;
852
+ const customElement = this.getCustomElement(event.target);
853
+ if (customElement) {
854
+ const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
855
+ let clickedPage = null;
856
+ const isParentEdge = this.isParentEdge(customElement);
857
+ if (customElement.tagName === this.edgeElementTagName || (isParentEdge && !this.regulatorService.edgeEditingPage)) {
858
+ clickedPage = this.getClickedPage(event.clientY);
859
+ isStartEditEdge = !this.regulatorService.edgeEditingPage;
860
+ }
861
+ this.regulatorService.setCustomSessionAsCurrent(elementSessionId, clickedPage);
862
+ }
863
+ else {
864
+ this.regulatorService.setMainSessionAsCurrent();
865
+ }
866
+ if (customElement && customElement.tagName !== this.tableCellTagName && customElement.tagName !== this.edgeElementTagName) {
867
+ this.focusCustomComponent(customElement);
868
+ return;
869
+ }
870
+ this.blurCustomComponent();
871
+ event.preventDefault();
872
+ const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
873
+ if (isStartEditEdge) {
874
+ this.selection.placeCursor(position);
875
+ }
876
+ else {
877
+ const range = this.session.getWordRange(position.row, position.column);
878
+ this.selection.placeSelection(range.start, range.end);
879
+ }
880
+ this.onSelectionChange();
881
+ }
882
+ onTripleClick(event) {
883
+ const customElement = this.setCurrentSession(event.clientY, event.target);
884
+ if (customElement && customElement.tagName !== this.tableCellTagName) {
885
+ this.focusCustomComponent(customElement);
886
+ return;
887
+ }
888
+ this.blurCustomComponent();
889
+ event.preventDefault();
890
+ const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
891
+ const start = new CursorParagraph(position.row, 0);
892
+ const end = new CursorParagraph(position.row, this.session.displayData.getParagraphContent(position.row).length);
893
+ this.selection.placeSelection(start, end);
894
+ this.onSelectionChange();
895
+ }
896
+ onQuadClick(event) {
897
+ const customElement = this.setCurrentSession(event.clientY, event.target);
898
+ if (customElement && customElement.tagName !== this.tableCellTagName) {
899
+ this.focusCustomComponent(customElement);
900
+ return;
901
+ }
902
+ this.blurCustomComponent();
903
+ event.preventDefault();
904
+ this.selection.selectAll(this.session.model);
905
+ this.onSelectionChange();
906
+ }
907
+ onMouseWheel(event) {
908
+ if (event.ctrlKey) {
909
+ return;
910
+ }
911
+ const factor = 0.35;
912
+ const scrollSpeed = 4;
913
+ const deltaY = event.deltaY * factor * scrollSpeed;
914
+ this.mainRenderer.scrollBy(deltaY);
915
+ event.stopPropagation();
916
+ event.preventDefault();
917
+ }
918
+ setCurrentSession(clickPositionY, element) {
919
+ const customElement = this.getCustomElement(element);
920
+ if (!customElement) {
921
+ this.regulatorService.setMainSessionAsCurrent();
922
+ }
923
+ else {
924
+ const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
925
+ const isEdgeEditing = this.regulatorService.edgeEditingPage;
926
+ if (customElement.tagName === this.edgeElementTagName) {
927
+ if (isEdgeEditing) {
928
+ const clickedPage = this.getClickedPage(clickPositionY);
929
+ this.regulatorService.setCustomSessionAsCurrent(elementSessionId, clickedPage);
930
+ }
931
+ else {
932
+ this.regulatorService.setMainSessionAsCurrent();
933
+ }
934
+ }
935
+ else {
936
+ const isParentEdge = this.isParentEdge(customElement);
937
+ if (!isParentEdge) {
938
+ this.regulatorService.setCustomSessionAsCurrent(elementSessionId);
939
+ return customElement;
940
+ }
941
+ if (isEdgeEditing) {
942
+ const clickedPage = this.getClickedPage(clickPositionY);
943
+ this.regulatorService.setCustomSessionAsCurrent(elementSessionId, clickedPage);
944
+ return customElement;
945
+ }
946
+ else {
947
+ this.regulatorService.setMainSessionAsCurrent();
948
+ }
949
+ }
950
+ }
951
+ return null;
952
+ }
953
+ getCustomElement(element) {
954
+ if (element.tagName === this.parentTagName) {
955
+ return null;
956
+ }
957
+ else if (this.customElementTagNames.includes(element.tagName)) {
958
+ return element;
959
+ }
960
+ else {
961
+ return this.getCustomElement(element.parentElement);
962
+ }
963
+ }
964
+ isParentEdge(element) {
965
+ if (element.tagName === this.parentTagName) {
966
+ return false;
967
+ }
968
+ else if (element.tagName === this.edgeElementTagName) {
969
+ return true;
970
+ }
971
+ else {
972
+ return this.isParentEdge(element.parentElement);
973
+ }
974
+ }
975
+ getClickedPage(mousePosition) {
976
+ const positionY = mousePosition + this.mainSession.scrollTop - this.mainRenderer.container.getBoundingClientRect().top;
977
+ return PositionHelper.pixelToPage(positionY, this.mainSession);
978
+ }
979
+ /**
980
+ * Returns the string of text currently highlighted.
981
+ */
982
+ getSelectedText() {
983
+ if (this.selection.isEmpty) {
984
+ return '';
985
+ }
986
+ const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.start);
987
+ const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.displayData.paragraphs, this.selection.range.end);
988
+ let elementIndexes = [];
989
+ ContentHelper.setIndexesElementsInInterval(this.session.model.breaks, elementIndexes, startIndex, endIndex);
990
+ ContentHelper.setIndexesElementsInInterval(this.session.model.tables, elementIndexes, startIndex, endIndex);
991
+ ContentHelper.setIndexesElementsInInterval(this.session.model.images, elementIndexes, startIndex, endIndex);
992
+ ContentHelper.setIndexesElementsInInterval(this.session.model.elements, elementIndexes, startIndex, endIndex);
993
+ ContentHelper.setIndexesElementsInInterval(this.session.model.tabs, elementIndexes, startIndex, endIndex);
994
+ elementIndexes.sort((a, b) => b - a);
995
+ let textInterval = this.session.displayData.getTextRange(this.selection.range);
996
+ elementIndexes.forEach(x => {
997
+ textInterval = textInterval.slice(0, x) + textInterval.slice(x + 1);
998
+ });
999
+ return textInterval;
1000
+ }
1001
+ initMainSession() {
1002
+ const pageWidth = this.customPageWidth ?? this.model.pageWidth;
1003
+ this.container.nativeElement.style.maxWidth = `${pageWidth}px`;
1004
+ const scalingRatio = this.customPageWidth ? ScalingHelper.getRatio(this.customPageWidth, this.model.pageWidth) : 1;
1005
+ this.regulatorService.addMainSession(this.model, pageWidth, scalingRatio, this.container);
1006
+ }
1007
+ onSelectionChange() {
1008
+ this.session.applyToolbarStyles();
1009
+ this.renderer.updateSelection(this.selection.range);
1010
+ if (this.selection.isEmpty) {
1011
+ this.renderer.updateCursor();
1012
+ }
1013
+ this.editorService.setHasSelection(!this.selection.isEmpty);
1014
+ this.rerenderMarker();
1015
+ }
1016
+ enableSelection() {
1017
+ if (!this.selection.isDisabled) {
1018
+ return;
1019
+ }
1020
+ const customElement = this.container.nativeElement.querySelector(`[data-session-id="${this.session.sessionId}"]`);
1021
+ if (customElement.tagName === this.tableCellTagName) {
1022
+ const tableSession = this.regulatorService.getSession(this.regulatorService.currentSession.parentSessionId);
1023
+ const table = tableSession.customComponents.tables.find(x => x.instance.sessionId === this.regulatorService.currentSession.parentSessionId);
1024
+ table.instance.tableSelection.clearSelection();
1025
+ }
1026
+ this.selection.enableSelection();
1027
+ this.renderer.cursorLayer.showCursor();
1028
+ }
1029
+ onHotKeyDown(event) {
1030
+ this.editorService.keyDown(event);
1031
+ }
1032
+ onPrint() {
1033
+ PrintHelper.printDocument(this.mainSession, this.editorService);
1034
+ }
1035
+ focusCustomComponent(element) {
1036
+ const index = +element.attributes.getNamedItem('data-insert-index').value;
1037
+ const component = this.session.customComponents.images.find(x => x.instance.insertIndex === index) ??
1038
+ this.session.customComponents.tables.find(x => x.instance.insertIndex === index) ??
1039
+ this.session.customComponents.customElements.find(x => x.instance.insertIndex === index);
1040
+ if (!component || component === this.focusedComponent) {
1041
+ return;
1042
+ }
1043
+ this.focusedComponent?.instance.blur();
1044
+ component.instance.focus();
1045
+ this.focusedComponent = component;
1046
+ const position = this.session.displayData.indexToPosition(index, 0);
1047
+ this.selection.placeCursor(position);
1048
+ this.onSelectionChange();
1049
+ }
1050
+ blurCustomComponent() {
1051
+ if (this.focusedComponent) {
1052
+ this.focusedComponent.instance.blur();
1053
+ this.focusedComponent = null;
1054
+ }
1055
+ }
1056
+ isEmptyNumberingParagraph(paragraphIndex) {
1057
+ const currentLine = this.session.displayData.getParagraphContent(paragraphIndex);
1058
+ return currentLine.length === 0 && this.session.model.paragraphs[paragraphIndex].paragraphStyle.numberingId !== null;
1059
+ }
1060
+ scrollCursorIntoMainView(offset) {
1061
+ if (this.session !== this.mainSession) {
1062
+ return;
1063
+ }
1064
+ this.mainRenderer.scrollCursorIntoView(null, offset);
1065
+ }
1066
+ changedTableSize(insertIndex, sessionId) {
1067
+ const session = this.regulatorService.getSession(sessionId);
1068
+ const paragraph = ContentHelper.documentIndexToParagraphIndex(session.displayData.paragraphs, insertIndex).row;
1069
+ session.displayData.resetAllNumberingInfo(paragraph);
1070
+ session.displayData.updateNextLineIndexes(paragraph, paragraph);
1071
+ session.displayData.updateNumberingsDataOnChange(paragraph + 1);
1072
+ this.focus();
1073
+ }
1074
+ insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, sessionId) {
1075
+ this.regulatorService.setCustomSessionAsCurrent(sessionId);
1076
+ const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1077
+ this.selection.placeCursor(beforeTable);
1078
+ const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1079
+ this.history.pushInsertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, table);
1080
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertTableRowsCommand(rowsCount, inheritIndex, insertIndex, targetIndex, this.targets));
1081
+ this.session.insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex);
1082
+ this.changedTableSize(insertIndex, sessionId);
1083
+ }
1084
+ insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, sessionId) {
1085
+ this.regulatorService.setCustomSessionAsCurrent(sessionId);
1086
+ const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1087
+ this.selection.placeCursor(beforeTable);
1088
+ const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1089
+ this.history.pushInsertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, table);
1090
+ this.commandsService.createCommand(SaveCommandsHelper.getInsertTableColumnsCommand(columnsCount, inheritIndex, insertIndex, targetIndex, this.targets));
1091
+ this.session.insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex);
1092
+ this.changedTableSize(insertIndex, sessionId);
1093
+ }
1094
+ removeTableRows(insertIndex, startIndex, endIndex, sessionId) {
1095
+ this.regulatorService.setCustomSessionAsCurrent(sessionId);
1096
+ const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1097
+ this.selection.placeCursor(beforeTable);
1098
+ const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1099
+ this.history.pushRemoveTableRows(insertIndex, startIndex, endIndex, table);
1100
+ this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableRowsCommand(startIndex, endIndex, insertIndex, this.targets));
1101
+ this.session.removeTableRows(insertIndex, startIndex, endIndex);
1102
+ this.changedTableSize(insertIndex, sessionId);
1103
+ }
1104
+ removeTableColumns(insertIndex, startIndex, endIndex, sessionId) {
1105
+ this.regulatorService.setCustomSessionAsCurrent(sessionId);
1106
+ const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, insertIndex);
1107
+ this.selection.placeCursor(beforeTable);
1108
+ const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1109
+ this.history.pushRemoveTableColumns(insertIndex, startIndex, endIndex, table);
1110
+ this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableColumnsCommand(startIndex, endIndex, insertIndex, this.targets));
1111
+ this.session.removeTableColumns(insertIndex, startIndex, endIndex);
1112
+ this.changedTableSize(insertIndex, sessionId);
1113
+ }
1114
+ removeImage(insertIndex) {
1115
+ const range = this.session.displayData.indexesToRange(insertIndex, insertIndex + 1);
1116
+ this.saveRemoveToHistory(range);
1117
+ this.session.remove(range);
1118
+ this.renderer.updateCursor();
1119
+ this.textInput.input.focus();
1120
+ }
1121
+ resizeTableColumns(resizeTableColumns, sessionId) {
1122
+ this.regulatorService.setCustomSessionAsCurrent(sessionId);
1123
+ const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.displayData.paragraphs, resizeTableColumns.insertIndex);
1124
+ this.selection.placeCursor(beforeTable);
1125
+ this.history.pushResizeTableColumns(resizeTableColumns);
1126
+ this.session.resizeTableColumns(resizeTableColumns);
1127
+ this.changedTableSize(resizeTableColumns.insertIndex, sessionId);
1128
+ }
1129
+ onMousePressedMove(x, y) {
1130
+ const position = this.renderer.screenToTextCoordinates(x, y);
1131
+ const cursor = this.selection.cursor;
1132
+ this.selection.moveSelection(position);
1133
+ if (cursor.column !== this.selection.cursor.column || cursor.row !== this.selection.cursor.row) {
1134
+ this.onSelectionChange();
1135
+ }
1136
+ this.scrollCursorIntoMainView();
1137
+ }
1138
+ searchOptionSubscription() {
1139
+ return this.editorService.searchOptions$.subscribe(searchOptions => {
1140
+ this.find(searchOptions);
1141
+ this.editorService.searchIteration = this.updateCounter();
1142
+ });
1143
+ }
1144
+ replaceSubscription() {
1145
+ return this.editorService.replace$.subscribe(replace => {
1146
+ this.replace(replace.searchValue, replace.replaceValue);
1147
+ this.editorService.searchIteration = this.updateCounter();
1148
+ });
1149
+ }
1150
+ setTextStylesSubscription() {
1151
+ return this.editorService.setTextStyles$.subscribe(textStyles => {
1152
+ this.applyTextStyles(textStyles);
1153
+ this.focus();
1154
+ });
1155
+ }
1156
+ setParagraphStylesSubscription() {
1157
+ return this.editorService.setParagraphStyles$.subscribe(paragraphStyles => {
1158
+ this.applyParagraphStyles(paragraphStyles);
1159
+ this.focus();
1160
+ });
1161
+ }
1162
+ setNumberingTemplateTypeSubscription() {
1163
+ return this.editorService.setNumberingTemplateType$.subscribe(numberingTemplateType => {
1164
+ this.setNumberingTemplate(numberingTemplateType);
1165
+ this.focus();
1166
+ });
1167
+ }
1168
+ removeNumberingsSubscription() {
1169
+ return this.editorService.removeNumberings$.subscribe(() => {
1170
+ this.removeNumberingsFromParagraphs();
1171
+ this.focus();
1172
+ });
1173
+ }
1174
+ setImageStyleSubscription() {
1175
+ return this.editorService.setImageStyle$.subscribe(image => this.applyImageStyles(image));
1176
+ }
1177
+ changeElementStyleSubscription() {
1178
+ return this.editorService.changeElementStyle$.subscribe(x => this.applyElementStyle(x));
1179
+ }
1180
+ createCustomComponentSubscription() {
1181
+ return this.editorService.createCustomComponent$.subscribe(model => {
1182
+ this.createCustomElement(model);
1183
+ this.focus();
1184
+ });
1185
+ }
1186
+ insertBreakSubscription() {
1187
+ return this.editorService.insertBreak$.subscribe(breakType => {
1188
+ this.insertBreak(breakType);
1189
+ this.focus();
1190
+ });
1191
+ }
1192
+ insertImageSubscription() {
1193
+ return this.editorService.insertImage$.subscribe(imageData => {
1194
+ this.insertImage(imageData);
1195
+ this.focus();
1196
+ });
1197
+ }
1198
+ insertLinkSubscription() {
1199
+ return this.editorService.insertLink$.subscribe(linkData => {
1200
+ this.insertLink(linkData);
1201
+ this.focus();
1202
+ });
1203
+ }
1204
+ endMousePressSubscription() {
1205
+ return this.editorService.endMousePress$.subscribe(() => {
1206
+ this.mouseHandler.endMousePress();
1207
+ });
1208
+ }
1209
+ disableSelectionSubscription() {
1210
+ return this.editorService.disableSelection$.subscribe(() => {
1211
+ this.selection.disableSelection();
1212
+ this.onSelectionChange();
1213
+ this.renderer.cursorLayer.hideCursor();
1214
+ });
1215
+ }
1216
+ changedTableSizeSubscription() {
1217
+ return this.editorService.changedTableSize$.subscribe(data => {
1218
+ this.changedTableSize(data.insertIndex, data.sessionId);
1219
+ });
1220
+ }
1221
+ insertTableRowsSubscription() {
1222
+ return this.editorService.insertTableRows$.subscribe(data => {
1223
+ this.insertTableRows(data.insertIndex, data.rowsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1224
+ });
1225
+ }
1226
+ insertTableColumnsSubscription() {
1227
+ return this.editorService.insertTableColumns$.subscribe(data => {
1228
+ this.insertTableColumns(data.insertIndex, data.columnsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1229
+ });
1230
+ }
1231
+ removeTableRowsSubscription() {
1232
+ return this.editorService.removeTableRows$.subscribe(data => {
1233
+ this.removeTableRows(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1234
+ });
1235
+ }
1236
+ removeTableColumnsSubscription() {
1237
+ return this.editorService.removeTableColumns$.subscribe(data => {
1238
+ this.removeTableColumns(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1239
+ });
1240
+ }
1241
+ removedImageSubscription() {
1242
+ return this.editorService.removeImage$.subscribe(data => {
1243
+ this.removeImage(data.insertIndex);
1244
+ });
1245
+ }
1246
+ resizeTableColumnsSubscription() {
1247
+ return this.editorService.resizeTableColumns$.subscribe(data => {
1248
+ this.resizeTableColumns(data.resizeTableColumns, data.sessionId);
1249
+ });
1250
+ }
1251
+ insertTableSubscription() {
1252
+ return this.editorService.insertTable$.subscribe(data => {
1253
+ this.insertTable(data);
1254
+ });
1255
+ }
1256
+ insertTextSubscription() {
1257
+ return this.editorService.insertText$.subscribe(x => {
1258
+ this.blurCustomComponent();
1259
+ this.insert(x);
1260
+ this.focus();
1261
+ });
1262
+ }
1263
+ rendererUpdatedSubscription() {
1264
+ return this.editorService.rendererUpdated$.subscribe(sessionId => {
1265
+ const edgeTarget = this.regulatorService.getEdgeTarget(sessionId);
1266
+ if (edgeTarget !== null) {
1267
+ this.mainRenderer.renderer.textLayer.updateEdgeByLocation(edgeTarget.edgeData.pageType);
1268
+ }
1269
+ });
1270
+ }
1271
+ edgeElementCopyUpdatedSubscription() {
1272
+ return this.editorService.edgeElementCopyUpdated$.subscribe(data => {
1273
+ if (this.regulatorService.edgeEditingPage !== data.page) {
1274
+ return;
1275
+ }
1276
+ const edgeSessionId = +data.newElementCopy.attributes.getNamedItem('data-session-id').value;
1277
+ const edgeSession = this.regulatorService.sessions.find(x => x.sessionId === edgeSessionId);
1278
+ edgeSession.renderer.container = data.newElementCopy.firstChild;
1279
+ });
1280
+ }
1281
+ changedEdgeHeightSubscription() {
1282
+ return this.editorService.changedEdgeHeight$.subscribe(edgeType => {
1283
+ this.mainSession.displayData.updatePageVerticalData(edgeType, this.regulatorService.edgeEditingPage);
1284
+ });
1285
+ }
1286
+ undoSubscription() {
1287
+ return this.editorService.undo$.subscribe(() => {
1288
+ this.undo();
1289
+ this.focus();
1290
+ this.scrollCursorIntoMainView();
1291
+ });
1292
+ }
1293
+ redoSubscription() {
1294
+ return this.editorService.redo$.subscribe(() => {
1295
+ this.redo();
1296
+ this.focus();
1297
+ this.scrollCursorIntoMainView();
1298
+ });
1299
+ }
1300
+ blurCustomComponentSubscription() {
1301
+ return this.editorService.blurCustomComponent$.subscribe(() => this.blurCustomComponent());
1302
+ }
1303
+ printSubscription() {
1304
+ return this.editorService.print$.subscribe(() => this.onPrint());
1305
+ }
1306
+ cutSelectedSubscription() {
1307
+ return this.editorService.cutSelected$.subscribe(() => {
1308
+ this.onCut(new ClipboardEvent('cut'));
1309
+ });
1310
+ }
1311
+ copySelectedSubscription() {
1312
+ return this.editorService.copySelected$.subscribe(() => {
1313
+ this.onCopy(new ClipboardEvent('copy'));
1314
+ });
1315
+ }
1316
+ pasteFromClipboardSubscription() {
1317
+ return this.editorService.pasteFromClipboard$.subscribe(() => {
1318
+ this.readClipboard()
1319
+ .then(data => this.pasteData(data))
1320
+ .catch(() => {
1321
+ // continue regardless error
1322
+ });
1323
+ });
1324
+ }
1325
+ async readClipboard() {
1326
+ const read = await navigator.permissions.query({ name: 'clipboard-read' });
1327
+ return new Promise(resolve => {
1328
+ if (navigator.clipboard && read.state != 'denied') {
1329
+ navigator.clipboard
1330
+ .readText()
1331
+ .then(data => {
1332
+ resolve(data);
1333
+ })
1334
+ .catch(() => {
1335
+ // continue regardless error
1336
+ });
1337
+ }
1338
+ else {
1339
+ resolve(this.clipboardData);
1340
+ }
1341
+ });
1342
+ }
1343
+ pasteData(data) {
1344
+ if (!data) {
1345
+ return;
1346
+ }
1347
+ const text = data.replace(/\r\n/g, '\n').replace(/\t/g, ' ');
1348
+ this.insert(text);
1349
+ this.scrollCursorIntoMainView();
1350
+ }
1351
+ selectAllSubscription() {
1352
+ return this.editorService.selectAll$.subscribe(() => {
1353
+ this.selection.selectAll(this.session.model);
1354
+ this.onSelectionChange();
1355
+ });
1356
+ }
1357
+ removeSelectedSubscription() {
1358
+ return this.editorService.removeSelected$.subscribe(() => {
1359
+ this.removeSelected();
1360
+ });
1361
+ }
1362
+ clipboardDataSubscription() {
1363
+ return this.editorService.clipboardData$.subscribe(data => {
1364
+ this.clipboardData = data;
1365
+ });
1366
+ }
1367
+ updateEdgeSubscription() {
1368
+ return this.editorService.updateEdges$.subscribe(sessionId => {
1369
+ let footers = this.mainSession.customComponents.edges.footersComponents;
1370
+ let existed = this.mainSession.customComponents.edges.headersComponents.findIndex(x => x.instance.sessionId === sessionId);
1371
+ if (existed !== -1) {
1372
+ const headers = this.mainSession.customComponents.edges.headersComponents.slice(existed + 1);
1373
+ headers.forEach(x => {
1374
+ x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
1375
+ });
1376
+ }
1377
+ else {
1378
+ existed = this.mainSession.customComponents.edges.footersComponents.findIndex(x => x.instance.sessionId === sessionId);
1379
+ footers = this.mainSession.customComponents.edges.footersComponents.slice(existed + 1);
1380
+ }
1381
+ footers.forEach(x => {
1382
+ x.instance.session.displayData.updateNextLineIndexes(0, x.instance.session.displayData.paragraphs.length - 1);
1383
+ });
1384
+ });
1385
+ }
1386
+ }
1387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvZWRpdG9yL2V4ZWN1dGlvbi9lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDMUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDdEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDOUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFFcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFHcEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDeEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUtsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDcEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRWhFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3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QUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQztnQkFDdkgsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDMUY7WUFDRCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNoQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2xILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7IENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFkZE51bWJlcmluZ01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9hZGQtbnVtYmVyaW5nLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWVsZW1lbnQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlJbWFnZVN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LWltYWdlLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5UGFyYWdyYXBoU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktcGFyYWdyYXBoLXN0eWxlLm1vZGVsJztcbmltcG9ydCB7IEFwcGx5VGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FwcGx5LXRleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQmFzZU5vZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWsuaGVscGVyJztcbmltcG9ydCB7IEJyZWFrTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2JyZWFrLm1vZGVsJztcbmltcG9ydCB7IEJyZWFrVHlwZXMgfSBmcm9tICcuLi9nYWRnZXRzL3BhZ2UtYnJlYWsvYnJlYWstdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBDb21tYW5kTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2NvbW1hbmQubW9kZWwnO1xuaW1wb3J0IHsgQ29tbWFuZHNTZXJ2aWNlIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9jb21tYW5kcy5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRlbnRIZWxwZXIgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9jb250ZW50LmhlbHBlcic7XG5pbXBvcnQgeyBDb250ZW50U3R5bGVIZWxwZXIgfSBmcm9tICcuLi9jb250ZW50L2hlbHBlcnMvY29udGVudC1zdHlsZS5oZWxwZXInO1xuaW1wb3J0IHsgQ3Vyc29yUGFyYWdyYXBoIH0gZnJvbSAnLi4vcG9zaXRpb25pbmcvY3Vyc29yLXBhcmFncmFwaCc7XG5pbXBvcnQgeyBDVVNUT01fRUxFTUVOVF9NQVJLRVIsIFRBQkxFX01BUktFUiB9IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmVkL2N1c3RvbS1jb250ZW50LW1hcmtlcnMuY29uc3QnO1xuaW1wb3J0IHsgRGVsZXRlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2RlbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyBEb2N1bWVudEhhbmRsZXIgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9kb2N1bWVudC5oYW5kbGVyJztcbmltcG9ydCB7IERvY3hNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvZG9jeC5tb2RlbCc7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWRpdFNlc3Npb24gfSBmcm9tICcuL2VkaXQuc2Vzc2lvbic7XG5pbXBvcnQgeyBFbGVtZW50RGF0YU1vZGVsIH0gZnJvbSAnLi4vY29tcG9uZW50cy9leHRlcm5hbC1lbGVtZW50L21vZGVscy9lbGVtZW50LWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgRWxlbWVudE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9lbGVtZW50Lm1vZGVsJztcbmltcG9ydCB7IEZvcm1hdEhlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9mb3JtYXQuaGVscGVyJztcbmltcG9ydCB7IEltYWdlRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEltYWdlSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2ltYWdlLmhlbHBldCc7XG5pbXBvcnQgeyBJbWFnZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS5tb2RlbCc7XG5pbXBvcnQgeyBJbmRleGVkRWxlbWVudEhlbHBlciB9IGZyb20gJy4uL2NvbnRlbnQvaGVscGVycy9pbmRleGVkLWVsZW1lbnQuaGVscGVyJztcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2lucHV0LmhhbmRsZXInO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydExpbmtNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWxpbmsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0UGFyYWdyYXBoTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC1wYXJhZ3JhcGgubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0U3R5bGVkVGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtc3R5bGVkLXRleHQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZVJvd3NNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYmxlLXJvd3MubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGV4dC5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLm1vZGVsJztcbmltcG9ydCB7IE1vdXNlSGFuZGxlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL21vdXNlLmhhbmRsZXInO1xuaW1wb3J0IHsgTkVXX0xJTkVfTUFSS1VQIH0gZnJvbSAnLi4vY29udGVudC9jb25zdGFudHMvZWRpdG9yLmNvbnN0JztcbmltcG9ydCB7IE51bWJlcmluZ0xldmVsTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy1sZXZlbC5tb2RlbCc7XG5pbXBvcnQgeyBPcGVyYXRpb24gfSBmcm9tICcuLi9nYWRnZXRzL2hpc3Rvcnkvb3BlcmF0aW9uLnR5cGUnO1xuaW1wb3J0IHsgT3BlcmF0aW9uSGlzdG9yeSB9IGZyb20gJy4uL2dhZGdldHMvaGlzdG9yeS9vcGVyYXRpb24taGlzdG9yeSc7XG5pbXBvcnQgeyBQYWdlVHlwZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvZWRnZXMvcGFnZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgUGFyYWdyYXBoTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3BhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgUG9zaXRpb25IZWxwZXIgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9wb3NpdGlvbi5oZWxwZXInO1xuaW1wb3J0IHsgUHJpbnRIZWxwZXIgfSBmcm9tICcuLi9kaXNwbGF5L3ByaW50L3ByaW50LmhlbHBlcic7XG5pbXBvcnQgeyBSYW5nZSB9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL3JhbmdlJztcbmltcG9ydCB7IFJlZ3VsYXRvclNlcnZpY2UgfSBmcm9tICcuL3JlZ3VsYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbW92ZU51bWJlcmluZ3NNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVtb3ZlLW51bWJlcmluZ3MubW9kZWwnO1xuaW1wb3J0IHsgUmVtb3ZlVGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3JlbW92ZS10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IFJlbW92ZVRhYmxlUm93c01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZW1vdmUtdGFibGUtcm93cy5tb2RlbCc7XG5pbXBvcnQgeyBSZW5kZXJlciB9IGZyb20gJy4uL2Rpc3BsYXkvcmVuZGVyZXInO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgUmVzdG9yZU51bWJlcmluZ3NNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS1udW1iZXJpbmdzLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVQYXJhZ3JhcGhTdHlsZXNNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS1wYXJhZ3JhcGgtc3R5bGVzLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXN0b3JlLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVUZXh0U3R5bGVzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUtdGV4dC1zdHlsZXMubW9kZWwnO1xuaW1wb3J0IHsgU2F2ZUNvbW1hbmRzSGVscGVyIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9zYXZlLWNvbW1hbmRzLmhlbHBlcic7XG5pbXBvcnQgeyBTY2FsaW5nSGVscGVyIH0gZnJvbSAnLi4vY29udGVudC9oZWxwZXJzL3NjYWxpbmcuaGVscGVyJztcbmltcG9ydCB7IFNlYXJjaCwgU2VhcmNoT3B0aW9ucyB9IGZyb20gJy4uL2dhZGdldHMvc2VhcmNoL3NlYXJjaCc7XG5pbXBvcnQgeyBTZWFyY2hJdGVyYXRpb24gfSBmcm9tICcuLi9nYWRnZXRzL3NlYXJjaC9zZWFyY2gtaXRlcmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICcuLi9wb3NpdGlvbmluZy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgVGFibGVNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgVGFiTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RhYi5tb2RlbCc7XG5pbXBvcnQgeyBUYXJnZXRNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFyZ2V0Lm1vZGVsJztcbmltcG9ydCB7IFRleHRJbnB1dCB9IGZyb20gJy4uL2ludGVyYWN0aW9uL3RleHQtaW5wdXQnO1xuaW1wb3J0IHsgVGV4dFN0eWxlTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RleHQtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgVmlydHVhbFJlbmRlcmVyIH0gZnJvbSAnLi4vZGlzcGxheS92aXJ0dWFsLnJlbmRlcmVyJztcblxuZXhwb3J0IGNsYXNzIEVkaXRvciB7XG4gICAgcmVhZG9ubHkgTUFYX0NPVU5UID0gOTk5O1xuXG4gICAgcmVhZG9ubHkgcGFyZW50VGFnTmFtZSA9ICdBUFAtTk9ELUVESVRPUic7XG5cbiAgICByZWFkb25seSB0YWJsZUNlbGxUYWdOYW1lID0gJ0FQUC1OT0QtVEFCTEUtQ0VMTCc7XG5cbiAgICByZWFkb25seSBlZGdlRWxlbWVudFRhZ05hbWUgPSAnQVBQLU5PRC1FREdFJztcblxuICAgIHJlYWRvbmx5IGltYWdlVGFnTmFtZSA9ICdBUFAtTk9ELUlNQUdFJztcblxuICAgIHJlYWRvbmx5IGN1c3RvbUVsZW1lbnRUYWdOYW1lczogc3RyaW5nW107XG5cbiAgICByZWFkb25seSBoaXN0b3J5OiBPcGVyYXRpb25IaXN0b3J5O1xuXG4gICAgZ2V0IG1haW5TZXNzaW9uKCk6IEVkaXRTZXNzaW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVndWxhdG9yU2VydmljZS5tYWluU2Vzc2lvbi5zZXNzaW9uO1xuICAgIH1cblxuICAgIGdldCBtYWluUmVuZGVyZXIoKTogVmlydHVhbFJlbmRlcmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVndWxhdG9yU2VydmljZS5tYWluU2Vzc2lvbi5yZW5kZXJlciBhcyBWaXJ0dWFsUmVuZGVyZXI7XG4gICAgfVxuXG4gICAgZ2V0IHNlc3Npb24oKTogRWRpdFNlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmN1cnJlbnRTZXNzaW9uLnNlc3Npb247XG4gICAgfVxuXG4gICAgZ2V0IHJlbmRlcmVyKCk6IFJlbmRlcmVyIHwgVmlydHVhbFJlbmRlcmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVndWxhdG9yU2VydmljZS5jdXJyZW50U2Vzc2lvbi5yZW5kZXJlcjtcbiAgICB9XG5cbiAgICBnZXQgaXNWaWV3T25seSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pc1ZpZXdPbmx5O1xuICAgIH1cblxuICAgIGdldCB0YXJnZXRzKCk6IFRhcmdldE1vZGVsW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmdldEN1cnJlbnRTZXNzaW9uVGFyZ2V0cygpO1xuICAgIH1cblxuICAgIHNlbGVjdGlvbjogU2VsZWN0aW9uO1xuXG4gICAgbW91c2VIYW5kbGVyOiBNb3VzZUhhbmRsZXI7XG5cbiAgICBpbnB1dEhhbmRsZXI6IElucHV0SGFuZGxlcjtcblxuICAgIGRvY3VtZW50SGFuZGxlcjogRG9jdW1lbnRIYW5kbGVyO1xuXG4gICAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIHByaXZhdGUgc2VhcmNoOiBTZWFyY2g7XG5cbiAgICBwcml2YXRlIHRleHRJbnB1dDogVGV4dElucHV0O1xuXG4gICAgcHJpdmF0ZSBmb2N1c2VkQ29tcG9uZW50OiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PjtcblxuICAgIHByaXZhdGUgY2xpcGJvYXJkRGF0YTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbW9kZWw6IERvY3hNb2RlbCxcbiAgICAgICAgcHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVndWxhdG9yU2VydmljZTogUmVndWxhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb21tYW5kc1NlcnZpY2U6IENvbW1hbmRzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmQ6IENsaXBib2FyZCxcbiAgICAgICAgcHJpdmF0ZSBleHRlcm5hbEVsZW1lbnRUYWdOYW1lczogc3RyaW5nW10sXG4gICAgICAgIHByaXZhdGUgY3VzdG9tUGFnZVdpZHRoPzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudFRhZ05hbWVzID0gWy4uLnRoaXMuZXh0ZXJuYWxFbGVtZW50VGFnTmFtZXMsIHRoaXMuaW1hZ2VUYWdOYW1lLCB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUsIHRoaXMuZWRnZUVsZW1lbnRUYWdOYW1lXTtcbiAgICAgICAgdGhpcy5oaXN0b3J5ID0gbmV3IE9wZXJhdGlvbkhpc3RvcnkoZWRpdG9yU2VydmljZSwgcmVndWxhdG9yU2VydmljZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0U2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uKTtcbiAgICAgICAgdGhpcy5pbml0TWFpblNlc3Npb24oKTtcbiAgICAgICAgdGhpcy50ZXh0SW5wdXQgPSBuZXcgVGV4dElucHV0KHRoaXMubWFpblJlbmRlcmVyLmNvbnRhaW5lcik7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnRleHRhcmVhID0gdGhpcy50ZXh0SW5wdXQuaW5wdXQ7XG4gICAgICAgIHRoaXMubW91c2VIYW5kbGVyID0gbmV3IE1vdXNlSGFuZGxlcih0aGlzLm1haW5SZW5kZXJlci5jb250YWluZXIsIHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlciA9IG5ldyBJbnB1dEhhbmRsZXIodGhpcy50ZXh0SW5wdXQuaW5wdXQsIHRoaXMpO1xuICAgICAgICB0aGlzLmRvY3VtZW50SGFuZGxlciA9IG5ldyBEb2N1bWVudEhhbmRsZXIodGhpcyk7XG4gICAgICAgIHRoaXMuaW5pdFJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuXG4gICAgICAgIHRoaXMuc2VhcmNoID0gbmV3IFNlYXJjaCgpO1xuICAgICAgICB0aGlzLnNlYXJjaC5zZXQoeyB3cmFwOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoT3B0aW9uU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dFN0eWxlc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhZ3JhcGhTdHlsZXNTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRWxlbWVudFN0eWxlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNldE51bWJlcmluZ1RlbXBsYXRlVHlwZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVOdW1iZXJpbmdzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNldEltYWdlU3R5bGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tQ29tcG9uZW50U3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmluc2VydEJyZWFrU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmluc2VydEltYWdlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmluc2VydExpbmtTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGV4dFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5lbmRNb3VzZVByZXNzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVTZWxlY3Rpb25TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZVJvd3NTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVDb2x1bW5zU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRhYmxlUm93c1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlZEltYWdlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlclVwZGF0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuZWRnZUVsZW1lbnRDb3B5VXBkYXRlZFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkRWRnZUhlaWdodFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy51bmRvU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlZG9TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkRGF0YVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jdXRTZWxlY3RlZFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jb3B5U2VsZWN0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFsbFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5wcmludFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy51cGRhdGVFZGdlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnRTdWJzY3JpcHRpb24oKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZGVzdHJveVJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMubW91c2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRvY3VtZW50SGFuZGxlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuYmx1ckN1c3RvbUNvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHNlbGVjdFBhZ2VEb3duKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm1haW5SZW5kZXJlci5sYXllckNvbmZpZztcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbmZpZy52aXNpYmxlUmFuZ2UuZW5kU2NyZWVuTGluZTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBQb3NpdGlvbkhlbHBlci5zY3JlZW5Ub0RvY3VtZW50KHRoaXMubWFpblNlc3Npb24sIGxpbmUsIDApO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlU2VsZWN0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQnkoY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQYWdlVXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubWFpblJlbmRlcmVyLmxheWVyQ29uZmlnO1xuICAgICAgICBjb25zdCBsaW5lID0gY29uZmlnLnZpc2libGVSYW5nZS5zdGFydFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEJ5KC1jb25maWcuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC41KTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGdvdG9QYWdlRG93bigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5tYWluUmVuZGVyZXIubGF5ZXJDb25maWc7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb25maWcudmlzaWJsZVJhbmdlLmVuZFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeShjb25maWcuaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC41KTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGdvdG9QYWdlVXAoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubWFpblJlbmRlcmVyLmxheWVyQ29uZmlnO1xuICAgICAgICBjb25zdCBsaW5lID0gY29uZmlnLnZpc2libGVSYW5nZS5zdGFydFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeSgtY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBjdXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBpbnNlcnQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0U3R5bGUgPSBDb250ZW50U3R5bGVIZWxwZXIuY29tYmluZVRleHRTdHlsZXMobnVsbCwgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyBhcyBUZXh0U3R5bGVNb2RlbCk7XG4gICAgICAgICAgICB0aGlzLmluc2VydFRleHQodGV4dCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFRleHQgPSBuZXcgSW5zZXJ0VGV4dE1vZGVsKHsgaW5zZXJ0SW5kZXgsIHRleHQgfSk7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGV4dCB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0KHRleHQ6IHN0cmluZywgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvcjtcbiAgICAgICAgaWYgKHRleHRTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlSW5zZXJ0U3R5bGVkVGV4dFRvSGlzdG9yeShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbiwgdGV4dCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUluc2VydFRleHRUb0hpc3RvcnkocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4sIHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTGVmdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExlZnQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlUmlnaHQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RSaWdodCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRCcmVhayhicmVha1R5cGU6IEJyZWFrVHlwZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluc2VydEJyZWFrID0gbmV3IEluc2VydEJyZWFrTW9kZWwoeyBpbnNlcnRJbmRleCwgYnJlYWtUeXBlIH0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUJ5KG5ldyBSZXBsYWNlTW9kZWwoeyBpbnNlcnRCcmVhayB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnJlYWtUeXBlID09PSBCcmVha1R5cGVzLkNvbHVtbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlSW5zZXJ0QnJlYWtUb0hpc3RvcnkoaW5zZXJ0QnJlYWspO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRCcmVhayh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGJyZWFrVHlwZSk7XG4gICAgICAgIGxldCBsYXN0Um93ID0gdGhpcy5zZWxlY3Rpb24uY3Vyc29yLnJvdyA9PT0gZW5kUG9pbnQucm93ID8gZW5kUG9pbnQucm93IDogSW5maW5pdHk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlTGluZXModGhpcy5zZWxlY3Rpb24uY3Vyc29yLnJvdywgbGFzdFJvdyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgICAgIHRoaXMucmVyZW5kZXJNYXJrZXIoKTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoMC4xKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWIoKSB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRUYWIgPSBuZXcgSW5zZXJ0VGFiTW9kZWwoeyBpbnNlcnRJbmRleCB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFiIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydFRhYlRvSGlzdG9yeShpbnNlcnRUYWIpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWIodGhpcy5zZWxlY3Rpb24uY3Vyc29yKTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50Q2hhbmdlKG5ldyBSYW5nZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGVuZFBvaW50KSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZShpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFkanVzdGVkSW1hZ2UgPSBJbWFnZUhlbHBlci5nZXRJbWFnZVdpdGhBbGxvd2VkU2l6ZShpbWFnZURhdGEsIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5jb250ZW50V2lkdGgpO1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5jb2x1bW5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW1hZ2UgPSBuZXcgSW5zZXJ0SW1hZ2VNb2RlbCh7IGluc2VydEluZGV4LCBpbWFnZURhdGE6IGFkanVzdGVkSW1hZ2UgfSk7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQnkobmV3IFJlcGxhY2VNb2RlbCh7IGluc2VydEltYWdlIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydEltYWdlVG9IaXN0b3J5KGluc2VydEltYWdlKTtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLnNlc3Npb24uaW5zZXJ0SW1hZ2UodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBhZGp1c3RlZEltYWdlKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIGluc2VydExpbmsobGlua0RhdGFNb2RlbDogTGlua0RhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5jb2x1bW5cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgaW5zZXJ0TGluayA9IG5ldyBJbnNlcnRMaW5rTW9kZWwoeyBpbnNlcnRJbmRleCwgZW5kSW5kZXg6IGluc2VydEluZGV4ICsgbGlua0RhdGFNb2RlbC50ZXh0Lmxlbmd0aCwgbGlua0RhdGFNb2RlbCB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0TGluayB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVJbnNlcnRMaW5rVG9IaXN0b3J5KGluc2VydExpbmspO1xuICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0TGluayh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGxpbmtEYXRhTW9kZWwpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGUodGFibGVEYXRhOiB7IHJvd3M6IG51bWJlcjsgY29sdW1uczogbnVtYmVyIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5zZXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleChcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0VGFibGUgPSBuZXcgSW5zZXJ0VGFibGVNb2RlbCh7XG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGluc2VydFRhYmxlSW5kZXg6IGluc2VydEluZGV4LFxuICAgICAgICAgICAgcm93c0NvdW50OiB0YWJsZURhdGEucm93cyxcbiAgICAgICAgICAgIGNvbHVtbnNDb3VudDogdGFibGVEYXRhLmNvbHVtbnMsXG4gICAgICAgICAgICBjb250ZW50OiBUQUJMRV9NQVJLRVJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHNbdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93XS5wYXJhZ3JhcGhTZXR0aW5ncy5udW1iZXJpbmdEYXRhLm51bWJlcmluZ0lkIHx8XG4gICAgICAgICAgICAhdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMuc29tZSh4ID0+IHguc3RhcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpIHx8XG4gICAgICAgICAgICAhdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmlzTmV3TGluZVN5bWJvbChpbnNlcnRJbmRleClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydFRhYmxlSW5OZXdQYXJhZ3JhcGgoaW5zZXJ0VGFibGUsIGluc2VydEluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVJbkN1cnJlbnRQYXJhZ3JhcGgoaW5zZXJ0VGFibGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVJbk5ld1BhcmFncmFwaChpbnNlcnRUYWJsZTogSW5zZXJ0VGFibGVNb2RlbCwgaW5zZXJ0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRQYXJhZ3JhcGggPSBuZXcgSW5zZXJ0UGFyYWdyYXBoTW9kZWwoeyBpbnNlcnRJbmRleCwgaW5zZXJ0VGFibGUgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0UGFyYWdyYXBoIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydFBhcmFncmFwaFRvSGlzdG9yeShpbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRQYXJhZ3JhcGgodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBpbnNlcnRQYXJhZ3JhcGgpO1xuICAgICAgICBsZXQgbGFzdFJvdyA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3cgPT09IGVuZFBvaW50LnJvdyA/IGVuZFBvaW50LnJvdyA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3csIGxhc3RSb3cpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVJbkN1cnJlbnRQYXJhZ3JhcGgoaW5zZXJ0VGFibGU6IEluc2VydFRhYmxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFibGUgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlSW5zZXJ0VGFibGVUb0hpc3RvcnkoaW5zZXJ0VGFibGUpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGluc2VydFRhYmxlKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIHJlcGxhY2VCeShtb2RlbDogUmVwbGFjZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcnRJbmRleGVzID0gQ29udGVudEhlbHBlci5nZXRTZWxlY3RlZFBhcnREb2N1bWVudEluZGV4ZXModGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgbW9kZWwuZGVsZXRlID0gbmV3IERlbGV0ZU1vZGVsKHsgc3RhcnRJbmRleDogcGFydEluZGV4ZXMuc3RhcnRJbmRleCwgZW5kSW5kZXg6IHBhcnRJbmRleGVzLmVuZEluZGV4IH0pO1xuICAgICAgICB0aGlzLnNhdmVSZXBsYWNlVG9IaXN0b3J5KHRoaXMuc2VsZWN0aW9uLnJhbmdlLCBtb2RlbCk7XG4gICAgICAgIGNvbnN0IGVuZFBvc2l0aW9uID0gdGhpcy5zZXNzaW9uLnJlcGxhY2UobW9kZWwpO1xuICAgICAgICB0aGlzLm9uRG9jdW1lbnRDaGFuZ2UobmV3IFJhbmdlKHRoaXMuc2VsZWN0aW9uLmN1cnNvciwgZW5kUG9zaXRpb24pKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRvTGluZVN0YXJ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZVN0YXJ0KHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHJlbW92ZVRvTGluZUVuZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlV29yZExlZnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkTGVmdCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICByZW1vdmVXb3JkUmlnaHQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkUmlnaHQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGVCb2xkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGx5VGV4dFN0eWxlcyhuZXcgVGV4dFN0eWxlTW9kZWwoeyBib2xkOiAhdGhpcy5zZXNzaW9uLmVkaXRvclNlcnZpY2Uuc3R5bGVzLmJvbGQgfSkpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlSXRhbGljKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFwcGx5VGV4dFN0eWxlcyhuZXcgVGV4dFN0eWxlTW9kZWwoeyBpdGFsaWM6ICF0aGlzLnNlc3Npb24uZWRpdG9yU2VydmljZS5zdHlsZXMuaXRhbGljIH0pKTtcbiAgICB9XG5cbiAgICBhcHBseVRleHRTdHlsZVVuZGVybGluZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hcHBseVRleHRTdHlsZXMobmV3IFRleHRTdHlsZU1vZGVsKHsgdW5kZXJsaW5lOiAhdGhpcy5zZXNzaW9uLmVkaXRvclNlcnZpY2Uuc3R5bGVzLnVuZGVybGluZSB9KSk7XG4gICAgfVxuXG4gICAgYXBwbHlUZXh0U3R5bGVzKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgY29uc3QgcGFydEluZGV4ZXMgPSBDb250ZW50SGVscGVyLmdldFNlbGVjdGVkUGFydERvY3VtZW50SW5kZXhlcyh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgdGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICAgICAgdGhpcy5zYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3RvcnkocGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlUZXh0U3R5bGUocGFydEluZGV4ZXMuc3RhcnRJbmRleCwgcGFydEluZGV4ZXMuZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFRleHRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5jdXJzb3IpO1xuICAgICAgICBjb25zdCBpc1BhcmFncmFwaCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5jb250ZW50TGVuZ3RoID09PSBpbmRleCB8fCB0aGlzLnNlc3Npb24ubW9kZWwuY29udGVudFtpbmRleF0gPT09IE5FV19MSU5FX01BUktVUDtcbiAgICAgICAgaWYgKGlzUGFyYWdyYXBoKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVBcHBseVRleHRTdHlsZVRvSGlzdG9yeShpbmRleCwgaW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlUZXh0U3R5bGUoaW5kZXgsIGluZGV4LCB0ZXh0U3R5bGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFRleHRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgYXBwbHlQYXJhZ3JhcGhTdHlsZXMocGFyYWdyYXBoU3R5bGU6IFBhcmFncmFwaFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5yYW5nZTtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLnN0YXJ0LnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2UuZW5kLnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIHRoaXMuc2F2ZUFwcGx5UGFyYWdyYXBoU3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5UGFyYWdyYXBoU3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlKTtcbiAgICB9XG5cbiAgICBhcHBseUVsZW1lbnRTdHlsZShjdXJyZW50OiBFbGVtZW50TW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlQXBwbHlFbGVtZW50U3R5bGVUb0hpc3RvcnkoY3VycmVudCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseUVsZW1lbnRTdHlsZShuZXcgQXBwbHlFbGVtZW50U3R5bGVNb2RlbChjdXJyZW50KSk7XG4gICAgfVxuXG4gICAgc2V0TnVtYmVyaW5nVGVtcGxhdGUodGVtcGxhdGVMZXZlbHM6IE51bWJlcmluZ0xldmVsTW9kZWxbXSk6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2Uuc3RhcnQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5lbmQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgdGhpcy5zYXZlQWRkTnVtYmVyaW5nVG9IaXN0b3J5KHRlbXBsYXRlTGV2ZWxzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5hZGROdW1iZXJpbmcodGVtcGxhdGVMZXZlbHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICB9XG5cbiAgICByZW1vdmVOdW1iZXJpbmdzRnJvbVBhcmFncmFwaHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zZWxlY3Rpb24ucmFuZ2U7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5zdGFydC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLmVuZC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICB0aGlzLnNhdmVSZW1vdmVOdW1iZXJpbmdUb0hpc3Rvcnkoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlTnVtYmVyaW5ncyhzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgYXBwbHlJbWFnZVN0eWxlcyhpbWFnZTogSW1hZ2VNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNhdmVBcHBseUltYWdlU3R5bGVUb0hpc3RvcnkoaW1hZ2UpO1xuICAgICAgICBjb25zdCBpbWFnZVN0eWxlID0gbmV3IEFwcGx5SW1hZ2VTdHlsZU1vZGVsKHsgaW5zZXJ0SW5kZXg6IGltYWdlLmluc2VydEluZGV4LCBoZWlnaHQ6IGltYWdlLmhlaWdodCwgd2lkdGg6IGltYWdlLndpZHRoIH0pO1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlJbWFnZVN0eWxlKGltYWdlU3R5bGUpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgIH1cblxuICAgIGZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRleHRJbnB1dC5pbnB1dC5mb2N1cygpO1xuICAgIH1cblxuICAgIG9wZW5TZWFyY2goKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5vcGVuU2VhcmNoRGlhbG9nID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBmaW5kKG9wdGlvbnM6IFNlYXJjaE9wdGlvbnMpOiBSYW5nZSB7XG4gICAgICAgIGxldCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICBpZiAob3B0aW9ucy50ZXJtID09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0ZXJtID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFRleHRSYW5nZShyYW5nZSkgfHwgdGhpcy5zZWFyY2gub3B0aW9ucy50ZXJtO1xuICAgICAgICAgICAgaWYgKCF0ZXJtKSB7XG4gICAgICAgICAgICAgICAgcmFuZ2UgPSB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uKTtcbiAgICAgICAgICAgICAgICB0ZXJtID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLmdldFRleHRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zLnRlcm0gPSB0ZXJtO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnN0YXJ0KSB7XG4gICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0gcmFuZ2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlYXJjaC5zZXQob3B0aW9ucyk7XG5cbiAgICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLnNlYXJjaC5maW5kKHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIGlmIChuZXdSYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VTZWxlY3Rpb24ocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uID09PSB0aGlzLm1haW5TZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCwgMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXdSYW5nZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJhbmdlLmVuZCA9IHJhbmdlLnN0YXJ0O1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihyYW5nZS5zdGFydCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdXBkYXRlQ291bnRlcigpOiBTZWFyY2hJdGVyYXRpb24ge1xuICAgICAgICBjb25zdCByZWdleCA9IHRoaXMuc2VhcmNoLm9wdGlvbnMucmVnZXggYXMgUmVnRXhwO1xuICAgICAgICBsZXQgYWxsID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSAwO1xuICAgICAgICBpZiAoIXJlZ2V4KSB7XG4gICAgICAgICAgICByZXR1cm4geyBjdXJyZW50OiAwLCB0b3RhbDogMCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuZ2V0QWxsUGFyYWdyYXBoc0NvbnRlbnQoKS5qb2luKCdcXG4nKTtcblxuICAgICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBvc2l0aW9uVG9JbmRleCh0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG5cbiAgICAgICAgcmVnZXgubGFzdEluZGV4ID0gMDtcbiAgICAgICAgbGV0IHJlZ2V4UmVzdWx0O1xuICAgICAgICB3aGlsZSAoKHJlZ2V4UmVzdWx0ID0gcmVnZXguZXhlYyh2YWx1ZSkpKSB7XG4gICAgICAgICAgICBhbGwrKztcbiAgICAgICAgICAgIGxldCBsYXN0ID0gcmVnZXhSZXN1bHQuaW5kZXg7XG4gICAgICAgICAgICBpZiAobGFzdCA8PSBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWxsID4gdGhpcy5NQVhfQ09VTlQpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGN1cnJlbnQ6IGN1cnJlbnQsIHRvdGFsOiBhbGwgPiB0aGlzLk1BWF9DT1VOVCA/IHRoaXMuTUFYX0NPVU5UIDogYWxsIH07XG4gICAgfVxuXG4gICAgcmVwbGFjZShzZWFyY2g6IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2VhcmNoICE9PSByZXBsYWNlKSB7XG4gICAgICAgICAgICBpZiAocmVwbGFjZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydC5yb3csXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5zZXJ0VGV4dCA9IG5ldyBJbnNlcnRUZXh0TW9kZWwoeyBpbnNlcnRJbmRleCwgdGV4dDogcmVwbGFjZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGV4dCB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmluZCh7IHRlcm06IHNlYXJjaCwgc2tpcEN1cnJlbnQ6IHRydWUsIGJhY2t3YXJkczogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdW5kbygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdW5kbyA9IHRoaXMuaGlzdG9yeS5wb3BVbmRvT3BlcmF0aW9uKCk7XG4gICAgICAgIGlmICghdW5kbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRUYXJnZXRlZFNlc3Npb25Bc0N1cnJlbnQodW5kby50YXJnZXRzKTtcbiAgICAgICAgdGhpcy5hcHBseU9wZXJhdGlvbih1bmRvLm9wZXJhdGlvbik7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlU2VsZWN0aW9uKHVuZG8uY3Vyc29yLCB1bmRvLmFuY2hvcik7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZWRvKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZWRvID0gdGhpcy5oaXN0b3J5LnBvcFJlZG9PcGVyYXRpb24oKTtcbiAgICAgICAgaWYgKCFyZWRvKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldFRhcmdldGVkU2Vzc2lvbkFzQ3VycmVudChyZWRvLnRhcmdldHMpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbihyZWRvLmN1cnNvciwgcmVkby5hbmNob3IpO1xuICAgICAgICB0aGlzLmFwcGx5T3BlcmF0aW9uKHJlZG8ub3BlcmF0aW9uKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIGFwcGx5T3BlcmF0aW9uKG9wZXJhdGlvbjogT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgICAgIGxldCBjb21tYW5kOiBDb21tYW5kTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRleHRNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24udGV4dCwgbnVsbCk7XG4gICAgICAgICAgICBjb25zdCB7IHRleHQsIGluc2VydEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRleHRDb21tYW5kKHRleHQsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFBhcmFncmFwaE1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0UGFyYWdyYXBoQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFBhcmFncmFwaENvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIERlbGV0ZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlQnlEb2N1bWVudEluZGV4ZXMob3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldERlbGV0ZUNvbW1hbmQob3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRTdHlsZWRUZXh0TW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUZXh0QnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLnRleHQsIG5ldyBUZXh0U3R5bGVNb2RlbChvcGVyYXRpb24udGV4dFN0eWxlKSk7XG4gICAgICAgICAgICBjb25zdCB7IHRleHQsIGluc2VydEluZGV4LCB0ZXh0U3R5bGUgfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0U3R5bGVkVGV4dENvbW1hbmQodGV4dCwgaW5zZXJ0SW5kZXgsIHRleHRTdHlsZSwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZShkZWVwQ29weSk7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlc3RvcmVDb21tYW5kKGRlZXBDb3B5LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFwcGx5VGV4dFN0eWxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseVRleHRTdHlsZShvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4LCBuZXcgVGV4dFN0eWxlTW9kZWwob3BlcmF0aW9uLnRleHRTdHlsZSkpO1xuICAgICAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCwgdGV4dFN0eWxlIH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5VGV4dFN0eWxlQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgdGV4dFN0eWxlLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFwcGx5UGFyYWdyYXBoU3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgY29weSA9IG5ldyBQYXJhZ3JhcGhTdHlsZU1vZGVsKG9wZXJhdGlvbi5wYXJhZ3JhcGhTdHlsZSk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlQYXJhZ3JhcGhTdHlsZShvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4LCBjb3B5KTtcbiAgICAgICAgICAgIGNvbnN0IHsgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlIH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5UGFyYWdyYXBoU3R5bGVDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBwYXJhZ3JhcGhTdHlsZSwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlVGV4dFN0eWxlc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBkZWVwQ29weSA9IHN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlc3RvcmVUZXh0U3R5bGVzKGRlZXBDb3B5LmZvcm1hdHMpO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXN0b3JlVGV4dFN0eWxlc0NvbW1hbmQoZGVlcENvcHkuZm9ybWF0cywgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlUGFyYWdyYXBoU3R5bGVzTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZVBhcmFncmFwaFN0eWxlcyhkZWVwQ29weS5wYXJhZ3JhcGhzKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZVBhcmFncmFwaFN0eWxlc0NvbW1hbmQoZGVlcENvcHkucGFyYWdyYXBocywgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRFbGVtZW50TW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydEVsZW1lbnRDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRCcmVha01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0QnJlYWtCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0QnJlYWtDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBBcHBseUVsZW1lbnRTdHlsZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlFbGVtZW50U3R5bGUob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlFbGVtZW50U3R5bGVDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRUYWJNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYkJ5RG9jdW1lbnRJbmRleChvcGVyYXRpb24pO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRJbWFnZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0SW1hZ2VDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBBcHBseUltYWdlU3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5SW1hZ2VTdHlsZShvcGVyYXRpb24pO1xuICAgICAgICAgICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoLCBpbnNlcnRJbmRleCB9ID0gb3BlcmF0aW9uO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRBcHBseUltYWdlU3R5bGVDb21tYW5kKGhlaWdodCwgd2lkdGgsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFkZE51bWJlcmluZ01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYWRkTnVtYmVyaW5nKG9wZXJhdGlvbi5sZXZlbHMsIG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgeyBzdGFydEluZGV4LCBlbmRJbmRleCwgbGV2ZWxzIH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFkZE51bWJlcmluZ0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGxldmVscywgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlTnVtYmVyaW5nc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZU51bWJlcmluZ3Mob3BlcmF0aW9uLnBhcmFncmFwaHMsIG9wZXJhdGlvbi5udW1iZXJpbmdzKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZU51bWJlcmluZ3NDb21tYW5kKG9wZXJhdGlvbiwgdGhpcy50YXJnZXRzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRUYWJsZUNvbHVtbnNNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlQ29sdW1ucyhvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi5jb2x1bW5zQ291bnQsIG9wZXJhdGlvbi50YXJnZXRJbmRleCwgb3BlcmF0aW9uLmluaGVyaXRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgY29sdW1uc0NvdW50LCBpbmhlcml0SW5kZXgsIGluc2VydEluZGV4LCB0YXJnZXRJbmRleCB9ID0gb3BlcmF0aW9uO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJsZUNvbHVtbnNDb21tYW5kKGNvbHVtbnNDb3VudCwgaW5oZXJpdEluZGV4LCBpbnNlcnRJbmRleCwgdGFyZ2V0SW5kZXgsIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0VGFibGVSb3dzTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZVJvd3Mob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24ucm93c0NvdW50LCBvcGVyYXRpb24udGFyZ2V0SW5kZXgsIG9wZXJhdGlvbi5pbmhlcml0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgdGhpcy5zZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgICAgICBjb25zdCB7IGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXggfSA9IG9wZXJhdGlvbjtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGFibGVSb3dzQ29tbWFuZChpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlbW92ZVRhYmxlQ29sdW1uc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlVGFibGVDb2x1bW5zKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZVRhYmxlQ29sdW1uc0NvbW1hbmQoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlbW92ZVRhYmxlUm93c01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlVGFibGVSb3dzKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZVRhYmxlUm93c0NvbW1hbmQoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzaXplVGFibGVDb2x1bW5zKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzaXplVGFibGVDb2x1bW5zQ29tbWFuZChvcGVyYXRpb24sIHRoaXMudGFyZ2V0cyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVzdG9yZVRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXN0b3JlVGFibGUob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24ub2xkVGFibGUpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgdGhpcy5zZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlc3RvcmVUYWJsZUNvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZUJ5RG9jdW1lbnRJbmRleChvcGVyYXRpb24pO1xuICAgICAgICAgICAgY29tbWFuZCA9IFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJsZUNvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlbW92ZU51bWJlcmluZ3NNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZU51bWJlcmluZ3Mob3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCB7IHN0YXJ0SW5kZXgsIGVuZEluZGV4IH0gPSBvcGVyYXRpb247XG4gICAgICAgICAgICBjb21tYW5kID0gU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZU51bWJlcmluZ3NDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlcGxhY2VNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlcGxhY2Uob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVwbGFjZUNvbW1hbmQob3BlcmF0aW9uLCB0aGlzLnRhcmdldHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmRvL3JlZG8gaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGUgT3BlcmF0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChjb21tYW5kKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBzYXZlUmVtb3ZlVG9IaXN0b3J5KHJhbmdlOiBSYW5nZSk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXN0b3JlTW9kZWwgPSB0aGlzLmNyZWF0ZVJlc3RvcmVGcm9tU2xpY2UocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4sIHJhbmdlLmVuZC5yb3csIHJhbmdlLmVuZC5jb2x1bW4pO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHJlc3RvcmVNb2RlbC5lbmRJbmRleDtcbiAgICAgICAgcmVzdG9yZU1vZGVsLmVuZEluZGV4ID0gcmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXg7IC8vIHRoaXMgaXMgdG8gcmVzdG9yZSBpbiBwb3NpdGlvbiB3aXRob3V0IGRlbGV0aW5nL3JlcGxhY2luZyBhbnl0aGluZyBpbiByYW5nZVxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaERlbGV0ZShyZXN0b3JlTW9kZWwpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXREZWxldGVDb21tYW5kKHJlc3RvcmVNb2RlbC5zdGFydEluZGV4LCBlbmRJbmRleCwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUluc2VydFRleHRUb0hpc3RvcnkocGFyYWdyYXBoOiBudW1iZXIsIGluZGV4SW5QYXJhZ3JhcGg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBhcmFncmFwaCwgaW5kZXhJblBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0VGV4dChpbmRleCwgdGV4dCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRleHRDb21tYW5kKHRleHQsIGluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0UGFyYWdyYXBoVG9IaXN0b3J5KG1vZGVsOiBJbnNlcnRQYXJhZ3JhcGhNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFBhcmFncmFwaChtb2RlbCwgdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRQYXJhZ3JhcGhDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0U3R5bGVkVGV4dFRvSGlzdG9yeShwYXJhZ3JhcGg6IG51bWJlciwgaW5kZXhJblBhcmFncmFwaDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcsIHN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwYXJhZ3JhcGgsIGluZGV4SW5QYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFN0eWxlZFRleHQoaW5kZXgsIHRleHQsIHN0eWxlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0U3R5bGVkVGV4dENvbW1hbmQodGV4dCwgaW5kZXgsIHN0eWxlLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0RWxlbWVudFRvSGlzdG9yeShtb2RlbDogSW5zZXJ0RWxlbWVudE1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0RWxlbWVudChtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydEVsZW1lbnRDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0QnJlYWtUb0hpc3RvcnkobW9kZWw6IEluc2VydEJyZWFrTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgbW9kZWwuaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBtb2RlbC5icmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMuc2Vzc2lvbi5tb2RlbCwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSLCBtb2RlbC5pbnNlcnRJbmRleCAtIDEpICE9PSBCcmVha1R5cGVzLlBhZ2U7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gbW9kZWwuaXNPbk5ld1BhcmFncmFwaCA/IG1vZGVsLmluc2VydEluZGV4ICsgTkVXX0xJTkVfTUFSS1VQLmxlbmd0aCArIDEgOiBtb2RlbC5pbnNlcnRJbmRleCArIDE7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0QnJlYWsobW9kZWwsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0QnJlYWtDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0VGFiVG9IaXN0b3J5KG1vZGVsOiBJbnNlcnRUYWJNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYihtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYkNvbW1hbmQobW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRJbWFnZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0SW1hZ2VNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydEltYWdlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0SW1hZ2VDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0TGlua1RvSGlzdG9yeShtb2RlbDogSW5zZXJ0TGlua01vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0TGluayhtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydExpbmtPcGVyYXRpb24obW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRUYWJsZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYmxlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGFibGVDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSwgZm9ybWF0cyk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5VGV4dFN0eWxlQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgdGV4dFN0eWxlLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlQXBwbHlQYXJhZ3JhcGhTdHlsZVRvSGlzdG9yeShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoc0RlZXBDb3B5ID0gcGFyYWdyYXBocy5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiB4Lmluc2VydEluZGV4LCBwYXJhZ3JhcGhTdHlsZTogbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwoeyAuLi54LnBhcmFncmFwaFN0eWxlIH0pIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUsIHBhcmFncmFwaHNEZWVwQ29weSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlQYXJhZ3JhcGhTdHlsZUNvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlLCB0aGlzLnRhcmdldHMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2F2ZUFwcGx5RWxlbWVudFN0eWxlVG9IaXN0b3J5KGN1cnJlbnQ6IEVsZW1lbnRNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5lbGVtZW50cy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gY3VycmVudC5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlFbGVtZW50U3R5bGUocHJldmlvdXMsIGN1cnJlbnQpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRBcHBseUVsZW1lbnRTdHlsZUNvbW1hbmQoY3VycmVudCwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUFkZE51bWJlcmluZ1RvSGlzdG9yeSh0ZW1wbGF0ZUxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBocyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzRGVlcENvcHkgPSBwYXJhZ3JhcGhzLm1hcChcbiAgICAgICAgICAgIHggPT4gbmV3IFBhcmFncmFwaE1vZGVsKHsgaW5zZXJ0SW5kZXg6IHguaW5zZXJ0SW5kZXgsIHBhcmFncmFwaFN0eWxlOiBuZXcgUGFyYWdyYXBoU3R5bGVNb2RlbCh7IC4uLngucGFyYWdyYXBoU3R5bGUgfSkgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZE51bWJlcmluZ0lkcyA9IFsuLi5uZXcgU2V0KHBhcmFncmFwaHMubWFwKHggPT4geC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCkpXTtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5ncyA9IHRoaXMuc2Vzc2lvbi5nZW5lcmFsUHJvcGVydGllcy5udW1iZXJpbmdzLmZpbHRlcih4ID0+IHJlbW92ZWROdW1iZXJpbmdJZHMuaW5jbHVkZXMoeC5udW1iZXJpbmdJZCkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEFkZE51bWJlcmluZyhzdGFydEluZGV4LCBlbmRJbmRleCwgdGVtcGxhdGVMZXZlbHMsIHBhcmFncmFwaHNEZWVwQ29weSwgbnVtYmVyaW5ncyk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFkZE51bWJlcmluZ0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRlbXBsYXRlTGV2ZWxzLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlUmVtb3ZlTnVtYmVyaW5nVG9IaXN0b3J5KHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHNEZWVwQ29weSA9IHBhcmFncmFwaHMubWFwKFxuICAgICAgICAgICAgeCA9PiBuZXcgUGFyYWdyYXBoTW9kZWwoeyBpbnNlcnRJbmRleDogeC5pbnNlcnRJbmRleCwgcGFyYWdyYXBoU3R5bGU6IG5ldyBQYXJhZ3JhcGhTdHlsZU1vZGVsKHsgLi4ueC5wYXJhZ3JhcGhTdHlsZSB9KSB9KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCByZW1vdmVkTnVtYmVyaW5nSWRzID0gWy4uLm5ldyBTZXQocGFyYWdyYXBocy5tYXAoeCA9PiB4LnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkKSldO1xuICAgICAgICBjb25zdCBudW1iZXJpbmdzID0gdGhpcy5zZXNzaW9uLmdlbmVyYWxQcm9wZXJ0aWVzLm51bWJlcmluZ3MuZmlsdGVyKHggPT4gcmVtb3ZlZE51bWJlcmluZ0lkcy5pbmNsdWRlcyh4Lm51bWJlcmluZ0lkKSk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoUmVtb3ZlTnVtYmVyaW5ncyhzdGFydEluZGV4LCBlbmRJbmRleCwgbnVtYmVyaW5ncywgcGFyYWdyYXBoc0RlZXBDb3B5KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlTnVtYmVyaW5nc0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZUFwcGx5SW1hZ2VTdHlsZVRvSGlzdG9yeShpbWFnZTogSW1hZ2VNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5pbWFnZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGltYWdlLmluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hBcHBseUltYWdlU3R5bGUocHJldmlvdXMsIGltYWdlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChcbiAgICAgICAgICAgIFNhdmVDb21tYW5kc0hlbHBlci5nZXRBcHBseUltYWdlU3R5bGVDb21tYW5kKGltYWdlLmhlaWdodCwgaW1hZ2Uud2lkdGgsIGltYWdlLmluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzYXZlUmVwbGFjZVRvSGlzdG9yeShyYW5nZTogUmFuZ2UsIG1vZGVsOiBSZXBsYWNlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdG9yZU1vZGVsID0gdGhpcy5jcmVhdGVSZXN0b3JlRnJvbVNsaWNlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTtcbiAgICAgICAgcmVzdG9yZU1vZGVsLmVuZEluZGV4ID0gcmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXggKyAobW9kZWwuaW5zZXJ0VGV4dD8udGV4dC5sZW5ndGggPz8gMSk7IC8vIHRoaXMgaXMgdG8gcmVzdG9yZSBpbiByYW5nZSB3aXRoIGRlbGV0aW5nL3JlcGxhY2luZyBjb250ZW50IHdpdGhpblxuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaFJlcGxhY2UocmVzdG9yZU1vZGVsLCBtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlcGxhY2VDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZVJlc3RvcmVGcm9tU2xpY2UocGFyYWdyYXBoU3RhcnQ6IG51bWJlciwgaW5kZXhJblN0YXJ0OiBudW1iZXIsIHBhcmFncmFwaEVuZDogbnVtYmVyLCBpbmRleEluRW5kOiBudW1iZXIpOiBSZXN0b3JlTW9kZWwge1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIHBhcmFncmFwaFN0YXJ0LCBpbmRleEluU3RhcnQpO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBwYXJhZ3JhcGhFbmQsIGluZGV4SW5FbmQpIC0gMTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5jb250ZW50LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh4KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbWFnZXMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmltYWdlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBJbWFnZU1vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFibGVzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoeCA9PiBuZXcgVGFibGVNb2RlbCh4KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5lbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBFbGVtZW50TW9kZWwoeCkpO1xuICAgICAgICBjb25zdCBicmVha3MgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmJyZWFrcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBCcmVha01vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFicyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwudGFicywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBUYWJNb2RlbCh4KSk7XG4gICAgICAgIGNvbnN0IGxpbmtzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5saW5rcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBMaW5rTW9kZWwoeCkpO1xuICAgICAgICByZXR1cm4gbmV3IFJlc3RvcmVNb2RlbCh7IHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZXh0LCBmb3JtYXRzLCBwYXJhZ3JhcGhzLCBpbWFnZXMsIHRhYmxlcywgZWxlbWVudHMsIGJyZWFrcywgdGFicywgbGlua3MgfSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ3VzdG9tRWxlbWVudChkYXRhOiBFbGVtZW50RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRFbGVtZW50ID0gbmV3IEluc2VydEVsZW1lbnRNb2RlbCh7IGVsZW1lbnQ6IG5ldyBFbGVtZW50TW9kZWwoeyAuLi5kYXRhLCBpbnNlcnRJbmRleCB9KSB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0RWxlbWVudCB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVJbnNlcnRFbGVtZW50VG9IaXN0b3J5KGluc2VydEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRFbGVtZW50KHRoaXMuc2VsZWN0aW9uLmN1cnNvciwgZGF0YSk7XG4gICAgICAgIHRoaXMub25Eb2N1bWVudENoYW5nZShuZXcgUmFuZ2UodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBlbmRQb2ludCkpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVSZW1vdmVUb0hpc3RvcnkodGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHRJbnB1dC5nZXRJbnNlcnRUZXh0KCk7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaCA9IHRoaXMuaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaCh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93KTtcbiAgICAgICAgaWYgKHRleHQgPT09IE5FV19MSU5FX01BUktVUCAmJiB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5ICYmIGlzRW1wdHlOdW1iZXJpbmdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVtYmVyaW5nc0Zyb21QYXJhZ3JhcGhzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydCh0ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkN1dChldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRDbGlwYm9hcmREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmNsaXBib2FyZC5jb3B5KGRhdGEpO1xuICAgICAgICB0aGlzLmN1dCgpO1xuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgIH1cblxuICAgIG9uQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRDbGlwYm9hcmREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmNsaXBib2FyZC5jb3B5KGRhdGEpO1xuICAgIH1cblxuICAgIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRleHRJbnB1dC5nZXRDbGlwYm9hcmREYXRhKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wYXN0ZURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UmVzaXplTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlcmVuZGVyUmVzaXplKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVyZW5kZXJSZXNpemUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVyZW5kZXJNYXJrZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIubG9vcC5zY2hlZHVsZSh7IG1hcmtlcjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcmVuZGVyUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5vblJlc2l6ZSh0cnVlKTtcbiAgICB9O1xuXG4gICAgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudGV4dElucHV0LmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUN1cnNvcigpO1xuICAgIH1cblxuICAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmx1ckN1c3RvbUNvbXBvbmVudCgpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQuY2xpZW50WSwgZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTGVmdENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLnNldEN1cnJlbnRTZXNzaW9uKGV2ZW50LmNsaWVudFksIGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dElucHV0LmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgY29uc3QgbGlua01vZGVsID0gdGhpcy5zZXNzaW9uLmdldExpbmtNb2RlbChwb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAobGlua01vZGVsKSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4obGlua01vZGVsLmxpbmspO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdXNlSGFuZGxlci5zdGFydE1vdXNlUHJlc3ModGhpcyk7XG4gICAgfVxuXG4gICAgb25Eb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBsZXQgaXNTdGFydEVkaXRFZGdlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTZXNzaW9uSWQgPSArY3VzdG9tRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgICAgICBsZXQgY2xpY2tlZFBhZ2U6IG51bWJlciA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBpc1BhcmVudEVkZ2UgPSB0aGlzLmlzUGFyZW50RWRnZShjdXN0b21FbGVtZW50KTtcbiAgICAgICAgICAgIGlmIChjdXN0b21FbGVtZW50LnRhZ05hbWUgPT09IHRoaXMuZWRnZUVsZW1lbnRUYWdOYW1lIHx8IChpc1BhcmVudEVkZ2UgJiYgIXRoaXMucmVndWxhdG9yU2VydmljZS5lZGdlRWRpdGluZ1BhZ2UpKSB7XG4gICAgICAgICAgICAgICAgY2xpY2tlZFBhZ2UgPSB0aGlzLmdldENsaWNrZWRQYWdlKGV2ZW50LmNsaWVudFkpO1xuICAgICAgICAgICAgICAgIGlzU3RhcnRFZGl0RWRnZSA9ICF0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZWRnZUVkaXRpbmdQYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoZWxlbWVudFNlc3Npb25JZCwgY2xpY2tlZFBhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldE1haW5TZXNzaW9uQXNDdXJyZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY3VzdG9tRWxlbWVudCAmJiBjdXN0b21FbGVtZW50LnRhZ05hbWUgIT09IHRoaXMudGFibGVDZWxsVGFnTmFtZSAmJiBjdXN0b21FbGVtZW50LnRhZ05hbWUgIT09IHRoaXMuZWRnZUVsZW1lbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgaWYgKGlzU3RhcnRFZGl0RWRnZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlU2VsZWN0aW9uKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBvblRyaXBsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLnNldEN1cnJlbnRTZXNzaW9uKGV2ZW50LmNsaWVudFksIGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyhldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgQ3Vyc29yUGFyYWdyYXBoKHBvc2l0aW9uLnJvdywgMCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IG5ldyBDdXJzb3JQYXJhZ3JhcGgocG9zaXRpb24ucm93LCB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChwb3NpdGlvbi5yb3cpLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlU2VsZWN0aW9uKHN0YXJ0LCBlbmQpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgb25RdWFkQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQuY2xpZW50WSwgZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0QWxsKHRoaXMuc2Vzc2lvbi5tb2RlbCk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlV2hlZWwoZXZlbnQ6IFdoZWVsRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhY3RvciA9IDAuMzU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFNwZWVkID0gNDtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gZXZlbnQuZGVsdGFZICogZmFjdG9yICogc2Nyb2xsU3BlZWQ7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEJ5KGRlbHRhWSk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHNldEN1cnJlbnRTZXNzaW9uKGNsaWNrUG9zaXRpb25ZOiBudW1iZXIsIGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuZ2V0Q3VzdG9tRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgaWYgKCFjdXN0b21FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0TWFpblNlc3Npb25Bc0N1cnJlbnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTZXNzaW9uSWQgPSArY3VzdG9tRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBpc0VkZ2VFZGl0aW5nID0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmVkZ2VFZGl0aW5nUGFnZTtcbiAgICAgICAgICAgIGlmIChjdXN0b21FbGVtZW50LnRhZ05hbWUgPT09IHRoaXMuZWRnZUVsZW1lbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRWRnZUVkaXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpY2tlZFBhZ2UgPSB0aGlzLmdldENsaWNrZWRQYWdlKGNsaWNrUG9zaXRpb25ZKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoZWxlbWVudFNlc3Npb25JZCwgY2xpY2tlZFBhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRNYWluU2Vzc2lvbkFzQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQYXJlbnRFZGdlID0gdGhpcy5pc1BhcmVudEVkZ2UoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1BhcmVudEVkZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoZWxlbWVudFNlc3Npb25JZCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXN0b21FbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpc0VkZ2VFZGl0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrZWRQYWdlID0gdGhpcy5nZXRDbGlja2VkUGFnZShjbGlja1Bvc2l0aW9uWSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRDdXN0b21TZXNzaW9uQXNDdXJyZW50KGVsZW1lbnRTZXNzaW9uSWQsIGNsaWNrZWRQYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldE1haW5TZXNzaW9uQXNDdXJyZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZ2V0Q3VzdG9tRWxlbWVudChlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09IHRoaXMucGFyZW50VGFnTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21FbGVtZW50VGFnTmFtZXMuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXN0b21FbGVtZW50KGVsZW1lbnQucGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1BhcmVudEVkZ2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gdGhpcy5wYXJlbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC50YWdOYW1lID09PSB0aGlzLmVkZ2VFbGVtZW50VGFnTmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1BhcmVudEVkZ2UoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsaWNrZWRQYWdlKG1vdXNlUG9zaXRpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uWSA9IG1vdXNlUG9zaXRpb24gKyB0aGlzLm1haW5TZXNzaW9uLnNjcm9sbFRvcCAtIHRoaXMubWFpblJlbmRlcmVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbkhlbHBlci5waXhlbFRvUGFnZShwb3NpdGlvblksIHRoaXMubWFpblNlc3Npb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyBvZiB0ZXh0IGN1cnJlbnRseSBoaWdobGlnaHRlZC5cbiAgICAgKi9cbiAgICBnZXRTZWxlY3RlZFRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCB0aGlzLnNlbGVjdGlvbi5yYW5nZS5zdGFydCk7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhQb3NpdGlvblRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgdGhpcy5zZWxlY3Rpb24ucmFuZ2UuZW5kKTtcbiAgICAgICAgbGV0IGVsZW1lbnRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLmJyZWFrcywgZWxlbWVudEluZGV4ZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ29udGVudEhlbHBlci5zZXRJbmRleGVzRWxlbWVudHNJbkludGVydmFsKHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIENvbnRlbnRIZWxwZXIuc2V0SW5kZXhlc0VsZW1lbnRzSW5JbnRlcnZhbCh0aGlzLnNlc3Npb24ubW9kZWwuaW1hZ2VzLCBlbGVtZW50SW5kZXhlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLmVsZW1lbnRzLCBlbGVtZW50SW5kZXhlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLnRhYnMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGVsZW1lbnRJbmRleGVzLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgbGV0IHRleHRJbnRlcnZhbCA9IHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5nZXRUZXh0UmFuZ2UodGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICBlbGVtZW50SW5kZXhlcy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgdGV4dEludGVydmFsID0gdGV4dEludGVydmFsLnNsaWNlKDAsIHgpICsgdGV4dEludGVydmFsLnNsaWNlKHggKyAxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHRJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpbml0TWFpblNlc3Npb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMuY3VzdG9tUGFnZVdpZHRoID8/IHRoaXMubW9kZWwucGFnZVdpZHRoO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gYCR7cGFnZVdpZHRofXB4YDtcbiAgICAgICAgY29uc3Qgc2NhbGluZ1JhdGlvID0gdGhpcy5jdXN0b21QYWdlV2lkdGggPyBTY2FsaW5nSGVscGVyLmdldFJhdGlvKHRoaXMuY3VzdG9tUGFnZVdpZHRoLCB0aGlzLm1vZGVsLnBhZ2VXaWR0aCkgOiAxO1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuYWRkTWFpblNlc3Npb24odGhpcy5tb2RlbCwgcGFnZVdpZHRoLCBzY2FsaW5nUmF0aW8sIHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5VG9vbGJhclN0eWxlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbi5yYW5nZSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRIYXNTZWxlY3Rpb24oIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgfVxuXG4gICAgZW5hYmxlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1zZXNzaW9uLWlkPVwiJHt0aGlzLnNlc3Npb24uc2Vzc2lvbklkfVwiXWApO1xuICAgICAgICBpZiAoY3VzdG9tRWxlbWVudC50YWdOYW1lID09PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHRhYmxlU2Vzc2lvbiA9IHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRTZXNzaW9uKHRoaXMucmVndWxhdG9yU2VydmljZS5jdXJyZW50U2Vzc2lvbi5wYXJlbnRTZXNzaW9uSWQpO1xuICAgICAgICAgICAgY29uc3QgdGFibGUgPSB0YWJsZVNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICB4ID0+IHguaW5zdGFuY2Uuc2Vzc2lvbklkID09PSB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuY3VycmVudFNlc3Npb24ucGFyZW50U2Vzc2lvbklkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGFibGUuaW5zdGFuY2UudGFibGVTZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGlvbi5lbmFibGVTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5jdXJzb3JMYXllci5zaG93Q3Vyc29yKCk7XG4gICAgfVxuXG4gICAgb25Ib3RLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5rZXlEb3duKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblByaW50KCk6IHZvaWQge1xuICAgICAgICBQcmludEhlbHBlci5wcmludERvY3VtZW50KHRoaXMubWFpblNlc3Npb24sIHRoaXMuZWRpdG9yU2VydmljZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRvY3VtZW50Q2hhbmdlID0gKHJhbmdlOiBSYW5nZSk6IHZvaWQgPT4ge1xuICAgICAgICBsZXQgbGFzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdyA/IHJhbmdlLmVuZC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhyYW5nZS5zdGFydC5yb3csIGxhc3RSb3cpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBjdXJzb3IgYmVjYXVzZSB0YWIgY2hhcmFjdGVycyBjYW4gaW5mbHVlbmNlIHRoZSBjdXJzb3IgcG9zaXRpb24uXG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgZm9jdXNDdXN0b21Db21wb25lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSArZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1pbnNlcnQtaW5kZXgnKS52YWx1ZTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID1cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmltYWdlcy5maW5kKHggPT4geC5pbnN0YW5jZS5pbnNlcnRJbmRleCA9PT0gaW5kZXgpID8/XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy50YWJsZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluZGV4KSA/P1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuY3VzdG9tRWxlbWVudHMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgaWYgKCFjb21wb25lbnQgfHwgY29tcG9uZW50ID09PSB0aGlzLmZvY3VzZWRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZENvbXBvbmVudD8uaW5zdGFuY2UuYmx1cigpO1xuICAgICAgICBjb21wb25lbnQuaW5zdGFuY2UuZm9jdXMoKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5pbmRleFRvUG9zaXRpb24oaW5kZXgsIDApO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihwb3NpdGlvbik7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJsdXJDdXN0b21Db21wb25lbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRDb21wb25lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZENvbXBvbmVudC5pbnN0YW5jZS5ibHVyKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb21wb25lbnQgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0VtcHR5TnVtYmVyaW5nUGFyYWdyYXBoKHBhcmFncmFwaEluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuZ2V0UGFyYWdyYXBoQ29udGVudChwYXJhZ3JhcGhJbmRleCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50TGluZS5sZW5ndGggPT09IDAgJiYgdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsO1xuICAgIH1cblxuICAgIHNjcm9sbEN1cnNvckludG9NYWluVmlldyhvZmZzZXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbiAhPT0gdGhpcy5tYWluU2Vzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2hhbmdlZFRhYmxlU2l6ZShpbnNlcnRJbmRleDogbnVtYmVyLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmdldFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChzZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEluZGV4KS5yb3c7XG4gICAgICAgIHNlc3Npb24uZGlzcGxheURhdGEucmVzZXRBbGxOdW1iZXJpbmdJbmZvKHBhcmFncmFwaCk7XG4gICAgICAgIHNlc3Npb24uZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKHBhcmFncmFwaCwgcGFyYWdyYXBoKTtcbiAgICAgICAgc2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVOdW1iZXJpbmdzRGF0YU9uQ2hhbmdlKHBhcmFncmFwaCArIDEpO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGJlZm9yZVRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnNlc3Npb24ubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgsIHRhYmxlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChcbiAgICAgICAgICAgIFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUYWJsZVJvd3NDb21tYW5kKHJvd3NDb3VudCwgaW5oZXJpdEluZGV4LCBpbnNlcnRJbmRleCwgdGFyZ2V0SW5kZXgsIHRoaXMudGFyZ2V0cylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlUm93cyhpbnNlcnRJbmRleCwgcm93c0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKGluc2VydEluZGV4LCBzZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleDogbnVtYmVyLCBjb2x1bW5zQ291bnQ6IG51bWJlciwgdGFyZ2V0SW5kZXg6IG51bWJlciwgaW5oZXJpdEluZGV4OiBudW1iZXIsIHNlc3Npb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRDdXN0b21TZXNzaW9uQXNDdXJyZW50KHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZVRhYmxlID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocywgaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihiZWZvcmVUYWJsZSk7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy5zZXNzaW9uLm1vZGVsLnRhYmxlcy5maW5kKHggPT4geC5pbnNlcnRJbmRleCA9PT0gaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleCwgY29sdW1uc0NvdW50LCB0YXJnZXRJbmRleCwgaW5oZXJpdEluZGV4LCB0YWJsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGFibGVDb2x1bW5zQ29tbWFuZChjb2x1bW5zQ291bnQsIGluaGVyaXRJbmRleCwgaW5zZXJ0SW5kZXgsIHRhcmdldEluZGV4LCB0aGlzLnRhcmdldHMpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXgsIGNvbHVtbnNDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCk7XG4gICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShpbnNlcnRJbmRleCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICByZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXg6IG51bWJlciwgc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBiZWZvcmVUYWJsZSA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgodGhpcy5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hSZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0YWJsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZVRhYmxlUm93c0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVRhYmxlUm93cyhpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLCBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKGJlZm9yZVRhYmxlKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLnNlc3Npb24ubW9kZWwudGFibGVzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoUmVtb3ZlVGFibGVDb2x1bW5zKGluc2VydEluZGV4LCBzdGFydEluZGV4LCBlbmRJbmRleCwgdGFibGUpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFxuICAgICAgICAgICAgU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZVRhYmxlQ29sdW1uc0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKGluc2VydEluZGV4LCBzZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIHJlbW92ZUltYWdlKGluc2VydEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEuaW5kZXhlc1RvUmFuZ2UoaW5zZXJ0SW5kZXgsIGluc2VydEluZGV4ICsgMSk7XG4gICAgICAgIHRoaXMuc2F2ZVJlbW92ZVRvSGlzdG9yeShyYW5nZSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmUocmFuZ2UpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dC5pbnB1dC5mb2N1cygpO1xuICAgIH1cblxuICAgIHJlc2l6ZVRhYmxlQ29sdW1ucyhyZXNpemVUYWJsZUNvbHVtbnM6IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChzZXNzaW9uSWQpO1xuICAgICAgICBjb25zdCBiZWZvcmVUYWJsZSA9IENvbnRlbnRIZWxwZXIuZG9jdW1lbnRJbmRleFRvUGFyYWdyYXBoSW5kZXgoXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uZGlzcGxheURhdGEucGFyYWdyYXBocyxcbiAgICAgICAgICAgIHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihiZWZvcmVUYWJsZSk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoUmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlUHJlc3NlZE1vdmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHgsIHkpO1xuICAgICAgICBjb25zdCBjdXJzb3IgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3I7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVTZWxlY3Rpb24ocG9zaXRpb24pO1xuICAgICAgICBpZiAoY3Vyc29yLmNvbHVtbiAhPT0gdGhpcy5zZWxlY3Rpb24uY3Vyc29yLmNvbHVtbiB8fCBjdXJzb3Iucm93ICE9PSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93KSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoKTtcbiAgICB9XG5cbiAgICBzZWFyY2hPcHRpb25TdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5zZWFyY2hPcHRpb25zJC5zdWJzY3JpYmUoc2VhcmNoT3B0aW9ucyA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbmQoc2VhcmNoT3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2VhcmNoSXRlcmF0aW9uID0gdGhpcy51cGRhdGVDb3VudGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlcGxhY2VTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZXBsYWNlJC5zdWJzY3JpYmUocmVwbGFjZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2UocmVwbGFjZS5zZWFyY2hWYWx1ZSwgcmVwbGFjZS5yZXBsYWNlVmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNlYXJjaEl0ZXJhdGlvbiA9IHRoaXMudXBkYXRlQ291bnRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUZXh0U3R5bGVzU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0VGV4dFN0eWxlcyQuc3Vic2NyaWJlKHRleHRTdHlsZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcHBseVRleHRTdHlsZXModGV4dFN0eWxlcyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFBhcmFncmFwaFN0eWxlc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNldFBhcmFncmFwaFN0eWxlcyQuc3Vic2NyaWJlKHBhcmFncmFwaFN0eWxlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGFyYWdyYXBoU3R5bGVzKHBhcmFncmFwaFN0eWxlcyk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldE51bWJlcmluZ1RlbXBsYXRlVHlwZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNldE51bWJlcmluZ1RlbXBsYXRlVHlwZSQuc3Vic2NyaWJlKG51bWJlcmluZ1RlbXBsYXRlVHlwZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldE51bWJlcmluZ1RlbXBsYXRlKG51bWJlcmluZ1RlbXBsYXRlVHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3NTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZW1vdmVOdW1iZXJpbmdzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVOdW1iZXJpbmdzRnJvbVBhcmFncmFwaHMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0SW1hZ2VTdHlsZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEltYWdlU3R5bGUkLnN1YnNjcmliZShpbWFnZSA9PiB0aGlzLmFwcGx5SW1hZ2VTdHlsZXMoaW1hZ2UpKTtcbiAgICB9XG5cbiAgICBjaGFuZ2VFbGVtZW50U3R5bGVTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5jaGFuZ2VFbGVtZW50U3R5bGUkLnN1YnNjcmliZSh4ID0+IHRoaXMuYXBwbHlFbGVtZW50U3R5bGUoeCkpO1xuICAgIH1cblxuICAgIGNyZWF0ZUN1c3RvbUNvbXBvbmVudFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNyZWF0ZUN1c3RvbUNvbXBvbmVudCQuc3Vic2NyaWJlKG1vZGVsID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tRWxlbWVudChtb2RlbCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0QnJlYWskLnN1YnNjcmliZShicmVha1R5cGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRCcmVhayhicmVha1R5cGUpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydEltYWdlJC5zdWJzY3JpYmUoaW1hZ2VEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2UoaW1hZ2VEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0TGlua1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydExpbmskLnN1YnNjcmliZShsaW5rRGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydExpbmsobGlua0RhdGEpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlbmRNb3VzZVByZXNzU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuZW5kTW91c2VQcmVzcyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubW91c2VIYW5kbGVyLmVuZE1vdXNlUHJlc3MoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGlzYWJsZVNlbGVjdGlvblN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmRpc2FibGVTZWxlY3Rpb24kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5kaXNhYmxlU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmN1cnNvckxheWVyLmhpZGVDdXJzb3IoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hhbmdlZFRhYmxlU2l6ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRUYWJsZVNpemUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShkYXRhLmluc2VydEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlUm93c1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydFRhYmxlUm93cyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZVJvd3MoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5yb3dzQ291bnQsIGRhdGEudGFyZ2V0SW5kZXgsIGRhdGEuaW5oZXJpdEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydFRhYmxlQ29sdW1ucyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZUNvbHVtbnMoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5jb2x1bW5zQ291bnQsIGRhdGEudGFyZ2V0SW5kZXgsIGRhdGEuaW5oZXJpdEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlUm93c1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVRhYmxlUm93cyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZVJvd3MoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5zdGFydEluZGV4LCBkYXRhLmVuZEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVRhYmxlQ29sdW1ucyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZUNvbHVtbnMoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5zdGFydEluZGV4LCBkYXRhLmVuZEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWRJbWFnZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZUltYWdlJC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUltYWdlKGRhdGEuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZXNpemVUYWJsZUNvbHVtbnMkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGFibGVDb2x1bW5zKGRhdGEucmVzaXplVGFibGVDb2x1bW5zLCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0VGFibGUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRleHRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRUZXh0JC5zdWJzY3JpYmUoeCA9PiB7XG4gICAgICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0KHgpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJlclVwZGF0ZWRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZW5kZXJlclVwZGF0ZWQkLnN1YnNjcmliZShzZXNzaW9uSWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWRnZVRhcmdldCA9IHRoaXMucmVndWxhdG9yU2VydmljZS5nZXRFZGdlVGFyZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoZWRnZVRhcmdldCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnJlbmRlcmVyLnRleHRMYXllci51cGRhdGVFZGdlQnlMb2NhdGlvbihlZGdlVGFyZ2V0LmVkZ2VEYXRhLnBhZ2VUeXBlIGFzIFBhZ2VUeXBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZWRnZUVsZW1lbnRDb3B5VXBkYXRlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmVkZ2VFbGVtZW50Q29weVVwZGF0ZWQkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZWRnZUVkaXRpbmdQYWdlICE9PSBkYXRhLnBhZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGVkZ2VTZXNzaW9uSWQgPSArZGF0YS5uZXdFbGVtZW50Q29weS5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBlZGdlU2Vzc2lvbiA9IHRoaXMucmVndWxhdG9yU2VydmljZS5zZXNzaW9ucy5maW5kKHggPT4geC5zZXNzaW9uSWQgPT09IGVkZ2VTZXNzaW9uSWQpO1xuICAgICAgICAgICAgZWRnZVNlc3Npb24ucmVuZGVyZXIuY29udGFpbmVyID0gZGF0YS5uZXdFbGVtZW50Q29weS5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjaGFuZ2VkRWRnZUhlaWdodFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRFZGdlSGVpZ2h0JC5zdWJzY3JpYmUoZWRnZVR5cGUgPT4ge1xuICAgICAgICAgICAgdGhpcy5tYWluU2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVQYWdlVmVydGljYWxEYXRhKGVkZ2VUeXBlLCB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZWRnZUVkaXRpbmdQYWdlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5kb1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnVuZG8kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZG9TdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZWRvJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRvKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBibHVyQ3VzdG9tQ29tcG9uZW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuYmx1ckN1c3RvbUNvbXBvbmVudCQuc3Vic2NyaWJlKCgpID0+IHRoaXMuYmx1ckN1c3RvbUNvbXBvbmVudCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByaW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucHJpbnQkLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uUHJpbnQoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjdXRTZWxlY3RlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmN1dFNlbGVjdGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkN1dChuZXcgQ2xpcGJvYXJkRXZlbnQoJ2N1dCcpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3B5U2VsZWN0ZWRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5jb3B5U2VsZWN0ZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29weShuZXcgQ2xpcGJvYXJkRXZlbnQoJ2NvcHknKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFzdGVGcm9tQ2xpcGJvYXJkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucGFzdGVGcm9tQ2xpcGJvYXJkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWFkQ2xpcGJvYXJkKClcbiAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHRoaXMucGFzdGVEYXRhKGRhdGEpKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3MgZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyByZWFkQ2xpcGJvYXJkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBhd2FpdCBuYXZpZ2F0b3IucGVybWlzc2lvbnMucXVlcnkoeyBuYW1lOiAnY2xpcGJvYXJkLXJlYWQnIGFzIFBlcm1pc3Npb25OYW1lIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiByZWFkLnN0YXRlICE9ICdkZW5pZWQnKSB7XG4gICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZFxuICAgICAgICAgICAgICAgICAgICAucmVhZFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIGVycm9yXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuY2xpcGJvYXJkRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFzdGVEYXRhKGRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXh0ID0gZGF0YS5yZXBsYWNlKC9cXHJcXG4vZywgJ1xcbicpLnJlcGxhY2UoL1xcdC9nLCAnICcpO1xuICAgICAgICB0aGlzLmluc2VydCh0ZXh0KTtcbiAgICAgICAgdGhpcy5zY3JvbGxDdXJzb3JJbnRvTWFpblZpZXcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdEFsbFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNlbGVjdEFsbCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCh0aGlzLnNlc3Npb24ubW9kZWwpO1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVNlbGVjdGVkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucmVtb3ZlU2VsZWN0ZWQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xpcGJvYXJkRGF0YVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNsaXBib2FyZERhdGEkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkRGF0YSA9IGRhdGE7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZUVkZ2VTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS51cGRhdGVFZGdlcyQuc3Vic2NyaWJlKHNlc3Npb25JZCA9PiB7XG4gICAgICAgICAgICBsZXQgZm9vdGVycyA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5mb290ZXJzQ29tcG9uZW50cztcbiAgICAgICAgICAgIGxldCBleGlzdGVkID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmhlYWRlcnNDb21wb25lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2Uuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgaWYgKGV4aXN0ZWQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMubWFpblNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5lZGdlcy5oZWFkZXJzQ29tcG9uZW50cy5zbGljZShleGlzdGVkICsgMSk7XG4gICAgICAgICAgICAgICAgaGVhZGVycy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgICAgICB4Lmluc3RhbmNlLnNlc3Npb24uZGlzcGxheURhdGEudXBkYXRlTmV4dExpbmVJbmRleGVzKDAsIHguaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS5wYXJhZ3JhcGhzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBleGlzdGVkID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmZvb3RlcnNDb21wb25lbnRzLmZpbmRJbmRleCh4ID0+IHguaW5zdGFuY2Uuc2Vzc2lvbklkID09PSBzZXNzaW9uSWQpO1xuICAgICAgICAgICAgICAgIGZvb3RlcnMgPSB0aGlzLm1haW5TZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMuZWRnZXMuZm9vdGVyc0NvbXBvbmVudHMuc2xpY2UoZXhpc3RlZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9vdGVycy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgICAgIHguaW5zdGFuY2Uuc2Vzc2lvbi5kaXNwbGF5RGF0YS51cGRhdGVOZXh0TGluZUluZGV4ZXMoMCwgeC5pbnN0YW5jZS5zZXNzaW9uLmRpc3BsYXlEYXRhLnBhcmFncmFwaHMubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19