@rocketshow/designer 1.31.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.
- package/esm2022/lib/array-sort-pipe.mjs +30 -0
- package/esm2022/lib/designer.component.mjs +605 -0
- package/esm2022/lib/designer.module.mjs +183 -0
- package/esm2022/lib/designer.service.mjs +14 -0
- package/esm2022/lib/effect/effect-curve/effect-curve.component.mjs +569 -0
- package/esm2022/lib/effect/effect-pan-tilt/effect-pan-tilt.component.mjs +36 -0
- package/esm2022/lib/effect/effect.component.mjs +174 -0
- package/esm2022/lib/error-dialog/error-dialog.component.mjs +75 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.mjs +222 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.mjs +147 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.mjs +213 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.mjs +78 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.mjs +119 -0
- package/esm2022/lib/fixture/fixture-capability/fixture-capability.component.mjs +169 -0
- package/esm2022/lib/fixture/fixture-channel/fixture-channel.component.mjs +160 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.mjs +365 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.mjs +151 -0
- package/esm2022/lib/fixture/fixture-settings/fixture-settings.component.mjs +46 -0
- package/esm2022/lib/fixture/fixture.component.mjs +138 -0
- package/esm2022/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.mjs +145 -0
- package/esm2022/lib/fixture-pool/fixture-pool.component.mjs +589 -0
- package/esm2022/lib/intro/intro.component.mjs +95 -0
- package/esm2022/lib/master-dimmer/master-dimmer.component.mjs +66 -0
- package/esm2022/lib/models/cached-fixture-capability.mjs +9 -0
- package/esm2022/lib/models/cached-fixture-channel.mjs +7 -0
- package/esm2022/lib/models/cached-fixture.mjs +6 -0
- package/esm2022/lib/models/color.mjs +8 -0
- package/esm2022/lib/models/composition.mjs +46 -0
- package/esm2022/lib/models/effect-curve-profile-channel.mjs +15 -0
- package/esm2022/lib/models/effect-curve.mjs +69 -0
- package/esm2022/lib/models/effect-pan-tilt.mjs +19 -0
- package/esm2022/lib/models/effect.mjs +12 -0
- package/esm2022/lib/models/fixture-capability-value.mjs +15 -0
- package/esm2022/lib/models/fixture-capability.mjs +84 -0
- package/esm2022/lib/models/fixture-channel-value.mjs +11 -0
- package/esm2022/lib/models/fixture-channel.mjs +24 -0
- package/esm2022/lib/models/fixture-mode.mjs +14 -0
- package/esm2022/lib/models/fixture-profile.mjs +70 -0
- package/esm2022/lib/models/fixture-wheel-slot.mjs +26 -0
- package/esm2022/lib/models/fixture-wheel.mjs +15 -0
- package/esm2022/lib/models/fixture.mjs +40 -0
- package/esm2022/lib/models/preset-region-scene.mjs +8 -0
- package/esm2022/lib/models/preset.mjs +56 -0
- package/esm2022/lib/models/project.mjs +68 -0
- package/esm2022/lib/models/scene-playback-region.mjs +11 -0
- package/esm2022/lib/models/scene.mjs +27 -0
- package/esm2022/lib/models/universe.mjs +11 -0
- package/esm2022/lib/preset/preset-settings/preset-settings.component.mjs +194 -0
- package/esm2022/lib/preset/preset.component.mjs +131 -0
- package/esm2022/lib/preview/models/color-changer-3d.mjs +167 -0
- package/esm2022/lib/preview/models/fixture-3d.mjs +150 -0
- package/esm2022/lib/preview/models/moving-head-3d.mjs +243 -0
- package/esm2022/lib/preview/preview.component.mjs +212 -0
- package/esm2022/lib/project/project-browser/project-browser.component.mjs +143 -0
- package/esm2022/lib/project/project-import/project-import.component.mjs +107 -0
- package/esm2022/lib/project/project-save/project-save.component.mjs +178 -0
- package/esm2022/lib/project/project-share/project-share.component.mjs +71 -0
- package/esm2022/lib/scene/scene-settings/scene-settings.component.mjs +146 -0
- package/esm2022/lib/scene/scene.component.mjs +110 -0
- package/esm2022/lib/services/animation.service.mjs +16 -0
- package/esm2022/lib/services/config.service.mjs +27 -0
- package/esm2022/lib/services/effect.service.mjs +14 -0
- package/esm2022/lib/services/error-dialog.service.mjs +39 -0
- package/esm2022/lib/services/fixture-pool.service.mjs +30 -0
- package/esm2022/lib/services/fixture.service.mjs +431 -0
- package/esm2022/lib/services/hotkey-target-exclude.service.mjs +24 -0
- package/esm2022/lib/services/intro.service.mjs +140 -0
- package/esm2022/lib/services/preset.service.mjs +400 -0
- package/esm2022/lib/services/preview-mesh.service.mjs +57 -0
- package/esm2022/lib/services/preview.service.mjs +496 -0
- package/esm2022/lib/services/project-load.service.mjs +149 -0
- package/esm2022/lib/services/project.service.mjs +97 -0
- package/esm2022/lib/services/scene.service.mjs +164 -0
- package/esm2022/lib/services/timeline.service.mjs +726 -0
- package/esm2022/lib/services/universe.service.mjs +23 -0
- package/esm2022/lib/services/user-ensure-login.service.mjs +38 -0
- package/esm2022/lib/services/user.service.mjs +89 -0
- package/esm2022/lib/services/uuid.service.mjs +23 -0
- package/esm2022/lib/services/warning-dialog.service.mjs +38 -0
- package/esm2022/lib/timeline/composition-settings/composition-settings.component.mjs +334 -0
- package/esm2022/lib/timeline/timeline-grid/timeline-grid.component.mjs +216 -0
- package/esm2022/lib/timeline/timeline.component.mjs +418 -0
- package/esm2022/lib/user/user-login/user-login.component.mjs +144 -0
- package/esm2022/lib/user/user-register/user-register.component.mjs +220 -0
- package/esm2022/lib/wait-dialog/wait-dialog.component.mjs +26 -0
- package/esm2022/lib/warning-dialog/warning-dialog.component.mjs +68 -0
- package/esm2022/public_api.mjs +7 -0
- package/esm2022/rocketshow-designer.mjs +5 -0
- package/fesm2022/rocketshow-designer.mjs +10626 -0
- package/fesm2022/rocketshow-designer.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/array-sort-pipe.d.ts +3 -0
- package/lib/designer.component.d.ts +15 -12
- package/lib/designer.module.d.ts +54 -0
- package/lib/designer.service.d.ts +3 -0
- package/lib/effect/effect-curve/effect-curve.component.d.ts +4 -1
- package/lib/effect/effect-pan-tilt/effect-pan-tilt.component.d.ts +3 -0
- package/lib/effect/effect.component.d.ts +3 -0
- package/lib/error-dialog/error-dialog.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.d.ts +4 -1
- package/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.d.ts +5 -2
- package/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.d.ts +3 -0
- package/lib/fixture/fixture-capability/fixture-capability.component.d.ts +3 -0
- package/lib/fixture/fixture-channel/fixture-channel.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.d.ts +3 -0
- package/lib/fixture/fixture-settings/fixture-settings.component.d.ts +3 -0
- package/lib/fixture/fixture.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.d.ts +3 -0
- package/lib/fixture-pool/fixture-pool.component.d.ts +3 -0
- package/lib/intro/intro.component.d.ts +3 -0
- package/lib/master-dimmer/master-dimmer.component.d.ts +3 -0
- package/lib/preset/preset-settings/preset-settings.component.d.ts +3 -0
- package/lib/preset/preset.component.d.ts +3 -0
- package/lib/preview/preview.component.d.ts +4 -4
- package/lib/project/project-browser/project-browser.component.d.ts +3 -0
- package/lib/project/project-import/project-import.component.d.ts +3 -0
- package/lib/project/project-save/project-save.component.d.ts +3 -0
- package/lib/project/project-share/project-share.component.d.ts +3 -0
- package/lib/scene/scene-settings/scene-settings.component.d.ts +3 -0
- package/lib/scene/scene.component.d.ts +3 -0
- package/lib/services/animation.service.d.ts +3 -0
- package/lib/services/config.service.d.ts +3 -0
- package/lib/services/effect.service.d.ts +3 -0
- package/lib/services/error-dialog.service.d.ts +3 -0
- package/lib/services/fixture-pool.service.d.ts +3 -0
- package/lib/services/fixture.service.d.ts +3 -0
- package/lib/services/hotkey-target-exclude.service.d.ts +3 -0
- package/lib/services/intro.service.d.ts +3 -0
- package/lib/services/preset.service.d.ts +3 -0
- package/lib/services/preview-mesh.service.d.ts +3 -0
- package/lib/services/preview.service.d.ts +4 -0
- package/lib/services/project-load.service.d.ts +3 -0
- package/lib/services/project.service.d.ts +3 -0
- package/lib/services/scene.service.d.ts +3 -0
- package/lib/services/timeline.service.d.ts +4 -1
- package/lib/services/universe.service.d.ts +3 -0
- package/lib/services/user-ensure-login.service.d.ts +3 -0
- package/lib/services/user.service.d.ts +3 -0
- package/lib/services/uuid.service.d.ts +3 -0
- package/lib/services/warning-dialog.service.d.ts +3 -0
- package/lib/timeline/composition-settings/composition-settings.component.d.ts +3 -0
- package/lib/timeline/timeline-grid/timeline-grid.component.d.ts +3 -0
- package/lib/timeline/timeline.component.d.ts +3 -0
- package/lib/user/user-login/user-login.component.d.ts +3 -0
- package/lib/user/user-register/user-register.component.d.ts +3 -0
- package/lib/wait-dialog/wait-dialog.component.d.ts +3 -0
- package/lib/warning-dialog/warning-dialog.component.d.ts +3 -0
- package/package.json +20 -22
- package/rocketshow-designer-1.33.0.tgz +0 -0
- package/bundles/rocketshow-designer.umd.js +0 -9947
- package/bundles/rocketshow-designer.umd.js.map +0 -1
- package/bundles/rocketshow-designer.umd.min.js +0 -17
- package/bundles/rocketshow-designer.umd.min.js.map +0 -1
- package/esm2015/lib/array-sort-pipe.js +0 -28
- package/esm2015/lib/designer.component.js +0 -411
- package/esm2015/lib/designer.module.js +0 -117
- package/esm2015/lib/designer.service.js +0 -16
- package/esm2015/lib/effect/effect-curve/effect-curve.component.js +0 -325
- package/esm2015/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -30
- package/esm2015/lib/effect/effect.component.js +0 -73
- package/esm2015/lib/error-dialog/error-dialog.component.js +0 -42
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -141
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -128
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -163
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -60
- package/esm2015/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -87
- package/esm2015/lib/fixture/fixture-capability/fixture-capability.component.js +0 -97
- package/esm2015/lib/fixture/fixture-channel/fixture-channel.component.js +0 -66
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -200
- package/esm2015/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -31
- package/esm2015/lib/fixture/fixture-settings/fixture-settings.component.js +0 -35
- package/esm2015/lib/fixture/fixture.component.js +0 -70
- package/esm2015/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -128
- package/esm2015/lib/fixture-pool/fixture-pool.component.js +0 -331
- package/esm2015/lib/intro/intro.component.js +0 -25
- package/esm2015/lib/master-dimmer/master-dimmer.component.js +0 -41
- package/esm2015/lib/models/cached-fixture-capability.js +0 -9
- package/esm2015/lib/models/cached-fixture-channel.js +0 -7
- package/esm2015/lib/models/cached-fixture.js +0 -6
- package/esm2015/lib/models/color.js +0 -8
- package/esm2015/lib/models/composition.js +0 -46
- package/esm2015/lib/models/effect-curve-profile-channel.js +0 -15
- package/esm2015/lib/models/effect-curve.js +0 -69
- package/esm2015/lib/models/effect-pan-tilt.js +0 -19
- package/esm2015/lib/models/effect.js +0 -12
- package/esm2015/lib/models/fixture-capability-value.js +0 -15
- package/esm2015/lib/models/fixture-capability.js +0 -84
- package/esm2015/lib/models/fixture-channel-value.js +0 -11
- package/esm2015/lib/models/fixture-channel.js +0 -24
- package/esm2015/lib/models/fixture-mode.js +0 -14
- package/esm2015/lib/models/fixture-profile.js +0 -70
- package/esm2015/lib/models/fixture-wheel-slot.js +0 -26
- package/esm2015/lib/models/fixture-wheel.js +0 -15
- package/esm2015/lib/models/fixture.js +0 -40
- package/esm2015/lib/models/preset-region-scene.js +0 -8
- package/esm2015/lib/models/preset.js +0 -56
- package/esm2015/lib/models/project.js +0 -68
- package/esm2015/lib/models/scene-playback-region.js +0 -11
- package/esm2015/lib/models/scene.js +0 -27
- package/esm2015/lib/models/universe.js +0 -11
- package/esm2015/lib/preset/preset-settings/preset-settings.component.js +0 -66
- package/esm2015/lib/preset/preset.component.js +0 -85
- package/esm2015/lib/preview/models/color-changer-3d.js +0 -167
- package/esm2015/lib/preview/models/fixture-3d.js +0 -150
- package/esm2015/lib/preview/models/moving-head-3d.js +0 -233
- package/esm2015/lib/preview/preview.component.js +0 -242
- package/esm2015/lib/project/project-browser/project-browser.component.js +0 -73
- package/esm2015/lib/project/project-import/project-import.component.js +0 -89
- package/esm2015/lib/project/project-save/project-save.component.js +0 -105
- package/esm2015/lib/project/project-share/project-share.component.js +0 -43
- package/esm2015/lib/scene/scene-settings/scene-settings.component.js +0 -52
- package/esm2015/lib/scene/scene.component.js +0 -56
- package/esm2015/lib/services/animation.service.js +0 -17
- package/esm2015/lib/services/config.service.js +0 -28
- package/esm2015/lib/services/effect.service.js +0 -16
- package/esm2015/lib/services/error-dialog.service.js +0 -44
- package/esm2015/lib/services/fixture-pool.service.js +0 -34
- package/esm2015/lib/services/fixture.service.js +0 -443
- package/esm2015/lib/services/hotkey-target-exclude.service.js +0 -26
- package/esm2015/lib/services/intro.service.js +0 -144
- package/esm2015/lib/services/preset.service.js +0 -416
- package/esm2015/lib/services/preview-mesh.service.js +0 -58
- package/esm2015/lib/services/preview.service.js +0 -500
- package/esm2015/lib/services/project-load.service.js +0 -171
- package/esm2015/lib/services/project.service.js +0 -113
- package/esm2015/lib/services/scene.service.js +0 -174
- package/esm2015/lib/services/timeline.service.js +0 -738
- package/esm2015/lib/services/universe.service.js +0 -24
- package/esm2015/lib/services/user-ensure-login.service.js +0 -44
- package/esm2015/lib/services/user.service.js +0 -93
- package/esm2015/lib/services/uuid.service.js +0 -25
- package/esm2015/lib/services/warning-dialog.service.js +0 -43
- package/esm2015/lib/timeline/composition-settings/composition-settings.component.js +0 -197
- package/esm2015/lib/timeline/timeline-grid/timeline-grid.component.js +0 -55
- package/esm2015/lib/timeline/timeline.component.js +0 -239
- package/esm2015/lib/user/user-login/user-login.component.js +0 -64
- package/esm2015/lib/user/user-register/user-register.component.js +0 -89
- package/esm2015/lib/wait-dialog/wait-dialog.component.js +0 -16
- package/esm2015/lib/warning-dialog/warning-dialog.component.js +0 -42
- package/esm2015/public_api.js +0 -7
- package/esm2015/rocketshow-designer.js +0 -61
- package/esm5/lib/array-sort-pipe.js +0 -31
- package/esm5/lib/designer.component.js +0 -468
- package/esm5/lib/designer.module.js +0 -120
- package/esm5/lib/designer.service.js +0 -17
- package/esm5/lib/effect/effect-curve/effect-curve.component.js +0 -386
- package/esm5/lib/effect/effect-pan-tilt/effect-pan-tilt.component.js +0 -31
- package/esm5/lib/effect/effect.component.js +0 -75
- package/esm5/lib/error-dialog/error-dialog.component.js +0 -43
- package/esm5/lib/fixture/fixture-capability/fixture-capability-channel/fixture-capability-channel.component.js +0 -159
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color/fixture-capability-color.component.js +0 -130
- package/esm5/lib/fixture/fixture-capability/fixture-capability-color-wheel/fixture-capability-color-wheel.component.js +0 -215
- package/esm5/lib/fixture/fixture-capability/fixture-capability-dimmer/fixture-capability-dimmer.component.js +0 -61
- package/esm5/lib/fixture/fixture-capability/fixture-capability-pan-tilt/fixture-capability-pan-tilt.component.js +0 -88
- package/esm5/lib/fixture/fixture-capability/fixture-capability.component.js +0 -130
- package/esm5/lib/fixture/fixture-channel/fixture-channel.component.js +0 -68
- package/esm5/lib/fixture/fixture-settings/fixture-settings-position/fixture-settings-position.component.js +0 -306
- package/esm5/lib/fixture/fixture-settings/fixture-settings-stage/fixture-settings-stage.component.js +0 -32
- package/esm5/lib/fixture/fixture-settings/fixture-settings.component.js +0 -36
- package/esm5/lib/fixture/fixture.component.js +0 -71
- package/esm5/lib/fixture-pool/fixture-pool-create-from-file/fixture-pool-create-from-file.component.js +0 -127
- package/esm5/lib/fixture-pool/fixture-pool.component.js +0 -430
- package/esm5/lib/intro/intro.component.js +0 -26
- package/esm5/lib/master-dimmer/master-dimmer.component.js +0 -42
- package/esm5/lib/models/cached-fixture-capability.js +0 -11
- package/esm5/lib/models/cached-fixture-channel.js +0 -9
- package/esm5/lib/models/cached-fixture.js +0 -8
- package/esm5/lib/models/color.js +0 -10
- package/esm5/lib/models/composition.js +0 -60
- package/esm5/lib/models/effect-curve-profile-channel.js +0 -29
- package/esm5/lib/models/effect-curve.js +0 -95
- package/esm5/lib/models/effect-pan-tilt.js +0 -24
- package/esm5/lib/models/effect.js +0 -14
- package/esm5/lib/models/fixture-capability-value.js +0 -17
- package/esm5/lib/models/fixture-capability.js +0 -86
- package/esm5/lib/models/fixture-channel-value.js +0 -13
- package/esm5/lib/models/fixture-channel.js +0 -38
- package/esm5/lib/models/fixture-mode.js +0 -16
- package/esm5/lib/models/fixture-profile.js +0 -114
- package/esm5/lib/models/fixture-wheel-slot.js +0 -28
- package/esm5/lib/models/fixture-wheel.js +0 -29
- package/esm5/lib/models/fixture.js +0 -42
- package/esm5/lib/models/preset-region-scene.js +0 -10
- package/esm5/lib/models/preset.js +0 -90
- package/esm5/lib/models/project.js +0 -122
- package/esm5/lib/models/scene-playback-region.js +0 -13
- package/esm5/lib/models/scene.js +0 -29
- package/esm5/lib/models/universe.js +0 -13
- package/esm5/lib/preset/preset-settings/preset-settings.component.js +0 -67
- package/esm5/lib/preset/preset.component.js +0 -86
- package/esm5/lib/preview/models/color-changer-3d.js +0 -194
- package/esm5/lib/preview/models/fixture-3d.js +0 -196
- package/esm5/lib/preview/models/moving-head-3d.js +0 -250
- package/esm5/lib/preview/preview.component.js +0 -280
- package/esm5/lib/project/project-browser/project-browser.component.js +0 -77
- package/esm5/lib/project/project-import/project-import.component.js +0 -88
- package/esm5/lib/project/project-save/project-save.component.js +0 -120
- package/esm5/lib/project/project-share/project-share.component.js +0 -44
- package/esm5/lib/scene/scene-settings/scene-settings.component.js +0 -53
- package/esm5/lib/scene/scene.component.js +0 -57
- package/esm5/lib/services/animation.service.js +0 -18
- package/esm5/lib/services/config.service.js +0 -29
- package/esm5/lib/services/effect.service.js +0 -17
- package/esm5/lib/services/error-dialog.service.js +0 -46
- package/esm5/lib/services/fixture-pool.service.js +0 -36
- package/esm5/lib/services/fixture.service.js +0 -643
- package/esm5/lib/services/hotkey-target-exclude.service.js +0 -27
- package/esm5/lib/services/intro.service.js +0 -145
- package/esm5/lib/services/preset.service.js +0 -637
- package/esm5/lib/services/preview-mesh.service.js +0 -61
- package/esm5/lib/services/preview.service.js +0 -754
- package/esm5/lib/services/project-load.service.js +0 -185
- package/esm5/lib/services/project.service.js +0 -127
- package/esm5/lib/services/scene.service.js +0 -251
- package/esm5/lib/services/timeline.service.js +0 -845
- package/esm5/lib/services/universe.service.js +0 -36
- package/esm5/lib/services/user-ensure-login.service.js +0 -45
- package/esm5/lib/services/user.service.js +0 -95
- package/esm5/lib/services/uuid.service.js +0 -26
- package/esm5/lib/services/warning-dialog.service.js +0 -45
- package/esm5/lib/timeline/composition-settings/composition-settings.component.js +0 -206
- package/esm5/lib/timeline/timeline-grid/timeline-grid.component.js +0 -56
- package/esm5/lib/timeline/timeline.component.js +0 -243
- package/esm5/lib/user/user-login/user-login.component.js +0 -66
- package/esm5/lib/user/user-register/user-register.component.js +0 -91
- package/esm5/lib/wait-dialog/wait-dialog.component.js +0 -18
- package/esm5/lib/warning-dialog/warning-dialog.component.js +0 -43
- package/esm5/public_api.js +0 -7
- package/esm5/rocketshow-designer.js +0 -61
- package/fesm2015/rocketshow-designer.js +0 -7945
- package/fesm2015/rocketshow-designer.js.map +0 -1
- package/fesm5/rocketshow-designer.js +0 -9690
- package/fesm5/rocketshow-designer.js.map +0 -1
- package/rocketshow-designer-1.31.0.tgz +0 -0
- package/rocketshow-designer.d.ts +0 -60
- package/rocketshow-designer.metadata.json +0 -1
|
@@ -1,845 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata, __values } from "tslib";
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Injectable } from '@angular/core';
|
|
4
|
-
import { Subject, timer } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import WaveSurfer from 'wavesurfer.js';
|
|
7
|
-
import CursorPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.cursor.min.js';
|
|
8
|
-
import RegionsPlugin from 'wavesurfer.js/dist/plugin/wavesurfer.regions.min.js';
|
|
9
|
-
import TimeLinePlugin from 'wavesurfer.js/dist/plugin/wavesurfer.timeline.min.js';
|
|
10
|
-
import { guess } from 'web-audio-beat-detector';
|
|
11
|
-
import { PresetRegionScene } from '../models/preset-region-scene';
|
|
12
|
-
import { ScenePlaybackRegion } from '../models/scene-playback-region';
|
|
13
|
-
import { ConfigService } from './config.service';
|
|
14
|
-
import { PresetService } from './preset.service';
|
|
15
|
-
import { ProjectService } from './project.service';
|
|
16
|
-
import { SceneService } from './scene.service';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "./scene.service";
|
|
19
|
-
import * as i2 from "./preset.service";
|
|
20
|
-
import * as i3 from "./project.service";
|
|
21
|
-
import * as i4 from "@angular/common/http";
|
|
22
|
-
import * as i5 from "./config.service";
|
|
23
|
-
var TimelineService = /** @class */ (function () {
|
|
24
|
-
function TimelineService(sceneService, presetService, projectService, http, configService) {
|
|
25
|
-
var _this = this;
|
|
26
|
-
this.sceneService = sceneService;
|
|
27
|
-
this.presetService = presetService;
|
|
28
|
-
this.projectService = projectService;
|
|
29
|
-
this.http = http;
|
|
30
|
-
this.configService = configService;
|
|
31
|
-
this.playState = 'paused';
|
|
32
|
-
this.zoom = 0;
|
|
33
|
-
this.timelineClicking = false;
|
|
34
|
-
this.intensity = 0.2;
|
|
35
|
-
this.intensitySelectedScene = 0.4;
|
|
36
|
-
this.intensityHighlighted = 0.8;
|
|
37
|
-
this.waveSurferReady = new Subject();
|
|
38
|
-
this.detectChanges = new Subject();
|
|
39
|
-
// can we add new compositions based on an external pool and
|
|
40
|
-
// should new compositions not available in this pool be added there?
|
|
41
|
-
this.externalCompositionsAvailable = false;
|
|
42
|
-
this.loadingAudioFile = false;
|
|
43
|
-
this.presetService.previewSelectionChanged.subscribe(function () {
|
|
44
|
-
_this.selectedPlaybackRegion = undefined;
|
|
45
|
-
_this.updateRegionSelection();
|
|
46
|
-
});
|
|
47
|
-
this.sceneService.sceneDeleted.subscribe(function () {
|
|
48
|
-
_this.redrawAllRegions();
|
|
49
|
-
});
|
|
50
|
-
this.sceneService.sceneSelected.subscribe(function () {
|
|
51
|
-
_this.redrawAllRegions();
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
TimelineService.prototype.redrawAllRegions = function () {
|
|
55
|
-
var e_1, _a;
|
|
56
|
-
// remove all regions from wavesurver
|
|
57
|
-
if (this.waveSurfer) {
|
|
58
|
-
try {
|
|
59
|
-
for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
60
|
-
var key = _c.value;
|
|
61
|
-
var region = this.waveSurfer.regions.list[key];
|
|
62
|
-
region.remove();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
66
|
-
finally {
|
|
67
|
-
try {
|
|
68
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
69
|
-
}
|
|
70
|
-
finally { if (e_1) throw e_1.error; }
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
// draw all regions
|
|
74
|
-
this.drawAllRegions();
|
|
75
|
-
};
|
|
76
|
-
TimelineService.prototype.pad = function (num, size) {
|
|
77
|
-
if (!num) {
|
|
78
|
-
num = 0;
|
|
79
|
-
}
|
|
80
|
-
var padded = num.toString();
|
|
81
|
-
while (padded.length < size) {
|
|
82
|
-
padded = '0' + padded;
|
|
83
|
-
}
|
|
84
|
-
return padded;
|
|
85
|
-
};
|
|
86
|
-
TimelineService.prototype.msToTime = function (millis, includeMillis) {
|
|
87
|
-
if (includeMillis === void 0) { includeMillis = true; }
|
|
88
|
-
var ms = Math.round(millis % 1000);
|
|
89
|
-
var seconds = Math.floor(((millis % 360000) % 60000) / 1000);
|
|
90
|
-
var minutes = Math.floor((millis % 3600000) / 60000);
|
|
91
|
-
if (includeMillis) {
|
|
92
|
-
return this.pad(minutes, 2) + ':' + this.pad(seconds, 2) + '.' + this.pad(ms, 3);
|
|
93
|
-
}
|
|
94
|
-
else {
|
|
95
|
-
return this.pad(minutes, 2) + ':' + this.pad(seconds, 2);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
TimelineService.prototype.updateCurrentTime = function () {
|
|
99
|
-
var _this = this;
|
|
100
|
-
if (!this.waveSurfer) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
// display the current time
|
|
104
|
-
this.currentTime = this.msToTime(this.waveSurfer.getCurrentTime() * 1000);
|
|
105
|
-
if (!this.waveSurfer.timeline.drawer) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
// draw the current cursor on the timeline
|
|
109
|
-
// TODO redrawing the timeline each update is way to expensive.
|
|
110
|
-
// maybe as a better solution use an element, like the cursor inside Wavesurfer to
|
|
111
|
-
// display the progress?
|
|
112
|
-
var x = 0;
|
|
113
|
-
var duration = this.waveSurfer.backend.getDuration();
|
|
114
|
-
var width = this.waveSurfer.params.fillParent && !this.waveSurfer.params.scrollParent
|
|
115
|
-
? this.waveSurfer.timeline.drawer.getWidth()
|
|
116
|
-
: this.waveSurfer.timeline.drawer.wrapper.scrollWidth * this.waveSurfer.params.pixelRatio;
|
|
117
|
-
x = (width / duration) * this.waveSurfer.getCurrentTime() - 2;
|
|
118
|
-
// update the timeline canvas
|
|
119
|
-
this.waveSurfer.timeline.render();
|
|
120
|
-
// draw the cursor on the timeline
|
|
121
|
-
this.waveSurfer.timeline.canvases.forEach(function (canvas, i) {
|
|
122
|
-
var leftOffset = i * _this.waveSurfer.timeline.maxCanvasWidth;
|
|
123
|
-
var ctx = canvas.getContext('2d');
|
|
124
|
-
ctx.fillStyle = '#fd7e14';
|
|
125
|
-
ctx.beginPath();
|
|
126
|
-
ctx.moveTo(x - 12 - leftOffset, 20);
|
|
127
|
-
ctx.lineTo(x + 12 - leftOffset, 20);
|
|
128
|
-
ctx.lineTo(x - leftOffset, 45);
|
|
129
|
-
ctx.fill();
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
TimelineService.prototype.startTimeUpdater = function () {
|
|
133
|
-
var _this = this;
|
|
134
|
-
this.stopTimeUpdater();
|
|
135
|
-
var timeUpdater = timer(0, 40);
|
|
136
|
-
this.timeUpdateSubscription = timeUpdater.subscribe(function () {
|
|
137
|
-
_this.updateCurrentTime();
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
TimelineService.prototype.stopTimeUpdater = function () {
|
|
141
|
-
if (this.timeUpdateSubscription) {
|
|
142
|
-
this.timeUpdateSubscription.unsubscribe();
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
TimelineService.prototype.formatTimeCallback = function (seconds, pxPerSec) {
|
|
146
|
-
if (this.selectedComposition.gridType === 'musical') {
|
|
147
|
-
return Math.round(seconds / this.selectedComposition.timeSignatureUpper / (60 / this.selectedComposition.beatsPerMinute));
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
// calculate minutes and seconds from seconds count
|
|
151
|
-
var minutes = parseInt((seconds / 60), 10);
|
|
152
|
-
seconds = parseInt((seconds % 60), 10);
|
|
153
|
-
// fill up seconds with zeroes
|
|
154
|
-
var secondsStr = seconds < 10 ? '0' + seconds : seconds;
|
|
155
|
-
return minutes + ":" + secondsStr;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
TimelineService.prototype.timeInterval = function (pxPerSec) {
|
|
159
|
-
if (this.selectedComposition.gridType === 'musical') {
|
|
160
|
-
var interval = 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;
|
|
161
|
-
if (pxPerSec < 40) {
|
|
162
|
-
return interval * 4;
|
|
163
|
-
}
|
|
164
|
-
else if (pxPerSec < 80) {
|
|
165
|
-
return interval * 2;
|
|
166
|
-
}
|
|
167
|
-
return interval;
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
if (pxPerSec >= 25) {
|
|
171
|
-
return 1;
|
|
172
|
-
}
|
|
173
|
-
else if (pxPerSec * 5 >= 25) {
|
|
174
|
-
return 5;
|
|
175
|
-
}
|
|
176
|
-
else if (pxPerSec * 15 >= 25) {
|
|
177
|
-
return 15;
|
|
178
|
-
}
|
|
179
|
-
return Math.ceil(0.5 / pxPerSec) * 60;
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
TimelineService.prototype.primaryLabelInterval = function (pxPerSec) {
|
|
183
|
-
if (this.selectedComposition.gridType === 'musical') {
|
|
184
|
-
var interval = this.selectedComposition.timeSignatureUpper * this.selectedComposition.gridResolution;
|
|
185
|
-
return interval;
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
if (pxPerSec >= 25) {
|
|
189
|
-
return 10;
|
|
190
|
-
}
|
|
191
|
-
else if (pxPerSec * 5 >= 25) {
|
|
192
|
-
return 6;
|
|
193
|
-
}
|
|
194
|
-
else if (pxPerSec * 15 >= 25) {
|
|
195
|
-
return 4;
|
|
196
|
-
}
|
|
197
|
-
return 4;
|
|
198
|
-
}
|
|
199
|
-
};
|
|
200
|
-
TimelineService.prototype.secondaryLabelInterval = function (pxPerSec) {
|
|
201
|
-
if (this.selectedComposition.gridType === 'musical') {
|
|
202
|
-
return 0;
|
|
203
|
-
}
|
|
204
|
-
else {
|
|
205
|
-
if (pxPerSec >= 25) {
|
|
206
|
-
return 5;
|
|
207
|
-
}
|
|
208
|
-
else if (pxPerSec * 5 >= 25) {
|
|
209
|
-
return 2;
|
|
210
|
-
}
|
|
211
|
-
else if (pxPerSec * 15 >= 25) {
|
|
212
|
-
return 2;
|
|
213
|
-
}
|
|
214
|
-
return 2;
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
TimelineService.prototype.seeekWithTimeline = function (e) {
|
|
218
|
-
var _this = this;
|
|
219
|
-
// taken from wavesurfer -> drawer -> handleEvent
|
|
220
|
-
var clientX = e.targetTouches ? e.targetTouches[0].clientX : e.clientX;
|
|
221
|
-
var bbox = this.waveSurfer.timeline.wrapper.getBoundingClientRect();
|
|
222
|
-
var nominalWidth = this.waveSurfer.timeline.drawer.width;
|
|
223
|
-
var parentWidth = this.waveSurfer.timeline.drawer.getWidth();
|
|
224
|
-
var progress;
|
|
225
|
-
if (!this.waveSurfer.timeline.drawer.params.fillParent && nominalWidth < parentWidth) {
|
|
226
|
-
progress =
|
|
227
|
-
(this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) *
|
|
228
|
-
(this.waveSurfer.timeline.drawer.params.pixelRatio / nominalWidth) || 0;
|
|
229
|
-
if (progress > 1) {
|
|
230
|
-
progress = 1;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
progress =
|
|
235
|
-
((this.waveSurfer.timeline.drawer.params.rtl ? bbox.right - clientX : clientX - bbox.left) +
|
|
236
|
-
this.waveSurfer.timeline.wrapper.scrollLeft) /
|
|
237
|
-
this.waveSurfer.timeline.wrapper.scrollWidth || 0;
|
|
238
|
-
}
|
|
239
|
-
progress = Math.max(progress, 0);
|
|
240
|
-
setTimeout(function () {
|
|
241
|
-
_this.waveSurfer.seekTo(progress);
|
|
242
|
-
_this.detectChanges.next();
|
|
243
|
-
_this.presetService.previewLive(_this.selectedComposition.name, Math.round(_this.waveSurfer.getCurrentTime() * 1000));
|
|
244
|
-
}, 0);
|
|
245
|
-
};
|
|
246
|
-
TimelineService.prototype.applyZoom = function (zoom) {
|
|
247
|
-
var _this = this;
|
|
248
|
-
if (zoom < 0 || zoom > 200) {
|
|
249
|
-
return;
|
|
250
|
-
}
|
|
251
|
-
this.zoom = zoom;
|
|
252
|
-
if (this.waveSurfer) {
|
|
253
|
-
setTimeout(function () {
|
|
254
|
-
_this.waveSurfer.zoom(_this.zoom);
|
|
255
|
-
_this.updateCurrentTime();
|
|
256
|
-
}, 0);
|
|
257
|
-
}
|
|
258
|
-
};
|
|
259
|
-
TimelineService.prototype.isWaveSurferReady = function () {
|
|
260
|
-
if (!this.waveSurfer) {
|
|
261
|
-
return false;
|
|
262
|
-
}
|
|
263
|
-
if (!this.waveSurfer.isReady) {
|
|
264
|
-
return false;
|
|
265
|
-
}
|
|
266
|
-
return true;
|
|
267
|
-
};
|
|
268
|
-
TimelineService.prototype.addRegion = function (waveSurferRegion) {
|
|
269
|
-
if (!this.isWaveSurferReady()) {
|
|
270
|
-
return;
|
|
271
|
-
}
|
|
272
|
-
if (!this.sceneService.selectedScenes || this.sceneService.selectedScenes.length !== 1) {
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
if (!this.selectedComposition) {
|
|
276
|
-
return;
|
|
277
|
-
}
|
|
278
|
-
var scenePlaybackRegion = new ScenePlaybackRegion();
|
|
279
|
-
scenePlaybackRegion.sceneUuid = this.sceneService.selectedScenes[0].uuid;
|
|
280
|
-
if (waveSurferRegion) {
|
|
281
|
-
scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;
|
|
282
|
-
scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
scenePlaybackRegion.startMillis = (this.waveSurfer.getDuration() * 1000) / 3;
|
|
286
|
-
scenePlaybackRegion.endMillis = ((this.waveSurfer.getDuration() * 1000) / 3) * 2;
|
|
287
|
-
}
|
|
288
|
-
this.selectedComposition.scenePlaybackRegions.push(scenePlaybackRegion);
|
|
289
|
-
this.selectedPlaybackRegion = scenePlaybackRegion;
|
|
290
|
-
if (waveSurferRegion) {
|
|
291
|
-
waveSurferRegion.color =
|
|
292
|
-
'rgba(' +
|
|
293
|
-
this.hexToRgb(this.sceneService.selectedScenes[0].color).r +
|
|
294
|
-
', ' +
|
|
295
|
-
this.hexToRgb(this.sceneService.selectedScenes[0].color).g +
|
|
296
|
-
', ' +
|
|
297
|
-
this.hexToRgb(this.sceneService.selectedScenes[0].color).b +
|
|
298
|
-
', ' +
|
|
299
|
-
this.intensityHighlighted +
|
|
300
|
-
')';
|
|
301
|
-
waveSurferRegion.attributes.selectable = true;
|
|
302
|
-
this.connectRegion(waveSurferRegion, this.sceneService.selectedScenes[0], scenePlaybackRegion);
|
|
303
|
-
this.updateRegionSelection();
|
|
304
|
-
}
|
|
305
|
-
else {
|
|
306
|
-
this.drawRegion(scenePlaybackRegion, this.sceneService.selectedScenes[0]);
|
|
307
|
-
}
|
|
308
|
-
this.presetService.previewLive();
|
|
309
|
-
};
|
|
310
|
-
TimelineService.prototype.getSnapToGridInterval = function () {
|
|
311
|
-
if (this.selectedComposition.snapToGrid) {
|
|
312
|
-
return 60 / this.selectedComposition.beatsPerMinute / this.selectedComposition.gridResolution;
|
|
313
|
-
}
|
|
314
|
-
return undefined;
|
|
315
|
-
};
|
|
316
|
-
TimelineService.prototype.getSnapToGridOffset = function () {
|
|
317
|
-
return this.selectedComposition.gridOffsetMillis / 1000;
|
|
318
|
-
};
|
|
319
|
-
TimelineService.prototype.deleteSelectedComposition = function () {
|
|
320
|
-
this.projectService.project.compositions.splice(this.selectedCompositionIndex, 1);
|
|
321
|
-
this.selectedComposition = undefined;
|
|
322
|
-
this.selectedCompositionIndex = undefined;
|
|
323
|
-
this.destroyWaveSurfer();
|
|
324
|
-
if (this.projectService.project.compositions.length > 0) {
|
|
325
|
-
this.selectCompositionIndex(0);
|
|
326
|
-
}
|
|
327
|
-
};
|
|
328
|
-
TimelineService.prototype.destroyWaveSurfer = function () {
|
|
329
|
-
this.duration = undefined;
|
|
330
|
-
this.loadingAudioFile = false;
|
|
331
|
-
if (this.waveSurfer) {
|
|
332
|
-
this.waveSurfer.destroy();
|
|
333
|
-
this.waveSurfer = undefined;
|
|
334
|
-
}
|
|
335
|
-
};
|
|
336
|
-
TimelineService.prototype.createWaveSurfer = function () {
|
|
337
|
-
var _this = this;
|
|
338
|
-
this.destroyWaveSurfer();
|
|
339
|
-
if (!this.selectedComposition.audioFileName) {
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
this.loadingAudioFile = true;
|
|
343
|
-
setTimeout(function () {
|
|
344
|
-
_this.waveSurfer = WaveSurfer.create({
|
|
345
|
-
container: '#waveform',
|
|
346
|
-
waveColor: 'white',
|
|
347
|
-
progressColor: 'white',
|
|
348
|
-
// barWidth: 2,
|
|
349
|
-
height: 1,
|
|
350
|
-
interact: false,
|
|
351
|
-
// Use for timelines without sound. Wave will be displayed
|
|
352
|
-
// wrong, but should work for a dummy audio without any waves.
|
|
353
|
-
// duration: 400,
|
|
354
|
-
plugins: [
|
|
355
|
-
CursorPlugin.create({
|
|
356
|
-
// showTime: true,
|
|
357
|
-
opacity: 1,
|
|
358
|
-
color: '#fd7e14',
|
|
359
|
-
hideOnBlur: false /* don't show/hide the cursor on the wave (only on the timeline) */,
|
|
360
|
-
}),
|
|
361
|
-
RegionsPlugin.create({
|
|
362
|
-
dragSelection: {
|
|
363
|
-
slop: 5,
|
|
364
|
-
},
|
|
365
|
-
color: '#fff',
|
|
366
|
-
snapToGridInterval: _this.getSnapToGridInterval(),
|
|
367
|
-
snapToGridOffset: _this.getSnapToGridOffset(),
|
|
368
|
-
}),
|
|
369
|
-
TimeLinePlugin.create({
|
|
370
|
-
container: '#waveform-timeline',
|
|
371
|
-
primaryFontColor: '#fff',
|
|
372
|
-
secondaryFontColor: '#fff',
|
|
373
|
-
offset: _this.getSnapToGridOffset(),
|
|
374
|
-
formatTimeCallback: _this.formatTimeCallback.bind(_this),
|
|
375
|
-
timeInterval: _this.timeInterval.bind(_this),
|
|
376
|
-
primaryLabelInterval: _this.primaryLabelInterval.bind(_this),
|
|
377
|
-
secondaryLabelInterval: _this.secondaryLabelInterval.bind(_this),
|
|
378
|
-
}),
|
|
379
|
-
],
|
|
380
|
-
});
|
|
381
|
-
var audioFileName;
|
|
382
|
-
if (_this.configService.enableMediaLibrary) {
|
|
383
|
-
// the file name is also used for the real file name
|
|
384
|
-
audioFileName = 'file/get?name=' + _this.selectedComposition.audioFileName + '&type=AUDIO';
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
// the composition uuid and extension is used as the file name
|
|
388
|
-
audioFileName =
|
|
389
|
-
'composition-files/?file=' +
|
|
390
|
-
_this.selectedComposition.uuid +
|
|
391
|
-
'.' +
|
|
392
|
-
_this.selectedComposition.audioFileName.substr(_this.selectedComposition.audioFileName.lastIndexOf('.') + 1);
|
|
393
|
-
}
|
|
394
|
-
_this.waveSurfer.load(_this.configService.restUrl + audioFileName);
|
|
395
|
-
_this.waveSurfer.on('ready', function () {
|
|
396
|
-
setTimeout(function () {
|
|
397
|
-
// try guessing the bpm and offset from the file, if necessary
|
|
398
|
-
if (_this.selectedComposition.tempoGuessed) {
|
|
399
|
-
// we already guessed the BPM of this file --> don't do it again
|
|
400
|
-
_this.loadingAudioFile = false;
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
// we have not yet guessed the BPM --> do it now
|
|
404
|
-
_this.selectedComposition.tempoGuessed = true;
|
|
405
|
-
guess(_this.waveSurfer.backend.buffer)
|
|
406
|
-
.then(function (_a) {
|
|
407
|
-
var bpm = _a.bpm, offset = _a.offset;
|
|
408
|
-
// the bpm and offset could be guessed
|
|
409
|
-
_this.selectedComposition.beatsPerMinute = bpm;
|
|
410
|
-
_this.selectedComposition.gridOffsetMillis = offset * 1000;
|
|
411
|
-
_this.loadingAudioFile = false;
|
|
412
|
-
})
|
|
413
|
-
.catch(function (err) {
|
|
414
|
-
// something went wrong
|
|
415
|
-
console.error('Could not detect the BPM from the audio file', err);
|
|
416
|
-
_this.loadingAudioFile = false;
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
_this.duration = _this.msToTime(_this.waveSurfer.getDuration() * 1000);
|
|
420
|
-
_this.drawAllRegions();
|
|
421
|
-
// scroll wavesurfer in sync with the timeline
|
|
422
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('scroll', function () {
|
|
423
|
-
_this.waveSurfer.drawer.wrapper.scrollLeft = _this.waveSurfer.timeline.wrapper.scrollLeft;
|
|
424
|
-
// Set the scroll position of the timeline to the same position as the wavesurfer,
|
|
425
|
-
// because the timeline is larger than wavesurfer and might get out of sync.
|
|
426
|
-
// This way, if wavesurfer cannot scroll any further, we reset the position
|
|
427
|
-
// of the timeline as well.
|
|
428
|
-
_this.waveSurfer.timeline.wrapper.scrollLeft = _this.waveSurfer.drawer.wrapper.scrollLeft;
|
|
429
|
-
});
|
|
430
|
-
// display the cursor also on the timeline
|
|
431
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mouseenter', function () {
|
|
432
|
-
_this.waveSurfer.cursor.showCursor();
|
|
433
|
-
});
|
|
434
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mouseleave', function () {
|
|
435
|
-
_this.waveSurfer.cursor.hideCursor();
|
|
436
|
-
});
|
|
437
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mousemove', function (e) {
|
|
438
|
-
var bbox = _this.waveSurfer.container.getBoundingClientRect();
|
|
439
|
-
var x = e.clientX - bbox.left;
|
|
440
|
-
_this.waveSurfer.cursor.updateCursorPosition(x, 0);
|
|
441
|
-
});
|
|
442
|
-
// hide the cursor on the wave initially. in combination with the param hideOnBlur = false,
|
|
443
|
-
// it will never be displayed on the wave now. we handle it on the timeline only.
|
|
444
|
-
_this.waveSurfer.cursor.hideCursor();
|
|
445
|
-
// seek on timeline-click
|
|
446
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mousedown', function (e) {
|
|
447
|
-
_this.timelineClicking = true;
|
|
448
|
-
_this.seeekWithTimeline(e);
|
|
449
|
-
});
|
|
450
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mousemove', function (e) {
|
|
451
|
-
if (_this.timelineClicking) {
|
|
452
|
-
_this.seeekWithTimeline(e);
|
|
453
|
-
}
|
|
454
|
-
});
|
|
455
|
-
_this.waveSurfer.timeline.wrapper.addEventListener('mouseup', function (e) {
|
|
456
|
-
_this.timelineClicking = false;
|
|
457
|
-
});
|
|
458
|
-
_this.updateCurrentTime();
|
|
459
|
-
_this.detectChanges.next();
|
|
460
|
-
_this.waveSurferReady.next();
|
|
461
|
-
}, 0);
|
|
462
|
-
});
|
|
463
|
-
_this.waveSurfer.on('error', function (error) {
|
|
464
|
-
// could not load the composition --> delete it
|
|
465
|
-
// (this may occur, when the composition has been deleted but the project is not saved afterwards)
|
|
466
|
-
_this.deleteSelectedComposition();
|
|
467
|
-
});
|
|
468
|
-
_this.waveSurfer.on('seek', function () {
|
|
469
|
-
_this.updateCurrentTime();
|
|
470
|
-
});
|
|
471
|
-
_this.waveSurfer.on('play', function () {
|
|
472
|
-
_this.startTimeUpdater();
|
|
473
|
-
});
|
|
474
|
-
_this.waveSurfer.on('pause', function () {
|
|
475
|
-
_this.stopTimeUpdater();
|
|
476
|
-
});
|
|
477
|
-
_this.waveSurfer.on('region-created', function (region) {
|
|
478
|
-
// region created by selection or programmatically
|
|
479
|
-
if (_this.sceneService.selectedScenes && _this.sceneService.selectedScenes.length === 1) {
|
|
480
|
-
if (!region.data.handled) {
|
|
481
|
-
_this.addRegion(region);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
else {
|
|
485
|
-
if (!region.data.handled) {
|
|
486
|
-
region.remove();
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
});
|
|
490
|
-
_this.waveSurfer.on('region-updated', function (region) {
|
|
491
|
-
_this.detectChanges.next();
|
|
492
|
-
_this.presetService.previewLive();
|
|
493
|
-
});
|
|
494
|
-
}, 0);
|
|
495
|
-
};
|
|
496
|
-
TimelineService.prototype.hexToRgb = function (hex) {
|
|
497
|
-
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
498
|
-
return result
|
|
499
|
-
? {
|
|
500
|
-
r: parseInt(result[1], 16),
|
|
501
|
-
g: parseInt(result[2], 16),
|
|
502
|
-
b: parseInt(result[3], 16),
|
|
503
|
-
}
|
|
504
|
-
: null;
|
|
505
|
-
};
|
|
506
|
-
TimelineService.prototype.updateRegionSelection = function () {
|
|
507
|
-
var e_2, _a;
|
|
508
|
-
if (!this.waveSurfer) {
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
try {
|
|
512
|
-
for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
513
|
-
var key = _c.value;
|
|
514
|
-
var region = this.waveSurfer.regions.list[key];
|
|
515
|
-
// if no scene is set, the region is not valid (e.g. has been created, while
|
|
516
|
-
// no scene has been selected and remove did not work properly)
|
|
517
|
-
if (region.scene) {
|
|
518
|
-
var intensity = this.intensity;
|
|
519
|
-
region.drag = false;
|
|
520
|
-
region.resize = false;
|
|
521
|
-
region.attributes.selectable = false;
|
|
522
|
-
if (this.sceneService.sceneIsSelected(region.scene)) {
|
|
523
|
-
intensity = this.intensitySelectedScene;
|
|
524
|
-
region.drag = true;
|
|
525
|
-
region.resize = true;
|
|
526
|
-
region.attributes.selectable = true;
|
|
527
|
-
}
|
|
528
|
-
region.attributes.selected = false;
|
|
529
|
-
if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === region.scenePlaybackRegion) {
|
|
530
|
-
intensity = this.intensityHighlighted;
|
|
531
|
-
region.attributes.selected = true;
|
|
532
|
-
}
|
|
533
|
-
region.color =
|
|
534
|
-
'rgba(' +
|
|
535
|
-
this.hexToRgb(region.scene.color).r +
|
|
536
|
-
', ' +
|
|
537
|
-
this.hexToRgb(region.scene.color).g +
|
|
538
|
-
', ' +
|
|
539
|
-
this.hexToRgb(region.scene.color).b +
|
|
540
|
-
', ' +
|
|
541
|
-
intensity +
|
|
542
|
-
')';
|
|
543
|
-
region.updateRender();
|
|
544
|
-
}
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
548
|
-
finally {
|
|
549
|
-
try {
|
|
550
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
551
|
-
}
|
|
552
|
-
finally { if (e_2) throw e_2.error; }
|
|
553
|
-
}
|
|
554
|
-
};
|
|
555
|
-
TimelineService.prototype.updateSelectedRegion = function () {
|
|
556
|
-
var e_3, _a;
|
|
557
|
-
if (!this.waveSurfer) {
|
|
558
|
-
return;
|
|
559
|
-
}
|
|
560
|
-
if (!this.selectedPlaybackRegion) {
|
|
561
|
-
return;
|
|
562
|
-
}
|
|
563
|
-
try {
|
|
564
|
-
for (var _b = __values(Object.keys(this.waveSurfer.regions.list)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
565
|
-
var key = _c.value;
|
|
566
|
-
var region = this.waveSurfer.regions.list[key];
|
|
567
|
-
if (this.selectedPlaybackRegion === region.scenePlaybackRegion) {
|
|
568
|
-
region.start = this.selectedPlaybackRegion.startMillis / 1000;
|
|
569
|
-
region.end = this.selectedPlaybackRegion.endMillis / 1000;
|
|
570
|
-
region.updateRender();
|
|
571
|
-
break;
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
}
|
|
575
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
576
|
-
finally {
|
|
577
|
-
try {
|
|
578
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
579
|
-
}
|
|
580
|
-
finally { if (e_3) throw e_3.error; }
|
|
581
|
-
}
|
|
582
|
-
};
|
|
583
|
-
TimelineService.prototype.setSelectedRegion = function (scenePlaybackRegion) {
|
|
584
|
-
if (this.selectedPlaybackRegion && this.selectedPlaybackRegion === scenePlaybackRegion) {
|
|
585
|
-
// No update required
|
|
586
|
-
return;
|
|
587
|
-
}
|
|
588
|
-
if (scenePlaybackRegion) {
|
|
589
|
-
this.selectedPlaybackRegion = scenePlaybackRegion;
|
|
590
|
-
}
|
|
591
|
-
this.updateRegionSelection();
|
|
592
|
-
};
|
|
593
|
-
TimelineService.prototype.getRegionSnapToGridValue = function (value) {
|
|
594
|
-
// the regions should snap to a grid
|
|
595
|
-
var offset = this.getSnapToGridOffset() || 0;
|
|
596
|
-
var interval = this.getSnapToGridInterval() || 0;
|
|
597
|
-
return Math.round((value - offset) / interval) * interval + offset;
|
|
598
|
-
};
|
|
599
|
-
TimelineService.prototype.connectRegion = function (waveSurferRegion, scene, scenePlaybackRegion, preset) {
|
|
600
|
-
var _this = this;
|
|
601
|
-
waveSurferRegion.scenePlaybackRegion = scenePlaybackRegion;
|
|
602
|
-
waveSurferRegion.scene = scene;
|
|
603
|
-
waveSurferRegion.preset = preset;
|
|
604
|
-
waveSurferRegion.on('click', function (event) {
|
|
605
|
-
if (_this.sceneService.sceneIsSelected(scene)) {
|
|
606
|
-
_this.setSelectedRegion(scenePlaybackRegion);
|
|
607
|
-
}
|
|
608
|
-
});
|
|
609
|
-
waveSurferRegion.on('update', function () {
|
|
610
|
-
_this.setSelectedRegion(scenePlaybackRegion);
|
|
611
|
-
if (_this.selectedComposition.snapToGrid) {
|
|
612
|
-
// update the regions boundaries. they may not snap to grid, if it has been
|
|
613
|
-
// disabled during creation of the region but activated afterwards.
|
|
614
|
-
waveSurferRegion.start = _this.getRegionSnapToGridValue(waveSurferRegion.start);
|
|
615
|
-
waveSurferRegion.end = _this.getRegionSnapToGridValue(waveSurferRegion.end);
|
|
616
|
-
}
|
|
617
|
-
scenePlaybackRegion.startMillis = waveSurferRegion.start * 1000;
|
|
618
|
-
scenePlaybackRegion.endMillis = waveSurferRegion.end * 1000;
|
|
619
|
-
});
|
|
620
|
-
};
|
|
621
|
-
TimelineService.prototype.drawRegion = function (scenePlaybackRegion, scene) {
|
|
622
|
-
// draw the regions of the currently selected scene
|
|
623
|
-
if (!this.isWaveSurferReady()) {
|
|
624
|
-
return;
|
|
625
|
-
}
|
|
626
|
-
// add the playback region
|
|
627
|
-
var waveSurferRegion = this.waveSurfer.addRegion({
|
|
628
|
-
start: scenePlaybackRegion.startMillis / 1000,
|
|
629
|
-
end: scenePlaybackRegion.endMillis / 1000,
|
|
630
|
-
color: '#fff',
|
|
631
|
-
data: { handled: true },
|
|
632
|
-
});
|
|
633
|
-
this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion);
|
|
634
|
-
// TODO show the all presets
|
|
635
|
-
// for (let presetUuid of scene.presetUuids) {
|
|
636
|
-
// const preset = this.presetService.getPresetByUuid(presetUuid);
|
|
637
|
-
// let waveSurferRegion = this.timelineService.waveSurfer.addRegion({
|
|
638
|
-
// start: (scenePlaybackRegion.startMillis + (preset.startMillis ? preset.startMillis : 0)) / 1000,
|
|
639
|
-
// end: (scenePlaybackRegion.startMillis
|
|
640
|
-
// + (preset.endMillis ? preset.endMillis : scenePlaybackRegion.endMillis - scenePlaybackRegion.startMillis)) / 1000,
|
|
641
|
-
// color: '#fff',
|
|
642
|
-
// data: { handled: true },
|
|
643
|
-
// // TODO
|
|
644
|
-
// attributes: {
|
|
645
|
-
// preset: true,
|
|
646
|
-
// name: 'Preset 1'
|
|
647
|
-
// }
|
|
648
|
-
// });
|
|
649
|
-
// this.connectRegion(waveSurferRegion, scene, scenePlaybackRegion, preset);
|
|
650
|
-
// }
|
|
651
|
-
this.updateRegionSelection();
|
|
652
|
-
};
|
|
653
|
-
TimelineService.prototype.removeRegion = function () {
|
|
654
|
-
var e_4, _a;
|
|
655
|
-
if (!this.selectedPlaybackRegion) {
|
|
656
|
-
return;
|
|
657
|
-
}
|
|
658
|
-
if (this.sceneService.selectedScenes.length !== 1) {
|
|
659
|
-
return;
|
|
660
|
-
}
|
|
661
|
-
for (var i = 0; i < this.selectedComposition.scenePlaybackRegions.length; i++) {
|
|
662
|
-
if (this.selectedComposition.scenePlaybackRegions[i] === this.selectedPlaybackRegion) {
|
|
663
|
-
try {
|
|
664
|
-
// remove the region from wavesurfer
|
|
665
|
-
for (var _b = (e_4 = void 0, __values(Object.keys(this.waveSurfer.regions.list))), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
666
|
-
var key = _c.value;
|
|
667
|
-
var region = this.waveSurfer.regions.list[key];
|
|
668
|
-
if (region.scenePlaybackRegion === this.selectedPlaybackRegion) {
|
|
669
|
-
region.remove();
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
674
|
-
finally {
|
|
675
|
-
try {
|
|
676
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
677
|
-
}
|
|
678
|
-
finally { if (e_4) throw e_4.error; }
|
|
679
|
-
}
|
|
680
|
-
this.selectedPlaybackRegion = undefined;
|
|
681
|
-
this.selectedComposition.scenePlaybackRegions.splice(i, 1);
|
|
682
|
-
return;
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
this.presetService.previewLive();
|
|
686
|
-
};
|
|
687
|
-
TimelineService.prototype.getPresetsInTime = function (timeMillis) {
|
|
688
|
-
var e_5, _a, e_6, _b;
|
|
689
|
-
// Return all presets which should be active during the specified time
|
|
690
|
-
var activePresets = [];
|
|
691
|
-
for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
|
|
692
|
-
var scene = this.projectService.project.scenes[sceneIndex];
|
|
693
|
-
try {
|
|
694
|
-
for (var _c = (e_5 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
695
|
-
var region = _d.value;
|
|
696
|
-
if (region.sceneUuid === scene.uuid) {
|
|
697
|
-
for (var presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {
|
|
698
|
-
try {
|
|
699
|
-
for (var _e = (e_6 = void 0, __values(scene.presetUuids)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
700
|
-
var presetUuid = _f.value;
|
|
701
|
-
if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {
|
|
702
|
-
var preset = this.presetService.getPresetByUuid(presetUuid);
|
|
703
|
-
if (preset) {
|
|
704
|
-
var presetStartMillis = preset.startMillis === undefined ? region.startMillis : region.startMillis + preset.startMillis;
|
|
705
|
-
var presetEndMillis = preset.endMillis === undefined ? region.endMillis : region.startMillis + preset.endMillis;
|
|
706
|
-
// extend the running time, if fading is done outside the boundaries
|
|
707
|
-
presetStartMillis -= preset.fadeInPre ? preset.fadeInMillis : 0;
|
|
708
|
-
presetEndMillis += preset.fadeOutPost ? preset.fadeOutMillis : 0;
|
|
709
|
-
if (presetStartMillis <= timeMillis && presetEndMillis >= timeMillis) {
|
|
710
|
-
activePresets.push(new PresetRegionScene(preset, region, scene));
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
717
|
-
finally {
|
|
718
|
-
try {
|
|
719
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
720
|
-
}
|
|
721
|
-
finally { if (e_6) throw e_6.error; }
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
728
|
-
finally {
|
|
729
|
-
try {
|
|
730
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
731
|
-
}
|
|
732
|
-
finally { if (e_5) throw e_5.error; }
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
return activePresets;
|
|
736
|
-
};
|
|
737
|
-
TimelineService.prototype.drawAllRegions = function () {
|
|
738
|
-
var e_7, _a, e_8, _b;
|
|
739
|
-
if (!this.selectedComposition) {
|
|
740
|
-
return;
|
|
741
|
-
}
|
|
742
|
-
// draw the regions in the same order as their corresponding scenes, but draw
|
|
743
|
-
// the selected ones last, to make sure they're always clickable.
|
|
744
|
-
for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
|
|
745
|
-
var scene = this.projectService.project.scenes[sceneIndex];
|
|
746
|
-
if (!this.sceneService.sceneIsSelected(scene)) {
|
|
747
|
-
try {
|
|
748
|
-
for (var _c = (e_7 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
749
|
-
var scenePlaybackRegion = _d.value;
|
|
750
|
-
if (scenePlaybackRegion.sceneUuid === scene.uuid) {
|
|
751
|
-
this.drawRegion(scenePlaybackRegion, scene);
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
756
|
-
finally {
|
|
757
|
-
try {
|
|
758
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
759
|
-
}
|
|
760
|
-
finally { if (e_7) throw e_7.error; }
|
|
761
|
-
}
|
|
762
|
-
}
|
|
763
|
-
}
|
|
764
|
-
// draw all selected scenes afterwards
|
|
765
|
-
for (var sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
|
|
766
|
-
var scene = this.projectService.project.scenes[sceneIndex];
|
|
767
|
-
if (this.sceneService.sceneIsSelected(scene)) {
|
|
768
|
-
try {
|
|
769
|
-
for (var _e = (e_8 = void 0, __values(this.selectedComposition.scenePlaybackRegions)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
770
|
-
var scenePlaybackRegion = _f.value;
|
|
771
|
-
if (scenePlaybackRegion.sceneUuid === scene.uuid) {
|
|
772
|
-
this.drawRegion(scenePlaybackRegion, scene);
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
777
|
-
finally {
|
|
778
|
-
try {
|
|
779
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
780
|
-
}
|
|
781
|
-
finally { if (e_8) throw e_8.error; }
|
|
782
|
-
}
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
};
|
|
786
|
-
TimelineService.prototype.updateGrid = function () {
|
|
787
|
-
if (this.waveSurferReady) {
|
|
788
|
-
this.waveSurfer.timeline.params.offset = this.getSnapToGridOffset();
|
|
789
|
-
this.waveSurfer.regions.params.snapToGridInterval = this.getSnapToGridInterval();
|
|
790
|
-
this.waveSurfer.regions.params.snapToGridOffset = this.getSnapToGridOffset();
|
|
791
|
-
}
|
|
792
|
-
this.updateCurrentTime();
|
|
793
|
-
};
|
|
794
|
-
TimelineService.prototype.getExternalCompositionNames = function () {
|
|
795
|
-
// get available compositions from an external pool (e.g. Rocket Show)
|
|
796
|
-
return this.http.get('composition/list').pipe(map(function (response) {
|
|
797
|
-
var e_9, _a;
|
|
798
|
-
var compositionNames = [];
|
|
799
|
-
try {
|
|
800
|
-
for (var response_1 = __values(response), response_1_1 = response_1.next(); !response_1_1.done; response_1_1 = response_1.next()) {
|
|
801
|
-
var responseComposition = response_1_1.value;
|
|
802
|
-
compositionNames.push(responseComposition.name);
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
806
|
-
finally {
|
|
807
|
-
try {
|
|
808
|
-
if (response_1_1 && !response_1_1.done && (_a = response_1.return)) _a.call(response_1);
|
|
809
|
-
}
|
|
810
|
-
finally { if (e_9) throw e_9.error; }
|
|
811
|
-
}
|
|
812
|
-
return compositionNames;
|
|
813
|
-
}));
|
|
814
|
-
};
|
|
815
|
-
TimelineService.prototype.selectCompositionIndex = function (index) {
|
|
816
|
-
this.selectedComposition = this.projectService.project.compositions[index];
|
|
817
|
-
this.selectedCompositionIndex = index;
|
|
818
|
-
this.projectService.project.selectedCompositionUuid = this.selectedComposition.uuid;
|
|
819
|
-
this.createWaveSurfer();
|
|
820
|
-
// required to trigger timeline.component.resize()
|
|
821
|
-
this.waveSurferReady.next();
|
|
822
|
-
this.applyZoom(0);
|
|
823
|
-
};
|
|
824
|
-
TimelineService.ctorParameters = function () { return [
|
|
825
|
-
{ type: SceneService },
|
|
826
|
-
{ type: PresetService },
|
|
827
|
-
{ type: ProjectService },
|
|
828
|
-
{ type: HttpClient },
|
|
829
|
-
{ type: ConfigService }
|
|
830
|
-
]; };
|
|
831
|
-
TimelineService.ɵprov = i0.ɵɵdefineInjectable({ factory: function TimelineService_Factory() { return new TimelineService(i0.ɵɵinject(i1.SceneService), i0.ɵɵinject(i2.PresetService), i0.ɵɵinject(i3.ProjectService), i0.ɵɵinject(i4.HttpClient), i0.ɵɵinject(i5.ConfigService)); }, token: TimelineService, providedIn: "root" });
|
|
832
|
-
TimelineService = __decorate([
|
|
833
|
-
Injectable({
|
|
834
|
-
providedIn: 'root',
|
|
835
|
-
}),
|
|
836
|
-
__metadata("design:paramtypes", [SceneService,
|
|
837
|
-
PresetService,
|
|
838
|
-
ProjectService,
|
|
839
|
-
HttpClient,
|
|
840
|
-
ConfigService])
|
|
841
|
-
], TimelineService);
|
|
842
|
-
return TimelineService;
|
|
843
|
-
}());
|
|
844
|
-
export { TimelineService };
|
|
845
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Byb2NrZXRzaG93L2Rlc2lnbmVyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL3RpbWVsaW5lLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBYyxPQUFPLEVBQWdCLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sWUFBWSxNQUFNLG9EQUFvRCxDQUFDO0FBQzlFLE9BQU8sYUFBYSxNQUFNLHFEQUFxRCxDQUFDO0FBQ2hGLE9BQU8sY0FBYyxNQUFNLHNEQUFzRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUdoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7Ozs7QUFLL0M7SUEwQkUseUJBQ1UsWUFBMEIsRUFDMUIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsSUFBZ0IsRUFDaEIsYUFBNEI7UUFMdEMsaUJBaUJDO1FBaEJTLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGtCQUFhLEdB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QWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IFdhdmVTdXJmZXIgZnJvbSAnd2F2ZXN1cmZlci5qcyc7XG5pbXBvcnQgQ3Vyc29yUGx1Z2luIGZyb20gJ3dhdmVzdXJmZXIuanMvZGlzdC9wbHVnaW4vd2F2ZXN1cmZlci5jdXJzb3IubWluLmpzJztcbmltcG9ydCBSZWdpb25zUGx1Z2luIGZyb20gJ3dhdmVzdXJmZXIuanMvZGlzdC9wbHVnaW4vd2F2ZXN1cmZlci5yZWdpb25zLm1pbi5qcyc7XG5pbXBvcnQgVGltZUxpbmVQbHVnaW4gZnJvbSAnd2F2ZXN1cmZlci5qcy9kaXN0L3BsdWdpbi93YXZlc3VyZmVyLnRpbWVsaW5lLm1pbi5qcyc7XG5pbXBvcnQgeyBndWVzcyB9IGZyb20gJ3dlYi1hdWRpby1iZWF0LWRldGVjdG9yJztcbmltcG9ydCB7IENvbXBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL2NvbXBvc2l0aW9uJztcbmltcG9ydCB7IFByZXNldCB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQnO1xuaW1wb3J0IHsgUHJlc2V0UmVnaW9uU2NlbmUgfSBmcm9tICcuLi9tb2RlbHMvcHJlc2V0LXJlZ2lvbi1zY2VuZSc7XG5pbXBvcnQgeyBTY2VuZSB9IGZyb20gJy4uL21vZGVscy9zY2VuZSc7XG5pbXBvcnQgeyBTY2VuZVBsYXliYWNrUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3NjZW5lLXBsYXliYWNrLXJlZ2lvbic7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi9wcmVzZXQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9qZWN0U2VydmljZSB9IGZyb20gJy4vcHJvamVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IFNjZW5lU2VydmljZSB9IGZyb20gJy4vc2NlbmUuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBUaW1lbGluZVNlcnZpY2Uge1xuICBwdWJsaWMgd2F2ZVN1cmZlcjogV2F2ZVN1cmZlcjtcbiAgcHVibGljIHBsYXlTdGF0ZSA9ICdwYXVzZWQnO1xuXG4gIHB1YmxpYyB6b29tID0gMDtcbiAgcHJpdmF0ZSB0aW1lVXBkYXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHB1YmxpYyBjdXJyZW50VGltZTogc3RyaW5nO1xuICBwcml2YXRlIHRpbWVsaW5lQ2xpY2tpbmcgPSBmYWxzZTtcbiAgcHVibGljIHNlbGVjdGVkUGxheWJhY2tSZWdpb246IFNjZW5lUGxheWJhY2tSZWdpb247XG4gIHByaXZhdGUgaW50ZW5zaXR5ID0gMC4yO1xuICBwcml2YXRlIGludGVuc2l0eVNlbGVjdGVkU2NlbmUgPSAwLjQ7XG4gIHByaXZhdGUgaW50ZW5zaXR5SGlnaGxpZ2h0ZWQgPSAwLjg7XG4gIHB1YmxpYyBkdXJhdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgd2F2ZVN1cmZlclJlYWR5OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcbiAgcHVibGljIGRldGVjdENoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8vIHRoZSBjdXJyZW50IGNvbXBvc2l0aW9uXG4gIHB1YmxpYyBzZWxlY3RlZENvbXBvc2l0aW9uOiBDb21wb3NpdGlvbjtcbiAgcHVibGljIHNlbGVjdGVkQ29tcG9zaXRpb25JbmRleDogbnVtYmVyO1xuXG4gIC8vIGNhbiB3ZSBhZGQgbmV3IGNvbXBvc2l0aW9ucyBiYXNlZCBvbiBhbiBleHRlcm5hbCBwb29sIGFuZFxuICAvLyBzaG91bGQgbmV3IGNvbXBvc2l0aW9ucyBub3QgYXZhaWxhYmxlIGluIHRoaXMgcG9vbCBiZSBhZGRlZCB0aGVyZT9cbiAgcHVibGljIGV4dGVybmFsQ29tcG9zaXRpb25zQXZhaWxhYmxlID0gZmFsc2U7XG5cbiAgcHVibGljIGxvYWRpbmdBdWRpb0ZpbGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcHJlc2V0U2VydmljZTogUHJlc2V0U2VydmljZSxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3U2VsZWN0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy51cGRhdGVSZWdpb25TZWxlY3Rpb24oKTtcbiAgICB9KTtcbiAgICB0aGlzLnNjZW5lU2VydmljZS5zY2VuZURlbGV0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVkcmF3QWxsUmVnaW9ucygpO1xuICAgIH0pO1xuICAgIHRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lU2VsZWN0ZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMucmVkcmF3QWxsUmVnaW9ucygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWRyYXdBbGxSZWdpb25zKCkge1xuICAgIC8vIHJlbW92ZSBhbGwgcmVnaW9ucyBmcm9tIHdhdmVzdXJ2ZXJcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgICBjb25zdCByZWdpb246IGFueSA9IHRoaXMud2F2ZVN1cmZlci5yZWdpb25zLmxpc3Rba2V5XTtcbiAgICAgICAgcmVnaW9uLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRyYXcgYWxsIHJlZ2lvbnNcbiAgICB0aGlzLmRyYXdBbGxSZWdpb25zKCk7XG4gIH1cblxuICBwcml2YXRlIHBhZChudW06IG51bWJlciwgc2l6ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIW51bSkge1xuICAgICAgbnVtID0gMDtcbiAgICB9XG5cbiAgICBsZXQgcGFkZGVkOiBzdHJpbmcgPSBudW0udG9TdHJpbmcoKTtcbiAgICB3aGlsZSAocGFkZGVkLmxlbmd0aCA8IHNpemUpIHtcbiAgICAgIHBhZGRlZCA9ICcwJyArIHBhZGRlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFkZGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBtc1RvVGltZShtaWxsaXM6IG51bWJlciwgaW5jbHVkZU1pbGxpczogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1zOiBudW1iZXIgPSBNYXRoLnJvdW5kKG1pbGxpcyAlIDEwMDApO1xuICAgIGNvbnN0IHNlY29uZHM6IG51bWJlciA9IE1hdGguZmxvb3IoKChtaWxsaXMgJSAzNjAwMDApICUgNjAwMDApIC8gMTAwMCk7XG4gICAgY29uc3QgbWludXRlczogbnVtYmVyID0gTWF0aC5mbG9vcigobWlsbGlzICUgMzYwMDAwMCkgLyA2MDAwMCk7XG5cbiAgICBpZiAoaW5jbHVkZU1pbGxpcykge1xuICAgICAgcmV0dXJuIHRoaXMucGFkKG1pbnV0ZXMsIDIpICsgJzonICsgdGhpcy5wYWQoc2Vjb25kcywgMikgKyAnLicgKyB0aGlzLnBhZChtcywgMyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhZChtaW51dGVzLCAyKSArICc6JyArIHRoaXMucGFkKHNlY29uZHMsIDIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3VycmVudFRpbWUoKSB7XG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBkaXNwbGF5IHRoZSBjdXJyZW50IHRpbWVcbiAgICB0aGlzLmN1cnJlbnRUaW1lID0gdGhpcy5tc1RvVGltZSh0aGlzLndhdmVTdXJmZXIuZ2V0Q3VycmVudFRpbWUoKSAqIDEwMDApO1xuXG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgY3VycmVudCBjdXJzb3Igb24gdGhlIHRpbWVsaW5lXG4gICAgLy8gVE9ETyByZWRyYXdpbmcgdGhlIHRpbWVsaW5lIGVhY2ggdXBkYXRlIGlzIHdheSB0byBleHBlbnNpdmUuXG4gICAgLy8gbWF5YmUgYXMgYSBiZXR0ZXIgc29sdXRpb24gdXNlIGFuIGVsZW1lbnQsIGxpa2UgdGhlIGN1cnNvciBpbnNpZGUgV2F2ZXN1cmZlciB0b1xuICAgIC8vIGRpc3BsYXkgdGhlIHByb2dyZXNzP1xuICAgIGxldCB4ID0gMDtcbiAgICBjb25zdCBkdXJhdGlvbjogbnVtYmVyID0gdGhpcy53YXZlU3VyZmVyLmJhY2tlbmQuZ2V0RHVyYXRpb24oKTtcbiAgICBjb25zdCB3aWR0aDogbnVtYmVyID1cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5wYXJhbXMuZmlsbFBhcmVudCAmJiAhdGhpcy53YXZlU3VyZmVyLnBhcmFtcy5zY3JvbGxQYXJlbnRcbiAgICAgICAgPyB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLmdldFdpZHRoKClcbiAgICAgICAgOiB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLndyYXBwZXIuc2Nyb2xsV2lkdGggKiB0aGlzLndhdmVTdXJmZXIucGFyYW1zLnBpeGVsUmF0aW87XG5cbiAgICB4ID0gKHdpZHRoIC8gZHVyYXRpb24pICogdGhpcy53YXZlU3VyZmVyLmdldEN1cnJlbnRUaW1lKCkgLSAyO1xuXG4gICAgLy8gdXBkYXRlIHRoZSB0aW1lbGluZSBjYW52YXNcbiAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUucmVuZGVyKCk7XG5cbiAgICAvLyBkcmF3IHRoZSBjdXJzb3Igb24gdGhlIHRpbWVsaW5lXG4gICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmNhbnZhc2VzLmZvckVhY2goKGNhbnZhcywgaSkgPT4ge1xuICAgICAgY29uc3QgbGVmdE9mZnNldCA9IGkgKiB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUubWF4Q2FudmFzV2lkdGg7XG5cbiAgICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgICBjdHguZmlsbFN0eWxlID0gJyNmZDdlMTQnO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbyh4IC0gMTIgLSBsZWZ0T2Zmc2V0LCAyMCk7XG4gICAgICBjdHgubGluZVRvKHggKyAxMiAtIGxlZnRPZmZzZXQsIDIwKTtcbiAgICAgIGN0eC5saW5lVG8oeCAtIGxlZnRPZmZzZXQsIDQ1KTtcbiAgICAgIGN0eC5maWxsKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0VGltZVVwZGF0ZXIoKSB7XG4gICAgdGhpcy5zdG9wVGltZVVwZGF0ZXIoKTtcblxuICAgIGNvbnN0IHRpbWVVcGRhdGVyID0gdGltZXIoMCwgNDApO1xuICAgIHRoaXMudGltZVVwZGF0ZVN1YnNjcmlwdGlvbiA9IHRpbWVVcGRhdGVyLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRUaW1lKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lVXBkYXRlcigpIHtcbiAgICBpZiAodGhpcy50aW1lVXBkYXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnRpbWVVcGRhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBmb3JtYXRUaW1lQ2FsbGJhY2soc2Vjb25kczogbnVtYmVyLCBweFBlclNlYzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkVHlwZSA9PT0gJ211c2ljYWwnKSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChzZWNvbmRzIC8gdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnRpbWVTaWduYXR1cmVVcHBlciAvICg2MCAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5iZWF0c1Blck1pbnV0ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjYWxjdWxhdGUgbWludXRlcyBhbmQgc2Vjb25kcyBmcm9tIHNlY29uZHMgY291bnRcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUludCgoc2Vjb25kcyAvIDYwKSBhcyBhbnksIDEwKTtcbiAgICAgIHNlY29uZHMgPSBwYXJzZUludCgoc2Vjb25kcyAlIDYwKSBhcyBhbnksIDEwKTtcblxuICAgICAgLy8gZmlsbCB1cCBzZWNvbmRzIHdpdGggemVyb2VzXG4gICAgICBjb25zdCBzZWNvbmRzU3RyID0gc2Vjb25kcyA8IDEwID8gJzAnICsgc2Vjb25kcyA6IHNlY29uZHM7XG4gICAgICByZXR1cm4gYCR7bWludXRlc306JHtzZWNvbmRzU3RyfWA7XG4gICAgfVxuICB9XG5cbiAgdGltZUludGVydmFsKHB4UGVyU2VjOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRUeXBlID09PSAnbXVzaWNhbCcpIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gNjAgLyB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYmVhdHNQZXJNaW51dGUgLyB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uZ3JpZFJlc29sdXRpb247XG5cbiAgICAgIGlmIChweFBlclNlYyA8IDQwKSB7XG4gICAgICAgIHJldHVybiBpbnRlcnZhbCAqIDQ7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjIDwgODApIHtcbiAgICAgICAgcmV0dXJuIGludGVydmFsICogMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGludGVydmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHhQZXJTZWMgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNTtcbiAgICAgIH0gZWxzZSBpZiAocHhQZXJTZWMgKiAxNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gMTU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBNYXRoLmNlaWwoMC41IC8gcHhQZXJTZWMpICogNjA7XG4gICAgfVxuICB9XG5cbiAgcHJpbWFyeUxhYmVsSW50ZXJ2YWwocHhQZXJTZWM6IG51bWJlcikge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uZ3JpZFR5cGUgPT09ICdtdXNpY2FsJykge1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24udGltZVNpZ25hdHVyZVVwcGVyICogdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRSZXNvbHV0aW9uO1xuXG4gICAgICByZXR1cm4gaW50ZXJ2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChweFBlclNlYyA+PSAyNSkge1xuICAgICAgICByZXR1cm4gMTA7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNjtcbiAgICAgIH0gZWxzZSBpZiAocHhQZXJTZWMgKiAxNSA+PSAyNSkge1xuICAgICAgICByZXR1cm4gNDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDQ7XG4gICAgfVxuICB9XG5cbiAgc2Vjb25kYXJ5TGFiZWxJbnRlcnZhbChweFBlclNlYzogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkVHlwZSA9PT0gJ211c2ljYWwnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHB4UGVyU2VjID49IDI1KSB7XG4gICAgICAgIHJldHVybiA1O1xuICAgICAgfSBlbHNlIGlmIChweFBlclNlYyAqIDUgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9IGVsc2UgaWYgKHB4UGVyU2VjICogMTUgPj0gMjUpIHtcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICB9XG4gICAgICByZXR1cm4gMjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlZWVrV2l0aFRpbWVsaW5lKGU6IGFueSkge1xuICAgIC8vIHRha2VuIGZyb20gd2F2ZXN1cmZlciAtPiBkcmF3ZXIgLT4gaGFuZGxlRXZlbnRcbiAgICBjb25zdCBjbGllbnRYID0gZS50YXJnZXRUb3VjaGVzID8gZS50YXJnZXRUb3VjaGVzWzBdLmNsaWVudFggOiBlLmNsaWVudFg7XG4gICAgY29uc3QgYmJveCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3Qgbm9taW5hbFdpZHRoID0gdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmRyYXdlci53aWR0aDtcbiAgICBjb25zdCBwYXJlbnRXaWR0aCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS5kcmF3ZXIuZ2V0V2lkdGgoKTtcblxuICAgIGxldCBwcm9ncmVzczogbnVtYmVyO1xuXG4gICAgaWYgKCF0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5maWxsUGFyZW50ICYmIG5vbWluYWxXaWR0aCA8IHBhcmVudFdpZHRoKSB7XG4gICAgICBwcm9ncmVzcyA9XG4gICAgICAgICh0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5ydGwgPyBiYm94LnJpZ2h0IC0gY2xpZW50WCA6IGNsaWVudFggLSBiYm94LmxlZnQpICpcbiAgICAgICAgICAodGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLmRyYXdlci5wYXJhbXMucGl4ZWxSYXRpbyAvIG5vbWluYWxXaWR0aCkgfHwgMDtcblxuICAgICAgaWYgKHByb2dyZXNzID4gMSkge1xuICAgICAgICBwcm9ncmVzcyA9IDE7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2dyZXNzID1cbiAgICAgICAgKCh0aGlzLndhdmVTdXJmZXIudGltZWxpbmUuZHJhd2VyLnBhcmFtcy5ydGwgPyBiYm94LnJpZ2h0IC0gY2xpZW50WCA6IGNsaWVudFggLSBiYm94LmxlZnQpICtcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5zY3JvbGxMZWZ0KSAvXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuc2Nyb2xsV2lkdGggfHwgMDtcbiAgICB9XG5cbiAgICBwcm9ncmVzcyA9IE1hdGgubWF4KHByb2dyZXNzLCAwKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YXZlU3VyZmVyLnNlZWtUbyhwcm9ncmVzcyk7XG4gICAgICB0aGlzLmRldGVjdENoYW5nZXMubmV4dCgpO1xuICAgICAgdGhpcy5wcmVzZXRTZXJ2aWNlLnByZXZpZXdMaXZlKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5uYW1lLCBNYXRoLnJvdW5kKHRoaXMud2F2ZVN1cmZlci5nZXRDdXJyZW50VGltZSgpICogMTAwMCkpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgYXBwbHlab29tKHpvb206IGFueSkge1xuICAgIGlmICh6b29tIDwgMCB8fCB6b29tID4gMjAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy56b29tID0gem9vbTtcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy53YXZlU3VyZmVyLnpvb20odGhpcy56b29tKTtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc1dhdmVTdXJmZXJSZWFkeSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMud2F2ZVN1cmZlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy53YXZlU3VyZmVyLmlzUmVhZHkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFkZFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uPzogYW55KSB7XG4gICAgaWYgKCF0aGlzLmlzV2F2ZVN1cmZlclJlYWR5KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzIHx8IHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQbGF5YmFja1JlZ2lvbjogU2NlbmVQbGF5YmFja1JlZ2lvbiA9IG5ldyBTY2VuZVBsYXliYWNrUmVnaW9uKCk7XG4gICAgc2NlbmVQbGF5YmFja1JlZ2lvbi5zY2VuZVV1aWQgPSB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXS51dWlkO1xuXG4gICAgaWYgKHdhdmVTdXJmZXJSZWdpb24pIHtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgPSB3YXZlU3VyZmVyUmVnaW9uLnN0YXJ0ICogMTAwMDtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzID0gd2F2ZVN1cmZlclJlZ2lvbi5lbmQgKiAxMDAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBzY2VuZVBsYXliYWNrUmVnaW9uLnN0YXJ0TWlsbGlzID0gKHRoaXMud2F2ZVN1cmZlci5nZXREdXJhdGlvbigpICogMTAwMCkgLyAzO1xuICAgICAgc2NlbmVQbGF5YmFja1JlZ2lvbi5lbmRNaWxsaXMgPSAoKHRoaXMud2F2ZVN1cmZlci5nZXREdXJhdGlvbigpICogMTAwMCkgLyAzKSAqIDI7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNjZW5lUGxheWJhY2tSZWdpb25zLnB1c2goc2NlbmVQbGF5YmFja1JlZ2lvbik7XG5cbiAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSBzY2VuZVBsYXliYWNrUmVnaW9uO1xuXG4gICAgaWYgKHdhdmVTdXJmZXJSZWdpb24pIHtcbiAgICAgIHdhdmVTdXJmZXJSZWdpb24uY29sb3IgPVxuICAgICAgICAncmdiYSgnICtcbiAgICAgICAgdGhpcy5oZXhUb1JnYih0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXS5jb2xvcikuciArXG4gICAgICAgICcsICcgK1xuICAgICAgICB0aGlzLmhleFRvUmdiKHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzWzBdLmNvbG9yKS5nICtcbiAgICAgICAgJywgJyArXG4gICAgICAgIHRoaXMuaGV4VG9SZ2IodGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXNbMF0uY29sb3IpLmIgK1xuICAgICAgICAnLCAnICtcbiAgICAgICAgdGhpcy5pbnRlbnNpdHlIaWdobGlnaHRlZCArXG4gICAgICAgICcpJztcbiAgICAgIHdhdmVTdXJmZXJSZWdpb24uYXR0cmlidXRlcy5zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29ubmVjdFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uLCB0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lc1swXSwgc2NlbmVQbGF5YmFja1JlZ2lvbik7XG4gICAgICB0aGlzLnVwZGF0ZVJlZ2lvblNlbGVjdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRyYXdSZWdpb24oc2NlbmVQbGF5YmFja1JlZ2lvbiwgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXNbMF0pO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTbmFwVG9HcmlkSW50ZXJ2YWwoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNuYXBUb0dyaWQpIHtcbiAgICAgIHJldHVybiA2MCAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5iZWF0c1Blck1pbnV0ZSAvIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkUmVzb2x1dGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTbmFwVG9HcmlkT2Zmc2V0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5ncmlkT2Zmc2V0TWlsbGlzIC8gMTAwMDtcbiAgfVxuXG4gIGRlbGV0ZVNlbGVjdGVkQ29tcG9zaXRpb24oKSB7XG4gICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmNvbXBvc2l0aW9ucy5zcGxpY2UodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uSW5kZXgsIDEpO1xuICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb25JbmRleCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc3Ryb3lXYXZlU3VyZmVyKCk7XG4gICAgaWYgKHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5jb21wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZWxlY3RDb21wb3NpdGlvbkluZGV4KDApO1xuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lXYXZlU3VyZmVyKCkge1xuICAgIHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5sb2FkaW5nQXVkaW9GaWxlID0gZmFsc2U7XG5cbiAgICBpZiAodGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICB0aGlzLndhdmVTdXJmZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy53YXZlU3VyZmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZVdhdmVTdXJmZXIoKSB7XG4gICAgdGhpcy5kZXN0cm95V2F2ZVN1cmZlcigpO1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYXVkaW9GaWxlTmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IHRydWU7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2F2ZVN1cmZlciA9IFdhdmVTdXJmZXIuY3JlYXRlKHtcbiAgICAgICAgY29udGFpbmVyOiAnI3dhdmVmb3JtJyxcbiAgICAgICAgd2F2ZUNvbG9yOiAnd2hpdGUnLFxuICAgICAgICBwcm9ncmVzc0NvbG9yOiAnd2hpdGUnLFxuICAgICAgICAvLyBiYXJXaWR0aDogMixcbiAgICAgICAgaGVpZ2h0OiAxLFxuICAgICAgICBpbnRlcmFjdDogZmFsc2UsXG4gICAgICAgIC8vIFVzZSBmb3IgdGltZWxpbmVzIHdpdGhvdXQgc291bmQuIFdhdmUgd2lsbCBiZSBkaXNwbGF5ZWRcbiAgICAgICAgLy8gd3JvbmcsIGJ1dCBzaG91bGQgd29yayBmb3IgYSBkdW1teSBhdWRpbyB3aXRob3V0IGFueSB3YXZlcy5cbiAgICAgICAgLy8gZHVyYXRpb246IDQwMCxcbiAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgIEN1cnNvclBsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgLy8gc2hvd1RpbWU6IHRydWUsXG4gICAgICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICAgICAgY29sb3I6ICcjZmQ3ZTE0JyxcbiAgICAgICAgICAgIGhpZGVPbkJsdXI6IGZhbHNlIC8qIGRvbid0IHNob3cvaGlkZSB0aGUgY3Vyc29yIG9uIHRoZSB3YXZlIChvbmx5IG9uIHRoZSB0aW1lbGluZSkgKi8sXG4gICAgICAgICAgfSksXG4gICAgICAgICAgUmVnaW9uc1BsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgZHJhZ1NlbGVjdGlvbjoge1xuICAgICAgICAgICAgICBzbG9wOiA1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgICAgICBzbmFwVG9HcmlkSW50ZXJ2YWw6IHRoaXMuZ2V0U25hcFRvR3JpZEludGVydmFsKCksXG4gICAgICAgICAgICBzbmFwVG9HcmlkT2Zmc2V0OiB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBUaW1lTGluZVBsdWdpbi5jcmVhdGUoe1xuICAgICAgICAgICAgY29udGFpbmVyOiAnI3dhdmVmb3JtLXRpbWVsaW5lJyxcbiAgICAgICAgICAgIHByaW1hcnlGb250Q29sb3I6ICcjZmZmJyxcbiAgICAgICAgICAgIHNlY29uZGFyeUZvbnRDb2xvcjogJyNmZmYnLFxuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSxcbiAgICAgICAgICAgIGZvcm1hdFRpbWVDYWxsYmFjazogdGhpcy5mb3JtYXRUaW1lQ2FsbGJhY2suYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRpbWVJbnRlcnZhbDogdGhpcy50aW1lSW50ZXJ2YWwuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHByaW1hcnlMYWJlbEludGVydmFsOiB0aGlzLnByaW1hcnlMYWJlbEludGVydmFsLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzZWNvbmRhcnlMYWJlbEludGVydmFsOiB0aGlzLnNlY29uZGFyeUxhYmVsSW50ZXJ2YWwuYmluZCh0aGlzKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXVkaW9GaWxlTmFtZTogc3RyaW5nO1xuXG4gICAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmVuYWJsZU1lZGlhTGlicmFyeSkge1xuICAgICAgICAvLyB0aGUgZmlsZSBuYW1lIGlzIGFsc28gdXNlZCBmb3IgdGhlIHJlYWwgZmlsZSBuYW1lXG4gICAgICAgIGF1ZGlvRmlsZU5hbWUgPSAnZmlsZS9nZXQ/bmFtZT0nICsgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmF1ZGlvRmlsZU5hbWUgKyAnJnR5cGU9QVVESU8nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdGhlIGNvbXBvc2l0aW9uIHV1aWQgYW5kIGV4dGVuc2lvbiBpcyB1c2VkIGFzIHRoZSBmaWxlIG5hbWVcbiAgICAgICAgYXVkaW9GaWxlTmFtZSA9XG4gICAgICAgICAgJ2NvbXBvc2l0aW9uLWZpbGVzLz9maWxlPScgK1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi51dWlkICtcbiAgICAgICAgICAnLicgK1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5hdWRpb0ZpbGVOYW1lLnN1YnN0cih0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYXVkaW9GaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5sb2FkKHRoaXMuY29uZmlnU2VydmljZS5yZXN0VXJsICsgYXVkaW9GaWxlTmFtZSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vIHRyeSBndWVzc2luZyB0aGUgYnBtIGFuZCBvZmZzZXQgZnJvbSB0aGUgZmlsZSwgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQpIHtcbiAgICAgICAgICAgIC8vIHdlIGFscmVhZHkgZ3Vlc3NlZCB0aGUgQlBNIG9mIHRoaXMgZmlsZSAtLT4gZG9uJ3QgZG8gaXQgYWdhaW5cbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIG5vdCB5ZXQgZ3Vlc3NlZCB0aGUgQlBNIC0tPiBkbyBpdCBub3dcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi50ZW1wb0d1ZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgZ3Vlc3ModGhpcy53YXZlU3VyZmVyLmJhY2tlbmQuYnVmZmVyKVxuICAgICAgICAgICAgICAudGhlbigoeyBicG0sIG9mZnNldCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhlIGJwbSBhbmQgb2Zmc2V0IGNvdWxkIGJlIGd1ZXNzZWRcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uYmVhdHNQZXJNaW51dGUgPSBicG07XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLmdyaWRPZmZzZXRNaWxsaXMgPSBvZmZzZXQgKiAxMDAwO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IGRldGVjdCB0aGUgQlBNIGZyb20gdGhlIGF1ZGlvIGZpbGUnLCBlcnIpO1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0F1ZGlvRmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gdGhpcy5tc1RvVGltZSh0aGlzLndhdmVTdXJmZXIuZ2V0RHVyYXRpb24oKSAqIDEwMDApO1xuICAgICAgICAgIHRoaXMuZHJhd0FsbFJlZ2lvbnMoKTtcblxuICAgICAgICAgIC8vIHNjcm9sbCB3YXZlc3VyZmVyIGluIHN5bmMgd2l0aCB0aGUgdGltZWxpbmVcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLndhdmVTdXJmZXIuZHJhd2VyLndyYXBwZXIuc2Nyb2xsTGVmdCA9IHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLnNjcm9sbExlZnQ7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSB0aW1lbGluZSB0byB0aGUgc2FtZSBwb3NpdGlvbiBhcyB0aGUgd2F2ZXN1cmZlcixcbiAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIHRpbWVsaW5lIGlzIGxhcmdlciB0aGFuIHdhdmVzdXJmZXIgYW5kIG1pZ2h0IGdldCBvdXQgb2Ygc3luYy5cbiAgICAgICAgICAgIC8vIFRoaXMgd2F5LCBpZiB3YXZlc3VyZmVyIGNhbm5vdCBzY3JvbGwgYW55IGZ1cnRoZXIsIHdlIHJlc2V0IHRoZSBwb3NpdGlvblxuICAgICAgICAgICAgLy8gb2YgdGhlIHRpbWVsaW5lIGFzIHdlbGwuXG4gICAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5zY3JvbGxMZWZ0ID0gdGhpcy53YXZlU3VyZmVyLmRyYXdlci53cmFwcGVyLnNjcm9sbExlZnQ7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBkaXNwbGF5IHRoZSBjdXJzb3IgYWxzbyBvbiB0aGUgdGltZWxpbmVcbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53YXZlU3VyZmVyLmN1cnNvci5zaG93Q3Vyc29yKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci5jdXJzb3IuaGlkZUN1cnNvcigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS53cmFwcGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJib3ggPSB0aGlzLndhdmVTdXJmZXIuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgeCA9IGUuY2xpZW50WCAtIGJib3gubGVmdDtcbiAgICAgICAgICAgIHRoaXMud2F2ZVN1cmZlci5jdXJzb3IudXBkYXRlQ3Vyc29yUG9zaXRpb24oeCwgMCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBoaWRlIHRoZSBjdXJzb3Igb24gdGhlIHdhdmUgaW5pdGlhbGx5LiBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBwYXJhbSBoaWRlT25CbHVyID0gZmFsc2UsXG4gICAgICAgICAgLy8gaXQgd2lsbCBuZXZlciBiZSBkaXNwbGF5ZWQgb24gdGhlIHdhdmUgbm93LiB3ZSBoYW5kbGUgaXQgb24gdGhlIHRpbWVsaW5lIG9ubHkuXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLmN1cnNvci5oaWRlQ3Vyc29yKCk7XG5cbiAgICAgICAgICAvLyBzZWVrIG9uIHRpbWVsaW5lLWNsaWNrXG4gICAgICAgICAgdGhpcy53YXZlU3VyZmVyLnRpbWVsaW5lLndyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZUNsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VlZWtXaXRoVGltZWxpbmUoZSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy50aW1lbGluZUNsaWNraW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VlZWtXaXRoVGltZWxpbmUoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLndhdmVTdXJmZXIudGltZWxpbmUud3JhcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy50aW1lbGluZUNsaWNraW5nID0gZmFsc2U7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnVwZGF0ZUN1cnJlbnRUaW1lKCk7XG5cbiAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMubmV4dCgpO1xuICAgICAgICAgIHRoaXMud2F2ZVN1cmZlclJlYWR5Lm5leHQoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy53YXZlU3VyZmVyLm9uKCdlcnJvcicsIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIC8vIGNvdWxkIG5vdCBsb2FkIHRoZSBjb21wb3NpdGlvbiAtLT4gZGVsZXRlIGl0XG4gICAgICAgIC8vICh0aGlzIG1heSBvY2N1ciwgd2hlbiB0aGUgY29tcG9zaXRpb24gaGFzIGJlZW4gZGVsZXRlZCBidXQgdGhlIHByb2plY3QgaXMgbm90IHNhdmVkIGFmdGVyd2FyZHMpXG4gICAgICAgIHRoaXMuZGVsZXRlU2VsZWN0ZWRDb21wb3NpdGlvbigpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbignc2VlaycsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5vbigncGxheScsICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGFydFRpbWVVcGRhdGVyKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy53YXZlU3VyZmVyLm9uKCdwYXVzZScsICgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9wVGltZVVwZGF0ZXIoKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLndhdmVTdXJmZXIub24oJ3JlZ2lvbi1jcmVhdGVkJywgKHJlZ2lvbikgPT4ge1xuICAgICAgICAvLyByZWdpb24gY3JlYXRlZCBieSBzZWxlY3Rpb24gb3IgcHJvZ3JhbW1hdGljYWxseVxuICAgICAgICBpZiAodGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMgJiYgdGhpcy5zY2VuZVNlcnZpY2Uuc2VsZWN0ZWRTY2VuZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKCFyZWdpb24uZGF0YS5oYW5kbGVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZFJlZ2lvbihyZWdpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXJlZ2lvbi5kYXRhLmhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJlZ2lvbi5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLndhdmVTdXJmZXIub24oJ3JlZ2lvbi11cGRhdGVkJywgKHJlZ2lvbjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICAgICAgfSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBwcml2YXRlIGhleFRvUmdiKGhleDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG4gICAgcmV0dXJuIHJlc3VsdFxuICAgICAgPyB7XG4gICAgICAgICAgcjogcGFyc2VJbnQocmVzdWx0WzFdLCAxNiksXG4gICAgICAgICAgZzogcGFyc2VJbnQocmVzdWx0WzJdLCAxNiksXG4gICAgICAgICAgYjogcGFyc2VJbnQocmVzdWx0WzNdLCAxNiksXG4gICAgICAgIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUmVnaW9uU2VsZWN0aW9uKCkge1xuICAgIGlmICghdGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdCkpIHtcbiAgICAgIGNvbnN0IHJlZ2lvbjogYW55ID0gdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdFtrZXldO1xuXG4gICAgICAvLyBpZiBubyBzY2VuZSBpcyBzZXQsIHRoZSByZWdpb24gaXMgbm90IHZhbGlkIChlLmcuIGhhcyBiZWVuIGNyZWF0ZWQsIHdoaWxlXG4gICAgICAvLyBubyBzY2VuZSBoYXMgYmVlbiBzZWxlY3RlZCBhbmQgcmVtb3ZlIGRpZCBub3Qgd29yayBwcm9wZXJseSlcbiAgICAgIGlmIChyZWdpb24uc2NlbmUpIHtcbiAgICAgICAgbGV0IGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5O1xuXG4gICAgICAgIHJlZ2lvbi5kcmFnID0gZmFsc2U7XG4gICAgICAgIHJlZ2lvbi5yZXNpemUgPSBmYWxzZTtcbiAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0YWJsZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zY2VuZUlzU2VsZWN0ZWQocmVnaW9uLnNjZW5lKSkge1xuICAgICAgICAgIGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5U2VsZWN0ZWRTY2VuZTtcbiAgICAgICAgICByZWdpb24uZHJhZyA9IHRydWU7XG4gICAgICAgICAgcmVnaW9uLnJlc2l6ZSA9IHRydWU7XG4gICAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0YWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpb24uYXR0cmlidXRlcy5zZWxlY3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gJiYgdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uID09PSByZWdpb24uc2NlbmVQbGF5YmFja1JlZ2lvbikge1xuICAgICAgICAgIGludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5SGlnaGxpZ2h0ZWQ7XG4gICAgICAgICAgcmVnaW9uLmF0dHJpYnV0ZXMuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVnaW9uLmNvbG9yID1cbiAgICAgICAgICAncmdiYSgnICtcbiAgICAgICAgICB0aGlzLmhleFRvUmdiKHJlZ2lvbi5zY2VuZS5jb2xvcikuciArXG4gICAgICAgICAgJywgJyArXG4gICAgICAgICAgdGhpcy5oZXhUb1JnYihyZWdpb24uc2NlbmUuY29sb3IpLmcgK1xuICAgICAgICAgICcsICcgK1xuICAgICAgICAgIHRoaXMuaGV4VG9SZ2IocmVnaW9uLnNjZW5lLmNvbG9yKS5iICtcbiAgICAgICAgICAnLCAnICtcbiAgICAgICAgICBpbnRlbnNpdHkgK1xuICAgICAgICAgICcpJztcbiAgICAgICAgcmVnaW9uLnVwZGF0ZVJlbmRlcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVNlbGVjdGVkUmVnaW9uKCkge1xuICAgIGlmICghdGhpcy53YXZlU3VyZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgY29uc3QgcmVnaW9uOiBhbnkgPSB0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0W2tleV07XG5cbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPT09IHJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgICAgIHJlZ2lvbi5zdGFydCA9IHRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpcyAvIDEwMDA7XG4gICAgICAgIHJlZ2lvbi5lbmQgPSB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzIC8gMTAwMDtcbiAgICAgICAgcmVnaW9uLnVwZGF0ZVJlbmRlcigpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldFNlbGVjdGVkUmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb24/OiBTY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbiAmJiB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPT09IHNjZW5lUGxheWJhY2tSZWdpb24pIHtcbiAgICAgIC8vIE5vIHVwZGF0ZSByZXF1aXJlZFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY2VuZVBsYXliYWNrUmVnaW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSBzY2VuZVBsYXliYWNrUmVnaW9uO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlUmVnaW9uU2VsZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFJlZ2lvblNuYXBUb0dyaWRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAvLyB0aGUgcmVnaW9ucyBzaG91bGQgc25hcCB0byBhIGdyaWRcbiAgICBjb25zdCBvZmZzZXQgPSB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKSB8fCAwO1xuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5nZXRTbmFwVG9HcmlkSW50ZXJ2YWwoKSB8fCAwO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSAtIG9mZnNldCkgLyBpbnRlcnZhbCkgKiBpbnRlcnZhbCArIG9mZnNldDtcbiAgfVxuXG4gIHByaXZhdGUgY29ubmVjdFJlZ2lvbih3YXZlU3VyZmVyUmVnaW9uOiBhbnksIHNjZW5lOiBTY2VuZSwgc2NlbmVQbGF5YmFja1JlZ2lvbjogU2NlbmVQbGF5YmFja1JlZ2lvbiwgcHJlc2V0PzogUHJlc2V0KSB7XG4gICAgd2F2ZVN1cmZlclJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uID0gc2NlbmVQbGF5YmFja1JlZ2lvbjtcbiAgICB3YXZlU3VyZmVyUmVnaW9uLnNjZW5lID0gc2NlbmU7XG4gICAgd2F2ZVN1cmZlclJlZ2lvbi5wcmVzZXQgPSBwcmVzZXQ7XG5cbiAgICB3YXZlU3VyZmVyUmVnaW9uLm9uKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lSXNTZWxlY3RlZChzY2VuZSkpIHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZFJlZ2lvbihzY2VuZVBsYXliYWNrUmVnaW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdhdmVTdXJmZXJSZWdpb24ub24oJ3VwZGF0ZScsICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRSZWdpb24oc2NlbmVQbGF5YmFja1JlZ2lvbik7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNuYXBUb0dyaWQpIHtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSByZWdpb25zIGJvdW5kYXJpZXMuIHRoZXkgbWF5IG5vdCBzbmFwIHRvIGdyaWQsIGlmIGl0IGhhcyBiZWVuXG4gICAgICAgIC8vIGRpc2FibGVkIGR1cmluZyBjcmVhdGlvbiBvZiB0aGUgcmVnaW9uIGJ1dCBhY3RpdmF0ZWQgYWZ0ZXJ3YXJkcy5cbiAgICAgICAgd2F2ZVN1cmZlclJlZ2lvbi5zdGFydCA9IHRoaXMuZ2V0UmVnaW9uU25hcFRvR3JpZFZhbHVlKHdhdmVTdXJmZXJSZWdpb24uc3RhcnQpO1xuICAgICAgICB3YXZlU3VyZmVyUmVnaW9uLmVuZCA9IHRoaXMuZ2V0UmVnaW9uU25hcFRvR3JpZFZhbHVlKHdhdmVTdXJmZXJSZWdpb24uZW5kKTtcbiAgICAgIH1cbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgPSB3YXZlU3VyZmVyUmVnaW9uLnN0YXJ0ICogMTAwMDtcbiAgICAgIHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzID0gd2F2ZVN1cmZlclJlZ2lvbi5lbmQgKiAxMDAwO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3UmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb246IFNjZW5lUGxheWJhY2tSZWdpb24sIHNjZW5lOiBTY2VuZSkge1xuICAgIC8vIGRyYXcgdGhlIHJlZ2lvbnMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzY2VuZVxuICAgIGlmICghdGhpcy5pc1dhdmVTdXJmZXJSZWFkeSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWRkIHRoZSBwbGF5YmFjayByZWdpb25cbiAgICBjb25zdCB3YXZlU3VyZmVyUmVnaW9uID0gdGhpcy53YXZlU3VyZmVyLmFkZFJlZ2lvbih7XG4gICAgICBzdGFydDogc2NlbmVQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpcyAvIDEwMDAsXG4gICAgICBlbmQ6IHNjZW5lUGxheWJhY2tSZWdpb24uZW5kTWlsbGlzIC8gMTAwMCxcbiAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICBkYXRhOiB7IGhhbmRsZWQ6IHRydWUgfSxcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3RSZWdpb24od2F2ZVN1cmZlclJlZ2lvbiwgc2NlbmUsIHNjZW5lUGxheWJhY2tSZWdpb24pO1xuXG4gICAgLy8gVE9ETyBzaG93IHRoZSBhbGwgcHJlc2V0c1xuICAgIC8vIGZvciAobGV0IHByZXNldFV1aWQgb2Ygc2NlbmUucHJlc2V0VXVpZHMpIHtcbiAgICAvLyAgIGNvbnN0IHByZXNldCA9IHRoaXMucHJlc2V0U2VydmljZS5nZXRQcmVzZXRCeVV1aWQocHJlc2V0VXVpZCk7XG5cbiAgICAvLyAgIGxldCB3YXZlU3VyZmVyUmVnaW9uID0gdGhpcy50aW1lbGluZVNlcnZpY2Uud2F2ZVN1cmZlci5hZGRSZWdpb24oe1xuICAgIC8vICAgICBzdGFydDogKHNjZW5lUGxheWJhY2tSZWdpb24uc3RhcnRNaWxsaXMgKyAocHJlc2V0LnN0YXJ0TWlsbGlzID8gcHJlc2V0LnN0YXJ0TWlsbGlzIDogMCkpIC8gMTAwMCxcbiAgICAvLyAgICAgZW5kOiAoc2NlbmVQbGF5YmFja1JlZ2lvbi5zdGFydE1pbGxpc1xuICAgIC8vICAgICAgICsgKHByZXNldC5lbmRNaWxsaXMgPyBwcmVzZXQuZW5kTWlsbGlzIDogc2NlbmVQbGF5YmFja1JlZ2lvbi5lbmRNaWxsaXMgLSBzY2VuZVBsYXliYWNrUmVnaW9uLnN0YXJ0TWlsbGlzKSkgLyAxMDAwLFxuICAgIC8vICAgICBjb2xvcjogJyNmZmYnLFxuICAgIC8vICAgICBkYXRhOiB7IGhhbmRsZWQ6IHRydWUgfSxcbiAgICAvLyAgICAgLy8gVE9ET1xuICAgIC8vICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgLy8gICAgICAgcHJlc2V0OiB0cnVlLFxuICAgIC8vICAgICAgIG5hbWU6ICdQcmVzZXQgMSdcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfSk7XG4gICAgLy8gICB0aGlzLmNvbm5lY3RSZWdpb24od2F2ZVN1cmZlclJlZ2lvbiwgc2NlbmUsIHNjZW5lUGxheWJhY2tSZWdpb24sIHByZXNldCk7XG4gICAgLy8gfVxuXG4gICAgdGhpcy51cGRhdGVSZWdpb25TZWxlY3Rpb24oKTtcbiAgfVxuXG4gIHJlbW92ZVJlZ2lvbigpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQbGF5YmFja1JlZ2lvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zZWxlY3RlZFNjZW5lcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9uc1tpXSA9PT0gdGhpcy5zZWxlY3RlZFBsYXliYWNrUmVnaW9uKSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgcmVnaW9uIGZyb20gd2F2ZXN1cmZlclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLndhdmVTdXJmZXIucmVnaW9ucy5saXN0KSkge1xuICAgICAgICAgIGNvbnN0IHJlZ2lvbjogYW55ID0gdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMubGlzdFtrZXldO1xuXG4gICAgICAgICAgaWYgKHJlZ2lvbi5zY2VuZVBsYXliYWNrUmVnaW9uID09PSB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24pIHtcbiAgICAgICAgICAgIHJlZ2lvbi5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdGVkUGxheWJhY2tSZWdpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucHJlc2V0U2VydmljZS5wcmV2aWV3TGl2ZSgpO1xuICB9XG5cbiAgZ2V0UHJlc2V0c0luVGltZSh0aW1lTWlsbGlzOiBudW1iZXIpOiBQcmVzZXRSZWdpb25TY2VuZVtdIHtcbiAgICAvLyBSZXR1cm4gYWxsIHByZXNldHMgd2hpY2ggc2hvdWxkIGJlIGFjdGl2ZSBkdXJpbmcgdGhlIHNwZWNpZmllZCB0aW1lXG4gICAgY29uc3QgYWN0aXZlUHJlc2V0czogUHJlc2V0UmVnaW9uU2NlbmVbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgc2NlbmVJbmRleCA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoIC0gMTsgc2NlbmVJbmRleCA+PSAwOyBzY2VuZUluZGV4LS0pIHtcbiAgICAgIGNvbnN0IHNjZW5lID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tzY2VuZUluZGV4XTtcblxuICAgICAgZm9yIChjb25zdCByZWdpb24gb2YgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uLnNjZW5lUGxheWJhY2tSZWdpb25zKSB7XG4gICAgICAgIGlmIChyZWdpb24uc2NlbmVVdWlkID09PSBzY2VuZS51dWlkKSB7XG4gICAgICAgICAgZm9yIChsZXQgcHJlc2V0SW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3QucHJlc2V0cy5sZW5ndGggLSAxOyBwcmVzZXRJbmRleCA+PSAwOyBwcmVzZXRJbmRleC0tKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByZXNldFV1aWQgb2Ygc2NlbmUucHJlc2V0VXVpZHMpIHtcbiAgICAgICAgICAgICAgaWYgKHByZXNldFV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW3ByZXNldEluZGV4XS51dWlkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5wcmVzZXRTZXJ2aWNlLmdldFByZXNldEJ5VXVpZChwcmVzZXRVdWlkKTtcblxuICAgICAgICAgICAgICAgIGlmIChwcmVzZXQpIHtcbiAgICAgICAgICAgICAgICAgIGxldCBwcmVzZXRTdGFydE1pbGxpcyA9IHByZXNldC5zdGFydE1pbGxpcyA9PT0gdW5kZWZpbmVkID8gcmVnaW9uLnN0YXJ0TWlsbGlzIDogcmVnaW9uLnN0YXJ0TWlsbGlzICsgcHJlc2V0LnN0YXJ0TWlsbGlzO1xuICAgICAgICAgICAgICAgICAgbGV0IHByZXNldEVuZE1pbGxpcyA9IHByZXNldC5lbmRNaWxsaXMgPT09IHVuZGVmaW5lZCA/IHJlZ2lvbi5lbmRNaWxsaXMgOiByZWdpb24uc3RhcnRNaWxsaXMgKyBwcmVzZXQuZW5kTWlsbGlzO1xuXG4gICAgICAgICAgICAgICAgICAvLyBleHRlbmQgdGhlIHJ1bm5pbmcgdGltZSwgaWYgZmFkaW5nIGlzIGRvbmUgb3V0c2lkZSB0aGUgYm91bmRhcmllc1xuICAgICAgICAgICAgICAgICAgcHJlc2V0U3RhcnRNaWxsaXMgLT0gcHJlc2V0LmZhZGVJblByZSA/IHByZXNldC5mYWRlSW5NaWxsaXMgOiAwO1xuICAgICAgICAgICAgICAgICAgcHJlc2V0RW5kTWlsbGlzICs9IHByZXNldC5mYWRlT3V0UG9zdCA/IHByZXNldC5mYWRlT3V0TWlsbGlzIDogMDtcblxuICAgICAgICAgICAgICAgICAgaWYgKHByZXNldFN0YXJ0TWlsbGlzIDw9IHRpbWVNaWxsaXMgJiYgcHJlc2V0RW5kTWlsbGlzID49IHRpbWVNaWxsaXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUHJlc2V0cy5wdXNoKG5ldyBQcmVzZXRSZWdpb25TY2VuZShwcmVzZXQsIHJlZ2lvbiwgc2NlbmUpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aXZlUHJlc2V0cztcbiAgfVxuXG4gIGRyYXdBbGxSZWdpb25zKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0aGUgcmVnaW9ucyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBjb3JyZXNwb25kaW5nIHNjZW5lcywgYnV0IGRyYXdcbiAgICAvLyB0aGUgc2VsZWN0ZWQgb25lcyBsYXN0LCB0byBtYWtlIHN1cmUgdGhleSdyZSBhbHdheXMgY2xpY2thYmxlLlxuICAgIGZvciAobGV0IHNjZW5lSW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aCAtIDE7IHNjZW5lSW5kZXggPj0gMDsgc2NlbmVJbmRleC0tKSB7XG4gICAgICBjb25zdCBzY2VuZSA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbc2NlbmVJbmRleF07XG4gICAgICBpZiAoIXRoaXMuc2NlbmVTZXJ2aWNlLnNjZW5lSXNTZWxlY3RlZChzY2VuZSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBzY2VuZVBsYXliYWNrUmVnaW9uIG9mIHRoaXMuc2VsZWN0ZWRDb21wb3NpdGlvbi5zY2VuZVBsYXliYWNrUmVnaW9ucykge1xuICAgICAgICAgIGlmIChzY2VuZVBsYXliYWNrUmVnaW9uLnNjZW5lVXVpZCA9PT0gc2NlbmUudXVpZCkge1xuICAgICAgICAgICAgdGhpcy5kcmF3UmVnaW9uKHNjZW5lUGxheWJhY2tSZWdpb24sIHNjZW5lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkcmF3IGFsbCBzZWxlY3RlZCBzY2VuZXMgYWZ0ZXJ3YXJkc1xuICAgIGZvciAobGV0IHNjZW5lSW5kZXggPSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2NlbmVzLmxlbmd0aCAtIDE7IHNjZW5lSW5kZXggPj0gMDsgc2NlbmVJbmRleC0tKSB7XG4gICAgICBjb25zdCBzY2VuZSA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXNbc2NlbmVJbmRleF07XG5cbiAgICAgIGlmICh0aGlzLnNjZW5lU2VydmljZS5zY2VuZUlzU2VsZWN0ZWQoc2NlbmUpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NlbmVQbGF5YmFja1JlZ2lvbiBvZiB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24uc2NlbmVQbGF5YmFja1JlZ2lvbnMpIHtcbiAgICAgICAgICBpZiAoc2NlbmVQbGF5YmFja1JlZ2lvbi5zY2VuZVV1aWQgPT09IHNjZW5lLnV1aWQpIHtcbiAgICAgICAgICAgIHRoaXMuZHJhd1JlZ2lvbihzY2VuZVBsYXliYWNrUmVnaW9uLCBzY2VuZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlR3JpZCgpIHtcbiAgICBpZiAodGhpcy53YXZlU3VyZmVyUmVhZHkpIHtcbiAgICAgIHRoaXMud2F2ZVN1cmZlci50aW1lbGluZS5wYXJhbXMub2Zmc2V0ID0gdGhpcy5nZXRTbmFwVG9HcmlkT2Zmc2V0KCk7XG5cbiAgICAgIHRoaXMud2F2ZVN1cmZlci5yZWdpb25zLnBhcmFtcy5zbmFwVG9HcmlkSW50ZXJ2YWwgPSB0aGlzLmdldFNuYXBUb0dyaWRJbnRlcnZhbCgpO1xuICAgICAgdGhpcy53YXZlU3VyZmVyLnJlZ2lvbnMucGFyYW1zLnNuYXBUb0dyaWRPZmZzZXQgPSB0aGlzLmdldFNuYXBUb0dyaWRPZmZzZXQoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVDdXJyZW50VGltZSgpO1xuICB9XG5cbiAgZ2V0RXh0ZXJuYWxDb21wb3NpdGlvbk5hbWVzKCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICAvLyBnZXQgYXZhaWxhYmxlIGNvbXBvc2l0aW9ucyBmcm9tIGFuIGV4dGVybmFsIHBvb2wgKGUuZy4gUm9ja2V0IFNob3cpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2NvbXBvc2l0aW9uL2xpc3QnKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZTogb2JqZWN0W10pID0+IHtcbiAgICAgICAgY29uc3QgY29tcG9zaXRpb25OYW1lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlQ29tcG9zaXRpb24gb2YgcmVzcG9uc2UpIHtcbiAgICAgICAgICBjb21wb3NpdGlvbk5hbWVzLnB1c2goKHJlc3BvbnNlQ29tcG9zaXRpb24gYXMgYW55KS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb3NpdGlvbk5hbWVzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0Q29tcG9zaXRpb25JbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LmNvbXBvc2l0aW9uc1tpbmRleF07XG4gICAgdGhpcy5zZWxlY3RlZENvbXBvc2l0aW9uSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc2VsZWN0ZWRDb21wb3NpdGlvblV1aWQgPSB0aGlzLnNlbGVjdGVkQ29tcG9zaXRpb24udXVpZDtcbiAgICB0aGlzLmNyZWF0ZVdhdmVTdXJmZXIoKTtcblxuICAgIC8vIHJlcXVpcmVkIHRvIHRyaWdnZXIgdGltZWxpbmUuY29tcG9uZW50LnJlc2l6ZSgpXG4gICAgdGhpcy53YXZlU3VyZmVyUmVhZHkubmV4dCgpO1xuXG4gICAgdGhpcy5hcHBseVpvb20oMCk7XG4gIH1cbn1cbiJdfQ==
|