@acorex/platform 18.1.6 → 18.2.1

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 (251) hide show
  1. package/common/index.d.ts +3 -3
  2. package/common/lib/app/application.types.d.ts +10 -2
  3. package/common/lib/data/data.types.d.ts +1 -1
  4. package/common/lib/data/entity-storage-service.d.ts +1 -1
  5. package/common/lib/layout/component-slot/component-slot-loader.service.d.ts +2 -2
  6. package/common/lib/layout/component-slot/component-slot.types.d.ts +2 -1
  7. package/common/lib/layout/menu/menu.provider.d.ts +1 -1
  8. package/esm2022/common/index.mjs +4 -4
  9. package/esm2022/common/lib/app/application.types.mjs +13 -1
  10. package/esm2022/common/lib/common.module.mjs +14 -16
  11. package/esm2022/common/lib/data/data.types.mjs +1 -1
  12. package/esm2022/common/lib/data/dexie-storage.service.mjs +6 -4
  13. package/esm2022/common/lib/data/entity-storage-service.mjs +2 -2
  14. package/esm2022/common/lib/layout/component-slot/component-slot-loader.service.mjs +6 -5
  15. package/esm2022/common/lib/layout/component-slot/component-slot.types.mjs +1 -1
  16. package/esm2022/common/lib/layout/menu/menu.provider.mjs +1 -5
  17. package/esm2022/layout/builder/lib/builder/builder.service.mjs +19 -23
  18. package/esm2022/layout/builder/lib/builder/datasource-provider.service.mjs +27 -0
  19. package/esm2022/layout/builder/lib/builder/index.mjs +2 -1
  20. package/esm2022/layout/builder/lib/builder/widget-container.component.mjs +1 -8
  21. package/esm2022/layout/builder/lib/builder/widget-renderer.component.directive.mjs +34 -24
  22. package/esm2022/layout/builder/lib/builder/widget.types.mjs +52 -3
  23. package/esm2022/layout/designer/lib/designer/components/board/board.component.mjs +14 -22
  24. package/esm2022/layout/designer/lib/designer/components/drawers/data-sources/data-sources.component.mjs +5 -4
  25. package/esm2022/layout/designer/lib/designer/designer.component.mjs +4 -9
  26. package/esm2022/layout/designer/lib/designer/shared/designer-connector.service.mjs +2 -1
  27. package/esm2022/layout/designer/lib/designer/shared/designer.service.mjs +1 -3
  28. package/esm2022/layout/designer/lib/designer/shared/designer.types.mjs +1 -1
  29. package/esm2022/layout/designer/lib/designer/shared/widget-designer-renderer.directive.mjs +13 -10
  30. package/esm2022/layout/designer/lib/preview/preview-viewer.component.mjs +12 -3
  31. package/esm2022/layout/designer/lib/preview/preview.component.mjs +3 -2
  32. package/esm2022/layout/designer/lib/property-viewer/widget-property-viewer.component.mjs +5 -4
  33. package/esm2022/layout/entity/lib/entity-detail-list.viewmodel.mjs +3 -4
  34. package/esm2022/layout/entity/lib/entity-master-create.viewmodel.mjs +3 -3
  35. package/esm2022/layout/entity/lib/entity-master-list.viewmodel.mjs +5 -6
  36. package/esm2022/layout/entity/lib/entity-master-single.viewmodel.mjs +7 -7
  37. package/esm2022/layout/entity/lib/entity.config.mjs +6 -6
  38. package/esm2022/layout/entity/lib/entity.service.mjs +18 -0
  39. package/esm2022/layout/entity/lib/index.mjs +2 -1
  40. package/esm2022/layout/entity/lib/widgets/lookup-widget/lookup-widget-selector.viewmodel.mjs +21 -19
  41. package/esm2022/layout/entity/lib/workflows/modify-section.workflow.mjs +2 -2
  42. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-detail-list-view/entity-detail-list-view.component.mjs +4 -4
  43. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-create-view/entity-master-create-view.component.mjs +4 -4
  44. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-list-view/entity-master-list-view.component.mjs +9 -8
  45. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-list-view/list-view-option-columns/list-view-option-columns.component.mjs +3 -3
  46. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-modify-view/entity-master-modify-view.component.mjs +3 -3
  47. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/entity-master-single-view.component.mjs +7 -6
  48. package/esm2022/themes/default/lib/layouts/entity-layouts/entity-master-single-view/overview/entity-single-overview.component.mjs +12 -10
  49. package/esm2022/themes/default/lib/layouts/root-layout/components/menu/root-menu.component.mjs +4 -3
  50. package/esm2022/themes/default/lib/layouts/root-layout/root-layout.module.mjs +10 -6
  51. package/esm2022/themes/shared/index.mjs +1 -5
  52. package/esm2022/themes/shared/lib/components/theme-slot.component.mjs +13 -11
  53. package/esm2022/themes/shared/lib/shared.module.mjs +25 -4
  54. package/esm2022/widgets/lib/properties/editors.props.mjs +4 -2
  55. package/esm2022/widgets/lib/properties/general.props.mjs +2 -2
  56. package/esm2022/widgets/lib/widgets/editors/color/color-box-widget-view.component.mjs +26 -5
  57. package/esm2022/widgets/lib/widgets/editors/date-time/date-time-box-widget-column.component.mjs +27 -16
  58. package/esm2022/widgets/lib/widgets/editors/date-time/date-time-box-widget-edit.component.mjs +10 -2
  59. package/esm2022/widgets/lib/widgets/editors/date-time/date-time-box-widget-view.component.mjs +22 -7
  60. package/esm2022/widgets/lib/widgets/editors/rich-text/rich-text-widget-edit.component.mjs +8 -15
  61. package/esm2022/widgets/lib/widgets/editors/select/index.mjs +3 -3
  62. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget-edit.component.mjs +9 -19
  63. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget-view.component.mjs +4 -2
  64. package/esm2022/widgets/lib/widgets/editors/select/select-box-widget.config.mjs +3 -2
  65. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget-designer.component.mjs +32 -15
  66. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget-edit.component.mjs +34 -14
  67. package/esm2022/widgets/lib/widgets/editors/selection-list/selection-list-widget.config.mjs +4 -2
  68. package/esm2022/widgets/lib/widgets/layout/template/template-widget-view.component.mjs +7 -21
  69. package/fesm2022/{acorex-platform-common-avatar-widget-edit.component-WAlG5E_9.mjs → acorex-platform-common-avatar-widget-edit.component-BYEjzXpW.mjs} +3 -3
  70. package/fesm2022/{acorex-platform-common-avatar-widget-edit.component-WAlG5E_9.mjs.map → acorex-platform-common-avatar-widget-edit.component-BYEjzXpW.mjs.map} +1 -1
  71. package/fesm2022/{acorex-platform-common-avatar-widget-view.component-DRyB3UWf.mjs → acorex-platform-common-avatar-widget-view.component-CfHELBLm.mjs} +3 -3
  72. package/fesm2022/{acorex-platform-common-avatar-widget-view.component-DRyB3UWf.mjs.map → acorex-platform-common-avatar-widget-view.component-CfHELBLm.mjs.map} +1 -1
  73. package/fesm2022/{acorex-platform-common-boolean-widget-filter.component-DY4oTjC-.mjs → acorex-platform-common-boolean-widget-filter.component-DRDiIxsn.mjs} +3 -3
  74. package/fesm2022/{acorex-platform-common-boolean-widget-filter.component-DY4oTjC-.mjs.map → acorex-platform-common-boolean-widget-filter.component-DRDiIxsn.mjs.map} +1 -1
  75. package/fesm2022/{acorex-platform-common-checkbox-widget-column.component-NSXcrUwU.mjs → acorex-platform-common-checkbox-widget-column.component-Bn0tnHyT.mjs} +3 -3
  76. package/fesm2022/{acorex-platform-common-checkbox-widget-column.component-NSXcrUwU.mjs.map → acorex-platform-common-checkbox-widget-column.component-Bn0tnHyT.mjs.map} +1 -1
  77. package/fesm2022/{acorex-platform-common-checkbox-widget-edit.component-BU7qV5Cm.mjs → acorex-platform-common-checkbox-widget-edit.component-BuS0Pg-j.mjs} +3 -3
  78. package/fesm2022/{acorex-platform-common-checkbox-widget-edit.component-BU7qV5Cm.mjs.map → acorex-platform-common-checkbox-widget-edit.component-BuS0Pg-j.mjs.map} +1 -1
  79. package/fesm2022/{acorex-platform-common-checkbox-widget-view.component-2Du2IzDS.mjs → acorex-platform-common-checkbox-widget-view.component-D7kmxXjj.mjs} +3 -3
  80. package/fesm2022/{acorex-platform-common-checkbox-widget-view.component-2Du2IzDS.mjs.map → acorex-platform-common-checkbox-widget-view.component-D7kmxXjj.mjs.map} +1 -1
  81. package/fesm2022/{acorex-platform-common-dateTime-widget-column.component-Dd7fgwu3.mjs → acorex-platform-common-dateTime-widget-column.component-CtS98tbi.mjs} +3 -3
  82. package/fesm2022/{acorex-platform-common-dateTime-widget-column.component-Dd7fgwu3.mjs.map → acorex-platform-common-dateTime-widget-column.component-CtS98tbi.mjs.map} +1 -1
  83. package/fesm2022/{acorex-platform-common-dateTime-widget-edit.component-B4AelVJp.mjs → acorex-platform-common-dateTime-widget-edit.component-Dm4QofDq.mjs} +3 -3
  84. package/fesm2022/{acorex-platform-common-dateTime-widget-edit.component-B4AelVJp.mjs.map → acorex-platform-common-dateTime-widget-edit.component-Dm4QofDq.mjs.map} +1 -1
  85. package/fesm2022/{acorex-platform-common-dateTime-widget-filter.component-Ytm-TwOP.mjs → acorex-platform-common-dateTime-widget-filter.component-DDny36SE.mjs} +3 -3
  86. package/fesm2022/{acorex-platform-common-dateTime-widget-filter.component-Ytm-TwOP.mjs.map → acorex-platform-common-dateTime-widget-filter.component-DDny36SE.mjs.map} +1 -1
  87. package/fesm2022/{acorex-platform-common-dateTime-widget-view.component-BKdqOPkb.mjs → acorex-platform-common-dateTime-widget-view.component-lzf0fwxr.mjs} +3 -3
  88. package/fesm2022/{acorex-platform-common-dateTime-widget-view.component-BKdqOPkb.mjs.map → acorex-platform-common-dateTime-widget-view.component-lzf0fwxr.mjs.map} +1 -1
  89. package/fesm2022/{acorex-platform-common-email-widget-column.component-CDKqwlPD.mjs → acorex-platform-common-email-widget-column.component-Cy_Kj9po.mjs} +3 -3
  90. package/fesm2022/{acorex-platform-common-email-widget-column.component-CDKqwlPD.mjs.map → acorex-platform-common-email-widget-column.component-Cy_Kj9po.mjs.map} +1 -1
  91. package/fesm2022/{acorex-platform-common-email-widget-edit.component-BT2rJjaW.mjs → acorex-platform-common-email-widget-edit.component-DTxCX3ok.mjs} +3 -3
  92. package/fesm2022/{acorex-platform-common-email-widget-edit.component-BT2rJjaW.mjs.map → acorex-platform-common-email-widget-edit.component-DTxCX3ok.mjs.map} +1 -1
  93. package/fesm2022/{acorex-platform-common-email-widget-view.component-DbhRWpB1.mjs → acorex-platform-common-email-widget-view.component-CvEHLvcT.mjs} +3 -3
  94. package/fesm2022/{acorex-platform-common-email-widget-view.component-DbhRWpB1.mjs.map → acorex-platform-common-email-widget-view.component-CvEHLvcT.mjs.map} +1 -1
  95. package/fesm2022/{acorex-platform-common-file-widget-column.component-8U76QgEQ.mjs → acorex-platform-common-file-widget-column.component-GtbElxmS.mjs} +2 -2
  96. package/fesm2022/{acorex-platform-common-file-widget-column.component-8U76QgEQ.mjs.map → acorex-platform-common-file-widget-column.component-GtbElxmS.mjs.map} +1 -1
  97. package/fesm2022/{acorex-platform-common-file-widget-edit.component-OFmiYz_5.mjs → acorex-platform-common-file-widget-edit.component-3fR5jRFv.mjs} +3 -3
  98. package/fesm2022/{acorex-platform-common-file-widget-edit.component-OFmiYz_5.mjs.map → acorex-platform-common-file-widget-edit.component-3fR5jRFv.mjs.map} +1 -1
  99. package/fesm2022/{acorex-platform-common-file-widget-filter.component-ZLnpXMXK.mjs → acorex-platform-common-file-widget-filter.component-B7etTIuq.mjs} +3 -3
  100. package/fesm2022/{acorex-platform-common-file-widget-filter.component-ZLnpXMXK.mjs.map → acorex-platform-common-file-widget-filter.component-B7etTIuq.mjs.map} +1 -1
  101. package/fesm2022/{acorex-platform-common-file-widget-view.component-BcrM4XrO.mjs → acorex-platform-common-file-widget-view.component-RsQQjlL7.mjs} +3 -3
  102. package/fesm2022/{acorex-platform-common-file-widget-view.component-BcrM4XrO.mjs.map → acorex-platform-common-file-widget-view.component-RsQQjlL7.mjs.map} +1 -1
  103. package/fesm2022/{acorex-platform-common-gallery-widget-edit.component-pBBjrjDP.mjs → acorex-platform-common-gallery-widget-edit.component-CixJEDUT.mjs} +3 -3
  104. package/fesm2022/{acorex-platform-common-gallery-widget-edit.component-pBBjrjDP.mjs.map → acorex-platform-common-gallery-widget-edit.component-CixJEDUT.mjs.map} +1 -1
  105. package/fesm2022/{acorex-platform-common-gallery-widget-filter.component-Cp7t9ovC.mjs → acorex-platform-common-gallery-widget-filter.component-1wzY6U5s.mjs} +3 -3
  106. package/fesm2022/{acorex-platform-common-gallery-widget-filter.component-Cp7t9ovC.mjs.map → acorex-platform-common-gallery-widget-filter.component-1wzY6U5s.mjs.map} +1 -1
  107. package/fesm2022/{acorex-platform-common-gallery-widget-view.component-CPS-h3cq.mjs → acorex-platform-common-gallery-widget-view.component-YaLJU3Cv.mjs} +3 -3
  108. package/fesm2022/{acorex-platform-common-gallery-widget-view.component-CPS-h3cq.mjs.map → acorex-platform-common-gallery-widget-view.component-YaLJU3Cv.mjs.map} +1 -1
  109. package/fesm2022/{acorex-platform-common-largetext-widget-edit.component-DA6r3rVA.mjs → acorex-platform-common-largetext-widget-edit.component-BeiJZnEv.mjs} +3 -3
  110. package/fesm2022/{acorex-platform-common-largetext-widget-edit.component-DA6r3rVA.mjs.map → acorex-platform-common-largetext-widget-edit.component-BeiJZnEv.mjs.map} +1 -1
  111. package/fesm2022/{acorex-platform-common-lookup-widget-column.component-Cxv1yZvE.mjs → acorex-platform-common-lookup-widget-column.component-C5DZ-cez.mjs} +3 -3
  112. package/fesm2022/{acorex-platform-common-lookup-widget-column.component-Cxv1yZvE.mjs.map → acorex-platform-common-lookup-widget-column.component-C5DZ-cez.mjs.map} +1 -1
  113. package/fesm2022/{acorex-platform-common-lookup-widget-edit.component-CUtGoAGX.mjs → acorex-platform-common-lookup-widget-edit.component-uopyJIC1.mjs} +3 -3
  114. package/fesm2022/{acorex-platform-common-lookup-widget-edit.component-CUtGoAGX.mjs.map → acorex-platform-common-lookup-widget-edit.component-uopyJIC1.mjs.map} +1 -1
  115. package/fesm2022/{acorex-platform-common-lookup-widget-filter.component-DJZqB3vj.mjs → acorex-platform-common-lookup-widget-filter.component-D1lrIkz4.mjs} +3 -3
  116. package/fesm2022/{acorex-platform-common-lookup-widget-filter.component-DJZqB3vj.mjs.map → acorex-platform-common-lookup-widget-filter.component-D1lrIkz4.mjs.map} +1 -1
  117. package/fesm2022/{acorex-platform-common-lookup-widget-view.component-CghJK1C4.mjs → acorex-platform-common-lookup-widget-view.component-DTNcGNir.mjs} +3 -3
  118. package/fesm2022/{acorex-platform-common-lookup-widget-view.component-CghJK1C4.mjs.map → acorex-platform-common-lookup-widget-view.component-DTNcGNir.mjs.map} +1 -1
  119. package/fesm2022/{acorex-platform-common-map-widget-edit.component-oSb3kVMc.mjs → acorex-platform-common-map-widget-edit.component-h4SRiV6_.mjs} +3 -3
  120. package/fesm2022/{acorex-platform-common-map-widget-edit.component-oSb3kVMc.mjs.map → acorex-platform-common-map-widget-edit.component-h4SRiV6_.mjs.map} +1 -1
  121. package/fesm2022/{acorex-platform-common-map-widget-view.component-BrYwr914.mjs → acorex-platform-common-map-widget-view.component-Deos8gVy.mjs} +3 -3
  122. package/fesm2022/{acorex-platform-common-map-widget-view.component-BrYwr914.mjs.map → acorex-platform-common-map-widget-view.component-Deos8gVy.mjs.map} +1 -1
  123. package/fesm2022/{acorex-platform-common-messenger-widget-column.component-DIJAffxy.mjs → acorex-platform-common-messenger-widget-column.component-DN8dFLZD.mjs} +3 -3
  124. package/fesm2022/{acorex-platform-common-messenger-widget-column.component-DIJAffxy.mjs.map → acorex-platform-common-messenger-widget-column.component-DN8dFLZD.mjs.map} +1 -1
  125. package/fesm2022/{acorex-platform-common-messenger-widget-edit.component-DpGvbM4a.mjs → acorex-platform-common-messenger-widget-edit.component-m_zxHCw5.mjs} +3 -3
  126. package/fesm2022/{acorex-platform-common-messenger-widget-edit.component-DpGvbM4a.mjs.map → acorex-platform-common-messenger-widget-edit.component-m_zxHCw5.mjs.map} +1 -1
  127. package/fesm2022/{acorex-platform-common-messenger-widget-view.component-CeuDEI-j.mjs → acorex-platform-common-messenger-widget-view.component-DA9MiNb9.mjs} +3 -3
  128. package/fesm2022/{acorex-platform-common-messenger-widget-view.component-CeuDEI-j.mjs.map → acorex-platform-common-messenger-widget-view.component-DA9MiNb9.mjs.map} +1 -1
  129. package/fesm2022/{acorex-platform-common-number-widget-edit.component-B1YGwr60.mjs → acorex-platform-common-number-widget-edit.component-B0if4vR4.mjs} +3 -3
  130. package/fesm2022/{acorex-platform-common-number-widget-edit.component-B1YGwr60.mjs.map → acorex-platform-common-number-widget-edit.component-B0if4vR4.mjs.map} +1 -1
  131. package/fesm2022/{acorex-platform-common-number-widget-filter.component-BmmgPy1w.mjs → acorex-platform-common-number-widget-filter.component-BgTJbR2u.mjs} +3 -3
  132. package/fesm2022/{acorex-platform-common-number-widget-filter.component-BmmgPy1w.mjs.map → acorex-platform-common-number-widget-filter.component-BgTJbR2u.mjs.map} +1 -1
  133. package/fesm2022/{acorex-platform-common-number-widget-view.component-bqylVHOz.mjs → acorex-platform-common-number-widget-view.component-Du1oQYBH.mjs} +3 -3
  134. package/fesm2022/{acorex-platform-common-number-widget-view.component-bqylVHOz.mjs.map → acorex-platform-common-number-widget-view.component-Du1oQYBH.mjs.map} +1 -1
  135. package/fesm2022/{acorex-platform-common-password-widget-column.component-DVdZh7s4.mjs → acorex-platform-common-password-widget-column.component-CEWtRX1S.mjs} +3 -3
  136. package/fesm2022/{acorex-platform-common-password-widget-column.component-DVdZh7s4.mjs.map → acorex-platform-common-password-widget-column.component-CEWtRX1S.mjs.map} +1 -1
  137. package/fesm2022/{acorex-platform-common-password-widget-edit.component-OjHwMT5d.mjs → acorex-platform-common-password-widget-edit.component-B-_m6f_C.mjs} +3 -3
  138. package/fesm2022/{acorex-platform-common-password-widget-edit.component-OjHwMT5d.mjs.map → acorex-platform-common-password-widget-edit.component-B-_m6f_C.mjs.map} +1 -1
  139. package/fesm2022/{acorex-platform-common-password-widget-view.component-BeSk1OgU.mjs → acorex-platform-common-password-widget-view.component-BVW-Zak-.mjs} +3 -3
  140. package/fesm2022/{acorex-platform-common-password-widget-view.component-BeSk1OgU.mjs.map → acorex-platform-common-password-widget-view.component-BVW-Zak-.mjs.map} +1 -1
  141. package/fesm2022/{acorex-platform-common-phone-widget-column.component-DOfzGKBi.mjs → acorex-platform-common-phone-widget-column.component-DGaGGltV.mjs} +3 -3
  142. package/fesm2022/{acorex-platform-common-phone-widget-column.component-DOfzGKBi.mjs.map → acorex-platform-common-phone-widget-column.component-DGaGGltV.mjs.map} +1 -1
  143. package/fesm2022/{acorex-platform-common-phone-widget-edit.component-BJ-iEyLP.mjs → acorex-platform-common-phone-widget-edit.component-BNfAQ_4j.mjs} +3 -3
  144. package/fesm2022/{acorex-platform-common-phone-widget-edit.component-BJ-iEyLP.mjs.map → acorex-platform-common-phone-widget-edit.component-BNfAQ_4j.mjs.map} +1 -1
  145. package/fesm2022/{acorex-platform-common-phone-widget-view.component-DW4AHCE6.mjs → acorex-platform-common-phone-widget-view.component-xGygt5Y9.mjs} +3 -3
  146. package/fesm2022/{acorex-platform-common-phone-widget-view.component-DW4AHCE6.mjs.map → acorex-platform-common-phone-widget-view.component-xGygt5Y9.mjs.map} +1 -1
  147. package/fesm2022/{acorex-platform-common-rich-text-widget-column.component-2zZBG6Ze.mjs → acorex-platform-common-rich-text-widget-column.component-BJYxnZm2.mjs} +3 -3
  148. package/fesm2022/{acorex-platform-common-rich-text-widget-column.component-2zZBG6Ze.mjs.map → acorex-platform-common-rich-text-widget-column.component-BJYxnZm2.mjs.map} +1 -1
  149. package/fesm2022/{acorex-platform-common-rich-text-widget-edit.component-BJveJgHZ.mjs → acorex-platform-common-rich-text-widget-edit.component-Dvv8JnXl.mjs} +3 -3
  150. package/fesm2022/{acorex-platform-common-rich-text-widget-edit.component-BJveJgHZ.mjs.map → acorex-platform-common-rich-text-widget-edit.component-Dvv8JnXl.mjs.map} +1 -1
  151. package/fesm2022/{acorex-platform-common-rich-text-widget-view.component-CiViWpBX.mjs → acorex-platform-common-rich-text-widget-view.component-B77Y5luo.mjs} +3 -3
  152. package/fesm2022/{acorex-platform-common-rich-text-widget-view.component-CiViWpBX.mjs.map → acorex-platform-common-rich-text-widget-view.component-B77Y5luo.mjs.map} +1 -1
  153. package/fesm2022/{acorex-platform-common-selection-list-widget-column.component-D9lsVFgo.mjs → acorex-platform-common-selection-list-widget-column.component-1zPVFgFG.mjs} +3 -3
  154. package/fesm2022/{acorex-platform-common-selection-list-widget-column.component-D9lsVFgo.mjs.map → acorex-platform-common-selection-list-widget-column.component-1zPVFgFG.mjs.map} +1 -1
  155. package/fesm2022/{acorex-platform-common-selection-list-widget-edit.component-ocEwyUP7.mjs → acorex-platform-common-selection-list-widget-edit.component-Tdkf-0cn.mjs} +3 -3
  156. package/fesm2022/{acorex-platform-common-selection-list-widget-edit.component-ocEwyUP7.mjs.map → acorex-platform-common-selection-list-widget-edit.component-Tdkf-0cn.mjs.map} +1 -1
  157. package/fesm2022/{acorex-platform-common-selection-list-widget-filter.component-CS0f_jCx.mjs → acorex-platform-common-selection-list-widget-filter.component-y2aFk-A6.mjs} +3 -3
  158. package/fesm2022/{acorex-platform-common-selection-list-widget-filter.component-CS0f_jCx.mjs.map → acorex-platform-common-selection-list-widget-filter.component-y2aFk-A6.mjs.map} +1 -1
  159. package/fesm2022/{acorex-platform-common-selection-list-widget-view.component-C65lbpo_.mjs → acorex-platform-common-selection-list-widget-view.component-DLc1MHex.mjs} +3 -3
  160. package/fesm2022/{acorex-platform-common-selection-list-widget-view.component-C65lbpo_.mjs.map → acorex-platform-common-selection-list-widget-view.component-DLc1MHex.mjs.map} +1 -1
  161. package/fesm2022/{acorex-platform-common-signature-pad-widget-edit.component-DbfQSGxm.mjs → acorex-platform-common-signature-pad-widget-edit.component-qUuwwYlj.mjs} +3 -3
  162. package/fesm2022/{acorex-platform-common-signature-pad-widget-edit.component-DbfQSGxm.mjs.map → acorex-platform-common-signature-pad-widget-edit.component-qUuwwYlj.mjs.map} +1 -1
  163. package/fesm2022/{acorex-platform-common-signature-pad-widget-view.component-CDY3JdP-.mjs → acorex-platform-common-signature-pad-widget-view.component-D5XVZ88b.mjs} +3 -3
  164. package/fesm2022/{acorex-platform-common-signature-pad-widget-view.component-CDY3JdP-.mjs.map → acorex-platform-common-signature-pad-widget-view.component-D5XVZ88b.mjs.map} +1 -1
  165. package/fesm2022/{acorex-platform-common-string-widget-filter.component-BW2ehdOx.mjs → acorex-platform-common-string-widget-filter.component-B9h7CnEz.mjs} +3 -3
  166. package/fesm2022/{acorex-platform-common-string-widget-filter.component-BW2ehdOx.mjs.map → acorex-platform-common-string-widget-filter.component-B9h7CnEz.mjs.map} +1 -1
  167. package/fesm2022/{acorex-platform-common-text-widget-column.component-bhx0QWAX.mjs → acorex-platform-common-text-widget-column.component-LFKeHZbS.mjs} +3 -3
  168. package/fesm2022/{acorex-platform-common-text-widget-column.component-bhx0QWAX.mjs.map → acorex-platform-common-text-widget-column.component-LFKeHZbS.mjs.map} +1 -1
  169. package/fesm2022/{acorex-platform-common-text-widget-edit.component-Cb1k59hs.mjs → acorex-platform-common-text-widget-edit.component-BiyTKmvV.mjs} +3 -3
  170. package/fesm2022/{acorex-platform-common-text-widget-edit.component-Cb1k59hs.mjs.map → acorex-platform-common-text-widget-edit.component-BiyTKmvV.mjs.map} +1 -1
  171. package/fesm2022/{acorex-platform-common-text-widget-view.component-CGwY9c2O.mjs → acorex-platform-common-text-widget-view.component-BDxpsxE6.mjs} +3 -3
  172. package/fesm2022/{acorex-platform-common-text-widget-view.component-CGwY9c2O.mjs.map → acorex-platform-common-text-widget-view.component-BDxpsxE6.mjs.map} +1 -1
  173. package/fesm2022/{acorex-platform-common-toggle-widget-column.component-BxAwa7jw.mjs → acorex-platform-common-toggle-widget-column.component-BnmR9hFM.mjs} +3 -3
  174. package/fesm2022/{acorex-platform-common-toggle-widget-column.component-BxAwa7jw.mjs.map → acorex-platform-common-toggle-widget-column.component-BnmR9hFM.mjs.map} +1 -1
  175. package/fesm2022/{acorex-platform-common-toggle-widget-edit.component-CT2fRAKm.mjs → acorex-platform-common-toggle-widget-edit.component-Cz7LayX-.mjs} +3 -3
  176. package/fesm2022/{acorex-platform-common-toggle-widget-edit.component-CT2fRAKm.mjs.map → acorex-platform-common-toggle-widget-edit.component-Cz7LayX-.mjs.map} +1 -1
  177. package/fesm2022/{acorex-platform-common-toggle-widget-view.component-9tquFHhE.mjs → acorex-platform-common-toggle-widget-view.component-Cq2-5QUg.mjs} +3 -3
  178. package/fesm2022/{acorex-platform-common-toggle-widget-view.component-9tquFHhE.mjs.map → acorex-platform-common-toggle-widget-view.component-Cq2-5QUg.mjs.map} +1 -1
  179. package/fesm2022/acorex-platform-common.mjs +520 -514
  180. package/fesm2022/acorex-platform-common.mjs.map +1 -1
  181. package/fesm2022/acorex-platform-layout-builder.mjs +125 -53
  182. package/fesm2022/acorex-platform-layout-builder.mjs.map +1 -1
  183. package/fesm2022/acorex-platform-layout-designer.mjs +58 -55
  184. package/fesm2022/acorex-platform-layout-designer.mjs.map +1 -1
  185. package/fesm2022/acorex-platform-layout-entity.mjs +50 -36
  186. package/fesm2022/acorex-platform-layout-entity.mjs.map +1 -1
  187. package/fesm2022/{acorex-platform-themes-default-entity-master-create-view.component-i6vjEhti.mjs → acorex-platform-themes-default-entity-master-create-view.component-dByV3T8-.mjs} +7 -7
  188. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-dByV3T8-.mjs.map +1 -0
  189. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-mzb-FV9E.mjs +299 -0
  190. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-mzb-FV9E.mjs.map +1 -0
  191. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CdwlY0Fa.mjs +88 -0
  192. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-CdwlY0Fa.mjs.map +1 -0
  193. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-ItkFB3QF.mjs +150 -0
  194. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-ItkFB3QF.mjs.map +1 -0
  195. package/fesm2022/acorex-platform-themes-default.mjs +21 -18
  196. package/fesm2022/acorex-platform-themes-default.mjs.map +1 -1
  197. package/fesm2022/acorex-platform-themes-shared.mjs +42 -491
  198. package/fesm2022/acorex-platform-themes-shared.mjs.map +1 -1
  199. package/fesm2022/{acorex-platform-widgets-template-widget-edit.component-gvAh-gH1.mjs → acorex-platform-widgets-template-widget-edit.component-BWc0_EA0.mjs} +2 -2
  200. package/fesm2022/{acorex-platform-widgets-template-widget-edit.component-gvAh-gH1.mjs.map → acorex-platform-widgets-template-widget-edit.component-BWc0_EA0.mjs.map} +1 -1
  201. package/fesm2022/acorex-platform-widgets.mjs +257 -194
  202. package/fesm2022/acorex-platform-widgets.mjs.map +1 -1
  203. package/layout/builder/lib/builder/builder.service.d.ts +2 -0
  204. package/layout/builder/lib/builder/datasource-provider.service.d.ts +24 -0
  205. package/layout/builder/lib/builder/index.d.ts +1 -0
  206. package/layout/builder/lib/builder/widget-container.component.d.ts +0 -1
  207. package/layout/builder/lib/builder/widget-renderer.component.directive.d.ts +1 -1
  208. package/layout/builder/lib/builder/widget.types.d.ts +13 -9
  209. package/layout/designer/lib/designer/components/board/board.component.d.ts +0 -1
  210. package/layout/designer/lib/designer/components/drawers/data-sources/data-sources.component.d.ts +6 -4
  211. package/layout/designer/lib/designer/designer.component.d.ts +0 -1
  212. package/layout/designer/lib/designer/shared/designer-connector.service.d.ts +1 -4
  213. package/layout/designer/lib/designer/shared/designer.service.d.ts +0 -2
  214. package/layout/designer/lib/designer/shared/designer.types.d.ts +0 -4
  215. package/layout/designer/lib/preview/preview-viewer.component.d.ts +8 -1
  216. package/layout/designer/lib/property-viewer/widget-property-viewer.component.d.ts +6 -2
  217. package/layout/entity/lib/entity-master-create.viewmodel.d.ts +1 -1
  218. package/layout/entity/lib/entity-master-single.viewmodel.d.ts +1 -1
  219. package/layout/entity/lib/entity-master-update.viewmodel.d.ts +1 -1
  220. package/layout/entity/lib/entity.config.d.ts +1 -1
  221. package/layout/entity/lib/entity.service.d.ts +7 -0
  222. package/layout/entity/lib/entity.viewmodel.d.ts +1 -1
  223. package/layout/entity/lib/index.d.ts +1 -0
  224. package/layout/entity/lib/widgets/lookup-widget/lookup-widget-selector.viewmodel.d.ts +2 -2
  225. package/package.json +17 -17
  226. package/themes/default/lib/layouts/root-layout/root-layout.module.d.ts +14 -13
  227. package/themes/shared/index.d.ts +0 -4
  228. package/themes/shared/lib/shared.module.d.ts +2 -1
  229. package/widgets/lib/widgets/editors/color/color-box-widget-view.component.d.ts +3 -0
  230. package/widgets/lib/widgets/editors/date-time/date-time-box-widget-column.component.d.ts +2 -4
  231. package/widgets/lib/widgets/editors/date-time/date-time-box-widget-view.component.d.ts +1 -0
  232. package/widgets/lib/widgets/editors/rich-text/rich-text-widget-edit.component.d.ts +3 -4
  233. package/widgets/lib/widgets/editors/select/index.d.ts +2 -2
  234. package/widgets/lib/widgets/editors/select/select-box-widget-edit.component.d.ts +3 -6
  235. package/widgets/lib/widgets/editors/selection-list/selection-list-widget-designer.component.d.ts +5 -6
  236. package/widgets/lib/widgets/editors/selection-list/selection-list-widget-edit.component.d.ts +4 -5
  237. package/esm2022/themes/shared/lib/comments/comment-list-view.component.mjs +0 -429
  238. package/esm2022/themes/shared/lib/comments/comment-lookup-popup.component.mjs +0 -56
  239. package/esm2022/themes/shared/lib/comments/comments.service.mjs +0 -4
  240. package/esm2022/themes/shared/lib/comments/comments.type.mjs +0 -2
  241. package/fesm2022/acorex-platform-themes-default-entity-master-create-view.component-i6vjEhti.mjs.map +0 -1
  242. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BGKWaCth.mjs +0 -298
  243. package/fesm2022/acorex-platform-themes-default-entity-master-list-view.component-BGKWaCth.mjs.map +0 -1
  244. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-B3phYOIw.mjs +0 -88
  245. package/fesm2022/acorex-platform-themes-default-entity-master-modify-view.component-B3phYOIw.mjs.map +0 -1
  246. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DyZHE0o-.mjs +0 -148
  247. package/fesm2022/acorex-platform-themes-default-entity-master-single-view.component-DyZHE0o-.mjs.map +0 -1
  248. package/themes/shared/lib/comments/comment-list-view.component.d.ts +0 -66
  249. package/themes/shared/lib/comments/comment-lookup-popup.component.d.ts +0 -10
  250. package/themes/shared/lib/comments/comments.service.d.ts +0 -5
  251. package/themes/shared/lib/comments/comments.type.d.ts +0 -74
