@colijnit/configurator 261.1.1 → 261.20.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 (401) hide show
  1. package/{fesm2015/colijnit-configurator.js → fesm2022/colijnit-configurator.mjs} +19087 -18481
  2. package/fesm2022/colijnit-configurator.mjs.map +1 -0
  3. package/index.d.ts +3299 -0
  4. package/lib/components/answer-card/style/_layout.scss +3 -3
  5. package/lib/components/answers-slideout/style/_layout.scss +1 -0
  6. package/lib/style/configurator-globals.scss +1 -21
  7. package/package.json +24 -19
  8. package/bundles/colijnit-configurator.umd.js +0 -20167
  9. package/bundles/colijnit-configurator.umd.js.map +0 -1
  10. package/colijnit-configurator.d.ts +0 -5
  11. package/esm2015/colijnit-configurator.js +0 -5
  12. package/esm2015/lib/builder.js +0 -795
  13. package/esm2015/lib/components/answer-card/answer-card.component.js +0 -313
  14. package/esm2015/lib/components/answer-card/answer-card.module.js +0 -50
  15. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +0 -182
  16. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +0 -34
  17. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +0 -490
  18. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +0 -61
  19. package/esm2015/lib/components/color-filter/color-filter.component.js +0 -59
  20. package/esm2015/lib/components/color-filter/color-filter.module.js +0 -26
  21. package/esm2015/lib/components/configurator/configurator.component.js +0 -133
  22. package/esm2015/lib/components/configurator/configurator.module.js +0 -42
  23. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +0 -222
  24. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +0 -48
  25. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +0 -82
  26. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +0 -163
  27. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +0 -49
  28. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +0 -33
  29. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +0 -60
  30. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +0 -17
  31. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +0 -46
  32. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +0 -26
  33. package/esm2015/lib/components/element-buttons/element-buttons.component.js +0 -168
  34. package/esm2015/lib/components/element-buttons/element-buttons.module.js +0 -30
  35. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +0 -186
  36. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +0 -34
  37. package/esm2015/lib/components/image-zoom/image-zoom.component.js +0 -61
  38. package/esm2015/lib/components/image-zoom/image-zoom.module.js +0 -30
  39. package/esm2015/lib/components/lite-selector/lite-selector.component.js +0 -206
  40. package/esm2015/lib/components/lite-selector/lite-selector.module.js +0 -34
  41. package/esm2015/lib/components/product-configurator/product-configurator.component.js +0 -184
  42. package/esm2015/lib/components/product-configurator/product-configurator.module.js +0 -72
  43. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +0 -237
  44. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +0 -38
  45. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +0 -284
  46. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +0 -42
  47. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +0 -72
  48. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +0 -34
  49. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +0 -82
  50. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +0 -30
  51. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +0 -80
  52. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +0 -34
  53. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +0 -93
  54. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +0 -34
  55. package/esm2015/lib/components/progress-bar/progress-bar.component.js +0 -55
  56. package/esm2015/lib/components/progress-bar/progress-bar.module.js +0 -29
  57. package/esm2015/lib/components/scene-options/scene-options.component.js +0 -164
  58. package/esm2015/lib/components/scene-options/scene-options.module.js +0 -38
  59. package/esm2015/lib/components/selections-summary/selections-summary.component.js +0 -163
  60. package/esm2015/lib/components/selections-summary/selections-summary.module.js +0 -45
  61. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +0 -171
  62. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +0 -34
  63. package/esm2015/lib/components/slideout/slideout.component.js +0 -83
  64. package/esm2015/lib/components/slideout/slideout.module.js +0 -17
  65. package/esm2015/lib/components/summary-line/summary-line.component.js +0 -273
  66. package/esm2015/lib/components/summary-line/summary-line.module.js +0 -44
  67. package/esm2015/lib/components/tag-filter/tag-filter.component.js +0 -39
  68. package/esm2015/lib/components/tag-filter/tag-filter.module.js +0 -21
  69. package/esm2015/lib/components/threedselector/threedselector.component.js +0 -155
  70. package/esm2015/lib/components/threedselector/threedselector.module.js +0 -34
  71. package/esm2015/lib/core/helper/variation-helper.js +0 -553
  72. package/esm2015/lib/core/shader/floor-fade.shader.js +0 -33
  73. package/esm2015/lib/core/textures/depth-data-texture.js +0 -19
  74. package/esm2015/lib/directives/directives.module.js +0 -26
  75. package/esm2015/lib/directives/visibility-observer-master.directive.js +0 -53
  76. package/esm2015/lib/directives/visibility-observer.directive.js +0 -54
  77. package/esm2015/lib/enum/ar-feature.enum.js +0 -14
  78. package/esm2015/lib/enum/configuration-key.enum.js +0 -41
  79. package/esm2015/lib/enum/configuration-template.enum.js +0 -6
  80. package/esm2015/lib/enum/device-size-type.js +0 -7
  81. package/esm2015/lib/enum/device-tier.enum.js +0 -7
  82. package/esm2015/lib/enum/icon.enum.js +0 -113
  83. package/esm2015/lib/enum/item-type.enum.js +0 -23
  84. package/esm2015/lib/enum/light.enum.js +0 -9
  85. package/esm2015/lib/enum/navigator-type.enum.js +0 -6
  86. package/esm2015/lib/enum/output-encoding.enum.js +0 -9
  87. package/esm2015/lib/enum/result-type.enum.js +0 -21
  88. package/esm2015/lib/enum/scene-event.enum.js +0 -12
  89. package/esm2015/lib/enum/shadow-map-type.enum.js +0 -8
  90. package/esm2015/lib/enum/texture-type.js +0 -9
  91. package/esm2015/lib/enum/tone-mapping-local.enum.js +0 -12
  92. package/esm2015/lib/enum/view-mode.enum.js +0 -7
  93. package/esm2015/lib/enum/xr-mode.enum.js +0 -6
  94. package/esm2015/lib/environments/environment.js +0 -8
  95. package/esm2015/lib/interfaces/aa-options.interface.js +0 -2
  96. package/esm2015/lib/interfaces/adjustable-element.interface.js +0 -2
  97. package/esm2015/lib/interfaces/ao-options.interface.js +0 -2
  98. package/esm2015/lib/interfaces/changes.interface.js +0 -2
  99. package/esm2015/lib/interfaces/configuration-data.interface.js +0 -2
  100. package/esm2015/lib/interfaces/light-preset.interface.js +0 -2
  101. package/esm2015/lib/interfaces/post-processing-setting.interface.js +0 -2
  102. package/esm2015/lib/interfaces/scene-option-button.interface.js +0 -6
  103. package/esm2015/lib/interfaces/screen-size-info.js +0 -2
  104. package/esm2015/lib/interfaces/setting.interface.js +0 -2
  105. package/esm2015/lib/interfaces/texture.interface.js +0 -2
  106. package/esm2015/lib/interfaces/vignette-options.interface.js +0 -2
  107. package/esm2015/lib/model/ar-position-indicator.js +0 -18
  108. package/esm2015/lib/model/camera-settings.js +0 -14
  109. package/esm2015/lib/model/configuration-result-object.js +0 -6
  110. package/esm2015/lib/model/configurator-error-message.js +0 -9
  111. package/esm2015/lib/model/configurator-settings.js +0 -25
  112. package/esm2015/lib/model/custom-button.js +0 -16
  113. package/esm2015/lib/model/factory.js +0 -28
  114. package/esm2015/lib/model/icon.js +0 -112
  115. package/esm2015/lib/model/intersected-objects.js +0 -7
  116. package/esm2015/lib/model/light-preset.js +0 -73
  117. package/esm2015/lib/model/light-properties.js +0 -45
  118. package/esm2015/lib/model/material.js +0 -11
  119. package/esm2015/lib/model/metadata.js +0 -2
  120. package/esm2015/lib/model/render-parameters.js +0 -16
  121. package/esm2015/lib/model/setting-options.js +0 -71
  122. package/esm2015/lib/model/settings.js +0 -16
  123. package/esm2015/lib/model/shadow-properties.js +0 -10
  124. package/esm2015/lib/model/skin.js +0 -3
  125. package/esm2015/lib/model/texture.js +0 -76
  126. package/esm2015/lib/model/variation-settings.js +0 -54
  127. package/esm2015/lib/model/variation.js +0 -3
  128. package/esm2015/lib/model/xr-reticle.js +0 -79
  129. package/esm2015/lib/modules/render/enum/scene-type.enum.js +0 -6
  130. package/esm2015/lib/modules/render/model/ar-parameters.js +0 -12
  131. package/esm2015/lib/modules/render/model/scene-setting.js +0 -6
  132. package/esm2015/lib/modules/render/model/scene-settings.js +0 -3
  133. package/esm2015/lib/pipes/append.pipe.js +0 -21
  134. package/esm2015/lib/pipes/google-translate.pipe.js +0 -21
  135. package/esm2015/lib/pipes/localize.pipe.js +0 -28
  136. package/esm2015/lib/pipes/pipes.module.js +0 -41
  137. package/esm2015/lib/pipes/prepend.pipe.js +0 -21
  138. package/esm2015/lib/pipes/strip-html.pipe.js +0 -17
  139. package/esm2015/lib/services/app-event.service.js +0 -36
  140. package/esm2015/lib/services/app-initializer.service.js +0 -27
  141. package/esm2015/lib/services/ar.service.js +0 -844
  142. package/esm2015/lib/services/build-furniture-base.service.js +0 -1181
  143. package/esm2015/lib/services/build-furniture-without-scene.service.js +0 -86
  144. package/esm2015/lib/services/build-furniture.service.js +0 -169
  145. package/esm2015/lib/services/bundle-initialzer.service.js +0 -113
  146. package/esm2015/lib/services/camera.service.js +0 -123
  147. package/esm2015/lib/services/configuration.service.js +0 -79
  148. package/esm2015/lib/services/configurator-connector.service.js +0 -830
  149. package/esm2015/lib/services/configurator.service.js +0 -285
  150. package/esm2015/lib/services/configuring.service.js +0 -119
  151. package/esm2015/lib/services/controls.js +0 -799
  152. package/esm2015/lib/services/debug.service.js +0 -43
  153. package/esm2015/lib/services/dictionary.service.js +0 -65
  154. package/esm2015/lib/services/dynamic-camera.service.js +0 -96
  155. package/esm2015/lib/services/floor-plane.service.js +0 -252
  156. package/esm2015/lib/services/font.service.js +0 -27
  157. package/esm2015/lib/services/google-translate.service.js +0 -79
  158. package/esm2015/lib/services/icon-cache.service.js +0 -44
  159. package/esm2015/lib/services/intersection.service.js +0 -47
  160. package/esm2015/lib/services/item.service.js +0 -75
  161. package/esm2015/lib/services/json-utils.service.js +0 -48
  162. package/esm2015/lib/services/light-creation.service.js +0 -35
  163. package/esm2015/lib/services/light-presets.service.js +0 -157
  164. package/esm2015/lib/services/lights.service.js +0 -146
  165. package/esm2015/lib/services/load-furniture-base.service.js +0 -164
  166. package/esm2015/lib/services/load-furniture-without-scene.service.js +0 -45
  167. package/esm2015/lib/services/load-furniture.service.js +0 -72
  168. package/esm2015/lib/services/loader.service.js +0 -32
  169. package/esm2015/lib/services/locator.service.js +0 -11
  170. package/esm2015/lib/services/message-board.service.js +0 -50
  171. package/esm2015/lib/services/post-processing.service.js +0 -378
  172. package/esm2015/lib/services/product-configurator.service.js +0 -16
  173. package/esm2015/lib/services/progress.service.js +0 -20
  174. package/esm2015/lib/services/scene-event.service.js +0 -246
  175. package/esm2015/lib/services/scene-options.service.js +0 -24
  176. package/esm2015/lib/services/scene.service.js +0 -313
  177. package/esm2015/lib/services/screen-size-analysis.service.js +0 -97
  178. package/esm2015/lib/services/settings.service.js +0 -142
  179. package/esm2015/lib/services/switch-build-furniture.service.js +0 -37
  180. package/esm2015/lib/services/switch-load-furniture.service.js +0 -35
  181. package/esm2015/lib/services/threedselector.service.js +0 -72
  182. package/esm2015/lib/services/utils.service.js +0 -207
  183. package/esm2015/lib/services/variation-cache.service.js +0 -143
  184. package/esm2015/lib/services/variation.service.js +0 -490
  185. package/esm2015/lib/services/view-mode.service.js +0 -37
  186. package/esm2015/lib/services/vr.service.js +0 -191
  187. package/esm2015/lib/services/xr.service.js +0 -294
  188. package/esm2015/lib/utils/asset.utils.js +0 -120
  189. package/esm2015/lib/utils/base-utils.js +0 -9
  190. package/esm2015/lib/utils/color.utils.js +0 -30
  191. package/esm2015/lib/utils/debug.utils.js +0 -9
  192. package/esm2015/lib/utils/device.utils.js +0 -25
  193. package/esm2015/lib/utils/file.utils.js +0 -167
  194. package/esm2015/lib/utils/image.utils.js +0 -61
  195. package/esm2015/lib/utils/json-parser.utils.js +0 -180
  196. package/esm2015/lib/utils/material.utils.js +0 -433
  197. package/esm2015/lib/utils/object.utils.js +0 -360
  198. package/esm2015/lib/utils/relative-position.utils.js +0 -75
  199. package/esm2015/lib/utils/rotation-helper.utils.js +0 -15
  200. package/esm2015/lib/utils/scene-3d.utils.js +0 -213
  201. package/esm2015/lib/utils/scene-utils.js +0 -191
  202. package/esm2015/lib/utils/text-utils.js +0 -68
  203. package/esm2015/lib/utils/threed.utils.js +0 -281
  204. package/esm2015/lib/utils/variation-utils.js +0 -459
  205. package/esm2015/public-api.js +0 -65
  206. package/fesm2015/colijnit-configurator.js.map +0 -1
  207. package/lib/builder.d.ts +0 -83
  208. package/lib/components/answer-card/answer-card.component.d.ts +0 -58
  209. package/lib/components/answer-card/answer-card.module.d.ts +0 -11
  210. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +0 -38
  211. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +0 -10
  212. package/lib/components/answers-slideout/answers-slideout.component.d.ts +0 -86
  213. package/lib/components/answers-slideout/answers-slideout.module.d.ts +0 -16
  214. package/lib/components/color-filter/color-filter.component.d.ts +0 -20
  215. package/lib/components/color-filter/color-filter.module.d.ts +0 -8
  216. package/lib/components/configurator/configurator.component.d.ts +0 -37
  217. package/lib/components/configurator/configurator.module.d.ts +0 -12
  218. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +0 -30
  219. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +0 -13
  220. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +0 -16
  221. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +0 -26
  222. package/lib/components/configurator-loader/configurator-loader.component.d.ts +0 -7
  223. package/lib/components/configurator-loader/configurator-loader.module.d.ts +0 -9
  224. package/lib/components/configurator-scene/configurator-scene.component.d.ts +0 -24
  225. package/lib/components/configurator-scene/configurator-scene.module.d.ts +0 -7
  226. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +0 -7
  227. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +0 -8
  228. package/lib/components/element-buttons/element-buttons.component.d.ts +0 -32
  229. package/lib/components/element-buttons/element-buttons.module.d.ts +0 -9
  230. package/lib/components/element-toolbar/element-toolbar.component.d.ts +0 -27
  231. package/lib/components/element-toolbar/element-toolbar.module.d.ts +0 -10
  232. package/lib/components/image-zoom/image-zoom.component.d.ts +0 -15
  233. package/lib/components/image-zoom/image-zoom.module.d.ts +0 -9
  234. package/lib/components/lite-selector/lite-selector.component.d.ts +0 -40
  235. package/lib/components/lite-selector/lite-selector.module.d.ts +0 -10
  236. package/lib/components/product-configurator/product-configurator.component.d.ts +0 -50
  237. package/lib/components/product-configurator/product-configurator.module.d.ts +0 -15
  238. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +0 -35
  239. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +0 -11
  240. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +0 -31
  241. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +0 -13
  242. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +0 -20
  243. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +0 -10
  244. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +0 -20
  245. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +0 -10
  246. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +0 -21
  247. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +0 -10
  248. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +0 -21
  249. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +0 -10
  250. package/lib/components/progress-bar/progress-bar.component.d.ts +0 -10
  251. package/lib/components/progress-bar/progress-bar.module.d.ts +0 -8
  252. package/lib/components/scene-options/scene-options.component.d.ts +0 -24
  253. package/lib/components/scene-options/scene-options.module.d.ts +0 -11
  254. package/lib/components/selections-summary/selections-summary.component.d.ts +0 -38
  255. package/lib/components/selections-summary/selections-summary.module.d.ts +0 -12
  256. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +0 -27
  257. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +0 -10
  258. package/lib/components/slideout/slideout.component.d.ts +0 -22
  259. package/lib/components/slideout/slideout.module.d.ts +0 -7
  260. package/lib/components/summary-line/summary-line.component.d.ts +0 -50
  261. package/lib/components/summary-line/summary-line.module.d.ts +0 -11
  262. package/lib/components/tag-filter/tag-filter.component.d.ts +0 -9
  263. package/lib/components/tag-filter/tag-filter.module.d.ts +0 -7
  264. package/lib/components/threedselector/threedselector.component.d.ts +0 -38
  265. package/lib/components/threedselector/threedselector.module.d.ts +0 -10
  266. package/lib/core/helper/variation-helper.d.ts +0 -25
  267. package/lib/core/shader/floor-fade.shader.d.ts +0 -5
  268. package/lib/core/textures/depth-data-texture.d.ts +0 -5
  269. package/lib/directives/directives.module.d.ts +0 -8
  270. package/lib/directives/visibility-observer-master.directive.d.ts +0 -12
  271. package/lib/directives/visibility-observer.directive.d.ts +0 -16
  272. package/lib/enum/ar-feature.enum.d.ts +0 -12
  273. package/lib/enum/configuration-key.enum.d.ts +0 -39
  274. package/lib/enum/configuration-template.enum.d.ts +0 -4
  275. package/lib/enum/device-size-type.d.ts +0 -5
  276. package/lib/enum/device-tier.enum.d.ts +0 -5
  277. package/lib/enum/icon.enum.d.ts +0 -111
  278. package/lib/enum/item-type.enum.d.ts +0 -21
  279. package/lib/enum/light.enum.d.ts +0 -7
  280. package/lib/enum/navigator-type.enum.d.ts +0 -4
  281. package/lib/enum/output-encoding.enum.d.ts +0 -7
  282. package/lib/enum/result-type.enum.d.ts +0 -19
  283. package/lib/enum/scene-event.enum.d.ts +0 -10
  284. package/lib/enum/shadow-map-type.enum.d.ts +0 -6
  285. package/lib/enum/texture-type.d.ts +0 -7
  286. package/lib/enum/tone-mapping-local.enum.d.ts +0 -10
  287. package/lib/enum/view-mode.enum.d.ts +0 -5
  288. package/lib/enum/xr-mode.enum.d.ts +0 -4
  289. package/lib/environments/environment.d.ts +0 -4
  290. package/lib/interfaces/aa-options.interface.d.ts +0 -4
  291. package/lib/interfaces/adjustable-element.interface.d.ts +0 -5
  292. package/lib/interfaces/ao-options.interface.d.ts +0 -18
  293. package/lib/interfaces/changes.interface.d.ts +0 -9
  294. package/lib/interfaces/configuration-data.interface.d.ts +0 -40
  295. package/lib/interfaces/light-preset.interface.d.ts +0 -22
  296. package/lib/interfaces/post-processing-setting.interface.d.ts +0 -11
  297. package/lib/interfaces/scene-option-button.interface.d.ts +0 -19
  298. package/lib/interfaces/screen-size-info.d.ts +0 -10
  299. package/lib/interfaces/setting.interface.d.ts +0 -8
  300. package/lib/interfaces/texture.interface.d.ts +0 -44
  301. package/lib/interfaces/vignette-options.interface.d.ts +0 -4
  302. package/lib/model/ar-position-indicator.d.ts +0 -4
  303. package/lib/model/camera-settings.d.ts +0 -12
  304. package/lib/model/configuration-result-object.d.ts +0 -30
  305. package/lib/model/configurator-error-message.d.ts +0 -8
  306. package/lib/model/configurator-settings.d.ts +0 -62
  307. package/lib/model/custom-button.d.ts +0 -10
  308. package/lib/model/factory.d.ts +0 -5
  309. package/lib/model/icon.d.ts +0 -4
  310. package/lib/model/intersected-objects.d.ts +0 -6
  311. package/lib/model/light-preset.d.ts +0 -33
  312. package/lib/model/light-properties.d.ts +0 -25
  313. package/lib/model/material.d.ts +0 -41
  314. package/lib/model/metadata.d.ts +0 -78
  315. package/lib/model/render-parameters.d.ts +0 -12
  316. package/lib/model/setting-options.d.ts +0 -67
  317. package/lib/model/settings.d.ts +0 -10
  318. package/lib/model/shadow-properties.d.ts +0 -7
  319. package/lib/model/skin.d.ts +0 -15
  320. package/lib/model/texture.d.ts +0 -52
  321. package/lib/model/variation-settings.d.ts +0 -55
  322. package/lib/model/variation.d.ts +0 -11
  323. package/lib/model/xr-reticle.d.ts +0 -17
  324. package/lib/modules/render/enum/scene-type.enum.d.ts +0 -4
  325. package/lib/modules/render/model/ar-parameters.d.ts +0 -9
  326. package/lib/modules/render/model/scene-setting.d.ts +0 -13
  327. package/lib/modules/render/model/scene-settings.d.ts +0 -4
  328. package/lib/pipes/append.pipe.d.ts +0 -7
  329. package/lib/pipes/google-translate.pipe.d.ts +0 -11
  330. package/lib/pipes/localize.pipe.d.ts +0 -10
  331. package/lib/pipes/pipes.module.d.ts +0 -11
  332. package/lib/pipes/prepend.pipe.d.ts +0 -7
  333. package/lib/pipes/strip-html.pipe.d.ts +0 -7
  334. package/lib/services/app-event.service.d.ts +0 -32
  335. package/lib/services/app-initializer.service.d.ts +0 -14
  336. package/lib/services/ar.service.d.ts +0 -120
  337. package/lib/services/build-furniture-base.service.d.ts +0 -117
  338. package/lib/services/build-furniture-without-scene.service.d.ts +0 -14
  339. package/lib/services/build-furniture.service.d.ts +0 -14
  340. package/lib/services/bundle-initialzer.service.d.ts +0 -45
  341. package/lib/services/camera.service.d.ts +0 -44
  342. package/lib/services/configuration.service.d.ts +0 -18
  343. package/lib/services/configurator-connector.service.d.ts +0 -140
  344. package/lib/services/configurator.service.d.ts +0 -62
  345. package/lib/services/configuring.service.d.ts +0 -46
  346. package/lib/services/controls.d.ts +0 -11
  347. package/lib/services/debug.service.d.ts +0 -16
  348. package/lib/services/dictionary.service.d.ts +0 -15
  349. package/lib/services/dynamic-camera.service.d.ts +0 -21
  350. package/lib/services/floor-plane.service.d.ts +0 -47
  351. package/lib/services/font.service.d.ts +0 -10
  352. package/lib/services/google-translate.service.d.ts +0 -26
  353. package/lib/services/icon-cache.service.d.ts +0 -21
  354. package/lib/services/intersection.service.d.ts +0 -11
  355. package/lib/services/item.service.d.ts +0 -18
  356. package/lib/services/json-utils.service.d.ts +0 -7
  357. package/lib/services/light-creation.service.d.ts +0 -9
  358. package/lib/services/light-presets.service.d.ts +0 -34
  359. package/lib/services/lights.service.d.ts +0 -34
  360. package/lib/services/load-furniture-base.service.d.ts +0 -37
  361. package/lib/services/load-furniture-without-scene.service.d.ts +0 -9
  362. package/lib/services/load-furniture.service.d.ts +0 -9
  363. package/lib/services/loader.service.d.ts +0 -11
  364. package/lib/services/locator.service.d.ts +0 -7
  365. package/lib/services/message-board.service.d.ts +0 -18
  366. package/lib/services/post-processing.service.d.ts +0 -74
  367. package/lib/services/product-configurator.service.d.ts +0 -11
  368. package/lib/services/progress.service.d.ts +0 -9
  369. package/lib/services/scene-event.service.d.ts +0 -72
  370. package/lib/services/scene-options.service.d.ts +0 -11
  371. package/lib/services/scene.service.d.ts +0 -71
  372. package/lib/services/screen-size-analysis.service.d.ts +0 -32
  373. package/lib/services/settings.service.d.ts +0 -24
  374. package/lib/services/switch-build-furniture.service.d.ts +0 -21
  375. package/lib/services/switch-load-furniture.service.d.ts +0 -21
  376. package/lib/services/threedselector.service.d.ts +0 -17
  377. package/lib/services/utils.service.d.ts +0 -24
  378. package/lib/services/variation-cache.service.d.ts +0 -23
  379. package/lib/services/variation.service.d.ts +0 -26
  380. package/lib/services/view-mode.service.d.ts +0 -17
  381. package/lib/services/vr.service.d.ts +0 -42
  382. package/lib/services/xr.service.d.ts +0 -56
  383. package/lib/utils/asset.utils.d.ts +0 -19
  384. package/lib/utils/base-utils.d.ts +0 -4
  385. package/lib/utils/color.utils.d.ts +0 -8
  386. package/lib/utils/debug.utils.d.ts +0 -3
  387. package/lib/utils/device.utils.d.ts +0 -7
  388. package/lib/utils/file.utils.d.ts +0 -30
  389. package/lib/utils/image.utils.d.ts +0 -9
  390. package/lib/utils/json-parser.utils.d.ts +0 -9
  391. package/lib/utils/material.utils.d.ts +0 -34
  392. package/lib/utils/object.utils.d.ts +0 -32
  393. package/lib/utils/relative-position.utils.d.ts +0 -12
  394. package/lib/utils/rotation-helper.utils.d.ts +0 -6
  395. package/lib/utils/scene-3d.utils.d.ts +0 -8
  396. package/lib/utils/scene-utils.d.ts +0 -7
  397. package/lib/utils/text-utils.d.ts +0 -4
  398. package/lib/utils/threed.utils.d.ts +0 -20
  399. package/lib/utils/variation-utils.d.ts +0 -18
  400. package/public-api.d.ts +0 -60
  401. /package/lib/style/{template_variables.scss → _variables.scss} +0 -0
