@senior-gestao-empresarial/erpx-components 0.0.0-develop-3bab051d

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 (382) hide show
  1. package/bundles/senior-gestao-empresarial-erpx-components.umd.js +37665 -0
  2. package/bundles/senior-gestao-empresarial-erpx-components.umd.js.map +1 -0
  3. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js +17 -0
  4. package/bundles/senior-gestao-empresarial-erpx-components.umd.min.js.map +1 -0
  5. package/components/breadcrumb/breadcrumb.component.d.ts +21 -0
  6. package/components/breadcrumb/breadcrumb.module.d.ts +2 -0
  7. package/components/breadcrumb/index.d.ts +2 -0
  8. package/components/focus/focus.service.d.ts +4 -0
  9. package/components/lote-serie/erp-lote-serie.component.d.ts +183 -0
  10. package/components/lote-serie/erp-lote-serie.module.d.ts +2 -0
  11. package/components/lote-serie/erp-lote-serie.service.d.ts +137 -0
  12. package/components/lote-serie/index.d.ts +2 -0
  13. package/components/rateio-editor/erp-rateio-editor.component.d.ts +202 -0
  14. package/components/rateio-editor/erp-rateio-editor.converter.d.ts +18 -0
  15. package/components/rateio-editor/erp-rateio-editor.module.d.ts +2 -0
  16. package/components/rateio-editor/erp-rateio-editor.service.d.ts +17 -0
  17. package/components/rateio-editor/erp-rateio-editor.types.d.ts +171 -0
  18. package/components/rateio-editor/index.d.ts +4 -0
  19. package/components/resumo/erp-resumo.component.d.ts +17 -0
  20. package/components/resumo/erp-resumo.module.d.ts +2 -0
  21. package/components/resumo/erp-resumo.service.d.ts +2 -0
  22. package/components/resumo/index.d.ts +2 -0
  23. package/components/tributos/calculators/effective-tax-rate-calculator.d.ts +34 -0
  24. package/components/tributos/calculators/gross-amount-calculator.d.ts +20 -0
  25. package/components/tributos/calculators/tax-amount-calculator.d.ts +54 -0
  26. package/components/tributos/erp-tributos.component.d.ts +215 -0
  27. package/components/tributos/erp-tributos.module.d.ts +2 -0
  28. package/components/tributos/erp-tributos.service.d.ts +10 -0
  29. package/components/tributos/erp-tributos.types.d.ts +286 -0
  30. package/components/tributos/index.d.ts +12 -0
  31. package/components/tributos/mappings/enum-tip-imp-cst-mapping.d.ts +2 -0
  32. package/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.d.ts +15 -0
  33. package/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.d.ts +28 -0
  34. package/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.d.ts +30 -0
  35. package/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.d.ts +22 -0
  36. package/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.d.ts +22 -0
  37. package/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.d.ts +5 -0
  38. package/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.d.ts +5 -0
  39. package/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.d.ts +8 -0
  40. package/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.d.ts +8 -0
  41. package/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.d.ts +5 -0
  42. package/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.d.ts +8 -0
  43. package/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.d.ts +5 -0
  44. package/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.d.ts +6 -0
  45. package/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.d.ts +5 -0
  46. package/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.d.ts +5 -0
  47. package/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.d.ts +8 -0
  48. package/components/tributos/rules/rules.service.d.ts +19 -0
  49. package/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.d.ts +16 -0
  50. package/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.d.ts +12 -0
  51. package/components/tributos/rules/status/registries/purchase-order-status-rules.registry.d.ts +12 -0
  52. package/components/tributos/rules/status/registries/sale-order-status-rules.registry.d.ts +8 -0
  53. package/components/tributos/rules/status/registries/status-rules.registry.d.ts +15 -0
  54. package/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.d.ts +5 -0
  55. package/components/tributos/rules/status/rules/tax-classification-status-rule.d.ts +5 -0
  56. package/components/tributos/rules/status/rules/tax-rate-status-rule.d.ts +5 -0
  57. package/components/tributos/rules/status/rules/taxable-base-status-rule.d.ts +5 -0
  58. package/components/tributos/rules/types/available-fields.d.ts +2 -0
  59. package/components/tributos/rules/types/available-taxes.d.ts +1 -0
  60. package/components/tributos/rules/types/field-calculation-rule-mapping.d.ts +6 -0
  61. package/components/tributos/rules/types/field-rule-mapping.d.ts +6 -0
  62. package/components/tributos/rules/types/field-status-rule-mapping.d.ts +6 -0
  63. package/components/tributos/rules/types/rule-payload.d.ts +9 -0
  64. package/components/tributos/rules/types/schemas/incoming-invoice.schema.d.ts +235 -0
  65. package/components/tributos/rules/types/schemas/outgoing-invoice.schema.d.ts +349 -0
  66. package/components/tributos/rules/types/schemas/purchase-order.schema.d.ts +26 -0
  67. package/components/tributos/rules/types/schemas/sale-order.schema.d.ts +131 -0
  68. package/components/tributos/rules/types/strategies-by-document.d.ts +12 -0
  69. package/components/tributos/rules/types/strategies.d.ts +4 -0
  70. package/components/tributos/rules/types/tax-rule.d.ts +4 -0
  71. package/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.d.ts +20 -0
  72. package/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.d.ts +22 -0
  73. package/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.d.ts +14 -0
  74. package/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.d.ts +14 -0
  75. package/components/tributos/rules/validation/registries/validation-rules.registry.d.ts +15 -0
  76. package/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.d.ts +5 -0
  77. package/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.d.ts +5 -0
  78. package/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.d.ts +5 -0
  79. package/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.d.ts +5 -0
  80. package/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.d.ts +6 -0
  81. package/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.d.ts +6 -0
  82. package/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.d.ts +6 -0
  83. package/components/tributos/services/tax-rounding.service.d.ts +5 -0
  84. package/components/tributos/stores/tax.store.d.ts +10 -0
  85. package/components/tributos/tax-reform-utilities.d.ts +36 -0
  86. package/components/tributos/types/context.d.ts +7 -0
  87. package/components/tributos/types/controllership-incoming-invoice-context.d.ts +5 -0
  88. package/components/tributos/types/controllership-incoming-invoice.d.ts +3 -0
  89. package/components/tributos/types/controllership-outgoing-invoice-context.d.ts +5 -0
  90. package/components/tributos/types/controllership-outgoing-invoice.d.ts +3 -0
  91. package/components/tributos/types/credit-invoice-type.d.ts +1 -0
  92. package/components/tributos/types/debit-invoice-type.d.ts +1 -0
  93. package/components/tributos/types/group.d.ts +6 -0
  94. package/components/tributos/types/incoming-invoice-context.d.ts +5 -0
  95. package/components/tributos/types/incoming-invoice-item.d.ts +4 -0
  96. package/components/tributos/types/incoming-invoice-type.d.ts +1 -0
  97. package/components/tributos/types/incoming-invoice.d.ts +11 -0
  98. package/components/tributos/types/item-type.d.ts +1 -0
  99. package/components/tributos/types/outgoing-Invoice.d.ts +11 -0
  100. package/components/tributos/types/outgoing-invoice-context.d.ts +5 -0
  101. package/components/tributos/types/outgoing-invoice-item.d.ts +4 -0
  102. package/components/tributos/types/outgoing-invoice-type.d.ts +1 -0
  103. package/components/tributos/types/purchase-order-context.d.ts +5 -0
  104. package/components/tributos/types/purchase-order-type.d.ts +1 -0
  105. package/components/tributos/types/purchase-order.d.ts +8 -0
  106. package/components/tributos/types/sale-order-context.d.ts +5 -0
  107. package/components/tributos/types/sale-order-type.d.ts +1 -0
  108. package/components/tributos/types/sale-order.d.ts +8 -0
  109. package/components/tributos/types/tax.d.ts +8 -0
  110. package/components/utils/breakpoints.d.ts +10 -0
  111. package/components/utils/export-utils.d.ts +6 -0
  112. package/components/utils/index.d.ts +3 -0
  113. package/components/utils/loading-context.d.ts +7 -0
  114. package/components/utils/utils.d.ts +4 -0
  115. package/core/entities/entity-service.d.ts +32 -0
  116. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.d.ts +36 -0
  117. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.d.ts +40 -0
  118. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.d.ts +2 -0
  119. package/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.d.ts +11 -0
  120. package/core/enums/enum-classificacao-tributaria.d.ts +4 -0
  121. package/core/enums/enum-tipo-calculo-imposto.d.ts +5 -0
  122. package/core/enums/enum-tipo-documento-parametros.d.ts +7 -0
  123. package/core/enums/enum-tipo-documento.d.ts +10 -0
  124. package/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.d.ts +5 -0
  125. package/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.d.ts +8 -0
  126. package/esm2015/components/breadcrumb/breadcrumb.component.js +86 -0
  127. package/esm2015/components/breadcrumb/breadcrumb.module.js +17 -0
  128. package/esm2015/components/breadcrumb/index.js +3 -0
  129. package/esm2015/components/focus/focus.service.js +32 -0
  130. package/esm2015/components/lote-serie/erp-lote-serie.component.js +1772 -0
  131. package/esm2015/components/lote-serie/erp-lote-serie.module.js +47 -0
  132. package/esm2015/components/lote-serie/erp-lote-serie.service.js +94 -0
  133. package/esm2015/components/lote-serie/index.js +3 -0
  134. package/esm2015/components/rateio-editor/erp-rateio-editor.component.js +794 -0
  135. package/esm2015/components/rateio-editor/erp-rateio-editor.converter.js +52 -0
  136. package/esm2015/components/rateio-editor/erp-rateio-editor.module.js +40 -0
  137. package/esm2015/components/rateio-editor/erp-rateio-editor.service.js +49 -0
  138. package/esm2015/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  139. package/esm2015/components/rateio-editor/index.js +4 -0
  140. package/esm2015/components/resumo/erp-resumo.component.js +19 -0
  141. package/esm2015/components/resumo/erp-resumo.module.js +25 -0
  142. package/esm2015/components/resumo/erp-resumo.service.js +13 -0
  143. package/esm2015/components/resumo/index.js +2 -0
  144. package/esm2015/components/tributos/calculators/effective-tax-rate-calculator.js +53 -0
  145. package/esm2015/components/tributos/calculators/gross-amount-calculator.js +37 -0
  146. package/esm2015/components/tributos/calculators/tax-amount-calculator.js +87 -0
  147. package/esm2015/components/tributos/erp-tributos.component.js +5176 -0
  148. package/esm2015/components/tributos/erp-tributos.module.js +33 -0
  149. package/esm2015/components/tributos/erp-tributos.service.js +23 -0
  150. package/esm2015/components/tributos/erp-tributos.types.js +268 -0
  151. package/esm2015/components/tributos/index.js +4 -0
  152. package/esm2015/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  153. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +45 -0
  154. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3102 -0
  155. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4516 -0
  156. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +294 -0
  157. package/esm2015/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1464 -0
  158. package/esm2015/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +48 -0
  159. package/esm2015/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +55 -0
  160. package/esm2015/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +83 -0
  161. package/esm2015/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +74 -0
  162. package/esm2015/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +72 -0
  163. package/esm2015/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +244 -0
  164. package/esm2015/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +74 -0
  165. package/esm2015/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +170 -0
  166. package/esm2015/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +100 -0
  167. package/esm2015/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +124 -0
  168. package/esm2015/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +292 -0
  169. package/esm2015/components/tributos/rules/rules.service.js +61 -0
  170. package/esm2015/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1076 -0
  171. package/esm2015/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1317 -0
  172. package/esm2015/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +62 -0
  173. package/esm2015/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +18 -0
  174. package/esm2015/components/tributos/rules/status/registries/status-rules.registry.js +45 -0
  175. package/esm2015/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +39 -0
  176. package/esm2015/components/tributos/rules/status/rules/tax-classification-status-rule.js +94 -0
  177. package/esm2015/components/tributos/rules/status/rules/tax-rate-status-rule.js +61 -0
  178. package/esm2015/components/tributos/rules/status/rules/taxable-base-status-rule.js +65 -0
  179. package/esm2015/components/tributos/rules/types/available-fields.js +1 -0
  180. package/esm2015/components/tributos/rules/types/available-taxes.js +1 -0
  181. package/esm2015/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  182. package/esm2015/components/tributos/rules/types/field-rule-mapping.js +1 -0
  183. package/esm2015/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  184. package/esm2015/components/tributos/rules/types/rule-payload.js +1 -0
  185. package/esm2015/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1816 -0
  186. package/esm2015/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2750 -0
  187. package/esm2015/components/tributos/rules/types/schemas/purchase-order.schema.js +150 -0
  188. package/esm2015/components/tributos/rules/types/schemas/sale-order.schema.js +879 -0
  189. package/esm2015/components/tributos/rules/types/strategies-by-document.js +1 -0
  190. package/esm2015/components/tributos/rules/types/strategies.js +1 -0
  191. package/esm2015/components/tributos/rules/types/tax-rule.js +1 -0
  192. package/esm2015/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3606 -0
  193. package/esm2015/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5452 -0
  194. package/esm2015/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +270 -0
  195. package/esm2015/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1392 -0
  196. package/esm2015/components/tributos/rules/validation/registries/validation-rules.registry.js +45 -0
  197. package/esm2015/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +73 -0
  198. package/esm2015/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +78 -0
  199. package/esm2015/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +902 -0
  200. package/esm2015/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +401 -0
  201. package/esm2015/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +719 -0
  202. package/esm2015/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +300 -0
  203. package/esm2015/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +717 -0
  204. package/esm2015/components/tributos/services/tax-rounding.service.js +18 -0
  205. package/esm2015/components/tributos/stores/tax.store.js +19 -0
  206. package/esm2015/components/tributos/tax-reform-utilities.js +243 -0
  207. package/esm2015/components/tributos/types/context.js +1 -0
  208. package/esm2015/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  209. package/esm2015/components/tributos/types/controllership-incoming-invoice.js +1 -0
  210. package/esm2015/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  211. package/esm2015/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  212. package/esm2015/components/tributos/types/credit-invoice-type.js +1 -0
  213. package/esm2015/components/tributos/types/debit-invoice-type.js +1 -0
  214. package/esm2015/components/tributos/types/group.js +1 -0
  215. package/esm2015/components/tributos/types/incoming-invoice-context.js +1 -0
  216. package/esm2015/components/tributos/types/incoming-invoice-item.js +1 -0
  217. package/esm2015/components/tributos/types/incoming-invoice-type.js +1 -0
  218. package/esm2015/components/tributos/types/incoming-invoice.js +1 -0
  219. package/esm2015/components/tributos/types/item-type.js +1 -0
  220. package/esm2015/components/tributos/types/outgoing-Invoice.js +1 -0
  221. package/esm2015/components/tributos/types/outgoing-invoice-context.js +1 -0
  222. package/esm2015/components/tributos/types/outgoing-invoice-item.js +1 -0
  223. package/esm2015/components/tributos/types/outgoing-invoice-type.js +1 -0
  224. package/esm2015/components/tributos/types/purchase-order-context.js +1 -0
  225. package/esm2015/components/tributos/types/purchase-order-type.js +1 -0
  226. package/esm2015/components/tributos/types/purchase-order.js +1 -0
  227. package/esm2015/components/tributos/types/sale-order-context.js +1 -0
  228. package/esm2015/components/tributos/types/sale-order-type.js +1 -0
  229. package/esm2015/components/tributos/types/sale-order.js +1 -0
  230. package/esm2015/components/tributos/types/tax.js +2 -0
  231. package/esm2015/components/utils/breakpoints.js +11 -0
  232. package/esm2015/components/utils/export-utils.js +71 -0
  233. package/esm2015/components/utils/index.js +4 -0
  234. package/esm2015/components/utils/loading-context.js +20 -0
  235. package/esm2015/components/utils/utils.js +18 -0
  236. package/esm2015/core/entities/entity-service.js +91 -0
  237. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  238. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +62 -0
  239. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +24 -0
  240. package/esm2015/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +24 -0
  241. package/esm2015/core/enums/enum-classificacao-tributaria.js +6 -0
  242. package/esm2015/core/enums/enum-tipo-calculo-imposto.js +7 -0
  243. package/esm2015/core/enums/enum-tipo-documento-parametros.js +9 -0
  244. package/esm2015/core/enums/enum-tipo-documento.js +12 -0
  245. package/esm2015/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  246. package/esm2015/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  247. package/esm2015/locale/fallback.js +56 -0
  248. package/esm2015/public-api.js +8 -0
  249. package/esm2015/senior-gestao-empresarial-erpx-components.js +58 -0
  250. package/esm5/components/breadcrumb/breadcrumb.component.js +91 -0
  251. package/esm5/components/breadcrumb/breadcrumb.module.js +20 -0
  252. package/esm5/components/breadcrumb/index.js +3 -0
  253. package/esm5/components/focus/focus.service.js +35 -0
  254. package/esm5/components/lote-serie/erp-lote-serie.component.js +1830 -0
  255. package/esm5/components/lote-serie/erp-lote-serie.module.js +50 -0
  256. package/esm5/components/lote-serie/erp-lote-serie.service.js +96 -0
  257. package/esm5/components/lote-serie/index.js +3 -0
  258. package/esm5/components/rateio-editor/erp-rateio-editor.component.js +861 -0
  259. package/esm5/components/rateio-editor/erp-rateio-editor.converter.js +68 -0
  260. package/esm5/components/rateio-editor/erp-rateio-editor.module.js +43 -0
  261. package/esm5/components/rateio-editor/erp-rateio-editor.service.js +51 -0
  262. package/esm5/components/rateio-editor/erp-rateio-editor.types.js +5 -0
  263. package/esm5/components/rateio-editor/index.js +4 -0
  264. package/esm5/components/resumo/erp-resumo.component.js +22 -0
  265. package/esm5/components/resumo/erp-resumo.module.js +28 -0
  266. package/esm5/components/resumo/erp-resumo.service.js +16 -0
  267. package/esm5/components/resumo/index.js +2 -0
  268. package/esm5/components/tributos/calculators/effective-tax-rate-calculator.js +58 -0
  269. package/esm5/components/tributos/calculators/gross-amount-calculator.js +39 -0
  270. package/esm5/components/tributos/calculators/tax-amount-calculator.js +91 -0
  271. package/esm5/components/tributos/erp-tributos.component.js +5296 -0
  272. package/esm5/components/tributos/erp-tributos.module.js +36 -0
  273. package/esm5/components/tributos/erp-tributos.service.js +24 -0
  274. package/esm5/components/tributos/erp-tributos.types.js +268 -0
  275. package/esm5/components/tributos/index.js +4 -0
  276. package/esm5/components/tributos/mappings/enum-tip-imp-cst-mapping.js +33 -0
  277. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/calculation-rules.registry.js +46 -0
  278. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/incoming-invoice-calculation-rules.registry.js +3104 -0
  279. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/outgoing-invoice-calculation-rules.registry.js +4518 -0
  280. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/purchase-order-calculation-rules.registry.js +296 -0
  281. package/esm5/components/tributos/rules/calculation/registries/calculation-rules-registries/sale-order-calculation-rules.registry.js +1466 -0
  282. package/esm5/components/tributos/rules/calculation/rules/apply-net-value-to-document-calculation-rule.js +60 -0
  283. package/esm5/components/tributos/rules/calculation/rules/assessment-period-calculation-rule.js +77 -0
  284. package/esm5/components/tributos/rules/calculation/rules/effective-tax-rate-calculation-rule.js +92 -0
  285. package/esm5/components/tributos/rules/calculation/rules/gross-amount-calculation-rule.js +83 -0
  286. package/esm5/components/tributos/rules/calculation/rules/manual-tax-calculation-rule.js +87 -0
  287. package/esm5/components/tributos/rules/calculation/rules/tax-amount-calculation-rule.js +286 -0
  288. package/esm5/components/tributos/rules/calculation/rules/tax-calculation-type-calculation-rule.js +89 -0
  289. package/esm5/components/tributos/rules/calculation/rules/tax-classification-calculation-rule.js +241 -0
  290. package/esm5/components/tributos/rules/calculation/rules/tax-rate-calculation-rule.js +118 -0
  291. package/esm5/components/tributos/rules/calculation/rules/tax-situation-calculation-rule.js +200 -0
  292. package/esm5/components/tributos/rules/calculation/rules/taxable-base-calculation-rule.js +330 -0
  293. package/esm5/components/tributos/rules/rules.service.js +139 -0
  294. package/esm5/components/tributos/rules/status/registries/incoming-invoice-status-rules.registry.js +1078 -0
  295. package/esm5/components/tributos/rules/status/registries/outgoing-invoice-status-rules.registry.js +1319 -0
  296. package/esm5/components/tributos/rules/status/registries/purchase-order-status-rules.registry.js +64 -0
  297. package/esm5/components/tributos/rules/status/registries/sale-order-status-rules.registry.js +19 -0
  298. package/esm5/components/tributos/rules/status/registries/status-rules.registry.js +46 -0
  299. package/esm5/components/tributos/rules/status/rules/apply-net-value-to-document-status-rule.js +43 -0
  300. package/esm5/components/tributos/rules/status/rules/tax-classification-status-rule.js +106 -0
  301. package/esm5/components/tributos/rules/status/rules/tax-rate-status-rule.js +68 -0
  302. package/esm5/components/tributos/rules/status/rules/taxable-base-status-rule.js +72 -0
  303. package/esm5/components/tributos/rules/types/available-fields.js +1 -0
  304. package/esm5/components/tributos/rules/types/available-taxes.js +1 -0
  305. package/esm5/components/tributos/rules/types/field-calculation-rule-mapping.js +1 -0
  306. package/esm5/components/tributos/rules/types/field-rule-mapping.js +1 -0
  307. package/esm5/components/tributos/rules/types/field-status-rule-mapping.js +1 -0
  308. package/esm5/components/tributos/rules/types/rule-payload.js +1 -0
  309. package/esm5/components/tributos/rules/types/schemas/incoming-invoice.schema.js +1817 -0
  310. package/esm5/components/tributos/rules/types/schemas/outgoing-invoice.schema.js +2751 -0
  311. package/esm5/components/tributos/rules/types/schemas/purchase-order.schema.js +151 -0
  312. package/esm5/components/tributos/rules/types/schemas/sale-order.schema.js +880 -0
  313. package/esm5/components/tributos/rules/types/strategies-by-document.js +1 -0
  314. package/esm5/components/tributos/rules/types/strategies.js +1 -0
  315. package/esm5/components/tributos/rules/types/tax-rule.js +1 -0
  316. package/esm5/components/tributos/rules/validation/registries/incoming-invoice-validation-rules.registry.js +3608 -0
  317. package/esm5/components/tributos/rules/validation/registries/outgoing-invoice-validation-rules.registry.js +5454 -0
  318. package/esm5/components/tributos/rules/validation/registries/purchase-order-validation-rules.registry.js +272 -0
  319. package/esm5/components/tributos/rules/validation/registries/sale-order-validation-rules.registry.js +1394 -0
  320. package/esm5/components/tributos/rules/validation/registries/validation-rules.registry.js +46 -0
  321. package/esm5/components/tributos/rules/validation/rules/required/apply-net-value-to-document-required-validation-rule.js +77 -0
  322. package/esm5/components/tributos/rules/validation/rules/required/assessment-period-required-validation-rule.js +86 -0
  323. package/esm5/components/tributos/rules/validation/rules/required/tax-amount-required-validation-rule.js +968 -0
  324. package/esm5/components/tributos/rules/validation/rules/required/tax-classification-required-validation-rule.js +433 -0
  325. package/esm5/components/tributos/rules/validation/rules/required/tax-rate-required-validation-rule.js +774 -0
  326. package/esm5/components/tributos/rules/validation/rules/required/tax-situation-required-validation-rule.js +323 -0
  327. package/esm5/components/tributos/rules/validation/rules/required/taxable-base-required-validation-rule.js +772 -0
  328. package/esm5/components/tributos/services/tax-rounding.service.js +23 -0
  329. package/esm5/components/tributos/stores/tax.store.js +26 -0
  330. package/esm5/components/tributos/tax-reform-utilities.js +249 -0
  331. package/esm5/components/tributos/types/context.js +1 -0
  332. package/esm5/components/tributos/types/controllership-incoming-invoice-context.js +1 -0
  333. package/esm5/components/tributos/types/controllership-incoming-invoice.js +1 -0
  334. package/esm5/components/tributos/types/controllership-outgoing-invoice-context.js +1 -0
  335. package/esm5/components/tributos/types/controllership-outgoing-invoice.js +1 -0
  336. package/esm5/components/tributos/types/credit-invoice-type.js +1 -0
  337. package/esm5/components/tributos/types/debit-invoice-type.js +1 -0
  338. package/esm5/components/tributos/types/group.js +1 -0
  339. package/esm5/components/tributos/types/incoming-invoice-context.js +1 -0
  340. package/esm5/components/tributos/types/incoming-invoice-item.js +1 -0
  341. package/esm5/components/tributos/types/incoming-invoice-type.js +1 -0
  342. package/esm5/components/tributos/types/incoming-invoice.js +1 -0
  343. package/esm5/components/tributos/types/item-type.js +1 -0
  344. package/esm5/components/tributos/types/outgoing-Invoice.js +1 -0
  345. package/esm5/components/tributos/types/outgoing-invoice-context.js +1 -0
  346. package/esm5/components/tributos/types/outgoing-invoice-item.js +1 -0
  347. package/esm5/components/tributos/types/outgoing-invoice-type.js +1 -0
  348. package/esm5/components/tributos/types/purchase-order-context.js +1 -0
  349. package/esm5/components/tributos/types/purchase-order-type.js +1 -0
  350. package/esm5/components/tributos/types/purchase-order.js +1 -0
  351. package/esm5/components/tributos/types/sale-order-context.js +1 -0
  352. package/esm5/components/tributos/types/sale-order-type.js +1 -0
  353. package/esm5/components/tributos/types/sale-order.js +1 -0
  354. package/esm5/components/tributos/types/tax.js +2 -0
  355. package/esm5/components/utils/breakpoints.js +11 -0
  356. package/esm5/components/utils/export-utils.js +78 -0
  357. package/esm5/components/utils/index.js +4 -0
  358. package/esm5/components/utils/loading-context.js +22 -0
  359. package/esm5/components/utils/utils.js +20 -0
  360. package/esm5/core/entities/entity-service.js +98 -0
  361. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda-dto.js +1 -0
  362. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.js +67 -0
  363. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.module.js +27 -0
  364. package/esm5/core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service.js +27 -0
  365. package/esm5/core/enums/enum-classificacao-tributaria.js +6 -0
  366. package/esm5/core/enums/enum-tipo-calculo-imposto.js +7 -0
  367. package/esm5/core/enums/enum-tipo-documento-parametros.js +9 -0
  368. package/esm5/core/enums/enum-tipo-documento.js +12 -0
  369. package/esm5/core/enums/erpx-com-processo-faturamento-backend/enum-indicativo-padrao.js +7 -0
  370. package/esm5/core/enums/erpx-cpl-imp-cadastros-backend/enum-indicativo-padrao.js +10 -0
  371. package/esm5/locale/fallback.js +56 -0
  372. package/esm5/public-api.js +8 -0
  373. package/esm5/senior-gestao-empresarial-erpx-components.js +58 -0
  374. package/fesm2015/senior-gestao-empresarial-erpx-components.js +36350 -0
  375. package/fesm2015/senior-gestao-empresarial-erpx-components.js.map +1 -0
  376. package/fesm5/senior-gestao-empresarial-erpx-components.js +37396 -0
  377. package/fesm5/senior-gestao-empresarial-erpx-components.js.map +1 -0
  378. package/locale/fallback.d.ts +55 -0
  379. package/package.json +23 -0
  380. package/public-api.d.ts +7 -0
  381. package/senior-gestao-empresarial-erpx-components.d.ts +57 -0
  382. package/senior-gestao-empresarial-erpx-components.metadata.json +1 -0
