@eqproject/eqp-dynamic-module 2.8.7 → 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 -179
  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 -12770
  291. package/fesm2015/eqproject-eqp-dynamic-module.mjs.map +0 -1
  292. package/fesm2020/eqproject-eqp-dynamic-module.mjs +0 -12739
  293. package/fesm2020/eqproject-eqp-dynamic-module.mjs.map +0 -1
@@ -1,403 +0,0 @@
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
- constructor() {
11
- this.closeDialog = new EventEmitter();
12
- this.forceSizeCanvas = true;
13
- this.forceSizeExport = false;
14
- this.enableRemoveImage = false;
15
- this.enableLoadAnotherImage = false;
16
- this.enableTooltip = false;
17
- this.showCancelButton = true;
18
- this.inConfig = false;
19
- this.locale = 'en';
20
- this.outputMimeType = 'image/jpeg';
21
- this.outputQuality = 0.8;
22
- this.borderCss = 'none';
23
- this.drawingSizes = {
24
- small: 5,
25
- medium: 10,
26
- large: 25,
27
- };
28
- this.colors = {
29
- black: '#000',
30
- white: '#fff',
31
- yellow: '#ffeb3b',
32
- red: '#f44336',
33
- blue: '#2196f3',
34
- green: '#4caf50',
35
- purple: '#7a08af',
36
- };
37
- this.save = new EventEmitter();
38
- this.loadOriginal = new EventEmitter();
39
- this.currentTool = 'brush';
40
- this.currentSize = 'medium';
41
- this.currentColor = 'black';
42
- this.i18n = I18nEn;
43
- this.canUndo = false;
44
- this.canRedo = false;
45
- this.isLoading = true;
46
- this.hasError = false;
47
- this.errorMessage = '';
48
- this.stack = [];
49
- this.colorsName = [];
50
- this.drawingSizesName = [];
51
- }
52
- ngOnInit() {
53
- this.componentGuid = 'xxxx-xxxx-xxxx-xxxx'.replace(/[xy]/g, function (c) {
54
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
55
- return v.toString(16);
56
- });
57
- }
58
- ngAfterViewInit() {
59
- this.isLoading = false;
60
- this.colorsName = Object.keys(this.colors);
61
- this.drawingSizesName = Object.keys(this.drawingSizes);
62
- const canvasScaledElement = document.getElementById(this.componentGuid);
63
- this.canvas = new fabric.Canvas(canvasScaledElement, {
64
- hoverCursor: 'pointer',
65
- isDrawingMode: true,
66
- });
67
- this.canvas.backgroundColor = 'white';
68
- if (this.src) {
69
- this.importPhotoFromSrc(this.src);
70
- }
71
- else {
72
- if (!this.width || !this.height) {
73
- throw new Error('No width or hight given !');
74
- }
75
- this.canvas.setWidth(this.width);
76
- this.canvas.setHeight(this.height);
77
- }
78
- this.canvas.on('path:created', () => {
79
- this.stack = [];
80
- this.setUndoRedo();
81
- });
82
- this.selectTool(this.currentTool);
83
- this.selectColor(this.currentColor);
84
- this.selectDrawingSize(this.currentSize);
85
- if (this.locale && i18nLanguages[this.locale.toLowerCase()]) {
86
- this.i18n = i18nLanguages[this.locale.toLowerCase()];
87
- }
88
- }
89
- ngOnChanges(changes) {
90
- if (changes.src && !changes.src.firstChange && changes.src.currentValue) {
91
- if (typeof changes.src.currentValue === 'string') {
92
- this.importPhotoFromSrc(changes.src.currentValue);
93
- }
94
- else if (changes.src.currentValue instanceof Blob) {
95
- this.importPhotoFromBlob(changes.src.currentValue);
96
- }
97
- }
98
- }
99
- // Tools
100
- selectTool(tool) {
101
- this.currentTool = tool;
102
- }
103
- selectDrawingSize(size) {
104
- this.currentSize = size;
105
- if (this.canvas) {
106
- this.canvas.freeDrawingBrush.width = this.drawingSizes[size];
107
- }
108
- }
109
- selectColor(color) {
110
- this.currentColor = color;
111
- if (this.canvas) {
112
- this.canvas.freeDrawingBrush.color = this.colors[color];
113
- }
114
- }
115
- // Actions
116
- undo() {
117
- if (this.canUndo) {
118
- const lastId = this.canvas.getObjects().length - 1;
119
- const lastObj = this.canvas.getObjects()[lastId];
120
- this.stack.push(lastObj);
121
- this.canvas.remove(lastObj);
122
- this.setUndoRedo();
123
- }
124
- }
125
- redo() {
126
- if (this.canRedo) {
127
- const firstInStack = this.stack.splice(-1, 1)[0];
128
- if (firstInStack) {
129
- this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);
130
- }
131
- this.setUndoRedo();
132
- }
133
- }
134
- clearCanvas() {
135
- if (this.canvas) {
136
- this.canvas.remove(...this.canvas.getObjects());
137
- this.setUndoRedo();
138
- }
139
- }
140
- saveImage() {
141
- if (!this.forceSizeExport || (this.forceSizeExport && this.width && this.height)) {
142
- const canvasScaledElement = document.createElement('canvas');
143
- const canvasScaled = new fabric.Canvas(canvasScaledElement);
144
- canvasScaled.backgroundColor = 'white';
145
- new Observable(observer => {
146
- if (this.imageUsed) {
147
- if (this.forceSizeExport) {
148
- canvasScaled.setWidth(this.width);
149
- canvasScaled.setHeight(this.height);
150
- this.imageUsed.cloneAsImage(imageCloned => {
151
- imageCloned.scaleToWidth(this.width, false);
152
- imageCloned.scaleToHeight(this.height, false);
153
- canvasScaled.setBackgroundImage(imageCloned, (img) => {
154
- if (!img) {
155
- observer.error(new Error('Impossible to draw the image on the temporary canvas'));
156
- }
157
- observer.next(canvasScaled);
158
- observer.complete();
159
- }, {
160
- crossOrigin: 'anonymous',
161
- originX: 'left',
162
- originY: 'top'
163
- });
164
- });
165
- }
166
- else {
167
- canvasScaled.setBackgroundImage(this.imageUsed, (img) => {
168
- if (!img) {
169
- observer.error(new Error('Impossible to draw the image on the temporary canvas'));
170
- }
171
- canvasScaled.setWidth(img.width);
172
- canvasScaled.setHeight(img.height);
173
- observer.next(canvasScaled);
174
- observer.complete();
175
- }, {
176
- crossOrigin: 'anonymous',
177
- originX: 'left',
178
- originY: 'top'
179
- });
180
- }
181
- }
182
- else {
183
- canvasScaled.setWidth(this.width);
184
- canvasScaled.setHeight(this.height);
185
- }
186
- }).pipe(switchMap(() => {
187
- let process = of(canvasScaled);
188
- if (this.canvas.getObjects().length > 0) {
189
- const ratioX = canvasScaled.getWidth() / this.canvas.getWidth();
190
- const ratioY = canvasScaled.getHeight() / this.canvas.getHeight();
191
- this.canvas.getObjects().forEach((originalObject, i) => {
192
- process = process.pipe(switchMap(() => {
193
- return new Observable(observerObject => {
194
- originalObject.clone((clonedObject) => {
195
- clonedObject.set('left', originalObject.left * ratioX);
196
- clonedObject.set('top', originalObject.top * ratioY);
197
- clonedObject.scaleToWidth(originalObject.width * ratioX);
198
- clonedObject.scaleToHeight(originalObject.height * ratioY);
199
- canvasScaled.insertAt(clonedObject, i, false);
200
- canvasScaled.renderAll();
201
- observerObject.next(canvasScaled);
202
- observerObject.complete();
203
- });
204
- });
205
- }));
206
- });
207
- }
208
- return process;
209
- })).subscribe(() => {
210
- canvasScaled.renderAll();
211
- canvasScaled.getElement().toBlob((data) => {
212
- this.save.emit(data);
213
- }, this.outputMimeType, this.outputQuality);
214
- });
215
- }
216
- else {
217
- this.canvas.getElement().toBlob((data) => {
218
- this.save.emit(data);
219
- }, this.outputMimeType, this.outputQuality);
220
- }
221
- }
222
- doLoadOriginal() {
223
- this.loadOriginal.emit();
224
- }
225
- getTextTranslated(name) {
226
- let strOk = name.split('.').reduce((o, i) => o[i], this.i18n);
227
- if (this.i18nUser) {
228
- try {
229
- const str = name.split('.').reduce((o, i) => o[i], this.i18nUser);
230
- if (str) {
231
- strOk = str;
232
- }
233
- }
234
- catch (e) {
235
- // if we pass here, ignored
236
- }
237
- }
238
- if (!strOk) {
239
- console.error(name + ' translation not found !');
240
- }
241
- return strOk;
242
- }
243
- getTooltipTranslated(name) {
244
- if (this.enableTooltip) {
245
- return this.getTextTranslated(name);
246
- }
247
- else {
248
- return '';
249
- }
250
- }
251
- setUndoRedo() {
252
- this.canUndo = this.canvas.getObjects().length > 0;
253
- this.canRedo = this.stack.length > 0;
254
- // this.canvas.renderAll();
255
- }
256
- importPhotoFromFile(event) {
257
- if (event.target.files && event.target.files.length > 0) {
258
- const file = event.target.files[0];
259
- if (file.type.match('image.*')) {
260
- this.importPhotoFromBlob(file);
261
- }
262
- else {
263
- throw new Error('Not an image !');
264
- }
265
- }
266
- }
267
- removeImage() {
268
- if (this.imageUsed) {
269
- this.imageUsed.dispose();
270
- this.imageUsed = null;
271
- }
272
- this.canvas.backgroundImage = null;
273
- if (this.width && this.height) {
274
- this.canvas.setWidth(this.width);
275
- this.canvas.setHeight(this.height);
276
- }
277
- this.canvas.renderAll();
278
- }
279
- get hasImage() {
280
- return !!this.canvas.backgroundImage;
281
- }
282
- importPhotoFromSrc(src) {
283
- this.isLoading = true;
284
- let isFirstTry = true;
285
- const imgEl = new Image();
286
- imgEl.setAttribute('crossOrigin', 'anonymous');
287
- imgEl.src = src;
288
- imgEl.onerror = () => {
289
- // Retry with cors proxy
290
- if (isFirstTry) {
291
- imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;
292
- isFirstTry = false;
293
- }
294
- else {
295
- this.isLoading = false;
296
- this.hasError = true;
297
- this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src);
298
- }
299
- };
300
- imgEl.onload = () => {
301
- this.isLoading = false;
302
- this.imageUsed = new fabric.Image(imgEl);
303
- this.imageUsed.cloneAsImage(image => {
304
- let width = imgEl.width;
305
- let height = imgEl.height;
306
- if (this.width) {
307
- width = this.width;
308
- }
309
- if (this.height) {
310
- height = this.height;
311
- }
312
- image.scaleToWidth(width, false);
313
- image.scaleToHeight(height, false);
314
- this.canvas.setBackgroundImage(image, ((img) => {
315
- if (img) {
316
- if (this.forceSizeCanvas) {
317
- this.canvas.setWidth(width);
318
- this.canvas.setHeight(height);
319
- }
320
- else {
321
- this.canvas.setWidth(image.getScaledWidth());
322
- this.canvas.setHeight(image.getScaledHeight());
323
- }
324
- }
325
- }), {
326
- crossOrigin: 'anonymous',
327
- originX: 'left',
328
- originY: 'top'
329
- });
330
- });
331
- };
332
- }
333
- importPhotoFromBlob(file) {
334
- const reader = new FileReader();
335
- reader.readAsDataURL(file);
336
- reader.onload = (evtReader) => {
337
- if (evtReader.target.readyState == FileReader.DONE) {
338
- this.importPhotoFromSrc(evtReader.target.result);
339
- }
340
- };
341
- }
342
- importPhotoFromUrl() {
343
- const url = prompt(this.getTooltipTranslated('loadImageUrl'));
344
- if (url) {
345
- this.importPhotoFromSrc(url);
346
- }
347
- }
348
- close() {
349
- this.closeDialog.emit();
350
- }
351
- }
352
- TmwImageDrawerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TmwImageDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
353
- TmwImageDrawerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", 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"] }] });
354
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TmwImageDrawerComponent, decorators: [{
355
- type: Component,
356
- 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"] }]
357
- }], ctorParameters: function () { return []; }, propDecorators: { closeDialog: [{
358
- type: Output
359
- }], src: [{
360
- type: Input
361
- }], width: [{
362
- type: Input
363
- }], height: [{
364
- type: Input
365
- }], forceSizeCanvas: [{
366
- type: Input
367
- }], forceSizeExport: [{
368
- type: Input
369
- }], enableRemoveImage: [{
370
- type: Input
371
- }], enableLoadAnotherImage: [{
372
- type: Input
373
- }], enableTooltip: [{
374
- type: Input
375
- }], showCancelButton: [{
376
- type: Input
377
- }], inConfig: [{
378
- type: Input
379
- }], i18nUser: [{
380
- type: Input,
381
- args: ['i18n']
382
- }], locale: [{
383
- type: Input
384
- }], loadingTemplate: [{
385
- type: Input
386
- }], errorTemplate: [{
387
- type: Input
388
- }], outputMimeType: [{
389
- type: Input
390
- }], outputQuality: [{
391
- type: Input
392
- }], borderCss: [{
393
- type: Input
394
- }], drawingSizes: [{
395
- type: Input
396
- }], colors: [{
397
- type: Input
398
- }], save: [{
399
- type: Output
400
- }], loadOriginal: [{
401
- type: Output
402
- }] } });
403
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvdG13LWltYWdlLWRyYXdlci90bXctaW1hZ2UtZHJhd2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VxcC1keW5hbWljLW1vZHVsZS9zcmMvbGliL2NvbXBvbmVudHMvcHJpdmF0ZS90bXctaW1hZ2UtZHJhd2VyL3Rtdy1pbWFnZS1kcmF3ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUE4QixNQUFNLGVBQWUsQ0FBQztBQUNySSxPQUFPLEVBQUUsTUFBTSxFQUFpQixhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFPM0MsTUFBTSxPQUFPLHVCQUF1QjtJQXNFbEM7UUFwRVUsZ0JBQVcsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQU1yRCxvQkFBZSxHQUFHLElBQUksQ0FBQztRQUN2QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUV4QixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBSTNCLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFLdEIsbUJBQWMsR0FBRyxZQUFZLENBQUM7UUFDOUIsa0JBQWEsR0FBRyxHQUFHLENBQUM7UUFFcEIsY0FBUyxHQUFXLE1BQU0sQ0FBQztRQUUzQixpQkFBWSxHQUErQjtZQUN6RCxLQUFLLEVBQUUsQ0FBQztZQUNSLE1BQU0sRUFBRSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDO1FBRWMsV0FBTSxHQUErQjtZQUNuRCxLQUFLLEVBQUUsTUFBTTtZQUNiLEtBQUssRUFBRSxNQUFNO1lBQ2IsTUFBTSxFQUFFLFNBQVM7WUFDakIsR0FBRyxFQUFFLFNBQVM7WUFDZCxJQUFJLEVBQUUsU0FBUztZQUNmLEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1NBQ2xCLENBQUM7UUFFZSxTQUFJLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDcEQsaUJBQVksR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV0RSxnQkFBVyxHQUFHLE9BQU8sQ0FBQztRQUN0QixnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUN2QixpQkFBWSxHQUFHLE9BQU8sQ0FBQztRQUN2QixTQUFJLEdBQWtCLE1BQU0sQ0FBQztRQUU3QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsY0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBR2pCLFVBQUssR0FBb0IsRUFBRSxDQUFDO1FBRTdCLGVBQVUsR0FBYSxFQUFFLENBQUM7UUFDMUIscUJBQWdCLEdBQWEsRUFBRSxDQUFDO0lBT3ZDLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUNyRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFDNUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXZELE1BQU0sbUJBQW1CLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUU7WUFDbkQsV0FBVyxFQUFFLFNBQVM7WUFDdEIsYUFBYSxFQUFFLElBQUk7U0FDcEIsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1FBRXRDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO2FBQzlDO1lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7WUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFO1lBQ3ZFLElBQUksT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUU7Z0JBQ2hELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ25EO2lCQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLFlBQVksSUFBSSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUNwRDtTQUNGO0lBQ0gsQ0FBQztJQUVELFFBQVE7SUFDRCxVQUFVLENBQUMsSUFBWTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBWTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlEO0lBQ0gsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFhO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekQ7SUFDSCxDQUFDO0lBRUQsVUFBVTtJQUNILElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDaEY7WUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU0sU0FBUztRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoRixNQUFNLG1CQUFtQixHQUFzQixRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hGLE1BQU0sWUFBWSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzVELFlBQVksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1lBRXZDLElBQUksVUFBVSxDQUFnQixRQUFRLENBQUMsRUFBRTtnQkFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO29CQUNsQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7d0JBQ3hCLFlBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNsQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFFcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7NEJBQ3hDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQzs0QkFDNUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDOzRCQUU5QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBcUIsRUFBRSxFQUFFO2dDQUNyRSxJQUFJLENBQUMsR0FBRyxFQUFFO29DQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQyxDQUFDO2lDQUNuRjtnQ0FFRCxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2dDQUM1QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7NEJBQ3RCLENBQUMsRUFBRTtnQ0FDRCxXQUFXLEVBQUUsV0FBVztnQ0FDeEIsT0FBTyxFQUFFLE1BQU07Z0NBQ2YsT0FBTyxFQUFFLEtBQUs7NkJBQ2YsQ0FBQyxDQUFDO3dCQUNMLENBQUMsQ0FBQyxDQUFDO3FCQUNKO3lCQUFNO3dCQUNMLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBcUIsRUFBRSxFQUFFOzRCQUN4RSxJQUFJLENBQUMsR0FBRyxFQUFFO2dDQUNSLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQyxDQUFDOzZCQUNuRjs0QkFFRCxZQUFZLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDakMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7NEJBRW5DLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7NEJBQzVCLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQzt3QkFDdEIsQ0FBQyxFQUFFOzRCQUNELFdBQVcsRUFBRSxXQUFXOzRCQUN4QixPQUFPLEVBQUUsTUFBTTs0QkFDZixPQUFPLEVBQUUsS0FBSzt5QkFDZixDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7cUJBQU07b0JBQ0wsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNyQztZQUNILENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDTCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFFL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3ZDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUNoRSxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFFbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUE2QixFQUFFLENBQVMsRUFBRSxFQUFFO3dCQUM1RSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFOzRCQUNwQyxPQUFPLElBQUksVUFBVSxDQUFnQixjQUFjLENBQUMsRUFBRTtnQ0FDcEQsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQTJCLEVBQUUsRUFBRTtvQ0FDbkQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQztvQ0FDdkQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQztvQ0FDckQsWUFBWSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO29DQUN6RCxZQUFZLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUM7b0NBRTNELFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztvQ0FDOUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO29DQUV6QixjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29DQUNsQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7Z0NBQzVCLENBQUMsQ0FBQyxDQUFDOzRCQUNMLENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ04sQ0FBQyxDQUFDLENBQUM7aUJBQ0o7Z0JBQ0QsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNmLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDekIsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FDOUIsQ0FBQyxJQUFVLEVBQUUsRUFBRTtvQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxFQUNELElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNKO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FDN0IsQ0FBQyxJQUFVLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QixDQUFDLEVBQ0QsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FDbkIsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBWTtRQUNuQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBVyxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUk7Z0JBQ0YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQWUsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLEdBQUcsRUFBRTtvQkFDUCxLQUFLLEdBQUcsR0FBRyxDQUFDO2lCQUNiO2FBQ0Y7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDViwyQkFBMkI7YUFDNUI7U0FDRjtRQUVELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRywwQkFBMEIsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBWTtRQUN0QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDcEM7YUFBTTtZQUNMLE9BQU8sRUFBRSxDQUFDO1NBQ1g7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNyQywyQkFBMkI7SUFDN0IsQ0FBQztJQUVNLG1CQUFtQixDQUFDLEtBQWtCO1FBQzNDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDaEM7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ25DO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUVuQyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxHQUFXO1FBQ3BDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLHdCQUF3QjtZQUN4QixJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLENBQUMsR0FBRyxHQUFHLHNDQUFzQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQzlELFVBQVUsR0FBRyxLQUFLLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNyQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFhLENBQUMsQ0FBQzthQUMzRjtRQUNILENBQUMsQ0FBQztRQUNGLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRXpDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNsQyxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUN4QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUUxQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7b0JBQ2QsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7aUJBQ3BCO2dCQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDZixNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztpQkFDdEI7Z0JBRUQsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUVuQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBcUIsRUFBRSxFQUFFO29CQUMvRCxJQUFJLEdBQUcsRUFBRTt3QkFDUCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7NEJBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDL0I7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7NEJBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO3lCQUNoRDtxQkFDRjtnQkFDSCxDQUFDLENBQUMsRUFBRTtvQkFDRixXQUFXLEVBQUUsV0FBVztvQkFDeEIsT0FBTyxFQUFFLE1BQU07b0JBQ2YsT0FBTyxFQUFFLEtBQUs7aUJBQ2YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sbUJBQW1CLENBQUMsSUFBaUI7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUNqQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xEO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDOUI7SUFDSCxDQUFDO0lBRU0sS0FBSztRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQzs7cUhBamFVLHVCQUF1Qjt5R0FBdkIsdUJBQXVCLDB0QkNYcEMsKy9HQXlFTTs0RkQ5RE8sdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLGtCQUFrQjswRUFNbEIsV0FBVztzQkFBcEIsTUFBTTtnQkFFUyxHQUFHO3NCQUFsQixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsTUFBTTtzQkFBckIsS0FBSztnQkFFVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUNVLHNCQUFzQjtzQkFBckMsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUNVLGdCQUFnQjtzQkFBL0IsS0FBSztnQkFFVSxRQUFRO3NCQUF2QixLQUFLO2dCQUdnQixRQUFRO3NCQUE3QixLQUFLO3VCQUFDLE1BQU07Z0JBQ0csTUFBTTtzQkFBckIsS0FBSztnQkFFVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBRVUsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBRVUsWUFBWTtzQkFBM0IsS0FBSztnQkFNVSxNQUFNO3NCQUFyQixLQUFLO2dCQVVXLElBQUk7c0JBQXBCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSTE4bkVuLCBJMThuSW50ZXJmYWNlLCBpMThuTGFuZ3VhZ2VzIH0gZnJvbSAnLi9pMThuJztcclxuaW1wb3J0IHsgZmFicmljIH0gZnJvbSAnZmFicmljJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0bXctaW1hZ2UtZHJhd2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdG13LWltYWdlLWRyYXdlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUbXdJbWFnZURyYXdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcclxuXHJcbiAgQE91dHB1dCgpIGNsb3NlRGlhbG9nOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBzcmM/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHdpZHRoPzogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQ/OiBudW1iZXI7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JjZVNpemVDYW52YXMgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBmb3JjZVNpemVFeHBvcnQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlUmVtb3ZlSW1hZ2UgPSBmYWxzZTtcclxuICBASW5wdXQoKSBwdWJsaWMgZW5hYmxlTG9hZEFub3RoZXJJbWFnZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBlbmFibGVUb29sdGlwID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcHVibGljIHNob3dDYW5jZWxCdXR0b24gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgaW5Db25maWc/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIEB0cy1pZ25vcmVcclxuICBASW5wdXQoJ2kxOG4nKSBwdWJsaWMgaTE4blVzZXI6IEkxOG5JbnRlcmZhY2U7XHJcbiAgQElucHV0KCkgcHVibGljIGxvY2FsZTogc3RyaW5nID0gJ2VuJztcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGxvYWRpbmdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgcHVibGljIGVycm9yVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBASW5wdXQoKSBwdWJsaWMgb3V0cHV0TWltZVR5cGUgPSAnaW1hZ2UvanBlZyc7XHJcbiAgQElucHV0KCkgcHVibGljIG91dHB1dFF1YWxpdHkgPSAwLjg7XHJcblxyXG4gIEBJbnB1dCgpIHB1YmxpYyBib3JkZXJDc3M6IHN0cmluZyA9ICdub25lJztcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGRyYXdpbmdTaXplczogeyBbbmFtZTogc3RyaW5nXTogbnVtYmVyIH0gPSB7XHJcbiAgICBzbWFsbDogNSxcclxuICAgIG1lZGl1bTogMTAsXHJcbiAgICBsYXJnZTogMjUsXHJcbiAgfTtcclxuXHJcbiAgQElucHV0KCkgcHVibGljIGNvbG9yczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICBibGFjazogJyMwMDAnLFxyXG4gICAgd2hpdGU6ICcjZmZmJyxcclxuICAgIHllbGxvdzogJyNmZmViM2InLFxyXG4gICAgcmVkOiAnI2Y0NDMzNicsXHJcbiAgICBibHVlOiAnIzIxOTZmMycsXHJcbiAgICBncmVlbjogJyM0Y2FmNTAnLFxyXG4gICAgcHVycGxlOiAnIzdhMDhhZicsXHJcbiAgfTtcclxuXHJcbiAgQE91dHB1dCgpIHB1YmxpYyBzYXZlOiBFdmVudEVtaXR0ZXI8QmxvYj4gPSBuZXcgRXZlbnRFbWl0dGVyPEJsb2I+KCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBsb2FkT3JpZ2luYWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIGN1cnJlbnRUb29sID0gJ2JydXNoJztcclxuICBwdWJsaWMgY3VycmVudFNpemUgPSAnbWVkaXVtJztcclxuICBwdWJsaWMgY3VycmVudENvbG9yID0gJ2JsYWNrJztcclxuICBwdWJsaWMgaTE4bjogSTE4bkludGVyZmFjZSA9IEkxOG5FbjtcclxuXHJcbiAgcHVibGljIGNhblVuZG8gPSBmYWxzZTtcclxuICBwdWJsaWMgY2FuUmVkbyA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaXNMb2FkaW5nID0gdHJ1ZTtcclxuICBwdWJsaWMgaGFzRXJyb3IgPSBmYWxzZTtcclxuICBwdWJsaWMgZXJyb3JNZXNzYWdlID0gJyc7XHJcblxyXG4gIHByaXZhdGUgY2FudmFzOiBmYWJyaWMuQ2FudmFzO1xyXG4gIHByaXZhdGUgc3RhY2s6IGZhYnJpYy5PYmplY3RbXSA9IFtdO1xyXG5cclxuICBwdWJsaWMgY29sb3JzTmFtZTogc3RyaW5nW10gPSBbXTtcclxuICBwdWJsaWMgZHJhd2luZ1NpemVzTmFtZTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgcHJpdmF0ZSBpbWFnZVVzZWQ/OiBmYWJyaWMuSW1hZ2U7XHJcblxyXG4gIGNvbXBvbmVudEd1aWQ6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNvbXBvbmVudEd1aWQgPSAneHh4eC14eHh4LXh4eHgteHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbiAoYykge1xyXG4gICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsXHJcbiAgICAgICAgdiA9IGMgPT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcclxuICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgdGhpcy5jb2xvcnNOYW1lID0gT2JqZWN0LmtleXModGhpcy5jb2xvcnMpO1xyXG4gICAgdGhpcy5kcmF3aW5nU2l6ZXNOYW1lID0gT2JqZWN0LmtleXModGhpcy5kcmF3aW5nU2l6ZXMpO1xyXG5cclxuICAgIGNvbnN0IGNhbnZhc1NjYWxlZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmNvbXBvbmVudEd1aWQpO1xyXG4gICAgdGhpcy5jYW52YXMgPSBuZXcgZmFicmljLkNhbnZhcyhjYW52YXNTY2FsZWRFbGVtZW50LCB7XHJcbiAgICAgIGhvdmVyQ3Vyc29yOiAncG9pbnRlcicsXHJcbiAgICAgIGlzRHJhd2luZ01vZGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2FudmFzLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcblxyXG4gICAgaWYgKHRoaXMuc3JjKSB7XHJcbiAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKHRoaXMuc3JjKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICghdGhpcy53aWR0aCB8fCAhdGhpcy5oZWlnaHQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHdpZHRoIG9yIGhpZ2h0IGdpdmVuICEnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgodGhpcy53aWR0aCk7XHJcbiAgICAgIHRoaXMuY2FudmFzLnNldEhlaWdodCh0aGlzLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jYW52YXMub24oJ3BhdGg6Y3JlYXRlZCcsICgpID0+IHtcclxuICAgICAgdGhpcy5zdGFjayA9IFtdO1xyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdFRvb2wodGhpcy5jdXJyZW50VG9vbCk7XHJcbiAgICB0aGlzLnNlbGVjdENvbG9yKHRoaXMuY3VycmVudENvbG9yKTtcclxuICAgIHRoaXMuc2VsZWN0RHJhd2luZ1NpemUodGhpcy5jdXJyZW50U2l6ZSk7XHJcblxyXG4gICAgaWYgKHRoaXMubG9jYWxlICYmIGkxOG5MYW5ndWFnZXNbdGhpcy5sb2NhbGUudG9Mb3dlckNhc2UoKV0pIHtcclxuICAgICAgdGhpcy5pMThuID0gaTE4bkxhbmd1YWdlc1t0aGlzLmxvY2FsZS50b0xvd2VyQ2FzZSgpXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLnNyYyAmJiAhY2hhbmdlcy5zcmMuZmlyc3RDaGFuZ2UgJiYgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tU3JjKGNoYW5nZXMuc3JjLmN1cnJlbnRWYWx1ZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcy5zcmMuY3VycmVudFZhbHVlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICAgIHRoaXMuaW1wb3J0UGhvdG9Gcm9tQmxvYihjaGFuZ2VzLnNyYy5jdXJyZW50VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBUb29sc1xyXG4gIHB1YmxpYyBzZWxlY3RUb29sKHRvb2w6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50VG9vbCA9IHRvb2w7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0RHJhd2luZ1NpemUoc2l6ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRTaXplID0gc2l6ZTtcclxuICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLndpZHRoID0gdGhpcy5kcmF3aW5nU2l6ZXNbc2l6ZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0Q29sb3IoY29sb3I6IHN0cmluZykge1xyXG4gICAgdGhpcy5jdXJyZW50Q29sb3IgPSBjb2xvcjtcclxuICAgIGlmICh0aGlzLmNhbnZhcykge1xyXG4gICAgICB0aGlzLmNhbnZhcy5mcmVlRHJhd2luZ0JydXNoLmNvbG9yID0gdGhpcy5jb2xvcnNbY29sb3JdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQWN0aW9uc1xyXG4gIHB1YmxpYyB1bmRvKCkge1xyXG4gICAgaWYgKHRoaXMuY2FuVW5kbykge1xyXG4gICAgICBjb25zdCBsYXN0SWQgPSB0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoIC0gMTtcclxuICAgICAgY29uc3QgbGFzdE9iaiA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKVtsYXN0SWRdO1xyXG4gICAgICB0aGlzLnN0YWNrLnB1c2gobGFzdE9iaik7XHJcbiAgICAgIHRoaXMuY2FudmFzLnJlbW92ZShsYXN0T2JqKTtcclxuICAgICAgdGhpcy5zZXRVbmRvUmVkbygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZG8oKSB7XHJcbiAgICBpZiAodGhpcy5jYW5SZWRvKSB7XHJcbiAgICAgIGNvbnN0IGZpcnN0SW5TdGFjayA9IHRoaXMuc3RhY2suc3BsaWNlKC0xLCAxKVswXTtcclxuICAgICAgaWYgKGZpcnN0SW5TdGFjaykge1xyXG4gICAgICAgIHRoaXMuY2FudmFzLmluc2VydEF0KGZpcnN0SW5TdGFjaywgdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmxlbmd0aCAtIDEsIGZhbHNlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNldFVuZG9SZWRvKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJDYW52YXMoKSB7XHJcbiAgICBpZiAodGhpcy5jYW52YXMpIHtcclxuICAgICAgdGhpcy5jYW52YXMucmVtb3ZlKC4uLnRoaXMuY2FudmFzLmdldE9iamVjdHMoKSk7XHJcbiAgICAgIHRoaXMuc2V0VW5kb1JlZG8oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlSW1hZ2UoKSB7XHJcbiAgICBpZiAoIXRoaXMuZm9yY2VTaXplRXhwb3J0IHx8ICh0aGlzLmZvcmNlU2l6ZUV4cG9ydCAmJiB0aGlzLndpZHRoICYmIHRoaXMuaGVpZ2h0KSkge1xyXG4gICAgICBjb25zdCBjYW52YXNTY2FsZWRFbGVtZW50OiBIVE1MQ2FudmFzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xyXG4gICAgICBjb25zdCBjYW52YXNTY2FsZWQgPSBuZXcgZmFicmljLkNhbnZhcyhjYW52YXNTY2FsZWRFbGVtZW50KTtcclxuICAgICAgY2FudmFzU2NhbGVkLmJhY2tncm91bmRDb2xvciA9ICd3aGl0ZSc7XHJcblxyXG4gICAgICBuZXcgT2JzZXJ2YWJsZTxmYWJyaWMuQ2FudmFzPihvYnNlcnZlciA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VVc2VkKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5mb3JjZVNpemVFeHBvcnQpIHtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldFdpZHRoKHRoaXMud2lkdGgpO1xyXG4gICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VVc2VkLmNsb25lQXNJbWFnZShpbWFnZUNsb25lZCA9PiB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VDbG9uZWQuc2NhbGVUb1dpZHRoKHRoaXMud2lkdGgsIGZhbHNlKTtcclxuICAgICAgICAgICAgICBpbWFnZUNsb25lZC5zY2FsZVRvSGVpZ2h0KHRoaXMuaGVpZ2h0LCBmYWxzZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRCYWNrZ3JvdW5kSW1hZ2UoaW1hZ2VDbG9uZWQsIChpbWc6IEhUTUxJbWFnZUVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBFcnJvcignSW1wb3NzaWJsZSB0byBkcmF3IHRoZSBpbWFnZSBvbiB0aGUgdGVtcG9yYXJ5IGNhbnZhcycpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGNhbnZhc1NjYWxlZCk7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcclxuICAgICAgICAgICAgICAgIG9yaWdpblg6ICdsZWZ0JyxcclxuICAgICAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY2FudmFzU2NhbGVkLnNldEJhY2tncm91bmRJbWFnZSh0aGlzLmltYWdlVXNlZCwgKGltZzogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghaW1nKSB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgRXJyb3IoJ0ltcG9zc2libGUgdG8gZHJhdyB0aGUgaW1hZ2Ugb24gdGhlIHRlbXBvcmFyeSBjYW52YXMnKSk7XHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0V2lkdGgoaW1nLndpZHRoKTtcclxuICAgICAgICAgICAgICBjYW52YXNTY2FsZWQuc2V0SGVpZ2h0KGltZy5oZWlnaHQpO1xyXG5cclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KGNhbnZhc1NjYWxlZCk7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgIGNyb3NzT3JpZ2luOiAnYW5vbnltb3VzJyxcclxuICAgICAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCdcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgICAgIGNhbnZhc1NjYWxlZC5zZXRIZWlnaHQodGhpcy5oZWlnaHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSkucGlwZShcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xyXG4gICAgICAgICAgbGV0IHByb2Nlc3MgPSBvZihjYW52YXNTY2FsZWQpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLmNhbnZhcy5nZXRPYmplY3RzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCByYXRpb1ggPSBjYW52YXNTY2FsZWQuZ2V0V2lkdGgoKSAvIHRoaXMuY2FudmFzLmdldFdpZHRoKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHJhdGlvWSA9IGNhbnZhc1NjYWxlZC5nZXRIZWlnaHQoKSAvIHRoaXMuY2FudmFzLmdldEhlaWdodCgpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jYW52YXMuZ2V0T2JqZWN0cygpLmZvckVhY2goKG9yaWdpbmFsT2JqZWN0OiBmYWJyaWMuT2JqZWN0LCBpOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICBwcm9jZXNzID0gcHJvY2Vzcy5waXBlKHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8ZmFicmljLkNhbnZhcz4ob2JzZXJ2ZXJPYmplY3QgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbE9iamVjdC5jbG9uZSgoY2xvbmVkT2JqZWN0OiBmYWJyaWMuT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNldCgnbGVmdCcsIG9yaWdpbmFsT2JqZWN0LmxlZnQgKiByYXRpb1gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNsb25lZE9iamVjdC5zZXQoJ3RvcCcsIG9yaWdpbmFsT2JqZWN0LnRvcCAqIHJhdGlvWSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNjYWxlVG9XaWR0aChvcmlnaW5hbE9iamVjdC53aWR0aCAqIHJhdGlvWCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xvbmVkT2JqZWN0LnNjYWxlVG9IZWlnaHQob3JpZ2luYWxPYmplY3QuaGVpZ2h0ICogcmF0aW9ZKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzU2NhbGVkLmluc2VydEF0KGNsb25lZE9iamVjdCwgaSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbnZhc1NjYWxlZC5yZW5kZXJBbGwoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJPYmplY3QubmV4dChjYW52YXNTY2FsZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyT2JqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBwcm9jZXNzO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgY2FudmFzU2NhbGVkLnJlbmRlckFsbCgpO1xyXG4gICAgICAgIGNhbnZhc1NjYWxlZC5nZXRFbGVtZW50KCkudG9CbG9iKFxyXG4gICAgICAgICAgKGRhdGE6IEJsb2IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zYXZlLmVtaXQoZGF0YSk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdGhpcy5vdXRwdXRNaW1lVHlwZSxcclxuICAgICAgICAgIHRoaXMub3V0cHV0UXVhbGl0eVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jYW52YXMuZ2V0RWxlbWVudCgpLnRvQmxvYihcclxuICAgICAgICAoZGF0YTogQmxvYikgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zYXZlLmVtaXQoZGF0YSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICB0aGlzLm91dHB1dE1pbWVUeXBlLFxyXG4gICAgICAgIHRoaXMub3V0cHV0UXVhbGl0eVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvTG9hZE9yaWdpbmFsKCkge1xyXG4gICAgdGhpcy5sb2FkT3JpZ2luYWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFRleHRUcmFuc2xhdGVkKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgc3RyT2sgPSBuYW1lLnNwbGl0KCcuJykucmVkdWNlKChvLCBpKSA9PiBvW2ldLCB0aGlzLmkxOG4gYXMgYW55KTtcclxuXHJcbiAgICBpZiAodGhpcy5pMThuVXNlcikge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHN0ciA9IG5hbWUuc3BsaXQoJy4nKS5yZWR1Y2UoKG8sIGkpID0+IG9baV0sIHRoaXMuaTE4blVzZXIgYXMgYW55KTtcclxuICAgICAgICBpZiAoc3RyKSB7XHJcbiAgICAgICAgICBzdHJPayA9IHN0cjtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAvLyBpZiB3ZSBwYXNzIGhlcmUsIGlnbm9yZWRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghc3RyT2spIHtcclxuICAgICAgY29uc29sZS5lcnJvcihuYW1lICsgJyB0cmFuc2xhdGlvbiBub3QgZm91bmQgIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdHJPaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRUb29sdGlwVHJhbnNsYXRlZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuZW5hYmxlVG9vbHRpcCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRUZXh0VHJhbnNsYXRlZChuYW1lKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRVbmRvUmVkbygpIHtcclxuICAgIHRoaXMuY2FuVW5kbyA9IHRoaXMuY2FudmFzLmdldE9iamVjdHMoKS5sZW5ndGggPiAwO1xyXG4gICAgdGhpcy5jYW5SZWRvID0gdGhpcy5zdGFjay5sZW5ndGggPiAwO1xyXG4gICAgLy8gdGhpcy5jYW52YXMucmVuZGVyQWxsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1wb3J0UGhvdG9Gcm9tRmlsZShldmVudDogRXZlbnQgfCBhbnkpIHtcclxuICAgIGlmIChldmVudC50YXJnZXQuZmlsZXMgJiYgZXZlbnQudGFyZ2V0LmZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGV2ZW50LnRhcmdldC5maWxlc1swXTtcclxuICAgICAgaWYgKGZpbGUudHlwZS5tYXRjaCgnaW1hZ2UuKicpKSB7XHJcbiAgICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21CbG9iKGZpbGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFuIGltYWdlICEnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUltYWdlKCkge1xyXG4gICAgaWYgKHRoaXMuaW1hZ2VVc2VkKSB7XHJcbiAgICAgIHRoaXMuaW1hZ2VVc2VkLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5pbWFnZVVzZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW52YXMuYmFja2dyb3VuZEltYWdlID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy53aWR0aCAmJiB0aGlzLmhlaWdodCkge1xyXG4gICAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh0aGlzLndpZHRoKTtcclxuICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KHRoaXMuaGVpZ2h0KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhcy5yZW5kZXJBbGwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaGFzSW1hZ2UoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmNhbnZhcy5iYWNrZ3JvdW5kSW1hZ2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGltcG9ydFBob3RvRnJvbVNyYyhzcmM6IHN0cmluZykge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IGlzRmlyc3RUcnkgPSB0cnVlO1xyXG4gICAgY29uc3QgaW1nRWwgPSBuZXcgSW1hZ2UoKTtcclxuICAgIGltZ0VsLnNldEF0dHJpYnV0ZSgnY3Jvc3NPcmlnaW4nLCAnYW5vbnltb3VzJyk7XHJcbiAgICBpbWdFbC5zcmMgPSBzcmM7XHJcbiAgICBpbWdFbC5vbmVycm9yID0gKCkgPT4ge1xyXG4gICAgICAvLyBSZXRyeSB3aXRoIGNvcnMgcHJveHlcclxuICAgICAgaWYgKGlzRmlyc3RUcnkpIHtcclxuICAgICAgICBpbWdFbC5zcmMgPSAnaHR0cHM6Ly9jb3JzLWFueXdoZXJlLmhlcm9rdWFwcC5jb20vJyArIHRoaXMuc3JjO1xyXG4gICAgICAgIGlzRmlyc3RUcnkgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRUZXh0VHJhbnNsYXRlZCgnbG9hZEVycm9yJykucmVwbGFjZSgnJUAnLCB0aGlzLnNyYyBhcyBzdHJpbmcpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgaW1nRWwub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmltYWdlVXNlZCA9IG5ldyBmYWJyaWMuSW1hZ2UoaW1nRWwpO1xyXG5cclxuICAgICAgdGhpcy5pbWFnZVVzZWQuY2xvbmVBc0ltYWdlKGltYWdlID0+IHtcclxuICAgICAgICBsZXQgd2lkdGggPSBpbWdFbC53aWR0aDtcclxuICAgICAgICBsZXQgaGVpZ2h0ID0gaW1nRWwuaGVpZ2h0O1xyXG5cclxuICAgICAgICBpZiAodGhpcy53aWR0aCkge1xyXG4gICAgICAgICAgd2lkdGggPSB0aGlzLndpZHRoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5oZWlnaHQpIHtcclxuICAgICAgICAgIGhlaWdodCA9IHRoaXMuaGVpZ2h0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaW1hZ2Uuc2NhbGVUb1dpZHRoKHdpZHRoLCBmYWxzZSk7XHJcbiAgICAgICAgaW1hZ2Uuc2NhbGVUb0hlaWdodChoZWlnaHQsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5jYW52YXMuc2V0QmFja2dyb3VuZEltYWdlKGltYWdlLCAoKGltZzogSFRNTEltYWdlRWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGltZykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JjZVNpemVDYW52YXMpIHtcclxuICAgICAgICAgICAgICB0aGlzLmNhbnZhcy5zZXRXaWR0aCh3aWR0aCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KGhlaWdodCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0V2lkdGgoaW1hZ2UuZ2V0U2NhbGVkV2lkdGgoKSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXMuc2V0SGVpZ2h0KGltYWdlLmdldFNjYWxlZEhlaWdodCgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLCB7XHJcbiAgICAgICAgICBjcm9zc09yaWdpbjogJ2Fub255bW91cycsXHJcbiAgICAgICAgICBvcmlnaW5YOiAnbGVmdCcsXHJcbiAgICAgICAgICBvcmlnaW5ZOiAndG9wJ1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGltcG9ydFBob3RvRnJvbUJsb2IoZmlsZTogQmxvYiB8IEZpbGUpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcclxuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZ0UmVhZGVyOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGV2dFJlYWRlci50YXJnZXQucmVhZHlTdGF0ZSA9PSBGaWxlUmVhZGVyLkRPTkUpIHtcclxuICAgICAgICB0aGlzLmltcG9ydFBob3RvRnJvbVNyYyhldnRSZWFkZXIudGFyZ2V0LnJlc3VsdCk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaW1wb3J0UGhvdG9Gcm9tVXJsKCkge1xyXG4gICAgY29uc3QgdXJsID0gcHJvbXB0KHRoaXMuZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ2xvYWRJbWFnZVVybCcpKTtcclxuICAgIGlmICh1cmwpIHtcclxuICAgICAgdGhpcy5pbXBvcnRQaG90b0Zyb21TcmModXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpe1xyXG4gICAgdGhpcy5jbG9zZURpYWxvZy5lbWl0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsb2FkaW5nXCIgKm5nSWY9XCJpc0xvYWRpbmcgJiYgbG9hZGluZ1RlbXBsYXRlXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cImVycm9yXCIgKm5nSWY9XCJoYXNFcnJvclwiPlxyXG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlcnJvclRlbXBsYXRlID8gZXJyb3JUZW1wbGF0ZSA6IGRlZmF1bHRFcnJvclwiPjwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gPG5nLXRlbXBsYXRlICNkZWZhdWx0TG9hZGluZz5cclxuICAgIDxwPnt7IGdldFRleHRUcmFuc2xhdGVkKCdsb2FkaW5nJykgfX08L3A+XHJcbjwvbmctdGVtcGxhdGU+IC0tPlxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRFcnJvcj5cclxuICA8cD57eyBlcnJvck1lc3NhZ2UgfX08L3A+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48ZGl2IGNsYXNzPVwidG9vbGJhclwiICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJ0b29sc1wiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImJydXNoXCI+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+dG9vbHM8L2k+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBidG5cIiBbY2xhc3Muc2VsZWN0ZWRdPVwiY3VycmVudFRvb2wgPT0gJ2JydXNoJ1wiIChjbGljayk9XCJzZWxlY3RUb29sKCdicnVzaCcpXCJcclxuICAgICAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3Rvb2xzLmJydXNoJylcIj48bWF0LWljb24+YnJ1c2g8L21hdC1pY29uPjwvaT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRyYXdpbmdTaXplTmFtZSBvZiBkcmF3aW5nU2l6ZXNOYW1lXCIgY2xhc3M9XCJzaXplIGJ0biBtci0xXCJcclxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZHJhd2luZ1NpemVzW2RyYXdpbmdTaXplTmFtZV0gKiAwLjggKyA4XCJcclxuICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRyYXdpbmdTaXplc1tkcmF3aW5nU2l6ZU5hbWVdICogMC44ICsgOFwiXHJcbiAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlclJhZGl1cy5weF09XCJkcmF3aW5nU2l6ZXNbZHJhd2luZ1NpemVOYW1lXSAqIDAuNCArIDRcIlxyXG4gICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJjdXJyZW50U2l6ZSA9PSBkcmF3aW5nU2l6ZU5hbWVcIiBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3NpemVzLicgKyBkcmF3aW5nU2l6ZU5hbWUpXCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RHJhd2luZ1NpemUoZHJhd2luZ1NpemVOYW1lKVwiPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29tbWFuZHNcIj5cclxuICAgICAgICA8aSBjbGFzcz1cInRpdGxlXCI+b3B0aW9uczwvaT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW50ZXJuYWxcIj5cclxuICAgICAgICAgIDxpIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgYnRuXCIgW2NsYXNzLmRpc2FibGVkXT1cIiFjYW5VbmRvXCIgKGNsaWNrKT1cInVuZG8oKVwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3VuZG8nKVwiPjxtYXQtaWNvbj51bmRvPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIFtjbGFzcy5kaXNhYmxlZF09XCIhY2FuUmVkb1wiIChjbGljayk9XCJyZWRvKClcIlxyXG4gICAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ3JlZG8nKVwiPjxtYXQtaWNvbj5yZWRvPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgICA8aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zIGJ0blwiIChjbGljayk9XCJjbGVhckNhbnZhcygpXCIgW3RpdGxlXT1cImdldFRvb2x0aXBUcmFuc2xhdGVkKCdjbGVhcicpXCI+PG1hdC1pY29uPmNsZWFyPC9tYXQtaWNvbj48L2k+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbG9yc1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwidGl0bGVcIj5jb2xvcnM8L2k+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImludGVybmFsXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb2xvck5hbWUgb2YgY29sb3JzTmFtZVwiIFtjbGFzcy5zZWxlY3RlZF09XCJjdXJyZW50Q29sb3IgPT0gY29sb3JOYW1lXCIgY2xhc3M9XCJjb2xvclwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJjb2xvck5hbWVcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvcnNbY29sb3JOYW1lXVwiXHJcbiAgICAgICAgICBbdGl0bGVdPVwiZ2V0VG9vbHRpcFRyYW5zbGF0ZWQoJ2NvbG9ycy4nICsgY29sb3JOYW1lKVwiIChjbGljayk9XCJzZWxlY3RDb2xvcihjb2xvck5hbWUpXCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwidGl0bGVcIj5hY3Rpb25zPC9pPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnRlcm5hbFwiPlxyXG4gICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIChjbGljayk9XCJzYXZlSW1hZ2UoKTsgJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiAqbmdJZj1cIiFpbkNvbmZpZ1wiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdzYXZlQnRuJykgfX08L2E+XHJcbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi13YXJuaW5nXCIgKm5nSWY9XCJzaG93Q2FuY2VsQnV0dG9uICYmICFpbkNvbmZpZ1wiIChjbGljayk9XCJkb0xvYWRPcmlnaW5hbCgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdjYW5jZWxCdG4nKSB9fTwvYT5cclxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiICpuZ0lmPVwic2hvd0NhbmNlbEJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPnt7XHJcbiAgICAgICAgICAgIGdldFRleHRUcmFuc2xhdGVkKCdjbG9zZURpYWxvZycpIH19PC9hPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuXHJcbiAgPCEtLSBBbnkgYWRkaXRpb25hbCB0b29sYmFyIGJ1dHRvbnMgdG8gYmUgcHJvamVjdGVkIGJ5IHRoZSBjb25zdW1pbmcgYXBwIC0tPlxyXG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IFtuZ1N0eWxlXT1cInsgYm9yZGVyOiBib3JkZXJDc3MgfVwiPlxyXG4gIDxjYW52YXMgW2lkXT1cImNvbXBvbmVudEd1aWRcIj48L2NhbnZhcz5cclxuPC9kaXY+Il19