@eqproject/eqp-dynamic-module 2.8.8 → 3.0.0

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 (293) hide show
  1. package/{esm2020 → esm2022}/eqproject-eqp-dynamic-module.mjs +4 -4
  2. package/esm2022/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +531 -0
  3. package/esm2022/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +1245 -0
  4. package/esm2022/lib/components/private/add-form-field/add-form-field.component.mjs +1263 -0
  5. package/esm2022/lib/components/private/add-formula-field/add-formula-field.component.mjs +200 -0
  6. package/esm2022/lib/components/private/dbgetter/dbgetter.component.mjs +233 -0
  7. package/esm2022/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +280 -0
  8. package/esm2022/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +143 -0
  9. package/esm2022/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +75 -0
  10. package/esm2022/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +106 -0
  11. package/esm2022/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +107 -0
  12. package/esm2022/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +265 -0
  13. package/esm2022/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +261 -0
  14. package/esm2022/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +82 -0
  15. package/esm2022/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +176 -0
  16. package/esm2022/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +129 -0
  17. package/esm2022/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +103 -0
  18. package/esm2022/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +78 -0
  19. package/esm2022/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +837 -0
  20. package/esm2022/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +408 -0
  21. package/esm2022/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +651 -0
  22. package/esm2022/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +82 -0
  23. package/esm2022/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.mjs +59 -0
  24. package/esm2022/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +131 -0
  25. package/esm2022/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.mjs +89 -0
  26. package/esm2022/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +460 -0
  27. package/esm2022/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.mjs +58 -0
  28. package/esm2022/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.mjs +110 -0
  29. package/esm2022/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.mjs +108 -0
  30. package/esm2022/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.mjs +58 -0
  31. package/esm2022/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.mjs +135 -0
  32. package/esm2022/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.mjs +58 -0
  33. package/esm2022/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.mjs +141 -0
  34. package/esm2022/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.mjs +126 -0
  35. package/esm2022/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.mjs +111 -0
  36. package/esm2022/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.mjs +111 -0
  37. package/esm2022/lib/components/private/graphs/graph/graph.component.mjs +186 -0
  38. package/esm2022/lib/components/private/graphs/graphs.component.mjs +175 -0
  39. package/esm2022/lib/components/private/spinner/spinner.component.mjs +21 -0
  40. package/{esm2020 → esm2022}/lib/components/private/tmw-image-drawer/i18n.mjs +62 -62
  41. package/esm2022/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.mjs +413 -0
  42. package/esm2022/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +348 -0
  43. package/esm2022/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.mjs +81 -0
  44. package/esm2022/lib/components/private/trigger-creator/trigger-creator.component.mjs +199 -0
  45. package/esm2022/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.mjs +91 -0
  46. package/esm2022/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.mjs +88 -0
  47. package/esm2022/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.mjs +61 -0
  48. package/esm2022/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.mjs +69 -0
  49. package/esm2022/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.mjs +107 -0
  50. package/esm2022/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.mjs +92 -0
  51. package/esm2022/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.mjs +92 -0
  52. package/esm2022/lib/directives/dynamic-loader/dynamic-loader.directive.mjs +63 -0
  53. package/esm2022/lib/directives/speech-to-text/speech-to-text.directive.mjs +192 -0
  54. package/esm2022/lib/eqp-dynamic-module.module.mjs +253 -0
  55. package/{esm2020 → esm2022}/lib/interfaces/iBaseFieldComponent.interface.mjs +1 -1
  56. package/{esm2020 → esm2022}/lib/interfaces/iRootObject.interface.mjs +1 -1
  57. package/esm2022/lib/models/baseField.model.mjs +133 -0
  58. package/esm2022/lib/models/baseObj.model.mjs +10 -0
  59. package/{esm2020 → esm2022}/lib/models/context.model.mjs +10 -8
  60. package/esm2022/lib/models/dynAttachment.mjs +52 -0
  61. package/esm2022/lib/models/dynamicModuleCompileConfig.model.mjs +45 -0
  62. package/esm2022/lib/models/dynamicModuleConfig.model.mjs +13 -0
  63. package/esm2022/lib/models/dynamicModuleConfiguratorConfig.model.mjs +11 -0
  64. package/esm2022/lib/models/dynamicModuleConfiguratorSpecificConfig.model.mjs +16 -0
  65. package/{esm2020 → esm2022}/lib/models/dynamicModuleFilterResultViewModeEnum.model.mjs +6 -6
  66. package/esm2022/lib/models/dynamicModuleGeneralConfig.model.mjs +36 -0
  67. package/esm2022/lib/models/dynamicModuleListConfig.model.mjs +48 -0
  68. package/esm2022/lib/models/dynamicModuleListFormRecordActionsDefault.mjs +35 -0
  69. package/{esm2020 → esm2022}/lib/models/dynamicModuleRepairConfig.model.mjs +10 -10
  70. package/{esm2020 → esm2022}/lib/models/dynamicModuleViewModeEnum.mjs +11 -11
  71. package/esm2022/lib/models/endPointConfiguration.model.mjs +211 -0
  72. package/{esm2020 → esm2022}/lib/models/entity.model.mjs +10 -7
  73. package/esm2022/lib/models/fields/attachmentField.model.mjs +28 -0
  74. package/esm2022/lib/models/fields/booleanField.model.mjs +15 -0
  75. package/esm2022/lib/models/fields/dateField.model.mjs +15 -0
  76. package/esm2022/lib/models/fields/imageField.model.mjs +14 -0
  77. package/esm2022/lib/models/fields/imageSelectorField.model.mjs +10 -0
  78. package/esm2022/lib/models/fields/imageWithMarkersField.model.mjs +7 -0
  79. package/{esm2020 → esm2022}/lib/models/fields/labelField.model.mjs +5 -4
  80. package/esm2022/lib/models/fields/listValueField.model.mjs +24 -0
  81. package/esm2022/lib/models/fields/lookupField.model.mjs +11 -0
  82. package/esm2022/lib/models/fields/numericField.model.mjs +13 -0
  83. package/esm2022/lib/models/fields/textField.model.mjs +18 -0
  84. package/esm2022/lib/models/fields/textareaField.model.mjs +9 -0
  85. package/esm2022/lib/models/form.model.mjs +63 -0
  86. package/esm2022/lib/models/getter.model.mjs +6 -0
  87. package/esm2022/lib/models/graph.model.mjs +19 -0
  88. package/{esm2020 → esm2022}/lib/models/logicOperator.model.mjs +55 -55
  89. package/esm2022/lib/models/record.model.mjs +39 -0
  90. package/esm2022/lib/models/statistic.model.mjs +12 -0
  91. package/esm2022/lib/models/trigger.model.mjs +63 -0
  92. package/esm2022/lib/modules/formula.model.mjs +266 -0
  93. package/{esm2020 → esm2022}/lib/modules/material.module.mjs +231 -231
  94. package/{esm2020 → esm2022}/lib/services/custom-form-validators.service.mjs +18 -18
  95. package/esm2022/lib/services/db-date.service.mjs +178 -0
  96. package/esm2022/lib/services/eqp-dynamic-module-dialog.service.mjs +114 -0
  97. package/esm2022/lib/services/global.service.mjs +43 -0
  98. package/esm2022/lib/services/spinner.service.mjs +41 -0
  99. package/esm2022/lib/services/utilityHelper.services.mjs +601 -0
  100. package/{esm2020 → esm2022}/public-api.mjs +56 -56
  101. package/fesm2022/eqproject-eqp-dynamic-module.mjs +13506 -0
  102. package/fesm2022/eqproject-eqp-dynamic-module.mjs.map +1 -0
  103. package/index.d.ts +5 -5
  104. package/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.d.ts +162 -162
  105. package/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.d.ts +308 -308
  106. package/lib/components/private/add-form-field/add-form-field.component.d.ts +263 -263
  107. package/lib/components/private/add-formula-field/add-formula-field.component.d.ts +45 -45
  108. package/lib/components/private/dbgetter/dbgetter.component.d.ts +51 -51
  109. package/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.d.ts +84 -84
  110. package/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.d.ts +57 -57
  111. package/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.d.ts +27 -27
  112. package/lib/components/private/field-templates/date-field-template/date-field-template.component.d.ts +36 -36
  113. package/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.d.ts +33 -33
  114. package/lib/components/private/field-templates/image-field-template/image-field-template.component.d.ts +80 -80
  115. package/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.d.ts +78 -78
  116. package/lib/components/private/field-templates/label-field-template/label-field-template.component.d.ts +33 -33
  117. package/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.d.ts +59 -59
  118. package/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.d.ts +40 -40
  119. package/lib/components/private/field-templates/text-field-template/text-field-template.component.d.ts +35 -35
  120. package/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.d.ts +31 -31
  121. package/lib/components/private/form-records/add-form-record/add-form-record.component.d.ts +104 -104
  122. package/lib/components/private/form-records/list-form-record/list-form-record.component.d.ts +83 -83
  123. package/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.d.ts +151 -151
  124. package/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.d.ts +39 -39
  125. package/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.d.ts +20 -20
  126. package/lib/components/private/form-records/view-form-record/view-form-record.component.d.ts +36 -36
  127. package/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.d.ts +42 -42
  128. package/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.d.ts +109 -109
  129. package/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.d.ts +21 -21
  130. package/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.d.ts +37 -37
  131. package/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.d.ts +37 -37
  132. package/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.d.ts +21 -21
  133. package/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.d.ts +47 -47
  134. package/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.d.ts +21 -21
  135. package/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.d.ts +47 -47
  136. package/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.d.ts +40 -40
  137. package/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.d.ts +38 -38
  138. package/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.d.ts +38 -38
  139. package/lib/components/private/graphs/graph/graph.component.d.ts +25 -25
  140. package/lib/components/private/graphs/graphs.component.d.ts +47 -47
  141. package/lib/components/private/spinner/spinner.component.d.ts +12 -12
  142. package/lib/components/private/tmw-image-drawer/i18n.d.ts +27 -27
  143. package/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.d.ts +70 -70
  144. package/lib/components/private/tmw-image-marker/tmw-image-marker.component.d.ts +62 -62
  145. package/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.d.ts +42 -42
  146. package/lib/components/private/trigger-creator/trigger-creator.component.d.ts +42 -42
  147. package/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.d.ts +34 -34
  148. package/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.d.ts +34 -34
  149. package/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.d.ts +24 -24
  150. package/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.d.ts +34 -34
  151. package/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.d.ts +37 -37
  152. package/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.d.ts +36 -36
  153. package/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.d.ts +36 -36
  154. package/lib/directives/dynamic-loader/dynamic-loader.directive.d.ts +26 -26
  155. package/lib/directives/speech-to-text/speech-to-text.directive.d.ts +31 -31
  156. package/lib/eqp-dynamic-module.module.d.ts +85 -85
  157. package/lib/interfaces/iBaseFieldComponent.interface.d.ts +8 -8
  158. package/lib/interfaces/iRootObject.interface.d.ts +11 -11
  159. package/lib/models/baseField.model.d.ts +126 -126
  160. package/lib/models/baseObj.model.d.ts +9 -9
  161. package/lib/models/context.model.d.ts +9 -9
  162. package/lib/models/dynAttachment.d.ts +49 -49
  163. package/lib/models/dynamicModuleCompileConfig.model.d.ts +35 -35
  164. package/lib/models/dynamicModuleConfig.model.d.ts +11 -11
  165. package/lib/models/dynamicModuleConfiguratorConfig.model.d.ts +7 -7
  166. package/lib/models/dynamicModuleConfiguratorSpecificConfig.model.d.ts +11 -11
  167. package/lib/models/dynamicModuleFilterResultViewModeEnum.model.d.ts +5 -5
  168. package/lib/models/dynamicModuleGeneralConfig.model.d.ts +29 -29
  169. package/lib/models/dynamicModuleListConfig.model.d.ts +39 -39
  170. package/lib/models/dynamicModuleListFormRecordActionsDefault.d.ts +9 -9
  171. package/lib/models/dynamicModuleRepairConfig.model.d.ts +4 -4
  172. package/lib/models/dynamicModuleViewModeEnum.d.ts +10 -10
  173. package/lib/models/endPointConfiguration.model.d.ts +46 -46
  174. package/lib/models/entity.model.d.ts +11 -11
  175. package/lib/models/fields/attachmentField.model.d.ts +17 -17
  176. package/lib/models/fields/booleanField.model.d.ts +11 -11
  177. package/lib/models/fields/dateField.model.d.ts +13 -13
  178. package/lib/models/fields/imageField.model.d.ts +13 -13
  179. package/lib/models/fields/imageSelectorField.model.d.ts +12 -12
  180. package/lib/models/fields/imageWithMarkersField.model.d.ts +7 -7
  181. package/lib/models/fields/labelField.model.d.ts +4 -4
  182. package/lib/models/fields/listValueField.model.d.ts +24 -24
  183. package/lib/models/fields/lookupField.model.d.ts +10 -10
  184. package/lib/models/fields/numericField.model.d.ts +12 -12
  185. package/lib/models/fields/textField.model.d.ts +16 -16
  186. package/lib/models/fields/textareaField.model.d.ts +8 -8
  187. package/lib/models/form.model.d.ts +61 -61
  188. package/lib/models/getter.model.d.ts +5 -5
  189. package/lib/models/graph.model.d.ts +18 -18
  190. package/lib/models/logicOperator.model.d.ts +48 -48
  191. package/lib/models/record.model.d.ts +41 -41
  192. package/lib/models/statistic.model.d.ts +13 -13
  193. package/lib/models/trigger.model.d.ts +51 -51
  194. package/lib/modules/formula.model.d.ts +32 -32
  195. package/lib/modules/material.module.d.ts +37 -37
  196. package/lib/services/custom-form-validators.service.d.ts +5 -5
  197. package/lib/services/db-date.service.d.ts +24 -24
  198. package/lib/services/eqp-dynamic-module-dialog.service.d.ts +44 -44
  199. package/lib/services/global.service.d.ts +16 -16
  200. package/lib/services/spinner.service.d.ts +18 -18
  201. package/lib/services/utilityHelper.services.d.ts +101 -101
  202. package/package.json +20 -25
  203. package/public-api.d.ts +53 -53
  204. package/esm2020/lib/components/exported/eqp-dynamic-module/eqp-dynamic-module.component.mjs +0 -516
  205. package/esm2020/lib/components/exported/eqp-dynamic-module-configurator/eqp-dynamic-module-configurator.component.mjs +0 -1196
  206. package/esm2020/lib/components/private/add-form-field/add-form-field.component.mjs +0 -1202
  207. package/esm2020/lib/components/private/add-formula-field/add-formula-field.component.mjs +0 -196
  208. package/esm2020/lib/components/private/dbgetter/dbgetter.component.mjs +0 -226
  209. package/esm2020/lib/components/private/dynamic-module-field-fix/dynamic-module-field.component.mjs +0 -263
  210. package/esm2020/lib/components/private/field-templates/attachment-field-template/attachment-field-template.component.mjs +0 -138
  211. package/esm2020/lib/components/private/field-templates/boolean-field-template/boolean-field-template.component.mjs +0 -71
  212. package/esm2020/lib/components/private/field-templates/date-field-template/date-field-template.component.mjs +0 -104
  213. package/esm2020/lib/components/private/field-templates/image-field-selector-template/image-field-selector-template.component.mjs +0 -100
  214. package/esm2020/lib/components/private/field-templates/image-field-template/image-field-template.component.mjs +0 -256
  215. package/esm2020/lib/components/private/field-templates/image-with-markers-field-template/image-with-markers-field-template.component.mjs +0 -252
  216. package/esm2020/lib/components/private/field-templates/label-field-template/label-field-template.component.mjs +0 -74
  217. package/esm2020/lib/components/private/field-templates/list-value-field-template/list-value-field-template.component.mjs +0 -172
  218. package/esm2020/lib/components/private/field-templates/numeric-field-template/numeric-field-template.component.mjs +0 -124
  219. package/esm2020/lib/components/private/field-templates/text-field-template/text-field-template.component.mjs +0 -95
  220. package/esm2020/lib/components/private/field-templates/textarea-field-template/textarea-field-template.component.mjs +0 -71
  221. package/esm2020/lib/components/private/form-records/add-form-record/add-form-record.component.mjs +0 -828
  222. package/esm2020/lib/components/private/form-records/list-form-record/list-form-record.component.mjs +0 -400
  223. package/esm2020/lib/components/private/form-records/list-view-form-record/list-view-form-record.component.mjs +0 -628
  224. package/esm2020/lib/components/private/form-records/list-view-form-record/single-record/single-record.component.mjs +0 -75
  225. package/esm2020/lib/components/private/form-records/repair-form-fields/repair-form-fields.component.mjs +0 -54
  226. package/esm2020/lib/components/private/form-records/view-form-record/view-form-record.component.mjs +0 -125
  227. package/esm2020/lib/components/private/form-statistics/dynamic-module-filter-fix/dynamic-module-filter-fix.component.mjs +0 -76
  228. package/esm2020/lib/components/private/form-statistics/filter-form-statistic/filter-form-statistic.component.mjs +0 -453
  229. package/esm2020/lib/components/private/form-statistics/filter-templates/attachment-filter-template/attachment-filter-template.component.mjs +0 -57
  230. package/esm2020/lib/components/private/form-statistics/filter-templates/boolean-filter-template/boolean-filter-template.component.mjs +0 -104
  231. package/esm2020/lib/components/private/form-statistics/filter-templates/date-filter-template/date-filter-template.component.mjs +0 -105
  232. package/esm2020/lib/components/private/form-statistics/filter-templates/image-filter-template/image-filter-template.component.mjs +0 -57
  233. package/esm2020/lib/components/private/form-statistics/filter-templates/image-selector-filter-template/image-selector-filter-template.component.mjs +0 -128
  234. package/esm2020/lib/components/private/form-statistics/filter-templates/list-form-record-filter-template/list-form-record-filter-template.component.mjs +0 -57
  235. package/esm2020/lib/components/private/form-statistics/filter-templates/list-value-filter-template/list-value-filter-template.component.mjs +0 -135
  236. package/esm2020/lib/components/private/form-statistics/filter-templates/numeric-filter-template/numeric-filter-template.component.mjs +0 -120
  237. package/esm2020/lib/components/private/form-statistics/filter-templates/text-filter-template/text-filter-template.component.mjs +0 -102
  238. package/esm2020/lib/components/private/form-statistics/filter-templates/textarea-filter-template/textarea-filter-template.component.mjs +0 -102
  239. package/esm2020/lib/components/private/graphs/graph/graph.component.mjs +0 -180
  240. package/esm2020/lib/components/private/graphs/graphs.component.mjs +0 -164
  241. package/esm2020/lib/components/private/spinner/spinner.component.mjs +0 -19
  242. package/esm2020/lib/components/private/tmw-image-drawer/tmw-image-drawer.component.mjs +0 -403
  243. package/esm2020/lib/components/private/tmw-image-marker/tmw-image-marker.component.mjs +0 -336
  244. package/esm2020/lib/components/private/trigger-creator/dynamic-module-trigger-fix/dynamic-module-trigger-fix.component.mjs +0 -69
  245. package/esm2020/lib/components/private/trigger-creator/trigger-creator.component.mjs +0 -191
  246. package/esm2020/lib/components/private/trigger-creator/trigger-templates/boolean-trigger-template/boolean-trigger-template.component.mjs +0 -86
  247. package/esm2020/lib/components/private/trigger-creator/trigger-templates/date-trigger-template/date-trigger-template.component.mjs +0 -86
  248. package/esm2020/lib/components/private/trigger-creator/trigger-templates/list-form-record-trigger-template/list-form-record-trigger-template.component.mjs +0 -60
  249. package/esm2020/lib/components/private/trigger-creator/trigger-templates/list-value-trigger-template/list-value-trigger-template.component.mjs +0 -66
  250. package/esm2020/lib/components/private/trigger-creator/trigger-templates/numeric-trigger-template/numeric-trigger-template.component.mjs +0 -102
  251. package/esm2020/lib/components/private/trigger-creator/trigger-templates/text-trigger-template/text-trigger-template.component.mjs +0 -84
  252. package/esm2020/lib/components/private/trigger-creator/trigger-templates/textarea-trigger-template/textarea-trigger-template.component.mjs +0 -84
  253. package/esm2020/lib/directives/dynamic-loader/dynamic-loader.directive.mjs +0 -59
  254. package/esm2020/lib/directives/speech-to-text/speech-to-text.directive.mjs +0 -186
  255. package/esm2020/lib/eqp-dynamic-module.module.mjs +0 -253
  256. package/esm2020/lib/models/baseField.model.mjs +0 -101
  257. package/esm2020/lib/models/baseObj.model.mjs +0 -9
  258. package/esm2020/lib/models/dynAttachment.mjs +0 -21
  259. package/esm2020/lib/models/dynamicModuleCompileConfig.model.mjs +0 -13
  260. package/esm2020/lib/models/dynamicModuleConfig.model.mjs +0 -9
  261. package/esm2020/lib/models/dynamicModuleConfiguratorConfig.model.mjs +0 -9
  262. package/esm2020/lib/models/dynamicModuleConfiguratorSpecificConfig.model.mjs +0 -15
  263. package/esm2020/lib/models/dynamicModuleGeneralConfig.model.mjs +0 -36
  264. package/esm2020/lib/models/dynamicModuleListConfig.model.mjs +0 -30
  265. package/esm2020/lib/models/dynamicModuleListFormRecordActionsDefault.mjs +0 -11
  266. package/esm2020/lib/models/endPointConfiguration.model.mjs +0 -205
  267. package/esm2020/lib/models/fields/attachmentField.model.mjs +0 -22
  268. package/esm2020/lib/models/fields/booleanField.model.mjs +0 -12
  269. package/esm2020/lib/models/fields/dateField.model.mjs +0 -15
  270. package/esm2020/lib/models/fields/imageField.model.mjs +0 -15
  271. package/esm2020/lib/models/fields/imageSelectorField.model.mjs +0 -8
  272. package/esm2020/lib/models/fields/imageWithMarkersField.model.mjs +0 -8
  273. package/esm2020/lib/models/fields/listValueField.model.mjs +0 -11
  274. package/esm2020/lib/models/fields/lookupField.model.mjs +0 -5
  275. package/esm2020/lib/models/fields/numericField.model.mjs +0 -5
  276. package/esm2020/lib/models/fields/textField.model.mjs +0 -14
  277. package/esm2020/lib/models/fields/textareaField.model.mjs +0 -4
  278. package/esm2020/lib/models/form.model.mjs +0 -24
  279. package/esm2020/lib/models/getter.model.mjs +0 -3
  280. package/esm2020/lib/models/graph.model.mjs +0 -15
  281. package/esm2020/lib/models/record.model.mjs +0 -10
  282. package/esm2020/lib/models/statistic.model.mjs +0 -8
  283. package/esm2020/lib/models/trigger.model.mjs +0 -41
  284. package/esm2020/lib/modules/formula.model.mjs +0 -265
  285. package/esm2020/lib/services/db-date.service.mjs +0 -178
  286. package/esm2020/lib/services/eqp-dynamic-module-dialog.service.mjs +0 -114
  287. package/esm2020/lib/services/global.service.mjs +0 -41
  288. package/esm2020/lib/services/spinner.service.mjs +0 -43
  289. package/esm2020/lib/services/utilityHelper.services.mjs +0 -598
  290. package/fesm2015/eqproject-eqp-dynamic-module.mjs +0 -12782
  291. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +0 -1
  292. package/fesm2020/eqproject-eqp-dynamic-module.mjs +0 -12751
  293. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +0 -1
