@colijnit/configurator 260.1.2 → 261.1.1

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 (553) hide show
  1. package/bundles/colijnit-configurator.umd.js +18067 -1889
  2. package/bundles/colijnit-configurator.umd.js.map +1 -1
  3. package/colijnit-configurator.d.ts +2 -6
  4. package/esm2015/colijnit-configurator.js +2 -7
  5. package/esm2015/lib/builder.js +795 -0
  6. package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
  7. package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
  8. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
  9. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
  10. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
  11. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
  12. package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
  13. package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
  14. package/esm2015/lib/components/configurator/configurator.component.js +133 -0
  15. package/esm2015/lib/components/configurator/configurator.module.js +42 -0
  16. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
  17. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
  18. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
  19. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
  20. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
  21. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
  22. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
  23. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
  24. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
  25. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
  26. package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
  27. package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
  28. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
  29. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
  30. package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
  31. package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
  32. package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
  33. package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
  34. package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
  35. package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
  36. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
  37. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
  38. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
  39. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
  40. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
  41. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
  42. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
  43. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
  44. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
  45. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
  46. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
  47. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
  48. package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
  49. package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
  50. package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
  51. package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
  52. package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
  53. package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
  54. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
  55. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
  56. package/esm2015/lib/components/slideout/slideout.component.js +83 -0
  57. package/esm2015/lib/components/slideout/slideout.module.js +17 -0
  58. package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
  59. package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
  60. package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
  61. package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
  62. package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
  63. package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
  64. package/esm2015/lib/core/helper/variation-helper.js +553 -0
  65. package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
  66. package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
  67. package/esm2015/lib/directives/directives.module.js +26 -0
  68. package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
  69. package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
  70. package/esm2015/lib/enum/ar-feature.enum.js +14 -0
  71. package/esm2015/lib/enum/configuration-key.enum.js +41 -0
  72. package/esm2015/lib/enum/configuration-template.enum.js +6 -0
  73. package/esm2015/lib/enum/device-size-type.js +7 -0
  74. package/esm2015/lib/enum/device-tier.enum.js +7 -0
  75. package/esm2015/lib/enum/icon.enum.js +113 -0
  76. package/esm2015/lib/enum/item-type.enum.js +23 -0
  77. package/esm2015/lib/enum/light.enum.js +9 -0
  78. package/esm2015/lib/enum/navigator-type.enum.js +6 -0
  79. package/esm2015/lib/enum/output-encoding.enum.js +9 -0
  80. package/esm2015/lib/enum/result-type.enum.js +21 -0
  81. package/esm2015/lib/enum/scene-event.enum.js +12 -0
  82. package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
  83. package/esm2015/lib/enum/texture-type.js +9 -0
  84. package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
  85. package/esm2015/lib/enum/view-mode.enum.js +7 -0
  86. package/esm2015/lib/enum/xr-mode.enum.js +6 -0
  87. package/esm2015/lib/environments/environment.js +8 -0
  88. package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
  89. package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
  90. package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
  91. package/esm2015/lib/interfaces/changes.interface.js +2 -0
  92. package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
  93. package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
  94. package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
  95. package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
  96. package/esm2015/lib/interfaces/screen-size-info.js +2 -0
  97. package/esm2015/lib/interfaces/setting.interface.js +2 -0
  98. package/esm2015/lib/interfaces/texture.interface.js +2 -0
  99. package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
  100. package/esm2015/lib/model/ar-position-indicator.js +18 -0
  101. package/esm2015/lib/model/camera-settings.js +14 -0
  102. package/esm2015/lib/model/configuration-result-object.js +6 -0
  103. package/esm2015/lib/model/configurator-error-message.js +9 -0
  104. package/esm2015/lib/model/configurator-settings.js +25 -0
  105. package/esm2015/lib/model/custom-button.js +16 -0
  106. package/esm2015/lib/model/factory.js +28 -0
  107. package/esm2015/lib/model/icon.js +112 -0
  108. package/esm2015/lib/model/intersected-objects.js +7 -0
  109. package/esm2015/lib/model/light-preset.js +73 -0
  110. package/esm2015/lib/model/light-properties.js +45 -0
  111. package/esm2015/lib/model/material.js +11 -0
  112. package/esm2015/lib/model/metadata.js +2 -0
  113. package/esm2015/lib/model/render-parameters.js +16 -0
  114. package/esm2015/lib/model/setting-options.js +71 -0
  115. package/esm2015/lib/model/settings.js +16 -0
  116. package/esm2015/lib/model/shadow-properties.js +10 -0
  117. package/esm2015/lib/model/skin.js +3 -0
  118. package/esm2015/lib/model/texture.js +76 -0
  119. package/esm2015/lib/model/variation-settings.js +54 -0
  120. package/esm2015/lib/model/variation.js +3 -0
  121. package/esm2015/lib/model/xr-reticle.js +79 -0
  122. package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
  123. package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
  124. package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
  125. package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
  126. package/esm2015/lib/pipes/append.pipe.js +21 -0
  127. package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
  128. package/esm2015/lib/pipes/localize.pipe.js +28 -0
  129. package/esm2015/lib/pipes/pipes.module.js +41 -0
  130. package/esm2015/lib/pipes/prepend.pipe.js +21 -0
  131. package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
  132. package/esm2015/lib/services/app-event.service.js +36 -0
  133. package/esm2015/lib/services/app-initializer.service.js +27 -0
  134. package/esm2015/lib/services/ar.service.js +844 -0
  135. package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
  136. package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
  137. package/esm2015/lib/services/build-furniture.service.js +169 -0
  138. package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
  139. package/esm2015/lib/services/camera.service.js +123 -0
  140. package/esm2015/lib/services/configuration.service.js +79 -0
  141. package/esm2015/lib/services/configurator-connector.service.js +830 -0
  142. package/esm2015/lib/services/configurator.service.js +285 -0
  143. package/esm2015/lib/services/configuring.service.js +119 -0
  144. package/esm2015/lib/services/controls.js +799 -0
  145. package/esm2015/lib/services/debug.service.js +43 -0
  146. package/esm2015/lib/services/dictionary.service.js +65 -0
  147. package/esm2015/lib/services/dynamic-camera.service.js +96 -0
  148. package/esm2015/lib/services/floor-plane.service.js +252 -0
  149. package/esm2015/lib/services/font.service.js +27 -0
  150. package/esm2015/lib/services/google-translate.service.js +79 -0
  151. package/esm2015/lib/services/icon-cache.service.js +44 -0
  152. package/esm2015/lib/services/intersection.service.js +47 -0
  153. package/esm2015/lib/services/item.service.js +75 -0
  154. package/esm2015/lib/services/json-utils.service.js +48 -0
  155. package/esm2015/lib/services/light-creation.service.js +35 -0
  156. package/esm2015/lib/services/light-presets.service.js +157 -0
  157. package/esm2015/lib/services/lights.service.js +146 -0
  158. package/esm2015/lib/services/load-furniture-base.service.js +164 -0
  159. package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
  160. package/esm2015/lib/services/load-furniture.service.js +72 -0
  161. package/esm2015/lib/services/loader.service.js +32 -0
  162. package/esm2015/lib/services/locator.service.js +11 -0
  163. package/esm2015/lib/services/message-board.service.js +50 -0
  164. package/esm2015/lib/services/post-processing.service.js +378 -0
  165. package/esm2015/lib/services/product-configurator.service.js +16 -0
  166. package/esm2015/lib/services/progress.service.js +20 -0
  167. package/esm2015/lib/services/scene-event.service.js +246 -0
  168. package/esm2015/lib/services/scene-options.service.js +24 -0
  169. package/esm2015/lib/services/scene.service.js +313 -0
  170. package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
  171. package/esm2015/lib/services/settings.service.js +142 -0
  172. package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
  173. package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
  174. package/esm2015/lib/services/threedselector.service.js +72 -0
  175. package/esm2015/lib/services/utils.service.js +207 -0
  176. package/esm2015/lib/services/variation-cache.service.js +143 -0
  177. package/esm2015/lib/services/variation.service.js +490 -0
  178. package/esm2015/lib/services/view-mode.service.js +37 -0
  179. package/esm2015/lib/services/vr.service.js +191 -0
  180. package/esm2015/lib/services/xr.service.js +294 -0
  181. package/esm2015/lib/utils/asset.utils.js +120 -0
  182. package/esm2015/lib/utils/base-utils.js +9 -0
  183. package/esm2015/lib/utils/color.utils.js +30 -0
  184. package/esm2015/lib/utils/debug.utils.js +9 -0
  185. package/esm2015/lib/utils/device.utils.js +25 -0
  186. package/esm2015/lib/utils/file.utils.js +167 -0
  187. package/esm2015/lib/utils/image.utils.js +61 -0
  188. package/esm2015/lib/utils/json-parser.utils.js +180 -0
  189. package/esm2015/lib/utils/material.utils.js +433 -0
  190. package/esm2015/lib/utils/object.utils.js +360 -0
  191. package/esm2015/lib/utils/relative-position.utils.js +75 -0
  192. package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
  193. package/esm2015/lib/utils/scene-3d.utils.js +213 -0
  194. package/esm2015/lib/utils/scene-utils.js +191 -0
  195. package/esm2015/lib/utils/text-utils.js +68 -0
  196. package/esm2015/lib/utils/threed.utils.js +281 -0
  197. package/esm2015/lib/utils/variation-utils.js +459 -0
  198. package/esm2015/public-api.js +65 -0
  199. package/fesm2015/colijnit-configurator.js +17538 -1477
  200. package/fesm2015/colijnit-configurator.js.map +1 -1
  201. package/{app → lib}/builder.d.ts +9 -1
  202. package/lib/components/answer-card/answer-card.component.d.ts +58 -0
  203. package/lib/components/answer-card/answer-card.module.d.ts +11 -0
  204. package/lib/components/answer-card/style/_layout.scss +88 -0
  205. package/lib/components/answer-card/style/_material-definition.scss +3 -0
  206. package/lib/components/answer-card/style/_theme.scss +67 -0
  207. package/lib/components/answer-card/style/material.scss +2 -0
  208. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
  209. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
  210. package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
  211. package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
  212. package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
  213. package/lib/components/answer-info-dialog/style/material.scss +3 -0
  214. package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
  215. package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
  216. package/lib/components/answers-slideout/style/_layout.scss +198 -0
  217. package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
  218. package/lib/components/answers-slideout/style/_theme.scss +54 -0
  219. package/lib/components/answers-slideout/style/material.scss +3 -0
  220. package/lib/components/color-filter/color-filter.component.d.ts +20 -0
  221. package/lib/components/color-filter/color-filter.module.d.ts +8 -0
  222. package/lib/components/color-filter/style/_layout.scss +41 -0
  223. package/lib/components/color-filter/style/_material-definition.scss +3 -0
  224. package/lib/components/color-filter/style/_theme.scss +7 -0
  225. package/lib/components/color-filter/style/material.scss +3 -0
  226. package/lib/components/configurator/configurator.component.d.ts +37 -0
  227. package/lib/components/configurator/configurator.module.d.ts +12 -0
  228. package/lib/components/configurator/style/_layout.scss +7 -0
  229. package/lib/components/configurator/style/_material-definition.scss +3 -0
  230. package/lib/components/configurator/style/_theme.scss +7 -0
  231. package/lib/components/configurator/style/material.scss +3 -0
  232. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
  233. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
  234. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
  235. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
  236. package/lib/components/configurator-dialog/style/_layout.scss +129 -0
  237. package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
  238. package/lib/components/configurator-dialog/style/_theme.scss +89 -0
  239. package/lib/components/configurator-dialog/style/material.scss +3 -0
  240. package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
  241. package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
  242. package/lib/components/configurator-loader/style/_layout.scss +72 -0
  243. package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
  244. package/lib/components/configurator-loader/style/_theme.scss +26 -0
  245. package/lib/components/configurator-loader/style/material.scss +14 -0
  246. package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
  247. package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
  248. package/lib/components/configurator-scene/style/_layout.scss +22 -0
  249. package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
  250. package/lib/components/configurator-scene/style/_theme.scss +7 -0
  251. package/lib/components/configurator-scene/style/material.scss +3 -0
  252. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
  253. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
  254. package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
  255. package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
  256. package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
  257. package/lib/components/configurator-scene-loader/style/material.scss +14 -0
  258. package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
  259. package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
  260. package/lib/components/element-buttons/style/_layout.scss +52 -0
  261. package/lib/components/element-buttons/style/_material-definition.scss +3 -0
  262. package/lib/components/element-buttons/style/_theme.scss +23 -0
  263. package/lib/components/element-buttons/style/material.scss +3 -0
  264. package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
  265. package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
  266. package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
  267. package/lib/components/element-toolbar/style/_layout.scss +107 -0
  268. package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
  269. package/lib/components/element-toolbar/style/_theme.scss +47 -0
  270. package/lib/components/element-toolbar/style/material.scss +3 -0
  271. package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
  272. package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
  273. package/lib/components/image-zoom/style/_layout.scss +51 -0
  274. package/lib/components/image-zoom/style/_material-definition.scss +3 -0
  275. package/lib/components/image-zoom/style/_theme.scss +17 -0
  276. package/lib/components/image-zoom/style/material.scss +3 -0
  277. package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
  278. package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
  279. package/lib/components/lite-selector/style/_layout.scss +21 -0
  280. package/lib/components/lite-selector/style/_material-definition.scss +3 -0
  281. package/lib/components/lite-selector/style/_theme.scss +7 -0
  282. package/lib/components/lite-selector/style/material.scss +3 -0
  283. package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
  284. package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
  285. package/lib/components/product-configurator/style/_layout.scss +46 -0
  286. package/lib/components/product-configurator/style/_material-definition.scss +3 -0
  287. package/lib/components/product-configurator/style/_theme.scss +22 -0
  288. package/lib/components/product-configurator/style/material.scss +3 -0
  289. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
  290. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
  291. package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
  292. package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
  293. package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
  294. package/lib/components/product-configurator-selector/style/material.scss +3 -0
  295. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
  296. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
  297. package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
  298. package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
  299. package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
  300. package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
  301. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
  302. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
  303. package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
  304. package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
  305. package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
  306. package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
  307. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
  308. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
  309. package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
  310. package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
  311. package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
  312. package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
  313. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
  314. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
  315. package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
  316. package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
  317. package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
  318. package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
  319. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
  320. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
  321. package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
  322. package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
  323. package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
  324. package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
  325. package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
  326. package/lib/components/progress-bar/progress-bar.component.scss +14 -0
  327. package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
  328. package/lib/components/progress-bar/style/_layout.scss +18 -0
  329. package/lib/components/progress-bar/style/_material-definition.scss +3 -0
  330. package/lib/components/progress-bar/style/_theme.scss +10 -0
  331. package/lib/components/progress-bar/style/material.scss +3 -0
  332. package/lib/components/scene-options/scene-options.component.d.ts +24 -0
  333. package/lib/components/scene-options/scene-options.module.d.ts +11 -0
  334. package/lib/components/scene-options/style/_layout.scss +52 -0
  335. package/lib/components/scene-options/style/_material-definition.scss +3 -0
  336. package/lib/components/scene-options/style/_theme.scss +7 -0
  337. package/lib/components/scene-options/style/material.scss +3 -0
  338. package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
  339. package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
  340. package/lib/components/selections-summary/style/_layout.scss +87 -0
  341. package/lib/components/selections-summary/style/_material-definition.scss +5 -0
  342. package/lib/components/selections-summary/style/_theme.scss +13 -0
  343. package/lib/components/selections-summary/style/material.scss +3 -0
  344. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
  345. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
  346. package/lib/components/selections-summary-line/style/_layout.scss +12 -0
  347. package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
  348. package/lib/components/selections-summary-line/style/_theme.scss +12 -0
  349. package/lib/components/selections-summary-line/style/material.scss +3 -0
  350. package/lib/components/slideout/slideout.component.d.ts +22 -0
  351. package/lib/components/slideout/slideout.module.d.ts +7 -0
  352. package/lib/components/slideout/style/_layout.scss +27 -0
  353. package/lib/components/slideout/style/_material-definition.scss +3 -0
  354. package/lib/components/slideout/style/_theme.scss +5 -0
  355. package/lib/components/slideout/style/material.scss +3 -0
  356. package/lib/components/summary-line/style/_layout.scss +137 -0
  357. package/lib/components/summary-line/style/_material-definition.scss +4 -0
  358. package/lib/components/summary-line/style/_theme.scss +56 -0
  359. package/lib/components/summary-line/style/material.scss +3 -0
  360. package/lib/components/summary-line/summary-line.component.d.ts +50 -0
  361. package/lib/components/summary-line/summary-line.module.d.ts +11 -0
  362. package/lib/components/tag-filter/style/_layout.scss +14 -0
  363. package/lib/components/tag-filter/style/_material-definition.scss +3 -0
  364. package/lib/components/tag-filter/style/_theme.scss +7 -0
  365. package/lib/components/tag-filter/style/material.scss +3 -0
  366. package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
  367. package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
  368. package/lib/components/threedselector/style/_layout.scss +32 -0
  369. package/lib/components/threedselector/style/_material-definition.scss +3 -0
  370. package/lib/components/threedselector/style/_theme.scss +7 -0
  371. package/lib/components/threedselector/style/material.scss +9 -0
  372. package/lib/components/threedselector/threedselector.component.d.ts +38 -0
  373. package/lib/components/threedselector/threedselector.module.d.ts +10 -0
  374. package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
  375. package/lib/core/shader/floor-fade.shader.d.ts +5 -0
  376. package/lib/core/textures/depth-data-texture.d.ts +5 -0
  377. package/lib/directives/directives.module.d.ts +8 -0
  378. package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
  379. package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
  380. package/lib/enum/ar-feature.enum.d.ts +12 -0
  381. package/lib/enum/configuration-key.enum.d.ts +39 -0
  382. package/lib/enum/configuration-template.enum.d.ts +4 -0
  383. package/lib/enum/device-size-type.d.ts +5 -0
  384. package/lib/enum/device-tier.enum.d.ts +5 -0
  385. package/lib/enum/icon.enum.d.ts +111 -0
  386. package/lib/enum/item-type.enum.d.ts +21 -0
  387. package/lib/enum/light.enum.d.ts +7 -0
  388. package/lib/enum/navigator-type.enum.d.ts +4 -0
  389. package/lib/enum/output-encoding.enum.d.ts +7 -0
  390. package/lib/enum/result-type.enum.d.ts +19 -0
  391. package/lib/enum/scene-event.enum.d.ts +10 -0
  392. package/lib/enum/shadow-map-type.enum.d.ts +6 -0
  393. package/lib/enum/texture-type.d.ts +7 -0
  394. package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
  395. package/lib/enum/view-mode.enum.d.ts +5 -0
  396. package/lib/enum/xr-mode.enum.d.ts +4 -0
  397. package/lib/environments/environment.d.ts +4 -0
  398. package/lib/interfaces/aa-options.interface.d.ts +4 -0
  399. package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
  400. package/lib/interfaces/ao-options.interface.d.ts +18 -0
  401. package/lib/interfaces/changes.interface.d.ts +9 -0
  402. package/lib/interfaces/configuration-data.interface.d.ts +40 -0
  403. package/lib/interfaces/light-preset.interface.d.ts +22 -0
  404. package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
  405. package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
  406. package/lib/interfaces/screen-size-info.d.ts +10 -0
  407. package/lib/interfaces/setting.interface.d.ts +8 -0
  408. package/lib/interfaces/texture.interface.d.ts +44 -0
  409. package/lib/interfaces/vignette-options.interface.d.ts +4 -0
  410. package/lib/model/ar-position-indicator.d.ts +4 -0
  411. package/lib/model/camera-settings.d.ts +12 -0
  412. package/lib/model/configuration-result-object.d.ts +30 -0
  413. package/lib/model/configurator-error-message.d.ts +8 -0
  414. package/lib/model/configurator-settings.d.ts +62 -0
  415. package/lib/model/custom-button.d.ts +10 -0
  416. package/lib/model/factory.d.ts +5 -0
  417. package/lib/model/icon.d.ts +4 -0
  418. package/lib/model/intersected-objects.d.ts +6 -0
  419. package/lib/model/light-preset.d.ts +33 -0
  420. package/lib/model/light-properties.d.ts +25 -0
  421. package/lib/model/material.d.ts +41 -0
  422. package/lib/model/metadata.d.ts +78 -0
  423. package/lib/model/render-parameters.d.ts +12 -0
  424. package/lib/model/setting-options.d.ts +67 -0
  425. package/lib/model/settings.d.ts +10 -0
  426. package/lib/model/shadow-properties.d.ts +7 -0
  427. package/lib/model/skin.d.ts +15 -0
  428. package/lib/model/texture.d.ts +52 -0
  429. package/{model → lib/model}/variation-settings.d.ts +9 -8
  430. package/{model → lib/model}/variation.d.ts +2 -1
  431. package/lib/model/xr-reticle.d.ts +17 -0
  432. package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
  433. package/lib/modules/render/model/ar-parameters.d.ts +9 -0
  434. package/lib/modules/render/model/scene-setting.d.ts +13 -0
  435. package/lib/modules/render/model/scene-settings.d.ts +4 -0
  436. package/lib/pipes/append.pipe.d.ts +7 -0
  437. package/lib/pipes/google-translate.pipe.d.ts +11 -0
  438. package/lib/pipes/localize.pipe.d.ts +10 -0
  439. package/lib/pipes/pipes.module.d.ts +11 -0
  440. package/lib/pipes/prepend.pipe.d.ts +7 -0
  441. package/lib/pipes/strip-html.pipe.d.ts +7 -0
  442. package/lib/services/app-event.service.d.ts +32 -0
  443. package/lib/services/app-initializer.service.d.ts +14 -0
  444. package/lib/services/ar.service.d.ts +120 -0
  445. package/lib/services/build-furniture-base.service.d.ts +117 -0
  446. package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
  447. package/lib/services/build-furniture.service.d.ts +14 -0
  448. package/lib/services/bundle-initialzer.service.d.ts +45 -0
  449. package/lib/services/camera.service.d.ts +44 -0
  450. package/lib/services/configuration.service.d.ts +18 -0
  451. package/lib/services/configurator-connector.service.d.ts +140 -0
  452. package/lib/services/configurator.service.d.ts +62 -0
  453. package/lib/services/configuring.service.d.ts +46 -0
  454. package/lib/services/controls.d.ts +11 -0
  455. package/lib/services/debug.service.d.ts +16 -0
  456. package/lib/services/dictionary.service.d.ts +15 -0
  457. package/lib/services/dynamic-camera.service.d.ts +21 -0
  458. package/lib/services/floor-plane.service.d.ts +47 -0
  459. package/lib/services/font.service.d.ts +10 -0
  460. package/lib/services/google-translate.service.d.ts +26 -0
  461. package/lib/services/icon-cache.service.d.ts +21 -0
  462. package/lib/services/intersection.service.d.ts +11 -0
  463. package/lib/services/item.service.d.ts +18 -0
  464. package/lib/services/json-utils.service.d.ts +7 -0
  465. package/lib/services/light-creation.service.d.ts +9 -0
  466. package/lib/services/light-presets.service.d.ts +34 -0
  467. package/lib/services/lights.service.d.ts +34 -0
  468. package/lib/services/load-furniture-base.service.d.ts +37 -0
  469. package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
  470. package/lib/services/load-furniture.service.d.ts +9 -0
  471. package/lib/services/loader.service.d.ts +11 -0
  472. package/lib/services/locator.service.d.ts +7 -0
  473. package/lib/services/message-board.service.d.ts +18 -0
  474. package/lib/services/post-processing.service.d.ts +74 -0
  475. package/lib/services/product-configurator.service.d.ts +11 -0
  476. package/lib/services/progress.service.d.ts +9 -0
  477. package/lib/services/scene-event.service.d.ts +72 -0
  478. package/lib/services/scene-options.service.d.ts +11 -0
  479. package/lib/services/scene.service.d.ts +71 -0
  480. package/lib/services/screen-size-analysis.service.d.ts +32 -0
  481. package/lib/services/settings.service.d.ts +24 -0
  482. package/lib/services/switch-build-furniture.service.d.ts +21 -0
  483. package/lib/services/switch-load-furniture.service.d.ts +21 -0
  484. package/lib/services/threedselector.service.d.ts +17 -0
  485. package/lib/services/utils.service.d.ts +24 -0
  486. package/lib/services/variation-cache.service.d.ts +23 -0
  487. package/lib/services/variation.service.d.ts +26 -0
  488. package/lib/services/view-mode.service.d.ts +17 -0
  489. package/lib/services/vr.service.d.ts +42 -0
  490. package/lib/services/xr.service.d.ts +56 -0
  491. package/lib/style/_mixin.scss +9 -0
  492. package/lib/style/configurator-globals.scss +21 -0
  493. package/lib/style/template_variables.scss +37 -0
  494. package/lib/utils/color.utils.d.ts +8 -0
  495. package/lib/utils/debug.utils.d.ts +3 -0
  496. package/lib/utils/device.utils.d.ts +7 -0
  497. package/{utils → lib/utils}/file.utils.d.ts +3 -0
  498. package/{utils → lib/utils}/image.utils.d.ts +2 -3
  499. package/lib/utils/json-parser.utils.d.ts +9 -0
  500. package/lib/utils/material.utils.d.ts +34 -0
  501. package/lib/utils/object.utils.d.ts +32 -0
  502. package/lib/utils/relative-position.utils.d.ts +12 -0
  503. package/lib/utils/rotation-helper.utils.d.ts +6 -0
  504. package/lib/utils/scene-3d.utils.d.ts +8 -0
  505. package/lib/utils/text-utils.d.ts +4 -0
  506. package/{utils → lib/utils}/threed.utils.d.ts +7 -3
  507. package/{utils → lib/utils}/variation-utils.d.ts +4 -2
  508. package/package.json +17 -30
  509. package/public-api.d.ts +60 -0
  510. package/README.md +0 -28
  511. package/app/components/answers/answer/answer.component.d.ts +0 -11
  512. package/app/components/answers/answers.component.d.ts +0 -8
  513. package/app/components/answers/answers.module.d.ts +0 -2
  514. package/app/components/selections/selections.component.d.ts +0 -21
  515. package/app/components/selections/selections.module.d.ts +0 -2
  516. package/app/components/shared/loader/loader.component.d.ts +0 -2
  517. package/app/components/shared/shared.module.d.ts +0 -2
  518. package/app/services/configurator.service.d.ts +0 -19
  519. package/app/services/image-cache.service.d.ts +0 -10
  520. package/app/utils/object.utils.d.ts +0 -7
  521. package/colijnit-configurator.metadata.json +0 -1
  522. package/esm2015/app/builder.js +0 -706
  523. package/esm2015/app/components/answers/answer/answer.component.js +0 -66
  524. package/esm2015/app/components/answers/answers.component.js +0 -38
  525. package/esm2015/app/components/answers/answers.module.js +0 -27
  526. package/esm2015/app/components/selections/selections.component.js +0 -129
  527. package/esm2015/app/components/selections/selections.module.js +0 -21
  528. package/esm2015/app/components/shared/loader/loader.component.js +0 -22
  529. package/esm2015/app/components/shared/shared.module.js +0 -19
  530. package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
  531. package/esm2015/app/directives/visibility-observer.directive.js +0 -55
  532. package/esm2015/app/services/configurator.service.js +0 -79
  533. package/esm2015/app/services/image-cache.service.js +0 -63
  534. package/esm2015/app/utils/object.utils.js +0 -51
  535. package/esm2015/helper/variation-helper.js +0 -553
  536. package/esm2015/model/material.js +0 -11
  537. package/esm2015/model/variation-settings.js +0 -54
  538. package/esm2015/model/variation.js +0 -3
  539. package/esm2015/public_api.js +0 -7
  540. package/esm2015/utils/asset.utils.js +0 -124
  541. package/esm2015/utils/base-utils.js +0 -9
  542. package/esm2015/utils/file.utils.js +0 -142
  543. package/esm2015/utils/image.utils.js +0 -66
  544. package/esm2015/utils/object.utils.js +0 -49
  545. package/esm2015/utils/scene-utils.js +0 -187
  546. package/esm2015/utils/threed.utils.js +0 -226
  547. package/esm2015/utils/variation-utils.js +0 -388
  548. package/model/material.d.ts +0 -40
  549. package/public_api.d.ts +0 -6
  550. package/utils/object.utils.d.ts +0 -7
  551. /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
  552. /package/{utils → lib/utils}/base-utils.d.ts +0 -0
  553. /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
