@rocketshow/designer 1.32.0 → 1.35.0

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 (362) hide show
  1. package/assets/i18n/de.json +2 -1
  2. package/assets/i18n/en.json +2 -1
  3. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  4. package/esm2022/lib/designer.component.mjs +672 -0
  5. package/esm2022/lib/designer.module.mjs +186 -0
  6. package/esm2022/lib/designer.service.mjs +14 -0
  7. package/esm2022/lib/dropzone/dropzone.component.mjs +93 -0
  8. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +577 -0
  9. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  10. package/esm2022/lib/effect/effect.component.mjs +174 -0
  11. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  15. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  16. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  17. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  18. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +162 -0
  19. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  20. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  21. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  22. package/esm2022/lib/fixture/fixture.component.mjs +148 -0
  23. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  24. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +643 -0
  25. package/esm2022/lib/intro/intro.component.mjs +95 -0
  26. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  27. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  28. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  29. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  30. package/esm2022/lib/models/color.mjs +8 -0
  31. package/esm2022/lib/models/composition.mjs +46 -0
  32. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  33. package/esm2022/lib/models/effect-curve.mjs +69 -0
  34. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  35. package/esm2022/lib/models/effect.mjs +12 -0
  36. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  37. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  38. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  39. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  40. package/esm2022/lib/models/fixture-matrix-pixel-group-constraints.mjs +27 -0
  41. package/esm2022/lib/models/fixture-matrix-pixel-group.mjs +12 -0
  42. package/esm2022/lib/models/fixture-matrix.mjs +25 -0
  43. package/esm2022/lib/models/fixture-mode-channel.mjs +26 -0
  44. package/esm2022/lib/models/fixture-mode.mjs +17 -0
  45. package/esm2022/lib/models/fixture-physical.mjs +14 -0
  46. package/esm2022/lib/models/fixture-profile.mjs +85 -0
  47. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  48. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  49. package/esm2022/lib/models/fixture.mjs +40 -0
  50. package/esm2022/lib/models/preset-fixture.mjs +10 -0
  51. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  52. package/esm2022/lib/models/preset.mjs +65 -0
  53. package/esm2022/lib/models/project.mjs +78 -0
  54. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  55. package/esm2022/lib/models/scene.mjs +27 -0
  56. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  57. package/esm2022/lib/preset/preset.component.mjs +131 -0
  58. package/esm2022/lib/preview/models/color-changer-3d.mjs +64 -0
  59. package/esm2022/lib/preview/models/fixture-3d.mjs +274 -0
  60. package/esm2022/lib/preview/models/moving-head-3d.mjs +124 -0
  61. package/esm2022/lib/preview/preview.component.mjs +219 -0
  62. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  63. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  64. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  65. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  66. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  67. package/esm2022/lib/scene/scene.component.mjs +110 -0
  68. package/esm2022/lib/services/animation.service.mjs +16 -0
  69. package/esm2022/lib/services/config.service.mjs +28 -0
  70. package/esm2022/lib/services/effect.service.mjs +14 -0
  71. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  72. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  73. package/esm2022/lib/services/fixture.service.mjs +639 -0
  74. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  75. package/esm2022/lib/services/intro.service.mjs +140 -0
  76. package/esm2022/lib/services/preset.service.mjs +449 -0
  77. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  78. package/esm2022/lib/services/preview.service.mjs +497 -0
  79. package/esm2022/lib/services/project-load.service.mjs +209 -0
  80. package/esm2022/lib/services/project.service.mjs +93 -0
  81. package/esm2022/lib/services/scene.service.mjs +164 -0
  82. package/esm2022/lib/services/timeline.service.mjs +726 -0
  83. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  84. package/esm2022/lib/services/user.service.mjs +89 -0
  85. package/esm2022/lib/services/uuid.service.mjs +23 -0
  86. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  87. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +304 -0
  88. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  89. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  90. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  91. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  92. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  93. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  94. package/esm2022/public_api.mjs +7 -0
  95. package/esm2022/rocketshow-designer.mjs +5 -0
  96. package/fesm2022/rocketshow-designer.mjs +11171 -0
  97. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  98. package/index.d.ts +5 -0
  99. package/lib/array-sort-pipe.d.ts +3 -0
  100. package/lib/designer.component.d.ts +19 -16
  101. package/lib/designer.module.d.ts +55 -0
  102. package/lib/designer.service.d.ts +3 -0
  103. package/lib/dropzone/dropzone.component.d.ts +24 -0
  104. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  105. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  106. package/lib/effect/effect.component.d.ts +3 -0
  107. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  108. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  109. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  110. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  111. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  112. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  113. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  114. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  115. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  116. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  117. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  118. package/lib/fixture/fixture.component.d.ts +7 -3
  119. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  120. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  121. package/lib/intro/intro.component.d.ts +3 -0
  122. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  123. package/lib/models/cached-fixture.d.ts +1 -0
  124. package/lib/models/fixture-matrix-pixel-group-constraints.d.ts +8 -0
  125. package/lib/models/fixture-matrix-pixel-group.d.ts +6 -0
  126. package/lib/models/fixture-matrix.d.ts +6 -0
  127. package/lib/models/fixture-mode-channel.d.ts +8 -0
  128. package/lib/models/fixture-mode.d.ts +3 -1
  129. package/lib/models/fixture-physical.d.ts +4 -0
  130. package/lib/models/fixture-profile.d.ts +5 -0
  131. package/lib/models/preset-fixture.d.ts +5 -0
  132. package/lib/models/preset.d.ts +2 -0
  133. package/lib/models/project.d.ts +3 -0
  134. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  135. package/lib/preset/preset.component.d.ts +3 -0
  136. package/lib/preview/models/color-changer-3d.d.ts +1 -11
  137. package/lib/preview/models/fixture-3d.d.ts +11 -0
  138. package/lib/preview/models/moving-head-3d.d.ts +1 -11
  139. package/lib/preview/preview.component.d.ts +4 -4
  140. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  141. package/lib/project/project-import/project-import.component.d.ts +3 -0
  142. package/lib/project/project-save/project-save.component.d.ts +3 -0
  143. package/lib/project/project-share/project-share.component.d.ts +3 -0
  144. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  145. package/lib/scene/scene.component.d.ts +3 -0
  146. package/lib/services/animation.service.d.ts +3 -0
  147. package/lib/services/config.service.d.ts +4 -0
  148. package/lib/services/effect.service.d.ts +3 -0
  149. package/lib/services/error-dialog.service.d.ts +3 -0
  150. package/lib/services/fixture-pool.service.d.ts +3 -0
  151. package/lib/services/fixture.service.d.ts +10 -2
  152. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  153. package/lib/services/intro.service.d.ts +3 -0
  154. package/lib/services/preset.service.d.ts +7 -2
  155. package/lib/services/preview-mesh.service.d.ts +3 -0
  156. package/lib/services/preview.service.d.ts +6 -4
  157. package/lib/services/project-load.service.d.ts +8 -1
  158. package/lib/services/project.service.d.ts +5 -3
  159. package/lib/services/scene.service.d.ts +3 -0
  160. package/lib/services/timeline.service.d.ts +3 -0
  161. package/lib/services/user-ensure-login.service.d.ts +3 -0
  162. package/lib/services/user.service.d.ts +3 -0
  163. package/lib/services/uuid.service.d.ts +3 -0
  164. package/lib/services/warning-dialog.service.d.ts +3 -0
  165. package/lib/timeline/composition-settings/composition-settings.component.d.ts +5 -1
  166. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  167. package/lib/timeline/timeline.component.d.ts +3 -0
  168. package/lib/user/user-login/user-login.component.d.ts +3 -0
  169. package/lib/user/user-register/user-register.component.d.ts +3 -0
  170. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  171. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  172. package/package.json +20 -22
  173. package/rocketshow-designer-1.35.0.tgz +0 -0
  174. package/bundles/rocketshow-designer.umd.js +0 -9966
  175. package/bundles/rocketshow-designer.umd.js.map +0 -1
  176. package/bundles/rocketshow-designer.umd.min.js +0 -17
  177. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  178. package/esm2015/lib/array-sort-pipe.js +0 -28
  179. package/esm2015/lib/designer.component.js +0 -411
  180. package/esm2015/lib/designer.module.js +0 -117
  181. package/esm2015/lib/designer.service.js +0 -16
  182. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  183. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  184. package/esm2015/lib/effect/effect.component.js +0 -73
  185. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  186. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  187. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  188. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  189. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  190. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  191. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  192. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  193. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  194. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  195. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  196. package/esm2015/lib/fixture/fixture.component.js +0 -70
  197. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  198. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  199. package/esm2015/lib/intro/intro.component.js +0 -25
  200. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  201. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  202. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  203. package/esm2015/lib/models/cached-fixture.js +0 -6
  204. package/esm2015/lib/models/color.js +0 -8
  205. package/esm2015/lib/models/composition.js +0 -46
  206. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  207. package/esm2015/lib/models/effect-curve.js +0 -69
  208. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  209. package/esm2015/lib/models/effect.js +0 -12
  210. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  211. package/esm2015/lib/models/fixture-capability.js +0 -84
  212. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  213. package/esm2015/lib/models/fixture-channel.js +0 -24
  214. package/esm2015/lib/models/fixture-mode.js +0 -14
  215. package/esm2015/lib/models/fixture-profile.js +0 -70
  216. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  217. package/esm2015/lib/models/fixture-wheel.js +0 -15
  218. package/esm2015/lib/models/fixture.js +0 -40
  219. package/esm2015/lib/models/preset-region-scene.js +0 -8
  220. package/esm2015/lib/models/preset.js +0 -56
  221. package/esm2015/lib/models/project.js +0 -68
  222. package/esm2015/lib/models/scene-playback-region.js +0 -11
  223. package/esm2015/lib/models/scene.js +0 -27
  224. package/esm2015/lib/models/universe.js +0 -11
  225. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  226. package/esm2015/lib/preset/preset.component.js +0 -85
  227. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  228. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  229. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  230. package/esm2015/lib/preview/preview.component.js +0 -242
  231. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  232. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  233. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  234. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  235. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  236. package/esm2015/lib/scene/scene.component.js +0 -56
  237. package/esm2015/lib/services/animation.service.js +0 -17
  238. package/esm2015/lib/services/config.service.js +0 -28
  239. package/esm2015/lib/services/effect.service.js +0 -16
  240. package/esm2015/lib/services/error-dialog.service.js +0 -44
  241. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  242. package/esm2015/lib/services/fixture.service.js +0 -443
  243. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  244. package/esm2015/lib/services/intro.service.js +0 -144
  245. package/esm2015/lib/services/preset.service.js +0 -416
  246. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  247. package/esm2015/lib/services/preview.service.js +0 -500
  248. package/esm2015/lib/services/project-load.service.js +0 -171
  249. package/esm2015/lib/services/project.service.js +0 -113
  250. package/esm2015/lib/services/scene.service.js +0 -174
  251. package/esm2015/lib/services/timeline.service.js +0 -738
  252. package/esm2015/lib/services/universe.service.js +0 -24
  253. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  254. package/esm2015/lib/services/user.service.js +0 -93
  255. package/esm2015/lib/services/uuid.service.js +0 -25
  256. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  257. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  258. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  259. package/esm2015/lib/timeline/timeline.component.js +0 -239
  260. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  261. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  262. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  263. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  264. package/esm2015/public_api.js +0 -7
  265. package/esm2015/rocketshow-designer.js +0 -61
  266. package/esm5/lib/array-sort-pipe.js +0 -31
  267. package/esm5/lib/designer.component.js +0 -468
  268. package/esm5/lib/designer.module.js +0 -120
  269. package/esm5/lib/designer.service.js +0 -17
  270. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  271. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  272. package/esm5/lib/effect/effect.component.js +0 -75
  273. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  274. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  275. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  276. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  277. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  278. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  279. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  280. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  281. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  282. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  283. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  284. package/esm5/lib/fixture/fixture.component.js +0 -71
  285. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  286. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  287. package/esm5/lib/intro/intro.component.js +0 -26
  288. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  289. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  290. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  291. package/esm5/lib/models/cached-fixture.js +0 -8
  292. package/esm5/lib/models/color.js +0 -10
  293. package/esm5/lib/models/composition.js +0 -60
  294. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  295. package/esm5/lib/models/effect-curve.js +0 -95
  296. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  297. package/esm5/lib/models/effect.js +0 -14
  298. package/esm5/lib/models/fixture-capability-value.js +0 -17
  299. package/esm5/lib/models/fixture-capability.js +0 -86
  300. package/esm5/lib/models/fixture-channel-value.js +0 -13
  301. package/esm5/lib/models/fixture-channel.js +0 -38
  302. package/esm5/lib/models/fixture-mode.js +0 -16
  303. package/esm5/lib/models/fixture-profile.js +0 -114
  304. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  305. package/esm5/lib/models/fixture-wheel.js +0 -29
  306. package/esm5/lib/models/fixture.js +0 -42
  307. package/esm5/lib/models/preset-region-scene.js +0 -10
  308. package/esm5/lib/models/preset.js +0 -90
  309. package/esm5/lib/models/project.js +0 -122
  310. package/esm5/lib/models/scene-playback-region.js +0 -13
  311. package/esm5/lib/models/scene.js +0 -29
  312. package/esm5/lib/models/universe.js +0 -13
  313. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  314. package/esm5/lib/preset/preset.component.js +0 -86
  315. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  316. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  317. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  318. package/esm5/lib/preview/preview.component.js +0 -280
  319. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  320. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  321. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  322. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  323. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  324. package/esm5/lib/scene/scene.component.js +0 -57
  325. package/esm5/lib/services/animation.service.js +0 -18
  326. package/esm5/lib/services/config.service.js +0 -29
  327. package/esm5/lib/services/effect.service.js +0 -17
  328. package/esm5/lib/services/error-dialog.service.js +0 -46
  329. package/esm5/lib/services/fixture-pool.service.js +0 -36
  330. package/esm5/lib/services/fixture.service.js +0 -643
  331. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  332. package/esm5/lib/services/intro.service.js +0 -145
  333. package/esm5/lib/services/preset.service.js +0 -637
  334. package/esm5/lib/services/preview-mesh.service.js +0 -61
  335. package/esm5/lib/services/preview.service.js +0 -754
  336. package/esm5/lib/services/project-load.service.js +0 -185
  337. package/esm5/lib/services/project.service.js +0 -127
  338. package/esm5/lib/services/scene.service.js +0 -251
  339. package/esm5/lib/services/timeline.service.js +0 -845
  340. package/esm5/lib/services/universe.service.js +0 -36
  341. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  342. package/esm5/lib/services/user.service.js +0 -95
  343. package/esm5/lib/services/uuid.service.js +0 -26
  344. package/esm5/lib/services/warning-dialog.service.js +0 -45
  345. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  346. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  347. package/esm5/lib/timeline/timeline.component.js +0 -243
  348. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  349. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  350. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  351. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  352. package/esm5/public_api.js +0 -7
  353. package/esm5/rocketshow-designer.js +0 -61
  354. package/fesm2015/rocketshow-designer.js +0 -7945
  355. package/fesm2015/rocketshow-designer.js.map +0 -1
  356. package/fesm5/rocketshow-designer.js +0 -9690
  357. package/fesm5/rocketshow-designer.js.map +0 -1
  358. package/lib/models/universe.d.ts +0 -8
  359. package/lib/services/universe.service.d.ts +0 -6
  360. package/rocketshow-designer-1.32.0.tgz +0 -0
  361. package/rocketshow-designer.d.ts +0 -60
  362. package/rocketshow-designer.metadata.json +0 -1
