@colijnit/configurator 261.1.0 → 261.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (553) hide show
  1. package/bundles/colijnit-configurator.umd.js +18012 -1838
  2. package/bundles/colijnit-configurator.umd.js.map +1 -1
  3. package/colijnit-configurator.d.ts +2 -6
  4. package/esm2015/colijnit-configurator.js +2 -7
  5. package/esm2015/lib/builder.js +795 -0
  6. package/esm2015/lib/components/answer-card/answer-card.component.js +313 -0
  7. package/esm2015/lib/components/answer-card/answer-card.module.js +50 -0
  8. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.component.js +182 -0
  9. package/esm2015/lib/components/answer-info-dialog/answer-info-dialog.module.js +34 -0
  10. package/esm2015/lib/components/answers-slideout/answers-slideout.component.js +490 -0
  11. package/esm2015/lib/components/answers-slideout/answers-slideout.module.js +61 -0
  12. package/esm2015/lib/components/color-filter/color-filter.component.js +59 -0
  13. package/esm2015/lib/components/color-filter/color-filter.module.js +26 -0
  14. package/esm2015/lib/components/configurator/configurator.component.js +133 -0
  15. package/esm2015/lib/components/configurator/configurator.module.js +42 -0
  16. package/esm2015/lib/components/configurator-dialog/configurator-camera-settings.component.js +222 -0
  17. package/esm2015/lib/components/configurator-dialog/configurator-dialog.module.js +48 -0
  18. package/esm2015/lib/components/configurator-dialog/configurator-error-dialog.component.js +82 -0
  19. package/esm2015/lib/components/configurator-dialog/configurator-export-dialog.component.js +163 -0
  20. package/esm2015/lib/components/configurator-loader/configurator-loader.component.js +49 -0
  21. package/esm2015/lib/components/configurator-loader/configurator-loader.module.js +33 -0
  22. package/esm2015/lib/components/configurator-scene/configurator-scene.component.js +60 -0
  23. package/esm2015/lib/components/configurator-scene/configurator-scene.module.js +17 -0
  24. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.component.js +46 -0
  25. package/esm2015/lib/components/configurator-scene-loader/configurator-scene-loader.module.js +26 -0
  26. package/esm2015/lib/components/element-buttons/element-buttons.component.js +168 -0
  27. package/esm2015/lib/components/element-buttons/element-buttons.module.js +30 -0
  28. package/esm2015/lib/components/element-toolbar/element-toolbar.component.js +186 -0
  29. package/esm2015/lib/components/element-toolbar/element-toolbar.module.js +34 -0
  30. package/esm2015/lib/components/image-zoom/image-zoom.component.js +61 -0
  31. package/esm2015/lib/components/image-zoom/image-zoom.module.js +30 -0
  32. package/esm2015/lib/components/lite-selector/lite-selector.component.js +206 -0
  33. package/esm2015/lib/components/lite-selector/lite-selector.module.js +34 -0
  34. package/esm2015/lib/components/product-configurator/product-configurator.component.js +184 -0
  35. package/esm2015/lib/components/product-configurator/product-configurator.module.js +72 -0
  36. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.component.js +237 -0
  37. package/esm2015/lib/components/product-configurator-selector/product-configurator-selector.module.js +38 -0
  38. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.js +284 -0
  39. package/esm2015/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.js +42 -0
  40. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.js +72 -0
  41. package/esm2015/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.js +34 -0
  42. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.js +82 -0
  43. package/esm2015/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.js +30 -0
  44. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.js +80 -0
  45. package/esm2015/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.js +34 -0
  46. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.js +93 -0
  47. package/esm2015/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.js +34 -0
  48. package/esm2015/lib/components/progress-bar/progress-bar.component.js +55 -0
  49. package/esm2015/lib/components/progress-bar/progress-bar.module.js +29 -0
  50. package/esm2015/lib/components/scene-options/scene-options.component.js +164 -0
  51. package/esm2015/lib/components/scene-options/scene-options.module.js +38 -0
  52. package/esm2015/lib/components/selections-summary/selections-summary.component.js +163 -0
  53. package/esm2015/lib/components/selections-summary/selections-summary.module.js +45 -0
  54. package/esm2015/lib/components/selections-summary-line/selections-summary-line.component.js +171 -0
  55. package/esm2015/lib/components/selections-summary-line/selections-summary-line.module.js +34 -0
  56. package/esm2015/lib/components/slideout/slideout.component.js +83 -0
  57. package/esm2015/lib/components/slideout/slideout.module.js +17 -0
  58. package/esm2015/lib/components/summary-line/summary-line.component.js +273 -0
  59. package/esm2015/lib/components/summary-line/summary-line.module.js +44 -0
  60. package/esm2015/lib/components/tag-filter/tag-filter.component.js +39 -0
  61. package/esm2015/lib/components/tag-filter/tag-filter.module.js +21 -0
  62. package/esm2015/lib/components/threedselector/threedselector.component.js +155 -0
  63. package/esm2015/lib/components/threedselector/threedselector.module.js +34 -0
  64. package/esm2015/lib/core/helper/variation-helper.js +553 -0
  65. package/esm2015/lib/core/shader/floor-fade.shader.js +33 -0
  66. package/esm2015/lib/core/textures/depth-data-texture.js +19 -0
  67. package/esm2015/lib/directives/directives.module.js +26 -0
  68. package/esm2015/lib/directives/visibility-observer-master.directive.js +53 -0
  69. package/esm2015/lib/directives/visibility-observer.directive.js +54 -0
  70. package/esm2015/lib/enum/ar-feature.enum.js +14 -0
  71. package/esm2015/lib/enum/configuration-key.enum.js +41 -0
  72. package/esm2015/lib/enum/configuration-template.enum.js +6 -0
  73. package/esm2015/lib/enum/device-size-type.js +7 -0
  74. package/esm2015/lib/enum/device-tier.enum.js +7 -0
  75. package/esm2015/lib/enum/icon.enum.js +113 -0
  76. package/esm2015/lib/enum/item-type.enum.js +23 -0
  77. package/esm2015/lib/enum/light.enum.js +9 -0
  78. package/esm2015/lib/enum/navigator-type.enum.js +6 -0
  79. package/esm2015/lib/enum/output-encoding.enum.js +9 -0
  80. package/esm2015/lib/enum/result-type.enum.js +21 -0
  81. package/esm2015/lib/enum/scene-event.enum.js +12 -0
  82. package/esm2015/lib/enum/shadow-map-type.enum.js +8 -0
  83. package/esm2015/lib/enum/texture-type.js +9 -0
  84. package/esm2015/lib/enum/tone-mapping-local.enum.js +12 -0
  85. package/esm2015/lib/enum/view-mode.enum.js +7 -0
  86. package/esm2015/lib/enum/xr-mode.enum.js +6 -0
  87. package/esm2015/lib/environments/environment.js +8 -0
  88. package/esm2015/lib/interfaces/aa-options.interface.js +2 -0
  89. package/esm2015/lib/interfaces/adjustable-element.interface.js +2 -0
  90. package/esm2015/lib/interfaces/ao-options.interface.js +2 -0
  91. package/esm2015/lib/interfaces/changes.interface.js +2 -0
  92. package/esm2015/lib/interfaces/configuration-data.interface.js +2 -0
  93. package/esm2015/lib/interfaces/light-preset.interface.js +2 -0
  94. package/esm2015/lib/interfaces/post-processing-setting.interface.js +2 -0
  95. package/esm2015/lib/interfaces/scene-option-button.interface.js +6 -0
  96. package/esm2015/lib/interfaces/screen-size-info.js +2 -0
  97. package/esm2015/lib/interfaces/setting.interface.js +2 -0
  98. package/esm2015/lib/interfaces/texture.interface.js +2 -0
  99. package/esm2015/lib/interfaces/vignette-options.interface.js +2 -0
  100. package/esm2015/lib/model/ar-position-indicator.js +18 -0
  101. package/esm2015/lib/model/camera-settings.js +14 -0
  102. package/esm2015/lib/model/configuration-result-object.js +6 -0
  103. package/esm2015/lib/model/configurator-error-message.js +9 -0
  104. package/esm2015/lib/model/configurator-settings.js +25 -0
  105. package/esm2015/lib/model/custom-button.js +16 -0
  106. package/esm2015/lib/model/factory.js +28 -0
  107. package/esm2015/lib/model/icon.js +112 -0
  108. package/esm2015/lib/model/intersected-objects.js +7 -0
  109. package/esm2015/lib/model/light-preset.js +73 -0
  110. package/esm2015/lib/model/light-properties.js +45 -0
  111. package/esm2015/lib/model/material.js +11 -0
  112. package/esm2015/lib/model/metadata.js +2 -0
  113. package/esm2015/lib/model/render-parameters.js +16 -0
  114. package/esm2015/lib/model/setting-options.js +71 -0
  115. package/esm2015/lib/model/settings.js +16 -0
  116. package/esm2015/lib/model/shadow-properties.js +10 -0
  117. package/esm2015/lib/model/skin.js +3 -0
  118. package/esm2015/lib/model/texture.js +76 -0
  119. package/esm2015/lib/model/variation-settings.js +54 -0
  120. package/esm2015/lib/model/variation.js +3 -0
  121. package/esm2015/lib/model/xr-reticle.js +79 -0
  122. package/esm2015/lib/modules/render/enum/scene-type.enum.js +6 -0
  123. package/esm2015/lib/modules/render/model/ar-parameters.js +12 -0
  124. package/esm2015/lib/modules/render/model/scene-setting.js +6 -0
  125. package/esm2015/lib/modules/render/model/scene-settings.js +3 -0
  126. package/esm2015/lib/pipes/append.pipe.js +21 -0
  127. package/esm2015/lib/pipes/google-translate.pipe.js +21 -0
  128. package/esm2015/lib/pipes/localize.pipe.js +28 -0
  129. package/esm2015/lib/pipes/pipes.module.js +41 -0
  130. package/esm2015/lib/pipes/prepend.pipe.js +21 -0
  131. package/esm2015/lib/pipes/strip-html.pipe.js +17 -0
  132. package/esm2015/lib/services/app-event.service.js +36 -0
  133. package/esm2015/lib/services/app-initializer.service.js +27 -0
  134. package/esm2015/lib/services/ar.service.js +844 -0
  135. package/esm2015/lib/services/build-furniture-base.service.js +1181 -0
  136. package/esm2015/lib/services/build-furniture-without-scene.service.js +86 -0
  137. package/esm2015/lib/services/build-furniture.service.js +169 -0
  138. package/esm2015/lib/services/bundle-initialzer.service.js +113 -0
  139. package/esm2015/lib/services/camera.service.js +123 -0
  140. package/esm2015/lib/services/configuration.service.js +79 -0
  141. package/esm2015/lib/services/configurator-connector.service.js +830 -0
  142. package/esm2015/lib/services/configurator.service.js +285 -0
  143. package/esm2015/lib/services/configuring.service.js +119 -0
  144. package/esm2015/lib/services/controls.js +799 -0
  145. package/esm2015/lib/services/debug.service.js +43 -0
  146. package/esm2015/lib/services/dictionary.service.js +65 -0
  147. package/esm2015/lib/services/dynamic-camera.service.js +96 -0
  148. package/esm2015/lib/services/floor-plane.service.js +252 -0
  149. package/esm2015/lib/services/font.service.js +27 -0
  150. package/esm2015/lib/services/google-translate.service.js +79 -0
  151. package/esm2015/lib/services/icon-cache.service.js +44 -0
  152. package/esm2015/lib/services/intersection.service.js +47 -0
  153. package/esm2015/lib/services/item.service.js +75 -0
  154. package/esm2015/lib/services/json-utils.service.js +48 -0
  155. package/esm2015/lib/services/light-creation.service.js +35 -0
  156. package/esm2015/lib/services/light-presets.service.js +157 -0
  157. package/esm2015/lib/services/lights.service.js +146 -0
  158. package/esm2015/lib/services/load-furniture-base.service.js +164 -0
  159. package/esm2015/lib/services/load-furniture-without-scene.service.js +45 -0
  160. package/esm2015/lib/services/load-furniture.service.js +72 -0
  161. package/esm2015/lib/services/loader.service.js +32 -0
  162. package/esm2015/lib/services/locator.service.js +11 -0
  163. package/esm2015/lib/services/message-board.service.js +50 -0
  164. package/esm2015/lib/services/post-processing.service.js +378 -0
  165. package/esm2015/lib/services/product-configurator.service.js +16 -0
  166. package/esm2015/lib/services/progress.service.js +20 -0
  167. package/esm2015/lib/services/scene-event.service.js +246 -0
  168. package/esm2015/lib/services/scene-options.service.js +24 -0
  169. package/esm2015/lib/services/scene.service.js +313 -0
  170. package/esm2015/lib/services/screen-size-analysis.service.js +97 -0
  171. package/esm2015/lib/services/settings.service.js +142 -0
  172. package/esm2015/lib/services/switch-build-furniture.service.js +37 -0
  173. package/esm2015/lib/services/switch-load-furniture.service.js +35 -0
  174. package/esm2015/lib/services/threedselector.service.js +72 -0
  175. package/esm2015/lib/services/utils.service.js +207 -0
  176. package/esm2015/lib/services/variation-cache.service.js +143 -0
  177. package/esm2015/lib/services/variation.service.js +490 -0
  178. package/esm2015/lib/services/view-mode.service.js +37 -0
  179. package/esm2015/lib/services/vr.service.js +191 -0
  180. package/esm2015/lib/services/xr.service.js +294 -0
  181. package/esm2015/lib/utils/asset.utils.js +120 -0
  182. package/esm2015/lib/utils/base-utils.js +9 -0
  183. package/esm2015/lib/utils/color.utils.js +30 -0
  184. package/esm2015/lib/utils/debug.utils.js +9 -0
  185. package/esm2015/lib/utils/device.utils.js +25 -0
  186. package/esm2015/lib/utils/file.utils.js +167 -0
  187. package/esm2015/lib/utils/image.utils.js +61 -0
  188. package/esm2015/lib/utils/json-parser.utils.js +180 -0
  189. package/esm2015/lib/utils/material.utils.js +433 -0
  190. package/esm2015/lib/utils/object.utils.js +360 -0
  191. package/esm2015/lib/utils/relative-position.utils.js +75 -0
  192. package/esm2015/lib/utils/rotation-helper.utils.js +15 -0
  193. package/esm2015/lib/utils/scene-3d.utils.js +213 -0
  194. package/esm2015/lib/utils/scene-utils.js +191 -0
  195. package/esm2015/lib/utils/text-utils.js +68 -0
  196. package/esm2015/lib/utils/threed.utils.js +281 -0
  197. package/esm2015/lib/utils/variation-utils.js +459 -0
  198. package/esm2015/public-api.js +65 -0
  199. package/fesm2015/colijnit-configurator.js +17512 -1451
  200. package/fesm2015/colijnit-configurator.js.map +1 -1
  201. package/{app → lib}/builder.d.ts +9 -1
  202. package/lib/components/answer-card/answer-card.component.d.ts +58 -0
  203. package/lib/components/answer-card/answer-card.module.d.ts +11 -0
  204. package/lib/components/answer-card/style/_layout.scss +88 -0
  205. package/lib/components/answer-card/style/_material-definition.scss +3 -0
  206. package/lib/components/answer-card/style/_theme.scss +67 -0
  207. package/lib/components/answer-card/style/material.scss +2 -0
  208. package/lib/components/answer-info-dialog/answer-info-dialog.component.d.ts +38 -0
  209. package/lib/components/answer-info-dialog/answer-info-dialog.module.d.ts +10 -0
  210. package/lib/components/answer-info-dialog/style/_layout.scss +88 -0
  211. package/lib/components/answer-info-dialog/style/_material-definition.scss +3 -0
  212. package/lib/components/answer-info-dialog/style/_theme.scss +44 -0
  213. package/lib/components/answer-info-dialog/style/material.scss +3 -0
  214. package/lib/components/answers-slideout/answers-slideout.component.d.ts +86 -0
  215. package/lib/components/answers-slideout/answers-slideout.module.d.ts +16 -0
  216. package/lib/components/answers-slideout/style/_layout.scss +198 -0
  217. package/lib/components/answers-slideout/style/_material-definition.scss +3 -0
  218. package/lib/components/answers-slideout/style/_theme.scss +54 -0
  219. package/lib/components/answers-slideout/style/material.scss +3 -0
  220. package/lib/components/color-filter/color-filter.component.d.ts +20 -0
  221. package/lib/components/color-filter/color-filter.module.d.ts +8 -0
  222. package/lib/components/color-filter/style/_layout.scss +41 -0
  223. package/lib/components/color-filter/style/_material-definition.scss +3 -0
  224. package/lib/components/color-filter/style/_theme.scss +7 -0
  225. package/lib/components/color-filter/style/material.scss +3 -0
  226. package/lib/components/configurator/configurator.component.d.ts +37 -0
  227. package/lib/components/configurator/configurator.module.d.ts +12 -0
  228. package/lib/components/configurator/style/_layout.scss +7 -0
  229. package/lib/components/configurator/style/_material-definition.scss +3 -0
  230. package/lib/components/configurator/style/_theme.scss +7 -0
  231. package/lib/components/configurator/style/material.scss +3 -0
  232. package/lib/components/configurator-dialog/configurator-camera-settings.component.d.ts +30 -0
  233. package/lib/components/configurator-dialog/configurator-dialog.module.d.ts +13 -0
  234. package/lib/components/configurator-dialog/configurator-error-dialog.component.d.ts +16 -0
  235. package/lib/components/configurator-dialog/configurator-export-dialog.component.d.ts +26 -0
  236. package/lib/components/configurator-dialog/style/_layout.scss +129 -0
  237. package/lib/components/configurator-dialog/style/_material-definition.scss +4 -0
  238. package/lib/components/configurator-dialog/style/_theme.scss +89 -0
  239. package/lib/components/configurator-dialog/style/material.scss +3 -0
  240. package/lib/components/configurator-loader/configurator-loader.component.d.ts +7 -0
  241. package/lib/components/configurator-loader/configurator-loader.module.d.ts +9 -0
  242. package/lib/components/configurator-loader/style/_layout.scss +72 -0
  243. package/lib/components/configurator-loader/style/_material-definition.scss +5 -0
  244. package/lib/components/configurator-loader/style/_theme.scss +26 -0
  245. package/lib/components/configurator-loader/style/material.scss +14 -0
  246. package/lib/components/configurator-scene/configurator-scene.component.d.ts +24 -0
  247. package/lib/components/configurator-scene/configurator-scene.module.d.ts +7 -0
  248. package/lib/components/configurator-scene/style/_layout.scss +22 -0
  249. package/lib/components/configurator-scene/style/_material-definition.scss +3 -0
  250. package/lib/components/configurator-scene/style/_theme.scss +7 -0
  251. package/lib/components/configurator-scene/style/material.scss +3 -0
  252. package/lib/components/configurator-scene-loader/configurator-scene-loader.component.d.ts +7 -0
  253. package/lib/components/configurator-scene-loader/configurator-scene-loader.module.d.ts +8 -0
  254. package/lib/components/configurator-scene-loader/style/_layout.scss +72 -0
  255. package/lib/components/configurator-scene-loader/style/_material-definition.scss +5 -0
  256. package/lib/components/configurator-scene-loader/style/_theme.scss +26 -0
  257. package/lib/components/configurator-scene-loader/style/material.scss +14 -0
  258. package/lib/components/element-buttons/element-buttons.component.d.ts +32 -0
  259. package/lib/components/element-buttons/element-buttons.module.d.ts +9 -0
  260. package/lib/components/element-buttons/style/_layout.scss +52 -0
  261. package/lib/components/element-buttons/style/_material-definition.scss +3 -0
  262. package/lib/components/element-buttons/style/_theme.scss +23 -0
  263. package/lib/components/element-buttons/style/material.scss +3 -0
  264. package/lib/components/element-toolbar/element-toolbar.component.d.ts +27 -0
  265. package/lib/components/element-toolbar/element-toolbar.component.scss +59 -0
  266. package/lib/components/element-toolbar/element-toolbar.module.d.ts +10 -0
  267. package/lib/components/element-toolbar/style/_layout.scss +107 -0
  268. package/lib/components/element-toolbar/style/_material-definition.scss +3 -0
  269. package/lib/components/element-toolbar/style/_theme.scss +47 -0
  270. package/lib/components/element-toolbar/style/material.scss +3 -0
  271. package/lib/components/image-zoom/image-zoom.component.d.ts +15 -0
  272. package/lib/components/image-zoom/image-zoom.module.d.ts +9 -0
  273. package/lib/components/image-zoom/style/_layout.scss +51 -0
  274. package/lib/components/image-zoom/style/_material-definition.scss +3 -0
  275. package/lib/components/image-zoom/style/_theme.scss +17 -0
  276. package/lib/components/image-zoom/style/material.scss +3 -0
  277. package/lib/components/lite-selector/lite-selector.component.d.ts +40 -0
  278. package/lib/components/lite-selector/lite-selector.module.d.ts +10 -0
  279. package/lib/components/lite-selector/style/_layout.scss +21 -0
  280. package/lib/components/lite-selector/style/_material-definition.scss +3 -0
  281. package/lib/components/lite-selector/style/_theme.scss +7 -0
  282. package/lib/components/lite-selector/style/material.scss +3 -0
  283. package/lib/components/product-configurator/product-configurator.component.d.ts +50 -0
  284. package/lib/components/product-configurator/product-configurator.module.d.ts +15 -0
  285. package/lib/components/product-configurator/style/_layout.scss +46 -0
  286. package/lib/components/product-configurator/style/_material-definition.scss +3 -0
  287. package/lib/components/product-configurator/style/_theme.scss +22 -0
  288. package/lib/components/product-configurator/style/material.scss +3 -0
  289. package/lib/components/product-configurator-selector/product-configurator-selector.component.d.ts +35 -0
  290. package/lib/components/product-configurator-selector/product-configurator-selector.module.d.ts +11 -0
  291. package/lib/components/product-configurator-selector/style/_layout.scss +145 -0
  292. package/lib/components/product-configurator-selector/style/_material-definition.scss +3 -0
  293. package/lib/components/product-configurator-selector/style/_theme.scss +57 -0
  294. package/lib/components/product-configurator-selector/style/material.scss +3 -0
  295. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.component.d.ts +31 -0
  296. package/lib/components/product-configurator-selector-option/product-configurator-selector-option.module.d.ts +13 -0
  297. package/lib/components/product-configurator-selector-option/style/_layout.scss +7 -0
  298. package/lib/components/product-configurator-selector-option/style/_material-definition.scss +3 -0
  299. package/lib/components/product-configurator-selector-option/style/_theme.scss +7 -0
  300. package/lib/components/product-configurator-selector-option/style/material.scss +3 -0
  301. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.component.d.ts +20 -0
  302. package/lib/components/product-configurator-selector-option-button/product-configurator-selector-option-button.module.d.ts +10 -0
  303. package/lib/components/product-configurator-selector-option-button/style/_layout.scss +28 -0
  304. package/lib/components/product-configurator-selector-option-button/style/_material-definition.scss +3 -0
  305. package/lib/components/product-configurator-selector-option-button/style/_theme.scss +33 -0
  306. package/lib/components/product-configurator-selector-option-button/style/material.scss +3 -0
  307. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.component.d.ts +20 -0
  308. package/lib/components/product-configurator-selector-option-checkbox/product-configurator-selector-option-checkbox.module.d.ts +10 -0
  309. package/lib/components/product-configurator-selector-option-checkbox/style/_layout.scss +28 -0
  310. package/lib/components/product-configurator-selector-option-checkbox/style/_material-definition.scss +3 -0
  311. package/lib/components/product-configurator-selector-option-checkbox/style/_theme.scss +27 -0
  312. package/lib/components/product-configurator-selector-option-checkbox/style/material.scss +3 -0
  313. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.component.d.ts +21 -0
  314. package/lib/components/product-configurator-selector-option-dropdown/product-configurator-selector-option-dropdown.module.d.ts +10 -0
  315. package/lib/components/product-configurator-selector-option-dropdown/style/_layout.scss +34 -0
  316. package/lib/components/product-configurator-selector-option-dropdown/style/_material-definition.scss +3 -0
  317. package/lib/components/product-configurator-selector-option-dropdown/style/_theme.scss +28 -0
  318. package/lib/components/product-configurator-selector-option-dropdown/style/material.scss +3 -0
  319. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.component.d.ts +21 -0
  320. package/lib/components/product-configurator-selector-option-tile/product-configurator-selector-option-tile.module.d.ts +10 -0
  321. package/lib/components/product-configurator-selector-option-tile/style/_layout.scss +58 -0
  322. package/lib/components/product-configurator-selector-option-tile/style/_material-definition.scss +3 -0
  323. package/lib/components/product-configurator-selector-option-tile/style/_theme.scss +56 -0
  324. package/lib/components/product-configurator-selector-option-tile/style/material.scss +3 -0
  325. package/lib/components/progress-bar/progress-bar.component.d.ts +10 -0
  326. package/lib/components/progress-bar/progress-bar.component.scss +14 -0
  327. package/lib/components/progress-bar/progress-bar.module.d.ts +8 -0
  328. package/lib/components/progress-bar/style/_layout.scss +18 -0
  329. package/lib/components/progress-bar/style/_material-definition.scss +3 -0
  330. package/lib/components/progress-bar/style/_theme.scss +10 -0
  331. package/lib/components/progress-bar/style/material.scss +3 -0
  332. package/lib/components/scene-options/scene-options.component.d.ts +24 -0
  333. package/lib/components/scene-options/scene-options.module.d.ts +11 -0
  334. package/lib/components/scene-options/style/_layout.scss +52 -0
  335. package/lib/components/scene-options/style/_material-definition.scss +3 -0
  336. package/lib/components/scene-options/style/_theme.scss +7 -0
  337. package/lib/components/scene-options/style/material.scss +3 -0
  338. package/lib/components/selections-summary/selections-summary.component.d.ts +38 -0
  339. package/lib/components/selections-summary/selections-summary.module.d.ts +12 -0
  340. package/lib/components/selections-summary/style/_layout.scss +87 -0
  341. package/lib/components/selections-summary/style/_material-definition.scss +5 -0
  342. package/lib/components/selections-summary/style/_theme.scss +13 -0
  343. package/lib/components/selections-summary/style/material.scss +3 -0
  344. package/lib/components/selections-summary-line/selections-summary-line.component.d.ts +27 -0
  345. package/lib/components/selections-summary-line/selections-summary-line.module.d.ts +10 -0
  346. package/lib/components/selections-summary-line/style/_layout.scss +12 -0
  347. package/lib/components/selections-summary-line/style/_material-definition.scss +4 -0
  348. package/lib/components/selections-summary-line/style/_theme.scss +12 -0
  349. package/lib/components/selections-summary-line/style/material.scss +3 -0
  350. package/lib/components/slideout/slideout.component.d.ts +22 -0
  351. package/lib/components/slideout/slideout.module.d.ts +7 -0
  352. package/lib/components/slideout/style/_layout.scss +27 -0
  353. package/lib/components/slideout/style/_material-definition.scss +3 -0
  354. package/lib/components/slideout/style/_theme.scss +5 -0
  355. package/lib/components/slideout/style/material.scss +3 -0
  356. package/lib/components/summary-line/style/_layout.scss +137 -0
  357. package/lib/components/summary-line/style/_material-definition.scss +4 -0
  358. package/lib/components/summary-line/style/_theme.scss +56 -0
  359. package/lib/components/summary-line/style/material.scss +3 -0
  360. package/lib/components/summary-line/summary-line.component.d.ts +50 -0
  361. package/lib/components/summary-line/summary-line.module.d.ts +11 -0
  362. package/lib/components/tag-filter/style/_layout.scss +14 -0
  363. package/lib/components/tag-filter/style/_material-definition.scss +3 -0
  364. package/lib/components/tag-filter/style/_theme.scss +7 -0
  365. package/lib/components/tag-filter/style/material.scss +3 -0
  366. package/lib/components/tag-filter/tag-filter.component.d.ts +9 -0
  367. package/lib/components/tag-filter/tag-filter.module.d.ts +7 -0
  368. package/lib/components/threedselector/style/_layout.scss +32 -0
  369. package/lib/components/threedselector/style/_material-definition.scss +3 -0
  370. package/lib/components/threedselector/style/_theme.scss +7 -0
  371. package/lib/components/threedselector/style/material.scss +9 -0
  372. package/lib/components/threedselector/threedselector.component.d.ts +38 -0
  373. package/lib/components/threedselector/threedselector.module.d.ts +10 -0
  374. package/{helper → lib/core/helper}/variation-helper.d.ts +2 -2
  375. package/lib/core/shader/floor-fade.shader.d.ts +5 -0
  376. package/lib/core/textures/depth-data-texture.d.ts +5 -0
  377. package/lib/directives/directives.module.d.ts +8 -0
  378. package/{app → lib}/directives/visibility-observer-master.directive.d.ts +3 -0
  379. package/{app → lib}/directives/visibility-observer.directive.d.ts +3 -0
  380. package/lib/enum/ar-feature.enum.d.ts +12 -0
  381. package/lib/enum/configuration-key.enum.d.ts +39 -0
  382. package/lib/enum/configuration-template.enum.d.ts +4 -0
  383. package/lib/enum/device-size-type.d.ts +5 -0
  384. package/lib/enum/device-tier.enum.d.ts +5 -0
  385. package/lib/enum/icon.enum.d.ts +111 -0
  386. package/lib/enum/item-type.enum.d.ts +21 -0
  387. package/lib/enum/light.enum.d.ts +7 -0
  388. package/lib/enum/navigator-type.enum.d.ts +4 -0
  389. package/lib/enum/output-encoding.enum.d.ts +7 -0
  390. package/lib/enum/result-type.enum.d.ts +19 -0
  391. package/lib/enum/scene-event.enum.d.ts +10 -0
  392. package/lib/enum/shadow-map-type.enum.d.ts +6 -0
  393. package/lib/enum/texture-type.d.ts +7 -0
  394. package/lib/enum/tone-mapping-local.enum.d.ts +10 -0
  395. package/lib/enum/view-mode.enum.d.ts +5 -0
  396. package/lib/enum/xr-mode.enum.d.ts +4 -0
  397. package/lib/environments/environment.d.ts +4 -0
  398. package/lib/interfaces/aa-options.interface.d.ts +4 -0
  399. package/lib/interfaces/adjustable-element.interface.d.ts +5 -0
  400. package/lib/interfaces/ao-options.interface.d.ts +18 -0
  401. package/lib/interfaces/changes.interface.d.ts +9 -0
  402. package/lib/interfaces/configuration-data.interface.d.ts +40 -0
  403. package/lib/interfaces/light-preset.interface.d.ts +22 -0
  404. package/lib/interfaces/post-processing-setting.interface.d.ts +11 -0
  405. package/lib/interfaces/scene-option-button.interface.d.ts +19 -0
  406. package/lib/interfaces/screen-size-info.d.ts +10 -0
  407. package/lib/interfaces/setting.interface.d.ts +8 -0
  408. package/lib/interfaces/texture.interface.d.ts +44 -0
  409. package/lib/interfaces/vignette-options.interface.d.ts +4 -0
  410. package/lib/model/ar-position-indicator.d.ts +4 -0
  411. package/lib/model/camera-settings.d.ts +12 -0
  412. package/lib/model/configuration-result-object.d.ts +30 -0
  413. package/lib/model/configurator-error-message.d.ts +8 -0
  414. package/lib/model/configurator-settings.d.ts +62 -0
  415. package/lib/model/custom-button.d.ts +10 -0
  416. package/lib/model/factory.d.ts +5 -0
  417. package/lib/model/icon.d.ts +4 -0
  418. package/lib/model/intersected-objects.d.ts +6 -0
  419. package/lib/model/light-preset.d.ts +33 -0
  420. package/lib/model/light-properties.d.ts +25 -0
  421. package/lib/model/material.d.ts +41 -0
  422. package/lib/model/metadata.d.ts +78 -0
  423. package/lib/model/render-parameters.d.ts +12 -0
  424. package/lib/model/setting-options.d.ts +67 -0
  425. package/lib/model/settings.d.ts +10 -0
  426. package/lib/model/shadow-properties.d.ts +7 -0
  427. package/lib/model/skin.d.ts +15 -0
  428. package/lib/model/texture.d.ts +52 -0
  429. package/{model → lib/model}/variation-settings.d.ts +9 -8
  430. package/{model → lib/model}/variation.d.ts +2 -1
  431. package/lib/model/xr-reticle.d.ts +17 -0
  432. package/lib/modules/render/enum/scene-type.enum.d.ts +4 -0
  433. package/lib/modules/render/model/ar-parameters.d.ts +9 -0
  434. package/lib/modules/render/model/scene-setting.d.ts +13 -0
  435. package/lib/modules/render/model/scene-settings.d.ts +4 -0
  436. package/lib/pipes/append.pipe.d.ts +7 -0
  437. package/lib/pipes/google-translate.pipe.d.ts +11 -0
  438. package/lib/pipes/localize.pipe.d.ts +10 -0
  439. package/lib/pipes/pipes.module.d.ts +11 -0
  440. package/lib/pipes/prepend.pipe.d.ts +7 -0
  441. package/lib/pipes/strip-html.pipe.d.ts +7 -0
  442. package/lib/services/app-event.service.d.ts +32 -0
  443. package/lib/services/app-initializer.service.d.ts +14 -0
  444. package/lib/services/ar.service.d.ts +120 -0
  445. package/lib/services/build-furniture-base.service.d.ts +117 -0
  446. package/lib/services/build-furniture-without-scene.service.d.ts +14 -0
  447. package/lib/services/build-furniture.service.d.ts +14 -0
  448. package/lib/services/bundle-initialzer.service.d.ts +45 -0
  449. package/lib/services/camera.service.d.ts +44 -0
  450. package/lib/services/configuration.service.d.ts +18 -0
  451. package/lib/services/configurator-connector.service.d.ts +140 -0
  452. package/lib/services/configurator.service.d.ts +62 -0
  453. package/lib/services/configuring.service.d.ts +46 -0
  454. package/lib/services/controls.d.ts +11 -0
  455. package/lib/services/debug.service.d.ts +16 -0
  456. package/lib/services/dictionary.service.d.ts +15 -0
  457. package/lib/services/dynamic-camera.service.d.ts +21 -0
  458. package/lib/services/floor-plane.service.d.ts +47 -0
  459. package/lib/services/font.service.d.ts +10 -0
  460. package/lib/services/google-translate.service.d.ts +26 -0
  461. package/lib/services/icon-cache.service.d.ts +21 -0
  462. package/lib/services/intersection.service.d.ts +11 -0
  463. package/lib/services/item.service.d.ts +18 -0
  464. package/lib/services/json-utils.service.d.ts +7 -0
  465. package/lib/services/light-creation.service.d.ts +9 -0
  466. package/lib/services/light-presets.service.d.ts +34 -0
  467. package/lib/services/lights.service.d.ts +34 -0
  468. package/lib/services/load-furniture-base.service.d.ts +37 -0
  469. package/lib/services/load-furniture-without-scene.service.d.ts +9 -0
  470. package/lib/services/load-furniture.service.d.ts +9 -0
  471. package/lib/services/loader.service.d.ts +11 -0
  472. package/lib/services/locator.service.d.ts +7 -0
  473. package/lib/services/message-board.service.d.ts +18 -0
  474. package/lib/services/post-processing.service.d.ts +74 -0
  475. package/lib/services/product-configurator.service.d.ts +11 -0
  476. package/lib/services/progress.service.d.ts +9 -0
  477. package/lib/services/scene-event.service.d.ts +72 -0
  478. package/lib/services/scene-options.service.d.ts +11 -0
  479. package/lib/services/scene.service.d.ts +71 -0
  480. package/lib/services/screen-size-analysis.service.d.ts +32 -0
  481. package/lib/services/settings.service.d.ts +24 -0
  482. package/lib/services/switch-build-furniture.service.d.ts +21 -0
  483. package/lib/services/switch-load-furniture.service.d.ts +21 -0
  484. package/lib/services/threedselector.service.d.ts +17 -0
  485. package/lib/services/utils.service.d.ts +24 -0
  486. package/lib/services/variation-cache.service.d.ts +23 -0
  487. package/lib/services/variation.service.d.ts +26 -0
  488. package/lib/services/view-mode.service.d.ts +17 -0
  489. package/lib/services/vr.service.d.ts +42 -0
  490. package/lib/services/xr.service.d.ts +56 -0
  491. package/lib/style/_mixin.scss +9 -0
  492. package/lib/style/configurator-globals.scss +21 -0
  493. package/lib/style/template_variables.scss +37 -0
  494. package/lib/utils/color.utils.d.ts +8 -0
  495. package/lib/utils/debug.utils.d.ts +3 -0
  496. package/lib/utils/device.utils.d.ts +7 -0
  497. package/{utils → lib/utils}/file.utils.d.ts +3 -0
  498. package/{utils → lib/utils}/image.utils.d.ts +2 -3
  499. package/lib/utils/json-parser.utils.d.ts +9 -0
  500. package/lib/utils/material.utils.d.ts +34 -0
  501. package/lib/utils/object.utils.d.ts +32 -0
  502. package/lib/utils/relative-position.utils.d.ts +12 -0
  503. package/lib/utils/rotation-helper.utils.d.ts +6 -0
  504. package/lib/utils/scene-3d.utils.d.ts +8 -0
  505. package/lib/utils/text-utils.d.ts +4 -0
  506. package/{utils → lib/utils}/threed.utils.d.ts +7 -3
  507. package/{utils → lib/utils}/variation-utils.d.ts +4 -2
  508. package/package.json +17 -30
  509. package/public-api.d.ts +60 -0
  510. package/README.md +0 -28
  511. package/app/components/answers/answer/answer.component.d.ts +0 -11
  512. package/app/components/answers/answers.component.d.ts +0 -8
  513. package/app/components/answers/answers.module.d.ts +0 -2
  514. package/app/components/selections/selections.component.d.ts +0 -21
  515. package/app/components/selections/selections.module.d.ts +0 -2
  516. package/app/components/shared/loader/loader.component.d.ts +0 -2
  517. package/app/components/shared/shared.module.d.ts +0 -2
  518. package/app/services/configurator.service.d.ts +0 -19
  519. package/app/services/image-cache.service.d.ts +0 -10
  520. package/app/utils/object.utils.d.ts +0 -7
  521. package/colijnit-configurator.metadata.json +0 -1
  522. package/esm2015/app/builder.js +0 -710
  523. package/esm2015/app/components/answers/answer/answer.component.js +0 -66
  524. package/esm2015/app/components/answers/answers.component.js +0 -38
  525. package/esm2015/app/components/answers/answers.module.js +0 -27
  526. package/esm2015/app/components/selections/selections.component.js +0 -129
  527. package/esm2015/app/components/selections/selections.module.js +0 -21
  528. package/esm2015/app/components/shared/loader/loader.component.js +0 -22
  529. package/esm2015/app/components/shared/shared.module.js +0 -19
  530. package/esm2015/app/directives/visibility-observer-master.directive.js +0 -50
  531. package/esm2015/app/directives/visibility-observer.directive.js +0 -55
  532. package/esm2015/app/services/configurator.service.js +0 -79
  533. package/esm2015/app/services/image-cache.service.js +0 -63
  534. package/esm2015/app/utils/object.utils.js +0 -51
  535. package/esm2015/helper/variation-helper.js +0 -549
  536. package/esm2015/model/material.js +0 -11
  537. package/esm2015/model/variation-settings.js +0 -54
  538. package/esm2015/model/variation.js +0 -3
  539. package/esm2015/public_api.js +0 -7
  540. package/esm2015/utils/asset.utils.js +0 -124
  541. package/esm2015/utils/base-utils.js +0 -9
  542. package/esm2015/utils/file.utils.js +0 -142
  543. package/esm2015/utils/image.utils.js +0 -66
  544. package/esm2015/utils/object.utils.js +0 -49
  545. package/esm2015/utils/scene-utils.js +0 -187
  546. package/esm2015/utils/threed.utils.js +0 -226
  547. package/esm2015/utils/variation-utils.js +0 -388
  548. package/model/material.d.ts +0 -40
  549. package/public_api.d.ts +0 -6
  550. package/utils/object.utils.d.ts +0 -7
  551. /package/{utils → lib/utils}/asset.utils.d.ts +0 -0
  552. /package/{utils → lib/utils}/base-utils.d.ts +0 -0
  553. /package/{utils → lib/utils}/scene-utils.d.ts +0 -0
