@rocketshow/designer 1.32.0 → 1.33.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 (339) hide show
  1. package/esm2022/lib/array-sort-pipe.mjs +30 -0
  2. package/esm2022/lib/designer.component.mjs +605 -0
  3. package/esm2022/lib/designer.module.mjs +183 -0
  4. package/esm2022/lib/designer.service.mjs +14 -0
  5. package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +569 -0
  6. package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
  7. package/esm2022/lib/effect/effect.component.mjs +174 -0
  8. package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
  9. package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
  10. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
  11. package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
  12. package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
  13. package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
  14. package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
  15. package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +160 -0
  16. package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
  17. package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
  18. package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
  19. package/esm2022/lib/fixture/fixture.component.mjs +138 -0
  20. package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
  21. package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +589 -0
  22. package/esm2022/lib/intro/intro.component.mjs +95 -0
  23. package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
  24. package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
  25. package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
  26. package/esm2022/lib/models/cached-fixture.mjs +6 -0
  27. package/esm2022/lib/models/color.mjs +8 -0
  28. package/esm2022/lib/models/composition.mjs +46 -0
  29. package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
  30. package/esm2022/lib/models/effect-curve.mjs +69 -0
  31. package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
  32. package/esm2022/lib/models/effect.mjs +12 -0
  33. package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
  34. package/esm2022/lib/models/fixture-capability.mjs +84 -0
  35. package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
  36. package/esm2022/lib/models/fixture-channel.mjs +24 -0
  37. package/esm2022/lib/models/fixture-mode.mjs +14 -0
  38. package/esm2022/lib/models/fixture-profile.mjs +70 -0
  39. package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
  40. package/esm2022/lib/models/fixture-wheel.mjs +15 -0
  41. package/esm2022/lib/models/fixture.mjs +40 -0
  42. package/esm2022/lib/models/preset-region-scene.mjs +8 -0
  43. package/esm2022/lib/models/preset.mjs +56 -0
  44. package/esm2022/lib/models/project.mjs +68 -0
  45. package/esm2022/lib/models/scene-playback-region.mjs +11 -0
  46. package/esm2022/lib/models/scene.mjs +27 -0
  47. package/esm2022/lib/models/universe.mjs +11 -0
  48. package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
  49. package/esm2022/lib/preset/preset.component.mjs +131 -0
  50. package/esm2022/lib/preview/models/color-changer-3d.mjs +167 -0
  51. package/esm2022/lib/preview/models/fixture-3d.mjs +150 -0
  52. package/esm2022/lib/preview/models/moving-head-3d.mjs +243 -0
  53. package/esm2022/lib/preview/preview.component.mjs +212 -0
  54. package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
  55. package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
  56. package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
  57. package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
  58. package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
  59. package/esm2022/lib/scene/scene.component.mjs +110 -0
  60. package/esm2022/lib/services/animation.service.mjs +16 -0
  61. package/esm2022/lib/services/config.service.mjs +27 -0
  62. package/esm2022/lib/services/effect.service.mjs +14 -0
  63. package/esm2022/lib/services/error-dialog.service.mjs +39 -0
  64. package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
  65. package/esm2022/lib/services/fixture.service.mjs +431 -0
  66. package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
  67. package/esm2022/lib/services/intro.service.mjs +140 -0
  68. package/esm2022/lib/services/preset.service.mjs +400 -0
  69. package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
  70. package/esm2022/lib/services/preview.service.mjs +496 -0
  71. package/esm2022/lib/services/project-load.service.mjs +149 -0
  72. package/esm2022/lib/services/project.service.mjs +97 -0
  73. package/esm2022/lib/services/scene.service.mjs +164 -0
  74. package/esm2022/lib/services/timeline.service.mjs +726 -0
  75. package/esm2022/lib/services/universe.service.mjs +23 -0
  76. package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
  77. package/esm2022/lib/services/user.service.mjs +89 -0
  78. package/esm2022/lib/services/uuid.service.mjs +23 -0
  79. package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
  80. package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +334 -0
  81. package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
  82. package/esm2022/lib/timeline/timeline.component.mjs +418 -0
  83. package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
  84. package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
  85. package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
  86. package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
  87. package/esm2022/public_api.mjs +7 -0
  88. package/esm2022/rocketshow-designer.mjs +5 -0
  89. package/fesm2022/rocketshow-designer.mjs +10626 -0
  90. package/fesm2022/rocketshow-designer.mjs.map +1 -0
  91. package/index.d.ts +5 -0
  92. package/lib/array-sort-pipe.d.ts +3 -0
  93. package/lib/designer.component.d.ts +15 -12
  94. package/lib/designer.module.d.ts +54 -0
  95. package/lib/designer.service.d.ts +3 -0
  96. package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
  97. package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
  98. package/lib/effect/effect.component.d.ts +3 -0
  99. package/lib/error-dialog/error-dialog.component.d.ts +3 -0
  100. package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
  101. package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
  102. package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
  103. package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
  104. package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
  105. package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
  106. package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
  107. package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
  108. package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
  109. package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
  110. package/lib/fixture/fixture.component.d.ts +3 -0
  111. package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
  112. package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
  113. package/lib/intro/intro.component.d.ts +3 -0
  114. package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
  115. package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
  116. package/lib/preset/preset.component.d.ts +3 -0
  117. package/lib/preview/preview.component.d.ts +4 -4
  118. package/lib/project/project-browser/project-browser.component.d.ts +3 -0
  119. package/lib/project/project-import/project-import.component.d.ts +3 -0
  120. package/lib/project/project-save/project-save.component.d.ts +3 -0
  121. package/lib/project/project-share/project-share.component.d.ts +3 -0
  122. package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
  123. package/lib/scene/scene.component.d.ts +3 -0
  124. package/lib/services/animation.service.d.ts +3 -0
  125. package/lib/services/config.service.d.ts +3 -0
  126. package/lib/services/effect.service.d.ts +3 -0
  127. package/lib/services/error-dialog.service.d.ts +3 -0
  128. package/lib/services/fixture-pool.service.d.ts +3 -0
  129. package/lib/services/fixture.service.d.ts +3 -0
  130. package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
  131. package/lib/services/intro.service.d.ts +3 -0
  132. package/lib/services/preset.service.d.ts +3 -0
  133. package/lib/services/preview-mesh.service.d.ts +3 -0
  134. package/lib/services/preview.service.d.ts +4 -0
  135. package/lib/services/project-load.service.d.ts +3 -0
  136. package/lib/services/project.service.d.ts +3 -0
  137. package/lib/services/scene.service.d.ts +3 -0
  138. package/lib/services/timeline.service.d.ts +4 -1
  139. package/lib/services/universe.service.d.ts +3 -0
  140. package/lib/services/user-ensure-login.service.d.ts +3 -0
  141. package/lib/services/user.service.d.ts +3 -0
  142. package/lib/services/uuid.service.d.ts +3 -0
  143. package/lib/services/warning-dialog.service.d.ts +3 -0
  144. package/lib/timeline/composition-settings/composition-settings.component.d.ts +3 -0
  145. package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
  146. package/lib/timeline/timeline.component.d.ts +3 -0
  147. package/lib/user/user-login/user-login.component.d.ts +3 -0
  148. package/lib/user/user-register/user-register.component.d.ts +3 -0
  149. package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
  150. package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
  151. package/package.json +20 -22
  152. package/rocketshow-designer-1.33.0.tgz +0 -0
  153. package/bundles/rocketshow-designer.umd.js +0 -9966
  154. package/bundles/rocketshow-designer.umd.js.map +0 -1
  155. package/bundles/rocketshow-designer.umd.min.js +0 -17
  156. package/bundles/rocketshow-designer.umd.min.js.map +0 -1
  157. package/esm2015/lib/array-sort-pipe.js +0 -28
  158. package/esm2015/lib/designer.component.js +0 -411
  159. package/esm2015/lib/designer.module.js +0 -117
  160. package/esm2015/lib/designer.service.js +0 -16
  161. package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
  162. package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
  163. package/esm2015/lib/effect/effect.component.js +0 -73
  164. package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
  165. package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
  166. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
  167. package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
  168. package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
  169. package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
  170. package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
  171. package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
  172. package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
  173. package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
  174. package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
  175. package/esm2015/lib/fixture/fixture.component.js +0 -70
  176. package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
  177. package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
  178. package/esm2015/lib/intro/intro.component.js +0 -25
  179. package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
  180. package/esm2015/lib/models/cached-fixture-capability.js +0 -9
  181. package/esm2015/lib/models/cached-fixture-channel.js +0 -7
  182. package/esm2015/lib/models/cached-fixture.js +0 -6
  183. package/esm2015/lib/models/color.js +0 -8
  184. package/esm2015/lib/models/composition.js +0 -46
  185. package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
  186. package/esm2015/lib/models/effect-curve.js +0 -69
  187. package/esm2015/lib/models/effect-pan-tilt.js +0 -19
  188. package/esm2015/lib/models/effect.js +0 -12
  189. package/esm2015/lib/models/fixture-capability-value.js +0 -15
  190. package/esm2015/lib/models/fixture-capability.js +0 -84
  191. package/esm2015/lib/models/fixture-channel-value.js +0 -11
  192. package/esm2015/lib/models/fixture-channel.js +0 -24
  193. package/esm2015/lib/models/fixture-mode.js +0 -14
  194. package/esm2015/lib/models/fixture-profile.js +0 -70
  195. package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
  196. package/esm2015/lib/models/fixture-wheel.js +0 -15
  197. package/esm2015/lib/models/fixture.js +0 -40
  198. package/esm2015/lib/models/preset-region-scene.js +0 -8
  199. package/esm2015/lib/models/preset.js +0 -56
  200. package/esm2015/lib/models/project.js +0 -68
  201. package/esm2015/lib/models/scene-playback-region.js +0 -11
  202. package/esm2015/lib/models/scene.js +0 -27
  203. package/esm2015/lib/models/universe.js +0 -11
  204. package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
  205. package/esm2015/lib/preset/preset.component.js +0 -85
  206. package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
  207. package/esm2015/lib/preview/models/fixture-3d.js +0 -150
  208. package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
  209. package/esm2015/lib/preview/preview.component.js +0 -242
  210. package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
  211. package/esm2015/lib/project/project-import/project-import.component.js +0 -89
  212. package/esm2015/lib/project/project-save/project-save.component.js +0 -105
  213. package/esm2015/lib/project/project-share/project-share.component.js +0 -43
  214. package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
  215. package/esm2015/lib/scene/scene.component.js +0 -56
  216. package/esm2015/lib/services/animation.service.js +0 -17
  217. package/esm2015/lib/services/config.service.js +0 -28
  218. package/esm2015/lib/services/effect.service.js +0 -16
  219. package/esm2015/lib/services/error-dialog.service.js +0 -44
  220. package/esm2015/lib/services/fixture-pool.service.js +0 -34
  221. package/esm2015/lib/services/fixture.service.js +0 -443
  222. package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
  223. package/esm2015/lib/services/intro.service.js +0 -144
  224. package/esm2015/lib/services/preset.service.js +0 -416
  225. package/esm2015/lib/services/preview-mesh.service.js +0 -58
  226. package/esm2015/lib/services/preview.service.js +0 -500
  227. package/esm2015/lib/services/project-load.service.js +0 -171
  228. package/esm2015/lib/services/project.service.js +0 -113
  229. package/esm2015/lib/services/scene.service.js +0 -174
  230. package/esm2015/lib/services/timeline.service.js +0 -738
  231. package/esm2015/lib/services/universe.service.js +0 -24
  232. package/esm2015/lib/services/user-ensure-login.service.js +0 -44
  233. package/esm2015/lib/services/user.service.js +0 -93
  234. package/esm2015/lib/services/uuid.service.js +0 -25
  235. package/esm2015/lib/services/warning-dialog.service.js +0 -43
  236. package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
  237. package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
  238. package/esm2015/lib/timeline/timeline.component.js +0 -239
  239. package/esm2015/lib/user/user-login/user-login.component.js +0 -64
  240. package/esm2015/lib/user/user-register/user-register.component.js +0 -89
  241. package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
  242. package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
  243. package/esm2015/public_api.js +0 -7
  244. package/esm2015/rocketshow-designer.js +0 -61
  245. package/esm5/lib/array-sort-pipe.js +0 -31
  246. package/esm5/lib/designer.component.js +0 -468
  247. package/esm5/lib/designer.module.js +0 -120
  248. package/esm5/lib/designer.service.js +0 -17
  249. package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
  250. package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
  251. package/esm5/lib/effect/effect.component.js +0 -75
  252. package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
  253. package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
  254. package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
  255. package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
  256. package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
  257. package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
  258. package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
  259. package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
  260. package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
  261. package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
  262. package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
  263. package/esm5/lib/fixture/fixture.component.js +0 -71
  264. package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
  265. package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
  266. package/esm5/lib/intro/intro.component.js +0 -26
  267. package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
  268. package/esm5/lib/models/cached-fixture-capability.js +0 -11
  269. package/esm5/lib/models/cached-fixture-channel.js +0 -9
  270. package/esm5/lib/models/cached-fixture.js +0 -8
  271. package/esm5/lib/models/color.js +0 -10
  272. package/esm5/lib/models/composition.js +0 -60
  273. package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
  274. package/esm5/lib/models/effect-curve.js +0 -95
  275. package/esm5/lib/models/effect-pan-tilt.js +0 -24
  276. package/esm5/lib/models/effect.js +0 -14
  277. package/esm5/lib/models/fixture-capability-value.js +0 -17
  278. package/esm5/lib/models/fixture-capability.js +0 -86
  279. package/esm5/lib/models/fixture-channel-value.js +0 -13
  280. package/esm5/lib/models/fixture-channel.js +0 -38
  281. package/esm5/lib/models/fixture-mode.js +0 -16
  282. package/esm5/lib/models/fixture-profile.js +0 -114
  283. package/esm5/lib/models/fixture-wheel-slot.js +0 -28
  284. package/esm5/lib/models/fixture-wheel.js +0 -29
  285. package/esm5/lib/models/fixture.js +0 -42
  286. package/esm5/lib/models/preset-region-scene.js +0 -10
  287. package/esm5/lib/models/preset.js +0 -90
  288. package/esm5/lib/models/project.js +0 -122
  289. package/esm5/lib/models/scene-playback-region.js +0 -13
  290. package/esm5/lib/models/scene.js +0 -29
  291. package/esm5/lib/models/universe.js +0 -13
  292. package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
  293. package/esm5/lib/preset/preset.component.js +0 -86
  294. package/esm5/lib/preview/models/color-changer-3d.js +0 -194
  295. package/esm5/lib/preview/models/fixture-3d.js +0 -196
  296. package/esm5/lib/preview/models/moving-head-3d.js +0 -250
  297. package/esm5/lib/preview/preview.component.js +0 -280
  298. package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
  299. package/esm5/lib/project/project-import/project-import.component.js +0 -88
  300. package/esm5/lib/project/project-save/project-save.component.js +0 -120
  301. package/esm5/lib/project/project-share/project-share.component.js +0 -44
  302. package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
  303. package/esm5/lib/scene/scene.component.js +0 -57
  304. package/esm5/lib/services/animation.service.js +0 -18
  305. package/esm5/lib/services/config.service.js +0 -29
  306. package/esm5/lib/services/effect.service.js +0 -17
  307. package/esm5/lib/services/error-dialog.service.js +0 -46
  308. package/esm5/lib/services/fixture-pool.service.js +0 -36
  309. package/esm5/lib/services/fixture.service.js +0 -643
  310. package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
  311. package/esm5/lib/services/intro.service.js +0 -145
  312. package/esm5/lib/services/preset.service.js +0 -637
  313. package/esm5/lib/services/preview-mesh.service.js +0 -61
  314. package/esm5/lib/services/preview.service.js +0 -754
  315. package/esm5/lib/services/project-load.service.js +0 -185
  316. package/esm5/lib/services/project.service.js +0 -127
  317. package/esm5/lib/services/scene.service.js +0 -251
  318. package/esm5/lib/services/timeline.service.js +0 -845
  319. package/esm5/lib/services/universe.service.js +0 -36
  320. package/esm5/lib/services/user-ensure-login.service.js +0 -45
  321. package/esm5/lib/services/user.service.js +0 -95
  322. package/esm5/lib/services/uuid.service.js +0 -26
  323. package/esm5/lib/services/warning-dialog.service.js +0 -45
  324. package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
  325. package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
  326. package/esm5/lib/timeline/timeline.component.js +0 -243
  327. package/esm5/lib/user/user-login/user-login.component.js +0 -66
  328. package/esm5/lib/user/user-register/user-register.component.js +0 -91
  329. package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
  330. package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
  331. package/esm5/public_api.js +0 -7
  332. package/esm5/rocketshow-designer.js +0 -61
  333. package/fesm2015/rocketshow-designer.js +0 -7945
  334. package/fesm2015/rocketshow-designer.js.map +0 -1
  335. package/fesm5/rocketshow-designer.js +0 -9690
  336. package/fesm5/rocketshow-designer.js.map +0 -1
  337. package/rocketshow-designer-1.32.0.tgz +0 -0
  338. package/rocketshow-designer.d.ts +0 -60
  339. package/rocketshow-designer.metadata.json +0 -1