@@ -0,0 +1,274 @@
1
+ import * as THREE from 'three';
2
+ import { Positioning } from '../../models/fixture';
3
+ import { FixtureCapabilityColor, FixtureCapabilityType } from '../../models/fixture-capability';
4
+ export class Fixture3d {
5
+ constructor(fixtureService, fixture, scene) {
6
+ this.fixtureService = fixtureService;
7
+ this.pointLightMaxIntensity = 2;
8
+ this.spotLightLightMaxIntensity = 10;
9
+ this.fixtureHasDimmer = false;
10
+ this.fixtureHasColorWheel = false;
11
+ this.fixtureHasColor = false;
12
+ this.dimmer = 0;
13
+ this.isSelected = false;
14
+ this.isLoaded = false;
15
+ this.fixture = fixture;
16
+ this.scene = scene;
17
+ // TODO Don't create it for each fixture but pass it from the preview service
18
+ this.selectedMaterial = new THREE.MeshLambertMaterial({
19
+ color: 0xff00ff,
20
+ emissive: 0xff00ff,
21
+ });
22
+ // evaluate, various capabilities of this fixture
23
+ for (const cachedChannel of this.fixture.channels) {
24
+ if (cachedChannel.channel) {
25
+ for (const capability of cachedChannel.capabilities) {
26
+ switch (capability.capability.type) {
27
+ case FixtureCapabilityType.Intensity:
28
+ this.fixtureHasDimmer = true;
29
+ break;
30
+ case FixtureCapabilityType.ColorIntensity:
31
+ this.fixtureHasColor = true;
32
+ break;
33
+ }
34
+ }
35
+ if (cachedChannel.colorWheel) {
36
+ this.fixtureHasColorWheel = true;
37
+ }
38
+ }
39
+ }
40
+ }
41
+ createObjects() {
42
+ // Add the spotlight
43
+ this.spotLight = new THREE.SpotLight(0xffffff, 50000);
44
+ this.spotLight.angle = 2;
45
+ this.spotLight.penumbra = 1;
46
+ this.spotLight.decay = 0.01;
47
+ this.spotLight.distance = 0;
48
+ this.spotLight.intensity = 1;
49
+ this.spotLightHelper = new THREE.SpotLightHelper(this.spotLight);
50
+ this.scene.add(this.spotLightHelper);
51
+ const spotLightTarget = new THREE.Object3D();
52
+ this.spotLight.target = spotLightTarget;
53
+ this.spotlightGroup = new THREE.Object3D();
54
+ this.spotlightGroup.add(this.spotLight);
55
+ this.spotlightGroup.add(spotLightTarget);
56
+ this.spotLight.position.set(0, -1.4, 0);
57
+ spotLightTarget.position.set(0, -10, 0);
58
+ this.createSpotLightBeam();
59
+ // Add the point light for the surrounding light
60
+ this.pointLight = new THREE.PointLight(0xffffff, 500, 0, 0.1);
61
+ this.spotlightGroup.add(this.pointLight);
62
+ this.pointLight.position.set(0, -1.4, 0);
63
+ }
64
+ getCapabilityInValue(channel, value) {
65
+ for (const capability of channel.capabilities) {
66
+ if (capability.capability.dmxRange.length === 0 ||
67
+ (value >= capability.capability.dmxRange[0] && value <= capability.capability.dmxRange[1])) {
68
+ return capability;
69
+ }
70
+ }
71
+ return undefined;
72
+ }
73
+ // Apply the properties of the base fixture to the preview
74
+ updatePreview(channelValues, masterDimmerValue) {
75
+ // Apply default settings
76
+ if (this.fixtureHasDimmer) {
77
+ this.dimmer = 0;
78
+ }
79
+ else {
80
+ this.dimmer = 1;
81
+ }
82
+ this.colorRed = 255;
83
+ this.colorGreen = 255;
84
+ this.colorBlue = 255;
85
+ if (!this.fixtureHasColorWheel && this.fixtureHasColor) {
86
+ this.colorRed = 0;
87
+ this.colorGreen = 0;
88
+ this.colorBlue = 0;
89
+ }
90
+ for (const channelValue of channelValues) {
91
+ const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
92
+ const capability = this.getCapabilityInValue(channel, channelValue.value);
93
+ if (capability) {
94
+ switch (capability.capability.type) {
95
+ case FixtureCapabilityType.Intensity: {
96
+ let valuePercentage;
97
+ if (capability.capability.dmxRange.length > 0) {
98
+ valuePercentage =
99
+ (channelValue.value - capability.capability.dmxRange[0]) /
100
+ (capability.capability.dmxRange[1] - capability.capability.dmxRange[0]);
101
+ }
102
+ else {
103
+ valuePercentage = channelValue.value / channel.maxValue;
104
+ }
105
+ this.dimmer = valuePercentage * masterDimmerValue;
106
+ break;
107
+ }
108
+ case FixtureCapabilityType.ColorIntensity: {
109
+ const valuePercentage = (255 * channelValue.value) / channel.maxValue;
110
+ switch (capability.capability.color) {
111
+ case FixtureCapabilityColor.Red:
112
+ // Round needed for threejs
113
+ this.colorRed = Math.round(valuePercentage);
114
+ break;
115
+ case FixtureCapabilityColor.Green:
116
+ // Round needed for threejs
117
+ this.colorGreen = Math.round(valuePercentage);
118
+ break;
119
+ case FixtureCapabilityColor.Blue:
120
+ // Round needed for threejs
121
+ this.colorBlue = Math.round(valuePercentage);
122
+ break;
123
+ }
124
+ break;
125
+ }
126
+ case FixtureCapabilityType.WheelSlot: {
127
+ const mixedColor = this.fixtureService.getMixedWheelSlotColor(capability.wheel, capability.capability.slotNumber);
128
+ if (mixedColor) {
129
+ this.colorRed = Math.round(mixedColor.red);
130
+ this.colorGreen = Math.round(mixedColor.green);
131
+ this.colorBlue = Math.round(mixedColor.blue);
132
+ }
133
+ break;
134
+ }
135
+ }
136
+ }
137
+ }
138
+ // Apply the colors and intensities
139
+ // Apply the dimmer value
140
+ // Take the color into account for the beam (don't show a black beam)
141
+ const color = new THREE.Color('rgb(' + this.colorRed + ', ' + this.colorGreen + ', ' + this.colorBlue + ')');
142
+ const intensityColor = Math.max(this.colorRed, this.colorGreen, this.colorBlue);
143
+ if (this.pointLight) {
144
+ this.pointLight.color = color;
145
+ this.pointLight.intensity = this.pointLightMaxIntensity * this.dimmer;
146
+ }
147
+ if (this.spotLight) {
148
+ this.spotLight.color = color;
149
+ this.spotLightBeam.material.uniforms.lightColor.value = color;
150
+ this.spotLightBeam.material.uniforms.opacity.value = Math.min(intensityColor, this.dimmer);
151
+ this.spotLight.intensity = this.spotLightLightMaxIntensity * this.dimmer;
152
+ this.spotLightBeam.material.uniforms.spotPosition.value = this.spotlightGroup.position;
153
+ }
154
+ }
155
+ updatePosition(object) {
156
+ // Update the position
157
+ switch (this.fixture.fixture.positioning) {
158
+ case Positioning.topFront: {
159
+ object.rotation.x = THREE.MathUtils.degToRad(0);
160
+ object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);
161
+ break;
162
+ }
163
+ case Positioning.bottomFront: {
164
+ object.rotation.x = THREE.MathUtils.degToRad(180);
165
+ object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);
166
+ break;
167
+ }
168
+ case Positioning.topBack: {
169
+ object.rotation.x = THREE.MathUtils.degToRad(0);
170
+ object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY - 13, this.fixture.fixture.positionZ);
171
+ break;
172
+ }
173
+ case Positioning.bottomBack: {
174
+ object.rotation.x = THREE.MathUtils.degToRad(180);
175
+ object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY + 13, this.fixture.fixture.positionZ);
176
+ break;
177
+ }
178
+ case Positioning.manual: {
179
+ object.position.set(this.fixture.fixture.positionX, this.fixture.fixture.positionY, this.fixture.fixture.positionZ);
180
+ object.rotation.x = THREE.MathUtils.degToRad(this.fixture.fixture.rotationX);
181
+ object.rotation.y = THREE.MathUtils.degToRad(this.fixture.fixture.rotationY);
182
+ object.rotation.z = THREE.MathUtils.degToRad(this.fixture.fixture.rotationZ);
183
+ break;
184
+ }
185
+ }
186
+ }
187
+ atmosphereMat() {
188
+ const vertexShader = `
189
+ varying vec3 vNormal;
190
+ varying vec3 vWorldPosition;
191
+
192
+ void main(){
193
+ vNormal = normalize(normalMatrix * normal);
194
+
195
+ vec4 worldPosition = modelMatrix * vec4(position, 1.0);
196
+ vWorldPosition = worldPosition.xyz;
197
+
198
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
199
+ }`;
200
+ const fragmentShader = `
201
+ varying vec3 vNormal;
202
+ varying vec3 vWorldPosition;
203
+
204
+ uniform vec3 lightColor;
205
+ uniform float opacity;
206
+ uniform vec3 spotPosition;
207
+ uniform float attenuation;
208
+ uniform float anglePower;
209
+
210
+ void main(){
211
+ float intensity;
212
+
213
+ intensity = distance(vWorldPosition, spotPosition) / attenuation;
214
+ intensity = 1.0 - clamp(intensity, 0.0, 1.0);
215
+
216
+ vec3 normal = vec3(vNormal.x, vNormal.y, abs(vNormal.z));
217
+ float angleIntensity = pow(dot(normal, vec3(0.0, 0.0, 1.0)), anglePower);
218
+ intensity = intensity * angleIntensity * opacity;
219
+
220
+ gl_FragColor = vec4(lightColor, intensity);
221
+ }`;
222
+ const material = new THREE.ShaderMaterial({
223
+ uniforms: {
224
+ attenuation: {
225
+ type: 'f',
226
+ value: 800.0,
227
+ },
228
+ anglePower: {
229
+ type: 'f',
230
+ value: 2,
231
+ },
232
+ spotPosition: {
233
+ type: 'v3',
234
+ value: new THREE.Vector3(0, 0, 0),
235
+ },
236
+ lightColor: {
237
+ type: 'c',
238
+ value: new THREE.Color('white'),
239
+ },
240
+ opacity: {
241
+ type: 'f',
242
+ value: 1.0,
243
+ },
244
+ },
245
+ vertexShader,
246
+ fragmentShader,
247
+ transparent: true,
248
+ depthWrite: false,
249
+ });
250
+ return material;
251
+ }
252
+ createSpotLightBeam() {
253
+ if (this.spotLightBeam) {
254
+ this.spotlightGroup.remove(this.spotLightBeam);
255
+ }
256
+ // TODO set the correct angle from the profile
257
+ const beamAngleDegrees = 14;
258
+ const geometry = new THREE.CylinderGeometry(0.1, beamAngleDegrees * 1.2, 100, 64, 20, false);
259
+ geometry.applyMatrix4(new THREE.Matrix4().makeTranslation(0, -geometry.parameters.height / 2, 0));
260
+ geometry.applyMatrix4(new THREE.Matrix4().makeRotationX(-Math.PI / 2));
261
+ this.atmosphereMaterial = this.atmosphereMat();
262
+ this.spotLightBeam = new THREE.Mesh(geometry, this.atmosphereMaterial);
263
+ this.spotLightBeam.position.set(0, -0.02, 0);
264
+ this.spotLightBeam.receiveShadow = false;
265
+ this.spotLightBeam.castShadow = false;
266
+ this.spotlightGroup.add(this.spotLightBeam);
267
+ this.spotLightBeam.rotation.x = Math.PI / 2;
268
+ }
269
+ destroy() {
270
+ this.selectedMaterial.dispose();
271
+ this.atmosphereMaterial.dispose();
272
+ }
273
+ }
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS0zZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rlc2lnbmVyL3NyYy9saWIvcHJldmlldy9tb2RlbHMvZml4dHVyZS0zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUkvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFJaEcsTUFBTSxPQUFnQixTQUFTO0lBOEI3QixZQUFtQixjQUE4QixFQUFFLE9BQXNCLEVBQUUsS0FBVTtRQUFsRSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUE3QmhDLDJCQUFzQixHQUFXLENBQUMsQ0FBQztRQUNuQywrQkFBMEIsR0FBVyxFQUFFLENBQUM7UUFHekQscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLHlCQUFvQixHQUFHLEtBQUssQ0FBQztRQUM3QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQVF4QixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRVgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBYWYsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNwRCxLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztRQUVILGlEQUFpRDtRQUNqRCxLQUFLLE1BQU0sYUFBYSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEQsSUFBSSxhQUFhLENBQUMsT0FBTyxF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QUFLLENBQUMsT0FBTyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV0QyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZUNoYW5uZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUtY2hhbm5lbCc7XG5pbXBvcnQgeyBQb3NpdGlvbmluZyB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsIEZpeHR1cmVDYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgRml4dHVyZUNoYW5uZWxWYWx1ZSB9IGZyb20gJy4uLy4uL21vZGVscy9maXh0dXJlLWNoYW5uZWwtdmFsdWUnO1xuaW1wb3J0IHsgRml4dHVyZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9maXh0dXJlLnNlcnZpY2UnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRml4dHVyZTNkIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwb2ludExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAyO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwb3RMaWdodExpZ2h0TWF4SW50ZW5zaXR5OiBudW1iZXIgPSAxMDtcblxuICBmaXh0dXJlOiBDYWNoZWRGaXh0dXJlO1xuICBmaXh0dXJlSGFzRGltbWVyID0gZmFsc2U7XG4gIGZpeHR1cmVIYXNDb2xvcldoZWVsID0gZmFsc2U7XG4gIGZpeHR1cmVIYXNDb2xvciA9IGZhbHNlO1xuXG4gIHNjZW5lOiBhbnk7XG5cbiAgY29sb3JSZWQ6IG51bWJlcjtcbiAgY29sb3JHcmVlbjogbnVtYmVyO1xuICBjb2xvckJsdWU6IG51bWJlcjtcblxuICBkaW1tZXIgPSAwO1xuXG4gIGlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgaXNMb2FkZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgc2VsZWN0ZWRNYXRlcmlhbDogVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbDtcblxuICBwcm90ZWN0ZWQgcG9pbnRMaWdodDogVEhSRUUuUG9pbnRMaWdodDtcblxuICBwcm90ZWN0ZWQgYXRtb3NwaGVyZU1hdGVyaWFsOiBUSFJFRS5TaGFkZXJNYXRlcmlhbDtcbiAgcHJvdGVjdGVkIHNwb3RMaWdodDogVEhSRUUuU3BvdExpZ2h0O1xuICBwcm90ZWN0ZWQgc3BvdExpZ2h0SGVscGVyOiBUSFJFRS5TcG90TGlnaHRIZWxwZXI7XG4gIHByb3RlY3RlZCBzcG90TGlnaHRCZWFtOiBUSFJFRS5NZXNoO1xuICBwcm90ZWN0ZWQgc3BvdGxpZ2h0R3JvdXA6IFRIUkVFLk9iamVjdDNEO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsIGZpeHR1cmU6IENhY2hlZEZpeHR1cmUsIHNjZW5lOiBhbnkpIHtcbiAgICB0aGlzLmZpeHR1cmUgPSBmaXh0dXJlO1xuICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcblxuICAgIC8vIFRPRE8gRG9uJ3QgY3JlYXRlIGl0IGZvciBlYWNoIGZpeHR1cmUgYnV0IHBhc3MgaXQgZnJvbSB0aGUgcHJldmlldyBzZXJ2aWNlXG4gICAgdGhpcy5zZWxlY3RlZE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IDB4ZmYwMGZmLFxuICAgICAgZW1pc3NpdmU6IDB4ZmYwMGZmLFxuICAgIH0pO1xuXG4gICAgLy8gZXZhbHVhdGUsIHZhcmlvdXMgY2FwYWJpbGl0aWVzIG9mIHRoaXMgZml4dHVyZVxuICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiB0aGlzLmZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChjYWNoZWRDaGFubmVsLmNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGNhY2hlZENoYW5uZWwuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgc3dpdGNoIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuSW50ZW5zaXR5OlxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVIYXNEaW1tZXIgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5OlxuICAgICAgICAgICAgICB0aGlzLmZpeHR1cmVIYXNDb2xvciA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWNoZWRDaGFubmVsLmNvbG9yV2hlZWwpIHtcbiAgICAgICAgICB0aGlzLmZpeHR1cmVIYXNDb2xvcldoZWVsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVPYmplY3RzKCkge1xuICAgIC8vIEFkZCB0aGUgc3BvdGxpZ2h0XG4gICAgdGhpcy5zcG90TGlnaHQgPSBuZXcgVEhSRUUuU3BvdExpZ2h0KDB4ZmZmZmZmLCA1MDAwMCk7XG4gICAgdGhpcy5zcG90TGlnaHQuYW5nbGUgPSAyO1xuICAgIHRoaXMuc3BvdExpZ2h0LnBlbnVtYnJhID0gMTtcbiAgICB0aGlzLnNwb3RMaWdodC5kZWNheSA9IDAuMDE7XG4gICAgdGhpcy5zcG90TGlnaHQuZGlzdGFuY2UgPSAwO1xuICAgIHRoaXMuc3BvdExpZ2h0LmludGVuc2l0eSA9IDE7XG5cbiAgICB0aGlzLnNwb3RMaWdodEhlbHBlciA9IG5ldyBUSFJFRS5TcG90TGlnaHRIZWxwZXIodGhpcy5zcG90TGlnaHQpO1xuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuc3BvdExpZ2h0SGVscGVyKTtcblxuICAgIGNvbnN0IHNwb3RMaWdodFRhcmdldCA9IG5ldyBUSFJFRS5PYmplY3QzRCgpO1xuICAgIHRoaXMuc3BvdExpZ2h0LnRhcmdldCA9IHNwb3RMaWdodFRhcmdldDtcblxuICAgIHRoaXMuc3BvdGxpZ2h0R3JvdXAgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgICB0aGlzLnNwb3RsaWdodEdyb3VwLmFkZCh0aGlzLnNwb3RMaWdodCk7XG4gICAgdGhpcy5zcG90bGlnaHRHcm91cC5hZGQoc3BvdExpZ2h0VGFyZ2V0KTtcbiAgICB0aGlzLnNwb3RMaWdodC5wb3NpdGlvbi5zZXQoMCwgLTEuNCwgMCk7XG4gICAgc3BvdExpZ2h0VGFyZ2V0LnBvc2l0aW9uLnNldCgwLCAtMTAsIDApO1xuICAgIHRoaXMuY3JlYXRlU3BvdExpZ2h0QmVhbSgpO1xuXG4gICAgLy8gQWRkIHRoZSBwb2ludCBsaWdodCBmb3IgdGhlIHN1cnJvdW5kaW5nIGxpZ2h0XG4gICAgdGhpcy5wb2ludExpZ2h0ID0gbmV3IFRIUkVFLlBvaW50TGlnaHQoMHhmZmZmZmYsIDUwMCwgMCwgMC4xKTtcbiAgICB0aGlzLnNwb3RsaWdodEdyb3VwLmFkZCh0aGlzLnBvaW50TGlnaHQpO1xuICAgIHRoaXMucG9pbnRMaWdodC5wb3NpdGlvbi5zZXQoMCwgLTEuNCwgMCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2FwYWJpbGl0eUluVmFsdWUoY2hhbm5lbDogQ2FjaGVkRml4dHVyZUNoYW5uZWwsIHZhbHVlOiBudW1iZXIpOiBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eSB7XG4gICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGNoYW5uZWwuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgKHZhbHVlID49IGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSAmJiB2YWx1ZSA8PSBjYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0pXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGNhcGFiaWxpdHk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIEFwcGx5IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBiYXNlIGZpeHR1cmUgdG8gdGhlIHByZXZpZXdcbiAgdXBkYXRlUHJldmlldyhjaGFubmVsVmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sIG1hc3RlckRpbW1lclZhbHVlOiBudW1iZXIpIHtcbiAgICAvLyBBcHBseSBkZWZhdWx0IHNldHRpbmdzXG4gICAgaWYgKHRoaXMuZml4dHVyZUhhc0RpbW1lcikge1xuICAgICAgdGhpcy5kaW1tZXIgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpbW1lciA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy5jb2xvclJlZCA9IDI1NTtcbiAgICB0aGlzLmNvbG9yR3JlZW4gPSAyNTU7XG4gICAgdGhpcy5jb2xvckJsdWUgPSAyNTU7XG5cbiAgICBpZiAoIXRoaXMuZml4dHVyZUhhc0NvbG9yV2hlZWwgJiYgdGhpcy5maXh0dXJlSGFzQ29sb3IpIHtcbiAgICAgIHRoaXMuY29sb3JSZWQgPSAwO1xuICAgICAgdGhpcy5jb2xvckdyZWVuID0gMDtcbiAgICAgIHRoaXMuY29sb3JCbHVlID0gMDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxWYWx1ZSBvZiBjaGFubmVsVmFsdWVzKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDaGFubmVsQnlOYW1lKHRoaXMuZml4dHVyZSwgY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lKTtcbiAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLmdldENhcGFiaWxpdHlJblZhbHVlKGNoYW5uZWwsIGNoYW5uZWxWYWx1ZS52YWx1ZSk7XG5cbiAgICAgIGlmIChjYXBhYmlsaXR5KSB7XG4gICAgICAgIHN3aXRjaCAoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LnR5cGUpIHtcbiAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5JbnRlbnNpdHk6IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZVBlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB2YWx1ZVBlcmNlbnRhZ2UgPVxuICAgICAgICAgICAgICAgIChjaGFubmVsVmFsdWUudmFsdWUgLSBjYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMF0pIC9cbiAgICAgICAgICAgICAgICAoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlWzFdIC0gY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlUGVyY2VudGFnZSA9IGNoYW5uZWxWYWx1ZS52YWx1ZSAvIGNoYW5uZWwubWF4VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRpbW1lciA9IHZhbHVlUGVyY2VudGFnZSAqIG1hc3RlckRpbW1lclZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5OiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZVBlcmNlbnRhZ2UgPSAoMjU1ICogY2hhbm5lbFZhbHVlLnZhbHVlKSAvIGNoYW5uZWwubWF4VmFsdWU7XG4gICAgICAgICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5jb2xvcikge1xuICAgICAgICAgICAgICBjYXNlIEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IuUmVkOlxuICAgICAgICAgICAgICAgIC8vIFJvdW5kIG5lZWRlZCBmb3IgdGhyZWVqc1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JSZWQgPSBNYXRoLnJvdW5kKHZhbHVlUGVyY2VudGFnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlDb2xvci5HcmVlbjpcbiAgICAgICAgICAgICAgICAvLyBSb3VuZCBuZWVkZWQgZm9yIHRocmVlanNcbiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yR3JlZW4gPSBNYXRoLnJvdW5kKHZhbHVlUGVyY2VudGFnZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlDb2xvci5CbHVlOlxuICAgICAgICAgICAgICAgIC8vIFJvdW5kIG5lZWRlZCBmb3IgdGhyZWVqc1xuICAgICAgICAgICAgICAgIHRoaXMuY29sb3JCbHVlID0gTWF0aC5yb3VuZCh2YWx1ZVBlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLldoZWVsU2xvdDoge1xuICAgICAgICAgICAgY29uc3QgbWl4ZWRDb2xvciA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcihjYXBhYmlsaXR5LndoZWVsLCBjYXBhYmlsaXR5LmNhcGFiaWxpdHkuc2xvdE51bWJlcik7XG4gICAgICAgICAgICBpZiAobWl4ZWRDb2xvcikge1xuICAgICAgICAgICAgICB0aGlzLmNvbG9yUmVkID0gTWF0aC5yb3VuZChtaXhlZENvbG9yLnJlZCk7XG4gICAgICAgICAgICAgIHRoaXMuY29sb3JHcmVlbiA9IE1hdGgucm91bmQobWl4ZWRDb2xvci5ncmVlbik7XG4gICAgICAgICAgICAgIHRoaXMuY29sb3JCbHVlID0gTWF0aC5yb3VuZChtaXhlZENvbG9yLmJsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdGhlIGNvbG9ycyBhbmQgaW50ZW5zaXRpZXNcbiAgICAvLyBBcHBseSB0aGUgZGltbWVyIHZhbHVlXG4gICAgLy8gVGFrZSB0aGUgY29sb3IgaW50byBhY2NvdW50IGZvciB0aGUgYmVhbSAoZG9uJ3Qgc2hvdyBhIGJsYWNrIGJlYW0pXG4gICAgY29uc3QgY29sb3IgPSBuZXcgVEhSRUUuQ29sb3IoJ3JnYignICsgdGhpcy5jb2xvclJlZCArICcsICcgKyB0aGlzLmNvbG9yR3JlZW4gKyAnLCAnICsgdGhpcy5jb2xvckJsdWUgKyAnKScpO1xuICAgIGNvbnN0IGludGVuc2l0eUNvbG9yID0gTWF0aC5tYXgodGhpcy5jb2xvclJlZCwgdGhpcy5jb2xvckdyZWVuLCB0aGlzLmNvbG9yQmx1ZSk7XG5cbiAgICBpZiAodGhpcy5wb2ludExpZ2h0KSB7XG4gICAgICB0aGlzLnBvaW50TGlnaHQuY29sb3IgPSBjb2xvcjtcbiAgICAgIHRoaXMucG9pbnRMaWdodC5pbnRlbnNpdHkgPSB0aGlzLnBvaW50TGlnaHRNYXhJbnRlbnNpdHkgKiB0aGlzLmRpbW1lcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3BvdExpZ2h0KSB7XG4gICAgICB0aGlzLnNwb3RMaWdodC5jb2xvciA9IGNvbG9yO1xuICAgICAgdGhpcy5zcG90TGlnaHRCZWFtLm1hdGVyaWFsLnVuaWZvcm1zLmxpZ2h0Q29sb3IudmFsdWUgPSBjb2xvcjtcblxuICAgICAgdGhpcy5zcG90TGlnaHRCZWFtLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBNYXRoLm1pbihpbnRlbnNpdHlDb2xvciwgdGhpcy5kaW1tZXIpO1xuICAgICAgdGhpcy5zcG90TGlnaHQuaW50ZW5zaXR5ID0gdGhpcy5zcG90TGlnaHRMaWdodE1heEludGVuc2l0eSAqIHRoaXMuZGltbWVyO1xuICAgICAgdGhpcy5zcG90TGlnaHRCZWFtLm1hdGVyaWFsLnVuaWZvcm1zLnNwb3RQb3NpdGlvbi52YWx1ZSA9IHRoaXMuc3BvdGxpZ2h0R3JvdXAucG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlUG9zaXRpb24ob2JqZWN0OiBUSFJFRS5PYmplY3QzRCkge1xuICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb25cbiAgICBzd2l0Y2ggKHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uaW5nKSB7XG4gICAgICBjYXNlIFBvc2l0aW9uaW5nLnRvcEZyb250OiB7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDApO1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWCwgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25ZIC0gMTMsIHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbmluZy5ib3R0b21Gcm9udDoge1xuICAgICAgICBvYmplY3Qucm90YXRpb24ueCA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCgxODApO1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWCwgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25ZICsgMTMsIHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbmluZy50b3BCYWNrOiB7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDApO1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWCwgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25ZIC0gMTMsIHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBQb3NpdGlvbmluZy5ib3R0b21CYWNrOiB7XG4gICAgICAgIG9iamVjdC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKDE4MCk7XG4gICAgICAgIG9iamVjdC5wb3NpdGlvbi5zZXQodGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25YLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblkgKyAxMywgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25aKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBvc2l0aW9uaW5nLm1hbnVhbDoge1xuICAgICAgICBvYmplY3QucG9zaXRpb24uc2V0KHRoaXMuZml4dHVyZS5maXh0dXJlLnBvc2l0aW9uWCwgdGhpcy5maXh0dXJlLmZpeHR1cmUucG9zaXRpb25ZLCB0aGlzLmZpeHR1cmUuZml4dHVyZS5wb3NpdGlvblopO1xuICAgICAgICBvYmplY3Qucm90YXRpb24ueCA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aGlzLmZpeHR1cmUuZml4dHVyZS5yb3RhdGlvblgpO1xuICAgICAgICBvYmplY3Qucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aGlzLmZpeHR1cmUuZml4dHVyZS5yb3RhdGlvblkpO1xuICAgICAgICBvYmplY3Qucm90YXRpb24ueiA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZCh0aGlzLmZpeHR1cmUuZml4dHVyZS5yb3RhdGlvblopO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXRtb3NwaGVyZU1hdCgpIHtcbiAgICBjb25zdCB2ZXJ0ZXhTaGFkZXIgPSBgXG4gICAgICB2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiAgICAgIHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblxuICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgIHZOb3JtYWwgPSBub3JtYWxpemUobm9ybWFsTWF0cml4ICogbm9ybWFsKTtcblxuICAgICAgICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICAgIHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cbiAgICAgICAgZ2xfUG9zaXRpb25cdD0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgICB9YDtcbiAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IGBcbiAgICAgIHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuICAgICAgdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXG4gICAgICB1bmlmb3JtIHZlYzMgbGlnaHRDb2xvcjtcbiAgICAgIHVuaWZvcm0gZmxvYXRcdG9wYWNpdHk7XG4gICAgICB1bmlmb3JtIHZlYzMgc3BvdFBvc2l0aW9uO1xuICAgICAgdW5pZm9ybSBmbG9hdCBhdHRlbnVhdGlvbjtcbiAgICAgIHVuaWZvcm0gZmxvYXRcdGFuZ2xlUG93ZXI7XG5cbiAgICAgIHZvaWQgbWFpbigpe1xuICAgICAgICBmbG9hdCBpbnRlbnNpdHk7XG5cbiAgICAgICAgaW50ZW5zaXR5XHQ9IGRpc3RhbmNlKHZXb3JsZFBvc2l0aW9uLCBzcG90UG9zaXRpb24pIC8gYXR0ZW51YXRpb247XG4gICAgICAgIGludGVuc2l0eVx0PSAxLjAgLSBjbGFtcChpbnRlbnNpdHksIDAuMCwgMS4wKTtcblxuICAgICAgICB2ZWMzIG5vcm1hbFx0PSB2ZWMzKHZOb3JtYWwueCwgdk5vcm1hbC55LCBhYnModk5vcm1hbC56KSk7XG4gICAgICAgIGZsb2F0IGFuZ2xlSW50ZW5zaXR5XHQ9IHBvdyhkb3Qobm9ybWFsLCB2ZWMzKDAuMCwgMC4wLCAxLjApKSwgYW5nbGVQb3dlcik7XG4gICAgICAgIGludGVuc2l0eVx0PSBpbnRlbnNpdHkgKiBhbmdsZUludGVuc2l0eSAqIG9wYWNpdHk7XG5cbiAgICAgICAgZ2xfRnJhZ0NvbG9yXHQ9IHZlYzQobGlnaHRDb2xvciwgaW50ZW5zaXR5KTtcbiAgICAgIH1gO1xuXG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuU2hhZGVyTWF0ZXJpYWwoe1xuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgYXR0ZW51YXRpb246IHtcbiAgICAgICAgICB0eXBlOiAnZicsXG4gICAgICAgICAgdmFsdWU6IDgwMC4wLFxuICAgICAgICB9LFxuICAgICAgICBhbmdsZVBvd2VyOiB7XG4gICAgICAgICAgdHlwZTogJ2YnLFxuICAgICAgICAgIHZhbHVlOiAyLFxuICAgICAgICB9LFxuICAgICAgICBzcG90UG9zaXRpb246IHtcbiAgICAgICAgICB0eXBlOiAndjMnLFxuICAgICAgICAgIHZhbHVlOiBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgbGlnaHRDb2xvcjoge1xuICAgICAgICAgIHR5cGU6ICdjJyxcbiAgICAgICAgICB2YWx1ZTogbmV3IFRIUkVFLkNvbG9yKCd3aGl0ZScpLFxuICAgICAgICB9LFxuICAgICAgICBvcGFjaXR5OiB7XG4gICAgICAgICAgdHlwZTogJ2YnLFxuICAgICAgICAgIHZhbHVlOiAxLjAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdmVydGV4U2hhZGVyLFxuICAgICAgZnJhZ21lbnRTaGFkZXIsXG4gICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1hdGVyaWFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVNwb3RMaWdodEJlYW0oKSB7XG4gICAgaWYgKHRoaXMuc3BvdExpZ2h0QmVhbSkge1xuICAgICAgdGhpcy5zcG90bGlnaHRHcm91cC5yZW1vdmUodGhpcy5zcG90TGlnaHRCZWFtKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHNldCB0aGUgY29ycmVjdCBhbmdsZSBmcm9tIHRoZSBwcm9maWxlXG4gICAgY29uc3QgYmVhbUFuZ2xlRGVncmVlcyA9IDE0O1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkN5bGluZGVyR2VvbWV0cnkoMC4xLCBiZWFtQW5nbGVEZWdyZWVzICogMS4yLCAxMDAsIDY0LCAyMCwgZmFsc2UpO1xuICAgIGdlb21ldHJ5LmFwcGx5TWF0cml4NChuZXcgVEhSRUUuTWF0cml4NCgpLm1ha2VUcmFuc2xhdGlvbigwLCAtZ2VvbWV0cnkucGFyYW1ldGVycy5oZWlnaHQgLyAyLCAwKSk7XG4gICAgZ2VvbWV0cnkuYXBwbHlNYXRyaXg0KG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZVJvdGF0aW9uWCgtTWF0aC5QSSAvIDIpKTtcblxuICAgIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsID0gdGhpcy5hdG1vc3BoZXJlTWF0KCk7XG4gICAgdGhpcy5zcG90TGlnaHRCZWFtID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHRoaXMuYXRtb3NwaGVyZU1hdGVyaWFsKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ucG9zaXRpb24uc2V0KDAsIC0wLjAyLCAwKTtcbiAgICB0aGlzLnNwb3RMaWdodEJlYW0ucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5jYXN0U2hhZG93ID0gZmFsc2U7XG5cbiAgICB0aGlzLnNwb3RsaWdodEdyb3VwLmFkZCh0aGlzLnNwb3RMaWdodEJlYW0pO1xuICAgIHRoaXMuc3BvdExpZ2h0QmVhbS5yb3RhdGlvbi54ID0gTWF0aC5QSSAvIDI7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuc2VsZWN0ZWRNYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgdGhpcy5hdG1vc3BoZXJlTWF0ZXJpYWwuZGlzcG9zZSgpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,124 @@
1
+ import { forkJoin } from 'rxjs';
2
+ import { map } from 'rxjs/operators';
3
+ import * as THREE from 'three';
4
+ import { FixtureCapabilityType } from '../../models/fixture-capability';
5
+ import { Fixture3d } from './fixture-3d';
6
+ export class MovingHead3d extends Fixture3d {
7
+ createObjects() {
8
+ super.createObjects();
9
+ this.material = new THREE.MeshLambertMaterial({
10
+ color: 0x0d0d0d,
11
+ emissive: 0x0d0d0d,
12
+ });
13
+ this.socket.material = this.material;
14
+ this.arm.material = this.material;
15
+ this.head.material = this.material;
16
+ // Add the head
17
+ this.head.scale.multiplyScalar(0.9);
18
+ this.head.position.set(-0.1, 0, 0);
19
+ const headPivotGroup = new THREE.Object3D();
20
+ headPivotGroup.add(this.head);
21
+ this.headGroup.add(headPivotGroup);
22
+ this.headGroup.add(this.spotlightGroup);
23
+ // Add the arm
24
+ this.armGroup.add(this.headGroup);
25
+ this.headGroup.position.set(0, -0.6, 0);
26
+ this.armGroup.add(this.arm);
27
+ // Add the socket
28
+ this.objectGroup.add(this.armGroup);
29
+ this.objectGroup.add(this.socket);
30
+ this.socket.position.set(0, 1.2, 0);
31
+ // A moving head has about 32 cm in width
32
+ this.objectGroup.scale.multiplyScalar(9);
33
+ this.scene.add(this.objectGroup);
34
+ this.isLoaded = true;
35
+ }
36
+ constructor(fixtureService, previewMeshService, fixture, scene) {
37
+ super(fixtureService, fixture, scene);
38
+ this.headGroup = new THREE.Object3D();
39
+ this.armGroup = new THREE.Object3D();
40
+ this.objectGroup = new THREE.Object3D();
41
+ forkJoin([
42
+ previewMeshService.getMesh('moving_head_socket'),
43
+ previewMeshService.getMesh('moving_head_arm'),
44
+ previewMeshService.getMesh('moving_head_head'),
45
+ ])
46
+ .pipe(map(([socket, arm, head]) => {
47
+ this.socket = socket;
48
+ this.arm = arm;
49
+ this.head = head;
50
+ this.createObjects();
51
+ }))
52
+ .subscribe();
53
+ }
54
+ getObject() {
55
+ return this.objectGroup;
56
+ }
57
+ updatePreview(channelValues, masterDimmerValue) {
58
+ if (!this.isLoaded) {
59
+ return;
60
+ }
61
+ super.updatePreview(channelValues, masterDimmerValue);
62
+ // Apply default settings
63
+ let panStart = 0;
64
+ let panEnd = 255;
65
+ let tiltStart = 0;
66
+ let tiltEnd = 255;
67
+ this.pan = 0;
68
+ this.tilt = 0;
69
+ // Apply the known property values
70
+ for (const channelValue of channelValues) {
71
+ const channel = this.fixtureService.getChannelByName(this.fixture, channelValue.channelName);
72
+ const capability = this.getCapabilityInValue(channel, channelValue.value);
73
+ if (capability) {
74
+ switch (capability.capability.type) {
75
+ case FixtureCapabilityType.Pan: {
76
+ panStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
77
+ panEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 540;
78
+ this.pan = channelValue.value / channel.maxValue;
79
+ break;
80
+ }
81
+ case FixtureCapabilityType.Tilt: {
82
+ tiltStart = this.fixtureService.getRotationAngleDeg(capability.capability.angleStart) || 0;
83
+ tiltEnd = this.fixtureService.getRotationAngleDeg(capability.capability.angleEnd) || 2700;
84
+ this.tilt = channelValue.value / channel.maxValue;
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ }
90
+ this.updatePosition(this.objectGroup);
91
+ // calculate the y/x rotation in radiants based on pan/tilt (0-1) respecting the max pan/tilt
92
+ this.armGroup.rotation.y = THREE.MathUtils.degToRad(panEnd * this.pan + panStart) - THREE.MathUtils.degToRad(panEnd / 2);
93
+ this.headGroup.rotation.x = THREE.MathUtils.degToRad(tiltEnd * this.tilt + tiltStart) - THREE.MathUtils.degToRad(tiltEnd / 2);
94
+ // Update the angle (only on change, because it's expensive)
95
+ // TODO update the correct angle from the profile
96
+ const beamAngleDregrees = 14;
97
+ if (this.lastBeamAngleDegrees !== beamAngleDregrees) {
98
+ this.spotLight.angle = THREE.MathUtils.degToRad(beamAngleDregrees);
99
+ this.createSpotLightBeam();
100
+ this.lastBeamAngleDegrees = beamAngleDregrees;
101
+ }
102
+ // Update the material
103
+ if (this.lastSelected !== this.isSelected) {
104
+ if (this.isSelected) {
105
+ this.socket.material = this.selectedMaterial;
106
+ this.arm.material = this.selectedMaterial;
107
+ this.head.material = this.selectedMaterial;
108
+ }
109
+ else {
110
+ this.socket.material = this.material;
111
+ this.arm.material = this.material;
112
+ this.head.material = this.material;
113
+ }
114
+ this.lastSelected = this.isSelected;
115
+ }
116
+ // this.spotLightHelper.update();
117
+ }
118
+ destroy() {
119
+ this.scene.remove(this.objectGroup);
120
+ this.material.dispose();
121
+ this.spotLightHelper.dispose();
122
+ }
123
+ }
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nLWhlYWQtM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ25lci9zcmMvbGliL3ByZXZpZXcvbW9kZWxzL21vdmluZy1oZWFkLTNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRS9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBSXhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBaUIvQixhQUFhO1FBQ3JCLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQixJQUFJLENBQUMsUUFBZ0IsR0FBRyxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQztZQUNyRCxLQUFLLEVBQUUsUUFBUTtZQUNmLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRW5DLGVBQWU7UUFDZixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLGNBQWMs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QUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO2dCQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDN0MsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDckMsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN0QyxDQUFDO1FBRUQsaUNBQWlDO0lBQ25DLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZSB9IGZyb20gJy4uLy4uL21vZGVscy9jYWNoZWQtZml4dHVyZSc7XG5pbXBvcnQgeyBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsVmFsdWUgfSBmcm9tICcuLi8uLi9tb2RlbHMvZml4dHVyZS1jaGFubmVsLXZhbHVlJztcbmltcG9ydCB7IEZpeHR1cmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZml4dHVyZS5zZXJ2aWNlJztcbmltcG9ydCB7IFByZXZpZXdNZXNoU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ByZXZpZXctbWVzaC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpeHR1cmUzZCB9IGZyb20gJy4vZml4dHVyZS0zZCc7XG5cbmV4cG9ydCBjbGFzcyBNb3ZpbmdIZWFkM2QgZXh0ZW5kcyBGaXh0dXJlM2Qge1xuICBwcml2YXRlIHBhbjogbnVtYmVyO1xuICBwcml2YXRlIHRpbHQ6IG51bWJlcjtcblxuICBwcml2YXRlIHNvY2tldDogVEhSRUUuTWVzaDtcbiAgcHJpdmF0ZSBhcm06IFRIUkVFLk1lc2g7XG4gIHByaXZhdGUgaGVhZDogVEhSRUUuTWVzaDtcblxuICBwcml2YXRlIGhlYWRHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBhcm1Hcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcbiAgcHJpdmF0ZSBvYmplY3RHcm91cDogVEhSRUUuT2JqZWN0M0QgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcblxuICBwcml2YXRlIGxhc3RCZWFtQW5nbGVEZWdyZWVzOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFNlbGVjdGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgbWF0ZXJpYWw6IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsO1xuXG4gIHByb3RlY3RlZCBjcmVhdGVPYmplY3RzKCkge1xuICAgIHN1cGVyLmNyZWF0ZU9iamVjdHMoKTtcblxuICAgICh0aGlzLm1hdGVyaWFsIGFzIGFueSkgPSBuZXcgVEhSRUUuTWVzaExhbWJlcnRNYXRlcmlhbCh7XG4gICAgICBjb2xvcjogMHgwZDBkMGQsXG4gICAgICBlbWlzc2l2ZTogMHgwZDBkMGQsXG4gICAgfSk7XG5cbiAgICB0aGlzLnNvY2tldC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG4gICAgdGhpcy5hcm0ubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgIHRoaXMuaGVhZC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cbiAgICAvLyBBZGQgdGhlIGhlYWRcbiAgICB0aGlzLmhlYWQuc2NhbGUubXVsdGlwbHlTY2FsYXIoMC45KTtcbiAgICB0aGlzLmhlYWQucG9zaXRpb24uc2V0KC0wLjEsIDAsIDApO1xuICAgIGNvbnN0IGhlYWRQaXZvdEdyb3VwID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG4gICAgaGVhZFBpdm90R3JvdXAuYWRkKHRoaXMuaGVhZCk7XG4gICAgdGhpcy5oZWFkR3JvdXAuYWRkKGhlYWRQaXZvdEdyb3VwKTtcblxuICAgIHRoaXMuaGVhZEdyb3VwLmFkZCh0aGlzLnNwb3RsaWdodEdyb3VwKTtcblxuICAgIC8vIEFkZCB0aGUgYXJtXG4gICAgdGhpcy5hcm1Hcm91cC5hZGQodGhpcy5oZWFkR3JvdXApO1xuICAgIHRoaXMuaGVhZEdyb3VwLnBvc2l0aW9uLnNldCgwLCAtMC42LCAwKTtcbiAgICB0aGlzLmFybUdyb3VwLmFkZCh0aGlzLmFybSk7XG5cbiAgICAvLyBBZGQgdGhlIHNvY2tldFxuICAgIHRoaXMub2JqZWN0R3JvdXAuYWRkKHRoaXMuYXJtR3JvdXApO1xuICAgIHRoaXMub2JqZWN0R3JvdXAuYWRkKHRoaXMuc29ja2V0KTtcbiAgICB0aGlzLnNvY2tldC5wb3NpdGlvbi5zZXQoMCwgMS4yLCAwKTtcblxuICAgIC8vIEEgbW92aW5nIGhlYWQgaGFzIGFib3V0IDMyIGNtIGluIHdpZHRoXG4gICAgdGhpcy5vYmplY3RHcm91cC5zY2FsZS5tdWx0aXBseVNjYWxhcig5KTtcblxuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMub2JqZWN0R3JvdXApO1xuXG4gICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaXh0dXJlU2VydmljZTogRml4dHVyZVNlcnZpY2UsIHByZXZpZXdNZXNoU2VydmljZTogUHJldmlld01lc2hTZXJ2aWNlLCBmaXh0dXJlOiBDYWNoZWRGaXh0dXJlLCBzY2VuZTogYW55KSB7XG4gICAgc3VwZXIoZml4dHVyZVNlcnZpY2UsIGZpeHR1cmUsIHNjZW5lKTtcblxuICAgIGZvcmtKb2luKFtcbiAgICAgIHByZXZpZXdNZXNoU2VydmljZS5nZXRNZXNoKCdtb3ZpbmdfaGVhZF9zb2NrZXQnKSxcbiAgICAgIHByZXZpZXdNZXNoU2VydmljZS5nZXRNZXNoKCdtb3ZpbmdfaGVhZF9hcm0nKSxcbiAgICAgIHByZXZpZXdNZXNoU2VydmljZS5nZXRNZXNoKCdtb3ZpbmdfaGVhZF9oZWFkJyksXG4gICAgXSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKFtzb2NrZXQsIGFybSwgaGVhZF0pID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgICB0aGlzLmFybSA9IGFybTtcbiAgICAgICAgICB0aGlzLmhlYWQgPSBoZWFkO1xuXG4gICAgICAgICAgdGhpcy5jcmVhdGVPYmplY3RzKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0T2JqZWN0KCk6IFRIUkVFLk9iamVjdDNEIHtcbiAgICByZXR1cm4gdGhpcy5vYmplY3RHcm91cDtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVQcmV2aWV3KGNoYW5uZWxWYWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSwgbWFzdGVyRGltbWVyVmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN1cGVyLnVwZGF0ZVByZXZpZXcoY2hhbm5lbFZhbHVlcywgbWFzdGVyRGltbWVyVmFsdWUpO1xuXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBzZXR0aW5nc1xuICAgIGxldCBwYW5TdGFydCA9IDA7XG4gICAgbGV0IHBhbkVuZCA9IDI1NTtcblxuICAgIGxldCB0aWx0U3RhcnQgPSAwO1xuICAgIGxldCB0aWx0RW5kID0gMjU1O1xuXG4gICAgdGhpcy5wYW4gPSAwO1xuICAgIHRoaXMudGlsdCA9IDA7XG5cbiAgICAvLyBBcHBseSB0aGUga25vd24gcHJvcGVydHkgdmFsdWVzXG4gICAgZm9yIChjb25zdCBjaGFubmVsVmFsdWUgb2YgY2hhbm5lbFZhbHVlcykge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Q2hhbm5lbEJ5TmFtZSh0aGlzLmZpeHR1cmUsIGNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSk7XG4gICAgICBjb25zdCBjYXBhYmlsaXR5ID0gdGhpcy5nZXRDYXBhYmlsaXR5SW5WYWx1ZShjaGFubmVsLCBjaGFubmVsVmFsdWUudmFsdWUpO1xuICAgICAgaWYgKGNhcGFiaWxpdHkpIHtcbiAgICAgICAgc3dpdGNoIChjYXBhYmlsaXR5LmNhcGFiaWxpdHkudHlwZSkge1xuICAgICAgICAgIGNhc2UgRml4dHVyZUNhcGFiaWxpdHlUeXBlLlBhbjoge1xuICAgICAgICAgICAgcGFuU3RhcnQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFJvdGF0aW9uQW5nbGVEZWcoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmFuZ2xlU3RhcnQpIHx8IDA7XG4gICAgICAgICAgICBwYW5FbmQgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmdldFJvdGF0aW9uQW5nbGVEZWcoY2FwYWJpbGl0eS5jYXBhYmlsaXR5LmFuZ2xlRW5kKSB8fCA1NDA7XG4gICAgICAgICAgICB0aGlzLnBhbiA9IGNoYW5uZWxWYWx1ZS52YWx1ZSAvIGNoYW5uZWwubWF4VmFsdWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUuVGlsdDoge1xuICAgICAgICAgICAgdGlsdFN0YXJ0ID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRSb3RhdGlvbkFuZ2xlRGVnKGNhcGFiaWxpdHkuY2FwYWJpbGl0eS5hbmdsZVN0YXJ0KSB8fCAwO1xuICAgICAgICAgICAgdGlsdEVuZCA9IHRoaXMuZml4dHVyZVNlcnZpY2UuZ2V0Um90YXRpb25BbmdsZURlZyhjYXBhYmlsaXR5LmNhcGFiaWxpdHkuYW5nbGVFbmQpIHx8IDI3MDA7XG4gICAgICAgICAgICB0aGlzLnRpbHQgPSBjaGFubmVsVmFsdWUudmFsdWUgLyBjaGFubmVsLm1heFZhbHVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy51cGRhdGVQb3NpdGlvbih0aGlzLm9iamVjdEdyb3VwKTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgeS94IHJvdGF0aW9uIGluIHJhZGlhbnRzIGJhc2VkIG9uIHBhbi90aWx0ICgwLTEpIHJlc3BlY3RpbmcgdGhlIG1heCBwYW4vdGlsdFxuICAgIHRoaXMuYXJtR3JvdXAucm90YXRpb24ueSA9IFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChwYW5FbmQgKiB0aGlzLnBhbiArIHBhblN0YXJ0KSAtIFRIUkVFLk1hdGhVdGlscy5kZWdUb1JhZChwYW5FbmQgLyAyKTtcbiAgICB0aGlzLmhlYWRHcm91cC5yb3RhdGlvbi54ID0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRpbHRFbmQgKiB0aGlzLnRpbHQgKyB0aWx0U3RhcnQpIC0gVEhSRUUuTWF0aFV0aWxzLmRlZ1RvUmFkKHRpbHRFbmQgLyAyKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgYW5nbGUgKG9ubHkgb24gY2hhbmdlLCBiZWNhdXNlIGl0J3MgZXhwZW5zaXZlKVxuICAgIC8vIFRPRE8gdXBkYXRlIHRoZSBjb3JyZWN0IGFuZ2xlIGZyb20gdGhlIHByb2ZpbGVcbiAgICBjb25zdCBiZWFtQW5nbGVEcmVncmVlcyA9IDE0O1xuICAgIGlmICh0aGlzLmxhc3RCZWFtQW5nbGVEZWdyZWVzICE9PSBiZWFtQW5nbGVEcmVncmVlcykge1xuICAgICAgdGhpcy5zcG90TGlnaHQuYW5nbGUgPSBUSFJFRS5NYXRoVXRpbHMuZGVnVG9SYWQoYmVhbUFuZ2xlRHJlZ3JlZXMpO1xuICAgICAgdGhpcy5jcmVhdGVTcG90TGlnaHRCZWFtKCk7XG4gICAgICB0aGlzLmxhc3RCZWFtQW5nbGVEZWdyZWVzID0gYmVhbUFuZ2xlRHJlZ3JlZXM7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSBtYXRlcmlhbFxuICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZCAhPT0gdGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc29ja2V0Lm1hdGVyaWFsID0gdGhpcy5zZWxlY3RlZE1hdGVyaWFsO1xuICAgICAgICB0aGlzLmFybS5tYXRlcmlhbCA9IHRoaXMuc2VsZWN0ZWRNYXRlcmlhbDtcbiAgICAgICAgdGhpcy5oZWFkLm1hdGVyaWFsID0gdGhpcy5zZWxlY3RlZE1hdGVyaWFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQubWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuICAgICAgICB0aGlzLmFybS5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG4gICAgICAgIHRoaXMuaGVhZC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubGFzdFNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkO1xuICAgIH1cblxuICAgIC8vIHRoaXMuc3BvdExpZ2h0SGVscGVyLnVwZGF0ZSgpO1xuICB9XG5cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnNjZW5lLnJlbW92ZSh0aGlzLm9iamVjdEdyb3VwKTtcbiAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwb3RMaWdodEhlbHBlci5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==