@vendure/admin-ui 2.0.0-next.2 → 2.0.0-next.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/catalog/catalog.module.d.ts +15 -11
  2. package/catalog/components/assign-to-channel-dialog/assign-to-channel-dialog.component.d.ts +22 -0
  3. package/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.d.ts +41 -0
  4. package/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.d.ts +4 -0
  5. package/catalog/components/collection-contents/collection-contents.component.d.ts +10 -2
  6. package/catalog/components/collection-detail/collection-detail.component.d.ts +13 -4
  7. package/catalog/components/collection-list/collection-list-bulk-actions.d.ts +6 -0
  8. package/catalog/components/collection-list/collection-list.component.d.ts +9 -5
  9. package/catalog/components/collection-tree/array-to-tree.d.ts +1 -1
  10. package/catalog/components/collection-tree/collection-tree-node.component.d.ts +14 -6
  11. package/catalog/components/collection-tree/collection-tree.component.d.ts +4 -1
  12. package/catalog/components/facet-list/facet-list-bulk-actions.d.ts +5 -0
  13. package/catalog/components/facet-list/facet-list.component.d.ts +2 -1
  14. package/catalog/components/generate-product-variants/generate-product-variants.component.d.ts +3 -3
  15. package/catalog/components/option-value-input/option-value-input.component.d.ts +21 -9
  16. package/catalog/components/product-detail/product-detail.component.d.ts +1 -1
  17. package/catalog/components/product-list/product-list-bulk-actions.d.ts +6 -0
  18. package/catalog/components/product-list/product-list.component.d.ts +4 -2
  19. package/catalog/components/product-variants-editor/product-variants-editor.component.d.ts +22 -12
  20. package/catalog/components/product-variants-list/product-variants-list.component.d.ts +1 -0
  21. package/catalog/public_api.d.ts +6 -1
  22. package/core/common/component-registry-types.d.ts +1 -1
  23. package/core/common/generated-types.d.ts +3184 -195
  24. package/core/common/utilities/bulk-action-utils.d.ts +19 -0
  25. package/core/common/utilities/configurable-operation-utils.d.ts +7 -2
  26. package/core/common/utilities/selection-manager.d.ts +30 -0
  27. package/core/common/version.d.ts +1 -1
  28. package/core/components/app-shell/app-shell.component.d.ts +1 -0
  29. package/core/data/definitions/collection-definitions.d.ts +4 -0
  30. package/core/data/definitions/facet-definitions.d.ts +3 -0
  31. package/core/data/definitions/order-definitions.d.ts +14 -0
  32. package/core/data/definitions/product-definitions.d.ts +2 -0
  33. package/core/data/providers/collection-data.service.d.ts +7 -0
  34. package/core/data/providers/facet-data.service.d.ts +3 -0
  35. package/core/data/providers/order-data.service.d.ts +18 -0
  36. package/core/data/providers/product-data.service.d.ts +2 -0
  37. package/core/providers/bulk-action-registry/bulk-action-registry.service.d.ts +9 -0
  38. package/core/providers/bulk-action-registry/bulk-action-types.d.ts +149 -0
  39. package/core/providers/bulk-action-registry/register-bulk-action.d.ts +53 -0
  40. package/core/providers/local-storage/local-storage.service.d.ts +1 -0
  41. package/core/providers/modal/modal.types.d.ts +2 -0
  42. package/core/providers/nav-builder/nav-builder-types.d.ts +1 -0
  43. package/core/public_api.d.ts +24 -1
  44. package/core/shared/components/asset-gallery/asset-gallery.component.d.ts +27 -3
  45. package/core/shared/components/bulk-action-menu/bulk-action-menu.component.d.ts +32 -0
  46. package/core/shared/components/configurable-input/configurable-input.component.d.ts +8 -3
  47. package/core/shared/components/custom-field-control/custom-field-control.component.d.ts +6 -2
  48. package/core/shared/components/data-table/data-table.component.d.ts +29 -7
  49. package/core/shared/components/dropdown/dropdown-menu.component.d.ts +2 -1
  50. package/core/shared/components/facet-value-selector/facet-value-selector.component.d.ts +3 -2
  51. package/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.d.ts +38 -0
  52. package/{catalog → core/shared}/components/product-search-input/product-search-input.component.d.ts +1 -1
  53. package/core/shared/components/radio-card/radio-card-fieldset.component.d.ts +24 -0
  54. package/core/shared/components/radio-card/radio-card.component.d.ts +22 -0
  55. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.d.ts +31 -0
  56. package/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.d.ts +34 -0
  57. package/core/shared/components/rich-text-editor/prosemirror/custom-nodes.d.ts +4 -0
  58. package/core/shared/components/rich-text-editor/prosemirror/inputrules.d.ts +5 -5
  59. package/core/shared/components/rich-text-editor/prosemirror/menu/links.d.ts +1 -1
  60. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.d.ts +12 -0
  61. package/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.d.ts +9 -0
  62. package/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.d.ts +14 -0
  63. package/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.d.ts +7 -0
  64. package/core/shared/components/rich-text-editor/prosemirror/plugins/link-select-plugin.d.ts +1 -1
  65. package/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.d.ts +7 -0
  66. package/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.d.ts +13 -0
  67. package/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.d.ts +7 -3
  68. package/core/shared/components/rich-text-editor/prosemirror/types.d.ts +0 -2
  69. package/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.d.ts +21 -0
  70. package/core/shared/components/rich-text-editor/rich-text-editor.component.d.ts +6 -2
  71. package/core/shared/components/select-toggle/select-toggle.component.d.ts +2 -1
  72. package/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.d.ts +30 -0
  73. package/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.d.ts +22 -0
  74. package/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.d.ts +5 -17
  75. package/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.d.ts +28 -0
  76. package/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.d.ts +2 -0
  77. package/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.d.ts +23 -0
  78. package/core/shared/dynamic-form-inputs/register-dynamic-input-components.d.ts +5 -1
  79. package/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.d.ts +6 -3
  80. package/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.d.ts +10 -2
  81. package/core/shared/pipes/custom-field-description.pipe.d.ts +11 -0
  82. package/core/shared/pipes/custom-field-label.pipe.d.ts +4 -10
  83. package/core/shared/shared.module.d.ts +68 -57
  84. package/customer/components/customer-group-list/customer-group-list.component.d.ts +6 -4
  85. package/customer/components/customer-group-member-list/customer-group-member-list.component.d.ts +11 -4
  86. package/esm2020/catalog/catalog.module.mjs +31 -10
  87. package/esm2020/catalog/components/apply-facet-dialog/apply-facet-dialog.component.mjs +1 -1
  88. package/esm2020/catalog/components/assets/assets.component.mjs +2 -2
  89. package/esm2020/catalog/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.mjs +4 -1
  90. package/esm2020/catalog/components/assign-to-channel-dialog/assign-to-channel-dialog.component.mjs +50 -0
  91. package/esm2020/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.mjs +84 -0
  92. package/esm2020/catalog/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.mjs +69 -0
  93. package/esm2020/catalog/components/collection-contents/collection-contents.component.mjs +61 -13
  94. package/esm2020/catalog/components/collection-detail/collection-detail.component.mjs +70 -32
  95. package/esm2020/catalog/components/collection-list/collection-list-bulk-actions.mjs +143 -0
  96. package/esm2020/catalog/components/collection-list/collection-list.component.mjs +46 -12
  97. package/esm2020/catalog/components/collection-tree/array-to-tree.mjs +3 -3
  98. package/esm2020/catalog/components/collection-tree/collection-tree-node.component.mjs +36 -10
  99. package/esm2020/catalog/components/collection-tree/collection-tree.component.mjs +9 -4
  100. package/esm2020/catalog/components/facet-detail/facet-detail.component.mjs +3 -3
  101. package/esm2020/catalog/components/facet-list/facet-list-bulk-actions.mjs +202 -0
  102. package/esm2020/catalog/components/facet-list/facet-list.component.mjs +14 -5
  103. package/esm2020/catalog/components/generate-product-variants/generate-product-variants.component.mjs +12 -4
  104. package/esm2020/catalog/components/option-value-input/option-value-input.component.mjs +70 -11
  105. package/esm2020/catalog/components/product-detail/product-detail.component.mjs +36 -24
  106. package/esm2020/catalog/components/product-list/product-list-bulk-actions.mjs +168 -0
  107. package/esm2020/catalog/components/product-list/product-list.component.mjs +13 -9
  108. package/esm2020/catalog/components/product-variants-editor/product-variants-editor.component.mjs +130 -19
  109. package/esm2020/catalog/components/product-variants-list/product-variants-list.component.mjs +9 -3
  110. package/esm2020/catalog/providers/routing/collection-resolver.mjs +2 -1
  111. package/esm2020/catalog/public_api.mjs +7 -2
  112. package/esm2020/core/app.component.module.mjs +1 -1
  113. package/esm2020/core/common/base-detail.component.mjs +1 -1
  114. package/esm2020/core/common/component-registry-types.mjs +1 -1
  115. package/esm2020/core/common/deactivate-aware.mjs +1 -1
  116. package/esm2020/core/common/generated-types.mjs +31 -1
  117. package/esm2020/core/common/introspection-result.mjs +296 -189
  118. package/esm2020/core/common/utilities/bulk-action-utils.mjs +35 -0
  119. package/esm2020/core/common/utilities/configurable-operation-utils.mjs +37 -10
  120. package/esm2020/core/common/utilities/selection-manager.mjs +96 -0
  121. package/esm2020/core/common/version.mjs +2 -2
  122. package/esm2020/core/components/app-shell/app-shell.component.mjs +6 -5
  123. package/esm2020/core/components/breadcrumb/breadcrumb.component.mjs +2 -2
  124. package/esm2020/core/components/channel-switcher/channel-switcher.component.mjs +1 -1
  125. package/esm2020/core/components/main-nav/main-nav.component.mjs +3 -3
  126. package/esm2020/core/components/user-menu/user-menu.component.mjs +1 -1
  127. package/esm2020/core/core.module.mjs +1 -1
  128. package/esm2020/core/data/definitions/collection-definitions.mjs +47 -1
  129. package/esm2020/core/data/definitions/facet-definitions.mjs +31 -1
  130. package/esm2020/core/data/definitions/order-definitions.mjs +583 -455
  131. package/esm2020/core/data/definitions/product-definitions.mjs +23 -1
  132. package/esm2020/core/data/definitions/shared-definitions.mjs +29 -28
  133. package/esm2020/core/data/providers/collection-data.service.mjs +20 -2
  134. package/esm2020/core/data/providers/customer-data.service.mjs +6 -1
  135. package/esm2020/core/data/providers/facet-data.service.mjs +18 -2
  136. package/esm2020/core/data/providers/order-data.service.mjs +43 -2
  137. package/esm2020/core/data/providers/product-data.service.mjs +10 -2
  138. package/esm2020/core/data/providers/promotion-data.service.mjs +1 -1
  139. package/esm2020/core/data/utils/remove-readonly-custom-fields.mjs +8 -1
  140. package/esm2020/core/providers/bulk-action-registry/bulk-action-registry.service.mjs +28 -0
  141. package/esm2020/core/providers/bulk-action-registry/bulk-action-types.mjs +2 -0
  142. package/esm2020/core/providers/bulk-action-registry/register-bulk-action.mjs +63 -0
  143. package/esm2020/core/providers/dashboard-widget/dashboard-widget.service.mjs +1 -4
  144. package/esm2020/core/providers/local-storage/local-storage.service.mjs +1 -1
  145. package/esm2020/core/providers/modal/modal.service.mjs +2 -1
  146. package/esm2020/core/providers/modal/modal.types.mjs +1 -1
  147. package/esm2020/core/providers/nav-builder/nav-builder-types.mjs +1 -1
  148. package/esm2020/core/public_api.mjs +25 -2
  149. package/esm2020/core/shared/components/action-bar/action-bar.component.mjs +7 -15
  150. package/esm2020/core/shared/components/address-form/address-form.component.mjs +3 -3
  151. package/esm2020/core/shared/components/asset-gallery/asset-gallery.component.mjs +34 -51
  152. package/esm2020/core/shared/components/asset-preview/asset-preview.component.mjs +4 -4
  153. package/esm2020/core/shared/components/asset-preview-links/asset-preview-links.component.mjs +1 -1
  154. package/esm2020/core/shared/components/bulk-action-menu/bulk-action-menu.component.mjs +97 -0
  155. package/esm2020/core/shared/components/configurable-input/configurable-input.component.mjs +22 -10
  156. package/esm2020/core/shared/components/custom-field-control/custom-field-control.component.mjs +18 -10
  157. package/esm2020/core/shared/components/data-table/data-table.component.mjs +64 -14
  158. package/esm2020/core/shared/components/datetime-picker/datetime-picker.component.mjs +1 -1
  159. package/esm2020/core/shared/components/dropdown/dropdown-menu.component.mjs +26 -23
  160. package/esm2020/core/shared/components/dropdown/dropdown-trigger.directive.mjs +1 -1
  161. package/esm2020/core/shared/components/entity-info/entity-info.component.mjs +1 -1
  162. package/esm2020/core/shared/components/facet-value-selector/facet-value-selector.component.mjs +13 -6
  163. package/esm2020/core/shared/components/formatted-address/formatted-address.component.mjs +3 -3
  164. package/esm2020/core/shared/components/help-tooltip/help-tooltip.component.mjs +2 -2
  165. package/esm2020/core/shared/components/history-entry-detail/history-entry-detail.component.mjs +1 -1
  166. package/esm2020/core/shared/components/language-selector/language-selector.component.mjs +3 -3
  167. package/esm2020/core/shared/components/object-tree/object-tree.component.mjs +1 -1
  168. package/esm2020/core/shared/components/order-state-label/order-state-label.component.mjs +2 -1
  169. package/esm2020/core/shared/components/product-multi-selector-dialog/product-multi-selector-dialog.component.mjs +135 -0
  170. package/esm2020/core/shared/components/product-search-input/product-search-input.component.mjs +108 -0
  171. package/esm2020/core/shared/components/product-variant-selector/product-variant-selector.component.mjs +2 -2
  172. package/esm2020/core/shared/components/radio-card/radio-card-fieldset.component.mjs +54 -0
  173. package/esm2020/core/shared/components/radio-card/radio-card.component.mjs +53 -0
  174. package/esm2020/core/shared/components/rich-text-editor/external-image-dialog/external-image-dialog.component.mjs +3 -3
  175. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.component.mjs +136 -0
  176. package/esm2020/core/shared/components/rich-text-editor/prosemirror/context-menu/context-menu.service.mjs +46 -0
  177. package/esm2020/core/shared/components/rich-text-editor/prosemirror/custom-nodes.mjs +57 -0
  178. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/links.mjs +4 -4
  179. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-common.mjs +22 -1
  180. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu-plugin.mjs +12 -0
  181. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/menu.mjs +73 -18
  182. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/sub-menu-with-icon.mjs +16 -0
  183. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/image-plugin.mjs +100 -0
  184. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/raw-editor-plugin.mjs +96 -0
  185. package/esm2020/core/shared/components/rich-text-editor/prosemirror/plugins/tables-plugin.mjs +166 -0
  186. package/esm2020/core/shared/components/rich-text-editor/prosemirror/prosemirror.service.mjs +47 -18
  187. package/esm2020/core/shared/components/rich-text-editor/prosemirror/types.mjs +1 -1
  188. package/esm2020/core/shared/components/rich-text-editor/raw-html-dialog/raw-html-dialog.component.mjs +59 -0
  189. package/esm2020/core/shared/components/rich-text-editor/rich-text-editor.component.mjs +22 -10
  190. package/esm2020/core/shared/components/select-toggle/select-toggle.component.mjs +6 -3
  191. package/esm2020/core/shared/components/simple-dialog/simple-dialog.component.mjs +3 -3
  192. package/esm2020/core/shared/components/ui-extension-point/ui-extension-point.component.mjs +1 -1
  193. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/base-code-editor-form-input.component.mjs +57 -0
  194. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/html-editor-form-input.component.mjs +63 -0
  195. package/esm2020/core/shared/dynamic-form-inputs/code-editor-form-input/json-editor-form-input.component.mjs +48 -83
  196. package/esm2020/core/shared/dynamic-form-inputs/combination-mode-form-input/combination-mode-form-input.component.mjs +45 -0
  197. package/esm2020/core/shared/dynamic-form-inputs/dynamic-form-input/dynamic-form-input.component.mjs +3 -3
  198. package/esm2020/core/shared/dynamic-form-inputs/facet-value-form-input/facet-value-form-input.component.mjs +12 -3
  199. package/esm2020/core/shared/dynamic-form-inputs/product-multi-selector-form-input/product-multi-selector-form-input.component.mjs +48 -0
  200. package/esm2020/core/shared/dynamic-form-inputs/register-dynamic-input-components.mjs +7 -1
  201. package/esm2020/core/shared/dynamic-form-inputs/relation-form-input/asset/relation-asset-input.component.mjs +11 -9
  202. package/esm2020/core/shared/dynamic-form-inputs/relation-form-input/generic/relation-generic-input.component.mjs +1 -1
  203. package/esm2020/core/shared/dynamic-form-inputs/select-form-input/select-form-input.component.mjs +21 -11
  204. package/esm2020/core/shared/pipes/custom-field-description.pipe.mjs +30 -0
  205. package/esm2020/core/shared/pipes/custom-field-label.pipe.mjs +7 -19
  206. package/esm2020/core/shared/pipes/locale-currency.pipe.mjs +10 -2
  207. package/esm2020/core/shared/pipes/state-i18n-token.pipe.mjs +2 -1
  208. package/esm2020/core/shared/shared.module.mjs +49 -5
  209. package/esm2020/customer/components/address-card/address-card.component.mjs +1 -1
  210. package/esm2020/customer/components/customer-detail/customer-detail.component.mjs +1 -1
  211. package/esm2020/customer/components/customer-group-list/customer-group-list.component.mjs +33 -18
  212. package/esm2020/customer/components/customer-group-member-list/customer-group-member-list.component.mjs +3 -3
  213. package/esm2020/customer/components/customer-history/customer-history.component.mjs +1 -1
  214. package/esm2020/customer/components/customer-list/customer-list.component.mjs +3 -3
  215. package/esm2020/dashboard/components/dashboard/dashboard.component.mjs +2 -2
  216. package/esm2020/dashboard/components/dashboard-widget/dashboard-widget.component.mjs +2 -2
  217. package/esm2020/dashboard/dashboard.module.mjs +6 -2
  218. package/esm2020/dashboard/widgets/latest-orders-widget/latest-orders-widget.component.mjs +1 -1
  219. package/esm2020/dashboard/widgets/order-summary-widget/order-summary-widget.component.mjs +2 -2
  220. package/esm2020/login/components/login/login.component.mjs +3 -3
  221. package/esm2020/marketing/components/promotion-detail/promotion-detail.component.mjs +3 -3
  222. package/esm2020/marketing/components/promotion-list/promotion-list.component.mjs +1 -1
  223. package/esm2020/order/components/cancel-order-dialog/cancel-order-dialog.component.mjs +1 -1
  224. package/esm2020/order/components/coupon-code-selector/coupon-code-selector.component.mjs +42 -0
  225. package/esm2020/order/components/draft-order-detail/draft-order-detail.component.mjs +187 -0
  226. package/esm2020/order/components/draft-order-variant-selector/draft-order-variant-selector.component.mjs +59 -0
  227. package/esm2020/order/components/fulfill-order-dialog/fulfill-order-dialog.component.mjs +7 -3
  228. package/esm2020/order/components/fulfillment-card/fulfillment-card.component.mjs +1 -1
  229. package/esm2020/order/components/fulfillment-detail/fulfillment-detail.component.mjs +8 -17
  230. package/esm2020/order/components/line-fulfillment/line-fulfillment.component.mjs +8 -22
  231. package/esm2020/order/components/order-custom-fields-card/order-custom-fields-card.component.mjs +30 -6
  232. package/esm2020/order/components/order-detail/order-detail.component.mjs +80 -40
  233. package/esm2020/order/components/order-editor/order-editor.component.mjs +15 -14
  234. package/esm2020/order/components/order-edits-preview-dialog/order-edits-preview-dialog.component.mjs +1 -1
  235. package/esm2020/order/components/order-history/order-history.component.mjs +1 -1
  236. package/esm2020/order/components/order-list/order-list.component.mjs +40 -17
  237. package/esm2020/order/components/order-payment-card/order-payment-card.component.mjs +3 -3
  238. package/esm2020/order/components/order-table/order-table.component.mjs +29 -6
  239. package/esm2020/order/components/refund-order-dialog/refund-order-dialog.component.mjs +2 -2
  240. package/esm2020/order/components/select-address-dialog/select-address-dialog.component.mjs +89 -0
  241. package/esm2020/order/components/select-address-dialog/select-address-dialog.graphql.mjs +14 -0
  242. package/esm2020/order/components/select-customer-dialog/select-customer-dialog.component.mjs +59 -0
  243. package/esm2020/order/components/select-shipping-method-dialog/select-shipping-method-dialog.component.mjs +31 -0
  244. package/esm2020/order/order.module.mjs +20 -2
  245. package/esm2020/order/order.routes.mjs +23 -4
  246. package/esm2020/order/providers/routing/order-resolver.mjs +29 -11
  247. package/esm2020/order/providers/routing/order.guard.mjs +37 -0
  248. package/esm2020/order/public_api.mjs +9 -1
  249. package/esm2020/settings/components/administrator-list/administrator-list.component.mjs +1 -1
  250. package/esm2020/settings/components/channel-list/channel-list.component.mjs +1 -1
  251. package/esm2020/settings/components/country-list/country-list.component.mjs +3 -3
  252. package/esm2020/settings/components/payment-method-detail/payment-method-detail.component.mjs +1 -1
  253. package/esm2020/settings/components/payment-method-list/payment-method-list.component.mjs +1 -1
  254. package/esm2020/settings/components/permission-grid/permission-grid.component.mjs +1 -1
  255. package/esm2020/settings/components/profile/profile.component.mjs +3 -3
  256. package/esm2020/settings/components/role-list/role-list.component.mjs +1 -1
  257. package/esm2020/settings/components/shipping-method-detail/shipping-method-detail.component.mjs +4 -2
  258. package/esm2020/settings/components/shipping-method-list/shipping-method-list.component.mjs +1 -1
  259. package/esm2020/settings/components/tax-category-list/tax-category-list.component.mjs +1 -1
  260. package/esm2020/settings/components/tax-rate-list/tax-rate-list.component.mjs +1 -1
  261. package/esm2020/settings/components/zone-detail-dialog/zone-detail-dialog.component.mjs +2 -2
  262. package/esm2020/settings/components/zone-list/zone-list.component.mjs +3 -3
  263. package/esm2020/settings/components/zone-member-list/zone-member-list.component.mjs +3 -3
  264. package/esm2020/system/components/health-check/health-check.component.mjs +2 -2
  265. package/esm2020/system/components/job-list/job-list.component.mjs +1 -1
  266. package/fesm2015/vendure-admin-ui-catalog.mjs +1206 -228
  267. package/fesm2015/vendure-admin-ui-catalog.mjs.map +1 -1
  268. package/fesm2015/vendure-admin-ui-core.mjs +9451 -7332
  269. package/fesm2015/vendure-admin-ui-core.mjs.map +1 -1
  270. package/fesm2015/vendure-admin-ui-customer.mjs +36 -23
  271. package/fesm2015/vendure-admin-ui-customer.mjs.map +1 -1
  272. package/fesm2015/vendure-admin-ui-dashboard.mjs +11 -7
  273. package/fesm2015/vendure-admin-ui-dashboard.mjs.map +1 -1
  274. package/fesm2015/vendure-admin-ui-login.mjs +2 -2
  275. package/fesm2015/vendure-admin-ui-login.mjs.map +1 -1
  276. package/fesm2015/vendure-admin-ui-marketing.mjs +3 -3
  277. package/fesm2015/vendure-admin-ui-marketing.mjs.map +1 -1
  278. package/fesm2015/vendure-admin-ui-order.mjs +1184 -599
  279. package/fesm2015/vendure-admin-ui-order.mjs.map +1 -1
  280. package/fesm2015/vendure-admin-ui-settings.mjs +21 -19
  281. package/fesm2015/vendure-admin-ui-settings.mjs.map +1 -1
  282. package/fesm2015/vendure-admin-ui-system.mjs +3 -3
  283. package/fesm2020/vendure-admin-ui-catalog.mjs +1190 -230
  284. package/fesm2020/vendure-admin-ui-catalog.mjs.map +1 -1
  285. package/fesm2020/vendure-admin-ui-core.mjs +9539 -7437
  286. package/fesm2020/vendure-admin-ui-core.mjs.map +1 -1
  287. package/fesm2020/vendure-admin-ui-customer.mjs +36 -23
  288. package/fesm2020/vendure-admin-ui-customer.mjs.map +1 -1
  289. package/fesm2020/vendure-admin-ui-dashboard.mjs +11 -7
  290. package/fesm2020/vendure-admin-ui-dashboard.mjs.map +1 -1
  291. package/fesm2020/vendure-admin-ui-login.mjs +2 -2
  292. package/fesm2020/vendure-admin-ui-login.mjs.map +1 -1
  293. package/fesm2020/vendure-admin-ui-marketing.mjs +3 -3
  294. package/fesm2020/vendure-admin-ui-marketing.mjs.map +1 -1
  295. package/fesm2020/vendure-admin-ui-order.mjs +1194 -614
  296. package/fesm2020/vendure-admin-ui-order.mjs.map +1 -1
  297. package/fesm2020/vendure-admin-ui-settings.mjs +21 -19
  298. package/fesm2020/vendure-admin-ui-settings.mjs.map +1 -1
  299. package/fesm2020/vendure-admin-ui-system.mjs +3 -3
  300. package/order/components/coupon-code-selector/coupon-code-selector.component.d.ts +21 -0
  301. package/order/components/draft-order-detail/draft-order-detail.component.d.ts +52 -0
  302. package/order/components/draft-order-variant-selector/draft-order-variant-selector.component.d.ts +24 -0
  303. package/order/components/order-custom-fields-card/order-custom-fields-card.component.d.ts +4 -2
  304. package/order/components/order-editor/order-editor.component.d.ts +1 -6
  305. package/order/components/order-list/order-list.component.d.ts +2 -0
  306. package/order/components/order-table/order-table.component.d.ts +12 -2
  307. package/order/components/select-address-dialog/select-address-dialog.component.d.ts +27 -0
  308. package/order/components/select-address-dialog/select-address-dialog.graphql.d.ts +1 -0
  309. package/order/components/select-customer-dialog/select-customer-dialog.component.d.ts +25 -0
  310. package/order/components/select-shipping-method-dialog/select-shipping-method-dialog.component.d.ts +19 -0
  311. package/order/order.module.d.ts +9 -3
  312. package/order/providers/routing/order-resolver.d.ts +8 -3
  313. package/order/providers/routing/order.guard.d.ts +12 -0
  314. package/order/public_api.d.ts +8 -0
  315. package/package.json +13 -12
  316. package/settings/components/zone-member-list/zone-member-list.component.d.ts +3 -1
  317. package/static/i18n-messages/cs.json +50 -3
  318. package/static/i18n-messages/de.json +53 -3
  319. package/static/i18n-messages/en.json +55 -8
  320. package/static/i18n-messages/es.json +50 -3
  321. package/static/i18n-messages/fr.json +50 -3
  322. package/static/i18n-messages/it.json +50 -3
  323. package/static/i18n-messages/pl.json +50 -3
  324. package/static/i18n-messages/pt_BR.json +50 -3
  325. package/static/i18n-messages/pt_PT.json +50 -3
  326. package/static/i18n-messages/ru.json +50 -3
  327. package/static/i18n-messages/uk.json +50 -3
  328. package/static/i18n-messages/zh_Hans.json +50 -3
  329. package/static/i18n-messages/zh_Hant.json +50 -3
  330. package/static/styles/_variables.scss +4 -0
  331. package/static/styles/global/_forms.scss +8 -7
  332. package/static/styles/global/_overrides.scss +11 -1
  333. package/static/styles/global/_sass-overrides.scss +3 -0
  334. package/static/styles/global/_utilities.scss +14 -0
  335. package/static/styles/styles.scss +1 -0
  336. package/static/styles/theme/default.scss +13 -1
  337. package/static/styles/ui-extension-theme.scss +1 -0
  338. package/static/theme.min.css +1 -1
  339. package/core/shared/components/rich-text-editor/prosemirror/menu/images.d.ts +0 -4
  340. package/esm2020/catalog/components/product-search-input/product-search-input.component.mjs +0 -107
  341. package/esm2020/core/shared/components/rich-text-editor/prosemirror/menu/images.mjs +0 -36