@@ -0,0 +1,1772 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component, Input, ViewChild } from '@angular/core';
3
+ import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
4
+ import { ActivatedRoute } from '@angular/router';
5
+ import { TranslateService } from '@ngx-translate/core';
6
+ import { E210DxpLookup, EnumLogicalOperator } from '@senior-gestao-empresarial/angular-components';
7
+ import { ButtonPriority, ButtonSize, EnumColumnFieldType, FieldType, FormField } from '@seniorsistemas/angular-components';
8
+ import * as moment from 'moment';
9
+ import { MessageService } from 'primeng/api';
10
+ import { Table } from 'primeng/table';
11
+ import { Subject } from 'rxjs';
12
+ import { first, map, takeUntil } from 'rxjs/operators';
13
+ import { QuantidadeDisponivelDemandaService } from '../../core/entities/quantidade-disponivel-demanda/quantidade-disponivel-demanda.service';
14
+ import { EnumTipoDocumentoParametros } from '../../core/enums/enum-tipo-documento-parametros';
15
+ import { isEmpty, isNotEmpty } from '../utils/utils';
16
+ import { ErpLoteSeriesService, GetUrlInput, GetUrlOutput, ListParams } from './erp-lote-serie.service';
17
+ let ErpLoteSerieComponent = class ErpLoteSerieComponent {
18
+ constructor(translate, route, e210DxpLookup, formBuilder, messageService, batchSeriesService, quantidadeDisponivelDemandaService) {
19
+ this.translate = translate;
20
+ this.route = route;
21
+ this.e210DxpLookup = e210DxpLookup;
22
+ this.formBuilder = formBuilder;
23
+ this.messageService = messageService;
24
+ this.batchSeriesService = batchSeriesService;
25
+ this.quantidadeDisponivelDemandaService = quantidadeDisponivelDemandaService;
26
+ this.blockedFields = false;
27
+ this.showHeader = true;
28
+ this.validateInvalidChars = false;
29
+ this.ButtonPriority = ButtonPriority;
30
+ this.ButtonSize = ButtonSize;
31
+ this.EnumTipoMovimentacao = EnumTipoMovimentacao;
32
+ this.gridData = [];
33
+ this.selection = [];
34
+ this.localeConfig = {};
35
+ this.locale = {};
36
+ this.e200lotLookupSuggestionsObservable = new Subject();
37
+ this.e200lotlookupSearchObservable = new Subject();
38
+ this.e200serLookupSuggestionsObservable = new Subject();
39
+ this.e200serlookupSearchObservable = new Subject();
40
+ this.ngUnsubscribe = new Subject();
41
+ this.quantidadeDisponivelDemandaLookupSuggestionsObservable = new Subject();
42
+ this.quantidadeDisponivelDemandalookupSearchObservable = new Subject();
43
+ this.loteLookupDisplayFields = ['e200lot.codLote'];
44
+ this.serieLookupDisplayFields = ['e200ser.numSep'];
45
+ this.isSerie = false;
46
+ this.qtdAdistribuir = 0;
47
+ this.qtdDistribuida = 0;
48
+ this.qtdRestante = 0;
49
+ this.maxLength = 50;
50
+ this.obrigaValidade = false;
51
+ this.isSaida = false;
52
+ this.disableDataValidade = false;
53
+ this.prefix = 'erpx.lote_serie.';
54
+ this.editingFormGroup = this.formBuilder.group({
55
+ quantidade: [{ value: null, disabled: false }, Validators.compose([Validators.required])]
56
+ });
57
+ this.editingFormFields = [
58
+ new FormField({
59
+ name: 'quantidade',
60
+ size: { sm: 12, md: 12, lg: 12, xl: 12 },
61
+ type: FieldType.Double,
62
+ precision: 15
63
+ })
64
+ ];
65
+ this.sum = (a, b, positions) => {
66
+ const factor = Math.pow(10, positions);
67
+ return (a.toFixed(positions) * factor + b.toFixed(positions) * factor) / factor;
68
+ };
69
+ this.sub = (a, b, positions) => {
70
+ const factor = Math.pow(10, positions);
71
+ return (a.toFixed(positions) * factor - b.toFixed(positions) * factor) / factor;
72
+ };
73
+ }
74
+ ngOnChanges() {
75
+ if (this.loteSerieParams) {
76
+ this.route.data.pipe(takeUntil(this.ngUnsubscribe)).subscribe((data) => this.onRouteDataChange(data));
77
+ this.formGroupBatchOrSeries = this.getFormGroupDados();
78
+ this.validaDados();
79
+ this.gridColumns = this.getGridColumns();
80
+ }
81
+ if (this.blockedFields == true)
82
+ this.formGroupBatchOrSeries.disable();
83
+ this.formGroupBatchOrSeries.controls.lote.valueChanges.subscribe((value) => {
84
+ if (value) {
85
+ if (this.validateInvalidChars && /\t|\r|\n/g.exec(value)) {
86
+ this.formGroupBatchOrSeries.controls.lote.setErrors({ existsInvalidChar: true });
87
+ return;
88
+ }
89
+ }
90
+ });
91
+ this.formGroupBatchOrSeries.controls.serie.valueChanges.subscribe((value) => {
92
+ if (value) {
93
+ if (this.validateInvalidChars && /\t|\r|\n/g.exec(value)) {
94
+ this.formGroupBatchOrSeries.controls.serie.setErrors({ existsInvalidChar: true });
95
+ return;
96
+ }
97
+ }
98
+ });
99
+ }
100
+ validaDados() {
101
+ this.processFamilySupplyInfo(this.loteSerieParams.dadosProduto.e012fam);
102
+ if (this.loteSerieParams.tipoControleProduto == 'Serie') {
103
+ this.titleLoteOrSerie = this.translate.instant(`${this.prefix}serie_title`);
104
+ this.titleGridLoteOrSerie = this.translate.instant(`${this.prefix}serie_title_grid`);
105
+ this.isSerie = true;
106
+ }
107
+ else {
108
+ this.titleLoteOrSerie = this.translate.instant(`${this.prefix}lote_title`);
109
+ this.titleGridLoteOrSerie = this.translate.instant(`${this.prefix}lote_title_grid`);
110
+ this.isSerie = false;
111
+ }
112
+ if (this.loteSerieParams.tipoMovimentacao == 'Entrada') {
113
+ this.batchOrSeriesFields = this.getFieldsEntrada();
114
+ if (this.isSerie) {
115
+ this.formGroupBatchOrSeries.controls.serie.clearValidators();
116
+ this.formGroupBatchOrSeries.controls.serie.setValidators([Validators.required, Validators.maxLength(50)]);
117
+ this.formGroupBatchOrSeries.controls.serie.updateValueAndValidity({ emitEvent: false });
118
+ }
119
+ else {
120
+ this.formGroupBatchOrSeries.controls.lote.clearValidators();
121
+ this.formGroupBatchOrSeries.controls.quantidade.clearValidators();
122
+ this.formGroupBatchOrSeries.controls.lote.setValidators([Validators.required, Validators.maxLength(50)]);
123
+ this.formGroupBatchOrSeries.controls.quantidade.setValidators([Validators.required]);
124
+ this.formGroupBatchOrSeries.controls.lote.updateValueAndValidity({ emitEvent: false });
125
+ this.formGroupBatchOrSeries.controls.quantidade.updateValueAndValidity({ emitEvent: false });
126
+ }
127
+ this.formGroupBatchOrSeries.controls.bulkVisible.valueChanges.subscribe((value) => {
128
+ if (value) {
129
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.setValidators([Validators.required]);
130
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.updateValueAndValidity({ emitEvent: false });
131
+ return;
132
+ }
133
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.clearValidators();
134
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.updateValueAndValidity({ emitEvent: false });
135
+ });
136
+ }
137
+ else {
138
+ this.isSaida = true;
139
+ if (this.isSerie) {
140
+ this.formGroupBatchOrSeries.controls.serie.clearValidators();
141
+ this.formGroupBatchOrSeries.controls.serie.setValidators([Validators.required]);
142
+ this.formGroupBatchOrSeries.controls.serie.updateValueAndValidity({ emitEvent: false });
143
+ }
144
+ else {
145
+ this.formGroupBatchOrSeries.controls.lote.clearValidators();
146
+ this.formGroupBatchOrSeries.controls.lote.setValidators([Validators.required]);
147
+ this.formGroupBatchOrSeries.controls.lote.updateValueAndValidity({ emitEvent: false });
148
+ this.formGroupBatchOrSeries.controls.quantidade.clearValidators();
149
+ this.formGroupBatchOrSeries.controls.quantidade.setValidators([Validators.required]);
150
+ this.formGroupBatchOrSeries.controls.quantidade.updateValueAndValidity({ emitEvent: false });
151
+ }
152
+ this.batchOrSeriesFields = this.getFieldsSaida();
153
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
154
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
155
+ }
156
+ this.formGroupBatchOrSeries.controls.dataFabricacao.valueChanges.subscribe((val) => {
157
+ if (val) {
158
+ this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
159
+ this.formGroupBatchOrSeries.controls.dataValidade.setValidators([]);
160
+ this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
161
+ }
162
+ else {
163
+ this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
164
+ this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
165
+ }
166
+ });
167
+ this.qtdDistribuida = 0;
168
+ this.qtdAdistribuir = this.loteSerieParams.quantidadeDistribuir;
169
+ if (this.loteSerieParams.lotesOrSeries) {
170
+ this.gridData = this.loteSerieParams.lotesOrSeries;
171
+ this.qtdDistribuida = this.getQuantidadeDistribuida();
172
+ this.qtdRestante = this.qtdAdistribuir - this.qtdDistribuida;
173
+ }
174
+ else {
175
+ this.qtdRestante = this.qtdAdistribuir;
176
+ }
177
+ }
178
+ getFormGroupDados() {
179
+ const formGroup = this.formBuilder.group({
180
+ deposito: [{ value: undefined, disabled: false }, Validators.compose([])],
181
+ lote: [{ value: undefined, disabled: false }, Validators.compose([])],
182
+ dataValidade: [{ value: undefined, disabled: false }, Validators.compose([])],
183
+ dataFabricacao: [{ value: undefined, disabled: false }, Validators.compose([])],
184
+ serie: [{ value: undefined, disabled: false }, Validators.compose([])],
185
+ saldo: [{ value: undefined, disabled: true }, Validators.compose([])],
186
+ quantidade: [{ value: undefined, disabled: false }, Validators.compose([])],
187
+ batchSerieBulk: [{ value: undefined, disabled: false }, Validators.compose([])],
188
+ bulkVisible: [{ value: false, disabled: false }, Validators.compose([])]
189
+ });
190
+ return formGroup;
191
+ }
192
+ getProp(obj, path) {
193
+ return path.split('.').reduce((result, prop) => (result[prop] === undefined ? '' : result[prop]), obj);
194
+ }
195
+ getFieldsEntrada() {
196
+ let dadosFieldsEntrada = [];
197
+ if (!this.loteSerieParams.dadosProduto.e205dep) {
198
+ dadosFieldsEntrada = [
199
+ new FormField(Object.assign(Object.assign({}, this.e210DxpLookup.mountOptions({
200
+ multiple: false,
201
+ domain: 'erpx_sup',
202
+ service: 'estoque',
203
+ formGroup: 'deposito',
204
+ searchFields: [
205
+ { name: 'e205dep.codDep', type: FieldType.String },
206
+ {
207
+ name: 'e205dep.desDep',
208
+ type: FieldType.String
209
+ },
210
+ { name: 'e205dep.abrDep', type: FieldType.String },
211
+ {
212
+ name: 'e205dep.e070fil.codFil',
213
+ type: FieldType.Integer
214
+ }
215
+ ],
216
+ searchGridFields: [
217
+ { name: 'e205dep.codDep', type: FieldType.String },
218
+ {
219
+ name: 'e205dep.desDep',
220
+ type: FieldType.String
221
+ },
222
+ { name: 'e205dep.abrDep', type: FieldType.String },
223
+ {
224
+ name: 'e205dep.e070fil.codFil',
225
+ type: FieldType.Integer
226
+ },
227
+ { name: 'e205dep.e070fil.nomFil', type: FieldType.String }
228
+ ],
229
+ defaultFilter: [
230
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
231
+ {
232
+ field: 'e070emp.id',
233
+ operator: EnumLogicalOperator.Eq,
234
+ values: [this.loteSerieParams.dadosProduto.e070emp]
235
+ },
236
+ { field: 'sitEst', operator: EnumLogicalOperator.Eq, values: ['VA'] },
237
+ { field: 'e205dep.sitDep', operator: EnumLogicalOperator.Eq, values: ['VA'] },
238
+ {
239
+ field: 'e075der.id',
240
+ operator: EnumLogicalOperator.Eq,
241
+ values: [this.loteSerieParams.dadosProduto.e075der]
242
+ }
243
+ ]
244
+ })), { size: { sm: 12, md: 4, lg: 4, xl: 3 }, visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value }))
245
+ ];
246
+ }
247
+ dadosFieldsEntrada.push(new FormField({
248
+ name: 'bulkVisible',
249
+ label: this.translate.instant(`${this.prefix}bulk_visible`),
250
+ size: { sm: 12, md: 4, lg: 4, xl: 12 },
251
+ type: FieldType.Boolean,
252
+ representedBy: 'switch'
253
+ }), new FormField({
254
+ name: 'batchSerieBulk',
255
+ label: this.translate.instant(`${this.prefix}batch_serie_bulk`),
256
+ size: { sm: 12, md: 4, lg: 4, xl: 6 },
257
+ type: FieldType.Text,
258
+ rows: 5,
259
+ onBlur: (event) => this.onBlurValidaLoteorSerie(event.target.value),
260
+ required: () => true,
261
+ errorMessages: () => ({
262
+ existsInvalidChar: this.translate.instant(`${this.prefix}exists_invalid_char`)
263
+ }),
264
+ visible: () => this.formGroupBatchOrSeries.controls.bulkVisible.value
265
+ }), new FormField({
266
+ name: this.isSerie ? 'serie' : 'lote',
267
+ label: this.isSerie ? this.translate.instant(`${this.prefix}serie`) : this.translate.instant(`${this.prefix}lote`),
268
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
269
+ type: FieldType.String,
270
+ onBlur: (event) => this.onBlurValidaLoteorSerie(event.target.value),
271
+ required: () => true,
272
+ errorMessages: () => ({
273
+ existsInvalidChar: this.translate.instant(`${this.prefix}exists_invalid_char`)
274
+ }),
275
+ visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value
276
+ }), new FormField({
277
+ name: 'dataFabricacao',
278
+ label: this.translate.instant(`${this.prefix}data_fabricacao`),
279
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
280
+ type: FieldType.Date,
281
+ appendTo: 'body',
282
+ visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value
283
+ }), new FormField({
284
+ name: 'dataValidade',
285
+ label: this.translate.instant(`${this.prefix}data_validade`),
286
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
287
+ type: FieldType.Date,
288
+ appendTo: 'body',
289
+ required: () => this.obrigaValidade,
290
+ visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value
291
+ }), new FormField({
292
+ name: 'saldo',
293
+ label: this.translate.instant(`${this.prefix}saldo`),
294
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
295
+ type: FieldType.Double,
296
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
297
+ visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value
298
+ }));
299
+ if (!this.isSerie) {
300
+ dadosFieldsEntrada.push(new FormField({
301
+ name: 'quantidade',
302
+ label: this.translate.instant(`${this.prefix}quantidade`),
303
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
304
+ type: FieldType.Double,
305
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
306
+ required: () => true,
307
+ onBlur: () => this.onBlurQuantity(),
308
+ visible: () => !this.formGroupBatchOrSeries.controls.bulkVisible.value,
309
+ numberLocaleOptions: this.localeConfig.number
310
+ }));
311
+ }
312
+ return dadosFieldsEntrada;
313
+ }
314
+ getFieldsSaida() {
315
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
316
+ let dadosFieldsSaida = [];
317
+ if (!this.loteSerieParams.dadosProduto.e205dep) {
318
+ dadosFieldsSaida = [
319
+ new FormField(Object.assign(Object.assign({}, this.e210DxpLookup.mountOptions({
320
+ multiple: false,
321
+ domain: 'erpx_sup',
322
+ service: 'estoque',
323
+ formGroup: 'deposito',
324
+ searchFields: [
325
+ { name: 'e205dep.codDep', type: FieldType.String },
326
+ {
327
+ name: 'e205dep.desDep',
328
+ type: FieldType.String
329
+ },
330
+ { name: 'e205dep.abrDep', type: FieldType.String },
331
+ {
332
+ name: 'e205dep.e070fil.codFil',
333
+ type: FieldType.Integer
334
+ }
335
+ ],
336
+ searchGridFields: [
337
+ { name: 'e205dep.codDep', type: FieldType.String },
338
+ {
339
+ name: 'e205dep.desDep',
340
+ type: FieldType.String
341
+ },
342
+ { name: 'e205dep.abrDep', type: FieldType.String },
343
+ {
344
+ name: 'e205dep.e070fil.codFil',
345
+ type: FieldType.Integer
346
+ },
347
+ { name: 'e205dep.e070fil.nomFil', type: FieldType.String }
348
+ ],
349
+ defaultFilter: [
350
+ { field: 'excluido', operator: EnumLogicalOperator.Eq, values: ['false'] },
351
+ {
352
+ field: 'e070emp.id',
353
+ operator: EnumLogicalOperator.Eq,
354
+ values: [this.loteSerieParams.dadosProduto.e070emp]
355
+ },
356
+ { field: 'sitEst', operator: EnumLogicalOperator.Eq, values: ['VA'] },
357
+ { field: 'e205dep.sitDep', operator: EnumLogicalOperator.Eq, values: ['VA'] },
358
+ {
359
+ field: 'e075der.id',
360
+ operator: EnumLogicalOperator.Eq,
361
+ values: [this.loteSerieParams.dadosProduto.e075der]
362
+ }
363
+ ]
364
+ })), { size: { sm: 12, md: 4, lg: 4, xl: 3 } }))
365
+ ];
366
+ }
367
+ if (this.isSerie) {
368
+ dadosFieldsSaida.push(new FormField({
369
+ name: 'serie',
370
+ label: this.translate.instant(`${this.prefix}lookup_e200ser`),
371
+ type: FieldType.Lookup,
372
+ searchTitle: this.translate.instant(`${this.prefix}lookup_e200ser_search_title`),
373
+ searchEmptyTitle: this.translate.instant(`${this.prefix}nothing_found`),
374
+ filterLabel: this.translate.instant(`${this.prefix}filter`),
375
+ clearLabel: this.translate.instant(`${this.prefix}clear`),
376
+ cancelLabel: this.translate.instant(`${this.prefix}cancel`),
377
+ selectLabel: this.translate.instant(`${this.prefix}select`),
378
+ onSelect: (event) => {
379
+ var _a, _b;
380
+ if (((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) !== EnumInvoiceOrigin.V2)
381
+ this.validaLoteorSerie(event);
382
+ },
383
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
384
+ onSearchRequest: (event) => {
385
+ var _a, _b;
386
+ return ((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
387
+ ? this.onQuantidadeDisponivelDemandaRequest(event)
388
+ : this.onE200SerSearchRequest(event);
389
+ },
390
+ onLookupRequest: (value) => {
391
+ var _a, _b;
392
+ return ((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
393
+ ? this.onQuantidadeDisponivelDemandaRequest(value)
394
+ : this.onE200SerLookupRequest(value);
395
+ },
396
+ suggestionsObservable: ((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2
397
+ ? this.quantidadeDisponivelDemandaLookupSuggestionsObservable
398
+ : this.e200serLookupSuggestionsObservable,
399
+ searchObservable: ((_d = (_c = this.loteSerieParams) === null || _c === void 0 ? void 0 : _c.invoiceInformation) === null || _d === void 0 ? void 0 : _d.origin) === EnumInvoiceOrigin.V2
400
+ ? this.quantidadeDisponivelDemandalookupSearchObservable
401
+ : this.e200serlookupSearchObservable,
402
+ lookupDisplayField: 'label',
403
+ searchFields: ((_f = (_e = this.loteSerieParams) === null || _e === void 0 ? void 0 : _e.invoiceInformation) === null || _f === void 0 ? void 0 : _f.origin) === EnumInvoiceOrigin.V2
404
+ ? this.getQuantidadeDisponivelDemandaSearchFields()
405
+ : this.getE200SerSearchFields(),
406
+ searchGridFields: ((_h = (_g = this.loteSerieParams) === null || _g === void 0 ? void 0 : _g.invoiceInformation) === null || _h === void 0 ? void 0 : _h.origin) === EnumInvoiceOrigin.V2
407
+ ? this.getQuantidadeDisponivelDemandaSearchGridFields()
408
+ : this.getE200SerSearchGridFields(),
409
+ multiple: ((_k = (_j = this.loteSerieParams) === null || _j === void 0 ? void 0 : _j.invoiceInformation) === null || _k === void 0 ? void 0 : _k.origin) === EnumInvoiceOrigin.V2,
410
+ dataKey: ((_m = (_l = this.loteSerieParams) === null || _l === void 0 ? void 0 : _l.invoiceInformation) === null || _m === void 0 ? void 0 : _m.origin) === EnumInvoiceOrigin.V2 ? 'id' : 'e200ser.id',
411
+ required: () => true
412
+ }), new FormField({
413
+ name: 'dataFabricacao',
414
+ label: this.translate.instant(`${this.prefix}data_fabricacao`),
415
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
416
+ type: FieldType.Date,
417
+ appendTo: 'body',
418
+ visible: () => !this.isDistributeSeriesButtonVisible()
419
+ }), new FormField({
420
+ name: 'dataValidade',
421
+ label: this.translate.instant(`${this.prefix}data_validade`),
422
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
423
+ type: FieldType.Date,
424
+ appendTo: 'body',
425
+ required: () => this.obrigaValidade,
426
+ visible: () => !this.isDistributeSeriesButtonVisible()
427
+ }), new FormField({
428
+ name: 'saldo',
429
+ label: this.translate.instant(`${this.prefix}saldo`),
430
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
431
+ type: FieldType.Double,
432
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
433
+ visible: () => !this.isDistributeSeriesButtonVisible()
434
+ }));
435
+ }
436
+ else {
437
+ dadosFieldsSaida.push(((_o = this.loteSerieParams.invoiceInformation) === null || _o === void 0 ? void 0 : _o.origin) === EnumInvoiceOrigin.V2
438
+ ? new FormField({
439
+ name: 'lote',
440
+ label: this.translate.instant(`${this.prefix}lookup_e200lot`),
441
+ type: FieldType.Lookup,
442
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
443
+ onSelect: (event) => this.validaLoteorSerie(event),
444
+ onSearchRequest: (event) => this.onQuantidadeDisponivelDemandaRequest(event),
445
+ onLookupRequest: (value) => this.onQuantidadeDisponivelDemandaRequest(value),
446
+ suggestionsObservable: this.quantidadeDisponivelDemandaLookupSuggestionsObservable,
447
+ searchObservable: this.quantidadeDisponivelDemandalookupSearchObservable,
448
+ lookupDisplayField: 'label',
449
+ searchFields: this.getQuantidadeDisponivelDemandaSearchFields(),
450
+ searchGridFields: this.getQuantidadeDisponivelDemandaSearchGridFields(),
451
+ dataKey: 'id',
452
+ required: () => true
453
+ })
454
+ : new FormField({
455
+ name: 'lote',
456
+ label: this.translate.instant(`${this.prefix}lookup_e200lot`),
457
+ type: FieldType.Lookup,
458
+ searchTitle: this.translate.instant(`${this.prefix}lookup_e200lot_search_title`),
459
+ searchEmptyTitle: this.translate.instant(`${this.prefix}nothing_found`),
460
+ filterLabel: this.translate.instant(`${this.prefix}filter`),
461
+ clearLabel: this.translate.instant(`${this.prefix}clear`),
462
+ cancelLabel: this.translate.instant(`${this.prefix}cancel`),
463
+ selectLabel: this.translate.instant(`${this.prefix}select`),
464
+ onSelect: (event) => this.validaLoteorSerie(event),
465
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
466
+ onSearchRequest: (event) => this.onE200LotSearchRequest(event),
467
+ onLookupRequest: (value) => this.onE200LotLookupRequest(value),
468
+ suggestionsObservable: this.e200lotLookupSuggestionsObservable,
469
+ searchObservable: this.e200lotlookupSearchObservable,
470
+ lookupDisplayField: 'label',
471
+ searchFields: this.getE200LotSearchFields(),
472
+ searchGridFields: this.getE200LotSearchGridFields(),
473
+ required: () => true
474
+ }), new FormField({
475
+ name: 'dataFabricacao',
476
+ label: this.translate.instant(`${this.prefix}data_fabricacao`),
477
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
478
+ type: FieldType.Date,
479
+ appendTo: 'body'
480
+ }), new FormField({
481
+ name: 'dataValidade',
482
+ label: this.translate.instant(`${this.prefix}data_validade`),
483
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
484
+ type: FieldType.Date,
485
+ appendTo: 'body',
486
+ required: () => this.obrigaValidade
487
+ }), new FormField({
488
+ name: 'saldo',
489
+ label: this.translate.instant(`${this.prefix}saldo`),
490
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
491
+ type: FieldType.Double,
492
+ scale: this.loteSerieParams.dadosProduto.qtdDec
493
+ }), new FormField({
494
+ name: 'quantidade',
495
+ label: this.translate.instant(`${this.prefix}quantidade`),
496
+ size: { sm: 12, md: 4, lg: 4, xl: 3 },
497
+ type: FieldType.Double,
498
+ scale: this.loteSerieParams.dadosProduto.qtdDec,
499
+ required: () => true,
500
+ onBlur: () => this.onBlurQuantity()
501
+ }));
502
+ }
503
+ return dadosFieldsSaida;
504
+ }
505
+ getGridColumns() {
506
+ let gridColumns;
507
+ if (this.isSerie) {
508
+ gridColumns = [
509
+ {
510
+ field: 'serie',
511
+ header: this.translate.instant(`${this.prefix}serie`),
512
+ attributes: ['codigo'],
513
+ type: EnumColumnFieldType.STRING
514
+ },
515
+ { field: 'dataFabricacao', header: this.translate.instant(`${this.prefix}data_fabricacao`) },
516
+ { field: 'dataValidade', header: this.translate.instant(`${this.prefix}data_validade`) }
517
+ ];
518
+ }
519
+ else {
520
+ gridColumns = [
521
+ {
522
+ field: 'lote',
523
+ header: this.translate.instant(`${this.prefix}lote`),
524
+ attributes: ['codigo'],
525
+ type: EnumColumnFieldType.STRING
526
+ },
527
+ { field: 'quantidade', header: this.translate.instant(`${this.prefix}quantidade`) },
528
+ { field: 'dataFabricacao', header: this.translate.instant(`${this.prefix}data_fabricacao`) },
529
+ { field: 'dataValidade', header: this.translate.instant(`${this.prefix}data_validade`) }
530
+ ];
531
+ }
532
+ return gridColumns;
533
+ }
534
+ getE200LotSearchFields() {
535
+ const searchFields = [
536
+ new FormField({
537
+ name: 'e200lot.codLote',
538
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_cod_dep`),
539
+ type: FieldType.String
540
+ })
541
+ ];
542
+ return searchFields;
543
+ }
544
+ getE200SerSearchFields() {
545
+ const searchFields = [
546
+ new FormField({
547
+ name: 'e200ser.numSep',
548
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_num_sep`),
549
+ type: FieldType.String
550
+ })
551
+ ];
552
+ return searchFields;
553
+ }
554
+ onE200LotSearchRequest(event) {
555
+ let filterQuery;
556
+ let deposito = '';
557
+ const { first, rows, multiSortMeta, filterData } = event;
558
+ const page = first / rows;
559
+ const displayFields = ['e200lot.codLote'];
560
+ if (this.loteSerieParams.dadosProduto.e205dep) {
561
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
562
+ }
563
+ else {
564
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
565
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
566
+ }
567
+ const orderBy = multiSortMeta
568
+ ? multiSortMeta.map((s) => ({
569
+ field: s.field == 'e200lot.codLote' ? 'e200lot.codLot' : s.field,
570
+ order: s.order == 1 ? 'ASC' : 'DESC'
571
+ }))
572
+ : [{ field: 'e200lot.codLot', order: 'ASC' }];
573
+ filterQuery = {
574
+ e070emp: {
575
+ id: this.loteSerieParams.dadosProduto.e070emp
576
+ },
577
+ e205dep: {
578
+ id: deposito
579
+ },
580
+ e075der: {
581
+ id: this.loteSerieParams.dadosProduto.e075der
582
+ },
583
+ lotLike: true,
584
+ lotSal: true,
585
+ offset: page,
586
+ lotDis: true,
587
+ size: rows
588
+ };
589
+ if (filterData['e200lot.codLote']) {
590
+ filterQuery.e200lot = [
591
+ {
592
+ codLot: filterData['e200lot.codLote']
593
+ }
594
+ ];
595
+ }
596
+ if (orderBy) {
597
+ filterQuery.orderBy = orderBy;
598
+ }
599
+ this.batchSeriesService
600
+ .listBatch(filterQuery)
601
+ .pipe(takeUntil(this.ngUnsubscribe))
602
+ .pipe(map((list) => ({
603
+ gridData: list.lotes.map((item) => (Object.assign(Object.assign({}, item), { label: displayFields.map((field) => {
604
+ if (field.indexOf('.') > 0)
605
+ return this.getProp(item, field);
606
+ return item[field];
607
+ }) }))),
608
+ totalRecords: list.totalElements
609
+ })))
610
+ .subscribe((data) => {
611
+ this.e200lotlookupSearchObservable.next(data);
612
+ });
613
+ }
614
+ getQuantidadeDisponivelDemandaSearchFields() {
615
+ return this.isSerie
616
+ ? [
617
+ new FormField({
618
+ name: 'numSep',
619
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_num_sep`),
620
+ type: FieldType.String
621
+ })
622
+ ]
623
+ : [
624
+ new FormField({
625
+ name: 'codLot',
626
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_cod_dep`),
627
+ type: FieldType.String
628
+ })
629
+ ];
630
+ }
631
+ getQuantidadeDisponivelDemandaSearchGridFields() {
632
+ return this.isSerie
633
+ ? [
634
+ new FormField({
635
+ name: 'numSep',
636
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_num_sep`),
637
+ type: FieldType.String
638
+ }),
639
+ new FormField({
640
+ name: 'datFabSep',
641
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_dat_fab`),
642
+ type: FieldType.Date
643
+ }),
644
+ new FormField({
645
+ name: 'datVltSep',
646
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_dat_vlt`),
647
+ type: FieldType.Date
648
+ })
649
+ ]
650
+ : [
651
+ new FormField({
652
+ name: 'codLot',
653
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_cod_dep`),
654
+ type: FieldType.String
655
+ }),
656
+ new FormField({
657
+ name: 'datFabLot',
658
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_dat_fab`),
659
+ type: FieldType.Date
660
+ }),
661
+ new FormField({
662
+ name: 'datVltLot',
663
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_dat_vlt`),
664
+ type: FieldType.Date
665
+ }),
666
+ new FormField({
667
+ name: 'qtdDisponivel',
668
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_qtd_dis`),
669
+ type: FieldType.Double
670
+ })
671
+ ];
672
+ }
673
+ onQuantidadeDisponivelDemandaRequest(event) {
674
+ const listParams = {
675
+ filterQuery: `idExterno eq '${this.loteSerieParams.orderInformation.item.id}' and qtdDisponivel > 0`
676
+ };
677
+ if (this.isSerie) {
678
+ listParams.filterQuery += ` and numSep is not null`;
679
+ }
680
+ if (this.loteSerieParams.invoiceInformation.origin === EnumInvoiceOrigin.V2) {
681
+ listParams.filterQuery += ` and tipoDocumento eq 'PedidoVenda'`;
682
+ }
683
+ if (event instanceof String || typeof event === 'string') {
684
+ listParams.page = 0;
685
+ listParams.size = 10;
686
+ listParams.filterQuery += this.isSerie
687
+ ? ` and containing(lower(numSep), lower('${event.replace(/\\/g, '').replace(/'/g, "\\'")}'))`
688
+ : ` and containing(lower(codLot), lower('${event.replace(/\\/g, '').replace(/'/g, "\\'")}'))`;
689
+ }
690
+ else {
691
+ const { filterData, rows, multiSortMeta } = event;
692
+ listParams.page = event.first / rows;
693
+ listParams.sort = multiSortMeta ? multiSortMeta : null;
694
+ if (filterData.codLot !== null && filterData.codLot !== undefined) {
695
+ listParams.filterQuery += ` and containing(lower(codLot), lower('${filterData.codLot
696
+ .replace(/\\/g, '')
697
+ .replace(/'/g, "\\'")}'))`;
698
+ }
699
+ else if (filterData.numSep !== null && filterData.numSep !== undefined) {
700
+ listParams.filterQuery += ` and containing(lower(numSep), lower('${filterData.numSep
701
+ .replace(/\\/g, '')
702
+ .replace(/'/g, "\\'")}'))`;
703
+ }
704
+ }
705
+ this.quantidadeDisponivelDemandaService
706
+ .list(listParams)
707
+ .pipe(takeUntil(this.ngUnsubscribe), map((list) => ({
708
+ gridData: list.contents.map((item) => (Object.assign(Object.assign({}, item), { id: this.isSerie ? item.e200serId : item.e200lotId, label: this.isSerie ? `${item.numSep}` : `${item.codLot}` }))),
709
+ totalRecords: list.totalElements
710
+ })))
711
+ .subscribe((data) => {
712
+ this.quantidadeDisponivelDemandaLookupSuggestionsObservable.next(data.gridData);
713
+ this.quantidadeDisponivelDemandalookupSearchObservable.next(data);
714
+ });
715
+ }
716
+ onE200SerSearchRequest(event) {
717
+ let filterQuery;
718
+ let deposito = '';
719
+ const { first, rows, multiSortMeta, filterData } = event;
720
+ const page = first / rows;
721
+ const displayFields = ['e200ser.numSep'];
722
+ if (this.loteSerieParams.dadosProduto.e205dep) {
723
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
724
+ }
725
+ else {
726
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
727
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
728
+ }
729
+ const orderBy = multiSortMeta
730
+ ? multiSortMeta.map((s) => (Object.assign(Object.assign({}, s), { order: s.order == 1 ? 'ASC' : 'DESC' })))
731
+ : [{ field: 'e200ser.numSep', order: 'ASC' }];
732
+ filterQuery = {
733
+ e070emp: {
734
+ id: this.loteSerieParams.dadosProduto.e070emp
735
+ },
736
+ e205dep: {
737
+ id: deposito
738
+ },
739
+ e075der: {
740
+ id: this.loteSerieParams.dadosProduto.e075der
741
+ },
742
+ serLike: true,
743
+ serSal: true,
744
+ offset: page,
745
+ serDis: true,
746
+ size: rows
747
+ };
748
+ if (filterData['e200ser.numSep']) {
749
+ filterQuery.e200ser = [
750
+ {
751
+ numSep: filterData['e200ser.numSep']
752
+ }
753
+ ];
754
+ }
755
+ if (orderBy) {
756
+ filterQuery.orderBy = orderBy;
757
+ }
758
+ this.batchSeriesService
759
+ .listSeries(filterQuery)
760
+ .pipe(takeUntil(this.ngUnsubscribe))
761
+ .pipe(map((list) => ({
762
+ gridData: list.series.map((item) => (Object.assign(Object.assign({}, item), { label: displayFields.map((field) => {
763
+ if (field.indexOf('.') > 0)
764
+ return this.getProp(item, field);
765
+ return item[field];
766
+ }) }))),
767
+ totalRecords: list.totalElements
768
+ })))
769
+ .subscribe((data) => {
770
+ this.e200serlookupSearchObservable.next(data);
771
+ });
772
+ }
773
+ removeBatchOrSeries(rowData) {
774
+ if (this.blockedFields == false) {
775
+ this.qtdDistribuida -= this.isSerie ? 1 : Number(rowData.quantidade);
776
+ this.qtdRestante += this.isSerie ? 1 : Number(rowData.quantidade);
777
+ this.gridData = this.gridData.filter((batchOrSeries) => {
778
+ return batchOrSeries.codigo != rowData.codigo;
779
+ });
780
+ this.loteSerieParams.lotesOrSeries = this.gridData;
781
+ }
782
+ }
783
+ addBatchOrSeries() {
784
+ var _a, _b;
785
+ let codigo;
786
+ let id = '';
787
+ this.validateAllFormFields(this.formGroupBatchOrSeries);
788
+ if (this.formGroupBatchOrSeries.controls.bulkVisible.value) {
789
+ if (isEmpty(this.formGroupBatchOrSeries.controls.batchSerieBulk.value)) {
790
+ return;
791
+ }
792
+ const convertedArray = this.formGroupBatchOrSeries.controls.batchSerieBulk.value.split('\n');
793
+ this.gridData = [];
794
+ this.qtdDistribuida = 0;
795
+ this.qtdAdistribuir = this.loteSerieParams.quantidadeDistribuir;
796
+ this.qtdRestante = 0;
797
+ let linhaAtual = 0;
798
+ if (convertedArray.length == 0) {
799
+ const msgError = this.translate.instant(`${this.prefix}invalid_layout`);
800
+ this.messageService.add({
801
+ severity: 'error',
802
+ summary: this.translate.instant(`${this.prefix}invalid_layout`),
803
+ detail: msgError,
804
+ life: 20000
805
+ });
806
+ this.gridData = [];
807
+ throw msgError;
808
+ }
809
+ convertedArray.forEach((value) => {
810
+ linhaAtual++;
811
+ const currentValue = value.split(';');
812
+ if ((this.isSerie && currentValue.length > 3) || (!this.isSerie && currentValue.length > 4)) {
813
+ const msgError = this.translate.instant(`${this.prefix}invalid_layout`);
814
+ this.messageService.add({
815
+ severity: 'error',
816
+ summary: this.translate.instant(`${this.prefix}invalid_layout`),
817
+ detail: msgError,
818
+ life: 20000
819
+ });
820
+ this.gridData = [];
821
+ throw msgError;
822
+ }
823
+ const convertedValue = this.isSerie
824
+ ? {
825
+ codigo: this.toCode(currentValue[0], this.translate.instant(`${this.prefix}codigo_not_informed_batch`, { line: linhaAtual })),
826
+ dataFabricacao: this.toDate(currentValue[1], this.translate.instant(`${this.prefix}manufacturing_date_invalid_batch`, { line: linhaAtual })),
827
+ dataValidade: this.toDate(currentValue[2], this.translate.instant(`${this.prefix}validate_date_invalid_batch`, { line: linhaAtual })),
828
+ quantidade: 1
829
+ }
830
+ : {
831
+ codigo: this.toCode(currentValue[0], this.translate.instant(`${this.prefix}codigo_not_informed_batch`, { line: linhaAtual })),
832
+ quantidade: this.toAmount(currentValue[1], linhaAtual),
833
+ dataFabricacao: this.toDate(currentValue[2], this.translate.instant(`${this.prefix}manufacturing_date_invalid_batch`, { line: linhaAtual })),
834
+ dataValidade: this.toDate(currentValue[3], this.translate.instant(`${this.prefix}validate_date_invalid_batch`, { line: linhaAtual }))
835
+ };
836
+ // valida se a familia obriga a informar validade
837
+ if (this.obrigaValidade && !convertedValue.dataValidade) {
838
+ const msgError = this.translate.instant(`${this.prefix}error_selected_dates_batch`, { line: linhaAtual });
839
+ this.messageService.add({
840
+ severity: 'error',
841
+ summary: this.translate.instant(`${this.prefix}error_expiry_date`),
842
+ detail: msgError,
843
+ life: 20000
844
+ });
845
+ this.gridData = [];
846
+ throw msgError;
847
+ }
848
+ // valida se existe código duplicado
849
+ if (this.gridData.some((value) => value.codigo === convertedValue.codigo)) {
850
+ const msgError = this.isSerie
851
+ ? this.translate.instant(`${this.prefix}duplicated_series_msg_batch`, { line: linhaAtual })
852
+ : this.translate.instant(`${this.prefix}duplicated_batch_msg_batch`, { line: linhaAtual });
853
+ this.messageService.add({
854
+ severity: 'error',
855
+ summary: this.translate.instant(`${this.prefix}batch_distribution_error`),
856
+ detail: msgError,
857
+ life: 20000
858
+ });
859
+ this.gridData = [];
860
+ throw msgError;
861
+ }
862
+ // valida se a data de fabricação é maior que a validade
863
+ if (convertedValue.dataValidade &&
864
+ convertedValue.dataFabricacao &&
865
+ convertedValue.dataValidade < convertedValue.dataFabricacao) {
866
+ const msgError = this.translate.instant(`${this.prefix}expiry_lower_than_manufacturing_batch`, { line: linhaAtual });
867
+ this.messageService.add({
868
+ severity: 'error',
869
+ summary: this.translate.instant(`${this.prefix}error_selected_dates`),
870
+ detail: msgError,
871
+ life: 20000
872
+ });
873
+ this.gridData = [];
874
+ throw msgError;
875
+ }
876
+ this.qtdDistribuida += convertedValue.quantidade;
877
+ // valida se a quantidade distribuida é maior que a quantidade a distribuir
878
+ if (this.qtdDistribuida > this.qtdAdistribuir) {
879
+ const msgError = this.translate.instant(`${this.prefix}invalid_qty_msg_batch`, { line: linhaAtual });
880
+ this.messageService.add({
881
+ severity: 'error',
882
+ summary: this.translate.instant(`${this.prefix}distribution_error`),
883
+ detail: msgError,
884
+ life: 20000
885
+ });
886
+ this.gridData = [];
887
+ throw msgError;
888
+ }
889
+ this.gridData.push(convertedValue);
890
+ this.qtdRestante = this.qtdAdistribuir - this.qtdDistribuida;
891
+ });
892
+ this.loteSerieParams.lotesOrSeries = this.gridData;
893
+ this.formGroupBatchOrSeries.controls.batchSerieBulk.reset();
894
+ this.messageService.clear();
895
+ return;
896
+ }
897
+ if (this.formGroupBatchOrSeries.valid &&
898
+ (this.formGroupBatchOrSeries.controls.serie.value || this.formGroupBatchOrSeries.controls.lote.value)) {
899
+ if (this.isSerie)
900
+ this.formGroupBatchOrSeries.controls.quantidade.patchValue(1);
901
+ if (this.formGroupBatchOrSeries.controls.dataValidade.value &&
902
+ this.formGroupBatchOrSeries.controls.dataFabricacao.value &&
903
+ this.formGroupBatchOrSeries.controls.dataValidade.value < this.formGroupBatchOrSeries.controls.dataFabricacao.value) {
904
+ this.messageService.add({
905
+ severity: 'error',
906
+ summary: this.translate.instant(`${this.prefix}error_selected_dates`),
907
+ detail: this.translate.instant(`${this.prefix}expiry_lower_than_manufacturing`)
908
+ });
909
+ return;
910
+ }
911
+ if (this.obrigaValidade) {
912
+ if (!this.formGroupBatchOrSeries.controls.dataValidade.value) {
913
+ this.messageService.add({
914
+ severity: 'error',
915
+ summary: this.translate.instant(`${this.prefix}error_selected_dates`),
916
+ detail: this.translate.instant(`${this.prefix}error_expiry_date`)
917
+ });
918
+ return;
919
+ }
920
+ }
921
+ const distributedQuantity = this.formGroupBatchOrSeries.get('quantidade').value
922
+ ? Number(this.formGroupBatchOrSeries.get('quantidade').value)
923
+ : 0;
924
+ if (distributedQuantity > 0) {
925
+ if (this.sum(this.qtdDistribuida, distributedQuantity, this.locale.number.scale) > this.qtdAdistribuir) {
926
+ this.messageService.add({
927
+ severity: 'error',
928
+ summary: this.translate.instant(`${this.prefix}distribution_error`),
929
+ detail: this.translate.instant(`${this.prefix}invalid_qty_msg`)
930
+ });
931
+ return;
932
+ }
933
+ }
934
+ else {
935
+ this.messageService.add({
936
+ severity: 'error',
937
+ summary: this.translate.instant(`${this.prefix}distribution_error`),
938
+ detail: this.translate.instant(`${this.prefix}invalid_qtd`)
939
+ });
940
+ return;
941
+ }
942
+ if (this.isSerie) {
943
+ if (this.isSaida) {
944
+ if (this.formGroupBatchOrSeries.controls.serie.value.e200ser) {
945
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.e200ser.numSep;
946
+ id = this.formGroupBatchOrSeries.controls.serie.value.e200ser.id;
947
+ }
948
+ else {
949
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.numSep;
950
+ id = this.formGroupBatchOrSeries.controls.serie.value.id;
951
+ }
952
+ }
953
+ else {
954
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.toUpperCase();
955
+ this.formGroupBatchOrSeries.controls.serie.patchValue(this.formGroupBatchOrSeries.controls.serie.value.toUpperCase());
956
+ }
957
+ }
958
+ else {
959
+ if (this.isSaida) {
960
+ if (this.formGroupBatchOrSeries.controls.lote.value.e200lot) {
961
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.e200lot.codLote;
962
+ id = this.formGroupBatchOrSeries.controls.lote.value.e200lot.id;
963
+ }
964
+ else {
965
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.codLot;
966
+ id = this.formGroupBatchOrSeries.controls.lote.value.id;
967
+ }
968
+ }
969
+ else {
970
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.toUpperCase();
971
+ this.formGroupBatchOrSeries.controls.lote.patchValue(this.formGroupBatchOrSeries.controls.lote.value.toUpperCase());
972
+ }
973
+ }
974
+ if (this.isDuplicateBatchSeries()) {
975
+ if (!this.isSerie) {
976
+ this.messageService.add({
977
+ severity: 'error',
978
+ summary: this.translate.instant(`${this.prefix}batch_distribution_error`),
979
+ detail: this.translate.instant(`${this.prefix}duplicated_batch_msg`)
980
+ });
981
+ }
982
+ else {
983
+ this.messageService.add({
984
+ severity: 'error',
985
+ summary: this.translate.instant(`${this.prefix}series_distribution_error`),
986
+ detail: this.translate.instant(`${this.prefix}duplicated_series_msg`)
987
+ });
988
+ }
989
+ return;
990
+ }
991
+ let loteOrSerieValues = this.formGroupBatchOrSeries.getRawValue();
992
+ loteOrSerieValues = this.formatDates(loteOrSerieValues, ['dataFabricacao', 'dataValidade']);
993
+ if (((_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.origin) === EnumInvoiceOrigin.V2 && loteOrSerieValues.serie) {
994
+ if (Array.isArray(loteOrSerieValues.serie)) {
995
+ for (const value of loteOrSerieValues.serie) {
996
+ this.gridData.push({
997
+ id: value.id,
998
+ codigo: value.numSep,
999
+ quantidade: value.qtdDisponivel,
1000
+ dataFabricacao: value.datFabSep,
1001
+ dataValidade: value.datVltSep
1002
+ });
1003
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(value.qtdDisponivel), this.locale.number.scale);
1004
+ this.qtdRestante = this.sub(this.qtdRestante, Number(value.qtdDisponivel), this.locale.number.scale);
1005
+ }
1006
+ }
1007
+ else {
1008
+ this.gridData.push({
1009
+ id: loteOrSerieValues.serie.id,
1010
+ codigo: loteOrSerieValues.serie.numSep,
1011
+ quantidade: loteOrSerieValues.serie.qtdDisponivel,
1012
+ dataFabricacao: loteOrSerieValues.serie.datFabSep,
1013
+ dataValidade: loteOrSerieValues.serie.datVltSep
1014
+ });
1015
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(loteOrSerieValues.serie.qtdDisponivel), this.locale.number.scale);
1016
+ this.qtdRestante = this.sub(this.qtdRestante, Number(loteOrSerieValues.serie.qtdDisponivel), this.locale.number.scale);
1017
+ }
1018
+ }
1019
+ else {
1020
+ this.gridData.push({
1021
+ id: id,
1022
+ codigo: codigo,
1023
+ quantidade: loteOrSerieValues.quantidade,
1024
+ dataFabricacao: loteOrSerieValues.dataFabricacao,
1025
+ dataValidade: loteOrSerieValues.dataValidade
1026
+ });
1027
+ this.qtdDistribuida = this.sum(this.qtdDistribuida, Number(loteOrSerieValues.quantidade), this.locale.number.scale);
1028
+ this.qtdRestante = this.sub(this.qtdRestante, Number(loteOrSerieValues.quantidade), this.locale.number.scale);
1029
+ }
1030
+ this.clearBatchSeries();
1031
+ this.loteSerieParams.lotesOrSeries = this.gridData;
1032
+ }
1033
+ else {
1034
+ return this.validateAllFormFields(this.formGroupBatchOrSeries);
1035
+ }
1036
+ }
1037
+ toCode(currentValue, msgError) {
1038
+ currentValue = String(currentValue).trim().toUpperCase();
1039
+ if (isEmpty(currentValue)) {
1040
+ this.messageService.add({
1041
+ severity: 'error',
1042
+ summary: this.translate.instant(`${this.prefix}codigo_not_informed`),
1043
+ detail: msgError,
1044
+ life: 20000
1045
+ });
1046
+ this.gridData = [];
1047
+ throw msgError;
1048
+ }
1049
+ return currentValue;
1050
+ }
1051
+ toAmount(currentValue, linhaAtual) {
1052
+ const convertedValue = this.toNumber(currentValue);
1053
+ if (!currentValue || (!convertedValue && convertedValue != 0)) {
1054
+ const msgError = this.translate.instant(`${this.prefix}amount_not_informed_batch`, { line: linhaAtual });
1055
+ this.messageService.add({
1056
+ severity: 'error',
1057
+ summary: this.translate.instant(`${this.prefix}amount_not_informed`),
1058
+ detail: msgError,
1059
+ life: 20000
1060
+ });
1061
+ this.gridData = [];
1062
+ throw msgError;
1063
+ }
1064
+ if (String(currentValue).indexOf(this.locale.number.thousandsSeparator) > 0) {
1065
+ const msgError = this.translate.instant(`${this.prefix}format_number_invalid_batch`, { line: linhaAtual });
1066
+ this.messageService.add({
1067
+ severity: 'error',
1068
+ summary: this.translate.instant(`${this.prefix}amount_invalid_batch`),
1069
+ detail: msgError,
1070
+ life: 20000
1071
+ });
1072
+ this.gridData = [];
1073
+ throw msgError;
1074
+ }
1075
+ if (convertedValue <= 0) {
1076
+ const msgError = this.translate.instant(`${this.prefix}amount_quantity_that_zero_batch`, { line: linhaAtual });
1077
+ this.messageService.add({
1078
+ severity: 'error',
1079
+ summary: this.translate.instant(`${this.prefix}amount_invalid_batch`),
1080
+ detail: msgError,
1081
+ life: 20000
1082
+ });
1083
+ this.gridData = [];
1084
+ throw msgError;
1085
+ }
1086
+ const temDecimal = String(convertedValue).split('.');
1087
+ if (temDecimal.length > 1 && this.locale.number.scale != String(convertedValue).split('.')[1].length) {
1088
+ const msgError = this.translate.instant(`${this.prefix}invalid_decimals_batch`, { line: linhaAtual });
1089
+ this.messageService.add({
1090
+ severity: 'error',
1091
+ summary: this.translate.instant(`${this.prefix}amount_invalid_batch`),
1092
+ detail: msgError,
1093
+ life: 20000
1094
+ });
1095
+ this.gridData = [];
1096
+ throw msgError;
1097
+ }
1098
+ return convertedValue;
1099
+ }
1100
+ toNumber(currentValue) {
1101
+ return isNotEmpty(currentValue)
1102
+ ? Number(currentValue.replace(this.locale.number.thousandsSeparator, '').replace(this.locale.number.decimalSeparator, '.'))
1103
+ : undefined;
1104
+ }
1105
+ toDate(currentValue, msgError) {
1106
+ if (isNotEmpty(currentValue) && !moment(currentValue.trim(), 'L', true).isValid()) {
1107
+ this.messageService.add({
1108
+ severity: 'error',
1109
+ summary: this.translate.instant(`${this.prefix}invalid_date_batch`),
1110
+ detail: msgError,
1111
+ life: 20000
1112
+ });
1113
+ this.gridData = [];
1114
+ throw msgError;
1115
+ }
1116
+ return isNotEmpty(currentValue) ? moment(currentValue.trim(), 'L', true).format('YYYY-MM-DD') : undefined;
1117
+ }
1118
+ isDuplicateBatchSeries() {
1119
+ var _a, _b, _c, _d, _e, _f;
1120
+ let codigo;
1121
+ if (!this.isSerie) {
1122
+ if (this.isSaida) {
1123
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.e200lot
1124
+ ? this.formGroupBatchOrSeries.controls.lote.value.e200lot.codLote
1125
+ : this.formGroupBatchOrSeries.controls.lote.value.codLot;
1126
+ }
1127
+ else {
1128
+ codigo = this.formGroupBatchOrSeries.controls.lote.value.toUpperCase();
1129
+ }
1130
+ return this.gridData.find((element) => {
1131
+ if (element.codigo === codigo)
1132
+ return true;
1133
+ return false;
1134
+ });
1135
+ }
1136
+ else {
1137
+ if (this.isSaida && Array.isArray((_c = (_b = (_a = this.formGroupBatchOrSeries) === null || _a === void 0 ? void 0 : _a.controls) === null || _b === void 0 ? void 0 : _b.serie) === null || _c === void 0 ? void 0 : _c.value)) {
1138
+ for (const series of (_f = (_e = (_d = this.formGroupBatchOrSeries) === null || _d === void 0 ? void 0 : _d.controls) === null || _e === void 0 ? void 0 : _e.serie) === null || _f === void 0 ? void 0 : _f.value) {
1139
+ for (const addedSeries of this.gridData) {
1140
+ if (series.numSep === addedSeries.codigo)
1141
+ return true;
1142
+ }
1143
+ }
1144
+ return false;
1145
+ }
1146
+ return this.gridData.find((element) => {
1147
+ if (this.isSaida) {
1148
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.e200ser
1149
+ ? this.formGroupBatchOrSeries.controls.serie.value.e200ser.numSep
1150
+ : this.formGroupBatchOrSeries.controls.serie.value.numSep;
1151
+ }
1152
+ else {
1153
+ codigo = this.formGroupBatchOrSeries.controls.serie.value.toUpperCase();
1154
+ }
1155
+ if (element.codigo === codigo)
1156
+ return true;
1157
+ return false;
1158
+ });
1159
+ }
1160
+ }
1161
+ clearBatchSeries() {
1162
+ this.formGroupBatchOrSeries.reset();
1163
+ if (this.isSaida) {
1164
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1165
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1166
+ }
1167
+ else {
1168
+ if (this.blockedFields == false)
1169
+ this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1170
+ if (!this.disableDataValidade && this.blockedFields == false) {
1171
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1172
+ }
1173
+ }
1174
+ }
1175
+ validaLoteorSerie(event) {
1176
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1177
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1178
+ if (!this.isSerie) {
1179
+ this.getDatas(event.codLot ? event.codLot : event.e200lot.codLote);
1180
+ this.consultaSaldoEstoque(event.codLot ? event.codLot : event.e200lot.codLote);
1181
+ }
1182
+ else {
1183
+ this.getDatas(event.numSep ? event.numSep : event.e200ser.numSep);
1184
+ this.consultaSaldoEstoque(event.numSep ? event.numSep : event.e200ser.numSep);
1185
+ }
1186
+ }
1187
+ onBlurValidaLoteorSerie(value) {
1188
+ // Quando realiza o tab, abre o calendar, por isso é necessário desabilitar antes
1189
+ if (value) {
1190
+ if (this.validateInvalidChars) {
1191
+ const newValue = value.trim();
1192
+ if (value !== newValue) {
1193
+ if (this.loteSerieParams.tipoControleProduto == EnumTipoControleProduto.Serie) {
1194
+ this.formGroupBatchOrSeries.controls.serie.patchValue(newValue);
1195
+ }
1196
+ else {
1197
+ this.formGroupBatchOrSeries.controls.lote.patchValue(newValue);
1198
+ }
1199
+ }
1200
+ }
1201
+ this.getDatas(value.toUpperCase());
1202
+ this.consultaSaldoEstoque(value.toUpperCase());
1203
+ }
1204
+ }
1205
+ getDatas(value) {
1206
+ this.formGroupBatchOrSeries.controls.dataFabricacao.reset();
1207
+ this.formGroupBatchOrSeries.controls.dataValidade.reset();
1208
+ this.formGroupBatchOrSeries.controls.saldo.reset();
1209
+ this.formGroupBatchOrSeries.controls.dataFabricacao.disable();
1210
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1211
+ let filterQuery;
1212
+ let deposito = '';
1213
+ if (this.isSerie) {
1214
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1215
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1216
+ }
1217
+ else {
1218
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1219
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1220
+ }
1221
+ filterQuery = {
1222
+ e070emp: {
1223
+ id: this.loteSerieParams.dadosProduto.e070emp
1224
+ },
1225
+ e205dep: {
1226
+ id: deposito
1227
+ },
1228
+ e075der: {
1229
+ id: this.loteSerieParams.dadosProduto.e075der
1230
+ },
1231
+ serLike: false,
1232
+ serSal: true,
1233
+ serDis: true,
1234
+ offset: 0,
1235
+ size: 10,
1236
+ orderBy: [
1237
+ {
1238
+ field: 'e200ser.numSep',
1239
+ order: 'ASC'
1240
+ }
1241
+ ]
1242
+ };
1243
+ if (value) {
1244
+ filterQuery.e200ser = [
1245
+ {
1246
+ numSep: value
1247
+ }
1248
+ ];
1249
+ }
1250
+ this.batchSeriesService
1251
+ .listSeries(filterQuery)
1252
+ .pipe(takeUntil(this.ngUnsubscribe))
1253
+ .subscribe((response) => {
1254
+ if (response.series.length > 0) {
1255
+ const dates = this.formatDatesToCalendar(response.series[0], ['datFab', 'datVlt']);
1256
+ if (dates.e200ser.datFab) {
1257
+ this.formGroupBatchOrSeries.controls.dataFabricacao.patchValue(moment(dates.e200ser.datFab).toDate());
1258
+ }
1259
+ if (dates.e200ser.datVlt) {
1260
+ this.formGroupBatchOrSeries.controls.dataValidade.patchValue(moment(dates.e200ser.datVlt).toDate());
1261
+ }
1262
+ }
1263
+ else {
1264
+ if (!this.isSaida) {
1265
+ this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1266
+ }
1267
+ if (!this.disableDataValidade && this.blockedFields == false && !this.isSaida)
1268
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1269
+ }
1270
+ });
1271
+ }
1272
+ else {
1273
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1274
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1275
+ }
1276
+ else {
1277
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1278
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1279
+ }
1280
+ filterQuery = {
1281
+ e070emp: {
1282
+ id: this.loteSerieParams.dadosProduto.e070emp
1283
+ },
1284
+ e205dep: {
1285
+ id: deposito
1286
+ },
1287
+ e075der: {
1288
+ id: this.loteSerieParams.dadosProduto.e075der
1289
+ },
1290
+ lotLike: false,
1291
+ lotSal: true,
1292
+ lotDis: true,
1293
+ offset: 0,
1294
+ size: 10,
1295
+ orderBy: [
1296
+ {
1297
+ field: 'e200lot.codLot',
1298
+ order: 'ASC'
1299
+ }
1300
+ ]
1301
+ };
1302
+ if (value) {
1303
+ filterQuery.e200lot = [
1304
+ {
1305
+ codLot: value
1306
+ }
1307
+ ];
1308
+ }
1309
+ this.batchSeriesService
1310
+ .listBatch(filterQuery)
1311
+ .pipe(takeUntil(this.ngUnsubscribe))
1312
+ .subscribe((response) => {
1313
+ if (response.lotes.length > 0) {
1314
+ const dates = this.formatDatesToCalendar(response.lotes[0], ['datFab', 'datVlt']);
1315
+ if (dates.e200lot.datFab) {
1316
+ this.formGroupBatchOrSeries.controls.dataFabricacao.patchValue(moment(dates.e200lot.datFab).toDate());
1317
+ }
1318
+ if (dates.e200lot.datVlt) {
1319
+ this.formGroupBatchOrSeries.controls.dataValidade.patchValue(moment(dates.e200lot.datVlt).toDate());
1320
+ }
1321
+ }
1322
+ else {
1323
+ if (!this.isSaida) {
1324
+ this.formGroupBatchOrSeries.controls.dataFabricacao.enable();
1325
+ }
1326
+ if (!this.disableDataValidade && this.blockedFields == false && !this.isSaida)
1327
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1328
+ }
1329
+ });
1330
+ }
1331
+ }
1332
+ processFamilySupplyInfo(familyID) {
1333
+ this.batchSeriesService
1334
+ .getProductFamilySupplyInfo(familyID)
1335
+ .pipe(takeUntil(this.ngUnsubscribe))
1336
+ .subscribe((response) => {
1337
+ const supplyInfo = response.contents[0];
1338
+ this.obrigaValidade = false;
1339
+ this.formGroupBatchOrSeries.controls.dataValidade.setValidators([]);
1340
+ switch (supplyInfo === null || supplyInfo === void 0 ? void 0 : supplyInfo.ctrVld) {
1341
+ case 'VO':
1342
+ this.formGroupBatchOrSeries.controls.dataValidade.clearValidators();
1343
+ this.formGroupBatchOrSeries.controls.dataValidade.setValidators([Validators.required]);
1344
+ if (this.blockedFields == false && !this.isSaida)
1345
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1346
+ this.obrigaValidade = true;
1347
+ break;
1348
+ case 'VD':
1349
+ this.formGroupBatchOrSeries.controls.dataValidade.disable();
1350
+ this.disableDataValidade = true;
1351
+ break;
1352
+ case 'VL':
1353
+ if (this.blockedFields == false && !this.isSaida)
1354
+ this.formGroupBatchOrSeries.controls.dataValidade.enable();
1355
+ break;
1356
+ }
1357
+ });
1358
+ this.formGroupBatchOrSeries.controls.dataValidade.updateValueAndValidity({ emitEvent: false });
1359
+ }
1360
+ consultaSaldoEstoque(value) {
1361
+ let balancePayload = {};
1362
+ if (this.isSerie) {
1363
+ balancePayload = {
1364
+ e205dep: {
1365
+ id: this.loteSerieParams.dadosProduto.e205dep
1366
+ ? this.loteSerieParams.dadosProduto.e205dep
1367
+ : this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id
1368
+ },
1369
+ e075der: { id: this.loteSerieParams.dadosProduto.e075der },
1370
+ e200ser: { numSep: value }
1371
+ };
1372
+ }
1373
+ else {
1374
+ balancePayload = {
1375
+ e205dep: {
1376
+ id: this.loteSerieParams.dadosProduto.e205dep
1377
+ ? this.loteSerieParams.dadosProduto.e205dep
1378
+ : this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id
1379
+ },
1380
+ e075der: { id: this.loteSerieParams.dadosProduto.e075der },
1381
+ e200lot: { codLot: value }
1382
+ };
1383
+ }
1384
+ this.batchSeriesService
1385
+ .consultarSaldoEstoque(balancePayload)
1386
+ .pipe(takeUntil(this.ngUnsubscribe))
1387
+ .subscribe((response) => {
1388
+ if (!response.saldo) {
1389
+ this.formGroupBatchOrSeries.controls.saldo.patchValue(0);
1390
+ }
1391
+ else {
1392
+ this.formGroupBatchOrSeries.controls.saldo.patchValue(response.saldo);
1393
+ }
1394
+ });
1395
+ }
1396
+ getQuantidadeDistribuida() {
1397
+ let qtd = 0;
1398
+ this.loteSerieParams.lotesOrSeries.forEach((val) => {
1399
+ if (!this.isSerie)
1400
+ qtd = this.sum(qtd, Number(val.quantidade), this.locale.number.scale);
1401
+ else
1402
+ qtd = this.sum(qtd, 1, this.locale.number.scale);
1403
+ });
1404
+ return qtd;
1405
+ }
1406
+ validateAllFormFields(formGroup) {
1407
+ Object.keys(formGroup.controls).forEach((field) => {
1408
+ const control = formGroup.get(field);
1409
+ if (control instanceof FormControl)
1410
+ control.markAsDirty({ onlySelf: true });
1411
+ else if (control instanceof FormGroup)
1412
+ this.validateAllFormFields(control);
1413
+ });
1414
+ }
1415
+ onRouteDataChange(data) {
1416
+ this.localeConfig = data.localeConfig;
1417
+ this.locale = this.localeConfig;
1418
+ this.locale.number.scale = this.loteSerieParams.dadosProduto.qtdDec ? this.loteSerieParams.dadosProduto.qtdDec : 0;
1419
+ }
1420
+ getE200LotSearchGridFields() {
1421
+ const searchGridFields = [
1422
+ new FormField({
1423
+ name: 'e200lot.codLote',
1424
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_cod_dep`),
1425
+ type: FieldType.String
1426
+ }),
1427
+ new FormField({
1428
+ name: 'e200lot.datFab',
1429
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_dat_fab`),
1430
+ type: FieldType.Date
1431
+ }),
1432
+ new FormField({
1433
+ name: 'e200lot.datVlt',
1434
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_dat_vlt`),
1435
+ type: FieldType.Date
1436
+ }),
1437
+ new FormField({
1438
+ name: 'qtdDis',
1439
+ label: this.translate.instant(`${this.prefix}lookup_e200lot_qtd_dis`),
1440
+ type: FieldType.Double
1441
+ })
1442
+ ];
1443
+ return searchGridFields;
1444
+ }
1445
+ getE200SerSearchGridFields() {
1446
+ const searchGridFields = [
1447
+ new FormField({
1448
+ name: 'e200ser.numSep',
1449
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_num_sep`),
1450
+ type: FieldType.String
1451
+ }),
1452
+ new FormField({
1453
+ name: 'e200ser.datFab',
1454
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_dat_fab`),
1455
+ type: FieldType.Date
1456
+ }),
1457
+ new FormField({
1458
+ name: 'e200ser.datVlt',
1459
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_dat_vlt`),
1460
+ type: FieldType.Date
1461
+ }),
1462
+ new FormField({
1463
+ name: 'qtdDis',
1464
+ label: this.translate.instant(`${this.prefix}lookup_e200ser_qtd_dis`),
1465
+ type: FieldType.Double
1466
+ })
1467
+ ];
1468
+ return searchGridFields;
1469
+ }
1470
+ onE200LotLookupRequest(value) {
1471
+ let deposito = '';
1472
+ const displayFields = this.loteLookupDisplayFields;
1473
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1474
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1475
+ }
1476
+ else {
1477
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1478
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1479
+ }
1480
+ const filterQuery = {
1481
+ e070emp: {
1482
+ id: this.loteSerieParams.dadosProduto.e070emp
1483
+ },
1484
+ e205dep: {
1485
+ id: deposito
1486
+ },
1487
+ e075der: {
1488
+ id: this.loteSerieParams.dadosProduto.e075der
1489
+ },
1490
+ lotLike: true,
1491
+ lotSal: true,
1492
+ lotDis: true,
1493
+ offset: 0,
1494
+ size: 10,
1495
+ orderBy: [
1496
+ {
1497
+ field: 'e200lot.codLot',
1498
+ order: 'ASC'
1499
+ }
1500
+ ]
1501
+ };
1502
+ if (value) {
1503
+ filterQuery.e200lot = [
1504
+ {
1505
+ codLot: value
1506
+ }
1507
+ ];
1508
+ }
1509
+ this.batchSeriesService
1510
+ .listBatch(filterQuery)
1511
+ .pipe(takeUntil(this.ngUnsubscribe))
1512
+ .pipe(map((list) => (Object.assign(Object.assign({}, list), { lotes: list.lotes.map((item) => (Object.assign(Object.assign({}, item), { label: displayFields.map((field) => {
1513
+ if (field.indexOf('.') > 0)
1514
+ return this.getProp(item, field);
1515
+ return item[field];
1516
+ }) }))) }))))
1517
+ .subscribe((list) => {
1518
+ this.e200lotLookupSuggestionsObservable.next(list.lotes);
1519
+ });
1520
+ }
1521
+ onE200SerLookupRequest(value) {
1522
+ let deposito = '';
1523
+ const displayFields = this.serieLookupDisplayFields;
1524
+ if (this.loteSerieParams.dadosProduto.e205dep) {
1525
+ deposito = this.loteSerieParams.dadosProduto.e205dep;
1526
+ }
1527
+ else {
1528
+ if (this.formGroupBatchOrSeries.controls.deposito.value)
1529
+ deposito = this.formGroupBatchOrSeries.controls.deposito.value.e205dep.id;
1530
+ }
1531
+ const filterQuery = {
1532
+ e070emp: {
1533
+ id: this.loteSerieParams.dadosProduto.e070emp
1534
+ },
1535
+ e205dep: {
1536
+ id: deposito
1537
+ },
1538
+ e075der: {
1539
+ id: this.loteSerieParams.dadosProduto.e075der
1540
+ },
1541
+ serLike: true,
1542
+ serSal: true,
1543
+ serDis: true,
1544
+ offset: 0,
1545
+ size: 10,
1546
+ orderBy: [
1547
+ {
1548
+ field: 'e200ser.numSep',
1549
+ order: 'ASC'
1550
+ }
1551
+ ]
1552
+ };
1553
+ if (value) {
1554
+ filterQuery.e200ser = [
1555
+ {
1556
+ numSep: value
1557
+ }
1558
+ ];
1559
+ }
1560
+ this.batchSeriesService
1561
+ .listSeries(filterQuery)
1562
+ .pipe(takeUntil(this.ngUnsubscribe))
1563
+ .pipe(map((list) => (Object.assign(Object.assign({}, list), { series: list.series.map((item) => (Object.assign(Object.assign({}, item), { label: displayFields.map((field) => {
1564
+ if (field.indexOf('.') > 0)
1565
+ return this.getProp(item, field);
1566
+ return item[field];
1567
+ }) }))) }))))
1568
+ .subscribe((list) => {
1569
+ this.e200serLookupSuggestionsObservable.next(list.series);
1570
+ });
1571
+ }
1572
+ formatDates(requestBody, properties) {
1573
+ return Object.keys(requestBody).reduce((prev, value) => {
1574
+ if (properties.indexOf(value) > -1 && requestBody[value]) {
1575
+ prev[value] = moment(requestBody[value]).format('YYYY-MM-DD');
1576
+ }
1577
+ else {
1578
+ prev[value] = requestBody[value];
1579
+ }
1580
+ return prev;
1581
+ }, {});
1582
+ }
1583
+ formatDatesToCalendar(requestBody, properties) {
1584
+ return Object.keys(requestBody).reduce((prev, value) => {
1585
+ if (properties.indexOf(value) > -1 && requestBody[value]) {
1586
+ if (requestBody[value] != undefined && requestBody[value] != null) {
1587
+ prev[value] = moment(requestBody[value]).toDate();
1588
+ }
1589
+ else {
1590
+ prev[value] = '';
1591
+ }
1592
+ }
1593
+ else {
1594
+ prev[value] = requestBody[value];
1595
+ }
1596
+ return prev;
1597
+ }, {});
1598
+ }
1599
+ translateHtml(text, value = null, shortcut = null) {
1600
+ const ret = this.translate.instant(`${this.prefix}${text}`, { value: value });
1601
+ return shortcut ? `${ret} ${shortcut}` : ret;
1602
+ }
1603
+ onDistributeSeries() {
1604
+ var _a, _b;
1605
+ this.batchSeriesService
1606
+ .obterNecessidades({
1607
+ e070empId: this.loteSerieParams.invoiceInformation.company.id,
1608
+ e070filId: this.loteSerieParams.invoiceInformation.branch.id,
1609
+ itensId: [this.loteSerieParams.invoiceInformation.item.product.id],
1610
+ tipo: EnumTipoDocumentoParametros.PedidoVenda,
1611
+ documentoId: null,
1612
+ numeroDocumentoPai: [(_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.orderInformation) === null || _b === void 0 ? void 0 : _b.number.toString()],
1613
+ dataInicial: null,
1614
+ dataFinal: null,
1615
+ situacao: null,
1616
+ codigoDemanda: null,
1617
+ somenteUrgentes: false,
1618
+ pageRequest: {
1619
+ offset: 0,
1620
+ size: 10
1621
+ }
1622
+ })
1623
+ .pipe(first())
1624
+ .subscribe(({ necessidades }) => {
1625
+ var _a, _b;
1626
+ const itemId = (_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.orderInformation) === null || _b === void 0 ? void 0 : _b.item.id;
1627
+ const atendimento = necessidades.find((necessidade) => { var _a; return ((_a = necessidade.documento) === null || _a === void 0 ? void 0 : _a.idExterno) === itemId; });
1628
+ const getUrlInput = {
1629
+ identifiers: [
1630
+ {
1631
+ domainName: 'erpx_sup',
1632
+ serviceName: 'demandas',
1633
+ appName: 'erpx-sup-demandas',
1634
+ route: `demandas/atendimentos/${atendimento.id}?isSeriesDistributionVisible=true`
1635
+ }
1636
+ ]
1637
+ };
1638
+ this.batchSeriesService
1639
+ .getUrl(getUrlInput)
1640
+ .pipe(first())
1641
+ .subscribe((getUrlOutput) => {
1642
+ window.open(`${getUrlOutput.frontends[0].embeddedURL}`, '_blank');
1643
+ });
1644
+ });
1645
+ }
1646
+ onDelete() {
1647
+ this.selection.forEach((value) => this.removeBatchOrSeries(value));
1648
+ this.selection = [];
1649
+ }
1650
+ isDistributeSeriesButtonVisible() {
1651
+ var _a, _b, _c, _d, _e, _f;
1652
+ return (((_d = (_c = (_b = (_a = this.loteSerieParams) === null || _a === void 0 ? void 0 : _a.invoiceInformation) === null || _b === void 0 ? void 0 : _b.item) === null || _c === void 0 ? void 0 : _c.product) === null || _d === void 0 ? void 0 : _d.isSerialControlled) &&
1653
+ ((_f = (_e = this.loteSerieParams) === null || _e === void 0 ? void 0 : _e.invoiceInformation) === null || _f === void 0 ? void 0 : _f.origin) === EnumInvoiceOrigin.V2);
1654
+ }
1655
+ onBlurQuantity() {
1656
+ if (!this.isSaida)
1657
+ return;
1658
+ const quantity = Number(this.formGroupBatchOrSeries.controls.quantidade.value);
1659
+ const balance = Number(this.formGroupBatchOrSeries.controls.saldo.value);
1660
+ if (quantity > balance)
1661
+ this.messageService.add({
1662
+ severity: 'warn',
1663
+ summary: this.translate.instant(`${this.prefix}warn`),
1664
+ detail: this.translate.instant(`${this.prefix}invalid_batch_distribution_quantity`)
1665
+ });
1666
+ }
1667
+ getMenuOptionsPerRow(rowData) {
1668
+ return [
1669
+ {
1670
+ label: this.translate.instant(`${this.prefix}edit`),
1671
+ command: () => {
1672
+ this.table.editingRowKeys = { [rowData.codigo]: true };
1673
+ const formField = this.editingFormFields.find((field) => field.name === 'quantidade');
1674
+ formField.scale = this.loteSerieParams.dadosProduto.qtdDec;
1675
+ this.editingFormGroup.get('quantidade').setValue(rowData.quantidade);
1676
+ }
1677
+ },
1678
+ {
1679
+ label: this.translate.instant(`${this.prefix}deleted_message_title`),
1680
+ command: () => this.removeBatchOrSeries(rowData)
1681
+ }
1682
+ ];
1683
+ }
1684
+ onCancelEdit(rowData) {
1685
+ this.table.editingRowKeys = { [rowData.codigo]: false };
1686
+ }
1687
+ onSaveEdit(rowData) {
1688
+ this.validateAllFormFields(this.editingFormGroup);
1689
+ if (this.editingFormGroup.invalid)
1690
+ return;
1691
+ const quantity = Number(this.editingFormGroup.get('quantidade').value);
1692
+ if (quantity === 0) {
1693
+ this.messageService.add({
1694
+ severity: 'error',
1695
+ summary: this.translate.instant(`${this.prefix}distribution_error`),
1696
+ detail: this.translate.instant(`${this.prefix}invalid_qtd`)
1697
+ });
1698
+ return;
1699
+ }
1700
+ const distributedQuantity = this.qtdDistribuida - Number(rowData.quantidade) + quantity;
1701
+ if (distributedQuantity > this.qtdAdistribuir) {
1702
+ this.messageService.add({
1703
+ severity: 'error',
1704
+ summary: this.translate.instant(`${this.prefix}distribution_error`),
1705
+ detail: this.translate.instant(`${this.prefix}invalid_qty_msg`),
1706
+ sticky: true
1707
+ });
1708
+ return;
1709
+ }
1710
+ this.qtdDistribuida = distributedQuantity;
1711
+ this.qtdRestante = this.qtdAdistribuir - this.qtdDistribuida;
1712
+ this.table.editingRowKeys = Object.assign(Object.assign({}, this.table.editingRowKeys), { [rowData.codigo]: false });
1713
+ rowData.quantidade = quantity;
1714
+ }
1715
+ };
1716
+ ErpLoteSerieComponent.ctorParameters = () => [
1717
+ { type: TranslateService },
1718
+ { type: ActivatedRoute },
1719
+ { type: E210DxpLookup },
1720
+ { type: FormBuilder },
1721
+ { type: MessageService },
1722
+ { type: ErpLoteSeriesService },
1723
+ { type: QuantidadeDisponivelDemandaService }
1724
+ ];
1725
+ __decorate([
1726
+ Input()
1727
+ ], ErpLoteSerieComponent.prototype, "loteSerieParams", void 0);
1728
+ __decorate([
1729
+ Input()
1730
+ ], ErpLoteSerieComponent.prototype, "blockedFields", void 0);
1731
+ __decorate([
1732
+ Input()
1733
+ ], ErpLoteSerieComponent.prototype, "showHeader", void 0);
1734
+ __decorate([
1735
+ Input()
1736
+ ], ErpLoteSerieComponent.prototype, "validateInvalidChars", void 0);
1737
+ __decorate([
1738
+ ViewChild(Table)
1739
+ ], ErpLoteSerieComponent.prototype, "table", void 0);
1740
+ ErpLoteSerieComponent = __decorate([
1741
+ Component({
1742
+ selector: 'erp-lote-serie',
1743
+ template: "<form [formGroup]=\"formGroupBatchOrSeries\" autocomplete=\"off\">\n <div class=\"sds-section-title\" *ngIf=\"showHeader\">{{ titleLoteOrSerie }}</div>\n <div>\n <s-dynamic-form\n [fields]=\"batchOrSeriesFields\"\n [form]=\"formGroupBatchOrSeries\"\n [errorMessages]=\"{\n required: translateHtml('error_required'),\n maxlength: translateHtml('error_max_length', maxLength),\n max: translateHtml('error_max_length'),\n minDataValidade: translateHtml('minDataValidade'),\n existsInvalidChar: translateHtml('exists_invalid_char')\n }\"\n >\n </s-dynamic-form>\n </div>\n\n <br />\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button id=\"add-button\" type=\"submit\" [disabled]=\"blockedFields\" [label]=\"translateHtml('add')\" (click)=\"addBatchOrSeries()\">\n </s-button>\n <s-button *ngIf=\"isDistributeSeriesButtonVisible()\" [label]=\"translateHtml('distribute_series')\" (click)=\"onDistributeSeries()\">\n </s-button>\n </div>\n </div>\n</form>\n\n<div class=\"sds-section-title\">Totais</div>\n\n<div class=\"ui-g custom-stats\">\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#0C9348\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_1_title')\"\n [value]=\"qtdAdistribuir | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#428BCA\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_2_title')\"\n [value]=\"qtdDistribuida | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n <div class=\"ui-sm-12 ui-md-4\">\n <s-stats-card\n [animateNumbers]=\"true\"\n color=\"#C13018\"\n [lightMode]=\"true\"\n [lightVersion]=\"true\"\n iconClass=\"far fa-dollar-sign\"\n [label]=\"translateHtml('totalizador_3_title')\"\n [value]=\"qtdRestante | localizedNumber: locale.number.scale | async\"\n >\n </s-stats-card>\n </div>\n</div>\n\n<div class=\"sds-section-title\">{{ titleGridLoteOrSerie }}</div>\n\n<s-empty-state\n id=\"my-empty-state\"\n *ngIf=\"!gridData.length\"\n iconClass=\"far fa-dollar-sign\"\n [title]=\"translateHtml('no_distributions_yet')\"\n [description]=\"translateHtml('no_distributions_description')\"\n>\n</s-empty-state>\n\n<div class=\"ui-g\">\n <div class=\"ui-g-12\">\n <div class=\"ui-g-6\" *ngIf=\"gridData.length\">\n <s-button\n [label]=\"translateHtml('deleted_message_title')\"\n [title]=\"translateHtml('deleted_message_title')\"\n (onClick)=\"onDelete()\"\n [priority]=\"ButtonPriority.Secondary\"\n [disabled]=\"blockedFields || !selection.length\"\n >\n </s-button>\n </div>\n </div>\n <div class=\"ui-g-12\">\n <p-table\n #tableLoteSerie\n *ngIf=\"gridData.length\"\n [value]=\"gridData\"\n [columns]=\"gridColumns\"\n dataKey=\"codigo\"\n [scrollable]=\"true\"\n [resizableColumns]=\"true\"\n [totalRecords]=\"gridData.length\"\n [rowsPerPageOptions]=\"[10, 20, 50, 100]\"\n [(selection)]=\"selection\"\n [paginator]=\"true\"\n [rows]=\"10\"\n editMode=\"row\"\n >\n <ng-template pTemplate=\"header\" let-columns>\n <tr>\n <th id=\"tableHeaderCheckbox\" style=\"width: 50px\">\n <p-tableHeaderCheckbox></p-tableHeaderCheckbox>\n </th>\n <th *ngFor=\"let col of columns\" style=\"width: 170px\" pResizableColumn>\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">{{ col.header }}</span>\n </div>\n </th>\n <th style=\"width: 170px\">\n <div class=\"senior-header\">\n <span class=\"senior-header-title\">\n {{ translateHtml('actions') }}\n </span>\n </div>\n </th>\n </tr>\n </ng-template>\n\n <ng-template pTemplate=\"body\" let-rowData let-columns let-editing=\"editing\">\n <tr [pEditableRow]=\"rowData\">\n <td style=\"width: 50px\">\n <p-tableCheckbox [value]=\"rowData\"></p-tableCheckbox>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.codigo }}</span>\n </td>\n <td *ngIf=\"!isSerie\" style=\"width: 170px\">\n <p-cellEditor>\n <ng-template pTemplate=\"input\">\n <s-dynamic-form\n [form]=\"editingFormGroup\"\n [fields]=\"editingFormFields\"\n [errorMessages]=\"{\n required: translateHtml('error_required')\n }\"\n ></s-dynamic-form>\n </ng-template>\n <ng-template pTemplate=\"output\">\n {{\n rowData.quantidade\n | numeric\n : {\n numberFormatOptions: {\n style: 'decimal',\n minimumFractionDigits: loteSerieParams.dadosProduto.qtdDec || 0\n }\n }\n | async\n }}\n </ng-template>\n </p-cellEditor>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.dataFabricacao | localizedDate: 'L' | async }}</span>\n </td>\n <td style=\"width: 170px\">\n <span>{{ rowData.dataValidade | localizedDate: 'L' | async }}</span>\n </td>\n <td style=\"width: 170px\">\n <div class=\"ui-fluid\">\n <div class=\"ui-g\">\n <s-button\n *ngIf=\"!editing\"\n [auxiliary]=\"true\"\n [priority]=\"ButtonPriority.Default\"\n [size]=\"ButtonSize.Small\"\n [disabled]=\"blockedFields\"\n [label]=\"translateHtml('actions')\"\n [menuOptions]=\"getMenuOptionsPerRow(rowData)\"\n >\n </s-button>\n <s-button\n *ngIf=\"editing\"\n iconClass=\"fa fa-check\"\n [auxiliary]=\"true\"\n [size]=\"ButtonSize.Small\"\n (onClick)=\"onSaveEdit(rowData)\"\n ></s-button>\n <s-button\n *ngIf=\"editing\"\n [priority]=\"ButtonPriority.Default\"\n iconClass=\"fa fa-times\"\n [auxiliary]=\"true\"\n [size]=\"ButtonSize.Small\"\n (onClick)=\"onCancelEdit(rowData)\"\n ></s-button>\n </div>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"paginatorright\">\n <s-table-paging\n [table]=\"tableLoteSerie\"\n [totalRecords]=\"gridData.length\"\n [exportFileName]=\"translateHtml('total_records', gridData.length)\"\n >\n </s-table-paging>\n </ng-template>\n </p-table>\n </div>\n</div>\n"
1744
+ })
1745
+ ], ErpLoteSerieComponent);
1746
+ export { ErpLoteSerieComponent };
1747
+ /** Enum para tipo de movimento */
1748
+ export var EnumTipoMovimentacao;
1749
+ (function (EnumTipoMovimentacao) {
1750
+ /** Tipo movimentação igual a Entrada */
1751
+ EnumTipoMovimentacao["Entrada"] = "Entrada";
1752
+ /** Tipo movimentação igual a Saída */
1753
+ EnumTipoMovimentacao["Saida"] = "Saida";
1754
+ })(EnumTipoMovimentacao || (EnumTipoMovimentacao = {}));
1755
+ /** Enum para tipo de controle de produto */
1756
+ export var EnumTipoControleProduto;
1757
+ (function (EnumTipoControleProduto) {
1758
+ /** Tipo de controle igual a Lote */
1759
+ EnumTipoControleProduto["Lote"] = "Lote";
1760
+ /** Tipo de controle igual a Série */
1761
+ EnumTipoControleProduto["Serie"] = "Serie";
1762
+ })(EnumTipoControleProduto || (EnumTipoControleProduto = {}));
1763
+ export var EnumInvoiceOrigin;
1764
+ (function (EnumInvoiceOrigin) {
1765
+ EnumInvoiceOrigin["V1"] = "V1";
1766
+ EnumInvoiceOrigin["V2"] = "V2";
1767
+ EnumInvoiceOrigin["V3"] = "V3";
1768
+ EnumInvoiceOrigin["V4"] = "V4";
1769
+ EnumInvoiceOrigin["V5"] = "V5";
1770
+ EnumInvoiceOrigin["V99"] = "V99";
1771
+ })(EnumInvoiceOrigin || (EnumInvoiceOrigin = {}));
1772
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJwLWxvdGUtc2VyaWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvZXJweC1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9sb3RlLXNlcmllL2VycC1sb3RlLXNlcmllLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ25HLE9BQU8sRUFDSCxjQUFjLEVBQ2QsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixTQUFTLEVBQ1QsU0FBUyxFQUVaLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0seUZBQXlGLENBQUM7QUFDN0ksT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDOUYsT0FBTyxFQUFFLE9BQU8sRUFB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bnQsIElucHV0LCBPbkNoYW5nZXMsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBFMjEwRHhwTG9va3VwLCBFbnVtTG9naWNhbE9wZXJhdG9yIH0gZnJvbSAnQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvYW5ndWxhci1jb21wb25lbnRzJztcbmltcG9ydCB7XG4gICAgQnV0dG9uUHJpb3JpdHksXG4gICAgQnV0dG9uU2l6ZSxcbiAgICBFbnVtQ29sdW1uRmllbGRUeXBlLFxuICAgIEZpZWxkVHlwZSxcbiAgICBGb3JtRmllbGQsXG4gICAgVGllcmVkTWVudUl0ZW1EYXRhXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMnO1xuaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaXJzdCwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBRdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGEgfSBmcm9tICcuLi8uLi9jb3JlL2VudGl0aWVzL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhJztcbmltcG9ydCB7IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2VudGl0aWVzL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhL3F1YW50aWRhZGUtZGlzcG9uaXZlbC1kZW1hbmRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgRW51bVRpcG9Eb2N1bWVudG9QYXJhbWV0cm9zIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9lbnVtLXRpcG8tZG9jdW1lbnRvLXBhcmFtZXRyb3MnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNOb3RFbXB0eSB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IEVycExvdGVTZXJpZXNTZXJ2aWNlLCBHZXRVcmxJbnB1dCwgR2V0VXJsT3V0cHV0LCBMaXN0UGFyYW1zIH0gZnJvbSAnLi9lcnAtbG90ZS1zZXJpZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdlcnAtbG90ZS1zZXJpZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VycC1sb3RlLXNlcmllLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBFcnBMb3RlU2VyaWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBJbnB1dCgpIGxvdGVTZXJpZVBhcmFtczogTG90ZVNlcmllUGFyYW1zO1xuICAgIEBJbnB1dCgpIGJsb2NrZWRGaWVsZHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzaG93SGVhZGVyID0gdHJ1ZTtcbiAgICBASW5wdXQoKSB2YWxpZGF0ZUludmFsaWRDaGFycyA9IGZhbHNlO1xuXG4gICAgQFZpZXdDaGlsZChUYWJsZSlcbiAgICByZWFkb25seSB0YWJsZTogVGFibGU7XG5cbiAgICByZWFkb25seSBCdXR0b25Qcmlvcml0eSA9IEJ1dHRvblByaW9yaXR5O1xuICAgIHJlYWRvbmx5IEJ1dHRvblNpemUgPSBCdXR0b25TaXplO1xuXG4gICAgcHVibGljIHJlYWRvbmx5IEVudW1UaXBvTW92aW1lbnRhY2FvID0gRW51bVRpcG9Nb3ZpbWVudGFjYW87XG5cbiAgICBwdWJsaWMgZ3JpZERhdGE6IGFueSA9IFtdO1xuICAgIHB1YmxpYyBzZWxlY3Rpb246IGFueSA9IFtdO1xuICAgIHB1YmxpYyBncmlkQ29sdW1uczogYW55W107XG4gICAgcHVibGljIGxvY2FsZUNvbmZpZzogYW55ID0ge307XG4gICAgcHVibGljIGxvY2FsZTogYW55ID0ge307XG5cbiAgICBwcml2YXRlIGUyMDBsb3RMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBlMjAwbG90bG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIGUyMDBzZXJMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG4gICAgcHJpdmF0ZSBlMjAwc2VybG9va3VwU2VhcmNoT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBwcml2YXRlIHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYUxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSA9IG5ldyBTdWJqZWN0PFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYT4oKTtcbiAgICBwcml2YXRlIHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYWxvb2t1cFNlYXJjaE9ic2VydmFibGUgPSBuZXcgU3ViamVjdDxRdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGE+KCk7XG5cbiAgICBwdWJsaWMgZm9ybUdyb3VwQmF0Y2hPclNlcmllczogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBiYXRjaE9yU2VyaWVzRmllbGRzOiBhbnlbXTtcbiAgICBwdWJsaWMgbG90ZUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbJ2UyMDBsb3QuY29kTG90ZSddO1xuICAgIHB1YmxpYyBzZXJpZUxvb2t1cERpc3BsYXlGaWVsZHMgPSBbJ2UyMDBzZXIubnVtU2VwJ107XG5cbiAgICBwdWJsaWMgdGl0bGVMb3RlT3JTZXJpZTogc3RyaW5nO1xuICAgIHB1YmxpYyB0aXRsZUdyaWRMb3RlT3JTZXJpZTogc3RyaW5nO1xuICAgIHB1YmxpYyBpc1NlcmllID0gZmFsc2U7XG4gICAgcHVibGljIHF0ZEFkaXN0cmlidWlyID0gMDtcbiAgICBwdWJsaWMgcXRkRGlzdHJpYnVpZGEgPSAwO1xuICAgIHB1YmxpYyBxdGRSZXN0YW50ZSA9IDA7XG4gICAgcHVibGljIG1heExlbmd0aCA9IDUwO1xuICAgIHB1YmxpYyBvYnJpZ2FWYWxpZGFkZSA9IGZhbHNlO1xuICAgIHB1YmxpYyBpc1NhaWRhID0gZmFsc2U7XG4gICAgcHVibGljIGRpc2FibGVEYXRhVmFsaWRhZGUgPSBmYWxzZTtcbiAgICBwdWJsaWMgcHJlZml4ID0gJ2VycHgubG90ZV9zZXJpZS4nO1xuXG4gICAgZWRpdGluZ0Zvcm1Hcm91cCA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBxdWFudGlkYWRlOiBbeyB2YWx1ZTogbnVsbCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXVxuICAgIH0pO1xuXG4gICAgZWRpdGluZ0Zvcm1GaWVsZHM6IEZvcm1GaWVsZFtdID0gW1xuICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgIG5hbWU6ICdxdWFudGlkYWRlJyxcbiAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogMTIsIGxnOiAxMiwgeGw6IDEyIH0sXG4gICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiAxNVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGUyMTBEeHBMb29rdXA6IEUyMTBEeHBMb29rdXAsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBiYXRjaFNlcmllc1NlcnZpY2U6IEVycExvdGVTZXJpZXNTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2U6IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlcnZpY2VcbiAgICApIHt9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRlLmRhdGEucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHRoaXMub25Sb3V0ZURhdGFDaGFuZ2UoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzID0gdGhpcy5nZXRGb3JtR3JvdXBEYWRvcygpO1xuICAgICAgICAgICAgdGhpcy52YWxpZGFEYWRvcygpO1xuICAgICAgICAgICAgdGhpcy5ncmlkQ29sdW1ucyA9IHRoaXMuZ2V0R3JpZENvbHVtbnMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmJsb2NrZWRGaWVsZHMgPT0gdHJ1ZSkgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmRpc2FibGUoKTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMgJiYgL1xcdHxcXHJ8XFxuL2cuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuc2V0RXJyb3JzKHsgZXhpc3RzSW52YWxpZENoYXI6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMgJiYgL1xcdHxcXHJ8XFxuL2cuZXhlYyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnNldEVycm9ycyh7IGV4aXN0c0ludmFsaWRDaGFyOiB0cnVlIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYURhZG9zKCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NGYW1pbHlTdXBwbHlJbmZvKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDEyZmFtKTtcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMudGlwb0NvbnRyb2xlUHJvZHV0byA9PSAnU2VyaWUnKSB7XG4gICAgICAgICAgICB0aGlzLnRpdGxlTG90ZU9yU2VyaWUgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlcmllX3RpdGxlYCk7XG4gICAgICAgICAgICB0aGlzLnRpdGxlR3JpZExvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zZXJpZV90aXRsZV9ncmlkYCk7XG4gICAgICAgICAgICB0aGlzLmlzU2VyaWUgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50aXRsZUxvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb3RlX3RpdGxlYCk7XG4gICAgICAgICAgICB0aGlzLnRpdGxlR3JpZExvdGVPclNlcmllID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb3RlX3RpdGxlX2dyaWRgKTtcbiAgICAgICAgICAgIHRoaXMuaXNTZXJpZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLnRpcG9Nb3ZpbWVudGFjYW8gPT0gJ0VudHJhZGEnKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoT3JTZXJpZXNGaWVsZHMgPSB0aGlzLmdldEZpZWxkc0VudHJhZGEoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNTApXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS5jbGVhclZhbGlkYXRvcnMoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnF1YW50aWRhZGUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnF1YW50aWRhZGUudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJhdGNoU2VyaWVCdWxrLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5iYXRjaFNlcmllQnVsay51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc1NhaWRhID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYmF0Y2hPclNlcmllc0ZpZWxkcyA9IHRoaXMuZ2V0RmllbGRzU2FpZGEoKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5kaXNhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmRpc2FibGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuc2V0VmFsaWRhdG9ycyhbXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhID0gMDtcbiAgICAgICAgdGhpcy5xdGRBZGlzdHJpYnVpciA9IHRoaXMubG90ZVNlcmllUGFyYW1zLnF1YW50aWRhZGVEaXN0cmlidWlyO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMubG90ZXNPclNlcmllcztcbiAgICAgICAgICAgIHRoaXMucXRkRGlzdHJpYnVpZGEgPSB0aGlzLmdldFF1YW50aWRhZGVEaXN0cmlidWlkYSgpO1xuICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXIgLSB0aGlzLnF0ZERpc3RyaWJ1aWRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm1Hcm91cERhZG9zKCkge1xuICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcbiAgICAgICAgICAgIGRlcG9zaXRvOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBsb3RlOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBkYXRhVmFsaWRhZGU6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGRhdGFGYWJyaWNhY2FvOiBbeyB2YWx1ZTogdW5kZWZpbmVkLCBkaXNhYmxlZDogZmFsc2UgfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtdKV0sXG4gICAgICAgICAgICBzZXJpZTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgc2FsZG86IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiB0cnVlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgcXVhbnRpZGFkZTogW3sgdmFsdWU6IHVuZGVmaW5lZCwgZGlzYWJsZWQ6IGZhbHNlIH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXSldLFxuICAgICAgICAgICAgYmF0Y2hTZXJpZUJ1bGs6IFt7IHZhbHVlOiB1bmRlZmluZWQsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXSxcbiAgICAgICAgICAgIGJ1bGtWaXNpYmxlOiBbeyB2YWx1ZTogZmFsc2UsIGRpc2FibGVkOiBmYWxzZSB9LCBWYWxpZGF0b3JzLmNvbXBvc2UoW10pXVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZm9ybUdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQcm9wKG9iajogYW55LCBwYXRoOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHBhdGguc3BsaXQoJy4nKS5yZWR1Y2UoKHJlc3VsdDogYW55LCBwcm9wOiBhbnkpID0+IChyZXN1bHRbcHJvcF0gPT09IHVuZGVmaW5lZCA/ICcnIDogcmVzdWx0W3Byb3BdKSwgb2JqKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZpZWxkc0VudHJhZGEoKSB7XG4gICAgICAgIGxldCBkYWRvc0ZpZWxkc0VudHJhZGE6IGFueVtdID0gW107XG5cbiAgICAgICAgaWYgKCF0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGFkb3NGaWVsZHNFbnRyYWRhID0gW1xuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmUyMTBEeHBMb29rdXAubW91bnRPcHRpb25zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbjogJ2VycHhfc3VwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U6ICdlc3RvcXVlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cDogJ2RlcG9zaXRvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuY29kRGVwJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2UyMDVkZXAuZGVzRGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5hYnJEZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5lMDcwZmlsLmNvZEZpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoR3JpZEZpZWxkczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuY29kRGVwJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2UyMDVkZXAuZGVzRGVwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5hYnJEZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5lMDcwZmlsLmNvZEZpbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwubm9tRmlsJywgdHlwZTogRmllbGRUeXBlLlN0cmluZyB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RmlsdGVyOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2V4Y2x1aWRvJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydmYWxzZSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UwNzBlbXAuaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnc2l0RXN0Jywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydWQSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBmaWVsZDogJ2UyMDVkZXAuc2l0RGVwJywgb3BlcmF0b3I6IEVudW1Mb2dpY2FsT3BlcmF0b3IuRXEsIHZhbHVlczogWydWQSddIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UwNzVkZXIuaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBbdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgZGFkb3NGaWVsZHNFbnRyYWRhLnB1c2goXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnYnVsa1Zpc2libGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWJ1bGtfdmlzaWJsZWApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAxMiB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Cb29sZWFuLFxuICAgICAgICAgICAgICAgIHJlcHJlc2VudGVkQnk6ICdzd2l0Y2gnXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdiYXRjaFNlcmllQnVsaycsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YmF0Y2hfc2VyaWVfYnVsa2ApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiA2IH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlRleHQsXG4gICAgICAgICAgICAgICAgcm93czogNSxcbiAgICAgICAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB0aGlzLm9uQmx1clZhbGlkYUxvdGVvclNlcmllKGV2ZW50LnRhcmdldC52YWx1ZSksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlczogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzSW52YWxpZENoYXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhpc3RzX2ludmFsaWRfY2hhcmApXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuaXNTZXJpZSA/ICdzZXJpZScgOiAnbG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuaXNTZXJpZSA/IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2VyaWVgKSA6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG90ZWApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZyxcbiAgICAgICAgICAgICAgICBvbkJsdXI6IChldmVudDogYW55KSA9PiB0aGlzLm9uQmx1clZhbGlkYUxvdGVvclNlcmllKGV2ZW50LnRhcmdldC52YWx1ZSksXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlczogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgZXhpc3RzSW52YWxpZENoYXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhpc3RzX2ludmFsaWRfY2hhcmApXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfZmFicmljYWNhb2ApLFxuICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICB2aXNpYmxlOiAoKSA9PiAhdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhVmFsaWRhZGUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfdmFsaWRhZGVgKSxcbiAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlLFxuICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRoaXMub2JyaWdhVmFsaWRhZGUsXG4gICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnc2FsZG8nLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNhbGRvYCksXG4gICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgIHNjYWxlOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8ucXRkRGVjLFxuICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYnVsa1Zpc2libGUudmFsdWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgIGRhZG9zRmllbGRzRW50cmFkYS5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAncXVhbnRpZGFkZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXF1YW50aWRhZGVgKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5xdGREZWMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAoKSA9PiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvbkJsdXI6ICgpID0+IHRoaXMub25CbHVyUXVhbnRpdHkoKSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5idWxrVmlzaWJsZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyTG9jYWxlT3B0aW9uczogdGhpcy5sb2NhbGVDb25maWcubnVtYmVyXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGFkb3NGaWVsZHNFbnRyYWRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RmllbGRzU2FpZGEoKSB7XG4gICAgICAgIGxldCBkYWRvc0ZpZWxkc1NhaWRhOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGlmICghdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRhZG9zRmllbGRzU2FpZGEgPSBbXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZTIxMER4cExvb2t1cC5tb3VudE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluOiAnZXJweF9zdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZTogJ2VzdG9xdWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUdyb3VwOiAnZGVwb3NpdG8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5jb2REZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5kZXNEZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmFickRlcCcsIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwuY29kRmlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkludGVnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hHcmlkRmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiAnZTIwNWRlcC5jb2REZXAnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZTIwNWRlcC5kZXNEZXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG5hbWU6ICdlMjA1ZGVwLmFickRlcCcsIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdlMjA1ZGVwLmUwNzBmaWwuY29kRmlsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkludGVnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmFtZTogJ2UyMDVkZXAuZTA3MGZpbC5ub21GaWwnLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGaWx0ZXI6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZXhjbHVpZG8nLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ2ZhbHNlJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnZTA3MGVtcC5pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZmllbGQ6ICdzaXRFc3QnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZTIwNWRlcC5zaXREZXAnLCBvcGVyYXRvcjogRW51bUxvZ2ljYWxPcGVyYXRvci5FcSwgdmFsdWVzOiBbJ1ZBJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiAnZTA3NWRlci5pZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBFbnVtTG9naWNhbE9wZXJhdG9yLkVxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlcl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICBkYWRvc0ZpZWxkc1NhaWRhLnB1c2goXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZXJpZScsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyYCksXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Mb29rdXAsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX3NlYXJjaF90aXRsZWApLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hFbXB0eVRpdGxlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fW5vdGhpbmdfZm91bmRgKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZmlsdGVyYCksXG4gICAgICAgICAgICAgICAgICAgIGNsZWFyTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y2xlYXJgKSxcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsTGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y2FuY2VsYCksXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdExhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlbGVjdGApLFxuICAgICAgICAgICAgICAgICAgICBvblNlbGVjdDogKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gIT09IEVudW1JbnZvaWNlT3JpZ2luLlYyKSB0aGlzLnZhbGlkYUxvdGVvclNlcmllKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgb25TZWFyY2hSZXF1ZXN0OiAoZXZlbnQ6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub25RdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFSZXF1ZXN0KGV2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vbkUyMDBTZXJTZWFyY2hSZXF1ZXN0KGV2ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgb25Mb29rdXBSZXF1ZXN0OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMub25RdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFSZXF1ZXN0KHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5vbkUyMDBTZXJMb29rdXBSZXF1ZXN0KHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnNPYnNlcnZhYmxlOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3RlU2VyaWVQYXJhbXM/Lmludm9pY2VJbmZvcm1hdGlvbj8ub3JpZ2luID09PSBFbnVtSW52b2ljZU9yaWdpbi5WMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5xdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZTIwMHNlckxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoT2JzZXJ2YWJsZTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5lMjAwc2VybG9va3VwU2VhcmNoT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkOiAnbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZHM6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEZpZWxkcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldEUyMDBTZXJTZWFyY2hGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoR3JpZEZpZWxkczpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zPy5pbnZvaWNlSW5mb3JtYXRpb24/Lm9yaWdpbiA9PT0gRW51bUludm9pY2VPcmlnaW4uVjJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoR3JpZEZpZWxkcygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmdldEUyMDBTZXJTZWFyY2hHcmlkRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyLFxuICAgICAgICAgICAgICAgICAgICBkYXRhS2V5OiB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyID8gJ2lkJyA6ICdlMjAwc2VyLmlkJyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX2ZhYnJpY2FjYW9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmlzRGlzdHJpYnV0ZVNlcmllc0J1dHRvblZpc2libGUoKVxuICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRhVmFsaWRhZGUnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX3ZhbGlkYWRlYCksXG4gICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbzogJ2JvZHknLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdGhpcy5vYnJpZ2FWYWxpZGFkZSxcbiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogKCkgPT4gIXRoaXMuaXNEaXN0cmlidXRlU2VyaWVzQnV0dG9uVmlzaWJsZSgpXG4gICAgICAgICAgICAgICAgfSksXG5cbiAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3NhbGRvJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2FsZG9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZSxcbiAgICAgICAgICAgICAgICAgICAgc2NhbGU6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5xdGREZWMsXG4gICAgICAgICAgICAgICAgICAgIHZpc2libGU6ICgpID0+ICF0aGlzLmlzRGlzdHJpYnV0ZVNlcmllc0J1dHRvblZpc2libGUoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGFkb3NGaWVsZHNTYWlkYS5wdXNoKFxuICAgICAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbj8ub3JpZ2luID09PSBFbnVtSW52b2ljZU9yaWdpbi5WMlxuICAgICAgICAgICAgICAgICAgICA/IG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnbG90ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwbG90YCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Mb29rdXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0OiAoZXZlbnQpID0+IHRoaXMudmFsaWRhTG90ZW9yU2VyaWUoZXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlYXJjaFJlcXVlc3Q6IChldmVudCkgPT4gdGhpcy5vblF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVJlcXVlc3QoZXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBvbkxvb2t1cFJlcXVlc3Q6ICh2YWx1ZTogc3RyaW5nKSA9PiB0aGlzLm9uUXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhUmVxdWVzdCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zT2JzZXJ2YWJsZTogdGhpcy5xdWFudGlkYWRlRGlzcG9uaXZlbERlbWFuZGFMb29rdXBTdWdnZXN0aW9uc09ic2VydmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaE9ic2VydmFibGU6IHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwRGlzcGxheUZpZWxkOiAnbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hGaWVsZHM6IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEdyaWRGaWVsZHM6IHRoaXMuZ2V0UXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VhcmNoR3JpZEZpZWxkcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhS2V5OiAnaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogKCkgPT4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsb3RlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkxvb2t1cCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3Rfc2VhcmNoX3RpdGxlYCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEVtcHR5VGl0bGU6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bm90aGluZ19mb3VuZGApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1maWx0ZXJgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jbGVhcmApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxMYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jYW5jZWxgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9c2VsZWN0YCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0OiAoZXZlbnQ6IGFueSkgPT4gdGhpcy52YWxpZGFMb3Rlb3JTZXJpZShldmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHsgc206IDEyLCBtZDogNCwgbGc6IDQsIHhsOiAzIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VhcmNoUmVxdWVzdDogKGV2ZW50OiBhbnkpID0+IHRoaXMub25FMjAwTG90U2VhcmNoUmVxdWVzdChldmVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9va3VwUmVxdWVzdDogKHZhbHVlOiBzdHJpbmcpID0+IHRoaXMub25FMjAwTG90TG9va3VwUmVxdWVzdCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zT2JzZXJ2YWJsZTogdGhpcy5lMjAwbG90TG9va3VwU3VnZ2VzdGlvbnNPYnNlcnZhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hPYnNlcnZhYmxlOiB0aGlzLmUyMDBsb3Rsb29rdXBTZWFyY2hPYnNlcnZhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBEaXNwbGF5RmllbGQ6ICdsYWJlbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEZpZWxkczogdGhpcy5nZXRFMjAwTG90U2VhcmNoRmllbGRzKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEdyaWRGaWVsZHM6IHRoaXMuZ2V0RTIwMExvdFNlYXJjaEdyaWRGaWVsZHMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YUZhYnJpY2FjYW8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX2ZhYnJpY2FjYW9gKSxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogeyBzbTogMTIsIG1kOiA0LCBsZzogNCwgeGw6IDMgfSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvOiAnYm9keSdcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0YVZhbGlkYWRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGF0YV92YWxpZGFkZWApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG86ICdib2R5JyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRoaXMub2JyaWdhVmFsaWRhZGVcbiAgICAgICAgICAgICAgICB9KSxcblxuICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnc2FsZG8nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zYWxkb2ApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlY1xuICAgICAgICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdxdWFudGlkYWRlJyxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9cXVhbnRpZGFkZWApLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiB7IHNtOiAxMiwgbWQ6IDQsIGxnOiA0LCB4bDogMyB9LFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRG91YmxlLFxuICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYyxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6ICgpID0+IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9uQmx1cjogKCkgPT4gdGhpcy5vbkJsdXJRdWFudGl0eSgpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhZG9zRmllbGRzU2FpZGE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRHcmlkQ29sdW1ucygpIHtcbiAgICAgICAgbGV0IGdyaWRDb2x1bW5zOiBhbnk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgZ3JpZENvbHVtbnMgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3NlcmllJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fXNlcmllYCksXG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IFsnY29kaWdvJ10sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IEVudW1Db2x1bW5GaWVsZFR5cGUuU1RSSU5HXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZGF0YUZhYnJpY2FjYW8nLCBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGF0YV9mYWJyaWNhY2FvYCkgfSxcbiAgICAgICAgICAgICAgICB7IGZpZWxkOiAnZGF0YVZhbGlkYWRlJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfdmFsaWRhZGVgKSB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ3JpZENvbHVtbnMgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2xvdGUnLFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG90ZWApLFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiBbJ2NvZGlnbyddLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBFbnVtQ29sdW1uRmllbGRUeXBlLlNUUklOR1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ3F1YW50aWRhZGUnLCBoZWFkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9cXVhbnRpZGFkZWApIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ2RhdGFGYWJyaWNhY2FvJywgaGVhZGVyOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRhdGFfZmFicmljYWNhb2ApIH0sXG4gICAgICAgICAgICAgICAgeyBmaWVsZDogJ2RhdGFWYWxpZGFkZScsIGhlYWRlcjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kYXRhX3ZhbGlkYWRlYCkgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncmlkQ29sdW1ucztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RTIwMExvdFNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuY29kTG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RTIwMFNlclNlYXJjaEZpZWxkcygpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9udW1fc2VwYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoRmllbGRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25FMjAwTG90U2VhcmNoUmVxdWVzdChldmVudDogYW55KSB7XG4gICAgICAgIGxldCBmaWx0ZXJRdWVyeTogYW55O1xuICAgICAgICBsZXQgZGVwb3NpdG8gPSAnJztcbiAgICAgICAgY29uc3QgeyBmaXJzdCwgcm93cywgbXVsdGlTb3J0TWV0YSwgZmlsdGVyRGF0YSB9ID0gZXZlbnQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBmaXJzdCAvIHJvd3M7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlGaWVsZHMgPSBbJ2UyMDBsb3QuY29kTG90ZSddO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUpXG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVyQnk6IGFueSA9IG11bHRpU29ydE1ldGFcbiAgICAgICAgICAgID8gbXVsdGlTb3J0TWV0YS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkOiBzLmZpZWxkID09ICdlMjAwbG90LmNvZExvdGUnID8gJ2UyMDBsb3QuY29kTG90JyA6IHMuZmllbGQsXG4gICAgICAgICAgICAgICAgICBvcmRlcjogcy5vcmRlciA9PSAxID8gJ0FTQycgOiAnREVTQydcbiAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICA6IFt7IGZpZWxkOiAnZTIwMGxvdC5jb2RMb3QnLCBvcmRlcjogJ0FTQycgfV07XG5cbiAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICBlMDcwZW1wOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDcwZW1wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgIGlkOiBkZXBvc2l0b1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUwNzVkZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsb3RMaWtlOiB0cnVlLFxuICAgICAgICAgICAgbG90U2FsOiB0cnVlLFxuICAgICAgICAgICAgb2Zmc2V0OiBwYWdlLFxuICAgICAgICAgICAgbG90RGlzOiB0cnVlLFxuICAgICAgICAgICAgc2l6ZTogcm93c1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChmaWx0ZXJEYXRhWydlMjAwbG90LmNvZExvdGUnXSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMGxvdCA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvZExvdDogZmlsdGVyRGF0YVsnZTIwMGxvdC5jb2RMb3RlJ11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9yZGVyQnkpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5Lm9yZGVyQnkgPSBvcmRlckJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0QmF0Y2goZmlsdGVyUXVlcnkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5sb3Rlcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGlzcGxheUZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaW5kZXhPZignLicpID4gMCkgcmV0dXJuIHRoaXMuZ2V0UHJvcChpdGVtLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1bZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbFJlY29yZHM6IGxpc3QudG90YWxFbGVtZW50c1xuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lMjAwbG90bG9va3VwU2VhcmNoT2JzZXJ2YWJsZS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEZpZWxkcygpOiBGb3JtRmllbGRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ251bVNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfbnVtX3NlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NvZExvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYVNlYXJjaEdyaWRGaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ251bVNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfbnVtX3NlcGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdEZhYlNlcCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBzZXJfZGF0X2ZhYmApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdkYXRWbHRTZXAnLFxuICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF92bHRgKSxcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnY29kTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9jb2RfZGVwYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnZGF0RmFiTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfZmFiYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RhdFZsdExvdCcsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfZGF0X3ZsdGApLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5EYXRlXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIG5ldyBGb3JtRmllbGQoe1xuICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdxdGREaXNwb25pdmVsJyxcbiAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9xdGRfZGlzYCksXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhUmVxdWVzdChldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGxpc3RQYXJhbXM6IExpc3RQYXJhbXMgPSB7XG4gICAgICAgICAgICBmaWx0ZXJRdWVyeTogYGlkRXh0ZXJubyBlcSAnJHt0aGlzLmxvdGVTZXJpZVBhcmFtcy5vcmRlckluZm9ybWF0aW9uLml0ZW0uaWR9JyBhbmQgcXRkRGlzcG9uaXZlbCA+IDBgXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSBgIGFuZCBudW1TZXAgaXMgbm90IG51bGxgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyKSB7XG4gICAgICAgICAgICBsaXN0UGFyYW1zLmZpbHRlclF1ZXJ5ICs9IGAgYW5kIHRpcG9Eb2N1bWVudG8gZXEgJ1BlZGlkb1ZlbmRhJ2A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5wYWdlID0gMDtcbiAgICAgICAgICAgIGxpc3RQYXJhbXMuc2l6ZSA9IDEwO1xuICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSB0aGlzLmlzU2VyaWVcbiAgICAgICAgICAgICAgICA/IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIobnVtU2VwKSwgbG93ZXIoJyR7ZXZlbnQucmVwbGFjZSgvXFxcXC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWBcbiAgICAgICAgICAgICAgICA6IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIoY29kTG90KSwgbG93ZXIoJyR7ZXZlbnQucmVwbGFjZSgvXFxcXC9nLCAnJykucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGZpbHRlckRhdGEsIHJvd3MsIG11bHRpU29ydE1ldGEgfSA9IGV2ZW50O1xuXG4gICAgICAgICAgICBsaXN0UGFyYW1zLnBhZ2UgPSBldmVudC5maXJzdCAvIHJvd3M7XG4gICAgICAgICAgICBsaXN0UGFyYW1zLnNvcnQgPSBtdWx0aVNvcnRNZXRhID8gbXVsdGlTb3J0TWV0YSA6IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaWx0ZXJEYXRhLmNvZExvdCAhPT0gbnVsbCAmJiBmaWx0ZXJEYXRhLmNvZExvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGlzdFBhcmFtcy5maWx0ZXJRdWVyeSArPSBgIGFuZCBjb250YWluaW5nKGxvd2VyKGNvZExvdCksIGxvd2VyKCcke2ZpbHRlckRhdGEuY29kTG90XG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpfScpKWA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlckRhdGEubnVtU2VwICE9PSBudWxsICYmIGZpbHRlckRhdGEubnVtU2VwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsaXN0UGFyYW1zLmZpbHRlclF1ZXJ5ICs9IGAgYW5kIGNvbnRhaW5pbmcobG93ZXIobnVtU2VwKSwgbG93ZXIoJyR7ZmlsdGVyRGF0YS5udW1TZXBcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIil9JykpYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhU2VydmljZVxuICAgICAgICAgICAgLmxpc3QobGlzdFBhcmFtcylcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5jb250ZW50cy5tYXAoKGl0ZW06IFF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pc1NlcmllID8gaXRlbS5lMjAwc2VySWQgOiBpdGVtLmUyMDBsb3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmlzU2VyaWUgPyBgJHtpdGVtLm51bVNlcH1gIDogYCR7aXRlbS5jb2RMb3R9YFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsUmVjb3JkczogbGlzdC50b3RhbEVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1YW50aWRhZGVEaXNwb25pdmVsRGVtYW5kYUxvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZS5uZXh0KGRhdGEuZ3JpZERhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMucXVhbnRpZGFkZURpc3Bvbml2ZWxEZW1hbmRhbG9va3VwU2VhcmNoT2JzZXJ2YWJsZS5uZXh0KGRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkUyMDBTZXJTZWFyY2hSZXF1ZXN0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgbGV0IGZpbHRlclF1ZXJ5OiBhbnk7XG4gICAgICAgIGxldCBkZXBvc2l0byA9ICcnO1xuICAgICAgICBjb25zdCB7IGZpcnN0LCByb3dzLCBtdWx0aVNvcnRNZXRhLCBmaWx0ZXJEYXRhIH0gPSBldmVudDtcbiAgICAgICAgY29uc3QgcGFnZSA9IGZpcnN0IC8gcm93cztcbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IFsnZTIwMHNlci5udW1TZXAnXTtcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlKVxuICAgICAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcmRlckJ5OiBhbnkgPSBtdWx0aVNvcnRNZXRhXG4gICAgICAgICAgICA/IG11bHRpU29ydE1ldGEubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5zLFxuICAgICAgICAgICAgICAgICAgb3JkZXI6IHMub3JkZXIgPT0gMSA/ICdBU0MnIDogJ0RFU0MnXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiBbeyBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJywgb3JkZXI6ICdBU0MnIH1dO1xuXG4gICAgICAgIGZpbHRlclF1ZXJ5ID0ge1xuICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICBpZDogZGVwb3NpdG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VyTGlrZTogdHJ1ZSxcbiAgICAgICAgICAgIHNlclNhbDogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogcGFnZSxcbiAgICAgICAgICAgIHNlckRpczogdHJ1ZSxcbiAgICAgICAgICAgIHNpemU6IHJvd3NcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoZmlsdGVyRGF0YVsnZTIwMHNlci5udW1TZXAnXSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG51bVNlcDogZmlsdGVyRGF0YVsnZTIwMHNlci5udW1TZXAnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3JkZXJCeSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkub3JkZXJCeSA9IG9yZGVyQnk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhdGNoU2VyaWVzU2VydmljZVxuICAgICAgICAgICAgLmxpc3RTZXJpZXMoZmlsdGVyUXVlcnkpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcCgobGlzdDogYW55KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBncmlkRGF0YTogbGlzdC5zZXJpZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGRpc3BsYXlGaWVsZHMubWFwKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxSZWNvcmRzOiBsaXN0LnRvdGFsRWxlbWVudHNcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZTIwMHNlcmxvb2t1cFNlYXJjaE9ic2VydmFibGUubmV4dChkYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVCYXRjaE9yU2VyaWVzKHJvd0RhdGE6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhIC09IHRoaXMuaXNTZXJpZSA/IDEgOiBOdW1iZXIocm93RGF0YS5xdWFudGlkYWRlKTtcbiAgICAgICAgICAgIHRoaXMucXRkUmVzdGFudGUgKz0gdGhpcy5pc1NlcmllID8gMSA6IE51bWJlcihyb3dEYXRhLnF1YW50aWRhZGUpO1xuXG4gICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gdGhpcy5ncmlkRGF0YS5maWx0ZXIoKGJhdGNoT3JTZXJpZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXRjaE9yU2VyaWVzLmNvZGlnbyAhPSByb3dEYXRhLmNvZGlnbztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzID0gdGhpcy5ncmlkRGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3VtID0gKGEsIGIsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcG9zaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIChhLnRvRml4ZWQocG9zaXRpb25zKSAqIGZhY3RvciArIGIudG9GaXhlZChwb3NpdGlvbnMpICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICB9O1xuICAgIHByaXZhdGUgc3ViID0gKGEsIGIsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdygxMCwgcG9zaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIChhLnRvRml4ZWQocG9zaXRpb25zKSAqIGZhY3RvciAtIGIudG9GaXhlZChwb3NpdGlvbnMpICogZmFjdG9yKSAvIGZhY3RvcjtcbiAgICB9O1xuXG4gICAgcHVibGljIGFkZEJhdGNoT3JTZXJpZXMoKSB7XG4gICAgICAgIGxldCBjb2RpZ286IHN0cmluZztcbiAgICAgICAgbGV0IGlkID0gJyc7XG5cbiAgICAgICAgdGhpcy52YWxpZGF0ZUFsbEZvcm1GaWVsZHModGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzKTtcblxuICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmJ1bGtWaXNpYmxlLnZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgY29udmVydGVkQXJyYXkgPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuYmF0Y2hTZXJpZUJ1bGsudmFsdWUuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IDA7XG4gICAgICAgICAgICB0aGlzLnF0ZEFkaXN0cmlidWlyID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMucXVhbnRpZGFkZURpc3RyaWJ1aXI7XG4gICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gMDtcbiAgICAgICAgICAgIGxldCBsaW5oYUF0dWFsID0gMDtcbiAgICAgICAgICAgIGlmIChjb252ZXJ0ZWRBcnJheS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX2xheW91dGApO1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9sYXlvdXRgKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJ0ZWRBcnJheS5mb3JFYWNoKCh2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgbGluaGFBdHVhbCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZhbHVlLnNwbGl0KCc7Jyk7XG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmlzU2VyaWUgJiYgY3VycmVudFZhbHVlLmxlbmd0aCA+IDMpIHx8ICghdGhpcy5pc1NlcmllICYmIGN1cnJlbnRWYWx1ZS5sZW5ndGggPiA0KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9sYXlvdXRgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfbGF5b3V0YCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlOiBCdWxrSW1wb3J0ID0gdGhpcy5pc1NlcmllXG4gICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IHRoaXMudG9Db2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jb2RpZ29fbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGYWJyaWNhY2FvOiB0aGlzLnRvRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bWFudWZhY3R1cmluZ19kYXRlX2ludmFsaWRfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbGlkYWRlOiB0aGlzLnRvRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZVsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9dmFsaWRhdGVfZGF0ZV9pbnZhbGlkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IDFcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IHRoaXMudG9Db2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1jb2RpZ29fbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IHRoaXMudG9BbW91bnQoY3VycmVudFZhbHVlWzFdLCBsaW5oYUF0dWFsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IHRoaXMudG9EYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1tYW51ZmFjdHVyaW5nX2RhdGVfaW52YWxpZF9iYXRjaGAsIHsgbGluZTogbGluaGFBdHVhbCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IHRoaXMudG9EYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZhbHVlWzNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH12YWxpZGF0ZV9kYXRlX2ludmFsaWRfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAvLyB2YWxpZGEgc2UgYSBmYW1pbGlhIG9icmlnYSBhIGluZm9ybWFyIHZhbGlkYWRlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2JyaWdhVmFsaWRhZGUgJiYgIWNvbnZlcnRlZFZhbHVlLmRhdGFWYWxpZGFkZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXJyb3Jfc2VsZWN0ZWRfZGF0ZXNfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9leHBpcnlfZGF0ZWApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB2YWxpZGEgc2UgZXhpc3RlIGPDs2RpZ28gZHVwbGljYWRvXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZERhdGEuc29tZSgodmFsdWU6IEJ1bGtJbXBvcnQpID0+IHZhbHVlLmNvZGlnbyA9PT0gY29udmVydGVkVmFsdWUuY29kaWdvKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMuaXNTZXJpZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWR1cGxpY2F0ZWRfc2VyaWVzX21zZ19iYXRjaGAsIHsgbGluZTogbGluaGFBdHVhbCB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWR1cGxpY2F0ZWRfYmF0Y2hfbXNnX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YmF0Y2hfZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHZhbGlkYSBzZSBhIGRhdGEgZGUgZmFicmljYcOnw6NvIMOpIG1haW9yIHF1ZSBhIHZhbGlkYWRlXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZWRWYWx1ZS5kYXRhVmFsaWRhZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUuZGF0YUZhYnJpY2FjYW8gJiZcbiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkVmFsdWUuZGF0YVZhbGlkYWRlIDwgY29udmVydGVkVmFsdWUuZGF0YUZhYnJpY2FjYW9cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNnRXJyb3IgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWV4cGlyeV9sb3dlcl90aGFuX21hbnVmYWN0dXJpbmdfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9zZWxlY3RlZF9kYXRlc2ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtc2dFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWREYXRhID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhICs9IGNvbnZlcnRlZFZhbHVlLnF1YW50aWRhZGU7XG4gICAgICAgICAgICAgICAgLy8gdmFsaWRhIHNlIGEgcXVhbnRpZGFkZSBkaXN0cmlidWlkYSDDqSBtYWlvciBxdWUgYSBxdWFudGlkYWRlIGEgZGlzdHJpYnVpclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnF0ZERpc3RyaWJ1aWRhID4gdGhpcy5xdGRBZGlzdHJpYnVpcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9aW52YWxpZF9xdHlfbXNnX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaChjb252ZXJ0ZWRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMucXRkQWRpc3RyaWJ1aXIgLSB0aGlzLnF0ZERpc3RyaWJ1aWRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcy5sb3Rlc09yU2VyaWVzID0gdGhpcy5ncmlkRGF0YTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5iYXRjaFNlcmllQnVsay5yZXNldCgpO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5jbGVhcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLnZhbGlkICYmXG4gICAgICAgICAgICAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlIHx8IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5xdWFudGlkYWRlLnBhdGNoVmFsdWUoMSk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS52YWx1ZSA8IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby52YWx1ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9zZWxlY3RlZF9kYXRlc2ApLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXhwaXJ5X2xvd2VyX3RoYW5fbWFudWZhY3R1cmluZ2ApXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5vYnJpZ2FWYWxpZGFkZSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZXJyb3Jfc2VsZWN0ZWRfZGF0ZXNgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1lcnJvcl9leHBpcnlfZGF0ZWApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkaXN0cmlidXRlZFF1YW50aXR5ID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldCgncXVhbnRpZGFkZScpLnZhbHVlXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldCgncXVhbnRpZGFkZScpLnZhbHVlKVxuICAgICAgICAgICAgICAgIDogMDtcblxuICAgICAgICAgICAgaWYgKGRpc3RyaWJ1dGVkUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VtKHRoaXMucXRkRGlzdHJpYnVpZGEsIGRpc3RyaWJ1dGVkUXVhbnRpdHksIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZSkgPiB0aGlzLnF0ZEFkaXN0cmlidWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX3F0eV9tc2dgKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfcXRkYClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUuZTIwMHNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXIubnVtU2VwO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUuZTIwMHNlci5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnbyA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5udW1TZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGlnbyA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUudmFsdWUudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5lMjAwbG90KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5lMjAwbG90LmNvZExvdGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmUyMDBsb3QuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ28gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS5jb2RMb3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUucGF0Y2hWYWx1ZSh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS52YWx1ZS50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRHVwbGljYXRlQmF0Y2hTZXJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1iYXRjaF9kaXN0cmlidXRpb25fZXJyb3JgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1kdXBsaWNhdGVkX2JhdGNoX21zZ2ApXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1zZXJpZXNfZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZHVwbGljYXRlZF9zZXJpZXNfbXNnYClcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGxvdGVPclNlcmllVmFsdWVzID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmdldFJhd1ZhbHVlKCk7XG5cbiAgICAgICAgICAgIGxvdGVPclNlcmllVmFsdWVzID0gdGhpcy5mb3JtYXREYXRlcyhsb3RlT3JTZXJpZVZhbHVlcywgWydkYXRhRmFicmljYWNhbycsICdkYXRhVmFsaWRhZGUnXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyICYmIGxvdGVPclNlcmllVmFsdWVzLnNlcmllKSB7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHZhbHVlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGlnbzogdmFsdWUubnVtU2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IHZhbHVlLnF0ZERpc3Bvbml2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IHZhbHVlLmRhdEZhYlNlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IHZhbHVlLmRhdFZsdFNlcFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF0ZERpc3RyaWJ1aWRhID0gdGhpcy5zdW0odGhpcy5xdGREaXN0cmlidWlkYSwgTnVtYmVyKHZhbHVlLnF0ZERpc3Bvbml2ZWwpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGRSZXN0YW50ZSA9IHRoaXMuc3ViKHRoaXMucXRkUmVzdGFudGUsIE51bWJlcih2YWx1ZS5xdGREaXNwb25pdmVsKSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RpZ286IGxvdGVPclNlcmllVmFsdWVzLnNlcmllLm51bVNlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWRhZGU6IGxvdGVPclNlcmllVmFsdWVzLnNlcmllLnF0ZERpc3Bvbml2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmFicmljYWNhbzogbG90ZU9yU2VyaWVWYWx1ZXMuc2VyaWUuZGF0RmFiU2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVZhbGlkYWRlOiBsb3RlT3JTZXJpZVZhbHVlcy5zZXJpZS5kYXRWbHRTZXBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IHRoaXMuc3VtKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlcihsb3RlT3JTZXJpZVZhbHVlcy5zZXJpZS5xdGREaXNwb25pdmVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5zdWIodGhpcy5xdGRSZXN0YW50ZSwgTnVtYmVyKGxvdGVPclNlcmllVmFsdWVzLnNlcmllLnF0ZERpc3Bvbml2ZWwpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkRGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBjb2RpZ286IGNvZGlnbyxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpZGFkZTogbG90ZU9yU2VyaWVWYWx1ZXMucXVhbnRpZGFkZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YUZhYnJpY2FjYW86IGxvdGVPclNlcmllVmFsdWVzLmRhdGFGYWJyaWNhY2FvLFxuICAgICAgICAgICAgICAgICAgICBkYXRhVmFsaWRhZGU6IGxvdGVPclNlcmllVmFsdWVzLmRhdGFWYWxpZGFkZVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5xdGREaXN0cmlidWlkYSA9IHRoaXMuc3VtKHRoaXMucXRkRGlzdHJpYnVpZGEsIE51bWJlcihsb3RlT3JTZXJpZVZhbHVlcy5xdWFudGlkYWRlKSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5zdWIodGhpcy5xdGRSZXN0YW50ZSwgTnVtYmVyKGxvdGVPclNlcmllVmFsdWVzLnF1YW50aWRhZGUpLCB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmNsZWFyQmF0Y2hTZXJpZXMoKTtcbiAgICAgICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmxvdGVzT3JTZXJpZXMgPSB0aGlzLmdyaWREYXRhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQ29kZShjdXJyZW50VmFsdWU6IHN0cmluZywgbXNnRXJyb3I6IHN0cmluZykge1xuICAgICAgICBjdXJyZW50VmFsdWUgPSBTdHJpbmcoY3VycmVudFZhbHVlKS50cmltKCkudG9VcHBlckNhc2UoKTtcbiAgICAgICAgaWYgKGlzRW1wdHkoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Y29kaWdvX25vdF9pbmZvcm1lZGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQW1vdW50KGN1cnJlbnRWYWx1ZTogc3RyaW5nLCBsaW5oYUF0dWFsOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgY29udmVydGVkVmFsdWUgPSB0aGlzLnRvTnVtYmVyKGN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIGlmICghY3VycmVudFZhbHVlIHx8ICghY29udmVydGVkVmFsdWUgJiYgY29udmVydGVkVmFsdWUgIT0gMCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfbm90X2luZm9ybWVkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X25vdF9pbmZvcm1lZGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFN0cmluZyhjdXJyZW50VmFsdWUpLmluZGV4T2YodGhpcy5sb2NhbGUubnVtYmVyLnRob3VzYW5kc1NlcGFyYXRvcikgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBtc2dFcnJvciA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9Zm9ybWF0X251bWJlcl9pbnZhbGlkX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X2ludmFsaWRfYmF0Y2hgKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbnZlcnRlZFZhbHVlIDw9IDApIHtcbiAgICAgICAgICAgIGNvbnN0IG1zZ0Vycm9yID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfcXVhbnRpdHlfdGhhdF96ZXJvX2JhdGNoYCwgeyBsaW5lOiBsaW5oYUF0dWFsIH0pO1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9YW1vdW50X2ludmFsaWRfYmF0Y2hgKSxcbiAgICAgICAgICAgICAgICBkZXRhaWw6IG1zZ0Vycm9yLFxuICAgICAgICAgICAgICAgIGxpZmU6IDIwMDAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZERhdGEgPSBbXTtcbiAgICAgICAgICAgIHRocm93IG1zZ0Vycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRlbURlY2ltYWwgPSBTdHJpbmcoY29udmVydGVkVmFsdWUpLnNwbGl0KCcuJyk7XG5cbiAgICAgICAgaWYgKHRlbURlY2ltYWwubGVuZ3RoID4gMSAmJiB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUgIT0gU3RyaW5nKGNvbnZlcnRlZFZhbHVlKS5zcGxpdCgnLicpWzFdLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgbXNnRXJyb3IgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfZGVjaW1hbHNfYmF0Y2hgLCB7IGxpbmU6IGxpbmhhQXR1YWwgfSk7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1hbW91bnRfaW52YWxpZF9iYXRjaGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZFZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9OdW1iZXIoY3VycmVudFZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGlzTm90RW1wdHkoY3VycmVudFZhbHVlKVxuICAgICAgICAgICAgPyBOdW1iZXIoY3VycmVudFZhbHVlLnJlcGxhY2UodGhpcy5sb2NhbGUubnVtYmVyLnRob3VzYW5kc1NlcGFyYXRvciwgJycpLnJlcGxhY2UodGhpcy5sb2NhbGUubnVtYmVyLmRlY2ltYWxTZXBhcmF0b3IsICcuJykpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvRGF0ZShjdXJyZW50VmFsdWU6IHN0cmluZywgbXNnRXJyb3I6IHN0cmluZykge1xuICAgICAgICBpZiAoaXNOb3RFbXB0eShjdXJyZW50VmFsdWUpICYmICFtb21lbnQoY3VycmVudFZhbHVlLnRyaW0oKSwgJ0wnLCB0cnVlKS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfZGF0ZV9iYXRjaGApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogbXNnRXJyb3IsXG4gICAgICAgICAgICAgICAgbGlmZTogMjAwMDBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ncmlkRGF0YSA9IFtdO1xuICAgICAgICAgICAgdGhyb3cgbXNnRXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzTm90RW1wdHkoY3VycmVudFZhbHVlKSA/IG1vbWVudChjdXJyZW50VmFsdWUudHJpbSgpLCAnTCcsIHRydWUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNEdXBsaWNhdGVCYXRjaFNlcmllcygpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGNvZGlnbzogc3RyaW5nO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUuZTIwMGxvdFxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmUyMDBsb3QuY29kTG90ZVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5sb3RlLnZhbHVlLmNvZExvdDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmxvdGUudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhLmZpbmQoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNvZGlnbyA9PT0gY29kaWdvKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTYWlkYSAmJiBBcnJheS5pc0FycmF5KHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcz8uY29udHJvbHM/LnNlcmllPy52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNlcmllcyBvZiB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXM/LmNvbnRyb2xzPy5zZXJpZT8udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhZGRlZFNlcmllcyBvZiB0aGlzLmdyaWREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VyaWVzLm51bVNlcCA9PT0gYWRkZWRTZXJpZXMuY29kaWdvKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWREYXRhLmZpbmQoKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2FpZGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLmUyMDBzZXIubnVtU2VwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zZXJpZS52YWx1ZS5udW1TZXA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29kaWdvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNlcmllLnZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY29kaWdvID09PSBjb2RpZ28pIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyQmF0Y2hTZXJpZXMoKSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5yZXNldCgpO1xuICAgICAgICBpZiAodGhpcy5pc1NhaWRhKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZGlzYWJsZSgpO1xuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5kaXNhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlKSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZW5hYmxlKCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZURhdGFWYWxpZGFkZSAmJiB0aGlzLmJsb2NrZWRGaWVsZHMgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmVuYWJsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2YWxpZGFMb3Rlb3JTZXJpZShldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5kaXNhYmxlKCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZGlzYWJsZSgpO1xuXG4gICAgICAgIGlmICghdGhpcy5pc1NlcmllKSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFzKGV2ZW50LmNvZExvdCA/IGV2ZW50LmNvZExvdCA6IGV2ZW50LmUyMDBsb3QuY29kTG90ZSk7XG4gICAgICAgICAgICB0aGlzLmNvbnN1bHRhU2FsZG9Fc3RvcXVlKGV2ZW50LmNvZExvdCA/IGV2ZW50LmNvZExvdCA6IGV2ZW50LmUyMDBsb3QuY29kTG90ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldERhdGFzKGV2ZW50Lm51bVNlcCA/IGV2ZW50Lm51bVNlcCA6IGV2ZW50LmUyMDBzZXIubnVtU2VwKTtcbiAgICAgICAgICAgIHRoaXMuY29uc3VsdGFTYWxkb0VzdG9xdWUoZXZlbnQubnVtU2VwID8gZXZlbnQubnVtU2VwIDogZXZlbnQuZTIwMHNlci5udW1TZXApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJsdXJWYWxpZGFMb3Rlb3JTZXJpZSh2YWx1ZTogYW55KSB7XG4gICAgICAgIC8vIFF1YW5kbyByZWFsaXphIG8gdGFiLCBhYnJlIG8gY2FsZW5kYXIsIHBvciBpc3NvIMOpIG5lY2Vzc8OhcmlvIGRlc2FiaWxpdGFyIGFudGVzXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVJbnZhbGlkQ2hhcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy50aXBvQ29udHJvbGVQcm9kdXRvID09IEVudW1UaXBvQ29udHJvbGVQcm9kdXRvLlNlcmllKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuc2VyaWUucGF0Y2hWYWx1ZShuZXdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMubG90ZS5wYXRjaFZhbHVlKG5ld1ZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YXModmFsdWUudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICB0aGlzLmNvbnN1bHRhU2FsZG9Fc3RvcXVlKHZhbHVlLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREYXRhcyh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5yZXNldCgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnJlc2V0KCk7XG4gICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5zYWxkby5yZXNldCgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YUZhYnJpY2FjYW8uZGlzYWJsZSgpO1xuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLmRpc2FibGUoKTtcblxuICAgICAgICBsZXQgZmlsdGVyUXVlcnk6IGFueTtcbiAgICAgICAgbGV0IGRlcG9zaXRvID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZXJpZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwKSB7XG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlcG9zaXRvXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlclxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VyTGlrZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2VyU2FsOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNlckRpczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2VwOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAubGlzdFNlcmllcyhmaWx0ZXJRdWVyeSlcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zZXJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmZvcm1hdERhdGVzVG9DYWxlbmRhcihyZXNwb25zZS5zZXJpZXNbMF0sIFsnZGF0RmFiJywgJ2RhdFZsdCddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzLmUyMDBzZXIuZGF0RmFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBzZXIuZGF0RmFiKS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXMuZTIwMHNlci5kYXRWbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBzZXIuZGF0Vmx0KS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTYWlkYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEYXRhVmFsaWRhZGUgJiYgdGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwKSB7XG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlsdGVyUXVlcnkgPSB7XG4gICAgICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzBlbXBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlcG9zaXRvXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlclxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbG90TGlrZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG90U2FsOiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvdERpczogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBsb3QuY29kTG90JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMGxvdCA9IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kTG90OiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAubGlzdEJhdGNoKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxvdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVzID0gdGhpcy5mb3JtYXREYXRlc1RvQ2FsZW5kYXIocmVzcG9uc2UubG90ZXNbMF0sIFsnZGF0RmFiJywgJ2RhdFZsdCddKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGVzLmUyMDBsb3QuZGF0RmFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFGYWJyaWNhY2FvLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBsb3QuZGF0RmFiKS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXMuZTIwMGxvdC5kYXRWbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnBhdGNoVmFsdWUobW9tZW50KGRhdGVzLmUyMDBsb3QuZGF0Vmx0KS50b0RhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNTYWlkYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhRmFicmljYWNhby5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVEYXRhVmFsaWRhZGUgJiYgdGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzRmFtaWx5U3VwcGx5SW5mbyhmYW1pbHlJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hTZXJpZXNTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0UHJvZHVjdEZhbWlseVN1cHBseUluZm8oZmFtaWx5SUQpXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdXBwbHlJbmZvID0gcmVzcG9uc2UuY29udGVudHNbMF07XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9icmlnYVZhbGlkYWRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5zZXRWYWxpZGF0b3JzKFtdKTtcblxuICAgICAgICAgICAgICAgIHN3aXRjaCAoc3VwcGx5SW5mbz8uY3RyVmxkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZPJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuY2xlYXJWYWxpZGF0b3JzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmJsb2NrZWRGaWVsZHMgPT0gZmFsc2UgJiYgIXRoaXMuaXNTYWlkYSkgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRhdGFWYWxpZGFkZS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2JyaWdhVmFsaWRhZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZEJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZGlzYWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlRGF0YVZhbGlkYWRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdWTCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ibG9ja2VkRmllbGRzID09IGZhbHNlICYmICF0aGlzLmlzU2FpZGEpIHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kYXRhVmFsaWRhZGUuZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGF0YVZhbGlkYWRlLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdWx0YVNhbGRvRXN0b3F1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBiYWxhbmNlUGF5bG9hZCA9IHt9O1xuXG4gICAgICAgIGlmICh0aGlzLmlzU2VyaWUpIHtcbiAgICAgICAgICAgIGJhbGFuY2VQYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMjA1ZGVwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZm9ybUdyb3VwQmF0Y2hPclNlcmllcy5jb250cm9scy5kZXBvc2l0by52YWx1ZS5lMjA1ZGVwLmlkXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlMDc1ZGVyOiB7IGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3NWRlciB9LFxuICAgICAgICAgICAgICAgIGUyMDBzZXI6IHsgbnVtU2VwOiB2YWx1ZSB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYmFsYW5jZVBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUwNzVkZXI6IHsgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyIH0sXG4gICAgICAgICAgICAgICAgZTIwMGxvdDogeyBjb2RMb3Q6IHZhbHVlIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJhdGNoU2VyaWVzU2VydmljZVxuICAgICAgICAgICAgLmNvbnN1bHRhclNhbGRvRXN0b3F1ZShiYWxhbmNlUGF5bG9hZClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2Uuc2FsZG8pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnBhdGNoVmFsdWUoMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnBhdGNoVmFsdWUocmVzcG9uc2Uuc2FsZG8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRRdWFudGlkYWRlRGlzdHJpYnVpZGEoKSB7XG4gICAgICAgIGxldCBxdGQgPSAwO1xuXG4gICAgICAgIHRoaXMubG90ZVNlcmllUGFyYW1zLmxvdGVzT3JTZXJpZXMuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1NlcmllKSBxdGQgPSB0aGlzLnN1bShxdGQsIE51bWJlcih2YWwucXVhbnRpZGFkZSksIHRoaXMubG9jYWxlLm51bWJlci5zY2FsZSk7XG4gICAgICAgICAgICBlbHNlIHF0ZCA9IHRoaXMuc3VtKHF0ZCwgMSwgdGhpcy5sb2NhbGUubnVtYmVyLnNjYWxlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHF0ZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZhbGlkYXRlQWxsRm9ybUZpZWxkcyhmb3JtR3JvdXA6IEZvcm1Hcm91cCkge1xuICAgICAgICBPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybUdyb3VwLmdldChmaWVsZCk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sKSBjb250cm9sLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB0aGlzLnZhbGlkYXRlQWxsRm9ybUZpZWxkcyhjb250cm9sKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uUm91dGVEYXRhQ2hhbmdlKGRhdGE6IGFueSkge1xuICAgICAgICB0aGlzLmxvY2FsZUNvbmZpZyA9IGRhdGEubG9jYWxlQ29uZmlnO1xuICAgICAgICB0aGlzLmxvY2FsZSA9IHRoaXMubG9jYWxlQ29uZmlnO1xuICAgICAgICB0aGlzLmxvY2FsZS5udW1iZXIuc2NhbGUgPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8ucXRkRGVjID8gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYyA6IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEUyMDBMb3RTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICBjb25zdCBzZWFyY2hHcmlkRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuY29kTG90ZScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfY29kX2RlcGApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5TdHJpbmdcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuZGF0RmFiJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfZmFiYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBsb3QuZGF0Vmx0JyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMGxvdF9kYXRfdmx0YCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRhdGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ3F0ZERpcycsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9bG9va3VwX2UyMDBsb3RfcXRkX2Rpc2ApLFxuICAgICAgICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5Eb3VibGVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaEdyaWRGaWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEUyMDBTZXJTZWFyY2hHcmlkRmllbGRzKCkge1xuICAgICAgICBjb25zdCBzZWFyY2hHcmlkRmllbGRzID0gW1xuICAgICAgICAgICAgbmV3IEZvcm1GaWVsZCh7XG4gICAgICAgICAgICAgICAgbmFtZTogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9udW1fc2VwYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLlN0cmluZ1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZTIwMHNlci5kYXRGYWInLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF9mYWJgKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnZTIwMHNlci5kYXRWbHQnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWxvb2t1cF9lMjAwc2VyX2RhdF92bHRgKSxcbiAgICAgICAgICAgICAgICB0eXBlOiBGaWVsZFR5cGUuRGF0ZVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgRm9ybUZpZWxkKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAncXRkRGlzJyxcbiAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1sb29rdXBfZTIwMHNlcl9xdGRfZGlzYCksXG4gICAgICAgICAgICAgICAgdHlwZTogRmllbGRUeXBlLkRvdWJsZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gc2VhcmNoR3JpZEZpZWxkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgb25FMjAwTG90TG9va3VwUmVxdWVzdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBkZXBvc2l0byA9ICcnO1xuICAgICAgICBjb25zdCBkaXNwbGF5RmllbGRzID0gdGhpcy5sb3RlTG9va3VwRGlzcGxheUZpZWxkcztcblxuICAgICAgICBpZiAodGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXApIHtcbiAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUyMDVkZXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlKVxuICAgICAgICAgICAgICAgIGRlcG9zaXRvID0gdGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLmRlcG9zaXRvLnZhbHVlLmUyMDVkZXAuaWQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWx0ZXJRdWVyeTogYW55ID0ge1xuICAgICAgICAgICAgZTA3MGVtcDoge1xuICAgICAgICAgICAgICAgIGlkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTA3MGVtcFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUyMDVkZXA6IHtcbiAgICAgICAgICAgICAgICBpZDogZGVwb3NpdG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlMDc1ZGVyOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDc1ZGVyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbG90TGlrZTogdHJ1ZSxcbiAgICAgICAgICAgIGxvdFNhbDogdHJ1ZSxcbiAgICAgICAgICAgIGxvdERpczogdHJ1ZSxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIHNpemU6IDEwLFxuICAgICAgICAgICAgb3JkZXJCeTogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICdlMjAwbG90LmNvZExvdCcsXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyOiAnQVNDJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGZpbHRlclF1ZXJ5LmUyMDBsb3QgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2RMb3Q6IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmF0Y2hTZXJpZXNTZXJ2aWNlXG4gICAgICAgICAgICAubGlzdEJhdGNoKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgbG90ZXM6IGxpc3QubG90ZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGRpc3BsYXlGaWVsZHMubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5pbmRleE9mKCcuJykgPiAwKSByZXR1cm4gdGhpcy5nZXRQcm9wKGl0ZW0sIGZpZWxkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVtmaWVsZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGxpc3Q6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZTIwMGxvdExvb2t1cFN1Z2dlc3Rpb25zT2JzZXJ2YWJsZS5uZXh0KGxpc3QubG90ZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRTIwMFNlckxvb2t1cFJlcXVlc3QodmFsdWU6IHN0cmluZykge1xuICAgICAgICBsZXQgZGVwb3NpdG8gPSAnJztcbiAgICAgICAgY29uc3QgZGlzcGxheUZpZWxkcyA9IHRoaXMuc2VyaWVMb29rdXBEaXNwbGF5RmllbGRzO1xuXG4gICAgICAgIGlmICh0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcCkge1xuICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmxvdGVTZXJpZVBhcmFtcy5kYWRvc1Byb2R1dG8uZTIwNWRlcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUpXG4gICAgICAgICAgICAgICAgZGVwb3NpdG8gPSB0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMuZGVwb3NpdG8udmFsdWUuZTIwNWRlcC5pZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbHRlclF1ZXJ5OiBhbnkgPSB7XG4gICAgICAgICAgICBlMDcwZW1wOiB7XG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmRhZG9zUHJvZHV0by5lMDcwZW1wXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZTIwNWRlcDoge1xuICAgICAgICAgICAgICAgIGlkOiBkZXBvc2l0b1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGUwNzVkZXI6IHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLmUwNzVkZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXJMaWtlOiB0cnVlLFxuICAgICAgICAgICAgc2VyU2FsOiB0cnVlLFxuICAgICAgICAgICAgc2VyRGlzOiB0cnVlLFxuICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgc2l6ZTogMTAsXG4gICAgICAgICAgICBvcmRlckJ5OiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ2UyMDBzZXIubnVtU2VwJyxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6ICdBU0MnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgZmlsdGVyUXVlcnkuZTIwMHNlciA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG51bVNlcDogdmFsdWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5saXN0U2VyaWVzKGZpbHRlclF1ZXJ5KVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGxpc3Q6IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgLi4ubGlzdCxcbiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiBsaXN0LnNlcmllcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGlzcGxheUZpZWxkcy5tYXAoKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmluZGV4T2YoJy4nKSA+IDApIHJldHVybiB0aGlzLmdldFByb3AoaXRlbSwgZmllbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtW2ZpZWxkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5lMjAwc2VyTG9va3VwU3VnZ2VzdGlvbnNPYnNlcnZhYmxlLm5leHQobGlzdC5zZXJpZXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZvcm1hdERhdGVzKHJlcXVlc3RCb2R5OiBhbnksIHByb3BlcnRpZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXF1ZXN0Qm9keSkucmVkdWNlKChwcmV2OiBhbnksIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzLmluZGV4T2YodmFsdWUpID4gLTEgJiYgcmVxdWVzdEJvZHlbdmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgcHJldlt2YWx1ZV0gPSBtb21lbnQocmVxdWVzdEJvZHlbdmFsdWVdKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcHJldlt2YWx1ZV0gPSByZXF1ZXN0Qm9keVt2YWx1ZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgfSwge30pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmb3JtYXREYXRlc1RvQ2FsZW5kYXIocmVxdWVzdEJvZHk6IGFueSwgcHJvcGVydGllczogc3RyaW5nW10pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcXVlc3RCb2R5KS5yZWR1Y2UoKHByZXY6IGFueSwgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMuaW5kZXhPZih2YWx1ZSkgPiAtMSAmJiByZXF1ZXN0Qm9keVt2YWx1ZV0pIHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdEJvZHlbdmFsdWVdICE9IHVuZGVmaW5lZCAmJiByZXF1ZXN0Qm9keVt2YWx1ZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2W3ZhbHVlXSA9IG1vbWVudChyZXF1ZXN0Qm9keVt2YWx1ZV0pLnRvRGF0ZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbdmFsdWVdID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmV2W3ZhbHVlXSA9IHJlcXVlc3RCb2R5W3ZhbHVlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCB7fSk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZUh0bWwodGV4dDogc3RyaW5nLCB2YWx1ZTogYW55ID0gbnVsbCwgc2hvcnRjdXQ6IHN0cmluZyA9IG51bGwpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZXQgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fSR7dGV4dH1gLCB7IHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHNob3J0Y3V0ID8gYCR7cmV0fSAke3Nob3J0Y3V0fWAgOiByZXQ7XG4gICAgfVxuXG4gICAgcHVibGljIG9uRGlzdHJpYnV0ZVNlcmllcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgIC5vYnRlck5lY2Vzc2lkYWRlcyh7XG4gICAgICAgICAgICAgICAgZTA3MGVtcElkOiB0aGlzLmxvdGVTZXJpZVBhcmFtcy5pbnZvaWNlSW5mb3JtYXRpb24uY29tcGFueS5pZCxcbiAgICAgICAgICAgICAgICBlMDcwZmlsSWQ6IHRoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5icmFuY2guaWQsXG4gICAgICAgICAgICAgICAgaXRlbnNJZDogW3RoaXMubG90ZVNlcmllUGFyYW1zLmludm9pY2VJbmZvcm1hdGlvbi5pdGVtLnByb2R1Y3QuaWRdLFxuICAgICAgICAgICAgICAgIHRpcG86IEVudW1UaXBvRG9jdW1lbnRvUGFyYW1ldHJvcy5QZWRpZG9WZW5kYSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudG9JZDogbnVsbCxcbiAgICAgICAgICAgICAgICBudW1lcm9Eb2N1bWVudG9QYWk6IFt0aGlzLmxvdGVTZXJpZVBhcmFtcz8ub3JkZXJJbmZvcm1hdGlvbj8ubnVtYmVyLnRvU3RyaW5nKCldLFxuICAgICAgICAgICAgICAgIGRhdGFJbmljaWFsOiBudWxsLFxuICAgICAgICAgICAgICAgIGRhdGFGaW5hbDogbnVsbCxcbiAgICAgICAgICAgICAgICBzaXR1YWNhbzogbnVsbCxcbiAgICAgICAgICAgICAgICBjb2RpZ29EZW1hbmRhOiBudWxsLFxuICAgICAgICAgICAgICAgIHNvbWVudGVVcmdlbnRlczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcGFnZVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAxMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoeyBuZWNlc3NpZGFkZXMgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IHRoaXMubG90ZVNlcmllUGFyYW1zPy5vcmRlckluZm9ybWF0aW9uPy5pdGVtLmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0ZW5kaW1lbnRvID0gbmVjZXNzaWRhZGVzLmZpbmQoKG5lY2Vzc2lkYWRlKSA9PiBuZWNlc3NpZGFkZS5kb2N1bWVudG8/LmlkRXh0ZXJubyA9PT0gaXRlbUlkKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGdldFVybElucHV0OiBHZXRVcmxJbnB1dCA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW5OYW1lOiAnZXJweF9zdXAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lOiAnZGVtYW5kYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcE5hbWU6ICdlcnB4LXN1cC1kZW1hbmRhcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGU6IGBkZW1hbmRhcy9hdGVuZGltZW50b3MvJHthdGVuZGltZW50by5pZH0/aXNTZXJpZXNEaXN0cmlidXRpb25WaXNpYmxlPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5iYXRjaFNlcmllc1NlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmdldFVybChnZXRVcmxJbnB1dClcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZ2V0VXJsT3V0cHV0OiBHZXRVcmxPdXRwdXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKGAke2dldFVybE91dHB1dC5mcm9udGVuZHNbMF0uZW1iZWRkZWRVUkx9YCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkRlbGV0ZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24uZm9yRWFjaCgodmFsdWUpID0+IHRoaXMucmVtb3ZlQmF0Y2hPclNlcmllcyh2YWx1ZSkpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0Rpc3RyaWJ1dGVTZXJpZXNCdXR0b25WaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5sb3RlU2VyaWVQYXJhbXM/Lmludm9pY2VJbmZvcm1hdGlvbj8uaXRlbT8ucHJvZHVjdD8uaXNTZXJpYWxDb250cm9sbGVkICYmXG4gICAgICAgICAgICB0aGlzLmxvdGVTZXJpZVBhcmFtcz8uaW52b2ljZUluZm9ybWF0aW9uPy5vcmlnaW4gPT09IEVudW1JbnZvaWNlT3JpZ2luLlYyXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJsdXJRdWFudGl0eSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2FpZGEpIHJldHVybjtcblxuICAgICAgICBjb25zdCBxdWFudGl0eSA9IE51bWJlcih0aGlzLmZvcm1Hcm91cEJhdGNoT3JTZXJpZXMuY29udHJvbHMucXVhbnRpZGFkZS52YWx1ZSk7XG4gICAgICAgIGNvbnN0IGJhbGFuY2UgPSBOdW1iZXIodGhpcy5mb3JtR3JvdXBCYXRjaE9yU2VyaWVzLmNvbnRyb2xzLnNhbGRvLnZhbHVlKTtcblxuICAgICAgICBpZiAocXVhbnRpdHkgPiBiYWxhbmNlKVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH13YXJuYCksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfYmF0Y2hfZGlzdHJpYnV0aW9uX3F1YW50aXR5YClcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE1lbnVPcHRpb25zUGVyUm93KHJvd0RhdGEpOiBUaWVyZWRNZW51SXRlbURhdGFbXSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZWRpdGApLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZS5lZGl0aW5nUm93S2V5cyA9IHsgW3Jvd0RhdGEuY29kaWdvXTogdHJ1ZSB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuZWRpdGluZ0Zvcm1GaWVsZHMuZmluZCgoZmllbGQpID0+IGZpZWxkLm5hbWUgPT09ICdxdWFudGlkYWRlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkLnNjYWxlID0gdGhpcy5sb3RlU2VyaWVQYXJhbXMuZGFkb3NQcm9kdXRvLnF0ZERlYztcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRpbmdGb3JtR3JvdXAuZ2V0KCdxdWFudGlkYWRlJykuc2V0VmFsdWUocm93RGF0YS5xdWFudGlkYWRlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRlbGV0ZWRfbWVzc2FnZV90aXRsZWApLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICgpID0+IHRoaXMucmVtb3ZlQmF0Y2hPclNlcmllcyhyb3dEYXRhKVxuICAgICAgICAgICAgfVxuICAgICAgICBdO1xuICAgIH1cblxuICAgIG9uQ2FuY2VsRWRpdChyb3dEYXRhKSB7XG4gICAgICAgIHRoaXMudGFibGUuZWRpdGluZ1Jvd0tleXMgPSB7IFtyb3dEYXRhLmNvZGlnb106IGZhbHNlIH07XG4gICAgfVxuXG4gICAgb25TYXZlRWRpdChyb3dEYXRhKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVBbGxGb3JtRmllbGRzKHRoaXMuZWRpdGluZ0Zvcm1Hcm91cCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZWRpdGluZ0Zvcm1Hcm91cC5pbnZhbGlkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgcXVhbnRpdHkgPSBOdW1iZXIodGhpcy5lZGl0aW5nRm9ybUdyb3VwLmdldCgncXVhbnRpZGFkZScpLnZhbHVlKTtcblxuICAgICAgICBpZiAocXVhbnRpdHkgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWRpc3RyaWJ1dGlvbl9lcnJvcmApLFxuICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHt0aGlzLnByZWZpeH1pbnZhbGlkX3F0ZGApXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlzdHJpYnV0ZWRRdWFudGl0eSA9IHRoaXMucXRkRGlzdHJpYnVpZGEgLSBOdW1iZXIocm93RGF0YS5xdWFudGlkYWRlKSArIHF1YW50aXR5O1xuXG4gICAgICAgIGlmIChkaXN0cmlidXRlZFF1YW50aXR5ID4gdGhpcy5xdGRBZGlzdHJpYnVpcikge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xuICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7dGhpcy5wcmVmaXh9ZGlzdHJpYnV0aW9uX2Vycm9yYCksXG4gICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke3RoaXMucHJlZml4fWludmFsaWRfcXR5X21zZ2ApLFxuICAgICAgICAgICAgICAgIHN0aWNreTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXRkRGlzdHJpYnVpZGEgPSBkaXN0cmlidXRlZFF1YW50aXR5O1xuICAgICAgICB0aGlzLnF0ZFJlc3RhbnRlID0gdGhpcy5xdGRBZGlzdHJpYnVpciAtIHRoaXMucXRkRGlzdHJpYnVpZGE7XG5cbiAgICAgICAgdGhpcy50YWJsZS5lZGl0aW5nUm93S2V5cyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMudGFibGUuZWRpdGluZ1Jvd0tleXMsXG4gICAgICAgICAgICBbcm93RGF0YS5jb2RpZ29dOiBmYWxzZVxuICAgICAgICB9O1xuXG4gICAgICAgIHJvd0RhdGEucXVhbnRpZGFkZSA9IHF1YW50aXR5O1xuICAgIH1cbn1cblxuLypQYXLDom1ldHJvcyBwYXJhIHV0aWxpemFyIG8gY29tcG9uZW50ZSBkZSBsb3RlLXPDqXJpZSAqL1xuZXhwb3J0IGludGVyZmFjZSBMb3RlU2VyaWVQYXJhbXMge1xuICAgIC8qIEluZm9ybWEgc2UgYSBtb3ZpbWVudGHDp8OjbyDDqSBkbyB0aXBvIGVudHJhZGEgb3Ugc2FpZGEuICovXG4gICAgdGlwb01vdmltZW50YWNhbzogRW51bVRpcG9Nb3ZpbWVudGFjYW87XG5cbiAgICAvKiBJbmZvcm1hIHNlIG8gcHJvZHV0byDDqSBjb250cm9sYWRvIHBvciBsb3RlIG91IHPDqXJpZS4gKi9cbiAgICB0aXBvQ29udHJvbGVQcm9kdXRvOiBFbnVtVGlwb0NvbnRyb2xlUHJvZHV0bztcblxuICAgIC8qIEluZm9ybWEgYSBxdWFudGlkYWRlIGEgc2VyIGRpc3RyaWJ1w61kYS4gKi9cbiAgICBxdWFudGlkYWRlRGlzdHJpYnVpcjogbnVtYmVyO1xuXG4gICAgLyogSW5mb3JtYSBvcyBkYWRvcyBkbyBwcm9kdXRvLiAqL1xuICAgIGRhZG9zUHJvZHV0bzogRGFkb3NQcm9kdXRvO1xuXG4gICAgLyogSW5mb3JtYSBvcyBsb3RlcyBvdSBzw6lyaWVzIGphIGRpc3RyaWJ1w61kb3MuKi9cbiAgICBsb3Rlc09yU2VyaWVzPzogQXJyYXk8TG90ZXNPclNlcmllcz47XG5cbiAgICAvKiBJbmZvcm1hw6fDtWVzIGRhIG5vdGEgLiovXG4gICAgaW52b2ljZUluZm9ybWF0aW9uPzogSW52b2ljZUluZm9ybWF0aW9uO1xuXG4gICAgLyogSW5mb3JtYcOnw7VlcyBkbyBwZWRpZG8gZGUgdmVuZGEgLiovXG4gICAgb3JkZXJJbmZvcm1hdGlvbj86IE9yZGVySW5mb3JtYXRpb247XG59XG5cbi8qKiBFbnVtIHBhcmEgdGlwbyBkZSBtb3ZpbWVudG8gKi9cbmV4cG9ydCBlbnVtIEVudW1UaXBvTW92aW1lbnRhY2FvIHtcbiAgICAvKiogVGlwbyBtb3ZpbWVudGHDp8OjbyBpZ3VhbCBhIEVudHJhZGEgKi9cbiAgICBFbnRyYWRhID0gJ0VudHJhZGEnLFxuICAgIC8qKiBUaXBvIG1vdmltZW50YcOnw6NvIGlndWFsIGEgU2HDrWRhICovXG4gICAgU2FpZGEgPSAnU2FpZGEnXG59XG5cbi8qKiBFbnVtIHBhcmEgdGlwbyBkZSBjb250cm9sZSBkZSBwcm9kdXRvICovXG5leHBvcnQgZW51bSBFbnVtVGlwb0NvbnRyb2xlUHJvZHV0byB7XG4gICAgLyoqIFRpcG8gZGUgY29udHJvbGUgaWd1YWwgYSBMb3RlICovXG4gICAgTG90ZSA9ICdMb3RlJyxcbiAgICAvKiogVGlwbyBkZSBjb250cm9sZSBpZ3VhbCBhIFPDqXJpZSAqL1xuICAgIFNlcmllID0gJ1NlcmllJ1xufVxuXG4vKiogSW50ZXJmYWNlIHBhcmEgZGFkb3MgZG8gcHJvZHV0byAqL1xuZXhwb3J0IGludGVyZmFjZSBEYWRvc1Byb2R1dG8ge1xuICAgIC8qKiBJRCBkbyBwcm9kdXRvICovXG4gICAgZTA3NWRlcjogc3RyaW5nO1xuXG4gICAgLyoqIElEIGRvIGRlcMOzc2l0byAqL1xuICAgIGUyMDVkZXA/OiBzdHJpbmc7XG5cbiAgICAvKiogSUQgZGEgZmFtw61saWEgZG8gcHJvZHV0byAqL1xuICAgIGUwMTJmYW06IHN0cmluZztcblxuICAgIC8qKiBFbnRpZGFkZSBlbXByZXNhICovXG4gICAgZTA3MGVtcDogc3RyaW5nO1xuXG4gICAgLyoqIFF1YW50aWRhZGUgZGUgY2FzYXMgZGVjaW1haXMgKi9cbiAgICBxdGREZWM/OiBudW1iZXI7XG59XG5cbi8qKiBJbnRlcmZhY2UgcGFyYSBkYWRvcyBkYSBncmlkIGRvcyBsb3Rlcy9zw6lyaWVzIGRpc3RyaWJ1w61kb3MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG90ZXNPclNlcmllcyB7XG4gICAgLyoqIElEIGRvIExvdGUgb3UgU8OpcmllICovXG4gICAgaWQ/OiBzdHJpbmc7XG5cbiAgICAvKiogQ8OzZGlnbyBkbyBMb3RlIG91IFPDqXJpZSAqL1xuICAgIGNvZGlnbzogc3RyaW5nO1xuXG4gICAgLyoqIERhdGEgZGUgdmFsaWRhZGUgZG8gbG90ZS9zw6lyaWUgKi9cbiAgICBkYXRhVmFsaWRhZGU/OiBzdHJpbmc7XG5cbiAgICAvKiogRGF0YSBkZSBmYWJyaWNhw6fDo28gZG8gbG90ZS9zw6lyaWUgKi9cbiAgICBkYXRhRmFicmljYWNhbz86IHN0cmluZztcblxuICAgIC8qKiBRdWFudGlkYWRlICoqL1xuICAgIHF1YW50aWRhZGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBlbnVtIEVudW1JbnZvaWNlT3JpZ2luIHtcbiAgICBWMSA9ICdWMScsXG4gICAgVjIgPSAnVjInLFxuICAgIFYzID0gJ1YzJyxcbiAgICBWNCA9ICdWNCcsXG4gICAgVjUgPSAnVjUnLFxuICAgIFY5OSA9ICdWOTknXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2ljZUl0ZW0ge1xuICAgIHByb2R1Y3Q6IHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgaXNTZXJpYWxDb250cm9sbGVkOiBib29sZWFuO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52b2ljZUluZm9ybWF0aW9uIHtcbiAgICBjb21wYW55OiB7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgfTtcbiAgICBicmFuY2g6IHtcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICB9O1xuICAgIG9yaWdpbjogRW51bUludm9pY2VPcmlnaW47XG4gICAgaXRlbT86IEludm9pY2VJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVySXRlbSB7XG4gICAgaWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcmRlckluZm9ybWF0aW9uIHtcbiAgICBudW1iZXI6IG51bWJlcjtcbiAgICBpdGVtOiBPcmRlckl0ZW07XG59XG5cbmludGVyZmFjZSBCdWxrSW1wb3J0IHtcbiAgICBjb2RpZ286IHN0cmluZztcbiAgICBkYXRhRmFicmljYWNhbzogc3RyaW5nO1xuICAgIGRhdGFWYWxpZGFkZTogc3RyaW5nO1xuICAgIHF1YW50aWRhZGU/OiBudW1iZXI7XG59XG4iXX0=