angular-three-soba 1.14.1 → 2.0.0-beta.11

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 (426) hide show
  1. package/README.md +2 -2
  2. package/abstractions/billboard/billboard.d.ts +28 -0
  3. package/abstractions/detailed/detailed.d.ts +26 -0
  4. package/abstractions/edges/edges.d.ts +34 -0
  5. package/abstractions/grid/grid.d.ts +50 -0
  6. package/abstractions/index.d.ts +6 -11
  7. package/abstractions/text/text.d.ts +82 -0
  8. package/abstractions/text-3d/text-3d.d.ts +81 -0
  9. package/cameras/{lib/camera → camera}/camera-content.d.ts +2 -2
  10. package/cameras/camera/camera.d.ts +26 -0
  11. package/cameras/cube-camera/cube-camera.d.ts +69 -0
  12. package/cameras/index.d.ts +4 -4
  13. package/cameras/orthographic-camera/orthographic-camera.d.ts +37 -0
  14. package/cameras/{lib/perspective-camera → perspective-camera}/perspective-camera.d.ts +10 -1
  15. package/controls/index.d.ts +1 -1
  16. package/controls/orbit-controls/orbit-controls.d.ts +54 -0
  17. package/esm2022/abstractions/angular-three-soba-abstractions.mjs +1 -1
  18. package/esm2022/abstractions/billboard/billboard.mjs +74 -0
  19. package/esm2022/abstractions/detailed/detailed.mjs +64 -0
  20. package/esm2022/abstractions/edges/edges.mjs +88 -0
  21. package/esm2022/abstractions/grid/grid.mjs +180 -0
  22. package/esm2022/abstractions/index.mjs +7 -12
  23. package/esm2022/abstractions/text/text.mjs +274 -0
  24. package/esm2022/abstractions/text-3d/text-3d.mjs +165 -0
  25. package/esm2022/angular-three-soba.mjs +1 -1
  26. package/esm2022/cameras/angular-three-soba-cameras.mjs +1 -1
  27. package/esm2022/cameras/camera/camera-content.mjs +20 -0
  28. package/esm2022/cameras/camera/camera.mjs +77 -0
  29. package/esm2022/cameras/cube-camera/cube-camera.mjs +161 -0
  30. package/esm2022/cameras/index.mjs +5 -5
  31. package/esm2022/cameras/orthographic-camera/orthographic-camera.mjs +102 -0
  32. package/esm2022/cameras/perspective-camera/perspective-camera.mjs +46 -0
  33. package/esm2022/controls/angular-three-soba-controls.mjs +1 -1
  34. package/esm2022/controls/index.mjs +2 -2
  35. package/esm2022/controls/orbit-controls/orbit-controls.mjs +181 -0
  36. package/esm2022/index.mjs +1 -1
  37. package/esm2022/loaders/angular-three-soba-loaders.mjs +1 -1
  38. package/esm2022/loaders/gltf-loader/gltf-loader.mjs +30 -0
  39. package/esm2022/loaders/index.mjs +5 -6
  40. package/esm2022/loaders/loader/loader.mjs +138 -0
  41. package/esm2022/loaders/progress/progress.mjs +45 -0
  42. package/esm2022/loaders/texture-loader/texture-loader.mjs +28 -0
  43. package/esm2022/materials/angular-three-soba-materials.mjs +1 -1
  44. package/esm2022/materials/index.mjs +7 -6
  45. package/esm2022/materials/mesh-distort-material/mesh-distort-material.mjs +82 -0
  46. package/esm2022/materials/mesh-reflector-material/mesh-reflector-material.mjs +367 -0
  47. package/esm2022/materials/mesh-refraction-material/mesh-refraction-material.mjs +171 -0
  48. package/esm2022/materials/mesh-transmission-material/mesh-transmission-material.mjs +278 -0
  49. package/esm2022/materials/mesh-wobble-material/mesh-wobble-material.mjs +68 -0
  50. package/esm2022/materials/point-material/point-material.mjs +46 -0
  51. package/esm2022/misc/angular-three-soba-misc.mjs +1 -1
  52. package/esm2022/misc/animations/animations.mjs +59 -0
  53. package/esm2022/misc/bake-shadows/bake-shadows.mjs +24 -0
  54. package/esm2022/misc/caustics/caustics.mjs +387 -0
  55. package/esm2022/misc/decal/decal.mjs +187 -0
  56. package/esm2022/misc/depth-buffer/depth-buffer.mjs +44 -0
  57. package/esm2022/misc/example/example.mjs +160 -0
  58. package/esm2022/misc/fbo/fbo.mjs +47 -0
  59. package/esm2022/misc/html/html-wrapper.mjs +478 -0
  60. package/esm2022/misc/html/html.mjs +304 -0
  61. package/esm2022/misc/index.mjs +14 -5
  62. package/esm2022/misc/sampler/sampler.mjs +142 -0
  63. package/esm2022/misc/shadow/shadow.mjs +111 -0
  64. package/esm2022/misc/stats-gl/stats-gl.mjs +61 -0
  65. package/esm2022/misc/trail/trail.mjs +209 -0
  66. package/esm2022/misc/trail-texture/inject-trail-texture.mjs +17 -0
  67. package/esm2022/misc/trail-texture/trail-texture.mjs +106 -0
  68. package/esm2022/modifiers/angular-three-soba-modifiers.mjs +5 -0
  69. package/esm2022/modifiers/curve-modifier/curve-modifier.mjs +64 -0
  70. package/esm2022/modifiers/index.mjs +2 -0
  71. package/esm2022/performances/adaptive-dpr/adaptive-dpr.mjs +44 -0
  72. package/esm2022/performances/adaptive-events/adaptive-events.mjs +27 -0
  73. package/esm2022/performances/angular-three-soba-performances.mjs +5 -0
  74. package/esm2022/performances/index.mjs +6 -0
  75. package/esm2022/performances/points/points-input.mjs +64 -0
  76. package/esm2022/performances/points/points.mjs +329 -0
  77. package/esm2022/performances/points/position-point.mjs +54 -0
  78. package/esm2022/performances/segments/segment-object.mjs +9 -0
  79. package/esm2022/performances/segments/segments.mjs +182 -0
  80. package/esm2022/shaders/angular-three-soba-shaders.mjs +1 -1
  81. package/esm2022/shaders/blur-pass/blur-pass.mjs +61 -0
  82. package/esm2022/shaders/caustics/caustics-material.mjs +130 -0
  83. package/esm2022/shaders/caustics/caustics-projection-material.mjs +31 -0
  84. package/esm2022/shaders/convolution-material/convolution-material.mjs +94 -0
  85. package/esm2022/shaders/discard-material/discard-material.mjs +3 -0
  86. package/esm2022/shaders/grid-material/grid-material.mjs +77 -0
  87. package/esm2022/shaders/index.mjs +18 -15
  88. package/esm2022/shaders/mesh-distort-material/mesh-distort-material.mjs +56 -0
  89. package/esm2022/shaders/mesh-reflector-material/mesh-reflector-material.mjs +223 -0
  90. package/esm2022/shaders/mesh-refraction-material/mesh-refraction-material.mjs +170 -0
  91. package/esm2022/shaders/mesh-transmission-material/mesh-transmission-material.mjs +268 -0
  92. package/esm2022/shaders/mesh-wobble-material/mesh-wobble-material.mjs +37 -0
  93. package/esm2022/shaders/shader-material/shader-material.mjs +34 -0
  94. package/esm2022/shaders/soft-shadow-material/soft-shadow-material.mjs +25 -0
  95. package/esm2022/shaders/sparkles-material/sparkles-material.mjs +33 -0
  96. package/esm2022/shaders/spot-light-material/spot-light-material.mjs +86 -0
  97. package/esm2022/shaders/star-field-material/star-field-material.mjs +33 -0
  98. package/esm2022/shaders/wireframe-material/wireframe-material.mjs +247 -0
  99. package/esm2022/staging/accumulative-shadows/accumulative-shadows.mjs +267 -0
  100. package/esm2022/staging/accumulative-shadows/progressive-light-map.mjs +108 -0
  101. package/esm2022/staging/accumulative-shadows/randomized-lights.mjs +206 -0
  102. package/esm2022/staging/angular-three-soba-staging.mjs +1 -1
  103. package/esm2022/staging/backdrop/backdrop.mjs +77 -0
  104. package/esm2022/staging/bb-anchor/bb-anchor.mjs +69 -0
  105. package/esm2022/staging/bounds/bounds.mjs +308 -0
  106. package/esm2022/staging/camera-shake/camera-shake.mjs +123 -0
  107. package/esm2022/staging/center/center.mjs +163 -0
  108. package/esm2022/staging/cloud/cloud.mjs +158 -0
  109. package/esm2022/staging/contact-shadows/contact-shadows.mjs +246 -0
  110. package/esm2022/staging/environment/assets.mjs +13 -0
  111. package/esm2022/staging/environment/environment-cube.mjs +47 -0
  112. package/esm2022/staging/environment/environment-ground.mjs +41 -0
  113. package/esm2022/staging/environment/environment-input.mjs +119 -0
  114. package/esm2022/staging/environment/environment-map.mjs +53 -0
  115. package/esm2022/staging/environment/environment-portal.mjs +113 -0
  116. package/esm2022/staging/environment/environment.mjs +61 -0
  117. package/esm2022/staging/environment/utils.mjs +105 -0
  118. package/esm2022/staging/float/float.mjs +94 -0
  119. package/esm2022/staging/index.mjs +22 -18
  120. package/esm2022/staging/matcap-texture/matcap-texture.mjs +64 -0
  121. package/esm2022/staging/normal-texture/normal-texture.mjs +53 -0
  122. package/esm2022/staging/sky/sky.mjs +119 -0
  123. package/esm2022/staging/sparkles/sparkles.mjs +164 -0
  124. package/esm2022/staging/spot-light/shadow-mesh-input.mjs +63 -0
  125. package/esm2022/staging/spot-light/shadow-mesh.mjs +266 -0
  126. package/esm2022/staging/spot-light/spot-light-input.mjs +84 -0
  127. package/esm2022/staging/spot-light/spot-light.mjs +81 -0
  128. package/esm2022/staging/spot-light/volumetric-mesh.mjs +98 -0
  129. package/esm2022/staging/stage/stage.mjs +388 -0
  130. package/esm2022/staging/stars/stars.mjs +147 -0
  131. package/esm2022/staging/wireframe/wireframe-input.mjs +191 -0
  132. package/esm2022/staging/wireframe/wireframe.mjs +224 -0
  133. package/esm2022/utils/angular-three-soba-utils.mjs +5 -0
  134. package/esm2022/utils/content/content.mjs +15 -0
  135. package/esm2022/utils/index.mjs +2 -0
  136. package/fesm2022/angular-three-soba-abstractions.mjs +668 -1882
  137. package/fesm2022/angular-three-soba-abstractions.mjs.map +1 -1
  138. package/fesm2022/angular-three-soba-cameras.mjs +279 -232
  139. package/fesm2022/angular-three-soba-cameras.mjs.map +1 -1
  140. package/fesm2022/angular-three-soba-controls.mjs +104 -69
  141. package/fesm2022/angular-three-soba-controls.mjs.map +1 -1
  142. package/fesm2022/angular-three-soba-loaders.mjs +177 -164
  143. package/fesm2022/angular-three-soba-loaders.mjs.map +1 -1
  144. package/fesm2022/angular-three-soba-materials.mjs +630 -482
  145. package/fesm2022/angular-three-soba-materials.mjs.map +1 -1
  146. package/fesm2022/angular-three-soba-misc.mjs +2248 -122
  147. package/fesm2022/angular-three-soba-misc.mjs.map +1 -1
  148. package/fesm2022/angular-three-soba-modifiers.mjs +71 -0
  149. package/fesm2022/angular-three-soba-modifiers.mjs.map +1 -0
  150. package/fesm2022/angular-three-soba-performances.mjs +697 -0
  151. package/fesm2022/angular-three-soba-performances.mjs.map +1 -0
  152. package/fesm2022/angular-three-soba-shaders.mjs +554 -209
  153. package/fesm2022/angular-three-soba-shaders.mjs.map +1 -1
  154. package/fesm2022/angular-three-soba-staging.mjs +3230 -2852
  155. package/fesm2022/angular-three-soba-staging.mjs.map +1 -1
  156. package/fesm2022/angular-three-soba-utils.mjs +22 -0
  157. package/fesm2022/angular-three-soba-utils.mjs.map +1 -0
  158. package/fesm2022/angular-three-soba.mjs.map +1 -1
  159. package/loaders/gltf-loader/gltf-loader.d.ts +10 -0
  160. package/loaders/index.d.ts +4 -5
  161. package/loaders/loader/loader.d.ts +33 -0
  162. package/loaders/progress/progress.d.ts +9 -0
  163. package/loaders/texture-loader/texture-loader.d.ts +7 -0
  164. package/materials/index.d.ts +6 -5
  165. package/materials/mesh-distort-material/mesh-distort-material.d.ts +40 -0
  166. package/materials/mesh-reflector-material/mesh-reflector-material.d.ts +99 -0
  167. package/materials/mesh-refraction-material/mesh-refraction-material.d.ts +62 -0
  168. package/materials/mesh-transmission-material/mesh-transmission-material.d.ts +107 -0
  169. package/materials/mesh-wobble-material/mesh-wobble-material.d.ts +29 -0
  170. package/materials/point-material/point-material.d.ts +24 -0
  171. package/metadata.json +1 -0
  172. package/misc/animations/animations.d.ts +15 -0
  173. package/misc/{lib/bake-shadows → bake-shadows}/bake-shadows.d.ts +2 -5
  174. package/misc/caustics/caustics.d.ts +87 -0
  175. package/misc/decal/decal.d.ts +49 -0
  176. package/misc/depth-buffer/depth-buffer.d.ts +9 -0
  177. package/misc/example/example.d.ts +81 -0
  178. package/misc/{lib/fbo → fbo}/fbo.d.ts +4 -2
  179. package/misc/html/html-wrapper.d.ts +559 -0
  180. package/misc/html/html.d.ts +214 -0
  181. package/misc/index.d.ts +13 -4
  182. package/misc/sampler/sampler.d.ts +67 -0
  183. package/misc/shadow/shadow.d.ts +37 -0
  184. package/misc/stats-gl/stats-gl.d.ts +24 -0
  185. package/misc/trail/trail.d.ts +57 -0
  186. package/misc/trail-texture/inject-trail-texture.d.ts +9 -0
  187. package/misc/trail-texture/trail-texture.d.ts +50 -0
  188. package/modifiers/README.md +3 -0
  189. package/modifiers/curve-modifier/curve-modifier.d.ts +23 -0
  190. package/modifiers/index.d.ts +1 -0
  191. package/package.json +43 -32
  192. package/performances/README.md +3 -0
  193. package/performances/adaptive-dpr/adaptive-dpr.d.ts +14 -0
  194. package/{performance/lib/adaptive → performances/adaptive-events}/adaptive-events.d.ts +5 -6
  195. package/performances/index.d.ts +5 -0
  196. package/performances/points/points-input.d.ts +32 -0
  197. package/performances/points/points.d.ts +92 -0
  198. package/performances/points/position-point.d.ts +11 -0
  199. package/performances/segments/segment-object.d.ts +7 -0
  200. package/performances/segments/segments.d.ts +124 -0
  201. package/shaders/{lib/blur-pass → blur-pass}/blur-pass.d.ts +2 -2
  202. package/shaders/grid-material/grid-material.d.ts +37 -0
  203. package/shaders/index.d.ts +17 -14
  204. package/shaders/{lib/mesh-distort-material → mesh-distort-material}/mesh-distort-material.d.ts +147 -2
  205. package/shaders/{lib/mesh-transmission-material → mesh-transmission-material}/mesh-transmission-material.d.ts +1 -1
  206. package/shaders/{lib/mesh-wobble-material → mesh-wobble-material}/mesh-wobble-material.d.ts +1 -0
  207. package/shaders/{lib/shader-material → shader-material}/shader-material.d.ts +2 -2
  208. package/shaders/soft-shadow-material/soft-shadow-material.d.ts +19 -0
  209. package/shaders/sparkles-material/sparkles-material.d.ts +17 -0
  210. package/shaders/spot-light-material/spot-light-material.d.ts +13 -0
  211. package/shaders/star-field-material/star-field-material.d.ts +13 -0
  212. package/shaders/wireframe-material/wireframe-material.d.ts +58 -0
  213. package/staging/accumulative-shadows/accumulative-shadows.d.ts +146 -0
  214. package/staging/{lib/accumulative-shadows → accumulative-shadows}/progressive-light-map.d.ts +2 -2
  215. package/staging/accumulative-shadows/randomized-lights.d.ts +90 -0
  216. package/staging/backdrop/backdrop.d.ts +30 -0
  217. package/staging/bb-anchor/bb-anchor.d.ts +27 -0
  218. package/staging/bounds/bounds.d.ts +134 -0
  219. package/staging/camera-shake/camera-shake.d.ts +43 -0
  220. package/staging/center/center.d.ts +70 -0
  221. package/staging/cloud/cloud.d.ts +51 -0
  222. package/staging/contact-shadows/contact-shadows.d.ts +70 -0
  223. package/staging/{lib/environment → environment}/assets.d.ts +9 -9
  224. package/staging/environment/environment-cube.d.ts +15 -0
  225. package/staging/environment/environment-ground.d.ts +13 -0
  226. package/staging/environment/environment-input.d.ts +68 -0
  227. package/staging/environment/environment-map.d.ts +16 -0
  228. package/staging/environment/environment-portal.d.ts +18 -0
  229. package/staging/{lib/environment → environment}/environment.d.ts +2 -6
  230. package/staging/environment/utils.d.ts +7 -0
  231. package/staging/float/float.d.ts +31 -0
  232. package/staging/index.d.ts +21 -17
  233. package/staging/matcap-texture/matcap-texture.d.ts +13 -0
  234. package/staging/normal-texture/normal-texture.d.ts +16 -0
  235. package/staging/sky/sky.d.ts +48 -0
  236. package/staging/sparkles/sparkles.d.ts +63 -0
  237. package/staging/spot-light/shadow-mesh-input.d.ts +29 -0
  238. package/staging/spot-light/shadow-mesh.d.ts +37 -0
  239. package/staging/spot-light/spot-light-input.d.ts +38 -0
  240. package/staging/spot-light/spot-light.d.ts +39 -0
  241. package/staging/spot-light/volumetric-mesh.d.ts +24 -0
  242. package/staging/stage/stage.d.ts +130 -0
  243. package/staging/stars/stars.d.ts +45 -0
  244. package/staging/wireframe/wireframe-input.d.ts +65 -0
  245. package/staging/wireframe/wireframe.d.ts +28 -0
  246. package/utils/README.md +3 -0
  247. package/utils/content/content.d.ts +8 -0
  248. package/utils/index.d.ts +1 -0
  249. package/web-types.json +1 -0
  250. package/abstractions/lib/billboard/billboard.d.ts +0 -14
  251. package/abstractions/lib/catmull-rom-line/catmull-rom-line.d.ts +0 -15
  252. package/abstractions/lib/cubic-bezier-line/cubic-bezier-line.d.ts +0 -15
  253. package/abstractions/lib/edges/edges.d.ts +0 -18
  254. package/abstractions/lib/gizmo-helper/gizmo-helper.d.ts +0 -41
  255. package/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.d.ts +0 -12
  256. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.d.ts +0 -16
  257. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.d.ts +0 -24
  258. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.d.ts +0 -14
  259. package/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.d.ts +0 -15
  260. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.d.ts +0 -28
  261. package/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.d.ts +0 -21
  262. package/abstractions/lib/line/line-input.d.ts +0 -19
  263. package/abstractions/lib/line/line.d.ts +0 -21
  264. package/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.d.ts +0 -19
  265. package/abstractions/lib/text/text.d.ts +0 -21
  266. package/abstractions/lib/text-3d/text-3d.d.ts +0 -39
  267. package/assets/default-spot-light-shadow.glsl +0 -10
  268. package/cameras/lib/camera/camera.d.ts +0 -19
  269. package/cameras/lib/cube-camera/cube-camera.d.ts +0 -27
  270. package/cameras/lib/orthographic-camera/orthographic-camera.d.ts +0 -17
  271. package/controls/lib/orbit-controls/orbit-controls.d.ts +0 -27
  272. package/esm2022/abstractions/lib/billboard/billboard.mjs +0 -74
  273. package/esm2022/abstractions/lib/catmull-rom-line/catmull-rom-line.mjs +0 -120
  274. package/esm2022/abstractions/lib/cubic-bezier-line/cubic-bezier-line.mjs +0 -99
  275. package/esm2022/abstractions/lib/edges/edges.mjs +0 -96
  276. package/esm2022/abstractions/lib/gizmo-helper/gizmo-helper.mjs +0 -213
  277. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/constants.mjs +0 -31
  278. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-edge.mjs +0 -92
  279. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-face.mjs +0 -184
  280. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube-inputs.mjs +0 -46
  281. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewcube/gizmo-viewcube.mjs +0 -134
  282. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport-axis.mjs +0 -195
  283. package/esm2022/abstractions/lib/gizmo-helper/gizmo-viewport/gizmo-viewport.mjs +0 -267
  284. package/esm2022/abstractions/lib/line/line-input.mjs +0 -76
  285. package/esm2022/abstractions/lib/line/line.mjs +0 -133
  286. package/esm2022/abstractions/lib/quadratic-bezier-line/quadratic-bezier-line.mjs +0 -128
  287. package/esm2022/abstractions/lib/text/text.mjs +0 -115
  288. package/esm2022/abstractions/lib/text-3d/text-3d.mjs +0 -145
  289. package/esm2022/cameras/lib/camera/camera-content.mjs +0 -21
  290. package/esm2022/cameras/lib/camera/camera.mjs +0 -75
  291. package/esm2022/cameras/lib/cube-camera/cube-camera.mjs +0 -131
  292. package/esm2022/cameras/lib/orthographic-camera/orthographic-camera.mjs +0 -93
  293. package/esm2022/cameras/lib/perspective-camera/perspective-camera.mjs +0 -47
  294. package/esm2022/controls/lib/orbit-controls/orbit-controls.mjs +0 -147
  295. package/esm2022/loaders/lib/cube-texture-loader/cube-texture-loader.mjs +0 -10
  296. package/esm2022/loaders/lib/gltf-loader/gltf-loader.mjs +0 -32
  297. package/esm2022/loaders/lib/loader/loader.mjs +0 -134
  298. package/esm2022/loaders/lib/progress/progress.mjs +0 -39
  299. package/esm2022/loaders/lib/texture-loader/texture-loader.mjs +0 -19
  300. package/esm2022/materials/lib/mesh-distort-material/mesh-distort-material.mjs +0 -75
  301. package/esm2022/materials/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -328
  302. package/esm2022/materials/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -158
  303. package/esm2022/materials/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -238
  304. package/esm2022/materials/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -68
  305. package/esm2022/misc/lib/animations/animations.mjs +0 -52
  306. package/esm2022/misc/lib/bake-shadows/bake-shadows.mjs +0 -26
  307. package/esm2022/misc/lib/depth-buffer/depth-buffer.mjs +0 -39
  308. package/esm2022/misc/lib/fbo/fbo.mjs +0 -39
  309. package/esm2022/performance/angular-three-soba-performance.mjs +0 -5
  310. package/esm2022/performance/index.mjs +0 -5
  311. package/esm2022/performance/lib/adaptive/adaptive-dpr.mjs +0 -47
  312. package/esm2022/performance/lib/adaptive/adaptive-events.mjs +0 -37
  313. package/esm2022/performance/lib/detailed/detailed.mjs +0 -54
  314. package/esm2022/performance/lib/stats/stats.mjs +0 -80
  315. package/esm2022/shaders/lib/blur-pass/blur-pass.mjs +0 -61
  316. package/esm2022/shaders/lib/caustics-material/caustics-material.mjs +0 -128
  317. package/esm2022/shaders/lib/caustics-projection-material/caustics-projection-material.mjs +0 -33
  318. package/esm2022/shaders/lib/convolution-material/convolution-material.mjs +0 -94
  319. package/esm2022/shaders/lib/discard-material/discard-material.mjs +0 -3
  320. package/esm2022/shaders/lib/mesh-distort-material/mesh-distort-material.mjs +0 -55
  321. package/esm2022/shaders/lib/mesh-reflector-material/mesh-reflector-material.mjs +0 -223
  322. package/esm2022/shaders/lib/mesh-refraction-material/mesh-refraction-material.mjs +0 -169
  323. package/esm2022/shaders/lib/mesh-transmission-material/mesh-transmission-material.mjs +0 -268
  324. package/esm2022/shaders/lib/mesh-wobble-material/mesh-wobble-material.mjs +0 -37
  325. package/esm2022/shaders/lib/shader-material/shader-material.mjs +0 -34
  326. package/esm2022/shaders/lib/soft-shadow-material/soft-shadow-material.mjs +0 -33
  327. package/esm2022/shaders/lib/spot-light-material/spot-light-material.mjs +0 -86
  328. package/esm2022/shaders/lib/star-field-material/star-field-material.mjs +0 -32
  329. package/esm2022/staging/lib/accumulative-shadows/accumulative-shadows.mjs +0 -249
  330. package/esm2022/staging/lib/accumulative-shadows/progressive-light-map.mjs +0 -108
  331. package/esm2022/staging/lib/accumulative-shadows/randomized-lights.mjs +0 -201
  332. package/esm2022/staging/lib/bounds/bounds.mjs +0 -284
  333. package/esm2022/staging/lib/camera-shake/camera-shake.mjs +0 -122
  334. package/esm2022/staging/lib/caustics/caustics.mjs +0 -364
  335. package/esm2022/staging/lib/center/center.mjs +0 -143
  336. package/esm2022/staging/lib/cloud/cloud.mjs +0 -160
  337. package/esm2022/staging/lib/contact-shadows/contact-shadows.mjs +0 -228
  338. package/esm2022/staging/lib/environment/assets.mjs +0 -13
  339. package/esm2022/staging/lib/environment/environment-cube.mjs +0 -41
  340. package/esm2022/staging/lib/environment/environment-ground.mjs +0 -67
  341. package/esm2022/staging/lib/environment/environment-inputs.mjs +0 -87
  342. package/esm2022/staging/lib/environment/environment-map.mjs +0 -39
  343. package/esm2022/staging/lib/environment/environment-portal.mjs +0 -111
  344. package/esm2022/staging/lib/environment/environment.mjs +0 -165
  345. package/esm2022/staging/lib/environment/utils.mjs +0 -70
  346. package/esm2022/staging/lib/float/float.mjs +0 -77
  347. package/esm2022/staging/lib/sky/sky.mjs +0 -109
  348. package/esm2022/staging/lib/sparkles/sparkles.mjs +0 -210
  349. package/esm2022/staging/lib/spot-light/common.mjs +0 -42
  350. package/esm2022/staging/lib/spot-light/shadow-mesh-input.mjs +0 -51
  351. package/esm2022/staging/lib/spot-light/spot-light-input.mjs +0 -62
  352. package/esm2022/staging/lib/spot-light/spot-light-shadow-no-shader.mjs +0 -74
  353. package/esm2022/staging/lib/spot-light/spot-light-shadow-shader.mjs +0 -126
  354. package/esm2022/staging/lib/spot-light/spot-light-shadow.mjs +0 -63
  355. package/esm2022/staging/lib/spot-light/spot-light.mjs +0 -117
  356. package/esm2022/staging/lib/spot-light/volumetric-mesh.mjs +0 -86
  357. package/esm2022/staging/lib/stage/stage.mjs +0 -368
  358. package/esm2022/staging/lib/stars/stars.mjs +0 -140
  359. package/fesm2022/angular-three-soba-performance.mjs +0 -210
  360. package/fesm2022/angular-three-soba-performance.mjs.map +0 -1
  361. package/loaders/lib/cube-texture-loader/cube-texture-loader.d.ts +0 -3
  362. package/loaders/lib/gltf-loader/gltf-loader.d.ts +0 -8
  363. package/loaders/lib/loader/loader.d.ts +0 -26
  364. package/loaders/lib/progress/progress.d.ts +0 -16
  365. package/loaders/lib/texture-loader/texture-loader.d.ts +0 -5
  366. package/materials/lib/mesh-distort-material/mesh-distort-material.d.ts +0 -24
  367. package/materials/lib/mesh-reflector-material/mesh-reflector-material.d.ts +0 -41
  368. package/materials/lib/mesh-refraction-material/mesh-refraction-material.d.ts +0 -28
  369. package/materials/lib/mesh-transmission-material/mesh-transmission-material.d.ts +0 -46
  370. package/materials/lib/mesh-wobble-material/mesh-wobble-material.d.ts +0 -14
  371. package/misc/lib/animations/animations.d.ts +0 -13
  372. package/misc/lib/depth-buffer/depth-buffer.d.ts +0 -7
  373. package/performance/README.md +0 -3
  374. package/performance/index.d.ts +0 -4
  375. package/performance/lib/adaptive/adaptive-dpr.d.ts +0 -11
  376. package/performance/lib/detailed/detailed.d.ts +0 -13
  377. package/performance/lib/stats/stats.d.ts +0 -15
  378. package/plugin/README.md +0 -11
  379. package/plugin/generators.json +0 -19
  380. package/plugin/package.json +0 -9
  381. package/plugin/src/generators/init/compat.d.ts +0 -2
  382. package/plugin/src/generators/init/compat.js +0 -6
  383. package/plugin/src/generators/init/compat.js.map +0 -1
  384. package/plugin/src/generators/init/init.d.ts +0 -4
  385. package/plugin/src/generators/init/init.js +0 -22
  386. package/plugin/src/generators/init/init.js.map +0 -1
  387. package/plugin/src/generators/init/schema.json +0 -6
  388. package/plugin/src/index.d.ts +0 -1
  389. package/plugin/src/index.js +0 -6
  390. package/plugin/src/index.js.map +0 -1
  391. package/shaders/lib/soft-shadow-material/soft-shadow-material.d.ts +0 -10
  392. package/shaders/lib/spot-light-material/spot-light-material.d.ts +0 -4
  393. package/shaders/lib/star-field-material/star-field-material.d.ts +0 -3
  394. package/staging/lib/accumulative-shadows/accumulative-shadows.d.ts +0 -58
  395. package/staging/lib/accumulative-shadows/randomized-lights.d.ts +0 -42
  396. package/staging/lib/bounds/bounds.d.ts +0 -48
  397. package/staging/lib/camera-shake/camera-shake.d.ts +0 -28
  398. package/staging/lib/caustics/caustics.d.ts +0 -47
  399. package/staging/lib/center/center.d.ts +0 -40
  400. package/staging/lib/cloud/cloud.d.ts +0 -23
  401. package/staging/lib/contact-shadows/contact-shadows.d.ts +0 -29
  402. package/staging/lib/environment/environment-cube.d.ts +0 -11
  403. package/staging/lib/environment/environment-ground.d.ts +0 -9
  404. package/staging/lib/environment/environment-inputs.d.ts +0 -28
  405. package/staging/lib/environment/environment-map.d.ts +0 -10
  406. package/staging/lib/environment/environment-portal.d.ts +0 -15
  407. package/staging/lib/environment/utils.d.ts +0 -8
  408. package/staging/lib/float/float.d.ts +0 -16
  409. package/staging/lib/sky/sky.d.ts +0 -20
  410. package/staging/lib/sparkles/sparkles.d.ts +0 -29
  411. package/staging/lib/spot-light/common.d.ts +0 -3
  412. package/staging/lib/spot-light/shadow-mesh-input.d.ts +0 -14
  413. package/staging/lib/spot-light/spot-light-input.d.ts +0 -16
  414. package/staging/lib/spot-light/spot-light-shadow-no-shader.d.ts +0 -14
  415. package/staging/lib/spot-light/spot-light-shadow-shader.d.ts +0 -25
  416. package/staging/lib/spot-light/spot-light-shadow.d.ts +0 -6
  417. package/staging/lib/spot-light/spot-light.d.ts +0 -17
  418. package/staging/lib/spot-light/volumetric-mesh.d.ts +0 -15
  419. package/staging/lib/stage/stage.d.ts +0 -87
  420. package/staging/lib/stars/stars.d.ts +0 -20
  421. /package/shaders/{lib/caustics-material → caustics}/caustics-material.d.ts +0 -0
  422. /package/shaders/{lib/caustics-projection-material → caustics}/caustics-projection-material.d.ts +0 -0
  423. /package/shaders/{lib/convolution-material → convolution-material}/convolution-material.d.ts +0 -0
  424. /package/shaders/{lib/discard-material → discard-material}/discard-material.d.ts +0 -0
  425. /package/shaders/{lib/mesh-reflector-material → mesh-reflector-material}/mesh-reflector-material.d.ts +0 -0
  426. /package/shaders/{lib/mesh-refraction-material → mesh-refraction-material}/mesh-refraction-material.d.ts +0 -0
