@dropi/ui-components 1.0.12 → 1.0.13

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 (255) hide show
  1. package/README.md +55 -36
  2. package/dist/README.md +58 -38
  3. package/dist/components-source/accordion/accordion-item/accordion-item.component.d.ts +31 -0
  4. package/dist/components-source/accordion/accordion.component.d.ts +26 -0
  5. package/dist/components-source/alert/alert.component.d.ts +32 -0
  6. package/dist/components-source/alert-modal/alert-modal.component.d.ts +78 -0
  7. package/dist/components-source/alert-validation/alert-validation.component.d.ts +21 -0
  8. package/dist/components-source/badge/badge.component.d.ts +12 -0
  9. package/dist/components-source/beta-tag/beta-tag.component.d.ts +5 -0
  10. package/dist/components-source/breadcrumb/breadcrumb.component.d.ts +11 -0
  11. package/dist/components-source/card-product/card-product.component.d.ts +204 -0
  12. package/dist/components-source/card-section/card-section.component.d.ts +31 -0
  13. package/dist/components-source/checkbox-selection-list/checkbox-selection-list.component.d.ts +26 -0
  14. package/dist/components-source/city-selector/city-selector.component.d.ts +17 -0
  15. package/dist/components-source/color-picker/color-picker.component.d.ts +73 -0
  16. package/dist/components-source/confirm-dialog/confirm-dialog.component.d.ts +10 -0
  17. package/dist/components-source/country-flags/country-flags.component.d.ts +12 -0
  18. package/dist/components-source/date-picker/date-picker.component.d.ts +27 -0
  19. package/dist/components-source/date-picker-range/date-picker-range.component.d.ts +26 -0
  20. package/dist/components-source/dropi-avatars/dropi-avatars.component.d.ts +11 -0
  21. package/dist/components-source/dropi-badge/dropi-badge.component.d.ts +29 -0
  22. package/dist/components-source/dropi-banner-external/dropi-banner-external.component.d.ts +19 -0
  23. package/dist/components-source/dropi-breadcrumb/dropi-breadcrumb.component.d.ts +22 -0
  24. package/dist/components-source/dropi-card-checkbox/dropi-card-checkbox.component.d.ts +20 -0
  25. package/dist/components-source/dropi-carousel/dropi-carousel.component.d.ts +52 -0
  26. package/dist/components-source/dropi-checkbox/dropi-checkbox.component.d.ts +11 -0
  27. package/dist/components-source/dropi-chips/dropi-chips.component.d.ts +17 -0
  28. package/dist/components-source/dropi-country-selector/countries.data.d.ts +6 -0
  29. package/dist/components-source/dropi-country-selector/dropi-country-selector.component.d.ts +90 -0
  30. package/dist/components-source/dropi-drawer/dropi-drawer.component.d.ts +20 -0
  31. package/dist/components-source/dropi-dropdown/dropi-dropdown.component.d.ts +20 -0
  32. package/dist/components-source/dropi-favorite-button/dropi-favorite-button.component.d.ts +12 -0
  33. package/dist/components-source/dropi-file-upload/card-view/card-view.component.d.ts +19 -0
  34. package/dist/components-source/dropi-file-upload/drop-zone/drop-zone.component.d.ts +38 -0
  35. package/dist/components-source/dropi-file-upload/dropi-file-upload.component.d.ts +18 -0
  36. package/dist/components-source/dropi-file-upload/file-list/file-list.component.d.ts +39 -0
  37. package/dist/components-source/dropi-file-upload/grid-view/grid-view.component.d.ts +15 -0
  38. package/dist/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.d.ts +20 -0
  39. package/dist/components-source/dropi-image-overlay/dropi-image-overlay.component.d.ts +8 -0
  40. package/dist/components-source/dropi-languages-selector/dropi-languages-selector.component.d.ts +18 -0
  41. package/dist/components-source/dropi-logo/dropi-logo.component.d.ts +12 -0
  42. package/dist/components-source/dropi-modal/dropi-modal.component.d.ts +34 -0
  43. package/dist/components-source/dropi-modal/p-template.directive.d.ts +9 -0
  44. package/dist/components-source/dropi-navbar/dropi-navbar.component.d.ts +20 -0
  45. package/dist/components-source/dropi-paginator/dropi-paginator.component.d.ts +21 -0
  46. package/dist/components-source/dropi-phone-input/dropi-phone-input.component.d.ts +55 -0
  47. package/dist/components-source/dropi-radio-button/dropi-radio-button.component.d.ts +17 -0
  48. package/dist/components-source/dropi-search/dropi-search.component.d.ts +40 -0
  49. package/dist/components-source/dropi-select/dropi-select.component.d.ts +34 -0
  50. package/dist/components-source/dropi-skeleton/dropi-skeleton.component.d.ts +14 -0
  51. package/dist/components-source/dropi-steps/dropi-steps.component.d.ts +64 -0
  52. package/dist/components-source/dropi-switch/dropi-switch.component.d.ts +11 -0
  53. package/dist/components-source/dropi-table/dropi-table.component.d.ts +82 -0
  54. package/dist/components-source/dropi-tag/dropi-tag.component.d.ts +15 -0
  55. package/dist/components-source/dropi-text-area/dropi-text-area.component.d.ts +14 -0
  56. package/dist/components-source/dropi-tooltip/dropi-tooltip.component.d.ts +28 -0
  57. package/dist/components-source/dropi-youtube-lazy-video/dropi-youtube-lazy-video.component.d.ts +16 -0
  58. package/dist/components-source/empty/empty.component.d.ts +9 -0
  59. package/dist/components-source/empty-state/empty-state.component.d.ts +17 -0
  60. package/dist/components-source/file-upload-progress-bar/file-upload-progress-bar.component.d.ts +30 -0
  61. package/dist/components-source/index.d.ts +85 -0
  62. package/dist/components-source/input/input.component.d.ts +33 -0
  63. package/dist/components-source/lottie-loader/lottie-loader.component.d.ts +9 -0
  64. package/dist/components-source/otp-send-code/otp-send-code.component.d.ts +83 -0
  65. package/dist/components-source/radio-selection-list/radio-selection-list.component.d.ts +30 -0
  66. package/dist/components-source/read-more/read-more.component.d.ts +60 -0
  67. package/dist/components-source/sidebar/sidebar.component.d.ts +27 -0
  68. package/dist/components-source/simple-stepper/simple-stepper.component.d.ts +21 -0
  69. package/dist/components-source/spinner/spinner.component.d.ts +9 -0
  70. package/dist/components-source/tabs/tabs.component.d.ts +27 -0
  71. package/dist/components-source/tag-type-product/tag-type-product.component.d.ts +5 -0
  72. package/dist/components-source/toast/toast.component.d.ts +21 -0
  73. package/dist/components-source/toggle/input-toggle.component.d.ts +11 -0
  74. package/dist/components-source/tooltip/tooltip.component.d.ts +15 -0
  75. package/dist/components-source/vertical-steps/vertical-steps.component.d.ts +27 -0
  76. package/dist/esm2022/components-source/accordion/accordion-item/accordion-item.component.mjs +51 -0
  77. package/dist/esm2022/components-source/accordion/accordion.component.mjs +46 -0
  78. package/dist/esm2022/components-source/alert/alert.component.mjs +114 -0
  79. package/dist/esm2022/components-source/alert-modal/alert-modal.component.mjs +247 -0
  80. package/dist/esm2022/components-source/alert-validation/alert-validation.component.mjs +53 -0
  81. package/dist/esm2022/components-source/badge/badge.component.mjs +23 -0
  82. package/dist/esm2022/components-source/beta-tag/beta-tag.component.mjs +11 -0
  83. package/dist/esm2022/components-source/breadcrumb/breadcrumb.component.mjs +26 -0
  84. package/dist/esm2022/components-source/card-product/card-product.component.mjs +534 -0
  85. package/dist/esm2022/components-source/card-section/card-section.component.mjs +91 -0
  86. package/dist/esm2022/components-source/checkbox-selection-list/checkbox-selection-list.component.mjs +79 -0
  87. package/dist/esm2022/components-source/city-selector/city-selector.component.mjs +53 -0
  88. package/dist/esm2022/components-source/color-picker/color-picker.component.mjs +320 -0
  89. package/dist/esm2022/components-source/confirm-dialog/confirm-dialog.component.mjs +27 -0
  90. package/dist/esm2022/components-source/country-flags/country-flags.component.mjs +27 -0
  91. package/dist/esm2022/components-source/date-picker/date-picker.component.mjs +73 -0
  92. package/dist/esm2022/components-source/date-picker-range/date-picker-range.component.mjs +67 -0
  93. package/dist/esm2022/components-source/dropi-avatars/dropi-avatars.component.mjs +31 -0
  94. package/dist/esm2022/components-source/dropi-badge/dropi-badge.component.mjs +45 -0
  95. package/dist/esm2022/components-source/dropi-banner-external/dropi-banner-external.component.mjs +39 -0
  96. package/dist/esm2022/components-source/dropi-breadcrumb/dropi-breadcrumb.component.mjs +45 -0
  97. package/dist/esm2022/components-source/dropi-card-checkbox/dropi-card-checkbox.component.mjs +53 -0
  98. package/dist/esm2022/components-source/dropi-carousel/dropi-carousel.component.mjs +243 -0
  99. package/dist/esm2022/components-source/dropi-checkbox/dropi-checkbox.component.mjs +31 -0
  100. package/dist/esm2022/components-source/dropi-chips/dropi-chips.component.mjs +38 -0
  101. package/dist/esm2022/components-source/dropi-country-selector/countries.data.mjs +254 -0
  102. package/dist/esm2022/components-source/dropi-country-selector/dropi-country-selector.component.mjs +183 -0
  103. package/dist/esm2022/components-source/dropi-drawer/dropi-drawer.component.mjs +69 -0
  104. package/dist/esm2022/components-source/dropi-dropdown/dropi-dropdown.component.mjs +59 -0
  105. package/dist/esm2022/components-source/dropi-favorite-button/dropi-favorite-button.component.mjs +33 -0
  106. package/dist/esm2022/components-source/dropi-file-upload/card-view/card-view.component.mjs +47 -0
  107. package/dist/esm2022/components-source/dropi-file-upload/drop-zone/drop-zone.component.mjs +115 -0
  108. package/dist/esm2022/components-source/dropi-file-upload/dropi-file-upload.component.mjs +66 -0
  109. package/dist/esm2022/components-source/dropi-file-upload/file-list/file-list.component.mjs +95 -0
  110. package/dist/esm2022/components-source/dropi-file-upload/grid-view/grid-view.component.mjs +37 -0
  111. package/dist/esm2022/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.mjs +59 -0
  112. package/dist/esm2022/components-source/dropi-image-overlay/dropi-image-overlay.component.mjs +31 -0
  113. package/dist/esm2022/components-source/dropi-languages-selector/dropi-languages-selector.component.mjs +38 -0
  114. package/dist/esm2022/components-source/dropi-logo/dropi-logo.component.mjs +27 -0
  115. package/dist/esm2022/components-source/dropi-modal/dropi-modal.component.mjs +92 -0
  116. package/dist/esm2022/components-source/dropi-modal/p-template.directive.mjs +22 -0
  117. package/dist/esm2022/components-source/dropi-navbar/dropi-navbar.component.mjs +51 -0
  118. package/dist/esm2022/components-source/dropi-paginator/dropi-paginator.component.mjs +89 -0
  119. package/dist/esm2022/components-source/dropi-phone-input/dropi-phone-input.component.mjs +155 -0
  120. package/dist/esm2022/components-source/dropi-radio-button/dropi-radio-button.component.mjs +48 -0
  121. package/dist/esm2022/components-source/dropi-search/dropi-search.component.mjs +104 -0
  122. package/dist/esm2022/components-source/dropi-select/dropi-select.component.mjs +96 -0
  123. package/dist/esm2022/components-source/dropi-skeleton/dropi-skeleton.component.mjs +39 -0
  124. package/dist/esm2022/components-source/dropi-steps/dropi-steps.component.mjs +97 -0
  125. package/dist/esm2022/components-source/dropi-switch/dropi-switch.component.mjs +22 -0
  126. package/dist/esm2022/components-source/dropi-table/dropi-table.component.mjs +333 -0
  127. package/dist/esm2022/components-source/dropi-tag/dropi-tag.component.mjs +36 -0
  128. package/dist/esm2022/components-source/dropi-text-area/dropi-text-area.component.mjs +53 -0
  129. package/dist/esm2022/components-source/dropi-tooltip/dropi-tooltip.component.mjs +78 -0
  130. package/dist/esm2022/components-source/dropi-youtube-lazy-video/dropi-youtube-lazy-video.component.mjs +46 -0
  131. package/dist/esm2022/components-source/empty/empty.component.mjs +18 -0
  132. package/dist/esm2022/components-source/empty-state/empty-state.component.mjs +62 -0
  133. package/dist/esm2022/components-source/file-upload-progress-bar/file-upload-progress-bar.component.mjs +91 -0
  134. package/dist/esm2022/components-source/index.mjs +107 -0
  135. package/dist/esm2022/components-source/input/input.component.mjs +104 -0
  136. package/dist/esm2022/components-source/lottie-loader/lottie-loader.component.mjs +25 -0
  137. package/dist/esm2022/components-source/otp-send-code/otp-send-code.component.mjs +201 -0
  138. package/dist/esm2022/components-source/radio-selection-list/radio-selection-list.component.mjs +89 -0
  139. package/dist/esm2022/components-source/read-more/read-more.component.mjs +91 -0
  140. package/dist/esm2022/components-source/sidebar/sidebar.component.mjs +88 -0
  141. package/dist/esm2022/components-source/simple-stepper/simple-stepper.component.mjs +60 -0
  142. package/dist/esm2022/components-source/spinner/spinner.component.mjs +19 -0
  143. package/dist/esm2022/components-source/tabs/tabs.component.mjs +83 -0
  144. package/dist/esm2022/components-source/tag-type-product/tag-type-product.component.mjs +11 -0
  145. package/dist/esm2022/components-source/toast/toast.component.mjs +47 -0
  146. package/dist/esm2022/components-source/toggle/input-toggle.component.mjs +36 -0
  147. package/dist/esm2022/components-source/tooltip/tooltip.component.mjs +34 -0
  148. package/dist/esm2022/components-source/vertical-steps/vertical-steps.component.mjs +75 -0
  149. package/dist/esm2022/lib/elements-registry.mjs +343 -2
  150. package/dist/esm2022/utilities/interfaces/ui/dropi-table.interface.mjs +2 -0
  151. package/dist/esm2022/utilities/interfaces/ui/input-interface.mjs +2 -0
  152. package/dist/esm2022/utilities/interfaces/ui/select-interface.mjs +2 -0
  153. package/dist/esm2022/utilities/interfaces/ui/selection-list-interface.mjs +2 -0
  154. package/dist/esm2022/utilities/interfaces/ui/upload.model.mjs +5 -0
  155. package/dist/fesm2022/dropi-ui-components.mjs +5913 -2
  156. package/dist/fesm2022/dropi-ui-components.mjs.map +1 -1
  157. package/dist/utilities/interfaces/ui/dropi-table.interface.d.ts +45 -0
  158. package/dist/utilities/interfaces/ui/input-interface.d.ts +33 -0
  159. package/dist/utilities/interfaces/ui/select-interface.d.ts +8 -0
  160. package/dist/utilities/interfaces/ui/selection-list-interface.d.ts +24 -0
  161. package/dist/utilities/interfaces/ui/upload.model.d.ts +30 -0
  162. package/package.json +18 -6
  163. package/src/components-source/alert/alert.component.ts +12 -129
  164. package/src/components-source/alert-modal/alert-modal.component.ts +84 -114
  165. package/src/components-source/alert-validation/alert-validation.component.html +8 -0
  166. package/src/components-source/alert-validation/alert-validation.component.scss +225 -0
  167. package/src/components-source/alert-validation/alert-validation.component.ts +43 -0
  168. package/src/components-source/beta-tag/beta-tag.component.html +1 -0
  169. package/src/components-source/beta-tag/beta-tag.component.scss +26 -0
  170. package/src/components-source/beta-tag/beta-tag.component.ts +11 -0
  171. package/src/components-source/breadcrumb/breadcrumb.component.html +13 -5
  172. package/src/components-source/breadcrumb/breadcrumb.component.scss +8 -1
  173. package/src/components-source/breadcrumb/breadcrumb.component.spec.ts +26 -26
  174. package/src/components-source/breadcrumb/breadcrumb.component.ts +10 -12
  175. package/src/components-source/card-product/card-product.component.spec.ts +9 -9
  176. package/src/components-source/card-product/card-product.component.stories.ts +2 -2
  177. package/src/components-source/card-product/card-product.component.ts +294 -818
  178. package/src/components-source/card-section/card-section.component.html +7 -7
  179. package/src/components-source/card-section/card-section.component.ts +41 -15
  180. package/src/components-source/checkbox-selection-list/checkbox-selection-list.component.ts +42 -179
  181. package/src/components-source/city-selector/city-selector.component.ts +37 -137
  182. package/src/components-source/confirm-dialog/confirm-dialog.component.html +26 -0
  183. package/src/components-source/confirm-dialog/confirm-dialog.component.scss +55 -0
  184. package/src/components-source/confirm-dialog/confirm-dialog.component.ts +22 -0
  185. package/src/components-source/country-flags/country-flags.component.ts +20 -12
  186. package/src/components-source/date-picker/date-picker.component.ts +32 -292
  187. package/src/components-source/date-picker-range/date-picker-range.component.html +15 -7
  188. package/src/components-source/date-picker-range/date-picker-range.component.ts +42 -235
  189. package/src/components-source/dropi-banner-external/dropi-banner-external.component.ts +24 -185
  190. package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.html +21 -21
  191. package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.spec.ts +9 -9
  192. package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.ts +41 -23
  193. package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.stories.ts +12 -12
  194. package/src/components-source/dropi-chips/dropi-chips.component.ts +22 -87
  195. package/src/components-source/dropi-country-selector/countries.data.ts +256 -236
  196. package/src/components-source/dropi-country-selector/dropi-country-selector.component.ts +37 -25
  197. package/src/components-source/dropi-drawer/dropi-drawer.component.ts +91 -78
  198. package/src/components-source/dropi-dropdown/dropi-dropdown.component.ts +44 -47
  199. package/src/components-source/dropi-file-upload/card-view/card-view.component.ts +33 -53
  200. package/src/components-source/dropi-file-upload/drop-zone/drop-zone.component.ts +52 -123
  201. package/src/components-source/dropi-file-upload/dropi-file-upload.component.ts +38 -294
  202. package/src/components-source/dropi-file-upload/file-list/file-list.component.ts +62 -43
  203. package/src/components-source/dropi-file-upload/grid-view/grid-view.component.ts +23 -22
  204. package/src/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.scss +6 -2
  205. package/src/components-source/dropi-image-overlay/dropi-image-overlay.component.ts +16 -71
  206. package/src/components-source/dropi-modal/dropi-modal.component.ts +56 -372
  207. package/src/components-source/dropi-navbar/dropi-navbar.component.ts +17 -17
  208. package/src/components-source/dropi-paginator/dropi-paginator.component.html +18 -7
  209. package/src/components-source/dropi-paginator/dropi-paginator.component.ts +40 -32
  210. package/src/components-source/dropi-phone-input/dropi-phone-input.component.html +78 -79
  211. package/src/components-source/dropi-phone-input/dropi-phone-input.component.ts +29 -85
  212. package/src/components-source/dropi-search/dropi-search.component.ts +59 -222
  213. package/src/components-source/dropi-select/dropi-select.component.html +82 -131
  214. package/src/components-source/dropi-select/dropi-select.component.ts +60 -423
  215. package/src/components-source/dropi-table/dropi-table.component.html +40 -23
  216. package/src/components-source/dropi-table/dropi-table.component.ts +130 -374
  217. package/src/components-source/dropi-tag/dropi-tag.component.ts +20 -90
  218. package/src/components-source/dropi-text-area/dropi-text-area.component.ts +22 -48
  219. package/src/components-source/dropi-tooltip/dropi-tooltip.component.ts +40 -129
  220. package/src/components-source/empty/empty.component.html +3 -0
  221. package/src/components-source/empty/empty.component.scss +0 -0
  222. package/src/components-source/empty/empty.component.ts +16 -0
  223. package/src/components-source/empty-state/empty-state.component.ts +47 -19
  224. package/src/components-source/index.ts +82 -37
  225. package/src/components-source/input/input.component.html +79 -63
  226. package/src/components-source/input/input.component.ts +51 -97
  227. package/src/components-source/lottie-loader/lottie-loader.component.ts +13 -16
  228. package/src/components-source/otp-send-code/otp-send-code.component.ts +60 -528
  229. package/src/components-source/radio-selection-list/radio-selection-list.component.ts +36 -97
  230. package/src/components-source/sidebar/sidebar.component.spec.ts +11 -11
  231. package/src/components-source/sidebar/sidebar.component.stories.ts +3 -3
  232. package/src/components-source/sidebar/sidebar.component.ts +51 -47
  233. package/src/components-source/simple-stepper/simple-stepper.component.ts +20 -35
  234. package/src/components-source/spinner/spinner.component.html +6 -0
  235. package/src/components-source/spinner/spinner.component.scss +15 -0
  236. package/src/components-source/spinner/spinner.component.ts +17 -0
  237. package/src/components-source/tabs/tabs.component.spec.ts +8 -8
  238. package/src/components-source/tabs/tabs.component.stories.ts +5 -5
  239. package/src/components-source/tabs/tabs.component.ts +41 -83
  240. package/src/components-source/toast/toast.component.ts +40 -46
  241. package/src/components-source/toggle/input-toggle.component.html +34 -0
  242. package/src/components-source/toggle/input-toggle.component.scss +0 -0
  243. package/src/components-source/toggle/input-toggle.component.ts +27 -0
  244. package/src/components-source/toggle/inputToggleConfig.ts +11 -0
  245. package/src/components-source/tooltip/tooltip.component.html +22 -11
  246. package/src/components-source/tooltip/tooltip.component.ts +28 -13
  247. package/src/components-source/vertical-steps/vertical-steps.component.ts +16 -78
  248. package/src/lib/elements-registry.ts +413 -1
  249. package/src/lib/router-stub.ts +7 -0
  250. package/src/libreria work space.code-workspace +11 -8
  251. package/src/utilities/interfaces/ui/dropi-table.interface.ts +60 -0
  252. package/src/utilities/interfaces/ui/input-interface.ts +34 -0
  253. package/src/utilities/interfaces/ui/select-interface.ts +8 -0
  254. package/src/utilities/interfaces/ui/selection-list-interface.ts +15 -0
  255. package/src/utilities/interfaces/ui/upload.model.ts +41 -0