@@ -1,12 +1,12 @@
1
1
  import { ChangeDetectionStrategy, Component } from '@angular/core';
2
2
  import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
3
- import { getDefaultUiLanguage, } from '@vendure/admin-ui/core';
3
+ import { DeletionResult, getDefaultUiLanguage, } from '@vendure/admin-ui/core';
4
4
  import { normalizeString } from '@vendure/common/lib/normalize-string';
5
5
  import { pick } from '@vendure/common/lib/pick';
6
6
  import { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
7
7
  import { unique } from '@vendure/common/lib/unique';
8
8
  import { EMPTY, forkJoin, of } from 'rxjs';
9
- import { filter, map, mergeMap, switchMap } from 'rxjs/operators';
9
+ import { defaultIfEmpty, filter, map, mergeMap, switchMap } from 'rxjs/operators';
10
10
  import { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';
11
11
  import * as i0 from "@angular/core";
12
12
  import * as i1 from "@angular/router";
@@ -32,6 +32,7 @@ export class ProductVariantsEditorComponent {
32
32
  this.notificationService = notificationService;
33
33
  this.modalService = modalService;
34
34
  this.formValueChanged = false;
35
+ this.optionsChanged = false;
35
36
  this.generatedVariants = [];
36
37
  }
37
38
  ngOnInit() {
@@ -57,12 +58,105 @@ export class ProductVariantsEditorComponent {
57
58
  ? _('catalog.default-variant')
58
59
  : variant.options.map(o => o.name).join(' ');
59
60
  }
60
- addOption() {
61
+ addOptionGroup() {
61
62
  this.optionGroups.push({
62
63
  isNew: true,
64
+ locked: false,
63
65
  name: '',
64
66
  values: [],
65
67
  });
68
+ this.optionsChanged = true;
69
+ }
70
+ removeOptionGroup(optionGroup) {
71
+ const id = optionGroup.id;
72
+ if (optionGroup.isNew) {
73
+ this.optionGroups = this.optionGroups.filter(og => og !== optionGroup);
74
+ this.generateVariants();
75
+ this.optionsChanged = true;
76
+ }
77
+ else if (id) {
78
+ this.modalService
79
+ .dialog({
80
+ title: _('catalog.confirm-delete-product-option-group'),
81
+ translationVars: { name: optionGroup.name },
82
+ buttons: [
83
+ { type: 'secondary', label: _('common.cancel') },
84
+ { type: 'danger', label: _('common.delete'), returnValue: true },
85
+ ],
86
+ })
87
+ .pipe(switchMap(val => {
88
+ if (val) {
89
+ return this.dataService.product.removeOptionGroupFromProduct({
90
+ optionGroupId: id,
91
+ productId: this.product.id,
92
+ });
93
+ }
94
+ else {
95
+ return EMPTY;
96
+ }
97
+ }))
98
+ .subscribe(({ removeOptionGroupFromProduct }) => {
99
+ if (removeOptionGroupFromProduct.__typename === 'Product') {
100
+ this.notificationService.success(_('common.notify-delete-success'), {
101
+ entity: 'ProductOptionGroup',
102
+ });
103
+ this.initOptionsAndVariants();
104
+ this.optionsChanged = true;
105
+ }
106
+ else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {
107
+ this.notificationService.error(removeOptionGroupFromProduct.message ?? '');
108
+ }
109
+ });
110
+ }
111
+ }
112
+ addOption(index, optionName) {
113
+ const group = this.optionGroups[index];
114
+ if (group) {
115
+ group.values.push({ name: optionName, locked: false });
116
+ this.generateVariants();
117
+ this.optionsChanged = true;
118
+ }
119
+ }
120
+ removeOption(index, { id, name }) {
121
+ const optionGroup = this.optionGroups[index];
122
+ if (optionGroup) {
123
+ if (!id) {
124
+ optionGroup.values = optionGroup.values.filter(v => v.name !== name);
125
+ this.generateVariants();
126
+ }
127
+ else {
128
+ this.modalService
129
+ .dialog({
130
+ title: _('catalog.confirm-delete-product-option'),
131
+ translationVars: { name },
132
+ buttons: [
133
+ { type: 'secondary', label: _('common.cancel') },
134
+ { type: 'danger', label: _('common.delete'), returnValue: true },
135
+ ],
136
+ })
137
+ .pipe(switchMap(val => {
138
+ if (val) {
139
+ return this.dataService.product.deleteProductOption(id);
140
+ }
141
+ else {
142
+ return EMPTY;
143
+ }
144
+ }))
145
+ .subscribe(({ deleteProductOption }) => {
146
+ if (deleteProductOption.result === DeletionResult.DELETED) {
147
+ this.notificationService.success(_('common.notify-delete-success'), {
148
+ entity: 'ProductOption',
149
+ });
150
+ optionGroup.values = optionGroup.values.filter(v => v.id !== id);
151
+ this.generateVariants();
152
+ this.optionsChanged = true;
153
+ }
154
+ else {
155
+ this.notificationService.error(deleteProductOption.message ?? '');
156
+ }
157
+ });
158
+ }
159
+ }
66
160
  }
67
161
  generateVariants() {
68
162
  const groups = this.optionGroups.map(g => g.values);
@@ -103,10 +197,11 @@ export class ProductVariantsEditorComponent {
103
197
  stock: 0,
104
198
  };
105
199
  }
106
- deleteVariant(id) {
200
+ deleteVariant(id, options) {
107
201
  this.modalService
108
202
  .dialog({
109
203
  title: _('catalog.confirm-delete-product-variant'),
204
+ translationVars: { name: options.map(o => o.name).join(' ') },
110
205
  buttons: [
111
206
  { type: 'secondary', label: _('common.cancel') },
112
207
  { type: 'danger', label: _('common.delete'), returnValue: true },
@@ -125,6 +220,7 @@ export class ProductVariantsEditorComponent {
125
220
  });
126
221
  }
127
222
  save() {
223
+ this.optionGroups = this.optionGroups.filter(g => g.values.length);
128
224
  const newOptionGroups = this.optionGroups
129
225
  .filter(og => og.isNew)
130
226
  .map(og => ({
@@ -140,12 +236,14 @@ export class ProductVariantsEditorComponent {
140
236
  count: variants.length,
141
237
  });
142
238
  this.initOptionsAndVariants();
239
+ this.optionsChanged = false;
143
240
  },
144
241
  });
145
242
  }
146
243
  checkUniqueSkus() {
147
244
  const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {
148
- return this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant);
245
+ return (variant.enabled &&
246
+ this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant));
149
247
  });
150
248
  if (withDuplicateSkus.length) {
151
249
  return this.modalService
@@ -228,7 +326,7 @@ export class ProductVariantsEditorComponent {
228
326
  return forkJoin(groupsIds.map(id => this.dataService.product
229
327
  .getProductOptionGroup(id)
230
328
  .mapSingle(data => data.productOptionGroup)
231
- .pipe(filter(notNullOrUndefined))));
329
+ .pipe(filter(notNullOrUndefined)))).pipe(defaultIfEmpty([]));
232
330
  }
233
331
  createNewProductVariants(groups) {
234
332
  const options = groups
@@ -237,15 +335,23 @@ export class ProductVariantsEditorComponent {
237
335
  .reduce((flat, o) => [...flat, ...o], []);
238
336
  const variants = this.generatedVariants
239
337
  .filter(v => v.enabled && !v.existing)
240
- .map(v => ({
241
- price: v.price,
242
- sku: v.sku,
243
- stock: v.stock,
244
- optionIds: v.options
245
- .map(name => options.find(o => o.name === name.name))
246
- .filter(notNullOrUndefined)
247
- .map(o => o.id),
248
- }));
338
+ .map(v => {
339
+ const optionIds = groups.map((group, index) => {
340
+ const option = group.options.find(o => o.name === v.options[index].name);
341
+ if (option) {
342
+ return option.id;
343
+ }
344
+ else {
345
+ throw new Error(`Could not find a matching option for group ${group.name}`);
346
+ }
347
+ });
348
+ return {
349
+ price: v.price,
350
+ sku: v.sku,
351
+ stock: v.stock,
352
+ optionIds,
353
+ };
354
+ });
249
355
  return this.productDetailService.createProductVariants(this.product, variants, options, this.languageCode);
250
356
  }
251
357
  deleteObsoleteVariants(input) {
@@ -276,15 +382,20 @@ export class ProductVariantsEditorComponent {
276
382
  .mapSingle(({ product }) => product)
277
383
  .subscribe(p => {
278
384
  this.product = p;
385
+ const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();
386
+ const allUsedOptionGroupIds = p.variants
387
+ .map(v => v.options.map(option => option.groupId))
388
+ .flat();
279
389
  this.optionGroups = p.optionGroups.map(og => {
280
390
  return {
281
391
  id: og.id,
282
392
  isNew: false,
283
393
  name: og.name,
394
+ locked: allUsedOptionGroupIds.includes(og.id),
284
395
  values: og.options.map(o => ({
285
396
  id: o.id,
286
397
  name: o.name,
287
- locked: true,
398
+ locked: allUsedOptionIds.includes(o.id),
288
399
  })),
289
400
  };
290
401
  });
@@ -305,9 +416,9 @@ export class ProductVariantsEditorComponent {
305
416
  }
306
417
  }
307
418
  ProductVariantsEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ProductVariantsEditorComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.DataService }, { token: i3.ProductDetailService }, { token: i2.NotificationService }, { token: i2.ModalService }], target: i0.ɵɵFactoryTarget.Component });
308
- ProductVariantsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: ProductVariantsEditorComponent, selector: "vdr-product-variants-editor", ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"], components: [{ type: i2.ActionBarComponent, selector: "vdr-action-bar" }, { type: i2.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i4.OptionValueInputComponent, selector: "vdr-option-value-input", inputs: ["groupName"] }, { type: i5.ClrInputContainer, selector: "clr-input-container" }, { type: i2.CurrencyInputComponent, selector: "vdr-currency-input", inputs: ["disabled", "readonly", "value", "currencyCode"], outputs: ["valueChange"] }, { type: i2.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i2.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }, { type: i2.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.ClrInput, selector: "[clrInput]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeCurrency": i2.LocaleCurrencyPipe }, changeDetection: i0.ChangeDetectionStrategy.Default });
419
+ ProductVariantsEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: ProductVariantsEditorComponent, selector: "vdr-product-variants-editor", ngImport: i0, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(i, $event.name)\"\r\n (remove)=\"removeOption(i, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"], components: [{ type: i2.ActionBarComponent, selector: "vdr-action-bar" }, { type: i2.ActionBarRightComponent, selector: "vdr-ab-right", inputs: ["grow"] }, { type: i4.OptionValueInputComponent, selector: "vdr-option-value-input", inputs: ["groupName", "options", "disabled"], outputs: ["add", "remove", "edit"] }, { type: i5.ClrCheckboxWrapper, selector: "clr-checkbox-wrapper,clr-toggle-wrapper" }, { type: i5.ClrInputContainer, selector: "clr-input-container" }, { type: i2.CurrencyInputComponent, selector: "vdr-currency-input", inputs: ["disabled", "readonly", "value", "currencyCode"], outputs: ["valueChange"] }, { type: i2.DropdownComponent, selector: "vdr-dropdown", inputs: ["manualToggle"] }, { type: i2.DropdownMenuComponent, selector: "vdr-dropdown-menu", inputs: ["vdrPosition", "customClasses"] }], directives: [{ type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.ClrLabel, selector: "label", inputs: ["for"] }, { type: i2.FormFieldControlDirective, selector: "input, textarea, select" }, { type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5.ClrInput, selector: "[clrInput]" }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.ClrIconCustomTag, selector: "clr-icon" }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i5.ClrCheckbox, selector: "[clrCheckbox],[clrToggle]" }, { type: i7.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i7.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i7.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i2.DropdownTriggerDirective, selector: "[vdrDropdownTrigger]" }, { type: i2.DropdownItemDirective, selector: "[vdrDropdownItem]" }], pipes: { "translate": i8.TranslatePipe, "localeCurrency": i2.LocaleCurrencyPipe }, changeDetection: i0.ChangeDetectionStrategy.Default });
309
420
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: ProductVariantsEditorComponent, decorators: [{
310
421
  type: Component,
311
- args: [{ selector: 'vdr-product-variants-editor', changeDetection: ChangeDetectionStrategy.Default, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"!formValueChanged || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n</div>\r\n<button\r\n class=\"btn btn-primary-outline btn-sm\"\r\n (click)=\"addOption()\"\r\n>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.create' | translate }}</th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td>\r\n <input\r\n type=\"checkbox\"\r\n *ngIf=\"!variant.existing\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </td>\r\n <td>\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"] }]
422
+ args: [{ selector: 'vdr-product-variants-editor', changeDetection: ChangeDetectionStrategy.Default, template: "<vdr-action-bar>\r\n <vdr-ab-right>\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(!formValueChanged && !optionsChanged) || getVariantsToAdd().length === 0\"\r\n >\r\n {{ 'common.add-new-variants' | translate: { count: getVariantsToAdd().length } }}\r\n </button>\r\n </vdr-ab-right>\r\n</vdr-action-bar>\r\n\r\n<div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(i, $event.name)\"\r\n (remove)=\"removeOption(i, $event)\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div>\r\n <button\r\n [disabled]=\"group.locked\"\r\n class=\"btn btn-icon btn-danger-outline mt5\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"btn btn-primary-outline btn-sm\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<div class=\"variants-preview\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tr *ngFor=\"let variant of generatedVariants\" [class.disabled]=\"!variant.enabled || variant.existing\">\r\n <td class=\"left\">\r\n <clr-checkbox-wrapper *ngIf=\"!variant.existing\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"variant.enabled\"\r\n name=\"enabled\"\r\n clrCheckbox\r\n (ngModelChange)=\"formValueChanged = true\"\r\n />\r\n <label>{{ 'common.create' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </td>\r\n <td>\r\n {{ getVariantName(variant) | translate }}\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"text\"\r\n [(ngModel)]=\"variant.sku\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n name=\"sku\"\r\n required\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.sku }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <vdr-currency-input\r\n clrInput\r\n [(ngModel)]=\"variant.price\"\r\n name=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.price | localeCurrency: currencyCode }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"flex center\">\r\n <clr-input-container *ngIf=\"!variant.existing\">\r\n <input\r\n clrInput\r\n type=\"number\"\r\n [(ngModel)]=\"variant.stock\"\r\n name=\"stock\"\r\n min=\"0\"\r\n step=\"1\"\r\n (ngModelChange)=\"onFormChanged(variant)\"\r\n />\r\n </clr-input-container>\r\n <span *ngIf=\"variant.existing\">{{ variant.stock }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <vdr-dropdown *ngIf=\"variant.productVariantId as productVariantId\">\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteVariant(productVariantId, variant.options)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </table>\r\n</div>\r\n", styles: [".option-groups{display:flex}.option-groups:first-of-type{margin-top:24px}.values{flex:1;margin:0 6px}.variants-preview tr.disabled td{background-color:var(--color-component-bg-100);color:var(--color-grey-400)}\n"] }]
312
423
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.DataService }, { type: i3.ProductDetailService }, { type: i2.NotificationService }, { type: i2.ModalService }]; } });
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEUsT0FBTyxFQU1ILG9CQUFvQixHQU12QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0YsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHbEUsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sOEVBQThFLENBQUM7Ozs7Ozs7Ozs7QUFFckksTUFBTSxPQUFPLGdCQUFnQjtJQVV6QixZQUFZLE1BQWlDO1FBQ3pD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QUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUN6QixFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO3dCQUNaLE1BQU0sRUFBRSxJQUFJO3FCQUNmLENBQUMsQ0FBQztpQkFDTixDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTyxlQUFlLENBQUMsQ0FBMEIsRUFBRSxDQUEwQjtRQUMxRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsQ0FBMEIsRUFBRSxDQUEwQjtRQUMzRSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sY0FBYyxDQUFDLENBQTBCO1FBQzdDLE9BQU8sQ0FBQzthQUNILEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDaEIsSUFBSSxFQUFFO2FBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7OzJIQWpYUSw4QkFBOEI7K0dBQTlCLDhCQUE4QixtRUNqRDNDLG9uS0EySEE7MkZEMUVhLDhCQUE4QjtrQkFOMUMsU0FBUzsrQkFDSSw2QkFBNkIsbUJBR3RCLHVCQUF1QixDQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBtYXJrZXIgYXMgXyB9IGZyb20gJ0BiaWVzYmplcmcvbmd4LXRyYW5zbGF0ZS1leHRyYWN0LW1hcmtlcic7XHJcbmltcG9ydCB7XHJcbiAgICBDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvbixcclxuICAgIENyZWF0ZVByb2R1Y3RPcHRpb25JbnB1dCxcclxuICAgIEN1cnJlbmN5Q29kZSxcclxuICAgIERhdGFTZXJ2aWNlLFxyXG4gICAgRGVhY3RpdmF0ZUF3YXJlLFxyXG4gICAgZ2V0RGVmYXVsdFVpTGFuZ3VhZ2UsXHJcbiAgICBHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeSxcclxuICAgIExhbmd1YWdlQ29kZSxcclxuICAgIE1vZGFsU2VydmljZSxcclxuICAgIE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50LFxyXG59IGZyb20gJ0B2ZW5kdXJlL2FkbWluLXVpL2NvcmUnO1xyXG5pbXBvcnQgeyBub3JtYWxpemVTdHJpbmcgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL25vcm1hbGl6ZS1zdHJpbmcnO1xyXG5pbXBvcnQgeyBwaWNrIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9waWNrJztcclxuaW1wb3J0IHsgZ2VuZXJhdGVBbGxDb21iaW5hdGlvbnMsIG5vdE51bGxPclVuZGVmaW5lZCB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvc2hhcmVkLXV0aWxzJztcclxuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi91bmlxdWUnO1xyXG5pbXBvcnQgeyBFTVBUWSwgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUHJvZHVjdERldGFpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvcHJvZHVjdC1kZXRhaWwvcHJvZHVjdC1kZXRhaWwuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpcm1WYXJpYW50RGVsZXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtLXZhcmlhbnQtZGVsZXRpb24tZGlhbG9nL2NvbmZpcm0tdmFyaWFudC1kZWxldGlvbi1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0ZWRWYXJpYW50IHtcclxuICAgIGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICAgIG9wdGlvbnM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBpZD86IHN0cmluZyB9PjtcclxuICAgIHByb2R1Y3RWYXJpYW50SWQ/OiBzdHJpbmc7XHJcbiAgICBlbmFibGVkOiBib29sZWFuO1xyXG4gICAgZXhpc3Rpbmc6IGJvb2xlYW47XHJcbiAgICBza3U6IHN0cmluZztcclxuICAgIHByaWNlOiBudW1iZXI7XHJcbiAgICBzdG9jazogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxHZW5lcmF0ZWRWYXJpYW50Pikge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcclxuICAgICAgICAgICAgdGhpc1trZXldID0gY29uZmlnW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAndmRyLXByb2R1Y3QtdmFyaWFudHMtZWRpdG9yJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxyXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZHVjdFZhcmlhbnRzRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBEZWFjdGl2YXRlQXdhcmUge1xyXG4gICAgZm9ybVZhbHVlQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgZ2VuZXJhdGVkVmFyaWFudHM6IEdlbmVyYXRlZFZhcmlhbnRbXSA9IFtdO1xyXG4gICAgb3B0aW9uR3JvdXBzOiBBcnJheTx7XHJcbiAgICAgICAgaWQ/OiBzdHJpbmc7XHJcbiAgICAgICAgaXNOZXc6IGJvb2xlYW47XHJcbiAgICAgICAgbmFtZTogc3RyaW5nO1xyXG4gICAgICAgIHZhbHVlczogQXJyYXk8e1xyXG4gICAgICAgICAgICBpZD86IHN0cmluZztcclxuICAgICAgICAgICAgbmFtZTogc3RyaW5nO1xyXG4gICAgICAgICAgICBsb2NrZWQ6IGJvb2xlYW47XHJcbiAgICAgICAgfT47XHJcbiAgICB9PjtcclxuICAgIHByb2R1Y3Q6IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+O1xyXG4gICAgY3VycmVuY3lDb2RlOiBDdXJyZW5jeUNvZGU7XHJcbiAgICBwcml2YXRlIGxhbmd1YWdlQ29kZTogTGFuZ3VhZ2VDb2RlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcHJvZHVjdERldGFpbFNlcnZpY2U6IFByb2R1Y3REZXRhaWxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VDb2RlID1cclxuICAgICAgICAgICAgKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdsYW5nJykgYXMgTGFuZ3VhZ2VDb2RlKSB8fCBnZXREZWZhdWx0VWlMYW5ndWFnZSgpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2Uuc2V0dGluZ3MuZ2V0QWN0aXZlQ2hhbm5lbCgpLnNpbmdsZSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5Q29kZSA9IGRhdGEuYWN0aXZlQ2hhbm5lbC5jdXJyZW5jeUNvZGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3JtQ2hhbmdlZCh2YXJpYW50SW5mbzogR2VuZXJhdGVkVmFyaWFudCkge1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgdmFyaWFudEluZm8uZW5hYmxlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuRGVhY3RpdmF0ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZm9ybVZhbHVlQ2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYXJpYW50c1RvQWRkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbHRlcih2ID0+ICF2LmV4aXN0aW5nICYmIHYuZW5hYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudE5hbWUodmFyaWFudDogR2VuZXJhdGVkVmFyaWFudCkge1xyXG4gICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgICAgICAgID8gXygnY2F0YWxvZy5kZWZhdWx0LXZhcmlhbnQnKVxyXG4gICAgICAgICAgICA6IHZhcmlhbnQub3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmpvaW4oJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRPcHRpb24oKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMucHVzaCh7XHJcbiAgICAgICAgICAgIGlzTmV3OiB0cnVlLFxyXG4gICAgICAgICAgICBuYW1lOiAnJyxcclxuICAgICAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZVZhcmlhbnRzKCkge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLm1hcChnID0+IGcudmFsdWVzKTtcclxuICAgICAgICBjb25zdCBwcmV2aW91c1ZhcmlhbnRzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cztcclxuICAgICAgICBjb25zdCBnZW5lcmF0ZWRWYXJpYW50RmFjdG9yeSA9IChcclxuICAgICAgICAgICAgaXNEZWZhdWx0OiBib29sZWFuLFxyXG4gICAgICAgICAgICBvcHRpb25zOiBHZW5lcmF0ZWRWYXJpYW50WydvcHRpb25zJ10sXHJcbiAgICAgICAgICAgIGV4aXN0aW5nVmFyaWFudD86IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+Wyd2YXJpYW50cyddW251bWJlcl0sXHJcbiAgICAgICAgICAgIHByb3RvdHlwZVZhcmlhbnQ/OiBOb25OdWxsYWJsZTxHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeVsncHJvZHVjdCddPlsndmFyaWFudHMnXVtudW1iZXJdLFxyXG4gICAgICAgICk6IEdlbmVyYXRlZFZhcmlhbnQgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSB0aGlzLmdldFZhcmlhbnRQcm90b3R5cGUob3B0aW9ucywgcHJldmlvdXNWYXJpYW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJhdGVkVmFyaWFudCh7XHJcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZXhpc3Rpbmc6ICEhZXhpc3RpbmdWYXJpYW50LFxyXG4gICAgICAgICAgICAgICAgcHJvZHVjdFZhcmlhbnRJZDogZXhpc3RpbmdWYXJpYW50Py5pZCxcclxuICAgICAgICAgICAgICAgIGlzRGVmYXVsdCxcclxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgICAgICAgICBwcmljZTogZXhpc3RpbmdWYXJpYW50Py5wcmljZSA/PyBwcm90b3R5cGVWYXJpYW50Py5wcmljZSA/PyBwcm90b3R5cGUucHJpY2UsXHJcbiAgICAgICAgICAgICAgICBza3U6IGV4aXN0aW5nVmFyaWFudD8uc2t1ID8/IHByb3RvdHlwZVZhcmlhbnQ/LnNrdSA/PyBwcm90b3R5cGUuc2t1LFxyXG4gICAgICAgICAgICAgICAgc3RvY2s6IGV4aXN0aW5nVmFyaWFudD8uc3RvY2tPbkhhbmQgPz8gcHJvdG90eXBlVmFyaWFudD8uc3RvY2tPbkhhbmQgPz8gcHJvdG90eXBlLnN0b2NrLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMgPSBncm91cHMubGVuZ3RoXHJcbiAgICAgICAgICAgID8gZ2VuZXJhdGVBbGxDb21iaW5hdGlvbnMoZ3JvdXBzKS5tYXAob3B0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nVmFyaWFudCA9IHRoaXMucHJvZHVjdC52YXJpYW50cy5maW5kKHYgPT5cclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0FyZUVxdWFsKHYub3B0aW9ucywgb3B0aW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3RvdHlwZVZhcmlhbnQgPSB0aGlzLnByb2R1Y3QudmFyaWFudHMuZmluZCh2ID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNBcmVTdWJzZXQodi5vcHRpb25zLCBvcHRpb25zKSxcclxuICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlZFZhcmlhbnRGYWN0b3J5KGZhbHNlLCBvcHRpb25zLCBleGlzdGluZ1ZhcmlhbnQsIHByb3RvdHlwZVZhcmlhbnQpO1xyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIDogW2dlbmVyYXRlZFZhcmlhbnRGYWN0b3J5KHRydWUsIFtdLCB0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0pXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgb25lIG9mIHRoZSBleGlzdGluZyB2YXJpYW50cyB0byBiYXNlIHRoZSBuZXdseS1nZW5lcmF0ZWQgdmFyaWFudCdzXHJcbiAgICAgKiBkZXRhaWxzIG9mZi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRWYXJpYW50UHJvdG90eXBlKFxyXG4gICAgICAgIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSxcclxuICAgICAgICBwcmV2aW91c1ZhcmlhbnRzOiBHZW5lcmF0ZWRWYXJpYW50W10sXHJcbiAgICApOiBQaWNrPEdlbmVyYXRlZFZhcmlhbnQsICdza3UnIHwgJ3ByaWNlJyB8ICdzdG9jayc+IHtcclxuICAgICAgICBjb25zdCB2YXJpYW50c1dpdGhTaW1pbGFyT3B0aW9ucyA9IHByZXZpb3VzVmFyaWFudHMuZmlsdGVyKHYgPT5cclxuICAgICAgICAgICAgb3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmZpbHRlcihuYW1lID0+IHYub3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmluY2x1ZGVzKG5hbWUpKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICh2YXJpYW50c1dpdGhTaW1pbGFyT3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHBpY2socHJldmlvdXNWYXJpYW50c1swXSwgWydza3UnLCAncHJpY2UnLCAnc3RvY2snXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNrdTogJycsXHJcbiAgICAgICAgICAgIHByaWNlOiAwLFxyXG4gICAgICAgICAgICBzdG9jazogMCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVZhcmlhbnQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC12YXJpYW50JyksXHJcbiAgICAgICAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2RhbmdlcicsIGxhYmVsOiBfKCdjb21tb24uZGVsZXRlJyksIHJldHVyblZhbHVlOiB0cnVlIH0sXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChyZXNwb25zZSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID8gdGhpcy5wcm9kdWN0RGV0YWlsU2VydmljZS5kZWxldGVQcm9kdWN0VmFyaWFudChpZCwgdGhpcy5wcm9kdWN0LmlkKSA6IEVNUFRZLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnJlRmV0Y2hQcm9kdWN0KG51bGwpKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6ICdQcm9kdWN0VmFyaWFudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0T3B0aW9uc0FuZFZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuZXJyb3IoXygnY29tbW9uLm5vdGlmeS1kZWxldGUtZXJyb3InKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6ICdQcm9kdWN0VmFyaWFudCcsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmUoKSB7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uR3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihvZyA9PiBvZy5pc05ldylcclxuICAgICAgICAgICAgLm1hcChvZyA9PiAoe1xyXG4gICAgICAgICAgICAgICAgbmFtZTogb2cubmFtZSxcclxuICAgICAgICAgICAgICAgIHZhbHVlczogW10sXHJcbiAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAgICAgdGhpcy5jaGVja1VuaXF1ZVNrdXMoKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKCgpID0+IHRoaXMuY29uZmlybURlbGV0aW9uT2ZPYnNvbGV0ZVZhcmlhbnRzKCkpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3REZXRhaWxTZXJ2aWNlLmNyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cHMobmV3T3B0aW9uR3JvdXBzLCB0aGlzLmxhbmd1YWdlQ29kZSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoY3JlYXRlZE9wdGlvbkdyb3VwcyA9PiB0aGlzLmFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChjcmVhdGVkT3B0aW9uR3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChjcmVhdGVkT3B0aW9uR3JvdXBzID0+IHRoaXMuYWRkTmV3T3B0aW9uc1RvR3JvdXBzKGNyZWF0ZWRPcHRpb25Hcm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGdyb3Vwc0lkcyA9PiB0aGlzLmZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoZ3JvdXBzID0+IHRoaXMuY3JlYXRlTmV3UHJvZHVjdFZhcmlhbnRzKGdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAocmVzID0+IHRoaXMuZGVsZXRlT2Jzb2xldGVWYXJpYW50cyhyZXMuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCh2YXJpYW50cyA9PiB0aGlzLnJlRmV0Y2hQcm9kdWN0KHZhcmlhbnRzKSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiB2YXJpYW50cyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY2F0YWxvZy5jcmVhdGVkLW5ldy12YXJpYW50cy1zdWNjZXNzJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IHZhcmlhbnRzLmxlbmd0aCxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zQW5kVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tVbmlxdWVTa3VzKCkge1xyXG4gICAgICAgIGNvbnN0IHdpdGhEdXBsaWNhdGVTa3VzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIoKHZhcmlhbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbmQoZ3YgPT4gZ3Yuc2t1LnRyaW0oKSA9PT0gdmFyaWFudC5za3UudHJpbSgpICYmIGd2ICE9PSB2YXJpYW50KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAod2l0aER1cGxpY2F0ZVNrdXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmRpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuZHVwbGljYXRlLXNrdS13YXJuaW5nJyksXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keTogdW5pcXVlKHdpdGhEdXBsaWNhdGVTa3VzLm1hcCh2ID0+IGAke3Yuc2t1fWApKS5qb2luKCcsICcpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFt7IGxhYmVsOiBfKCdjb21tb24uY2xvc2UnKSwgcmV0dXJuVmFsdWU6IGZhbHNlLCB0eXBlOiAncHJpbWFyeScgfV0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnBpcGUobWVyZ2VNYXAocmVzID0+IEVNUFRZKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbmZpcm1EZWxldGlvbk9mT2Jzb2xldGVWYXJpYW50cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICBjb25zdCBvYnNvbGV0ZVZhcmlhbnRzID0gdGhpcy5nZXRPYnNvbGV0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgaWYgKG9ic29sZXRlVmFyaWFudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmZyb21Db21wb25lbnQoQ29uZmlybVZhcmlhbnREZWxldGlvbkRpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2Fsczoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50czogb2Jzb2xldGVWYXJpYW50cyxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIG1lcmdlTWFwKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMgPT09IHRydWUgPyBvZih0cnVlKSA6IEVNUFRZO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2Jzb2xldGVWYXJpYW50cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbHRlcihcclxuICAgICAgICAgICAgdmFyaWFudCA9PiAhdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maW5kKGd2ID0+IGd2LnByb2R1Y3RWYXJpYW50SWQgPT09IHZhcmlhbnQuaWQpLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYXNPbmx5RGVmYXVsdFZhcmlhbnQocHJvZHVjdDogTm9uTnVsbGFibGU8R2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zUXVlcnlbJ3Byb2R1Y3QnXT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gcHJvZHVjdC52YXJpYW50cy5sZW5ndGggPT09IDEgJiYgcHJvZHVjdC5vcHRpb25Hcm91cHMubGVuZ3RoID09PSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkT3B0aW9uR3JvdXBzVG9Qcm9kdWN0KFxyXG4gICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHM6IEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4sXHJcbiAgICApOiBPYnNlcnZhYmxlPEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4+IHtcclxuICAgICAgICBpZiAoY3JlYXRlZE9wdGlvbkdyb3Vwcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAob3B0aW9uR3JvdXAgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uR3JvdXBUb1Byb2R1Y3Qoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uR3JvdXBJZDogb3B0aW9uR3JvdXAuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKS5waXBlKG1hcCgoKSA9PiBjcmVhdGVkT3B0aW9uR3JvdXBzKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGROZXdPcHRpb25zVG9Hcm91cHMoXHJcbiAgICAgICAgY3JlYXRlZE9wdGlvbkdyb3VwczogQXJyYXk8Q3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwTXV0YXRpb25bJ2NyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cCddPixcclxuICAgICk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcclxuICAgICAgICBjb25zdCBuZXdPcHRpb25zOiBDcmVhdGVQcm9kdWN0T3B0aW9uSW5wdXRbXSA9IHRoaXMub3B0aW9uR3JvdXBzXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY3JlYXRlZEdyb3VwID0gY3JlYXRlZE9wdGlvbkdyb3Vwcy5maW5kKGNvZyA9PiBjb2cubmFtZSA9PT0gb2cubmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9kdWN0T3B0aW9uR3JvdXBJZCA9IGNyZWF0ZWRHcm91cCA/IGNyZWF0ZWRHcm91cC5pZCA6IG9nLmlkO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFwcm9kdWN0T3B0aW9uR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBhIHByb2R1Y3RPcHRpb25Hcm91cElkJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb2cudmFsdWVzXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih2ID0+ICF2LmxvY2tlZClcclxuICAgICAgICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdE9wdGlvbkdyb3VwSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IG5vcm1hbGl6ZVN0cmluZyh2Lm5hbWUsICctJyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uczogW3sgbmFtZTogdi5uYW1lLCBsYW5ndWFnZUNvZGU6IHRoaXMubGFuZ3VhZ2VDb2RlIH1dLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgb3B0aW9ucykgPT4gWy4uLmZsYXQsIC4uLm9wdGlvbnNdLCBbXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGFsbEdyb3VwSWRzID0gW1xyXG4gICAgICAgICAgICAuLi5jcmVhdGVkT3B0aW9uR3JvdXBzLm1hcChnID0+IGcuaWQpLFxyXG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLmlkKS5maWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBpZiAobmV3T3B0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG5ld09wdGlvbnMubWFwKGlucHV0ID0+IHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5hZGRPcHRpb25Ub0dyb3VwKGlucHV0KSkpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gYWxsR3JvdXBJZHMpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihhbGxHcm91cElkcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmV0Y2hPcHRpb25Hcm91cHMoZ3JvdXBzSWRzOiBzdHJpbmdbXSk6IE9ic2VydmFibGU8UHJvZHVjdE9wdGlvbkdyb3VwV2l0aE9wdGlvbnNGcmFnbWVudFtdPiB7XHJcbiAgICAgICAgcmV0dXJuIGZvcmtKb2luKFxyXG4gICAgICAgICAgICBncm91cHNJZHMubWFwKGlkID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3RcclxuICAgICAgICAgICAgICAgICAgICAuZ2V0UHJvZHVjdE9wdGlvbkdyb3VwKGlkKVxyXG4gICAgICAgICAgICAgICAgICAgIC5tYXBTaW5nbGUoZGF0YSA9PiBkYXRhLnByb2R1Y3RPcHRpb25Hcm91cClcclxuICAgICAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIobm90TnVsbE9yVW5kZWZpbmVkKSksXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5ld1Byb2R1Y3RWYXJpYW50cyhncm91cHM6IFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBncm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4gb2cub3B0aW9ucylcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgbykgPT4gWy4uLmZsYXQsIC4uLm9dLCBbXSk7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzXHJcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmVuYWJsZWQgJiYgIXYuZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIC5tYXAodiA9PiAoe1xyXG4gICAgICAgICAgICAgICAgcHJpY2U6IHYucHJpY2UsXHJcbiAgICAgICAgICAgICAgICBza3U6IHYuc2t1LFxyXG4gICAgICAgICAgICAgICAgc3RvY2s6IHYuc3RvY2ssXHJcbiAgICAgICAgICAgICAgICBvcHRpb25JZHM6IHYub3B0aW9uc1xyXG4gICAgICAgICAgICAgICAgICAgIC5tYXAobmFtZSA9PiBvcHRpb25zLmZpbmQobyA9PiBvLm5hbWUgPT09IG5hbWUubmFtZSkpXHJcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcChvID0+IG8uaWQpLFxyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuY3JlYXRlUHJvZHVjdFZhcmlhbnRzKFxyXG4gICAgICAgICAgICB0aGlzLnByb2R1Y3QsXHJcbiAgICAgICAgICAgIHZhcmlhbnRzLFxyXG4gICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICB0aGlzLmxhbmd1YWdlQ29kZSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZGVsZXRlT2Jzb2xldGVWYXJpYW50czxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VCB8IFRbXT4ge1xyXG4gICAgICAgIGNvbnN0IG9ic29sZXRlVmFyaWFudHMgPSB0aGlzLmdldE9ic29sZXRlVmFyaWFudHMoKTtcclxuICAgICAgICBpZiAob2Jzb2xldGVWYXJpYW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgZGVsZXRlT3BlcmF0aW9ucyA9IG9ic29sZXRlVmFyaWFudHMubWFwKHYgPT5cclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdC5kZWxldGVQcm9kdWN0VmFyaWFudCh2LmlkKS5waXBlKG1hcCgoKSA9PiBpbnB1dCkpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oLi4uZGVsZXRlT3BlcmF0aW9ucyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGlucHV0KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZUZldGNoUHJvZHVjdDxUPihpbnB1dDogVCk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgICAgIC8vIFJlLWZldGNoIHRoZSBQcm9kdWN0IHRvIGZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgdmlldy5cclxuICAgICAgICBjb25zdCBpZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpO1xyXG4gICAgICAgIGlmIChpZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmdldFByb2R1Y3QoaWQpLnNpbmdsZSQucGlwZShtYXAoKCkgPT4gaW5wdXQpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0T3B0aW9uc0FuZFZhcmlhbnRzKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UucHJvZHVjdFxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgIC5nZXRQcm9kdWN0VmFyaWFudHNPcHRpb25zKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdpZCcpISlcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW5vbi1udWxsLWFzc2VydGlvblxyXG4gICAgICAgICAgICAubWFwU2luZ2xlKCh7IHByb2R1Y3QgfSkgPT4gcHJvZHVjdCEpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUocCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3QgPSBwO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSBwLm9wdGlvbkdyb3Vwcy5tYXAob2cgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvZy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IG9nLm9wdGlvbnMubWFwKG8gPT4gKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogby5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9ja2VkOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZUVxdWFsKGE6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+LCBiOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvT3B0aW9uU3RyaW5nKGEpID09PSB0aGlzLnRvT3B0aW9uU3RyaW5nKGIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgb3B0aW9uc0FyZVN1YnNldChhOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9PiwgYjogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b09wdGlvblN0cmluZyhiKS5pbmNsdWRlcyh0aGlzLnRvT3B0aW9uU3RyaW5nKGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRvT3B0aW9uU3RyaW5nKG86IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gb1xyXG4gICAgICAgICAgICAubWFwKHggPT4geC5uYW1lKVxyXG4gICAgICAgICAgICAuc29ydCgpXHJcbiAgICAgICAgICAgIC5qb2luKCd8Jyk7XHJcbiAgICB9XHJcbn1cclxuIiwiPHZkci1hY3Rpb24tYmFyPlxyXG4gICAgPHZkci1hYi1yaWdodD5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNhdmUoKVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhZm9ybVZhbHVlQ2hhbmdlZCB8fCBnZXRWYXJpYW50c1RvQWRkKCkubGVuZ3RoID09PSAwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7ICdjb21tb24uYWRkLW5ldy12YXJpYW50cycgfCB0cmFuc2xhdGU6IHsgY291bnQ6IGdldFZhcmlhbnRzVG9BZGQoKS5sZW5ndGggfSB9fVxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC92ZHItYWItcmlnaHQ+XHJcbjwvdmRyLWFjdGlvbi1iYXI+XHJcblxyXG48ZGl2ICpuZ0Zvcj1cImxldCBncm91cCBvZiBvcHRpb25Hcm91cHNcIiBjbGFzcz1cIm9wdGlvbi1ncm91cHNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJuYW1lXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgIDxpbnB1dCBjbHJJbnB1dCBbKG5nTW9kZWwpXT1cImdyb3VwLm5hbWVcIiBuYW1lPVwibmFtZVwiIFtyZWFkb25seV09XCIhZ3JvdXAuaXNOZXdcIiAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwidmFsdWVzXCI+XHJcbiAgICAgICAgPGxhYmVsPnt7ICdjYXRhbG9nLm9wdGlvbi12YWx1ZXMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICA8dmRyLW9wdGlvbi12YWx1ZS1pbnB1dFxyXG4gICAgICAgICAgICAjb3B0aW9uVmFsdWVJbnB1dENvbXBvbmVudFxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImdyb3VwLnZhbHVlc1wiXHJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImdlbmVyYXRlVmFyaWFudHMoKVwiXHJcbiAgICAgICAgICAgIFtncm91cE5hbWVdPVwiZ3JvdXAubmFtZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5uYW1lID09PSAnJ1wiXHJcbiAgICAgICAgPjwvdmRyLW9wdGlvbi12YWx1ZS1pbnB1dD5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGJ1dHRvblxyXG4gICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnktb3V0bGluZSBidG4tc21cIlxyXG4gICAgKGNsaWNrKT1cImFkZE9wdGlvbigpXCJcclxuPlxyXG4gICAgPGNsci1pY29uIHNoYXBlPVwicGx1c1wiPjwvY2xyLWljb24+XHJcbiAgICB7eyAnY2F0YWxvZy5hZGQtb3B0aW9uJyB8IHRyYW5zbGF0ZSB9fVxyXG48L2J1dHRvbj5cclxuXHJcbjxkaXYgY2xhc3M9XCJ2YXJpYW50cy1wcmV2aWV3XCI+XHJcbiAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZVwiPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjb21tb24uY3JlYXRlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2NhdGFsb2cudmFyaWFudCcgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnNrdScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnByaWNlJyB8IHRyYW5zbGF0ZSB9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICA8dGg+e3sgJ2NhdGFsb2cuc3RvY2stb24taGFuZCcgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHZhcmlhbnQgb2YgZ2VuZXJhdGVkVmFyaWFudHNcIiBbY2xhc3MuZGlzYWJsZWRdPVwiIXZhcmlhbnQuZW5hYmxlZCB8fCB2YXJpYW50LmV4aXN0aW5nXCI+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YXJpYW50LmVuYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJlbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBjbHJDaGVja2JveFxyXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImZvcm1WYWx1ZUNoYW5nZWQgPSB0cnVlXCJcclxuICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIHt7IGdldFZhcmlhbnROYW1lKHZhcmlhbnQpIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxjbHItaW5wdXQtY29udGFpbmVyICpuZ0lmPVwiIXZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQuc2t1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidjYXRhbG9nLnNrdScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic2t1XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgIDwvY2xyLWlucHV0LWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFyaWFudC5leGlzdGluZ1wiPnt7IHZhcmlhbnQuc2t1IH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8Y2xyLWlucHV0LWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpYW50LmV4aXN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHZkci1jdXJyZW5jeS1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbHJJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQucHJpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicHJpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3lDb2RlXT1cImN1cnJlbmN5Q29kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uRm9ybUNoYW5nZWQodmFyaWFudClcIlxyXG4gICAgICAgICAgICAgICAgICAgID48L3Zkci1jdXJyZW5jeS1pbnB1dD5cclxuICAgICAgICAgICAgICAgIDwvY2xyLWlucHV0LWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFyaWFudC5leGlzdGluZ1wiPnt7IHZhcmlhbnQucHJpY2UgfCBsb2NhbGVDdXJyZW5jeTogY3VycmVuY3lDb2RlIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8Y2xyLWlucHV0LWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpYW50LmV4aXN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNscklucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQuc3RvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW49XCIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcD1cIjFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2VkKHZhcmlhbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPC9jbHItaW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5zdG9jayB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPHZkci1kcm9wZG93biAqbmdJZj1cInZhcmlhbnQucHJvZHVjdFZhcmlhbnRJZCBhcyBwcm9kdWN0VmFyaWFudElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnV0dG9uXCIgdmRyRHJvcGRvd25UcmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJlbGxpcHNpcy12ZXJ0aWNhbFwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHZkci1kcm9wZG93bi1tZW51IHZkclBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZWxldGUtYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVWYXJpYW50KHByb2R1Y3RWYXJpYW50SWQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkckRyb3Bkb3duSXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xyLWljb24gc2hhcGU9XCJ0cmFzaFwiIGNsYXNzPVwiaXMtZGFuZ2VyXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdjb21tb24uZGVsZXRlJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3Zkci1kcm9wZG93bi1tZW51PlxyXG4gICAgICAgICAgICAgICAgPC92ZHItZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgIDwvdGFibGU+XHJcbjwvZGl2PlxyXG4iXX0=
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC12YXJpYW50cy1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jYXRhbG9nL3NyYy9jb21wb25lbnRzL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY2F0YWxvZy9zcmMvY29tcG9uZW50cy9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci9wcm9kdWN0LXZhcmlhbnRzLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTNFLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDdEUsT0FBTyxFQU1ILGNBQWMsRUFDZCxvQkFBb0IsR0FNdkIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDdkUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQy9GLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdsRixPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQzs7Ozs7Ozs7OztBQUVySSxNQUFNLE9BQU8sZ0JBQWdCO0lB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QUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7YUFDaEIsSUFBSSxFQUFFO2FBQ04sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLENBQUM7OzJIQXpkUSw4QkFBOEI7K0dBQTlCLDhCQUE4QixtRUM5RDNDLGk4TEF3SUE7MkZEMUVhLDhCQUE4QjtrQkFOMUMsU0FBUzsrQkFDSSw2QkFBNkIsbUJBR3RCLHVCQUF1QixDQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBtYXJrZXIgYXMgXyB9IGZyb20gJ0BiaWVzYmplcmcvbmd4LXRyYW5zbGF0ZS1leHRyYWN0LW1hcmtlcic7XHJcbmltcG9ydCB7XHJcbiAgICBDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvbixcclxuICAgIENyZWF0ZVByb2R1Y3RPcHRpb25JbnB1dCxcclxuICAgIEN1cnJlbmN5Q29kZSxcclxuICAgIERhdGFTZXJ2aWNlLFxyXG4gICAgRGVhY3RpdmF0ZUF3YXJlLFxyXG4gICAgRGVsZXRpb25SZXN1bHQsXHJcbiAgICBnZXREZWZhdWx0VWlMYW5ndWFnZSxcclxuICAgIEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5LFxyXG4gICAgTGFuZ3VhZ2VDb2RlLFxyXG4gICAgTW9kYWxTZXJ2aWNlLFxyXG4gICAgTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgIFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnQsXHJcbn0gZnJvbSAnQHZlbmR1cmUvYWRtaW4tdWkvY29yZSc7XHJcbmltcG9ydCB7IG5vcm1hbGl6ZVN0cmluZyB9IGZyb20gJ0B2ZW5kdXJlL2NvbW1vbi9saWIvbm9ybWFsaXplLXN0cmluZyc7XHJcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3BpY2snO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZUFsbENvbWJpbmF0aW9ucywgbm90TnVsbE9yVW5kZWZpbmVkIH0gZnJvbSAnQHZlbmR1cmUvY29tbW9uL2xpYi9zaGFyZWQtdXRpbHMnO1xyXG5pbXBvcnQgeyB1bmlxdWUgfSBmcm9tICdAdmVuZHVyZS9jb21tb24vbGliL3VuaXF1ZSc7XHJcbmltcG9ydCB7IEVNUFRZLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVmYXVsdElmRW1wdHksIGZpbHRlciwgbWFwLCBtZXJnZU1hcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUHJvZHVjdERldGFpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvcHJvZHVjdC1kZXRhaWwvcHJvZHVjdC1kZXRhaWwuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpcm1WYXJpYW50RGVsZXRpb25EaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi9jb25maXJtLXZhcmlhbnQtZGVsZXRpb24tZGlhbG9nL2NvbmZpcm0tdmFyaWFudC1kZWxldGlvbi1kaWFsb2cuY29tcG9uZW50JztcclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmF0ZWRWYXJpYW50IHtcclxuICAgIGlzRGVmYXVsdDogYm9vbGVhbjtcclxuICAgIG9wdGlvbnM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBpZD86IHN0cmluZyB9PjtcclxuICAgIHByb2R1Y3RWYXJpYW50SWQ/OiBzdHJpbmc7XHJcbiAgICBlbmFibGVkOiBib29sZWFuO1xyXG4gICAgZXhpc3Rpbmc6IGJvb2xlYW47XHJcbiAgICBza3U6IHN0cmluZztcclxuICAgIHByaWNlOiBudW1iZXI7XHJcbiAgICBzdG9jazogbnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxHZW5lcmF0ZWRWYXJpYW50Pikge1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcclxuICAgICAgICAgICAgdGhpc1trZXldID0gY29uZmlnW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgT3B0aW9uR3JvdXBVaU1vZGVsIHtcclxuICAgIGlkPzogc3RyaW5nO1xyXG4gICAgaXNOZXc6IGJvb2xlYW47XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICBsb2NrZWQ6IGJvb2xlYW47XHJcbiAgICB2YWx1ZXM6IEFycmF5PHtcclxuICAgICAgICBpZD86IHN0cmluZztcclxuICAgICAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICAgICAgbG9ja2VkOiBib29sZWFuO1xyXG4gICAgfT47XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd2ZHItcHJvZHVjdC12YXJpYW50cy1lZGl0b3InLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3Byb2R1Y3QtdmFyaWFudHMtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9kdWN0VmFyaWFudHNFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERlYWN0aXZhdGVBd2FyZSB7XHJcbiAgICBmb3JtVmFsdWVDaGFuZ2VkID0gZmFsc2U7XHJcbiAgICBvcHRpb25zQ2hhbmdlZCA9IGZhbHNlO1xyXG4gICAgZ2VuZXJhdGVkVmFyaWFudHM6IEdlbmVyYXRlZFZhcmlhbnRbXSA9IFtdO1xyXG4gICAgb3B0aW9uR3JvdXBzOiBPcHRpb25Hcm91cFVpTW9kZWxbXTtcclxuICAgIHByb2R1Y3Q6IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+O1xyXG4gICAgY3VycmVuY3lDb2RlOiBDdXJyZW5jeUNvZGU7XHJcbiAgICBwcml2YXRlIGxhbmd1YWdlQ29kZTogTGFuZ3VhZ2VDb2RlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgZGF0YVNlcnZpY2U6IERhdGFTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgcHJvZHVjdERldGFpbFNlcnZpY2U6IFByb2R1Y3REZXRhaWxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgKSB7fVxyXG5cclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgIHRoaXMubGFuZ3VhZ2VDb2RlID1cclxuICAgICAgICAgICAgKHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdsYW5nJykgYXMgTGFuZ3VhZ2VDb2RlKSB8fCBnZXREZWZhdWx0VWlMYW5ndWFnZSgpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2Uuc2V0dGluZ3MuZ2V0QWN0aXZlQ2hhbm5lbCgpLnNpbmdsZSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbmN5Q29kZSA9IGRhdGEuYWN0aXZlQ2hhbm5lbC5jdXJyZW5jeUNvZGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3JtQ2hhbmdlZCh2YXJpYW50SW5mbzogR2VuZXJhdGVkVmFyaWFudCkge1xyXG4gICAgICAgIHRoaXMuZm9ybVZhbHVlQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgdmFyaWFudEluZm8uZW5hYmxlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2FuRGVhY3RpdmF0ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZm9ybVZhbHVlQ2hhbmdlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRWYXJpYW50c1RvQWRkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzLmZpbHRlcih2ID0+ICF2LmV4aXN0aW5nICYmIHYuZW5hYmxlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VmFyaWFudE5hbWUodmFyaWFudDogR2VuZXJhdGVkVmFyaWFudCkge1xyXG4gICAgICAgIHJldHVybiB2YXJpYW50Lm9wdGlvbnMubGVuZ3RoID09PSAwXHJcbiAgICAgICAgICAgID8gXygnY2F0YWxvZy5kZWZhdWx0LXZhcmlhbnQnKVxyXG4gICAgICAgICAgICA6IHZhcmlhbnQub3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmpvaW4oJyAnKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRPcHRpb25Hcm91cCgpIHtcclxuICAgICAgICB0aGlzLm9wdGlvbkdyb3Vwcy5wdXNoKHtcclxuICAgICAgICAgICAgaXNOZXc6IHRydWUsXHJcbiAgICAgICAgICAgIGxvY2tlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIG5hbWU6ICcnLFxyXG4gICAgICAgICAgICB2YWx1ZXM6IFtdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZU9wdGlvbkdyb3VwKG9wdGlvbkdyb3VwOiBPcHRpb25Hcm91cFVpTW9kZWwpIHtcclxuICAgICAgICBjb25zdCBpZCA9IG9wdGlvbkdyb3VwLmlkO1xyXG4gICAgICAgIGlmIChvcHRpb25Hcm91cC5pc05ldykge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbkdyb3VwcyA9IHRoaXMub3B0aW9uR3JvdXBzLmZpbHRlcihvZyA9PiBvZyAhPT0gb3B0aW9uR3JvdXApO1xyXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgdGhpcy5vcHRpb25zQ2hhbmdlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpZCkge1xyXG4gICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZVxyXG4gICAgICAgICAgICAgICAgLmRpYWxvZyh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC1vcHRpb24tZ3JvdXAnKSxcclxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvblZhcnM6IHsgbmFtZTogb3B0aW9uR3JvdXAubmFtZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdkYW5nZXInLCBsYWJlbDogXygnY29tbW9uLmRlbGV0ZScpLCByZXR1cm5WYWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKHZhbCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QucmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uR3JvdXBJZDogaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoeyByZW1vdmVPcHRpb25Hcm91cEZyb21Qcm9kdWN0IH0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdC5fX3R5cGVuYW1lID09PSAnUHJvZHVjdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXygnY29tbW9uLm5vdGlmeS1kZWxldGUtc3VjY2VzcycpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHk6ICdQcm9kdWN0T3B0aW9uR3JvdXAnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0T3B0aW9uc0FuZFZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVtb3ZlT3B0aW9uR3JvdXBGcm9tUHJvZHVjdC5fX3R5cGVuYW1lID09PSAnUHJvZHVjdE9wdGlvbkluVXNlRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihyZW1vdmVPcHRpb25Hcm91cEZyb21Qcm9kdWN0Lm1lc3NhZ2UgPz8gJycpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhZGRPcHRpb24oaW5kZXg6IG51bWJlciwgb3B0aW9uTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLm9wdGlvbkdyb3Vwc1tpbmRleF07XHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLnZhbHVlcy5wdXNoKHsgbmFtZTogb3B0aW9uTmFtZSwgbG9ja2VkOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVPcHRpb24oaW5kZXg6IG51bWJlciwgeyBpZCwgbmFtZSB9OiB7IGlkPzogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbkdyb3VwID0gdGhpcy5vcHRpb25Hcm91cHNbaW5kZXhdO1xyXG4gICAgICAgIGlmIChvcHRpb25Hcm91cCkge1xyXG4gICAgICAgICAgICBpZiAoIWlkKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5uYW1lICE9PSBuYW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVWYXJpYW50cygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgICAgICAuZGlhbG9nKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC1vcHRpb24nKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb25WYXJzOiB7IG5hbWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnc2Vjb25kYXJ5JywgbGFiZWw6IF8oJ2NvbW1vbi5jYW5jZWwnKSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZGFuZ2VyJywgbGFiZWw6IF8oJ2NvbW1vbi5kZWxldGUnKSwgcmV0dXJuVmFsdWU6IHRydWUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAodmFsID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmRlbGV0ZVByb2R1Y3RPcHRpb24oaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh7IGRlbGV0ZVByb2R1Y3RPcHRpb24gfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlUHJvZHVjdE9wdGlvbi5yZXN1bHQgPT09IERlbGV0aW9uUmVzdWx0LkRFTEVURUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zdWNjZXNzKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eTogJ1Byb2R1Y3RPcHRpb24nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25Hcm91cC52YWx1ZXMgPSBvcHRpb25Hcm91cC52YWx1ZXMuZmlsdGVyKHYgPT4gdi5pZCAhPT0gaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVZhcmlhbnRzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNDaGFuZ2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5lcnJvcihkZWxldGVQcm9kdWN0T3B0aW9uLm1lc3NhZ2UgPz8gJycpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVWYXJpYW50cygpIHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLnZhbHVlcyk7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNWYXJpYW50cyA9IHRoaXMuZ2VuZXJhdGVkVmFyaWFudHM7XHJcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkVmFyaWFudEZhY3RvcnkgPSAoXHJcbiAgICAgICAgICAgIGlzRGVmYXVsdDogYm9vbGVhbixcclxuICAgICAgICAgICAgb3B0aW9uczogR2VuZXJhdGVkVmFyaWFudFsnb3B0aW9ucyddLFxyXG4gICAgICAgICAgICBleGlzdGluZ1ZhcmlhbnQ/OiBOb25OdWxsYWJsZTxHZXRQcm9kdWN0VmFyaWFudE9wdGlvbnNRdWVyeVsncHJvZHVjdCddPlsndmFyaWFudHMnXVtudW1iZXJdLFxyXG4gICAgICAgICAgICBwcm90b3R5cGVWYXJpYW50PzogTm9uTnVsbGFibGU8R2V0UHJvZHVjdFZhcmlhbnRPcHRpb25zUXVlcnlbJ3Byb2R1Y3QnXT5bJ3ZhcmlhbnRzJ11bbnVtYmVyXSxcclxuICAgICAgICApOiBHZW5lcmF0ZWRWYXJpYW50ID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvdG90eXBlID0gdGhpcy5nZXRWYXJpYW50UHJvdG90eXBlKG9wdGlvbnMsIHByZXZpb3VzVmFyaWFudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyYXRlZFZhcmlhbnQoe1xyXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGV4aXN0aW5nOiAhIWV4aXN0aW5nVmFyaWFudCxcclxuICAgICAgICAgICAgICAgIHByb2R1Y3RWYXJpYW50SWQ6IGV4aXN0aW5nVmFyaWFudD8uaWQsXHJcbiAgICAgICAgICAgICAgICBpc0RlZmF1bHQsXHJcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxyXG4gICAgICAgICAgICAgICAgcHJpY2U6IGV4aXN0aW5nVmFyaWFudD8ucHJpY2UgPz8gcHJvdG90eXBlVmFyaWFudD8ucHJpY2UgPz8gcHJvdG90eXBlLnByaWNlLFxyXG4gICAgICAgICAgICAgICAgc2t1OiBleGlzdGluZ1ZhcmlhbnQ/LnNrdSA/PyBwcm90b3R5cGVWYXJpYW50Py5za3UgPz8gcHJvdG90eXBlLnNrdSxcclxuICAgICAgICAgICAgICAgIHN0b2NrOiBleGlzdGluZ1ZhcmlhbnQ/LnN0b2NrT25IYW5kID8/IHByb3RvdHlwZVZhcmlhbnQ/LnN0b2NrT25IYW5kID8/IHByb3RvdHlwZS5zdG9jayxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzID0gZ3JvdXBzLmxlbmd0aFxyXG4gICAgICAgICAgICA/IGdlbmVyYXRlQWxsQ29tYmluYXRpb25zKGdyb3VwcykubWFwKG9wdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1ZhcmlhbnQgPSB0aGlzLnByb2R1Y3QudmFyaWFudHMuZmluZCh2ID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnNBcmVFcXVhbCh2Lm9wdGlvbnMsIG9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBwcm90b3R5cGVWYXJpYW50ID0gdGhpcy5wcm9kdWN0LnZhcmlhbnRzLmZpbmQodiA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zQXJlU3Vic2V0KHYub3B0aW9ucywgb3B0aW9ucyksXHJcbiAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZWRWYXJpYW50RmFjdG9yeShmYWxzZSwgb3B0aW9ucywgZXhpc3RpbmdWYXJpYW50LCBwcm90b3R5cGVWYXJpYW50KTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICA6IFtnZW5lcmF0ZWRWYXJpYW50RmFjdG9yeSh0cnVlLCBbXSwgdGhpcy5wcm9kdWN0LnZhcmlhbnRzWzBdKV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIG9uZSBvZiB0aGUgZXhpc3RpbmcgdmFyaWFudHMgdG8gYmFzZSB0aGUgbmV3bHktZ2VuZXJhdGVkIHZhcmlhbnQnc1xyXG4gICAgICogZGV0YWlscyBvZmYuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VmFyaWFudFByb3RvdHlwZShcclxuICAgICAgICBvcHRpb25zOiBHZW5lcmF0ZWRWYXJpYW50WydvcHRpb25zJ10sXHJcbiAgICAgICAgcHJldmlvdXNWYXJpYW50czogR2VuZXJhdGVkVmFyaWFudFtdLFxyXG4gICAgKTogUGljazxHZW5lcmF0ZWRWYXJpYW50LCAnc2t1JyB8ICdwcmljZScgfCAnc3RvY2snPiB7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHNXaXRoU2ltaWxhck9wdGlvbnMgPSBwcmV2aW91c1ZhcmlhbnRzLmZpbHRlcih2ID0+XHJcbiAgICAgICAgICAgIG9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5maWx0ZXIobmFtZSA9PiB2Lm9wdGlvbnMubWFwKG8gPT4gby5uYW1lKS5pbmNsdWRlcyhuYW1lKSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAodmFyaWFudHNXaXRoU2ltaWxhck9wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwaWNrKHByZXZpb3VzVmFyaWFudHNbMF0sIFsnc2t1JywgJ3ByaWNlJywgJ3N0b2NrJ10pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBza3U6ICcnLFxyXG4gICAgICAgICAgICBwcmljZTogMCxcclxuICAgICAgICAgICAgc3RvY2s6IDAsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVWYXJpYW50KGlkOiBzdHJpbmcsIG9wdGlvbnM6IEdlbmVyYXRlZFZhcmlhbnRbJ29wdGlvbnMnXSkge1xyXG4gICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IF8oJ2NhdGFsb2cuY29uZmlybS1kZWxldGUtcHJvZHVjdC12YXJpYW50JyksXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvblZhcnM6IHsgbmFtZTogb3B0aW9ucy5tYXAobyA9PiBvLm5hbWUpLmpvaW4oJyAnKSB9LFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3NlY29uZGFyeScsIGxhYmVsOiBfKCdjb21tb24uY2FuY2VsJykgfSxcclxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdkYW5nZXInLCBsYWJlbDogXygnY29tbW9uLmRlbGV0ZScpLCByZXR1cm5WYWx1ZTogdHJ1ZSB9LFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAocmVzcG9uc2UgPT5cclxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA/IHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuZGVsZXRlUHJvZHVjdFZhcmlhbnQoaWQsIHRoaXMucHJvZHVjdC5pZCkgOiBFTVBUWSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5yZUZldGNoUHJvZHVjdChudWxsKSksXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhfKCdjb21tb24ubm90aWZ5LWRlbGV0ZS1zdWNjZXNzJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdFZhcmlhbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKF8oJ2NvbW1vbi5ub3RpZnktZGVsZXRlLWVycm9yJyksIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiAnUHJvZHVjdFZhcmlhbnQnLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlKCkge1xyXG4gICAgICAgIHRoaXMub3B0aW9uR3JvdXBzID0gdGhpcy5vcHRpb25Hcm91cHMuZmlsdGVyKGcgPT4gZy52YWx1ZXMubGVuZ3RoKTtcclxuICAgICAgICBjb25zdCBuZXdPcHRpb25Hcm91cHMgPSB0aGlzLm9wdGlvbkdyb3Vwc1xyXG4gICAgICAgICAgICAuZmlsdGVyKG9nID0+IG9nLmlzTmV3KVxyXG4gICAgICAgICAgICAubWFwKG9nID0+ICh7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiBvZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBbXSxcclxuICAgICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICB0aGlzLmNoZWNrVW5pcXVlU2t1cygpXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKCkgPT4gdGhpcy5jb25maXJtRGVsZXRpb25PZk9ic29sZXRlVmFyaWFudHMoKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcCgoKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdERldGFpbFNlcnZpY2UuY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwcyhuZXdPcHRpb25Hcm91cHMsIHRoaXMubGFuZ3VhZ2VDb2RlKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChjcmVhdGVkT3B0aW9uR3JvdXBzID0+IHRoaXMuYWRkT3B0aW9uR3JvdXBzVG9Qcm9kdWN0KGNyZWF0ZWRPcHRpb25Hcm91cHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKGNyZWF0ZWRPcHRpb25Hcm91cHMgPT4gdGhpcy5hZGROZXdPcHRpb25zVG9Hcm91cHMoY3JlYXRlZE9wdGlvbkdyb3VwcykpLFxyXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoZ3JvdXBzSWRzID0+IHRoaXMuZmV0Y2hPcHRpb25Hcm91cHMoZ3JvdXBzSWRzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChncm91cHMgPT4gdGhpcy5jcmVhdGVOZXdQcm9kdWN0VmFyaWFudHMoZ3JvdXBzKSksXHJcbiAgICAgICAgICAgICAgICBtZXJnZU1hcChyZXMgPT4gdGhpcy5kZWxldGVPYnNvbGV0ZVZhcmlhbnRzKHJlcy5jcmVhdGVQcm9kdWN0VmFyaWFudHMpKSxcclxuICAgICAgICAgICAgICAgIG1lcmdlTWFwKHZhcmlhbnRzID0+IHRoaXMucmVGZXRjaFByb2R1Y3QodmFyaWFudHMpKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IHZhcmlhbnRzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1WYWx1ZUNoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhfKCdjYXRhbG9nLmNyZWF0ZWQtbmV3LXZhcmlhbnRzLXN1Y2Nlc3MnKSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogdmFyaWFudHMubGVuZ3RoLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnNBbmRWYXJpYW50cygpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tVbmlxdWVTa3VzKCkge1xyXG4gICAgICAgIGNvbnN0IHdpdGhEdXBsaWNhdGVTa3VzID0gdGhpcy5nZW5lcmF0ZWRWYXJpYW50cy5maWx0ZXIoKHZhcmlhbnQsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICB2YXJpYW50LmVuYWJsZWQgJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmluZChndiA9PiBndi5za3UudHJpbSgpID09PSB2YXJpYW50LnNrdS50cmltKCkgJiYgZ3YgIT09IHZhcmlhbnQpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHdpdGhEdXBsaWNhdGVTa3VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5kaWFsb2coe1xyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfKCdjYXRhbG9nLmR1cGxpY2F0ZS1za3Utd2FybmluZycpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHVuaXF1ZSh3aXRoRHVwbGljYXRlU2t1cy5tYXAodiA9PiBgJHt2LnNrdX1gKSkuam9pbignLCAnKSxcclxuICAgICAgICAgICAgICAgICAgICBidXR0b25zOiBbeyBsYWJlbDogXygnY29tbW9uLmNsb3NlJyksIHJldHVyblZhbHVlOiBmYWxzZSwgdHlwZTogJ3ByaW1hcnknIH1dLFxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIC5waXBlKG1lcmdlTWFwKHJlcyA9PiBFTVBUWSkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZih0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25maXJtRGVsZXRpb25PZk9ic29sZXRlVmFyaWFudHMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgb2Jzb2xldGVWYXJpYW50cyA9IHRoaXMuZ2V0T2Jzb2xldGVWYXJpYW50cygpO1xyXG4gICAgICAgIGlmIChvYnNvbGV0ZVZhcmlhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RhbFNlcnZpY2VcclxuICAgICAgICAgICAgICAgIC5mcm9tQ29tcG9uZW50KENvbmZpcm1WYXJpYW50RGVsZXRpb25EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudHM6IG9ic29sZXRlVmFyaWFudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBtZXJnZU1hcChyZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzID09PSB0cnVlID8gb2YodHJ1ZSkgOiBFTVBUWTtcclxuICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE9ic29sZXRlVmFyaWFudHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvZHVjdC52YXJpYW50cy5maWx0ZXIoXHJcbiAgICAgICAgICAgIHZhcmlhbnQgPT4gIXRoaXMuZ2VuZXJhdGVkVmFyaWFudHMuZmluZChndiA9PiBndi5wcm9kdWN0VmFyaWFudElkID09PSB2YXJpYW50LmlkKSxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFzT25seURlZmF1bHRWYXJpYW50KHByb2R1Y3Q6IE5vbk51bGxhYmxlPEdldFByb2R1Y3RWYXJpYW50T3B0aW9uc1F1ZXJ5Wydwcm9kdWN0J10+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QudmFyaWFudHMubGVuZ3RoID09PSAxICYmIHByb2R1Y3Qub3B0aW9uR3JvdXBzLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZE9wdGlvbkdyb3Vwc1RvUHJvZHVjdChcclxuICAgICAgICBjcmVhdGVkT3B0aW9uR3JvdXBzOiBBcnJheTxDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvblsnY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwJ10+LFxyXG4gICAgKTogT2JzZXJ2YWJsZTxBcnJheTxDcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXBNdXRhdGlvblsnY3JlYXRlUHJvZHVjdE9wdGlvbkdyb3VwJ10+PiB7XHJcbiAgICAgICAgaWYgKGNyZWF0ZWRPcHRpb25Hcm91cHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHMubWFwKG9wdGlvbkdyb3VwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmFkZE9wdGlvbkdyb3VwVG9Qcm9kdWN0KHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbkdyb3VwSWQ6IG9wdGlvbkdyb3VwLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gY3JlYXRlZE9wdGlvbkdyb3VwcykpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkTmV3T3B0aW9uc1RvR3JvdXBzKFxyXG4gICAgICAgIGNyZWF0ZWRPcHRpb25Hcm91cHM6IEFycmF5PENyZWF0ZVByb2R1Y3RPcHRpb25Hcm91cE11dGF0aW9uWydjcmVhdGVQcm9kdWN0T3B0aW9uR3JvdXAnXT4sXHJcbiAgICApOiBPYnNlcnZhYmxlPHN0cmluZ1tdPiB7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9uczogQ3JlYXRlUHJvZHVjdE9wdGlvbklucHV0W10gPSB0aGlzLm9wdGlvbkdyb3Vwc1xyXG4gICAgICAgICAgICAubWFwKG9nID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRHcm91cCA9IGNyZWF0ZWRPcHRpb25Hcm91cHMuZmluZChjb2cgPT4gY29nLm5hbWUgPT09IG9nLm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdE9wdGlvbkdyb3VwSWQgPSBjcmVhdGVkR3JvdXAgPyBjcmVhdGVkR3JvdXAuaWQgOiBvZy5pZDtcclxuICAgICAgICAgICAgICAgIGlmICghcHJvZHVjdE9wdGlvbkdyb3VwSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgYSBwcm9kdWN0T3B0aW9uR3JvdXBJZCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9nLnZhbHVlc1xyXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodiA9PiAhdi5sb2NrZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+ICh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RPcHRpb25Hcm91cElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBub3JtYWxpemVTdHJpbmcodi5uYW1lLCAnLScpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbnM6IFt7IG5hbWU6IHYubmFtZSwgbGFuZ3VhZ2VDb2RlOiB0aGlzLmxhbmd1YWdlQ29kZSB9XSxcclxuICAgICAgICAgICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5yZWR1Y2UoKGZsYXQsIG9wdGlvbnMpID0+IFsuLi5mbGF0LCAuLi5vcHRpb25zXSwgW10pO1xyXG5cclxuICAgICAgICBjb25zdCBhbGxHcm91cElkcyA9IFtcclxuICAgICAgICAgICAgLi4uY3JlYXRlZE9wdGlvbkdyb3Vwcy5tYXAoZyA9PiBnLmlkKSxcclxuICAgICAgICAgICAgLi4udGhpcy5vcHRpb25Hcm91cHMubWFwKGcgPT4gZy5pZCkuZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKG5ld09wdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihuZXdPcHRpb25zLm1hcChpbnB1dCA9PiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuYWRkT3B0aW9uVG9Hcm91cChpbnB1dCkpKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IGFsbEdyb3VwSWRzKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoYWxsR3JvdXBJZHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZldGNoT3B0aW9uR3JvdXBzKGdyb3Vwc0lkczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXT4ge1xyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihcclxuICAgICAgICAgICAgZ3JvdXBzSWRzLm1hcChpZCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0XHJcbiAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y3RPcHRpb25Hcm91cChpZClcclxuICAgICAgICAgICAgICAgICAgICAubWFwU2luZ2xlKGRhdGEgPT4gZGF0YS5wcm9kdWN0T3B0aW9uR3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKG5vdE51bGxPclVuZGVmaW5lZCkpLFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICkucGlwZShkZWZhdWx0SWZFbXB0eShbXSBhcyBQcm9kdWN0T3B0aW9uR3JvdXBXaXRoT3B0aW9uc0ZyYWdtZW50W10pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNyZWF0ZU5ld1Byb2R1Y3RWYXJpYW50cyhncm91cHM6IFByb2R1Y3RPcHRpb25Hcm91cFdpdGhPcHRpb25zRnJhZ21lbnRbXSkge1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBncm91cHNcclxuICAgICAgICAgICAgLmZpbHRlcihub3ROdWxsT3JVbmRlZmluZWQpXHJcbiAgICAgICAgICAgIC5tYXAob2cgPT4gb2cub3B0aW9ucylcclxuICAgICAgICAgICAgLnJlZHVjZSgoZmxhdCwgbykgPT4gWy4uLmZsYXQsIC4uLm9dLCBbXSk7XHJcbiAgICAgICAgY29uc3QgdmFyaWFudHMgPSB0aGlzLmdlbmVyYXRlZFZhcmlhbnRzXHJcbiAgICAgICAgICAgIC5maWx0ZXIodiA9PiB2LmVuYWJsZWQgJiYgIXYuZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIC5tYXAodiA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25JZHMgPSBncm91cHMubWFwKChncm91cCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSBncm91cC5vcHRpb25zLmZpbmQobyA9PiBvLm5hbWUgPT09IHYub3B0aW9uc1tpbmRleF0ubmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLmlkO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBtYXRjaGluZyBvcHRpb24gZm9yIGdyb3VwICR7Z3JvdXAubmFtZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHYucHJpY2UsXHJcbiAgICAgICAgICAgICAgICAgICAgc2t1OiB2LnNrdSxcclxuICAgICAgICAgICAgICAgICAgICBzdG9jazogdi5zdG9jayxcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25JZHMsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0RGV0YWlsU2VydmljZS5jcmVhdGVQcm9kdWN0VmFyaWFudHMoXHJcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdCxcclxuICAgICAgICAgICAgdmFyaWFudHMsXHJcbiAgICAgICAgICAgIG9wdGlvbnMsXHJcbiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2VDb2RlLFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWxldGVPYnNvbGV0ZVZhcmlhbnRzPFQ+KGlucHV0OiBUKTogT2JzZXJ2YWJsZTxUIHwgVFtdPiB7XHJcbiAgICAgICAgY29uc3Qgb2Jzb2xldGVWYXJpYW50cyA9IHRoaXMuZ2V0T2Jzb2xldGVWYXJpYW50cygpO1xyXG4gICAgICAgIGlmIChvYnNvbGV0ZVZhcmlhbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWxldGVPcGVyYXRpb25zID0gb2Jzb2xldGVWYXJpYW50cy5tYXAodiA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0LmRlbGV0ZVByb2R1Y3RWYXJpYW50KHYuaWQpLnBpcGUobWFwKCgpID0+IGlucHV0KSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbiguLi5kZWxldGVPcGVyYXRpb25zKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YoaW5wdXQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlRmV0Y2hQcm9kdWN0PFQ+KGlucHV0OiBUKTogT2JzZXJ2YWJsZTxUPiB7XHJcbiAgICAgICAgLy8gUmUtZmV0Y2ggdGhlIFByb2R1Y3QgdG8gZm9yY2UgYW4gdXBkYXRlIHRvIHRoZSB2aWV3LlxyXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XHJcbiAgICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLnByb2R1Y3QuZ2V0UHJvZHVjdChpZCkuc2luZ2xlJC5waXBlKG1hcCgoKSA9PiBpbnB1dCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihpbnB1dCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRPcHRpb25zQW5kVmFyaWFudHMoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhU2VydmljZS5wcm9kdWN0XHJcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICAgICAgLmdldFByb2R1Y3RWYXJpYW50c09wdGlvbnModGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJykhKVxyXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgICAgIC5tYXBTaW5nbGUoKHsgcHJvZHVjdCB9KSA9PiBwcm9kdWN0ISlcclxuICAgICAgICAgICAgLnN1YnNjcmliZShwID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvZHVjdCA9IHA7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxVc2VkT3B0aW9uSWRzID0gcC52YXJpYW50cy5tYXAodiA9PiB2Lm9wdGlvbnMubWFwKG9wdGlvbiA9PiBvcHRpb24uaWQpKS5mbGF0KCk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxVc2VkT3B0aW9uR3JvdXBJZHMgPSBwLnZhcmlhbnRzXHJcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh2ID0+IHYub3B0aW9ucy5tYXAob3B0aW9uID0+IG9wdGlvbi5ncm91cElkKSlcclxuICAgICAgICAgICAgICAgICAgICAuZmxhdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25Hcm91cHMgPSBwLm9wdGlvbkdyb3Vwcy5tYXAob2cgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBvZy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNOZXc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvZy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQ6IGFsbFVzZWRPcHRpb25Hcm91cElkcy5pbmNsdWRlcyhvZy5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogb2cub3B0aW9ucy5tYXAobyA9PiAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG8uaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBvLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrZWQ6IGFsbFVzZWRPcHRpb25JZHMuaW5jbHVkZXMoby5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlVmFyaWFudHMoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcHRpb25zQXJlRXF1YWwoYTogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4sIGI6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudG9PcHRpb25TdHJpbmcoYSkgPT09IHRoaXMudG9PcHRpb25TdHJpbmcoYik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvcHRpb25zQXJlU3Vic2V0KGE6IEFycmF5PHsgbmFtZTogc3RyaW5nIH0+LCBiOiBBcnJheTx7IG5hbWU6IHN0cmluZyB9Pik6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRvT3B0aW9uU3RyaW5nKGIpLmluY2x1ZGVzKHRoaXMudG9PcHRpb25TdHJpbmcoYSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdG9PcHRpb25TdHJpbmcobzogQXJyYXk8eyBuYW1lOiBzdHJpbmcgfT4pOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBvXHJcbiAgICAgICAgICAgIC5tYXAoeCA9PiB4Lm5hbWUpXHJcbiAgICAgICAgICAgIC5zb3J0KClcclxuICAgICAgICAgICAgLmpvaW4oJ3wnKTtcclxuICAgIH1cclxufVxyXG4iLCI8dmRyLWFjdGlvbi1iYXI+XHJcbiAgICA8dmRyLWFiLXJpZ2h0PlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZSgpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIighZm9ybVZhbHVlQ2hhbmdlZCAmJiAhb3B0aW9uc0NoYW5nZWQpIHx8IGdldFZhcmlhbnRzVG9BZGQoKS5sZW5ndGggPT09IDBcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAge3sgJ2NvbW1vbi5hZGQtbmV3LXZhcmlhbnRzJyB8IHRyYW5zbGF0ZTogeyBjb3VudDogZ2V0VmFyaWFudHNUb0FkZCgpLmxlbmd0aCB9IH19XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L3Zkci1hYi1yaWdodD5cclxuPC92ZHItYWN0aW9uLWJhcj5cclxuXHJcbjxkaXYgKm5nRm9yPVwibGV0IGdyb3VwIG9mIG9wdGlvbkdyb3VwczsgaW5kZXggYXMgaVwiIGNsYXNzPVwib3B0aW9uLWdyb3Vwc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm5hbWVcIj5cclxuICAgICAgICA8bGFiZWw+e3sgJ2NhdGFsb2cub3B0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgPGlucHV0IGNscklucHV0IFsobmdNb2RlbCldPVwiZ3JvdXAubmFtZVwiIG5hbWU9XCJuYW1lXCIgW3JlYWRvbmx5XT1cIiFncm91cC5pc05ld1wiIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZXNcIj5cclxuICAgICAgICA8bGFiZWw+e3sgJ2NhdGFsb2cub3B0aW9uLXZhbHVlcycgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgIDx2ZHItb3B0aW9uLXZhbHVlLWlucHV0XHJcbiAgICAgICAgICAgICNvcHRpb25WYWx1ZUlucHV0Q29tcG9uZW50XHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cImdyb3VwLnZhbHVlc1wiXHJcbiAgICAgICAgICAgIFtncm91cE5hbWVdPVwiZ3JvdXAubmFtZVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJncm91cC5uYW1lID09PSAnJ1wiXHJcbiAgICAgICAgICAgIChhZGQpPVwiYWRkT3B0aW9uKGksICRldmVudC5uYW1lKVwiXHJcbiAgICAgICAgICAgIChyZW1vdmUpPVwicmVtb3ZlT3B0aW9uKGksICRldmVudClcIlxyXG4gICAgICAgID48L3Zkci1vcHRpb24tdmFsdWUtaW5wdXQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZ3JvdXAubG9ja2VkXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWljb24gYnRuLWRhbmdlci1vdXRsaW5lIG10NVwiIChjbGljayk9XCJyZW1vdmVPcHRpb25Hcm91cChncm91cClcIj5cclxuICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwidHJhc2hcIj48L2Nsci1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5LW91dGxpbmUgYnRuLXNtXCIgKGNsaWNrKT1cImFkZE9wdGlvbkdyb3VwKClcIj5cclxuICAgIDxjbHItaWNvbiBzaGFwZT1cInBsdXNcIj48L2Nsci1pY29uPlxyXG4gICAge3sgJ2NhdGFsb2cuYWRkLW9wdGlvbicgfCB0cmFuc2xhdGUgfX1cclxuPC9idXR0b24+XHJcblxyXG48ZGl2IGNsYXNzPVwidmFyaWFudHMtcHJldmlld1wiPlxyXG4gICAgPHRhYmxlIGNsYXNzPVwidGFibGVcIj5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnZhcmlhbnQnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy5za3UnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD57eyAnY2F0YWxvZy5wcmljZScgfCB0cmFuc2xhdGUgfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgPHRoPnt7ICdjYXRhbG9nLnN0b2NrLW9uLWhhbmQnIHwgdHJhbnNsYXRlIH19PC90aD5cclxuICAgICAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCB2YXJpYW50IG9mIGdlbmVyYXRlZFZhcmlhbnRzXCIgW2NsYXNzLmRpc2FibGVkXT1cIiF2YXJpYW50LmVuYWJsZWQgfHwgdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJsZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICA8Y2xyLWNoZWNrYm94LXdyYXBwZXIgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhcmlhbnQuZW5hYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJlbmFibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xyQ2hlY2tib3hcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZm9ybVZhbHVlQ2hhbmdlZCA9IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPnt7ICdjb21tb24uY3JlYXRlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Nsci1jaGVja2JveC13cmFwcGVyPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICB7eyBnZXRWYXJpYW50TmFtZSh2YXJpYW50KSB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBjZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8Y2xyLWlucHV0LWNvbnRhaW5lciAqbmdJZj1cIiF2YXJpYW50LmV4aXN0aW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5za3VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidjYXRhbG9nLnNrdScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNrdVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9jbHItaW5wdXQtY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFyaWFudC5leGlzdGluZ1wiPnt7IHZhcmlhbnQuc2t1IH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxjbHItaW5wdXQtY29udGFpbmVyICpuZ0lmPVwiIXZhcmlhbnQuZXhpc3RpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHZkci1jdXJyZW5jeS1pbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xySW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5wcmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwicHJpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbmN5Q29kZV09XCJjdXJyZW5jeUNvZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Gb3JtQ2hhbmdlZCh2YXJpYW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3Zkci1jdXJyZW5jeS1pbnB1dD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Nsci1pbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5wcmljZSB8IGxvY2FsZUN1cnJlbmN5OiBjdXJyZW5jeUNvZGUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGNsci1pbnB1dC1jb250YWluZXIgKm5nSWY9XCIhdmFyaWFudC5leGlzdGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscklucHV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFyaWFudC5zdG9ja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic3RvY2tcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPVwiMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwPVwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkZvcm1DaGFuZ2VkKHZhcmlhbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Nsci1pbnB1dC1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YXJpYW50LmV4aXN0aW5nXCI+e3sgdmFyaWFudC5zdG9jayB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duICpuZ0lmPVwidmFyaWFudC5wcm9kdWN0VmFyaWFudElkIGFzIHByb2R1Y3RWYXJpYW50SWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idXR0b25cIiB2ZHJEcm9wZG93blRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxjbHItaWNvbiBzaGFwZT1cImVsbGlwc2lzLXZlcnRpY2FsXCI+PC9jbHItaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8dmRyLWRyb3Bkb3duLW1lbnUgdmRyUG9zaXRpb249XCJib3R0b20tcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRlbGV0ZS1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVZhcmlhbnQocHJvZHVjdFZhcmlhbnRJZCwgdmFyaWFudC5vcHRpb25zKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZHJEcm9wZG93bkl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsci1pY29uIHNoYXBlPVwidHJhc2hcIiBjbGFzcz1cImlzLWRhbmdlclwiPjwvY2xyLWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnY29tbW9uLmRlbGV0ZScgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC92ZHItZHJvcGRvd24tbWVudT5cclxuICAgICAgICAgICAgICAgIDwvdmRyLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICA8L3RhYmxlPlxyXG48L2Rpdj5cclxuIl19