@@ -1,795 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import * as THREE from 'three';
3
- import { BehaviorSubject } from 'rxjs';
4
- import { Injectable } from '@angular/core';
5
- import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
6
- import { Selection } from '@colijnit/configuratorapi/build/model/selection';
7
- import { DecoNodeType } from '@colijnit/configuratorapi/build/enum/deco-node-type.enum';
8
- import { DecoNodeKind } from '@colijnit/configuratorapi/build/enum/deco-node-kind.enum';
9
- import { Article } from '@colijnit/configuratorapi/build/model/article';
10
- import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
11
- import { BusinessObjectFactory } from '@colijnit/ioneconnector/build/service/business-object-factory';
12
- import { ThreedUtils } from './utils/threed.utils';
13
- import { VariationHelper } from './core/helper/variation-helper';
14
- import { SwitchBuildFurnitureService } from './services/switch-build-furniture.service';
15
- import { SwitchLoadFurnitureService } from './services/switch-load-furniture.service';
16
- import { ConfiguratorService } from './services/configurator.service';
17
- import { ConfiguratorConnectorService } from './services/configurator-connector.service';
18
- import { ConfigurationResultObject } from './model/configuration-result-object';
19
- import { ImageUtils } from './utils/image.utils';
20
- import { SceneUtils } from './utils/scene-utils';
21
- import { ObjectUtils } from './utils/object.utils';
22
- import { ServiceLocator } from './services/locator.service';
23
- import * as i0 from "@angular/core";
24
- export class Builder {
25
- constructor() {
26
- this.selectionsReceived = new BehaviorSubject([]);
27
- this.articleLoaded = new BehaviorSubject(undefined);
28
- this.decosReceived = new BehaviorSubject([]);
29
- this.answersReceived = new BehaviorSubject([]);
30
- this.modelLoaded = new BehaviorSubject(null);
31
- this._selections = [];
32
- this._answers = [];
33
- this._decos = [];
34
- this._placedAdjustables = [];
35
- this._placedAddables = [];
36
- this._adjustables = [];
37
- this._addables = [];
38
- this._imageCache = new Map();
39
- this._articleCache = new Map();
40
- this._configuratorService = ServiceLocator.injector.get(ConfiguratorService);
41
- this._buildFurnitureService = ServiceLocator.injector.get(SwitchBuildFurnitureService);
42
- this._loadFurnitureService = ServiceLocator.injector.get(SwitchLoadFurnitureService);
43
- this._configuratorConnectorService = ServiceLocator.injector.get(ConfiguratorConnectorService);
44
- }
45
- set debug(value) {
46
- if (value) {
47
- this._debug = value;
48
- if (this._variationHelper) {
49
- this._variationHelper.debug = this._debug;
50
- }
51
- }
52
- }
53
- get debug() {
54
- return this._debug;
55
- }
56
- initNewBuild(scene, options, sku, instanceId, goodId) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- if (options) {
59
- yield this._configuratorService.initConnector(options, true);
60
- }
61
- this._buildFurnitureService.currentActiveService.scene = scene;
62
- if (sku) {
63
- try {
64
- const furnitureData = new ConfigurationResultObject();
65
- furnitureData.sku = sku;
66
- furnitureData.instanceId = instanceId;
67
- const resultObject = yield this._loadFurnitureService.currentActiveService.loadFurniture(furnitureData, false, true, false, false, false, false);
68
- return resultObject.object;
69
- }
70
- catch (error) {
71
- console.error('Error loading furniture configuration:', error);
72
- }
73
- }
74
- });
75
- }
76
- buildWithData(options, selections, decos, assetUrl, cdnUrl, schema) {
77
- return __awaiter(this, void 0, void 0, function* () {
78
- return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
79
- if (!this._scene) {
80
- reject('no scene provided!');
81
- }
82
- try {
83
- this._log('start build', true);
84
- yield this._downloadAsset(assetUrl, cdnUrl, schema, selections && selections.length > 1 && decos && decos.length > 0);
85
- try {
86
- if (this._source) {
87
- try {
88
- if (selections && selections.length > 1 && decos && decos.length > 0) {
89
- this._reset();
90
- // Set the scene.
91
- this._buildFurnitureService.currentActiveService.scene = this._scene;
92
- const result = new ConfigurationResultObject();
93
- this._configuratorConnectorService.selections = selections;
94
- this._configuratorConnectorService.decoNodes = decos;
95
- // this._linkSelectionsAndDecos();
96
- this._buildFurnitureService.currentActiveService.linkSelectionsAndDecos();
97
- // this._prepareTheSelections();
98
- this._buildFurnitureService.currentActiveService.prepareTheSelections();
99
- // this._preloadMaterials();
100
- this._buildFurnitureService.currentActiveService.preloadMaterials(options.schema);
101
- // const build = await this._build();
102
- const build = yield this._buildFurnitureService.currentActiveService.build(result);
103
- resolve(build.object);
104
- }
105
- else {
106
- resolve(this._source); // just return the source for simplicity
107
- }
108
- }
109
- catch (e) {
110
- reject(e.message);
111
- }
112
- {
113
- }
114
- }
115
- else {
116
- if (assetUrl) {
117
- reject(`Error downloading source: ${assetUrl}`);
118
- }
119
- else {
120
- reject('No 3D source provided!');
121
- }
122
- }
123
- }
124
- finally {
125
- this._cleanUp();
126
- this._log('finish build', true);
127
- }
128
- }
129
- catch (e) {
130
- reject(e);
131
- }
132
- }));
133
- });
134
- }
135
- init(scene, options) {
136
- this._boFactory = new BusinessObjectFactory();
137
- this._threedUtils = new ThreedUtils();
138
- this._variationHelper = new VariationHelper();
139
- this._variationHelper.debug = this._debug;
140
- if (!scene) {
141
- throw 'No scene object provided!';
142
- }
143
- this._configuratorService = new ConfiguratorService();
144
- // this._imageCacheService = new ImageCacheService();
145
- if (options) {
146
- this._configuratorService.initApi(options);
147
- }
148
- this._scene = scene;
149
- }
150
- buildModel(sku, instanceId, goodId) {
151
- return __awaiter(this, void 0, void 0, function* () {
152
- if (!this._scene) {
153
- return;
154
- }
155
- try {
156
- yield this._setInstanceId(sku, instanceId, goodId);
157
- yield this._prepareConfiguration(this._sku, this._goodId);
158
- if (this._source) {
159
- yield this._configuratorService.setInstanceToConfigure(this._instanceId);
160
- const promises = [];
161
- this._reset();
162
- promises.push(this.getQuestionAndAnswers());
163
- promises.push(this._getSelections(this._instanceId));
164
- promises.push(this._getDecos());
165
- yield Promise.all(promises);
166
- if (this._answers.length > 0) {
167
- return;
168
- }
169
- this._linkSelectionsAndDecos();
170
- this._prepareTheSelections();
171
- this._preloadMaterials();
172
- const build = yield this._build();
173
- return build;
174
- }
175
- else {
176
- throw 'GLB source not found!';
177
- }
178
- }
179
- catch (e) {
180
- throw e;
181
- }
182
- });
183
- }
184
- buildModelFromData(selections, decos, assetUrl, cdnUrl, schema) {
185
- return __awaiter(this, void 0, void 0, function* () {
186
- return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
187
- if (!this._scene) {
188
- reject('no scene provided!');
189
- }
190
- try {
191
- this._log('start build', true);
192
- yield this._downloadAsset(assetUrl, cdnUrl, schema, selections && selections.length > 1 && decos && decos.length > 0);
193
- try {
194
- if (this._source) {
195
- try {
196
- if (selections && selections.length > 1 && decos && decos.length > 0) {
197
- this._reset();
198
- this._selections = selections;
199
- this._decos = decos;
200
- this._linkSelectionsAndDecos();
201
- this._prepareTheSelections();
202
- this._preloadMaterials();
203
- const build = yield this._build();
204
- resolve(build);
205
- }
206
- else {
207
- resolve(this._source); // just return the source for simplicity
208
- }
209
- }
210
- catch (e) {
211
- reject(e.message);
212
- }
213
- {
214
- }
215
- }
216
- else {
217
- if (assetUrl) {
218
- reject(`Error downloading source: ${assetUrl}`);
219
- }
220
- else {
221
- reject('No 3D source provided!');
222
- }
223
- }
224
- }
225
- finally {
226
- this._cleanUp();
227
- this._log('finish build', true);
228
- }
229
- }
230
- catch (e) {
231
- reject(e);
232
- }
233
- }));
234
- });
235
- }
236
- initNodeInstance(goodId) {
237
- return this._configuratorService.initNodeInstance(goodId, false);
238
- }
239
- destroy() {
240
- this._threedUtils.clearCache();
241
- this._variationHelper.clearCache();
242
- }
243
- selectSelection(selection) {
244
- return __awaiter(this, void 0, void 0, function* () {
245
- yield this._configuratorService.selectSelection(selection, false);
246
- yield this.getQuestionAndAnswers();
247
- });
248
- }
249
- getQuestionAndAnswers(publicationCode) {
250
- return __awaiter(this, void 0, void 0, function* () {
251
- const questionsAndAnswers = yield this._configuratorService.getQuestionAndAnswers(false, publicationCode);
252
- this._answers = questionsAndAnswers && questionsAndAnswers.answers ? questionsAndAnswers.answers : [];
253
- this.answersReceived.next(this._answers);
254
- });
255
- }
256
- selectAnswer(answer) {
257
- return __awaiter(this, void 0, void 0, function* () {
258
- yield this._configuratorService.selectAnswer(answer, false);
259
- yield this.getQuestionAndAnswers();
260
- if (this._answers && this._answers.length === 0) {
261
- this._build();
262
- }
263
- });
264
- }
265
- getImageForSelectionOrAnswer(object) {
266
- const includeMimeType = true, thumb = true;
267
- return new Promise((resolve, reject) => {
268
- if (object && object.nodeId) {
269
- if (!this._imageCache.has(object.nodeId)) {
270
- return this._configuratorService.getSingleImage(object.nodeId, 4, includeMimeType, thumb, true)
271
- .then((responseData) => {
272
- const base64 = this._handleResponseData(includeMimeType, thumb, responseData);
273
- this._imageCache.set(object.nodeId, base64);
274
- resolve(base64);
275
- }).catch(() => {
276
- reject();
277
- });
278
- }
279
- else {
280
- resolve(this._imageCache.get(object.nodeId));
281
- }
282
- }
283
- else {
284
- reject();
285
- }
286
- });
287
- }
288
- _cleanUp() {
289
- this._sku = undefined;
290
- this._goodId = undefined;
291
- this._instanceId = undefined;
292
- this._variationHelper.clearCache();
293
- }
294
- _handleResponseData(includeMimetype, thumb, responseData) {
295
- if (responseData && responseData.resultObject) {
296
- if (responseData.resultObject.filePath !== null && responseData.resultObject.filePath !== '') {
297
- return ImageUtils.getFixedImageFilepathUrl(responseData.resultObject.filePath);
298
- }
299
- else {
300
- if (includeMimetype) {
301
- return ImageUtils.getDocBodyWithMimeTypeDefinition(responseData.resultObject.fileName, thumb ? responseData.resultObject.thumbnailBody : responseData.resultObject.documentBody);
302
- }
303
- else {
304
- return thumb ? responseData.resultObject.thumbnailBody : responseData.resultObject.documentBody;
305
- }
306
- }
307
- }
308
- else {
309
- return '';
310
- }
311
- }
312
- _preloadMaterials() {
313
- if (this._decos && this._decos.length) {
314
- const materials = [...new Set(this._decos
315
- .filter(d => (d.gameObjectName || d.materialUrl) && d.type === DecoNodeType.Variation)
316
- .map(d => d))];
317
- this._variationHelper.preloadVariations(materials);
318
- }
319
- }
320
- _setInstanceId(sku, instanceId, goodId) {
321
- return __awaiter(this, void 0, void 0, function* () {
322
- if (!instanceId && !this._instanceId) {
323
- if (!goodId) {
324
- goodId = yield this._getGoodIdFromSku(sku);
325
- }
326
- this._goodId = goodId;
327
- const result = yield this.initNodeInstance(this._goodId);
328
- if (result && result.resultObject) {
329
- this._instanceId = result.resultObject;
330
- }
331
- else {
332
- throw 'Failed to initialize node instance';
333
- }
334
- }
335
- else if (!this._instanceId) {
336
- this._instanceId = instanceId;
337
- }
338
- if (!this._sku) {
339
- this._sku = sku;
340
- }
341
- });
342
- }
343
- _prepareConfiguration(sku, goodId) {
344
- return __awaiter(this, void 0, void 0, function* () {
345
- const article = yield this._getArticle(sku, goodId);
346
- if (article && article.assetUrl) {
347
- if (article.contentDeliveryUrl) {
348
- this._variationHelper.assetPath =
349
- article.contentDeliveryUrl +
350
- (article.contentDeliveryUrl.endsWith('/') ? '' : '/') +
351
- (article.distSchema ? article.distSchema : 'UP_DBA');
352
- }
353
- yield this._downloadAsset(article.assetUrl, article.contentDeliveryUrl, article.distSchema);
354
- }
355
- });
356
- }
357
- _downloadAsset(assetUrl, cdnUrl, schema, setVisibleFalse = true) {
358
- return __awaiter(this, void 0, void 0, function* () {
359
- this._source = yield this._threedUtils.download3DSource(assetUrl, setVisibleFalse)
360
- .catch((error) => {
361
- throw error;
362
- });
363
- if (cdnUrl) {
364
- this._variationHelper.assetPath =
365
- cdnUrl +
366
- (cdnUrl.endsWith('/') ? '' : '/') +
367
- (schema ? schema : 'UP_DBA');
368
- }
369
- });
370
- }
371
- _build() {
372
- return __awaiter(this, void 0, void 0, function* () {
373
- const adjustables = this._getAdjustables();
374
- if (adjustables && adjustables.length === 0 && this._selections && this._selections.length > 0) { // check if article has a gameObject
375
- if (this._selections[0].nodeType === NodeType.Article && this._selections[0].gameObject) {
376
- adjustables.push(this._selections[0]);
377
- }
378
- }
379
- if (adjustables && adjustables.length > 0) {
380
- const obj = new THREE.Object3D();
381
- obj.visible = false; // no need to render visualy
382
- this._scene.add(obj);
383
- let connected = false;
384
- this._log('build main model');
385
- for (let i = 0, len = adjustables.length; i < len; i++) {
386
- const adjustable = this._createAdjustable(obj, adjustables[i]);
387
- if (adjustable) {
388
- for (let ii = this._placedAdjustables.length - 1; ii >= 0; ii--) {
389
- if (SceneUtils.TrySelectorConnection(this._scene, obj, this._placedAdjustables[ii], adjustable, i === 1)) {
390
- this._placedAdjustables[ii].visible = true;
391
- adjustable.visible = true;
392
- connected = true;
393
- break;
394
- }
395
- connected = false;
396
- }
397
- }
398
- if (!connected && this._placedAdjustables.length > 1) {
399
- console.warn('No connection found for: ', adjustable.name);
400
- }
401
- }
402
- this._log('place addables');
403
- this._placeAddables(obj);
404
- this._log('update pivot');
405
- this._updatePivot(obj);
406
- this._log('load variations');
407
- yield this._loadVariations(obj);
408
- // this._variationHelper.clearCache();
409
- this._log('remove from scene');
410
- this._scene.remove(obj);
411
- ObjectUtils.DisposeObject(this._source);
412
- // this._cleanUp();
413
- this._log('ready!');
414
- this.modelLoaded.next(obj);
415
- return obj;
416
- }
417
- else {
418
- throw 'No adjustables found!';
419
- // this._building = false;
420
- // if (this.selections.length < 2) {
421
- // this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
422
- // this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoSelections});
423
- // } else if (this.decos.size === 0) {
424
- // this._errorService.addError(this.activeInstance, {message: 'NO_SELECTIONS_OR_DECOS', description: 'NO_SELECTIONS_OR_DECOS_INFO'});
425
- // this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoDecoNodes});
426
- // } else {
427
- // this._errorService.addError(this.activeInstance, {message: 'NO_ADJUSTABLES', description: 'NO_ADJUSTABLES_INFO'});
428
- // this.buildFinished.next({instanceId: this.activeInstance, resultType: ResultType.NoAdjustables});
429
- // }
430
- }
431
- });
432
- }
433
- _prepareTheSelections() {
434
- if (!this._selections || !this._selections.length) {
435
- return;
436
- }
437
- const selections = this._selections.slice();
438
- const selectionOfArticle = selections.find(s => s.nodeType === NodeType.Article);
439
- const adjustableSelections = selections.filter(s => s.addAdjust === '2');
440
- const isArticleWithMaterial = adjustableSelections.length === 0 &&
441
- selectionOfArticle.gameObject &&
442
- selectionOfArticle.gameObject.length > 0;
443
- // get generic variations
444
- const globalVariations = this._selections
445
- .filter(s => (s.generic || adjustableSelections.length === 1) && s.decoNode.variation && !s.decoNode.type)
446
- .map((value, index, array) => {
447
- // find selection of variation
448
- const sel = this._selections.find(s => s.artNodeIdDeco === value.decoNode.variation.parentId);
449
- if (sel) {
450
- value.decoNode.variation.supplierArticleNr = sel.supplierArticleNr;
451
- }
452
- value.decoNode.variation.materialId = this._getMaterialIdFromParent(value.node);
453
- return value.decoNode.variation;
454
- });
455
- // commented out for the moment
456
- // globalVariations.forEach(g => {
457
- // const parentIdx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.parentId);
458
- // if (parentIdx) { // remove parent selection
459
- // selections.splice(parentIdx, 1);
460
- // }
461
- // const idx = selections.findIndex(s => s.decoNode && s.decoNode.id === g.id);
462
- // if (idx) { // move generic variations to top
463
- // const selection = selections[idx];
464
- // selections.splice(idx, 1);
465
- // selections.unshift(selection);
466
- // }
467
- // });
468
- // const usedVariations: FurniturePartVariation[] = [];
469
- let globalVariationsRewrite = true;
470
- const len = selections.length;
471
- let lastAdded;
472
- let lastAdjustable;
473
- let newPart = false;
474
- let previousPresLevel = -1;
475
- let positioning;
476
- let optionText;
477
- for (let i = 0; i < len; i++) {
478
- const selection = selections[i];
479
- if (selection.presentationLevel === 1) {
480
- positioning = selection.hdecoPositioning;
481
- optionText = selection.question;
482
- }
483
- if (selection.presentationLevel > previousPresLevel) {
484
- selection.hdecoPositioning = selection.hdecoPositioning || positioning;
485
- }
486
- if (selection.decoNode) {
487
- if (selection.decoNode.type === DecoNodeType.Variation) {
488
- const decoNode = selection.decoNode;
489
- decoNode.optionText = optionText;
490
- // find selection of variation and set materialId in case of multimaterial
491
- decoNode.materialId = this._getMaterialIdFromParent(decoNode.nodeId);
492
- if (lastAdded) {
493
- if (newPart) {
494
- if (decoNode.materialId) {
495
- lastAdded.variations.push(decoNode);
496
- }
497
- else {
498
- lastAdded.variations = [decoNode];
499
- }
500
- }
501
- else {
502
- lastAdded.variations.push(decoNode);
503
- }
504
- newPart = false;
505
- }
506
- else {
507
- if (globalVariationsRewrite) {
508
- globalVariations.length = 0;
509
- globalVariationsRewrite = false;
510
- }
511
- if (!globalVariations.find(v => v.id === decoNode.id)) {
512
- globalVariations.push(decoNode);
513
- }
514
- }
515
- // const variation: FurniturePartVariation = new FurniturePartVariation();
516
- // variation.BrandId = selection.decoNode.brandId;
517
- // variation.Description = selection.decoNode.gameObjectName;
518
- // variation.MaterialId = (selection.decoNode as any).materialId;
519
- // variation.SupplierArticleNr = (selection.decoNode as any).supplierArticleNr;
520
- // usedVariations.push(variation);
521
- }
522
- else if ((selection.decoNode.type === DecoNodeType.Part &&
523
- typeof selection.decoNode.gameObjectName === 'string' &&
524
- selection.decoNode.gameObjectName.length) || (isArticleWithMaterial)) {
525
- if (selection.decoNode.kind === DecoNodeKind.Adjustable || (isArticleWithMaterial)) {
526
- selection.variations = globalVariations;
527
- this._adjustables.push(selection);
528
- if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
529
- newPart = true;
530
- }
531
- lastAdded = selection;
532
- lastAdjustable = selection;
533
- }
534
- else if (selection.decoNode.kind === DecoNodeKind.Addable) {
535
- selection.variations = lastAdjustable ? lastAdjustable.variations : globalVariations;
536
- if (lastAdjustable) {
537
- lastAdjustable.addables.push(selection);
538
- }
539
- this._addables.push(selection);
540
- if (!lastAdded || (lastAdded.nodeId !== selection.nodeId || lastAdded.node !== selection.node)) {
541
- newPart = true;
542
- }
543
- lastAdded = selection;
544
- }
545
- }
546
- }
547
- previousPresLevel = selection.presentationLevel;
548
- }
549
- // this._upsertFurniture(this.activeInstance,
550
- // {Variations: usedVariations});
551
- }
552
- /**
553
- * Returns the materialId of the parent up the tree until presentionlevel 1 is reached
554
- * @param id
555
- * @private
556
- */
557
- _getMaterialIdFromParent(id) {
558
- if (this._selections) {
559
- const idx = this._selections.findIndex(s => s.node === id);
560
- let currentLevel = 999;
561
- if (idx > -1) {
562
- for (let i = idx; i > 0; i--) {
563
- const selection = this._selections[i];
564
- if (selection.presentationLevel >= currentLevel) {
565
- break;
566
- }
567
- currentLevel = selection.presentationLevel;
568
- if (selection.hdecoGameObject) {
569
- return selection.hdecoGameObject;
570
- }
571
- }
572
- }
573
- }
574
- return undefined;
575
- }
576
- _createAdjustable(parent, adj) {
577
- let obj = this._source ? this._source.getObjectByName(adj.decoNode.gameObjectName || adj.gameObject) : null;
578
- if (!obj) {
579
- // in case of glb files, the importer removes dots from names
580
- const name = adj.decoNode.gameObjectName.replace(/[.]/g, '');
581
- obj = this._source ? this._source.getObjectByName(name) : null;
582
- if (!obj) {
583
- console.warn(`No object with name ${adj.decoNode.gameObjectName} found!`);
584
- return null;
585
- }
586
- }
587
- let adjustable = obj.clone();
588
- adjustable.name = this._createUniqueName(parent, obj);
589
- adjustable.userData.selection = adj;
590
- adjustable.position.set(0, 0, 0);
591
- adjustable.traverse(c => {
592
- c.visible = !c.name.toLowerCase().startsWith('c_');
593
- });
594
- parent.add(adjustable);
595
- // the object being added to the customFloorGroup is being recreated so we loose the reference
596
- // therefor we need to retrieve the created object again
597
- adjustable = parent.getObjectByName(adjustable.name);
598
- this._placedAdjustables.push(adjustable);
599
- return adjustable;
600
- }
601
- _createAddable(parent, add, part2, part1) {
602
- const obj = this._source.getObjectByName(add.decoNode.gameObjectName);
603
- if (!obj) {
604
- return null;
605
- }
606
- // const selection: Selection = this._getSelectionFromId(adj.artNodeIdDeco);
607
- const addable = obj.clone();
608
- addable.name = this._createUniqueName(parent, obj);
609
- addable.userData.selection = add;
610
- addable.position.set(0, 0, 0);
611
- addable.visible = true;
612
- if (part1 && part2) {
613
- parent.add(addable);
614
- this._placedAddables.push(addable);
615
- return addable;
616
- }
617
- return addable;
618
- }
619
- _placeAddables(parent) {
620
- const len = this._placedAdjustables.length;
621
- for (let i = 0; i < len; i++) {
622
- if (this._placedAdjustables[i].userData.hasOwnProperty('selection') && this._placedAdjustables[i].userData.selection) {
623
- const adjustableSelection = this._placedAdjustables[i].userData.selection;
624
- if (adjustableSelection) {
625
- const lena = adjustableSelection.addables.length;
626
- let conAddable;
627
- for (let ia = 0; ia < lena; ia++) {
628
- SceneUtils.TrySelectorConnection(this._scene, parent, this._placedAdjustables[i], adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(parent, add, part2, part1));
629
- if (conAddable) {
630
- SceneUtils.TrySelectorConnection(this._scene, parent, conAddable, adjustableSelection.addables[ia], false, (add, part2, part1) => this._createAddable(parent, add, part2, part1));
631
- }
632
- conAddable = this._placedAddables[this._placedAddables.length - 1];
633
- }
634
- }
635
- }
636
- }
637
- }
638
- _createUniqueName(parent, obj) {
639
- let iteration = 0;
640
- let name = obj.name;
641
- let existingObj = parent.getObjectByName(name);
642
- while (existingObj) {
643
- iteration++;
644
- name = obj.name + (iteration !== 0 ? ('_' + iteration) : '');
645
- existingObj = parent.getObjectByName(name);
646
- }
647
- return name;
648
- }
649
- _getGoodIdFromSku(sku) {
650
- return __awaiter(this, void 0, void 0, function* () {
651
- const response = yield this._configuratorService.getGoodIdFromSku(sku, false);
652
- if (response && response.validationResult && response.validationResult.success && response.resultObject) {
653
- return response.resultObject;
654
- }
655
- });
656
- }
657
- _getArticle(sku, goodId) {
658
- return __awaiter(this, void 0, void 0, function* () {
659
- if (this._articleCache.has(sku)) {
660
- this.articleLoaded.next(this._articleCache.get(sku));
661
- return this._articleCache.get(sku);
662
- }
663
- if (!goodId) {
664
- goodId = yield this._getGoodIdFromSku(sku)
665
- .catch((error) => {
666
- throw `Article with sku ${sku} not found!`;
667
- });
668
- }
669
- let article;
670
- const articleResponse = yield this._configuratorService.getArticleQuickSel(goodId, false);
671
- if (articleResponse && articleResponse.validationResult && articleResponse.validationResult.success && articleResponse.resultObject) {
672
- if (articleResponse.resultObject.hasOwnProperty('oArticle')) {
673
- const obj = Array.isArray(articleResponse.resultObject['oArticle']) ? articleResponse.resultObject['oArticle'][0] : articleResponse.resultObject['oArticle'];
674
- article = this._boFactory.makeWithRawBackendData(Article, obj);
675
- }
676
- else {
677
- article = this._boFactory.makeWithRawBackendData(Article, articleResponse.resultObject);
678
- }
679
- }
680
- this._articleCache.set(sku, article);
681
- this.articleLoaded.next(article);
682
- return article;
683
- });
684
- }
685
- _getSelections(instanceId, publicationCode) {
686
- return __awaiter(this, void 0, void 0, function* () {
687
- this._selections = [];
688
- const selectionResponse = yield this._configuratorService.getSelections(false, publicationCode);
689
- if (selectionResponse && selectionResponse.resultObjects && selectionResponse.resultObjects.length > 0) {
690
- this._selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, selectionResponse.resultObjects);
691
- this._selections.forEach(s => s.instanceId = instanceId);
692
- // const filtered: Selection[] = this._selections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
693
- this.selectionsReceived.next(this._selections);
694
- }
695
- else {
696
- throw 'No selections found!';
697
- }
698
- });
699
- }
700
- _getDecos() {
701
- return __awaiter(this, void 0, void 0, function* () {
702
- this._decos = [];
703
- const decosResponse = yield this._configuratorService.getDecos(false);
704
- if (decosResponse && decosResponse.resultObjects && decosResponse.resultObjects.length > 0) {
705
- this._decos = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, decosResponse.resultObjects);
706
- this.decosReceived.next(this._decos);
707
- }
708
- else {
709
- throw 'No deconodes found!';
710
- }
711
- });
712
- }
713
- _linkSelectionsAndDecos() {
714
- if (!this._selections || !this._selections.length) {
715
- return;
716
- }
717
- const len = this._selections.length;
718
- for (let i = 0; i < len; i++) {
719
- // const id: string = this.selections[i].artNodeIdDeco;
720
- let deco = this._decos.find(d => d.nodeId === this._selections[i].node);
721
- if (!deco) {
722
- deco = new DecoNode();
723
- }
724
- if (deco.type !== DecoNodeType.Variation) {
725
- const variation = this._getVariations().find(v => v.parentId === this._selections[i].artNodeIdDeco);
726
- if (variation) {
727
- deco.variation = variation;
728
- }
729
- }
730
- this._selections[i].decoNode = deco;
731
- }
732
- }
733
- _getVariations() {
734
- if (this._decos && this._decos.length) {
735
- return this._decos.filter((deco) => {
736
- return deco.type === DecoNodeType.Variation;
737
- });
738
- }
739
- return [];
740
- }
741
- _loadVariations(obj) {
742
- return __awaiter(this, void 0, void 0, function* () {
743
- this._log('load variation for parts');
744
- yield this._variationHelper.loadPart(obj, this._adjustables, true);
745
- this._log('load variation for adjustables');
746
- yield this._variationHelper.loadVariation(obj, this._adjustables, true);
747
- this._log('load variation for addables');
748
- yield this._variationHelper.loadVariation(obj, this._addables, true);
749
- this._log('load variation clear cache');
750
- this._variationHelper.clearCache();
751
- this._log('load variations done');
752
- });
753
- }
754
- _getAdjustables() {
755
- if (!this._selections || !this._selections.length) {
756
- return [];
757
- }
758
- return this._selections.filter(s => {
759
- const node = s.decoNode;
760
- return node && node.gameObjectName && node.type === DecoNodeType.Part && node.kind === DecoNodeKind.Adjustable;
761
- });
762
- }
763
- _updatePivot(obj) {
764
- const boundingBox = new THREE.Box3().setFromObject(obj);
765
- const bbCenterPivot = new THREE.Vector3();
766
- boundingBox.getCenter(bbCenterPivot);
767
- const delta = new THREE.Vector3().sub(bbCenterPivot).setY(Math.abs(Math.min(boundingBox.min.y, 0)));
768
- obj.children.forEach((child) => {
769
- child.position.add(delta);
770
- });
771
- obj.updateWorldMatrix(false, true);
772
- }
773
- _reset() {
774
- this._placedAddables.length = 0;
775
- this._placedAdjustables.length = 0;
776
- this._adjustables.length = 0;
777
- this._addables.length = 0;
778
- // this._prepareTheSelections();
779
- }
780
- _log(message, force = false) {
781
- if (this.debug) {
782
- this.debug(message);
783
- console.log(new Date(), message);
784
- }
785
- }
786
- }
787
- Builder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
788
- Builder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, providedIn: 'root' });
789
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: Builder, decorators: [{
790
- type: Injectable,
791
- args: [{
792
- providedIn: 'root'
793
- }]
794
- }], ctorParameters: function () { return []; } });
795
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL2J1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDekUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBQzFFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwwREFBMEQsQ0FBQztBQUN0RixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMERBQTBELENBQUM7QUFDdEYsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBR3RFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxREFBcUQsQ0FBQztBQUM3RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwrREFBK0QsQ0FBQztBQUdwRyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQy9ELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3RGLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFB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O1FBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDMUIsZ0NBQWdDO0lBQ2xDLENBQUM7SUFFTyxJQUFJLENBQUMsT0FBZSxFQUFFLFFBQWlCLEtBQUs7UUFDbEQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDbEM7SUFDSCxDQUFDOztxR0ExeEJVLE9BQU87eUdBQVAsT0FBTyxjQUZOLE1BQU07NEZBRVAsT0FBTztrQkFIbkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7U2NlbmV9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0RlY29Ob2RlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2RlY28tbm9kZSc7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdGlvbic7XHJcbmltcG9ydCB7RGVjb05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7RGVjb05vZGVLaW5kfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vZGVjby1ub2RlLWtpbmQuZW51bSc7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlJztcclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuaW1wb3J0IHtRdWVzdGlvbkFuZEFuc3dlcnN9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvcXVlc3Rpb24tYW5kLWFuc3dlcnMnO1xyXG5pbXBvcnQge05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge0J1c2luZXNzT2JqZWN0RmFjdG9yeX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvc2VydmljZS9idXNpbmVzcy1vYmplY3QtZmFjdG9yeSc7XHJcbmltcG9ydCB7T3B0aW9uc30gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvb3B0aW9ucyc7XHJcbmltcG9ydCB7RGF0YVNlcnZpY2VSZXNwb25zZURhdGF9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL2RhdGEtc2VydmljZS1yZXNwb25zZS1kYXRhJztcclxuaW1wb3J0IHtUaHJlZWRVdGlsc30gZnJvbSAnLi91dGlscy90aHJlZWQudXRpbHMnO1xyXG5pbXBvcnQge1ZhcmlhdGlvbkhlbHBlcn0gZnJvbSAnLi9jb3JlL2hlbHBlci92YXJpYXRpb24taGVscGVyJztcclxuaW1wb3J0IHtTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvc3dpdGNoLWJ1aWxkLWZ1cm5pdHVyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtTd2l0Y2hMb2FkRnVybml0dXJlU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9zd2l0Y2gtbG9hZC1mdXJuaXR1cmUuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3Iuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZX0gZnJvbSAnLi9zZXJ2aWNlcy9jb25maWd1cmF0b3ItY29ubmVjdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4vbW9kZWwvY29uZmlndXJhdGlvbi1yZXN1bHQtb2JqZWN0JztcclxuaW1wb3J0IHtJbWFnZVV0aWxzfSBmcm9tICcuL3V0aWxzL2ltYWdlLnV0aWxzJztcclxuaW1wb3J0IHtTY2VuZVV0aWxzfSBmcm9tICcuL3V0aWxzL3NjZW5lLXV0aWxzJztcclxuaW1wb3J0IHtPYmplY3RVdGlsc30gZnJvbSAnLi91dGlscy9vYmplY3QudXRpbHMnO1xyXG5pbXBvcnQge1NlcnZpY2VMb2NhdG9yfSBmcm9tICcuL3NlcnZpY2VzL2xvY2F0b3Iuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCdWlsZGVyIHtcclxuXHJcbiAgcHVibGljIHNlbGVjdGlvbnNSZWNlaXZlZDogQmVoYXZpb3JTdWJqZWN0PFNlbGVjdGlvbltdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2VsZWN0aW9uW10+KFtdKTtcclxuICBwdWJsaWMgYXJ0aWNsZUxvYWRlZDogQmVoYXZpb3JTdWJqZWN0PEFydGljbGU+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBcnRpY2xlPih1bmRlZmluZWQpO1xyXG4gIHB1YmxpYyBkZWNvc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8RGVjb05vZGVbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERlY29Ob2RlW10+KFtdKTtcclxuICBwdWJsaWMgYW5zd2Vyc1JlY2VpdmVkOiBCZWhhdmlvclN1YmplY3Q8QW5zd2VyW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBbnN3ZXJbXT4oW10pO1xyXG4gIHB1YmxpYyBtb2RlbExvYWRlZDogQmVoYXZpb3JTdWJqZWN0PFRIUkVFLk9iamVjdDNEPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VEhSRUUuT2JqZWN0M0Q+KG51bGwpO1xyXG5cclxuICBwdWJsaWMgc2V0IGRlYnVnKHZhbHVlOiBGdW5jdGlvbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX2RlYnVnID0gdmFsdWU7XHJcbiAgICAgIGlmICh0aGlzLl92YXJpYXRpb25IZWxwZXIpIHtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuZGVidWcgPSB0aGlzLl9kZWJ1ZztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkZWJ1ZygpOiBGdW5jdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVidWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zY2VuZTogVEhSRUUuU2NlbmU7XHJcbiAgcHJpdmF0ZSBfaW5zdGFuY2VJZDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3NrdTogc3RyaW5nO1xyXG4gIHByaXZhdGUgX2dvb2RJZDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfYW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuICBwcml2YXRlIF9kZWNvczogRGVjb05vZGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3BsYWNlZEFkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX3BsYWNlZEFkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FkanVzdGFibGVzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FkZGFibGVzOiBhbnlbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIF9kZWJ1ZzogRnVuY3Rpb247XHJcblxyXG4gIHByaXZhdGUgX2ltYWdlQ2FjaGU6IE1hcDxudW1iZXIsIHN0cmluZz4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5O1xyXG4gIHByaXZhdGUgX3NvdXJjZTogVEhSRUUuT2JqZWN0M0Q7XHJcbiAgcHJpdmF0ZSBfdGhyZWVkVXRpbHM6IFRocmVlZFV0aWxzO1xyXG4gIHByaXZhdGUgX3ZhcmlhdGlvbkhlbHBlcjogVmFyaWF0aW9uSGVscGVyO1xyXG4gIHByaXZhdGUgX2FydGljbGVDYWNoZTogTWFwPHN0cmluZywgQXJ0aWNsZT4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfYnVpbGRGdXJuaXR1cmVTZXJ2aWNlOiBTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2U7XHJcbiAgcHJpdmF0ZSBfbG9hZEZ1cm5pdHVyZVNlcnZpY2U6IFN3aXRjaExvYWRGdXJuaXR1cmVTZXJ2aWNlO1xyXG4gIHByaXZhdGUgX2NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2U6IENvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChDb25maWd1cmF0b3JTZXJ2aWNlKTtcclxuICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChTd2l0Y2hCdWlsZEZ1cm5pdHVyZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5fbG9hZEZ1cm5pdHVyZVNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoU3dpdGNoTG9hZEZ1cm5pdHVyZVNlcnZpY2UpO1xyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChDb25maWd1cmF0b3JDb25uZWN0b3JTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0TmV3QnVpbGQoXHJcbiAgICBzY2VuZTogU2NlbmUsXHJcbiAgICBvcHRpb25zPzogT3B0aW9ucyxcclxuICAgIHNrdT86IHN0cmluZyxcclxuICAgIGluc3RhbmNlSWQ/OiBzdHJpbmcsXHJcbiAgICBnb29kSWQ/OiBudW1iZXJcclxuICApOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXRDb25uZWN0b3Iob3B0aW9ucywgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2Uuc2NlbmUgPSBzY2VuZTtcclxuICAgIGlmIChza3UpIHtcclxuICAgICAgdHJ5IHtcclxuXHJcbiAgICAgICAgY29uc3QgZnVybml0dXJlRGF0YTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCA9IG5ldyBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KCk7XHJcbiAgICAgICAgZnVybml0dXJlRGF0YS5za3UgPSBza3U7XHJcbiAgICAgICAgZnVybml0dXJlRGF0YS5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqZWN0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0ID1cclxuICAgICAgICAgIGF3YWl0IHRoaXMuX2xvYWRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLmxvYWRGdXJuaXR1cmUoXHJcbiAgICAgICAgICAgIGZ1cm5pdHVyZURhdGEsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgICBmYWxzZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gcmVzdWx0T2JqZWN0Lm9iamVjdDtcclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIGZ1cm5pdHVyZSBjb25maWd1cmF0aW9uOicsIGVycm9yKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGJ1aWxkV2l0aERhdGEoXHJcbiAgICBvcHRpb25zPzogT3B0aW9ucyxcclxuICAgIHNlbGVjdGlvbnM/OiBTZWxlY3Rpb25bXSxcclxuICAgIGRlY29zPzogRGVjb05vZGVbXSxcclxuICAgIGFzc2V0VXJsPzogc3RyaW5nLFxyXG4gICAgY2RuVXJsPzogc3RyaW5nLFxyXG4gICAgc2NoZW1hPzogc3RyaW5nXHJcbiAgKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZTogRnVuY3Rpb24sIHJlamVjdDogRnVuY3Rpb24pID0+IHtcclxuICAgICAgaWYgKCF0aGlzLl9zY2VuZSkge1xyXG4gICAgICAgIHJlamVjdCgnbm8gc2NlbmUgcHJvdmlkZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICB0aGlzLl9sb2coJ3N0YXJ0IGJ1aWxkJywgdHJ1ZSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fZG93bmxvYWRBc3NldChhc3NldFVybCwgY2RuVXJsLCBzY2hlbWEsIHNlbGVjdGlvbnMgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAxICYmIGRlY29zICYmIGRlY29zLmxlbmd0aCA+IDApO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbnMgJiYgc2VsZWN0aW9ucy5sZW5ndGggPiAxICYmIGRlY29zICYmIGRlY29zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHNjZW5lLlxyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLnNjZW5lID0gdGhpcy5fc2NlbmU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QgPSBuZXcgQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZS5zZWxlY3Rpb25zID0gc2VsZWN0aW9ucztcclxuICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvckNvbm5lY3RvclNlcnZpY2UuZGVjb05vZGVzID0gZGVjb3M7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLl9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2UubGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2J1aWxkRnVybml0dXJlU2VydmljZS5jdXJyZW50QWN0aXZlU2VydmljZS5wcmVwYXJlVGhlU2VsZWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5fcHJlbG9hZE1hdGVyaWFscygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRGdXJuaXR1cmVTZXJ2aWNlLmN1cnJlbnRBY3RpdmVTZXJ2aWNlLnByZWxvYWRNYXRlcmlhbHMob3B0aW9ucy5zY2hlbWEpO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgYnVpbGQgPSBhd2FpdCB0aGlzLl9idWlsZCgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYnVpbGQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QgPSBhd2FpdCB0aGlzLl9idWlsZEZ1cm5pdHVyZVNlcnZpY2UuY3VycmVudEFjdGl2ZVNlcnZpY2UuYnVpbGQocmVzdWx0KTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKGJ1aWxkLm9iamVjdCk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcy5fc291cmNlKTsgLy8ganVzdCByZXR1cm4gdGhlIHNvdXJjZSBmb3Igc2ltcGxpY2l0eVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGFzc2V0VXJsKSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGBFcnJvciBkb3dubG9hZGluZyBzb3VyY2U6ICR7YXNzZXRVcmx9YCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KCdObyAzRCBzb3VyY2UgcHJvdmlkZWQhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgdGhpcy5fY2xlYW5VcCgpO1xyXG4gICAgICAgICAgdGhpcy5fbG9nKCdmaW5pc2ggYnVpbGQnLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICByZWplY3QoZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoc2NlbmU6IFNjZW5lLCBvcHRpb25zPzogT3B0aW9ucykge1xyXG4gICAgdGhpcy5fYm9GYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG4gICAgdGhpcy5fdGhyZWVkVXRpbHMgPSBuZXcgVGhyZWVkVXRpbHMoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlciA9IG5ldyBWYXJpYXRpb25IZWxwZXIoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5kZWJ1ZyA9IHRoaXMuX2RlYnVnO1xyXG5cclxuICAgIGlmICghc2NlbmUpIHtcclxuICAgICAgdGhyb3cgJ05vIHNjZW5lIG9iamVjdCBwcm92aWRlZCEnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZSA9IG5ldyBDb25maWd1cmF0b3JTZXJ2aWNlKCk7XHJcbiAgICAvLyB0aGlzLl9pbWFnZUNhY2hlU2VydmljZSA9IG5ldyBJbWFnZUNhY2hlU2VydmljZSgpO1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5pbml0QXBpKG9wdGlvbnMpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmUgPSBzY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsKHNrdT86IHN0cmluZywgaW5zdGFuY2VJZD86IHN0cmluZywgZ29vZElkPzogbnVtYmVyKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgaWYgKCF0aGlzLl9zY2VuZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXRJbnN0YW5jZUlkKHNrdSwgaW5zdGFuY2VJZCwgZ29vZElkKTtcclxuICAgICAgYXdhaXQgdGhpcy5fcHJlcGFyZUNvbmZpZ3VyYXRpb24odGhpcy5fc2t1LCB0aGlzLl9nb29kSWQpO1xyXG4gICAgICBpZiAodGhpcy5fc291cmNlKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZXRJbnN0YW5jZVRvQ29uZmlndXJlKHRoaXMuX2luc3RhbmNlSWQpO1xyXG4gICAgICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLmdldFF1ZXN0aW9uQW5kQW5zd2VycygpKTtcclxuICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2dldFNlbGVjdGlvbnModGhpcy5faW5zdGFuY2VJZCkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZ2V0RGVjb3MoKSk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gICAgICAgIGlmICh0aGlzLl9hbnN3ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgIHRoaXMuX3ByZXBhcmVUaGVTZWxlY3Rpb25zKCk7XHJcbiAgICAgICAgdGhpcy5fcHJlbG9hZE1hdGVyaWFscygpO1xyXG4gICAgICAgIGNvbnN0IGJ1aWxkID0gYXdhaXQgdGhpcy5fYnVpbGQoKTtcclxuICAgICAgICByZXR1cm4gYnVpbGQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgJ0dMQiBzb3VyY2Ugbm90IGZvdW5kISc7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhyb3cgZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBidWlsZE1vZGVsRnJvbURhdGEoc2VsZWN0aW9uczogU2VsZWN0aW9uW10sIGRlY29zOiBEZWNvTm9kZVtdLCBhc3NldFVybDogc3RyaW5nLCBjZG5Vcmw6IHN0cmluZywgc2NoZW1hOiBzdHJpbmcpOiBQcm9taXNlPFRIUkVFLk9iamVjdDNEPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmU6IEZ1bmN0aW9uLCByZWplY3Q6IEZ1bmN0aW9uKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5fc2NlbmUpIHtcclxuICAgICAgICByZWplY3QoJ25vIHNjZW5lIHByb3ZpZGVkIScpO1xyXG4gICAgICB9XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgdGhpcy5fbG9nKCdzdGFydCBidWlsZCcsIHRydWUpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2Rvd25sb2FkQXNzZXQoYXNzZXRVcmwsIGNkblVybCwgc2NoZW1hLCBzZWxlY3Rpb25zICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMSAmJiBkZWNvcyAmJiBkZWNvcy5sZW5ndGggPiAwKTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25zICYmIHNlbGVjdGlvbnMubGVuZ3RoID4gMSAmJiBkZWNvcyAmJiBkZWNvcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9ucyA9IHNlbGVjdGlvbnM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWNvcyA9IGRlY29zO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua1NlbGVjdGlvbnNBbmREZWNvcygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3ByZWxvYWRNYXRlcmlhbHMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1aWxkID0gYXdhaXQgdGhpcy5fYnVpbGQoKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoYnVpbGQpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHRoaXMuX3NvdXJjZSk7IC8vIGp1c3QgcmV0dXJuIHRoZSBzb3VyY2UgZm9yIHNpbXBsaWNpdHlcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICByZWplY3QoZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChhc3NldFVybCkge1xyXG4gICAgICAgICAgICAgIHJlamVjdChgRXJyb3IgZG93bmxvYWRpbmcgc291cmNlOiAke2Fzc2V0VXJsfWApO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJlamVjdCgnTm8gM0Qgc291cmNlIHByb3ZpZGVkIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIHRoaXMuX2NsZWFuVXAoKTtcclxuICAgICAgICAgIHRoaXMuX2xvZygnZmluaXNoIGJ1aWxkJywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpbml0Tm9kZUluc3RhbmNlKGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoZ29vZElkLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3RocmVlZFV0aWxzLmNsZWFyQ2FjaGUoKTtcclxuICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdFNlbGVjdGlvbihzZWxlY3Rpb24sIGZhbHNlKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKHB1YmxpY2F0aW9uQ29kZT86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgcXVlc3Rpb25zQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnMoZmFsc2UsIHB1YmxpY2F0aW9uQ29kZSk7XHJcbiAgICB0aGlzLl9hbnN3ZXJzID0gcXVlc3Rpb25zQW5kQW5zd2VycyAmJiBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMgPyBxdWVzdGlvbnNBbmRBbnN3ZXJzLmFuc3dlcnMgOiBbXTtcclxuICAgIHRoaXMuYW5zd2Vyc1JlY2VpdmVkLm5leHQodGhpcy5fYW5zd2Vycyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2VsZWN0QW5zd2VyKGFuc3dlcjogQW5zd2VyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlcihhbnN3ZXIsIGZhbHNlKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzKCk7XHJcbiAgICBpZiAodGhpcy5fYW5zd2VycyAmJiB0aGlzLl9hbnN3ZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLl9idWlsZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEltYWdlRm9yU2VsZWN0aW9uT3JBbnN3ZXIob2JqZWN0OiBTZWxlY3Rpb24gfCBBbnN3ZXIpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgaW5jbHVkZU1pbWVUeXBlOiBib29sZWFuID0gdHJ1ZSwgdGh1bWI6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbiwgcmVqZWN0OiBGdW5jdGlvbikgPT4ge1xyXG4gICAgICBpZiAob2JqZWN0ICYmIG9iamVjdC5ub2RlSWQpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKG9iamVjdC5ub2RlSWQpKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRTaW5nbGVJbWFnZShvYmplY3Qubm9kZUlkLCA0LCBpbmNsdWRlTWltZVR5cGUsIHRodW1iLCB0cnVlKVxyXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2VEYXRhOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJhc2U2NDogc3RyaW5nID0gdGhpcy5faGFuZGxlUmVzcG9uc2VEYXRhKGluY2x1ZGVNaW1lVHlwZSwgdGh1bWIsIHJlc3BvbnNlRGF0YSk7XHJcbiAgICAgICAgICAgICAgdGhpcy5faW1hZ2VDYWNoZS5zZXQob2JqZWN0Lm5vZGVJZCwgYmFzZTY0KTtcclxuICAgICAgICAgICAgICByZXNvbHZlKGJhc2U2NCk7XHJcbiAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJlc29sdmUodGhpcy5faW1hZ2VDYWNoZS5nZXQob2JqZWN0Lm5vZGVJZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZWplY3QoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgX2NsZWFuVXAoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9za3UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9nb29kSWQgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9pbnN0YW5jZUlkID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmNsZWFyQ2FjaGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZVJlc3BvbnNlRGF0YShpbmNsdWRlTWltZXR5cGU6IGJvb2xlYW4sIHRodW1iOiBib29sZWFuLCByZXNwb25zZURhdGE6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChyZXNwb25zZURhdGEgJiYgcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdCkge1xyXG4gICAgICBpZiAocmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC5maWxlUGF0aCAhPT0gbnVsbCAmJiByZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVQYXRoICE9PSAnJykge1xyXG4gICAgICAgIHJldHVybiBJbWFnZVV0aWxzLmdldEZpeGVkSW1hZ2VGaWxlcGF0aFVybChyZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVQYXRoKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoaW5jbHVkZU1pbWV0eXBlKSB7XHJcbiAgICAgICAgICByZXR1cm4gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihyZXNwb25zZURhdGEucmVzdWx0T2JqZWN0LmZpbGVOYW1lLFxyXG4gICAgICAgICAgICB0aHVtYiA/IHJlc3BvbnNlRGF0YS5yZXN1bHRPYmplY3QudGh1bWJuYWlsQm9keSA6IHJlc3BvbnNlRGF0YS5yZXN1bHRPYmplY3QuZG9jdW1lbnRCb2R5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIHRodW1iID8gcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC50aHVtYm5haWxCb2R5IDogcmVzcG9uc2VEYXRhLnJlc3VsdE9iamVjdC5kb2N1bWVudEJvZHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVsb2FkTWF0ZXJpYWxzKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2RlY29zICYmIHRoaXMuX2RlY29zLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBtYXRlcmlhbHM6IERlY29Ob2RlW10gPSBbLi4ubmV3IFNldChcclxuICAgICAgICB0aGlzLl9kZWNvc1xyXG4gICAgICAgICAgLmZpbHRlcihkID0+IChkLmdhbWVPYmplY3ROYW1lIHx8IGQubWF0ZXJpYWxVcmwpICYmIGQudHlwZSA9PT0gRGVjb05vZGVUeXBlLlZhcmlhdGlvbilcclxuICAgICAgICAgIC5tYXAoZCA9PiBkKVxyXG4gICAgICApXTtcclxuICAgICAgdGhpcy5fdmFyaWF0aW9uSGVscGVyLnByZWxvYWRWYXJpYXRpb25zKG1hdGVyaWFscyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9zZXRJbnN0YW5jZUlkKHNrdTogc3RyaW5nLCBpbnN0YW5jZUlkPzogc3RyaW5nLCBnb29kSWQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghaW5zdGFuY2VJZCAmJiAhdGhpcy5faW5zdGFuY2VJZCkge1xyXG4gICAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICAgIGdvb2RJZCA9IGF3YWl0IHRoaXMuX2dldEdvb2RJZEZyb21Ta3Uoc2t1KTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9nb29kSWQgPSBnb29kSWQ7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLmluaXROb2RlSW5zdGFuY2UodGhpcy5fZ29vZElkKTtcclxuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgICAgdGhpcy5faW5zdGFuY2VJZCA9IHJlc3VsdC5yZXN1bHRPYmplY3Q7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgJ0ZhaWxlZCB0byBpbml0aWFsaXplIG5vZGUgaW5zdGFuY2UnO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCF0aGlzLl9pbnN0YW5jZUlkKSB7XHJcbiAgICAgIHRoaXMuX2luc3RhbmNlSWQgPSBpbnN0YW5jZUlkO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLl9za3UpIHtcclxuICAgICAgdGhpcy5fc2t1ID0gc2t1O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcHJlcGFyZUNvbmZpZ3VyYXRpb24oc2t1OiBzdHJpbmcsIGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYXJ0aWNsZTogQXJ0aWNsZSA9IGF3YWl0IHRoaXMuX2dldEFydGljbGUoc2t1LCBnb29kSWQpO1xyXG4gICAgaWYgKGFydGljbGUgJiYgYXJ0aWNsZS5hc3NldFVybCkge1xyXG4gICAgICBpZiAoYXJ0aWNsZS5jb250ZW50RGVsaXZlcnlVcmwpIHtcclxuICAgICAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuYXNzZXRQYXRoID1cclxuICAgICAgICAgIGFydGljbGUuY29udGVudERlbGl2ZXJ5VXJsICtcclxuICAgICAgICAgIChhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAgIChhcnRpY2xlLmRpc3RTY2hlbWEgPyBhcnRpY2xlLmRpc3RTY2hlbWEgOiAnVVBfREJBJyk7XHJcbiAgICAgIH1cclxuICAgICAgYXdhaXQgdGhpcy5fZG93bmxvYWRBc3NldChhcnRpY2xlLmFzc2V0VXJsLCBhcnRpY2xlLmNvbnRlbnREZWxpdmVyeVVybCwgYXJ0aWNsZS5kaXN0U2NoZW1hKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2Rvd25sb2FkQXNzZXQoYXNzZXRVcmw6IHN0cmluZywgY2RuVXJsOiBzdHJpbmcsIHNjaGVtYTogc3RyaW5nLCBzZXRWaXNpYmxlRmFsc2U6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zb3VyY2UgPSBhd2FpdCB0aGlzLl90aHJlZWRVdGlscy5kb3dubG9hZDNEU291cmNlKGFzc2V0VXJsLCBzZXRWaXNpYmxlRmFsc2UpXHJcbiAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgfSk7XHJcbiAgICBpZiAoY2RuVXJsKSB7XHJcbiAgICAgIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5hc3NldFBhdGggPVxyXG4gICAgICAgIGNkblVybCArXHJcbiAgICAgICAgKGNkblVybC5lbmRzV2l0aCgnLycpID8gJycgOiAnLycpICtcclxuICAgICAgICAoc2NoZW1hID8gc2NoZW1hIDogJ1VQX0RCQScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfYnVpbGQoKTogUHJvbWlzZTxUSFJFRS5PYmplY3QzRD4ge1xyXG4gICAgY29uc3QgYWRqdXN0YWJsZXM6IFNlbGVjdGlvbltdID0gdGhpcy5fZ2V0QWRqdXN0YWJsZXMoKTtcclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPT09IDAgJiYgdGhpcy5fc2VsZWN0aW9ucyAmJiB0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCA+IDApIHsgLy8gY2hlY2sgaWYgYXJ0aWNsZSBoYXMgYSBnYW1lT2JqZWN0XHJcbiAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25zWzBdLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BcnRpY2xlICYmIHRoaXMuX3NlbGVjdGlvbnNbMF0uZ2FtZU9iamVjdCkge1xyXG4gICAgICAgIGFkanVzdGFibGVzLnB1c2godGhpcy5fc2VsZWN0aW9uc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChhZGp1c3RhYmxlcyAmJiBhZGp1c3RhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnN0IG9iajogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcclxuICAgICAgb2JqLnZpc2libGUgPSBmYWxzZTsgLy8gbm8gbmVlZCB0byByZW5kZXIgdmlzdWFseVxyXG4gICAgICB0aGlzLl9zY2VuZS5hZGQob2JqKTtcclxuICAgICAgbGV0IGNvbm5lY3RlZCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9sb2coJ2J1aWxkIG1haW4gbW9kZWwnKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbjogbnVtYmVyID0gYWRqdXN0YWJsZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICBjb25zdCBhZGp1c3RhYmxlOiBUSFJFRS5PYmplY3QzRCA9IHRoaXMuX2NyZWF0ZUFkanVzdGFibGUob2JqLCBhZGp1c3RhYmxlc1tpXSk7XHJcbiAgICAgICAgaWYgKGFkanVzdGFibGUpIHtcclxuICAgICAgICAgIGZvciAobGV0IGlpID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoIC0gMTsgaWkgPj0gMDsgaWktLSkge1xyXG4gICAgICAgICAgICBpZiAoU2NlbmVVdGlscy5UcnlTZWxlY3RvckNvbm5lY3Rpb24odGhpcy5fc2NlbmUsXHJcbiAgICAgICAgICAgICAgb2JqLCB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpaV0sIGFkanVzdGFibGUsIGkgPT09IDEpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaWldLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGFkanVzdGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb25uZWN0ZWQgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKCdObyBjb25uZWN0aW9uIGZvdW5kIGZvcjogJywgYWRqdXN0YWJsZS5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbG9nKCdwbGFjZSBhZGRhYmxlcycpO1xyXG4gICAgICB0aGlzLl9wbGFjZUFkZGFibGVzKG9iaik7XHJcbiAgICAgIHRoaXMuX2xvZygndXBkYXRlIHBpdm90Jyk7XHJcbiAgICAgIHRoaXMuX3VwZGF0ZVBpdm90KG9iaik7XHJcbiAgICAgIHRoaXMuX2xvZygnbG9hZCB2YXJpYXRpb25zJyk7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2xvYWRWYXJpYXRpb25zKG9iaik7XHJcbiAgICAgIC8vIHRoaXMuX3ZhcmlhdGlvbkhlbHBlci5jbGVhckNhY2hlKCk7XHJcbiAgICAgIHRoaXMuX2xvZygncmVtb3ZlIGZyb20gc2NlbmUnKTtcclxuICAgICAgdGhpcy5fc2NlbmUucmVtb3ZlKG9iaik7XHJcbiAgICAgIE9iamVjdFV0aWxzLkRpc3Bvc2VPYmplY3QodGhpcy5fc291cmNlKTtcclxuICAgICAgLy8gdGhpcy5fY2xlYW5VcCgpO1xyXG4gICAgICB0aGlzLl9sb2coJ3JlYWR5IScpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGVkLm5leHQob2JqKTtcclxuICAgICAgcmV0dXJuIG9iajtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93ICdObyBhZGp1c3RhYmxlcyBmb3VuZCEnO1xyXG4gICAgICAvLyB0aGlzLl9idWlsZGluZyA9IGZhbHNlO1xyXG4gICAgICAvLyBpZiAodGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA8IDIpIHtcclxuICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX1NFTEVDVElPTlNfT1JfREVDT1MnLCBkZXNjcmlwdGlvbjogJ05PX1NFTEVDVElPTlNfT1JfREVDT1NfSU5GTyd9KTtcclxuICAgICAgLy8gICAgIHRoaXMuYnVpbGRGaW5pc2hlZC5uZXh0KHtpbnN0YW5jZUlkOiB0aGlzLmFjdGl2ZUluc3RhbmNlLCByZXN1bHRUeXBlOiBSZXN1bHRUeXBlLk5vU2VsZWN0aW9uc30pO1xyXG4gICAgICAvLyB9IGVsc2UgaWYgKHRoaXMuZGVjb3Muc2l6ZSA9PT0gMCkge1xyXG4gICAgICAvLyAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLmFkZEVycm9yKHRoaXMuYWN0aXZlSW5zdGFuY2UsIHttZXNzYWdlOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPUycsIGRlc2NyaXB0aW9uOiAnTk9fU0VMRUNUSU9OU19PUl9ERUNPU19JTkZPJ30pO1xyXG4gICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9EZWNvTm9kZXN9KTtcclxuICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgLy8gICAgIHRoaXMuX2Vycm9yU2VydmljZS5hZGRFcnJvcih0aGlzLmFjdGl2ZUluc3RhbmNlLCB7bWVzc2FnZTogJ05PX0FESlVTVEFCTEVTJywgZGVzY3JpcHRpb246ICdOT19BREpVU1RBQkxFU19JTkZPJ30pO1xyXG4gICAgICAvLyAgICAgdGhpcy5idWlsZEZpbmlzaGVkLm5leHQoe2luc3RhbmNlSWQ6IHRoaXMuYWN0aXZlSW5zdGFuY2UsIHJlc3VsdFR5cGU6IFJlc3VsdFR5cGUuTm9BZGp1c3RhYmxlc30pO1xyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlVGhlU2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5fc2VsZWN0aW9ucyB8fCAhdGhpcy5fc2VsZWN0aW9ucy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc2VsZWN0aW9ucyA9IHRoaXMuX3NlbGVjdGlvbnMuc2xpY2UoKTtcclxuICAgIGNvbnN0IHNlbGVjdGlvbk9mQXJ0aWNsZTogU2VsZWN0aW9uID0gc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlVHlwZSA9PT0gTm9kZVR5cGUuQXJ0aWNsZSk7XHJcbiAgICBjb25zdCBhZGp1c3RhYmxlU2VsZWN0aW9uczogU2VsZWN0aW9uW10gPSBzZWxlY3Rpb25zLmZpbHRlcihzID0+IHMuYWRkQWRqdXN0ID09PSAnMicpO1xyXG4gICAgY29uc3QgaXNBcnRpY2xlV2l0aE1hdGVyaWFsOiBib29sZWFuID1cclxuICAgICAgYWRqdXN0YWJsZVNlbGVjdGlvbnMubGVuZ3RoID09PSAwICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0ICYmXHJcbiAgICAgIHNlbGVjdGlvbk9mQXJ0aWNsZS5nYW1lT2JqZWN0Lmxlbmd0aCA+IDA7XHJcbiAgICAvLyBnZXQgZ2VuZXJpYyB2YXJpYXRpb25zXHJcbiAgICBjb25zdCBnbG9iYWxWYXJpYXRpb25zOiBEZWNvTm9kZVtdID0gdGhpcy5fc2VsZWN0aW9uc1xyXG4gICAgICAuZmlsdGVyKHMgPT4gKHMuZ2VuZXJpYyB8fCBhZGp1c3RhYmxlU2VsZWN0aW9ucy5sZW5ndGggPT09IDEpICYmIChzLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uICYmICFzLmRlY29Ob2RlLnR5cGUpXHJcbiAgICAgIC5tYXAoKHZhbHVlOiBTZWxlY3Rpb24sIGluZGV4OiBudW1iZXIsIGFycmF5OiBTZWxlY3Rpb25bXSkgPT4ge1xyXG4gICAgICAgIC8vIGZpbmQgc2VsZWN0aW9uIG9mIHZhcmlhdGlvblxyXG4gICAgICAgIGNvbnN0IHNlbDogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5hcnROb2RlSWREZWNvID09PSAodmFsdWUuZGVjb05vZGUgYXMgYW55KS52YXJpYXRpb24ucGFyZW50SWQpO1xyXG4gICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICh2YWx1ZS5kZWNvTm9kZSBhcyBhbnkpLnZhcmlhdGlvbi5zdXBwbGllckFydGljbGVOciA9IHNlbC5zdXBwbGllckFydGljbGVOcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uLm1hdGVyaWFsSWQgPSB0aGlzLl9nZXRNYXRlcmlhbElkRnJvbVBhcmVudCh2YWx1ZS5ub2RlKTtcclxuICAgICAgICByZXR1cm4gKHZhbHVlLmRlY29Ob2RlIGFzIGFueSkudmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIC8vIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBtb21lbnRcclxuICAgIC8vIGdsb2JhbFZhcmlhdGlvbnMuZm9yRWFjaChnID0+IHtcclxuICAgIC8vICAgY29uc3QgcGFyZW50SWR4ID0gc2VsZWN0aW9ucy5maW5kSW5kZXgocyA9PiBzLmRlY29Ob2RlICYmIHMuZGVjb05vZGUuaWQgPT09IGcucGFyZW50SWQpO1xyXG4gICAgLy8gICBpZiAocGFyZW50SWR4KSB7IC8vIHJlbW92ZSBwYXJlbnQgc2VsZWN0aW9uXHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy5zcGxpY2UocGFyZW50SWR4LCAxKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gICBjb25zdCBpZHggPSBzZWxlY3Rpb25zLmZpbmRJbmRleChzID0+IHMuZGVjb05vZGUgJiYgcy5kZWNvTm9kZS5pZCA9PT0gZy5pZCk7XHJcbiAgICAvLyAgIGlmIChpZHgpIHsgLy8gbW92ZSBnZW5lcmljIHZhcmlhdGlvbnMgdG8gdG9wXHJcbiAgICAvLyAgICAgY29uc3Qgc2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpZHhdO1xyXG4gICAgLy8gICAgIHNlbGVjdGlvbnMuc3BsaWNlKGlkeCwgMSk7XHJcbiAgICAvLyAgICAgc2VsZWN0aW9ucy51bnNoaWZ0KHNlbGVjdGlvbik7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIGNvbnN0IHVzZWRWYXJpYXRpb25zOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uW10gPSBbXTtcclxuICAgIGxldCBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSBzZWxlY3Rpb25zLmxlbmd0aDtcclxuICAgIGxldCBsYXN0QWRkZWQ6IFNlbGVjdGlvbjtcclxuICAgIGxldCBsYXN0QWRqdXN0YWJsZTogU2VsZWN0aW9uO1xyXG4gICAgbGV0IG5ld1BhcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGxldCBwcmV2aW91c1ByZXNMZXZlbDogbnVtYmVyID0gLTE7XHJcbiAgICBsZXQgcG9zaXRpb25pbmc6IGFueTtcclxuICAgIGxldCBvcHRpb25UZXh0OiBzdHJpbmc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbjogU2VsZWN0aW9uID0gc2VsZWN0aW9uc1tpXTtcclxuICAgICAgaWYgKHNlbGVjdGlvbi5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSkge1xyXG4gICAgICAgIHBvc2l0aW9uaW5nID0gc2VsZWN0aW9uLmhkZWNvUG9zaXRpb25pbmc7XHJcbiAgICAgICAgb3B0aW9uVGV4dCA9IHNlbGVjdGlvbi5xdWVzdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID4gcHJldmlvdXNQcmVzTGV2ZWwpIHtcclxuICAgICAgICBzZWxlY3Rpb24uaGRlY29Qb3NpdGlvbmluZyA9IHNlbGVjdGlvbi5oZGVjb1Bvc2l0aW9uaW5nIHx8IHBvc2l0aW9uaW5nO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChzZWxlY3Rpb24uZGVjb05vZGUpIHtcclxuICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5WYXJpYXRpb24pIHtcclxuICAgICAgICAgIGNvbnN0IGRlY29Ob2RlID0gc2VsZWN0aW9uLmRlY29Ob2RlO1xyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkub3B0aW9uVGV4dCA9IG9wdGlvblRleHQ7XHJcbiAgICAgICAgICAvLyBmaW5kIHNlbGVjdGlvbiBvZiB2YXJpYXRpb24gYW5kIHNldCBtYXRlcmlhbElkIGluIGNhc2Ugb2YgbXVsdGltYXRlcmlhbFxyXG4gICAgICAgICAgKGRlY29Ob2RlIGFzIGFueSkubWF0ZXJpYWxJZCA9IHRoaXMuX2dldE1hdGVyaWFsSWRGcm9tUGFyZW50KGRlY29Ob2RlLm5vZGVJZCk7XHJcbiAgICAgICAgICBpZiAobGFzdEFkZGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdQYXJ0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKChkZWNvTm9kZSBhcyBhbnkpLm1hdGVyaWFsSWQpIHtcclxuICAgICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsYXN0QWRkZWQudmFyaWF0aW9ucyA9IFtkZWNvTm9kZV07XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGxhc3RBZGRlZC52YXJpYXRpb25zLnB1c2goZGVjb05vZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5ld1BhcnQgPSBmYWxzZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSkge1xyXG4gICAgICAgICAgICAgIGdsb2JhbFZhcmlhdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgICAgICAgICBnbG9iYWxWYXJpYXRpb25zUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZ2xvYmFsVmFyaWF0aW9ucy5maW5kKHYgPT4gdi5pZCA9PT0gZGVjb05vZGUuaWQpKSB7XHJcbiAgICAgICAgICAgICAgZ2xvYmFsVmFyaWF0aW9ucy5wdXNoKGRlY29Ob2RlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gY29uc3QgdmFyaWF0aW9uOiBGdXJuaXR1cmVQYXJ0VmFyaWF0aW9uID0gbmV3IEZ1cm5pdHVyZVBhcnRWYXJpYXRpb24oKTtcclxuICAgICAgICAgIC8vIHZhcmlhdGlvbi5CcmFuZElkID0gc2VsZWN0aW9uLmRlY29Ob2RlLmJyYW5kSWQ7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uRGVzY3JpcHRpb24gPSBzZWxlY3Rpb24uZGVjb05vZGUuZ2FtZU9iamVjdE5hbWU7XHJcbiAgICAgICAgICAvLyB2YXJpYXRpb24uTWF0ZXJpYWxJZCA9IChzZWxlY3Rpb24uZGVjb05vZGUgYXMgYW55KS5tYXRlcmlhbElkO1xyXG4gICAgICAgICAgLy8gdmFyaWF0aW9uLlN1cHBsaWVyQXJ0aWNsZU5yID0gKHNlbGVjdGlvbi5kZWNvTm9kZSBhcyBhbnkpLnN1cHBsaWVyQXJ0aWNsZU5yO1xyXG4gICAgICAgICAgLy8gdXNlZFZhcmlhdGlvbnMucHVzaCh2YXJpYXRpb24pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKHNlbGVjdGlvbi5kZWNvTm9kZS50eXBlID09PSBEZWNvTm9kZVR5cGUuUGFydCAmJlxyXG4gICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZSA9PT0gJ3N0cmluZycgJiZcclxuICAgICAgICAgIHNlbGVjdGlvbi5kZWNvTm9kZS5nYW1lT2JqZWN0TmFtZS5sZW5ndGgpIHx8IChpc0FydGljbGVXaXRoTWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGp1c3RhYmxlIHx8IChpc0FydGljbGVXaXRoTWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgdGhpcy5fYWRqdXN0YWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICBpZiAoIWxhc3RBZGRlZCB8fCAobGFzdEFkZGVkLm5vZGVJZCAhPT0gc2VsZWN0aW9uLm5vZGVJZCB8fCBsYXN0QWRkZWQubm9kZSAhPT0gc2VsZWN0aW9uLm5vZGUpKSB7XHJcbiAgICAgICAgICAgICAgbmV3UGFydCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGFzdEFkZGVkID0gc2VsZWN0aW9uO1xyXG4gICAgICAgICAgICBsYXN0QWRqdXN0YWJsZSA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uLmRlY29Ob2RlLmtpbmQgPT09IERlY29Ob2RlS2luZC5BZGRhYmxlKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbi52YXJpYXRpb25zID0gbGFzdEFkanVzdGFibGUgPyBsYXN0QWRqdXN0YWJsZS52YXJpYXRpb25zIDogZ2xvYmFsVmFyaWF0aW9ucztcclxuICAgICAgICAgICAgaWYgKGxhc3RBZGp1c3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgbGFzdEFkanVzdGFibGUuYWRkYWJsZXMucHVzaChzZWxlY3Rpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2FkZGFibGVzLnB1c2goc2VsZWN0aW9uKTtcclxuICAgICAgICAgICAgaWYgKCFsYXN0QWRkZWQgfHwgKGxhc3RBZGRlZC5ub2RlSWQgIT09IHNlbGVjdGlvbi5ub2RlSWQgfHwgbGFzdEFkZGVkLm5vZGUgIT09IHNlbGVjdGlvbi5ub2RlKSkge1xyXG4gICAgICAgICAgICAgIG5ld1BhcnQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxhc3RBZGRlZCA9IHNlbGVjdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcHJldmlvdXNQcmVzTGV2ZWwgPSBzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWw7XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLl91cHNlcnRGdXJuaXR1cmUodGhpcy5hY3RpdmVJbnN0YW5jZSxcclxuICAgIC8vICAge1ZhcmlhdGlvbnM6IHVzZWRWYXJpYXRpb25zfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBtYXRlcmlhbElkIG9mIHRoZSBwYXJlbnQgdXAgdGhlIHRyZWUgdW50aWwgcHJlc2VudGlvbmxldmVsIDEgaXMgcmVhY2hlZFxyXG4gICAqIEBwYXJhbSBpZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZ2V0TWF0ZXJpYWxJZEZyb21QYXJlbnQoaWQ6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fc2VsZWN0aW9ucykge1xyXG4gICAgICBjb25zdCBpZHg6IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMuZmluZEluZGV4KHMgPT4gcy5ub2RlID09PSBpZCk7XHJcbiAgICAgIGxldCBjdXJyZW50TGV2ZWw6IG51bWJlciA9IDk5OTtcclxuICAgICAgaWYgKGlkeCA+IC0xKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IGlkeDsgaSA+IDA7IGktLSkge1xyXG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9uc1tpXTtcclxuICAgICAgICAgIGlmIChzZWxlY3Rpb24ucHJlc2VudGF0aW9uTGV2ZWwgPj0gY3VycmVudExldmVsKSB7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY3VycmVudExldmVsID0gc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsO1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5oZGVjb0dhbWVPYmplY3Q7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlQWRqdXN0YWJsZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBhZGo6IFNlbGVjdGlvbik6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgIGxldCBvYmo6IGFueSA9IHRoaXMuX3NvdXJjZSA/IHRoaXMuX3NvdXJjZS5nZXRPYmplY3RCeU5hbWUoYWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lIHx8IGFkai5nYW1lT2JqZWN0KSA6IG51bGw7XHJcbiAgICBpZiAoIW9iaikge1xyXG4gICAgICAvLyBpbiBjYXNlIG9mIGdsYiBmaWxlcywgdGhlIGltcG9ydGVyIHJlbW92ZXMgZG90cyBmcm9tIG5hbWVzXHJcbiAgICAgIGNvbnN0IG5hbWUgPSBhZGouZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUucmVwbGFjZSgvWy5dL2csICcnKTtcclxuICAgICAgb2JqID0gdGhpcy5fc291cmNlID8gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShuYW1lKSA6IG51bGw7XHJcbiAgICAgIGlmICghb2JqKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBObyBvYmplY3Qgd2l0aCBuYW1lICR7YWRqLmRlY29Ob2RlLmdhbWVPYmplY3ROYW1lfSBmb3VuZCFgKTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IGFkanVzdGFibGU6IGFueSA9IG9iai5jbG9uZSgpO1xyXG4gICAgYWRqdXN0YWJsZS5uYW1lID0gdGhpcy5fY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQsIG9iaik7XHJcbiAgICBhZGp1c3RhYmxlLnVzZXJEYXRhLnNlbGVjdGlvbiA9IGFkajtcclxuICAgIGFkanVzdGFibGUucG9zaXRpb24uc2V0KDAsIDAsIDApO1xyXG4gICAgYWRqdXN0YWJsZS50cmF2ZXJzZShjID0+IHtcclxuICAgICAgYy52aXNpYmxlID0gIWMubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2NfJyk7XHJcbiAgICB9KTtcclxuICAgIHBhcmVudC5hZGQoYWRqdXN0YWJsZSk7XHJcbiAgICAvLyB0aGUgb2JqZWN0IGJlaW5nIGFkZGVkIHRvIHRoZSBjdXN0b21GbG9vckdyb3VwIGlzIGJlaW5nIHJlY3JlYXRlZCBzbyB3ZSBsb29zZSB0aGUgcmVmZXJlbmNlXHJcbiAgICAvLyB0aGVyZWZvciB3ZSBuZWVkIHRvIHJldHJpZXZlIHRoZSBjcmVhdGVkIG9iamVjdCBhZ2FpblxyXG4gICAgYWRqdXN0YWJsZSA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUoYWRqdXN0YWJsZS5uYW1lKTtcclxuICAgIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzLnB1c2goYWRqdXN0YWJsZSk7XHJcbiAgICByZXR1cm4gYWRqdXN0YWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUFkZGFibGUocGFyZW50OiBUSFJFRS5PYmplY3QzRCwgYWRkOiBTZWxlY3Rpb24sIHBhcnQyPzogYW55LCBwYXJ0MT86IGFueSk6IFRIUkVFLk9iamVjdDNEIHtcclxuICAgIGNvbnN0IG9iajogYW55ID0gdGhpcy5fc291cmNlLmdldE9iamVjdEJ5TmFtZShhZGQuZGVjb05vZGUuZ2FtZU9iamVjdE5hbWUpO1xyXG4gICAgaWYgKCFvYmopIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zdCBzZWxlY3Rpb246IFNlbGVjdGlvbiA9IHRoaXMuX2dldFNlbGVjdGlvbkZyb21JZChhZGouYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICBjb25zdCBhZGRhYmxlOiBhbnkgPSBvYmouY2xvbmUoKTtcclxuICAgIGFkZGFibGUubmFtZSA9IHRoaXMuX2NyZWF0ZVVuaXF1ZU5hbWUocGFyZW50LCBvYmopO1xyXG4gICAgYWRkYWJsZS51c2VyRGF0YS5zZWxlY3Rpb24gPSBhZGQ7XHJcbiAgICBhZGRhYmxlLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcclxuICAgIGFkZGFibGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICBpZiAocGFydDEgJiYgcGFydDIpIHtcclxuICAgICAgcGFyZW50LmFkZChhZGRhYmxlKTtcclxuICAgICAgdGhpcy5fcGxhY2VkQWRkYWJsZXMucHVzaChhZGRhYmxlKTtcclxuICAgICAgcmV0dXJuIGFkZGFibGU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWRkYWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3BsYWNlQWRkYWJsZXMocGFyZW50OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLl9wbGFjZWRBZGp1c3RhYmxlcy5sZW5ndGg7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLl9wbGFjZWRBZGp1c3RhYmxlc1tpXS51c2VyRGF0YS5oYXNPd25Qcm9wZXJ0eSgnc2VsZWN0aW9uJykgJiYgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgYWRqdXN0YWJsZVNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXNbaV0udXNlckRhdGEuc2VsZWN0aW9uO1xyXG4gICAgICAgIGlmIChhZGp1c3RhYmxlU2VsZWN0aW9uKSB7XHJcbiAgICAgICAgICBjb25zdCBsZW5hOiBudW1iZXIgPSBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzLmxlbmd0aDtcclxuICAgICAgICAgIGxldCBjb25BZGRhYmxlOiBhbnk7XHJcbiAgICAgICAgICBmb3IgKGxldCBpYSA9IDA7IGlhIDwgbGVuYTsgaWErKykge1xyXG4gICAgICAgICAgICBTY2VuZVV0aWxzLlRyeVNlbGVjdG9yQ29ubmVjdGlvbih0aGlzLl9zY2VuZSxcclxuICAgICAgICAgICAgICBwYXJlbnQsIHRoaXMuX3BsYWNlZEFkanVzdGFibGVzW2ldLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgKGFkZCwgcGFydDI/LCBwYXJ0MT8pID0+IHRoaXMuX2NyZWF0ZUFkZGFibGUocGFyZW50LCBhZGQsIHBhcnQyLCBwYXJ0MSkpO1xyXG4gICAgICAgICAgICBpZiAoY29uQWRkYWJsZSkge1xyXG4gICAgICAgICAgICAgIFNjZW5lVXRpbHMuVHJ5U2VsZWN0b3JDb25uZWN0aW9uKHRoaXMuX3NjZW5lLFxyXG4gICAgICAgICAgICAgICAgcGFyZW50LCBjb25BZGRhYmxlLCBhZGp1c3RhYmxlU2VsZWN0aW9uLmFkZGFibGVzW2lhXSwgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAoYWRkLCBwYXJ0Mj8sIHBhcnQxPykgPT4gdGhpcy5fY3JlYXRlQWRkYWJsZShwYXJlbnQsIGFkZCwgcGFydDIsIHBhcnQxKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uQWRkYWJsZSA9IHRoaXMuX3BsYWNlZEFkZGFibGVzW3RoaXMuX3BsYWNlZEFkZGFibGVzLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlVW5pcXVlTmFtZShwYXJlbnQ6IFRIUkVFLk9iamVjdDNELCBvYmo6IFRIUkVFLk9iamVjdDNEKTogc3RyaW5nIHtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IG5hbWUgPSBvYmoubmFtZTtcclxuICAgIGxldCBleGlzdGluZ09iaiA9IHBhcmVudC5nZXRPYmplY3RCeU5hbWUobmFtZSk7XHJcbiAgICB3aGlsZSAoZXhpc3RpbmdPYmopIHtcclxuICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgIG5hbWUgPSBvYmoubmFtZSArIChpdGVyYXRpb24gIT09IDAgPyAoJ18nICsgaXRlcmF0aW9uKSA6ICcnKTtcclxuICAgICAgZXhpc3RpbmdPYmogPSBwYXJlbnQuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG5hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9nZXRHb29kSWRGcm9tU2t1KHNrdTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0R29vZElkRnJvbVNrdShza3UsIGZhbHNlKTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2dldEFydGljbGUoc2t1OiBzdHJpbmcsIGdvb2RJZDogbnVtYmVyKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICBpZiAodGhpcy5fYXJ0aWNsZUNhY2hlLmhhcyhza3UpKSB7XHJcbiAgICAgIHRoaXMuYXJ0aWNsZUxvYWRlZC5uZXh0KHRoaXMuX2FydGljbGVDYWNoZS5nZXQoc2t1KSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9hcnRpY2xlQ2FjaGUuZ2V0KHNrdSk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWdvb2RJZCkge1xyXG4gICAgICBnb29kSWQgPSBhd2FpdCB0aGlzLl9nZXRHb29kSWRGcm9tU2t1KHNrdSlcclxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICB0aHJvdyBgQXJ0aWNsZSB3aXRoIHNrdSAke3NrdX0gbm90IGZvdW5kIWA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgYXJ0aWNsZTogQXJ0aWNsZTtcclxuICAgIGNvbnN0IGFydGljbGVSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChnb29kSWQsIGZhbHNlKTtcclxuICAgIGlmIChhcnRpY2xlUmVzcG9uc2UgJiYgYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgYXJ0aWNsZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KSB7XHJcbiAgICAgIGlmIChhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0Lmhhc093blByb3BlcnR5KCdvQXJ0aWNsZScpKSB7XHJcbiAgICAgICAgY29uc3Qgb2JqID0gQXJyYXkuaXNBcnJheShhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddKSA/IGFydGljbGVSZXNwb25zZS5yZXN1bHRPYmplY3RbJ29BcnRpY2xlJ11bMF0gOiBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0WydvQXJ0aWNsZSddO1xyXG4gICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBvYmopO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGFydGljbGUgPSA8QXJ0aWNsZT50aGlzLl9ib0ZhY3RvcnkubWFrZVdpdGhSYXdCYWNrZW5kRGF0YShBcnRpY2xlLCBhcnRpY2xlUmVzcG9uc2UucmVzdWx0T2JqZWN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fYXJ0aWNsZUNhY2hlLnNldChza3UsIGFydGljbGUpO1xyXG4gICAgdGhpcy5hcnRpY2xlTG9hZGVkLm5leHQoYXJ0aWNsZSk7XHJcbiAgICByZXR1cm4gYXJ0aWNsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2dldFNlbGVjdGlvbnMoaW5zdGFuY2VJZDogc3RyaW5nLCBwdWJsaWNhdGlvbkNvZGU/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NlbGVjdGlvbnMgPSBbXTtcclxuICAgIGNvbnN0IHNlbGVjdGlvblJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2VsZWN0aW9ucyhmYWxzZSwgcHVibGljYXRpb25Db2RlKTtcclxuICAgIGlmIChzZWxlY3Rpb25SZXNwb25zZSAmJiBzZWxlY3Rpb25SZXNwb25zZS5yZXN1bHRPYmplY3RzICYmIHNlbGVjdGlvblJlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9zZWxlY3Rpb25zID0gPFNlbGVjdGlvbltdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KFNlbGVjdGlvbiwgc2VsZWN0aW9uUmVzcG9uc2UucmVzdWx0T2JqZWN0cyk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGlvbnMuZm9yRWFjaChzID0+IHMuaW5zdGFuY2VJZCA9IGluc3RhbmNlSWQpO1xyXG4gICAgICAvLyBjb25zdCBmaWx0ZXJlZDogU2VsZWN0aW9uW10gPSB0aGlzLl9zZWxlY3Rpb25zLmZpbHRlcihzID0+IHMubm9kZVR5cGUgIT09IE5vZGVUeXBlLkFydGljbGUgJiYgcy5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5fc2VsZWN0aW9ucyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAnTm8gc2VsZWN0aW9ucyBmb3VuZCEnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfZ2V0RGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9kZWNvcyA9IFtdO1xyXG4gICAgY29uc3QgZGVjb3NSZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldERlY29zKGZhbHNlKTtcclxuICAgIGlmIChkZWNvc1Jlc3BvbnNlICYmIGRlY29zUmVzcG9uc2UucmVzdWx0T2JqZWN0cyAmJiBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9kZWNvcyA9IDxEZWNvTm9kZVtdPnRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCBkZWNvc1Jlc3BvbnNlLnJlc3VsdE9iamVjdHMpO1xyXG4gICAgICB0aGlzLmRlY29zUmVjZWl2ZWQubmV4dCh0aGlzLl9kZWNvcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyAnTm8gZGVjb25vZGVzIGZvdW5kISc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9saW5rU2VsZWN0aW9uc0FuZERlY29zKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25zIHx8ICF0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBsZW46IG51bWJlciA9IHRoaXMuX3NlbGVjdGlvbnMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAvLyBjb25zdCBpZDogc3RyaW5nID0gdGhpcy5zZWxlY3Rpb25zW2ldLmFydE5vZGVJZERlY287XHJcbiAgICAgIGxldCBkZWNvOiBhbnkgPSB0aGlzLl9kZWNvcy5maW5kKGQgPT4gZC5ub2RlSWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0ubm9kZSk7XHJcbiAgICAgIGlmICghZGVjbykge1xyXG4gICAgICAgIGRlY28gPSBuZXcgRGVjb05vZGUoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZGVjby50eXBlICE9PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uKSB7XHJcbiAgICAgICAgY29uc3QgdmFyaWF0aW9uOiBhbnkgPSB0aGlzLl9nZXRWYXJpYXRpb25zKCkuZmluZCh2ID0+IHYucGFyZW50SWQgPT09IHRoaXMuX3NlbGVjdGlvbnNbaV0uYXJ0Tm9kZUlkRGVjbyk7XHJcbiAgICAgICAgaWYgKHZhcmlhdGlvbikge1xyXG4gICAgICAgICAgZGVjby52YXJpYXRpb24gPSB2YXJpYXRpb247XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX3NlbGVjdGlvbnNbaV0uZGVjb05vZGUgPSBkZWNvO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VmFyaWF0aW9ucygpOiBEZWNvTm9kZVtdIHtcclxuICAgIGlmICh0aGlzLl9kZWNvcyAmJiB0aGlzLl9kZWNvcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2RlY29zLmZpbHRlcigoZGVjbzogRGVjb05vZGUpID0+IHtcclxuICAgICAgICByZXR1cm4gZGVjby50eXBlID09PSBEZWNvTm9kZVR5cGUuVmFyaWF0aW9uO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgX2xvYWRWYXJpYXRpb25zKG9iajogVEhSRUUuT2JqZWN0M0QpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX2xvZygnbG9hZCB2YXJpYXRpb24gZm9yIHBhcnRzJyk7XHJcbiAgICBhd2FpdCB0aGlzLl92YXJpYXRpb25IZWxwZXIubG9hZFBhcnQob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGZvciBhZGp1c3RhYmxlcycpO1xyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24ob2JqLCB0aGlzLl9hZGp1c3RhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGZvciBhZGRhYmxlcycpO1xyXG4gICAgYXdhaXQgdGhpcy5fdmFyaWF0aW9uSGVscGVyLmxvYWRWYXJpYXRpb24ob2JqLCB0aGlzLl9hZGRhYmxlcywgdHJ1ZSk7XHJcbiAgICB0aGlzLl9sb2coJ2xvYWQgdmFyaWF0aW9uIGNsZWFyIGNhY2hlJyk7XHJcbiAgICB0aGlzLl92YXJpYXRpb25IZWxwZXIuY2xlYXJDYWNoZSgpO1xyXG4gICAgdGhpcy5fbG9nKCdsb2FkIHZhcmlhdGlvbnMgZG9uZScpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0QWRqdXN0YWJsZXMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rpb25zIHx8ICF0aGlzLl9zZWxlY3Rpb25zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGU6IERlY29Ob2RlID0gcy5kZWNvTm9kZTtcclxuICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5nYW1lT2JqZWN0TmFtZSAmJiBub2RlLnR5cGUgPT09IERlY29Ob2RlVHlwZS5QYXJ0ICYmIG5vZGUua2luZCA9PT0gRGVjb05vZGVLaW5kLkFkanVzdGFibGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZVBpdm90KG9iajogVEhSRUUuT2JqZWN0M0QpIHtcclxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KG9iaik7XHJcbiAgICBjb25zdCBiYkNlbnRlclBpdm90ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGJvdW5kaW5nQm94LmdldENlbnRlcihiYkNlbnRlclBpdm90KTtcclxuICAgIGNvbnN0IGRlbHRhOiBUSFJFRS5WZWN0b3IzID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5zdWIoYmJDZW50ZXJQaXZvdCkuc2V0WShNYXRoLmFicyhNYXRoLm1pbihib3VuZGluZ0JveC5taW4ueSwgMCkpKTtcclxuXHJcbiAgICBvYmouY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjaGlsZC5wb3NpdGlvbi5hZGQoZGVsdGEpO1xyXG4gICAgfSk7XHJcbiAgICBvYmoudXBkYXRlV29ybGRNYXRyaXgoZmFsc2UsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzZXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wbGFjZWRBZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgdGhpcy5fcGxhY2VkQWRqdXN0YWJsZXMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuX2FkanVzdGFibGVzLmxlbmd0aCA9IDA7XHJcbiAgICB0aGlzLl9hZGRhYmxlcy5sZW5ndGggPSAwO1xyXG4gICAgLy8gdGhpcy5fcHJlcGFyZVRoZVNlbGVjdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xvZyhtZXNzYWdlOiBzdHJpbmcsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIHRoaXMuZGVidWcobWVzc2FnZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKG5ldyBEYXRlKCksIG1lc3NhZ2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=