@@ -0,0 +1,1181 @@
1
+ import { __awaiter } from "tslib";
2
+ import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
3
+ import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
4
+ import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
5
+ import { Injectable } from '@angular/core';
6
+ import { Euler, Object3D, Vector3 } from 'three';
7
+ import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
8
+ import { HdecoPositioning } from '@colijnit/configuratorapi/build/enum/hdeco-positioning.enum';
9
+ import { Subject } from 'rxjs';
10
+ import { ObjectUtils } from '../utils/object.utils';
11
+ import { MaterialUtils } from '../utils/material.utils';
12
+ import { ResultType } from '../enum/result-type.enum';
13
+ import { ConfiguratorErrorMessage } from '../model/configurator-error-message';
14
+ import { Scene3DUtil } from '../utils/scene-3d.utils';
15
+ import { DebugUtils } from '../utils/debug.utils';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "./configurator-connector.service";
18
+ import * as i2 from "./dictionary.service";
19
+ import * as i3 from "./app-event.service";
20
+ import * as i4 from "./settings.service";
21
+ import * as i5 from "./variation.service";
22
+ import * as i6 from "./variation-cache.service";
23
+ import * as i7 from "./utils.service";
24
+ import * as i8 from "./item.service";
25
+ export class BuildFurnitureBaseService {
26
+ constructor(configuratorConnectorService, dictionaryService, appEventService, settingsService, variationService, variationCacheService, utilsService, itemService) {
27
+ this.configuratorConnectorService = configuratorConnectorService;
28
+ this.dictionaryService = dictionaryService;
29
+ this.appEventService = appEventService;
30
+ this.settingsService = settingsService;
31
+ this.variationService = variationService;
32
+ this.variationCacheService = variationCacheService;
33
+ this.utilsService = utilsService;
34
+ this.itemService = itemService;
35
+ this.defaultPosition = new Vector3(4, 0, 1);
36
+ this.defaultRotation = new Euler(0, Math.PI, 0);
37
+ this.isMouseOverObject = false;
38
+ this.answerSelected = new Subject();
39
+ this.arPlacementUpdate = new Subject();
40
+ this.showElementToolbar = false;
41
+ this._useNodeIdToLink = true;
42
+ this._placedAddables = [];
43
+ this._adjustables = [];
44
+ this._addables = [];
45
+ this._genericSelection = false;
46
+ this._answerSelected = [];
47
+ this._selectionsSelected = [];
48
+ this.subs = [];
49
+ this.placedAdjustables = [];
50
+ }
51
+ get useNodeIdToLink() {
52
+ return this._useNodeIdToLink;
53
+ }
54
+ get currentCustomFloorGroup() {
55
+ return this._currentCustomFloorGroup;
56
+ }
57
+ set currentCustomFloorGroup(item) {
58
+ this._currentCustomFloorGroup = item;
59
+ }
60
+ get selections() {
61
+ return this.configuratorConnectorService.selections;
62
+ }
63
+ set scene(scene) {
64
+ this._scene = scene;
65
+ }
66
+ get scene() {
67
+ return this._scene;
68
+ }
69
+ ngOnDestroy() {
70
+ this.subs.forEach(s => s.unsubscribe());
71
+ this.cleanup();
72
+ }
73
+ emptyAnswerSelected() {
74
+ this._answerSelected.length = 0;
75
+ }
76
+ emptySelectionsSelected() {
77
+ this._selectionsSelected.length = 0;
78
+ }
79
+ getOptionsFromSelection(baseSelection) {
80
+ const selections = [];
81
+ let nodeLevel = -1;
82
+ const len = this.selections.length;
83
+ for (let i = 0; i < len; i++) {
84
+ const selection = this.selections[i];
85
+ const level = selection.presentationLevel;
86
+ if (nodeLevel !== -1) {
87
+ if (nodeLevel < level && this.canConnectSelections(baseSelection, selection) && this.selectionPublished(selection)) {
88
+ selections.push(selection);
89
+ }
90
+ if (nodeLevel >= level) {
91
+ break;
92
+ }
93
+ }
94
+ if (selection.id === baseSelection.id && selection.node === baseSelection.node) {
95
+ nodeLevel = level;
96
+ }
97
+ }
98
+ return selections;
99
+ }
100
+ cancelConfiguringCurrentInstance() {
101
+ if (this._currentCustomFloorGroup) {
102
+ // TODO check what we should do with this this._currentCustomFloorGroup.configuring = false;
103
+ }
104
+ }
105
+ cancelAnswer(data, rebuild = true, getAnswers = false) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ yield this.configuratorConnectorService.cancelAnswer();
108
+ if (rebuild) {
109
+ this.startToBuildFromConfigurator(data);
110
+ }
111
+ else if (getAnswers) { // if not rebuild then check if we need to get answers
112
+ yield this.configuratorConnectorService.getQuestionAndAnswersAsync(); // see if there is user input needed
113
+ }
114
+ });
115
+ }
116
+ selectSelection(selection, data, forceBackToNode, after, connector) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ yield this.configuratorConnectorService.selectSelection(selection, forceBackToNode, after, connector);
119
+ this._genericSelection = selection.generic;
120
+ yield this.startToBuildFromConfigurator(data);
121
+ });
122
+ }
123
+ deleteSelection(selection, data) {
124
+ return __awaiter(this, void 0, void 0, function* () {
125
+ yield this.configuratorConnectorService.deleteSelection(selection);
126
+ yield this.startToBuildFromConfigurator(data);
127
+ });
128
+ }
129
+ replaceSelection(selection, data) {
130
+ return __awaiter(this, void 0, void 0, function* () {
131
+ yield this.configuratorConnectorService.replaceSelection(selection);
132
+ yield this.startToBuildFromConfigurator(data);
133
+ });
134
+ }
135
+ selectAnswer(answer, input, data) {
136
+ return __awaiter(this, void 0, void 0, function* () {
137
+ this.preloadMaterial(answer);
138
+ yield this.configuratorConnectorService.selectAnswer(answer, input);
139
+ this.handleAnswerSelected(answer);
140
+ const result = yield this.startToBuildFromConfigurator(data);
141
+ this.answerSelected.next(result);
142
+ });
143
+ }
144
+ selectSelectionAsAnswer(chosenOption, data) {
145
+ return __awaiter(this, void 0, void 0, function* () {
146
+ this.preloadMaterialBySelection(chosenOption);
147
+ this.handleSelectionSelected(chosenOption);
148
+ const result = yield this.startToBuildFromConfigurator(data);
149
+ this.answerSelected.next(result);
150
+ });
151
+ }
152
+ linkSelectionsAndDecos() {
153
+ const len = this.selections.length;
154
+ for (let i = 0; i < len; i++) {
155
+ // const id: string = this.selections[i].artNodeIdDeco;
156
+ let deco = this.configuratorConnectorService.decoNodes.find(d => d.nodeId === this.selections[i].node);
157
+ if (!deco) {
158
+ deco = new DecoNode();
159
+ }
160
+ if (deco.type !== DecoNodeType.Variation) {
161
+ const variation = this.getVariations().find(v => v.parentId === this.selections[i].artNodeIdDeco);
162
+ if (variation) {
163
+ deco.variation = variation;
164
+ }
165
+ }
166
+ this.selections[i].decoNode = deco;
167
+ }
168
+ this.appEventService.selectionsAndDecosLinked.next();
169
+ }
170
+ prepareTheSelections(instanceId) {
171
+ const selections = this.selections.slice();
172
+ const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
173
+ const adjustableSelections = selections.filter(s => s.addAdjust === '2');
174
+ const isArticleWithMaterial = adjustableSelections.length === 0 &&
175
+ selectionOfArticle.gameObject &&
176
+ selectionOfArticle.gameObject.length > 0;
177
+ // get generic variations
178
+ const globalVariations = selections
179
+ .filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && (!s.elementType || s.elementType === 'variation'))
180
+ .map((value, index, array) => {
181
+ // find selection of variation
182
+ const sel = selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
183
+ if (sel) {
184
+ value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
185
+ }
186
+ value.decoNode.variation.materialId = this.getMaterialIdFromParent(value.node);
187
+ return value.decoNode.variation;
188
+ });
189
+ let globalVariationsRewrite = true;
190
+ const len = selections.length;
191
+ let lastAdded;
192
+ let lastAdjustable;
193
+ let newPart = false;
194
+ let previousPresLevel = -1;
195
+ let positioning;
196
+ let optionText;
197
+ for (let i = 0; i < len; i++) {
198
+ const selection = selections[i];
199
+ if (selection.presentationLevel === 1) {
200
+ positioning = selection.hdecoPositioning;
201
+ optionText = selection.question;
202
+ }
203
+ if (selection.presentationLevel > previousPresLevel) {
204
+ selection.hdecoPositioning = selection.hdecoPositioning || positioning;
205
+ }
206
+ if (selection.decoNode) {
207
+ if (selection.decoNode.type === DecoNodeType.Variation) {
208
+ const decoNode = selection.decoNode;
209
+ decoNode.optionText = optionText;
210
+ // find selection of variation and set materialId in case of multimaterial
211
+ if (!decoNode.materialId) {
212
+ decoNode.materialId = this.getMaterialIdFromParent(decoNode.nodeId);
213
+ }
214
+ if (lastAdded) {
215
+ if (newPart) {
216
+ if (decoNode.materialId) {
217
+ lastAdded.variations.push(decoNode);
218
+ }
219
+ else {
220
+ lastAdded.variations = [decoNode];
221
+ }
222
+ }
223
+ else {
224
+ lastAdded.variations.push(decoNode);
225
+ }
226
+ newPart = false;
227
+ }
228
+ else {
229
+ globalVariations.push(decoNode);
230
+ }
231
+ // else {
232
+ // if (globalVariationsRewrite) {
233
+ // globalVariations.length = 0;
234
+ // globalVariationsRewrite = false;
235
+ // }
236
+ // globalVariations.push(decoNode);
237
+ // }
238
+ // const variation: FurniturePartVariation = new FurniturePartVariation();
239
+ // variation.BrandId = selection.decoNode.brandId;
240
+ // variation.Description = selection.decoNode.gameObjectName;
241
+ // variation.MaterialId = (selection.decoNode as any).materialId;
242
+ // variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
243
+ // usedVariations.push(variation);
244
+ }
245
+ else if ((selection.decoNode.type === DecoNodeType.Part &&
246
+ typeof selection.decoNode.gameObjectName === 'string' &&
247
+ selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
248
+ if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
249
+ selection.variations = globalVariations.slice();
250
+ this._adjustables.push(selection);
251
+ if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
252
+ newPart = true;
253
+ }
254
+ lastAdded = selection;
255
+ lastAdjustable = selection;
256
+ }
257
+ else if (selection.decoNode.kind === DecoNodeKind.Addable) {
258
+ selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations.slice();
259
+ if (lastAdjustable) {
260
+ lastAdjustable.addables.push(selection);
261
+ }
262
+ this._addables.push(selection);
263
+ if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
264
+ newPart = true;
265
+ }
266
+ lastAdded = selection;
267
+ }
268
+ }
269
+ }
270
+ previousPresLevel = selection.presentationLevel;
271
+ }
272
+ // this._upsertFurniture(this.activeInstance,
273
+ // {Variations: usedVariations});
274
+ }
275
+ preloadMaterials(schema) {
276
+ this.variationCacheService.preloadVariations(schema, this.configuratorConnectorService.decoNodes
277
+ .filter(d => (d.gameObjectName || d.materialUrl) && d.type === DecoNodeType.Variation)
278
+ .map(d => d), this.articleAssetPath);
279
+ }
280
+ prepareInstanceForBuild(shouldCopyInstance, loadFromProject, looseOriginalConfiguration, result) {
281
+ return __awaiter(this, void 0, void 0, function* () {
282
+ if (shouldCopyInstance && !loadFromProject) {
283
+ const originalInstanceId = result.instanceId;
284
+ result.originalItemId = originalInstanceId;
285
+ if (looseOriginalConfiguration) {
286
+ result.instanceId = yield this.configuratorConnectorService.copyInstanceAndLoseOriginalConfiguration(originalInstanceId, result)
287
+ .catch((e) => {
288
+ return originalInstanceId;
289
+ });
290
+ }
291
+ else {
292
+ result.instanceId = yield this.configuratorConnectorService.copyInstanceAndSaveOriginalConfiguration(originalInstanceId, result)
293
+ .catch((e) => {
294
+ return originalInstanceId;
295
+ });
296
+ }
297
+ }
298
+ if (result.resultType !== ResultType.ArticleNotFound && !loadFromProject) {
299
+ yield this.setInstanceToConfigure(result).catch((e) => {
300
+ Promise.reject(e);
301
+ return e;
302
+ });
303
+ }
304
+ return result;
305
+ });
306
+ }
307
+ getSelectionsAndDecos() {
308
+ return __awaiter(this, void 0, void 0, function* () {
309
+ try {
310
+ const selectionsAndDecoPromise = [];
311
+ selectionsAndDecoPromise.push(this.configuratorConnectorService.getSelectionsAsync(), this.configuratorConnectorService.getDecosAsync());
312
+ yield Promise.all(selectionsAndDecoPromise);
313
+ }
314
+ catch (e) {
315
+ DebugUtils.log(`Error getting selections and decos: ${e}`);
316
+ }
317
+ });
318
+ }
319
+ handlePrepareSelectionsDecos(result) {
320
+ return __awaiter(this, void 0, void 0, function* () {
321
+ if (this.configuratorConnectorService.selections.length < 2) { // no selections, only selection of type 'ART'
322
+ try {
323
+ if (result.resultType !== ResultType.ArticleNotFound && !result.originalItemId) { // article found, so init that first
324
+ result.originalItemId = result.instanceId;
325
+ result.instanceId = null;
326
+ yield this.setInstanceToConfigure(result);
327
+ result.resultType = ResultType.NoSelections;
328
+ return this.startToBuild(result); // 'restart' the build
329
+ }
330
+ this.getSelectionsAndDecosFromMetadata(result);
331
+ }
332
+ catch (e) {
333
+ DebugUtils.log(`Error preparing selections and decos: ${e}`);
334
+ return Promise.reject(e);
335
+ }
336
+ }
337
+ this.configuratorConnectorService.selections.forEach(s => {
338
+ s.schema = result.schema;
339
+ s.instanceId = result.instanceId;
340
+ }); // add schema for material creation
341
+ // TODO add this function, it's used for GTM this.handleSelectionsReceived(result.metaData);
342
+ this.linkSelectionsAndDecos();
343
+ this.prepareTheSelections(result.instanceId);
344
+ });
345
+ }
346
+ // TODO check if we need this function for Habufa
347
+ // protected handleIntegrationConnections(id: string, object: Item): void {
348
+ // const parts: FurniturePartIntegration[] = [];
349
+ // const childParts: Object3D[] = object.configurable ? object.children : [object];
350
+ // const len: number = childParts.length;
351
+ // for (let i = 0; i < len; i++) {
352
+ // const child: any = <CustomObject3D>childParts[i];
353
+ // const connection: FurniturePartIntegration = new FurniturePartIntegration();
354
+ // const variations: FurniturePartVariation[] = [];
355
+ // if (child.userData && child.userData.selection && child.userData.selection.decoNode) {
356
+ // connection.Id = childParts.findIndex(c => c === child).toString();
357
+ // connection.SupplierArticleNr = child.userData.selection.supplierArticleNr;
358
+ // connection.BrandIdentifier = child.userData.selection.decoNode.brandId;
359
+ // connection.BrandDescription = child.userData.selection.decoNode.gameObjectName;
360
+ // connection.Position = child.position;
361
+ // connection.Rotation = child.rotation;
362
+ // if (child.userData.selection.variations) {
363
+ // if (child.userData.selection.variations.length === 1) {
364
+ // const variation: any = child.userData.selection.variations[0];
365
+ // connection.Variation = variation.brandId;
366
+ // connection.VariationDescription = variation.gameObjectName;
367
+ // } else {
368
+ // for (let j = 0; j < child.userData.selection.variations.length; j++) {
369
+ // const variation: any = child.userData.selection.variations[j];
370
+ // const variationPart: FurniturePartVariation = new FurniturePartVariation();
371
+ // variationPart.Variation = variation.brandId;
372
+ // variationPart.VariationDescription = variation.gameObjectName;
373
+ // variationPart.MaterialId = variation.materialId;
374
+ // variationPart.SupplierArticleNr = variation.supplierArticleNr;
375
+ // variationPart.Option = variation.optionText;
376
+ // variations.push(variationPart);
377
+ // }
378
+ // connection.Variations = variations;
379
+ // }
380
+ // }
381
+ // } else { // a-artikel
382
+ // connection.Id = childParts.findIndex(c => c === child).toString();
383
+ // connection.BrandIdentifier = child.metadata.itemIdentifier;
384
+ // connection.BrandDescription = child.metadata.itemName;
385
+ // connection.Position = child.position;
386
+ // connection.Rotation = child.rotation;
387
+ // }
388
+ // const connectors: FurnitureConnectedPartIntegration[] = [];
389
+ // const clen: number = child.children.length;
390
+ // for (let j = 0; j < clen; j++) {
391
+ // const connector: any = child.children[j];
392
+ // if ((connector instanceof CustomObject3D || connector instanceof CustomMesh) && (connector as any).connectedTo) {
393
+ // const conn: FurnitureConnectedPartIntegration = new FurnitureConnectedPartIntegration();
394
+ // conn.ConnectionLabel = connector.name;
395
+ // const foreignPartIdx: number =
396
+ // this._currentCustomFloorGroup.children.findIndex(c => c.name === (connector as any).connectedTo);
397
+ // conn.ForeignConnectionLabel = this._currentCustomFloorGroup.children[foreignPartIdx].userData.selection.decoNode.gameObjectName;
398
+ // conn.ForeignPartId = foreignPartIdx.toString();
399
+ // conn.Position = connector.position;
400
+ // conn.Rotation = connector.rotation;
401
+ // connectors.push(conn);
402
+ // }
403
+ // }
404
+ // connection.ConnectedParts = connectors;
405
+ // parts.push(connection);
406
+ // }
407
+ // this.upsertFurniture(id, {Parts: parts}, object);
408
+ // }
409
+ //
410
+ // protected upsertFurniture(id: string, object: any, item: Item): void {
411
+ // if (this._integrationEnabled && !item.metadata.obsolete) {
412
+ // const idx: number = this._furnitureConfigurations.findIndex(f => f.Id === id);
413
+ // let furniture: FurnitureIntegration;
414
+ // if (idx < 0) {
415
+ // // empty entry for mrp code, re-use that one
416
+ // if (this._furnitureConfigurations.length === 1 && !this._furnitureConfigurations[0].Id) {
417
+ // furniture = this._furnitureConfigurations[0];
418
+ // } else {
419
+ // furniture = new FurnitureIntegration();
420
+ // this._furnitureConfigurations.push(furniture);
421
+ // }
422
+ // furniture.Id = id;
423
+ // } else {
424
+ // furniture = this._furnitureConfigurations[idx];
425
+ // }
426
+ // furniture.MrpCode = this.permanentStoreService.code;
427
+ // for (const key in object) {
428
+ // if (furniture.hasOwnProperty(key) && object.hasOwnProperty(key)) {
429
+ // furniture[key] = object[key];
430
+ // }
431
+ // }
432
+ // }
433
+ // }
434
+ // protected generateLayingPattern(floor: FloorPlaneItem, floorPattern: FloorPattern): void {
435
+ // const floorPatternInfo: FloorPatternInfo = this.generateFloorPatternInfo(floor, floorPattern);
436
+ // floor.restoreFloorObject();
437
+ // const meshLeft =
438
+ // this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdLeft) as Mesh;
439
+ // this.normalizeMesh(meshLeft);
440
+ //
441
+ // let meshRight: Mesh = null;
442
+ // if (floorPatternInfo.meshIdRight !== null) {
443
+ // meshRight = this.full3DObjectToUse.children.find(m => m.name === floorPatternInfo.meshIdRight) as Mesh;
444
+ // this.normalizeMesh(meshRight);
445
+ // }
446
+ //
447
+ // const floorSize: Vector3 = floor.size;
448
+ // const plankSize: Vector3 = new Vector3();
449
+ //
450
+ // meshLeft.geometry.boundingBox.getSize(plankSize);
451
+ //
452
+ // const items: FloorPatternTransform[] = this.floorPatternService.generatePattern(
453
+ // floorPatternInfo.floorPattern,
454
+ // plankSize,
455
+ // floorSize,
456
+ // floorPatternInfo.floorPatternDirection,
457
+ // floorPatternInfo.heartLine
458
+ // );
459
+ //
460
+ // // Debugging option
461
+ // // this._floorTileIntersectionService.toggleDebug();
462
+ // const floorCountResult: FloorCountResult = this.floorTileIntersectionService.countTiles(
463
+ // floor.floorMesh,
464
+ // items,
465
+ // meshLeft.geometry,
466
+ // (meshRight) ? meshRight.geometry : null,
467
+ // true
468
+ // );
469
+ //
470
+ // floor.metadata.floorCountResult = floorCountResult;
471
+ //
472
+ // const leftItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
473
+ // const rightItems: FloorPatternTransform[] = new Array<FloorPatternTransform>();
474
+ //
475
+ // for (const item of floorCountResult.filtered) {
476
+ // if (item.isLeft) {
477
+ // leftItems.push(item);
478
+ // } else {
479
+ // rightItems.push(item);
480
+ // }
481
+ // }
482
+ //
483
+ // const selection: Selection[] = this.selections;
484
+ // let variationGameObject: string;
485
+ // for (const selectionKey of selection) {
486
+ // if (selectionKey.elementType === 'variation') {
487
+ // variationGameObject = selectionKey.gameObject;
488
+ // break;
489
+ // }
490
+ // }
491
+ //
492
+ // let floorVariationMaterial: any;
493
+ // if (variationGameObject !== null) {
494
+ // this.variationService.loadVariationForMaterial(this.articleAssetPath, variationGameObject, floor.metadata.schema).then(result => {
495
+ // floorVariationMaterial = result;
496
+ // const texture: Texture = floorVariationMaterial.map;
497
+ // if (floorPatternInfo.floorPatternDirection === FloorPatternDirection.LYING) {
498
+ // texture.rotation = Math.PI / 2;
499
+ // } else {
500
+ // texture.rotation = 0;
501
+ // }
502
+ // const meshLeftMaterial: Material | Material[] = meshLeft.material;
503
+ // const plankMaterial = new MeshStandardMaterial({
504
+ // color: 0xFF0000,
505
+ // transparent: true,
506
+ // opacity: 0.8
507
+ // });
508
+ //
509
+ // const planksLeft =
510
+ // this.instancedMeshFromFloorPatternTransform(meshLeft.geometry, leftItems, plankMaterial);
511
+ // let planksRight: InstancedMesh;
512
+ // if (meshRight) {
513
+ // const meshRightMaterial: Material | Material[] = meshRight.material;
514
+ // planksRight = this.instancedMeshFromFloorPatternTransform(meshRight.geometry, rightItems, plankMaterial);
515
+ // }
516
+ // const customFloorWrapper = new Object3D();
517
+ // customFloorWrapper.add(planksLeft);
518
+ // if (planksRight) {
519
+ // customFloorWrapper.add(planksRight);
520
+ // }
521
+ // floor.floorObject = customFloorWrapper;
522
+ // this.floorService.configurableFloor = customFloorWrapper;
523
+ //
524
+ // // Now we update the default floorplane with the mesh
525
+ // floor.floorMaterial = floorVariationMaterial;
526
+ // this.sceneService.needsRender = true;
527
+ // // Emit update toggleFloorFrame event.
528
+ // this.messageBus.emit(MessageType.FloorRebuild);
529
+ // });
530
+ // }
531
+ // }
532
+ // protected instancedMeshFromFloorPatternTransform(
533
+ // geom: BufferGeometry,
534
+ // pattern: Array<FloorPatternTransform>,
535
+ // material: Material | Material[]
536
+ // ) {
537
+ // if (pattern.length <= 0) {
538
+ // return null;
539
+ // }
540
+ // const targetPlankMesh = new InstancedMesh(geom, material, pattern.length);
541
+ // const dummy = new Object3D();
542
+ // for (let i: number = 0; i < pattern.length; i++) {
543
+ // const item: FloorPatternTransform = pattern[i];
544
+ // const position: Vector3 = item.position;
545
+ // position.y = 0.02;
546
+ // const rotation: Vector3 = item.rotation;
547
+ // dummy.position.set(position.x, position.y, position.z);
548
+ // dummy.rotation.set(rotation.x, rotation.y, rotation.z);
549
+ // dummy.updateMatrix();
550
+ //
551
+ // targetPlankMesh.setMatrixAt(i, dummy.matrix);
552
+ // }
553
+ // return targetPlankMesh;
554
+ // }
555
+ // protected generateFloorPatternInfo(item: Item, floorPattern: FloorPattern): FloorPatternInfo {
556
+ // this.generateSelectedInMetadata(item);
557
+ // const info: FloorPatternInfo = {
558
+ // meshIdLeft: null,
559
+ // meshIdRight: null,
560
+ // floorPattern: FloorPattern.NORMAL,
561
+ // floorPatternDirection: FloorPatternDirection.LYING,
562
+ // heartLine: 0
563
+ // };
564
+ //
565
+ // let floorGameObject: string;
566
+ // for (const selectionKey of this.selections) {
567
+ // if (selectionKey.nodeType === 'ART') {
568
+ // floorGameObject = selectionKey.gameObject;
569
+ // break;
570
+ // }
571
+ // }
572
+ //
573
+ // info.heartLine = Number(this.floorService.floorCenterLineXAxis);
574
+ // // TODO convert floorPatternDirection to type number to let the user use custom rotation, for now there are only 2 options based on enum
575
+ // if (this.floorService.floorRotation === 0) {
576
+ // info.floorPatternDirection = FloorPatternDirection.LYING;
577
+ // } else {
578
+ // info.floorPatternDirection = FloorPatternDirection.STANDING;
579
+ // }
580
+ // info.floorPattern = floorPattern;
581
+ // info.meshIdLeft = floorGameObject;
582
+ // if (info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
583
+ // info.meshIdRight = `r_${floorGameObject}`;
584
+ // }
585
+ // if (info.floorPattern === FloorPattern.HERRINGBONE) {
586
+ // info.meshIdRight = info.meshIdLeft;
587
+ // }
588
+ // const afmeting = selected.find(s => s.question.toLowerCase() === 'plank afmeting');
589
+ // let afmetingString: string = afmeting.answer.toLowerCase();
590
+ // afmetingString = afmetingString.substr(afmetingString.lastIndexOf(' ') + 1);
591
+ // const legPatroonAnswer = selected.find(s => s.question.toLowerCase() === 'leg patroon').answer.toLowerCase();
592
+ // let legPatroonString = '';
593
+ // const hartlineType = selected.find(s => s.question.toLowerCase() === 'hartlijn');
594
+ //
595
+ // if (hartlineType && hartlineType.answer.toLowerCase() === 'aangepast') {
596
+ // const hartlineValue = selected.find(s => s.question.toLowerCase() === 'hartlijn_aangepast');
597
+ // if (hartlineValue && hartlineValue.userInputValue !== undefined) {
598
+ // info.heartLine = Number(hartlineValue.userInputValue);
599
+ // }
600
+ // }
601
+ //
602
+ //
603
+ // switch (true) {
604
+ // case legPatroonAnswer.indexOf('recht') !== -1:
605
+ // legPatroonString = '90';
606
+ // info.floorPattern = FloorPattern.NORMAL;
607
+ // break;
608
+ // case legPatroonAnswer.indexOf('graat') !== -1:
609
+ // legPatroonString = '90';
610
+ // info.floorPattern = FloorPattern.HERRINGBONE;
611
+ // break;
612
+ // case legPatroonAnswer.indexOf('60') !== -1:
613
+ // legPatroonString = '60';
614
+ // info.floorPattern = FloorPattern.HON60;
615
+ // break;
616
+ // case legPatroonAnswer.indexOf('45') !== -1:
617
+ // legPatroonString = '45';
618
+ // info.floorPattern = FloorPattern.HON45;
619
+ // break;
620
+ // }
621
+ //
622
+ // info.meshIdLeft = `${afmetingString}_${legPatroonString}`;
623
+ // if ( info.floorPattern === FloorPattern.HON45 || info.floorPattern === FloorPattern.HON60) {
624
+ // info.meshIdRight = `r_${afmetingString}_${legPatroonString}`;
625
+ // }
626
+ //
627
+ // if (info.floorPattern === FloorPattern.HERRINGBONE) {
628
+ // info.meshIdRight = info.meshIdLeft;
629
+ // }
630
+ //
631
+ // const legRichtingAnswer = selected.find(s => s.question.toLowerCase() === 'leg richting').answer.toLowerCase();
632
+ // info.floorPatternDirection =
633
+ // (legRichtingAnswer.indexOf('verticaal') !== -1) ? FloorPatternDirection.STANDING : FloorPatternDirection.LYING;
634
+ // return info;
635
+ // }
636
+ // protected generateSelectedInMetadata(item: Item): void {
637
+ // const cloneSelections = JSON.parse(JSON.stringify(this.selections));
638
+ // cloneSelections.forEach(s => {
639
+ // s.imageData = undefined;
640
+ // s.imageDataLastAnswer = undefined;
641
+ // if (s.addables) {
642
+ // s.addables.forEach(a => {
643
+ // a.imageData = undefined;
644
+ // });
645
+ // }
646
+ // });
647
+ // item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
648
+ // item.metadata.selections = cloneSelections;
649
+ // }
650
+ normalizeMesh(mesh) {
651
+ const meshSize = new Vector3();
652
+ mesh.geometry.computeBoundingBox();
653
+ mesh.geometry.boundingBox.getSize(meshSize);
654
+ if (meshSize.z > meshSize.x) {
655
+ mesh.geometry.rotateY(Math.PI / 2);
656
+ }
657
+ mesh.geometry.center();
658
+ mesh.geometry.computeBoundingBox();
659
+ const center = new Vector3();
660
+ mesh.geometry.boundingBox.getCenter(center);
661
+ mesh.position.copy(center);
662
+ }
663
+ setInstanceToConfigure(result) {
664
+ return __awaiter(this, void 0, void 0, function* () {
665
+ if (result.resultType !== ResultType.Timeout) {
666
+ if (result.instanceId) {
667
+ yield this.configuratorConnectorService.setInstance(result.instanceId)
668
+ .catch((e) => {
669
+ result.errorMessages.push(new ConfiguratorErrorMessage(e));
670
+ Promise.reject(result);
671
+ });
672
+ }
673
+ else {
674
+ const response = yield this.configuratorConnectorService.initNodeInstance(result.goodId, true)
675
+ .catch((e) => {
676
+ result.errorMessages.push(new ConfiguratorErrorMessage(e));
677
+ Promise.reject(result);
678
+ });
679
+ if (response && response.validationResult && response.validationResult.success) {
680
+ result.instanceId = response.resultObject;
681
+ }
682
+ else {
683
+ // timeout / unable to set instanceid
684
+ result.errorMessages.push(new ConfiguratorErrorMessage('ERROR_SETTING_INSTANCE_ID'));
685
+ Promise.reject(result);
686
+ }
687
+ yield this.configuratorConnectorService.setInstance(result.instanceId)
688
+ .catch((e) => {
689
+ result.errorMessages.push(new ConfiguratorErrorMessage(e));
690
+ Promise.reject(result);
691
+ });
692
+ }
693
+ return result;
694
+ }
695
+ else {
696
+ return Promise.reject();
697
+ }
698
+ });
699
+ }
700
+ getSelectionsAndDecosFromMetadata(result) {
701
+ if (result.selections && result.decos) {
702
+ this.configuratorConnectorService.setSelections(result.selections);
703
+ this.configuratorConnectorService.setDecoNodes(Array.from(result.decos.values()));
704
+ result.obsolete = true;
705
+ if (result.resultType !== ResultType.ConfigurationNotFixed) {
706
+ result.resultType = ResultType.Obsolete;
707
+ }
708
+ }
709
+ else {
710
+ if (this.configuratorConnectorService.selections.length < 2 || this.configuratorConnectorService.decoNodes.length === 0) {
711
+ result.errorMessages.push(new ConfiguratorErrorMessage('NO_SELECTIONS_OR_DECOS', 'NO_SELECTIONS_OR_DECOS_INFO'));
712
+ }
713
+ throw result;
714
+ }
715
+ }
716
+ selectionPublished(selection) {
717
+ return ((selection.hierarchicalPublicationCode === null) || ((selection.hierarchicalPublicationCode & 2) > 0)) &&
718
+ ((selection.nodeType === NodeType.Question &&
719
+ (((selection.questionPublicationCode & 2) > 0) ||
720
+ selection.questionPublicationCode === null || selection.questionPublicationCode === undefined)) ||
721
+ (selection.nodeType === NodeType.Answer &&
722
+ (((selection.answerPublicationCode & 2) > 0) ||
723
+ selection.answerPublicationCode === null || selection.answerPublicationCode === undefined)));
724
+ }
725
+ cleanupBeforePresetLoad() {
726
+ MaterialUtils.ClearCaches();
727
+ }
728
+ /*
729
+ * Clear variables to let objects being disposed properly
730
+ */
731
+ handleAfterPresetLoad() {
732
+ // make sure nothing is keeping a lock
733
+ this.configuratorConnectorService.setInstance(null);
734
+ // clean
735
+ this.cleanup();
736
+ }
737
+ cleanup() {
738
+ ObjectUtils.DisposeObject(this.full3DObjectToUse);
739
+ this.full3DObjectToUse = undefined;
740
+ this._currentCustomFloorGroup = undefined;
741
+ ObjectUtils.DisposeObject(this._activeChildElement);
742
+ this._activeChildElement = undefined;
743
+ this.placedAdjustables.length = 0;
744
+ this._placedAddables.length = 0;
745
+ this._adjustables.length = 0;
746
+ this._addables.length = 0;
747
+ }
748
+ canConnectSelections(sel1, sel2) {
749
+ if (!sel1.decoNode || !sel2.decoNode) {
750
+ return false;
751
+ }
752
+ let canConnect = sel2.decoNode.type !== DecoNodeType.Part;
753
+ if (!canConnect) {
754
+ const len = sel1.decoNode.connectors.length;
755
+ for (let i = 0; i < len; i++) {
756
+ const leni = sel2.decoNode.connectors.length;
757
+ for (let ii = 0; ii < leni; ii++) {
758
+ canConnect = Scene3DUtil.CanSelectorConnect(sel1.decoNode.connectors, sel1.decoNode.connectors[i], sel2.decoNode.connectors[ii]);
759
+ if (canConnect) {
760
+ return true;
761
+ }
762
+ }
763
+ }
764
+ return false;
765
+ }
766
+ return canConnect;
767
+ }
768
+ handleAnswerSelected(answer) {
769
+ this._answerSelected.push(answer);
770
+ }
771
+ handleSelectionSelected(chosenOption) {
772
+ this._selectionsSelected.push(chosenOption.opvTreeNodeHierarchy);
773
+ }
774
+ createConfigurableItem(itemName) {
775
+ const item = new Object3D();
776
+ item.name = itemName + '_clone';
777
+ item.visible = true;
778
+ return item;
779
+ }
780
+ // @ts-ignore
781
+ // protected createPositionAnimation(object: Object3D, from: Vector3, to: Vector3, easing: TWEEN.Easing): Promise<void> {
782
+ // const tweenFrom: Vector3 = new Vector3().copy(from);
783
+ // const tween = new TWEEN.Tween(tweenFrom)
784
+ // .to(to, 1000)
785
+ // .easing(easing)
786
+ // .onUpdate(() => {
787
+ // object.position.copy(tweenFrom);
788
+ // this.sceneService.needsRender = true;
789
+ // });
790
+ // // @ts-ignore
791
+ // return new Promise((resolve: Function, reject: Function) => tween.onComplete(resolve.bind(this, tween)).onStop(reject).start());
792
+ // }
793
+ // protected async animateChanges(furniture: Item, changes: ChangesInterface[]): Promise<void[]> {
794
+ // // it's christmasss
795
+ // const animations: Promise<void>[] = [];
796
+ // if (furniture instanceof CustomFloorItem) {
797
+ // for (let i = 0; i < changes.length; i++) {
798
+ // // @ts-ignore
799
+ // const easing: TWEEN.Easing = !changes[i].oldPosition ? TWEEN.Easing.Exponential.Out :
800
+ // (!changes[i].newPosition ? TWEEN.Easing.Exponential.Out : TWEEN.Easing.Exponential.InOut);
801
+ // const from: Vector3 =
802
+ // // tslint:disable-next-line:max-line-length
803
+ // changes[i].oldPosition ? new Vector3().copy(changes[i].oldPosition) : new Vector3().copy(changes[i].newPosition).setY(10);
804
+ // const to: Vector3 =
805
+ // // tslint:disable-next-line:max-line-length
806
+ // changes[i].newPosition ? new Vector3().copy(changes[i].newPosition) : new Vector3().copy(changes[i].oldPosition).setY(10);
807
+ // const obj: Object3D = furniture.getObjectByName(changes[i].name);
808
+ // if (!from.equals(to)) {
809
+ // animations.push(
810
+ // this.createPositionAnimation(obj, from, to, easing)
811
+ // );
812
+ // }
813
+ // }
814
+ // }
815
+ // return await Promise.all(animations);
816
+ // }
817
+ cloneSelections() {
818
+ const cloneSelections = JSON.parse(JSON.stringify(this.selections));
819
+ cloneSelections.forEach(s => {
820
+ s.imageData = undefined;
821
+ s.imageDataLastAnswer = undefined;
822
+ if (s.addables) {
823
+ s.addables.forEach(a => {
824
+ a.imageData = undefined;
825
+ });
826
+ }
827
+ });
828
+ return cloneSelections;
829
+ }
830
+ updateBuildObject(newItem, resultObject) {
831
+ return __awaiter(this, void 0, void 0, function* () {
832
+ const cloneSelections = this.cloneSelections();
833
+ newItem.visible = true;
834
+ newItem.name = resultObject.articleName;
835
+ newItem.userData.rootObject = true;
836
+ if (resultObject.position) {
837
+ newItem.position.copy(resultObject.position);
838
+ }
839
+ // TODO ask why it could also be an number
840
+ if (resultObject.rotation && resultObject.rotation instanceof Euler) {
841
+ newItem.rotation.copy(resultObject.rotation);
842
+ }
843
+ else if (resultObject.default180 && !resultObject.rotation) {
844
+ newItem.rotation.set(this.defaultRotation.x, this.defaultRotation.y, this.defaultRotation.z);
845
+ newItem.updateMatrixWorld(true);
846
+ }
847
+ resultObject.object = newItem;
848
+ resultObject.selections = cloneSelections;
849
+ resultObject.decos = Array.from(this.configuratorConnectorService.decoNodes);
850
+ return resultObject;
851
+ });
852
+ }
853
+ isMoveableObject(obj) {
854
+ return obj.userData && obj.userData.selection && obj.userData.selection.hdecoPositioning === HdecoPositioning.Variable;
855
+ }
856
+ addElementOnConnector(currentItem, element, connector, connectedNodeId) {
857
+ return __awaiter(this, void 0, void 0, function* () {
858
+ // TODO this should do something, but not sure what
859
+ // const connectorFromElement = currentItem.connectorFromElement(element.userData.selection);
860
+ // const idFromBaseElement: number = connectedNodeId ? connectedNodeId : connectorFromElement.connectedNodeId;
861
+ // const baseElement: Object3D[] = currentItem.getObjectsByUserDataProp('selection', 'nodeId', idFromBaseElement);
862
+ //
863
+ // const item: Item = ObjectUtils.GetParentItem(element);
864
+ // if (item) {
865
+ // const conn: string =
866
+ // await this.elementService.placeElementOnConnector(
867
+ // item.metadata.itemId,
868
+ // element,
869
+ // baseElement.length > 0 ? baseElement[0] : null,
870
+ // false,
871
+ // connector,
872
+ // false
873
+ // );
874
+ // this.saveElementConnector(element, conn);
875
+ // }
876
+ });
877
+ }
878
+ saveElementConnector(element, connector) {
879
+ // if (element && element.userData && element.userData.selection) {
880
+ // this._currentCustomFloorGroup.updateElementConnector(element.userData.selection, connector, this.baseElementNodeId);
881
+ // }
882
+ }
883
+ getIdentifierFromSelection(selection) {
884
+ return `${selection.decoNode ? selection.decoNode.nodeId + '_' : ''}${selection.nodeId}`;
885
+ }
886
+ reset() {
887
+ this.placedAdjustables.length = 0;
888
+ this._placedAddables.length = 0;
889
+ this._adjustables.length = 0;
890
+ this._addables.length = 0;
891
+ // this._prepareTheSelections();
892
+ // todo: check this
893
+ // this._elementService.removeElement(this.activeInstance);
894
+ }
895
+ /**
896
+ * Returns the materialId of the parent up the tree until presentionlevel 1 is reached
897
+ * @param id
898
+ * @private
899
+ */
900
+ getMaterialIdFromParent(id) {
901
+ const idx = this.selections.findIndex(s => s.node === id);
902
+ let currentLevel = 999;
903
+ if (idx > -1) {
904
+ for (let i = idx; i > 0; i--) {
905
+ const selection = this.selections[i];
906
+ if (selection.presentationLevel >= currentLevel) {
907
+ break;
908
+ }
909
+ currentLevel = selection.presentationLevel;
910
+ if (selection.hdecoGameObject) {
911
+ return selection.hdecoGameObject;
912
+ }
913
+ }
914
+ }
915
+ return undefined;
916
+ }
917
+ getAdjustables(checkGameObject = true, checkType = true) {
918
+ return this.selections.filter(s => {
919
+ const node = s.decoNode;
920
+ // tslint:disable-next-line:max-line-length
921
+ return node && (checkGameObject ? node.gameObjectName : true) && (checkType ? node.type === DecoNodeType.Part : true) && node.kind === DecoNodeKind.Adjustable;
922
+ });
923
+ }
924
+ getVariations() {
925
+ if (this.configuratorConnectorService.decoNodes.length === 0) {
926
+ return [];
927
+ }
928
+ return this.configuratorConnectorService.decoNodes.filter((deco) => {
929
+ return deco.type === DecoNodeType.Variation;
930
+ });
931
+ }
932
+ createAdjustable(item, adj) {
933
+ // tslint:disable-next-line:max-line-length
934
+ let obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
935
+ if (!obj) {
936
+ // in case of glb files, the importer removes dots from names
937
+ const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
938
+ obj = this.full3DObjectToUse ? this.full3DObjectToUse.getObjectByName(name) : null;
939
+ if (!obj) {
940
+ DebugUtils.log(`No object with name ${adj.decoNode.gameObjectName} found!`);
941
+ return null;
942
+ }
943
+ }
944
+ let adjustable = obj.clone();
945
+ adjustable.name = this.createUniqueName(item, obj);
946
+ adjustable.userData.selection = adj;
947
+ adjustable.position.set(0, 0, 0);
948
+ adjustable.traverse(c => {
949
+ c.visible = !c.name.toLowerCase().startsWith('c_');
950
+ });
951
+ item.add(adjustable);
952
+ adjustable = item.getObjectByName(adjustable.name);
953
+ this.placedAdjustables.push(adjustable);
954
+ return adjustable;
955
+ }
956
+ createAddable(item, add, part2, part1) {
957
+ const obj = this.full3DObjectToUse.getObjectByName(add.decoNode.gameObjectName);
958
+ if (!obj) {
959
+ return null;
960
+ }
961
+ // const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
962
+ const addable = obj.clone();
963
+ addable.name = this.createUniqueName(item, obj);
964
+ addable.userData.selection = add;
965
+ addable.position.set(0, 0, 0);
966
+ addable.visible = true;
967
+ if (part1 && part2) {
968
+ return this.placeAddable(item, addable);
969
+ }
970
+ return addable;
971
+ }
972
+ placeAddable(item, add) {
973
+ item.add(add);
974
+ const addable = item.getObjectByName(add.name);
975
+ this._placedAddables.push(addable);
976
+ return addable;
977
+ }
978
+ createUniqueName(item, obj) {
979
+ let iteration = 0;
980
+ let name = `${item.name}_${obj.name}`;
981
+ let existingObj = item.getObjectByName(name);
982
+ while (existingObj) {
983
+ iteration++;
984
+ name = `${item.name}_${obj.name}` + (iteration !== 0 ? ('_' + iteration) : '');
985
+ existingObj = item.getObjectByName(name);
986
+ }
987
+ return name;
988
+ }
989
+ placeAddables(item) {
990
+ const len = this.placedAdjustables.length;
991
+ for (let i = 0; i < len; i++) {
992
+ if (this.placedAdjustables[i].userData.hasOwnProperty('selection') && this.placedAdjustables[i].userData.selection) {
993
+ const adjustableSelection = this.placedAdjustables[i].userData.selection;
994
+ if (adjustableSelection) {
995
+ const lena = adjustableSelection.addables.length;
996
+ let conAddable;
997
+ for (let ia = 0; ia < lena; ia++) {
998
+ Scene3DUtil.TrySelectorConnection(this.scene, item, this.placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
999
+ if (conAddable) {
1000
+ Scene3DUtil.TrySelectorConnection(this.scene, item, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this.createAddable(item, add, part2, part1));
1001
+ }
1002
+ conAddable = this._placedAddables[this._placedAddables.length - 1];
1003
+ }
1004
+ }
1005
+ }
1006
+ }
1007
+ }
1008
+ loadVariations(item, instanceId) {
1009
+ return __awaiter(this, void 0, void 0, function* () {
1010
+ if (this.settingsService.settings.options.useVariationOnPart) {
1011
+ yield this.variationService.loadPart(this.articleAssetPath, this._adjustables, instanceId, item, true);
1012
+ }
1013
+ yield this.variationService.loadVariation(this.articleAssetPath, this._adjustables, instanceId, item, true);
1014
+ yield this.variationService.loadVariation(this.articleAssetPath, this._addables, instanceId, item, true);
1015
+ this.variationService.clearCache();
1016
+ });
1017
+ }
1018
+ preloadMaterial(answer) {
1019
+ if (answer.elementType === DecoNodeType.Variation && (answer.gameObject || answer.materialUrl)) {
1020
+ const variations = this.getVariations();
1021
+ const variationDecoNode = variations.find(v => ((v.parentId && answer.parentArticleDecoId && v.parentId.toString() === answer.parentArticleDecoId.toString()) ||
1022
+ // @ts-ignore
1023
+ (v.parentId && answer.parentNodeId && v.parentId.toString() === answer.parentNodeId.toString())));
1024
+ if (!variationDecoNode || !this.currentCustomFloorGroup) {
1025
+ return;
1026
+ }
1027
+ let affectedSelections = [];
1028
+ if (this._genericSelection) {
1029
+ affectedSelections = this._adjustables;
1030
+ }
1031
+ else {
1032
+ const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
1033
+ if (currentSelection) {
1034
+ affectedSelections = [this._adjustables.find((selection) => selection.nodeId === currentSelection.nodeId)];
1035
+ }
1036
+ }
1037
+ // tslint:disable-next-line:max-line-length
1038
+ const adjustablesClone = affectedSelections && affectedSelections.length > 0 ? affectedSelections.map(s => Object.assign({}, s)) : [];
1039
+ if (adjustablesClone.length === 0) {
1040
+ return;
1041
+ }
1042
+ adjustablesClone.forEach((selection) => {
1043
+ const variation = selection.variations.find(v => (
1044
+ // tslint:disable-next-line:max-line-length
1045
+ v).decoId.toString() === variationDecoNode.id.toString() && v.node.toString() === variationDecoNode.nodeId.toString());
1046
+ if (variation) {
1047
+ if (variation.materialUrl) {
1048
+ variation.materialUrl = answer.materialUrl;
1049
+ }
1050
+ else {
1051
+ variation.gameObjectName = answer.gameObject;
1052
+ }
1053
+ }
1054
+ });
1055
+ this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [answer], this.articleAssetPath)
1056
+ .then(() => {
1057
+ this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
1058
+ });
1059
+ }
1060
+ }
1061
+ preloadMaterialBySelection(answer) {
1062
+ if (answer.elementType === DecoNodeType.Variation && answer.gameObject) {
1063
+ const variationDecoNode = new DecoNode();
1064
+ variationDecoNode.gameObjectName = answer.gameObject;
1065
+ const adjustablesClone = this._adjustables.map(s => Object.assign({}, s));
1066
+ if (this._genericSelection) {
1067
+ if (this.currentCustomFloorGroup) {
1068
+ adjustablesClone.forEach((selection) => selection.variations = [variationDecoNode]);
1069
+ // tslint:disable-next-line:max-line-length
1070
+ this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
1071
+ .then(() => {
1072
+ this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true);
1073
+ });
1074
+ }
1075
+ else {
1076
+ this._adjustables.forEach((selection) => selection.variations = [variationDecoNode]);
1077
+ }
1078
+ }
1079
+ else {
1080
+ const currentSelection = ObjectUtils.GetSelectionFromSelectedObject(this._activeChildElement);
1081
+ if (currentSelection) {
1082
+ if (this.currentCustomFloorGroup) {
1083
+ const selectionFromAdjustables = adjustablesClone
1084
+ .find((selection) => selection.nodeId === currentSelection.nodeId);
1085
+ if (selectionFromAdjustables) {
1086
+ selectionFromAdjustables.variations = [variationDecoNode];
1087
+ this.variationCacheService.preloadVariationsAsync(adjustablesClone[0].schema, [variationDecoNode], this.articleAssetPath)
1088
+ .then(() => {
1089
+ this.variationService.loadVariation(this.articleAssetPath, adjustablesClone, '', this.currentCustomFloorGroup, true).then();
1090
+ });
1091
+ }
1092
+ }
1093
+ else {
1094
+ const selectionFromAdjustables = this._adjustables
1095
+ .find((selection) => selection.nodeId === currentSelection.nodeId);
1096
+ selectionFromAdjustables.variations = [variationDecoNode];
1097
+ }
1098
+ }
1099
+ }
1100
+ }
1101
+ }
1102
+ buildFloor(result) {
1103
+ return __awaiter(this, void 0, void 0, function* () {
1104
+ // let floorWithoutPlankCounter: boolean = true;
1105
+ // let floorPattern: FloorPattern;
1106
+ // const articleFullObject: ArticleFullObject = await this.connectorAdapterService.getArticleFullObject(+result.metaData.goodId);
1107
+ // if (articleFullObject.tags !== null && articleFullObject.tags.length > 0) {
1108
+ // for (const tag of articleFullObject.tags) {
1109
+ // if (tag.description === 'NORMAL') {
1110
+ // floorPattern = FloorPattern.NORMAL;
1111
+ // } else if (tag.description === 'HERRINGBONE') {
1112
+ // floorPattern = FloorPattern.HERRINGBONE;
1113
+ // } else if (tag.description === 'HON60') {
1114
+ // floorPattern = FloorPattern.HON60;
1115
+ // } else if (tag.description === 'HON45') {
1116
+ // floorPattern = FloorPattern.HON45;
1117
+ // } else {
1118
+ // floorPattern = FloorPattern.NORMAL;
1119
+ // }
1120
+ // }
1121
+ // floorWithoutPlankCounter = false;
1122
+ // }
1123
+ //
1124
+ // const item: FloorPlaneItem = this.floorService.floorToConfigure;
1125
+ // item.metadata = result.metaData;
1126
+ // item.metadata.selections = this.cloneSelections();
1127
+ // item.metadata.decos = Array.from(this.configuratorConnectorService.decoNodes);
1128
+ // this.handleCreateFloor(item);
1129
+ //
1130
+ // if (floorWithoutPlankCounter) {
1131
+ // const floorRotation: number = this.floorService.floorRotation;
1132
+ // item.children[0].userData.selection = this.selections[0];
1133
+ // await this.loadVariations(item, result.metaData.itemId);
1134
+ //
1135
+ // item.metadata.textureAssetName = this.variationService.loadedAsset;
1136
+ // this.floorService.unHighLightFloors();
1137
+ // this.sceneService.needsRender = true;
1138
+ // this.currentCustomFloorGroup = item;
1139
+ // result.furniture = this.currentCustomFloorGroup;
1140
+ // result.instanceId = result.metaData.itemId;
1141
+ //
1142
+ // } else {
1143
+ // this.floorService.unHighLightFloors();
1144
+ // this.sceneService.needsRender = true;
1145
+ // this.currentCustomFloorGroup = item;
1146
+ // result.furniture = this.currentCustomFloorGroup;
1147
+ // result.instanceId = result.metaData.itemId;
1148
+ // // this._generateLayingPattern(item, floorPattern);
1149
+ // }
1150
+ //
1151
+ // this.handleIntegration(result.metaData.itemId, this.currentCustomFloorGroup);
1152
+ // if (this.currentCustomFloorGroup.itemGroup) {
1153
+ // this.itemGroupService.reattachToItemGroup(
1154
+ // this.currentCustomFloorGroup,
1155
+ // this.currentCustomFloorGroup.itemGroup,
1156
+ // this.currentCustomFloorGroup.position);
1157
+ // }
1158
+ // this.emptyAnswerSelected();
1159
+ //
1160
+ // if (result.resultType === ResultType.NoSelections) {
1161
+ // result.resultType = ResultType.ConfigurationFixed;
1162
+ // } else if (result.resultType !== ResultType.Obsolete && result.resultType !== ResultType.ConfigurationFixed) { // don't override these
1163
+ // result.resultType = ResultType.Loaded;
1164
+ // }
1165
+ // this.floorService.floorResultObject = result;
1166
+ // this.buildFinished.next(result);
1167
+ // return result;
1168
+ });
1169
+ }
1170
+ downloadUDSZforARIOS() {
1171
+ const objects = this.itemService.sceneItems;
1172
+ const objectToExport = objects.values().next().value;
1173
+ this.utilsService.downloadUSDZforARIOS(objectToExport);
1174
+ }
1175
+ }
1176
+ BuildFurnitureBaseService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, deps: [{ token: i1.ConfiguratorConnectorService }, { token: i2.DictionaryService }, { token: i3.AppEventService }, { token: i4.SettingsService }, { token: i5.VariationService }, { token: i6.VariationCacheService }, { token: i7.UtilsService }, { token: i8.ItemService }], target: i0.ɵɵFactoryTarget.Injectable });
1177
+ BuildFurnitureBaseService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService });
1178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: BuildFurnitureBaseService, decorators: [{
1179
+ type: Injectable
1180
+ }], ctorParameters: function () { return [{ type: i1.ConfiguratorConnectorService }, { type: i2.DictionaryService }, { type: i3.AppEventService }, { type: i4.SettingsService }, { type: i5.VariationService }, { type: i6.VariationCacheService }, { type: i7.UtilsService }, { type: i8.ItemService }]; } });
1181
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtZnVybml0dXJlLWJhc2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3NlcnZpY2VzL2J1aWxkLWZ1cm5pdHVyZS1iYXNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpREFBaUQsQ0FBQztBQUN6RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDBEQUEwRCxDQUFDO0FBRXRGLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBUSxRQUFRLEVBQVMsT0FBTyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM3RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2REFBNkQsQ0FBQztBQUk3RixPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFJdEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBSzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFHaEQsTUFBTSxPQUFnQix5QkFBeUI7SUF1RDdDLFlBQ1ksNEJBQTBELEVBQzFELGlCQUFvQyxFQUNwQyxlQUFnQyxFQUNoQyxlQUFn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QXVEO1lBQ3ZELHVEQUF1RDtZQUN2RCx5SUFBeUk7WUFDekksMkNBQTJDO1lBQzNDLElBQUk7WUFDSixnREFBZ0Q7WUFDaEQsbUNBQW1DO1lBQ25DLGlCQUFpQjtRQUNuQixDQUFDO0tBQUE7SUFFTSxvQkFBb0I7UUFDekIsTUFBTSxPQUFPLEdBQWUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDeEQsTUFBTSxjQUFjLEdBQWEsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvRCxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7O3VIQXZ0Q21CLHlCQUF5QjsySEFBekIseUJBQXlCOzRGQUF6Qix5QkFBeUI7a0JBRDlDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7RGVjb05vZGVLaW5kfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtFdWxlciwgTWVzaCwgT2JqZWN0M0QsIFNjZW5lLCBWZWN0b3IzfSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7Tm9kZVR5cGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvZW51bS9ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7SGRlY29Qb3NpdGlvbmluZ30gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9lbnVtL2hkZWNvLXBvc2l0aW9uaW5nLmVudW0nO1xyXG5pbXBvcnQge1ZhcmlhdGlvblNlcnZpY2V9IGZyb20gJy4vdmFyaWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkNhY2hlU2VydmljZX0gZnJvbSAnLi92YXJpYXRpb24tY2FjaGUuc2VydmljZSc7XHJcbmltcG9ydCB7U2VsZWN0b3JTdHJ1Y3R1cmV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0b3Itc3RydWN0dXJlLmJvJztcclxuaW1wb3J0IHtTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4vY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi4vdXRpbHMvb2JqZWN0LnV0aWxzJztcclxuaW1wb3J0IHtNYXRlcmlhbFV0aWxzfSBmcm9tICcuLi91dGlscy9tYXRlcmlhbC51dGlscyc7XHJcbmltcG9ydCB7U2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL3NldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0RpY3Rpb25hcnlTZXJ2aWNlfSBmcm9tICcuL2RpY3Rpb25hcnkuc2VydmljZSc7XHJcbmltcG9ydCB7QXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuL2FwcC1ldmVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHtSZXN1bHRUeXBlfSBmcm9tICcuLi9lbnVtL3Jlc3VsdC10eXBlLmVudW0nO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRvckVycm9yTWVzc2FnZX0gZnJvbSAnLi4vbW9kZWwvY29uZmlndXJhdG9yLWVycm9yLW1lc3NhZ2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRpb24tcmVzdWx0LW9iamVjdCc7XHJcbmltcG9ydCB7VmFyaWF0aW9ufSBmcm9tICcuLi9tb2RlbC92YXJpYXRpb24nO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi91dGlscy5zZXJ2aWNlJztcclxuaW1wb3J0IHtJdGVtU2VydmljZX0gZnJvbSAnLi9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lM0RVdGlsfSBmcm9tICcuLi91dGlscy9zY2VuZS0zZC51dGlscyc7XHJcbmltcG9ydCB7RGVidWdVdGlsc30gZnJvbSAnLi4vdXRpbHMvZGVidWcudXRpbHMnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnVpbGRGdXJuaXR1cmVCYXNlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnZXQgdXNlTm9kZUlkVG9MaW5rKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3VzZU5vZGVJZFRvTGluaztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudEN1c3RvbUZsb29yR3JvdXAoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRDdXN0b21GbG9vckdyb3VwKGl0ZW06IE9iamVjdDNEKSB7XHJcbiAgICB0aGlzLl9jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzY2VuZShzY2VuZTogU2NlbmUpIHtcclxuICAgIHRoaXMuX3NjZW5lID0gc2NlbmU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNjZW5lKCk6IFNjZW5lIHtcclxuICAgIHJldHVybiB0aGlzLl9zY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWZhdWx0UG9zaXRpb24gPSBuZXcgVmVjdG9yMyg0LCAwLCAxKTtcclxuICBwdWJsaWMgZGVmYXVsdFJvdGF0aW9uID0gbmV3IEV1bGVyKDAsIE1hdGguUEksIDApO1xyXG5cclxuICBwdWJsaWMgYmFzZUVsZW1lbnROb2RlSWQ6IG51bWJlcjtcclxuICBwdWJsaWMgYXJ0aWNsZUFzc2V0UGF0aDogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdGFydFBvc2l0aW9uOiBWZWN0b3IzO1xyXG4gIHB1YmxpYyBmdWxsM0RPYmplY3RUb1VzZTogT2JqZWN0M0Q7XHJcbiAgcHVibGljIGlzTW91c2VPdmVyT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8gdXNlZCBmb3IgZWxlbWVudHMsIHRvIHBsYWNlIG9iamVjdHMgb25cclxuICBwdWJsaWMgYWN0aXZlQ29ubmVjdG9yOiBhbnk7XHJcblxyXG4gIHB1YmxpYyBhbnN3ZXJTZWxlY3RlZDogU3ViamVjdDxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiA9IG5ldyBTdWJqZWN0PENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+KCk7XHJcbiAgcHVibGljIGFyUGxhY2VtZW50VXBkYXRlOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuICBwdWJsaWMgc2hvd0VsZW1lbnRUb29sYmFyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfdXNlTm9kZUlkVG9MaW5rOiBib29sZWFuID0gdHJ1ZTtcclxuICBwcml2YXRlIF9hY3RpdmVDaGlsZEVsZW1lbnQ6IE1lc2g7XHJcbiAgcHJpdmF0ZSBfcGxhY2VkQWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRqdXN0YWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfYWRkYWJsZXM6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudEN1c3RvbUZsb29yR3JvdXA6IE9iamVjdDNEO1xyXG4gIHByaXZhdGUgX2dlbmVyaWNTZWxlY3Rpb24gPSBmYWxzZTtcclxuICBwcml2YXRlIF9hbnN3ZXJTZWxlY3RlZDogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9zZWxlY3Rpb25zU2VsZWN0ZWQ6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIHByaXZhdGUgX3NjZW5lOiBTY2VuZTtcclxuXHJcbiAgcHJvdGVjdGVkIHN1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJvdGVjdGVkIHBsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByb3RlY3RlZCBjb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlOiBDb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGRpY3Rpb25hcnlTZXJ2aWNlOiBEaWN0aW9uYXJ5U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBhcHBFdmVudFNlcnZpY2U6IEFwcEV2ZW50U2VydmljZSxcclxuICAgIHByb3RlY3RlZCBzZXR0aW5nc1NlcnZpY2U6IFNldHRpbmdzU2VydmljZSxcclxuICAgIHByb3RlY3RlZCB2YXJpYXRpb25TZXJ2aWNlOiBWYXJpYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHZhcmlhdGlvbkNhY2hlU2VydmljZTogVmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlLFxyXG4gICAgcHJvdGVjdGVkIGl0ZW1TZXJ2aWNlOiBJdGVtU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLmNsZWFudXAoKTtcclxuICB9XHJcblxyXG4gIGFic3RyYWN0IGJ1aWxkKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD47XHJcblxyXG4gIGFic3RyYWN0IGNyZWF0ZVNpbXBsZTNETW9kZWwocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdDtcclxuXHJcbiAgYWJzdHJhY3Qgc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PjtcclxuXHJcbiAgYWJzdHJhY3QgcHJlcGFyZVNlbGVjdGlvbnNBbmREZWNvcyhyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBjcmVhdGVOb25Db25maWd1cmFibGVGbG9vcihyZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBhYnN0cmFjdCBzdGFydFRvQnVpbGQoXHJcbiAgICByZXN1bHQ/OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LFxyXG4gICAgc2hvdWxkQ29weUluc3RhbmNlPzogYm9vbGVhbixcclxuICAgIGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uPzogYm9vbGVhbixcclxuICAgIHN0YW5kQWxvbmU/OiBib29sZWFuLFxyXG4gICAgZmlyc3RCdWlsZD86IGJvb2xlYW4sXHJcbiAgICBmcm9tUHJlc2V0PzogYm9vbGVhbixcclxuICAgIGxvYWRGcm9tUHJvamVjdD86IGJvb2xlYW5cclxuICApOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+O1xyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJTZWxlY3RlZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlTZWxlY3Rpb25zU2VsZWN0ZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQubGVuZ3RoID0gMDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRPcHRpb25zRnJvbVNlbGVjdGlvbihiYXNlU2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBTZWxlY3Rpb25bXSB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgbGV0IG5vZGVMZXZlbCA9IC0xO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgY29uc3QgbGV2ZWw6IG51bWJlciA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgaWYgKG5vZGVMZXZlbCAhPT0gLTEpIHtcclxuICAgICAgICBpZiAobm9kZUxldmVsIDwgbGV2ZWwgJiYgdGhpcy5jYW5Db25uZWN0U2VsZWN0aW9ucyhiYXNlU2VsZWN0aW9uLCBzZWxlY3Rpb24pICYmIHRoaXMuc2VsZWN0aW9uUHVibGlzaGVkKHNlbGVjdGlvbikpIHtcclxuICAgICAgICAgIHNlbGVjdGlvbnMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobm9kZUxldmVsID49IGxldmVsKSB7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNlbGVjdGlvbi5pZCA9PT0gYmFzZVNlbGVjdGlvbi5pZCAmJiBzZWxlY3Rpb24ubm9kZSA9PT0gYmFzZVNlbGVjdGlvbi5ub2RlKSB7XHJcbiAgICAgICAgbm9kZUxldmVsID0gbGV2ZWw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbENvbmZpZ3VyaW5nQ3VycmVudEluc3RhbmNlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwKSB7XHJcbiAgICAgIC8vIFRPRE8gY2hlY2sgd2hhdCB3ZSBzaG91bGQgZG8gd2l0aCB0aGlzIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNvbmZpZ3VyaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgY2FuY2VsQW5zd2VyKGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QsIHJlYnVpbGQ6IGJvb2xlYW4gPSB0cnVlLCBnZXRBbnN3ZXJzOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5jYW5jZWxBbnN3ZXIoKTtcclxuICAgIGlmIChyZWJ1aWxkKSB7XHJcbiAgICAgIHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICAgIH0gZWxzZSBpZiAoZ2V0QW5zd2VycykgeyAvLyBpZiBub3QgcmVidWlsZCB0aGVuIGNoZWNrIGlmIHdlIG5lZWQgdG8gZ2V0IGFuc3dlcnNcclxuICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFF1ZXN0aW9uQW5kQW5zd2Vyc0FzeW5jKCk7IC8vIHNlZSBpZiB0aGVyZSBpcyB1c2VyIGlucHV0IG5lZWRlZFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNlbGVjdFNlbGVjdGlvbihcclxuICAgIHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0LCBmb3JjZUJhY2tUb05vZGU/OiBib29sZWFuLCBhZnRlcj86IGJvb2xlYW4sIGNvbm5lY3Rvcj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZvcmNlQmFja1RvTm9kZSwgYWZ0ZXIsIGNvbm5lY3Rvcik7XHJcbiAgICB0aGlzLl9nZW5lcmljU2VsZWN0aW9uID0gc2VsZWN0aW9uLmdlbmVyaWM7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBkYXRhOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVsZXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VG9CdWlsZEZyb21Db25maWd1cmF0b3IoZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcmVwbGFjZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbiwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uKTtcclxuICAgIGF3YWl0IHRoaXMuc3RhcnRUb0J1aWxkRnJvbUNvbmZpZ3VyYXRvcihkYXRhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZWxlY3RBbnN3ZXIoYW5zd2VyOiBBbnN3ZXIsIGlucHV0OiBzdHJpbmcsIGRhdGE6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMucHJlbG9hZE1hdGVyaWFsKGFuc3dlcik7XHJcbiAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2VsZWN0QW5zd2VyKGFuc3dlciwgaW5wdXQpO1xyXG4gICAgdGhpcy5oYW5kbGVBbnN3ZXJTZWxlY3RlZChhbnN3ZXIpO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uQXNBbnN3ZXIoY2hvc2VuT3B0aW9uOiBTZWxlY3RvclN0cnVjdHVyZSwgZGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5wcmVsb2FkTWF0ZXJpYWxCeVNlbGVjdGlvbihjaG9zZW5PcHRpb24pO1xyXG4gICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb24pO1xyXG4gICAgY29uc3QgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID0gYXdhaXQgdGhpcy5zdGFydFRvQnVpbGRGcm9tQ29uZmlndXJhdG9yKGRhdGEpO1xyXG4gICAgdGhpcy5hbnN3ZXJTZWxlY3RlZC5uZXh0KHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbGlua1NlbGVjdGlvbnNBbmREZWNvcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5zZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgLy8gY29uc3QgaWQ6IHN0cmluZyA9IHRoaXMuc2VsZWN0aW9uc1tpXS5hcnROb2RlSWREZWNvO1xyXG4gICAgICBsZXQgZGVjbzogYW55ID0gdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5maW5kKGQgPT4gZC5ub2RlSWQgPT09IHRoaXMuc2VsZWN0aW9uc1tpXS5ub2RlKTtcclxuICAgICAgaWYgKCFkZWNvKSB7XHJcbiAgICAgICAgZGVjbyA9IG5ldyBEZWNvTm9kZSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChkZWNvLnR5cGUgIT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICBjb25zdCB2YXJpYXRpb246IGFueSA9IHRoaXMuZ2V0VmFyaWF0aW9ucygpLmZpbmQodiA9PiB2LnBhcmVudElkID09PSB0aGlzLnNlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1tpXS5kZWNvTm9kZSA9IGRlY287XHJcbiAgICB9XHJcbiAgICB0aGlzLmFwcEV2ZW50U2VydmljZS5zZWxlY3Rpb25zQW5kRGVjb3NMaW5rZWQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXBhcmVUaGVTZWxlY3Rpb25zKGluc3RhbmNlSWQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLnNlbGVjdGlvbnMuc2xpY2UoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbk9mQXJ0aWNsZTogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQXJ0aWNsZSk7XHJcbiAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBzZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuYWRkQWRqdXN0ID09PSAnMicpO1xyXG4gICAgY29uc3QgaXNBcnRpY2xlV2l0aE1hdGVyaWFsOiBib29sZWFuID1cclxuICAgICAgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0ICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0Lmxlbmd0aCA+IDA7XHJcbiAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCBnbG9iYWxWYXJpYXRpb25zOiBEZWNvTm9kZVtdID0gc2VsZWN0aW9uc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gKHMuZ2VuZXJpYyB8fCBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDEpICYmIChzLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uICYmICghcy5lbGVtZW50VHlwZSB8fCBzLmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykpXHJcbiAgICAgIC5tYXAoKHZhbHVlOiBTZWxlY3Rpb24sIGluZGV4OiBudW1iZXIsIGFycmF5OiBTZWxlY3Rpb25bXSkgPT4ge1xyXG4gICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KHZhbHVlLm5vZGUpO1xyXG4gICAgICAgIHJldHVybiAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb247XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgaWYgKCEoZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkKSB7XHJcbiAgICAgICAgICAgIChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQgPSB0aGlzLmdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMucHVzaChkZWNvTm9kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBlbHNlIHtcclxuICAgICAgICAgIC8vICAgaWYgKGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAvLyAgICAgZ2xvYmFsVmFyaWF0aW9ucy5sZW5ndGggPSAwO1xyXG4gICAgICAgICAgLy8gICAgIGdsb2JhbFZhcmlhdGlvbnNSZXdyaXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgIC8vICAgZ2xvYmFsVmFyaWF0aW9ucy5wdXNoKGRlY29Ob2RlKTtcclxuICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIC8vIGNvbnN0IHZhcmlhdGlvbjogRnVybml0dXJlUGFydFZhcmlhdGlvbiA9IG5ldyBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uKCk7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uQnJhbmRJZCA9IHNlbGVjdGlvbi5kZWNvTm9kZS5icmFuZElkO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLkRlc2NyaXB0aW9uID0gc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLk1hdGVyaWFsSWQgPSAoc2VsZWN0aW9uLmRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZDtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5TdXBwbGllckFydGljbGVOciA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICAgIC8vIHVzZWRWYXJpYXRpb25zLnB1c2godmFyaWF0aW9uKTtcclxuICAgICAgICB9IGVsc2UgaWYgKChzZWxlY3Rpb24uZGVjb05vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgJiZcclxuICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUubGVuZ3RoKSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5kZWNvTm9kZS5raW5kID09PSBEZWNvTm9kZUtpbmQuQWRqdXN0YWJsZSB8fCAoaXNBcnRpY2xlV2l0aE1hdGVyaWFsKSkge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24udmFyaWF0aW9ucyA9IGdsb2JhbFZhcmlhdGlvbnMuc2xpY2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICBsYXN0QWRqdXN0YWJsZSA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucy5zbGljZSgpO1xyXG4gICAgICAgICAgICBpZiAobGFzdEFkanVzdGFibGUpIHtcclxuICAgICAgICAgICAgICBsYXN0QWRqdXN0YWJsZS5hZGRhYmxlcy5wdXNoKHNlbGVjdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcmV2aW91c1ByZXNMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgIH1cclxuICAgIC8vIHRoaXMuX3Vwc2VydEZ1cm5pdHVyZSh0aGlzLmFjdGl2ZUluc3RhbmNlLFxyXG4gICAgLy8gICB7VmFyaWF0aW9uczogdXNlZFZhcmlhdGlvbnN9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmVsb2FkTWF0ZXJpYWxzKHNjaGVtYTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9ucyhcclxuICAgICAgc2NoZW1hLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzXHJcbiAgICAgICAgLmZpbHRlcihkID0+IChkLmdhbWVPYmplY3ROYW1lIHx8IGQubWF0ZXJpYWxVcmwpICYmIGQudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbilcclxuICAgICAgICAubWFwKGQgPT4gZCksIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgcHJlcGFyZUluc3RhbmNlRm9yQnVpbGQoXHJcbiAgICBzaG91bGRDb3B5SW5zdGFuY2U6IGJvb2xlYW4sXHJcbiAgICBsb2FkRnJvbVByb2plY3Q6IGJvb2xlYW4sXHJcbiAgICBsb29zZU9yaWdpbmFsQ29uZmlndXJhdGlvbjogYm9vbGVhbixcclxuICAgIHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdFxyXG4gICk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHNob3VsZENvcHlJbnN0YW5jZSAmJiAhbG9hZEZyb21Qcm9qZWN0KSB7XHJcbiAgICAgIGNvbnN0IG9yaWdpbmFsSW5zdGFuY2VJZDogc3RyaW5nID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IG9yaWdpbmFsSW5zdGFuY2VJZDtcclxuICAgICAgaWYgKGxvb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uKSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kTG9zZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuY29weUluc3RhbmNlQW5kU2F2ZU9yaWdpbmFsQ29uZmlndXJhdGlvbihvcmlnaW5hbEluc3RhbmNlSWQsIHJlc3VsdClcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxJbnN0YW5jZUlkO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIWxvYWRGcm9tUHJvamVjdCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIFByb21pc2UucmVqZWN0KGUpO1xyXG4gICAgICAgIHJldHVybiBlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGdldFNlbGVjdGlvbnNBbmREZWNvcygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbnNBbmREZWNvUHJvbWlzZTogUHJvbWlzZTxhbnk+W10gPSBbXTtcclxuICAgICAgc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlLnB1c2godGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnNBc3luYygpLCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZ2V0RGVjb3NBc3luYygpKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoc2VsZWN0aW9uc0FuZERlY29Qcm9taXNlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgRGVidWdVdGlscy5sb2coYEVycm9yIGdldHRpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVQcmVwYXJlU2VsZWN0aW9uc0RlY29zKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IFByb21pc2U8Q29uZmlndXJhdGlvblJlc3VsdE9iamVjdD4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIpIHsgLy8gbm8gc2VsZWN0aW9ucywgb25seSBzZWxlY3Rpb24gb2YgdHlwZSAnQVJUJ1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChyZXN1bHQucmVzdWx0VHlwZSAhPT0gUmVzdWx0VHlwZS5BcnRpY2xlTm90Rm91bmQgJiYgIXJlc3VsdC5vcmlnaW5hbEl0ZW1JZCkgeyAvLyBhcnRpY2xlIGZvdW5kLCBzbyBpbml0IHRoYXQgZmlyc3RcclxuICAgICAgICAgIHJlc3VsdC5vcmlnaW5hbEl0ZW1JZCA9IHJlc3VsdC5pbnN0YW5jZUlkO1xyXG4gICAgICAgICAgcmVzdWx0Lmluc3RhbmNlSWQgPSBudWxsO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHJlc3VsdCk7XHJcbiAgICAgICAgICByZXN1bHQucmVzdWx0VHlwZSA9IFJlc3VsdFR5cGUuTm9TZWxlY3Rpb25zO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb0J1aWxkKHJlc3VsdCk7IC8vICdyZXN0YXJ0JyB0aGUgYnVpbGRcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRTZWxlY3Rpb25zQW5kRGVjb3NGcm9tTWV0YWRhdGEocmVzdWx0KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBFcnJvciBwcmVwYXJpbmcgc2VsZWN0aW9ucyBhbmQgZGVjb3M6ICR7ZX1gKTtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIHMuc2NoZW1hID0gcmVzdWx0LnNjaGVtYTtcclxuICAgICAgcy5pbnN0YW5jZUlkID0gcmVzdWx0Lmluc3RhbmNlSWQ7XHJcbiAgICB9KTsgLy8gYWRkIHNjaGVtYSBmb3IgbWF0ZXJpYWwgY3JlYXRpb25cclxuXHJcbiAgICAvLyBUT0RPIGFkZCB0aGlzIGZ1bmN0aW9uLCBpdCdzIHVzZWQgZm9yIEdUTSB0aGlzLmhhbmRsZVNlbGVjdGlvbnNSZWNlaXZlZChyZXN1bHQubWV0YURhdGEpO1xyXG4gICAgdGhpcy5saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICB0aGlzLnByZXBhcmVUaGVTZWxlY3Rpb25zKHJlc3VsdC5pbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE8gY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uIGZvciBIYWJ1ZmFcclxuICAvLyBwcm90ZWN0ZWQgaGFuZGxlSW50ZWdyYXRpb25Db25uZWN0aW9ucyhpZDogc3RyaW5nLCBvYmplY3Q6IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGNvbnN0IHBhcnRzOiBGdXJuaXR1cmVQYXJ0SW50ZWdyYXRpb25bXSA9IFtdO1xyXG4gIC8vICAgY29uc3QgY2hpbGRQYXJ0czogT2JqZWN0M0RbXSA9IG9iamVjdC5jb25maWd1cmFibGUgPyBvYmplY3QuY2hpbGRyZW4gOiBbb2JqZWN0XTtcclxuICAvLyAgIGNvbnN0IGxlbjogbnVtYmVyID0gY2hpbGRQYXJ0cy5sZW5ndGg7XHJcbiAgLy8gICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgLy8gICAgIGNvbnN0IGNoaWxkOiBhbnkgPSA8Q3VzdG9tT2JqZWN0M0Q+Y2hpbGRQYXJ0c1tpXTtcclxuICAvLyAgICAgY29uc3QgY29ubmVjdGlvbjogRnVybml0dXJlUGFydEludGVncmF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRJbnRlZ3JhdGlvbigpO1xyXG4gIC8vICAgICBjb25zdCB2YXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAvLyAgICAgaWYgKGNoaWxkLnVzZXJEYXRhICYmIGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbiAmJiBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLklkID0gY2hpbGRQYXJ0cy5maW5kSW5kZXgoYyA9PiBjID09PSBjaGlsZCkudG9TdHJpbmcoKTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uQnJhbmRJZGVudGlmaWVyID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZERlc2NyaXB0aW9uID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lO1xyXG4gIC8vICAgICAgIGNvbm5lY3Rpb24uUG9zaXRpb24gPSBjaGlsZC5wb3NpdGlvbjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlJvdGF0aW9uID0gY2hpbGQucm90YXRpb247XHJcbiAgLy8gICAgICAgaWYgKGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zKSB7XHJcbiAgLy8gICAgICAgICBpZiAoY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnMubGVuZ3RoID09PSAxKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbnN0IHZhcmlhdGlvbjogYW55ID0gY2hpbGQudXNlckRhdGEuc2VsZWN0aW9uLnZhcmlhdGlvbnNbMF07XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uID0gdmFyaWF0aW9uLmJyYW5kSWQ7XHJcbiAgLy8gICAgICAgICAgIGNvbm5lY3Rpb24uVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoaWxkLnVzZXJEYXRhLnNlbGVjdGlvbi52YXJpYXRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgLy8gICAgICAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSBjaGlsZC51c2VyRGF0YS5zZWxlY3Rpb24udmFyaWF0aW9uc1tqXTtcclxuICAvLyAgICAgICAgICAgICBjb25zdCB2YXJpYXRpb25QYXJ0OiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0LlZhcmlhdGlvbiA9IHZhcmlhdGlvbi5icmFuZElkO1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvblBhcnQuVmFyaWF0aW9uRGVzY3JpcHRpb24gPSB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5NYXRlcmlhbElkID0gdmFyaWF0aW9uLm1hdGVyaWFsSWQ7XHJcbiAgLy8gICAgICAgICAgICAgdmFyaWF0aW9uUGFydC5TdXBwbGllckFydGljbGVOciA9IHZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOcjtcclxuICAvLyAgICAgICAgICAgICB2YXJpYXRpb25QYXJ0Lk9wdGlvbiA9IHZhcmlhdGlvbi5vcHRpb25UZXh0O1xyXG4gIC8vICAgICAgICAgICAgIHZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb25QYXJ0KTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBjb25uZWN0aW9uLlZhcmlhdGlvbnMgPSB2YXJpYXRpb25zO1xyXG4gIC8vICAgICAgICAgfVxyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgfSBlbHNlIHsgLy8gYS1hcnRpa2VsXHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5JZCA9IGNoaWxkUGFydHMuZmluZEluZGV4KGMgPT4gYyA9PT0gY2hpbGQpLnRvU3RyaW5nKCk7XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5CcmFuZElkZW50aWZpZXIgPSBjaGlsZC5tZXRhZGF0YS5pdGVtSWRlbnRpZmllcjtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLkJyYW5kRGVzY3JpcHRpb24gPSBjaGlsZC5tZXRhZGF0YS5pdGVtTmFtZTtcclxuICAvLyAgICAgICBjb25uZWN0aW9uLlBvc2l0aW9uID0gY2hpbGQucG9zaXRpb247XHJcbiAgLy8gICAgICAgY29ubmVjdGlvbi5Sb3RhdGlvbiA9IGNoaWxkLnJvdGF0aW9uO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbnN0IGNvbm5lY3RvcnM6IEZ1cm5pdHVyZUNvbm5lY3RlZFBhcnRJbnRlZ3JhdGlvbltdID0gW107XHJcbiAgLy8gICAgIGNvbnN0IGNsZW46IG51bWJlciA9IGNoaWxkLmNoaWxkcmVuLmxlbmd0aDtcclxuICAvLyAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjbGVuOyBqKyspIHtcclxuICAvLyAgICAgICBjb25zdCBjb25uZWN0b3I6IGFueSA9IGNoaWxkLmNoaWxkcmVuW2pdO1xyXG4gIC8vICAgICAgIGlmICgoY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tT2JqZWN0M0QgfHwgY29ubmVjdG9yIGluc3RhbmNlb2YgQ3VzdG9tTWVzaCkgJiYgKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKSB7XHJcbiAgLy8gICAgICAgICBjb25zdCBjb25uOiBGdXJuaXR1cmVDb25uZWN0ZWRQYXJ0SW50ZWdyYXRpb24gPSBuZXcgRnVybml0dXJlQ29ubmVjdGVkUGFydEludGVncmF0aW9uKCk7XHJcbiAgLy8gICAgICAgICBjb25uLkNvbm5lY3Rpb25MYWJlbCA9IGNvbm5lY3Rvci5uYW1lO1xyXG4gIC8vICAgICAgICAgY29uc3QgZm9yZWlnblBhcnRJZHg6IG51bWJlciA9XHJcbiAgLy8gICAgICAgICAgIHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuLmZpbmRJbmRleChjID0+IGMubmFtZSA9PT0gKGNvbm5lY3RvciBhcyBhbnkpLmNvbm5lY3RlZFRvKTtcclxuICAvLyAgICAgICAgIGNvbm4uRm9yZWlnbkNvbm5lY3Rpb25MYWJlbCA9IHRoaXMuX2N1cnJlbnRDdXN0b21GbG9vckdyb3VwLmNoaWxkcmVuW2ZvcmVpZ25QYXJ0SWR4XS51c2VyRGF0YS5zZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgLy8gICAgICAgICBjb25uLkZvcmVpZ25QYXJ0SWQgPSBmb3JlaWduUGFydElkeC50b1N0cmluZygpO1xyXG4gIC8vICAgICAgICAgY29ubi5Qb3NpdGlvbiA9IGNvbm5lY3Rvci5wb3NpdGlvbjtcclxuICAvLyAgICAgICAgIGNvbm4uUm90YXRpb24gPSBjb25uZWN0b3Iucm90YXRpb247XHJcbiAgLy8gICAgICAgICBjb25uZWN0b3JzLnB1c2goY29ubik7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGNvbm5lY3Rpb24uQ29ubmVjdGVkUGFydHMgPSBjb25uZWN0b3JzO1xyXG4gIC8vICAgICBwYXJ0cy5wdXNoKGNvbm5lY3Rpb24pO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgdGhpcy51cHNlcnRGdXJuaXR1cmUoaWQsIHtQYXJ0czogcGFydHN9LCBvYmplY3QpO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIHByb3RlY3RlZCB1cHNlcnRGdXJuaXR1cmUoaWQ6IHN0cmluZywgb2JqZWN0OiBhbnksIGl0ZW06IEl0ZW0pOiB2b2lkIHtcclxuICAvLyAgIGlmICh0aGlzLl9pbnRlZ3JhdGlvbkVuYWJsZWQgJiYgIWl0ZW0ubWV0YWRhdGEub2Jzb2xldGUpIHtcclxuICAvLyAgICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLl9mdXJuaXR1cmVDb25maWd1cmF0aW9ucy5maW5kSW5kZXgoZiA9PiBmLklkID09PSBpZCk7XHJcbiAgLy8gICAgIGxldCBmdXJuaXR1cmU6IEZ1cm5pdHVyZUludGVncmF0aW9uO1xyXG4gIC8vICAgICBpZiAoaWR4IDwgMCkge1xyXG4gIC8vICAgICAgIC8vIGVtcHR5IGVudHJ5IGZvciBtcnAgY29kZSwgcmUtdXNlIHRoYXQgb25lXHJcbiAgLy8gICAgICAgaWYgKHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiAhdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbMF0uSWQpIHtcclxuICAvLyAgICAgICAgIGZ1cm5pdHVyZSA9IHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zWzBdO1xyXG4gIC8vICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICBmdXJuaXR1cmUgPSBuZXcgRnVybml0dXJlSW50ZWdyYXRpb24oKTtcclxuICAvLyAgICAgICAgIHRoaXMuX2Z1cm5pdHVyZUNvbmZpZ3VyYXRpb25zLnB1c2goZnVybml0dXJlKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZnVybml0dXJlLklkID0gaWQ7XHJcbiAgLy8gICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgZnVybml0dXJlID0gdGhpcy5fZnVybml0dXJlQ29uZmlndXJhdGlvbnNbaWR4XTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgICBmdXJuaXR1cmUuTXJwQ29kZSA9IHRoaXMucGVybWFuZW50U3RvcmVTZXJ2aWNlLmNvZGU7XHJcbiAgLy8gICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xyXG4gIC8vICAgICAgIGlmIChmdXJuaXR1cmUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmplY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gIC8vICAgICAgICAgZnVybml0dXJlW2tleV0gPSBvYmplY3Rba2V5XTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZUxheWluZ1BhdHRlcm4oZmxvb3I6IEZsb29yUGxhbmVJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IHZvaWQge1xyXG4gIC8vICAgY29uc3QgZmxvb3JQYXR0ZXJuSW5mbzogRmxvb3JQYXR0ZXJuSW5mbyA9IHRoaXMuZ2VuZXJhdGVGbG9vclBhdHRlcm5JbmZvKGZsb29yLCBmbG9vclBhdHRlcm4pO1xyXG4gIC8vICAgZmxvb3IucmVzdG9yZUZsb29yT2JqZWN0KCk7XHJcbiAgLy8gICBjb25zdCBtZXNoTGVmdCA9XHJcbiAgLy8gICAgIHRoaXMuZnVsbDNET2JqZWN0VG9Vc2UuY2hpbGRyZW4uZmluZChtID0+IG0ubmFtZSA9PT0gZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRMZWZ0KSBhcyBNZXNoO1xyXG4gIC8vICAgdGhpcy5ub3JtYWxpemVNZXNoKG1lc2hMZWZ0KTtcclxuICAvL1xyXG4gIC8vICAgbGV0IG1lc2hSaWdodDogTWVzaCA9IG51bGw7XHJcbiAgLy8gICBpZiAoZmxvb3JQYXR0ZXJuSW5mby5tZXNoSWRSaWdodCAhPT0gbnVsbCkge1xyXG4gIC8vICAgICBtZXNoUmlnaHQgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmNoaWxkcmVuLmZpbmQobSA9PiBtLm5hbWUgPT09IGZsb29yUGF0dGVybkluZm8ubWVzaElkUmlnaHQpIGFzIE1lc2g7XHJcbiAgLy8gICAgIHRoaXMubm9ybWFsaXplTWVzaChtZXNoUmlnaHQpO1xyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBmbG9vclNpemU6IFZlY3RvcjMgPSBmbG9vci5zaXplO1xyXG4gIC8vICAgY29uc3QgcGxhbmtTaXplOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcclxuICAvL1xyXG4gIC8vICAgbWVzaExlZnQuZ2VvbWV0cnkuYm91bmRpbmdCb3guZ2V0U2l6ZShwbGFua1NpemUpO1xyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBpdGVtczogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtW10gPSB0aGlzLmZsb29yUGF0dGVyblNlcnZpY2UuZ2VuZXJhdGVQYXR0ZXJuKFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybixcclxuICAvLyAgICAgcGxhbmtTaXplLFxyXG4gIC8vICAgICBmbG9vclNpemUsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm5JbmZvLmhlYXJ0TGluZVxyXG4gIC8vICAgKTtcclxuICAvL1xyXG4gIC8vICAgLy8gRGVidWdnaW5nIG9wdGlvblxyXG4gIC8vICAgLy8gdGhpcy5fZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS50b2dnbGVEZWJ1ZygpO1xyXG4gIC8vICAgY29uc3QgZmxvb3JDb3VudFJlc3VsdDogRmxvb3JDb3VudFJlc3VsdCA9IHRoaXMuZmxvb3JUaWxlSW50ZXJzZWN0aW9uU2VydmljZS5jb3VudFRpbGVzKFxyXG4gIC8vICAgICBmbG9vci5mbG9vck1lc2gsXHJcbiAgLy8gICAgIGl0ZW1zLFxyXG4gIC8vICAgICBtZXNoTGVmdC5nZW9tZXRyeSxcclxuICAvLyAgICAgKG1lc2hSaWdodCkgPyBtZXNoUmlnaHQuZ2VvbWV0cnkgOiBudWxsLFxyXG4gIC8vICAgICB0cnVlXHJcbiAgLy8gICApO1xyXG4gIC8vXHJcbiAgLy8gICBmbG9vci5tZXRhZGF0YS5mbG9vckNvdW50UmVzdWx0ID0gZmxvb3JDb3VudFJlc3VsdDtcclxuICAvL1xyXG4gIC8vICAgY29uc3QgbGVmdEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy8gICBjb25zdCByaWdodEl0ZW1zOiBGbG9vclBhdHRlcm5UcmFuc2Zvcm1bXSA9IG5ldyBBcnJheTxGbG9vclBhdHRlcm5UcmFuc2Zvcm0+KCk7XHJcbiAgLy9cclxuICAvLyAgIGZvciAoY29uc3QgaXRlbSBvZiBmbG9vckNvdW50UmVzdWx0LmZpbHRlcmVkKSB7XHJcbiAgLy8gICAgIGlmIChpdGVtLmlzTGVmdCkge1xyXG4gIC8vICAgICAgIGxlZnRJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gIC8vICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgIHJpZ2h0SXRlbXMucHVzaChpdGVtKTtcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbltdID0gdGhpcy5zZWxlY3Rpb25zO1xyXG4gIC8vICAgbGV0IHZhcmlhdGlvbkdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHNlbGVjdGlvbikge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5LmVsZW1lbnRUeXBlID09PSAndmFyaWF0aW9uJykge1xyXG4gIC8vICAgICAgIHZhcmlhdGlvbkdhbWVPYmplY3QgPSBzZWxlY3Rpb25LZXkuZ2FtZU9iamVjdDtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgfVxyXG4gIC8vICAgfVxyXG4gIC8vXHJcbiAgLy8gICBsZXQgZmxvb3JWYXJpYXRpb25NYXRlcmlhbDogYW55O1xyXG4gIC8vICAgaWYgKHZhcmlhdGlvbkdhbWVPYmplY3QgIT09IG51bGwpIHtcclxuICAvLyAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb25Gb3JNYXRlcmlhbCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHZhcmlhdGlvbkdhbWVPYmplY3QsIGZsb29yLm1ldGFkYXRhLnNjaGVtYSkudGhlbihyZXN1bHQgPT4ge1xyXG4gIC8vICAgICAgIGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwgPSByZXN1bHQ7XHJcbiAgLy8gICAgICAgY29uc3QgdGV4dHVyZTogVGV4dHVyZSA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWwubWFwO1xyXG4gIC8vICAgICAgIGlmIChmbG9vclBhdHRlcm5JbmZvLmZsb29yUGF0dGVybkRpcmVjdGlvbiA9PT0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HKSB7XHJcbiAgLy8gICAgICAgICB0ZXh0dXJlLnJvdGF0aW9uID0gTWF0aC5QSSAvIDI7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHRleHR1cmUucm90YXRpb24gPSAwO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBjb25zdCBtZXNoTGVmdE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoTGVmdC5tYXRlcmlhbDtcclxuICAvLyAgICAgICBjb25zdCBwbGFua01hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHtcclxuICAvLyAgICAgICAgIGNvbG9yOiAweEZGMDAwMCxcclxuICAvLyAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gIC8vICAgICAgICAgb3BhY2l0eTogMC44XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy9cclxuICAvLyAgICAgICBjb25zdCBwbGFua3NMZWZ0ID1cclxuICAvLyAgICAgICAgIHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaExlZnQuZ2VvbWV0cnksIGxlZnRJdGVtcywgcGxhbmtNYXRlcmlhbCk7XHJcbiAgLy8gICAgICAgbGV0IHBsYW5rc1JpZ2h0OiBJbnN0YW5jZWRNZXNoO1xyXG4gIC8vICAgICAgIGlmIChtZXNoUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGNvbnN0IG1lc2hSaWdodE1hdGVyaWFsOiBNYXRlcmlhbCB8IE1hdGVyaWFsW10gPSBtZXNoUmlnaHQubWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgICBwbGFua3NSaWdodCA9IHRoaXMuaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0obWVzaFJpZ2h0Lmdlb21ldHJ5LCByaWdodEl0ZW1zLCBwbGFua01hdGVyaWFsKTtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgY29uc3QgY3VzdG9tRmxvb3JXcmFwcGVyID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgLy8gICAgICAgY3VzdG9tRmxvb3JXcmFwcGVyLmFkZChwbGFua3NMZWZ0KTtcclxuICAvLyAgICAgICBpZiAocGxhbmtzUmlnaHQpIHtcclxuICAvLyAgICAgICAgIGN1c3RvbUZsb29yV3JhcHBlci5hZGQocGxhbmtzUmlnaHQpO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBmbG9vci5mbG9vck9iamVjdCA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvLyAgICAgICB0aGlzLmZsb29yU2VydmljZS5jb25maWd1cmFibGVGbG9vciA9IGN1c3RvbUZsb29yV3JhcHBlcjtcclxuICAvL1xyXG4gIC8vICAgICAgIC8vIE5vdyB3ZSB1cGRhdGUgdGhlIGRlZmF1bHQgZmxvb3JwbGFuZSB3aXRoIHRoZSBtZXNoXHJcbiAgLy8gICAgICAgZmxvb3IuZmxvb3JNYXRlcmlhbCA9IGZsb29yVmFyaWF0aW9uTWF0ZXJpYWw7XHJcbiAgLy8gICAgICAgdGhpcy5zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gIC8vICAgICAgIC8vIEVtaXQgdXBkYXRlIHRvZ2dsZUZsb29yRnJhbWUgZXZlbnQuXHJcbiAgLy8gICAgICAgdGhpcy5tZXNzYWdlQnVzLmVtaXQoTWVzc2FnZVR5cGUuRmxvb3JSZWJ1aWxkKTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICB9XHJcbiAgLy8gfVxyXG5cclxuICAvLyBwcm90ZWN0ZWQgaW5zdGFuY2VkTWVzaEZyb21GbG9vclBhdHRlcm5UcmFuc2Zvcm0oXHJcbiAgLy8gICBnZW9tOiBCdWZmZXJHZW9tZXRyeSxcclxuICAvLyAgIHBhdHRlcm46IEFycmF5PEZsb29yUGF0dGVyblRyYW5zZm9ybT4sXHJcbiAgLy8gICBtYXRlcmlhbDogTWF0ZXJpYWwgfCBNYXRlcmlhbFtdXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAocGF0dGVybi5sZW5ndGggPD0gMCkge1xyXG4gIC8vICAgICByZXR1cm4gbnVsbDtcclxuICAvLyAgIH1cclxuICAvLyAgIGNvbnN0IHRhcmdldFBsYW5rTWVzaCA9IG5ldyBJbnN0YW5jZWRNZXNoKGdlb20sIG1hdGVyaWFsLCBwYXR0ZXJuLmxlbmd0aCk7XHJcbiAgLy8gICBjb25zdCBkdW1teSA9IG5ldyBPYmplY3QzRCgpO1xyXG4gIC8vICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHBhdHRlcm4ubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgY29uc3QgaXRlbTogRmxvb3JQYXR0ZXJuVHJhbnNmb3JtID0gcGF0dGVybltpXTtcclxuICAvLyAgICAgY29uc3QgcG9zaXRpb246IFZlY3RvcjMgPSBpdGVtLnBvc2l0aW9uO1xyXG4gIC8vICAgICBwb3NpdGlvbi55ID0gMC4wMjtcclxuICAvLyAgICAgY29uc3Qgcm90YXRpb246IFZlY3RvcjMgPSBpdGVtLnJvdGF0aW9uO1xyXG4gIC8vICAgICBkdW1teS5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XHJcbiAgLy8gICAgIGR1bW15LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAvLyAgICAgZHVtbXkudXBkYXRlTWF0cml4KCk7XHJcbiAgLy9cclxuICAvLyAgICAgdGFyZ2V0UGxhbmtNZXNoLnNldE1hdHJpeEF0KGksIGR1bW15Lm1hdHJpeCk7XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gdGFyZ2V0UGxhbmtNZXNoO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGdlbmVyYXRlRmxvb3JQYXR0ZXJuSW5mbyhpdGVtOiBJdGVtLCBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybik6IEZsb29yUGF0dGVybkluZm8ge1xyXG4gIC8vICAgdGhpcy5nZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtKTtcclxuICAvLyAgIGNvbnN0IGluZm86IEZsb29yUGF0dGVybkluZm8gPSB7XHJcbiAgLy8gICAgIG1lc2hJZExlZnQ6IG51bGwsXHJcbiAgLy8gICAgIG1lc2hJZFJpZ2h0OiBudWxsLFxyXG4gIC8vICAgICBmbG9vclBhdHRlcm46IEZsb29yUGF0dGVybi5OT1JNQUwsXHJcbiAgLy8gICAgIGZsb29yUGF0dGVybkRpcmVjdGlvbjogRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HLFxyXG4gIC8vICAgICBoZWFydExpbmU6IDBcclxuICAvLyAgIH07XHJcbiAgLy9cclxuICAvLyAgIGxldCBmbG9vckdhbWVPYmplY3Q6IHN0cmluZztcclxuICAvLyAgIGZvciAoY29uc3Qgc2VsZWN0aW9uS2V5IG9mIHRoaXMuc2VsZWN0aW9ucykge1xyXG4gIC8vICAgICBpZiAoc2VsZWN0aW9uS2V5Lm5vZGVUeXBlID09PSAnQVJUJykge1xyXG4gIC8vICAgICAgIGZsb29yR2FtZU9iamVjdCA9IHNlbGVjdGlvbktleS5nYW1lT2JqZWN0O1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy9cclxuICAvLyAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yQ2VudGVyTGluZVhBeGlzKTtcclxuICAvLyAgIC8vIFRPRE8gY29udmVydCBmbG9vclBhdHRlcm5EaXJlY3Rpb24gdG8gdHlwZSBudW1iZXIgdG8gbGV0IHRoZSB1c2VyIHVzZSBjdXN0b20gcm90YXRpb24sIGZvciBub3cgdGhlcmUgYXJlIG9ubHkgMiBvcHRpb25zIGJhc2VkIG9uIGVudW1cclxuICAvLyAgIGlmICh0aGlzLmZsb29yU2VydmljZS5mbG9vclJvdGF0aW9uID09PSAwKSB7XHJcbiAgLy8gICAgIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID0gRmxvb3JQYXR0ZXJuRGlyZWN0aW9uLkxZSU5HO1xyXG4gIC8vICAgfSBlbHNlIHtcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm5EaXJlY3Rpb24gPSBGbG9vclBhdHRlcm5EaXJlY3Rpb24uU1RBTkRJTkc7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpbmZvLmZsb29yUGF0dGVybiA9IGZsb29yUGF0dGVybjtcclxuICAvLyAgIGluZm8ubWVzaElkTGVmdCA9IGZsb29yR2FtZU9iamVjdDtcclxuICAvLyAgIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhPTjQ1IHx8IGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONjApIHtcclxuICAvLyAgICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7Zmxvb3JHYW1lT2JqZWN0fWA7XHJcbiAgLy8gICB9XHJcbiAgLy8gICBpZiAoaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IRVJSSU5HQk9ORSkge1xyXG4gIC8vICAgICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vICAgfVxyXG5cclxuICAvLyBjb25zdCBhZm1ldGluZyA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdwbGFuayBhZm1ldGluZycpO1xyXG4gIC8vIGxldCBhZm1ldGluZ1N0cmluZzogc3RyaW5nID0gYWZtZXRpbmcuYW5zd2VyLnRvTG93ZXJDYXNlKCk7XHJcbiAgLy8gYWZtZXRpbmdTdHJpbmcgPSBhZm1ldGluZ1N0cmluZy5zdWJzdHIoYWZtZXRpbmdTdHJpbmcubGFzdEluZGV4T2YoJyAnKSArIDEpO1xyXG4gIC8vIGNvbnN0IGxlZ1BhdHJvb25BbnN3ZXIgPSBzZWxlY3RlZC5maW5kKHMgPT4gcy5xdWVzdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnbGVnIHBhdHJvb24nKS5hbnN3ZXIudG9Mb3dlckNhc2UoKTtcclxuICAvLyBsZXQgbGVnUGF0cm9vblN0cmluZyA9ICcnO1xyXG4gIC8vIGNvbnN0IGhhcnRsaW5lVHlwZSA9IHNlbGVjdGVkLmZpbmQocyA9PiBzLnF1ZXN0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICdoYXJ0bGlqbicpO1xyXG4gIC8vXHJcbiAgLy8gaWYgKGhhcnRsaW5lVHlwZSAmJiBoYXJ0bGluZVR5cGUuYW5zd2VyLnRvTG93ZXJDYXNlKCkgPT09ICdhYW5nZXBhc3QnKSB7XHJcbiAgLy8gICBjb25zdCBoYXJ0bGluZVZhbHVlID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2hhcnRsaWpuX2FhbmdlcGFzdCcpO1xyXG4gIC8vICAgaWYgKGhhcnRsaW5lVmFsdWUgJiYgaGFydGxpbmVWYWx1ZS51c2VySW5wdXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgLy8gICAgIGluZm8uaGVhcnRMaW5lID0gTnVtYmVyKGhhcnRsaW5lVmFsdWUudXNlcklucHV0VmFsdWUpO1xyXG4gIC8vICAgfVxyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vXHJcbiAgLy8gc3dpdGNoICh0cnVlKSB7XHJcbiAgLy8gICBjYXNlIGxlZ1BhdHJvb25BbnN3ZXIuaW5kZXhPZigncmVjaHQnKSAhPT0gLTE6XHJcbiAgLy8gICAgIGxlZ1BhdHJvb25TdHJpbmcgPSAnOTAnO1xyXG4gIC8vICAgICBpbmZvLmZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5OT1JNQUw7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJ2dyYWF0JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzkwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzYwJykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzYwJztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONjA7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vICAgY2FzZSBsZWdQYXRyb29uQW5zd2VyLmluZGV4T2YoJzQ1JykgIT09IC0xOlxyXG4gIC8vICAgICBsZWdQYXRyb29uU3RyaW5nID0gJzQ1JztcclxuICAvLyAgICAgaW5mby5mbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSE9ONDU7XHJcbiAgLy8gICAgIGJyZWFrO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGluZm8ubWVzaElkTGVmdCA9IGAke2FmbWV0aW5nU3RyaW5nfV8ke2xlZ1BhdHJvb25TdHJpbmd9YDtcclxuICAvLyBpZiAoIGluZm8uZmxvb3JQYXR0ZXJuID09PSBGbG9vclBhdHRlcm4uSE9ONDUgfHwgaW5mby5mbG9vclBhdHRlcm4gPT09IEZsb29yUGF0dGVybi5IT042MCkge1xyXG4gIC8vICAgaW5mby5tZXNoSWRSaWdodCA9IGByXyR7YWZtZXRpbmdTdHJpbmd9XyR7bGVnUGF0cm9vblN0cmluZ31gO1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGlmIChpbmZvLmZsb29yUGF0dGVybiA9PT0gRmxvb3JQYXR0ZXJuLkhFUlJJTkdCT05FKSB7XHJcbiAgLy8gICBpbmZvLm1lc2hJZFJpZ2h0ID0gaW5mby5tZXNoSWRMZWZ0O1xyXG4gIC8vIH1cclxuICAvL1xyXG4gIC8vIGNvbnN0IGxlZ1JpY2h0aW5nQW5zd2VyID0gc2VsZWN0ZWQuZmluZChzID0+IHMucXVlc3Rpb24udG9Mb3dlckNhc2UoKSA9PT0gJ2xlZyByaWNodGluZycpLmFuc3dlci50b0xvd2VyQ2FzZSgpO1xyXG4gIC8vIGluZm8uZmxvb3JQYXR0ZXJuRGlyZWN0aW9uID1cclxuICAvLyAobGVnUmljaHRpbmdBbnN3ZXIuaW5kZXhPZigndmVydGljYWFsJykgIT09IC0xKSA/IEZsb29yUGF0dGVybkRpcmVjdGlvbi5TVEFORElORyA6IEZsb29yUGF0dGVybkRpcmVjdGlvbi5MWUlORztcclxuXHJcbiAgLy8gICByZXR1cm4gaW5mbztcclxuICAvLyB9XHJcblxyXG4gIC8vIHByb3RlY3RlZCBnZW5lcmF0ZVNlbGVjdGVkSW5NZXRhZGF0YShpdGVtOiBJdGVtKTogdm9pZCB7XHJcbiAgLy8gICBjb25zdCBjbG9uZVNlbGVjdGlvbnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0aW9ucykpO1xyXG4gIC8vICAgY2xvbmVTZWxlY3Rpb25zLmZvckVhY2gocyA9PiB7XHJcbiAgLy8gICAgIHMuaW1hZ2VEYXRhID0gdW5kZWZpbmVkO1xyXG4gIC8vICAgICBzLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgIGlmIChzLmFkZGFibGVzKSB7XHJcbiAgLy8gICAgICAgcy5hZGRhYmxlcy5mb3JFYWNoKGEgPT4ge1xyXG4gIC8vICAgICAgICAgYS5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgaXRlbS5tZXRhZGF0YS5kZWNvcyA9IEFycmF5LmZyb20odGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcyk7XHJcbiAgLy8gICBpdGVtLm1ldGFkYXRhLnNlbGVjdGlvbnMgPSBjbG9uZVNlbGVjdGlvbnM7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgbm9ybWFsaXplTWVzaChtZXNoOiBNZXNoKSB7XHJcbiAgICBjb25zdCBtZXNoU2l6ZSA9IG5ldyBWZWN0b3IzKCk7XHJcbiAgICBtZXNoLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRTaXplKG1lc2hTaXplKTtcclxuICAgIGlmIChtZXNoU2l6ZS56ID4gbWVzaFNpemUueCkge1xyXG4gICAgICBtZXNoLmdlb21ldHJ5LnJvdGF0ZVkoTWF0aC5QSSAvIDIpO1xyXG4gICAgfVxyXG4gICAgbWVzaC5nZW9tZXRyeS5jZW50ZXIoKTtcclxuICAgIG1lc2guZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk7XHJcbiAgICBjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xyXG4gICAgbWVzaC5nZW9tZXRyeS5ib3VuZGluZ0JveC5nZXRDZW50ZXIoY2VudGVyKTtcclxuICAgIG1lc2gucG9zaXRpb24uY29weShjZW50ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHNldEluc3RhbmNlVG9Db25maWd1cmUocmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0PiB7XHJcbiAgICBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuVGltZW91dCkge1xyXG4gICAgICBpZiAocmVzdWx0Lmluc3RhbmNlSWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UocmVzdWx0Lmluc3RhbmNlSWQpXHJcbiAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKGUpKTtcclxuICAgICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UocmVzdWx0Lmdvb2RJZCwgdHJ1ZSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoZSkpO1xyXG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgICAgICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gdGltZW91dCAvIHVuYWJsZSB0byBzZXQgaW5zdGFuY2VpZFxyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKCdFUlJPUl9TRVRUSU5HX0lOU1RBTkNFX0lEJykpO1xyXG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QocmVzdWx0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLnNldEluc3RhbmNlKHJlc3VsdC5pbnN0YW5jZUlkKVxyXG4gICAgICAgICAgLmNhdGNoKChlKSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IENvbmZpZ3VyYXRvckVycm9yTWVzc2FnZShlKSk7XHJcbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0U2VsZWN0aW9uc0FuZERlY29zRnJvbU1ldGFkYXRhKHJlc3VsdDogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCk6IHZvaWQge1xyXG4gICAgaWYgKHJlc3VsdC5zZWxlY3Rpb25zICYmIHJlc3VsdC5kZWNvcykge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0U2VsZWN0aW9ucyhyZXN1bHQuc2VsZWN0aW9ucyk7XHJcbiAgICAgIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZXREZWNvTm9kZXMoQXJyYXkuZnJvbShyZXN1bHQuZGVjb3MudmFsdWVzKCkpKTtcclxuICAgICAgcmVzdWx0Lm9ic29sZXRlID0gdHJ1ZTtcclxuICAgICAgaWYgKHJlc3VsdC5yZXN1bHRUeXBlICE9PSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25Ob3RGaXhlZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5PYnNvbGV0ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zLmxlbmd0aCA8IDIgfHwgdGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlcy5wdXNoKG5ldyBDb25maWd1cmF0b3JFcnJvck1lc3NhZ2UoJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJykpO1xyXG4gICAgICB9XHJcbiAgICAgIHRocm93IHJlc3VsdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUgPT09IG51bGwpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkpICYmXHJcbiAgICAgIChcclxuICAgICAgICAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlICYgMikgPiAwKSB8fFxyXG4gICAgICAgICAgICBzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUgPT09IG51bGwgfHwgc2VsZWN0aW9uLnF1ZXN0aW9uUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKSB8fFxyXG4gICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJlxyXG4gICAgICAgICAgKCgoc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSAmIDIpID4gMCkgfHxcclxuICAgICAgICAgICAgc2VsZWN0aW9uLmFuc3dlclB1YmxpY2F0aW9uQ29kZSA9PT0gbnVsbCB8fCBzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlID09PSB1bmRlZmluZWQpKVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNsZWFudXBCZWZvcmVQcmVzZXRMb2FkKCk6IHZvaWQge1xyXG4gICAgTWF0ZXJpYWxVdGlscy5DbGVhckNhY2hlcygpO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAqIENsZWFyIHZhcmlhYmxlcyB0byBsZXQgb2JqZWN0cyBiZWluZyBkaXNwb3NlZCBwcm9wZXJseVxyXG4gICovXHJcbiAgcHJvdGVjdGVkIGhhbmRsZUFmdGVyUHJlc2V0TG9hZCgpOiB2b2lkIHtcclxuICAgIC8vIG1ha2Ugc3VyZSBub3RoaW5nIGlzIGtlZXBpbmcgYSBsb2NrXHJcbiAgICB0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2Uuc2V0SW5zdGFuY2UobnVsbCk7XHJcbiAgICAvLyBjbGVhblxyXG4gICAgdGhpcy5jbGVhbnVwKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xlYW51cCgpOiB2b2lkIHtcclxuICAgIE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QodGhpcy5mdWxsM0RPYmplY3RUb1VzZSk7XHJcbiAgICB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSB1bmRlZmluZWQ7XHJcbiAgICBPYmplY3RVdGlscy5EaXNwb3NlT2JqZWN0KHRoaXMuX2FjdGl2ZUNoaWxkRWxlbWVudCk7XHJcbiAgICB0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fYWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkZGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY2FuQ29ubmVjdFNlbGVjdGlvbnMoc2VsMTogU2VsZWN0aW9uLCBzZWwyOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIGlmICghc2VsMS5kZWNvTm9kZSB8fCAhc2VsMi5kZWNvTm9kZSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBsZXQgY2FuQ29ubmVjdDogYm9vbGVhbiA9IHNlbDIuZGVjb05vZGUudHlwZSAhPT0gRGVjb05vZGVUeXBlLlBhcnQ7XHJcbiAgICBpZiAoIWNhbkNvbm5lY3QpIHtcclxuICAgICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMubGVuZ3RoO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgbGVuaTogbnVtYmVyID0gc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgbGVuaTsgaWkrKykge1xyXG4gICAgICAgICAgY2FuQ29ubmVjdCA9IFNjZW5lM0RVdGlsLkNhblNlbGVjdG9yQ29ubmVjdChzZWwxLmRlY29Ob2RlLmNvbm5lY3RvcnMsIHNlbDEuZGVjb05vZGUuY29ubmVjdG9yc1tpXSwgc2VsMi5kZWNvTm9kZS5jb25uZWN0b3JzW2lpXSk7XHJcbiAgICAgICAgICBpZiAoY2FuQ29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbkNvbm5lY3Q7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlQW5zd2VyU2VsZWN0ZWQoYW5zd2VyOiBBbnN3ZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Fuc3dlclNlbGVjdGVkLnB1c2goYW5zd2VyKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVTZWxlY3Rpb25TZWxlY3RlZChjaG9zZW5PcHRpb246IFNlbGVjdG9yU3RydWN0dXJlKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zU2VsZWN0ZWQucHVzaChjaG9zZW5PcHRpb24ub3B2VHJlZU5vZGVIaWVyYXJjaHkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbmZpZ3VyYWJsZUl0ZW0oaXRlbU5hbWU6IHN0cmluZyk6IE9iamVjdDNEIHtcclxuICAgIGNvbnN0IGl0ZW06IE9iamVjdDNEID0gbmV3IE9iamVjdDNEKCk7XHJcbiAgICBpdGVtLm5hbWUgPSBpdGVtTmFtZSArICdfY2xvbmUnO1xyXG4gICAgaXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIHJldHVybiBpdGVtO1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIC8vIHByb3RlY3RlZCBjcmVhdGVQb3NpdGlvbkFuaW1hdGlvbihvYmplY3Q6IE9iamVjdDNELCBmcm9tOiBWZWN0b3IzLCB0bzogVmVjdG9yMywgZWFzaW5nOiBUV0VFTi5FYXNpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAvLyAgIGNvbnN0IHR3ZWVuRnJvbTogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCkuY29weShmcm9tKTtcclxuICAvLyAgIGNvbnN0IHR3ZWVuID0gbmV3IFRXRUVOLlR3ZWVuKHR3ZWVuRnJvbSlcclxuICAvLyAgICAgLnRvKHRvLCAxMDAwKVxyXG4gIC8vICAgICAuZWFzaW5nKGVhc2luZylcclxuICAvLyAgICAgLm9uVXBkYXRlKCgpID0+IHtcclxuICAvLyAgICAgICBvYmplY3QucG9zaXRpb24uY29weSh0d2VlbkZyb20pO1xyXG4gIC8vICAgICAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAvLyAgICAgfSk7XHJcbiAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB0d2Vlbi5vbkNvbXBsZXRlKHJlc29sdmUuYmluZCh0aGlzLCB0d2VlbikpLm9uU3RvcChyZWplY3QpLnN0YXJ0KCkpO1xyXG4gIC8vIH1cclxuXHJcbiAgLy8gcHJvdGVjdGVkIGFzeW5jIGFuaW1hdGVDaGFuZ2VzKGZ1cm5pdHVyZTogSXRlbSwgY2hhbmdlczogQ2hhbmdlc0ludGVyZmFjZVtdKTogUHJvbWlzZTx2b2lkW10+IHtcclxuICAvLyAgIC8vIGl0J3MgY2hyaXN0bWFzc3NcclxuICAvLyAgIGNvbnN0IGFuaW1hdGlvbnM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xyXG4gIC8vICAgaWYgKGZ1cm5pdHVyZSBpbnN0YW5jZW9mIEN1c3RvbUZsb29ySXRlbSkge1xyXG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHtcclxuICAvLyAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgLy8gICAgICAgY29uc3QgZWFzaW5nOiBUV0VFTi5FYXNpbmcgPSAhY2hhbmdlc1tpXS5vbGRQb3NpdGlvbiA/IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5PdXQgOlxyXG4gIC8vICAgICAgICAgKCFjaGFuZ2VzW2ldLm5ld1Bvc2l0aW9uID8gVFdFRU4uRWFzaW5nLkV4cG9uZW50aWFsLk91dCA6IFRXRUVOLkVhc2luZy5FeHBvbmVudGlhbC5Jbk91dCk7XHJcbiAgLy8gICAgICAgY29uc3QgZnJvbTogVmVjdG9yMyA9XHJcbiAgLy8gICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgLy8gICAgICAgICBjaGFuZ2VzW2ldLm9sZFBvc2l0aW9uID8gbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ub2xkUG9zaXRpb24pIDogbmV3IFZlY3RvcjMoKS5jb3B5KGNoYW5nZXNbaV0ubmV3UG9zaXRpb24pLnNldFkoMTApO1xyXG4gIC8vICAgICAgIGNvbnN0IHRvOiBWZWN0b3IzID1cclxuICAvLyAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAvLyAgICAgICAgIGNoYW5nZXNbaV0ubmV3UG9zaXRpb24gPyBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5uZXdQb3NpdGlvbikgOiBuZXcgVmVjdG9yMygpLmNvcHkoY2hhbmdlc1tpXS5vbGRQb3NpdGlvbikuc2V0WSgxMCk7XHJcbiAgLy8gICAgICAgY29uc3Qgb2JqOiBPYmplY3QzRCA9IGZ1cm5pdHVyZS5nZXRPYmplY3RCeU5hbWUoY2hhbmdlc1tpXS5uYW1lKTtcclxuICAvLyAgICAgICBpZiAoIWZyb20uZXF1YWxzKHRvKSkge1xyXG4gIC8vICAgICAgICAgYW5pbWF0aW9ucy5wdXNoKFxyXG4gIC8vICAgICAgICAgICB0aGlzLmNyZWF0ZVBvc2l0aW9uQW5pbWF0aW9uKG9iaiwgZnJvbSwgdG8sIGVhc2luZylcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoYW5pbWF0aW9ucyk7XHJcbiAgLy8gfVxyXG5cclxuICBwcm90ZWN0ZWQgY2xvbmVTZWxlY3Rpb25zKCk6IFNlbGVjdGlvbltdIHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9ucyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3Rpb25zKSk7XHJcbiAgICBjbG9uZVNlbGVjdGlvbnMuZm9yRWFjaChzID0+IHtcclxuICAgICAgcy5pbWFnZURhdGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgIHMuaW1hZ2VEYXRhTGFzdEFuc3dlciA9IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKHMuYWRkYWJsZXMpIHtcclxuICAgICAgICBzLmFkZGFibGVzLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgICBhLmltYWdlRGF0YSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWxlY3Rpb25zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIHVwZGF0ZUJ1aWxkT2JqZWN0KG5ld0l0ZW06IE9iamVjdDNELCByZXN1bHRPYmplY3Q6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QpOiBQcm9taXNlPENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3Q+IHtcclxuICAgIGNvbnN0IGNsb25lU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSB0aGlzLmNsb25lU2VsZWN0aW9ucygpO1xyXG4gICAgbmV3SXRlbS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIG5ld0l0ZW0ubmFtZSA9IHJlc3VsdE9iamVjdC5hcnRpY2xlTmFtZTtcclxuICAgIG5ld0l0ZW0udXNlckRhdGEucm9vdE9iamVjdCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5wb3NpdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnBvc2l0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnBvc2l0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIFRPRE8gYXNrIHdoeSBpdCBjb3VsZCBhbHNvIGJlIGFuIG51bWJlclxyXG4gICAgaWYgKHJlc3VsdE9iamVjdC5yb3RhdGlvbiAmJiByZXN1bHRPYmplY3Qucm90YXRpb24gaW5zdGFuY2VvZiBFdWxlcikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLmNvcHkocmVzdWx0T2JqZWN0LnJvdGF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAocmVzdWx0T2JqZWN0LmRlZmF1bHQxODAgJiYgIXJlc3VsdE9iamVjdC5yb3RhdGlvbikge1xyXG4gICAgICBuZXdJdGVtLnJvdGF0aW9uLnNldCh0aGlzLmRlZmF1bHRSb3RhdGlvbi54LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi55LCB0aGlzLmRlZmF1bHRSb3RhdGlvbi56KTtcclxuICAgICAgbmV3SXRlbS51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXN1bHRPYmplY3Qub2JqZWN0ID0gbmV3SXRlbTtcclxuICAgIHJlc3VsdE9iamVjdC5zZWxlY3Rpb25zID0gY2xvbmVTZWxlY3Rpb25zO1xyXG4gICAgcmVzdWx0T2JqZWN0LmRlY29zID0gQXJyYXkuZnJvbSh0aGlzLmNvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzKTtcclxuXHJcbiAgICByZXR1cm4gcmVzdWx0T2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGlzTW92ZWFibGVPYmplY3Qob2JqOiBPYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIG9iai51c2VyRGF0YSAmJiBvYmoudXNlckRhdGEuc2VsZWN0aW9uICYmIG9iai51c2VyRGF0YS5zZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9PT0gSGRlY29Qb3NpdGlvbmluZy5WYXJpYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhc3luYyBhZGRFbGVtZW50T25Db25uZWN0b3IoY3VycmVudEl0ZW06IE9iamVjdDNELCBlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcsIGNvbm5lY3RlZE5vZGVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGRvIHNvbWV0aGluZywgYnV0IG5vdCBzdXJlIHdoYXRcclxuXHJcbiAgICAvLyBjb25zdCBjb25uZWN0b3JGcm9tRWxlbWVudCA9IGN1cnJlbnRJdGVtLmNvbm5lY3RvckZyb21FbGVtZW50KGVsZW1lbnQudXNlckRhdGEuc2VsZWN0aW9uKTtcclxuICAgIC8vIGNvbnN0IGlkRnJvbUJhc2VFbGVtZW50OiBudW1iZXIgPSBjb25uZWN0ZWROb2RlSWQgPyBjb25uZWN0ZWROb2RlSWQgOiBjb25uZWN0b3JGcm9tRWxlbWVudC5jb25uZWN0ZWROb2RlSWQ7XHJcbiAgICAvLyBjb25zdCBiYXNlRWxlbWVudDogT2JqZWN0M0RbXSA9IGN1cnJlbnRJdGVtLmdldE9iamVjdHNCeVVzZXJEYXRhUHJvcCgnc2VsZWN0aW9uJywgJ25vZGVJZCcsIGlkRnJvbUJhc2VFbGVtZW50KTtcclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBJdGVtID0gT2JqZWN0VXRpbHMuR2V0UGFyZW50SXRlbShlbGVtZW50KTtcclxuICAgIC8vIGlmIChpdGVtKSB7XHJcbiAgICAvLyAgIGNvbnN0IGNvbm46IHN0cmluZyA9XHJcbiAgICAvLyAgICAgYXdhaXQgdGhpcy5lbGVtZW50U2VydmljZS5wbGFjZUVsZW1lbnRPbkNvbm5lY3RvcihcclxuICAgIC8vICAgICAgIGl0ZW0ubWV0YWRhdGEuaXRlbUlkLFxyXG4gICAgLy8gICAgICAgZWxlbWVudCxcclxuICAgIC8vICAgICAgIGJhc2VFbGVtZW50Lmxlbmd0aCA+IDAgPyBiYXNlRWxlbWVudFswXSA6IG51bGwsXHJcbiAgICAvLyAgICAgICBmYWxzZSxcclxuICAgIC8vICAgICAgIGNvbm5lY3RvcixcclxuICAgIC8vICAgICAgIGZhbHNlXHJcbiAgICAvLyAgICAgKTtcclxuICAgIC8vICAgdGhpcy5zYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LCBjb25uKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBzYXZlRWxlbWVudENvbm5lY3RvcihlbGVtZW50OiBPYmplY3QzRCwgY29ubmVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIC8vIGlmIChlbGVtZW50ICYmIGVsZW1lbnQudXNlckRhdGEgJiYgZWxlbWVudC51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgIC8vICAgdGhpcy5fY3VycmVudEN1c3RvbUZsb29yR3JvdXAudXBkYXRlRWxlbWVudENvbm5lY3RvcihlbGVtZW50LnVzZXJEYXRhLnNlbGVjdGlvbiwgY29ubmVjdG9yLCB0aGlzLmJhc2VFbGVtZW50Tm9kZUlkKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRJZGVudGlmaWVyRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7c2VsZWN0aW9uLmRlY29Ob2RlID8gc2VsZWN0aW9uLmRlY29Ob2RlLm5vZGVJZCArICdfJyA6ICcnfSR7c2VsZWN0aW9uLm5vZGVJZH1gO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIHRvZG86IGNoZWNrIHRoaXNcclxuICAgIC8vIHRoaXMuX2VsZW1lbnRTZXJ2aWNlLnJlbW92ZUVsZW1lbnQodGhpcy5hY3RpdmVJbnN0YW5jZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtYXRlcmlhbElkIG9mIHRoZSBwYXJlbnQgdXAgdGhlIHRyZWUgdW50aWwgcHJlc2VudGlvbmxldmVsIDEgaXMgcmVhY2hlZFxyXG4gICAqIEBwYXJhbSBpZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGdldE1hdGVyaWFsSWRGcm9tUGFyZW50KGlkOiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgaWR4OiBudW1iZXIgPSB0aGlzLnNlbGVjdGlvbnMuZmluZEluZGV4KHMgPT4gcy5ub2RlID09PSBpZCk7XHJcbiAgICBsZXQgY3VycmVudExldmVsOiBudW1iZXIgPSA5OTk7XHJcbiAgICBpZiAoaWR4ID4gLTEpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGlkeDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID49IGN1cnJlbnRMZXZlbCkge1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGN1cnJlbnRMZXZlbCA9IHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbDtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmhkZWNvR2FtZU9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFkanVzdGFibGVzKGNoZWNrR2FtZU9iamVjdDogYm9vbGVhbiA9IHRydWUsIGNoZWNrVHlwZTogYm9vbGVhbiA9IHRydWUpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25zLmZpbHRlcihzID0+IHtcclxuICAgICAgY29uc3Qgbm9kZTogRGVjb05vZGUgPSBzLmRlY29Ob2RlO1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIHJldHVybiBub2RlICYmIChjaGVja0dhbWVPYmplY3QgPyBub2RlLmdhbWVPYmplY3ROYW1lIDogdHJ1ZSkgJiYgKGNoZWNrVHlwZSA/IG5vZGUudHlwZSA9PT0gRGVjb05vZGVUeXBlLlBhcnQgOiB0cnVlKSAmJiBub2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0VmFyaWF0aW9ucygpOiBhbnlbXSB7XHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlLmRlY29Ob2Rlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMuZmlsdGVyKChkZWNvOiBEZWNvTm9kZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZGVjby50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgY3JlYXRlQWRqdXN0YWJsZShpdGVtOiBPYmplY3QzRCwgYWRqOiBTZWxlY3Rpb24pOiBPYmplY3QzRCB7XHJcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICBsZXQgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGFkai5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5yZXBsYWNlKC9bLl0vZywgJycpO1xyXG4gICAgICBvYmogPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlID8gdGhpcy5mdWxsM0RPYmplY3RUb1VzZS5nZXRPYmplY3RCeU5hbWUobmFtZSkgOiBudWxsO1xyXG4gICAgICBpZiAoIW9iaikge1xyXG4gICAgICAgIERlYnVnVXRpbHMubG9nKGBObyBvYmplY3Qgd2l0aCBuYW1lICR7YWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lfSBmb3VuZCFgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5jcmVhdGVVbmlxdWVOYW1lKGl0ZW0sIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIGl0ZW0uYWRkKGFkanVzdGFibGUpO1xyXG4gICAgYWRqdXN0YWJsZSA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkanVzdGFibGUubmFtZSk7XHJcbiAgICB0aGlzLnBsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IFNlbGVjdGlvbiwgcGFydDI/OiBhbnksIHBhcnQxPzogYW55KTogT2JqZWN0M0Qge1xyXG4gICAgY29uc3Qgb2JqOiBhbnkgPSB0aGlzLmZ1bGwzRE9iamVjdFRvVXNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgIGFkZGFibGUubmFtZSA9IHRoaXMuY3JlYXRlVW5pcXVlTmFtZShpdGVtLCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGxhY2VBZGRhYmxlKGl0ZW0sIGFkZGFibGUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcGxhY2VBZGRhYmxlKGl0ZW06IE9iamVjdDNELCBhZGQ6IGFueSk6IE9iamVjdDNEIHtcclxuICAgIGl0ZW0uYWRkKGFkZCk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBPYmplY3QzRCA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKGFkZC5uYW1lKSBhcyBPYmplY3QzRDtcclxuICAgIHRoaXMuX3BsYWNlZEFkZGFibGVzLnB1c2goYWRkYWJsZSk7XHJcbiAgICByZXR1cm4gYWRkYWJsZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBjcmVhdGVVbmlxdWVOYW1lKGl0ZW06IE9iamVjdDNELCBvYmo6IE9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IG5hbWUgPSBgJHtpdGVtLm5hbWV9XyR7b2JqLm5hbWV9YDtcclxuICAgIGxldCBleGlzdGluZ09iaiA9IGl0ZW0uZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgd2hpbGUgKGV4aXN0aW5nT2JqKSB7XHJcbiAgICAgIGl0ZXJhdGlvbisrO1xyXG4gICAgICBuYW1lID0gYCR7aXRlbS5uYW1lfV8ke29iai5uYW1lfWAgKyAoaXRlcmF0aW9uICE9PSAwID8gKCdfJyArIGl0ZXJhdGlvbikgOiAnJyk7XHJcbiAgICAgIGV4aXN0aW5nT2JqID0gaXRlbS5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmFtZTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBwbGFjZUFkZGFibGVzKGl0ZW06IE9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMucGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0aW9uJykgJiYgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5zZWxlY3Rpb24pIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnBsYWNlZEFkanVzdGFibGVzW2ldLnVzZXJEYXRhLnNlbGVjdGlvbjtcclxuICAgICAgICBpZiAoYWRqdXN0YWJsZVNlbGVjdGlvbikge1xyXG4gICAgICAgICAgY29uc3QgbGVuYTogbnVtYmVyID0gYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlcy5sZW5ndGg7XHJcbiAgICAgICAgICBsZXQgY29uQWRkYWJsZTogYW55O1xyXG4gICAgICAgICAgZm9yIChsZXQgaWEgPSAwOyBpYSA8IGxlbmE7IGlhKyspIHtcclxuICAgICAgICAgICAgU2NlbmUzRFV0aWwuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuc2NlbmUsXHJcbiAgICAgICAgICAgICAgaXRlbSwgdGhpcy5wbGFjZWRBZGp1c3RhYmxlc1tpXSwgYWRqdXN0YWJsZVNlbGVjdGlvbi5hZGRhYmxlc1tpYV0sIGZhbHNlLFxyXG4gICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgaWYgKGNvbkFkZGFibGUpIHtcclxuICAgICAgICAgICAgICBTY2VuZTNEVXRpbC5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5zY2VuZSxcclxuICAgICAgICAgICAgICAgIGl0ZW0sIGNvbkFkZGFibGUsIGFkanVzdGFibGVTZWxlY3Rpb24uYWRkYWJsZXNbaWFdLCBmYWxzZSxcclxuICAgICAgICAgICAgICAgIChhZGQsIHBhcnQyPywgcGFydDE/KSA9PiB0aGlzLmNyZWF0ZUFkZGFibGUoaXRlbSwgYWRkLCBwYXJ0MiwgcGFydDEpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25BZGRhYmxlID0gdGhpcy5fcGxhY2VkQWRkYWJsZXNbdGhpcy5fcGxhY2VkQWRkYWJsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFZhcmlhdGlvbnMoaXRlbTogT2JqZWN0M0QsIGluc3RhbmNlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudXNlVmFyaWF0aW9uT25QYXJ0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkUGFydCh0aGlzLmFydGljbGVBc3NldFBhdGgsIHRoaXMuX2FkanVzdGFibGVzLCBpbnN0YW5jZUlkLCBpdGVtLCB0cnVlKTtcclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgdGhpcy5fYWRqdXN0YWJsZXMsIGluc3RhbmNlSWQsIGl0ZW0sIHRydWUpO1xyXG4gICAgYXdhaXQgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24odGhpcy5hcnRpY2xlQXNzZXRQYXRoLCB0aGlzLl9hZGRhYmxlcywgaW5zdGFuY2VJZCwgaXRlbSwgdHJ1ZSk7XHJcbiAgICB0aGlzLnZhcmlhdGlvblNlcnZpY2UuY2xlYXJDYWNoZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbChhbnN3ZXI6IEFuc3dlcik6IHZvaWQge1xyXG4gICAgaWYgKGFuc3dlci5lbGVtZW50VHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbiAmJiAoYW5zd2VyLmdhbWVPYmplY3QgfHwgYW5zd2VyLm1hdGVyaWFsVXJsKSkge1xyXG4gICAgICBjb25zdCB2YXJpYXRpb25zOiBEZWNvTm9kZVtdID0gdGhpcy5nZXRWYXJpYXRpb25zKCk7XHJcbiAgICAgIGNvbnN0IHZhcmlhdGlvbkRlY29Ob2RlOiBEZWNvTm9kZSA9IHZhcmlhdGlvbnMuZmluZCh2ID0+XHJcbiAgICAgICAgKCh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnRBcnRpY2xlRGVjb0lkICYmIHYucGFyZW50SWQudG9TdHJpbmcoKSA9PT0gYW5zd2VyLnBhcmVudEFydGljbGVEZWNvSWQudG9TdHJpbmcoKSkgfHxcclxuICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICh2LnBhcmVudElkICYmIGFuc3dlci5wYXJlbnROb2RlSWQgJiYgdi5wYXJlbnRJZC50b1N0cmluZygpID09PSBhbnN3ZXIucGFyZW50Tm9kZUlkLnRvU3RyaW5nKCkpKSk7XHJcbiAgICAgIGlmICghdmFyaWF0aW9uRGVjb05vZGUgfHwgIXRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGFmZmVjdGVkU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBbXTtcclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBhZmZlY3RlZFNlbGVjdGlvbnMgPSB0aGlzLl9hZGp1c3RhYmxlcztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBjdXJyZW50U2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBPYmplY3RVdGlscy5HZXRTZWxlY3Rpb25Gcm9tU2VsZWN0ZWRPYmplY3QodGhpcy5fYWN0aXZlQ2hpbGRFbGVtZW50KTtcclxuICAgICAgICBpZiAoY3VycmVudFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgYWZmZWN0ZWRTZWxlY3Rpb25zID0gW3RoaXMuX2FkanVzdGFibGVzLmZpbmQoKHNlbGVjdGlvbjogU2VsZWN0aW9uKSA9PiBzZWxlY3Rpb24ubm9kZUlkID09PSBjdXJyZW50U2VsZWN0aW9uLm5vZGVJZCldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gYWZmZWN0ZWRTZWxlY3Rpb25zICYmIGFmZmVjdGVkU2VsZWN0aW9ucy5sZW5ndGggPiAwID8gYWZmZWN0ZWRTZWxlY3Rpb25zLm1hcChzID0+IE9iamVjdC5hc3NpZ24oe30sIHMpKSA6IFtdO1xyXG4gICAgICBpZiAoYWRqdXN0YWJsZXNDbG9uZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhdGlvbiA9IHNlbGVjdGlvbi52YXJpYXRpb25zLmZpbmQodiA9PiAoXHJcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgICB2IGFzIHVua25vd24gYXMgVmFyaWF0aW9uKS5kZWNvSWQudG9TdHJpbmcoKSA9PT0gdmFyaWF0aW9uRGVjb05vZGUuaWQudG9TdHJpbmcoKSAmJiAodiBhcyB1bmtub3duIGFzIFZhcmlhdGlvbikubm9kZS50b1N0cmluZygpID09PSB2YXJpYXRpb25EZWNvTm9kZS5ub2RlSWQudG9TdHJpbmcoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgaWYgKHZhcmlhdGlvbi5tYXRlcmlhbFVybCkge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24ubWF0ZXJpYWxVcmwgPSBhbnN3ZXIubWF0ZXJpYWxVcmw7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB2YXJpYXRpb24uZ2FtZU9iamVjdE5hbWUgPSBhbnN3ZXIuZ2FtZU9iamVjdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKGFkanVzdGFibGVzQ2xvbmVbMF0uc2NoZW1hLCBbYW5zd2VyXSwgdGhpcy5hcnRpY2xlQXNzZXRQYXRoKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKHRoaXMuYXJ0aWNsZUFzc2V0UGF0aCwgYWRqdXN0YWJsZXNDbG9uZSwgJycsIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAsIHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIHByZWxvYWRNYXRlcmlhbEJ5U2VsZWN0aW9uKGFuc3dlcjogU2VsZWN0b3JTdHJ1Y3R1cmUpOiB2b2lkIHtcclxuICAgIGlmIChhbnN3ZXIuZWxlbWVudFR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24gJiYgYW5zd2VyLmdhbWVPYmplY3QpIHtcclxuICAgICAgY29uc3QgdmFyaWF0aW9uRGVjb05vZGU6IERlY29Ob2RlID0gbmV3IERlY29Ob2RlKCk7XHJcbiAgICAgIHZhcmlhdGlvbkRlY29Ob2RlLmdhbWVPYmplY3ROYW1lID0gYW5zd2VyLmdhbWVPYmplY3Q7XHJcbiAgICAgIGNvbnN0IGFkanVzdGFibGVzQ2xvbmU6IFNlbGVjdGlvbltdID0gdGhpcy5fYWRqdXN0YWJsZXMubWFwKHMgPT4gT2JqZWN0LmFzc2lnbih7fSwgcykpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2dlbmVyaWNTZWxlY3Rpb24pIHtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZS5mb3JFYWNoKChzZWxlY3Rpb246IFNlbGVjdGlvbikgPT4gc2VsZWN0aW9uLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdKTtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgIHRoaXMudmFyaWF0aW9uQ2FjaGVTZXJ2aWNlLnByZWxvYWRWYXJpYXRpb25zQXN5bmMoYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudmFyaWF0aW9uU2VydmljZS5sb2FkVmFyaWF0aW9uKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZSxcclxuICAgICAgICAgICAgICAgICcnLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgIHRydWVcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMuZm9yRWFjaCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3Rpb246IFNlbGVjdGlvbiA9IE9iamVjdFV0aWxzLkdldFNlbGVjdGlvbkZyb21TZWxlY3RlZE9iamVjdCh0aGlzLl9hY3RpdmVDaGlsZEVsZW1lbnQpO1xyXG4gICAgICAgIGlmIChjdXJyZW50U2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCkge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb25Gcm9tQWRqdXN0YWJsZXM6IFNlbGVjdGlvbiA9IGFkanVzdGFibGVzQ2xvbmVcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcykge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlcy52YXJpYXRpb25zID0gW3ZhcmlhdGlvbkRlY29Ob2RlXTtcclxuICAgICAgICAgICAgICB0aGlzLnZhcmlhdGlvbkNhY2hlU2VydmljZS5wcmVsb2FkVmFyaWF0aW9uc0FzeW5jKFxyXG4gICAgICAgICAgICAgICAgYWRqdXN0YWJsZXNDbG9uZVswXS5zY2hlbWEsIFt2YXJpYXRpb25EZWNvTm9kZV0sIHRoaXMuYXJ0aWNsZUFzc2V0UGF0aClcclxuICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRWYXJpYXRpb24oXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnRpY2xlQXNzZXRQYXRoLFxyXG4gICAgICAgICAgICAgICAgICAgIGFkanVzdGFibGVzQ2xvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICkudGhlbigpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbkZyb21BZGp1c3RhYmxlczogU2VsZWN0aW9uID0gdGhpcy5fYWRqdXN0YWJsZXNcclxuICAgICAgICAgICAgICAuZmluZCgoc2VsZWN0aW9uOiBTZWxlY3Rpb24pID0+IHNlbGVjdGlvbi5ub2RlSWQgPT09IGN1cnJlbnRTZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uRnJvbUFkanVzdGFibGVzLnZhcmlhdGlvbnMgPSBbdmFyaWF0aW9uRGVjb05vZGVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkRmxvb3IocmVzdWx0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIGxldCBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLy8gbGV0IGZsb29yUGF0dGVybjogRmxvb3JQYXR0ZXJuO1xyXG4gICAgLy8gY29uc3QgYXJ0aWNsZUZ1bGxPYmplY3Q6IEFydGljbGVGdWxsT2JqZWN0ID0gYXdhaXQgdGhpcy5jb25uZWN0b3JBZGFwdGVyU2VydmljZS5nZXRBcnRpY2xlRnVsbE9iamVjdCgrcmVzdWx0Lm1ldGFEYXRhLmdvb2RJZCk7XHJcbiAgICAvLyBpZiAoYXJ0aWNsZUZ1bGxPYmplY3QudGFncyAhPT0gbnVsbCAmJiBhcnRpY2xlRnVsbE9iamVjdC50YWdzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgZm9yIChjb25zdCB0YWcgb2YgYXJ0aWNsZUZ1bGxPYmplY3QudGFncykge1xyXG4gICAgLy8gICAgIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdOT1JNQUwnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAodGFnLmRlc2NyaXB0aW9uID09PSAnSEVSUklOR0JPTkUnKSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uSEVSUklOR0JPTkU7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmICh0YWcuZGVzY3JpcHRpb24gPT09ICdIT042MCcpIHtcclxuICAgIC8vICAgICAgIGZsb29yUGF0dGVybiA9IEZsb29yUGF0dGVybi5IT042MDtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKHRhZy5kZXNjcmlwdGlvbiA9PT0gJ0hPTjQ1Jykge1xyXG4gICAgLy8gICAgICAgZmxvb3JQYXR0ZXJuID0gRmxvb3JQYXR0ZXJuLkhPTjQ1O1xyXG4gICAgLy8gICAgIH0gZWxzZSB7XHJcbiAgICAvLyAgICAgICBmbG9vclBhdHRlcm4gPSBGbG9vclBhdHRlcm4uTk9STUFMO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBmbG9vcldpdGhvdXRQbGFua0NvdW50ZXIgPSBmYWxzZTtcclxuICAgIC8vIH1cclxuICAgIC8vXHJcbiAgICAvLyBjb25zdCBpdGVtOiBGbG9vclBsYW5lSXRlbSA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yVG9Db25maWd1cmU7XHJcbiAgICAvLyBpdGVtLm1ldGFkYXRhID0gcmVzdWx0Lm1ldGFEYXRhO1xyXG4gICAgLy8gaXRlbS5tZXRhZGF0YS5zZWxlY3Rpb25zID0gdGhpcy5jbG9uZVNlbGVjdGlvbnMoKTtcclxuICAgIC8vIGl0ZW0ubWV0YWRhdGEuZGVjb3MgPSBBcnJheS5mcm9tKHRoaXMuY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5kZWNvTm9kZXMpO1xyXG4gICAgLy8gdGhpcy5oYW5kbGVDcmVhdGVGbG9vcihpdGVtKTtcclxuICAgIC8vXHJcbiAgICAvLyBpZiAoZmxvb3JXaXRob3V0UGxhbmtDb3VudGVyKSB7XHJcbiAgICAvLyAgIGNvbnN0IGZsb29yUm90YXRpb246IG51bWJlciA9IHRoaXMuZmxvb3JTZXJ2aWNlLmZsb29yUm90YXRpb247XHJcbiAgICAvLyAgIGl0ZW0uY2hpbGRyZW5bMF0udXNlckRhdGEuc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb25zWzBdO1xyXG4gICAgLy8gICBhd2FpdCB0aGlzLmxvYWRWYXJpYXRpb25zKGl0ZW0sIHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQpO1xyXG4gICAgLy9cclxuICAgIC8vICAgaXRlbS5tZXRhZGF0YS50ZXh0dXJlQXNzZXROYW1lID0gdGhpcy52YXJpYXRpb25TZXJ2aWNlLmxvYWRlZEFzc2V0O1xyXG4gICAgLy8gICB0aGlzLmZsb29yU2VydmljZS51bkhpZ2hMaWdodEZsb29ycygpO1xyXG4gICAgLy8gICB0aGlzLnNjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICAvLyAgIHRoaXMuY3VycmVudEN1c3RvbUZsb29yR3JvdXAgPSBpdGVtO1xyXG4gICAgLy8gICByZXN1bHQuZnVybml0dXJlID0gdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cDtcclxuICAgIC8vICAgcmVzdWx0Lmluc3RhbmNlSWQgPSByZXN1bHQubWV0YURhdGEuaXRlbUlkO1xyXG4gICAgLy9cclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuZmxvb3JTZXJ2aWNlLnVuSGlnaExpZ2h0Rmxvb3JzKCk7XHJcbiAgICAvLyAgIHRoaXMuc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIC8vICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCA9IGl0ZW07XHJcbiAgICAvLyAgIHJlc3VsdC5mdXJuaXR1cmUgPSB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwO1xyXG4gICAgLy8gICByZXN1bHQuaW5zdGFuY2VJZCA9IHJlc3VsdC5tZXRhRGF0YS5pdGVtSWQ7XHJcbiAgICAvLyAgIC8vIHRoaXMuX2dlbmVyYXRlTGF5aW5nUGF0dGVybihpdGVtLCBmbG9vclBhdHRlcm4pO1xyXG4gICAgLy8gfVxyXG4gICAgLy9cclxuICAgIC8vIHRoaXMuaGFuZGxlSW50ZWdyYXRpb24ocmVzdWx0Lm1ldGFEYXRhLml0ZW1JZCwgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCk7XHJcbiAgICAvLyBpZiAodGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cC5pdGVtR3JvdXApIHtcclxuICAgIC8vICAgdGhpcy5pdGVtR3JvdXBTZXJ2aWNlLnJlYXR0YWNoVG9JdGVtR3JvdXAoXHJcbiAgICAvLyAgICAgdGhpcy5jdXJyZW50Q3VzdG9tRmxvb3JHcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLml0ZW1Hcm91cCxcclxuICAgIC8vICAgICB0aGlzLmN1cnJlbnRDdXN0b21GbG9vckdyb3VwLnBvc2l0aW9uKTtcclxuICAgIC8vIH1cclxuICAgIC8vIHRoaXMuZW1wdHlBbnN3ZXJTZWxlY3RlZCgpO1xyXG4gICAgLy9cclxuICAgIC8vIGlmIChyZXN1bHQucmVzdWx0VHlwZSA9PT0gUmVzdWx0VHlwZS5Ob1NlbGVjdGlvbnMpIHtcclxuICAgIC8vICAgcmVzdWx0LnJlc3VsdFR5cGUgPSBSZXN1bHRUeXBlLkNvbmZpZ3VyYXRpb25GaXhlZDtcclxuICAgIC8vIH0gZWxzZSBpZiAocmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuT2Jzb2xldGUgJiYgcmVzdWx0LnJlc3VsdFR5cGUgIT09IFJlc3VsdFR5cGUuQ29uZmlndXJhdGlvbkZpeGVkKSB7IC8vIGRvbid0IG92ZXJyaWRlIHRoZXNlXHJcbiAgICAvLyAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Mb2FkZWQ7XHJcbiAgICAvLyB9XHJcbiAgICAvLyB0aGlzLmZsb29yU2VydmljZS5mbG9vclJlc3VsdE9iamVjdCA9IHJlc3VsdDtcclxuICAgIC8vIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHJlc3VsdCk7XHJcbiAgICAvLyByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRvd25sb2FkVURTWmZvckFSSU9TKCk6IHZvaWQge1xyXG4gICAgY29uc3Qgb2JqZWN0czogT2JqZWN0M0RbXSA9IHRoaXMuaXRlbVNlcnZpY2Uuc2NlbmVJdGVtcztcclxuICAgIGNvbnN0IG9iamVjdFRvRXhwb3J0OiBPYmplY3QzRCA9IG9iamVjdHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO1xyXG4gICAgdGhpcy51dGlsc1NlcnZpY2UuZG93bmxvYWRVU0RaZm9yQVJJT1Mob2JqZWN0VG9FeHBvcnQpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19