@@ -1,429 +0,0 @@
1
- import { AXCommentModule } from '@acorex/components/comment';
2
- import { AXDecoratorModule } from '@acorex/components/decorators';
3
- import { AXWysiwygModule } from '@acorex/components/wysiwyg';
4
- import { CommonModule } from '@angular/common';
5
- import { ChangeDetectionStrategy, Component, computed, inject, signal, viewChild } from '@angular/core';
6
- import { FormsModule } from '@angular/forms';
7
- import { ActivatedRoute, RouterModule } from '@angular/router';
8
- import { AXAvatarModule } from '@acorex/components/avatar';
9
- import { AXButtonModule } from '@acorex/components/button';
10
- import { AXDialogService } from '@acorex/components/dialog';
11
- import { AXDropdownModule } from '@acorex/components/dropdown';
12
- import { AXDropdownButtonModule } from '@acorex/components/dropdown-button';
13
- import { AXFormModule } from '@acorex/components/form';
14
- import { AXImageModule } from '@acorex/components/image';
15
- import { AXLabelModule } from '@acorex/components/label';
16
- import { AXLoadingModule } from '@acorex/components/loading';
17
- import { AXPopupService } from '@acorex/components/popup';
18
- import { AXSelectBoxModule } from '@acorex/components/select-box';
19
- import { AXSkeletonModule } from '@acorex/components/skeleton';
20
- import { AXTextBoxModule } from '@acorex/components/text-box';
21
- import { AXToastService } from '@acorex/components/toast';
22
- import { AXFormatModule } from '@acorex/core/format';
23
- import { AXPlatform } from '@acorex/core/platform';
24
- import { AXPHtmlUtils } from '@acorex/platform/core';
25
- import { AXPCommentLookupPopup } from './comment-lookup-popup.component';
26
- import { AXPCommentService } from './comments.service';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "@angular/forms";
29
- import * as i2 from "@angular/common";
30
- import * as i3 from "@acorex/components/decorators";
31
- import * as i4 from "@acorex/components/comment";
32
- import * as i5 from "@acorex/components/wysiwyg";
33
- import * as i6 from "@acorex/components/button";
34
- import * as i7 from "@acorex/components/avatar";
35
- import * as i8 from "@acorex/components/image";
36
- import * as i9 from "@acorex/components/form";
37
- import * as i10 from "@acorex/components/loading";
38
- import * as i11 from "@acorex/components/dropdown-button";
39
- import * as i12 from "@acorex/components/dropdown";
40
- import * as i13 from "@acorex/core/format";
41
- import * as i14 from "@acorex/components/skeleton";
42
- export class AXPCommentListViewComponent {
43
- constructor() {
44
- this.hasCooldown = signal(false);
45
- this.commentContent = signal('');
46
- this.isSubmitting = signal(false);
47
- this.isReplyingMode = signal(false);
48
- this.isEditingMode = signal(false);
49
- this.isLoading = signal(true);
50
- this.failedImageIds = signal([]);
51
- this.activeReplyComment = signal(undefined);
52
- this.activeEditComment = signal(undefined);
53
- this.wysiwygEditor = viewChild.required('w');
54
- this.commentService = inject(AXPCommentService);
55
- this.platform = inject(AXPlatform);
56
- this.route = inject(ActivatedRoute);
57
- this.popupService = inject(AXPopupService);
58
- this.toastService = inject(AXToastService);
59
- this.dialogService = inject(AXDialogService);
60
- this.htmlUtils = inject(AXPHtmlUtils);
61
- this.routeParams = this.route.snapshot;
62
- this.getPayload = computed(() => ({
63
- params: this.payload(),
64
- skip: 0,
65
- take: 10,
66
- }));
67
- this.payload = computed(() => ({
68
- roomType: 'default',
69
- entityId: this.routeParams.params?.['module'] + '.' + this.routeParams.params?.['entity'],
70
- instanceId: this.routeParams.params?.['id'],
71
- }));
72
- this.comments = signal([]);
73
- this.wysiwyg = viewChild('w');
74
- this.wysiwygOptions = signal({
75
- look: 'solid',
76
- });
77
- this.avatarConfig = signal({
78
- color: 'primary',
79
- look: 'rounded',
80
- type: 'solid', // 'image' | 'text' | 'icon' | 'default'
81
- });
82
- this.validateContent = (content) => {
83
- let isValid = true;
84
- if (!content || content === '<p><br></p>') {
85
- isValid = false;
86
- }
87
- return {
88
- rule: 'callback',
89
- result: isValid,
90
- message: isValid ? '' : 'Please fill the content',
91
- value: content,
92
- };
93
- };
94
- }
95
- ngOnInit() {
96
- this.loadComments();
97
- }
98
- sanitizeHtml(htmlContent) {
99
- return this.htmlUtils.getSafeHTMLfromHTML(htmlContent);
100
- }
101
- handleImageError(imageId) {
102
- this.failedImageIds.update((ids) => [...ids, imageId]);
103
- }
104
- checkImageExists(imageId) {
105
- return !this.failedImageIds().includes(imageId);
106
- }
107
- extractInitials(name) {
108
- const words = name.split(' ');
109
- const initials = words.map((word) => word.charAt(0).toUpperCase());
110
- return initials.join('');
111
- }
112
- async loadComments() {
113
- this.isLoading.set(true);
114
- // const response = await this.commentService.get(this.payload());
115
- const response = await this.commentService.query(this.getPayload());
116
- this.comments.set(response.items);
117
- setTimeout(() => {
118
- this.isLoading.set(false);
119
- }, 250);
120
- }
121
- editMessage(comment, reply) {
122
- this.isReplyingMode.set(false);
123
- this.activeReplyComment.set(undefined);
124
- this.isEditingMode.set(true);
125
- this.activeEditComment.set(comment);
126
- const contentToEdit = reply ? reply.content : comment.content;
127
- this.commentContent.set(contentToEdit);
128
- document.getElementsByClassName('ql-editor')[0].innerHTML = contentToEdit;
129
- this.wysiwygEditor().getHostElement().scrollIntoView({ behavior: 'smooth', block: 'start' });
130
- }
131
- replyMessage(comment, reply) {
132
- this.isEditingMode.set(false);
133
- this.activeEditComment.set(undefined);
134
- this.isReplyingMode.set(true);
135
- this.activeReplyComment.set(comment);
136
- if (reply) {
137
- const mention = `<a data-id="${reply.id}">@${reply.user?.userName}</a> `;
138
- this.commentContent.set(mention);
139
- this.wysiwyg()?.focus();
140
- document.getElementsByClassName('ql-editor')[0].innerHTML = mention;
141
- }
142
- this.wysiwygEditor().getHostElement().scrollIntoView({ behavior: 'smooth', block: 'start' });
143
- }
144
- async deleteComment(comment) {
145
- const dialog = this.dialogService.open({
146
- icon: 'fa-regular fa-warning',
147
- content: 'Are you sure you want to delete this comment?',
148
- title: 'Delete Comment',
149
- type: 'danger',
150
- orientation: 'horizontal',
151
- buttons: [
152
- {
153
- text: 'Delete',
154
- color: 'danger',
155
- onClick: async (e) => {
156
- e.handled = true;
157
- e.source.text = 'Deleting...';
158
- e.source.disabled = true;
159
- e.source.loading = true;
160
- try {
161
- await this.commentService.deleteOne(comment.id);
162
- this.removeMessageById(comment.id);
163
- this.toastService.show({
164
- content: 'Comment deleted successfully.',
165
- color: 'success',
166
- location: 'bottom-center',
167
- closeButton: true,
168
- timeOut: 3000,
169
- timeOutProgress: true,
170
- });
171
- (this.isEditingMode() && this.activeEditComment()?.id === comment.id) || this.resetReplyEditState;
172
- dialog.close();
173
- }
174
- catch (error) {
175
- this.toastService.show({
176
- content: typeof error === 'string' ? error : 'Failed to delete comment!',
177
- color: 'danger',
178
- location: 'bottom-center',
179
- closeButton: true,
180
- timeOut: 3000,
181
- timeOutProgress: true,
182
- });
183
- }
184
- },
185
- },
186
- {
187
- text: 'Cancel',
188
- color: 'ghost',
189
- autofocus: true,
190
- onClick: (e) => {
191
- dialog.close();
192
- },
193
- },
194
- ],
195
- closeButton: false,
196
- });
197
- }
198
- async deleteReply(comment, reply) {
199
- const dialog = this.dialogService.open({
200
- icon: 'fa-regular fa-warning',
201
- content: 'Are you sure you want to delete this reply?',
202
- title: 'Delete Reply',
203
- type: 'danger',
204
- orientation: 'horizontal',
205
- buttons: [
206
- {
207
- text: 'Delete',
208
- color: 'danger',
209
- onClick: async (e) => {
210
- e.handled = true;
211
- e.source.text = 'Deleting...';
212
- e.source.disabled = true;
213
- e.source.loading = true;
214
- try {
215
- await this.commentService.deleteOne(comment.id);
216
- this.removeMessageById(comment.id, reply.id);
217
- this.toastService.show({
218
- content: 'Comment deleted successfully.',
219
- color: 'success',
220
- location: 'bottom-center',
221
- closeButton: true,
222
- timeOut: 3000,
223
- timeOutProgress: true,
224
- });
225
- dialog.close();
226
- }
227
- catch (error) {
228
- this.toastService.show({
229
- content: typeof error === 'string' ? error : 'Failed to delete comment!',
230
- color: 'danger',
231
- location: 'bottom-center',
232
- closeButton: true,
233
- timeOut: 3000,
234
- timeOutProgress: true,
235
- });
236
- }
237
- },
238
- },
239
- {
240
- text: 'Cancel',
241
- color: 'ghost',
242
- autofocus: true,
243
- onClick: (e) => {
244
- dialog.close();
245
- },
246
- },
247
- ],
248
- closeButton: false,
249
- });
250
- }
251
- resetReplyEditState() {
252
- this.isEditingMode.set(false);
253
- this.activeEditComment.set(undefined);
254
- this.isReplyingMode.set(false);
255
- this.activeReplyComment.set(undefined);
256
- }
257
- async toggleLike(comment, reply) {
258
- if (reply) {
259
- this.updateLikeStatus(comment.id, reply.id);
260
- const payload = {
261
- messageId: reply.id,
262
- type: 'like',
263
- };
264
- try {
265
- await this.commentService.like(payload);
266
- }
267
- catch (error) {
268
- this.updateLikeStatus(comment.id, reply.id);
269
- }
270
- }
271
- else {
272
- this.updateLikeStatus(comment.id);
273
- const payload = {
274
- messageId: comment.id,
275
- type: 'like',
276
- };
277
- try {
278
- await this.commentService.like(payload);
279
- }
280
- catch (error) {
281
- this.updateLikeStatus(comment.id);
282
- }
283
- }
284
- }
285
- updateLikeStatus(commentId, replyId) {
286
- this.comments.update((commentsList) => {
287
- return commentsList.map((comment) => {
288
- if (comment.id === commentId) {
289
- if (replyId) {
290
- const updatedReplies = comment.replies?.map((reply) => reply.id === replyId
291
- ? {
292
- ...reply,
293
- isLiked: !reply.isLiked,
294
- reactionsCount: reply.isLiked ? --reply.reactionsCount : ++reply.reactionsCount,
295
- }
296
- : reply);
297
- return {
298
- ...comment,
299
- replies: updatedReplies,
300
- };
301
- }
302
- else {
303
- return {
304
- ...comment,
305
- isLiked: !comment.isLiked,
306
- reactionsCount: comment.isLiked ? --comment.reactionsCount : ++comment.reactionsCount,
307
- };
308
- }
309
- }
310
- return comment;
311
- });
312
- });
313
- }
314
- removeMessageById(commentId, replyId) {
315
- this.comments.update((commentsList) => commentsList
316
- .map((comment) => {
317
- if (comment.id === commentId) {
318
- if (replyId) {
319
- return {
320
- ...comment,
321
- replies: comment.replies?.filter((reply) => reply.id !== replyId),
322
- };
323
- }
324
- return null;
325
- }
326
- return comment;
327
- })
328
- .filter((comment) => comment !== null));
329
- }
330
- async submitComment(isPrivate = false) {
331
- if (!this.validateContent(this.commentContent()).result) {
332
- return;
333
- }
334
- let memberLookup;
335
- if (isPrivate) {
336
- const popupConfig = {
337
- header: true,
338
- size: 'md',
339
- draggable: true,
340
- hasBackdrop: true,
341
- closeButton: true,
342
- closeOnBackdropClick: false,
343
- };
344
- const popup = await this.popupService.open(AXPCommentLookupPopup, popupConfig);
345
- memberLookup = popup.data?.data?.lookup;
346
- }
347
- if (this.isEditingMode()) {
348
- const payload = {
349
- content: this.commentContent(),
350
- };
351
- //todo why ? need not nullable id !-!
352
- await this.commentService.updateOne(this.activeEditComment()?.id, payload);
353
- this.isSubmitting.set(true);
354
- this.hasCooldown.set(true);
355
- this.isEditingMode.set(false);
356
- this.activeEditComment.set(undefined);
357
- }
358
- else {
359
- const payload = {
360
- ...this.payload(),
361
- content: this.commentContent(),
362
- contentType: 'text',
363
- isPrivate: isPrivate,
364
- replyId: this.activeReplyComment()?.id ?? null,
365
- //members: isPrivate ? [memberLookup] : [],
366
- };
367
- await this.commentService.insertOne(payload);
368
- this.isSubmitting.set(true);
369
- this.hasCooldown.set(true);
370
- this.isReplyingMode.set(false);
371
- this.activeReplyComment.set(undefined);
372
- }
373
- const response = await this.commentService.query(this.getPayload());
374
- this.comments.set(response.items);
375
- this.commentContent.set('');
376
- document.getElementsByClassName('ql-editor')[0].innerHTML = '';
377
- this.isSubmitting.set(false);
378
- setTimeout(() => {
379
- this.hasCooldown.set(false);
380
- }, 1000);
381
- }
382
- scrollMain() {
383
- console.log('clicked');
384
- debugger;
385
- //
386
- const comment = this.isReplyingMode() ? this.activeReplyComment() : this.activeEditComment();
387
- const el = document.getElementById(comment.id);
388
- if (el) {
389
- el.scrollIntoView({ behavior: 'smooth', block: 'center' });
390
- const content = el?.firstElementChild?.children[1];
391
- const prevBg = content.style.background;
392
- content.style.borderRadius = '0.25rem';
393
- content.style.transition = 'background 1s ease-in-out';
394
- content.style.background = `rgba(var(--ax-color-on-surface), var(--tw-bg-opacity))`;
395
- setTimeout(() => {
396
- content.style.background = prevBg || 'rgba(0, 0, 0, 0)';
397
- }, 1000);
398
- }
399
- }
400
- calcDefrenetTime(date) {
401
- return date ? Date.now() - date.getTime() : undefined;
402
- }
403
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPCommentListViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
404
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: AXPCommentListViewComponent, isStandalone: true, selector: "axp-comment-list-view", viewQueries: [{ propertyName: "wysiwygEditor", first: true, predicate: ["w"], descendants: true, isSignal: true }, { propertyName: "wysiwyg", first: true, predicate: ["w"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"ax-mt-2\">\n <ax-comment-container>\n @if(isLoading()){\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-surface ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if(!isLoading() && comments().length > 0){\n <ax-comment-view class=\"ax-bg-surface\">\n @for(comment of comments(); track comment.id){\n <ax-comment-item [id]=\"comment.id!\" [replyCount]=\"comment.replies?.length ?? 0\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(comment.id!) && comment.user && comment.user.picture){\n <ax-image (onError)=\"handleImageError(comment.id!)\" [src]=\"comment.user!.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(comment.user?.firstName + ' ' + comment.user?.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ comment.user?.firstName + ' ' + comment.user?.lastName }}</ax-title>\n <ax-comment-date>{{ calcDefrenetTime(comment.createdAt) | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteComment(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [liked]=\"comment.isLiked\">\n {{ comment.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment)\"></ax-comment-reply-text>\n @for(reply of comment.replies; track reply.id){\n <ax-comment-item [id]=\"reply.id\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(reply && checkImageExists(reply.id!) && reply.user && reply.user.picture){\n <ax-image (onError)=\"handleImageError(reply!.id!)\" [src]=\"reply.user!.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(reply.user?.firstName + ' ' + reply.user?.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ (reply?.user?.firstName ?? '') + ' ' + (reply?.user?.lastName ?? '') }}</ax-title>\n <ax-comment-date>{{ calcDefrenetTime(reply.createdAt) | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteReply(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment, reply)\" [liked]=\"reply.isLiked\">\n {{ reply.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment, reply)\"></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n } </ax-comment-view\n >} @else{\n <div>\n <div class=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-pb-2\">\n There is no Comment!\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <ax-form>\n <ax-form-field>\n <div>\n @if(isReplyingMode() || isEditingMode()){\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-b-0 ax-rounded-lg ax-bg-on-surface ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-solid ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div\n class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\"\n >\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n {{ isReplyingMode() ? 'Reply to ' : 'Edit Message' }}\n <span class=\"ax-font-bold\">\n {{\n isReplyingMode()\n ? activeReplyComment()?.user?.firstName + ' ' + activeReplyComment()?.user?.lastName\n : ''\n }}\n </span>\n </p>\n <div\n class=\"ax-truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.content ?? '')\n : sanitizeHtml(activeEditComment()?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-solid ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n <ax-suffix>\n <ax-dropdown-button\n [disabled]=\"hasCooldown()\"\n type=\"submit\"\n color=\"primary\"\n mode=\"split\"\n text=\"Send\"\n (onClick)=\"submitComment()\"\n >\n @if(isSubmitting()){ <ax-loading></ax-loading> }\n <ax-button-item-list>\n <ax-button-item (click)=\"submitComment(true)\" text=\"Send Private ...\" name=\"private\" data=\"private\">\n <ax-prefix>\n <ax-icon icon=\"fa-regular fa-user-secret\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n <ax-validation-rule rule=\"callback\" [options]=\"{ validate: validateContent }\"></ax-validation-rule>\n </ax-wysiwyg-container>\n </div>\n </ax-form-field>\n </ax-form>\n</div>\n", styles: ["ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i3.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i3.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-sub-title, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXCommentModule }, { kind: "component", type: i4.AXCommentViewComponent, selector: "ax-comment-view" }, { kind: "component", type: i4.AXCommentContainerComponent, selector: "ax-comment-container" }, { kind: "component", type: i4.AxCommentItemComponent, selector: "ax-comment-item", inputs: ["replyCount"] }, { kind: "component", type: i4.AXCommentLikeComponent, selector: "ax-comment-like", inputs: ["liked"] }, { kind: "component", type: i4.AXMenuOptionsComponent, selector: "ax-comment-menu-options" }, { kind: "component", type: i4.AXCommentReplyTextComponent, selector: "ax-comment-reply-text" }, { kind: "component", type: i4.AXCommentDateComponent, selector: "ax-comment-date" }, { kind: "ngmodule", type: AXWysiwygModule }, { kind: "component", type: i5.AXWysiwygContainerComponent, selector: "ax-wysiwyg-container", inputs: ["look", "placeHolder"], outputs: ["onValueChanged"] }, { kind: "component", type: i5.AXWysiwygViewComponent, selector: "ax-wysiwyg-view", inputs: ["class"] }, { kind: "component", type: i5.AXWysiwygToolbarComponent, selector: "ax-wysiwyg-toolbar" }, { kind: "component", type: i5.AXWysiwygAlignmentComponent, selector: "ax-wysiwyg-alignment" }, { kind: "component", type: i5.AXWysiwygColorsComponent, selector: "ax-wysiwyg-colors" }, { kind: "component", type: i5.AXWysiwygFontStyleComponent, selector: "ax-wysiwyg-font-style" }, { kind: "component", type: i5.AXWysiwygHistoryComponent, selector: "ax-wysiwyg-history" }, { kind: "component", type: i5.AXWysiwygListComponent, selector: "ax-wysiwyg-list" }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i6.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "type", "responsiveOn", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "responsiveOnChange", "loadingTextChange"] }, { kind: "component", type: i6.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i6.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXLabelModule }, { kind: "ngmodule", type: AXAvatarModule }, { kind: "component", type: i7.AXAvatarComponent, selector: "ax-avatar", inputs: ["color", "size", "look"], outputs: ["sizeChange"] }, { kind: "ngmodule", type: AXImageModule }, { kind: "component", type: i8.AXImageComponent, selector: "ax-image", inputs: ["overlayMode", "src", "alt", "priority", "lazy"], outputs: ["onLoad", "onError"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "component", type: i9.AXFormFieldComponent, selector: "ax-form-field", inputs: ["labelMode"] }, { kind: "component", type: i9.AXFormComponent, selector: "ax-form", inputs: ["labelMode", "messageStyle", "updateOn"], outputs: ["onValidate", "updateOnChange"] }, { kind: "directive", type: i9.AXValidationRuleDirective, selector: "ax-validation-rule", inputs: ["rule", "options", "message"] }, { kind: "ngmodule", type: AXLoadingModule }, { kind: "component", type: i10.AXLoadingComponent, selector: "ax-loading", inputs: ["visible", "type", "context"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: AXDropdownButtonModule }, { kind: "component", type: i11.AXDropdownButtonComponent, selector: "ax-dropdown-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "type", "mode"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "lookChange", "colorChange", "disabledChange"] }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i12.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "ngmodule", type: AXFormatModule }, { kind: "pipe", type: i13.AXFormatPipe, name: "format" }, { kind: "ngmodule", type: AXSkeletonModule }, { kind: "component", type: i14.AXSkeletonComponent, selector: "ax-skeleton", inputs: ["animated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
405
- }
406
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: AXPCommentListViewComponent, decorators: [{
407
- type: Component,
408
- args: [{ selector: 'axp-comment-list-view', imports: [
409
- FormsModule,
410
- CommonModule,
411
- RouterModule,
412
- AXDecoratorModule,
413
- AXCommentModule,
414
- AXWysiwygModule,
415
- AXButtonModule,
416
- AXTextBoxModule,
417
- AXLabelModule,
418
- AXAvatarModule,
419
- AXImageModule,
420
- AXSelectBoxModule,
421
- AXFormModule,
422
- AXLoadingModule,
423
- AXDropdownButtonModule,
424
- AXDropdownModule,
425
- AXFormatModule,
426
- AXSkeletonModule,
427
- ], standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ax-mt-2\">\n <ax-comment-container>\n @if(isLoading()){\n <div class=\"ax-flex ax-items-center ax-py-12 ax-bg-surface ax-px-5\">\n <ax-skeleton class=\"ax-min-w-16 ax-h-16 ax-rounded-full ax-me-4\"></ax-skeleton>\n <div class=\"ax-flex ax-flex-col ax-gap-2 ax-w-full\">\n <ax-skeleton class=\"ax-w-full ax-h-6 ax-rounded\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-full ax-h-2 ax-rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"ax-w-8/12 ax-h-2 ax-rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if(!isLoading() && comments().length > 0){\n <ax-comment-view class=\"ax-bg-surface\">\n @for(comment of comments(); track comment.id){\n <ax-comment-item [id]=\"comment.id!\" [replyCount]=\"comment.replies?.length ?? 0\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(checkImageExists(comment.id!) && comment.user && comment.user.picture){\n <ax-image (onError)=\"handleImageError(comment.id!)\" [src]=\"comment.user!.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(comment.user?.firstName + ' ' + comment.user?.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ comment.user?.firstName + ' ' + comment.user?.lastName }}</ax-title>\n <ax-comment-date>{{ calcDefrenetTime(comment.createdAt) | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteComment(comment)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(comment.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment)\" [liked]=\"comment.isLiked\">\n {{ comment.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment)\"></ax-comment-reply-text>\n @for(reply of comment.replies; track reply.id){\n <ax-comment-item [id]=\"reply.id\">\n <ax-avatar [color]=\"avatarConfig().color\" [look]=\"avatarConfig().look\">\n @if(reply && checkImageExists(reply.id!) && reply.user && reply.user.picture){\n <ax-image (onError)=\"handleImageError(reply!.id!)\" [src]=\"reply.user!.picture\">\n <ax-loading></ax-loading>\n </ax-image>\n }@else{\n <ax-text>\n <span class=\"ax-text-base ax-overflow-hidden\">{{\n extractInitials(reply.user?.firstName + ' ' + reply.user?.lastName)\n }}</span>\n </ax-text>\n }\n </ax-avatar>\n <ax-title>{{ (reply?.user?.firstName ?? '') + ' ' + (reply?.user?.lastName ?? '') }}</ax-title>\n <ax-comment-date>{{ calcDefrenetTime(reply.createdAt) | format : 'timeleft' | async }} </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button class=\"ax-sm\" look=\"blank\" color=\"secondary\">\n <ax-icon icon=\"ax-icon ax-icon-solid ax-icon-more-horizontal\"></ax-icon>\n </ax-button>\n\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item text=\"Edit\" color=\"secondary\" (click)=\"editMessage(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-edit\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item text=\"Delete\" color=\"danger\" (click)=\"deleteReply(comment, reply)\">\n <ax-prefix>\n <ax-icon icon=\"fa-solid fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content [innerHTML]=\"sanitizeHtml(reply.content)\"></ax-content>\n <ax-comment-like (click)=\"toggleLike(comment, reply)\" [liked]=\"reply.isLiked\">\n {{ reply.reactionsCount }}\n </ax-comment-like>\n <ax-comment-reply-text (click)=\"replyMessage(comment, reply)\"></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n } </ax-comment-view\n >} @else{\n <div>\n <div class=\"ax-flex ax-flex-col ax-gap-4 ax-justify-center ax-items-center ax-p-10\">\n <svg\n class=\"ax-mx-auto\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"154\"\n height=\"161\"\n viewBox=\"0 0 154 161\"\n fill=\"none\"\n >\n <path\n d=\"M0.0616455 84.4268C0.0616455 42.0213 34.435 7.83765 76.6507 7.83765C118.803 7.83765 153.224 42.0055 153.224 84.4268C153.224 102.42 147.026 118.974 136.622 132.034C122.282 150.138 100.367 161 76.6507 161C52.7759 161 30.9882 150.059 16.6633 132.034C6.25961 118.974 0.0616455 102.42 0.0616455 84.4268Z\"\n fill=\"#EEF2FF\"\n />\n <path\n d=\"M96.8189 0.632498L96.8189 0.632384L96.8083 0.630954C96.2034 0.549581 95.5931 0.5 94.9787 0.5H29.338C22.7112 0.5 17.3394 5.84455 17.3394 12.4473V142.715C17.3394 149.318 22.7112 154.662 29.338 154.662H123.948C130.591 154.662 135.946 149.317 135.946 142.715V38.9309C135.946 38.0244 135.847 37.1334 135.648 36.2586L135.648 36.2584C135.117 33.9309 133.874 31.7686 132.066 30.1333C132.066 30.1331 132.065 30.1329 132.065 30.1327L103.068 3.65203C103.068 3.6519 103.067 3.65177 103.067 3.65164C101.311 2.03526 99.1396 0.995552 96.8189 0.632498Z\"\n fill=\"white\"\n stroke=\"#E5E7EB\"\n />\n <ellipse cx=\"80.0618\" cy=\"81\" rx=\"28.0342\" ry=\"28.0342\" fill=\"#EEF2FF\" />\n <path\n d=\"M99.2393 61.3061L99.2391 61.3058C88.498 50.5808 71.1092 50.5804 60.3835 61.3061C49.6423 72.0316 49.6422 89.4361 60.3832 100.162C71.109 110.903 88.4982 110.903 99.2393 100.162C109.965 89.4363 109.965 72.0317 99.2393 61.3061ZM105.863 54.6832C120.249 69.0695 120.249 92.3985 105.863 106.785C91.4605 121.171 68.1468 121.171 53.7446 106.785C39.3582 92.3987 39.3582 69.0693 53.7446 54.683C68.1468 40.2965 91.4605 40.2966 105.863 54.6832Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M110.782 119.267L102.016 110.492C104.888 108.267 107.476 105.651 109.564 102.955L118.329 111.729L110.782 119.267Z\"\n stroke=\"#E5E7EB\"\n />\n <path\n d=\"M139.122 125.781L139.122 125.78L123.313 109.988C123.313 109.987 123.313 109.987 123.312 109.986C121.996 108.653 119.849 108.657 118.521 109.985L118.871 110.335L118.521 109.985L109.047 119.459C107.731 120.775 107.735 122.918 109.044 124.247L109.047 124.249L124.858 140.06C128.789 143.992 135.191 143.992 139.122 140.06C143.069 136.113 143.069 129.728 139.122 125.781Z\"\n fill=\"#A5B4FC\"\n stroke=\"#818CF8\"\n />\n <path\n d=\"M83.185 87.2285C82.5387 87.2285 82.0027 86.6926 82.0027 86.0305C82.0027 83.3821 77.9987 83.3821 77.9987 86.0305C77.9987 86.6926 77.4627 87.2285 76.8006 87.2285C76.1543 87.2285 75.6183 86.6926 75.6183 86.0305C75.6183 80.2294 84.3831 80.2451 84.3831 86.0305C84.3831 86.6926 83.8471 87.2285 83.185 87.2285Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M93.3528 77.0926H88.403C87.7409 77.0926 87.2049 76.5567 87.2049 75.8946C87.2049 75.2483 87.7409 74.7123 88.403 74.7123H93.3528C94.0149 74.7123 94.5509 75.2483 94.5509 75.8946C94.5509 76.5567 94.0149 77.0926 93.3528 77.0926Z\"\n fill=\"#4F46E5\"\n />\n <path\n d=\"M71.5987 77.0925H66.6488C65.9867 77.0925 65.4507 76.5565 65.4507 75.8945C65.4507 75.2481 65.9867 74.7122 66.6488 74.7122H71.5987C72.245 74.7122 72.781 75.2481 72.781 75.8945C72.781 76.5565 72.245 77.0925 71.5987 77.0925Z\"\n fill=\"#4F46E5\"\n />\n <rect x=\"38.3522\" y=\"21.5128\" width=\"41.0256\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <rect x=\"38.3522\" y=\"133.65\" width=\"54.7009\" height=\"5.47009\" rx=\"2.73504\" fill=\"#A5B4FC\" />\n <rect x=\"38.3522\" y=\"29.7179\" width=\"13.6752\" height=\"2.73504\" rx=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"56.13\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"61.6001\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n <circle cx=\"67.0702\" cy=\"31.0854\" r=\"1.36752\" fill=\"#4F46E5\" />\n </svg>\n <div>\n <h2 class=\"ax-text-center ax-text-neutral-600 ax-font-semibold ax-leading-loose ax-pb-2\">\n There is no Comment!\n </h2>\n </div>\n </div>\n </div>\n }\n </ax-comment-container>\n <ax-form>\n <ax-form-field>\n <div>\n @if(isReplyingMode() || isEditingMode()){\n <div\n class=\"ax-flex ax-justify-between ax-rounded-b-none ax-border ax-border-b-0 ax-rounded-lg ax-bg-on-surface ax-px-6 ax-py-3 ax-w-full ax-items-center ax-overflow-hidden ax-text-sm ax-leading-none\"\n >\n <div (click)=\"scrollMain()\" class=\"ax-flex ax-justify-start ax-items-center ax-cursor-pointer\">\n <i\n [class]=\"isReplyingMode() ? 'fa-reply' : 'fa-pen'\"\n class=\"fa-solid ax-text-primary-500 dark:ax-text-primary-300 ax-text-2xl ax-me-4\"\n ></i>\n <div\n class=\"ax-flex ax-flex-col ax-gap-2 ax-justify-between ax-align-middle ax-leading-4 ax-overflow-hidden\"\n >\n <p class=\"ax-text-primary-500 dark:ax-text-primary-300\">\n {{ isReplyingMode() ? 'Reply to ' : 'Edit Message' }}\n <span class=\"ax-font-bold\">\n {{\n isReplyingMode()\n ? activeReplyComment()?.user?.firstName + ' ' + activeReplyComment()?.user?.lastName\n : ''\n }}\n </span>\n </p>\n <div\n class=\"ax-truncate\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(activeReplyComment()?.content ?? '')\n : sanitizeHtml(activeEditComment()?.content ?? '')\n \"\n ></div>\n </div>\n </div>\n <div><i (click)=\"resetReplyEditState()\" class=\"fa-solid ax-text-2xl fa-xmark ax-cursor-pointer\"></i></div>\n </div>\n }\n <ax-wysiwyg-container #w [look]=\"wysiwygOptions().look\" [(ngModel)]=\"commentContent\">\n <ax-wysiwyg-view class=\"ax-min-h-28\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n <ax-suffix>\n <ax-dropdown-button\n [disabled]=\"hasCooldown()\"\n type=\"submit\"\n color=\"primary\"\n mode=\"split\"\n text=\"Send\"\n (onClick)=\"submitComment()\"\n >\n @if(isSubmitting()){ <ax-loading></ax-loading> }\n <ax-button-item-list>\n <ax-button-item (click)=\"submitComment(true)\" text=\"Send Private ...\" name=\"private\" data=\"private\">\n <ax-prefix>\n <ax-icon icon=\"fa-regular fa-user-secret\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n <ax-validation-rule rule=\"callback\" [options]=\"{ validate: validateContent }\"></ax-validation-rule>\n </ax-wysiwyg-container>\n </div>\n </ax-form-field>\n </ax-form>\n</div>\n", styles: ["ax-wysiwyg-container .ax-editor-container{border-top-left-radius:0!important;border-top-right-radius:0!important}ax-wysiwyg-container .ax-error-message{padding-left:.5rem}\n"] }]
428
- }] });
429
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS90aGVtZXMvc2hhcmVkL3NyYy9saWIvY29tbWVudHMvY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9wbGF0Zm9ybS90aGVtZXMvc2hhcmVkL3NyYy9saWIvY29tbWVudHMvY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBK0IsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9B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LFNBQVMsQ0FBQztJQUN4RCxDQUFDOzhHQTVZVSwyQkFBMkI7a0dBQTNCLDJCQUEyQixvU0NsRXhDLHF4WkE2T0Esc09EM01JLFdBQVcsOFZBQ1gsWUFBWSxtRkFDWixZQUFZLDhCQUNaLGlCQUFpQix1VkFDakIsZUFBZSx5ckJBQ2YsZUFBZSxzMEJBQ2YsY0FBYyw4dkJBQ2QsZUFBZSw4QkFDZixhQUFhLDhCQUNiLGNBQWMsb0tBQ2QsYUFBYSxpTUFDYixpQkFBaUIsOEJBQ2pCLFlBQVksNmFBQ1osZUFBZSwrS0FDZixzQkFBc0IseVRBQ3RCLGdCQUFnQix5UEFDaEIsY0FBYyx3RkFDZCxnQkFBZ0I7OzJGQWVQLDJCQUEyQjtrQkFwQ3ZDLFNBQVM7K0JBRUUsdUJBQXVCLFdBQ3hCO3dCQUNQLFdBQVc7d0JBQ1gsWUFBWTt3QkFDWixZQUFZO3dCQUNaLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixlQUFlO3dCQUNmLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTt3QkFDYixpQkFBaUI7d0JBQ2pCLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixzQkFBc0I7d0JBQ3RCLGdCQUFnQjt3QkFDaEIsY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ2pCLGNBQ1csSUFBSSxtQkFXQyx1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhDb21tZW50TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2NvbW1lbnQnO1xuaW1wb3J0IHsgQVhEZWNvcmF0b3JNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBBWFd5c2l3eWdDb250YWluZXJDb21wb25lbnQsIEFYV3lzaXd5Z01vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy93eXNpd3lnJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBPbkluaXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBBWEF2YXRhck1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9hdmF0YXInO1xuaW1wb3J0IHsgQVhCdXR0b25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvYnV0dG9uJztcbmltcG9ydCB7IEFYU3R5bGVMb29rVHlwZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9jb21tb24nO1xuaW1wb3J0IHsgQVhEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2RpYWxvZyc7XG5pbXBvcnQgeyBBWERyb3Bkb3duTW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL2Ryb3Bkb3duJztcbmltcG9ydCB7IEFYRHJvcGRvd25CdXR0b25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZHJvcGRvd24tYnV0dG9uJztcbmltcG9ydCB7IEFYRm9ybU1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9mb3JtJztcbmltcG9ydCB7IEFYSW1hZ2VNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvaW1hZ2UnO1xuaW1wb3J0IHsgQVhMYWJlbE1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9sYWJlbCc7XG5pbXBvcnQgeyBBWExvYWRpbmdNb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvbG9hZGluZyc7XG5pbXBvcnQgeyBBWFBvcHVwQ29uZmlnLCBBWFBvcHVwU2VydmljZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9wb3B1cCc7XG5pbXBvcnQgeyBBWFNlbGVjdEJveE1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9zZWxlY3QtYm94JztcbmltcG9ydCB7IEFYU2tlbGV0b25Nb2R1bGUgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvc2tlbGV0b24nO1xuaW1wb3J0IHsgQVhUZXh0Qm94TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3RleHQtYm94JztcbmltcG9ydCB7IEFYVG9hc3RTZXJ2aWNlIH0gZnJvbSAnQGFjb3JleC9jb21wb25lbnRzL3RvYXN0JztcbmltcG9ydCB7IEFYRm9ybWF0TW9kdWxlIH0gZnJvbSAnQGFjb3JleC9jb3JlL2Zvcm1hdCc7XG5pbXBvcnQgeyBBWFBsYXRmb3JtIH0gZnJvbSAnQGFjb3JleC9jb3JlL3BsYXRmb3JtJztcbmltcG9ydCB7IEFYUFBhZ2VkTGlzdFJlc3VsdCwgQVhQUXVlcnlSZXF1ZXN0IH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb21tb24nO1xuaW1wb3J0IHsgQVhQSHRtbFV0aWxzIH0gZnJvbSAnQGFjb3JleC9wbGF0Zm9ybS9jb3JlJztcbmltcG9ydCB7IEFYUENvbW1lbnRMb29rdXBQb3B1cCB9IGZyb20gJy4vY29tbWVudC1sb29rdXAtcG9wdXAuY29tcG9uZW50JztcbmltcG9ydCB7IEFYUENvbW1lbnRTZXJ2aWNlIH0gZnJvbSAnLi9jb21tZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IEFYUENvbW1lbnRDcmVhdGVSZXF1ZXN0LCBBWFBDb21tZW50RW50aXR5TW9kZWwsIEFYUE1lc3NhZ2VSZWFjdGlvbkVudGl0eU1vZGVsIH0gZnJvbSAnLi9jb21tZW50cy50eXBlJztcbkBDb21wb25lbnQoe1xuICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC1saXN0LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzZWxlY3RvcjogJ2F4cC1jb21tZW50LWxpc3QtdmlldycsXG4gIGltcG9ydHM6IFtcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIEFYRGVjb3JhdG9yTW9kdWxlLFxuICAgIEFYQ29tbWVudE1vZHVsZSxcbiAgICBBWFd5c2l3eWdNb2R1bGUsXG4gICAgQVhCdXR0b25Nb2R1bGUsXG4gICAgQVhUZXh0Qm94TW9kdWxlLFxuICAgIEFYTGFiZWxNb2R1bGUsXG4gICAgQVhBdmF0YXJNb2R1bGUsXG4gICAgQVhJbWFnZU1vZHVsZSxcbiAgICBBWFNlbGVjdEJveE1vZHVsZSxcbiAgICBBWEZvcm1Nb2R1bGUsXG4gICAgQVhMb2FkaW5nTW9kdWxlLFxuICAgIEFYRHJvcGRvd25CdXR0b25Nb2R1bGUsXG4gICAgQVhEcm9wZG93bk1vZHVsZSxcbiAgICBBWEZvcm1hdE1vZHVsZSxcbiAgICBBWFNrZWxldG9uTW9kdWxlLFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzdHlsZXM6IGBheC13eXNpd3lnLWNvbnRhaW5lcntcbiAgICAuYXgtZWRpdG9yLWNvbnRhaW5lcntcbiAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDtcbiAgICAgIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7XG4gICAgfVxuICAgIC5heC1lcnJvci1tZXNzYWdle1xuICAgICAgcGFkZGluZy1sZWZ0OiAwLjVyZW07XG4gICAgfVxuXG4gIH1gLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQVhQQ29tbWVudExpc3RWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgcHJvdGVjdGVkIGhhc0Nvb2xkb3duID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGNvbW1lbnRDb250ZW50ID0gc2lnbmFsKCcnKTtcblxuICBwcm90ZWN0ZWQgaXNTdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzUmVwbHlpbmdNb2RlID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIGlzRWRpdGluZ01vZGUgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuXG4gIHByb3RlY3RlZCBmYWlsZWRJbWFnZUlkcyA9IHNpZ25hbDxzdHJpbmdbXT4oW10pO1xuICBwcm90ZWN0ZWQgYWN0aXZlUmVwbHlDb21tZW50ID0gc2lnbmFsPHVuZGVmaW5lZCB8IEFYUENvbW1lbnRFbnRpdHlNb2RlbD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIGFjdGl2ZUVkaXRDb21tZW50ID0gc2lnbmFsPHVuZGVmaW5lZCB8IEFYUENvbW1lbnRFbnRpdHlNb2RlbD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHd5c2l3eWdFZGl0b3IgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8QVhXeXNpd3lnQ29udGFpbmVyQ29tcG9uZW50PigndycpO1xuXG4gIHByaXZhdGUgY29tbWVudFNlcnZpY2UgPSBpbmplY3QoQVhQQ29tbWVudFNlcnZpY2UpO1xuICBwcml2YXRlIHBsYXRmb3JtID0gaW5qZWN0KEFYUGxhdGZvcm0pO1xuICBwcml2YXRlIHJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSBwb3B1cFNlcnZpY2UgPSBpbmplY3QoQVhQb3B1cFNlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0U2VydmljZSA9IGluamVjdChBWFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgZGlhbG9nU2VydmljZSA9IGluamVjdChBWERpYWxvZ1NlcnZpY2UpO1xuICBwcml2YXRlIGh0bWxVdGlscyA9IGluamVjdChBWFBIdG1sVXRpbHMpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVQYXJhbXMgPSB0aGlzLnJvdXRlLnNuYXBzaG90O1xuICBwcml2YXRlIGdldFBheWxvYWQgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgcGFyYW1zOiB0aGlzLnBheWxvYWQoKSxcbiAgICAgICAgc2tpcDogMCxcbiAgICAgICAgdGFrZTogMTAsXG4gICAgICB9IGFzIEFYUFF1ZXJ5UmVxdWVzdClcbiAgKTtcbiAgcGF5bG9hZCA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgcm9vbVR5cGU6ICdkZWZhdWx0JyxcbiAgICBlbnRpdHlJZDogdGhpcy5yb3V0ZVBhcmFtcy5wYXJhbXM/LlsnbW9kdWxlJ10gKyAnLicgKyB0aGlzLnJvdXRlUGFyYW1zLnBhcmFtcz8uWydlbnRpdHknXSxcbiAgICBpbnN0YW5jZUlkOiB0aGlzLnJvdXRlUGFyYW1zLnBhcmFtcz8uWydpZCddLFxuICB9KSk7XG5cbiAgcHJvdGVjdGVkIGNvbW1lbnRzID0gc2lnbmFsPEFYUENvbW1lbnRFbnRpdHlNb2RlbFtdPihbXSk7XG4gIHByaXZhdGUgd3lzaXd5ZyA9IHZpZXdDaGlsZDxBWFd5c2l3eWdDb250YWluZXJDb21wb25lbnQ+KCd3Jyk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQ29tbWVudHMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB3eXNpd3lnT3B0aW9ucyA9IHNpZ25hbDx7XG4gICAgbG9vazogQVhTdHlsZUxvb2tUeXBlO1xuICB9Pih7XG4gICAgbG9vazogJ3NvbGlkJyxcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIGF2YXRhckNvbmZpZyA9IHNpZ25hbDx7XG4gICAgY29sb3I6IHN0cmluZztcbiAgICBsb29rOiAnc2hhcnAnIHwgJ3NvZnQnIHwgJ3JvdW5kZWQnO1xuICAgIHR5cGU6IHN0cmluZztcbiAgfT4oe1xuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgbG9vazogJ3JvdW5kZWQnLFxuICAgIHR5cGU6ICdzb2xpZCcsIC8vICdpbWFnZScgfCAndGV4dCcgfCAnaWNvbicgfCAnZGVmYXVsdCdcbiAgfSk7XG5cbiAgdmFsaWRhdGVDb250ZW50ID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcblxuICAgIGlmICghY29udGVudCB8fCBjb250ZW50ID09PSAnPHA+PGJyPjwvcD4nKSB7XG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBydWxlOiAnY2FsbGJhY2snLFxuICAgICAgcmVzdWx0OiBpc1ZhbGlkLFxuICAgICAgbWVzc2FnZTogaXNWYWxpZCA/ICcnIDogJ1BsZWFzZSBmaWxsIHRoZSBjb250ZW50JyxcbiAgICAgIHZhbHVlOiBjb250ZW50LFxuICAgIH07XG4gIH07XG5cbiAgc2FuaXRpemVIdG1sKGh0bWxDb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5odG1sVXRpbHMuZ2V0U2FmZUhUTUxmcm9tSFRNTChodG1sQ29udGVudCk7XG4gIH1cblxuICBoYW5kbGVJbWFnZUVycm9yKGltYWdlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmFpbGVkSW1hZ2VJZHMudXBkYXRlKChpZHMpID0+IFsuLi5pZHMsIGltYWdlSWRdKTtcbiAgfVxuXG4gIGNoZWNrSW1hZ2VFeGlzdHMoaW1hZ2VJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmZhaWxlZEltYWdlSWRzKCkuaW5jbHVkZXMoaW1hZ2VJZCk7XG4gIH1cblxuICBleHRyYWN0SW5pdGlhbHMobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB3b3JkcyA9IG5hbWUuc3BsaXQoJyAnKTtcbiAgICBjb25zdCBpbml0aWFscyA9IHdvcmRzLm1hcCgod29yZCkgPT4gd29yZC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSk7XG4gICAgcmV0dXJuIGluaXRpYWxzLmpvaW4oJycpO1xuICB9XG5cbiAgYXN5bmMgbG9hZENvbW1lbnRzKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICAvLyAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmdldCh0aGlzLnBheWxvYWQoKSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IEFYUFBhZ2VkTGlzdFJlc3VsdDxBWFBDb21tZW50RW50aXR5TW9kZWw+ID0gYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5xdWVyeSh0aGlzLmdldFBheWxvYWQoKSk7XG5cbiAgICB0aGlzLmNvbW1lbnRzLnNldChyZXNwb25zZS5pdGVtcyk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH0sIDI1MCk7XG4gIH1cblxuICBlZGl0TWVzc2FnZShjb21tZW50OiBBWFBDb21tZW50RW50aXR5TW9kZWwsIHJlcGx5PzogQVhQQ29tbWVudEVudGl0eU1vZGVsKSB7XG4gICAgdGhpcy5pc1JlcGx5aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgIHRoaXMuYWN0aXZlUmVwbHlDb21tZW50LnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuaXNFZGl0aW5nTW9kZS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5hY3RpdmVFZGl0Q29tbWVudC5zZXQoY29tbWVudCk7XG4gICAgY29uc3QgY29udGVudFRvRWRpdCA9IHJlcGx5ID8gcmVwbHkuY29udGVudCA6IGNvbW1lbnQuY29udGVudDtcbiAgICB0aGlzLmNvbW1lbnRDb250ZW50LnNldChjb250ZW50VG9FZGl0KTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdxbC1lZGl0b3InKVswXS5pbm5lckhUTUwgPSBjb250ZW50VG9FZGl0O1xuICAgIHRoaXMud3lzaXd5Z0VkaXRvcigpLmdldEhvc3RFbGVtZW50KCkuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xuICB9XG5cbiAgcmVwbHlNZXNzYWdlKGNvbW1lbnQ6IEFYUENvbW1lbnRFbnRpdHlNb2RlbCwgcmVwbHk/OiBBWFBDb21tZW50RW50aXR5TW9kZWwpIHtcbiAgICB0aGlzLmlzRWRpdGluZ01vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmFjdGl2ZUVkaXRDb21tZW50LnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuaXNSZXBseWluZ01vZGUuc2V0KHRydWUpO1xuICAgIHRoaXMuYWN0aXZlUmVwbHlDb21tZW50LnNldChjb21tZW50KTtcbiAgICBpZiAocmVwbHkpIHtcbiAgICAgIGNvbnN0IG1lbnRpb24gPSBgPGEgZGF0YS1pZD1cIiR7cmVwbHkuaWR9XCI+QCR7cmVwbHkudXNlcj8udXNlck5hbWV9PC9hPiBgO1xuICAgICAgdGhpcy5jb21tZW50Q29udGVudC5zZXQobWVudGlvbik7XG4gICAgICB0aGlzLnd5c2l3eWcoKT8uZm9jdXMoKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3FsLWVkaXRvcicpWzBdLmlubmVySFRNTCA9IG1lbnRpb247XG4gICAgfVxuICAgIHRoaXMud3lzaXd5Z0VkaXRvcigpLmdldEhvc3RFbGVtZW50KCkuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQ29tbWVudChjb21tZW50OiBBWFBDb21tZW50RW50aXR5TW9kZWwpIHtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uub3Blbih7XG4gICAgICBpY29uOiAnZmEtcmVndWxhciBmYS13YXJuaW5nJyxcbiAgICAgIGNvbnRlbnQ6ICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29tbWVudD8nLFxuICAgICAgdGl0bGU6ICdEZWxldGUgQ29tbWVudCcsXG4gICAgICB0eXBlOiAnZGFuZ2VyJyxcbiAgICAgIG9yaWVudGF0aW9uOiAnaG9yaXpvbnRhbCcsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICAgICAgb25DbGljazogYXN5bmMgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgZS5oYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGUuc291cmNlLnRleHQgPSAnRGVsZXRpbmcuLi4nO1xuICAgICAgICAgICAgZS5zb3VyY2UuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgZS5zb3VyY2UubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmRlbGV0ZU9uZShjb21tZW50LmlkISk7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlTWVzc2FnZUJ5SWQoY29tbWVudC5pZCEpO1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiAnQ29tbWVudCBkZWxldGVkIHN1Y2Nlc3NmdWxseS4nLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aW1lT3V0OiAzMDAwLFxuICAgICAgICAgICAgICAgIHRpbWVPdXRQcm9ncmVzczogdHJ1ZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICh0aGlzLmlzRWRpdGluZ01vZGUoKSAmJiB0aGlzLmFjdGl2ZUVkaXRDb21tZW50KCk/LmlkID09PSBjb21tZW50LmlkKSB8fCB0aGlzLnJlc2V0UmVwbHlFZGl0U3RhdGU7XG4gICAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgICAgICAgY29udGVudDogdHlwZW9mIGVycm9yID09PSAnc3RyaW5nJyA/IGVycm9yIDogJ0ZhaWxlZCB0byBkZWxldGUgY29tbWVudCEnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFuZ2VyJyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpbWVPdXQ6IDMwMDAsXG4gICAgICAgICAgICAgICAgdGltZU91dFByb2dyZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ0NhbmNlbCcsXG4gICAgICAgICAgY29sb3I6ICdnaG9zdCcsXG4gICAgICAgICAgYXV0b2ZvY3VzOiB0cnVlLFxuICAgICAgICAgIG9uQ2xpY2s6IChlKSA9PiB7XG4gICAgICAgICAgICBkaWFsb2cuY2xvc2UoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNsb3NlQnV0dG9uOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVJlcGx5KGNvbW1lbnQ6IEFYUENvbW1lbnRFbnRpdHlNb2RlbCwgcmVwbHk6IEFYUENvbW1lbnRFbnRpdHlNb2RlbCkge1xuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKHtcbiAgICAgIGljb246ICdmYS1yZWd1bGFyIGZhLXdhcm5pbmcnLFxuICAgICAgY29udGVudDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyByZXBseT8nLFxuICAgICAgdGl0bGU6ICdEZWxldGUgUmVwbHknLFxuICAgICAgdHlwZTogJ2RhbmdlcicsXG4gICAgICBvcmllbnRhdGlvbjogJ2hvcml6b250YWwnLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogJ0RlbGV0ZScsXG4gICAgICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgICAgIG9uQ2xpY2s6IGFzeW5jIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGUuaGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICBlLnNvdXJjZS50ZXh0ID0gJ0RlbGV0aW5nLi4uJztcbiAgICAgICAgICAgIGUuc291cmNlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGUuc291cmNlLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5kZWxldGVPbmUoY29tbWVudC5pZCEpO1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZU1lc3NhZ2VCeUlkKGNvbW1lbnQuaWQhLCByZXBseS5pZCk7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLnNob3coe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdDb21tZW50IGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LicsXG4gICAgICAgICAgICAgICAgY29sb3I6ICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogJ2JvdHRvbS1jZW50ZXInLFxuICAgICAgICAgICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRpbWVPdXQ6IDMwMDAsXG4gICAgICAgICAgICAgICAgdGltZU91dFByb2dyZXNzOiB0cnVlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiB0eXBlb2YgZXJyb3IgPT09ICdzdHJpbmcnID8gZXJyb3IgOiAnRmFpbGVkIHRvIGRlbGV0ZSBjb21tZW50IScsXG4gICAgICAgICAgICAgICAgY29sb3I6ICdkYW5nZXInLFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiAnYm90dG9tLWNlbnRlcicsXG4gICAgICAgICAgICAgICAgY2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgICAgICAgICAgdGltZU91dDogMzAwMCxcbiAgICAgICAgICAgICAgICB0aW1lT3V0UHJvZ3Jlc3M6IHRydWUsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICBjb2xvcjogJ2dob3N0JyxcbiAgICAgICAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgICAgICAgb25DbGljazogKGUpID0+IHtcbiAgICAgICAgICAgIGRpYWxvZy5jbG9zZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgY2xvc2VCdXR0b246IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVzZXRSZXBseUVkaXRTdGF0ZSgpIHtcbiAgICB0aGlzLmlzRWRpdGluZ01vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmFjdGl2ZUVkaXRDb21tZW50LnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuaXNSZXBseWluZ01vZGUuc2V0KGZhbHNlKTtcbiAgICB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudC5zZXQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIGFzeW5jIHRvZ2dsZUxpa2UoY29tbWVudDogQVhQQ29tbWVudEVudGl0eU1vZGVsLCByZXBseT86IEFYUENvbW1lbnRFbnRpdHlNb2RlbCkge1xuICAgIGlmIChyZXBseSkge1xuICAgICAgdGhpcy51cGRhdGVMaWtlU3RhdHVzKGNvbW1lbnQuaWQhLCByZXBseS5pZCk7XG4gICAgICBjb25zdCBwYXlsb2FkOiBBWFBNZXNzYWdlUmVhY3Rpb25FbnRpdHlNb2RlbCA9IHtcbiAgICAgICAgbWVzc2FnZUlkOiByZXBseS5pZCEsXG4gICAgICAgIHR5cGU6ICdsaWtlJyxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UubGlrZShwYXlsb2FkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTGlrZVN0YXR1cyhjb21tZW50LmlkISwgcmVwbHkuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZUxpa2VTdGF0dXMoY29tbWVudC5pZCEpO1xuICAgICAgY29uc3QgcGF5bG9hZDogQVhQTWVzc2FnZVJlYWN0aW9uRW50aXR5TW9kZWwgPSB7XG4gICAgICAgIG1lc3NhZ2VJZDogY29tbWVudC5pZCEsXG4gICAgICAgIHR5cGU6ICdsaWtlJyxcbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UubGlrZShwYXlsb2FkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTGlrZVN0YXR1cyhjb21tZW50LmlkISk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMaWtlU3RhdHVzKGNvbW1lbnRJZDogc3RyaW5nLCByZXBseUlkPzogc3RyaW5nKSB7XG4gICAgdGhpcy5jb21tZW50cy51cGRhdGUoKGNvbW1lbnRzTGlzdCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbW1lbnRzTGlzdC5tYXAoKGNvbW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGNvbW1lbnQuaWQgPT09IGNvbW1lbnRJZCkge1xuICAgICAgICAgIGlmIChyZXBseUlkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkUmVwbGllcyA9IGNvbW1lbnQucmVwbGllcz8ubWFwKChyZXBseSkgPT5cbiAgICAgICAgICAgICAgcmVwbHkuaWQgPT09IHJlcGx5SWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVwbHksXG4gICAgICAgICAgICAgICAgICAgIGlzTGlrZWQ6ICFyZXBseS5pc0xpa2VkLFxuICAgICAgICAgICAgICAgICAgICByZWFjdGlvbnNDb3VudDogcmVwbHkuaXNMaWtlZCA/IC0tcmVwbHkucmVhY3Rpb25zQ291bnQhIDogKytyZXBseS5yZWFjdGlvbnNDb3VudCEsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiByZXBseVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4uY29tbWVudCxcbiAgICAgICAgICAgICAgcmVwbGllczogdXBkYXRlZFJlcGxpZXMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb21tZW50LFxuICAgICAgICAgICAgICBpc0xpa2VkOiAhY29tbWVudC5pc0xpa2VkLFxuICAgICAgICAgICAgICByZWFjdGlvbnNDb3VudDogY29tbWVudC5pc0xpa2VkID8gLS1jb21tZW50LnJlYWN0aW9uc0NvdW50ISA6ICsrY29tbWVudC5yZWFjdGlvbnNDb3VudCEsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVNZXNzYWdlQnlJZChjb21tZW50SWQ6IHN0cmluZywgcmVwbHlJZD86IHN0cmluZykge1xuICAgIHRoaXMuY29tbWVudHMudXBkYXRlKChjb21tZW50c0xpc3QpID0+XG4gICAgICBjb21tZW50c0xpc3RcbiAgICAgICAgLm1hcCgoY29tbWVudCkgPT4ge1xuICAgICAgICAgIGlmIChjb21tZW50LmlkID09PSBjb21tZW50SWQpIHtcbiAgICAgICAgICAgIGlmIChyZXBseUlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uY29tbWVudCxcbiAgICAgICAgICAgICAgICByZXBsaWVzOiBjb21tZW50LnJlcGxpZXM/LmZpbHRlcigocmVwbHkpID0+IHJlcGx5LmlkICE9PSByZXBseUlkKSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoY29tbWVudCkgPT4gY29tbWVudCAhPT0gbnVsbClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0Q29tbWVudChpc1ByaXZhdGU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZUNvbnRlbnQodGhpcy5jb21tZW50Q29udGVudCgpKS5yZXN1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWVtYmVyTG9va3VwO1xuICAgIGlmIChpc1ByaXZhdGUpIHtcbiAgICAgIGNvbnN0IHBvcHVwQ29uZmlnOiBBWFBvcHVwQ29uZmlnID0ge1xuICAgICAgICBoZWFkZXI6IHRydWUsXG4gICAgICAgIHNpemU6ICdtZCcsXG4gICAgICAgIGRyYWdnYWJsZTogdHJ1ZSxcbiAgICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICAgIGNsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBjbG9zZU9uQmFja2Ryb3BDbGljazogZmFsc2UsXG4gICAgICB9O1xuICAgICAgY29uc3QgcG9wdXAgPSBhd2FpdCB0aGlzLnBvcHVwU2VydmljZS5vcGVuKEFYUENvbW1lbnRMb29rdXBQb3B1cCwgcG9wdXBDb25maWcpO1xuICAgICAgbWVtYmVyTG9va3VwID0gcG9wdXAuZGF0YT8uZGF0YT8ubG9va3VwO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0VkaXRpbmdNb2RlKCkpIHtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIGNvbnRlbnQ6IHRoaXMuY29tbWVudENvbnRlbnQoKSxcbiAgICAgIH07XG4gICAgICAvL3RvZG8gd2h5ID8gbmVlZCBub3QgbnVsbGFibGUgaWQgIS0hXG4gICAgICBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLnVwZGF0ZU9uZSh0aGlzLmFjdGl2ZUVkaXRDb21tZW50KCk/LmlkISwgcGF5bG9hZCk7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmhhc0Nvb2xkb3duLnNldCh0cnVlKTtcbiAgICAgIHRoaXMuaXNFZGl0aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5hY3RpdmVFZGl0Q29tbWVudC5zZXQodW5kZWZpbmVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcGF5bG9hZDogQVhQQ29tbWVudENyZWF0ZVJlcXVlc3QgPSB7XG4gICAgICAgIC4uLnRoaXMucGF5bG9hZCgpLFxuICAgICAgICBjb250ZW50OiB0aGlzLmNvbW1lbnRDb250ZW50KCksXG4gICAgICAgIGNvbnRlbnRUeXBlOiAndGV4dCcsXG4gICAgICAgIGlzUHJpdmF0ZTogaXNQcml2YXRlLFxuICAgICAgICByZXBseUlkOiB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudCgpPy5pZCA/PyBudWxsLFxuICAgICAgICAvL21lbWJlcnM6IGlzUHJpdmF0ZSA/IFttZW1iZXJMb29rdXBdIDogW10sXG4gICAgICB9O1xuICAgICAgYXdhaXQgdGhpcy5jb21tZW50U2VydmljZS5pbnNlcnRPbmUocGF5bG9hZCk7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLmhhc0Nvb2xkb3duLnNldCh0cnVlKTtcblxuICAgICAgdGhpcy5pc1JlcGx5aW5nTW9kZS5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5hY3RpdmVSZXBseUNvbW1lbnQuc2V0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlOiBBWFBQYWdlZExpc3RSZXN1bHQ8QVhQQ29tbWVudEVudGl0eU1vZGVsPiA9IGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UucXVlcnkodGhpcy5nZXRQYXlsb2FkKCkpO1xuICAgIHRoaXMuY29tbWVudHMuc2V0KHJlc3BvbnNlLml0ZW1zKTtcbiAgICB0aGlzLmNvbW1lbnRDb250ZW50LnNldCgnJyk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgncWwtZWRpdG9yJylbMF0uaW5uZXJIVE1MID0gJyc7XG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KGZhbHNlKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGFzQ29vbGRvd24uc2V0KGZhbHNlKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHNjcm9sbE1haW4oKSB7XG4gICAgY29uc29sZS5sb2coJ2NsaWNrZWQnKTtcbiAgICBkZWJ1Z2dlcjtcbiAgICAvL1xuICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmlzUmVwbHlpbmdNb2RlKCkgPyB0aGlzLmFjdGl2ZVJlcGx5Q29tbWVudCgpIDogdGhpcy5hY3RpdmVFZGl0Q29tbWVudCgpO1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoKGNvbW1lbnQgYXMgQVhQQ29tbWVudEVudGl0eU1vZGVsKS5pZCEpO1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnY2VudGVyJyB9KTtcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBlbD8uZmlyc3RFbGVtZW50Q2hpbGQ/LmNoaWxkcmVuWzFdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcHJldkJnID0gY29udGVudC5zdHlsZS5iYWNrZ3JvdW5kO1xuICAgICAgY29udGVudC5zdHlsZS5ib3JkZXJSYWRpdXMgPSAnMC4yNXJlbSc7XG4gICAgICBjb250ZW50LnN0eWxlLnRyYW5zaXRpb24gPSAnYmFja2dyb3VuZCAxcyBlYXNlLWluLW91dCc7XG4gICAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSBgcmdiYSh2YXIoLS1heC1jb2xvci1vbi1zdXJmYWNlKSwgdmFyKC0tdHctYmctb3BhY2l0eSkpYDtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBjb250ZW50LnN0eWxlLmJhY2tncm91bmQgPSBwcmV2QmcgfHwgJ3JnYmEoMCwgMCwgMCwgMCknO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfVxuICB9XG5cbiAgY2FsY0RlZnJlbmV0VGltZShkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRhdGUgPyBEYXRlLm5vdygpIC0gZGF0ZS5nZXRUaW1lKCkgOiB1bmRlZmluZWQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJheC1tdC0yXCI+XG4gIDxheC1jb21tZW50LWNvbnRhaW5lcj5cbiAgICBAaWYoaXNMb2FkaW5nKCkpe1xuICAgIDxkaXYgY2xhc3M9XCJheC1mbGV4IGF4LWl0ZW1zLWNlbnRlciBheC1weS0xMiBheC1iZy1zdXJmYWNlIGF4LXB4LTVcIj5cbiAgICAgIDxheC1za2VsZXRvbiBjbGFzcz1cImF4LW1pbi13LTE2IGF4LWgtMTYgYXgtcm91bmRlZC1mdWxsIGF4LW1lLTRcIj48L2F4LXNrZWxldG9uPlxuICAgICAgPGRpdiBjbGFzcz1cImF4LWZsZXggYXgtZmxleC1jb2wgYXgtZ2FwLTIgYXgtdy1mdWxsXCI+XG4gICAgICAgIDxheC1za2VsZXRvbiBjbGFzcz1cImF4LXctZnVsbCBheC1oLTYgYXgtcm91bmRlZFwiPjwvYXgtc2tlbGV0b24+XG4gICAgICAgIDxheC1za2VsZXRvbiBjbGFzcz1cImF4LXctZnVsbCBheC1oLTIgYXgtcm91bmRlZC1mdWxsXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgPGF4LXNrZWxldG9uIGNsYXNzPVwiYXgtdy1mdWxsIGF4LWgtMiBheC1yb3VuZGVkLWZ1bGxcIj48L2F4LXNrZWxldG9uPlxuICAgICAgICA8YXgtc2tlbGV0b24gY2xhc3M9XCJheC13LTgvMTIgYXgtaC0yIGF4LXJvdW5kZWQtZnVsbFwiPjwvYXgtc2tlbGV0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIGlmKCFpc0xvYWRpbmcoKSAmJiBjb21tZW50cygpLmxlbmd0aCA+IDApe1xuICAgIDxheC1jb21tZW50LXZpZXcgY2xhc3M9XCJheC1iZy1zdXJmYWNlXCI+XG4gICAgICBAZm9yKGNvbW1lbnQgb2YgY29tbWVudHMoKTsgdHJhY2sgY29tbWVudC5pZCl7XG4gICAgICA8YXgtY29tbWVudC1pdGVtIFtpZF09XCJjb21tZW50LmlkIVwiIFtyZXBseUNvdW50XT1cImNvbW1lbnQucmVwbGllcz8ubGVuZ3RoID8/IDBcIj5cbiAgICAgICAgPGF4LWF2YXRhciBbY29sb3JdPVwiYXZhdGFyQ29uZmlnKCkuY29sb3JcIiBbbG9va109XCJhdmF0YXJDb25maWcoKS5sb29rXCI+XG4gICAgICAgICAgQGlmKGNoZWNrSW1hZ2VFeGlzdHMoY29tbWVudC5pZCEpICYmIGNvbW1lbnQudXNlciAmJiBjb21tZW50LnVzZXIucGljdHVyZSl7XG4gICAgICAgICAgPGF4LWltYWdlIChvbkVycm9yKT1cImhhbmRsZUltYWdlRXJyb3IoY29tbWVudC5pZCEpXCIgW3NyY109XCJjb21tZW50LnVzZXIhLnBpY3R1cmVcIj5cbiAgICAgICAgICAgIDxheC1sb2FkaW5nPjwvYXgtbG9hZGluZz5cbiAgICAgICAgICA8L2F4LWltYWdlPlxuICAgICAgICAgIH1AZWxzZXtcbiAgICAgICAgICA8YXgtdGV4dD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtdGV4dC1iYXNlIGF4LW92ZXJmbG93LWhpZGRlblwiPnt7XG4gICAgICAgICAgICAgIGV4dHJhY3RJbml0aWFscyhjb21tZW50LnVzZXI/LmZpcnN0TmFtZSArICcgJyArIGNvbW1lbnQudXNlcj8ubGFzdE5hbWUpXG4gICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2F4LXRleHQ+XG4gICAgICAgICAgfVxuICAgICAgICA8L2F4LWF2YXRhcj5cbiAgICAgICAgPGF4LXRpdGxlPnt7IGNvbW1lbnQudXNlcj8uZmlyc3ROYW1lICsgJyAnICsgY29tbWVudC51c2VyPy5sYXN0TmFtZSB9fTwvYXgtdGl0bGU+XG4gICAgICAgIDxheC1jb21tZW50LWRhdGU+e3sgY2FsY0RlZnJlbmV0VGltZShjb21tZW50LmNyZWF0ZWRBdCkgfCBmb3JtYXQgOiAndGltZWxlZnQnIHwgYXN5bmMgfX0gPC9heC1jb21tZW50LWRhdGU+XG4gICAgICAgIDxheC1jb21tZW50LW1lbnUtb3B0aW9ucz5cbiAgICAgICAgICA8YXgtYnV0dG9uIGNsYXNzPVwiYXgtc21cIiBsb29rPVwiYmxhbmtcIiBjb2xvcj1cInNlY29uZGFyeVwiPlxuICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24gYXgtaWNvbi1zb2xpZCBheC1pY29uLW1vcmUtaG9yaXpvbnRhbFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICA8L2F4LWJ1dHRvbj5cblxuICAgICAgICAgIDxheC1kcm9wZG93bi1wYW5lbD5cbiAgICAgICAgICAgIDxheC1idXR0b24taXRlbS1saXN0PlxuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkVkaXRcIiBjb2xvcj1cInNlY29uZGFyeVwiIChjbGljayk9XCJlZGl0TWVzc2FnZShjb21tZW50KVwiPlxuICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiZmEtc29saWQgZmEtZWRpdFwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cblxuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkRlbGV0ZVwiIGNvbG9yPVwiZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZUNvbW1lbnQoY29tbWVudClcIj5cbiAgICAgICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImZhLXNvbGlkIGZhLXRyYXNoLWNhblwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICA8L2F4LWRyb3Bkb3duLXBhbmVsPlxuICAgICAgICA8L2F4LWNvbW1lbnQtbWVudS1vcHRpb25zPlxuICAgICAgICA8YXgtY29udGVudCBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChjb21tZW50LmNvbnRlbnQpXCI+PC9heC1jb250ZW50PlxuICAgICAgICA8YXgtY29tbWVudC1saWtlIChjbGljayk9XCJ0b2dnbGVMaWtlKGNvbW1lbnQpXCIgW2xpa2VkXT1cImNvbW1lbnQuaXNMaWtlZFwiPlxuICAgICAgICAgIHt7IGNvbW1lbnQucmVhY3Rpb25zQ291bnQgfX1cbiAgICAgICAgPC9heC1jb21tZW50LWxpa2U+XG4gICAgICAgIDxheC1jb21tZW50LXJlcGx5LXRleHQgKGNsaWNrKT1cInJlcGx5TWVzc2FnZShjb21tZW50KVwiPjwvYXgtY29tbWVudC1yZXBseS10ZXh0PlxuICAgICAgICBAZm9yKHJlcGx5IG9mIGNvbW1lbnQucmVwbGllczsgdHJhY2sgcmVwbHkuaWQpe1xuICAgICAgICA8YXgtY29tbWVudC1pdGVtIFtpZF09XCJyZXBseS5pZFwiPlxuICAgICAgICAgIDxheC1hdmF0YXIgW2NvbG9yXT1cImF2YXRhckNvbmZpZygpLmNvbG9yXCIgW2xvb2tdPVwiYXZhdGFyQ29uZmlnKCkubG9va1wiPlxuICAgICAgICAgICAgQGlmKHJlcGx5ICYmIGNoZWNrSW1hZ2VFeGlzdHMocmVwbHkuaWQhKSAmJiByZXBseS51c2VyICYmIHJlcGx5LnVzZXIucGljdHVyZSl7XG4gICAgICAgICAgICA8YXgtaW1hZ2UgKG9uRXJyb3IpPVwiaGFuZGxlSW1hZ2VFcnJvcihyZXBseSEuaWQhKVwiIFtzcmNdPVwicmVwbHkudXNlciEucGljdHVyZVwiPlxuICAgICAgICAgICAgICA8YXgtbG9hZGluZz48L2F4LWxvYWRpbmc+XG4gICAgICAgICAgICA8L2F4LWltYWdlPlxuICAgICAgICAgICAgfUBlbHNle1xuICAgICAgICAgICAgPGF4LXRleHQ+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXgtdGV4dC1iYXNlIGF4LW92ZXJmbG93LWhpZGRlblwiPnt7XG4gICAgICAgICAgICAgICAgZXh0cmFjdEluaXRpYWxzKHJlcGx5LnVzZXI/LmZpcnN0TmFtZSArICcgJyArIHJlcGx5LnVzZXI/Lmxhc3ROYW1lKVxuICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYXgtdGV4dD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2F4LWF2YXRhcj5cbiAgICAgICAgICA8YXgtdGl0bGU+e3sgKHJlcGx5Py51c2VyPy5maXJzdE5hbWUgPz8gJycpICsgJyAnICsgKHJlcGx5Py51c2VyPy5sYXN0TmFtZSA/PyAnJykgfX08L2F4LXRpdGxlPlxuICAgICAgICAgIDxheC1jb21tZW50LWRhdGU+e3sgY2FsY0RlZnJlbmV0VGltZShyZXBseS5jcmVhdGVkQXQpIHwgZm9ybWF0IDogJ3RpbWVsZWZ0JyB8IGFzeW5jIH19IDwvYXgtY29tbWVudC1kYXRlPlxuICAgICAgICAgIDxheC1jb21tZW50LW1lbnUtb3B0aW9ucz5cbiAgICAgICAgICAgIDxheC1idXR0b24gY2xhc3M9XCJheC1zbVwiIGxvb2s9XCJibGFua1wiIGNvbG9yPVwic2Vjb25kYXJ5XCI+XG4gICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIGF4LWljb24tc29saWQgYXgtaWNvbi1tb3JlLWhvcml6b250YWxcIj48L2F4LWljb24+XG4gICAgICAgICAgICA8L2F4LWJ1dHRvbj5cblxuICAgICAgICAgICAgPGF4LWRyb3Bkb3duLXBhbmVsPlxuICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkVkaXRcIiBjb2xvcj1cInNlY29uZGFyeVwiIChjbGljayk9XCJlZGl0TWVzc2FnZShjb21tZW50LCByZXBseSlcIj5cbiAgICAgICAgICAgICAgICAgIDxheC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJmYS1zb2xpZCBmYS1lZGl0XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgICAgPC9heC1wcmVmaXg+XG4gICAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbT5cbiAgICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0gdGV4dD1cIkRlbGV0ZVwiIGNvbG9yPVwiZGFuZ2VyXCIgKGNsaWNrKT1cImRlbGV0ZVJlcGx5KGNvbW1lbnQsIHJlcGx5KVwiPlxuICAgICAgICAgICAgICAgICAgPGF4LXByZWZpeD5cbiAgICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImZhLXNvbGlkIGZhLXRyYXNoLWNhblwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0+XG4gICAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICAgIDwvYXgtZHJvcGRvd24tcGFuZWw+XG4gICAgICAgICAgPC9heC1jb21tZW50LW1lbnUtb3B0aW9ucz5cbiAgICAgICAgICA8YXgtY29udGVudCBbaW5uZXJIVE1MXT1cInNhbml0aXplSHRtbChyZXBseS5jb250ZW50KVwiPjwvYXgtY29udGVudD5cbiAgICAgICAgICA8YXgtY29tbWVudC1saWtlIChjbGljayk9XCJ0b2dnbGVMaWtlKGNvbW1lbnQsIHJlcGx5KVwiIFtsaWtlZF09XCJyZXBseS5pc0xpa2VkXCI+XG4gICAgICAgICAgICB7eyByZXBseS5yZWFjdGlvbnNDb3VudCB9fVxuICAgICAgICAgIDwvYXgtY29tbWVudC1saWtlPlxuICAgICAgICAgIDxheC1jb21tZW50LXJlcGx5LXRleHQgKGNsaWNrKT1cInJlcGx5TWVzc2FnZShjb21tZW50LCByZXBseSlcIj48L2F4LWNvbW1lbnQtcmVwbHktdGV4dD5cbiAgICAgICAgPC9heC1jb21tZW50LWl0ZW0+XG4gICAgICAgIH1cbiAgICAgIDwvYXgtY29tbWVudC1pdGVtPlxuICAgICAgfSA8L2F4LWNvbW1lbnQtdmlld1xuICAgID59IEBlbHNle1xuICAgIDxkaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXgtZmxleCBheC1mbGV4LWNvbCBheC1nYXAtNCBheC1qdXN0aWZ5LWNlbnRlciBheC1pdGVtcy1jZW50ZXIgYXgtcC0xMFwiPlxuICAgICAgICA8c3ZnXG4gICAgICAgICAgY2xhc3M9XCJheC1teC1hdXRvXCJcbiAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICB3aWR0aD1cIjE1NFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMTYxXCJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAwIDE1NCAxNjFcIlxuICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTAuMDYxNjQ1NSA4NC40MjY4QzAuMDYxNjQ1NSA0Mi4wMjEzIDM0LjQzNSA3LjgzNzY1IDc2LjY1MDcgNy44Mzc2NUMxMTguODAzIDcuODM3NjUgMTUzLjIyNCA0Mi4wMDU1IDE1My4yMjQgODQuNDI2OEMxNTMuMjI0IDEwMi40MiAxNDcuMDI2IDExOC45NzQgMTM2LjYyMiAxMzIuMDM0QzEyMi4yODIgMTUwLjEzOCAxMDAuMzY3IDE2MSA3Ni42NTA3IDE2MUM1Mi43NzU5IDE2MSAzMC45ODgyIDE1MC4wNTkgMTYuNjYzMyAxMzIuMDM0QzYuMjU5NjEgMTE4Ljk3NCAwLjA2MTY0NTUgMTAyLjQyIDAuMDYxNjQ1NSA4NC40MjY4WlwiXG4gICAgICAgICAgICBmaWxsPVwiI0VFRjJGRlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk05Ni44MTg5IDAuNjMyNDk4TDk2LjgxODkgMC42MzIzODRMOTYuODA4MyAwLjYzMDk1NEM5Ni4yMDM0IDAuNTQ5NTgxIDk1LjU5MzEgMC41IDk0Ljk3ODcgMC41SDI5LjMzOEMyMi43MTEyIDAuNSAxNy4zMzk0IDUuODQ0NTUgMTcuMzM5NCAxMi40NDczVjE0Mi43MTVDMTcuMzM5NCAxNDkuMzE4IDIyLjcxMTIgMTU0LjY2MiAyOS4zMzggMTU0LjY2MkgxMjMuOTQ4QzEzMC41OTEgMTU0LjY2MiAxMzUuOTQ2IDE0OS4zMTcgMTM1Ljk0NiAxNDIuNzE1VjM4LjkzMDlDMTM1Ljk0NiAzOC4wMjQ0IDEzNS44NDcgMzcuMTMzNCAxMzUuNjQ4IDM2LjI1ODZMMTM1LjY0OCAzNi4yNTg0QzEzNS4xMTcgMzMuOTMwOSAxMzMuODc0IDMxLjc2ODYgMTMyLjA2NiAzMC4xMzMzQzEzMi4wNjYgMzAuMTMzMSAxMzIuMDY1IDMwLjEzMjkgMTMyLjA2NSAzMC4xMzI3TDEwMy4wNjggMy42NTIwM0MxMDMuMDY4IDMuNjUxOSAxMDMuMDY3IDMuNjUxNzcgMTAzLjA2NyAzLjY1MTY0QzEwMS4zMTEgMi4wMzUyNiA5OS4xMzk2IDAuOTk1NTUyIDk2LjgxODkgMC42MzI0OThaXCJcbiAgICAgICAgICAgIGZpbGw9XCJ3aGl0ZVwiXG4gICAgICAgICAgICBzdHJva2U9XCIjRTVFN0VCXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxlbGxpcHNlIGN4PVwiODAuMDYxOFwiIGN5PVwiODFcIiByeD1cIjI4LjAzNDJcIiByeT1cIjI4LjAzNDJcIiBmaWxsPVwiI0VFRjJGRlwiIC8+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIGQ9XCJNOTkuMjM5MyA2MS4zMDYxTDk5LjIzOTEgNjEuMzA1OEM4OC40OTggNTAuNTgwOCA3MS4xMDkyIDUwLjU4MDQgNjAuMzgzNSA2MS4zMDYxQzQ5LjY0MjMgNzIuMDMxNiA0OS42NDIyIDg5LjQzNjEgNjAuMzgzMiAxMDAuMTYyQzcxLjEwOSAxMTAuOTAzIDg4LjQ5ODIgMTEwLjkwMyA5OS4yMzkzIDEwMC4xNjJDMTA5Ljk2NSA4OS40MzYzIDEwOS45NjUgNzIuMDMxNyA5OS4yMzkzIDYxLjMwNjFaTTEwNS44NjMgNTQuNjgzMkMxMjAuMjQ5IDY5LjA2OTUgMTIwLjI0OSA5Mi4zOTg1IDEwNS44NjMgMTA2Ljc4NUM5MS40NjA1IDEyMS4xNzEgNjguMTQ2OCAxMjEuMTcxIDUzLjc0NDYgMTA2Ljc4NUMzOS4zNTgyIDkyLjM5ODcgMzkuMzU4MiA2OS4wNjkzIDUzLjc0NDYgNTQuNjgzQzY4LjE0NjggNDAuMjk2NSA5MS40NjA1IDQwLjI5NjYgMTA1Ljg2MyA1NC42ODMyWlwiXG4gICAgICAgICAgICBzdHJva2U9XCIjRTVFN0VCXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTExMC43ODIgMTE5LjI2N0wxMDIuMDE2IDExMC40OTJDMTA0Ljg4OCAxMDguMjY3IDEwNy40NzYgMTA1LjY1MSAxMDkuNTY0IDEwMi45NTVMMTE4LjMyOSAxMTEuNzI5TDExMC43ODIgMTE5LjI2N1pcIlxuICAgICAgICAgICAgc3Ryb2tlPVwiI0U1RTdFQlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk0xMzkuMTIyIDEyNS43ODFMMTM5LjEyMiAxMjUuNzhMMTIzLjMxMyAxMDkuOTg4QzEyMy4zMTMgMTA5Ljk4NyAxMjMuMzEzIDEwOS45ODcgMTIzLjMxMiAxMDkuOTg2QzEyMS45OTYgMTA4LjY1MyAxMTkuODQ5IDEwOC42NTcgMTE4LjUyMSAxMDkuOTg1TDExOC44NzEgMTEwLjMzNUwxMTguNTIxIDEwOS45ODVMMTA5LjA0NyAxMTkuNDU5QzEwNy43MzEgMTIwLjc3NSAxMDcuNzM1IDEyMi45MTggMTA5LjA0NCAxMjQuMjQ3TDEwOS4wNDcgMTI0LjI0OUwxMjQuODU4IDE0MC4wNkMxMjguNzg5IDE0My45OTIgMTM1LjE5MSAxNDMuOTkyIDEzOS4xMjIgMTQwLjA2QzE0My4wNjkgMTM2LjExMyAxNDMuMDY5IDEyOS43MjggMTM5LjEyMiAxMjUuNzgxWlwiXG4gICAgICAgICAgICBmaWxsPVwiI0E1QjRGQ1wiXG4gICAgICAgICAgICBzdHJva2U9XCIjODE4Q0Y4XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTgzLjE4NSA4Ny4yMjg1QzgyLjUzODcgODcuMjI4NSA4Mi4wMDI3IDg2LjY5MjYgODIuMDAyNyA4Ni4wMzA1QzgyLjAwMjcgODMuMzgyMSA3Ny45OTg3IDgzLjM4MjEgNzcuOTk4NyA4Ni4wMzA1Qzc3Ljk5ODcgODYuNjkyNiA3Ny40NjI3IDg3LjIyODUgNzYuODAwNiA4Ny4yMjg1Qzc2LjE1NDMgODcuMjI4NSA3NS42MTgzIDg2LjY5MjYgNzUuNjE4MyA4Ni4wMzA1Qzc1LjYxODMgODAuMjI5NCA4NC4zODMxIDgwLjI0NTEgODQuMzgzMSA4Ni4wMzA1Qzg0LjM4MzEgODYuNjkyNiA4My44NDcxIDg3LjIyODUgODMuMTg1IDg3LjIyODVaXCJcbiAgICAgICAgICAgIGZpbGw9XCIjNEY0NkU1XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBkPVwiTTkzLjM1MjggNzcuMDkyNkg4OC40MDNDODcuNzQwOSA3Ny4wOTI2IDg3LjIwNDkgNzYuNTU2NyA4Ny4yMDQ5IDc1Ljg5NDZDODcuMjA0OSA3NS4yNDgzIDg3Ljc0MDkgNzQuNzEyMyA4OC40MDMgNzQuNzEyM0g5My4zNTI4Qzk0LjAxNDkgNzQuNzEyMyA5NC41NTA5IDc1LjI0ODMgOTQuNTUwOSA3NS44OTQ2Qzk0LjU1MDkgNzYuNTU2NyA5NC4wMTQ5IDc3LjA5MjYgOTMuMzUyOCA3Ny4wOTI2WlwiXG4gICAgICAgICAgICBmaWxsPVwiIzRGNDZFNVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgZD1cIk03MS41OTg3IDc3LjA5MjVINjYuNjQ4OEM2NS45ODY3IDc3LjA5MjUgNjUuNDUwNyA3Ni41NTY1IDY1LjQ1MDcgNzUuODk0NUM2NS40NTA3IDc1LjI0ODEgNjUuOTg2NyA3NC43MTIyIDY2LjY0ODggNzQuNzEyMkg3MS41OTg3QzcyLjI0NSA3NC43MTIyIDcyLjc4MSA3NS4yNDgxIDcyLjc4MSA3NS44OTQ1QzcyLjc4MSA3Ni41NTY1IDcyLjI0NSA3Ny4wOTI1IDcxLjU5ODcgNzcuMDkyNVpcIlxuICAgICAgICAgICAgZmlsbD1cIiM0RjQ2RTVcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgPHJlY3QgeD1cIjM4LjM1MjJcIiB5PVwiMjEuNTEyOFwiIHdpZHRoPVwiNDEuMDI1NlwiIGhlaWdodD1cIjIuNzM1MDRcIiByeD1cIjEuMzY3NTJcIiBmaWxsPVwiIzRGNDZFNVwiIC8+XG4gICAgICAgICAgPHJlY3QgeD1cIjM4LjM1MjJcIiB5PVwiMTMzLjY1XCIgd2lkdGg9XCI1NC43MDA5XCIgaGVpZ2h0PVwiNS40NzAwOVwiIHJ4PVwiMi43MzUwNFwiIGZpbGw9XCIjQTVCNEZDXCIgLz5cbiAgICAgICAgICA8cmVjdCB4PVwiMzguMzUyMlwiIHk9XCIyOS43MTc5XCIgd2lkdGg9XCIxMy42NzUyXCIgaGVpZ2h0PVwiMi43MzUwNFwiIHJ4PVwiMS4zNjc1MlwiIGZpbGw9XCIjNEY0NkU1XCIgLz5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiNTYuMTNcIiBjeT1cIjMxLjA4NTRcIiByPVwiMS4zNjc1MlwiIGZpbGw9XCIjNEY0NkU1XCIgLz5cbiAgICAgICAgICA8Y2lyY2xlIGN4PVwiNjEuNjAwMVwiIGN5PVwiMzEuMDg1NFwiIHI9XCIxLjM2NzUyXCIgZmlsbD1cIiM0RjQ2RTVcIiAvPlxuICAgICAgICAgIDxjaXJjbGUgY3g9XCI2Ny4wNzAyXCIgY3k9XCIzMS4wODU0XCIgcj1cIjEuMzY3NTJcIiBmaWxsPVwiIzRGNDZFNVwiIC8+XG4gICAgICAgIDwvc3ZnPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMiBjbGFzcz1cImF4LXRleHQtY2VudGVyIGF4LXRleHQtbmV1dHJhbC02MDAgYXgtZm9udC1zZW1pYm9sZCBheC1sZWFkaW5nLWxvb3NlIGF4LXBiLTJcIj5cbiAgICAgICAgICAgIFRoZXJlIGlzIG5vIENvbW1lbnQhXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvYXgtY29tbWVudC1jb250YWluZXI+XG4gIDxheC1mb3JtPlxuICAgIDxheC1mb3JtLWZpZWxkPlxuICAgICAgPGRpdj5cbiAgICAgICAgQGlmKGlzUmVwbHlpbmdNb2RlKCkgfHwgaXNFZGl0aW5nTW9kZSgpKXtcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwiYXgtZmxleCBheC1qdXN0aWZ5LWJldHdlZW4gYXgtcm91bmRlZC1iLW5vbmUgYXgtYm9yZGVyIGF4LWJvcmRlci1iLTAgYXgtcm91bmRlZC1sZyBheC1iZy1vbi1zdXJmYWNlIGF4LXB4LTYgYXgtcHktMyBheC13LWZ1bGwgYXgtaXRlbXMtY2VudGVyIGF4LW92ZXJmbG93LWhpZGRlbiBheC10ZXh0LXNtIGF4LWxlYWRpbmctbm9uZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IChjbGljayk9XCJzY3JvbGxNYWluKClcIiBjbGFzcz1cImF4LWZsZXggYXgtanVzdGlmeS1zdGFydCBheC1pdGVtcy1jZW50ZXIgYXgtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtjbGFzc109XCJpc1JlcGx5aW5nTW9kZSgpID8gJ2ZhLXJlcGx5JyA6ICdmYS1wZW4nXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYS1zb2xpZCBheC10ZXh0LXByaW1hcnktNTAwIGRhcms6YXgtdGV4dC1wcmltYXJ5LTMwMCBheC10ZXh0LTJ4bCBheC1tZS00XCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYXgtZmxleCBheC1mbGV4LWNvbCBheC1nYXAtMiBheC1qdXN0aWZ5LWJldHdlZW4gYXgtYWxpZ24tbWlkZGxlIGF4LWxlYWRpbmctNCBheC1vdmVyZmxvdy1oaWRkZW5cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cCBjbGFzcz1cImF4LXRleHQtcHJpbWFyeS01MDAgZGFyazpheC10ZXh0LXByaW1hcnktMzAwXCI+XG4gICAgICAgICAgICAgICAge3sgaXNSZXBseWluZ01vZGUoKSA/ICdSZXBseSB0byAnIDogJ0VkaXQgTWVzc2FnZScgfX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImF4LWZvbnQtYm9sZFwiPlxuICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgaXNSZXBseWluZ01vZGUoKVxuICAgICAgICAgICAgICAgICAgICAgID8gYWN0aXZlUmVwbHlDb21tZW50KCk/LnVzZXI/LmZpcnN0TmFtZSArICcgJyArIGFjdGl2ZVJlcGx5Q29tbWVudCgpPy51c2VyPy5sYXN0TmFtZVxuICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImF4LXRydW5jYXRlXCJcbiAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIlxuICAgICAgICAgICAgICAgICAgaXNSZXBseWluZ01vZGUoKVxuICAgICAgICAgICAgICAgICAgICA/IHNhbml0aXplSHRtbChhY3RpdmVSZXBseUNvbW1lbnQoKT8uY29udGVudCA/PyAnJylcbiAgICAgICAgICAgICAgICAgICAgOiBzYW5pdGl6ZUh0bWwoYWN0aXZlRWRpdENvbW1lbnQoKT8uY29udGVudCA/PyAnJylcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PjxpIChjbGljayk9XCJyZXNldFJlcGx5RWRpdFN0YXRlKClcIiBjbGFzcz1cImZhLXNvbGlkIGF4LXRleHQtMnhsIGZhLXhtYXJrIGF4LWN1cnNvci1wb2ludGVyXCI+PC9pPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8YXgtd3lzaXd5Zy1jb250YWluZXIgI3cgW2xvb2tdPVwid3lzaXd5Z09wdGlvbnMoKS5sb29rXCIgWyhuZ01vZGVsKV09XCJjb21tZW50Q29udGVudFwiPlxuICAgICAgICAgIDxheC13eXNpd3lnLXZpZXcgY2xhc3M9XCJheC1taW4taC0yOFwiPjwvYXgtd3lzaXd5Zy12aWV3PlxuICAgICAgICAgIDxheC13eXNpd3lnLXRvb2xiYXI+XG4gICAgICAgICAgICA8YXgtd3lzaXd5Zy1oaXN0b3J5PjwvYXgtd3lzaXd5Zy1oaXN0b3J5PlxuICAgICAgICAgICAgPGF4LXd5c2l3eWctZm9udC1zdHlsZT48L2F4LXd5c2l3eWctZm9udC1zdHlsZT5cbiAgICAgICAgICAgIDxheC13eXNpd3lnLWNvbG9ycz48L2F4LXd5c2l3eWctY29sb3JzPlxuICAgICAgICAgICAgPGF4LXd5c2l3eWctbGlzdD48L2F4LXd5c2l3eWctbGlzdD5cbiAgICAgICAgICAgIDxheC13eXNpd3lnLWFsaWdubWVudD48L2F4LXd5c2l3eWctYWxpZ25tZW50PlxuICAgICAgICAgICAgPGF4LXN1ZmZpeD5cbiAgICAgICAgICAgICAgPGF4LWRyb3Bkb3duLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJoYXNDb29sZG93bigpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIG1vZGU9XCJzcGxpdFwiXG4gICAgICAgICAgICAgICAgdGV4dD1cIlNlbmRcIlxuICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInN1Ym1pdENvbW1lbnQoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAaWYoaXNTdWJtaXR0aW5nKCkpeyA8YXgtbG9hZGluZz48L2F4LWxvYWRpbmc+IH1cbiAgICAgICAgICAgICAgICA8YXgtYnV0dG9uLWl0ZW0tbGlzdD5cbiAgICAgICAgICAgICAgICAgIDxheC1idXR0b24taXRlbSAoY2xpY2spPVwic3VibWl0Q29tbWVudCh0cnVlKVwiIHRleHQ9XCJTZW5kIFByaXZhdGUgLi4uXCIgbmFtZT1cInByaXZhdGVcIiBkYXRhPVwicHJpdmF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YXgtcHJlZml4PlxuICAgICAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJmYS1yZWd1bGFyIGZhLXVzZXItc2VjcmV0XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2F4LXByZWZpeD5cbiAgICAgICAgICAgICAgICAgIDwvYXgtYnV0dG9uLWl0ZW0+XG4gICAgICAgICAgICAgICAgPC9heC1idXR0b24taXRlbS1saXN0PlxuICAgICAgICAgICAgICA8L2F4LWRyb3Bkb3duLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvYXgtc3VmZml4PlxuICAgICAgICAgIDwvYXgtd3lzaXd5Zy10b29sYmFyPlxuICAgICAgICAgIDxheC12YWxpZGF0aW9uLXJ1bGUgcnVsZT1cImNhbGxiYWNrXCIgW29wdGlvbnNdPVwieyB2YWxpZGF0ZTogdmFsaWRhdGVDb250ZW50IH1cIj48L2F4LXZhbGlkYXRpb24tcnVsZT5cbiAgICAgICAgPC9heC13eXNpd3lnLWNvbnRhaW5lcj5cbiAgICAgIDwvZGl2PlxuICAgIDwvYXgtZm9ybS1maWVsZD5cbiAgPC9heC1mb3JtPlxuPC9kaXY+XG4iXX0=