@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,500 +0,0 @@
|
|
|
1
|
-
import { __decorate, __metadata } from "tslib";
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import * as THREE from 'three';
|
|
5
|
-
import { EffectCurve } from '../models/effect-curve';
|
|
6
|
-
import { FixtureCapabilityType } from '../models/fixture-capability';
|
|
7
|
-
import { FixtureChannelValue } from '../models/fixture-channel-value';
|
|
8
|
-
import { PresetRegionScene } from '../models/preset-region-scene';
|
|
9
|
-
import { FixtureService } from './fixture.service';
|
|
10
|
-
import { PresetService } from './preset.service';
|
|
11
|
-
import { ProjectService } from './project.service';
|
|
12
|
-
import { SceneService } from './scene.service';
|
|
13
|
-
import { TimelineService } from './timeline.service';
|
|
14
|
-
import { UniverseService } from './universe.service';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "./preset.service";
|
|
17
|
-
import * as i2 from "./fixture.service";
|
|
18
|
-
import * as i3 from "./scene.service";
|
|
19
|
-
import * as i4 from "./timeline.service";
|
|
20
|
-
import * as i5 from "./universe.service";
|
|
21
|
-
import * as i6 from "./project.service";
|
|
22
|
-
let PreviewService = class PreviewService {
|
|
23
|
-
constructor(presetService, fixtureService, sceneService, timelineService, universeService, projectService) {
|
|
24
|
-
this.presetService = presetService;
|
|
25
|
-
this.fixtureService = fixtureService;
|
|
26
|
-
this.sceneService = sceneService;
|
|
27
|
-
this.timelineService = timelineService;
|
|
28
|
-
this.universeService = universeService;
|
|
29
|
-
this.projectService = projectService;
|
|
30
|
-
this.doUpdateFixtureSetup = new Subject();
|
|
31
|
-
this.stageMeshes = [];
|
|
32
|
-
this.stageMaterial = new THREE.MeshStandardMaterial({ color: 0x0d0d0d });
|
|
33
|
-
}
|
|
34
|
-
getAlreadyCalculatedFixture(fixtures, fixtureIndex) {
|
|
35
|
-
// Has this fixture already been calculated (same universe and dmx start address as a fixture before)
|
|
36
|
-
// --> return it
|
|
37
|
-
for (let i = 0; i < fixtureIndex; i++) {
|
|
38
|
-
const calculatedFixture = fixtures[i];
|
|
39
|
-
if (calculatedFixture.fixture.dmxUniverseUuid === fixtures[fixtureIndex].fixture.dmxUniverseUuid &&
|
|
40
|
-
calculatedFixture.fixture.dmxFirstChannel === fixtures[fixtureIndex].fixture.dmxFirstChannel) {
|
|
41
|
-
return calculatedFixture;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
getPresets(timeMillis) {
|
|
47
|
-
// Get relevant presets in correct order to process with their corresponding scene, if available
|
|
48
|
-
let presets = [];
|
|
49
|
-
if (this.timelineService.playState === 'playing') {
|
|
50
|
-
// Only use active presets in current regions
|
|
51
|
-
presets = this.timelineService.getPresetsInTime(timeMillis);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
if (this.projectService.project.previewPreset) {
|
|
55
|
-
// Only preview the selected preset
|
|
56
|
-
if (this.presetService.selectedPreset) {
|
|
57
|
-
presets.push(new PresetRegionScene(this.presetService.selectedPreset, undefined, undefined));
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
// Preview the selected scenes
|
|
62
|
-
for (let sceneIndex = this.projectService.project.scenes.length - 1; sceneIndex >= 0; sceneIndex--) {
|
|
63
|
-
for (const scene of this.sceneService.selectedScenes) {
|
|
64
|
-
if (scene.uuid === this.projectService.project.scenes[sceneIndex].uuid) {
|
|
65
|
-
for (let presetIndex = this.projectService.project.presets.length - 1; presetIndex >= 0; presetIndex--) {
|
|
66
|
-
for (const presetUuid of scene.presetUuids) {
|
|
67
|
-
// Loop over the presets in the preset service to retain the preset order
|
|
68
|
-
if (presetUuid === this.projectService.project.presets[presetIndex].uuid) {
|
|
69
|
-
presets.push(new PresetRegionScene(this.projectService.project.presets[presetIndex], undefined, scene));
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
return presets;
|
|
80
|
-
}
|
|
81
|
-
mixChannelValue(existingChannelValues, channelValue, intensityPercentage, defaultValue = 0) {
|
|
82
|
-
let newValue = channelValue.value;
|
|
83
|
-
let existingValue = defaultValue;
|
|
84
|
-
if (intensityPercentage < 1) {
|
|
85
|
-
// We need to mix a possibly existing value (or the default value 0) with the new value (fading)
|
|
86
|
-
// Get the existant value for this property
|
|
87
|
-
for (const existingChannelValue of existingChannelValues) {
|
|
88
|
-
if (existingChannelValue.channelName === channelValue.channelName &&
|
|
89
|
-
existingChannelValue.profileUuid === channelValue.profileUuid) {
|
|
90
|
-
existingValue = existingChannelValue.value;
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// Mix the existing value with the new value
|
|
95
|
-
newValue = existingValue * (1 - intensityPercentage) + newValue * intensityPercentage;
|
|
96
|
-
}
|
|
97
|
-
// Remove the existant value, if available
|
|
98
|
-
for (let i = 0; i < existingChannelValues.length; i++) {
|
|
99
|
-
if (existingChannelValues[i].channelName === channelValue.channelName &&
|
|
100
|
-
existingChannelValues[i].profileUuid === channelValue.profileUuid) {
|
|
101
|
-
existingChannelValues.splice(i, 1);
|
|
102
|
-
break;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// Add the new value
|
|
106
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
107
|
-
fixtureChannelValue.channelName = channelValue.channelName;
|
|
108
|
-
fixtureChannelValue.profileUuid = channelValue.profileUuid;
|
|
109
|
-
fixtureChannelValue.value = newValue;
|
|
110
|
-
existingChannelValues.push(fixtureChannelValue);
|
|
111
|
-
}
|
|
112
|
-
// Get the fixture index inside the passed preset (used for chasing)
|
|
113
|
-
getFixtureIndex(preset, fixtureUuid) {
|
|
114
|
-
let index = 0;
|
|
115
|
-
const countedDmxChannels = [];
|
|
116
|
-
// Loop over the global fixtures to retain the order
|
|
117
|
-
for (const fixture of this.projectService.project.fixtures) {
|
|
118
|
-
for (const presetFixtureUuid of preset.fixtureUuids) {
|
|
119
|
-
if (presetFixtureUuid === fixture.uuid) {
|
|
120
|
-
if (fixture.uuid === fixtureUuid) {
|
|
121
|
-
return index;
|
|
122
|
-
}
|
|
123
|
-
// don't count fixtures on the same channel as already counted ones
|
|
124
|
-
if (!countedDmxChannels.includes(fixture.dmxFirstChannel)) {
|
|
125
|
-
countedDmxChannels.push(fixture.dmxFirstChannel);
|
|
126
|
-
index++;
|
|
127
|
-
}
|
|
128
|
-
break;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
// Not found in the preset
|
|
133
|
-
return undefined;
|
|
134
|
-
}
|
|
135
|
-
getPresetIntensity(preset, timeMillis) {
|
|
136
|
-
// When fading is in progress (on preset or scene-level), the current preset does not
|
|
137
|
-
// fully cover underlying values.
|
|
138
|
-
// -> 0 = no covering at all, 1 = fully cover (no fading)
|
|
139
|
-
let intensityPercentageScene = 1;
|
|
140
|
-
let intensityPercentagePreset = 1;
|
|
141
|
-
let intensityPercentage = 1;
|
|
142
|
-
if (preset.region && preset.scene) {
|
|
143
|
-
// Fade out is stronger than fade in (if they overlap)
|
|
144
|
-
// Take away intensity for scene fading
|
|
145
|
-
const sceneStartMillis = preset.scene.fadeInPre ? preset.region.startMillis - preset.scene.fadeInMillis : preset.region.startMillis;
|
|
146
|
-
const sceneEndMillis = preset.scene.fadeOutPost ? preset.region.endMillis + preset.scene.fadeOutMillis : preset.region.endMillis;
|
|
147
|
-
if (timeMillis > sceneEndMillis - preset.scene.fadeOutMillis && timeMillis < sceneEndMillis) {
|
|
148
|
-
// Scene fades out
|
|
149
|
-
intensityPercentageScene = (sceneEndMillis - timeMillis) / preset.scene.fadeOutMillis;
|
|
150
|
-
}
|
|
151
|
-
else if (timeMillis < sceneStartMillis + preset.scene.fadeInMillis && timeMillis > sceneStartMillis) {
|
|
152
|
-
// Scene fades in
|
|
153
|
-
intensityPercentageScene = (timeMillis - sceneStartMillis) / preset.scene.fadeInMillis;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
if (preset.region && preset.preset) {
|
|
157
|
-
// Take away intensity for preset fading
|
|
158
|
-
let presetStartMillis = preset.preset.startMillis === undefined ? preset.region.startMillis : preset.region.startMillis + preset.preset.startMillis;
|
|
159
|
-
let presetEndMillis = preset.preset.endMillis === undefined ? preset.region.endMillis : preset.region.startMillis + preset.preset.endMillis;
|
|
160
|
-
// extend the running time, if fading is done outside the boundaries
|
|
161
|
-
presetStartMillis -= preset.preset.fadeInPre ? preset.preset.fadeInMillis : 0;
|
|
162
|
-
presetEndMillis += preset.preset.fadeOutPost ? preset.preset.fadeOutMillis : 0;
|
|
163
|
-
if (timeMillis > presetEndMillis - preset.preset.fadeOutMillis && timeMillis < presetEndMillis) {
|
|
164
|
-
// Preset fades out
|
|
165
|
-
intensityPercentagePreset = (presetEndMillis - timeMillis) / preset.preset.fadeOutMillis;
|
|
166
|
-
}
|
|
167
|
-
else if (timeMillis < presetStartMillis + preset.preset.fadeInMillis && timeMillis > presetStartMillis) {
|
|
168
|
-
// Preset fades in
|
|
169
|
-
intensityPercentagePreset = (timeMillis - presetStartMillis) / preset.preset.fadeInMillis;
|
|
170
|
-
}
|
|
171
|
-
intensityPercentage = intensityPercentageScene * intensityPercentagePreset;
|
|
172
|
-
}
|
|
173
|
-
return intensityPercentage;
|
|
174
|
-
}
|
|
175
|
-
mixCapabilityValues(preset, cachedFixture, values, intensityPercentage) {
|
|
176
|
-
let hasColor = false;
|
|
177
|
-
// mix the preset capability values
|
|
178
|
-
for (const presetCapabilityValue of preset.preset.fixtureCapabilityValues) {
|
|
179
|
-
for (const cachedChannel of cachedFixture.channels) {
|
|
180
|
-
if (cachedChannel.channel) {
|
|
181
|
-
for (const channelCapability of cachedChannel.capabilities) {
|
|
182
|
-
if (this.fixtureService.capabilitiesMatch(presetCapabilityValue.type, channelCapability.capability.type, presetCapabilityValue.color, channelCapability.capability.color, presetCapabilityValue.wheel, channelCapability.wheelName, presetCapabilityValue.profileUuid, cachedFixture.profile.uuid)) {
|
|
183
|
-
// the capabilities match -> apply the value, if possible
|
|
184
|
-
if ((presetCapabilityValue.type === FixtureCapabilityType.Intensity ||
|
|
185
|
-
presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) &&
|
|
186
|
-
presetCapabilityValue.valuePercentage >= 0) {
|
|
187
|
-
// intensity and colorIntensity (dimmer and color)
|
|
188
|
-
const valuePercentage = presetCapabilityValue.valuePercentage;
|
|
189
|
-
const defaultValue = 0;
|
|
190
|
-
// brightness property
|
|
191
|
-
if (cachedChannel.capabilities.length === 1) {
|
|
192
|
-
// the only capability in this channel
|
|
193
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
194
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
195
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
196
|
-
fixtureChannelValue.value = cachedChannel.maxValue * valuePercentage;
|
|
197
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
198
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
199
|
-
hasColor = true;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
// more than one capability in the channel
|
|
204
|
-
if (channelCapability.capability.brightness === 'off' && valuePercentage === 0) {
|
|
205
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
206
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
207
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
208
|
-
fixtureChannelValue.value = channelCapability.centerValue;
|
|
209
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
210
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
211
|
-
hasColor = true;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
else if ((channelCapability.capability.brightnessStart === 'dark' || channelCapability.capability.brightnessStart === 'off') &&
|
|
215
|
-
channelCapability.capability.brightnessEnd === 'bright') {
|
|
216
|
-
const value = (channelCapability.capability.dmxRange[1] - channelCapability.capability.dmxRange[0]) * valuePercentage +
|
|
217
|
-
channelCapability.capability.dmxRange[0];
|
|
218
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
219
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
220
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
221
|
-
fixtureChannelValue.value = value;
|
|
222
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage, defaultValue);
|
|
223
|
-
if (presetCapabilityValue.type === FixtureCapabilityType.ColorIntensity) {
|
|
224
|
-
hasColor = true;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
else if ((presetCapabilityValue.type === FixtureCapabilityType.Pan || presetCapabilityValue.type === FixtureCapabilityType.Tilt) &&
|
|
230
|
-
presetCapabilityValue.valuePercentage >= 0) {
|
|
231
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
232
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
233
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
234
|
-
fixtureChannelValue.value = cachedChannel.maxValue * presetCapabilityValue.valuePercentage;
|
|
235
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
236
|
-
}
|
|
237
|
-
else if (presetCapabilityValue.type === FixtureCapabilityType.WheelSlot &&
|
|
238
|
-
channelCapability.capability.slotNumber === presetCapabilityValue.slotNumber) {
|
|
239
|
-
// wheel slot (color, gobo, etc.)
|
|
240
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
241
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
242
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
243
|
-
fixtureChannelValue.value = channelCapability.centerValue;
|
|
244
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
245
|
-
// check, whether we just set a color wheel value
|
|
246
|
-
if (channelCapability.wheelIsColor) {
|
|
247
|
-
hasColor = true;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
// approximate the color from a color or a different color wheel, if necessary
|
|
254
|
-
if (!hasColor && cachedChannel.colorWheel) {
|
|
255
|
-
const capability = this.presetService.getApproximatedColorWheelCapability(preset.preset, cachedChannel);
|
|
256
|
-
if (capability) {
|
|
257
|
-
// we found an approximated color in the available wheel channel
|
|
258
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
259
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
260
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
261
|
-
fixtureChannelValue.value = capability.centerValue;
|
|
262
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
mixChannelValues(preset, cachedFixture, values, intensityPercentage) {
|
|
269
|
-
// mix the preset channel values
|
|
270
|
-
for (const cachedChannel of cachedFixture.channels) {
|
|
271
|
-
if (cachedChannel.channel) {
|
|
272
|
-
for (const channelValue of preset.preset.fixtureChannelValues) {
|
|
273
|
-
if (cachedFixture.profile.uuid === channelValue.profileUuid && cachedChannel.name === channelValue.channelName) {
|
|
274
|
-
this.mixChannelValue(values, channelValue, intensityPercentage);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
mixEffects(timeMillis, fixtureIndex, preset, cachedFixture, values, intensityPercentage) {
|
|
281
|
-
for (const effect of preset.preset.effects) {
|
|
282
|
-
if (effect.visible) {
|
|
283
|
-
// EffectCurve
|
|
284
|
-
if (effect instanceof EffectCurve) {
|
|
285
|
-
const effectCurve = effect;
|
|
286
|
-
// capabilities
|
|
287
|
-
for (const capability of effectCurve.capabilities) {
|
|
288
|
-
for (const cachedChannel of cachedFixture.channels) {
|
|
289
|
-
for (const channelCapability of cachedChannel.capabilities) {
|
|
290
|
-
if (this.fixtureService.capabilitiesMatch(capability.type, channelCapability.capability.type, capability.color, channelCapability.capability.color, null, null, null, null)) {
|
|
291
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
292
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
293
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
294
|
-
fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);
|
|
295
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
// channels
|
|
301
|
-
for (const channelProfile of effectCurve.channels) {
|
|
302
|
-
if (channelProfile.profileUuid === cachedFixture.profile.uuid) {
|
|
303
|
-
for (const channel of channelProfile.channels) {
|
|
304
|
-
for (const cachedChannel of cachedFixture.channels) {
|
|
305
|
-
if (cachedChannel.name === channel) {
|
|
306
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
307
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
308
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
309
|
-
fixtureChannelValue.value = cachedChannel.maxValue * effectCurve.getValueAtMillis(timeMillis, fixtureIndex);
|
|
310
|
-
this.mixChannelValue(values, fixtureChannelValue, intensityPercentage);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
break;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
// TODO other effects (PanTilt, etc.)
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
// return all fixture uuids with their corresponding channel values
|
|
323
|
-
getChannelValues(timeMillis, presets) {
|
|
324
|
-
// Loop over all relevant presets and calc the property values from the presets (capabilities and effects)
|
|
325
|
-
const calculatedFixtures = new Map();
|
|
326
|
-
for (let i = 0; i < this.fixtureService.cachedFixtures.length; i++) {
|
|
327
|
-
const cachedFixture = this.fixtureService.cachedFixtures[i];
|
|
328
|
-
// all values of the current fixture channels
|
|
329
|
-
let values = [];
|
|
330
|
-
const alreadyCalculatedFixture = this.getAlreadyCalculatedFixture(this.fixtureService.cachedFixtures, i);
|
|
331
|
-
if (alreadyCalculatedFixture) {
|
|
332
|
-
// only relevant for the preview --> reuse all calculated values
|
|
333
|
-
values = Object.assign([], calculatedFixtures.get(alreadyCalculatedFixture));
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
// apply the default values
|
|
337
|
-
for (const cachedChannel of cachedFixture.channels) {
|
|
338
|
-
if (cachedChannel.channel) {
|
|
339
|
-
if (cachedChannel.channel.defaultValue) {
|
|
340
|
-
const fixtureChannelValue = new FixtureChannelValue();
|
|
341
|
-
fixtureChannelValue.channelName = cachedChannel.name;
|
|
342
|
-
fixtureChannelValue.profileUuid = cachedFixture.profile.uuid;
|
|
343
|
-
fixtureChannelValue.value = cachedChannel.defaultValue;
|
|
344
|
-
this.mixChannelValue(values, fixtureChannelValue, 1);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
for (const preset of presets) {
|
|
349
|
-
// search for this fixture in the preset and get it's preset-specific index (for chasing effects)
|
|
350
|
-
const fixtureIndex = this.getFixtureIndex(preset.preset, cachedFixture.fixture.uuid);
|
|
351
|
-
if (fixtureIndex >= 0) {
|
|
352
|
-
// this fixture is also in the preset -> mix the required values (overwrite existing values,
|
|
353
|
-
// if set multiple times)
|
|
354
|
-
const intensityPercentage = this.getPresetIntensity(preset, timeMillis);
|
|
355
|
-
this.mixCapabilityValues(preset, cachedFixture, values, intensityPercentage);
|
|
356
|
-
this.mixChannelValues(preset, cachedFixture, values, intensityPercentage);
|
|
357
|
-
this.mixEffects(timeMillis, fixtureIndex, preset, cachedFixture, values, intensityPercentage);
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
// Store the calculated values for subsequent fixtures on the same DMX address
|
|
362
|
-
calculatedFixtures.set(cachedFixture, values);
|
|
363
|
-
}
|
|
364
|
-
return calculatedFixtures;
|
|
365
|
-
}
|
|
366
|
-
setUniverseValues(fixtures, masterDimmerValue) {
|
|
367
|
-
// TODO only, if monitoring is enabled
|
|
368
|
-
return;
|
|
369
|
-
// Reset all DMX universes
|
|
370
|
-
for (const universe of this.universeService.universes) {
|
|
371
|
-
universe.channelValues = [];
|
|
372
|
-
for (let i = 0; i < 512; i++) {
|
|
373
|
-
universe.channelValues.push(0);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
// loop over each fixture
|
|
377
|
-
fixtures.forEach((channelValues, cachedFixture) => {
|
|
378
|
-
// TODO Get the correct universe for this fixture
|
|
379
|
-
const universe = this.universeService.getUniverseByUuid(cachedFixture.fixture.dmxUniverseUuid);
|
|
380
|
-
// loop over each channel for this fixture
|
|
381
|
-
for (let channelIndex = 0; channelIndex < cachedFixture.mode.channels.length; channelIndex++) {
|
|
382
|
-
const channelObj = cachedFixture.mode.channels[channelIndex];
|
|
383
|
-
if (typeof channelObj === 'string') {
|
|
384
|
-
const channelName = channelObj;
|
|
385
|
-
// match this mode channel with a channel value
|
|
386
|
-
for (const channelValue of channelValues) {
|
|
387
|
-
const channel = this.fixtureService.getChannelByName(cachedFixture, channelName);
|
|
388
|
-
if (channel && channel.channel) {
|
|
389
|
-
const fineIndex = channel.channel.fineChannelAliases.indexOf(channelName);
|
|
390
|
-
if (channel.name === channelValue.channelName || fineIndex > -1) {
|
|
391
|
-
const universeChannel = cachedFixture.fixture.dmxFirstChannel + channelIndex;
|
|
392
|
-
const dmxValue = Math.floor(channelValue.value / Math.pow(256, channel.channel.fineChannelAliases.length - (fineIndex + 1))) % 256;
|
|
393
|
-
// TODO
|
|
394
|
-
break;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
fixtureIsSelected(uuid, presets) {
|
|
403
|
-
for (const preset of presets) {
|
|
404
|
-
for (const fixtureUuid of preset.preset.fixtureUuids) {
|
|
405
|
-
if (fixtureUuid === uuid) {
|
|
406
|
-
return true;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
return false;
|
|
411
|
-
}
|
|
412
|
-
updateFixtureSetup() {
|
|
413
|
-
this.doUpdateFixtureSetup.next();
|
|
414
|
-
}
|
|
415
|
-
updateStage() {
|
|
416
|
-
if (!this.scene) {
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
let geometry;
|
|
420
|
-
let mesh;
|
|
421
|
-
// Remove old meshes from the scene
|
|
422
|
-
for (const existingMesh of this.stageMeshes) {
|
|
423
|
-
this.scene.remove(existingMesh);
|
|
424
|
-
existingMesh.geometry.dispose();
|
|
425
|
-
}
|
|
426
|
-
this.stageMeshes = [];
|
|
427
|
-
// Floor
|
|
428
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stageWidthCm, this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm);
|
|
429
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
430
|
-
mesh.receiveShadow = false;
|
|
431
|
-
mesh.castShadow = false;
|
|
432
|
-
mesh.position.set(0, this.projectService.project.stageFloorHeightCm / 2, 0);
|
|
433
|
-
this.scene.add(mesh);
|
|
434
|
-
this.stageMeshes.push(mesh);
|
|
435
|
-
// Pillar front left
|
|
436
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
437
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
438
|
-
mesh.receiveShadow = false;
|
|
439
|
-
mesh.castShadow = false;
|
|
440
|
-
mesh.position.set(-this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2);
|
|
441
|
-
this.scene.add(mesh);
|
|
442
|
-
this.stageMeshes.push(mesh);
|
|
443
|
-
// Pillar front right
|
|
444
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
445
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
446
|
-
mesh.receiveShadow = false;
|
|
447
|
-
mesh.castShadow = false;
|
|
448
|
-
mesh.position.set(this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, this.projectService.project.stageDepthCm / 2 - this.projectService.project.stagePillarWidthCm / 2);
|
|
449
|
-
this.scene.add(mesh);
|
|
450
|
-
this.stageMeshes.push(mesh);
|
|
451
|
-
// Pillar back left
|
|
452
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
453
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
454
|
-
mesh.receiveShadow = false;
|
|
455
|
-
mesh.castShadow = false;
|
|
456
|
-
mesh.position.set(-this.projectService.project.stageWidthCm / 2 + this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2);
|
|
457
|
-
this.scene.add(mesh);
|
|
458
|
-
this.stageMeshes.push(mesh);
|
|
459
|
-
// Pillar back right
|
|
460
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stagePillarWidthCm, this.projectService.project.stageHeightCm, this.projectService.project.stagePillarWidthCm);
|
|
461
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
462
|
-
mesh.receiveShadow = false;
|
|
463
|
-
mesh.castShadow = false;
|
|
464
|
-
mesh.position.set(this.projectService.project.stageWidthCm / 2 - this.projectService.project.stagePillarWidthCm / 2, this.projectService.project.stageHeightCm / 2 + this.projectService.project.stageFloorHeightCm, -this.projectService.project.stageDepthCm / 2 + this.projectService.project.stagePillarWidthCm / 2);
|
|
465
|
-
this.scene.add(mesh);
|
|
466
|
-
this.stageMeshes.push(mesh);
|
|
467
|
-
// Ceiling
|
|
468
|
-
geometry = new THREE.BoxBufferGeometry(this.projectService.project.stageWidthCm, this.projectService.project.stageCeilingHeightCm, this.projectService.project.stageDepthCm);
|
|
469
|
-
mesh = new THREE.Mesh(geometry.clone(), this.stageMaterial);
|
|
470
|
-
mesh.receiveShadow = false;
|
|
471
|
-
mesh.castShadow = false;
|
|
472
|
-
mesh.position.set(0, this.projectService.project.stageHeightCm +
|
|
473
|
-
this.projectService.project.stageCeilingHeightCm / 2 +
|
|
474
|
-
this.projectService.project.stageFloorHeightCm, 0);
|
|
475
|
-
this.scene.add(mesh);
|
|
476
|
-
this.stageMeshes.push(mesh);
|
|
477
|
-
}
|
|
478
|
-
};
|
|
479
|
-
PreviewService.ctorParameters = () => [
|
|
480
|
-
{ type: PresetService },
|
|
481
|
-
{ type: FixtureService },
|
|
482
|
-
{ type: SceneService },
|
|
483
|
-
{ type: TimelineService },
|
|
484
|
-
{ type: UniverseService },
|
|
485
|
-
{ type: ProjectService }
|
|
486
|
-
];
|
|
487
|
-
PreviewService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PreviewService_Factory() { return new PreviewService(i0.ɵɵinject(i1.PresetService), i0.ɵɵinject(i2.FixtureService), i0.ɵɵinject(i3.SceneService), i0.ɵɵinject(i4.TimelineService), i0.ɵɵinject(i5.UniverseService), i0.ɵɵinject(i6.ProjectService)); }, token: PreviewService, providedIn: "root" });
|
|
488
|
-
PreviewService = __decorate([
|
|
489
|
-
Injectable({
|
|
490
|
-
providedIn: 'root',
|
|
491
|
-
}),
|
|
492
|
-
__metadata("design:paramtypes", [PresetService,
|
|
493
|
-
FixtureService,
|
|
494
|
-
SceneService,
|
|
495
|
-
TimelineService,
|
|
496
|
-
UniverseService,
|
|
497
|
-
ProjectService])
|
|
498
|
-
], PreviewService);
|
|
499
|
-
export { PreviewService };
|
|
500
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHJvY2tldHNob3cvZGVzaWduZXIvIiwic291cmNlcyI6WyJsaWIvc2VydmljZXMvcHJldmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFFL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXRFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWxFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOzs7Ozs7OztBQUtyRCxJQUFhLGNBQWMsR0FBM0IsTUFBYSxjQUFjO0lBUXpCLFlBQ1UsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsWUFBMEIsRUFDMUIsZUFBZ0MsRUFDaEMsZUFBZ0MsRUFDaEMsY0FBOEI7UUFMOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBYmpDLHlCQUFvQixHQUFrQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBSW5ELGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUMvQixrQkFBYSxHQUFHLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFTekUsQ0FBQztJQUVJLDJCQUEyQixDQUFDLFFBQXlCLEVBQUUsWUFBb0I7UUFDakYscUdBQXFHO1FBQ3JHLGdCQUFnQjtRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JDLE1BQU0saUJBQWlCLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXRDLElBQ0UsaUJBQWlCLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWU7Z0JBQzVGLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQzVGO2dCQUNBLE9BQU8saUJBQWlCLENBQUM7YUFDMUI7U0FDRjtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxVQUFVLENBQUMsVUFBa0I7UUFDbEMsZ0dBQWdHO1FBQ2hHLElBQUksT0FBTyxHQUF3QixFQUFFLENBQUM7UUFFdEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7WUFDaEQsNkNBQTZDO1lBQzdDLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdEO2FBQU07WUFDTCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtnQkFDN0MsbUNBQW1DO2dCQUNuQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFO29CQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7aUJBQzlGO2FBQ0Y7aUJBQU07Z0JBQ0wsOEJBQThCO2dCQUM5QixLQUFLLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUU7b0JBQ2xHLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUU7d0JBQ3BELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxFQUFFOzRCQUN0RSxLQUFLLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLFdBQVcsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0NBQ3RHLEtBQUssTUFBTSxVQUFVLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRTtvQ0FDMUMseUVBQXlFO29DQUN6RSxJQUFJLFVBQVUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFO3dDQUN4RSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO3dDQUN4RyxNQUFNO3FDQUNQO2lDQUNGOzZCQUNGO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxlQUFlLENBQ3JCLHFCQUE0QyxFQUM1QyxZQUFpQyxFQUNqQyxtQkFBMkIsRUFDM0IsZUFBdUIsQ0FBQztRQUV4QixJQUFJLFFBQVEsR0FBVyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQzFDLElBQUksYUFBYSxHQUFXLFlBQVksQ0FBQztRQUV6QyxJQUFJLG1CQUFtQixHQUFHLENBQUMsRUFBRTtZQUMzQixnR0FBZ0c7WUFFaEcsMkNBQTJDO1lBQzNDLEtBQUssTUFBTSxvQkFBb0IsSUFBSSxxQkFBcUIsRUFBRTtnQkFDeEQsSUFDRSxvQkFBb0IsQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLFdBQVc7b0JBQzdELG9CQUFvQixDQUFDLFdBQVcsS0FBSyxZQUFZLENBQUMsV0FBVyxFQUM3RDtvQkFDQSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsS0FBSyxDQUFDO29CQUMzQyxNQUFNO2lCQUNQO2FBQ0Y7WUFFRCw0Q0FBNEM7WUFDNUMsUUFBUSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQztTQUN2RjtRQUVELDBDQUEwQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcscUJBQXFCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3JELElBQ0UscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLFlBQVksQ0FBQyxXQUFXO2dCQUNqRSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssWUFBWSxDQUFDLFdBQVcsRUFDakU7Z0JBQ0EscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsTUFBTTthQUNQO1NBQ0Y7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFDdEQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDM0QsbUJBQW1CLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFDM0QsbUJBQW1CLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUNyQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsb0VBQW9FO0lBQzVELGVBQWUsQ0FBQyxNQUFjLEVBQUUsV0FBbUI7UUFDekQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxrQkFBa0IsR0FBYSxFQUFFLENBQUM7UUFFeEMsb0RBQW9EO1FBQ3BELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQzFELEtBQUssTUFBTSxpQkFBaUIsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUNuRCxJQUFJLGlCQUFpQixLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ3RDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7d0JBQ2hDLE9BQU8sS0FBSyxDQUFDO3FCQUNkO29CQUVELG1FQUFtRTtvQkFDbkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7d0JBQ3pELGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBQ2pELEtBQUssRUFBRSxDQUFDO3FCQUNUO29CQUNELE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBRUQsMEJBQTBCO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxNQUF5QixFQUFFLFVBQWtCO1FBQ3RFLHFGQUFxRjtRQUNyRixpQ0FBaUM7UUFDakMseURBQXlEO1FBQ3pELElBQUksd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUkseUJBQXlCLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFO1lBQ2pDLHNEQUFzRDtZQUV0RCx1Q0FBdUM7WUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ3BJLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFakksSUFBSSxVQUFVLEdBQUcsY0FBYyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLFVBQVUsR0FBRyxjQUFjLEVBQUU7Z0JBQzNGLGtCQUFrQjtnQkFDbEIsd0JBQXdCLEdBQUcsQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUM7YUFDdkY7aUJBQU0sSUFBSSxVQUFVLEdBQUcsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLElBQUksVUFBVSxHQUFHLGdCQUFnQixFQUFFO2dCQUNyRyxpQkFBaUI7Z0JBQ2pCLHdCQUF3QixHQUFHLENBQUMsVUFBVSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7YUFDeEY7U0FDRjtRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2xDLHdDQUF3QztZQUN4QyxJQUFJLGlCQUFpQixHQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUU5SCxJQUFJLGVBQWUsR0FDakIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFFeEgsb0VBQW9FO1lBQ3BFLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlFLGVBQWUsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvRSxJQUFJLFVBQVUsR0FBRyxlQUFlLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksVUFBVSxHQUFHLGVBQWUsRUFBRTtnQkFDOUYsbUJBQW1CO2dCQUNuQix5QkFBeUIsR0FBRyxDQUFDLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQzthQUMxRjtpQkFBTSxJQUFJLFVBQVUsR0FBRyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxVQUFVLEdBQUcsaUJBQWlCLEVBQUU7Z0JBQ3hHLGtCQUFrQjtnQkFDbEIseUJBQXlCLEdBQUcsQ0FBQyxVQUFVLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQzthQUMzRjtZQUVELG1CQUFtQixHQUFHLHdCQUF3QixHQUFHLHlCQUF5QixDQUFDO1NBQzVFO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLE1BQXlCLEVBQ3pCLGFBQTRCLEVBQzVCLE1BQTZCLEVBQzdCLG1CQUEyQjtRQUUzQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFFckIsbUNBQW1DO1FBQ25DLEtBQUssTUFBTSxxQkFBcUIsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLHVCQUF1QixFQUFFO1lBQ3pFLEtBQUssTUFBTSxhQUFhLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtnQkFDbEQsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFO29CQUN6QixLQUFLLE1BQU0saUJBQWlCLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRTt3QkFDMUQsSUFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUNuQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQzFCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQ2pDLHFCQUFxQixDQUFDLEtBQUssRUFDM0IsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFDbEMscUJBQXFCLENBQUMsS0FBSyxFQUMzQixpQkFBaUIsQ0FBQyxTQUFTLEVBQzNCLHFCQUFxQixDQUFDLFdBQVcsRUFDakMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQzNCLEVBQ0Q7NEJBQ0EseURBQXlEOzRCQUN6RCxJQUNFLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLFNBQVM7Z0NBQzdELHFCQUFxQixDQUFDLElBQUksS0FBSyxxQkFBcUIsQ0FBQyxjQUFjLENBQUM7Z0NBQ3RFLHFCQUFxQixDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQzFDO2dDQUNBLGtEQUFrRDtnQ0FDbEQsTUFBTSxlQUFlLEdBQUcscUJBQXFCLENBQUMsZUFBZSxDQUFDO2dDQUM5RCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7Z0NBRXZCLHNCQUFzQjtnQ0FDdEIsSUFBSSxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0NBQzNDLHNDQUFzQztvQ0FDdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7b0NBQ3RELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO29DQUNyRCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0NBQzdELG1CQUFtQixDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUSxHQUFHLGVBQWUsQ0FBQztvQ0FDckUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7b0NBRXJGLElBQUkscUJBQXFCLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLGNBQWMsRUFBRTt3Q0FDdkUsUUFBUSxHQUFHLElBQUksQ0FBQztxQ0FDakI7aUNBQ0Y7cUNBQU07b0NBQ0wsMENBQTBDO29DQUMxQyxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQUssS0FBSyxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUU7d0NBQzlFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO3dDQUN0RCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQzt3Q0FDckQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUM3RCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDO3dDQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQzt3Q0FFckYsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsY0FBYyxFQUFFOzRDQUN2RSxRQUFRLEdBQUcsSUFBSSxDQUFDO3lDQUNqQjtxQ0FDRjt5Q0FBTSxJQUNMLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLGVBQWUsS0FBSyxNQUFNLElBQUksaUJBQWlCLENBQUMsVUFBVSxDQUFDLGVBQWUsS0FBSyxLQUFLLENBQUM7d0NBQ25ILGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxhQUFhLEtBQUssUUFBUSxFQUN2RDt3Q0FDQSxNQUFNLEtBQUssR0FDVCxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWU7NENBQ3ZHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7d0NBRTNDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO3dDQUN0RCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQzt3Q0FDckQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUM3RCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO3dDQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLENBQUMsQ0FBQzt3Q0FFckYsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsY0FBYyxFQUFFOzRDQUN2RSxRQUFRLEdBQUcsSUFBSSxDQUFDO3lDQUNqQjtxQ0FDRjtpQ0FDRjs2QkFDRjtpQ0FBTSxJQUNMLENBQUMscUJBQXFCLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsSUFBSSxDQUFDO2dDQUN2SCxxQkFBcUIsQ0FBQyxlQUFlLElBQUksQ0FBQyxFQUMxQztnQ0FDQSxNQUFNLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztnQ0FDdEQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0NBQ3JELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQ0FDN0QsbUJBQW1CLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEdBQUcscUJBQXFCLENBQUMsZUFBZSxDQUFDO2dDQUMzRixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUMsQ0FBQzs2QkFDdEQ7aUNBQU0sSUFDTCxxQkFBcUIsQ0FBQyxJQUFJLEtBQUsscUJBQXFCLENBQUMsU0FBUztnQ0FDOUQsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFVBQVUsS0FBSyxxQkFBcUIsQ0FBQyxVQUFVLEVBQzVFO2dDQUNBLGlDQUFpQztnQ0FDakMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7Z0NBQ3RELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO2dDQUNyRCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0NBQzdELG1CQUFtQixDQUFDLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7Z0NBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUVyRCxpREFBaUQ7Z0NBQ2pELElBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFFO29DQUNsQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lDQUNqQjs2QkFDRjt5QkFDRjtxQkFDRjtpQkFDRjtnQkFFRCw4RUFBOEU7Z0JBQzlFLElBQUksQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBRTtvQkFDekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQ0FBbUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUV4RyxJQUFJLFVBQVUsRUFBRTt3QkFDZCxnRUFBZ0U7d0JBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO3dCQUN0RCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDckQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO3dCQUM3RCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ3REO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxnQkFBZ0IsQ0FDdEIsTUFBeUIsRUFDekIsYUFBNEIsRUFDNUIsTUFBNkIsRUFDN0IsbUJBQTJCO1FBRTNCLGdDQUFnQztRQUNoQyxLQUFLLE1BQU0sYUFBYSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDbEQsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFO2dCQUN6QixLQUFLLE1BQU0sWUFBWSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUU7b0JBQzdELElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLFdBQVcsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxXQUFXLEVBQUU7d0JBQzlHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO3FCQUNqRTtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sVUFBVSxDQUNoQixVQUFrQixFQUNsQixZQUFvQixFQUNwQixNQUF5QixFQUN6QixhQUE0QixFQUM1QixNQUE2QixFQUM3QixtQkFBMkI7UUFFM0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUMxQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7Z0JBQ2xCLGNBQWM7Z0JBQ2QsSUFBSSxNQUFNLFlBQVksV0FBVyxFQUFFO29CQUNqQyxNQUFNLFdBQVcsR0FBRyxNQUFxQixDQUFDO29CQUUxQyxlQUFlO29CQUNmLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxDQUFDLFlBQVksRUFBRTt3QkFDakQsS0FBSyxNQUFNLGFBQWEsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFOzRCQUNsRCxLQUFLLE1BQU0saUJBQWlCLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRTtnQ0FDMUQsSUFDRSxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUNuQyxVQUFVLENBQUMsSUFBSSxFQUNmLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQ2pDLFVBQVUsQ0FBQyxLQUFLLEVBQ2hCLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQ2xDLElBQUksRUFDSixJQUFJLEVBQ0osSUFBSSxFQUNKLElBQUksQ0FDTCxFQUNEO29DQUNBLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO29DQUN0RCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQztvQ0FDckQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO29DQUM3RCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO29DQUM1RyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2lDQUN4RTs2QkFDRjt5QkFDRjtxQkFDRjtvQkFFRCxXQUFXO29CQUNYLEtBQUssTUFBTSxjQUFjLElBQUksV0FBVyxDQUFDLFFBQVEsRUFBRTt3QkFDakQsSUFBSSxjQUFjLENBQUMsV0FBVyxLQUFLLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFOzRCQUM3RCxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsQ0FBQyxRQUFRLEVBQUU7Z0NBQzdDLEtBQUssTUFBTSxhQUFhLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtvQ0FDbEQsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTt3Q0FDbEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLG1CQUFtQixFQUFFLENBQUM7d0NBQ3RELG1CQUFtQixDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO3dDQUNyRCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0NBQzdELG1CQUFtQixDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7d0NBQzVHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixDQUFDLENBQUM7cUNBQ3hFO2lDQUNGOzZCQUNGOzRCQUVELE1BQU07eUJBQ1A7cUJBQ0Y7aUJBQ0Y7Z0JBRUQscUNBQXFDO2FBQ3RDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsbUVBQW1FO0lBQzVELGdCQUFnQixDQUFDLFVBQWtCLEVBQUUsT0FBNEI7UUFDdEUsMEdBQTBHO1FBQzFHLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQXdDLENBQUM7UUFFM0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RCw2Q0FBNkM7WUFDN0MsSUFBSSxNQUFNLEdBQTBCLEVBQUUsQ0FBQztZQUV2QyxNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV6RyxJQUFJLHdCQUF3QixFQUFFO2dCQUM1QixnRUFBZ0U7Z0JBQ2hFLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO2FBQzlFO2lCQUFNO2dCQUNMLDJCQUEyQjtnQkFDM0IsS0FBSyxNQUFNLGFBQWEsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFO29CQUNsRCxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUU7d0JBQ3pCLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7NEJBQ3RDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDOzRCQUN0RCxtQkFBbUIsQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQzs0QkFDckQsbUJBQW1CLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDOzRCQUM3RCxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQzs0QkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLENBQUM7eUJBQ3REO3FCQUNGO2lCQUNGO2dCQUVELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO29CQUM1QixpR0FBaUc7b0JBQ2pHLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUVyRixJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUU7d0JBQ3JCLDRGQUE0Rjt3QkFDNUYseUJBQXlCO3dCQUN6QixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBRXhFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO3dCQUM3RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsQ0FBQzt3QkFDMUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7cUJBQy9GO2lCQUNGO2FBQ0Y7WUFFRCw4RUFBOEU7WUFDOUUsa0JBQWtCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMvQztRQUVELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVNLGlCQUFpQixDQUFDLFFBQW1ELEVBQUUsaUJBQXlCO1FBQ3JHLHNDQUFzQztRQUN0QyxPQUFPO1FBRVAsMEJBQTBCO1FBQzFCLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDckQsUUFBUSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUIsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7U0FDRjtRQUVELHlCQUF5QjtRQUN6QixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBb0MsRUFBRSxhQUE0QixFQUFFLEVBQUU7WUFDdEYsaURBQWlEO1lBQ2pELE1BQU0sUUFBUSxHQUFhLElBQUksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUV6RywwQ0FBMEM7WUFDMUMsS0FBSyxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUUsWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsRUFBRTtnQkFDNUYsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzdELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxFQUFFO29CQUNsQyxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7b0JBQy9CLCtDQUErQztvQkFDL0MsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7d0JBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3dCQUNqRixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFOzRCQUM5QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQzs0QkFDMUUsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxXQUFXLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dDQUMvRCxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxZQUFZLENBQUM7Z0NBQzdFLE1BQU0sUUFBUSxHQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dDQUNwSCxPQUFPO2dDQUNQLE1BQU07NkJBQ1A7eUJBQ0Y7cUJBQ0Y7aUJBQ0Y7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGlCQUFpQixDQUFDLElBQVksRUFBRSxPQUE0QjtRQUNqRSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtZQUM1QixLQUFLLE1BQU0sV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO2dCQUNwRCxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7b0JBQ3hCLE9BQU8sSUFBSSxDQUFDO2lCQUNiO2FBQ0Y7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFFRCxJQUFJLFFBQWEsQ0FBQztRQUNsQixJQUFJLElBQVMsQ0FBQztRQUVkLG1DQUFtQztRQUNuQyxLQUFLLE1BQU0sWUFBWSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDM0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDaEMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNqQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXRCLFFBQVE7UUFDUixRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksRUFDeEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FDekMsQ0FBQztRQUNGLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLG9CQUFvQjtRQUNwQixRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUMvQyxDQUFDO1FBQ0YsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEVBQ2xHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzlGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUNsRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIscUJBQXFCO1FBQ3JCLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQy9DLENBQUM7UUFDRixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLEVBQ2pHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzlGLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUNsRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsbUJBQW1CO1FBQ25CLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQzlDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQy9DLENBQUM7UUFDRixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQ2YsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLENBQUMsRUFDbEcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFDOUYsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FDbkcsQ0FBQztRQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVCLG9CQUFvQjtRQUNwQixRQUFRLEdBQUcsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUM5QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQ3pDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUMvQyxDQUFDO1FBQ0YsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxFQUNqRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUM5RixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUNuRyxDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsVUFBVTtRQUNWLFFBQVEsR0FBRyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FDcEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUN4QyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUN6QyxDQUFDO1FBQ0YsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUNmLENBQUMsRUFDRCxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLG9CQUFvQixHQUFHLENBQUM7WUFDcEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQ2hELENBQUMsQ0FDRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztDQUNGLENBQUE7O1lBeG1CMEIsYUFBYTtZQUNaLGNBQWM7WUFDaEIsWUFBWTtZQUNULGVBQWU7WUFDZixlQUFlO1lBQ2hCLGNBQWM7OztBQWQ3QixjQUFjO0lBSDFCLFVBQVUsQ0FBQztRQUNWLFVBQVUsRUFBRSxNQUFNO0tBQ25CLENBQUM7cUNBVXlCLGFBQWE7UUFDWixjQUFjO1FBQ2hCLFlBQVk7UUFDVCxlQUFlO1FBQ2YsZUFBZTtRQUNoQixjQUFjO0dBZDdCLGNBQWMsQ0FpbkIxQjtTQWpuQlksY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCB7IENhY2hlZEZpeHR1cmUgfSBmcm9tICcuLi9tb2RlbHMvY2FjaGVkLWZpeHR1cmUnO1xuaW1wb3J0IHsgRWZmZWN0Q3VydmUgfSBmcm9tICcuLi9tb2RlbHMvZWZmZWN0LWN1cnZlJztcbmltcG9ydCB7IEZpeHR1cmVDYXBhYmlsaXR5VHlwZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNhcGFiaWxpdHknO1xuaW1wb3J0IHsgRml4dHVyZUNoYW5uZWxWYWx1ZSB9IGZyb20gJy4uL21vZGVscy9maXh0dXJlLWNoYW5uZWwtdmFsdWUnO1xuaW1wb3J0IHsgUHJlc2V0IH0gZnJvbSAnLi4vbW9kZWxzL3ByZXNldCc7XG5pbXBvcnQgeyBQcmVzZXRSZWdpb25TY2VuZSB9IGZyb20gJy4uL21vZGVscy9wcmVzZXQtcmVnaW9uLXNjZW5lJztcbmltcG9ydCB7IFVuaXZlcnNlIH0gZnJvbSAnLi4vbW9kZWxzL3VuaXZlcnNlJztcbmltcG9ydCB7IEZpeHR1cmVTZXJ2aWNlIH0gZnJvbSAnLi9maXh0dXJlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJlc2V0U2VydmljZSB9IGZyb20gJy4vcHJlc2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvamVjdFNlcnZpY2UgfSBmcm9tICcuL3Byb2plY3Quc2VydmljZSc7XG5pbXBvcnQgeyBTY2VuZVNlcnZpY2UgfSBmcm9tICcuL3NjZW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGltZWxpbmVTZXJ2aWNlIH0gZnJvbSAnLi90aW1lbGluZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVuaXZlcnNlU2VydmljZSB9IGZyb20gJy4vdW5pdmVyc2Uuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBQcmV2aWV3U2VydmljZSB7XG4gIHB1YmxpYyBkb1VwZGF0ZUZpeHR1cmVTZXR1cDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIHNjZW5lOiBUSFJFRS5TY2VuZTtcblxuICBwcml2YXRlIHN0YWdlTWVzaGVzOiBUSFJFRS5NZXNoW10gPSBbXTtcbiAgcHJpdmF0ZSBzdGFnZU1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4MGQwZDBkIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcHJlc2V0U2VydmljZTogUHJlc2V0U2VydmljZSxcbiAgICBwcml2YXRlIGZpeHR1cmVTZXJ2aWNlOiBGaXh0dXJlU2VydmljZSxcbiAgICBwcml2YXRlIHNjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGltZWxpbmVTZXJ2aWNlOiBUaW1lbGluZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1bml2ZXJzZVNlcnZpY2U6IFVuaXZlcnNlU2VydmljZSxcbiAgICBwcml2YXRlIHByb2plY3RTZXJ2aWNlOiBQcm9qZWN0U2VydmljZVxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXRBbHJlYWR5Q2FsY3VsYXRlZEZpeHR1cmUoZml4dHVyZXM6IENhY2hlZEZpeHR1cmVbXSwgZml4dHVyZUluZGV4OiBudW1iZXIpOiBDYWNoZWRGaXh0dXJlIHtcbiAgICAvLyBIYXMgdGhpcyBmaXh0dXJlIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIChzYW1lIHVuaXZlcnNlIGFuZCBkbXggc3RhcnQgYWRkcmVzcyBhcyBhIGZpeHR1cmUgYmVmb3JlKVxuICAgIC8vIC0tPiByZXR1cm4gaXRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpeHR1cmVJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRml4dHVyZSA9IGZpeHR1cmVzW2ldO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGNhbGN1bGF0ZWRGaXh0dXJlLmZpeHR1cmUuZG14VW5pdmVyc2VVdWlkID09PSBmaXh0dXJlc1tmaXh0dXJlSW5kZXhdLmZpeHR1cmUuZG14VW5pdmVyc2VVdWlkICYmXG4gICAgICAgIGNhbGN1bGF0ZWRGaXh0dXJlLmZpeHR1cmUuZG14Rmlyc3RDaGFubmVsID09PSBmaXh0dXJlc1tmaXh0dXJlSW5kZXhdLmZpeHR1cmUuZG14Rmlyc3RDaGFubmVsXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZWRGaXh0dXJlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJlc2V0cyh0aW1lTWlsbGlzOiBudW1iZXIpOiBQcmVzZXRSZWdpb25TY2VuZVtdIHtcbiAgICAvLyBHZXQgcmVsZXZhbnQgcHJlc2V0cyBpbiBjb3JyZWN0IG9yZGVyIHRvIHByb2Nlc3Mgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHNjZW5lLCBpZiBhdmFpbGFibGVcbiAgICBsZXQgcHJlc2V0czogUHJlc2V0UmVnaW9uU2NlbmVbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMudGltZWxpbmVTZXJ2aWNlLnBsYXlTdGF0ZSA9PT0gJ3BsYXlpbmcnKSB7XG4gICAgICAvLyBPbmx5IHVzZSBhY3RpdmUgcHJlc2V0cyBpbiBjdXJyZW50IHJlZ2lvbnNcbiAgICAgIHByZXNldHMgPSB0aGlzLnRpbWVsaW5lU2VydmljZS5nZXRQcmVzZXRzSW5UaW1lKHRpbWVNaWxsaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXZpZXdQcmVzZXQpIHtcbiAgICAgICAgLy8gT25seSBwcmV2aWV3IHRoZSBzZWxlY3RlZCBwcmVzZXRcbiAgICAgICAgaWYgKHRoaXMucHJlc2V0U2VydmljZS5zZWxlY3RlZFByZXNldCkge1xuICAgICAgICAgIHByZXNldHMucHVzaChuZXcgUHJlc2V0UmVnaW9uU2NlbmUodGhpcy5wcmVzZXRTZXJ2aWNlLnNlbGVjdGVkUHJlc2V0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcmV2aWV3IHRoZSBzZWxlY3RlZCBzY2VuZXNcbiAgICAgICAgZm9yIChsZXQgc2NlbmVJbmRleCA9IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zY2VuZXMubGVuZ3RoIC0gMTsgc2NlbmVJbmRleCA+PSAwOyBzY2VuZUluZGV4LS0pIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHNjZW5lIG9mIHRoaXMuc2NlbmVTZXJ2aWNlLnNlbGVjdGVkU2NlbmVzKSB7XG4gICAgICAgICAgICBpZiAoc2NlbmUudXVpZCA9PT0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnNjZW5lc1tzY2VuZUluZGV4XS51dWlkKSB7XG4gICAgICAgICAgICAgIGZvciAobGV0IHByZXNldEluZGV4ID0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHMubGVuZ3RoIC0gMTsgcHJlc2V0SW5kZXggPj0gMDsgcHJlc2V0SW5kZXgtLSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJlc2V0VXVpZCBvZiBzY2VuZS5wcmVzZXRVdWlkcykge1xuICAgICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIHRoZSBwcmVzZXRzIGluIHRoZSBwcmVzZXQgc2VydmljZSB0byByZXRhaW4gdGhlIHByZXNldCBvcmRlclxuICAgICAgICAgICAgICAgICAgaWYgKHByZXNldFV1aWQgPT09IHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5wcmVzZXRzW3ByZXNldEluZGV4XS51dWlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXNldHMucHVzaChuZXcgUHJlc2V0UmVnaW9uU2NlbmUodGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnByZXNldHNbcHJlc2V0SW5kZXhdLCB1bmRlZmluZWQsIHNjZW5lKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcmVzZXRzO1xuICB9XG5cbiAgcHJpdmF0ZSBtaXhDaGFubmVsVmFsdWUoXG4gICAgZXhpc3RpbmdDaGFubmVsVmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sXG4gICAgY2hhbm5lbFZhbHVlOiBGaXh0dXJlQ2hhbm5lbFZhbHVlLFxuICAgIGludGVuc2l0eVBlcmNlbnRhZ2U6IG51bWJlcixcbiAgICBkZWZhdWx0VmFsdWU6IG51bWJlciA9IDBcbiAgKSB7XG4gICAgbGV0IG5ld1ZhbHVlOiBudW1iZXIgPSBjaGFubmVsVmFsdWUudmFsdWU7XG4gICAgbGV0IGV4aXN0aW5nVmFsdWU6IG51bWJlciA9IGRlZmF1bHRWYWx1ZTtcblxuICAgIGlmIChpbnRlbnNpdHlQZXJjZW50YWdlIDwgMSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBtaXggYSBwb3NzaWJseSBleGlzdGluZyB2YWx1ZSAob3IgdGhlIGRlZmF1bHQgdmFsdWUgMCkgd2l0aCB0aGUgbmV3IHZhbHVlIChmYWRpbmcpXG5cbiAgICAgIC8vIEdldCB0aGUgZXhpc3RhbnQgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHlcbiAgICAgIGZvciAoY29uc3QgZXhpc3RpbmdDaGFubmVsVmFsdWUgb2YgZXhpc3RpbmdDaGFubmVsVmFsdWVzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBleGlzdGluZ0NoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9PT0gY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lICYmXG4gICAgICAgICAgZXhpc3RpbmdDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPT09IGNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZFxuICAgICAgICApIHtcbiAgICAgICAgICBleGlzdGluZ1ZhbHVlID0gZXhpc3RpbmdDaGFubmVsVmFsdWUudmFsdWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWl4IHRoZSBleGlzdGluZyB2YWx1ZSB3aXRoIHRoZSBuZXcgdmFsdWVcbiAgICAgIG5ld1ZhbHVlID0gZXhpc3RpbmdWYWx1ZSAqICgxIC0gaW50ZW5zaXR5UGVyY2VudGFnZSkgKyBuZXdWYWx1ZSAqIGludGVuc2l0eVBlcmNlbnRhZ2U7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBleGlzdGFudCB2YWx1ZSwgaWYgYXZhaWxhYmxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZ0NoYW5uZWxWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChcbiAgICAgICAgZXhpc3RpbmdDaGFubmVsVmFsdWVzW2ldLmNoYW5uZWxOYW1lID09PSBjaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgJiZcbiAgICAgICAgZXhpc3RpbmdDaGFubmVsVmFsdWVzW2ldLnByb2ZpbGVVdWlkID09PSBjaGFubmVsVmFsdWUucHJvZmlsZVV1aWRcbiAgICAgICkge1xuICAgICAgICBleGlzdGluZ0NoYW5uZWxWYWx1ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgdGhlIG5ldyB2YWx1ZVxuICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjaGFubmVsVmFsdWUuY2hhbm5lbE5hbWU7XG4gICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZDtcbiAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgZXhpc3RpbmdDaGFubmVsVmFsdWVzLnB1c2goZml4dHVyZUNoYW5uZWxWYWx1ZSk7XG4gIH1cblxuICAvLyBHZXQgdGhlIGZpeHR1cmUgaW5kZXggaW5zaWRlIHRoZSBwYXNzZWQgcHJlc2V0ICh1c2VkIGZvciBjaGFzaW5nKVxuICBwcml2YXRlIGdldEZpeHR1cmVJbmRleChwcmVzZXQ6IFByZXNldCwgZml4dHVyZVV1aWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBjb3VudGVkRG14Q2hhbm5lbHM6IG51bWJlcltdID0gW107XG5cbiAgICAvLyBMb29wIG92ZXIgdGhlIGdsb2JhbCBmaXh0dXJlcyB0byByZXRhaW4gdGhlIG9yZGVyXG4gICAgZm9yIChjb25zdCBmaXh0dXJlIG9mIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5maXh0dXJlcykge1xuICAgICAgZm9yIChjb25zdCBwcmVzZXRGaXh0dXJlVXVpZCBvZiBwcmVzZXQuZml4dHVyZVV1aWRzKSB7XG4gICAgICAgIGlmIChwcmVzZXRGaXh0dXJlVXVpZCA9PT0gZml4dHVyZS51dWlkKSB7XG4gICAgICAgICAgaWYgKGZpeHR1cmUudXVpZCA9PT0gZml4dHVyZVV1aWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb24ndCBjb3VudCBmaXh0dXJlcyBvbiB0aGUgc2FtZSBjaGFubmVsIGFzIGFscmVhZHkgY291bnRlZCBvbmVzXG4gICAgICAgICAgaWYgKCFjb3VudGVkRG14Q2hhbm5lbHMuaW5jbHVkZXMoZml4dHVyZS5kbXhGaXJzdENoYW5uZWwpKSB7XG4gICAgICAgICAgICBjb3VudGVkRG14Q2hhbm5lbHMucHVzaChmaXh0dXJlLmRteEZpcnN0Q2hhbm5lbCk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vdCBmb3VuZCBpbiB0aGUgcHJlc2V0XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJlc2V0SW50ZW5zaXR5KHByZXNldDogUHJlc2V0UmVnaW9uU2NlbmUsIHRpbWVNaWxsaXM6IG51bWJlcik6IG51bWJlciB7XG4gICAgLy8gV2hlbiBmYWRpbmcgaXMgaW4gcHJvZ3Jlc3MgKG9uIHByZXNldCBvciBzY2VuZS1sZXZlbCksIHRoZSBjdXJyZW50IHByZXNldCBkb2VzIG5vdFxuICAgIC8vIGZ1bGx5IGNvdmVyIHVuZGVybHlpbmcgdmFsdWVzLlxuICAgIC8vIC0+IDAgPSBubyBjb3ZlcmluZyBhdCBhbGwsIDEgPSBmdWxseSBjb3ZlciAobm8gZmFkaW5nKVxuICAgIGxldCBpbnRlbnNpdHlQZXJjZW50YWdlU2NlbmUgPSAxO1xuICAgIGxldCBpbnRlbnNpdHlQZXJjZW50YWdlUHJlc2V0ID0gMTtcbiAgICBsZXQgaW50ZW5zaXR5UGVyY2VudGFnZSA9IDE7XG5cbiAgICBpZiAocHJlc2V0LnJlZ2lvbiAmJiBwcmVzZXQuc2NlbmUpIHtcbiAgICAgIC8vIEZhZGUgb3V0IGlzIHN0cm9uZ2VyIHRoYW4gZmFkZSBpbiAoaWYgdGhleSBvdmVybGFwKVxuXG4gICAgICAvLyBUYWtlIGF3YXkgaW50ZW5zaXR5IGZvciBzY2VuZSBmYWRpbmdcbiAgICAgIGNvbnN0IHNjZW5lU3RhcnRNaWxsaXMgPSBwcmVzZXQuc2NlbmUuZmFkZUluUHJlID8gcHJlc2V0LnJlZ2lvbi5zdGFydE1pbGxpcyAtIHByZXNldC5zY2VuZS5mYWRlSW5NaWxsaXMgOiBwcmVzZXQucmVnaW9uLnN0YXJ0TWlsbGlzO1xuICAgICAgY29uc3Qgc2NlbmVFbmRNaWxsaXMgPSBwcmVzZXQuc2NlbmUuZmFkZU91dFBvc3QgPyBwcmVzZXQucmVnaW9uLmVuZE1pbGxpcyArIHByZXNldC5zY2VuZS5mYWRlT3V0TWlsbGlzIDogcHJlc2V0LnJlZ2lvbi5lbmRNaWxsaXM7XG5cbiAgICAgIGlmICh0aW1lTWlsbGlzID4gc2NlbmVFbmRNaWxsaXMgLSBwcmVzZXQuc2NlbmUuZmFkZU91dE1pbGxpcyAmJiB0aW1lTWlsbGlzIDwgc2NlbmVFbmRNaWxsaXMpIHtcbiAgICAgICAgLy8gU2NlbmUgZmFkZXMgb3V0XG4gICAgICAgIGludGVuc2l0eVBlcmNlbnRhZ2VTY2VuZSA9IChzY2VuZUVuZE1pbGxpcyAtIHRpbWVNaWxsaXMpIC8gcHJlc2V0LnNjZW5lLmZhZGVPdXRNaWxsaXM7XG4gICAgICB9IGVsc2UgaWYgKHRpbWVNaWxsaXMgPCBzY2VuZVN0YXJ0TWlsbGlzICsgcHJlc2V0LnNjZW5lLmZhZGVJbk1pbGxpcyAmJiB0aW1lTWlsbGlzID4gc2NlbmVTdGFydE1pbGxpcykge1xuICAgICAgICAvLyBTY2VuZSBmYWRlcyBpblxuICAgICAgICBpbnRlbnNpdHlQZXJjZW50YWdlU2NlbmUgPSAodGltZU1pbGxpcyAtIHNjZW5lU3RhcnRNaWxsaXMpIC8gcHJlc2V0LnNjZW5lLmZhZGVJbk1pbGxpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocHJlc2V0LnJlZ2lvbiAmJiBwcmVzZXQucHJlc2V0KSB7XG4gICAgICAvLyBUYWtlIGF3YXkgaW50ZW5zaXR5IGZvciBwcmVzZXQgZmFkaW5nXG4gICAgICBsZXQgcHJlc2V0U3RhcnRNaWxsaXMgPVxuICAgICAgICBwcmVzZXQucHJlc2V0LnN0YXJ0TWlsbGlzID09PSB1bmRlZmluZWQgPyBwcmVzZXQucmVnaW9uLnN0YXJ0TWlsbGlzIDogcHJlc2V0LnJlZ2lvbi5zdGFydE1pbGxpcyArIHByZXNldC5wcmVzZXQuc3RhcnRNaWxsaXM7XG5cbiAgICAgIGxldCBwcmVzZXRFbmRNaWxsaXMgPVxuICAgICAgICBwcmVzZXQucHJlc2V0LmVuZE1pbGxpcyA9PT0gdW5kZWZpbmVkID8gcHJlc2V0LnJlZ2lvbi5lbmRNaWxsaXMgOiBwcmVzZXQucmVnaW9uLnN0YXJ0TWlsbGlzICsgcHJlc2V0LnByZXNldC5lbmRNaWxsaXM7XG5cbiAgICAgIC8vIGV4dGVuZCB0aGUgcnVubmluZyB0aW1lLCBpZiBmYWRpbmcgaXMgZG9uZSBvdXRzaWRlIHRoZSBib3VuZGFyaWVzXG4gICAgICBwcmVzZXRTdGFydE1pbGxpcyAtPSBwcmVzZXQucHJlc2V0LmZhZGVJblByZSA/IHByZXNldC5wcmVzZXQuZmFkZUluTWlsbGlzIDogMDtcbiAgICAgIHByZXNldEVuZE1pbGxpcyArPSBwcmVzZXQucHJlc2V0LmZhZGVPdXRQb3N0ID8gcHJlc2V0LnByZXNldC5mYWRlT3V0TWlsbGlzIDogMDtcblxuICAgICAgaWYgKHRpbWVNaWxsaXMgPiBwcmVzZXRFbmRNaWxsaXMgLSBwcmVzZXQucHJlc2V0LmZhZGVPdXRNaWxsaXMgJiYgdGltZU1pbGxpcyA8IHByZXNldEVuZE1pbGxpcykge1xuICAgICAgICAvLyBQcmVzZXQgZmFkZXMgb3V0XG4gICAgICAgIGludGVuc2l0eVBlcmNlbnRhZ2VQcmVzZXQgPSAocHJlc2V0RW5kTWlsbGlzIC0gdGltZU1pbGxpcykgLyBwcmVzZXQucHJlc2V0LmZhZGVPdXRNaWxsaXM7XG4gICAgICB9IGVsc2UgaWYgKHRpbWVNaWxsaXMgPCBwcmVzZXRTdGFydE1pbGxpcyArIHByZXNldC5wcmVzZXQuZmFkZUluTWlsbGlzICYmIHRpbWVNaWxsaXMgPiBwcmVzZXRTdGFydE1pbGxpcykge1xuICAgICAgICAvLyBQcmVzZXQgZmFkZXMgaW5cbiAgICAgICAgaW50ZW5zaXR5UGVyY2VudGFnZVByZXNldCA9ICh0aW1lTWlsbGlzIC0gcHJlc2V0U3RhcnRNaWxsaXMpIC8gcHJlc2V0LnByZXNldC5mYWRlSW5NaWxsaXM7XG4gICAgICB9XG5cbiAgICAgIGludGVuc2l0eVBlcmNlbnRhZ2UgPSBpbnRlbnNpdHlQZXJjZW50YWdlU2NlbmUgKiBpbnRlbnNpdHlQZXJjZW50YWdlUHJlc2V0O1xuICAgIH1cblxuICAgIHJldHVybiBpbnRlbnNpdHlQZXJjZW50YWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBtaXhDYXBhYmlsaXR5VmFsdWVzKFxuICAgIHByZXNldDogUHJlc2V0UmVnaW9uU2NlbmUsXG4gICAgY2FjaGVkRml4dHVyZTogQ2FjaGVkRml4dHVyZSxcbiAgICB2YWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSxcbiAgICBpbnRlbnNpdHlQZXJjZW50YWdlOiBudW1iZXJcbiAgKSB7XG4gICAgbGV0IGhhc0NvbG9yID0gZmFsc2U7XG5cbiAgICAvLyBtaXggdGhlIHByZXNldCBjYXBhYmlsaXR5IHZhbHVlc1xuICAgIGZvciAoY29uc3QgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlIG9mIHByZXNldC5wcmVzZXQuZml4dHVyZUNhcGFiaWxpdHlWYWx1ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgIGlmIChjYWNoZWRDaGFubmVsLmNoYW5uZWwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWxDYXBhYmlsaXR5IG9mIGNhY2hlZENoYW5uZWwuY2FwYWJpbGl0aWVzKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgICAgICAgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUsXG4gICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlLFxuICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS5jb2xvcixcbiAgICAgICAgICAgICAgICBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS53aGVlbCxcbiAgICAgICAgICAgICAgICBjaGFubmVsQ2FwYWJpbGl0eS53aGVlbE5hbWUsXG4gICAgICAgICAgICAgICAgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnByb2ZpbGVVdWlkLFxuICAgICAgICAgICAgICAgIGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyB0aGUgY2FwYWJpbGl0aWVzIG1hdGNoIC0+IGFwcGx5IHRoZSB2YWx1ZSwgaWYgcG9zc2libGVcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChwcmVzZXRDYXBhYmlsaXR5VmFsdWUudHlwZSA9PT0gRml4dHVyZUNhcGFiaWxpdHlUeXBlLkludGVuc2l0eSB8fFxuICAgICAgICAgICAgICAgICAgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSkgJiZcbiAgICAgICAgICAgICAgICBwcmVzZXRDYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlID49IDBcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gaW50ZW5zaXR5IGFuZCBjb2xvckludGVuc2l0eSAoZGltbWVyIGFuZCBjb2xvcilcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVBlcmNlbnRhZ2UgPSBwcmVzZXRDYXBhYmlsaXR5VmFsdWUudmFsdWVQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IDA7XG5cbiAgICAgICAgICAgICAgICAvLyBicmlnaHRuZXNzIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlZENoYW5uZWwuY2FwYWJpbGl0aWVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgLy8gdGhlIG9ubHkgY2FwYWJpbGl0eSBpbiB0aGlzIGNoYW5uZWxcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZDtcbiAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSBjYWNoZWRDaGFubmVsLm1heFZhbHVlICogdmFsdWVQZXJjZW50YWdlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBmaXh0dXJlQ2hhbm5lbFZhbHVlLCBpbnRlbnNpdHlQZXJjZW50YWdlLCBkZWZhdWx0VmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgICBpZiAocHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNDb2xvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBvbmUgY2FwYWJpbGl0eSBpbiB0aGUgY2hhbm5lbFxuICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuYnJpZ2h0bmVzcyA9PT0gJ29mZicgJiYgdmFsdWVQZXJjZW50YWdlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2FjaGVkQ2hhbm5lbC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSBjaGFubmVsQ2FwYWJpbGl0eS5jZW50ZXJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBmaXh0dXJlQ2hhbm5lbFZhbHVlLCBpbnRlbnNpdHlQZXJjZW50YWdlLCBkZWZhdWx0VmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZXRDYXBhYmlsaXR5VmFsdWUudHlwZSA9PT0gRml4dHVyZUNhcGFiaWxpdHlUeXBlLkNvbG9ySW50ZW5zaXR5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGFzQ29sb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5icmlnaHRuZXNzU3RhcnQgPT09ICdkYXJrJyB8fCBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmJyaWdodG5lc3NTdGFydCA9PT0gJ29mZicpICYmXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuYnJpZ2h0bmVzc0VuZCA9PT0gJ2JyaWdodCdcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuZG14UmFuZ2VbMV0gLSBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmRteFJhbmdlWzBdKSAqIHZhbHVlUGVyY2VudGFnZSArXG4gICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS5kbXhSYW5nZVswXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgaW50ZW5zaXR5UGVyY2VudGFnZSwgZGVmYXVsdFZhbHVlKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5Db2xvckludGVuc2l0eSkge1xuICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAocHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5QYW4gfHwgcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnR5cGUgPT09IEZpeHR1cmVDYXBhYmlsaXR5VHlwZS5UaWx0KSAmJlxuICAgICAgICAgICAgICAgIHByZXNldENhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2UgPj0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2FjaGVkQ2hhbm5lbC5uYW1lO1xuICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUucHJvZmlsZVV1aWQgPSBjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZDtcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2FjaGVkQ2hhbm5lbC5tYXhWYWx1ZSAqIHByZXNldENhcGFiaWxpdHlWYWx1ZS52YWx1ZVBlcmNlbnRhZ2U7XG4gICAgICAgICAgICAgICAgdGhpcy5taXhDaGFubmVsVmFsdWUodmFsdWVzLCBmaXh0dXJlQ2hhbm5lbFZhbHVlLCAxKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBwcmVzZXRDYXBhYmlsaXR5VmFsdWUudHlwZSA9PT0gRml4dHVyZUNhcGFiaWxpdHlUeXBlLldoZWVsU2xvdCAmJlxuICAgICAgICAgICAgICAgIGNoYW5uZWxDYXBhYmlsaXR5LmNhcGFiaWxpdHkuc2xvdE51bWJlciA9PT0gcHJlc2V0Q2FwYWJpbGl0eVZhbHVlLnNsb3ROdW1iZXJcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gd2hlZWwgc2xvdCAoY29sb3IsIGdvYm8sIGV0Yy4pXG4gICAgICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IGNoYW5uZWxDYXBhYmlsaXR5LmNlbnRlclZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgMSk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjaywgd2hldGhlciB3ZSBqdXN0IHNldCBhIGNvbG9yIHdoZWVsIHZhbHVlXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDYXBhYmlsaXR5LndoZWVsSXNDb2xvcikge1xuICAgICAgICAgICAgICAgICAgaGFzQ29sb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFwcHJveGltYXRlIHRoZSBjb2xvciBmcm9tIGEgY29sb3Igb3IgYSBkaWZmZXJlbnQgY29sb3Igd2hlZWwsIGlmIG5lY2Vzc2FyeVxuICAgICAgICBpZiAoIWhhc0NvbG9yICYmIGNhY2hlZENoYW5uZWwuY29sb3JXaGVlbCkge1xuICAgICAgICAgIGNvbnN0IGNhcGFiaWxpdHkgPSB0aGlzLnByZXNldFNlcnZpY2UuZ2V0QXBwcm94aW1hdGVkQ29sb3JXaGVlbENhcGFiaWxpdHkocHJlc2V0LnByZXNldCwgY2FjaGVkQ2hhbm5lbCk7XG5cbiAgICAgICAgICBpZiAoY2FwYWJpbGl0eSkge1xuICAgICAgICAgICAgLy8gd2UgZm91bmQgYW4gYXBwcm94aW1hdGVkIGNvbG9yIGluIHRoZSBhdmFpbGFibGUgd2hlZWwgY2hhbm5lbFxuICAgICAgICAgICAgY29uc3QgZml4dHVyZUNoYW5uZWxWYWx1ZSA9IG5ldyBGaXh0dXJlQ2hhbm5lbFZhbHVlKCk7XG4gICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2FjaGVkQ2hhbm5lbC5uYW1lO1xuICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS52YWx1ZSA9IGNhcGFiaWxpdHkuY2VudGVyVmFsdWU7XG4gICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWl4Q2hhbm5lbFZhbHVlcyhcbiAgICBwcmVzZXQ6IFByZXNldFJlZ2lvblNjZW5lLFxuICAgIGNhY2hlZEZpeHR1cmU6IENhY2hlZEZpeHR1cmUsXG4gICAgdmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sXG4gICAgaW50ZW5zaXR5UGVyY2VudGFnZTogbnVtYmVyXG4gICkge1xuICAgIC8vIG1peCB0aGUgcHJlc2V0IGNoYW5uZWwgdmFsdWVzXG4gICAgZm9yIChjb25zdCBjYWNoZWRDaGFubmVsIG9mIGNhY2hlZEZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgIGlmIChjYWNoZWRDaGFubmVsLmNoYW5uZWwpIHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsVmFsdWUgb2YgcHJlc2V0LnByZXNldC5maXh0dXJlQ2hhbm5lbFZhbHVlcykge1xuICAgICAgICAgIGlmIChjYWNoZWRGaXh0dXJlLnByb2ZpbGUudXVpZCA9PT0gY2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkICYmIGNhY2hlZENoYW5uZWwubmFtZSA9PT0gY2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGNoYW5uZWxWYWx1ZSwgaW50ZW5zaXR5UGVyY2VudGFnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtaXhFZmZlY3RzKFxuICAgIHRpbWVNaWxsaXM6IG51bWJlcixcbiAgICBmaXh0dXJlSW5kZXg6IG51bWJlcixcbiAgICBwcmVzZXQ6IFByZXNldFJlZ2lvblNjZW5lLFxuICAgIGNhY2hlZEZpeHR1cmU6IENhY2hlZEZpeHR1cmUsXG4gICAgdmFsdWVzOiBGaXh0dXJlQ2hhbm5lbFZhbHVlW10sXG4gICAgaW50ZW5zaXR5UGVyY2VudGFnZTogbnVtYmVyXG4gICkge1xuICAgIGZvciAoY29uc3QgZWZmZWN0IG9mIHByZXNldC5wcmVzZXQuZWZmZWN0cykge1xuICAgICAgaWYgKGVmZmVjdC52aXNpYmxlKSB7XG4gICAgICAgIC8vIEVmZmVjdEN1cnZlXG4gICAgICAgIGlmIChlZmZlY3QgaW5zdGFuY2VvZiBFZmZlY3RDdXJ2ZSkge1xuICAgICAgICAgIGNvbnN0IGVmZmVjdEN1cnZlID0gZWZmZWN0IGFzIEVmZmVjdEN1cnZlO1xuXG4gICAgICAgICAgLy8gY2FwYWJpbGl0aWVzXG4gICAgICAgICAgZm9yIChjb25zdCBjYXBhYmlsaXR5IG9mIGVmZmVjdEN1cnZlLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjYWNoZWRDaGFubmVsIG9mIGNhY2hlZEZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGFubmVsQ2FwYWJpbGl0eSBvZiBjYWNoZWRDaGFubmVsLmNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIHRoaXMuZml4dHVyZVNlcnZpY2UuY2FwYWJpbGl0aWVzTWF0Y2goXG4gICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHkudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENhcGFiaWxpdHkuY2FwYWJpbGl0eS50eXBlLFxuICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ2FwYWJpbGl0eS5jYXBhYmlsaXR5LmNvbG9yLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgPSBjYWNoZWRDaGFubmVsLm5hbWU7XG4gICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2FjaGVkQ2hhbm5lbC5tYXhWYWx1ZSAqIGVmZmVjdEN1cnZlLmdldFZhbHVlQXRNaWxsaXModGltZU1pbGxpcywgZml4dHVyZUluZGV4KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgaW50ZW5zaXR5UGVyY2VudGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY2hhbm5lbHNcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWxQcm9maWxlIG9mIGVmZmVjdEN1cnZlLmNoYW5uZWxzKSB7XG4gICAgICAgICAgICBpZiAoY2hhbm5lbFByb2ZpbGUucHJvZmlsZVV1aWQgPT09IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBjaGFubmVsUHJvZmlsZS5jaGFubmVscykge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2FjaGVkQ2hhbm5lbCBvZiBjYWNoZWRGaXh0dXJlLmNoYW5uZWxzKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkQ2hhbm5lbC5uYW1lID09PSBjaGFubmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpeHR1cmVDaGFubmVsVmFsdWUgPSBuZXcgRml4dHVyZUNoYW5uZWxWYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLmNoYW5uZWxOYW1lID0gY2FjaGVkQ2hhbm5lbC5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnByb2ZpbGVVdWlkID0gY2FjaGVkRml4dHVyZS5wcm9maWxlLnV1aWQ7XG4gICAgICAgICAgICAgICAgICAgIGZpeHR1cmVDaGFubmVsVmFsdWUudmFsdWUgPSBjYWNoZWRDaGFubmVsLm1heFZhbHVlICogZWZmZWN0Q3VydmUuZ2V0VmFsdWVBdE1pbGxpcyh0aW1lTWlsbGlzLCBmaXh0dXJlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1peENoYW5uZWxWYWx1ZSh2YWx1ZXMsIGZpeHR1cmVDaGFubmVsVmFsdWUsIGludGVuc2l0eVBlcmNlbnRhZ2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8gb3RoZXIgZWZmZWN0cyAoUGFuVGlsdCwgZXRjLilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm4gYWxsIGZpeHR1cmUgdXVpZHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdmFsdWVzXG4gIHB1YmxpYyBnZXRDaGFubmVsVmFsdWVzKHRpbWVNaWxsaXM6IG51bWJlciwgcHJlc2V0czogUHJlc2V0UmVnaW9uU2NlbmVbXSk6IE1hcDxDYWNoZWRGaXh0dXJlLCBGaXh0dXJlQ2hhbm5lbFZhbHVlW10+IHtcbiAgICAvLyBMb29wIG92ZXIgYWxsIHJlbGV2YW50IHByZXNldHMgYW5kIGNhbGMgdGhlIHByb3BlcnR5IHZhbHVlcyBmcm9tIHRoZSBwcmVzZXRzIChjYXBhYmlsaXRpZXMgYW5kIGVmZmVjdHMpXG4gICAgY29uc3QgY2FsY3VsYXRlZEZpeHR1cmVzID0gbmV3IE1hcDxDYWNoZWRGaXh0dXJlLCBGaXh0dXJlQ2hhbm5lbFZhbHVlW10+KCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZml4dHVyZVNlcnZpY2UuY2FjaGVkRml4dHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNhY2hlZEZpeHR1cmUgPSB0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhY2hlZEZpeHR1cmVzW2ldO1xuXG4gICAgICAvLyBhbGwgdmFsdWVzIG9mIHRoZSBjdXJyZW50IGZpeHR1cmUgY2hhbm5lbHNcbiAgICAgIGxldCB2YWx1ZXM6IEZpeHR1cmVDaGFubmVsVmFsdWVbXSA9IFtdO1xuXG4gICAgICBjb25zdCBhbHJlYWR5Q2FsY3VsYXRlZEZpeHR1cmUgPSB0aGlzLmdldEFscmVhZHlDYWxjdWxhdGVkRml4dHVyZSh0aGlzLmZpeHR1cmVTZXJ2aWNlLmNhY2hlZEZpeHR1cmVzLCBpKTtcblxuICAgICAgaWYgKGFscmVhZHlDYWxjdWxhdGVkRml4dHVyZSkge1xuICAgICAgICAvLyBvbmx5IHJlbGV2YW50IGZvciB0aGUgcHJldmlldyAtLT4gcmV1c2UgYWxsIGNhbGN1bGF0ZWQgdmFsdWVzXG4gICAgICAgIHZhbHVlcyA9IE9iamVjdC5hc3NpZ24oW10sIGNhbGN1bGF0ZWRGaXh0dXJlcy5nZXQoYWxyZWFkeUNhbGN1bGF0ZWRGaXh0dXJlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhcHBseSB0aGUgZGVmYXVsdCB2YWx1ZXNcbiAgICAgICAgZm9yIChjb25zdCBjYWNoZWRDaGFubmVsIG9mIGNhY2hlZEZpeHR1cmUuY2hhbm5lbHMpIHtcbiAgICAgICAgICBpZiAoY2FjaGVkQ2hhbm5lbC5jaGFubmVsKSB7XG4gICAgICAgICAgICBpZiAoY2FjaGVkQ2hhbm5lbC5jaGFubmVsLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgICAgICBjb25zdCBmaXh0dXJlQ2hhbm5lbFZhbHVlID0gbmV3IEZpeHR1cmVDaGFubmVsVmFsdWUoKTtcbiAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5jaGFubmVsTmFtZSA9IGNhY2hlZENoYW5uZWwubmFtZTtcbiAgICAgICAgICAgICAgZml4dHVyZUNoYW5uZWxWYWx1ZS5wcm9maWxlVXVpZCA9IGNhY2hlZEZpeHR1cmUucHJvZmlsZS51dWlkO1xuICAgICAgICAgICAgICBmaXh0dXJlQ2hhbm5lbFZhbHVlLnZhbHVlID0gY2FjaGVkQ2hhbm5lbC5kZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlKHZhbHVlcywgZml4dHVyZUNoYW5uZWxWYWx1ZSwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBwcmVzZXQgb2YgcHJlc2V0cykge1xuICAgICAgICAgIC8vIHNlYXJjaCBmb3IgdGhpcyBmaXh0dXJlIGluIHRoZSBwcmVzZXQgYW5kIGdldCBpdCdzIHByZXNldC1zcGVjaWZpYyBpbmRleCAoZm9yIGNoYXNpbmcgZWZmZWN0cylcbiAgICAgICAgICBjb25zdCBmaXh0dXJlSW5kZXggPSB0aGlzLmdldEZpeHR1cmVJbmRleChwcmVzZXQucHJlc2V0LCBjYWNoZWRGaXh0dXJlLmZpeHR1cmUudXVpZCk7XG5cbiAgICAgICAgICBpZiAoZml4dHVyZUluZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIHRoaXMgZml4dHVyZSBpcyBhbHNvIGluIHRoZSBwcmVzZXQgLT4gbWl4IHRoZSByZXF1aXJlZCB2YWx1ZXMgKG92ZXJ3cml0ZSBleGlzdGluZyB2YWx1ZXMsXG4gICAgICAgICAgICAvLyBpZiBzZXQgbXVsdGlwbGUgdGltZXMpXG4gICAgICAgICAgICBjb25zdCBpbnRlbnNpdHlQZXJjZW50YWdlID0gdGhpcy5nZXRQcmVzZXRJbnRlbnNpdHkocHJlc2V0LCB0aW1lTWlsbGlzKTtcblxuICAgICAgICAgICAgdGhpcy5taXhDYXBhYmlsaXR5VmFsdWVzKHByZXNldCwgY2FjaGVkRml4dHVyZSwgdmFsdWVzLCBpbnRlbnNpdHlQZXJjZW50YWdlKTtcbiAgICAgICAgICAgIHRoaXMubWl4Q2hhbm5lbFZhbHVlcyhwcmVzZXQsIGNhY2hlZEZpeHR1cmUsIHZhbHVlcywgaW50ZW5zaXR5UGVyY2VudGFnZSk7XG4gICAgICAgICAgICB0aGlzLm1peEVmZmVjdHModGltZU1pbGxpcywgZml4dHVyZUluZGV4LCBwcmVzZXQsIGNhY2hlZEZpeHR1cmUsIHZhbHVlcywgaW50ZW5zaXR5UGVyY2VudGFnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBjYWxjdWxhdGVkIHZhbHVlcyBmb3Igc3Vic2VxdWVudCBmaXh0dXJlcyBvbiB0aGUgc2FtZSBETVggYWRkcmVzc1xuICAgICAgY2FsY3VsYXRlZEZpeHR1cmVzLnNldChjYWNoZWRGaXh0dXJlLCB2YWx1ZXMpO1xuICAgIH1cblxuICAgIHJldHVybiBjYWxjdWxhdGVkRml4dHVyZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VW5pdmVyc2VWYWx1ZXMoZml4dHVyZXM6IE1hcDxDYWNoZWRGaXh0dXJlLCBGaXh0dXJlQ2hhbm5lbFZhbHVlW10+LCBtYXN0ZXJEaW1tZXJWYWx1ZTogbnVtYmVyKSB7XG4gICAgLy8gVE9ETyBvbmx5LCBpZiBtb25pdG9yaW5nIGlzIGVuYWJsZWRcbiAgICByZXR1cm47XG5cbiAgICAvLyBSZXNldCBhbGwgRE1YIHVuaXZlcnNlc1xuICAgIGZvciAoY29uc3QgdW5pdmVyc2Ugb2YgdGhpcy51bml2ZXJzZVNlcnZpY2UudW5pdmVyc2VzKSB7XG4gICAgICB1bml2ZXJzZS5jaGFubmVsVmFsdWVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7XG4gICAgICAgIHVuaXZlcnNlLmNoYW5uZWxWYWx1ZXMucHVzaCgwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsb29wIG92ZXIgZWFjaCBmaXh0dXJlXG4gICAgZml4dHVyZXMuZm9yRWFjaCgoY2hhbm5lbFZhbHVlczogRml4dHVyZUNoYW5uZWxWYWx1ZVtdLCBjYWNoZWRGaXh0dXJlOiBDYWNoZWRGaXh0dXJlKSA9PiB7XG4gICAgICAvLyBUT0RPIEdldCB0aGUgY29ycmVjdCB1bml2ZXJzZSBmb3IgdGhpcyBmaXh0dXJlXG4gICAgICBjb25zdCB1bml2ZXJzZTogVW5pdmVyc2UgPSB0aGlzLnVuaXZlcnNlU2VydmljZS5nZXRVbml2ZXJzZUJ5VXVpZChjYWNoZWRGaXh0dXJlLmZpeHR1cmUuZG14VW5pdmVyc2VVdWlkKTtcblxuICAgICAgLy8gbG9vcCBvdmVyIGVhY2ggY2hhbm5lbCBmb3IgdGhpcyBmaXh0dXJlXG4gICAgICBmb3IgKGxldCBjaGFubmVsSW5kZXggPSAwOyBjaGFubmVsSW5kZXggPCBjYWNoZWRGaXh0dXJlLm1vZGUuY2hhbm5lbHMubGVuZ3RoOyBjaGFubmVsSW5kZXgrKykge1xuICAgICAgICBjb25zdCBjaGFubmVsT2JqID0gY2FjaGVkRml4dHVyZS5tb2RlLmNoYW5uZWxzW2NoYW5uZWxJbmRleF07XG4gICAgICAgIGlmICh0eXBlb2YgY2hhbm5lbE9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBjb25zdCBjaGFubmVsTmFtZSA9IGNoYW5uZWxPYmo7XG4gICAgICAgICAgLy8gbWF0Y2ggdGhpcyBtb2RlIGNoYW5uZWwgd2l0aCBhIGNoYW5uZWwgdmFsdWVcbiAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWxWYWx1ZSBvZiBjaGFubmVsVmFsdWVzKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5maXh0dXJlU2VydmljZS5nZXRDaGFubmVsQnlOYW1lKGNhY2hlZEZpeHR1cmUsIGNoYW5uZWxOYW1lKTtcbiAgICAgICAgICAgIGlmIChjaGFubmVsICYmIGNoYW5uZWwuY2hhbm5lbCkge1xuICAgICAgICAgICAgICBjb25zdCBmaW5lSW5kZXggPSBjaGFubmVsLmNoYW5uZWwuZmluZUNoYW5uZWxBbGlhc2VzLmluZGV4T2YoY2hhbm5lbE5hbWUpO1xuICAgICAgICAgICAgICBpZiAoY2hhbm5lbC5uYW1lID09PSBjaGFubmVsVmFsdWUuY2hhbm5lbE5hbWUgfHwgZmluZUluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bml2ZXJzZUNoYW5uZWwgPSBjYWNoZWRGaXh0dXJlLmZpeHR1cmUuZG14Rmlyc3RDaGFubmVsICsgY2hhbm5lbEluZGV4O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRteFZhbHVlID1cbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoY2hhbm5lbFZhbHVlLnZhbHVlIC8gTWF0aC5wb3coMjU2LCBjaGFubmVsLmNoYW5uZWwuZmluZUNoYW5uZWxBbGlhc2VzLmxlbmd0aCAtIChmaW5lSW5kZXggKyAxKSkpICUgMjU2O1xuICAgICAgICAgICAgICAgIC8vIFRPRE9cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZpeHR1cmVJc1NlbGVjdGVkKHV1aWQ6IHN0cmluZywgcHJlc2V0czogUHJlc2V0UmVnaW9uU2NlbmVbXSk6IGJvb2xlYW4ge1xuICAgIGZvciAoY29uc3QgcHJlc2V0IG9mIHByZXNldHMpIHtcbiAgICAgIGZvciAoY29uc3QgZml4dHVyZVV1aWQgb2YgcHJlc2V0LnByZXNldC5maXh0dXJlVXVpZHMpIHtcbiAgICAgICAgaWYgKGZpeHR1cmVVdWlkID09PSB1dWlkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlRml4dHVyZVNldHVwKCkge1xuICAgIHRoaXMuZG9VcGRhdGVGaXh0dXJlU2V0dXAubmV4dCgpO1xuICB9XG5cbiAgcHVibGljIHVwZGF0ZVN0YWdlKCkge1xuICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBnZW9tZXRyeTogYW55O1xuICAgIGxldCBtZXNoOiBhbnk7XG5cbiAgICAvLyBSZW1vdmUgb2xkIG1lc2hlcyBmcm9tIHRoZSBzY2VuZVxuICAgIGZvciAoY29uc3QgZXhpc3RpbmdNZXNoIG9mIHRoaXMuc3RhZ2VNZXNoZXMpIHtcbiAgICAgIHRoaXMuc2NlbmUucmVtb3ZlKGV4aXN0aW5nTWVzaCk7XG4gICAgICBleGlzdGluZ01lc2guZ2VvbWV0cnkuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YWdlTWVzaGVzID0gW107XG5cbiAgICAvLyBGbG9vclxuICAgIGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEJ1ZmZlckdlb21ldHJ5KFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VEZXB0aENtXG4gICAgKTtcbiAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnkuY2xvbmUoKSwgdGhpcy5zdGFnZU1hdGVyaWFsKTtcbiAgICBtZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLnBvc2l0aW9uLnNldCgwLCB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtIC8gMiwgMCk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuXG4gICAgLy8gUGlsbGFyIGZyb250IGxlZnRcbiAgICBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeShcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ21cbiAgICApO1xuICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeS5jbG9uZSgpLCB0aGlzLnN0YWdlTWF0ZXJpYWwpO1xuICAgIG1lc2gucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2gucG9zaXRpb24uc2V0KFxuICAgICAgLXRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyICsgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgLSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMlxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuXG4gICAgLy8gUGlsbGFyIGZyb250IHJpZ2h0XG4gICAgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQm94QnVmZmVyR2VvbWV0cnkoXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlSGVpZ2h0Q20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtXG4gICAgKTtcbiAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnkuY2xvbmUoKSwgdGhpcy5zdGFnZU1hdGVyaWFsKTtcbiAgICBtZXNoLnJlY2VpdmVTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLmNhc3RTaGFkb3cgPSBmYWxzZTtcbiAgICBtZXNoLnBvc2l0aW9uLnNldChcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVdpZHRoQ20gLyAyIC0gdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSAvIDIsXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VGbG9vckhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgLSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMlxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuXG4gICAgLy8gUGlsbGFyIGJhY2sgbGVmdFxuICAgIGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEJ1ZmZlckdlb21ldHJ5KFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtLFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlUGlsbGFyV2lkdGhDbVxuICAgICk7XG4gICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LmNsb25lKCksIHRoaXMuc3RhZ2VNYXRlcmlhbCk7XG4gICAgbWVzaC5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5jYXN0U2hhZG93ID0gZmFsc2U7XG4gICAgbWVzaC5wb3NpdGlvbi5zZXQoXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtIC8gMiArIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMlxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuXG4gICAgLy8gUGlsbGFyIGJhY2sgcmlnaHRcbiAgICBnZW9tZXRyeSA9IG5ldyBUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeShcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ20sXG4gICAgICB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZVBpbGxhcldpZHRoQ21cbiAgICApO1xuICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeS5jbG9uZSgpLCB0aGlzLnN0YWdlTWF0ZXJpYWwpO1xuICAgIG1lc2gucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2gucG9zaXRpb24uc2V0KFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSAvIDIgLSB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMixcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtIC8gMiArIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICAtdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlRGVwdGhDbSAvIDIgKyB0aGlzLnByb2plY3RTZXJ2aWNlLnByb2plY3Quc3RhZ2VQaWxsYXJXaWR0aENtIC8gMlxuICAgICk7XG4gICAgdGhpcy5zY2VuZS5hZGQobWVzaCk7XG4gICAgdGhpcy5zdGFnZU1lc2hlcy5wdXNoKG1lc2gpO1xuXG4gICAgLy8gQ2VpbGluZ1xuICAgIGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJveEJ1ZmZlckdlb21ldHJ5KFxuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlV2lkdGhDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUNlaWxpbmdIZWlnaHRDbSxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZURlcHRoQ21cbiAgICApO1xuICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeS5jbG9uZSgpLCB0aGlzLnN0YWdlTWF0ZXJpYWwpO1xuICAgIG1lc2gucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2guY2FzdFNoYWRvdyA9IGZhbHNlO1xuICAgIG1lc2gucG9zaXRpb24uc2V0KFxuICAgICAgMCxcbiAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUhlaWdodENtICtcbiAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZS5wcm9qZWN0LnN0YWdlQ2VpbGluZ0hlaWdodENtIC8gMiArXG4gICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdC5zdGFnZUZsb29ySGVpZ2h0Q20sXG4gICAgICAwXG4gICAgKTtcbiAgICB0aGlzLnNjZW5lLmFkZChtZXNoKTtcbiAgICB0aGlzLnN0YWdlTWVzaGVzLnB1c2gobWVzaCk7XG4gIH1cbn1cbiJdfQ==
|