@@ -1,643 +0,0 @@
1
- import { __assign, __decorate, __metadata, __values } from "tslib";
2
- import { HttpClient } from '@angular/common/http';
3
- import { Injectable } from '@angular/core';
4
- import { TranslateService } from '@ngx-translate/core';
5
- import { ToastrService } from 'ngx-toastr';
6
- import { forkJoin, of } from 'rxjs';
7
- import { map } from 'rxjs/operators';
8
- import { CachedFixture } from '../models/cached-fixture';
9
- import { CachedFixtureCapability } from '../models/cached-fixture-capability';
10
- import { CachedFixtureChannel } from '../models/cached-fixture-channel';
11
- import { Color } from '../models/color';
12
- import { Fixture } from '../models/fixture';
13
- import { FixtureProfile } from '../models/fixture-profile';
14
- import { FixtureWheelSlotType } from '../models/fixture-wheel-slot';
15
- import { ProjectService } from './project.service';
16
- import { UuidService } from './uuid.service';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "@angular/common/http";
19
- import * as i2 from "./project.service";
20
- import * as i3 from "@ngx-translate/core";
21
- import * as i4 from "ngx-toastr";
22
- import * as i5 from "./uuid.service";
23
- var FixtureService = /** @class */ (function () {
24
- function FixtureService(http, projectService, translateService, toastrService, uuidService) {
25
- this.http = http;
26
- this.projectService = projectService;
27
- this.translateService = translateService;
28
- this.toastrService = toastrService;
29
- this.uuidService = uuidService;
30
- this.cachedFixtures = [];
31
- // is the side-tab settings currently selected?
32
- this.settingsSelection = false;
33
- this.selectedSettingsFixtures = [];
34
- }
35
- FixtureService.prototype.getFixtureByUuid = function (uuid) {
36
- var e_1, _a;
37
- try {
38
- for (var _b = __values(this.projectService.project.fixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
39
- var fixture = _c.value;
40
- if (fixture.uuid === uuid) {
41
- return fixture;
42
- }
43
- }
44
- }
45
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
46
- finally {
47
- try {
48
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
49
- }
50
- finally { if (e_1) throw e_1.error; }
51
- }
52
- };
53
- FixtureService.prototype.getCachedFixtureByUuid = function (uuid) {
54
- var e_2, _a;
55
- try {
56
- for (var _b = __values(this.cachedFixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
57
- var fixture = _c.value;
58
- if (fixture.fixture.uuid === uuid) {
59
- return fixture;
60
- }
61
- }
62
- }
63
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
64
- finally {
65
- try {
66
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
67
- }
68
- finally { if (e_2) throw e_2.error; }
69
- }
70
- };
71
- // Get all profiles to search for (only metadata)
72
- FixtureService.prototype.getSearchProfiles = function () {
73
- return this.http.get('fixtures').pipe(map(function (response) {
74
- var e_3, _a;
75
- var searchProfiles = [];
76
- try {
77
- for (var response_1 = __values(response), response_1_1 = response_1.next(); !response_1_1.done; response_1_1 = response_1.next()) {
78
- var profile = response_1_1.value;
79
- searchProfiles.push(new FixtureProfile(profile));
80
- }
81
- }
82
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
83
- finally {
84
- try {
85
- if (response_1_1 && !response_1_1.done && (_a = response_1.return)) _a.call(response_1);
86
- }
87
- finally { if (e_3) throw e_3.error; }
88
- }
89
- return searchProfiles;
90
- }));
91
- };
92
- FixtureService.prototype.getProfileByUuid = function (uuid) {
93
- var e_4, _a;
94
- try {
95
- for (var _b = __values(this.projectService.project.fixtureProfiles), _c = _b.next(); !_c.done; _c = _b.next()) {
96
- var fixtureProfile = _c.value;
97
- if (fixtureProfile.uuid === uuid) {
98
- return fixtureProfile;
99
- }
100
- }
101
- }
102
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
103
- finally {
104
- try {
105
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
106
- }
107
- finally { if (e_4) throw e_4.error; }
108
- }
109
- };
110
- FixtureService.prototype.loadProfileByUuid = function (uuid) {
111
- var _this = this;
112
- var loadedProfile = this.getProfileByUuid(uuid);
113
- if (loadedProfile) {
114
- // This profile is already loaded
115
- return of(undefined);
116
- }
117
- // Load the metadata and the profile
118
- return forkJoin([this.http.get('fixtures?uuid=' + encodeURI(uuid)), this.http.get('fixture?uuid=' + encodeURI(uuid))]).pipe(map(function (result) {
119
- var mergedData = __assign(__assign({}, result[0][0]), result[1]);
120
- var fixtureProfile = new FixtureProfile(mergedData);
121
- _this.projectService.project.fixtureProfiles.push(fixtureProfile);
122
- }));
123
- };
124
- FixtureService.prototype.getRotationAngleDeg = function (value) {
125
- // convert a rotation angle value into degrees
126
- if (value.endsWith('deg')) {
127
- return Number.parseInt(value.replace('deg', ''));
128
- }
129
- else if (value.endsWith('%')) {
130
- var perc = Number.parseInt(value.replace('%', ''));
131
- return (perc / 100) * 360;
132
- }
133
- return undefined;
134
- };
135
- FixtureService.prototype.getWheelSlotColors = function (wheel, slotNumber) {
136
- var e_5, _a;
137
- var colors = [];
138
- var wheelSlots = this.getWheelSlots(wheel, slotNumber);
139
- try {
140
- for (var wheelSlots_1 = __values(wheelSlots), wheelSlots_1_1 = wheelSlots_1.next(); !wheelSlots_1_1.done; wheelSlots_1_1 = wheelSlots_1.next()) {
141
- var slot = wheelSlots_1_1.value;
142
- if (slot.colors && slot.colors.length > 0) {
143
- colors = colors.concat(slot.colors);
144
- }
145
- }
146
- }
147
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
148
- finally {
149
- try {
150
- if (wheelSlots_1_1 && !wheelSlots_1_1.done && (_a = wheelSlots_1.return)) _a.call(wheelSlots_1);
151
- }
152
- finally { if (e_5) throw e_5.error; }
153
- }
154
- return colors;
155
- };
156
- FixtureService.prototype.getMixedWheelSlotColor = function (wheel, slotNumber) {
157
- var e_6, _a;
158
- var colors = this.getWheelSlotColors(wheel, slotNumber);
159
- var colorsRgb = [];
160
- if (colors.length === 0) {
161
- return undefined;
162
- }
163
- try {
164
- for (var colors_1 = __values(colors), colors_1_1 = colors_1.next(); !colors_1_1.done; colors_1_1 = colors_1.next()) {
165
- var color = colors_1_1.value;
166
- colorsRgb.push(this.hexToRgb(color));
167
- }
168
- }
169
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
170
- finally {
171
- try {
172
- if (colors_1_1 && !colors_1_1.done && (_a = colors_1.return)) _a.call(colors_1);
173
- }
174
- finally { if (e_6) throw e_6.error; }
175
- }
176
- return this.mixColors(colorsRgb);
177
- };
178
- FixtureService.prototype.componentToHex = function (c) {
179
- var hex = c.toString(16);
180
- return hex.length === 1 ? '0' + hex : hex;
181
- };
182
- FixtureService.prototype.rgbToHex = function (r, g, b) {
183
- return '#' + this.componentToHex(r) + this.componentToHex(g) + this.componentToHex(b);
184
- };
185
- FixtureService.prototype.hexToRgb = function (hex) {
186
- // expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
187
- var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
188
- hex = hex.replace(shorthandRegex, function (m, r, g, b) {
189
- return r + r + g + g + b + b;
190
- });
191
- var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
192
- return result ? new Color(parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)) : null;
193
- };
194
- FixtureService.prototype.mixColors = function (colors) {
195
- var e_7, _a;
196
- // mix an array of rgb-colors containing r, g, b values to a new color
197
- var r = 0;
198
- var g = 0;
199
- var b = 0;
200
- try {
201
- for (var colors_2 = __values(colors), colors_2_1 = colors_2.next(); !colors_2_1.done; colors_2_1 = colors_2.next()) {
202
- var color = colors_2_1.value;
203
- r += color.red;
204
- g += color.green;
205
- b += color.blue;
206
- }
207
- }
208
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
209
- finally {
210
- try {
211
- if (colors_2_1 && !colors_2_1.done && (_a = colors_2.return)) _a.call(colors_2);
212
- }
213
- finally { if (e_7) throw e_7.error; }
214
- }
215
- r /= colors.length;
216
- g /= colors.length;
217
- b /= colors.length;
218
- return new Color(r, g, b);
219
- };
220
- FixtureService.prototype.wheelHasSlotType = function (wheel, slotType) {
221
- var e_8, _a;
222
- try {
223
- for (var _b = __values(wheel.slots), _c = _b.next(); !_c.done; _c = _b.next()) {
224
- var slot = _c.value;
225
- if (slot.type === slotType) {
226
- return true;
227
- }
228
- }
229
- }
230
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
231
- finally {
232
- try {
233
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
234
- }
235
- finally { if (e_8) throw e_8.error; }
236
- }
237
- return false;
238
- };
239
- FixtureService.prototype.getWheelByName = function (profile, wheelName) {
240
- for (var property in profile.wheels) {
241
- if (property === wheelName) {
242
- return profile.wheels[property];
243
- }
244
- }
245
- // wheel not found
246
- return undefined;
247
- };
248
- FixtureService.prototype.getWheelSlots = function (wheel, slotNumber) {
249
- // return one slot or two slots, if they are mixed (e.g. slor number 2.5 returns the slots 2 and 3)
250
- var slots = [];
251
- if (!wheel) {
252
- return slots;
253
- }
254
- if (slotNumber - Math.floor(slotNumber) > 0) {
255
- // two slots are set
256
- var number = Math.floor(slotNumber);
257
- slots.push(wheel.slots[number - 1]);
258
- if (number >= 0 && number < wheel.slots.length) {
259
- slots.push(wheel.slots[number]);
260
- }
261
- }
262
- else {
263
- // only one slot is set
264
- slots.push(wheel.slots[slotNumber - 1]);
265
- }
266
- return slots;
267
- };
268
- FixtureService.prototype.getModeByFixture = function (profile, fixture) {
269
- var e_9, _a;
270
- try {
271
- for (var _b = __values(profile.modes), _c = _b.next(); !_c.done; _c = _b.next()) {
272
- var mode = _c.value;
273
- if (mode.shortName) {
274
- if (mode.shortName === fixture.modeShortName) {
275
- return mode;
276
- }
277
- }
278
- else {
279
- if (mode.name === fixture.modeShortName) {
280
- return mode;
281
- }
282
- }
283
- }
284
- }
285
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
286
- finally {
287
- try {
288
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
289
- }
290
- finally { if (e_9) throw e_9.error; }
291
- }
292
- };
293
- FixtureService.prototype.getFixtureCapability = function (capability, channelName, profile) {
294
- var cachedFixtureCapability = new CachedFixtureCapability();
295
- cachedFixtureCapability.capability = capability;
296
- if (capability.slotNumber) {
297
- // there is a wheel connected to this capability
298
- if (typeof capability.wheel === 'string') {
299
- cachedFixtureCapability.wheelName = capability.wheel;
300
- }
301
- else if (Array.isArray(capability.wheel)) {
302
- cachedFixtureCapability.wheelName = capability.wheel[0];
303
- }
304
- else {
305
- cachedFixtureCapability.wheelName = channelName;
306
- }
307
- cachedFixtureCapability.wheel = this.getWheelByName(profile, cachedFixtureCapability.wheelName);
308
- cachedFixtureCapability.wheelSlots = this.getWheelSlots(cachedFixtureCapability.wheel, capability.slotNumber);
309
- cachedFixtureCapability.wheelIsColor = this.wheelHasSlotType(cachedFixtureCapability.wheel, FixtureWheelSlotType.Color);
310
- }
311
- if (cachedFixtureCapability.capability.dmxRange && cachedFixtureCapability.capability.dmxRange.length === 2) {
312
- cachedFixtureCapability.centerValue = Math.floor((cachedFixtureCapability.capability.dmxRange[0] + cachedFixtureCapability.capability.dmxRange[1]) / 2);
313
- }
314
- return cachedFixtureCapability;
315
- };
316
- FixtureService.prototype.getCapabilitiesByChannel = function (fixtureChannel, channelName, profile) {
317
- var e_10, _a;
318
- var capabilites = [];
319
- if (fixtureChannel.capability) {
320
- capabilites.push(this.getFixtureCapability(fixtureChannel.capability, channelName, profile));
321
- }
322
- else if (fixtureChannel.capabilities) {
323
- try {
324
- for (var _b = __values(fixtureChannel.capabilities), _c = _b.next(); !_c.done; _c = _b.next()) {
325
- var capability = _c.value;
326
- capabilites.push(this.getFixtureCapability(capability, channelName, profile));
327
- }
328
- }
329
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
330
- finally {
331
- try {
332
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
333
- }
334
- finally { if (e_10) throw e_10.error; }
335
- }
336
- }
337
- return capabilites;
338
- };
339
- FixtureService.prototype.getMaxValueByChannel = function (fixtureChannel) {
340
- return Math.pow(256, 1 + fixtureChannel.fineChannelAliases.length) - 1;
341
- };
342
- FixtureService.prototype.getDefaultValueByChannel = function (fixtureChannel) {
343
- if (!fixtureChannel.defaultValue) {
344
- return undefined;
345
- }
346
- if (isNaN(fixtureChannel.defaultValue) && fixtureChannel.defaultValue.endsWith('%')) {
347
- // percentage value
348
- var percentage = Number.parseInt(fixtureChannel.defaultValue.replace('%', ''));
349
- var maxValue = this.getMaxValueByChannel(fixtureChannel);
350
- return (maxValue / 100) * percentage;
351
- }
352
- else {
353
- // DMX value
354
- return Number.parseInt(fixtureChannel.defaultValue);
355
- }
356
- };
357
- FixtureService.prototype.getColorWheelByChannel = function (channel, profile) {
358
- var e_11, _a;
359
- try {
360
- for (var _b = __values(channel.capabilities), _c = _b.next(); !_c.done; _c = _b.next()) {
361
- var channelCapability = _c.value;
362
- if (channelCapability.wheelIsColor) {
363
- return channelCapability.wheel;
364
- }
365
- }
366
- }
367
- catch (e_11_1) { e_11 = { error: e_11_1 }; }
368
- finally {
369
- try {
370
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
371
- }
372
- finally { if (e_11) throw e_11.error; }
373
- }
374
- return undefined;
375
- };
376
- // private channelInList(channels: CachedFixtureChannel[], name: string): boolean {
377
- // for (let channel of channels) {
378
- // if (channel.channelName === name) {
379
- // return true;
380
- // }
381
- // }
382
- // return false;
383
- // }
384
- FixtureService.prototype.getChannelByName = function (fixture, channelName) {
385
- var e_12, _a;
386
- try {
387
- for (var _b = __values(fixture.channels), _c = _b.next(); !_c.done; _c = _b.next()) {
388
- var channel = _c.value;
389
- if ((channel.name && channel.name === channelName) ||
390
- (channel.channel && channel.channel.fineChannelAliases.indexOf(channelName) > -1)) {
391
- return channel;
392
- }
393
- }
394
- }
395
- catch (e_12_1) { e_12 = { error: e_12_1 }; }
396
- finally {
397
- try {
398
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
399
- }
400
- finally { if (e_12) throw e_12.error; }
401
- }
402
- return undefined;
403
- };
404
- FixtureService.prototype.getCachedChannels = function (profile, mode) {
405
- var e_13, _a, e_14, _b;
406
- var channels = [];
407
- if (!mode) {
408
- return channels;
409
- }
410
- try {
411
- for (var _c = __values(Object.keys(profile.availableChannels)), _d = _c.next(); !_d.done; _d = _c.next()) {
412
- var availableChannelName = _d.value;
413
- var availableChannel = profile.availableChannels[availableChannelName];
414
- try {
415
- for (var _e = (e_14 = void 0, __values(mode.channels)), _f = _e.next(); !_f.done; _f = _e.next()) {
416
- var channel = _f.value;
417
- // check for string channel. It can get creepy for matrix modes
418
- if (typeof channel === 'string') {
419
- var modeChannel = channel;
420
- // don't check the fine channels. only add the coarse channel.
421
- if (modeChannel === availableChannelName) {
422
- var cachedFixtureChannel = new CachedFixtureChannel();
423
- cachedFixtureChannel.channel = availableChannel;
424
- cachedFixtureChannel.name = availableChannelName;
425
- cachedFixtureChannel.capabilities = this.getCapabilitiesByChannel(cachedFixtureChannel.channel, availableChannelName, profile);
426
- var defaultValue = this.getDefaultValueByChannel(cachedFixtureChannel.channel);
427
- if (defaultValue) {
428
- cachedFixtureChannel.defaultValue = defaultValue;
429
- }
430
- cachedFixtureChannel.maxValue = this.getMaxValueByChannel(cachedFixtureChannel.channel);
431
- cachedFixtureChannel.colorWheel = this.getColorWheelByChannel(cachedFixtureChannel, profile);
432
- channels.push(cachedFixtureChannel);
433
- }
434
- }
435
- else {
436
- // null may be passed as a placeholder for an undefined channel
437
- channels.push(new CachedFixtureChannel());
438
- }
439
- }
440
- }
441
- catch (e_14_1) { e_14 = { error: e_14_1 }; }
442
- finally {
443
- try {
444
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
445
- }
446
- finally { if (e_14) throw e_14.error; }
447
- }
448
- }
449
- }
450
- catch (e_13_1) { e_13 = { error: e_13_1 }; }
451
- finally {
452
- try {
453
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
454
- }
455
- finally { if (e_13) throw e_13.error; }
456
- }
457
- return channels;
458
- };
459
- FixtureService.prototype.updateCachedFixtures = function () {
460
- var e_15, _a;
461
- // calculate some frequently used values as a cache to save cpu time
462
- // afterwards
463
- this.cachedFixtures = [];
464
- try {
465
- for (var _b = __values(this.projectService.project.fixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
466
- var fixture = _c.value;
467
- var cachedFixture = new CachedFixture();
468
- cachedFixture.fixture = fixture;
469
- cachedFixture.profile = this.getProfileByUuid(fixture.profileUuid);
470
- cachedFixture.mode = this.getModeByFixture(cachedFixture.profile, fixture);
471
- cachedFixture.channels = this.getCachedChannels(cachedFixture.profile, cachedFixture.mode);
472
- this.cachedFixtures.push(cachedFixture);
473
- }
474
- }
475
- catch (e_15_1) { e_15 = { error: e_15_1 }; }
476
- finally {
477
- try {
478
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
479
- }
480
- finally { if (e_15) throw e_15.error; }
481
- }
482
- };
483
- FixtureService.prototype.capabilitiesMatch = function (type1, type2, color1, color2, wheel1, wheel2, profileUuid1, profileUuid2) {
484
- // checks, whether two provided capapabilities match
485
- return (type1 === type2 &&
486
- (!color1 || color1 === color2) &&
487
- (!wheel1 || wheel1 === wheel2) &&
488
- (!profileUuid1 || profileUuid1 === profileUuid2));
489
- };
490
- FixtureService.prototype.settingsFixtureIsSelected = function (fixture) {
491
- var e_16, _a;
492
- try {
493
- for (var _b = __values(this.selectedSettingsFixtures), _c = _b.next(); !_c.done; _c = _b.next()) {
494
- var selectedFixture = _c.value;
495
- if (selectedFixture === fixture) {
496
- return true;
497
- }
498
- }
499
- }
500
- catch (e_16_1) { e_16 = { error: e_16_1 }; }
501
- finally {
502
- try {
503
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
504
- }
505
- finally { if (e_16) throw e_16.error; }
506
- }
507
- return false;
508
- };
509
- FixtureService.prototype.switchSettingsFixtureSelection = function (fixture) {
510
- if (this.settingsFixtureIsSelected(fixture)) {
511
- this.selectedSettingsFixtures.splice(this.selectedSettingsFixtures.indexOf(fixture), 1);
512
- }
513
- else {
514
- this.selectedSettingsFixtures.push(fixture);
515
- }
516
- };
517
- FixtureService.prototype.getFixtureIconClass = function (profile) {
518
- if (!profile) {
519
- return '';
520
- }
521
- if (profile.categories.length === 0) {
522
- return '';
523
- }
524
- if (!profile.categories[0]) {
525
- return '';
526
- }
527
- return profile.categories[0].replace(' ', '-').toLocaleLowerCase();
528
- };
529
- FixtureService.prototype.updateProfiles = function () {
530
- return this.http.post('update-profiles', null);
531
- };
532
- FixtureService.prototype.getNextFreeDmxChannel = function (fixturePool, neededChannels) {
533
- var e_17, _a;
534
- // get the next free space for this fixture
535
- var freeChannels = 0;
536
- for (var i = 0; i < 512; i++) {
537
- var occupiedChannels = 0;
538
- try {
539
- for (var fixturePool_1 = (e_17 = void 0, __values(fixturePool)), fixturePool_1_1 = fixturePool_1.next(); !fixturePool_1_1.done; fixturePool_1_1 = fixturePool_1.next()) {
540
- var fixture = fixturePool_1_1.value;
541
- var mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
542
- if (i >= fixture.dmxFirstChannel && i < fixture.dmxFirstChannel + mode.channels.length) {
543
- // this channel is already occupied by a fixture -> move forward to the end of the fixture
544
- if (mode.channels.length > occupiedChannels) {
545
- occupiedChannels = mode.channels.length - (i - fixture.dmxFirstChannel);
546
- }
547
- }
548
- }
549
- }
550
- catch (e_17_1) { e_17 = { error: e_17_1 }; }
551
- finally {
552
- try {
553
- if (fixturePool_1_1 && !fixturePool_1_1.done && (_a = fixturePool_1.return)) _a.call(fixturePool_1);
554
- }
555
- finally { if (e_17) throw e_17.error; }
556
- }
557
- if (occupiedChannels > 0) {
558
- i += occupiedChannels - 1;
559
- freeChannels = 0;
560
- }
561
- else {
562
- freeChannels++;
563
- }
564
- if (freeChannels === neededChannels) {
565
- return i - freeChannels + 1;
566
- }
567
- }
568
- // no free space left for the needed channels
569
- return -1;
570
- };
571
- FixtureService.prototype.addFixture = function (profile, fixturePool) {
572
- var e_18, _a;
573
- var _this = this;
574
- var fixture = new Fixture();
575
- fixture.uuid = this.uuidService.getUuid();
576
- fixture.profileUuid = profile.uuid;
577
- fixture.name = profile.name;
578
- if (profile.modes && profile.modes.length > 0) {
579
- fixture.modeShortName = profile.modes[0].shortName;
580
- }
581
- // add the same mode as an existing fixture, if available
582
- var existingModeShortName;
583
- try {
584
- for (var fixturePool_2 = __values(fixturePool), fixturePool_2_1 = fixturePool_2.next(); !fixturePool_2_1.done; fixturePool_2_1 = fixturePool_2.next()) {
585
- var existingFixture = fixturePool_2_1.value;
586
- var existingProfile = this.getProfileByUuid(existingFixture.profileUuid);
587
- if (existingProfile === profile) {
588
- existingModeShortName = existingFixture.modeShortName;
589
- break;
590
- }
591
- }
592
- }
593
- catch (e_18_1) { e_18 = { error: e_18_1 }; }
594
- finally {
595
- try {
596
- if (fixturePool_2_1 && !fixturePool_2_1.done && (_a = fixturePool_2.return)) _a.call(fixturePool_2);
597
- }
598
- finally { if (e_18) throw e_18.error; }
599
- }
600
- if (existingModeShortName) {
601
- fixture.modeShortName = existingModeShortName;
602
- }
603
- else {
604
- fixture.modeShortName = profile.modes[0].shortName || profile.modes[0].name;
605
- }
606
- var mode = this.getModeByFixture(this.getProfileByUuid(fixture.profileUuid), fixture);
607
- var firstChannel = this.getNextFreeDmxChannel(fixturePool, mode.channels.length);
608
- if (firstChannel >= 0) {
609
- fixture.dmxFirstChannel = firstChannel;
610
- fixturePool.push(fixture);
611
- return fixture;
612
- }
613
- else {
614
- // no free space anymore
615
- var msg_1 = 'designer.fixture-pool.no-free-space';
616
- var title_1 = 'designer.fixture-pool.no-free-space-title';
617
- this.translateService.get([msg_1, title_1]).subscribe(function (result) {
618
- _this.toastrService.error(result[msg_1], result[title_1]);
619
- });
620
- }
621
- };
622
- FixtureService.ctorParameters = function () { return [
623
- { type: HttpClient },
624
- { type: ProjectService },
625
- { type: TranslateService },
626
- { type: ToastrService },
627
- { type: UuidService }
628
- ]; };
629
- FixtureService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FixtureService_Factory() { return new FixtureService(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.ProjectService), i0.ɵɵinject(i3.TranslateService), i0.ɵɵinject(i4.ToastrService), i0.ɵɵinject(i5.UuidService)); }, token: FixtureService, providedIn: "root" });
630
- FixtureService = __decorate([
631
- Injectable({
632
- providedIn: 'root',
633
- }),
634
- __metadata("design:paramtypes", [HttpClient,
635
- ProjectService,
636
- TranslateService,
637
- ToastrService,
638
- UuidService])
639
- ], FixtureService);
640
- return FixtureService;
641
- }());
642
- export { FixtureService };
643
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJvY2tldHNob3cvZGVzaWduZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvZml4dHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUk1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsT0FBTyxFQUFvQixvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFLN0M7SUFRRSx3QkFDVSxJQUFnQixFQUNoQixjQUE4QixFQUM5QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsV0FBd0I7UUFKeEIsU0FBSSxH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QUFVLEVBQUUsTUFBTTtTQUNuQixDQUFDO3lDQVVnQixVQUFVO1lBQ0EsY0FBYztZQUNaLGdCQUFnQjtZQUNuQixhQUFhO1lBQ2YsV0FBVztPQWJ2QixjQUFjLENBOGUxQjt5QkFyZ0JEO0NBcWdCQyxBQTllRCxJQThlQztTQTllWSxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ2FjaGVkRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZSc7XG5pbXBvcnQgeyBDYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eSB9IGZyb20gJy4uL21vZGVscy9jYWNoZWQtZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vbW9kZWxzL2NhY2hlZC1maXh0dXJlLWNoYW5uZWwnO1xuaW1wb3J0IHsgQ29sb3IgfSBmcm9tICcuLi9tb2RlbHMvY29sb3InO1xuaW1wb3J0IHsgRml4dHVyZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5LCBGaXh0dXJlQ2FwYWJpbGl0eUNvbG9yLCBGaXh0dXJlQ2FwYWJpbGl0eVR5cGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1jYXBhYmlsaXR5JztcbmltcG9ydCB7IEZpeHR1cmVDaGFubmVsIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtY2hhbm5lbCc7XG5pbXBvcnQgeyBGaXh0dXJlTW9kZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLW1vZGUnO1xuaW1wb3J0IHsgRml4dHVyZVByb2ZpbGUgfSBmcm9tICcuLi9tb2RlbHMvZml4dHVyZS1wcm9maWxlJztcbmltcG9ydCB7IEZpeHR1cmVXaGVlbCB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLXdoZWVsJztcbmltcG9ydCB7IEZpeHR1cmVXaGVlbFNsb3QsIEZpeHR1cmVXaGVlbFNsb3RUeXBlIH0gZnJvbSAnLi4vbW9kZWxzL2ZpeHR1cmUtd2hlZWwtc2xvdCc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFV1aWRTZXJ2aWNlIH0gZnJvbSAnLi91dWlkLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgRml4dHVyZVNlcnZpY2Uge1xuICBjYWNoZWRGaXh0dXJlczogQ2FjaGVkRml4dHVyZVtdID0gW107XG5cbiAgLy8gaXMgdGhlIHNpZGUtdGFiIHNldHRpbmdzIGN1cnJlbnRseSBzZWxlY3RlZD9cbiAgc2V0dGluZ3NTZWxlY3Rpb24gPSBmYWxzZTtcblxuICBzZWxlY3RlZFNldHRpbmdzRml4dHVyZXM6IEZpeHR1cmVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0b2FzdHJTZXJ2aWNlOiBUb2FzdHJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFV1aWRTZXJ2aWNlXG4gICkge31cblxuICBnZXRGaXh0dXJlQnlVdWlkKHV1aWQ6IHN0cmluZyk6IEZpeHR1cmUge1xuICAgIGZvciAoY29uc3QgZml4dHVyZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZXMpIHtcbiAgICAgIGlmIChmaXh0dXJlLnV1aWQgPT09IHV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZpeHR1cmU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FjaGVkRml4dHVyZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBDYWNoZWRGaXh0dXJlIHtcbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5jYWNoZWRGaXh0dXJlcykge1xuICAgICAgaWYgKGZpeHR1cmUuZml4dHVyZS51dWlkID09PSB1dWlkKSB7XG4gICAgICAgIHJldHVybiBmaXh0dXJlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldCBhbGwgcHJvZmlsZXMgdG8gc2VhcmNoIGZvciAob25seSBtZXRhZGF0YSlcbiAgZ2V0U2VhcmNoUHJvZmlsZXMoKTogT2JzZXJ2YWJsZTxGaXh0dXJlUHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2ZpeHR1cmVzJykucGlwZShcbiAgICAgIG1hcCgocmVzcG9uc2U6IG9iamVjdFtdKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlYXJjaFByb2ZpbGVzOiBGaXh0dXJlUHJvZmlsZVtdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBwcm9maWxlIG9mIHJlc3BvbnNlKSB7XG4gICAgICAgICAgc2VhcmNoUHJvZmlsZXMucHVzaChuZXcgRml4dHVyZVByb2ZpbGUocHJvZmlsZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlYXJjaFByb2ZpbGVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0UHJvZmlsZUJ5VXVpZCh1dWlkOiBzdHJpbmcpOiBGaXh0dXJlUHJvZmlsZSB7XG4gICAgZm9yIChjb25zdCBmaXh0dXJlUHJvZmlsZSBvZiB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzKSB7XG4gICAgICBpZiAoZml4dHVyZVByb2ZpbGUudXVpZCA9PT0gdXVpZCkge1xuICAgICAgICByZXR1cm4gZml4dHVyZVByb2ZpbGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9hZFByb2ZpbGVCeVV1aWQodXVpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgbG9hZGVkUHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZCh1dWlkKTtcblxuICAgIGlmIChsb2FkZWRQcm9maWxlKSB7XG4gICAgICAvLyBUaGlzIHByb2ZpbGUgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIExvYWQgdGhlIG1ldGFkYXRhIGFuZCB0aGUgcHJvZmlsZVxuICAgIHJldHVybiBmb3JrSm9pbihbdGhpcy5odHRwLmdldCgnZml4dHVyZXM/dXVpZD0nICsgZW5jb2RlVVJJKHV1aWQpKSwgdGhpcy5odHRwLmdldCgnZml4dHVyZT91dWlkPScgKyBlbmNvZGVVUkkodXVpZCkpXSkucGlwZShcbiAgICAgIG1hcCgocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlZERhdGEgPSB7IC4uLnJlc3VsdFswXVswXSwgLi4ucmVzdWx0WzFdIH07XG4gICAgICAgIGNvbnN0IGZpeHR1cmVQcm9maWxlID0gbmV3IEZpeHR1cmVQcm9maWxlKG1lcmdlZERhdGEpO1xuICAgICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QuZml4dHVyZVByb2ZpbGVzLnB1c2goZml4dHVyZVByb2ZpbGUpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZ2V0Um90YXRpb25BbmdsZURlZyh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAvLyBjb252ZXJ0IGEgcm90YXRpb24gYW5nbGUgdmFsdWUgaW50byBkZWdyZWVzXG4gICAgaWYgKHZhbHVlLmVuZHNXaXRoKCdkZWcnKSkge1xuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludCh2YWx1ZS5yZXBsYWNlKCdkZWcnLCAnJykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUuZW5kc1dpdGgoJyUnKSkge1xuICAgICAgY29uc3QgcGVyYyA9IE51bWJlci5wYXJzZUludCh2YWx1ZS5yZXBsYWNlKCclJywgJycpKTtcbiAgICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiAzNjA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldFdoZWVsU2xvdENvbG9ycyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gICAgbGV0IGNvbG9yczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB3aGVlbFNsb3RzID0gdGhpcy5nZXRXaGVlbFNsb3RzKHdoZWVsLCBzbG90TnVtYmVyKTtcblxuICAgIGZvciAoY29uc3Qgc2xvdCBvZiB3aGVlbFNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC5jb2xvcnMgJiYgc2xvdC5jb2xvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb2xvcnMgPSBjb2xvcnMuY29uY2F0KHNsb3QuY29sb3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZ2V0TWl4ZWRXaGVlbFNsb3RDb2xvcih3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBDb2xvciB7XG4gICAgY29uc3QgY29sb3JzID0gdGhpcy5nZXRXaGVlbFNsb3RDb2xvcnMod2hlZWwsIHNsb3ROdW1iZXIpO1xuICAgIGNvbnN0IGNvbG9yc1JnYjogQ29sb3JbXSA9IFtdO1xuXG4gICAgaWYgKGNvbG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb2xvciBvZiBjb2xvcnMpIHtcbiAgICAgIGNvbG9yc1JnYi5wdXNoKHRoaXMuaGV4VG9SZ2IoY29sb3IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5taXhDb2xvcnMoY29sb3JzUmdiKTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcG9uZW50VG9IZXgoYzogbnVtYmVyKTogYW55IHtcbiAgICBjb25zdCBoZXggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/ICcwJyArIGhleCA6IGhleDtcbiAgfVxuXG4gIHJnYlRvSGV4KHI6IG51bWJlciwgZzogbnVtYmVyLCBiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiAnIycgKyB0aGlzLmNvbXBvbmVudFRvSGV4KHIpICsgdGhpcy5jb21wb25lbnRUb0hleChnKSArIHRoaXMuY29tcG9uZW50VG9IZXgoYik7XG4gIH1cblxuICBoZXhUb1JnYihoZXg6IHN0cmluZyk6IENvbG9yIHtcbiAgICAvLyBleHBhbmQgc2hvcnRoYW5kIGZvcm0gKGUuZy4gXCIwM0ZcIikgdG8gZnVsbCBmb3JtIChlLmcuIFwiMDAzM0ZGXCIpXG4gICAgY29uc3Qgc2hvcnRoYW5kUmVnZXggPSAvXiM/KFthLWZcXGRdKShbYS1mXFxkXSkoW2EtZlxcZF0pJC9pO1xuICAgIGhleCA9IGhleC5yZXBsYWNlKHNob3J0aGFuZFJlZ2V4LCAobSwgciwgZywgYikgPT4ge1xuICAgICAgcmV0dXJuIHIgKyByICsgZyArIGcgKyBiICsgYjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IC9eIz8oW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkkL2kuZXhlYyhoZXgpO1xuICAgIHJldHVybiByZXN1bHQgPyBuZXcgQ29sb3IocGFyc2VJbnQocmVzdWx0WzFdLCAxNiksIHBhcnNlSW50KHJlc3VsdFsyXSwgMTYpLCBwYXJzZUludChyZXN1bHRbM10sIDE2KSkgOiBudWxsO1xuICB9XG5cbiAgbWl4Q29sb3JzKGNvbG9yczogQ29sb3JbXSk6IENvbG9yIHtcbiAgICAvLyBtaXggYW4gYXJyYXkgb2YgcmdiLWNvbG9ycyBjb250YWluaW5nIHIsIGcsIGIgdmFsdWVzIHRvIGEgbmV3IGNvbG9yXG4gICAgbGV0IHIgPSAwO1xuICAgIGxldCBnID0gMDtcbiAgICBsZXQgYiA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbG9yIG9mIGNvbG9ycykge1xuICAgICAgciArPSBjb2xvci5yZWQ7XG4gICAgICBnICs9IGNvbG9yLmdyZWVuO1xuICAgICAgYiArPSBjb2xvci5ibHVlO1xuICAgIH1cblxuICAgIHIgLz0gY29sb3JzLmxlbmd0aDtcbiAgICBnIC89IGNvbG9ycy5sZW5ndGg7XG4gICAgYiAvPSBjb2xvcnMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIG5ldyBDb2xvcihyLCBnLCBiKTtcbiAgfVxuXG4gIHdoZWVsSGFzU2xvdFR5cGUod2hlZWw6IEZpeHR1cmVXaGVlbCwgc2xvdFR5cGU6IEZpeHR1cmVXaGVlbFNsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzbG90IG9mIHdoZWVsLnNsb3RzKSB7XG4gICAgICBpZiAoc2xvdC50eXBlID09PSBzbG90VHlwZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRXaGVlbEJ5TmFtZShwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSwgd2hlZWxOYW1lOiBzdHJpbmcpOiBGaXh0dXJlV2hlZWwge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gcHJvZmlsZS53aGVlbHMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gd2hlZWxOYW1lKSB7XG4gICAgICAgIHJldHVybiBwcm9maWxlLndoZWVsc1twcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2hlZWwgbm90IGZvdW5kXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2hlZWxTbG90cyh3aGVlbDogRml4dHVyZVdoZWVsLCBzbG90TnVtYmVyOiBudW1iZXIpOiBGaXh0dXJlV2hlZWxTbG90W10ge1xuICAgIC8vIHJldHVybiBvbmUgc2xvdCBvciB0d28gc2xvdHMsIGlmIHRoZXkgYXJlIG1peGVkIChlLmcuIHNsb3IgbnVtYmVyIDIuNSByZXR1cm5zIHRoZSBzbG90cyAyIGFuZCAzKVxuICAgIGNvbnN0IHNsb3RzOiBGaXh0dXJlV2hlZWxTbG90W10gPSBbXTtcblxuICAgIGlmICghd2hlZWwpIHtcbiAgICAgIHJldHVybiBzbG90cztcbiAgICB9XG5cbiAgICBpZiAoc2xvdE51bWJlciAtIE1hdGguZmxvb3Ioc2xvdE51bWJlcikgPiAwKSB7XG4gICAgICAvLyB0d28gc2xvdHMgYXJlIHNldFxuICAgICAgY29uc3QgbnVtYmVyID0gTWF0aC5mbG9vcihzbG90TnVtYmVyKTtcbiAgICAgIHNsb3RzLnB1c2god2hlZWwuc2xvdHNbbnVtYmVyIC0gMV0pO1xuICAgICAgaWYgKG51bWJlciA+PSAwICYmIG51bWJlciA8IHdoZWVsLnNsb3RzLmxlbmd0aCkge1xuICAgICAgICBzbG90cy5wdXNoKHdoZWVsLnNsb3RzW251bWJlcl0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvbmx5IG9uZSBzbG90IGlzIHNldFxuICAgICAgc2xvdHMucHVzaCh3aGVlbC5zbG90c1tzbG90TnVtYmVyIC0gMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBzbG90cztcbiAgfVxuXG4gIGdldE1vZGVCeUZpeHR1cmUocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIGZpeHR1cmU6IEZpeHR1cmUpOiBGaXh0dXJlTW9kZSB7XG4gICAgZm9yIChjb25zdCBtb2RlIG9mIHByb2ZpbGUubW9kZXMpIHtcbiAgICAgIGlmIChtb2RlLnNob3J0TmFtZSkge1xuICAgICAgICBpZiAobW9kZS5zaG9ydE5hbWUgPT09IGZpeHR1cmUubW9kZVNob3J0TmFtZSkge1xuICAgICAgICAgIHJldHVybiBtb2RlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobW9kZS5uYW1lID09PSBmaXh0dXJlLm1vZGVTaG9ydE5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gbW9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogRml4dHVyZUNhcGFiaWxpdHksIGNoYW5uZWxOYW1lOiBzdHJpbmcsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHkge1xuICAgIGNvbnN0IGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5ID0gbmV3IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5KCk7XG4gICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG4gICAgaWYgKGNhcGFiaWxpdHkuc2xvdE51bWJlcikge1xuICAgICAgLy8gdGhlcmUgaXMgYSB3aGVlbCBjb25uZWN0ZWQgdG8gdGhpcyBjYXBhYmlsaXR5XG4gICAgICBpZiAodHlwZW9mIGNhcGFiaWxpdHkud2hlZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWwgYXMgc3RyaW5nO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNhcGFiaWxpdHkud2hlZWwpKSB7XG4gICAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsTmFtZSA9IGNhcGFiaWxpdHkud2hlZWxbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUgPSBjaGFubmVsTmFtZTtcbiAgICAgIH1cbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsID0gdGhpcy5nZXRXaGVlbEJ5TmFtZShwcm9maWxlLCBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbE5hbWUpO1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkud2hlZWxTbG90cyA9IHRoaXMuZ2V0V2hlZWxTbG90cyhjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgY2FwYWJpbGl0eS5zbG90TnVtYmVyKTtcbiAgICAgIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LndoZWVsSXNDb2xvciA9IHRoaXMud2hlZWxIYXNTbG90VHlwZShjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS53aGVlbCwgRml4dHVyZVdoZWVsU2xvdFR5cGUuQ29sb3IpO1xuICAgIH1cbiAgICBpZiAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZSAmJiBjYWNoZWRGaXh0dXJlQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2VudGVyVmFsdWUgPSBNYXRoLmZsb29yKFxuICAgICAgICAoY2FjaGVkRml4dHVyZUNhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXSArIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0pIC8gMlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZEZpeHR1cmVDYXBhYmlsaXR5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDYXBhYmlsaXRpZXNCeUNoYW5uZWwoXG4gICAgZml4dHVyZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsLFxuICAgIGNoYW5uZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvZmlsZTogRml4dHVyZVByb2ZpbGVcbiAgKTogQ2FjaGVkRml4dHVyZUNhcGFiaWxpdHlbXSB7XG4gICAgY29uc3QgY2FwYWJpbGl0ZXM6IENhY2hlZEZpeHR1cmVDYXBhYmlsaXR5W10gPSBbXTtcblxuICAgIGlmIChmaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXR5KSB7XG4gICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoZml4dHVyZUNoYW5uZWwuY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICB9IGVsc2UgaWYgKGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGZpeHR1cmVDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICBjYXBhYmlsaXRlcy5wdXNoKHRoaXMuZ2V0Rml4dHVyZUNhcGFiaWxpdHkoY2FwYWJpbGl0eSwgY2hhbm5lbE5hbWUsIHByb2ZpbGUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2FwYWJpbGl0ZXM7XG4gIH1cblxuICBwcml2YXRlIGdldE1heFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDI1NiwgMSArIGZpeHR1cmVDaGFubmVsLmZpbmVDaGFubmVsQWxpYXNlcy5sZW5ndGgpIC0gMTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlQnlDaGFubmVsKGZpeHR1cmVDaGFubmVsOiBGaXh0dXJlQ2hhbm5lbCk6IG51bWJlciB7XG4gICAgaWYgKCFmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGlzTmFOKGZpeHR1cmVDaGFubmVsLmRlZmF1bHRWYWx1ZSBhcyBhbnkpICYmIChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5lbmRzV2l0aCgnJScpKSB7XG4gICAgICAvLyBwZXJjZW50YWdlIHZhbHVlXG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gTnVtYmVyLnBhcnNlSW50KChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKS5yZXBsYWNlKCclJywgJycpKTtcbiAgICAgIGNvbnN0IG1heFZhbHVlID0gdGhpcy5nZXRNYXhWYWx1ZUJ5Q2hhbm5lbChmaXh0dXJlQ2hhbm5lbCk7XG4gICAgICByZXR1cm4gKG1heFZhbHVlIC8gMTAwKSAqIHBlcmNlbnRhZ2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERNWCB2YWx1ZVxuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludChmaXh0dXJlQ2hhbm5lbC5kZWZhdWx0VmFsdWUgYXMgYW55KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbG9yV2hlZWxCeUNoYW5uZWwoY2hhbm5lbDogQ2FjaGVkRml4dHVyZUNoYW5uZWwsIHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlKTogRml4dHVyZVdoZWVsIHtcbiAgICBmb3IgKGNvbnN0IGNoYW5uZWxDYXBhYmlsaXR5IG9mIGNoYW5uZWwuY2FwYWJpbGl0aWVzKSB7XG4gICAgICBpZiAoY2hhbm5lbENhcGFiaWxpdHkud2hlZWxJc0NvbG9yKSB7XG4gICAgICAgIHJldHVybiBjaGFubmVsQ2FwYWJpbGl0eS53aGVlbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBjaGFubmVsSW5MaXN0KGNoYW5uZWxzOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbFtdLCBuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgLy8gICBmb3IgKGxldCBjaGFubmVsIG9mIGNoYW5uZWxzKSB7XG4gIC8vICAgICBpZiAoY2hhbm5lbC5jaGFubmVsTmFtZSA9PT0gbmFtZSkge1xuICAvLyAgICAgICByZXR1cm4gdHJ1ZTtcbiAgLy8gICAgIH1cbiAgLy8gICB9XG5cbiAgLy8gICByZXR1cm4gZmFsc2U7XG4gIC8vIH1cblxuICBnZXRDaGFubmVsQnlOYW1lKGZpeHR1cmU6IENhY2hlZEZpeHR1cmUsIGNoYW5uZWxOYW1lOiBzdHJpbmcpOiBDYWNoZWRGaXh0dXJlQ2hhbm5lbCB7XG4gICAgZm9yIChjb25zdCBjaGFubmVsIG9mIGZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGNoYW5uZWwubmFtZSAmJiBjaGFubmVsLm5hbWUgPT09IGNoYW5uZWxOYW1lKSB8fFxuICAgICAgICAoY2hhbm5lbC5jaGFubmVsICYmIGNoYW5uZWwuY2hhbm5lbC5maW5lQ2hhbm5lbEFsaWFzZXMuaW5kZXhPZihjaGFubmVsTmFtZSkgPiAtMSlcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gY2hhbm5lbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0Q2FjaGVkQ2hhbm5lbHMocHJvZmlsZTogRml4dHVyZVByb2ZpbGUsIG1vZGU6IEZpeHR1cmVNb2RlKTogQ2FjaGVkRml4dHVyZUNoYW5uZWxbXSB7XG4gICAgY29uc3QgY2hhbm5lbHM6IENhY2hlZEZpeHR1cmVDaGFubmVsW10gPSBbXTtcblxuICAgIGlmICghbW9kZSkge1xuICAgICAgcmV0dXJuIGNoYW5uZWxzO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXZhaWxhYmxlQ2hhbm5lbE5hbWUgb2YgT2JqZWN0LmtleXMocHJvZmlsZS5hdmFpbGFibGVDaGFubmVscykpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZUNoYW5uZWw6IEZpeHR1cmVDaGFubmVsID0gcHJvZmlsZS5hdmFpbGFibGVDaGFubmVsc1thdmFpbGFibGVDaGFubmVsTmFtZV07XG5cbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBtb2RlLmNoYW5uZWxzKSB7XG4gICAgICAgIC8vIGNoZWNrIGZvciBzdHJpbmcgY2hhbm5lbC4gSXQgY2FuIGdldCBjcmVlcHkgZm9yIG1hdHJpeCBtb2Rlc1xuICAgICAgICBpZiAodHlwZW9mIGNoYW5uZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgbW9kZUNoYW5uZWw6IHN0cmluZyA9IGNoYW5uZWwgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgLy8gZG9uJ3QgY2hlY2sgdGhlIGZpbmUgY2hhbm5lbHMuIG9ubHkgYWRkIHRoZSBjb2Fyc2UgY2hhbm5lbC5cbiAgICAgICAgICBpZiAobW9kZUNoYW5uZWwgPT09IGF2YWlsYWJsZUNoYW5uZWxOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZWRGaXh0dXJlQ2hhbm5lbCA9IG5ldyBDYWNoZWRGaXh0dXJlQ2hhbm5lbCgpO1xuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuY2hhbm5lbCA9IGF2YWlsYWJsZUNoYW5uZWw7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5uYW1lID0gYXZhaWxhYmxlQ2hhbm5lbE5hbWU7XG4gICAgICAgICAgICBjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jYXBhYmlsaXRpZXMgPSB0aGlzLmdldENhcGFiaWxpdGllc0J5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsLCBhdmFpbGFibGVDaGFubmVsTmFtZSwgcHJvZmlsZSk7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZUJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbC5jaGFubmVsKTtcbiAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwubWF4VmFsdWUgPSB0aGlzLmdldE1heFZhbHVlQnlDaGFubmVsKGNhY2hlZEZpeHR1cmVDaGFubmVsLmNoYW5uZWwpO1xuICAgICAgICAgICAgY2FjaGVkRml4dHVyZUNoYW5uZWwuY29sb3JXaGVlbCA9IHRoaXMuZ2V0Q29sb3JXaGVlbEJ5Q2hhbm5lbChjYWNoZWRGaXh0dXJlQ2hhbm5lbCwgcHJvZmlsZSk7XG4gICAgICAgICAgICBjaGFubmVscy5wdXNoKGNhY2hlZEZpeHR1cmVDaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbnVsbCBtYXkgYmUgcGFzc2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIGFuIHVuZGVmaW5lZCBjaGFubmVsXG4gICAgICAgICAgY2hhbm5lbHMucHVzaChuZXcgQ2FjaGVkRml4dHVyZUNoYW5uZWwoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hhbm5lbHM7XG4gIH1cblxuICB1cGRhdGVDYWNoZWRGaXh0dXJlcygpIHtcbiAgICAvLyBjYWxjdWxhdGUgc29tZSBmcmVxdWVudGx5IHVzZWQgdmFsdWVzIGFzIGEgY2FjaGUgdG8gc2F2ZSBjcHUgdGltZVxuICAgIC8vIGFmdGVyd2FyZHNcbiAgICB0aGlzLmNhY2hlZEZpeHR1cmVzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmZpeHR1cmVzKSB7XG4gICAgICBjb25zdCBjYWNoZWRGaXh0dXJlID0gbmV3IENhY2hlZEZpeHR1cmUoKTtcblxuICAgICAgY2FjaGVkRml4dHVyZS5maXh0dXJlID0gZml4dHVyZTtcbiAgICAgIGNhY2hlZEZpeHR1cmUucHJvZmlsZSA9IHRoaXMuZ2V0UHJvZmlsZUJ5VXVpZChmaXh0dXJlLnByb2ZpbGVVdWlkKTtcbiAgICAgIGNhY2hlZEZpeHR1cmUubW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZShjYWNoZWRGaXh0dXJlLnByb2ZpbGUsIGZpeHR1cmUpO1xuICAgICAgY2FjaGVkRml4dHVyZS5jaGFubmVscyA9IHRoaXMuZ2V0Q2FjaGVkQ2hhbm5lbHMoY2FjaGVkRml4dHVyZS5wcm9maWxlLCBjYWNoZWRGaXh0dXJlLm1vZGUpO1xuXG4gICAgICB0aGlzLmNhY2hlZEZpeHR1cmVzLnB1c2goY2FjaGVkRml4dHVyZSk7XG4gICAgfVxuICB9XG5cbiAgY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgdHlwZTE6IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSxcbiAgICB0eXBlMjogRml4dHVyZUNhcGFiaWxpdHlUeXBlLFxuICAgIGNvbG9yMTogRml4dHVyZUNhcGFiaWxpdHlDb2xvcixcbiAgICBjb2xvcjI6IEZpeHR1cmVDYXBhYmlsaXR5Q29sb3IsXG4gICAgd2hlZWwxOiBzdHJpbmcsXG4gICAgd2hlZWwyOiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQxOiBzdHJpbmcsXG4gICAgcHJvZmlsZVV1aWQyOiBzdHJpbmdcbiAgKTogYm9vbGVhbiB7XG4gICAgLy8gY2hlY2tzLCB3aGV0aGVyIHR3byBwcm92aWRlZCBjYXBhcGFiaWxpdGllcyBtYXRjaFxuICAgIHJldHVybiAoXG4gICAgICB0eXBlMSA9PT0gdHlwZTIgJiZcbiAgICAgICghY29sb3IxIHx8IGNvbG9yMSA9PT0gY29sb3IyKSAmJlxuICAgICAgKCF3aGVlbDEgfHwgd2hlZWwxID09PSB3aGVlbDIpICYmXG4gICAgICAoIXByb2ZpbGVVdWlkMSB8fCBwcm9maWxlVXVpZDEgPT09IHByb2ZpbGVVdWlkMilcbiAgICApO1xuICB9XG5cbiAgc2V0dGluZ3NGaXh0dXJlSXNTZWxlY3RlZChmaXh0dXJlOiBGaXh0dXJlKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZWxlY3RlZEZpeHR1cmUgb2YgdGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMpIHtcbiAgICAgIGlmIChzZWxlY3RlZEZpeHR1cmUgPT09IGZpeHR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3dpdGNoU2V0dGluZ3NGaXh0dXJlU2VsZWN0aW9uKGZpeHR1cmU6IEZpeHR1cmUpIHtcbiAgICBpZiAodGhpcy5zZXR0aW5nc0ZpeHR1cmVJc1NlbGVjdGVkKGZpeHR1cmUpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2V0dGluZ3NGaXh0dXJlcy5zcGxpY2UodGhpcy5zZWxlY3RlZFNldHRpbmdzRml4dHVyZXMuaW5kZXhPZihmaXh0dXJlKSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRTZXR0aW5nc0ZpeHR1cmVzLnB1c2goZml4dHVyZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rml4dHVyZUljb25DbGFzcyhwcm9maWxlOiBGaXh0dXJlUHJvZmlsZSk6IHN0cmluZyB7XG4gICAgaWYgKCFwcm9maWxlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChwcm9maWxlLmNhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmICghcHJvZmlsZS5jYXRlZ29yaWVzWzBdKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIHJldHVybiBwcm9maWxlLmNhdGVnb3JpZXNbMF0ucmVwbGFjZSgnICcsICctJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgfVxuXG4gIHVwZGF0ZVByb2ZpbGVzKCkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCgndXBkYXRlLXByb2ZpbGVzJywgbnVsbCk7XG4gIH1cblxuICBnZXROZXh0RnJlZURteENoYW5uZWwoZml4dHVyZVBvb2w6IEZpeHR1cmVbXSwgbmVlZGVkQ2hhbm5lbHM6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gZ2V0IHRoZSBuZXh0IGZyZWUgc3BhY2UgZm9yIHRoaXMgZml4dHVyZVxuICAgIGxldCBmcmVlQ2hhbm5lbHMgPSAwO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1MTI7IGkrKykge1xuICAgICAgbGV0IG9jY3VwaWVkQ2hhbm5lbHMgPSAwO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpeHR1cmUgb2YgZml4dHVyZVBvb2wpIHtcbiAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuXG4gICAgICAgIGlmIChpID49IGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICYmIGkgPCBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCArIG1vZGUuY2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdGhpcyBjaGFubmVsIGlzIGFscmVhZHkgb2NjdXBpZWQgYnkgYSBmaXh0dXJlIC0+IG1vdmUgZm9yd2FyZCB0byB0aGUgZW5kIG9mIHRoZSBmaXh0dXJlXG4gICAgICAgICAgaWYgKG1vZGUuY2hhbm5lbHMubGVuZ3RoID4gb2NjdXBpZWRDaGFubmVscykge1xuICAgICAgICAgICAgb2NjdXBpZWRDaGFubmVscyA9IG1vZGUuY2hhbm5lbHMubGVuZ3RoIC0gKGkgLSBmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChvY2N1cGllZENoYW5uZWxzID4gMCkge1xuICAgICAgICBpICs9IG9jY3VwaWVkQ2hhbm5lbHMgLSAxO1xuICAgICAgICBmcmVlQ2hhbm5lbHMgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJlZUNoYW5uZWxzKys7XG4gICAgICB9XG5cbiAgICAgIGlmIChmcmVlQ2hhbm5lbHMgPT09IG5lZWRlZENoYW5uZWxzKSB7XG4gICAgICAgIHJldHVybiBpIC0gZnJlZUNoYW5uZWxzICsgMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBmcmVlIHNwYWNlIGxlZnQgZm9yIHRoZSBuZWVkZWQgY2hhbm5lbHNcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBhZGRGaXh0dXJlKHByb2ZpbGU6IEZpeHR1cmVQcm9maWxlLCBmaXh0dXJlUG9vbDogRml4dHVyZVtdKTogRml4dHVyZSB7XG4gICAgY29uc3QgZml4dHVyZSA9IG5ldyBGaXh0dXJlKCk7XG5cbiAgICBmaXh0dXJlLnV1aWQgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFV1aWQoKTtcbiAgICBmaXh0dXJlLnByb2ZpbGVVdWlkID0gcHJvZmlsZS51dWlkO1xuICAgIGZpeHR1cmUubmFtZSA9IHByb2ZpbGUubmFtZTtcblxuICAgIGlmIChwcm9maWxlLm1vZGVzICYmIHByb2ZpbGUubW9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gcHJvZmlsZS5tb2Rlc1swXS5zaG9ydE5hbWU7XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBzYW1lIG1vZGUgYXMgYW4gZXhpc3RpbmcgZml4dHVyZSwgaWYgYXZhaWxhYmxlXG4gICAgbGV0IGV4aXN0aW5nTW9kZVNob3J0TmFtZTogc3RyaW5nO1xuICAgIGZvciAoY29uc3QgZXhpc3RpbmdGaXh0dXJlIG9mIGZpeHR1cmVQb29sKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1Byb2ZpbGUgPSB0aGlzLmdldFByb2ZpbGVCeVV1aWQoZXhpc3RpbmdGaXh0dXJlLnByb2ZpbGVVdWlkKTtcblxuICAgICAgaWYgKGV4aXN0aW5nUHJvZmlsZSA9PT0gcHJvZmlsZSkge1xuICAgICAgICBleGlzdGluZ01vZGVTaG9ydE5hbWUgPSBleGlzdGluZ0ZpeHR1cmUubW9kZVNob3J0TmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV4aXN0aW5nTW9kZVNob3J0TmFtZSkge1xuICAgICAgZml4dHVyZS5tb2RlU2hvcnROYW1lID0gZXhpc3RpbmdNb2RlU2hvcnROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaXh0dXJlLm1vZGVTaG9ydE5hbWUgPSBwcm9maWxlLm1vZGVzWzBdLnNob3J0TmFtZSB8fCBwcm9maWxlLm1vZGVzWzBdLm5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0TW9kZUJ5Rml4dHVyZSh0aGlzLmdldFByb2ZpbGVCeVV1aWQoZml4dHVyZS5wcm9maWxlVXVpZCksIGZpeHR1cmUpO1xuICAgIGNvbnN0IGZpcnN0Q2hhbm5lbCA9IHRoaXMuZ2V0TmV4dEZyZWVEbXhDaGFubmVsKGZpeHR1cmVQb29sLCBtb2RlLmNoYW5uZWxzLmxlbmd0aCk7XG5cbiAgICBpZiAoZmlyc3RDaGFubmVsID49IDApIHtcbiAgICAgIGZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID0gZmlyc3RDaGFubmVsO1xuICAgICAgZml4dHVyZVBvb2wucHVzaChmaXh0dXJlKTtcbiAgICAgIHJldHVybiBmaXh0dXJlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBubyBmcmVlIHNwYWNlIGFueW1vcmVcbiAgICAgIGNvbnN0IG1zZyA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubm8tZnJlZS1zcGFjZSc7XG4gICAgICBjb25zdCB0aXRsZSA9ICdkZXNpZ25lci5maXh0dXJlLXBvb2wubm8tZnJlZS1zcGFjZS10aXRsZSc7XG5cbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoW21zZywgdGl0bGVdKS5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICB0aGlzLnRvYXN0clNlcnZpY2UuZXJyb3IocmVzdWx0W21zZ10sIHJlc3VsdFt0aXRsZV0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=