ng-easycommerce 0.0.621 → 0.0.623

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 (595) hide show
  1. package/README.md +995 -991
  2. package/assets/bamboo.html +145 -145
  3. package/assets/bancardCatastro.html +49 -49
  4. package/assets/bancardFrameBase.html +104 -104
  5. package/assets/cecaFrameRedirectBase.html +172 -172
  6. package/assets/decidirFormEc.html +519 -519
  7. package/assets/docs/COOKIES.md +158 -158
  8. package/assets/docs/Parametros-Frontend.md +56 -56
  9. package/assets/ec-i18n/ct.json +297 -297
  10. package/assets/ec-i18n/en.json +1 -0
  11. package/assets/ec-i18n/es.json +416 -415
  12. package/assets/ec-i18n/fr.json +0 -0
  13. package/assets/ec-i18n/gl.json +297 -297
  14. package/assets/ec-i18n/pr.json +297 -297
  15. package/assets/images/whatsapp.png +0 -0
  16. package/assets/mpFrameRedirectBase.html +114 -114
  17. package/assets/recaptcha/recaptcha-site-keys.json +3 -3
  18. package/assets/recaptcha/recaptcha-sites-prod.json +38 -38
  19. package/assets/recaptcha/recaptcha-sites.json +52 -52
  20. package/assets/redirect.html +62 -62
  21. package/assets/redsysAuthVdosBase.html +78 -78
  22. package/assets/redsysAuthVunoBase.html +84 -84
  23. package/assets/redsysFrameRedirectBase.html +102 -102
  24. package/assets/redsysFrameRedirectOutBase.html +102 -102
  25. package/assets/redsysFrameSendBase.html +71 -71
  26. package/assets/redsysProBase.html +399 -399
  27. package/assets/redsysStateBase.html +63 -63
  28. package/assets/scss/_colors.scss +17 -17
  29. package/assets/scss/_styles.scss +22 -22
  30. package/assets/svg/chevron-left-black.svg +61 -61
  31. package/assets/svg/chevron-right-black.svg +61 -61
  32. package/bundles/ng-easycommerce.umd.js +19727 -19714
  33. package/bundles/ng-easycommerce.umd.js.map +1 -1
  34. package/bundles/ng-easycommerce.umd.min.js +1 -1
  35. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  36. package/esm2015/lib/api/connection.service.js +77 -77
  37. package/esm2015/lib/classes/checkout/step-service.js +39 -39
  38. package/esm2015/lib/classes/checkout/step.js +22 -22
  39. package/esm2015/lib/classes/checkout-process-state.js +2 -2
  40. package/esm2015/lib/classes/component-helper.js +16 -16
  41. package/esm2015/lib/classes/filters/AttributesFilter.js +61 -61
  42. package/esm2015/lib/classes/filters/CategoryFilter.js +54 -54
  43. package/esm2015/lib/classes/filters/DinamycsFilter.js +58 -58
  44. package/esm2015/lib/classes/filters/Filter.js +75 -75
  45. package/esm2015/lib/classes/filters/PriceRangeFilter.js +51 -51
  46. package/esm2015/lib/classes/filters/SortFilter.js +79 -79
  47. package/esm2015/lib/classes/user-role-type.js +1 -1
  48. package/esm2015/lib/classes/user.js +108 -108
  49. package/esm2015/lib/core.consts.js +414 -414
  50. package/esm2015/lib/ec-component/account-ec/account-ec.component.js +45 -45
  51. package/esm2015/lib/ec-component/account-ec/order-ec/order-ec.component.js +115 -115
  52. package/esm2015/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +192 -192
  53. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +115 -115
  54. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +44 -44
  55. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +58 -58
  56. package/esm2015/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +108 -108
  57. package/esm2015/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +168 -168
  58. package/esm2015/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +167 -165
  59. package/esm2015/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +78 -78
  60. package/esm2015/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +140 -140
  61. package/esm2015/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +110 -110
  62. package/esm2015/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +138 -138
  63. package/esm2015/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +38 -38
  64. package/esm2015/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +152 -152
  65. package/esm2015/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +119 -119
  66. package/esm2015/lib/ec-component/blocks-ec/blocks-ec.component.js +70 -70
  67. package/esm2015/lib/ec-component/build-your-ec/build-your-ec.component.js +305 -305
  68. package/esm2015/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +85 -85
  69. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +404 -404
  70. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +152 -152
  71. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +424 -424
  72. package/esm2015/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +103 -103
  73. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +169 -169
  74. package/esm2015/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +112 -112
  75. package/esm2015/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +53 -53
  76. package/esm2015/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +66 -66
  77. package/esm2015/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +80 -80
  78. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +220 -220
  79. package/esm2015/lib/ec-component/compared-products-ec/compared-products-ec.component.js +186 -186
  80. package/esm2015/lib/ec-component/cookies-ec/cookies-ec.component.js +109 -109
  81. package/esm2015/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +32 -32
  82. package/esm2015/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +34 -34
  83. package/esm2015/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +34 -34
  84. package/esm2015/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +35 -35
  85. package/esm2015/lib/ec-component/coupon-ec/coupon-ec.component.js +53 -53
  86. package/esm2015/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +49 -49
  87. package/esm2015/lib/ec-component/filters-ec/filters-ec.component.js +152 -152
  88. package/esm2015/lib/ec-component/filters-top-ec/filters-top-ec.component.js +102 -102
  89. package/esm2015/lib/ec-component/footer-ec/footer-ec.component.js +82 -82
  90. package/esm2015/lib/ec-component/header-ec/header-ec.component.js +199 -199
  91. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +37 -37
  92. package/esm2015/lib/ec-component/index.js +244 -244
  93. package/esm2015/lib/ec-component/login-ec/login-ec.component.js +102 -102
  94. package/esm2015/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +90 -90
  95. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +103 -103
  96. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +172 -172
  97. package/esm2015/lib/ec-component/product-ec/product-ec.component.js +140 -140
  98. package/esm2015/lib/ec-component/related-products-ec/related-products-ec.component.js +94 -94
  99. package/esm2015/lib/ec-component/reviews-ec/reviews-ec.component.js +69 -69
  100. package/esm2015/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +138 -138
  101. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +86 -86
  102. package/esm2015/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +130 -130
  103. package/esm2015/lib/ec-component/share-block-ec/share-block-ec.component.js +149 -149
  104. package/esm2015/lib/ec-component/sidebar-ec/sidebar-ec.component.js +133 -133
  105. package/esm2015/lib/ec-component/stores-ec/stores-ec.component.js +192 -192
  106. package/esm2015/lib/ec-component/variants-ec/variants-ec.component.js +56 -56
  107. package/esm2015/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +205 -205
  108. package/esm2015/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +296 -296
  109. package/esm2015/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +154 -154
  110. package/esm2015/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +144 -144
  111. package/esm2015/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +49 -49
  112. package/esm2015/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +133 -133
  113. package/esm2015/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +152 -152
  114. package/esm2015/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +175 -175
  115. package/esm2015/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +30 -30
  116. package/esm2015/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +26 -26
  117. package/esm2015/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +21 -21
  118. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +156 -156
  119. package/esm2015/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +368 -368
  120. package/esm2015/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +151 -151
  121. package/esm2015/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +178 -178
  122. package/esm2015/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +126 -126
  123. package/esm2015/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +101 -101
  124. package/esm2015/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +83 -83
  125. package/esm2015/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +50 -50
  126. package/esm2015/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +90 -90
  127. package/esm2015/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +143 -143
  128. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +128 -128
  129. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +145 -145
  130. package/esm2015/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +167 -167
  131. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +85 -85
  132. package/esm2015/lib/ec-directive/auth-wholesaler.directive.js +54 -54
  133. package/esm2015/lib/ec-directive/index.js +36 -36
  134. package/esm2015/lib/ec-directive/product-mini-standard.directive.js +65 -65
  135. package/esm2015/lib/ec-directive/product-off.directive.js +144 -144
  136. package/esm2015/lib/ec-directive/product-stock.directive.js +75 -75
  137. package/esm2015/lib/ec-directive/reload-view.directive.js +34 -34
  138. package/esm2015/lib/ec-pipe/ec-currency-symbol.pipe.js +72 -72
  139. package/esm2015/lib/ec-pipe/ec-sanitizer-html.pipe.js +26 -26
  140. package/esm2015/lib/ec-pipe/ec-sanitizer-url.pipe.js +26 -26
  141. package/esm2015/lib/ec-pipe/index.js +13 -13
  142. package/esm2015/lib/guards/able-buyer-guard.service.js +36 -36
  143. package/esm2015/lib/guards/auth-guard.service.js +36 -36
  144. package/esm2015/lib/guards/checkout-ready.service.js +36 -36
  145. package/esm2015/lib/guards/loggedin-guard.service.js +36 -36
  146. package/esm2015/lib/guards/user-role-guard.service.js +38 -38
  147. package/esm2015/lib/interceptors/auth.interceptor.js +55 -55
  148. package/esm2015/lib/interceptors/customer.interceptor.js +48 -48
  149. package/esm2015/lib/interfaces/Script.js +1 -1
  150. package/esm2015/lib/interfaces/analytics/event-key.model.js +1 -1
  151. package/esm2015/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  152. package/esm2015/lib/interfaces/analytics/gtm-config.js +1 -1
  153. package/esm2015/lib/interfaces/analytics/metricool-pixel.js +1 -1
  154. package/esm2015/lib/interfaces/block.js +1 -1
  155. package/esm2015/lib/interfaces/cart/cart-affordable.js +1 -1
  156. package/esm2015/lib/interfaces/checkout/checkout-error.js +1 -1
  157. package/esm2015/lib/interfaces/checkout-data.js +1 -1
  158. package/esm2015/lib/interfaces/choose-options/filter-option.js +6 -6
  159. package/esm2015/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  160. package/esm2015/lib/interfaces/cookies.js +1 -1
  161. package/esm2015/lib/interfaces/core.interfaces.js +1 -1
  162. package/esm2015/lib/interfaces/coupon.js +1 -1
  163. package/esm2015/lib/interfaces/deserializable.js +1 -1
  164. package/esm2015/lib/interfaces/faqs.js +1 -1
  165. package/esm2015/lib/interfaces/filter.js +1 -1
  166. package/esm2015/lib/interfaces/filterStep.js +1 -1
  167. package/esm2015/lib/interfaces/observable-error.interface.js +1 -1
  168. package/esm2015/lib/interfaces/paginate.js +1 -1
  169. package/esm2015/lib/interfaces/parameters.js +1 -1
  170. package/esm2015/lib/interfaces/selection.js +4 -4
  171. package/esm2015/lib/interfaces/step.js +1 -1
  172. package/esm2015/lib/interfaces/store.js +1 -1
  173. package/esm2015/lib/ng-easycommerce.module.js +181 -181
  174. package/esm2015/lib/pipes/order-by.pipe.js +101 -101
  175. package/esm2015/lib/services/account/orders.service.js +102 -102
  176. package/esm2015/lib/services/analytics.service.js +57 -57
  177. package/esm2015/lib/services/auth.service.js +352 -352
  178. package/esm2015/lib/services/banner.service.js +72 -72
  179. package/esm2015/lib/services/blocks/blocks-repository.service.js +62 -62
  180. package/esm2015/lib/services/blocks/blocks.service.js +71 -71
  181. package/esm2015/lib/services/captcha.service.js +130 -130
  182. package/esm2015/lib/services/cart.service.js +576 -576
  183. package/esm2015/lib/services/channel-config.service.js +105 -105
  184. package/esm2015/lib/services/checkout/addressing.service.js +222 -222
  185. package/esm2015/lib/services/checkout/checkout.service.js +236 -236
  186. package/esm2015/lib/services/checkout/error-handler.service.js +81 -81
  187. package/esm2015/lib/services/checkout/payment.service.js +79 -79
  188. package/esm2015/lib/services/checkout/shipment.service.js +183 -183
  189. package/esm2015/lib/services/concatenated-associations.service.js +120 -120
  190. package/esm2015/lib/services/cookies.service.js +208 -208
  191. package/esm2015/lib/services/currency.service.js +161 -161
  192. package/esm2015/lib/services/dataform.service.js +46 -46
  193. package/esm2015/lib/services/filters.service.js +122 -122
  194. package/esm2015/lib/services/gift-card.service.js +61 -61
  195. package/esm2015/lib/services/ip-address.service.js +34 -34
  196. package/esm2015/lib/services/options.service.js +275 -275
  197. package/esm2015/lib/services/pagination.service.js +73 -73
  198. package/esm2015/lib/services/parameters.service.js +72 -72
  199. package/esm2015/lib/services/products/product-detail.service.js +432 -432
  200. package/esm2015/lib/services/products/products.service.js +287 -287
  201. package/esm2015/lib/services/reviews.service.js +107 -107
  202. package/esm2015/lib/services/stores.service.js +37 -37
  203. package/esm2015/lib/services/windows.service.js +52 -52
  204. package/esm2015/lib/services/wishlist.service.js +70 -70
  205. package/esm2015/lib/strategies/standard.strategy.js +43 -43
  206. package/esm2015/lib/utils/analytics/doppler.service.js +37 -37
  207. package/esm2015/lib/utils/analytics/facebook-pixel.service.js +141 -141
  208. package/esm2015/lib/utils/analytics/google-analytics.service.js +265 -265
  209. package/esm2015/lib/utils/analytics/gtm.service.js +341 -341
  210. package/esm2015/lib/utils/analytics/metricool-pixel.service.js +48 -48
  211. package/esm2015/lib/utils/options-of-product-list-data.service.js +96 -96
  212. package/esm2015/lib/utils/order-util.service.js +72 -72
  213. package/esm2015/lib/utils/payment-utils.service.js +35 -35
  214. package/esm2015/lib/utils/shipment-transformer.service.js +66 -66
  215. package/esm2015/lib/utils/toast.service.js +42 -42
  216. package/esm2015/lib/utils/utils.service.js +20 -20
  217. package/esm2015/ng-easycommerce.js +34 -34
  218. package/esm2015/public-api.js +146 -146
  219. package/esm5/lib/api/connection.service.js +90 -90
  220. package/esm5/lib/classes/checkout/step-service.js +74 -74
  221. package/esm5/lib/classes/checkout/step.js +25 -25
  222. package/esm5/lib/classes/checkout-process-state.js +2 -2
  223. package/esm5/lib/classes/component-helper.js +22 -22
  224. package/esm5/lib/classes/filters/AttributesFilter.js +79 -79
  225. package/esm5/lib/classes/filters/CategoryFilter.js +72 -72
  226. package/esm5/lib/classes/filters/DinamycsFilter.js +76 -76
  227. package/esm5/lib/classes/filters/Filter.js +78 -78
  228. package/esm5/lib/classes/filters/PriceRangeFilter.js +68 -68
  229. package/esm5/lib/classes/filters/SortFilter.js +97 -97
  230. package/esm5/lib/classes/user-role-type.js +1 -1
  231. package/esm5/lib/classes/user.js +120 -120
  232. package/esm5/lib/core.consts.js +434 -434
  233. package/esm5/lib/ec-component/account-ec/account-ec.component.js +62 -62
  234. package/esm5/lib/ec-component/account-ec/order-ec/order-ec.component.js +169 -169
  235. package/esm5/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.js +209 -209
  236. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +132 -132
  237. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +60 -60
  238. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +74 -74
  239. package/esm5/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.js +125 -125
  240. package/esm5/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.js +185 -185
  241. package/esm5/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.js +195 -182
  242. package/esm5/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.js +106 -106
  243. package/esm5/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.js +170 -170
  244. package/esm5/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.js +138 -138
  245. package/esm5/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.js +165 -165
  246. package/esm5/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.js +54 -54
  247. package/esm5/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.js +180 -180
  248. package/esm5/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.js +146 -146
  249. package/esm5/lib/ec-component/blocks-ec/blocks-ec.component.js +90 -90
  250. package/esm5/lib/ec-component/build-your-ec/build-your-ec.component.js +327 -327
  251. package/esm5/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.js +112 -112
  252. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +488 -488
  253. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +169 -169
  254. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +509 -509
  255. package/esm5/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.js +120 -120
  256. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +259 -259
  257. package/esm5/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.js +162 -162
  258. package/esm5/lib/ec-component/checkout-ec/step-ec/step-ec.component.js +69 -69
  259. package/esm5/lib/ec-component/checkout-ec/success-ec/success-ec.component.js +83 -83
  260. package/esm5/lib/ec-component/checkout-error-ec/checkout-error-ec.component.js +97 -97
  261. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +261 -261
  262. package/esm5/lib/ec-component/compared-products-ec/compared-products-ec.component.js +209 -209
  263. package/esm5/lib/ec-component/cookies-ec/cookies-ec.component.js +126 -126
  264. package/esm5/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.js +34 -34
  265. package/esm5/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.js +36 -36
  266. package/esm5/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.js +36 -36
  267. package/esm5/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.js +37 -37
  268. package/esm5/lib/ec-component/coupon-ec/coupon-ec.component.js +71 -71
  269. package/esm5/lib/ec-component/faqs-content-ec/faqs-content-ec.component.js +66 -66
  270. package/esm5/lib/ec-component/filters-ec/filters-ec.component.js +168 -168
  271. package/esm5/lib/ec-component/filters-top-ec/filters-top-ec.component.js +118 -118
  272. package/esm5/lib/ec-component/footer-ec/footer-ec.component.js +113 -113
  273. package/esm5/lib/ec-component/header-ec/header-ec.component.js +260 -260
  274. package/esm5/lib/ec-component/home-ec/home-ec.component.js +53 -53
  275. package/esm5/lib/ec-component/index.js +244 -244
  276. package/esm5/lib/ec-component/login-ec/login-ec.component.js +118 -118
  277. package/esm5/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.js +106 -106
  278. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +119 -119
  279. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +199 -199
  280. package/esm5/lib/ec-component/product-ec/product-ec.component.js +158 -158
  281. package/esm5/lib/ec-component/related-products-ec/related-products-ec.component.js +111 -111
  282. package/esm5/lib/ec-component/reviews-ec/reviews-ec.component.js +85 -85
  283. package/esm5/lib/ec-component/reviews-form-ec/reviews-form-ec.component.js +155 -155
  284. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +103 -103
  285. package/esm5/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.js +149 -149
  286. package/esm5/lib/ec-component/share-block-ec/share-block-ec.component.js +166 -166
  287. package/esm5/lib/ec-component/sidebar-ec/sidebar-ec.component.js +136 -136
  288. package/esm5/lib/ec-component/stores-ec/stores-ec.component.js +214 -214
  289. package/esm5/lib/ec-component/variants-ec/variants-ec.component.js +72 -72
  290. package/esm5/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.js +221 -221
  291. package/esm5/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.js +313 -313
  292. package/esm5/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.js +170 -170
  293. package/esm5/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.js +160 -160
  294. package/esm5/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.js +83 -83
  295. package/esm5/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.js +149 -149
  296. package/esm5/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.js +156 -156
  297. package/esm5/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.js +192 -192
  298. package/esm5/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.js +46 -46
  299. package/esm5/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.js +42 -42
  300. package/esm5/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.js +23 -23
  301. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.js +174 -174
  302. package/esm5/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.js +396 -396
  303. package/esm5/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.js +167 -167
  304. package/esm5/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.js +231 -231
  305. package/esm5/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.js +144 -144
  306. package/esm5/lib/ec-component/widgets-ec/price-ec/price-ec.component.js +122 -122
  307. package/esm5/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.js +100 -100
  308. package/esm5/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.js +53 -53
  309. package/esm5/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.js +124 -124
  310. package/esm5/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.js +159 -159
  311. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +144 -144
  312. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.js +162 -162
  313. package/esm5/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.js +181 -181
  314. package/esm5/lib/ec-directive/add-action-redirect.directive.js +104 -104
  315. package/esm5/lib/ec-directive/auth-wholesaler.directive.js +60 -60
  316. package/esm5/lib/ec-directive/index.js +36 -36
  317. package/esm5/lib/ec-directive/product-mini-standard.directive.js +72 -72
  318. package/esm5/lib/ec-directive/product-off.directive.js +163 -163
  319. package/esm5/lib/ec-directive/product-stock.directive.js +81 -81
  320. package/esm5/lib/ec-directive/reload-view.directive.js +35 -35
  321. package/esm5/lib/ec-pipe/ec-currency-symbol.pipe.js +74 -74
  322. package/esm5/lib/ec-pipe/ec-sanitizer-html.pipe.js +27 -27
  323. package/esm5/lib/ec-pipe/ec-sanitizer-url.pipe.js +27 -27
  324. package/esm5/lib/ec-pipe/index.js +13 -13
  325. package/esm5/lib/guards/able-buyer-guard.service.js +37 -37
  326. package/esm5/lib/guards/auth-guard.service.js +37 -37
  327. package/esm5/lib/guards/checkout-ready.service.js +37 -37
  328. package/esm5/lib/guards/loggedin-guard.service.js +37 -37
  329. package/esm5/lib/guards/user-role-guard.service.js +39 -39
  330. package/esm5/lib/interceptors/auth.interceptor.js +57 -57
  331. package/esm5/lib/interceptors/customer.interceptor.js +50 -50
  332. package/esm5/lib/interfaces/Script.js +1 -1
  333. package/esm5/lib/interfaces/analytics/event-key.model.js +1 -1
  334. package/esm5/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.js +1 -1
  335. package/esm5/lib/interfaces/analytics/gtm-config.js +1 -1
  336. package/esm5/lib/interfaces/analytics/metricool-pixel.js +1 -1
  337. package/esm5/lib/interfaces/block.js +1 -1
  338. package/esm5/lib/interfaces/cart/cart-affordable.js +1 -1
  339. package/esm5/lib/interfaces/checkout/checkout-error.js +1 -1
  340. package/esm5/lib/interfaces/checkout-data.js +1 -1
  341. package/esm5/lib/interfaces/choose-options/filter-option.js +6 -6
  342. package/esm5/lib/interfaces/choose-options/options-of-product-list.js +1 -1
  343. package/esm5/lib/interfaces/cookies.js +1 -1
  344. package/esm5/lib/interfaces/core.interfaces.js +1 -1
  345. package/esm5/lib/interfaces/coupon.js +1 -1
  346. package/esm5/lib/interfaces/deserializable.js +1 -1
  347. package/esm5/lib/interfaces/faqs.js +1 -1
  348. package/esm5/lib/interfaces/filter.js +1 -1
  349. package/esm5/lib/interfaces/filterStep.js +1 -1
  350. package/esm5/lib/interfaces/observable-error.interface.js +1 -1
  351. package/esm5/lib/interfaces/paginate.js +1 -1
  352. package/esm5/lib/interfaces/parameters.js +1 -1
  353. package/esm5/lib/interfaces/selection.js +4 -4
  354. package/esm5/lib/interfaces/step.js +1 -1
  355. package/esm5/lib/interfaces/store.js +1 -1
  356. package/esm5/lib/ng-easycommerce.module.js +185 -185
  357. package/esm5/lib/pipes/order-by.pipe.js +106 -106
  358. package/esm5/lib/services/account/orders.service.js +120 -120
  359. package/esm5/lib/services/analytics.service.js +60 -60
  360. package/esm5/lib/services/auth.service.js +426 -426
  361. package/esm5/lib/services/banner.service.js +81 -81
  362. package/esm5/lib/services/blocks/blocks-repository.service.js +94 -94
  363. package/esm5/lib/services/blocks/blocks.service.js +79 -79
  364. package/esm5/lib/services/captcha.service.js +132 -132
  365. package/esm5/lib/services/cart.service.js +708 -708
  366. package/esm5/lib/services/channel-config.service.js +107 -107
  367. package/esm5/lib/services/checkout/addressing.service.js +280 -280
  368. package/esm5/lib/services/checkout/checkout.service.js +319 -319
  369. package/esm5/lib/services/checkout/error-handler.service.js +83 -83
  370. package/esm5/lib/services/checkout/payment.service.js +129 -129
  371. package/esm5/lib/services/checkout/shipment.service.js +265 -265
  372. package/esm5/lib/services/concatenated-associations.service.js +162 -162
  373. package/esm5/lib/services/cookies.service.js +222 -222
  374. package/esm5/lib/services/currency.service.js +205 -205
  375. package/esm5/lib/services/dataform.service.js +48 -48
  376. package/esm5/lib/services/filters.service.js +125 -125
  377. package/esm5/lib/services/gift-card.service.js +63 -63
  378. package/esm5/lib/services/ip-address.service.js +35 -35
  379. package/esm5/lib/services/options.service.js +376 -376
  380. package/esm5/lib/services/pagination.service.js +79 -79
  381. package/esm5/lib/services/parameters.service.js +74 -74
  382. package/esm5/lib/services/products/product-detail.service.js +497 -497
  383. package/esm5/lib/services/products/products.service.js +345 -345
  384. package/esm5/lib/services/reviews.service.js +116 -116
  385. package/esm5/lib/services/stores.service.js +39 -39
  386. package/esm5/lib/services/windows.service.js +79 -79
  387. package/esm5/lib/services/wishlist.service.js +71 -71
  388. package/esm5/lib/strategies/standard.strategy.js +44 -44
  389. package/esm5/lib/utils/analytics/doppler.service.js +39 -39
  390. package/esm5/lib/utils/analytics/facebook-pixel.service.js +145 -145
  391. package/esm5/lib/utils/analytics/google-analytics.service.js +280 -280
  392. package/esm5/lib/utils/analytics/gtm.service.js +358 -358
  393. package/esm5/lib/utils/analytics/metricool-pixel.service.js +40 -40
  394. package/esm5/lib/utils/options-of-product-list-data.service.js +98 -98
  395. package/esm5/lib/utils/order-util.service.js +75 -75
  396. package/esm5/lib/utils/payment-utils.service.js +37 -37
  397. package/esm5/lib/utils/shipment-transformer.service.js +78 -78
  398. package/esm5/lib/utils/toast.service.js +61 -61
  399. package/esm5/lib/utils/utils.service.js +22 -22
  400. package/esm5/ng-easycommerce.js +34 -34
  401. package/esm5/public-api.js +146 -146
  402. package/fesm2015/ng-easycommerce.js +16691 -16689
  403. package/fesm2015/ng-easycommerce.js.map +1 -1
  404. package/fesm5/ng-easycommerce.js +19731 -19718
  405. package/fesm5/ng-easycommerce.js.map +1 -1
  406. package/lib/api/connection.service.d.ts +28 -28
  407. package/lib/classes/checkout/step-service.d.ts +28 -28
  408. package/lib/classes/checkout/step.d.ts +14 -14
  409. package/lib/classes/checkout-process-state.d.ts +12 -12
  410. package/lib/classes/component-helper.d.ts +8 -8
  411. package/lib/classes/filters/AttributesFilter.d.ts +18 -18
  412. package/lib/classes/filters/CategoryFilter.d.ts +17 -17
  413. package/lib/classes/filters/DinamycsFilter.d.ts +15 -15
  414. package/lib/classes/filters/Filter.d.ts +19 -19
  415. package/lib/classes/filters/PriceRangeFilter.d.ts +18 -18
  416. package/lib/classes/filters/SortFilter.d.ts +15 -15
  417. package/lib/classes/user-role-type.d.ts +5 -5
  418. package/lib/classes/user.d.ts +68 -68
  419. package/lib/core.consts.d.ts +216 -216
  420. package/lib/ec-component/account-ec/account-ec.component.d.ts +13 -13
  421. package/lib/ec-component/account-ec/order-ec/order-ec.component.d.ts +33 -33
  422. package/lib/ec-component/account-ec/orders-list-ec/orders-list-ec.component.d.ts +84 -84
  423. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +35 -35
  424. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +13 -13
  425. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +16 -16
  426. package/lib/ec-component/auth-ec/login-form-ec/login-form-ec.component.d.ts +26 -26
  427. package/lib/ec-component/auth-ec/register-form-ec/register-form-ec.component.d.ts +34 -34
  428. package/lib/ec-component/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +42 -42
  429. package/lib/ec-component/auth-ec/select-channel-ec/select-channel-ec.component.d.ts +23 -23
  430. package/lib/ec-component/blocks-ec/block-banner-boxes-ec/block-banner-boxes-ec.component.d.ts +34 -34
  431. package/lib/ec-component/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +27 -27
  432. package/lib/ec-component/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +34 -34
  433. package/lib/ec-component/blocks-ec/block-html-ec/block-html-ec.component.d.ts +10 -10
  434. package/lib/ec-component/blocks-ec/block-newsletter-ec/contact-form-news-ec.component.d.ts +40 -40
  435. package/lib/ec-component/blocks-ec/block-products-ec/block-products-ec.component.d.ts +25 -25
  436. package/lib/ec-component/blocks-ec/blocks-ec.component.d.ts +24 -24
  437. package/lib/ec-component/build-your-ec/build-your-ec.component.d.ts +122 -122
  438. package/lib/ec-component/build-your-ec/product-found-ec/product-found-ec.component.d.ts +41 -41
  439. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +59 -59
  440. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +43 -43
  441. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +100 -100
  442. package/lib/ec-component/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +27 -27
  443. package/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.d.ts +59 -59
  444. package/lib/ec-component/checkout-ec/shipment-ec/shipment-ec.component.d.ts +34 -34
  445. package/lib/ec-component/checkout-ec/step-ec/step-ec.component.d.ts +18 -18
  446. package/lib/ec-component/checkout-ec/success-ec/success-ec.component.d.ts +33 -33
  447. package/lib/ec-component/checkout-error-ec/checkout-error-ec.component.d.ts +25 -25
  448. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +67 -67
  449. package/lib/ec-component/compared-products-ec/compared-products-ec.component.d.ts +70 -70
  450. package/lib/ec-component/cookies-ec/cookies-ec.component.d.ts +44 -44
  451. package/lib/ec-component/cookies-ec/modal-config-ec/modal-config-ec.component.d.ts +10 -10
  452. package/lib/ec-component/cookies-ec/modal-cookies-ec/modal-cookies-ec.component.d.ts +8 -8
  453. package/lib/ec-component/cookies-ec/sidebar-cookies-ec/sidebar-cookies-ec.component.d.ts +9 -9
  454. package/lib/ec-component/cookies-ec/toast-cookies-ec/toast-cookies-ec.component.d.ts +9 -9
  455. package/lib/ec-component/coupon-ec/coupon-ec.component.d.ts +17 -17
  456. package/lib/ec-component/faqs-content-ec/faqs-content-ec.component.d.ts +15 -15
  457. package/lib/ec-component/filters-ec/filters-ec.component.d.ts +33 -33
  458. package/lib/ec-component/filters-top-ec/filters-top-ec.component.d.ts +23 -23
  459. package/lib/ec-component/footer-ec/footer-ec.component.d.ts +30 -30
  460. package/lib/ec-component/header-ec/header-ec.component.d.ts +66 -66
  461. package/lib/ec-component/home-ec/home-ec.component.d.ts +13 -13
  462. package/lib/ec-component/index.d.ts +81 -81
  463. package/lib/ec-component/login-ec/login-ec.component.d.ts +26 -26
  464. package/lib/ec-component/multiple-items-to-cart-ec/multiple-items-to-cart-ec.component.d.ts +28 -28
  465. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +27 -27
  466. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +60 -60
  467. package/lib/ec-component/product-ec/product-ec.component.d.ts +52 -52
  468. package/lib/ec-component/related-products-ec/related-products-ec.component.d.ts +22 -22
  469. package/lib/ec-component/reviews-ec/reviews-ec.component.d.ts +29 -29
  470. package/lib/ec-component/reviews-form-ec/reviews-form-ec.component.d.ts +61 -61
  471. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +22 -22
  472. package/lib/ec-component/seller-dashboard-container-ec/seller-dashboard-container-ec.component.d.ts +37 -37
  473. package/lib/ec-component/share-block-ec/share-block-ec.component.d.ts +26 -26
  474. package/lib/ec-component/sidebar-ec/sidebar-ec.component.d.ts +29 -29
  475. package/lib/ec-component/stores-ec/stores-ec.component.d.ts +54 -54
  476. package/lib/ec-component/variants-ec/variants-ec.component.d.ts +14 -14
  477. package/lib/ec-component/widgets-ec/bamboo-ec/bamboo-ec.component.d.ts +60 -60
  478. package/lib/ec-component/widgets-ec/bancard-catastro-ec/bancard-catastro-ec.component.d.ts +105 -105
  479. package/lib/ec-component/widgets-ec/bancard-ec/bancard-ec.component.d.ts +46 -46
  480. package/lib/ec-component/widgets-ec/bancard-redirect-ec/bancard-redirect-ec.component.d.ts +44 -44
  481. package/lib/ec-component/widgets-ec/cart-load-ec/cart-load-ec.component.d.ts +14 -14
  482. package/lib/ec-component/widgets-ec/ceca-redirect-ec/ceca-redirect-ec.component.d.ts +38 -38
  483. package/lib/ec-component/widgets-ec/culqi-ec/culqi-ec.component.d.ts +38 -38
  484. package/lib/ec-component/widgets-ec/decidir-ec/decidir-ec.component.d.ts +53 -53
  485. package/lib/ec-component/widgets-ec/loading-full-ec/loading-full-ec.component.d.ts +6 -6
  486. package/lib/ec-component/widgets-ec/loading-inline-ec/loading-inline-ec.component.d.ts +5 -5
  487. package/lib/ec-component/widgets-ec/loading-section-ec/loading-section-ec.component.d.ts +5 -5
  488. package/lib/ec-component/widgets-ec/mercadopago-ec/mp-redirect-ec/mp-redirect-ec.component.d.ts +43 -43
  489. package/lib/ec-component/widgets-ec/mercadopago-ec/mpcredit-ec/mpcredit-ec.component.d.ts +64 -64
  490. package/lib/ec-component/widgets-ec/mobbex-ec/mobbex-ec.component.d.ts +46 -46
  491. package/lib/ec-component/widgets-ec/paypal-express-ec/paypal-express-ec.component.d.ts +41 -41
  492. package/lib/ec-component/widgets-ec/place-to-pay-ec/place-to-pay-ec.component.d.ts +34 -34
  493. package/lib/ec-component/widgets-ec/price-ec/price-ec.component.d.ts +32 -32
  494. package/lib/ec-component/widgets-ec/rating-ec/rating-ec.component.d.ts +28 -28
  495. package/lib/ec-component/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +24 -24
  496. package/lib/ec-component/widgets-ec/redsys-catch-ec/redsys-catch-ec.component.d.ts +14 -14
  497. package/lib/ec-component/widgets-ec/redsys-pro-ec/redsys-pro-ec.component.d.ts +44 -44
  498. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +38 -38
  499. package/lib/ec-component/widgets-ec/redsys-redirect-out-ec/redsys-redirect-out-ec.component.d.ts +42 -42
  500. package/lib/ec-component/widgets-ec/zoom-ec/magnizoom.component.d.ts +66 -66
  501. package/lib/ec-directive/add-action-redirect.directive.d.ts +26 -26
  502. package/lib/ec-directive/auth-wholesaler.directive.d.ts +17 -17
  503. package/lib/ec-directive/index.d.ts +6 -6
  504. package/lib/ec-directive/product-mini-standard.directive.d.ts +19 -19
  505. package/lib/ec-directive/product-off.directive.d.ts +22 -22
  506. package/lib/ec-directive/product-stock.directive.d.ts +15 -15
  507. package/lib/ec-directive/reload-view.directive.d.ts +8 -8
  508. package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +19 -19
  509. package/lib/ec-pipe/ec-sanitizer-html.pipe.d.ts +7 -7
  510. package/lib/ec-pipe/ec-sanitizer-url.pipe.d.ts +7 -7
  511. package/lib/ec-pipe/index.d.ts +4 -4
  512. package/lib/guards/able-buyer-guard.service.d.ts +8 -8
  513. package/lib/guards/auth-guard.service.d.ts +8 -8
  514. package/lib/guards/checkout-ready.service.d.ts +8 -8
  515. package/lib/guards/loggedin-guard.service.d.ts +8 -8
  516. package/lib/guards/user-role-guard.service.d.ts +8 -8
  517. package/lib/interceptors/auth.interceptor.d.ts +9 -9
  518. package/lib/interceptors/customer.interceptor.d.ts +9 -9
  519. package/lib/interfaces/Script.d.ts +5 -5
  520. package/lib/interfaces/analytics/event-key.model.d.ts +1 -1
  521. package/lib/interfaces/analytics/facebook-pixel/facebook-pixel-model.d.ts +5 -5
  522. package/lib/interfaces/analytics/gtm-config.d.ts +6 -6
  523. package/lib/interfaces/analytics/metricool-pixel.d.ts +3 -3
  524. package/lib/interfaces/block.d.ts +33 -33
  525. package/lib/interfaces/cart/cart-affordable.d.ts +8 -8
  526. package/lib/interfaces/cart-item.d.ts +8 -8
  527. package/lib/interfaces/checkout/checkout-error.d.ts +7 -7
  528. package/lib/interfaces/checkout-data.d.ts +6 -6
  529. package/lib/interfaces/choose-options/filter-option.d.ts +16 -16
  530. package/lib/interfaces/choose-options/options-of-product-list.d.ts +5 -5
  531. package/lib/interfaces/cookies.d.ts +49 -49
  532. package/lib/interfaces/core.interfaces.d.ts +4 -4
  533. package/lib/interfaces/coupon.d.ts +5 -5
  534. package/lib/interfaces/currencyConfig.d.ts +10 -10
  535. package/lib/interfaces/deserializable.d.ts +3 -3
  536. package/lib/interfaces/faqs.d.ts +12 -12
  537. package/lib/interfaces/filter.d.ts +51 -51
  538. package/lib/interfaces/filterStep.d.ts +29 -29
  539. package/lib/interfaces/navbar-items.d.ts +9 -9
  540. package/lib/interfaces/observable-error.interface.d.ts +5 -5
  541. package/lib/interfaces/paginate.d.ts +1 -1
  542. package/lib/interfaces/parameters.d.ts +10 -10
  543. package/lib/interfaces/paramsInterfaces/paramsProductsWithUniqueVariant.d.ts +6 -6
  544. package/lib/interfaces/product.d.ts +46 -46
  545. package/lib/interfaces/selection.d.ts +10 -10
  546. package/lib/interfaces/step.d.ts +8 -8
  547. package/lib/interfaces/store.d.ts +17 -17
  548. package/lib/ng-easycommerce.module.d.ts +5 -5
  549. package/lib/pipes/order-by.pipe.d.ts +5 -5
  550. package/lib/services/account/orders.service.d.ts +29 -29
  551. package/lib/services/analytics.service.d.ts +21 -21
  552. package/lib/services/auth.service.d.ts +116 -116
  553. package/lib/services/banner.service.d.ts +26 -26
  554. package/lib/services/blocks/blocks-repository.service.d.ts +19 -19
  555. package/lib/services/blocks/blocks.service.d.ts +25 -25
  556. package/lib/services/captcha.service.d.ts +76 -76
  557. package/lib/services/cart.service.d.ts +140 -140
  558. package/lib/services/channel-config.service.d.ts +35 -35
  559. package/lib/services/checkout/addressing.service.d.ts +239 -239
  560. package/lib/services/checkout/checkout.service.d.ts +71 -71
  561. package/lib/services/checkout/error-handler.service.d.ts +19 -19
  562. package/lib/services/checkout/payment.service.d.ts +34 -34
  563. package/lib/services/checkout/shipment.service.d.ts +58 -58
  564. package/lib/services/concatenated-associations.service.d.ts +57 -57
  565. package/lib/services/cookies.service.d.ts +66 -66
  566. package/lib/services/currency.service.d.ts +65 -65
  567. package/lib/services/dataform.service.d.ts +13 -13
  568. package/lib/services/filters.service.d.ts +48 -48
  569. package/lib/services/gift-card.service.d.ts +19 -19
  570. package/lib/services/ip-address.service.d.ts +10 -10
  571. package/lib/services/options.service.d.ts +61 -61
  572. package/lib/services/pagination.service.d.ts +30 -30
  573. package/lib/services/parameters.service.d.ts +18 -18
  574. package/lib/services/products/product-detail.service.d.ts +114 -114
  575. package/lib/services/products/products.service.d.ts +101 -101
  576. package/lib/services/reviews.service.d.ts +71 -71
  577. package/lib/services/stores.service.d.ts +11 -11
  578. package/lib/services/windows.service.d.ts +13 -13
  579. package/lib/services/wishlist.service.d.ts +13 -13
  580. package/lib/strategies/standard.strategy.d.ts +12 -12
  581. package/lib/utils/analytics/doppler.service.d.ts +9 -9
  582. package/lib/utils/analytics/facebook-pixel.service.d.ts +23 -23
  583. package/lib/utils/analytics/google-analytics.service.d.ts +30 -30
  584. package/lib/utils/analytics/gtm.service.d.ts +34 -34
  585. package/lib/utils/analytics/metricool-pixel.service.d.ts +9 -9
  586. package/lib/utils/options-of-product-list-data.service.d.ts +5 -5
  587. package/lib/utils/order-util.service.d.ts +12 -12
  588. package/lib/utils/payment-utils.service.d.ts +5 -5
  589. package/lib/utils/shipment-transformer.service.d.ts +8 -8
  590. package/lib/utils/toast.service.d.ts +15 -15
  591. package/lib/utils/utils.service.d.ts +4 -4
  592. package/ng-easycommerce.d.ts +34 -34
  593. package/ng-easycommerce.metadata.json +1 -1
  594. package/package.json +1 -1
  595. package/public-api.d.ts +144 -144
