@snabcentr/client-ui 4.14.9 → 4.14.21

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 (572) hide show
  1. package/accordion/index.d.ts +3 -0
  2. package/accordion/sc-accordion-content.directive.d.ts +9 -0
  3. package/accordion/sc-accordion.component.d.ts +56 -0
  4. package/accordion/sc-accordion.module.d.ts +15 -0
  5. package/auth/enums/auth-method.d.ts +13 -0
  6. package/auth/index.d.ts +8 -0
  7. package/auth/interfaces/index.d.ts +2 -0
  8. package/auth/interfaces/sc-bank-account-form-group.d.ts +11 -0
  9. package/auth/interfaces/sc-contact-form-group.d.ts +10 -0
  10. package/auth/sc-auth.module.d.ts +27 -0
  11. package/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.d.ts +55 -0
  12. package/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.d.ts +45 -0
  13. package/auth/sc-sign-in-form/sc-sign-in-form.component.d.ts +53 -0
  14. package/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.d.ts +113 -0
  15. package/auth/sign-up-form/sc-sign-up-form.component.d.ts +172 -0
  16. package/banner/index.d.ts +2 -0
  17. package/banner/sc-banner.component.d.ts +108 -0
  18. package/banner/sc-banner.module.d.ts +17 -0
  19. package/brands-list/index.d.ts +3 -0
  20. package/brands-list/sc-brand-list-item.d.ts +25 -0
  21. package/brands-list/sc-brands-list.component.d.ts +13 -0
  22. package/brands-list/sc-brands-list.module.d.ts +12 -0
  23. package/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.d.ts +106 -0
  24. package/cart/add-or-editing-cart-item-dialog/index.d.ts +2 -0
  25. package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts +49 -0
  26. package/cart/index.d.ts +2 -0
  27. package/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.d.ts +62 -0
  28. package/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.d.ts +47 -0
  29. package/catalog/catalog-filters/index.d.ts +4 -0
  30. package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +199 -0
  31. package/catalog/catalog-filters/tokens/sc-catalog-products-filters.d.ts +7 -0
  32. package/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.d.ts +5 -0
  33. package/catalog/category-card/sc-category-card.component.d.ts +76 -0
  34. package/catalog/cost-with-discount/cost-with-discount.component.d.ts +23 -0
  35. package/catalog/download-price-list/sc-download-price-list.component.d.ts +38 -0
  36. package/catalog/hover-image-carousel/sc-hover-image-carousel.component.d.ts +48 -0
  37. package/catalog/index.d.ts +15 -0
  38. package/catalog/input-quantity/sc-input-quantity.component.d.ts +82 -0
  39. package/catalog/notify-when-in-stock-dialog/index.d.ts +2 -0
  40. package/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.d.ts +90 -0
  41. package/catalog/notify-when-in-stock-dialog/sc-product-in-all-warehouses.pipe.d.ts +22 -0
  42. package/catalog/price-card/sc-price-card.component.d.ts +18 -0
  43. package/catalog/price-card-inline/sc-price-card-inline.component.d.ts +10 -0
  44. package/catalog/price-history/sc-price-history.component.d.ts +92 -0
  45. package/catalog/price-list-pagination/sc-price-list-pagination.component.d.ts +40 -0
  46. package/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.d.ts +47 -0
  47. package/catalog/sc-catalog.module.d.ts +29 -0
  48. package/catalog/sc-favorite-button/sc-favorite-button.component.d.ts +25 -0
  49. package/catalog/seo-tags/sc-seo-tags.component.d.ts +20 -0
  50. package/configurators/index.d.ts +3 -0
  51. package/configurators/models/index.d.ts +3 -0
  52. package/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.d.ts +22 -0
  53. package/configurators/models/sandwich/sc-i-sandwich-settings.d.ts +18 -0
  54. package/configurators/models/sandwich_m2/sc-i-sandwich-m2-settings.d.ts +18 -0
  55. package/configurators/sandwich/index.d.ts +3 -0
  56. package/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.d.ts +8 -0
  57. package/configurators/sandwich/sc-i-new-cart-item-sandwich.d.ts +14 -0
  58. package/configurators/sandwich/sc-sandwich.component.d.ts +186 -0
  59. package/configurators/sandwich_m2/index.d.ts +4 -0
  60. package/configurators/sandwich_m2/sandwich-m2-skeleton/sc-sandwich-m2-skeleton.component.d.ts +8 -0
  61. package/configurators/sandwich_m2/sc-i-new-cart-item-sandwich-m2.d.ts +23 -0
  62. package/configurators/sandwich_m2/sc-sandwich-m2-item-submit-state.d.ts +13 -0
  63. package/configurators/sandwich_m2/sc-sandwich-m2.component.d.ts +275 -0
  64. package/contacts/add-contact-dialog/sc-add-contact-dialog.component.d.ts +49 -0
  65. package/contacts/contacts-accordion/sc-contacts-accordion.component.d.ts +23 -0
  66. package/contacts/index.d.ts +7 -0
  67. package/contacts/manager-card/sc-manager-card.component.d.ts +22 -0
  68. package/contacts/manager-card-push/sc-manager-card-push.component.d.ts +18 -0
  69. package/contacts/new-contact-form/sc-new-contact-form.component.d.ts +28 -0
  70. package/contacts/sc-contacts.module.d.ts +28 -0
  71. package/contacts/tokens/index.d.ts +2 -0
  72. package/contacts/tokens/sc-manager-qr-handler.token.d.ts +6 -0
  73. package/contacts/tokens/sc-show-help-notification-in-phone-input.token.d.ts +5 -0
  74. package/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.d.ts +49 -0
  75. package/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.d.ts +158 -0
  76. package/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.d.ts +66 -0
  77. package/contragents/contragents-accordion/sc-contragents-accordion.component.d.ts +49 -0
  78. package/contragents/index.d.ts +7 -0
  79. package/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.d.ts +64 -0
  80. package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +129 -0
  81. package/contragents/sc-contragents.module.d.ts +28 -0
  82. package/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.d.ts +148 -0
  83. package/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.d.ts +50 -0
  84. package/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.d.ts +49 -0
  85. package/delivery-address/index.d.ts +4 -0
  86. package/delivery-address/sc-delivery-address.module.d.ts +25 -0
  87. package/dialogs/index.d.ts +1 -0
  88. package/dialogs/sc-resource-preview/sc-resource-preview.component.d.ts +42 -0
  89. package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +136 -0
  90. package/directives/address-quality/sc-address-quality.directive.d.ts +23 -0
  91. package/directives/address-quality/sc-address-quality.service.d.ts +122 -0
  92. package/directives/address-quality/sc-i-address-quality-state.d.ts +14 -0
  93. package/directives/index.d.ts +11 -0
  94. package/directives/links/index.d.ts +4 -0
  95. package/directives/links/sc-email-link.directive.d.ts +25 -0
  96. package/directives/links/sc-link-location.d.ts +5 -0
  97. package/directives/links/sc-links.d.ts +7 -0
  98. package/directives/links/sc-tel-link.directive.d.ts +40 -0
  99. package/directives/next-input-focus/sc-next-input-focus.directive.d.ts +27 -0
  100. package/directives/next-input-focus/sc-next-input-focus.module.d.ts +10 -0
  101. package/directives/print/sc-print.directive.d.ts +21 -0
  102. package/directives/sc-date-value-transformer.directive.d.ts +8 -0
  103. package/directives/sc-focus-first-invalid-field.directive.d.ts +30 -0
  104. package/directives/sc-null-on-empty-value-transformer.directive.d.ts +8 -0
  105. package/directives/select-on-focusin/sc-select-on-focusin.directive.d.ts +14 -0
  106. package/directives/terminal-link/sc-terminal-link.directive.d.ts +34 -0
  107. package/error-handler/consts/error-change-handler.providers.d.ts +6 -0
  108. package/error-handler/error-block-status/error-block-status.component.d.ts +55 -0
  109. package/error-handler/index.d.ts +4 -0
  110. package/error-handler/interfaces/i-block-error.d.ts +17 -0
  111. package/error-handler/sc-error-handler.component.d.ts +40 -0
  112. package/esm2022/accordion/index.mjs +4 -0
  113. package/esm2022/accordion/sc-accordion-content.directive.mjs +17 -0
  114. package/esm2022/accordion/sc-accordion.component.mjs +92 -0
  115. package/esm2022/accordion/sc-accordion.module.mjs +26 -0
  116. package/esm2022/auth/enums/auth-method.mjs +15 -0
  117. package/esm2022/auth/index.mjs +9 -0
  118. package/esm2022/auth/interfaces/index.mjs +3 -0
  119. package/esm2022/auth/interfaces/sc-bank-account-form-group.mjs +2 -0
  120. package/esm2022/auth/interfaces/sc-contact-form-group.mjs +2 -0
  121. package/esm2022/auth/sc-auth.module.mjs +103 -0
  122. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +100 -0
  123. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +81 -0
  124. package/esm2022/auth/sc-sign-in-form/sc-sign-in-form.component.mjs +89 -0
  125. package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +203 -0
  126. package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +345 -0
  127. package/esm2022/banner/index.mjs +3 -0
  128. package/esm2022/banner/sc-banner.component.mjs +176 -0
  129. package/esm2022/banner/sc-banner.module.mjs +29 -0
  130. package/esm2022/brands-list/index.mjs +4 -0
  131. package/esm2022/brands-list/sc-brand-list-item.mjs +2 -0
  132. package/esm2022/brands-list/sc-brands-list.component.mjs +24 -0
  133. package/esm2022/brands-list/sc-brands-list.module.mjs +22 -0
  134. package/esm2022/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.mjs +233 -0
  135. package/esm2022/cart/add-or-editing-cart-item-dialog/index.mjs +3 -0
  136. package/esm2022/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.mjs +75 -0
  137. package/esm2022/cart/index.mjs +3 -0
  138. package/esm2022/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.mjs +110 -0
  139. package/esm2022/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.mjs +59 -0
  140. package/esm2022/catalog/catalog-filters/index.mjs +5 -0
  141. package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +451 -0
  142. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-products-filters.mjs +10 -0
  143. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.mjs +6 -0
  144. package/esm2022/catalog/category-card/sc-category-card.component.mjs +102 -0
  145. package/esm2022/catalog/cost-with-discount/cost-with-discount.component.mjs +38 -0
  146. package/esm2022/catalog/download-price-list/sc-download-price-list.component.mjs +56 -0
  147. package/esm2022/catalog/hover-image-carousel/sc-hover-image-carousel.component.mjs +76 -0
  148. package/esm2022/catalog/index.mjs +16 -0
  149. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +190 -0
  150. package/esm2022/catalog/notify-when-in-stock-dialog/index.mjs +3 -0
  151. package/esm2022/catalog/notify-when-in-stock-dialog/sc-notify-when-in-stock-dialog.component.mjs +173 -0
  152. package/esm2022/catalog/notify-when-in-stock-dialog/sc-product-in-all-warehouses.pipe.mjs +35 -0
  153. package/esm2022/catalog/price-card/sc-price-card.component.mjs +71 -0
  154. package/esm2022/catalog/price-card-inline/sc-price-card-inline.component.mjs +54 -0
  155. package/esm2022/catalog/price-history/sc-price-history.component.mjs +144 -0
  156. package/esm2022/catalog/price-list-pagination/sc-price-list-pagination.component.mjs +65 -0
  157. package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +61 -0
  158. package/esm2022/catalog/sc-catalog.module.mjs +128 -0
  159. package/esm2022/catalog/sc-favorite-button/sc-favorite-button.component.mjs +42 -0
  160. package/esm2022/catalog/seo-tags/sc-seo-tags.component.mjs +25 -0
  161. package/esm2022/configurators/index.mjs +4 -0
  162. package/esm2022/configurators/models/index.mjs +4 -0
  163. package/esm2022/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.mjs +2 -0
  164. package/esm2022/configurators/models/sandwich/sc-i-sandwich-settings.mjs +2 -0
  165. package/esm2022/configurators/models/sandwich_m2/sc-i-sandwich-m2-settings.mjs +2 -0
  166. package/esm2022/configurators/sandwich/index.mjs +4 -0
  167. package/esm2022/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.mjs +14 -0
  168. package/esm2022/configurators/sandwich/sc-i-new-cart-item-sandwich.mjs +2 -0
  169. package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +387 -0
  170. package/esm2022/configurators/sandwich_m2/index.mjs +5 -0
  171. package/esm2022/configurators/sandwich_m2/sandwich-m2-skeleton/sc-sandwich-m2-skeleton.component.mjs +14 -0
  172. package/esm2022/configurators/sandwich_m2/sc-i-new-cart-item-sandwich-m2.mjs +2 -0
  173. package/esm2022/configurators/sandwich_m2/sc-sandwich-m2-item-submit-state.mjs +5 -0
  174. package/esm2022/configurators/sandwich_m2/sc-sandwich-m2.component.mjs +569 -0
  175. package/esm2022/contacts/add-contact-dialog/sc-add-contact-dialog.component.mjs +91 -0
  176. package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +37 -0
  177. package/esm2022/contacts/index.mjs +8 -0
  178. package/esm2022/contacts/manager-card/sc-manager-card.component.mjs +58 -0
  179. package/esm2022/contacts/manager-card-push/sc-manager-card-push.component.mjs +28 -0
  180. package/esm2022/contacts/new-contact-form/sc-new-contact-form.component.mjs +38 -0
  181. package/esm2022/contacts/sc-contacts.module.mjs +92 -0
  182. package/esm2022/contacts/tokens/index.mjs +3 -0
  183. package/esm2022/contacts/tokens/sc-manager-qr-handler.token.mjs +25 -0
  184. package/esm2022/contacts/tokens/sc-show-help-notification-in-phone-input.token.mjs +9 -0
  185. package/esm2022/contragents/add-contragent-bank-account-dialog/sc-add-contragent-bank-account-dialog.component.mjs +81 -0
  186. package/esm2022/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +266 -0
  187. package/esm2022/contragents/contragents-accordion/contragents-accordion-item/sc-contragents-accordion-item.component.mjs +79 -0
  188. package/esm2022/contragents/contragents-accordion/sc-contragents-accordion.component.mjs +68 -0
  189. package/esm2022/contragents/index.mjs +8 -0
  190. package/esm2022/contragents/new-contragent-bank-account-form/sc-new-contragent-bank-account-form.component.mjs +72 -0
  191. package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +241 -0
  192. package/esm2022/contragents/sc-contragents.module.mjs +121 -0
  193. package/esm2022/delivery-address/add-delivery-address-dialog/sc-add-delivery-address-dialog.component.mjs +261 -0
  194. package/esm2022/delivery-address/delivery-address-accordion/delivery-address-accordion-item/sc-delivery-address-accordion-item.component.mjs +60 -0
  195. package/esm2022/delivery-address/delivery-address-accordion/sc-delivery-address-accordion.component.mjs +68 -0
  196. package/esm2022/delivery-address/index.mjs +5 -0
  197. package/esm2022/delivery-address/sc-delivery-address.module.mjs +96 -0
  198. package/esm2022/dialogs/index.mjs +2 -0
  199. package/esm2022/dialogs/sc-resource-preview/sc-resource-preview.component.mjs +73 -0
  200. package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +170 -0
  201. package/esm2022/directives/address-quality/sc-address-quality.directive.mjs +40 -0
  202. package/esm2022/directives/address-quality/sc-address-quality.service.mjs +214 -0
  203. package/esm2022/directives/address-quality/sc-i-address-quality-state.mjs +2 -0
  204. package/esm2022/directives/index.mjs +12 -0
  205. package/esm2022/directives/links/index.mjs +5 -0
  206. package/esm2022/directives/links/sc-email-link.directive.mjs +49 -0
  207. package/esm2022/directives/links/sc-link-location.mjs +2 -0
  208. package/esm2022/directives/links/sc-links.mjs +8 -0
  209. package/esm2022/directives/links/sc-tel-link.directive.mjs +79 -0
  210. package/esm2022/directives/next-input-focus/sc-next-input-focus.directive.mjs +70 -0
  211. package/esm2022/directives/next-input-focus/sc-next-input-focus.module.mjs +19 -0
  212. package/esm2022/directives/print/sc-print.directive.mjs +36 -0
  213. package/esm2022/directives/sc-date-value-transformer.directive.mjs +30 -0
  214. package/esm2022/directives/sc-focus-first-invalid-field.directive.mjs +85 -0
  215. package/esm2022/directives/sc-null-on-empty-value-transformer.directive.mjs +30 -0
  216. package/esm2022/directives/select-on-focusin/sc-select-on-focusin.directive.mjs +36 -0
  217. package/esm2022/directives/terminal-link/sc-terminal-link.directive.mjs +69 -0
  218. package/esm2022/error-handler/consts/error-change-handler.providers.mjs +10 -0
  219. package/esm2022/error-handler/error-block-status/error-block-status.component.mjs +101 -0
  220. package/esm2022/error-handler/index.mjs +5 -0
  221. package/esm2022/error-handler/interfaces/i-block-error.mjs +2 -0
  222. package/esm2022/error-handler/sc-error-handler.component.mjs +58 -0
  223. package/esm2022/feedback/feedback-form/sc-feedback-form.component.mjs +344 -0
  224. package/esm2022/feedback/gratitude/sc-gratitude.component.mjs +32 -0
  225. package/esm2022/feedback/index.mjs +4 -0
  226. package/esm2022/feedback/interfaces/index.mjs +2 -0
  227. package/esm2022/feedback/interfaces/sc-feedback-form-config.mjs +2 -0
  228. package/esm2022/files/directives/index.mjs +3 -0
  229. package/esm2022/files/directives/tree-top.directive.mjs +63 -0
  230. package/esm2022/files/directives/tree.directive.mjs +47 -0
  231. package/esm2022/files/file-tree-item/file-tree-item.component.mjs +18 -0
  232. package/esm2022/files/files-and-documents/files-and-documents.component.mjs +61 -0
  233. package/esm2022/files/files-and-documents.module.mjs +28 -0
  234. package/esm2022/files/index.mjs +6 -0
  235. package/esm2022/files/interfaces/tree-node.mjs +2 -0
  236. package/esm2022/files/services/index.mjs +3 -0
  237. package/esm2022/files/services/tree-icon.service.mjs +49 -0
  238. package/esm2022/files/services/tree-loader.service.mjs +62 -0
  239. package/esm2022/form-fields/addresses-selection-field/sc-addresses-selection-field.component.mjs +155 -0
  240. package/esm2022/form-fields/form-fields.module.mjs +66 -0
  241. package/esm2022/form-fields/index.mjs +4 -0
  242. package/esm2022/form-fields/suggestion-field/sc-suggestion-field.component.mjs +235 -0
  243. package/esm2022/icons/index.mjs +2 -0
  244. package/esm2022/icons/sc-client-ui-icons-name.mjs +99 -0
  245. package/esm2022/loader/index.mjs +2 -0
  246. package/esm2022/loader/sc-i-loader.mjs +2 -0
  247. package/esm2022/masks/index.mjs +9 -0
  248. package/esm2022/masks/sc-account-number-mask.mjs +7 -0
  249. package/esm2022/masks/sc-bic-mask.mjs +7 -0
  250. package/esm2022/masks/sc-correspondent-account-mask.mjs +7 -0
  251. package/esm2022/masks/sc-inn-mask.mjs +13 -0
  252. package/esm2022/masks/sc-kpp-mask.mjs +7 -0
  253. package/esm2022/masks/sc-ogrn-mask.mjs +13 -0
  254. package/esm2022/masks/sc-okpo-mask.mjs +13 -0
  255. package/esm2022/masks/sc-phone-verification-code-mask.mjs +7 -0
  256. package/esm2022/methods/index.mjs +2 -0
  257. package/esm2022/methods/sc-get-current-route.mjs +14 -0
  258. package/esm2022/models/i-sc-image.mjs +2 -0
  259. package/esm2022/models/index.mjs +2 -0
  260. package/esm2022/news/index.mjs +4 -0
  261. package/esm2022/news/news-card/sc-news-card.component.mjs +34 -0
  262. package/esm2022/news/news-card-skeleton/sc-news-card-skeleton.component.mjs +31 -0
  263. package/esm2022/news/sc-news.module.mjs +25 -0
  264. package/esm2022/noindex-wrapper/directives/index.mjs +2 -0
  265. package/esm2022/noindex-wrapper/directives/sc-noindex.directive.mjs +58 -0
  266. package/esm2022/noindex-wrapper/index.mjs +3 -0
  267. package/esm2022/noindex-wrapper/sc-noindex-wrapper.component.mjs +18 -0
  268. package/esm2022/order/directives/index.mjs +3 -0
  269. package/esm2022/order/directives/sc-order-accessor.directive.mjs +28 -0
  270. package/esm2022/order/directives/sc-order-options.mjs +11 -0
  271. package/esm2022/order/draft/sc-draft.component.mjs +118 -0
  272. package/esm2022/order/index.mjs +14 -0
  273. package/esm2022/order/models/i-new-order-form.mjs +2 -0
  274. package/esm2022/order/models/sc-i-cart-items-by-direction.mjs +22 -0
  275. package/esm2022/order/order-direction-items/sc-order-direction-items.component.mjs +39 -0
  276. package/esm2022/order/order-form/sc-order-form.component.mjs +565 -0
  277. package/esm2022/order/order-form/sc-order-form.config.mjs +7 -0
  278. package/esm2022/order/order-item/sc-order-item.component.mjs +112 -0
  279. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +212 -0
  280. package/esm2022/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.mjs +75 -0
  281. package/esm2022/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.mjs +75 -0
  282. package/esm2022/order/sc-order.module.mjs +52 -0
  283. package/esm2022/order/sc-payment-status/sc-payment-status.component.mjs +35 -0
  284. package/esm2022/pages/frequently-asked-questions/sc-faq-query-params.mjs +5 -0
  285. package/esm2022/pages/frequently-asked-questions/sc-faq-question-anchor.mjs +23 -0
  286. package/esm2022/pages/frequently-asked-questions/sc-frequently-asked-questions.component.mjs +167 -0
  287. package/esm2022/pages/frequently-asked-questions/sc-get-faq-group-query-params.mjs +14 -0
  288. package/esm2022/pages/frequently-asked-questions/sc-page-size-options.mjs +8 -0
  289. package/esm2022/pages/frequently-asked-questions-group-selector/sc-frequently-asked-questions-group-selector.component.mjs +88 -0
  290. package/esm2022/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.mjs +123 -0
  291. package/esm2022/pages/index.mjs +11 -0
  292. package/esm2022/pages/news-list/sc-news-list.component.mjs +90 -0
  293. package/esm2022/pages/personal-data-processing-policy/sc-personal-data-processing-policy.component.mjs +46 -0
  294. package/esm2022/pages/privacy-policy/sc-privacy-policy.component.mjs +30 -0
  295. package/esm2022/pages/public-offer/sc-public-offer.component.mjs +50 -0
  296. package/esm2022/pagination/index.mjs +2 -0
  297. package/esm2022/pagination/sc-pagination-links/sc-pagination-links.component.mjs +99 -0
  298. package/esm2022/pipes/index.mjs +3 -0
  299. package/esm2022/pipes/sc-format-date.mjs +33 -0
  300. package/esm2022/pipes/sc-phone-format.mjs +44 -0
  301. package/esm2022/profile/index.mjs +3 -0
  302. package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +174 -0
  303. package/esm2022/profile/sc-profile.module.mjs +73 -0
  304. package/esm2022/providers/cleanup-recaptcha-artifacts.mjs +30 -0
  305. package/esm2022/providers/date-value-transformer/index.mjs +4 -0
  306. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-types.mjs +2 -0
  307. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-with-end-time.mjs +26 -0
  308. package/esm2022/providers/date-value-transformer/sc-date-value-transformer-with-start-time.mjs +37 -0
  309. package/esm2022/providers/index.mjs +18 -0
  310. package/esm2022/providers/null-on-empty-value-transformer/index.mjs +2 -0
  311. package/esm2022/providers/null-on-empty-value-transformer/sc-null-on-empty-value-transformer.mjs +31 -0
  312. package/esm2022/providers/sc-allow-select-terminated.mjs +8 -0
  313. package/esm2022/providers/sc-banner-duration.mjs +8 -0
  314. package/esm2022/providers/sc-block-incomplete-address.mjs +8 -0
  315. package/esm2022/providers/sc-country-ids.mjs +8 -0
  316. package/esm2022/providers/sc-date-formatter.mjs +15 -0
  317. package/esm2022/providers/sc-date-value-transformer.mjs +12 -0
  318. package/esm2022/providers/sc-debounce-time-default.mjs +9 -0
  319. package/esm2022/providers/sc-dialog-service.providers.mjs +6 -0
  320. package/esm2022/providers/sc-help-notification-close.mjs +9 -0
  321. package/esm2022/providers/sc-help-notification-limit.mjs +8 -0
  322. package/esm2022/providers/sc-hidden-print-elements.token.mjs +10 -0
  323. package/esm2022/providers/sc-max-files-in-form-input.mjs +8 -0
  324. package/esm2022/providers/sc-notify-when-in-stock-required-fields.mjs +8 -0
  325. package/esm2022/providers/sc-page-size-options.mjs +8 -0
  326. package/esm2022/providers/sc-user-providers.mjs +38 -0
  327. package/esm2022/providers/sc-verification-code-timeout.mjs +8 -0
  328. package/esm2022/public-api.mjs +36 -0
  329. package/esm2022/qrcode/index.mjs +3 -0
  330. package/esm2022/qrcode/qrcode-dialog/sc-qrcode-dialog.component.mjs +58 -0
  331. package/esm2022/qrcode/sc-qrcode.module.mjs +25 -0
  332. package/esm2022/samples/index.mjs +5 -0
  333. package/esm2022/samples/interfaces/index.mjs +3 -0
  334. package/esm2022/samples/interfaces/sc-i-preview-sample.mjs +2 -0
  335. package/esm2022/samples/interfaces/sc-preview-mosquito-config.mjs +2 -0
  336. package/esm2022/samples/preview-sample/sc-preview-sample.component.mjs +42 -0
  337. package/esm2022/samples/sc-preview-samples-mosquito/sc-preview-samples-mosquito.component.mjs +63 -0
  338. package/esm2022/samples/sc-sample.module.mjs +66 -0
  339. package/esm2022/services/index.mjs +3 -0
  340. package/esm2022/services/print.service.mjs +49 -0
  341. package/esm2022/services/sc-help-notification.service.mjs +100 -0
  342. package/esm2022/share/index.mjs +6 -0
  343. package/esm2022/share/sc-share-dialog-data.mjs +2 -0
  344. package/esm2022/share/sc-share.service.mjs +40 -0
  345. package/esm2022/share/share-button/sc-share-button.component.mjs +99 -0
  346. package/esm2022/share/share-dialog/sc-share-dialog.component.mjs +139 -0
  347. package/esm2022/share/share-messengers-links/sc-share-messengers-links.component.mjs +84 -0
  348. package/esm2022/snabcentr-client-ui.mjs +5 -0
  349. package/esm2022/user/index.mjs +6 -0
  350. package/esm2022/user/reset-user-password/sc-reset-user-password.component.mjs +74 -0
  351. package/esm2022/user/sc-user.module.mjs +86 -0
  352. package/esm2022/user/update-user-info-dialog/sc-update-user-info-dialog.component.mjs +121 -0
  353. package/esm2022/user/user-managers/sc-user-managers.component.mjs +40 -0
  354. package/esm2022/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.mjs +105 -0
  355. package/esm2022/validators/index.mjs +7 -0
  356. package/esm2022/validators/sc-at-least-one-required-validator.mjs +25 -0
  357. package/esm2022/validators/sc-bic-validator.mjs +10 -0
  358. package/esm2022/validators/sc-correspondent-account-validator.mjs +10 -0
  359. package/esm2022/validators/sc-password-confirm-matching-validator.mjs +17 -0
  360. package/esm2022/validators/sc-phone-validator.mjs +14 -0
  361. package/esm2022/validators/step-validator.mjs +18 -0
  362. package/esm2022/verification/index.mjs +3 -0
  363. package/esm2022/verification/sc-verification.module.mjs +86 -0
  364. package/esm2022/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +259 -0
  365. package/feedback/feedback-form/sc-feedback-form.component.d.ts +163 -0
  366. package/feedback/gratitude/sc-gratitude.component.d.ts +20 -0
  367. package/feedback/index.d.ts +3 -0
  368. package/feedback/interfaces/index.d.ts +1 -0
  369. package/feedback/interfaces/sc-feedback-form-config.d.ts +23 -0
  370. package/fesm2022/snabcentr-client-ui.mjs +5826 -4942
  371. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  372. package/files/directives/index.d.ts +2 -0
  373. package/files/directives/tree-top.directive.d.ts +33 -0
  374. package/files/directives/tree.directive.d.ts +35 -0
  375. package/files/file-tree-item/file-tree-item.component.d.ts +9 -0
  376. package/files/files-and-documents/files-and-documents.component.d.ts +27 -0
  377. package/files/files-and-documents.module.d.ts +17 -0
  378. package/files/index.d.ts +5 -0
  379. package/files/interfaces/tree-node.d.ts +29 -0
  380. package/files/services/index.d.ts +2 -0
  381. package/files/services/tree-icon.service.d.ts +23 -0
  382. package/files/services/tree-loader.service.d.ts +43 -0
  383. package/form-fields/addresses-selection-field/sc-addresses-selection-field.component.d.ts +80 -0
  384. package/form-fields/form-fields.module.d.ts +18 -0
  385. package/form-fields/index.d.ts +3 -0
  386. package/form-fields/suggestion-field/sc-suggestion-field.component.d.ts +107 -0
  387. package/icons/index.d.ts +1 -0
  388. package/icons/sc-client-ui-icons-name.d.ts +4 -0
  389. package/icons/svg-pack/application.svg +1 -1
  390. package/icons/svg-pack/back.svg +1 -1
  391. package/icons/svg-pack/bag.svg +1 -1
  392. package/icons/svg-pack/banknote-arrow-in-top.svg +1 -1
  393. package/icons/svg-pack/catalog/aluminum-systems.svg +1 -1
  394. package/icons/svg-pack/catalog/arm-profile.svg +1 -1
  395. package/icons/svg-pack/catalog/batten.svg +1 -1
  396. package/icons/svg-pack/catalog/brusbox.svg +1 -1
  397. package/icons/svg-pack/catalog/canopy.svg +1 -1
  398. package/icons/svg-pack/catalog/configurator.svg +1 -1
  399. package/icons/svg-pack/catalog/covering-material.svg +1 -1
  400. package/icons/svg-pack/catalog/door-accessories.svg +1 -1
  401. package/icons/svg-pack/catalog/drainage-system.svg +1 -1
  402. package/icons/svg-pack/catalog/fastener.svg +1 -1
  403. package/icons/svg-pack/catalog/finishing-materials.svg +1 -1
  404. package/icons/svg-pack/catalog/fixing-impost.svg +1 -1
  405. package/icons/svg-pack/catalog/flask.svg +1 -1
  406. package/icons/svg-pack/catalog/foam-balloon.svg +1 -1
  407. package/icons/svg-pack/catalog/foam.svg +1 -1
  408. package/icons/svg-pack/catalog/glue.svg +1 -1
  409. package/icons/svg-pack/catalog/handle.svg +1 -1
  410. package/icons/svg-pack/catalog/instrument.svg +1 -1
  411. package/icons/svg-pack/catalog/kve-profile.svg +1 -1
  412. package/icons/svg-pack/catalog/lubricants.svg +1 -1
  413. package/icons/svg-pack/catalog/mosquito-net.svg +1 -1
  414. package/icons/svg-pack/catalog/mounting-accessories.svg +1 -1
  415. package/icons/svg-pack/catalog/net-order.svg +1 -1
  416. package/icons/svg-pack/catalog/panel-1.svg +1 -1
  417. package/icons/svg-pack/catalog/panel.svg +1 -1
  418. package/icons/svg-pack/catalog/polyethylene-film.svg +1 -1
  419. package/icons/svg-pack/catalog/profile-plastic.svg +1 -1
  420. package/icons/svg-pack/catalog/promo-materials.svg +1 -1
  421. package/icons/svg-pack/catalog/psul.svg +1 -1
  422. package/icons/svg-pack/catalog/rehau-profile.svg +1 -1
  423. package/icons/svg-pack/catalog/sandwich-plastic.svg +1 -1
  424. package/icons/svg-pack/catalog/sealer.svg +1 -1
  425. package/icons/svg-pack/catalog/siding-2.svg +1 -1
  426. package/icons/svg-pack/catalog/siding.svg +1 -1
  427. package/icons/svg-pack/catalog/start-finish-profile.svg +1 -1
  428. package/icons/svg-pack/catalog/steam-waterproofing.svg +1 -1
  429. package/icons/svg-pack/catalog/stiz.svg +1 -1
  430. package/icons/svg-pack/catalog/thermometer.svg +1 -1
  431. package/icons/svg-pack/catalog/windowsill.svg +1 -1
  432. package/icons/svg-pack/chart-column-plus.svg +1 -1
  433. package/icons/svg-pack/circle-arrow-in-right.svg +1 -1
  434. package/icons/svg-pack/contacts.svg +1 -1
  435. package/icons/svg-pack/deadline.svg +1 -1
  436. package/icons/svg-pack/file-p.svg +1 -1
  437. package/icons/svg-pack/file-search.svg +1 -1
  438. package/icons/svg-pack/file-w.svg +1 -1
  439. package/icons/svg-pack/file-x.svg +1 -1
  440. package/icons/svg-pack/grid-height-arrow.svg +1 -1
  441. package/icons/svg-pack/grid-width-arrow.svg +1 -1
  442. package/icons/svg-pack/layout-list-tree.svg +1 -1
  443. package/icons/svg-pack/list.svg +1 -1
  444. package/icons/svg-pack/puzzle.svg +1 -1
  445. package/icons/svg-pack/reclamation.svg +1 -1
  446. package/icons/svg-pack/retail-store.svg +1 -1
  447. package/icons/svg-pack/send.svg +1 -1
  448. package/index.d.ts +5 -0
  449. package/loader/index.d.ts +1 -0
  450. package/loader/sc-i-loader.d.ts +9 -0
  451. package/masks/index.d.ts +8 -0
  452. package/masks/sc-account-number-mask.d.ts +5 -0
  453. package/masks/sc-bic-mask.d.ts +5 -0
  454. package/masks/sc-correspondent-account-mask.d.ts +5 -0
  455. package/masks/sc-inn-mask.d.ts +9 -0
  456. package/masks/sc-kpp-mask.d.ts +5 -0
  457. package/masks/sc-ogrn-mask.d.ts +9 -0
  458. package/masks/sc-okpo-mask.d.ts +9 -0
  459. package/masks/sc-phone-verification-code-mask.d.ts +5 -0
  460. package/methods/index.d.ts +1 -0
  461. package/methods/sc-get-current-route.d.ts +8 -0
  462. package/models/i-sc-image.d.ts +17 -0
  463. package/models/index.d.ts +1 -0
  464. package/news/index.d.ts +3 -0
  465. package/news/news-card/sc-news-card.component.d.ts +22 -0
  466. package/news/news-card-skeleton/sc-news-card-skeleton.component.d.ts +16 -0
  467. package/news/sc-news.module.d.ts +15 -0
  468. package/noindex-wrapper/directives/index.d.ts +1 -0
  469. package/noindex-wrapper/directives/sc-noindex.directive.d.ts +29 -0
  470. package/noindex-wrapper/index.d.ts +2 -0
  471. package/noindex-wrapper/sc-noindex-wrapper.component.d.ts +9 -0
  472. package/order/directives/index.d.ts +2 -0
  473. package/order/directives/sc-order-accessor.directive.d.ts +13 -0
  474. package/order/directives/sc-order-options.d.ts +14 -0
  475. package/order/draft/sc-draft.component.d.ts +63 -0
  476. package/order/index.d.ts +13 -0
  477. package/order/models/i-new-order-form.d.ts +39 -0
  478. package/order/models/sc-i-cart-items-by-direction.d.ts +25 -0
  479. package/order/order-direction-items/sc-order-direction-items.component.d.ts +29 -0
  480. package/order/order-form/sc-order-form.component.d.ts +283 -0
  481. package/order/order-form/sc-order-form.config.d.ts +20 -0
  482. package/order/order-item/sc-order-item.component.d.ts +43 -0
  483. package/order/order-items-list/sc-order-items-list.component.d.ts +113 -0
  484. package/order/order-items-list-by-directions/sc-order-items-list-by-directions.component.d.ts +58 -0
  485. package/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.d.ts +55 -0
  486. package/order/sc-order.module.d.ts +18 -0
  487. package/order/sc-payment-status/sc-payment-status.component.d.ts +25 -0
  488. package/package.json +37 -35
  489. package/pages/frequently-asked-questions/sc-faq-query-params.d.ts +4 -0
  490. package/pages/frequently-asked-questions/sc-faq-question-anchor.d.ts +16 -0
  491. package/pages/frequently-asked-questions/sc-frequently-asked-questions.component.d.ts +84 -0
  492. package/pages/frequently-asked-questions/sc-get-faq-group-query-params.d.ts +10 -0
  493. package/pages/frequently-asked-questions/sc-page-size-options.d.ts +5 -0
  494. package/pages/frequently-asked-questions-group-selector/sc-frequently-asked-questions-group-selector.component.d.ts +47 -0
  495. package/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.d.ts +89 -0
  496. package/pages/index.d.ts +10 -0
  497. package/pages/news-list/sc-news-list.component.d.ts +57 -0
  498. package/pages/personal-data-processing-policy/sc-personal-data-processing-policy.component.d.ts +17 -0
  499. package/pages/privacy-policy/sc-privacy-policy.component.d.ts +17 -0
  500. package/pages/public-offer/sc-public-offer.component.d.ts +22 -0
  501. package/pagination/index.d.ts +1 -0
  502. package/pagination/sc-pagination-links/sc-pagination-links.component.d.ts +60 -0
  503. package/pipes/index.d.ts +2 -0
  504. package/pipes/sc-format-date.d.ts +20 -0
  505. package/pipes/sc-phone-format.d.ts +21 -0
  506. package/profile/index.d.ts +2 -0
  507. package/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.d.ts +126 -0
  508. package/profile/sc-profile.module.d.ts +23 -0
  509. package/providers/cleanup-recaptcha-artifacts.d.ts +7 -0
  510. package/providers/date-value-transformer/index.d.ts +3 -0
  511. package/providers/date-value-transformer/sc-date-value-transformer-types.d.ts +9 -0
  512. package/providers/date-value-transformer/sc-date-value-transformer-with-end-time.d.ts +16 -0
  513. package/providers/date-value-transformer/sc-date-value-transformer-with-start-time.d.ts +22 -0
  514. package/providers/index.d.ts +17 -0
  515. package/providers/null-on-empty-value-transformer/index.d.ts +1 -0
  516. package/providers/null-on-empty-value-transformer/sc-null-on-empty-value-transformer.d.ts +21 -0
  517. package/providers/sc-allow-select-terminated.d.ts +5 -0
  518. package/providers/sc-banner-duration.d.ts +5 -0
  519. package/providers/sc-block-incomplete-address.d.ts +5 -0
  520. package/providers/sc-country-ids.d.ts +5 -0
  521. package/providers/sc-date-formatter.d.ts +6 -0
  522. package/providers/sc-date-value-transformer.d.ts +5 -0
  523. package/providers/sc-debounce-time-default.d.ts +5 -0
  524. package/providers/sc-dialog-service.providers.d.ts +45 -0
  525. package/providers/sc-help-notification-close.d.ts +6 -0
  526. package/providers/sc-help-notification-limit.d.ts +5 -0
  527. package/providers/sc-hidden-print-elements.token.d.ts +6 -0
  528. package/providers/sc-max-files-in-form-input.d.ts +5 -0
  529. package/providers/sc-notify-when-in-stock-required-fields.d.ts +5 -0
  530. package/providers/sc-page-size-options.d.ts +5 -0
  531. package/providers/sc-user-providers.d.ts +21 -0
  532. package/providers/sc-verification-code-timeout.d.ts +5 -0
  533. package/public-api.d.ts +35 -0
  534. package/qrcode/index.d.ts +2 -0
  535. package/qrcode/qrcode-dialog/sc-qrcode-dialog.component.d.ts +37 -0
  536. package/qrcode/sc-qrcode.module.d.ts +14 -0
  537. package/release_notes.tmp +2 -16
  538. package/samples/index.d.ts +4 -0
  539. package/samples/interfaces/index.d.ts +2 -0
  540. package/samples/interfaces/sc-i-preview-sample.d.ts +56 -0
  541. package/samples/interfaces/sc-preview-mosquito-config.d.ts +62 -0
  542. package/samples/preview-sample/sc-preview-sample.component.d.ts +30 -0
  543. package/samples/sc-preview-samples-mosquito/sc-preview-samples-mosquito.component.d.ts +50 -0
  544. package/samples/sc-sample.module.d.ts +19 -0
  545. package/services/index.d.ts +2 -0
  546. package/services/print.service.d.ts +31 -0
  547. package/services/sc-help-notification.service.d.ts +70 -0
  548. package/share/index.d.ts +5 -0
  549. package/share/sc-share-dialog-data.d.ts +13 -0
  550. package/share/sc-share.service.d.ts +19 -0
  551. package/share/share-button/sc-share-button.component.d.ts +78 -0
  552. package/share/share-dialog/sc-share-dialog.component.d.ts +87 -0
  553. package/share/share-messengers-links/sc-share-messengers-links.component.d.ts +49 -0
  554. package/styles/taiga/variables.less +17 -35
  555. package/styles/tailwind/tailwind.scss +14 -56
  556. package/user/index.d.ts +5 -0
  557. package/user/reset-user-password/sc-reset-user-password.component.d.ts +46 -0
  558. package/user/sc-user.module.d.ts +24 -0
  559. package/user/update-user-info-dialog/sc-update-user-info-dialog.component.d.ts +63 -0
  560. package/user/user-managers/sc-user-managers.component.d.ts +23 -0
  561. package/user/user-phone-approve-dialog/sc-user-phone-approve-dialog.component.d.ts +53 -0
  562. package/validators/index.d.ts +6 -0
  563. package/validators/sc-at-least-one-required-validator.d.ts +10 -0
  564. package/validators/sc-bic-validator.d.ts +8 -0
  565. package/validators/sc-correspondent-account-validator.d.ts +8 -0
  566. package/validators/sc-password-confirm-matching-validator.d.ts +8 -0
  567. package/validators/sc-phone-validator.d.ts +5 -0
  568. package/validators/step-validator.d.ts +7 -0
  569. package/verification/index.d.ts +2 -0
  570. package/verification/sc-verification.module.d.ts +21 -0
  571. package/verification/verification-phone-check-form/sc-verification-phone-check-form.component.d.ts +145 -0
  572. package/types/snabcentr-client-ui.d.ts +0 -6787