@@ -0,0 +1,191 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BufferGeometry, Group, Line, Matrix4, PerspectiveCamera, Raycaster, Vector3 } from 'three';
3
+ import { XRControllerModelFactory } from 'three/examples/jsm/webxr/XRControllerModelFactory';
4
+ import * as THREE from 'three';
5
+ import { isNill } from '@colijnit/configuratorapi/build/utils/function/is-nill.function';
6
+ import { Reticle } from '../model/xr-reticle';
7
+ import * as i0 from "@angular/core";
8
+ export class VrService {
9
+ constructor() { }
10
+ init(scene, renderer) {
11
+ if (isNill(this._scene)) {
12
+ this._scene = scene;
13
+ this._renderer = renderer;
14
+ this._camera = new PerspectiveCamera(50, window.innerWidth / window.innerHeight, 0.1, 10);
15
+ this._raycaster = new Raycaster();
16
+ this._reticle = new Reticle();
17
+ this._tempMatrix = new Matrix4();
18
+ this._meshes = [];
19
+ this._user = new Group();
20
+ this._user.name = 'user-group';
21
+ this._user.add(this._camera);
22
+ this._scene.add(this._user, this._reticle);
23
+ this._createControllers();
24
+ }
25
+ this._initSession();
26
+ }
27
+ render() {
28
+ this._handleIntersections();
29
+ this._renderer.render(this._scene, this._camera);
30
+ }
31
+ endSession() {
32
+ if (this._session) {
33
+ this._session.end();
34
+ }
35
+ }
36
+ _initSession() {
37
+ if (!this._session) {
38
+ const sessionInit = { optionalFeatures: ['local-floor', 'bounded-floor'] };
39
+ navigator.xr.requestSession('immersive-vr', sessionInit).then((session) => {
40
+ this._onSessionStarted(session);
41
+ this.startVRSession();
42
+ });
43
+ }
44
+ }
45
+ _onSessionStarted(session) {
46
+ session.addEventListener('end', this._onSessionEnded.bind(this));
47
+ this._renderer.xr.setSession(session);
48
+ this._renderer.xr.enabled = true;
49
+ this._session = session;
50
+ }
51
+ _onSessionEnded() {
52
+ this._session = null;
53
+ // TODO create a fix for this viewModeService stuf
54
+ // this._viewModeService.viewMode = ViewMode.RoomPlan3D;
55
+ this._renderer.xr.enabled = false;
56
+ }
57
+ startVRSession() {
58
+ this._registerMeshes();
59
+ }
60
+ _createControllers() {
61
+ this._controller0 = this._renderer.xr.getController(0);
62
+ this._controller0.addEventListener('selectstart', (event) => this._onSelectStart(event));
63
+ this._controller0.addEventListener('selectend', (event) => this._onSelectEnd(event));
64
+ this._user.add(this._controller0);
65
+ this._controller1 = this._renderer.xr.getController(1);
66
+ this._controller1.addEventListener('selectstart', (event) => this._onSelectStart(event));
67
+ this._controller1.addEventListener('selectend', (event) => this._onSelectEnd(event));
68
+ this._user.add(this._controller1);
69
+ const controllerModelFactory = new XRControllerModelFactory();
70
+ const controllerGrip1 = this._renderer.xr.getControllerGrip(0);
71
+ controllerGrip1.add(controllerModelFactory.createControllerModel(controllerGrip1));
72
+ this._user.add(controllerGrip1);
73
+ const controllerGrip2 = this._renderer.xr.getControllerGrip(1);
74
+ controllerGrip2.add(controllerModelFactory.createControllerModel(controllerGrip2));
75
+ this._user.add(controllerGrip2);
76
+ const geometry = new BufferGeometry().setFromPoints([new Vector3(0, 0, 0), new Vector3(0, 0, -1)]);
77
+ const line = new Line(geometry);
78
+ line.name = 'line';
79
+ line.scale.z = 10;
80
+ // Only add line to controller0 when debugging with WebXR chrome extension
81
+ // this._controller0.add( line.clone() );
82
+ this._controller1.add(line.clone());
83
+ }
84
+ _onSelectStart(event) {
85
+ if (this._isObjectFloor(this._currentClosestIntersection.object)) {
86
+ this._user.position.set(this._currentClosestIntersection.point.x, 0, this._currentClosestIntersection.point.z);
87
+ this._controller0.updateMatrix();
88
+ }
89
+ }
90
+ _onSelectEnd(event) {
91
+ // Function can be used to clean up after _onSelectStart
92
+ }
93
+ _getIntersections(controller, group) {
94
+ this._tempMatrix.identity().extractRotation(controller.matrixWorld);
95
+ this._raycaster.ray.origin.setFromMatrixPosition(controller.matrixWorld);
96
+ this._raycaster.ray.direction.set(0, 0, -1).applyMatrix4(this._tempMatrix);
97
+ return this._raycaster.intersectObjects(group);
98
+ }
99
+ _registerMeshes() {
100
+ this._scene.traverse((mesh) => {
101
+ this._meshes.push(mesh);
102
+ });
103
+ }
104
+ _handleIntersections() {
105
+ if (this._renderer.xr.getController(1).visible) {
106
+ this._handleControllerIntersections(this._controller1);
107
+ }
108
+ else {
109
+ this._handleControllerIntersections(this._controller0);
110
+ }
111
+ }
112
+ _handleControllerIntersections(controller) {
113
+ const objectIntersections = this._getIntersections(controller, this._meshes);
114
+ if (objectIntersections.length > 0) {
115
+ const nearestIntersection = this._getNearestIntersection(objectIntersections);
116
+ if (nearestIntersection !== null) {
117
+ this._currentClosestIntersection = nearestIntersection;
118
+ const nearestObjectParent = this._getParentOfChild(nearestIntersection.object);
119
+ if (this._isObjectFloor(nearestIntersection.object)) {
120
+ this._handleFloorIntersection(controller, nearestIntersection);
121
+ }
122
+ else if (nearestObjectParent) {
123
+ this._updateObjectSelection(nearestObjectParent);
124
+ this._handleObjectIntersection(controller, nearestIntersection);
125
+ }
126
+ else {
127
+ this._handleNoIntersections(controller);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ _getNearestIntersection(intersections) {
133
+ let nearest = null;
134
+ for (const intersection of intersections) {
135
+ // TODO: need a better solution for first if-statement
136
+ if (intersection.object.name && (intersection.object.name === 'home' || intersection.object.name === 'line')
137
+ || (intersection.object.parent && intersection.object.parent instanceof Reticle)) {
138
+ // DO NOTHING
139
+ }
140
+ else if (nearest === null || intersection.distance < nearest.distance) {
141
+ nearest = intersection;
142
+ }
143
+ }
144
+ return nearest;
145
+ }
146
+ _handleFloorIntersection(controller, intersection) {
147
+ this._updateControllerRay(controller, intersection.distance);
148
+ this._reticle.visible = true;
149
+ this._reticle.position.copy(intersection.point);
150
+ }
151
+ _handleObjectIntersection(controller, intersection) {
152
+ this._updateControllerRay(controller, intersection.distance);
153
+ this._reticle.visible = false;
154
+ }
155
+ _handleNoIntersections(controller) {
156
+ this._reticle.visible = false;
157
+ this._updateControllerRay(controller, 0);
158
+ }
159
+ _updateControllerRay(controller, rayLenght) {
160
+ const line = controller.getObjectByName('line');
161
+ if (line) {
162
+ line.scale.z = rayLenght;
163
+ }
164
+ }
165
+ _isObjectFloor(object) {
166
+ return object.name && object.name === 'floor-plane';
167
+ }
168
+ _getParentOfChild(object) {
169
+ // TODO: return null if object is not selectable
170
+ if (!object.parent || (object.parent instanceof THREE.Scene) || (object.parent instanceof Reticle)) {
171
+ return object;
172
+ }
173
+ else {
174
+ return this._getParentOfChild(object.parent);
175
+ }
176
+ }
177
+ _updateObjectSelection(object) {
178
+ if (!this._selectedObject) {
179
+ this._selectedObject = object;
180
+ }
181
+ // Do something with newly selected item
182
+ // ...
183
+ }
184
+ }
185
+ VrService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: VrService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
186
+ VrService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: VrService, providedIn: 'root' });
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: VrService, decorators: [{
188
+ type: Injectable,
189
+ args: [{ providedIn: 'root' }]
190
+ }], ctorParameters: function () { return []; } });
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3NlcnZpY2VzL3ZyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsY0FBYyxFQUNkLEtBQUssRUFDTCxJQUFJLEVBQ0osT0FBTyxFQUdQLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsT0FBTyxFQUVSLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDM0YsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlFQUFpRSxDQUFDO0FBRXZGLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7QUFJNUMsTUFBTSxPQUFPLFNBQVM7SUFvQnBCLGdCQUVHLENBQUM7SUFFRyxJQUFJLENBQUMsS0FBWSxFQUFFLFFBQXVCO1FBQy9DLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksaUJBQWlCLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDMUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FB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SSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDekIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUM7U0FDL0I7UUFFRCx3Q0FBd0M7UUFDeEMsTUFBTTtJQUNSLENBQUM7O3VHQXBPVSxTQUFTOzJHQUFULFNBQVMsY0FERyxNQUFNOzRGQUNsQixTQUFTO2tCQURyQixVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBCdWZmZXJHZW9tZXRyeSxcclxuICBHcm91cCwgSW50ZXJzZWN0aW9uLFxyXG4gIExpbmUsXHJcbiAgTWF0cml4NCxcclxuICBNZXNoLFxyXG4gIE9iamVjdDNELFxyXG4gIFBlcnNwZWN0aXZlQ2FtZXJhLFxyXG4gIFJheWNhc3RlcixcclxuICBTY2VuZSxcclxuICBWZWN0b3IzLFxyXG4gIFdlYkdMUmVuZGVyZXJcclxufSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7WFJDb250cm9sbGVyTW9kZWxGYWN0b3J5fSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vd2VieHIvWFJDb250cm9sbGVyTW9kZWxGYWN0b3J5JztcclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge2lzTmlsbH0gZnJvbSAnQGNvbGlqbml0L2NvbmZpZ3VyYXRvcmFwaS9idWlsZC91dGlscy9mdW5jdGlvbi9pcy1uaWxsLmZ1bmN0aW9uJztcclxuaW1wb3J0IHtWaWV3TW9kZX0gZnJvbSAnLi4vZW51bS92aWV3LW1vZGUuZW51bSc7XHJcbmltcG9ydCB7UmV0aWNsZX0gZnJvbSAnLi4vbW9kZWwveHItcmV0aWNsZSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXHJcbmV4cG9ydCBjbGFzcyBWclNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIF9zY2VuZTogU2NlbmU7XHJcbiAgcHJpdmF0ZSBfcmVuZGVyZXI6IFdlYkdMUmVuZGVyZXI7XHJcbiAgcHJpdmF0ZSBfY2FtZXJhOiBQZXJzcGVjdGl2ZUNhbWVyYTtcclxuXHJcbiAgcHJpdmF0ZSBfdGVtcE1hdHJpeDogTWF0cml4NDtcclxuICBwcml2YXRlIF9jdXJyZW50Q2xvc2VzdEludGVyc2VjdGlvbjogSW50ZXJzZWN0aW9uO1xyXG4gIHByaXZhdGUgX21lc2hlczogTWVzaFtdO1xyXG4gIHByaXZhdGUgX3JheWNhc3RlcjogUmF5Y2FzdGVyO1xyXG4gIHByaXZhdGUgX3JldGljbGU6IFJldGljbGU7XHJcblxyXG4gIHByaXZhdGUgX2NvbnRyb2xsZXIwO1xyXG4gIHByaXZhdGUgX2NvbnRyb2xsZXIxO1xyXG5cclxuICBwcml2YXRlIF9zZXNzaW9uOiBhbnk7XHJcbiAgcHJpdmF0ZSBfdXNlcjogR3JvdXA7XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGVkT2JqZWN0OiBhbnk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG5cclxuICApIHt9XHJcblxyXG4gIHB1YmxpYyBpbml0KHNjZW5lOiBTY2VuZSwgcmVuZGVyZXI6IFdlYkdMUmVuZGVyZXIpIHtcclxuICAgIGlmIChpc05pbGwodGhpcy5fc2NlbmUpKSB7XHJcbiAgICAgIHRoaXMuX3NjZW5lID0gc2NlbmU7XHJcbiAgICAgIHRoaXMuX3JlbmRlcmVyID0gcmVuZGVyZXI7XHJcbiAgICAgIHRoaXMuX2NhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSg1MCwgd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsIDAuMSwgMTApO1xyXG4gICAgICB0aGlzLl9yYXljYXN0ZXIgPSBuZXcgUmF5Y2FzdGVyKCk7XHJcbiAgICAgIHRoaXMuX3JldGljbGUgPSBuZXcgUmV0aWNsZSgpO1xyXG4gICAgICB0aGlzLl90ZW1wTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcclxuICAgICAgdGhpcy5fbWVzaGVzID0gW107XHJcblxyXG4gICAgICB0aGlzLl91c2VyID0gbmV3IEdyb3VwKCk7XHJcbiAgICAgIHRoaXMuX3VzZXIubmFtZSA9ICd1c2VyLWdyb3VwJztcclxuICAgICAgdGhpcy5fdXNlci5hZGQodGhpcy5fY2FtZXJhKTtcclxuICAgICAgdGhpcy5fc2NlbmUuYWRkKHRoaXMuX3VzZXIsIHRoaXMuX3JldGljbGUpO1xyXG5cclxuICAgICAgdGhpcy5fY3JlYXRlQ29udHJvbGxlcnMoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pbml0U2Vzc2lvbigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbmRlcigpIHtcclxuICAgIHRoaXMuX2hhbmRsZUludGVyc2VjdGlvbnMoKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyLnJlbmRlcih0aGlzLl9zY2VuZSwgdGhpcy5fY2FtZXJhKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlbmRTZXNzaW9uKCkge1xyXG4gICAgaWYgKHRoaXMuX3Nlc3Npb24pIHtcclxuICAgICAgdGhpcy5fc2Vzc2lvbi5lbmQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTZXNzaW9uKCkge1xyXG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uKSB7XHJcbiAgICAgIGNvbnN0IHNlc3Npb25Jbml0ID0geyBvcHRpb25hbEZlYXR1cmVzOiBbICdsb2NhbC1mbG9vcicsICdib3VuZGVkLWZsb29yJyBdIH07XHJcbiAgICAgIChuYXZpZ2F0b3IgYXMgYW55KS54ci5yZXF1ZXN0U2Vzc2lvbignaW1tZXJzaXZlLXZyJywgc2Vzc2lvbkluaXQpLnRoZW4oKHNlc3Npb24pID0+IHtcclxuICAgICAgICB0aGlzLl9vblNlc3Npb25TdGFydGVkKHNlc3Npb24pO1xyXG4gICAgICAgIHRoaXMuc3RhcnRWUlNlc3Npb24oKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vblNlc3Npb25TdGFydGVkKHNlc3Npb246IGFueSkge1xyXG4gICAgc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCB0aGlzLl9vblNlc3Npb25FbmRlZC5iaW5kKHRoaXMpKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyLnhyLnNldFNlc3Npb24oIHNlc3Npb24gKTtcclxuICAgIHRoaXMuX3JlbmRlcmVyLnhyLmVuYWJsZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5fc2Vzc2lvbiA9IHNlc3Npb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vblNlc3Npb25FbmRlZCgpIHtcclxuICAgIHRoaXMuX3Nlc3Npb24gPSBudWxsO1xyXG4gICAgLy8gVE9ETyBjcmVhdGUgYSBmaXggZm9yIHRoaXMgdmlld01vZGVTZXJ2aWNlIHN0dWZcclxuICAgIC8vIHRoaXMuX3ZpZXdNb2RlU2VydmljZS52aWV3TW9kZSA9IFZpZXdNb2RlLlJvb21QbGFuM0Q7XHJcbiAgICB0aGlzLl9yZW5kZXJlci54ci5lbmFibGVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRWUlNlc3Npb24oKSB7XHJcbiAgICB0aGlzLl9yZWdpc3Rlck1lc2hlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3JlYXRlQ29udHJvbGxlcnMoKSB7XHJcbiAgICB0aGlzLl9jb250cm9sbGVyMCA9IHRoaXMuX3JlbmRlcmVyLnhyLmdldENvbnRyb2xsZXIoIDAgKTtcclxuICAgIHRoaXMuX2NvbnRyb2xsZXIwLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIChldmVudCkgPT4gdGhpcy5fb25TZWxlY3RTdGFydChldmVudCkgKTtcclxuICAgIHRoaXMuX2NvbnRyb2xsZXIwLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RlbmQnLCAoZXZlbnQpID0+IHRoaXMuX29uU2VsZWN0RW5kKGV2ZW50KSApO1xyXG4gICAgdGhpcy5fdXNlci5hZGQoIHRoaXMuX2NvbnRyb2xsZXIwICk7XHJcblxyXG4gICAgdGhpcy5fY29udHJvbGxlcjEgPSB0aGlzLl9yZW5kZXJlci54ci5nZXRDb250cm9sbGVyKCAxICk7XHJcbiAgICB0aGlzLl9jb250cm9sbGVyMS5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0c3RhcnQnLCAoZXZlbnQpID0+IHRoaXMuX29uU2VsZWN0U3RhcnQoZXZlbnQpICk7XHJcbiAgICB0aGlzLl9jb250cm9sbGVyMS5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0ZW5kJywgKGV2ZW50KSA9PiB0aGlzLl9vblNlbGVjdEVuZChldmVudCkgKTtcclxuICAgIHRoaXMuX3VzZXIuYWRkKCB0aGlzLl9jb250cm9sbGVyMSApO1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xsZXJNb2RlbEZhY3RvcnkgPSBuZXcgWFJDb250cm9sbGVyTW9kZWxGYWN0b3J5KCk7XHJcblxyXG4gICAgY29uc3QgY29udHJvbGxlckdyaXAxID0gdGhpcy5fcmVuZGVyZXIueHIuZ2V0Q29udHJvbGxlckdyaXAoIDAgKTtcclxuICAgIGNvbnRyb2xsZXJHcmlwMS5hZGQoIGNvbnRyb2xsZXJNb2RlbEZhY3RvcnkuY3JlYXRlQ29udHJvbGxlck1vZGVsKCBjb250cm9sbGVyR3JpcDEgKSApO1xyXG4gICAgdGhpcy5fdXNlci5hZGQoIGNvbnRyb2xsZXJHcmlwMSApO1xyXG5cclxuICAgIGNvbnN0IGNvbnRyb2xsZXJHcmlwMiA9IHRoaXMuX3JlbmRlcmVyLnhyLmdldENvbnRyb2xsZXJHcmlwKCAxICk7XHJcbiAgICBjb250cm9sbGVyR3JpcDIuYWRkKCBjb250cm9sbGVyTW9kZWxGYWN0b3J5LmNyZWF0ZUNvbnRyb2xsZXJNb2RlbCggY29udHJvbGxlckdyaXAyICkgKTtcclxuICAgIHRoaXMuX3VzZXIuYWRkKCBjb250cm9sbGVyR3JpcDIgKTtcclxuXHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIFsgbmV3IFZlY3RvcjMoIDAsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApIF0gKTtcclxuXHJcbiAgICBjb25zdCBsaW5lID0gbmV3IExpbmUoIGdlb21ldHJ5ICk7XHJcbiAgICBsaW5lLm5hbWUgPSAnbGluZSc7XHJcbiAgICBsaW5lLnNjYWxlLnogPSAxMDtcclxuXHJcbiAgICAvLyBPbmx5IGFkZCBsaW5lIHRvIGNvbnRyb2xsZXIwIHdoZW4gZGVidWdnaW5nIHdpdGggV2ViWFIgY2hyb21lIGV4dGVuc2lvblxyXG4gICAgLy8gdGhpcy5fY29udHJvbGxlcjAuYWRkKCBsaW5lLmNsb25lKCkgKTtcclxuICAgIHRoaXMuX2NvbnRyb2xsZXIxLmFkZCggbGluZS5jbG9uZSgpICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vblNlbGVjdFN0YXJ0KCBldmVudCApIHtcclxuICAgIGlmICh0aGlzLl9pc09iamVjdEZsb29yKHRoaXMuX2N1cnJlbnRDbG9zZXN0SW50ZXJzZWN0aW9uLm9iamVjdCkpIHtcclxuICAgICAgdGhpcy5fdXNlci5wb3NpdGlvbi5zZXQodGhpcy5fY3VycmVudENsb3Nlc3RJbnRlcnNlY3Rpb24ucG9pbnQueCwgMCwgdGhpcy5fY3VycmVudENsb3Nlc3RJbnRlcnNlY3Rpb24ucG9pbnQueik7XHJcbiAgICAgIHRoaXMuX2NvbnRyb2xsZXIwLnVwZGF0ZU1hdHJpeCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25TZWxlY3RFbmQoIGV2ZW50ICkge1xyXG4gICAgLy8gRnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgX29uU2VsZWN0U3RhcnRcclxuXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRJbnRlcnNlY3Rpb25zKCBjb250cm9sbGVyOiBhbnksIGdyb3VwOiBPYmplY3QzRFtdIHwgTWVzaFtdICkge1xyXG4gICAgdGhpcy5fdGVtcE1hdHJpeC5pZGVudGl0eSgpLmV4dHJhY3RSb3RhdGlvbiggY29udHJvbGxlci5tYXRyaXhXb3JsZCApO1xyXG4gICAgdGhpcy5fcmF5Y2FzdGVyLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjb250cm9sbGVyLm1hdHJpeFdvcmxkICk7XHJcbiAgICB0aGlzLl9yYXljYXN0ZXIucmF5LmRpcmVjdGlvbi5zZXQoIDAsIDAsIC0gMSApLmFwcGx5TWF0cml4NCggdGhpcy5fdGVtcE1hdHJpeCApO1xyXG5cclxuICAgIHJldHVybiB0aGlzLl9yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyggZ3JvdXAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3JlZ2lzdGVyTWVzaGVzKCkge1xyXG4gICAgdGhpcy5fc2NlbmUudHJhdmVyc2UoKG1lc2g6IE1lc2gpID0+IHtcclxuICAgICAgdGhpcy5fbWVzaGVzLnB1c2gobWVzaCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUludGVyc2VjdGlvbnMoKSB7XHJcbiAgICBpZiAodGhpcy5fcmVuZGVyZXIueHIuZ2V0Q29udHJvbGxlcigxKS52aXNpYmxlKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUNvbnRyb2xsZXJJbnRlcnNlY3Rpb25zKCB0aGlzLl9jb250cm9sbGVyMSApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5faGFuZGxlQ29udHJvbGxlckludGVyc2VjdGlvbnModGhpcy5fY29udHJvbGxlcjApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaGFuZGxlQ29udHJvbGxlckludGVyc2VjdGlvbnMoY29udHJvbGxlcjogYW55KSB7XHJcbiAgICBjb25zdCBvYmplY3RJbnRlcnNlY3Rpb25zID0gdGhpcy5fZ2V0SW50ZXJzZWN0aW9ucyhjb250cm9sbGVyLCB0aGlzLl9tZXNoZXMpO1xyXG5cclxuICAgIGlmIChvYmplY3RJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgbmVhcmVzdEludGVyc2VjdGlvbiA9IHRoaXMuX2dldE5lYXJlc3RJbnRlcnNlY3Rpb24ob2JqZWN0SW50ZXJzZWN0aW9ucyk7XHJcbiAgICAgIGlmIChuZWFyZXN0SW50ZXJzZWN0aW9uICE9PSBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fY3VycmVudENsb3Nlc3RJbnRlcnNlY3Rpb24gPSBuZWFyZXN0SW50ZXJzZWN0aW9uO1xyXG4gICAgICAgIGNvbnN0IG5lYXJlc3RPYmplY3RQYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRPZkNoaWxkKG5lYXJlc3RJbnRlcnNlY3Rpb24ub2JqZWN0KTtcclxuICAgICAgICBpZiAodGhpcy5faXNPYmplY3RGbG9vcihuZWFyZXN0SW50ZXJzZWN0aW9uLm9iamVjdCkpIHtcclxuICAgICAgICAgIHRoaXMuX2hhbmRsZUZsb29ySW50ZXJzZWN0aW9uKGNvbnRyb2xsZXIsIG5lYXJlc3RJbnRlcnNlY3Rpb24pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobmVhcmVzdE9iamVjdFBhcmVudCkge1xyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlT2JqZWN0U2VsZWN0aW9uKG5lYXJlc3RPYmplY3RQYXJlbnQpO1xyXG4gICAgICAgICAgdGhpcy5faGFuZGxlT2JqZWN0SW50ZXJzZWN0aW9uKGNvbnRyb2xsZXIsIG5lYXJlc3RJbnRlcnNlY3Rpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9oYW5kbGVOb0ludGVyc2VjdGlvbnMoY29udHJvbGxlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXROZWFyZXN0SW50ZXJzZWN0aW9uKGludGVyc2VjdGlvbnM6IEludGVyc2VjdGlvbltdKTogSW50ZXJzZWN0aW9uIHtcclxuICAgIGxldCBuZWFyZXN0ID0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgaW50ZXJzZWN0aW9uIG9mIGludGVyc2VjdGlvbnMpIHtcclxuICAgICAgLy8gVE9ETzogbmVlZCBhIGJldHRlciBzb2x1dGlvbiBmb3IgZmlyc3QgaWYtc3RhdGVtZW50XHJcbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ub2JqZWN0Lm5hbWUgJiYgKGludGVyc2VjdGlvbi5vYmplY3QubmFtZSA9PT0gJ2hvbWUnIHx8IGludGVyc2VjdGlvbi5vYmplY3QubmFtZSA9PT0gJ2xpbmUnKVxyXG4gICAgICAgIHx8IChpbnRlcnNlY3Rpb24ub2JqZWN0LnBhcmVudCAmJiBpbnRlcnNlY3Rpb24ub2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIFJldGljbGUpKSB7XHJcbiAgICAgICAgLy8gRE8gTk9USElOR1xyXG4gICAgICB9IGVsc2UgaWYgKG5lYXJlc3QgPT09IG51bGwgfHwgaW50ZXJzZWN0aW9uLmRpc3RhbmNlIDwgbmVhcmVzdC5kaXN0YW5jZSkge1xyXG4gICAgICAgIG5lYXJlc3QgPSBpbnRlcnNlY3Rpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmVhcmVzdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZUZsb29ySW50ZXJzZWN0aW9uKGNvbnRyb2xsZXI6IGFueSwgaW50ZXJzZWN0aW9uOiBJbnRlcnNlY3Rpb24pIHtcclxuICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xsZXJSYXkoY29udHJvbGxlciwgaW50ZXJzZWN0aW9uLmRpc3RhbmNlKTtcclxuICAgIHRoaXMuX3JldGljbGUudmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLl9yZXRpY2xlLnBvc2l0aW9uLmNvcHkoaW50ZXJzZWN0aW9uLnBvaW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZU9iamVjdEludGVyc2VjdGlvbihjb250cm9sbGVyOiBhbnksIGludGVyc2VjdGlvbjogSW50ZXJzZWN0aW9uKSB7XHJcbiAgICB0aGlzLl91cGRhdGVDb250cm9sbGVyUmF5KGNvbnRyb2xsZXIsIGludGVyc2VjdGlvbi5kaXN0YW5jZSk7XHJcbiAgICB0aGlzLl9yZXRpY2xlLnZpc2libGUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhbmRsZU5vSW50ZXJzZWN0aW9ucyhjb250cm9sbGVyOiBhbnkpIHtcclxuICAgIHRoaXMuX3JldGljbGUudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fdXBkYXRlQ29udHJvbGxlclJheShjb250cm9sbGVyLCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUNvbnRyb2xsZXJSYXkoY29udHJvbGxlcjogYW55LCByYXlMZW5naHQ6IG51bWJlcikge1xyXG4gICAgY29uc3QgbGluZSA9IGNvbnRyb2xsZXIuZ2V0T2JqZWN0QnlOYW1lKCAnbGluZScgKTtcclxuICAgIGlmIChsaW5lKSB7XHJcbiAgICAgIGxpbmUuc2NhbGUueiA9IHJheUxlbmdodDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzT2JqZWN0Rmxvb3Iob2JqZWN0OiBPYmplY3QzRCkge1xyXG4gICAgcmV0dXJuIG9iamVjdC5uYW1lICYmIG9iamVjdC5uYW1lID09PSAnZmxvb3ItcGxhbmUnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0UGFyZW50T2ZDaGlsZChvYmplY3Q6IGFueSk6IGFueSB7XHJcbiAgICAvLyBUT0RPOiByZXR1cm4gbnVsbCBpZiBvYmplY3QgaXMgbm90IHNlbGVjdGFibGVcclxuICAgIGlmICghb2JqZWN0LnBhcmVudCB8fCAob2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIFRIUkVFLlNjZW5lKSB8fCAob2JqZWN0LnBhcmVudCBpbnN0YW5jZW9mIFJldGljbGUpKSB7XHJcbiAgICAgIHJldHVybiBvYmplY3Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0UGFyZW50T2ZDaGlsZChvYmplY3QucGFyZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZU9iamVjdFNlbGVjdGlvbihvYmplY3Q6IE9iamVjdDNEKSB7XHJcbiAgICBpZiAoIXRoaXMuX3NlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkT2JqZWN0ID0gb2JqZWN0O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIG5ld2x5IHNlbGVjdGVkIGl0ZW1cclxuICAgIC8vIC4uLlxyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,294 @@
1
+ import { __awaiter } from "tslib";
2
+ // import WebXRPolyfill from 'webxr-polyfill';
3
+ import { Injectable } from '@angular/core';
4
+ import * as THREE from 'three';
5
+ import { CylinderGeometry, Mesh, MeshStandardMaterial, Object3D, Vector3 } from 'three';
6
+ import { BehaviorSubject, Subject } from 'rxjs';
7
+ import { XrMode } from '../enum/xr-mode.enum';
8
+ import { isNill } from '@colijnit/configuratorapi/build/utils/function/is-nill.function';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "./settings.service";
11
+ import * as i2 from "./debug.service";
12
+ import * as i3 from "./message-board.service";
13
+ export class XrService {
14
+ constructor(_settingsService, _debugService, _messageBoard) {
15
+ this._settingsService = _settingsService;
16
+ this._debugService = _debugService;
17
+ this._messageBoard = _messageBoard;
18
+ this.axes = [0, 0];
19
+ this.touchpadIsPressed = false;
20
+ this.triggerIsPressed = false;
21
+ this.angularVelocity = new Vector3();
22
+ this.vrSupported = false;
23
+ this.arSupported = false;
24
+ this.sessionStarted = new Subject();
25
+ this.sessionEnded = new Subject();
26
+ this.userSelectInAr = new BehaviorSubject(undefined);
27
+ this._subs = [];
28
+ this._mode = XrMode.VrMode;
29
+ }
30
+ ngOnDestroy() {
31
+ this._subs.forEach(s => s.unsubscribe());
32
+ }
33
+ init(renderer, scene, camera) {
34
+ return __awaiter(this, void 0, void 0, function* () {
35
+ if (!this._settingsService.settings.options.vrEnabled && !this._settingsService.settings.options.arEnabled) {
36
+ return;
37
+ }
38
+ this.renderer = renderer;
39
+ this.scene = scene;
40
+ this.scene.onBeforeRender =
41
+ (brRenderer, brScene, brCamera, brTarget) => this._doBeforeRenderScene(brRenderer, brScene, brCamera, brTarget);
42
+ this.camera = camera;
43
+ yield this._messageBoard.init(this.scene);
44
+ // this._createController();
45
+ this._logMessage('Starting XR');
46
+ // const polyfill = new WebXRPolyfill();
47
+ if (navigator.xr && !isNill(navigator.xr) && navigator.xr.isSessionSupported) {
48
+ this._logMessage('Checking support');
49
+ if (this._settingsService.settings.options.vrEnabled) {
50
+ navigator.xr.isSessionSupported('immersive-vr')
51
+ .then((supported) => {
52
+ if (supported) {
53
+ this._logMessage('Session for VR supported!');
54
+ this.vrSupported = true;
55
+ }
56
+ else {
57
+ this._logMessage('VR not supported!');
58
+ this.vrSupported = false;
59
+ }
60
+ })
61
+ .catch((e) => {
62
+ this._logMessage(e.message);
63
+ });
64
+ }
65
+ if (this._settingsService.settings.options.arEnabled) {
66
+ navigator.xr.isSessionSupported('immersive-ar')
67
+ .then((supported) => {
68
+ if (supported) {
69
+ this._logMessage('Session for AR supported!');
70
+ this.arSupported = true;
71
+ }
72
+ else {
73
+ this._logMessage('AR not supported!');
74
+ this.arSupported = false;
75
+ this._settingsService.settings.options.showArButton = false;
76
+ }
77
+ })
78
+ .catch((e) => {
79
+ this._logMessage(e.message);
80
+ });
81
+ }
82
+ }
83
+ else {
84
+ if ('getVRDisplays' in navigator) {
85
+ this._logMessage('getVRDisplays');
86
+ const displays = yield navigator.getVRDisplays();
87
+ if (displays.length > 0) {
88
+ this._vrDisplay = displays[0];
89
+ this._logMessage(this._vrDisplay.displayName);
90
+ this.vrSupported = true;
91
+ window.addEventListener('vrdisplaypresentchange', () => {
92
+ if (!this._vrDisplay.isPresenting) {
93
+ this.sessionEnded.next();
94
+ }
95
+ });
96
+ }
97
+ else {
98
+ this._logMessage('No VR display found!');
99
+ this.vrSupported = false;
100
+ }
101
+ }
102
+ }
103
+ });
104
+ }
105
+ startAr() {
106
+ this._mode = XrMode.ArMode;
107
+ this.renderer.xr.enabled = true;
108
+ this.renderer.setClearColor(0x000000, 0);
109
+ this.renderer.autoClear = false;
110
+ if (isNill(this.session)) {
111
+ const features = { requiredFeatures: ['local', 'hit-test'] };
112
+ navigator.xr.requestSession('immersive-ar', features).then((session) => {
113
+ this.renderer.xr.setReferenceSpaceType('local');
114
+ session.updateWorldTrackingState({ planeDetectionState: { enabled: true } });
115
+ session.requestReferenceSpace('viewer').then((refSpace) => {
116
+ this.viewerSpace = refSpace;
117
+ session.requestHitTestSource({ space: this.viewerSpace }).then((hitTestSource) => {
118
+ this.hitTestSource = hitTestSource;
119
+ });
120
+ });
121
+ session.requestReferenceSpace('local').then((refSpace) => {
122
+ this.refSpace = refSpace;
123
+ this._onSessionStarted(session);
124
+ });
125
+ });
126
+ }
127
+ else {
128
+ this.session.end();
129
+ }
130
+ }
131
+ stopAr() {
132
+ if (!isNill(this.session)) {
133
+ this.session.end();
134
+ }
135
+ if (this.renderer) {
136
+ this.renderer.xr.enabled = false;
137
+ this.renderer.setClearColor(0xfafafa);
138
+ this.renderer.autoClear = true;
139
+ }
140
+ }
141
+ startVr() {
142
+ if (this.vrSupported) {
143
+ this._mode = XrMode.VrMode;
144
+ this.renderer.xr.enabled = true;
145
+ if (isNill(this.session)) {
146
+ // Setting reference spaceType
147
+ this.renderer.xr.setReferenceSpaceType('local-floor');
148
+ // Initializing session
149
+ const sessionInit = { optionalFeatures: 'local-floor' };
150
+ navigator.xr.requestSession('immersive-vr', sessionInit).then((session) => {
151
+ // Start session
152
+ this._onSessionStarted(session);
153
+ });
154
+ }
155
+ else {
156
+ this.session.end();
157
+ }
158
+ }
159
+ }
160
+ stopVr() {
161
+ if (!isNill(this.session)) {
162
+ this.session.end();
163
+ }
164
+ if (this.renderer) {
165
+ this.renderer.xr.enabled = false;
166
+ }
167
+ if (this.camera && this._cameraHeight) {
168
+ this.camera.position.y = this._cameraHeight;
169
+ }
170
+ }
171
+ update() {
172
+ // this._updateController();
173
+ }
174
+ _doBeforeRenderScene(renderer, scene, camera, target) {
175
+ if (this.renderer.xr.enabled && this._mode === XrMode.VrMode) {
176
+ }
177
+ }
178
+ _logMessage(message) {
179
+ this._debugService.addMessage(message);
180
+ this._messageBoard.addMessage(message);
181
+ }
182
+ _onSessionStarted(session) {
183
+ this.session = session;
184
+ this.session.addEventListener('end', () => this._onSessionEnded());
185
+ this.session.addEventListener('select', () => this._onUserSelect());
186
+ this.renderer.xr.setSession(this.session);
187
+ this.sessionStarted.next(this._mode);
188
+ }
189
+ _onUserSelect() {
190
+ this.userSelectInAr.next(true);
191
+ }
192
+ _onSessionEnded() {
193
+ if (!isNill(this.session)) {
194
+ this.session.removeEventListener('select', () => this._onUserSelect());
195
+ this.session.removeEventListener('end', () => this._onSessionEnded());
196
+ this.session = null;
197
+ this.sessionEnded.next();
198
+ }
199
+ }
200
+ _updateController() {
201
+ if (!this._vrController) {
202
+ return;
203
+ }
204
+ this.gamepad = this._findGamepad();
205
+ if (this.gamepad !== undefined && this.gamepad.pose !== undefined) {
206
+ const pose = this.gamepad.pose;
207
+ if (pose === null) {
208
+ return; // no user action yet
209
+ }
210
+ // orientation
211
+ if (pose.orientation !== null) {
212
+ this._vrController.quaternion.fromArray(pose.orientation);
213
+ }
214
+ this._vrController.updateMatrix();
215
+ this._vrController.visible = true;
216
+ try {
217
+ const direction = new Vector3().applyEuler(this._vrController.rotation);
218
+ const raycaster = new THREE.Raycaster(this._vrController.position, direction);
219
+ const intersections = raycaster.intersectObjects(this.scene.children, true);
220
+ if (intersections.length) {
221
+ // this.controller.setMousePosition(Scene3DUtil.Convert3DPointToScreenPoint(
222
+ // intersections[0].point,
223
+ // this.camera,
224
+ // this.controller.getElement().clientWidth,
225
+ // this.controller.getElement().clientHeight));
226
+ // this.controller.doMouseMove();
227
+ }
228
+ }
229
+ catch (e) {
230
+ this._logMessage(e.message);
231
+ }
232
+ // angular velocity
233
+ if (pose.angularVelocity !== null && !this.angularVelocity.equals(pose.angularVelocity)) {
234
+ this.angularVelocity.fromArray(pose.angularVelocity);
235
+ // this.dispatchEvent({type: 'angularvelocitychanged', angularVelocity: this.angularVelocity});
236
+ }
237
+ // axes (touchpad)
238
+ if (this.axes[0] !== this.gamepad.axes[0] || this.axes[1] !== this.gamepad.axes[1]) {
239
+ this.axes[0] = this.gamepad.axes[0];
240
+ this.axes[1] = this.gamepad.axes[1];
241
+ // this._logMessage('axes moved');
242
+ // this.dispatchEvent({type: 'axischanged', axes: this.axes});
243
+ }
244
+ // button (touchpad)
245
+ if (this.touchpadIsPressed !== this.gamepad.buttons[0].pressed) {
246
+ this.touchpadIsPressed = this.gamepad.buttons[0].pressed;
247
+ // this._logMessage('touchpad pressed');
248
+ // this.dispatchEvent({type: this.touchpadIsPressed ? 'touchpaddown' : 'touchpadup', axes: this.axes});
249
+ }
250
+ // trigger
251
+ if (this.triggerIsPressed !== this.gamepad.buttons[1].pressed) {
252
+ this.triggerIsPressed = this.gamepad.buttons[1].pressed;
253
+ // this._logMessage('trigger pressed');
254
+ // this.dispatchEvent({type: this.triggerIsPressed ? 'triggerdown' : 'triggerup'});
255
+ }
256
+ // app button not available, reserved for use by the browser
257
+ }
258
+ else {
259
+ this._vrController.visible = false;
260
+ }
261
+ }
262
+ _findGamepad() {
263
+ const gamepads = navigator.getGamepads && navigator.getGamepads();
264
+ for (let i = 0; i < 4; i++) {
265
+ const gamepad = gamepads[i];
266
+ if (gamepad && (gamepad.id === 'Gear VR Controller' || gamepad.id === 'Oculus Go Controller')) {
267
+ return gamepad;
268
+ }
269
+ }
270
+ }
271
+ _createController() {
272
+ this._vrController = new Object3D();
273
+ this._createMeshes();
274
+ this.scene.add(this._vrController);
275
+ }
276
+ _createMeshes() {
277
+ const meshColorOff = 0xffffff, meshColorOn = 0xF4C20D, controllerMaterial = new MeshStandardMaterial({ color: meshColorOff }), controllerMesh = new Mesh(new CylinderGeometry(0.001, 0.003, 0.5, 16), controllerMaterial);
278
+ // handleMesh = new Mesh(new BoxGeometry(30, 10, 30), controllerMaterial);
279
+ // controllerMesh.add(new AxesHelper(50));
280
+ controllerMesh.geometry.translate(0, 0.25, 0);
281
+ controllerMaterial.flatShading = true;
282
+ controllerMesh.rotation.x = -Math.PI / 2;
283
+ // handleMesh.position.y = -5;
284
+ // controllerMesh.add(handleMesh);
285
+ this._vrController.add(controllerMesh);
286
+ }
287
+ }
288
+ XrService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: XrService, deps: [{ token: i1.SettingsService }, { token: i2.DebugService }, { token: i3.MessageBoardService }], target: i0.ɵɵFactoryTarget.Injectable });
289
+ XrService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: XrService, providedIn: 'root' });
290
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: XrService, decorators: [{
291
+ type: Injectable,
292
+ args: [{ providedIn: 'root' }]
293
+ }], ctorParameters: function () { return [{ type: i1.SettingsService }, { type: i2.DebugService }, { type: i3.MessageBoardService }]; } });
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbmZpZ3VyYXRvci9zcmMvbGliL3NlcnZpY2VzL3hyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhDQUE4QztBQUM5QyxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBUyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFTLE9BQU8sRUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFDcEgsT0FBTyxFQUFDLGVBQWUsRUFBRSxPQUFPLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTVDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpRUFBaUUsQ0FBQzs7Ozs7QUFLdkYsTUFBTSxPQUFPLFNBQVM7SUE4QnBCLFlBQ1UsZ0JBQWlDLEVBQ2pDLGFBQTJCLEVBQzNCLGFBQWtDO1FBRmxDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBOUJyQyxTQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFZCxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDMUIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQU1oQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixtQkFBYyxHQUFvQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhELGlCQUFZLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFDNUMs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RUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxrQkFBa0IsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekMsOEJBQThCO1FBQzlCLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN6QyxDQUFDOzt1R0F0VFUsU0FBUzsyR0FBVCxTQUFTLGNBREcsTUFBTTs0RkFDbEIsU0FBUztrQkFEckIsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgV2ViWFJQb2x5ZmlsbCBmcm9tICd3ZWJ4ci1wb2x5ZmlsbCc7XHJcbmltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0NhbWVyYSwgQ3lsaW5kZXJHZW9tZXRyeSwgTWVzaCwgTWVzaFN0YW5kYXJkTWF0ZXJpYWwsIE9iamVjdDNELCBTY2VuZSwgVmVjdG9yMywgV2ViR0xSZW5kZXJlcn0gZnJvbSAndGhyZWUnO1xyXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtYck1vZGV9IGZyb20gJy4uL2VudW0veHItbW9kZS5lbnVtJztcclxuaW1wb3J0IHtTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4vc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7aXNOaWxsfSBmcm9tICdAY29saWpuaXQvY29uZmlndXJhdG9yYXBpL2J1aWxkL3V0aWxzL2Z1bmN0aW9uL2lzLW5pbGwuZnVuY3Rpb24nO1xyXG5pbXBvcnQge0RlYnVnU2VydmljZX0gZnJvbSAnLi9kZWJ1Zy5zZXJ2aWNlJztcclxuaW1wb3J0IHtNZXNzYWdlQm9hcmRTZXJ2aWNlfSBmcm9tICcuL21lc3NhZ2UtYm9hcmQuc2VydmljZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcclxuZXhwb3J0IGNsYXNzIFhyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG4gIHB1YmxpYyBnYW1lcGFkO1xyXG4gIHB1YmxpYyBheGVzID0gWzAsIDBdO1xyXG5cclxuICBwdWJsaWMgdG91Y2hwYWRJc1ByZXNzZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgdHJpZ2dlcklzUHJlc3NlZCA9IGZhbHNlO1xyXG4gIHB1YmxpYyBhbmd1bGFyVmVsb2NpdHkgPSBuZXcgVmVjdG9yMygpO1xyXG4gIHB1YmxpYyByZW5kZXJlcjogV2ViR0xSZW5kZXJlcjtcclxuXHJcbiAgcHVibGljIHNjZW5lOiBTY2VuZTtcclxuICBwdWJsaWMgY2FtZXJhOiBDYW1lcmE7XHJcbiAgcHVibGljIGNvbnRyb2xsZXI6IGFueTtcclxuICBwdWJsaWMgdnJTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYXJTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2Vzc2lvblN0YXJ0ZWQ6IFN1YmplY3Q8WHJNb2RlPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBzZXNzaW9uRW5kZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIHB1YmxpYyB1c2VyU2VsZWN0SW5BcjogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh1bmRlZmluZWQpO1xyXG4gIHB1YmxpYyByZWZTcGFjZTogYW55O1xyXG4gIHB1YmxpYyB2aWV3ZXJTcGFjZTogYW55O1xyXG4gIHB1YmxpYyBzZXNzaW9uOiBhbnk7XHJcbiAgcHVibGljIGhpdFRlc3RTb3VyY2U6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBfdnJEaXNwbGF5OiBhbnk7XHJcbiAgcHJpdmF0ZSBfdnJDb250cm9sbGVyOiBPYmplY3QzRDtcclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2NhbWVyYUhlaWdodDogbnVtYmVyO1xyXG4gIHByaXZhdGUgX21vZGU6IFhyTW9kZSA9IFhyTW9kZS5Wck1vZGU7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kZWJ1Z1NlcnZpY2U6IERlYnVnU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VCb2FyZDogTWVzc2FnZUJvYXJkU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9zdWJzLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGluaXQocmVuZGVyZXI6IFdlYkdMUmVuZGVyZXIsIHNjZW5lOiBTY2VuZSwgY2FtZXJhOiBDYW1lcmEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudnJFbmFibGVkICYmICF0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5hckVuYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xyXG4gICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xyXG4gICAgdGhpcy5zY2VuZS5vbkJlZm9yZVJlbmRlciA9XHJcbiAgICAgIChiclJlbmRlcmVyLCBiclNjZW5lLCBickNhbWVyYSwgYnJUYXJnZXQpID0+IHRoaXMuX2RvQmVmb3JlUmVuZGVyU2NlbmUoYnJSZW5kZXJlciwgYnJTY2VuZSwgYnJDYW1lcmEsIGJyVGFyZ2V0KTtcclxuICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xyXG4gICAgYXdhaXQgdGhpcy5fbWVzc2FnZUJvYXJkLmluaXQodGhpcy5zY2VuZSk7XHJcbiAgICAvLyB0aGlzLl9jcmVhdGVDb250cm9sbGVyKCk7XHJcbiAgICB0aGlzLl9sb2dNZXNzYWdlKCdTdGFydGluZyBYUicpO1xyXG4gICAgLy8gY29uc3QgcG9seWZpbGwgPSBuZXcgV2ViWFJQb2x5ZmlsbCgpO1xyXG5cclxuICAgIGlmICgobmF2aWdhdG9yIGFzIGFueSkueHIgJiYgIWlzTmlsbCgobmF2aWdhdG9yIGFzIGFueSkueHIpICYmIChuYXZpZ2F0b3IgYXMgYW55KS54ci5pc1Nlc3Npb25TdXBwb3J0ZWQpIHtcclxuICAgICAgdGhpcy5fbG9nTWVzc2FnZSgnQ2hlY2tpbmcgc3VwcG9ydCcpO1xyXG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMudnJFbmFibGVkKSB7XHJcbiAgICAgICAgKG5hdmlnYXRvciBhcyBhbnkpLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCgnaW1tZXJzaXZlLXZyJylcclxuICAgICAgICAgIC50aGVuKChzdXBwb3J0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ01lc3NhZ2UoJ1Nlc3Npb24gZm9yIFZSIHN1cHBvcnRlZCEnKTtcclxuICAgICAgICAgICAgICB0aGlzLnZyU3VwcG9ydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9sb2dNZXNzYWdlKCdWUiBub3Qgc3VwcG9ydGVkIScpO1xyXG4gICAgICAgICAgICAgIHRoaXMudnJTdXBwb3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dNZXNzYWdlKGUubWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLm9wdGlvbnMuYXJFbmFibGVkKSB7XHJcbiAgICAgICAgKG5hdmlnYXRvciBhcyBhbnkpLnhyLmlzU2Vzc2lvblN1cHBvcnRlZCgnaW1tZXJzaXZlLWFyJylcclxuICAgICAgICAgIC50aGVuKChzdXBwb3J0ZWQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHN1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvZ01lc3NhZ2UoJ1Nlc3Npb24gZm9yIEFSIHN1cHBvcnRlZCEnKTtcclxuICAgICAgICAgICAgICB0aGlzLmFyU3VwcG9ydGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLl9sb2dNZXNzYWdlKCdBUiBub3Qgc3VwcG9ydGVkIScpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXJTdXBwb3J0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zaG93QXJCdXR0b24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2dNZXNzYWdlKGUubWVzc2FnZSk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKCdnZXRWUkRpc3BsYXlzJyBpbiBuYXZpZ2F0b3IpIHtcclxuICAgICAgICB0aGlzLl9sb2dNZXNzYWdlKCdnZXRWUkRpc3BsYXlzJyk7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheXMgPSBhd2FpdCBuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cygpO1xyXG4gICAgICAgIGlmIChkaXNwbGF5cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLl92ckRpc3BsYXkgPSBkaXNwbGF5c1swXTtcclxuICAgICAgICAgIHRoaXMuX2xvZ01lc3NhZ2UodGhpcy5fdnJEaXNwbGF5LmRpc3BsYXlOYW1lKTtcclxuICAgICAgICAgIHRoaXMudnJTdXBwb3J0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fdnJEaXNwbGF5LmlzUHJlc2VudGluZykge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkVuZGVkLm5leHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX2xvZ01lc3NhZ2UoJ05vIFZSIGRpc3BsYXkgZm91bmQhJyk7XHJcbiAgICAgICAgICB0aGlzLnZyU3VwcG9ydGVkID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRBcigpOiB2b2lkIHtcclxuICAgIHRoaXMuX21vZGUgPSBYck1vZGUuQXJNb2RlO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIueHIuZW5hYmxlZCA9IHRydWU7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHgwMDAwMDAsIDApO1xyXG4gICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSBmYWxzZTtcclxuXHJcbiAgICBpZiAoaXNOaWxsKHRoaXMuc2Vzc2lvbikpIHtcclxuICAgICAgY29uc3QgZmVhdHVyZXMgPSB7cmVxdWlyZWRGZWF0dXJlczogWydsb2NhbCcsICdoaXQtdGVzdCddfTtcclxuICAgICAgKG5hdmlnYXRvciBhcyBhbnkpLnhyLnJlcXVlc3RTZXNzaW9uKCdpbW1lcnNpdmUtYXInLCBmZWF0dXJlcykudGhlbigoc2Vzc2lvbikgPT4ge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCdsb2NhbCcpO1xyXG4gICAgICAgIHNlc3Npb24udXBkYXRlV29ybGRUcmFja2luZ1N0YXRlKHtwbGFuZURldGVjdGlvblN0YXRlOiB7ZW5hYmxlZDogdHJ1ZX19KTtcclxuXHJcbiAgICAgICAgc2Vzc2lvbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoJ3ZpZXdlcicpLnRoZW4oKHJlZlNwYWNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnZpZXdlclNwYWNlID0gcmVmU3BhY2U7XHJcbiAgICAgICAgICBzZXNzaW9uLnJlcXVlc3RIaXRUZXN0U291cmNlKHtzcGFjZTogdGhpcy52aWV3ZXJTcGFjZX0pLnRoZW4oKGhpdFRlc3RTb3VyY2UpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5oaXRUZXN0U291cmNlID0gaGl0VGVzdFNvdXJjZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSgnbG9jYWwnKS50aGVuKChyZWZTcGFjZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZWZTcGFjZSA9IHJlZlNwYWNlO1xyXG4gICAgICAgICAgdGhpcy5fb25TZXNzaW9uU3RhcnRlZChzZXNzaW9uKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlc3Npb24uZW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcEFyKCk6IHZvaWQge1xyXG4gICAgaWYgKCFpc05pbGwodGhpcy5zZXNzaW9uKSkge1xyXG4gICAgICB0aGlzLnNlc3Npb24uZW5kKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKDB4ZmFmYWZhKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hdXRvQ2xlYXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0VnIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy52clN1cHBvcnRlZCkge1xyXG4gICAgICB0aGlzLl9tb2RlID0gWHJNb2RlLlZyTW9kZTtcclxuICAgICAgdGhpcy5yZW5kZXJlci54ci5lbmFibGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgIGlmIChpc05pbGwodGhpcy5zZXNzaW9uKSkge1xyXG4gICAgICAgIC8vIFNldHRpbmcgcmVmZXJlbmNlIHNwYWNlVHlwZVxyXG4gICAgICAgIHRoaXMucmVuZGVyZXIueHIuc2V0UmVmZXJlbmNlU3BhY2VUeXBlKCdsb2NhbC1mbG9vcicpO1xyXG5cclxuICAgICAgICAvLyBJbml0aWFsaXppbmcgc2Vzc2lvblxyXG4gICAgICAgIGNvbnN0IHNlc3Npb25Jbml0ID0ge29wdGlvbmFsRmVhdHVyZXM6ICdsb2NhbC1mbG9vcid9O1xyXG4gICAgICAgIChuYXZpZ2F0b3IgYXMgYW55KS54ci5yZXF1ZXN0U2Vzc2lvbignaW1tZXJzaXZlLXZyJywgc2Vzc2lvbkluaXQpLnRoZW4oKHNlc3Npb24pID0+IHtcclxuICAgICAgICAgIC8vIFN0YXJ0IHNlc3Npb25cclxuICAgICAgICAgIHRoaXMuX29uU2Vzc2lvblN0YXJ0ZWQoc2Vzc2lvbik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uLmVuZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcFZyKCk6IHZvaWQge1xyXG4gICAgaWYgKCFpc05pbGwodGhpcy5zZXNzaW9uKSkge1xyXG4gICAgICB0aGlzLnNlc3Npb24uZW5kKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnhyLmVuYWJsZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNhbWVyYSAmJiB0aGlzLl9jYW1lcmFIZWlnaHQpIHtcclxuICAgICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueSA9IHRoaXMuX2NhbWVyYUhlaWdodDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGUoKTogdm9pZCB7XHJcbiAgICAvLyB0aGlzLl91cGRhdGVDb250cm9sbGVyKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kb0JlZm9yZVJlbmRlclNjZW5lKHJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLCBzY2VuZTogU2NlbmUsIGNhbWVyYTogQ2FtZXJhLCB0YXJnZXQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIueHIuZW5hYmxlZCAmJiB0aGlzLl9tb2RlID09PSBYck1vZGUuVnJNb2RlKSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9sb2dNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVidWdTZXJ2aWNlLmFkZE1lc3NhZ2UobWVzc2FnZSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlQm9hcmQuYWRkTWVzc2FnZShtZXNzYWdlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uU2Vzc2lvblN0YXJ0ZWQoc2Vzc2lvbik6IHZvaWQge1xyXG4gICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcclxuICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoKSA9PiB0aGlzLl9vblNlc3Npb25FbmRlZCgpKTtcclxuICAgIHRoaXMuc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3QnLCAoKSA9PiB0aGlzLl9vblVzZXJTZWxlY3QoKSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnhyLnNldFNlc3Npb24odGhpcy5zZXNzaW9uKTtcclxuICAgIHRoaXMuc2Vzc2lvblN0YXJ0ZWQubmV4dCh0aGlzLl9tb2RlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uVXNlclNlbGVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlclNlbGVjdEluQXIubmV4dCh0cnVlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uU2Vzc2lvbkVuZGVkKCk6IHZvaWQge1xyXG4gICAgaWYgKCFpc05pbGwodGhpcy5zZXNzaW9uKSkge1xyXG4gICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2VsZWN0JywgKCkgPT4gdGhpcy5fb25Vc2VyU2VsZWN0KCkpO1xyXG4gICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4gdGhpcy5fb25TZXNzaW9uRW5kZWQoKSk7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XHJcbiAgICAgIHRoaXMuc2Vzc2lvbkVuZGVkLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZUNvbnRyb2xsZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuX3ZyQ29udHJvbGxlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nYW1lcGFkID0gdGhpcy5fZmluZEdhbWVwYWQoKTtcclxuICAgIGlmICh0aGlzLmdhbWVwYWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdhbWVwYWQucG9zZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGNvbnN0IHBvc2UgPSB0aGlzLmdhbWVwYWQucG9zZTtcclxuICAgICAgaWYgKHBvc2UgPT09IG51bGwpIHtcclxuICAgICAgICByZXR1cm47IC8vIG5vIHVzZXIgYWN0aW9uIHlldFxyXG4gICAgICB9XHJcbiAgICAgIC8vICBvcmllbnRhdGlvblxyXG4gICAgICBpZiAocG9zZS5vcmllbnRhdGlvbiAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX3ZyQ29udHJvbGxlci5xdWF0ZXJuaW9uLmZyb21BcnJheShwb3NlLm9yaWVudGF0aW9uKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl92ckNvbnRyb2xsZXIudXBkYXRlTWF0cml4KCk7XHJcbiAgICAgIHRoaXMuX3ZyQ29udHJvbGxlci52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBuZXcgVmVjdG9yMygpLmFwcGx5RXVsZXIodGhpcy5fdnJDb250cm9sbGVyLnJvdGF0aW9uKTtcclxuICAgICAgICBjb25zdCByYXljYXN0ZXIgPSBuZXcgVEhSRUUuUmF5Y2FzdGVyKHRoaXMuX3ZyQ29udHJvbGxlci5wb3NpdGlvbiwgZGlyZWN0aW9uKTtcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3Rpb25zID0gcmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5zY2VuZS5jaGlsZHJlbiwgdHJ1ZSk7XHJcbiAgICAgICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLmNvbnRyb2xsZXIuc2V0TW91c2VQb3NpdGlvbihTY2VuZTNEVXRpbC5Db252ZXJ0M0RQb2ludFRvU2NyZWVuUG9pbnQoXHJcbiAgICAgICAgICAvLyAgIGludGVyc2VjdGlvbnNbMF0ucG9pbnQsXHJcbiAgICAgICAgICAvLyAgIHRoaXMuY2FtZXJhLFxyXG4gICAgICAgICAgLy8gICB0aGlzLmNvbnRyb2xsZXIuZ2V0RWxlbWVudCgpLmNsaWVudFdpZHRoLFxyXG4gICAgICAgICAgLy8gICB0aGlzLmNvbnRyb2xsZXIuZ2V0RWxlbWVudCgpLmNsaWVudEhlaWdodCkpO1xyXG4gICAgICAgICAgLy8gdGhpcy5jb250cm9sbGVyLmRvTW91c2VNb3ZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgdGhpcy5fbG9nTWVzc2FnZShlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBhbmd1bGFyIHZlbG9jaXR5XHJcbiAgICAgIGlmIChwb3NlLmFuZ3VsYXJWZWxvY2l0eSAhPT0gbnVsbCAmJiAhdGhpcy5hbmd1bGFyVmVsb2NpdHkuZXF1YWxzKHBvc2UuYW5ndWxhclZlbG9jaXR5KSkge1xyXG4gICAgICAgIHRoaXMuYW5ndWxhclZlbG9jaXR5LmZyb21BcnJheShwb3NlLmFuZ3VsYXJWZWxvY2l0eSk7XHJcbiAgICAgICAgLy8gdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiAnYW5ndWxhcnZlbG9jaXR5Y2hhbmdlZCcsIGFuZ3VsYXJWZWxvY2l0eTogdGhpcy5hbmd1bGFyVmVsb2NpdHl9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyBheGVzICh0b3VjaHBhZClcclxuICAgICAgaWYgKHRoaXMuYXhlc1swXSAhPT0gdGhpcy5nYW1lcGFkLmF4ZXNbMF0gfHwgdGhpcy5heGVzWzFdICE9PSB0aGlzLmdhbWVwYWQuYXhlc1sxXSkge1xyXG4gICAgICAgIHRoaXMuYXhlc1swXSA9IHRoaXMuZ2FtZXBhZC5heGVzWzBdO1xyXG4gICAgICAgIHRoaXMuYXhlc1sxXSA9IHRoaXMuZ2FtZXBhZC5heGVzWzFdO1xyXG4gICAgICAgIC8vIHRoaXMuX2xvZ01lc3NhZ2UoJ2F4ZXMgbW92ZWQnKTtcclxuICAgICAgICAvLyB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ICdheGlzY2hhbmdlZCcsIGF4ZXM6IHRoaXMuYXhlc30pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGJ1dHRvbiAodG91Y2hwYWQpXHJcbiAgICAgIGlmICh0aGlzLnRvdWNocGFkSXNQcmVzc2VkICE9PSB0aGlzLmdhbWVwYWQuYnV0dG9uc1swXS5wcmVzc2VkKSB7XHJcbiAgICAgICAgdGhpcy50b3VjaHBhZElzUHJlc3NlZCA9IHRoaXMuZ2FtZXBhZC5idXR0b25zWzBdLnByZXNzZWQ7XHJcbiAgICAgICAgLy8gdGhpcy5fbG9nTWVzc2FnZSgndG91Y2hwYWQgcHJlc3NlZCcpO1xyXG4gICAgICAgIC8vIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZTogdGhpcy50b3VjaHBhZElzUHJlc3NlZCA/ICd0b3VjaHBhZGRvd24nIDogJ3RvdWNocGFkdXAnLCBheGVzOiB0aGlzLmF4ZXN9KTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0cmlnZ2VyXHJcbiAgICAgIGlmICh0aGlzLnRyaWdnZXJJc1ByZXNzZWQgIT09IHRoaXMuZ2FtZXBhZC5idXR0b25zWzFdLnByZXNzZWQpIHtcclxuICAgICAgICB0aGlzLnRyaWdnZXJJc1ByZXNzZWQgPSB0aGlzLmdhbWVwYWQuYnV0dG9uc1sxXS5wcmVzc2VkO1xyXG4gICAgICAgIC8vIHRoaXMuX2xvZ01lc3NhZ2UoJ3RyaWdnZXIgcHJlc3NlZCcpO1xyXG4gICAgICAgIC8vIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZTogdGhpcy50cmlnZ2VySXNQcmVzc2VkID8gJ3RyaWdnZXJkb3duJyA6ICd0cmlnZ2VydXAnfSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gYXBwIGJ1dHRvbiBub3QgYXZhaWxhYmxlLCByZXNlcnZlZCBmb3IgdXNlIGJ5IHRoZSBicm93c2VyXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl92ckNvbnRyb2xsZXIudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmluZEdhbWVwYWQoKSB7XHJcbiAgICBjb25zdCBnYW1lcGFkcyA9IG5hdmlnYXRvci5nZXRHYW1lcGFkcyAmJiBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGdhbWVwYWQgPSBnYW1lcGFkc1tpXTtcclxuICAgICAgaWYgKGdhbWVwYWQgJiYgKGdhbWVwYWQuaWQgPT09ICdHZWFyIFZSIENvbnRyb2xsZXInIHx8IGdhbWVwYWQuaWQgPT09ICdPY3VsdXMgR28gQ29udHJvbGxlcicpKSB7XHJcbiAgICAgICAgcmV0dXJuIGdhbWVwYWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZUNvbnRyb2xsZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl92ckNvbnRyb2xsZXIgPSBuZXcgT2JqZWN0M0QoKTtcclxuICAgIHRoaXMuX2NyZWF0ZU1lc2hlcygpO1xyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5fdnJDb250cm9sbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2NyZWF0ZU1lc2hlcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IG1lc2hDb2xvck9mZiA9IDB4ZmZmZmZmLFxyXG4gICAgICBtZXNoQ29sb3JPbiA9IDB4RjRDMjBELFxyXG4gICAgICBjb250cm9sbGVyTWF0ZXJpYWwgPSBuZXcgTWVzaFN0YW5kYXJkTWF0ZXJpYWwoe2NvbG9yOiBtZXNoQ29sb3JPZmZ9KSxcclxuICAgICAgY29udHJvbGxlck1lc2ggPSBuZXcgTWVzaChuZXcgQ3lsaW5kZXJHZW9tZXRyeSgwLjAwMSwgMC4wMDMsIDAuNSwgMTYpLCBjb250cm9sbGVyTWF0ZXJpYWwpO1xyXG4gICAgLy8gaGFuZGxlTWVzaCA9IG5ldyBNZXNoKG5ldyBCb3hHZW9tZXRyeSgzMCwgMTAsIDMwKSwgY29udHJvbGxlck1hdGVyaWFsKTtcclxuICAgIC8vIGNvbnRyb2xsZXJNZXNoLmFkZChuZXcgQXhlc0hlbHBlcig1MCkpO1xyXG4gICAgY29udHJvbGxlck1lc2guZ2VvbWV0cnkudHJhbnNsYXRlKDAsIDAuMjUsIDApO1xyXG4gICAgY29udHJvbGxlck1hdGVyaWFsLmZsYXRTaGFkaW5nID0gdHJ1ZTtcclxuICAgIGNvbnRyb2xsZXJNZXNoLnJvdGF0aW9uLnggPSAtTWF0aC5QSSAvIDI7XHJcbiAgICAvLyBoYW5kbGVNZXNoLnBvc2l0aW9uLnkgPSAtNTtcclxuICAgIC8vIGNvbnRyb2xsZXJNZXNoLmFkZChoYW5kbGVNZXNoKTtcclxuICAgIHRoaXMuX3ZyQ29udHJvbGxlci5hZGQoY29udHJvbGxlck1lc2gpO1xyXG4gIH1cclxufVxyXG4iXX0=