@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,830 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { Injectable } from '@angular/core';
3
- import { Options } from '@colijnit/ioneconnector/build/model/options';
4
- import { Article } from '@colijnit/configuratorapi/build/model/article';
5
- import { BusinessObjectFactory } from '@colijnit/ioneconnector/build/service/business-object-factory';
6
- import { Selection } from '@colijnit/configuratorapi/build/model/selection';
7
- import { SelectorWithOptions } from '@colijnit/configuratorapi/build/model/selector-with-options';
8
- import { AnswerPrice } from '@colijnit/configuratorapi/build/model/answer-price';
9
- import { ImageContent } from '@colijnit/mainapi/build/model/image-content.bo';
10
- import { ArticleText } from '@colijnit/configuratorapi/build/model/article-text.bo';
11
- import { SkipButtonInfo } from '@colijnit/configuratorapi/build/model/skip-button-info';
12
- import { DecoNode } from '@colijnit/configuratorapi/build/model/deco-node';
13
- import { ResultType } from '../enum/result-type.enum';
14
- import { BehaviorSubject, Subject } from 'rxjs';
15
- import { ConfigurationResultObject } from '../model/configuration-result-object';
16
- import { ConfigurationTemplate } from '../enum/configuration-template.enum';
17
- import { TableName } from '@colijnit/mainapi/build/enum/table-name.enum';
18
- import { NodeType } from '@colijnit/configuratorapi/build/enum/node-type.enum';
19
- import { isNill } from '@colijnit/configuratorapi/build/utils/function/is-nill.function';
20
- import { ConfiguratorStatisticsEnvironment } from '@colijnit/configuratorapi/build/model/configurator-statistics-environment';
21
- import { ConfiguratorErrorMessage } from '../model/configurator-error-message';
22
- import * as i0 from "@angular/core";
23
- import * as i1 from "./configurator.service";
24
- import * as i2 from "./app-event.service";
25
- import * as i3 from "./settings.service";
26
- import * as i4 from "./loader.service";
27
- export class ConfiguratorConnectorService {
28
- constructor(_configuratorService, _appEventService, _settingsService, _loaderService) {
29
- this._configuratorService = _configuratorService;
30
- this._appEventService = _appEventService;
31
- this._settingsService = _settingsService;
32
- this._loaderService = _loaderService;
33
- this.controllerInitialized = new BehaviorSubject(false);
34
- this.standAloneInstance = new BehaviorSubject(false);
35
- this.connectionReset = new Subject();
36
- this.selectionsToDisplay = [];
37
- this.activeAnswers = [];
38
- this._selections = [];
39
- this._imageCache = new Map();
40
- this._connectorOptions = new Options();
41
- this._subs = [];
42
- this._initializing = false;
43
- this._initialized = false;
44
- this._boFactory = new BusinessObjectFactory();
45
- }
46
- get article() {
47
- return this._article;
48
- }
49
- set article(value) {
50
- this._article = value;
51
- }
52
- get sku() {
53
- return this._sku;
54
- }
55
- get objectResult() {
56
- return this._objectResult;
57
- }
58
- set objectResult(value) {
59
- this._objectResult = value;
60
- }
61
- get selections() {
62
- return this._selections;
63
- }
64
- set selections(value) {
65
- this._selections = value;
66
- }
67
- get decoNodes() {
68
- return this._decoNodes;
69
- }
70
- set decoNodes(value) {
71
- this._decoNodes = value;
72
- }
73
- get totalPrice() {
74
- return this._totalPrice;
75
- }
76
- get currentSelections() {
77
- return this._currentSelections;
78
- }
79
- get activeSelection() {
80
- return this._activeSelection;
81
- }
82
- set activeSelection(value) {
83
- this._activeSelection = value;
84
- }
85
- set selectionWithAnswers(value) {
86
- this._selectionWithAnswers = value;
87
- }
88
- get selectionWithAnswers() {
89
- return this._selectionWithAnswers;
90
- }
91
- get shouldShowLoader() {
92
- return this._shouldShowLoader;
93
- }
94
- ngOnDestroy() {
95
- this._imageCache.clear();
96
- this._subs.forEach(sub => sub.unsubscribe());
97
- }
98
- initConnection(forceReload, standAlone = false) {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- if ((this._initialized || this._initializing) && !forceReload) {
101
- return;
102
- }
103
- this._initializing = true;
104
- try {
105
- const settings = this._settingsService.settings;
106
- if (!settings) {
107
- throw Error('Settings are not defined!');
108
- }
109
- this._connectorOptions = Object.assign(new Options(), settings);
110
- this._subs.push(this._configuratorService.showLoader.subscribe(showLoader => this.onShowLoaderChange(showLoader)), this._configuratorService.connectionReset.subscribe(() => this.onConnectionReset()));
111
- yield this._configuratorService.initConnector(this._connectorOptions, forceReload);
112
- yield this._settingsService.checkAdditionalParameters();
113
- this.controllerInitialized.next(true);
114
- this._initialized = true;
115
- this._initializing = false;
116
- }
117
- catch (e) {
118
- this._initializing = false;
119
- }
120
- });
121
- }
122
- onShowLoaderChange(showLoader) {
123
- if (showLoader) {
124
- }
125
- this._loaderService.showLoader = showLoader;
126
- }
127
- onConnectionReset() {
128
- this.connectionReset.next();
129
- }
130
- getGoodIdFromSku(sku, showLoader = false) {
131
- return __awaiter(this, void 0, void 0, function* () {
132
- const response = yield this._configuratorService.getGoodIdFromSku(sku, showLoader);
133
- this._sku = sku;
134
- if (response && response.validationResult && response.validationResult.success) {
135
- return response.resultObject;
136
- }
137
- else {
138
- return null;
139
- }
140
- });
141
- }
142
- setSelections(selections) {
143
- // this._selections = value;
144
- this._prepareSelections(selections);
145
- }
146
- setDecoNodes(value) {
147
- this._decoNodes = value;
148
- }
149
- getArticleQuickSel(goodId, showLoader = true) {
150
- return __awaiter(this, void 0, void 0, function* () {
151
- const response = yield this._configuratorService.getArticleQuickSel(Number(goodId), showLoader);
152
- if (response && response.validationResult && response.validationResult.success) {
153
- return this._boFactory.makeWithRawBackendData(Article, response.resultObject.oArticle[0]);
154
- }
155
- return null;
156
- });
157
- }
158
- getArticleBySku(sku, branch) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- const goodId = yield this.getGoodIdFromSku(sku, true);
161
- const article = yield this.getArticleQuickSel(goodId.toString()).catch(e => {
162
- return Promise.reject(e);
163
- });
164
- this._appEventService.articleReceived.next(article);
165
- this._article = article;
166
- // Sometimes the sku is not returned in Article
167
- this._article.sku = sku;
168
- return article;
169
- });
170
- }
171
- initNodeInstance(goodId, showLoader = true) {
172
- return __awaiter(this, void 0, void 0, function* () {
173
- const response = yield this._configuratorService.initNodeInstance(Number(goodId), showLoader);
174
- return this._handleInstanceResponse(response);
175
- });
176
- }
177
- changeConnection(instanceId, oldConnection, newConnection, showLoader = true) {
178
- return __awaiter(this, void 0, void 0, function* () {
179
- const response = yield this._configuratorService.changeConnection(instanceId, oldConnection, newConnection, showLoader);
180
- return response && response.validationResult && response.validationResult.success;
181
- });
182
- }
183
- setInstance(instanceId, showLoader = false) {
184
- return __awaiter(this, void 0, void 0, function* () {
185
- const response = yield this._configuratorService.setInstanceToConfigure(instanceId, showLoader);
186
- return this._handleInstanceResponse(response);
187
- });
188
- }
189
- copyInstanceAndSaveOriginalConfiguration(instanceId, result) {
190
- return this._copyInstance(instanceId, true, result);
191
- }
192
- copyInstanceAndLoseOriginalConfiguration(instanceId, result) {
193
- return this._copyInstance(instanceId, false, result);
194
- }
195
- getQuestionAndAnswersAsync() {
196
- return __awaiter(this, void 0, void 0, function* () {
197
- const questionAndAnswers = yield this._configuratorService.getQuestionAndAnswersAsync();
198
- // When using a full config template, we got some shit
199
- // When we got a response with a question + answers, it means we got an option that got change by exceptions.
200
- // Save the option for exception, update the selectorStructor and make sure the costumer knows which choice needs to be checked
201
- if (questionAndAnswers.answers.length > 0 && this.article && this.article.showFullConfiguration) {
202
- this._exceptionQuestionChanged = questionAndAnswers.question; // TODO we should change this
203
- yield this.getSelectionsAsync();
204
- }
205
- questionAndAnswers.answers = questionAndAnswers.answers.filter(a => this._isAnswerPublished(a));
206
- this._appEventService.answerCountReceived.next(questionAndAnswers.answers.length);
207
- if (questionAndAnswers.answers.length === 0) {
208
- this.emptyAnswersAndQuestion();
209
- }
210
- else {
211
- this.activeQuestion = questionAndAnswers.question;
212
- this.activeAnswers = questionAndAnswers.answers;
213
- }
214
- this.handleAnswersReceived();
215
- return questionAndAnswers;
216
- });
217
- }
218
- emptyAnswersAndQuestion() {
219
- this.activeAnswers.length = 0;
220
- this.activeQuestion = undefined;
221
- }
222
- handleAnswersReceived() {
223
- this._preloadCachedImages(this.activeAnswers);
224
- if (this.activeAnswers && this.activeAnswers.length > 0) {
225
- this._loadPricesOfActiveAnswers();
226
- }
227
- }
228
- getSelectionsAndDecos() {
229
- return __awaiter(this, void 0, void 0, function* () {
230
- const selectionsAndDecoPromise = [];
231
- selectionsAndDecoPromise.push(this.getSelectionsAsync(), this.getDecosAsync());
232
- yield Promise.all(selectionsAndDecoPromise);
233
- });
234
- }
235
- getSelectionsAsync() {
236
- return __awaiter(this, void 0, void 0, function* () {
237
- let selections = [];
238
- this.selections.length = 0;
239
- const response = yield this._configuratorService.getSelectionsAsync();
240
- if (response && response.validationResult && response.validationResult.success) {
241
- selections = this._boFactory.makeBOArrayFromRawBackendDataArray(Selection, response.resultObjects);
242
- }
243
- if (this.article.showFullConfiguration) {
244
- this._appEventService.configurationTemplateChange.next(ConfigurationTemplate.showFullConfiguration);
245
- yield this._createSelectorFullConfiguration(selections);
246
- }
247
- else {
248
- this._appEventService.configurationTemplateChange.next(ConfigurationTemplate.default);
249
- this._prepareSelections(selections);
250
- }
251
- });
252
- }
253
- getDecosAsync() {
254
- return __awaiter(this, void 0, void 0, function* () {
255
- const response = yield this._configuratorService.getDecosAsync();
256
- if (response && response.validationResult && response.validationResult.success) {
257
- this._decoNodes = this._boFactory.makeBOArrayFromRawBackendDataArray(DecoNode, response.resultObjects);
258
- }
259
- });
260
- }
261
- selectAnswer(answer, input) {
262
- return this._configuratorService.selectAnswer(answer, false, input);
263
- }
264
- selectAnswerBySelection(selection, input) {
265
- return this._configuratorService.selectAnswerBySelection(selection, input);
266
- }
267
- navigateTo(choseValue, showLoader = false) {
268
- return this._configuratorService.navigateTo(choseValue, showLoader);
269
- }
270
- cancelAnswer(getAnswersAndQuestion = true) {
271
- return this._configuratorService.cancelAnswer();
272
- }
273
- selectSelection(selection, forceBackToNode, after, connector) {
274
- this._activeSelection = selection;
275
- return this._configuratorService.selectSelection(selection, forceBackToNode, after, connector);
276
- }
277
- deleteSelection(selection) {
278
- return this._configuratorService.deleteSelection(selection);
279
- }
280
- replaceSelection(selection) {
281
- return this._configuratorService.replaceSelection(selection);
282
- }
283
- getAnswerPrices() {
284
- return __awaiter(this, void 0, void 0, function* () {
285
- try {
286
- const response = yield this._configuratorService.getAnswersPrices();
287
- if (response && response.validationResult && response.validationResult.success) {
288
- if (response.resultObjects) {
289
- return this._boFactory.makeBOArrayFromRawBackendDataArray(AnswerPrice, response.resultObjects);
290
- }
291
- else {
292
- return this._boFactory.makeBOArrayFromRawBackendDataArray(AnswerPrice, response.resultObject['activeNodesPr']);
293
- }
294
- }
295
- return [];
296
- }
297
- catch (e) {
298
- }
299
- });
300
- }
301
- extendWithAnswerTextAndImage(answer, showLoader = true) {
302
- return __awaiter(this, void 0, void 0, function* () {
303
- if (answer.nodeId) {
304
- if (!this._imageCache.has(answer.nodeId)) {
305
- this.getImageForAnswerOrSelection(answer, 4, true, showLoader).then((imageData) => {
306
- this._handleImageReceived(answer, imageData);
307
- });
308
- }
309
- else {
310
- answer.imageData = this._imageCache.get(answer.nodeId);
311
- }
312
- }
313
- else {
314
- const textAndImage = yield this.getSkipButtonImageAndText(answer.goodId);
315
- answer.answer = textAndImage.oText;
316
- answer.commercialAnswer = textAndImage.oText;
317
- const image = textAndImage.oImage;
318
- const imageData = yield this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
319
- answer.imageData = this._handleImageResponse(imageData);
320
- // this.getSkipButtonImageAndText(answer.goodId).then((textAndImage) => {
321
- // answer.answer = textAndImage.oText;
322
- // answer.commercialAnswer = textAndImage.oText;
323
- // const image: CoDocument = textAndImage.oImage;
324
- //
325
- // const imageBody: string = ImageUtils.getDocBodyWithMimeTypeDefinition(image.fileName, image.documentBody);
326
- // answer.imageData = imageBody;
327
- // });
328
- }
329
- });
330
- }
331
- getSkipButtonImageAndText(goodId) {
332
- return __awaiter(this, void 0, void 0, function* () {
333
- const response = yield this._configuratorService.getSkipButtonImageAndText(goodId, false);
334
- if (response && response.validationResult && response.validationResult.success) {
335
- return this._boFactory.makeWithRawBackendData(SkipButtonInfo, response.resultObject);
336
- }
337
- return null;
338
- });
339
- }
340
- extendWithSelectionImage(selection, showLoader = true) {
341
- return __awaiter(this, void 0, void 0, function* () {
342
- if (selection.nodeId) {
343
- if (!this._imageCache.has(selection.nodeId)) {
344
- this.getImageForAnswerOrSelection(selection, 4, true, showLoader).then((imageData) => {
345
- this._handleImageReceived(selection, imageData);
346
- });
347
- }
348
- else {
349
- selection.imageData = this._imageCache.get(selection.nodeId);
350
- }
351
- this._prepareSelectionsToDisplayImages();
352
- }
353
- });
354
- }
355
- getImageForAnswerOrSelection(answerOrSelection, publication, thumbNail = true, showLoader = true) {
356
- return __awaiter(this, void 0, void 0, function* () {
357
- try {
358
- const response = yield this._configuratorService.getImage(answerOrSelection.nodeId, publication, thumbNail);
359
- return this._handleImageResponse(response);
360
- }
361
- catch (e) {
362
- }
363
- });
364
- }
365
- getMoodImageForInfoDialog(answerOrSelection, thumbNail = false) {
366
- return this.getImageForAnswerOrSelection(answerOrSelection, 32, thumbNail);
367
- }
368
- getAnswerInfo(answer) {
369
- return __awaiter(this, void 0, void 0, function* () {
370
- const response = yield this._configuratorService.getAnswerTexts(answer.nodeId, false);
371
- if (response && response.validationResult && response.validationResult.success) {
372
- return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleText, response.resultObject);
373
- }
374
- return [];
375
- });
376
- }
377
- getStructureInfo(answer) {
378
- return __awaiter(this, void 0, void 0, function* () {
379
- const response = yield this._configuratorService.getAnswerTexts(answer.artNodeId, false);
380
- if (response && response.validationResult && response.validationResult.success) {
381
- return this._boFactory.makeBOArrayFromRawBackendDataArray(ArticleText, response.resultObject);
382
- }
383
- return [];
384
- });
385
- }
386
- getInternalParameter(parameter) {
387
- return __awaiter(this, void 0, void 0, function* () {
388
- try {
389
- const response = yield this._configuratorService.getInternalParameterValue(parameter);
390
- if (response && response.validationResult && response.validationResult.success) {
391
- return response.resultObject;
392
- }
393
- else {
394
- return '';
395
- }
396
- }
397
- catch (e) {
398
- }
399
- });
400
- }
401
- emptySelections() {
402
- if (this.selections && this.selections.length > 0) {
403
- this.selections.length = 0;
404
- }
405
- if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
406
- this.selectionsToDisplay.length = 0;
407
- }
408
- if (this.decoNodes && this.decoNodes.length > 0) {
409
- this.decoNodes.length = 0;
410
- }
411
- }
412
- saveConfigurations() {
413
- return __awaiter(this, void 0, void 0, function* () {
414
- const success = yield this._configuratorService.saveConfigurations();
415
- if (!success) {
416
- console.error('error saving configurations');
417
- }
418
- });
419
- }
420
- getDefaultLanguage(upId) {
421
- return __awaiter(this, void 0, void 0, function* () {
422
- return yield this._configuratorService.getDefaultLanguage(upId);
423
- });
424
- }
425
- googleTranslateEnabled() {
426
- return this._configuratorService.googleTranslateEnabled();
427
- }
428
- getGoogleTranslation(sourceLang, targetLang, list) {
429
- return __awaiter(this, void 0, void 0, function* () {
430
- return yield this._configuratorService.getGoogleTranslation(sourceLang, targetLang, list);
431
- });
432
- }
433
- getImageForAnswer(selectedOption, showLoader = true) {
434
- return __awaiter(this, void 0, void 0, function* () {
435
- if (selectedOption.artNodeId) {
436
- if (!this._imageCache.has(selectedOption.artNodeId)) {
437
- this._configuratorService.getImageForSelectorStructure(selectedOption, 4, true, showLoader).then((imageData) => {
438
- this._handleImageReceivedForSelectorStructure(selectedOption, imageData);
439
- });
440
- }
441
- else {
442
- selectedOption.imageData = this._imageCache.get(selectedOption.artNodeId);
443
- }
444
- }
445
- else {
446
- const textAndImage = yield this.getSkipButtonImageAndText(selectedOption.artId);
447
- selectedOption.optionText = textAndImage.oText;
448
- selectedOption.optionText = textAndImage.oText;
449
- const image = textAndImage.oImage;
450
- const imageData = yield this._configuratorService.getImage(image.key, 4, true, TableName.InternalParam);
451
- selectedOption.imageData = this._handleImageResponse(imageData);
452
- }
453
- });
454
- }
455
- addToCart(goodId, goodType, quantity, instanceId, externalSource) {
456
- return __awaiter(this, void 0, void 0, function* () {
457
- let json;
458
- const statistics = new ConfiguratorStatisticsEnvironment();
459
- statistics.userType = 'Homedecorator';
460
- statistics.transactionType = 'Sales';
461
- statistics.actionDomain = 'Homedecorator';
462
- statistics.sessionId = this._settingsService.settings.session ? this._settingsService.settings.session.sessionId : 'unknown';
463
- statistics.webHost = window.location.host;
464
- statistics.bundleHost = window.location.host;
465
- json = yield this.getJsonConfiguredArticles(goodId, goodType, quantity, externalSource, true, instanceId, statistics);
466
- const frozenArticle = JSON.parse(json);
467
- // TODO
468
- // this._googleTagManager.sendEvent(GoogleTagManagerEvent.AddToCart, {
469
- // 'articleNr': frozenArticle.articleNr,
470
- // 'product': frozenArticle.articleName,
471
- // 'composition': frozenArticle instanceof FrozenArticle ? frozenArticle.compositions : frozenArticle.configurationText
472
- // });
473
- // this._messageService.emit(MessageType.ArticleCreated, json);
474
- return json;
475
- });
476
- }
477
- getJsonConfiguredArticles(goodId, goodType, quantity, externalSource = false, showLoader = true, instanceId, configuratorStatistics) {
478
- return this._configuratorService.getJsonConfiguredArticles(goodId, goodType, quantity, externalSource, showLoader, instanceId, configuratorStatistics);
479
- }
480
- isSelectionPublished(selection) {
481
- return this._getPublicationCode() === 2 ||
482
- // tslint:disable-next-line:max-line-length
483
- ((isNill(selection.hierarchicalPublicationCode) || ((selection.hierarchicalPublicationCode & this._getPublicationCode()) > 0)) &&
484
- ((selection.nodeType === NodeType.Question && (((selection.questionPublicationCode & this._getPublicationCode()) > 0) ||
485
- isNill(selection.questionPublicationCode))) ||
486
- (selection.nodeType === NodeType.Answer && (((selection.answerPublicationCode & this._getPublicationCode()) > 0) ||
487
- isNill(selection.answerPublicationCode)))));
488
- }
489
- _prepareSelections(selections) {
490
- this._selections = selections.slice(0);
491
- this._prepareSelectionsToDisplay();
492
- let totalPrice = 0;
493
- if (this._selections) {
494
- this._selections.forEach(selection => {
495
- totalPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
496
- });
497
- }
498
- this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
499
- this._currentSelections = this.selections.slice();
500
- }
501
- _prepareSelectionsToDisplay() {
502
- this._prepareAnswersAndImages(this.selections);
503
- const allSelections = this.selections.filter(s => this._isAllSelectionPublished(s));
504
- this.selectionsToDisplay = allSelections.filter(s => s.nodeType !== NodeType.Article && s.presentationLevel === 1);
505
- this._appEventService.selectionsReceived.next(this.selections);
506
- }
507
- _prepareAnswersAndImages(selections) {
508
- for (let i = 0; i < selections.length; i++) {
509
- const selection = selections[i];
510
- if (selection.presentationLevel === 1) {
511
- this._handleSelectionAnswers(selection, selections);
512
- }
513
- }
514
- this._preloadCachedImages(this.selections);
515
- }
516
- _handleSelectionAnswers(selection, selections) {
517
- const allAnswersFromSelection = selections.filter(s => s.parentArtNodeIdDeco && selection.nodeId && s.parentArtNodeIdDeco.toString() === selection.nodeId.toString());
518
- const answersFromSelection = this._getUniqueAnswers(allAnswersFromSelection);
519
- this._prepareSelectionsNextOptionValues(answersFromSelection);
520
- selection.lastAnswer = (answersFromSelection.length > 0) && answersFromSelection[answersFromSelection.length - 1].answer ?
521
- answersFromSelection[answersFromSelection.length - 1].answer.trim() :
522
- '';
523
- selection.lastAnswerNodeId = answersFromSelection.length > 0 ? answersFromSelection[answersFromSelection.length - 1].nodeId : undefined;
524
- let answerTree;
525
- let answerTreeString;
526
- if (answersFromSelection.length > 0) {
527
- answerTree = answersFromSelection
528
- .filter(s => this._isAllSelectionPublished(s) || s.userInput)
529
- .map((s, idx, arr) => {
530
- return {
531
- title: s.userInput ? (s.answer ? s.answer.trim() : '') : (s.question ? s.question.trim() : ''),
532
- description: s.userInput ? (s.userInputValue ? s.userInputValue.trim() : '') : (s.answer ? s.answer.trim() : ''),
533
- price: s.artRetailPrice
534
- };
535
- });
536
- answerTreeString = answersFromSelection
537
- .filter(s => this._isAllSelectionPublished(s) || s.userInput)
538
- .map((s, idx, arr) => {
539
- return s.userInput ? (s.userInputValue ? s.userInputValue.trim() : '') : (s.answer ? s.answer.trim() : '');
540
- }).join(' - ');
541
- }
542
- selection.answerTreeString = answerTreeString;
543
- if (answerTree) {
544
- selection.answerTree = JSON.stringify(answerTree);
545
- }
546
- else {
547
- selection.answerTree = JSON.stringify([{
548
- title: selection.userInput ? (selection.answer ? selection.answer.trim() : '') : (selection.question ? selection.question.trim() : ''),
549
- description: selection.userInput ? (selection.userInputValue ? selection.userInputValue.trim() : '') : (selection.answer ? selection.answer.trim() : ''),
550
- price: selection.artRetailPrice
551
- }]);
552
- }
553
- let totalPrice = 0; // temp fix until backend is ready
554
- answersFromSelection.forEach((s) => {
555
- totalPrice += s.artRetailPrice ? s.artRetailPrice : 0; // temp fix until backend is ready
556
- });
557
- selection.totalPrice = totalPrice; // temp fix until backend is ready
558
- }
559
- _isSelectionPublished(s) {
560
- return (s.nodeType === NodeType.Question && (((s.optionShowOn & 2097152) > 0) || isNill(s.optionShowOn))) ||
561
- (s.nodeType === NodeType.Answer && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn)));
562
- }
563
- _isAllSelectionPublished(s) {
564
- return (s.nodeType === NodeType.Question && (((s.optionShowOn & 2097152) > 0) || isNill(s.optionShowOn))) ||
565
- (s.nodeType === NodeType.NextOptionValue && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn))) ||
566
- (s.nodeType === NodeType.Answer && (((s.nodeShowOn & 2097152) > 0) || isNill(s.nodeShowOn)));
567
- }
568
- _isAnswerPublished(a) {
569
- return (isNill(a.hierarchicalPublicationCode) || ((a.hierarchicalPublicationCode & this._getPublicationCode()) > 0)) /* &&
570
- (
571
- (a.type === NodeType.Question && (((a.optionShowOn & 2097152) > 0) || isNill(a.optionShowOn))) ||
572
- (a.type === NodeType.Answer && (((a.nodeShowOn & 2097152) > 0) || isNill(a.nodeShowOn)))
573
- )*/;
574
- }
575
- _getPublicationCode() {
576
- return this._configuratorService.getPublicationCodeBasedOnLogin();
577
- }
578
- _getUniqueAnswers(selections) {
579
- if (!selections || selections.length === 0) {
580
- return [];
581
- }
582
- const uniqueAnswers = new Map();
583
- selections.forEach(selection => {
584
- if (!uniqueAnswers.has(selection.nodeId)) {
585
- uniqueAnswers.set(selection.nodeId, selection);
586
- }
587
- else {
588
- const existingSelection = uniqueAnswers.get(selection.nodeId);
589
- existingSelection.artRetailPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
590
- }
591
- });
592
- return Array.from(uniqueAnswers.values());
593
- }
594
- _preloadCachedImages(answersOrSelections) {
595
- answersOrSelections.forEach((answerOrSelection) => {
596
- if (answerOrSelection.nodeId) {
597
- if (this._imageCache.has(answerOrSelection.nodeId)) {
598
- answerOrSelection.imageData = this._imageCache.get(answerOrSelection.nodeId);
599
- }
600
- }
601
- });
602
- }
603
- _handleInstanceResponse(response) {
604
- if (response && response.validationResult && response.validationResult.success) {
605
- this._appEventService.instanceSet.next(response.resultObject);
606
- }
607
- return response;
608
- }
609
- _prepareSelectionsNextOptionValues(selections) {
610
- const len = selections.length - 1;
611
- let novText = '';
612
- for (let i = len; i >= 0; i--) {
613
- const selection = selections[i];
614
- if (selection.nodeType === NodeType.NextOptionValue) {
615
- novText = selection.answer + (novText ? ` - ${novText}` : '');
616
- }
617
- else {
618
- if (novText) {
619
- selection.answerTreeString = `${selection.answer} - ${novText}`;
620
- }
621
- novText = '';
622
- }
623
- }
624
- }
625
- /*
626
- *
627
- * Show full config stuff
628
- *
629
- * */
630
- _createSelectorFullConfiguration(selections) {
631
- return __awaiter(this, void 0, void 0, function* () {
632
- this._selections = selections.slice(0);
633
- this._prepareSelectionsToDisplay();
634
- let struct = [];
635
- let totalPrice = 0;
636
- if (this._selections) {
637
- this._selections.forEach(selection => {
638
- totalPrice += selection.artRetailPrice ? selection.artRetailPrice : 0;
639
- });
640
- }
641
- this._totalPrice = Math.round((totalPrice + Number.EPSILON) * 100) / 100;
642
- let selectorStructureList = [];
643
- const selectorStructure = yield this._configuratorService.getSelectorStructure();
644
- if (selectorStructure.validationResult.success) {
645
- if (selectorStructure.resultObjects) {
646
- selectorStructureList = selectorStructure.resultObjects;
647
- }
648
- else {
649
- selectorStructureList = selectorStructure.resultObject['structures'];
650
- }
651
- }
652
- const filteredList = selectorStructureList.filter(s => this._isStructurePublished(s));
653
- struct = this._buildStructureThree(filteredList);
654
- this._markLastNodeWithChildren(struct);
655
- if (this._exceptionQuestionChanged) {
656
- struct = this._linkExceptionToOption(this._exceptionQuestionChanged, struct);
657
- }
658
- this.selectionWithAnswers = struct;
659
- });
660
- }
661
- _buildStructureThree(items) {
662
- const map = {};
663
- const structuredList = [];
664
- items.forEach(item => {
665
- const option = new SelectorWithOptions();
666
- option.selector = item;
667
- option.selectorOptions = [];
668
- map[item.id] = option;
669
- });
670
- items.forEach(item => {
671
- if (map[item.parentId]) {
672
- map[item.parentId].selectorOptions.push(map[item.id]);
673
- }
674
- else {
675
- structuredList.push(map[item.id]);
676
- }
677
- });
678
- return structuredList;
679
- }
680
- _markLastNodeWithChildren(nodes) {
681
- nodes.forEach(node => {
682
- if (node.selectorOptions.length > 0) {
683
- this._markLastNodeWithChildren(node.selectorOptions);
684
- const lastElementWithChildren = node.selectorOptions.every(child => child.selectorOptions.length === 0);
685
- if (lastElementWithChildren) {
686
- node.lastNodeWithChildren = true;
687
- }
688
- }
689
- });
690
- }
691
- _isStructurePublished(s) {
692
- return (isNill(s.hierarchicalPublicationCode) || ((s.hierarchicalPublicationCode & this._getPublicationCode()) > 0));
693
- }
694
- // POSTCONDITION: current activeAnswers have price values.
695
- _loadPricesOfActiveAnswers() {
696
- return __awaiter(this, void 0, void 0, function* () {
697
- const answerPrices = yield this.getAnswerPrices();
698
- if (answerPrices) {
699
- answerPrices.forEach(answerPrice => {
700
- const answerMatch = this.activeAnswers.find(ans => ans.node === answerPrice.selId);
701
- if (answerMatch) {
702
- answerMatch.price = answerPrice.addRetailPrice;
703
- this._appEventService.extraAnswerDataLoaded.next();
704
- }
705
- });
706
- }
707
- });
708
- }
709
- _cacheImage(id, imageDataOrUrl) {
710
- this._imageCache.set(id, imageDataOrUrl);
711
- }
712
- _handleImageReceived(answerOrSelection, imageData) {
713
- let imageDataOrUrl;
714
- if (imageData) {
715
- if (imageData.match(/data:image/) || imageData.startsWith('http') || imageData.startsWith('www')) {
716
- imageDataOrUrl = imageData;
717
- }
718
- else {
719
- if (this.assetPath && !this.assetPath.endsWith('/')) {
720
- this.assetPath += '/';
721
- }
722
- if (imageData.startsWith('/')) {
723
- imageData = imageData.substr(1, imageData.length);
724
- }
725
- imageDataOrUrl = (this.assetPath ? this.assetPath : '') + imageData;
726
- }
727
- }
728
- answerOrSelection.imageData = imageDataOrUrl === undefined ? '' : imageDataOrUrl;
729
- this._cacheImage(answerOrSelection.nodeId, imageDataOrUrl ? imageDataOrUrl : '');
730
- }
731
- _prepareSelectionsToDisplayImages() {
732
- if (this.selectionsToDisplay && this.selectionsToDisplay.length > 0) {
733
- for (let i = 0; i < this.selectionsToDisplay.length; i++) {
734
- const selection = this.selectionsToDisplay[i];
735
- const lastAnswerSelection = this._selections.find(s => s.nodeId === selection.lastAnswerNodeId);
736
- if (lastAnswerSelection && (selection.generic || selection.grouped)) {
737
- if (!lastAnswerSelection.imageData) {
738
- this.getImageForAnswerOrSelection(lastAnswerSelection, 4, true, false).then((imageData) => {
739
- this._handleImageReceived(lastAnswerSelection, imageData);
740
- selection.imageDataLastAnswer = lastAnswerSelection.imageData;
741
- });
742
- }
743
- else {
744
- selection.imageDataLastAnswer = lastAnswerSelection.imageData;
745
- }
746
- }
747
- }
748
- }
749
- }
750
- _copyInstance(originalInstanceId, shouldSaveCurrentInstanceId, result) {
751
- return __awaiter(this, void 0, void 0, function* () {
752
- if (!result) {
753
- result = new ConfigurationResultObject();
754
- }
755
- const copyInstanceResponse = yield this._configuratorService.copyInstance(originalInstanceId, shouldSaveCurrentInstanceId).catch((e) => {
756
- if (e === 'ECONNABORTED' || e === undefined) {
757
- result.resultType = ResultType.Timeout;
758
- return Promise.reject(result);
759
- }
760
- result.resultType = ResultType.Unknown;
761
- result.errorMessages.push(new ConfiguratorErrorMessage(copyInstanceResponse.resultObject.data));
762
- return Promise.reject(result);
763
- });
764
- if (copyInstanceResponse.validationResult && !copyInstanceResponse.validationResult.success) {
765
- if (copyInstanceResponse.validationResult.messages.map((m) => m.messageType === 'E') !== undefined) {
766
- result.resultType = ResultType.ConfigurationNotFixed;
767
- copyInstanceResponse.validationResult.messages.forEach(m => {
768
- result.errorMessages.push(new ConfiguratorErrorMessage(m.message));
769
- });
770
- return Promise.reject(result);
771
- }
772
- else {
773
- result.resultType = ResultType.ConfigurationPartiallyFixed;
774
- }
775
- }
776
- const newInstanceId = copyInstanceResponse.resultObject;
777
- this._handleInstanceResponse(copyInstanceResponse);
778
- return Promise.resolve(newInstanceId);
779
- });
780
- }
781
- _handleImageReceivedForSelectorStructure(option, imageData) {
782
- let imageDataOrUrl;
783
- if (imageData) {
784
- if (imageData.match(/data:image/) || imageData.startsWith('http') || imageData.startsWith('www')) {
785
- imageDataOrUrl = imageData;
786
- }
787
- else {
788
- if (this.assetPath && !this.assetPath.endsWith('/')) {
789
- this.assetPath += '/';
790
- }
791
- if (imageData.startsWith('/')) {
792
- imageData = imageData.substr(1, imageData.length);
793
- }
794
- imageDataOrUrl = (this.assetPath ? this.assetPath : '') + imageData;
795
- }
796
- }
797
- option.imageData = imageDataOrUrl === undefined ? '' : imageDataOrUrl;
798
- this._cacheImage(option.artNodeId, imageDataOrUrl ? imageDataOrUrl : '');
799
- }
800
- _handleImageResponse(response) {
801
- if (response && response.validationResult && response.validationResult.success && response.resultObject) {
802
- const imageContent = this._boFactory.makeWithRawBackendData(ImageContent, response.resultObject);
803
- if (imageContent.image !== null && imageContent.image !== undefined && imageContent.image !== '') {
804
- return imageContent.image;
805
- }
806
- else {
807
- return '';
808
- }
809
- }
810
- else {
811
- return '';
812
- }
813
- }
814
- _linkExceptionToOption(exceptionQuestion, struct) {
815
- struct.forEach(struct => {
816
- if (struct.selector.optId === exceptionQuestion.optionId) {
817
- struct.markForExceptionNotification = true;
818
- }
819
- });
820
- this._exceptionQuestionChanged = undefined; // reset
821
- return struct;
822
- }
823
- }
824
- ConfiguratorConnectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, deps: [{ token: i1.ConfiguratorService }, { token: i2.AppEventService }, { token: i3.SettingsService }, { token: i4.LoaderService }], target: i0.ɵɵFactoryTarget.Injectable });
825
- ConfiguratorConnectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, providedIn: 'root' });
826
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ConfiguratorConnectorService, decorators: [{
827
- type: Injectable,
828
- args: [{ providedIn: 'root' }]
829
- }], ctorParameters: function () { return [{ type: i1.ConfiguratorService }, { type: i2.AppEventService }, { type: i3.SettingsService }, { type: i4.LoaderService }]; } });
830
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29uZmlndXJhdG9yL3NyYy9saWIvc2VydmljZXMvY29uZmlndXJhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBR3BELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSw2Q0FBNkMsQ0FBQztBQUVwRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sK0RBQStELENBQUM7QUFDcEcsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGlEQUFpRCxDQUFDO0FBSzFFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDZEQUE2RCxDQUFDO0FBRWhHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUUvRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDNUUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHVEQUF1RCxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUV0RixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0saURBQWlELENBQUM7QUFDekUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRXBELE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHNDQUFzQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztB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ZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTZXJ2aWNlfSBmcm9tICcuL2NvbmZpZ3VyYXRvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtEYXRhU2VydmljZVJlc3BvbnNlRGF0YX0gZnJvbSAnQGNvbGlqbml0L2lvbmVjb25uZWN0b3IvYnVpbGQvbW9kZWwvZGF0YS1zZXJ2aWNlLXJlc3BvbnNlLWRhdGEnO1xyXG5pbXBvcnQge09wdGlvbnN9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL21vZGVsL29wdGlvbnMnO1xyXG5pbXBvcnQge0FwcEV2ZW50U2VydmljZX0gZnJvbSAnLi9hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7QXJ0aWNsZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hcnRpY2xlJztcclxuaW1wb3J0IHtCdXNpbmVzc09iamVjdEZhY3Rvcnl9IGZyb20gJ0Bjb2xpam5pdC9pb25lY29ubmVjdG9yL2J1aWxkL3NlcnZpY2UvYnVzaW5lc3Mtb2JqZWN0LWZhY3RvcnknO1xyXG5pbXBvcnQge1NlbGVjdGlvbn0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9zZWxlY3Rpb24nO1xyXG5cclxuaW1wb3J0IHtBbnN3ZXJ9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvYW5zd2VyJztcclxuXHJcbmltcG9ydCB7U2VsZWN0b3JTdHJ1Y3R1cmV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2VsZWN0b3Itc3RydWN0dXJlLmJvJztcclxuaW1wb3J0IHtTZWxlY3RvcldpdGhPcHRpb25zfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3NlbGVjdG9yLXdpdGgtb3B0aW9ucyc7XHJcbmltcG9ydCB7UXVlc3Rpb25BbmRBbnN3ZXJzfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uLWFuZC1hbnN3ZXJzJztcclxuaW1wb3J0IHtBbnN3ZXJQcmljZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9hbnN3ZXItcHJpY2UnO1xyXG5pbXBvcnQge1F1ZXN0aW9ufSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL3F1ZXN0aW9uJztcclxuaW1wb3J0IHtJbWFnZUNvbnRlbnR9IGZyb20gJ0Bjb2xpam5pdC9tYWluYXBpL2J1aWxkL21vZGVsL2ltYWdlLWNvbnRlbnQuYm8nO1xyXG5pbXBvcnQge0FydGljbGVUZXh0fSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2FydGljbGUtdGV4dC5ibyc7XHJcbmltcG9ydCB7U2tpcEJ1dHRvbkluZm99IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvc2tpcC1idXR0b24taW5mbyc7XHJcbmltcG9ydCB7SW50ZXJuYWxQYXJhbX0gZnJvbSAnQGNvbGlqbml0L21haW5hcGkvYnVpbGQvZW51bS9pbnRlcm5hbC1wYXJhbS5lbnVtJztcclxuaW1wb3J0IHtEZWNvTm9kZX0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9kZWNvLW5vZGUnO1xyXG5pbXBvcnQge1Jlc3VsdFR5cGV9IGZyb20gJy4uL2VudW0vcmVzdWx0LXR5cGUuZW51bSc7XHJcbmltcG9ydCB7Q29Eb2N1bWVudH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC9tb2RlbC9jby1kb2N1bWVudCc7XHJcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge0NvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3R9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRpb24tcmVzdWx0LW9iamVjdCc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblRlbXBsYXRlfSBmcm9tICcuLi9lbnVtL2NvbmZpZ3VyYXRpb24tdGVtcGxhdGUuZW51bSc7XHJcbmltcG9ydCB7VGFibGVOYW1lfSBmcm9tICdAY29saWpuaXQvbWFpbmFwaS9idWlsZC9lbnVtL3RhYmxlLW5hbWUuZW51bSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdG9yU2V0dGluZ3N9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRvci1zZXR0aW5ncyc7XHJcbmltcG9ydCB7U2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL3NldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0xvYWRlclNlcnZpY2V9IGZyb20gJy4vbG9hZGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge05vZGVUeXBlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL2VudW0vbm9kZS10eXBlLmVudW0nO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JTdGF0aXN0aWNzRW52aXJvbm1lbnR9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvY29uZmlndXJhdG9yLXN0YXRpc3RpY3MtZW52aXJvbm1lbnQnO1xyXG5pbXBvcnQge0Zyb3plbkFydGljbGVTaW1wbGV9IGZyb20gJ0Bjb2xpam5pdC9jb25maWd1cmF0b3JhcGkvYnVpbGQvbW9kZWwvZnJvemVuLWFydGljbGUtc2ltcGxlJztcclxuaW1wb3J0IHtGcm96ZW5BcnRpY2xlfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL21vZGVsL2Zyb3plbi1hcnRpY2xlJztcclxuaW1wb3J0IHtDb25maWd1cmF0b3JFcnJvck1lc3NhZ2V9IGZyb20gJy4uL21vZGVsL2NvbmZpZ3VyYXRvci1lcnJvci1tZXNzYWdlJztcclxuXHJcbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxyXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdG9yQ29ubmVjdG9yU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnZXQgYXJ0aWNsZSgpOiBBcnRpY2xlIHtcclxuICAgIHJldHVybiB0aGlzLl9hcnRpY2xlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhcnRpY2xlKHZhbHVlOiBBcnRpY2xlKSB7XHJcbiAgICB0aGlzLl9hcnRpY2xlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGdldCBza3UoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9za3U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9iamVjdFJlc3VsdCgpOiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9vYmplY3RSZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IG9iamVjdFJlc3VsdCh2YWx1ZTogQ29uZmlndXJhdGlvblJlc3VsdE9iamVjdCkge1xyXG4gICAgdGhpcy5fb2JqZWN0UmVzdWx0ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHNlbGVjdGlvbnMoKTogU2VsZWN0aW9uW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNlbGVjdGlvbnModmFsdWU6IFNlbGVjdGlvbltdKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRlY29Ob2RlcygpOiBEZWNvTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvTm9kZXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGRlY29Ob2Rlcyh2YWx1ZTogRGVjb05vZGVbXSkge1xyXG4gICAgdGhpcy5fZGVjb05vZGVzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRvdGFsUHJpY2UoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl90b3RhbFByaWNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U2VsZWN0aW9ucygpOiBTZWxlY3Rpb25bXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFNlbGVjdGlvbnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFjdGl2ZVNlbGVjdGlvbigpOiBTZWxlY3Rpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgYWN0aXZlU2VsZWN0aW9uKHZhbHVlOiBTZWxlY3Rpb24pIHtcclxuICAgIHRoaXMuX2FjdGl2ZVNlbGVjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzZWxlY3Rpb25XaXRoQW5zd2Vycyh2YWx1ZTogU2VsZWN0b3JXaXRoT3B0aW9uc1tdKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25XaXRoQW5zd2VycyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWxlY3Rpb25XaXRoQW5zd2VycygpOiBTZWxlY3RvcldpdGhPcHRpb25zW10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbldpdGhBbnN3ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzaG91bGRTaG93TG9hZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nob3VsZFNob3dMb2FkZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29udHJvbGxlckluaXRpYWxpemVkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgc3RhbmRBbG9uZUluc3RhbmNlOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcclxuICBwdWJsaWMgY29ubmVjdGlvblJlc2V0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHNlbGVjdGlvbnNUb0Rpc3BsYXk6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHVibGljIGFjdGl2ZVF1ZXN0aW9uOiBRdWVzdGlvbjtcclxuICBwdWJsaWMgYWN0aXZlQW5zd2VyczogQW5zd2VyW10gPSBbXTtcclxuICBwdWJsaWMgYXNzZXRQYXRoOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGlvbnM6IFNlbGVjdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfY3VycmVudFNlbGVjdGlvbnM6IFNlbGVjdGlvbltdO1xyXG4gIHByaXZhdGUgX2FjdGl2ZVNlbGVjdGlvbjogU2VsZWN0aW9uO1xyXG4gIHByaXZhdGUgX3NlbGVjdGlvbldpdGhBbnN3ZXJzOiBTZWxlY3RvcldpdGhPcHRpb25zW107XHJcbiAgcHJpdmF0ZSBfZGVjb05vZGVzOiBEZWNvTm9kZVtdO1xyXG4gIHByaXZhdGUgX2FydGljbGU6IEFydGljbGU7XHJcbiAgcHJpdmF0ZSBfc2t1OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfb2JqZWN0UmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0O1xyXG4gIHByaXZhdGUgX3RvdGFsUHJpY2U6IG51bWJlcjtcclxuICBwcml2YXRlIF9pbWFnZUNhY2hlOiBNYXA8bnVtYmVyLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwcml2YXRlIF9leGNlcHRpb25RdWVzdGlvbkNoYW5nZWQ6IEFuc3dlcjtcclxuXHJcbiAgcHJpdmF0ZSBfc2hvdWxkU2hvd0xvYWRlcjogYm9vbGVhbjtcclxuICBwcml2YXRlIF9jb25uZWN0b3JPcHRpb25zOiBPcHRpb25zID0gbmV3IE9wdGlvbnMoKTtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX2JvRmFjdG9yeTogQnVzaW5lc3NPYmplY3RGYWN0b3J5ID0gbmV3IEJ1c2luZXNzT2JqZWN0RmFjdG9yeSgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRvclNlcnZpY2U6IENvbmZpZ3VyYXRvclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfbG9hZGVyU2VydmljZTogTG9hZGVyU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbWFnZUNhY2hlLmNsZWFyKCk7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2goc3ViID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0Q29ubmVjdGlvbihmb3JjZVJlbG9hZD86IGJvb2xlYW4sIHN0YW5kQWxvbmU6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCh0aGlzLl9pbml0aWFsaXplZCB8fCB0aGlzLl9pbml0aWFsaXppbmcpICYmICFmb3JjZVJlbG9hZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pbml0aWFsaXppbmcgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3Qgc2V0dGluZ3M6IENvbmZpZ3VyYXRvclNldHRpbmdzID0gdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzO1xyXG4gICAgICBpZiAoIXNldHRpbmdzKSB7XHJcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1NldHRpbmdzIGFyZSBub3QgZGVmaW5lZCEnKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9jb25uZWN0b3JPcHRpb25zID0gT2JqZWN0LmFzc2lnbihuZXcgT3B0aW9ucygpLCBzZXR0aW5ncyk7XHJcblxyXG4gICAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgICAgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zaG93TG9hZGVyLnN1YnNjcmliZShzaG93TG9hZGVyID0+IHRoaXMub25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXIpKSxcclxuICAgICAgICB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmNvbm5lY3Rpb25SZXNldC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkNvbm5lY3Rpb25SZXNldCgpKVxyXG4gICAgICApO1xyXG4gICAgICBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXRDb25uZWN0b3IodGhpcy5fY29ubmVjdG9yT3B0aW9ucywgZm9yY2VSZWxvYWQpO1xyXG4gICAgICBhd2FpdCB0aGlzLl9zZXR0aW5nc1NlcnZpY2UuY2hlY2tBZGRpdGlvbmFsUGFyYW1ldGVycygpO1xyXG5cclxuICAgICAgdGhpcy5jb250cm9sbGVySW5pdGlhbGl6ZWQubmV4dCh0cnVlKTtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9pbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgdGhpcy5faW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TaG93TG9hZGVyQ2hhbmdlKHNob3dMb2FkZXI6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChzaG93TG9hZGVyKSB7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9sb2FkZXJTZXJ2aWNlLnNob3dMb2FkZXIgPSBzaG93TG9hZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ29ubmVjdGlvblJlc2V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb25uZWN0aW9uUmVzZXQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdvb2RJZEZyb21Ta3Uoc2t1OiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8bnVtYmVyPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEdvb2RJZEZyb21Ta3Uoc2t1LCBzaG93TG9hZGVyKTtcclxuICAgIHRoaXMuX3NrdSA9IHNrdTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSkge1xyXG4gICAgLy8gdGhpcy5fc2VsZWN0aW9ucyA9IHZhbHVlO1xyXG4gICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RGVjb05vZGVzKHZhbHVlOiBEZWNvTm9kZVtdKSB7XHJcbiAgICB0aGlzLl9kZWNvTm9kZXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkOiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTxBcnRpY2xlPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEFydGljbGVRdWlja1NlbChOdW1iZXIoZ29vZElkKSwgc2hvd0xvYWRlcik7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEFydGljbGUsIHJlc3BvbnNlLnJlc3VsdE9iamVjdC5vQXJ0aWNsZVswXSkgYXMgQXJ0aWNsZTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFydGljbGVCeVNrdShza3U6IHN0cmluZywgYnJhbmNoOiBzdHJpbmcpOiBQcm9taXNlPEFydGljbGU+IHtcclxuICAgIGNvbnN0IGdvb2RJZDogbnVtYmVyID0gYXdhaXQgdGhpcy5nZXRHb29kSWRGcm9tU2t1KHNrdSwgdHJ1ZSk7XHJcbiAgICBjb25zdCBhcnRpY2xlOiBBcnRpY2xlID0gYXdhaXQgdGhpcy5nZXRBcnRpY2xlUXVpY2tTZWwoZ29vZElkLnRvU3RyaW5nKCkpLmNhdGNoKGUgPT4ge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hcnRpY2xlUmVjZWl2ZWQubmV4dChhcnRpY2xlKTtcclxuICAgIHRoaXMuX2FydGljbGUgPSBhcnRpY2xlO1xyXG4gICAgLy8gU29tZXRpbWVzIHRoZSBza3UgaXMgbm90IHJldHVybmVkIGluIEFydGljbGVcclxuICAgIHRoaXMuX2FydGljbGUuc2t1ID0gc2t1O1xyXG4gICAgcmV0dXJuIGFydGljbGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaW5pdE5vZGVJbnN0YW5jZShnb29kSWQ6IHN0cmluZywgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmluaXROb2RlSW5zdGFuY2UoTnVtYmVyKGdvb2RJZCksIHNob3dMb2FkZXIpO1xyXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UocmVzcG9uc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGNoYW5nZUNvbm5lY3Rpb24oaW5zdGFuY2VJZDogc3RyaW5nLCBvbGRDb25uZWN0aW9uOiBzdHJpbmcsIG5ld0Nvbm5lY3Rpb246IHN0cmluZywgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuY2hhbmdlQ29ubmVjdGlvbihpbnN0YW5jZUlkLCBvbGRDb25uZWN0aW9uLCBuZXdDb25uZWN0aW9uLCBzaG93TG9hZGVyKTtcclxuICAgIHJldHVybiByZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRJbnN0YW5jZShpbnN0YW5jZUlkOiBzdHJpbmcsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2Uuc2V0SW5zdGFuY2VUb0NvbmZpZ3VyZShpbnN0YW5jZUlkLCBzaG93TG9hZGVyKTtcclxuICAgIHJldHVybiB0aGlzLl9oYW5kbGVJbnN0YW5jZVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5SW5zdGFuY2VBbmRTYXZlT3JpZ2luYWxDb25maWd1cmF0aW9uKGluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgdHJ1ZSwgcmVzdWx0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5SW5zdGFuY2VBbmRMb3NlT3JpZ2luYWxDb25maWd1cmF0aW9uKGluc3RhbmNlSWQ6IHN0cmluZywgcmVzdWx0OiBDb25maWd1cmF0aW9uUmVzdWx0T2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb3B5SW5zdGFuY2UoaW5zdGFuY2VJZCwgZmFsc2UsIHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0UXVlc3Rpb25BbmRBbnN3ZXJzQXN5bmMoKTogUHJvbWlzZTxRdWVzdGlvbkFuZEFuc3dlcnM+IHtcclxuICAgIGNvbnN0IHF1ZXN0aW9uQW5kQW5zd2VyczogUXVlc3Rpb25BbmRBbnN3ZXJzID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRRdWVzdGlvbkFuZEFuc3dlcnNBc3luYygpO1xyXG5cclxuICAgIC8vIFdoZW4gdXNpbmcgYSBmdWxsIGNvbmZpZyB0ZW1wbGF0ZSwgd2UgZ290IHNvbWUgc2hpdFxyXG4gICAgLy8gV2hlbiB3ZSBnb3QgYSByZXNwb25zZSB3aXRoIGEgcXVlc3Rpb24gKyBhbnN3ZXJzLCBpdCBtZWFucyB3ZSBnb3QgYW4gb3B0aW9uIHRoYXQgZ290IGNoYW5nZSBieSBleGNlcHRpb25zLlxyXG4gICAgLy8gU2F2ZSB0aGUgb3B0aW9uIGZvciBleGNlcHRpb24sIHVwZGF0ZSB0aGUgc2VsZWN0b3JTdHJ1Y3RvciBhbmQgbWFrZSBzdXJlIHRoZSBjb3N0dW1lciBrbm93cyB3aGljaCBjaG9pY2UgbmVlZHMgdG8gYmUgY2hlY2tlZFxyXG4gICAgaWYgKHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5hcnRpY2xlICYmIHRoaXMuYXJ0aWNsZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkID0gcXVlc3Rpb25BbmRBbnN3ZXJzLnF1ZXN0aW9uIGFzIGFueTsgLy8gVE9ETyB3ZSBzaG91bGQgY2hhbmdlIHRoaXNcclxuICAgICAgYXdhaXQgdGhpcy5nZXRTZWxlY3Rpb25zQXN5bmMoKTtcclxuICAgIH1cclxuXHJcbiAgICBxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2VycyA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5hbnN3ZXJzLmZpbHRlcihhID0+IHRoaXMuX2lzQW5zd2VyUHVibGlzaGVkKGEpKTtcclxuICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hbnN3ZXJDb3VudFJlY2VpdmVkLm5leHQocXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnMubGVuZ3RoKTtcclxuICAgIGlmIChxdWVzdGlvbkFuZEFuc3dlcnMuYW5zd2Vycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5lbXB0eUFuc3dlcnNBbmRRdWVzdGlvbigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVRdWVzdGlvbiA9IHF1ZXN0aW9uQW5kQW5zd2Vycy5xdWVzdGlvbjtcclxuICAgICAgdGhpcy5hY3RpdmVBbnN3ZXJzID0gcXVlc3Rpb25BbmRBbnN3ZXJzLmFuc3dlcnM7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhbmRsZUFuc3dlcnNSZWNlaXZlZCgpO1xyXG5cclxuICAgIHJldHVybiBxdWVzdGlvbkFuZEFuc3dlcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZW1wdHlBbnN3ZXJzQW5kUXVlc3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLmFjdGl2ZUFuc3dlcnMubGVuZ3RoID0gMDtcclxuICAgIHRoaXMuYWN0aXZlUXVlc3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQW5zd2Vyc1JlY2VpdmVkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5fcHJlbG9hZENhY2hlZEltYWdlcyh0aGlzLmFjdGl2ZUFuc3dlcnMpO1xyXG4gICAgaWYgKHRoaXMuYWN0aXZlQW5zd2VycyAmJiB0aGlzLmFjdGl2ZUFuc3dlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl9sb2FkUHJpY2VzT2ZBY3RpdmVBbnN3ZXJzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTZWxlY3Rpb25zQW5kRGVjb3MoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2U6IFByb21pc2U8YW55PltdID0gW107XHJcbiAgICBzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2UucHVzaCh0aGlzLmdldFNlbGVjdGlvbnNBc3luYygpLCB0aGlzLmdldERlY29zQXN5bmMoKSk7XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZWxlY3Rpb25zQW5kRGVjb1Byb21pc2UpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNlbGVjdGlvbnNBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IFtdO1xyXG4gICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdGlvbnNBc3luYygpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHNlbGVjdGlvbnMgPSB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShTZWxlY3Rpb24sIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIFNlbGVjdGlvbltdO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYXJ0aWNsZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pIHtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmNvbmZpZ3VyYXRpb25UZW1wbGF0ZUNoYW5nZS5uZXh0KENvbmZpZ3VyYXRpb25UZW1wbGF0ZS5zaG93RnVsbENvbmZpZ3VyYXRpb24pO1xyXG4gICAgICBhd2FpdCB0aGlzLl9jcmVhdGVTZWxlY3RvckZ1bGxDb25maWd1cmF0aW9uKHNlbGVjdGlvbnMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmNvbmZpZ3VyYXRpb25UZW1wbGF0ZUNoYW5nZS5uZXh0KENvbmZpZ3VyYXRpb25UZW1wbGF0ZS5kZWZhdWx0KTtcclxuICAgICAgdGhpcy5fcHJlcGFyZVNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0RGVjb3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0RGVjb3NBc3luYygpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMuX2RlY29Ob2RlcyA9IHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KERlY29Ob2RlLCByZXNwb25zZS5yZXN1bHRPYmplY3RzKSBhcyBEZWNvTm9kZVtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdEFuc3dlcihhbnN3ZXI6IEFuc3dlciwgaW5wdXQ/OiBzdHJpbmcpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RBbnN3ZXIoYW5zd2VyLCBmYWxzZSwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbGVjdEFuc3dlckJ5U2VsZWN0aW9uKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBpbnB1dD86IHN0cmluZyk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLnNlbGVjdEFuc3dlckJ5U2VsZWN0aW9uKHNlbGVjdGlvbiwgaW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5hdmlnYXRlVG8oY2hvc2VWYWx1ZTogU2VsZWN0b3JTdHJ1Y3R1cmUsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLm5hdmlnYXRlVG8oY2hvc2VWYWx1ZSwgc2hvd0xvYWRlcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsQW5zd2VyKGdldEFuc3dlcnNBbmRRdWVzdGlvbjogYm9vbGVhbiA9IHRydWUpOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5jYW5jZWxBbnN3ZXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RTZWxlY3Rpb24oXHJcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbixcclxuICAgIGZvcmNlQmFja1RvTm9kZT86IGJvb2xlYW4sXHJcbiAgICBhZnRlcj86IGJvb2xlYW4sXHJcbiAgICBjb25uZWN0b3I/OiBzdHJpbmdcclxuICApOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICB0aGlzLl9hY3RpdmVTZWxlY3Rpb24gPSBzZWxlY3Rpb247XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zZWxlY3RTZWxlY3Rpb24oc2VsZWN0aW9uLCBmb3JjZUJhY2tUb05vZGUsIGFmdGVyLCBjb25uZWN0b3IpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb246IFNlbGVjdGlvbik6IFByb21pc2U8RGF0YVNlcnZpY2VSZXNwb25zZURhdGE+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmRlbGV0ZVNlbGVjdGlvbihzZWxlY3Rpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcGxhY2VTZWxlY3Rpb24oc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBQcm9taXNlPERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5yZXBsYWNlU2VsZWN0aW9uKHNlbGVjdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0QW5zd2VyUHJpY2VzKCk6IFByb21pc2U8QW5zd2VyUHJpY2VbXT4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBbnN3ZXJzUHJpY2VzKCk7XHJcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRPYmplY3RzKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VCT0FycmF5RnJvbVJhd0JhY2tlbmREYXRhQXJyYXkoQW5zd2VyUHJpY2UsIHJlc3BvbnNlLnJlc3VsdE9iamVjdHMpIGFzIEFuc3dlclByaWNlW107XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShBbnN3ZXJQcmljZSwgcmVzcG9uc2UucmVzdWx0T2JqZWN0WydhY3RpdmVOb2Rlc1ByJ10pIGFzIEFuc3dlclByaWNlW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoQW5zd2VyVGV4dEFuZEltYWdlKGFuc3dlcjogQW5zd2VyLCBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGFuc3dlci5ub2RlSWQpIHtcclxuICAgICAgaWYgKCF0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXIubm9kZUlkKSkge1xyXG4gICAgICAgIHRoaXMuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihhbnN3ZXIsIDQsIHRydWUsIHNob3dMb2FkZXIpLnRoZW4oKGltYWdlRGF0YTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkKGFuc3dlciwgaW1hZ2VEYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faW1hZ2VDYWNoZS5nZXQoYW5zd2VyLm5vZGVJZCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHRleHRBbmRJbWFnZTogU2tpcEJ1dHRvbkluZm8gPSBhd2FpdCB0aGlzLmdldFNraXBCdXR0b25JbWFnZUFuZFRleHQoYW5zd2VyLmdvb2RJZCk7XHJcbiAgICAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIGFuc3dlci5jb21tZXJjaWFsQW5zd2VyID0gdGV4dEFuZEltYWdlLm9UZXh0O1xyXG4gICAgICBjb25zdCBpbWFnZTogQ29Eb2N1bWVudCA9IHRleHRBbmRJbWFnZS5vSW1hZ2U7XHJcbiAgICAgIGNvbnN0IGltYWdlRGF0YTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEltYWdlKGltYWdlLmtleSwgNCwgdHJ1ZSwgVGFibGVOYW1lLkludGVybmFsUGFyYW0pO1xyXG4gICAgICBhbnN3ZXIuaW1hZ2VEYXRhID0gdGhpcy5faGFuZGxlSW1hZ2VSZXNwb25zZShpbWFnZURhdGEpO1xyXG5cclxuICAgICAgLy8gdGhpcy5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGFuc3dlci5nb29kSWQpLnRoZW4oKHRleHRBbmRJbWFnZSkgPT4ge1xyXG4gICAgICAvLyAgIGFuc3dlci5hbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIC8vICAgYW5zd2VyLmNvbW1lcmNpYWxBbnN3ZXIgPSB0ZXh0QW5kSW1hZ2Uub1RleHQ7XHJcbiAgICAgIC8vICAgY29uc3QgaW1hZ2U6IENvRG9jdW1lbnQgPSB0ZXh0QW5kSW1hZ2Uub0ltYWdlO1xyXG4gICAgICAvL1xyXG4gICAgICAvLyAgIGNvbnN0IGltYWdlQm9keTogc3RyaW5nID0gSW1hZ2VVdGlscy5nZXREb2NCb2R5V2l0aE1pbWVUeXBlRGVmaW5pdGlvbihpbWFnZS5maWxlTmFtZSwgaW1hZ2UuZG9jdW1lbnRCb2R5KTtcclxuICAgICAgLy8gICBhbnN3ZXIuaW1hZ2VEYXRhID0gaW1hZ2VCb2R5O1xyXG4gICAgICAvLyB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KGdvb2RJZD86IG51bWJlcik6IFByb21pc2U8U2tpcEJ1dHRvbkluZm8+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0U2tpcEJ1dHRvbkltYWdlQW5kVGV4dChnb29kSWQsIGZhbHNlKTtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2Vzcykge1xyXG4gICAgICByZXR1cm4gdGhpcy5fYm9GYWN0b3J5Lm1ha2VXaXRoUmF3QmFja2VuZERhdGEoU2tpcEJ1dHRvbkluZm8sIHJlc3BvbnNlLnJlc3VsdE9iamVjdCkgYXMgU2tpcEJ1dHRvbkluZm87XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHRlbmRXaXRoU2VsZWN0aW9uSW1hZ2Uoc2VsZWN0aW9uOiBTZWxlY3Rpb24sIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2VsZWN0aW9uLm5vZGVJZCkge1xyXG4gICAgICBpZiAoIXRoaXMuX2ltYWdlQ2FjaGUuaGFzKHNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgdGhpcy5nZXRJbWFnZUZvckFuc3dlck9yU2VsZWN0aW9uKHNlbGVjdGlvbiwgNCwgdHJ1ZSwgc2hvd0xvYWRlcikudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWQoc2VsZWN0aW9uLCBpbWFnZURhdGEpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChzZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheUltYWdlcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oXHJcbiAgICBhbnN3ZXJPclNlbGVjdGlvbjogQW5zd2VyIHwgU2VsZWN0aW9uLFxyXG4gICAgcHVibGljYXRpb246IG51bWJlcixcclxuICAgIHRodW1iTmFpbDogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBzaG93TG9hZGVyOiBib29sZWFuID0gdHJ1ZVxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXNwb25zZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldEltYWdlKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCwgcHVibGljYXRpb24sIHRodW1iTmFpbCk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVJbWFnZVJlc3BvbnNlKHJlc3BvbnNlKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRNb29kSW1hZ2VGb3JJbmZvRGlhbG9nKGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24sIHRodW1iTmFpbDogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLmdldEltYWdlRm9yQW5zd2VyT3JTZWxlY3Rpb24oYW5zd2VyT3JTZWxlY3Rpb24sIDMyLCB0aHVtYk5haWwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEFuc3dlckluZm8oYW5zd2VyOiBBbnN3ZXIpOiBQcm9taXNlPEFydGljbGVUZXh0W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0QW5zd2VyVGV4dHMoYW5zd2VyLm5vZGVJZCwgZmFsc2UpO1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9ib0ZhY3RvcnkubWFrZUJPQXJyYXlGcm9tUmF3QmFja2VuZERhdGFBcnJheShBcnRpY2xlVGV4dCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KSBhcyBBcnRpY2xlVGV4dFtdO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFN0cnVjdHVyZUluZm8oYW5zd2VyOiBTZWxlY3RvclN0cnVjdHVyZSk6IFByb21pc2U8QXJ0aWNsZVRleHRbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRBbnN3ZXJUZXh0cyhhbnN3ZXIuYXJ0Tm9kZUlkLCBmYWxzZSk7XHJcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2JvRmFjdG9yeS5tYWtlQk9BcnJheUZyb21SYXdCYWNrZW5kRGF0YUFycmF5KEFydGljbGVUZXh0LCByZXNwb25zZS5yZXN1bHRPYmplY3QpIGFzIEFydGljbGVUZXh0W107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0SW50ZXJuYWxQYXJhbWV0ZXIocGFyYW1ldGVyOiBJbnRlcm5hbFBhcmFtKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0SW50ZXJuYWxQYXJhbWV0ZXJWYWx1ZShwYXJhbWV0ZXIpO1xyXG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdCAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0T2JqZWN0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVtcHR5U2VsZWN0aW9ucygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbnMgJiYgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3Rpb25zLmxlbmd0aCA9IDA7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPSAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGVjb05vZGVzICYmIHRoaXMuZGVjb05vZGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5kZWNvTm9kZXMubGVuZ3RoID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzYXZlQ29uZmlndXJhdGlvbnMoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzdWNjZXNzOiBib29sZWFuID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbnMoKTtcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvciBzYXZpbmcgY29uZmlndXJhdGlvbnMnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXREZWZhdWx0TGFuZ3VhZ2UodXBJZDogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldERlZmF1bHRMYW5ndWFnZSh1cElkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb29nbGVUcmFuc2xhdGVFbmFibGVkKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ29vZ2xlVHJhbnNsYXRlRW5hYmxlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldEdvb2dsZVRyYW5zbGF0aW9uKHNvdXJjZUxhbmc6IHN0cmluZywgdGFyZ2V0TGFuZzogc3RyaW5nLCBsaXN0OiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRHb29nbGVUcmFuc2xhdGlvbihzb3VyY2VMYW5nLCB0YXJnZXRMYW5nLCBsaXN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRJbWFnZUZvckFuc3dlcihzZWxlY3RlZE9wdGlvbjogU2VsZWN0b3JTdHJ1Y3R1cmUsIHNob3dMb2FkZXI6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoc2VsZWN0ZWRPcHRpb24uYXJ0Tm9kZUlkKSB7XHJcbiAgICAgIGlmICghdGhpcy5faW1hZ2VDYWNoZS5oYXMoc2VsZWN0ZWRPcHRpb24uYXJ0Tm9kZUlkKSkge1xyXG4gICAgICAgIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0SW1hZ2VGb3JTZWxlY3RvclN0cnVjdHVyZShzZWxlY3RlZE9wdGlvbiwgNCwgdHJ1ZSwgc2hvd0xvYWRlcikudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZUltYWdlUmVjZWl2ZWRGb3JTZWxlY3RvclN0cnVjdHVyZShzZWxlY3RlZE9wdGlvbiwgaW1hZ2VEYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RlZE9wdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChzZWxlY3RlZE9wdGlvbi5hcnROb2RlSWQpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCB0ZXh0QW5kSW1hZ2U6IFNraXBCdXR0b25JbmZvID0gYXdhaXQgdGhpcy5nZXRTa2lwQnV0dG9uSW1hZ2VBbmRUZXh0KHNlbGVjdGVkT3B0aW9uLmFydElkKTtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS5vVGV4dDtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24ub3B0aW9uVGV4dCA9IHRleHRBbmRJbWFnZS5vVGV4dDtcclxuICAgICAgY29uc3QgaW1hZ2U6IENvRG9jdW1lbnQgPSB0ZXh0QW5kSW1hZ2Uub0ltYWdlO1xyXG4gICAgICBjb25zdCBpbWFnZURhdGE6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhID0gYXdhaXQgdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRJbWFnZShpbWFnZS5rZXksIDQsIHRydWUsIFRhYmxlTmFtZS5JbnRlcm5hbFBhcmFtKTtcclxuICAgICAgc2VsZWN0ZWRPcHRpb24uaW1hZ2VEYXRhID0gdGhpcy5faGFuZGxlSW1hZ2VSZXNwb25zZShpbWFnZURhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGFkZFRvQ2FydChnb29kSWQ6IG51bWJlciwgZ29vZFR5cGU6IHN0cmluZywgcXVhbnRpdHk6IG51bWJlciwgaW5zdGFuY2VJZDogc3RyaW5nLCBleHRlcm5hbFNvdXJjZTogYm9vbGVhbik6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBsZXQganNvbjogc3RyaW5nO1xyXG4gICAgY29uc3Qgc3RhdGlzdGljczogQ29uZmlndXJhdG9yU3RhdGlzdGljc0Vudmlyb25tZW50ID0gbmV3IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCgpO1xyXG4gICAgc3RhdGlzdGljcy51c2VyVHlwZSA9ICdIb21lZGVjb3JhdG9yJztcclxuICAgIHN0YXRpc3RpY3MudHJhbnNhY3Rpb25UeXBlID0gJ1NhbGVzJztcclxuICAgIHN0YXRpc3RpY3MuYWN0aW9uRG9tYWluID0gJ0hvbWVkZWNvcmF0b3InO1xyXG4gICAgc3RhdGlzdGljcy5zZXNzaW9uSWQgPSB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2Vzc2lvbiA/IHRoaXMuX3NldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zZXNzaW9uLnNlc3Npb25JZCA6ICd1bmtub3duJztcclxuICAgIHN0YXRpc3RpY3Mud2ViSG9zdCA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0O1xyXG4gICAgc3RhdGlzdGljcy5idW5kbGVIb3N0ID0gd2luZG93LmxvY2F0aW9uLmhvc3Q7XHJcbiAgICBqc29uID0gYXdhaXQgdGhpcy5nZXRKc29uQ29uZmlndXJlZEFydGljbGVzKGdvb2RJZCwgZ29vZFR5cGUsIHF1YW50aXR5LCBleHRlcm5hbFNvdXJjZSwgdHJ1ZSwgaW5zdGFuY2VJZCwgc3RhdGlzdGljcyk7XHJcbiAgICBjb25zdCBmcm96ZW5BcnRpY2xlOiBGcm96ZW5BcnRpY2xlU2ltcGxlIHwgRnJvemVuQXJ0aWNsZSA9IEpTT04ucGFyc2UoanNvbik7XHJcblxyXG4gICAgLy8gVE9ET1xyXG4gICAgLy8gdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kRXZlbnQoR29vZ2xlVGFnTWFuYWdlckV2ZW50LkFkZFRvQ2FydCwge1xyXG4gICAgLy8gICAnYXJ0aWNsZU5yJzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTnIsXHJcbiAgICAvLyAgICdwcm9kdWN0JzogZnJvemVuQXJ0aWNsZS5hcnRpY2xlTmFtZSxcclxuICAgIC8vICAgJ2NvbXBvc2l0aW9uJzogZnJvemVuQXJ0aWNsZSBpbnN0YW5jZW9mIEZyb3plbkFydGljbGUgPyBmcm96ZW5BcnRpY2xlLmNvbXBvc2l0aW9ucyA6IGZyb3plbkFydGljbGUuY29uZmlndXJhdGlvblRleHRcclxuICAgIC8vIH0pO1xyXG5cclxuICAgIC8vIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQXJ0aWNsZUNyZWF0ZWQsIGpzb24pO1xyXG4gICAgcmV0dXJuIGpzb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0SnNvbkNvbmZpZ3VyZWRBcnRpY2xlcyhcclxuICAgIGdvb2RJZDogbnVtYmVyLFxyXG4gICAgZ29vZFR5cGU6IHN0cmluZyxcclxuICAgIHF1YW50aXR5OiBudW1iZXIsXHJcbiAgICBleHRlcm5hbFNvdXJjZTogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgc2hvd0xvYWRlcjogYm9vbGVhbiA9IHRydWUsXHJcbiAgICBpbnN0YW5jZUlkPzogc3RyaW5nLFxyXG4gICAgY29uZmlndXJhdG9yU3RhdGlzdGljcz86IENvbmZpZ3VyYXRvclN0YXRpc3RpY3NFbnZpcm9ubWVudCk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdG9yU2VydmljZS5nZXRKc29uQ29uZmlndXJlZEFydGljbGVzKFxyXG4gICAgICBnb29kSWQsXHJcbiAgICAgIGdvb2RUeXBlLFxyXG4gICAgICBxdWFudGl0eSxcclxuICAgICAgZXh0ZXJuYWxTb3VyY2UsXHJcbiAgICAgIHNob3dMb2FkZXIsXHJcbiAgICAgIGluc3RhbmNlSWQsXHJcbiAgICAgIGNvbmZpZ3VyYXRvclN0YXRpc3RpY3NcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNTZWxlY3Rpb25QdWJsaXNoZWQoc2VsZWN0aW9uOiBTZWxlY3Rpb24pOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9nZXRQdWJsaWNhdGlvbkNvZGUoKSA9PT0gMiB8fFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIChcclxuICAgICAgICAoaXNOaWxsKHNlbGVjdGlvbi5oaWVyYXJjaGljYWxQdWJsaWNhdGlvbkNvZGUpIHx8ICgoc2VsZWN0aW9uLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKSAmJlxyXG4gICAgICAgIChcclxuICAgICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHNlbGVjdGlvbi5xdWVzdGlvblB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApIHx8XHJcbiAgICAgICAgICAgIGlzTmlsbChzZWxlY3Rpb24ucXVlc3Rpb25QdWJsaWNhdGlvbkNvZGUpKSkgfHxcclxuICAgICAgICAgIChzZWxlY3Rpb24ubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChzZWxlY3Rpb24uYW5zd2VyUHVibGljYXRpb25Db2RlICYgdGhpcy5fZ2V0UHVibGljYXRpb25Db2RlKCkpID4gMCkgfHxcclxuICAgICAgICAgICAgaXNOaWxsKHNlbGVjdGlvbi5hbnN3ZXJQdWJsaWNhdGlvbkNvZGUpKSlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgdGhpcy5fc2VsZWN0aW9ucyA9IHNlbGVjdGlvbnMuc2xpY2UoMCk7XHJcbiAgICB0aGlzLl9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpO1xyXG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbnMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgdG90YWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3RvdGFsUHJpY2UgPSBNYXRoLnJvdW5kKCh0b3RhbFByaWNlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcclxuICAgIHRoaXMuX2N1cnJlbnRTZWxlY3Rpb25zID0gdGhpcy5zZWxlY3Rpb25zLnNsaWNlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc1RvRGlzcGxheSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgICBjb25zdCBhbGxTZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSA9IHRoaXMuc2VsZWN0aW9ucy5maWx0ZXIocyA9PiB0aGlzLl9pc0FsbFNlbGVjdGlvblB1Ymxpc2hlZChzKSk7XHJcbiAgICB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXkgPSBhbGxTZWxlY3Rpb25zLmZpbHRlcihzID0+IHMubm9kZVR5cGUgIT09IE5vZGVUeXBlLkFydGljbGUgJiYgcy5wcmVzZW50YXRpb25MZXZlbCA9PT0gMSk7XHJcbiAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2Uuc2VsZWN0aW9uc1JlY2VpdmVkLm5leHQodGhpcy5zZWxlY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ByZXBhcmVBbnN3ZXJzQW5kSW1hZ2VzKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLnByZXNlbnRhdGlvbkxldmVsID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlU2VsZWN0aW9uQW5zd2VycyhzZWxlY3Rpb24sIHNlbGVjdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9wcmVsb2FkQ2FjaGVkSW1hZ2VzKHRoaXMuc2VsZWN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVTZWxlY3Rpb25BbnN3ZXJzKHNlbGVjdGlvbjogU2VsZWN0aW9uLCBzZWxlY3Rpb25zOiBTZWxlY3Rpb25bXSk6IHZvaWQge1xyXG4gICAgY29uc3QgYWxsQW5zd2Vyc0Zyb21TZWxlY3Rpb246IFNlbGVjdGlvbltdID0gc2VsZWN0aW9ucy5maWx0ZXIoXHJcbiAgICAgIHMgPT4gcy5wYXJlbnRBcnROb2RlSWREZWNvICYmIHNlbGVjdGlvbi5ub2RlSWQgJiYgcy5wYXJlbnRBcnROb2RlSWREZWNvLnRvU3RyaW5nKCkgPT09IHNlbGVjdGlvbi5ub2RlSWQudG9TdHJpbmcoKSk7XHJcbiAgICBjb25zdCBhbnN3ZXJzRnJvbVNlbGVjdGlvbjogU2VsZWN0aW9uW10gPSB0aGlzLl9nZXRVbmlxdWVBbnN3ZXJzKGFsbEFuc3dlcnNGcm9tU2VsZWN0aW9uKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zTmV4dE9wdGlvblZhbHVlcyhhbnN3ZXJzRnJvbVNlbGVjdGlvbik7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlciA9IChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSAmJiBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIgP1xyXG4gICAgICBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5hbnN3ZXIudHJpbSgpIDpcclxuICAgICAgJyc7XHJcbiAgICBzZWxlY3Rpb24ubGFzdEFuc3dlck5vZGVJZCA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uLmxlbmd0aCA+IDAgPyBhbnN3ZXJzRnJvbVNlbGVjdGlvblthbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggLSAxXS5ub2RlSWQgOiB1bmRlZmluZWQ7XHJcbiAgICBsZXQgYW5zd2VyVHJlZTogYW55O1xyXG4gICAgbGV0IGFuc3dlclRyZWVTdHJpbmc6IHN0cmluZztcclxuICAgIGlmIChhbnN3ZXJzRnJvbVNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFuc3dlclRyZWUgPSBhbnN3ZXJzRnJvbVNlbGVjdGlvblxyXG4gICAgICAgIC5maWx0ZXIocyA9PiB0aGlzLl9pc0FsbFNlbGVjdGlvblB1Ymxpc2hlZChzKSB8fCBzLnVzZXJJbnB1dClcclxuICAgICAgICAubWFwKChzOiBTZWxlY3Rpb24sIGlkeDogbnVtYmVyLCBhcnI6IFNlbGVjdGlvbltdKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0aXRsZTogcy51c2VySW5wdXQgPyAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJykgOiAocy5xdWVzdGlvbiA/IHMucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcy51c2VySW5wdXQgPyAocy51c2VySW5wdXRWYWx1ZSA/IHMudXNlcklucHV0VmFsdWUudHJpbSgpIDogJycpIDogKHMuYW5zd2VyID8gcy5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgICAgICBwcmljZTogcy5hcnRSZXRhaWxQcmljZVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlcnNGcm9tU2VsZWN0aW9uXHJcbiAgICAgICAgLmZpbHRlcihzID0+IHRoaXMuX2lzQWxsU2VsZWN0aW9uUHVibGlzaGVkKHMpIHx8IHMudXNlcklucHV0KVxyXG4gICAgICAgIC5tYXAoKHM6IFNlbGVjdGlvbiwgaWR4OiBudW1iZXIsIGFycjogU2VsZWN0aW9uW10pID0+IHtcclxuICAgICAgICAgIHJldHVybiBzLnVzZXJJbnB1dCA/IChzLnVzZXJJbnB1dFZhbHVlID8gcy51c2VySW5wdXRWYWx1ZS50cmltKCkgOiAnJykgOiAocy5hbnN3ZXIgPyBzLmFuc3dlci50cmltKCkgOiAnJyk7XHJcbiAgICAgICAgfSkuam9pbignIC0gJyk7XHJcbiAgICB9XHJcbiAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGFuc3dlclRyZWVTdHJpbmc7XHJcbiAgICBpZiAoYW5zd2VyVHJlZSkge1xyXG4gICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZSA9IEpTT04uc3RyaW5naWZ5KGFuc3dlclRyZWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0aW9uLmFuc3dlclRyZWUgPSBKU09OLnN0cmluZ2lmeShbe1xyXG4gICAgICAgIHRpdGxlOiBzZWxlY3Rpb24udXNlcklucHV0ID8gKHNlbGVjdGlvbi5hbnN3ZXIgPyBzZWxlY3Rpb24uYW5zd2VyLnRyaW0oKSA6ICcnKSA6IChzZWxlY3Rpb24ucXVlc3Rpb24gPyBzZWxlY3Rpb24ucXVlc3Rpb24udHJpbSgpIDogJycpLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBzZWxlY3Rpb24udXNlcklucHV0ID8gKHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZSA/IHNlbGVjdGlvbi51c2VySW5wdXRWYWx1ZS50cmltKCkgOiAnJykgOiAoc2VsZWN0aW9uLmFuc3dlciA/IHNlbGVjdGlvbi5hbnN3ZXIudHJpbSgpIDogJycpLFxyXG4gICAgICAgIHByaWNlOiBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2VcclxuICAgICAgfV0pO1xyXG4gICAgfVxyXG4gICAgbGV0IHRvdGFsUHJpY2U6IG51bWJlciA9IDA7IC8vIHRlbXAgZml4IHVudGlsIGJhY2tlbmQgaXMgcmVhZHlcclxuICAgIGFuc3dlcnNGcm9tU2VsZWN0aW9uLmZvckVhY2goKHM6IFNlbGVjdGlvbikgPT4ge1xyXG4gICAgICB0b3RhbFByaWNlICs9IHMuYXJ0UmV0YWlsUHJpY2UgPyBzLmFydFJldGFpbFByaWNlIDogMDsgLy8gdGVtcCBmaXggdW50aWwgYmFja2VuZCBpcyByZWFkeVxyXG4gICAgfSk7XHJcbiAgICAoc2VsZWN0aW9uIGFzIGFueSkudG90YWxQcmljZSA9IHRvdGFsUHJpY2U7IC8vIHRlbXAgZml4IHVudGlsIGJhY2tlbmQgaXMgcmVhZHlcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU2VsZWN0aW9uUHVibGlzaGVkKHM6IFNlbGVjdGlvbik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5RdWVzdGlvbiAmJiAoKChzLm9wdGlvblNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKHMub3B0aW9uU2hvd09uKSkpIHx8XHJcbiAgICAgIChzLm5vZGVUeXBlID09PSBOb2RlVHlwZS5BbnN3ZXIgJiYgKCgocy5ub2RlU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5ub2RlU2hvd09uKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNBbGxTZWxlY3Rpb25QdWJsaXNoZWQoczogU2VsZWN0aW9uKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKHMub3B0aW9uU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwocy5vcHRpb25TaG93T24pKSkgfHxcclxuICAgICAgKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLk5leHRPcHRpb25WYWx1ZSAmJiAoKChzLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm5vZGVTaG93T24pKSkgfHxcclxuICAgICAgKHMubm9kZVR5cGUgPT09IE5vZGVUeXBlLkFuc3dlciAmJiAoKChzLm5vZGVTaG93T24gJiAyMDk3MTUyKSA+IDApIHx8IGlzTmlsbChzLm5vZGVTaG93T24pKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0Fuc3dlclB1Ymxpc2hlZChhOiBBbnN3ZXIpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoaXNOaWxsKGEuaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlKSB8fCAoKGEuaGllcmFyY2hpY2FsUHVibGljYXRpb25Db2RlICYgdGhpcy5fZ2V0UHVibGljYXRpb25Db2RlKCkpID4gMCkpLyogJiZcclxuICAgICAgICAoXHJcbiAgICAgICAgICAgIChhLnR5cGUgPT09IE5vZGVUeXBlLlF1ZXN0aW9uICYmICgoKGEub3B0aW9uU2hvd09uICYgMjA5NzE1MikgPiAwKSB8fCBpc05pbGwoYS5vcHRpb25TaG93T24pKSkgfHxcclxuICAgICAgICAgICAgKGEudHlwZSA9PT0gTm9kZVR5cGUuQW5zd2VyICYmICgoKGEubm9kZVNob3dPbiAmIDIwOTcxNTIpID4gMCkgfHwgaXNOaWxsKGEubm9kZVNob3dPbikpKVxyXG4gICAgICAgICkqLztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldFB1YmxpY2F0aW9uQ29kZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuZ2V0UHVibGljYXRpb25Db2RlQmFzZWRPbkxvZ2luKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRVbmlxdWVBbnN3ZXJzKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogU2VsZWN0aW9uW10ge1xyXG4gICAgaWYgKCFzZWxlY3Rpb25zIHx8IHNlbGVjdGlvbnMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIGNvbnN0IHVuaXF1ZUFuc3dlcnM6IE1hcDxudW1iZXIsIFNlbGVjdGlvbj4gPSBuZXcgTWFwPG51bWJlciwgU2VsZWN0aW9uPigpO1xyXG4gICAgc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgIGlmICghdW5pcXVlQW5zd2Vycy5oYXMoc2VsZWN0aW9uLm5vZGVJZCkpIHtcclxuICAgICAgICB1bmlxdWVBbnN3ZXJzLnNldChzZWxlY3Rpb24ubm9kZUlkLCBzZWxlY3Rpb24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB1bmlxdWVBbnN3ZXJzLmdldChzZWxlY3Rpb24ubm9kZUlkKTtcclxuICAgICAgICBleGlzdGluZ1NlbGVjdGlvbi5hcnRSZXRhaWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZUFuc3dlcnMudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlbG9hZENhY2hlZEltYWdlcyhhbnN3ZXJzT3JTZWxlY3Rpb25zOiBBbnN3ZXJbXSB8IFNlbGVjdGlvbltdKTogdm9pZCB7XHJcbiAgICBhbnN3ZXJzT3JTZWxlY3Rpb25zLmZvckVhY2goKGFuc3dlck9yU2VsZWN0aW9uOiBBbnN3ZXIgfCBTZWxlY3Rpb24pID0+IHtcclxuICAgICAgaWYgKGFuc3dlck9yU2VsZWN0aW9uLm5vZGVJZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pbWFnZUNhY2hlLmhhcyhhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpKSB7XHJcbiAgICAgICAgICBhbnN3ZXJPclNlbGVjdGlvbi5pbWFnZURhdGEgPSB0aGlzLl9pbWFnZUNhY2hlLmdldChhbnN3ZXJPclNlbGVjdGlvbi5ub2RlSWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYW5kbGVJbnN0YW5jZVJlc3BvbnNlKHJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSkge1xyXG4gICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQgJiYgcmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5pbnN0YW5jZVNldC5uZXh0KHJlc3BvbnNlLnJlc3VsdE9iamVjdCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9wcmVwYXJlU2VsZWN0aW9uc05leHRPcHRpb25WYWx1ZXMoc2VsZWN0aW9uczogU2VsZWN0aW9uW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gc2VsZWN0aW9ucy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IG5vdlRleHQ6IHN0cmluZyA9ICcnO1xyXG4gICAgZm9yIChsZXQgaSA9IGxlbjsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldO1xyXG4gICAgICBpZiAoc2VsZWN0aW9uLm5vZGVUeXBlID09PSBOb2RlVHlwZS5OZXh0T3B0aW9uVmFsdWUpIHtcclxuICAgICAgICBub3ZUZXh0ID0gc2VsZWN0aW9uLmFuc3dlciArIChub3ZUZXh0ID8gYCAtICR7bm92VGV4dH1gIDogJycpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChub3ZUZXh0KSB7XHJcbiAgICAgICAgICBzZWxlY3Rpb24uYW5zd2VyVHJlZVN0cmluZyA9IGAke3NlbGVjdGlvbi5hbnN3ZXJ9IC0gJHtub3ZUZXh0fWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vdlRleHQgPSAnJztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAqXHJcbiAgKiBTaG93IGZ1bGwgY29uZmlnIHN0dWZmXHJcbiAgKlxyXG4gICogKi9cclxuICBwcml2YXRlIGFzeW5jIF9jcmVhdGVTZWxlY3RvckZ1bGxDb25maWd1cmF0aW9uKHNlbGVjdGlvbnM6IFNlbGVjdGlvbltdKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb25zID0gc2VsZWN0aW9ucy5zbGljZSgwKTtcclxuICAgIHRoaXMuX3ByZXBhcmVTZWxlY3Rpb25zVG9EaXNwbGF5KCk7XHJcblxyXG4gICAgbGV0IHN0cnVjdDogU2VsZWN0b3JXaXRoT3B0aW9uc1tdID0gW107XHJcblxyXG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuX3NlbGVjdGlvbnMpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0aW9ucy5mb3JFYWNoKHNlbGVjdGlvbiA9PiB7XHJcbiAgICAgICAgdG90YWxQcmljZSArPSBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgPyBzZWxlY3Rpb24uYXJ0UmV0YWlsUHJpY2UgOiAwO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3RvdGFsUHJpY2UgPSBNYXRoLnJvdW5kKCh0b3RhbFByaWNlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcclxuXHJcbiAgICBsZXQgc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0OiBTZWxlY3RvclN0cnVjdHVyZVtdID0gW107XHJcbiAgICBjb25zdCBzZWxlY3RvclN0cnVjdHVyZTogRGF0YVNlcnZpY2VSZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLl9jb25maWd1cmF0b3JTZXJ2aWNlLmdldFNlbGVjdG9yU3RydWN0dXJlKCk7XHJcbiAgICBpZiAoc2VsZWN0b3JTdHJ1Y3R1cmUudmFsaWRhdGlvblJlc3VsdC5zdWNjZXNzKSB7XHJcbiAgICAgIGlmIChzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RzKSB7XHJcbiAgICAgICAgc2VsZWN0b3JTdHJ1Y3R1cmVMaXN0ID0gc2VsZWN0b3JTdHJ1Y3R1cmUucmVzdWx0T2JqZWN0cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZWxlY3RvclN0cnVjdHVyZUxpc3QgPSBzZWxlY3RvclN0cnVjdHVyZS5yZXN1bHRPYmplY3RbJ3N0cnVjdHVyZXMnXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkTGlzdDogU2VsZWN0b3JTdHJ1Y3R1cmVbXSA9IHNlbGVjdG9yU3RydWN0dXJlTGlzdC5maWx0ZXIocyA9PiB0aGlzLl9pc1N0cnVjdHVyZVB1Ymxpc2hlZChzKSk7XHJcbiAgICBzdHJ1Y3QgPSB0aGlzLl9idWlsZFN0cnVjdHVyZVRocmVlKGZpbHRlcmVkTGlzdCk7XHJcbiAgICB0aGlzLl9tYXJrTGFzdE5vZGVXaXRoQ2hpbGRyZW4oc3RydWN0KTtcclxuXHJcbiAgICBpZiAodGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkKSB7XHJcbiAgICAgIHN0cnVjdCA9IHRoaXMuX2xpbmtFeGNlcHRpb25Ub09wdGlvbih0aGlzLl9leGNlcHRpb25RdWVzdGlvbkNoYW5nZWQsIHN0cnVjdCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25XaXRoQW5zd2VycyA9IHN0cnVjdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkU3RydWN0dXJlVGhyZWUoaXRlbXM6IGFueSk6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSB7XHJcbiAgICBjb25zdCBtYXA6IHsgW2tleTogbnVtYmVyXTogU2VsZWN0b3JXaXRoT3B0aW9ucyB9ID0ge307XHJcbiAgICBjb25zdCBzdHJ1Y3R1cmVkTGlzdDogU2VsZWN0b3JXaXRoT3B0aW9uc1tdID0gW107XHJcblxyXG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgY29uc3Qgb3B0aW9uID0gbmV3IFNlbGVjdG9yV2l0aE9wdGlvbnMoKTtcclxuICAgICAgb3B0aW9uLnNlbGVjdG9yID0gaXRlbTtcclxuICAgICAgb3B0aW9uLnNlbGVjdG9yT3B0aW9ucyA9IFtdO1xyXG4gICAgICBtYXBbaXRlbS5pZF0gPSBvcHRpb247XHJcbiAgICB9KTtcclxuXHJcbiAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBpZiAobWFwW2l0ZW0ucGFyZW50SWRdKSB7XHJcbiAgICAgICAgbWFwW2l0ZW0ucGFyZW50SWRdLnNlbGVjdG9yT3B0aW9ucy5wdXNoKG1hcFtpdGVtLmlkXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3RydWN0dXJlZExpc3QucHVzaChtYXBbaXRlbS5pZF0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzdHJ1Y3R1cmVkTGlzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21hcmtMYXN0Tm9kZVdpdGhDaGlsZHJlbihub2RlczogU2VsZWN0b3JXaXRoT3B0aW9uc1tdKTogdm9pZCB7XHJcbiAgICBub2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xyXG4gICAgICBpZiAobm9kZS5zZWxlY3Rvck9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX21hcmtMYXN0Tm9kZVdpdGhDaGlsZHJlbihub2RlLnNlbGVjdG9yT3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgbGFzdEVsZW1lbnRXaXRoQ2hpbGRyZW4gPSBub2RlLnNlbGVjdG9yT3B0aW9ucy5ldmVyeShcclxuICAgICAgICAgIGNoaWxkID0+IGNoaWxkLnNlbGVjdG9yT3B0aW9ucy5sZW5ndGggPT09IDBcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChsYXN0RWxlbWVudFdpdGhDaGlsZHJlbikge1xyXG4gICAgICAgICAgbm9kZS5sYXN0Tm9kZVdpdGhDaGlsZHJlbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzU3RydWN0dXJlUHVibGlzaGVkKHM6IFNlbGVjdG9yU3RydWN0dXJlKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKGlzTmlsbChzLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSkgfHwgKChzLmhpZXJhcmNoaWNhbFB1YmxpY2F0aW9uQ29kZSAmIHRoaXMuX2dldFB1YmxpY2F0aW9uQ29kZSgpKSA+IDApKTtcclxuICB9XHJcblxyXG4gIC8vIFBPU1RDT05ESVRJT046IGN1cnJlbnQgYWN0aXZlQW5zd2VycyBoYXZlIHByaWNlIHZhbHVlcy5cclxuICBwcml2YXRlIGFzeW5jIF9sb2FkUHJpY2VzT2ZBY3RpdmVBbnN3ZXJzKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYW5zd2VyUHJpY2VzOiBBbnN3ZXJQcmljZVtdID0gYXdhaXQgdGhpcy5nZXRBbnN3ZXJQcmljZXMoKTtcclxuICAgIGlmIChhbnN3ZXJQcmljZXMpIHtcclxuICAgICAgYW5zd2VyUHJpY2VzLmZvckVhY2goYW5zd2VyUHJpY2UgPT4ge1xyXG4gICAgICAgIGNvbnN0IGFuc3dlck1hdGNoOiBBbnN3ZXIgPSB0aGlzLmFjdGl2ZUFuc3dlcnMuZmluZChhbnMgPT4gYW5zLm5vZGUgPT09IGFuc3dlclByaWNlLnNlbElkKTtcclxuICAgICAgICBpZiAoYW5zd2VyTWF0Y2gpIHtcclxuICAgICAgICAgICg8YW55PmFuc3dlck1hdGNoKS5wcmljZSA9IGFuc3dlclByaWNlLmFkZFJldGFpbFByaWNlO1xyXG4gICAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmV4dHJhQW5zd2VyRGF0YUxvYWRlZC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NhY2hlSW1hZ2UoaWQ6IG51bWJlciwgaW1hZ2VEYXRhT3JVcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5faW1hZ2VDYWNoZS5zZXQoaWQsIGltYWdlRGF0YU9yVXJsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVjZWl2ZWQoYW5zd2VyT3JTZWxlY3Rpb246IEFuc3dlciB8IFNlbGVjdGlvbiwgaW1hZ2VEYXRhOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBpbWFnZURhdGFPclVybDogc3RyaW5nO1xyXG4gICAgaWYgKGltYWdlRGF0YSkge1xyXG4gICAgICBpZiAoaW1hZ2VEYXRhLm1hdGNoKC9kYXRhOmltYWdlLykgfHwgaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJ2h0dHAnKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnd3d3JykpIHtcclxuICAgICAgICBpbWFnZURhdGFPclVybCA9IGltYWdlRGF0YTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5hc3NldFBhdGggJiYgIXRoaXMuYXNzZXRQYXRoLmVuZHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIHRoaXMuYXNzZXRQYXRoICs9ICcvJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGltYWdlRGF0YS5zdGFydHNXaXRoKCcvJykpIHtcclxuICAgICAgICAgIGltYWdlRGF0YSA9IGltYWdlRGF0YS5zdWJzdHIoMSwgaW1hZ2VEYXRhLmxlbmd0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGltYWdlRGF0YU9yVXJsID0gKHRoaXMuYXNzZXRQYXRoID8gdGhpcy5hc3NldFBhdGggOiAnJykgKyBpbWFnZURhdGE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgICg8YW55PmFuc3dlck9yU2VsZWN0aW9uKS5pbWFnZURhdGEgPSBpbWFnZURhdGFPclVybCA9PT0gdW5kZWZpbmVkID8gJycgOiBpbWFnZURhdGFPclVybDtcclxuICAgIHRoaXMuX2NhY2hlSW1hZ2UoYW5zd2VyT3JTZWxlY3Rpb24ubm9kZUlkLCBpbWFnZURhdGFPclVybCA/IGltYWdlRGF0YU9yVXJsIDogJycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcHJlcGFyZVNlbGVjdGlvbnNUb0Rpc3BsYXlJbWFnZXMoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5ICYmIHRoaXMuc2VsZWN0aW9uc1RvRGlzcGxheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3Rpb25zVG9EaXNwbGF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBTZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbnNUb0Rpc3BsYXlbaV07XHJcbiAgICAgICAgY29uc3QgbGFzdEFuc3dlclNlbGVjdGlvbjogU2VsZWN0aW9uID0gdGhpcy5fc2VsZWN0aW9ucy5maW5kKHMgPT4gcy5ub2RlSWQgPT09IHNlbGVjdGlvbi5sYXN0QW5zd2VyTm9kZUlkKTtcclxuICAgICAgICBpZiAobGFzdEFuc3dlclNlbGVjdGlvbiAmJiAoc2VsZWN0aW9uLmdlbmVyaWMgfHwgc2VsZWN0aW9uLmdyb3VwZWQpKSB7XHJcbiAgICAgICAgICBpZiAoIWxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0SW1hZ2VGb3JBbnN3ZXJPclNlbGVjdGlvbihsYXN0QW5zd2VyU2VsZWN0aW9uLCA0LCB0cnVlLCBmYWxzZSkudGhlbigoaW1hZ2VEYXRhOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVJbWFnZVJlY2VpdmVkKGxhc3RBbnN3ZXJTZWxlY3Rpb24sIGltYWdlRGF0YSk7XHJcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLmltYWdlRGF0YUxhc3RBbnN3ZXIgPSBsYXN0QW5zd2VyU2VsZWN0aW9uLmltYWdlRGF0YTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3Rpb24uaW1hZ2VEYXRhTGFzdEFuc3dlciA9IGxhc3RBbnN3ZXJTZWxlY3Rpb24uaW1hZ2VEYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29weUluc3RhbmNlKFxyXG4gICAgb3JpZ2luYWxJbnN0YW5jZUlkOiBzdHJpbmcsXHJcbiAgICBzaG91bGRTYXZlQ3VycmVudEluc3RhbmNlSWQ6IGJvb2xlYW4sXHJcbiAgICByZXN1bHQ6IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3RcclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgaWYgKCFyZXN1bHQpIHtcclxuICAgICAgcmVzdWx0ID0gbmV3IENvbmZpZ3VyYXRpb25SZXN1bHRPYmplY3QoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvcHlJbnN0YW5jZVJlc3BvbnNlOiBEYXRhU2VydmljZVJlc3BvbnNlRGF0YSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRvclNlcnZpY2UuY29weUluc3RhbmNlKG9yaWdpbmFsSW5zdGFuY2VJZCwgc2hvdWxkU2F2ZUN1cnJlbnRJbnN0YW5jZUlkKS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChlID09PSAnRUNPTk5BQk9SVEVEJyB8fCBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5UaW1lb3V0O1xyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Vbmtub3duO1xyXG4gICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2VzLnB1c2gobmV3IENvbmZpZ3VyYXRvckVycm9yTWVzc2FnZShjb3B5SW5zdGFuY2VSZXNwb25zZS5yZXN1bHRPYmplY3QuZGF0YSkpO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICB9KTtcclxuICAgIGlmIChjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmICFjb3B5SW5zdGFuY2VSZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0LnN1Y2Nlc3MpIHtcclxuICAgICAgaWYgKGNvcHlJbnN0YW5jZVJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQubWVzc2FnZXMubWFwKChtOiBhbnkpID0+IG0ubWVzc2FnZVR5cGUgPT09ICdFJykgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uTm90Rml4ZWQ7XHJcbiAgICAgICAgY29weUluc3RhbmNlUmVzcG9uc2UudmFsaWRhdGlvblJlc3VsdC5tZXNzYWdlcy5mb3JFYWNoKG0gPT4ge1xyXG4gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZXMucHVzaChuZXcgQ29uZmlndXJhdG9yRXJyb3JNZXNzYWdlKG0ubWVzc2FnZSkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZXN1bHQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5yZXN1bHRUeXBlID0gUmVzdWx0VHlwZS5Db25maWd1cmF0aW9uUGFydGlhbGx5Rml4ZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0luc3RhbmNlSWQ6IHN0cmluZyA9IGNvcHlJbnN0YW5jZVJlc3BvbnNlLnJlc3VsdE9iamVjdDtcclxuICAgIHRoaXMuX2hhbmRsZUluc3RhbmNlUmVzcG9uc2UoY29weUluc3RhbmNlUmVzcG9uc2UpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXdJbnN0YW5jZUlkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVjZWl2ZWRGb3JTZWxlY3RvclN0cnVjdHVyZShvcHRpb246IFNlbGVjdG9yU3RydWN0dXJlLCBpbWFnZURhdGE6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGltYWdlRGF0YU9yVXJsOiBzdHJpbmc7XHJcbiAgICBpZiAoaW1hZ2VEYXRhKSB7XHJcbiAgICAgIGlmIChpbWFnZURhdGEubWF0Y2goL2RhdGE6aW1hZ2UvKSB8fCBpbWFnZURhdGEuc3RhcnRzV2l0aCgnaHR0cCcpIHx8IGltYWdlRGF0YS5zdGFydHNXaXRoKCd3d3cnKSkge1xyXG4gICAgICAgIGltYWdlRGF0YU9yVXJsID0gaW1hZ2VEYXRhO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLmFzc2V0UGF0aCAmJiAhdGhpcy5hc3NldFBhdGguZW5kc1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgdGhpcy5hc3NldFBhdGggKz0gJy8nO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaW1hZ2VEYXRhLnN0YXJ0c1dpdGgoJy8nKSkge1xyXG4gICAgICAgICAgaW1hZ2VEYXRhID0gaW1hZ2VEYXRhLnN1YnN0cigxLCBpbWFnZURhdGEubGVuZ3RoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaW1hZ2VEYXRhT3JVcmwgPSAodGhpcy5hc3NldFBhdGggPyB0aGlzLmFzc2V0UGF0aCA6ICcnKSArIGltYWdlRGF0YTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgKDxhbnk+b3B0aW9uKS5pbWFnZURhdGEgPSBpbWFnZURhdGFPclVybCA9PT0gdW5kZWZpbmVkID8gJycgOiBpbWFnZURhdGFPclVybDtcclxuICAgIHRoaXMuX2NhY2hlSW1hZ2Uob3B0aW9uLmFydE5vZGVJZCwgaW1hZ2VEYXRhT3JVcmwgPyBpbWFnZURhdGFPclVybCA6ICcnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUltYWdlUmVzcG9uc2UocmVzcG9uc2U6IERhdGFTZXJ2aWNlUmVzcG9uc2VEYXRhKTogc3RyaW5nIHtcclxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS52YWxpZGF0aW9uUmVzdWx0ICYmIHJlc3BvbnNlLnZhbGlkYXRpb25SZXN1bHQuc3VjY2VzcyAmJiByZXNwb25zZS5yZXN1bHRPYmplY3QpIHtcclxuICAgICAgY29uc3QgaW1hZ2VDb250ZW50OiBJbWFnZUNvbnRlbnQgPVxyXG4gICAgICAgIHRoaXMuX2JvRmFjdG9yeS5tYWtlV2l0aFJhd0JhY2tlbmREYXRhKEltYWdlQ29udGVudCwgcmVzcG9uc2UucmVzdWx0T2JqZWN0KSBhcyB1bmtub3duIGFzIEltYWdlQ29udGVudDtcclxuICAgICAgaWYgKGltYWdlQ29udGVudC5pbWFnZSAhPT0gbnVsbCAmJiBpbWFnZUNvbnRlbnQuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiBpbWFnZUNvbnRlbnQuaW1hZ2UgIT09ICcnKSB7XHJcbiAgICAgICAgcmV0dXJuIGltYWdlQ29udGVudC5pbWFnZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpbmtFeGNlcHRpb25Ub09wdGlvbihleGNlcHRpb25RdWVzdGlvbjogQW5zd2VyLCBzdHJ1Y3Q6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSk6IFNlbGVjdG9yV2l0aE9wdGlvbnNbXSB7XHJcbiAgICBzdHJ1Y3QuZm9yRWFjaChzdHJ1Y3QgPT4ge1xyXG4gICAgICBpZiAoc3RydWN0LnNlbGVjdG9yLm9wdElkID09PSBleGNlcHRpb25RdWVzdGlvbi5vcHRpb25JZCkge1xyXG4gICAgICAgIHN0cnVjdC5tYXJrRm9yRXhjZXB0aW9uTm90aWZpY2F0aW9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fZXhjZXB0aW9uUXVlc3Rpb25DaGFuZ2VkID0gdW5kZWZpbmVkOyAvLyByZXNldFxyXG4gICAgcmV0dXJuIHN0cnVjdDtcclxuICB9XHJcbn1cclxuIl19