@@ -0,0 +1,451 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output } from '@angular/core';
3
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
4
+ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
5
+ import { SC_CATEGORY_INFO, ScCatalogFilterService, ScIdOrSlugPipe, } from '@snabcentr/client-core';
6
+ import { tuiIsPresent } from '@taiga-ui/cdk';
7
+ import { TuiButton, TuiLabel, TuiNumberFormat, TuiTextfield } from '@taiga-ui/core';
8
+ import { TuiCheckbox, TuiInputNumber, TuiRange } from '@taiga-ui/kit';
9
+ import { isNil } from 'lodash-es';
10
+ import { BehaviorSubject, catchError, debounceTime, EMPTY, filter, map, merge, share, Subscription, switchMap, tap } from 'rxjs';
11
+ import { ScSelectOnFocusinDirective } from '../../directives/select-on-focusin/sc-select-on-focusin.directive';
12
+ import { ScCatalogFilterCollapsibleComponent } from './collapsible/sc-catalog-filter-collapsible.component';
13
+ import { SC_CATALOG_PRODUCTS_FILTERS } from './tokens/sc-catalog-products-filters';
14
+ import { SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY } from './tokens/sc-catalog-show-products-recursively';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/forms";
17
+ import * as i2 from "@taiga-ui/core/components/label";
18
+ import * as i3 from "@taiga-ui/core";
19
+ import * as i4 from "@taiga-ui/kit";
20
+ /**
21
+ * Компонент вывода фильтров каталога.
22
+ */
23
+ export class ScCatalogFiltersComponent {
24
+ /**
25
+ * Инициализирует экземпляр класса {@link ScCatalogFiltersComponent}.
26
+ */
27
+ constructor() {
28
+ /**
29
+ * Подписки синхронизации контролов формы (range slider, single-select checkbox).
30
+ */
31
+ this.formSyncs = new Subscription();
32
+ /**
33
+ * Сервис для работы с фильтрами каталога.
34
+ */
35
+ this.catalogFilterService = inject(ScCatalogFilterService);
36
+ /**
37
+ * Пайп, возвращающий идентификатор или символьное обозначение (slug) исходя из настроек окружения.
38
+ */
39
+ this.idOrSlugPipe = inject(ScIdOrSlugPipe);
40
+ /**
41
+ * Subject для хранения фильтров продуктов.
42
+ */
43
+ this.catalogProductsFilters$ = inject(SC_CATALOG_PRODUCTS_FILTERS);
44
+ /**
45
+ * Признак необходимости отображать фильтры для вложенных категорий.
46
+ */
47
+ this.isRecursively = inject(SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY);
48
+ /**
49
+ * Показывать ли кнопку «Показать результаты».
50
+ */
51
+ this.showResultsButton = input(false);
52
+ /**
53
+ * Событие нажатия на кнопку сброса всех фильтров.
54
+ */
55
+ this.resetFilters = output();
56
+ /**
57
+ * Событие нажатия на кнопку показа результатов.
58
+ */
59
+ this.showResults = output();
60
+ /**
61
+ * FormGroup для фильтров.
62
+ */
63
+ this.form = new FormGroup({});
64
+ /**
65
+ * {@link Observable} фильтров категории.
66
+ */
67
+ this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(catchError(() => EMPTY), filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), filter(tuiIsPresent), map((filters) => filters
68
+ .filter((item) => this.isRenderableFilter(item))
69
+ .map((item) => (item.type === 'checkbox' ? { ...item, values: [...item.values].sort((a, b) => a.label.localeCompare(b.label)) } : item))), tap((filters) => {
70
+ this.updateFormControls(filters);
71
+ }), share()));
72
+ inject(DestroyRef).onDestroy(() => {
73
+ this.formSyncs.unsubscribe();
74
+ });
75
+ this.form.valueChanges.pipe(debounceTime(0), takeUntilDestroyed()).subscribe((filters) => {
76
+ this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
77
+ });
78
+ // Внешний сброс фильтров (например, при смене категории): приводим форму к исходным значениям без повторной отправки в хранилище.
79
+ this.catalogProductsFilters$
80
+ .pipe(filter((value) => Object.keys(value).length === 0), takeUntilDestroyed())
81
+ .subscribe(() => {
82
+ this.resetAllFilters(false);
83
+ });
84
+ }
85
+ /**
86
+ * Проверяет, что фильтр пригоден для вывода: у checkbox есть непустой список значений, у range заданы разные границы.
87
+ * Некорректные фильтры из ответа API пропускаются, чтобы не ломать вывод остальных.
88
+ *
89
+ * @param item Фильтр каталога.
90
+ */
91
+ isRenderableFilter(item) {
92
+ switch (item.type) {
93
+ case 'checkbox':
94
+ return Array.isArray(item.values) && item.values.length > 0;
95
+ case 'range':
96
+ return !isNil(item.min) && !isNil(item.max) && item.min !== item.max;
97
+ default:
98
+ return true;
99
+ }
100
+ }
101
+ /**
102
+ * Обновляет состав контролов формы на основе переданных фильтров.
103
+ *
104
+ * @param filters Массив фильтров для создания контролов.
105
+ */
106
+ updateFormControls(filters) {
107
+ this.formSyncs.unsubscribe();
108
+ this.formSyncs = new Subscription();
109
+ const appliedFilters = this.getAppliedFilters();
110
+ Object.keys(this.form.controls).forEach((key) => {
111
+ this.form.removeControl(key, { emitEvent: false });
112
+ });
113
+ filters.forEach((item) => {
114
+ // eslint-disable-next-line security/detect-object-injection
115
+ const appliedValue = appliedFilters[item.id];
116
+ switch (item.type) {
117
+ case 'checkbox': {
118
+ const checkboxControl = this.createCheckboxFormControl(item, appliedValue);
119
+ this.form.addControl(item.id, checkboxControl, { emitEvent: false });
120
+ // Single-select для !isMultiple: при выборе одного остальные снимаются.
121
+ if (!item.isMultiple && item.values.length > 1) {
122
+ this.formSyncs.add(this.syncSingleSelectCheckbox(checkboxControl));
123
+ }
124
+ break;
125
+ }
126
+ case 'range': {
127
+ const rangeControl = this.createRangeFormControl(item, appliedValue);
128
+ this.form.addControl(item.id, rangeControl, { emitEvent: false });
129
+ this.formSyncs.add(this.syncRangeFromToAndSlider(rangeControl));
130
+ break;
131
+ }
132
+ case 'toggle':
133
+ this.form.addControl(item.id, this.createToggleFormControl(item, appliedValue), { emitEvent: false });
134
+ break;
135
+ default:
136
+ break;
137
+ }
138
+ });
139
+ }
140
+ /**
141
+ * Возвращает текущие применённые фильтры из хранилища фильтров.
142
+ *
143
+ * Позволяет восстанавливать выбранные значения при пересоздании компонента (повторное открытие диалога или блока фильтров).
144
+ */
145
+ getAppliedFilters() {
146
+ return this.catalogProductsFilters$ instanceof BehaviorSubject ? this.catalogProductsFilters$.value : {};
147
+ }
148
+ /**
149
+ * Преобразует значения формы в объект фильтров свойств.
150
+ *
151
+ * @param value Значения формы.
152
+ * @returns Объект фильтров свойств.
153
+ */
154
+ buildPropertyFilters(value) {
155
+ const result = {};
156
+ this.filters()?.forEach((filterItem) => {
157
+ const controlValue = value[filterItem.id];
158
+ if (isNil(controlValue)) {
159
+ return;
160
+ }
161
+ switch (filterItem.type) {
162
+ case 'checkbox':
163
+ this.processCheckboxFilter(result, filterItem, controlValue);
164
+ break;
165
+ case 'range':
166
+ this.processRangeFilter(result, filterItem, controlValue);
167
+ break;
168
+ case 'toggle':
169
+ this.processToggleFilter(result, filterItem.id, controlValue);
170
+ break;
171
+ default:
172
+ break;
173
+ }
174
+ });
175
+ return result;
176
+ }
177
+ /**
178
+ * Создаёт FormGroup для checkbox: на каждый {@code value.id} — булевый контрол.
179
+ *
180
+ * Единый формат и для одного, и для множества значений: шаблон рендерит их одинаково.
181
+ * Различие в API-выводе для одиночного значения (boolean вместо массива) обрабатывается в {@link processCheckboxFilter}.
182
+ *
183
+ * @param checkboxFilter Фильтр типа checkbox.
184
+ * @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
185
+ */
186
+ createCheckboxFormControl(checkboxFilter, appliedValue) {
187
+ const appliedIds = Array.isArray(appliedValue) ? appliedValue : null;
188
+ const isSelected = (id) => appliedIds?.includes(id) ?? checkboxFilter.selectedValues?.includes(id) ?? false;
189
+ const controls = {};
190
+ checkboxFilter.values.forEach((value) => {
191
+ controls[value.id] = new FormControl(isSelected(value.id), { nonNullable: true });
192
+ });
193
+ return new FormGroup(controls);
194
+ }
195
+ /**
196
+ * Создаёт {@link FormGroup} для range: {@code from}, {@code to}, {@code slider} (кортеж для {@link TuiRange}).
197
+ *
198
+ * @param rangeFilter Фильтр типа range.
199
+ * @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
200
+ */
201
+ createRangeFormControl(rangeFilter, appliedValue) {
202
+ const appliedRange = appliedValue && typeof appliedValue === 'object' && !Array.isArray(appliedValue) ? appliedValue : null;
203
+ const fromValue = Number(appliedRange?.from ?? rangeFilter.selectedMin ?? rangeFilter.min);
204
+ const toValue = Number(appliedRange?.to ?? rangeFilter.selectedMax ?? rangeFilter.max);
205
+ return new FormGroup({
206
+ from: new FormControl(fromValue, { nonNullable: true }),
207
+ to: new FormControl(toValue, { nonNullable: true }),
208
+ slider: new FormControl([fromValue, toValue], { nonNullable: true }),
209
+ });
210
+ }
211
+ /**
212
+ * Реализует single-select поведение для FormGroup с булевыми контролами:
213
+ * при появлении нового true остальные контролы группы сбрасываются в false.
214
+ *
215
+ * Сохраняет последнее «стабильное» состояние и сравнивает следующее значение с ним —
216
+ * новый true (отсутствовал в prev) считается выбранным, остальные сбрасываются через setValue.
217
+ *
218
+ * @param group FormGroup checkbox-фильтра (id → boolean).
219
+ */
220
+ syncSingleSelectCheckbox(group) {
221
+ let previousState = group.getRawValue();
222
+ return group.valueChanges.subscribe((value) => {
223
+ const current = value;
224
+ const newlyChecked = Object.entries(current).find(([id, isChecked]) => {
225
+ // eslint-disable-next-line security/detect-object-injection
226
+ return isChecked && !previousState[id];
227
+ })?.[0];
228
+ if (!newlyChecked) {
229
+ previousState = { ...current };
230
+ return;
231
+ }
232
+ const next = {};
233
+ Object.keys(group.controls).forEach((id) => {
234
+ // eslint-disable-next-line security/detect-object-injection
235
+ next[id] = id === newlyChecked;
236
+ });
237
+ previousState = next;
238
+ group.setValue(next);
239
+ });
240
+ }
241
+ /**
242
+ * Связывает поля «от»/«до» с контролом слайдера.
243
+ *
244
+ * @param group FormGroup range-фильтра.
245
+ */
246
+ syncRangeFromToAndSlider(group) {
247
+ const from = group.get('from');
248
+ const to = group.get('to');
249
+ const slider = group.get('slider');
250
+ if (!from || !to || !slider) {
251
+ return new Subscription();
252
+ }
253
+ const sub = new Subscription();
254
+ // Инпуты → слайдер; если «от» > «до», поднимаем «до» до «от».
255
+ const applySliderFromInputs = () => {
256
+ const low = Number(from.value);
257
+ let high = Number(to.value);
258
+ if (low > high) {
259
+ high = low;
260
+ to.setValue(high, { emitEvent: false });
261
+ }
262
+ const currentPair = slider.value;
263
+ if (currentPair[0] !== low || currentPair[1] !== high) {
264
+ slider.setValue([low, high], { emitEvent: false });
265
+ slider.markAsDirty();
266
+ }
267
+ };
268
+ sub.add(merge(from.valueChanges, to.valueChanges).subscribe(applySliderFromInputs));
269
+ sub.add(slider.valueChanges.subscribe((value) => {
270
+ const [low, high] = value;
271
+ if (from.value !== low) {
272
+ from.setValue(low, { emitEvent: false });
273
+ from.markAsDirty();
274
+ }
275
+ if (to.value !== high) {
276
+ to.setValue(high, { emitEvent: false });
277
+ to.markAsDirty();
278
+ }
279
+ }));
280
+ // Совпасть с полями при первом показе (уже совпадает при создании, но на всякий случай).
281
+ applySliderFromInputs();
282
+ return sub;
283
+ }
284
+ /**
285
+ * Создает FormControl для toggle.
286
+ *
287
+ * @param toggleFilter Фильтр типа toggle.
288
+ * @param appliedValue Применённое ранее значение фильтра из хранилища фильтров.
289
+ */
290
+ createToggleFormControl(toggleFilter, appliedValue) {
291
+ const appliedToggle = typeof appliedValue === 'boolean' ? appliedValue : undefined;
292
+ return new FormControl(appliedToggle ?? toggleFilter.selectedValue ?? false, { nonNullable: true });
293
+ }
294
+ /**
295
+ * Обрабатывает checkbox: FormGroup → string[] выбранных id; для единственного значения — boolean (как toggle).
296
+ *
297
+ * @param result Объект результата для заполнения.
298
+ * @param checkboxFilter Метафильтр checkbox.
299
+ * @param controlValue Значение контрола формы (запись id → boolean).
300
+ */
301
+ processCheckboxFilter(result, checkboxFilter, controlValue) {
302
+ const selectedIds = Object.entries(controlValue)
303
+ .filter(([, isSelected]) => isSelected)
304
+ .map(([id]) => id);
305
+ if (selectedIds.length === 0) {
306
+ return;
307
+ }
308
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
309
+ result[checkboxFilter.id] = selectedIds;
310
+ }
311
+ /**
312
+ * Обрабатывает range фильтр: границы «от»/«до» независимы, на сервер уходит только та, что отличается от дефолта
313
+ * ({@link ScRangeFilter.selectedMin}/{@link ScRangeFilter.selectedMax} либо min/max). Если обе равны дефолтам — фильтр не добавляется.
314
+ *
315
+ * @param result Объект результата для заполнения.
316
+ * @param rangeFilter Метафильтр range (границы и выбранные значения по умолчанию).
317
+ * @param range Значение контрола формы (объект с границами).
318
+ * @param range.from Начальное значение диапазона.
319
+ * @param range.to Конечное значение диапазона.
320
+ */
321
+ processRangeFilter(result, rangeFilter, range) {
322
+ const defaultFrom = rangeFilter.selectedMin ?? rangeFilter.min;
323
+ const defaultTo = rangeFilter.selectedMax ?? rangeFilter.max;
324
+ const value = {};
325
+ if (range.from !== defaultFrom) {
326
+ value.from = String(range.from);
327
+ }
328
+ if (range.to !== defaultTo) {
329
+ value.to = String(range.to);
330
+ }
331
+ if (value.from !== undefined || value.to !== undefined) {
332
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
333
+ result[rangeFilter.id] = value;
334
+ }
335
+ }
336
+ /**
337
+ * Обрабатывает toggle фильтр.
338
+ *
339
+ * @param result Объект результата для заполнения.
340
+ * @param filterId Идентификатор фильтра.
341
+ * @param controlValue Значение контрола формы.
342
+ */
343
+ processToggleFilter(result, filterId, controlValue) {
344
+ if (controlValue) {
345
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
346
+ result[filterId] = controlValue;
347
+ }
348
+ }
349
+ /**
350
+ * Сбрасывает поле «от» диапазона к минимальному значению фильтра.
351
+ *
352
+ * @param filterId Идентификатор фильтра.
353
+ * @param min Минимальное значение диапазона.
354
+ */
355
+ resetRangeFrom(filterId, min) {
356
+ this.form.get(filterId)?.get('from')?.reset(+min);
357
+ }
358
+ /**
359
+ * Сбрасывает поле «до» диапазона к максимальному значению фильтра.
360
+ *
361
+ * @param filterId Идентификатор фильтра.
362
+ * @param max Максимальное значение диапазона.
363
+ */
364
+ resetRangeTo(filterId, max) {
365
+ this.form.get(filterId)?.get('to')?.reset(+max);
366
+ }
367
+ /**
368
+ * Сбрасывает все чекбоксы группы в `false`.
369
+ *
370
+ * @param filterId Идентификатор фильтра (ключ FormGroup в форме).
371
+ */
372
+ resetCheckboxGroup(filterId) {
373
+ const group = this.form.get(filterId);
374
+ if (!group) {
375
+ return;
376
+ }
377
+ const resetValue = {};
378
+ Object.keys(group.controls).forEach((id) => {
379
+ // eslint-disable-next-line security/detect-object-injection
380
+ resetValue[id] = false;
381
+ });
382
+ group.reset(resetValue);
383
+ }
384
+ /**
385
+ * Сбрасывает все фильтры и оповещает родителя о нажатии кнопки сброса.
386
+ */
387
+ onResetFiltersClick() {
388
+ this.resetAllFilters();
389
+ this.resetFilters.emit();
390
+ }
391
+ /**
392
+ * Оповещает родителя о нажатии кнопки показа результатов.
393
+ */
394
+ onShowResultsClick() {
395
+ this.showResults.emit();
396
+ }
397
+ /**
398
+ * Сбрасывает все фильтры к исходным значениям.
399
+ *
400
+ * @param emitEvent Признак необходимости эмитить события изменения контролов (false — тихий сброс без отправки значений в хранилище фильтров).
401
+ */
402
+ resetAllFilters(emitEvent = true) {
403
+ this.filters()?.forEach((filterItem) => {
404
+ const control = this.form.get(filterItem.id);
405
+ if (!control) {
406
+ return;
407
+ }
408
+ switch (filterItem.type) {
409
+ case 'checkbox': {
410
+ const group = control;
411
+ const resetValue = {};
412
+ Object.keys(group.controls).forEach((id) => {
413
+ // eslint-disable-next-line security/detect-object-injection
414
+ resetValue[id] = false;
415
+ });
416
+ group.reset(resetValue, { emitEvent });
417
+ break;
418
+ }
419
+ case 'toggle':
420
+ control.reset(false, { emitEvent });
421
+ break;
422
+ case 'range': {
423
+ const group = control;
424
+ const { min, max } = filterItem;
425
+ group.reset({ from: min, to: max, slider: [min, max] }, { emitEvent });
426
+ break;
427
+ }
428
+ default:
429
+ break;
430
+ }
431
+ });
432
+ }
433
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
434
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { showResultsButton: { classPropertyName: "showResultsButton", publicName: "showResultsButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetFilters: "resetFilters", showResults: "showResults" }, ngImport: i0, template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: ScCatalogFilterCollapsibleComponent, selector: "sc-catalog-filter-collapsible", inputs: ["itemsCount", "showReset"], outputs: ["resetGroup"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: i4.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "component", type: TuiRange, selector: "tui-range", inputs: ["min", "max", "step", "size", "segments", "keySteps", "focusable", "margin", "limit"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
435
+ }
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
437
+ type: Component,
438
+ args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
439
+ ReactiveFormsModule,
440
+ TuiTextfield,
441
+ ScSelectOnFocusinDirective,
442
+ ScCatalogFilterCollapsibleComponent,
443
+ TuiLabel,
444
+ TuiNumberFormat,
445
+ TuiCheckbox,
446
+ TuiInputNumber,
447
+ TuiRange,
448
+ TuiButton,
449
+ ], template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
450
+ }], ctorParameters: () => [] });
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL2NhdGFsb2ctZmlsdGVycy9zYy1jYXRhbG9nLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFFM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0UsT0FBTyxFQUNILGdCQUFnQixFQUVoQixzQkFBc0IsRUFFdEIsY0FBYyxHQUtqQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlB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QUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXZmUSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw2VENqRHRDLHF3UUF1SkEsaUpEbEhRLG1CQUFtQix1bURBRW5CLDBCQUEwQixnTUFDMUIsbUNBQW1DLHdJQUduQyxXQUFXLDZPQUVYLFFBQVEsc0pBQ1IsU0FBUzs7NEZBR0oseUJBQXlCO2tCQW5CckMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU0sV0FDdEM7d0JBQ0wsbUJBQW1CO3dCQUNuQixZQUFZO3dCQUNaLDBCQUEwQjt3QkFDMUIsbUNBQW1DO3dCQUNuQyxRQUFRO3dCQUNSLGVBQWU7d0JBQ2YsV0FBVzt3QkFDWCxjQUFjO3dCQUNkLFFBQVE7d0JBQ1IsU0FBUztxQkFDWiIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cblxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgU0NfQ0FURUdPUllfSU5GTyxcbiAgICBTY0NhdGFsb2dGaWx0ZXIsXG4gICAgU2NDYXRhbG9nRmlsdGVyU2VydmljZSxcbiAgICBTY0lDaGVja2JveEZpbHRlcixcbiAgICBTY0lkT3JTbHVnUGlwZSxcbiAgICBTY0lSYW5nZUZpbHRlcixcbiAgICBTY1Byb3BlcnR5RmlsdGVycyxcbiAgICBTY1JhbmdlRmlsdGVyLFxuICAgIFNjVG9nZ2xlRmlsdGVyLFxufSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUlzUHJlc2VudCB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpQnV0dG9uLCBUdWlMYWJlbCwgVHVpTnVtYmVyRm9ybWF0LCBUdWlUZXh0ZmllbGQgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBUdWlDaGVja2JveCwgVHVpSW5wdXROdW1iZXIsIFR1aVJhbmdlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNhdGNoRXJyb3IsIGRlYm91bmNlVGltZSwgRU1QVFksIGZpbHRlciwgbWFwLCBtZXJnZSwgc2hhcmUsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NTZWxlY3RPbkZvY3VzaW5EaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL3NlbGVjdC1vbi1mb2N1c2luL3NjLXNlbGVjdC1vbi1mb2N1c2luLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTY0NhdGFsb2dGaWx0ZXJDb2xsYXBzaWJsZUNvbXBvbmVudCB9IGZyb20gJy4vY29sbGFwc2libGUvc2MtY2F0YWxvZy1maWx0ZXItY29sbGFwc2libGUuY29tcG9uZW50JztcbmltcG9ydCB7IFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyB9IGZyb20gJy4vdG9rZW5zL3NjLWNhdGFsb2ctcHJvZHVjdHMtZmlsdGVycyc7XG5pbXBvcnQgeyBTQ19DQVRBTE9HX1NIT1dfUFJPRFVDVFNfUkVDVVJTSVZFTFkgfSBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXNob3ctcHJvZHVjdHMtcmVjdXJzaXZlbHknO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQstGL0LLQvtC00LAg0YTQuNC70YzRgtGA0L7QsiDQutCw0YLQsNC70L7Qs9CwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtY2F0YWxvZy1maWx0ZXJzJyxcbiAgICBzdHlsZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFR1aVRleHRmaWVsZCxcbiAgICAgICAgU2NTZWxlY3RPbkZvY3VzaW5EaXJlY3RpdmUsXG4gICAgICAgIFNjQ2F0YWxvZ0ZpbHRlckNvbGxhcHNpYmxlQ29tcG9uZW50LFxuICAgICAgICBUdWlMYWJlbCxcbiAgICAgICAgVHVpTnVtYmVyRm9ybWF0LFxuICAgICAgICBUdWlDaGVja2JveCxcbiAgICAgICAgVHVpSW5wdXROdW1iZXIsXG4gICAgICAgIFR1aVJhbmdlLFxuICAgICAgICBUdWlCdXR0b24sXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2NDYXRhbG9nRmlsdGVyc0NvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICog0J/QvtC00L/QuNGB0LrQuCDRgdC40L3RhdGA0L7QvdC40LfQsNGG0LjQuCDQutC+0L3RgtGA0L7Qu9C+0LIg0YTQvtGA0LzRiyAocmFuZ2Ugc2xpZGVyLCBzaW5nbGUtc2VsZWN0IGNoZWNrYm94KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZvcm1TeW5jcyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINGE0LjQu9GM0YLRgNCw0LzQuCDQutCw0YLQsNC70L7Qs9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZ0ZpbHRlclNlcnZpY2U6IFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UgPSBpbmplY3QoU2NDYXRhbG9nRmlsdGVyU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICogU3ViamVjdCDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRhNC40LvRjNGC0YDQvtCyINC/0YDQvtC00YPQutGC0L7Qsi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dQcm9kdWN0c0ZpbHRlcnMkID0gaW5qZWN0KFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNC40LvRjNGC0YDRiyDQtNC70Y8g0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzUmVjdXJzaXZlbHkgPSBpbmplY3QoU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7QutCw0LfRi9Cy0LDRgtGMINC70Lgg0LrQvdC+0L/QutGDIMKr0J/QvtC60LDQt9Cw0YLRjCDRgNC10LfRg9C70YzRgtCw0YLRi8K7LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzaG93UmVzdWx0c0J1dHRvbiA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LrQvdC+0L/QutGDINGB0LHRgNC+0YHQsCDQstGB0LXRhSDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSByZXNldEZpbHRlcnMgPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LrQvdC+0L/QutGDINC/0L7QutCw0LfQsCDRgNC10LfRg9C70YzRgtCw0YLQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzaG93UmVzdWx0cyA9IG91dHB1dCgpO1xuXG4gICAgLyoqXG4gICAgICogRm9ybUdyb3VwINC00LvRjyDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cDxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sPiB8IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlUmFuZ2VGb3JtQ29udHJvbD4gfCBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmNyZWF0ZVRvZ2dsZUZvcm1Db250cm9sPj5cbiAgICA+KHt9KTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRhNC40LvRjNGC0YDQvtCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVycyA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoU0NfQ0FURUdPUllfSU5GTykucGlwZShcbiAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gRU1QVFkpLFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGNhdGVnb3J5KSA9PiB0aGlzLmNhdGFsb2dGaWx0ZXJTZXJ2aWNlLmdldEZpbHRlcnMkKHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShjYXRlZ29yeSksIHRoaXMuaXNSZWN1cnNpdmVseSkpLFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICBtYXAoKGZpbHRlcnMpID0+XG4gICAgICAgICAgICAgICAgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiB0aGlzLmlzUmVuZGVyYWJsZUZpbHRlcihpdGVtKSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0udHlwZSA9PT0gJ2NoZWNrYm94JyA/IHsgLi4uaXRlbSwgdmFsdWVzOiBbLi4uaXRlbS52YWx1ZXNdLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSkgfSA6IGl0ZW0pKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRhcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xzKGZpbHRlcnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY0NhdGFsb2dGaWx0ZXJzQ29tcG9uZW50fS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChEZXN0cm95UmVmKS5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3luY3MudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJC5uZXh0KHRoaXMuYnVpbGRQcm9wZXJ0eUZpbHRlcnMoZmlsdGVycykpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyDQktC90LXRiNC90LjQuSDRgdCx0YDQvtGBINGE0LjQu9GM0YLRgNC+0LIgKNC90LDQv9GA0LjQvNC10YAsINC/0YDQuCDRgdC80LXQvdC1INC60LDRgtC10LPQvtGA0LjQuCk6INC/0YDQuNCy0L7QtNC40Lwg0YTQvtGA0LzRgyDQuiDQuNGB0YXQvtC00L3Ri9C8INC30L3QsNGH0LXQvdC40Y/QvCDQsdC10Lcg0L/QvtCy0YLQvtGA0L3QvtC5INC+0YLQv9GA0LDQstC60Lgg0LIg0YXRgNCw0L3QuNC70LjRidC1LlxuICAgICAgICB0aGlzLmNhdGFsb2dQcm9kdWN0c0ZpbHRlcnMkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKHZhbHVlKSA9PiBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEFsbEZpbHRlcnMoZmFsc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LLQtdGA0Y/QtdGCLCDRh9GC0L4g0YTQuNC70YzRgtGAINC/0YDQuNCz0L7QtNC10L0g0LTQu9GPINCy0YvQstC+0LTQsDog0YMgY2hlY2tib3gg0LXRgdGC0Ywg0L3QtdC/0YPRgdGC0L7QuSDRgdC/0LjRgdC+0Log0LfQvdCw0YfQtdC90LjQuSwg0YMgcmFuZ2Ug0LfQsNC00LDQvdGLINGA0LDQt9C90YvQtSDQs9GA0LDQvdC40YbRiy5cbiAgICAgKiDQndC10LrQvtGA0YDQtdC60YLQvdGL0LUg0YTQuNC70YzRgtGA0Ysg0LjQtyDQvtGC0LLQtdGC0LAgQVBJINC/0YDQvtC/0YPRgdC60LDRjtGC0YHRjywg0YfRgtC+0LHRiyDQvdC1INC70L7QvNCw0YLRjCDQstGL0LLQvtC0INC+0YHRgtCw0LvRjNC90YvRhS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtINCk0LjQu9GM0YLRgCDQutCw0YLQsNC70L7Qs9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNSZW5kZXJhYmxlRmlsdGVyKGl0ZW06IFNjQ2F0YWxvZ0ZpbHRlcik6IGJvb2xlYW4ge1xuICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGl0ZW0udmFsdWVzKSAmJiBpdGVtLnZhbHVlcy5sZW5ndGggPiAwO1xuICAgICAgICAgICAgY2FzZSAncmFuZ2UnOlxuICAgICAgICAgICAgICAgIHJldHVybiAhaXNOaWwoaXRlbS5taW4pICYmICFpc05pbChpdGVtLm1heCkgJiYgaXRlbS5taW4gIT09IGl0ZW0ubWF4O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHQvdC+0LLQu9GP0LXRgiDRgdC+0YHRgtCw0LIg0LrQvtC90YLRgNC+0LvQvtCyINGE0L7RgNC80Ysg0L3QsCDQvtGB0L3QvtCy0LUg0L/QtdGA0LXQtNCw0L3QvdGL0YUg0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJzINCc0LDRgdGB0LjQsiDRhNC40LvRjNGC0YDQvtCyINC00LvRjyDRgdC+0LfQtNCw0L3QuNGPINC60L7QvdGC0YDQvtC70L7Qsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlRm9ybUNvbnRyb2xzKGZpbHRlcnM6IFNjQ2F0YWxvZ0ZpbHRlcltdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybVN5bmNzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZm9ybVN5bmNzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IGFwcGxpZWRGaWx0ZXJzID0gdGhpcy5nZXRBcHBsaWVkRmlsdGVycygpO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChrZXkgYXMgbmV2ZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgIGNvbnN0IGFwcGxpZWRWYWx1ZSA9IGFwcGxpZWRGaWx0ZXJzW2l0ZW0uaWRdO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2JveENvbnRyb2wgPSB0aGlzLmNyZWF0ZUNoZWNrYm94Rm9ybUNvbnRyb2woaXRlbSwgYXBwbGllZFZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgY2hlY2tib3hDb250cm9sLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLXNlbGVjdCDQtNC70Y8gIWlzTXVsdGlwbGU6INC/0YDQuCDQstGL0LHQvtGA0LUg0L7QtNC90L7Qs9C+INC+0YHRgtCw0LvRjNC90YvQtSDRgdC90LjQvNCw0Y7RgtGB0Y8uXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5pc011bHRpcGxlICYmIGl0ZW0udmFsdWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybVN5bmNzLmFkZCh0aGlzLnN5bmNTaW5nbGVTZWxlY3RDaGVja2JveChjaGVja2JveENvbnRyb2wpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAncmFuZ2UnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlQ29udHJvbCA9IHRoaXMuY3JlYXRlUmFuZ2VGb3JtQ29udHJvbChpdGVtLCBhcHBsaWVkVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uYWRkQ29udHJvbChpdGVtLmlkLCByYW5nZUNvbnRyb2wsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtU3luY3MuYWRkKHRoaXMuc3luY1JhbmdlRnJvbVRvQW5kU2xpZGVyKHJhbmdlQ29udHJvbCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAndG9nZ2xlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVUb2dnbGVGb3JtQ29udHJvbChpdGVtLCBhcHBsaWVkVmFsdWUpLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgtC10LrRg9GJ0LjQtSDQv9GA0LjQvNC10L3RkdC90L3Ri9C1INGE0LjQu9GM0YLRgNGLINC40Lcg0YXRgNCw0L3QuNC70LjRidCwINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICpcbiAgICAgKiDQn9C+0LfQstC+0LvRj9C10YIg0LLQvtGB0YHRgtCw0L3QsNCy0LvQuNCy0LDRgtGMINCy0YvQsdGA0LDQvdC90YvQtSDQt9C90LDRh9C10L3QuNGPINC/0YDQuCDQv9C10YDQtdGB0L7Qt9C00LDQvdC40Lgg0LrQvtC80L/QvtC90LXQvdGC0LAgKNC/0L7QstGC0L7RgNC90L7QtSDQvtGC0LrRgNGL0YLQuNC1INC00LjQsNC70L7Qs9CwINC40LvQuCDQsdC70L7QutCwINGE0LjQu9GM0YLRgNC+0LIpLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0QXBwbGllZEZpbHRlcnMoKTogU2NQcm9wZXJ0eUZpbHRlcnMge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJCBpbnN0YW5jZW9mIEJlaGF2aW9yU3ViamVjdCA/IHRoaXMuY2F0YWxvZ1Byb2R1Y3RzRmlsdGVycyQudmFsdWUgOiB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LXQvtCx0YDQsNC30YPQtdGCINC30L3QsNGH0LXQvdC40Y8g0YTQvtGA0LzRiyDQsiDQvtCx0YrQtdC60YIg0YTQuNC70YzRgtGA0L7QsiDRgdCy0L7QudGB0YLQsi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2YWx1ZSDQl9C90LDRh9C10L3QuNGPINGE0L7RgNC80YsuXG4gICAgICogQHJldHVybnMg0J7QsdGK0LXQutGCINGE0LjQu9GM0YLRgNC+0LIg0YHQstC+0LnRgdGC0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGJ1aWxkUHJvcGVydHlGaWx0ZXJzKHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFNjUHJvcGVydHlGaWx0ZXJzIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycygpPy5mb3JFYWNoKChmaWx0ZXJJdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sVmFsdWUgPSB2YWx1ZVtmaWx0ZXJJdGVtLmlkXTtcblxuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbnRyb2xWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVySXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGVja2JveEZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0sIGNvbnRyb2xWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLCBjb250cm9sVmFsdWUgYXMgeyBmcm9tOiBudW1iZXI7IHRvOiBudW1iZXIgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1RvZ2dsZUZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0uaWQsIGNvbnRyb2xWYWx1ZSBhcyBib29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNGR0YIgRm9ybUdyb3VwINC00LvRjyBjaGVja2JveDog0L3QsCDQutCw0LbQtNGL0Lkge0Bjb2RlIHZhbHVlLmlkfSDigJQg0LHRg9C70LXQstGL0Lkg0LrQvtC90YLRgNC+0LsuXG4gICAgICpcbiAgICAgKiDQldC00LjQvdGL0Lkg0YTQvtGA0LzQsNGCINC4INC00LvRjyDQvtC00L3QvtCz0L4sINC4INC00LvRjyDQvNC90L7QttC10YHRgtCy0LAg0LfQvdCw0YfQtdC90LjQuTog0YjQsNCx0LvQvtC9INGA0LXQvdC00LXRgNC40YIg0LjRhSDQvtC00LjQvdCw0LrQvtCy0L4uXG4gICAgICog0KDQsNC30LvQuNGH0LjQtSDQsiBBUEkt0LLRi9Cy0L7QtNC1INC00LvRjyDQvtC00LjQvdC+0YfQvdC+0LPQviDQt9C90LDRh9C10L3QuNGPIChib29sZWFuINCy0LzQtdGB0YLQviDQvNCw0YHRgdC40LLQsCkg0L7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGC0YHRjyDQsiB7QGxpbmsgcHJvY2Vzc0NoZWNrYm94RmlsdGVyfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja2JveEZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgY2hlY2tib3guXG4gICAgICogQHBhcmFtIGFwcGxpZWRWYWx1ZSDQn9GA0LjQvNC10L3RkdC90L3QvtC1INGA0LDQvdC10LUg0LfQvdCw0YfQtdC90LjQtSDRhNC40LvRjNGC0YDQsCDQuNC3INGF0YDQsNC90LjQu9C40YnQsCDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGNoZWNrYm94RmlsdGVyOiBTY0lDaGVja2JveEZpbHRlciwgYXBwbGllZFZhbHVlPzogU2NQcm9wZXJ0eUZpbHRlcnNbc3RyaW5nXSk6IEZvcm1Hcm91cDxSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4+IHtcbiAgICAgICAgY29uc3QgYXBwbGllZElkcyA9IEFycmF5LmlzQXJyYXkoYXBwbGllZFZhbHVlKSA/IGFwcGxpZWRWYWx1ZSA6IG51bGw7XG4gICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSAoaWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4gYXBwbGllZElkcz8uaW5jbHVkZXMoaWQpID8/IGNoZWNrYm94RmlsdGVyLnNlbGVjdGVkVmFsdWVzPy5pbmNsdWRlcyhpZCkgPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4gPSB7fTtcblxuICAgICAgICBjaGVja2JveEZpbHRlci52YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xzW3ZhbHVlLmlkXSA9IG5ldyBGb3JtQ29udHJvbChpc1NlbGVjdGVkKHZhbHVlLmlkKSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDRkdGCIHtAbGluayBGb3JtR3JvdXB9INC00LvRjyByYW5nZToge0Bjb2RlIGZyb219LCB7QGNvZGUgdG99LCB7QGNvZGUgc2xpZGVyfSAo0LrQvtGA0YLQtdC2INC00LvRjyB7QGxpbmsgVHVpUmFuZ2V9KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZUZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgcmFuZ2UuXG4gICAgICogQHBhcmFtIGFwcGxpZWRWYWx1ZSDQn9GA0LjQvNC10L3RkdC90L3QvtC1INGA0LDQvdC10LUg0LfQvdCw0YfQtdC90LjQtSDRhNC40LvRjNGC0YDQsCDQuNC3INGF0YDQsNC90LjQu9C40YnQsCDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVSYW5nZUZvcm1Db250cm9sKFxuICAgICAgICByYW5nZUZpbHRlcjogU2NSYW5nZUZpbHRlcixcbiAgICAgICAgYXBwbGllZFZhbHVlPzogU2NQcm9wZXJ0eUZpbHRlcnNbc3RyaW5nXVxuICAgICk6IEZvcm1Hcm91cDx7XG4gICAgICAgIGZyb206IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgICAgIHRvOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgICAgICBzbGlkZXI6IEZvcm1Db250cm9sPFtudW1iZXIsIG51bWJlcl0+O1xuICAgIH0+IHtcbiAgICAgICAgY29uc3QgYXBwbGllZFJhbmdlID0gYXBwbGllZFZhbHVlICYmIHR5cGVvZiBhcHBsaWVkVmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGFwcGxpZWRWYWx1ZSkgPyBhcHBsaWVkVmFsdWUgOiBudWxsO1xuICAgICAgICBjb25zdCBmcm9tVmFsdWUgPSBOdW1iZXIoYXBwbGllZFJhbmdlPy5mcm9tID8/IHJhbmdlRmlsdGVyLnNlbGVjdGVkTWluID8/IHJhbmdlRmlsdGVyLm1pbik7XG4gICAgICAgIGNvbnN0IHRvVmFsdWUgPSBOdW1iZXIoYXBwbGllZFJhbmdlPy50byA/PyByYW5nZUZpbHRlci5zZWxlY3RlZE1heCA/PyByYW5nZUZpbHRlci5tYXgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIGZyb206IG5ldyBGb3JtQ29udHJvbChmcm9tVmFsdWUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgICAgICAgICB0bzogbmV3IEZvcm1Db250cm9sKHRvVmFsdWUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgICAgICAgICBzbGlkZXI6IG5ldyBGb3JtQ29udHJvbDxbbnVtYmVyLCBudW1iZXJdPihbZnJvbVZhbHVlLCB0b1ZhbHVlXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KDQtdCw0LvQuNC30YPQtdGCIHNpbmdsZS1zZWxlY3Qg0L/QvtCy0LXQtNC10L3QuNC1INC00LvRjyBGb3JtR3JvdXAg0YEg0LHRg9C70LXQstGL0LzQuCDQutC+0L3RgtGA0L7Qu9Cw0LzQuDpcbiAgICAgKiDQv9GA0Lgg0L/QvtGP0LLQu9C10L3QuNC4INC90L7QstC+0LPQviB0cnVlINC+0YHRgtCw0LvRjNC90YvQtSDQutC+0L3RgtGA0L7Qu9GLINCz0YDRg9C/0L/RiyDRgdCx0YDQsNGB0YvQstCw0Y7RgtGB0Y8g0LIgZmFsc2UuXG4gICAgICpcbiAgICAgKiDQodC+0YXRgNCw0L3Rj9C10YIg0L/QvtGB0LvQtdC00L3QtdC1IMKr0YHRgtCw0LHQuNC70YzQvdC+0LXCuyDRgdC+0YHRgtC+0Y/QvdC40LUg0Lgg0YHRgNCw0LLQvdC40LLQsNC10YIg0YHQu9C10LTRg9GO0YnQtdC1INC30L3QsNGH0LXQvdC40LUg0YEg0L3QuNC8IOKAlFxuICAgICAqINC90L7QstGL0LkgdHJ1ZSAo0L7RgtGB0YPRgtGB0YLQstC+0LLQsNC7INCyIHByZXYpINGB0YfQuNGC0LDQtdGC0YHRjyDQstGL0LHRgNCw0L3QvdGL0LwsINC+0YHRgtCw0LvRjNC90YvQtSDRgdCx0YDQsNGB0YvQstCw0Y7RgtGB0Y8g0YfQtdGA0LXQtyBzZXRWYWx1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cCBGb3JtR3JvdXAgY2hlY2tib3gt0YTQuNC70YzRgtGA0LAgKGlkIOKGkiBib29sZWFuKS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN5bmNTaW5nbGVTZWxlY3RDaGVja2JveChncm91cDogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4pOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICBsZXQgcHJldmlvdXNTdGF0ZSA9IGdyb3VwLmdldFJhd1ZhbHVlKCkgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgICAgICAgICBjb25zdCBuZXdseUNoZWNrZWQgPSBPYmplY3QuZW50cmllcyhjdXJyZW50KS5maW5kKChbaWQsIGlzQ2hlY2tlZF0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDaGVja2VkICYmICFwcmV2aW91c1N0YXRlW2lkXTtcbiAgICAgICAgICAgIH0pPy5bMF07XG5cbiAgICAgICAgICAgIGlmICghbmV3bHlDaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdGF0ZSA9IHsgLi4uY3VycmVudCB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBuZXh0OiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAuY29udHJvbHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgbmV4dFtpZF0gPSBpZCA9PT0gbmV3bHlDaGVja2VkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2aW91c1N0YXRlID0gbmV4dDtcbiAgICAgICAgICAgIGdyb3VwLnNldFZhbHVlKG5leHQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCy0Y/Qt9GL0LLQsNC10YIg0L/QvtC70Y8gwqvQvtGCwrsvwqvQtNC+wrsg0YEg0LrQvtC90YLRgNC+0LvQvtC8INGB0LvQsNC50LTQtdGA0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXAgRm9ybUdyb3VwIHJhbmdlLdGE0LjQu9GM0YLRgNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgc3luY1JhbmdlRnJvbVRvQW5kU2xpZGVyKGdyb3VwOiBGb3JtR3JvdXApOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICBjb25zdCBmcm9tID0gZ3JvdXAuZ2V0KCdmcm9tJyk7XG4gICAgICAgIGNvbnN0IHRvID0gZ3JvdXAuZ2V0KCd0bycpO1xuICAgICAgICBjb25zdCBzbGlkZXIgPSBncm91cC5nZXQoJ3NsaWRlcicpO1xuXG4gICAgICAgIGlmICghZnJvbSB8fCAhdG8gfHwgIXNsaWRlcikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICAgICAgICAvLyDQmNC90L/Rg9GC0Ysg4oaSINGB0LvQsNC50LTQtdGAOyDQtdGB0LvQuCDCq9C+0YLCuyA+IMKr0LTQvsK7LCDQv9C+0LTQvdC40LzQsNC10LwgwqvQtNC+wrsg0LTQviDCq9C+0YLCuy5cbiAgICAgICAgY29uc3QgYXBwbHlTbGlkZXJGcm9tSW5wdXRzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgY29uc3QgbG93ID0gTnVtYmVyKGZyb20udmFsdWUpO1xuICAgICAgICAgICAgbGV0IGhpZ2ggPSBOdW1iZXIodG8udmFsdWUpO1xuXG4gICAgICAgICAgICBpZiAobG93ID4gaGlnaCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBsb3c7XG4gICAgICAgICAgICAgICAgdG8uc2V0VmFsdWUoaGlnaCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFpciA9IHNsaWRlci52YWx1ZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudFBhaXJbMF0gIT09IGxvdyB8fCBjdXJyZW50UGFpclsxXSAhPT0gaGlnaCkge1xuICAgICAgICAgICAgICAgIHNsaWRlci5zZXRWYWx1ZShbbG93LCBoaWdoXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHNsaWRlci5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHN1Yi5hZGQobWVyZ2UoZnJvbS52YWx1ZUNoYW5nZXMsIHRvLnZhbHVlQ2hhbmdlcykuc3Vic2NyaWJlKGFwcGx5U2xpZGVyRnJvbUlucHV0cykpO1xuXG4gICAgICAgIHN1Yi5hZGQoXG4gICAgICAgICAgICBzbGlkZXIudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbG93LCBoaWdoXSA9IHZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgICAgICAgICAgICAgICBpZiAoZnJvbS52YWx1ZSAhPT0gbG93KSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb20uc2V0VmFsdWUobG93LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20ubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodG8udmFsdWUgIT09IGhpZ2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdG8uc2V0VmFsdWUoaGlnaCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICB0by5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8g0KHQvtCy0L/QsNGB0YLRjCDRgSDQv9C+0LvRj9C80Lgg0L/RgNC4INC/0LXRgNCy0L7QvCDQv9C+0LrQsNC30LUgKNGD0LbQtSDRgdC+0LLQv9Cw0LTQsNC10YIg0L/RgNC4INGB0L7Qt9C00LDQvdC40LgsINC90L4g0L3QsCDQstGB0Y/QutC40Lkg0YHQu9GD0YfQsNC5KS5cbiAgICAgICAgYXBwbHlTbGlkZXJGcm9tSW5wdXRzKCk7XG5cbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBGb3JtQ29udHJvbCDQtNC70Y8gdG9nZ2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvZ2dsZUZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgdG9nZ2xlLlxuICAgICAqIEBwYXJhbSBhcHBsaWVkVmFsdWUg0J/RgNC40LzQtdC90ZHQvdC90L7QtSDRgNCw0L3QtdC1INC30L3QsNGH0LXQvdC40LUg0YTQuNC70YzRgtGA0LAg0LjQtyDRhdGA0LDQvdC40LvQuNGJ0LAg0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVG9nZ2xlRm9ybUNvbnRyb2wodG9nZ2xlRmlsdGVyOiBTY1RvZ2dsZUZpbHRlciwgYXBwbGllZFZhbHVlPzogU2NQcm9wZXJ0eUZpbHRlcnNbc3RyaW5nXSk6IEZvcm1Db250cm9sPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgYXBwbGllZFRvZ2dsZSA9IHR5cGVvZiBhcHBsaWVkVmFsdWUgPT09ICdib29sZWFuJyA/IGFwcGxpZWRWYWx1ZSA6IHVuZGVmaW5lZDtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1Db250cm9sKGFwcGxpZWRUb2dnbGUgPz8gdG9nZ2xlRmlsdGVyLnNlbGVjdGVkVmFsdWUgPz8gZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIGNoZWNrYm94OiBGb3JtR3JvdXAg4oaSIHN0cmluZ1tdINCy0YvQsdGA0LDQvdC90YvRhSBpZDsg0LTQu9GPINC10LTQuNC90YHRgtCy0LXQvdC90L7Qs9C+INC30L3QsNGH0LXQvdC40Y8g4oCUIGJvb2xlYW4gKNC60LDQuiB0b2dnbGUpLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBjaGVja2JveEZpbHRlciDQnNC10YLQsNGE0LjQu9GM0YLRgCBjaGVja2JveC5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLICjQt9Cw0L/QuNGB0YwgaWQg4oaSIGJvb2xlYW4pLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc0NoZWNrYm94RmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGNoZWNrYm94RmlsdGVyOiBTY0lDaGVja2JveEZpbHRlciwgY29udHJvbFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IE9iamVjdC5lbnRyaWVzKGNvbnRyb2xWYWx1ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFssIGlzU2VsZWN0ZWRdKSA9PiBpc1NlbGVjdGVkKVxuICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gaWQpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgcmVzdWx0W2NoZWNrYm94RmlsdGVyLmlkXSA9IHNlbGVjdGVkSWRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiByYW5nZSDRhNC40LvRjNGC0YA6INCz0YDQsNC90LjRhtGLIMKr0L7RgsK7L8Kr0LTQvsK7INC90LXQt9Cw0LLQuNGB0LjQvNGLLCDQvdCwINGB0LXRgNCy0LXRgCDRg9GF0L7QtNC40YIg0YLQvtC70YzQutC+INGC0LAsINGH0YLQviDQvtGC0LvQuNGH0LDQtdGC0YHRjyDQvtGCINC00LXRhNC+0LvRgtCwXG4gICAgICogKHtAbGluayBTY1JhbmdlRmlsdGVyLnNlbGVjdGVkTWlufS97QGxpbmsgU2NSYW5nZUZpbHRlci5zZWxlY3RlZE1heH0g0LvQuNCx0L4gbWluL21heCkuINCV0YHQu9C4INC+0LHQtSDRgNCw0LLQvdGLINC00LXRhNC+0LvRgtCw0Lwg4oCUINGE0LjQu9GM0YLRgCDQvdC1INC00L7QsdCw0LLQu9GP0LXRgtGB0Y8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0INCe0LHRitC10LrRgiDRgNC10LfRg9C70YzRgtCw0YLQsCDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uXG4gICAgICogQHBhcmFtIHJhbmdlRmlsdGVyINCc0LXRgtCw0YTQuNC70YzRgtGAIHJhbmdlICjQs9GA0LDQvdC40YbRiyDQuCDQstGL0LHRgNCw0L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQv9C+INGD0LzQvtC70YfQsNC90LjRjikuXG4gICAgICogQHBhcmFtIHJhbmdlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLICjQvtCx0YrQtdC60YIg0YEg0LPRgNCw0L3QuNGG0LDQvNC4KS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UuZnJvbSDQndCw0YfQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICogQHBhcmFtIHJhbmdlLnRvINCa0L7QvdC10YfQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycywgcmFuZ2VGaWx0ZXI6IFNjUmFuZ2VGaWx0ZXIsIHJhbmdlOiB7IGZyb206IG51bWJlcjsgdG86IG51bWJlciB9KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRGcm9tID0gcmFuZ2VGaWx0ZXIuc2VsZWN0ZWRNaW4gPz8gcmFuZ2VGaWx0ZXIubWluO1xuICAgICAgICBjb25zdCBkZWZhdWx0VG8gPSByYW5nZUZpbHRlci5zZWxlY3RlZE1heCA/PyByYW5nZUZpbHRlci5tYXg7XG4gICAgICAgIGNvbnN0IHZhbHVlOiBTY0lSYW5nZUZpbHRlcjxzdHJpbmc+ID0ge307XG5cbiAgICAgICAgaWYgKHJhbmdlLmZyb20gIT09IGRlZmF1bHRGcm9tKSB7XG4gICAgICAgICAgICB2YWx1ZS5mcm9tID0gU3RyaW5nKHJhbmdlLmZyb20pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJhbmdlLnRvICE9PSBkZWZhdWx0VG8pIHtcbiAgICAgICAgICAgIHZhbHVlLnRvID0gU3RyaW5nKHJhbmdlLnRvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5mcm9tICE9PSB1bmRlZmluZWQgfHwgdmFsdWUudG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uLCBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgcmVzdWx0W3JhbmdlRmlsdGVyLmlkXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIHRvZ2dsZSDRhNC40LvRjNGC0YAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0INCe0LHRitC10LrRgiDRgNC10LfRg9C70YzRgtCw0YLQsCDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUg0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9nZ2xlRmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGZpbHRlcklkOiBzdHJpbmcsIGNvbnRyb2xWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICByZXN1bHRbZmlsdGVySWRdID0gY29udHJvbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQsdGA0LDRgdGL0LLQsNC10YIg0L/QvtC70LUgwqvQvtGCwrsg0LTQuNCw0L/QsNC30L7QvdCwINC6INC80LjQvdC40LzQsNC70YzQvdC+0LzRgyDQt9C90LDRh9C10L3QuNGOINGE0LjQu9GM0YLRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBtaW4g0JzQuNC90LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC00LjQsNC/0LDQt9C+0L3QsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzZXRSYW5nZUZyb20oZmlsdGVySWQ6IHN0cmluZywgbWluOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLmdldChmaWx0ZXJJZCk/LmdldCgnZnJvbScpPy5yZXNldCgrbWluKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodCx0YDQsNGB0YvQstCw0LXRgiDQv9C+0LvQtSDCq9C00L7CuyDQtNC40LDQv9Cw0LfQvtC90LAg0Log0LzQsNC60YHQuNC80LDQu9GM0L3QvtC80YMg0LfQvdCw0YfQtdC90LjRjiDRhNC40LvRjNGC0YDQsC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gbWF4INCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQt9C90LDRh9C10L3QuNC1INC00LjQsNC/0LDQt9C+0L3QsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVzZXRSYW5nZVRvKGZpbHRlcklkOiBzdHJpbmcsIG1heDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5nZXQoZmlsdGVySWQpPy5nZXQoJ3RvJyk/LnJlc2V0KCttYXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0LHRgNCw0YHRi9Cy0LDQtdGCINCy0YHQtSDRh9C10LrQsdC+0LrRgdGLINCz0YDRg9C/0L/RiyDQsiBgZmFsc2VgLlxuICAgICAqXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwICjQutC70Y7RhyBGb3JtR3JvdXAg0LIg0YTQvtGA0LzQtSkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlc2V0Q2hlY2tib3hHcm91cChmaWx0ZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5mb3JtLmdldChmaWx0ZXJJZCkgYXMgRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4gfCBudWxsO1xuXG4gICAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc2V0VmFsdWU6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG4gICAgICAgIE9iamVjdC5rZXlzKGdyb3VwLmNvbnRyb2xzKS5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICByZXNldFZhbHVlW2lkXSA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgZ3JvdXAucmVzZXQocmVzZXRWYWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQsdGA0LDRgdGL0LLQsNC10YIg0LLRgdC1INGE0LjQu9GM0YLRgNGLINC4INC+0L/QvtCy0LXRidCw0LXRgiDRgNC+0LTQuNGC0LXQu9GPINC+INC90LDQttCw0YLQuNC4INC60L3QvtC/0LrQuCDRgdCx0YDQvtGB0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uUmVzZXRGaWx0ZXJzQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVzZXRBbGxGaWx0ZXJzKCk7XG4gICAgICAgIHRoaXMucmVzZXRGaWx0ZXJzLmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntC/0L7QstC10YnQsNC10YIg0YDQvtC00LjRgtC10LvRjyDQviDQvdCw0LbQsNGC0LjQuCDQutC90L7Qv9C60Lgg0L/QvtC60LDQt9CwINGA0LXQt9GD0LvRjNGC0LDRgtC+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU2hvd1Jlc3VsdHNDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93UmVzdWx0cy5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQsdGA0LDRgdGL0LLQsNC10YIg0LLRgdC1INGE0LjQu9GM0YLRgNGLINC6INC40YHRhdC+0LTQvdGL0Lwg0LfQvdCw0YfQtdC90LjRj9C8LlxuICAgICAqXG4gICAgICogQHBhcmFtIGVtaXRFdmVudCDQn9GA0LjQt9C90LDQuiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDRjdC80LjRgtC40YLRjCDRgdC+0LHRi9GC0LjRjyDQuNC30LzQtdC90LXQvdC40Y8g0LrQvtC90YLRgNC+0LvQvtCyIChmYWxzZSDigJQg0YLQuNGF0LjQuSDRgdCx0YDQvtGBINCx0LXQtyDQvtGC0L/RgNCw0LLQutC4INC30L3QsNGH0LXQvdC40Lkg0LIg0YXRgNCw0L3QuNC70LjRidC1INGE0LjQu9GM0YLRgNC+0LIpLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVzZXRBbGxGaWx0ZXJzKGVtaXRFdmVudDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5maWx0ZXJzKCk/LmZvckVhY2goKGZpbHRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KGZpbHRlckl0ZW0uaWQpO1xuXG4gICAgICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVySXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA8UmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w8Ym9vbGVhbj4+PjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzZXRWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZ3JvdXAuY29udHJvbHMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0VmFsdWVbaWRdID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBncm91cC5yZXNldChyZXNldFZhbHVlLCB7IGVtaXRFdmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wucmVzZXQoZmFsc2UsIHsgZW1pdEV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gZmlsdGVySXRlbTtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAucmVzZXQoeyBmcm9tOiBtaW4sIHRvOiBtYXgsIHNsaWRlcjogW21pbiwgbWF4XSB9LCB7IGVtaXRFdmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJAaWYgKGZpbHRlcnMoKT8ubGVuZ3RoKSB7XG4gICAgPGZvcm1cbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIHBiLTFcIlxuICAgID5cbiAgICAgICAgQGZvciAoZmlsdGVyIG9mIGZpbHRlcnMoKTsgdHJhY2sgZmlsdGVyLmlkOyBsZXQgaXNGaXJzdCA9ICRmaXJzdCkge1xuICAgICAgICAgICAgQGlmICghaXNGaXJzdCkge1xuICAgICAgICAgICAgICAgIDxociBjbGFzcz1cIm15LTMgdy1mdWxsIGgtcHhcIiAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDwhLS0g0JfQsNCz0L7Qu9C+0LLQvtC6INCz0YDRg9C/0L/Riy4g0JTQu9GPIHRvZ2dsZSDQv9C+0LTQv9C40YHQuCDQvdC10YI6INC80LXRgtC60LAg0LjQtNGR0YIg0L/RgNGP0LzQviDRgNGP0LTQvtC8INGBINGB0LDQvNC40LwgY2hlY2tib3guIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgIT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtYm9keS1zLWJvbGRcIj57eyBmaWx0ZXIubGFiZWwgfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2hlY2tib3g6IEZvcm1Hcm91cCh2YWx1ZS5pZCDihpIgYm9vbGVhbikg0LTQu9GPINC70Y7QsdC+0LPQviDRh9C40YHQu9CwINC30L3QsNGH0LXQvdC40LkuXG4gICAgICAgICAgICAgICAgICAgICDQoNCw0LfQstC40LvQutCwINC+0LTQvdC+L9C80L3QvtCz0L4g0LfQvdCw0YfQtdC90LjQuSDQstGL0L3QtdGB0LXQvdCwINCyIFRTICjRgdC8LiBwcm9jZXNzQ2hlY2tib3hGaWx0ZXIpLlxuICAgICAgICAgICAgICAgICAgICAgbmctdGVtcGxhdGUg0LLQvdGD0YLRgNC4IGZvcm1Hcm91cE5hbWU6INC40L3QsNGH0LUgcmVhY3RpdmUgZm9ybXMg0L3QtSDQvdCw0LnQtNGR0YIgQ29udHJvbENvbnRhaW5lciDQv9GA0Lgg0L/RgNC+0LXQutGG0LjQuCDQsiDQtNC+0YfQtdGA0L3QuNC5INC60L7QvNC/0L7QvdC10L3Rgi4gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChmaWx0ZXIudHlwZSA9PT0gJ2NoZWNrYm94Jykge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNjLWNhdGFsb2ctZmlsdGVyLWNvbGxhcHNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zQ291bnRdPVwiZmlsdGVyLnZhbHVlcy5sZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93UmVzZXRdPVwiZm9ybS5nZXQoZmlsdGVyLmlkKT8uZGlydHkgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNldEdyb3VwKT1cInJlc2V0Q2hlY2tib3hHcm91cChmaWx0ZXIuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yICh2YWx1ZSBvZiBmaWx0ZXIudmFsdWVzOyB0cmFjayB2YWx1ZS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJ2YWx1ZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktc1wiPnt7IHZhbHVlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NjLWNhdGFsb2ctZmlsdGVyLWNvbGxhcHNpYmxlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRvZ2dsZTog0L7QtNC40L0gYm9vbGVhbiDQvdCwINC60L7RgNC90LUg0YTQvtGA0LzRiywg0L/QvtC00L/QuNGB0YwgPSBmaWx0ZXIubGFiZWwgLS0+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXMtYm9sZFwiPnt7IGZpbHRlci5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJhbmdlOiBGb3JtR3JvdXAoZnJvbSwgdG8sIHNsaWRlcikg0YEg0LTQstGD0YHRgtC+0YDQvtC90L3QtdC5INGB0LjQvdGF0YDQvtC90LjQt9Cw0YbQuNC10LkgLS0+XG4gICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoZmlsdGVyLnR5cGUgPT09ICdyYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0zIHB4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy0wIGZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQntGCXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktdGV4dGZpZWxkIFt0dWlUZXh0ZmllbGRDbGVhbmVyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY1NlbGVjdE9uRm9jdXNpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUlucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCIrZmlsdGVyLm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCIrZmlsdGVyLm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZvcm0uZ2V0KGZpbHRlci5pZCk/LmdldCgnZnJvbScpPy5kaXJ0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cImljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVzZXRSYW5nZUZyb20oZmlsdGVyLmlkLCBmaWx0ZXIubWluKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpTGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtaW4tdy0wIGZsZXgtMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQlNC+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktdGV4dGZpZWxkIFt0dWlUZXh0ZmllbGRDbGVhbmVyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY1NlbGVjdE9uRm9jdXNpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUlucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwidG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwiK2ZpbHRlci5taW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmb3JtLmdldChmaWx0ZXIuaWQpPy5nZXQoJ3RvJyk/LmRpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwiaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkueFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZXNldFJhbmdlVG8oZmlsdGVyLmlkLCBmaWx0ZXIubWF4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNsaWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCIrZmlsdGVyLm1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCIrZmlsdGVyLm1heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLi0tdHVpLXRoaWNrbmVzcy5yZW1dPVwiMC4yNVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uUmVzZXRGaWx0ZXJzQ2xpY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICAgINCh0LHRgNC+0YHQuNGC0Ywg0YTQuNC70YzRgtGA0YtcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIEBpZiAoc2hvd1Jlc3VsdHNCdXR0b24oKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm10LTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNob3dSZXN1bHRzQ2xpY2soKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0J/QvtC60LDQt9Cw0YLRjCDRgNC10LfRg9C70YzRgtCw0YLRi1xuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICA8L2Zvcm0+XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ /**
4
+ * Токен для инъекции {@link BehaviorSubject} для хранения фильтров продуктов.
5
+ */
6
+ export const SC_CATALOG_PRODUCTS_FILTERS = new InjectionToken('SC_CATALOG_PRODUCTS_FILTERS$', {
7
+ providedIn: 'root',
8
+ factory: () => new BehaviorSubject({}),
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1wcm9kdWN0cy1maWx0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQXFDLDhCQUE4QixFQUFFO0lBQzlILFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLGVBQWUsQ0FBb0IsRUFBRSxDQUFDO0NBQzVELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY1Byb3BlcnR5RmlsdGVycyB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICog0KLQvtC60LXQvSDQtNC70Y8g0LjQvdGK0LXQutGG0LjQuCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRhNC40LvRjNGC0YDQvtCyINC/0YDQvtC00YPQutGC0L7Qsi5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxCZWhhdmlvclN1YmplY3Q8U2NQcm9wZXJ0eUZpbHRlcnM+PignU0NfQ0FUQUxPR19QUk9EVUNUU19GSUxURVJTJCcsIHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG4gICAgZmFjdG9yeTogKCkgPT4gbmV3IEJlaGF2aW9yU3ViamVjdDxTY1Byb3BlcnR5RmlsdGVycz4oe30pLFxufSk7XG4iXX0=