@@ -0,0 +1,413 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { I18nEn, i18nLanguages } from './i18n';
3
+ import { fabric } from 'fabric';
4
+ import { Observable, of } from 'rxjs';
5
+ import { switchMap } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/icon";
8
+ import * as i2 from "@angular/common";
9
+ export class TmwImageDrawerComponent {
10
+ closeDialog = new EventEmitter();
11
+ src;
12
+ width;
13
+ height;
14
+ forceSizeCanvas = true;
15
+ forceSizeExport = false;
16
+ enableRemoveImage = false;
17
+ enableLoadAnotherImage = false;
18
+ enableTooltip = false;
19
+ showCancelButton = true;
20
+ inConfig = false;
21
+ // @ts-ignore
22
+ i18nUser;
23
+ locale = 'en';
24
+ loadingTemplate;
25
+ errorTemplate;
26
+ outputMimeType = 'image/jpeg';
27
+ outputQuality = 0.8;
28
+ borderCss = 'none';
29
+ drawingSizes = {
30
+ small: 5,
31
+ medium: 10,
32
+ large: 25,
33
+ };
34
+ colors = {
35
+ black: '#000',
36
+ white: '#fff',
37
+ yellow: '#ffeb3b',
38
+ red: '#f44336',
39
+ blue: '#2196f3',
40
+ green: '#4caf50',
41
+ purple: '#7a08af',
42
+ };
43
+ save = new EventEmitter();
44
+ loadOriginal = new EventEmitter();
45
+ currentTool = 'brush';
46
+ currentSize = 'medium';
47
+ currentColor = 'black';
48
+ i18n = I18nEn;
49
+ canUndo = false;
50
+ canRedo = false;
51
+ isLoading = true;
52
+ hasError = false;
53
+ errorMessage = '';
54
+ canvas;
55
+ stack = [];
56
+ colorsName = [];
57
+ drawingSizesName = [];
58
+ imageUsed;
59
+ componentGuid;
60
+ constructor() {
61
+ }
62
+ ngOnInit() {
63
+ this.componentGuid = 'xxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function (c) {
64
+ var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
65
+ return v.toString(16);
66
+ });
67
+ }
68
+ ngAfterViewInit() {
69
+ this.isLoading = false;
70
+ this.colorsName = Object.keys(this.colors);
71
+ this.drawingSizesName = Object.keys(this.drawingSizes);
72
+ const canvasScaledElement = document.getElementById(this.componentGuid);
73
+ this.canvas = new fabric.Canvas(canvasScaledElement, {
74
+ hoverCursor: 'pointer',
75
+ isDrawingMode: true,
76
+ });
77
+ this.canvas.backgroundColor = 'white';
78
+ if (this.src) {
79
+ this.importPhotoFromSrc(this.src);
80
+ }
81
+ else {
82
+ if (!this.width || !this.height) {
83
+ throw new Error('No width or hight given !');
84
+ }
85
+ this.canvas.setWidth(this.width);
86
+ this.canvas.setHeight(this.height);
87
+ }
88
+ this.canvas.on('path:created', () => {
89
+ this.stack = [];
90
+ this.setUndoRedo();
91
+ });
92
+ this.selectTool(this.currentTool);
93
+ this.selectColor(this.currentColor);
94
+ this.selectDrawingSize(this.currentSize);
95
+ if (this.locale && i18nLanguages[this.locale.toLowerCase()]) {
96
+ this.i18n = i18nLanguages[this.locale.toLowerCase()];
97
+ }
98
+ }
99
+ ngOnChanges(changes) {
100
+ if (changes.src && !changes.src.firstChange && changes.src.currentValue) {
101
+ if (typeof changes.src.currentValue === 'string') {
102
+ this.importPhotoFromSrc(changes.src.currentValue);
103
+ }
104
+ else if (changes.src.currentValue instanceof Blob) {
105
+ this.importPhotoFromBlob(changes.src.currentValue);
106
+ }
107
+ }
108
+ }
109
+ // Tools
110
+ selectTool(tool) {
111
+ this.currentTool = tool;
112
+ }
113
+ selectDrawingSize(size) {
114
+ this.currentSize = size;
115
+ if (this.canvas) {
116
+ this.canvas.freeDrawingBrush.width = this.drawingSizes[size];
117
+ }
118
+ }
119
+ selectColor(color) {
120
+ this.currentColor = color;
121
+ if (this.canvas) {
122
+ this.canvas.freeDrawingBrush.color = this.colors[color];
123
+ }
124
+ }
125
+ // Actions
126
+ undo() {
127
+ if (this.canUndo) {
128
+ const lastId = this.canvas.getObjects().length - 1;
129
+ const lastObj = this.canvas.getObjects()[lastId];
130
+ this.stack.push(lastObj);
131
+ this.canvas.remove(lastObj);
132
+ this.setUndoRedo();
133
+ }
134
+ }
135
+ redo() {
136
+ if (this.canRedo) {
137
+ const firstInStack = this.stack.splice(-1, 1)[0];
138
+ if (firstInStack) {
139
+ this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);
140
+ }
141
+ this.setUndoRedo();
142
+ }
143
+ }
144
+ clearCanvas() {
145
+ if (this.canvas) {
146
+ this.canvas.remove(...this.canvas.getObjects());
147
+ this.setUndoRedo();
148
+ }
149
+ }
150
+ saveImage() {
151
+ if (!this.forceSizeExport || (this.forceSizeExport && this.width && this.height)) {
152
+ const canvasScaledElement = document.createElement('canvas');
153
+ const canvasScaled = new fabric.Canvas(canvasScaledElement);
154
+ canvasScaled.backgroundColor = 'white';
155
+ new Observable(observer => {
156
+ if (this.imageUsed) {
157
+ if (this.forceSizeExport) {
158
+ canvasScaled.setWidth(this.width);
159
+ canvasScaled.setHeight(this.height);
160
+ this.imageUsed.cloneAsImage(imageCloned => {
161
+ imageCloned.scaleToWidth(this.width, false);
162
+ imageCloned.scaleToHeight(this.height, false);
163
+ canvasScaled.setBackgroundImage(imageCloned, (img) => {
164
+ if (!img) {
165
+ observer.error(new Error('Impossible to draw the image on the temporary canvas'));
166
+ }
167
+ observer.next(canvasScaled);
168
+ observer.complete();
169
+ }, {
170
+ crossOrigin: 'anonymous',
171
+ originX: 'left',
172
+ originY: 'top'
173
+ });
174
+ });
175
+ }
176
+ else {
177
+ canvasScaled.setBackgroundImage(this.imageUsed, (img) => {
178
+ if (!img) {
179
+ observer.error(new Error('Impossible to draw the image on the temporary canvas'));
180
+ }
181
+ canvasScaled.setWidth(img.width);
182
+ canvasScaled.setHeight(img.height);
183
+ observer.next(canvasScaled);
184
+ observer.complete();
185
+ }, {
186
+ crossOrigin: 'anonymous',
187
+ originX: 'left',
188
+ originY: 'top'
189
+ });
190
+ }
191
+ }
192
+ else {
193
+ canvasScaled.setWidth(this.width);
194
+ canvasScaled.setHeight(this.height);
195
+ }
196
+ }).pipe(switchMap(() => {
197
+ let process = of(canvasScaled);
198
+ if (this.canvas.getObjects().length > 0) {
199
+ const ratioX = canvasScaled.getWidth() / this.canvas.getWidth();
200
+ const ratioY = canvasScaled.getHeight() / this.canvas.getHeight();
201
+ this.canvas.getObjects().forEach((originalObject, i) => {
202
+ process = process.pipe(switchMap(() => {
203
+ return new Observable(observerObject => {
204
+ originalObject.clone((clonedObject) => {
205
+ clonedObject.set('left', originalObject.left * ratioX);
206
+ clonedObject.set('top', originalObject.top * ratioY);
207
+ clonedObject.scaleToWidth(originalObject.width * ratioX);
208
+ clonedObject.scaleToHeight(originalObject.height * ratioY);
209
+ canvasScaled.insertAt(clonedObject, i, false);
210
+ canvasScaled.renderAll();
211
+ observerObject.next(canvasScaled);
212
+ observerObject.complete();
213
+ });
214
+ });
215
+ }));
216
+ });
217
+ }
218
+ return process;
219
+ })).subscribe(() => {
220
+ canvasScaled.renderAll();
221
+ canvasScaled.getElement().toBlob((data) => {
222
+ this.save.emit(data);
223
+ }, this.outputMimeType, this.outputQuality);
224
+ });
225
+ }
226
+ else {
227
+ this.canvas.getElement().toBlob((data) => {
228
+ this.save.emit(data);
229
+ }, this.outputMimeType, this.outputQuality);
230
+ }
231
+ }
232
+ doLoadOriginal() {
233
+ this.loadOriginal.emit();
234
+ }
235
+ getTextTranslated(name) {
236
+ let strOk = name.split('.').reduce((o, i) => o[i], this.i18n);
237
+ if (this.i18nUser) {
238
+ try {
239
+ const str = name.split('.').reduce((o, i) => o[i], this.i18nUser);
240
+ if (str) {
241
+ strOk = str;
242
+ }
243
+ }
244
+ catch (e) {
245
+ // if we pass here, ignored
246
+ }
247
+ }
248
+ if (!strOk) {
249
+ console.error(name + ' translation not found !');
250
+ }
251
+ return strOk;
252
+ }
253
+ getTooltipTranslated(name) {
254
+ if (this.enableTooltip) {
255
+ return this.getTextTranslated(name);
256
+ }
257
+ else {
258
+ return '';
259
+ }
260
+ }
261
+ setUndoRedo() {
262
+ this.canUndo = this.canvas.getObjects().length > 0;
263
+ this.canRedo = this.stack.length > 0;
264
+ // this.canvas.renderAll();
265
+ }
266
+ importPhotoFromFile(event) {
267
+ if (event.target.files && event.target.files.length > 0) {
268
+ const file = event.target.files[0];
269
+ if (file.type.match('image.*')) {
270
+ this.importPhotoFromBlob(file);
271
+ }
272
+ else {
273
+ throw new Error('Not an image !');
274
+ }
275
+ }
276
+ }
277
+ removeImage() {
278
+ if (this.imageUsed) {
279
+ this.imageUsed.dispose();
280
+ this.imageUsed = null;
281
+ }
282
+ this.canvas.backgroundImage = null;
283
+ if (this.width && this.height) {
284
+ this.canvas.setWidth(this.width);
285
+ this.canvas.setHeight(this.height);
286
+ }
287
+ this.canvas.renderAll();
288
+ }
289
+ get hasImage() {
290
+ return !!this.canvas.backgroundImage;
291
+ }
292
+ importPhotoFromSrc(src) {
293
+ this.isLoading = true;
294
+ let isFirstTry = true;
295
+ const imgEl = new Image();
296
+ imgEl.setAttribute('crossOrigin', 'anonymous');
297
+ imgEl.src = src;
298
+ imgEl.onerror = () => {
299
+ // Retry with cors proxy
300
+ if (isFirstTry) {
301
+ imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;
302
+ isFirstTry = false;
303
+ }
304
+ else {
305
+ this.isLoading = false;
306
+ this.hasError = true;
307
+ this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src);
308
+ }
309
+ };
310
+ imgEl.onload = () => {
311
+ this.isLoading = false;
312
+ this.imageUsed = new fabric.Image(imgEl);
313
+ this.imageUsed.cloneAsImage(image => {
314
+ let width = imgEl.width;
315
+ let height = imgEl.height;
316
+ if (this.width) {
317
+ width = this.width;
318
+ }
319
+ if (this.height) {
320
+ height = this.height;
321
+ }
322
+ image.scaleToWidth(width, false);
323
+ image.scaleToHeight(height, false);
324
+ this.canvas.setBackgroundImage(image, ((img) => {
325
+ if (img) {
326
+ if (this.forceSizeCanvas) {
327
+ this.canvas.setWidth(width);
328
+ this.canvas.setHeight(height);
329
+ }
330
+ else {
331
+ this.canvas.setWidth(image.getScaledWidth());
332
+ this.canvas.setHeight(image.getScaledHeight());
333
+ }
334
+ }
335
+ }), {
336
+ crossOrigin: 'anonymous',
337
+ originX: 'left',
338
+ originY: 'top'
339
+ });
340
+ });
341
+ };
342
+ }
343
+ importPhotoFromBlob(file) {
344
+ const reader = new FileReader();
345
+ reader.readAsDataURL(file);
346
+ reader.onload = (evtReader) => {
347
+ if (evtReader.target.readyState == FileReader.DONE) {
348
+ this.importPhotoFromSrc(evtReader.target.result);
349
+ }
350
+ };
351
+ }
352
+ importPhotoFromUrl() {
353
+ const url = prompt(this.getTooltipTranslated('loadImageUrl'));
354
+ if (url) {
355
+ this.importPhotoFromSrc(url);
356
+ }
357
+ }
358
+ close() {
359
+ this.closeDialog.emit();
360
+ }
361
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TmwImageDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
362
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TmwImageDrawerComponent, selector: "tmw-image-drawer", inputs: { src: "src", width: "width", height: "height", forceSizeCanvas: "forceSizeCanvas", forceSizeExport: "forceSizeExport", enableRemoveImage: "enableRemoveImage", enableLoadAnotherImage: "enableLoadAnotherImage", enableTooltip: "enableTooltip", showCancelButton: "showCancelButton", inConfig: "inConfig", i18nUser: ["i18n", "i18nUser"], locale: "locale", loadingTemplate: "loadingTemplate", errorTemplate: "errorTemplate", outputMimeType: "outputMimeType", outputQuality: "outputQuality", borderCss: "borderCss", drawingSizes: "drawingSizes", colors: "colors" }, outputs: { closeDialog: "closeDialog", save: "save", loadOriginal: "loadOriginal" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"loading\" *ngIf=\"isLoading && loadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n</div>\r\n<div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n</div>\r\n\r\n<!-- <ng-template #defaultLoading>\r\n <p>{{ getTextTranslated('loading') }}</p>\r\n</ng-template> -->\r\n<ng-template #defaultError>\r\n <p>{{ errorMessage }}</p>\r\n</ng-template>\r\n\r\n<div class=\"toolbar\" *ngIf=\"!isLoading\">\r\n <div class=\"tools\">\r\n\r\n <div class=\"brush\">\r\n <i class=\"title\">tools</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.selected]=\"currentTool == 'brush'\" (click)=\"selectTool('brush')\"\r\n [title]=\"getTooltipTranslated('tools.brush')\"><mat-icon>brush</mat-icon></i>\r\n <span *ngFor=\"let drawingSizeName of drawingSizesName\" class=\"size btn mr-1\"\r\n [style.width.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.height.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.borderRadius.px]=\"drawingSizes[drawingSizeName] * 0.4 + 4\"\r\n [class.selected]=\"currentSize == drawingSizeName\" [title]=\"getTooltipTranslated('sizes.' + drawingSizeName)\"\r\n (click)=\"selectDrawingSize(drawingSizeName)\">\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"commands\">\r\n <i class=\"title\">options</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canUndo\" (click)=\"undo()\"\r\n [title]=\"getTooltipTranslated('undo')\"><mat-icon>undo</mat-icon></i>\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canRedo\" (click)=\"redo()\"\r\n [title]=\"getTooltipTranslated('redo')\"><mat-icon>redo</mat-icon></i>\r\n <i class=\"material-icons btn\" (click)=\"clearCanvas()\" [title]=\"getTooltipTranslated('clear')\"><mat-icon>clear</mat-icon></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"colors\">\r\n <i class=\"title\">colors</i>\r\n <div class=\"internal\">\r\n <div *ngFor=\"let colorName of colorsName\" [class.selected]=\"currentColor == colorName\" class=\"color\"\r\n [ngClass]=\"colorName\" [style.background]=\"colors[colorName]\"\r\n [title]=\"getTooltipTranslated('colors.' + colorName)\" (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <i class=\"title\">actions</i>\r\n <div class=\"internal\">\r\n <a href=\"#\" class=\"btn btn-success\" (click)=\"saveImage(); $event.preventDefault()\" *ngIf=\"!inConfig\">{{\r\n getTextTranslated('saveBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-warning\" *ngIf=\"showCancelButton && !inConfig\" (click)=\"doLoadOriginal(); $event.preventDefault()\">{{\r\n getTextTranslated('cancelBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-danger\" *ngIf=\"showCancelButton\" (click)=\"close(); $event.preventDefault()\">{{\r\n getTextTranslated('closeDialog') }}</a>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Any additional toolbar buttons to be projected by the consuming app -->\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div [ngStyle]=\"{ border: borderCss }\">\r\n <canvas [id]=\"componentGuid\"></canvas>\r\n</div>", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .toolbar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}:host .tools{display:inline-flex;flex-direction:row;margin:10px;background:#fff;border-radius:6px;box-shadow:0 3px 10px #0006}:host .tools .brush,:host .tools .commands,:host .tools .colors,:host .tools .actions{display:flex}:host .tools .brush .title,:host .tools .commands .title,:host .tools .colors .title,:host .tools .actions .title{display:flex;vertical-align:middle;background-color:#00a8ff;color:#fff;padding:10px}:host .tools .brush .internal,:host .tools .commands .internal,:host .tools .colors .internal,:host .tools .actions .internal{display:flex;vertical-align:middle;align-items:center;padding:0 15px}:host .tools .brush .internal>*,:host .tools .commands .internal>*,:host .tools .colors .internal>*,:host .tools .actions .internal>*{margin-right:5px}:host .tools .brush .internal .disabled,:host .tools .commands .internal .disabled,:host .tools .colors .internal .disabled,:host .tools .actions .internal .disabled{border:0;color:red}:host .row{display:flex;justify-content:space-around;align-items:center}:host .row:first-child{margin-bottom:10px}:host .size{background-color:#000}:host .size.selected{background-color:#bdbdbd}:host .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}:host .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .color.black{background-color:#000}:host .color.black.selected:after{background:#fff}:host .color.white{border:1px solid #a7a7a7}:host .buttons{margin:10px;display:flex;flex-direction:column}:host .button{cursor:pointer;outline:0;border:none;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;min-width:64px;line-height:36px;padding:3px 16px;border-radius:4px;overflow:visible;transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow .28s cubic-bezier(.4,0,.2,1);margin:10px}:host .button:hover{text-decoration:none!important}\n"], dependencies: [{ kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
363
+ }
364
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TmwImageDrawerComponent, decorators: [{
365
+ type: Component,
366
+ args: [{ selector: 'tmw-image-drawer', template: "<div class=\"loading\" *ngIf=\"isLoading && loadingTemplate\">\r\n <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\r\n</div>\r\n<div class=\"error\" *ngIf=\"hasError\">\r\n <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n</div>\r\n\r\n<!-- <ng-template #defaultLoading>\r\n <p>{{ getTextTranslated('loading') }}</p>\r\n</ng-template> -->\r\n<ng-template #defaultError>\r\n <p>{{ errorMessage }}</p>\r\n</ng-template>\r\n\r\n<div class=\"toolbar\" *ngIf=\"!isLoading\">\r\n <div class=\"tools\">\r\n\r\n <div class=\"brush\">\r\n <i class=\"title\">tools</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.selected]=\"currentTool == 'brush'\" (click)=\"selectTool('brush')\"\r\n [title]=\"getTooltipTranslated('tools.brush')\"><mat-icon>brush</mat-icon></i>\r\n <span *ngFor=\"let drawingSizeName of drawingSizesName\" class=\"size btn mr-1\"\r\n [style.width.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.height.px]=\"drawingSizes[drawingSizeName] * 0.8 + 8\"\r\n [style.borderRadius.px]=\"drawingSizes[drawingSizeName] * 0.4 + 4\"\r\n [class.selected]=\"currentSize == drawingSizeName\" [title]=\"getTooltipTranslated('sizes.' + drawingSizeName)\"\r\n (click)=\"selectDrawingSize(drawingSizeName)\">\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"commands\">\r\n <i class=\"title\">options</i>\r\n <div class=\"internal\">\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canUndo\" (click)=\"undo()\"\r\n [title]=\"getTooltipTranslated('undo')\"><mat-icon>undo</mat-icon></i>\r\n <i class=\"material-icons btn\" [class.disabled]=\"!canRedo\" (click)=\"redo()\"\r\n [title]=\"getTooltipTranslated('redo')\"><mat-icon>redo</mat-icon></i>\r\n <i class=\"material-icons btn\" (click)=\"clearCanvas()\" [title]=\"getTooltipTranslated('clear')\"><mat-icon>clear</mat-icon></i>\r\n </div>\r\n </div>\r\n\r\n <div class=\"colors\">\r\n <i class=\"title\">colors</i>\r\n <div class=\"internal\">\r\n <div *ngFor=\"let colorName of colorsName\" [class.selected]=\"currentColor == colorName\" class=\"color\"\r\n [ngClass]=\"colorName\" [style.background]=\"colors[colorName]\"\r\n [title]=\"getTooltipTranslated('colors.' + colorName)\" (click)=\"selectColor(colorName)\">\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n <i class=\"title\">actions</i>\r\n <div class=\"internal\">\r\n <a href=\"#\" class=\"btn btn-success\" (click)=\"saveImage(); $event.preventDefault()\" *ngIf=\"!inConfig\">{{\r\n getTextTranslated('saveBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-warning\" *ngIf=\"showCancelButton && !inConfig\" (click)=\"doLoadOriginal(); $event.preventDefault()\">{{\r\n getTextTranslated('cancelBtn') }}</a>\r\n <a href=\"#\" class=\"btn btn-danger\" *ngIf=\"showCancelButton\" (click)=\"close(); $event.preventDefault()\">{{\r\n getTextTranslated('closeDialog') }}</a>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n <!-- Any additional toolbar buttons to be projected by the consuming app -->\r\n <ng-content></ng-content>\r\n</div>\r\n\r\n<div [ngStyle]=\"{ border: borderCss }\">\r\n <canvas [id]=\"componentGuid\"></canvas>\r\n</div>", styles: [":host{display:flex;flex-direction:column;align-items:center}:host .toolbar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap}:host .tools{display:inline-flex;flex-direction:row;margin:10px;background:#fff;border-radius:6px;box-shadow:0 3px 10px #0006}:host .tools .brush,:host .tools .commands,:host .tools .colors,:host .tools .actions{display:flex}:host .tools .brush .title,:host .tools .commands .title,:host .tools .colors .title,:host .tools .actions .title{display:flex;vertical-align:middle;background-color:#00a8ff;color:#fff;padding:10px}:host .tools .brush .internal,:host .tools .commands .internal,:host .tools .colors .internal,:host .tools .actions .internal{display:flex;vertical-align:middle;align-items:center;padding:0 15px}:host .tools .brush .internal>*,:host .tools .commands .internal>*,:host .tools .colors .internal>*,:host .tools .actions .internal>*{margin-right:5px}:host .tools .brush .internal .disabled,:host .tools .commands .internal .disabled,:host .tools .colors .internal .disabled,:host .tools .actions .internal .disabled{border:0;color:red}:host .row{display:flex;justify-content:space-around;align-items:center}:host .row:first-child{margin-bottom:10px}:host .size{background-color:#000}:host .size.selected{background-color:#bdbdbd}:host .color{width:28px;height:28px;border-radius:14px;cursor:pointer;display:flex;align-items:center;justify-content:center}:host .color.selected:after{content:\"\";width:10px;height:10px;background:#000;display:flex;border-radius:5px}:host .color.black{background-color:#000}:host .color.black.selected:after{background:#fff}:host .color.white{border:1px solid #a7a7a7}:host .buttons{margin:10px;display:flex;flex-direction:column}:host .button{cursor:pointer;outline:0;border:none;white-space:nowrap;text-decoration:none;vertical-align:baseline;text-align:center;min-width:64px;line-height:36px;padding:3px 16px;border-radius:4px;overflow:visible;transition:background .4s cubic-bezier(.25,.8,.25,1),box-shadow .28s cubic-bezier(.4,0,.2,1);margin:10px}:host .button:hover{text-decoration:none!important}\n"] }]
367
+ }], ctorParameters: () => [], propDecorators: { closeDialog: [{
368
+ type: Output
369
+ }], src: [{
370
+ type: Input
371
+ }], width: [{
372
+ type: Input
373
+ }], height: [{
374
+ type: Input
375
+ }], forceSizeCanvas: [{
376
+ type: Input
377
+ }], forceSizeExport: [{
378
+ type: Input
379
+ }], enableRemoveImage: [{
380
+ type: Input
381
+ }], enableLoadAnotherImage: [{
382
+ type: Input
383
+ }], enableTooltip: [{
384
+ type: Input
385
+ }], showCancelButton: [{
386
+ type: Input
387
+ }], inConfig: [{
388
+ type: Input
389
+ }], i18nUser: [{
390
+ type: Input,
391
+ args: ['i18n']
392
+ }], locale: [{
393
+ type: Input
394
+ }], loadingTemplate: [{
395
+ type: Input
396
+ }], errorTemplate: [{
397
+ type: Input
398
+ }], outputMimeType: [{
399
+ type: Input
400
+ }], outputQuality: [{
401
+ type: Input
402
+ }], borderCss: [{
403
+ type: Input
404
+ }], drawingSizes: [{
405
+ type: Input
406
+ }], colors: [{
407
+ type: Input
408
+ }], save: [{
409
+ type: Output
410
+ }], loadOriginal: [{
411
+ type: Output
412
+ }] } });
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvdG13LWltYWdlLWRyYXdlci90bXctaW1hZ2UtZHJhd2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS90bXctaW1hZ2UtZHJhd2VyL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUE4QixNQUFNLGVBQWUsQ0FBQztBQUNySSxPQUFPLEVBQUUsTUFBTSxFQUFpQixhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPM0MsTUFBTSxPQUFPLHVCQUF1QjtJQUV4QixXQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFFckQsR0FBRyxDQUFVO0lBQ2IsS0FBSyxDQUFVO0lBQ2YsTUFBTSxDQUFVO0lBRWhCLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixpQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFDMUIsc0JBQXNCLEdBQUcsS0FBSyxDQUFDO0lBQy9CLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRXhCLFFBQVEsR0FB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d0dBamFVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDB0QkNYcEMsKy9HQXlFTTs7NEZEOURPLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxrQkFBa0I7d0RBTWxCLFdBQVc7c0JBQXBCLE1BQU07Z0JBRVMsR0FBRztzQkFBbEIsS0FBSztnQkFDVSxLQUFLO3NCQUFwQixLQUFLO2dCQUNVLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFDVSxzQkFBc0I7c0JBQXJDLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBRVUsUUFBUTtzQkFBdkIsS0FBSztnQkFHZ0IsUUFBUTtzQkFBN0IsS0FBSzt1QkFBQyxNQUFNO2dCQUNHLE1BQU07c0JBQXJCLEtBQUs7Z0JBRVUsZUFBZTtzQkFBOUIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUVVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFFVSxTQUFTO3NCQUF4QixLQUFLO2dCQUVVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBTVUsTUFBTTtzQkFBckIsS0FBSztnQkFVVyxJQUFJO3NCQUFwQixNQUFNO2dCQUNVLFlBQVk7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOG5FbiwgSTE4bkludGVyZmFjZSwgaTE4bkxhbmd1YWdlcyB9IGZyb20gJy4vaTE4bic7XHJcbmltcG9ydCB7IGZhYnJpYyB9IGZyb20gJ2ZhYnJpYyc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndG13LWltYWdlLWRyYXdlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVG13SW1hZ2VEcmF3ZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBPdXRwdXQoKSBjbG9zZURpYWxvZzogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgc3JjPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB3aWR0aD86IG51bWJlcjtcclxuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0PzogbnVtYmVyO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgZm9yY2VTaXplQ2FudmFzID0gdHJ1ZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZm9yY2VTaXplRXhwb3J0ID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGVuYWJsZVJlbW92ZUltYWdlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIGVuYWJsZUxvYWRBbm90aGVySW1hZ2UgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlVG9vbHRpcCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93Q2FuY2VsQnV0dG9uID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGluQ29uZmlnPzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBAdHMtaWdub3JlXHJcbiAgQElucHV0KCdpMThuJykgcHVibGljIGkxOG5Vc2VyOiBJMThuSW50ZXJmYWNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2NhbGU6IHN0cmluZyA9ICdlbic7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBsb2FkaW5nVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlcnJvclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIG91dHB1dE1pbWVUeXBlID0gJ2ltYWdlL2pwZWcnO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBvdXRwdXRRdWFsaXR5ID0gMC44O1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgYm9yZGVyQ3NzOiBzdHJpbmcgPSAnbm9uZSc7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBkcmF3aW5nU2l6ZXM6IHsgW25hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge1xyXG4gICAgc21hbGw6IDUsXHJcbiAgICBtZWRpdW06IDEwLFxyXG4gICAgbGFyZ2U6IDI1LFxyXG4gIH07XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBjb2xvcnM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0ge1xyXG4gICAgYmxhY2s6ICcjMDAwJyxcclxuICAgIHdoaXRlOiAnI2ZmZicsXHJcbiAgICB5ZWxsb3c6ICcjZmZlYjNiJyxcclxuICAgIHJlZDogJyNmNDQzMzYnLFxyXG4gICAgYmx1ZTogJyMyMTk2ZjMnLFxyXG4gICAgZ3JlZW46ICcjNGNhZjUwJyxcclxuICAgIHB1cnBsZTogJyM3YTA4YWYnLFxyXG4gIH07XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgc2F2ZTogRXZlbnRFbWl0dGVyPEJsb2I+ID0gbmV3IEV2ZW50RW1pdHRlcjxCbG9iPigpO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgbG9hZE9yaWdpbmFsOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50VG9vbCA9ICdicnVzaCc7XHJcbiAgcHVibGljIGN1cnJlbnRTaXplID0gJ21lZGl1bSc7XHJcbiAgcHVibGljIGN1cnJlbnRDb2xvciA9ICdibGFjayc7XHJcbiAgcHVibGljIGkxOG46IEkxOG5JbnRlcmZhY2UgPSBJMThuRW47XHJcblxyXG4gIHB1YmxpYyBjYW5VbmRvID0gZmFsc2U7XHJcbiAgcHVibGljIGNhblJlZG8gPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIGlzTG9hZGluZyA9IHRydWU7XHJcbiAgcHVibGljIGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgcHVibGljIGVycm9yTWVzc2FnZSA9ICcnO1xyXG5cclxuICBwcml2YXRlIGNhbnZhczogZmFicmljLkNhbnZhcztcclxuICBwcml2YXRlIHN0YWNrOiBmYWJyaWMuT2JqZWN0W10gPSBbXTtcclxuXHJcbiAgcHVibGljIGNvbG9yc05hbWU6IHN0cmluZ1tdID0gW107XHJcbiAgcHVibGljIGRyYXdpbmdTaXplc05hbWU6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgaW1hZ2VVc2VkPzogZmFicmljLkltYWdlO1xyXG5cclxuICBjb21wb25lbnRHdWlkOiBzdHJpbmc7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb21wb25lbnRHdWlkID0gJ3h4eHgteHh4eC14eHh4LXh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcclxuICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxyXG4gICAgICAgIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgIHRoaXMuY29sb3JzTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuY29sb3JzKTtcclxuICAgIHRoaXMuZHJhd2luZ1NpemVzTmFtZSA9IE9iamVjdC5rZXlzKHRoaXMuZHJhd2luZ1NpemVzKTtcclxuXHJcbiAgICBjb25zdCBjYW52YXNTY2FsZWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5jb21wb25lbnRHdWlkKTtcclxuICAgIHRoaXMuY2FudmFzID0gbmV3IGZhYnJpYy5DYW52YXMoY2FudmFzU2NhbGVkRWxlbWVudCwge1xyXG4gICAgICBob3ZlckN1cnNvcjogJ3BvaW50ZXInLFxyXG4gICAgICBpc0RyYXdpbmdNb2RlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG5cclxuICAgIGlmICh0aGlzLnNyYykge1xyXG4gICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyh0aGlzLnNyYyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIXRoaXMud2lkdGggfHwgIXRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB3aWR0aCBvciBoaWdodCBnaXZlbiAhJyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgICB0aGlzLmNhbnZhcy5zZXRIZWlnaHQodGhpcy5oZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2FudmFzLm9uKCdwYXRoOmNyZWF0ZWQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhY2sgPSBbXTtcclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RUb29sKHRoaXMuY3VycmVudFRvb2wpO1xyXG4gICAgdGhpcy5zZWxlY3RDb2xvcih0aGlzLmN1cnJlbnRDb2xvcik7XHJcbiAgICB0aGlzLnNlbGVjdERyYXdpbmdTaXplKHRoaXMuY3VycmVudFNpemUpO1xyXG5cclxuICAgIGlmICh0aGlzLmxvY2FsZSAmJiBpMThuTGFuZ3VhZ2VzW3RoaXMubG9jYWxlLnRvTG93ZXJDYXNlKCldKSB7XHJcbiAgICAgIHRoaXMuaTE4biA9IGkxOG5MYW5ndWFnZXNbdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5zcmMgJiYgIWNoYW5nZXMuc3JjLmZpcnN0Q2hhbmdlICYmIGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICBpZiAodHlwZW9mIGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyhjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIEJsb2IpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbUJsb2IoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVG9vbHNcclxuICBwdWJsaWMgc2VsZWN0VG9vbCh0b29sOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3VycmVudFRvb2wgPSB0b29sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdERyYXdpbmdTaXplKHNpemU6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50U2l6ZSA9IHNpemU7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMuZnJlZURyYXdpbmdCcnVzaC53aWR0aCA9IHRoaXMuZHJhd2luZ1NpemVzW3NpemVdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdENvbG9yKGNvbG9yOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuY3VycmVudENvbG9yID0gY29sb3I7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMuZnJlZURyYXdpbmdCcnVzaC5jb2xvciA9IHRoaXMuY29sb3JzW2NvbG9yXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIEFjdGlvbnNcclxuICBwdWJsaWMgdW5kbygpIHtcclxuICAgIGlmICh0aGlzLmNhblVuZG8pIHtcclxuICAgICAgY29uc3QgbGFzdElkID0gdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCAtIDE7XHJcbiAgICAgIGNvbnN0IGxhc3RPYmogPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKClbbGFzdElkXTtcclxuICAgICAgdGhpcy5zdGFjay5wdXNoKGxhc3RPYmopO1xyXG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUobGFzdE9iaik7XHJcbiAgICAgIHRoaXMuc2V0VW5kb1JlZG8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRvKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuUmVkbykge1xyXG4gICAgICBjb25zdCBmaXJzdEluU3RhY2sgPSB0aGlzLnN0YWNrLnNwbGljZSgtMSwgMSlbMF07XHJcbiAgICAgIGlmIChmaXJzdEluU3RhY2spIHtcclxuICAgICAgICB0aGlzLmNhbnZhcy5pbnNlcnRBdChmaXJzdEluU3RhY2ssIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5sZW5ndGggLSAxLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyQ2FudmFzKCkge1xyXG4gICAgaWYgKHRoaXMuY2FudmFzKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlbW92ZSguLi50aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkpO1xyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUltYWdlKCkge1xyXG4gICAgaWYgKCF0aGlzLmZvcmNlU2l6ZUV4cG9ydCB8fCAodGhpcy5mb3JjZVNpemVFeHBvcnQgJiYgdGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkpIHtcclxuICAgICAgY29uc3QgY2FudmFzU2NhbGVkRWxlbWVudDogSFRNTENhbnZhc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgY29uc3QgY2FudmFzU2NhbGVkID0gbmV3IGZhYnJpYy5DYW52YXMoY2FudmFzU2NhbGVkRWxlbWVudCk7XHJcbiAgICAgIGNhbnZhc1NjYWxlZC5iYWNrZ3JvdW5kQ29sb3IgPSAnd2hpdGUnO1xyXG5cclxuICAgICAgbmV3IE9ic2VydmFibGU8ZmFicmljLkNhbnZhcz4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmltYWdlVXNlZCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZm9yY2VTaXplRXhwb3J0KSB7XHJcbiAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmltYWdlVXNlZC5jbG9uZUFzSW1hZ2UoaW1hZ2VDbG9uZWQgPT4ge1xyXG4gICAgICAgICAgICAgIGltYWdlQ2xvbmVkLnNjYWxlVG9XaWR0aCh0aGlzLndpZHRoLCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgaW1hZ2VDbG9uZWQuc2NhbGVUb0hlaWdodCh0aGlzLmhlaWdodCwgZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0QmFja2dyb3VuZEltYWdlKGltYWdlQ2xvbmVkLCAoaW1nOiBIVE1MSW1hZ2VFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWltZykge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0ltcG9zc2libGUgdG8gZHJhdyB0aGUgaW1hZ2Ugb24gdGhlIHRlbXBvcmFyeSBjYW52YXMnKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJ1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRCYWNrZ3JvdW5kSW1hZ2UodGhpcy5pbWFnZVVzZWQsIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoIWltZykge1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEVycm9yKCdJbXBvc3NpYmxlIHRvIGRyYXcgdGhlIGltYWdlIG9uIHRoZSB0ZW1wb3JhcnkgY2FudmFzJykpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldFdpZHRoKGltZy53aWR0aCk7XHJcbiAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEhlaWdodChpbWcuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWDogJ2xlZnQnLFxyXG4gICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLnBpcGUoXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIGxldCBwcm9jZXNzID0gb2YoY2FudmFzU2NhbGVkKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgcmF0aW9YID0gY2FudmFzU2NhbGVkLmdldFdpZHRoKCkgLyB0aGlzLmNhbnZhcy5nZXRXaWR0aCgpO1xyXG4gICAgICAgICAgICBjb25zdCByYXRpb1kgPSBjYW52YXNTY2FsZWQuZ2V0SGVpZ2h0KCkgLyB0aGlzLmNhbnZhcy5nZXRIZWlnaHQoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5mb3JFYWNoKChvcmlnaW5hbE9iamVjdDogZmFicmljLk9iamVjdCwgaTogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgcHJvY2VzcyA9IHByb2Nlc3MucGlwZShzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPGZhYnJpYy5DYW52YXM+KG9ic2VydmVyT2JqZWN0ID0+IHtcclxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxPYmplY3QuY2xvbmUoKGNsb25lZE9iamVjdDogZmFicmljLk9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zZXQoJ2xlZnQnLCBvcmlnaW5hbE9iamVjdC5sZWZ0ICogcmF0aW9YKTtcclxuICAgICAgICAgICAgICAgICAgICBjbG9uZWRPYmplY3Quc2V0KCd0b3AnLCBvcmlnaW5hbE9iamVjdC50b3AgKiByYXRpb1kpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zY2FsZVRvV2lkdGgob3JpZ2luYWxPYmplY3Qud2lkdGggKiByYXRpb1gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zY2FsZVRvSGVpZ2h0KG9yaWdpbmFsT2JqZWN0LmhlaWdodCAqIHJhdGlvWSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5pbnNlcnRBdChjbG9uZWRPYmplY3QsIGksIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBjYW52YXNTY2FsZWQucmVuZGVyQWxsKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyT2JqZWN0Lm5leHQoY2FudmFzU2NhbGVkKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlck9iamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcHJvY2VzcztcclxuICAgICAgICB9KSxcclxuICAgICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNhbnZhc1NjYWxlZC5yZW5kZXJBbGwoKTtcclxuICAgICAgICBjYW52YXNTY2FsZWQuZ2V0RWxlbWVudCgpLnRvQmxvYihcclxuICAgICAgICAgIChkYXRhOiBCbG9iKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZS5lbWl0KGRhdGEpO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHRoaXMub3V0cHV0TWltZVR5cGUsXHJcbiAgICAgICAgICB0aGlzLm91dHB1dFF1YWxpdHlcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FudmFzLmdldEVsZW1lbnQoKS50b0Jsb2IoXHJcbiAgICAgICAgKGRhdGE6IEJsb2IpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2F2ZS5lbWl0KGRhdGEpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdGhpcy5vdXRwdXRNaW1lVHlwZSxcclxuICAgICAgICB0aGlzLm91dHB1dFF1YWxpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBkb0xvYWRPcmlnaW5hbCgpIHtcclxuICAgIHRoaXMubG9hZE9yaWdpbmFsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUZXh0VHJhbnNsYXRlZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgbGV0IHN0ck9rID0gbmFtZS5zcGxpdCgnLicpLnJlZHVjZSgobywgaSkgPT4gb1tpXSwgdGhpcy5pMThuIGFzIGFueSk7XHJcblxyXG4gICAgaWYgKHRoaXMuaTE4blVzZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBzdHIgPSBuYW1lLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiBvW2ldLCB0aGlzLmkxOG5Vc2VyIGFzIGFueSk7XHJcbiAgICAgICAgaWYgKHN0cikge1xyXG4gICAgICAgICAgc3RyT2sgPSBzdHI7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgLy8gaWYgd2UgcGFzcyBoZXJlLCBpZ25vcmVkXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXN0ck9rKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IobmFtZSArICcgdHJhbnNsYXRpb24gbm90IGZvdW5kICEnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc3RyT2s7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0VG9vbHRpcFRyYW5zbGF0ZWQobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmVuYWJsZVRvb2x0aXApIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dFRyYW5zbGF0ZWQobmFtZSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VW5kb1JlZG8oKSB7XHJcbiAgICB0aGlzLmNhblVuZG8gPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuY2FuUmVkbyA9IHRoaXMuc3RhY2subGVuZ3RoID4gMDtcclxuICAgIC8vIHRoaXMuY2FudmFzLnJlbmRlckFsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGltcG9ydFBob3RvRnJvbUZpbGUoZXZlbnQ6IEV2ZW50IHwgYW55KSB7XHJcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF07XHJcbiAgICAgIGlmIChmaWxlLnR5cGUubWF0Y2goJ2ltYWdlLionKSkge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tQmxvYihmaWxlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhbiBpbWFnZSAhJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyByZW1vdmVJbWFnZSgpIHtcclxuICAgIGlmICh0aGlzLmltYWdlVXNlZCkge1xyXG4gICAgICB0aGlzLmltYWdlVXNlZC5kaXNwb3NlKCk7XHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuY2FudmFzLmJhY2tncm91bmRJbWFnZSA9IG51bGw7XHJcblxyXG4gICAgaWYgKHRoaXMud2lkdGggJiYgdGhpcy5oZWlnaHQpIHtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGhhc0ltYWdlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbXBvcnRQaG90b0Zyb21TcmMoc3JjOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIGxldCBpc0ZpcnN0VHJ5ID0gdHJ1ZTtcclxuICAgIGNvbnN0IGltZ0VsID0gbmV3IEltYWdlKCk7XHJcbiAgICBpbWdFbC5zZXRBdHRyaWJ1dGUoJ2Nyb3NzT3JpZ2luJywgJ2Fub255bW91cycpO1xyXG4gICAgaW1nRWwuc3JjID0gc3JjO1xyXG4gICAgaW1nRWwub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgLy8gUmV0cnkgd2l0aCBjb3JzIHByb3h5XHJcbiAgICAgIGlmIChpc0ZpcnN0VHJ5KSB7XHJcbiAgICAgICAgaW1nRWwuc3JjID0gJ2h0dHBzOi8vY29ycy1hbnl3aGVyZS5oZXJva3VhcHAuY29tLycgKyB0aGlzLnNyYztcclxuICAgICAgICBpc0ZpcnN0VHJ5ID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IHRoaXMuZ2V0VGV4dFRyYW5zbGF0ZWQoJ2xvYWRFcnJvcicpLnJlcGxhY2UoJyVAJywgdGhpcy5zcmMgYXMgc3RyaW5nKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGltZ0VsLm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5pbWFnZVVzZWQgPSBuZXcgZmFicmljLkltYWdlKGltZ0VsKTtcclxuXHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkLmNsb25lQXNJbWFnZShpbWFnZSA9PiB7XHJcbiAgICAgICAgbGV0IHdpZHRoID0gaW1nRWwud2lkdGg7XHJcbiAgICAgICAgbGV0IGhlaWdodCA9IGltZ0VsLmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMud2lkdGgpIHtcclxuICAgICAgICAgIHdpZHRoID0gdGhpcy53aWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICBoZWlnaHQgPSB0aGlzLmhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGltYWdlLnNjYWxlVG9XaWR0aCh3aWR0aCwgZmFsc2UpO1xyXG4gICAgICAgIGltYWdlLnNjYWxlVG9IZWlnaHQoaGVpZ2h0LCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY2FudmFzLnNldEJhY2tncm91bmRJbWFnZShpbWFnZSwgKChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgIGlmIChpbWcpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9yY2VTaXplQ2FudmFzKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgod2lkdGgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodChoZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldFdpZHRoKGltYWdlLmdldFNjYWxlZFdpZHRoKCkpO1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodChpbWFnZS5nZXRTY2FsZWRIZWlnaHQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSwge1xyXG4gICAgICAgICAgY3Jvc3NPcmlnaW46ICdhbm9ueW1vdXMnLFxyXG4gICAgICAgICAgb3JpZ2luWDogJ2xlZnQnLFxyXG4gICAgICAgICAgb3JpZ2luWTogJ3RvcCdcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbXBvcnRQaG90b0Zyb21CbG9iKGZpbGU6IEJsb2IgfCBGaWxlKSB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoZmlsZSk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGV2dFJlYWRlcjogYW55KSA9PiB7XHJcbiAgICAgIGlmIChldnRSZWFkZXIudGFyZ2V0LnJlYWR5U3RhdGUgPT0gRmlsZVJlYWRlci5ET05FKSB7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21TcmMoZXZ0UmVhZGVyLnRhcmdldC5yZXN1bHQpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGltcG9ydFBob3RvRnJvbVVybCgpIHtcclxuICAgIGNvbnN0IHVybCA9IHByb21wdCh0aGlzLmdldFRvb2x0aXBUcmFuc2xhdGVkKCdsb2FkSW1hZ2VVcmwnKSk7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKHVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2UoKXtcclxuICAgIHRoaXMuY2xvc2VEaWFsb2cuZW1pdCgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibG9hZGluZ1wiICpuZ0lmPVwiaXNMb2FkaW5nICYmIGxvYWRpbmdUZW1wbGF0ZVwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJlcnJvclwiICpuZ0lmPVwiaGFzRXJyb3JcIj5cclxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JUZW1wbGF0ZSA/IGVycm9yVGVtcGxhdGUgOiBkZWZhdWx0RXJyb3JcIj48L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcblxyXG48IS0tIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRpbmc+XHJcbiAgICA8cD57eyBnZXRUZXh0VHJhbnNsYXRlZCgnbG9hZGluZycpIH19PC9wPlxyXG48L25nLXRlbXBsYXRlPiAtLT5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0RXJyb3I+XHJcbiAgPHA+e3sgZXJyb3JNZXNzYWdlIH19PC9wPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPGRpdiBjbGFzcz1cInRvb2xiYXJcIiAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cclxuICA8ZGl2IGNsYXNzPVwidG9vbHNcIj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJicnVzaFwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJ0aXRsZVwiPnRvb2xzPC9pPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgYnRuXCIgW2NsYXNzLnNlbGVjdGVkXT1cImN1cnJlbnRUb29sID09ICdicnVzaCdcIiAoY2xpY2spPVwic2VsZWN0VG9vbCgnYnJ1c2gnKVwiXHJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCd0b29scy5icnVzaCcpXCI+PG1hdC1pY29uPmJydXNoPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkcmF3aW5nU2l6ZU5hbWUgb2YgZHJhd2luZ1NpemVzTmFtZVwiIGNsYXNzPVwic2l6ZSBidG4gbXItMVwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRyYXdpbmdTaXplc1tkcmF3aW5nU2l6ZU5hbWVdICogMC44ICsgOFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJkcmF3aW5nU2l6ZXNbZHJhd2luZ1NpemVOYW1lXSAqIDAuOCArIDhcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJSYWRpdXMucHhdPVwiZHJhd2luZ1NpemVzW2RyYXdpbmdTaXplTmFtZV0gKiAwLjQgKyA0XCJcclxuICAgICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudFNpemUgPT0gZHJhd2luZ1NpemVOYW1lXCIgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdzaXplcy4nICsgZHJhd2luZ1NpemVOYW1lKVwiXHJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERyYXdpbmdTaXplKGRyYXdpbmdTaXplTmFtZSlcIj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbW1hbmRzXCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJ0aXRsZVwiPm9wdGlvbnM8L2k+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuVW5kb1wiIChjbGljayk9XCJ1bmRvKClcIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCd1bmRvJylcIj48bWF0LWljb24+dW5kbzwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiBbY2xhc3MuZGlzYWJsZWRdPVwiIWNhblJlZG9cIiAoY2xpY2spPVwicmVkbygpXCJcclxuICAgICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdyZWRvJylcIj48bWF0LWljb24+cmVkbzwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiAoY2xpY2spPVwiY2xlYXJDYW52YXMoKVwiIFt0aXRsZV09XCJnZXRUb29sdGlwVHJhbnNsYXRlZCgnY2xlYXInKVwiPjxtYXQtaWNvbj5jbGVhcjwvbWF0LWljb24+PC9pPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2xvcnNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+Y29sb3JzPC9pPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcm5hbFwiPlxyXG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29sb3JOYW1lIG9mIGNvbG9yc05hbWVcIiBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudENvbG9yID09IGNvbG9yTmFtZVwiIGNsYXNzPVwiY29sb3JcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiY29sb3JOYW1lXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JzW2NvbG9yTmFtZV1cIlxyXG4gICAgICAgICAgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdjb2xvcnMuJyArIGNvbG9yTmFtZSlcIiAoY2xpY2spPVwic2VsZWN0Q29sb3IoY29sb3JOYW1lKVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+YWN0aW9uczwvaT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwic2F2ZUltYWdlKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCIgKm5nSWY9XCIhaW5Db25maWdcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnc2F2ZUJ0bicpIH19PC9hPlxyXG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4td2FybmluZ1wiICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvbiAmJiAhaW5Db25maWdcIiAoY2xpY2spPVwiZG9Mb2FkT3JpZ2luYWwoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnY2FuY2VsQnRuJykgfX08L2E+XHJcbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1kYW5nZXJcIiAqbmdJZj1cInNob3dDYW5jZWxCdXR0b25cIiAoY2xpY2spPVwiY2xvc2UoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIj57e1xyXG4gICAgICAgICAgICBnZXRUZXh0VHJhbnNsYXRlZCgnY2xvc2VEaWFsb2cnKSB9fTwvYT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQW55IGFkZGl0aW9uYWwgdG9vbGJhciBidXR0b25zIHRvIGJlIHByb2plY3RlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAtLT5cclxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBbbmdTdHlsZV09XCJ7IGJvcmRlcjogYm9yZGVyQ3NzIH1cIj5cclxuICA8Y2FudmFzIFtpZF09XCJjb21wb25lbnRHdWlkXCI+PC9jYW52YXM+XHJcbjwvZGl2PiJdfQ==