@@ -1,432 +1,432 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
- return new (P || (P = Promise))(function (resolve, reject) {
10
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
- step((generator = generator.apply(thisArg, _arguments || [])).next());
14
- });
15
- };
16
- import { Injectable } from '@angular/core';
17
- import { BehaviorSubject } from 'rxjs';
18
- import { ProductsService } from './products.service';
19
- import { CartService } from '../cart.service';
20
- import { ToastService } from '../../utils/toast.service';
21
- import { Constants } from '../../core.consts';
22
- import _ from "lodash";
23
- import { AnalyticsService } from '../analytics.service';
24
- import { CurrencyService } from '../currency.service';
25
- let ProductDetailService = class ProductDetailService {
26
- constructor(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
27
- this.productsService = productsService;
28
- this.cartService = cartService;
29
- this.toastrService = toastrService;
30
- this.constants = constants;
31
- this.analyticsService = analyticsService;
32
- this.currencyService = currencyService;
33
- this.productSubject = new BehaviorSubject({});
34
- this.optionsSubject = new BehaviorSubject({});
35
- this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
36
- this.variants = [];
37
- this.product$ = this.productSubject.asObservable();
38
- this.options$ = this.optionsSubject.asObservable();
39
- this.asociatedData$ = this.asociatedDataSubject.asObservable();
40
- this.balanceCustomer = null;
41
- /**
42
- * @param code Identificador del producto
43
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
44
- *
45
- * Carga el producto solicitado asyncronicamente sin respuesta
46
- */
47
- this.loadProduct = (code, variant = false) => this.productsService.getSpecificProduct(code, variant).toPromise().then(res => variant ? this.initialize(res, code) : this.initialize(res), err => this.productSubject.next(null));
48
- /**
49
- * @param product_id Identificador del producto
50
- * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
51
- * @async
52
- *
53
- * A diferencia del metodo loadProduct, este retorna un valor cuando termina
54
- */
55
- this.getProduct = (product_id, variant = false) => __awaiter(this, void 0, void 0, function* () {
56
- let result = yield this.productsService.getSpecificProduct(product_id, variant).toPromise();
57
- if (!result || result.error)
58
- this.productSubject.next(null);
59
- else
60
- variant ? this.initialize(result, product_id) : this.initialize(result);
61
- return true;
62
- });
63
- this.initialize = (product, variant_code) => {
64
- this.productSubject.next(product);
65
- this.optionsSubject.next(this.getOptions());
66
- variant_code ? this.updateVariants(variant_code) : this.updateVariants();
67
- this.variants.length && this.generateAsociatedDataFromVariants();
68
- this.fetchCartData();
69
- //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
70
- // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
71
- };
72
- this.setProduct = (product) => this.isProductValid(product) && this.initialize(product);
73
- this.isReady = () => this.variants.length == 1;
74
- this.setOption = (option_code, option_value) => {
75
- let options = this.optionsSubject.value;
76
- let option = options.find(element => element.code == option_code).values.find(value => value.name == option_value);
77
- option.selected = !option.selected;
78
- options.find(element => element.code == option_code).values.forEach(value => { if (value.name != option.name)
79
- value.selected = false; });
80
- this.optionsSubject.next(options);
81
- this.updateVariants();
82
- if (this.variants.length > 0) {
83
- // Habilitar todos los botones con la clase 'addCartButton'
84
- const submitButtons = document.querySelectorAll('.addCartButton');
85
- submitButtons.forEach(button => {
86
- button.disabled = false;
87
- });
88
- this.generateAsociatedDataFromVariants();
89
- }
90
- else {
91
- this.toastrService.show('selection-not-available');
92
- // Deshabilitar todos los botones con la clase 'submit-button'
93
- const submitButtons = document.querySelectorAll('.addCartButton');
94
- submitButtons.forEach(button => {
95
- button.disabled = true;
96
- });
97
- }
98
- };
99
- this.changePicture = (picture) => {
100
- let data = this.asociatedDataSubject.value;
101
- data.picture = picture;
102
- this.asociatedDataSubject.next(data);
103
- };
104
- this.handleError = (error) => {
105
- // Whathever we need to do with error
106
- };
107
- this.addToCartPromise = (quantity) => __awaiter(this, void 0, void 0, function* () {
108
- quantity = parseInt(quantity);
109
- if (!this.variants.length) {
110
- return { error: true, message: 'cant-buy' };
111
- }
112
- let product_selected = _.clone(this.productSubject.value);
113
- if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
114
- if (this.variants.length == 0)
115
- return { error: true, message: 'no-variants' };
116
- else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
117
- return { error: true, message: 'variants-left' };
118
- else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
119
- return { error: true, message: 'out-of-stock' };
120
- }
121
- if (!this.validateQuantity(quantity))
122
- return;
123
- let result = yield this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code);
124
- return (result && !(result.error));
125
- });
126
- this.getOptions = (product_received) => {
127
- let product = product_received || this.productSubject.value;
128
- let options = [];
129
- product.options.forEach(element => {
130
- options.push(this.toOption(element));
131
- });
132
- return options;
133
- };
134
- this.toOption = (preoption) => {
135
- return {
136
- name: preoption.label,
137
- code: preoption.code,
138
- type: preoption.type,
139
- values: preoption.values.map(value => ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }))
140
- };
141
- };
142
- this.updateVariants = (code) => {
143
- let variants = this.productSubject.value.variants;
144
- if (!code) {
145
- this.optionsSubject.value.forEach(option => {
146
- option.values.forEach(value => {
147
- if (value.selected) {
148
- variants = variants.filter(variant => {
149
- return variant.options.some(variant_option => {
150
- return (option.code in variant_option && variant_option[option.code] == value.name);
151
- });
152
- });
153
- }
154
- });
155
- });
156
- }
157
- else {
158
- variants = variants.filter(variant => variant.code == code);
159
- }
160
- this.variants = variants;
161
- code && this.updateOptions();
162
- };
163
- this.updateOptions = () => {
164
- let { options } = this.variants.length && this.variants[0];
165
- options && options.forEach(option => Object.keys(option).forEach(key => this.setOption(key, option[key])));
166
- };
167
- this.generateAsociatedDataFromVariants = () => {
168
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
169
- let asociated = {};
170
- if (this.isReady()) {
171
- asociated.stock = this.variants[0].stock;
172
- asociated.price = this.variants[0].price.toString();
173
- asociated.saleprice = this.variants[0].saleprice && this.variants[0].saleprice.toString() || undefined;
174
- asociated.discount = ((_a = this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
175
- asociated.properties = this.variants[0].properties ? this.beautifyProperties(this.variants[0].properties) : undefined;
176
- asociated.uniqueExternalCode = ((_b = this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
177
- asociated.multipleQuantity = ((_c = this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
178
- }
179
- else {
180
- asociated.price = this.cratePrice();
181
- asociated.saleprice = this.crateSalePrice();
182
- asociated.stock = (this.variants.map(variant => variant.stock)).reduce((a, b) => a + b);
183
- asociated.discount = this.crateDiscount();
184
- }
185
- ('images' in this.variants[0] && this.variants[0].images.length > 0)
186
- ? asociated.picture = this.variants[0].images[0]
187
- : asociated.picture = (this.asociatedDataSubject.value.picture || this.productSubject.value.picturesdefault[0]);
188
- asociated.maximumAmount = ((_d = this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
189
- asociated.minimumAmount = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
190
- asociated.maximumItemsQuantity = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
191
- asociated.minimumItemsQuantity = ((_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
192
- && ((_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
193
- asociated.finalConsumer = {
194
- finalConsumerPrice: (_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
195
- originalFinalConsumerPrice: (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
196
- };
197
- asociated.taxes = {
198
- taxIncluded: (_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
199
- taxCategory: (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
200
- };
201
- asociated.taxeAmount = ((_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxes) || undefined;
202
- asociated.taxRate = ((_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxRate) || undefined;
203
- asociated.priceWithoutTaxes = ((_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.priceWithoutTaxes) || undefined;
204
- this.asociatedDataSubject.next(asociated);
205
- };
206
- /**
207
- * @description Recibe las propiedades de una variante y por cada item arma un objeto con
208
- * el name=clave y value=valor de ese item.
209
- * @param properties
210
- * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
211
- */
212
- this.beautifyProperties = (properties) => {
213
- let beautifyData = [];
214
- properties.forEach(prop => {
215
- for (let key in prop) {
216
- beautifyData.push({ name: key, value: prop[key] });
217
- }
218
- });
219
- return beautifyData;
220
- };
221
- this.crateDiscount = () => {
222
- try {
223
- let all_discount = '';
224
- this.variants.forEach(variant => {
225
- variant.discount && (all_discount = all_discount + ', ' + variant.discount);
226
- });
227
- if (all_discount == '') {
228
- return undefined;
229
- }
230
- return all_discount;
231
- }
232
- catch (error) {
233
- return undefined;
234
- }
235
- };
236
- this.cratePrice = () => {
237
- let min_price = 0;
238
- let max_price = 0;
239
- let all_prices = [];
240
- this.variants.forEach(variant => {
241
- all_prices.push(variant.price);
242
- });
243
- min_price = all_prices.reduce((a, b) => Math.min(a, b));
244
- max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
245
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
246
- };
247
- this.crateSalePrice = () => {
248
- let min_price = 0;
249
- let max_price = 0;
250
- let all_prices = [];
251
- this.variants.forEach(variant => {
252
- variant.saleprice && all_prices.push(variant.saleprice);
253
- });
254
- if (!all_prices.length) {
255
- return undefined;
256
- }
257
- min_price = all_prices.reduce((a, b) => Math.min(a, b));
258
- max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
259
- return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
260
- };
261
- this.inRange = (quantity, min, max) => ((quantity - min) * (quantity - max) <= 0);
262
- this.validateQuantity = (quantity) => {
263
- const actualQuantity = this.cartService.getCountFromItemInCart(this.variants[0].code);
264
- const asociatedData = this.asociatedDataSubject.value;
265
- console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
266
- if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
267
- this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
268
- return false;
269
- }
270
- if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
271
- this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
272
- return false;
273
- }
274
- return true;
275
- };
276
- this.validatePriceAndCredits = (price) => {
277
- if (this.balanceCustomer === null) {
278
- return true;
279
- }
280
- if (this.balanceCustomer.allowAnyPaymentMethod) {
281
- return true;
282
- }
283
- if (this.balanceCustomer.remainingCredits === undefined) {
284
- return false;
285
- }
286
- if (price > this.balanceCustomer.remainingCredits) {
287
- this.toastrService.show('not-enough-credits');
288
- return false;
289
- }
290
- return true;
291
- };
292
- this.fetchCartData = () => {
293
- this.cartService.getTotalAmount().subscribe((totalAmount) => {
294
- this.currentTotalAmount = totalAmount;
295
- });
296
- this.cartService.balanceCustomer$.subscribe((balanceCustomer) => {
297
- this.balanceCustomer = balanceCustomer;
298
- });
299
- };
300
- // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
301
- this.isProductValid = (product) => true;
302
- /**
303
- *
304
- * @param product producto el cual se quiere desdoblar por variantes por una opción.
305
- * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
306
- * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
307
- * @returns arreglo con el producto desdoblado por la variante solicitada.
308
- * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
309
- */
310
- this.getProductWithUniqueVariant = (product, withOption) => {
311
- return this.productsService.getProductsWithUniqueVariant([product], withOption);
312
- };
313
- }
314
- /**
315
- * @description agrega/actualiza un item en el carrito
316
- * @param quantity cantidad a agregar
317
- * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
318
- * @returns
319
- */
320
- addToCart(quantity, variant_code) {
321
- quantity = parseInt(quantity);
322
- if (!this.variants.length) {
323
- this.toastrService.show('cant-buy');
324
- return;
325
- }
326
- let product_selected = _.clone(this.productSubject.value);
327
- let variant;
328
- switch (this.variants.length) {
329
- case 0:
330
- this.toastrService.show('no-variants');
331
- break;
332
- case 1:
333
- this.asociatedDataSubject.value.stock == 0 ?
334
- this.toastrService.show('out-of-stock') :
335
- variant = this.variants[0];
336
- break;
337
- default:
338
- if (variant_code) {
339
- variant = this.variants.find(variant => variant.code === variant_code);
340
- if (variant.stock == 0) {
341
- this.toastrService.show('out-of-stock');
342
- variant = undefined;
343
- }
344
- }
345
- else {
346
- this.toastrService.show('variants-left');
347
- }
348
- break;
349
- }
350
- if (!variant)
351
- return;
352
- if (!this.validateQuantity(quantity))
353
- return;
354
- const priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
355
- if (!this.validatePriceAndCredits(priceToValidate))
356
- return;
357
- this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
358
- }
359
- ;
360
- makeAffordableProduct(product_selected) {
361
- product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
362
- product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
363
- product_selected.options = {};
364
- this.variants[0].options.forEach(option => product_selected.options = Object.assign(Object.assign({}, product_selected.options), option));
365
- return product_selected;
366
- }
367
- /**
368
- *
369
- * @param options Array de Variantes y sus valores
370
- *
371
- * @description Retorna una lista filtrada de las variantes que estan seleccionadas
372
- */
373
- getVariantsSelected(options, optionsException) {
374
- let variantsSelected = [];
375
- options.forEach(v => {
376
- if (v.values && v.values.length) {
377
- v.values.forEach(val => {
378
- if (val.selected && !optionsException.find(op => op.toUpperCase() == v.code.toUpperCase())) {
379
- variantsSelected[v.code] = val.name;
380
- }
381
- });
382
- }
383
- });
384
- return variantsSelected;
385
- }
386
- /**
387
- *
388
- * @param options Array de Variantes y sus valores
389
- * @param variants Todas las variantes disponibles del producto
390
- *
391
- * @description retorna todas las variantes disponibles a seleccion y su stock
392
- */
393
- getVariantsAvailable(options, variants, optionsException) {
394
- let variantsSelected = this.getVariantsSelected(options, optionsException);
395
- let variantsAvailable = [];
396
- variants.map(v => {
397
- let aux = {};
398
- if (v.options && v.options.length) {
399
- v.options.map(op => {
400
- Object.assign(aux, op, { stock: v.stock });
401
- });
402
- }
403
- variantsAvailable.push(aux);
404
- });
405
- return variantsAvailable.filter(va => this.constants.containsAll(Object.assign({}, variantsSelected), va));
406
- }
407
- /**
408
- *
409
- * @param options Array de variantes y sus valores
410
- * @param code Codigo de la variante a buscar
411
- * @param name nombre de la variante a buscar
412
- * @param variants variantes del producto
413
- *
414
- * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
415
- */
416
- existVariantAndHasStock(options, code, name, variants, optionsException = []) {
417
- return this.getVariantsAvailable(options, variants, optionsException).find(va => va.hasOwnProperty(code) && va[code] === name && va.stock > 0);
418
- }
419
- };
420
- ProductDetailService.ctorParameters = () => [
421
- { type: ProductsService },
422
- { type: CartService },
423
- { type: ToastService },
424
- { type: Constants },
425
- { type: AnalyticsService },
426
- { type: CurrencyService }
427
- ];
428
- ProductDetailService = __decorate([
429
- Injectable()
430
- ], ProductDetailService);
431
- export { ProductDetailService };
432
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBb0I7SUFjN0IsWUFDWSxlQUFnQyxFQUFVLFdBQXdCLEVBQVUsYUFBMkIsRUFDdkcsU0FBb0IsRUFBUyxnQkFBa0MsRUFBUyxlQUFnQztRQUR4RyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQ3ZHLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBZDVHLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJ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O1lBQTBCLGVBQWU7O0FBaEIzRyxvQkFBb0I7SUFEaEMsVUFBVSxFQUFFO0dBQ0Esb0JBQW9CLENBK2JoQztTQS9iWSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgcGFydGl0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFByb2R1Y3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3Byb2R1Y3QnO1xyXG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuL3Byb2R1Y3RzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uL2NhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XHJcbmltcG9ydCBfIGZyb20gXCJsb2Rhc2hcIjtcclxuaW1wb3J0IHsgQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL2FuYWx5dGljcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcclxuaW1wb3J0IHsgQ3VycmVuY3lTZXJ2aWNlIH0gZnJvbSAnLi4vY3VycmVuY3kuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RGV0YWlsU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBwcm9kdWN0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdD4oe30pO1xyXG4gICAgcHJpdmF0ZSBvcHRpb25zU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55Pih7fSk7XHJcbiAgICBwcml2YXRlIGFzb2NpYXRlZERhdGFTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KHsgcHJpY2U6ICcnLCBzdG9jazogMCwgcGljdHVyZTogJycgfSk7XHJcblxyXG4gICAgcHJpdmF0ZSB2YXJpYW50cyA9IFtdXHJcblxyXG4gICAgcHVibGljIHByb2R1Y3QkID0gdGhpcy5wcm9kdWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIHB1YmxpYyBvcHRpb25zJCA9IHRoaXMub3B0aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBwdWJsaWMgYXNvY2lhdGVkRGF0YSQgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBjdXJyZW50VG90YWxBbW91bnQ6IG51bWJlcjtcclxuICAgIHByaXZhdGUgYmFsYW5jZUN1c3RvbWVyOiBhbnkgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcHJvZHVjdHNTZXJ2aWNlOiBQcm9kdWN0c1NlcnZpY2UsIHByaXZhdGUgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLCBwcml2YXRlIHRvYXN0clNlcnZpY2U6IFRvYXN0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNvbnN0YW50czogQ29uc3RhbnRzLCBwdWJsaWMgYW5hbHl0aWNzU2VydmljZTogQW5hbHl0aWNzU2VydmljZSwgcHVibGljIGN1cnJlbmN5U2VydmljZTogQ3VycmVuY3lTZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAqIEBwYXJhbSBjb2RlIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXHJcbiAgICAqIEBwYXJhbSB2YXJpYW50IEluZGljYSBzaSBzZSBlc3TDoSBzb2xpY2l0YW5kbyB1biBwcm9kdWN0byBwb3Igc3UgY29kaWdvLCBvIHBvciBlbCBjb2RpZ28gY29ycmVzcG9uZGllbnRlIGEgdW5hIGRlIHN1cyB2YXJpYW50ZXNcclxuICAgICogIFxyXG4gICAgKiBDYXJnYSBlbCBwcm9kdWN0byBzb2xpY2l0YWRvIGFzeW5jcm9uaWNhbWVudGUgc2luIHJlc3B1ZXN0YSBcclxuICAgICovXHJcbiAgICBsb2FkUHJvZHVjdCA9IChjb2RlLCB2YXJpYW50OiBib29sZWFuID0gZmFsc2UpID0+XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KGNvZGUsIHZhcmlhbnQpLnRvUHJvbWlzZSgpLnRoZW4oXHJcbiAgICAgICAgICAgIHJlcyA9PiB2YXJpYW50ID8gdGhpcy5pbml0aWFsaXplKHJlcywgY29kZSkgOiB0aGlzLmluaXRpYWxpemUocmVzKSxcclxuICAgICAgICAgICAgZXJyID0+IHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKVxyXG4gICAgICAgIClcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0X2lkIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXHJcbiAgICAgKiBAYXN5bmNcclxuICAgICAqICBcclxuICAgICAqIEEgZGlmZXJlbmNpYSBkZWwgbWV0b2RvIGxvYWRQcm9kdWN0LCBlc3RlIHJldG9ybmEgdW4gdmFsb3IgY3VhbmRvIHRlcm1pbmEgXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3QgPSBhc3luYyAocHJvZHVjdF9pZCwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMucHJvZHVjdHNTZXJ2aWNlLmdldFNwZWNpZmljUHJvZHVjdChwcm9kdWN0X2lkLCB2YXJpYW50KS50b1Byb21pc2UoKTtcclxuICAgICAgICBpZiAoIXJlc3VsdCB8fCByZXN1bHQuZXJyb3IpIHRoaXMucHJvZHVjdFN1YmplY3QubmV4dChudWxsKTtcclxuICAgICAgICBlbHNlIHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzdWx0LCBwcm9kdWN0X2lkKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXN1bHQpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdGlhbGl6ZSA9IChwcm9kdWN0LCB2YXJpYW50X2NvZGU/KSA9PiB7XHJcbiAgICAgICAgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KHByb2R1Y3QpO1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dCh0aGlzLmdldE9wdGlvbnMoKSlcclxuICAgICAgICB2YXJpYW50X2NvZGUgPyB0aGlzLnVwZGF0ZVZhcmlhbnRzKHZhcmlhbnRfY29kZSkgOiB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcclxuICAgICAgICB0aGlzLmZldGNoQ2FydERhdGEoKVxyXG4gICAgICAgIC8vdGhpcy5hbmFseXRpY3NTZXJ2aWNlLmNhbGxFdmVudCgndmlld19pdGVtJywgeyAuLi5wcm9kdWN0LCBjdXJyZW5jeTogdGhpcy5jb25zdGFudHMuY3VycmVuY3kuY29kZSB9KVxyXG4gICAgICAgIC8vIHZhcmlhbnRfY29kZSAmJiB0aGlzLmFuYWx5dGljc1NlcnZpY2UuY2FsbEV2ZW50KCd2aWV3X2l0ZW0nLCB7IC4uLnByb2R1Y3QsIGN1cnJlbmN5OiB0aGlzLmNvbnN0YW50cy5jdXJyZW5jeS5jb2RlIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc2V0UHJvZHVjdCA9IChwcm9kdWN0KSA9PiB0aGlzLmlzUHJvZHVjdFZhbGlkKHByb2R1Y3QpICYmIHRoaXMuaW5pdGlhbGl6ZShwcm9kdWN0KTtcclxuXHJcbiAgICBpc1JlYWR5ID0gKCkgPT4gdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMTtcclxuXHJcbiAgICBzZXRPcHRpb24gPSAob3B0aW9uX2NvZGUsIG9wdGlvbl92YWx1ZSkgPT4ge1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZTtcclxuICAgICAgICBsZXQgb3B0aW9uID0gb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZmluZCh2YWx1ZSA9PiB2YWx1ZS5uYW1lID09IG9wdGlvbl92YWx1ZSk7XHJcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gIW9wdGlvbi5zZWxlY3RlZDtcclxuICAgICAgICBvcHRpb25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT0gb3B0aW9uX2NvZGUpLnZhbHVlcy5mb3JFYWNoKFxyXG4gICAgICAgICAgICB2YWx1ZSA9PiB7IGlmICh2YWx1ZS5uYW1lICE9IG9wdGlvbi5uYW1lKSB2YWx1ZS5zZWxlY3RlZCA9IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dChvcHRpb25zKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBIYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdhZGRDYXJ0QnV0dG9uJ1xyXG4gICAgICAgICAgICBjb25zdCBzdWJtaXRCdXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFkZENhcnRCdXR0b24nKTtcclxuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnc2VsZWN0aW9uLW5vdC1hdmFpbGFibGUnKTtcclxuXHJcbiAgICAgICAgICAgIC8vIERlc2hhYmlsaXRhciB0b2RvcyBsb3MgYm90b25lcyBjb24gbGEgY2xhc2UgJ3N1Ym1pdC1idXR0b24nXHJcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xyXG4gICAgICAgICAgICBzdWJtaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcclxuICAgICAgICAgICAgICAgIChidXR0b24gYXMgSFRNTEJ1dHRvbkVsZW1lbnQpLmRpc2FibGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VQaWN0dXJlID0gKHBpY3R1cmUpID0+IHtcclxuICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XHJcbiAgICAgICAgZGF0YS5waWN0dXJlID0gcGljdHVyZTtcclxuICAgICAgICB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IgPSAoZXJyb3IpID0+IHtcclxuICAgICAgICAvLyBXaGF0aGV2ZXIgd2UgbmVlZCB0byBkbyB3aXRoIGVycm9yXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYWdyZWdhL2FjdHVhbGl6YSB1biBpdGVtIGVuIGVsIGNhcnJpdG8gXHJcbiAgICAgKiBAcGFyYW0gcXVhbnRpdHkgY2FudGlkYWQgYSBhZ3JlZ2FyXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudF9jb2RlICoqKG9wY2lvbmFsKSoqIGNvZGlnbyBkZSBsYSB2YXJpYW50ZSBzZWxlY2Npb25hZGEgZGVsIHByb2R1Y3RvLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIGFkZFRvQ2FydChxdWFudGl0eSwgdmFyaWFudF9jb2RlPzogc3RyaW5nKSB7XHJcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhbnQtYnV5Jyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xyXG5cclxuICAgICAgICBsZXQgdmFyaWFudDogYW55O1xyXG5cclxuICAgICAgICBzd2l0Y2ggKHRoaXMudmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby12YXJpYW50cycpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCA/XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpIDpcclxuICAgICAgICAgICAgICAgICAgICB2YXJpYW50ID0gdGhpcy52YXJpYW50c1swXVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFudF9jb2RlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHRoaXMudmFyaWFudHMuZmluZCh2YXJpYW50ID0+IHZhcmlhbnQuY29kZSA9PT0gdmFyaWFudF9jb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYW50LnN0b2NrID09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ291dC1vZi1zdG9jaycpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCd2YXJpYW50cy1sZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF2YXJpYW50KSByZXR1cm47XHJcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUXVhbnRpdHkocXVhbnRpdHkpKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHByaWNlVG9WYWxpZGF0ZSA9IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlID8gcHJvZHVjdF9zZWxlY3RlZC5zYWxlcHJpY2UgKiBxdWFudGl0eSA6IHByb2R1Y3Rfc2VsZWN0ZWQucHJpY2UgKiBxdWFudGl0eTtcclxuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVQcmljZUFuZENyZWRpdHMocHJpY2VUb1ZhbGlkYXRlKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydCh0aGlzLm1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkKSwgcXVhbnRpdHksIHZhcmlhbnQuY29kZSk7XHJcbiAgICB9O1xyXG5cclxuXHJcblxyXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChxdWFudGl0eSkgPT4ge1xyXG4gICAgICAgIHF1YW50aXR5ID0gcGFyc2VJbnQocXVhbnRpdHkpO1xyXG4gICAgICAgIGlmICghdGhpcy52YXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdjYW50LWJ1eScgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xyXG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgfHwgdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMCB8fCB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID09IDApIHJldHVybiB7IGVycm9yOiB0cnVlLCBtZXNzYWdlOiAnbm8tdmFyaWFudHMnIH07XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMSAmJiB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID4gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICd2YXJpYW50cy1sZWZ0JyB9O1xyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCAhPSAwICYmIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdvdXQtb2Ytc3RvY2snIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVF1YW50aXR5KHF1YW50aXR5KSkgcmV0dXJuO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydFByb21pc2UodGhpcy5tYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZCksIHF1YW50aXR5LCB0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xyXG4gICAgICAgIHJldHVybiAocmVzdWx0ICYmICEocmVzdWx0LmVycm9yKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHByaXZhdGUgZ2V0T3B0aW9ucyA9IChwcm9kdWN0X3JlY2VpdmVkPzogUHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGxldCBwcm9kdWN0ID0gcHJvZHVjdF9yZWNlaXZlZCB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gW107XHJcbiAgICAgICAgcHJvZHVjdC5vcHRpb25zLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMucHVzaCh0aGlzLnRvT3B0aW9uKGVsZW1lbnQpKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9PcHRpb24gPSAocHJlb3B0aW9uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbmFtZTogcHJlb3B0aW9uLmxhYmVsLFxyXG4gICAgICAgICAgICBjb2RlOiBwcmVvcHRpb24uY29kZSxcclxuICAgICAgICAgICAgdHlwZTogcHJlb3B0aW9uLnR5cGUsXHJcbiAgICAgICAgICAgIHZhbHVlczogcHJlb3B0aW9uLnZhbHVlcy5tYXAodmFsdWUgPT4gKHsgbmFtZTogdmFsdWUuY29kZSwgZGVzY3JpcHRpb246IHZhbHVlLm5hbWUsIGltYWdlOiB2YWx1ZS5pbWFnZSwgbW9iaWxlSW1hZ2U6IHZhbHVlLm1vYmlsZUltYWdlLCBzZWxlY3RlZDogZmFsc2UgfSkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgbWFrZUFmZm9yZGFibGVQcm9kdWN0KHByb2R1Y3Rfc2VsZWN0ZWQ6IFByb2R1Y3QpIHtcclxuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnByaWNlID0gcGFyc2VGbG9hdCh0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnByaWNlKTtcclxuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XHJcbiAgICAgICAgcHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy52YXJpYW50c1swXS5vcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHsgLi4ucHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zLCAuLi5vcHRpb24gfSlcclxuICAgICAgICByZXR1cm4gcHJvZHVjdF9zZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZVZhcmlhbnRzID0gKGNvZGU/KSA9PiB7XHJcbiAgICAgICAgbGV0IHZhcmlhbnRzID0gdGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZS52YXJpYW50cztcclxuICAgICAgICBpZiAoIWNvZGUpIHtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZS5mb3JFYWNoKG9wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb24udmFsdWVzLmZvckVhY2godmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zZWxlY3RlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50cyA9IHZhcmlhbnRzLmZpbHRlcih2YXJpYW50ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMuc29tZSh2YXJpYW50X29wdGlvbiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvcHRpb24uY29kZSBpbiB2YXJpYW50X29wdGlvbiAmJiB2YXJpYW50X29wdGlvbltvcHRpb24uY29kZV0gPT0gdmFsdWUubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT0gY29kZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudmFyaWFudHMgPSB2YXJpYW50cztcclxuICAgICAgICBjb2RlICYmIHRoaXMudXBkYXRlT3B0aW9ucygpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdXBkYXRlT3B0aW9ucyA9ICgpID0+IHtcclxuICAgICAgICBsZXQgeyBvcHRpb25zIH0gPSB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLnZhcmlhbnRzWzBdO1xyXG4gICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiBPYmplY3Qua2V5cyhvcHRpb24pLmZvckVhY2goa2V5ID0+IHRoaXMuc2V0T3B0aW9uKGtleSwgb3B0aW9uW2tleV0pKSlcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cyA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYXNvY2lhdGVkOiBhbnkgPSB7fTtcclxuICAgICAgICBpZiAodGhpcy5pc1JlYWR5KCkpIHtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnN0b2NrID0gdGhpcy52YXJpYW50c1swXS5zdG9ja1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnByaWNlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlICYmIHRoaXMudmFyaWFudHNbMF0uc2FsZXByaWNlLnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBhc29jaWF0ZWQuZGlzY291bnQgPSB0aGlzLnZhcmlhbnRzWzBdPy5kaXNjb3VudCB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcm9wZXJ0aWVzID0gdGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzID8gdGhpcy5iZWF1dGlmeVByb3BlcnRpZXModGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnVuaXF1ZUV4dGVybmFsQ29kZSA9IHRoaXMudmFyaWFudHNbMF0/LnVuaXF1ZUV4dGVybmFsQ29kZSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGFzb2NpYXRlZC5tdWx0aXBsZVF1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSB8fCB1bmRlZmluZWQ7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnByaWNlID0gdGhpcy5jcmF0ZVByaWNlKClcclxuICAgICAgICAgICAgYXNvY2lhdGVkLnNhbGVwcmljZSA9IHRoaXMuY3JhdGVTYWxlUHJpY2UoKVxyXG4gICAgICAgICAgICBhc29jaWF0ZWQuc3RvY2sgPSAodGhpcy52YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnN0b2NrKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYilcclxuICAgICAgICAgICAgYXNvY2lhdGVkLmRpc2NvdW50ID0gdGhpcy5jcmF0ZURpc2NvdW50KClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgICgnaW1hZ2VzJyBpbiB0aGlzLnZhcmlhbnRzWzBdICYmIHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzLmxlbmd0aCA+IDApXHJcbiAgICAgICAgICAgID8gYXNvY2lhdGVkLnBpY3R1cmUgPSB0aGlzLnZhcmlhbnRzWzBdLmltYWdlc1swXVxyXG4gICAgICAgICAgICA6IGFzb2NpYXRlZC5waWN0dXJlID0gKHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucGljdHVyZSB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlLnBpY3R1cmVzZGVmYXVsdFswXSk7XHJcblxyXG5cclxuICAgICAgICBhc29jaWF0ZWQubWF4aW11bUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1BbW91bnQgfHwgMFxyXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8ubWluaW11bUFtb3VudCB8fCAwXHJcblxyXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtSXRlbXNRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrID4gMCAmJiAnbWF4aW11bUl0ZW1zUXVhbnRpdHknIGluIHRoaXMudmFyaWFudHNbMF0gPyB0aGlzLnZhcmlhbnRzWzBdPy5tYXhpbXVtSXRlbXNRdWFudGl0eSA6IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrXHJcbiAgICAgICAgYXNvY2lhdGVkLm1pbmltdW1JdGVtc1F1YW50aXR5ID0gdGhpcy52YXJpYW50c1swXT8uc3RvY2sgPiAwICYmICdtaW5pbXVtSXRlbXNRdWFudGl0eScgaW4gdGhpcy52YXJpYW50c1swXVxyXG4gICAgICAgICAgICAmJiB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eSA+IDAgPyB0aGlzLnZhcmlhbnRzWzBdPy5taW5pbXVtSXRlbXNRdWFudGl0eVxyXG4gICAgICAgICAgICA6ICh0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5ID8gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSA6IDEpXHJcblxyXG4gICAgICAgIGFzb2NpYXRlZC5maW5hbENvbnN1bWVyID0ge1xyXG4gICAgICAgICAgICBmaW5hbENvbnN1bWVyUHJpY2U6IHRoaXMudmFyaWFudHNbMF0/LmZpbmFsX2NvbnN1bWVyX3ByaWNlLFxyXG4gICAgICAgICAgICBvcmlnaW5hbEZpbmFsQ29uc3VtZXJQcmljZTogdGhpcy52YXJpYW50c1swXT8ub3JpZ2luYWxfZmluYWxfY29uc3VtZXJfcHJpY2UsXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhc29jaWF0ZWQudGF4ZXMgPSB7XHJcbiAgICAgICAgICAgIHRheEluY2x1ZGVkOiB0aGlzLnZhcmlhbnRzWzBdPy50YXhJbmNsdWRlZCxcclxuICAgICAgICAgICAgdGF4Q2F0ZWdvcnk6IHRoaXMudmFyaWFudHNbMF0/LnRheENhdGVnb3J5LFxyXG4gICAgICAgIH1cclxuICAgICAgICBhc29jaWF0ZWQudGF4ZUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LnRheGVzIHx8IHVuZGVmaW5lZDtcclxuICAgICAgICBhc29jaWF0ZWQudGF4UmF0ZSA9IHRoaXMudmFyaWFudHNbMF0/LnRheFJhdGUgfHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGFzb2NpYXRlZC5wcmljZVdpdGhvdXRUYXhlcyA9IHRoaXMudmFyaWFudHNbMF0/LnByaWNlV2l0aG91dFRheGVzIHx8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGFzb2NpYXRlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVjaWJlIGxhcyBwcm9waWVkYWRlcyBkZSB1bmEgdmFyaWFudGUgeSBwb3IgY2FkYSBpdGVtIGFybWEgdW4gb2JqZXRvIGNvbiBcclxuICAgICAqIGVsIG5hbWU9Y2xhdmUgeSB2YWx1ZT12YWxvciBkZSBlc2UgaXRlbS4gIFxyXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgXHJcbiAgICAgKiBAcmV0dXJucyBVbiBhcnJlZ2xvIGNvbiBsYXMgcHJvcGllZGFkZXMgZGUgbGEgZm9ybWEgeyBuYW1lID0gLi4uICwgdmFsdWUgPSAuLi59XHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYmVhdXRpZnlQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXMpID0+IHtcclxuICAgICAgICBsZXQgYmVhdXRpZnlEYXRhID0gW11cclxuICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocHJvcCA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICBiZWF1dGlmeURhdGEucHVzaCh7IG5hbWU6IGtleSwgdmFsdWU6IHByb3Bba2V5XSB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGJlYXV0aWZ5RGF0YVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JhdGVEaXNjb3VudCA9ICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgYWxsX2Rpc2NvdW50ID0gJyc7XHJcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHZhcmlhbnQuZGlzY291bnQgJiYgKGFsbF9kaXNjb3VudCA9IGFsbF9kaXNjb3VudCArICcsICcgKyB2YXJpYW50LmRpc2NvdW50KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChhbGxfZGlzY291bnQgPT0gJycpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWxsX2Rpc2NvdW50XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyYXRlUHJpY2UgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnByaWNlKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtaW5fcHJpY2UgPSBhbGxfcHJpY2VzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYikpO1xyXG4gICAgICAgIG1heF9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XHJcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JhdGVTYWxlUHJpY2UgPSAoKSA9PiB7XHJcbiAgICAgICAgbGV0IG1pbl9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XHJcbiAgICAgICAgbGV0IGFsbF9wcmljZXMgPSBbXTtcclxuICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XHJcbiAgICAgICAgICAgIHZhcmlhbnQuc2FsZXByaWNlICYmIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnNhbGVwcmljZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCFhbGxfcHJpY2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1pbl9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSk7XHJcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcclxuICAgICAgICByZXR1cm4gbWluX3ByaWNlID09IG1heF9wcmljZSA/IG1heF9wcmljZS50b1N0cmluZygpIDogbWluX3ByaWNlICsgJyAtICcgKyBtYXhfcHJpY2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpblJhbmdlID0gKHF1YW50aXR5LCBtaW4sIG1heCkgPT4gKChxdWFudGl0eSAtIG1pbikgKiAocXVhbnRpdHkgLSBtYXgpIDw9IDApXHJcblxyXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVF1YW50aXR5ID0gKHF1YW50aXR5OiBudW1iZXIpID0+IHtcclxuICAgICAgICBjb25zdCBhY3R1YWxRdWFudGl0eSA9IHRoaXMuY2FydFNlcnZpY2UuZ2V0Q291bnRGcm9tSXRlbUluQ2FydCh0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xyXG4gICAgICAgIGNvbnN0IGFzb2NpYXRlZERhdGEgPSB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdMYSBjYW50aWRhZCBxdWUgbGxlZ286ICcsIHF1YW50aXR5LCAnIHkgbGEgY2FudGlkYWQgYWN0dWFsOiAnLCBhY3R1YWxRdWFudGl0eSk7XHJcbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA+IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21heGltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5IH0pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKChhY3R1YWxRdWFudGl0eSArIHF1YW50aXR5KSA8IGFzb2NpYXRlZERhdGEubWluaW11bUl0ZW1zUXVhbnRpdHkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzID0gKHByaWNlOiBudW1iZXIpOiBib29sZWFuID0+IHtcclxuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5iYWxhbmNlQ3VzdG9tZXIuYWxsb3dBbnlQYXltZW50TWV0aG9kKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFsYW5jZUN1c3RvbWVyLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJpY2UgPiB0aGlzLmJhbGFuY2VDdXN0b21lci5yZW1haW5pbmdDcmVkaXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdub3QtZW5vdWdoLWNyZWRpdHMnKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcblxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hDYXJ0RGF0YSA9ICgpID0+IHtcclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmdldFRvdGFsQW1vdW50KCkuc3Vic2NyaWJlKCh0b3RhbEFtb3VudCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmJhbGFuY2VDdXN0b21lciQuc3Vic2NyaWJlKChiYWxhbmNlQ3VzdG9tZXIpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5iYWxhbmNlQ3VzdG9tZXIgPSBiYWxhbmNlQ3VzdG9tZXI7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIEN1YW5kbyBoYXlhIG1vZGVsb3MgZGUgcmVzcHVlc3RhLCB2YWxpZGFtb3MgcXVlIG5vIHNlIGludGVudGUgY2FyZ2FyIHVuIHByb2R1Y3RvIGluY29tcGxldG9cclxuICAgIHByaXZhdGUgaXNQcm9kdWN0VmFsaWQgPSAocHJvZHVjdDogUHJvZHVjdCkgPT4gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcclxuICAgICAqIFxyXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgdW5hIGxpc3RhIGZpbHRyYWRhIGRlIGxhcyB2YXJpYW50ZXMgcXVlIGVzdGFuIHNlbGVjY2lvbmFkYXNcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYXJpYW50c1NlbGVjdGVkKG9wdGlvbnM6IGFueSwgb3B0aW9uc0V4Y2VwdGlvbjogQXJyYXk8YW55Pik6IEFycmF5PE9iamVjdD4ge1xyXG5cclxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IFtdO1xyXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgaWYgKHYudmFsdWVzICYmIHYudmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgdi52YWx1ZXMuZm9yRWFjaCh2YWwgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwuc2VsZWN0ZWQgJiYgIW9wdGlvbnNFeGNlcHRpb24uZmluZChvcCA9PiBvcC50b1VwcGVyQ2FzZSgpID09IHYuY29kZS50b1VwcGVyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50c1NlbGVjdGVkW3YuY29kZV0gPSB2YWwubmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB2YXJpYW50c1NlbGVjdGVkO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcclxuICAgICAqIEBwYXJhbSB2YXJpYW50cyBUb2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGRlbCBwcm9kdWN0b1xyXG4gICAgICogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSB0b2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGEgc2VsZWNjaW9uIHkgc3Ugc3RvY2tcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFZhcmlhbnRzQXZhaWxhYmxlKG9wdGlvbnM6IGFueSwgdmFyaWFudHM6IGFueSwgb3B0aW9uc0V4Y2VwdGlvbjogQXJyYXk8YW55Pik6IGFueSB7XHJcblxyXG4gICAgICAgIGxldCB2YXJpYW50c1NlbGVjdGVkID0gdGhpcy5nZXRWYXJpYW50c1NlbGVjdGVkKG9wdGlvbnMsIG9wdGlvbnNFeGNlcHRpb24pO1xyXG5cclxuICAgICAgICBsZXQgdmFyaWFudHNBdmFpbGFibGUgPSBbXTtcclxuXHJcbiAgICAgICAgdmFyaWFudHMubWFwKHYgPT4ge1xyXG5cclxuICAgICAgICAgICAgbGV0IGF1eCA9IHt9O1xyXG4gICAgICAgICAgICBpZiAodi5vcHRpb25zICYmIHYub3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIHYub3B0aW9ucy5tYXAob3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYXV4LCBvcCwgeyBzdG9jazogdi5zdG9jayB9KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdmFyaWFudHNBdmFpbGFibGUucHVzaChhdXgpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzQXZhaWxhYmxlLmZpbHRlcih2YSA9PiB0aGlzLmNvbnN0YW50cy5jb250YWluc0FsbCh7IC4uLnZhcmlhbnRzU2VsZWN0ZWQgfSwgdmEpKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgdmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcclxuICAgICAqIEBwYXJhbSBjb2RlIENvZGlnbyBkZSBsYSB2YXJpYW50ZSBhIGJ1c2NhclxyXG4gICAgICogQHBhcmFtIG5hbWUgbm9tYnJlIGRlIGxhIHZhcmlhbnRlIGEgYnVzY2FyXHJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgdmFyaWFudGVzIGRlbCBwcm9kdWN0b1xyXG4gICAgICogXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gYnVzY2EgZW4gbGEgbGlzdGEgZGUgdmFyaWFudGVzIGRpc3BvbmlibGVzIHNpIGhheSBkZSBlc2UgY29kaWdvLCBlc2Ugbm9tYnJlIHkgY29uIHN0b2NrIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhpc3RWYXJpYW50QW5kSGFzU3RvY2sob3B0aW9ucywgY29kZSwgbmFtZSwgdmFyaWFudHMsIG9wdGlvbnNFeGNlcHRpb24gPSBbXSk6IGJvb2xlYW4ge1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbikuZmluZCh2YSA9PlxyXG4gICAgICAgICAgICB2YS5oYXNPd25Qcm9wZXJ0eShjb2RlKSAmJiB2YVtjb2RlXSA9PT0gbmFtZSAmJiB2YS5zdG9jayA+IDApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwcm9kdWN0IHByb2R1Y3RvIGVsIGN1YWwgc2UgcXVpZXJlIGRlc2RvYmxhciBwb3IgdmFyaWFudGVzIHBvciB1bmEgb3BjacOzbi5cclxuICAgICAqIEBwYXJhbSB3aXRoT3B0aW9uICd0eXBlJyB0aXBvIGRlIG9wY2nDs24sIGNvZGU6IGPDs2RpZ28gZGUgbGEgb3BjacOzbi4gJ2RlZmF1bHRGaXJzdE9wdGlvbic6IGVuIGNhc28gZGUgcXVlIG5vIHNlIHB1ZWRhIGRlc2RvYmxhciBwb3IgbGEgb3BjacOzbiBpbmRpY2FkYSBzaSBlbCB2YWxvciBlcyB2ZXJkYWRlcm8gc2UgaW50ZW50YXJhIGRlc2RvYmxhciBwb3IgbGEgcHJpbWVyYSBvcGNpw7NuIGFzb2NpYWRhIGFsIHByb2R1Y3RvLlxyXG4gICAgICogJ2NoZWNrSWZTdG9jayc6IGVuIGNhc28gZGUgcXVlIGVzdGEgdmFsb3Igc2VhIHZlcmRhZGVybyBzZSByZWFsaXphIHVuIGNvbnRyb2wgZGUgcXVlIGxhIHZhcmlhbnRlcyBjdWVudGVuIGNvbiBzdG9jayBwYXJhIHNlciB1biBwcm9kdWN0byBkZXNkb2JsYWRvIHBvciBsYSB2YXJpYW50ZSwgc2kgZWwgdmFsb3IgZXMgZmFsc28gbm8gc2UgcmVhbGl6YSBkaWNobyBjb250cm9sIHkgZWwgcHJvZHVjdG8gc2UgZGVzZG9ibGFyYSBjb24gc3RvY2sgZW4gMC5cclxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGVsIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlIHNvbGljaXRhZGEuXHJcbiAgICAgKiAob3BjacOzbiBwb3IgZGVmZWN0byBxdWUgc2UgaW50ZW50YSBoYWNlciBlbCBkZXNkb2JsYW1pZW50byAnY29sb3InLCBvIGJpZW4gc2kgZW4gbGUgcGFyw6FtZXRybyB3aXRoT3B0aW9uIGVsIGF0cmlidXRvICdkZWZhdWx0Rmlyc3RPcHRpb24nIGVzIHZlcmRhZGVybyBzZSBkZXNkb2JsYSBwb3IgbGEgcHJpbWVyYSBvcGNpw7NuIGFzb2NpYWRhIGFsIHByb2R1Y3RvICkgXHJcbiAgICAgKi9cclxuICAgIGdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0LCB3aXRoT3B0aW9uPzogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50KFtwcm9kdWN0XSwgd2l0aE9wdGlvbilcclxuICAgIH1cclxuXHJcbn0iXX0=
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { Injectable } from '@angular/core';
17
+ import { BehaviorSubject } from 'rxjs';
18
+ import { ProductsService } from './products.service';
19
+ import { CartService } from '../cart.service';
20
+ import { ToastService } from '../../utils/toast.service';
21
+ import { Constants } from '../../core.consts';
22
+ import _ from "lodash";
23
+ import { AnalyticsService } from '../analytics.service';
24
+ import { CurrencyService } from '../currency.service';
25
+ let ProductDetailService = class ProductDetailService {
26
+ constructor(productsService, cartService, toastrService, constants, analyticsService, currencyService) {
27
+ this.productsService = productsService;
28
+ this.cartService = cartService;
29
+ this.toastrService = toastrService;
30
+ this.constants = constants;
31
+ this.analyticsService = analyticsService;
32
+ this.currencyService = currencyService;
33
+ this.productSubject = new BehaviorSubject({});
34
+ this.optionsSubject = new BehaviorSubject({});
35
+ this.asociatedDataSubject = new BehaviorSubject({ price: '', stock: 0, picture: '' });
36
+ this.variants = [];
37
+ this.product$ = this.productSubject.asObservable();
38
+ this.options$ = this.optionsSubject.asObservable();
39
+ this.asociatedData$ = this.asociatedDataSubject.asObservable();
40
+ this.balanceCustomer = null;
41
+ /**
42
+ * @param code Identificador del producto
43
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
44
+ *
45
+ * Carga el producto solicitado asyncronicamente sin respuesta
46
+ */
47
+ this.loadProduct = (code, variant = false) => this.productsService.getSpecificProduct(code, variant).toPromise().then(res => variant ? this.initialize(res, code) : this.initialize(res), err => this.productSubject.next(null));
48
+ /**
49
+ * @param product_id Identificador del producto
50
+ * @param variant Indica si se está solicitando un producto por su codigo, o por el codigo correspondiente a una de sus variantes
51
+ * @async
52
+ *
53
+ * A diferencia del metodo loadProduct, este retorna un valor cuando termina
54
+ */
55
+ this.getProduct = (product_id, variant = false) => __awaiter(this, void 0, void 0, function* () {
56
+ let result = yield this.productsService.getSpecificProduct(product_id, variant).toPromise();
57
+ if (!result || result.error)
58
+ this.productSubject.next(null);
59
+ else
60
+ variant ? this.initialize(result, product_id) : this.initialize(result);
61
+ return true;
62
+ });
63
+ this.initialize = (product, variant_code) => {
64
+ this.productSubject.next(product);
65
+ this.optionsSubject.next(this.getOptions());
66
+ variant_code ? this.updateVariants(variant_code) : this.updateVariants();
67
+ this.variants.length && this.generateAsociatedDataFromVariants();
68
+ this.fetchCartData();
69
+ //this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
70
+ // variant_code && this.analyticsService.callEvent('view_item', { ...product, currency: this.constants.currency.code })
71
+ };
72
+ this.setProduct = (product) => this.isProductValid(product) && this.initialize(product);
73
+ this.isReady = () => this.variants.length == 1;
74
+ this.setOption = (option_code, option_value) => {
75
+ let options = this.optionsSubject.value;
76
+ let option = options.find(element => element.code == option_code).values.find(value => value.name == option_value);
77
+ option.selected = !option.selected;
78
+ options.find(element => element.code == option_code).values.forEach(value => { if (value.name != option.name)
79
+ value.selected = false; });
80
+ this.optionsSubject.next(options);
81
+ this.updateVariants();
82
+ if (this.variants.length > 0) {
83
+ // Habilitar todos los botones con la clase 'addCartButton'
84
+ const submitButtons = document.querySelectorAll('.addCartButton');
85
+ submitButtons.forEach(button => {
86
+ button.disabled = false;
87
+ });
88
+ this.generateAsociatedDataFromVariants();
89
+ }
90
+ else {
91
+ this.toastrService.show('selection-not-available');
92
+ // Deshabilitar todos los botones con la clase 'submit-button'
93
+ const submitButtons = document.querySelectorAll('.addCartButton');
94
+ submitButtons.forEach(button => {
95
+ button.disabled = true;
96
+ });
97
+ }
98
+ };
99
+ this.changePicture = (picture) => {
100
+ let data = this.asociatedDataSubject.value;
101
+ data.picture = picture;
102
+ this.asociatedDataSubject.next(data);
103
+ };
104
+ this.handleError = (error) => {
105
+ // Whathever we need to do with error
106
+ };
107
+ this.addToCartPromise = (quantity) => __awaiter(this, void 0, void 0, function* () {
108
+ quantity = parseInt(quantity);
109
+ if (!this.variants.length) {
110
+ return { error: true, message: 'cant-buy' };
111
+ }
112
+ let product_selected = _.clone(this.productSubject.value);
113
+ if (this.variants.length > 1 || this.variants.length == 0 || this.asociatedDataSubject.value.stock == 0) {
114
+ if (this.variants.length == 0)
115
+ return { error: true, message: 'no-variants' };
116
+ else if (this.variants.length > 1 && this.asociatedDataSubject.value.stock > 0)
117
+ return { error: true, message: 'variants-left' };
118
+ else if (this.variants.length != 0 && this.asociatedDataSubject.value.stock == 0)
119
+ return { error: true, message: 'out-of-stock' };
120
+ }
121
+ if (!this.validateQuantity(quantity))
122
+ return;
123
+ let result = yield this.cartService.addToCartPromise(this.makeAffordableProduct(product_selected), quantity, this.variants[0].code);
124
+ return (result && !(result.error));
125
+ });
126
+ this.getOptions = (product_received) => {
127
+ let product = product_received || this.productSubject.value;
128
+ let options = [];
129
+ product.options.forEach(element => {
130
+ options.push(this.toOption(element));
131
+ });
132
+ return options;
133
+ };
134
+ this.toOption = (preoption) => {
135
+ return {
136
+ name: preoption.label,
137
+ code: preoption.code,
138
+ type: preoption.type,
139
+ values: preoption.values.map(value => ({ name: value.code, description: value.name, image: value.image, mobileImage: value.mobileImage, selected: false }))
140
+ };
141
+ };
142
+ this.updateVariants = (code) => {
143
+ let variants = this.productSubject.value.variants;
144
+ if (!code) {
145
+ this.optionsSubject.value.forEach(option => {
146
+ option.values.forEach(value => {
147
+ if (value.selected) {
148
+ variants = variants.filter(variant => {
149
+ return variant.options.some(variant_option => {
150
+ return (option.code in variant_option && variant_option[option.code] == value.name);
151
+ });
152
+ });
153
+ }
154
+ });
155
+ });
156
+ }
157
+ else {
158
+ variants = variants.filter(variant => variant.code == code);
159
+ }
160
+ this.variants = variants;
161
+ code && this.updateOptions();
162
+ };
163
+ this.updateOptions = () => {
164
+ let { options } = this.variants.length && this.variants[0];
165
+ options && options.forEach(option => Object.keys(option).forEach(key => this.setOption(key, option[key])));
166
+ };
167
+ this.generateAsociatedDataFromVariants = () => {
168
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
169
+ let asociated = {};
170
+ if (this.isReady()) {
171
+ asociated.stock = this.variants[0].stock;
172
+ asociated.price = this.variants[0].price.toString();
173
+ asociated.saleprice = this.variants[0].saleprice && this.variants[0].saleprice.toString() || undefined;
174
+ asociated.discount = ((_a = this.variants[0]) === null || _a === void 0 ? void 0 : _a.discount) || undefined;
175
+ asociated.properties = this.variants[0].properties ? this.beautifyProperties(this.variants[0].properties) : undefined;
176
+ asociated.uniqueExternalCode = ((_b = this.variants[0]) === null || _b === void 0 ? void 0 : _b.uniqueExternalCode) || undefined;
177
+ asociated.multipleQuantity = ((_c = this.variants[0]) === null || _c === void 0 ? void 0 : _c.multipleQuantity) || undefined;
178
+ }
179
+ else {
180
+ asociated.price = this.cratePrice();
181
+ asociated.saleprice = this.crateSalePrice();
182
+ asociated.stock = (this.variants.map(variant => variant.stock)).reduce((a, b) => a + b);
183
+ asociated.discount = this.crateDiscount();
184
+ }
185
+ ('images' in this.variants[0] && this.variants[0].images.length > 0)
186
+ ? asociated.picture = this.variants[0].images[0]
187
+ : asociated.picture = (this.asociatedDataSubject.value.picture || this.productSubject.value.picturesdefault[0]);
188
+ asociated.maximumAmount = ((_d = this.variants[0]) === null || _d === void 0 ? void 0 : _d.maximumAmount) || 0;
189
+ asociated.minimumAmount = ((_e = this.variants[0]) === null || _e === void 0 ? void 0 : _e.minimumAmount) || 0;
190
+ asociated.maximumItemsQuantity = ((_f = this.variants[0]) === null || _f === void 0 ? void 0 : _f.stock) > 0 && 'maximumItemsQuantity' in this.variants[0] ? (_g = this.variants[0]) === null || _g === void 0 ? void 0 : _g.maximumItemsQuantity : (_h = this.variants[0]) === null || _h === void 0 ? void 0 : _h.stock;
191
+ asociated.minimumItemsQuantity = ((_j = this.variants[0]) === null || _j === void 0 ? void 0 : _j.stock) > 0 && 'minimumItemsQuantity' in this.variants[0]
192
+ && ((_k = this.variants[0]) === null || _k === void 0 ? void 0 : _k.minimumItemsQuantity) > 0 ? (_l = this.variants[0]) === null || _l === void 0 ? void 0 : _l.minimumItemsQuantity : (((_m = this.variants[0]) === null || _m === void 0 ? void 0 : _m.multipleQuantity) ? (_o = this.variants[0]) === null || _o === void 0 ? void 0 : _o.multipleQuantity : 1);
193
+ asociated.finalConsumer = {
194
+ finalConsumerPrice: (_p = this.variants[0]) === null || _p === void 0 ? void 0 : _p.final_consumer_price,
195
+ originalFinalConsumerPrice: (_q = this.variants[0]) === null || _q === void 0 ? void 0 : _q.original_final_consumer_price,
196
+ };
197
+ asociated.taxes = {
198
+ taxIncluded: (_r = this.variants[0]) === null || _r === void 0 ? void 0 : _r.taxIncluded,
199
+ taxCategory: (_s = this.variants[0]) === null || _s === void 0 ? void 0 : _s.taxCategory,
200
+ };
201
+ asociated.taxeAmount = ((_t = this.variants[0]) === null || _t === void 0 ? void 0 : _t.taxes) || undefined;
202
+ asociated.taxRate = ((_u = this.variants[0]) === null || _u === void 0 ? void 0 : _u.taxRate) || undefined;
203
+ asociated.priceWithoutTaxes = ((_v = this.variants[0]) === null || _v === void 0 ? void 0 : _v.priceWithoutTaxes) || undefined;
204
+ this.asociatedDataSubject.next(asociated);
205
+ };
206
+ /**
207
+ * @description Recibe las propiedades de una variante y por cada item arma un objeto con
208
+ * el name=clave y value=valor de ese item.
209
+ * @param properties
210
+ * @returns Un arreglo con las propiedades de la forma { name = ... , value = ...}
211
+ */
212
+ this.beautifyProperties = (properties) => {
213
+ let beautifyData = [];
214
+ properties.forEach(prop => {
215
+ for (let key in prop) {
216
+ beautifyData.push({ name: key, value: prop[key] });
217
+ }
218
+ });
219
+ return beautifyData;
220
+ };
221
+ this.crateDiscount = () => {
222
+ try {
223
+ let all_discount = '';
224
+ this.variants.forEach(variant => {
225
+ variant.discount && (all_discount = all_discount + ', ' + variant.discount);
226
+ });
227
+ if (all_discount == '') {
228
+ return undefined;
229
+ }
230
+ return all_discount;
231
+ }
232
+ catch (error) {
233
+ return undefined;
234
+ }
235
+ };
236
+ this.cratePrice = () => {
237
+ let min_price = 0;
238
+ let max_price = 0;
239
+ let all_prices = [];
240
+ this.variants.forEach(variant => {
241
+ all_prices.push(variant.price);
242
+ });
243
+ min_price = all_prices.reduce((a, b) => Math.min(a, b));
244
+ max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
245
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
246
+ };
247
+ this.crateSalePrice = () => {
248
+ let min_price = 0;
249
+ let max_price = 0;
250
+ let all_prices = [];
251
+ this.variants.forEach(variant => {
252
+ variant.saleprice && all_prices.push(variant.saleprice);
253
+ });
254
+ if (!all_prices.length) {
255
+ return undefined;
256
+ }
257
+ min_price = all_prices.reduce((a, b) => Math.min(a, b));
258
+ max_price = all_prices.reduce((a, b) => Math.max(a, b), 0);
259
+ return min_price == max_price ? max_price.toString() : min_price + ' - ' + max_price;
260
+ };
261
+ this.inRange = (quantity, min, max) => ((quantity - min) * (quantity - max) <= 0);
262
+ this.validateQuantity = (quantity) => {
263
+ const actualQuantity = this.cartService.getCountFromItemInCart(this.variants[0].code);
264
+ const asociatedData = this.asociatedDataSubject.value;
265
+ console.log('La cantidad que llego: ', quantity, ' y la cantidad actual: ', actualQuantity);
266
+ if ((actualQuantity + quantity) > asociatedData.maximumItemsQuantity) {
267
+ this.toastrService.show('maximum-items-quantity', { quantity: asociatedData.maximumItemsQuantity });
268
+ return false;
269
+ }
270
+ if ((actualQuantity + quantity) < asociatedData.minimumItemsQuantity) {
271
+ this.toastrService.show('minimum-items-quantity', { quantity: asociatedData.minimumItemsQuantity });
272
+ return false;
273
+ }
274
+ return true;
275
+ };
276
+ this.validatePriceAndCredits = (price) => {
277
+ if (this.balanceCustomer === null) {
278
+ return true;
279
+ }
280
+ if (this.balanceCustomer.allowAnyPaymentMethod) {
281
+ return true;
282
+ }
283
+ if (this.balanceCustomer.remainingCredits === undefined) {
284
+ return false;
285
+ }
286
+ if (price > this.balanceCustomer.remainingCredits) {
287
+ this.toastrService.show('not-enough-credits');
288
+ return false;
289
+ }
290
+ return true;
291
+ };
292
+ this.fetchCartData = () => {
293
+ this.cartService.getTotalAmount().subscribe((totalAmount) => {
294
+ this.currentTotalAmount = totalAmount;
295
+ });
296
+ this.cartService.balanceCustomer$.subscribe((balanceCustomer) => {
297
+ this.balanceCustomer = balanceCustomer;
298
+ });
299
+ };
300
+ // Cuando haya modelos de respuesta, validamos que no se intente cargar un producto incompleto
301
+ this.isProductValid = (product) => true;
302
+ /**
303
+ *
304
+ * @param product producto el cual se quiere desdoblar por variantes por una opción.
305
+ * @param withOption 'type' tipo de opción, code: código de la opción. 'defaultFirstOption': en caso de que no se pueda desdoblar por la opción indicada si el valor es verdadero se intentara desdoblar por la primera opción asociada al producto.
306
+ * 'checkIfStock': en caso de que esta valor sea verdadero se realiza un control de que la variantes cuenten con stock para ser un producto desdoblado por la variante, si el valor es falso no se realiza dicho control y el producto se desdoblara con stock en 0.
307
+ * @returns arreglo con el producto desdoblado por la variante solicitada.
308
+ * (opción por defecto que se intenta hacer el desdoblamiento 'color', o bien si en le parámetro withOption el atributo 'defaultFirstOption' es verdadero se desdobla por la primera opción asociada al producto )
309
+ */
310
+ this.getProductWithUniqueVariant = (product, withOption) => {
311
+ return this.productsService.getProductsWithUniqueVariant([product], withOption);
312
+ };
313
+ }
314
+ /**
315
+ * @description agrega/actualiza un item en el carrito
316
+ * @param quantity cantidad a agregar
317
+ * @param variant_code **(opcional)** codigo de la variante seleccionada del producto.
318
+ * @returns
319
+ */
320
+ addToCart(quantity, variant_code) {
321
+ quantity = parseInt(quantity);
322
+ if (!this.variants.length) {
323
+ this.toastrService.show('cant-buy');
324
+ return;
325
+ }
326
+ let product_selected = _.clone(this.productSubject.value);
327
+ let variant;
328
+ switch (this.variants.length) {
329
+ case 0:
330
+ this.toastrService.show('no-variants');
331
+ break;
332
+ case 1:
333
+ this.asociatedDataSubject.value.stock == 0 ?
334
+ this.toastrService.show('out-of-stock') :
335
+ variant = this.variants[0];
336
+ break;
337
+ default:
338
+ if (variant_code) {
339
+ variant = this.variants.find(variant => variant.code === variant_code);
340
+ if (variant.stock == 0) {
341
+ this.toastrService.show('out-of-stock');
342
+ variant = undefined;
343
+ }
344
+ }
345
+ else {
346
+ this.toastrService.show('variants-left');
347
+ }
348
+ break;
349
+ }
350
+ if (!variant)
351
+ return;
352
+ if (!this.validateQuantity(quantity))
353
+ return;
354
+ const priceToValidate = product_selected.saleprice ? product_selected.saleprice * quantity : product_selected.price * quantity;
355
+ if (!this.validatePriceAndCredits(priceToValidate))
356
+ return;
357
+ this.cartService.addToCart(this.makeAffordableProduct(product_selected), quantity, variant.code);
358
+ }
359
+ ;
360
+ makeAffordableProduct(product_selected) {
361
+ product_selected.price = parseFloat(this.asociatedDataSubject.value.price);
362
+ product_selected.saleprice = parseFloat(this.asociatedDataSubject.value.price);
363
+ product_selected.options = {};
364
+ this.variants[0].options.forEach(option => product_selected.options = Object.assign(Object.assign({}, product_selected.options), option));
365
+ return product_selected;
366
+ }
367
+ /**
368
+ *
369
+ * @param options Array de Variantes y sus valores
370
+ *
371
+ * @description Retorna una lista filtrada de las variantes que estan seleccionadas
372
+ */
373
+ getVariantsSelected(options, optionsException) {
374
+ let variantsSelected = [];
375
+ options.forEach(v => {
376
+ if (v.values && v.values.length) {
377
+ v.values.forEach(val => {
378
+ if (val.selected && !optionsException.find(op => op.toUpperCase() == v.code.toUpperCase())) {
379
+ variantsSelected[v.code] = val.name;
380
+ }
381
+ });
382
+ }
383
+ });
384
+ return variantsSelected;
385
+ }
386
+ /**
387
+ *
388
+ * @param options Array de Variantes y sus valores
389
+ * @param variants Todas las variantes disponibles del producto
390
+ *
391
+ * @description retorna todas las variantes disponibles a seleccion y su stock
392
+ */
393
+ getVariantsAvailable(options, variants, optionsException) {
394
+ let variantsSelected = this.getVariantsSelected(options, optionsException);
395
+ let variantsAvailable = [];
396
+ variants.map(v => {
397
+ let aux = {};
398
+ if (v.options && v.options.length) {
399
+ v.options.map(op => {
400
+ Object.assign(aux, op, { stock: v.stock });
401
+ });
402
+ }
403
+ variantsAvailable.push(aux);
404
+ });
405
+ return variantsAvailable.filter(va => this.constants.containsAll(Object.assign({}, variantsSelected), va));
406
+ }
407
+ /**
408
+ *
409
+ * @param options Array de variantes y sus valores
410
+ * @param code Codigo de la variante a buscar
411
+ * @param name nombre de la variante a buscar
412
+ * @param variants variantes del producto
413
+ *
414
+ * @description busca en la lista de variantes disponibles si hay de ese codigo, ese nombre y con stock
415
+ */
416
+ existVariantAndHasStock(options, code, name, variants, optionsException = []) {
417
+ return this.getVariantsAvailable(options, variants, optionsException).find(va => va.hasOwnProperty(code) && va[code] === name && va.stock > 0);
418
+ }
419
+ };
420
+ ProductDetailService.ctorParameters = () => [
421
+ { type: ProductsService },
422
+ { type: CartService },
423
+ { type: ToastService },
424
+ { type: Constants },
425
+ { type: AnalyticsService },
426
+ { type: CurrencyService }
427
+ ];
428
+ ProductDetailService = __decorate([
429
+ Injectable()
430
+ ], ProductDetailService);
431
+ export { ProductDetailService };
432
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1kZXRhaWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWVhc3ljb21tZXJjZS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9wcm9kdWN0cy9wcm9kdWN0LWRldGFpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBeUIsTUFBTSxNQUFNLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHdEQsSUFBYSxvQkFBb0IsR0FBakMsTUFBYSxvQkFBb0I7SUFjN0IsWUFDWSxlQUFnQyxFQUFVLFdBQXdCLEVBQVUsYUFBMkIsRUFDdkcsU0FBb0IsRUFBUyxnQkFBa0MsRUFBUyxlQUFnQztRQUR4RyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQ3ZHLGNBQVMsR0FBVCxTQUFTLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBZDVHLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQVUsRUFBRSxDQUFDLENBQUM7UUFDbEQsbUJBQWMsR0FBRyxJQUFJ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O1lBQTBCLGVBQWU7O0FBaEIzRyxvQkFBb0I7SUFEaEMsVUFBVSxFQUFFO0dBQ0Esb0JBQW9CLENBK2JoQztTQS9iWSxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIHBhcnRpdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgUHJvZHVjdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcHJvZHVjdCc7XG5pbXBvcnQgeyBQcm9kdWN0c1NlcnZpY2UgfSBmcm9tICcuL3Byb2R1Y3RzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQgeyBBbmFseXRpY3NTZXJ2aWNlIH0gZnJvbSAnLi4vYW5hbHl0aWNzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcGFyYW1zSW50ZXJmYWNlcy9wYXJhbXNQcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50JztcbmltcG9ydCB7IEN1cnJlbmN5U2VydmljZSB9IGZyb20gJy4uL2N1cnJlbmN5LnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvZHVjdERldGFpbFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBwcm9kdWN0U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJvZHVjdD4oe30pO1xuICAgIHByaXZhdGUgb3B0aW9uc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oe30pO1xuICAgIHByaXZhdGUgYXNvY2lhdGVkRGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4oeyBwcmljZTogJycsIHN0b2NrOiAwLCBwaWN0dXJlOiAnJyB9KTtcblxuICAgIHByaXZhdGUgdmFyaWFudHMgPSBbXVxuXG4gICAgcHVibGljIHByb2R1Y3QkID0gdGhpcy5wcm9kdWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgb3B0aW9ucyQgPSB0aGlzLm9wdGlvbnNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBhc29jaWF0ZWREYXRhJCA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHJpdmF0ZSBjdXJyZW50VG90YWxBbW91bnQ6IG51bWJlcjtcbiAgICBwcml2YXRlIGJhbGFuY2VDdXN0b21lcjogYW55ID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHByb2R1Y3RzU2VydmljZTogUHJvZHVjdHNTZXJ2aWNlLCBwcml2YXRlIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSwgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgY29uc3RhbnRzOiBDb25zdGFudHMsIHB1YmxpYyBhbmFseXRpY3NTZXJ2aWNlOiBBbmFseXRpY3NTZXJ2aWNlLCBwdWJsaWMgY3VycmVuY3lTZXJ2aWNlOiBDdXJyZW5jeVNlcnZpY2UpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAqIEBwYXJhbSBjb2RlIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXG4gICAgKiBAcGFyYW0gdmFyaWFudCBJbmRpY2Egc2kgc2UgZXN0w6Egc29saWNpdGFuZG8gdW4gcHJvZHVjdG8gcG9yIHN1IGNvZGlnbywgbyBwb3IgZWwgY29kaWdvIGNvcnJlc3BvbmRpZW50ZSBhIHVuYSBkZSBzdXMgdmFyaWFudGVzXG4gICAgKiAgXG4gICAgKiBDYXJnYSBlbCBwcm9kdWN0byBzb2xpY2l0YWRvIGFzeW5jcm9uaWNhbWVudGUgc2luIHJlc3B1ZXN0YSBcbiAgICAqL1xuICAgIGxvYWRQcm9kdWN0ID0gKGNvZGUsIHZhcmlhbnQ6IGJvb2xlYW4gPSBmYWxzZSkgPT5cbiAgICAgICAgdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0U3BlY2lmaWNQcm9kdWN0KGNvZGUsIHZhcmlhbnQpLnRvUHJvbWlzZSgpLnRoZW4oXG4gICAgICAgICAgICByZXMgPT4gdmFyaWFudCA/IHRoaXMuaW5pdGlhbGl6ZShyZXMsIGNvZGUpIDogdGhpcy5pbml0aWFsaXplKHJlcyksXG4gICAgICAgICAgICBlcnIgPT4gdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIClcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBwcm9kdWN0X2lkIElkZW50aWZpY2Fkb3IgZGVsIHByb2R1Y3RvXG4gICAgICogQHBhcmFtIHZhcmlhbnQgSW5kaWNhIHNpIHNlIGVzdMOhIHNvbGljaXRhbmRvIHVuIHByb2R1Y3RvIHBvciBzdSBjb2RpZ28sIG8gcG9yIGVsIGNvZGlnbyBjb3JyZXNwb25kaWVudGUgYSB1bmEgZGUgc3VzIHZhcmlhbnRlc1xuICAgICAqIEBhc3luY1xuICAgICAqICBcbiAgICAgKiBBIGRpZmVyZW5jaWEgZGVsIG1ldG9kbyBsb2FkUHJvZHVjdCwgZXN0ZSByZXRvcm5hIHVuIHZhbG9yIGN1YW5kbyB0ZXJtaW5hIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3QgPSBhc3luYyAocHJvZHVjdF9pZCwgdmFyaWFudDogYm9vbGVhbiA9IGZhbHNlKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLnByb2R1Y3RzU2VydmljZS5nZXRTcGVjaWZpY1Byb2R1Y3QocHJvZHVjdF9pZCwgdmFyaWFudCkudG9Qcm9taXNlKCk7XG4gICAgICAgIGlmICghcmVzdWx0IHx8IHJlc3VsdC5lcnJvcikgdGhpcy5wcm9kdWN0U3ViamVjdC5uZXh0KG51bGwpO1xuICAgICAgICBlbHNlIHZhcmlhbnQgPyB0aGlzLmluaXRpYWxpemUocmVzdWx0LCBwcm9kdWN0X2lkKSA6IHRoaXMuaW5pdGlhbGl6ZShyZXN1bHQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRpYWxpemUgPSAocHJvZHVjdCwgdmFyaWFudF9jb2RlPykgPT4ge1xuICAgICAgICB0aGlzLnByb2R1Y3RTdWJqZWN0Lm5leHQocHJvZHVjdCk7XG4gICAgICAgIHRoaXMub3B0aW9uc1N1YmplY3QubmV4dCh0aGlzLmdldE9wdGlvbnMoKSlcbiAgICAgICAgdmFyaWFudF9jb2RlID8gdGhpcy51cGRhdGVWYXJpYW50cyh2YXJpYW50X2NvZGUpIDogdGhpcy51cGRhdGVWYXJpYW50cygpO1xuICAgICAgICB0aGlzLnZhcmlhbnRzLmxlbmd0aCAmJiB0aGlzLmdlbmVyYXRlQXNvY2lhdGVkRGF0YUZyb21WYXJpYW50cygpO1xuICAgICAgICB0aGlzLmZldGNoQ2FydERhdGEoKVxuICAgICAgICAvL3RoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbScsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RhbnRzLmN1cnJlbmN5LmNvZGUgfSlcbiAgICAgICAgLy8gdmFyaWFudF9jb2RlICYmIHRoaXMuYW5hbHl0aWNzU2VydmljZS5jYWxsRXZlbnQoJ3ZpZXdfaXRlbScsIHsgLi4ucHJvZHVjdCwgY3VycmVuY3k6IHRoaXMuY29uc3RhbnRzLmN1cnJlbmN5LmNvZGUgfSlcbiAgICB9XG5cbiAgICBzZXRQcm9kdWN0ID0gKHByb2R1Y3QpID0+IHRoaXMuaXNQcm9kdWN0VmFsaWQocHJvZHVjdCkgJiYgdGhpcy5pbml0aWFsaXplKHByb2R1Y3QpO1xuXG4gICAgaXNSZWFkeSA9ICgpID0+IHRoaXMudmFyaWFudHMubGVuZ3RoID09IDE7XG5cbiAgICBzZXRPcHRpb24gPSAob3B0aW9uX2NvZGUsIG9wdGlvbl92YWx1ZSkgPT4ge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMub3B0aW9uc1N1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBvcHRpb24gPSBvcHRpb25zLmZpbmQoZWxlbWVudCA9PiBlbGVtZW50LmNvZGUgPT0gb3B0aW9uX2NvZGUpLnZhbHVlcy5maW5kKHZhbHVlID0+IHZhbHVlLm5hbWUgPT0gb3B0aW9uX3ZhbHVlKTtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gIW9wdGlvbi5zZWxlY3RlZDtcbiAgICAgICAgb3B0aW9ucy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5jb2RlID09IG9wdGlvbl9jb2RlKS52YWx1ZXMuZm9yRWFjaChcbiAgICAgICAgICAgIHZhbHVlID0+IHsgaWYgKHZhbHVlLm5hbWUgIT0gb3B0aW9uLm5hbWUpIHZhbHVlLnNlbGVjdGVkID0gZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9wdGlvbnNTdWJqZWN0Lm5leHQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMudXBkYXRlVmFyaWFudHMoKTtcbiAgICAgICAgaWYgKHRoaXMudmFyaWFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSGFiaWxpdGFyIHRvZG9zIGxvcyBib3RvbmVzIGNvbiBsYSBjbGFzZSAnYWRkQ2FydEJ1dHRvbidcbiAgICAgICAgICAgIGNvbnN0IHN1Ym1pdEJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWRkQ2FydEJ1dHRvbicpO1xuICAgICAgICAgICAgc3VibWl0QnV0dG9ucy5mb3JFYWNoKGJ1dHRvbiA9PiB7XG4gICAgICAgICAgICAgICAgKGJ1dHRvbiBhcyBIVE1MQnV0dG9uRWxlbWVudCkuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUFzb2NpYXRlZERhdGFGcm9tVmFyaWFudHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdzZWxlY3Rpb24tbm90LWF2YWlsYWJsZScpO1xuXG4gICAgICAgICAgICAvLyBEZXNoYWJpbGl0YXIgdG9kb3MgbG9zIGJvdG9uZXMgY29uIGxhIGNsYXNlICdzdWJtaXQtYnV0dG9uJ1xuICAgICAgICAgICAgY29uc3Qgc3VibWl0QnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5hZGRDYXJ0QnV0dG9uJyk7XG4gICAgICAgICAgICBzdWJtaXRCdXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgICAgICAgICAoYnV0dG9uIGFzIEhUTUxCdXR0b25FbGVtZW50KS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgY2hhbmdlUGljdHVyZSA9IChwaWN0dXJlKSA9PiB7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZTtcbiAgICAgICAgZGF0YS5waWN0dXJlID0gcGljdHVyZTtcbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGRhdGEpO1xuICAgIH1cblxuICAgIGhhbmRsZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIFdoYXRoZXZlciB3ZSBuZWVkIHRvIGRvIHdpdGggZXJyb3JcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gYWdyZWdhL2FjdHVhbGl6YSB1biBpdGVtIGVuIGVsIGNhcnJpdG8gXG4gICAgICogQHBhcmFtIHF1YW50aXR5IGNhbnRpZGFkIGEgYWdyZWdhclxuICAgICAqIEBwYXJhbSB2YXJpYW50X2NvZGUgKioob3BjaW9uYWwpKiogY29kaWdvIGRlIGxhIHZhcmlhbnRlIHNlbGVjY2lvbmFkYSBkZWwgcHJvZHVjdG8uXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgYWRkVG9DYXJ0KHF1YW50aXR5LCB2YXJpYW50X2NvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgcXVhbnRpdHkgPSBwYXJzZUludChxdWFudGl0eSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ2NhbnQtYnV5Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHByb2R1Y3Rfc2VsZWN0ZWQgPSBfLmNsb25lKHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUpO1xuXG4gICAgICAgIGxldCB2YXJpYW50OiBhbnk7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCduby12YXJpYW50cycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCA/XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCdvdXQtb2Ytc3RvY2snKSA6XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB0aGlzLnZhcmlhbnRzWzBdXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGlmICh2YXJpYW50X2NvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudCA9IHRoaXMudmFyaWFudHMuZmluZCh2YXJpYW50ID0+IHZhcmlhbnQuY29kZSA9PT0gdmFyaWFudF9jb2RlKVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFudC5zdG9jayA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnb3V0LW9mLXN0b2NrJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyU2VydmljZS5zaG93KCd2YXJpYW50cy1sZWZ0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdmFyaWFudCkgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMudmFsaWRhdGVRdWFudGl0eShxdWFudGl0eSkpIHJldHVybjtcblxuICAgICAgICBjb25zdCBwcmljZVRvVmFsaWRhdGUgPSBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSA/IHByb2R1Y3Rfc2VsZWN0ZWQuc2FsZXByaWNlICogcXVhbnRpdHkgOiBwcm9kdWN0X3NlbGVjdGVkLnByaWNlICogcXVhbnRpdHk7XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZVByaWNlQW5kQ3JlZGl0cyhwcmljZVRvVmFsaWRhdGUpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0NhcnQodGhpcy5tYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZCksIHF1YW50aXR5LCB2YXJpYW50LmNvZGUpO1xuICAgIH07XG5cblxuXG4gICAgYWRkVG9DYXJ0UHJvbWlzZSA9IGFzeW5jIChxdWFudGl0eSkgPT4ge1xuICAgICAgICBxdWFudGl0eSA9IHBhcnNlSW50KHF1YW50aXR5KTtcbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdjYW50LWJ1eScgfTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcHJvZHVjdF9zZWxlY3RlZCA9IF8uY2xvbmUodGhpcy5wcm9kdWN0U3ViamVjdC52YWx1ZSk7XG4gICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA+IDEgfHwgdGhpcy52YXJpYW50cy5sZW5ndGggPT0gMCB8fCB0aGlzLmFzb2NpYXRlZERhdGFTdWJqZWN0LnZhbHVlLnN0b2NrID09IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCA9PSAwKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ25vLXZhcmlhbnRzJyB9O1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YXJpYW50cy5sZW5ndGggPiAxICYmIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPiAwKSByZXR1cm4geyBlcnJvcjogdHJ1ZSwgbWVzc2FnZTogJ3ZhcmlhbnRzLWxlZnQnIH07XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnZhcmlhbnRzLmxlbmd0aCAhPSAwICYmIHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUuc3RvY2sgPT0gMCkgcmV0dXJuIHsgZXJyb3I6IHRydWUsIG1lc3NhZ2U6ICdvdXQtb2Ytc3RvY2snIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRlUXVhbnRpdHkocXVhbnRpdHkpKSByZXR1cm47XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydFByb21pc2UodGhpcy5tYWtlQWZmb3JkYWJsZVByb2R1Y3QocHJvZHVjdF9zZWxlY3RlZCksIHF1YW50aXR5LCB0aGlzLnZhcmlhbnRzWzBdLmNvZGUpO1xuICAgICAgICByZXR1cm4gKHJlc3VsdCAmJiAhKHJlc3VsdC5lcnJvcikpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGdldE9wdGlvbnMgPSAocHJvZHVjdF9yZWNlaXZlZD86IFByb2R1Y3QpID0+IHtcbiAgICAgICAgbGV0IHByb2R1Y3QgPSBwcm9kdWN0X3JlY2VpdmVkIHx8IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWU7XG4gICAgICAgIGxldCBvcHRpb25zID0gW107XG4gICAgICAgIHByb2R1Y3Qub3B0aW9ucy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucy5wdXNoKHRoaXMudG9PcHRpb24oZWxlbWVudCkpO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvT3B0aW9uID0gKHByZW9wdGlvbikgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogcHJlb3B0aW9uLmxhYmVsLFxuICAgICAgICAgICAgY29kZTogcHJlb3B0aW9uLmNvZGUsXG4gICAgICAgICAgICB0eXBlOiBwcmVvcHRpb24udHlwZSxcbiAgICAgICAgICAgIHZhbHVlczogcHJlb3B0aW9uLnZhbHVlcy5tYXAodmFsdWUgPT4gKHsgbmFtZTogdmFsdWUuY29kZSwgZGVzY3JpcHRpb246IHZhbHVlLm5hbWUsIGltYWdlOiB2YWx1ZS5pbWFnZSwgbW9iaWxlSW1hZ2U6IHZhbHVlLm1vYmlsZUltYWdlLCBzZWxlY3RlZDogZmFsc2UgfSkpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VBZmZvcmRhYmxlUHJvZHVjdChwcm9kdWN0X3NlbGVjdGVkOiBQcm9kdWN0KSB7XG4gICAgICAgIHByb2R1Y3Rfc2VsZWN0ZWQucHJpY2UgPSBwYXJzZUZsb2F0KHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucHJpY2UpO1xuICAgICAgICBwcm9kdWN0X3NlbGVjdGVkLnNhbGVwcmljZSA9IHBhcnNlRmxvYXQodGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC52YWx1ZS5wcmljZSk7XG4gICAgICAgIHByb2R1Y3Rfc2VsZWN0ZWQub3B0aW9ucyA9IHt9O1xuICAgICAgICB0aGlzLnZhcmlhbnRzWzBdLm9wdGlvbnMuZm9yRWFjaChvcHRpb24gPT4gcHJvZHVjdF9zZWxlY3RlZC5vcHRpb25zID0geyAuLi5wcm9kdWN0X3NlbGVjdGVkLm9wdGlvbnMsIC4uLm9wdGlvbiB9KVxuICAgICAgICByZXR1cm4gcHJvZHVjdF9zZWxlY3RlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhcmlhbnRzID0gKGNvZGU/KSA9PiB7XG4gICAgICAgIGxldCB2YXJpYW50cyA9IHRoaXMucHJvZHVjdFN1YmplY3QudmFsdWUudmFyaWFudHM7XG4gICAgICAgIGlmICghY29kZSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zU3ViamVjdC52YWx1ZS5mb3JFYWNoKG9wdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgb3B0aW9uLnZhbHVlcy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50cyA9IHZhcmlhbnRzLmZpbHRlcih2YXJpYW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFudC5vcHRpb25zLnNvbWUodmFyaWFudF9vcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9wdGlvbi5jb2RlIGluIHZhcmlhbnRfb3B0aW9uICYmIHZhcmlhbnRfb3B0aW9uW29wdGlvbi5jb2RlXSA9PSB2YWx1ZS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyaWFudHMgPSB2YXJpYW50cy5maWx0ZXIodmFyaWFudCA9PiB2YXJpYW50LmNvZGUgPT0gY29kZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YXJpYW50cyA9IHZhcmlhbnRzO1xuICAgICAgICBjb2RlICYmIHRoaXMudXBkYXRlT3B0aW9ucygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgbGV0IHsgb3B0aW9ucyB9ID0gdGhpcy52YXJpYW50cy5sZW5ndGggJiYgdGhpcy52YXJpYW50c1swXTtcbiAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLmZvckVhY2gob3B0aW9uID0+IE9iamVjdC5rZXlzKG9wdGlvbikuZm9yRWFjaChrZXkgPT4gdGhpcy5zZXRPcHRpb24oa2V5LCBvcHRpb25ba2V5XSkpKVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVBc29jaWF0ZWREYXRhRnJvbVZhcmlhbnRzID0gKCkgPT4ge1xuICAgICAgICBsZXQgYXNvY2lhdGVkOiBhbnkgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICAgICAgICBhc29jaWF0ZWQuc3RvY2sgPSB0aGlzLnZhcmlhbnRzWzBdLnN0b2NrXG4gICAgICAgICAgICBhc29jaWF0ZWQucHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnByaWNlLnRvU3RyaW5nKClcbiAgICAgICAgICAgIGFzb2NpYXRlZC5zYWxlcHJpY2UgPSB0aGlzLnZhcmlhbnRzWzBdLnNhbGVwcmljZSAmJiB0aGlzLnZhcmlhbnRzWzBdLnNhbGVwcmljZS50b1N0cmluZygpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5kaXNjb3VudCA9IHRoaXMudmFyaWFudHNbMF0/LmRpc2NvdW50IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcm9wZXJ0aWVzID0gdGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzID8gdGhpcy5iZWF1dGlmeVByb3BlcnRpZXModGhpcy52YXJpYW50c1swXS5wcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGFzb2NpYXRlZC51bmlxdWVFeHRlcm5hbENvZGUgPSB0aGlzLnZhcmlhbnRzWzBdPy51bmlxdWVFeHRlcm5hbENvZGUgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgYXNvY2lhdGVkLm11bHRpcGxlUXVhbnRpdHkgPSB0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5IHx8IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzb2NpYXRlZC5wcmljZSA9IHRoaXMuY3JhdGVQcmljZSgpXG4gICAgICAgICAgICBhc29jaWF0ZWQuc2FsZXByaWNlID0gdGhpcy5jcmF0ZVNhbGVQcmljZSgpXG4gICAgICAgICAgICBhc29jaWF0ZWQuc3RvY2sgPSAodGhpcy52YXJpYW50cy5tYXAodmFyaWFudCA9PiB2YXJpYW50LnN0b2NrKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYilcbiAgICAgICAgICAgIGFzb2NpYXRlZC5kaXNjb3VudCA9IHRoaXMuY3JhdGVEaXNjb3VudCgpXG4gICAgICAgIH1cblxuICAgICAgICAoJ2ltYWdlcycgaW4gdGhpcy52YXJpYW50c1swXSAmJiB0aGlzLnZhcmlhbnRzWzBdLmltYWdlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgPyBhc29jaWF0ZWQucGljdHVyZSA9IHRoaXMudmFyaWFudHNbMF0uaW1hZ2VzWzBdXG4gICAgICAgICAgICA6IGFzb2NpYXRlZC5waWN0dXJlID0gKHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWUucGljdHVyZSB8fCB0aGlzLnByb2R1Y3RTdWJqZWN0LnZhbHVlLnBpY3R1cmVzZGVmYXVsdFswXSk7XG5cblxuICAgICAgICBhc29jaWF0ZWQubWF4aW11bUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/Lm1heGltdW1BbW91bnQgfHwgMFxuICAgICAgICBhc29jaWF0ZWQubWluaW11bUFtb3VudCA9IHRoaXMudmFyaWFudHNbMF0/Lm1pbmltdW1BbW91bnQgfHwgMFxuXG4gICAgICAgIGFzb2NpYXRlZC5tYXhpbXVtSXRlbXNRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrID4gMCAmJiAnbWF4aW11bUl0ZW1zUXVhbnRpdHknIGluIHRoaXMudmFyaWFudHNbMF0gPyB0aGlzLnZhcmlhbnRzWzBdPy5tYXhpbXVtSXRlbXNRdWFudGl0eSA6IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrXG4gICAgICAgIGFzb2NpYXRlZC5taW5pbXVtSXRlbXNRdWFudGl0eSA9IHRoaXMudmFyaWFudHNbMF0/LnN0b2NrID4gMCAmJiAnbWluaW11bUl0ZW1zUXVhbnRpdHknIGluIHRoaXMudmFyaWFudHNbMF1cbiAgICAgICAgICAgICYmIHRoaXMudmFyaWFudHNbMF0/Lm1pbmltdW1JdGVtc1F1YW50aXR5ID4gMCA/IHRoaXMudmFyaWFudHNbMF0/Lm1pbmltdW1JdGVtc1F1YW50aXR5XG4gICAgICAgICAgICA6ICh0aGlzLnZhcmlhbnRzWzBdPy5tdWx0aXBsZVF1YW50aXR5ID8gdGhpcy52YXJpYW50c1swXT8ubXVsdGlwbGVRdWFudGl0eSA6IDEpXG5cbiAgICAgICAgYXNvY2lhdGVkLmZpbmFsQ29uc3VtZXIgPSB7XG4gICAgICAgICAgICBmaW5hbENvbnN1bWVyUHJpY2U6IHRoaXMudmFyaWFudHNbMF0/LmZpbmFsX2NvbnN1bWVyX3ByaWNlLFxuICAgICAgICAgICAgb3JpZ2luYWxGaW5hbENvbnN1bWVyUHJpY2U6IHRoaXMudmFyaWFudHNbMF0/Lm9yaWdpbmFsX2ZpbmFsX2NvbnN1bWVyX3ByaWNlLFxuICAgICAgICB9XG5cbiAgICAgICAgYXNvY2lhdGVkLnRheGVzID0ge1xuICAgICAgICAgICAgdGF4SW5jbHVkZWQ6IHRoaXMudmFyaWFudHNbMF0/LnRheEluY2x1ZGVkLFxuICAgICAgICAgICAgdGF4Q2F0ZWdvcnk6IHRoaXMudmFyaWFudHNbMF0/LnRheENhdGVnb3J5LFxuICAgICAgICB9XG4gICAgICAgIGFzb2NpYXRlZC50YXhlQW1vdW50ID0gdGhpcy52YXJpYW50c1swXT8udGF4ZXMgfHwgdW5kZWZpbmVkO1xuICAgICAgICBhc29jaWF0ZWQudGF4UmF0ZSA9IHRoaXMudmFyaWFudHNbMF0/LnRheFJhdGUgfHwgdW5kZWZpbmVkO1xuICAgICAgICBhc29jaWF0ZWQucHJpY2VXaXRob3V0VGF4ZXMgPSB0aGlzLnZhcmlhbnRzWzBdPy5wcmljZVdpdGhvdXRUYXhlcyB8fCB1bmRlZmluZWQ7XG5cbiAgICAgICAgdGhpcy5hc29jaWF0ZWREYXRhU3ViamVjdC5uZXh0KGFzb2NpYXRlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFJlY2liZSBsYXMgcHJvcGllZGFkZXMgZGUgdW5hIHZhcmlhbnRlIHkgcG9yIGNhZGEgaXRlbSBhcm1hIHVuIG9iamV0byBjb24gXG4gICAgICogZWwgbmFtZT1jbGF2ZSB5IHZhbHVlPXZhbG9yIGRlIGVzZSBpdGVtLiAgXG4gICAgICogQHBhcmFtIHByb3BlcnRpZXMgXG4gICAgICogQHJldHVybnMgVW4gYXJyZWdsbyBjb24gbGFzIHByb3BpZWRhZGVzIGRlIGxhIGZvcm1hIHsgbmFtZSA9IC4uLiAsIHZhbHVlID0gLi4ufVxuICAgICAqL1xuICAgIHByaXZhdGUgYmVhdXRpZnlQcm9wZXJ0aWVzID0gKHByb3BlcnRpZXMpID0+IHtcbiAgICAgICAgbGV0IGJlYXV0aWZ5RGF0YSA9IFtdXG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBwcm9wKSB7XG4gICAgICAgICAgICAgICAgYmVhdXRpZnlEYXRhLnB1c2goeyBuYW1lOiBrZXksIHZhbHVlOiBwcm9wW2tleV0gfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBiZWF1dGlmeURhdGFcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyYXRlRGlzY291bnQgPSAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYWxsX2Rpc2NvdW50ID0gJyc7XG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2godmFyaWFudCA9PiB7XG4gICAgICAgICAgICAgICAgdmFyaWFudC5kaXNjb3VudCAmJiAoYWxsX2Rpc2NvdW50ID0gYWxsX2Rpc2NvdW50ICsgJywgJyArIHZhcmlhbnQuZGlzY291bnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoYWxsX2Rpc2NvdW50ID09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFsbF9kaXNjb3VudFxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmF0ZVByaWNlID0gKCkgPT4ge1xuICAgICAgICBsZXQgbWluX3ByaWNlID0gMDtcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XG4gICAgICAgIGxldCBhbGxfcHJpY2VzID0gW107XG4gICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcbiAgICAgICAgICAgIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnByaWNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1pbl9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSk7XG4gICAgICAgIG1heF9wcmljZSA9IGFsbF9wcmljZXMucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgMCk7XG4gICAgICAgIHJldHVybiBtaW5fcHJpY2UgPT0gbWF4X3ByaWNlID8gbWF4X3ByaWNlLnRvU3RyaW5nKCkgOiBtaW5fcHJpY2UgKyAnIC0gJyArIG1heF9wcmljZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyYXRlU2FsZVByaWNlID0gKCkgPT4ge1xuICAgICAgICBsZXQgbWluX3ByaWNlID0gMDtcbiAgICAgICAgbGV0IG1heF9wcmljZSA9IDA7XG4gICAgICAgIGxldCBhbGxfcHJpY2VzID0gW107XG4gICAgICAgIHRoaXMudmFyaWFudHMuZm9yRWFjaCh2YXJpYW50ID0+IHtcbiAgICAgICAgICAgIHZhcmlhbnQuc2FsZXByaWNlICYmIGFsbF9wcmljZXMucHVzaCh2YXJpYW50LnNhbGVwcmljZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIWFsbF9wcmljZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgICAgbWluX3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWluKGEsIGIpKTtcbiAgICAgICAgbWF4X3ByaWNlID0gYWxsX3ByaWNlcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAgICAgcmV0dXJuIG1pbl9wcmljZSA9PSBtYXhfcHJpY2UgPyBtYXhfcHJpY2UudG9TdHJpbmcoKSA6IG1pbl9wcmljZSArICcgLSAnICsgbWF4X3ByaWNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5SYW5nZSA9IChxdWFudGl0eSwgbWluLCBtYXgpID0+ICgocXVhbnRpdHkgLSBtaW4pICogKHF1YW50aXR5IC0gbWF4KSA8PSAwKVxuXG4gICAgcHJpdmF0ZSB2YWxpZGF0ZVF1YW50aXR5ID0gKHF1YW50aXR5OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3QgYWN0dWFsUXVhbnRpdHkgPSB0aGlzLmNhcnRTZXJ2aWNlLmdldENvdW50RnJvbUl0ZW1JbkNhcnQodGhpcy52YXJpYW50c1swXS5jb2RlKTtcbiAgICAgICAgY29uc3QgYXNvY2lhdGVkRGF0YSA9IHRoaXMuYXNvY2lhdGVkRGF0YVN1YmplY3QudmFsdWU7XG4gICAgICAgIGNvbnNvbGUubG9nKCdMYSBjYW50aWRhZCBxdWUgbGxlZ286ICcsIHF1YW50aXR5LCAnIHkgbGEgY2FudGlkYWQgYWN0dWFsOiAnLCBhY3R1YWxRdWFudGl0eSk7XG4gICAgICAgIGlmICgoYWN0dWFsUXVhbnRpdHkgKyBxdWFudGl0eSkgPiBhc29jaWF0ZWREYXRhLm1heGltdW1JdGVtc1F1YW50aXR5KSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2Uuc2hvdygnbWF4aW11bS1pdGVtcy1xdWFudGl0eScsIHsgcXVhbnRpdHk6IGFzb2NpYXRlZERhdGEubWF4aW11bUl0ZW1zUXVhbnRpdHkgfSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGFjdHVhbFF1YW50aXR5ICsgcXVhbnRpdHkpIDwgYXNvY2lhdGVkRGF0YS5taW5pbXVtSXRlbXNRdWFudGl0eSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ21pbmltdW0taXRlbXMtcXVhbnRpdHknLCB7IHF1YW50aXR5OiBhc29jaWF0ZWREYXRhLm1pbmltdW1JdGVtc1F1YW50aXR5IH0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlUHJpY2VBbmRDcmVkaXRzID0gKHByaWNlOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYmFsYW5jZUN1c3RvbWVyID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJhbGFuY2VDdXN0b21lci5hbGxvd0FueVBheW1lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmFsYW5jZUN1c3RvbWVyLnJlbWFpbmluZ0NyZWRpdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByaWNlID4gdGhpcy5iYWxhbmNlQ3VzdG9tZXIucmVtYWluaW5nQ3JlZGl0cykge1xuICAgICAgICAgICAgdGhpcy50b2FzdHJTZXJ2aWNlLnNob3coJ25vdC1lbm91Z2gtY3JlZGl0cycpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG5cbiAgICBwcml2YXRlIGZldGNoQ2FydERhdGEgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2UuZ2V0VG90YWxBbW91bnQoKS5zdWJzY3JpYmUoKHRvdGFsQW1vdW50KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUb3RhbEFtb3VudCA9IHRvdGFsQW1vdW50O1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmJhbGFuY2VDdXN0b21lciQuc3Vic2NyaWJlKChiYWxhbmNlQ3VzdG9tZXIpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFsYW5jZUN1c3RvbWVyID0gYmFsYW5jZUN1c3RvbWVyO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gQ3VhbmRvIGhheWEgbW9kZWxvcyBkZSByZXNwdWVzdGEsIHZhbGlkYW1vcyBxdWUgbm8gc2UgaW50ZW50ZSBjYXJnYXIgdW4gcHJvZHVjdG8gaW5jb21wbGV0b1xuICAgIHByaXZhdGUgaXNQcm9kdWN0VmFsaWQgPSAocHJvZHVjdDogUHJvZHVjdCkgPT4gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIFZhcmlhbnRlcyB5IHN1cyB2YWxvcmVzXG4gICAgICogXG4gICAgICogQGRlc2NyaXB0aW9uIFJldG9ybmEgdW5hIGxpc3RhIGZpbHRyYWRhIGRlIGxhcyB2YXJpYW50ZXMgcXVlIGVzdGFuIHNlbGVjY2lvbmFkYXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhcmlhbnRzU2VsZWN0ZWQob3B0aW9uczogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogQXJyYXk8T2JqZWN0PiB7XG5cbiAgICAgICAgbGV0IHZhcmlhbnRzU2VsZWN0ZWQgPSBbXTtcbiAgICAgICAgb3B0aW9ucy5mb3JFYWNoKHYgPT4ge1xuICAgICAgICAgICAgaWYgKHYudmFsdWVzICYmIHYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYudmFsdWVzLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC5zZWxlY3RlZCAmJiAhb3B0aW9uc0V4Y2VwdGlvbi5maW5kKG9wID0+IG9wLnRvVXBwZXJDYXNlKCkgPT0gdi5jb2RlLnRvVXBwZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50c1NlbGVjdGVkW3YuY29kZV0gPSB2YWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2YXJpYW50c1NlbGVjdGVkO1xuXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgVmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgVG9kYXMgbGFzIHZhcmlhbnRlcyBkaXNwb25pYmxlcyBkZWwgcHJvZHVjdG9cbiAgICAgKiBcbiAgICAgKiBAZGVzY3JpcHRpb24gcmV0b3JuYSB0b2RhcyBsYXMgdmFyaWFudGVzIGRpc3BvbmlibGVzIGEgc2VsZWNjaW9uIHkgc3Ugc3RvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFyaWFudHNBdmFpbGFibGUob3B0aW9uczogYW55LCB2YXJpYW50czogYW55LCBvcHRpb25zRXhjZXB0aW9uOiBBcnJheTxhbnk+KTogYW55IHtcblxuICAgICAgICBsZXQgdmFyaWFudHNTZWxlY3RlZCA9IHRoaXMuZ2V0VmFyaWFudHNTZWxlY3RlZChvcHRpb25zLCBvcHRpb25zRXhjZXB0aW9uKTtcblxuICAgICAgICBsZXQgdmFyaWFudHNBdmFpbGFibGUgPSBbXTtcblxuICAgICAgICB2YXJpYW50cy5tYXAodiA9PiB7XG5cbiAgICAgICAgICAgIGxldCBhdXggPSB7fTtcbiAgICAgICAgICAgIGlmICh2Lm9wdGlvbnMgJiYgdi5vcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHYub3B0aW9ucy5tYXAob3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGF1eCwgb3AsIHsgc3RvY2s6IHYuc3RvY2sgfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhcmlhbnRzQXZhaWxhYmxlLnB1c2goYXV4KTtcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHZhcmlhbnRzQXZhaWxhYmxlLmZpbHRlcih2YSA9PiB0aGlzLmNvbnN0YW50cy5jb250YWluc0FsbCh7IC4uLnZhcmlhbnRzU2VsZWN0ZWQgfSwgdmEpKVxuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgZGUgdmFyaWFudGVzIHkgc3VzIHZhbG9yZXNcbiAgICAgKiBAcGFyYW0gY29kZSBDb2RpZ28gZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gbmFtZSBub21icmUgZGUgbGEgdmFyaWFudGUgYSBidXNjYXJcbiAgICAgKiBAcGFyYW0gdmFyaWFudHMgdmFyaWFudGVzIGRlbCBwcm9kdWN0b1xuICAgICAqIFxuICAgICAqIEBkZXNjcmlwdGlvbiBidXNjYSBlbiBsYSBsaXN0YSBkZSB2YXJpYW50ZXMgZGlzcG9uaWJsZXMgc2kgaGF5IGRlIGVzZSBjb2RpZ28sIGVzZSBub21icmUgeSBjb24gc3RvY2sgXG4gICAgICovXG4gICAgcHVibGljIGV4aXN0VmFyaWFudEFuZEhhc1N0b2NrKG9wdGlvbnMsIGNvZGUsIG5hbWUsIHZhcmlhbnRzLCBvcHRpb25zRXhjZXB0aW9uID0gW10pOiBib29sZWFuIHtcblxuICAgICAgICByZXR1cm4gdGhpcy5nZXRWYXJpYW50c0F2YWlsYWJsZShvcHRpb25zLCB2YXJpYW50cywgb3B0aW9uc0V4Y2VwdGlvbikuZmluZCh2YSA9PlxuICAgICAgICAgICAgdmEuaGFzT3duUHJvcGVydHkoY29kZSkgJiYgdmFbY29kZV0gPT09IG5hbWUgJiYgdmEuc3RvY2sgPiAwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwcm9kdWN0IHByb2R1Y3RvIGVsIGN1YWwgc2UgcXVpZXJlIGRlc2RvYmxhciBwb3IgdmFyaWFudGVzIHBvciB1bmEgb3BjacOzbi5cbiAgICAgKiBAcGFyYW0gd2l0aE9wdGlvbiAndHlwZScgdGlwbyBkZSBvcGNpw7NuLCBjb2RlOiBjw7NkaWdvIGRlIGxhIG9wY2nDs24uICdkZWZhdWx0Rmlyc3RPcHRpb24nOiBlbiBjYXNvIGRlIHF1ZSBubyBzZSBwdWVkYSBkZXNkb2JsYXIgcG9yIGxhIG9wY2nDs24gaW5kaWNhZGEgc2kgZWwgdmFsb3IgZXMgdmVyZGFkZXJvIHNlIGludGVudGFyYSBkZXNkb2JsYXIgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0by5cbiAgICAgKiAnY2hlY2tJZlN0b2NrJzogZW4gY2FzbyBkZSBxdWUgZXN0YSB2YWxvciBzZWEgdmVyZGFkZXJvIHNlIHJlYWxpemEgdW4gY29udHJvbCBkZSBxdWUgbGEgdmFyaWFudGVzIGN1ZW50ZW4gY29uIHN0b2NrIHBhcmEgc2VyIHVuIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlLCBzaSBlbCB2YWxvciBlcyBmYWxzbyBubyBzZSByZWFsaXphIGRpY2hvIGNvbnRyb2wgeSBlbCBwcm9kdWN0byBzZSBkZXNkb2JsYXJhIGNvbiBzdG9jayBlbiAwLlxuICAgICAqIEByZXR1cm5zIGFycmVnbG8gY29uIGVsIHByb2R1Y3RvIGRlc2RvYmxhZG8gcG9yIGxhIHZhcmlhbnRlIHNvbGljaXRhZGEuXG4gICAgICogKG9wY2nDs24gcG9yIGRlZmVjdG8gcXVlIHNlIGludGVudGEgaGFjZXIgZWwgZGVzZG9ibGFtaWVudG8gJ2NvbG9yJywgbyBiaWVuIHNpIGVuIGxlIHBhcsOhbWV0cm8gd2l0aE9wdGlvbiBlbCBhdHJpYnV0byAnZGVmYXVsdEZpcnN0T3B0aW9uJyBlcyB2ZXJkYWRlcm8gc2UgZGVzZG9ibGEgcG9yIGxhIHByaW1lcmEgb3BjacOzbiBhc29jaWFkYSBhbCBwcm9kdWN0byApIFxuICAgICAqL1xuICAgIGdldFByb2R1Y3RXaXRoVW5pcXVlVmFyaWFudCA9IChwcm9kdWN0LCB3aXRoT3B0aW9uPzogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0c1NlcnZpY2UuZ2V0UHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudChbcHJvZHVjdF0sIHdpdGhPcHRpb24pXG4gICAgfVxuXG59Il19