@@ -0,0 +1,534 @@
1
+ import { Component, Input, Output, EventEmitter, HostListener, Inject, Pipe, CUSTOM_ELEMENTS_SCHEMA, } from "@angular/core";
2
+ import { CommonModule, TitleCasePipe } from "@angular/common";
3
+ import { IconComponent } from "../icon/icon.component";
4
+ import { DropiTagComponent } from "../dropi-tag/dropi-tag.component";
5
+ // import { Howl } from "howler"; // Eliminado para evitar errores de dependencia
6
+ import { DropiIlustrationIconComponent } from "../dropi-ilustration-icon/dropi-ilustration-icon.component";
7
+ import { TranslateModule } from "@ngx-translate/core";
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@ngx-translate/core";
11
+ export class AdjustNamePipeStub {
12
+ transform(value) {
13
+ return value;
14
+ }
15
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
16
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, isStandalone: true, name: "adjustName" });
17
+ }
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, decorators: [{
19
+ type: Pipe,
20
+ args: [{
21
+ name: "adjustName",
22
+ standalone: true,
23
+ }]
24
+ }] });
25
+ export class CurrencyComponentStub {
26
+ value;
27
+ class;
28
+ style;
29
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CurrencyComponentStub, deps: [], target: i0.ɵɵFactoryTarget.Component });
30
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CurrencyComponentStub, isStandalone: true, selector: "currency", inputs: { value: "value", class: "class", style: "style" }, ngImport: i0, template: "{{value}}", isInline: true });
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CurrencyComponentStub, decorators: [{
33
+ type: Component,
34
+ args: [{
35
+ selector: "currency",
36
+ standalone: true,
37
+ template: "{{value}}",
38
+ }]
39
+ }], propDecorators: { value: [{
40
+ type: Input
41
+ }], class: [{
42
+ type: Input
43
+ }], style: [{
44
+ type: Input
45
+ }] } });
46
+ export class BetaTagComponentStub {
47
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BetaTagComponentStub, deps: [], target: i0.ɵɵFactoryTarget.Component });
48
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BetaTagComponentStub, isStandalone: true, selector: "app-beta-tag", ngImport: i0, template: "", isInline: true });
49
+ }
50
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BetaTagComponentStub, decorators: [{
51
+ type: Component,
52
+ args: [{
53
+ selector: "app-beta-tag",
54
+ standalone: true,
55
+ template: "",
56
+ }]
57
+ }] });
58
+ export class CardProductComponent {
59
+ settingService;
60
+ favoriteService;
61
+ orderManual;
62
+ router;
63
+ product;
64
+ state = "default";
65
+ aS = true;
66
+ bettaTester = false;
67
+ onAddToCart = new EventEmitter();
68
+ onProductClick = new EventEmitter();
69
+ changeFavorite = new EventEmitter();
70
+ imageError = false;
71
+ brandName = "";
72
+ onFavoriteHover = false;
73
+ randomClasses = {
74
+ card: "",
75
+ imageContainer: "",
76
+ image: "",
77
+ tags: "",
78
+ tagsRow: "",
79
+ favoriteButton: "",
80
+ productInfo: "",
81
+ productHeader: "",
82
+ category: "",
83
+ stockInfo: "",
84
+ stockLabel: "",
85
+ stockValue: "",
86
+ productName: "",
87
+ supplierInfo: "",
88
+ supplierLabel: "",
89
+ supplierName: "",
90
+ priceContainer: "",
91
+ priceItem: "",
92
+ priceLabel: "",
93
+ priceValue: "",
94
+ separator: "",
95
+ actionButton: "",
96
+ buttonText: "",
97
+ };
98
+ mixedData = {
99
+ stockDivs: [],
100
+ supplierPriceDivs: [],
101
+ suggestedPriceDivs: [],
102
+ };
103
+ fakeStyles = {
104
+ stock: "",
105
+ price: "",
106
+ };
107
+ isMobile = false;
108
+ constructor(settingService, favoriteService, orderManual, router) {
109
+ this.settingService = settingService;
110
+ this.favoriteService = favoriteService;
111
+ this.orderManual = orderManual;
112
+ this.router = router;
113
+ }
114
+ ngOnInit() {
115
+ this.brandName =
116
+ this.settingService?.getBrandInfo()?.name?.toLowerCase() || "dropi";
117
+ this.generateRandomClasses();
118
+ this.generateFakeStyles();
119
+ this.generateMixedData();
120
+ this.checkScreenSize();
121
+ }
122
+ ngOnChanges(changes) {
123
+ if (changes["product"] || changes["aS"]) {
124
+ this.generateMixedData();
125
+ }
126
+ }
127
+ onResize(event) {
128
+ this.checkScreenSize();
129
+ }
130
+ checkScreenSize() {
131
+ this.isMobile = window.innerWidth <= 420;
132
+ }
133
+ generateRandomClasses() {
134
+ this.randomClasses = {
135
+ card: this.generateRandomClass("dropi-card-product"),
136
+ imageContainer: this.generateRandomClass("product-image-container"),
137
+ image: this.generateRandomClass("product-image"),
138
+ tags: this.generateRandomClass("product-tags"),
139
+ tagsRow: this.generateRandomClass("tags-row"),
140
+ favoriteButton: this.generateRandomClass("favorite-button"),
141
+ productInfo: this.generateRandomClass("product-info"),
142
+ productHeader: this.generateRandomClass("product-header"),
143
+ category: this.generateRandomClass("category"),
144
+ stockInfo: this.generateRandomClass("stock-info"),
145
+ stockLabel: this.generateRandomClass("stock-label"),
146
+ stockValue: this.generateRandomClass("stock-value"),
147
+ productName: this.generateRandomClass("product-name"),
148
+ supplierInfo: this.generateRandomClass("supplier-info"),
149
+ supplierLabel: this.generateRandomClass("supplier-label"),
150
+ supplierName: this.generateRandomClass("supplier-name"),
151
+ priceContainer: this.generateRandomClass("price-container"),
152
+ priceItem: this.generateRandomClass("price-item"),
153
+ priceLabel: this.generateRandomClass("price-label"),
154
+ priceValue: this.generateRandomClass("price-value"),
155
+ separator: this.generateRandomClass("separator"),
156
+ actionButton: this.generateRandomClass("action-button"),
157
+ buttonText: this.generateRandomClass("button-text"),
158
+ };
159
+ }
160
+ generateMixedData() {
161
+ this.mixedData.stockDivs = this.generateMixedStockDivs();
162
+ this.mixedData.supplierPriceDivs = this.getMixedSupplierPriceDivs();
163
+ this.mixedData.suggestedPriceDivs = this.getMixedSuggestedPriceDivs();
164
+ }
165
+ generateFakeStyles() {
166
+ this.fakeStyles.stock = this.generateFakeStyleVariant();
167
+ this.fakeStyles.price = this.generateFakeStyleVariant();
168
+ }
169
+ get imageUrl() {
170
+ if (this.product && this.product.image) {
171
+ return `https://img.dropi.co/${this.product.image}`;
172
+ }
173
+ if (this.product && this.product.imageUrl) {
174
+ return this.product.imageUrl;
175
+ }
176
+ return undefined;
177
+ }
178
+ onError(event) {
179
+ this.imageError = true;
180
+ event.target.src = "./assets/utils/no-image.jpg";
181
+ }
182
+ get productTags() {
183
+ const tags = [];
184
+ if (this.product?.type?.includes("variable")) {
185
+ tags.push({
186
+ text: "Variable",
187
+ type: "primary",
188
+ state: "default",
189
+ });
190
+ }
191
+ if (this.product?.type?.includes("privado")) {
192
+ tags.push({
193
+ text: "Privado",
194
+ type: "primary",
195
+ state: "warning",
196
+ showIcon: true,
197
+ icon: "Lock",
198
+ });
199
+ }
200
+ if (this.product?.type?.includes("combo")) {
201
+ tags.push({
202
+ text: "Combo",
203
+ type: "primary",
204
+ state: "info",
205
+ });
206
+ }
207
+ return tags;
208
+ }
209
+ getProductStock() {
210
+ if (this.product?.type === "VARIABLE" && this.product?.is_variation) {
211
+ return this.product?.variation_stock || 0;
212
+ }
213
+ return this.product?.stock_simple || 0;
214
+ }
215
+ get stockStatus() {
216
+ const stock = this.getProductStock();
217
+ if (stock === 0)
218
+ return "error";
219
+ if (stock <= 10)
220
+ return "warning";
221
+ return "success";
222
+ }
223
+ get stockStatusClass() {
224
+ switch (this.stockStatus) {
225
+ case "success":
226
+ return "stock-success";
227
+ case "warning":
228
+ return "stock-warning";
229
+ case "error":
230
+ return "stock-error";
231
+ default:
232
+ return "stock-success";
233
+ }
234
+ }
235
+ handleAddToCart() {
236
+ const stock = this.getProductStock();
237
+ if (stock > 0) {
238
+ this.onAddToCart.emit(this.product);
239
+ if (this.orderManual) {
240
+ this.orderManual.setModalOpen(true);
241
+ this.orderManual.clearProductsIds();
242
+ this.orderManual.setProductsIds(Number(this.product.id));
243
+ }
244
+ }
245
+ }
246
+ handleFavoriteToggle() {
247
+ if (!this.product || !this.product.id)
248
+ return;
249
+ let body = { product_id: this.product.id };
250
+ if (!this.product.favorite) {
251
+ this.favoriteService?.addFavoriteProduct(body).subscribe({
252
+ next: (response) => {
253
+ if (response?.is_successful) {
254
+ this.product.favorite = true;
255
+ this.playAudio();
256
+ this.changeFavorite.emit(true);
257
+ }
258
+ },
259
+ });
260
+ }
261
+ else {
262
+ this.favoriteService?.removeFavoriteProduct(body).subscribe({
263
+ next: (response) => {
264
+ if (response?.is_successful) {
265
+ this.product.favorite = false;
266
+ this.playAudio();
267
+ this.changeFavorite.emit(false);
268
+ }
269
+ },
270
+ });
271
+ }
272
+ }
273
+ getFavoriteIconColor() {
274
+ if (this.product?.favorite) {
275
+ return "#fff";
276
+ }
277
+ return this.onFavoriteHover ? "#f49a3d" : "#858ea6";
278
+ }
279
+ playAudio() {
280
+ // try {
281
+ // let sound = new Howl({
282
+ // src: ["assets/audio/pop.mp3"],
283
+ // });
284
+ // sound.volume(0.4);
285
+ // sound.play();
286
+ // } catch (e) {}
287
+ }
288
+ getProductDetails() {
289
+ let nameProductUrl = this.product.name || "producto";
290
+ const url = `/dashboard/product-details/${this.product.id}/${nameProductUrl}`;
291
+ window.open(url, "_blank");
292
+ }
293
+ getProvidersDetails() {
294
+ const cleanName = this.product?.supplier?.name || "proveedor";
295
+ if (this.router?.url === "/dashboard/search") {
296
+ const url = `/dashboard/provider/${this.product.supplier.id}/${cleanName}`;
297
+ window.open(url, "_blank");
298
+ }
299
+ else {
300
+ this.router?.navigate?.([
301
+ "/dashboard/provider",
302
+ this.product.supplier.id,
303
+ cleanName,
304
+ ]);
305
+ }
306
+ }
307
+ getMixedSupplierPriceDivs() {
308
+ return [
309
+ {
310
+ value: this.product?.supplierPrice || this.product?.sale_price || 0,
311
+ class: "price-real",
312
+ isReal: true,
313
+ },
314
+ ];
315
+ }
316
+ getMixedSuggestedPriceDivs() {
317
+ return [
318
+ {
319
+ value: this.product?.suggestedPrice || this.product?.suggested_price || 0,
320
+ class: "price-real",
321
+ isReal: true,
322
+ },
323
+ ];
324
+ }
325
+ hasStock() {
326
+ return this.getProductStock() > 0;
327
+ }
328
+ // Helper fakes for anti-scraping
329
+ generateRandomClass(base) {
330
+ return base + "-" + Math.random().toString(36).slice(2, 7);
331
+ }
332
+ generateFakeStyleVariant() {
333
+ return "";
334
+ }
335
+ generateMixedStockDivs() {
336
+ return [
337
+ { value: this.getProductStock(), class: "stock-real", isReal: true },
338
+ ];
339
+ }
340
+ // Re-added missing template methods
341
+ getCardStyles() {
342
+ return {};
343
+ }
344
+ getRandomProviderCategoryStyles() {
345
+ return {};
346
+ }
347
+ getImageContainerStyles() {
348
+ return {};
349
+ }
350
+ getImageStyles() {
351
+ return {};
352
+ }
353
+ getTagsContainerStyles() {
354
+ return {};
355
+ }
356
+ getTagsRowStyles() {
357
+ return {};
358
+ }
359
+ getFavoriteButtonStyles() {
360
+ return {};
361
+ }
362
+ getProductInfoStyles() {
363
+ return {};
364
+ }
365
+ getProductHeaderStyles() {
366
+ return {};
367
+ }
368
+ getCategoryStyles() {
369
+ return {};
370
+ }
371
+ getStockInfoStyles() {
372
+ return {};
373
+ }
374
+ getStockLabelStyles() {
375
+ return {};
376
+ }
377
+ getStockValueStyles() {
378
+ return {};
379
+ }
380
+ getProductNameStyles() {
381
+ return {};
382
+ }
383
+ getSupplierInfoStyles() {
384
+ return {};
385
+ }
386
+ getSupplierLabelStyles() {
387
+ return {};
388
+ }
389
+ getSupplierNameStyles() {
390
+ return {};
391
+ }
392
+ getPriceContainerStyles() {
393
+ return {};
394
+ }
395
+ getPriceItemStyles() {
396
+ return {};
397
+ }
398
+ getPriceLabelStyles() {
399
+ return {};
400
+ }
401
+ getPriceValueStyles() {
402
+ return {};
403
+ }
404
+ getSeparatorStyles() {
405
+ return {};
406
+ }
407
+ getActionButtonStyles() {
408
+ return {};
409
+ }
410
+ getButtonTextStyles() {
411
+ return {};
412
+ }
413
+ getFakeStockStyles() {
414
+ return {};
415
+ }
416
+ getFakePriceStyles() {
417
+ return {};
418
+ }
419
+ getRandomCardClass() {
420
+ return this.randomClasses.card;
421
+ }
422
+ getRandomImageContainerClass() {
423
+ return this.randomClasses.imageContainer;
424
+ }
425
+ getRandomImageClass() {
426
+ return this.randomClasses.image;
427
+ }
428
+ getRandomTagsClass() {
429
+ return this.randomClasses.tags;
430
+ }
431
+ getRandomTagsRowClass() {
432
+ return this.randomClasses.tagsRow;
433
+ }
434
+ getRandomFavoriteButtonClass() {
435
+ return this.randomClasses.favoriteButton;
436
+ }
437
+ getRandomProductInfoClass() {
438
+ return this.randomClasses.productInfo;
439
+ }
440
+ getRandomProductHeaderClass() {
441
+ return this.randomClasses.productHeader;
442
+ }
443
+ getRandomCategoryClass() {
444
+ return this.randomClasses.category;
445
+ }
446
+ getRandomStockInfoClass() {
447
+ return this.randomClasses.stockInfo;
448
+ }
449
+ getRandomStockLabelClass() {
450
+ return this.randomClasses.stockLabel;
451
+ }
452
+ getRandomProductNameClass() {
453
+ return this.randomClasses.productName;
454
+ }
455
+ getRandomSupplierInfoClass() {
456
+ return this.randomClasses.supplierInfo;
457
+ }
458
+ getRandomSupplierLabelClass() {
459
+ return this.randomClasses.supplierLabel;
460
+ }
461
+ getRandomSupplierNameClass() {
462
+ return this.randomClasses.supplierName;
463
+ }
464
+ getRandomPriceContainerClass() {
465
+ return this.randomClasses.priceContainer;
466
+ }
467
+ getRandomPriceItemClass() {
468
+ return this.randomClasses.priceItem;
469
+ }
470
+ getRandomPriceLabelClass() {
471
+ return this.randomClasses.priceLabel;
472
+ }
473
+ getRandomPriceValueClass() {
474
+ return this.randomClasses.priceValue;
475
+ }
476
+ getRandomSeparatorClass() {
477
+ return this.randomClasses.separator;
478
+ }
479
+ getRandomActionButtonClass() {
480
+ return this.randomClasses.actionButton;
481
+ }
482
+ getRandomButtonTextClass() {
483
+ return this.randomClasses.buttonText;
484
+ }
485
+ getMixedStockDivs() {
486
+ return this.generateMixedStockDivs();
487
+ }
488
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardProductComponent, deps: [{ token: "SettingsService" }, { token: "ProductstService" }, { token: "OrderManualService" }, { token: "Router" }], target: i0.ɵɵFactoryTarget.Component });
489
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CardProductComponent, isStandalone: true, selector: "dropi-card-product", inputs: { product: "product", state: "state", aS: "aS", bettaTester: "bettaTester" }, outputs: { onAddToCart: "onAddToCart", onProductClick: "onProductClick", changeFavorite: "changeFavorite" }, host: { listeners: { "window:resize": "onResize($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div [class]=\"getRandomCardClass()\" [style]=\"getCardStyles()\" (click)=\"getProductDetails()\">\n <app-beta-tag *ngIf=\"bettaTester\"></app-beta-tag>\n <!-- Contenedor de imagen con altura fija de 214px como en Figma -->\n <div [class]=\"getRandomImageContainerClass()\" [style]=\"getImageContainerStyles()\">\n <div [class]=\"getRandomImageClass()\" [style]=\"getImageStyles()\">\n <!-- Imagen del producto con manejo de errores -->\n <img\n [src]=\"imageUrl\"\n [alt]=\"product?.name || 'Product Image'\"\n (error)=\"onError($event)\"\n [ngClass]=\"{ 'error-img': imageError }\"\n style=\"width: 100%; height: 100%; object-fit: cover; border-radius: 8px\"\n />\n\n <!-- Tags superpuestos en la esquina superior izquierda -->\n <div\n [class]=\"getRandomTagsClass()\"\n [style]=\"getTagsContainerStyles()\"\n *ngIf=\"productTags?.length > 0\"\n >\n <div [class]=\"getRandomTagsRowClass()\" [style]=\"getTagsRowStyles()\">\n <app-dropi-tag\n *ngFor=\"let tag of productTags.slice(0, 2)\"\n [type]=\"tag?.type\"\n [state]=\"tag?.state\"\n [showIcon]=\"tag?.showIcon\"\n [icon]=\"tag?.icon\"\n [text]=\"tag?.text\"\n >\n </app-dropi-tag>\n </div>\n </div>\n\n <!-- Bot\u00F3n de favorito superpuesto en la esquina inferior derecha -->\n <div\n [class]=\"getRandomFavoriteButtonClass()\"\n [ngClass]=\"{ 'favorite-button': true, 'favorite-active': product?.favorite }\"\n [style]=\"getFavoriteButtonStyles()\"\n (click)=\"handleFavoriteToggle(); $event.stopPropagation()\"\n >\n <app-icon\n [name]=\"product?.favorite ? 'Heart-solid' : 'Heart'\"\n width=\"18px\"\n height=\"18px\"\n [color]=\"product?.favorite ? '#fff' : '#858ea6'\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n >\n </app-icon>\n </div>\n </div>\n </div>\n\n <!-- Informaci\u00F3n del producto -->\n <div [class]=\"getRandomProductInfoClass()\" [style]=\"getProductInfoStyles()\">\n <!-- Header con categor\u00EDa y stock -->\n <div [class]=\"getRandomProductHeaderClass()\" [style]=\"getProductHeaderStyles()\">\n <dropi-ilustration-icon\n *ngIf=\"product?.supplier?.icon\"\n [style]=\"getRandomProviderCategoryStyles()\"\n [type]=\"'insignia'\"\n [stateInsignia]=\"product?.supplier?.icon\"\n [tagProduct]=\"true\"\n ></dropi-ilustration-icon>\n\n <span\n [class]=\"getRandomCategoryClass()\"\n [style]=\"getCategoryStyles()\"\n *ngIf=\"product?.categories && product?.categories.length > 0\"\n >{{ product?.categories[0]?.name | adjustName }}</span\n >\n\n <div [class]=\"getRandomStockInfoClass()\" [style]=\"getStockInfoStyles()\">\n <span [class]=\"getRandomStockLabelClass()\" [style]=\"getStockLabelStyles()\">{{ \"stock\" | translate }}:</span>\n\n <!-- Stocks mezclados aleatoriamente (real + falsos) -->\n <span\n *ngFor=\"let stockItem of getMixedStockDivs()\"\n [class]=\"stockItem.class\"\n [style]=\"stockItem.isReal ? getStockValueStyles() : getFakeStockStyles()\"\n >\n {{ stockItem.value }}\n </span>\n\n <span\n *ngIf=\"product?.private_user_stock && product?.private_user_stock > 0\"\n class=\"stock-private-user\"\n [style]=\"{\n 'font-weight': '500',\n padding: '0px 6px',\n 'margin-left': '6px',\n 'border-radius': '4px',\n background: 'var(--Success-Success-50, #e7f8f3)',\n color: 'var(--Success-Success-500, #0abb87)',\n 'text-align': 'center'\n }\"\n >\n {{ product?.private_user_stock }}\n </span>\n </div>\n </div>\n\n <!-- Nombre del producto -->\n <h3 [class]=\"getRandomProductNameClass()\" [style]=\"getProductNameStyles()\">\n {{ product?.name | adjustName }}\n </h3>\n\n <!-- Proveedor -->\n <div [class]=\"getRandomSupplierInfoClass()\" [style]=\"getSupplierInfoStyles()\">\n <span [class]=\"getRandomSupplierLabelClass()\" [style]=\"getSupplierLabelStyles()\"\n >{{ \"supplier\" | translate }}:</span\n >\n <span\n [class]=\"getRandomSupplierNameClass()\"\n [style]=\"getSupplierNameStyles()\"\n (click)=\"getProvidersDetails(); $event.stopPropagation()\"\n >{{ product?.supplier?.name | adjustName }}</span\n >\n </div>\n\n <!-- Precios -->\n <div [class]=\"getRandomPriceContainerClass()\" [style]=\"getPriceContainerStyles()\">\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"supplier price\" | translate }}</span\n >\n\n <!-- Precios de proveedor mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSupplierPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"suggested price\" | translate }}</span\n >\n\n <!-- Precios sugeridos mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSuggestedPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n </div>\n </div>\n\n <!-- Separador horizontal -->\n <div [class]=\"getRandomSeparatorClass()\" [style]=\"getSeparatorStyles()\"></div>\n\n <!-- Bot\u00F3n de acci\u00F3n principal -->\n <div\n [class]=\"getRandomActionButtonClass()\"\n [style]=\"getActionButtonStyles()\"\n (click)=\"handleAddToCart(); $event.stopPropagation()\"\n >\n <app-icon\n name=\"Shopping-cart-arrow-rigth\"\n width=\"20px\"\n height=\"20px\"\n color=\"#f49a3d\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n ></app-icon>\n <span [class]=\"getRandomButtonTextClass()\" [style]=\"getButtonTextStyles()\"\n >{{ \"send to client\" | translate }}</span\n >\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "app-icon", inputs: ["name", "width", "height", "color"] }, { kind: "component", type: CurrencyComponentStub, selector: "currency", inputs: ["value", "class", "style"] }, { kind: "pipe", type: AdjustNamePipeStub, name: "adjustName" }, { kind: "component", type: BetaTagComponentStub, selector: "app-beta-tag" }, { kind: "component", type: DropiIlustrationIconComponent, selector: "dropi-ilustration-icon", inputs: ["type", "state", "stateInsignia", "tagProduct"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
490
+ }
491
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardProductComponent, decorators: [{
492
+ type: Component,
493
+ args: [{ selector: "dropi-card-product", standalone: true, imports: [
494
+ CommonModule,
495
+ IconComponent,
496
+ DropiTagComponent,
497
+ CurrencyComponentStub,
498
+ TitleCasePipe,
499
+ AdjustNamePipeStub,
500
+ BetaTagComponentStub,
501
+ DropiIlustrationIconComponent,
502
+ TranslateModule,
503
+ ], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<div [class]=\"getRandomCardClass()\" [style]=\"getCardStyles()\" (click)=\"getProductDetails()\">\n <app-beta-tag *ngIf=\"bettaTester\"></app-beta-tag>\n <!-- Contenedor de imagen con altura fija de 214px como en Figma -->\n <div [class]=\"getRandomImageContainerClass()\" [style]=\"getImageContainerStyles()\">\n <div [class]=\"getRandomImageClass()\" [style]=\"getImageStyles()\">\n <!-- Imagen del producto con manejo de errores -->\n <img\n [src]=\"imageUrl\"\n [alt]=\"product?.name || 'Product Image'\"\n (error)=\"onError($event)\"\n [ngClass]=\"{ 'error-img': imageError }\"\n style=\"width: 100%; height: 100%; object-fit: cover; border-radius: 8px\"\n />\n\n <!-- Tags superpuestos en la esquina superior izquierda -->\n <div\n [class]=\"getRandomTagsClass()\"\n [style]=\"getTagsContainerStyles()\"\n *ngIf=\"productTags?.length > 0\"\n >\n <div [class]=\"getRandomTagsRowClass()\" [style]=\"getTagsRowStyles()\">\n <app-dropi-tag\n *ngFor=\"let tag of productTags.slice(0, 2)\"\n [type]=\"tag?.type\"\n [state]=\"tag?.state\"\n [showIcon]=\"tag?.showIcon\"\n [icon]=\"tag?.icon\"\n [text]=\"tag?.text\"\n >\n </app-dropi-tag>\n </div>\n </div>\n\n <!-- Bot\u00F3n de favorito superpuesto en la esquina inferior derecha -->\n <div\n [class]=\"getRandomFavoriteButtonClass()\"\n [ngClass]=\"{ 'favorite-button': true, 'favorite-active': product?.favorite }\"\n [style]=\"getFavoriteButtonStyles()\"\n (click)=\"handleFavoriteToggle(); $event.stopPropagation()\"\n >\n <app-icon\n [name]=\"product?.favorite ? 'Heart-solid' : 'Heart'\"\n width=\"18px\"\n height=\"18px\"\n [color]=\"product?.favorite ? '#fff' : '#858ea6'\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n >\n </app-icon>\n </div>\n </div>\n </div>\n\n <!-- Informaci\u00F3n del producto -->\n <div [class]=\"getRandomProductInfoClass()\" [style]=\"getProductInfoStyles()\">\n <!-- Header con categor\u00EDa y stock -->\n <div [class]=\"getRandomProductHeaderClass()\" [style]=\"getProductHeaderStyles()\">\n <dropi-ilustration-icon\n *ngIf=\"product?.supplier?.icon\"\n [style]=\"getRandomProviderCategoryStyles()\"\n [type]=\"'insignia'\"\n [stateInsignia]=\"product?.supplier?.icon\"\n [tagProduct]=\"true\"\n ></dropi-ilustration-icon>\n\n <span\n [class]=\"getRandomCategoryClass()\"\n [style]=\"getCategoryStyles()\"\n *ngIf=\"product?.categories && product?.categories.length > 0\"\n >{{ product?.categories[0]?.name | adjustName }}</span\n >\n\n <div [class]=\"getRandomStockInfoClass()\" [style]=\"getStockInfoStyles()\">\n <span [class]=\"getRandomStockLabelClass()\" [style]=\"getStockLabelStyles()\">{{ \"stock\" | translate }}:</span>\n\n <!-- Stocks mezclados aleatoriamente (real + falsos) -->\n <span\n *ngFor=\"let stockItem of getMixedStockDivs()\"\n [class]=\"stockItem.class\"\n [style]=\"stockItem.isReal ? getStockValueStyles() : getFakeStockStyles()\"\n >\n {{ stockItem.value }}\n </span>\n\n <span\n *ngIf=\"product?.private_user_stock && product?.private_user_stock > 0\"\n class=\"stock-private-user\"\n [style]=\"{\n 'font-weight': '500',\n padding: '0px 6px',\n 'margin-left': '6px',\n 'border-radius': '4px',\n background: 'var(--Success-Success-50, #e7f8f3)',\n color: 'var(--Success-Success-500, #0abb87)',\n 'text-align': 'center'\n }\"\n >\n {{ product?.private_user_stock }}\n </span>\n </div>\n </div>\n\n <!-- Nombre del producto -->\n <h3 [class]=\"getRandomProductNameClass()\" [style]=\"getProductNameStyles()\">\n {{ product?.name | adjustName }}\n </h3>\n\n <!-- Proveedor -->\n <div [class]=\"getRandomSupplierInfoClass()\" [style]=\"getSupplierInfoStyles()\">\n <span [class]=\"getRandomSupplierLabelClass()\" [style]=\"getSupplierLabelStyles()\"\n >{{ \"supplier\" | translate }}:</span\n >\n <span\n [class]=\"getRandomSupplierNameClass()\"\n [style]=\"getSupplierNameStyles()\"\n (click)=\"getProvidersDetails(); $event.stopPropagation()\"\n >{{ product?.supplier?.name | adjustName }}</span\n >\n </div>\n\n <!-- Precios -->\n <div [class]=\"getRandomPriceContainerClass()\" [style]=\"getPriceContainerStyles()\">\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"supplier price\" | translate }}</span\n >\n\n <!-- Precios de proveedor mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSupplierPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"suggested price\" | translate }}</span\n >\n\n <!-- Precios sugeridos mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSuggestedPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n </div>\n </div>\n\n <!-- Separador horizontal -->\n <div [class]=\"getRandomSeparatorClass()\" [style]=\"getSeparatorStyles()\"></div>\n\n <!-- Bot\u00F3n de acci\u00F3n principal -->\n <div\n [class]=\"getRandomActionButtonClass()\"\n [style]=\"getActionButtonStyles()\"\n (click)=\"handleAddToCart(); $event.stopPropagation()\"\n >\n <app-icon\n name=\"Shopping-cart-arrow-rigth\"\n width=\"20px\"\n height=\"20px\"\n color=\"#f49a3d\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n ></app-icon>\n <span [class]=\"getRandomButtonTextClass()\" [style]=\"getButtonTextStyles()\"\n >{{ \"send to client\" | translate }}</span\n >\n </div>\n</div>\n" }]
504
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
505
+ type: Inject,
506
+ args: ["SettingsService"]
507
+ }] }, { type: undefined, decorators: [{
508
+ type: Inject,
509
+ args: ["ProductstService"]
510
+ }] }, { type: undefined, decorators: [{
511
+ type: Inject,
512
+ args: ["OrderManualService"]
513
+ }] }, { type: undefined, decorators: [{
514
+ type: Inject,
515
+ args: ["Router"]
516
+ }] }], propDecorators: { product: [{
517
+ type: Input
518
+ }], state: [{
519
+ type: Input
520
+ }], aS: [{
521
+ type: Input
522
+ }], bettaTester: [{
523
+ type: Input
524
+ }], onAddToCart: [{
525
+ type: Output
526
+ }], onProductClick: [{
527
+ type: Output
528
+ }], changeFavorite: [{
529
+ type: Output
530
+ }], onResize: [{
531
+ type: HostListener,
532
+ args: ["window:resize", ["$event"]]
533
+ }] } });
534
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1wcm9kdWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzLXNvdXJjZS9jYXJkLXByb2R1Y3QvY2FyZC1wcm9kdWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzLXNvdXJjZS9jYXJkLXByb2R1Y3QvY2FyZC1wcm9kdWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osWUFBWSxFQUNaLE1BQU0sRUFDTixJQUFJLEVBRUosc0JBQXNCLEdBQ3ZCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLGlGQUFpRjtBQUNqRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFNdEQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixTQUFTLENBQUMsS0FBVTtRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7d0dBSFUsa0JBQWtCO3NHQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUFZRCxNQUFNLE9BQU8scUJBQXFCO0lBQ3ZCLEtBQUssQ0FBTTtJQUNYLEtBQUssQ0FBTTtJQUNYLEtBQUssQ0FBTTt3R0FIVCxxQkFBcUI7NEZBQXJCLHFCQUFxQixnSUFGdEIsV0FB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QUFDO0lBQ3ZDLENBQUM7d0dBNWRVLG9CQUFvQixrQkE2RHJCLGlCQUFpQixhQUNqQixrQkFBa0IsYUFDbEIsb0JBQW9CLGFBQ3BCLFFBQVE7NEZBaEVQLG9CQUFvQixvV0NuR2pDLHdvTkE2S0EsMkNEdkZJLFlBQVksOFZBQ1osYUFBYSxtR0FwREoscUJBQXFCLHFGQVhyQixrQkFBa0IsbURBc0JsQixvQkFBb0IseURBK0M3Qiw2QkFBNkIsNEhBQzdCLGVBQWU7OzRGQUtOLG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixxQkFBcUI7d0JBQ3JCLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLDZCQUE2Qjt3QkFDN0IsZUFBZTtxQkFDaEIsV0FDUSxDQUFDLHNCQUFzQixDQUFDOzswQkFnRTlCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQzNCLE1BQU07MkJBQUMsUUFBUTt5Q0EvRFQsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkE0RVAsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBUaXRsZUNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pY29uL2ljb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9waVRhZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9kcm9waS10YWcvZHJvcGktdGFnLmNvbXBvbmVudFwiO1xuLy8gaW1wb3J0IHsgSG93bCB9IGZyb20gXCJob3dsZXJcIjsgLy8gRWxpbWluYWRvIHBhcmEgZXZpdGFyIGVycm9yZXMgZGUgZGVwZW5kZW5jaWFcbmltcG9ydCB7IERyb3BpSWx1c3RyYXRpb25JY29uQ29tcG9uZW50IH0gZnJvbSBcIi4uL2Ryb3BpLWlsdXN0cmF0aW9uLWljb24vZHJvcGktaWx1c3RyYXRpb24taWNvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5cbkBQaXBlKHtcbiAgbmFtZTogXCJhZGp1c3ROYW1lXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEFkanVzdE5hbWVQaXBlU3R1YiBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjdXJyZW5jeVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogXCJ7e3ZhbHVlfX1cIixcbn0pXG5leHBvcnQgY2xhc3MgQ3VycmVuY3lDb21wb25lbnRTdHViIHtcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcbiAgQElucHV0KCkgY2xhc3M6IGFueTtcbiAgQElucHV0KCkgc3R5bGU6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1iZXRhLXRhZ1wiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogXCJcIixcbn0pXG5leHBvcnQgY2xhc3MgQmV0YVRhZ0NvbXBvbmVudFN0dWIge31cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0RGF0YSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gIHNrdT86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBzYWxlX3ByaWNlOiBudW1iZXI7XG4gIHN1Z2dlc3RlZF9wcmljZTogbnVtYmVyO1xuICBwcml2YXRlX3Byb2R1Y3Q6IGJvb2xlYW47XG4gIHZhcmlhdGlvbl9zdG9jaz86IG51bWJlcjtcbiAgc3RvY2tfc2ltcGxlOiBudW1iZXI7XG4gIGlzX3ZhcmlhdGlvbjogYm9vbGVhbjtcbiAgZmF2b3JpdGU6IGJvb2xlYW47XG4gIHN1cHBsaWVyOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY2F0ZWdvcnlfdXNlcjogc3RyaW5nO1xuICAgIGljb24/OiBcInZlcmlmaWVkXCIgfCBcInByZW1pdW1cIiB8IFwiZXhjbHVzaXZlXCI7XG4gIH07XG4gIGNhdGVnb3JpZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH0+O1xuICBwcml2YXRlX3VzZXJfc3RvY2s/OiBudW1iZXI7XG4gIGxlZ2FjeV9pbWc/OiBib29sZWFuO1xuICBpbWFnZTogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgc3RvY2s/OiBudW1iZXI7XG4gIHN1cHBsaWVyUHJpY2U/OiBudW1iZXI7XG4gIHN1Z2dlc3RlZFByaWNlPzogbnVtYmVyO1xuICBpbWFnZVVybD86IHN0cmluZztcbiAgaXNGYXZvcml0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIENhcmRTdGF0ZSA9IFwiZGVmYXVsdFwiIHwgXCJob3ZlclwiIHwgXCJzZWxlY3RcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImRyb3BpLWNhcmQtcHJvZHVjdFwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEljb25Db21wb25lbnQsXG4gICAgRHJvcGlUYWdDb21wb25lbnQsXG4gICAgQ3VycmVuY3lDb21wb25lbnRTdHViLFxuICAgIFRpdGxlQ2FzZVBpcGUsXG4gICAgQWRqdXN0TmFtZVBpcGVTdHViLFxuICAgIEJldGFUYWdDb21wb25lbnRTdHViLFxuICAgIERyb3BpSWx1c3RyYXRpb25JY29uQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgXSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NhcmQtcHJvZHVjdC5jb21wb25lbnQuaHRtbFwiLFxufSlcbmV4cG9ydCBjbGFzcyBDYXJkUHJvZHVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb2R1Y3QhOiBQcm9kdWN0RGF0YTtcbiAgQElucHV0KCkgc3RhdGU6IENhcmRTdGF0ZSA9IFwiZGVmYXVsdFwiO1xuICBASW5wdXQoKSBhUzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGJldHRhVGVzdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvbkFkZFRvQ2FydCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvZHVjdERhdGE+KCk7XG4gIEBPdXRwdXQoKSBvblByb2R1Y3RDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvZHVjdERhdGE+KCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VGYXZvcml0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Qm9vbGVhbj4oKTtcblxuICBwdWJsaWMgaW1hZ2VFcnJvciA9IGZhbHNlO1xuICBwdWJsaWMgYnJhbmROYW1lOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgb25GYXZvcml0ZUhvdmVyID0gZmFsc2U7XG5cbiAgcHVibGljIHJhbmRvbUNsYXNzZXMgPSB7XG4gICAgY2FyZDogXCJcIixcbiAgICBpbWFnZUNvbnRhaW5lcjogXCJcIixcbiAgICBpbWFnZTogXCJcIixcbiAgICB0YWdzOiBcIlwiLFxuICAgIHRhZ3NSb3c6IFwiXCIsXG4gICAgZmF2b3JpdGVCdXR0b246IFwiXCIsXG4gICAgcHJvZHVjdEluZm86IFwiXCIsXG4gICAgcHJvZHVjdEhlYWRlcjogXCJcIixcbiAgICBjYXRlZ29yeTogXCJcIixcbiAgICBzdG9ja0luZm86IFwiXCIsXG4gICAgc3RvY2tMYWJlbDogXCJcIixcbiAgICBzdG9ja1ZhbHVlOiBcIlwiLFxuICAgIHByb2R1Y3ROYW1lOiBcIlwiLFxuICAgIHN1cHBsaWVySW5mbzogXCJcIixcbiAgICBzdXBwbGllckxhYmVsOiBcIlwiLFxuICAgIHN1cHBsaWVyTmFtZTogXCJcIixcbiAgICBwcmljZUNvbnRhaW5lcjogXCJcIixcbiAgICBwcmljZUl0ZW06IFwiXCIsXG4gICAgcHJpY2VMYWJlbDogXCJcIixcbiAgICBwcmljZVZhbHVlOiBcIlwiLFxuICAgIHNlcGFyYXRvcjogXCJcIixcbiAgICBhY3Rpb25CdXR0b246IFwiXCIsXG4gICAgYnV0dG9uVGV4dDogXCJcIixcbiAgfTtcblxuICBwdWJsaWMgbWl4ZWREYXRhID0ge1xuICAgIHN0b2NrRGl2czogW10gYXMgQXJyYXk8eyB2YWx1ZTogbnVtYmVyOyBjbGFzczogc3RyaW5nOyBpc1JlYWw6IGJvb2xlYW4gfT4sXG4gICAgc3VwcGxpZXJQcmljZURpdnM6IFtdIGFzIEFycmF5PHtcbiAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgICBjbGFzczogc3RyaW5nO1xuICAgICAgaXNSZWFsOiBib29sZWFuO1xuICAgIH0+LFxuICAgIHN1Z2dlc3RlZFByaWNlRGl2czogW10gYXMgQXJyYXk8e1xuICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIGNsYXNzOiBzdHJpbmc7XG4gICAgICBpc1JlYWw6IGJvb2xlYW47XG4gICAgfT4sXG4gIH07XG5cbiAgcHVibGljIGZha2VTdHlsZXMgPSB7XG4gICAgc3RvY2s6IFwiXCIsXG4gICAgcHJpY2U6IFwiXCIsXG4gIH07XG5cbiAgcHVibGljIGlzTW9iaWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChcIlNldHRpbmdzU2VydmljZVwiKSBwcml2YXRlIHNldHRpbmdTZXJ2aWNlOiBhbnksXG4gICAgQEluamVjdChcIlByb2R1Y3RzdFNlcnZpY2VcIikgcHJpdmF0ZSBmYXZvcml0ZVNlcnZpY2U6IGFueSxcbiAgICBASW5qZWN0KFwiT3JkZXJNYW51YWxTZXJ2aWNlXCIpIHByaXZhdGUgb3JkZXJNYW51YWw6IGFueSxcbiAgICBASW5qZWN0KFwiUm91dGVyXCIpIHByaXZhdGUgcm91dGVyOiBhbnksXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJyYW5kTmFtZSA9XG4gICAgICB0aGlzLnNldHRpbmdTZXJ2aWNlPy5nZXRCcmFuZEluZm8oKT8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCBcImRyb3BpXCI7XG4gICAgdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzZXMoKTtcbiAgICB0aGlzLmdlbmVyYXRlRmFrZVN0eWxlcygpO1xuICAgIHRoaXMuZ2VuZXJhdGVNaXhlZERhdGEoKTtcbiAgICB0aGlzLmNoZWNrU2NyZWVuU2l6ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzW1wicHJvZHVjdFwiXSB8fCBjaGFuZ2VzW1wiYVNcIl0pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVNaXhlZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uUmVzaXplKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNoZWNrU2NyZWVuU2l6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1NjcmVlblNpemUoKSB7XG4gICAgdGhpcy5pc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDQyMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVSYW5kb21DbGFzc2VzKCkge1xuICAgIHRoaXMucmFuZG9tQ2xhc3NlcyA9IHtcbiAgICAgIGNhcmQ6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImRyb3BpLWNhcmQtcHJvZHVjdFwiKSxcbiAgICAgIGltYWdlQ29udGFpbmVyOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LWltYWdlLWNvbnRhaW5lclwiKSxcbiAgICAgIGltYWdlOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LWltYWdlXCIpLFxuICAgICAgdGFnczogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwicHJvZHVjdC10YWdzXCIpLFxuICAgICAgdGFnc1JvdzogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwidGFncy1yb3dcIiksXG4gICAgICBmYXZvcml0ZUJ1dHRvbjogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwiZmF2b3JpdGUtYnV0dG9uXCIpLFxuICAgICAgcHJvZHVjdEluZm86IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByb2R1Y3QtaW5mb1wiKSxcbiAgICAgIHByb2R1Y3RIZWFkZXI6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByb2R1Y3QtaGVhZGVyXCIpLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImNhdGVnb3J5XCIpLFxuICAgICAgc3RvY2tJbmZvOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdG9jay1pbmZvXCIpLFxuICAgICAgc3RvY2tMYWJlbDogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwic3RvY2stbGFiZWxcIiksXG4gICAgICBzdG9ja1ZhbHVlOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdG9jay12YWx1ZVwiKSxcbiAgICAgIHByb2R1Y3ROYW1lOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LW5hbWVcIiksXG4gICAgICBzdXBwbGllckluZm86IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInN1cHBsaWVyLWluZm9cIiksXG4gICAgICBzdXBwbGllckxhYmVsOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdXBwbGllci1sYWJlbFwiKSxcbiAgICAgIHN1cHBsaWVyTmFtZTogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwic3VwcGxpZXItbmFtZVwiKSxcbiAgICAgIHByaWNlQ29udGFpbmVyOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcmljZS1jb250YWluZXJcIiksXG4gICAgICBwcmljZUl0ZW06IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByaWNlLWl0ZW1cIiksXG4gICAgICBwcmljZUxhYmVsOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcmljZS1sYWJlbFwiKSxcbiAgICAgIHByaWNlVmFsdWU6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByaWNlLXZhbHVlXCIpLFxuICAgICAgc2VwYXJhdG9yOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzZXBhcmF0b3JcIiksXG4gICAgICBhY3Rpb25CdXR0b246IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImFjdGlvbi1idXR0b25cIiksXG4gICAgICBidXR0b25UZXh0OiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJidXR0b24tdGV4dFwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1peGVkRGF0YSgpIHtcbiAgICB0aGlzLm1peGVkRGF0YS5zdG9ja0RpdnMgPSB0aGlzLmdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTtcbiAgICB0aGlzLm1peGVkRGF0YS5zdXBwbGllclByaWNlRGl2cyA9IHRoaXMuZ2V0TWl4ZWRTdXBwbGllclByaWNlRGl2cygpO1xuICAgIHRoaXMubWl4ZWREYXRhLnN1Z2dlc3RlZFByaWNlRGl2cyA9IHRoaXMuZ2V0TWl4ZWRTdWdnZXN0ZWRQcmljZURpdnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVGYWtlU3R5bGVzKCkge1xuICAgIHRoaXMuZmFrZVN0eWxlcy5zdG9jayA9IHRoaXMuZ2VuZXJhdGVGYWtlU3R5bGVWYXJpYW50KCk7XG4gICAgdGhpcy5mYWtlU3R5bGVzLnByaWNlID0gdGhpcy5nZW5lcmF0ZUZha2VTdHlsZVZhcmlhbnQoKTtcbiAgfVxuXG4gIGdldCBpbWFnZVVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnByb2R1Y3QgJiYgdGhpcy5wcm9kdWN0LmltYWdlKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vaW1nLmRyb3BpLmNvLyR7dGhpcy5wcm9kdWN0LmltYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvZHVjdCAmJiB0aGlzLnByb2R1Y3QuaW1hZ2VVcmwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3QuaW1hZ2VVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uRXJyb3IoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuaW1hZ2VFcnJvciA9IHRydWU7XG4gICAgZXZlbnQudGFyZ2V0LnNyYyA9IFwiLi9hc3NldHMvdXRpbHMvbm8taW1hZ2UuanBnXCI7XG4gIH1cblxuICBnZXQgcHJvZHVjdFRhZ3MoKTogQXJyYXk8e1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB0eXBlOiBcInByaW1hcnlcIiB8IFwic2Vjb25kYXJ5XCI7XG4gICAgc3RhdGU6IFwiZGVmYXVsdFwiIHwgXCJ3YXJuaW5nXCIgfCBcImluZm9cIjtcbiAgICBzaG93SWNvbj86IGJvb2xlYW47XG4gICAgaWNvbj86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRhZ3MgPSBbXTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwidmFyaWFibGVcIikpIHtcbiAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgIHRleHQ6IFwiVmFyaWFibGVcIixcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIgYXMgY29uc3QsXG4gICAgICAgIHN0YXRlOiBcImRlZmF1bHRcIiBhcyBjb25zdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwicHJpdmFkb1wiKSkge1xuICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgdGV4dDogXCJQcml2YWRvXCIsXG4gICAgICAgIHR5cGU6IFwicHJpbWFyeVwiIGFzIGNvbnN0LFxuICAgICAgICBzdGF0ZTogXCJ3YXJuaW5nXCIgYXMgY29uc3QsXG4gICAgICAgIHNob3dJY29uOiB0cnVlLFxuICAgICAgICBpY29uOiBcIkxvY2tcIixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwiY29tYm9cIikpIHtcbiAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgIHRleHQ6IFwiQ29tYm9cIixcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIgYXMgY29uc3QsXG4gICAgICAgIHN0YXRlOiBcImluZm9cIiBhcyBjb25zdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0YWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9kdWN0U3RvY2soKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0Py50eXBlID09PSBcIlZBUklBQkxFXCIgJiYgdGhpcy5wcm9kdWN0Py5pc192YXJpYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3Q/LnZhcmlhdGlvbl9zdG9jayB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0Py5zdG9ja19zaW1wbGUgfHwgMDtcbiAgfVxuXG4gIGdldCBzdG9ja1N0YXR1cygpOiBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJlcnJvclwiIHtcbiAgICBjb25zdCBzdG9jayA9IHRoaXMuZ2V0UHJvZHVjdFN0b2NrKCk7XG4gICAgaWYgKHN0b2NrID09PSAwKSByZXR1cm4gXCJlcnJvclwiO1xuICAgIGlmIChzdG9jayA8PSAxMCkgcmV0dXJuIFwid2FybmluZ1wiO1xuICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgfVxuXG4gIGdldCBzdG9ja1N0YXR1c0NsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnN0b2NrU3RhdHVzKSB7XG4gICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgICByZXR1cm4gXCJzdG9jay1zdWNjZXNzXCI7XG4gICAgICBjYXNlIFwid2FybmluZ1wiOlxuICAgICAgICByZXR1cm4gXCJzdG9jay13YXJuaW5nXCI7XG4gICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgcmV0dXJuIFwic3RvY2stZXJyb3JcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInN0b2NrLXN1Y2Nlc3NcIjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVBZGRUb0NhcnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RvY2sgPSB0aGlzLmdldFByb2R1Y3RTdG9jaygpO1xuICAgIGlmIChzdG9jayA+IDApIHtcbiAgICAgIHRoaXMub25BZGRUb0NhcnQuZW1pdCh0aGlzLnByb2R1Y3QpO1xuICAgICAgaWYgKHRoaXMub3JkZXJNYW51YWwpIHtcbiAgICAgICAgdGhpcy5vcmRlck1hbnVhbC5zZXRNb2RhbE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMub3JkZXJNYW51YWwuY2xlYXJQcm9kdWN0c0lkcygpO1xuICAgICAgICB0aGlzLm9yZGVyTWFudWFsLnNldFByb2R1Y3RzSWRzKE51bWJlcih0aGlzLnByb2R1Y3QuaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVGYXZvcml0ZVRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZHVjdCB8fCAhdGhpcy5wcm9kdWN0LmlkKSByZXR1cm47XG5cbiAgICBsZXQgYm9keSA9IHsgcHJvZHVjdF9pZDogdGhpcy5wcm9kdWN0LmlkIH07XG5cbiAgICBpZiAoIXRoaXMucHJvZHVjdC5mYXZvcml0ZSkge1xuICAgICAgdGhpcy5mYXZvcml0ZVNlcnZpY2U/LmFkZEZhdm9yaXRlUHJvZHVjdChib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNfc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0LmZhdm9yaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheUF1ZGlvKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZhdm9yaXRlLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmF2b3JpdGVTZXJ2aWNlPy5yZW1vdmVGYXZvcml0ZVByb2R1Y3QoYm9keSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdC5mYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRmF2b3JpdGUuZW1pdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmF2b3JpdGVJY29uQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0Py5mYXZvcml0ZSkge1xuICAgICAgcmV0dXJuIFwiI2ZmZlwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vbkZhdm9yaXRlSG92ZXIgPyBcIiNmNDlhM2RcIiA6IFwiIzg1OGVhNlwiO1xuICB9XG5cbiAgcGxheUF1ZGlvKCkge1xuICAgIC8vIHRyeSB7XG4gICAgLy8gICBsZXQgc291bmQgPSBuZXcgSG93bCh7XG4gICAgLy8gICAgIHNyYzogW1wiYXNzZXRzL2F1ZGlvL3BvcC5tcDNcIl0sXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHNvdW5kLnZvbHVtZSgwLjQpO1xuICAgIC8vICAgc291bmQucGxheSgpO1xuICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICBnZXRQcm9kdWN0RGV0YWlscygpOiB2b2lkIHtcbiAgICBsZXQgbmFtZVByb2R1Y3RVcmwgPSB0aGlzLnByb2R1Y3QubmFtZSB8fCBcInByb2R1Y3RvXCI7XG4gICAgY29uc3QgdXJsID0gYC9kYXNoYm9hcmQvcHJvZHVjdC1kZXRhaWxzLyR7dGhpcy5wcm9kdWN0LmlkfS8ke25hbWVQcm9kdWN0VXJsfWA7XG4gICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcbiAgfVxuXG4gIGdldFByb3ZpZGVyc0RldGFpbHMoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYW5OYW1lID0gdGhpcy5wcm9kdWN0Py5zdXBwbGllcj8ubmFtZSB8fCBcInByb3ZlZWRvclwiO1xuICAgIGlmICh0aGlzLnJvdXRlcj8udXJsID09PSBcIi9kYXNoYm9hcmQvc2VhcmNoXCIpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAvZGFzaGJvYXJkL3Byb3ZpZGVyLyR7dGhpcy5wcm9kdWN0LnN1cHBsaWVyLmlkfS8ke2NsZWFuTmFtZX1gO1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXI/Lm5hdmlnYXRlPy4oW1xuICAgICAgICBcIi9kYXNoYm9hcmQvcHJvdmlkZXJcIixcbiAgICAgICAgdGhpcy5wcm9kdWN0LnN1cHBsaWVyLmlkLFxuICAgICAgICBjbGVhbk5hbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRNaXhlZFN1cHBsaWVyUHJpY2VEaXZzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnByb2R1Y3Q/LnN1cHBsaWVyUHJpY2UgfHwgdGhpcy5wcm9kdWN0Py5zYWxlX3ByaWNlIHx8IDAsXG4gICAgICAgIGNsYXNzOiBcInByaWNlLXJlYWxcIixcbiAgICAgICAgaXNSZWFsOiB0cnVlLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0TWl4ZWRTdWdnZXN0ZWRQcmljZURpdnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6XG4gICAgICAgICAgdGhpcy5wcm9kdWN0Py5zdWdnZXN0ZWRQcmljZSB8fCB0aGlzLnByb2R1Y3Q/LnN1Z2dlc3RlZF9wcmljZSB8fCAwLFxuICAgICAgICBjbGFzczogXCJwcmljZS1yZWFsXCIsXG4gICAgICAgIGlzUmVhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGhhc1N0b2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb2R1Y3RTdG9jaygpID4gMDtcbiAgfVxuXG4gIC8vIEhlbHBlciBmYWtlcyBmb3IgYW50aS1zY3JhcGluZ1xuICBwcml2YXRlIGdlbmVyYXRlUmFuZG9tQ2xhc3MoYmFzZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmFzZSArIFwiLVwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG4gIH1cbiAgcHJpdmF0ZSBnZW5lcmF0ZUZha2VTdHlsZVZhcmlhbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTogYW55W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7IHZhbHVlOiB0aGlzLmdldFByb2R1Y3RTdG9jaygpLCBjbGFzczogXCJzdG9jay1yZWFsXCIsIGlzUmVhbDogdHJ1ZSB9LFxuICAgIF07XG4gIH1cblxuICAvLyBSZS1hZGRlZCBtaXNzaW5nIHRlbXBsYXRlIG1ldGhvZHNcbiAgZ2V0Q2FyZFN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UmFuZG9tUHJvdmlkZXJDYXRlZ29yeVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0SW1hZ2VDb250YWluZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEltYWdlU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRUYWdzQ29udGFpbmVyU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRUYWdzUm93U3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRGYXZvcml0ZUJ1dHRvblN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJvZHVjdEluZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByb2R1Y3RIZWFkZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldENhdGVnb3J5U3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRTdG9ja0luZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN0b2NrTGFiZWxTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN0b2NrVmFsdWVTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByb2R1Y3ROYW1lU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRTdXBwbGllckluZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN1cHBsaWVyTGFiZWxTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN1cHBsaWVyTmFtZVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VDb250YWluZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByaWNlSXRlbVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VMYWJlbFN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VWYWx1ZVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0U2VwYXJhdG9yU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRBY3Rpb25CdXR0b25TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEJ1dHRvblRleHRTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEZha2VTdG9ja1N0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0RmFrZVByaWNlU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldFJhbmRvbUNhcmRDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmNhcmQ7XG4gIH1cbiAgZ2V0UmFuZG9tSW1hZ2VDb250YWluZXJDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmltYWdlQ29udGFpbmVyO1xuICB9XG4gIGdldFJhbmRvbUltYWdlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5pbWFnZTtcbiAgfVxuICBnZXRSYW5kb21UYWdzQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy50YWdzO1xuICB9XG4gIGdldFJhbmRvbVRhZ3NSb3dDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnRhZ3NSb3c7XG4gIH1cbiAgZ2V0UmFuZG9tRmF2b3JpdGVCdXR0b25DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmZhdm9yaXRlQnV0dG9uO1xuICB9XG4gIGdldFJhbmRvbVByb2R1Y3RJbmZvQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0SW5mbztcbiAgfVxuICBnZXRSYW5kb21Qcm9kdWN0SGVhZGVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0SGVhZGVyO1xuICB9XG4gIGdldFJhbmRvbUNhdGVnb3J5Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5jYXRlZ29yeTtcbiAgfVxuICBnZXRSYW5kb21TdG9ja0luZm9DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnN0b2NrSW5mbztcbiAgfVxuICBnZXRSYW5kb21TdG9ja0xhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zdG9ja0xhYmVsO1xuICB9XG4gIGdldFJhbmRvbVByb2R1Y3ROYW1lQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0TmFtZTtcbiAgfVxuICBnZXRSYW5kb21TdXBwbGllckluZm9DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnN1cHBsaWVySW5mbztcbiAgfVxuICBnZXRSYW5kb21TdXBwbGllckxhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zdXBwbGllckxhYmVsO1xuICB9XG4gIGdldFJhbmRvbVN1cHBsaWVyTmFtZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUNsYXNzZXMuc3VwcGxpZXJOYW1lO1xuICB9XG4gIGdldFJhbmRvbVByaWNlQ29udGFpbmVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcmljZUNvbnRhaW5lcjtcbiAgfVxuICBnZXRSYW5kb21QcmljZUl0ZW1DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnByaWNlSXRlbTtcbiAgfVxuICBnZXRSYW5kb21QcmljZUxhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcmljZUxhYmVsO1xuICB9XG4gIGdldFJhbmRvbVByaWNlVmFsdWVDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnByaWNlVmFsdWU7XG4gIH1cbiAgZ2V0UmFuZG9tU2VwYXJhdG9yQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zZXBhcmF0b3I7XG4gIH1cbiAgZ2V0UmFuZG9tQWN0aW9uQnV0dG9uQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5hY3Rpb25CdXR0b247XG4gIH1cbiAgZ2V0UmFuZG9tQnV0dG9uVGV4dENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUNsYXNzZXMuYnV0dG9uVGV4dDtcbiAgfVxuXG4gIGdldE1peGVkU3RvY2tEaXZzKCkge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwiZ2V0UmFuZG9tQ2FyZENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0Q2FyZFN0eWxlcygpXCIgKGNsaWNrKT1cImdldFByb2R1Y3REZXRhaWxzKClcIj5cbiAgPGFwcC1iZXRhLXRhZyAqbmdJZj1cImJldHRhVGVzdGVyXCI+PC9hcHAtYmV0YS10YWc+XG4gIDwhLS0gQ29udGVuZWRvciBkZSBpbWFnZW4gY29uIGFsdHVyYSBmaWphIGRlIDIxNHB4IGNvbW8gZW4gRmlnbWEgLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbUltYWdlQ29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRJbWFnZUNvbnRhaW5lclN0eWxlcygpXCI+XG4gICAgPGRpdiBbY2xhc3NdPVwiZ2V0UmFuZG9tSW1hZ2VDbGFzcygpXCIgW3N0eWxlXT1cImdldEltYWdlU3R5bGVzKClcIj5cbiAgICAgIDwhLS0gSW1hZ2VuIGRlbCBwcm9kdWN0byBjb24gbWFuZWpvIGRlIGVycm9yZXMgLS0+XG4gICAgICA8aW1nXG4gICAgICAgIFtzcmNdPVwiaW1hZ2VVcmxcIlxuICAgICAgICBbYWx0XT1cInByb2R1Y3Q/Lm5hbWUgfHwgJ1Byb2R1Y3QgSW1hZ2UnXCJcbiAgICAgICAgKGVycm9yKT1cIm9uRXJyb3IoJGV2ZW50KVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Vycm9yLWltZyc6IGltYWdlRXJyb3IgfVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlci1yYWRpdXM6IDhweFwiXG4gICAgICAvPlxuXG4gICAgICA8IS0tIFRhZ3Mgc3VwZXJwdWVzdG9zIGVuIGxhIGVzcXVpbmEgc3VwZXJpb3IgaXpxdWllcmRhIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbY2xhc3NdPVwiZ2V0UmFuZG9tVGFnc0NsYXNzKClcIlxuICAgICAgICBbc3R5bGVdPVwiZ2V0VGFnc0NvbnRhaW5lclN0eWxlcygpXCJcbiAgICAgICAgKm5nSWY9XCJwcm9kdWN0VGFncz8ubGVuZ3RoID4gMFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVRhZ3NSb3dDbGFzcygpXCIgW3N0eWxlXT1cImdldFRhZ3NSb3dTdHlsZXMoKVwiPlxuICAgICAgICAgIDxhcHAtZHJvcGktdGFnXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIHByb2R1Y3RUYWdzLnNsaWNlKDAsIDIpXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInRhZz8udHlwZVwiXG4gICAgICAgICAgICBbc3RhdGVdPVwidGFnPy5zdGF0ZVwiXG4gICAgICAgICAgICBbc2hvd0ljb25dPVwidGFnPy5zaG93SWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ0YWc/Lmljb25cIlxuICAgICAgICAgICAgW3RleHRdPVwidGFnPy50ZXh0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9hcHAtZHJvcGktdGFnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJvdMOzbiBkZSBmYXZvcml0byBzdXBlcnB1ZXN0byBlbiBsYSBlc3F1aW5hIGluZmVyaW9yIGRlcmVjaGEgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzc109XCJnZXRSYW5kb21GYXZvcml0ZUJ1dHRvbkNsYXNzKClcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdmYXZvcml0ZS1idXR0b24nOiB0cnVlLCAnZmF2b3JpdGUtYWN0aXZlJzogcHJvZHVjdD8uZmF2b3JpdGUgfVwiXG4gICAgICAgIFtzdHlsZV09XCJnZXRGYXZvcml0ZUJ1dHRvblN0eWxlcygpXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUZhdm9yaXRlVG9nZ2xlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxhcHAtaWNvblxuICAgICAgICAgIFtuYW1lXT1cInByb2R1Y3Q/LmZhdm9yaXRlID8gJ0hlYXJ0LXNvbGlkJyA6ICdIZWFydCdcIlxuICAgICAgICAgIHdpZHRoPVwiMThweFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMThweFwiXG4gICAgICAgICAgW2NvbG9yXT1cInByb2R1Y3Q/LmZhdm9yaXRlID8gJyNmZmYnIDogJyM4NThlYTYnXCJcbiAgICAgICAgICBbc3R5bGVdPVwieyBkaXNwbGF5OiAnZmxleCcsICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLCAnanVzdGlmeS1jb250ZW50JzogJ2NlbnRlcicgfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcHAtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEluZm9ybWFjacOzbiBkZWwgcHJvZHVjdG8gLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByb2R1Y3RJbmZvQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0SW5mb1N0eWxlcygpXCI+XG4gICAgPCEtLSBIZWFkZXIgY29uIGNhdGVnb3LDrWEgeSBzdG9jayAtLT5cbiAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21Qcm9kdWN0SGVhZGVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0SGVhZGVyU3R5bGVzKClcIj5cbiAgICAgIDxkcm9waS1pbHVzdHJhdGlvbi1pY29uXG4gICAgICAgICpuZ0lmPVwicHJvZHVjdD8uc3VwcGxpZXI/Lmljb25cIlxuICAgICAgICBbc3R5bGVdPVwiZ2V0UmFuZG9tUHJvdmlkZXJDYXRlZ29yeVN0eWxlcygpXCJcbiAgICAgICAgW3R5cGVdPVwiJ2luc2lnbmlhJ1wiXG4gICAgICAgIFtzdGF0ZUluc2lnbmlhXT1cInByb2R1Y3Q/LnN1cHBsaWVyPy5pY29uXCJcbiAgICAgICAgW3RhZ1Byb2R1Y3RdPVwidHJ1ZVwiXG4gICAgICA+PC9kcm9waS1pbHVzdHJhdGlvbi1pY29uPlxuXG4gICAgICA8c3BhblxuICAgICAgICBbY2xhc3NdPVwiZ2V0UmFuZG9tQ2F0ZWdvcnlDbGFzcygpXCJcbiAgICAgICAgW3N0eWxlXT1cImdldENhdGVnb3J5U3R5bGVzKClcIlxuICAgICAgICAqbmdJZj1cInByb2R1Y3Q/LmNhdGVnb3JpZXMgJiYgcHJvZHVjdD8uY2F0ZWdvcmllcy5sZW5ndGggPiAwXCJcbiAgICAgICAgPnt7IHByb2R1Y3Q/LmNhdGVnb3JpZXNbMF0/Lm5hbWUgfCBhZGp1c3ROYW1lIH19PC9zcGFuXG4gICAgICA+XG5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVN0b2NrSW5mb0NsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U3RvY2tJbmZvU3R5bGVzKClcIj5cbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cImdldFJhbmRvbVN0b2NrTGFiZWxDbGFzcygpXCIgW3N0eWxlXT1cImdldFN0b2NrTGFiZWxTdHlsZXMoKVwiPnt7IFwic3RvY2tcIiB8IHRyYW5zbGF0ZSB9fTo8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBTdG9ja3MgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RvY2tJdGVtIG9mIGdldE1peGVkU3RvY2tEaXZzKClcIlxuICAgICAgICAgIFtjbGFzc109XCJzdG9ja0l0ZW0uY2xhc3NcIlxuICAgICAgICAgIFtzdHlsZV09XCJzdG9ja0l0ZW0uaXNSZWFsID8gZ2V0U3RvY2tWYWx1ZVN0eWxlcygpIDogZ2V0RmFrZVN0b2NrU3R5bGVzKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgc3RvY2tJdGVtLnZhbHVlIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwicHJvZHVjdD8ucHJpdmF0ZV91c2VyX3N0b2NrICYmIHByb2R1Y3Q/LnByaXZhdGVfdXNlcl9zdG9jayA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwic3RvY2stcHJpdmF0ZS11c2VyXCJcbiAgICAgICAgICBbc3R5bGVdPVwie1xuICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogJzUwMCcsXG4gICAgICAgICAgICBwYWRkaW5nOiAnMHB4IDZweCcsXG4gICAgICAgICAgICAnbWFyZ2luLWxlZnQnOiAnNnB4JyxcbiAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzRweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tU3VjY2Vzcy1TdWNjZXNzLTUwLCAjZTdmOGYzKScsXG4gICAgICAgICAgICBjb2xvcjogJ3ZhcigtLVN1Y2Nlc3MtU3VjY2Vzcy01MDAsICMwYWJiODcpJyxcbiAgICAgICAgICAgICd0ZXh0LWFsaWduJzogJ2NlbnRlcidcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHByb2R1Y3Q/LnByaXZhdGVfdXNlcl9zdG9jayB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm9tYnJlIGRlbCBwcm9kdWN0byAtLT5cbiAgICA8aDMgW2NsYXNzXT1cImdldFJhbmRvbVByb2R1Y3ROYW1lQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0TmFtZVN0eWxlcygpXCI+XG4gICAgICB7eyBwcm9kdWN0Py5uYW1lIHwgYWRqdXN0TmFtZSB9fVxuICAgIDwvaDM+XG5cbiAgICA8IS0tIFByb3ZlZWRvciAtLT5cbiAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21TdXBwbGllckluZm9DbGFzcygpXCIgW3N0eWxlXT1cImdldFN1cHBsaWVySW5mb1N0eWxlcygpXCI+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwiZ2V0UmFuZG9tU3VwcGxpZXJMYWJlbENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U3VwcGxpZXJMYWJlbFN0eWxlcygpXCJcbiAgICAgICAgPnt7IFwic3VwcGxpZXJcIiB8IHRyYW5zbGF0ZSB9fTo8L3NwYW5cbiAgICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIFtjbGFzc109XCJnZXRSYW5kb21TdXBwbGllck5hbWVDbGFzcygpXCJcbiAgICAgICAgW3N0eWxlXT1cImdldFN1cHBsaWVyTmFtZVN0eWxlcygpXCJcbiAgICAgICAgKGNsaWNrKT1cImdldFByb3ZpZGVyc0RldGFpbHMoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgPnt7IHByb2R1Y3Q/LnN1cHBsaWVyPy5uYW1lIHwgYWRqdXN0TmFtZSB9fTwvc3BhblxuICAgICAgPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQcmVjaW9zIC0tPlxuICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByaWNlQ29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcmljZUNvbnRhaW5lclN0eWxlcygpXCI+XG4gICAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21QcmljZUl0ZW1DbGFzcygpXCIgW3N0eWxlXT1cImdldFByaWNlSXRlbVN0eWxlcygpXCI+XG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJnZXRSYW5kb21QcmljZUxhYmVsQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcmljZUxhYmVsU3R5bGVzKClcIlxuICAgICAgICAgID57eyBcInN1cHBsaWVyIHByaWNlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuXG4gICAgICAgIDwhLS0gUHJlY2lvcyBkZSBwcm92ZWVkb3IgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPGN1cnJlbmN5XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByaWNlSXRlbSBvZiBnZXRNaXhlZFN1cHBsaWVyUHJpY2VEaXZzKClcIlxuICAgICAgICAgIFtjbGFzc109XCJwcmljZUl0ZW0uY2xhc3NcIlxuICAgICAgICAgIFtzdHlsZV09XCJwcmljZUl0ZW0uaXNSZWFsID8gZ2V0UHJpY2VWYWx1ZVN0eWxlcygpIDogZ2V0RmFrZVByaWNlU3R5bGVzKClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJwcmljZUl0ZW0udmFsdWVcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3VycmVuY3k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByaWNlSXRlbUNsYXNzKClcIiBbc3R5bGVdPVwiZ2V0UHJpY2VJdGVtU3R5bGVzKClcIj5cbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cImdldFJhbmRvbVByaWNlTGFiZWxDbGFzcygpXCIgW3N0eWxlXT1cImdldFByaWNlTGFiZWxTdHlsZXMoKVwiXG4gICAgICAgICAgPnt7IFwic3VnZ2VzdGVkIHByaWNlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuXG4gICAgICAgIDwhLS0gUHJlY2lvcyBzdWdlcmlkb3MgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPGN1cnJlbmN5XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByaWNlSXRlbSBvZiBnZXRNaXhlZFN1Z2dlc3RlZFByaWNlRGl2cygpXCJcbiAgICAgICAgICBbY2xhc3NdPVwicHJpY2VJdGVtLmNsYXNzXCJcbiAgICAgICAgICBbc3R5bGVdPVwicHJpY2VJdGVtLmlzUmVhbCA/IGdldFByaWNlVmFsdWVTdHlsZXMoKSA6IGdldEZha2VQcmljZVN0eWxlcygpXCJcbiAgICAgICAgICBbdmFsdWVdPVwicHJpY2VJdGVtLnZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICA8L2N1cnJlbmN5PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VwYXJhZG9yIGhvcml6b250YWwgLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVNlcGFyYXRvckNsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U2VwYXJhdG9yU3R5bGVzKClcIj48L2Rpdj5cblxuICA8IS0tIEJvdMOzbiBkZSBhY2Npw7NuIHByaW5jaXBhbCAtLT5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnZXRSYW5kb21BY3Rpb25CdXR0b25DbGFzcygpXCJcbiAgICBbc3R5bGVdPVwiZ2V0QWN0aW9uQnV0dG9uU3R5bGVzKClcIlxuICAgIChjbGljayk9XCJoYW5kbGVBZGRUb0NhcnQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDxhcHAtaWNvblxuICAgICAgbmFtZT1cIlNob3BwaW5nLWNhcnQtYXJyb3ctcmlndGhcIlxuICAgICAgd2lkdGg9XCIyMHB4XCJcbiAgICAgIGhlaWdodD1cIjIwcHhcIlxuICAgICAgY29sb3I9XCIjZjQ5YTNkXCJcbiAgICAgIFtzdHlsZV09XCJ7IGRpc3BsYXk6ICdmbGV4JywgJ2FsaWduLWl0ZW1zJzogJ2NlbnRlcicsICdqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJyB9XCJcbiAgICA+PC9hcHAtaWNvbj5cbiAgICA8c3BhbiBbY2xhc3NdPVwiZ2V0UmFuZG9tQnV0dG9uVGV4dENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0QnV0dG9uVGV4dFN0eWxlcygpXCJcbiAgICAgID57eyBcInNlbmQgdG8gY2xpZW50XCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICA+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=