@@ -1,201 +0,0 @@
1
- import { Component, CUSTOM_ELEMENTS_SCHEMA, Directive, inject, InjectionToken, Input } from '@angular/core';
2
- import { extend, injectNgtRef, NgtArgs, NgtRepeat, NgtRxStore } from 'angular-three';
3
- import { combineLatest } from 'rxjs';
4
- import * as THREE from 'three';
5
- import { DirectionalLight, Group, OrthographicCamera, Vector2 } from 'three';
6
- import { NGTS_ACCUMULATIVE_SHADOWS_API } from './accumulative-shadows';
7
- import * as i0 from "@angular/core";
8
- extend({ Group, DirectionalLight, OrthographicCamera, Vector2 });
9
- export const NGTS_RANDOMIZED_LIGHTS_API = new InjectionToken('NgtsRandomizedLights API');
10
- function randomizedLightsApiFactory(randomizedLights) {
11
- const accumulativeApi = inject(NGTS_ACCUMULATIVE_SHADOWS_API);
12
- const update = () => {
13
- let light;
14
- if (randomizedLights.lightsRef.nativeElement) {
15
- for (let l = 0; l < randomizedLights.lightsRef.nativeElement.children.length; l++) {
16
- light = randomizedLights.lightsRef.nativeElement.children[l];
17
- if (Math.random() > randomizedLights.get('ambient')) {
18
- const position = randomizedLights.get('position');
19
- const radius = randomizedLights.get('radius');
20
- light.position.set(position[0] + THREE.MathUtils.randFloatSpread(radius), position[1] + THREE.MathUtils.randFloatSpread(radius), position[2] + THREE.MathUtils.randFloatSpread(radius));
21
- }
22
- else {
23
- const lambda = Math.acos(2 * Math.random() - 1) - Math.PI / 2.0;
24
- const phi = 2 * Math.PI * Math.random();
25
- const length = randomizedLights.get('length');
26
- light.position.set(Math.cos(lambda) * Math.cos(phi) * length, Math.abs(Math.cos(lambda) * Math.sin(phi) * length), Math.sin(lambda) * length);
27
- }
28
- }
29
- }
30
- };
31
- const api = { update };
32
- randomizedLights.effect(combineLatest([
33
- randomizedLights.lightsRef.$,
34
- randomizedLights.select('position'),
35
- randomizedLights.select('radius'),
36
- randomizedLights.select('length'),
37
- randomizedLights.select('ambient'),
38
- ]), ([group]) => {
39
- if (accumulativeApi)
40
- accumulativeApi.lights.set(group.uuid, api);
41
- return () => accumulativeApi.lights.delete(group.uuid);
42
- });
43
- return api;
44
- }
45
- class RandomizedLightsConsumer {
46
- constructor() {
47
- inject(NGTS_RANDOMIZED_LIGHTS_API);
48
- }
49
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
50
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: RandomizedLightsConsumer, isStandalone: true, selector: "[ngtsRandomizedLightsConsumer]", ngImport: i0 }); }
51
- }
52
- export { RandomizedLightsConsumer };
53
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: RandomizedLightsConsumer, decorators: [{
54
- type: Directive,
55
- args: [{ selector: '[ngtsRandomizedLightsConsumer]', standalone: true }]
56
- }], ctorParameters: function () { return []; } });
57
- class NgtsRandomizedLights extends NgtRxStore {
58
- constructor() {
59
- super(...arguments);
60
- this.lightsRef = injectNgtRef();
61
- }
62
- /** How many frames it will jiggle the lights, 1.
63
- * Frames is context aware, if a provider like AccumulativeShadows exists, frames will be taken from there! */
64
- set frames(frames) {
65
- this.set({ frames });
66
- }
67
- /** Light position, [0, 0, 0] */
68
- set position(position) {
69
- this.set({ position });
70
- }
71
- /** Radius of the jiggle, higher values make softer light, 5 */
72
- set radius(radius) {
73
- this.set({ radius });
74
- }
75
- /** Amount of lights, 8 */
76
- set amount(amount) {
77
- this.set({ amount });
78
- }
79
- /** Light intensity, 1 */
80
- set intensity(intensity) {
81
- this.set({ intensity });
82
- }
83
- /** Ambient occlusion, lower values mean less AO, hight more, you can mix AO and directional light, 0.5 */
84
- set ambient(ambient) {
85
- this.set({ ambient });
86
- }
87
- /** If the lights cast shadows, this is true by default */
88
- set castShadow(castShadow) {
89
- this.set({ castShadow });
90
- }
91
- /** Default shadow bias, 0 */
92
- set bias(bias) {
93
- this.set({ bias });
94
- }
95
- /** Default map size, 512 */
96
- set mapSize(mapSize) {
97
- this.set({ mapSize });
98
- }
99
- /** Default size of the shadow camera, 10 */
100
- set size(size) {
101
- this.set({ size });
102
- }
103
- /** Default shadow camera near, 0.5 */
104
- set near(near) {
105
- this.set({ near });
106
- }
107
- /** Default shadow camera far, 500 */
108
- set far(far) {
109
- this.set({ far });
110
- }
111
- initialize() {
112
- super.initialize();
113
- this.set({
114
- castShadow: true,
115
- bias: 0.001,
116
- mapSize: 512,
117
- size: 5,
118
- near: 0.5,
119
- far: 500,
120
- frames: 1,
121
- position: [0, 0, 0],
122
- radius: 1,
123
- amount: 8,
124
- intensity: 1,
125
- ambient: 0.5,
126
- });
127
- this.connect('cameraArgs', this.select(['size', 'near', 'far'], ({ size, near, far }) => [-size, size, size, -size, near, far]));
128
- this.connect('length', this.select(['position'], ({ position }) => new THREE.Vector3(...position).length()));
129
- }
130
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
131
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsRandomizedLights, isStandalone: true, selector: "ngts-randomized-lights", inputs: { lightsRef: "lightsRef", frames: "frames", position: "position", radius: "radius", amount: "amount", intensity: "intensity", ambient: "ambient", castShadow: "castShadow", bias: "bias", mapSize: "mapSize", size: "size", near: "near", far: "far" }, providers: [
132
- { provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
133
- ], usesInheritance: true, ngImport: i0, template: `
134
- <ngt-group ngtCompound [ref]="lightsRef">
135
- <ngt-directional-light
136
- *ngFor="let i; repeat: get('amount')"
137
- [castShadow]="get('castShadow')"
138
- [intensity]="get('intensity') / get('amount')"
139
- >
140
- <ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
141
- <ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
142
- <ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
143
- </ngt-directional-light>
144
- <ng-container ngtsRandomizedLightsConsumer />
145
- </ngt-group>
146
- `, isInline: true, dependencies: [{ kind: "directive", type: RandomizedLightsConsumer, selector: "[ngtsRandomizedLightsConsumer]" }, { kind: "directive", type: NgtArgs, selector: "[args]", inputs: ["args"] }, { kind: "directive", type: NgtRepeat, selector: "[ngFor][ngForRepeat]", inputs: ["ngForRepeat"] }] }); }
147
- }
148
- export { NgtsRandomizedLights };
149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsRandomizedLights, decorators: [{
150
- type: Component,
151
- args: [{
152
- selector: 'ngts-randomized-lights',
153
- standalone: true,
154
- template: `
155
- <ngt-group ngtCompound [ref]="lightsRef">
156
- <ngt-directional-light
157
- *ngFor="let i; repeat: get('amount')"
158
- [castShadow]="get('castShadow')"
159
- [intensity]="get('intensity') / get('amount')"
160
- >
161
- <ngt-value [rawValue]="get('bias')" attach="shadow.bias" />
162
- <ngt-vector2 *args="[get('mapSize'), get('mapSize')]" attach="shadow.mapSize" />
163
- <ngt-orthographic-camera *args="get('cameraArgs')" attach="shadow.camera" />
164
- </ngt-directional-light>
165
- <ng-container ngtsRandomizedLightsConsumer />
166
- </ngt-group>
167
- `,
168
- imports: [RandomizedLightsConsumer, NgtArgs, NgtRepeat],
169
- providers: [
170
- { provide: NGTS_RANDOMIZED_LIGHTS_API, useFactory: randomizedLightsApiFactory, deps: [NgtsRandomizedLights] },
171
- ],
172
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
173
- }]
174
- }], propDecorators: { lightsRef: [{
175
- type: Input
176
- }], frames: [{
177
- type: Input
178
- }], position: [{
179
- type: Input
180
- }], radius: [{
181
- type: Input
182
- }], amount: [{
183
- type: Input
184
- }], intensity: [{
185
- type: Input
186
- }], ambient: [{
187
- type: Input
188
- }], castShadow: [{
189
- type: Input
190
- }], bias: [{
191
- type: Input
192
- }], mapSize: [{
193
- type: Input
194
- }], size: [{
195
- type: Input
196
- }], near: [{
197
- type: Input
198
- }], far: [{
199
- type: Input
200
- }] } });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9taXplZC1saWdodHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtc29iYS9zdGFnaW5nL3NyYy9saWIvYWNjdW11bGF0aXZlLXNoYWRvd3MvcmFuZG9taXplZC1saWdodHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNyQyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3RSxPQUFPLEVBQW1DLDZCQUE2QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRXhHLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBRWpFLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLElBQUksY0FBYyxDQUN4RCwwQkFBMEIsQ0FDN0IsQ0FBQztBQUVGLFNBQVMsMEJBQTBCLENBQUMsZ0JBQXNDO0lBQ3RFLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBRTlELE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRTtRQUNoQixJQUFJLEtBQXlDLENBQUM7UUFDOUMsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzFDLEtBQUssSUFB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S0FBSztnQkFHTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBS08sTUFBTTtzQkFBbEIsS0FBSztnQkFLTyxNQUFNO3NCQUFsQixLQUFLO2dCQUtPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxVQUFVO3NCQUF0QixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sT0FBTztzQkFBbkIsS0FBSztnQkFLTyxJQUFJO3NCQUFoQixLQUFLO2dCQUtPLElBQUk7c0JBQWhCLEtBQUs7Z0JBS08sR0FBRztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLCBEaXJlY3RpdmUsIGluamVjdCwgSW5qZWN0aW9uVG9rZW4sIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBleHRlbmQsIGluamVjdE5ndFJlZiwgTmd0QXJncywgTmd0UmVwZWF0LCBOZ3RSeFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBEaXJlY3Rpb25hbExpZ2h0LCBHcm91cCwgT3J0aG9ncmFwaGljQ2FtZXJhLCBWZWN0b3IyIH0gZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgTmd0c0FjY3VtdWxhdGl2ZVNoYWRvd3NMaWdodEFwaSwgTkdUU19BQ0NVTVVMQVRJVkVfU0hBRE9XU19BUEkgfSBmcm9tICcuL2FjY3VtdWxhdGl2ZS1zaGFkb3dzJztcblxuZXh0ZW5kKHsgR3JvdXAsIERpcmVjdGlvbmFsTGlnaHQsIE9ydGhvZ3JhcGhpY0NhbWVyYSwgVmVjdG9yMiB9KTtcblxuZXhwb3J0IGNvbnN0IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJID0gbmV3IEluamVjdGlvblRva2VuPE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk+KFxuICAgICdOZ3RzUmFuZG9taXplZExpZ2h0cyBBUEknXG4pO1xuXG5mdW5jdGlvbiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeShyYW5kb21pemVkTGlnaHRzOiBOZ3RzUmFuZG9taXplZExpZ2h0cykge1xuICAgIGNvbnN0IGFjY3VtdWxhdGl2ZUFwaSA9IGluamVjdChOR1RTX0FDQ1VNVUxBVElWRV9TSEFET1dTX0FQSSk7XG5cbiAgICBjb25zdCB1cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIGxldCBsaWdodDogVEhSRUUuRGlyZWN0aW9uYWxMaWdodCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHJhbmRvbWl6ZWRMaWdodHMubGlnaHRzUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGwrKykge1xuICAgICAgICAgICAgICAgIGxpZ2h0ID0gcmFuZG9taXplZExpZ2h0cy5saWdodHNSZWYubmF0aXZlRWxlbWVudC5jaGlsZHJlbltsXSBhcyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0O1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJhbmRvbSgpID4gcmFuZG9taXplZExpZ2h0cy5nZXQoJ2FtYmllbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJhbmRvbWl6ZWRMaWdodHMuZ2V0KCdwb3NpdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpdXMgPSByYW5kb21pemVkTGlnaHRzLmdldCgncmFkaXVzJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uWzBdICsgVEhSRUUuTWF0aFV0aWxzLnJhbmRGbG9hdFNwcmVhZChyYWRpdXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25bMV0gKyBUSFJFRS5NYXRoVXRpbHMucmFuZEZsb2F0U3ByZWFkKHJhZGl1cyksXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblsyXSArIFRIUkVFLk1hdGhVdGlscy5yYW5kRmxvYXRTcHJlYWQocmFkaXVzKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhbWJkYSA9IE1hdGguYWNvcygyICogTWF0aC5yYW5kb20oKSAtIDEpIC0gTWF0aC5QSSAvIDIuMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGhpID0gMiAqIE1hdGguUEkgKiBNYXRoLnJhbmRvbSgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSByYW5kb21pemVkTGlnaHRzLmdldCgnbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKGxhbWJkYSkgKiBNYXRoLmNvcyhwaGkpICogbGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoTWF0aC5jb3MobGFtYmRhKSAqIE1hdGguc2luKHBoaSkgKiBsZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4obGFtYmRhKSAqIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBhcGkgPSB7IHVwZGF0ZSB9IGFzIE5ndHNBY2N1bXVsYXRpdmVTaGFkb3dzTGlnaHRBcGk7XG5cbiAgICByYW5kb21pemVkTGlnaHRzLmVmZmVjdChcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLmxpZ2h0c1JlZi4kLFxuICAgICAgICAgICAgcmFuZG9taXplZExpZ2h0cy5zZWxlY3QoJ3Bvc2l0aW9uJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgncmFkaXVzJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnbGVuZ3RoJyksXG4gICAgICAgICAgICByYW5kb21pemVkTGlnaHRzLnNlbGVjdCgnYW1iaWVudCcpLFxuICAgICAgICBdKSxcbiAgICAgICAgKFtncm91cF0pID0+IHtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRpdmVBcGkpIGFjY3VtdWxhdGl2ZUFwaS5saWdodHMuc2V0KGdyb3VwLnV1aWQsIGFwaSk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4gYWNjdW11bGF0aXZlQXBpLmxpZ2h0cy5kZWxldGUoZ3JvdXAudXVpZCk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIGFwaTtcbn1cblxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW25ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXJdJywgc3RhbmRhbG9uZTogdHJ1ZSB9KVxuZXhwb3J0IGNsYXNzIFJhbmRvbWl6ZWRMaWdodHNDb25zdW1lciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGluamVjdChOR1RTX1JBTkRPTUlaRURfTElHSFRTX0FQSSk7XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtcmFuZG9taXplZC1saWdodHMnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBuZ3RDb21wb3VuZCBbcmVmXT1cImxpZ2h0c1JlZlwiPlxuICAgICAgICAgICAgPG5ndC1kaXJlY3Rpb25hbC1saWdodFxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpOyByZXBlYXQ6IGdldCgnYW1vdW50JylcIlxuICAgICAgICAgICAgICAgIFtjYXN0U2hhZG93XT1cImdldCgnY2FzdFNoYWRvdycpXCJcbiAgICAgICAgICAgICAgICBbaW50ZW5zaXR5XT1cImdldCgnaW50ZW5zaXR5JykgLyBnZXQoJ2Ftb3VudCcpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmd0LXZhbHVlIFtyYXdWYWx1ZV09XCJnZXQoJ2JpYXMnKVwiIGF0dGFjaD1cInNoYWRvdy5iaWFzXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LXZlY3RvcjIgKmFyZ3M9XCJbZ2V0KCdtYXBTaXplJyksIGdldCgnbWFwU2l6ZScpXVwiIGF0dGFjaD1cInNoYWRvdy5tYXBTaXplXCIgLz5cbiAgICAgICAgICAgICAgICA8bmd0LW9ydGhvZ3JhcGhpYy1jYW1lcmEgKmFyZ3M9XCJnZXQoJ2NhbWVyYUFyZ3MnKVwiIGF0dGFjaD1cInNoYWRvdy5jYW1lcmFcIiAvPlxuICAgICAgICAgICAgPC9uZ3QtZGlyZWN0aW9uYWwtbGlnaHQ+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIG5ndHNSYW5kb21pemVkTGlnaHRzQ29uc3VtZXIgLz5cbiAgICAgICAgPC9uZ3QtZ3JvdXA+XG4gICAgYCxcbiAgICBpbXBvcnRzOiBbUmFuZG9taXplZExpZ2h0c0NvbnN1bWVyLCBOZ3RBcmdzLCBOZ3RSZXBlYXRdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7IHByb3ZpZGU6IE5HVFNfUkFORE9NSVpFRF9MSUdIVFNfQVBJLCB1c2VGYWN0b3J5OiByYW5kb21pemVkTGlnaHRzQXBpRmFjdG9yeSwgZGVwczogW05ndHNSYW5kb21pemVkTGlnaHRzXSB9LFxuICAgIF0sXG4gICAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3RzUmFuZG9taXplZExpZ2h0cyBleHRlbmRzIE5ndFJ4U3RvcmUge1xuICAgIEBJbnB1dCgpIGxpZ2h0c1JlZiA9IGluamVjdE5ndFJlZjxUSFJFRS5Hcm91cD4oKTtcbiAgICAvKiogSG93IG1hbnkgZnJhbWVzIGl0IHdpbGwgamlnZ2xlIHRoZSBsaWdodHMsIDEuXG4gICAgICogIEZyYW1lcyBpcyBjb250ZXh0IGF3YXJlLCBpZiBhIHByb3ZpZGVyIGxpa2UgQWNjdW11bGF0aXZlU2hhZG93cyBleGlzdHMsIGZyYW1lcyB3aWxsIGJlIHRha2VuIGZyb20gdGhlcmUhICAqL1xuICAgIEBJbnB1dCgpIHNldCBmcmFtZXMoZnJhbWVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBmcmFtZXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIExpZ2h0IHBvc2l0aW9uLCBbMCwgMCwgMF0gKi9cbiAgICBASW5wdXQoKSBzZXQgcG9zaXRpb24ocG9zaXRpb246IFt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyXSkge1xuICAgICAgICB0aGlzLnNldCh7IHBvc2l0aW9uIH0pO1xuICAgIH1cblxuICAgIC8qKiBSYWRpdXMgb2YgdGhlIGppZ2dsZSwgaGlnaGVyIHZhbHVlcyBtYWtlIHNvZnRlciBsaWdodCwgNSAqL1xuICAgIEBJbnB1dCgpIHNldCByYWRpdXMocmFkaXVzOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyByYWRpdXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIEFtb3VudCBvZiBsaWdodHMsIDggKi9cbiAgICBASW5wdXQoKSBzZXQgYW1vdW50KGFtb3VudDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgYW1vdW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBMaWdodCBpbnRlbnNpdHksIDEgKi9cbiAgICBASW5wdXQoKSBzZXQgaW50ZW5zaXR5KGludGVuc2l0eTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgaW50ZW5zaXR5IH0pO1xuICAgIH1cblxuICAgIC8qKiBBbWJpZW50IG9jY2x1c2lvbiwgbG93ZXIgdmFsdWVzIG1lYW4gbGVzcyBBTywgaGlnaHQgbW9yZSwgeW91IGNhbiBtaXggQU8gYW5kIGRpcmVjdGlvbmFsIGxpZ2h0LCAwLjUgKi9cbiAgICBASW5wdXQoKSBzZXQgYW1iaWVudChhbWJpZW50OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBhbWJpZW50IH0pO1xuICAgIH1cblxuICAgIC8qKiBJZiB0aGUgbGlnaHRzIGNhc3Qgc2hhZG93cywgdGhpcyBpcyB0cnVlIGJ5IGRlZmF1bHQgKi9cbiAgICBASW5wdXQoKSBzZXQgY2FzdFNoYWRvdyhjYXN0U2hhZG93OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgY2FzdFNoYWRvdyB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgYmlhcywgMCAqL1xuICAgIEBJbnB1dCgpIHNldCBiaWFzKGJpYXM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGJpYXMgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgbWFwIHNpemUsIDUxMiAqL1xuICAgIEBJbnB1dCgpIHNldCBtYXBTaXplKG1hcFNpemU6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG1hcFNpemUgfSk7XG4gICAgfVxuXG4gICAgLyoqIERlZmF1bHQgc2l6ZSBvZiB0aGUgc2hhZG93IGNhbWVyYSwgMTAgKi9cbiAgICBASW5wdXQoKSBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBzaXplIH0pO1xuICAgIH1cblxuICAgIC8qKiBEZWZhdWx0IHNoYWRvdyBjYW1lcmEgbmVhciwgMC41ICovXG4gICAgQElucHV0KCkgc2V0IG5lYXIobmVhcjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbmVhciB9KTtcbiAgICB9XG5cbiAgICAvKiogRGVmYXVsdCBzaGFkb3cgY2FtZXJhIGZhciwgNTAwICovXG4gICAgQElucHV0KCkgc2V0IGZhcihmYXI6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGZhciB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpbml0aWFsaXplKCk6IHZvaWQge1xuICAgICAgICBzdXBlci5pbml0aWFsaXplKCk7XG4gICAgICAgIHRoaXMuc2V0KHtcbiAgICAgICAgICAgIGNhc3RTaGFkb3c6IHRydWUsXG4gICAgICAgICAgICBiaWFzOiAwLjAwMSxcbiAgICAgICAgICAgIG1hcFNpemU6IDUxMixcbiAgICAgICAgICAgIHNpemU6IDUsXG4gICAgICAgICAgICBuZWFyOiAwLjUsXG4gICAgICAgICAgICBmYXI6IDUwMCxcbiAgICAgICAgICAgIGZyYW1lczogMSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBbMCwgMCwgMF0sXG4gICAgICAgICAgICByYWRpdXM6IDEsXG4gICAgICAgICAgICBhbW91bnQ6IDgsXG4gICAgICAgICAgICBpbnRlbnNpdHk6IDEsXG4gICAgICAgICAgICBhbWJpZW50OiAwLjUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbm5lY3QoXG4gICAgICAgICAgICAnY2FtZXJhQXJncycsXG4gICAgICAgICAgICB0aGlzLnNlbGVjdChbJ3NpemUnLCAnbmVhcicsICdmYXInXSwgKHsgc2l6ZSwgbmVhciwgZmFyIH0pID0+IFstc2l6ZSwgc2l6ZSwgc2l6ZSwgLXNpemUsIG5lYXIsIGZhcl0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY29ubmVjdChcbiAgICAgICAgICAgICdsZW5ndGgnLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3QoWydwb3NpdGlvbiddLCAoeyBwb3NpdGlvbiB9KSA9PiBuZXcgVEhSRUUuVmVjdG9yMyguLi5wb3NpdGlvbikubGVuZ3RoKCkpXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
@@ -1,284 +0,0 @@
1
- import { Component, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, inject, InjectionToken, Input, Output, } from '@angular/core';
2
- import { extend, injectBeforeRender, injectNgtRef, is, NgtRxStore, NgtStore } from 'angular-three';
3
- import { combineLatest, switchMap } from 'rxjs';
4
- import * as THREE from 'three';
5
- import { Group } from 'three';
6
- import * as i0 from "@angular/core";
7
- const isBox3 = (def) => !!def && def.isBox3;
8
- function equals(a, b, eps) {
9
- return Math.abs(a.x - b.x) < eps && Math.abs(a.y - b.y) < eps && Math.abs(a.z - b.z) < eps;
10
- }
11
- function damp(v, t, lambda, delta) {
12
- v.x = THREE.MathUtils.damp(v.x, t.x, lambda, delta);
13
- v.y = THREE.MathUtils.damp(v.y, t.y, lambda, delta);
14
- v.z = THREE.MathUtils.damp(v.z, t.z, lambda, delta);
15
- }
16
- export const NGTS_BOUNDS_API = new InjectionToken('NgtsBounds API');
17
- function boundsApiFactory(bounds) {
18
- const store = inject(NgtStore);
19
- const box = new THREE.Box3();
20
- function getSize() {
21
- const camera = store.get('camera');
22
- const margin = bounds.get('margin');
23
- const size = box.getSize(new THREE.Vector3());
24
- const center = box.getCenter(new THREE.Vector3());
25
- const maxSize = Math.max(size.x, size.y, size.z);
26
- const fitHeightDistance = is.orthographicCamera(camera)
27
- ? maxSize * 4
28
- : maxSize / (2 * Math.atan((Math.PI * camera.fov) / 360));
29
- const fitWidthDistance = is.orthographicCamera(camera) ? maxSize * 4 : fitHeightDistance / camera.aspect;
30
- const distance = margin * Math.max(fitHeightDistance, fitWidthDistance);
31
- return { box, size, center, distance };
32
- }
33
- const api = {
34
- getSize,
35
- refresh(object) {
36
- const { camera, controls: storeControls } = store.get();
37
- const controls = storeControls;
38
- if (isBox3(object))
39
- box.copy(object);
40
- else {
41
- const target = object || bounds.boundsRef.nativeElement;
42
- if (target) {
43
- target.updateWorldMatrix(true, true);
44
- box.setFromObject(target);
45
- }
46
- }
47
- if (box.isEmpty()) {
48
- const max = camera.position.length() || 10;
49
- box.setFromCenterAndSize(new THREE.Vector3(), new THREE.Vector3(max, max, max));
50
- }
51
- if (controls?.constructor.name === 'OrthographicTrackballControls') {
52
- // put camera on a sphere along which it would move
53
- const { distance } = getSize();
54
- const direction = camera.position.clone().sub(controls.target).normalize().multiplyScalar(distance);
55
- const newPos = controls.target.clone().add(direction);
56
- camera.position.copy(newPos);
57
- }
58
- return this;
59
- },
60
- clip() {
61
- const { distance } = getSize();
62
- const { camera, controls: storeControls, invalidate } = store.get();
63
- const controls = storeControls;
64
- if (controls)
65
- controls.maxDistance = distance * 10;
66
- camera.near = distance / 100;
67
- camera.far = distance * 100;
68
- camera.updateProjectionMatrix();
69
- if (controls)
70
- controls.update();
71
- invalidate();
72
- return this;
73
- },
74
- to({ position, target }) {
75
- const { camera } = store.get();
76
- const { damping } = bounds.get();
77
- bounds.current.camera.copy(camera.position);
78
- const { center } = getSize();
79
- bounds.goal.camera.set(...position);
80
- if (target) {
81
- bounds.goal.focus.set(...target);
82
- }
83
- else {
84
- bounds.goal.focus.copy(center);
85
- }
86
- if (damping) {
87
- bounds.current.animating = true;
88
- }
89
- else {
90
- camera.position.set(...position);
91
- }
92
- return this;
93
- },
94
- fit() {
95
- const { camera, controls: storeControls, invalidate } = store.get();
96
- const controls = storeControls;
97
- const { damping, margin } = bounds.get();
98
- bounds.current.camera.copy(camera.position);
99
- if (controls)
100
- bounds.current.focus.copy(controls.target);
101
- const { center, distance } = getSize();
102
- const direction = center.clone().sub(camera.position).normalize().multiplyScalar(distance);
103
- bounds.goal.camera.copy(center).sub(direction);
104
- bounds.goal.focus.copy(center);
105
- if (is.orthographicCamera(camera)) {
106
- bounds.current.zoom = camera.zoom;
107
- let maxHeight = 0, maxWidth = 0;
108
- const vertices = [
109
- new THREE.Vector3(box.min.x, box.min.y, box.min.z),
110
- new THREE.Vector3(box.min.x, box.max.y, box.min.z),
111
- new THREE.Vector3(box.min.x, box.min.y, box.max.z),
112
- new THREE.Vector3(box.min.x, box.max.y, box.max.z),
113
- new THREE.Vector3(box.max.x, box.max.y, box.max.z),
114
- new THREE.Vector3(box.max.x, box.max.y, box.min.z),
115
- new THREE.Vector3(box.max.x, box.min.y, box.max.z),
116
- new THREE.Vector3(box.max.x, box.min.y, box.min.z),
117
- ];
118
- // Transform the center and each corner to camera space
119
- center.applyMatrix4(camera.matrixWorldInverse);
120
- for (const v of vertices) {
121
- v.applyMatrix4(camera.matrixWorldInverse);
122
- maxHeight = Math.max(maxHeight, Math.abs(v.y - center.y));
123
- maxWidth = Math.max(maxWidth, Math.abs(v.x - center.x));
124
- }
125
- maxHeight *= 2;
126
- maxWidth *= 2;
127
- const zoomForHeight = (camera.top - camera.bottom) / maxHeight;
128
- const zoomForWidth = (camera.right - camera.left) / maxWidth;
129
- bounds.goal.zoom = Math.min(zoomForHeight, zoomForWidth) / margin;
130
- if (!damping) {
131
- camera.zoom = bounds.goal.zoom;
132
- camera.updateProjectionMatrix();
133
- }
134
- }
135
- if (damping) {
136
- bounds.current.animating = true;
137
- }
138
- else {
139
- camera.position.copy(bounds.goal.camera);
140
- camera.lookAt(bounds.goal.focus);
141
- if (controls) {
142
- controls.target.copy(bounds.goal.focus);
143
- controls.update();
144
- }
145
- }
146
- if (bounds.fitted.observed)
147
- bounds.fitted.emit(this.getSize());
148
- invalidate();
149
- return this;
150
- },
151
- };
152
- let count = 0;
153
- bounds.hold(bounds.boundsRef.$.pipe(switchMap(() => combineLatest([
154
- bounds.select('clip'),
155
- bounds.select('fit'),
156
- bounds.select('observe'),
157
- store.select('camera'),
158
- store.select('controls'),
159
- store.select('size'),
160
- bounds.boundsRef.children$(),
161
- ]))), ([clip, fit, observe]) => {
162
- if (observe || count++ === 0) {
163
- api.refresh();
164
- if (fit)
165
- api.fit();
166
- if (clip)
167
- api.clip();
168
- }
169
- });
170
- injectBeforeRender(({ delta }) => {
171
- if (bounds.current.animating) {
172
- const { damping, eps } = bounds.get();
173
- const { camera, controls: storeControls, invalidate } = store.get();
174
- const controls = storeControls;
175
- damp(bounds.current.focus, bounds.goal.focus, damping, delta);
176
- damp(bounds.current.camera, bounds.goal.camera, damping, delta);
177
- bounds.current.zoom = THREE.MathUtils.damp(bounds.current.zoom, bounds.goal.zoom, damping, delta);
178
- camera.position.copy(bounds.current.camera);
179
- if (is.orthographicCamera(camera)) {
180
- camera.zoom = bounds.current.zoom;
181
- camera.updateProjectionMatrix();
182
- }
183
- if (!controls) {
184
- camera.lookAt(bounds.current.focus);
185
- }
186
- else {
187
- controls.target.copy(bounds.current.focus);
188
- controls.update();
189
- }
190
- invalidate();
191
- if (is.orthographicCamera(camera) && !(Math.abs(bounds.current.zoom - bounds.goal.zoom) < eps))
192
- return;
193
- if (!is.orthographicCamera(camera) && !equals(bounds.current.camera, bounds.goal.camera, eps))
194
- return;
195
- if (controls && !equals(bounds.current.focus, bounds.goal.focus, eps))
196
- return;
197
- bounds.current.animating = false;
198
- }
199
- });
200
- return api;
201
- }
202
- extend({ Group });
203
- class NgtsBounds extends NgtRxStore {
204
- constructor() {
205
- super(...arguments);
206
- this.boundsRef = injectNgtRef();
207
- this.fitted = new EventEmitter();
208
- this.store = inject(NgtStore);
209
- this.current = { animating: false, focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
210
- this.goal = { focus: new THREE.Vector3(), camera: new THREE.Vector3(), zoom: 1 };
211
- }
212
- set damping(damping) {
213
- this.set({ damping });
214
- }
215
- set fit(fit) {
216
- this.set({ fit });
217
- }
218
- set clip(clip) {
219
- this.set({ clip });
220
- }
221
- set observe(observe) {
222
- this.set({ observe });
223
- }
224
- set margin(margin) {
225
- this.set({ margin });
226
- }
227
- set eps(eps) {
228
- this.set({ eps });
229
- }
230
- initialize() {
231
- super.initialize();
232
- this.set({ damping: 6, fit: false, clip: false, observe: false, margin: 1.2, eps: 0.01 });
233
- }
234
- ngOnInit() {
235
- this.preventDragHijacking();
236
- }
237
- preventDragHijacking() {
238
- this.effect(this.store.select('controls'), (controls) => {
239
- if (controls) {
240
- const callback = () => (this.current.animating = false);
241
- controls.addEventListener('start', callback);
242
- return () => controls.removeEventListener('start', callback);
243
- }
244
- });
245
- }
246
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsBounds, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
247
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtsBounds, isStandalone: true, selector: "ngts-bounds", inputs: { boundsRef: "boundsRef", damping: "damping", fit: "fit", clip: "clip", observe: "observe", margin: "margin", eps: "eps" }, outputs: { fitted: "fitted" }, providers: [{ provide: NGTS_BOUNDS_API, useFactory: boundsApiFactory, deps: [NgtsBounds] }], usesInheritance: true, ngImport: i0, template: `
248
- <ngt-group ngtCompound [ref]="boundsRef">
249
- <ng-content />
250
- </ngt-group>
251
- `, isInline: true }); }
252
- }
253
- export { NgtsBounds };
254
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtsBounds, decorators: [{
255
- type: Component,
256
- args: [{
257
- selector: 'ngts-bounds',
258
- standalone: true,
259
- template: `
260
- <ngt-group ngtCompound [ref]="boundsRef">
261
- <ng-content />
262
- </ngt-group>
263
- `,
264
- providers: [{ provide: NGTS_BOUNDS_API, useFactory: boundsApiFactory, deps: [NgtsBounds] }],
265
- schemas: [CUSTOM_ELEMENTS_SCHEMA],
266
- }]
267
- }], propDecorators: { boundsRef: [{
268
- type: Input
269
- }], damping: [{
270
- type: Input
271
- }], fit: [{
272
- type: Input
273
- }], clip: [{
274
- type: Input
275
- }], observe: [{
276
- type: Input
277
- }], margin: [{
278
- type: Input
279
- }], eps: [{
280
- type: Input
281
- }], fitted: [{
282
- type: Output
283
- }] } });
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm91bmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLXNvYmEvc3RhZ2luZy9zcmMvbGliL2JvdW5kcy9ib3VuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsWUFBWSxFQUNaLE1BQU0sRUFDTixjQUFjLEVBQ2QsS0FBSyxFQUVMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQStCOUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFZLEVBQXFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFLLEdBQWtCLENBQUMsTUFBTSxDQUFDO0FBRXhGLFNBQVMsTUFBTSxDQUFDLENBQWdCLEVBQUUsQ0FBZ0IsRUFBRSxHQUFXO0lBQzNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDL0YsQ0FBQztBQUVELFNBQVMsSUFBSSxDQUFDLENBQWdCLEVB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LEdBQUcsQ0FBQyxDQUFDO2dCQUNqQixNQUFNLFFBQVEsR0FBRztvQkFDYixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNsRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDckQsQ0FBQztnQkFDRix1REFBdUQ7Z0JBQ3ZELE1BQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQy9DLEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO29CQUN0QixDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUMxQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMxRCxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDtnQkFDRCxTQUFTLElBQUksQ0FBQyxDQUFDO2dCQUNmLFFBQVEsSUFBSSxDQUFDLENBQUM7Z0JBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7Z0JBQy9ELE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDO2dCQUM3RCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxZQUFZLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDL0IsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7aUJBQ25DO2FBQ0o7WUFFRCxJQUFJLE9BQU8sRUFBRTtnQkFDVCxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDbkM7aUJBQU07Z0JBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDekMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLFFBQVEsRUFBRTtvQkFDVixRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN4QyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7aUJBQ3JCO2FBQ0o7WUFDRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUTtnQkFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMvRCxVQUFVLEVBQUUsQ0FBQztZQUNiLE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUM7S0FDYSxDQUFDO0lBRW5CLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE1BQU0sQ0FBQyxJQUFJLENBQ1AsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNuQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQ1gsYUFBYSxDQUFDO1FBQ1YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7UUFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDcEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7S0FDL0IsQ0FBQyxDQUNMLENBQ0osRUFDRCxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFO1FBQ3JCLElBQUksT0FBTyxJQUFJLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRTtZQUMxQixHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZCxJQUFJLEdBQUc7Z0JBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBSTtnQkFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDeEI7SUFDTCxDQUFDLENBQ0osQ0FBQztJQUVGLGtCQUFrQixDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO1FBQzdCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDMUIsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwRSxNQUFNLFFBQVEsR0FBRyxhQUF5QyxDQUFDO1lBRTNELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNoRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDbEcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1QyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEMsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7YUFDbkM7WUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNYLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QztpQkFBTTtnQkFDSCxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDckI7WUFFRCxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksRUFBRSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUFFLE9BQU87WUFDdkcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUN0RyxJQUFJLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7Z0JBQUUsT0FBTztZQUM5RSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDcEM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFFbEIsTUFXYSxVQUFXLFNBQVEsVUFBVTtJQVgxQzs7UUFZYSxjQUFTLEdBQUcsWUFBWSxFQUFTLENBQUM7UUEwQmpDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBa0IsQ0FBQztRQUVyQyxVQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLFlBQU8sR0FBRyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakcsU0FBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7S0FvQnhGO0lBakRHLElBQWEsT0FBTyxDQUFDLE9BQWU7UUFDaEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQWEsR0FBRyxDQUFDLEdBQVk7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQWEsSUFBSSxDQUFDLElBQWE7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQWEsT0FBTyxDQUFDLE9BQWdCO1FBQ2pDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFhLE1BQU0sQ0FBQyxNQUFjO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFhLEdBQUcsQ0FBQyxHQUFXO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFTUSxVQUFVO1FBQ2YsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUYsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNwRCxJQUFJLFFBQVEsRUFBRTtnQkFDVixNQUFNLFFBQVEsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN2RCxRQUFxQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDM0UsT0FBTyxHQUFHLEVBQUUsQ0FBRSxRQUFxQyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM5RjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs4R0FuRFEsVUFBVTtrR0FBVixVQUFVLDZOQUhSLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLGlEQUxqRjs7OztLQUlUOztTQUlRLFVBQVU7MkZBQVYsVUFBVTtrQkFYdEIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsYUFBYTtvQkFDdkIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7OztLQUlUO29CQUNELFNBQVMsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO29CQUMzRixPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztpQkFDcEM7OEJBRVksU0FBUztzQkFBakIsS0FBSztnQkFFTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlPLEdBQUc7c0JBQWYsS0FBSztnQkFJTyxJQUFJO3NCQUFoQixLQUFLO2dCQUlPLE9BQU87c0JBQW5CLEtBQUs7Z0JBSU8sTUFBTTtzQkFBbEIsS0FBSztnQkFJTyxHQUFHO3NCQUFmLEtBQUs7Z0JBSUksTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgaW5qZWN0LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZXh0ZW5kLCBpbmplY3RCZWZvcmVSZW5kZXIsIGluamVjdE5ndFJlZiwgaXMsIE5ndFJ4U3RvcmUsIE5ndFN0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHNCb3VuZHNTaXplIHtcbiAgICBib3g6IFRIUkVFLkJveDM7XG4gICAgc2l6ZTogVEhSRUUuVmVjdG9yMztcbiAgICBjZW50ZXI6IFRIUkVFLlZlY3RvcjM7XG4gICAgZGlzdGFuY2U6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RzQm91bmRzQXBpIHtcbiAgICBnZXRTaXplOiAoKSA9PiBOZ3RzQm91bmRzU2l6ZTtcbiAgICByZWZyZXNoOiAob2JqZWN0PzogVEhSRUUuT2JqZWN0M0QgfCBUSFJFRS5Cb3gzKSA9PiBOZ3RzQm91bmRzQXBpO1xuICAgIGNsaXA6ICgpID0+IE5ndHNCb3VuZHNBcGk7XG4gICAgZml0OiAoKSA9PiBOZ3RzQm91bmRzQXBpO1xuICAgIHRvOiAoe1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgdGFyZ2V0LFxuICAgIH06IHtcbiAgICAgICAgcG9zaXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICAgICAgdGFyZ2V0PzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIH0pID0+IE5ndHNCb3VuZHNBcGk7XG59XG5cbnR5cGUgQ29udHJvbHNQcm90byA9IHtcbiAgICB1cGRhdGUoKTogdm9pZDtcbiAgICB0YXJnZXQ6IFRIUkVFLlZlY3RvcjM7XG4gICAgbWF4RGlzdGFuY2U6IG51bWJlcjtcbiAgICBhZGRFdmVudExpc3RlbmVyOiAoZXZlbnQ6IHN0cmluZywgY2FsbGJhY2s6IChldmVudDogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IChldmVudDogc3RyaW5nLCBjYWxsYmFjazogKGV2ZW50OiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG59O1xuXG5jb25zdCBpc0JveDMgPSAoZGVmOiB1bmtub3duKTogZGVmIGlzIFRIUkVFLkJveDMgPT4gISFkZWYgJiYgKGRlZiBhcyBUSFJFRS5Cb3gzKS5pc0JveDM7XG5cbmZ1bmN0aW9uIGVxdWFscyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBlcHM6IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLmFicyhhLnggLSBiLngpIDwgZXBzICYmIE1hdGguYWJzKGEueSAtIGIueSkgPCBlcHMgJiYgTWF0aC5hYnMoYS56IC0gYi56KSA8IGVwcztcbn1cblxuZnVuY3Rpb24gZGFtcCh2OiBUSFJFRS5WZWN0b3IzLCB0OiBUSFJFRS5WZWN0b3IzLCBsYW1iZGE6IG51bWJlciwgZGVsdGE6IG51bWJlcikge1xuICAgIHYueCA9IFRIUkVFLk1hdGhVdGlscy5kYW1wKHYueCwgdC54LCBsYW1iZGEsIGRlbHRhKTtcbiAgICB2LnkgPSBUSFJFRS5NYXRoVXRpbHMuZGFtcCh2LnksIHQueSwgbGFtYmRhLCBkZWx0YSk7XG4gICAgdi56ID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAodi56LCB0LnosIGxhbWJkYSwgZGVsdGEpO1xufVxuXG5leHBvcnQgY29uc3QgTkdUU19CT1VORFNfQVBJID0gbmV3IEluamVjdGlvblRva2VuPE5ndHNCb3VuZHNBcGk+KCdOZ3RzQm91bmRzIEFQSScpO1xuXG5mdW5jdGlvbiBib3VuZHNBcGlGYWN0b3J5KGJvdW5kczogTmd0c0JvdW5kcykge1xuICAgIGNvbnN0IHN0b3JlID0gaW5qZWN0KE5ndFN0b3JlKTtcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpO1xuXG4gICAgZnVuY3Rpb24gZ2V0U2l6ZSgpIHtcbiAgICAgICAgY29uc3QgY2FtZXJhID0gc3RvcmUuZ2V0KCdjYW1lcmEnKTtcbiAgICAgICAgY29uc3QgbWFyZ2luID0gYm91bmRzLmdldCgnbWFyZ2luJyk7XG5cbiAgICAgICAgY29uc3Qgc2l6ZSA9IGJveC5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgICAgICBjb25zdCBjZW50ZXIgPSBib3guZ2V0Q2VudGVyKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgICAgICBjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoc2l6ZS54LCBzaXplLnksIHNpemUueik7XG4gICAgICAgIGNvbnN0IGZpdEhlaWdodERpc3RhbmNlID0gaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSlcbiAgICAgICAgICAgID8gbWF4U2l6ZSAqIDRcbiAgICAgICAgICAgIDogbWF4U2l6ZSAvICgyICogTWF0aC5hdGFuKChNYXRoLlBJICogY2FtZXJhLmZvdikgLyAzNjApKTtcbiAgICAgICAgY29uc3QgZml0V2lkdGhEaXN0YW5jZSA9IGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpID8gbWF4U2l6ZSAqIDQgOiBmaXRIZWlnaHREaXN0YW5jZSAvIGNhbWVyYS5hc3BlY3Q7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbWFyZ2luICogTWF0aC5tYXgoZml0SGVpZ2h0RGlzdGFuY2UsIGZpdFdpZHRoRGlzdGFuY2UpO1xuICAgICAgICByZXR1cm4geyBib3gsIHNpemUsIGNlbnRlciwgZGlzdGFuY2UgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhcGkgPSB7XG4gICAgICAgIGdldFNpemUsXG4gICAgICAgIHJlZnJlc2gob2JqZWN0PzogVEhSRUUuT2JqZWN0M0QgfCBUSFJFRS5Cb3gzKSB7XG4gICAgICAgICAgICBjb25zdCB7IGNhbWVyYSwgY29udHJvbHM6IHN0b3JlQ29udHJvbHMgfSA9IHN0b3JlLmdldCgpO1xuICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSBzdG9yZUNvbnRyb2xzIGFzIHVua25vd24gYXMgQ29udHJvbHNQcm90bztcblxuICAgICAgICAgICAgaWYgKGlzQm94MyhvYmplY3QpKSBib3guY29weShvYmplY3QpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gb2JqZWN0IHx8IGJvdW5kcy5ib3VuZHNSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYm94LnNldEZyb21PYmplY3QodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYm94LmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IGNhbWVyYS5wb3NpdGlvbi5sZW5ndGgoKSB8fCAxMDtcbiAgICAgICAgICAgICAgICBib3guc2V0RnJvbUNlbnRlckFuZFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSwgbmV3IFRIUkVFLlZlY3RvcjMobWF4LCBtYXgsIG1heCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29udHJvbHM/LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPcnRob2dyYXBoaWNUcmFja2JhbGxDb250cm9scycpIHtcbiAgICAgICAgICAgICAgICAvLyBwdXQgY2FtZXJhIG9uIGEgc3BoZXJlIGFsb25nIHdoaWNoIGl0IHdvdWxkIG1vdmVcbiAgICAgICAgICAgICAgICBjb25zdCB7IGRpc3RhbmNlIH0gPSBnZXRTaXplKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY2FtZXJhLnBvc2l0aW9uLmNsb25lKCkuc3ViKGNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BvcyA9IGNvbnRyb2xzLnRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGNhbWVyYS5wb3NpdGlvbi5jb3B5KG5ld1Bvcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgY2xpcCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZGlzdGFuY2UgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FtZXJhLCBjb250cm9sczogc3RvcmVDb250cm9scywgaW52YWxpZGF0ZSB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9scyA9IHN0b3JlQ29udHJvbHMgYXMgdW5rbm93biBhcyBDb250cm9sc1Byb3RvO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xzKSBjb250cm9scy5tYXhEaXN0YW5jZSA9IGRpc3RhbmNlICogMTA7XG4gICAgICAgICAgICBjYW1lcmEubmVhciA9IGRpc3RhbmNlIC8gMTAwO1xuICAgICAgICAgICAgY2FtZXJhLmZhciA9IGRpc3RhbmNlICogMTAwO1xuICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgICAgIGlmIChjb250cm9scykgY29udHJvbHMudXBkYXRlKCk7XG4gICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcbiAgICAgICAgdG8oeyBwb3NpdGlvbiwgdGFyZ2V0IH06IHsgcG9zaXRpb246IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTsgdGFyZ2V0PzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIH0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FtZXJhIH0gPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgZGFtcGluZyB9ID0gYm91bmRzLmdldCgpO1xuXG4gICAgICAgICAgICBib3VuZHMuY3VycmVudC5jYW1lcmEuY29weShjYW1lcmEucG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgeyBjZW50ZXIgfSA9IGdldFNpemUoKTtcbiAgICAgICAgICAgIGJvdW5kcy5nb2FsLmNhbWVyYS5zZXQoLi4ucG9zaXRpb24pO1xuXG4gICAgICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgYm91bmRzLmdvYWwuZm9jdXMuc2V0KC4uLnRhcmdldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJvdW5kcy5nb2FsLmZvY3VzLmNvcHkoY2VudGVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhbXBpbmcpIHtcbiAgICAgICAgICAgICAgICBib3VuZHMuY3VycmVudC5hbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYW1lcmEucG9zaXRpb24uc2V0KC4uLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG4gICAgICAgIGZpdCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2FtZXJhLCBjb250cm9sczogc3RvcmVDb250cm9scywgaW52YWxpZGF0ZSB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICBjb25zdCBjb250cm9scyA9IHN0b3JlQ29udHJvbHMgYXMgdW5rbm93biBhcyBDb250cm9sc1Byb3RvO1xuXG4gICAgICAgICAgICBjb25zdCB7IGRhbXBpbmcsIG1hcmdpbiB9ID0gYm91bmRzLmdldCgpO1xuXG4gICAgICAgICAgICBib3VuZHMuY3VycmVudC5jYW1lcmEuY29weShjYW1lcmEucG9zaXRpb24pO1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xzKSBib3VuZHMuY3VycmVudC5mb2N1cy5jb3B5KGNvbnRyb2xzLnRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHsgY2VudGVyLCBkaXN0YW5jZSB9ID0gZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gY2VudGVyLmNsb25lKCkuc3ViKGNhbWVyYS5wb3NpdGlvbikubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuXG4gICAgICAgICAgICBib3VuZHMuZ29hbC5jYW1lcmEuY29weShjZW50ZXIpLnN1YihkaXJlY3Rpb24pO1xuICAgICAgICAgICAgYm91bmRzLmdvYWwuZm9jdXMuY29weShjZW50ZXIpO1xuXG4gICAgICAgICAgICBpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkpIHtcbiAgICAgICAgICAgICAgICBib3VuZHMuY3VycmVudC56b29tID0gY2FtZXJhLnpvb207XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF4SGVpZ2h0ID0gMCxcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRpY2VzID0gW1xuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5taW4ueSwgYm94Lm1pbi56KSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1pbi54LCBib3gubWF4LnksIGJveC5taW4ueiksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5taW4ueCwgYm94Lm1pbi55LCBib3gubWF4LnopLFxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWluLngsIGJveC5tYXgueSwgYm94Lm1heC56KSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWF4LnksIGJveC5tYXgueiksXG4gICAgICAgICAgICAgICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKGJveC5tYXgueCwgYm94Lm1heC55LCBib3gubWluLnopLFxuICAgICAgICAgICAgICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyhib3gubWF4LngsIGJveC5taW4ueSwgYm94Lm1heC56KSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoYm94Lm1heC54LCBib3gubWluLnksIGJveC5taW4ueiksXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNlbnRlciBhbmQgZWFjaCBjb3JuZXIgdG8gY2FtZXJhIHNwYWNlXG4gICAgICAgICAgICAgICAgY2VudGVyLmFwcGx5TWF0cml4NChjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmVydGljZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdi5hcHBseU1hdHJpeDQoY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSk7XG4gICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgTWF0aC5hYnModi55IC0gY2VudGVyLnkpKTtcbiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgTWF0aC5hYnModi54IC0gY2VudGVyLngpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ICo9IDI7XG4gICAgICAgICAgICAgICAgbWF4V2lkdGggKj0gMjtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tRm9ySGVpZ2h0ID0gKGNhbWVyYS50b3AgLSBjYW1lcmEuYm90dG9tKSAvIG1heEhlaWdodDtcbiAgICAgICAgICAgICAgICBjb25zdCB6b29tRm9yV2lkdGggPSAoY2FtZXJhLnJpZ2h0IC0gY2FtZXJhLmxlZnQpIC8gbWF4V2lkdGg7XG4gICAgICAgICAgICAgICAgYm91bmRzLmdvYWwuem9vbSA9IE1hdGgubWluKHpvb21Gb3JIZWlnaHQsIHpvb21Gb3JXaWR0aCkgLyBtYXJnaW47XG4gICAgICAgICAgICAgICAgaWYgKCFkYW1waW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbWVyYS56b29tID0gYm91bmRzLmdvYWwuem9vbTtcbiAgICAgICAgICAgICAgICAgICAgY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChkYW1waW5nKSB7XG4gICAgICAgICAgICAgICAgYm91bmRzLmN1cnJlbnQuYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmNvcHkoYm91bmRzLmdvYWwuY2FtZXJhKTtcbiAgICAgICAgICAgICAgICBjYW1lcmEubG9va0F0KGJvdW5kcy5nb2FsLmZvY3VzKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbHMudGFyZ2V0LmNvcHkoYm91bmRzLmdvYWwuZm9jdXMpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9scy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYm91bmRzLmZpdHRlZC5vYnNlcnZlZCkgYm91bmRzLmZpdHRlZC5lbWl0KHRoaXMuZ2V0U2l6ZSgpKTtcbiAgICAgICAgICAgIGludmFsaWRhdGUoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9LFxuICAgIH0gYXMgTmd0c0JvdW5kc0FwaTtcblxuICAgIGxldCBjb3VudCA9IDA7XG4gICAgYm91bmRzLmhvbGQoXG4gICAgICAgIGJvdW5kcy5ib3VuZHNSZWYuJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+XG4gICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5zZWxlY3QoJ2NsaXAnKSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzLnNlbGVjdCgnZml0JyksXG4gICAgICAgICAgICAgICAgICAgIGJvdW5kcy5zZWxlY3QoJ29ic2VydmUnKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2VsZWN0KCdjYW1lcmEnKSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuc2VsZWN0KCdjb250cm9scycpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZS5zZWxlY3QoJ3NpemUnKSxcbiAgICAgICAgICAgICAgICAgICAgYm91bmRzLmJvdW5kc1JlZi5jaGlsZHJlbiQoKSxcbiAgICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICAoW2NsaXAsIGZpdCwgb2JzZXJ2ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChvYnNlcnZlIHx8IGNvdW50KysgPT09IDApIHtcbiAgICAgICAgICAgICAgICBhcGkucmVmcmVzaCgpO1xuICAgICAgICAgICAgICAgIGlmIChmaXQpIGFwaS5maXQoKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xpcCkgYXBpLmNsaXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICk7XG5cbiAgICBpbmplY3RCZWZvcmVSZW5kZXIoKHsgZGVsdGEgfSkgPT4ge1xuICAgICAgICBpZiAoYm91bmRzLmN1cnJlbnQuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICBjb25zdCB7IGRhbXBpbmcsIGVwcyB9ID0gYm91bmRzLmdldCgpO1xuICAgICAgICAgICAgY29uc3QgeyBjYW1lcmEsIGNvbnRyb2xzOiBzdG9yZUNvbnRyb2xzLCBpbnZhbGlkYXRlIH0gPSBzdG9yZS5nZXQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xzID0gc3RvcmVDb250cm9scyBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG87XG5cbiAgICAgICAgICAgIGRhbXAoYm91bmRzLmN1cnJlbnQuZm9jdXMsIGJvdW5kcy5nb2FsLmZvY3VzLCBkYW1waW5nLCBkZWx0YSk7XG4gICAgICAgICAgICBkYW1wKGJvdW5kcy5jdXJyZW50LmNhbWVyYSwgYm91bmRzLmdvYWwuY2FtZXJhLCBkYW1waW5nLCBkZWx0YSk7XG4gICAgICAgICAgICBib3VuZHMuY3VycmVudC56b29tID0gVEhSRUUuTWF0aFV0aWxzLmRhbXAoYm91bmRzLmN1cnJlbnQuem9vbSwgYm91bmRzLmdvYWwuem9vbSwgZGFtcGluZywgZGVsdGEpO1xuICAgICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLmNvcHkoYm91bmRzLmN1cnJlbnQuY2FtZXJhKTtcblxuICAgICAgICAgICAgaWYgKGlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpKSB7XG4gICAgICAgICAgICAgICAgY2FtZXJhLnpvb20gPSBib3VuZHMuY3VycmVudC56b29tO1xuICAgICAgICAgICAgICAgIGNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICBjYW1lcmEubG9va0F0KGJvdW5kcy5jdXJyZW50LmZvY3VzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udHJvbHMudGFyZ2V0LmNvcHkoYm91bmRzLmN1cnJlbnQuZm9jdXMpO1xuICAgICAgICAgICAgICAgIGNvbnRyb2xzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnZhbGlkYXRlKCk7XG4gICAgICAgICAgICBpZiAoaXMub3J0aG9ncmFwaGljQ2FtZXJhKGNhbWVyYSkgJiYgIShNYXRoLmFicyhib3VuZHMuY3VycmVudC56b29tIC0gYm91bmRzLmdvYWwuem9vbSkgPCBlcHMpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWlzLm9ydGhvZ3JhcGhpY0NhbWVyYShjYW1lcmEpICYmICFlcXVhbHMoYm91bmRzLmN1cnJlbnQuY2FtZXJhLCBib3VuZHMuZ29hbC5jYW1lcmEsIGVwcykpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChjb250cm9scyAmJiAhZXF1YWxzKGJvdW5kcy5jdXJyZW50LmZvY3VzLCBib3VuZHMuZ29hbC5mb2N1cywgZXBzKSkgcmV0dXJuO1xuICAgICAgICAgICAgYm91bmRzLmN1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhcGk7XG59XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25ndHMtYm91bmRzJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxuZ3QtZ3JvdXAgbmd0Q29tcG91bmQgW3JlZl09XCJib3VuZHNSZWZcIj5cbiAgICAgICAgICAgIDxuZy1jb250ZW50IC8+XG4gICAgICAgIDwvbmd0LWdyb3VwPlxuICAgIGAsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBOR1RTX0JPVU5EU19BUEksIHVzZUZhY3Rvcnk6IGJvdW5kc0FwaUZhY3RvcnksIGRlcHM6IFtOZ3RzQm91bmRzXSB9XSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHNCb3VuZHMgZXh0ZW5kcyBOZ3RSeFN0b3JlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBASW5wdXQoKSBib3VuZHNSZWYgPSBpbmplY3ROZ3RSZWY8R3JvdXA+KCk7XG5cbiAgICBASW5wdXQoKSBzZXQgZGFtcGluZyhkYW1waW5nOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkYW1waW5nIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBmaXQoZml0OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZml0IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBjbGlwKGNsaXA6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjbGlwIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBvYnNlcnZlKG9ic2VydmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBvYnNlcnZlIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtYXJnaW4obWFyZ2luOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBtYXJnaW4gfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGVwcyhlcHM6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IGVwcyB9KTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgZml0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxOZ3RzQm91bmRzU2l6ZT4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmUgPSBpbmplY3QoTmd0U3RvcmUpO1xuXG4gICAgcmVhZG9ubHkgY3VycmVudCA9IHsgYW5pbWF0aW5nOiBmYWxzZSwgZm9jdXM6IG5ldyBUSFJFRS5WZWN0b3IzKCksIGNhbWVyYTogbmV3IFRIUkVFLlZlY3RvcjMoKSwgem9vbTogMSB9O1xuICAgIHJlYWRvbmx5IGdvYWwgPSB7IGZvY3VzOiBuZXcgVEhSRUUuVmVjdG9yMygpLCBjYW1lcmE6IG5ldyBUSFJFRS5WZWN0b3IzKCksIHpvb206IDEgfTtcblxuICAgIG92ZXJyaWRlIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICAgICAgdGhpcy5zZXQoeyBkYW1waW5nOiA2LCBmaXQ6IGZhbHNlLCBjbGlwOiBmYWxzZSwgb2JzZXJ2ZTogZmFsc2UsIG1hcmdpbjogMS4yLCBlcHM6IDAuMDEgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucHJldmVudERyYWdIaWphY2tpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXZlbnREcmFnSGlqYWNraW5nKCkge1xuICAgICAgICB0aGlzLmVmZmVjdCh0aGlzLnN0b3JlLnNlbGVjdCgnY29udHJvbHMnKSwgKGNvbnRyb2xzKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29udHJvbHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+ICh0aGlzLmN1cnJlbnQuYW5pbWF0aW5nID0gZmFsc2UpO1xuICAgICAgICAgICAgICAgIChjb250cm9scyBhcyB1bmtub3duIGFzIENvbnRyb2xzUHJvdG8pLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiAoY29udHJvbHMgYXMgdW5rbm93biBhcyBDb250cm9sc1Byb3RvKS5yZW1vdmVFdmVudExpc3RlbmVyKCdzdGFydCcsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19