From 038d13263f9565c4750010db99726c7891d2b124 Mon Sep 17 00:00:00 2001 From: Dominik Moritz Date: Mon, 4 Jun 2018 11:24:04 -0700 Subject: [PATCH] Release 2.5.1 2629388da282d6d264ed01761e54b2b4d264484b --- build/src/aggregate.d.ts | 14 + build/src/aggregate.js | 60 + build/src/axis.d.ts | 134 + build/src/axis.js | 57 + build/src/bin.d.ts | 59 + build/src/bin.js | 35 + build/src/channel.d.ts | 97 + build/src/channel.js | 226 + build/src/compile/axis/assemble.d.ts | 7 + build/src/compile/axis/assemble.js | 73 + build/src/compile/axis/component.d.ts | 24 + build/src/compile/axis/component.js | 38 + build/src/compile/axis/config.d.ts | 4 + build/src/compile/axis/config.js | 20 + build/src/compile/axis/encode.d.ts | 11 + build/src/compile/axis/encode.js | 110 + build/src/compile/axis/parse.d.ts | 5 + build/src/compile/axis/parse.js | 261 + build/src/compile/axis/properties.d.ts | 26 + build/src/compile/axis/properties.js | 101 + build/src/compile/baseconcat.d.ts | 18 + build/src/compile/baseconcat.js | 80 + build/src/compile/buildmodel.d.ts | 5 + build/src/compile/buildmodel.js | 30 + build/src/compile/common.d.ts | 58 + build/src/compile/common.js | 218 + build/src/compile/compile.d.ts | 39 + build/src/compile/compile.js | 126 + build/src/compile/concat.d.ts | 15 + build/src/compile/concat.js | 38 + build/src/compile/data/aggregate.d.ts | 25 + build/src/compile/data/aggregate.js | 176 + build/src/compile/data/assemble.d.ts | 17 + build/src/compile/data/assemble.js | 233 + build/src/compile/data/bin.d.ts | 30 + build/src/compile/data/bin.js | 127 + build/src/compile/data/calculate.d.ts | 18 + build/src/compile/data/calculate.js | 63 + build/src/compile/data/dataflow.d.ts | 62 + build/src/compile/data/dataflow.js | 148 + build/src/compile/data/facet.d.ts | 30 + build/src/compile/data/facet.js | 143 + build/src/compile/data/filter.d.ts | 13 + build/src/compile/data/filter.js | 28 + build/src/compile/data/filterinvalid.d.ts | 13 + build/src/compile/data/filterinvalid.js | 71 + build/src/compile/data/formatparse.d.ts | 33 + build/src/compile/data/formatparse.js | 245 + build/src/compile/data/geojson.d.ts | 12 + build/src/compile/data/geojson.js | 42 + build/src/compile/data/geopoint.d.ts | 12 + build/src/compile/data/geopoint.js | 43 + build/src/compile/data/indentifier.d.ts | 9 + build/src/compile/data/indentifier.js | 24 + build/src/compile/data/index.d.ts | 54 + build/src/compile/data/index.js | 30 + build/src/compile/data/lookup.d.ts | 13 + build/src/compile/data/lookup.js | 54 + build/src/compile/data/optimize.d.ts | 6 + build/src/compile/data/optimize.js | 123 + build/src/compile/data/optimizers.d.ts | 23 + build/src/compile/data/optimizers.js | 94 + build/src/compile/data/parse.d.ts | 8 + build/src/compile/data/parse.js | 242 + build/src/compile/data/source.d.ts | 19 + build/src/compile/data/source.js | 98 + build/src/compile/data/stack.d.ts | 55 + build/src/compile/data/stack.js | 190 + build/src/compile/data/timeunit.d.ts | 22 + build/src/compile/data/timeunit.js | 75 + build/src/compile/data/window.d.ts | 14 + build/src/compile/data/window.js | 81 + build/src/compile/facet.d.ts | 40 + build/src/compile/facet.js | 268 + build/src/compile/layer.d.ts | 23 + build/src/compile/layer.js | 117 + build/src/compile/layout/header.d.ts | 89 + build/src/compile/layout/header.js | 100 + build/src/compile/layoutsize/assemble.d.ts | 6 + build/src/compile/layoutsize/assemble.js | 75 + build/src/compile/layoutsize/component.d.ts | 7 + build/src/compile/layoutsize/component.js | 3 + build/src/compile/layoutsize/parse.d.ts | 8 + build/src/compile/layoutsize/parse.js | 113 + build/src/compile/legend/assemble.d.ts | 3 + build/src/compile/legend/assemble.js | 29 + build/src/compile/legend/component.d.ts | 12 + build/src/compile/legend/component.js | 13 + build/src/compile/legend/encode.d.ts | 7 + build/src/compile/legend/encode.js | 132 + build/src/compile/legend/parse.d.ts | 7 + build/src/compile/legend/parse.js | 190 + build/src/compile/legend/properties.d.ts | 9 + build/src/compile/legend/properties.js | 26 + build/src/compile/mark/area.d.ts | 2 + build/src/compile/mark/area.js | 11 + build/src/compile/mark/bar.d.ts | 2 + build/src/compile/mark/bar.js | 99 + build/src/compile/mark/base.d.ts | 16 + build/src/compile/mark/base.js | 3 + build/src/compile/mark/geoshape.d.ts | 2 + build/src/compile/mark/geoshape.js | 19 + build/src/compile/mark/init.d.ts | 4 + build/src/compile/mark/init.js | 144 + build/src/compile/mark/line.d.ts | 3 + build/src/compile/mark/line.js | 22 + build/src/compile/mark/mark.d.ts | 19 + build/src/compile/mark/mark.js | 199 + build/src/compile/mark/mixins.d.ts | 535 + build/src/compile/mark/mixins.js | 274 + build/src/compile/mark/point.d.ts | 8 + build/src/compile/mark/point.js | 36 + build/src/compile/mark/rect.d.ts | 6 + build/src/compile/mark/rect.js | 62 + build/src/compile/mark/rule.d.ts | 2 + build/src/compile/mark/rule.js | 21 + build/src/compile/mark/text.d.ts | 2 + build/src/compile/mark/text.js | 23 + build/src/compile/mark/tick.d.ts | 2 + build/src/compile/mark/tick.js | 43 + build/src/compile/mark/valueref.d.ts | 32 + build/src/compile/mark/valueref.js | 200 + build/src/compile/model.d.ts | 167 + build/src/compile/model.js | 451 + build/src/compile/projection/assemble.d.ts | 5 + build/src/compile/projection/assemble.js | 49 + build/src/compile/projection/component.d.ts | 10 + build/src/compile/projection/component.js | 20 + build/src/compile/projection/parse.d.ts | 2 + build/src/compile/projection/parse.js | 121 + build/src/compile/repeat.d.ts | 16 + build/src/compile/repeat.js | 55 + build/src/compile/repeater.d.ts | 9 + build/src/compile/repeater.js | 92 + build/src/compile/resolve.d.ts | 5 + build/src/compile/resolve.js | 31 + build/src/compile/scale/assemble.d.ts | 6 + build/src/compile/scale/assemble.js | 74 + build/src/compile/scale/component.d.ts | 21 + build/src/compile/scale/component.js | 19 + build/src/compile/scale/domain.d.ts | 32 + build/src/compile/scale/domain.js | 432 + build/src/compile/scale/parse.d.ts | 3 + build/src/compile/scale/parse.js | 129 + build/src/compile/scale/properties.d.ts | 17 + build/src/compile/scale/properties.js | 215 + build/src/compile/scale/range.d.ts | 22 + build/src/compile/scale/range.js | 235 + build/src/compile/scale/type.d.ts | 10 + build/src/compile/scale/type.js | 99 + build/src/compile/selection/interval.d.ts | 5 + build/src/compile/selection/interval.js | 186 + build/src/compile/selection/multi.d.ts | 13 + build/src/compile/selection/multi.js | 57 + build/src/compile/selection/selection.d.ts | 65 + build/src/compile/selection/selection.js | 298 + build/src/compile/selection/single.d.ts | 3 + build/src/compile/selection/single.js | 27 + .../compile/selection/transforms/inputs.d.ts | 3 + .../compile/selection/transforms/inputs.js | 51 + .../compile/selection/transforms/nearest.d.ts | 3 + .../compile/selection/transforms/nearest.js | 56 + .../compile/selection/transforms/project.d.ts | 3 + .../compile/selection/transforms/project.js | 55 + .../compile/selection/transforms/scales.d.ts | 6 + .../compile/selection/transforms/scales.js | 64 + .../compile/selection/transforms/toggle.d.ts | 3 + .../compile/selection/transforms/toggle.js | 27 + .../selection/transforms/transforms.d.ts | 14 + .../selection/transforms/transforms.js | 21 + .../selection/transforms/translate.d.ts | 3 + .../compile/selection/transforms/translate.js | 77 + .../compile/selection/transforms/zoom.d.ts | 3 + .../src/compile/selection/transforms/zoom.js | 77 + build/src/compile/split.d.ts | 33 + build/src/compile/split.js | 135 + build/src/compile/unit.d.ts | 65 + build/src/compile/unit.js | 211 + build/src/compositemark/boxplot.d.ts | 57 + build/src/compositemark/boxplot.js | 264 + build/src/compositemark/common.d.ts | 7 + build/src/compositemark/common.js | 9 + build/src/compositemark/errorbar.d.ts | 6 + build/src/compositemark/errorbar.js | 28 + build/src/compositemark/index.d.ts | 25 + build/src/compositemark/index.js | 37 + build/src/config.d.ts | 183 + build/src/config.js | 137 + build/src/data.d.ts | 115 + build/src/data.js | 17 + build/src/datetime.d.ts | 105 + build/src/datetime.js | 142 + build/src/encoding.d.ts | 128 + build/src/encoding.js | 163 + build/src/facet.d.ts | 38 + build/src/facet.js | 3 + build/src/fielddef.d.ts | 257 + build/src/fielddef.js | 362 + build/src/guide.d.ts | 38 + build/src/guide.js | 4 + build/src/index.d.ts | 27 + build/src/index.js | 52 + build/src/legend.d.ts | 64 + build/src/legend.js | 25 + build/src/log.d.ts | 112 + build/src/log.js | 326 + build/src/logical.d.ts | 15 + build/src/logical.js | 51 + build/src/mark.d.ts | 215 + build/src/mark.js | 88 + build/src/package.json | 141 + build/src/predicate.d.ts | 84 + build/src/predicate.js | 150 + build/src/projection.d.ts | 49 + build/src/projection.js | 20 + build/src/repeat.d.ts | 10 + build/src/repeat.js | 3 + build/src/resolve.d.ts | 19 + build/src/resolve.js | 3 + build/src/scale.d.ts | 417 + build/src/scale.js | 302 + build/src/selection.d.ts | 183 + build/src/selection.js | 27 + build/src/sort.d.ts | 41 + build/src/sort.js | 12 + build/src/spec.d.ts | 204 + build/src/spec.js | 317 + build/src/stack.d.ts | 28 + build/src/stack.js | 134 + build/src/timeunit.d.ts | 80 + build/src/timeunit.js | 300 + build/src/title.d.ts | 36 + build/src/title.js | 17 + build/src/toplevelprops.d.ts | 63 + build/src/toplevelprops.js | 34 + build/src/transform.d.ts | 217 + build/src/transform.js | 48 + build/src/type.d.ts | 28 + build/src/type.js | 66 + build/src/util.d.ts | 111 + build/src/util.js | 325 + build/src/validate.d.ts | 31 + build/src/validate.js | 70 + build/src/vega.schema.d.ts | 1017 ++ build/src/vega.schema.js | 73 + build/test/axis.test.d.ts | 1 + build/test/axis.test.js | 13 + build/test/bin.test.d.ts | 1 + build/test/bin.test.js | 25 + build/test/channel.test.d.ts | 1 + build/test/channel.test.js | 50 + build/test/compile/axis/assemble.test.d.ts | 1 + build/test/compile/axis/assemble.test.js | 52 + build/test/compile/axis/encode.test.d.ts | 1 + build/test/compile/axis/encode.test.js | 142 + build/test/compile/axis/parse.test.d.ts | 1 + build/test/compile/axis/parse.test.js | 306 + build/test/compile/axis/properties.test.d.ts | 1 + build/test/compile/axis/properties.test.js | 105 + build/test/compile/common.test.d.ts | 1 + build/test/compile/common.test.js | 63 + build/test/compile/compile.test.d.ts | 1 + build/test/compile/compile.test.js | 266 + build/test/compile/concat.test.d.ts | 1 + build/test/compile/concat.test.js | 95 + build/test/compile/data/aggregate.test.d.ts | 1 + build/test/compile/data/aggregate.test.js | 171 + build/test/compile/data/assemble.test.d.ts | 1 + build/test/compile/data/assemble.test.js | 139 + build/test/compile/data/bin.test.d.ts | 1 + build/test/compile/data/bin.test.js | 161 + build/test/compile/data/calculate.test.d.ts | 1 + build/test/compile/data/calculate.test.js | 37 + build/test/compile/data/dataflow.test.d.ts | 1 + build/test/compile/data/dataflow.test.js | 77 + build/test/compile/data/facet.test.d.ts | 1 + build/test/compile/data/facet.test.js | 114 + build/test/compile/data/filter.test.d.ts | 1 + build/test/compile/data/filter.test.js | 43 + .../test/compile/data/filterinvalid.test.d.ts | 1 + build/test/compile/data/filterinvalid.test.js | 85 + build/test/compile/data/formatparse.test.d.ts | 1 + build/test/compile/data/formatparse.test.js | 276 + build/test/compile/data/geojson.test.d.ts | 1 + build/test/compile/data/geojson.test.js | 47 + build/test/compile/data/geopoint.test.d.ts | 1 + build/test/compile/data/geopoint.test.js | 50 + build/test/compile/data/lookup.test.d.ts | 1 + build/test/compile/data/lookup.test.js | 80 + build/test/compile/data/parse.test.d.ts | 1 + build/test/compile/data/parse.test.js | 209 + build/test/compile/data/source.test.d.ts | 1 + build/test/compile/data/source.test.js | 107 + build/test/compile/data/stack.test.d.ts | 1 + build/test/compile/data/stack.test.js | 292 + build/test/compile/data/timeunit.test.d.ts | 1 + build/test/compile/data/timeunit.test.js | 39 + build/test/compile/data/window.test.d.ts | 1 + build/test/compile/data/window.test.js | 126 + build/test/compile/facet.test.d.ts | 1 + build/test/compile/facet.test.js | 347 + build/test/compile/layer.test.d.ts | 1 + build/test/compile/layer.test.js | 97 + build/test/compile/layout/header.test.d.ts | 1 + build/test/compile/layout/header.test.js | 113 + .../compile/layoutsize/assemble.test.d.ts | 1 + .../test/compile/layoutsize/assemble.test.js | 166 + build/test/compile/layoutsize/parse.test.d.ts | 1 + build/test/compile/layoutsize/parse.test.js | 82 + build/test/compile/legend/assemble.test.d.ts | 1 + build/test/compile/legend/assemble.test.js | 47 + build/test/compile/legend/encode.test.d.ts | 1 + build/test/compile/legend/encode.test.js | 98 + build/test/compile/legend/parse.test.d.ts | 1 + build/test/compile/legend/parse.test.js | 176 + .../test/compile/legend/properties.test.d.ts | 1 + build/test/compile/legend/properties.test.js | 49 + build/test/compile/mark/area.test.d.ts | 1 + build/test/compile/mark/area.test.js | 213 + build/test/compile/mark/bar.test.d.ts | 1 + build/test/compile/mark/bar.test.js | 655 + build/test/compile/mark/geoshape.test.d.ts | 1 + build/test/compile/mark/geoshape.test.js | 43 + build/test/compile/mark/init.test.d.ts | 1 + build/test/compile/mark/init.test.js | 281 + build/test/compile/mark/line.test.d.ts | 1 + build/test/compile/mark/line.test.js | 140 + build/test/compile/mark/mark.test.d.ts | 1 + build/test/compile/mark/mark.test.js | 288 + build/test/compile/mark/mixins.test.d.ts | 1 + build/test/compile/mark/mixins.test.js | 232 + build/test/compile/mark/point.test.d.ts | 1 + build/test/compile/mark/point.test.js | 275 + build/test/compile/mark/rect.test.d.ts | 1 + build/test/compile/mark/rect.test.js | 140 + build/test/compile/mark/rule.test.d.ts | 1 + build/test/compile/mark/rule.test.js | 215 + build/test/compile/mark/text.test.d.ts | 1 + build/test/compile/mark/text.test.js | 165 + build/test/compile/mark/tick.test.d.ts | 1 + build/test/compile/mark/tick.test.js | 158 + build/test/compile/mark/valueref.test.d.ts | 1 + build/test/compile/mark/valueref.test.js | 30 + build/test/compile/model.test.d.ts | 1 + build/test/compile/model.test.js | 113 + .../compile/projection/assemble.test.d.ts | 1 + .../test/compile/projection/assemble.test.js | 38 + build/test/compile/projection/parse.test.d.ts | 1 + build/test/compile/projection/parse.test.js | 306 + build/test/compile/repeat.test.d.ts | 1 + build/test/compile/repeat.test.js | 176 + build/test/compile/resolve.test.d.ts | 1 + build/test/compile/resolve.test.js | 107 + build/test/compile/scale/assemble.test.d.ts | 1 + build/test/compile/scale/assemble.test.js | 123 + build/test/compile/scale/domain.test.d.ts | 1 + build/test/compile/scale/domain.test.js | 753 + build/test/compile/scale/parse.test.d.ts | 1 + build/test/compile/scale/parse.test.js | 470 + build/test/compile/scale/properties.test.d.ts | 1 + build/test/compile/scale/properties.test.js | 138 + build/test/compile/scale/range.test.d.ts | 1 + build/test/compile/scale/range.test.js | 204 + build/test/compile/scale/type.test.d.ts | 1 + build/test/compile/scale/type.test.js | 161 + build/test/compile/selection/facets.test.d.ts | 1 + build/test/compile/selection/facets.test.js | 52 + .../compile/selection/identifier.test.d.ts | 1 + .../test/compile/selection/identifier.test.js | 72 + build/test/compile/selection/inputs.test.d.ts | 1 + build/test/compile/selection/inputs.test.js | 150 + .../test/compile/selection/interval.test.d.ts | 1 + build/test/compile/selection/interval.test.js | 451 + build/test/compile/selection/layers.test.d.ts | 1 + build/test/compile/selection/layers.test.js | 220 + build/test/compile/selection/multi.test.d.ts | 1 + build/test/compile/selection/multi.test.js | 61 + .../test/compile/selection/nearest.test.d.ts | 1 + build/test/compile/selection/nearest.test.js | 100 + build/test/compile/selection/parse.test.d.ts | 1 + build/test/compile/selection/parse.test.js | 108 + .../compile/selection/predicate.test.d.ts | 1 + .../test/compile/selection/predicate.test.js | 96 + build/test/compile/selection/scales.test.d.ts | 1 + build/test/compile/selection/scales.test.js | 143 + build/test/compile/selection/single.test.d.ts | 1 + build/test/compile/selection/single.test.js | 106 + .../test/compile/selection/timeunit.test.d.ts | 1 + build/test/compile/selection/timeunit.test.js | 124 + build/test/compile/selection/toggle.test.d.ts | 1 + build/test/compile/selection/toggle.test.js | 88 + .../compile/selection/translate.test.d.ts | 1 + .../test/compile/selection/translate.test.js | 210 + build/test/compile/selection/zoom.test.d.ts | 1 + build/test/compile/selection/zoom.test.js | 209 + build/test/compile/unit.test.d.ts | 1 + build/test/compile/unit.test.js | 81 + build/test/compositemark/boxplot.test.d.ts | 1 + build/test/compositemark/boxplot.test.js | 1811 +++ build/test/compositemark/errorbar.test.d.ts | 1 + build/test/compositemark/errorbar.test.js | 94 + build/test/config.test.d.ts | 1 + build/test/config.test.js | 46 + build/test/datetime.test.d.ts | 1 + build/test/datetime.test.js | 99 + build/test/encoding.test.d.ts | 1 + build/test/encoding.test.js | 45 + build/test/fielddef.test.d.ts | 1 + build/test/fielddef.test.js | 185 + build/test/predicate.test.d.ts | 1 + build/test/predicate.test.js | 178 + build/test/scale.test.d.ts | 1 + build/test/scale.test.js | 127 + build/test/spec.test.d.ts | 1 + build/test/spec.test.js | 862 ++ build/test/stack.test.d.ts | 1 + build/test/stack.test.js | 470 + build/test/timeunit.test.d.ts | 1 + build/test/timeunit.test.js | 153 + build/test/transform.test.d.ts | 1 + build/test/transform.test.js | 29 + build/test/type.test.d.ts | 1 + build/test/type.test.js | 43 + build/test/util.d.ts | 17 + build/test/util.js | 64 + build/test/util.test.d.ts | 1 + build/test/util.test.js | 127 + build/test/validate.test.d.ts | 1 + build/test/validate.test.js | 70 + build/vega-lite.js | 12823 ++++++++++++++++ build/vega-lite.js.map | 1 + 431 files changed, 48921 insertions(+) create mode 100644 build/src/aggregate.d.ts create mode 100644 build/src/aggregate.js create mode 100644 build/src/axis.d.ts create mode 100644 build/src/axis.js create mode 100644 build/src/bin.d.ts create mode 100644 build/src/bin.js create mode 100644 build/src/channel.d.ts create mode 100644 build/src/channel.js create mode 100644 build/src/compile/axis/assemble.d.ts create mode 100644 build/src/compile/axis/assemble.js create mode 100644 build/src/compile/axis/component.d.ts create mode 100644 build/src/compile/axis/component.js create mode 100644 build/src/compile/axis/config.d.ts create mode 100644 build/src/compile/axis/config.js create mode 100644 build/src/compile/axis/encode.d.ts create mode 100644 build/src/compile/axis/encode.js create mode 100644 build/src/compile/axis/parse.d.ts create mode 100644 build/src/compile/axis/parse.js create mode 100644 build/src/compile/axis/properties.d.ts create mode 100644 build/src/compile/axis/properties.js create mode 100644 build/src/compile/baseconcat.d.ts create mode 100644 build/src/compile/baseconcat.js create mode 100644 build/src/compile/buildmodel.d.ts create mode 100644 build/src/compile/buildmodel.js create mode 100644 build/src/compile/common.d.ts create mode 100644 build/src/compile/common.js create mode 100644 build/src/compile/compile.d.ts create mode 100644 build/src/compile/compile.js create mode 100644 build/src/compile/concat.d.ts create mode 100644 build/src/compile/concat.js create mode 100644 build/src/compile/data/aggregate.d.ts create mode 100644 build/src/compile/data/aggregate.js create mode 100644 build/src/compile/data/assemble.d.ts create mode 100644 build/src/compile/data/assemble.js create mode 100644 build/src/compile/data/bin.d.ts create mode 100644 build/src/compile/data/bin.js create mode 100644 build/src/compile/data/calculate.d.ts create mode 100644 build/src/compile/data/calculate.js create mode 100644 build/src/compile/data/dataflow.d.ts create mode 100644 build/src/compile/data/dataflow.js create mode 100644 build/src/compile/data/facet.d.ts create mode 100644 build/src/compile/data/facet.js create mode 100644 build/src/compile/data/filter.d.ts create mode 100644 build/src/compile/data/filter.js create mode 100644 build/src/compile/data/filterinvalid.d.ts create mode 100644 build/src/compile/data/filterinvalid.js create mode 100644 build/src/compile/data/formatparse.d.ts create mode 100644 build/src/compile/data/formatparse.js create mode 100644 build/src/compile/data/geojson.d.ts create mode 100644 build/src/compile/data/geojson.js create mode 100644 build/src/compile/data/geopoint.d.ts create mode 100644 build/src/compile/data/geopoint.js create mode 100644 build/src/compile/data/indentifier.d.ts create mode 100644 build/src/compile/data/indentifier.js create mode 100644 build/src/compile/data/index.d.ts create mode 100644 build/src/compile/data/index.js create mode 100644 build/src/compile/data/lookup.d.ts create mode 100644 build/src/compile/data/lookup.js create mode 100644 build/src/compile/data/optimize.d.ts create mode 100644 build/src/compile/data/optimize.js create mode 100644 build/src/compile/data/optimizers.d.ts create mode 100644 build/src/compile/data/optimizers.js create mode 100644 build/src/compile/data/parse.d.ts create mode 100644 build/src/compile/data/parse.js create mode 100644 build/src/compile/data/source.d.ts create mode 100644 build/src/compile/data/source.js create mode 100644 build/src/compile/data/stack.d.ts create mode 100644 build/src/compile/data/stack.js create mode 100644 build/src/compile/data/timeunit.d.ts create mode 100644 build/src/compile/data/timeunit.js create mode 100644 build/src/compile/data/window.d.ts create mode 100644 build/src/compile/data/window.js create mode 100644 build/src/compile/facet.d.ts create mode 100644 build/src/compile/facet.js create mode 100644 build/src/compile/layer.d.ts create mode 100644 build/src/compile/layer.js create mode 100644 build/src/compile/layout/header.d.ts create mode 100644 build/src/compile/layout/header.js create mode 100644 build/src/compile/layoutsize/assemble.d.ts create mode 100644 build/src/compile/layoutsize/assemble.js create mode 100644 build/src/compile/layoutsize/component.d.ts create mode 100644 build/src/compile/layoutsize/component.js create mode 100644 build/src/compile/layoutsize/parse.d.ts create mode 100644 build/src/compile/layoutsize/parse.js create mode 100644 build/src/compile/legend/assemble.d.ts create mode 100644 build/src/compile/legend/assemble.js create mode 100644 build/src/compile/legend/component.d.ts create mode 100644 build/src/compile/legend/component.js create mode 100644 build/src/compile/legend/encode.d.ts create mode 100644 build/src/compile/legend/encode.js create mode 100644 build/src/compile/legend/parse.d.ts create mode 100644 build/src/compile/legend/parse.js create mode 100644 build/src/compile/legend/properties.d.ts create mode 100644 build/src/compile/legend/properties.js create mode 100644 build/src/compile/mark/area.d.ts create mode 100644 build/src/compile/mark/area.js create mode 100644 build/src/compile/mark/bar.d.ts create mode 100644 build/src/compile/mark/bar.js create mode 100644 build/src/compile/mark/base.d.ts create mode 100644 build/src/compile/mark/base.js create mode 100644 build/src/compile/mark/geoshape.d.ts create mode 100644 build/src/compile/mark/geoshape.js create mode 100644 build/src/compile/mark/init.d.ts create mode 100644 build/src/compile/mark/init.js create mode 100644 build/src/compile/mark/line.d.ts create mode 100644 build/src/compile/mark/line.js create mode 100644 build/src/compile/mark/mark.d.ts create mode 100644 build/src/compile/mark/mark.js create mode 100644 build/src/compile/mark/mixins.d.ts create mode 100644 build/src/compile/mark/mixins.js create mode 100644 build/src/compile/mark/point.d.ts create mode 100644 build/src/compile/mark/point.js create mode 100644 build/src/compile/mark/rect.d.ts create mode 100644 build/src/compile/mark/rect.js create mode 100644 build/src/compile/mark/rule.d.ts create mode 100644 build/src/compile/mark/rule.js create mode 100644 build/src/compile/mark/text.d.ts create mode 100644 build/src/compile/mark/text.js create mode 100644 build/src/compile/mark/tick.d.ts create mode 100644 build/src/compile/mark/tick.js create mode 100644 build/src/compile/mark/valueref.d.ts create mode 100644 build/src/compile/mark/valueref.js create mode 100644 build/src/compile/model.d.ts create mode 100644 build/src/compile/model.js create mode 100644 build/src/compile/projection/assemble.d.ts create mode 100644 build/src/compile/projection/assemble.js create mode 100644 build/src/compile/projection/component.d.ts create mode 100644 build/src/compile/projection/component.js create mode 100644 build/src/compile/projection/parse.d.ts create mode 100644 build/src/compile/projection/parse.js create mode 100644 build/src/compile/repeat.d.ts create mode 100644 build/src/compile/repeat.js create mode 100644 build/src/compile/repeater.d.ts create mode 100644 build/src/compile/repeater.js create mode 100644 build/src/compile/resolve.d.ts create mode 100644 build/src/compile/resolve.js create mode 100644 build/src/compile/scale/assemble.d.ts create mode 100644 build/src/compile/scale/assemble.js create mode 100644 build/src/compile/scale/component.d.ts create mode 100644 build/src/compile/scale/component.js create mode 100644 build/src/compile/scale/domain.d.ts create mode 100644 build/src/compile/scale/domain.js create mode 100644 build/src/compile/scale/parse.d.ts create mode 100644 build/src/compile/scale/parse.js create mode 100644 build/src/compile/scale/properties.d.ts create mode 100644 build/src/compile/scale/properties.js create mode 100644 build/src/compile/scale/range.d.ts create mode 100644 build/src/compile/scale/range.js create mode 100644 build/src/compile/scale/type.d.ts create mode 100644 build/src/compile/scale/type.js create mode 100644 build/src/compile/selection/interval.d.ts create mode 100644 build/src/compile/selection/interval.js create mode 100644 build/src/compile/selection/multi.d.ts create mode 100644 build/src/compile/selection/multi.js create mode 100644 build/src/compile/selection/selection.d.ts create mode 100644 build/src/compile/selection/selection.js create mode 100644 build/src/compile/selection/single.d.ts create mode 100644 build/src/compile/selection/single.js create mode 100644 build/src/compile/selection/transforms/inputs.d.ts create mode 100644 build/src/compile/selection/transforms/inputs.js create mode 100644 build/src/compile/selection/transforms/nearest.d.ts create mode 100644 build/src/compile/selection/transforms/nearest.js create mode 100644 build/src/compile/selection/transforms/project.d.ts create mode 100644 build/src/compile/selection/transforms/project.js create mode 100644 build/src/compile/selection/transforms/scales.d.ts create mode 100644 build/src/compile/selection/transforms/scales.js create mode 100644 build/src/compile/selection/transforms/toggle.d.ts create mode 100644 build/src/compile/selection/transforms/toggle.js create mode 100644 build/src/compile/selection/transforms/transforms.d.ts create mode 100644 build/src/compile/selection/transforms/transforms.js create mode 100644 build/src/compile/selection/transforms/translate.d.ts create mode 100644 build/src/compile/selection/transforms/translate.js create mode 100644 build/src/compile/selection/transforms/zoom.d.ts create mode 100644 build/src/compile/selection/transforms/zoom.js create mode 100644 build/src/compile/split.d.ts create mode 100644 build/src/compile/split.js create mode 100644 build/src/compile/unit.d.ts create mode 100644 build/src/compile/unit.js create mode 100644 build/src/compositemark/boxplot.d.ts create mode 100644 build/src/compositemark/boxplot.js create mode 100644 build/src/compositemark/common.d.ts create mode 100644 build/src/compositemark/common.js create mode 100644 build/src/compositemark/errorbar.d.ts create mode 100644 build/src/compositemark/errorbar.js create mode 100644 build/src/compositemark/index.d.ts create mode 100644 build/src/compositemark/index.js create mode 100644 build/src/config.d.ts create mode 100644 build/src/config.js create mode 100644 build/src/data.d.ts create mode 100644 build/src/data.js create mode 100644 build/src/datetime.d.ts create mode 100644 build/src/datetime.js create mode 100644 build/src/encoding.d.ts create mode 100644 build/src/encoding.js create mode 100644 build/src/facet.d.ts create mode 100644 build/src/facet.js create mode 100644 build/src/fielddef.d.ts create mode 100644 build/src/fielddef.js create mode 100644 build/src/guide.d.ts create mode 100644 build/src/guide.js create mode 100644 build/src/index.d.ts create mode 100644 build/src/index.js create mode 100644 build/src/legend.d.ts create mode 100644 build/src/legend.js create mode 100644 build/src/log.d.ts create mode 100644 build/src/log.js create mode 100644 build/src/logical.d.ts create mode 100644 build/src/logical.js create mode 100644 build/src/mark.d.ts create mode 100644 build/src/mark.js create mode 100644 build/src/package.json create mode 100644 build/src/predicate.d.ts create mode 100644 build/src/predicate.js create mode 100644 build/src/projection.d.ts create mode 100644 build/src/projection.js create mode 100644 build/src/repeat.d.ts create mode 100644 build/src/repeat.js create mode 100644 build/src/resolve.d.ts create mode 100644 build/src/resolve.js create mode 100644 build/src/scale.d.ts create mode 100644 build/src/scale.js create mode 100644 build/src/selection.d.ts create mode 100644 build/src/selection.js create mode 100644 build/src/sort.d.ts create mode 100644 build/src/sort.js create mode 100644 build/src/spec.d.ts create mode 100644 build/src/spec.js create mode 100644 build/src/stack.d.ts create mode 100644 build/src/stack.js create mode 100644 build/src/timeunit.d.ts create mode 100644 build/src/timeunit.js create mode 100644 build/src/title.d.ts create mode 100644 build/src/title.js create mode 100644 build/src/toplevelprops.d.ts create mode 100644 build/src/toplevelprops.js create mode 100644 build/src/transform.d.ts create mode 100644 build/src/transform.js create mode 100644 build/src/type.d.ts create mode 100644 build/src/type.js create mode 100644 build/src/util.d.ts create mode 100644 build/src/util.js create mode 100644 build/src/validate.d.ts create mode 100644 build/src/validate.js create mode 100644 build/src/vega.schema.d.ts create mode 100644 build/src/vega.schema.js create mode 100644 build/test/axis.test.d.ts create mode 100644 build/test/axis.test.js create mode 100644 build/test/bin.test.d.ts create mode 100644 build/test/bin.test.js create mode 100644 build/test/channel.test.d.ts create mode 100644 build/test/channel.test.js create mode 100644 build/test/compile/axis/assemble.test.d.ts create mode 100644 build/test/compile/axis/assemble.test.js create mode 100644 build/test/compile/axis/encode.test.d.ts create mode 100644 build/test/compile/axis/encode.test.js create mode 100644 build/test/compile/axis/parse.test.d.ts create mode 100644 build/test/compile/axis/parse.test.js create mode 100644 build/test/compile/axis/properties.test.d.ts create mode 100644 build/test/compile/axis/properties.test.js create mode 100644 build/test/compile/common.test.d.ts create mode 100644 build/test/compile/common.test.js create mode 100644 build/test/compile/compile.test.d.ts create mode 100644 build/test/compile/compile.test.js create mode 100644 build/test/compile/concat.test.d.ts create mode 100644 build/test/compile/concat.test.js create mode 100644 build/test/compile/data/aggregate.test.d.ts create mode 100644 build/test/compile/data/aggregate.test.js create mode 100644 build/test/compile/data/assemble.test.d.ts create mode 100644 build/test/compile/data/assemble.test.js create mode 100644 build/test/compile/data/bin.test.d.ts create mode 100644 build/test/compile/data/bin.test.js create mode 100644 build/test/compile/data/calculate.test.d.ts create mode 100644 build/test/compile/data/calculate.test.js create mode 100644 build/test/compile/data/dataflow.test.d.ts create mode 100644 build/test/compile/data/dataflow.test.js create mode 100644 build/test/compile/data/facet.test.d.ts create mode 100644 build/test/compile/data/facet.test.js create mode 100644 build/test/compile/data/filter.test.d.ts create mode 100644 build/test/compile/data/filter.test.js create mode 100644 build/test/compile/data/filterinvalid.test.d.ts create mode 100644 build/test/compile/data/filterinvalid.test.js create mode 100644 build/test/compile/data/formatparse.test.d.ts create mode 100644 build/test/compile/data/formatparse.test.js create mode 100644 build/test/compile/data/geojson.test.d.ts create mode 100644 build/test/compile/data/geojson.test.js create mode 100644 build/test/compile/data/geopoint.test.d.ts create mode 100644 build/test/compile/data/geopoint.test.js create mode 100644 build/test/compile/data/lookup.test.d.ts create mode 100644 build/test/compile/data/lookup.test.js create mode 100644 build/test/compile/data/parse.test.d.ts create mode 100644 build/test/compile/data/parse.test.js create mode 100644 build/test/compile/data/source.test.d.ts create mode 100644 build/test/compile/data/source.test.js create mode 100644 build/test/compile/data/stack.test.d.ts create mode 100644 build/test/compile/data/stack.test.js create mode 100644 build/test/compile/data/timeunit.test.d.ts create mode 100644 build/test/compile/data/timeunit.test.js create mode 100644 build/test/compile/data/window.test.d.ts create mode 100644 build/test/compile/data/window.test.js create mode 100644 build/test/compile/facet.test.d.ts create mode 100644 build/test/compile/facet.test.js create mode 100644 build/test/compile/layer.test.d.ts create mode 100644 build/test/compile/layer.test.js create mode 100644 build/test/compile/layout/header.test.d.ts create mode 100644 build/test/compile/layout/header.test.js create mode 100644 build/test/compile/layoutsize/assemble.test.d.ts create mode 100644 build/test/compile/layoutsize/assemble.test.js create mode 100644 build/test/compile/layoutsize/parse.test.d.ts create mode 100644 build/test/compile/layoutsize/parse.test.js create mode 100644 build/test/compile/legend/assemble.test.d.ts create mode 100644 build/test/compile/legend/assemble.test.js create mode 100644 build/test/compile/legend/encode.test.d.ts create mode 100644 build/test/compile/legend/encode.test.js create mode 100644 build/test/compile/legend/parse.test.d.ts create mode 100644 build/test/compile/legend/parse.test.js create mode 100644 build/test/compile/legend/properties.test.d.ts create mode 100644 build/test/compile/legend/properties.test.js create mode 100644 build/test/compile/mark/area.test.d.ts create mode 100644 build/test/compile/mark/area.test.js create mode 100644 build/test/compile/mark/bar.test.d.ts create mode 100644 build/test/compile/mark/bar.test.js create mode 100644 build/test/compile/mark/geoshape.test.d.ts create mode 100644 build/test/compile/mark/geoshape.test.js create mode 100644 build/test/compile/mark/init.test.d.ts create mode 100644 build/test/compile/mark/init.test.js create mode 100644 build/test/compile/mark/line.test.d.ts create mode 100644 build/test/compile/mark/line.test.js create mode 100644 build/test/compile/mark/mark.test.d.ts create mode 100644 build/test/compile/mark/mark.test.js create mode 100644 build/test/compile/mark/mixins.test.d.ts create mode 100644 build/test/compile/mark/mixins.test.js create mode 100644 build/test/compile/mark/point.test.d.ts create mode 100644 build/test/compile/mark/point.test.js create mode 100644 build/test/compile/mark/rect.test.d.ts create mode 100644 build/test/compile/mark/rect.test.js create mode 100644 build/test/compile/mark/rule.test.d.ts create mode 100644 build/test/compile/mark/rule.test.js create mode 100644 build/test/compile/mark/text.test.d.ts create mode 100644 build/test/compile/mark/text.test.js create mode 100644 build/test/compile/mark/tick.test.d.ts create mode 100644 build/test/compile/mark/tick.test.js create mode 100644 build/test/compile/mark/valueref.test.d.ts create mode 100644 build/test/compile/mark/valueref.test.js create mode 100644 build/test/compile/model.test.d.ts create mode 100644 build/test/compile/model.test.js create mode 100644 build/test/compile/projection/assemble.test.d.ts create mode 100644 build/test/compile/projection/assemble.test.js create mode 100644 build/test/compile/projection/parse.test.d.ts create mode 100644 build/test/compile/projection/parse.test.js create mode 100644 build/test/compile/repeat.test.d.ts create mode 100644 build/test/compile/repeat.test.js create mode 100644 build/test/compile/resolve.test.d.ts create mode 100644 build/test/compile/resolve.test.js create mode 100644 build/test/compile/scale/assemble.test.d.ts create mode 100644 build/test/compile/scale/assemble.test.js create mode 100644 build/test/compile/scale/domain.test.d.ts create mode 100644 build/test/compile/scale/domain.test.js create mode 100644 build/test/compile/scale/parse.test.d.ts create mode 100644 build/test/compile/scale/parse.test.js create mode 100644 build/test/compile/scale/properties.test.d.ts create mode 100644 build/test/compile/scale/properties.test.js create mode 100644 build/test/compile/scale/range.test.d.ts create mode 100644 build/test/compile/scale/range.test.js create mode 100644 build/test/compile/scale/type.test.d.ts create mode 100644 build/test/compile/scale/type.test.js create mode 100644 build/test/compile/selection/facets.test.d.ts create mode 100644 build/test/compile/selection/facets.test.js create mode 100644 build/test/compile/selection/identifier.test.d.ts create mode 100644 build/test/compile/selection/identifier.test.js create mode 100644 build/test/compile/selection/inputs.test.d.ts create mode 100644 build/test/compile/selection/inputs.test.js create mode 100644 build/test/compile/selection/interval.test.d.ts create mode 100644 build/test/compile/selection/interval.test.js create mode 100644 build/test/compile/selection/layers.test.d.ts create mode 100644 build/test/compile/selection/layers.test.js create mode 100644 build/test/compile/selection/multi.test.d.ts create mode 100644 build/test/compile/selection/multi.test.js create mode 100644 build/test/compile/selection/nearest.test.d.ts create mode 100644 build/test/compile/selection/nearest.test.js create mode 100644 build/test/compile/selection/parse.test.d.ts create mode 100644 build/test/compile/selection/parse.test.js create mode 100644 build/test/compile/selection/predicate.test.d.ts create mode 100644 build/test/compile/selection/predicate.test.js create mode 100644 build/test/compile/selection/scales.test.d.ts create mode 100644 build/test/compile/selection/scales.test.js create mode 100644 build/test/compile/selection/single.test.d.ts create mode 100644 build/test/compile/selection/single.test.js create mode 100644 build/test/compile/selection/timeunit.test.d.ts create mode 100644 build/test/compile/selection/timeunit.test.js create mode 100644 build/test/compile/selection/toggle.test.d.ts create mode 100644 build/test/compile/selection/toggle.test.js create mode 100644 build/test/compile/selection/translate.test.d.ts create mode 100644 build/test/compile/selection/translate.test.js create mode 100644 build/test/compile/selection/zoom.test.d.ts create mode 100644 build/test/compile/selection/zoom.test.js create mode 100644 build/test/compile/unit.test.d.ts create mode 100644 build/test/compile/unit.test.js create mode 100644 build/test/compositemark/boxplot.test.d.ts create mode 100644 build/test/compositemark/boxplot.test.js create mode 100644 build/test/compositemark/errorbar.test.d.ts create mode 100644 build/test/compositemark/errorbar.test.js create mode 100644 build/test/config.test.d.ts create mode 100644 build/test/config.test.js create mode 100644 build/test/datetime.test.d.ts create mode 100644 build/test/datetime.test.js create mode 100644 build/test/encoding.test.d.ts create mode 100644 build/test/encoding.test.js create mode 100644 build/test/fielddef.test.d.ts create mode 100644 build/test/fielddef.test.js create mode 100644 build/test/predicate.test.d.ts create mode 100644 build/test/predicate.test.js create mode 100644 build/test/scale.test.d.ts create mode 100644 build/test/scale.test.js create mode 100644 build/test/spec.test.d.ts create mode 100644 build/test/spec.test.js create mode 100644 build/test/stack.test.d.ts create mode 100644 build/test/stack.test.js create mode 100644 build/test/timeunit.test.d.ts create mode 100644 build/test/timeunit.test.js create mode 100644 build/test/transform.test.d.ts create mode 100644 build/test/transform.test.js create mode 100644 build/test/type.test.d.ts create mode 100644 build/test/type.test.js create mode 100644 build/test/util.d.ts create mode 100644 build/test/util.js create mode 100644 build/test/util.test.d.ts create mode 100644 build/test/util.test.js create mode 100644 build/test/validate.test.d.ts create mode 100644 build/test/validate.test.js create mode 100644 build/vega-lite.js create mode 100644 build/vega-lite.js.map diff --git a/build/src/aggregate.d.ts b/build/src/aggregate.d.ts new file mode 100644 index 0000000000..38680434bd --- /dev/null +++ b/build/src/aggregate.d.ts @@ -0,0 +1,14 @@ +import { AggregateOp } from 'vega'; +export declare const AGGREGATE_OPS: AggregateOp[]; +export declare function isAggregateOp(a: string): a is AggregateOp; +export declare const COUNTING_OPS: AggregateOp[]; +export declare function isCountingAggregateOp(aggregate: string): boolean; +/** Additive-based aggregation operations. These can be applied to stack. */ +export declare const SUM_OPS: AggregateOp[]; +/** + * Aggregation operators that always produce values within the range [domainMin, domainMax]. + */ +export declare const SHARED_DOMAIN_OPS: AggregateOp[]; +export declare const SHARED_DOMAIN_OP_INDEX: { + [T: string]: true; +}; diff --git a/build/src/aggregate.js b/build/src/aggregate.js new file mode 100644 index 0000000000..060c5501e0 --- /dev/null +++ b/build/src/aggregate.js @@ -0,0 +1,60 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var util_1 = require("./util"); +var AGGREGATE_OP_INDEX = { + argmax: 1, + argmin: 1, + average: 1, + count: 1, + distinct: 1, + max: 1, + mean: 1, + median: 1, + min: 1, + missing: 1, + q1: 1, + q3: 1, + ci0: 1, + ci1: 1, + stderr: 1, + stdev: 1, + stdevp: 1, + sum: 1, + valid: 1, + values: 1, + variance: 1, + variancep: 1, +}; +exports.AGGREGATE_OPS = util_1.flagKeys(AGGREGATE_OP_INDEX); +function isAggregateOp(a) { + return !!AGGREGATE_OP_INDEX[a]; +} +exports.isAggregateOp = isAggregateOp; +exports.COUNTING_OPS = ['count', 'valid', 'missing', 'distinct']; +function isCountingAggregateOp(aggregate) { + return aggregate && util_1.contains(exports.COUNTING_OPS, aggregate); +} +exports.isCountingAggregateOp = isCountingAggregateOp; +/** Additive-based aggregation operations. These can be applied to stack. */ +exports.SUM_OPS = [ + 'count', + 'sum', + 'distinct', + 'valid', + 'missing' +]; +/** + * Aggregation operators that always produce values within the range [domainMin, domainMax]. + */ +exports.SHARED_DOMAIN_OPS = [ + 'mean', + 'average', + 'median', + 'q1', + 'q3', + 'min', + 'max', +]; +exports.SHARED_DOMAIN_OP_INDEX = vega_util_1.toSet(exports.SHARED_DOMAIN_OPS); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZ3JlZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLHVDQUFnQztBQUNoQywrQkFBZ0Q7QUFFaEQsSUFBTSxrQkFBa0IsR0FBc0I7SUFDNUMsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsS0FBSyxFQUFFLENBQUM7SUFDUixRQUFRLEVBQUUsQ0FBQztJQUNYLEdBQUcsRUFBRSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUM7SUFDUCxNQUFNLEVBQUUsQ0FBQztJQUNULEdBQUcsRUFBRSxDQUFDO0lBQ04sT0FBTyxFQUFFLENBQUM7SUFDVixFQUFFLEVBQUUsQ0FBQztJQUNMLEVBQUUsRUFBRSxDQUFDO0lBQ0wsR0FBRyxFQUFFLENBQUM7SUFDTixHQUFHLEVBQUUsQ0FBQztJQUNOLE1BQU0sRUFBRSxDQUFDO0lBQ1QsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULEdBQUcsRUFBRSxDQUFDO0lBQ04sS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULFFBQVEsRUFBRSxDQUFDO0lBQ1gsU0FBUyxFQUFFLENBQUM7Q0FDYixDQUFDO0FBRVcsUUFBQSxhQUFhLEdBQUcsZUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFFMUQsdUJBQThCLENBQVM7SUFDckMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUZELHNDQUVDO0FBRVksUUFBQSxZQUFZLEdBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFckYsK0JBQXNDLFNBQWlCO0lBQ3JELE9BQU8sU0FBUyxJQUFJLGVBQVEsQ0FBQyxvQkFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFGRCxzREFFQztBQUVELDZFQUE2RTtBQUNoRSxRQUFBLE9BQU8sR0FBa0I7SUFDbEMsT0FBTztJQUNQLEtBQUs7SUFDTCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7Q0FDWixDQUFDO0FBRUY7O0dBRUc7QUFDVSxRQUFBLGlCQUFpQixHQUFrQjtJQUM1QyxNQUFNO0lBQ04sU0FBUztJQUNULFFBQVE7SUFDUixJQUFJO0lBQ0osSUFBSTtJQUNKLEtBQUs7SUFDTCxLQUFLO0NBQ1IsQ0FBQztBQUVXLFFBQUEsc0JBQXNCLEdBQUcsaUJBQUssQ0FBQyx5QkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge3RvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtjb250YWlucywgRmxhZywgZmxhZ0tleXN9IGZyb20gJy4vdXRpbCc7XG5cbmNvbnN0IEFHR1JFR0FURV9PUF9JTkRFWDogRmxhZzxBZ2dyZWdhdGVPcD4gPSB7XG4gIGFyZ21heDogMSxcbiAgYXJnbWluOiAxLFxuICBhdmVyYWdlOiAxLFxuICBjb3VudDogMSxcbiAgZGlzdGluY3Q6IDEsXG4gIG1heDogMSxcbiAgbWVhbjogMSxcbiAgbWVkaWFuOiAxLFxuICBtaW46IDEsXG4gIG1pc3Npbmc6IDEsXG4gIHExOiAxLFxuICBxMzogMSxcbiAgY2kwOiAxLFxuICBjaTE6IDEsXG4gIHN0ZGVycjogMSxcbiAgc3RkZXY6IDEsXG4gIHN0ZGV2cDogMSxcbiAgc3VtOiAxLFxuICB2YWxpZDogMSxcbiAgdmFsdWVzOiAxLFxuICB2YXJpYW5jZTogMSxcbiAgdmFyaWFuY2VwOiAxLFxufTtcblxuZXhwb3J0IGNvbnN0IEFHR1JFR0FURV9PUFMgPSBmbGFnS2V5cyhBR0dSRUdBVEVfT1BfSU5ERVgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNBZ2dyZWdhdGVPcChhOiBzdHJpbmcpOiBhIGlzIEFnZ3JlZ2F0ZU9wIHtcbiAgcmV0dXJuICEhQUdHUkVHQVRFX09QX0lOREVYW2FdO1xufVxuXG5leHBvcnQgY29uc3QgQ09VTlRJTkdfT1BTOiBBZ2dyZWdhdGVPcFtdID0gWydjb3VudCcsICd2YWxpZCcsICdtaXNzaW5nJywgJ2Rpc3RpbmN0J107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvdW50aW5nQWdncmVnYXRlT3AoYWdncmVnYXRlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFnZ3JlZ2F0ZSAmJiBjb250YWlucyhDT1VOVElOR19PUFMsIGFnZ3JlZ2F0ZSk7XG59XG5cbi8qKiBBZGRpdGl2ZS1iYXNlZCBhZ2dyZWdhdGlvbiBvcGVyYXRpb25zLiAgVGhlc2UgY2FuIGJlIGFwcGxpZWQgdG8gc3RhY2suICovXG5leHBvcnQgY29uc3QgU1VNX09QUzogQWdncmVnYXRlT3BbXSA9IFtcbiAgICAnY291bnQnLFxuICAgICdzdW0nLFxuICAgICdkaXN0aW5jdCcsXG4gICAgJ3ZhbGlkJyxcbiAgICAnbWlzc2luZydcbl07XG5cbi8qKlxuICogQWdncmVnYXRpb24gb3BlcmF0b3JzIHRoYXQgYWx3YXlzIHByb2R1Y2UgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgW2RvbWFpbk1pbiwgZG9tYWluTWF4XS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNIQVJFRF9ET01BSU5fT1BTOiBBZ2dyZWdhdGVPcFtdID0gW1xuICAgICdtZWFuJyxcbiAgICAnYXZlcmFnZScsXG4gICAgJ21lZGlhbicsXG4gICAgJ3ExJyxcbiAgICAncTMnLFxuICAgICdtaW4nLFxuICAgICdtYXgnLFxuXTtcblxuZXhwb3J0IGNvbnN0IFNIQVJFRF9ET01BSU5fT1BfSU5ERVggPSB0b1NldChTSEFSRURfRE9NQUlOX09QUyk7XG4iXX0= \ No newline at end of file diff --git a/build/src/axis.d.ts b/build/src/axis.d.ts new file mode 100644 index 0000000000..33d9f326e1 --- /dev/null +++ b/build/src/axis.d.ts @@ -0,0 +1,134 @@ +import { DateTime } from './datetime'; +import { Guide, GuideEncodingEntry, VlOnlyGuideConfig } from './guide'; +import { AxisOrient, VgAxis, VgAxisBase, VgAxisConfig } from './vega.schema'; +export interface AxisConfig extends VgAxisConfig, VlOnlyGuideConfig { +} +export interface Axis extends VgAxisBase, Guide { + /** + * The orientation of the axis. One of `"top"`, `"bottom"`, `"left"` or `"right"`. The orientation can be used to further specialize the axis type (e.g., a y axis oriented for the right edge of the chart). + * + * __Default value:__ `"bottom"` for x-axes and `"left"` for y-axes. + */ + orient?: AxisOrient; + /** + * The offset, in pixels, by which to displace the axis from the edge of the enclosing group or data rectangle. + * + * __Default value:__ derived from the [axis config](https://vega.github.io/vega-lite/docs/config.html#facet-scale-config)'s `offset` (`0` by default) + */ + offset?: number; + /** + * The anchor position of the axis in pixels. For x-axis with top or bottom orientation, this sets the axis group x coordinate. For y-axis with left or right orientation, this sets the axis group y coordinate. + * + * __Default value__: `0` + */ + position?: number; + /** + * The rotation angle of the axis labels. + * + * __Default value:__ `-90` for nominal and ordinal fields; `0` otherwise. + * + * @minimum -360 + * @maximum 360 + */ + labelAngle?: number; + /** + * A desired number of ticks, for axes visualizing quantitative scales. The resulting number may be different so that values are "nice" (multiples of 2, 5, 10) and lie within the underlying scale's range. + * @minimum 0 + * + * __Default value__: Determine using a formula `ceil(width/40)` for x and `ceil(height/40)` for y. + */ + tickCount?: number; + /** + * Explicitly set the visible axis tick values. + */ + values?: number[] | DateTime[]; + /** + * A non-positive integer indicating z-index of the axis. + * If zindex is 0, axes should be drawn behind all chart elements. + * To put them in front, use `"zindex = 1"`. + * + * __Default value:__ `1` (in front of the marks) for actual axis and `0` (behind the marks) for grids. + * + * @TJS-type integer + * @minimum 0 + */ + zindex?: number; + /** + * Mark definitions for custom axis encoding. + * + * @hide + */ + encoding?: AxisEncoding; +} +export declare type AxisPart = keyof AxisEncoding; +export declare const AXIS_PARTS: AxisPart[]; +/** + * A dictionary listing whether a certain axis property is applicable for only main axes or only grid axes. + * (Properties not listed are applicable for both) + */ +export declare const AXIS_PROPERTY_TYPE: { + [k in keyof VgAxis]: 'main' | 'grid' | 'both'; +}; +export interface AxisEncoding { + /** + * Custom encoding for the axis container. + */ + axis?: GuideEncodingEntry; + /** + * Custom encoding for the axis domain rule mark. + */ + domain?: GuideEncodingEntry; + /** + * Custom encoding for axis gridline rule marks. + */ + grid?: GuideEncodingEntry; + /** + * Custom encoding for axis label text marks. + */ + labels?: GuideEncodingEntry; + /** + * Custom encoding for axis tick rule marks. + */ + ticks?: GuideEncodingEntry; + /** + * Custom encoding for the axis title text mark. + */ + title?: GuideEncodingEntry; +} +export declare function isAxisProperty(prop: string): prop is keyof Axis; +export declare const VG_AXIS_PROPERTIES: ("title" | "orient" | "scale" | "zindex" | "ticks" | "labels" | "labelBound" | "labelFlush" | "labelPadding" | "labelOverlap" | "domain" | "grid" | "gridScale" | "tickSize" | "tickCount" | "format" | "values" | "offset" | "position" | "titlePadding" | "minExtent" | "maxExtent" | "encode")[]; +export declare const AXIS_PROPERTIES: ("title" | "orient" | "zindex" | "ticks" | "labels" | "labelBound" | "labelFlush" | "labelPadding" | "labelOverlap" | "domain" | "grid" | "tickSize" | "tickCount" | "format" | "values" | "offset" | "position" | "titlePadding" | "minExtent" | "maxExtent" | "encoding" | "labelAngle" | "titleMaxLength")[]; +export interface AxisConfigMixins { + /** + * Axis configuration, which determines default properties for all `x` and `y` [axes](https://vega.github.io/vega-lite/docs/axis.html). For a full list of axis configuration options, please see the [corresponding section of the axis documentation](https://vega.github.io/vega-lite/docs/axis.html#config). + */ + axis?: AxisConfig; + /** + * X-axis specific config. + */ + axisX?: VgAxisConfig; + /** + * Y-axis specific config. + */ + axisY?: VgAxisConfig; + /** + * Specific axis config for y-axis along the left edge of the chart. + */ + axisLeft?: VgAxisConfig; + /** + * Specific axis config for y-axis along the right edge of the chart. + */ + axisRight?: VgAxisConfig; + /** + * Specific axis config for x-axis along the top edge of the chart. + */ + axisTop?: VgAxisConfig; + /** + * Specific axis config for x-axis along the bottom edge of the chart. + */ + axisBottom?: VgAxisConfig; + /** + * Specific axis config for axes with "band" scales. + */ + axisBand?: VgAxisConfig; +} diff --git a/build/src/axis.js b/build/src/axis.js new file mode 100644 index 0000000000..1ef2261ef1 --- /dev/null +++ b/build/src/axis.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("./util"); +exports.AXIS_PARTS = ['domain', 'grid', 'labels', 'ticks', 'title']; +/** + * A dictionary listing whether a certain axis property is applicable for only main axes or only grid axes. + * (Properties not listed are applicable for both) + */ +exports.AXIS_PROPERTY_TYPE = { + grid: 'grid', + gridScale: 'grid', + domain: 'main', + labels: 'main', + labelFlush: 'main', + labelOverlap: 'main', + minExtent: 'main', + maxExtent: 'main', + offset: 'main', + ticks: 'main', + title: 'main', + values: 'both', + scale: 'both', + zindex: 'both' // this is actually set afterward, so it doesn't matter +}; +var COMMON_AXIS_PROPERTIES_INDEX = { + orient: 1, + domain: 1, + format: 1, + grid: 1, + labelBound: 1, + labelFlush: 1, + labelPadding: 1, + labels: 1, + labelOverlap: 1, + maxExtent: 1, + minExtent: 1, + offset: 1, + position: 1, + tickCount: 1, + ticks: 1, + tickSize: 1, + title: 1, + titlePadding: 1, + values: 1, + zindex: 1, +}; +var AXIS_PROPERTIES_INDEX = tslib_1.__assign({}, COMMON_AXIS_PROPERTIES_INDEX, { encoding: 1, labelAngle: 1, titleMaxLength: 1 }); +var VG_AXIS_PROPERTIES_INDEX = tslib_1.__assign({ scale: 1 }, COMMON_AXIS_PROPERTIES_INDEX, { gridScale: 1, encode: 1 }); +function isAxisProperty(prop) { + return !!AXIS_PROPERTIES_INDEX[prop]; +} +exports.isAxisProperty = isAxisProperty; +exports.VG_AXIS_PROPERTIES = util_1.flagKeys(VG_AXIS_PROPERTIES_INDEX); +// Export for dependent projects +exports.AXIS_PROPERTIES = util_1.flagKeys(AXIS_PROPERTIES_INDEX); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9heGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLCtCQUFzQztBQTJFekIsUUFBQSxVQUFVLEdBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFJckY7OztHQUdHO0FBQ1UsUUFBQSxrQkFBa0IsR0FHM0I7SUFDRixJQUFJLEVBQUUsTUFBTTtJQUNaLFNBQVMsRUFBRSxNQUFNO0lBRWpCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsTUFBTSxFQUFFLE1BQU07SUFDZCxVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsTUFBTTtJQUNwQixTQUFTLEVBQUUsTUFBTTtJQUNqQixTQUFTLEVBQUUsTUFBTTtJQUNqQixNQUFNLEVBQUUsTUFBTTtJQUNkLEtBQUssRUFBRSxNQUFNO0lBQ2IsS0FBSyxFQUFFLE1BQU07SUFDYixNQUFNLEVBQUUsTUFBTTtJQUVkLEtBQUssRUFBRSxNQUFNO0lBQ2IsTUFBTSxFQUFFLE1BQU0sQ0FBQyx1REFBdUQ7Q0FDdkUsQ0FBQztBQWtDRixJQUFNLDRCQUE0QixHQUFnQztJQUNoRSxNQUFNLEVBQUUsQ0FBQztJQUVULE1BQU0sRUFBRSxDQUFDO0lBQ1QsTUFBTSxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsQ0FBQztJQUNQLFVBQVUsRUFBRSxDQUFDO0lBQ2IsVUFBVSxFQUFFLENBQUM7SUFDYixZQUFZLEVBQUUsQ0FBQztJQUNmLE1BQU0sRUFBRSxDQUFDO0lBQ1QsWUFBWSxFQUFFLENBQUM7SUFDZixTQUFTLEVBQUUsQ0FBQztJQUNaLFNBQVMsRUFBRSxDQUFDO0lBQ1osTUFBTSxFQUFFLENBQUM7SUFDVCxRQUFRLEVBQUUsQ0FBQztJQUNYLFNBQVMsRUFBRSxDQUFDO0lBQ1osS0FBSyxFQUFFLENBQUM7SUFDUixRQUFRLEVBQUUsQ0FBQztJQUNYLEtBQUssRUFBRSxDQUFDO0lBQ1IsWUFBWSxFQUFFLENBQUM7SUFDZixNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxDQUFDO0NBQ1YsQ0FBQztBQUVGLElBQU0scUJBQXFCLHdCQUN0Qiw0QkFBNEIsSUFDL0IsUUFBUSxFQUFFLENBQUMsRUFDWCxVQUFVLEVBQUUsQ0FBQyxFQUNiLGNBQWMsRUFBRSxDQUFDLEdBQ2xCLENBQUM7QUFFRixJQUFNLHdCQUF3QixzQkFDNUIsS0FBSyxFQUFFLENBQUMsSUFDTCw0QkFBNEIsSUFDL0IsU0FBUyxFQUFFLENBQUMsRUFDWixNQUFNLEVBQUUsQ0FBQyxHQUNWLENBQUM7QUFFRix3QkFBK0IsSUFBWTtJQUN6QyxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRkQsd0NBRUM7QUFFWSxRQUFBLGtCQUFrQixHQUFHLGVBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRXJFLGdDQUFnQztBQUNuQixRQUFBLGVBQWUsR0FBRyxlQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtHdWlkZSwgR3VpZGVFbmNvZGluZ0VudHJ5LCBWbE9ubHlHdWlkZUNvbmZpZ30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge0ZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtBeGlzT3JpZW50LCBWZ0F4aXMsIFZnQXhpc0Jhc2UsIFZnQXhpc0NvbmZpZ30gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIEF4aXNDb25maWcgZXh0ZW5kcyBWZ0F4aXNDb25maWcsIFZsT25seUd1aWRlQ29uZmlnIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXhpcyBleHRlbmRzIFZnQXhpc0Jhc2UsIEd1aWRlIHtcbiAgLyoqXG4gICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpcy4gT25lIG9mIGBcInRvcFwiYCwgYFwiYm90dG9tXCJgLCBgXCJsZWZ0XCJgIG9yIGBcInJpZ2h0XCJgLiBUaGUgb3JpZW50YXRpb24gY2FuIGJlIHVzZWQgdG8gZnVydGhlciBzcGVjaWFsaXplIHRoZSBheGlzIHR5cGUgKGUuZy4sIGEgeSBheGlzIG9yaWVudGVkIGZvciB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgY2hhcnQpLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwiYm90dG9tXCJgIGZvciB4LWF4ZXMgYW5kIGBcImxlZnRcImAgZm9yIHktYXhlcy5cbiAgICovXG4gIG9yaWVudD86IEF4aXNPcmllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQsIGluIHBpeGVscywgYnkgd2hpY2ggdG8gZGlzcGxhY2UgdGhlIGF4aXMgZnJvbSB0aGUgZWRnZSBvZiB0aGUgZW5jbG9zaW5nIGdyb3VwIG9yIGRhdGEgcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gZGVyaXZlZCBmcm9tIHRoZSBbYXhpcyBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwjZmFjZXQtc2NhbGUtY29uZmlnKSdzIGBvZmZzZXRgIChgMGAgYnkgZGVmYXVsdClcbiAgICovXG4gIG9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFuY2hvciBwb3NpdGlvbiBvZiB0aGUgYXhpcyBpbiBwaXhlbHMuIEZvciB4LWF4aXMgd2l0aCB0b3Agb3IgYm90dG9tIG9yaWVudGF0aW9uLCB0aGlzIHNldHMgdGhlIGF4aXMgZ3JvdXAgeCBjb29yZGluYXRlLiBGb3IgeS1heGlzIHdpdGggbGVmdCBvciByaWdodCBvcmllbnRhdGlvbiwgdGhpcyBzZXRzIHRoZSBheGlzIGdyb3VwIHkgY29vcmRpbmF0ZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGAwYFxuICAgKi9cbiAgcG9zaXRpb24/OiBudW1iZXI7XG5cblxuICAvKipcbiAgICogVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBheGlzIGxhYmVscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAtOTBgIGZvciBub21pbmFsIGFuZCBvcmRpbmFsIGZpZWxkczsgYDBgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQG1pbmltdW0gLTM2MFxuICAgKiBAbWF4aW11bSAzNjBcbiAgICovXG4gIGxhYmVsQW5nbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgZGVzaXJlZCBudW1iZXIgb2YgdGlja3MsIGZvciBheGVzIHZpc3VhbGl6aW5nIHF1YW50aXRhdGl2ZSBzY2FsZXMuIFRoZSByZXN1bHRpbmcgbnVtYmVyIG1heSBiZSBkaWZmZXJlbnQgc28gdGhhdCB2YWx1ZXMgYXJlIFwibmljZVwiIChtdWx0aXBsZXMgb2YgMiwgNSwgMTApIGFuZCBsaWUgd2l0aGluIHRoZSB1bmRlcmx5aW5nIHNjYWxlJ3MgcmFuZ2UuXG4gICAqIEBtaW5pbXVtIDBcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IERldGVybWluZSB1c2luZyBhIGZvcm11bGEgYGNlaWwod2lkdGgvNDApYCBmb3IgeCBhbmQgYGNlaWwoaGVpZ2h0LzQwKWAgZm9yIHkuXG4gICAqL1xuICB0aWNrQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0bHkgc2V0IHRoZSB2aXNpYmxlIGF4aXMgdGljayB2YWx1ZXMuXG4gICAqL1xuICB2YWx1ZXM/OiBudW1iZXJbXSB8IERhdGVUaW1lW107XG5cbiAgLyoqXG4gICAqIEEgbm9uLXBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB6LWluZGV4IG9mIHRoZSBheGlzLlxuICAgKiBJZiB6aW5kZXggaXMgMCwgYXhlcyBzaG91bGQgYmUgZHJhd24gYmVoaW5kIGFsbCBjaGFydCBlbGVtZW50cy5cbiAgICogVG8gcHV0IHRoZW0gaW4gZnJvbnQsIHVzZSBgXCJ6aW5kZXggPSAxXCJgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgIChpbiBmcm9udCBvZiB0aGUgbWFya3MpIGZvciBhY3R1YWwgYXhpcyBhbmQgYDBgIChiZWhpbmQgdGhlIG1hcmtzKSBmb3IgZ3JpZHMuXG4gICAqXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHppbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWFyayBkZWZpbml0aW9ucyBmb3IgY3VzdG9tIGF4aXMgZW5jb2RpbmcuXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICBlbmNvZGluZz86IEF4aXNFbmNvZGluZztcbn1cblxuXG5leHBvcnQgdHlwZSBBeGlzUGFydCA9IGtleW9mIEF4aXNFbmNvZGluZztcbmV4cG9ydCBjb25zdCBBWElTX1BBUlRTOiBBeGlzUGFydFtdID0gWydkb21haW4nLCAnZ3JpZCcsICdsYWJlbHMnLCAndGlja3MnLCAndGl0bGUnXTtcblxuXG5cbi8qKlxuICogQSBkaWN0aW9uYXJ5IGxpc3Rpbmcgd2hldGhlciBhIGNlcnRhaW4gYXhpcyBwcm9wZXJ0eSBpcyBhcHBsaWNhYmxlIGZvciBvbmx5IG1haW4gYXhlcyBvciBvbmx5IGdyaWQgYXhlcy5cbiAqIChQcm9wZXJ0aWVzIG5vdCBsaXN0ZWQgYXJlIGFwcGxpY2FibGUgZm9yIGJvdGgpXG4gKi9cbmV4cG9ydCBjb25zdCBBWElTX1BST1BFUlRZX1RZUEU6IHtcbiAgLy8gVXNpbmcgTWFwcGVkIFR5cGUgdG8gZGVjbGFyZSB0eXBlIChodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlcylcbiAgW2sgaW4ga2V5b2YgVmdBeGlzXTogJ21haW4nIHwgJ2dyaWQnIHwgJ2JvdGgnXG59ID0ge1xuICBncmlkOiAnZ3JpZCcsXG4gIGdyaWRTY2FsZTogJ2dyaWQnLFxuXG4gIGRvbWFpbjogJ21haW4nLFxuICBsYWJlbHM6ICdtYWluJyxcbiAgbGFiZWxGbHVzaDogJ21haW4nLFxuICBsYWJlbE92ZXJsYXA6ICdtYWluJyxcbiAgbWluRXh0ZW50OiAnbWFpbicsXG4gIG1heEV4dGVudDogJ21haW4nLFxuICBvZmZzZXQ6ICdtYWluJyxcbiAgdGlja3M6ICdtYWluJyxcbiAgdGl0bGU6ICdtYWluJyxcbiAgdmFsdWVzOiAnYm90aCcsXG5cbiAgc2NhbGU6ICdib3RoJyxcbiAgemluZGV4OiAnYm90aCcgLy8gdGhpcyBpcyBhY3R1YWxseSBzZXQgYWZ0ZXJ3YXJkLCBzbyBpdCBkb2Vzbid0IG1hdHRlclxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBeGlzRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciB0aGUgYXhpcyBjb250YWluZXIuXG4gICAqL1xuICBheGlzPzogR3VpZGVFbmNvZGluZ0VudHJ5O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZW5jb2RpbmcgZm9yIHRoZSBheGlzIGRvbWFpbiBydWxlIG1hcmsuXG4gICAqL1xuICBkb21haW4/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgYXhpcyBncmlkbGluZSBydWxlIG1hcmtzLlxuICAgKi9cbiAgZ3JpZD86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciBheGlzIGxhYmVsIHRleHQgbWFya3MuXG4gICAqL1xuICBsYWJlbHM/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgYXhpcyB0aWNrIHJ1bGUgbWFya3MuXG4gICAqL1xuICB0aWNrcz86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciB0aGUgYXhpcyB0aXRsZSB0ZXh0IG1hcmsuXG4gICAqL1xuICB0aXRsZT86IEd1aWRlRW5jb2RpbmdFbnRyeTtcbn1cblxuY29uc3QgQ09NTU9OX0FYSVNfUFJPUEVSVElFU19JTkRFWDogRmxhZzxrZXlvZiAoVmdBeGlzIHwgQXhpcyk+ID0ge1xuICBvcmllbnQ6IDEsIC8vIG90aGVyIHRoaW5ncyBjYW4gZGVwZW5kIG9uIG9yaWVudFxuXG4gIGRvbWFpbjogMSxcbiAgZm9ybWF0OiAxLFxuICBncmlkOiAxLFxuICBsYWJlbEJvdW5kOiAxLFxuICBsYWJlbEZsdXNoOiAxLFxuICBsYWJlbFBhZGRpbmc6IDEsXG4gIGxhYmVsczogMSxcbiAgbGFiZWxPdmVybGFwOiAxLFxuICBtYXhFeHRlbnQ6IDEsXG4gIG1pbkV4dGVudDogMSxcbiAgb2Zmc2V0OiAxLFxuICBwb3NpdGlvbjogMSxcbiAgdGlja0NvdW50OiAxLFxuICB0aWNrczogMSxcbiAgdGlja1NpemU6IDEsXG4gIHRpdGxlOiAxLFxuICB0aXRsZVBhZGRpbmc6IDEsXG4gIHZhbHVlczogMSxcbiAgemluZGV4OiAxLFxufTtcblxuY29uc3QgQVhJU19QUk9QRVJUSUVTX0lOREVYOiBGbGFnPGtleW9mIEF4aXM+ID0ge1xuICAuLi5DT01NT05fQVhJU19QUk9QRVJUSUVTX0lOREVYLFxuICBlbmNvZGluZzogMSxcbiAgbGFiZWxBbmdsZTogMSxcbiAgdGl0bGVNYXhMZW5ndGg6IDFcbn07XG5cbmNvbnN0IFZHX0FYSVNfUFJPUEVSVElFU19JTkRFWDogRmxhZzxrZXlvZiBWZ0F4aXM+ID0ge1xuICBzY2FsZTogMSxcbiAgLi4uQ09NTU9OX0FYSVNfUFJPUEVSVElFU19JTkRFWCxcbiAgZ3JpZFNjYWxlOiAxLFxuICBlbmNvZGU6IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F4aXNQcm9wZXJ0eShwcm9wOiBzdHJpbmcpOiBwcm9wIGlzIGtleW9mIEF4aXMge1xuICByZXR1cm4gISFBWElTX1BST1BFUlRJRVNfSU5ERVhbcHJvcF07XG59XG5cbmV4cG9ydCBjb25zdCBWR19BWElTX1BST1BFUlRJRVMgPSBmbGFnS2V5cyhWR19BWElTX1BST1BFUlRJRVNfSU5ERVgpO1xuXG4vLyBFeHBvcnQgZm9yIGRlcGVuZGVudCBwcm9qZWN0c1xuZXhwb3J0IGNvbnN0IEFYSVNfUFJPUEVSVElFUyA9IGZsYWdLZXlzKEFYSVNfUFJPUEVSVElFU19JTkRFWCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXhpc0NvbmZpZ01peGlucyB7XG4gIC8qKlxuICAgKiBBeGlzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGRldGVybWluZXMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhbGwgYHhgIGFuZCBgeWAgW2F4ZXNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYXhpcy5odG1sKS4gRm9yIGEgZnVsbCBsaXN0IG9mIGF4aXMgY29uZmlndXJhdGlvbiBvcHRpb25zLCBwbGVhc2Ugc2VlIHRoZSBbY29ycmVzcG9uZGluZyBzZWN0aW9uIG9mIHRoZSBheGlzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYXhpcy5odG1sI2NvbmZpZykuXG4gICAqL1xuICBheGlzPzogQXhpc0NvbmZpZztcblxuICAvKipcbiAgICogWC1heGlzIHNwZWNpZmljIGNvbmZpZy5cbiAgICovXG4gIGF4aXNYPzogVmdBeGlzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBZLWF4aXMgc3BlY2lmaWMgY29uZmlnLlxuICAgKi9cbiAgYXhpc1k/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB5LWF4aXMgYWxvbmcgdGhlIGxlZnQgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBheGlzTGVmdD86IFZnQXhpc0NvbmZpZztcblxuICAvKipcbiAgICogU3BlY2lmaWMgYXhpcyBjb25maWcgZm9yIHktYXhpcyBhbG9uZyB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBheGlzUmlnaHQ/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB4LWF4aXMgYWxvbmcgdGhlIHRvcCBlZGdlIG9mIHRoZSBjaGFydC5cbiAgICovXG4gIGF4aXNUb3A/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB4LWF4aXMgYWxvbmcgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBjaGFydC5cbiAgICovXG4gIGF4aXNCb3R0b20/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciBheGVzIHdpdGggXCJiYW5kXCIgc2NhbGVzLlxuICAgKi9cbiAgYXhpc0JhbmQ/OiBWZ0F4aXNDb25maWc7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/bin.d.ts b/build/src/bin.d.ts new file mode 100644 index 0000000000..500476311a --- /dev/null +++ b/build/src/bin.d.ts @@ -0,0 +1,59 @@ +import { Channel } from './channel'; +export interface BaseBin { + /** + * The number base to use for automatic bin determination (default is base 10). + * + * __Default value:__ `10` + * + */ + base?: number; + /** + * An exact step size to use between bins. + * + * __Note:__ If provided, options such as maxbins will be ignored. + */ + step?: number; + /** + * An array of allowable step sizes to choose from. + * @minItems 1 + */ + steps?: number[]; + /** + * A minimum allowable step size (particularly useful for integer values). + */ + minstep?: number; + /** + * Scale factors indicating allowable subdivisions. The default value is [5, 2], which indicates that for base 10 numbers (the default base), the method may consider dividing bin sizes by 5 and/or 2. For example, for an initial step size of 10, the method can check if bin sizes of 2 (= 10/5), 5 (= 10/2), or 1 (= 10/(5*2)) might also satisfy the given constraints. + * + * __Default value:__ `[5, 2]` + * + * @minItems 1 + */ + divide?: number[]; + /** + * Maximum number of bins. + * + * __Default value:__ `6` for `row`, `column` and `shape` channels; `10` for other channels + * + * @minimum 2 + */ + maxbins?: number; + /** + * If true (the default), attempts to make the bin boundaries use human-friendly boundaries, such as multiples of ten. + */ + nice?: boolean; +} +/** + * Binning properties or boolean flag for determining whether to bin data or not. + */ +export interface BinParams extends BaseBin { + /** + * A two-element (`[min, max]`) array indicating the range of desired bin values. + * @minItems 2 + * @maxItems 2 + */ + extent?: number[]; +} +export declare function binToString(bin: BinParams | boolean): string; +export declare function isBinParams(bin: BinParams | boolean): bin is BinParams; +export declare function autoMaxBins(channel: Channel): number; diff --git a/build/src/bin.js b/build/src/bin.js new file mode 100644 index 0000000000..45d0b53615 --- /dev/null +++ b/build/src/bin.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var channel_1 = require("./channel"); +var util_1 = require("./util"); +function binToString(bin) { + if (vega_util_1.isBoolean(bin)) { + return 'bin'; + } + return 'bin' + util_1.keys(bin).map(function (p) { return util_1.varName("_" + p + "_" + bin[p]); }).join(''); +} +exports.binToString = binToString; +function isBinParams(bin) { + return bin && !vega_util_1.isBoolean(bin); +} +exports.isBinParams = isBinParams; +function autoMaxBins(channel) { + switch (channel) { + case channel_1.ROW: + case channel_1.COLUMN: + case channel_1.SIZE: + case channel_1.COLOR: + case channel_1.FILL: + case channel_1.STROKE: + case channel_1.OPACITY: + // Facets and Size shouldn't have too many bins + // We choose 6 like shape to simplify the rule + case channel_1.SHAPE: + return 6; // Vega's "shape" has 6 distinct values + default: + return 10; + } +} +exports.autoMaxBins = autoMaxBins; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUFvQztBQUNwQyxxQ0FBMEY7QUFDMUYsK0JBQXFDO0FBNkRyQyxxQkFBNEIsR0FBd0I7SUFDbEQsSUFBSSxxQkFBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLEtBQUssR0FBRyxXQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsY0FBTyxDQUFDLE1BQUksQ0FBQyxTQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUcsQ0FBQyxFQUExQixDQUEwQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFMRCxrQ0FLQztBQUVELHFCQUE0QixHQUF3QjtJQUNsRCxPQUFPLEdBQUcsSUFBSSxDQUFDLHFCQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUZELGtDQUVDO0FBRUQscUJBQTRCLE9BQWdCO0lBQzFDLFFBQVEsT0FBTyxFQUFFO1FBQ2YsS0FBSyxhQUFHLENBQUM7UUFDVCxLQUFLLGdCQUFNLENBQUM7UUFDWixLQUFLLGNBQUksQ0FBQztRQUNWLEtBQUssZUFBSyxDQUFDO1FBQ1gsS0FBSyxjQUFJLENBQUM7UUFDVixLQUFLLGdCQUFNLENBQUM7UUFDWixLQUFLLGlCQUFPLENBQUM7UUFDWCwrQ0FBK0M7UUFDL0MsOENBQThDO1FBQ2hELEtBQUssZUFBSztZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUNBQXVDO1FBQ25EO1lBQ0UsT0FBTyxFQUFFLENBQUM7S0FDYjtBQUNILENBQUM7QUFoQkQsa0NBZ0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0Jvb2xlYW59IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWwsIENPTE9SLCBDT0xVTU4sIEZJTEwsIE9QQUNJVFksIFJPVywgU0hBUEUsIFNJWkUsIFNUUk9LRX0gZnJvbSAnLi9jaGFubmVsJztcbmltcG9ydCB7a2V5cywgdmFyTmFtZX0gZnJvbSAnLi91dGlsJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VCaW4ge1xuICAvKipcbiAgICogVGhlIG51bWJlciBiYXNlIHRvIHVzZSBmb3IgYXV0b21hdGljIGJpbiBkZXRlcm1pbmF0aW9uIChkZWZhdWx0IGlzIGJhc2UgMTApLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDEwYFxuICAgKlxuICAgKi9cbiAgYmFzZT86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFuIGV4YWN0IHN0ZXAgc2l6ZSB0byB1c2UgYmV0d2VlbiBiaW5zLlxuICAgKlxuICAgKiBfX05vdGU6X18gSWYgcHJvdmlkZWQsIG9wdGlvbnMgc3VjaCBhcyBtYXhiaW5zIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIHN0ZXA/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBhbGxvd2FibGUgc3RlcCBzaXplcyB0byBjaG9vc2UgZnJvbS5cbiAgICogQG1pbkl0ZW1zIDFcbiAgICovXG4gIHN0ZXBzPzogbnVtYmVyW107XG4gIC8qKlxuICAgKiBBIG1pbmltdW0gYWxsb3dhYmxlIHN0ZXAgc2l6ZSAocGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgaW50ZWdlciB2YWx1ZXMpLlxuICAgKi9cbiAgbWluc3RlcD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNjYWxlIGZhY3RvcnMgaW5kaWNhdGluZyBhbGxvd2FibGUgc3ViZGl2aXNpb25zLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBbNSwgMl0sIHdoaWNoIGluZGljYXRlcyB0aGF0IGZvciBiYXNlIDEwIG51bWJlcnMgKHRoZSBkZWZhdWx0IGJhc2UpLCB0aGUgbWV0aG9kIG1heSBjb25zaWRlciBkaXZpZGluZyBiaW4gc2l6ZXMgYnkgNSBhbmQvb3IgMi4gRm9yIGV4YW1wbGUsIGZvciBhbiBpbml0aWFsIHN0ZXAgc2l6ZSBvZiAxMCwgdGhlIG1ldGhvZCBjYW4gY2hlY2sgaWYgYmluIHNpemVzIG9mIDIgKD0gMTAvNSksIDUgKD0gMTAvMiksIG9yIDEgKD0gMTAvKDUqMikpIG1pZ2h0IGFsc28gc2F0aXNmeSB0aGUgZ2l2ZW4gY29uc3RyYWludHMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgWzUsIDJdYFxuICAgKlxuICAgKiBAbWluSXRlbXMgMVxuICAgKi9cbiAgZGl2aWRlPzogbnVtYmVyW107XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBiaW5zLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDZgIGZvciBgcm93YCwgYGNvbHVtbmAgYW5kIGBzaGFwZWAgY2hhbm5lbHM7IGAxMGAgZm9yIG90aGVyIGNoYW5uZWxzXG4gICAqXG4gICAqIEBtaW5pbXVtIDJcbiAgICovXG4gIG1heGJpbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBJZiB0cnVlICh0aGUgZGVmYXVsdCksIGF0dGVtcHRzIHRvIG1ha2UgdGhlIGJpbiBib3VuZGFyaWVzIHVzZSBodW1hbi1mcmllbmRseSBib3VuZGFyaWVzLCBzdWNoIGFzIG11bHRpcGxlcyBvZiB0ZW4uXG4gICAqL1xuICBuaWNlPzogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIEJpbm5pbmcgcHJvcGVydGllcyBvciBib29sZWFuIGZsYWcgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgdG8gYmluIGRhdGEgb3Igbm90LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpblBhcmFtcyBleHRlbmRzIEJhc2VCaW4ge1xuICAvKipcbiAgICogQSB0d28tZWxlbWVudCAoYFttaW4sIG1heF1gKSBhcnJheSBpbmRpY2F0aW5nIHRoZSByYW5nZSBvZiBkZXNpcmVkIGJpbiB2YWx1ZXMuXG4gICAqIEBtaW5JdGVtcyAyXG4gICAqIEBtYXhJdGVtcyAyXG4gICAqL1xuICBleHRlbnQ/OiBudW1iZXJbXTsgIC8vIFZnQmluVHJhbnNmb3JtIHVzZXMgYSBkaWZmZXJlbnQgZXh0ZW50IHNvIHdlIG5lZWQgdG8gcHVsbCB0aGlzIG91dC5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpblRvU3RyaW5nKGJpbjogQmluUGFyYW1zIHwgYm9vbGVhbikge1xuICBpZiAoaXNCb29sZWFuKGJpbikpIHtcbiAgICByZXR1cm4gJ2Jpbic7XG4gIH1cbiAgcmV0dXJuICdiaW4nICsga2V5cyhiaW4pLm1hcChwID0+IHZhck5hbWUoYF8ke3B9XyR7YmluW3BdfWApKS5qb2luKCcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmluUGFyYW1zKGJpbjogQmluUGFyYW1zIHwgYm9vbGVhbik6IGJpbiBpcyBCaW5QYXJhbXMge1xuICByZXR1cm4gYmluICYmICFpc0Jvb2xlYW4oYmluKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dG9NYXhCaW5zKGNoYW5uZWw6IENoYW5uZWwpOiBudW1iZXIge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlIFJPVzpcbiAgICBjYXNlIENPTFVNTjpcbiAgICBjYXNlIFNJWkU6XG4gICAgY2FzZSBDT0xPUjpcbiAgICBjYXNlIEZJTEw6XG4gICAgY2FzZSBTVFJPS0U6XG4gICAgY2FzZSBPUEFDSVRZOlxuICAgICAgLy8gRmFjZXRzIGFuZCBTaXplIHNob3VsZG4ndCBoYXZlIHRvbyBtYW55IGJpbnNcbiAgICAgIC8vIFdlIGNob29zZSA2IGxpa2Ugc2hhcGUgdG8gc2ltcGxpZnkgdGhlIHJ1bGVcbiAgICBjYXNlIFNIQVBFOlxuICAgICAgcmV0dXJuIDY7IC8vIFZlZ2EncyBcInNoYXBlXCIgaGFzIDYgZGlzdGluY3QgdmFsdWVzXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAxMDtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/channel.d.ts b/build/src/channel.d.ts new file mode 100644 index 0000000000..8074501ba1 --- /dev/null +++ b/build/src/channel.d.ts @@ -0,0 +1,97 @@ +import { RangeType } from './compile/scale/type'; +import { Encoding } from './encoding'; +import { FacetMapping } from './facet'; +import { Mark } from './mark'; +import { Flag } from './util'; +export declare namespace Channel { + const ROW: 'row'; + const COLUMN: 'column'; + const X: 'x'; + const Y: 'y'; + const X2: 'x2'; + const Y2: 'y2'; + const LATITUDE: 'latitude'; + const LONGITUDE: 'longitude'; + const LATITUDE2: 'latitude2'; + const LONGITUDE2: 'longitude2'; + const COLOR: 'color'; + const FILL: 'fill'; + const STROKE: 'stroke'; + const SHAPE: 'shape'; + const SIZE: 'size'; + const OPACITY: 'opacity'; + const TEXT: 'text'; + const ORDER: 'order'; + const DETAIL: 'detail'; + const KEY: 'key'; + const TOOLTIP: 'tooltip'; + const HREF: 'href'; +} +export declare type Channel = keyof Encoding | keyof FacetMapping; +export declare const X: "x"; +export declare const Y: "y"; +export declare const X2: "x2"; +export declare const Y2: "y2"; +export declare const LATITUDE: "latitude"; +export declare const LATITUDE2: "latitude2"; +export declare const LONGITUDE: "longitude"; +export declare const LONGITUDE2: "longitude2"; +export declare const ROW: "row"; +export declare const COLUMN: "column"; +export declare const SHAPE: "shape"; +export declare const SIZE: "size"; +export declare const COLOR: "color"; +export declare const FILL: "fill"; +export declare const STROKE: "stroke"; +export declare const TEXT: "text"; +export declare const DETAIL: "detail"; +export declare const KEY: "key"; +export declare const ORDER: "order"; +export declare const OPACITY: "opacity"; +export declare const TOOLTIP: "tooltip"; +export declare const HREF: "href"; +export declare type GeoPositionChannel = 'longitude' | 'latitude' | 'longitude2' | 'latitude2'; +export declare const GEOPOSITION_CHANNEL_INDEX: Flag; +export declare const GEOPOSITION_CHANNELS: GeoPositionChannel[]; +export declare type ColorChannel = 'color' | 'fill' | 'stroke'; +export declare function isColorChannel(channel: Channel): channel is ColorChannel; +export declare const CHANNELS: Channel[]; +/** + * Channels that cannot have an array of channelDef. + * model.fieldDef, getFieldDef only work for these channels. + * + * (The only two channels that can have an array of channelDefs are "detail" and "order". + * Since there can be multiple fieldDefs for detail and order, getFieldDef/model.fieldDef + * are not applicable for them. Similarly, selection projection won't work with "detail" and "order".) + */ +export declare const SINGLE_DEF_CHANNELS: SingleDefChannel[]; +export declare type SingleDefChannel = 'x' | 'y' | 'x2' | 'y2' | 'longitude' | 'latitude' | 'longitude2' | 'latitude2' | 'row' | 'column' | 'color' | 'fill' | 'stroke' | 'size' | 'shape' | 'opacity' | 'text' | 'tooltip' | 'href' | 'key'; +export declare function isChannel(str: string): str is Channel; +export declare const UNIT_CHANNELS: ("text" | "shape" | "x" | "y" | "x2" | "y2" | "longitude" | "latitude" | "longitude2" | "latitude2" | "color" | "fill" | "stroke" | "opacity" | "size" | "detail" | "key" | "tooltip" | "href" | "order")[]; +export declare const NONPOSITION_CHANNELS: ("text" | "shape" | "color" | "fill" | "stroke" | "opacity" | "size" | "detail" | "key" | "tooltip" | "href" | "order")[]; +export declare type NonPositionChannel = typeof NONPOSITION_CHANNELS[0]; +export declare const POSITION_SCALE_CHANNELS: ("x" | "y")[]; +export declare type PositionScaleChannel = typeof POSITION_SCALE_CHANNELS[0]; +export declare const NONPOSITION_SCALE_CHANNELS: ("shape" | "color" | "fill" | "stroke" | "opacity" | "size")[]; +export declare type NonPositionScaleChannel = typeof NONPOSITION_SCALE_CHANNELS[0]; +/** List of channels with scales */ +export declare const SCALE_CHANNELS: ("shape" | "x" | "y" | "color" | "fill" | "stroke" | "opacity" | "size")[]; +export declare type ScaleChannel = typeof SCALE_CHANNELS[0]; +export declare function isScaleChannel(channel: Channel): channel is ScaleChannel; +export declare type SupportedMark = { + [mark in Mark]?: boolean; +}; +/** + * Return whether a channel supports a particular mark type. + * @param channel channel name + * @param mark the mark type + * @return whether the mark supports the channel + */ +export declare function supportMark(channel: Channel, mark: Mark): boolean; +/** + * Return a dictionary showing whether a channel supports mark type. + * @param channel + * @return A dictionary mapping mark types to boolean values. + */ +export declare function getSupportedMark(channel: Channel): SupportedMark; +export declare function rangeType(channel: Channel): RangeType; diff --git a/build/src/channel.js b/build/src/channel.js new file mode 100644 index 0000000000..2fd37f1231 --- /dev/null +++ b/build/src/channel.js @@ -0,0 +1,226 @@ +"use strict"; +/* + * Constants and utilities for encoding channels (Visual variables) + * such as 'x', 'y', 'color'. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("./util"); +var Channel; +(function (Channel) { + // Facet + Channel.ROW = 'row'; + Channel.COLUMN = 'column'; + // Position + Channel.X = 'x'; + Channel.Y = 'y'; + Channel.X2 = 'x2'; + Channel.Y2 = 'y2'; + // Geo Position + Channel.LATITUDE = 'latitude'; + Channel.LONGITUDE = 'longitude'; + Channel.LATITUDE2 = 'latitude2'; + Channel.LONGITUDE2 = 'longitude2'; + // Mark property with scale + Channel.COLOR = 'color'; + Channel.FILL = 'fill'; + Channel.STROKE = 'stroke'; + Channel.SHAPE = 'shape'; + Channel.SIZE = 'size'; + Channel.OPACITY = 'opacity'; + // Non-scale channel + Channel.TEXT = 'text'; + Channel.ORDER = 'order'; + Channel.DETAIL = 'detail'; + Channel.KEY = 'key'; + Channel.TOOLTIP = 'tooltip'; + Channel.HREF = 'href'; +})(Channel = exports.Channel || (exports.Channel = {})); +exports.X = Channel.X; +exports.Y = Channel.Y; +exports.X2 = Channel.X2; +exports.Y2 = Channel.Y2; +exports.LATITUDE = Channel.LATITUDE; +exports.LATITUDE2 = Channel.LATITUDE2; +exports.LONGITUDE = Channel.LONGITUDE; +exports.LONGITUDE2 = Channel.LONGITUDE2; +exports.ROW = Channel.ROW; +exports.COLUMN = Channel.COLUMN; +exports.SHAPE = Channel.SHAPE; +exports.SIZE = Channel.SIZE; +exports.COLOR = Channel.COLOR; +exports.FILL = Channel.FILL; +exports.STROKE = Channel.STROKE; +exports.TEXT = Channel.TEXT; +exports.DETAIL = Channel.DETAIL; +exports.KEY = Channel.KEY; +exports.ORDER = Channel.ORDER; +exports.OPACITY = Channel.OPACITY; +exports.TOOLTIP = Channel.TOOLTIP; +exports.HREF = Channel.HREF; +exports.GEOPOSITION_CHANNEL_INDEX = { + longitude: 1, + longitude2: 1, + latitude: 1, + latitude2: 1, +}; +exports.GEOPOSITION_CHANNELS = util_1.flagKeys(exports.GEOPOSITION_CHANNEL_INDEX); +var UNIT_CHANNEL_INDEX = tslib_1.__assign({ + // position + x: 1, y: 1, x2: 1, y2: 1 }, exports.GEOPOSITION_CHANNEL_INDEX, { + // color + color: 1, fill: 1, stroke: 1, + // other non-position with scale + opacity: 1, size: 1, shape: 1, + // channels without scales + order: 1, text: 1, detail: 1, key: 1, tooltip: 1, href: 1 }); +function isColorChannel(channel) { + return channel === 'color' || channel === 'fill' || channel === 'stroke'; +} +exports.isColorChannel = isColorChannel; +var FACET_CHANNEL_INDEX = { + row: 1, + column: 1 +}; +var CHANNEL_INDEX = tslib_1.__assign({}, UNIT_CHANNEL_INDEX, FACET_CHANNEL_INDEX); +exports.CHANNELS = util_1.flagKeys(CHANNEL_INDEX); +var _o = CHANNEL_INDEX.order, _d = CHANNEL_INDEX.detail, SINGLE_DEF_CHANNEL_INDEX = tslib_1.__rest(CHANNEL_INDEX, ["order", "detail"]); +/** + * Channels that cannot have an array of channelDef. + * model.fieldDef, getFieldDef only work for these channels. + * + * (The only two channels that can have an array of channelDefs are "detail" and "order". + * Since there can be multiple fieldDefs for detail and order, getFieldDef/model.fieldDef + * are not applicable for them. Similarly, selection projection won't work with "detail" and "order".) + */ +exports.SINGLE_DEF_CHANNELS = util_1.flagKeys(SINGLE_DEF_CHANNEL_INDEX); +function isChannel(str) { + return !!CHANNEL_INDEX[str]; +} +exports.isChannel = isChannel; +// CHANNELS without COLUMN, ROW +exports.UNIT_CHANNELS = util_1.flagKeys(UNIT_CHANNEL_INDEX); +// NONPOSITION_CHANNELS = UNIT_CHANNELS without X, Y, X2, Y2; +var _x = UNIT_CHANNEL_INDEX.x, _y = UNIT_CHANNEL_INDEX.y, +// x2 and y2 share the same scale as x and y +_x2 = UNIT_CHANNEL_INDEX.x2, _y2 = UNIT_CHANNEL_INDEX.y2, _latitude = UNIT_CHANNEL_INDEX.latitude, _longitude = UNIT_CHANNEL_INDEX.longitude, _latitude2 = UNIT_CHANNEL_INDEX.latitude2, _longitude2 = UNIT_CHANNEL_INDEX.longitude2, +// The rest of unit channels then have scale +NONPOSITION_CHANNEL_INDEX = tslib_1.__rest(UNIT_CHANNEL_INDEX, ["x", "y", "x2", "y2", "latitude", "longitude", "latitude2", "longitude2"]); +exports.NONPOSITION_CHANNELS = util_1.flagKeys(NONPOSITION_CHANNEL_INDEX); +// POSITION_SCALE_CHANNELS = X and Y; +var POSITION_SCALE_CHANNEL_INDEX = { x: 1, y: 1 }; +exports.POSITION_SCALE_CHANNELS = util_1.flagKeys(POSITION_SCALE_CHANNEL_INDEX); +// NON_POSITION_SCALE_CHANNEL = SCALE_CHANNELS without X, Y +var +// x2 and y2 share the same scale as x and y +// text and tooltip have format instead of scale, +// href has neither format, nor scale +_t = NONPOSITION_CHANNEL_INDEX.text, _tt = NONPOSITION_CHANNEL_INDEX.tooltip, _hr = NONPOSITION_CHANNEL_INDEX.href, +// detail and order have no scale +_dd = NONPOSITION_CHANNEL_INDEX.detail, _k = NONPOSITION_CHANNEL_INDEX.key, _oo = NONPOSITION_CHANNEL_INDEX.order, NONPOSITION_SCALE_CHANNEL_INDEX = tslib_1.__rest(NONPOSITION_CHANNEL_INDEX, ["text", "tooltip", "href", "detail", "key", "order"]); +exports.NONPOSITION_SCALE_CHANNELS = util_1.flagKeys(NONPOSITION_SCALE_CHANNEL_INDEX); +// Declare SCALE_CHANNEL_INDEX +var SCALE_CHANNEL_INDEX = tslib_1.__assign({}, POSITION_SCALE_CHANNEL_INDEX, NONPOSITION_SCALE_CHANNEL_INDEX); +/** List of channels with scales */ +exports.SCALE_CHANNELS = util_1.flagKeys(SCALE_CHANNEL_INDEX); +function isScaleChannel(channel) { + return !!SCALE_CHANNEL_INDEX[channel]; +} +exports.isScaleChannel = isScaleChannel; +/** + * Return whether a channel supports a particular mark type. + * @param channel channel name + * @param mark the mark type + * @return whether the mark supports the channel + */ +function supportMark(channel, mark) { + return mark in getSupportedMark(channel); +} +exports.supportMark = supportMark; +/** + * Return a dictionary showing whether a channel supports mark type. + * @param channel + * @return A dictionary mapping mark types to boolean values. + */ +function getSupportedMark(channel) { + switch (channel) { + case exports.COLOR: + case exports.FILL: + case exports.STROKE: + case exports.DETAIL: + case exports.KEY: + case exports.TOOLTIP: + case exports.HREF: + case exports.ORDER: // TODO: revise (order might not support rect, which is not stackable?) + case exports.OPACITY: + case exports.ROW: + case exports.COLUMN: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, rect: true, line: true, trail: true, area: true, text: true, geoshape: true + }; + case exports.X: + case exports.Y: + case exports.LATITUDE: + case exports.LONGITUDE: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, rect: true, line: true, trail: true, area: true, text: true + }; + case exports.X2: + case exports.Y2: + case exports.LATITUDE2: + case exports.LONGITUDE2: + return { + rule: true, bar: true, rect: true, area: true + }; + case exports.SIZE: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, text: true, line: true, trail: true + }; + case exports.SHAPE: + return { point: true, geoshape: true }; + case exports.TEXT: + return { text: true }; + } +} +exports.getSupportedMark = getSupportedMark; +function rangeType(channel) { + switch (channel) { + case exports.X: + case exports.Y: + case exports.SIZE: + case exports.OPACITY: + // X2 and Y2 use X and Y scales, so they similarly have continuous range. + case exports.X2: + case exports.Y2: + return 'continuous'; + case exports.ROW: + case exports.COLUMN: + case exports.SHAPE: + // TEXT, TOOLTIP, and HREF have no scale but have discrete output + case exports.TEXT: + case exports.TOOLTIP: + case exports.HREF: + return 'discrete'; + // Color can be either continuous or discrete, depending on scale type. + case exports.COLOR: + case exports.FILL: + case exports.STROKE: + return 'flexible'; + // No scale, no range type. + case exports.LATITUDE: + case exports.LONGITUDE: + case exports.LATITUDE2: + case exports.LONGITUDE2: + case exports.DETAIL: + case exports.KEY: + case exports.ORDER: + return undefined; + } + /* istanbul ignore next: should never reach here. */ + throw new Error('rangeType not implemented for ' + channel); +} +exports.rangeType = rangeType; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFubmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQU1ILCtCQUFzQztBQUV0QyxJQUFpQixPQUFPLENBb0N2QjtBQXBDRCxXQUFpQixPQUFPO0lBQ3RCLFFBQVE7SUFDSyxXQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGNBQU0sR0FBYSxRQUFRLENBQUM7SUFFekMsV0FBVztJQUNFLFNBQUMsR0FBUSxHQUFHLENBQUM7SUFDYixTQUFDLEdBQVEsR0FBRyxDQUFDO0lBQ2IsVUFBRSxHQUFTLElBQUksQ0FBQztJQUNoQixVQUFFLEdBQVMsSUFBSSxDQUFDO0lBRTdCLGVBQWU7SUFDRixnQkFBUSxHQUFlLFVBQVUsQ0FBQztJQUNsQyxpQkFBUyxHQUFnQixXQUFXLENBQUM7SUFDckMsaUJBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLGtCQUFVLEdBQWlCLFlBQVksQ0FBQztJQUVyRCwyQkFBMkI7SUFDZCxhQUFLLEdBQVksT0FBTyxDQUFDO0lBRXpCLFlBQUksR0FBVyxNQUFNLENBQUM7SUFFdEIsY0FBTSxHQUFhLFFBQVEsQ0FBQztJQUU1QixhQUFLLEdBQVksT0FBTyxDQUFDO0lBQ3pCLFlBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsZUFBTyxHQUFjLFNBQVMsQ0FBQztJQUU1QyxvQkFBb0I7SUFDUCxZQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLGFBQUssR0FBWSxPQUFPLENBQUM7SUFDekIsY0FBTSxHQUFhLFFBQVEsQ0FBQztJQUM1QixXQUFHLEdBQVUsS0FBSyxDQUFDO0lBRW5CLGVBQU8sR0FBYyxTQUFTLENBQUM7SUFDL0IsWUFBSSxHQUFXLE1BQU0sQ0FBQztBQUNyQyxDQUFDLEVBcENnQixPQUFPLEdBQVAsZUFBTyxLQUFQLGVBQU8sUUFvQ3ZCO0FBSVksUUFBQSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNk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WixLQUFLLGFBQUssQ0FBQztRQUNYLGlFQUFpRTtRQUNqRSxLQUFLLFlBQUksQ0FBQztRQUNWLEtBQUssZUFBTyxDQUFDO1FBQ2IsS0FBSyxZQUFJO1lBQ1AsT0FBTyxVQUFVLENBQUM7UUFFcEIsdUVBQXVFO1FBQ3ZFLEtBQUssYUFBSyxDQUFDO1FBQ1gsS0FBSyxZQUFJLENBQUM7UUFDVixLQUFLLGNBQU07WUFDVCxPQUFPLFVBQVUsQ0FBQztRQUVwQiwyQkFBMkI7UUFFM0IsS0FBSyxnQkFBUSxDQUFDO1FBQ2QsS0FBSyxpQkFBUyxDQUFDO1FBQ2YsS0FBSyxpQkFBUyxDQUFDO1FBQ2YsS0FBSyxrQkFBVSxDQUFDO1FBQ2hCLEtBQUssY0FBTSxDQUFDO1FBQ1osS0FBSyxXQUFHLENBQUM7UUFDVCxLQUFLLGFBQUs7WUFDUixPQUFPLFNBQVMsQ0FBQztLQUNwQjtJQUNELG9EQUFvRDtJQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQzlELENBQUM7QUF2Q0QsOEJBdUNDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvbnN0YW50cyBhbmQgdXRpbGl0aWVzIGZvciBlbmNvZGluZyBjaGFubmVscyAoVmlzdWFsIHZhcmlhYmxlcylcbiAqIHN1Y2ggYXMgJ3gnLCAneScsICdjb2xvcicuXG4gKi9cblxuaW1wb3J0IHtSYW5nZVR5cGV9IGZyb20gJy4vY29tcGlsZS9zY2FsZS90eXBlJztcbmltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtGbGFnLCBmbGFnS2V5c30gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IG5hbWVzcGFjZSBDaGFubmVsIHtcbiAgLy8gRmFjZXRcbiAgZXhwb3J0IGNvbnN0IFJPVzogJ3JvdycgPSAncm93JztcbiAgZXhwb3J0IGNvbnN0IENPTFVNTjogJ2NvbHVtbicgPSAnY29sdW1uJztcblxuICAvLyBQb3NpdGlvblxuICBleHBvcnQgY29uc3QgWDogJ3gnID0gJ3gnO1xuICBleHBvcnQgY29uc3QgWTogJ3knID0gJ3knO1xuICBleHBvcnQgY29uc3QgWDI6ICd4MicgPSAneDInO1xuICBleHBvcnQgY29uc3QgWTI6ICd5MicgPSAneTInO1xuXG4gIC8vIEdlbyBQb3NpdGlvblxuICBleHBvcnQgY29uc3QgTEFUSVRVREU6ICdsYXRpdHVkZScgPSAnbGF0aXR1ZGUnO1xuICBleHBvcnQgY29uc3QgTE9OR0lUVURFOiAnbG9uZ2l0dWRlJyA9ICdsb25naXR1ZGUnO1xuICBleHBvcnQgY29uc3QgTEFUSVRVREUyOiAnbGF0aXR1ZGUyJyA9ICdsYXRpdHVkZTInO1xuICBleHBvcnQgY29uc3QgTE9OR0lUVURFMjogJ2xvbmdpdHVkZTInID0gJ2xvbmdpdHVkZTInO1xuXG4gIC8vIE1hcmsgcHJvcGVydHkgd2l0aCBzY2FsZVxuICBleHBvcnQgY29uc3QgQ09MT1I6ICdjb2xvcicgPSAnY29sb3InO1xuXG4gIGV4cG9ydCBjb25zdCBGSUxMOiAnZmlsbCcgPSAnZmlsbCc7XG5cbiAgZXhwb3J0IGNvbnN0IFNUUk9LRTogJ3N0cm9rZScgPSAnc3Ryb2tlJztcblxuICBleHBvcnQgY29uc3QgU0hBUEU6ICdzaGFwZScgPSAnc2hhcGUnO1xuICBleHBvcnQgY29uc3QgU0laRTogJ3NpemUnID0gJ3NpemUnO1xuICBleHBvcnQgY29uc3QgT1BBQ0lUWTogJ29wYWNpdHknID0gJ29wYWNpdHknO1xuXG4gIC8vIE5vbi1zY2FsZSBjaGFubmVsXG4gIGV4cG9ydCBjb25zdCBURVhUOiAndGV4dCcgPSAndGV4dCc7XG4gIGV4cG9ydCBjb25zdCBPUkRFUjogJ29yZGVyJyA9ICdvcmRlcic7XG4gIGV4cG9ydCBjb25zdCBERVRBSUw6ICdkZXRhaWwnID0gJ2RldGFpbCc7XG4gIGV4cG9ydCBjb25zdCBLRVk6ICdrZXknID0gJ2tleSc7XG5cbiAgZXhwb3J0IGNvbnN0IFRPT0xUSVA6ICd0b29sdGlwJyA9ICd0b29sdGlwJztcbiAgZXhwb3J0IGNvbnN0IEhSRUY6ICdocmVmJyA9ICdocmVmJztcbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbCA9IGtleW9mIEVuY29kaW5nPGFueT4gfCBrZXlvZiBGYWNldE1hcHBpbmc8YW55PjtcblxuZXhwb3J0IGNvbnN0IFggPSBDaGFubmVsLlg7XG5leHBvcnQgY29uc3QgWSA9IENoYW5uZWwuWTtcbmV4cG9ydCBjb25zdCBYMiA9IENoYW5uZWwuWDI7XG5leHBvcnQgY29uc3QgWTIgPSBDaGFubmVsLlkyO1xuXG5leHBvcnQgY29uc3QgTEFUSVRVREUgPSBDaGFubmVsLkxBVElUVURFO1xuZXhwb3J0IGNvbnN0IExBVElUVURFMiA9IENoYW5uZWwuTEFUSVRVREUyO1xuZXhwb3J0IGNvbnN0IExPTkdJVFVERSA9IENoYW5uZWwuTE9OR0lUVURFO1xuZXhwb3J0IGNvbnN0IExPTkdJVFVERTIgPSBDaGFubmVsLkxPTkdJVFVERTI7XG5cbmV4cG9ydCBjb25zdCBST1cgPSBDaGFubmVsLlJPVztcbmV4cG9ydCBjb25zdCBDT0xVTU4gPSBDaGFubmVsLkNPTFVNTjtcbmV4cG9ydCBjb25zdCBTSEFQRSA9IENoYW5uZWwuU0hBUEU7XG5leHBvcnQgY29uc3QgU0laRSA9IENoYW5uZWwuU0laRTtcbmV4cG9ydCBjb25zdCBDT0xPUiA9IENoYW5uZWwuQ09MT1I7XG5cbmV4cG9ydCBjb25zdCBGSUxMID0gQ2hhbm5lbC5GSUxMO1xuZXhwb3J0IGNvbnN0IFNUUk9LRSA9IENoYW5uZWwuU1RST0tFO1xuZXhwb3J0IGNvbnN0IFRFWFQgPSBDaGFubmVsLlRFWFQ7XG5leHBvcnQgY29uc3QgREVUQUlMID0gQ2hhbm5lbC5ERVRBSUw7XG5leHBvcnQgY29uc3QgS0VZID0gQ2hhbm5lbC5LRVk7XG5leHBvcnQgY29uc3QgT1JERVIgPSBDaGFubmVsLk9SREVSO1xuZXhwb3J0IGNvbnN0IE9QQUNJVFkgPSBDaGFubmVsLk9QQUNJVFk7XG5leHBvcnQgY29uc3QgVE9PTFRJUCA9IENoYW5uZWwuVE9PTFRJUDtcbmV4cG9ydCBjb25zdCBIUkVGID0gQ2hhbm5lbC5IUkVGO1xuXG5leHBvcnQgdHlwZSBHZW9Qb3NpdGlvbkNoYW5uZWwgPSAnbG9uZ2l0dWRlJyB8ICdsYXRpdHVkZScgfCAnbG9uZ2l0dWRlMicgfCAnbGF0aXR1ZGUyJztcblxuZXhwb3J0IGNvbnN0IEdFT1BPU0lUSU9OX0NIQU5ORUxfSU5ERVg6IEZsYWc8R2VvUG9zaXRpb25DaGFubmVsPiA9IHtcbiAgbG9uZ2l0dWRlOiAxLFxuICBsb25naXR1ZGUyOiAxLFxuICBsYXRpdHVkZTogMSxcbiAgbGF0aXR1ZGUyOiAxLFxufTtcblxuZXhwb3J0IGNvbnN0IEdFT1BPU0lUSU9OX0NIQU5ORUxTID0gZmxhZ0tleXMoR0VPUE9TSVRJT05fQ0hBTk5FTF9JTkRFWCk7XG5cbmNvbnN0IFVOSVRfQ0hBTk5FTF9JTkRFWDogRmxhZzxrZXlvZiBFbmNvZGluZzxhbnk+PiA9IHtcbiAgLy8gcG9zaXRpb25cbiAgeDogMSxcbiAgeTogMSxcbiAgeDI6IDEsXG4gIHkyOiAxLFxuXG4gIC4uLkdFT1BPU0lUSU9OX0NIQU5ORUxfSU5ERVgsXG5cbiAgLy8gY29sb3JcbiAgY29sb3I6IDEsXG4gIGZpbGw6IDEsXG4gIHN0cm9rZTogMSxcblxuICAvLyBvdGhlciBub24tcG9zaXRpb24gd2l0aCBzY2FsZVxuICBvcGFjaXR5OiAxLFxuICBzaXplOiAxLFxuICBzaGFwZTogMSxcblxuICAvLyBjaGFubmVscyB3aXRob3V0IHNjYWxlc1xuICBvcmRlcjogMSxcbiAgdGV4dDogMSxcbiAgZGV0YWlsOiAxLFxuICBrZXk6IDEsXG4gIHRvb2x0aXA6IDEsXG4gIGhyZWY6IDEsXG59O1xuXG5leHBvcnQgdHlwZSBDb2xvckNoYW5uZWwgPSAnY29sb3InIHwgJ2ZpbGwnIHwgJ3N0cm9rZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbG9yQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsKTogY2hhbm5lbCBpcyBDb2xvckNoYW5uZWwge1xuICByZXR1cm4gY2hhbm5lbCA9PT0gJ2NvbG9yJyB8fCBjaGFubmVsID09PSAnZmlsbCcgfHwgY2hhbm5lbCA9PT0gJ3N0cm9rZSc7XG59XG5cbmNvbnN0IEZBQ0VUX0NIQU5ORUxfSU5ERVg6IEZsYWc8a2V5b2YgRmFjZXRNYXBwaW5nPGFueT4+ID0ge1xuICByb3c6IDEsXG4gIGNvbHVtbjogMVxufTtcblxuY29uc3QgQ0hBTk5FTF9JTkRFWCA9IHtcbiAgLi4uVU5JVF9DSEFOTkVMX0lOREVYLFxuICAuLi5GQUNFVF9DSEFOTkVMX0lOREVYXG59O1xuXG5leHBvcnQgY29uc3QgQ0hBTk5FTFMgPSBmbGFnS2V5cyhDSEFOTkVMX0lOREVYKTtcblxuY29uc3Qge29yZGVyOiBfbywgZGV0YWlsOiBfZCwgLi4uU0lOR0xFX0RFRl9DSEFOTkVMX0lOREVYfSA9IENIQU5ORUxfSU5ERVg7XG4vKipcbiAqIENoYW5uZWxzIHRoYXQgY2Fubm90IGhhdmUgYW4gYXJyYXkgb2YgY2hhbm5lbERlZi5cbiAqIG1vZGVsLmZpZWxkRGVmLCBnZXRGaWVsZERlZiBvbmx5IHdvcmsgZm9yIHRoZXNlIGNoYW5uZWxzLlxuICpcbiAqIChUaGUgb25seSB0d28gY2hhbm5lbHMgdGhhdCBjYW4gaGF2ZSBhbiBhcnJheSBvZiBjaGFubmVsRGVmcyBhcmUgXCJkZXRhaWxcIiBhbmQgXCJvcmRlclwiLlxuICogU2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGZpZWxkRGVmcyBmb3IgZGV0YWlsIGFuZCBvcmRlciwgZ2V0RmllbGREZWYvbW9kZWwuZmllbGREZWZcbiAqIGFyZSBub3QgYXBwbGljYWJsZSBmb3IgdGhlbS4gIFNpbWlsYXJseSwgc2VsZWN0aW9uIHByb2plY3Rpb24gd29uJ3Qgd29yayB3aXRoIFwiZGV0YWlsXCIgYW5kIFwib3JkZXJcIi4pXG4gKi9cblxuZXhwb3J0IGNvbnN0IFNJTkdMRV9ERUZfQ0hBTk5FTFM6IFNpbmdsZURlZkNoYW5uZWxbXSA9IGZsYWdLZXlzKFNJTkdMRV9ERUZfQ0hBTk5FTF9JTkRFWCk7XG5cbi8vIFVzaW5nIHRoZSBmb2xsb3dpbmcgbGluZSBsZWFkcyB0byBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdlbGVtZW50VHlwZXMnIG9mIHVuZGVmaW5lZFxuLy8gd2hlbiBydW5uaW5nIHRoZSBzY2hlbWEgZ2VuZXJhdG9yXG4vLyBleHBvcnQgdHlwZSBTaW5nbGVEZWZDaGFubmVsID0gdHlwZW9mIFNJTkdMRV9ERUZfQ0hBTk5FTFNbMF07XG5leHBvcnQgdHlwZSBTaW5nbGVEZWZDaGFubmVsID0gJ3gnIHwgJ3knIHwgJ3gyJyB8ICd5MicgfFxuICAnbG9uZ2l0dWRlJyB8ICdsYXRpdHVkZScgfCAnbG9uZ2l0dWRlMicgfCAnbGF0aXR1ZGUyJyB8XG4gICdyb3cnIHwgJ2NvbHVtbicgfFxuICAnY29sb3InIHwgJ2ZpbGwnIHwgJ3N0cm9rZScgfFxuICAnc2l6ZScgfCAnc2hhcGUnIHwgJ29wYWNpdHknIHxcbiAgJ3RleHQnIHwgJ3Rvb2x0aXAnIHwgJ2hyZWYnIHwgJ2tleSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NoYW5uZWwoc3RyOiBzdHJpbmcpOiBzdHIgaXMgQ2hhbm5lbCB7XG4gIHJldHVybiAhIUNIQU5ORUxfSU5ERVhbc3RyXTtcbn1cblxuLy8gQ0hBTk5FTFMgd2l0aG91dCBDT0xVTU4sIFJPV1xuZXhwb3J0IGNvbnN0IFVOSVRfQ0hBTk5FTFMgPSBmbGFnS2V5cyhVTklUX0NIQU5ORUxfSU5ERVgpO1xuXG5cbi8vIE5PTlBPU0lUSU9OX0NIQU5ORUxTID0gVU5JVF9DSEFOTkVMUyB3aXRob3V0IFgsIFksIFgyLCBZMjtcbmNvbnN0IHtcbiAgeDogX3gsIHk6IF95LFxuICAvLyB4MiBhbmQgeTIgc2hhcmUgdGhlIHNhbWUgc2NhbGUgYXMgeCBhbmQgeVxuICB4MjogX3gyLCB5MjogX3kyLFxuICBsYXRpdHVkZTogX2xhdGl0dWRlLCBsb25naXR1ZGU6IF9sb25naXR1ZGUsXG4gIGxhdGl0dWRlMjogX2xhdGl0dWRlMiwgbG9uZ2l0dWRlMjogX2xvbmdpdHVkZTIsXG4gIC8vIFRoZSByZXN0IG9mIHVuaXQgY2hhbm5lbHMgdGhlbiBoYXZlIHNjYWxlXG4gIC4uLk5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVhcbn0gPSBVTklUX0NIQU5ORUxfSU5ERVg7XG5cbmV4cG9ydCBjb25zdCBOT05QT1NJVElPTl9DSEFOTkVMUyA9IGZsYWdLZXlzKE5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVgpO1xuZXhwb3J0IHR5cGUgTm9uUG9zaXRpb25DaGFubmVsID0gdHlwZW9mIE5PTlBPU0lUSU9OX0NIQU5ORUxTWzBdO1xuXG4vLyBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUyA9IFggYW5kIFk7XG5jb25zdCBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMX0lOREVYOiB7eDoxLCB5OjF9ID0ge3g6MSwgeToxfTtcbmV4cG9ydCBjb25zdCBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUyA9IGZsYWdLZXlzKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVgpO1xuZXhwb3J0IHR5cGUgUG9zaXRpb25TY2FsZUNoYW5uZWwgPSB0eXBlb2YgUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFNbMF07XG5cbi8vIE5PTl9QT1NJVElPTl9TQ0FMRV9DSEFOTkVMID0gU0NBTEVfQ0hBTk5FTFMgd2l0aG91dCBYLCBZXG5jb25zdCB7XG4gIC8vIHgyIGFuZCB5MiBzaGFyZSB0aGUgc2FtZSBzY2FsZSBhcyB4IGFuZCB5XG4gIC8vIHRleHQgYW5kIHRvb2x0aXAgaGF2ZSBmb3JtYXQgaW5zdGVhZCBvZiBzY2FsZSxcbiAgLy8gaHJlZiBoYXMgbmVpdGhlciBmb3JtYXQsIG5vciBzY2FsZVxuICB0ZXh0OiBfdCwgdG9vbHRpcDogX3R0LCBocmVmOiBfaHIsXG4gIC8vIGRldGFpbCBhbmQgb3JkZXIgaGF2ZSBubyBzY2FsZVxuICBkZXRhaWw6IF9kZCwga2V5OiBfaywgb3JkZXI6IF9vbyxcbiAgLi4uTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTF9JTkRFWFxufSA9IE5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVg7XG5leHBvcnQgY29uc3QgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMgPSBmbGFnS2V5cyhOT05QT1NJVElPTl9TQ0FMRV9DSEFOTkVMX0lOREVYKTtcbmV4cG9ydCB0eXBlIE5vblBvc2l0aW9uU2NhbGVDaGFubmVsID0gdHlwZW9mIE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTWzBdO1xuXG4vLyBEZWNsYXJlIFNDQUxFX0NIQU5ORUxfSU5ERVhcbmNvbnN0IFNDQUxFX0NIQU5ORUxfSU5ERVggPSB7XG4gIC4uLlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVgsXG4gIC4uLk5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVhcbn07XG5cbi8qKiBMaXN0IG9mIGNoYW5uZWxzIHdpdGggc2NhbGVzICovXG5leHBvcnQgY29uc3QgU0NBTEVfQ0hBTk5FTFMgPSBmbGFnS2V5cyhTQ0FMRV9DSEFOTkVMX0lOREVYKTtcbmV4cG9ydCB0eXBlIFNjYWxlQ2hhbm5lbCA9IHR5cGVvZiBTQ0FMRV9DSEFOTkVMU1swXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpOiBjaGFubmVsIGlzIFNjYWxlQ2hhbm5lbCB7XG4gIHJldHVybiAhIVNDQUxFX0NIQU5ORUxfSU5ERVhbY2hhbm5lbF07XG59XG5cbmV4cG9ydCB0eXBlIFN1cHBvcnRlZE1hcmsgPSB7XG4gIFttYXJrIGluIE1hcmtdPzogYm9vbGVhblxufTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIGNoYW5uZWwgc3VwcG9ydHMgYSBwYXJ0aWN1bGFyIG1hcmsgdHlwZS5cbiAqIEBwYXJhbSBjaGFubmVsICBjaGFubmVsIG5hbWVcbiAqIEBwYXJhbSBtYXJrIHRoZSBtYXJrIHR5cGVcbiAqIEByZXR1cm4gd2hldGhlciB0aGUgbWFyayBzdXBwb3J0cyB0aGUgY2hhbm5lbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydE1hcmsoY2hhbm5lbDogQ2hhbm5lbCwgbWFyazogTWFyaykge1xuICByZXR1cm4gbWFyayBpbiBnZXRTdXBwb3J0ZWRNYXJrKGNoYW5uZWwpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGRpY3Rpb25hcnkgc2hvd2luZyB3aGV0aGVyIGEgY2hhbm5lbCBzdXBwb3J0cyBtYXJrIHR5cGUuXG4gKiBAcGFyYW0gY2hhbm5lbFxuICogQHJldHVybiBBIGRpY3Rpb25hcnkgbWFwcGluZyBtYXJrIHR5cGVzIHRvIGJvb2xlYW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkTWFyayhjaGFubmVsOiBDaGFubmVsKTogU3VwcG9ydGVkTWFyayB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgQ09MT1I6XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuXG4gICAgY2FzZSBERVRBSUw6XG4gICAgY2FzZSBLRVk6XG4gICAgY2FzZSBUT09MVElQOlxuICAgIGNhc2UgSFJFRjpcbiAgICBjYXNlIE9SREVSOiAgICAvLyBUT0RPOiByZXZpc2UgKG9yZGVyIG1pZ2h0IG5vdCBzdXBwb3J0IHJlY3QsIHdoaWNoIGlzIG5vdCBzdGFja2FibGU/KVxuICAgIGNhc2UgT1BBQ0lUWTpcbiAgICBjYXNlIFJPVzpcbiAgICBjYXNlIENPTFVNTjpcbiAgICAgIHJldHVybiB7IC8vIGFsbCBtYXJrc1xuICAgICAgICBwb2ludDogdHJ1ZSwgdGljazogdHJ1ZSwgcnVsZTogdHJ1ZSwgY2lyY2xlOiB0cnVlLCBzcXVhcmU6IHRydWUsXG4gICAgICAgIGJhcjogdHJ1ZSwgcmVjdDogdHJ1ZSwgbGluZTogdHJ1ZSwgdHJhaWw6IHRydWUsIGFyZWE6IHRydWUsIHRleHQ6IHRydWUsIGdlb3NoYXBlOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgWDpcbiAgICBjYXNlIFk6XG4gICAgY2FzZSBMQVRJVFVERTpcbiAgICBjYXNlIExPTkdJVFVERTpcbiAgICAgIHJldHVybiB7IC8vIGFsbCBtYXJrcyBleGNlcHQgZ2Vvc2hhcGUuIGdlb3NoYXBlIGRvZXMgbm90IHVzZSBYLCBZIC0tIGl0IHVzZXMgYSBwcm9qZWN0aW9uXG4gICAgICAgIHBvaW50OiB0cnVlLCB0aWNrOiB0cnVlLCBydWxlOiB0cnVlLCBjaXJjbGU6IHRydWUsIHNxdWFyZTogdHJ1ZSxcbiAgICAgICAgYmFyOiB0cnVlLCByZWN0OiB0cnVlLCBsaW5lOiB0cnVlLCB0cmFpbDogdHJ1ZSwgYXJlYTogdHJ1ZSwgdGV4dDogdHJ1ZVxuICAgICAgfTtcbiAgICBjYXNlIFgyOlxuICAgIGNhc2UgWTI6XG4gICAgY2FzZSBMQVRJVFVERTI6XG4gICAgY2FzZSBMT05HSVRVREUyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcnVsZTogdHJ1ZSwgYmFyOiB0cnVlLCByZWN0OiB0cnVlLCBhcmVhOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgU0laRTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiB0cnVlLCB0aWNrOiB0cnVlLCBydWxlOiB0cnVlLCBjaXJjbGU6IHRydWUsIHNxdWFyZTogdHJ1ZSxcbiAgICAgICAgYmFyOiB0cnVlLCB0ZXh0OiB0cnVlLCBsaW5lOiB0cnVlLCB0cmFpbDogdHJ1ZVxuICAgICAgfTtcbiAgICBjYXNlIFNIQVBFOlxuICAgICAgcmV0dXJuIHtwb2ludDogdHJ1ZSwgZ2Vvc2hhcGU6IHRydWV9O1xuICAgIGNhc2UgVEVYVDpcbiAgICAgIHJldHVybiB7dGV4dDogdHJ1ZX07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlVHlwZShjaGFubmVsOiBDaGFubmVsKTogUmFuZ2VUeXBlIHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSBYOlxuICAgIGNhc2UgWTpcbiAgICBjYXNlIFNJWkU6XG4gICAgY2FzZSBPUEFDSVRZOlxuICAgIC8vIFgyIGFuZCBZMiB1c2UgWCBhbmQgWSBzY2FsZXMsIHNvIHRoZXkgc2ltaWxhcmx5IGhhdmUgY29udGludW91cyByYW5nZS5cbiAgICBjYXNlIFgyOlxuICAgIGNhc2UgWTI6XG4gICAgICByZXR1cm4gJ2NvbnRpbnVvdXMnO1xuXG4gICAgY2FzZSBST1c6XG4gICAgY2FzZSBDT0xVTU46XG4gICAgY2FzZSBTSEFQRTpcbiAgICAvLyBURVhULCBUT09MVElQLCBhbmQgSFJFRiBoYXZlIG5vIHNjYWxlIGJ1dCBoYXZlIGRpc2NyZXRlIG91dHB1dFxuICAgIGNhc2UgVEVYVDpcbiAgICBjYXNlIFRPT0xUSVA6XG4gICAgY2FzZSBIUkVGOlxuICAgICAgcmV0dXJuICdkaXNjcmV0ZSc7XG5cbiAgICAvLyBDb2xvciBjYW4gYmUgZWl0aGVyIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUsIGRlcGVuZGluZyBvbiBzY2FsZSB0eXBlLlxuICAgIGNhc2UgQ09MT1I6XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuICAgICAgcmV0dXJuICdmbGV4aWJsZSc7XG5cbiAgICAvLyBObyBzY2FsZSwgbm8gcmFuZ2UgdHlwZS5cblxuICAgIGNhc2UgTEFUSVRVREU6XG4gICAgY2FzZSBMT05HSVRVREU6XG4gICAgY2FzZSBMQVRJVFVERTI6XG4gICAgY2FzZSBMT05HSVRVREUyOlxuICAgIGNhc2UgREVUQUlMOlxuICAgIGNhc2UgS0VZOlxuICAgIGNhc2UgT1JERVI6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4gKi9cbiAgdGhyb3cgbmV3IEVycm9yKCdyYW5nZVR5cGUgbm90IGltcGxlbWVudGVkIGZvciAnICsgY2hhbm5lbCk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/axis/assemble.d.ts b/build/src/compile/axis/assemble.d.ts new file mode 100644 index 0000000000..b3c16c644a --- /dev/null +++ b/build/src/compile/axis/assemble.d.ts @@ -0,0 +1,7 @@ +import { Config } from '../../config'; +import { VgAxis } from '../../vega.schema'; +import { AxisComponent, AxisComponentIndex } from './component'; +export declare function assembleAxis(axisCmpt: AxisComponent, kind: 'main' | 'grid', config: Config, opt?: { + header: boolean; +}): VgAxis; +export declare function assembleAxes(axisComponents: AxisComponentIndex, config: Config): VgAxis[]; diff --git a/build/src/compile/axis/assemble.js b/build/src/compile/axis/assemble.js new file mode 100644 index 0000000000..a015b617ef --- /dev/null +++ b/build/src/compile/axis/assemble.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var axis_1 = require("../../axis"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +function assembleTitle(title, config) { + if (vega_util_1.isArray(title)) { + return title.map(function (fieldDef) { return fielddef_1.title(fieldDef, config); }).join(', '); + } + return title; +} +function assembleAxis(axisCmpt, kind, config, opt) { + if (opt === void 0) { opt = { header: false }; } + var _a = axisCmpt.combine(), orient = _a.orient, scale = _a.scale, title = _a.title, zindex = _a.zindex, axis = tslib_1.__rest(_a, ["orient", "scale", "title", "zindex"]); + // Remove properties that are not valid for this kind of axis + util_1.keys(axis).forEach(function (key) { + var propType = axis_1.AXIS_PROPERTY_TYPE[key]; + if (propType && propType !== kind && propType !== 'both') { + delete axis[key]; + } + }); + if (kind === 'grid') { + if (!axis.grid) { + return undefined; + } + // Remove unnecessary encode block + if (axis.encode) { + // Only need to keep encode block for grid + var grid = axis.encode.grid; + axis.encode = tslib_1.__assign({}, (grid ? { grid: grid } : {})); + if (util_1.keys(axis.encode).length === 0) { + delete axis.encode; + } + } + return tslib_1.__assign({ scale: scale, + orient: orient }, axis, { domain: false, labels: false, + // Always set min/maxExtent to 0 to ensure that `config.axis*.minExtent` and `config.axis*.maxExtent` + // would not affect gridAxis + maxExtent: 0, minExtent: 0, ticks: false, zindex: zindex !== undefined ? zindex : 0 // put grid behind marks by default + }); + } + else { // kind === 'main' + if (!opt.header && axisCmpt.mainExtracted) { + // if mainExtracted has been extracted to a separate facet + return undefined; + } + // Remove unnecessary encode block + if (axis.encode) { + for (var _i = 0, AXIS_PARTS_1 = axis_1.AXIS_PARTS; _i < AXIS_PARTS_1.length; _i++) { + var part = AXIS_PARTS_1[_i]; + if (!axisCmpt.hasAxisPart(part)) { + delete axis.encode[part]; + } + } + if (util_1.keys(axis.encode).length === 0) { + delete axis.encode; + } + } + var titleString = assembleTitle(title, config); + return tslib_1.__assign({ scale: scale, + orient: orient, grid: false }, (titleString ? { title: titleString } : {}), axis, { zindex: zindex !== undefined ? zindex : 1 // put axis line above marks by default + }); + } +} +exports.assembleAxis = assembleAxis; +function assembleAxes(axisComponents, config) { + var _a = axisComponents.x, x = _a === void 0 ? [] : _a, _b = axisComponents.y, y = _b === void 0 ? [] : _b; + return x.map(function (a) { return assembleAxis(a, 'main', config); }).concat(x.map(function (a) { return assembleAxis(a, 'grid', config); }), y.map(function (a) { return assembleAxis(a, 'main', config); }), y.map(function (a) { return assembleAxis(a, 'grid', config); })).filter(function (a) { return a; }); // filter undefined +} +exports.assembleAxes = assembleAxes; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFrQztBQUVsQyxtQ0FBMEQ7QUFFMUQsMkNBQW9FO0FBQ3BFLG1DQUFnQztBQUloQyx1QkFBdUIsS0FBc0MsRUFBRSxNQUFjO0lBQzNFLElBQUksbUJBQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNsQixPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsVUFBQSxRQUFRLElBQUksT0FBQSxnQkFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxRTtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELHNCQUNFLFFBQXVCLEVBQ3ZCLElBQXFCLEVBQ3JCLE1BQWMsRUFDZCxHQUVtQjtJQUZuQixvQkFBQSxFQUFBLFFBRUssTUFBTSxFQUFFLEtBQUssRUFBQztJQUVuQixJQUFNLHVCQUE0RCxFQUEzRCxrQkFBTSxFQUFFLGdCQUFLLEVBQUUsZ0JBQUssRUFBRSxrQkFBTSxFQUFFLGlFQUE2QixDQUFDO0lBRW5FLDZEQUE2RDtJQUM3RCxXQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBRztRQUNyQixJQUFNLFFBQVEsR0FBRyx5QkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN6QyxJQUFJLFFBQVEsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDeEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDbEI7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtZQUNkLE9BQU8sU0FB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Q0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxFQUM5QyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEVBQUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7QUFDdkMsQ0FBQztBQVJELG9DQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0FYSVNfUEFSVFMsIEFYSVNfUFJPUEVSVFlfVFlQRX0gZnJvbSAnLi4vLi4vYXhpcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7RmllbGREZWZCYXNlLCB0aXRsZSBhcyBmaWVsZERlZlRpdGxlfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0F4aXN9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QXhpc0NvbXBvbmVudCwgQXhpc0NvbXBvbmVudEluZGV4fSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbmZ1bmN0aW9uIGFzc2VtYmxlVGl0bGUodGl0bGU6IHN0cmluZyB8IEZpZWxkRGVmQmFzZTxzdHJpbmc+W10sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGlmIChpc0FycmF5KHRpdGxlKSkge1xuICAgIHJldHVybiB0aXRsZS5tYXAoZmllbGREZWYgPT4gZmllbGREZWZUaXRsZShmaWVsZERlZiwgY29uZmlnKSkuam9pbignLCAnKTtcbiAgfVxuICByZXR1cm4gdGl0bGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUF4aXMoXG4gIGF4aXNDbXB0OiBBeGlzQ29tcG9uZW50LFxuICBraW5kOiAnbWFpbicgfCAnZ3JpZCcsXG4gIGNvbmZpZzogQ29uZmlnLFxuICBvcHQ6IHtcbiAgICBoZWFkZXI6IGJvb2xlYW4gLy8gd2hldGhlciB0aGlzIGlzIGNhbGxlZCB2aWEgYSBoZWFkZXJcbiAgfSA9IHtoZWFkZXI6IGZhbHNlfVxuKTogVmdBeGlzIHtcbiAgY29uc3Qge29yaWVudCwgc2NhbGUsIHRpdGxlLCB6aW5kZXgsIC4uLmF4aXN9ID0gYXhpc0NtcHQuY29tYmluZSgpO1xuXG4gIC8vIFJlbW92ZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBmb3IgdGhpcyBraW5kIG9mIGF4aXNcbiAga2V5cyhheGlzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBwcm9wVHlwZSA9IEFYSVNfUFJPUEVSVFlfVFlQRVtrZXldO1xuICAgIGlmIChwcm9wVHlwZSAmJiBwcm9wVHlwZSAhPT0ga2luZCAmJiBwcm9wVHlwZSAhPT0gJ2JvdGgnKSB7XG4gICAgICBkZWxldGUgYXhpc1trZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKGtpbmQgPT09ICdncmlkJykge1xuICAgIGlmICghYXhpcy5ncmlkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB1bm5lY2Vzc2FyeSBlbmNvZGUgYmxvY2tcbiAgICBpZiAoYXhpcy5lbmNvZGUpIHtcbiAgICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIGVuY29kZSBibG9jayBmb3IgZ3JpZFxuICAgICAgY29uc3Qge2dyaWR9ID0gYXhpcy5lbmNvZGU7XG4gICAgICBheGlzLmVuY29kZSA9IHtcbiAgICAgICAgLi4uKGdyaWQgPyB7Z3JpZH0gOiB7fSlcbiAgICAgIH07XG5cbiAgICAgIGlmIChrZXlzKGF4aXMuZW5jb2RlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVsZXRlIGF4aXMuZW5jb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzY2FsZSxcbiAgICAgIG9yaWVudCxcbiAgICAgIC4uLmF4aXMsXG4gICAgICBkb21haW46IGZhbHNlLFxuICAgICAgbGFiZWxzOiBmYWxzZSxcblxuICAgICAgLy8gQWx3YXlzIHNldCBtaW4vbWF4RXh0ZW50IHRvIDAgdG8gZW5zdXJlIHRoYXQgYGNvbmZpZy5heGlzKi5taW5FeHRlbnRgIGFuZCBgY29uZmlnLmF4aXMqLm1heEV4dGVudGBcbiAgICAgIC8vIHdvdWxkIG5vdCBhZmZlY3QgZ3JpZEF4aXNcbiAgICAgIG1heEV4dGVudDogMCxcbiAgICAgIG1pbkV4dGVudDogMCxcbiAgICAgIHRpY2tzOiBmYWxzZSxcbiAgICAgIHppbmRleDogemluZGV4ICE9PSB1bmRlZmluZWQgPyB6aW5kZXggOiAwIC8vIHB1dCBncmlkIGJlaGluZCBtYXJrcyBieSBkZWZhdWx0XG4gICAgfTtcbiAgfSBlbHNlIHsgLy8ga2luZCA9PT0gJ21haW4nXG5cbiAgICBpZiAoIW9wdC5oZWFkZXIgJiYgYXhpc0NtcHQubWFpbkV4dHJhY3RlZCkge1xuICAgICAgLy8gaWYgbWFpbkV4dHJhY3RlZCBoYXMgYmVlbiBleHRyYWN0ZWQgdG8gYSBzZXBhcmF0ZSBmYWNldFxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdW5uZWNlc3NhcnkgZW5jb2RlIGJsb2NrXG4gICAgaWYgKGF4aXMuZW5jb2RlKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhcnQgb2YgQVhJU19QQVJUUykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWF4aXNDbXB0Lmhhc0F4aXNQYXJ0KHBhcnQpXG4gICAgICAgICkge1xuICAgICAgICAgIGRlbGV0ZSBheGlzLmVuY29kZVtwYXJ0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGtleXMoYXhpcy5lbmNvZGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgYXhpcy5lbmNvZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGVTdHJpbmcgPSBhc3NlbWJsZVRpdGxlKHRpdGxlLCBjb25maWcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlLFxuICAgICAgb3JpZW50LFxuICAgICAgZ3JpZDogZmFsc2UsXG4gICAgICAuLi4odGl0bGVTdHJpbmcgPyB7dGl0bGU6IHRpdGxlU3RyaW5nfSA6IHt9KSxcbiAgICAgIC4uLmF4aXMsXG4gICAgICB6aW5kZXg6IHppbmRleCAhPT0gdW5kZWZpbmVkID8gemluZGV4IDogMSAvLyBwdXQgYXhpcyBsaW5lIGFib3ZlIG1hcmtzIGJ5IGRlZmF1bHRcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUF4ZXMoYXhpc0NvbXBvbmVudHM6IEF4aXNDb21wb25lbnRJbmRleCwgY29uZmlnOiBDb25maWcpOiBWZ0F4aXNbXSB7XG4gIGNvbnN0IHt4PVtdLCB5PVtdfSA9IGF4aXNDb21wb25lbnRzO1xuICByZXR1cm4gW1xuICAgIC4uLngubWFwKGEgPT4gYXNzZW1ibGVBeGlzKGEsICdtYWluJywgY29uZmlnKSksXG4gICAgLi4ueC5tYXAoYSA9PiBhc3NlbWJsZUF4aXMoYSwgJ2dyaWQnLCBjb25maWcpKSxcbiAgICAuLi55Lm1hcChhID0+IGFzc2VtYmxlQXhpcyhhLCAnbWFpbicsIGNvbmZpZykpLFxuICAgIC4uLnkubWFwKGEgPT4gYXNzZW1ibGVBeGlzKGEsICdncmlkJywgY29uZmlnKSlcbiAgXS5maWx0ZXIoYSA9PiBhKTsgLy8gZmlsdGVyIHVuZGVmaW5lZFxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/axis/component.d.ts b/build/src/compile/axis/component.d.ts new file mode 100644 index 0000000000..8ab24a1d7b --- /dev/null +++ b/build/src/compile/axis/component.d.ts @@ -0,0 +1,24 @@ +import { Axis, AxisPart } from '../../axis'; +import { FieldDefBase } from '../../fielddef'; +import { Omit } from '../../util'; +import { VgAxis } from '../../vega.schema'; +import { Split } from '../split'; +export declare type AxisComponentProps = Omit & { + title: string | FieldDefBase[]; +}; +export declare class AxisComponent extends Split { + readonly explicit: Partial; + readonly implicit: Partial; + mainExtracted: boolean; + constructor(explicit?: Partial, implicit?: Partial, mainExtracted?: boolean); + clone(): AxisComponent; + hasAxisPart(part: AxisPart): boolean; +} +export interface AxisComponentIndex { + x?: AxisComponent[]; + y?: AxisComponent[]; +} +export interface AxisIndex { + x?: Axis; + y?: Axis; +} diff --git a/build/src/compile/axis/component.js b/build/src/compile/axis/component.js new file mode 100644 index 0000000000..d2cacbaf53 --- /dev/null +++ b/build/src/compile/axis/component.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("../../util"); +var split_1 = require("../split"); +function isFalseOrNull(v) { + return v === false || v === null; +} +var AxisComponent = /** @class */ (function (_super) { + tslib_1.__extends(AxisComponent, _super); + function AxisComponent(explicit, implicit, mainExtracted) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + if (mainExtracted === void 0) { mainExtracted = false; } + var _this = _super.call(this) || this; + _this.explicit = explicit; + _this.implicit = implicit; + _this.mainExtracted = mainExtracted; + return _this; + } + AxisComponent.prototype.clone = function () { + return new AxisComponent(util_1.duplicate(this.explicit), util_1.duplicate(this.implicit), this.mainExtracted); + }; + AxisComponent.prototype.hasAxisPart = function (part) { + // FIXME(https://github.com/vega/vega-lite/issues/2552) this method can be wrong if users use a Vega theme. + if (part === 'axis') { // always has the axis container part + return true; + } + if (part === 'grid' || part === 'title') { + return !!this.get(part); + } + // Other parts are enabled by default, so they should not be false or null. + return !isFalseOrNull(this.get(part)); + }; + return AxisComponent; +}(split_1.Split)); +exports.AxisComponent = AxisComponent; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsbUNBQTJDO0FBRTNDLGtDQUErQjtBQUcvQix1QkFBdUIsQ0FBaUI7SUFDdEMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDbkMsQ0FBQztBQU9EO0lBQW1DLHlDQUF5QjtJQUMxRCx1QkFDa0IsUUFBMEMsRUFDMUMsUUFBMEMsRUFDbkQsYUFBcUI7UUFGWix5QkFBQSxFQUFBLGFBQTBDO1FBQzFDLHlCQUFBLEVBQUEsYUFBMEM7UUFDbkQsOEJBQUEsRUFBQSxxQkFBcUI7UUFIOUIsWUFLRSxpQkFBTyxTQUNSO1FBTGlCLGNBQVEsR0FBUixRQUFRLENBQWtDO1FBQzFDLGNBQVEsR0FBUixRQUFRLENBQWtDO1FBQ25ELG1CQUFhLEdBQWIsYUFBYSxDQUFROztJQUc5QixDQUFDO0lBRU0sNkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxhQUFhLENBQ3RCLGdCQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixnQkFBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUM3QyxDQUFDO0lBQ0osQ0FBQztJQUVNLG1DQUFXLEdBQWxCLFVBQW1CLElBQWM7UUFDL0IsMkdBQTJHO1FBRTNHLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxFQUFFLHFDQUFxQztZQUMxRCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxJQUFJLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUU7WUFDdkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN6QjtRQUNELDJFQUEyRTtRQUMzRSxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0gsb0JBQUM7QUFBRCxDQUFDLEFBN0JELENBQW1DLGFBQUssR0E2QnZDO0FBN0JZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBeGlzLCBBeGlzUGFydH0gZnJvbSAnLi4vLi4vYXhpcyc7XG5pbXBvcnQge0ZpZWxkRGVmQmFzZX0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtkdXBsaWNhdGUsIE9taXR9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0F4aXN9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7U3BsaXR9IGZyb20gJy4uL3NwbGl0JztcblxuXG5mdW5jdGlvbiBpc0ZhbHNlT3JOdWxsKHY6IGJvb2xlYW4gfCBudWxsKSB7XG4gIHJldHVybiB2ID09PSBmYWxzZSB8fCB2ID09PSBudWxsO1xufVxuXG5leHBvcnQgdHlwZSBBeGlzQ29tcG9uZW50UHJvcHMgPSBPbWl0PFZnQXhpcywgJ3RpdGxlJz4gJiB7XG5cbiAgdGl0bGU6IHN0cmluZyB8IEZpZWxkRGVmQmFzZTxzdHJpbmc+W107XG59O1xuXG5leHBvcnQgY2xhc3MgQXhpc0NvbXBvbmVudCBleHRlbmRzIFNwbGl0PEF4aXNDb21wb25lbnRQcm9wcz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhwbGljaXQ6IFBhcnRpYWw8QXhpc0NvbXBvbmVudFByb3BzPiA9IHt9LFxuICAgIHB1YmxpYyByZWFkb25seSBpbXBsaWNpdDogUGFydGlhbDxBeGlzQ29tcG9uZW50UHJvcHM+ID0ge30sXG4gICAgcHVibGljIG1haW5FeHRyYWN0ZWQgPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQXhpc0NvbXBvbmVudChcbiAgICAgIGR1cGxpY2F0ZSh0aGlzLmV4cGxpY2l0KSxcbiAgICAgIGR1cGxpY2F0ZSh0aGlzLmltcGxpY2l0KSwgdGhpcy5tYWluRXh0cmFjdGVkXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNBeGlzUGFydChwYXJ0OiBBeGlzUGFydCkge1xuICAgIC8vIEZJWE1FKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjU1MikgdGhpcyBtZXRob2QgY2FuIGJlIHdyb25nIGlmIHVzZXJzIHVzZSBhIFZlZ2EgdGhlbWUuXG5cbiAgICBpZiAocGFydCA9PT0gJ2F4aXMnKSB7IC8vIGFsd2F5cyBoYXMgdGhlIGF4aXMgY29udGFpbmVyIHBhcnRcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwYXJ0ID09PSAnZ3JpZCcgfHwgcGFydCA9PT0gJ3RpdGxlJykge1xuICAgICAgcmV0dXJuICEhdGhpcy5nZXQocGFydCk7XG4gICAgfVxuICAgIC8vIE90aGVyIHBhcnRzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQsIHNvIHRoZXkgc2hvdWxkIG5vdCBiZSBmYWxzZSBvciBudWxsLlxuICAgIHJldHVybiAhaXNGYWxzZU9yTnVsbCh0aGlzLmdldChwYXJ0KSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBeGlzQ29tcG9uZW50SW5kZXgge1xuICB4PzogQXhpc0NvbXBvbmVudFtdO1xuICB5PzogQXhpc0NvbXBvbmVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF4aXNJbmRleCB7XG4gIHg/OiBBeGlzO1xuICB5PzogQXhpcztcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/axis/config.d.ts b/build/src/compile/axis/config.d.ts new file mode 100644 index 0000000000..3713bf518c --- /dev/null +++ b/build/src/compile/axis/config.d.ts @@ -0,0 +1,4 @@ +import { PositionScaleChannel } from '../../channel'; +import { Config } from '../../config'; +import { ScaleType } from '../../scale'; +export declare function getAxisConfig(property: string, config: Config, channel: PositionScaleChannel, orient: string, scaleType: ScaleType): any; diff --git a/build/src/compile/axis/config.js b/build/src/compile/axis/config.js new file mode 100644 index 0000000000..7ffd645460 --- /dev/null +++ b/build/src/compile/axis/config.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function getAxisConfig(property, config, channel, orient, scaleType) { + if (orient === void 0) { orient = ''; } + // configTypes to loop, starting from higher precedence + var configTypes = (scaleType === 'band' ? ['axisBand'] : []).concat([ + channel === 'x' ? 'axisX' : 'axisY', + 'axis' + orient.substr(0, 1).toUpperCase() + orient.substr(1), + 'axis' + ]); + for (var _i = 0, configTypes_1 = configTypes; _i < configTypes_1.length; _i++) { + var configType = configTypes_1[_i]; + if (config[configType] && config[configType][property] !== undefined) { + return config[configType][property]; + } + } + return undefined; +} +exports.getAxisConfig = getAxisConfig; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQSx1QkFBOEIsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsT0FBNkIsRUFBRSxNQUFtQixFQUFFLFNBQW9CO0lBQXpDLHVCQUFBLEVBQUEsV0FBbUI7SUFDaEgsdURBQXVEO0lBQ3ZELElBQU0sV0FBVyxHQUFHLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3BFLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztRQUNuQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTTtLQUNQLENBQUMsQ0FBQztJQUNILEtBQXlCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1FBQWpDLElBQU0sVUFBVSxvQkFBQTtRQUNuQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3BFLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO0tBQ0Y7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBZEQsc0NBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Bvc2l0aW9uU2NhbGVDaGFubmVsfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEF4aXNDb25maWcocHJvcGVydHk6IHN0cmluZywgY29uZmlnOiBDb25maWcsIGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBvcmllbnQ6IHN0cmluZyA9ICcnLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICAvLyBjb25maWdUeXBlcyB0byBsb29wLCBzdGFydGluZyBmcm9tIGhpZ2hlciBwcmVjZWRlbmNlXG4gIGNvbnN0IGNvbmZpZ1R5cGVzID0gKHNjYWxlVHlwZSA9PT0gJ2JhbmQnID8gWydheGlzQmFuZCddIDogW10pLmNvbmNhdChbXG4gICAgY2hhbm5lbCA9PT0gJ3gnID8gJ2F4aXNYJyA6ICdheGlzWScsXG4gICAgJ2F4aXMnICsgb3JpZW50LnN1YnN0cigwLDEpLnRvVXBwZXJDYXNlKCkgKyBvcmllbnQuc3Vic3RyKDEpLCAvLyBheGlzVG9wLCBheGlzQm90dG9tLCAuLi5cbiAgICAnYXhpcydcbiAgXSk7XG4gIGZvciAoY29uc3QgY29uZmlnVHlwZSBvZiBjb25maWdUeXBlcykge1xuICAgIGlmIChjb25maWdbY29uZmlnVHlwZV0gJiYgY29uZmlnW2NvbmZpZ1R5cGVdW3Byb3BlcnR5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29uZmlnW2NvbmZpZ1R5cGVdW3Byb3BlcnR5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/axis/encode.d.ts b/build/src/compile/axis/encode.d.ts new file mode 100644 index 0000000000..dbf2e55739 --- /dev/null +++ b/build/src/compile/axis/encode.d.ts @@ -0,0 +1,11 @@ +import { Axis } from '../../axis'; +import { Channel, PositionScaleChannel } from '../../channel'; +import { FieldDef } from '../../fielddef'; +import { AxisOrient, HorizontalAlign } from '../../vega.schema'; +import { UnitModel } from '../unit'; +export declare function labels(model: UnitModel, channel: PositionScaleChannel, specifiedLabelsSpec: any, orient: AxisOrient): any; +export declare function labelBaseline(angle: number, orient: AxisOrient): { + value: string; +}; +export declare function labelAngle(axis: Axis, channel: Channel, fieldDef: FieldDef): number; +export declare function labelAlign(angle: number, orient: AxisOrient): HorizontalAlign; diff --git a/build/src/compile/axis/encode.js b/build/src/compile/axis/encode.js new file mode 100644 index 0000000000..1077c99c3c --- /dev/null +++ b/build/src/compile/axis/encode.js @@ -0,0 +1,110 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var scale_1 = require("../../scale"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var config_1 = require("./config"); +function labels(model, channel, specifiedLabelsSpec, orient) { + var fieldDef = model.fieldDef(channel) || + (channel === 'x' ? model.fieldDef('x2') : + channel === 'y' ? model.fieldDef('y2') : + undefined); + var axis = model.axis(channel); + var config = model.config; + var labelsSpec = {}; + // Text + if (fielddef_1.isTimeFieldDef(fieldDef)) { + var isUTCScale = model.getScaleComponent(channel).get('type') === scale_1.ScaleType.UTC; + var expr = common_1.timeFormatExpression('datum.value', fieldDef.timeUnit, axis.format, config.axis.shortTimeLabels, config.timeFormat, isUTCScale); + if (expr) { + labelsSpec.text = { signal: expr }; + } + } + // Label Angle + var angle = config_1.getAxisConfig('labelAngle', model.config, channel, orient, model.getScaleComponent(channel).get('type')); + if (angle === undefined) { + angle = labelAngle(axis, channel, fieldDef); + if (angle) { + labelsSpec.angle = { value: angle }; + } + } + if (angle !== undefined) { + var align = labelAlign(angle, orient); + if (align) { + labelsSpec.align = { value: align }; + } + labelsSpec.baseline = labelBaseline(angle, orient); + } + labelsSpec = tslib_1.__assign({}, labelsSpec, specifiedLabelsSpec); + return util_1.keys(labelsSpec).length === 0 ? undefined : labelsSpec; +} +exports.labels = labels; +function labelBaseline(angle, orient) { + if (orient === 'top' || orient === 'bottom') { + if (angle <= 45 || 315 <= angle) { + return { value: orient === 'top' ? 'bottom' : 'top' }; + } + else if (135 <= angle && angle <= 225) { + return { value: orient === 'top' ? 'top' : 'bottom' }; + } + else { + return { value: 'middle' }; + } + } + else { + if ((angle <= 45 || 315 <= angle) || (135 <= angle && angle <= 225)) { + return { value: 'middle' }; + } + else if (45 <= angle && angle <= 135) { + return { value: orient === 'left' ? 'top' : 'bottom' }; + } + else { + return { value: orient === 'left' ? 'bottom' : 'top' }; + } + } +} +exports.labelBaseline = labelBaseline; +function labelAngle(axis, channel, fieldDef) { + if (axis.labelAngle !== undefined) { + // Make angle within [0,360) + return ((axis.labelAngle % 360) + 360) % 360; + } + else { + if (channel === channel_1.X && util_1.contains([type_1.NOMINAL, type_1.ORDINAL], fieldDef.type)) { + return 270; + } + } + return undefined; +} +exports.labelAngle = labelAngle; +function labelAlign(angle, orient) { + angle = ((angle % 360) + 360) % 360; + if (orient === 'top' || orient === 'bottom') { + if (angle % 180 === 0) { + return 'center'; + } + else if (0 < angle && angle < 180) { + return orient === 'top' ? 'right' : 'left'; + } + else { + return orient === 'top' ? 'left' : 'right'; + } + } + else { + if ((angle + 90) % 180 === 0) { + return 'center'; + } + else if (90 <= angle && angle < 270) { + return orient === 'left' ? 'left' : 'right'; + } + else { + return orient === 'left' ? 'right' : 'left'; + } + } +} +exports.labelAlign = labelAlign; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9lbmNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQStEO0FBQy9ELDJDQUF3RDtBQUN4RCxxQ0FBc0M7QUFDdEMsbUNBQTRDO0FBQzVDLG1DQUEwQztBQUUxQyxvQ0FBK0M7QUFFL0MsbUNBQXVDO0FBRXZDLGdCQUF1QixLQUFnQixFQUFFLE9BQTZCLEVBQUUsbUJBQXdCLEVBQUUsTUFBa0I7SUFDbEgsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDdEMsQ0FDRSxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEMsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxTQUFTLENBQ1YsQ0FBQztJQUNKLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU1QixJQUFJLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFFekIsT0FBTztJQUNQLElBQUkseUJBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUM1QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLGlCQUFTLENBQUMsR0FBRyxDQUFDO1FBRWxGLElBQU0sSUFBSSxHQUFHLDZCQUFvQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFD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QyxDQUFDLE9BQU8sQ0FBQztTQUM3QzthQUFNO1lBQ0wsT0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUM3QztLQUNGO0FBQ0gsQ0FBQztBQW5CRCxnQ0FtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F4aXN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtDaGFubmVsLCBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgWH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCBpc1RpbWVGaWVsZERlZn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7Tk9NSU5BTCwgT1JESU5BTH0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zLCBrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7QXhpc09yaWVudCwgSG9yaXpvbnRhbEFsaWdufSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge3RpbWVGb3JtYXRFeHByZXNzaW9ufSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtnZXRBeGlzQ29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbHMobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogUG9zaXRpb25TY2FsZUNoYW5uZWwsIHNwZWNpZmllZExhYmVsc1NwZWM6IGFueSwgb3JpZW50OiBBeGlzT3JpZW50KSB7XG4gIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCkgfHxcbiAgICAoXG4gICAgICBjaGFubmVsID09PSAneCcgPyBtb2RlbC5maWVsZERlZigneDInKSA6XG4gICAgICBjaGFubmVsID09PSAneScgPyBtb2RlbC5maWVsZERlZigneTInKSA6XG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuICBjb25zdCBheGlzID0gbW9kZWwuYXhpcyhjaGFubmVsKTtcbiAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnO1xuXG4gIGxldCBsYWJlbHNTcGVjOiBhbnkgPSB7fTtcblxuICAvLyBUZXh0XG4gIGlmIChpc1RpbWVGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICBjb25zdCBpc1VUQ1NjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJykgPT09IFNjYWxlVHlwZS5VVEM7XG5cbiAgICBjb25zdCBleHByID0gdGltZUZvcm1hdEV4cHJlc3Npb24oJ2RhdHVtLnZhbHVlJywgZmllbGREZWYudGltZVVuaXQsIGF4aXMuZm9ybWF0LCBjb25maWcuYXhpcy5zaG9ydFRpbWVMYWJlbHMsIGNvbmZpZy50aW1lRm9ybWF0LCBpc1VUQ1NjYWxlKTtcblxuICAgIGlmIChleHByKSB7XG4gICAgICBsYWJlbHNTcGVjLnRleHQgPSB7c2lnbmFsOiBleHByfTtcbiAgICB9XG4gIH1cblxuICAvLyBMYWJlbCBBbmdsZVxuICBsZXQgYW5nbGUgPSBnZXRBeGlzQ29uZmlnKCdsYWJlbEFuZ2xlJywgbW9kZWwuY29uZmlnLCBjaGFubmVsLCBvcmllbnQsIG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpKTtcbiAgaWYgKGFuZ2xlID09PSB1bmRlZmluZWQpIHtcbiAgICBhbmdsZSA9IGxhYmVsQW5nbGUoYXhpcywgY2hhbm5lbCwgZmllbGREZWYpO1xuICAgIGlmIChhbmdsZSkge1xuICAgICAgbGFiZWxzU3BlYy5hbmdsZSA9IHt2YWx1ZTogYW5nbGV9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbmdsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgYWxpZ24gPSBsYWJlbEFsaWduKGFuZ2xlLCBvcmllbnQpO1xuICAgIGlmIChhbGlnbikge1xuICAgICAgbGFiZWxzU3BlYy5hbGlnbiA9IHt2YWx1ZTogYWxpZ259O1xuICAgIH1cblxuICAgIGxhYmVsc1NwZWMuYmFzZWxpbmUgPSBsYWJlbEJhc2VsaW5lKGFuZ2xlLCBvcmllbnQpO1xuICB9XG5cbiAgbGFiZWxzU3BlYyA9IHtcbiAgICAuLi5sYWJlbHNTcGVjLFxuICAgIC4uLnNwZWNpZmllZExhYmVsc1NwZWNcbiAgfTtcblxuICByZXR1cm4ga2V5cyhsYWJlbHNTcGVjKS5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBsYWJlbHNTcGVjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxCYXNlbGluZShhbmdsZTogbnVtYmVyLCBvcmllbnQ6IEF4aXNPcmllbnQpIHtcbiAgaWYgKG9yaWVudCA9PT0gJ3RvcCcgfHwgb3JpZW50ID09PSAnYm90dG9tJykge1xuICAgIGlmIChhbmdsZSA8PSA0NSB8fCAzMTUgPD0gYW5nbGUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG9yaWVudCA9PT0gJ3RvcCcgPyAnYm90dG9tJyA6ICd0b3AnfTtcbiAgICB9IGVsc2UgaWYgKDEzNSA8PSBhbmdsZSAmJiBhbmdsZSA8PSAyMjUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG9yaWVudCA9PT0gJ3RvcCcgPyAndG9wJzogJ2JvdHRvbSd9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiAnbWlkZGxlJ307XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICgoYW5nbGUgPD0gNDUgfHwgMzE1IDw9IGFuZ2xlKSB8fCAoMTM1IDw9IGFuZ2xlICYmIGFuZ2xlIDw9IDIyNSkpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6ICdtaWRkbGUnfTtcbiAgICB9IGVsc2UgaWYgKDQ1IDw9IGFuZ2xlICYmIGFuZ2xlIDw9IDEzNSkge1xuICAgICAgcmV0dXJuIHt2YWx1ZTogb3JpZW50ID09PSAnbGVmdCcgPyAndG9wJyA6ICdib3R0b20nfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt2YWx1ZTogb3JpZW50ID09PSAnbGVmdCcgPyAnYm90dG9tJyA6ICd0b3AnfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsQW5nbGUoYXhpczogQXhpcywgY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pIHtcbiAgaWYgKGF4aXMubGFiZWxBbmdsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTWFrZSBhbmdsZSB3aXRoaW4gWzAsMzYwKVxuICAgIHJldHVybiAoKGF4aXMubGFiZWxBbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICB9IGVsc2Uge1xuICAgIGlmIChjaGFubmVsID09PSBYICYmIGNvbnRhaW5zKFtOT01JTkFMLCBPUkRJTkFMXSwgZmllbGREZWYudHlwZSkpIHtcbiAgICAgIHJldHVybiAyNzA7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbEFsaWduKGFuZ2xlOiBudW1iZXIsIG9yaWVudDogQXhpc09yaWVudCk6IEhvcml6b250YWxBbGlnbiB7XG4gIGFuZ2xlID0gKChhbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICBpZiAob3JpZW50ID09PSAndG9wJyB8fCBvcmllbnQgPT09ICdib3R0b20nKSB7XG4gICAgaWYgKGFuZ2xlICUgMTgwID09PSAwKSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSBlbHNlIGlmICgwIDwgYW5nbGUgJiYgYW5nbGUgPCAxODApIHtcbiAgICAgIHJldHVybiBvcmllbnQgPT09ICd0b3AnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ3RvcCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoKGFuZ2xlICsgOTApICUgMTgwID09PSAwKSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSBlbHNlIGlmICg5MCA8PSBhbmdsZSAmJiBhbmdsZSA8IDI3MCkge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ2xlZnQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ2xlZnQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICB9XG4gIH1cbn1cblxuIl19 \ No newline at end of file diff --git a/build/src/compile/axis/parse.d.ts b/build/src/compile/axis/parse.d.ts new file mode 100644 index 0000000000..93f43ddbcb --- /dev/null +++ b/build/src/compile/axis/parse.d.ts @@ -0,0 +1,5 @@ +import { LayerModel } from '../layer'; +import { UnitModel } from '../unit'; +import { AxisComponentIndex } from './component'; +export declare function parseUnitAxis(model: UnitModel): AxisComponentIndex; +export declare function parseLayerAxis(model: LayerModel): void; diff --git a/build/src/compile/axis/parse.js b/build/src/compile/axis/parse.js new file mode 100644 index 0000000000..3eeec19692 --- /dev/null +++ b/build/src/compile/axis/parse.js @@ -0,0 +1,261 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var axis_1 = require("../../axis"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var resolve_1 = require("../resolve"); +var split_1 = require("../split"); +var component_1 = require("./component"); +var config_1 = require("./config"); +var encode = tslib_1.__importStar(require("./encode")); +var properties = tslib_1.__importStar(require("./properties")); +function parseUnitAxis(model) { + return channel_1.POSITION_SCALE_CHANNELS.reduce(function (axis, channel) { + if (model.component.scales[channel] && model.axis(channel)) { + axis[channel] = [parseAxis(channel, model)]; + } + return axis; + }, {}); +} +exports.parseUnitAxis = parseUnitAxis; +var OPPOSITE_ORIENT = { + bottom: 'top', + top: 'bottom', + left: 'right', + right: 'left' +}; +function parseLayerAxis(model) { + var _a = model.component, axes = _a.axes, resolve = _a.resolve; + var axisCount = { top: 0, bottom: 0, right: 0, left: 0 }; + for (var _i = 0, _b = model.children; _i < _b.length; _i++) { + var child = _b[_i]; + child.parseAxisAndHeader(); + for (var _c = 0, _d = util_1.keys(child.component.axes); _c < _d.length; _c++) { + var channel = _d[_c]; + resolve.axis[channel] = resolve_1.parseGuideResolve(model.component.resolve, channel); + if (resolve.axis[channel] === 'shared') { + // If the resolve says shared (and has not been overridden) + // We will try to merge and see if there is a conflict + axes[channel] = mergeAxisComponents(axes[channel], child.component.axes[channel]); + if (!axes[channel]) { + // If merge returns nothing, there is a conflict so we cannot make the axis shared. + // Thus, mark axis as independent and remove the axis component. + resolve.axis[channel] = 'independent'; + delete axes[channel]; + } + } + } + } + // Move axes to layer's axis component and merge shared axes + for (var _e = 0, _f = [channel_1.X, channel_1.Y]; _e < _f.length; _e++) { + var channel = _f[_e]; + for (var _g = 0, _h = model.children; _g < _h.length; _g++) { + var child = _h[_g]; + if (!child.component.axes[channel]) { + // skip if the child does not have a particular axis + continue; + } + if (resolve.axis[channel] === 'independent') { + // If axes are independent, concat the axisComponent array. + axes[channel] = (axes[channel] || []).concat(child.component.axes[channel]); + // Automatically adjust orient + for (var _j = 0, _k = child.component.axes[channel]; _j < _k.length; _j++) { + var axisComponent = _k[_j]; + var _l = axisComponent.getWithExplicit('orient'), orient = _l.value, explicit = _l.explicit; + if (axisCount[orient] > 0 && !explicit) { + // Change axis orient if the number do not match + var oppositeOrient = OPPOSITE_ORIENT[orient]; + if (axisCount[orient] > axisCount[oppositeOrient]) { + axisComponent.set('orient', oppositeOrient, false); + } + } + axisCount[orient]++; + // TODO(https://github.com/vega/vega-lite/issues/2634): automaticaly add extra offset? + } + } + // After merging, make sure to remove axes from child + delete child.component.axes[channel]; + } + } +} +exports.parseLayerAxis = parseLayerAxis; +function mergeAxisComponents(mergedAxisCmpts, childAxisCmpts) { + if (mergedAxisCmpts) { + // FIXME: this is a bit wrong once we support multiple axes + if (mergedAxisCmpts.length !== childAxisCmpts.length) { + return undefined; // Cannot merge axis component with different number of axes. + } + var length_1 = mergedAxisCmpts.length; + for (var i = 0; i < length_1; i++) { + var merged = mergedAxisCmpts[i]; + var child = childAxisCmpts[i]; + if ((!!merged) !== (!!child)) { + return undefined; + } + else if (merged && child) { + var mergedOrient = merged.getWithExplicit('orient'); + var childOrient = child.getWithExplicit('orient'); + if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) { + // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.) + // Cannot merge due to inconsistent orient + return undefined; + } + else { + mergedAxisCmpts[i] = mergeAxisComponent(merged, child); + } + } + } + } + else { + // For first one, return a copy of the child + return childAxisCmpts.map(function (axisComponent) { return axisComponent.clone(); }); + } + return mergedAxisCmpts; +} +function mergeAxisComponent(merged, child) { + var _loop_1 = function (prop) { + var mergedValueWithExplicit = split_1.mergeValuesWithExplicit(merged.getWithExplicit(prop), child.getWithExplicit(prop), prop, 'axis', + // Tie breaker function + function (v1, v2) { + switch (prop) { + case 'title': + return common_1.mergeTitleComponent(v1, v2); + case 'gridScale': + return { + explicit: v1.explicit, + value: v1.value || v2.value + }; + } + return split_1.defaultTieBreaker(v1, v2, prop, 'axis'); + }); + merged.setWithExplicit(prop, mergedValueWithExplicit); + }; + for (var _i = 0, VG_AXIS_PROPERTIES_1 = axis_1.VG_AXIS_PROPERTIES; _i < VG_AXIS_PROPERTIES_1.length; _i++) { + var prop = VG_AXIS_PROPERTIES_1[_i]; + _loop_1(prop); + } + return merged; +} +function getFieldDefTitle(model, channel) { + var channel2 = channel === 'x' ? 'x2' : 'y2'; + var fieldDef = model.fieldDef(channel); + var fieldDef2 = model.fieldDef(channel2); + var title1 = fieldDef ? fieldDef.title : undefined; + var title2 = fieldDef2 ? fieldDef2.title : undefined; + if (title1 && title2) { + return common_1.mergeTitle(title1, title2); + } + else if (title1) { + return title1; + } + else if (title2) { + return title2; + } + else if (title1 !== undefined) { // falsy value to disable config + return title1; + } + else if (title2 !== undefined) { // falsy value to disable config + return title2; + } + return undefined; +} +function parseAxis(channel, model) { + var axis = model.axis(channel); + var axisComponent = new component_1.AxisComponent(); + // 1.2. Add properties + axis_1.VG_AXIS_PROPERTIES.forEach(function (property) { + var value = getProperty(property, axis, channel, model); + if (value !== undefined) { + var explicit = + // specified axis.values is already respected, but may get transformed. + property === 'values' ? !!axis.values : + // both VL axis.encoding and axis.labelAngle affect VG axis.encode + property === 'encode' ? !!axis.encoding || !!axis.labelAngle : + // title can be explicit if fieldDef.title is set + property === 'title' && value === getFieldDefTitle(model, channel) ? true : + // Otherwise, things are explicit if the returned value matches the specified property + value === axis[property]; + var configValue = config_1.getAxisConfig(property, model.config, channel, axisComponent.get('orient'), model.getScaleComponent(channel).get('type')); + // only set property if it is explicitly set or has no config value (otherwise we will accidentally override config) + if (explicit || configValue === undefined) { + // Do not apply implicit rule if there is a config value + axisComponent.set(property, value, explicit); + } + else if (property === 'grid' && configValue) { + // Grid is an exception because we need to set grid = true to generate another grid axis + axisComponent.set(property, configValue, false); + } + } + }); + // 2) Add guide encode definition groups + var axisEncoding = axis.encoding || {}; + var axisEncode = axis_1.AXIS_PARTS.reduce(function (e, part) { + if (!axisComponent.hasAxisPart(part)) { + // No need to create encode for a disabled part. + return e; + } + var axisEncodingPart = common_1.guideEncodeEntry(axisEncoding[part] || {}, model); + var value = part === 'labels' ? + encode.labels(model, channel, axisEncodingPart, axisComponent.get('orient')) : + axisEncodingPart; + if (value !== undefined && util_1.keys(value).length > 0) { + e[part] = { update: value }; + } + return e; + }, {}); + // FIXME: By having encode as one property, we won't have fine grained encode merging. + if (util_1.keys(axisEncode).length > 0) { + axisComponent.set('encode', axisEncode, !!axis.encoding || axis.labelAngle !== undefined); + } + return axisComponent; +} +function getProperty(property, specifiedAxis, channel, model) { + var fieldDef = model.fieldDef(channel); + switch (property) { + case 'scale': + return model.scaleName(channel); + case 'gridScale': + return properties.gridScale(model, channel); + case 'format': + // We don't include temporal field here as we apply format in encode block + return common_1.numberFormat(fieldDef, specifiedAxis.format, model.config); + case 'grid': { + var scaleType = model.getScaleComponent(channel).get('type'); + return common_1.getSpecifiedOrDefaultValue(specifiedAxis.grid, properties.grid(scaleType, fieldDef)); + } + case 'labelFlush': + return properties.labelFlush(fieldDef, channel, specifiedAxis); + case 'labelOverlap': { + var scaleType = model.getScaleComponent(channel).get('type'); + return properties.labelOverlap(fieldDef, specifiedAxis, channel, scaleType); + } + case 'orient': + return common_1.getSpecifiedOrDefaultValue(specifiedAxis.orient, properties.orient(channel)); + case 'tickCount': { + var scaleType = model.getScaleComponent(channel).get('type'); + var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined; + var size = sizeType ? model.getSizeSignalRef(sizeType) + : undefined; + return common_1.getSpecifiedOrDefaultValue(specifiedAxis.tickCount, properties.tickCount(channel, fieldDef, scaleType, size)); + } + case 'title': + var channel2 = channel === 'x' ? 'x2' : 'y2'; + var fieldDef2 = model.fieldDef(channel2); + // Keep undefined so we use default if title is unspecified. + // For other falsy value, keep them so we will hide the title. + var fieldDefTitle = getFieldDefTitle(model, channel); + var specifiedTitle = fieldDefTitle !== undefined ? fieldDefTitle : + specifiedAxis.title === undefined ? undefined : specifiedAxis.title; + return common_1.getSpecifiedOrDefaultValue(specifiedTitle, + // If title not specified, store base parts of fieldDef (and fieldDef2 if exists) + common_1.mergeTitleFieldDefs([fielddef_1.toFieldDefBase(fieldDef)], fieldDef2 ? [fielddef_1.toFieldDefBase(fieldDef2)] : [])); + case 'values': + return properties.values(specifiedAxis, model, fieldDef, channel); + } + // Otherwise, return specified property. + return axis_1.isAxisProperty(property) ? specifiedAxis[property] : undefined; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUE4RjtBQUM5Rix5Q0FBa0Y7QUFDbEYsMkNBQTREO0FBQzVELG1DQUFnQztBQUVoQyxvQ0FBMkk7QUFFM0ksc0NBQTZDO0FBQzdDLGtDQUE4RTtBQUU5RSx5Q0FBa0Y7QUFDbEYsbUNBQXVDO0FBQ3ZDLHVEQUFtQztBQUNuQywrREFBMkM7QUFHM0MsdUJBQThCLEtBQWdCO0lBQzVDLE9BQU8saUNBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVMsSUFBSSxFQUFFLE9BQU87UUFDMUQsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUM3QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQXdCLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBUEQsc0NBT0M7QUFFRCxJQUFNLGVBQWUsR0FBb0M7SUFDdkQsTUFBTSxFQUFFLEtBQUs7SUFDYixHQUFHLEVBQUUsUUFBUTtJQUNiLElBQUksRUFBRSxPQUFPO0lBQ2IsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDO0FBRUYsd0JBQStCLEtBQWlCO0lBQ3hDLElBQUEsb0JBQWlDLEVBQWhDLGNBQUksRUFBRSxvQkFBTyxDQUFvQjtJQUN4QyxJQUFNLFNBQVMsR0FHWCxFQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUUzQyxLQUFvQixVQUFjLEVBQWQsS0FBQSxL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QUFDLENBQUMsQ0FBQyxDQUFDLHlCQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM3QyxDQUNGLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDckU7SUFDRCx3Q0FBd0M7SUFDeEMsT0FBTyxxQkFBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBeGlzLCBBWElTX1BBUlRTLCBBeGlzRW5jb2RpbmcsIGlzQXhpc1Byb3BlcnR5LCBWR19BWElTX1BST1BFUlRJRVN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUywgUG9zaXRpb25TY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtGaWVsZERlZkJhc2UsIHRvRmllbGREZWZCYXNlfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtBeGlzT3JpZW50LCBWZ0F4aXMsIFZnQXhpc0VuY29kZX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZSwgZ3VpZGVFbmNvZGVFbnRyeSwgbWVyZ2VUaXRsZSwgbWVyZ2VUaXRsZUNvbXBvbmVudCwgbWVyZ2VUaXRsZUZpZWxkRGVmcywgbnVtYmVyRm9ybWF0fSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtMYXllck1vZGVsfSBmcm9tICcuLi9sYXllcic7XG5pbXBvcnQge3BhcnNlR3VpZGVSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7ZGVmYXVsdFRpZUJyZWFrZXIsIEV4cGxpY2l0LCBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtBeGlzQ29tcG9uZW50LCBBeGlzQ29tcG9uZW50SW5kZXgsIEF4aXNDb21wb25lbnRQcm9wc30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtnZXRBeGlzQ29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBlbmNvZGUgZnJvbSAnLi9lbmNvZGUnO1xuaW1wb3J0ICogYXMgcHJvcGVydGllcyBmcm9tICcuL3Byb3BlcnRpZXMnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRBeGlzKG1vZGVsOiBVbml0TW9kZWwpOiBBeGlzQ29tcG9uZW50SW5kZXgge1xuICByZXR1cm4gUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMucmVkdWNlKGZ1bmN0aW9uKGF4aXMsIGNoYW5uZWwpIHtcbiAgICBpZiAobW9kZWwuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXSAmJiBtb2RlbC5heGlzKGNoYW5uZWwpKSB7XG4gICAgICBheGlzW2NoYW5uZWxdID0gW3BhcnNlQXhpcyhjaGFubmVsLCBtb2RlbCldO1xuICAgIH1cbiAgICByZXR1cm4gYXhpcztcbiAgfSwge30gYXMgQXhpc0NvbXBvbmVudEluZGV4KTtcbn1cblxuY29uc3QgT1BQT1NJVEVfT1JJRU5UOiB7W0sgaW4gQXhpc09yaWVudF06IEF4aXNPcmllbnR9ID0ge1xuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nLFxuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllckF4aXMobW9kZWw6IExheWVyTW9kZWwpIHtcbiAgY29uc3Qge2F4ZXMsIHJlc29sdmV9ID0gbW9kZWwuY29tcG9uZW50O1xuICBjb25zdCBheGlzQ291bnQ6IHtcbiAgICAvLyBVc2luZyBNYXBwZWQgVHlwZSB0byBkZWNsYXJlIHR5cGUgKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2FkdmFuY2VkLXR5cGVzLmh0bWwjbWFwcGVkLXR5cGVzKVxuICAgIFtrIGluIEF4aXNPcmllbnRdOiBudW1iZXJcbiAgfSA9IHt0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAsIGxlZnQ6IDB9O1xuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICBjaGlsZC5wYXJzZUF4aXNBbmRIZWFkZXIoKTtcblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBrZXlzKGNoaWxkLmNvbXBvbmVudC5heGVzKSkge1xuICAgICAgcmVzb2x2ZS5heGlzW2NoYW5uZWxdID0gcGFyc2VHdWlkZVJlc29sdmUobW9kZWwuY29tcG9uZW50LnJlc29sdmUsIGNoYW5uZWwpO1xuICAgICAgaWYgKHJlc29sdmUuYXhpc1tjaGFubmVsXSA9PT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlc29sdmUgc2F5cyBzaGFyZWQgKGFuZCBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbilcbiAgICAgICAgLy8gV2Ugd2lsbCB0cnkgdG8gbWVyZ2UgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0XG5cbiAgICAgICAgYXhlc1tjaGFubmVsXSA9IG1lcmdlQXhpc0NvbXBvbmVudHMoYXhlc1tjaGFubmVsXSwgY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF0pO1xuXG4gICAgICAgIGlmICghYXhlc1tjaGFubmVsXSkge1xuICAgICAgICAgIC8vIElmIG1lcmdlIHJldHVybnMgbm90aGluZywgdGhlcmUgaXMgYSBjb25mbGljdCBzbyB3ZSBjYW5ub3QgbWFrZSB0aGUgYXhpcyBzaGFyZWQuXG4gICAgICAgICAgLy8gVGh1cywgbWFyayBheGlzIGFzIGluZGVwZW5kZW50IGFuZCByZW1vdmUgdGhlIGF4aXMgY29tcG9uZW50LlxuICAgICAgICAgIHJlc29sdmUuYXhpc1tjaGFubmVsXSA9ICdpbmRlcGVuZGVudCc7XG4gICAgICAgICAgZGVsZXRlIGF4ZXNbY2hhbm5lbF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBNb3ZlIGF4ZXMgdG8gbGF5ZXIncyBheGlzIGNvbXBvbmVudCBhbmQgbWVyZ2Ugc2hhcmVkIGF4ZXNcbiAgZm9yIChjb25zdCBjaGFubmVsIG9mIFtYLCBZXSkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF0pIHtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgY2hpbGQgZG9lcyBub3QgaGF2ZSBhIHBhcnRpY3VsYXIgYXhpc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmUuYXhpc1tjaGFubmVsXSA9PT0gJ2luZGVwZW5kZW50Jykge1xuICAgICAgICAvLyBJZiBheGVzIGFyZSBpbmRlcGVuZGVudCwgY29uY2F0IHRoZSBheGlzQ29tcG9uZW50IGFycmF5LlxuICAgICAgICBheGVzW2NoYW5uZWxdID0gKGF4ZXNbY2hhbm5lbF0gfHwgW10pLmNvbmNhdChjaGlsZC5jb21wb25lbnQuYXhlc1tjaGFubmVsXSk7XG5cbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBhZGp1c3Qgb3JpZW50XG4gICAgICAgIGZvciAoY29uc3QgYXhpc0NvbXBvbmVudCBvZiBjaGlsZC5jb21wb25lbnQuYXhlc1tjaGFubmVsXSkge1xuICAgICAgICAgIGNvbnN0IHt2YWx1ZTogb3JpZW50LCBleHBsaWNpdH0gPSBheGlzQ29tcG9uZW50LmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG4gICAgICAgICAgaWYgKGF4aXNDb3VudFtvcmllbnRdID4gMCAmJiAhZXhwbGljaXQpIHtcbiAgICAgICAgICAgIC8vIENoYW5nZSBheGlzIG9yaWVudCBpZiB0aGUgbnVtYmVyIGRvIG5vdCBtYXRjaFxuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVPcmllbnQgPSBPUFBPU0lURV9PUklFTlRbb3JpZW50XTtcbiAgICAgICAgICAgIGlmIChheGlzQ291bnRbb3JpZW50XSA+IGF4aXNDb3VudFtvcHBvc2l0ZU9yaWVudF0pIHtcbiAgICAgICAgICAgICAgYXhpc0NvbXBvbmVudC5zZXQoJ29yaWVudCcsIG9wcG9zaXRlT3JpZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF4aXNDb3VudFtvcmllbnRdKys7XG5cbiAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjYzNCk6IGF1dG9tYXRpY2FseSBhZGQgZXh0cmEgb2Zmc2V0P1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIG1lcmdpbmcsIG1ha2Ugc3VyZSB0byByZW1vdmUgYXhlcyBmcm9tIGNoaWxkXG4gICAgICBkZWxldGUgY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlQXhpc0NvbXBvbmVudHMobWVyZ2VkQXhpc0NtcHRzOiBBeGlzQ29tcG9uZW50W10sIGNoaWxkQXhpc0NtcHRzOiBBeGlzQ29tcG9uZW50W10pOiBBeGlzQ29tcG9uZW50W10ge1xuICBpZiAobWVyZ2VkQXhpc0NtcHRzKSB7XG4gICAgLy8gRklYTUU6IHRoaXMgaXMgYSBiaXQgd3Jvbmcgb25jZSB3ZSBzdXBwb3J0IG11bHRpcGxlIGF4ZXNcbiAgICBpZiAobWVyZ2VkQXhpc0NtcHRzLmxlbmd0aCAhPT0gY2hpbGRBeGlzQ21wdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBDYW5ub3QgbWVyZ2UgYXhpcyBjb21wb25lbnQgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIGF4ZXMuXG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IG1lcmdlZEF4aXNDbXB0cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGggOyBpKyspIHtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlZEF4aXNDbXB0c1tpXTtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRBeGlzQ21wdHNbaV07XG5cbiAgICAgIGlmICgoISFtZXJnZWQpICE9PSAoISFjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VkICYmIGNoaWxkKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9yaWVudCA9IG1lcmdlZC5nZXRXaXRoRXhwbGljaXQoJ29yaWVudCcpO1xuICAgICAgICBjb25zdCBjaGlsZE9yaWVudCA9IGNoaWxkLmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG5cbiAgICAgICAgaWYgKG1lcmdlZE9yaWVudC5leHBsaWNpdCAmJiBjaGlsZE9yaWVudC5leHBsaWNpdCAmJiBtZXJnZWRPcmllbnQudmFsdWUgIT09IGNoaWxkT3JpZW50LnZhbHVlKSB7XG4gICAgICAgICAgLy8gVE9ETzogdGhyb3cgd2FybmluZyBpZiByZXNvbHZlIGlzIGV4cGxpY2l0IChXZSBkb24ndCBoYXZlIGluZm8gYWJvdXQgZXhwbGljaXQvaW1wbGljaXQgcmVzb2x2ZSB5ZXQuKVxuXG4gICAgICAgICAgLy8gQ2Fubm90IG1lcmdlIGR1ZSB0byBpbmNvbnNpc3RlbnQgb3JpZW50XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXJnZWRBeGlzQ21wdHNbaV0gPSBtZXJnZUF4aXNDb21wb25lbnQobWVyZ2VkLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRm9yIGZpcnN0IG9uZSwgcmV0dXJuIGEgY29weSBvZiB0aGUgY2hpbGRcbiAgICByZXR1cm4gY2hpbGRBeGlzQ21wdHMubWFwKGF4aXNDb21wb25lbnQgPT4gYXhpc0NvbXBvbmVudC5jbG9uZSgpKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQXhpc0NtcHRzO1xufVxuXG5mdW5jdGlvbiBtZXJnZUF4aXNDb21wb25lbnQobWVyZ2VkOiBBeGlzQ29tcG9uZW50LCBjaGlsZDogQXhpc0NvbXBvbmVudCk6IEF4aXNDb21wb25lbnQge1xuICBmb3IgKGNvbnN0IHByb3Agb2YgVkdfQVhJU19QUk9QRVJUSUVTKSB7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQgPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ0F4aXMsIGFueT4oXG4gICAgICBtZXJnZWQuZ2V0V2l0aEV4cGxpY2l0KHByb3ApLFxuICAgICAgY2hpbGQuZ2V0V2l0aEV4cGxpY2l0KHByb3ApLFxuICAgICAgcHJvcCwgJ2F4aXMnLFxuXG4gICAgICAvLyBUaWUgYnJlYWtlciBmdW5jdGlvblxuICAgICAgKHYxOiBFeHBsaWNpdDxhbnk+LCB2MjogRXhwbGljaXQ8YW55PikgPT4ge1xuICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VUaXRsZUNvbXBvbmVudCh2MSwgdjIpO1xuICAgICAgICAgIGNhc2UgJ2dyaWRTY2FsZSc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBleHBsaWNpdDogdjEuZXhwbGljaXQsIC8vIGtlZXAgdGhlIG9sZCBleHBsaWNpdFxuICAgICAgICAgICAgICB2YWx1ZTogdjEudmFsdWUgfHwgdjIudmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRUaWVCcmVha2VyPFZnQXhpcywgYW55Pih2MSwgdjIsIHByb3AsICdheGlzJyk7XG4gICAgICB9XG4gICAgKTtcbiAgICBtZXJnZWQuc2V0V2l0aEV4cGxpY2l0KHByb3AsIG1lcmdlZFZhbHVlV2l0aEV4cGxpY2l0KTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBnZXRGaWVsZERlZlRpdGxlKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6ICd4JyB8ICd5Jykge1xuICBjb25zdCBjaGFubmVsMiA9IGNoYW5uZWwgPT09ICd4JyA/ICd4MicgOiAneTInO1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICBjb25zdCBmaWVsZERlZjIgPSBtb2RlbC5maWVsZERlZihjaGFubmVsMik7XG5cbiAgY29uc3QgdGl0bGUxID0gZmllbGREZWYgPyBmaWVsZERlZi50aXRsZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGl0bGUyID0gZmllbGREZWYyID8gZmllbGREZWYyLnRpdGxlIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0aXRsZTEgJiYgdGl0bGUyKSB7XG4gICAgcmV0dXJuIG1lcmdlVGl0bGUodGl0bGUxLCB0aXRsZTIpO1xuICB9IGVsc2UgaWYgKHRpdGxlMSkge1xuICAgIHJldHVybiB0aXRsZTE7XG4gIH0gZWxzZSBpZiAodGl0bGUyKSB7XG4gICAgcmV0dXJuIHRpdGxlMjtcbiAgfSBlbHNlIGlmICh0aXRsZTEgIT09IHVuZGVmaW5lZCkgeyAvLyBmYWxzeSB2YWx1ZSB0byBkaXNhYmxlIGNvbmZpZ1xuICAgIHJldHVybiB0aXRsZTE7XG4gIH0gZWxzZSBpZiAodGl0bGUyICE9PSB1bmRlZmluZWQpIHsgLy8gZmFsc3kgdmFsdWUgdG8gZGlzYWJsZSBjb25maWdcbiAgICByZXR1cm4gdGl0bGUyO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VBeGlzKGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBtb2RlbDogVW5pdE1vZGVsKTogQXhpc0NvbXBvbmVudCB7XG4gIGNvbnN0IGF4aXMgPSBtb2RlbC5heGlzKGNoYW5uZWwpO1xuXG4gIGNvbnN0IGF4aXNDb21wb25lbnQgPSBuZXcgQXhpc0NvbXBvbmVudCgpO1xuXG4gIC8vIDEuMi4gQWRkIHByb3BlcnRpZXNcbiAgVkdfQVhJU19QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5LCBheGlzLCBjaGFubmVsLCBtb2RlbCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGV4cGxpY2l0ID1cbiAgICAgICAgLy8gc3BlY2lmaWVkIGF4aXMudmFsdWVzIGlzIGFscmVhZHkgcmVzcGVjdGVkLCBidXQgbWF5IGdldCB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcHJvcGVydHkgPT09ICd2YWx1ZXMnID8gISFheGlzLnZhbHVlcyA6XG4gICAgICAgIC8vIGJvdGggVkwgYXhpcy5lbmNvZGluZyBhbmQgYXhpcy5sYWJlbEFuZ2xlIGFmZmVjdCBWRyBheGlzLmVuY29kZVxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2VuY29kZScgPyAhIWF4aXMuZW5jb2RpbmcgfHwgISFheGlzLmxhYmVsQW5nbGUgOlxuICAgICAgICAvLyB0aXRsZSBjYW4gYmUgZXhwbGljaXQgaWYgZmllbGREZWYudGl0bGUgaXMgc2V0XG4gICAgICAgICAgICBwcm9wZXJ0eSA9PT0gJ3RpdGxlJyAmJiB2YWx1ZSA9PT0gZ2V0RmllbGREZWZUaXRsZShtb2RlbCwgY2hhbm5lbCkgPyB0cnVlIDpcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGluZ3MgYXJlIGV4cGxpY2l0IGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAgICAgICAgdmFsdWUgPT09IGF4aXNbcHJvcGVydHldO1xuXG4gICAgICBjb25zdCBjb25maWdWYWx1ZSA9IGdldEF4aXNDb25maWcocHJvcGVydHksIG1vZGVsLmNvbmZpZywgY2hhbm5lbCwgYXhpc0NvbXBvbmVudC5nZXQoJ29yaWVudCcpLCBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKSk7XG5cbiAgICAgIC8vIG9ubHkgc2V0IHByb3BlcnR5IGlmIGl0IGlzIGV4cGxpY2l0bHkgc2V0IG9yIGhhcyBubyBjb25maWcgdmFsdWUgKG90aGVyd2lzZSB3ZSB3aWxsIGFjY2lkZW50YWxseSBvdmVycmlkZSBjb25maWcpXG4gICAgICBpZiAoZXhwbGljaXQgfHwgY29uZmlnVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBEbyBub3QgYXBwbHkgaW1wbGljaXQgcnVsZSBpZiB0aGVyZSBpcyBhIGNvbmZpZyB2YWx1ZVxuICAgICAgICBheGlzQ29tcG9uZW50LnNldChwcm9wZXJ0eSwgdmFsdWUsIGV4cGxpY2l0KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICdncmlkJyAmJiBjb25maWdWYWx1ZSkge1xuICAgICAgICAvLyBHcmlkIGlzIGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gc2V0IGdyaWQgPSB0cnVlIHRvIGdlbmVyYXRlIGFub3RoZXIgZ3JpZCBheGlzXG4gICAgICAgIGF4aXNDb21wb25lbnQuc2V0KHByb3BlcnR5LCBjb25maWdWYWx1ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gMikgQWRkIGd1aWRlIGVuY29kZSBkZWZpbml0aW9uIGdyb3Vwc1xuICBjb25zdCBheGlzRW5jb2RpbmcgPSBheGlzLmVuY29kaW5nIHx8IHt9O1xuICBjb25zdCBheGlzRW5jb2RlID0gQVhJU19QQVJUUy5yZWR1Y2UoKGU6IFZnQXhpc0VuY29kZSwgcGFydCkgPT4ge1xuICAgIGlmICghYXhpc0NvbXBvbmVudC5oYXNBeGlzUGFydChwYXJ0KSkge1xuICAgICAgLy8gTm8gbmVlZCB0byBjcmVhdGUgZW5jb2RlIGZvciBhIGRpc2FibGVkIHBhcnQuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlzRW5jb2RpbmdQYXJ0ID0gZ3VpZGVFbmNvZGVFbnRyeShheGlzRW5jb2RpbmdbcGFydF0gfHwge30sIG1vZGVsKTtcblxuICAgIGNvbnN0IHZhbHVlID0gcGFydCA9PT0gJ2xhYmVscycgP1xuICAgICAgZW5jb2RlLmxhYmVscyhtb2RlbCwgY2hhbm5lbCwgYXhpc0VuY29kaW5nUGFydCwgYXhpc0NvbXBvbmVudC5nZXQoJ29yaWVudCcpKSA6XG4gICAgICBheGlzRW5jb2RpbmdQYXJ0O1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZVtwYXJ0XSA9IHt1cGRhdGU6IHZhbHVlfTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH0sIHt9IGFzIFZnQXhpc0VuY29kZSk7XG5cbiAgLy8gRklYTUU6IEJ5IGhhdmluZyBlbmNvZGUgYXMgb25lIHByb3BlcnR5LCB3ZSB3b24ndCBoYXZlIGZpbmUgZ3JhaW5lZCBlbmNvZGUgbWVyZ2luZy5cbiAgaWYgKGtleXMoYXhpc0VuY29kZSkubGVuZ3RoID4gMCkge1xuICAgIGF4aXNDb21wb25lbnQuc2V0KCdlbmNvZGUnLCBheGlzRW5jb2RlLCAhIWF4aXMuZW5jb2RpbmcgfHwgYXhpcy5sYWJlbEFuZ2xlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcmV0dXJuIGF4aXNDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PEsgZXh0ZW5kcyBrZXlvZiBBeGlzQ29tcG9uZW50UHJvcHM+KHByb3BlcnR5OiBLLCBzcGVjaWZpZWRBeGlzOiBBeGlzLCBjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgbW9kZWw6IFVuaXRNb2RlbCk6IEF4aXNDb21wb25lbnRQcm9wc1tLXSB7XG4gIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCk7XG4gIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICdzY2FsZSc6XG4gICAgICByZXR1cm4gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuICAgIGNhc2UgJ2dyaWRTY2FsZSc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy5ncmlkU2NhbGUobW9kZWwsIGNoYW5uZWwpO1xuICAgIGNhc2UgJ2Zvcm1hdCc6XG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRlbXBvcmFsIGZpZWxkIGhlcmUgYXMgd2UgYXBwbHkgZm9ybWF0IGluIGVuY29kZSBibG9ja1xuICAgICAgcmV0dXJuIG51bWJlckZvcm1hdChmaWVsZERlZiwgc3BlY2lmaWVkQXhpcy5mb3JtYXQsIG1vZGVsLmNvbmZpZyk7XG4gICAgY2FzZSAnZ3JpZCc6IHtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuICAgICAgcmV0dXJuIGdldFNwZWNpZmllZE9yRGVmYXVsdFZhbHVlKHNwZWNpZmllZEF4aXMuZ3JpZCwgcHJvcGVydGllcy5ncmlkKHNjYWxlVHlwZSwgZmllbGREZWYpKTtcbiAgICB9XG4gICAgY2FzZSAnbGFiZWxGbHVzaCc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy5sYWJlbEZsdXNoKGZpZWxkRGVmLCBjaGFubmVsLCBzcGVjaWZpZWRBeGlzKTtcbiAgICBjYXNlICdsYWJlbE92ZXJsYXAnOiB7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmxhYmVsT3ZlcmxhcChmaWVsZERlZiwgc3BlY2lmaWVkQXhpcywgY2hhbm5lbCwgc2NhbGVUeXBlKTtcbiAgICB9XG4gICAgY2FzZSAnb3JpZW50JzpcbiAgICAgIHJldHVybiBnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZShzcGVjaWZpZWRBeGlzLm9yaWVudCwgcHJvcGVydGllcy5vcmllbnQoY2hhbm5lbCkpO1xuICAgIGNhc2UgJ3RpY2tDb3VudCc6IHtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuICAgICAgY29uc3Qgc2l6ZVR5cGUgPSBjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogY2hhbm5lbCA9PT0gJ3knID8gJ2hlaWdodCcgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaXplID0gc2l6ZVR5cGUgPyBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKHNpemVUeXBlKVxuICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGdldFNwZWNpZmllZE9yRGVmYXVsdFZhbHVlKHNwZWNpZmllZEF4aXMudGlja0NvdW50LCBwcm9wZXJ0aWVzLnRpY2tDb3VudChjaGFubmVsLCBmaWVsZERlZiwgc2NhbGVUeXBlLCBzaXplKSk7XG4gICAgfVxuICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgIGNvbnN0IGNoYW5uZWwyID0gY2hhbm5lbCA9PT0gJ3gnID8gJ3gyJyA6ICd5Mic7XG4gICAgICBjb25zdCBmaWVsZERlZjIgPSBtb2RlbC5maWVsZERlZihjaGFubmVsMik7XG4gICAgICAvLyBLZWVwIHVuZGVmaW5lZCBzbyB3ZSB1c2UgZGVmYXVsdCBpZiB0aXRsZSBpcyB1bnNwZWNpZmllZC5cbiAgICAgIC8vIEZvciBvdGhlciBmYWxzeSB2YWx1ZSwga2VlcCB0aGVtIHNvIHdlIHdpbGwgaGlkZSB0aGUgdGl0bGUuXG4gICAgICBjb25zdCBmaWVsZERlZlRpdGxlID0gZ2V0RmllbGREZWZUaXRsZShtb2RlbCwgY2hhbm5lbCk7XG4gICAgICBjb25zdCBzcGVjaWZpZWRUaXRsZSA9IGZpZWxkRGVmVGl0bGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkRGVmVGl0bGUgOlxuICAgICAgICBzcGVjaWZpZWRBeGlzLnRpdGxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzcGVjaWZpZWRBeGlzLnRpdGxlO1xuXG4gICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWU8c3RyaW5nIHwgRmllbGREZWZCYXNlPHN0cmluZz5bXT4oXG4gICAgICAgIHNwZWNpZmllZFRpdGxlLFxuICAgICAgICAvLyBJZiB0aXRsZSBub3Qgc3BlY2lmaWVkLCBzdG9yZSBiYXNlIHBhcnRzIG9mIGZpZWxkRGVmIChhbmQgZmllbGREZWYyIGlmIGV4aXN0cylcbiAgICAgICAgbWVyZ2VUaXRsZUZpZWxkRGVmcyhcbiAgICAgICAgICBbdG9GaWVsZERlZkJhc2UoZmllbGREZWYpXSxcbiAgICAgICAgICBmaWVsZERlZjIgPyBbdG9GaWVsZERlZkJhc2UoZmllbGREZWYyKV0gOiBbXVxuICAgICAgICApXG4gICAgICApO1xuICAgIGNhc2UgJ3ZhbHVlcyc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy52YWx1ZXMoc3BlY2lmaWVkQXhpcywgbW9kZWwsIGZpZWxkRGVmLCBjaGFubmVsKTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHJldHVybiBzcGVjaWZpZWQgcHJvcGVydHkuXG4gIHJldHVybiBpc0F4aXNQcm9wZXJ0eShwcm9wZXJ0eSkgPyBzcGVjaWZpZWRBeGlzW3Byb3BlcnR5XSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/axis/properties.d.ts b/build/src/compile/axis/properties.d.ts new file mode 100644 index 0000000000..9f094a04da --- /dev/null +++ b/build/src/compile/axis/properties.d.ts @@ -0,0 +1,26 @@ +import { Axis } from '../../axis'; +import { PositionScaleChannel } from '../../channel'; +import { Config } from '../../config'; +import { DateTime } from '../../datetime'; +import { FieldDef } from '../../fielddef'; +import { ScaleType } from '../../scale'; +import { VgSignalRef } from '../../vega.schema'; +import { UnitModel } from '../unit'; +/** + * Default rules for whether to show a grid should be shown for a channel. + * If `grid` is unspecified, the default value is `true` for ordinal scales that are not binned + */ +export declare function grid(scaleType: ScaleType, fieldDef: FieldDef): boolean; +export declare function gridScale(model: UnitModel, channel: PositionScaleChannel): string; +export declare function labelFlush(fieldDef: FieldDef, channel: PositionScaleChannel, specifiedAxis: Axis): number | boolean; +export declare function labelOverlap(fieldDef: FieldDef, specifiedAxis: Axis, channel: PositionScaleChannel, scaleType: ScaleType): boolean | "parity" | "greedy"; +export declare function orient(channel: PositionScaleChannel): "left" | "bottom"; +export declare function tickCount(channel: PositionScaleChannel, fieldDef: FieldDef, scaleType: ScaleType, size: VgSignalRef): { + signal: string; +}; +export declare function title(maxLength: number, fieldDef: FieldDef, config: Config): string; +export declare function values(specifiedAxis: Axis, model: UnitModel, fieldDef: FieldDef, channel: PositionScaleChannel): number[] | DateTime[] | { + signal: string; +}[] | { + signal: string; +}; diff --git a/build/src/compile/axis/properties.js b/build/src/compile/axis/properties.js new file mode 100644 index 0000000000..49cf7fbfc5 --- /dev/null +++ b/build/src/compile/axis/properties.js @@ -0,0 +1,101 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var bin_1 = require("../../bin"); +var channel_1 = require("../../channel"); +var datetime_1 = require("../../datetime"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +// TODO: we need to refactor this method after we take care of config refactoring +/** + * Default rules for whether to show a grid should be shown for a channel. + * If `grid` is unspecified, the default value is `true` for ordinal scales that are not binned + */ +function grid(scaleType, fieldDef) { + return !scale_1.hasDiscreteDomain(scaleType) && !fieldDef.bin; +} +exports.grid = grid; +function gridScale(model, channel) { + var gridChannel = channel === 'x' ? 'y' : 'x'; + if (model.getScaleComponent(gridChannel)) { + return model.scaleName(gridChannel); + } + return undefined; +} +exports.gridScale = gridScale; +function labelFlush(fieldDef, channel, specifiedAxis) { + if (specifiedAxis.labelFlush !== undefined) { + return specifiedAxis.labelFlush; + } + if (channel === 'x' && util_1.contains(['quantitative', 'temporal'], fieldDef.type)) { + return true; + } + return undefined; +} +exports.labelFlush = labelFlush; +function labelOverlap(fieldDef, specifiedAxis, channel, scaleType) { + if (specifiedAxis.labelOverlap !== undefined) { + return specifiedAxis.labelOverlap; + } + // do not prevent overlap for nominal data because there is no way to infer what the missing labels are + if (fieldDef.type !== 'nominal') { + if (scaleType === 'log') { + return 'greedy'; + } + return true; + } + return undefined; +} +exports.labelOverlap = labelOverlap; +function orient(channel) { + switch (channel) { + case channel_1.X: + return 'bottom'; + case channel_1.Y: + return 'left'; + } + /* istanbul ignore next: This should never happen. */ + throw new Error(log.message.INVALID_CHANNEL_FOR_AXIS); +} +exports.orient = orient; +function tickCount(channel, fieldDef, scaleType, size) { + if (!scale_1.hasDiscreteDomain(scaleType) && scaleType !== 'log' && !util_1.contains(['month', 'hours', 'day', 'quarter'], fieldDef.timeUnit)) { + if (fieldDef.bin) { + // for binned data, we don't want more ticks than maxbins + return { signal: "ceil(" + size.signal + "/20)" }; + } + return { signal: "ceil(" + size.signal + "/40)" }; + } + return undefined; +} +exports.tickCount = tickCount; +function title(maxLength, fieldDef, config) { + // if not defined, automatically determine axis title from field def + var fieldTitle = fielddef_1.title(fieldDef, config); + return maxLength ? vega_util_1.truncate(fieldTitle, maxLength) : fieldTitle; +} +exports.title = title; +function values(specifiedAxis, model, fieldDef, channel) { + var vals = specifiedAxis.values; + if (specifiedAxis.values && datetime_1.isDateTime(vals[0])) { + return vals.map(function (dt) { + // normalize = true as end user won't put 0 = January + return { signal: datetime_1.dateTimeExpr(dt, true) }; + }); + } + if (!vals && fieldDef.bin && fieldDef.type === type_1.QUANTITATIVE) { + var domain = model.scaleDomain(channel); + if (domain && domain !== 'unaggregated' && !scale_1.isSelectionDomain(domain)) { // explicit value + return vals; + } + var signal = model.getName(bin_1.binToString(fieldDef.bin) + "_" + fieldDef.field + "_bins"); + return { signal: "sequence(" + signal + ".start, " + signal + ".stop + " + signal + ".step, " + signal + ".step)" }; + } + return vals; +} +exports.values = values; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2F4aXMvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBbUM7QUFFbkMsaUNBQXNDO0FBQ3RDLHlDQUF5RDtBQUV6RCwyQ0FBa0U7QUFDbEUsMkNBQWdFO0FBQ2hFLHFEQUFpQztBQUNqQyxxQ0FBNEU7QUFDNUUsbUNBQXdDO0FBQ3hDLG1DQUFvQztBQUtwQyxpRkFBaUY7QUFDakY7OztHQUdHO0FBQ0gsY0FBcUIsU0FBb0IsRUFBRSxRQUEwQjtJQUNuRSxPQUFPLENBQUMseUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3hELENBQUM7QUFGRCxvQkFFQztBQUVELG1CQUEwQixLQUFnQixFQUFFLE9BQTZCO0lBQ3ZFLElBQU0sV0FBVyxHQUF5QixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN0RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUN4QyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDckM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBTkQsOEJBTUM7QUFFRCxvQkFBMkIsUUFBMEIsRUFBRSxPQUE2QixFQUFFLGFBQW1CO0lBQ3ZHLElBQUksYUFBYSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDMUMsT0FBTyxhQUFhLENBQUMsVUFBVSxDQUFDO0tBQ2pDO0lBQ0QsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLGVBQVEsQ0FBQyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDNUUsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUNELE9BQU8sU0FB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Q0FBQyxHQUFHLENBQUMsU0FBSSxRQUFRLENBQUMsS0FBSyxVQUFPLENBQUMsQ0FBQztRQUNwRixPQUFPLEVBQUMsTUFBTSxFQUFFLGNBQVksTUFBTSxnQkFBVyxNQUFNLGdCQUFXLE1BQU0sZUFBVSxNQUFNLFdBQVEsRUFBQyxDQUFDO0tBQy9GO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBbkJELHdCQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dHJ1bmNhdGV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0F4aXN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtiaW5Ub1N0cmluZ30gZnJvbSAnLi4vLi4vYmluJztcbmltcG9ydCB7UG9zaXRpb25TY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4uLy4uL2RhdGV0aW1lJztcbmltcG9ydCB7RmllbGREZWYsIHRpdGxlIGFzIGZpZWxkRGVmVGl0bGV9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtoYXNEaXNjcmV0ZURvbWFpbiwgaXNTZWxlY3Rpb25Eb21haW4sIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtRVUFOVElUQVRJVkV9IGZyb20gJy4uLy4uL3R5cGUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5cblxuLy8gVE9ETzogd2UgbmVlZCB0byByZWZhY3RvciB0aGlzIG1ldGhvZCBhZnRlciB3ZSB0YWtlIGNhcmUgb2YgY29uZmlnIHJlZmFjdG9yaW5nXG4vKipcbiAqIERlZmF1bHQgcnVsZXMgZm9yIHdoZXRoZXIgdG8gc2hvdyBhIGdyaWQgc2hvdWxkIGJlIHNob3duIGZvciBhIGNoYW5uZWwuXG4gKiBJZiBgZ3JpZGAgaXMgdW5zcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYCBmb3Igb3JkaW5hbCBzY2FsZXMgdGhhdCBhcmUgbm90IGJpbm5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JpZChzY2FsZVR5cGU6IFNjYWxlVHlwZSwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pIHtcbiAgcmV0dXJuICFoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpICYmICFmaWVsZERlZi5iaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmlkU2NhbGUobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogUG9zaXRpb25TY2FsZUNoYW5uZWwpIHtcbiAgY29uc3QgZ3JpZENoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICBpZiAobW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoZ3JpZENoYW5uZWwpKSB7XG4gICAgcmV0dXJuIG1vZGVsLnNjYWxlTmFtZShncmlkQ2hhbm5lbCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsRmx1c2goZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBzcGVjaWZpZWRBeGlzOiBBeGlzKSB7XG4gIGlmIChzcGVjaWZpZWRBeGlzLmxhYmVsRmx1c2ggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzcGVjaWZpZWRBeGlzLmxhYmVsRmx1c2g7XG4gIH1cbiAgaWYgKGNoYW5uZWwgPT09ICd4JyAmJiBjb250YWlucyhbJ3F1YW50aXRhdGl2ZScsICd0ZW1wb3JhbCddLCBmaWVsZERlZi50eXBlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbE92ZXJsYXAoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNwZWNpZmllZEF4aXM6IEF4aXMsIGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICBpZiAoc3BlY2lmaWVkQXhpcy5sYWJlbE92ZXJsYXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzcGVjaWZpZWRBeGlzLmxhYmVsT3ZlcmxhcDtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcmV2ZW50IG92ZXJsYXAgZm9yIG5vbWluYWwgZGF0YSBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBpbmZlciB3aGF0IHRoZSBtaXNzaW5nIGxhYmVscyBhcmVcbiAgaWYgKGZpZWxkRGVmLnR5cGUgIT09ICdub21pbmFsJykge1xuICAgIGlmIChzY2FsZVR5cGUgPT09ICdsb2cnKSB7XG4gICAgICByZXR1cm4gJ2dyZWVkeSc7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9yaWVudChjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCkge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlIFg6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSBZOlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqL1xuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuSU5WQUxJRF9DSEFOTkVMX0ZPUl9BWElTKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tDb3VudChjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNjYWxlVHlwZTogU2NhbGVUeXBlLCBzaXplOiBWZ1NpZ25hbFJlZikge1xuICBpZiAoIWhhc0Rpc2NyZXRlRG9tYWluKHNjYWxlVHlwZSkgJiYgc2NhbGVUeXBlICE9PSAnbG9nJyAmJiAhY29udGFpbnMoWydtb250aCcsICdob3VycycsICdkYXknLCAncXVhcnRlciddLCBmaWVsZERlZi50aW1lVW5pdCkpIHtcblxuICAgIGlmIChmaWVsZERlZi5iaW4pIHtcbiAgICAgIC8vIGZvciBiaW5uZWQgZGF0YSwgd2UgZG9uJ3Qgd2FudCBtb3JlIHRpY2tzIHRoYW4gbWF4Ymluc1xuICAgICAgcmV0dXJuIHtzaWduYWw6IGBjZWlsKCR7c2l6ZS5zaWduYWx9LzIwKWB9O1xuICAgIH1cbiAgICByZXR1cm4ge3NpZ25hbDogYGNlaWwoJHtzaXplLnNpZ25hbH0vNDApYH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGl0bGUobWF4TGVuZ3RoOiBudW1iZXIsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjb25maWc6IENvbmZpZykge1xuICAvLyBpZiBub3QgZGVmaW5lZCwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgYXhpcyB0aXRsZSBmcm9tIGZpZWxkIGRlZlxuICBjb25zdCBmaWVsZFRpdGxlID0gZmllbGREZWZUaXRsZShmaWVsZERlZiwgY29uZmlnKTtcbiAgcmV0dXJuIG1heExlbmd0aCA/IHRydW5jYXRlKGZpZWxkVGl0bGUsIG1heExlbmd0aCkgOiBmaWVsZFRpdGxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzKHNwZWNpZmllZEF4aXM6IEF4aXMsIG1vZGVsOiBVbml0TW9kZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCkge1xuICBjb25zdCB2YWxzID0gc3BlY2lmaWVkQXhpcy52YWx1ZXM7XG4gIGlmIChzcGVjaWZpZWRBeGlzLnZhbHVlcyAmJiBpc0RhdGVUaW1lKHZhbHNbMF0pKSB7XG4gICAgcmV0dXJuICh2YWxzIGFzIERhdGVUaW1lW10pLm1hcCgoZHQpID0+IHtcbiAgICAgIC8vIG5vcm1hbGl6ZSA9IHRydWUgYXMgZW5kIHVzZXIgd29uJ3QgcHV0IDAgPSBKYW51YXJ5XG4gICAgICByZXR1cm4ge3NpZ25hbDogZGF0ZVRpbWVFeHByKGR0LCB0cnVlKX07XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXZhbHMgJiYgZmllbGREZWYuYmluICYmIGZpZWxkRGVmLnR5cGUgPT09IFFVQU5USVRBVElWRSkge1xuICAgIGNvbnN0IGRvbWFpbiA9IG1vZGVsLnNjYWxlRG9tYWluKGNoYW5uZWwpO1xuICAgIGlmIChkb21haW4gJiYgZG9tYWluICE9PSAndW5hZ2dyZWdhdGVkJyAmJiAhaXNTZWxlY3Rpb25Eb21haW4oZG9tYWluKSkgeyAvLyBleHBsaWNpdCB2YWx1ZVxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hbCA9IG1vZGVsLmdldE5hbWUoYCR7YmluVG9TdHJpbmcoZmllbGREZWYuYmluKX1fJHtmaWVsZERlZi5maWVsZH1fYmluc2ApO1xuICAgIHJldHVybiB7c2lnbmFsOiBgc2VxdWVuY2UoJHtzaWduYWx9LnN0YXJ0LCAke3NpZ25hbH0uc3RvcCArICR7c2lnbmFsfS5zdGVwLCAke3NpZ25hbH0uc3RlcClgfTtcbiAgfVxuXG4gIHJldHVybiB2YWxzO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/baseconcat.d.ts b/build/src/compile/baseconcat.d.ts new file mode 100644 index 0000000000..e36ef8e669 --- /dev/null +++ b/build/src/compile/baseconcat.d.ts @@ -0,0 +1,18 @@ +import { Config } from '../config'; +import { Resolve } from '../resolve'; +import { BaseSpec } from '../spec'; +import { VgData, VgSignal } from '../vega.schema'; +import { Model } from './model'; +import { RepeaterValue } from './repeater'; +export declare abstract class BaseConcatModel extends Model { + constructor(spec: BaseSpec, parent: Model, parentGivenName: string, config: Config, repeater: RepeaterValue, resolve: Resolve); + parseData(): void; + parseSelection(): void; + parseMarkGroup(): void; + parseAxisAndHeader(): void; + assembleSelectionTopLevelSignals(signals: any[]): VgSignal[]; + assembleSelectionSignals(): VgSignal[]; + assembleLayoutSignals(): VgSignal[]; + assembleSelectionData(data: VgData[]): VgData[]; + assembleMarks(): any[]; +} diff --git a/build/src/compile/baseconcat.js b/build/src/compile/baseconcat.js new file mode 100644 index 0000000000..5e75c293d5 --- /dev/null +++ b/build/src/compile/baseconcat.js @@ -0,0 +1,80 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("../util"); +var parse_1 = require("./data/parse"); +var assemble_1 = require("./layoutsize/assemble"); +var model_1 = require("./model"); +var BaseConcatModel = /** @class */ (function (_super) { + tslib_1.__extends(BaseConcatModel, _super); + function BaseConcatModel(spec, parent, parentGivenName, config, repeater, resolve) { + return _super.call(this, spec, parent, parentGivenName, config, repeater, resolve) || this; + } + BaseConcatModel.prototype.parseData = function () { + this.component.data = parse_1.parseData(this); + this.children.forEach(function (child) { + child.parseData(); + }); + }; + BaseConcatModel.prototype.parseSelection = function () { + var _this = this; + // Merge selections up the hierarchy so that they may be referenced + // across unit specs. Persist their definitions within each child + // to assemble signals which remain within output Vega unit groups. + this.component.selection = {}; + var _loop_1 = function (child) { + child.parseSelection(); + util_1.keys(child.component.selection).forEach(function (key) { + _this.component.selection[key] = child.component.selection[key]; + }); + }; + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + }; + BaseConcatModel.prototype.parseMarkGroup = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseMarkGroup(); + } + }; + BaseConcatModel.prototype.parseAxisAndHeader = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseAxisAndHeader(); + } + // TODO(#2415): support shared axes + }; + BaseConcatModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals); + }; + BaseConcatModel.prototype.assembleSelectionSignals = function () { + this.children.forEach(function (child) { return child.assembleSelectionSignals(); }); + return []; + }; + BaseConcatModel.prototype.assembleLayoutSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleLayoutSignals()); + }, assemble_1.assembleLayoutSignals(this)); + }; + BaseConcatModel.prototype.assembleSelectionData = function (data) { + return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data); + }; + BaseConcatModel.prototype.assembleMarks = function () { + // only children have marks + return this.children.map(function (child) { + var title = child.assembleTitle(); + var style = child.assembleGroupStyle(); + var layoutSizeEncodeEntry = child.assembleLayoutSize(); + return tslib_1.__assign({ type: 'group', name: child.getName('group') }, (title ? { title: title } : {}), (style ? { style: style } : {}), (layoutSizeEncodeEntry ? { + encode: { + update: layoutSizeEncodeEntry + } + } : {}), child.assembleGroup()); + }); + }; + return BaseConcatModel; +}(model_1.Model)); +exports.BaseConcatModel = BaseConcatModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZWNvbmNhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2Jhc2Vjb25jYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsZ0NBQTZCO0FBRTdCLHNDQUF1QztBQUN2QyxrREFBNEQ7QUFDNUQsaUNBQThCO0FBRzlCO0lBQThDLDJDQUFLO0lBQ2pELHlCQUFZLElBQWMsRUFBRSxNQUFhLEVBQUUsZUFBdUIsRUFBRSxNQUFjLEVBQUUsUUFBdUIsRUFBRSxPQUFnQjtlQUMzSCxrQkFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUNqRSxDQUFDO0lBRU0sbUNBQVMsR0FBaEI7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxpQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSztZQUMxQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ00sd0NBQWMsR0FBckI7UUFBQSxpQkFXQztRQVZDLG1FQUFtRTtRQUNuRSxpRUFBaUU7UUFDakUsbUVBQW1FO1FBQ25FLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztnQ0FDbkIsS0FBSztZQUNkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixXQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO2dCQUMxQyxLQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFMRCxLQUFvQixVQUFhLEVBQWIsS0FBQSxJQUFJLENBQUMsUUFBUSxFQUFiLGNBQWEsRUFBYixJQUFhO1lBQTVCLElBQU0sS0FBSyxTQUFBO29CQUFMLEtBQUs7U0FLZjtJQUNILENBQUM7SUFFTSx3Q0FBYyxHQUFyQjtRQUNFLEtBQW9CLFVBQWEsRUFBYixLQUFBLElBQUksQ0FBQyxRQUFRLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtZQUE5QixJQUFNLEtBQUssU0FBQTtZQUNkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTSw0Q0FBa0IsR0FBekI7UUFDRSxLQUFvQixVQUFhLEVBQWIsS0FBQSxJQUFJLENBQUMsUUFBUSxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7WUFBOUIsSUFBTSxLQUFLLFNBQUE7WUFDZCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM1QjtRQUVELG1DQUFtQztJQUNyQyxDQUFDO0lBRU0sMERBQWdDLEdBQXZDLFVBQXdDLE9BQWM7UUFDcEQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEVBQUUsRUFBRSxLQUFLLElBQUssT0FBQSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLEVBQTFDLENBQTBDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVNLGtEQUF3QixHQUEvQjtRQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSyxJQUFLLE9BQUEsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEVBQWhDLENBQWdDLENBQUMsQ0FBQztRQUNuRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFTSwrQ0FBcUIsR0FBNUI7UUFDRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUMsT0FBTyxFQUFFLEtBQUs7WUFDekMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxFQUFFLGdDQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLCtDQUFxQixHQUE1QixVQUE2QixJQUFjO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQyxFQUFFLEVBQUUsS0FBSyxJQUFLLE9BQUEsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUEvQixDQUErQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BGLENBQUM7SUFFTSx1Q0FBYSxHQUFwQjtRQUNFLDJCQUEyQjtRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsS0FBSztZQUM1QixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDcEMsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDekMsSUFBTSxxQkFBcUIsR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN6RCwwQkFDRSxJQUFJLEVBQUUsT0FBTyxFQUNiLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUN6QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLE9BQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxPQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3RCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLEVBQUU7b0JBQ04sTUFBTSxFQUFFLHFCQUFxQjtpQkFDOUI7YUFDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDSixLQUFLLENBQUMsYUFBYSxFQUFFLEVBQ3hCO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0gsc0JBQUM7QUFBRCxDQUFDLEFBN0VELENBQThDLGFBQUssR0E2RWxEO0FBN0VxQiwwQ0FBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHtSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7QmFzZVNwZWN9IGZyb20gJy4uL3NwZWMnO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7VmdEYXRhLCBWZ1NpZ25hbH0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZURhdGF9IGZyb20gJy4vZGF0YS9wYXJzZSc7XG5pbXBvcnQge2Fzc2VtYmxlTGF5b3V0U2lnbmFsc30gZnJvbSAnLi9sYXlvdXRzaXplL2Fzc2VtYmxlJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtSZXBlYXRlclZhbHVlfSBmcm9tICcuL3JlcGVhdGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VDb25jYXRNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgY29uc3RydWN0b3Ioc3BlYzogQmFzZVNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLCBjb25maWc6IENvbmZpZywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIHJlc29sdmU6IFJlc29sdmUpIHtcbiAgICBzdXBlcihzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgY29uZmlnLCByZXBlYXRlciwgcmVzb2x2ZSk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VEYXRhKCkge1xuICAgIHRoaXMuY29tcG9uZW50LmRhdGEgPSBwYXJzZURhdGEodGhpcyk7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgY2hpbGQucGFyc2VEYXRhKCk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIHBhcnNlU2VsZWN0aW9uKCkge1xuICAgIC8vIE1lcmdlIHNlbGVjdGlvbnMgdXAgdGhlIGhpZXJhcmNoeSBzbyB0aGF0IHRoZXkgbWF5IGJlIHJlZmVyZW5jZWRcbiAgICAvLyBhY3Jvc3MgdW5pdCBzcGVjcy4gUGVyc2lzdCB0aGVpciBkZWZpbml0aW9ucyB3aXRoaW4gZWFjaCBjaGlsZFxuICAgIC8vIHRvIGFzc2VtYmxlIHNpZ25hbHMgd2hpY2ggcmVtYWluIHdpdGhpbiBvdXRwdXQgVmVnYSB1bml0IGdyb3Vwcy5cbiAgICB0aGlzLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnBhcnNlU2VsZWN0aW9uKCk7XG4gICAgICBrZXlzKGNoaWxkLmNvbXBvbmVudC5zZWxlY3Rpb24pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5zZWxlY3Rpb25ba2V5XSA9IGNoaWxkLmNvbXBvbmVudC5zZWxlY3Rpb25ba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZU1hcmtHcm91cCgpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnBhcnNlTWFya0dyb3VwKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhcnNlQXhpc0FuZEhlYWRlcigpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkLnBhcnNlQXhpc0FuZEhlYWRlcigpO1xuICAgIH1cblxuICAgIC8vIFRPRE8oIzI0MTUpOiBzdXBwb3J0IHNoYXJlZCBheGVzXG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNnLCBjaGlsZCkgPT4gY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2cpLCBzaWduYWxzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvblNpZ25hbHMoKTogVmdTaWduYWxbXSB7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4gY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCkpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxheW91dFNpZ25hbHMoKTogVmdTaWduYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChzaWduYWxzLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIHNpZ25hbHMuY29uY2F0KGNoaWxkLmFzc2VtYmxlTGF5b3V0U2lnbmFscygpKTtcbiAgICB9LCBhc3NlbWJsZUxheW91dFNpZ25hbHModGhpcykpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uRGF0YShkYXRhOiBWZ0RhdGFbXSk6IFZnRGF0YVtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKGRiLCBjaGlsZCkgPT4gY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRiKSwgZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVNYXJrcygpOiBhbnlbXSB7XG4gICAgLy8gb25seSBjaGlsZHJlbiBoYXZlIG1hcmtzXG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgIGNvbnN0IHRpdGxlID0gY2hpbGQuYXNzZW1ibGVUaXRsZSgpO1xuICAgICAgY29uc3Qgc3R5bGUgPSBjaGlsZC5hc3NlbWJsZUdyb3VwU3R5bGUoKTtcbiAgICAgIGNvbnN0IGxheW91dFNpemVFbmNvZGVFbnRyeSA9IGNoaWxkLmFzc2VtYmxlTGF5b3V0U2l6ZSgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2dyb3VwJyxcbiAgICAgICAgbmFtZTogY2hpbGQuZ2V0TmFtZSgnZ3JvdXAnKSxcbiAgICAgICAgLi4uKHRpdGxlID8ge3RpdGxlfSA6IHt9KSxcbiAgICAgICAgLi4uKHN0eWxlID8ge3N0eWxlfSA6IHt9KSxcbiAgICAgICAgLi4uKGxheW91dFNpemVFbmNvZGVFbnRyeSA/IHtcbiAgICAgICAgICBlbmNvZGU6IHtcbiAgICAgICAgICAgIHVwZGF0ZTogbGF5b3V0U2l6ZUVuY29kZUVudHJ5XG4gICAgICAgICAgfVxuICAgICAgICB9IDoge30pLFxuICAgICAgICAuLi5jaGlsZC5hc3NlbWJsZUdyb3VwKClcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/buildmodel.d.ts b/build/src/compile/buildmodel.d.ts new file mode 100644 index 0000000000..3ee1a1ffd4 --- /dev/null +++ b/build/src/compile/buildmodel.d.ts @@ -0,0 +1,5 @@ +import { Config } from '../config'; +import { LayoutSizeMixins, NormalizedSpec } from '../spec'; +import { Model } from './model'; +import { RepeaterValue } from './repeater'; +export declare function buildModel(spec: NormalizedSpec, parent: Model, parentGivenName: string, unitSize: LayoutSizeMixins, repeater: RepeaterValue, config: Config, fit: boolean): Model; diff --git a/build/src/compile/buildmodel.js b/build/src/compile/buildmodel.js new file mode 100644 index 0000000000..ad452c7a3e --- /dev/null +++ b/build/src/compile/buildmodel.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../log")); +var spec_1 = require("../spec"); +var concat_1 = require("./concat"); +var facet_1 = require("./facet"); +var layer_1 = require("./layer"); +var repeat_1 = require("./repeat"); +var unit_1 = require("./unit"); +function buildModel(spec, parent, parentGivenName, unitSize, repeater, config, fit) { + if (spec_1.isFacetSpec(spec)) { + return new facet_1.FacetModel(spec, parent, parentGivenName, repeater, config); + } + if (spec_1.isLayerSpec(spec)) { + return new layer_1.LayerModel(spec, parent, parentGivenName, unitSize, repeater, config, fit); + } + if (spec_1.isUnitSpec(spec)) { + return new unit_1.UnitModel(spec, parent, parentGivenName, unitSize, repeater, config, fit); + } + if (spec_1.isRepeatSpec(spec)) { + return new repeat_1.RepeatModel(spec, parent, parentGivenName, repeater, config); + } + if (spec_1.isConcatSpec(spec)) { + return new concat_1.ConcatModel(spec, parent, parentGivenName, repeater, config); + } + throw new Error(log.message.INVALID_SPEC); +} +exports.buildModel = buildModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRtb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2J1aWxkbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esa0RBQThCO0FBQzlCLGdDQUEySDtBQUMzSCxtQ0FBcUM7QUFDckMsaUNBQW1DO0FBQ25DLGlDQUFtQztBQUVuQyxtQ0FBcUM7QUFFckMsK0JBQWlDO0FBRWpDLG9CQUEyQixJQUFvQixFQUFFLE1BQWEsRUFBRSxlQUF1QixFQUNyRixRQUEwQixFQUFFLFFBQXVCLEVBQUUsTUFBYyxFQUFFLEdBQVk7SUFDakYsSUFBSSxrQkFBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sSUFBSSxrQkFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUN4RTtJQUVELElBQUksa0JBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixPQUFPLElBQUksa0JBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN2RjtJQUVELElBQUksaUJBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNwQixPQUFPLElBQUksZ0JBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN0RjtJQUVELElBQUksbUJBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixPQUFPLElBQUksb0JBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDekU7SUFFRCxJQUFJLG1CQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxJQUFJLG9CQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3pFO0lBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUF2QkQsZ0NBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7aXNDb25jYXRTcGVjLCBpc0ZhY2V0U3BlYywgaXNMYXllclNwZWMsIGlzUmVwZWF0U3BlYywgaXNVbml0U3BlYywgTGF5b3V0U2l6ZU1peGlucywgTm9ybWFsaXplZFNwZWN9IGZyb20gJy4uL3NwZWMnO1xuaW1wb3J0IHtDb25jYXRNb2RlbH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtGYWNldE1vZGVsfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7TGF5ZXJNb2RlbH0gZnJvbSAnLi9sYXllcic7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0TW9kZWx9IGZyb20gJy4vcmVwZWF0JztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi91bml0JztcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTW9kZWwoc3BlYzogTm9ybWFsaXplZFNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLFxuICB1bml0U2l6ZTogTGF5b3V0U2l6ZU1peGlucywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnLCBmaXQ6IGJvb2xlYW4pOiBNb2RlbCB7XG4gIGlmIChpc0ZhY2V0U3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBuZXcgRmFjZXRNb2RlbChzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgcmVwZWF0ZXIsIGNvbmZpZyk7XG4gIH1cblxuICBpZiAoaXNMYXllclNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbmV3IExheWVyTW9kZWwoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIHVuaXRTaXplLCByZXBlYXRlciwgY29uZmlnLCBmaXQpO1xuICB9XG5cbiAgaWYgKGlzVW5pdFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbmV3IFVuaXRNb2RlbChzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgdW5pdFNpemUsIHJlcGVhdGVyLCBjb25maWcsIGZpdCk7XG4gIH1cblxuICBpZiAoaXNSZXBlYXRTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5ldyBSZXBlYXRNb2RlbChzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgcmVwZWF0ZXIsIGNvbmZpZyk7XG4gIH1cblxuICBpZiAoaXNDb25jYXRTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5ldyBDb25jYXRNb2RlbChzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgcmVwZWF0ZXIsIGNvbmZpZyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuSU5WQUxJRF9TUEVDKTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/common.d.ts b/build/src/compile/common.d.ts new file mode 100644 index 0000000000..f98be9ef87 --- /dev/null +++ b/build/src/compile/common.d.ts @@ -0,0 +1,58 @@ +import { Channel } from '../channel'; +import { Config, ViewConfig } from '../config'; +import { FieldDef, FieldDefBase, FieldRefOption, OrderFieldDef } from '../fielddef'; +import { GuideEncodingEntry } from '../guide'; +import { MarkConfig, MarkDef, TextConfig } from '../mark'; +import { TimeUnit } from '../timeunit'; +import { VgEncodeEntry, VgSort } from '../vega.schema'; +import { AxisComponentProps } from './axis/component'; +import { Explicit } from './split'; +import { UnitModel } from './unit'; +export declare function applyConfig(e: VgEncodeEntry, config: ViewConfig | MarkConfig | TextConfig, // TODO(#1842): consolidate MarkConfig | TextConfig? +propsList: string[]): VgEncodeEntry; +export declare function applyMarkConfig(e: VgEncodeEntry, model: UnitModel, propsList: (keyof MarkConfig)[]): VgEncodeEntry; +export declare function getStyles(mark: MarkDef): string[]; +/** + * Return property value from style or mark specific config property if exists. + * Otherwise, return general mark specific config. + */ +export declare function getMarkConfig

(prop: P, mark: MarkDef, config: Config): MarkConfig[P]; +export declare function formatSignalRef(fieldDef: FieldDef, specifiedFormat: string, expr: 'datum' | 'parent', config: Config): { + signal: string; +}; +export declare function getSpecifiedOrDefaultValue(specifiedValue: T, defaultValue: T | { + signal: string; +}): T | { + signal: string; +}; +/** + * Returns number format for a fieldDef + * + * @param format explicitly specified format + */ +export declare function numberFormat(fieldDef: FieldDef, specifiedFormat: string, config: Config): string; +export declare function numberFormatExpr(field: string, specifiedFormat: string, config: Config): string; +export declare function binFormatExpression(startField: string, endField: string, format: string, config: Config): string; +/** + * Returns the time expression used for axis/legend labels or text mark for a temporal field + */ +export declare function timeFormatExpression(field: string, timeUnit: TimeUnit, format: string, shortTimeLabels: boolean, timeFormatConfig: string, isUTCScale: boolean, alwaysReturn?: boolean): string; +/** + * Return Vega sort parameters (tuple of field and order). + */ +export declare function sortParams(orderDef: OrderFieldDef | OrderFieldDef[], fieldRefOption?: FieldRefOption): VgSort; +export declare type AxisTitleComponent = AxisComponentProps['title']; +export declare function mergeTitleFieldDefs(f1: FieldDefBase[], f2: FieldDefBase[]): FieldDefBase[]; +export declare function mergeTitle(title1: string, title2: string): string; +export declare function mergeTitleComponent(v1: Explicit, v2: Explicit): { + explicit: boolean; + value: FieldDefBase[]; +} | { + explicit: boolean; + value: string; +}; +/** + * Checks whether a fieldDef for a particular channel requires a computed bin range. + */ +export declare function binRequiresRange(fieldDef: FieldDef, channel: Channel): boolean; +export declare function guideEncodeEntry(encoding: GuideEncodingEntry, model: UnitModel): {}; diff --git a/build/src/compile/common.js b/build/src/compile/common.js new file mode 100644 index 0000000000..521cd2eba0 --- /dev/null +++ b/build/src/compile/common.js @@ -0,0 +1,218 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../channel"); +var fielddef_1 = require("../fielddef"); +var scale_1 = require("../scale"); +var timeunit_1 = require("../timeunit"); +var type_1 = require("../type"); +var util_1 = require("../util"); +var mixins_1 = require("./mark/mixins"); +function applyConfig(e, config, // TODO(#1842): consolidate MarkConfig | TextConfig? +propsList) { + for (var _i = 0, propsList_1 = propsList; _i < propsList_1.length; _i++) { + var property = propsList_1[_i]; + var value = config[property]; + if (value !== undefined) { + e[property] = { value: value }; + } + } + return e; +} +exports.applyConfig = applyConfig; +function applyMarkConfig(e, model, propsList) { + for (var _i = 0, propsList_2 = propsList; _i < propsList_2.length; _i++) { + var property = propsList_2[_i]; + var value = getMarkConfig(property, model.markDef, model.config); + if (value !== undefined) { + e[property] = { value: value }; + } + } + return e; +} +exports.applyMarkConfig = applyMarkConfig; +function getStyles(mark) { + return [].concat(mark.type, mark.style || []); +} +exports.getStyles = getStyles; +/** + * Return property value from style or mark specific config property if exists. + * Otherwise, return general mark specific config. + */ +function getMarkConfig(prop, mark, config) { + // By default, read from mark config first! + var value = config.mark[prop]; + // Then read mark specific config, which has higher precedence + var markSpecificConfig = config[mark.type]; + if (markSpecificConfig[prop] !== undefined) { + value = markSpecificConfig[prop]; + } + // Then read style config, which has even higher precedence. + var styles = getStyles(mark); + for (var _i = 0, styles_1 = styles; _i < styles_1.length; _i++) { + var style = styles_1[_i]; + var styleConfig = config.style[style]; + // MarkConfig extends VgMarkConfig so a prop may not be a valid property for style + // However here we also check if it is defined, so it is okay to cast here + var p = prop; + if (styleConfig && styleConfig[p] !== undefined) { + value = styleConfig[p]; + } + } + return value; +} +exports.getMarkConfig = getMarkConfig; +function formatSignalRef(fieldDef, specifiedFormat, expr, config) { + var format = numberFormat(fieldDef, specifiedFormat, config); + if (fieldDef.bin) { + var startField = fielddef_1.vgField(fieldDef, { expr: expr }); + var endField = fielddef_1.vgField(fieldDef, { expr: expr, binSuffix: 'end' }); + return { + signal: binFormatExpression(startField, endField, format, config) + }; + } + else if (fieldDef.type === 'quantitative') { + return { + signal: "" + formatExpr(fielddef_1.vgField(fieldDef, { expr: expr, binSuffix: 'range' }), format) + }; + } + else if (fielddef_1.isTimeFieldDef(fieldDef)) { + var isUTCScale = fielddef_1.isScaleFieldDef(fieldDef) && fieldDef['scale'] && fieldDef['scale'].type === scale_1.ScaleType.UTC; + return { + signal: timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: expr }), fieldDef.timeUnit, specifiedFormat, config.text.shortTimeLabels, config.timeFormat, isUTCScale, true) + }; + } + else { + return { + signal: "''+" + fielddef_1.vgField(fieldDef, { expr: expr }) + }; + } +} +exports.formatSignalRef = formatSignalRef; +function getSpecifiedOrDefaultValue(specifiedValue, defaultValue) { + if (specifiedValue !== undefined) { + return specifiedValue; + } + return defaultValue; +} +exports.getSpecifiedOrDefaultValue = getSpecifiedOrDefaultValue; +/** + * Returns number format for a fieldDef + * + * @param format explicitly specified format + */ +function numberFormat(fieldDef, specifiedFormat, config) { + if (fieldDef.type === type_1.QUANTITATIVE) { + // add number format for quantitative type only + // Specified format in axis/legend has higher precedence than fieldDef.format + if (specifiedFormat) { + return specifiedFormat; + } + // TODO: need to make this work correctly for numeric ordinal / nominal type + return config.numberFormat; + } + return undefined; +} +exports.numberFormat = numberFormat; +function formatExpr(field, format) { + return "format(" + field + ", \"" + (format || '') + "\")"; +} +function numberFormatExpr(field, specifiedFormat, config) { + return formatExpr(field, specifiedFormat || config.numberFormat); +} +exports.numberFormatExpr = numberFormatExpr; +function binFormatExpression(startField, endField, format, config) { + return startField + " === null || isNaN(" + startField + ") ? \"null\" : " + numberFormatExpr(startField, format, config) + " + \" - \" + " + numberFormatExpr(endField, format, config); +} +exports.binFormatExpression = binFormatExpression; +/** + * Returns the time expression used for axis/legend labels or text mark for a temporal field + */ +function timeFormatExpression(field, timeUnit, format, shortTimeLabels, timeFormatConfig, isUTCScale, alwaysReturn) { + if (alwaysReturn === void 0) { alwaysReturn = false; } + if (!timeUnit || format) { + // If there is not time unit, or if user explicitly specify format for axis/legend/text. + format = format || timeFormatConfig; // only use config.timeFormat if there is no timeUnit. + if (format || alwaysReturn) { + return (isUTCScale ? 'utc' : 'time') + "Format(" + field + ", '" + format + "')"; + } + else { + return undefined; + } + } + else { + return timeunit_1.formatExpression(timeUnit, field, shortTimeLabels, isUTCScale); + } +} +exports.timeFormatExpression = timeFormatExpression; +/** + * Return Vega sort parameters (tuple of field and order). + */ +function sortParams(orderDef, fieldRefOption) { + return (vega_util_1.isArray(orderDef) ? orderDef : [orderDef]).reduce(function (s, orderChannelDef) { + s.field.push(fielddef_1.vgField(orderChannelDef, fieldRefOption)); + s.order.push(orderChannelDef.sort || 'ascending'); + return s; + }, { field: [], order: [] }); +} +exports.sortParams = sortParams; +function mergeTitleFieldDefs(f1, f2) { + var merged = f1.slice(); + f2.forEach(function (fdToMerge) { + for (var _i = 0, merged_1 = merged; _i < merged_1.length; _i++) { + var fieldDef1 = merged_1[_i]; + // If already exists, no need to append to merged array + if (util_1.stringify(fieldDef1) === util_1.stringify(fdToMerge)) { + return; + } + } + merged.push(fdToMerge); + }); + return merged; +} +exports.mergeTitleFieldDefs = mergeTitleFieldDefs; +function mergeTitle(title1, title2) { + return title1 === title2 ? + title1 : // if title is the same just use one of them + title1 + ', ' + title2; // join title with comma if different +} +exports.mergeTitle = mergeTitle; +function mergeTitleComponent(v1, v2) { + if (vega_util_1.isArray(v1.value) && vega_util_1.isArray(v2.value)) { + return { + explicit: v1.explicit, + value: mergeTitleFieldDefs(v1.value, v2.value) + }; + } + else if (!vega_util_1.isArray(v1.value) && !vega_util_1.isArray(v2.value)) { + return { + explicit: v1.explicit, + value: mergeTitle(v1.value, v2.value) + }; + } + /* istanbul ignore next: Condition should not happen -- only for warning in development. */ + throw new Error('It should never reach here'); +} +exports.mergeTitleComponent = mergeTitleComponent; +/** + * Checks whether a fieldDef for a particular channel requires a computed bin range. + */ +function binRequiresRange(fieldDef, channel) { + if (!fieldDef.bin) { + console.warn('Only use this method with binned field defs'); + return false; + } + // We need the range only when the user explicitly forces a binned field to be use discrete scale. In this case, bin range is used in axis and legend labels. + // We could check whether the axis or legend exists (not disabled) but that seems overkill. + return channel_1.isScaleChannel(channel) && util_1.contains(['ordinal', 'nominal'], fieldDef.type); +} +exports.binRequiresRange = binRequiresRange; +function guideEncodeEntry(encoding, model) { + return util_1.keys(encoding).reduce(function (encode, channel) { + var valueDef = encoding[channel]; + return tslib_1.__assign({}, encode, mixins_1.wrapCondition(model, valueDef, channel, function (x) { return ({ value: x.value }); })); + }, {}); +} +exports.guideEncodeEntry = guideEncodeEntry; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFrQztBQUNsQyxzQ0FBbUQ7QUFFbkQsd0NBQXNJO0FBR3RJLGtDQUFtQztBQUNuQyx3Q0FBdUQ7QUFDdkQsZ0NBQXFDO0FBQ3JDLGdDQUFrRDtBQUdsRCx3Q0FBNEM7QUFLNUMscUJBQTRCLENBQWdCLEVBQ3hDLE1BQTRDLEVBQUUsb0RBQW9EO0FBQ2xHLFNBQW1CO0lBQ3JCLEtBQXVCLFVBQVMsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUyxFQUFFO1FBQTdCLElBQU0sUUFBUSxrQkFBQTtRQUNqQixJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDL0IsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQztTQUM5QjtLQUNGO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBVkQsa0NBVUM7QUFFRCx5QkFBZ0MsQ0FBZ0IsRUFBRSxLQUFnQixFQUFFLFNBQStCO0lBQ2pHLEtBQXVCLFVBQVMsRUFBVCx1QkFBUyxFQUFULHVCQUFTLEVBQVQsSUFBUyxFQUFFO1FBQTdCLElBQU0sUUFBUSxrQkFBQTtRQUNqQixJQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25FLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7U0FDOUI7S0FDRjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQVJELDBDQVFDO0FBRUQsbUJBQTBC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S0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDdEMsQ0FBQztLQUNIO0lBQ0QsMkZBQTJGO0lBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBaEJELGtEQWdCQztBQUVEOztHQUVHO0FBQ0gsMEJBQWlDLFFBQTBCLEVBQUUsT0FBZ0I7SUFDM0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCw2SkFBNko7SUFDN0osMkZBQTJGO0lBQzNGLE9BQU8sd0JBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxlQUFRLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BGLENBQUM7QUFURCw0Q0FTQztBQUVELDBCQUFpQyxRQUE0QixFQUFFLEtBQWdCO0lBQzdFLE9BQU8sV0FBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQU0sRUFBRSxPQUF3QjtRQUM1RCxJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsNEJBQ0ssTUFBTSxFQUNOLHNCQUFhLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBQyxDQUFXLElBQUssT0FBQSxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQyxFQUFsQixDQUFrQixDQUFDLEVBQy9FO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQVJELDRDQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtDaGFubmVsLCBpc1NjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZywgVmlld0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7RmllbGREZWYsIEZpZWxkRGVmQmFzZSwgRmllbGRSZWZPcHRpb24sIGlzU2NhbGVGaWVsZERlZiwgaXNUaW1lRmllbGREZWYsIE9yZGVyRmllbGREZWYsIFZhbHVlRGVmLCB2Z0ZpZWxkfSBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQge0d1aWRlRW5jb2RpbmdFbnRyeX0gZnJvbSAnLi4vZ3VpZGUnO1xuaW1wb3J0IHtNYXJrQ29uZmlnLCBNYXJrRGVmLCBUZXh0Q29uZmlnfSBmcm9tICcuLi9tYXJrJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi9zY2FsZSc7XG5pbXBvcnQge2Zvcm1hdEV4cHJlc3Npb24sIFRpbWVVbml0fSBmcm9tICcuLi90aW1ldW5pdCc7XG5pbXBvcnQge1FVQU5USVRBVElWRX0gZnJvbSAnLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zLCBrZXlzLCBzdHJpbmdpZnl9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0VuY29kZUNoYW5uZWwsIFZnRW5jb2RlRW50cnksIFZnTWFya0NvbmZpZywgVmdTb3J0fSBmcm9tICcuLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0F4aXNDb21wb25lbnRQcm9wc30gZnJvbSAnLi9heGlzL2NvbXBvbmVudCc7XG5pbXBvcnQge3dyYXBDb25kaXRpb259IGZyb20gJy4vbWFyay9taXhpbnMnO1xuaW1wb3J0IHtFeHBsaWNpdH0gZnJvbSAnLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi91bml0JztcblxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlDb25maWcoZTogVmdFbmNvZGVFbnRyeSxcbiAgICBjb25maWc6IFZpZXdDb25maWcgfCBNYXJrQ29uZmlnIHwgVGV4dENvbmZpZywgLy8gVE9ETygjMTg0Mik6IGNvbnNvbGlkYXRlIE1hcmtDb25maWcgfCBUZXh0Q29uZmlnP1xuICAgIHByb3BzTGlzdDogc3RyaW5nW10pIHtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wc0xpc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1twcm9wZXJ0eV07XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVbcHJvcGVydHldID0ge3ZhbHVlOiB2YWx1ZX07XG4gICAgfVxuICB9XG4gIHJldHVybiBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXJrQ29uZmlnKGU6IFZnRW5jb2RlRW50cnksIG1vZGVsOiBVbml0TW9kZWwsIHByb3BzTGlzdDogKGtleW9mIE1hcmtDb25maWcpW10pIHtcbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBwcm9wc0xpc3QpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldE1hcmtDb25maWcocHJvcGVydHksIG1vZGVsLm1hcmtEZWYsIG1vZGVsLmNvbmZpZyk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVbcHJvcGVydHldID0ge3ZhbHVlOiB2YWx1ZX07XG4gICAgfVxuICB9XG4gIHJldHVybiBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3R5bGVzKG1hcms6IE1hcmtEZWYpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbXS5jb25jYXQobWFyay50eXBlLCBtYXJrLnN0eWxlIHx8IFtdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gcHJvcGVydHkgdmFsdWUgZnJvbSBzdHlsZSBvciBtYXJrIHNwZWNpZmljIGNvbmZpZyBwcm9wZXJ0eSBpZiBleGlzdHMuXG4gKiBPdGhlcndpc2UsIHJldHVybiBnZW5lcmFsIG1hcmsgc3BlY2lmaWMgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya0NvbmZpZzxQIGV4dGVuZHMga2V5b2YgTWFya0NvbmZpZz4ocHJvcDogUCwgbWFyazogTWFya0RlZiwgY29uZmlnOiBDb25maWcpOiBNYXJrQ29uZmlnW1BdIHtcbiAgLy8gQnkgZGVmYXVsdCwgcmVhZCBmcm9tIG1hcmsgY29uZmlnIGZpcnN0IVxuICBsZXQgdmFsdWUgPSBjb25maWcubWFya1twcm9wXTtcblxuICAvLyBUaGVuIHJlYWQgbWFyayBzcGVjaWZpYyBjb25maWcsIHdoaWNoIGhhcyBoaWdoZXIgcHJlY2VkZW5jZVxuICBjb25zdCBtYXJrU3BlY2lmaWNDb25maWcgPSBjb25maWdbbWFyay50eXBlXTtcbiAgaWYgKG1hcmtTcGVjaWZpY0NvbmZpZ1twcm9wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFsdWUgPSBtYXJrU3BlY2lmaWNDb25maWdbcHJvcF07XG4gIH1cblxuICAvLyBUaGVuIHJlYWQgc3R5bGUgY29uZmlnLCB3aGljaCBoYXMgZXZlbiBoaWdoZXIgcHJlY2VkZW5jZS5cbiAgY29uc3Qgc3R5bGVzID0gZ2V0U3R5bGVzKG1hcmspO1xuICBmb3IgKGNvbnN0IHN0eWxlIG9mIHN0eWxlcykge1xuICAgIGNvbnN0IHN0eWxlQ29uZmlnID0gY29uZmlnLnN0eWxlW3N0eWxlXTtcblxuICAgIC8vIE1hcmtDb25maWcgZXh0ZW5kcyBWZ01hcmtDb25maWcgc28gYSBwcm9wIG1heSBub3QgYmUgYSB2YWxpZCBwcm9wZXJ0eSBmb3Igc3R5bGVcbiAgICAvLyBIb3dldmVyIGhlcmUgd2UgYWxzbyBjaGVjayBpZiBpdCBpcyBkZWZpbmVkLCBzbyBpdCBpcyBva2F5IHRvIGNhc3QgaGVyZVxuICAgIGNvbnN0IHAgPSBwcm9wIGFzIGtleW9mIFZnTWFya0NvbmZpZztcbiAgICBpZiAoc3R5bGVDb25maWcgJiYgc3R5bGVDb25maWdbcF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSBzdHlsZUNvbmZpZ1twXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTaWduYWxSZWYoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNwZWNpZmllZEZvcm1hdDogc3RyaW5nLCBleHByOiAnZGF0dW0nIHwgJ3BhcmVudCcsIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IGZvcm1hdCA9IG51bWJlckZvcm1hdChmaWVsZERlZiwgc3BlY2lmaWVkRm9ybWF0LCBjb25maWcpO1xuICBpZiAoZmllbGREZWYuYmluKSB7XG4gICAgY29uc3Qgc3RhcnRGaWVsZCA9IHZnRmllbGQoZmllbGREZWYsIHtleHByfSk7XG4gICAgY29uc3QgZW5kRmllbGQgPSB2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwciwgYmluU3VmZml4OiAnZW5kJ30pO1xuICAgIHJldHVybiB7XG4gICAgICBzaWduYWw6IGJpbkZvcm1hdEV4cHJlc3Npb24oc3RhcnRGaWVsZCwgZW5kRmllbGQsIGZvcm1hdCwgY29uZmlnKVxuICAgIH07XG4gIH0gZWxzZSBpZiAoZmllbGREZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiBgJHtmb3JtYXRFeHByKHZnRmllbGQoZmllbGREZWYsIHtleHByLCBiaW5TdWZmaXg6ICdyYW5nZSd9KSwgZm9ybWF0KX1gXG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc1RpbWVGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICBjb25zdCBpc1VUQ1NjYWxlID0gaXNTY2FsZUZpZWxkRGVmKGZpZWxkRGVmKSAmJiBmaWVsZERlZlsnc2NhbGUnXSAmJiBmaWVsZERlZlsnc2NhbGUnXS50eXBlID09PSBTY2FsZVR5cGUuVVRDO1xuICAgIHJldHVybiB7XG4gICAgICBzaWduYWw6IHRpbWVGb3JtYXRFeHByZXNzaW9uKHZnRmllbGQoZmllbGREZWYsIHtleHByfSksIGZpZWxkRGVmLnRpbWVVbml0LCBzcGVjaWZpZWRGb3JtYXQsIGNvbmZpZy50ZXh0LnNob3J0VGltZUxhYmVscywgY29uZmlnLnRpbWVGb3JtYXQsIGlzVVRDU2NhbGUsIHRydWUpXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiBgJycrJHt2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcn0pfWBcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZTxUPihzcGVjaWZpZWRWYWx1ZTogVCwgZGVmYXVsdFZhbHVlOiBUIHwge3NpZ25hbDogc3RyaW5nfSkge1xuICBpZiAoc3BlY2lmaWVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzcGVjaWZpZWRWYWx1ZTtcbiAgfVxuICByZXR1cm4gZGVmYXVsdFZhbHVlO1xufVxuXG4vKipcbiAqIFJldHVybnMgbnVtYmVyIGZvcm1hdCBmb3IgYSBmaWVsZERlZlxuICpcbiAqIEBwYXJhbSBmb3JtYXQgZXhwbGljaXRseSBzcGVjaWZpZWQgZm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGb3JtYXQoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNwZWNpZmllZEZvcm1hdDogc3RyaW5nLCBjb25maWc6IENvbmZpZykge1xuICBpZiAoZmllbGREZWYudHlwZSA9PT0gUVVBTlRJVEFUSVZFKSB7XG4gICAgLy8gYWRkIG51bWJlciBmb3JtYXQgZm9yIHF1YW50aXRhdGl2ZSB0eXBlIG9ubHlcblxuICAgIC8vIFNwZWNpZmllZCBmb3JtYXQgaW4gYXhpcy9sZWdlbmQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gZmllbGREZWYuZm9ybWF0XG4gICAgaWYgKHNwZWNpZmllZEZvcm1hdCkge1xuICAgICAgcmV0dXJuIHNwZWNpZmllZEZvcm1hdDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBuZWVkIHRvIG1ha2UgdGhpcyB3b3JrIGNvcnJlY3RseSBmb3IgbnVtZXJpYyBvcmRpbmFsIC8gbm9taW5hbCB0eXBlXG4gICAgcmV0dXJuIGNvbmZpZy5udW1iZXJGb3JtYXQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RXhwcihmaWVsZDogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZykge1xuICByZXR1cm4gYGZvcm1hdCgke2ZpZWxkfSwgXCIke2Zvcm1hdCB8fCAnJ31cIilgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyRm9ybWF0RXhwcihmaWVsZDogc3RyaW5nLCBzcGVjaWZpZWRGb3JtYXQ6IHN0cmluZywgY29uZmlnOiBDb25maWcpIHtcbiAgcmV0dXJuIGZvcm1hdEV4cHIoZmllbGQsIHNwZWNpZmllZEZvcm1hdCB8fCBjb25maWcubnVtYmVyRm9ybWF0KTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gYmluRm9ybWF0RXhwcmVzc2lvbihzdGFydEZpZWxkOiBzdHJpbmcsIGVuZEZpZWxkOiBzdHJpbmcsIGZvcm1hdDogc3RyaW5nLCBjb25maWc6IENvbmZpZykge1xuICByZXR1cm4gYCR7c3RhcnRGaWVsZH0gPT09IG51bGwgfHwgaXNOYU4oJHtzdGFydEZpZWxkfSkgPyBcIm51bGxcIiA6ICR7bnVtYmVyRm9ybWF0RXhwcihzdGFydEZpZWxkLCBmb3JtYXQsIGNvbmZpZyl9ICsgXCIgLSBcIiArICR7bnVtYmVyRm9ybWF0RXhwcihlbmRGaWVsZCwgZm9ybWF0LCBjb25maWcpfWA7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0aW1lIGV4cHJlc3Npb24gdXNlZCBmb3IgYXhpcy9sZWdlbmQgbGFiZWxzIG9yIHRleHQgbWFyayBmb3IgYSB0ZW1wb3JhbCBmaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZUZvcm1hdEV4cHJlc3Npb24oZmllbGQ6IHN0cmluZywgdGltZVVuaXQ6IFRpbWVVbml0LCBmb3JtYXQ6IHN0cmluZywgc2hvcnRUaW1lTGFiZWxzOiBib29sZWFuLCB0aW1lRm9ybWF0Q29uZmlnOiBzdHJpbmcsIGlzVVRDU2NhbGU6IGJvb2xlYW4sIGFsd2F5c1JldHVybjogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKCF0aW1lVW5pdCB8fCBmb3JtYXQpIHtcbiAgICAvLyBJZiB0aGVyZSBpcyBub3QgdGltZSB1bml0LCBvciBpZiB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmeSBmb3JtYXQgZm9yIGF4aXMvbGVnZW5kL3RleHQuXG4gICAgZm9ybWF0ID0gZm9ybWF0IHx8IHRpbWVGb3JtYXRDb25maWc7IC8vIG9ubHkgdXNlIGNvbmZpZy50aW1lRm9ybWF0IGlmIHRoZXJlIGlzIG5vIHRpbWVVbml0LlxuXG4gICAgaWYgKGZvcm1hdCB8fCBhbHdheXNSZXR1cm4pIHtcbiAgICAgIHJldHVybiBgJHtpc1VUQ1NjYWxlID8gJ3V0YycgOiAndGltZSd9Rm9ybWF0KCR7ZmllbGR9LCAnJHtmb3JtYXR9JylgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZm9ybWF0RXhwcmVzc2lvbih0aW1lVW5pdCwgZmllbGQsIHNob3J0VGltZUxhYmVscywgaXNVVENTY2FsZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gVmVnYSBzb3J0IHBhcmFtZXRlcnMgKHR1cGxlIG9mIGZpZWxkIGFuZCBvcmRlcikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0UGFyYW1zKG9yZGVyRGVmOiBPcmRlckZpZWxkRGVmPHN0cmluZz4gfCBPcmRlckZpZWxkRGVmPHN0cmluZz5bXSwgZmllbGRSZWZPcHRpb24/OiBGaWVsZFJlZk9wdGlvbik6IFZnU29ydCB7XG4gIHJldHVybiAoaXNBcnJheShvcmRlckRlZikgPyBvcmRlckRlZiA6IFtvcmRlckRlZl0pLnJlZHVjZSgocywgb3JkZXJDaGFubmVsRGVmKSA9PiB7XG4gICAgcy5maWVsZC5wdXNoKHZnRmllbGQob3JkZXJDaGFubmVsRGVmLCBmaWVsZFJlZk9wdGlvbikpO1xuICAgIHMub3JkZXIucHVzaChvcmRlckNoYW5uZWxEZWYuc29ydCB8fCAnYXNjZW5kaW5nJyk7XG4gICAgcmV0dXJuIHM7XG4gIH0sIHtmaWVsZDpbXSwgb3JkZXI6IFtdfSk7XG59XG5cbmV4cG9ydCB0eXBlIEF4aXNUaXRsZUNvbXBvbmVudCA9IEF4aXNDb21wb25lbnRQcm9wc1sndGl0bGUnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGl0bGVGaWVsZERlZnMoZjE6IEZpZWxkRGVmQmFzZTxzdHJpbmc+W10sIGYyOiBGaWVsZERlZkJhc2U8c3RyaW5nPltdKSB7XG4gIGNvbnN0IG1lcmdlZCA9IFsuLi5mMV07XG5cbiAgZjIuZm9yRWFjaCgoZmRUb01lcmdlKSA9PiB7XG4gICAgZm9yIChjb25zdCBmaWVsZERlZjEgb2YgbWVyZ2VkKSB7XG4gICAgICAvLyBJZiBhbHJlYWR5IGV4aXN0cywgbm8gbmVlZCB0byBhcHBlbmQgdG8gbWVyZ2VkIGFycmF5XG4gICAgICBpZiAoc3RyaW5naWZ5KGZpZWxkRGVmMSkgPT09IHN0cmluZ2lmeShmZFRvTWVyZ2UpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVyZ2VkLnB1c2goZmRUb01lcmdlKTtcbiAgfSk7XG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRpdGxlKHRpdGxlMTogc3RyaW5nLCB0aXRsZTI6IHN0cmluZykge1xuICByZXR1cm4gdGl0bGUxID09PSB0aXRsZTIgP1xuICAgIHRpdGxlMSA6IC8vIGlmIHRpdGxlIGlzIHRoZSBzYW1lIGp1c3QgdXNlIG9uZSBvZiB0aGVtXG4gICAgdGl0bGUxICsgJywgJyArIHRpdGxlMjsgLy8gam9pbiB0aXRsZSB3aXRoIGNvbW1hIGlmIGRpZmZlcmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUaXRsZUNvbXBvbmVudChcbiAgdjE6IEV4cGxpY2l0PEF4aXNUaXRsZUNvbXBvbmVudD4sIHYyOiBFeHBsaWNpdDxBeGlzVGl0bGVDb21wb25lbnQ+XG4pIHtcbiAgaWYgKGlzQXJyYXkodjEudmFsdWUpICYmIGlzQXJyYXkodjIudmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGxpY2l0OiB2MS5leHBsaWNpdCxcbiAgICAgIHZhbHVlOiBtZXJnZVRpdGxlRmllbGREZWZzKHYxLnZhbHVlLCB2Mi52YWx1ZSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFpc0FycmF5KHYxLnZhbHVlKSAmJiAhaXNBcnJheSh2Mi52YWx1ZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXhwbGljaXQ6IHYxLmV4cGxpY2l0LCAvLyBrZWVwIHRoZSBvbGQgZXhwbGljaXRcbiAgICAgIHZhbHVlOiBtZXJnZVRpdGxlKHYxLnZhbHVlLCB2Mi52YWx1ZSlcbiAgICB9O1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBDb25kaXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gLS0gb25seSBmb3Igd2FybmluZyBpbiBkZXZlbG9wbWVudC4gKi9cbiAgdGhyb3cgbmV3IEVycm9yKCdJdCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZScpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGEgZmllbGREZWYgZm9yIGEgcGFydGljdWxhciBjaGFubmVsIHJlcXVpcmVzIGEgY29tcHV0ZWQgYmluIHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluUmVxdWlyZXNSYW5nZShmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICBpZiAoIWZpZWxkRGVmLmJpbikge1xuICAgIGNvbnNvbGUud2FybignT25seSB1c2UgdGhpcyBtZXRob2Qgd2l0aCBiaW5uZWQgZmllbGQgZGVmcycpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFdlIG5lZWQgdGhlIHJhbmdlIG9ubHkgd2hlbiB0aGUgdXNlciBleHBsaWNpdGx5IGZvcmNlcyBhIGJpbm5lZCBmaWVsZCB0byBiZSB1c2UgZGlzY3JldGUgc2NhbGUuIEluIHRoaXMgY2FzZSwgYmluIHJhbmdlIGlzIHVzZWQgaW4gYXhpcyBhbmQgbGVnZW5kIGxhYmVscy5cbiAgLy8gV2UgY291bGQgY2hlY2sgd2hldGhlciB0aGUgYXhpcyBvciBsZWdlbmQgZXhpc3RzIChub3QgZGlzYWJsZWQpIGJ1dCB0aGF0IHNlZW1zIG92ZXJraWxsLlxuICByZXR1cm4gaXNTY2FsZUNoYW5uZWwoY2hhbm5lbCkgJiYgY29udGFpbnMoWydvcmRpbmFsJywgJ25vbWluYWwnXSwgZmllbGREZWYudHlwZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBndWlkZUVuY29kZUVudHJ5KGVuY29kaW5nOiBHdWlkZUVuY29kaW5nRW50cnksIG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgcmV0dXJuIGtleXMoZW5jb2RpbmcpLnJlZHVjZSgoZW5jb2RlLCBjaGFubmVsOiBWZ0VuY29kZUNoYW5uZWwpID0+IHtcbiAgICBjb25zdCB2YWx1ZURlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5lbmNvZGUsXG4gICAgICAuLi53cmFwQ29uZGl0aW9uKG1vZGVsLCB2YWx1ZURlZiwgY2hhbm5lbCwgKHg6IFZhbHVlRGVmKSA9PiAoe3ZhbHVlOiB4LnZhbHVlfSkpXG4gICAgfTtcbiAgfSwge30pO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/compile.d.ts b/build/src/compile/compile.d.ts new file mode 100644 index 0000000000..a062704e38 --- /dev/null +++ b/build/src/compile/compile.d.ts @@ -0,0 +1,39 @@ +import { Config } from '../config'; +import * as vlFieldDef from '../fielddef'; +import * as log from '../log'; +import { TopLevelSpec } from '../spec'; +export interface CompileOptions { + config?: Config; + logger?: log.LoggerInterface; + fieldTitle?: vlFieldDef.FieldTitleFormatter; +} +/** + * Vega-Lite's main function, for compiling Vega-lite spec into Vega spec. + * + * At a high-level, we make the following transformations in different phases: + * + * Input spec + * | + * | (Normalization) + * v + * Normalized Spec (Row/Column channels in single-view specs becomes faceted specs, composite marks becomes layered specs.) + * | + * | (Build Model) + * v + * A model tree of the spec + * | + * | (Parse) + * v + * A model tree with parsed components (intermediate structure of visualization primitives in a format that can be easily merged) + * | + * | (Optimize) + * v + * A model tree with parsed components with the data component optimized + * | + * | (Assemble) + * v + * Vega spec + */ +export declare function compile(inputSpec: TopLevelSpec, opt?: CompileOptions): { + spec: any; +}; diff --git a/build/src/compile/compile.js b/build/src/compile/compile.js new file mode 100644 index 0000000000..fe0c0ac59d --- /dev/null +++ b/build/src/compile/compile.js @@ -0,0 +1,126 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var config_1 = require("../config"); +var vlFieldDef = tslib_1.__importStar(require("../fielddef")); +var log = tslib_1.__importStar(require("../log")); +var spec_1 = require("../spec"); +var toplevelprops_1 = require("../toplevelprops"); +var util_1 = require("../util"); +var buildmodel_1 = require("./buildmodel"); +var assemble_1 = require("./data/assemble"); +var optimize_1 = require("./data/optimize"); +/** + * Vega-Lite's main function, for compiling Vega-lite spec into Vega spec. + * + * At a high-level, we make the following transformations in different phases: + * + * Input spec + * | + * | (Normalization) + * v + * Normalized Spec (Row/Column channels in single-view specs becomes faceted specs, composite marks becomes layered specs.) + * | + * | (Build Model) + * v + * A model tree of the spec + * | + * | (Parse) + * v + * A model tree with parsed components (intermediate structure of visualization primitives in a format that can be easily merged) + * | + * | (Optimize) + * v + * A model tree with parsed components with the data component optimized + * | + * | (Assemble) + * v + * Vega spec + */ +function compile(inputSpec, opt) { + if (opt === void 0) { opt = {}; } + // 0. Augment opt with default opts + if (opt.logger) { + // set the singleton logger to the provided logger + log.set(opt.logger); + } + if (opt.fieldTitle) { + // set the singleton field title formatter + vlFieldDef.setTitleFormatter(opt.fieldTitle); + } + try { + // 1. Initialize config by deep merging default config with the config provided via option and the input spec. + var config = config_1.initConfig(util_1.mergeDeep({}, opt.config, inputSpec.config)); + // 2. Normalize: Convert input spec -> normalized spec + // - Decompose all extended unit specs into composition of unit spec. For example, a box plot get expanded into multiple layers of bars, ticks, and rules. The shorthand row/column channel is also expanded to a facet spec. + var spec = spec_1.normalize(inputSpec, config); + // - Normalize autosize to be a autosize properties object. + var autosize = toplevelprops_1.normalizeAutoSize(inputSpec.autosize, config.autosize, spec_1.isLayerSpec(spec) || spec_1.isUnitSpec(spec)); + // 3. Build Model: normalized spec -> Model (a tree structure) + // This phases instantiates the models with default config by doing a top-down traversal. This allows us to pass properties that child models derive from their parents via their constructors. + // See the abstract `Model` class and its children (UnitModel, LayerModel, FacetModel, RepeatModel, ConcatModel) for different types of models. + var model = buildmodel_1.buildModel(spec, null, '', undefined, undefined, config, autosize.type === 'fit'); + // 4 Parse: Model --> Model with components + // Note that components = intermediate representations that are equivalent to Vega specs. + // We need these intermediate representation because we need to merge many visualizaiton "components" like projections, scales, axes, and legends. + // We will later convert these components into actual Vega specs in the assemble phase. + // In this phase, we do a bottom-up traversal over the whole tree to + // parse for each type of components once (e.g., data, layout, mark, scale). + // By doing bottom-up traversal, we start parsing components of unit specs and + // then merge child components of parent composite specs. + // + // Please see inside model.parse() for order of different components parsed. + model.parse(); + // 5. Optimize the dataflow. This will modify the data component of the model. + optimize_1.optimizeDataflow(model.component.data); + // 6. Assemble: convert model components --> Vega Spec. + return assembleTopLevelModel(model, getTopLevelProperties(inputSpec, config, autosize)); + } + finally { + // Reset the singleton logger if a logger is provided + if (opt.logger) { + log.reset(); + } + // Reset the singleton field title formatter if provided + if (opt.fieldTitle) { + vlFieldDef.resetTitleFormatter(); + } + } +} +exports.compile = compile; +function getTopLevelProperties(topLevelSpec, config, autosize) { + return tslib_1.__assign({ autosize: util_1.keys(autosize).length === 1 && autosize.type ? autosize.type : autosize }, toplevelprops_1.extractTopLevelProperties(config), toplevelprops_1.extractTopLevelProperties(topLevelSpec)); +} +/* + * Assemble the top-level model. + * + * Note: this couldn't be `model.assemble()` since the top-level model + * needs some special treatment to generate top-level properties. + */ +function assembleTopLevelModel(model, topLevelProperties) { + // TODO: change type to become VgSpec + // Config with Vega-Lite only config removed. + var vgConfig = model.config ? config_1.stripAndRedirectConfig(model.config) : undefined; + var data = [].concat(model.assembleSelectionData([]), + // only assemble data in the root + assemble_1.assembleRootData(model.component.data, topLevelProperties.datasets || {})); + delete topLevelProperties.datasets; + var projections = model.assembleProjections(); + var title = model.assembleTitle(); + var style = model.assembleGroupStyle(); + var layoutSignals = model.assembleLayoutSignals(); + // move width and height signals with values to top level + layoutSignals = layoutSignals.filter(function (signal) { + if ((signal.name === 'width' || signal.name === 'height') && signal.value !== undefined) { + topLevelProperties[signal.name] = +signal.value; + return false; + } + return true; + }); + var output = tslib_1.__assign({ $schema: 'https://vega.github.io/schema/vega/v3.json' }, (model.description ? { description: model.description } : {}), topLevelProperties, (title ? { title: title } : {}), (style ? { style: style } : {}), { data: data }, (projections.length > 0 ? { projections: projections } : {}), model.assembleGroup(layoutSignals.concat(model.assembleSelectionTopLevelSignals([]))), (vgConfig ? { config: vgConfig } : {})); + return { + spec: output + // TODO: add warning / errors here + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsb0NBQXFFO0FBQ3JFLDhEQUEwQztBQUMxQyxrREFBOEI7QUFDOUIsZ0NBQXFHO0FBQ3JHLGtEQUFrSDtBQUNsSCxnQ0FBd0M7QUFDeEMsMkNBQXdDO0FBQ3hDLDRDQUFpRDtBQUNqRCw0Q0FBaUQ7QUFVakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsaUJBQXdCLFNBQXVCLEVBQUUsR0FBd0I7SUFBeEIsb0JBQUEsRUFBQSxRQUF3QjtJQUN2RSxtQ0FBbUM7SUFDbkMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2Qsa0RBQWtEO1FBQ2xELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ2xCLDBDQUEwQztRQUMxQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsSUFBSTtRQUNGLDhHQUE4RztRQUM5RyxJQUFNLE1BQU0sR0FBRyxtQkFBVSxDQUFDLGdCQUFTLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFdkUsc0RBQXNEO1FBRXRELDhOQUE4TjtRQUM5TixJQUFNLElBQUksR0FBRyxnQkFBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQywyREFBMkQ7UUFDM0QsSUFBTSxRQUFRLEdBQUcsaUNBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLGtCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRS9HLDhE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QztJQUVILElBQU0sTUFBTSxzQkFDVixPQUFPLEVBQUUsNENBQTRDLElBQ2xELENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDM0Qsa0JBQWtCLEVBQ2xCLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQyxFQUFDLEtBQUssT0FBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNyQixDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUMsRUFBQyxLQUFLLE9BQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFDeEIsSUFBSSxFQUFFLElBQUksSUFDUCxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzFELEtBQUssQ0FBQyxhQUFhLENBQ2pCLGFBQWEsUUFDYixLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFBRSxDQUFDLEVBQzdDLEVBQ0MsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDeEMsQ0FBQztJQUVGLE9BQU87UUFDTCxJQUFJLEVBQUUsTUFBTTtRQUNaLGtDQUFrQztLQUNuQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnLCBpbml0Q29uZmlnLCBzdHJpcEFuZFJlZGlyZWN0Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0ICogYXMgdmxGaWVsZERlZiBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7aXNMYXllclNwZWMsIGlzVW5pdFNwZWMsIExheW91dFNpemVNaXhpbnMsIG5vcm1hbGl6ZSwgVG9wTGV2ZWwsIFRvcExldmVsU3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge0F1dG9TaXplUGFyYW1zLCBleHRyYWN0VG9wTGV2ZWxQcm9wZXJ0aWVzLCBub3JtYWxpemVBdXRvU2l6ZSwgVG9wTGV2ZWxQcm9wZXJ0aWVzfSBmcm9tICcuLi90b3BsZXZlbHByb3BzJztcbmltcG9ydCB7a2V5cywgbWVyZ2VEZWVwfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7YnVpbGRNb2RlbH0gZnJvbSAnLi9idWlsZG1vZGVsJztcbmltcG9ydCB7YXNzZW1ibGVSb290RGF0YX0gZnJvbSAnLi9kYXRhL2Fzc2VtYmxlJztcbmltcG9ydCB7b3B0aW1pemVEYXRhZmxvd30gZnJvbSAnLi9kYXRhL29wdGltaXplJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4vbW9kZWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVPcHRpb25zIHtcbiAgY29uZmlnPzogQ29uZmlnO1xuICBsb2dnZXI/OiBsb2cuTG9nZ2VySW50ZXJmYWNlO1xuXG4gIGZpZWxkVGl0bGU/OiB2bEZpZWxkRGVmLkZpZWxkVGl0bGVGb3JtYXR0ZXI7XG59XG5cbi8qKlxuICogVmVnYS1MaXRlJ3MgbWFpbiBmdW5jdGlvbiwgZm9yIGNvbXBpbGluZyBWZWdhLWxpdGUgc3BlYyBpbnRvIFZlZ2Egc3BlYy5cbiAqXG4gKiBBdCBhIGhpZ2gtbGV2ZWwsIHdlIG1ha2UgdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbnMgaW4gZGlmZmVyZW50IHBoYXNlczpcbiAqXG4gKiBJbnB1dCBzcGVjXG4gKiAgICAgfFxuICogICAgIHwgIChOb3JtYWxpemF0aW9uKVxuICogICAgIHZcbiAqIE5vcm1hbGl6ZWQgU3BlYyAoUm93L0NvbHVtbiBjaGFubmVscyBpbiBzaW5nbGUtdmlldyBzcGVjcyBiZWNvbWVzIGZhY2V0ZWQgc3BlY3MsIGNvbXBvc2l0ZSBtYXJrcyBiZWNvbWVzIGxheWVyZWQgc3BlY3MuKVxuICogICAgIHxcbiAqICAgICB8ICAoQnVpbGQgTW9kZWwpXG4gKiAgICAgdlxuICogQSBtb2RlbCB0cmVlIG9mIHRoZSBzcGVjXG4gKiAgICAgfFxuICogICAgIHwgIChQYXJzZSlcbiAqICAgICB2XG4gKiBBIG1vZGVsIHRyZWUgd2l0aCBwYXJzZWQgY29tcG9uZW50cyAoaW50ZXJtZWRpYXRlIHN0cnVjdHVyZSBvZiB2aXN1YWxpemF0aW9uIHByaW1pdGl2ZXMgaW4gYSBmb3JtYXQgdGhhdCBjYW4gYmUgZWFzaWx5IG1lcmdlZClcbiAqICAgICB8XG4gKiAgICAgfCAoT3B0aW1pemUpXG4gKiAgICAgdlxuICogQSBtb2RlbCB0cmVlIHdpdGggcGFyc2VkIGNvbXBvbmVudHMgd2l0aCB0aGUgZGF0YSBjb21wb25lbnQgb3B0aW1pemVkXG4gKiAgICAgfFxuICogICAgIHwgKEFzc2VtYmxlKVxuICogICAgIHZcbiAqIFZlZ2Egc3BlY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZShpbnB1dFNwZWM6IFRvcExldmVsU3BlYywgb3B0OiBDb21waWxlT3B0aW9ucyA9IHt9KSB7XG4gIC8vIDAuIEF1Z21lbnQgb3B0IHdpdGggZGVmYXVsdCBvcHRzXG4gIGlmIChvcHQubG9nZ2VyKSB7XG4gICAgLy8gc2V0IHRoZSBzaW5nbGV0b24gbG9nZ2VyIHRvIHRoZSBwcm92aWRlZCBsb2dnZXJcbiAgICBsb2cuc2V0KG9wdC5sb2dnZXIpO1xuICB9XG5cbiAgaWYgKG9wdC5maWVsZFRpdGxlKSB7XG4gICAgLy8gc2V0IHRoZSBzaW5nbGV0b24gZmllbGQgdGl0bGUgZm9ybWF0dGVyXG4gICAgdmxGaWVsZERlZi5zZXRUaXRsZUZvcm1hdHRlcihvcHQuZmllbGRUaXRsZSk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIDEuIEluaXRpYWxpemUgY29uZmlnIGJ5IGRlZXAgbWVyZ2luZyBkZWZhdWx0IGNvbmZpZyB3aXRoIHRoZSBjb25maWcgcHJvdmlkZWQgdmlhIG9wdGlvbiBhbmQgdGhlIGlucHV0IHNwZWMuXG4gICAgY29uc3QgY29uZmlnID0gaW5pdENvbmZpZyhtZXJnZURlZXAoe30sIG9wdC5jb25maWcsIGlucHV0U3BlYy5jb25maWcpKTtcblxuICAgIC8vIDIuIE5vcm1hbGl6ZTogQ29udmVydCBpbnB1dCBzcGVjIC0+IG5vcm1hbGl6ZWQgc3BlY1xuXG4gICAgLy8gLSBEZWNvbXBvc2UgYWxsIGV4dGVuZGVkIHVuaXQgc3BlY3MgaW50byBjb21wb3NpdGlvbiBvZiB1bml0IHNwZWMuICBGb3IgZXhhbXBsZSwgYSBib3ggcGxvdCBnZXQgZXhwYW5kZWQgaW50byBtdWx0aXBsZSBsYXllcnMgb2YgYmFycywgdGlja3MsIGFuZCBydWxlcy4gVGhlIHNob3J0aGFuZCByb3cvY29sdW1uIGNoYW5uZWwgaXMgYWxzbyBleHBhbmRlZCB0byBhIGZhY2V0IHNwZWMuXG4gICAgY29uc3Qgc3BlYyA9IG5vcm1hbGl6ZShpbnB1dFNwZWMsIGNvbmZpZyk7XG4gICAgLy8gLSBOb3JtYWxpemUgYXV0b3NpemUgdG8gYmUgYSBhdXRvc2l6ZSBwcm9wZXJ0aWVzIG9iamVjdC5cbiAgICBjb25zdCBhdXRvc2l6ZSA9IG5vcm1hbGl6ZUF1dG9TaXplKGlucHV0U3BlYy5hdXRvc2l6ZSwgY29uZmlnLmF1dG9zaXplLCBpc0xheWVyU3BlYyhzcGVjKSB8fCBpc1VuaXRTcGVjKHNwZWMpKTtcblxuICAgIC8vIDMuIEJ1aWxkIE1vZGVsOiBub3JtYWxpemVkIHNwZWMgLT4gTW9kZWwgKGEgdHJlZSBzdHJ1Y3R1cmUpXG5cbiAgICAvLyBUaGlzIHBoYXNlcyBpbnN0YW50aWF0ZXMgdGhlIG1vZGVscyB3aXRoIGRlZmF1bHQgY29uZmlnIGJ5IGRvaW5nIGEgdG9wLWRvd24gdHJhdmVyc2FsLiBUaGlzIGFsbG93cyB1cyB0byBwYXNzIHByb3BlcnRpZXMgdGhhdCBjaGlsZCBtb2RlbHMgZGVyaXZlIGZyb20gdGhlaXIgcGFyZW50cyB2aWEgdGhlaXIgY29uc3RydWN0b3JzLlxuICAgIC8vIFNlZSB0aGUgYWJzdHJhY3QgYE1vZGVsYCBjbGFzcyBhbmQgaXRzIGNoaWxkcmVuIChVbml0TW9kZWwsIExheWVyTW9kZWwsIEZhY2V0TW9kZWwsIFJlcGVhdE1vZGVsLCBDb25jYXRNb2RlbCkgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtb2RlbHMuXG4gICAgY29uc3QgbW9kZWw6IE1vZGVsID0gYnVpbGRNb2RlbChzcGVjLCBudWxsLCAnJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGNvbmZpZywgYXV0b3NpemUudHlwZSA9PT0gJ2ZpdCcpO1xuXG4gICAgLy8gNCBQYXJzZTogTW9kZWwgLS0+IE1vZGVsIHdpdGggY29tcG9uZW50c1xuXG4gICAgLy8gTm90ZSB0aGF0IGNvbXBvbmVudHMgPSBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb25zIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8gVmVnYSBzcGVjcy5cbiAgICAvLyBXZSBuZWVkIHRoZXNlIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gbWVyZ2UgbWFueSB2aXN1YWxpemFpdG9uIFwiY29tcG9uZW50c1wiIGxpa2UgcHJvamVjdGlvbnMsIHNjYWxlcywgYXhlcywgYW5kIGxlZ2VuZHMuXG4gICAgLy8gV2Ugd2lsbCBsYXRlciBjb252ZXJ0IHRoZXNlIGNvbXBvbmVudHMgaW50byBhY3R1YWwgVmVnYSBzcGVjcyBpbiB0aGUgYXNzZW1ibGUgcGhhc2UuXG5cbiAgICAvLyBJbiB0aGlzIHBoYXNlLCB3ZSBkbyBhIGJvdHRvbS11cCB0cmF2ZXJzYWwgb3ZlciB0aGUgd2hvbGUgdHJlZSB0b1xuICAgIC8vIHBhcnNlIGZvciBlYWNoIHR5cGUgb2YgY29tcG9uZW50cyBvbmNlIChlLmcuLCBkYXRhLCBsYXlvdXQsIG1hcmssIHNjYWxlKS5cbiAgICAvLyBCeSBkb2luZyBib3R0b20tdXAgdHJhdmVyc2FsLCB3ZSBzdGFydCBwYXJzaW5nIGNvbXBvbmVudHMgb2YgdW5pdCBzcGVjcyBhbmRcbiAgICAvLyB0aGVuIG1lcmdlIGNoaWxkIGNvbXBvbmVudHMgb2YgcGFyZW50IGNvbXBvc2l0ZSBzcGVjcy5cbiAgICAvL1xuICAgIC8vIFBsZWFzZSBzZWUgaW5zaWRlIG1vZGVsLnBhcnNlKCkgZm9yIG9yZGVyIG9mIGRpZmZlcmVudCBjb21wb25lbnRzIHBhcnNlZC5cbiAgICBtb2RlbC5wYXJzZSgpO1xuXG4gICAgLy8gNS4gT3B0aW1pemUgdGhlIGRhdGFmbG93LiAgVGhpcyB3aWxsIG1vZGlmeSB0aGUgZGF0YSBjb21wb25lbnQgb2YgdGhlIG1vZGVsLlxuICAgIG9wdGltaXplRGF0YWZsb3cobW9kZWwuY29tcG9uZW50LmRhdGEpO1xuXG4gICAgLy8gNi4gQXNzZW1ibGU6IGNvbnZlcnQgbW9kZWwgY29tcG9uZW50cyAtLT4gVmVnYSBTcGVjLlxuICAgIHJldHVybiBhc3NlbWJsZVRvcExldmVsTW9kZWwobW9kZWwsIGdldFRvcExldmVsUHJvcGVydGllcyhpbnB1dFNwZWMsIGNvbmZpZywgYXV0b3NpemUpKTtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyBSZXNldCB0aGUgc2luZ2xldG9uIGxvZ2dlciBpZiBhIGxvZ2dlciBpcyBwcm92aWRlZFxuICAgIGlmIChvcHQubG9nZ2VyKSB7XG4gICAgICBsb2cucmVzZXQoKTtcbiAgICB9XG4gICAgLy8gUmVzZXQgdGhlIHNpbmdsZXRvbiBmaWVsZCB0aXRsZSBmb3JtYXR0ZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAob3B0LmZpZWxkVGl0bGUpIHtcbiAgICAgIHZsRmllbGREZWYucmVzZXRUaXRsZUZvcm1hdHRlcigpO1xuICAgIH1cbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGdldFRvcExldmVsUHJvcGVydGllcyh0b3BMZXZlbFNwZWM6IFRvcExldmVsPGFueT4sIGNvbmZpZzogQ29uZmlnLCBhdXRvc2l6ZTogQXV0b1NpemVQYXJhbXMpIHtcbiAgcmV0dXJuIHtcbiAgICBhdXRvc2l6ZToga2V5cyhhdXRvc2l6ZSkubGVuZ3RoID09PSAxICYmIGF1dG9zaXplLnR5cGUgPyBhdXRvc2l6ZS50eXBlIDogYXV0b3NpemUsXG4gICAgLi4uZXh0cmFjdFRvcExldmVsUHJvcGVydGllcyhjb25maWcpLFxuICAgIC4uLmV4dHJhY3RUb3BMZXZlbFByb3BlcnRpZXModG9wTGV2ZWxTcGVjKVxuICB9O1xufVxuXG4vKlxuICogQXNzZW1ibGUgdGhlIHRvcC1sZXZlbCBtb2RlbC5cbiAqXG4gKiBOb3RlOiB0aGlzIGNvdWxkbid0IGJlIGBtb2RlbC5hc3NlbWJsZSgpYCBzaW5jZSB0aGUgdG9wLWxldmVsIG1vZGVsXG4gKiBuZWVkcyBzb21lIHNwZWNpYWwgdHJlYXRtZW50IHRvIGdlbmVyYXRlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzLlxuICovXG5mdW5jdGlvbiBhc3NlbWJsZVRvcExldmVsTW9kZWwobW9kZWw6IE1vZGVsLCB0b3BMZXZlbFByb3BlcnRpZXM6IFRvcExldmVsUHJvcGVydGllcyAmIExheW91dFNpemVNaXhpbnMpIHtcbiAgLy8gVE9ETzogY2hhbmdlIHR5cGUgdG8gYmVjb21lIFZnU3BlY1xuXG4gIC8vIENvbmZpZyB3aXRoIFZlZ2EtTGl0ZSBvbmx5IGNvbmZpZyByZW1vdmVkLlxuICBjb25zdCB2Z0NvbmZpZyA9IG1vZGVsLmNvbmZpZyA/IHN0cmlwQW5kUmVkaXJlY3RDb25maWcobW9kZWwuY29uZmlnKSA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBkYXRhID0gW10uY29uY2F0KFxuICAgIG1vZGVsLmFzc2VtYmxlU2VsZWN0aW9uRGF0YShbXSksXG4gICAgLy8gb25seSBhc3NlbWJsZSBkYXRhIGluIHRoZSByb290XG4gICAgYXNzZW1ibGVSb290RGF0YShtb2RlbC5jb21wb25lbnQuZGF0YSwgdG9wTGV2ZWxQcm9wZXJ0aWVzLmRhdGFzZXRzIHx8IHt9KVxuICApO1xuXG4gIGRlbGV0ZSB0b3BMZXZlbFByb3BlcnRpZXMuZGF0YXNldHM7XG5cbiAgY29uc3QgcHJvamVjdGlvbnMgPSBtb2RlbC5hc3NlbWJsZVByb2plY3Rpb25zKCk7XG4gIGNvbnN0IHRpdGxlID0gbW9kZWwuYXNzZW1ibGVUaXRsZSgpO1xuICBjb25zdCBzdHlsZSA9IG1vZGVsLmFzc2VtYmxlR3JvdXBTdHlsZSgpO1xuXG4gIGxldCBsYXlvdXRTaWduYWxzID0gbW9kZWwuYXNzZW1ibGVMYXlvdXRTaWduYWxzKCk7XG5cbiAgLy8gbW92ZSB3aWR0aCBhbmQgaGVpZ2h0IHNpZ25hbHMgd2l0aCB2YWx1ZXMgdG8gdG9wIGxldmVsXG4gIGxheW91dFNpZ25hbHMgPSBsYXlvdXRTaWduYWxzLmZpbHRlcihzaWduYWwgPT4ge1xuICAgIGlmICgoc2lnbmFsLm5hbWUgPT09ICd3aWR0aCcgfHwgc2lnbmFsLm5hbWUgPT09ICdoZWlnaHQnKSAmJiBzaWduYWwudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdG9wTGV2ZWxQcm9wZXJ0aWVzW3NpZ25hbC5uYW1lXSA9ICtzaWduYWwudmFsdWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgJHNjaGVtYTogJ2h0dHBzOi8vdmVnYS5naXRodWIuaW8vc2NoZW1hL3ZlZ2EvdjMuanNvbicsXG4gICAgLi4uKG1vZGVsLmRlc2NyaXB0aW9uID8ge2Rlc2NyaXB0aW9uOiBtb2RlbC5kZXNjcmlwdGlvbn0gOiB7fSksXG4gICAgLi4udG9wTGV2ZWxQcm9wZXJ0aWVzLFxuICAgIC4uLih0aXRsZT8ge3RpdGxlfSA6IHt9KSxcbiAgICAuLi4oc3R5bGU/IHtzdHlsZX0gOiB7fSksXG4gICAgZGF0YTogZGF0YSxcbiAgICAuLi4ocHJvamVjdGlvbnMubGVuZ3RoID4gMCA/IHtwcm9qZWN0aW9uczogcHJvamVjdGlvbnN9IDoge30pLFxuICAgIC4uLm1vZGVsLmFzc2VtYmxlR3JvdXAoW1xuICAgICAgLi4ubGF5b3V0U2lnbmFscyxcbiAgICAgIC4uLm1vZGVsLmFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKFtdKVxuICAgIF0pLFxuICAgIC4uLih2Z0NvbmZpZyA/IHtjb25maWc6IHZnQ29uZmlnfSA6IHt9KVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgc3BlYzogb3V0cHV0XG4gICAgLy8gVE9ETzogYWRkIHdhcm5pbmcgLyBlcnJvcnMgaGVyZVxuICB9O1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/concat.d.ts b/build/src/compile/concat.d.ts new file mode 100644 index 0000000000..880db72384 --- /dev/null +++ b/build/src/compile/concat.d.ts @@ -0,0 +1,15 @@ +import { Config } from '../config'; +import { NormalizedConcatSpec } from '../spec'; +import { VgLayout } from '../vega.schema'; +import { BaseConcatModel } from './baseconcat'; +import { Model } from './model'; +import { RepeaterValue } from './repeater'; +export declare class ConcatModel extends BaseConcatModel { + readonly type: 'concat'; + readonly children: Model[]; + readonly isVConcat: boolean; + constructor(spec: NormalizedConcatSpec, parent: Model, parentGivenName: string, repeater: RepeaterValue, config: Config); + parseLayoutSize(): void; + parseAxisGroup(): void; + assembleLayout(): VgLayout; +} diff --git a/build/src/compile/concat.js b/build/src/compile/concat.js new file mode 100644 index 0000000000..3135d16b76 --- /dev/null +++ b/build/src/compile/concat.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../log")); +var spec_1 = require("../spec"); +var baseconcat_1 = require("./baseconcat"); +var buildmodel_1 = require("./buildmodel"); +var parse_1 = require("./layoutsize/parse"); +var ConcatModel = /** @class */ (function (_super) { + tslib_1.__extends(ConcatModel, _super); + function ConcatModel(spec, parent, parentGivenName, repeater, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'concat'; + if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) { + log.warn(log.message.CONCAT_CANNOT_SHARE_AXIS); + } + _this.isVConcat = spec_1.isVConcatSpec(spec); + _this.children = (spec_1.isVConcatSpec(spec) ? spec.vconcat : spec.hconcat).map(function (child, i) { + return buildmodel_1.buildModel(child, _this, _this.getName('concat_' + i), undefined, repeater, config, false); + }); + return _this; + } + ConcatModel.prototype.parseLayoutSize = function () { + parse_1.parseConcatLayoutSize(this); + }; + ConcatModel.prototype.parseAxisGroup = function () { + return null; + }; + ConcatModel.prototype.assembleLayout = function () { + // TODO: allow customization + return tslib_1.__assign({ padding: { row: 10, column: 10 }, offset: 10 }, (this.isVConcat ? { columns: 1 } : {}), { bounds: 'full', + // Use align each so it can work with multiple plots with different size + align: 'each' }); + }; + return ConcatModel; +}(baseconcat_1.BaseConcatModel)); +exports.ConcatModel = ConcatModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtEQUE4QjtBQUM5QixnQ0FBNEQ7QUFFNUQsMkNBQTZDO0FBQzdDLDJDQUF3QztBQUN4Qyw0Q0FBeUQ7QUFJekQ7SUFBaUMsdUNBQWU7SUFPOUMscUJBQVksSUFBMEIsRUFBRSxNQUFhLEVBQUUsZUFBdUIsRUFBRSxRQUF1QixFQUFFLE1BQWM7UUFBdkgsWUFDRSxrQkFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FXckU7UUFsQmUsVUFBSSxHQUFhLFFBQVEsQ0FBQztRQVN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRTtZQUMvRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNoRDtRQUVELEtBQUksQ0FBQyxTQUFTLEdBQUcsb0JBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxLQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsb0JBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9FLE9BQU8sdUJBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSSxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQyxDQUFDOztJQUNMLENBQUM7SUFFTSxxQ0FBZSxHQUF0QjtRQUNFLDZCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFHTSxvQ0FBYyxHQUFyQjtRQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLG9DQUFjLEdBQXJCO1FBQ0UsNEJBQTRCO1FBQzVCLDBCQUNFLE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxFQUM5QixNQUFNLEVBQUUsRUFBRSxJQUNQLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUN2QyxNQUFNLEVBQUUsTUFBTTtZQUNkLHdFQUF3RTtZQUN4RSxLQUFLLEVBQUUsTUFBTSxJQUNiO0lBQ0osQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQXpDRCxDQUFpQyw0QkFBZSxHQXlDL0M7QUF6Q1ksa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtpc1ZDb25jYXRTcGVjLCBOb3JtYWxpemVkQ29uY2F0U3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge1ZnTGF5b3V0fSBmcm9tICcuLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0Jhc2VDb25jYXRNb2RlbH0gZnJvbSAnLi9iYXNlY29uY2F0JztcbmltcG9ydCB7YnVpbGRNb2RlbH0gZnJvbSAnLi9idWlsZG1vZGVsJztcbmltcG9ydCB7cGFyc2VDb25jYXRMYXlvdXRTaXplfSBmcm9tICcuL2xheW91dHNpemUvcGFyc2UnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1JlcGVhdGVyVmFsdWV9IGZyb20gJy4vcmVwZWF0ZXInO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0TW9kZWwgZXh0ZW5kcyBCYXNlQ29uY2F0TW9kZWwge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogJ2NvbmNhdCcgPSAnY29uY2F0JztcblxuICBwdWJsaWMgcmVhZG9ubHkgY2hpbGRyZW46IE1vZGVsW107XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzVkNvbmNhdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzcGVjOiBOb3JtYWxpemVkQ29uY2F0U3BlYywgcGFyZW50OiBNb2RlbCwgcGFyZW50R2l2ZW5OYW1lOiBzdHJpbmcsIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlLCBjb25maWc6IENvbmZpZykge1xuICAgIHN1cGVyKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCBjb25maWcsIHJlcGVhdGVyLCBzcGVjLnJlc29sdmUpO1xuXG4gICAgaWYgKHNwZWMucmVzb2x2ZSAmJiBzcGVjLnJlc29sdmUuYXhpcyAmJiAoc3BlYy5yZXNvbHZlLmF4aXMueCA9PT0gJ3NoYXJlZCcgfHwgc3BlYy5yZXNvbHZlLmF4aXMueSA9PT0gJ3NoYXJlZCcpKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5DT05DQVRfQ0FOTk9UX1NIQVJFX0FYSVMpO1xuICAgIH1cblxuICAgIHRoaXMuaXNWQ29uY2F0ID0gaXNWQ29uY2F0U3BlYyhzcGVjKTtcblxuICAgIHRoaXMuY2hpbGRyZW4gPSAoaXNWQ29uY2F0U3BlYyhzcGVjKSA/IHNwZWMudmNvbmNhdCA6IHNwZWMuaGNvbmNhdCkubWFwKChjaGlsZCwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGJ1aWxkTW9kZWwoY2hpbGQsIHRoaXMsIHRoaXMuZ2V0TmFtZSgnY29uY2F0XycgKyBpKSwgdW5kZWZpbmVkLCByZXBlYXRlciwgY29uZmlnLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYXlvdXRTaXplKCkge1xuICAgIHBhcnNlQ29uY2F0TGF5b3V0U2l6ZSh0aGlzKTtcbiAgfVxuXG5cbiAgcHVibGljIHBhcnNlQXhpc0dyb3VwKCk6IHZvaWQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0KCk6IFZnTGF5b3V0IHtcbiAgICAvLyBUT0RPOiBhbGxvdyBjdXN0b21pemF0aW9uXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZGRpbmc6IHtyb3c6IDEwLCBjb2x1bW46IDEwfSxcbiAgICAgIG9mZnNldDogMTAsXG4gICAgICAuLi4odGhpcy5pc1ZDb25jYXQgPyB7Y29sdW1uczogMX0gOiB7fSksXG4gICAgICBib3VuZHM6ICdmdWxsJyxcbiAgICAgIC8vIFVzZSBhbGlnbiBlYWNoIHNvIGl0IGNhbiB3b3JrIHdpdGggbXVsdGlwbGUgcGxvdHMgd2l0aCBkaWZmZXJlbnQgc2l6ZVxuICAgICAgYWxpZ246ICdlYWNoJ1xuICAgIH07XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/data/aggregate.d.ts b/build/src/compile/data/aggregate.d.ts new file mode 100644 index 0000000000..c8e32dd660 --- /dev/null +++ b/build/src/compile/data/aggregate.d.ts @@ -0,0 +1,25 @@ +import { AggregateOp } from 'vega'; +import { AggregateTransform } from '../../transform'; +import { Dict, StringSet } from '../../util'; +import { VgAggregateTransform } from '../../vega.schema'; +import { UnitModel } from './../unit'; +import { DataFlowNode } from './dataflow'; +export declare class AggregateNode extends DataFlowNode { + private dimensions; + private measures; + clone(): AggregateNode; + /** + * @param dimensions string set for dimensions + * @param measures dictionary mapping field name => dict of aggregation functions and names to use + */ + constructor(parent: DataFlowNode, dimensions: StringSet, measures: Dict<{ + [key in AggregateOp]?: string; + }>); + static makeFromEncoding(parent: DataFlowNode, model: UnitModel): AggregateNode; + static makeFromTransform(parent: DataFlowNode, t: AggregateTransform): AggregateNode; + merge(other: AggregateNode): void; + addDimensions(fields: string[]): void; + dependentFields(): {}; + producedFields(): {}; + assemble(): VgAggregateTransform; +} diff --git a/build/src/compile/data/aggregate.js b/build/src/compile/data/aggregate.js new file mode 100644 index 0000000000..df668b3221 --- /dev/null +++ b/build/src/compile/data/aggregate.js @@ -0,0 +1,176 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var dataflow_1 = require("./dataflow"); +function addDimension(dims, channel, fieldDef) { + if (fieldDef.bin) { + dims[fielddef_1.vgField(fieldDef, {})] = true; + dims[fielddef_1.vgField(fieldDef, { binSuffix: 'end' })] = true; + if (common_1.binRequiresRange(fieldDef, channel)) { + dims[fielddef_1.vgField(fieldDef, { binSuffix: 'range' })] = true; + } + } + else { + dims[fielddef_1.vgField(fieldDef)] = true; + } + return dims; +} +function mergeMeasures(parentMeasures, childMeasures) { + for (var f in childMeasures) { + if (childMeasures.hasOwnProperty(f)) { + // when we merge a measure, we either have to add an aggregation operator or even a new field + var ops = childMeasures[f]; + for (var op in ops) { + if (ops.hasOwnProperty(op)) { + if (f in parentMeasures) { + // add operator to existing measure field + parentMeasures[f][op] = ops[op]; + } + else { + parentMeasures[f] = { op: ops[op] }; + } + } + } + } + } +} +var AggregateNode = /** @class */ (function (_super) { + tslib_1.__extends(AggregateNode, _super); + /** + * @param dimensions string set for dimensions + * @param measures dictionary mapping field name => dict of aggregation functions and names to use + */ + function AggregateNode(parent, dimensions, measures) { + var _this = _super.call(this, parent) || this; + _this.dimensions = dimensions; + _this.measures = measures; + return _this; + } + AggregateNode.prototype.clone = function () { + return new AggregateNode(null, tslib_1.__assign({}, this.dimensions), util_1.duplicate(this.measures)); + }; + AggregateNode.makeFromEncoding = function (parent, model) { + var isAggregate = false; + model.forEachFieldDef(function (fd) { + if (fd.aggregate) { + isAggregate = true; + } + }); + var meas = {}; + var dims = {}; + if (!isAggregate) { + // no need to create this node if the model has no aggregation + return null; + } + model.forEachFieldDef(function (fieldDef, channel) { + var aggregate = fieldDef.aggregate, field = fieldDef.field; + if (aggregate) { + if (aggregate === 'count') { + meas['*'] = meas['*'] || {}; + meas['*']['count'] = fielddef_1.vgField(fieldDef); + } + else { + meas[field] = meas[field] || {}; + meas[field][aggregate] = fielddef_1.vgField(fieldDef); + // For scale channel with domain === 'unaggregated', add min/max so we can use their union as unaggregated domain + if (channel_1.isScaleChannel(channel) && model.scaleDomain(channel) === 'unaggregated') { + meas[field]['min'] = fielddef_1.vgField({ field: field, aggregate: 'min' }); + meas[field]['max'] = fielddef_1.vgField({ field: field, aggregate: 'max' }); + } + } + } + else { + addDimension(dims, channel, fieldDef); + } + }); + if ((util_1.keys(dims).length + util_1.keys(meas).length) === 0) { + return null; + } + return new AggregateNode(parent, dims, meas); + }; + AggregateNode.makeFromTransform = function (parent, t) { + var dims = {}; + var meas = {}; + for (var _i = 0, _a = t.aggregate; _i < _a.length; _i++) { + var s = _a[_i]; + var op = s.op, field = s.field, as = s.as; + if (op) { + if (op === 'count') { + meas['*'] = meas['*'] || {}; + meas['*']['count'] = as || fielddef_1.vgField(s); + } + else { + meas[field] = meas[field] || {}; + meas[field][op] = as || fielddef_1.vgField(s); + } + } + } + for (var _b = 0, _c = t.groupby || []; _b < _c.length; _b++) { + var s = _c[_b]; + dims[s] = true; + } + if ((util_1.keys(dims).length + util_1.keys(meas).length) === 0) { + return null; + } + return new AggregateNode(parent, dims, meas); + }; + AggregateNode.prototype.merge = function (other) { + if (!util_1.differ(this.dimensions, other.dimensions)) { + mergeMeasures(this.measures, other.measures); + other.remove(); + } + else { + log.debug('different dimensions, cannot merge'); + } + }; + AggregateNode.prototype.addDimensions = function (fields) { + var _this = this; + fields.forEach(function (f) { return _this.dimensions[f] = true; }); + }; + AggregateNode.prototype.dependentFields = function () { + var out = {}; + util_1.keys(this.dimensions).forEach(function (f) { return out[f] = true; }); + util_1.keys(this.measures).forEach(function (m) { return out[m] = true; }); + return out; + }; + AggregateNode.prototype.producedFields = function () { + var _this = this; + var out = {}; + util_1.keys(this.measures).forEach(function (field) { + util_1.keys(_this.measures[field]).forEach(function (op) { + out[op + "_" + field] = true; + }); + }); + return out; + }; + AggregateNode.prototype.assemble = function () { + var ops = []; + var fields = []; + var as = []; + for (var _i = 0, _a = util_1.keys(this.measures); _i < _a.length; _i++) { + var field = _a[_i]; + for (var _b = 0, _c = util_1.keys(this.measures[field]); _b < _c.length; _b++) { + var op = _c[_b]; + as.push(this.measures[field][op]); + ops.push(op); + fields.push(field); + } + } + var result = { + type: 'aggregate', + groupby: util_1.keys(this.dimensions), + ops: ops, + fields: fields, + as: as + }; + return result; + }; + return AggregateNode; +}(dataflow_1.DataFlowNode)); +exports.AggregateNode = AggregateNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9hZ2dyZWdhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEseUNBQXNEO0FBQ3RELDJDQUFpRDtBQUNqRCxxREFBaUM7QUFFakMsbUNBQW9FO0FBRXBFLG9DQUEyQztBQUUzQyx1Q0FBd0M7QUFFeEMsc0JBQXNCLElBQWdDLEVBQUUsT0FBZ0IsRUFBRSxRQUEwQjtJQUNsRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDaEIsSUFBSSxDQUFDLGtCQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRW5ELElBQUkseUJBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3REO0tBQ0Y7U0FBTTtRQUNMLElBQUksQ0FBQyxrQkFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ2hDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsdUJBQXVCLGNBQWtDLEVBQUUsYUFBaUM7SUFDMUYsS0FBSyxJQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDN0IsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ25DLDZGQUE2RjtZQUM3RixJQUFNLEdBQUcsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsS0FBSyxJQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUU7Z0JBQ3BCLElBQUksR0FB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QUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM5QixHQUFHLEtBQUE7WUFDSCxNQUFNLFFBQUE7WUFDTixFQUFFLElBQUE7U0FDSCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTlJRCxDQUFtQyx1QkFBWSxHQThJOUM7QUE5SVksc0NBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FnZ3JlZ2F0ZU9wfSBmcm9tICd2ZWdhJztcblxuaW1wb3J0IHtDaGFubmVsLCBpc1NjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCB2Z0ZpZWxkfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7QWdncmVnYXRlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtEaWN0LCBkaWZmZXIsIGR1cGxpY2F0ZSwga2V5cywgU3RyaW5nU2V0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdBZ2dyZWdhdGVUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YmluUmVxdWlyZXNSYW5nZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLy4uL3VuaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5mdW5jdGlvbiBhZGREaW1lbnNpb24oZGltczoge1tmaWVsZDogc3RyaW5nXTogYm9vbGVhbn0sIGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+KSB7XG4gIGlmIChmaWVsZERlZi5iaW4pIHtcbiAgICBkaW1zW3ZnRmllbGQoZmllbGREZWYsIHt9KV0gPSB0cnVlO1xuICAgIGRpbXNbdmdGaWVsZChmaWVsZERlZiwge2JpblN1ZmZpeDogJ2VuZCd9KV0gPSB0cnVlO1xuXG4gICAgaWYgKGJpblJlcXVpcmVzUmFuZ2UoZmllbGREZWYsIGNoYW5uZWwpKSB7XG4gICAgICBkaW1zW3ZnRmllbGQoZmllbGREZWYsIHtiaW5TdWZmaXg6ICdyYW5nZSd9KV0gPSB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBkaW1zW3ZnRmllbGQoZmllbGREZWYpXSA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIGRpbXM7XG59XG5cbmZ1bmN0aW9uIG1lcmdlTWVhc3VyZXMocGFyZW50TWVhc3VyZXM6IERpY3Q8RGljdDxzdHJpbmc+PiwgY2hpbGRNZWFzdXJlczogRGljdDxEaWN0PHN0cmluZz4+KSB7XG4gIGZvciAoY29uc3QgZiBpbiBjaGlsZE1lYXN1cmVzKSB7XG4gICAgaWYgKGNoaWxkTWVhc3VyZXMuaGFzT3duUHJvcGVydHkoZikpIHtcbiAgICAgIC8vIHdoZW4gd2UgbWVyZ2UgYSBtZWFzdXJlLCB3ZSBlaXRoZXIgaGF2ZSB0byBhZGQgYW4gYWdncmVnYXRpb24gb3BlcmF0b3Igb3IgZXZlbiBhIG5ldyBmaWVsZFxuICAgICAgY29uc3Qgb3BzID0gY2hpbGRNZWFzdXJlc1tmXTtcbiAgICAgIGZvciAoY29uc3Qgb3AgaW4gb3BzKSB7XG4gICAgICAgIGlmIChvcHMuaGFzT3duUHJvcGVydHkob3ApKSB7XG4gICAgICAgICAgaWYgKGYgaW4gcGFyZW50TWVhc3VyZXMpIHtcbiAgICAgICAgICAgIC8vIGFkZCBvcGVyYXRvciB0byBleGlzdGluZyBtZWFzdXJlIGZpZWxkXG4gICAgICAgICAgICBwYXJlbnRNZWFzdXJlc1tmXVtvcF0gPSBvcHNbb3BdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXJlbnRNZWFzdXJlc1tmXSA9IHtvcDogb3BzW29wXX07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZ2dyZWdhdGVOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQWdncmVnYXRlTm9kZShudWxsLCB7Li4udGhpcy5kaW1lbnNpb25zfSwgZHVwbGljYXRlKHRoaXMubWVhc3VyZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gZGltZW5zaW9ucyBzdHJpbmcgc2V0IGZvciBkaW1lbnNpb25zXG4gICAqIEBwYXJhbSBtZWFzdXJlcyBkaWN0aW9uYXJ5IG1hcHBpbmcgZmllbGQgbmFtZSA9PiBkaWN0IG9mIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9ucyBhbmQgbmFtZXMgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBkaW1lbnNpb25zOiBTdHJpbmdTZXQsIHByaXZhdGUgbWVhc3VyZXM6IERpY3Q8e1trZXkgaW4gQWdncmVnYXRlT3BdPzogc3RyaW5nfT4pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbUVuY29kaW5nKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogVW5pdE1vZGVsKTogQWdncmVnYXRlTm9kZSB7XG4gICAgbGV0IGlzQWdncmVnYXRlID0gZmFsc2U7XG4gICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKGZkID0+IHtcbiAgICAgIGlmIChmZC5hZ2dyZWdhdGUpIHtcbiAgICAgICAgaXNBZ2dyZWdhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgbWVhcyA9IHt9O1xuICAgIGNvbnN0IGRpbXMgPSB7fTtcblxuICAgIGlmICghaXNBZ2dyZWdhdGUpIHtcbiAgICAgIC8vIG5vIG5lZWQgdG8gY3JlYXRlIHRoaXMgbm9kZSBpZiB0aGUgbW9kZWwgaGFzIG5vIGFnZ3JlZ2F0aW9uXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBtb2RlbC5mb3JFYWNoRmllbGREZWYoKGZpZWxkRGVmLCBjaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCB7YWdncmVnYXRlLCBmaWVsZH0gPSBmaWVsZERlZjtcbiAgICAgIGlmIChhZ2dyZWdhdGUpIHtcbiAgICAgICAgaWYgKGFnZ3JlZ2F0ZSA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgIG1lYXNbJyonXSA9IG1lYXNbJyonXSB8fCB7fTtcbiAgICAgICAgICBtZWFzWycqJ11bJ2NvdW50J10gPSB2Z0ZpZWxkKGZpZWxkRGVmKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZWFzW2ZpZWxkXSA9IG1lYXNbZmllbGRdIHx8IHt9O1xuICAgICAgICAgIG1lYXNbZmllbGRdW2FnZ3JlZ2F0ZV0gPSB2Z0ZpZWxkKGZpZWxkRGVmKTtcblxuICAgICAgICAgIC8vIEZvciBzY2FsZSBjaGFubmVsIHdpdGggZG9tYWluID09PSAndW5hZ2dyZWdhdGVkJywgYWRkIG1pbi9tYXggc28gd2UgY2FuIHVzZSB0aGVpciB1bmlvbiBhcyB1bmFnZ3JlZ2F0ZWQgZG9tYWluXG4gICAgICAgICAgaWYgKGlzU2NhbGVDaGFubmVsKGNoYW5uZWwpICYmIG1vZGVsLnNjYWxlRG9tYWluKGNoYW5uZWwpID09PSAndW5hZ2dyZWdhdGVkJykge1xuICAgICAgICAgICAgbWVhc1tmaWVsZF1bJ21pbiddID0gdmdGaWVsZCh7ZmllbGQsIGFnZ3JlZ2F0ZTogJ21pbid9KTtcbiAgICAgICAgICAgIG1lYXNbZmllbGRdWydtYXgnXSA9IHZnRmllbGQoe2ZpZWxkLCBhZ2dyZWdhdGU6ICdtYXgnfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhZGREaW1lbnNpb24oZGltcywgY2hhbm5lbCwgZmllbGREZWYpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKChrZXlzKGRpbXMpLmxlbmd0aCArIGtleXMobWVhcykubGVuZ3RoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVOb2RlKHBhcmVudCwgZGltcywgbWVhcyk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1ha2VGcm9tVHJhbnNmb3JtKHBhcmVudDogRGF0YUZsb3dOb2RlLCB0OiBBZ2dyZWdhdGVUcmFuc2Zvcm0pOiBBZ2dyZWdhdGVOb2RlIHtcbiAgICBjb25zdCBkaW1zID0ge307XG4gICAgY29uc3QgbWVhcyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzIG9mIHQuYWdncmVnYXRlKSB7XG4gICAgICBjb25zdCB7b3AsIGZpZWxkLCBhc30gPSBzO1xuICAgICAgaWYgKG9wKSB7XG4gICAgICAgIGlmIChvcCA9PT0gJ2NvdW50Jykge1xuICAgICAgICAgIG1lYXNbJyonXSA9IG1lYXNbJyonXSB8fCB7fTtcbiAgICAgICAgICBtZWFzWycqJ11bJ2NvdW50J10gPSBhcyB8fCB2Z0ZpZWxkKHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lYXNbZmllbGRdID0gbWVhc1tmaWVsZF0gfHwge307XG4gICAgICAgICAgbWVhc1tmaWVsZF1bb3BdID0gYXMgfHwgdmdGaWVsZChzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgcyBvZiB0Lmdyb3VwYnkgfHwgW10pIHtcbiAgICAgIGRpbXNbc10gPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICgoa2V5cyhkaW1zKS5sZW5ndGggKyBrZXlzKG1lYXMpLmxlbmd0aCkgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQWdncmVnYXRlTm9kZShwYXJlbnQsIGRpbXMsIG1lYXMpO1xuICB9XG5cbiAgcHVibGljIG1lcmdlKG90aGVyOiBBZ2dyZWdhdGVOb2RlKSB7XG4gICAgaWYgKCFkaWZmZXIodGhpcy5kaW1lbnNpb25zLCBvdGhlci5kaW1lbnNpb25zKSkge1xuICAgICAgbWVyZ2VNZWFzdXJlcyh0aGlzLm1lYXN1cmVzLCBvdGhlci5tZWFzdXJlcyk7XG4gICAgICBvdGhlci5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmRlYnVnKCdkaWZmZXJlbnQgZGltZW5zaW9ucywgY2Fubm90IG1lcmdlJyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZERpbWVuc2lvbnMoZmllbGRzOiBzdHJpbmdbXSkge1xuICAgIGZpZWxkcy5mb3JFYWNoKGYgPT4gdGhpcy5kaW1lbnNpb25zW2ZdID0gdHJ1ZSk7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kZW50RmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAga2V5cyh0aGlzLmRpbWVuc2lvbnMpLmZvckVhY2goZiA9PiBvdXRbZl0gPSB0cnVlKTtcbiAgICBrZXlzKHRoaXMubWVhc3VyZXMpLmZvckVhY2gobSA9PiBvdXRbbV0gPSB0cnVlKTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICBrZXlzKHRoaXMubWVhc3VyZXMpLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAga2V5cyh0aGlzLm1lYXN1cmVzW2ZpZWxkXSkuZm9yRWFjaChvcCA9PiB7XG4gICAgICAgIG91dFtgJHtvcH1fJHtmaWVsZH1gXSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdBZ2dyZWdhdGVUcmFuc2Zvcm0ge1xuICAgIGNvbnN0IG9wczogQWdncmVnYXRlT3BbXSA9IFtdO1xuICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyh0aGlzLm1lYXN1cmVzKSkge1xuICAgICAgZm9yIChjb25zdCBvcCBvZiBrZXlzKHRoaXMubWVhc3VyZXNbZmllbGRdKSkge1xuICAgICAgICBhcy5wdXNoKHRoaXMubWVhc3VyZXNbZmllbGRdW29wXSk7XG4gICAgICAgIG9wcy5wdXNoKG9wKTtcbiAgICAgICAgZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdDogVmdBZ2dyZWdhdGVUcmFuc2Zvcm0gPSB7XG4gICAgICB0eXBlOiAnYWdncmVnYXRlJyxcbiAgICAgIGdyb3VwYnk6IGtleXModGhpcy5kaW1lbnNpb25zKSxcbiAgICAgIG9wcyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIGFzXG4gICAgfTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/data/assemble.d.ts b/build/src/compile/data/assemble.d.ts new file mode 100644 index 0000000000..4fd4663897 --- /dev/null +++ b/build/src/compile/data/assemble.d.ts @@ -0,0 +1,17 @@ +import { InlineDataset } from '../../data'; +import { Dict } from '../../util'; +import { VgData } from '../../vega.schema'; +import { DataComponent } from './'; +import { FacetNode } from './facet'; +/** + * Assemble data sources that are derived from faceted data. + */ +export declare function assembleFacetData(root: FacetNode): VgData[]; +/** + * Create Vega Data array from a given compiled model and append all of them to the given array + * + * @param model + * @param data array + * @return modified data array + */ +export declare function assembleRootData(dataComponent: DataComponent, datasets: Dict): VgData[]; diff --git a/build/src/compile/data/assemble.js b/build/src/compile/data/assemble.js new file mode 100644 index 0000000000..edb9fc4a81 --- /dev/null +++ b/build/src/compile/data/assemble.js @@ -0,0 +1,233 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var data_1 = require("../../data"); +var util_1 = require("../../util"); +var aggregate_1 = require("./aggregate"); +var bin_1 = require("./bin"); +var calculate_1 = require("./calculate"); +var dataflow_1 = require("./dataflow"); +var facet_1 = require("./facet"); +var filter_1 = require("./filter"); +var filterinvalid_1 = require("./filterinvalid"); +var formatparse_1 = require("./formatparse"); +var geojson_1 = require("./geojson"); +var geopoint_1 = require("./geopoint"); +var indentifier_1 = require("./indentifier"); +var lookup_1 = require("./lookup"); +var source_1 = require("./source"); +var stack_1 = require("./stack"); +var timeunit_1 = require("./timeunit"); +var window_1 = require("./window"); +/** + * Print debug information for dataflow tree. + */ +// tslint:disable-next-line +function debug(node) { + console.log("" + node.constructor.name + (node.debugName ? " (" + node.debugName + ")" : '') + " -> " + (node.children.map(function (c) { + return "" + c.constructor.name + (c.debugName ? " (" + c.debugName + ")" : ''); + }))); + console.log(node); + node.children.forEach(debug); +} +function makeWalkTree(data) { + // to name datasources + var datasetIndex = 0; + /** + * Recursively walk down the tree. + */ + function walkTree(node, dataSource) { + if (node instanceof source_1.SourceNode) { + // If the source is a named data source or a data source with values, we need + // to put it in a different data source. Otherwise, Vega may override the data. + if (!data_1.isUrlData(node.data)) { + data.push(dataSource); + var newData = { + name: null, + source: dataSource.name, + transform: [] + }; + dataSource = newData; + } + } + if (node instanceof formatparse_1.ParseNode) { + if (node.parent instanceof source_1.SourceNode && !dataSource.source) { + // If node's parent is a root source and the data source does not refer to another data source, use normal format parse + dataSource.format = tslib_1.__assign({}, dataSource.format || {}, { parse: node.assembleFormatParse() }); + // add calculates for all nested fields + dataSource.transform = dataSource.transform.concat(node.assembleTransforms(true)); + } + else { + // Otherwise use Vega expression to parse + dataSource.transform = dataSource.transform.concat(node.assembleTransforms()); + } + } + if (node instanceof facet_1.FacetNode) { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + if (!dataSource.source || dataSource.transform.length > 0) { + data.push(dataSource); + node.data = dataSource.name; + } + else { + node.data = dataSource.source; + } + node.assemble().forEach(function (d) { return data.push(d); }); + // break here because the rest of the tree has to be taken care of by the facet. + return; + } + if (node instanceof filter_1.FilterNode || + node instanceof calculate_1.CalculateNode || + node instanceof geopoint_1.GeoPointNode || + node instanceof geojson_1.GeoJSONNode || + node instanceof aggregate_1.AggregateNode || + node instanceof lookup_1.LookupNode || + node instanceof window_1.WindowTransformNode || + node instanceof indentifier_1.IdentifierNode) { + dataSource.transform.push(node.assemble()); + } + if (node instanceof filterinvalid_1.FilterInvalidNode || + node instanceof bin_1.BinNode || + node instanceof timeunit_1.TimeUnitNode || + node instanceof stack_1.StackNode) { + dataSource.transform = dataSource.transform.concat(node.assemble()); + } + if (node instanceof aggregate_1.AggregateNode) { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + } + if (node instanceof dataflow_1.OutputNode) { + if (dataSource.source && dataSource.transform.length === 0) { + node.setSource(dataSource.source); + } + else if (node.parent instanceof dataflow_1.OutputNode) { + // Note that an output node may be required but we still do not assemble a + // separate data source for it. + node.setSource(dataSource.name); + } + else { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + // Here we set the name of the datasource we generated. From now on + // other assemblers can use it. + node.setSource(dataSource.name); + // if this node has more than one child, we will add a datasource automatically + if (node.numChildren() === 1) { + data.push(dataSource); + var newData = { + name: null, + source: dataSource.name, + transform: [] + }; + dataSource = newData; + } + } + } + switch (node.numChildren()) { + case 0: + // done + if (node instanceof dataflow_1.OutputNode && (!dataSource.source || dataSource.transform.length > 0)) { + // do not push empty datasources that are simply references + data.push(dataSource); + } + break; + case 1: + walkTree(node.children[0], dataSource); + break; + default: + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + var source_2 = dataSource.name; + if (!dataSource.source || dataSource.transform.length > 0) { + data.push(dataSource); + } + else { + source_2 = dataSource.source; + } + node.children.forEach(function (child) { + var newData = { + name: null, + source: source_2, + transform: [] + }; + walkTree(child, newData); + }); + break; + } + } + return walkTree; +} +/** + * Assemble data sources that are derived from faceted data. + */ +function assembleFacetData(root) { + var data = []; + var walkTree = makeWalkTree(data); + root.children.forEach(function (child) { return walkTree(child, { + source: root.name, + name: null, + transform: [] + }); }); + return data; +} +exports.assembleFacetData = assembleFacetData; +/** + * Create Vega Data array from a given compiled model and append all of them to the given array + * + * @param model + * @param data array + * @return modified data array + */ +function assembleRootData(dataComponent, datasets) { + var roots = util_1.vals(dataComponent.sources); + var data = []; + // roots.forEach(debug); + var walkTree = makeWalkTree(data); + var sourceIndex = 0; + roots.forEach(function (root) { + // assign a name if the source does not have a name yet + if (!root.hasName()) { + root.dataName = "source_" + sourceIndex++; + } + var newData = root.assemble(); + walkTree(root, newData); + }); + // remove empty transform arrays for cleaner output + data.forEach(function (d) { + if (d.transform.length === 0) { + delete d.transform; + } + }); + // move sources without transforms (the ones that are potentially used in lookups) to the beginning + var whereTo = 0; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if ((d.transform || []).length === 0 && !d.source) { + data.splice(whereTo++, 0, data.splice(i, 1)[0]); + } + } + // now fix the from references in lookup transforms + for (var _i = 0, data_2 = data; _i < data_2.length; _i++) { + var d = data_2[_i]; + for (var _a = 0, _b = d.transform || []; _a < _b.length; _a++) { + var t = _b[_a]; + if (t.type === 'lookup') { + t.from = dataComponent.outputNodes[t.from].getSource(); + } + } + } + // inline values for datasets that are in the datastore + for (var _c = 0, data_3 = data; _c < data_3.length; _c++) { + var d = data_3[_c]; + if (d.name in datasets) { + d.values = datasets[d.name]; + } + } + return data; +} +exports.assembleRootData = assembleRootData; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvRDtBQUNwRCxtQ0FBc0M7QUFHdEMseUNBQTBDO0FBQzFDLDZCQUE4QjtBQUM5Qix5Q0FBMEM7QUFDMUMsdUNBQW9EO0FBQ3BELGlDQUFrQztBQUNsQyxtQ0FBb0M7QUFDcEMsaURBQWtEO0FBQ2xELDZDQUF3QztBQUN4QyxxQ0FBc0M7QUFDdEMsdUNBQXdDO0FBQ3hDLDZDQUE2QztBQUM3QyxtQ0FBb0M7QUFDcEMsbUNBQW9DO0FBQ3BDLGlDQUFrQztBQUNsQyx1Q0FBd0M7QUFDeEMsbUNBQTZDO0FBRTdDOztHQUVHO0FBQ0gsMkJBQTJCO0FBQzNCLGVBQWUsSUFBa0I7SUFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFJLElBQUksQ0FBQyxXQUFtQixDQUFDLElBQUksSUFBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFLLElBQUksQ0FBQyxTQUFTLE1BQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUMxRixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQztRQUNsQixPQUFPLEtBQUksQ0FBQyxDQUFDLFdBQW1CLENBQUMsSUFBSSxJQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQUssQ0FBQyxDQUFDLFNBQVMsTUFBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUUsQ0FBQztJQUNuRixDQUFDLENBQUMsQ0FDRixDQUFDLENBQUM7SUFDSixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRCxzQkFBc0IsSUFBYztJQUNsQyxzQkFBc0I7SUFDdEIsSUFBSSxZ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QXRERCw0Q0FzREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lubGluZURhdGFzZXQsIGlzVXJsRGF0YX0gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQge0RpY3QsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0RhdGF9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RGF0YUNvbXBvbmVudH0gZnJvbSAnLi8nO1xuaW1wb3J0IHtBZ2dyZWdhdGVOb2RlfSBmcm9tICcuL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge0Jpbk5vZGV9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2FsY3VsYXRlTm9kZX0gZnJvbSAnLi9jYWxjdWxhdGUnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGUsIE91dHB1dE5vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuaW1wb3J0IHtGYWNldE5vZGV9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtGaWx0ZXJOb2RlfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQge0ZpbHRlckludmFsaWROb2RlfSBmcm9tICcuL2ZpbHRlcmludmFsaWQnO1xuaW1wb3J0IHtQYXJzZU5vZGV9IGZyb20gJy4vZm9ybWF0cGFyc2UnO1xuaW1wb3J0IHtHZW9KU09OTm9kZX0gZnJvbSAnLi9nZW9qc29uJztcbmltcG9ydCB7R2VvUG9pbnROb2RlfSBmcm9tICcuL2dlb3BvaW50JztcbmltcG9ydCB7SWRlbnRpZmllck5vZGV9IGZyb20gJy4vaW5kZW50aWZpZXInO1xuaW1wb3J0IHtMb29rdXBOb2RlfSBmcm9tICcuL2xvb2t1cCc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7U3RhY2tOb2RlfSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7V2luZG93VHJhbnNmb3JtTm9kZX0gZnJvbSAnLi93aW5kb3cnO1xuXG4vKipcbiAqIFByaW50IGRlYnVnIGluZm9ybWF0aW9uIGZvciBkYXRhZmxvdyB0cmVlLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmZ1bmN0aW9uIGRlYnVnKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICBjb25zb2xlLmxvZyhgJHsobm9kZS5jb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWV9JHtub2RlLmRlYnVnTmFtZSA/IGAgKCR7bm9kZS5kZWJ1Z05hbWV9KWAgOiAnJ30gLT4gJHtcbiAgICAobm9kZS5jaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICByZXR1cm4gYCR7KGMuY29uc3RydWN0b3IgYXMgYW55KS5uYW1lfSR7Yy5kZWJ1Z05hbWUgPyBgICgke2MuZGVidWdOYW1lfSlgIDogJyd9YDtcbiAgICB9KSlcbiAgfWApO1xuICBjb25zb2xlLmxvZyhub2RlKTtcbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGRlYnVnKTtcbn1cblxuZnVuY3Rpb24gbWFrZVdhbGtUcmVlKGRhdGE6IFZnRGF0YVtdKSB7XG4gIC8vIHRvIG5hbWUgZGF0YXNvdXJjZXNcbiAgbGV0IGRhdGFzZXRJbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHdhbGsgZG93biB0aGUgdHJlZS5cbiAgICovXG4gIGZ1bmN0aW9uIHdhbGtUcmVlKG5vZGU6IERhdGFGbG93Tm9kZSwgZGF0YVNvdXJjZTogVmdEYXRhKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGEgbmFtZWQgZGF0YSBzb3VyY2Ugb3IgYSBkYXRhIHNvdXJjZSB3aXRoIHZhbHVlcywgd2UgbmVlZFxuICAgICAgLy8gdG8gcHV0IGl0IGluIGEgZGlmZmVyZW50IGRhdGEgc291cmNlLiBPdGhlcndpc2UsIFZlZ2EgbWF5IG92ZXJyaWRlIHRoZSBkYXRhLlxuICAgICAgaWYgKCFpc1VybERhdGEobm9kZS5kYXRhKSkge1xuICAgICAgICBkYXRhLnB1c2goZGF0YVNvdXJjZSk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGE6IFZnRGF0YSA9IHtcbiAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZS5uYW1lLFxuICAgICAgICAgIHRyYW5zZm9ybTogW11cbiAgICAgICAgfTtcbiAgICAgICAgZGF0YVNvdXJjZSA9IG5ld0RhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJzZU5vZGUpIHtcbiAgICAgIGlmIChub2RlLnBhcmVudCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUgJiYgIWRhdGFTb3VyY2Uuc291cmNlKSB7XG4gICAgICAgIC8vIElmIG5vZGUncyBwYXJlbnQgaXMgYSByb290IHNvdXJjZSBhbmQgdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IHJlZmVyIHRvIGFub3RoZXIgZGF0YSBzb3VyY2UsIHVzZSBub3JtYWwgZm9ybWF0IHBhcnNlXG4gICAgICAgIGRhdGFTb3VyY2UuZm9ybWF0ID0ge1xuICAgICAgICAgIC4uLmRhdGFTb3VyY2UuZm9ybWF0IHx8IHt9LFxuICAgICAgICAgIHBhcnNlOiBub2RlLmFzc2VtYmxlRm9ybWF0UGFyc2UoKVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGFkZCBjYWxjdWxhdGVzIGZvciBhbGwgbmVzdGVkIGZpZWxkc1xuICAgICAgICBkYXRhU291cmNlLnRyYW5zZm9ybSA9IGRhdGFTb3VyY2UudHJhbnNmb3JtLmNvbmNhdChub2RlLmFzc2VtYmxlVHJhbnNmb3Jtcyh0cnVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgdXNlIFZlZ2EgZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAgICBkYXRhU291cmNlLnRyYW5zZm9ybSA9IGRhdGFTb3VyY2UudHJhbnNmb3JtLmNvbmNhdChub2RlLmFzc2VtYmxlVHJhbnNmb3JtcygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEZhY2V0Tm9kZSkge1xuICAgICAgaWYgKCFkYXRhU291cmNlLm5hbWUpIHtcbiAgICAgICAgZGF0YVNvdXJjZS5uYW1lID0gYGRhdGFfJHtkYXRhc2V0SW5kZXgrK31gO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGFTb3VyY2Uuc291cmNlIHx8IGRhdGFTb3VyY2UudHJhbnNmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICBub2RlLmRhdGEgPSBkYXRhU291cmNlLm5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmRhdGEgPSBkYXRhU291cmNlLnNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5hc3NlbWJsZSgpLmZvckVhY2goZCA9PiBkYXRhLnB1c2goZCkpO1xuXG4gICAgICAvLyBicmVhayBoZXJlIGJlY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIHRyZWUgaGFzIHRvIGJlIHRha2VuIGNhcmUgb2YgYnkgdGhlIGZhY2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgRmlsdGVyTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIENhbGN1bGF0ZU5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBHZW9Qb2ludE5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBHZW9KU09OTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZU5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBMb29rdXBOb2RlIHx8XG4gICAgICBub2RlIGluc3RhbmNlb2YgV2luZG93VHJhbnNmb3JtTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIElkZW50aWZpZXJOb2RlKSB7XG4gICAgICBkYXRhU291cmNlLnRyYW5zZm9ybS5wdXNoKG5vZGUuYXNzZW1ibGUoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWx0ZXJJbnZhbGlkTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIEJpbk5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBUaW1lVW5pdE5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBTdGFja05vZGUpIHtcbiAgICAgIGRhdGFTb3VyY2UudHJhbnNmb3JtID0gZGF0YVNvdXJjZS50cmFuc2Zvcm0uY29uY2F0KG5vZGUuYXNzZW1ibGUoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBZ2dyZWdhdGVOb2RlKSB7XG4gICAgICBpZiAoIWRhdGFTb3VyY2UubmFtZSkge1xuICAgICAgICBkYXRhU291cmNlLm5hbWUgPSBgZGF0YV8ke2RhdGFzZXRJbmRleCsrfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPdXRwdXROb2RlKSB7XG4gICAgICBpZiAoZGF0YVNvdXJjZS5zb3VyY2UgJiYgZGF0YVNvdXJjZS50cmFuc2Zvcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5vZGUuc2V0U291cmNlKGRhdGFTb3VyY2Uuc291cmNlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaW5zdGFuY2VvZiBPdXRwdXROb2RlKSB7XG4gICAgICAgIC8vIE5vdGUgdGhhdCBhbiBvdXRwdXQgbm9kZSBtYXkgYmUgcmVxdWlyZWQgYnV0IHdlIHN0aWxsIGRvIG5vdCBhc3NlbWJsZSBhXG4gICAgICAgIC8vIHNlcGFyYXRlIGRhdGEgc291cmNlIGZvciBpdC5cbiAgICAgICAgbm9kZS5zZXRTb3VyY2UoZGF0YVNvdXJjZS5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghZGF0YVNvdXJjZS5uYW1lKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZS5uYW1lID0gYGRhdGFfJHtkYXRhc2V0SW5kZXgrK31gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGVyZSB3ZSBzZXQgdGhlIG5hbWUgb2YgdGhlIGRhdGFzb3VyY2Ugd2UgZ2VuZXJhdGVkLiBGcm9tIG5vdyBvblxuICAgICAgICAvLyBvdGhlciBhc3NlbWJsZXJzIGNhbiB1c2UgaXQuXG4gICAgICAgIG5vZGUuc2V0U291cmNlKGRhdGFTb3VyY2UubmFtZSk7XG5cbiAgICAgICAgLy8gaWYgdGhpcyBub2RlIGhhcyBtb3JlIHRoYW4gb25lIGNoaWxkLCB3ZSB3aWxsIGFkZCBhIGRhdGFzb3VyY2UgYXV0b21hdGljYWxseVxuICAgICAgICBpZiAobm9kZS5udW1DaGlsZHJlbigpID09PSAxKSB7XG4gICAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGE6IFZnRGF0YSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UubmFtZSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogW11cbiAgICAgICAgICB9O1xuICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXdEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLm51bUNoaWxkcmVuKCkpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gZG9uZVxuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE91dHB1dE5vZGUgJiYgKCFkYXRhU291cmNlLnNvdXJjZSB8fCBkYXRhU291cmNlLnRyYW5zZm9ybS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIC8vIGRvIG5vdCBwdXNoIGVtcHR5IGRhdGFzb3VyY2VzIHRoYXQgYXJlIHNpbXBseSByZWZlcmVuY2VzXG4gICAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB3YWxrVHJlZShub2RlLmNoaWxkcmVuWzBdLCBkYXRhU291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UubmFtZSkge1xuICAgICAgICAgIGRhdGFTb3VyY2UubmFtZSA9IGBkYXRhXyR7ZGF0YXNldEluZGV4Kyt9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3VyY2UgPSBkYXRhU291cmNlLm5hbWU7XG4gICAgICAgIGlmICghZGF0YVNvdXJjZS5zb3VyY2UgfHwgZGF0YVNvdXJjZS50cmFuc2Zvcm0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRhdGEucHVzaChkYXRhU291cmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2UgPSBkYXRhU291cmNlLnNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3RGF0YTogVmdEYXRhID0ge1xuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgd2Fsa1RyZWUoY2hpbGQsIG5ld0RhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdhbGtUcmVlO1xufVxuXG4vKipcbiAqIEFzc2VtYmxlIGRhdGEgc291cmNlcyB0aGF0IGFyZSBkZXJpdmVkIGZyb20gZmFjZXRlZCBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVGYWNldERhdGEocm9vdDogRmFjZXROb2RlKTogVmdEYXRhW10ge1xuICBjb25zdCBkYXRhOiBWZ0RhdGFbXSA9IFtdO1xuICBjb25zdCB3YWxrVHJlZSA9IG1ha2VXYWxrVHJlZShkYXRhKTtcblxuICByb290LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gd2Fsa1RyZWUoY2hpbGQsIHtcbiAgICBzb3VyY2U6IHJvb3QubmFtZSxcbiAgICBuYW1lOiBudWxsLFxuICAgIHRyYW5zZm9ybTogW11cbiAgfSkpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENyZWF0ZSBWZWdhIERhdGEgYXJyYXkgZnJvbSBhIGdpdmVuIGNvbXBpbGVkIG1vZGVsIGFuZCBhcHBlbmQgYWxsIG9mIHRoZW0gdG8gdGhlIGdpdmVuIGFycmF5XG4gKlxuICogQHBhcmFtICBtb2RlbFxuICogQHBhcmFtICBkYXRhIGFycmF5XG4gKiBAcmV0dXJuIG1vZGlmaWVkIGRhdGEgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlUm9vdERhdGEoZGF0YUNvbXBvbmVudDogRGF0YUNvbXBvbmVudCwgZGF0YXNldHM6IERpY3Q8SW5saW5lRGF0YXNldD4pOiBWZ0RhdGFbXSB7XG4gIGNvbnN0IHJvb3RzOiBTb3VyY2VOb2RlW10gPSB2YWxzKGRhdGFDb21wb25lbnQuc291cmNlcyk7XG4gIGNvbnN0IGRhdGE6IFZnRGF0YVtdID0gW107XG5cbiAgLy8gcm9vdHMuZm9yRWFjaChkZWJ1Zyk7XG5cbiAgY29uc3Qgd2Fsa1RyZWUgPSBtYWtlV2Fsa1RyZWUoZGF0YSk7XG5cbiAgbGV0IHNvdXJjZUluZGV4ID0gMDtcblxuICByb290cy5mb3JFYWNoKHJvb3QgPT4ge1xuICAgIC8vIGFzc2lnbiBhIG5hbWUgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBoYXZlIGEgbmFtZSB5ZXRcbiAgICBpZiAoIXJvb3QuaGFzTmFtZSgpKSB7XG4gICAgICByb290LmRhdGFOYW1lID0gYHNvdXJjZV8ke3NvdXJjZUluZGV4Kyt9YDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdEYXRhOiBWZ0RhdGEgPSByb290LmFzc2VtYmxlKCk7XG5cbiAgICB3YWxrVHJlZShyb290LCBuZXdEYXRhKTtcbiAgfSk7XG5cbiAgLy8gcmVtb3ZlIGVtcHR5IHRyYW5zZm9ybSBhcnJheXMgZm9yIGNsZWFuZXIgb3V0cHV0XG4gIGRhdGEuZm9yRWFjaChkID0+IHtcbiAgICBpZiAoZC50cmFuc2Zvcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgZC50cmFuc2Zvcm07XG4gICAgfVxuICB9KTtcblxuICAvLyBtb3ZlIHNvdXJjZXMgd2l0aG91dCB0cmFuc2Zvcm1zICh0aGUgb25lcyB0aGF0IGFyZSBwb3RlbnRpYWxseSB1c2VkIGluIGxvb2t1cHMpIHRvIHRoZSBiZWdpbm5pbmdcbiAgbGV0IHdoZXJlVG8gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkID0gZGF0YVtpXTtcbiAgICBpZiAoKGQudHJhbnNmb3JtIHx8IFtdKS5sZW5ndGggPT09IDAgJiYgIWQuc291cmNlKSB7XG4gICAgICBkYXRhLnNwbGljZSh3aGVyZVRvKyssIDAsIGRhdGEuc3BsaWNlKGksIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICAvLyBub3cgZml4IHRoZSBmcm9tIHJlZmVyZW5jZXMgaW4gbG9va3VwIHRyYW5zZm9ybXNcbiAgZm9yIChjb25zdCBkIG9mIGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZC50cmFuc2Zvcm0gfHwgW10pIHtcbiAgICAgIGlmICh0LnR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgIHQuZnJvbSA9IGRhdGFDb21wb25lbnQub3V0cHV0Tm9kZXNbdC5mcm9tXS5nZXRTb3VyY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpbmxpbmUgdmFsdWVzIGZvciBkYXRhc2V0cyB0aGF0IGFyZSBpbiB0aGUgZGF0YXN0b3JlXG4gIGZvciAoY29uc3QgZCBvZiBkYXRhKSB7XG4gICAgaWYgKGQubmFtZSBpbiBkYXRhc2V0cykge1xuICAgICAgZC52YWx1ZXMgPSBkYXRhc2V0c1tkLm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/bin.d.ts b/build/src/compile/data/bin.d.ts new file mode 100644 index 0000000000..8f3bd458f2 --- /dev/null +++ b/build/src/compile/data/bin.d.ts @@ -0,0 +1,30 @@ +import { BinParams } from '../../bin'; +import { BinTransform } from '../../transform'; +import { Dict } from '../../util'; +import { VgTransform } from '../../vega.schema'; +import { Model, ModelWithField } from '../model'; +import { DataFlowNode } from './dataflow'; +export interface BinComponent { + bin: BinParams; + field: string; + extentSignal?: string; + signal?: string; + as: string[]; + formula?: string; + formulaAs?: string; +} +export declare class BinNode extends DataFlowNode { + private bins; + clone(): BinNode; + constructor(parent: DataFlowNode, bins: Dict); + static makeFromEncoding(parent: DataFlowNode, model: ModelWithField): BinNode; + /** + * Creates a bin node from BinTransform. + * The optional parameter should provide + */ + static makeFromTransform(parent: DataFlowNode, t: BinTransform, model: Model): BinNode; + merge(other: BinNode): void; + producedFields(): {}; + dependentFields(): {}; + assemble(): VgTransform[]; +} diff --git a/build/src/compile/data/bin.js b/build/src/compile/data/bin.js new file mode 100644 index 0000000000..3ab03a9b3c --- /dev/null +++ b/build/src/compile/data/bin.js @@ -0,0 +1,127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var bin_1 = require("../../bin"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var model_1 = require("../model"); +var dataflow_1 = require("./dataflow"); +function rangeFormula(model, fieldDef, channel, config) { + if (common_1.binRequiresRange(fieldDef, channel)) { + // read format from axis or legend, if there is no format then use config.numberFormat + var guide = model_1.isUnitModel(model) ? (model.axis(channel) || model.legend(channel) || {}) : {}; + var startField = fielddef_1.vgField(fieldDef, { expr: 'datum', }); + var endField = fielddef_1.vgField(fieldDef, { expr: 'datum', binSuffix: 'end' }); + return { + formulaAs: fielddef_1.vgField(fieldDef, { binSuffix: 'range' }), + formula: common_1.binFormatExpression(startField, endField, guide.format, config) + }; + } + return {}; +} +function binKey(bin, field) { + return bin_1.binToString(bin) + "_" + field; +} +function getSignalsFromModel(model, key) { + return { + signal: model.getName(key + "_bins"), + extentSignal: model.getName(key + "_extent") + }; +} +function isBinTransform(t) { + return 'as' in t; +} +function createBinComponent(t, model) { + var as; + if (isBinTransform(t)) { + as = [t.as, t.as + "_end"]; + } + else { + as = [fielddef_1.vgField(t, {}), fielddef_1.vgField(t, { binSuffix: 'end' })]; + } + var bin = fielddef_1.normalizeBin(t.bin, undefined) || {}; + var key = binKey(bin, t.field); + var _a = getSignalsFromModel(model, key), signal = _a.signal, extentSignal = _a.extentSignal; + var binComponent = tslib_1.__assign({ bin: bin, field: t.field, as: as }, signal ? { signal: signal } : {}, extentSignal ? { extentSignal: extentSignal } : {}); + return { key: key, binComponent: binComponent }; +} +var BinNode = /** @class */ (function (_super) { + tslib_1.__extends(BinNode, _super); + function BinNode(parent, bins) { + var _this = _super.call(this, parent) || this; + _this.bins = bins; + return _this; + } + BinNode.prototype.clone = function () { + return new BinNode(null, util_1.duplicate(this.bins)); + }; + BinNode.makeFromEncoding = function (parent, model) { + var bins = model.reduceFieldDef(function (binComponentIndex, fieldDef, channel) { + if (fieldDef.bin) { + var _a = createBinComponent(fieldDef, model), key = _a.key, binComponent = _a.binComponent; + binComponentIndex[key] = tslib_1.__assign({}, binComponent, binComponentIndex[key], rangeFormula(model, fieldDef, channel, model.config)); + } + return binComponentIndex; + }, {}); + if (util_1.keys(bins).length === 0) { + return null; + } + return new BinNode(parent, bins); + }; + /** + * Creates a bin node from BinTransform. + * The optional parameter should provide + */ + BinNode.makeFromTransform = function (parent, t, model) { + var _a; + var _b = createBinComponent(t, model), key = _b.key, binComponent = _b.binComponent; + return new BinNode(parent, (_a = {}, + _a[key] = binComponent, + _a)); + }; + BinNode.prototype.merge = function (other) { + this.bins = tslib_1.__assign({}, this.bins, other.bins); + other.remove(); + }; + BinNode.prototype.producedFields = function () { + var out = {}; + util_1.vals(this.bins).forEach(function (c) { + c.as.forEach(function (f) { return out[f] = true; }); + }); + return out; + }; + BinNode.prototype.dependentFields = function () { + var out = {}; + util_1.vals(this.bins).forEach(function (c) { + out[c.field] = true; + }); + return out; + }; + BinNode.prototype.assemble = function () { + return util_1.flatten(util_1.vals(this.bins).map(function (bin) { + var transform = []; + var binTrans = tslib_1.__assign({ type: 'bin', field: bin.field, as: bin.as, signal: bin.signal }, bin.bin); + if (!bin.bin.extent && bin.extentSignal) { + transform.push({ + type: 'extent', + field: bin.field, + signal: bin.extentSignal + }); + binTrans.extent = { signal: bin.extentSignal }; + } + transform.push(binTrans); + if (bin.formula) { + transform.push({ + type: 'formula', + expr: bin.formula, + as: bin.formulaAs + }); + } + return transform; + })); + }; + return BinNode; +}(dataflow_1.DataFlowNode)); +exports.BinNode = BinNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9iaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQWlEO0FBR2pELDJDQUErRDtBQUUvRCxtQ0FBZ0U7QUFFaEUsb0NBQWdFO0FBQ2hFLGtDQUE0RDtBQUM1RCx1Q0FBd0M7QUFHeEMsc0JBQXNCLEtBQXFCLEVBQUUsUUFBMEIsRUFBRSxPQUFnQixFQUFFLE1BQWM7SUFDckcsSUFBSSx5QkFBZ0IsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUU7UUFDdkMsc0ZBQXNGO1FBRXRGLElBQU0sS0FBSyxHQUFHLG1CQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFN0YsSUFBTSxVQUFVLEdBQUcsa0JBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxHQUFFLENBQUMsQ0FBQztRQUN2RCxJQUFNLFFBQVEsR0FBRyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7UUFFdEUsT0FBTztZQUNMLFNBQVMsRUFBRSxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQztZQUNsRCxPQUFPLEVBQUUsNEJBQW1CLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztTQUN6RSxDQUFDO0tBQ0g7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRCxnQkFBZ0IsR0FBYyxFQUFFLEtBQWE7SUFDM0MsT0FBVSxpQkFBVyxDQUFD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QUUsQ0FBQztZQUVwQyxJQUFNLFFBQVEsc0JBQ1YsSUFBSSxFQUFFLEtBQUssRUFDWCxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFDaEIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQ1YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLElBQ2YsR0FBRyxDQUFDLEdBQUcsQ0FDYixDQUFDO1lBRUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxZQUFZLEVBQUU7Z0JBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO29CQUNoQixNQUFNLEVBQUUsR0FBRyxDQUFDLFlBQVk7aUJBQ3pCLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsTUFBTSxHQUFHLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZLEVBQUMsQ0FBQzthQUM5QztZQUVELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFekIsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsSUFBSSxFQUFFLEdBQUcsQ0FBQyxPQUFPO29CQUNqQixFQUFFLEVBQUUsR0FBRyxDQUFDLFNBQVM7aUJBQ2xCLENBQUMsQ0FBQzthQUNKO1lBRUQsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDSCxjQUFDO0FBQUQsQ0FBQyxBQW5HRCxDQUE2Qix1QkFBWSxHQW1HeEM7QUFuR1ksMEJBQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JpblBhcmFtcywgYmluVG9TdHJpbmd9IGZyb20gJy4uLy4uL2Jpbic7XG5pbXBvcnQge0NoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0ZpZWxkRGVmLCBub3JtYWxpemVCaW4sIHZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7QmluVHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtEaWN0LCBkdXBsaWNhdGUsIGZsYXR0ZW4sIGtleXMsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0JpblRyYW5zZm9ybSwgVmdUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YmluRm9ybWF0RXhwcmVzc2lvbiwgYmluUmVxdWlyZXNSYW5nZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7aXNVbml0TW9kZWwsIE1vZGVsLCBNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5cbmZ1bmN0aW9uIHJhbmdlRm9ybXVsYShtb2RlbDogTW9kZWxXaXRoRmllbGQsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsLCBjb25maWc6IENvbmZpZykge1xuICAgIGlmIChiaW5SZXF1aXJlc1JhbmdlKGZpZWxkRGVmLCBjaGFubmVsKSkge1xuICAgICAgLy8gcmVhZCBmb3JtYXQgZnJvbSBheGlzIG9yIGxlZ2VuZCwgaWYgdGhlcmUgaXMgbm8gZm9ybWF0IHRoZW4gdXNlIGNvbmZpZy5udW1iZXJGb3JtYXRcblxuICAgICAgY29uc3QgZ3VpZGUgPSBpc1VuaXRNb2RlbChtb2RlbCkgPyAobW9kZWwuYXhpcyhjaGFubmVsKSB8fCBtb2RlbC5sZWdlbmQoY2hhbm5lbCkgfHwge30pIDoge307XG5cbiAgICAgIGNvbnN0IHN0YXJ0RmllbGQgPSB2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJyx9KTtcbiAgICAgIGNvbnN0IGVuZEZpZWxkID0gdmdGaWVsZChmaWVsZERlZiwge2V4cHI6ICdkYXR1bScsIGJpblN1ZmZpeDogJ2VuZCd9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybXVsYUFzOiB2Z0ZpZWxkKGZpZWxkRGVmLCB7YmluU3VmZml4OiAncmFuZ2UnfSksXG4gICAgICAgIGZvcm11bGE6IGJpbkZvcm1hdEV4cHJlc3Npb24oc3RhcnRGaWVsZCwgZW5kRmllbGQsIGd1aWRlLmZvcm1hdCwgY29uZmlnKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBiaW5LZXkoYmluOiBCaW5QYXJhbXMsIGZpZWxkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2JpblRvU3RyaW5nKGJpbil9XyR7ZmllbGR9YDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnbmFsc0Zyb21Nb2RlbChtb2RlbDogTW9kZWwsIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGAke2tleX1fYmluc2ApLFxuICAgIGV4dGVudFNpZ25hbDogbW9kZWwuZ2V0TmFtZShgJHtrZXl9X2V4dGVudGApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmluVHJhbnNmb3JtKHQ6IEZpZWxkRGVmPHN0cmluZz4gfCBCaW5UcmFuc2Zvcm0pOiB0IGlzIEJpblRyYW5zZm9ybSB7XG4gIHJldHVybiAnYXMnIGluIHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJpbkNvbXBvbmVudCh0OiBGaWVsZERlZjxzdHJpbmc+IHwgQmluVHJhbnNmb3JtLCBtb2RlbDogTW9kZWwpIHtcbiAgbGV0IGFzOiBbc3RyaW5nLCBzdHJpbmddO1xuXG4gIGlmIChpc0JpblRyYW5zZm9ybSh0KSkge1xuICAgIGFzID0gW3QuYXMsIGAke3QuYXN9X2VuZGBdO1xuICB9IGVsc2Uge1xuICAgIGFzID0gW3ZnRmllbGQodCwge30pLCB2Z0ZpZWxkKHQsIHtiaW5TdWZmaXg6ICdlbmQnfSldO1xuICB9XG5cbiAgY29uc3QgYmluID0gbm9ybWFsaXplQmluKHQuYmluLCB1bmRlZmluZWQpIHx8IHt9O1xuICBjb25zdCBrZXkgPSBiaW5LZXkoYmluLCB0LmZpZWxkKTtcbiAgY29uc3Qge3NpZ25hbCwgZXh0ZW50U2lnbmFsfSA9IGdldFNpZ25hbHNGcm9tTW9kZWwobW9kZWwsIGtleSk7XG5cbiAgY29uc3QgYmluQ29tcG9uZW50OiBCaW5Db21wb25lbnQgPSB7XG4gICAgYmluOiBiaW4sXG4gICAgZmllbGQ6IHQuZmllbGQsXG4gICAgYXM6IGFzLFxuICAgIC4uLnNpZ25hbCA/IHtzaWduYWx9IDoge30sXG4gICAgLi4uZXh0ZW50U2lnbmFsID8ge2V4dGVudFNpZ25hbH0gOiB7fVxuICB9O1xuXG4gIHJldHVybiB7a2V5LCBiaW5Db21wb25lbnR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbkNvbXBvbmVudCB7XG4gIGJpbjogQmluUGFyYW1zO1xuICBmaWVsZDogc3RyaW5nO1xuICBleHRlbnRTaWduYWw/OiBzdHJpbmc7XG4gIHNpZ25hbD86IHN0cmluZztcbiAgYXM6IHN0cmluZ1tdO1xuXG4gIC8vIFJhbmdlIEZvcm11bGFcblxuICBmb3JtdWxhPzogc3RyaW5nO1xuICBmb3JtdWxhQXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5Ob2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQmluTm9kZShudWxsLCBkdXBsaWNhdGUodGhpcy5iaW5zKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBiaW5zOiBEaWN0PEJpbkNvbXBvbmVudD4pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbUVuY29kaW5nKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogTW9kZWxXaXRoRmllbGQpIHtcbiAgICBjb25zdCBiaW5zID0gbW9kZWwucmVkdWNlRmllbGREZWYoKGJpbkNvbXBvbmVudEluZGV4OiBEaWN0PEJpbkNvbXBvbmVudD4sIGZpZWxkRGVmLCBjaGFubmVsKSA9PiB7XG4gICAgICBpZiAoZmllbGREZWYuYmluKSB7XG4gICAgICAgIGNvbnN0IHtrZXksIGJpbkNvbXBvbmVudH0gPSBjcmVhdGVCaW5Db21wb25lbnQoZmllbGREZWYsIG1vZGVsKTtcbiAgICAgICAgYmluQ29tcG9uZW50SW5kZXhba2V5XSA9IHtcbiAgICAgICAgICAuLi5iaW5Db21wb25lbnQsXG4gICAgICAgICAgLi4uYmluQ29tcG9uZW50SW5kZXhba2V5XSxcbiAgICAgICAgICAuLi5yYW5nZUZvcm11bGEobW9kZWwsIGZpZWxkRGVmLCBjaGFubmVsLCBtb2RlbC5jb25maWcpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYmluQ29tcG9uZW50SW5kZXg7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKGtleXMoYmlucykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJpbk5vZGUocGFyZW50LCBiaW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmluIG5vZGUgZnJvbSBCaW5UcmFuc2Zvcm0uXG4gICAqIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgc2hvdWxkIHByb3ZpZGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21UcmFuc2Zvcm0ocGFyZW50OiBEYXRhRmxvd05vZGUsIHQ6IEJpblRyYW5zZm9ybSwgbW9kZWw6IE1vZGVsKSB7XG4gICAgY29uc3Qge2tleSwgYmluQ29tcG9uZW50fSA9IGNyZWF0ZUJpbkNvbXBvbmVudCh0LCBtb2RlbCk7XG4gICAgcmV0dXJuIG5ldyBCaW5Ob2RlKHBhcmVudCwge1xuICAgICAgW2tleV06IGJpbkNvbXBvbmVudFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlKG90aGVyOiBCaW5Ob2RlKSB7XG4gICAgdGhpcy5iaW5zID0gey4uLnRoaXMuYmlucywgLi4ub3RoZXIuYmluc307XG4gICAgb3RoZXIucmVtb3ZlKCk7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICB2YWxzKHRoaXMuYmlucykuZm9yRWFjaChjID0+IHtcbiAgICAgIGMuYXMuZm9yRWFjaChmID0+IG91dFtmXSA9IHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRlbnRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICB2YWxzKHRoaXMuYmlucykuZm9yRWFjaChjID0+IHtcbiAgICAgIG91dFtjLmZpZWxkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnVHJhbnNmb3JtW10ge1xuICAgIHJldHVybiBmbGF0dGVuKHZhbHModGhpcy5iaW5zKS5tYXAoYmluID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybTogVmdUcmFuc2Zvcm1bXSA9IFtdO1xuXG4gICAgICBjb25zdCBiaW5UcmFuczogVmdCaW5UcmFuc2Zvcm0gPSB7XG4gICAgICAgICAgdHlwZTogJ2JpbicsXG4gICAgICAgICAgZmllbGQ6IGJpbi5maWVsZCxcbiAgICAgICAgICBhczogYmluLmFzLFxuICAgICAgICAgIHNpZ25hbDogYmluLnNpZ25hbCxcbiAgICAgICAgICAuLi5iaW4uYmluXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWJpbi5iaW4uZXh0ZW50ICYmIGJpbi5leHRlbnRTaWduYWwpIHtcbiAgICAgICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdleHRlbnQnLFxuICAgICAgICAgIGZpZWxkOiBiaW4uZmllbGQsXG4gICAgICAgICAgc2lnbmFsOiBiaW4uZXh0ZW50U2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBiaW5UcmFucy5leHRlbnQgPSB7c2lnbmFsOiBiaW4uZXh0ZW50U2lnbmFsfTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNmb3JtLnB1c2goYmluVHJhbnMpO1xuXG4gICAgICBpZiAoYmluLmZvcm11bGEpIHtcbiAgICAgICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgICBleHByOiBiaW4uZm9ybXVsYSxcbiAgICAgICAgICBhczogYmluLmZvcm11bGFBc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/data/calculate.d.ts b/build/src/compile/data/calculate.d.ts new file mode 100644 index 0000000000..7f9b8ad5a9 --- /dev/null +++ b/build/src/compile/data/calculate.d.ts @@ -0,0 +1,18 @@ +import { VgFormulaTransform } from '../../vega.schema'; +import { ModelWithField } from '../model'; +import { SingleDefChannel } from './../../channel'; +import { CalculateTransform } from './../../transform'; +import { DataFlowNode } from './dataflow'; +/** + * We don't know what a calculate node depends on so we should never move it beyond anything that produces fields. + */ +export declare class CalculateNode extends DataFlowNode { + private transform; + clone(): CalculateNode; + constructor(parent: DataFlowNode, transform: CalculateTransform); + static parseAllForSortIndex(parent: DataFlowNode, model: ModelWithField): DataFlowNode; + static calculateExpressionFromSortField(field: string, sortFields: string[]): string; + producedFields(): {}; + assemble(): VgFormulaTransform; +} +export declare function sortArrayIndexField(model: ModelWithField, channel: SingleDefChannel): string; diff --git a/build/src/compile/data/calculate.js b/build/src/compile/data/calculate.js new file mode 100644 index 0000000000..70863c905b --- /dev/null +++ b/build/src/compile/data/calculate.js @@ -0,0 +1,63 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var fielddef_1 = require("../../fielddef"); +var sort_1 = require("../../sort"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +/** + * We don't know what a calculate node depends on so we should never move it beyond anything that produces fields. + */ +var CalculateNode = /** @class */ (function (_super) { + tslib_1.__extends(CalculateNode, _super); + function CalculateNode(parent, transform) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + return _this; + } + CalculateNode.prototype.clone = function () { + return new CalculateNode(null, util_1.duplicate(this.transform)); + }; + CalculateNode.parseAllForSortIndex = function (parent, model) { + // get all the encoding with sort fields from model + model.forEachFieldDef(function (fieldDef, channel) { + if (fielddef_1.isScaleFieldDef(fieldDef) && sort_1.isSortArray(fieldDef.sort)) { + var transform = { + calculate: CalculateNode.calculateExpressionFromSortField(fieldDef.field, fieldDef.sort), + as: sortArrayIndexField(model, channel) + }; + parent = new CalculateNode(parent, transform); + } + }); + return parent; + }; + CalculateNode.calculateExpressionFromSortField = function (field, sortFields) { + var expression = ''; + var i; + for (i = 0; i < sortFields.length; i++) { + expression += "datum." + field + " === '" + sortFields[i] + "' ? " + i + " : "; + } + expression += i; + return expression; + }; + CalculateNode.prototype.producedFields = function () { + var out = {}; + out[this.transform.as] = true; + return out; + }; + CalculateNode.prototype.assemble = function () { + return { + type: 'formula', + expr: this.transform.calculate, + as: this.transform.as + }; + }; + return CalculateNode; +}(dataflow_1.DataFlowNode)); +exports.CalculateNode = CalculateNode; +function sortArrayIndexField(model, channel) { + var fieldDef = model.fieldDef(channel); + return channel + "_" + fielddef_1.vgField(fieldDef) + "_sort_index"; +} +exports.sortArrayIndexField = sortArrayIndexField; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9jYWxjdWxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVFO0FBQ3ZFLG1DQUF1QztBQUN2QyxtQ0FBcUM7QUFLckMsdUNBQXdDO0FBRXhDOztHQUVHO0FBQ0g7SUFBbUMseUNBQVk7SUFLN0MsdUJBQVksTUFBb0IsRUFBVSxTQUE2QjtRQUF2RSxZQUNFLGtCQUFNLE1BQU0sQ0FBQyxTQUNkO1FBRnlDLGVBQVMsR0FBVCxTQUFTLENBQW9COztJQUV2RSxDQUFDO0lBTk0sNkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLGdCQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQU1hLGtDQUFvQixHQUFsQyxVQUFtQyxNQUFvQixFQUFFLEtBQXFCO1FBQzVFLG1EQUFtRDtRQUNuRCxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQUMsUUFBK0IsRUFBRSxPQUF5QjtZQUMvRSxJQUFJLDBCQUFlLENBQUMsUUFBUSxDQUFDLElBQUksa0JBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNELElBQU0sU0FBUyxHQUF1QjtvQkFDcEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3hGLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2lCQUN4QyxDQUFDO2dCQUNGLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFYSw4Q0FBZ0MsR0FBOUMsVUFBK0MsS0FBYSxFQUFFLFVBQW9CO1FBQ2hGLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxVQUFVLElBQUksV0FBUyxLQUFLLGNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFPLENBQUMsUUFBSyxDQUFDO1NBQ2pFO1FBQ0QsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sc0NBQWMsR0FBckI7UUFDRSxJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sZ0NBQVEsR0FBZjtRQUNFLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTlDRCxDQUFtQyx1QkFBWSxHQThDOUM7QUE5Q1ksc0NBQWE7QUFnRDFCLDZCQUFvQyxLQUFxQixFQUFFLE9BQXlCO0lBQ2xGLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsT0FBVSxPQUFPLFNBQUksa0JBQU8sQ0FBQyxRQUFRLENBQUMsZ0JBQWEsQ0FBQztBQUN0RCxDQUFDO0FBSEQsa0RBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzU2NhbGVGaWVsZERlZiwgU2NhbGVGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtpc1NvcnRBcnJheX0gZnJvbSAnLi4vLi4vc29ydCc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRm9ybXVsYVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtTaW5nbGVEZWZDaGFubmVsfSBmcm9tICcuLy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDYWxjdWxhdGVUcmFuc2Zvcm19IGZyb20gJy4vLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuLyoqXG4gKiBXZSBkb24ndCBrbm93IHdoYXQgYSBjYWxjdWxhdGUgbm9kZSBkZXBlbmRzIG9uIHNvIHdlIHNob3VsZCBuZXZlciBtb3ZlIGl0IGJleW9uZCBhbnl0aGluZyB0aGF0IHByb2R1Y2VzIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZU5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDYWxjdWxhdGVOb2RlKG51bGwsIGR1cGxpY2F0ZSh0aGlzLnRyYW5zZm9ybSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHByaXZhdGUgdHJhbnNmb3JtOiBDYWxjdWxhdGVUcmFuc2Zvcm0pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBwYXJzZUFsbEZvclNvcnRJbmRleChwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IE1vZGVsV2l0aEZpZWxkKSB7XG4gICAgLy8gZ2V0IGFsbCB0aGUgZW5jb2Rpbmcgd2l0aCBzb3J0IGZpZWxkcyBmcm9tIG1vZGVsXG4gICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKChmaWVsZERlZjogU2NhbGVGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBTaW5nbGVEZWZDaGFubmVsKSA9PiB7XG4gICAgICBpZiAoaXNTY2FsZUZpZWxkRGVmKGZpZWxkRGVmKSAmJiBpc1NvcnRBcnJheShmaWVsZERlZi5zb3J0KSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm06IENhbGN1bGF0ZVRyYW5zZm9ybSA9IHtcbiAgICAgICAgICBjYWxjdWxhdGU6IENhbGN1bGF0ZU5vZGUuY2FsY3VsYXRlRXhwcmVzc2lvbkZyb21Tb3J0RmllbGQoZmllbGREZWYuZmllbGQsIGZpZWxkRGVmLnNvcnQpLFxuICAgICAgICAgIGFzOiBzb3J0QXJyYXlJbmRleEZpZWxkKG1vZGVsLCBjaGFubmVsKVxuICAgICAgICB9O1xuICAgICAgICBwYXJlbnQgPSBuZXcgQ2FsY3VsYXRlTm9kZShwYXJlbnQsIHRyYW5zZm9ybSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlRXhwcmVzc2lvbkZyb21Tb3J0RmllbGQoZmllbGQ6IHN0cmluZywgc29ydEZpZWxkczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGxldCBleHByZXNzaW9uID0gJyc7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydEZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwcmVzc2lvbiArPSBgZGF0dW0uJHtmaWVsZH0gPT09ICcke3NvcnRGaWVsZHNbaV19JyA/ICR7aX0gOiBgO1xuICAgIH1cbiAgICBleHByZXNzaW9uICs9IGk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb247XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG4gICAgb3V0W3RoaXMudHJhbnNmb3JtLmFzXSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0Zvcm11bGFUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICBleHByOiB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGUsXG4gICAgICBhczogdGhpcy50cmFuc2Zvcm0uYXNcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0QXJyYXlJbmRleEZpZWxkKG1vZGVsOiBNb2RlbFdpdGhGaWVsZCwgY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCkge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICByZXR1cm4gYCR7Y2hhbm5lbH1fJHt2Z0ZpZWxkKGZpZWxkRGVmKX1fc29ydF9pbmRleGA7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/dataflow.d.ts b/build/src/compile/data/dataflow.d.ts new file mode 100644 index 0000000000..4083f75a71 --- /dev/null +++ b/build/src/compile/data/dataflow.d.ts @@ -0,0 +1,62 @@ +import { DataSourceType } from '../../data'; +import { Dict, StringSet } from '../../util'; +/** + * A node in the dataflow tree. + */ +export declare class DataFlowNode { + readonly debugName?: string; + private _children; + private _parent; + constructor(parent: DataFlowNode, debugName?: string); + /** + * Clone this node with a deep copy but don't clone links to children or parents. + */ + clone(): DataFlowNode; + /** + * Set of fields that are being created by this node. + */ + producedFields(): StringSet; + dependentFields(): StringSet; + /** + * Set the parent of the node and also add this not to the parent's children. + */ + parent: DataFlowNode; + readonly children: DataFlowNode[]; + numChildren(): number; + addChild(child: DataFlowNode): void; + removeChild(oldChild: DataFlowNode): void; + /** + * Remove node from the dataflow. + */ + remove(): void; + /** + * Insert another node as a parent of this node. + */ + insertAsParentOf(other: DataFlowNode): void; + swapWithParent(): void; +} +export declare class OutputNode extends DataFlowNode { + readonly type: DataSourceType; + private readonly refCounts; + private _source; + private _name; + clone(): this; + /** + * @param source The name of the source. Will change in assemble. + * @param type The type of the output node. + * @param refCounts A global ref counter map. + */ + constructor(parent: DataFlowNode, source: string, type: DataSourceType, refCounts: Dict); + /** + * Request the datasource name and increase the ref counter. + * + * During the parsing phase, this will return the simple name such as 'main' or 'raw'. + * It is crucial to request the name from an output node to mark it as a required node. + * If nobody ever requests the name, this datasource will not be instantiated in the assemble phase. + * + * In the assemble phase, this will return the correct name. + */ + getSource(): string; + isRequired(): boolean; + setSource(source: string): void; +} diff --git a/build/src/compile/data/dataflow.js b/build/src/compile/data/dataflow.js new file mode 100644 index 0000000000..71f8c1f9ec --- /dev/null +++ b/build/src/compile/data/dataflow.js @@ -0,0 +1,148 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/** + * A node in the dataflow tree. + */ +var DataFlowNode = /** @class */ (function () { + function DataFlowNode(parent, debugName) { + this.debugName = debugName; + this._children = []; + this._parent = null; + if (parent) { + this.parent = parent; + } + } + /** + * Clone this node with a deep copy but don't clone links to children or parents. + */ + DataFlowNode.prototype.clone = function () { + throw new Error('Cannot clone node'); + }; + /** + * Set of fields that are being created by this node. + */ + DataFlowNode.prototype.producedFields = function () { + return {}; + }; + DataFlowNode.prototype.dependentFields = function () { + return {}; + }; + Object.defineProperty(DataFlowNode.prototype, "parent", { + get: function () { + return this._parent; + }, + /** + * Set the parent of the node and also add this not to the parent's children. + */ + set: function (parent) { + this._parent = parent; + parent.addChild(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataFlowNode.prototype, "children", { + get: function () { + return this._children; + }, + enumerable: true, + configurable: true + }); + DataFlowNode.prototype.numChildren = function () { + return this._children.length; + }; + DataFlowNode.prototype.addChild = function (child) { + this._children.push(child); + }; + DataFlowNode.prototype.removeChild = function (oldChild) { + this._children.splice(this._children.indexOf(oldChild), 1); + }; + /** + * Remove node from the dataflow. + */ + DataFlowNode.prototype.remove = function () { + for (var _i = 0, _a = this._children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parent = this._parent; + } + this._parent.removeChild(this); + }; + /** + * Insert another node as a parent of this node. + */ + DataFlowNode.prototype.insertAsParentOf = function (other) { + var parent = other.parent; + parent.removeChild(this); + this.parent = parent; + other.parent = this; + }; + DataFlowNode.prototype.swapWithParent = function () { + var parent = this._parent; + var newParent = parent.parent; + // reconnect the children + for (var _i = 0, _a = this._children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parent = parent; + } + // remove old links + this._children = []; // equivalent to removing every child link one by one + parent.removeChild(this); + parent.parent.removeChild(parent); + // swap two nodes + this.parent = newParent; + parent.parent = this; + }; + return DataFlowNode; +}()); +exports.DataFlowNode = DataFlowNode; +var OutputNode = /** @class */ (function (_super) { + tslib_1.__extends(OutputNode, _super); + /** + * @param source The name of the source. Will change in assemble. + * @param type The type of the output node. + * @param refCounts A global ref counter map. + */ + function OutputNode(parent, source, type, refCounts) { + var _this = _super.call(this, parent, source) || this; + _this.type = type; + _this.refCounts = refCounts; + _this._source = _this._name = source; + if (_this.refCounts && !(_this._name in _this.refCounts)) { + _this.refCounts[_this._name] = 0; + } + return _this; + } + OutputNode.prototype.clone = function () { + var cloneObj = new this.constructor; + cloneObj.debugName = 'clone_' + this.debugName; + cloneObj._source = this._source; + cloneObj._name = 'clone_' + this._name; + cloneObj.type = this.type; + cloneObj.refCounts = this.refCounts; + cloneObj.refCounts[cloneObj._name] = 0; + return cloneObj; + }; + /** + * Request the datasource name and increase the ref counter. + * + * During the parsing phase, this will return the simple name such as 'main' or 'raw'. + * It is crucial to request the name from an output node to mark it as a required node. + * If nobody ever requests the name, this datasource will not be instantiated in the assemble phase. + * + * In the assemble phase, this will return the correct name. + */ + OutputNode.prototype.getSource = function () { + this.refCounts[this._name]++; + return this._source; + }; + OutputNode.prototype.isRequired = function () { + return !!this.refCounts[this._name]; + }; + OutputNode.prototype.setSource = function (source) { + this._source = source; + }; + return OutputNode; +}(DataFlowNode)); +exports.OutputNode = OutputNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUtBOztHQUVHO0FBQ0g7SUFLRSxzQkFBWSxNQUFvQixFQUFrQixTQUFrQjtRQUFsQixjQUFTLEdBQVQsU0FBUyxDQUFTO1FBSjVELGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBRS9CLFlBQU8sR0FBaUIsSUFBSSxDQUFDO1FBR25DLElBQUksTUFBTSxFQUFFO1lBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdEI7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSw0QkFBSyxHQUFaO1FBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLHFDQUFjLEdBQXJCO1FBQ0UsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRU0sc0NBQWUsR0FBdEI7UUFDRSxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxzQkFBSSxnQ0FBTTthQUFWO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RCLENBQUM7UUFFRDs7V0FFRzthQUNILFVBQVcsTUFBb0I7WUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDdEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDOzs7T0FSQTtJQVVELHNCQUFJLGtDQUFRO2FBQVo7WUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFFTSxrQ0FBVyxHQUFsQjtRQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsQ0FBQztJQUVNLCtCQUFRLEdBQWYsVUFBZ0IsS0FBbUI7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMs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UUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBaUJEOzs7Ozs7OztPQVFHO0lBQ0ksOEJBQVMsR0FBaEI7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU0sK0JBQVUsR0FBakI7UUFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sOEJBQVMsR0FBaEIsVUFBaUIsTUFBYztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQUFDLEFBcERELENBQWdDLFlBQVksR0FvRDNDO0FBcERZLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge0RhdGFTb3VyY2VUeXBlfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7RGljdCwgU3RyaW5nU2V0fSBmcm9tICcuLi8uLi91dGlsJztcblxuXG4vKipcbiAqIEEgbm9kZSBpbiB0aGUgZGF0YWZsb3cgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFGbG93Tm9kZSB7XG4gIHByaXZhdGUgX2NoaWxkcmVuOiBEYXRhRmxvd05vZGVbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3BhcmVudDogRGF0YUZsb3dOb2RlID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHVibGljIHJlYWRvbmx5IGRlYnVnTmFtZT86IHN0cmluZykge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSB0aGlzIG5vZGUgd2l0aCBhIGRlZXAgY29weSBidXQgZG9uJ3QgY2xvbmUgbGlua3MgdG8gY2hpbGRyZW4gb3IgcGFyZW50cy5cbiAgICovXG4gIHB1YmxpYyBjbG9uZSgpOiBEYXRhRmxvd05vZGUge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNsb25lIG5vZGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb2YgZmllbGRzIHRoYXQgYXJlIGJlaW5nIGNyZWF0ZWQgYnkgdGhpcyBub2RlLlxuICAgKi9cbiAgcHVibGljIHByb2R1Y2VkRmllbGRzKCk6IFN0cmluZ1NldCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZGVudEZpZWxkcygpOiBTdHJpbmdTZXQge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBhbmQgYWxzbyBhZGQgdGhpcyBub3QgdG8gdGhlIHBhcmVudCdzIGNoaWxkcmVuLlxuICAgKi9cbiAgc2V0IHBhcmVudChwYXJlbnQ6IERhdGFGbG93Tm9kZSkge1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICBwYXJlbnQuYWRkQ2hpbGQodGhpcyk7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgcHVibGljIG51bUNoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgYWRkQ2hpbGQoY2hpbGQ6IERhdGFGbG93Tm9kZSkge1xuICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNoaWxkKG9sZENoaWxkOiBEYXRhRmxvd05vZGUpIHtcbiAgICB0aGlzLl9jaGlsZHJlbi5zcGxpY2UodGhpcy5fY2hpbGRyZW4uaW5kZXhPZihvbGRDaGlsZCksIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBub2RlIGZyb20gdGhlIGRhdGFmbG93LlxuICAgKi9cbiAgcHVibGljIHJlbW92ZSgpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuX2NoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYW5vdGhlciBub2RlIGFzIGEgcGFyZW50IG9mIHRoaXMgbm9kZS5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnRBc1BhcmVudE9mKG90aGVyOiBEYXRhRmxvd05vZGUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBvdGhlci5wYXJlbnQ7XG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIG90aGVyLnBhcmVudCA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc3dhcFdpdGhQYXJlbnQoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgIGNvbnN0IG5ld1BhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG5cbiAgICAvLyByZWNvbm5lY3QgdGhlIGNoaWxkcmVuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9jaGlsZHJlbikge1xuICAgICAgY2hpbGQucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBvbGQgbGlua3NcbiAgICB0aGlzLl9jaGlsZHJlbiA9IFtdOyAgLy8gZXF1aXZhbGVudCB0byByZW1vdmluZyBldmVyeSBjaGlsZCBsaW5rIG9uZSBieSBvbmVcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgcGFyZW50LnBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQpO1xuXG5cbiAgICAvLyBzd2FwIHR3byBub2Rlc1xuICAgIHRoaXMucGFyZW50ID0gbmV3UGFyZW50O1xuICAgIHBhcmVudC5wYXJlbnQgPSB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRwdXROb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjbG9uZSgpOiB0aGlzIHtcbiAgICBjb25zdCBjbG9uZU9iaiA9IG5ldyAoPGFueT50aGlzLmNvbnN0cnVjdG9yKTtcbiAgICBjbG9uZU9iai5kZWJ1Z05hbWUgPSAnY2xvbmVfJyArIHRoaXMuZGVidWdOYW1lO1xuICAgIGNsb25lT2JqLl9zb3VyY2UgPSB0aGlzLl9zb3VyY2U7XG4gICAgY2xvbmVPYmouX25hbWUgPSAnY2xvbmVfJyArIHRoaXMuX25hbWU7XG4gICAgY2xvbmVPYmoudHlwZSA9IHRoaXMudHlwZTtcbiAgICBjbG9uZU9iai5yZWZDb3VudHMgPSB0aGlzLnJlZkNvdW50cztcbiAgICBjbG9uZU9iai5yZWZDb3VudHNbY2xvbmVPYmouX25hbWVdID0gMDtcbiAgICByZXR1cm4gY2xvbmVPYmo7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlLiBXaWxsIGNoYW5nZSBpbiBhc3NlbWJsZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG91dHB1dCBub2RlLlxuICAgKiBAcGFyYW0gcmVmQ291bnRzIEEgZ2xvYmFsIHJlZiBjb3VudGVyIG1hcC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBzb3VyY2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IHR5cGU6IERhdGFTb3VyY2VUeXBlLCBwcml2YXRlIHJlYWRvbmx5IHJlZkNvdW50czogRGljdDxudW1iZXI+KSB7XG4gICAgc3VwZXIocGFyZW50LCBzb3VyY2UpO1xuXG4gICAgdGhpcy5fc291cmNlID0gdGhpcy5fbmFtZSA9IHNvdXJjZTtcblxuICAgIGlmICh0aGlzLnJlZkNvdW50cyAmJiAhKHRoaXMuX25hbWUgaW4gdGhpcy5yZWZDb3VudHMpKSB7XG4gICAgICB0aGlzLnJlZkNvdW50c1t0aGlzLl9uYW1lXSA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIGRhdGFzb3VyY2UgbmFtZSBhbmQgaW5jcmVhc2UgdGhlIHJlZiBjb3VudGVyLlxuICAgKlxuICAgKiBEdXJpbmcgdGhlIHBhcnNpbmcgcGhhc2UsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIHN1Y2ggYXMgJ21haW4nIG9yICdyYXcnLlxuICAgKiBJdCBpcyBjcnVjaWFsIHRvIHJlcXVlc3QgdGhlIG5hbWUgZnJvbSBhbiBvdXRwdXQgbm9kZSB0byBtYXJrIGl0IGFzIGEgcmVxdWlyZWQgbm9kZS5cbiAgICogSWYgbm9ib2R5IGV2ZXIgcmVxdWVzdHMgdGhlIG5hbWUsIHRoaXMgZGF0YXNvdXJjZSB3aWxsIG5vdCBiZSBpbnN0YW50aWF0ZWQgaW4gdGhlIGFzc2VtYmxlIHBoYXNlLlxuICAgKlxuICAgKiBJbiB0aGUgYXNzZW1ibGUgcGhhc2UsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGNvcnJlY3QgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTb3VyY2UoKSB7XG4gICAgdGhpcy5yZWZDb3VudHNbdGhpcy5fbmFtZV0rKztcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgcHVibGljIGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZWZDb3VudHNbdGhpcy5fbmFtZV07XG4gIH1cblxuICBwdWJsaWMgc2V0U291cmNlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/facet.d.ts b/build/src/compile/data/facet.d.ts new file mode 100644 index 0000000000..8ec551a3f4 --- /dev/null +++ b/build/src/compile/data/facet.d.ts @@ -0,0 +1,30 @@ +import { VgData } from '../../vega.schema'; +import { FacetModel } from '../facet'; +import { DataFlowNode } from './dataflow'; +/** + * A node that helps us track what fields we are faceting by. + */ +export declare class FacetNode extends DataFlowNode { + readonly model: FacetModel; + readonly name: string; + data: string; + private readonly columnFields; + private readonly columnName; + private readonly rowFields; + private readonly rowName; + private readonly childModel; + /** + * @param model The facet model. + * @param name The name that this facet source will have. + * @param data The source data for this facet data. + */ + constructor(parent: DataFlowNode, model: FacetModel, name: string, data: string); + readonly fields: string[]; + /** + * The name to reference this source is its name. + */ + getSource(): string; + private getChildIndependentFieldsWithStep; + private assembleRowColumnData; + assemble(): VgData[]; +} diff --git a/build/src/compile/data/facet.js b/build/src/compile/data/facet.js new file mode 100644 index 0000000000..d0685c70c9 --- /dev/null +++ b/build/src/compile/data/facet.js @@ -0,0 +1,143 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var vega_schema_1 = require("../../vega.schema"); +var domain_1 = require("../scale/domain"); +var dataflow_1 = require("./dataflow"); +/** + * A node that helps us track what fields we are faceting by. + */ +var FacetNode = /** @class */ (function (_super) { + tslib_1.__extends(FacetNode, _super); + /** + * @param model The facet model. + * @param name The name that this facet source will have. + * @param data The source data for this facet data. + */ + function FacetNode(parent, model, name, data) { + var _this = _super.call(this, parent) || this; + _this.model = model; + _this.name = name; + _this.data = data; + if (model.facet.column) { + _this.columnFields = [model.vgField(channel_1.COLUMN)]; + _this.columnName = model.getName('column_domain'); + if (model.fieldDef(channel_1.COLUMN).bin) { + _this.columnFields.push(model.vgField(channel_1.COLUMN, { binSuffix: 'end' })); + } + } + if (model.facet.row) { + _this.rowFields = [model.vgField(channel_1.ROW)]; + _this.rowName = model.getName('row_domain'); + if (model.fieldDef(channel_1.ROW).bin) { + _this.rowFields.push(model.vgField(channel_1.ROW, { binSuffix: 'end' })); + } + } + _this.childModel = model.child; + return _this; + } + Object.defineProperty(FacetNode.prototype, "fields", { + get: function () { + var fields = []; + if (this.columnFields) { + fields = fields.concat(this.columnFields); + } + if (this.rowFields) { + fields = fields.concat(this.rowFields); + } + return fields; + }, + enumerable: true, + configurable: true + }); + /** + * The name to reference this source is its name. + */ + FacetNode.prototype.getSource = function () { + return this.name; + }; + FacetNode.prototype.getChildIndependentFieldsWithStep = function () { + var childIndependentFieldsWithStep = {}; + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + var childScaleComponent = this.childModel.component.scales[channel]; + if (childScaleComponent && !childScaleComponent.merged) { + var type = childScaleComponent.get('type'); + var range = childScaleComponent.get('range'); + if (scale_1.hasDiscreteDomain(type) && vega_schema_1.isVgRangeStep(range)) { + var domain = domain_1.assembleDomain(this.childModel, channel); + var field = domain_1.getFieldFromDomain(domain); + if (field) { + childIndependentFieldsWithStep[channel] = field; + } + else { + log.warn('Unknown field for ${channel}. Cannot calculate view size.'); + } + } + } + } + return childIndependentFieldsWithStep; + }; + FacetNode.prototype.assembleRowColumnData = function (channel, crossedDataName, childIndependentFieldsWithStep) { + var aggregateChildField = {}; + var childChannel = channel === 'row' ? 'y' : 'x'; + if (childIndependentFieldsWithStep[childChannel]) { + if (crossedDataName) { + aggregateChildField = { + // If there is a crossed data, calculate max + fields: ["distinct_" + childIndependentFieldsWithStep[childChannel]], + ops: ['max'], + // Although it is technically a max, just name it distinct so it's easier to refer to it + as: ["distinct_" + childIndependentFieldsWithStep[childChannel]] + }; + } + else { + aggregateChildField = { + // If there is no crossed data, just calculate distinct + fields: [childIndependentFieldsWithStep[childChannel]], + ops: ['distinct'] + }; + } + } + return { + name: channel === 'row' ? this.rowName : this.columnName, + // Use data from the crossed one if it exist + source: crossedDataName || this.data, + transform: [tslib_1.__assign({ type: 'aggregate', groupby: channel === 'row' ? this.rowFields : this.columnFields }, aggregateChildField)] + }; + }; + FacetNode.prototype.assemble = function () { + var data = []; + var crossedDataName = null; + var childIndependentFieldsWithStep = this.getChildIndependentFieldsWithStep(); + if (this.columnName && this.rowName && (childIndependentFieldsWithStep.x || childIndependentFieldsWithStep.y)) { + // Need to create a cross dataset to correctly calculate cardinality + crossedDataName = "cross_" + this.columnName + "_" + this.rowName; + var fields = [].concat(childIndependentFieldsWithStep.x ? [childIndependentFieldsWithStep.x] : [], childIndependentFieldsWithStep.y ? [childIndependentFieldsWithStep.y] : []); + var ops = fields.map(function () { return 'distinct'; }); + data.push({ + name: crossedDataName, + source: this.data, + transform: [{ + type: 'aggregate', + groupby: this.columnFields.concat(this.rowFields), + fields: fields, + ops: ops + }] + }); + } + if (this.columnName) { + data.push(this.assembleRowColumnData('column', crossedDataName, childIndependentFieldsWithStep)); + } + if (this.rowName) { + data.push(this.assembleRowColumnData('row', crossedDataName, childIndependentFieldsWithStep)); + } + return data; + }; + return FacetNode; +}(dataflow_1.DataFlowNode)); +exports.FacetNode = FacetNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2ZhY2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF3RDtBQUN4RCxxREFBaUM7QUFDakMscUNBQThDO0FBQzlDLGlEQUE4RTtBQUc5RSwwQ0FBbUU7QUFDbkUsdUNBQXdDO0FBT3hDOztHQUVHO0FBQ0g7SUFBK0IscUNBQVk7SUFTekM7Ozs7T0FJRztJQUNILG1CQUFtQixNQUFvQixFQUFrQixLQUFpQixFQUFrQixJQUFZLEVBQVMsSUFBWTtRQUE3SCxZQUNFLGtCQUFNLE1BQU0sQ0FBQyxTQW1CZDtRQXBCd0QsV0FBSyxHQUFMLEtBQUssQ0FBWTtRQUFrQixVQUFJLEdBQUosSUFBSSxDQUFRO1FBQVMsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUczSCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3RCLEtBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVDLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsZ0JBQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRTtnQkFDOUIsS0FBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQzthQUNuRTtTQUNGO1FBRUQsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtZQUNuQixLQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLEtBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxD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RSw4QkFBOEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDM0UsQ0FBQztZQUNGLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBbUIsT0FBQSxVQUFVLEVBQVYsQ0FBVSxDQUFDLENBQUM7WUFFdEQsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDUixJQUFJLEVBQUUsZUFBZTtnQkFDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNqQixTQUFTLEVBQUUsQ0FBQzt3QkFDVixJQUFJLEVBQUUsV0FBVzt3QkFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7d0JBQ2pELE1BQU0sRUFBRSxNQUFNO3dCQUNkLEdBQUcsS0FBQTtxQkFDSixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7U0FDbEc7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7U0FDL0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDSCxnQkFBQztBQUFELENBQUMsQUFySkQsQ0FBK0IsdUJBQVksR0FxSjFDO0FBckpZLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge0NPTFVNTiwgUk9XLCBTY2FsZUNoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge2hhc0Rpc2NyZXRlRG9tYWlufSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFZnQWdncmVnYXRlVHJhbnNmb3JtLCBWZ0RhdGF9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RmFjZXRNb2RlbH0gZnJvbSAnLi4vZmFjZXQnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHthc3NlbWJsZURvbWFpbiwgZ2V0RmllbGRGcm9tRG9tYWlufSBmcm9tICcuLi9zY2FsZS9kb21haW4nO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG50eXBlIENoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcCA9IHtcbiAgeD86IHN0cmluZyxcbiAgeT86IHN0cmluZ1xufTtcblxuLyoqXG4gKiBBIG5vZGUgdGhhdCBoZWxwcyB1cyB0cmFjayB3aGF0IGZpZWxkcyB3ZSBhcmUgZmFjZXRpbmcgYnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWNldE5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtbkZpZWxkczogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sdW1uTmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgcm93RmllbGRzOiBzdHJpbmdbXTtcbiAgcHJpdmF0ZSByZWFkb25seSByb3dOYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZE1vZGVsOiBNb2RlbDtcblxuICAvKipcbiAgICogQHBhcmFtIG1vZGVsIFRoZSBmYWNldCBtb2RlbC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgdGhhdCB0aGlzIGZhY2V0IHNvdXJjZSB3aWxsIGhhdmUuXG4gICAqIEBwYXJhbSBkYXRhIFRoZSBzb3VyY2UgZGF0YSBmb3IgdGhpcyBmYWNldCBkYXRhLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwdWJsaWMgcmVhZG9ubHkgbW9kZWw6IEZhY2V0TW9kZWwsIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsIHB1YmxpYyBkYXRhOiBzdHJpbmcpIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuXG4gICAgaWYgKG1vZGVsLmZhY2V0LmNvbHVtbikge1xuICAgICAgdGhpcy5jb2x1bW5GaWVsZHMgPSBbbW9kZWwudmdGaWVsZChDT0xVTU4pXTtcbiAgICAgIHRoaXMuY29sdW1uTmFtZSA9IG1vZGVsLmdldE5hbWUoJ2NvbHVtbl9kb21haW4nKTtcbiAgICAgIGlmIChtb2RlbC5maWVsZERlZihDT0xVTU4pLmJpbikge1xuICAgICAgICB0aGlzLmNvbHVtbkZpZWxkcy5wdXNoKG1vZGVsLnZnRmllbGQoQ09MVU1OLCB7YmluU3VmZml4OiAnZW5kJ30pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobW9kZWwuZmFjZXQucm93KSB7XG4gICAgICB0aGlzLnJvd0ZpZWxkcyA9IFttb2RlbC52Z0ZpZWxkKFJPVyldO1xuICAgICAgdGhpcy5yb3dOYW1lID0gbW9kZWwuZ2V0TmFtZSgncm93X2RvbWFpbicpO1xuICAgICAgaWYgKG1vZGVsLmZpZWxkRGVmKFJPVykuYmluKSB7XG4gICAgICAgIHRoaXMucm93RmllbGRzLnB1c2gobW9kZWwudmdGaWVsZChST1csIHtiaW5TdWZmaXg6ICdlbmQnfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2hpbGRNb2RlbCA9IG1vZGVsLmNoaWxkO1xuICB9XG5cbiAgZ2V0IGZpZWxkcygpIHtcbiAgICBsZXQgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNvbHVtbkZpZWxkcykge1xuICAgICAgZmllbGRzID0gZmllbGRzLmNvbmNhdCh0aGlzLmNvbHVtbkZpZWxkcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvd0ZpZWxkcykge1xuICAgICAgZmllbGRzID0gZmllbGRzLmNvbmNhdCh0aGlzLnJvd0ZpZWxkcyk7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgdG8gcmVmZXJlbmNlIHRoaXMgc291cmNlIGlzIGl0cyBuYW1lLlxuICAgKi9cbiAgcHVibGljIGdldFNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAoKSB7XG4gICAgY29uc3QgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwOiBDaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3gnLCAneSddIGFzIFNjYWxlQ2hhbm5lbFtdKSB7XG4gICAgICBjb25zdCBjaGlsZFNjYWxlQ29tcG9uZW50ID0gdGhpcy5jaGlsZE1vZGVsLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICBpZiAoY2hpbGRTY2FsZUNvbXBvbmVudCAmJiAhY2hpbGRTY2FsZUNvbXBvbmVudC5tZXJnZWQpIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IGNoaWxkU2NhbGVDb21wb25lbnQuZ2V0KCd0eXBlJyk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY2hpbGRTY2FsZUNvbXBvbmVudC5nZXQoJ3JhbmdlJyk7XG5cbiAgICAgICAgaWYgKGhhc0Rpc2NyZXRlRG9tYWluKHR5cGUpICYmIGlzVmdSYW5nZVN0ZXAocmFuZ2UpKSB7XG4gICAgICAgICAgY29uc3QgZG9tYWluID0gYXNzZW1ibGVEb21haW4odGhpcy5jaGlsZE1vZGVsLCBjaGFubmVsKTtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZpZWxkRnJvbURvbWFpbihkb21haW4pO1xuICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwW2NoYW5uZWxdID0gZmllbGQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy53YXJuKCdVbmtub3duIGZpZWxkIGZvciAke2NoYW5uZWx9LiAgQ2Fubm90IGNhbGN1bGF0ZSB2aWV3IHNpemUuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcDtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZW1ibGVSb3dDb2x1bW5EYXRhKGNoYW5uZWw6ICdyb3cnIHwgJ2NvbHVtbicsIGNyb3NzZWREYXRhTmFtZTogc3RyaW5nLCBjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXA6IENoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcCk6IFZnRGF0YSB7XG4gICAgbGV0IGFnZ3JlZ2F0ZUNoaWxkRmllbGQ6IFBhcnRpYWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+ID0ge307XG4gICAgY29uc3QgY2hpbGRDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3JvdycgPyAneScgOiAneCc7XG5cbiAgICBpZiAoY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwW2NoaWxkQ2hhbm5lbF0pIHtcbiAgICAgIGlmIChjcm9zc2VkRGF0YU5hbWUpIHtcbiAgICAgICAgYWdncmVnYXRlQ2hpbGRGaWVsZCA9IHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNyb3NzZWQgZGF0YSwgY2FsY3VsYXRlIG1heFxuICAgICAgICAgIGZpZWxkczogW2BkaXN0aW5jdF8ke2NoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcFtjaGlsZENoYW5uZWxdfWBdLFxuICAgICAgICAgIG9wczogWydtYXgnXSxcbiAgICAgICAgICAvLyBBbHRob3VnaCBpdCBpcyB0ZWNobmljYWxseSBhIG1heCwganVzdCBuYW1lIGl0IGRpc3RpbmN0IHNvIGl0J3MgZWFzaWVyIHRvIHJlZmVyIHRvIGl0XG4gICAgICAgICAgYXM6IFtgZGlzdGluY3RfJHtjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXBbY2hpbGRDaGFubmVsXX1gXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWdncmVnYXRlQ2hpbGRGaWVsZCA9IHtcbiAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBjcm9zc2VkIGRhdGEsIGp1c3QgY2FsY3VsYXRlIGRpc3RpbmN0XG4gICAgICAgICAgZmllbGRzOiBbY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwW2NoaWxkQ2hhbm5lbF1dLFxuICAgICAgICAgIG9wczogWydkaXN0aW5jdCddXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNoYW5uZWwgPT09ICdyb3cnID8gdGhpcy5yb3dOYW1lIDogdGhpcy5jb2x1bW5OYW1lLFxuICAgICAgLy8gVXNlIGRhdGEgZnJvbSB0aGUgY3Jvc3NlZCBvbmUgaWYgaXQgZXhpc3RcbiAgICAgIHNvdXJjZTogY3Jvc3NlZERhdGFOYW1lIHx8IHRoaXMuZGF0YSxcbiAgICAgIHRyYW5zZm9ybTogW3tcbiAgICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICAgIGdyb3VwYnk6IGNoYW5uZWwgPT09ICdyb3cnID8gdGhpcy5yb3dGaWVsZHMgOiB0aGlzLmNvbHVtbkZpZWxkcyxcbiAgICAgICAgLi4uYWdncmVnYXRlQ2hpbGRGaWVsZFxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCkge1xuICAgIGNvbnN0IGRhdGE6IFZnRGF0YVtdID0gW107XG4gICAgbGV0IGNyb3NzZWREYXRhTmFtZSA9IG51bGw7XG4gICAgY29uc3QgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwID0gdGhpcy5nZXRDaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAoKTtcblxuICAgIGlmICh0aGlzLmNvbHVtbk5hbWUgJiYgdGhpcy5yb3dOYW1lICYmIChjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAueCB8fCBjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAueSkpIHtcbiAgICAgIC8vIE5lZWQgdG8gY3JlYXRlIGEgY3Jvc3MgZGF0YXNldCB0byBjb3JyZWN0bHkgY2FsY3VsYXRlIGNhcmRpbmFsaXR5XG4gICAgICBjcm9zc2VkRGF0YU5hbWUgPSBgY3Jvc3NfJHt0aGlzLmNvbHVtbk5hbWV9XyR7dGhpcy5yb3dOYW1lfWA7XG5cbiAgICAgIGNvbnN0IGZpZWxkcyA9IFtdLmNvbmNhdChcbiAgICAgICAgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwLnggPyBbY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwLnhdIDogW10sXG4gICAgICAgIGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcC55ID8gW2NoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcC55XSA6IFtdLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IG9wcyA9IGZpZWxkcy5tYXAoKCk6IEFnZ3JlZ2F0ZU9wID0+ICdkaXN0aW5jdCcpO1xuXG4gICAgICBkYXRhLnB1c2goe1xuICAgICAgICBuYW1lOiBjcm9zc2VkRGF0YU5hbWUsXG4gICAgICAgIHNvdXJjZTogdGhpcy5kYXRhLFxuICAgICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICAgICAgZ3JvdXBieTogdGhpcy5jb2x1bW5GaWVsZHMuY29uY2F0KHRoaXMucm93RmllbGRzKSxcbiAgICAgICAgICBmaWVsZHM6IGZpZWxkcyxcbiAgICAgICAgICBvcHNcbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbHVtbk5hbWUpIHtcbiAgICAgIGRhdGEucHVzaCh0aGlzLmFzc2VtYmxlUm93Q29sdW1uRGF0YSgnY29sdW1uJywgY3Jvc3NlZERhdGFOYW1lLCBjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXApKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3dOYW1lKSB7XG4gICAgICBkYXRhLnB1c2godGhpcy5hc3NlbWJsZVJvd0NvbHVtbkRhdGEoJ3JvdycsIGNyb3NzZWREYXRhTmFtZSwgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/data/filter.d.ts b/build/src/compile/data/filter.d.ts new file mode 100644 index 0000000000..7a0ad03f01 --- /dev/null +++ b/build/src/compile/data/filter.d.ts @@ -0,0 +1,13 @@ +import { LogicalOperand } from '../../logical'; +import { Predicate } from '../../predicate'; +import { VgFilterTransform } from '../../vega.schema'; +import { Model } from '../model'; +import { DataFlowNode } from './dataflow'; +export declare class FilterNode extends DataFlowNode { + private readonly model; + private filter; + private expr; + clone(): FilterNode; + constructor(parent: DataFlowNode, model: Model, filter: LogicalOperand); + assemble(): VgFilterTransform; +} diff --git a/build/src/compile/data/filter.js b/build/src/compile/data/filter.js new file mode 100644 index 0000000000..67f6058b8b --- /dev/null +++ b/build/src/compile/data/filter.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var predicate_1 = require("../../predicate"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var FilterNode = /** @class */ (function (_super) { + tslib_1.__extends(FilterNode, _super); + function FilterNode(parent, model, filter) { + var _this = _super.call(this, parent) || this; + _this.model = model; + _this.filter = filter; + _this.expr = predicate_1.expression(_this.model, _this.filter, _this); + return _this; + } + FilterNode.prototype.clone = function () { + return new FilterNode(null, this.model, util_1.duplicate(this.filter)); + }; + FilterNode.prototype.assemble = function () { + return { + type: 'filter', + expr: this.expr + }; + }; + return FilterNode; +}(dataflow_1.DataFlowNode)); +exports.FilterNode = FilterNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQXNEO0FBQ3RELG1DQUFxQztBQUdyQyx1Q0FBd0M7QUFFeEM7SUFBZ0Msc0NBQVk7SUFNMUMsb0JBQVksTUFBb0IsRUFBbUIsS0FBWSxFQUFVLE1BQWlDO1FBQTFHLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBRWQ7UUFIa0QsV0FBSyxHQUFMLEtBQUssQ0FBTztRQUFVLFlBQU0sR0FBTixNQUFNLENBQTJCO1FBRXhHLEtBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQVUsQ0FBQyxLQUFJLENBQUMsS0FBSyxFQUFFLEtBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLENBQUM7O0lBQ3hELENBQUM7SUFQTSwwQkFBSyxHQUFaO1FBQ0UsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxnQkFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFPTSw2QkFBUSxHQUFmO1FBQ0UsT0FBTztZQUNMLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQUFDLEFBakJELENBQWdDLHVCQUFZLEdBaUIzQztBQWpCWSxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtleHByZXNzaW9uLCBQcmVkaWNhdGV9IGZyb20gJy4uLy4uL3ByZWRpY2F0ZSc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRmlsdGVyVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBleHByOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlck5vZGUobnVsbCwgdGhpcy5tb2RlbCwgZHVwbGljYXRlKHRoaXMuZmlsdGVyKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSByZWFkb25seSBtb2RlbDogTW9kZWwsIHByaXZhdGUgZmlsdGVyOiBMb2dpY2FsT3BlcmFuZDxQcmVkaWNhdGU+KSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgICB0aGlzLmV4cHIgPSBleHByZXNzaW9uKHRoaXMubW9kZWwsIHRoaXMuZmlsdGVyLCB0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0ZpbHRlclRyYW5zZm9ybSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmaWx0ZXInLFxuICAgICAgZXhwcjogdGhpcy5leHByXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/filterinvalid.d.ts b/build/src/compile/data/filterinvalid.d.ts new file mode 100644 index 0000000000..b98aea3db3 --- /dev/null +++ b/build/src/compile/data/filterinvalid.d.ts @@ -0,0 +1,13 @@ +import { FieldDef } from '../../fielddef'; +import { Dict } from '../../util'; +import { VgFilterTransform } from '../../vega.schema'; +import { UnitModel } from '../unit'; +import { DataFlowNode } from './dataflow'; +export declare class FilterInvalidNode extends DataFlowNode { + private fieldDefs; + clone(): FilterInvalidNode; + constructor(parent: DataFlowNode, fieldDefs: Dict>); + static make(parent: DataFlowNode, model: UnitModel): FilterInvalidNode; + readonly filter: Dict>; + assemble(): VgFilterTransform; +} diff --git a/build/src/compile/data/filterinvalid.js b/build/src/compile/data/filterinvalid.js new file mode 100644 index 0000000000..47ee028061 --- /dev/null +++ b/build/src/compile/data/filterinvalid.js @@ -0,0 +1,71 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var mark_1 = require("../../mark"); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var FilterInvalidNode = /** @class */ (function (_super) { + tslib_1.__extends(FilterInvalidNode, _super); + function FilterInvalidNode(parent, fieldDefs) { + var _this = _super.call(this, parent) || this; + _this.fieldDefs = fieldDefs; + return _this; + } + FilterInvalidNode.prototype.clone = function () { + return new FilterInvalidNode(null, tslib_1.__assign({}, this.fieldDefs)); + }; + FilterInvalidNode.make = function (parent, model) { + var config = model.config, mark = model.mark; + if (config.invalidValues !== 'filter') { + return null; + } + var filter = model.reduceFieldDef(function (aggregator, fieldDef, channel) { + var scaleComponent = channel_1.isScaleChannel(channel) && model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + // While discrete domain scales can handle invalid values, continuous scales can't. + // Thus, for non-path marks, we have to filter null for scales with continuous domains. + // (For path marks, we will use "defined" property and skip these values instead.) + if (scale_1.hasContinuousDomain(scaleType) && !fieldDef.aggregate && !mark_1.isPathMark(mark)) { + aggregator[fieldDef.field] = fieldDef; + } + } + return aggregator; + }, {}); + if (!util_1.keys(filter).length) { + return null; + } + return new FilterInvalidNode(parent, filter); + }; + Object.defineProperty(FilterInvalidNode.prototype, "filter", { + get: function () { + return this.fieldDefs; + }, + enumerable: true, + configurable: true + }); + // create the VgTransforms for each of the filtered fields + FilterInvalidNode.prototype.assemble = function () { + var _this = this; + var filters = util_1.keys(this.filter).reduce(function (vegaFilters, field) { + var fieldDef = _this.fieldDefs[field]; + var ref = fielddef_1.vgField(fieldDef, { expr: 'datum' }); + if (fieldDef !== null) { + vegaFilters.push(ref + " !== null"); + vegaFilters.push("!isNaN(" + ref + ")"); + } + return vegaFilters; + }, []); + return filters.length > 0 ? + { + type: 'filter', + expr: filters.join(' && ') + } : null; + }; + return FilterInvalidNode; +}(dataflow_1.DataFlowNode)); +exports.FilterInvalidNode = FilterInvalidNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyaW52YWxpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZmlsdGVyaW52YWxpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBNkM7QUFDN0MsMkNBQTZEO0FBQzdELG1DQUFzQztBQUN0QyxxQ0FBMkQ7QUFDM0QsbUNBQXNDO0FBR3RDLHVDQUF3QztBQUV4QztJQUF1Qyw2Q0FBWTtJQUtqRCwyQkFBWSxNQUFvQixFQUFVLFNBQWlDO1FBQTNFLFlBQ0Msa0JBQU0sTUFBTSxDQUFDLFNBQ2I7UUFGeUMsZUFBUyxHQUFULFNBQVMsQ0FBd0I7O0lBRTNFLENBQUM7SUFOTSxpQ0FBSyxHQUFaO1FBQ0UsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksdUJBQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFNYSxzQkFBSSxHQUFsQixVQUFtQixNQUFvQixFQUFFLEtBQWdCO1FBQ2hELElBQUEscUJBQU0sRUFBRSxpQkFBSSxDQUFVO1FBQzdCLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUc7WUFDdEMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBQyxVQUFrQyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQ3hGLElBQU0sY0FBYyxHQUFHLHdCQUFjLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25GLElBQUksY0FBYyxFQUFFO2dCQUNsQixJQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUc3QyxtRkFBbUY7Z0JBQ25GLHVGQUF1RjtnQkFDdkYsa0ZBQWtGO2dCQUNsRixJQUFJLDJCQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsSUFBSSxDQUFDLGlCQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzlFLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDO2lCQUN2QzthQUNGO1lBQ0QsT0FBTyxVQUFVLENBQUM7UUFDcEIsQ0FBQyxFQUFFLEVBQTRCLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUMsV0FBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsc0JBQUkscUNBQU07YUFBVjtZQUNFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN4QixDQUFDOzs7T0FBQTtJQUVELDBEQUEwRDtJQUNuRCxvQ0FBUSxHQUFmO1FBQUEsaUJBaUJDO1FBaEJDLElBQU0sT0FBTyxHQUFHLFdBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUMsV0FBVyxFQUFFLEtBQUs7WUFDMUQsSUFBTSxRQUFRLEdBQUcsS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxJQUFNLEdBQUcsR0FBRyxrQkFBUSxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1lBRWhELElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDckIsV0FBVyxDQUFDLElBQUksQ0FBSSxHQUFHLGNBQVcsQ0FBQyxDQUFDO2dCQUNwQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVUsR0FBRyxNQUFHLENBQUMsQ0FBQzthQUNwQztZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQjtnQkFDSSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDN0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxBQTdERCxDQUF1Qyx1QkFBWSxHQTZEbEQ7QUE3RFksOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1NjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCB2Z0ZpZWxkIGFzIGZpZWxkUmVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge2lzUGF0aE1hcmt9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtoYXNDb250aW51b3VzRG9tYWluLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7RGljdCwga2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRmlsdGVyVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJJbnZhbGlkTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckludmFsaWROb2RlKG51bGwsIHsuLi50aGlzLmZpZWxkRGVmc30pO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHByaXZhdGUgZmllbGREZWZzOiBEaWN0PEZpZWxkRGVmPHN0cmluZz4+KSB7XG4gICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogVW5pdE1vZGVsKTogRmlsdGVySW52YWxpZE5vZGUge1xuICAgIGNvbnN0IHtjb25maWcsIG1hcmt9ID0gbW9kZWw7XG4gICAgaWYgKGNvbmZpZy5pbnZhbGlkVmFsdWVzICE9PSAnZmlsdGVyJyApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlciA9IG1vZGVsLnJlZHVjZUZpZWxkRGVmKChhZ2dyZWdhdG9yOiBEaWN0PEZpZWxkRGVmPHN0cmluZz4+LCBmaWVsZERlZiwgY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBpc1NjYWxlQ2hhbm5lbChjaGFubmVsKSAmJiBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgICAgIGlmIChzY2FsZUNvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcblxuXG4gICAgICAgIC8vIFdoaWxlIGRpc2NyZXRlIGRvbWFpbiBzY2FsZXMgY2FuIGhhbmRsZSBpbnZhbGlkIHZhbHVlcywgY29udGludW91cyBzY2FsZXMgY2FuJ3QuXG4gICAgICAgIC8vIFRodXMsIGZvciBub24tcGF0aCBtYXJrcywgd2UgaGF2ZSB0byBmaWx0ZXIgbnVsbCBmb3Igc2NhbGVzIHdpdGggY29udGludW91cyBkb21haW5zLlxuICAgICAgICAvLyAoRm9yIHBhdGggbWFya3MsIHdlIHdpbGwgdXNlIFwiZGVmaW5lZFwiIHByb3BlcnR5IGFuZCBza2lwIHRoZXNlIHZhbHVlcyBpbnN0ZWFkLilcbiAgICAgICAgaWYgKGhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSAmJiAhZmllbGREZWYuYWdncmVnYXRlICYmICFpc1BhdGhNYXJrKG1hcmspKSB7XG4gICAgICAgICAgYWdncmVnYXRvcltmaWVsZERlZi5maWVsZF0gPSBmaWVsZERlZjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFnZ3JlZ2F0b3I7XG4gICAgfSwge30gYXMgRGljdDxGaWVsZERlZjxzdHJpbmc+Pik7XG5cbiAgICBpZiAoIWtleXMoZmlsdGVyKS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmlsdGVySW52YWxpZE5vZGUocGFyZW50LCBmaWx0ZXIpO1xuICB9XG5cbiAgZ2V0IGZpbHRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5maWVsZERlZnM7XG4gIH1cblxuICAvLyBjcmVhdGUgdGhlIFZnVHJhbnNmb3JtcyBmb3IgZWFjaCBvZiB0aGUgZmlsdGVyZWQgZmllbGRzXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0ZpbHRlclRyYW5zZm9ybSB7XG4gICAgY29uc3QgZmlsdGVycyA9IGtleXModGhpcy5maWx0ZXIpLnJlZHVjZSgodmVnYUZpbHRlcnMsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHRoaXMuZmllbGREZWZzW2ZpZWxkXTtcbiAgICAgIGNvbnN0IHJlZiA9IGZpZWxkUmVmKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pO1xuXG4gICAgICBpZiAoZmllbGREZWYgIT09IG51bGwpIHtcbiAgICAgICAgdmVnYUZpbHRlcnMucHVzaChgJHtyZWZ9ICE9PSBudWxsYCk7XG4gICAgICAgIHZlZ2FGaWx0ZXJzLnB1c2goYCFpc05hTigke3JlZn0pYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmVnYUZpbHRlcnM7XG4gICAgfSwgW10pO1xuXG4gICAgcmV0dXJuIGZpbHRlcnMubGVuZ3RoID4gMCA/XG4gICAge1xuICAgICAgICB0eXBlOiAnZmlsdGVyJyxcbiAgICAgICAgZXhwcjogZmlsdGVycy5qb2luKCcgJiYgJylcbiAgICB9IDogbnVsbDtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/formatparse.d.ts b/build/src/compile/data/formatparse.d.ts new file mode 100644 index 0000000000..f71a33960a --- /dev/null +++ b/build/src/compile/data/formatparse.d.ts @@ -0,0 +1,33 @@ +import { AncestorParse } from '.'; +import { FilterTransform } from '../../transform'; +import { Dict, StringSet } from '../../util'; +import { VgFormulaTransform } from '../../vega.schema'; +import { Model } from '../model'; +import { DataFlowNode } from './dataflow'; +export declare class ParseNode extends DataFlowNode { + private _parse; + clone(): ParseNode; + constructor(parent: DataFlowNode, parse: Dict); + /** + * Creates a parse node from a data.format.parse and updates ancestorParse. + */ + static makeExplicit(parent: DataFlowNode, model: Model, ancestorParse: AncestorParse): ParseNode; + static makeImplicitFromFilterTransform(parent: DataFlowNode, transform: FilterTransform, ancestorParse: AncestorParse): ParseNode; + /** + * Creates a parse node for implicit parsing from a model and updates ancestorParse. + */ + static makeImplicitFromEncoding(parent: DataFlowNode, model: Model, ancestorParse: AncestorParse): ParseNode; + /** + * Creates a parse node from "explicit" parse and "implicit" parse and updates ancestorParse. + */ + private static makeWithAncestors; + readonly parse: Dict; + merge(other: ParseNode): void; + /** + * Assemble an object for Vega's format.parse property. + */ + assembleFormatParse(): {}; + producedFields(): StringSet; + dependentFields(): StringSet; + assembleTransforms(onlyNested?: boolean): VgFormulaTransform[]; +} diff --git a/build/src/compile/data/formatparse.js b/build/src/compile/data/formatparse.js new file mode 100644 index 0000000000..cbfbba2e61 --- /dev/null +++ b/build/src/compile/data/formatparse.js @@ -0,0 +1,245 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var aggregate_1 = require("../../aggregate"); +var datetime_1 = require("../../datetime"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var logical_1 = require("../../logical"); +var predicate_1 = require("../../predicate"); +var sort_1 = require("../../sort"); +var util_1 = require("../../util"); +var model_1 = require("../model"); +var split_1 = require("../split"); +var dataflow_1 = require("./dataflow"); +/** + * @param field The field. + * @param parse What to parse the field as. + */ +function parseExpression(field, parse) { + var f = util_1.accessPathWithDatum(field); + if (parse === 'number') { + return "toNumber(" + f + ")"; + } + else if (parse === 'boolean') { + return "toBoolean(" + f + ")"; + } + else if (parse === 'string') { + return "toString(" + f + ")"; + } + else if (parse === 'date') { + return "toDate(" + f + ")"; + } + else if (parse === 'flatten') { + return f; + } + else if (parse.indexOf('date:') === 0) { + var specifier = parse.slice(5, parse.length); + return "timeParse(" + f + "," + specifier + ")"; + } + else if (parse.indexOf('utc:') === 0) { + var specifier = parse.slice(4, parse.length); + return "utcParse(" + f + "," + specifier + ")"; + } + else { + log.warn(log.message.unrecognizedParse(parse)); + return null; + } +} +var ParseNode = /** @class */ (function (_super) { + tslib_1.__extends(ParseNode, _super); + function ParseNode(parent, parse) { + var _this = _super.call(this, parent) || this; + _this._parse = parse; + return _this; + } + ParseNode.prototype.clone = function () { + return new ParseNode(null, util_1.duplicate(this._parse)); + }; + /** + * Creates a parse node from a data.format.parse and updates ancestorParse. + */ + ParseNode.makeExplicit = function (parent, model, ancestorParse) { + // Custom parse + var explicit = {}; + var data = model.data; + if (data && data.format && data.format.parse) { + explicit = data.format.parse; + } + return this.makeWithAncestors(parent, explicit, {}, ancestorParse); + }; + ParseNode.makeImplicitFromFilterTransform = function (parent, transform, ancestorParse) { + var parse = {}; + logical_1.forEachLeaf(transform.filter, function (filter) { + if (predicate_1.isFieldPredicate(filter)) { + // Automatically add a parse node for filters with filter objects + var val = null; + // For EqualFilter, just use the equal property. + // For RangeFilter and OneOfFilter, all array members should have + // the same type, so we only use the first one. + if (predicate_1.isFieldEqualPredicate(filter)) { + val = filter.equal; + } + else if (predicate_1.isFieldRangePredicate(filter)) { + val = filter.range[0]; + } + else if (predicate_1.isFieldOneOfPredicate(filter)) { + val = (filter.oneOf || filter['in'])[0]; + } // else -- for filter expression, we can't infer anything + if (val) { + if (datetime_1.isDateTime(val)) { + parse[filter.field] = 'date'; + } + else if (vega_util_1.isNumber(val)) { + parse[filter.field] = 'number'; + } + else if (vega_util_1.isString(val)) { + parse[filter.field] = 'string'; + } + } + if (filter.timeUnit) { + parse[filter.field] = 'date'; + } + } + }); + if (util_1.keys(parse).length === 0) { + return null; + } + return this.makeWithAncestors(parent, {}, parse, ancestorParse); + }; + /** + * Creates a parse node for implicit parsing from a model and updates ancestorParse. + */ + ParseNode.makeImplicitFromEncoding = function (parent, model, ancestorParse) { + var implicit = {}; + if (model_1.isUnitModel(model) || model_1.isFacetModel(model)) { + // Parse encoded fields + model.forEachFieldDef(function (fieldDef) { + if (fielddef_1.isTimeFieldDef(fieldDef)) { + implicit[fieldDef.field] = 'date'; + } + else if (fielddef_1.isNumberFieldDef(fieldDef)) { + if (!aggregate_1.isCountingAggregateOp(fieldDef.aggregate)) { + implicit[fieldDef.field] = 'number'; + } + } + else if (util_1.accessPathDepth(fieldDef.field) > 1) { + // For non-date/non-number (strings and booleans), derive a flattened field for a referenced nested field. + // (Parsing numbers / dates already flattens numeric and temporal fields.) + if (!(fieldDef.field in implicit)) { + implicit[fieldDef.field] = 'flatten'; + } + } + else if (fielddef_1.isScaleFieldDef(fieldDef) && sort_1.isSortField(fieldDef.sort) && util_1.accessPathDepth(fieldDef.sort.field) > 1) { + // Flatten fields that we sort by but that are not otherwise flattened. + if (!(fieldDef.sort.field in implicit)) { + implicit[fieldDef.sort.field] = 'flatten'; + } + } + }); + } + return this.makeWithAncestors(parent, {}, implicit, ancestorParse); + }; + /** + * Creates a parse node from "explicit" parse and "implicit" parse and updates ancestorParse. + */ + ParseNode.makeWithAncestors = function (parent, explicit, implicit, ancestorParse) { + // We should not parse what has already been parsed in a parent (explicitly or implicitly) or what has been derived (maked as "derived"). We also don't need to flatten a field that has already been parsed. + for (var _i = 0, _a = util_1.keys(implicit); _i < _a.length; _i++) { + var field = _a[_i]; + var parsedAs = ancestorParse.getWithExplicit(field); + if (parsedAs.value !== undefined) { + // We always ignore derived fields even if they are implicitly defined because we expect users to create the right types. + if (parsedAs.explicit || parsedAs.value === implicit[field] || parsedAs.value === 'derived' || implicit[field] === 'flatten') { + delete implicit[field]; + } + else { + log.warn(log.message.differentParse(field, implicit[field], parsedAs.value)); + } + } + } + for (var _b = 0, _c = util_1.keys(explicit); _b < _c.length; _b++) { + var field = _c[_b]; + var parsedAs = ancestorParse.get(field); + if (parsedAs !== undefined) { + // Don't parse a field again if it has been parsed with the same type already. + if (parsedAs === explicit[field]) { + delete explicit[field]; + } + else { + log.warn(log.message.differentParse(field, explicit[field], parsedAs)); + } + } + } + var parse = new split_1.Split(explicit, implicit); + // add the format parse from this model so that children don't parse the same field again + ancestorParse.copyAll(parse); + // copy only non-null parses + var p = {}; + for (var _d = 0, _e = util_1.keys(parse.combine()); _d < _e.length; _d++) { + var key = _e[_d]; + var val = parse.get(key); + if (val !== null) { + p[key] = val; + } + } + if (util_1.keys(p).length === 0 || ancestorParse.parseNothing) { + return null; + } + return new ParseNode(parent, p); + }; + Object.defineProperty(ParseNode.prototype, "parse", { + get: function () { + return this._parse; + }, + enumerable: true, + configurable: true + }); + ParseNode.prototype.merge = function (other) { + this._parse = tslib_1.__assign({}, this._parse, other.parse); + other.remove(); + }; + /** + * Assemble an object for Vega's format.parse property. + */ + ParseNode.prototype.assembleFormatParse = function () { + var formatParse = {}; + for (var _i = 0, _a = util_1.keys(this._parse); _i < _a.length; _i++) { + var field = _a[_i]; + var p = this._parse[field]; + if (util_1.accessPathDepth(field) === 1) { + formatParse[field] = p; + } + } + return formatParse; + }; + // format parse depends and produces all fields in its parse + ParseNode.prototype.producedFields = function () { + return vega_util_1.toSet(util_1.keys(this._parse)); + }; + ParseNode.prototype.dependentFields = function () { + return vega_util_1.toSet(util_1.keys(this._parse)); + }; + ParseNode.prototype.assembleTransforms = function (onlyNested) { + var _this = this; + if (onlyNested === void 0) { onlyNested = false; } + return util_1.keys(this._parse) + .filter(function (field) { return onlyNested ? util_1.accessPathDepth(field) > 1 : true; }) + .map(function (field) { + var expr = parseExpression(field, _this._parse[field]); + if (!expr) { + return null; + } + var formula = { + type: 'formula', + expr: expr, + as: util_1.removePathFromField(field) // Vega output is always flattened + }; + return formula; + }).filter(function (t) { return t !== null; }); + }; + return ParseNode; +}(dataflow_1.DataFlowNode)); +exports.ParseNode = ParseNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0cGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Zvcm1hdHBhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFvRDtBQUVwRCw2Q0FBc0Q7QUFDdEQsMkNBQW9EO0FBQ3BELDJDQUFpRjtBQUNqRixxREFBaUM7QUFDakMseUNBQTBDO0FBQzFDLDZDQUFzSDtBQUN0SCxtQ0FBdUM7QUFFdkMsbUNBQXVIO0FBRXZILGtDQUEwRDtBQUMxRCxrQ0FBK0I7QUFDL0IsdUNBQXdDO0FBR3hDOzs7R0FHRztBQUNILHlCQUF5QixLQUFhLEVBQUUsS0FBYTtJQUNuRCxJQUFNLENBQUMsR0FBRywwQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyQyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsT0FBTyxjQUFZLENBQUMsTUFBRyxDQUFDO0tBQ3pCO1NBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQzlCLE9BQU8sZUFBYSxDQUFDLE1BQUcsQ0FBQztLQUMxQjtTQUFNLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLGNBQVksQ0FBQyxNQUFHLENBQUM7S0FDekI7U0FBTSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7UUFDM0IsT0FBTyxZQUFVLENBQUMsTUFBRyxDQUFDO0tBQ3ZCO1NBQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQzlCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxPQUFPLGVBQWEsQ0FBQyxTQUFJLFNBQVMsTUFBRyxDQUFDO0tBQ3ZDO1NBQU0sSUFBSSxLQUFLLENB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QUNFLE9BQU8saUJBQUssQ0FBQyxXQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLHNDQUFrQixHQUF6QixVQUEwQixVQUFrQjtRQUE1QyxpQkFnQkM7UUFoQnlCLDJCQUFBLEVBQUEsa0JBQWtCO1FBQzFDLE9BQU8sV0FBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDckIsTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQkFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUE5QyxDQUE4QyxDQUFDO2FBQy9ELEdBQUcsQ0FBQyxVQUFBLEtBQUs7WUFDUixJQUFNLElBQUksR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLEtBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULE9BQU8sSUFBSSxDQUFDO2FBQ2I7WUFFRCxJQUFNLE9BQU8sR0FBdUI7Z0JBQ2xDLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksTUFBQTtnQkFDSixFQUFFLEVBQUUsMEJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUUsa0NBQWtDO2FBQ25FLENBQUM7WUFDRixPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLEtBQUssSUFBSSxFQUFWLENBQVUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFDSCxnQkFBQztBQUFELENBQUMsQUF2TUQsQ0FBK0IsdUJBQVksR0F1TTFDO0FBdk1ZLDhCQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc051bWJlciwgaXNTdHJpbmcsIHRvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtBbmNlc3RvclBhcnNlfSBmcm9tICcuJztcbmltcG9ydCB7aXNDb3VudGluZ0FnZ3JlZ2F0ZU9wfSBmcm9tICcuLi8uLi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtEYXRlVGltZSwgaXNEYXRlVGltZX0gZnJvbSAnLi4vLi4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtpc051bWJlckZpZWxkRGVmLCBpc1NjYWxlRmllbGREZWYsIGlzVGltZUZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7Zm9yRWFjaExlYWZ9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtpc0ZpZWxkRXF1YWxQcmVkaWNhdGUsIGlzRmllbGRPbmVPZlByZWRpY2F0ZSwgaXNGaWVsZFByZWRpY2F0ZSwgaXNGaWVsZFJhbmdlUHJlZGljYXRlfSBmcm9tICcuLi8uLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtpc1NvcnRGaWVsZH0gZnJvbSAnLi4vLi4vc29ydCc7XG5pbXBvcnQge0ZpbHRlclRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7YWNjZXNzUGF0aERlcHRoLCBhY2Nlc3NQYXRoV2l0aERhdHVtLCBEaWN0LCBkdXBsaWNhdGUsIGtleXMsIHJlbW92ZVBhdGhGcm9tRmllbGQsIFN0cmluZ1NldH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRm9ybXVsYVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5cbi8qKlxuICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZC5cbiAqIEBwYXJhbSBwYXJzZSBXaGF0IHRvIHBhcnNlIHRoZSBmaWVsZCBhcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGZpZWxkOiBzdHJpbmcsIHBhcnNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmID0gYWNjZXNzUGF0aFdpdGhEYXR1bShmaWVsZCk7XG4gIGlmIChwYXJzZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYHRvTnVtYmVyKCR7Zn0pYDtcbiAgfSBlbHNlIGlmIChwYXJzZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGB0b0Jvb2xlYW4oJHtmfSlgO1xuICB9IGVsc2UgaWYgKHBhcnNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgdG9TdHJpbmcoJHtmfSlgO1xuICB9IGVsc2UgaWYgKHBhcnNlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gYHRvRGF0ZSgke2Z9KWA7XG4gIH0gZWxzZSBpZiAocGFyc2UgPT09ICdmbGF0dGVuJykge1xuICAgIHJldHVybiBmO1xuICB9IGVsc2UgaWYgKHBhcnNlLmluZGV4T2YoJ2RhdGU6JykgPT09IDApIHtcbiAgICBjb25zdCBzcGVjaWZpZXIgPSBwYXJzZS5zbGljZSg1LCBwYXJzZS5sZW5ndGgpO1xuICAgIHJldHVybiBgdGltZVBhcnNlKCR7Zn0sJHtzcGVjaWZpZXJ9KWA7XG4gIH0gZWxzZSBpZiAocGFyc2UuaW5kZXhPZigndXRjOicpID09PSAwKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVyID0gcGFyc2Uuc2xpY2UoNCwgcGFyc2UubGVuZ3RoKTtcbiAgICByZXR1cm4gYHV0Y1BhcnNlKCR7Zn0sJHtzcGVjaWZpZXJ9KWA7XG4gIH0gZWxzZSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UudW5yZWNvZ25pemVkUGFyc2UocGFyc2UpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBfcGFyc2U6IERpY3Q8c3RyaW5nPjtcblxuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZU5vZGUobnVsbCwgZHVwbGljYXRlKHRoaXMuX3BhcnNlKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcGFyc2U6IERpY3Q8c3RyaW5nPikge1xuICAgIHN1cGVyKHBhcmVudCk7XG5cbiAgICB0aGlzLl9wYXJzZSA9IHBhcnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXJzZSBub2RlIGZyb20gYSBkYXRhLmZvcm1hdC5wYXJzZSBhbmQgdXBkYXRlcyBhbmNlc3RvclBhcnNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtYWtlRXhwbGljaXQocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbCwgYW5jZXN0b3JQYXJzZTogQW5jZXN0b3JQYXJzZSkge1xuICAgIC8vIEN1c3RvbSBwYXJzZVxuICAgIGxldCBleHBsaWNpdCA9IHt9O1xuICAgIGNvbnN0IGRhdGEgPSBtb2RlbC5kYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuZm9ybWF0ICYmIGRhdGEuZm9ybWF0LnBhcnNlKSB7XG4gICAgICBleHBsaWNpdCA9IGRhdGEuZm9ybWF0LnBhcnNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwgZXhwbGljaXQsIHt9LCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUltcGxpY2l0RnJvbUZpbHRlclRyYW5zZm9ybShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgdHJhbnNmb3JtOiBGaWx0ZXJUcmFuc2Zvcm0sIGFuY2VzdG9yUGFyc2U6IEFuY2VzdG9yUGFyc2UpIHtcbiAgICBjb25zdCBwYXJzZSA9IHt9O1xuICAgIGZvckVhY2hMZWFmKHRyYW5zZm9ybS5maWx0ZXIsIGZpbHRlciA9PiB7XG4gICAgICBpZiAoaXNGaWVsZFByZWRpY2F0ZShmaWx0ZXIpKSB7XG4gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgYWRkIGEgcGFyc2Ugbm9kZSBmb3IgZmlsdGVycyB3aXRoIGZpbHRlciBvYmplY3RzXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlVGltZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRm9yIEVxdWFsRmlsdGVyLCBqdXN0IHVzZSB0aGUgZXF1YWwgcHJvcGVydHkuXG4gICAgICAgIC8vIEZvciBSYW5nZUZpbHRlciBhbmQgT25lT2ZGaWx0ZXIsIGFsbCBhcnJheSBtZW1iZXJzIHNob3VsZCBoYXZlXG4gICAgICAgIC8vIHRoZSBzYW1lIHR5cGUsIHNvIHdlIG9ubHkgdXNlIHRoZSBmaXJzdCBvbmUuXG4gICAgICAgIGlmIChpc0ZpZWxkRXF1YWxQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IGZpbHRlci5lcXVhbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpZWxkUmFuZ2VQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IGZpbHRlci5yYW5nZVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpZWxkT25lT2ZQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IChmaWx0ZXIub25lT2YgfHwgZmlsdGVyWydpbiddKVswXTtcbiAgICAgICAgfSAvLyBlbHNlIC0tIGZvciBmaWx0ZXIgZXhwcmVzc2lvbiwgd2UgY2FuJ3QgaW5mZXIgYW55dGhpbmdcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIGlmIChpc0RhdGVUaW1lKHZhbCkpIHtcbiAgICAgICAgICAgIHBhcnNlW2ZpbHRlci5maWVsZF0gPSAnZGF0ZSc7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgICBwYXJzZVtmaWx0ZXIuZmllbGRdID0gJ251bWJlcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWwpKSB7XG4gICAgICAgICAgICBwYXJzZVtmaWx0ZXIuZmllbGRdID0gJ3N0cmluZyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci50aW1lVW5pdCkge1xuICAgICAgICAgIHBhcnNlW2ZpbHRlci5maWVsZF0gPSAnZGF0ZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChrZXlzKHBhcnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwge30sIHBhcnNlLCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyc2Ugbm9kZSBmb3IgaW1wbGljaXQgcGFyc2luZyBmcm9tIGEgbW9kZWwgYW5kIHVwZGF0ZXMgYW5jZXN0b3JQYXJzZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogTW9kZWwsIGFuY2VzdG9yUGFyc2U6IEFuY2VzdG9yUGFyc2UpIHtcbiAgICBjb25zdCBpbXBsaWNpdCA9IHt9O1xuXG4gICAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgICAvLyBQYXJzZSBlbmNvZGVkIGZpZWxkc1xuICAgICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKGZpZWxkRGVmID0+IHtcbiAgICAgICAgaWYgKGlzVGltZUZpZWxkRGVmKGZpZWxkRGVmKSkge1xuICAgICAgICAgIGltcGxpY2l0W2ZpZWxkRGVmLmZpZWxkXSA9ICdkYXRlJztcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlckZpZWxkRGVmKGZpZWxkRGVmKSkge1xuICAgICAgICAgIGlmICghaXNDb3VudGluZ0FnZ3JlZ2F0ZU9wKGZpZWxkRGVmLmFnZ3JlZ2F0ZSkpIHtcbiAgICAgICAgICAgIGltcGxpY2l0W2ZpZWxkRGVmLmZpZWxkXSA9ICdudW1iZXInO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3NQYXRoRGVwdGgoZmllbGREZWYuZmllbGQpID4gMSkge1xuICAgICAgICAgIC8vIEZvciBub24tZGF0ZS9ub24tbnVtYmVyIChzdHJpbmdzIGFuZCBib29sZWFucyksIGRlcml2ZSBhIGZsYXR0ZW5lZCBmaWVsZCBmb3IgYSByZWZlcmVuY2VkIG5lc3RlZCBmaWVsZC5cbiAgICAgICAgICAvLyAoUGFyc2luZyBudW1iZXJzIC8gZGF0ZXMgYWxyZWFkeSBmbGF0dGVucyBudW1lcmljIGFuZCB0ZW1wb3JhbCBmaWVsZHMuKVxuICAgICAgICAgIGlmICghKGZpZWxkRGVmLmZpZWxkIGluIGltcGxpY2l0KSkge1xuICAgICAgICAgICAgaW1wbGljaXRbZmllbGREZWYuZmllbGRdID0gJ2ZsYXR0ZW4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1NjYWxlRmllbGREZWYoZmllbGREZWYpICYmIGlzU29ydEZpZWxkKGZpZWxkRGVmLnNvcnQpICYmIGFjY2Vzc1BhdGhEZXB0aChmaWVsZERlZi5zb3J0LmZpZWxkKSA+IDEpIHtcbiAgICAgICAgICAvLyBGbGF0dGVuIGZpZWxkcyB0aGF0IHdlIHNvcnQgYnkgYnV0IHRoYXQgYXJlIG5vdCBvdGhlcndpc2UgZmxhdHRlbmVkLlxuICAgICAgICAgIGlmICghKGZpZWxkRGVmLnNvcnQuZmllbGQgaW4gaW1wbGljaXQpKSB7XG4gICAgICAgICAgICBpbXBsaWNpdFtmaWVsZERlZi5zb3J0LmZpZWxkXSA9ICdmbGF0dGVuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwge30sIGltcGxpY2l0LCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyc2Ugbm9kZSBmcm9tIFwiZXhwbGljaXRcIiBwYXJzZSBhbmQgXCJpbXBsaWNpdFwiIHBhcnNlIGFuZCB1cGRhdGVzIGFuY2VzdG9yUGFyc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtYWtlV2l0aEFuY2VzdG9ycyhwYXJlbnQ6IERhdGFGbG93Tm9kZSwgZXhwbGljaXQ6IERpY3Q8c3RyaW5nPiwgaW1wbGljaXQ6IERpY3Q8c3RyaW5nPiwgYW5jZXN0b3JQYXJzZTogQW5jZXN0b3JQYXJzZSkge1xuICAgIC8vIFdlIHNob3VsZCBub3QgcGFyc2Ugd2hhdCBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBpbiBhIHBhcmVudCAoZXhwbGljaXRseSBvciBpbXBsaWNpdGx5KSBvciB3aGF0IGhhcyBiZWVuIGRlcml2ZWQgKG1ha2VkIGFzIFwiZGVyaXZlZFwiKS4gV2UgYWxzbyBkb24ndCBuZWVkIHRvIGZsYXR0ZW4gYSBmaWVsZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLlxuICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyhpbXBsaWNpdCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEFzID0gYW5jZXN0b3JQYXJzZS5nZXRXaXRoRXhwbGljaXQoZmllbGQpO1xuICAgICAgaWYgKHBhcnNlZEFzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2UgYWx3YXlzIGlnbm9yZSBkZXJpdmVkIGZpZWxkcyBldmVuIGlmIHRoZXkgYXJlIGltcGxpY2l0bHkgZGVmaW5lZCBiZWNhdXNlIHdlIGV4cGVjdCB1c2VycyB0byBjcmVhdGUgdGhlIHJpZ2h0IHR5cGVzLlxuICAgICAgICBpZiAocGFyc2VkQXMuZXhwbGljaXQgfHwgcGFyc2VkQXMudmFsdWUgPT09IGltcGxpY2l0W2ZpZWxkXSB8fCBwYXJzZWRBcy52YWx1ZSA9PT0gJ2Rlcml2ZWQnIHx8IGltcGxpY2l0W2ZpZWxkXSA9PT0gJ2ZsYXR0ZW4nKSB7XG4gICAgICAgICAgZGVsZXRlIGltcGxpY2l0W2ZpZWxkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kaWZmZXJlbnRQYXJzZShmaWVsZCwgaW1wbGljaXRbZmllbGRdLCBwYXJzZWRBcy52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBrZXlzKGV4cGxpY2l0KSkge1xuICAgICAgY29uc3QgcGFyc2VkQXMgPSBhbmNlc3RvclBhcnNlLmdldChmaWVsZCk7XG4gICAgICBpZiAocGFyc2VkQXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBEb24ndCBwYXJzZSBhIGZpZWxkIGFnYWluIGlmIGl0IGhhcyBiZWVuIHBhcnNlZCB3aXRoIHRoZSBzYW1lIHR5cGUgYWxyZWFkeS5cbiAgICAgICAgaWYgKHBhcnNlZEFzID09PSBleHBsaWNpdFtmaWVsZF0pIHtcbiAgICAgICAgICBkZWxldGUgZXhwbGljaXRbZmllbGRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRpZmZlcmVudFBhcnNlKGZpZWxkLCBleHBsaWNpdFtmaWVsZF0sIHBhcnNlZEFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZSA9IG5ldyBTcGxpdChleHBsaWNpdCwgaW1wbGljaXQpO1xuXG4gICAgLy8gYWRkIHRoZSBmb3JtYXQgcGFyc2UgZnJvbSB0aGlzIG1vZGVsIHNvIHRoYXQgY2hpbGRyZW4gZG9uJ3QgcGFyc2UgdGhlIHNhbWUgZmllbGQgYWdhaW5cbiAgICBhbmNlc3RvclBhcnNlLmNvcHlBbGwocGFyc2UpO1xuXG4gICAgLy8gY29weSBvbmx5IG5vbi1udWxsIHBhcnNlc1xuICAgIGNvbnN0IHAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKHBhcnNlLmNvbWJpbmUoKSkpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHBhcnNlLmdldChrZXkpO1xuICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICBwW2tleV0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleXMocCkubGVuZ3RoID09PSAwIHx8IGFuY2VzdG9yUGFyc2UucGFyc2VOb3RoaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnNlTm9kZShwYXJlbnQsIHApO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2U7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2Uob3RoZXI6IFBhcnNlTm9kZSkge1xuICAgIHRoaXMuX3BhcnNlID0gey4uLnRoaXMuX3BhcnNlLCAuLi5vdGhlci5wYXJzZX07XG4gICAgb3RoZXIucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYW4gb2JqZWN0IGZvciBWZWdhJ3MgZm9ybWF0LnBhcnNlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGFzc2VtYmxlRm9ybWF0UGFyc2UoKSB7XG4gICAgY29uc3QgZm9ybWF0UGFyc2UgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXModGhpcy5fcGFyc2UpKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5fcGFyc2VbZmllbGRdO1xuICAgICAgaWYgKGFjY2Vzc1BhdGhEZXB0aChmaWVsZCkgPT09IDEpIHtcbiAgICAgICAgZm9ybWF0UGFyc2VbZmllbGRdID0gcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdFBhcnNlO1xuICB9XG5cbiAgLy8gZm9ybWF0IHBhcnNlIGRlcGVuZHMgYW5kIHByb2R1Y2VzIGFsbCBmaWVsZHMgaW4gaXRzIHBhcnNlXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpOiBTdHJpbmdTZXQge1xuICAgIHJldHVybiB0b1NldChrZXlzKHRoaXMuX3BhcnNlKSk7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kZW50RmllbGRzKCk6IFN0cmluZ1NldCB7XG4gICAgcmV0dXJuIHRvU2V0KGtleXModGhpcy5fcGFyc2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVRyYW5zZm9ybXMob25seU5lc3RlZCA9IGZhbHNlKTogVmdGb3JtdWxhVHJhbnNmb3JtW10ge1xuICAgIHJldHVybiBrZXlzKHRoaXMuX3BhcnNlKVxuICAgICAgLmZpbHRlcihmaWVsZCA9PiBvbmx5TmVzdGVkID8gYWNjZXNzUGF0aERlcHRoKGZpZWxkKSA+IDEgOiB0cnVlKVxuICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oZmllbGQsIHRoaXMuX3BhcnNlW2ZpZWxkXSk7XG4gICAgICAgIGlmICghZXhwcikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybXVsYTogVmdGb3JtdWxhVHJhbnNmb3JtID0ge1xuICAgICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgICBleHByLFxuICAgICAgICAgIGFzOiByZW1vdmVQYXRoRnJvbUZpZWxkKGZpZWxkKSAgLy8gVmVnYSBvdXRwdXQgaXMgYWx3YXlzIGZsYXR0ZW5lZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybXVsYTtcbiAgICAgIH0pLmZpbHRlcih0ID0+IHQgIT09IG51bGwpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/geojson.d.ts b/build/src/compile/data/geojson.d.ts new file mode 100644 index 0000000000..64120ef8ae --- /dev/null +++ b/build/src/compile/data/geojson.d.ts @@ -0,0 +1,12 @@ +import { VgGeoJSONTransform } from '../../vega.schema'; +import { UnitModel } from '../unit'; +import { DataFlowNode } from './dataflow'; +export declare class GeoJSONNode extends DataFlowNode { + private fields?; + private geojson?; + private signal?; + clone(): GeoJSONNode; + static parseAll(parent: DataFlowNode, model: UnitModel): DataFlowNode; + constructor(parent: DataFlowNode, fields?: string[], geojson?: string, signal?: string); + assemble(): VgGeoJSONTransform; +} diff --git a/build/src/compile/data/geojson.js b/build/src/compile/data/geojson.js new file mode 100644 index 0000000000..dee45e0467 --- /dev/null +++ b/build/src/compile/data/geojson.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var GeoJSONNode = /** @class */ (function (_super) { + tslib_1.__extends(GeoJSONNode, _super); + function GeoJSONNode(parent, fields, geojson, signal) { + var _this = _super.call(this, parent) || this; + _this.fields = fields; + _this.geojson = geojson; + _this.signal = signal; + return _this; + } + GeoJSONNode.prototype.clone = function () { + return new GeoJSONNode(null, util_1.duplicate(this.fields), this.geojson, this.signal); + }; + GeoJSONNode.parseAll = function (parent, model) { + var geoJsonCounter = 0; + [[channel_1.LONGITUDE, channel_1.LATITUDE], [channel_1.LONGITUDE2, channel_1.LATITUDE2]].forEach(function (coordinates) { + var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; }); + if (pair[0] || pair[1]) { + parent = new GeoJSONNode(parent, pair, null, model.getName("geojson_" + geoJsonCounter++)); + } + }); + if (model.channelHasField(channel_1.SHAPE)) { + var fieldDef = model.fieldDef(channel_1.SHAPE); + if (fieldDef.type === type_1.GEOJSON) { + parent = new GeoJSONNode(parent, null, fieldDef.field, model.getName("geojson_" + geoJsonCounter++)); + } + } + return parent; + }; + GeoJSONNode.prototype.assemble = function () { + return tslib_1.__assign({ type: 'geojson' }, (this.fields ? { fields: this.fields } : {}), (this.geojson ? { geojson: this.geojson } : {}), { signal: this.signal }); + }; + return GeoJSONNode; +}(dataflow_1.DataFlowNode)); +exports.GeoJSONNode = GeoJSONNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvanNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZ2VvanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBb0c7QUFDcEcsbUNBQW1DO0FBQ25DLG1DQUFxQztBQUdyQyx1Q0FBd0M7QUFFeEM7SUFBaUMsdUNBQVk7SUE0QjNDLHFCQUFZLE1BQW9CLEVBQVUsTUFBaUIsRUFBVSxPQUFnQixFQUFVLE1BQWU7UUFBOUcsWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FDZDtRQUZ5QyxZQUFNLEdBQU4sTUFBTSxDQUFXO1FBQVUsYUFBTyxHQUFQLE9BQU8sQ0FBUztRQUFVLFlBQU0sR0FBTixNQUFNLENBQVM7O0lBRTlHLENBQUM7SUE3Qk0sMkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFYSxvQkFBUSxHQUF0QixVQUF1QixNQUFvQixFQUFFLEtBQWdCO1FBQzNELElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztRQUV2QixDQUFDLENBQUMsbUJBQVMsRUFBRSxrQkFBUSxDQUFDLEVBQUUsQ0FBQyxvQkFBVSxFQUFFLG1CQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLFdBQWlDO1lBQ3pGLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQzFCLFVBQUEsT0FBTyxJQUFJLE9BQUEsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBMUUsQ0FBMEUsQ0FDdEYsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEIsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBVyxjQUFjLEVBQUksQ0FBQyxDQUFDLENBQUM7YUFDNUY7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxlQUFLLENBQUMsRUFBRTtZQUNoQyxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLGVBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxjQUFPLEVBQUU7Z0JBQzdCLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFXLGNBQWMsRUFBSSxDQUFDLENBQUMsQ0FBQzthQUN0RztTQUNGO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQU1NLDhCQUFRLEdBQWY7UUFDRSwwQkFDRSxJQUFJLEVBQUUsU0FBUyxJQUNaLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDMUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUNoRCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFDbkI7SUFDSixDQUFDO0lBQ0gsa0JBQUM7QUFBRCxDQUFDLEFBeENELENBQWlDLHVCQUFZLEdBd0M1QztBQXhDWSxrQ0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R2VvUG9zaXRpb25DaGFubmVsLCBMQVRJVFVERSwgTEFUSVRVREUyLCBMT05HSVRVREUsIExPTkdJVFVERTIsIFNIQVBFfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7R0VPSlNPTn0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnR2VvSlNPTlRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5leHBvcnQgY2xhc3MgR2VvSlNPTk5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OTm9kZShudWxsLCBkdXBsaWNhdGUodGhpcy5maWVsZHMpLCB0aGlzLmdlb2pzb24sIHRoaXMuc2lnbmFsKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgcGFyc2VBbGwocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBVbml0TW9kZWwpOiBEYXRhRmxvd05vZGUge1xuICAgIGxldCBnZW9Kc29uQ291bnRlciA9IDA7XG5cbiAgICBbW0xPTkdJVFVERSwgTEFUSVRVREVdLCBbTE9OR0lUVURFMiwgTEFUSVRVREUyXV0uZm9yRWFjaCgoY29vcmRpbmF0ZXM6IEdlb1Bvc2l0aW9uQ2hhbm5lbFtdKSA9PiB7XG4gICAgICBjb25zdCBwYWlyID0gY29vcmRpbmF0ZXMubWFwKFxuICAgICAgICBjaGFubmVsID0+IG1vZGVsLmNoYW5uZWxIYXNGaWVsZChjaGFubmVsKSA/IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpLmZpZWxkIDogdW5kZWZpbmVkXG4gICAgICApO1xuXG4gICAgICBpZiAocGFpclswXSB8fCBwYWlyWzFdKSB7XG4gICAgICAgIHBhcmVudCA9IG5ldyBHZW9KU09OTm9kZShwYXJlbnQsIHBhaXIsIG51bGwsIG1vZGVsLmdldE5hbWUoYGdlb2pzb25fJHtnZW9Kc29uQ291bnRlcisrfWApKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChtb2RlbC5jaGFubmVsSGFzRmllbGQoU0hBUEUpKSB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKFNIQVBFKTtcbiAgICAgIGlmIChmaWVsZERlZi50eXBlID09PSBHRU9KU09OKSB7XG4gICAgICAgIHBhcmVudCA9IG5ldyBHZW9KU09OTm9kZShwYXJlbnQsIG51bGwsIGZpZWxkRGVmLmZpZWxkLCBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7Z2VvSnNvbkNvdW50ZXIrK31gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwcml2YXRlIGZpZWxkcz86IHN0cmluZ1tdLCBwcml2YXRlIGdlb2pzb24/OiBzdHJpbmcsIHByaXZhdGUgc2lnbmFsPzogc3RyaW5nKSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0dlb0pTT05UcmFuc2Zvcm0ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZ2VvanNvbicsXG4gICAgICAuLi4odGhpcy5maWVsZHMgPyB7ZmllbGRzOiB0aGlzLmZpZWxkc30gOiB7fSksXG4gICAgICAuLi4odGhpcy5nZW9qc29uID8ge2dlb2pzb246IHRoaXMuZ2VvanNvbn0gOiB7fSksXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/geopoint.d.ts b/build/src/compile/data/geopoint.d.ts new file mode 100644 index 0000000000..d081cd9e6d --- /dev/null +++ b/build/src/compile/data/geopoint.d.ts @@ -0,0 +1,12 @@ +import { VgGeoPointTransform } from '../../vega.schema'; +import { UnitModel } from '../unit'; +import { DataFlowNode } from './dataflow'; +export declare class GeoPointNode extends DataFlowNode { + private projection; + private fields; + private as; + clone(): GeoPointNode; + constructor(parent: DataFlowNode, projection: string, fields: string[], as: string[]); + static parseAll(parent: DataFlowNode, model: UnitModel): DataFlowNode; + assemble(): VgGeoPointTransform; +} diff --git a/build/src/compile/data/geopoint.js b/build/src/compile/data/geopoint.js new file mode 100644 index 0000000000..dafd4aba8a --- /dev/null +++ b/build/src/compile/data/geopoint.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var GeoPointNode = /** @class */ (function (_super) { + tslib_1.__extends(GeoPointNode, _super); + function GeoPointNode(parent, projection, fields, as) { + var _this = _super.call(this, parent) || this; + _this.projection = projection; + _this.fields = fields; + _this.as = as; + return _this; + } + GeoPointNode.prototype.clone = function () { + return new GeoPointNode(null, this.projection, util_1.duplicate(this.fields), util_1.duplicate(this.as)); + }; + GeoPointNode.parseAll = function (parent, model) { + if (!model.projectionName()) { + return parent; + } + [[channel_1.LONGITUDE, channel_1.LATITUDE], [channel_1.LONGITUDE2, channel_1.LATITUDE2]].forEach(function (coordinates) { + var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; }); + var suffix = coordinates[0] === channel_1.LONGITUDE2 ? '2' : ''; + if (pair[0] || pair[1]) { + parent = new GeoPointNode(parent, model.projectionName(), pair, [model.getName('x' + suffix), model.getName('y' + suffix)]); + } + }); + return parent; + }; + GeoPointNode.prototype.assemble = function () { + return { + type: 'geopoint', + projection: this.projection, + fields: this.fields, + as: this.as + }; + }; + return GeoPointNode; +}(dataflow_1.DataFlowNode)); +exports.GeoPointNode = GeoPointNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2dlb3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUE2RjtBQUM3RixtQ0FBcUM7QUFHckMsdUNBQXdDO0FBR3hDO0lBQWtDLHdDQUFZO0lBSzVDLHNCQUFZLE1BQW9CLEVBQVUsVUFBa0IsRUFBVSxNQUFnQixFQUFVLEVBQVk7UUFBNUcsWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FDZDtRQUZ5QyxnQkFBVSxHQUFWLFVBQVUsQ0FBUTtRQUFVLFlBQU0sR0FBTixNQUFNLENBQVU7UUFBVSxRQUFFLEdBQUYsRUFBRSxDQUFVOztJQUU1RyxDQUFDO0lBTk0sNEJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsZ0JBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsZ0JBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBTWEscUJBQVEsR0FBdEIsVUFBdUIsTUFBb0IsRUFBRSxLQUFnQjtRQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzNCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxDQUFDLENBQUMsbUJBQVMsRUFBRSxrQkFBUSxDQUFDLEVBQUUsQ0FBQyxvQkFBVSxFQUFFLG1CQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLFdBQWlDO1lBQ3pGLElBQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQzFCLFVBQUEsT0FBTyxJQUFJLE9BQUEsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBMUUsQ0FBMEUsQ0FDdEYsQ0FBQztZQUVGLElBQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxvQkFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUV4RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RCLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FDdkIsTUFBTSxFQUNOLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFDdEIsSUFBSSxFQUNKLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FDM0QsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sK0JBQVEsR0FBZjtRQUNFLE9BQU87WUFDTCxJQUFJLEVBQUUsVUFBVTtZQUNoQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtTQUNaLENBQUM7SUFDSixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBMUNELENBQWtDLHVCQUFZLEdBMEM3QztBQTFDWSxvQ0FBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R2VvUG9zaXRpb25DaGFubmVsLCBMQVRJVFVERSwgTEFUSVRVREUyLCBMT05HSVRVREUsIExPTkdJVFVERTJ9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtkdXBsaWNhdGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0dlb1BvaW50VHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cblxuZXhwb3J0IGNsYXNzIEdlb1BvaW50Tm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEdlb1BvaW50Tm9kZShudWxsLCB0aGlzLnByb2plY3Rpb24sIGR1cGxpY2F0ZSh0aGlzLmZpZWxkcyksIGR1cGxpY2F0ZSh0aGlzLmFzKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBwcm9qZWN0aW9uOiBzdHJpbmcsIHByaXZhdGUgZmllbGRzOiBzdHJpbmdbXSwgcHJpdmF0ZSBhczogc3RyaW5nW10pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBwYXJzZUFsbChwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IFVuaXRNb2RlbCk6IERhdGFGbG93Tm9kZSB7XG4gICAgaWYgKCFtb2RlbC5wcm9qZWN0aW9uTmFtZSgpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIFtbTE9OR0lUVURFLCBMQVRJVFVERV0sIFtMT05HSVRVREUyLCBMQVRJVFVERTJdXS5mb3JFYWNoKChjb29yZGluYXRlczogR2VvUG9zaXRpb25DaGFubmVsW10pID0+IHtcbiAgICAgIGNvbnN0IHBhaXIgPSBjb29yZGluYXRlcy5tYXAoXG4gICAgICAgIGNoYW5uZWwgPT4gbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKGNoYW5uZWwpID8gbW9kZWwuZmllbGREZWYoY2hhbm5lbCkuZmllbGQgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvb3JkaW5hdGVzWzBdID09PSBMT05HSVRVREUyID8gJzInIDogJyc7XG5cbiAgICAgIGlmIChwYWlyWzBdIHx8IHBhaXJbMV0pIHtcbiAgICAgICAgcGFyZW50ID0gbmV3IEdlb1BvaW50Tm9kZShcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgbW9kZWwucHJvamVjdGlvbk5hbWUoKSxcbiAgICAgICAgICBwYWlyLFxuICAgICAgICAgIFttb2RlbC5nZXROYW1lKCd4JyArIHN1ZmZpeCksIG1vZGVsLmdldE5hbWUoJ3knICsgc3VmZml4KV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdHZW9Qb2ludFRyYW5zZm9ybSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdnZW9wb2ludCcsXG4gICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXG4gICAgICBmaWVsZHM6IHRoaXMuZmllbGRzLFxuICAgICAgYXM6IHRoaXMuYXNcbiAgICB9O1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/indentifier.d.ts b/build/src/compile/data/indentifier.d.ts new file mode 100644 index 0000000000..e5ac572e15 --- /dev/null +++ b/build/src/compile/data/indentifier.d.ts @@ -0,0 +1,9 @@ +import { StringSet } from '../../util'; +import { VgIdentifierTransform } from '../../vega.schema'; +import { DataFlowNode } from './dataflow'; +export declare class IdentifierNode extends DataFlowNode { + clone(): IdentifierNode; + constructor(parent: DataFlowNode); + producedFields(): StringSet; + assemble(): VgIdentifierTransform; +} diff --git a/build/src/compile/data/indentifier.js b/build/src/compile/data/indentifier.js new file mode 100644 index 0000000000..136555133a --- /dev/null +++ b/build/src/compile/data/indentifier.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var selection_1 = require("../../selection"); +var dataflow_1 = require("./dataflow"); +var IdentifierNode = /** @class */ (function (_super) { + tslib_1.__extends(IdentifierNode, _super); + function IdentifierNode(parent) { + return _super.call(this, parent) || this; + } + IdentifierNode.prototype.clone = function () { + return new IdentifierNode(null); + }; + IdentifierNode.prototype.producedFields = function () { + var _a; + return _a = {}, _a[selection_1.SELECTION_ID] = true, _a; + }; + IdentifierNode.prototype.assemble = function () { + return { type: 'identifier', as: selection_1.SELECTION_ID }; + }; + return IdentifierNode; +}(dataflow_1.DataFlowNode)); +exports.IdentifierNode = IdentifierNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZW50aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2luZGVudGlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE2QztBQUc3Qyx1Q0FBd0M7QUFFeEM7SUFBb0MsMENBQVk7SUFLOUMsd0JBQVksTUFBb0I7ZUFDOUIsa0JBQU0sTUFBTSxDQUFDO0lBQ2YsQ0FBQztJQU5NLDhCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFNTSx1Q0FBYyxHQUFyQjs7UUFDRSxnQkFBUSxHQUFDLHdCQUFZLElBQUcsSUFBSSxLQUFFO0lBQ2hDLENBQUM7SUFFTSxpQ0FBUSxHQUFmO1FBQ0UsT0FBTyxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLHdCQUFZLEVBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBaEJELENBQW9DLHVCQUFZLEdBZ0IvQztBQWhCWSx3Q0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U0VMRUNUSU9OX0lEfSBmcm9tICcuLi8uLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtTdHJpbmdTZXR9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0lkZW50aWZpZXJUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuZXhwb3J0IGNsYXNzIElkZW50aWZpZXJOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgSWRlbnRpZmllck5vZGUobnVsbCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSkge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKTogU3RyaW5nU2V0IHtcbiAgICByZXR1cm4ge1tTRUxFQ1RJT05fSURdOiB0cnVlfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0lkZW50aWZpZXJUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB7dHlwZTogJ2lkZW50aWZpZXInLCBhczogU0VMRUNUSU9OX0lEfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/index.d.ts b/build/src/compile/data/index.d.ts new file mode 100644 index 0000000000..dc01feff76 --- /dev/null +++ b/build/src/compile/data/index.d.ts @@ -0,0 +1,54 @@ +import { Dict } from '../../util'; +import { Split } from '../split'; +import { OutputNode } from './dataflow'; +import { FacetNode } from './facet'; +import { SourceNode } from './source'; +export interface DataComponent { + /** + * A dictionary of sources indexed by a hash. + */ + sources: Dict; + /** + * Registry of output nodes. + */ + outputNodes: Dict; + /** + * How often is an output node used. If it is not used, we don't need to + * instantiate it in the assemble step. + */ + outputNodeRefCounts: Dict; + /** + * The output node before aggregation. + */ + raw?: OutputNode; + /** + * The main output node. + */ + main?: OutputNode; + /** + * For facets, we store the reference to the root node. + */ + facetRoot?: FacetNode; + /** + * True if the data for this model is faceted. + * A dataset is faceted if a parent model is a facet and no new dataset is + * defined (which would make the data unfaceted again). + */ + isFaceted: boolean; + /** + * Parse properties passed down from ancestors. Helps us to keep track of what has been parsed or is derived. + */ + ancestorParse?: AncestorParse; +} +/** + * Class to track interesting properties (see https://15721.courses.cs.cmu.edu/spring2016/papers/graefe-ieee1995.pdf) + * about how fields have been parsed or whether they have been derived in a transforms. We use this to not parse the + * same field again (or differently). + */ +export declare class AncestorParse extends Split> { + readonly explicit: Partial>; + readonly implicit: Partial>; + parseNothing: boolean; + constructor(explicit?: Partial>, implicit?: Partial>, parseNothing?: boolean); + clone(): AncestorParse; +} diff --git a/build/src/compile/data/index.js b/build/src/compile/data/index.js new file mode 100644 index 0000000000..6daf2dd1c1 --- /dev/null +++ b/build/src/compile/data/index.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var split_1 = require("../split"); +/** + * Class to track interesting properties (see https://15721.courses.cs.cmu.edu/spring2016/papers/graefe-ieee1995.pdf) + * about how fields have been parsed or whether they have been derived in a transforms. We use this to not parse the + * same field again (or differently). + */ +var AncestorParse = /** @class */ (function (_super) { + tslib_1.__extends(AncestorParse, _super); + function AncestorParse(explicit, implicit, parseNothing) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + if (parseNothing === void 0) { parseNothing = false; } + var _this = _super.call(this, explicit, implicit) || this; + _this.explicit = explicit; + _this.implicit = implicit; + _this.parseNothing = parseNothing; + return _this; + } + AncestorParse.prototype.clone = function () { + var clone = _super.prototype.clone.call(this); + clone.parseNothing = this.parseNothing; + return clone; + }; + return AncestorParse; +}(split_1.Split)); +exports.AncestorParse = AncestorParse; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLGtDQUErQjtBQWtEL0I7Ozs7R0FJRztBQUNIO0lBQW1DLHlDQUFtQjtJQUNwRCx1QkFDa0IsUUFBb0MsRUFDcEMsUUFBb0MsRUFDN0MsWUFBb0I7UUFGWCx5QkFBQSxFQUFBLGFBQW9DO1FBQ3BDLHlCQUFBLEVBQUEsYUFBb0M7UUFDN0MsNkJBQUEsRUFBQSxvQkFBb0I7UUFIN0IsWUFLRSxrQkFBTSxRQUFRLEVBQUUsUUFBUSxDQUFDLFNBQzFCO1FBTGlCLGNBQVEsR0FBUixRQUFRLENBQTRCO1FBQ3BDLGNBQVEsR0FBUixRQUFRLENBQTRCO1FBQzdDLGtCQUFZLEdBQVosWUFBWSxDQUFROztJQUc3QixDQUFDO0lBRU0sNkJBQUssR0FBWjtRQUNFLElBQU0sS0FBSyxHQUFHLGlCQUFNLEtBQUssV0FBbUIsQ0FBQztRQUM3QyxLQUFLLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0gsb0JBQUM7QUFBRCxDQUFDLEFBZEQsQ0FBbUMsYUFBSyxHQWN2QztBQWRZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaWN0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7U3BsaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7T3V0cHV0Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5pbXBvcnQge0ZhY2V0Tm9kZX0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEEgZGljdGlvbmFyeSBvZiBzb3VyY2VzIGluZGV4ZWQgYnkgYSBoYXNoLlxuICAgKi9cbiAgc291cmNlczogRGljdDxTb3VyY2VOb2RlPjtcblxuICAvKipcbiAgICogUmVnaXN0cnkgb2Ygb3V0cHV0IG5vZGVzLlxuICAgKi9cbiAgb3V0cHV0Tm9kZXM6IERpY3Q8T3V0cHV0Tm9kZSB8IEZhY2V0Tm9kZT47XG5cbiAgLyoqXG4gICAqIEhvdyBvZnRlbiBpcyBhbiBvdXRwdXQgbm9kZSB1c2VkLiBJZiBpdCBpcyBub3QgdXNlZCwgd2UgZG9uJ3QgbmVlZCB0b1xuICAgKiBpbnN0YW50aWF0ZSBpdCBpbiB0aGUgYXNzZW1ibGUgc3RlcC5cbiAgICovXG4gIG91dHB1dE5vZGVSZWZDb3VudHM6IERpY3Q8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBub2RlIGJlZm9yZSBhZ2dyZWdhdGlvbi5cbiAgICovXG4gIHJhdz86IE91dHB1dE5vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIG91dHB1dCBub2RlLlxuICAgKi9cbiAgbWFpbj86IE91dHB1dE5vZGU7XG5cbiAgLyoqXG4gICAqIEZvciBmYWNldHMsIHdlIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3Qgbm9kZS5cbiAgICovXG4gIGZhY2V0Um9vdD86IEZhY2V0Tm9kZTtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZGF0YSBmb3IgdGhpcyBtb2RlbCBpcyBmYWNldGVkLlxuICAgKiBBIGRhdGFzZXQgaXMgZmFjZXRlZCBpZiBhIHBhcmVudCBtb2RlbCBpcyBhIGZhY2V0IGFuZCBubyBuZXcgZGF0YXNldCBpc1xuICAgKiBkZWZpbmVkICh3aGljaCB3b3VsZCBtYWtlIHRoZSBkYXRhIHVuZmFjZXRlZCBhZ2FpbikuXG4gICAqL1xuICBpc0ZhY2V0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhcnNlIHByb3BlcnRpZXMgcGFzc2VkIGRvd24gZnJvbSBhbmNlc3RvcnMuIEhlbHBzIHVzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBoYXMgYmVlbiBwYXJzZWQgb3IgaXMgZGVyaXZlZC5cbiAgICovXG4gIGFuY2VzdG9yUGFyc2U/OiBBbmNlc3RvclBhcnNlO1xufVxuXG4vKipcbiAqIENsYXNzIHRvIHRyYWNrIGludGVyZXN0aW5nIHByb3BlcnRpZXMgKHNlZSBodHRwczovLzE1NzIxLmNvdXJzZXMuY3MuY211LmVkdS9zcHJpbmcyMDE2L3BhcGVycy9ncmFlZmUtaWVlZTE5OTUucGRmKVxuICogYWJvdXQgaG93IGZpZWxkcyBoYXZlIGJlZW4gcGFyc2VkIG9yIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gZGVyaXZlZCBpbiBhIHRyYW5zZm9ybXMuIFdlIHVzZSB0aGlzIHRvIG5vdCBwYXJzZSB0aGVcbiAqIHNhbWUgZmllbGQgYWdhaW4gKG9yIGRpZmZlcmVudGx5KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFuY2VzdG9yUGFyc2UgZXh0ZW5kcyBTcGxpdDxEaWN0PHN0cmluZz4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGV4cGxpY2l0OiBQYXJ0aWFsPERpY3Q8c3RyaW5nPj4gPSB7fSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW1wbGljaXQ6IFBhcnRpYWw8RGljdDxzdHJpbmc+PiA9IHt9LFxuICAgIHB1YmxpYyBwYXJzZU5vdGhpbmcgPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcihleHBsaWNpdCwgaW1wbGljaXQpO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IEFuY2VzdG9yUGFyc2Uge1xuICAgIGNvbnN0IGNsb25lID0gc3VwZXIuY2xvbmUoKSBhcyBBbmNlc3RvclBhcnNlO1xuICAgIGNsb25lLnBhcnNlTm90aGluZyA9IHRoaXMucGFyc2VOb3RoaW5nO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/lookup.d.ts b/build/src/compile/data/lookup.d.ts new file mode 100644 index 0000000000..a4ed24d0ca --- /dev/null +++ b/build/src/compile/data/lookup.d.ts @@ -0,0 +1,13 @@ +import { LookupTransform } from '../../transform'; +import { StringSet } from '../../util'; +import { VgLookupTransform } from '../../vega.schema'; +import { Model } from '../model'; +import { DataFlowNode } from './dataflow'; +export declare class LookupNode extends DataFlowNode { + readonly transform: LookupTransform; + readonly secondary: string; + constructor(parent: DataFlowNode, transform: LookupTransform, secondary: string); + static make(parent: DataFlowNode, model: Model, transform: LookupTransform, counter: number): LookupNode; + producedFields(): StringSet; + assemble(): VgLookupTransform; +} diff --git a/build/src/compile/data/lookup.js b/build/src/compile/data/lookup.js new file mode 100644 index 0000000000..a09f39629f --- /dev/null +++ b/build/src/compile/data/lookup.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var log = tslib_1.__importStar(require("../../log")); +var dataflow_1 = require("./dataflow"); +var source_1 = require("./source"); +var LookupNode = /** @class */ (function (_super) { + tslib_1.__extends(LookupNode, _super); + function LookupNode(parent, transform, secondary) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + _this.secondary = secondary; + return _this; + } + LookupNode.make = function (parent, model, transform, counter) { + var sources = model.component.data.sources; + var s = new source_1.SourceNode(transform.from.data); + var fromSource = sources[s.hash()]; + if (!fromSource) { + sources[s.hash()] = s; + fromSource = s; + } + var fromOutputName = model.getName("lookup_" + counter); + var fromOutputNode = new dataflow_1.OutputNode(fromSource, fromOutputName, 'lookup', model.component.data.outputNodeRefCounts); + model.component.data.outputNodes[fromOutputName] = fromOutputNode; + return new LookupNode(parent, transform, fromOutputNode.getSource()); + }; + LookupNode.prototype.producedFields = function () { + return vega_util_1.toSet(this.transform.from.fields || ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as])); + }; + LookupNode.prototype.assemble = function () { + var foreign; + if (this.transform.from.fields) { + // lookup a few fields and add create a flat output + foreign = tslib_1.__assign({ values: this.transform.from.fields }, this.transform.as ? { as: ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as]) } : {}); + } + else { + // lookup full record and nest it + var asName = this.transform.as; + if (!vega_util_1.isString(asName)) { + log.warn(log.message.NO_FIELDS_NEEDS_AS); + asName = '_lookup'; + } + foreign = { + as: [asName] + }; + } + return tslib_1.__assign({ type: 'lookup', from: this.secondary, key: this.transform.from.key, fields: [this.transform.lookup] }, foreign, (this.transform.default ? { default: this.transform.default } : {})); + }; + return LookupNode; +}(dataflow_1.DataFlowNode)); +exports.LookupNode = LookupNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9sb29rdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQTBDO0FBQzFDLHFEQUFpQztBQUtqQyx1Q0FBb0Q7QUFDcEQsbUNBQW9DO0FBRXBDO0lBQWdDLHNDQUFZO0lBQzFDLG9CQUFZLE1BQW9CLEVBQWtCLFNBQTBCLEVBQWtCLFNBQWlCO1FBQS9HLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBQ2Q7UUFGaUQsZUFBUyxHQUFULFNBQVMsQ0FBaUI7UUFBa0IsZUFBUyxHQUFULFNBQVMsQ0FBUTs7SUFFL0csQ0FBQztJQUVhLGVBQUksR0FBbEIsVUFBbUIsTUFBb0IsRUFBRSxLQUFZLEVBQUUsU0FBMEIsRUFBRSxPQUFlO1FBQ2hHLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3QyxJQUFNLENBQUMsR0FBRyxJQUFJLG1CQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQztTQUNoQjtRQUVELElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBVSxPQUFTLENBQUMsQ0FBQztRQUMxRCxJQUFNLGNBQWMsR0FBRyxJQUFJLHFCQUFVLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV0SCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsY0FBYyxDQUFDO1FBRWxFLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sbUNBQWMsR0FBckI7UUFDRSxPQUFPLGlCQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0gsQ0FBQztJQUVNLDZCQUFRLEdBQWY7UUFDRSxJQUFJLE9BQW1DLENBQUM7UUFFeEMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDOUIsbURBQW1EO1lBQ25ELE9BQU8sc0JBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFDOUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDcEgsQ0FBQztTQUNIO2FBQU07WUFDTCxpQ0FBaUM7WUFDakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLG9CQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLEdBQUcsU0FBUyxDQUFDO2FBQ3BCO1lBRUQsT0FBTyxHQUFHO2dCQUNSLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQzthQUNiLENBQUM7U0FDSDtRQUVELDBCQUNFLElBQUksRUFBRSxRQUFRLEVBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQ3BCLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQzVCLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQzVCLE9BQU8sRUFDUCxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDcEU7SUFDSixDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQUFDLEFBekRELENBQWdDLHVCQUFZLEdBeUQzQztBQXpEWSxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmcsIHRvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge0xvb2t1cFRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7U3RyaW5nU2V0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdMb29rdXBUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlLCBPdXRwdXROb2RlfSBmcm9tICcuL2RhdGFmbG93JztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi9zb3VyY2UnO1xuXG5leHBvcnQgY2xhc3MgTG9va3VwTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwdWJsaWMgcmVhZG9ubHkgdHJhbnNmb3JtOiBMb29rdXBUcmFuc2Zvcm0sIHB1YmxpYyByZWFkb25seSBzZWNvbmRhcnk6IHN0cmluZykge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1ha2UocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbCwgdHJhbnNmb3JtOiBMb29rdXBUcmFuc2Zvcm0sIGNvdW50ZXI6IG51bWJlcikge1xuICAgIGNvbnN0IHNvdXJjZXMgPSBtb2RlbC5jb21wb25lbnQuZGF0YS5zb3VyY2VzO1xuICAgIGNvbnN0IHMgPSBuZXcgU291cmNlTm9kZSh0cmFuc2Zvcm0uZnJvbS5kYXRhKTtcbiAgICBsZXQgZnJvbVNvdXJjZSA9IHNvdXJjZXNbcy5oYXNoKCldO1xuICAgIGlmICghZnJvbVNvdXJjZSkge1xuICAgICAgc291cmNlc1tzLmhhc2goKV0gPSBzO1xuICAgICAgZnJvbVNvdXJjZSA9IHM7XG4gICAgfVxuXG4gICAgY29uc3QgZnJvbU91dHB1dE5hbWUgPSBtb2RlbC5nZXROYW1lKGBsb29rdXBfJHtjb3VudGVyfWApO1xuICAgIGNvbnN0IGZyb21PdXRwdXROb2RlID0gbmV3IE91dHB1dE5vZGUoZnJvbVNvdXJjZSwgZnJvbU91dHB1dE5hbWUsICdsb29rdXAnLCBtb2RlbC5jb21wb25lbnQuZGF0YS5vdXRwdXROb2RlUmVmQ291bnRzKTtcblxuICAgIG1vZGVsLmNvbXBvbmVudC5kYXRhLm91dHB1dE5vZGVzW2Zyb21PdXRwdXROYW1lXSA9IGZyb21PdXRwdXROb2RlO1xuXG4gICAgcmV0dXJuIG5ldyBMb29rdXBOb2RlKHBhcmVudCwgdHJhbnNmb3JtLCBmcm9tT3V0cHV0Tm9kZS5nZXRTb3VyY2UoKSk7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKTogU3RyaW5nU2V0IHtcbiAgICByZXR1cm4gdG9TZXQodGhpcy50cmFuc2Zvcm0uZnJvbS5maWVsZHMgfHwgKCh0aGlzLnRyYW5zZm9ybS5hcyBpbnN0YW5jZW9mIEFycmF5KSA/IHRoaXMudHJhbnNmb3JtLmFzIDogW3RoaXMudHJhbnNmb3JtLmFzXSkpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnTG9va3VwVHJhbnNmb3JtIHtcbiAgICBsZXQgZm9yZWlnbjogUGFydGlhbDxWZ0xvb2t1cFRyYW5zZm9ybT47XG5cbiAgICBpZiAodGhpcy50cmFuc2Zvcm0uZnJvbS5maWVsZHMpIHtcbiAgICAgIC8vIGxvb2t1cCBhIGZldyBmaWVsZHMgYW5kIGFkZCBjcmVhdGUgYSBmbGF0IG91dHB1dFxuICAgICAgZm9yZWlnbiA9IHtcbiAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybS5mcm9tLmZpZWxkcyxcbiAgICAgICAgLi4uIHRoaXMudHJhbnNmb3JtLmFzID8ge2FzOiAoKHRoaXMudHJhbnNmb3JtLmFzIGluc3RhbmNlb2YgQXJyYXkpID8gdGhpcy50cmFuc2Zvcm0uYXMgOiBbdGhpcy50cmFuc2Zvcm0uYXNdKX0gOiB7fVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9va3VwIGZ1bGwgcmVjb3JkIGFuZCBuZXN0IGl0XG4gICAgICBsZXQgYXNOYW1lID0gdGhpcy50cmFuc2Zvcm0uYXM7XG4gICAgICBpZiAoIWlzU3RyaW5nKGFzTmFtZSkpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuTk9fRklFTERTX05FRURTX0FTKTtcbiAgICAgICAgYXNOYW1lID0gJ19sb29rdXAnO1xuICAgICAgfVxuXG4gICAgICBmb3JlaWduID0ge1xuICAgICAgICBhczogW2FzTmFtZV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgZnJvbTogdGhpcy5zZWNvbmRhcnksXG4gICAgICBrZXk6IHRoaXMudHJhbnNmb3JtLmZyb20ua2V5LFxuICAgICAgZmllbGRzOiBbdGhpcy50cmFuc2Zvcm0ubG9va3VwXSxcbiAgICAgIC4uLmZvcmVpZ24sXG4gICAgICAuLi4odGhpcy50cmFuc2Zvcm0uZGVmYXVsdCA/IHtkZWZhdWx0OiB0aGlzLnRyYW5zZm9ybS5kZWZhdWx0fSA6IHt9KVxuICAgIH07XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/data/optimize.d.ts b/build/src/compile/data/optimize.d.ts new file mode 100644 index 0000000000..38fea9125c --- /dev/null +++ b/build/src/compile/data/optimize.d.ts @@ -0,0 +1,6 @@ +import { DataComponent } from './index'; +export declare const FACET_SCALE_PREFIX = "scale_"; +/** + * Optimizes the dataflow of the passed in data component. + */ +export declare function optimizeDataflow(dataComponent: DataComponent): void; diff --git a/build/src/compile/data/optimize.js b/build/src/compile/data/optimize.js new file mode 100644 index 0000000000..b361c76fad --- /dev/null +++ b/build/src/compile/data/optimize.js @@ -0,0 +1,123 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var data_1 = require("../../data"); +var util_1 = require("../../util"); +var aggregate_1 = require("./aggregate"); +var dataflow_1 = require("./dataflow"); +var facet_1 = require("./facet"); +var filterinvalid_1 = require("./filterinvalid"); +var optimizers = tslib_1.__importStar(require("./optimizers")); +var stack_1 = require("./stack"); +exports.FACET_SCALE_PREFIX = 'scale_'; +/** + * Clones the subtree and ignores output nodes except for the leafs, which are renamed. + */ +function cloneSubtree(facet) { + function clone(node) { + if (!(node instanceof facet_1.FacetNode)) { + var copy_1 = node.clone(); + if (copy_1 instanceof dataflow_1.OutputNode) { + var newName = exports.FACET_SCALE_PREFIX + copy_1.getSource(); + copy_1.setSource(newName); + facet.model.component.data.outputNodes[newName] = copy_1; + } + else if (copy_1 instanceof aggregate_1.AggregateNode || copy_1 instanceof stack_1.StackNode) { + copy_1.addDimensions(facet.fields); + } + util_1.flatten(node.children.map(clone)).forEach(function (n) { return n.parent = copy_1; }); + return [copy_1]; + } + return util_1.flatten(node.children.map(clone)); + } + return clone; +} +/** + * Move facet nodes down to the next fork or output node. Also pull the main output with the facet node. + * After moving down the facet node, make a copy of the subtree and make it a child of the main output. + */ +function moveFacetDown(node) { + if (node instanceof facet_1.FacetNode) { + if (node.numChildren() === 1 && !(node.children[0] instanceof dataflow_1.OutputNode)) { + // move down until we hit a fork or output node + var child = node.children[0]; + if (child instanceof aggregate_1.AggregateNode || child instanceof stack_1.StackNode) { + child.addDimensions(node.fields); + } + child.swapWithParent(); + moveFacetDown(node); + } + else { + // move main to facet + moveMainDownToFacet(node.model.component.data.main); + // replicate the subtree and place it before the facet's main node + var copy = util_1.flatten(node.children.map(cloneSubtree(node))); + copy.forEach(function (c) { return c.parent = node.model.component.data.main; }); + } + } + else { + node.children.forEach(moveFacetDown); + } +} +function moveMainDownToFacet(node) { + if (node instanceof dataflow_1.OutputNode && node.type === data_1.MAIN) { + if (node.numChildren() === 1) { + var child = node.children[0]; + if (!(child instanceof facet_1.FacetNode)) { + child.swapWithParent(); + moveMainDownToFacet(node); + } + } + } +} +/** + * Remove nodes that are not required starting from a root. + */ +function removeUnnecessaryNodes(node) { + // remove empty null filter nodes + if (node instanceof filterinvalid_1.FilterInvalidNode && util_1.every(util_1.vals(node.filter), function (f) { return f === null; })) { + node.remove(); + } + // remove output nodes that are not required + if (node instanceof dataflow_1.OutputNode && !node.isRequired()) { + node.remove(); + } + node.children.forEach(removeUnnecessaryNodes); +} +/** + * Return all leaf nodes. + */ +function getLeaves(roots) { + var leaves = []; + function append(node) { + if (node.numChildren() === 0) { + leaves.push(node); + } + else { + node.children.forEach(append); + } + } + roots.forEach(append); + return leaves; +} +/** + * Optimizes the dataflow of the passed in data component. + */ +function optimizeDataflow(dataComponent) { + var roots = util_1.vals(dataComponent.sources); + roots.forEach(removeUnnecessaryNodes); + // remove source nodes that don't have any children because they also don't have output nodes + roots = roots.filter(function (r) { return r.numChildren() > 0; }); + getLeaves(roots).forEach(optimizers.iterateFromLeaves(optimizers.removeUnusedSubtrees)); + roots = roots.filter(function (r) { return r.numChildren() > 0; }); + getLeaves(roots).forEach(optimizers.iterateFromLeaves(optimizers.moveParseUp)); + getLeaves(roots).forEach(optimizers.removeDuplicateTimeUnits); + roots.forEach(moveFacetDown); + util_1.keys(dataComponent.sources).forEach(function (s) { + if (dataComponent.sources[s].numChildren() === 0) { + delete dataComponent.sources[s]; + } + }); +} +exports.optimizeDataflow = optimizeDataflow; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL29wdGltaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFnQztBQUNoQyxtQ0FBc0Q7QUFDdEQseUNBQTBDO0FBQzFDLHVDQUFvRDtBQUNwRCxpQ0FBa0M7QUFDbEMsaURBQWtEO0FBRWxELCtEQUEyQztBQUUzQyxpQ0FBa0M7QUFFckIsUUFBQSxrQkFBa0IsR0FBRyxRQUFRLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxzQkFBc0IsS0FBZ0I7SUFDcEMsZUFBZSxJQUFrQjtRQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksaUJBQVMsQ0FBQyxFQUFFO1lBQ2hDLElBQU0sTUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUxQixJQUFJLE1BQUksWUFBWSxxQkFBVSxFQUFFO2dCQUM5QixJQUFNLE9BQU8sR0FBRywwQkFBa0IsR0FBRyxNQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RELE1BQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBSSxDQUFDO2FBQ3hEO2lCQUFNLElBQUksTUFBSSxZQUFZLHlCQUFhLElBQUksTUFBSSxZQUFZLGlCQUFTLEVBQUU7Z0JBQ3JFLE1BQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2xDO1lBQ0QsY0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBZSxJQUFLLE9BQUEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFJLEVBQWYsQ0FBZSxDQUFDLENBQUM7WUFFaEYsT0FBTyxDQUFDLE1BQUks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SUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNoRCxPQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDakM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFwQkQsNENBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNQUlOfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7ZXZlcnksIGZsYXR0ZW4sIGtleXMsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtBZ2dyZWdhdGVOb2RlfSBmcm9tICcuL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZSwgT3V0cHV0Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5pbXBvcnQge0ZhY2V0Tm9kZX0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge0ZpbHRlckludmFsaWROb2RlfSBmcm9tICcuL2ZpbHRlcmludmFsaWQnO1xuaW1wb3J0IHtEYXRhQ29tcG9uZW50fSBmcm9tICcuL2luZGV4JztcbmltcG9ydCAqIGFzIG9wdGltaXplcnMgZnJvbSAnLi9vcHRpbWl6ZXJzJztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHtTdGFja05vZGV9IGZyb20gJy4vc3RhY2snO1xuXG5leHBvcnQgY29uc3QgRkFDRVRfU0NBTEVfUFJFRklYID0gJ3NjYWxlXyc7XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBzdWJ0cmVlIGFuZCBpZ25vcmVzIG91dHB1dCBub2RlcyBleGNlcHQgZm9yIHRoZSBsZWFmcywgd2hpY2ggYXJlIHJlbmFtZWQuXG4gKi9cbmZ1bmN0aW9uIGNsb25lU3VidHJlZShmYWNldDogRmFjZXROb2RlKSB7XG4gIGZ1bmN0aW9uIGNsb25lKG5vZGU6IERhdGFGbG93Tm9kZSk6IERhdGFGbG93Tm9kZVtdIHtcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2YgRmFjZXROb2RlKSkge1xuICAgICAgY29uc3QgY29weSA9IG5vZGUuY2xvbmUoKTtcblxuICAgICAgaWYgKGNvcHkgaW5zdGFuY2VvZiBPdXRwdXROb2RlKSB7XG4gICAgICAgIGNvbnN0IG5ld05hbWUgPSBGQUNFVF9TQ0FMRV9QUkVGSVggKyBjb3B5LmdldFNvdXJjZSgpO1xuICAgICAgICBjb3B5LnNldFNvdXJjZShuZXdOYW1lKTtcblxuICAgICAgICBmYWNldC5tb2RlbC5jb21wb25lbnQuZGF0YS5vdXRwdXROb2Rlc1tuZXdOYW1lXSA9IGNvcHk7XG4gICAgICB9IGVsc2UgaWYgKGNvcHkgaW5zdGFuY2VvZiBBZ2dyZWdhdGVOb2RlIHx8IGNvcHkgaW5zdGFuY2VvZiBTdGFja05vZGUpIHtcbiAgICAgICAgY29weS5hZGREaW1lbnNpb25zKGZhY2V0LmZpZWxkcyk7XG4gICAgICB9XG4gICAgICBmbGF0dGVuKG5vZGUuY2hpbGRyZW4ubWFwKGNsb25lKSkuZm9yRWFjaCgobjogRGF0YUZsb3dOb2RlKSA9PiBuLnBhcmVudCA9IGNvcHkpO1xuXG4gICAgICByZXR1cm4gW2NvcHldO1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0dGVuKG5vZGUuY2hpbGRyZW4ubWFwKGNsb25lKSk7XG4gIH1cbiAgcmV0dXJuIGNsb25lO1xufVxuXG4vKipcbiAqIE1vdmUgZmFjZXQgbm9kZXMgZG93biB0byB0aGUgbmV4dCBmb3JrIG9yIG91dHB1dCBub2RlLiBBbHNvIHB1bGwgdGhlIG1haW4gb3V0cHV0IHdpdGggdGhlIGZhY2V0IG5vZGUuXG4gKiBBZnRlciBtb3ZpbmcgZG93biB0aGUgZmFjZXQgbm9kZSwgbWFrZSBhIGNvcHkgb2YgdGhlIHN1YnRyZWUgYW5kIG1ha2UgaXQgYSBjaGlsZCBvZiB0aGUgbWFpbiBvdXRwdXQuXG4gKi9cbmZ1bmN0aW9uIG1vdmVGYWNldERvd24obm9kZTogRGF0YUZsb3dOb2RlKSB7XG4gIGlmIChub2RlIGluc3RhbmNlb2YgRmFjZXROb2RlKSB7XG4gICAgaWYgKG5vZGUubnVtQ2hpbGRyZW4oKSA9PT0gMSAmJiAhKG5vZGUuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBPdXRwdXROb2RlKSkge1xuICAgICAgLy8gbW92ZSBkb3duIHVudGlsIHdlIGhpdCBhIGZvcmsgb3Igb3V0cHV0IG5vZGVcblxuICAgICAgY29uc3QgY2hpbGQgPSBub2RlLmNoaWxkcmVuWzBdO1xuXG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBBZ2dyZWdhdGVOb2RlIHx8IGNoaWxkIGluc3RhbmNlb2YgU3RhY2tOb2RlKSB7XG4gICAgICAgIGNoaWxkLmFkZERpbWVuc2lvbnMobm9kZS5maWVsZHMpO1xuICAgICAgfVxuXG4gICAgICBjaGlsZC5zd2FwV2l0aFBhcmVudCgpO1xuICAgICAgbW92ZUZhY2V0RG93bihub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbW92ZSBtYWluIHRvIGZhY2V0XG4gICAgICBtb3ZlTWFpbkRvd25Ub0ZhY2V0KG5vZGUubW9kZWwuY29tcG9uZW50LmRhdGEubWFpbik7XG5cbiAgICAgIC8vIHJlcGxpY2F0ZSB0aGUgc3VidHJlZSBhbmQgcGxhY2UgaXQgYmVmb3JlIHRoZSBmYWNldCdzIG1haW4gbm9kZVxuICAgICAgY29uc3QgY29weTogRGF0YUZsb3dOb2RlW10gPSBmbGF0dGVuKG5vZGUuY2hpbGRyZW4ubWFwKGNsb25lU3VidHJlZShub2RlKSkpO1xuICAgICAgY29weS5mb3JFYWNoKGMgPT4gYy5wYXJlbnQgPSBub2RlLm1vZGVsLmNvbXBvbmVudC5kYXRhLm1haW4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2gobW92ZUZhY2V0RG93bik7XG4gIH1cbn1cblxuZnVuY3Rpb24gbW92ZU1haW5Eb3duVG9GYWNldChub2RlOiBEYXRhRmxvd05vZGUpIHtcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPdXRwdXROb2RlICYmIG5vZGUudHlwZSA9PT0gTUFJTikge1xuICAgIGlmIChub2RlLm51bUNoaWxkcmVuKCkgPT09IDEpIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcblxuICAgICAgaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBGYWNldE5vZGUpKSB7XG4gICAgICAgIGNoaWxkLnN3YXBXaXRoUGFyZW50KCk7XG4gICAgICAgIG1vdmVNYWluRG93blRvRmFjZXQobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlIG5vZGVzIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBzdGFydGluZyBmcm9tIGEgcm9vdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlVW5uZWNlc3NhcnlOb2Rlcyhub2RlOiBEYXRhRmxvd05vZGUpIHtcblxuICAvLyByZW1vdmUgZW1wdHkgbnVsbCBmaWx0ZXIgbm9kZXNcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWx0ZXJJbnZhbGlkTm9kZSAmJiBldmVyeSh2YWxzKG5vZGUuZmlsdGVyKSwgZiA9PiBmID09PSBudWxsKSkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH1cblxuICAvLyByZW1vdmUgb3V0cHV0IG5vZGVzIHRoYXQgYXJlIG5vdCByZXF1aXJlZFxuICBpZiAobm9kZSBpbnN0YW5jZW9mIE91dHB1dE5vZGUgJiYgIW5vZGUuaXNSZXF1aXJlZCgpKSB7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgfVxuXG4gIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChyZW1vdmVVbm5lY2Vzc2FyeU5vZGVzKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWxsIGxlYWYgbm9kZXMuXG4gKi9cbmZ1bmN0aW9uIGdldExlYXZlcyhyb290czogRGF0YUZsb3dOb2RlW10pIHtcbiAgY29uc3QgbGVhdmVzOiBEYXRhRmxvd05vZGVbXSA9IFtdO1xuICBmdW5jdGlvbiBhcHBlbmQobm9kZTogRGF0YUZsb3dOb2RlKSB7XG4gICAgaWYgKG5vZGUubnVtQ2hpbGRyZW4oKSA9PT0gMCkge1xuICAgICAgbGVhdmVzLnB1c2gobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChhcHBlbmQpO1xuICAgIH1cbiAgfVxuXG4gIHJvb3RzLmZvckVhY2goYXBwZW5kKTtcbiAgcmV0dXJuIGxlYXZlcztcbn1cblxuLyoqXG4gKiBPcHRpbWl6ZXMgdGhlIGRhdGFmbG93IG9mIHRoZSBwYXNzZWQgaW4gZGF0YSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpbWl6ZURhdGFmbG93KGRhdGFDb21wb25lbnQ6IERhdGFDb21wb25lbnQpIHtcbiAgbGV0IHJvb3RzOiBTb3VyY2VOb2RlW10gPSB2YWxzKGRhdGFDb21wb25lbnQuc291cmNlcyk7XG5cbiAgcm9vdHMuZm9yRWFjaChyZW1vdmVVbm5lY2Vzc2FyeU5vZGVzKTtcblxuICAvLyByZW1vdmUgc291cmNlIG5vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4gYmVjYXVzZSB0aGV5IGFsc28gZG9uJ3QgaGF2ZSBvdXRwdXQgbm9kZXNcbiAgcm9vdHMgPSByb290cy5maWx0ZXIociA9PiByLm51bUNoaWxkcmVuKCkgPiAwKTtcbiAgZ2V0TGVhdmVzKHJvb3RzKS5mb3JFYWNoKG9wdGltaXplcnMuaXRlcmF0ZUZyb21MZWF2ZXMob3B0aW1pemVycy5yZW1vdmVVbnVzZWRTdWJ0cmVlcykpO1xuICByb290cyA9IHJvb3RzLmZpbHRlcihyID0+IHIubnVtQ2hpbGRyZW4oKSA+IDApO1xuXG4gIGdldExlYXZlcyhyb290cykuZm9yRWFjaChvcHRpbWl6ZXJzLml0ZXJhdGVGcm9tTGVhdmVzKG9wdGltaXplcnMubW92ZVBhcnNlVXApKTtcbiAgZ2V0TGVhdmVzKHJvb3RzKS5mb3JFYWNoKG9wdGltaXplcnMucmVtb3ZlRHVwbGljYXRlVGltZVVuaXRzKTtcblxuICByb290cy5mb3JFYWNoKG1vdmVGYWNldERvd24pO1xuXG4gIGtleXMoZGF0YUNvbXBvbmVudC5zb3VyY2VzKS5mb3JFYWNoKHMgPT4ge1xuICAgIGlmIChkYXRhQ29tcG9uZW50LnNvdXJjZXNbc10ubnVtQ2hpbGRyZW4oKSA9PT0gMCkge1xuICAgICAgZGVsZXRlIGRhdGFDb21wb25lbnQuc291cmNlc1tzXTtcbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/optimizers.d.ts b/build/src/compile/data/optimizers.d.ts new file mode 100644 index 0000000000..a86176f2b3 --- /dev/null +++ b/build/src/compile/data/optimizers.d.ts @@ -0,0 +1,23 @@ +import { DataFlowNode } from './dataflow'; +/** + * Start optimization path at the leaves. Useful for merging up or removing things. + * + * If the callback returns true, the recursion continues. + */ +export declare function iterateFromLeaves(f: (node: DataFlowNode) => boolean): (node: DataFlowNode) => void; +/** + * Move parse nodes up to forks. + */ +export declare function moveParseUp(node: DataFlowNode): boolean; +/** + * Repeatedly remove leaf nodes that are not output or facet nodes. + * The reason is that we don't need subtrees that don't have any output nodes. + * Facet nodes are needed for the row or column domains. + */ +export declare function removeUnusedSubtrees(node: DataFlowNode): boolean; +/** + * Removes duplicate time unit nodes (as determined by the name of the + * output field) that may be generated due to selections projected over + * time units. + */ +export declare function removeDuplicateTimeUnits(leaf: DataFlowNode): void; diff --git a/build/src/compile/data/optimizers.js b/build/src/compile/data/optimizers.js new file mode 100644 index 0000000000..7c7ff81bb2 --- /dev/null +++ b/build/src/compile/data/optimizers.js @@ -0,0 +1,94 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var facet_1 = require("./facet"); +var formatparse_1 = require("./formatparse"); +var source_1 = require("./source"); +var timeunit_1 = require("./timeunit"); +/** + * Start optimization path at the leaves. Useful for merging up or removing things. + * + * If the callback returns true, the recursion continues. + */ +function iterateFromLeaves(f) { + function optimizeNextFromLeaves(node) { + if (node instanceof source_1.SourceNode) { + return; + } + var next = node.parent; + if (f(node)) { + optimizeNextFromLeaves(next); + } + } + return optimizeNextFromLeaves; +} +exports.iterateFromLeaves = iterateFromLeaves; +/** + * Move parse nodes up to forks. + */ +function moveParseUp(node) { + var parent = node.parent; + // move parse up by merging or swapping + if (node instanceof formatparse_1.ParseNode) { + if (parent instanceof source_1.SourceNode) { + return false; + } + if (parent.numChildren() > 1) { + // don't move parse further up but continue with parent. + return true; + } + if (parent instanceof formatparse_1.ParseNode) { + parent.merge(node); + } + else { + // don't swap with nodes that produce something that the parse node depends on (e.g. lookup) + if (util_1.hasIntersection(parent.producedFields(), node.dependentFields())) { + return true; + } + node.swapWithParent(); + } + } + return true; +} +exports.moveParseUp = moveParseUp; +/** + * Repeatedly remove leaf nodes that are not output or facet nodes. + * The reason is that we don't need subtrees that don't have any output nodes. + * Facet nodes are needed for the row or column domains. + */ +function removeUnusedSubtrees(node) { + if (node instanceof dataflow_1.OutputNode || node.numChildren() > 0 || node instanceof facet_1.FacetNode) { + // no need to continue with parent because it is output node or will have children (there was a fork) + return false; + } + else { + node.remove(); + } + return true; +} +exports.removeUnusedSubtrees = removeUnusedSubtrees; +/** + * Removes duplicate time unit nodes (as determined by the name of the + * output field) that may be generated due to selections projected over + * time units. + */ +function removeDuplicateTimeUnits(leaf) { + var fields = {}; + return iterateFromLeaves(function (node) { + if (node instanceof timeunit_1.TimeUnitNode) { + var pfields = node.producedFields(); + var dupe = util_1.keys(pfields).every(function (k) { return !!fields[k]; }); + if (dupe) { + node.remove(); + } + else { + fields = tslib_1.__assign({}, fields, pfields); + } + } + return true; + })(leaf); +} +exports.removeDuplicateTimeUnits = removeDuplicateTimeUnits; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvb3B0aW1pemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBaUQ7QUFDakQsdUNBQW9EO0FBQ3BELGlDQUFrQztBQUNsQyw2Q0FBd0M7QUFDeEMsbUNBQW9DO0FBQ3BDLHVDQUF3QztBQUd4Qzs7OztHQUlHO0FBQ0gsMkJBQWtDLENBQWtDO0lBQ2xFLGdDQUFnQyxJQUFrQjtRQUNoRCxJQUFJLElBQUksWUFBWSxtQkFBVSxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDWCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCxPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUM7QUFiRCw4Q0FhQztBQUVEOztHQUVHO0FBQ0gscUJBQTRCLElBQWtCO0lBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFM0IsdUNBQXVDO0lBQ3ZDLElBQUksSUFBSSxZQUFZLHVCQUFTLEVBQUU7UUFDN0IsSUFBSSxNQUFNLFlBQVksbUJBQVUsRUFBRTtZQUNoQyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQzVCLHdEQUF3RDtZQUN4RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxNQUFNLFlBQVksdUJBQVMsRUFBRTtZQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCO2FBQU07WUFDTCw0RkFBNEY7WUFDNUYsSUFBSSxzQkFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRTtnQkFDcEUsT0FBTyxJQUFJLENBQUM7YUFDYjtZQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztTQUN2QjtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBM0JELGtDQTJCQztBQUVEOzs7O0dBSUc7QUFDSCw4QkFBcUMsSUFBa0I7SUFDckQsSUFBSSxJQUFJLFlBQVkscUJBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksWUFBWSxpQkFBUyxFQUFFO1FBQ3JGLHFHQUFxRztRQUNyRyxPQUFPLEtBQUssQ0FBQztLQUNkO1NBQU07UUFDTCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7S0FDZjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQVJELG9EQVFDO0FBRUQ7Ozs7R0FJRztBQUNILGtDQUF5QyxJQUFrQjtJQUN6RCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDaEIsT0FBTyxpQkFBaUIsQ0FBQyxVQUFDLElBQWtCO1FBQzFDLElBQUksSUFBSSxZQUFZLHVCQUFZLEVBQUU7WUFDaEMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQU0sSUFBSSxHQUFHLFdBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFYLENBQVcsQ0FBQyxDQUFDO1lBRXJELElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNmO2lCQUFNO2dCQUNMLE1BQU0sd0JBQU8sTUFBTSxFQUFLLE9BQU8sQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQWhCRCw0REFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2hhc0ludGVyc2VjdGlvbiwga2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZSwgT3V0cHV0Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5pbXBvcnQge0ZhY2V0Tm9kZX0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge1BhcnNlTm9kZX0gZnJvbSAnLi9mb3JtYXRwYXJzZSc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuL3RpbWV1bml0JztcblxuXG4vKipcbiAqIFN0YXJ0IG9wdGltaXphdGlvbiBwYXRoIGF0IHRoZSBsZWF2ZXMuIFVzZWZ1bCBmb3IgbWVyZ2luZyB1cCBvciByZW1vdmluZyB0aGluZ3MuXG4gKlxuICogSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgdHJ1ZSwgdGhlIHJlY3Vyc2lvbiBjb250aW51ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlRnJvbUxlYXZlcyhmOiAobm9kZTogRGF0YUZsb3dOb2RlKSA9PiBib29sZWFuKSB7XG4gIGZ1bmN0aW9uIG9wdGltaXplTmV4dEZyb21MZWF2ZXMobm9kZTogRGF0YUZsb3dOb2RlKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dCA9IG5vZGUucGFyZW50O1xuICAgIGlmIChmKG5vZGUpKSB7XG4gICAgICBvcHRpbWl6ZU5leHRGcm9tTGVhdmVzKG5leHQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvcHRpbWl6ZU5leHRGcm9tTGVhdmVzO1xufVxuXG4vKipcbiAqIE1vdmUgcGFyc2Ugbm9kZXMgdXAgdG8gZm9ya3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtb3ZlUGFyc2VVcChub2RlOiBEYXRhRmxvd05vZGUpIHtcbiAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG5cbiAgLy8gbW92ZSBwYXJzZSB1cCBieSBtZXJnaW5nIG9yIHN3YXBwaW5nXG4gIGlmIChub2RlIGluc3RhbmNlb2YgUGFyc2VOb2RlKSB7XG4gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50Lm51bUNoaWxkcmVuKCkgPiAxKSB7XG4gICAgICAvLyBkb24ndCBtb3ZlIHBhcnNlIGZ1cnRoZXIgdXAgYnV0IGNvbnRpbnVlIHdpdGggcGFyZW50LlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIFBhcnNlTm9kZSkge1xuICAgICAgcGFyZW50Lm1lcmdlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkb24ndCBzd2FwIHdpdGggbm9kZXMgdGhhdCBwcm9kdWNlIHNvbWV0aGluZyB0aGF0IHRoZSBwYXJzZSBub2RlIGRlcGVuZHMgb24gKGUuZy4gbG9va3VwKVxuICAgICAgaWYgKGhhc0ludGVyc2VjdGlvbihwYXJlbnQucHJvZHVjZWRGaWVsZHMoKSwgbm9kZS5kZXBlbmRlbnRGaWVsZHMoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIG5vZGUuc3dhcFdpdGhQYXJlbnQoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZXBlYXRlZGx5IHJlbW92ZSBsZWFmIG5vZGVzIHRoYXQgYXJlIG5vdCBvdXRwdXQgb3IgZmFjZXQgbm9kZXMuXG4gKiBUaGUgcmVhc29uIGlzIHRoYXQgd2UgZG9uJ3QgbmVlZCBzdWJ0cmVlcyB0aGF0IGRvbid0IGhhdmUgYW55IG91dHB1dCBub2Rlcy5cbiAqIEZhY2V0IG5vZGVzIGFyZSBuZWVkZWQgZm9yIHRoZSByb3cgb3IgY29sdW1uIGRvbWFpbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVVbnVzZWRTdWJ0cmVlcyhub2RlOiBEYXRhRmxvd05vZGUpIHtcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPdXRwdXROb2RlIHx8IG5vZGUubnVtQ2hpbGRyZW4oKSA+IDAgfHwgbm9kZSBpbnN0YW5jZW9mIEZhY2V0Tm9kZSkge1xuICAgIC8vIG5vIG5lZWQgdG8gY29udGludWUgd2l0aCBwYXJlbnQgYmVjYXVzZSBpdCBpcyBvdXRwdXQgbm9kZSBvciB3aWxsIGhhdmUgY2hpbGRyZW4gKHRoZXJlIHdhcyBhIGZvcmspXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGVsc2Uge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBkdXBsaWNhdGUgdGltZSB1bml0IG5vZGVzIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBuYW1lIG9mIHRoZVxuICogb3V0cHV0IGZpZWxkKSB0aGF0IG1heSBiZSBnZW5lcmF0ZWQgZHVlIHRvIHNlbGVjdGlvbnMgcHJvamVjdGVkIG92ZXJcbiAqIHRpbWUgdW5pdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEdXBsaWNhdGVUaW1lVW5pdHMobGVhZjogRGF0YUZsb3dOb2RlKSB7XG4gIGxldCBmaWVsZHMgPSB7fTtcbiAgcmV0dXJuIGl0ZXJhdGVGcm9tTGVhdmVzKChub2RlOiBEYXRhRmxvd05vZGUpID0+IHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFRpbWVVbml0Tm9kZSkge1xuICAgICAgY29uc3QgcGZpZWxkcyA9IG5vZGUucHJvZHVjZWRGaWVsZHMoKTtcbiAgICAgIGNvbnN0IGR1cGUgPSBrZXlzKHBmaWVsZHMpLmV2ZXJ5KChrKSA9PiAhIWZpZWxkc1trXSk7XG5cbiAgICAgIGlmIChkdXBlKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWVsZHMgPSB7Li4uZmllbGRzLCAuLi5wZmllbGRzfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSkobGVhZik7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/parse.d.ts b/build/src/compile/data/parse.d.ts new file mode 100644 index 0000000000..aad97bc622 --- /dev/null +++ b/build/src/compile/data/parse.d.ts @@ -0,0 +1,8 @@ +import { Model } from '../model'; +import { DataFlowNode } from './dataflow'; +import { AncestorParse, DataComponent } from './index'; +/** + * Parses a transforms array into a chain of connected dataflow nodes. + */ +export declare function parseTransformArray(head: DataFlowNode, model: Model, ancestorParse: AncestorParse): DataFlowNode; +export declare function parseData(model: Model): DataComponent; diff --git a/build/src/compile/data/parse.js b/build/src/compile/data/parse.js new file mode 100644 index 0000000000..6cc3ff9916 --- /dev/null +++ b/build/src/compile/data/parse.js @@ -0,0 +1,242 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var data_1 = require("../../data"); +var log = tslib_1.__importStar(require("../../log")); +var transform_1 = require("../../transform"); +var util_1 = require("../../util"); +var model_1 = require("../model"); +var selection_1 = require("../selection/selection"); +var aggregate_1 = require("./aggregate"); +var bin_1 = require("./bin"); +var calculate_1 = require("./calculate"); +var dataflow_1 = require("./dataflow"); +var facet_1 = require("./facet"); +var filter_1 = require("./filter"); +var filterinvalid_1 = require("./filterinvalid"); +var formatparse_1 = require("./formatparse"); +var geojson_1 = require("./geojson"); +var geopoint_1 = require("./geopoint"); +var indentifier_1 = require("./indentifier"); +var index_1 = require("./index"); +var lookup_1 = require("./lookup"); +var source_1 = require("./source"); +var stack_1 = require("./stack"); +var timeunit_1 = require("./timeunit"); +var window_1 = require("./window"); +function parseRoot(model, sources) { + if (model.data || !model.parent) { + // if the model defines a data source or is the root, create a source node + var source = new source_1.SourceNode(model.data); + var hash = source.hash(); + if (hash in sources) { + // use a reference if we already have a source + return sources[hash]; + } + else { + // otherwise add a new one + sources[hash] = source; + return source; + } + } + else { + // If we don't have a source defined (overriding parent's data), use the parent's facet root or main. + return model.parent.component.data.facetRoot ? model.parent.component.data.facetRoot : model.parent.component.data.main; + } +} +/** + * Parses a transforms array into a chain of connected dataflow nodes. + */ +function parseTransformArray(head, model, ancestorParse) { + var lookupCounter = 0; + model.transforms.forEach(function (t) { + if (transform_1.isCalculate(t)) { + head = new calculate_1.CalculateNode(head, t); + ancestorParse.set(t.as, 'derived', false); + } + else if (transform_1.isFilter(t)) { + head = formatparse_1.ParseNode.makeImplicitFromFilterTransform(head, t, ancestorParse) || head; + head = new filter_1.FilterNode(head, model, t.filter); + } + else if (transform_1.isBin(t)) { + head = bin_1.BinNode.makeFromTransform(head, t, model); + ancestorParse.set(t.as, 'number', false); + } + else if (transform_1.isTimeUnit(t)) { + head = timeunit_1.TimeUnitNode.makeFromTransform(head, t); + ancestorParse.set(t.as, 'date', false); + } + else if (transform_1.isAggregate(t)) { + var agg = head = aggregate_1.AggregateNode.makeFromTransform(head, t); + if (selection_1.requiresSelectionId(model)) { + head = new indentifier_1.IdentifierNode(head); + } + for (var _i = 0, _a = util_1.keys(agg.producedFields()); _i < _a.length; _i++) { + var field = _a[_i]; + ancestorParse.set(field, 'derived', false); + } + } + else if (transform_1.isLookup(t)) { + var lookup = head = lookup_1.LookupNode.make(head, model, t, lookupCounter++); + for (var _b = 0, _c = util_1.keys(lookup.producedFields()); _b < _c.length; _b++) { + var field = _c[_b]; + ancestorParse.set(field, 'derived', false); + } + } + else if (transform_1.isWindow(t)) { + var window_2 = head = new window_1.WindowTransformNode(head, t); + for (var _d = 0, _e = util_1.keys(window_2.producedFields()); _d < _e.length; _d++) { + var field = _e[_d]; + ancestorParse.set(field, 'derived', false); + } + } + else if (transform_1.isStack(t)) { + var stack = head = stack_1.StackNode.makeFromTransform(head, t); + for (var _f = 0, _g = util_1.keys(stack.producedFields()); _f < _g.length; _f++) { + var field = _g[_f]; + ancestorParse.set(field, 'derived', false); + } + } + else { + log.warn(log.message.invalidTransformIgnored(t)); + return; + } + }); + return head; +} +exports.parseTransformArray = parseTransformArray; +/* +Description of the dataflow (http://asciiflow.com/): + +--------+ + | Source | + +---+----+ + | + v + FormatParse + (explicit) + | + v + Transforms +(Filter, Calculate, Binning, TimeUnit, Aggregate, Window, ...) + | + v + FormatParse + (implicit) + | + v + Binning (in `encoding`) + | + v + Timeunit (in `encoding`) + | + v +Formula From Sort Array + | + v + +--+--+ + | Raw | + +-----+ + | + v + Aggregate (in `encoding`) + | + v + Stack (in `encoding`) + | + v + Invalid Filter + | + v + +----------+ + | Main | + +----------+ + | + v + +-------+ + | Facet |----> "column", "column-layout", and "row" + +-------+ + | + v + ...Child data... +*/ +function parseData(model) { + var head = parseRoot(model, model.component.data.sources); + var _a = model.component.data, outputNodes = _a.outputNodes, outputNodeRefCounts = _a.outputNodeRefCounts; + var ancestorParse = model.parent ? model.parent.component.data.ancestorParse.clone() : new index_1.AncestorParse(); + // format.parse: null means disable parsing + if (model.data && model.data.format && model.data.format.parse === null) { + ancestorParse.parseNothing = true; + } + head = formatparse_1.ParseNode.makeExplicit(head, model, ancestorParse) || head; + // Default discrete selections require an identifier transform to + // uniquely identify data points as the _id field is volatile. Add + // this transform at the head of our pipeline such that the identifier + // field is available for all subsequent datasets. Additional identifier + // transforms will be necessary when new tuples are constructed + // (e.g., post-aggregation). + if (selection_1.requiresSelectionId(model) && (model_1.isUnitModel(model) || model_1.isLayerModel(model))) { + head = new indentifier_1.IdentifierNode(head); + } + // HACK: This is equivalent for merging bin extent for union scale. + // FIXME(https://github.com/vega/vega-lite/issues/2270): Correctly merge extent / bin node for shared bin scale + var parentIsLayer = model.parent && model_1.isLayerModel(model.parent); + if (model_1.isUnitModel(model) || model_1.isFacetModel(model)) { + if (parentIsLayer) { + head = bin_1.BinNode.makeFromEncoding(head, model) || head; + } + } + if (model.transforms.length > 0) { + head = parseTransformArray(head, model, ancestorParse); + } + head = formatparse_1.ParseNode.makeImplicitFromEncoding(head, model, ancestorParse) || head; + if (model_1.isUnitModel(model)) { + head = geojson_1.GeoJSONNode.parseAll(head, model); + head = geopoint_1.GeoPointNode.parseAll(head, model); + } + if (model_1.isUnitModel(model) || model_1.isFacetModel(model)) { + if (!parentIsLayer) { + head = bin_1.BinNode.makeFromEncoding(head, model) || head; + } + head = timeunit_1.TimeUnitNode.makeFromEncoding(head, model) || head; + head = calculate_1.CalculateNode.parseAllForSortIndex(head, model); + } + // add an output node pre aggregation + var rawName = model.getName(data_1.RAW); + var raw = new dataflow_1.OutputNode(head, rawName, data_1.RAW, outputNodeRefCounts); + outputNodes[rawName] = raw; + head = raw; + if (model_1.isUnitModel(model)) { + var agg = aggregate_1.AggregateNode.makeFromEncoding(head, model); + if (agg) { + head = agg; + if (selection_1.requiresSelectionId(model)) { + head = new indentifier_1.IdentifierNode(head); + } + } + head = stack_1.StackNode.makeFromEncoding(head, model) || head; + } + if (model_1.isUnitModel(model)) { + head = filterinvalid_1.FilterInvalidNode.make(head, model) || head; + } + // output node for marks + var mainName = model.getName(data_1.MAIN); + var main = new dataflow_1.OutputNode(head, mainName, data_1.MAIN, outputNodeRefCounts); + outputNodes[mainName] = main; + head = main; + // add facet marker + var facetRoot = null; + if (model_1.isFacetModel(model)) { + var facetName = model.getName('facet'); + facetRoot = new facet_1.FacetNode(head, model, facetName, main.getSource()); + outputNodes[facetName] = facetRoot; + head = facetRoot; + } + return tslib_1.__assign({}, model.component.data, { outputNodes: outputNodes, + outputNodeRefCounts: outputNodeRefCounts, + raw: raw, + main: main, + facetRoot: facetRoot, + ancestorParse: ancestorParse }); +} +exports.parseData = parseData; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFxQztBQUNyQyxxREFBaUM7QUFDakMsNkNBQW1IO0FBQ25ILG1DQUFzQztBQUN0QyxrQ0FBd0U7QUFDeEUsb0RBQTJEO0FBQzNELHlDQUEwQztBQUMxQyw2QkFBOEI7QUFDOUIseUNBQTBDO0FBQzFDLHVDQUFvRDtBQUNwRCxpQ0FBa0M7QUFDbEMsbUNBQW9DO0FBQ3BDLGlEQUFrRDtBQUNsRCw2Q0FBd0M7QUFDeEMscUNBQXNDO0FBQ3RDLHVDQUF3QztBQUN4Qyw2Q0FBNkM7QUFDN0MsaUNBQXFEO0FBQ3JELG1DQUFvQztBQUNwQyxtQ0FBb0M7QUFDcEMsaUNBQWtDO0FBQ2xDLHVDQUF3QztBQUN4QyxtQ0FBNkM7QUFFN0MsbUJBQW1CLEtBQVksRUFBRSxPQUF5QjtJQUN4RCxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQy9CLDBFQUEwRTtRQUMxRSxJQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzQixJQUFJLElBQUksSUFBSSxPQUFPLEVBQUU7WUFDbkIsOENBQThDO1lBQzlDLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDTCwwQkFBMEI7WUFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQztTQUNmO0tBQ0Y7U0FBTTtRQUNMLHFHQUFxRztRQUNyRyxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FB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LElBQUksR0FBRyxTQUFTLENBQUM7S0FDbEI7SUFFRCw0QkFDSyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksSUFDdkIsV0FBVyxhQUFBO1FBQ1gsbUJBQW1CLHFCQUFBO1FBQ25CLEdBQUcsS0FBQTtRQUNILElBQUksTUFBQTtRQUNKLFNBQVMsV0FBQTtRQUNULGFBQWEsZUFBQSxJQUNiO0FBQ0osQ0FBQztBQXBHRCw4QkFvR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01BSU4sIFJBV30gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7aXNBZ2dyZWdhdGUsIGlzQmluLCBpc0NhbGN1bGF0ZSwgaXNGaWx0ZXIsIGlzTG9va3VwLCBpc1N0YWNrLCBpc1RpbWVVbml0LCBpc1dpbmRvd30gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RGljdCwga2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2lzRmFjZXRNb2RlbCwgaXNMYXllck1vZGVsLCBpc1VuaXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7cmVxdWlyZXNTZWxlY3Rpb25JZH0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge0FnZ3JlZ2F0ZU5vZGV9IGZyb20gJy4vYWdncmVnYXRlJztcbmltcG9ydCB7QmluTm9kZX0gZnJvbSAnLi9iaW4nO1xuaW1wb3J0IHtDYWxjdWxhdGVOb2RlfSBmcm9tICcuL2NhbGN1bGF0ZSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZSwgT3V0cHV0Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5pbXBvcnQge0ZhY2V0Tm9kZX0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge0ZpbHRlck5vZGV9IGZyb20gJy4vZmlsdGVyJztcbmltcG9ydCB7RmlsdGVySW52YWxpZE5vZGV9IGZyb20gJy4vZmlsdGVyaW52YWxpZCc7XG5pbXBvcnQge1BhcnNlTm9kZX0gZnJvbSAnLi9mb3JtYXRwYXJzZSc7XG5pbXBvcnQge0dlb0pTT05Ob2RlfSBmcm9tICcuL2dlb2pzb24nO1xuaW1wb3J0IHtHZW9Qb2ludE5vZGV9IGZyb20gJy4vZ2VvcG9pbnQnO1xuaW1wb3J0IHtJZGVudGlmaWVyTm9kZX0gZnJvbSAnLi9pbmRlbnRpZmllcic7XG5pbXBvcnQge0FuY2VzdG9yUGFyc2UsIERhdGFDb21wb25lbnR9IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHtMb29rdXBOb2RlfSBmcm9tICcuL2xvb2t1cCc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7U3RhY2tOb2RlfSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7V2luZG93VHJhbnNmb3JtTm9kZX0gZnJvbSAnLi93aW5kb3cnO1xuXG5mdW5jdGlvbiBwYXJzZVJvb3QobW9kZWw6IE1vZGVsLCBzb3VyY2VzOiBEaWN0PFNvdXJjZU5vZGU+KTogRGF0YUZsb3dOb2RlIHtcbiAgaWYgKG1vZGVsLmRhdGEgfHwgIW1vZGVsLnBhcmVudCkge1xuICAgIC8vIGlmIHRoZSBtb2RlbCBkZWZpbmVzIGEgZGF0YSBzb3VyY2Ugb3IgaXMgdGhlIHJvb3QsIGNyZWF0ZSBhIHNvdXJjZSBub2RlXG4gICAgY29uc3Qgc291cmNlID0gbmV3IFNvdXJjZU5vZGUobW9kZWwuZGF0YSk7XG4gICAgY29uc3QgaGFzaCA9IHNvdXJjZS5oYXNoKCk7XG4gICAgaWYgKGhhc2ggaW4gc291cmNlcykge1xuICAgICAgLy8gdXNlIGEgcmVmZXJlbmNlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHNvdXJjZVxuICAgICAgcmV0dXJuIHNvdXJjZXNbaGFzaF07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSBhZGQgYSBuZXcgb25lXG4gICAgICBzb3VyY2VzW2hhc2hdID0gc291cmNlO1xuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHNvdXJjZSBkZWZpbmVkIChvdmVycmlkaW5nIHBhcmVudCdzIGRhdGEpLCB1c2UgdGhlIHBhcmVudCdzIGZhY2V0IHJvb3Qgb3IgbWFpbi5cbiAgICByZXR1cm4gbW9kZWwucGFyZW50LmNvbXBvbmVudC5kYXRhLmZhY2V0Um9vdCA/IG1vZGVsLnBhcmVudC5jb21wb25lbnQuZGF0YS5mYWNldFJvb3QgOiBtb2RlbC5wYXJlbnQuY29tcG9uZW50LmRhdGEubWFpbjtcbiAgfVxufVxuXG5cbi8qKlxuICogUGFyc2VzIGEgdHJhbnNmb3JtcyBhcnJheSBpbnRvIGEgY2hhaW4gb2YgY29ubmVjdGVkIGRhdGFmbG93IG5vZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1BcnJheShoZWFkOiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbCwgYW5jZXN0b3JQYXJzZTogQW5jZXN0b3JQYXJzZSk6IERhdGFGbG93Tm9kZSB7XG4gIGxldCBsb29rdXBDb3VudGVyID0gMDtcblxuICBtb2RlbC50cmFuc2Zvcm1zLmZvckVhY2godCA9PiB7XG4gICAgaWYgKGlzQ2FsY3VsYXRlKHQpKSB7XG4gICAgICBoZWFkID0gbmV3IENhbGN1bGF0ZU5vZGUoaGVhZCwgdCk7XG4gICAgICBhbmNlc3RvclBhcnNlLnNldCh0LmFzLCAnZGVyaXZlZCcsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGlzRmlsdGVyKHQpKSB7XG4gICAgICBoZWFkID0gUGFyc2VOb2RlLm1ha2VJbXBsaWNpdEZyb21GaWx0ZXJUcmFuc2Zvcm0oaGVhZCwgdCwgYW5jZXN0b3JQYXJzZSkgfHwgaGVhZDtcblxuICAgICAgaGVhZCA9IG5ldyBGaWx0ZXJOb2RlKGhlYWQsIG1vZGVsLCB0LmZpbHRlcik7XG4gICAgfSBlbHNlIGlmIChpc0Jpbih0KSkge1xuICAgICAgaGVhZCA9IEJpbk5vZGUubWFrZUZyb21UcmFuc2Zvcm0oaGVhZCwgdCwgbW9kZWwpO1xuXG4gICAgICBhbmNlc3RvclBhcnNlLnNldCh0LmFzLCAnbnVtYmVyJywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoaXNUaW1lVW5pdCh0KSkge1xuICAgICAgaGVhZCA9IFRpbWVVbml0Tm9kZS5tYWtlRnJvbVRyYW5zZm9ybShoZWFkLCB0KTtcblxuICAgICAgYW5jZXN0b3JQYXJzZS5zZXQodC5hcywgJ2RhdGUnLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChpc0FnZ3JlZ2F0ZSh0KSkge1xuICAgICAgY29uc3QgYWdnID0gaGVhZCA9IEFnZ3JlZ2F0ZU5vZGUubWFrZUZyb21UcmFuc2Zvcm0oaGVhZCwgdCk7XG5cbiAgICAgIGlmIChyZXF1aXJlc1NlbGVjdGlvbklkKG1vZGVsKSkge1xuICAgICAgICBoZWFkID0gbmV3IElkZW50aWZpZXJOb2RlKGhlYWQpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXMoYWdnLnByb2R1Y2VkRmllbGRzKCkpKSB7XG4gICAgICAgIGFuY2VzdG9yUGFyc2Uuc2V0KGZpZWxkLCAnZGVyaXZlZCcsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTG9va3VwKHQpKSB7XG4gICAgICBjb25zdCBsb29rdXAgPSBoZWFkID0gTG9va3VwTm9kZS5tYWtlKGhlYWQsIG1vZGVsLCB0LCBsb29rdXBDb3VudGVyKyspO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXMobG9va3VwLnByb2R1Y2VkRmllbGRzKCkpKSB7XG4gICAgICAgIGFuY2VzdG9yUGFyc2Uuc2V0KGZpZWxkLCAnZGVyaXZlZCcsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzV2luZG93KHQpKSB7XG4gICAgICBjb25zdCB3aW5kb3cgPSBoZWFkID0gbmV3IFdpbmRvd1RyYW5zZm9ybU5vZGUoaGVhZCwgdCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyh3aW5kb3cucHJvZHVjZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgYW5jZXN0b3JQYXJzZS5zZXQoZmllbGQsICdkZXJpdmVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNTdGFjayh0KSkge1xuICAgICAgY29uc3Qgc3RhY2sgPSBoZWFkID0gU3RhY2tOb2RlLm1ha2VGcm9tVHJhbnNmb3JtKGhlYWQsIHQpO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXMoc3RhY2sucHJvZHVjZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgYW5jZXN0b3JQYXJzZS5zZXQoZmllbGQsICdkZXJpdmVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5pbnZhbGlkVHJhbnNmb3JtSWdub3JlZCh0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaGVhZDtcbn1cblxuLypcbkRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhZmxvdyAoaHR0cDovL2FzY2lpZmxvdy5jb20vKTpcbiAgICAgKy0tLS0tLS0tK1xuICAgICB8IFNvdXJjZSB8XG4gICAgICstLS0rLS0tLStcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgICAgRm9ybWF0UGFyc2VcbiAgICAgKGV4cGxpY2l0KVxuICAgICAgICAgfFxuICAgICAgICAgdlxuICAgICBUcmFuc2Zvcm1zXG4oRmlsdGVyLCBDYWxjdWxhdGUsIEJpbm5pbmcsIFRpbWVVbml0LCBBZ2dyZWdhdGUsIFdpbmRvdywgLi4uKVxuICAgICAgICAgfFxuICAgICAgICAgdlxuICAgICBGb3JtYXRQYXJzZVxuICAgICAoaW1wbGljaXQpXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gQmlubmluZyAoaW4gYGVuY29kaW5nYClcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiBUaW1ldW5pdCAoaW4gYGVuY29kaW5nYClcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbkZvcm11bGEgRnJvbSBTb3J0IEFycmF5XG4gICAgICAgICB8XG4gICAgICAgICB2XG4gICAgICArLS0rLS0rXG4gICAgICB8IFJhdyB8XG4gICAgICArLS0tLS0rXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gIEFnZ3JlZ2F0ZSAoaW4gYGVuY29kaW5nYClcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgU3RhY2sgKGluIGBlbmNvZGluZ2ApXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gIEludmFsaWQgRmlsdGVyXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gICArLS0tLS0tLS0tLStcbiAgIHwgICBNYWluICAgfFxuICAgKy0tLS0tLS0tLS0rXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gICAgICstLS0tLS0tK1xuICAgICB8IEZhY2V0IHwtLS0tPiBcImNvbHVtblwiLCBcImNvbHVtbi1sYXlvdXRcIiwgYW5kIFwicm93XCJcbiAgICAgKy0tLS0tLS0rXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gIC4uLkNoaWxkIGRhdGEuLi5cbiovXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGEobW9kZWw6IE1vZGVsKTogRGF0YUNvbXBvbmVudCB7XG4gIGxldCBoZWFkID0gcGFyc2VSb290KG1vZGVsLCBtb2RlbC5jb21wb25lbnQuZGF0YS5zb3VyY2VzKTtcblxuICBjb25zdCB7b3V0cHV0Tm9kZXMsIG91dHB1dE5vZGVSZWZDb3VudHN9ID0gbW9kZWwuY29tcG9uZW50LmRhdGE7XG4gIGNvbnN0IGFuY2VzdG9yUGFyc2UgPSBtb2RlbC5wYXJlbnQgPyBtb2RlbC5wYXJlbnQuY29tcG9uZW50LmRhdGEuYW5jZXN0b3JQYXJzZS5jbG9uZSgpIDogbmV3IEFuY2VzdG9yUGFyc2UoKTtcblxuICAvLyBmb3JtYXQucGFyc2U6IG51bGwgbWVhbnMgZGlzYWJsZSBwYXJzaW5nXG4gIGlmIChtb2RlbC5kYXRhICYmIG1vZGVsLmRhdGEuZm9ybWF0ICYmIG1vZGVsLmRhdGEuZm9ybWF0LnBhcnNlID09PSBudWxsKSB7XG4gICAgYW5jZXN0b3JQYXJzZS5wYXJzZU5vdGhpbmcgPSB0cnVlO1xuICB9XG5cbiAgaGVhZCA9IFBhcnNlTm9kZS5tYWtlRXhwbGljaXQoaGVhZCwgbW9kZWwsIGFuY2VzdG9yUGFyc2UpIHx8IGhlYWQ7XG5cbiAgLy8gRGVmYXVsdCBkaXNjcmV0ZSBzZWxlY3Rpb25zIHJlcXVpcmUgYW4gaWRlbnRpZmllciB0cmFuc2Zvcm0gdG9cbiAgLy8gdW5pcXVlbHkgaWRlbnRpZnkgZGF0YSBwb2ludHMgYXMgdGhlIF9pZCBmaWVsZCBpcyB2b2xhdGlsZS4gQWRkXG4gIC8vIHRoaXMgdHJhbnNmb3JtIGF0IHRoZSBoZWFkIG9mIG91ciBwaXBlbGluZSBzdWNoIHRoYXQgdGhlIGlkZW50aWZpZXJcbiAgLy8gZmllbGQgaXMgYXZhaWxhYmxlIGZvciBhbGwgc3Vic2VxdWVudCBkYXRhc2V0cy4gQWRkaXRpb25hbCBpZGVudGlmaWVyXG4gIC8vIHRyYW5zZm9ybXMgd2lsbCBiZSBuZWNlc3Nhcnkgd2hlbiBuZXcgdHVwbGVzIGFyZSBjb25zdHJ1Y3RlZFxuICAvLyAoZS5nLiwgcG9zdC1hZ2dyZWdhdGlvbikuXG4gIGlmIChyZXF1aXJlc1NlbGVjdGlvbklkKG1vZGVsKSAmJiAoaXNVbml0TW9kZWwobW9kZWwpIHx8IGlzTGF5ZXJNb2RlbChtb2RlbCkpKSB7XG4gICAgaGVhZCA9IG5ldyBJZGVudGlmaWVyTm9kZShoZWFkKTtcbiAgfVxuXG4gIC8vIEhBQ0s6IFRoaXMgaXMgZXF1aXZhbGVudCBmb3IgbWVyZ2luZyBiaW4gZXh0ZW50IGZvciB1bmlvbiBzY2FsZS5cbiAgLy8gRklYTUUoaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yMjcwKTogQ29ycmVjdGx5IG1lcmdlIGV4dGVudCAvIGJpbiBub2RlIGZvciBzaGFyZWQgYmluIHNjYWxlXG4gIGNvbnN0IHBhcmVudElzTGF5ZXIgPSBtb2RlbC5wYXJlbnQgJiYgaXNMYXllck1vZGVsKG1vZGVsLnBhcmVudCk7XG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkgfHwgaXNGYWNldE1vZGVsKG1vZGVsKSkge1xuICAgIGlmIChwYXJlbnRJc0xheWVyKSB7XG4gICAgICBoZWFkID0gQmluTm9kZS5tYWtlRnJvbUVuY29kaW5nKGhlYWQsIG1vZGVsKSB8fCBoZWFkO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtb2RlbC50cmFuc2Zvcm1zLmxlbmd0aCA+IDApIHtcbiAgICBoZWFkID0gcGFyc2VUcmFuc2Zvcm1BcnJheShoZWFkLCBtb2RlbCwgYW5jZXN0b3JQYXJzZSk7XG4gIH1cblxuICBoZWFkID0gUGFyc2VOb2RlLm1ha2VJbXBsaWNpdEZyb21FbmNvZGluZyhoZWFkLCBtb2RlbCwgYW5jZXN0b3JQYXJzZSkgfHwgaGVhZDtcblxuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgaGVhZCA9IEdlb0pTT05Ob2RlLnBhcnNlQWxsKGhlYWQsIG1vZGVsKTtcbiAgICBoZWFkID0gR2VvUG9pbnROb2RlLnBhcnNlQWxsKGhlYWQsIG1vZGVsKTtcbiAgfVxuXG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkgfHwgaXNGYWNldE1vZGVsKG1vZGVsKSkge1xuXG4gICAgaWYgKCFwYXJlbnRJc0xheWVyKSB7XG4gICAgICBoZWFkID0gQmluTm9kZS5tYWtlRnJvbUVuY29kaW5nKGhlYWQsIG1vZGVsKSB8fCBoZWFkO1xuICAgIH1cblxuICAgIGhlYWQgPSBUaW1lVW5pdE5vZGUubWFrZUZyb21FbmNvZGluZyhoZWFkLCBtb2RlbCkgfHwgaGVhZDtcbiAgICBoZWFkID0gQ2FsY3VsYXRlTm9kZS5wYXJzZUFsbEZvclNvcnRJbmRleChoZWFkLCBtb2RlbCk7XG4gIH1cblxuICAvLyBhZGQgYW4gb3V0cHV0IG5vZGUgcHJlIGFnZ3JlZ2F0aW9uXG4gIGNvbnN0IHJhd05hbWUgPSBtb2RlbC5nZXROYW1lKFJBVyk7XG4gIGNvbnN0IHJhdyA9IG5ldyBPdXRwdXROb2RlKGhlYWQsIHJhd05hbWUsIFJBVywgb3V0cHV0Tm9kZVJlZkNvdW50cyk7XG4gIG91dHB1dE5vZGVzW3Jhd05hbWVdID0gcmF3O1xuICBoZWFkID0gcmF3O1xuXG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBjb25zdCBhZ2cgPSBBZ2dyZWdhdGVOb2RlLm1ha2VGcm9tRW5jb2RpbmcoaGVhZCwgbW9kZWwpO1xuICAgIGlmIChhZ2cpIHtcbiAgICAgIGhlYWQgPSBhZ2c7XG5cbiAgICAgIGlmIChyZXF1aXJlc1NlbGVjdGlvbklkKG1vZGVsKSkge1xuICAgICAgICBoZWFkID0gbmV3IElkZW50aWZpZXJOb2RlKGhlYWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGhlYWQgPSBTdGFja05vZGUubWFrZUZyb21FbmNvZGluZyhoZWFkLCBtb2RlbCkgfHwgaGVhZDtcbiAgfVxuXG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBoZWFkID0gRmlsdGVySW52YWxpZE5vZGUubWFrZShoZWFkLCBtb2RlbCkgfHwgaGVhZDtcbiAgfVxuXG4gIC8vIG91dHB1dCBub2RlIGZvciBtYXJrc1xuICBjb25zdCBtYWluTmFtZSA9IG1vZGVsLmdldE5hbWUoTUFJTik7XG4gIGNvbnN0IG1haW4gPSBuZXcgT3V0cHV0Tm9kZShoZWFkLCBtYWluTmFtZSwgTUFJTiwgb3V0cHV0Tm9kZVJlZkNvdW50cyk7XG4gIG91dHB1dE5vZGVzW21haW5OYW1lXSA9IG1haW47XG4gIGhlYWQgPSBtYWluO1xuXG4gIC8vIGFkZCBmYWNldCBtYXJrZXJcbiAgbGV0IGZhY2V0Um9vdCA9IG51bGw7XG4gIGlmIChpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgY29uc3QgZmFjZXROYW1lID0gbW9kZWwuZ2V0TmFtZSgnZmFjZXQnKTtcbiAgICBmYWNldFJvb3QgPSBuZXcgRmFjZXROb2RlKGhlYWQsIG1vZGVsLCBmYWNldE5hbWUsIG1haW4uZ2V0U291cmNlKCkpO1xuICAgIG91dHB1dE5vZGVzW2ZhY2V0TmFtZV0gPSBmYWNldFJvb3Q7XG4gICAgaGVhZCA9IGZhY2V0Um9vdDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubW9kZWwuY29tcG9uZW50LmRhdGEsXG4gICAgb3V0cHV0Tm9kZXMsXG4gICAgb3V0cHV0Tm9kZVJlZkNvdW50cyxcbiAgICByYXcsXG4gICAgbWFpbixcbiAgICBmYWNldFJvb3QsXG4gICAgYW5jZXN0b3JQYXJzZVxuICB9O1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/source.d.ts b/build/src/compile/data/source.d.ts new file mode 100644 index 0000000000..cf5123d046 --- /dev/null +++ b/build/src/compile/data/source.d.ts @@ -0,0 +1,19 @@ +import { Data } from '../../data'; +import { VgData } from '../../vega.schema'; +import { DataFlowNode } from './dataflow'; +export declare class SourceNode extends DataFlowNode { + private _data; + private _name; + private _hash; + constructor(data: Data); + readonly data: Partial; + hasName(): boolean; + dataName: string; + parent: DataFlowNode; + remove(): void; + /** + * Return a unique identifier for this data source. + */ + hash(): string | number; + assemble(): VgData; +} diff --git a/build/src/compile/data/source.js b/build/src/compile/data/source.js new file mode 100644 index 0000000000..ec68055d18 --- /dev/null +++ b/build/src/compile/data/source.js @@ -0,0 +1,98 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var data_1 = require("../../data"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var SourceNode = /** @class */ (function (_super) { + tslib_1.__extends(SourceNode, _super); + function SourceNode(data) { + var _this = _super.call(this, null) || this; + data = data || { name: 'source' }; + if (data_1.isInlineData(data)) { + _this._data = { values: data.values }; + } + else if (data_1.isUrlData(data)) { + _this._data = { url: data.url }; + if (!data.format) { + data.format = {}; + } + if (!data.format || !data.format.type) { + // Extract extension from URL using snippet from + // http://stackoverflow.com/questions/680929/how-to-extract-extension-from-filename-string-in-javascript + var defaultExtension = /(?:\.([^.]+))?$/.exec(data.url)[1]; + if (!util_1.contains(['json', 'csv', 'tsv', 'dsv', 'topojson'], defaultExtension)) { + defaultExtension = 'json'; + } + // defaultExtension has type string but we ensure that it is DataFormatType above + data.format.type = defaultExtension; + } + } + else if (data_1.isNamedData(data)) { + _this._data = {}; + } + // any dataset can be named + if (data.name) { + _this._name = data.name; + } + if (data.format) { + var _a = data.format, _b = _a.parse, parse = _b === void 0 ? null : _b, format = tslib_1.__rest(_a, ["parse"]); + _this._data.format = format; + } + return _this; + } + Object.defineProperty(SourceNode.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + SourceNode.prototype.hasName = function () { + return !!this._name; + }; + Object.defineProperty(SourceNode.prototype, "dataName", { + get: function () { + return this._name; + }, + set: function (name) { + this._name = name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SourceNode.prototype, "parent", { + set: function (parent) { + throw new Error('Source nodes have to be roots.'); + }, + enumerable: true, + configurable: true + }); + SourceNode.prototype.remove = function () { + throw new Error('Source nodes are roots and cannot be removed.'); + }; + /** + * Return a unique identifier for this data source. + */ + SourceNode.prototype.hash = function () { + if (data_1.isInlineData(this._data)) { + if (!this._hash) { + // Hashing can be expensive for large inline datasets. + this._hash = util_1.hash(this._data); + } + return this._hash; + } + else if (data_1.isUrlData(this._data)) { + return util_1.hash([this._data.url, this._data.format]); + } + else { + return this._name; + } + }; + SourceNode.prototype.assemble = function () { + return tslib_1.__assign({ name: this._name }, this._data, { transform: [] }); + }; + return SourceNode; +}(dataflow_1.DataFlowNode)); +exports.SourceNode = SourceNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXNGO0FBQ3RGLG1DQUEwQztBQUUxQyx1Q0FBd0M7QUFFeEM7SUFBZ0Msc0NBQVk7SUFPMUMsb0JBQVksSUFBVTtRQUF0QixZQUNFLGtCQUFNLElBQUksQ0FBQyxTQXFDWjtRQW5DQyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDO1FBRWhDLElBQUksbUJBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0QixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQztTQUNwQzthQUFNLElBQUksZ0JBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUMsQ0FBQztZQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7YUFDbEI7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxnREFBZ0Q7Z0JBQ2hELHdHQUF3RztnQkFDeEcsSUFBSSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsZUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7b0JBQzFFLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztpQkFDM0I7Z0JBRUQsaUZBQWlGO2dCQUNqRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxnQkFBa0MsQ0FBQzthQUN2RDtTQUNGO2FBQU0sSUFBSSxrQkFBVyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLEtBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1NBQ2pCO1FBRUQsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLEtBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztTQUN4QjtRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLElBQU0sZ0JBQXVDLEVBQXRDLGFBQVksRUFBWixpQ0FBWSxFQUFFLHNDQUF3QixDQUFDO1lBQzlDLEtBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztTQUM1Qjs7SUFDSCxDQUFDO0lBRUQsc0JBQUksNEJBQUk7YUFBUjtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDOzs7T0FBQTtJQUVNLDRCQUFPLEdBQWQ7UUFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxzQkFBSSxnQ0FBUTthQUFaO1lBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7YUFFRCxVQUFhLElBQVk7WUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsQ0FBQzs7O09BSkE7SUFNRCxzQkFBSSw4QkFBTTthQUFWLFVBQVcsTUFBb0I7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBRU0sMkJBQU0sR0FBYjtRQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSx5QkFBSSxHQUFYO1FBQ0UsSUFBSSxtQkFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZixzREFBc0Q7Z0JBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQjtZQUNELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNuQjthQUFNLElBQUksZ0JBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxXQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTSw2QkFBUSxHQUFmO1FBQ0UsMEJBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQ2IsSUFBSSxDQUFDLEtBQUssSUFDYixTQUFTLEVBQUUsRUFBRSxJQUNiO0lBQ0osQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQS9GRCxDQUFnQyx1QkFBWSxHQStGM0M7QUEvRlksZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RhdGEsIERhdGFGb3JtYXRUeXBlLCBpc0lubGluZURhdGEsIGlzTmFtZWREYXRhLCBpc1VybERhdGF9IGZyb20gJy4uLy4uL2RhdGEnO1xuaW1wb3J0IHtjb250YWlucywgaGFzaH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRGF0YX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5leHBvcnQgY2xhc3MgU291cmNlTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHByaXZhdGUgX2RhdGE6IFBhcnRpYWw8VmdEYXRhPjtcblxuICBwcml2YXRlIF9uYW1lOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfaGFzaDogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IERhdGEpIHtcbiAgICBzdXBlcihudWxsKTsgIC8vIHNvdXJjZSBjYW5ub3QgaGF2ZSBwYXJlbnRcblxuICAgIGRhdGEgPSBkYXRhIHx8IHtuYW1lOiAnc291cmNlJ307XG5cbiAgICBpZiAoaXNJbmxpbmVEYXRhKGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge3ZhbHVlczogZGF0YS52YWx1ZXN9O1xuICAgIH0gZWxzZSBpZiAoaXNVcmxEYXRhKGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge3VybDogZGF0YS51cmx9O1xuXG4gICAgICBpZiAoIWRhdGEuZm9ybWF0KSB7XG4gICAgICAgIGRhdGEuZm9ybWF0ID0ge307XG4gICAgICB9XG5cbiAgICAgIGlmICghZGF0YS5mb3JtYXQgfHwgIWRhdGEuZm9ybWF0LnR5cGUpIHtcbiAgICAgICAgLy8gRXh0cmFjdCBleHRlbnNpb24gZnJvbSBVUkwgdXNpbmcgc25pcHBldCBmcm9tXG4gICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjgwOTI5L2hvdy10by1leHRyYWN0LWV4dGVuc2lvbi1mcm9tLWZpbGVuYW1lLXN0cmluZy1pbi1qYXZhc2NyaXB0XG4gICAgICAgIGxldCBkZWZhdWx0RXh0ZW5zaW9uID0gLyg/OlxcLihbXi5dKykpPyQvLmV4ZWMoZGF0YS51cmwpWzFdO1xuICAgICAgICBpZiAoIWNvbnRhaW5zKFsnanNvbicsICdjc3YnLCAndHN2JywgJ2RzdicsICd0b3BvanNvbiddLCBkZWZhdWx0RXh0ZW5zaW9uKSkge1xuICAgICAgICAgIGRlZmF1bHRFeHRlbnNpb24gPSAnanNvbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWZhdWx0RXh0ZW5zaW9uIGhhcyB0eXBlIHN0cmluZyBidXQgd2UgZW5zdXJlIHRoYXQgaXQgaXMgRGF0YUZvcm1hdFR5cGUgYWJvdmVcbiAgICAgICAgZGF0YS5mb3JtYXQudHlwZSA9IGRlZmF1bHRFeHRlbnNpb24gYXMgRGF0YUZvcm1hdFR5cGU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc05hbWVkRGF0YShkYXRhKSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cblxuICAgIC8vIGFueSBkYXRhc2V0IGNhbiBiZSBuYW1lZFxuICAgIGlmIChkYXRhLm5hbWUpIHtcbiAgICAgIHRoaXMuX25hbWUgPSBkYXRhLm5hbWU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEuZm9ybWF0KSB7XG4gICAgICBjb25zdCB7cGFyc2UgPSBudWxsLCAuLi5mb3JtYXR9ID0gZGF0YS5mb3JtYXQ7XG4gICAgICB0aGlzLl9kYXRhLmZvcm1hdCA9IGZvcm1hdDtcbiAgICB9XG4gIH1cblxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNOYW1lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX25hbWU7XG4gIH1cblxuICBnZXQgZGF0YU5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBzZXQgZGF0YU5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IG5hbWU7XG4gIH1cblxuICBzZXQgcGFyZW50KHBhcmVudDogRGF0YUZsb3dOb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2Ugbm9kZXMgaGF2ZSB0byBiZSByb290cy4nKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2Ugbm9kZXMgYXJlIHJvb3RzIGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBkYXRhIHNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyBoYXNoKCkge1xuICAgIGlmIChpc0lubGluZURhdGEodGhpcy5fZGF0YSkpIHtcbiAgICAgIGlmICghdGhpcy5faGFzaCkge1xuICAgICAgICAvLyBIYXNoaW5nIGNhbiBiZSBleHBlbnNpdmUgZm9yIGxhcmdlIGlubGluZSBkYXRhc2V0cy5cbiAgICAgICAgdGhpcy5faGFzaCA9IGhhc2godGhpcy5fZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faGFzaDtcbiAgICB9IGVsc2UgaWYgKGlzVXJsRGF0YSh0aGlzLl9kYXRhKSkge1xuICAgICAgcmV0dXJuIGhhc2goW3RoaXMuX2RhdGEudXJsLCB0aGlzLl9kYXRhLmZvcm1hdF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogdGhpcy5fbmFtZSxcbiAgICAgIC4uLnRoaXMuX2RhdGEsXG4gICAgICB0cmFuc2Zvcm06IFtdXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/stack.d.ts b/build/src/compile/data/stack.d.ts new file mode 100644 index 0000000000..b1b2b277aa --- /dev/null +++ b/build/src/compile/data/stack.d.ts @@ -0,0 +1,55 @@ +import { FieldDef } from '../../fielddef'; +import { StackOffset } from '../../stack'; +import { StackTransform } from '../../transform'; +import { VgSort, VgTransform } from '../../vega.schema'; +import { UnitModel } from './../unit'; +import { DataFlowNode } from './dataflow'; +export interface StackComponent { + /** + * Faceted field. + */ + facetby: string[]; + dimensionFieldDef?: FieldDef; + /** + * Stack measure's field. Used in makeFromEncoding. + */ + stackField: string; + /** + * Level of detail fields for each level in the stacked charts such as color or detail. + * Used in makeFromEncoding. + */ + stackby?: string[]; + /** + * Field that determines order of levels in the stacked charts. + * Used in both but optional in transform. + */ + sort: VgSort; + /** Mode for stacking marks. + */ + offset: StackOffset; + /** + * Whether to impute the data before stacking. Used only in makeFromEncoding. + */ + impute?: boolean; + /** + * The data fields to group by. + */ + groupby?: string[]; + /** + * Output field names of each stack field. + */ + as: string[]; +} +export declare class StackNode extends DataFlowNode { + private _stack; + clone(): StackNode; + constructor(parent: DataFlowNode, stack: StackComponent); + static makeFromTransform(parent: DataFlowNode, stackTransform: StackTransform): StackNode; + static makeFromEncoding(parent: DataFlowNode, model: UnitModel): StackNode; + readonly stack: StackComponent; + addDimensions(fields: string[]): void; + dependentFields(): {}; + producedFields(): {}; + private getGroupbyFields; + assemble(): VgTransform[]; +} diff --git a/build/src/compile/data/stack.js b/build/src/compile/data/stack.js new file mode 100644 index 0000000000..4242989c38 --- /dev/null +++ b/build/src/compile/data/stack.js @@ -0,0 +1,190 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var dataflow_1 = require("./dataflow"); +function getStackByFields(model) { + return model.stack.stackBy.reduce(function (fields, by) { + var fieldDef = by.fieldDef; + var _field = fielddef_1.vgField(fieldDef); + if (_field) { + fields.push(_field); + } + return fields; + }, []); +} +function isValidAsArray(as) { + return vega_util_1.isArray(as) && as.every(function (s) { return vega_util_1.isString(s); }) && as.length > 1; +} +var StackNode = /** @class */ (function (_super) { + tslib_1.__extends(StackNode, _super); + function StackNode(parent, stack) { + var _this = _super.call(this, parent) || this; + _this._stack = stack; + return _this; + } + StackNode.prototype.clone = function () { + return new StackNode(null, util_1.duplicate(this._stack)); + }; + StackNode.makeFromTransform = function (parent, stackTransform) { + var stack = stackTransform.stack, groupby = stackTransform.groupby, as = stackTransform.as, _a = stackTransform.offset, offset = _a === void 0 ? 'zero' : _a; + var sortFields = []; + var sortOrder = []; + if (stackTransform.sort !== undefined) { + for (var _i = 0, _b = stackTransform.sort; _i < _b.length; _i++) { + var sortField = _b[_i]; + sortFields.push(sortField.field); + sortOrder.push(sortField.order === undefined ? 'ascending' : sortField.order); + } + } + var sort = { + field: sortFields, + order: sortOrder, + }; + var normalizedAs; + if (isValidAsArray(as)) { + normalizedAs = as; + } + else if (vega_util_1.isString(as)) { + normalizedAs = [as, as + '_end']; + } + else { + normalizedAs = [stackTransform.stack + '_start', stackTransform.stack + '_end']; + } + return new StackNode(parent, { + stackField: stack, + groupby: groupby, + offset: offset, + sort: sort, + facetby: [], + as: normalizedAs + }); + }; + StackNode.makeFromEncoding = function (parent, model) { + var stackProperties = model.stack; + if (!stackProperties) { + return null; + } + var dimensionFieldDef; + if (stackProperties.groupbyChannel) { + dimensionFieldDef = model.fieldDef(stackProperties.groupbyChannel); + } + var stackby = getStackByFields(model); + var orderDef = model.encoding.order; + var sort; + if (vega_util_1.isArray(orderDef) || fielddef_1.isFieldDef(orderDef)) { + sort = common_1.sortParams(orderDef); + } + else { + // default = descending by stackFields + // FIXME is the default here correct for binned fields? + sort = stackby.reduce(function (s, field) { + s.field.push(field); + s.order.push('descending'); + return s; + }, { field: [], order: [] }); + } + // Refactored to add "as" in the make phase so that we can get producedFields + // from the as property + var field = model.vgField(stackProperties.fieldChannel); + return new StackNode(parent, { + dimensionFieldDef: dimensionFieldDef, + stackField: field, + facetby: [], + stackby: stackby, + sort: sort, + offset: stackProperties.offset, + impute: stackProperties.impute, + as: [field + '_start', field + '_end'] + }); + }; + Object.defineProperty(StackNode.prototype, "stack", { + get: function () { + return this._stack; + }, + enumerable: true, + configurable: true + }); + StackNode.prototype.addDimensions = function (fields) { + this._stack.facetby = this._stack.facetby.concat(fields); + }; + StackNode.prototype.dependentFields = function () { + var out = {}; + out[this._stack.stackField] = true; + this.getGroupbyFields().forEach(function (f) { return out[f] = true; }); + this._stack.facetby.forEach(function (f) { return out[f] = true; }); + var field = this._stack.sort.field; + vega_util_1.isArray(field) ? field.forEach(function (f) { return out[f] = true; }) : out[field] = true; + return out; + }; + StackNode.prototype.producedFields = function () { + return this._stack.as.reduce(function (result, item) { + result[item] = true; + return result; + }, {}); + }; + StackNode.prototype.getGroupbyFields = function () { + var _a = this._stack, dimensionFieldDef = _a.dimensionFieldDef, impute = _a.impute, groupby = _a.groupby; + if (dimensionFieldDef) { + if (dimensionFieldDef.bin) { + if (impute) { + // For binned group by field with impute, we calculate bin_mid + // as we cannot impute two fields simultaneously + return [fielddef_1.vgField(dimensionFieldDef, { binSuffix: 'mid' })]; + } + return [ + // For binned group by field without impute, we need both bin (start) and bin_end + fielddef_1.vgField(dimensionFieldDef, {}), + fielddef_1.vgField(dimensionFieldDef, { binSuffix: 'end' }) + ]; + } + return [fielddef_1.vgField(dimensionFieldDef)]; + } + return groupby || []; + }; + StackNode.prototype.assemble = function () { + var transform = []; + var _a = this._stack, facetby = _a.facetby, dimensionFieldDef = _a.dimensionFieldDef, field = _a.stackField, stackby = _a.stackby, sort = _a.sort, offset = _a.offset, impute = _a.impute, as = _a.as; + // Impute + if (impute && dimensionFieldDef) { + var dimensionField = dimensionFieldDef ? fielddef_1.vgField(dimensionFieldDef, { binSuffix: 'mid' }) : undefined; + if (dimensionFieldDef.bin) { + // As we can only impute one field at a time, we need to calculate + // mid point for a binned field + transform.push({ + type: 'formula', + expr: '(' + + fielddef_1.vgField(dimensionFieldDef, { expr: 'datum' }) + + '+' + + fielddef_1.vgField(dimensionFieldDef, { expr: 'datum', binSuffix: 'end' }) + + ')/2', + as: dimensionField + }); + } + transform.push({ + type: 'impute', + field: field, + groupby: stackby, + key: dimensionField, + method: 'value', + value: 0 + }); + } + // Stack + transform.push({ + type: 'stack', + groupby: this.getGroupbyFields().concat(facetby), + field: field, + sort: sort, + as: as, + offset: offset + }); + return transform; + }; + return StackNode; +}(dataflow_1.DataFlowNode)); +exports.StackNode = StackNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUE0QztBQUM1QywyQ0FBNkQ7QUFHN0QsbUNBQXFDO0FBRXJDLG9DQUFxQztBQUVyQyx1Q0FBd0M7QUFFeEMsMEJBQTBCLEtBQWdCO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUMsTUFBTSxFQUFFLEVBQUU7UUFDM0MsSUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUU3QixJQUFNLE1BQU0sR0FBRyxrQkFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsRUFBRSxFQUFjLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBZ0RELHdCQUF3QixFQUFxQjtJQUMzQyxPQUFPLG1CQUFPLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLG9CQUFRLENBQUMsQ0FBQyxDQUFDLEVBQVgsQ0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVEO0lBQStCLHFDQUFZO0lBT3pDLG1CQUFZLE1BQW9CLEVBQUUsS0FBcUI7UUFBdkQsWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FHZDtRQURDLEtBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztJQUN0QixDQUFDO0lBUk0seUJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLGdCQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FB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LElBQUksQ0FBQztZQUNiLElBQUksRUFBRSxPQUFPO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsS0FBSyxPQUFBO1lBQ0wsSUFBSSxNQUFBO1lBQ0osRUFBRSxJQUFBO1lBQ0YsTUFBTSxRQUFBO1NBQ1AsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXhMRCxDQUErQix1QkFBWSxHQXdMMUM7QUF4TFksOEJBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXksIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtGaWVsZERlZiwgaXNGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtTdGFja09mZnNldH0gZnJvbSAnLi4vLi4vc3RhY2snO1xuaW1wb3J0IHtTdGFja1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7ZHVwbGljYXRlfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdDb21wYXJhdG9yT3JkZXIsIFZnU29ydCwgVmdUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7c29ydFBhcmFtc30gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLy4uL3VuaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5mdW5jdGlvbiBnZXRTdGFja0J5RmllbGRzKG1vZGVsOiBVbml0TW9kZWwpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBtb2RlbC5zdGFjay5zdGFja0J5LnJlZHVjZSgoZmllbGRzLCBieSkgPT4ge1xuICAgIGNvbnN0IGZpZWxkRGVmID0gYnkuZmllbGREZWY7XG5cbiAgICBjb25zdCBfZmllbGQgPSB2Z0ZpZWxkKGZpZWxkRGVmKTtcbiAgICBpZiAoX2ZpZWxkKSB7XG4gICAgICBmaWVsZHMucHVzaChfZmllbGQpO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xuICB9LCBbXSBhcyBzdHJpbmdbXSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBGYWNldGVkIGZpZWxkLlxuICAgKi9cbiAgZmFjZXRieTogc3RyaW5nW107XG5cbiAgZGltZW5zaW9uRmllbGREZWY/OiBGaWVsZERlZjxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBTdGFjayBtZWFzdXJlJ3MgZmllbGQuIFVzZWQgaW4gbWFrZUZyb21FbmNvZGluZy5cbiAgICovXG4gIHN0YWNrRmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogTGV2ZWwgb2YgZGV0YWlsIGZpZWxkcyBmb3IgZWFjaCBsZXZlbCBpbiB0aGUgc3RhY2tlZCBjaGFydHMgc3VjaCBhcyBjb2xvciBvciBkZXRhaWwuXG4gICAqIFVzZWQgaW4gbWFrZUZyb21FbmNvZGluZy5cbiAgICovXG4gIHN0YWNrYnk/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRmllbGQgdGhhdCBkZXRlcm1pbmVzIG9yZGVyIG9mIGxldmVscyBpbiB0aGUgc3RhY2tlZCBjaGFydHMuXG4gICAqIFVzZWQgaW4gYm90aCBidXQgb3B0aW9uYWwgaW4gdHJhbnNmb3JtLlxuICAgKi9cbiAgc29ydDogVmdTb3J0O1xuXG4gIC8qKiBNb2RlIGZvciBzdGFja2luZyBtYXJrcy5cbiAgICovXG4gIG9mZnNldDogU3RhY2tPZmZzZXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW1wdXRlIHRoZSBkYXRhIGJlZm9yZSBzdGFja2luZy4gVXNlZCBvbmx5IGluIG1ha2VGcm9tRW5jb2RpbmcuXG4gICAqL1xuICBpbXB1dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmaWVsZHMgdG8gZ3JvdXAgYnkuXG4gICAqL1xuICBncm91cGJ5Pzogc3RyaW5nW107XG4gIC8qKlxuICAgKiBPdXRwdXQgZmllbGQgbmFtZXMgb2YgZWFjaCBzdGFjayBmaWVsZC5cbiAgICovXG4gIGFzOiBzdHJpbmdbXTtcblxufVxuXG5mdW5jdGlvbiBpc1ZhbGlkQXNBcnJheShhczogc3RyaW5nW10gfCBzdHJpbmcpOiBhcyBpcyBzdHJpbmdbXSB7XG4gIHJldHVybiBpc0FycmF5KGFzKSAmJiBhcy5ldmVyeShzID0+IGlzU3RyaW5nKHMpKSAmJiBhcy5sZW5ndGggPjE7XG59XG5cbmV4cG9ydCBjbGFzcyBTdGFja05vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwcml2YXRlIF9zdGFjazogU3RhY2tDb21wb25lbnQ7XG5cbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgU3RhY2tOb2RlKG51bGwsIGR1cGxpY2F0ZSh0aGlzLl9zdGFjaykpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHN0YWNrOiBTdGFja0NvbXBvbmVudCkge1xuICAgIHN1cGVyKHBhcmVudCk7XG5cbiAgICB0aGlzLl9zdGFjayA9IHN0YWNrO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbVRyYW5zZm9ybShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgc3RhY2tUcmFuc2Zvcm06IFN0YWNrVHJhbnNmb3JtKSB7XG5cbiAgICBjb25zdCB7c3RhY2ssIGdyb3VwYnksIGFzLCBvZmZzZXQ9J3plcm8nfSA9IHN0YWNrVHJhbnNmb3JtO1xuXG4gICAgY29uc3Qgc29ydEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzb3J0T3JkZXI6IFZnQ29tcGFyYXRvck9yZGVyW10gPSBbXTtcbiAgICBpZiAoc3RhY2tUcmFuc2Zvcm0uc29ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHNvcnRGaWVsZCBvZiBzdGFja1RyYW5zZm9ybS5zb3J0KSB7XG4gICAgICAgIHNvcnRGaWVsZHMucHVzaChzb3J0RmllbGQuZmllbGQpO1xuICAgICAgICBzb3J0T3JkZXIucHVzaChzb3J0RmllbGQub3JkZXIgPT09IHVuZGVmaW5lZCA/ICdhc2NlbmRpbmcnIDogc29ydEZpZWxkLm9yZGVyIGFzIFZnQ29tcGFyYXRvck9yZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc29ydDogVmdTb3J0ID0ge1xuICAgICAgZmllbGQ6IHNvcnRGaWVsZHMsXG4gICAgICBvcmRlcjogc29ydE9yZGVyLFxuICAgIH07XG4gICAgbGV0IG5vcm1hbGl6ZWRBczogQXJyYXk8c3RyaW5nPjtcbiAgICBpZiAoaXNWYWxpZEFzQXJyYXkoYXMpKSB7XG4gICAgICBub3JtYWxpemVkQXMgPSBhcztcbiAgICB9IGVsc2UgaWYoaXNTdHJpbmcoYXMpKSB7XG4gICAgICBub3JtYWxpemVkQXMgPSBbYXMsIGFzICsgJ19lbmQnXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbm9ybWFsaXplZEFzID0gW3N0YWNrVHJhbnNmb3JtLnN0YWNrICsgJ19zdGFydCcsIHN0YWNrVHJhbnNmb3JtLnN0YWNrICsgJ19lbmQnXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN0YWNrTm9kZSAocGFyZW50LCB7XG4gICAgICBzdGFja0ZpZWxkOiBzdGFjayxcbiAgICAgIGdyb3VwYnksXG4gICAgICBvZmZzZXQsXG4gICAgICBzb3J0LFxuICAgICAgZmFjZXRieTogW10sXG4gICAgICBhczogbm9ybWFsaXplZEFzXG4gICAgfSk7XG5cbiAgfVxuICBwdWJsaWMgc3RhdGljIG1ha2VGcm9tRW5jb2RpbmcocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBVbml0TW9kZWwpIHtcblxuICAgIGNvbnN0IHN0YWNrUHJvcGVydGllcyA9IG1vZGVsLnN0YWNrO1xuXG4gICAgaWYgKCFzdGFja1Byb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGxldCBkaW1lbnNpb25GaWVsZERlZjogRmllbGREZWY8c3RyaW5nPjtcbiAgICBpZiAoc3RhY2tQcm9wZXJ0aWVzLmdyb3VwYnlDaGFubmVsKSB7XG4gICAgICBkaW1lbnNpb25GaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKHN0YWNrUHJvcGVydGllcy5ncm91cGJ5Q2hhbm5lbCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tieSA9IGdldFN0YWNrQnlGaWVsZHMobW9kZWwpO1xuICAgIGNvbnN0IG9yZGVyRGVmID0gbW9kZWwuZW5jb2Rpbmcub3JkZXI7XG5cbiAgICBsZXQgc29ydDogVmdTb3J0O1xuICAgIGlmIChpc0FycmF5KG9yZGVyRGVmKSB8fCBpc0ZpZWxkRGVmKG9yZGVyRGVmKSkge1xuICAgICAgc29ydCA9IHNvcnRQYXJhbXMob3JkZXJEZWYpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkZWZhdWx0ID0gZGVzY2VuZGluZyBieSBzdGFja0ZpZWxkc1xuICAgICAgLy8gRklYTUUgaXMgdGhlIGRlZmF1bHQgaGVyZSBjb3JyZWN0IGZvciBiaW5uZWQgZmllbGRzP1xuICAgICAgc29ydCA9IHN0YWNrYnkucmVkdWNlKChzLCBmaWVsZCkgPT4ge1xuICAgICAgICBzLmZpZWxkLnB1c2goZmllbGQpO1xuICAgICAgICBzLm9yZGVyLnB1c2goJ2Rlc2NlbmRpbmcnKTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9LCB7ZmllbGQ6W10sIG9yZGVyOiBbXX0pO1xuICAgIH1cbiAgICAvLyBSZWZhY3RvcmVkIHRvIGFkZCBcImFzXCIgaW4gdGhlIG1ha2UgcGhhc2Ugc28gdGhhdCB3ZSBjYW4gZ2V0IHByb2R1Y2VkRmllbGRzXG4gICAgLy8gZnJvbSB0aGUgYXMgcHJvcGVydHlcbiAgICBjb25zdCBmaWVsZCA9IG1vZGVsLnZnRmllbGQoc3RhY2tQcm9wZXJ0aWVzLmZpZWxkQ2hhbm5lbCk7XG5cbiAgICByZXR1cm4gbmV3IFN0YWNrTm9kZShwYXJlbnQsIHtcbiAgICAgIGRpbWVuc2lvbkZpZWxkRGVmLFxuICAgICAgc3RhY2tGaWVsZDpmaWVsZCxcbiAgICAgIGZhY2V0Ynk6IFtdLFxuICAgICAgc3RhY2tieSxcbiAgICAgIHNvcnQsXG4gICAgICBvZmZzZXQ6IHN0YWNrUHJvcGVydGllcy5vZmZzZXQsXG4gICAgICBpbXB1dGU6IHN0YWNrUHJvcGVydGllcy5pbXB1dGUsXG4gICAgICBhczogW2ZpZWxkICsgJ19zdGFydCcsIGZpZWxkICsgJ19lbmQnXVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0IHN0YWNrKCk6IFN0YWNrQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2s7XG4gIH1cblxuICBwdWJsaWMgYWRkRGltZW5zaW9ucyhmaWVsZHM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fc3RhY2suZmFjZXRieSA9IHRoaXMuX3N0YWNrLmZhY2V0YnkuY29uY2F0KGZpZWxkcyk7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kZW50RmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAgb3V0W3RoaXMuX3N0YWNrLnN0YWNrRmllbGRdID0gdHJ1ZTtcblxuICAgIHRoaXMuZ2V0R3JvdXBieUZpZWxkcygpLmZvckVhY2goZiA9PiBvdXRbZl0gPSB0cnVlKTtcbiAgICB0aGlzLl9zdGFjay5mYWNldGJ5LmZvckVhY2goZiA9PiBvdXRbZl0gPSB0cnVlKTtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX3N0YWNrLnNvcnQuZmllbGQ7XG4gICAgaXNBcnJheShmaWVsZCkgPyBmaWVsZC5mb3JFYWNoKGYgPT4gb3V0W2ZdID0gdHJ1ZSkgOiBvdXRbZmllbGRdID0gdHJ1ZTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWNrLmFzLnJlZHVjZSgocmVzdWx0LCBpdGVtKSA9PiB7XG4gICAgICByZXN1bHRbaXRlbV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGdldEdyb3VwYnlGaWVsZHMoKSB7XG4gICAgY29uc3Qge2RpbWVuc2lvbkZpZWxkRGVmLCBpbXB1dGUsIGdyb3VwYnl9ID0gdGhpcy5fc3RhY2s7XG4gICAgaWYgKGRpbWVuc2lvbkZpZWxkRGVmKSB7XG4gICAgICBpZiAoZGltZW5zaW9uRmllbGREZWYuYmluKSB7XG4gICAgICAgIGlmIChpbXB1dGUpIHtcbiAgICAgICAgICAvLyBGb3IgYmlubmVkIGdyb3VwIGJ5IGZpZWxkIHdpdGggaW1wdXRlLCB3ZSBjYWxjdWxhdGUgYmluX21pZFxuICAgICAgICAgIC8vIGFzIHdlIGNhbm5vdCBpbXB1dGUgdHdvIGZpZWxkcyBzaW11bHRhbmVvdXNseVxuICAgICAgICAgIHJldHVybiBbdmdGaWVsZChkaW1lbnNpb25GaWVsZERlZiwge2JpblN1ZmZpeDogJ21pZCd9KV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAvLyBGb3IgYmlubmVkIGdyb3VwIGJ5IGZpZWxkIHdpdGhvdXQgaW1wdXRlLCB3ZSBuZWVkIGJvdGggYmluIChzdGFydCkgYW5kIGJpbl9lbmRcbiAgICAgICAgICB2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmLCB7fSksXG4gICAgICAgICAgdmdGaWVsZChkaW1lbnNpb25GaWVsZERlZiwge2JpblN1ZmZpeDogJ2VuZCd9KVxuICAgICAgICBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFt2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmKV07XG4gICAgfVxuICAgIHJldHVybiBncm91cGJ5IHx8IFtdO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnVHJhbnNmb3JtW10ge1xuICAgIGNvbnN0IHRyYW5zZm9ybTogVmdUcmFuc2Zvcm1bXSA9IFtdO1xuICAgIGNvbnN0IHtmYWNldGJ5LCBkaW1lbnNpb25GaWVsZERlZiwgc3RhY2tGaWVsZDogZmllbGQsIHN0YWNrYnksIHNvcnQsIG9mZnNldCwgaW1wdXRlLCBhc30gPSB0aGlzLl9zdGFjaztcblxuICAgICAgLy8gSW1wdXRlXG4gICAgaWYgKGltcHV0ZSAmJiBkaW1lbnNpb25GaWVsZERlZikge1xuICAgICAgY29uc3QgZGltZW5zaW9uRmllbGQgPSBkaW1lbnNpb25GaWVsZERlZiA/IHZnRmllbGQoZGltZW5zaW9uRmllbGREZWYsIHtiaW5TdWZmaXg6ICdtaWQnfSk6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKGRpbWVuc2lvbkZpZWxkRGVmLmJpbikge1xuICAgICAgICAvLyBBcyB3ZSBjYW4gb25seSBpbXB1dGUgb25lIGZpZWxkIGF0IGEgdGltZSwgd2UgbmVlZCB0byBjYWxjdWxhdGVcbiAgICAgICAgLy8gbWlkIHBvaW50IGZvciBhIGJpbm5lZCBmaWVsZFxuICAgICAgICB0cmFuc2Zvcm0ucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2Zvcm11bGEnLFxuICAgICAgICAgIGV4cHI6ICcoJyArXG4gICAgICAgICAgICB2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pICtcbiAgICAgICAgICAgICcrJyArXG4gICAgICAgICAgICB2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJywgYmluU3VmZml4OiAnZW5kJ30pICtcbiAgICAgICAgICAgICcpLzInLFxuICAgICAgICAgIGFzOiBkaW1lbnNpb25GaWVsZFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgICB0eXBlOiAnaW1wdXRlJyxcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGdyb3VwYnk6IHN0YWNrYnksXG4gICAgICAgIGtleTogZGltZW5zaW9uRmllbGQsXG4gICAgICAgIG1ldGhvZDogJ3ZhbHVlJyxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN0YWNrXG4gICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgdHlwZTogJ3N0YWNrJyxcbiAgICAgIGdyb3VwYnk6IHRoaXMuZ2V0R3JvdXBieUZpZWxkcygpLmNvbmNhdChmYWNldGJ5KSxcbiAgICAgIGZpZWxkLFxuICAgICAgc29ydCxcbiAgICAgIGFzLFxuICAgICAgb2Zmc2V0XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/data/timeunit.d.ts b/build/src/compile/data/timeunit.d.ts new file mode 100644 index 0000000000..c46bd79708 --- /dev/null +++ b/build/src/compile/data/timeunit.d.ts @@ -0,0 +1,22 @@ +import { TimeUnit } from '../../timeunit'; +import { TimeUnitTransform } from '../../transform'; +import { Dict } from '../../util'; +import { VgFormulaTransform } from '../../vega.schema'; +import { ModelWithField } from '../model'; +import { DataFlowNode } from './dataflow'; +export interface TimeUnitComponent { + as: string; + timeUnit: TimeUnit; + field: string; +} +export declare class TimeUnitNode extends DataFlowNode { + private formula; + clone(): TimeUnitNode; + constructor(parent: DataFlowNode, formula: Dict); + static makeFromEncoding(parent: DataFlowNode, model: ModelWithField): TimeUnitNode; + static makeFromTransform(parent: DataFlowNode, t: TimeUnitTransform): TimeUnitNode; + merge(other: TimeUnitNode): void; + producedFields(): {}; + dependentFields(): {}; + assemble(): VgFormulaTransform[]; +} diff --git a/build/src/compile/data/timeunit.js b/build/src/compile/data/timeunit.js new file mode 100644 index 0000000000..d93aa3d627 --- /dev/null +++ b/build/src/compile/data/timeunit.js @@ -0,0 +1,75 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var fielddef_1 = require("../../fielddef"); +var timeunit_1 = require("../../timeunit"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +var TimeUnitNode = /** @class */ (function (_super) { + tslib_1.__extends(TimeUnitNode, _super); + function TimeUnitNode(parent, formula) { + var _this = _super.call(this, parent) || this; + _this.formula = formula; + return _this; + } + TimeUnitNode.prototype.clone = function () { + return new TimeUnitNode(null, util_1.duplicate(this.formula)); + }; + TimeUnitNode.makeFromEncoding = function (parent, model) { + var formula = model.reduceFieldDef(function (timeUnitComponent, fieldDef) { + if (fieldDef.timeUnit) { + var f = fielddef_1.vgField(fieldDef); + timeUnitComponent[f] = { + as: f, + timeUnit: fieldDef.timeUnit, + field: fieldDef.field + }; + } + return timeUnitComponent; + }, {}); + if (util_1.keys(formula).length === 0) { + return null; + } + return new TimeUnitNode(parent, formula); + }; + TimeUnitNode.makeFromTransform = function (parent, t) { + var _a; + return new TimeUnitNode(parent, (_a = {}, + _a[t.field] = { + as: t.as, + timeUnit: t.timeUnit, + field: t.field + }, + _a)); + }; + TimeUnitNode.prototype.merge = function (other) { + this.formula = tslib_1.__assign({}, this.formula, other.formula); + other.remove(); + }; + TimeUnitNode.prototype.producedFields = function () { + var out = {}; + util_1.vals(this.formula).forEach(function (f) { + out[f.as] = true; + }); + return out; + }; + TimeUnitNode.prototype.dependentFields = function () { + var out = {}; + util_1.vals(this.formula).forEach(function (f) { + out[f.field] = true; + }); + return out; + }; + TimeUnitNode.prototype.assemble = function () { + return util_1.vals(this.formula).map(function (c) { + return { + type: 'formula', + as: c.as, + expr: timeunit_1.fieldExpr(c.timeUnit, c.field) + }; + }); + }; + return TimeUnitNode; +}(dataflow_1.DataFlowNode)); +exports.TimeUnitNode = TimeUnitNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3RpbWV1bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2QywyQ0FBbUQ7QUFFbkQsbUNBQXVEO0FBR3ZELHVDQUF3QztBQVN4QztJQUFrQyx3Q0FBWTtJQUs1QyxzQkFBWSxNQUFvQixFQUFVLE9BQWdDO1FBQTFFLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBQ2Q7UUFGeUMsYUFBTyxHQUFQLE9BQU8sQ0FBeUI7O0lBRTFFLENBQUM7SUFOTSw0QkFBSyxHQUFaO1FBQ0UsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBTWEsNkJBQWdCLEdBQTlCLFVBQStCLE1BQW9CLEVBQUUsS0FBcUI7UUFDeEUsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFDLGlCQUFvQyxFQUFFLFFBQVE7WUFDbEYsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO2dCQUNyQixJQUFNLENBQUMsR0FBRyxrQkFBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRztvQkFDckIsRUFBRSxFQUFFLENBQUM7b0JBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO29CQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7aUJBQ3RCLENBQUM7YUFDSDtZQUNELE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQyxFQUFFLEVBQTZCLENBQUMsQ0FBQztRQUVsQyxJQUFJLFdBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRWEsOEJBQWlCLEdBQS9CLFVBQWdDLE1BQW9CLEVBQUUsQ0FBb0I7O1FBQ3hFLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTTtZQUM1QixHQUFDLENBQUMsQ0FBQyxLQUFLLElBQUc7Z0JBQ1QsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2FBQ2Y7Z0JBQ0QsQ0FBQztJQUNMLENBQUM7SUFFTSw0QkFBSyxHQUFaLFVBQWEsS0FBbUI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sd0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxxQ0FBYyxHQUFyQjtRQUNFLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUVmLFdBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLHNDQUFlLEdBQXRCO1FBQ0UsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWYsV0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sK0JBQVEsR0FBZjtRQUNFLE9BQU8sV0FBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDO1lBQzdCLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLElBQUksRUFBRSxvQkFBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQzthQUNmLENBQUM7UUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQUFDLEFBekVELENBQWtDLHVCQUFZLEdBeUU3QztBQXpFWSxvQ0FBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtmaWVsZEV4cHIsIFRpbWVVbml0fSBmcm9tICcuLi8uLi90aW1ldW5pdCc7XG5pbXBvcnQge1RpbWVVbml0VHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtEaWN0LCBkdXBsaWNhdGUsIGtleXMsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0Zvcm11bGFUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7TW9kZWxXaXRoRmllbGR9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVVbml0Q29tcG9uZW50IHtcbiAgYXM6IHN0cmluZztcbiAgdGltZVVuaXQ6IFRpbWVVbml0O1xuICBmaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgVGltZVVuaXROb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgVGltZVVuaXROb2RlKG51bGwsIGR1cGxpY2F0ZSh0aGlzLmZvcm11bGEpKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwcml2YXRlIGZvcm11bGE6IERpY3Q8VGltZVVuaXRDb21wb25lbnQ+KSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21FbmNvZGluZyhwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IE1vZGVsV2l0aEZpZWxkKSB7XG4gICAgY29uc3QgZm9ybXVsYSA9IG1vZGVsLnJlZHVjZUZpZWxkRGVmKCh0aW1lVW5pdENvbXBvbmVudDogVGltZVVuaXRDb21wb25lbnQsIGZpZWxkRGVmKSA9PiB7XG4gICAgICBpZiAoZmllbGREZWYudGltZVVuaXQpIHtcbiAgICAgICAgY29uc3QgZiA9IHZnRmllbGQoZmllbGREZWYpO1xuICAgICAgICB0aW1lVW5pdENvbXBvbmVudFtmXSA9IHtcbiAgICAgICAgICBhczogZixcbiAgICAgICAgICB0aW1lVW5pdDogZmllbGREZWYudGltZVVuaXQsXG4gICAgICAgICAgZmllbGQ6IGZpZWxkRGVmLmZpZWxkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGltZVVuaXRDb21wb25lbnQ7XG4gICAgfSwge30gYXMgRGljdDxUaW1lVW5pdENvbXBvbmVudD4pO1xuXG4gICAgaWYgKGtleXMoZm9ybXVsYSkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFRpbWVVbml0Tm9kZShwYXJlbnQsIGZvcm11bGEpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbVRyYW5zZm9ybShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgdDogVGltZVVuaXRUcmFuc2Zvcm0pIHtcbiAgICByZXR1cm4gbmV3IFRpbWVVbml0Tm9kZShwYXJlbnQsIHtcbiAgICAgIFt0LmZpZWxkXToge1xuICAgICAgICBhczogdC5hcyxcbiAgICAgICAgdGltZVVuaXQ6IHQudGltZVVuaXQsXG4gICAgICAgIGZpZWxkOiB0LmZpZWxkXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2Uob3RoZXI6IFRpbWVVbml0Tm9kZSkge1xuICAgIHRoaXMuZm9ybXVsYSA9IHsuLi50aGlzLmZvcm11bGEsIC4uLm90aGVyLmZvcm11bGF9O1xuICAgIG90aGVyLnJlbW92ZSgpO1xuICB9XG5cbiAgcHVibGljIHByb2R1Y2VkRmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAgdmFscyh0aGlzLmZvcm11bGEpLmZvckVhY2goZiA9PiB7XG4gICAgICBvdXRbZi5hc10gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRlbnRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICB2YWxzKHRoaXMuZm9ybXVsYSkuZm9yRWFjaChmID0+IHtcbiAgICAgIG91dFtmLmZpZWxkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCkge1xuICAgIHJldHVybiB2YWxzKHRoaXMuZm9ybXVsYSkubWFwKGMgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2Zvcm11bGEnLFxuICAgICAgICBhczogYy5hcyxcbiAgICAgICAgZXhwcjogZmllbGRFeHByKGMudGltZVVuaXQsIGMuZmllbGQpXG4gICAgICB9IGFzIFZnRm9ybXVsYVRyYW5zZm9ybTtcbiAgICB9KTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/data/window.d.ts b/build/src/compile/data/window.d.ts new file mode 100644 index 0000000000..96ebbadfa8 --- /dev/null +++ b/build/src/compile/data/window.d.ts @@ -0,0 +1,14 @@ +import { WindowTransform } from '../../transform'; +import { VgWindowTransform } from '../../vega.schema'; +import { DataFlowNode } from './dataflow'; +/** + * A class for the window transform nodes + */ +export declare class WindowTransformNode extends DataFlowNode { + private transform; + clone(): WindowTransformNode; + constructor(parent: DataFlowNode, transform: WindowTransform); + producedFields(): {}; + private getDefaultName; + assemble(): VgWindowTransform; +} diff --git a/build/src/compile/data/window.js b/build/src/compile/data/window.js new file mode 100644 index 0000000000..c9ecd6155b --- /dev/null +++ b/build/src/compile/data/window.js @@ -0,0 +1,81 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +var dataflow_1 = require("./dataflow"); +/** + * A class for the window transform nodes + */ +var WindowTransformNode = /** @class */ (function (_super) { + tslib_1.__extends(WindowTransformNode, _super); + function WindowTransformNode(parent, transform) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + return _this; + } + WindowTransformNode.prototype.clone = function () { + return new WindowTransformNode(this.parent, util_1.duplicate(this.transform)); + }; + WindowTransformNode.prototype.producedFields = function () { + var _this = this; + var out = {}; + this.transform.window.forEach(function (windowFieldDef) { + out[_this.getDefaultName(windowFieldDef)] = true; + }); + return out; + }; + WindowTransformNode.prototype.getDefaultName = function (windowFieldDef) { + return windowFieldDef.as || fielddef_1.vgField(windowFieldDef); + }; + WindowTransformNode.prototype.assemble = function () { + var fields = []; + var ops = []; + var as = []; + var params = []; + for (var _i = 0, _a = this.transform.window; _i < _a.length; _i++) { + var window_1 = _a[_i]; + ops.push(window_1.op); + as.push(this.getDefaultName(window_1)); + params.push(window_1.param === undefined ? null : window_1.param); + fields.push(window_1.field === undefined ? null : window_1.field); + } + var frame = this.transform.frame; + var groupby = this.transform.groupby; + var sortFields = []; + var sortOrder = []; + if (this.transform.sort !== undefined) { + for (var _b = 0, _c = this.transform.sort; _b < _c.length; _b++) { + var sortField = _c[_b]; + sortFields.push(sortField.field); + sortOrder.push(sortField.order === undefined ? null : sortField.order); + } + } + var sort = { + field: sortFields, + order: sortOrder, + }; + var ignorePeers = this.transform.ignorePeers; + var result = { + type: 'window', + params: params, + as: as, + ops: ops, + fields: fields, + sort: sort, + }; + if (ignorePeers !== undefined) { + result.ignorePeers = ignorePeers; + } + if (groupby !== undefined) { + result.groupby = groupby; + } + if (frame !== undefined) { + result.frame = frame; + } + return result; + }; + return WindowTransformNode; +}(dataflow_1.DataFlowNode)); +exports.WindowTransformNode = WindowTransformNode; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS93aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsMkNBQXVDO0FBRXZDLG1DQUFxQztBQUVyQyx1Q0FBd0M7QUFFeEM7O0dBRUc7QUFDSDtJQUF5QywrQ0FBWTtJQUtuRCw2QkFBWSxNQUFvQixFQUFVLFNBQTBCO1FBQXBFLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBQ2Q7UUFGeUMsZUFBUyxHQUFULFNBQVMsQ0FBaUI7O0lBRXBFLENBQUM7SUFOTSxtQ0FBSyxHQUFaO1FBQ0ksT0FBTyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBTU0sNENBQWMsR0FBckI7UUFBQSxpQkFPQztRQU5DLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFBLGNBQWM7WUFDMUMsR0FBRyxDQUFDLEtBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTyw0Q0FBYyxHQUF0QixVQUF1QixjQUE4QjtRQUNuRCxPQUFPLGNBQWMsQ0FBQyxFQUFFLElBQUksa0JBQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU0sc0NBQVEsR0FBZjtRQUNFLElBQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixJQUFNLEdBQUcsR0FBbUMsRUFBRSxDQUFDO1FBQy9DLElBQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixLQUFxQixVQUFxQixFQUFyQixLQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO1lBQXZDLElBQU0sUUFBTSxTQUFBO1lBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDcEIsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQU0sQ0FBQyxDQUFDLENBQUM7WUFDckMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDL0Q7UUFFRCxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNuQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztRQUN2QyxJQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsSUFBTSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztRQUMxQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNyQyxLQUF3QixVQUFtQixFQUFuQixLQUFBLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFuQixjQUFtQixFQUFuQixJQUFtQixFQUFFO2dCQUF4QyxJQUFNLFNBQVMsU0FBQTtnQkFDbEIsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2pDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQTBCLENBQUMsQ0FBQzthQUM3RjtTQUNGO1FBQ0QsSUFBTSxJQUFJLEdBQWlCO1lBQ3pCLEtBQUssRUFBRSxVQUFVO1lBQ2pCLEtBQUssRUFBRSxTQUFTO1NBQ2pCLENBQUM7UUFDRixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQztRQUUvQyxJQUFNLE1BQU0sR0FBc0I7WUFDaEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxNQUFNLFFBQUE7WUFDTixFQUFFLElBQUE7WUFDRixHQUFHLEtBQUE7WUFDSCxNQUFNLFFBQUE7WUFDTixJQUFJLE1BQUE7U0FDTCxDQUFDO1FBRUYsSUFBSSxXQUFXLEtBQUssU0FBUyxFQUFFO1lBQzdCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3pCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1NBQ3RCO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxBQXpFRCxDQUF5Qyx1QkFBWSxHQXlFcEQ7QUF6RVksa0RBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge3ZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7V2luZG93RmllbGREZWYsIFdpbmRvd09ubHlPcCwgV2luZG93VHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtkdXBsaWNhdGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0NvbXBhcmF0b3IsIFZnQ29tcGFyYXRvck9yZGVyLCBWZ1dpbmRvd1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG4vKipcbiAqIEEgY2xhc3MgZm9yIHRoZSB3aW5kb3cgdHJhbnNmb3JtIG5vZGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBXaW5kb3dUcmFuc2Zvcm1Ob2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyBXaW5kb3dUcmFuc2Zvcm1Ob2RlKHRoaXMucGFyZW50LCBkdXBsaWNhdGUodGhpcy50cmFuc2Zvcm0pKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwcml2YXRlIHRyYW5zZm9ybTogV2luZG93VHJhbnNmb3JtKSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpIHtcbiAgICBjb25zdCBvdXQgPSB7fTtcbiAgICB0aGlzLnRyYW5zZm9ybS53aW5kb3cuZm9yRWFjaCh3aW5kb3dGaWVsZERlZiA9PiB7XG4gICAgICBvdXRbdGhpcy5nZXREZWZhdWx0TmFtZSh3aW5kb3dGaWVsZERlZildID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHROYW1lKHdpbmRvd0ZpZWxkRGVmOiBXaW5kb3dGaWVsZERlZik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHdpbmRvd0ZpZWxkRGVmLmFzIHx8IHZnRmllbGQod2luZG93RmllbGREZWYpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnV2luZG93VHJhbnNmb3JtIHtcbiAgICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgb3BzOiAoQWdncmVnYXRlT3AgfCBXaW5kb3dPbmx5T3ApW10gPSBbXTtcbiAgICBjb25zdCBhcyA9IFtdO1xuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xuICAgIGZvciAoY29uc3Qgd2luZG93IG9mIHRoaXMudHJhbnNmb3JtLndpbmRvdykge1xuICAgICAgb3BzLnB1c2god2luZG93Lm9wKTtcbiAgICAgIGFzLnB1c2godGhpcy5nZXREZWZhdWx0TmFtZSh3aW5kb3cpKTtcbiAgICAgIHBhcmFtcy5wdXNoKHdpbmRvdy5wYXJhbSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHdpbmRvdy5wYXJhbSk7XG4gICAgICBmaWVsZHMucHVzaCh3aW5kb3cuZmllbGQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiB3aW5kb3cuZmllbGQpO1xuICAgIH1cblxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50cmFuc2Zvcm0uZnJhbWU7XG4gICAgY29uc3QgZ3JvdXBieSA9IHRoaXMudHJhbnNmb3JtLmdyb3VwYnk7XG4gICAgY29uc3Qgc29ydEZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzb3J0T3JkZXI6IFZnQ29tcGFyYXRvck9yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy50cmFuc2Zvcm0uc29ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHNvcnRGaWVsZCBvZiB0aGlzLnRyYW5zZm9ybS5zb3J0KSB7XG4gICAgICAgIHNvcnRGaWVsZHMucHVzaChzb3J0RmllbGQuZmllbGQpO1xuICAgICAgICBzb3J0T3JkZXIucHVzaChzb3J0RmllbGQub3JkZXIgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBzb3J0RmllbGQub3JkZXIgYXMgVmdDb21wYXJhdG9yT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzb3J0OiBWZ0NvbXBhcmF0b3IgPSB7XG4gICAgICBmaWVsZDogc29ydEZpZWxkcyxcbiAgICAgIG9yZGVyOiBzb3J0T3JkZXIsXG4gICAgfTtcbiAgICBjb25zdCBpZ25vcmVQZWVycyA9IHRoaXMudHJhbnNmb3JtLmlnbm9yZVBlZXJzO1xuXG4gICAgY29uc3QgcmVzdWx0OiBWZ1dpbmRvd1RyYW5zZm9ybSA9IHtcbiAgICAgIHR5cGU6ICd3aW5kb3cnLFxuICAgICAgcGFyYW1zLFxuICAgICAgYXMsXG4gICAgICBvcHMsXG4gICAgICBmaWVsZHMsXG4gICAgICBzb3J0LFxuICAgIH07XG5cbiAgICBpZiAoaWdub3JlUGVlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0Lmlnbm9yZVBlZXJzID0gaWdub3JlUGVlcnM7XG4gICAgfVxuXG4gICAgaWYgKGdyb3VwYnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0Lmdyb3VwYnkgPSBncm91cGJ5O1xuICAgIH1cblxuICAgIGlmIChmcmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuZnJhbWUgPSBmcmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/facet.d.ts b/build/src/compile/facet.d.ts new file mode 100644 index 0000000000..9b99dff08e --- /dev/null +++ b/build/src/compile/facet.d.ts @@ -0,0 +1,40 @@ +import { Channel } from '../channel'; +import { Config } from '../config'; +import { FacetMapping } from '../facet'; +import { FieldDef } from '../fielddef'; +import { NormalizedFacetSpec } from '../spec'; +import { VgData, VgLayout, VgMarkGroup, VgSignal } from '../vega.schema'; +import { Model, ModelWithField } from './model'; +import { RepeaterValue } from './repeater'; +export declare class FacetModel extends ModelWithField { + readonly type: 'facet'; + readonly facet: FacetMapping; + readonly child: Model; + readonly children: Model[]; + constructor(spec: NormalizedFacetSpec, parent: Model, parentGivenName: string, repeater: RepeaterValue, config: Config); + private initFacet; + channelHasField(channel: Channel): boolean; + fieldDef(channel: Channel): FieldDef; + parseData(): void; + parseLayoutSize(): void; + parseSelection(): void; + parseMarkGroup(): void; + parseAxisAndHeader(): void; + private parseHeader; + private makeHeaderComponent; + private mergeChildAxis; + assembleSelectionTopLevelSignals(signals: any[]): VgSignal[]; + assembleSelectionSignals(): VgSignal[]; + assembleSelectionData(data: VgData[]): VgData[]; + private getLayoutBandMixins; + assembleLayout(): VgLayout; + assembleLayoutSignals(): VgSignal[]; + private columnDistinctSignal; + assembleGroup(signals: VgSignal[]): any; + /** + * Aggregate cardinality for calculating size + */ + private getCardinalityAggregateForChild; + assembleMarks(): VgMarkGroup[]; + protected getMapping(): FacetMapping; +} diff --git a/build/src/compile/facet.js b/build/src/compile/facet.js new file mode 100644 index 0000000000..b07f663e61 --- /dev/null +++ b/build/src/compile/facet.js @@ -0,0 +1,268 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../channel"); +var encoding_1 = require("../encoding"); +var fielddef_1 = require("../fielddef"); +var log = tslib_1.__importStar(require("../log")); +var scale_1 = require("../scale"); +var util_1 = require("../util"); +var vega_schema_1 = require("../vega.schema"); +var assemble_1 = require("./axis/assemble"); +var buildmodel_1 = require("./buildmodel"); +var assemble_2 = require("./data/assemble"); +var parse_1 = require("./data/parse"); +var header_1 = require("./layout/header"); +var parse_2 = require("./layoutsize/parse"); +var model_1 = require("./model"); +var repeater_1 = require("./repeater"); +var resolve_1 = require("./resolve"); +var domain_1 = require("./scale/domain"); +var FacetModel = /** @class */ (function (_super) { + tslib_1.__extends(FacetModel, _super); + function FacetModel(spec, parent, parentGivenName, repeater, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'facet'; + _this.child = buildmodel_1.buildModel(spec.spec, _this, _this.getName('child'), undefined, repeater, config, false); + _this.children = [_this.child]; + var facet = repeater_1.replaceRepeaterInFacet(spec.facet, repeater); + _this.facet = _this.initFacet(facet); + return _this; + } + FacetModel.prototype.initFacet = function (facet) { + // clone to prevent side effect to the original spec + return encoding_1.reduce(facet, function (normalizedFacet, fieldDef, channel) { + if (!util_1.contains([channel_1.ROW, channel_1.COLUMN], channel)) { + // Drop unsupported channel + log.warn(log.message.incompatibleChannel(channel, 'facet')); + return normalizedFacet; + } + if (fieldDef.field === undefined) { + log.warn(log.message.emptyFieldDef(fieldDef, channel)); + return normalizedFacet; + } + // Convert type to full, lowercase type, or augment the fieldDef with a default type if missing. + normalizedFacet[channel] = fielddef_1.normalize(fieldDef, channel); + return normalizedFacet; + }, {}); + }; + FacetModel.prototype.channelHasField = function (channel) { + return !!this.facet[channel]; + }; + FacetModel.prototype.fieldDef = function (channel) { + return this.facet[channel]; + }; + FacetModel.prototype.parseData = function () { + this.component.data = parse_1.parseData(this); + this.child.parseData(); + }; + FacetModel.prototype.parseLayoutSize = function () { + parse_2.parseChildrenLayoutSize(this); + }; + FacetModel.prototype.parseSelection = function () { + // As a facet has a single child, the selection components are the same. + // The child maintains its selections to assemble signals, which remain + // within its unit. + this.child.parseSelection(); + this.component.selection = this.child.component.selection; + }; + FacetModel.prototype.parseMarkGroup = function () { + this.child.parseMarkGroup(); + }; + FacetModel.prototype.parseAxisAndHeader = function () { + this.child.parseAxisAndHeader(); + this.parseHeader('column'); + this.parseHeader('row'); + this.mergeChildAxis('x'); + this.mergeChildAxis('y'); + }; + FacetModel.prototype.parseHeader = function (channel) { + if (this.channelHasField(channel)) { + var fieldDef = this.facet[channel]; + var header = fieldDef.header || {}; + var title = fieldDef.title !== undefined ? fieldDef.title : + header.title !== undefined ? header.title : fielddef_1.title(fieldDef, this.config); + if (this.child.component.layoutHeaders[channel].title) { + // merge title with child to produce "Title / Subtitle / Sub-subtitle" + title += ' / ' + this.child.component.layoutHeaders[channel].title; + this.child.component.layoutHeaders[channel].title = null; + } + this.component.layoutHeaders[channel] = { + title: title, + facetFieldDef: fieldDef, + // TODO: support adding label to footer as well + header: [this.makeHeaderComponent(channel, true)] + }; + } + }; + FacetModel.prototype.makeHeaderComponent = function (channel, labels) { + var sizeType = channel === 'row' ? 'height' : 'width'; + return { + labels: labels, + sizeSignal: this.child.component.layoutSize.get(sizeType) ? this.child.getSizeSignalRef(sizeType) : undefined, + axes: [] + }; + }; + FacetModel.prototype.mergeChildAxis = function (channel) { + var child = this.child; + if (child.component.axes[channel]) { + var _a = this.component, layoutHeaders = _a.layoutHeaders, resolve = _a.resolve; + resolve.axis[channel] = resolve_1.parseGuideResolve(resolve, channel); + if (resolve.axis[channel] === 'shared') { + // For shared axis, move the axes to facet's header or footer + var headerChannel = channel === 'x' ? 'column' : 'row'; + var layoutHeader = layoutHeaders[headerChannel]; + for (var _i = 0, _b = child.component.axes[channel]; _i < _b.length; _i++) { + var axisComponent = _b[_i]; + var headerType = header_1.getHeaderType(axisComponent.get('orient')); + layoutHeader[headerType] = layoutHeader[headerType] || + [this.makeHeaderComponent(headerChannel, false)]; + var mainAxis = assemble_1.assembleAxis(axisComponent, 'main', this.config, { header: true }); + // LayoutHeader no longer keep track of property precedence, thus let's combine. + layoutHeader[headerType][0].axes.push(mainAxis); + axisComponent.mainExtracted = true; + } + } + else { + // Otherwise do nothing for independent axes + } + } + }; + FacetModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.child.assembleSelectionTopLevelSignals(signals); + }; + FacetModel.prototype.assembleSelectionSignals = function () { + this.child.assembleSelectionSignals(); + return []; + }; + FacetModel.prototype.assembleSelectionData = function (data) { + return this.child.assembleSelectionData(data); + }; + FacetModel.prototype.getLayoutBandMixins = function (headerType) { + var bandMixins = {}; + var bandType = headerType === 'header' ? 'headerBand' : 'footerBand'; + for (var _i = 0, _a = ['row', 'column']; _i < _a.length; _i++) { + var channel = _a[_i]; + var layoutHeaderComponent = this.component.layoutHeaders[channel]; + var headerComponent = layoutHeaderComponent[headerType]; + if (headerComponent && headerComponent[0]) { + var sizeType = channel === 'row' ? 'height' : 'width'; + if (!this.child.component.layoutSize.get(sizeType)) { + // If facet child does not have size signal, then apply headerBand + bandMixins[bandType] = bandMixins[bandType] || {}; + bandMixins[bandType][channel] = 0.5; + } + } + } + return bandMixins; + }; + FacetModel.prototype.assembleLayout = function () { + var columns = this.channelHasField('column') ? this.columnDistinctSignal() : 1; + // TODO: determine default align based on shared / independent scales + return tslib_1.__assign({ padding: { row: 10, column: 10 } }, this.getLayoutBandMixins('header'), this.getLayoutBandMixins('footer'), { + // TODO: support offset for rowHeader/rowFooter/rowTitle/columnHeader/columnFooter/columnTitle + offset: 10, columns: columns, bounds: 'full', align: 'all' }); + }; + FacetModel.prototype.assembleLayoutSignals = function () { + // FIXME(https://github.com/vega/vega-lite/issues/1193): this can be incorrect if we have independent scales. + return this.child.assembleLayoutSignals(); + }; + FacetModel.prototype.columnDistinctSignal = function () { + if (this.parent && (this.parent instanceof FacetModel)) { + // For nested facet, we will add columns to group mark instead + // See discussion in https://github.com/vega/vega/issues/952 + // and https://github.com/vega/vega-view/releases/tag/v1.2.6 + return undefined; + } + else { + // In facetNode.assemble(), the name is always this.getName('column') + '_layout'. + var facetLayoutDataName = this.getName('column_domain'); + return { signal: "length(data('" + facetLayoutDataName + "'))" }; + } + }; + FacetModel.prototype.assembleGroup = function (signals) { + if (this.parent && (this.parent instanceof FacetModel)) { + // Provide number of columns for layout. + // See discussion in https://github.com/vega/vega/issues/952 + // and https://github.com/vega/vega-view/releases/tag/v1.2.6 + return tslib_1.__assign({}, (this.channelHasField('column') ? { + encode: { + update: { + // TODO(https://github.com/vega/vega-lite/issues/2759): + // Correct the signal for facet of concat of facet_column + columns: { field: fielddef_1.vgField(this.facet.column, { prefix: 'distinct' }) } + } + } + } : {}), _super.prototype.assembleGroup.call(this, signals)); + } + return _super.prototype.assembleGroup.call(this, signals); + }; + /** + * Aggregate cardinality for calculating size + */ + FacetModel.prototype.getCardinalityAggregateForChild = function () { + var fields = []; + var ops = []; + if (this.child instanceof FacetModel) { + if (this.child.channelHasField('column')) { + fields.push(fielddef_1.vgField(this.child.facet.column)); + ops.push('distinct'); + } + } + else { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + var childScaleComponent = this.child.component.scales[channel]; + if (childScaleComponent && !childScaleComponent.merged) { + var type = childScaleComponent.get('type'); + var range = childScaleComponent.get('range'); + if (scale_1.hasDiscreteDomain(type) && vega_schema_1.isVgRangeStep(range)) { + var domain = domain_1.assembleDomain(this.child, channel); + var field = domain_1.getFieldFromDomain(domain); + if (field) { + fields.push(field); + ops.push('distinct'); + } + else { + log.warn('Unknown field for ${channel}. Cannot calculate view size.'); + } + } + } + } + } + return fields.length ? { fields: fields, ops: ops } : undefined; + }; + FacetModel.prototype.assembleMarks = function () { + var _a = this, child = _a.child, facet = _a.facet; + var facetRoot = this.component.data.facetRoot; + var data = assemble_2.assembleFacetData(facetRoot); + // If we facet by two dimensions, we need to add a cross operator to the aggregation + // so that we create all groups + var hasRow = this.channelHasField(channel_1.ROW); + var hasColumn = this.channelHasField(channel_1.COLUMN); + var layoutSizeEncodeEntry = child.assembleLayoutSize(); + var aggregateMixins = {}; + if (hasRow && hasColumn) { + aggregateMixins.aggregate = { cross: true }; + } + var cardinalityAggregateForChild = this.getCardinalityAggregateForChild(); + if (cardinalityAggregateForChild) { + aggregateMixins.aggregate = tslib_1.__assign({}, aggregateMixins.aggregate, cardinalityAggregateForChild); + } + var title = child.assembleTitle(); + var style = child.assembleGroupStyle(); + var markGroup = tslib_1.__assign({ name: this.getName('cell'), type: 'group' }, (title ? { title: title } : {}), (style ? { style: style } : {}), { from: { + facet: tslib_1.__assign({ name: facetRoot.name, data: facetRoot.data, groupby: [].concat(hasRow ? [this.vgField(channel_1.ROW)] : [], hasColumn ? [this.vgField(channel_1.COLUMN)] : []) }, aggregateMixins) + }, sort: { + field: [].concat(hasRow ? [this.vgField(channel_1.ROW, { expr: 'datum', })] : [], hasColumn ? [this.vgField(channel_1.COLUMN, { expr: 'datum' })] : []), + order: [].concat(hasRow ? [(facet.row.sort) || 'ascending'] : [], hasColumn ? [(facet.column.sort) || 'ascending'] : []) + } }, (data.length > 0 ? { data: data } : {}), (layoutSizeEncodeEntry ? { encode: { update: layoutSizeEncodeEntry } } : {}), child.assembleGroup()); + return [markGroup]; + }; + FacetModel.prototype.getMapping = function () { + return this.facet; + }; + return FacetModel; +}(model_1.ModelWithField)); +exports.FacetModel = FacetModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9mYWNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxzQ0FBOEQ7QUFFOUQsd0NBQW1DO0FBRW5DLHdDQUFpRjtBQUNqRixrREFBOEI7QUFDOUIsa0NBQTJDO0FBRTNDLGdDQUFpQztBQUNqQyw4Q0FBc0c7QUFDdEcsNENBQTZDO0FBQzdDLDJDQUF3QztBQUN4Qyw0Q0FBa0Q7QUFDbEQsc0NBQXVDO0FBQ3ZDLDBDQUE4RTtBQUM5RSw0Q0FBMkQ7QUFDM0QsaUNBQThDO0FBQzlDLHVDQUFpRTtBQUNqRSxxQ0FBNEM7QUFDNUMseUNBQWtFO0FBRWxFO0lBQWdDLHNDQUFjO0lBUTVDLG9CQUFZLElBQXlCLEVBQUUsTUFBYSxFQUFFLGVBQXVCLEVBQUUsUUFBdUIsRUFBRSxNQUFjO1FBQXRILFlBQ0Usa0JBQU0sSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBU3JFO1FBakJlLFVBQUksR0FBWSxPQUFPLENBQUM7UUFXdEMsS0FBSSxDQUFDLEtBQUssR0FBRyx1QkFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSSxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEcsS0FBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QixJQUFNLEtBQUssR0FBeUIsaUNBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRixLQUFJLENBQUMsS0FBSyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7O0lBQ3JDLENBQUM7SUFFTyw4QkFBUyxHQUFqQixVQUFr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QUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNyQyxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxxQkFBcUIsRUFBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUN4RSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQ3pCLENBQUM7UUFFRixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVTLCtCQUFVLEdBQXBCO1FBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDSCxpQkFBQztBQUFELENBQUMsQUExVUQsQ0FBZ0Msc0JBQWMsR0EwVTdDO0FBMVVZLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge0NoYW5uZWwsIENPTFVNTiwgUk9XLCBTY2FsZUNoYW5uZWx9IGZyb20gJy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7RmllbGREZWYsIG5vcm1hbGl6ZSwgdGl0bGUgYXMgZmllbGREZWZUaXRsZSwgdmdGaWVsZH0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge2hhc0Rpc2NyZXRlRG9tYWlufSBmcm9tICcuLi9zY2FsZSc7XG5pbXBvcnQge05vcm1hbGl6ZWRGYWNldFNwZWN9IGZyb20gJy4uL3NwZWMnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFJvd0NvbCwgVmdBeGlzLCBWZ0RhdGEsIFZnTGF5b3V0LCBWZ01hcmtHcm91cCwgVmdTaWduYWx9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YXNzZW1ibGVBeGlzfSBmcm9tICcuL2F4aXMvYXNzZW1ibGUnO1xuaW1wb3J0IHtidWlsZE1vZGVsfSBmcm9tICcuL2J1aWxkbW9kZWwnO1xuaW1wb3J0IHthc3NlbWJsZUZhY2V0RGF0YX0gZnJvbSAnLi9kYXRhL2Fzc2VtYmxlJztcbmltcG9ydCB7cGFyc2VEYXRhfSBmcm9tICcuL2RhdGEvcGFyc2UnO1xuaW1wb3J0IHtnZXRIZWFkZXJUeXBlLCBIZWFkZXJDaGFubmVsLCBIZWFkZXJDb21wb25lbnR9IGZyb20gJy4vbGF5b3V0L2hlYWRlcic7XG5pbXBvcnQge3BhcnNlQ2hpbGRyZW5MYXlvdXRTaXplfSBmcm9tICcuL2xheW91dHNpemUvcGFyc2UnO1xuaW1wb3J0IHtNb2RlbCwgTW9kZWxXaXRoRmllbGR9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtSZXBlYXRlclZhbHVlLCByZXBsYWNlUmVwZWF0ZXJJbkZhY2V0fSBmcm9tICcuL3JlcGVhdGVyJztcbmltcG9ydCB7cGFyc2VHdWlkZVJlc29sdmV9IGZyb20gJy4vcmVzb2x2ZSc7XG5pbXBvcnQge2Fzc2VtYmxlRG9tYWluLCBnZXRGaWVsZEZyb21Eb21haW59IGZyb20gJy4vc2NhbGUvZG9tYWluJztcblxuZXhwb3J0IGNsYXNzIEZhY2V0TW9kZWwgZXh0ZW5kcyBNb2RlbFdpdGhGaWVsZCB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiAnZmFjZXQnID0gJ2ZhY2V0JztcbiAgcHVibGljIHJlYWRvbmx5IGZhY2V0OiBGYWNldE1hcHBpbmc8c3RyaW5nPjtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2hpbGQ6IE1vZGVsO1xuXG4gIHB1YmxpYyByZWFkb25seSBjaGlsZHJlbjogTW9kZWxbXTtcblxuICBjb25zdHJ1Y3RvcihzcGVjOiBOb3JtYWxpemVkRmFjZXRTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgc3VwZXIoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIGNvbmZpZywgcmVwZWF0ZXIsIHNwZWMucmVzb2x2ZSk7XG5cblxuICAgIHRoaXMuY2hpbGQgPSBidWlsZE1vZGVsKHNwZWMuc3BlYywgdGhpcywgdGhpcy5nZXROYW1lKCdjaGlsZCcpLCB1bmRlZmluZWQsIHJlcGVhdGVyLCBjb25maWcsIGZhbHNlKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gW3RoaXMuY2hpbGRdO1xuXG4gICAgY29uc3QgZmFjZXQ6IEZhY2V0TWFwcGluZzxzdHJpbmc+ID0gcmVwbGFjZVJlcGVhdGVySW5GYWNldChzcGVjLmZhY2V0LCByZXBlYXRlcik7XG5cbiAgICB0aGlzLmZhY2V0ID0gdGhpcy5pbml0RmFjZXQoZmFjZXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RmFjZXQoZmFjZXQ6IEZhY2V0TWFwcGluZzxzdHJpbmc+KTogRmFjZXRNYXBwaW5nPHN0cmluZz4ge1xuICAgIC8vIGNsb25lIHRvIHByZXZlbnQgc2lkZSBlZmZlY3QgdG8gdGhlIG9yaWdpbmFsIHNwZWNcbiAgICByZXR1cm4gcmVkdWNlKGZhY2V0LCBmdW5jdGlvbihub3JtYWxpemVkRmFjZXQsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgICBpZiAoIWNvbnRhaW5zKFtST1csIENPTFVNTl0sIGNoYW5uZWwpKSB7XG4gICAgICAgIC8vIERyb3AgdW5zdXBwb3J0ZWQgY2hhbm5lbFxuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5pbmNvbXBhdGlibGVDaGFubmVsKGNoYW5uZWwsICdmYWNldCcpKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRGYWNldDtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkRGVmLmZpZWxkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW1wdHlGaWVsZERlZihmaWVsZERlZiwgY2hhbm5lbCkpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZhY2V0O1xuICAgICAgfVxuXG4gICAgICAvLyBDb252ZXJ0IHR5cGUgdG8gZnVsbCwgbG93ZXJjYXNlIHR5cGUsIG9yIGF1Z21lbnQgdGhlIGZpZWxkRGVmIHdpdGggYSBkZWZhdWx0IHR5cGUgaWYgbWlzc2luZy5cbiAgICAgIG5vcm1hbGl6ZWRGYWNldFtjaGFubmVsXSA9IG5vcm1hbGl6ZShmaWVsZERlZiwgY2hhbm5lbCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEZhY2V0O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFubmVsSGFzRmllbGQoY2hhbm5lbDogQ2hhbm5lbCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuZmFjZXRbY2hhbm5lbF07XG4gIH1cblxuICBwdWJsaWMgZmllbGREZWYoY2hhbm5lbDogQ2hhbm5lbCk6IEZpZWxkRGVmPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmZhY2V0W2NoYW5uZWxdO1xuICB9XG5cbiAgcHVibGljIHBhcnNlRGF0YSgpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0gcGFyc2VEYXRhKHRoaXMpO1xuICAgIHRoaXMuY2hpbGQucGFyc2VEYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYXlvdXRTaXplKCkge1xuICAgIHBhcnNlQ2hpbGRyZW5MYXlvdXRTaXplKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlU2VsZWN0aW9uKCkge1xuICAgIC8vIEFzIGEgZmFjZXQgaGFzIGEgc2luZ2xlIGNoaWxkLCB0aGUgc2VsZWN0aW9uIGNvbXBvbmVudHMgYXJlIHRoZSBzYW1lLlxuICAgIC8vIFRoZSBjaGlsZCBtYWludGFpbnMgaXRzIHNlbGVjdGlvbnMgdG8gYXNzZW1ibGUgc2lnbmFscywgd2hpY2ggcmVtYWluXG4gICAgLy8gd2l0aGluIGl0cyB1bml0LlxuICAgIHRoaXMuY2hpbGQucGFyc2VTZWxlY3Rpb24oKTtcbiAgICB0aGlzLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB0aGlzLmNoaWxkLmNvbXBvbmVudC5zZWxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgcGFyc2VNYXJrR3JvdXAoKSB7XG4gICAgdGhpcy5jaGlsZC5wYXJzZU1hcmtHcm91cCgpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlQXhpc0FuZEhlYWRlcigpIHtcbiAgICB0aGlzLmNoaWxkLnBhcnNlQXhpc0FuZEhlYWRlcigpO1xuXG4gICAgdGhpcy5wYXJzZUhlYWRlcignY29sdW1uJyk7XG4gICAgdGhpcy5wYXJzZUhlYWRlcigncm93Jyk7XG5cbiAgICB0aGlzLm1lcmdlQ2hpbGRBeGlzKCd4Jyk7XG4gICAgdGhpcy5tZXJnZUNoaWxkQXhpcygneScpO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUhlYWRlcihjaGFubmVsOiBIZWFkZXJDaGFubmVsKSB7XG5cbiAgICBpZiAodGhpcy5jaGFubmVsSGFzRmllbGQoY2hhbm5lbCkpIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0gdGhpcy5mYWNldFtjaGFubmVsXTtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGZpZWxkRGVmLmhlYWRlciB8fCB7fTtcbiAgICAgIGxldCB0aXRsZSA9IGZpZWxkRGVmLnRpdGxlICE9PSB1bmRlZmluZWQgPyBmaWVsZERlZi50aXRsZSA6XG4gICAgICAgIGhlYWRlci50aXRsZSAhPT0gdW5kZWZpbmVkID8gaGVhZGVyLnRpdGxlIDogZmllbGREZWZUaXRsZShmaWVsZERlZiwgdGhpcy5jb25maWcpO1xuXG4gICAgICBpZiAodGhpcy5jaGlsZC5jb21wb25lbnQubGF5b3V0SGVhZGVyc1tjaGFubmVsXS50aXRsZSkge1xuICAgICAgICAvLyBtZXJnZSB0aXRsZSB3aXRoIGNoaWxkIHRvIHByb2R1Y2UgXCJUaXRsZSAvIFN1YnRpdGxlIC8gU3ViLXN1YnRpdGxlXCJcbiAgICAgICAgdGl0bGUgKz0gJyAvICcgKyB0aGlzLmNoaWxkLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdLnRpdGxlO1xuICAgICAgICB0aGlzLmNoaWxkLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdLnRpdGxlID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb21wb25lbnQubGF5b3V0SGVhZGVyc1tjaGFubmVsXSA9IHtcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGZhY2V0RmllbGREZWY6IGZpZWxkRGVmLFxuICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IGFkZGluZyBsYWJlbCB0byBmb290ZXIgYXMgd2VsbFxuICAgICAgICBoZWFkZXI6IFt0aGlzLm1ha2VIZWFkZXJDb21wb25lbnQoY2hhbm5lbCwgdHJ1ZSldXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbWFrZUhlYWRlckNvbXBvbmVudChjaGFubmVsOiBIZWFkZXJDaGFubmVsLCBsYWJlbHM6IGJvb2xlYW4pOiBIZWFkZXJDb21wb25lbnQge1xuICAgIGNvbnN0IHNpemVUeXBlID0gY2hhbm5lbCA9PT0gJ3JvdycgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWxzLFxuICAgICAgc2l6ZVNpZ25hbDogdGhpcy5jaGlsZC5jb21wb25lbnQubGF5b3V0U2l6ZS5nZXQoc2l6ZVR5cGUpID8gdGhpcy5jaGlsZC5nZXRTaXplU2lnbmFsUmVmKHNpemVUeXBlKSA6IHVuZGVmaW5lZCxcbiAgICAgIGF4ZXM6IFtdXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWVyZ2VDaGlsZEF4aXMoY2hhbm5lbDogJ3gnIHwgJ3knKSB7XG4gICAgY29uc3Qge2NoaWxkfSA9IHRoaXM7XG4gICAgaWYgKGNoaWxkLmNvbXBvbmVudC5heGVzW2NoYW5uZWxdKSB7XG4gICAgICBjb25zdCB7bGF5b3V0SGVhZGVycywgcmVzb2x2ZX0gPSB0aGlzLmNvbXBvbmVudDtcbiAgICAgIHJlc29sdmUuYXhpc1tjaGFubmVsXSA9IHBhcnNlR3VpZGVSZXNvbHZlKHJlc29sdmUsIGNoYW5uZWwpO1xuXG4gICAgICBpZiAocmVzb2x2ZS5heGlzW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgICAvLyBGb3Igc2hhcmVkIGF4aXMsIG1vdmUgdGhlIGF4ZXMgdG8gZmFjZXQncyBoZWFkZXIgb3IgZm9vdGVyXG4gICAgICAgIGNvbnN0IGhlYWRlckNoYW5uZWwgPSBjaGFubmVsID09PSAneCcgPyAnY29sdW1uJyA6ICdyb3cnO1xuXG4gICAgICAgIGNvbnN0IGxheW91dEhlYWRlciA9IGxheW91dEhlYWRlcnNbaGVhZGVyQ2hhbm5lbF07XG4gICAgICAgIGZvciAoY29uc3QgYXhpc0NvbXBvbmVudCBvZiBjaGlsZC5jb21wb25lbnQuYXhlc1tjaGFubmVsXSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclR5cGUgPSBnZXRIZWFkZXJUeXBlKGF4aXNDb21wb25lbnQuZ2V0KCdvcmllbnQnKSk7XG4gICAgICAgICAgbGF5b3V0SGVhZGVyW2hlYWRlclR5cGVdID0gbGF5b3V0SGVhZGVyW2hlYWRlclR5cGVdIHx8XG4gICAgICAgICAgW3RoaXMubWFrZUhlYWRlckNvbXBvbmVudChoZWFkZXJDaGFubmVsLCBmYWxzZSldO1xuXG4gICAgICAgICAgY29uc3QgbWFpbkF4aXMgPSBhc3NlbWJsZUF4aXMoYXhpc0NvbXBvbmVudCwgJ21haW4nLCB0aGlzLmNvbmZpZywge2hlYWRlcjogdHJ1ZX0pO1xuICAgICAgICAgIC8vIExheW91dEhlYWRlciBubyBsb25nZXIga2VlcCB0cmFjayBvZiBwcm9wZXJ0eSBwcmVjZWRlbmNlLCB0aHVzIGxldCdzIGNvbWJpbmUuXG4gICAgICAgICAgbGF5b3V0SGVhZGVyW2hlYWRlclR5cGVdWzBdLmF4ZXMucHVzaChtYWluQXhpcyk7XG4gICAgICAgICAgYXhpc0NvbXBvbmVudC5tYWluRXh0cmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgZm9yIGluZGVwZW5kZW50IGF4ZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZC5hc3NlbWJsZVNlbGVjdGlvblRvcExldmVsU2lnbmFscyhzaWduYWxzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvblNpZ25hbHMoKTogVmdTaWduYWxbXSB7XG4gICAgdGhpcy5jaGlsZC5hc3NlbWJsZVNlbGVjdGlvblNpZ25hbHMoKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGE6IFZnRGF0YVtdKTogVmdEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uRGF0YShkYXRhKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGF5b3V0QmFuZE1peGlucyhoZWFkZXJUeXBlOiAnaGVhZGVyJyB8ICdmb290ZXInKToge1xuICAgIGhlYWRlckJhbmQ/OiBSb3dDb2w8bnVtYmVyPixcbiAgICBmb290ZXJCYW5kPzogUm93Q29sPG51bWJlcj5cbiAgfSB7XG4gICAgY29uc3QgYmFuZE1peGlucyA9IHt9O1xuXG4gICAgY29uc3QgYmFuZFR5cGUgPSBoZWFkZXJUeXBlID09PSAnaGVhZGVyJyA/ICdoZWFkZXJCYW5kJyA6ICdmb290ZXJCYW5kJztcblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3JvdycsICdjb2x1bW4nXSBhcyAoJ3JvdycgfCAnY29sdW1uJylbXSkge1xuICAgICAgY29uc3QgbGF5b3V0SGVhZGVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQubGF5b3V0SGVhZGVyc1tjaGFubmVsXTtcbiAgICAgIGNvbnN0IGhlYWRlckNvbXBvbmVudCA9IGxheW91dEhlYWRlckNvbXBvbmVudFtoZWFkZXJUeXBlXTtcbiAgICAgIGlmIChoZWFkZXJDb21wb25lbnQgJiYgaGVhZGVyQ29tcG9uZW50WzBdKSB7XG4gICAgICAgIGNvbnN0IHNpemVUeXBlID0gY2hhbm5lbCA9PT0gJ3JvdycgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkLmNvbXBvbmVudC5sYXlvdXRTaXplLmdldChzaXplVHlwZSkpIHtcbiAgICAgICAgICAvLyBJZiBmYWNldCBjaGlsZCBkb2VzIG5vdCBoYXZlIHNpemUgc2lnbmFsLCB0aGVuIGFwcGx5IGhlYWRlckJhbmRcbiAgICAgICAgICBiYW5kTWl4aW5zW2JhbmRUeXBlXSA9IGJhbmRNaXhpbnNbYmFuZFR5cGVdIHx8IHt9O1xuICAgICAgICAgIGJhbmRNaXhpbnNbYmFuZFR5cGVdW2NoYW5uZWxdID0gMC41O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYW5kTWl4aW5zO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0KCk6IFZnTGF5b3V0IHtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jaGFubmVsSGFzRmllbGQoJ2NvbHVtbicpID8gdGhpcy5jb2x1bW5EaXN0aW5jdFNpZ25hbCgpIDogMTtcblxuICAgIC8vIFRPRE86IGRldGVybWluZSBkZWZhdWx0IGFsaWduIGJhc2VkIG9uIHNoYXJlZCAvIGluZGVwZW5kZW50IHNjYWxlc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZGRpbmc6IHtyb3c6IDEwLCBjb2x1bW46IDEwfSxcbiAgICAgIC4uLnRoaXMuZ2V0TGF5b3V0QmFuZE1peGlucygnaGVhZGVyJyksXG4gICAgICAuLi50aGlzLmdldExheW91dEJhbmRNaXhpbnMoJ2Zvb3RlcicpLFxuXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IG9mZnNldCBmb3Igcm93SGVhZGVyL3Jvd0Zvb3Rlci9yb3dUaXRsZS9jb2x1bW5IZWFkZXIvY29sdW1uRm9vdGVyL2NvbHVtblRpdGxlXG4gICAgICBvZmZzZXQ6IDEwLFxuICAgICAgY29sdW1ucyxcbiAgICAgIGJvdW5kczogJ2Z1bGwnLFxuICAgICAgYWxpZ246ICdhbGwnXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxheW91dFNpZ25hbHMoKTogVmdTaWduYWxbXSB7XG4gICAgLy8gRklYTUUoaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8xMTkzKTogdGhpcyBjYW4gYmUgaW5jb3JyZWN0IGlmIHdlIGhhdmUgaW5kZXBlbmRlbnQgc2NhbGVzLlxuICAgIHJldHVybiB0aGlzLmNoaWxkLmFzc2VtYmxlTGF5b3V0U2lnbmFscygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb2x1bW5EaXN0aW5jdFNpZ25hbCgpIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgRmFjZXRNb2RlbCkpIHtcbiAgICAgIC8vIEZvciBuZXN0ZWQgZmFjZXQsIHdlIHdpbGwgYWRkIGNvbHVtbnMgdG8gZ3JvdXAgbWFyayBpbnN0ZWFkXG4gICAgICAvLyBTZWUgZGlzY3Vzc2lvbiBpbiBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhL2lzc3Vlcy85NTJcbiAgICAgIC8vIGFuZCBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLXZpZXcvcmVsZWFzZXMvdGFnL3YxLjIuNlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gZmFjZXROb2RlLmFzc2VtYmxlKCksIHRoZSBuYW1lIGlzIGFsd2F5cyB0aGlzLmdldE5hbWUoJ2NvbHVtbicpICsgJ19sYXlvdXQnLlxuICAgICAgY29uc3QgZmFjZXRMYXlvdXREYXRhTmFtZSA9IHRoaXMuZ2V0TmFtZSgnY29sdW1uX2RvbWFpbicpO1xuICAgICAgcmV0dXJuIHtzaWduYWw6IGBsZW5ndGgoZGF0YSgnJHtmYWNldExheW91dERhdGFOYW1lfScpKWB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUdyb3VwKHNpZ25hbHM6IFZnU2lnbmFsW10pIHtcbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgRmFjZXRNb2RlbCkpIHtcbiAgICAgIC8vIFByb3ZpZGUgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIGxheW91dC5cbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EvaXNzdWVzLzk1MlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2Etdmlldy9yZWxlYXNlcy90YWcvdjEuMi42XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi4odGhpcy5jaGFubmVsSGFzRmllbGQoJ2NvbHVtbicpID8ge1xuICAgICAgICAgIGVuY29kZToge1xuICAgICAgICAgICAgdXBkYXRlOiB7XG4gICAgICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yNzU5KTpcbiAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aGUgc2lnbmFsIGZvciBmYWNldCBvZiBjb25jYXQgb2YgZmFjZXRfY29sdW1uXG4gICAgICAgICAgICAgIGNvbHVtbnM6IHtmaWVsZDogdmdGaWVsZCh0aGlzLmZhY2V0LmNvbHVtbiwge3ByZWZpeDogJ2Rpc3RpbmN0J30pfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSA6IHt9KSxcbiAgICAgICAgLi4uc3VwZXIuYXNzZW1ibGVHcm91cChzaWduYWxzKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmFzc2VtYmxlR3JvdXAoc2lnbmFscyk7XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlIGNhcmRpbmFsaXR5IGZvciBjYWxjdWxhdGluZyBzaXplXG4gICAqL1xuICBwcml2YXRlIGdldENhcmRpbmFsaXR5QWdncmVnYXRlRm9yQ2hpbGQoKSB7XG4gICAgY29uc3QgZmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IG9wczogQWdncmVnYXRlT3BbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNoaWxkIGluc3RhbmNlb2YgRmFjZXRNb2RlbCkge1xuICAgICAgaWYgKHRoaXMuY2hpbGQuY2hhbm5lbEhhc0ZpZWxkKCdjb2x1bW4nKSkge1xuICAgICAgICBmaWVsZHMucHVzaCh2Z0ZpZWxkKHRoaXMuY2hpbGQuZmFjZXQuY29sdW1uKSk7XG4gICAgICAgIG9wcy5wdXNoKCdkaXN0aW5jdCcpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWyd4JywgJ3knXSBhcyBTY2FsZUNoYW5uZWxbXSkge1xuICAgICAgICBjb25zdCBjaGlsZFNjYWxlQ29tcG9uZW50ID0gdGhpcy5jaGlsZC5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdO1xuICAgICAgICBpZiAoY2hpbGRTY2FsZUNvbXBvbmVudCAmJiAhY2hpbGRTY2FsZUNvbXBvbmVudC5tZXJnZWQpIHtcbiAgICAgICAgICBjb25zdCB0eXBlID0gY2hpbGRTY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcbiAgICAgICAgICBjb25zdCByYW5nZSA9IGNoaWxkU2NhbGVDb21wb25lbnQuZ2V0KCdyYW5nZScpO1xuXG4gICAgICAgICAgaWYgKGhhc0Rpc2NyZXRlRG9tYWluKHR5cGUpICYmIGlzVmdSYW5nZVN0ZXAocmFuZ2UpKSB7XG4gICAgICAgICAgICBjb25zdCBkb21haW4gPSBhc3NlbWJsZURvbWFpbih0aGlzLmNoaWxkLCBjaGFubmVsKTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0RmllbGRGcm9tRG9tYWluKGRvbWFpbik7XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgICAgICBvcHMucHVzaCgnZGlzdGluY3QnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZy53YXJuKCdVbmtub3duIGZpZWxkIGZvciAke2NoYW5uZWx9LiAgQ2Fubm90IGNhbGN1bGF0ZSB2aWV3IHNpemUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHMubGVuZ3RoID8ge2ZpZWxkcywgb3BzfSA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZU1hcmtzKCk6IFZnTWFya0dyb3VwW10ge1xuICAgIGNvbnN0IHtjaGlsZCwgZmFjZXR9ID0gdGhpcztcbiAgICBjb25zdCBmYWNldFJvb3QgPSB0aGlzLmNvbXBvbmVudC5kYXRhLmZhY2V0Um9vdDtcbiAgICBjb25zdCBkYXRhID0gYXNzZW1ibGVGYWNldERhdGEoZmFjZXRSb290KTtcblxuICAgIC8vIElmIHdlIGZhY2V0IGJ5IHR3byBkaW1lbnNpb25zLCB3ZSBuZWVkIHRvIGFkZCBhIGNyb3NzIG9wZXJhdG9yIHRvIHRoZSBhZ2dyZWdhdGlvblxuICAgIC8vIHNvIHRoYXQgd2UgY3JlYXRlIGFsbCBncm91cHNcbiAgICBjb25zdCBoYXNSb3cgPSB0aGlzLmNoYW5uZWxIYXNGaWVsZChST1cpO1xuICAgIGNvbnN0IGhhc0NvbHVtbiA9IHRoaXMuY2hhbm5lbEhhc0ZpZWxkKENPTFVNTik7XG4gICAgY29uc3QgbGF5b3V0U2l6ZUVuY29kZUVudHJ5ID0gY2hpbGQuYXNzZW1ibGVMYXlvdXRTaXplKCk7XG5cbiAgICBjb25zdCBhZ2dyZWdhdGVNaXhpbnM6IGFueSA9IHt9O1xuICAgIGlmIChoYXNSb3cgJiYgaGFzQ29sdW1uKSB7XG4gICAgICBhZ2dyZWdhdGVNaXhpbnMuYWdncmVnYXRlID0ge2Nyb3NzOiB0cnVlfTtcbiAgICB9XG4gICAgY29uc3QgY2FyZGluYWxpdHlBZ2dyZWdhdGVGb3JDaGlsZCA9IHRoaXMuZ2V0Q2FyZGluYWxpdHlBZ2dyZWdhdGVGb3JDaGlsZCgpO1xuICAgIGlmIChjYXJkaW5hbGl0eUFnZ3JlZ2F0ZUZvckNoaWxkKSB7XG4gICAgICBhZ2dyZWdhdGVNaXhpbnMuYWdncmVnYXRlID0ge1xuICAgICAgICAuLi5hZ2dyZWdhdGVNaXhpbnMuYWdncmVnYXRlLFxuICAgICAgICAuLi5jYXJkaW5hbGl0eUFnZ3JlZ2F0ZUZvckNoaWxkXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlID0gY2hpbGQuYXNzZW1ibGVUaXRsZSgpO1xuICAgIGNvbnN0IHN0eWxlID0gY2hpbGQuYXNzZW1ibGVHcm91cFN0eWxlKCk7XG5cbiAgICBjb25zdCBtYXJrR3JvdXAgPSB7XG4gICAgICBuYW1lOiB0aGlzLmdldE5hbWUoJ2NlbGwnKSxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICAuLi4odGl0bGU/IHt0aXRsZX0gOiB7fSksXG4gICAgICAuLi4oc3R5bGU/IHtzdHlsZX0gOiB7fSksXG4gICAgICBmcm9tOiB7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgbmFtZTogZmFjZXRSb290Lm5hbWUsXG4gICAgICAgICAgZGF0YTogZmFjZXRSb290LmRhdGEsXG4gICAgICAgICAgZ3JvdXBieTogW10uY29uY2F0KFxuICAgICAgICAgICAgaGFzUm93ID8gW3RoaXMudmdGaWVsZChST1cpXSA6IFtdLFxuICAgICAgICAgICAgaGFzQ29sdW1uID8gW3RoaXMudmdGaWVsZChDT0xVTU4pXSA6IFtdXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5hZ2dyZWdhdGVNaXhpbnNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNvcnQ6IHtcbiAgICAgICAgZmllbGQ6IFtdLmNvbmNhdChcbiAgICAgICAgICBoYXNSb3cgPyBbdGhpcy52Z0ZpZWxkKFJPVywge2V4cHI6ICdkYXR1bScsfSldIDogW10sXG4gICAgICAgICAgaGFzQ29sdW1uID8gW3RoaXMudmdGaWVsZChDT0xVTU4sIHtleHByOiAnZGF0dW0nfSldIDogW11cbiAgICAgICAgKSxcbiAgICAgICAgb3JkZXI6IFtdLmNvbmNhdChcbiAgICAgICAgICBoYXNSb3cgPyBbIChmYWNldC5yb3cuc29ydCkgfHwgJ2FzY2VuZGluZyddIDogW10sXG4gICAgICAgICAgaGFzQ29sdW1uID8gWyAoZmFjZXQuY29sdW1uLnNvcnQpIHx8ICdhc2NlbmRpbmcnXSA6IFtdXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICAuLi4oZGF0YS5sZW5ndGggPiAwID8ge2RhdGE6IGRhdGF9IDoge30pLFxuICAgICAgLi4uKGxheW91dFNpemVFbmNvZGVFbnRyeSA/IHtlbmNvZGU6IHt1cGRhdGU6IGxheW91dFNpemVFbmNvZGVFbnRyeX19IDoge30pLFxuICAgICAgLi4uY2hpbGQuYXNzZW1ibGVHcm91cCgpXG4gICAgfTtcblxuICAgIHJldHVybiBbbWFya0dyb3VwXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZhY2V0O1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/layer.d.ts b/build/src/compile/layer.d.ts new file mode 100644 index 0000000000..05edcbac91 --- /dev/null +++ b/build/src/compile/layer.d.ts @@ -0,0 +1,23 @@ +import { Config } from '../config'; +import { LayoutSizeMixins, NormalizedLayerSpec } from '../spec'; +import { VgData, VgLayout, VgLegend, VgSignal, VgTitle } from '../vega.schema'; +import { Model } from './model'; +import { RepeaterValue } from './repeater'; +export declare class LayerModel extends Model { + readonly type: 'layer'; + readonly children: Model[]; + constructor(spec: NormalizedLayerSpec, parent: Model, parentGivenName: string, parentGivenSize: LayoutSizeMixins, repeater: RepeaterValue, config: Config, fit: boolean); + parseData(): void; + parseLayoutSize(): void; + parseSelection(): void; + parseMarkGroup(): void; + parseAxisAndHeader(): void; + assembleSelectionTopLevelSignals(signals: any[]): VgSignal[]; + assembleSelectionSignals(): VgSignal[]; + assembleLayoutSignals(): VgSignal[]; + assembleSelectionData(data: VgData[]): VgData[]; + assembleTitle(): VgTitle; + assembleLayout(): VgLayout; + assembleMarks(): any[]; + assembleLegends(): VgLegend[]; +} diff --git a/build/src/compile/layer.js b/build/src/compile/layer.js new file mode 100644 index 0000000000..58ad673101 --- /dev/null +++ b/build/src/compile/layer.js @@ -0,0 +1,117 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../log")); +var spec_1 = require("../spec"); +var util_1 = require("../util"); +var parse_1 = require("./axis/parse"); +var parse_2 = require("./data/parse"); +var assemble_1 = require("./layoutsize/assemble"); +var parse_3 = require("./layoutsize/parse"); +var assemble_2 = require("./legend/assemble"); +var model_1 = require("./model"); +var selection_1 = require("./selection/selection"); +var unit_1 = require("./unit"); +var LayerModel = /** @class */ (function (_super) { + tslib_1.__extends(LayerModel, _super); + function LayerModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'layer'; + var layoutSize = tslib_1.__assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {})); + _this.initSize(layoutSize); + _this.children = spec.layer.map(function (layer, i) { + if (spec_1.isLayerSpec(layer)) { + return new LayerModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit); + } + if (spec_1.isUnitSpec(layer)) { + return new unit_1.UnitModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit); + } + throw new Error(log.message.INVALID_SPEC); + }); + return _this; + } + LayerModel.prototype.parseData = function () { + this.component.data = parse_2.parseData(this); + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseData(); + } + }; + LayerModel.prototype.parseLayoutSize = function () { + parse_3.parseLayerLayoutSize(this); + }; + LayerModel.prototype.parseSelection = function () { + var _this = this; + // Merge selections up the hierarchy so that they may be referenced + // across unit specs. Persist their definitions within each child + // to assemble signals which remain within output Vega unit groups. + this.component.selection = {}; + var _loop_1 = function (child) { + child.parseSelection(); + util_1.keys(child.component.selection).forEach(function (key) { + _this.component.selection[key] = child.component.selection[key]; + }); + }; + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + }; + LayerModel.prototype.parseMarkGroup = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseMarkGroup(); + } + }; + LayerModel.prototype.parseAxisAndHeader = function () { + parse_1.parseLayerAxis(this); + }; + LayerModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals); + }; + // TODO: Support same named selections across children. + LayerModel.prototype.assembleSelectionSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleSelectionSignals()); + }, []); + }; + LayerModel.prototype.assembleLayoutSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleLayoutSignals()); + }, assemble_1.assembleLayoutSignals(this)); + }; + LayerModel.prototype.assembleSelectionData = function (data) { + return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data); + }; + LayerModel.prototype.assembleTitle = function () { + var title = _super.prototype.assembleTitle.call(this); + if (title) { + return title; + } + // If title does not provide layer, look into children + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + title = child.assembleTitle(); + if (title) { + return title; + } + } + return undefined; + }; + LayerModel.prototype.assembleLayout = function () { + return null; + }; + LayerModel.prototype.assembleMarks = function () { + return selection_1.assembleLayerSelectionMarks(this, util_1.flatten(this.children.map(function (child) { + return child.assembleMarks(); + }))); + }; + LayerModel.prototype.assembleLegends = function () { + return this.children.reduce(function (legends, child) { + return legends.concat(child.assembleLegends()); + }, assemble_2.assembleLegends(this)); + }; + return LayerModel; +}(model_1.Model)); +exports.LayerModel = LayerModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9sYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxrREFBOEI7QUFDOUIsZ0NBQXVGO0FBQ3ZGLGdDQUFzQztBQUV0QyxzQ0FBNEM7QUFDNUMsc0NBQXVDO0FBQ3ZDLGtEQUE0RDtBQUM1RCw0Q0FBd0Q7QUFDeEQsOENBQWtEO0FBQ2xELGlDQUE4QjtBQUU5QixtREFBa0U7QUFDbEUsK0JBQWlDO0FBR2pDO0lBQWdDLHNDQUFLO0lBU25DLG9CQUFZLElBQXlCLEVBQUUsTUFBYSxFQUFFLGVBQXVCLEVBQzNFLGVBQWlDLEVBQUUsUUFBdUIsRUFBRSxNQUFjLEVBQUUsR0FBWTtRQUQxRixZQUdFLGtCQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQXFCckU7UUFoQ2UsVUFBSSxHQUFZLE9BQU8sQ0FBQztRQWF0QyxJQUFNLFVBQVUsd0JBQ1gsZUFBZSxFQUNmLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdkMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUM5QyxDQUFDO1FBRUYsS0FBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUxQixLQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEMsSUFBSSxrQkFBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN0QixPQUFPLElBQUksVUFBVSxDQUFDLEtB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O1lBQ3pDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDLEVBQUUsMEJBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDSCxpQkFBQztBQUFELENBQUMsQUF6SEQsQ0FBZ0MsYUFBSyxHQXlIcEM7QUF6SFksZ0NBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtpc0xheWVyU3BlYywgaXNVbml0U3BlYywgTGF5b3V0U2l6ZU1peGlucywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge2ZsYXR0ZW4sIGtleXN9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0RhdGEsIFZnTGF5b3V0LCBWZ0xlZ2VuZCwgVmdTaWduYWwsIFZnVGl0bGV9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VMYXllckF4aXN9IGZyb20gJy4vYXhpcy9wYXJzZSc7XG5pbXBvcnQge3BhcnNlRGF0YX0gZnJvbSAnLi9kYXRhL3BhcnNlJztcbmltcG9ydCB7YXNzZW1ibGVMYXlvdXRTaWduYWxzfSBmcm9tICcuL2xheW91dHNpemUvYXNzZW1ibGUnO1xuaW1wb3J0IHtwYXJzZUxheWVyTGF5b3V0U2l6ZX0gZnJvbSAnLi9sYXlvdXRzaXplL3BhcnNlJztcbmltcG9ydCB7YXNzZW1ibGVMZWdlbmRzfSBmcm9tICcuL2xlZ2VuZC9hc3NlbWJsZSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5pbXBvcnQge2Fzc2VtYmxlTGF5ZXJTZWxlY3Rpb25NYXJrc30gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuL3VuaXQnO1xuXG5cbmV4cG9ydCBjbGFzcyBMYXllck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogJ2xheWVyJyA9ICdsYXllcic7XG5cbiAgLy8gSEFDSzogVGhpcyBzaG91bGQgYmUgKExheWVyTW9kZWwgfCBVbml0TW9kZWwpW10sIGJ1dCBzZXR0aW5nIHRoZSBjb3JyZWN0IHR5cGUgbGVhZHMgdG8gd2VpcmQgZXJyb3IuXG4gIC8vIFNvIEknbSBqdXN0IHB1dHRpbmcgZ2VuZXJpYyBNb2RlbCBmb3Igbm93LlxuICBwdWJsaWMgcmVhZG9ubHkgY2hpbGRyZW46IE1vZGVsW107XG5cblxuXG4gIGNvbnN0cnVjdG9yKHNwZWM6IE5vcm1hbGl6ZWRMYXllclNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLFxuICAgIHBhcmVudEdpdmVuU2l6ZTogTGF5b3V0U2l6ZU1peGlucywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnLCBmaXQ6IGJvb2xlYW4pIHtcblxuICAgIHN1cGVyKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCBjb25maWcsIHJlcGVhdGVyLCBzcGVjLnJlc29sdmUpO1xuXG4gICAgY29uc3QgbGF5b3V0U2l6ZSA9IHtcbiAgICAgIC4uLnBhcmVudEdpdmVuU2l6ZSxcbiAgICAgIC4uLihzcGVjLndpZHRoID8ge3dpZHRoOiBzcGVjLndpZHRofSA6IHt9KSxcbiAgICAgIC4uLihzcGVjLmhlaWdodCA/IHtoZWlnaHQ6IHNwZWMuaGVpZ2h0fSA6IHt9KVxuICAgIH07XG5cbiAgICB0aGlzLmluaXRTaXplKGxheW91dFNpemUpO1xuXG4gICAgdGhpcy5jaGlsZHJlbiA9IHNwZWMubGF5ZXIubWFwKChsYXllciwgaSkgPT4ge1xuICAgICAgaWYgKGlzTGF5ZXJTcGVjKGxheWVyKSkge1xuICAgICAgICByZXR1cm4gbmV3IExheWVyTW9kZWwobGF5ZXIsIHRoaXMsIHRoaXMuZ2V0TmFtZSgnbGF5ZXJfJytpKSwgbGF5b3V0U2l6ZSwgcmVwZWF0ZXIsIGNvbmZpZywgZml0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5pdFNwZWMobGF5ZXIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pdE1vZGVsKGxheWVyLCB0aGlzLCB0aGlzLmdldE5hbWUoJ2xheWVyXycraSksIGxheW91dFNpemUsIHJlcGVhdGVyLCBjb25maWcsIGZpdCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5JTlZBTElEX1NQRUMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhcnNlRGF0YSgpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0gcGFyc2VEYXRhKHRoaXMpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgY2hpbGQucGFyc2VEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhcnNlTGF5b3V0U2l6ZSgpIHtcbiAgICBwYXJzZUxheWVyTGF5b3V0U2l6ZSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVNlbGVjdGlvbigpIHtcbiAgICAvLyBNZXJnZSBzZWxlY3Rpb25zIHVwIHRoZSBoaWVyYXJjaHkgc28gdGhhdCB0aGV5IG1heSBiZSByZWZlcmVuY2VkXG4gICAgLy8gYWNyb3NzIHVuaXQgc3BlY3MuIFBlcnNpc3QgdGhlaXIgZGVmaW5pdGlvbnMgd2l0aGluIGVhY2ggY2hpbGRcbiAgICAvLyB0byBhc3NlbWJsZSBzaWduYWxzIHdoaWNoIHJlbWFpbiB3aXRoaW4gb3V0cHV0IFZlZ2EgdW5pdCBncm91cHMuXG4gICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uID0ge307XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZVNlbGVjdGlvbigpO1xuICAgICAga2V5cyhjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uW2tleV0gPSBjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VNYXJrR3JvdXAoKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZU1hcmtHcm91cCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUF4aXNBbmRIZWFkZXIoKSB7XG4gICAgcGFyc2VMYXllckF4aXModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNnLCBjaGlsZCkgPT4gY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2cpLCBzaWduYWxzKTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgc2FtZSBuYW1lZCBzZWxlY3Rpb25zIGFjcm9zcyBjaGlsZHJlbi5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNpZ25hbHMsIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCkpO1xuICAgIH0sIFtdKTtcbiAgfVxuXG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNpZ25hbHMsIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoY2hpbGQuYXNzZW1ibGVMYXlvdXRTaWduYWxzKCkpO1xuICAgIH0sIGFzc2VtYmxlTGF5b3V0U2lnbmFscyh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGE6IFZnRGF0YVtdKTogVmdEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgoZGIsIGNoaWxkKSA9PiBjaGlsZC5hc3NlbWJsZVNlbGVjdGlvbkRhdGEoZGIpLCBkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVRpdGxlKCk6IFZnVGl0bGUge1xuICAgIGxldCB0aXRsZSA9IHN1cGVyLmFzc2VtYmxlVGl0bGUoKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG4gICAgLy8gSWYgdGl0bGUgZG9lcyBub3QgcHJvdmlkZSBsYXllciwgbG9vayBpbnRvIGNoaWxkcmVuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aXRsZSA9IGNoaWxkLmFzc2VtYmxlVGl0bGUoKTtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICByZXR1cm4gdGl0bGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTWFya3MoKTogYW55W10ge1xuICAgIHJldHVybiBhc3NlbWJsZUxheWVyU2VsZWN0aW9uTWFya3ModGhpcywgZmxhdHRlbih0aGlzLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIHJldHVybiBjaGlsZC5hc3NlbWJsZU1hcmtzKCk7XG4gICAgfSkpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxlZ2VuZHMoKTogVmdMZWdlbmRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChsZWdlbmRzLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIGxlZ2VuZHMuY29uY2F0KGNoaWxkLmFzc2VtYmxlTGVnZW5kcygpKTtcbiAgICB9LCBhc3NlbWJsZUxlZ2VuZHModGhpcykpO1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/layout/header.d.ts b/build/src/compile/layout/header.d.ts new file mode 100644 index 0000000000..e55afe5483 --- /dev/null +++ b/build/src/compile/layout/header.d.ts @@ -0,0 +1,89 @@ +/** + * Utility for generating row / column headers + */ +import { FacetFieldDef } from '../../facet'; +import { AxisOrient, VgAxis, VgMarkGroup } from '../../vega.schema'; +import { Model } from '../model'; +export declare type HeaderChannel = 'row' | 'column'; +export declare const HEADER_CHANNELS: HeaderChannel[]; +export declare type HeaderType = 'header' | 'footer'; +export declare const HEADER_TYPES: HeaderType[]; +/** + * A component that represents all header, footers and title of a Vega group with layout directive. + */ +export interface LayoutHeaderComponent { + title?: string; + facetFieldDef?: FacetFieldDef; + /** + * An array of header components for headers. + * For facet, there should be only one header component, which is data-driven. + * For repeat and concat, there can be multiple header components that explicitly list different axes. + */ + header?: HeaderComponent[]; + /** + * An array of header components for footers. + * For facet, there should be only one header component, which is data-driven. + * For repeat and concat, there can be multiple header components that explicitly list different axes. + */ + footer?: HeaderComponent[]; +} +/** + * A component that represents one group of row/column-header/footer. + */ +export interface HeaderComponent { + labels: boolean; + sizeSignal: { + signal: string; + }; + axes: VgAxis[]; +} +export declare function getHeaderType(orient: AxisOrient): "header" | "footer"; +export declare function getTitleGroup(model: Model, channel: HeaderChannel): { + name: string; + role: string; + type: string; + marks: ({ + encode: { + update: { + angle: { + value: number; + }; + align: { + value: string; + }; + text: { + value: string; + }; + } | { + align: { + value: string; + }; + text: { + value: string; + }; + }; + }; + type: string; + role: string; + style: string; + } | { + type: string; + role: string; + style: string; + })[]; +}; +export declare function getHeaderGroups(model: Model, channel: HeaderChannel): VgMarkGroup[]; +export declare function labelAlign(angle: number): { + align?: undefined; +} | { + align: { + value: string; + }; +}; +export declare function labelBaseline(angle: number): { + baseline: { + value: string; + }; +} | { + baseline?: undefined; +}; diff --git a/build/src/compile/layout/header.js b/build/src/compile/layout/header.js new file mode 100644 index 0000000000..bf02e34692 --- /dev/null +++ b/build/src/compile/layout/header.js @@ -0,0 +1,100 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var fielddef_1 = require("../../fielddef"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +exports.HEADER_CHANNELS = ['row', 'column']; +exports.HEADER_TYPES = ['header', 'footer']; +function getHeaderType(orient) { + if (orient === 'top' || orient === 'left') { + return 'header'; + } + return 'footer'; +} +exports.getHeaderType = getHeaderType; +function getTitleGroup(model, channel) { + var title = model.component.layoutHeaders[channel].title; + var textOrient = channel === 'row' ? 'vertical' : undefined; + var update = tslib_1.__assign({ align: { value: 'center' }, text: { value: title } }, (textOrient === 'vertical' ? { angle: { value: 270 } } : {})); + return { + name: model.getName(channel + "_title"), + role: channel + "-title", + type: 'group', + marks: [tslib_1.__assign({ type: 'text', role: channel + "-title-text", style: 'guide-title' }, (util_1.keys(update).length > 0 ? { encode: { update: update } } : {}))] + }; +} +exports.getTitleGroup = getTitleGroup; +function getHeaderGroups(model, channel) { + var layoutHeader = model.component.layoutHeaders[channel]; + var groups = []; + for (var _i = 0, HEADER_TYPES_1 = exports.HEADER_TYPES; _i < HEADER_TYPES_1.length; _i++) { + var headerType = HEADER_TYPES_1[_i]; + if (layoutHeader[headerType]) { + for (var _a = 0, _b = layoutHeader[headerType]; _a < _b.length; _a++) { + var headerCmpt = _b[_a]; + groups.push(getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt)); + } + } + } + return groups; +} +exports.getHeaderGroups = getHeaderGroups; +// 0, (0,90), 90, (90, 180), 180, (180, 270), 270, (270, 0) +function labelAlign(angle) { + // to keep angle in [0, 360) + angle = ((angle % 360) + 360) % 360; + if ((angle + 90) % 180 === 0) { // for 90 and 270 + return {}; // default center + } + else if (angle < 90 || 270 < angle) { + return { align: { value: 'right' } }; + } + else if (135 <= angle && angle < 225) { + return { align: { value: 'left' } }; + } + return {}; +} +exports.labelAlign = labelAlign; +function labelBaseline(angle) { + // to keep angle in [0, 360) + angle = ((angle % 360) + 360) % 360; + if (45 <= angle && angle <= 135) { + return { baseline: { value: 'top' } }; + } + return {}; +} +exports.labelBaseline = labelBaseline; +function getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt) { + var _a; + if (headerCmpt) { + var title = null; + var facetFieldDef = layoutHeader.facetFieldDef; + if (facetFieldDef && headerCmpt.labels) { + var _b = facetFieldDef.header, header = _b === void 0 ? {} : _b; + var format = header.format, labelAngle = header.labelAngle; + var update = tslib_1.__assign({}, (labelAngle !== undefined ? { angle: { value: labelAngle } } : {}), labelAlign(labelAngle), labelBaseline(labelAngle)); + title = tslib_1.__assign({ text: common_1.formatSignalRef(facetFieldDef, format, 'parent', model.config), offset: 10, orient: channel === 'row' ? 'left' : 'top', style: 'guide-label' }, (util_1.keys(update).length > 0 ? { encode: { update: update } } : {})); + } + var axes = headerCmpt.axes; + var hasAxes = axes && axes.length > 0; + if (title || hasAxes) { + var sizeChannel = channel === 'row' ? 'height' : 'width'; + return tslib_1.__assign({ name: model.getName(channel + "_" + headerType), type: 'group', role: channel + "-" + headerType }, (layoutHeader.facetFieldDef ? { + from: { data: model.getName(channel + '_domain') }, + sort: { + field: fielddef_1.vgField(facetFieldDef, { expr: 'datum' }), + order: facetFieldDef.sort || 'ascending' + } + } : {}), (title ? { title: title } : {}), (headerCmpt.sizeSignal ? { + encode: { + update: (_a = {}, + _a[sizeChannel] = headerCmpt.sizeSignal, + _a) + } + } : {}), (hasAxes ? { axes: axes } : {})); + } + } + return null; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGF5b3V0L2hlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFJQSwyQ0FBdUM7QUFDdkMsbUNBQWdDO0FBRWhDLG9DQUEwQztBQUk3QixRQUFBLGVBQWUsR0FBb0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFHckQsUUFBQSxZQUFZLEdBQWlCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBd0MvRCx1QkFBOEIsTUFBa0I7SUFDOUMsSUFBSSxNQUFNLEtBQUssS0FBSyxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7UUFDekMsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBTEQsc0NBS0M7QUFFRCx1QkFBOEIsS0FBWSxFQUFFLE9BQXNCO0lBQ2hFLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMzRCxJQUFNLFVBQVUsR0FBRyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUU5RCxJQUFNLE1BQU0sc0JBQ1YsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUN4QixJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLElBQ2pCLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLEVBQUMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBRzNELENBQUM7SUFFRixPQUFPO1FBQ0wsSUFBSSxFQUFHLEtBQUssQ0FBQyxPQUFPLENBQUksT0FBTyxXQUFRLENBQUM7UUFDeEMsSUFBSSxFQUFLLE9BQU8sV0FB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QUksRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsRUFBQztnQkFDaEQsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxrQkFBTyxDQUFDLGFBQWEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQztvQkFDOUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJLElBQUksV0FBVztpQkFDekM7YUFDRixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDSixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLE9BQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdEIsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxFQUFFO29CQUNOLE1BQU07d0JBQ0osR0FBQyxXQUFXLElBQUcsVUFBVSxDQUFDLFVBQVU7MkJBQ3JDO2lCQUNGO2FBQ0YsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ0gsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxNQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzFCO1NBQ0g7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbGl0eSBmb3IgZ2VuZXJhdGluZyByb3cgLyBjb2x1bW4gaGVhZGVyc1xuICovXG5pbXBvcnQge0ZhY2V0RmllbGREZWZ9IGZyb20gJy4uLy4uL2ZhY2V0JztcbmltcG9ydCB7dmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7QXhpc09yaWVudCwgVmdBeGlzLCBWZ01hcmtHcm91cH0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtmb3JtYXRTaWduYWxSZWZ9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIEhlYWRlckNoYW5uZWwgPSAncm93JyB8ICdjb2x1bW4nO1xuZXhwb3J0IGNvbnN0IEhFQURFUl9DSEFOTkVMUzogSGVhZGVyQ2hhbm5lbFtdID0gWydyb3cnLCAnY29sdW1uJ107XG5cbmV4cG9ydCB0eXBlIEhlYWRlclR5cGUgPSAnaGVhZGVyJyB8ICdmb290ZXInO1xuZXhwb3J0IGNvbnN0IEhFQURFUl9UWVBFUzogSGVhZGVyVHlwZVtdID0gWydoZWFkZXInLCAnZm9vdGVyJ107XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCByZXByZXNlbnRzIGFsbCBoZWFkZXIsIGZvb3RlcnMgYW5kIHRpdGxlIG9mIGEgVmVnYSBncm91cCB3aXRoIGxheW91dCBkaXJlY3RpdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0SGVhZGVyQ29tcG9uZW50IHtcbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLy8gVE9ETzogcmVwZWF0IGFuZCBjb25jYXQgY2FuIGhhdmUgbXVsdGlwbGUgaGVhZGVyIC8gZm9vdGVyLlxuICAvLyBOZWVkIHRvIHJlZGVzaWduIHRoaXMgcGFydCBhIGJpdC5cblxuICBmYWNldEZpZWxkRGVmPzogRmFjZXRGaWVsZERlZjxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBoZWFkZXIgY29tcG9uZW50cyBmb3IgaGVhZGVycy5cbiAgICogRm9yIGZhY2V0LCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgaGVhZGVyIGNvbXBvbmVudCwgd2hpY2ggaXMgZGF0YS1kcml2ZW4uXG4gICAqIEZvciByZXBlYXQgYW5kIGNvbmNhdCwgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGhlYWRlciBjb21wb25lbnRzIHRoYXQgZXhwbGljaXRseSBsaXN0IGRpZmZlcmVudCBheGVzLlxuICAgKi9cbiAgaGVhZGVyPzogSGVhZGVyQ29tcG9uZW50W107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGhlYWRlciBjb21wb25lbnRzIGZvciBmb290ZXJzLlxuICAgKiBGb3IgZmFjZXQsIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBoZWFkZXIgY29tcG9uZW50LCB3aGljaCBpcyBkYXRhLWRyaXZlbi5cbiAgICogRm9yIHJlcGVhdCBhbmQgY29uY2F0LCB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgaGVhZGVyIGNvbXBvbmVudHMgdGhhdCBleHBsaWNpdGx5IGxpc3QgZGlmZmVyZW50IGF4ZXMuXG4gICAqL1xuICBmb290ZXI/OiBIZWFkZXJDb21wb25lbnRbXTtcbn1cblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0aGF0IHJlcHJlc2VudHMgb25lIGdyb3VwIG9mIHJvdy9jb2x1bW4taGVhZGVyL2Zvb3Rlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFkZXJDb21wb25lbnQge1xuXG4gIGxhYmVsczogYm9vbGVhbjtcblxuICBzaXplU2lnbmFsOiB7c2lnbmFsOiBzdHJpbmd9O1xuXG4gIGF4ZXM6IFZnQXhpc1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZGVyVHlwZShvcmllbnQ6IEF4aXNPcmllbnQpIHtcbiAgaWYgKG9yaWVudCA9PT0gJ3RvcCcgfHwgb3JpZW50ID09PSAnbGVmdCcpIHtcbiAgICByZXR1cm4gJ2hlYWRlcic7XG4gIH1cbiAgcmV0dXJuICdmb290ZXInO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGl0bGVHcm91cChtb2RlbDogTW9kZWwsIGNoYW5uZWw6IEhlYWRlckNoYW5uZWwpIHtcbiAgY29uc3QgdGl0bGUgPSBtb2RlbC5jb21wb25lbnQubGF5b3V0SGVhZGVyc1tjaGFubmVsXS50aXRsZTtcbiAgY29uc3QgdGV4dE9yaWVudCA9IGNoYW5uZWwgPT09ICdyb3cnID8gJ3ZlcnRpY2FsJyA6IHVuZGVmaW5lZDtcblxuICBjb25zdCB1cGRhdGUgPSB7XG4gICAgYWxpZ246IHt2YWx1ZTogJ2NlbnRlcid9LFxuICAgIHRleHQ6IHt2YWx1ZTogdGl0bGV9LFxuICAgIC4uLih0ZXh0T3JpZW50ID09PSAndmVydGljYWwnID8ge2FuZ2xlOiB7dmFsdWU6IDI3MH19OiB7fSksXG4gICAgLy8gVE9ETypodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI0NDYpOiBhZGQgdGl0bGUqIHByb3BlcnRpZXMgKGUuZy4sIHRpdGxlQWxpZ24pXG4gICAgLy8gYWxzbyBtYWtlIHN1cmUgdGhhdCBndWlkZS10aXRsZSBjb25maWcgb3ZlcnJpZGUgdGhlc2UgVmVnYS1saXRlIGRlZmF1bHRcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6ICBtb2RlbC5nZXROYW1lKGAke2NoYW5uZWx9X3RpdGxlYCksXG4gICAgcm9sZTogYCR7Y2hhbm5lbH0tdGl0bGVgLFxuICAgIHR5cGU6ICdncm91cCcsXG4gICAgbWFya3M6IFt7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICByb2xlOiBgJHtjaGFubmVsfS10aXRsZS10ZXh0YCxcbiAgICAgIHN0eWxlOiAnZ3VpZGUtdGl0bGUnLFxuICAgICAgLi4uKGtleXModXBkYXRlKS5sZW5ndGggPiAwID8ge2VuY29kZToge3VwZGF0ZX19IDoge30pXG4gICAgfV1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlckdyb3Vwcyhtb2RlbDogTW9kZWwsIGNoYW5uZWw6IEhlYWRlckNoYW5uZWwpOiBWZ01hcmtHcm91cFtdIHtcbiAgY29uc3QgbGF5b3V0SGVhZGVyID0gbW9kZWwuY29tcG9uZW50LmxheW91dEhlYWRlcnNbY2hhbm5lbF07XG4gIGNvbnN0IGdyb3VwcyA9IFtdO1xuICBmb3IgKGNvbnN0IGhlYWRlclR5cGUgb2YgSEVBREVSX1RZUEVTKSB7XG4gICAgaWYgKGxheW91dEhlYWRlcltoZWFkZXJUeXBlXSkge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXJDbXB0IG9mIGxheW91dEhlYWRlcltoZWFkZXJUeXBlXSkge1xuICAgICAgICBncm91cHMucHVzaChnZXRIZWFkZXJHcm91cChtb2RlbCwgY2hhbm5lbCwgaGVhZGVyVHlwZSwgbGF5b3V0SGVhZGVyLCBoZWFkZXJDbXB0KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBncm91cHM7XG59XG5cbi8vIDAsICgwLDkwKSwgOTAsICg5MCwgMTgwKSwgMTgwLCAoMTgwLCAyNzApLCAyNzAsICgyNzAsIDApXG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbEFsaWduKGFuZ2xlOiBudW1iZXIpIHtcbiAgLy8gdG8ga2VlcCBhbmdsZSBpbiBbMCwgMzYwKVxuICBhbmdsZSA9ICgoYW5nbGUgJSAzNjApICsgMzYwKSAlIDM2MDtcbiAgaWYgKChhbmdsZSArIDkwKSAlIDE4MCA9PT0gMCkgeyAgLy8gZm9yIDkwIGFuZCAyNzBcbiAgICByZXR1cm4ge307IC8vIGRlZmF1bHQgY2VudGVyXG4gIH0gZWxzZSBpZiAoYW5nbGUgPCA5MCB8fCAyNzAgPCBhbmdsZSkge1xuICAgIHJldHVybiB7YWxpZ246IHt2YWx1ZTogJ3JpZ2h0J319O1xuICB9IGVsc2UgaWYgKDEzNSA8PSBhbmdsZSAmJiBhbmdsZSA8IDIyNSkge1xuICAgIHJldHVybiB7YWxpZ246IHt2YWx1ZTogJ2xlZnQnfX07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxCYXNlbGluZShhbmdsZTogbnVtYmVyKSB7XG4gIC8vIHRvIGtlZXAgYW5nbGUgaW4gWzAsIDM2MClcbiAgYW5nbGUgPSAoKGFuZ2xlICUgMzYwKSArIDM2MCkgJSAzNjA7XG4gIGlmICg0NSA8PSBhbmdsZSAmJiBhbmdsZSA8PSAxMzUpIHtcbiAgICByZXR1cm4ge2Jhc2VsaW5lOiB7dmFsdWU6ICd0b3AnfX07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBnZXRIZWFkZXJHcm91cChtb2RlbDogTW9kZWwsIGNoYW5uZWw6IEhlYWRlckNoYW5uZWwsIGhlYWRlclR5cGU6IEhlYWRlclR5cGUsIGxheW91dEhlYWRlcjogTGF5b3V0SGVhZGVyQ29tcG9uZW50LCBoZWFkZXJDbXB0OiBIZWFkZXJDb21wb25lbnQpIHtcbiAgaWYgKGhlYWRlckNtcHQpIHtcbiAgICBsZXQgdGl0bGUgPSBudWxsO1xuICAgIGNvbnN0IHtmYWNldEZpZWxkRGVmfSA9IGxheW91dEhlYWRlcjtcbiAgICBpZiAoZmFjZXRGaWVsZERlZiAmJiBoZWFkZXJDbXB0LmxhYmVscykge1xuICAgICAgY29uc3Qge2hlYWRlciA9IHt9fSA9IGZhY2V0RmllbGREZWY7XG4gICAgICBjb25zdCB7Zm9ybWF0LCBsYWJlbEFuZ2xlfSA9IGhlYWRlcjtcblxuICAgICAgY29uc3QgdXBkYXRlID0ge1xuICAgICAgICAuLi4oXG4gICAgICAgICAgbGFiZWxBbmdsZSAhPT0gdW5kZWZpbmVkID8ge2FuZ2xlOiB7dmFsdWU6IGxhYmVsQW5nbGV9fSA6IHt9XG4gICAgICAgICksXG4gICAgICAgIC4uLmxhYmVsQWxpZ24obGFiZWxBbmdsZSksXG4gICAgICAgIC4uLmxhYmVsQmFzZWxpbmUobGFiZWxBbmdsZSlcblxuICAgICAgfTtcblxuICAgICAgdGl0bGUgPSB7XG4gICAgICAgIHRleHQ6IGZvcm1hdFNpZ25hbFJlZihmYWNldEZpZWxkRGVmLCBmb3JtYXQsICdwYXJlbnQnLCBtb2RlbC5jb25maWcpLFxuICAgICAgICBvZmZzZXQ6IDEwLFxuICAgICAgICBvcmllbnQ6IGNoYW5uZWwgPT09ICdyb3cnID8gJ2xlZnQnIDogJ3RvcCcsXG4gICAgICAgIHN0eWxlOiAnZ3VpZGUtbGFiZWwnLFxuICAgICAgICAuLi4oa2V5cyh1cGRhdGUpLmxlbmd0aCA+IDAgPyB7ZW5jb2RlOiB7dXBkYXRlfX0gOiB7fSlcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYXhlcyA9IGhlYWRlckNtcHQuYXhlcztcblxuICAgIGNvbnN0IGhhc0F4ZXMgPSBheGVzICYmIGF4ZXMubGVuZ3RoID4gMDtcbiAgICBpZiAodGl0bGUgfHwgaGFzQXhlcykge1xuICAgICAgY29uc3Qgc2l6ZUNoYW5uZWwgPSBjaGFubmVsID09PSAncm93JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbW9kZWwuZ2V0TmFtZShgJHtjaGFubmVsfV8ke2hlYWRlclR5cGV9YCksXG4gICAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICAgIHJvbGU6IGAke2NoYW5uZWx9LSR7aGVhZGVyVHlwZX1gLFxuICAgICAgICAuLi4obGF5b3V0SGVhZGVyLmZhY2V0RmllbGREZWYgPyB7XG4gICAgICAgICAgZnJvbToge2RhdGE6IG1vZGVsLmdldE5hbWUoY2hhbm5lbCArICdfZG9tYWluJyl9LFxuICAgICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICAgIGZpZWxkOiB2Z0ZpZWxkKGZhY2V0RmllbGREZWYsIHtleHByOiAnZGF0dW0nfSksXG4gICAgICAgICAgICBvcmRlcjogZmFjZXRGaWVsZERlZi5zb3J0IHx8ICdhc2NlbmRpbmcnXG4gICAgICAgICAgfVxuICAgICAgICB9IDoge30pLFxuICAgICAgICAuLi4odGl0bGUgPyB7dGl0bGV9IDoge30pLFxuICAgICAgICAuLi4oaGVhZGVyQ21wdC5zaXplU2lnbmFsID8ge1xuICAgICAgICAgIGVuY29kZToge1xuICAgICAgICAgICAgdXBkYXRlOiB7XG4gICAgICAgICAgICAgIFtzaXplQ2hhbm5lbF06IGhlYWRlckNtcHQuc2l6ZVNpZ25hbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfToge30pLFxuICAgICAgICAuLi4oaGFzQXhlcyA/IHtheGVzfSA6IHt9KVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/layoutsize/assemble.d.ts b/build/src/compile/layoutsize/assemble.d.ts new file mode 100644 index 0000000000..45fa2eedcb --- /dev/null +++ b/build/src/compile/layoutsize/assemble.d.ts @@ -0,0 +1,6 @@ +import { VgSignal } from '../../vega.schema'; +import { Model } from '../model'; +import { ScaleComponent } from '../scale/component'; +export declare function assembleLayoutSignals(model: Model): VgSignal[]; +export declare function sizeSignals(model: Model, sizeType: 'width' | 'height'): VgSignal[]; +export declare function sizeExpr(scaleName: string, scaleComponent: ScaleComponent, cardinality: string): string; diff --git a/build/src/compile/layoutsize/assemble.js b/build/src/compile/layoutsize/assemble.js new file mode 100644 index 0000000000..9c2d2b8598 --- /dev/null +++ b/build/src/compile/layoutsize/assemble.js @@ -0,0 +1,75 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var scale_1 = require("../../scale"); +var vega_schema_1 = require("../../vega.schema"); +var model_1 = require("../model"); +function assembleLayoutSignals(model) { + return [].concat(sizeSignals(model, 'width'), sizeSignals(model, 'height')); +} +exports.assembleLayoutSignals = assembleLayoutSignals; +function sizeSignals(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var size = model.component.layoutSize.get(sizeType); + if (!size || size === 'merged') { + return []; + } + // Read size signal name from name map, just in case it is the top-level size signal that got renamed. + var name = model.getSizeSignalRef(sizeType).signal; + if (size === 'range-step') { + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var type = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (scale_1.hasDiscreteDomain(type) && vega_schema_1.isVgRangeStep(range)) { + var scaleName = model.scaleName(channel); + if (model_1.isFacetModel(model.parent)) { + // If parent is facet and this is an independent scale, return only signal signal + // as the width/height will be calculated using the cardinality from + // facet's aggregate rather than reading from scale domain + var parentResolve = model.parent.component.resolve; + if (parentResolve.scale[channel] === 'independent') { + return [stepSignal(scaleName, range)]; + } + } + return [ + stepSignal(scaleName, range), + { + name: name, + update: sizeExpr(scaleName, scaleComponent, "domain('" + scaleName + "').length") + } + ]; + } + } + /* istanbul ignore next: Condition should not happen -- only for warning in development. */ + throw new Error('layout size is range step although there is no rangeStep.'); + } + else { + return [{ + name: name, + value: size + }]; + } +} +exports.sizeSignals = sizeSignals; +function stepSignal(scaleName, range) { + return { + name: scaleName + '_step', + value: range.step, + }; +} +function sizeExpr(scaleName, scaleComponent, cardinality) { + var type = scaleComponent.get('type'); + var padding = scaleComponent.get('padding'); + var paddingOuter = scaleComponent.get('paddingOuter'); + paddingOuter = paddingOuter !== undefined ? paddingOuter : padding; + var paddingInner = scaleComponent.get('paddingInner'); + paddingInner = type === 'band' ? + // only band has real paddingInner + (paddingInner !== undefined ? paddingInner : padding) : + // For point, as calculated in https://github.com/vega/vega-scale/blob/master/src/band.js#L128, + // it's equivalent to have paddingInner = 1 since there is only n-1 steps between n points. + 1; + return "bandspace(" + cardinality + ", " + paddingInner + ", " + paddingOuter + ") * " + scaleName + "_step"; +} +exports.sizeExpr = sizeExpr; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sYXlvdXRzaXplL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EscUNBQThDO0FBQzlDLGlEQUF1RTtBQUN2RSxrQ0FBNkM7QUFHN0MsK0JBQXNDLEtBQVk7SUFDaEQsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUNkLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQzNCLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQzdCLENBQUM7QUFDSixDQUFDO0FBTEQsc0RBS0M7QUFFRCxxQkFBNEIsS0FBWSxFQUFFLFFBQTRCO0lBQ3BFLElBQU0sT0FBTyxHQUFHLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pELElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RCxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDOUIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELHNHQUFzRztJQUN0RyxJQUFNLElBQUksR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRXJELElBQUksSUFBSSxLQUFLLFlBQVksRUFBRTtRQUN6QixJQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFeEQsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QyxJQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTFDLElBQUkseUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksMkJBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbkQsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFFM0MsSUFBSSxvQkFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDOUIsaUZBQWlGO29CQUNqRixvRUFBb0U7b0JBQ3BFLDBEQUEwRDtvQkFDMUQsSUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNyRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssYUFBYSxFQUFFO3dCQUNsRCxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUN2QztpQkFDRjtnQkFFRCxPQUFPO29CQUNMLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO29CQUM1Qjt3QkFDRSxJQUFJLE1BQUE7d0JBQ0osTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLGFBQVcsU0FBUyxjQUFXLENBQUM7cUJBQzdFO2lCQUNGLENBQUM7YUFDSDtTQUNGO1FBQ0QsMkZBQTJGO1FBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztLQUM5RTtTQUFNO1FBQ0wsT0FBTyxDQUFDO2dCQUNOLElBQUksTUFBQTtnQkFDSixLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQS9DRCxrQ0ErQ0M7QUFFRCxvQkFBb0IsU0FBaUIsRUFBRSxLQUFrQjtJQUN2RCxPQUFPO1FBQ0wsSUFBSSxFQUFFLFNBQVMsR0FBRyxPQUFPO1FBQ3pCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtLQUNsQixDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUF5QixTQUFpQixFQUFFLGNBQThCLEVBQUUsV0FBbUI7SUFDN0YsSUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxJQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEQsWUFBWSxHQUFHLFlBQVksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRW5FLElBQUksWUFBWSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEQsWUFBWSxHQUFHLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztRQUM5QixrQ0FBa0M7UUFDbEMsQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDdkQsK0ZBQStGO1FBQy9GLDJGQUEyRjtRQUMzRixDQUFDLENBQUM7SUFDSixPQUFPLGVBQWEsV0FBVyxVQUFLLFlBQVksVUFBSyxZQUFZLFlBQU8sU0FBUyxVQUFPLENBQUM7QUFDM0YsQ0FBQztBQWRELDRCQWNDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge2hhc0Rpc2NyZXRlRG9tYWlufSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFZnUmFuZ2VTdGVwLCBWZ1NpZ25hbH0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIE1vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50fSBmcm9tICcuLi9zY2FsZS9jb21wb25lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVMYXlvdXRTaWduYWxzKG1vZGVsOiBNb2RlbCk6IFZnU2lnbmFsW10ge1xuICByZXR1cm4gW10uY29uY2F0KFxuICAgIHNpemVTaWduYWxzKG1vZGVsLCAnd2lkdGgnKSxcbiAgICBzaXplU2lnbmFscyhtb2RlbCwgJ2hlaWdodCcpXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplU2lnbmFscyhtb2RlbDogTW9kZWwsIHNpemVUeXBlOiAnd2lkdGgnIHwgJ2hlaWdodCcpOiBWZ1NpZ25hbFtdIHtcbiAgY29uc3QgY2hhbm5lbCA9IHNpemVUeXBlID09PSAnd2lkdGgnID8gJ3gnIDogJ3knO1xuICBjb25zdCBzaXplID0gbW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuZ2V0KHNpemVUeXBlKTtcbiAgaWYgKCFzaXplIHx8IHNpemUgPT09ICdtZXJnZWQnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gUmVhZCBzaXplIHNpZ25hbCBuYW1lIGZyb20gbmFtZSBtYXAsIGp1c3QgaW4gY2FzZSBpdCBpcyB0aGUgdG9wLWxldmVsIHNpemUgc2lnbmFsIHRoYXQgZ290IHJlbmFtZWQuXG4gIGNvbnN0IG5hbWUgPSBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKHNpemVUeXBlKS5zaWduYWw7XG5cbiAgaWYgKHNpemUgPT09ICdyYW5nZS1zdGVwJykge1xuICAgIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG5cbiAgICBpZiAoc2NhbGVDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcbiAgICAgIGNvbnN0IHJhbmdlID0gc2NhbGVDb21wb25lbnQuZ2V0KCdyYW5nZScpO1xuXG4gICAgICBpZiAoaGFzRGlzY3JldGVEb21haW4odHlwZSkgJiYgaXNWZ1JhbmdlU3RlcChyYW5nZSkpIHtcbiAgICAgICAgY29uc3Qgc2NhbGVOYW1lID0gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuXG4gICAgICAgIGlmIChpc0ZhY2V0TW9kZWwobW9kZWwucGFyZW50KSkge1xuICAgICAgICAgIC8vIElmIHBhcmVudCBpcyBmYWNldCBhbmQgdGhpcyBpcyBhbiBpbmRlcGVuZGVudCBzY2FsZSwgcmV0dXJuIG9ubHkgc2lnbmFsIHNpZ25hbFxuICAgICAgICAgIC8vIGFzIHRoZSB3aWR0aC9oZWlnaHQgd2lsbCBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBjYXJkaW5hbGl0eSBmcm9tXG4gICAgICAgICAgLy8gZmFjZXQncyBhZ2dyZWdhdGUgcmF0aGVyIHRoYW4gcmVhZGluZyBmcm9tIHNjYWxlIGRvbWFpblxuICAgICAgICAgIGNvbnN0IHBhcmVudFJlc29sdmUgPSBtb2RlbC5wYXJlbnQuY29tcG9uZW50LnJlc29sdmU7XG4gICAgICAgICAgaWYgKHBhcmVudFJlc29sdmUuc2NhbGVbY2hhbm5lbF0gPT09ICdpbmRlcGVuZGVudCcpIHtcbiAgICAgICAgICAgIHJldHVybiBbc3RlcFNpZ25hbChzY2FsZU5hbWUsIHJhbmdlKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICBzdGVwU2lnbmFsKHNjYWxlTmFtZSwgcmFuZ2UpLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB1cGRhdGU6IHNpemVFeHByKHNjYWxlTmFtZSwgc2NhbGVDb21wb25lbnQsIGBkb21haW4oJyR7c2NhbGVOYW1lfScpLmxlbmd0aGApXG4gICAgICAgICAgfVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogQ29uZGl0aW9uIHNob3VsZCBub3QgaGFwcGVuIC0tIG9ubHkgZm9yIHdhcm5pbmcgaW4gZGV2ZWxvcG1lbnQuICovXG4gICAgdGhyb3cgbmV3IEVycm9yKCdsYXlvdXQgc2l6ZSBpcyByYW5nZSBzdGVwIGFsdGhvdWdoIHRoZXJlIGlzIG5vIHJhbmdlU3RlcC4nKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIG5hbWUsXG4gICAgICB2YWx1ZTogc2l6ZVxuICAgIH1dO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0ZXBTaWduYWwoc2NhbGVOYW1lOiBzdHJpbmcsIHJhbmdlOiBWZ1JhbmdlU3RlcCk6IFZnU2lnbmFsIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBzY2FsZU5hbWUgKyAnX3N0ZXAnLFxuICAgIHZhbHVlOiByYW5nZS5zdGVwLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUV4cHIoc2NhbGVOYW1lOiBzdHJpbmcsIHNjYWxlQ29tcG9uZW50OiBTY2FsZUNvbXBvbmVudCwgY2FyZGluYWxpdHk6IHN0cmluZykge1xuICBjb25zdCB0eXBlID0gc2NhbGVDb21wb25lbnQuZ2V0KCd0eXBlJyk7XG4gIGNvbnN0IHBhZGRpbmcgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3BhZGRpbmcnKTtcbiAgbGV0IHBhZGRpbmdPdXRlciA9IHNjYWxlQ29tcG9uZW50LmdldCgncGFkZGluZ091dGVyJyk7XG4gIHBhZGRpbmdPdXRlciA9IHBhZGRpbmdPdXRlciAhPT0gdW5kZWZpbmVkID8gcGFkZGluZ091dGVyIDogcGFkZGluZztcblxuICBsZXQgcGFkZGluZ0lubmVyID0gc2NhbGVDb21wb25lbnQuZ2V0KCdwYWRkaW5nSW5uZXInKTtcbiAgcGFkZGluZ0lubmVyID0gdHlwZSA9PT0gJ2JhbmQnID9cbiAgICAvLyBvbmx5IGJhbmQgaGFzIHJlYWwgcGFkZGluZ0lubmVyXG4gICAgKHBhZGRpbmdJbm5lciAhPT0gdW5kZWZpbmVkID8gcGFkZGluZ0lubmVyIDogcGFkZGluZykgOlxuICAgIC8vIEZvciBwb2ludCwgYXMgY2FsY3VsYXRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLXNjYWxlL2Jsb2IvbWFzdGVyL3NyYy9iYW5kLmpzI0wxMjgsXG4gICAgLy8gaXQncyBlcXVpdmFsZW50IHRvIGhhdmUgcGFkZGluZ0lubmVyID0gMSBzaW5jZSB0aGVyZSBpcyBvbmx5IG4tMSBzdGVwcyBiZXR3ZWVuIG4gcG9pbnRzLlxuICAgIDE7XG4gIHJldHVybiBgYmFuZHNwYWNlKCR7Y2FyZGluYWxpdHl9LCAke3BhZGRpbmdJbm5lcn0sICR7cGFkZGluZ091dGVyfSkgKiAke3NjYWxlTmFtZX1fc3RlcGA7XG59XG5cblxuIl19 \ No newline at end of file diff --git a/build/src/compile/layoutsize/component.d.ts b/build/src/compile/layoutsize/component.d.ts new file mode 100644 index 0000000000..eaeae294ec --- /dev/null +++ b/build/src/compile/layoutsize/component.d.ts @@ -0,0 +1,7 @@ +import { Split } from '../split'; +export declare type LayoutSize = number | 'range-step' | 'merged'; +export interface LayoutSizeIndex { + width?: LayoutSize; + height?: LayoutSize; +} +export declare type LayoutSizeComponent = Split; diff --git a/build/src/compile/layoutsize/component.js b/build/src/compile/layoutsize/component.js new file mode 100644 index 0000000000..b0195aae69 --- /dev/null +++ b/build/src/compile/layoutsize/component.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGF5b3V0c2l6ZS9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3BsaXR9IGZyb20gJy4uL3NwbGl0JztcblxuZXhwb3J0IHR5cGUgTGF5b3V0U2l6ZSA9IG51bWJlciB8ICdyYW5nZS1zdGVwJyB8ICdtZXJnZWQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFNpemVJbmRleCB7XG4gIHdpZHRoPzogTGF5b3V0U2l6ZTtcbiAgaGVpZ2h0PzogTGF5b3V0U2l6ZTtcbn1cblxuZXhwb3J0IHR5cGUgTGF5b3V0U2l6ZUNvbXBvbmVudCA9IFNwbGl0PExheW91dFNpemVJbmRleD47XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/layoutsize/parse.d.ts b/build/src/compile/layoutsize/parse.d.ts new file mode 100644 index 0000000000..59db26ea9e --- /dev/null +++ b/build/src/compile/layoutsize/parse.d.ts @@ -0,0 +1,8 @@ +import { ConcatModel } from '../concat'; +import { Model } from '../model'; +import { UnitModel } from '../unit'; +export declare function parseLayerLayoutSize(model: Model): void; +export declare const parseRepeatLayoutSize: typeof parseLayerLayoutSize; +export declare function parseConcatLayoutSize(model: ConcatModel): void; +export declare function parseChildrenLayoutSize(model: Model): void; +export declare function parseUnitLayoutSize(model: UnitModel): void; diff --git a/build/src/compile/layoutsize/parse.js b/build/src/compile/layoutsize/parse.js new file mode 100644 index 0000000000..f432dae9df --- /dev/null +++ b/build/src/compile/layoutsize/parse.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var scale_1 = require("../../scale"); +var vega_schema_1 = require("../../vega.schema"); +var split_1 = require("../split"); +function parseLayerLayoutSize(model) { + parseChildrenLayoutSize(model); + var layoutSizeCmpt = model.component.layoutSize; + layoutSizeCmpt.setWithExplicit('width', parseNonUnitLayoutSizeForChannel(model, 'width')); + layoutSizeCmpt.setWithExplicit('height', parseNonUnitLayoutSizeForChannel(model, 'height')); +} +exports.parseLayerLayoutSize = parseLayerLayoutSize; +exports.parseRepeatLayoutSize = parseLayerLayoutSize; +function parseConcatLayoutSize(model) { + parseChildrenLayoutSize(model); + var layoutSizeCmpt = model.component.layoutSize; + var sizeTypeToMerge = model.isVConcat ? 'width' : 'height'; + layoutSizeCmpt.setWithExplicit(sizeTypeToMerge, parseNonUnitLayoutSizeForChannel(model, sizeTypeToMerge)); +} +exports.parseConcatLayoutSize = parseConcatLayoutSize; +function parseChildrenLayoutSize(model) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseLayoutSize(); + } +} +exports.parseChildrenLayoutSize = parseChildrenLayoutSize; +function parseNonUnitLayoutSizeForChannel(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var resolve = model.component.resolve; + var mergedSize; + // Try to merge layout size + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childSize = child.component.layoutSize.getWithExplicit(sizeType); + var scaleResolve = resolve.scale[channel]; + if (scaleResolve === 'independent' && childSize.value === 'range-step') { + // Do not merge independent scales with range-step as their size depends + // on the scale domains, which can be different between scales. + mergedSize = undefined; + break; + } + if (mergedSize) { + if (scaleResolve === 'independent' && mergedSize.value !== childSize.value) { + // For independent scale, only merge if all the sizes are the same. + // If the values are different, abandon the merge! + mergedSize = undefined; + break; + } + mergedSize = split_1.mergeValuesWithExplicit(mergedSize, childSize, sizeType, ''); + } + else { + mergedSize = childSize; + } + } + if (mergedSize) { + // If merged, rename size and set size of all children. + for (var _b = 0, _c = model.children; _b < _c.length; _b++) { + var child = _c[_b]; + model.renameLayoutSize(child.getName(sizeType), model.getName(sizeType)); + child.component.layoutSize.set(sizeType, 'merged', false); + } + return mergedSize; + } + else { + // Otherwise, there is no merged size. + return { + explicit: false, + value: undefined + }; + } +} +function parseUnitLayoutSize(model) { + var layoutSizeComponent = model.component.layoutSize; + if (!layoutSizeComponent.explicit.width) { + var width = defaultUnitSize(model, 'width'); + layoutSizeComponent.set('width', width, false); + } + if (!layoutSizeComponent.explicit.height) { + var height = defaultUnitSize(model, 'height'); + layoutSizeComponent.set('height', height, false); + } +} +exports.parseUnitLayoutSize = parseUnitLayoutSize; +function defaultUnitSize(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var config = model.config; + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (scale_1.hasDiscreteDomain(scaleType) && vega_schema_1.isVgRangeStep(range)) { + // For discrete domain with range.step, use dynamic width/height + return 'range-step'; + } + else { + return config.view[sizeType]; + } + } + else if (model.hasProjection) { + return config.view[sizeType]; + } + else { + // No scale - set default size + if (sizeType === 'width' && model.mark === 'text') { + // width for text mark without x-field is a bit wider than typical range step + return config.scale.textXRangeStep; + } + // Set width/height equal to rangeStep config or if rangeStep is null, use value from default scale config. + return config.scale.rangeStep || scale_1.defaultScaleConfig.rangeStep; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sYXlvdXRzaXplL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEscUNBQWtFO0FBQ2xFLGlEQUFnRDtBQUdoRCxrQ0FBMkQ7QUFJM0QsOEJBQXFDLEtBQVk7SUFDL0MsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0IsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDbEQsY0FBYyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUYsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQU5ELG9EQU1DO0FBRVksUUFBQSxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztBQUUxRCwrQkFBc0MsS0FBa0I7SUFDdEQsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFFbEQsSUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDN0QsY0FBYyxDQUFDLGVBQWUsQ0FBQyxlQUFlLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUM7QUFDNUcsQ0FBQztBQU5ELHNEQU1DO0FBRUQsaUNBQXdDLEtBQVk7SUFDbEQsS0FBb0IsVUFBYyxFQUFkLEtBQUEsS0FBSyxDQUFDLFFBQVEsRUFBZCxjQUFjLEVBQWQsSUFBYyxFQUFFO1FBQS9CLElBQU0sS0FBSyxTQUFBO1FBQ2QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFD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QUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUNqRCxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV4RCxJQUFJLGNBQWMsRUFBRTtRQUNsQixJQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLElBQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUMsSUFBSSx5QkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSwyQkFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hELGdFQUFnRTtZQUNoRSxPQUFPLFlBQVksQ0FBQztTQUNyQjthQUFNO1lBQ0wsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzlCO0tBQ0Y7U0FBTSxJQUFJLEtBQUssQ0FBQyxhQUFhLEVBQUU7UUFDOUIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQzlCO1NBQU07UUFDTCw4QkFBOEI7UUFDOUIsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ2pELDZFQUE2RTtZQUM3RSxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1NBQ3BDO1FBRUQsMkdBQTJHO1FBQzNHLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksMEJBQWtCLENBQUMsU0FBUyxDQUFDO0tBQy9EO0FBRUgsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZGVmYXVsdFNjYWxlQ29uZmlnLCBoYXNEaXNjcmV0ZURvbWFpbn0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0NvbmNhdE1vZGVsfSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtFeHBsaWNpdCwgbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TGF5b3V0U2l6ZSwgTGF5b3V0U2l6ZUluZGV4fSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyTGF5b3V0U2l6ZShtb2RlbDogTW9kZWwpIHtcbiAgcGFyc2VDaGlsZHJlbkxheW91dFNpemUobW9kZWwpO1xuXG4gIGNvbnN0IGxheW91dFNpemVDbXB0ID0gbW9kZWwuY29tcG9uZW50LmxheW91dFNpemU7XG4gIGxheW91dFNpemVDbXB0LnNldFdpdGhFeHBsaWNpdCgnd2lkdGgnLCBwYXJzZU5vblVuaXRMYXlvdXRTaXplRm9yQ2hhbm5lbChtb2RlbCwgJ3dpZHRoJykpO1xuICBsYXlvdXRTaXplQ21wdC5zZXRXaXRoRXhwbGljaXQoJ2hlaWdodCcsIHBhcnNlTm9uVW5pdExheW91dFNpemVGb3JDaGFubmVsKG1vZGVsLCAnaGVpZ2h0JykpO1xufVxuXG5leHBvcnQgY29uc3QgcGFyc2VSZXBlYXRMYXlvdXRTaXplID0gcGFyc2VMYXllckxheW91dFNpemU7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNvbmNhdExheW91dFNpemUobW9kZWw6IENvbmNhdE1vZGVsKSB7XG4gIHBhcnNlQ2hpbGRyZW5MYXlvdXRTaXplKG1vZGVsKTtcbiAgY29uc3QgbGF5b3V0U2l6ZUNtcHQgPSBtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZTtcblxuICBjb25zdCBzaXplVHlwZVRvTWVyZ2UgPSBtb2RlbC5pc1ZDb25jYXQgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gIGxheW91dFNpemVDbXB0LnNldFdpdGhFeHBsaWNpdChzaXplVHlwZVRvTWVyZ2UsIHBhcnNlTm9uVW5pdExheW91dFNpemVGb3JDaGFubmVsKG1vZGVsLCBzaXplVHlwZVRvTWVyZ2UpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2hpbGRyZW5MYXlvdXRTaXplKG1vZGVsOiBNb2RlbCkge1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgY2hpbGQucGFyc2VMYXlvdXRTaXplKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0TGF5b3V0U2l6ZUZvckNoYW5uZWwobW9kZWw6IE1vZGVsLCBzaXplVHlwZTogJ3dpZHRoJyB8ICdoZWlnaHQnKTogRXhwbGljaXQ8TGF5b3V0U2l6ZT4ge1xuICBjb25zdCBjaGFubmVsID0gc2l6ZVR5cGUgPT09ICd3aWR0aCcgPyAneCcgOiAneSc7XG4gIGNvbnN0IHJlc29sdmUgPSBtb2RlbC5jb21wb25lbnQucmVzb2x2ZTtcblxuICBsZXQgbWVyZ2VkU2l6ZTogRXhwbGljaXQ8TGF5b3V0U2l6ZT47XG4gIC8vIFRyeSB0byBtZXJnZSBsYXlvdXQgc2l6ZVxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgY29uc3QgY2hpbGRTaXplID0gY2hpbGQuY29tcG9uZW50LmxheW91dFNpemUuZ2V0V2l0aEV4cGxpY2l0KHNpemVUeXBlKTtcbiAgICBjb25zdCBzY2FsZVJlc29sdmUgPSByZXNvbHZlLnNjYWxlW2NoYW5uZWxdO1xuICAgIGlmIChzY2FsZVJlc29sdmUgPT09ICdpbmRlcGVuZGVudCcgJiYgY2hpbGRTaXplLnZhbHVlID09PSAncmFuZ2Utc3RlcCcpIHtcbiAgICAgIC8vIERvIG5vdCBtZXJnZSBpbmRlcGVuZGVudCBzY2FsZXMgd2l0aCByYW5nZS1zdGVwIGFzIHRoZWlyIHNpemUgZGVwZW5kc1xuICAgICAgLy8gb24gdGhlIHNjYWxlIGRvbWFpbnMsIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgYmV0d2VlbiBzY2FsZXMuXG4gICAgICBtZXJnZWRTaXplID0gdW5kZWZpbmVkO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG1lcmdlZFNpemUpIHtcbiAgICAgIGlmIChzY2FsZVJlc29sdmUgPT09ICdpbmRlcGVuZGVudCcgJiYgbWVyZ2VkU2l6ZS52YWx1ZSAhPT0gY2hpbGRTaXplLnZhbHVlKSB7XG4gICAgICAgIC8vIEZvciBpbmRlcGVuZGVudCBzY2FsZSwgb25seSBtZXJnZSBpZiBhbGwgdGhlIHNpemVzIGFyZSB0aGUgc2FtZS5cbiAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50LCBhYmFuZG9uIHRoZSBtZXJnZSFcbiAgICAgICAgbWVyZ2VkU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBtZXJnZWRTaXplID0gbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQ8TGF5b3V0U2l6ZUluZGV4LCBMYXlvdXRTaXplPihcbiAgICAgICAgbWVyZ2VkU2l6ZSwgY2hpbGRTaXplLCBzaXplVHlwZSwgJydcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFNpemUgPSBjaGlsZFNpemU7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1lcmdlZFNpemUpIHtcbiAgICAvLyBJZiBtZXJnZWQsIHJlbmFtZSBzaXplIGFuZCBzZXQgc2l6ZSBvZiBhbGwgY2hpbGRyZW4uXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgICAgbW9kZWwucmVuYW1lTGF5b3V0U2l6ZShjaGlsZC5nZXROYW1lKHNpemVUeXBlKSwgbW9kZWwuZ2V0TmFtZShzaXplVHlwZSkpO1xuICAgICAgY2hpbGQuY29tcG9uZW50LmxheW91dFNpemUuc2V0KHNpemVUeXBlLCAnbWVyZ2VkJywgZmFsc2UpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkU2l6ZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBPdGhlcndpc2UsIHRoZXJlIGlzIG5vIG1lcmdlZCBzaXplLlxuICAgIHJldHVybiB7XG4gICAgICBleHBsaWNpdDogZmFsc2UsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVbml0TGF5b3V0U2l6ZShtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IGxheW91dFNpemVDb21wb25lbnQgPSBtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZTtcbiAgaWYgKCFsYXlvdXRTaXplQ29tcG9uZW50LmV4cGxpY2l0LndpZHRoKSB7XG4gICAgY29uc3Qgd2lkdGggPSBkZWZhdWx0VW5pdFNpemUobW9kZWwsICd3aWR0aCcpO1xuICAgIGxheW91dFNpemVDb21wb25lbnQuc2V0KCd3aWR0aCcsIHdpZHRoLCBmYWxzZSk7XG4gIH1cblxuICBpZiAoIWxheW91dFNpemVDb21wb25lbnQuZXhwbGljaXQuaGVpZ2h0KSB7XG4gICAgY29uc3QgaGVpZ2h0ID0gZGVmYXVsdFVuaXRTaXplKG1vZGVsLCAnaGVpZ2h0Jyk7XG4gICAgbGF5b3V0U2l6ZUNvbXBvbmVudC5zZXQoJ2hlaWdodCcsIGhlaWdodCwgZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRVbml0U2l6ZShtb2RlbDogVW5pdE1vZGVsLCBzaXplVHlwZTogJ3dpZHRoJyB8ICdoZWlnaHQnKTogTGF5b3V0U2l6ZSB7XG4gIGNvbnN0IGNoYW5uZWwgPSBzaXplVHlwZSA9PT0gJ3dpZHRoJyA/ICd4JyA6ICd5JztcbiAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnO1xuICBjb25zdCBzY2FsZUNvbXBvbmVudCA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpO1xuXG4gIGlmIChzY2FsZUNvbXBvbmVudCkge1xuICAgIGNvbnN0IHNjYWxlVHlwZSA9IHNjYWxlQ29tcG9uZW50LmdldCgndHlwZScpO1xuICAgIGNvbnN0IHJhbmdlID0gc2NhbGVDb21wb25lbnQuZ2V0KCdyYW5nZScpO1xuXG4gICAgaWYgKGhhc0Rpc2NyZXRlRG9tYWluKHNjYWxlVHlwZSkgJiYgaXNWZ1JhbmdlU3RlcChyYW5nZSkpIHtcbiAgICAgIC8vIEZvciBkaXNjcmV0ZSBkb21haW4gd2l0aCByYW5nZS5zdGVwLCB1c2UgZHluYW1pYyB3aWR0aC9oZWlnaHRcbiAgICAgIHJldHVybiAncmFuZ2Utc3RlcCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb25maWcudmlld1tzaXplVHlwZV07XG4gICAgfVxuICB9IGVsc2UgaWYgKG1vZGVsLmhhc1Byb2plY3Rpb24pIHtcbiAgICByZXR1cm4gY29uZmlnLnZpZXdbc2l6ZVR5cGVdO1xuICB9IGVsc2Uge1xuICAgIC8vIE5vIHNjYWxlIC0gc2V0IGRlZmF1bHQgc2l6ZVxuICAgIGlmIChzaXplVHlwZSA9PT0gJ3dpZHRoJyAmJiBtb2RlbC5tYXJrID09PSAndGV4dCcpIHtcbiAgICAgIC8vIHdpZHRoIGZvciB0ZXh0IG1hcmsgd2l0aG91dCB4LWZpZWxkIGlzIGEgYml0IHdpZGVyIHRoYW4gdHlwaWNhbCByYW5nZSBzdGVwXG4gICAgICByZXR1cm4gY29uZmlnLnNjYWxlLnRleHRYUmFuZ2VTdGVwO1xuICAgIH1cblxuICAgIC8vIFNldCB3aWR0aC9oZWlnaHQgZXF1YWwgdG8gcmFuZ2VTdGVwIGNvbmZpZyBvciBpZiByYW5nZVN0ZXAgaXMgbnVsbCwgdXNlIHZhbHVlIGZyb20gZGVmYXVsdCBzY2FsZSBjb25maWcuXG4gICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXAgfHwgZGVmYXVsdFNjYWxlQ29uZmlnLnJhbmdlU3RlcDtcbiAgfVxuXG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/legend/assemble.d.ts b/build/src/compile/legend/assemble.d.ts new file mode 100644 index 0000000000..8da565fcf9 --- /dev/null +++ b/build/src/compile/legend/assemble.d.ts @@ -0,0 +1,3 @@ +import { VgLegend } from '../../vega.schema'; +import { Model } from '../model'; +export declare function assembleLegends(model: Model): VgLegend[]; diff --git a/build/src/compile/legend/assemble.js b/build/src/compile/legend/assemble.js new file mode 100644 index 0000000000..745976a68d --- /dev/null +++ b/build/src/compile/legend/assemble.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var util_1 = require("../../util"); +var parse_1 = require("./parse"); +function assembleLegends(model) { + var legendComponentIndex = model.component.legends; + var legendByDomain = {}; + for (var _i = 0, _a = util_1.keys(legendComponentIndex); _i < _a.length; _i++) { + var channel = _a[_i]; + var scaleComponent = model.getScaleComponent(channel); + var domainHash = util_1.stringify(scaleComponent.domains); + if (legendByDomain[domainHash]) { + for (var _b = 0, _c = legendByDomain[domainHash]; _b < _c.length; _b++) { + var mergedLegendComponent = _c[_b]; + var merged = parse_1.mergeLegendComponent(mergedLegendComponent, legendComponentIndex[channel]); + if (!merged) { + // If cannot merge, need to add this legend separately + legendByDomain[domainHash].push(legendComponentIndex[channel]); + } + } + } + else { + legendByDomain[domainHash] = [legendComponentIndex[channel].clone()]; + } + } + return util_1.flatten(util_1.vals(legendByDomain)).map(function (legendCmpt) { return legendCmpt.combine(); }); +} +exports.assembleLegends = assembleLegends; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sZWdlbmQvYXNzZW1ibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxtQ0FBMEQ7QUFJMUQsaUNBQTZDO0FBRTdDLHlCQUFnQyxLQUFZO0lBQzFDLElBQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7SUFDckQsSUFBTSxjQUFjLEdBQThDLEVBQUUsQ0FBQztJQUVyRSxLQUFzQixVQUEwQixFQUExQixLQUFBLFdBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUExQixjQUEwQixFQUExQixJQUEwQixFQUFFO1FBQTdDLElBQU0sT0FBTyxTQUFBO1FBQ2hCLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFNLFVBQVUsR0FBRyxnQkFBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM5QixLQUFvQyxVQUEwQixFQUExQixLQUFBLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBMUIsY0FBMEIsRUFBMUIsSUFBMEIsRUFBRTtnQkFBM0QsSUFBTSxxQkFBcUIsU0FBQTtnQkFDOUIsSUFBTSxNQUFNLEdBQUcsNEJBQW9CLENBQUMscUJBQXFCLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCxzREFBc0Q7b0JBQ3RELGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtTQUVGO2FBQU07WUFDTCxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO0tBQ0Y7SUFFRCxPQUFPLGNBQU8sQ0FBQyxXQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxVQUEyQixJQUFLLE9BQUEsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFwQixDQUFvQixDQUFDLENBQUM7QUFDbEcsQ0FBQztBQXRCRCwwQ0FzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2ZsYXR0ZW4sIGtleXMsIHN0cmluZ2lmeSwgdmFsc30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnTGVnZW5kfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge0xlZ2VuZENvbXBvbmVudH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHttZXJnZUxlZ2VuZENvbXBvbmVudH0gZnJvbSAnLi9wYXJzZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUxlZ2VuZHMobW9kZWw6IE1vZGVsKTogVmdMZWdlbmRbXSB7XG4gIGNvbnN0IGxlZ2VuZENvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LmxlZ2VuZHM7XG4gIGNvbnN0IGxlZ2VuZEJ5RG9tYWluOiB7W2RvbWFpbkhhc2g6IHN0cmluZ106IExlZ2VuZENvbXBvbmVudFtdfSA9IHt9O1xuXG4gIGZvciAoY29uc3QgY2hhbm5lbCBvZiBrZXlzKGxlZ2VuZENvbXBvbmVudEluZGV4KSkge1xuICAgIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gICAgY29uc3QgZG9tYWluSGFzaCA9IHN0cmluZ2lmeShzY2FsZUNvbXBvbmVudC5kb21haW5zKTtcbiAgICBpZiAobGVnZW5kQnlEb21haW5bZG9tYWluSGFzaF0pIHtcbiAgICAgIGZvciAoY29uc3QgbWVyZ2VkTGVnZW5kQ29tcG9uZW50IG9mIGxlZ2VuZEJ5RG9tYWluW2RvbWFpbkhhc2hdKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlTGVnZW5kQ29tcG9uZW50KG1lcmdlZExlZ2VuZENvbXBvbmVudCwgbGVnZW5kQ29tcG9uZW50SW5kZXhbY2hhbm5lbF0pO1xuICAgICAgICBpZiAoIW1lcmdlZCkge1xuICAgICAgICAgIC8vIElmIGNhbm5vdCBtZXJnZSwgbmVlZCB0byBhZGQgdGhpcyBsZWdlbmQgc2VwYXJhdGVseVxuICAgICAgICAgIGxlZ2VuZEJ5RG9tYWluW2RvbWFpbkhhc2hdLnB1c2gobGVnZW5kQ29tcG9uZW50SW5kZXhbY2hhbm5lbF0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbGVnZW5kQnlEb21haW5bZG9tYWluSGFzaF0gPSBbbGVnZW5kQ29tcG9uZW50SW5kZXhbY2hhbm5lbF0uY2xvbmUoKV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW4odmFscyhsZWdlbmRCeURvbWFpbikpLm1hcCgobGVnZW5kQ21wdDogTGVnZW5kQ29tcG9uZW50KSA9PiBsZWdlbmRDbXB0LmNvbWJpbmUoKSk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/legend/component.d.ts b/build/src/compile/legend/component.d.ts new file mode 100644 index 0000000000..dece1d8075 --- /dev/null +++ b/build/src/compile/legend/component.d.ts @@ -0,0 +1,12 @@ +import { Legend } from '../..//legend'; +import { NonPositionScaleChannel } from '../../channel'; +import { VgLegend } from '../../vega.schema'; +import { Split } from '../split'; +export declare class LegendComponent extends Split { +} +export declare type LegendComponentIndex = { + [P in NonPositionScaleChannel]?: LegendComponent; +}; +export declare type LegendIndex = { + [P in NonPositionScaleChannel]?: Legend; +}; diff --git a/build/src/compile/legend/component.js b/build/src/compile/legend/component.js new file mode 100644 index 0000000000..a243fb260f --- /dev/null +++ b/build/src/compile/legend/component.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var split_1 = require("../split"); +var LegendComponent = /** @class */ (function (_super) { + tslib_1.__extends(LegendComponent, _super); + function LegendComponent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return LegendComponent; +}(split_1.Split)); +exports.LegendComponent = LegendComponent; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxrQ0FBK0I7QUFHL0I7SUFBcUMsMkNBQWU7SUFBcEQ7O0lBQXNELENBQUM7SUFBRCxzQkFBQztBQUFELENBQUMsQUFBdkQsQ0FBcUMsYUFBSyxHQUFhO0FBQTFDLDBDQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMZWdlbmR9IGZyb20gJy4uLy4uLy9sZWdlbmQnO1xuaW1wb3J0IHtOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge1ZnTGVnZW5kfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1NwbGl0fSBmcm9tICcuLi9zcGxpdCc7XG5cblxuZXhwb3J0IGNsYXNzIExlZ2VuZENvbXBvbmVudCBleHRlbmRzIFNwbGl0PFZnTGVnZW5kPiB7fVxuXG4vLyBVc2luZyBNYXBwZWQgVHlwZSB0byBkZWNsYXJlIHR5cGUgKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2FkdmFuY2VkLXR5cGVzLmh0bWwjbWFwcGVkLXR5cGVzKVxuZXhwb3J0IHR5cGUgTGVnZW5kQ29tcG9uZW50SW5kZXggPSB7W1AgaW4gTm9uUG9zaXRpb25TY2FsZUNoYW5uZWxdPzogTGVnZW5kQ29tcG9uZW50fTtcblxuZXhwb3J0IHR5cGUgTGVnZW5kSW5kZXggPSB7W1AgaW4gTm9uUG9zaXRpb25TY2FsZUNoYW5uZWxdPzogTGVnZW5kfTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/legend/encode.d.ts b/build/src/compile/legend/encode.d.ts new file mode 100644 index 0000000000..35cd84a725 --- /dev/null +++ b/build/src/compile/legend/encode.d.ts @@ -0,0 +1,7 @@ +import { Channel, NonPositionScaleChannel } from '../../channel'; +import { FieldDef } from '../../fielddef'; +import { LegendType, VgEncodeEntry } from '../../vega.schema'; +import { UnitModel } from '../unit'; +export declare function symbols(fieldDef: FieldDef, symbolsSpec: any, model: UnitModel, channel: Channel, type: LegendType): VgEncodeEntry; +export declare function gradient(fieldDef: FieldDef, gradientSpec: any, model: UnitModel, channel: Channel, type: LegendType): any; +export declare function labels(fieldDef: FieldDef, labelsSpec: any, model: UnitModel, channel: NonPositionScaleChannel, type: LegendType): any; diff --git a/build/src/compile/legend/encode.js b/build/src/compile/legend/encode.js new file mode 100644 index 0000000000..17a1da6aef --- /dev/null +++ b/build/src/compile/legend/encode.js @@ -0,0 +1,132 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var mark_1 = require("../../mark"); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var mixins = tslib_1.__importStar(require("../mark/mixins")); +function symbols(fieldDef, symbolsSpec, model, channel, type) { + if (type === 'gradient') { + return undefined; + } + var out = tslib_1.__assign({}, common_1.applyMarkConfig({}, model, mark_1.FILL_STROKE_CONFIG), mixins.color(model)); + switch (model.mark) { + case mark_1.BAR: + case mark_1.TICK: + case mark_1.TEXT: + out.shape = { value: 'square' }; + break; + case mark_1.CIRCLE: + case mark_1.SQUARE: + out.shape = { value: model.mark }; + break; + case mark_1.POINT: + case mark_1.LINE: + case mark_1.GEOSHAPE: + case mark_1.AREA: + // use default circle + break; + } + var markDef = model.markDef, encoding = model.encoding; + var filled = markDef.filled; + if (out.fill) { + // for fill legend, we don't want any fill in symbol + if (channel === 'fill' || (filled && channel === channel_1.COLOR)) { + delete out.fill; + } + else { + if (out.fill['field']) { + // For others, remove fill field + delete out.fill; + } + else if (vega_util_1.isArray(out.fill)) { + var fill = getFirstConditionValue(encoding.fill || encoding.color) || markDef.fill || (filled && markDef.color); + if (fill) { + out.fill = { value: fill }; + } + } + } + } + if (out.stroke) { + if (channel === 'stroke' || (!filled && channel === channel_1.COLOR)) { + delete out.stroke; + } + else { + if (out.stroke['field']) { + // For others, remove stroke field + delete out.stroke; + } + else if (vega_util_1.isArray(out.stroke)) { + var stroke = getFirstConditionValue(encoding.stroke || encoding.color) || markDef.stroke || (!filled && markDef.color); + if (stroke) { + out.stroke = { value: stroke }; + } + } + } + } + if (out.fill && out.fill['value'] !== 'transparent' && !out.stroke) { + // for non color channel's legend, we need to override symbol stroke config from Vega config + out.stroke = { value: 'transparent' }; + } + if (channel !== channel_1.SHAPE) { + var shape = getFirstConditionValue(encoding.shape) || markDef.shape; + if (shape) { + out.shape = { value: shape }; + } + } + if (channel !== channel_1.OPACITY) { + var opacity = getMaxValue(encoding.opacity) || markDef.opacity; + if (opacity) { // only apply opacity if it is neither zero or undefined + out.opacity = { value: opacity }; + } + } + out = tslib_1.__assign({}, out, symbolsSpec); + return util_1.keys(out).length > 0 ? out : undefined; +} +exports.symbols = symbols; +function gradient(fieldDef, gradientSpec, model, channel, type) { + var out = {}; + if (type === 'gradient') { + var opacity = getMaxValue(model.encoding.opacity) || model.markDef.opacity; + if (opacity) { // only apply opacity if it is neither zero or undefined + out.opacity = { value: opacity }; + } + } + out = tslib_1.__assign({}, out, gradientSpec); + return util_1.keys(out).length > 0 ? out : undefined; +} +exports.gradient = gradient; +function labels(fieldDef, labelsSpec, model, channel, type) { + var legend = model.legend(channel); + var config = model.config; + var out = {}; + if (fielddef_1.isTimeFieldDef(fieldDef)) { + var isUTCScale = model.getScaleComponent(channel).get('type') === scale_1.ScaleType.UTC; + var expr = common_1.timeFormatExpression('datum.value', fieldDef.timeUnit, legend.format, config.legend.shortTimeLabels, config.timeFormat, isUTCScale); + labelsSpec = tslib_1.__assign({}, (expr ? { text: { signal: expr } } : {}), labelsSpec); + } + out = tslib_1.__assign({}, out, labelsSpec); + return util_1.keys(out).length > 0 ? out : undefined; +} +exports.labels = labels; +function getMaxValue(channelDef) { + return getConditionValue(channelDef, function (v, conditionalDef) { return Math.max(v, conditionalDef.value); }); +} +function getFirstConditionValue(channelDef) { + return getConditionValue(channelDef, function (v, conditionalDef) { return v !== undefined ? v : conditionalDef.value; }); +} +function getConditionValue(channelDef, reducer) { + if (fielddef_1.hasConditionalValueDef(channelDef)) { + return (vega_util_1.isArray(channelDef.condition) ? channelDef.condition : [channelDef.condition]) + .reduce(reducer, channelDef.value); + } + else if (fielddef_1.isValueDef(channelDef)) { + return channelDef.value; + } + return undefined; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL2VuY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBa0M7QUFFbEMseUNBQXNGO0FBQ3RGLDJDQVV3QjtBQUN4QixtQ0FBNEc7QUFDNUcscUNBQXNDO0FBQ3RDLG1DQUFnQztBQUVoQyxvQ0FBZ0U7QUFDaEUsNkRBQXlDO0FBR3pDLGlCQUF3QixRQUEwQixFQUFFLFdBQWdCLEVBQUUsS0FBZ0IsRUFBRSxPQUFnQixFQUFFLElBQWdCO0lBQ3hILElBQUksSUFBSSxLQUFLLFVBQVUsRUFBRTtRQUN2QixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELElBQUksR0FBRyx3QkFDRix3QkFBZSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUseUJBQWtCLENBQUMsRUFDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDdkIsQ0FBQztJQUVGLFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNsQixLQUFLLFVBQUcsQ0FBQztRQUNULEtBQUssV0FBSSxDQUFDO1FBQ1YsS0FBSyxXQUFJO1lBQ1AsR0FBRyxDQUFDLEtBQUssR0FBRyxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQztZQUM5QixNQUFNO1FBQ1IsS0FBSyxhQUFNLENBQUM7UUFDWixLQUFLLGFBQU07WUFDVCxHQUFHLENBQUMsS0FBSyxHQUFHLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUMsQ0FBQztZQUNoQyxNQUFNO1FBQ1IsS0FBSyxZQUFLLENBQUM7UUFDWCxLQUFLLFdBQUksQ0FBQztRQUNWLEtBQUssZUFBUSxDQUFDO1FBQ2QsS0FBSyxXQUFJO1lBQ1AscUJBQXFCO1lBQ3JCLE1BQU07S0FDVDtJQUVNLElBQUEsdUJBQU8sRUFBRSx5QkFBUSxDQUFVO0lBQ2xDLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENB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Q0FBQzthQUNuRixNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFZLENBQUMsQ0FBQztLQUM3QztTQUFNLElBQUkscUJBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqQyxPQUFPLFVBQVUsQ0FBQyxLQUFZLENBQUM7S0FDaEM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0NoYW5uZWwsIENPTE9SLCBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCwgT1BBQ0lUWSwgU0hBUEV9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uYWwsXG4gIEZpZWxkRGVmLFxuICBGaWVsZERlZldpdGhDb25kaXRpb24sXG4gIGhhc0NvbmRpdGlvbmFsVmFsdWVEZWYsXG4gIGlzVGltZUZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBNYXJrUHJvcEZpZWxkRGVmLFxuICBWYWx1ZURlZixcbiAgVmFsdWVEZWZXaXRoQ29uZGl0aW9uLFxufSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0FSRUEsIEJBUiwgQ0lSQ0xFLCBGSUxMX1NUUk9LRV9DT05GSUcsIEdFT1NIQVBFLCBMSU5FLCBQT0lOVCwgU1FVQVJFLCBURVhULCBUSUNLfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtMZWdlbmRUeXBlLCBWZ0VuY29kZUVudHJ5fSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2FwcGx5TWFya0NvbmZpZywgdGltZUZvcm1hdEV4cHJlc3Npb259IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi4vbWFyay9taXhpbnMnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3ltYm9scyhmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc3ltYm9sc1NwZWM6IGFueSwgbW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogQ2hhbm5lbCwgdHlwZTogTGVnZW5kVHlwZSk6IFZnRW5jb2RlRW50cnkge1xuICBpZiAodHlwZSA9PT0gJ2dyYWRpZW50Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgb3V0ID0ge1xuICAgIC4uLmFwcGx5TWFya0NvbmZpZyh7fSwgbW9kZWwsIEZJTExfU1RST0tFX0NPTkZJRyksXG4gICAgLi4ubWl4aW5zLmNvbG9yKG1vZGVsKVxuICB9O1xuXG4gIHN3aXRjaCAobW9kZWwubWFyaykge1xuICAgIGNhc2UgQkFSOlxuICAgIGNhc2UgVElDSzpcbiAgICBjYXNlIFRFWFQ6XG4gICAgICBvdXQuc2hhcGUgPSB7dmFsdWU6ICdzcXVhcmUnfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ0lSQ0xFOlxuICAgIGNhc2UgU1FVQVJFOlxuICAgICAgb3V0LnNoYXBlID0ge3ZhbHVlOiBtb2RlbC5tYXJrfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUE9JTlQ6XG4gICAgY2FzZSBMSU5FOlxuICAgIGNhc2UgR0VPU0hBUEU6XG4gICAgY2FzZSBBUkVBOlxuICAgICAgLy8gdXNlIGRlZmF1bHQgY2lyY2xlXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IHttYXJrRGVmLCBlbmNvZGluZ30gPSBtb2RlbDtcbiAgY29uc3QgZmlsbGVkID0gbWFya0RlZi5maWxsZWQ7XG5cbiAgaWYgKG91dC5maWxsKSB7XG4gICAgLy8gZm9yIGZpbGwgbGVnZW5kLCB3ZSBkb24ndCB3YW50IGFueSBmaWxsIGluIHN5bWJvbFxuICAgIGlmIChjaGFubmVsID09PSAnZmlsbCcgfHwgKGZpbGxlZCAmJiBjaGFubmVsID09PSBDT0xPUikpIHtcbiAgICAgIGRlbGV0ZSBvdXQuZmlsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG91dC5maWxsWydmaWVsZCddKSB7XG4gICAgICAgIC8vIEZvciBvdGhlcnMsIHJlbW92ZSBmaWxsIGZpZWxkXG4gICAgICAgIGRlbGV0ZSBvdXQuZmlsbDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvdXQuZmlsbCkpIHtcbiAgICAgICAgY29uc3QgZmlsbCA9IGdldEZpcnN0Q29uZGl0aW9uVmFsdWUoZW5jb2RpbmcuZmlsbCB8fCBlbmNvZGluZy5jb2xvcikgfHwgbWFya0RlZi5maWxsIHx8IChmaWxsZWQgJiYgbWFya0RlZi5jb2xvcik7XG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgb3V0LmZpbGwgPSB7dmFsdWU6IGZpbGx9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dC5zdHJva2UpIHtcbiAgICBpZiAoY2hhbm5lbCA9PT0gJ3N0cm9rZScgfHwgKCFmaWxsZWQgJiYgY2hhbm5lbCA9PT0gQ09MT1IpKSB7XG4gICAgICBkZWxldGUgb3V0LnN0cm9rZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG91dC5zdHJva2VbJ2ZpZWxkJ10pIHtcbiAgICAgICAgLy8gRm9yIG90aGVycywgcmVtb3ZlIHN0cm9rZSBmaWVsZFxuICAgICAgICBkZWxldGUgb3V0LnN0cm9rZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvdXQuc3Ryb2tlKSkge1xuICAgICAgICBjb25zdCBzdHJva2UgPSBnZXRGaXJzdENvbmRpdGlvblZhbHVlKGVuY29kaW5nLnN0cm9rZSB8fCBlbmNvZGluZy5jb2xvcikgfHwgbWFya0RlZi5zdHJva2UgfHwgKCFmaWxsZWQgJiYgbWFya0RlZi5jb2xvcik7XG4gICAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgICBvdXQuc3Ryb2tlID0ge3ZhbHVlOiBzdHJva2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dC5maWxsICYmIG91dC5maWxsWyd2YWx1ZSddICE9PSAndHJhbnNwYXJlbnQnICYmICFvdXQuc3Ryb2tlKSB7XG4gICAgLy8gZm9yIG5vbiBjb2xvciBjaGFubmVsJ3MgbGVnZW5kLCB3ZSBuZWVkIHRvIG92ZXJyaWRlIHN5bWJvbCBzdHJva2UgY29uZmlnIGZyb20gVmVnYSBjb25maWdcbiAgICBvdXQuc3Ryb2tlID0ge3ZhbHVlOiAndHJhbnNwYXJlbnQnfTtcbiAgfVxuXG4gIGlmIChjaGFubmVsICE9PSBTSEFQRSkge1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0Rmlyc3RDb25kaXRpb25WYWx1ZShlbmNvZGluZy5zaGFwZSkgfHwgbWFya0RlZi5zaGFwZTtcbiAgICBpZiAoc2hhcGUpIHtcbiAgICAgIG91dC5zaGFwZSA9IHt2YWx1ZTogc2hhcGV9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFubmVsICE9PSBPUEFDSVRZKSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGdldE1heFZhbHVlKGVuY29kaW5nLm9wYWNpdHkpIHx8IG1hcmtEZWYub3BhY2l0eTtcbiAgICBpZiAob3BhY2l0eSkgeyAvLyBvbmx5IGFwcGx5IG9wYWNpdHkgaWYgaXQgaXMgbmVpdGhlciB6ZXJvIG9yIHVuZGVmaW5lZFxuICAgICAgb3V0Lm9wYWNpdHkgPSB7dmFsdWU6IG9wYWNpdHl9O1xuICAgIH1cbiAgfVxuXG4gIG91dCA9IHsuLi5vdXQsIC4uLnN5bWJvbHNTcGVjfTtcblxuICByZXR1cm4ga2V5cyhvdXQpLmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmFkaWVudChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgZ3JhZGllbnRTcGVjOiBhbnksIG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IExlZ2VuZFR5cGUpIHtcbiAgbGV0IG91dDogYW55ID0ge307XG5cbiAgaWYgKHR5cGUgPT09ICdncmFkaWVudCcpIHtcbiAgICBjb25zdCBvcGFjaXR5ID0gZ2V0TWF4VmFsdWUobW9kZWwuZW5jb2Rpbmcub3BhY2l0eSkgfHwgbW9kZWwubWFya0RlZi5vcGFjaXR5O1xuICAgIGlmIChvcGFjaXR5KSB7IC8vIG9ubHkgYXBwbHkgb3BhY2l0eSBpZiBpdCBpcyBuZWl0aGVyIHplcm8gb3IgdW5kZWZpbmVkXG4gICAgICBvdXQub3BhY2l0eSA9IHt2YWx1ZTogb3BhY2l0eX07XG4gICAgfVxuICB9XG5cbiAgb3V0ID0gey4uLm91dCwgLi4uZ3JhZGllbnRTcGVjfTtcbiAgcmV0dXJuIGtleXMob3V0KS5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxzKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBsYWJlbHNTcGVjOiBhbnksIG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsLCB0eXBlOiBMZWdlbmRUeXBlKSB7XG4gIGNvbnN0IGxlZ2VuZCA9IG1vZGVsLmxlZ2VuZChjaGFubmVsKTtcbiAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnO1xuXG4gIGxldCBvdXQ6IGFueSA9IHt9O1xuXG4gIGlmIChpc1RpbWVGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICBjb25zdCBpc1VUQ1NjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJykgPT09IFNjYWxlVHlwZS5VVEM7XG4gICAgY29uc3QgZXhwciA9IHRpbWVGb3JtYXRFeHByZXNzaW9uKCdkYXR1bS52YWx1ZScsIGZpZWxkRGVmLnRpbWVVbml0LCBsZWdlbmQuZm9ybWF0LCBjb25maWcubGVnZW5kLnNob3J0VGltZUxhYmVscywgY29uZmlnLnRpbWVGb3JtYXQsIGlzVVRDU2NhbGUpO1xuICAgIGxhYmVsc1NwZWMgPSB7XG4gICAgICAuLi4oZXhwciA/IHt0ZXh0OiB7c2lnbmFsOiBleHByfX0gOiB7fSksXG4gICAgICAuLi5sYWJlbHNTcGVjLFxuICAgIH07XG4gIH1cblxuICBvdXQgPSB7Li4ub3V0LCAuLi5sYWJlbHNTcGVjfTtcblxuICByZXR1cm4ga2V5cyhvdXQpLmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldE1heFZhbHVlKGNoYW5uZWxEZWY6IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8c3RyaW5nPj4pIHtcbiAgcmV0dXJuIGdldENvbmRpdGlvblZhbHVlKGNoYW5uZWxEZWYsXG4gICAgKHY6IG51bWJlciwgY29uZGl0aW9uYWxEZWYpID0+IE1hdGgubWF4KHYsIGNvbmRpdGlvbmFsRGVmLnZhbHVlIGFzIGFueSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmlyc3RDb25kaXRpb25WYWx1ZShjaGFubmVsRGVmOiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxzdHJpbmc+PiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+KSB7XG4gIHJldHVybiBnZXRDb25kaXRpb25WYWx1ZShjaGFubmVsRGVmLFxuICAgICh2OiBudW1iZXIsIGNvbmRpdGlvbmFsRGVmKSA9PiB2ICE9PSB1bmRlZmluZWQgPyB2IDogY29uZGl0aW9uYWxEZWYudmFsdWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZGl0aW9uVmFsdWU8VD4oXG4gIGNoYW5uZWxEZWY6IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8c3RyaW5nPj4sXG4gIHJlZHVjZXI6ICh2YWw6IFQsIGNvbmRpdGlvbmFsRGVmOiBDb25kaXRpb25hbDxWYWx1ZURlZj4pID0+IFRcbik6IFQge1xuXG4gIGlmIChoYXNDb25kaXRpb25hbFZhbHVlRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgcmV0dXJuIChpc0FycmF5KGNoYW5uZWxEZWYuY29uZGl0aW9uKSA/IGNoYW5uZWxEZWYuY29uZGl0aW9uIDogW2NoYW5uZWxEZWYuY29uZGl0aW9uXSlcbiAgICAgIC5yZWR1Y2UocmVkdWNlciwgY2hhbm5lbERlZi52YWx1ZSBhcyBhbnkpO1xuICB9IGVsc2UgaWYgKGlzVmFsdWVEZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gY2hhbm5lbERlZi52YWx1ZSBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/legend/parse.d.ts b/build/src/compile/legend/parse.d.ts new file mode 100644 index 0000000000..02ab7678f3 --- /dev/null +++ b/build/src/compile/legend/parse.d.ts @@ -0,0 +1,7 @@ +import { NonPositionScaleChannel } from '../../channel'; +import { Model } from '../model'; +import { UnitModel } from '../unit'; +import { LegendComponent } from './component'; +export declare function parseLegend(model: Model): void; +export declare function parseLegendForChannel(model: UnitModel, channel: NonPositionScaleChannel): LegendComponent; +export declare function mergeLegendComponent(mergedLegend: LegendComponent, childLegend: LegendComponent): LegendComponent; diff --git a/build/src/compile/legend/parse.js b/build/src/compile/legend/parse.js new file mode 100644 index 0000000000..987d9e7611 --- /dev/null +++ b/build/src/compile/legend/parse.js @@ -0,0 +1,190 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var legend_1 = require("../../legend"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var model_1 = require("../model"); +var resolve_1 = require("../resolve"); +var split_1 = require("../split"); +var component_1 = require("./component"); +var encode = tslib_1.__importStar(require("./encode")); +var properties = tslib_1.__importStar(require("./properties")); +function parseLegend(model) { + if (model_1.isUnitModel(model)) { + model.component.legends = parseUnitLegend(model); + } + else { + model.component.legends = parseNonUnitLegend(model); + } +} +exports.parseLegend = parseLegend; +function parseUnitLegend(model) { + var encoding = model.encoding; + return [channel_1.COLOR, channel_1.FILL, channel_1.STROKE, channel_1.SIZE, channel_1.SHAPE, channel_1.OPACITY].reduce(function (legendComponent, channel) { + var def = encoding[channel]; + if (model.legend(channel) && model.getScaleComponent(channel) && !(fielddef_1.isFieldDef(def) && (channel === channel_1.SHAPE && def.type === type_1.GEOJSON))) { + legendComponent[channel] = parseLegendForChannel(model, channel); + } + return legendComponent; + }, {}); +} +function getLegendDefWithScale(model, channel) { + var _a; + // For binned field with continuous scale, use a special scale so we can overrride the mark props and labels + switch (channel) { + case channel_1.COLOR: + var scale = model.scaleName(channel_1.COLOR); + return model.markDef.filled ? { fill: scale } : { stroke: scale }; + case channel_1.FILL: + case channel_1.STROKE: + case channel_1.SIZE: + case channel_1.SHAPE: + case channel_1.OPACITY: + return _a = {}, _a[channel] = model.scaleName(channel), _a; + } +} +function parseLegendForChannel(model, channel) { + var fieldDef = model.fieldDef(channel); + var legend = model.legend(channel); + var legendCmpt = new component_1.LegendComponent({}, getLegendDefWithScale(model, channel)); + legend_1.LEGEND_PROPERTIES.forEach(function (property) { + var value = getProperty(property, legend, channel, model); + if (value !== undefined) { + var explicit = + // specified legend.values is already respected, but may get transformed. + property === 'values' ? !!legend.values : + // title can be explicit if fieldDef.title is set + property === 'title' && value === model.fieldDef(channel).title ? true : + // Otherwise, things are explicit if the returned value matches the specified property + value === legend[property]; + if (explicit || model.config.legend[property] === undefined) { + legendCmpt.set(property, value, explicit); + } + } + }); + // 2) Add mark property definition groups + var legendEncoding = legend.encoding || {}; + var legendEncode = ['labels', 'legend', 'title', 'symbols', 'gradient'].reduce(function (e, part) { + var legendEncodingPart = common_1.guideEncodeEntry(legendEncoding[part] || {}, model); + var value = encode[part] ? + // TODO: replace legendCmpt with type is sufficient + encode[part](fieldDef, legendEncodingPart, model, channel, legendCmpt.get('type')) : // apply rule + legendEncodingPart; // no rule -- just default values + if (value !== undefined && util_1.keys(value).length > 0) { + e[part] = { update: value }; + } + return e; + }, {}); + if (util_1.keys(legendEncode).length > 0) { + legendCmpt.set('encode', legendEncode, !!legend.encoding); + } + return legendCmpt; +} +exports.parseLegendForChannel = parseLegendForChannel; +function getProperty(property, specifiedLegend, channel, model) { + var fieldDef = model.fieldDef(channel); + switch (property) { + case 'format': + // We don't include temporal field here as we apply format in encode block + return common_1.numberFormat(fieldDef, specifiedLegend.format, model.config); + case 'title': + // For falsy value, keep undefined so we use default, + // but use null for '', null, and false to hide the title + var specifiedTitle = fieldDef.title !== undefined ? fieldDef.title : + specifiedLegend.title || (specifiedLegend.title === undefined ? undefined : null); + return common_1.getSpecifiedOrDefaultValue(specifiedTitle, fielddef_1.title(fieldDef, model.config)) || undefined; // make falsy value undefined so output Vega spec is shorter + case 'values': + return properties.values(specifiedLegend); + case 'type': + return common_1.getSpecifiedOrDefaultValue(specifiedLegend.type, properties.type(fieldDef.type, channel, model.getScaleComponent(channel).get('type'))); + } + // Otherwise, return specified property. + return specifiedLegend[property]; +} +function parseNonUnitLegend(model) { + var _a = model.component, legends = _a.legends, resolve = _a.resolve; + var _loop_1 = function (child) { + parseLegend(child); + util_1.keys(child.component.legends).forEach(function (channel) { + resolve.legend[channel] = resolve_1.parseGuideResolve(model.component.resolve, channel); + if (resolve.legend[channel] === 'shared') { + // If the resolve says shared (and has not been overridden) + // We will try to merge and see if there is a conflict + legends[channel] = mergeLegendComponent(legends[channel], child.component.legends[channel]); + if (!legends[channel]) { + // If merge returns nothing, there is a conflict so we cannot make the legend shared. + // Thus, mark legend as independent and remove the legend component. + resolve.legend[channel] = 'independent'; + delete legends[channel]; + } + } + }); + }; + for (var _i = 0, _b = model.children; _i < _b.length; _i++) { + var child = _b[_i]; + _loop_1(child); + } + util_1.keys(legends).forEach(function (channel) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (!child.component.legends[channel]) { + // skip if the child does not have a particular legend + continue; + } + if (resolve.legend[channel] === 'shared') { + // After merging shared legend, make sure to remove legend from child + delete child.component.legends[channel]; + } + } + }); + return legends; +} +function mergeLegendComponent(mergedLegend, childLegend) { + if (!mergedLegend) { + return childLegend.clone(); + } + var mergedOrient = mergedLegend.getWithExplicit('orient'); + var childOrient = childLegend.getWithExplicit('orient'); + if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) { + // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.) + // Cannot merge due to inconsistent orient + return undefined; + } + var typeMerged = false; + var _loop_2 = function (prop) { + var mergedValueWithExplicit = split_1.mergeValuesWithExplicit(mergedLegend.getWithExplicit(prop), childLegend.getWithExplicit(prop), prop, 'legend', + // Tie breaker function + function (v1, v2) { + switch (prop) { + case 'title': + return common_1.mergeTitleComponent(v1, v2); + case 'type': + // There are only two types. If we have different types, then prefer symbol over gradient. + typeMerged = true; + return split_1.makeImplicit('symbol'); + } + return split_1.defaultTieBreaker(v1, v2, prop, 'legend'); + }); + mergedLegend.setWithExplicit(prop, mergedValueWithExplicit); + }; + // Otherwise, let's merge + for (var _i = 0, VG_LEGEND_PROPERTIES_1 = legend_1.VG_LEGEND_PROPERTIES; _i < VG_LEGEND_PROPERTIES_1.length; _i++) { + var prop = VG_LEGEND_PROPERTIES_1[_i]; + _loop_2(prop); + } + if (typeMerged) { + if (((mergedLegend.implicit || {}).encode || {}).gradient) { + util_1.deleteNestedProperty(mergedLegend.implicit, ['encode', 'gradient']); + } + if (((mergedLegend.explicit || {}).encode || {}).gradient) { + util_1.deleteNestedProperty(mergedLegend.explicit, ['encode', 'gradient']); + } + } + return mergedLegend; +} +exports.mergeLegendComponent = mergeLegendComponent; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sZWdlbmQvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQWlHO0FBQ2pHLDJDQUFrRTtBQUNsRSx1Q0FBNkU7QUFDN0UsbUNBQW1DO0FBQ25DLG1DQUFzRDtBQUV0RCxvQ0FBMEc7QUFDMUcsa0NBQTRDO0FBQzVDLHNDQUE2QztBQUM3QyxrQ0FBNEY7QUFFNUYseUNBQWtFO0FBQ2xFLHVEQUFtQztBQUNuQywrREFBMkM7QUFHM0MscUJBQTRCLEtBQVk7SUFDdEMsSUFBSSxtQkFBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNsRDtTQUFNO1FBQ0wsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDckQ7QUFDSCxDQUFDO0FBTkQsa0NBTUM7QUFFRCx5QkFBeUIsS0FBZ0I7SUFDaEMsSUFBQSx5QkFBUSxDQUFVO0lBQ3pCLE9BQU8sQ0FBQyxlQUFLLEVBQUUsY0FBSSxFQUFFLGdCQUFNLEVBQUUsY0FBSSxFQUFFLGVBQUssRUFBRSxpQkFBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsZUFBZSxFQUFFLE9BQU87UUFDMUYsSUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLHFCQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEtBQUssZUFBSyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssY0FBTyxDQUFDLENBQUMsRUFBRTtZQUNsSSxlQUFlLENBQUMsT0FB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RUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1lBQ3hELDJCQUFvQixDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUNyRTtRQUNELElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUN6RCwyQkFBb0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDckU7S0FDRjtJQUdELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUEvQ0Qsb0RBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDT0xPUiwgRklMTCwgTm9uUG9zaXRpb25TY2FsZUNoYW5uZWwsIE9QQUNJVFksIFNIQVBFLCBTSVpFLCBTVFJPS0V9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtpc0ZpZWxkRGVmLCB0aXRsZSBhcyBmaWVsZERlZlRpdGxlfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0xlZ2VuZCwgTEVHRU5EX1BST1BFUlRJRVMsIFZHX0xFR0VORF9QUk9QRVJUSUVTfSBmcm9tICcuLi8uLi9sZWdlbmQnO1xuaW1wb3J0IHtHRU9KU09OfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7ZGVsZXRlTmVzdGVkUHJvcGVydHksIGtleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0xlZ2VuZCwgVmdMZWdlbmRFbmNvZGV9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7Z2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWUsIGd1aWRlRW5jb2RlRW50cnksIG1lcmdlVGl0bGVDb21wb25lbnQsIG51bWJlckZvcm1hdH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7aXNVbml0TW9kZWwsIE1vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3BhcnNlR3VpZGVSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7ZGVmYXVsdFRpZUJyZWFrZXIsIEV4cGxpY2l0LCBtYWtlSW1wbGljaXQsIG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0fSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0xlZ2VuZENvbXBvbmVudCwgTGVnZW5kQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCAqIGFzIGVuY29kZSBmcm9tICcuL2VuY29kZSc7XG5pbXBvcnQgKiBhcyBwcm9wZXJ0aWVzIGZyb20gJy4vcHJvcGVydGllcyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGVnZW5kKG1vZGVsOiBNb2RlbCkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgbW9kZWwuY29tcG9uZW50LmxlZ2VuZHMgPSBwYXJzZVVuaXRMZWdlbmQobW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIG1vZGVsLmNvbXBvbmVudC5sZWdlbmRzID0gcGFyc2VOb25Vbml0TGVnZW5kKG1vZGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRMZWdlbmQobW9kZWw6IFVuaXRNb2RlbCk6IExlZ2VuZENvbXBvbmVudEluZGV4IHtcbiAgY29uc3Qge2VuY29kaW5nfSA9IG1vZGVsO1xuICByZXR1cm4gW0NPTE9SLCBGSUxMLCBTVFJPS0UsIFNJWkUsIFNIQVBFLCBPUEFDSVRZXS5yZWR1Y2UoZnVuY3Rpb24gKGxlZ2VuZENvbXBvbmVudCwgY2hhbm5lbCkge1xuICAgIGNvbnN0IGRlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgIGlmIChtb2RlbC5sZWdlbmQoY2hhbm5lbCkgJiYgbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkgJiYgIShpc0ZpZWxkRGVmKGRlZikgJiYgKGNoYW5uZWwgPT09IFNIQVBFICYmIGRlZi50eXBlID09PSBHRU9KU09OKSkpIHtcbiAgICAgIGxlZ2VuZENvbXBvbmVudFtjaGFubmVsXSA9IHBhcnNlTGVnZW5kRm9yQ2hhbm5lbChtb2RlbCwgY2hhbm5lbCk7XG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRDb21wb25lbnQ7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVnZW5kRGVmV2l0aFNjYWxlKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsKTogVmdMZWdlbmQge1xuICAvLyBGb3IgYmlubmVkIGZpZWxkIHdpdGggY29udGludW91cyBzY2FsZSwgdXNlIGEgc3BlY2lhbCBzY2FsZSBzbyB3ZSBjYW4gb3ZlcnJyaWRlIHRoZSBtYXJrIHByb3BzIGFuZCBsYWJlbHNcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSBDT0xPUjpcbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuc2NhbGVOYW1lKENPTE9SKTtcbiAgICAgIHJldHVybiBtb2RlbC5tYXJrRGVmLmZpbGxlZCA/IHtmaWxsOiBzY2FsZX0gOiB7c3Ryb2tlOiBzY2FsZX07XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuICAgIGNhc2UgU0laRTpcbiAgICBjYXNlIFNIQVBFOlxuICAgIGNhc2UgT1BBQ0lUWTpcbiAgICAgIHJldHVybiB7W2NoYW5uZWxdOiBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCl9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxlZ2VuZEZvckNoYW5uZWwobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogTm9uUG9zaXRpb25TY2FsZUNoYW5uZWwpOiBMZWdlbmRDb21wb25lbnQge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICBjb25zdCBsZWdlbmQgPSBtb2RlbC5sZWdlbmQoY2hhbm5lbCk7XG5cbiAgY29uc3QgbGVnZW5kQ21wdCA9IG5ldyBMZWdlbmRDb21wb25lbnQoe30sIGdldExlZ2VuZERlZldpdGhTY2FsZShtb2RlbCwgY2hhbm5lbCkpO1xuXG4gIExFR0VORF9QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5LCBsZWdlbmQsIGNoYW5uZWwsIG1vZGVsKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZXhwbGljaXQgPVxuICAgICAgICAvLyBzcGVjaWZpZWQgbGVnZW5kLnZhbHVlcyBpcyBhbHJlYWR5IHJlc3BlY3RlZCwgYnV0IG1heSBnZXQgdHJhbnNmb3JtZWQuXG4gICAgICAgIHByb3BlcnR5ID09PSAndmFsdWVzJyA/ICEhbGVnZW5kLnZhbHVlcyA6XG4gICAgICAgIC8vIHRpdGxlIGNhbiBiZSBleHBsaWNpdCBpZiBmaWVsZERlZi50aXRsZSBpcyBzZXRcbiAgICAgICAgcHJvcGVydHkgPT09ICd0aXRsZScgJiYgdmFsdWUgPT09IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpLnRpdGxlID8gdHJ1ZSA6XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhpbmdzIGFyZSBleHBsaWNpdCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gICAgICAgIHZhbHVlID09PSBsZWdlbmRbcHJvcGVydHldO1xuICAgICAgaWYgKGV4cGxpY2l0IHx8IG1vZGVsLmNvbmZpZy5sZWdlbmRbcHJvcGVydHldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVnZW5kQ21wdC5zZXQocHJvcGVydHksIHZhbHVlLCBleHBsaWNpdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyAyKSBBZGQgbWFyayBwcm9wZXJ0eSBkZWZpbml0aW9uIGdyb3Vwc1xuICBjb25zdCBsZWdlbmRFbmNvZGluZyA9IGxlZ2VuZC5lbmNvZGluZyB8fCB7fTtcbiAgY29uc3QgbGVnZW5kRW5jb2RlID0gWydsYWJlbHMnLCAnbGVnZW5kJywgJ3RpdGxlJywgJ3N5bWJvbHMnLCAnZ3JhZGllbnQnXS5yZWR1Y2UoKGU6IFZnTGVnZW5kRW5jb2RlLCBwYXJ0KSA9PiB7XG4gICAgY29uc3QgbGVnZW5kRW5jb2RpbmdQYXJ0ID0gZ3VpZGVFbmNvZGVFbnRyeShsZWdlbmRFbmNvZGluZ1twYXJ0XSB8fCB7fSwgbW9kZWwpO1xuICAgIGNvbnN0IHZhbHVlID0gZW5jb2RlW3BhcnRdID9cbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgbGVnZW5kQ21wdCB3aXRoIHR5cGUgaXMgc3VmZmljaWVudFxuICAgICAgZW5jb2RlW3BhcnRdKGZpZWxkRGVmLCBsZWdlbmRFbmNvZGluZ1BhcnQsIG1vZGVsLCBjaGFubmVsLCBsZWdlbmRDbXB0LmdldCgndHlwZScpKSA6IC8vIGFwcGx5IHJ1bGVcbiAgICAgIGxlZ2VuZEVuY29kaW5nUGFydDsgLy8gbm8gcnVsZSAtLSBqdXN0IGRlZmF1bHQgdmFsdWVzXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZVtwYXJ0XSA9IHt1cGRhdGU6IHZhbHVlfTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH0sIHt9IGFzIFZnTGVnZW5kRW5jb2RlKTtcblxuICBpZiAoa2V5cyhsZWdlbmRFbmNvZGUpLmxlbmd0aCA+IDApIHtcbiAgICBsZWdlbmRDbXB0LnNldCgnZW5jb2RlJywgbGVnZW5kRW5jb2RlLCAhIWxlZ2VuZC5lbmNvZGluZyk7XG4gIH1cblxuICByZXR1cm4gbGVnZW5kQ21wdDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHkocHJvcGVydHk6IGtleW9mIChMZWdlbmQgfCBWZ0xlZ2VuZCksIHNwZWNpZmllZExlZ2VuZDogTGVnZW5kLCBjaGFubmVsOiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCwgbW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuXG4gIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICdmb3JtYXQnOlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0ZW1wb3JhbCBmaWVsZCBoZXJlIGFzIHdlIGFwcGx5IGZvcm1hdCBpbiBlbmNvZGUgYmxvY2tcbiAgICAgIHJldHVybiBudW1iZXJGb3JtYXQoZmllbGREZWYsIHNwZWNpZmllZExlZ2VuZC5mb3JtYXQsIG1vZGVsLmNvbmZpZyk7XG4gICAgY2FzZSAndGl0bGUnOlxuICAgICAgLy8gRm9yIGZhbHN5IHZhbHVlLCBrZWVwIHVuZGVmaW5lZCBzbyB3ZSB1c2UgZGVmYXVsdCxcbiAgICAgIC8vIGJ1dCB1c2UgbnVsbCBmb3IgJycsIG51bGwsIGFuZCBmYWxzZSB0byBoaWRlIHRoZSB0aXRsZVxuICAgICAgY29uc3Qgc3BlY2lmaWVkVGl0bGUgPSBmaWVsZERlZi50aXRsZSAhPT0gdW5kZWZpbmVkID8gZmllbGREZWYudGl0bGUgOlxuICAgICAgICBzcGVjaWZpZWRMZWdlbmQudGl0bGUgfHwgKHNwZWNpZmllZExlZ2VuZC50aXRsZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbCk7XG5cbiAgICAgIHJldHVybiBnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZShcbiAgICAgICAgc3BlY2lmaWVkVGl0bGUsXG4gICAgICAgIGZpZWxkRGVmVGl0bGUoZmllbGREZWYsIG1vZGVsLmNvbmZpZylcbiAgICAgICkgfHwgdW5kZWZpbmVkOyAvLyBtYWtlIGZhbHN5IHZhbHVlIHVuZGVmaW5lZCBzbyBvdXRwdXQgVmVnYSBzcGVjIGlzIHNob3J0ZXJcbiAgICBjYXNlICd2YWx1ZXMnOlxuICAgICAgcmV0dXJuIHByb3BlcnRpZXMudmFsdWVzKHNwZWNpZmllZExlZ2VuZCk7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWUoc3BlY2lmaWVkTGVnZW5kLnR5cGUsIHByb3BlcnRpZXMudHlwZShmaWVsZERlZi50eXBlLCBjaGFubmVsLCBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKSkpO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gc3BlY2lmaWVkIHByb3BlcnR5LlxuICByZXR1cm4gc3BlY2lmaWVkTGVnZW5kW3Byb3BlcnR5XTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0TGVnZW5kKG1vZGVsOiBNb2RlbCkge1xuICBjb25zdCB7bGVnZW5kcywgcmVzb2x2ZX0gPSBtb2RlbC5jb21wb25lbnQ7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIHBhcnNlTGVnZW5kKGNoaWxkKTtcblxuICAgIGtleXMoY2hpbGQuY29tcG9uZW50LmxlZ2VuZHMpLmZvckVhY2goKGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgICByZXNvbHZlLmxlZ2VuZFtjaGFubmVsXSA9IHBhcnNlR3VpZGVSZXNvbHZlKG1vZGVsLmNvbXBvbmVudC5yZXNvbHZlLCBjaGFubmVsKTtcblxuICAgICAgaWYgKHJlc29sdmUubGVnZW5kW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgICAvLyBJZiB0aGUgcmVzb2x2ZSBzYXlzIHNoYXJlZCAoYW5kIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuKVxuICAgICAgICAvLyBXZSB3aWxsIHRyeSB0byBtZXJnZSBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29uZmxpY3RcblxuICAgICAgICBsZWdlbmRzW2NoYW5uZWxdID0gbWVyZ2VMZWdlbmRDb21wb25lbnQobGVnZW5kc1tjaGFubmVsXSwgY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF0pO1xuXG4gICAgICAgIGlmICghbGVnZW5kc1tjaGFubmVsXSkge1xuICAgICAgICAgIC8vIElmIG1lcmdlIHJldHVybnMgbm90aGluZywgdGhlcmUgaXMgYSBjb25mbGljdCBzbyB3ZSBjYW5ub3QgbWFrZSB0aGUgbGVnZW5kIHNoYXJlZC5cbiAgICAgICAgICAvLyBUaHVzLCBtYXJrIGxlZ2VuZCBhcyBpbmRlcGVuZGVudCBhbmQgcmVtb3ZlIHRoZSBsZWdlbmQgY29tcG9uZW50LlxuICAgICAgICAgIHJlc29sdmUubGVnZW5kW2NoYW5uZWxdID0gJ2luZGVwZW5kZW50JztcbiAgICAgICAgICBkZWxldGUgbGVnZW5kc1tjaGFubmVsXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAga2V5cyhsZWdlbmRzKS5mb3JFYWNoKChjaGFubmVsOiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF0pIHtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgY2hpbGQgZG9lcyBub3QgaGF2ZSBhIHBhcnRpY3VsYXIgbGVnZW5kXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2ZS5sZWdlbmRbY2hhbm5lbF0gPT09ICdzaGFyZWQnKSB7XG4gICAgICAgIC8vIEFmdGVyIG1lcmdpbmcgc2hhcmVkIGxlZ2VuZCwgbWFrZSBzdXJlIHRvIHJlbW92ZSBsZWdlbmQgZnJvbSBjaGlsZFxuICAgICAgICBkZWxldGUgY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxlZ2VuZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxlZ2VuZENvbXBvbmVudChtZXJnZWRMZWdlbmQ6IExlZ2VuZENvbXBvbmVudCwgY2hpbGRMZWdlbmQ6IExlZ2VuZENvbXBvbmVudCk6IExlZ2VuZENvbXBvbmVudCB7XG4gIGlmICghbWVyZ2VkTGVnZW5kKSB7XG4gICAgcmV0dXJuIGNoaWxkTGVnZW5kLmNsb25lKCk7XG4gIH1cbiAgY29uc3QgbWVyZ2VkT3JpZW50ID0gbWVyZ2VkTGVnZW5kLmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG4gIGNvbnN0IGNoaWxkT3JpZW50ID0gY2hpbGRMZWdlbmQuZ2V0V2l0aEV4cGxpY2l0KCdvcmllbnQnKTtcblxuXG4gIGlmIChtZXJnZWRPcmllbnQuZXhwbGljaXQgJiYgY2hpbGRPcmllbnQuZXhwbGljaXQgJiYgbWVyZ2VkT3JpZW50LnZhbHVlICE9PSBjaGlsZE9yaWVudC52YWx1ZSkge1xuICAgIC8vIFRPRE86IHRocm93IHdhcm5pbmcgaWYgcmVzb2x2ZSBpcyBleHBsaWNpdCAoV2UgZG9uJ3QgaGF2ZSBpbmZvIGFib3V0IGV4cGxpY2l0L2ltcGxpY2l0IHJlc29sdmUgeWV0LilcbiAgICAvLyBDYW5ub3QgbWVyZ2UgZHVlIHRvIGluY29uc2lzdGVudCBvcmllbnRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCB0eXBlTWVyZ2VkID0gZmFsc2U7XG4gIC8vIE90aGVyd2lzZSwgbGV0J3MgbWVyZ2VcbiAgZm9yIChjb25zdCBwcm9wIG9mIFZHX0xFR0VORF9QUk9QRVJUSUVTKSB7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQgPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ0xlZ2VuZCwgYW55PihcbiAgICAgIG1lcmdlZExlZ2VuZC5nZXRXaXRoRXhwbGljaXQocHJvcCksXG4gICAgICBjaGlsZExlZ2VuZC5nZXRXaXRoRXhwbGljaXQocHJvcCksXG4gICAgICBwcm9wLCAnbGVnZW5kJyxcblxuICAgICAgLy8gVGllIGJyZWFrZXIgZnVuY3Rpb25cbiAgICAgICh2MTogRXhwbGljaXQ8YW55PiwgdjI6IEV4cGxpY2l0PGFueT4pOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VUaXRsZUNvbXBvbmVudCh2MSwgdjIpO1xuICAgICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHR5cGVzLiBJZiB3ZSBoYXZlIGRpZmZlcmVudCB0eXBlcywgdGhlbiBwcmVmZXIgc3ltYm9sIG92ZXIgZ3JhZGllbnQuXG4gICAgICAgICAgICB0eXBlTWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSW1wbGljaXQoJ3N5bWJvbCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0VGllQnJlYWtlcjxWZ0xlZ2VuZCwgYW55Pih2MSwgdjIsIHByb3AsICdsZWdlbmQnKTtcbiAgICAgIH1cbiAgICApO1xuICAgIG1lcmdlZExlZ2VuZC5zZXRXaXRoRXhwbGljaXQocHJvcCwgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQpO1xuICB9XG4gIGlmICh0eXBlTWVyZ2VkKSB7XG4gICAgaWYoKChtZXJnZWRMZWdlbmQuaW1wbGljaXQgfHwge30pLmVuY29kZSB8fCB7fSkuZ3JhZGllbnQpIHtcbiAgICAgIGRlbGV0ZU5lc3RlZFByb3BlcnR5KG1lcmdlZExlZ2VuZC5pbXBsaWNpdCwgWydlbmNvZGUnLCAnZ3JhZGllbnQnXSk7XG4gICAgfVxuICAgIGlmICgoKG1lcmdlZExlZ2VuZC5leHBsaWNpdCB8fCB7fSkuZW5jb2RlIHx8IHt9KS5ncmFkaWVudCkge1xuICAgICAgZGVsZXRlTmVzdGVkUHJvcGVydHkobWVyZ2VkTGVnZW5kLmV4cGxpY2l0LCBbJ2VuY29kZScsICdncmFkaWVudCddKTtcbiAgICB9XG4gIH1cblxuXG4gIHJldHVybiBtZXJnZWRMZWdlbmQ7XG59XG5cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/legend/properties.d.ts b/build/src/compile/legend/properties.d.ts new file mode 100644 index 0000000000..d6bc2c8e98 --- /dev/null +++ b/build/src/compile/legend/properties.d.ts @@ -0,0 +1,9 @@ +import { Channel } from '../../channel'; +import { DateTime } from '../../datetime'; +import { Legend } from '../../legend'; +import { ScaleType } from '../../scale'; +import { Type } from '../../type'; +export declare function values(legend: Legend): string[] | number[] | DateTime[] | { + signal: string; +}[]; +export declare function type(t: Type, channel: Channel, scaleType: ScaleType): 'gradient'; diff --git a/build/src/compile/legend/properties.js b/build/src/compile/legend/properties.js new file mode 100644 index 0000000000..9f597cb8a6 --- /dev/null +++ b/build/src/compile/legend/properties.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_1 = require("../../channel"); +var datetime_1 = require("../../datetime"); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +function values(legend) { + var vals = legend.values; + if (vals && datetime_1.isDateTime(vals[0])) { + return vals.map(function (dt) { + // normalize = true as end user won't put 0 = January + return { signal: datetime_1.dateTimeExpr(dt, true) }; + }); + } + return vals; +} +exports.values = values; +function type(t, channel, scaleType) { + if (channel_1.isColorChannel(channel) && ((t === 'quantitative' && !scale_1.isBinScale(scaleType)) || + (t === 'temporal' && util_1.contains(['time', 'utc'], scaleType)))) { + return 'gradient'; + } + return undefined; +} +exports.type = type; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2xlZ2VuZC9wcm9wZXJ0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEseUNBQXNEO0FBQ3RELDJDQUFrRTtBQUVsRSxxQ0FBa0Q7QUFFbEQsbUNBQW9DO0FBRXBDLGdCQUF1QixNQUFjO0lBQ25DLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxJQUFJLElBQUkscUJBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMvQixPQUFRLElBQW1CLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBRTtZQUNqQyxxREFBcUQ7WUFDckQsT0FBTyxFQUFDLE1BQU0sRUFBRSx1QkFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFURCx3QkFTQztBQUVELGNBQXFCLENBQU8sRUFBRSxPQUFnQixFQUFFLFNBQW9CO0lBQ2xFLElBQ0ksd0JBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6QixDQUFDLENBQUMsS0FBSyxjQUFjLElBQUksQ0FBQyxrQkFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxLQUFLLFVBQVUsSUFBSSxlQUFRLENBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FDdEUsRUFDRDtRQUNGLE9BQU8sVUFBVSxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQVZELG9CQVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFubmVsLCBpc0NvbG9yQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4uLy4uL2RhdGV0aW1lJztcbmltcG9ydCB7TGVnZW5kfSBmcm9tICcuLi8uLi9sZWdlbmQnO1xuaW1wb3J0IHtpc0JpblNjYWxlLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zfSBmcm9tICcuLi8uLi91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlcyhsZWdlbmQ6IExlZ2VuZCkge1xuICBjb25zdCB2YWxzID0gbGVnZW5kLnZhbHVlcztcbiAgaWYgKHZhbHMgJiYgaXNEYXRlVGltZSh2YWxzWzBdKSkge1xuICAgIHJldHVybiAodmFscyBhcyBEYXRlVGltZVtdKS5tYXAoKGR0KSA9PiB7XG4gICAgICAvLyBub3JtYWxpemUgPSB0cnVlIGFzIGVuZCB1c2VyIHdvbid0IHB1dCAwID0gSmFudWFyeVxuICAgICAgcmV0dXJuIHtzaWduYWw6IGRhdGVUaW1lRXhwcihkdCwgdHJ1ZSl9O1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZSh0OiBUeXBlLCBjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSk6ICdncmFkaWVudCcge1xuICBpZiAoXG4gICAgICBpc0NvbG9yQ2hhbm5lbChjaGFubmVsKSAmJiAoXG4gICAgICAgICh0ID09PSAncXVhbnRpdGF0aXZlJyAmJiAhaXNCaW5TY2FsZShzY2FsZVR5cGUpKSB8fFxuICAgICAgICAodCA9PT0gJ3RlbXBvcmFsJyAmJiBjb250YWluczxTY2FsZVR5cGU+KFsndGltZScsICd1dGMnXSwgc2NhbGVUeXBlKSlcbiAgICAgIClcbiAgICApIHtcbiAgICByZXR1cm4gJ2dyYWRpZW50JztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/area.d.ts b/build/src/compile/mark/area.d.ts new file mode 100644 index 0000000000..92ee281df3 --- /dev/null +++ b/build/src/compile/mark/area.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const area: MarkCompiler; diff --git a/build/src/compile/mark/area.js b/build/src/compile/mark/area.js new file mode 100644 index 0000000000..e9a2db3cbe --- /dev/null +++ b/build/src/compile/mark/area.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var mixins = tslib_1.__importStar(require("./mixins")); +exports.area = { + vgMark: 'area', + encodeEntry: function (model) { + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'include' }), mixins.pointPosition('x', model, 'zeroOrMin'), mixins.pointPosition('y', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', model.markDef.orient === 'horizontal' ? 'x2' : 'y2'), mixins.defined(model)); + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJlYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvYXJlYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBbUM7QUFHdEIsUUFBQSxJQUFJLEdBQWlCO0lBQ2hDLE1BQU0sRUFBRSxNQUFNO0lBQ2QsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDNUIsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzdDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsRUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDOUYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDeEI7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgbWl4aW5zIGZyb20gJy4vbWl4aW5zJztcblxuXG5leHBvcnQgY29uc3QgYXJlYTogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdhcmVhJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaW5jbHVkZSd9KSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsICd6ZXJvT3JNaW4nKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsICd6ZXJvT3JNaW4nKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsIG1vZGVsLm1hcmtEZWYub3JpZW50ID09PSAnaG9yaXpvbnRhbCcgPyAneDInIDogJ3kyJyksXG4gICAgICAuLi5taXhpbnMuZGVmaW5lZChtb2RlbClcbiAgICB9O1xuICB9XG59O1xuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/bar.d.ts b/build/src/compile/mark/bar.d.ts new file mode 100644 index 0000000000..577df12005 --- /dev/null +++ b/build/src/compile/mark/bar.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const bar: MarkCompiler; diff --git a/build/src/compile/mark/bar.js b/build/src/compile/mark/bar.js new file mode 100644 index 0000000000..6f5d60aa82 --- /dev/null +++ b/build/src/compile/mark/bar.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var vega_schema_1 = require("../../vega.schema"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +exports.bar = { + vgMark: 'rect', + encodeEntry: function (model) { + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x(model), y(model)); + } +}; +function x(model) { + var config = model.config, encoding = model.encoding, markDef = model.markDef, width = model.width; + var orient = markDef.orient; + var sizeDef = encoding.size; + var xDef = encoding.x; + var x2Def = encoding.x2; + var xScaleName = model.scaleName(channel_1.X); + var xScale = model.getScaleComponent(channel_1.X); + // x, x2, and width -- we must specify two of these in all conditions + if (orient === 'horizontal' || x2Def) { + return tslib_1.__assign({}, mixins.pointPosition('x', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', 'x2')); + } + else { // vertical + if (fielddef_1.isFieldDef(xDef)) { + var xScaleType = xScale.get('type'); + if (xDef.bin && !sizeDef && !scale_1.hasDiscreteDomain(xScaleType)) { + return mixins.binnedPosition(xDef, 'x', model.scaleName('x'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, xScale.get('reverse')); + } + else { + if (xScaleType === scale_1.ScaleType.BAND) { + return mixins.bandPosition(xDef, 'x', model); + } + } + } + // sized bin, normal point-ordinal axis, quantitative x-axis, or no x + return mixins.centeredBandPosition('x', model, tslib_1.__assign({}, ref.mid(width)), defaultSizeRef(markDef, xScaleName, xScale, config)); + } +} +function y(model) { + var config = model.config, encoding = model.encoding, height = model.height, markDef = model.markDef; + var orient = markDef.orient; + var sizeDef = encoding.size; + var yDef = encoding.y; + var y2Def = encoding.y2; + var yScaleName = model.scaleName(channel_1.Y); + var yScale = model.getScaleComponent(channel_1.Y); + // y, y2 & height -- we must specify two of these in all conditions + if (orient === 'vertical' || y2Def) { + return tslib_1.__assign({}, mixins.pointPosition('y', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', 'y2')); + } + else { + if (fielddef_1.isFieldDef(yDef)) { + var yScaleType = yScale.get('type'); + if (yDef.bin && !sizeDef && !scale_1.hasDiscreteDomain(yScaleType)) { + return mixins.binnedPosition(yDef, 'y', model.scaleName('y'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, yScale.get('reverse')); + } + else if (yScaleType === scale_1.ScaleType.BAND) { + return mixins.bandPosition(yDef, 'y', model); + } + } + return mixins.centeredBandPosition('y', model, ref.mid(height), defaultSizeRef(markDef, yScaleName, yScale, config)); + } +} +function defaultSizeRef(markDef, scaleName, scale, config) { + if (markDef.size !== undefined) { + return { value: markDef.size }; + } + else if (config.bar.discreteBandSize) { + return { value: config.bar.discreteBandSize }; + } + else if (scale) { + var scaleType = scale.get('type'); + if (scaleType === scale_1.ScaleType.POINT) { + var scaleRange = scale.get('range'); + if (vega_schema_1.isVgRangeStep(scaleRange) && vega_util_1.isNumber(scaleRange.step)) { + return { value: scaleRange.step - 1 }; + } + log.warn(log.message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL); + } + else if (scaleType === scale_1.ScaleType.BAND) { + return ref.bandRef(scaleName); + } + else { // non-ordinal scale + return { value: config.bar.continuousBandSize }; + } + } + else if (config.scale.rangeStep && config.scale.rangeStep !== null) { + return { value: config.scale.rangeStep - 1 }; + } + return { value: 20 }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQW1DO0FBQ25DLHlDQUFtQztBQUVuQywyQ0FBMEM7QUFDMUMscURBQWlDO0FBRWpDLHFDQUF5RDtBQUN6RCxpREFBK0Q7QUFLL0QsdURBQW1DO0FBQ25DLHNEQUFrQztBQUdyQixRQUFBLEdBQUcsR0FBaUI7SUFDL0IsTUFBTSxFQUFFLE1BQU07SUFDZCxXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1Qiw0QkFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQ2pFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDUixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ1g7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLFdBQVcsS0FBZ0I7SUFDbEIsSUFBQSxxQkFBTSxFQUFFLHlCQUFRLEVBQUUsdUJBQU8sRUFBRSxtQkFBSyxDQUFVO0lBQ2pELElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDOUIsSUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztJQUU5QixJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDMUIsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFDLENBQUMsQ0FBQztJQUN0QyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBQyxDQUFDLENBQUM7SUFDMUMscUVBQXFFO0lBQ3JFLElBQUksTUFBTSxLQUFLLFlBQVksSUFBSSxLQUFLLEVBQUU7UUFDcEMsNEJBQ0ssTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUM3QyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQ2xEO0tBQ0g7U0FBTSxFQUFFLFdBQVc7UUFDbEIsSUFBSSxxQkFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BCLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdEMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMseUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQzFELE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FDMUIsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFDOUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FDdEIsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLElBQUksVUFBVSxLQUFLLGlCQUFTLENBQUMsSUFBSSxFQUFFO29CQUNqQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDOUM7YUFDRjtTQUNGO1FBQ0QscUVBQXFFO1FBRXJFLE9BQU8sTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsRUFBRSxLQUFLLHVCQUN2QyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUNsQixjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQ3BELENBQUM7S0FDSDtBQUNILENBQUM7QUFFRCxXQUFXLEtBQWdCO0lBQ2xCLElBQUEscUJBQU0sRUFBRSx5QkFBUSxFQUFFLHFCQUFNLEVBQUUsdUJBQU8sQ0FBVTtJQUNsRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFFOUIsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQzFCLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBQyxDQUFDLENBQUM7SUFDdEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQUMsQ0FBQyxDQUFDO0lBRTFDLG1FQUFtRTtJQUNuRSxJQUFJLE1BQU0sS0FBSyxVQUFVLElBQUksS0FBSyxFQUFFO1FBQ2xDLDRCQUNLLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsRUFDN0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxFQUNsRDtLQUNIO1NBQU07UUFDTCxJQUFJLHFCQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDcEIsSUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyx5QkFBaUIsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDMUQsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUMxQixJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQy9CLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFDN0UsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FDdEIsQ0FBQzthQUNIO2lCQUFNLElBQUksVUFBVSxLQUFLLGlCQUFTLENBQUMsSUFBSSxFQUFFO2dCQUN4QyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM5QztTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUMsb0JBQW9CLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUM1RCxjQUFjLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQ3BELENBQUM7S0FDSDtBQUNILENBQUM7QUFFRCx3QkFBd0IsT0FBZ0IsRUFBRSxTQUFpQixFQUFFLEtBQXFCLEVBQUUsTUFBYztJQUNoRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQzlCLE9BQU8sRUFBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBQyxDQUFDO0tBQzlCO1NBQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFO1FBQ3RDLE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBQyxDQUFDO0tBQzdDO1NBQU0sSUFBSSxLQUFLLEVBQUU7UUFDaEIsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxJQUFJLFNBQVMsS0FBSyxpQkFBUyxDQUFDLEtBQUssRUFBRTtZQUNqQyxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksMkJBQWEsQ0FBQyxVQUFVLENBQUMsSUFBSSxvQkFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUQsT0FBTyxFQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBQyxDQUFDO2FBQ3JDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDL0Q7YUFBTSxJQUFJLFNBQVMsS0FBSyxpQkFBUyxDQUFDLElBQUksRUFBRTtZQUN2QyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0I7YUFBTSxFQUFFLG9CQUFvQjtZQUMzQixPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUMsQ0FBQztTQUMvQztLQUNGO1NBQU0sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7UUFDcEUsT0FBTyxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUMsQ0FBQztLQUM1QztJQUNELE9BQU8sRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge1gsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge2lzRmllbGREZWZ9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrRGVmfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW4sIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwLCBWZ0VuY29kZUVudHJ5fSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1ZnVmFsdWVSZWZ9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7U2NhbGVDb21wb25lbnR9IGZyb20gJy4uL3NjYWxlL2NvbXBvbmVudCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cblxuZXhwb3J0IGNvbnN0IGJhcjogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdyZWN0JyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgICAgLi4ueChtb2RlbCksXG4gICAgICAuLi55KG1vZGVsKSxcbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiB4KG1vZGVsOiBVbml0TW9kZWwpOiBWZ0VuY29kZUVudHJ5IHtcbiAgY29uc3Qge2NvbmZpZywgZW5jb2RpbmcsIG1hcmtEZWYsIHdpZHRofSA9IG1vZGVsO1xuICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcbiAgY29uc3Qgc2l6ZURlZiA9IGVuY29kaW5nLnNpemU7XG5cbiAgY29uc3QgeERlZiA9IGVuY29kaW5nLng7XG4gIGNvbnN0IHgyRGVmID0gZW5jb2RpbmcueDI7XG4gIGNvbnN0IHhTY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoWCk7XG4gIGNvbnN0IHhTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KFgpO1xuICAvLyB4LCB4MiwgYW5kIHdpZHRoIC0tIHdlIG11c3Qgc3BlY2lmeSB0d28gb2YgdGhlc2UgaW4gYWxsIGNvbmRpdGlvbnNcbiAgaWYgKG9yaWVudCA9PT0gJ2hvcml6b250YWwnIHx8IHgyRGVmKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsICd6ZXJvT3JNaW4nKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd4MicpLFxuICAgIH07XG4gIH0gZWxzZSB7IC8vIHZlcnRpY2FsXG4gICAgaWYgKGlzRmllbGREZWYoeERlZikpIHtcbiAgICAgIGNvbnN0IHhTY2FsZVR5cGUgPSB4U2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICBpZiAoeERlZi5iaW4gJiYgIXNpemVEZWYgJiYgIWhhc0Rpc2NyZXRlRG9tYWluKHhTY2FsZVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBtaXhpbnMuYmlubmVkUG9zaXRpb24oXG4gICAgICAgICAgeERlZiwgJ3gnLCBtb2RlbC5zY2FsZU5hbWUoJ3gnKSwgbWFya0RlZi5iaW5TcGFjaW5nID09PSB1bmRlZmluZWQgPyBjb25maWcuYmFyLmJpblNwYWNpbmcgOiBtYXJrRGVmLmJpblNwYWNpbmcsXG4gICAgICAgICAgeFNjYWxlLmdldCgncmV2ZXJzZScpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoeFNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLkJBTkQpIHtcbiAgICAgICAgICByZXR1cm4gbWl4aW5zLmJhbmRQb3NpdGlvbih4RGVmLCAneCcsIG1vZGVsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBzaXplZCBiaW4sIG5vcm1hbCBwb2ludC1vcmRpbmFsIGF4aXMsIHF1YW50aXRhdGl2ZSB4LWF4aXMsIG9yIG5vIHhcblxuICAgIHJldHVybiBtaXhpbnMuY2VudGVyZWRCYW5kUG9zaXRpb24oJ3gnLCBtb2RlbCxcbiAgICAgIHsuLi5yZWYubWlkKHdpZHRoKX0sXG4gICAgICBkZWZhdWx0U2l6ZVJlZihtYXJrRGVmLCB4U2NhbGVOYW1lLCB4U2NhbGUsIGNvbmZpZylcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHkobW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCB7Y29uZmlnLCBlbmNvZGluZywgaGVpZ2h0LCBtYXJrRGVmfSA9IG1vZGVsO1xuICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcbiAgY29uc3Qgc2l6ZURlZiA9IGVuY29kaW5nLnNpemU7XG5cbiAgY29uc3QgeURlZiA9IGVuY29kaW5nLnk7XG4gIGNvbnN0IHkyRGVmID0gZW5jb2RpbmcueTI7XG4gIGNvbnN0IHlTY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoWSk7XG4gIGNvbnN0IHlTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KFkpO1xuXG4gIC8vIHksIHkyICYgaGVpZ2h0IC0tIHdlIG11c3Qgc3BlY2lmeSB0d28gb2YgdGhlc2UgaW4gYWxsIGNvbmRpdGlvbnNcbiAgaWYgKG9yaWVudCA9PT0gJ3ZlcnRpY2FsJyB8fCB5MkRlZikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCAnemVyb09yTWluJyksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbjIobW9kZWwsICd6ZXJvT3JNaW4nLCAneTInKSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGlmIChpc0ZpZWxkRGVmKHlEZWYpKSB7XG4gICAgICBjb25zdCB5U2NhbGVUeXBlID0geVNjYWxlLmdldCgndHlwZScpO1xuICAgICAgaWYgKHlEZWYuYmluICYmICFzaXplRGVmICYmICFoYXNEaXNjcmV0ZURvbWFpbih5U2NhbGVUeXBlKSkge1xuICAgICAgICByZXR1cm4gbWl4aW5zLmJpbm5lZFBvc2l0aW9uKFxuICAgICAgICAgIHlEZWYsICd5JywgbW9kZWwuc2NhbGVOYW1lKCd5JyksXG4gICAgICAgICAgbWFya0RlZi5iaW5TcGFjaW5nID09PSB1bmRlZmluZWQgPyBjb25maWcuYmFyLmJpblNwYWNpbmcgOiBtYXJrRGVmLmJpblNwYWNpbmcsXG4gICAgICAgICAgeVNjYWxlLmdldCgncmV2ZXJzZScpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHlTY2FsZVR5cGUgPT09IFNjYWxlVHlwZS5CQU5EKSB7XG4gICAgICAgIHJldHVybiBtaXhpbnMuYmFuZFBvc2l0aW9uKHlEZWYsICd5JywgbW9kZWwpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWl4aW5zLmNlbnRlcmVkQmFuZFBvc2l0aW9uKCd5JywgbW9kZWwsIHJlZi5taWQoaGVpZ2h0KSxcbiAgICAgIGRlZmF1bHRTaXplUmVmKG1hcmtEZWYsIHlTY2FsZU5hbWUsIHlTY2FsZSwgY29uZmlnKVxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNpemVSZWYobWFya0RlZjogTWFya0RlZiwgc2NhbGVOYW1lOiBzdHJpbmcsIHNjYWxlOiBTY2FsZUNvbXBvbmVudCwgY29uZmlnOiBDb25maWcpOiBWZ1ZhbHVlUmVmIHtcbiAgaWYgKG1hcmtEZWYuc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHt2YWx1ZTogbWFya0RlZi5zaXplfTtcbiAgfSBlbHNlIGlmIChjb25maWcuYmFyLmRpc2NyZXRlQmFuZFNpemUpIHtcbiAgICByZXR1cm4ge3ZhbHVlOiBjb25maWcuYmFyLmRpc2NyZXRlQmFuZFNpemV9O1xuICB9IGVsc2UgaWYgKHNjYWxlKSB7XG4gICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgaWYgKHNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLlBPSU5UKSB7XG4gICAgICBjb25zdCBzY2FsZVJhbmdlID0gc2NhbGUuZ2V0KCdyYW5nZScpO1xuICAgICAgaWYgKGlzVmdSYW5nZVN0ZXAoc2NhbGVSYW5nZSkgJiYgaXNOdW1iZXIoc2NhbGVSYW5nZS5zdGVwKSkge1xuICAgICAgICByZXR1cm4ge3ZhbHVlOiBzY2FsZVJhbmdlLnN0ZXAgLSAxfTtcbiAgICAgIH1cbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLkJBUl9XSVRIX1BPSU5UX1NDQUxFX0FORF9SQU5HRVNURVBfTlVMTCk7XG4gICAgfSBlbHNlIGlmIChzY2FsZVR5cGUgPT09IFNjYWxlVHlwZS5CQU5EKSB7XG4gICAgICByZXR1cm4gcmVmLmJhbmRSZWYoc2NhbGVOYW1lKTtcbiAgICB9IGVsc2UgeyAvLyBub24tb3JkaW5hbCBzY2FsZVxuICAgICAgcmV0dXJuIHt2YWx1ZTogY29uZmlnLmJhci5jb250aW51b3VzQmFuZFNpemV9O1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcuc2NhbGUucmFuZ2VTdGVwICYmIGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXAgIT09IG51bGwpIHtcbiAgICByZXR1cm4ge3ZhbHVlOiBjb25maWcuc2NhbGUucmFuZ2VTdGVwIC0gMX07XG4gIH1cbiAgcmV0dXJuIHt2YWx1ZTogMjB9O1xufVxuXG4iXX0= \ No newline at end of file diff --git a/build/src/compile/mark/base.d.ts b/build/src/compile/mark/base.d.ts new file mode 100644 index 0000000000..ce4b302c73 --- /dev/null +++ b/build/src/compile/mark/base.d.ts @@ -0,0 +1,16 @@ +import { VgEncodeEntry, VgPostEncodingTransform } from '../../vega.schema'; +import { UnitModel } from '../unit'; +/** + * Abstract interface for compiling a Vega-Lite primitive mark type. + */ +export interface MarkCompiler { + /** + * Underlying vega Mark type for the Vega-Lite mark. + */ + vgMark: 'area' | 'line' | 'symbol' | 'rect' | 'rule' | 'text' | 'trail' | 'shape'; + encodeEntry: (model: UnitModel) => VgEncodeEntry; + /** + * Transform on a mark after render, used for layout and projections + */ + postEncodingTransform?: (model: UnitModel) => VgPostEncodingTransform[]; +} diff --git a/build/src/compile/mark/base.js b/build/src/compile/mark/base.js new file mode 100644 index 0000000000..ac5c3ab076 --- /dev/null +++ b/build/src/compile/mark/base.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWZ0VuY29kZUVudHJ5LCBWZ1Bvc3RFbmNvZGluZ1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuXG4vKipcbiAqIEFic3RyYWN0IGludGVyZmFjZSBmb3IgY29tcGlsaW5nIGEgVmVnYS1MaXRlIHByaW1pdGl2ZSBtYXJrIHR5cGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya0NvbXBpbGVyIHtcbiAgLyoqXG4gICAqIFVuZGVybHlpbmcgdmVnYSBNYXJrIHR5cGUgZm9yIHRoZSBWZWdhLUxpdGUgbWFyay5cbiAgICovXG4gIHZnTWFyazogJ2FyZWEnIHwgJ2xpbmUnIHwgJ3N5bWJvbCcgfCAncmVjdCcgfCAncnVsZScgfCAndGV4dCcgfCAndHJhaWwnIHwgJ3NoYXBlJztcblxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IFZnRW5jb2RlRW50cnk7XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSBvbiBhIG1hcmsgYWZ0ZXIgcmVuZGVyLCB1c2VkIGZvciBsYXlvdXQgYW5kIHByb2plY3Rpb25zXG4gICAqL1xuICBwb3N0RW5jb2RpbmdUcmFuc2Zvcm0/OiAobW9kZWw6IFVuaXRNb2RlbCkgPT4gVmdQb3N0RW5jb2RpbmdUcmFuc2Zvcm1bXTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/mark/geoshape.d.ts b/build/src/compile/mark/geoshape.d.ts new file mode 100644 index 0000000000..eaf46e5a40 --- /dev/null +++ b/build/src/compile/mark/geoshape.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const geoshape: MarkCompiler; diff --git a/build/src/compile/mark/geoshape.js b/build/src/compile/mark/geoshape.js new file mode 100644 index 0000000000..4ac42cab4d --- /dev/null +++ b/build/src/compile/mark/geoshape.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var mixins = tslib_1.__importStar(require("./mixins")); +var fielddef_1 = require("../../fielddef"); +var type_1 = require("../../type"); +exports.geoshape = { + vgMark: 'shape', + encodeEntry: function (model) { + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' })); + }, + postEncodingTransform: function (model) { + var encoding = model.encoding; + var shapeDef = encoding.shape; + var transform = tslib_1.__assign({ type: 'geoshape', projection: model.projectionName() }, (shapeDef && fielddef_1.isFieldDef(shapeDef) && shapeDef.type === type_1.GEOJSON ? { field: fielddef_1.vgField(shapeDef, { expr: 'datum' }) } : {})); + return [transform]; + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2Vvc2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL2dlb3NoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVEQUFtQztBQUVuQywyQ0FBbUQ7QUFDbkQsbUNBQW1DO0FBSXRCLFFBQUEsUUFBUSxHQUFpQjtJQUNwQyxNQUFNLEVBQUUsT0FBTztJQUNmLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQzVCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDcEU7SUFDSixDQUFDO0lBQ0QscUJBQXFCLEVBQUUsVUFBQyxLQUFnQjtRQUMvQixJQUFBLHlCQUFRLENBQVU7UUFDekIsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUVoQyxJQUFNLFNBQVMsc0JBQ2IsSUFBSSxFQUFFLFVBQVUsRUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFFL0IsQ0FBQyxRQUFRLElBQUkscUJBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsa0JBQU8sQ0FBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDdEgsQ0FBQztRQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5cbmltcG9ydCB7aXNGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtHRU9KU09OfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7VmdHZW9TaGFwZVRyYW5zZm9ybSwgVmdQb3N0RW5jb2RpbmdUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuXG5leHBvcnQgY29uc3QgZ2Vvc2hhcGU6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnc2hhcGUnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpZ25vcmUnLCBvcmllbnQ6ICdpZ25vcmUnfSlcbiAgICB9O1xuICB9LFxuICBwb3N0RW5jb2RpbmdUcmFuc2Zvcm06IChtb2RlbDogVW5pdE1vZGVsKTogVmdQb3N0RW5jb2RpbmdUcmFuc2Zvcm1bXSA9PiB7XG4gICAgY29uc3Qge2VuY29kaW5nfSA9IG1vZGVsO1xuICAgIGNvbnN0IHNoYXBlRGVmID0gZW5jb2Rpbmcuc2hhcGU7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm06IFZnR2VvU2hhcGVUcmFuc2Zvcm0gPSB7XG4gICAgICB0eXBlOiAnZ2Vvc2hhcGUnLFxuICAgICAgcHJvamVjdGlvbjogbW9kZWwucHJvamVjdGlvbk5hbWUoKSxcbiAgICAgIC8vIGFzOiAnc2hhcGUnLFxuICAgICAgLi4uKHNoYXBlRGVmICYmIGlzRmllbGREZWYoc2hhcGVEZWYpICYmIHNoYXBlRGVmLnR5cGUgPT09IEdFT0pTT04gPyB7ZmllbGQ6IHZnRmllbGQoc2hhcGVEZWYsIHtleHByOiAnZGF0dW0nfSl9IDoge30pXG4gICAgfTtcbiAgICByZXR1cm4gW3RyYW5zZm9ybV07XG4gIH1cbn07XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/mark/init.d.ts b/build/src/compile/mark/init.d.ts new file mode 100644 index 0000000000..5fedbc8d15 --- /dev/null +++ b/build/src/compile/mark/init.d.ts @@ -0,0 +1,4 @@ +import { Config } from '../../config'; +import { Encoding } from '../../encoding'; +import { Mark, MarkDef } from '../../mark'; +export declare function normalizeMarkDef(mark: Mark | MarkDef, encoding: Encoding, config: Config): MarkDef; diff --git a/build/src/compile/mark/init.js b/build/src/compile/mark/init.js new file mode 100644 index 0000000000..e1652b677f --- /dev/null +++ b/build/src/compile/mark/init.js @@ -0,0 +1,144 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var encoding_1 = require("../../encoding"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var mark_1 = require("../../mark"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +function normalizeMarkDef(mark, encoding, config) { + var markDef = mark_1.isMarkDef(mark) ? tslib_1.__assign({}, mark) : { type: mark }; + // set orient, which can be overridden by rules as sometimes the specified orient is invalid. + var specifiedOrient = markDef.orient || common_1.getMarkConfig('orient', markDef, config); + markDef.orient = orient(markDef.type, encoding, specifiedOrient); + if (specifiedOrient !== undefined && specifiedOrient !== markDef.orient) { + log.warn(log.message.orientOverridden(markDef.orient, specifiedOrient)); + } + // set opacity and filled if not specified in mark config + var specifiedOpacity = markDef.opacity !== undefined ? markDef.opacity : common_1.getMarkConfig('opacity', markDef, config); + if (specifiedOpacity === undefined) { + markDef.opacity = defaultOpacity(markDef.type, encoding); + } + var specifiedFilled = markDef.filled; + if (specifiedFilled === undefined) { + markDef.filled = filled(markDef, config); + } + return markDef; +} +exports.normalizeMarkDef = normalizeMarkDef; +function defaultOpacity(mark, encoding) { + if (util_1.contains([mark_1.POINT, mark_1.TICK, mark_1.CIRCLE, mark_1.SQUARE], mark)) { + // point-based marks + if (!encoding_1.isAggregate(encoding)) { + return 0.7; + } + } + return undefined; +} +function filled(markDef, config) { + var filledConfig = common_1.getMarkConfig('filled', markDef, config); + var mark = markDef.type; + return filledConfig !== undefined ? filledConfig : mark !== mark_1.POINT && mark !== mark_1.LINE && mark !== mark_1.RULE; +} +function orient(mark, encoding, specifiedOrient) { + switch (mark) { + case mark_1.POINT: + case mark_1.CIRCLE: + case mark_1.SQUARE: + case mark_1.TEXT: + case mark_1.RECT: + // orient is meaningless for these marks. + return undefined; + } + var yIsRange = encoding.y2; + var xIsRange = encoding.x2; + switch (mark) { + case mark_1.BAR: + if (yIsRange || xIsRange) { + // Ranged bar does not always have clear orientation, so we allow overriding + if (specifiedOrient) { + return specifiedOrient; + } + // If y is range and x is non-range, non-bin Q, y is likely a prebinned field + var xDef = encoding.x; + if (!xIsRange && fielddef_1.isFieldDef(xDef) && xDef.type === type_1.QUANTITATIVE && !xDef.bin) { + return 'horizontal'; + } + // If x is range and y is non-range, non-bin Q, x is likely a prebinned field + var yDef = encoding.y; + if (!yIsRange && fielddef_1.isFieldDef(yDef) && yDef.type === type_1.QUANTITATIVE && !yDef.bin) { + return 'vertical'; + } + } + /* tslint:disable */ + case mark_1.RULE: // intentionally fall through + // return undefined for line segment rule and bar with both axis ranged + if (xIsRange && yIsRange) { + return undefined; + } + case mark_1.AREA: // intentionally fall through + // If there are range for both x and y, y (vertical) has higher precedence. + if (yIsRange) { + return 'vertical'; + } + else if (xIsRange) { + return 'horizontal'; + } + else if (mark === mark_1.RULE) { + if (encoding.x && !encoding.y) { + return 'vertical'; + } + else if (encoding.y && !encoding.x) { + return 'horizontal'; + } + } + case mark_1.LINE: // intentional fall through + case mark_1.TICK: // Tick is opposite to bar, line, area and never have ranged mark. + /* tslint:enable */ + var xIsContinuous = fielddef_1.isFieldDef(encoding.x) && fielddef_1.isContinuous(encoding.x); + var yIsContinuous = fielddef_1.isFieldDef(encoding.y) && fielddef_1.isContinuous(encoding.y); + if (xIsContinuous && !yIsContinuous) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + else if (!xIsContinuous && yIsContinuous) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (xIsContinuous && yIsContinuous) { + var xDef = encoding.x; // we can cast here since they are surely fieldDef + var yDef = encoding.y; + var xIsTemporal = xDef.type === type_1.TEMPORAL; + var yIsTemporal = yDef.type === type_1.TEMPORAL; + // temporal without timeUnit is considered continuous, but better serves as dimension + if (xIsTemporal && !yIsTemporal) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (!xIsTemporal && yIsTemporal) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + if (!xDef.aggregate && yDef.aggregate) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (xDef.aggregate && !yDef.aggregate) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + if (specifiedOrient) { + // When ambiguous, use user specified one. + return specifiedOrient; + } + if (!(mark === mark_1.LINE && encoding.order)) { + // Except for connected scatterplot, we should log warning for unclear orientation of QxQ plots. + log.warn(log.message.unclearOrientContinuous(mark)); + } + return 'vertical'; + } + else { + // For Discrete x Discrete case, return undefined. + log.warn(log.message.unclearOrientDiscreteOrEmpty(mark)); + return undefined; + } + } + return 'vertical'; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwyQ0FBcUQ7QUFDckQsMkNBQWtFO0FBQ2xFLHFEQUFpQztBQUNqQyxtQ0FBb0g7QUFDcEgsbUNBQWtEO0FBQ2xELG1DQUFvQztBQUNwQyxvQ0FBd0M7QUFJeEMsMEJBQWlDLElBQW9CLEVBQUUsUUFBMEIsRUFBRSxNQUFjO0lBQy9GLElBQU0sT0FBTyxHQUFZLGdCQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXBFLDZGQUE2RjtJQUM3RixJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLHNCQUFhLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNuRixPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNqRSxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLE9BQU8sQ0FBQyxNQUFNLEVBQUU7UUFDdkUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztLQUN4RTtJQUVELHlEQUF5RDtJQUN6RCxJQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxPQUFPLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxzQkFBYSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckgsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsT0FB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QUFPLFNBQVMsQ0FBQzthQUNsQjtLQUNKO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0VuY29kaW5nLCBpc0FnZ3JlZ2F0ZX0gZnJvbSAnLi4vLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGaWVsZERlZiwgaXNDb250aW51b3VzLCBpc0ZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7QVJFQSwgQkFSLCBDSVJDTEUsIGlzTWFya0RlZiwgTElORSwgTWFyaywgTWFya0RlZiwgUE9JTlQsIFJFQ1QsIFJVTEUsIFNRVUFSRSwgVEVYVCwgVElDS30gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge1FVQU5USVRBVElWRSwgVEVNUE9SQUx9IGZyb20gJy4uLy4uL3R5cGUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2dldE1hcmtDb25maWd9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge09yaWVudH0gZnJvbSAnLi8uLi8uLi92ZWdhLnNjaGVtYSc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmtEZWYobWFyazogTWFyayB8IE1hcmtEZWYsIGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+LCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBtYXJrRGVmOiBNYXJrRGVmID0gaXNNYXJrRGVmKG1hcmspID8gey4uLm1hcmt9IDoge3R5cGU6IG1hcmt9O1xuXG4gIC8vIHNldCBvcmllbnQsIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHJ1bGVzIGFzIHNvbWV0aW1lcyB0aGUgc3BlY2lmaWVkIG9yaWVudCBpcyBpbnZhbGlkLlxuICBjb25zdCBzcGVjaWZpZWRPcmllbnQgPSBtYXJrRGVmLm9yaWVudCB8fCBnZXRNYXJrQ29uZmlnKCdvcmllbnQnLCBtYXJrRGVmLCBjb25maWcpO1xuICBtYXJrRGVmLm9yaWVudCA9IG9yaWVudChtYXJrRGVmLnR5cGUsIGVuY29kaW5nLCBzcGVjaWZpZWRPcmllbnQpO1xuICBpZiAoc3BlY2lmaWVkT3JpZW50ICE9PSB1bmRlZmluZWQgJiYgc3BlY2lmaWVkT3JpZW50ICE9PSBtYXJrRGVmLm9yaWVudCkge1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLm9yaWVudE92ZXJyaWRkZW4obWFya0RlZi5vcmllbnQsc3BlY2lmaWVkT3JpZW50KSk7XG4gIH1cblxuICAvLyBzZXQgb3BhY2l0eSBhbmQgZmlsbGVkIGlmIG5vdCBzcGVjaWZpZWQgaW4gbWFyayBjb25maWdcbiAgY29uc3Qgc3BlY2lmaWVkT3BhY2l0eSA9IG1hcmtEZWYub3BhY2l0eSAhPT0gdW5kZWZpbmVkID8gbWFya0RlZi5vcGFjaXR5IDogZ2V0TWFya0NvbmZpZygnb3BhY2l0eScsIG1hcmtEZWYsIGNvbmZpZyk7XG4gIGlmIChzcGVjaWZpZWRPcGFjaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBtYXJrRGVmLm9wYWNpdHkgPSBkZWZhdWx0T3BhY2l0eShtYXJrRGVmLnR5cGUsIGVuY29kaW5nKTtcbiAgfVxuXG4gIGNvbnN0IHNwZWNpZmllZEZpbGxlZCA9IG1hcmtEZWYuZmlsbGVkO1xuICBpZiAoc3BlY2lmaWVkRmlsbGVkID09PSB1bmRlZmluZWQpIHtcbiAgICBtYXJrRGVmLmZpbGxlZCA9IGZpbGxlZChtYXJrRGVmLCBjb25maWcpO1xuICB9XG4gIHJldHVybiBtYXJrRGVmO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0T3BhY2l0eShtYXJrOiBNYXJrLCBlbmNvZGluZzogRW5jb2Rpbmc8c3RyaW5nPikge1xuICBpZiAoY29udGFpbnMoW1BPSU5ULCBUSUNLLCBDSVJDTEUsIFNRVUFSRV0sIG1hcmspKSB7XG4gICAgLy8gcG9pbnQtYmFzZWQgbWFya3NcbiAgICBpZiAoIWlzQWdncmVnYXRlKGVuY29kaW5nKSkge1xuICAgICAgcmV0dXJuIDAuNztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZmlsbGVkKG1hcmtEZWY6IE1hcmtEZWYsIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IGZpbGxlZENvbmZpZyA9IGdldE1hcmtDb25maWcoJ2ZpbGxlZCcsIG1hcmtEZWYsIGNvbmZpZyk7XG4gIGNvbnN0IG1hcmsgPSBtYXJrRGVmLnR5cGU7XG4gIHJldHVybiBmaWxsZWRDb25maWcgIT09IHVuZGVmaW5lZCA/IGZpbGxlZENvbmZpZyA6IG1hcmsgIT09IFBPSU5UICYmIG1hcmsgIT09IExJTkUgJiYgbWFyayAhPT0gUlVMRTtcbn1cblxuZnVuY3Rpb24gb3JpZW50KG1hcms6IE1hcmssIGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+LCBzcGVjaWZpZWRPcmllbnQ6IE9yaWVudCk6IE9yaWVudCB7XG4gIHN3aXRjaCAobWFyaykge1xuICAgIGNhc2UgUE9JTlQ6XG4gICAgY2FzZSBDSVJDTEU6XG4gICAgY2FzZSBTUVVBUkU6XG4gICAgY2FzZSBURVhUOlxuICAgIGNhc2UgUkVDVDpcbiAgICAgIC8vIG9yaWVudCBpcyBtZWFuaW5nbGVzcyBmb3IgdGhlc2UgbWFya3MuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgeUlzUmFuZ2UgPSBlbmNvZGluZy55MjtcbiAgY29uc3QgeElzUmFuZ2UgPSBlbmNvZGluZy54MjtcblxuICBzd2l0Y2ggKG1hcmspIHtcbiAgICBjYXNlIEJBUjpcbiAgICAgIGlmICh5SXNSYW5nZSB8fCB4SXNSYW5nZSkge1xuICAgICAgICAvLyBSYW5nZWQgYmFyIGRvZXMgbm90IGFsd2F5cyBoYXZlIGNsZWFyIG9yaWVudGF0aW9uLCBzbyB3ZSBhbGxvdyBvdmVycmlkaW5nXG4gICAgICAgIGlmIChzcGVjaWZpZWRPcmllbnQpIHtcbiAgICAgICAgICByZXR1cm4gc3BlY2lmaWVkT3JpZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgeSBpcyByYW5nZSBhbmQgeCBpcyBub24tcmFuZ2UsIG5vbi1iaW4gUSwgeSBpcyBsaWtlbHkgYSBwcmViaW5uZWQgZmllbGRcbiAgICAgICAgY29uc3QgeERlZiA9IGVuY29kaW5nLng7XG4gICAgICAgIGlmICgheElzUmFuZ2UgJiYgaXNGaWVsZERlZih4RGVmKSAmJiB4RGVmLnR5cGUgPT09IFFVQU5USVRBVElWRSAmJiAheERlZi5iaW4pIHtcbiAgICAgICAgICByZXR1cm4gJ2hvcml6b250YWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgeCBpcyByYW5nZSBhbmQgeSBpcyBub24tcmFuZ2UsIG5vbi1iaW4gUSwgeCBpcyBsaWtlbHkgYSBwcmViaW5uZWQgZmllbGRcbiAgICAgICAgY29uc3QgeURlZiA9IGVuY29kaW5nLnk7XG4gICAgICAgIGlmICgheUlzUmFuZ2UgJiYgaXNGaWVsZERlZih5RGVmKSAmJiB5RGVmLnR5cGUgPT09IFFVQU5USVRBVElWRSAmJiAheURlZi5iaW4pIHtcbiAgICAgICAgICByZXR1cm4gJ3ZlcnRpY2FsJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICBjYXNlIFJVTEU6IC8vIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoXG4gICAgICAvLyByZXR1cm4gdW5kZWZpbmVkIGZvciBsaW5lIHNlZ21lbnQgcnVsZSBhbmQgYmFyIHdpdGggYm90aCBheGlzIHJhbmdlZFxuICAgICAgaWYgKHhJc1JhbmdlICYmIHlJc1JhbmdlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICBjYXNlIEFSRUE6IC8vIGludGVudGlvbmFsbHkgZmFsbCB0aHJvdWdoXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgcmFuZ2UgZm9yIGJvdGggeCBhbmQgeSwgeSAodmVydGljYWwpIGhhcyBoaWdoZXIgcHJlY2VkZW5jZS5cbiAgICAgIGlmICh5SXNSYW5nZSkge1xuICAgICAgICByZXR1cm4gJ3ZlcnRpY2FsJztcbiAgICAgIH0gZWxzZSBpZiAoeElzUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuICdob3Jpem9udGFsJztcbiAgICAgIH0gZWxzZSBpZiAobWFyayA9PT0gUlVMRSkge1xuICAgICAgICBpZiAoZW5jb2RpbmcueCAmJiAhZW5jb2RpbmcueSkge1xuICAgICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLnkgJiYgIWVuY29kaW5nLngpIHtcbiAgICAgICAgICByZXR1cm4gJ2hvcml6b250YWwnO1xuICAgICAgICB9XG4gICAgICB9XG5cblxuICAgIGNhc2UgTElORTogLy8gaW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoXG4gICAgY2FzZSBUSUNLOiAvLyBUaWNrIGlzIG9wcG9zaXRlIHRvIGJhciwgbGluZSwgYXJlYSBhbmQgbmV2ZXIgaGF2ZSByYW5nZWQgbWFyay5cblxuICAgICAgLyogdHNsaW50OmVuYWJsZSAqL1xuICAgICAgY29uc3QgeElzQ29udGludW91cyA9IGlzRmllbGREZWYoZW5jb2RpbmcueCkgJiYgaXNDb250aW51b3VzKGVuY29kaW5nLngpO1xuICAgICAgY29uc3QgeUlzQ29udGludW91cyA9IGlzRmllbGREZWYoZW5jb2RpbmcueSkgJiYgaXNDb250aW51b3VzKGVuY29kaW5nLnkpO1xuICAgICAgaWYgKHhJc0NvbnRpbnVvdXMgJiYgIXlJc0NvbnRpbnVvdXMpIHtcbiAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgICB9IGVsc2UgaWYgKCF4SXNDb250aW51b3VzICYmIHlJc0NvbnRpbnVvdXMpIHtcbiAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICB9IGVsc2UgaWYgKHhJc0NvbnRpbnVvdXMgJiYgeUlzQ29udGludW91cykge1xuICAgICAgICBjb25zdCB4RGVmID0gZW5jb2RpbmcueCBhcyBGaWVsZERlZjxzdHJpbmc+OyAvLyB3ZSBjYW4gY2FzdCBoZXJlIHNpbmNlIHRoZXkgYXJlIHN1cmVseSBmaWVsZERlZlxuICAgICAgICBjb25zdCB5RGVmID0gZW5jb2RpbmcueSBhcyBGaWVsZERlZjxzdHJpbmc+O1xuXG4gICAgICAgIGNvbnN0IHhJc1RlbXBvcmFsID0geERlZi50eXBlID09PSBURU1QT1JBTDtcbiAgICAgICAgY29uc3QgeUlzVGVtcG9yYWwgPSB5RGVmLnR5cGUgPT09IFRFTVBPUkFMO1xuXG4gICAgICAgIC8vIHRlbXBvcmFsIHdpdGhvdXQgdGltZVVuaXQgaXMgY29uc2lkZXJlZCBjb250aW51b3VzLCBidXQgYmV0dGVyIHNlcnZlcyBhcyBkaW1lbnNpb25cbiAgICAgICAgaWYgKHhJc1RlbXBvcmFsICYmICF5SXNUZW1wb3JhbCkge1xuICAgICAgICAgIHJldHVybiBtYXJrICE9PSAndGljaycgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICB9IGVsc2UgaWYgKCF4SXNUZW1wb3JhbCAmJiB5SXNUZW1wb3JhbCkge1xuICAgICAgICAgIHJldHVybiBtYXJrICE9PSAndGljaycgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF4RGVmLmFnZ3JlZ2F0ZSAmJiB5RGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICAgIHJldHVybiBtYXJrICE9PSAndGljaycgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgICAgICB9IGVsc2UgaWYgKHhEZWYuYWdncmVnYXRlICYmICF5RGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICAgIHJldHVybiBtYXJrICE9PSAndGljaycgPyAnaG9yaXpvbnRhbCcgOiAndmVydGljYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNwZWNpZmllZE9yaWVudCkge1xuICAgICAgICAgIC8vIFdoZW4gYW1iaWd1b3VzLCB1c2UgdXNlciBzcGVjaWZpZWQgb25lLlxuICAgICAgICAgIHJldHVybiBzcGVjaWZpZWRPcmllbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIShtYXJrID09PSBMSU5FICYmIGVuY29kaW5nLm9yZGVyKSkge1xuICAgICAgICAgIC8vIEV4Y2VwdCBmb3IgY29ubmVjdGVkIHNjYXR0ZXJwbG90LCB3ZSBzaG91bGQgbG9nIHdhcm5pbmcgZm9yIHVuY2xlYXIgb3JpZW50YXRpb24gb2YgUXhRIHBsb3RzLlxuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLnVuY2xlYXJPcmllbnRDb250aW51b3VzKG1hcmspKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ3ZlcnRpY2FsJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBEaXNjcmV0ZSB4IERpc2NyZXRlIGNhc2UsIHJldHVybiB1bmRlZmluZWQuXG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLnVuY2xlYXJPcmllbnREaXNjcmV0ZU9yRW1wdHkobWFyaykpO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICB9XG4gIHJldHVybiAndmVydGljYWwnO1xufVxuXG4iXX0= \ No newline at end of file diff --git a/build/src/compile/mark/line.d.ts b/build/src/compile/mark/line.d.ts new file mode 100644 index 0000000000..6c886c6377 --- /dev/null +++ b/build/src/compile/mark/line.d.ts @@ -0,0 +1,3 @@ +import { MarkCompiler } from './base'; +export declare const line: MarkCompiler; +export declare const trail: MarkCompiler; diff --git a/build/src/compile/mark/line.js b/build/src/compile/mark/line.js new file mode 100644 index 0000000000..0e6b798466 --- /dev/null +++ b/build/src/compile/mark/line.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +exports.line = { + vgMark: 'line', + encodeEntry: function (model) { + var width = model.width, height = model.height; + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model, { + vgChannel: 'strokeWidth' // VL's line size is strokeWidth + }), mixins.defined(model)); + } +}; +exports.trail = { + vgMark: 'trail', + encodeEntry: function (model) { + var width = model.width, height = model.height; + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model), mixins.defined(model)); + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBbUM7QUFDbkMsc0RBQWtDO0FBRXJCLFFBQUEsSUFBSSxHQUFpQjtJQUNoQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQ3JCLElBQUEsbUJBQUssRUFBRSxxQkFBTSxDQUFVO1FBRTlCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDakUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDakQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBQ25DLFNBQVMsRUFBRSxhQUFhLENBQUUsZ0NBQWdDO1NBQzNELENBQUMsRUFDQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUN4QjtJQUNKLENBQUM7Q0FDRixDQUFDO0FBR1csUUFBQSxLQUFLLEdBQWlCO0lBQ2pDLE1BQU0sRUFBRSxPQUFPO0lBQ2YsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDckIsSUFBQSxtQkFBSyxFQUFFLHFCQUFNLENBQVU7UUFFOUIsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNqRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFDeEI7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgbWl4aW5zIGZyb20gJy4vbWl4aW5zJztcbmltcG9ydCAqIGFzIHJlZiBmcm9tICcuL3ZhbHVlcmVmJztcblxuZXhwb3J0IGNvbnN0IGxpbmU6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnbGluZScsXG4gIGVuY29kZUVudHJ5OiAobW9kZWw6IFVuaXRNb2RlbCkgPT4ge1xuICAgIGNvbnN0IHt3aWR0aCwgaGVpZ2h0fSA9IG1vZGVsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3gnLCBtb2RlbCwgcmVmLm1pZCh3aWR0aCkpLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3knLCBtb2RlbCwgcmVmLm1pZChoZWlnaHQpKSxcbiAgICAgIC4uLm1peGlucy5ub25Qb3NpdGlvbignc2l6ZScsIG1vZGVsLCB7XG4gICAgICAgIHZnQ2hhbm5lbDogJ3N0cm9rZVdpZHRoJyAgLy8gVkwncyBsaW5lIHNpemUgaXMgc3Ryb2tlV2lkdGhcbiAgICAgIH0pLFxuICAgICAgLi4ubWl4aW5zLmRlZmluZWQobW9kZWwpXG4gICAgfTtcbiAgfVxufTtcblxuXG5leHBvcnQgY29uc3QgdHJhaWw6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAndHJhaWwnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBtb2RlbDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2luY2x1ZGUnLCBvcmllbnQ6ICdpZ25vcmUnfSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneCcsIG1vZGVsLCByZWYubWlkKHdpZHRoKSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCByZWYubWlkKGhlaWdodCkpLFxuICAgICAgLi4ubWl4aW5zLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwpLFxuICAgICAgLi4ubWl4aW5zLmRlZmluZWQobW9kZWwpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/mark/mark.d.ts b/build/src/compile/mark/mark.d.ts new file mode 100644 index 0000000000..4dfaa36cfc --- /dev/null +++ b/build/src/compile/mark/mark.d.ts @@ -0,0 +1,19 @@ +import { Encoding } from '../../encoding'; +import { Mark } from '../../mark'; +import { UnitModel } from '../unit'; +export declare function parseMarkGroup(model: UnitModel): any[]; +export declare function getSort(model: UnitModel): { + field: string; + order?: import("../../../node_modules/vega-util/index").Order; +} | { + field: string[]; + order?: import("../../../node_modules/vega-util/index").Order[]; +} | { + field: string; + order: string; +}; +/** + * Returns list of path grouping fields + * that the model's spec contains. + */ +export declare function pathGroupingFields(mark: Mark, encoding: Encoding): string[]; diff --git a/build/src/compile/mark/mark.js b/build/src/compile/mark/mark.js new file mode 100644 index 0000000000..e6d1c6fa31 --- /dev/null +++ b/build/src/compile/mark/mark.js @@ -0,0 +1,199 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var data_1 = require("../../data"); +var encoding_1 = require("../../encoding"); +var fielddef_1 = require("../../fielddef"); +var mark_1 = require("../../mark"); +var sort_1 = require("../../sort"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +var area_1 = require("./area"); +var bar_1 = require("./bar"); +var geoshape_1 = require("./geoshape"); +var line_1 = require("./line"); +var point_1 = require("./point"); +var rect_1 = require("./rect"); +var rule_1 = require("./rule"); +var text_1 = require("./text"); +var tick_1 = require("./tick"); +var markCompiler = { + area: area_1.area, + bar: bar_1.bar, + circle: point_1.circle, + geoshape: geoshape_1.geoshape, + line: line_1.line, + point: point_1.point, + rect: rect_1.rect, + rule: rule_1.rule, + square: point_1.square, + text: text_1.text, + tick: tick_1.tick, + trail: line_1.trail +}; +function parseMarkGroup(model) { + if (util_1.contains([mark_1.LINE, mark_1.AREA, mark_1.TRAIL], model.mark)) { + return parsePathMark(model); + } + else { + return getMarkGroups(model); + } +} +exports.parseMarkGroup = parseMarkGroup; +var FACETED_PATH_PREFIX = 'faceted_path_'; +function parsePathMark(model) { + var details = pathGroupingFields(model.mark, model.encoding); + var pathMarks = getMarkGroups(model, { + // If has subfacet for line/area group, need to use faceted data from below. + fromPrefix: (details.length > 0 ? FACETED_PATH_PREFIX : '') + }); + if (details.length > 0) { // have level of details - need to facet line into subgroups + // TODO: for non-stacked plot, map order to zindex. (Maybe rename order for layer to zindex?) + return [{ + name: model.getName('pathgroup'), + type: 'group', + from: { + facet: { + name: FACETED_PATH_PREFIX + model.requestDataName(data_1.MAIN), + data: model.requestDataName(data_1.MAIN), + groupby: details, + } + }, + encode: { + update: { + width: { field: { group: 'width' } }, + height: { field: { group: 'height' } } + } + }, + marks: pathMarks + }]; + } + else { + return pathMarks; + } +} +function getSort(model) { + var encoding = model.encoding, stack = model.stack, mark = model.mark, markDef = model.markDef; + var order = encoding.order; + if (!vega_util_1.isArray(order) && fielddef_1.isValueDef(order)) { + return undefined; + } + else if ((vega_util_1.isArray(order) || fielddef_1.isFieldDef(order)) && !stack) { + // Sort by the order field if it is specified and the field is not stacked. (For stacked field, order specify stack order.) + return common_1.sortParams(order, { expr: 'datum' }); + } + else if (mark_1.isPathMark(mark)) { + // For both line and area, we sort values based on dimension by default + var dimensionChannelDef = encoding[markDef.orient === 'horizontal' ? 'y' : 'x']; + if (fielddef_1.isFieldDef(dimensionChannelDef)) { + var s = dimensionChannelDef.sort; + var sortField = sort_1.isSortField(s) ? + fielddef_1.vgField({ + // FIXME: this op might not already exist? + // FIXME: what if dimensionChannel (x or y) contains custom domain? + aggregate: encoding_1.isAggregate(model.encoding) ? s.op : undefined, + field: s.field + }, { expr: 'datum' }) : + fielddef_1.vgField(dimensionChannelDef, { + // For stack with imputation, we only have bin_mid + binSuffix: model.stack && model.stack.impute ? 'mid' : undefined, + expr: 'datum' + }); + return { + field: sortField, + order: 'descending' + }; + } + return undefined; + } + return undefined; +} +exports.getSort = getSort; +function getMarkGroups(model, opt) { + if (opt === void 0) { opt = { fromPrefix: '' }; } + var mark = model.mark; + var clip = model.markDef.clip !== undefined ? + !!model.markDef.clip : scaleClip(model); + var style = common_1.getStyles(model.markDef); + var key = model.encoding.key; + var sort = getSort(model); + var postEncodingTransform = markCompiler[mark].postEncodingTransform ? markCompiler[mark].postEncodingTransform(model) : null; + return [tslib_1.__assign({ name: model.getName('marks'), type: markCompiler[mark].vgMark }, (clip ? { clip: true } : {}), (style ? { style: style } : {}), (key ? { key: { field: key.field } } : {}), (sort ? { sort: sort } : {}), { from: { data: opt.fromPrefix + model.requestDataName(data_1.MAIN) }, encode: { + update: markCompiler[mark].encodeEntry(model) + } }, (postEncodingTransform ? { + transform: postEncodingTransform + } : {}))]; +} +/** + * Returns list of path grouping fields + * that the model's spec contains. + */ +function pathGroupingFields(mark, encoding) { + return util_1.keys(encoding).reduce(function (details, channel) { + switch (channel) { + // x, y, x2, y2, lat, long, lat1, long2, order, tooltip, href, cursor should not cause lines to group + case 'x': + case 'y': + case 'order': + case 'tooltip': + case 'href': + case 'x2': + case 'y2': + case 'latitude': + case 'longitude': + case 'latitude2': + case 'longitude2': + // TODO: case 'cursor': + // text, shape, shouldn't be a part of line/trail/area + case 'text': + case 'shape': + return details; + case 'detail': + case 'key': + var channelDef = encoding[channel]; + if (channelDef) { + (vega_util_1.isArray(channelDef) ? channelDef : [channelDef]).forEach(function (fieldDef) { + if (!fieldDef.aggregate) { + details.push(fielddef_1.vgField(fieldDef, {})); + } + }); + } + return details; + case 'size': + if (mark === 'trail') { + // For trail, size should not group trail lines. + return details; + } + // For line, it should group lines. + /* tslint:disable */ + // intentional fall through + case 'color': + case 'fill': + case 'stroke': + case 'opacity': + // TODO strokeDashOffset: + /* tslint:enable */ + var fieldDef = fielddef_1.getFieldDef(encoding[channel]); + if (fieldDef && !fieldDef.aggregate) { + details.push(fielddef_1.vgField(fieldDef, {})); + } + return details; + default: + throw new Error("Bug: Channel " + channel + " unimplemented for line mark"); + } + }, []); +} +exports.pathGroupingFields = pathGroupingFields; +/** + * If scales are bound to interval selections, we want to automatically clip + * marks to account for panning/zooming interactions. We identify bound scales + * by the domainRaw property, which gets added during scale parsing. + */ +function scaleClip(model) { + var xScale = model.getScaleComponent('x'); + var yScale = model.getScaleComponent('y'); + return (xScale && xScale.get('domainRaw')) || + (yScale && yScale.get('domainRaw')) ? true : false; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBa0M7QUFDbEMsbUNBQWdDO0FBQ2hDLDJDQUFxRDtBQUNyRCwyQ0FBNEU7QUFDNUUsbUNBQStEO0FBQy9ELG1DQUF1QztBQUN2QyxtQ0FBMEM7QUFDMUMsb0NBQWdEO0FBRWhELCtCQUE0QjtBQUM1Qiw2QkFBMEI7QUFFMUIsdUNBQW9DO0FBQ3BDLCtCQUFtQztBQUNuQyxpQ0FBOEM7QUFDOUMsK0JBQTRCO0FBQzVCLCtCQUE0QjtBQUM1QiwrQkFBNEI7QUFDNUIsK0JBQTRCO0FBRzVCLElBQU0sWUFBWSxHQUFnQztJQUNoRCxJQUFJLGFBQUE7SUFDSixHQUFHLFdBQUE7SUFDSCxNQUFNLGdCQUFBO0lBQ04sUUFBUSxxQkFBQTtJQUNSLElBQUksYUFBQTtJQUNKLEtBQUssZUFBQTtJQUNMLElBQUksYUFBQTtJQUNKLElBQUksYUFBQTtJQUNKLE1BQU0sZ0JBQUE7SUFDTixJQUFJLGFBQUE7SUFDSixJQUFJLGFBQUE7SUFDSixLQUFLLGNBQUE7Q0FDTixDQUFDO0FBRUYsd0JBQStCLEtBQWdCO0lBQzdDLElBQUksZUFBUSxDQUFDLENBQUMsV0FBSSxFQUFFLFdBQUksRUFBRSxZQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDN0MsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDN0I7U0FBTTtRQUNMLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQU5ELHdDQU1DO0FBRUQsSUFBTSxtQkFBbUIsR0FBRyxlQUFlLENBQUM7QUFFNUMsdUJBQXVCLEtBQWdCO0lBQ3JDLElBQU0sT0FBTyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFD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O2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWdCLE9BQU8saUNBQThCLENBQUMsQ0FBQztTQUMxRTtJQUNILENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7QUE3REQsZ0RBNkRDO0FBRUQ7Ozs7R0FJRztBQUNILG1CQUFtQixLQUFnQjtJQUNqQyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge01BSU59IGZyb20gJy4uLy4uL2RhdGEnO1xuaW1wb3J0IHtFbmNvZGluZywgaXNBZ2dyZWdhdGV9IGZyb20gJy4uLy4uL2VuY29kaW5nJztcbmltcG9ydCB7Z2V0RmllbGREZWYsIGlzRmllbGREZWYsIGlzVmFsdWVEZWYsIHZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7QVJFQSwgaXNQYXRoTWFyaywgTElORSwgTWFyaywgVFJBSUx9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtpc1NvcnRGaWVsZH0gZnJvbSAnLi4vLi4vc29ydCc7XG5pbXBvcnQge2NvbnRhaW5zLCBrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7Z2V0U3R5bGVzLCBzb3J0UGFyYW1zfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHthcmVhfSBmcm9tICcuL2FyZWEnO1xuaW1wb3J0IHtiYXJ9IGZyb20gJy4vYmFyJztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHtnZW9zaGFwZX0gZnJvbSAnLi9nZW9zaGFwZSc7XG5pbXBvcnQge2xpbmUsIHRyYWlsfSBmcm9tICcuL2xpbmUnO1xuaW1wb3J0IHtjaXJjbGUsIHBvaW50LCBzcXVhcmV9IGZyb20gJy4vcG9pbnQnO1xuaW1wb3J0IHtyZWN0fSBmcm9tICcuL3JlY3QnO1xuaW1wb3J0IHtydWxlfSBmcm9tICcuL3J1bGUnO1xuaW1wb3J0IHt0ZXh0fSBmcm9tICcuL3RleHQnO1xuaW1wb3J0IHt0aWNrfSBmcm9tICcuL3RpY2snO1xuXG5cbmNvbnN0IG1hcmtDb21waWxlcjoge1ttIGluIE1hcmtdOiBNYXJrQ29tcGlsZXJ9ID0ge1xuICBhcmVhLFxuICBiYXIsXG4gIGNpcmNsZSxcbiAgZ2Vvc2hhcGUsXG4gIGxpbmUsXG4gIHBvaW50LFxuICByZWN0LFxuICBydWxlLFxuICBzcXVhcmUsXG4gIHRleHQsXG4gIHRpY2ssXG4gIHRyYWlsXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VNYXJrR3JvdXAobW9kZWw6IFVuaXRNb2RlbCk6IGFueVtdIHtcbiAgaWYgKGNvbnRhaW5zKFtMSU5FLCBBUkVBLCBUUkFJTF0sIG1vZGVsLm1hcmspKSB7XG4gICAgcmV0dXJuIHBhcnNlUGF0aE1hcmsobW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBnZXRNYXJrR3JvdXBzKG1vZGVsKTtcbiAgfVxufVxuXG5jb25zdCBGQUNFVEVEX1BBVEhfUFJFRklYID0gJ2ZhY2V0ZWRfcGF0aF8nO1xuXG5mdW5jdGlvbiBwYXJzZVBhdGhNYXJrKG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgY29uc3QgZGV0YWlscyA9IHBhdGhHcm91cGluZ0ZpZWxkcyhtb2RlbC5tYXJrLCBtb2RlbC5lbmNvZGluZyk7XG5cbiAgY29uc3QgcGF0aE1hcmtzID0gZ2V0TWFya0dyb3Vwcyhtb2RlbCwge1xuICAgIC8vIElmIGhhcyBzdWJmYWNldCBmb3IgbGluZS9hcmVhIGdyb3VwLCBuZWVkIHRvIHVzZSBmYWNldGVkIGRhdGEgZnJvbSBiZWxvdy5cbiAgICBmcm9tUHJlZml4OiAoZGV0YWlscy5sZW5ndGggPiAwID8gRkFDRVRFRF9QQVRIX1BSRUZJWCA6ICcnKVxuICB9KTtcblxuICBpZiAoZGV0YWlscy5sZW5ndGggPiAwKSB7IC8vIGhhdmUgbGV2ZWwgb2YgZGV0YWlscyAtIG5lZWQgdG8gZmFjZXQgbGluZSBpbnRvIHN1Ymdyb3Vwc1xuICAgIC8vIFRPRE86IGZvciBub24tc3RhY2tlZCBwbG90LCBtYXAgb3JkZXIgdG8gemluZGV4LiAoTWF5YmUgcmVuYW1lIG9yZGVyIGZvciBsYXllciB0byB6aW5kZXg/KVxuXG4gICAgcmV0dXJuIFt7XG4gICAgICBuYW1lOiBtb2RlbC5nZXROYW1lKCdwYXRoZ3JvdXAnKSxcbiAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICBmcm9tOiB7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgbmFtZTogRkFDRVRFRF9QQVRIX1BSRUZJWCArIG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKSxcbiAgICAgICAgICBkYXRhOiBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTiksXG4gICAgICAgICAgZ3JvdXBieTogZGV0YWlscyxcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVuY29kZToge1xuICAgICAgICB1cGRhdGU6IHtcbiAgICAgICAgICB3aWR0aDoge2ZpZWxkOiB7Z3JvdXA6ICd3aWR0aCd9fSxcbiAgICAgICAgICBoZWlnaHQ6IHtmaWVsZDoge2dyb3VwOiAnaGVpZ2h0J319XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtYXJrczogcGF0aE1hcmtzXG4gICAgfV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHBhdGhNYXJrcztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U29ydChtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHtlbmNvZGluZywgc3RhY2ssIG1hcmssIG1hcmtEZWZ9ID0gbW9kZWw7XG4gIGNvbnN0IG9yZGVyID0gZW5jb2Rpbmcub3JkZXI7XG4gIGlmICghaXNBcnJheShvcmRlcikgJiYgaXNWYWx1ZURlZihvcmRlcikpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKChpc0FycmF5KG9yZGVyKSB8fCBpc0ZpZWxkRGVmKG9yZGVyKSkgJiYgIXN0YWNrKSB7XG4gICAgLy8gU29ydCBieSB0aGUgb3JkZXIgZmllbGQgaWYgaXQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgZmllbGQgaXMgbm90IHN0YWNrZWQuIChGb3Igc3RhY2tlZCBmaWVsZCwgb3JkZXIgc3BlY2lmeSBzdGFjayBvcmRlci4pXG4gICAgcmV0dXJuIHNvcnRQYXJhbXMob3JkZXIsIHtleHByOiAnZGF0dW0nfSk7XG4gIH0gZWxzZSBpZiAoaXNQYXRoTWFyayhtYXJrKSkge1xuICAgIC8vIEZvciBib3RoIGxpbmUgYW5kIGFyZWEsIHdlIHNvcnQgdmFsdWVzIGJhc2VkIG9uIGRpbWVuc2lvbiBieSBkZWZhdWx0XG4gICAgY29uc3QgZGltZW5zaW9uQ2hhbm5lbERlZiA9IGVuY29kaW5nW21hcmtEZWYub3JpZW50ID09PSAnaG9yaXpvbnRhbCcgPyAneScgOiAneCddO1xuICAgIGlmIChpc0ZpZWxkRGVmKGRpbWVuc2lvbkNoYW5uZWxEZWYpKSB7XG4gICAgICBjb25zdCBzID0gZGltZW5zaW9uQ2hhbm5lbERlZi5zb3J0O1xuICAgICAgY29uc3Qgc29ydEZpZWxkID0gaXNTb3J0RmllbGQocykgP1xuICAgICAgICB2Z0ZpZWxkKHtcbiAgICAgICAgICAvLyBGSVhNRTogdGhpcyBvcCBtaWdodCBub3QgYWxyZWFkeSBleGlzdD9cbiAgICAgICAgICAvLyBGSVhNRTogd2hhdCBpZiBkaW1lbnNpb25DaGFubmVsICh4IG9yIHkpIGNvbnRhaW5zIGN1c3RvbSBkb21haW4/XG4gICAgICAgICAgYWdncmVnYXRlOiBpc0FnZ3JlZ2F0ZShtb2RlbC5lbmNvZGluZykgPyBzLm9wIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZpZWxkOiBzLmZpZWxkXG4gICAgICAgIH0sIHtleHByOiAnZGF0dW0nfSkgOlxuICAgICAgICB2Z0ZpZWxkKGRpbWVuc2lvbkNoYW5uZWxEZWYsIHtcbiAgICAgICAgICAvLyBGb3Igc3RhY2sgd2l0aCBpbXB1dGF0aW9uLCB3ZSBvbmx5IGhhdmUgYmluX21pZFxuICAgICAgICAgIGJpblN1ZmZpeDogbW9kZWwuc3RhY2sgJiYgbW9kZWwuc3RhY2suaW1wdXRlID8gJ21pZCcgOiB1bmRlZmluZWQsXG4gICAgICAgICAgZXhwcjogJ2RhdHVtJ1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHNvcnRGaWVsZCxcbiAgICAgICAgb3JkZXI6ICdkZXNjZW5kaW5nJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRNYXJrR3JvdXBzKG1vZGVsOiBVbml0TW9kZWwsIG9wdDoge1xuICBmcm9tUHJlZml4OiBzdHJpbmdcbn0gPSB7ZnJvbVByZWZpeDogJyd9KSB7XG4gIGNvbnN0IG1hcmsgPSBtb2RlbC5tYXJrO1xuXG4gIGNvbnN0IGNsaXAgPSBtb2RlbC5tYXJrRGVmLmNsaXAgIT09IHVuZGVmaW5lZCA/XG4gICAgISFtb2RlbC5tYXJrRGVmLmNsaXAgOiBzY2FsZUNsaXAobW9kZWwpO1xuICBjb25zdCBzdHlsZSA9IGdldFN0eWxlcyhtb2RlbC5tYXJrRGVmKTtcbiAgY29uc3Qga2V5ID0gbW9kZWwuZW5jb2Rpbmcua2V5O1xuICBjb25zdCBzb3J0ID0gZ2V0U29ydChtb2RlbCk7XG5cbiAgY29uc3QgcG9zdEVuY29kaW5nVHJhbnNmb3JtID0gbWFya0NvbXBpbGVyW21hcmtdLnBvc3RFbmNvZGluZ1RyYW5zZm9ybSA/IG1hcmtDb21waWxlclttYXJrXS5wb3N0RW5jb2RpbmdUcmFuc2Zvcm0obW9kZWwpIDogbnVsbDtcblxuICByZXR1cm4gW3tcbiAgICBuYW1lOiBtb2RlbC5nZXROYW1lKCdtYXJrcycpLFxuICAgIHR5cGU6IG1hcmtDb21waWxlclttYXJrXS52Z01hcmssXG4gICAgLi4uKGNsaXAgPyB7Y2xpcDogdHJ1ZX0gOiB7fSksXG4gICAgLi4uKHN0eWxlID8ge3N0eWxlfSA6IHt9KSxcbiAgICAuLi4oa2V5ID8ge2tleToge2ZpZWxkOiBrZXkuZmllbGR9fSA6IHt9KSxcbiAgICAuLi4oc29ydCA/IHtzb3J0fSA6IHt9KSxcbiAgICBmcm9tOiB7ZGF0YTogb3B0LmZyb21QcmVmaXggKyBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTil9LFxuICAgIGVuY29kZToge1xuICAgICAgdXBkYXRlOiBtYXJrQ29tcGlsZXJbbWFya10uZW5jb2RlRW50cnkobW9kZWwpXG4gICAgfSxcbiAgICAuLi4ocG9zdEVuY29kaW5nVHJhbnNmb3JtID8ge1xuICAgICAgdHJhbnNmb3JtOiBwb3N0RW5jb2RpbmdUcmFuc2Zvcm1cbiAgICB9IDoge30pXG4gIH1dO1xuXG59XG5cbi8qKlxuICogUmV0dXJucyBsaXN0IG9mIHBhdGggZ3JvdXBpbmcgZmllbGRzXG4gKiB0aGF0IHRoZSBtb2RlbCdzIHNwZWMgY29udGFpbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRoR3JvdXBpbmdGaWVsZHMobWFyazogTWFyaywgZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBrZXlzKGVuY29kaW5nKS5yZWR1Y2UoKGRldGFpbHMsIGNoYW5uZWwpID0+IHtcbiAgICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICAgIC8vIHgsIHksIHgyLCB5MiwgbGF0LCBsb25nLCBsYXQxLCBsb25nMiwgb3JkZXIsIHRvb2x0aXAsIGhyZWYsIGN1cnNvciBzaG91bGQgbm90IGNhdXNlIGxpbmVzIHRvIGdyb3VwXG4gICAgICBjYXNlICd4JzpcbiAgICAgIGNhc2UgJ3knOlxuICAgICAgY2FzZSAnb3JkZXInOlxuICAgICAgY2FzZSAndG9vbHRpcCc6XG4gICAgICBjYXNlICdocmVmJzpcbiAgICAgIGNhc2UgJ3gyJzpcbiAgICAgIGNhc2UgJ3kyJzpcblxuICAgICAgY2FzZSAnbGF0aXR1ZGUnOlxuICAgICAgY2FzZSAnbG9uZ2l0dWRlJzpcbiAgICAgIGNhc2UgJ2xhdGl0dWRlMic6XG4gICAgICBjYXNlICdsb25naXR1ZGUyJzpcbiAgICAgIC8vIFRPRE86IGNhc2UgJ2N1cnNvcic6XG5cbiAgICAgIC8vIHRleHQsIHNoYXBlLCBzaG91bGRuJ3QgYmUgYSBwYXJ0IG9mIGxpbmUvdHJhaWwvYXJlYVxuICAgICAgY2FzZSAndGV4dCc6XG4gICAgICBjYXNlICdzaGFwZSc6XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuXG4gICAgICBjYXNlICdkZXRhaWwnOlxuICAgICAgY2FzZSAna2V5JzpcbiAgICAgICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgICAgICBpZiAoY2hhbm5lbERlZikge1xuICAgICAgICAgIChpc0FycmF5KGNoYW5uZWxEZWYpID8gY2hhbm5lbERlZiA6IFtjaGFubmVsRGVmXSkuZm9yRWFjaCgoZmllbGREZWYpID0+IHtcbiAgICAgICAgICAgIGlmICghZmllbGREZWYuYWdncmVnYXRlKSB7XG4gICAgICAgICAgICAgIGRldGFpbHMucHVzaCh2Z0ZpZWxkKGZpZWxkRGVmLCB7fSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuXG4gICAgICBjYXNlICdzaXplJzpcbiAgICAgICAgaWYgKG1hcmsgPT09ICd0cmFpbCcpIHtcbiAgICAgICAgICAvLyBGb3IgdHJhaWwsIHNpemUgc2hvdWxkIG5vdCBncm91cCB0cmFpbCBsaW5lcy5cbiAgICAgICAgICByZXR1cm4gZGV0YWlscztcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgbGluZSwgaXQgc2hvdWxkIGdyb3VwIGxpbmVzLlxuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgICAgLy8gaW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoXG5cbiAgICAgIGNhc2UgJ2NvbG9yJzpcbiAgICAgIGNhc2UgJ2ZpbGwnOlxuICAgICAgY2FzZSAnc3Ryb2tlJzpcbiAgICAgIGNhc2UgJ29wYWNpdHknOlxuICAgICAgLy8gVE9ETyBzdHJva2VEYXNoT2Zmc2V0OlxuXG4gICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWY8c3RyaW5nPihlbmNvZGluZ1tjaGFubmVsXSk7XG4gICAgICAgIGlmIChmaWVsZERlZiAmJiAhZmllbGREZWYuYWdncmVnYXRlKSB7XG4gICAgICAgICAgZGV0YWlscy5wdXNoKHZnRmllbGQoZmllbGREZWYsIHt9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEJ1ZzogQ2hhbm5lbCAke2NoYW5uZWx9IHVuaW1wbGVtZW50ZWQgZm9yIGxpbmUgbWFya2ApO1xuICAgIH1cbiAgfSwgW10pO1xufVxuXG4vKipcbiAqIElmIHNjYWxlcyBhcmUgYm91bmQgdG8gaW50ZXJ2YWwgc2VsZWN0aW9ucywgd2Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IGNsaXBcbiAqIG1hcmtzIHRvIGFjY291bnQgZm9yIHBhbm5pbmcvem9vbWluZyBpbnRlcmFjdGlvbnMuIFdlIGlkZW50aWZ5IGJvdW5kIHNjYWxlc1xuICogYnkgdGhlIGRvbWFpblJhdyBwcm9wZXJ0eSwgd2hpY2ggZ2V0cyBhZGRlZCBkdXJpbmcgc2NhbGUgcGFyc2luZy5cbiAqL1xuZnVuY3Rpb24gc2NhbGVDbGlwKG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgY29uc3QgeFNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3gnKTtcbiAgY29uc3QgeVNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3knKTtcbiAgcmV0dXJuICh4U2NhbGUgJiYgeFNjYWxlLmdldCgnZG9tYWluUmF3JykpIHx8XG4gICAgKHlTY2FsZSAmJiB5U2NhbGUuZ2V0KCdkb21haW5SYXcnKSkgPyB0cnVlIDogZmFsc2U7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/mark/mixins.d.ts b/build/src/compile/mark/mixins.d.ts new file mode 100644 index 0000000000..d5be85977a --- /dev/null +++ b/build/src/compile/mark/mixins.d.ts @@ -0,0 +1,535 @@ +import { NONPOSITION_SCALE_CHANNELS } from '../../channel'; +import { ChannelDef, FieldDef } from '../../fielddef'; +import { VgEncodeEntry, VgValueRef } from '../../vega.schema'; +import { UnitModel } from '../unit'; +export declare function color(model: UnitModel, opt?: { + valueOnly: boolean; +}): VgEncodeEntry; +export declare type Ignore = Record<'size' | 'orient', 'ignore' | 'include'>; +export declare function baseEncodeEntry(model: UnitModel, ignore: Ignore): { + dir?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + font?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + path?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + text?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + shape?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + width?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + height?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + orient?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fill?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + stroke?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + opacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + size?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tooltip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + href?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + interpolate?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeWidth?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDash?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDashOffset?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fillOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeCap?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tension?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + align?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + angle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + baseline?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dx?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dy?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + radius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + limit?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + theta?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontSize?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontStyle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontWeight?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + cursor?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + url?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + clip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + xc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + yc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + innerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + outerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + startAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + endAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + ellipsis?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + defined?: VgValueRef | (VgValueRef & { + test?: string; + })[]; +}; +export declare function valueIfDefined(prop: string, value: string | number | boolean): VgEncodeEntry; +export declare function defined(model: UnitModel): VgEncodeEntry; +/** + * Return mixins for non-positional channels with scales. (Text doesn't have scale.) + */ +export declare function nonPosition(channel: typeof NONPOSITION_SCALE_CHANNELS[0], model: UnitModel, opt?: { + defaultValue?: number | string | boolean; + vgChannel?: string; + defaultRef?: VgValueRef; +}): VgEncodeEntry; +/** + * Return a mixin that include a Vega production rule for a Vega-Lite conditional channel definition. + * or a simple mixin if channel def has no condition. + */ +export declare function wrapCondition(model: UnitModel, channelDef: ChannelDef, vgChannel: string, refFn: (cDef: ChannelDef) => VgValueRef): VgEncodeEntry; +export declare function tooltip(model: UnitModel): VgEncodeEntry; +export declare function text(model: UnitModel, channel?: 'text' | 'href'): VgEncodeEntry; +export declare function bandPosition(fieldDef: FieldDef, channel: 'x' | 'y', model: UnitModel): { + dir?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + font?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + path?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + text?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + shape?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + width?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + height?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + orient?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fill?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + stroke?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + opacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + size?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tooltip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + href?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + interpolate?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeWidth?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDash?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDashOffset?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fillOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeCap?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tension?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + align?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + angle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + baseline?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dx?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dy?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + radius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + limit?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + theta?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontSize?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontStyle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontWeight?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + cursor?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + url?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + clip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + xc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + yc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + innerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + outerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + startAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + endAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + ellipsis?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + defined?: VgValueRef | (VgValueRef & { + test?: string; + })[]; +}; +export declare function centeredBandPosition(channel: 'x' | 'y', model: UnitModel, defaultPosRef: VgValueRef, defaultSizeRef: VgValueRef): { + dir?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + font?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + path?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + text?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + shape?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + width?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + height?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + orient?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + x2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + y2?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fill?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + stroke?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + opacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + size?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tooltip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + href?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + interpolate?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeWidth?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDash?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeDashOffset?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fillOpacity?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + strokeCap?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + tension?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + align?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + angle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + baseline?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dx?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + dy?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + radius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + limit?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + theta?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontSize?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontStyle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + fontWeight?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + cursor?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + url?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + clip?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + xc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + yc?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + innerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + outerRadius?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + startAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + endAngle?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + ellipsis?: VgValueRef | (VgValueRef & { + test?: string; + })[]; + defined?: VgValueRef | (VgValueRef & { + test?: string; + })[]; +}; +export declare function binnedPosition(fieldDef: FieldDef, channel: 'x' | 'y', scaleName: string, spacing: number, reverse: boolean): { + x2: VgValueRef; + x: VgValueRef; + y2?: undefined; + y?: undefined; +} | { + y2: VgValueRef; + y: VgValueRef; + x2?: undefined; + x?: undefined; +}; +/** + * Return mixins for point (non-band) position channels. + */ +export declare function pointPosition(channel: 'x' | 'y', model: UnitModel, defaultRef: VgValueRef | 'zeroOrMin' | 'zeroOrMax', vgChannel?: 'x' | 'y' | 'xc' | 'yc'): { + [x: string]: { + offset: any; + value?: string | number | boolean; + field?: string | { + datum?: string; + group?: string; + parent?: string; + }; + signal?: string; + scale?: string; + mult?: number; + band?: number | boolean | VgValueRef; + } | { + value?: string | number | boolean; + field?: string | { + datum?: string; + group?: string; + parent?: string; + }; + signal?: string; + scale?: string; + mult?: number; + offset?: number | VgValueRef; + band?: number | boolean | VgValueRef; + }; +}; +/** + * Return mixins for x2, y2. + * If channel is not specified, return one channel based on orientation. + */ +export declare function pointPosition2(model: UnitModel, defaultRef: 'zeroOrMin' | 'zeroOrMax', channel: 'x2' | 'y2'): { + [x: string]: { + offset: any; + value?: string | number | boolean; + field?: string | { + datum?: string; + group?: string; + parent?: string; + }; + signal?: string; + scale?: string; + mult?: number; + band?: number | boolean | VgValueRef; + } | { + value?: string | number | boolean; + field?: string | { + datum?: string; + group?: string; + parent?: string; + }; + signal?: string; + scale?: string; + mult?: number; + offset?: number | VgValueRef; + band?: number | boolean | VgValueRef; + }; +}; diff --git a/build/src/compile/mark/mixins.js b/build/src/compile/mark/mixins.js new file mode 100644 index 0000000000..f722e03342 --- /dev/null +++ b/build/src/compile/mark/mixins.js @@ -0,0 +1,274 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var predicate_1 = require("../../predicate"); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +var vega_schema_1 = require("../../vega.schema"); +var common_1 = require("../common"); +var selection_1 = require("../selection/selection"); +var ref = tslib_1.__importStar(require("./valueref")); +function color(model, opt) { + var _a, _b; + if (opt === void 0) { opt = { valueOnly: false }; } + var markDef = model.markDef, encoding = model.encoding, config = model.config; + var filled = markDef.filled, markType = markDef.type; + var configValue = { + fill: common_1.getMarkConfig('fill', markDef, config), + stroke: common_1.getMarkConfig('stroke', markDef, config), + color: common_1.getMarkConfig('color', markDef, config) + }; + var transparentIfNeeded = util_1.contains(['bar', 'point', 'circle', 'square', 'geoshape'], markType) ? 'transparent' : undefined; + var defaultValue = { + fill: markDef.fill || configValue.fill || + // If there is no fill, always fill symbols, bar, geoshape + // with transparent fills https://github.com/vega/vega-lite/issues/1316 + transparentIfNeeded, + stroke: markDef.stroke || configValue.stroke + }; + var colorVgChannel = filled ? 'fill' : 'stroke'; + var fillStrokeMarkDefAndConfig = tslib_1.__assign({}, (defaultValue.fill ? { + fill: { value: defaultValue.fill } + } : {}), (defaultValue.stroke ? { + stroke: { value: defaultValue.stroke } + } : {})); + if (encoding.fill || encoding.stroke) { + // ignore encoding.color, markDef.color, config.color + if (markDef.color) { + // warn for markDef.color (no need to warn encoding.color as it will be dropped in normalized already) + log.warn(log.message.droppingColor('property', { fill: 'fill' in encoding, stroke: 'stroke' in encoding })); + } + return tslib_1.__assign({}, nonPosition('fill', model, { defaultValue: defaultValue.fill || transparentIfNeeded }), nonPosition('stroke', model, { defaultValue: defaultValue.stroke })); + } + else if (encoding.color) { + return tslib_1.__assign({}, fillStrokeMarkDefAndConfig, nonPosition('color', model, { + vgChannel: colorVgChannel, + // apply default fill/stroke first, then color config, then transparent if needed. + defaultValue: markDef[colorVgChannel] || markDef.color || configValue[colorVgChannel] || configValue.color || (filled ? transparentIfNeeded : undefined) + })); + } + else if (markDef.fill || markDef.stroke) { + // Ignore markDef.color, config.color + if (markDef.color) { + log.warn(log.message.droppingColor('property', { fill: 'fill' in markDef, stroke: 'stroke' in markDef })); + } + return fillStrokeMarkDefAndConfig; + } + else if (markDef.color) { + return tslib_1.__assign({}, fillStrokeMarkDefAndConfig, (_a = {}, _a[colorVgChannel] = { value: markDef.color }, _a)); + } + else if (configValue.fill || configValue.stroke) { + // ignore config.color + return fillStrokeMarkDefAndConfig; + } + else if (configValue.color) { + return tslib_1.__assign({}, (transparentIfNeeded ? { fill: { value: 'transparent' } } : {}), (_b = {}, _b[colorVgChannel] = { value: configValue.color }, _b)); + } + return {}; +} +exports.color = color; +function baseEncodeEntry(model, ignore) { + return tslib_1.__assign({}, markDefProperties(model.markDef, ignore), color(model), nonPosition('opacity', model), tooltip(model), text(model, 'href')); +} +exports.baseEncodeEntry = baseEncodeEntry; +function markDefProperties(mark, ignore) { + return vega_schema_1.VG_MARK_CONFIGS.reduce(function (m, prop) { + if (mark[prop] !== undefined && ignore[prop] !== 'ignore') { + m[prop] = { value: mark[prop] }; + } + return m; + }, {}); +} +function valueIfDefined(prop, value) { + var _a; + if (value !== undefined) { + return _a = {}, _a[prop] = { value: value }, _a; + } + return undefined; +} +exports.valueIfDefined = valueIfDefined; +function validPredicate(vgRef) { + return vgRef + " !== null && !isNaN(" + vgRef + ")"; +} +function defined(model) { + if (model.config.invalidValues === 'filter') { + var fields = ['x', 'y'].map(function (channel) { + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + // Discrete domain scales can handle invalid values, but continuous scales can't. + if (scale_1.hasContinuousDomain(scaleType)) { + return model.vgField(channel, { expr: 'datum' }); + } + } + return undefined; + }) + .filter(function (field) { return !!field; }) + .map(validPredicate); + if (fields.length > 0) { + return { + defined: { signal: fields.join(' && ') } + }; + } + } + return {}; +} +exports.defined = defined; +/** + * Return mixins for non-positional channels with scales. (Text doesn't have scale.) + */ +function nonPosition(channel, model, opt) { + if (opt === void 0) { opt = {}; } + var defaultValue = opt.defaultValue, vgChannel = opt.vgChannel; + var defaultRef = opt.defaultRef || (defaultValue !== undefined ? { value: defaultValue } : undefined); + var channelDef = model.encoding[channel]; + return wrapCondition(model, channelDef, vgChannel || channel, function (cDef) { + return ref.midPoint(channel, cDef, model.scaleName(channel), model.getScaleComponent(channel), null, // No need to provide stack for non-position as it does not affect mid point + defaultRef); + }); +} +exports.nonPosition = nonPosition; +/** + * Return a mixin that include a Vega production rule for a Vega-Lite conditional channel definition. + * or a simple mixin if channel def has no condition. + */ +function wrapCondition(model, channelDef, vgChannel, refFn) { + var _a, _b; + var condition = channelDef && channelDef.condition; + var valueRef = refFn(channelDef); + if (condition) { + var conditions = vega_util_1.isArray(condition) ? condition : [condition]; + var vgConditions = conditions.map(function (c) { + var conditionValueRef = refFn(c); + var test = fielddef_1.isConditionalSelection(c) ? selection_1.selectionPredicate(model, c.selection) : predicate_1.expression(model, c.test); + return tslib_1.__assign({ test: test }, conditionValueRef); + }); + return _a = {}, + _a[vgChannel] = vgConditions.concat((valueRef !== undefined ? [valueRef] : [])), + _a; + } + else { + return valueRef !== undefined ? (_b = {}, _b[vgChannel] = valueRef, _b) : {}; + } +} +exports.wrapCondition = wrapCondition; +function tooltip(model) { + var channel = 'tooltip'; + var channelDef = model.encoding[channel]; + if (vega_util_1.isArray(channelDef)) { + var keyValues = channelDef.map(function (fieldDef) { + var key = fieldDef.title !== undefined ? fieldDef.title : fielddef_1.vgField(fieldDef, { binSuffix: 'range' }); + var value = ref.text(fieldDef, model.config).signal; + return "\"" + key + "\": " + value; + }); + return { tooltip: { signal: "{" + keyValues.join(', ') + "}" } }; + } + else { + // if not an array, behave just like text + return textCommon(model, channel, channelDef); + } +} +exports.tooltip = tooltip; +function text(model, channel) { + if (channel === void 0) { channel = 'text'; } + var channelDef = model.encoding[channel]; + return textCommon(model, channel, channelDef); +} +exports.text = text; +function textCommon(model, channel, channelDef) { + return wrapCondition(model, channelDef, channel, function (cDef) { return ref.text(cDef, model.config); }); +} +function bandPosition(fieldDef, channel, model) { + var _a, _b, _c; + var scaleName = model.scaleName(channel); + var sizeChannel = channel === 'x' ? 'width' : 'height'; + if (model.encoding.size || model.markDef.size !== undefined) { + var orient = model.markDef.orient; + if (orient) { + var centeredBandPositionMixins = (_a = {}, + // Use xc/yc and place the mark at the middle of the band + // This way we never have to deal with size's condition for x/y position. + _a[channel + 'c'] = ref.fieldRef(fieldDef, scaleName, {}, { band: 0.5 }), + _a); + if (fielddef_1.getFieldDef(model.encoding.size)) { + return tslib_1.__assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel })); + } + else if (fielddef_1.isValueDef(model.encoding.size)) { + return tslib_1.__assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel })); + } + else if (model.markDef.size !== undefined) { + return tslib_1.__assign({}, centeredBandPositionMixins, (_b = {}, _b[sizeChannel] = { value: model.markDef.size }, _b)); + } + } + else { + log.warn(log.message.cannotApplySizeToNonOrientedMark(model.markDef.type)); + } + } + return _c = {}, + _c[channel] = ref.fieldRef(fieldDef, scaleName, { binSuffix: 'range' }), + _c[sizeChannel] = ref.bandRef(scaleName), + _c; +} +exports.bandPosition = bandPosition; +function centeredBandPosition(channel, model, defaultPosRef, defaultSizeRef) { + var centerChannel = channel === 'x' ? 'xc' : 'yc'; + var sizeChannel = channel === 'x' ? 'width' : 'height'; + return tslib_1.__assign({}, pointPosition(channel, model, defaultPosRef, centerChannel), nonPosition('size', model, { defaultRef: defaultSizeRef, vgChannel: sizeChannel })); +} +exports.centeredBandPosition = centeredBandPosition; +function binnedPosition(fieldDef, channel, scaleName, spacing, reverse) { + if (channel === 'x') { + return { + x2: ref.bin(fieldDef, scaleName, 'start', reverse ? 0 : spacing), + x: ref.bin(fieldDef, scaleName, 'end', reverse ? spacing : 0) + }; + } + else { + return { + y2: ref.bin(fieldDef, scaleName, 'start', reverse ? spacing : 0), + y: ref.bin(fieldDef, scaleName, 'end', reverse ? 0 : spacing) + }; + } +} +exports.binnedPosition = binnedPosition; +/** + * Return mixins for point (non-band) position channels. + */ +function pointPosition(channel, model, defaultRef, vgChannel) { + // TODO: refactor how refer to scale as discussed in https://github.com/vega/vega-lite/pull/1613 + var _a; + var encoding = model.encoding, mark = model.mark, stack = model.stack; + var channelDef = encoding[channel]; + var scaleName = model.scaleName(channel); + var scale = model.getScaleComponent(channel); + var offset = ref.getOffset(channel, model.markDef); + var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ? + // use geopoint output if there are lat/long and there is no point position overriding lat/long. + { field: model.getName(channel) } : tslib_1.__assign({}, ref.stackable(channel, encoding[channel], scaleName, scale, stack, ref.getDefaultRef(defaultRef, channel, scaleName, scale, mark)), (offset ? { offset: offset } : {})); + return _a = {}, + _a[vgChannel || channel] = valueRef, + _a; +} +exports.pointPosition = pointPosition; +/** + * Return mixins for x2, y2. + * If channel is not specified, return one channel based on orientation. + */ +function pointPosition2(model, defaultRef, channel) { + var _a; + var encoding = model.encoding, mark = model.mark, stack = model.stack; + var baseChannel = channel === 'x2' ? 'x' : 'y'; + var channelDef = encoding[baseChannel]; + var scaleName = model.scaleName(baseChannel); + var scale = model.getScaleComponent(baseChannel); + var offset = ref.getOffset(channel, model.markDef); + var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ? + // use geopoint output if there are lat2/long2 and there is no point position2 overriding lat2/long2. + { field: model.getName(channel) } : tslib_1.__assign({}, ref.stackable2(channel, channelDef, encoding[channel], scaleName, scale, stack, ref.getDefaultRef(defaultRef, baseChannel, scaleName, scale, mark)), (offset ? { offset: offset } : {})); + return _a = {}, _a[channel] = valueRef, _a; +} +exports.pointPosition2 = pointPosition2; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9taXhpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQWtDO0FBR2xDLDJDQVV3QjtBQUN4QixxREFBaUM7QUFFakMsNkNBQTJDO0FBQzNDLHFDQUFnRDtBQUNoRCxtQ0FBb0M7QUFDcEMsaURBQTZFO0FBQzdFLG9DQUF3QztBQUN4QyxvREFBMEQ7QUFFMUQsc0RBQWtDO0FBRWxDLGVBQXNCLEtBQWdCLEVBQUUsR0FBOEM7O0lBQTlDLG9CQUFBLEVBQUEsUUFBNkIsU0FBUyxFQUFFLEtBQUssRUFBQztJQUM3RSxJQUFBLHVCQUFPLEVBQUUseUJBQVEsRUFBRSxxQkFBTSxDQUFVO0lBQ25DLElBQUEsdUJBQU0sRUFBRSx1QkFBYyxDQUFZO0lBRXpDLElBQU0sV0FBVyxHQUFHO1FBQ2xCLElBQUksRUFBRSxzQkFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQzVDLE1BQU0sRUFBRSxzQkFBYSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQ2hELEtBQUssRUFBRSxzQkFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0tBQy9DLENBQUM7SUFFRixJQUFNLG1CQUFtQixHQUFHLGVBQVEsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFN0gsSUFBTSxZQUFZLEdBQUc7UUFDbkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLElBQUk7WUFDdEMsMERBQTBEO1lBQzFELHVFQUF1RTtZQUNyRSxtQkFBbUI7UUFDckIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLE1BQU07S0FDN0MsQ0FBQztJQUVGLElBQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFFbEQsSUFBTSwwQkFBMEIsd0JBQzNCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEIsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUM7S0FDakMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4QixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBQztLQUNyQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDUixDQUFDO0lBRUYsSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDcEMscURBQXFEO1FBQ3JELElBQUksT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNqQix1R0FBdUc7WUFDdkcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQztTQUMzRztRQUVELDRCQUNLLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxJQUFJLElBQUksbUJBQW1CLEVBQUMsQ0FBQyxFQUNwRixXQUFXLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsTUFBTSxFQUFDLENBQUMsRUFDcEU7S0FDSDtTQUFNLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtRQUV6Qiw0QkFDSywwQkFBMEIsRUFFMUIsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUU7WUFDN0IsU0FBUyxFQUFFLGNBQWM7WUFDekIsa0ZBQWtGO1lBQ2xGLFlBQVksRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLElBQUksV0FBVyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUN6SixDQUFDLEVBQ0Y7S0FDSDtTQUFNLElBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1FBQ3pDLHFDQUFxQztRQUNyQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztTQUN6RztRQUNELE9BQU8sMEJBQTBCLENBQUM7S0FDbkM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7UUFDeEIsNEJBQ0ssMEJBQTBCLGVBRzVCLGNBQWMsSUFBRyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFDLE9BQ3hDO0tBQ0g7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtRQUNqRCxzQkFBc0I7UUFDdEIsT0FBTywwQkFBMEIsQ0FBQztLQUNuQztTQUFNLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRTtRQUM1Qiw0QkFDSyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZUFDN0QsY0FBYyxJQUFHLEVBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUMsT0FDNUM7S0FDSDtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQTVFRCxzQkE0RUM7QUFJRCx5QkFBZ0MsS0FBZ0IsRUFBRSxNQUFjO0lBQzlELDRCQUNLLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQ3hDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFDWixXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUM3QixPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ2QsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFDdEI7QUFDSixDQUFDO0FBUkQsMENBUUM7QUFFRCwyQkFBMkIsSUFBYSxFQUFFLE1BQWM7SUFDdEQsT0FBTyw2QkFBZSxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsRUFBRSxJQUFJO1FBQ3BDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3pELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQztTQUMvQjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELHdCQUErQixJQUFZLEVBQUUsS0FBZ0M7O0lBQzNFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUN2QixnQkFBUSxHQUFDLElBQUksSUFBRyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsS0FBRTtLQUNqQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFMRCx3Q0FLQztBQUVELHdCQUF3QixLQUFhO0lBQ25DLE9BQVUsS0FBSyw0QkFBdUIsS0FBSyxNQUFHLENBQUM7QUFDakQsQ0FBQztBQUVELGlCQUF3QixLQUFnQjtJQUN0QyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLFFBQVEsRUFBRTtRQUMzQyxJQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxPQUE2QjtZQUN4RCxJQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEQsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLElBQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRTdDLGlGQUFpRjtnQkFDakYsSUFBSSwyQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDbEMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssRUFBUCxDQUFPLENBQUM7YUFDeEIsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXZCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsT0FBTztnQkFDTCxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQzthQUN2QyxDQUFDO1NBQ0g7S0FDRjtJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQXpCRCwwQkF5QkM7QUFFRDs7R0FFRztBQUNILHFCQUE0QixPQUE2QyxFQUFFLEtBQWdCLEVBQUUsR0FBaUc7SUFBakcsb0JBQUEsRUFBQSxRQUFpRztJQUNyTCxJQUFBLCtCQUFZLEVBQUUseUJBQVMsQ0FBUTtJQUN0QyxJQUFNLFVBQVUsR0FBRyxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXRHLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFM0MsT0FBTyxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLElBQUksT0FBTyxFQUFFLFVBQUMsSUFBSTtRQUNqRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQ2pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFDdkMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUNoQyxJQUFJLEVBQUUsNEVBQTRFO1FBQ2xGLFVBQVUsQ0FDWCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBZEQsa0NBY0M7QUFFRDs7O0dBR0c7QUFDSCx1QkFDSSxLQUFnQixFQUFFLFVBQThCLEVBQUUsU0FBaUIsRUFDbkUsS0FBK0M7O0lBRWpELElBQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDO0lBQ3JELElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxJQUFJLFNBQVMsRUFBRTtRQUNiLElBQU0sVUFBVSxHQUFHLG1CQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNoRSxJQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQztZQUNwQyxJQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuQyxJQUFNLElBQUksR0FBRyxpQ0FBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQWtCLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVHLDBCQUNFLElBQUksTUFBQSxJQUNELGlCQUFpQixFQUNwQjtRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0g7WUFDRSxHQUFDLFNBQVMsSUFDTCxZQUFZLFFBQ1osQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDOUM7ZUFDRDtLQUNIO1NBQU07UUFDTCxPQUFPLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxXQUFFLEdBQUMsU0FBUyxJQUFHLFFBQVEsTUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzlEO0FBQ0gsQ0FBQztBQXpCRCxzQ0F5QkM7QUFFRCxpQkFBd0IsS0FBZ0I7SUFDdEMsSUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQzFCLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsSUFBSSxtQkFBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3ZCLElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQyxRQUFRO1lBQ3hDLElBQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1lBQ3BHLElBQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEQsT0FBTyxPQUFJLEdBQUcsWUFBTSxLQUFPLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQUksU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBRyxFQUFDLEVBQUMsQ0FBQztLQUN6RDtTQUFNO1FBQ0wseUNBQXlDO1FBQ3pDLE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDL0M7QUFDSCxDQUFDO0FBZEQsMEJBY0M7QUFFRCxjQUFxQixLQUFnQixFQUFFLE9BQWlDO0lBQWpDLHdCQUFBLEVBQUEsZ0JBQWlDO0lBQ3RFLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBSEQsb0JBR0M7QUFFRCxvQkFBb0IsS0FBZ0IsRUFBRSxPQUFvQyxFQUFFLFVBQXFHO0lBQy9LLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQUMsSUFBSSxJQUFLLE9BQUEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUE1QixDQUE0QixDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUVELHNCQUE2QixRQUEwQixFQUFFLE9BQWdCLEVBQUUsS0FBZ0I7O0lBQ3pGLElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0MsSUFBTSxXQUFXLEdBQUcsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFFekQsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDM0QsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDcEMsSUFBSSxNQUFNLEVBQUU7WUFDVixJQUFNLDBCQUEwQjtnQkFDOUIseURBQXlEO2dCQUN6RCx5RUFBeUU7Z0JBQ3pFLEdBQUMsT0FBTyxHQUFDLEdBQUcsSUFBRyxHQUFHLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDO21CQUNsRSxDQUFDO1lBRUYsSUFBSSxzQkFBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BDLDRCQUNLLDBCQUEwQixFQUMxQixXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxFQUN2RDthQUNIO2lCQUFNLElBQUkscUJBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUMxQyw0QkFDSywwQkFBMEIsRUFDMUIsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFDLENBQUMsRUFDdkQ7YUFDSDtpQkFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDM0MsNEJBQ0ssMEJBQTBCLGVBQzVCLFdBQVcsSUFBRyxFQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksRUFBQyxPQUMxQzthQUNIO1NBQ0Y7YUFBTTtZQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDNUU7S0FDRjtJQUNEO1FBQ0UsR0FBQyxPQUFPLElBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO1FBQ2xFLEdBQUMsV0FBVyxJQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1dBQ3JDO0FBQ0osQ0FBQztBQXJDRCxvQ0FxQ0M7QUFFRCw4QkFBcUMsT0FBa0IsRUFBRSxLQUFnQixFQUFFLGFBQXlCLEVBQUUsY0FBMEI7SUFDOUgsSUFBTSxhQUFhLEdBQWdCLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pFLElBQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3pELDRCQUNLLGFBQWEsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsRUFDM0QsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxFQUNuRjtBQUNKLENBQUM7QUFQRCxvREFPQztBQUVELHdCQUErQixRQUEwQixFQUFFLE9BQWdCLEVBQUUsU0FBaUIsRUFBRSxPQUFlLEVBQUUsT0FBZ0I7SUFDL0gsSUFBSSxPQUFPLEtBQUssR0FBRyxFQUFFO1FBQ25CLE9BQU87WUFDTCxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ2hFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUQsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPO1lBQ0wsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1NBQzlELENBQUM7S0FDSDtBQUNILENBQUM7QUFaRCx3Q0FZQztBQUdEOztHQUVHO0FBQ0gsdUJBQThCLE9BQWdCLEVBQUUsS0FBZ0IsRUFBRSxVQUFrRCxFQUFFLFNBQTZCO0lBQ2pKLGdHQUFnRzs7SUFFekYsSUFBQSx5QkFBUSxFQUFFLGlCQUFJLEVBQUUsbUJBQUssQ0FBVTtJQUV0QyxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFHL0MsSUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBR3JELElBQU0sUUFBUSxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN6RSxnR0FBZ0c7UUFDaEcsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLENBQUMsc0JBRTVCLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDbEUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQy9ELEVBQ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FBQSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQzFCLENBQUM7SUFFSjtRQUNFLEdBQUMsU0FBUyxJQUFJLE9BQU8sSUFBRyxRQUFRO1dBQ2hDO0FBQ0osQ0FBQztBQTFCRCxzQ0EwQkM7QUFFRDs7O0dBR0c7QUFDSCx3QkFBK0IsS0FBZ0IsRUFBRSxVQUFxQyxFQUFFLE9BQW9COztJQUNuRyxJQUFBLHlCQUFRLEVBQUUsaUJBQUksRUFBRSxtQkFBSyxDQUFVO0lBRXRDLElBQU0sV0FBVyxHQUFHLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pELElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxJQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxJQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFckQsSUFBTSxRQUFRLEdBQUcsQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLHFHQUFxRztRQUNyRyxFQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUEsQ0FBQyxzQkFFM0IsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFDL0UsR0FBRyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQ25FLEVBQ0UsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsTUFBTSxRQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQzVCLENBQUM7SUFFSixnQkFBUSxHQUFDLE9BQU8sSUFBRyxRQUFRLEtBQUU7QUFDL0IsQ0FBQztBQXJCRCx3Q0FxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7Tk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMsIFBvc2l0aW9uU2NhbGVDaGFubmVsfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7XG4gIENoYW5uZWxEZWYsXG4gIEZpZWxkRGVmLFxuICBGaWVsZERlZldpdGhDb25kaXRpb24sXG4gIGdldEZpZWxkRGVmLFxuICBpc0NvbmRpdGlvbmFsU2VsZWN0aW9uLFxuICBpc1ZhbHVlRGVmLFxuICBUZXh0RmllbGREZWYsXG4gIFZhbHVlRGVmV2l0aENvbmRpdGlvbixcbiAgdmdGaWVsZCxcbn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge01hcmtEZWZ9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtleHByZXNzaW9ufSBmcm9tICcuLi8uLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtoYXNDb250aW51b3VzRG9tYWlufSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2NvbnRhaW5zfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VkdfTUFSS19DT05GSUdTLCBWZ0VuY29kZUVudHJ5LCBWZ1ZhbHVlUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2dldE1hcmtDb25maWd9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge3NlbGVjdGlvblByZWRpY2F0ZX0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcihtb2RlbDogVW5pdE1vZGVsLCBvcHQ6IHt2YWx1ZU9ubHk6IGJvb2xlYW59ID0ge3ZhbHVlT25seTogZmFsc2V9KTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHttYXJrRGVmLCBlbmNvZGluZywgY29uZmlnfSA9IG1vZGVsO1xuICBjb25zdCB7ZmlsbGVkLCB0eXBlOiBtYXJrVHlwZX0gPSBtYXJrRGVmO1xuXG4gIGNvbnN0IGNvbmZpZ1ZhbHVlID0ge1xuICAgIGZpbGw6IGdldE1hcmtDb25maWcoJ2ZpbGwnLCBtYXJrRGVmLCBjb25maWcpLFxuICAgIHN0cm9rZTogZ2V0TWFya0NvbmZpZygnc3Ryb2tlJywgbWFya0RlZiwgY29uZmlnKSxcbiAgICBjb2xvcjogZ2V0TWFya0NvbmZpZygnY29sb3InLCBtYXJrRGVmLCBjb25maWcpXG4gIH07XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRJZk5lZWRlZCA9IGNvbnRhaW5zKFsnYmFyJywgJ3BvaW50JywgJ2NpcmNsZScsICdzcXVhcmUnLCAnZ2Vvc2hhcGUnXSwgbWFya1R5cGUpID8gJ3RyYW5zcGFyZW50JyA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSB7XG4gICAgZmlsbDogbWFya0RlZi5maWxsIHx8IGNvbmZpZ1ZhbHVlLmZpbGwgfHxcbiAgICAvLyBJZiB0aGVyZSBpcyBubyBmaWxsLCBhbHdheXMgZmlsbCBzeW1ib2xzLCBiYXIsIGdlb3NoYXBlXG4gICAgLy8gd2l0aCB0cmFuc3BhcmVudCBmaWxscyBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzEzMTZcbiAgICAgIHRyYW5zcGFyZW50SWZOZWVkZWQsXG4gICAgc3Ryb2tlOiBtYXJrRGVmLnN0cm9rZSB8fCBjb25maWdWYWx1ZS5zdHJva2VcbiAgfTtcblxuICBjb25zdCBjb2xvclZnQ2hhbm5lbCA9IGZpbGxlZCA/ICdmaWxsJyA6ICdzdHJva2UnO1xuXG4gIGNvbnN0IGZpbGxTdHJva2VNYXJrRGVmQW5kQ29uZmlnOiBWZ0VuY29kZUVudHJ5ID0ge1xuICAgIC4uLihkZWZhdWx0VmFsdWUuZmlsbCA/IHtcbiAgICAgIGZpbGw6IHt2YWx1ZTogZGVmYXVsdFZhbHVlLmZpbGx9XG4gICAgfSA6IHt9KSxcbiAgICAuLi4oZGVmYXVsdFZhbHVlLnN0cm9rZSA/IHtcbiAgICAgIHN0cm9rZToge3ZhbHVlOiBkZWZhdWx0VmFsdWUuc3Ryb2tlfVxuICAgIH0gOiB7fSksXG4gIH07XG5cbiAgaWYgKGVuY29kaW5nLmZpbGwgfHwgZW5jb2Rpbmcuc3Ryb2tlKSB7XG4gICAgLy8gaWdub3JlIGVuY29kaW5nLmNvbG9yLCBtYXJrRGVmLmNvbG9yLCBjb25maWcuY29sb3JcbiAgICBpZiAobWFya0RlZi5jb2xvcikge1xuICAgICAgLy8gd2FybiBmb3IgbWFya0RlZi5jb2xvciAgKG5vIG5lZWQgdG8gd2FybiBlbmNvZGluZy5jb2xvciBhcyBpdCB3aWxsIGJlIGRyb3BwZWQgaW4gbm9ybWFsaXplZCBhbHJlYWR5KVxuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcigncHJvcGVydHknLCB7ZmlsbDogJ2ZpbGwnIGluIGVuY29kaW5nLCBzdHJva2U6ICdzdHJva2UnIGluIGVuY29kaW5nfSkpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5ub25Qb3NpdGlvbignZmlsbCcsIG1vZGVsLCB7ZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUuZmlsbCB8fCB0cmFuc3BhcmVudElmTmVlZGVkfSksXG4gICAgICAuLi5ub25Qb3NpdGlvbignc3Ryb2tlJywgbW9kZWwsIHtkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZS5zdHJva2V9KVxuICAgIH07XG4gIH0gZWxzZSBpZiAoZW5jb2RpbmcuY29sb3IpIHtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5maWxsU3Ryb2tlTWFya0RlZkFuZENvbmZpZyxcbiAgICAgIC8vIG92ZXJyaWRlIHRoZW0gd2l0aCBlbmNvZGVkIGNvbG9yIGZpZWxkXG4gICAgICAuLi5ub25Qb3NpdGlvbignY29sb3InLCBtb2RlbCwge1xuICAgICAgICB2Z0NoYW5uZWw6IGNvbG9yVmdDaGFubmVsLFxuICAgICAgICAvLyBhcHBseSBkZWZhdWx0IGZpbGwvc3Ryb2tlIGZpcnN0LCB0aGVuIGNvbG9yIGNvbmZpZywgdGhlbiB0cmFuc3BhcmVudCBpZiBuZWVkZWQuXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogbWFya0RlZltjb2xvclZnQ2hhbm5lbF0gfHwgbWFya0RlZi5jb2xvciB8fCBjb25maWdWYWx1ZVtjb2xvclZnQ2hhbm5lbF0gfHwgY29uZmlnVmFsdWUuY29sb3IgfHwgKGZpbGxlZCA/IHRyYW5zcGFyZW50SWZOZWVkZWQgOiB1bmRlZmluZWQpXG4gICAgICB9KVxuICAgIH07XG4gIH0gZWxzZSBpZiAobWFya0RlZi5maWxsIHx8IG1hcmtEZWYuc3Ryb2tlKSB7XG4gICAgLy8gSWdub3JlIG1hcmtEZWYuY29sb3IsIGNvbmZpZy5jb2xvclxuICAgIGlmIChtYXJrRGVmLmNvbG9yKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kcm9wcGluZ0NvbG9yKCdwcm9wZXJ0eScsIHtmaWxsOiAnZmlsbCcgaW4gbWFya0RlZiwgc3Ryb2tlOiAnc3Ryb2tlJyBpbiBtYXJrRGVmfSkpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsbFN0cm9rZU1hcmtEZWZBbmRDb25maWc7XG4gIH0gZWxzZSBpZiAobWFya0RlZi5jb2xvcikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5maWxsU3Ryb2tlTWFya0RlZkFuZENvbmZpZywgLy8gaW4gdGhpcyBjYXNlLCBmaWxsU3Ryb2tlTWFya0RlZkFuZENvbmZpZyBvbmx5IGluY2x1ZGUgY29uZmlnXG5cbiAgICAgIC8vIG92ZXJyaWRlIGNvbmZpZyB3aXRoIG1hcmtEZWYuY29sb3JcbiAgICAgIFtjb2xvclZnQ2hhbm5lbF06IHt2YWx1ZTogbWFya0RlZi5jb2xvcn1cbiAgICB9O1xuICB9IGVsc2UgaWYgKGNvbmZpZ1ZhbHVlLmZpbGwgfHwgY29uZmlnVmFsdWUuc3Ryb2tlKSB7XG4gICAgLy8gaWdub3JlIGNvbmZpZy5jb2xvclxuICAgIHJldHVybiBmaWxsU3Ryb2tlTWFya0RlZkFuZENvbmZpZztcbiAgfSBlbHNlIGlmIChjb25maWdWYWx1ZS5jb2xvcikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odHJhbnNwYXJlbnRJZk5lZWRlZCA/IHtmaWxsOiB7dmFsdWU6ICd0cmFuc3BhcmVudCd9fSA6IHt9KSxcbiAgICAgIFtjb2xvclZnQ2hhbm5lbF06IHt2YWx1ZTogY29uZmlnVmFsdWUuY29sb3J9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCB0eXBlIElnbm9yZSA9IFJlY29yZDwnc2l6ZScgfCAnb3JpZW50JywgJ2lnbm9yZScgfCAnaW5jbHVkZSc+O1xuXG5leHBvcnQgZnVuY3Rpb24gYmFzZUVuY29kZUVudHJ5KG1vZGVsOiBVbml0TW9kZWwsIGlnbm9yZTogSWdub3JlKSB7XG4gIHJldHVybiB7XG4gICAgLi4ubWFya0RlZlByb3BlcnRpZXMobW9kZWwubWFya0RlZiwgaWdub3JlKSxcbiAgICAuLi5jb2xvcihtb2RlbCksXG4gICAgLi4ubm9uUG9zaXRpb24oJ29wYWNpdHknLCBtb2RlbCksXG4gICAgLi4udG9vbHRpcChtb2RlbCksXG4gICAgLi4udGV4dChtb2RlbCwgJ2hyZWYnKVxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrRGVmUHJvcGVydGllcyhtYXJrOiBNYXJrRGVmLCBpZ25vcmU6IElnbm9yZSkge1xuICByZXR1cm4gVkdfTUFSS19DT05GSUdTLnJlZHVjZSgobSwgcHJvcCkgPT4ge1xuICAgIGlmIChtYXJrW3Byb3BdICE9PSB1bmRlZmluZWQgJiYgaWdub3JlW3Byb3BdICE9PSAnaWdub3JlJykge1xuICAgICAgbVtwcm9wXSA9IHt2YWx1ZTogbWFya1twcm9wXX07XG4gICAgfVxuICAgIHJldHVybiBtO1xuICB9LCB7fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWx1ZUlmRGVmaW5lZChwcm9wOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuKTogVmdFbmNvZGVFbnRyeSB7XG4gIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHtbcHJvcF06IHt2YWx1ZTogdmFsdWV9fTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB2YWxpZFByZWRpY2F0ZSh2Z1JlZjogc3RyaW5nKSB7XG4gIHJldHVybiBgJHt2Z1JlZn0gIT09IG51bGwgJiYgIWlzTmFOKCR7dmdSZWZ9KWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVkKG1vZGVsOiBVbml0TW9kZWwpOiBWZ0VuY29kZUVudHJ5IHtcbiAgaWYgKG1vZGVsLmNvbmZpZy5pbnZhbGlkVmFsdWVzID09PSAnZmlsdGVyJykge1xuICAgIGNvbnN0IGZpZWxkcyA9IFsneCcsICd5J10ubWFwKChjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgICAgICBjb25zdCBzY2FsZUNvbXBvbmVudCA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpO1xuICAgICAgICBpZiAoc2NhbGVDb21wb25lbnQpIHtcbiAgICAgICAgICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcblxuICAgICAgICAgIC8vIERpc2NyZXRlIGRvbWFpbiBzY2FsZXMgY2FuIGhhbmRsZSBpbnZhbGlkIHZhbHVlcywgYnV0IGNvbnRpbnVvdXMgc2NhbGVzIGNhbid0LlxuICAgICAgICAgIGlmIChoYXNDb250aW51b3VzRG9tYWluKHNjYWxlVHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIHtleHByOiAnZGF0dW0nfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihmaWVsZCA9PiAhIWZpZWxkKVxuICAgICAgLm1hcCh2YWxpZFByZWRpY2F0ZSk7XG5cbiAgICBpZiAoZmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZWQ6IHtzaWduYWw6IGZpZWxkcy5qb2luKCcgJiYgJyl9XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7fTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gbWl4aW5zIGZvciBub24tcG9zaXRpb25hbCBjaGFubmVscyB3aXRoIHNjYWxlcy4gIChUZXh0IGRvZXNuJ3QgaGF2ZSBzY2FsZS4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub25Qb3NpdGlvbihjaGFubmVsOiB0eXBlb2YgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFNbMF0sIG1vZGVsOiBVbml0TW9kZWwsIG9wdDoge2RlZmF1bHRWYWx1ZT86IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW4sIHZnQ2hhbm5lbD86IHN0cmluZywgZGVmYXVsdFJlZj86IFZnVmFsdWVSZWZ9ID0ge30pOiBWZ0VuY29kZUVudHJ5IHtcbiAgY29uc3Qge2RlZmF1bHRWYWx1ZSwgdmdDaGFubmVsfSA9IG9wdDtcbiAgY29uc3QgZGVmYXVsdFJlZiA9IG9wdC5kZWZhdWx0UmVmIHx8IChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCA/IHt2YWx1ZTogZGVmYXVsdFZhbHVlfSA6IHVuZGVmaW5lZCk7XG5cbiAgY29uc3QgY2hhbm5lbERlZiA9IG1vZGVsLmVuY29kaW5nW2NoYW5uZWxdO1xuXG4gIHJldHVybiB3cmFwQ29uZGl0aW9uKG1vZGVsLCBjaGFubmVsRGVmLCB2Z0NoYW5uZWwgfHwgY2hhbm5lbCwgKGNEZWYpID0+IHtcbiAgICByZXR1cm4gcmVmLm1pZFBvaW50KFxuICAgICAgY2hhbm5lbCwgY0RlZiwgbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpLFxuICAgICAgbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCksXG4gICAgICBudWxsLCAvLyBObyBuZWVkIHRvIHByb3ZpZGUgc3RhY2sgZm9yIG5vbi1wb3NpdGlvbiBhcyBpdCBkb2VzIG5vdCBhZmZlY3QgbWlkIHBvaW50XG4gICAgICBkZWZhdWx0UmVmXG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIGEgbWl4aW4gdGhhdCBpbmNsdWRlIGEgVmVnYSBwcm9kdWN0aW9uIHJ1bGUgZm9yIGEgVmVnYS1MaXRlIGNvbmRpdGlvbmFsIGNoYW5uZWwgZGVmaW5pdGlvbi5cbiAqIG9yIGEgc2ltcGxlIG1peGluIGlmIGNoYW5uZWwgZGVmIGhhcyBubyBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwQ29uZGl0aW9uKFxuICAgIG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8c3RyaW5nPiwgdmdDaGFubmVsOiBzdHJpbmcsXG4gICAgcmVmRm46IChjRGVmOiBDaGFubmVsRGVmPHN0cmluZz4pID0+IFZnVmFsdWVSZWZcbiAgKTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IGNvbmRpdGlvbiA9IGNoYW5uZWxEZWYgJiYgY2hhbm5lbERlZi5jb25kaXRpb247XG4gIGNvbnN0IHZhbHVlUmVmID0gcmVmRm4oY2hhbm5lbERlZik7XG4gIGlmIChjb25kaXRpb24pIHtcbiAgICBjb25zdCBjb25kaXRpb25zID0gaXNBcnJheShjb25kaXRpb24pID8gY29uZGl0aW9uIDogW2NvbmRpdGlvbl07XG4gICAgY29uc3QgdmdDb25kaXRpb25zID0gY29uZGl0aW9ucy5tYXAoKGMpID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvblZhbHVlUmVmID0gcmVmRm4oYyk7XG4gICAgICBjb25zdCB0ZXN0ID0gaXNDb25kaXRpb25hbFNlbGVjdGlvbihjKSA/IHNlbGVjdGlvblByZWRpY2F0ZShtb2RlbCwgYy5zZWxlY3Rpb24pIDogZXhwcmVzc2lvbihtb2RlbCwgYy50ZXN0KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRlc3QsXG4gICAgICAgIC4uLmNvbmRpdGlvblZhbHVlUmVmXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBbdmdDaGFubmVsXTogW1xuICAgICAgICAuLi52Z0NvbmRpdGlvbnMsXG4gICAgICAgIC4uLih2YWx1ZVJlZiAhPT0gdW5kZWZpbmVkID8gW3ZhbHVlUmVmXSA6IFtdKVxuICAgICAgXVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlUmVmICE9PSB1bmRlZmluZWQgPyB7W3ZnQ2hhbm5lbF06IHZhbHVlUmVmfSA6IHt9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b29sdGlwKG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgY29uc3QgY2hhbm5lbCA9ICd0b29sdGlwJztcbiAgY29uc3QgY2hhbm5lbERlZiA9IG1vZGVsLmVuY29kaW5nW2NoYW5uZWxdO1xuICBpZiAoaXNBcnJheShjaGFubmVsRGVmKSkge1xuICAgIGNvbnN0IGtleVZhbHVlcyA9IGNoYW5uZWxEZWYubWFwKChmaWVsZERlZikgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZmllbGREZWYudGl0bGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkRGVmLnRpdGxlIDogdmdGaWVsZChmaWVsZERlZiwge2JpblN1ZmZpeDogJ3JhbmdlJ30pO1xuICAgICAgY29uc3QgdmFsdWUgPSByZWYudGV4dChmaWVsZERlZiwgbW9kZWwuY29uZmlnKS5zaWduYWw7XG4gICAgICByZXR1cm4gYFwiJHtrZXl9XCI6ICR7dmFsdWV9YDtcbiAgICB9KTtcbiAgICByZXR1cm4ge3Rvb2x0aXA6IHtzaWduYWw6IGB7JHtrZXlWYWx1ZXMuam9pbignLCAnKX19YH19O1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIG5vdCBhbiBhcnJheSwgYmVoYXZlIGp1c3QgbGlrZSB0ZXh0XG4gICAgcmV0dXJuIHRleHRDb21tb24obW9kZWwsIGNoYW5uZWwsIGNoYW5uZWxEZWYpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0KG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6ICd0ZXh0JyB8ICdocmVmJyA9ICd0ZXh0Jykge1xuICBjb25zdCBjaGFubmVsRGVmID0gbW9kZWwuZW5jb2RpbmdbY2hhbm5lbF07XG4gIHJldHVybiB0ZXh0Q29tbW9uKG1vZGVsLCBjaGFubmVsLCBjaGFubmVsRGVmKTtcbn1cblxuZnVuY3Rpb24gdGV4dENvbW1vbihtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsOiAndGV4dCcgfCAnaHJlZicgfCAndG9vbHRpcCcsIGNoYW5uZWxEZWY6IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxUZXh0RmllbGREZWY8c3RyaW5nPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248VGV4dEZpZWxkRGVmPHN0cmluZz4+KSB7XG4gIHJldHVybiB3cmFwQ29uZGl0aW9uKG1vZGVsLCBjaGFubmVsRGVmLCBjaGFubmVsLCAoY0RlZikgPT4gcmVmLnRleHQoY0RlZiwgbW9kZWwuY29uZmlnKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYW5kUG9zaXRpb24oZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6ICd4J3wneScsIG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgY29uc3Qgc2NhbGVOYW1lID0gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuICBjb25zdCBzaXplQ2hhbm5lbCA9IGNoYW5uZWwgPT09ICd4JyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcblxuICBpZiAobW9kZWwuZW5jb2Rpbmcuc2l6ZSB8fCBtb2RlbC5tYXJrRGVmLnNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG9yaWVudCA9IG1vZGVsLm1hcmtEZWYub3JpZW50O1xuICAgIGlmIChvcmllbnQpIHtcbiAgICAgIGNvbnN0IGNlbnRlcmVkQmFuZFBvc2l0aW9uTWl4aW5zID0ge1xuICAgICAgICAvLyBVc2UgeGMveWMgYW5kIHBsYWNlIHRoZSBtYXJrIGF0IHRoZSBtaWRkbGUgb2YgdGhlIGJhbmRcbiAgICAgICAgLy8gVGhpcyB3YXkgd2UgbmV2ZXIgaGF2ZSB0byBkZWFsIHdpdGggc2l6ZSdzIGNvbmRpdGlvbiBmb3IgeC95IHBvc2l0aW9uLlxuICAgICAgICBbY2hhbm5lbCsnYyddOiByZWYuZmllbGRSZWYoZmllbGREZWYsIHNjYWxlTmFtZSwge30sIHtiYW5kOiAwLjV9KVxuICAgICAgfTtcblxuICAgICAgaWYgKGdldEZpZWxkRGVmKG1vZGVsLmVuY29kaW5nLnNpemUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2VudGVyZWRCYW5kUG9zaXRpb25NaXhpbnMsXG4gICAgICAgICAgLi4ubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge3ZnQ2hhbm5lbDogc2l6ZUNoYW5uZWx9KVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChpc1ZhbHVlRGVmKG1vZGVsLmVuY29kaW5nLnNpemUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2VudGVyZWRCYW5kUG9zaXRpb25NaXhpbnMsXG4gICAgICAgICAgLi4ubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge3ZnQ2hhbm5lbDogc2l6ZUNoYW5uZWx9KVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChtb2RlbC5tYXJrRGVmLnNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNlbnRlcmVkQmFuZFBvc2l0aW9uTWl4aW5zLFxuICAgICAgICAgIFtzaXplQ2hhbm5lbF06IHt2YWx1ZTogbW9kZWwubWFya0RlZi5zaXplfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5jYW5ub3RBcHBseVNpemVUb05vbk9yaWVudGVkTWFyayhtb2RlbC5tYXJrRGVmLnR5cGUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBbY2hhbm5lbF06IHJlZi5maWVsZFJlZihmaWVsZERlZiwgc2NhbGVOYW1lLCB7YmluU3VmZml4OiAncmFuZ2UnfSksXG4gICAgW3NpemVDaGFubmVsXTogcmVmLmJhbmRSZWYoc2NhbGVOYW1lKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2VudGVyZWRCYW5kUG9zaXRpb24oY2hhbm5lbDogJ3gnIHwgJ3knLCBtb2RlbDogVW5pdE1vZGVsLCBkZWZhdWx0UG9zUmVmOiBWZ1ZhbHVlUmVmLCBkZWZhdWx0U2l6ZVJlZjogVmdWYWx1ZVJlZikge1xuICBjb25zdCBjZW50ZXJDaGFubmVsOiAneGMnIHwgJ3ljJyA9IGNoYW5uZWwgPT09ICd4JyA/ICd4YycgOiAneWMnO1xuICBjb25zdCBzaXplQ2hhbm5lbCA9IGNoYW5uZWwgPT09ICd4JyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgcmV0dXJuIHtcbiAgICAuLi5wb2ludFBvc2l0aW9uKGNoYW5uZWwsIG1vZGVsLCBkZWZhdWx0UG9zUmVmLCBjZW50ZXJDaGFubmVsKSxcbiAgICAuLi5ub25Qb3NpdGlvbignc2l6ZScsIG1vZGVsLCB7ZGVmYXVsdFJlZjogZGVmYXVsdFNpemVSZWYsIHZnQ2hhbm5lbDogc2l6ZUNoYW5uZWx9KVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmlubmVkUG9zaXRpb24oZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6ICd4J3wneScsIHNjYWxlTmFtZTogc3RyaW5nLCBzcGFjaW5nOiBudW1iZXIsIHJldmVyc2U6IGJvb2xlYW4pIHtcbiAgaWYgKGNoYW5uZWwgPT09ICd4Jykge1xuICAgIHJldHVybiB7XG4gICAgICB4MjogcmVmLmJpbihmaWVsZERlZiwgc2NhbGVOYW1lLCAnc3RhcnQnLCByZXZlcnNlID8gMCA6IHNwYWNpbmcpLFxuICAgICAgeDogcmVmLmJpbihmaWVsZERlZiwgc2NhbGVOYW1lLCAnZW5kJywgcmV2ZXJzZSA/IHNwYWNpbmcgOiAwKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHkyOiByZWYuYmluKGZpZWxkRGVmLCBzY2FsZU5hbWUsICdzdGFydCcsIHJldmVyc2UgPyBzcGFjaW5nIDogMCksXG4gICAgICB5OiByZWYuYmluKGZpZWxkRGVmLCBzY2FsZU5hbWUsICdlbmQnLCByZXZlcnNlID8gMCA6IHNwYWNpbmcpXG4gICAgfTtcbiAgfVxufVxuXG5cbi8qKlxuICogUmV0dXJuIG1peGlucyBmb3IgcG9pbnQgKG5vbi1iYW5kKSBwb3NpdGlvbiBjaGFubmVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50UG9zaXRpb24oY2hhbm5lbDogJ3gnfCd5JywgbW9kZWw6IFVuaXRNb2RlbCwgZGVmYXVsdFJlZjogVmdWYWx1ZVJlZiB8ICd6ZXJvT3JNaW4nIHwgJ3plcm9Pck1heCcsIHZnQ2hhbm5lbD86ICd4J3wneSd8J3hjJ3wneWMnKSB7XG4gIC8vIFRPRE86IHJlZmFjdG9yIGhvdyByZWZlciB0byBzY2FsZSBhcyBkaXNjdXNzZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL3B1bGwvMTYxM1xuXG4gIGNvbnN0IHtlbmNvZGluZywgbWFyaywgc3RhY2t9ID0gbW9kZWw7XG5cbiAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICBjb25zdCBzY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG5cblxuICBjb25zdCBvZmZzZXQgPSByZWYuZ2V0T2Zmc2V0KGNoYW5uZWwsIG1vZGVsLm1hcmtEZWYpO1xuXG5cbiAgY29uc3QgdmFsdWVSZWYgPSAhY2hhbm5lbERlZiAmJiAoZW5jb2RpbmcubGF0aXR1ZGUgfHwgZW5jb2RpbmcubG9uZ2l0dWRlKSA/XG4gICAgLy8gdXNlIGdlb3BvaW50IG91dHB1dCBpZiB0aGVyZSBhcmUgbGF0L2xvbmcgYW5kIHRoZXJlIGlzIG5vIHBvaW50IHBvc2l0aW9uIG92ZXJyaWRpbmcgbGF0L2xvbmcuXG4gICAge2ZpZWxkOiBtb2RlbC5nZXROYW1lKGNoYW5uZWwpfSA6XG4gICAge1xuICAgICAgLi4ucmVmLnN0YWNrYWJsZShjaGFubmVsLCBlbmNvZGluZ1tjaGFubmVsXSwgc2NhbGVOYW1lLCBzY2FsZSwgc3RhY2ssXG4gICAgICAgIHJlZi5nZXREZWZhdWx0UmVmKGRlZmF1bHRSZWYsIGNoYW5uZWwsIHNjYWxlTmFtZSwgc2NhbGUsIG1hcmspXG4gICAgICApLFxuICAgICAuLi4ob2Zmc2V0ID8ge29mZnNldH06IHt9KVxuICAgIH07XG5cbiAgcmV0dXJuIHtcbiAgICBbdmdDaGFubmVsIHx8IGNoYW5uZWxdOiB2YWx1ZVJlZlxuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiBtaXhpbnMgZm9yIHgyLCB5Mi5cbiAqIElmIGNoYW5uZWwgaXMgbm90IHNwZWNpZmllZCwgcmV0dXJuIG9uZSBjaGFubmVsIGJhc2VkIG9uIG9yaWVudGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRQb3NpdGlvbjIobW9kZWw6IFVuaXRNb2RlbCwgZGVmYXVsdFJlZjogJ3plcm9Pck1pbicgfCAnemVyb09yTWF4JywgY2hhbm5lbDogJ3gyJyB8ICd5MicpIHtcbiAgY29uc3Qge2VuY29kaW5nLCBtYXJrLCBzdGFja30gPSBtb2RlbDtcblxuICBjb25zdCBiYXNlQ2hhbm5lbCA9IGNoYW5uZWwgPT09ICd4MicgPyAneCcgOiAneSc7XG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tiYXNlQ2hhbm5lbF07XG4gIGNvbnN0IHNjYWxlTmFtZSA9IG1vZGVsLnNjYWxlTmFtZShiYXNlQ2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoYmFzZUNoYW5uZWwpO1xuXG4gIGNvbnN0IG9mZnNldCA9IHJlZi5nZXRPZmZzZXQoY2hhbm5lbCwgbW9kZWwubWFya0RlZik7XG5cbiAgY29uc3QgdmFsdWVSZWYgPSAhY2hhbm5lbERlZiAmJiAoZW5jb2RpbmcubGF0aXR1ZGUgfHwgZW5jb2RpbmcubG9uZ2l0dWRlKSA/XG4gICAgLy8gdXNlIGdlb3BvaW50IG91dHB1dCBpZiB0aGVyZSBhcmUgbGF0Mi9sb25nMiBhbmQgdGhlcmUgaXMgbm8gcG9pbnQgcG9zaXRpb24yIG92ZXJyaWRpbmcgbGF0Mi9sb25nMi5cbiAgICB7ZmllbGQ6IG1vZGVsLmdldE5hbWUoY2hhbm5lbCl9OlxuICAgIHtcbiAgICAgIC4uLnJlZi5zdGFja2FibGUyKGNoYW5uZWwsIGNoYW5uZWxEZWYsIGVuY29kaW5nW2NoYW5uZWxdLCBzY2FsZU5hbWUsIHNjYWxlLCBzdGFjayxcbiAgICAgICAgcmVmLmdldERlZmF1bHRSZWYoZGVmYXVsdFJlZiwgYmFzZUNoYW5uZWwsIHNjYWxlTmFtZSwgc2NhbGUsIG1hcmspXG4gICAgICApLFxuICAgICAgLi4uKG9mZnNldCA/IHtvZmZzZXR9IDoge30pXG4gICAgfTtcblxuICByZXR1cm4ge1tjaGFubmVsXTogdmFsdWVSZWZ9O1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/point.d.ts b/build/src/compile/mark/point.d.ts new file mode 100644 index 0000000000..23c1a43b81 --- /dev/null +++ b/build/src/compile/mark/point.d.ts @@ -0,0 +1,8 @@ +import { Config } from '../../config'; +import { VgEncodeEntry } from '../../vega.schema'; +import { UnitModel } from '../unit'; +import { MarkCompiler } from './base'; +export declare function shapeMixins(model: UnitModel, config: Config, fixedShape?: 'circle' | 'square'): VgEncodeEntry; +export declare const point: MarkCompiler; +export declare const circle: MarkCompiler; +export declare const square: MarkCompiler; diff --git a/build/src/compile/mark/point.js b/build/src/compile/mark/point.js new file mode 100644 index 0000000000..14e6bdcc61 --- /dev/null +++ b/build/src/compile/mark/point.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var common_1 = require("../common"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +function encodeEntry(model, fixedShape) { + var config = model.config, width = model.width, height = model.height; + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model), shapeMixins(model, config, fixedShape)); +} +function shapeMixins(model, config, fixedShape) { + if (fixedShape) { + return { shape: { value: fixedShape } }; + } + return mixins.nonPosition('shape', model, { defaultValue: common_1.getMarkConfig('shape', model.markDef, config) }); +} +exports.shapeMixins = shapeMixins; +exports.point = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model); + } +}; +exports.circle = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model, 'circle'); + } +}; +exports.square = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model, 'square'); + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLG9DQUF3QztBQUd4Qyx1REFBbUM7QUFDbkMsc0RBQWtDO0FBR2xDLHFCQUFxQixLQUFnQixFQUFFLFVBQWdDO0lBQzlELElBQUEscUJBQU0sRUFBRSxtQkFBSyxFQUFFLHFCQUFNLENBQVU7SUFFdEMsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNqRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDakMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQ3pDO0FBQ0osQ0FBQztBQUVELHFCQUE0QixLQUFnQixFQUFFLE1BQWMsRUFBRSxVQUFnQztJQUM1RixJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQztLQUNyQztJQUNELE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsWUFBWSxFQUFFLHNCQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFXLEVBQUMsQ0FBQyxDQUFDO0FBQ3JILENBQUM7QUFMRCxrQ0FLQztBQUVZLFFBQUEsS0FBSyxHQUFpQjtJQUNqQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1QixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQztBQUVXLFFBQUEsTUFBTSxHQUFpQjtJQUNsQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1QixPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGLENBQUM7QUFFVyxRQUFBLE1BQU0sR0FBaUI7SUFDbEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDNUIsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge1ZnRW5jb2RlRW50cnl9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7Z2V0TWFya0NvbmZpZ30gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgbWl4aW5zIGZyb20gJy4vbWl4aW5zJztcbmltcG9ydCAqIGFzIHJlZiBmcm9tICcuL3ZhbHVlcmVmJztcblxuXG5mdW5jdGlvbiBlbmNvZGVFbnRyeShtb2RlbDogVW5pdE1vZGVsLCBmaXhlZFNoYXBlPzogJ2NpcmNsZScgfCAnc3F1YXJlJykge1xuICBjb25zdCB7Y29uZmlnLCB3aWR0aCwgaGVpZ2h0fSA9IG1vZGVsO1xuXG4gIHJldHVybiB7XG4gICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpbmNsdWRlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsIHJlZi5taWQod2lkdGgpKSxcbiAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCByZWYubWlkKGhlaWdodCkpLFxuICAgIC4uLm1peGlucy5ub25Qb3NpdGlvbignc2l6ZScsIG1vZGVsKSxcbiAgICAuLi5zaGFwZU1peGlucyhtb2RlbCwgY29uZmlnLCBmaXhlZFNoYXBlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNoYXBlTWl4aW5zKG1vZGVsOiBVbml0TW9kZWwsIGNvbmZpZzogQ29uZmlnLCBmaXhlZFNoYXBlPzogJ2NpcmNsZScgfCAnc3F1YXJlJyk6IFZnRW5jb2RlRW50cnkge1xuICBpZiAoZml4ZWRTaGFwZSkge1xuICAgIHJldHVybiB7c2hhcGU6IHt2YWx1ZTogZml4ZWRTaGFwZX19O1xuICB9XG4gIHJldHVybiBtaXhpbnMubm9uUG9zaXRpb24oJ3NoYXBlJywgbW9kZWwsIHtkZWZhdWx0VmFsdWU6IGdldE1hcmtDb25maWcoJ3NoYXBlJywgbW9kZWwubWFya0RlZiwgY29uZmlnKSBhcyBzdHJpbmd9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHBvaW50OiBNYXJrQ29tcGlsZXIgPSB7XG4gIHZnTWFyazogJ3N5bWJvbCcsXG4gIGVuY29kZUVudHJ5OiAobW9kZWw6IFVuaXRNb2RlbCkgPT4ge1xuICAgIHJldHVybiBlbmNvZGVFbnRyeShtb2RlbCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjaXJjbGU6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnc3ltYm9sJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIGVuY29kZUVudHJ5KG1vZGVsLCAnY2lyY2xlJyk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzcXVhcmU6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnc3ltYm9sJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIGVuY29kZUVudHJ5KG1vZGVsLCAnc3F1YXJlJyk7XG4gIH1cbn07XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/mark/rect.d.ts b/build/src/compile/mark/rect.d.ts new file mode 100644 index 0000000000..f112c90fad --- /dev/null +++ b/build/src/compile/mark/rect.d.ts @@ -0,0 +1,6 @@ +import { VgEncodeEntry } from '../../vega.schema'; +import { UnitModel } from '../unit'; +import { MarkCompiler } from './base'; +export declare const rect: MarkCompiler; +export declare function x(model: UnitModel): VgEncodeEntry; +export declare function y(model: UnitModel): VgEncodeEntry; diff --git a/build/src/compile/mark/rect.js b/build/src/compile/mark/rect.js new file mode 100644 index 0000000000..025604cf25 --- /dev/null +++ b/build/src/compile/mark/rect.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var mark_1 = require("../../mark"); +var scale_1 = require("../../scale"); +var mixins = tslib_1.__importStar(require("./mixins")); +exports.rect = { + vgMark: 'rect', + encodeEntry: function (model) { + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x(model), y(model)); + } +}; +function x(model) { + var xDef = model.encoding.x; + var x2Def = model.encoding.x2; + var xScale = model.getScaleComponent(channel_1.X); + var xScaleType = xScale ? xScale.get('type') : undefined; + if (fielddef_1.isFieldDef(xDef) && xDef.bin && !x2Def) { + return mixins.binnedPosition(xDef, 'x', model.scaleName('x'), 0, xScale.get('reverse')); + } + else if (fielddef_1.isFieldDef(xDef) && xScale && scale_1.hasDiscreteDomain(xScaleType)) { + /* istanbul ignore else */ + if (xScaleType === scale_1.ScaleType.BAND) { + return mixins.bandPosition(xDef, 'x', model); + } + else { + // We don't support rect mark with point/ordinal scale + throw new Error(log.message.scaleTypeNotWorkWithMark(mark_1.RECT, xScaleType)); + } + } + else { // continuous scale or no scale + return tslib_1.__assign({}, mixins.pointPosition('x', model, 'zeroOrMax'), mixins.pointPosition2(model, 'zeroOrMin', 'x2')); + } +} +exports.x = x; +function y(model) { + var yDef = model.encoding.y; + var y2Def = model.encoding.y2; + var yScale = model.getScaleComponent(channel_1.Y); + var yScaleType = yScale ? yScale.get('type') : undefined; + if (fielddef_1.isFieldDef(yDef) && yDef.bin && !y2Def) { + return mixins.binnedPosition(yDef, 'y', model.scaleName('y'), 0, yScale.get('reverse')); + } + else if (fielddef_1.isFieldDef(yDef) && yScale && scale_1.hasDiscreteDomain(yScaleType)) { + /* istanbul ignore else */ + if (yScaleType === scale_1.ScaleType.BAND) { + return mixins.bandPosition(yDef, 'y', model); + } + else { + // We don't support rect mark with point/ordinal scale + throw new Error(log.message.scaleTypeNotWorkWithMark(mark_1.RECT, yScaleType)); + } + } + else { // continuous scale or no scale + return tslib_1.__assign({}, mixins.pointPosition('y', model, 'zeroOrMax'), mixins.pointPosition2(model, 'zeroOrMin', 'y2')); + } +} +exports.y = y; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvcmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBbUM7QUFDbkMsMkNBQTBDO0FBQzFDLHFEQUFpQztBQUNqQyxtQ0FBZ0M7QUFDaEMscUNBQXlEO0FBSXpELHVEQUFtQztBQUV0QixRQUFBLElBQUksR0FBaUI7SUFDaEMsTUFBTSxFQUFFLE1BQU07SUFDZCxXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1Qiw0QkFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQ2pFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDUixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ1g7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUVGLFdBQWtCLEtBQWdCO0lBQ2hDLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ2hDLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFDLENBQUMsQ0FBQztJQUMxQyxJQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUUzRCxJQUFJLHFCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRTtRQUMxQyxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDekY7U0FBTSxJQUFJLHFCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLHlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3RFLDBCQUEwQjtRQUMxQixJQUFJLFVBQVUsS0FBSyxpQkFBUyxDQUFDLElBQUksRUFBRTtZQUNqQyxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5QzthQUFNO1lBQ0wsc0RBQXNEO1lBQ3RELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxXQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUN6RTtLQUNGO1NBQU0sRUFBRSwrQkFBK0I7UUFDdEMsNEJBQ0ssTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUM3QyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLEVBQ2xEO0tBQ0g7QUFDSCxDQUFDO0FBdEJELGNBc0JDO0FBRUQsV0FBa0IsS0FBZ0I7SUFDaEMsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDaEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTNELElBQUkscUJBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQzFDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUN6RjtTQUFNLElBQUkscUJBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLElBQUkseUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDdEUsMEJBQTBCO1FBQzFCLElBQUksVUFBVSxLQUFLLGlCQUFTLENBQUMsSUFBSSxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxzREFBc0Q7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLFdBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO0tBQ0Y7U0FBTSxFQUFFLCtCQUErQjtRQUN0Qyw0QkFDSyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFDbEQ7S0FDSDtBQUNILENBQUM7QUF0QkQsY0FzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1gsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtpc0ZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7UkVDVH0gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge2hhc0Rpc2NyZXRlRG9tYWluLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7VmdFbmNvZGVFbnRyeX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtNYXJrQ29tcGlsZXJ9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuXG5leHBvcnQgY29uc3QgcmVjdDogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdyZWN0JyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgICAgLi4ueChtb2RlbCksXG4gICAgICAuLi55KG1vZGVsKSxcbiAgICB9O1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24geChtb2RlbDogVW5pdE1vZGVsKTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHhEZWYgPSBtb2RlbC5lbmNvZGluZy54O1xuICBjb25zdCB4MkRlZiA9IG1vZGVsLmVuY29kaW5nLngyO1xuICBjb25zdCB4U2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChYKTtcbiAgY29uc3QgeFNjYWxlVHlwZSA9IHhTY2FsZSA/IHhTY2FsZS5nZXQoJ3R5cGUnKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiB4RGVmLmJpbiAmJiAheDJEZWYpIHtcbiAgICByZXR1cm4gbWl4aW5zLmJpbm5lZFBvc2l0aW9uKHhEZWYsICd4JywgbW9kZWwuc2NhbGVOYW1lKCd4JyksIDAsIHhTY2FsZS5nZXQoJ3JldmVyc2UnKSk7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiB4U2NhbGUgJiYgaGFzRGlzY3JldGVEb21haW4oeFNjYWxlVHlwZSkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh4U2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgcmV0dXJuIG1peGlucy5iYW5kUG9zaXRpb24oeERlZiwgJ3gnLCBtb2RlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVjdCBtYXJrIHdpdGggcG9pbnQvb3JkaW5hbCBzY2FsZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLnNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhSRUNULCB4U2NhbGVUeXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBjb250aW51b3VzIHNjYWxlIG9yIG5vIHNjYWxlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsICd6ZXJvT3JNYXgnKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd4MicpXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geShtb2RlbDogVW5pdE1vZGVsKTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHlEZWYgPSBtb2RlbC5lbmNvZGluZy55O1xuICBjb25zdCB5MkRlZiA9IG1vZGVsLmVuY29kaW5nLnkyO1xuICBjb25zdCB5U2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChZKTtcbiAgY29uc3QgeVNjYWxlVHlwZSA9IHlTY2FsZSA/IHlTY2FsZS5nZXQoJ3R5cGUnKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaXNGaWVsZERlZih5RGVmKSAmJiB5RGVmLmJpbiAmJiAheTJEZWYpIHtcbiAgICByZXR1cm4gbWl4aW5zLmJpbm5lZFBvc2l0aW9uKHlEZWYsICd5JywgbW9kZWwuc2NhbGVOYW1lKCd5JyksIDAsIHlTY2FsZS5nZXQoJ3JldmVyc2UnKSk7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih5RGVmKSAmJiB5U2NhbGUgJiYgaGFzRGlzY3JldGVEb21haW4oeVNjYWxlVHlwZSkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh5U2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgcmV0dXJuIG1peGlucy5iYW5kUG9zaXRpb24oeURlZiwgJ3knLCBtb2RlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVjdCBtYXJrIHdpdGggcG9pbnQvb3JkaW5hbCBzY2FsZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLnNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhSRUNULCB5U2NhbGVUeXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBjb250aW51b3VzIHNjYWxlIG9yIG5vIHNjYWxlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsICd6ZXJvT3JNYXgnKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd5MicpXG4gICAgfTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/rule.d.ts b/build/src/compile/mark/rule.d.ts new file mode 100644 index 0000000000..4b4078e38f --- /dev/null +++ b/build/src/compile/mark/rule.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const rule: MarkCompiler; diff --git a/build/src/compile/mark/rule.js b/build/src/compile/mark/rule.js new file mode 100644 index 0000000000..a7af6cf69c --- /dev/null +++ b/build/src/compile/mark/rule.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +exports.rule = { + vgMark: 'rule', + encodeEntry: function (model) { + var _config = model.config, markDef = model.markDef, width = model.width, height = model.height; + var orient = markDef.orient; + if (!model.encoding.x && !model.encoding.y && !model.encoding.latitude && !model.encoding.longitude) { + // Show nothing if we have none of x, y, lat, and long. + return {}; + } + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, orient === 'horizontal' ? 'zeroOrMin' : ref.mid(width)), mixins.pointPosition('y', model, orient === 'vertical' ? 'zeroOrMin' : ref.mid(height)), (orient !== 'vertical' ? mixins.pointPosition2(model, 'zeroOrMax', 'x2') : {}), (orient !== 'horizontal' ? mixins.pointPosition2(model, 'zeroOrMax', 'y2') : {}), mixins.nonPosition('size', model, { + vgChannel: 'strokeWidth', + defaultValue: markDef.size + })); + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSx1REFBbUM7QUFDbkMsc0RBQWtDO0FBRXJCLFFBQUEsSUFBSSxHQUFpQjtJQUNoQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQ3JCLElBQUEsc0JBQWUsRUFBRSx1QkFBTyxFQUFFLG1CQUFLLEVBQUUscUJBQU0sQ0FBVTtRQUN4RCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuRyx1REFBdUQ7WUFDdkQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDakUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN4RixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBR3ZGLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFHOUUsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUVoRixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDbkMsU0FBUyxFQUFFLGFBQWE7WUFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1NBQzNCLENBQUMsRUFDRjtJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtNYXJrQ29tcGlsZXJ9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuaW1wb3J0ICogYXMgcmVmIGZyb20gJy4vdmFsdWVyZWYnO1xuXG5leHBvcnQgY29uc3QgcnVsZTogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdydWxlJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge2NvbmZpZzogX2NvbmZpZywgbWFya0RlZiwgd2lkdGgsIGhlaWdodH0gPSBtb2RlbDtcbiAgICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcblxuICAgIGlmICghbW9kZWwuZW5jb2RpbmcueCAmJiAhbW9kZWwuZW5jb2RpbmcueSAmJiAhbW9kZWwuZW5jb2RpbmcubGF0aXR1ZGUgJiYgIW1vZGVsLmVuY29kaW5nLmxvbmdpdHVkZSkge1xuICAgICAgLy8gU2hvdyBub3RoaW5nIGlmIHdlIGhhdmUgbm9uZSBvZiB4LCB5LCBsYXQsIGFuZCBsb25nLlxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2lnbm9yZScsIG9yaWVudDogJ2lnbm9yZSd9KSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsIG9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3plcm9Pck1pbicgOiByZWYubWlkKHdpZHRoKSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCBvcmllbnQgPT09ICd2ZXJ0aWNhbCcgPyAnemVyb09yTWluJyA6IHJlZi5taWQoaGVpZ2h0KSksXG5cbiAgICAgIC8vIGluY2x1ZGUgeDIgZm9yIGhvcml6b250YWwgb3IgbGluZSBzZWdtZW50IHJ1bGVcbiAgICAgIC4uLihvcmllbnQgIT09ICd2ZXJ0aWNhbCcgPyBtaXhpbnMucG9pbnRQb3NpdGlvbjIobW9kZWwsICd6ZXJvT3JNYXgnLCAneDInKSA6IHt9KSxcblxuICAgICAgLy8gaW5jbHVkZSB5MiBmb3IgdmVydGljYWwgb3IgbGluZSBzZWdtZW50IHJ1bGVcbiAgICAgIC4uLihvcmllbnQgIT09ICdob3Jpem9udGFsJyA/IG1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1heCcsICd5MicpIDoge30pLFxuXG4gICAgICAuLi5taXhpbnMubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge1xuICAgICAgICB2Z0NoYW5uZWw6ICdzdHJva2VXaWR0aCcsICAvLyBWTCdzIHJ1bGUgc2l6ZSBpcyBzdHJva2VXaWR0aFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG1hcmtEZWYuc2l6ZVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59O1xuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/text.d.ts b/build/src/compile/mark/text.d.ts new file mode 100644 index 0000000000..3f8145da15 --- /dev/null +++ b/build/src/compile/mark/text.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const text: MarkCompiler; diff --git a/build/src/compile/mark/text.js b/build/src/compile/mark/text.js new file mode 100644 index 0000000000..07f4826763 --- /dev/null +++ b/build/src/compile/mark/text.js @@ -0,0 +1,23 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var common_1 = require("../common"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +exports.text = { + vgMark: 'text', + encodeEntry: function (model) { + var config = model.config, encoding = model.encoding, width = model.width, height = model.height, markDef = model.markDef; + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.text(model), mixins.nonPosition('size', model, tslib_1.__assign({}, (markDef.size ? { defaultValue: markDef.size } : {}), { vgChannel: 'fontSize' // VL's text size is fontSize + })), mixins.valueIfDefined('align', align(model.markDef, encoding, config))); + } +}; +function align(markDef, encoding, config) { + var a = markDef.align || common_1.getMarkConfig('align', markDef, config); + if (a === undefined) { + return 'center'; + } + // If there is a config, Vega-parser will process this already. + return undefined; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxvQ0FBd0M7QUFHeEMsdURBQW1DO0FBQ25DLHNEQUFrQztBQUdyQixRQUFBLElBQUksR0FBaUI7SUFDaEMsTUFBTSxFQUFFLE1BQU07SUFFZCxXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUNyQixJQUFBLHFCQUFNLEVBQUUseUJBQVEsRUFBRSxtQkFBSyxFQUFFLHFCQUFNLEVBQUUsdUJBQU8sQ0FBVTtRQUV6RCw0QkFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQ2pFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQ2hELE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQ2pELE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssdUJBQzlCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFDckQsU0FBUyxFQUFFLFVBQVUsQ0FBRSw2QkFBNkI7WUFDcEQsRUFDQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDekU7SUFDSixDQUFDO0NBQ0YsQ0FBQztBQUNGLGVBQWUsT0FBZ0IsRUFBRSxRQUEwQixFQUFFLE1BQWM7SUFDekUsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxzQkFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ25CLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0lBQ0QsK0RBQStEO0lBQy9ELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4uLy4uL2VuY29kaW5nJztcbmltcG9ydCB7TWFya0RlZn0gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge2dldE1hcmtDb25maWd9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cblxuZXhwb3J0IGNvbnN0IHRleHQ6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAndGV4dCcsXG5cbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge2NvbmZpZywgZW5jb2RpbmcsIHdpZHRoLCBoZWlnaHQsIG1hcmtEZWZ9ID0gbW9kZWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpZ25vcmUnLCBvcmllbnQ6ICdpZ25vcmUnfSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneCcsIG1vZGVsLCByZWYubWlkKHdpZHRoKSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCByZWYubWlkKGhlaWdodCkpLFxuICAgICAgLi4ubWl4aW5zLnRleHQobW9kZWwpLFxuICAgICAgLi4ubWl4aW5zLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwsIHtcbiAgICAgICAgLi4uKG1hcmtEZWYuc2l6ZSA/IHtkZWZhdWx0VmFsdWU6IG1hcmtEZWYuc2l6ZX0gOiB7fSksXG4gICAgICAgIHZnQ2hhbm5lbDogJ2ZvbnRTaXplJyAgLy8gVkwncyB0ZXh0IHNpemUgaXMgZm9udFNpemVcbiAgICAgIH0pLFxuICAgICAgLi4ubWl4aW5zLnZhbHVlSWZEZWZpbmVkKCdhbGlnbicsIGFsaWduKG1vZGVsLm1hcmtEZWYsIGVuY29kaW5nLCBjb25maWcpKVxuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBhbGlnbihtYXJrRGVmOiBNYXJrRGVmLCBlbmNvZGluZzogRW5jb2Rpbmc8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgYSA9IG1hcmtEZWYuYWxpZ24gfHwgZ2V0TWFya0NvbmZpZygnYWxpZ24nLCBtYXJrRGVmLCBjb25maWcpO1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdjZW50ZXInO1xuICB9XG4gIC8vIElmIHRoZXJlIGlzIGEgY29uZmlnLCBWZWdhLXBhcnNlciB3aWxsIHByb2Nlc3MgdGhpcyBhbHJlYWR5LlxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/mark/tick.d.ts b/build/src/compile/mark/tick.d.ts new file mode 100644 index 0000000000..9e01bb786c --- /dev/null +++ b/build/src/compile/mark/tick.d.ts @@ -0,0 +1,2 @@ +import { MarkCompiler } from './base'; +export declare const tick: MarkCompiler; diff --git a/build/src/compile/mark/tick.js b/build/src/compile/mark/tick.js new file mode 100644 index 0000000000..f1e66757cc --- /dev/null +++ b/build/src/compile/mark/tick.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_schema_1 = require("../../vega.schema"); +var mixins = tslib_1.__importStar(require("./mixins")); +var ref = tslib_1.__importStar(require("./valueref")); +exports.tick = { + vgMark: 'rect', + encodeEntry: function (model) { + var _a; + var config = model.config, markDef = model.markDef, width = model.width, height = model.height; + var orient = markDef.orient; + var vgSizeChannel = orient === 'horizontal' ? 'width' : 'height'; + var vgThicknessChannel = orient === 'horizontal' ? 'height' : 'width'; + return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width), 'xc'), mixins.pointPosition('y', model, ref.mid(height), 'yc'), mixins.nonPosition('size', model, { + defaultValue: defaultSize(model), + vgChannel: vgSizeChannel + }), (_a = {}, _a[vgThicknessChannel] = { value: markDef.thickness || config.tick.thickness }, _a)); + } +}; +function defaultSize(model) { + var config = model.config, markDef = model.markDef; + var orient = markDef.orient; + var scale = model.getScaleComponent(orient === 'horizontal' ? 'x' : 'y'); + if (markDef.size !== undefined) { + return markDef.size; + } + else if (config.tick.bandSize !== undefined) { + return config.tick.bandSize; + } + else { + var scaleRange = scale ? scale.get('range') : undefined; + var rangeStep = scaleRange && vega_schema_1.isVgRangeStep(scaleRange) ? + scaleRange.step : + config.scale.rangeStep; + if (typeof rangeStep !== 'number') { + // FIXME consolidate this log + throw new Error('Function does not handle non-numeric rangeStep'); + } + return rangeStep / 1.5; + } +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGljay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvdGljay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBZ0Q7QUFHaEQsdURBQW1DO0FBQ25DLHNEQUFrQztBQUdyQixRQUFBLElBQUksR0FBaUI7SUFDaEMsTUFBTSxFQUFFLE1BQU07SUFFZCxXQUFXLEVBQUUsVUFBQyxLQUFnQjs7UUFDckIsSUFBQSxxQkFBTSxFQUFFLHVCQUFPLEVBQUUsbUJBQUssRUFBRSxxQkFBTSxDQUFVO1FBQy9DLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFOUIsSUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDbkUsSUFBTSxrQkFBa0IsR0FBRyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUV4RSw0QkFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBRWpFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUN0RCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsRUFHdkQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBQ25DLFlBQVksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUMsZUFDRCxrQkFBa0IsSUFBRyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLE9BQ3pFO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixxQkFBcUIsS0FBZ0I7SUFDNUIsSUFBQSxxQkFBTSxFQUFFLHVCQUFPLENBQVU7SUFDaEMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQzlCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztLQUNyQjtTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDN0I7U0FBTTtRQUNMLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFELElBQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSwyQkFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDekQsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ3pCLElBQUksT0FBTyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQ2pDLDZCQUE2QjtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLFNBQVMsR0FBRyxHQUFHLENBQUM7S0FDeEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cblxuZXhwb3J0IGNvbnN0IHRpY2s6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAncmVjdCcsXG5cbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge2NvbmZpZywgbWFya0RlZiwgd2lkdGgsIGhlaWdodH0gPSBtb2RlbDtcbiAgICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcblxuICAgIGNvbnN0IHZnU2l6ZUNoYW5uZWwgPSBvcmllbnQgPT09ICdob3Jpem9udGFsJyA/ICd3aWR0aCcgOiAnaGVpZ2h0JztcbiAgICBjb25zdCB2Z1RoaWNrbmVzc0NoYW5uZWwgPSBvcmllbnQgPT09ICdob3Jpem9udGFsJyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2lnbm9yZScsIG9yaWVudDogJ2lnbm9yZSd9KSxcblxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3gnLCBtb2RlbCwgcmVmLm1pZCh3aWR0aCksICd4YycpLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3knLCBtb2RlbCwgcmVmLm1pZChoZWlnaHQpLCAneWMnKSxcblxuICAgICAgLy8gc2l6ZSAvIHRoaWNrbmVzcyA9PiB3aWR0aCAvIGhlaWdodFxuICAgICAgLi4ubWl4aW5zLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwsIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBkZWZhdWx0U2l6ZShtb2RlbCksXG4gICAgICAgIHZnQ2hhbm5lbDogdmdTaXplQ2hhbm5lbFxuICAgICAgfSksXG4gICAgICBbdmdUaGlja25lc3NDaGFubmVsXToge3ZhbHVlOiBtYXJrRGVmLnRoaWNrbmVzcyB8fCBjb25maWcudGljay50aGlja25lc3N9LFxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRlZmF1bHRTaXplKG1vZGVsOiBVbml0TW9kZWwpOiBudW1iZXIge1xuICBjb25zdCB7Y29uZmlnLCBtYXJrRGVmfSA9IG1vZGVsO1xuICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcbiAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChvcmllbnQgPT09ICdob3Jpem9udGFsJyA/ICd4JyA6ICd5Jyk7XG5cbiAgaWYgKG1hcmtEZWYuc2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG1hcmtEZWYuc2l6ZTtcbiAgfSBlbHNlIGlmIChjb25maWcudGljay5iYW5kU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNvbmZpZy50aWNrLmJhbmRTaXplO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNjYWxlUmFuZ2UgPSBzY2FsZSA/IHNjYWxlLmdldCgncmFuZ2UnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByYW5nZVN0ZXAgPSBzY2FsZVJhbmdlICYmIGlzVmdSYW5nZVN0ZXAoc2NhbGVSYW5nZSkgP1xuICAgICAgc2NhbGVSYW5nZS5zdGVwIDpcbiAgICAgIGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXA7XG4gICAgaWYgKHR5cGVvZiByYW5nZVN0ZXAgIT09ICdudW1iZXInKSB7XG4gICAgICAvLyBGSVhNRSBjb25zb2xpZGF0ZSB0aGlzIGxvZ1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgbm9uLW51bWVyaWMgcmFuZ2VTdGVwJyk7XG4gICAgfVxuICAgIHJldHVybiByYW5nZVN0ZXAgLyAxLjU7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/mark/valueref.d.ts b/build/src/compile/mark/valueref.d.ts new file mode 100644 index 0000000000..0672885791 --- /dev/null +++ b/build/src/compile/mark/valueref.d.ts @@ -0,0 +1,32 @@ +import { Channel } from '../../channel'; +import { Config } from '../../config'; +import { ChannelDef, ChannelDefWithCondition, FieldDef, FieldRefOption, TextFieldDef } from '../../fielddef'; +import { Mark, MarkDef } from '../../mark'; +import { StackProperties } from '../../stack'; +import { VgSignalRef, VgValueRef } from '../../vega.schema'; +import { ScaleComponent } from '../scale/component'; +/** + * @return Vega ValueRef for stackable x or y + */ +export declare function stackable(channel: 'x' | 'y', channelDef: ChannelDef, scaleName: string, scale: ScaleComponent, stack: StackProperties, defaultRef: VgValueRef): VgValueRef; +/** + * @return Vega ValueRef for stackable x2 or y2 + */ +export declare function stackable2(channel: 'x2' | 'y2', aFieldDef: ChannelDef, a2fieldDef: ChannelDef, scaleName: string, scale: ScaleComponent, stack: StackProperties, defaultRef: VgValueRef): VgValueRef; +export declare function getOffset(channel: 'x' | 'y' | 'x2' | 'y2', markDef: MarkDef): any; +/** + * Value Ref for binned fields + */ +export declare function bin(fieldDef: FieldDef, scaleName: string, side: 'start' | 'end', offset?: number): VgValueRef; +export declare function fieldRef(fieldDef: FieldDef, scaleName: string, opt: FieldRefOption, mixins?: { + offset?: number | VgValueRef; + band?: number | boolean; +}): VgValueRef; +export declare function bandRef(scaleName: string, band?: number | boolean): VgValueRef; +/** + * @returns {VgValueRef} Value Ref for xc / yc or mid point for other channels. + */ +export declare function midPoint(channel: Channel, channelDef: ChannelDef, scaleName: string, scale: ScaleComponent, stack: StackProperties, defaultRef: VgValueRef): VgValueRef; +export declare function text(textDef: ChannelDefWithCondition>, config: Config): VgValueRef; +export declare function mid(sizeRef: VgSignalRef): VgValueRef; +export declare function getDefaultRef(defaultRef: VgValueRef | 'zeroOrMin' | 'zeroOrMax', channel: 'x' | 'y', scaleName: string, scale: ScaleComponent, mark: Mark): VgValueRef; diff --git a/build/src/compile/mark/valueref.js b/build/src/compile/mark/valueref.js new file mode 100644 index 0000000000..ab2b8c4d6d --- /dev/null +++ b/build/src/compile/mark/valueref.js @@ -0,0 +1,200 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/** + * Utility files for producing Vega ValueRef for marks + */ +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var common_1 = require("../common"); +// TODO: we need to find a way to refactor these so that scaleName is a part of scale +// but that's complicated. For now, this is a huge step moving forward. +/** + * @return Vega ValueRef for stackable x or y + */ +function stackable(channel, channelDef, scaleName, scale, stack, defaultRef) { + if (fielddef_1.isFieldDef(channelDef) && stack && channel === stack.fieldChannel) { + // x or y use stack_end so that stacked line's point mark use stack_end too. + return fieldRef(channelDef, scaleName, { suffix: 'end' }); + } + return midPoint(channel, channelDef, scaleName, scale, stack, defaultRef); +} +exports.stackable = stackable; +/** + * @return Vega ValueRef for stackable x2 or y2 + */ +function stackable2(channel, aFieldDef, a2fieldDef, scaleName, scale, stack, defaultRef) { + if (fielddef_1.isFieldDef(aFieldDef) && stack && + // If fieldChannel is X and channel is X2 (or Y and Y2) + channel.charAt(0) === stack.fieldChannel.charAt(0)) { + return fieldRef(aFieldDef, scaleName, { suffix: 'start' }); + } + return midPoint(channel, a2fieldDef, scaleName, scale, stack, defaultRef); +} +exports.stackable2 = stackable2; +function getOffset(channel, markDef) { + var offsetChannel = channel + 'Offset'; + // TODO: in the future read from encoding channel too + var markDefOffsetValue = markDef[offsetChannel]; + if (markDefOffsetValue) { + return markDefOffsetValue; + } + return undefined; +} +exports.getOffset = getOffset; +/** + * Value Ref for binned fields + */ +function bin(fieldDef, scaleName, side, offset) { + var binSuffix = side === 'start' ? undefined : 'end'; + return fieldRef(fieldDef, scaleName, { binSuffix: binSuffix }, offset ? { offset: offset } : {}); +} +exports.bin = bin; +function fieldRef(fieldDef, scaleName, opt, mixins) { + var ref = tslib_1.__assign({}, (scaleName ? { scale: scaleName } : {}), { field: fielddef_1.vgField(fieldDef, opt) }); + if (mixins) { + return tslib_1.__assign({}, ref, mixins); + } + return ref; +} +exports.fieldRef = fieldRef; +function bandRef(scaleName, band) { + if (band === void 0) { band = true; } + return { + scale: scaleName, + band: band + }; +} +exports.bandRef = bandRef; +/** + * Signal that returns the middle of a bin. Should only be used with x and y. + */ +function binMidSignal(fieldDef, scaleName) { + return { + signal: "(" + + ("scale(\"" + scaleName + "\", " + fielddef_1.vgField(fieldDef, { expr: 'datum' }) + ")") + + " + " + + ("scale(\"" + scaleName + "\", " + fielddef_1.vgField(fieldDef, { binSuffix: 'end', expr: 'datum' }) + ")") + + ")/2" + }; +} +/** + * @returns {VgValueRef} Value Ref for xc / yc or mid point for other channels. + */ +function midPoint(channel, channelDef, scaleName, scale, stack, defaultRef) { + // TODO: datum support + if (channelDef) { + /* istanbul ignore else */ + if (fielddef_1.isFieldDef(channelDef)) { + if (channelDef.bin) { + // Use middle only for x an y to place marks in the center between start and end of the bin range. + // We do not use the mid point for other channels (e.g. size) so that properties of legends and marks match. + if (util_1.contains([channel_1.X, channel_1.Y], channel) && channelDef.type === type_1.QUANTITATIVE) { + if (stack && stack.impute) { + // For stack, we computed bin_mid so we can impute. + return fieldRef(channelDef, scaleName, { binSuffix: 'mid' }); + } + // For non-stack, we can just calculate bin mid on the fly using signal. + return binMidSignal(channelDef, scaleName); + } + return fieldRef(channelDef, scaleName, common_1.binRequiresRange(channelDef, channel) ? { binSuffix: 'range' } : {}); + } + if (scale) { + var scaleType = scale.get('type'); + if (scale_1.hasDiscreteDomain(scaleType)) { + if (scaleType === 'band') { + // For band, to get mid point, need to offset by half of the band + return fieldRef(channelDef, scaleName, { binSuffix: 'range' }, { band: 0.5 }); + } + return fieldRef(channelDef, scaleName, { binSuffix: 'range' }); + } + } + return fieldRef(channelDef, scaleName, {}); // no need for bin suffix + } + else if (fielddef_1.isValueDef(channelDef)) { + var value = channelDef.value; + if (util_1.contains(['x', 'x2'], channel) && value === 'width') { + return { field: { group: 'width' } }; + } + else if (util_1.contains(['y', 'y2'], channel) && value === 'height') { + return { field: { group: 'height' } }; + } + return { value: value }; + } + // If channelDef is neither field def or value def, it's a condition-only def. + // In such case, we will use default ref. + } + return defaultRef; +} +exports.midPoint = midPoint; +function text(textDef, config) { + // text + if (textDef) { + if (fielddef_1.isFieldDef(textDef)) { + return common_1.formatSignalRef(textDef, textDef.format, 'datum', config); + } + else if (fielddef_1.isValueDef(textDef)) { + return { value: textDef.value }; + } + } + return undefined; +} +exports.text = text; +function mid(sizeRef) { + return tslib_1.__assign({}, sizeRef, { mult: 0.5 }); +} +exports.mid = mid; +/** + * Whether the scale definitely includes zero in the domain + */ +function domainDefinitelyIncludeZero(scale) { + if (scale.get('zero') !== false) { + return true; + } + var domains = scale.domains; + if (vega_util_1.isArray(domains)) { + return util_1.some(domains, function (d) { return vega_util_1.isArray(d) && d.length === 2 && d[0] <= 0 && d[1] >= 0; }); + } + return false; +} +function getDefaultRef(defaultRef, channel, scaleName, scale, mark) { + if (vega_util_1.isString(defaultRef)) { + if (scaleName) { + var scaleType = scale.get('type'); + if (util_1.contains([scale_1.ScaleType.LOG, scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scaleType)) { + // Log scales cannot have zero. + // Zero in time scale is arbitrary, and does not affect ratio. + // (Time is an interval level of measurement, not ratio). + // See https://en.wikipedia.org/wiki/Level_of_measurement for more info. + if (mark === 'bar' || mark === 'area') { + log.warn(log.message.nonZeroScaleUsedWithLengthMark(mark, channel, { scaleType: scaleType })); + } + } + else { + if (domainDefinitelyIncludeZero(scale)) { + return { + scale: scaleName, + value: 0 + }; + } + if (mark === 'bar' || mark === 'area') { + log.warn(log.message.nonZeroScaleUsedWithLengthMark(mark, channel, { zeroFalse: scale.explicit.zero === false })); + } + } + } + if (defaultRef === 'zeroOrMin') { + return channel === 'x' ? { value: 0 } : { field: { group: 'height' } }; + } + else { // zeroOrMax + return channel === 'x' ? { field: { group: 'width' } } : { value: 0 }; + } + } + return defaultRef; +} +exports.getDefaultRef = getDefaultRef; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVyZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3ZhbHVlcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsdUNBQTRDO0FBRTVDLHlDQUE0QztBQUU1QywyQ0FTd0I7QUFDeEIscURBQWlDO0FBRWpDLHFDQUF5RDtBQUV6RCxtQ0FBd0M7QUFDeEMsbUNBQTBDO0FBRTFDLG9DQUE0RDtBQUk1RCxxRkFBcUY7QUFDckYsd0VBQXdFO0FBRXhFOztHQUVHO0FBQ0gsbUJBQTBCLE9BQWtCLEVBQUUsVUFBOEIsRUFBRSxTQUFpQixFQUFFLEtBQXFCLEVBQ2xILEtBQXNCLEVBQUUsVUFBc0I7SUFDaEQsSUFBSSxxQkFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLFlBQVksRUFBRTtRQUNyRSw0RUFBNEU7UUFDNUUsT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBUEQsOEJBT0M7QUFFRDs7R0FFRztBQUNILG9CQUEyQixPQUFvQixFQUFFLFNBQTZCLEVBQUUsVUFBOEIsRUFBRSxTQUFpQixFQUFFLEtBQXFCLEVBQ3BKLEtBQXNCLEVBQUUsVUFBc0I7SUFDaEQsSUFBSSxxQkFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUs7UUFDOUIsdURBQXVEO1FBQ3ZELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQ2hEO1FBQ0osT0FBTyxRQUFRLENBQUMsU0FBUyxF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QUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtvQkFDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUNqRCxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBQyxDQUMxRCxDQUFDLENBQUM7aUJBQ0o7YUFDRjtTQUNGO1FBRUQsSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQzlCLE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUM7U0FDbEU7YUFBTSxFQUFFLFlBQVk7WUFDbkIsT0FBTyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQztTQUNqRTtLQUNGO0lBQ0QsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQztBQXJDRCxzQ0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgZmlsZXMgZm9yIHByb2R1Y2luZyBWZWdhIFZhbHVlUmVmIGZvciBtYXJrc1xuICovXG5pbXBvcnQge2lzQXJyYXksIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0NoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBDaGFubmVsRGVmLFxuICBDaGFubmVsRGVmV2l0aENvbmRpdGlvbixcbiAgRmllbGREZWYsXG4gIEZpZWxkUmVmT3B0aW9uLFxuICBpc0ZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBUZXh0RmllbGREZWYsXG4gIHZnRmllbGQsXG59IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrLCBNYXJrRGVmfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW4sIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtTdGFja1Byb3BlcnRpZXN9IGZyb20gJy4uLy4uL3N0YWNrJztcbmltcG9ydCB7UVVBTlRJVEFUSVZFfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7Y29udGFpbnMsIHNvbWV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ1NpZ25hbFJlZiwgVmdWYWx1ZVJlZn0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtiaW5SZXF1aXJlc1JhbmdlLCBmb3JtYXRTaWduYWxSZWZ9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50fSBmcm9tICcuLi9zY2FsZS9jb21wb25lbnQnO1xuXG5cbi8vIFRPRE86IHdlIG5lZWQgdG8gZmluZCBhIHdheSB0byByZWZhY3RvciB0aGVzZSBzbyB0aGF0IHNjYWxlTmFtZSBpcyBhIHBhcnQgb2Ygc2NhbGVcbi8vIGJ1dCB0aGF0J3MgY29tcGxpY2F0ZWQuICBGb3Igbm93LCB0aGlzIGlzIGEgaHVnZSBzdGVwIG1vdmluZyBmb3J3YXJkLlxuXG4vKipcbiAqIEByZXR1cm4gVmVnYSBWYWx1ZVJlZiBmb3Igc3RhY2thYmxlIHggb3IgeVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2thYmxlKGNoYW5uZWw6ICd4JyB8ICd5JywgY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+LCBzY2FsZU5hbWU6IHN0cmluZywgc2NhbGU6IFNjYWxlQ29tcG9uZW50LFxuICAgIHN0YWNrOiBTdGFja1Byb3BlcnRpZXMsIGRlZmF1bHRSZWY6IFZnVmFsdWVSZWYpOiBWZ1ZhbHVlUmVmIHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikgJiYgc3RhY2sgJiYgY2hhbm5lbCA9PT0gc3RhY2suZmllbGRDaGFubmVsKSB7XG4gICAgLy8geCBvciB5IHVzZSBzdGFja19lbmQgc28gdGhhdCBzdGFja2VkIGxpbmUncyBwb2ludCBtYXJrIHVzZSBzdGFja19lbmQgdG9vLlxuICAgIHJldHVybiBmaWVsZFJlZihjaGFubmVsRGVmLCBzY2FsZU5hbWUsIHtzdWZmaXg6ICdlbmQnfSk7XG4gIH1cbiAgcmV0dXJuIG1pZFBvaW50KGNoYW5uZWwsIGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwgc2NhbGUsIHN0YWNrLCBkZWZhdWx0UmVmKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIFZlZ2EgVmFsdWVSZWYgZm9yIHN0YWNrYWJsZSB4MiBvciB5MlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2thYmxlMihjaGFubmVsOiAneDInIHwgJ3kyJywgYUZpZWxkRGVmOiBDaGFubmVsRGVmPHN0cmluZz4sIGEyZmllbGREZWY6IENoYW5uZWxEZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcsIHNjYWxlOiBTY2FsZUNvbXBvbmVudCxcbiAgICBzdGFjazogU3RhY2tQcm9wZXJ0aWVzLCBkZWZhdWx0UmVmOiBWZ1ZhbHVlUmVmKTogVmdWYWx1ZVJlZiB7XG4gIGlmIChpc0ZpZWxkRGVmKGFGaWVsZERlZikgJiYgc3RhY2sgJiZcbiAgICAgIC8vIElmIGZpZWxkQ2hhbm5lbCBpcyBYIGFuZCBjaGFubmVsIGlzIFgyIChvciBZIGFuZCBZMilcbiAgICAgIGNoYW5uZWwuY2hhckF0KDApID09PSBzdGFjay5maWVsZENoYW5uZWwuY2hhckF0KDApXG4gICAgICApIHtcbiAgICByZXR1cm4gZmllbGRSZWYoYUZpZWxkRGVmLCBzY2FsZU5hbWUsIHtzdWZmaXg6ICdzdGFydCd9KTtcbiAgfVxuICByZXR1cm4gbWlkUG9pbnQoY2hhbm5lbCwgYTJmaWVsZERlZiwgc2NhbGVOYW1lLCBzY2FsZSwgc3RhY2ssIGRlZmF1bHRSZWYpO1xufVxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9mZnNldChjaGFubmVsOiAneCcgfCAneScgfCAneDInIHwgJ3kyJywgbWFya0RlZjogTWFya0RlZikge1xuICBjb25zdCBvZmZzZXRDaGFubmVsID0gY2hhbm5lbCArICdPZmZzZXQnO1xuICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIHJlYWQgZnJvbSBlbmNvZGluZyBjaGFubmVsIHRvb1xuXG4gIGNvbnN0IG1hcmtEZWZPZmZzZXRWYWx1ZSA9IG1hcmtEZWZbb2Zmc2V0Q2hhbm5lbF07XG4gIGlmIChtYXJrRGVmT2Zmc2V0VmFsdWUpIHtcbiAgICByZXR1cm4gbWFya0RlZk9mZnNldFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWx1ZSBSZWYgZm9yIGJpbm5lZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbihmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcsIHNpZGU6ICdzdGFydCcgfCAnZW5kJywgb2Zmc2V0PzogbnVtYmVyKSB7XG4gIGNvbnN0IGJpblN1ZmZpeCA9IHNpZGUgPT09ICdzdGFydCcgPyB1bmRlZmluZWQgOiAnZW5kJztcbiAgcmV0dXJuIGZpZWxkUmVmKGZpZWxkRGVmLCBzY2FsZU5hbWUsIHtiaW5TdWZmaXh9LCBvZmZzZXQgPyB7b2Zmc2V0fSA6IHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkUmVmKFxuICAgIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzY2FsZU5hbWU6IHN0cmluZywgb3B0OiBGaWVsZFJlZk9wdGlvbixcbiAgICBtaXhpbnM/OiB7b2Zmc2V0PzogbnVtYmVyIHwgVmdWYWx1ZVJlZiwgYmFuZD86IG51bWJlcnxib29sZWFufVxuICApOiBWZ1ZhbHVlUmVmIHtcblxuICBjb25zdCByZWY6IFZnVmFsdWVSZWYgPSB7XG4gICAgLi4uKHNjYWxlTmFtZSA/IHtzY2FsZTogc2NhbGVOYW1lfSA6IHt9KSxcbiAgICBmaWVsZDogdmdGaWVsZChmaWVsZERlZiwgb3B0KSxcbiAgfTtcblxuICBpZiAobWl4aW5zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlZixcbiAgICAgIC4uLm1peGluc1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhbmRSZWYoc2NhbGVOYW1lOiBzdHJpbmcsIGJhbmQ6IG51bWJlcnxib29sZWFuID0gdHJ1ZSk6IFZnVmFsdWVSZWYge1xuICByZXR1cm4ge1xuICAgIHNjYWxlOiBzY2FsZU5hbWUsXG4gICAgYmFuZDogYmFuZFxuICB9O1xufVxuXG4vKipcbiAqIFNpZ25hbCB0aGF0IHJldHVybnMgdGhlIG1pZGRsZSBvZiBhIGJpbi4gU2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHggYW5kIHkuXG4gKi9cbmZ1bmN0aW9uIGJpbk1pZFNpZ25hbChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzaWduYWw6IGAoYCArXG4gICAgICBgc2NhbGUoXCIke3NjYWxlTmFtZX1cIiwgJHt2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pfSlgICtcbiAgICAgIGAgKyBgICtcbiAgICAgIGBzY2FsZShcIiR7c2NhbGVOYW1lfVwiLCAke3ZnRmllbGQoZmllbGREZWYsIHtiaW5TdWZmaXg6ICdlbmQnLCBleHByOiAnZGF0dW0nfSl9KWArXG4gICAgYCkvMmBcbiAgfTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7VmdWYWx1ZVJlZn0gVmFsdWUgUmVmIGZvciB4YyAvIHljIG9yIG1pZCBwb2ludCBmb3Igb3RoZXIgY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRQb2ludChjaGFubmVsOiBDaGFubmVsLCBjaGFubmVsRGVmOiBDaGFubmVsRGVmPHN0cmluZz4sIHNjYWxlTmFtZTogc3RyaW5nLCBzY2FsZTogU2NhbGVDb21wb25lbnQsIHN0YWNrOiBTdGFja1Byb3BlcnRpZXMsIGRlZmF1bHRSZWY6IFZnVmFsdWVSZWYpOiBWZ1ZhbHVlUmVmIHtcbiAgLy8gVE9ETzogZGF0dW0gc3VwcG9ydFxuXG4gIGlmIChjaGFubmVsRGVmKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICBpZiAoY2hhbm5lbERlZi5iaW4pIHtcbiAgICAgICAgLy8gVXNlIG1pZGRsZSBvbmx5IGZvciB4IGFuIHkgdG8gcGxhY2UgbWFya3MgaW4gdGhlIGNlbnRlciBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGJpbiByYW5nZS5cbiAgICAgICAgLy8gV2UgZG8gbm90IHVzZSB0aGUgbWlkIHBvaW50IGZvciBvdGhlciBjaGFubmVscyAoZS5nLiBzaXplKSBzbyB0aGF0IHByb3BlcnRpZXMgb2YgbGVnZW5kcyBhbmQgbWFya3MgbWF0Y2guXG4gICAgICAgIGlmIChjb250YWlucyhbWCwgWV0sIGNoYW5uZWwpICYmIGNoYW5uZWxEZWYudHlwZSA9PT0gUVVBTlRJVEFUSVZFKSB7XG4gICAgICAgICAgaWYgKHN0YWNrICYmIHN0YWNrLmltcHV0ZSkge1xuICAgICAgICAgICAgLy8gRm9yIHN0YWNrLCB3ZSBjb21wdXRlZCBiaW5fbWlkIHNvIHdlIGNhbiBpbXB1dGUuXG4gICAgICAgICAgICByZXR1cm4gZmllbGRSZWYoY2hhbm5lbERlZiwgc2NhbGVOYW1lLCB7YmluU3VmZml4OiAnbWlkJ30pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGb3Igbm9uLXN0YWNrLCB3ZSBjYW4ganVzdCBjYWxjdWxhdGUgYmluIG1pZCBvbiB0aGUgZmx5IHVzaW5nIHNpZ25hbC5cbiAgICAgICAgICByZXR1cm4gYmluTWlkU2lnbmFsKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwgYmluUmVxdWlyZXNSYW5nZShjaGFubmVsRGVmLCBjaGFubmVsKSA/IHtiaW5TdWZmaXg6ICdyYW5nZSd9IDoge30pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NhbGUpIHtcbiAgICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgICAgICAgaWYgKHNjYWxlVHlwZSA9PT0gJ2JhbmQnKSB7XG4gICAgICAgICAgICAvLyBGb3IgYmFuZCwgdG8gZ2V0IG1pZCBwb2ludCwgbmVlZCB0byBvZmZzZXQgYnkgaGFsZiBvZiB0aGUgYmFuZFxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwge2JpblN1ZmZpeDogJ3JhbmdlJ30sIHtiYW5kOiAwLjV9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwge2JpblN1ZmZpeDogJ3JhbmdlJ30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGRSZWYoY2hhbm5lbERlZiwgc2NhbGVOYW1lLCB7fSk7IC8vIG5vIG5lZWQgZm9yIGJpbiBzdWZmaXhcbiAgICB9IGVsc2UgaWYgKGlzVmFsdWVEZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2hhbm5lbERlZi52YWx1ZTtcblxuICAgICAgaWYgKGNvbnRhaW5zKFsneCcsICd4MiddLCBjaGFubmVsKSAmJiB2YWx1ZSA9PT0gJ3dpZHRoJykge1xuICAgICAgICByZXR1cm4ge2ZpZWxkOiB7Z3JvdXA6ICd3aWR0aCd9fTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbnMoWyd5JywgJ3kyJ10sIGNoYW5uZWwpICYmIHZhbHVlID09PSAnaGVpZ2h0Jykge1xuICAgICAgICByZXR1cm4ge2ZpZWxkOiB7Z3JvdXA6ICdoZWlnaHQnfX07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7dmFsdWV9O1xuICAgIH1cblxuICAgIC8vIElmIGNoYW5uZWxEZWYgaXMgbmVpdGhlciBmaWVsZCBkZWYgb3IgdmFsdWUgZGVmLCBpdCdzIGEgY29uZGl0aW9uLW9ubHkgZGVmLlxuICAgIC8vIEluIHN1Y2ggY2FzZSwgd2Ugd2lsbCB1c2UgZGVmYXVsdCByZWYuXG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRleHQodGV4dERlZjogQ2hhbm5lbERlZldpdGhDb25kaXRpb248VGV4dEZpZWxkRGVmPHN0cmluZz4+LCBjb25maWc6IENvbmZpZyk6IFZnVmFsdWVSZWYge1xuICAvLyB0ZXh0XG4gIGlmICh0ZXh0RGVmKSB7XG4gICAgaWYgKGlzRmllbGREZWYodGV4dERlZikpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTaWduYWxSZWYodGV4dERlZiwgdGV4dERlZi5mb3JtYXQsICdkYXR1bScsIGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbHVlRGVmKHRleHREZWYpKSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiB0ZXh0RGVmLnZhbHVlfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pZChzaXplUmVmOiBWZ1NpZ25hbFJlZik6IFZnVmFsdWVSZWYge1xuICByZXR1cm4gey4uLnNpemVSZWYsIG11bHQ6IDAuNX07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NhbGUgZGVmaW5pdGVseSBpbmNsdWRlcyB6ZXJvIGluIHRoZSBkb21haW5cbiAqL1xuZnVuY3Rpb24gZG9tYWluRGVmaW5pdGVseUluY2x1ZGVaZXJvKHNjYWxlOiBTY2FsZUNvbXBvbmVudCkge1xuICBpZiAoc2NhbGUuZ2V0KCd6ZXJvJykgIT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgZG9tYWlucyA9IHNjYWxlLmRvbWFpbnM7XG4gIGlmIChpc0FycmF5KGRvbWFpbnMpKSB7XG4gICAgcmV0dXJuIHNvbWUoZG9tYWlucywgKGQpID0+IGlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIgJiYgZFswXSA8PTAgJiYgZFsxXSA+PSAwKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UmVmKFxuICBkZWZhdWx0UmVmOiBWZ1ZhbHVlUmVmIHwgJ3plcm9Pck1pbicgfCAnemVyb09yTWF4JyxcbiAgY2hhbm5lbDogJ3gnIHwgJ3knLCBzY2FsZU5hbWU6IHN0cmluZywgc2NhbGU6IFNjYWxlQ29tcG9uZW50LCBtYXJrOiBNYXJrXG4pIHtcbiAgaWYgKGlzU3RyaW5nKGRlZmF1bHRSZWYpKSB7XG4gICAgaWYgKHNjYWxlTmFtZSkge1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICBpZiAoY29udGFpbnMoW1NjYWxlVHlwZS5MT0csIFNjYWxlVHlwZS5USU1FLCBTY2FsZVR5cGUuVVRDXSwgc2NhbGVUeXBlKSkge1xuICAgICAgICAvLyBMb2cgc2NhbGVzIGNhbm5vdCBoYXZlIHplcm8uXG4gICAgICAgIC8vIFplcm8gaW4gdGltZSBzY2FsZSBpcyBhcmJpdHJhcnksIGFuZCBkb2VzIG5vdCBhZmZlY3QgcmF0aW8uXG4gICAgICAgIC8vIChUaW1lIGlzIGFuIGludGVydmFsIGxldmVsIG9mIG1lYXN1cmVtZW50LCBub3QgcmF0aW8pLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV2ZWxfb2ZfbWVhc3VyZW1lbnQgZm9yIG1vcmUgaW5mby5cbiAgICAgICAgaWYgKG1hcmsgPT09ICdiYXInIHx8IG1hcmsgPT09ICdhcmVhJykge1xuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLm5vblplcm9TY2FsZVVzZWRXaXRoTGVuZ3RoTWFyayhtYXJrLCBjaGFubmVsLCB7c2NhbGVUeXBlfSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZG9tYWluRGVmaW5pdGVseUluY2x1ZGVaZXJvKHNjYWxlKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2FsZTogc2NhbGVOYW1lLFxuICAgICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrID09PSAnYmFyJyB8fCBtYXJrID09PSAnYXJlYScpIHtcbiAgICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5ub25aZXJvU2NhbGVVc2VkV2l0aExlbmd0aE1hcmsoXG4gICAgICAgICAgICBtYXJrLCBjaGFubmVsLCB7emVyb0ZhbHNlOiBzY2FsZS5leHBsaWNpdC56ZXJvID09PSBmYWxzZX1cbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0UmVmID09PSAnemVyb09yTWluJykge1xuICAgICAgcmV0dXJuIGNoYW5uZWwgPT09ICd4JyA/IHt2YWx1ZTogMH0gOiB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fTtcbiAgICB9IGVsc2UgeyAvLyB6ZXJvT3JNYXhcbiAgICAgIHJldHVybiBjaGFubmVsID09PSAneCcgPyB7ZmllbGQ6IHtncm91cDogJ3dpZHRoJ319IDoge3ZhbHVlOiAwfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZWY7XG59XG5cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/model.d.ts b/build/src/compile/model.d.ts new file mode 100644 index 0000000000..b46492398e --- /dev/null +++ b/build/src/compile/model.d.ts @@ -0,0 +1,167 @@ +import { Channel, ScaleChannel, SingleDefChannel } from '../channel'; +import { Config } from '../config'; +import { Data, DataSourceType } from '../data'; +import { FieldDef, FieldRefOption } from '../fielddef'; +import { Resolve } from '../resolve'; +import { BaseSpec } from '../spec'; +import { TitleParams } from '../title'; +import { Transform } from '../transform'; +import { Dict } from '../util'; +import { VgAxis, VgData, VgEncodeEntry, VgLayout, VgLegend, VgMarkGroup, VgProjection, VgSignal, VgSignalRef, VgTitle } from '../vega.schema'; +import { AxisComponentIndex } from './axis/component'; +import { ConcatModel } from './concat'; +import { DataComponent } from './data'; +import { FacetModel } from './facet'; +import { LayerModel } from './layer'; +import { LayoutHeaderComponent } from './layout/header'; +import { LayoutSizeComponent, LayoutSizeIndex } from './layoutsize/component'; +import { LegendComponentIndex } from './legend/component'; +import { ProjectionComponent } from './projection/component'; +import { RepeatModel } from './repeat'; +import { RepeaterValue } from './repeater'; +import { ScaleComponent, ScaleComponentIndex } from './scale/component'; +import { SelectionComponent } from './selection/selection'; +import { UnitModel } from './unit'; +/** + * Composable Components that are intermediate results of the parsing phase of the + * compilations. The components represents parts of the specification in a form that + * can be easily merged (during parsing for composite specs). + * In addition, these components are easily transformed into Vega specifications + * during the "assemble" phase, which is the last phase of the compilation step. + */ +export interface Component { + data: DataComponent; + layoutSize: LayoutSizeComponent; + layoutHeaders: { + row?: LayoutHeaderComponent; + column?: LayoutHeaderComponent; + }; + mark: VgMarkGroup[]; + scales: ScaleComponentIndex; + projection: ProjectionComponent; + selection: Dict; + /** Dictionary mapping channel to VgAxis definition */ + axes: AxisComponentIndex; + /** Dictionary mapping channel to VgLegend definition */ + legends: LegendComponentIndex; + resolve: Resolve; +} +export interface NameMapInterface { + rename(oldname: string, newName: string): void; + has(name: string): boolean; + get(name: string): string; +} +export declare class NameMap implements NameMapInterface { + private nameMap; + constructor(); + rename(oldName: string, newName: string): void; + has(name: string): boolean; + get(name: string): string; +} +export declare function isUnitModel(model: Model): model is UnitModel; +export declare function isFacetModel(model: Model): model is FacetModel; +export declare function isRepeatModel(model: Model): model is RepeatModel; +export declare function isConcatModel(model: Model): model is ConcatModel; +export declare function isLayerModel(model: Model): model is LayerModel; +export declare abstract class Model { + abstract readonly type: 'unit' | 'facet' | 'layer' | 'concat' | 'repeat'; + readonly parent: Model; + readonly name: string; + readonly title: TitleParams; + readonly description: string; + readonly data: Data; + readonly transforms: Transform[]; + /** Name map for scales, which can be renamed by a model's parent. */ + protected scaleNameMap: NameMapInterface; + /** Name map for projections, which can be renamed by a model's parent. */ + protected projectionNameMap: NameMapInterface; + /** Name map for size, which can be renamed by a model's parent. */ + protected layoutSizeNameMap: NameMapInterface; + readonly repeater: RepeaterValue; + readonly config: Config; + readonly component: Component; + abstract readonly children: Model[]; + constructor(spec: BaseSpec, parent: Model, parentGivenName: string, config: Config, repeater: RepeaterValue, resolve: Resolve); + readonly width: VgSignalRef; + readonly height: VgSignalRef; + protected initSize(size: LayoutSizeIndex): void; + parse(): void; + abstract parseData(): void; + abstract parseSelection(): void; + parseScale(): void; + parseProjection(): void; + abstract parseLayoutSize(): void; + /** + * Rename top-level spec's size to be just width / height, ignoring model name. + * This essentially merges the top-level spec's width/height signals with the width/height signals + * to help us reduce redundant signals declaration. + */ + private renameTopLevelLayoutSize; + abstract parseMarkGroup(): void; + abstract parseAxisAndHeader(): void; + parseLegend(): void; + abstract assembleSelectionTopLevelSignals(signals: any[]): any[]; + abstract assembleSelectionSignals(): any[]; + abstract assembleSelectionData(data: VgData[]): VgData[]; + assembleGroupStyle(): string; + assembleLayoutSize(): VgEncodeEntry; + abstract assembleLayout(): VgLayout; + abstract assembleLayoutSignals(): VgSignal[]; + assembleHeaderMarks(): VgMarkGroup[]; + abstract assembleMarks(): VgMarkGroup[]; + assembleAxes(): VgAxis[]; + assembleLegends(): VgLegend[]; + assembleProjections(): VgProjection[]; + assembleTitle(): VgTitle; + /** + * Assemble the mark group for this model. We accept optional `signals` so that we can include concat top-level signals with the top-level model's local signals. + */ + assembleGroup(signals?: VgSignal[]): any; + hasDescendantWithFieldOnChannel(channel: Channel): boolean; + getName(text: string): string; + /** + * Request a data source name for the given data source type and mark that data source as required. This method should be called in parse, so that all used data source can be correctly instantiated in assembleData(). + */ + requestDataName(name: DataSourceType): string; + getSizeSignalRef(sizeType: 'width' | 'height'): VgSignalRef; + /** + * Lookup the name of the datasource for an output node. You probably want to call this in assemble. + */ + lookupDataSource(name: string): string; + getSizeName(oldSizeName: string): string; + renameLayoutSize(oldName: string, newName: string): void; + renameScale(oldName: string, newName: string): void; + renameProjection(oldName: string, newName: string): void; + /** + * @return scale name for a given channel after the scale has been parsed and named. + */ + scaleName(originalScaleName: Channel | string, parse?: boolean): string; + /** + * @return projection name after the projection has been parsed and named. + */ + projectionName(parse?: boolean): string; + /** + * Corrects the data references in marks after assemble. + */ + correctDataNames: (mark: any) => any; + /** + * Traverse a model's hierarchy to get the scale component for a particular channel. + */ + getScaleComponent(channel: ScaleChannel): ScaleComponent; + /** + * Traverse a model's hierarchy to get a particular selection component. + */ + getSelectionComponent(variableName: string, origName: string): SelectionComponent; +} +/** Abstract class for UnitModel and FacetModel. Both of which can contain fieldDefs as a part of its own specification. */ +export declare abstract class ModelWithField extends Model { + abstract fieldDef(channel: SingleDefChannel): FieldDef; + /** Get "field" reference for vega */ + vgField(channel: SingleDefChannel, opt?: FieldRefOption): string; + protected abstract getMapping(): { + [key in Channel]?: any; + }; + reduceFieldDef(f: (acc: U, fd: FieldDef, c: Channel) => U, init: T, t?: any): any; + forEachFieldDef(f: (fd: FieldDef, c: Channel) => void, t?: any): void; + abstract channelHasField(channel: Channel): boolean; +} diff --git a/build/src/compile/model.js b/build/src/compile/model.js new file mode 100644 index 0000000000..6c62df025a --- /dev/null +++ b/build/src/compile/model.js @@ -0,0 +1,451 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../channel"); +var encoding_1 = require("../encoding"); +var fielddef_1 = require("../fielddef"); +var log = tslib_1.__importStar(require("../log")); +var scale_1 = require("../scale"); +var spec_1 = require("../spec"); +var title_1 = require("../title"); +var transform_1 = require("../transform"); +var util_1 = require("../util"); +var vega_schema_1 = require("../vega.schema"); +var assemble_1 = require("./axis/assemble"); +var header_1 = require("./layout/header"); +var assemble_2 = require("./layoutsize/assemble"); +var assemble_3 = require("./legend/assemble"); +var parse_1 = require("./legend/parse"); +var assemble_4 = require("./projection/assemble"); +var parse_2 = require("./projection/parse"); +var assemble_5 = require("./scale/assemble"); +var domain_1 = require("./scale/domain"); +var parse_3 = require("./scale/parse"); +var split_1 = require("./split"); +var NameMap = /** @class */ (function () { + function NameMap() { + this.nameMap = {}; + } + NameMap.prototype.rename = function (oldName, newName) { + this.nameMap[oldName] = newName; + }; + NameMap.prototype.has = function (name) { + return this.nameMap[name] !== undefined; + }; + NameMap.prototype.get = function (name) { + // If the name appears in the _nameMap, we need to read its new name. + // We have to loop over the dict just in case the new name also gets renamed. + while (this.nameMap[name] && name !== this.nameMap[name]) { + name = this.nameMap[name]; + } + return name; + }; + return NameMap; +}()); +exports.NameMap = NameMap; +/* + We use type guards instead of `instanceof` as `instanceof` makes + different parts of the compiler depend on the actual implementation of + the model classes, which in turn depend on different parts of the compiler. + Thus, `instanceof` leads to circular dependency problems. + + On the other hand, type guards only make different parts of the compiler + depend on the type of the model classes, but not the actual implementation. +*/ +function isUnitModel(model) { + return model && model.type === 'unit'; +} +exports.isUnitModel = isUnitModel; +function isFacetModel(model) { + return model && model.type === 'facet'; +} +exports.isFacetModel = isFacetModel; +function isRepeatModel(model) { + return model && model.type === 'repeat'; +} +exports.isRepeatModel = isRepeatModel; +function isConcatModel(model) { + return model && model.type === 'concat'; +} +exports.isConcatModel = isConcatModel; +function isLayerModel(model) { + return model && model.type === 'layer'; +} +exports.isLayerModel = isLayerModel; +var Model = /** @class */ (function () { + function Model(spec, parent, parentGivenName, config, repeater, resolve) { + var _this = this; + this.children = []; + /** + * Corrects the data references in marks after assemble. + */ + this.correctDataNames = function (mark) { + // TODO: make this correct + // for normal data references + if (mark.from && mark.from.data) { + mark.from.data = _this.lookupDataSource(mark.from.data); + } + // for access to facet data + if (mark.from && mark.from.facet && mark.from.facet.data) { + mark.from.facet.data = _this.lookupDataSource(mark.from.facet.data); + } + return mark; + }; + this.parent = parent; + this.config = config; + this.repeater = repeater; + // If name is not provided, always use parent's givenName to avoid name conflicts. + this.name = spec.name || parentGivenName; + this.title = vega_util_1.isString(spec.title) ? { text: spec.title } : spec.title; + // Shared name maps + this.scaleNameMap = parent ? parent.scaleNameMap : new NameMap(); + this.projectionNameMap = parent ? parent.projectionNameMap : new NameMap(); + this.layoutSizeNameMap = parent ? parent.layoutSizeNameMap : new NameMap(); + this.data = spec.data; + this.description = spec.description; + this.transforms = transform_1.normalizeTransform(spec.transform || []); + this.component = { + data: { + sources: parent ? parent.component.data.sources : {}, + outputNodes: parent ? parent.component.data.outputNodes : {}, + outputNodeRefCounts: parent ? parent.component.data.outputNodeRefCounts : {}, + // data is faceted if the spec is a facet spec or the parent has faceted data and no data is defined + isFaceted: spec_1.isFacetSpec(spec) || (parent && parent.component.data.isFaceted && !spec.data) + }, + layoutSize: new split_1.Split(), + layoutHeaders: { row: {}, column: {} }, + mark: null, + resolve: tslib_1.__assign({ scale: {}, axis: {}, legend: {} }, (resolve || {})), + selection: null, + scales: null, + projection: null, + axes: {}, + legends: {}, + }; + } + Object.defineProperty(Model.prototype, "width", { + get: function () { + return this.getSizeSignalRef('width'); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Model.prototype, "height", { + get: function () { + return this.getSizeSignalRef('height'); + }, + enumerable: true, + configurable: true + }); + Model.prototype.initSize = function (size) { + var width = size.width, height = size.height; + if (width) { + this.component.layoutSize.set('width', width, true); + } + if (height) { + this.component.layoutSize.set('height', height, true); + } + }; + Model.prototype.parse = function () { + this.parseScale(); + this.parseLayoutSize(); // depends on scale + this.renameTopLevelLayoutSize(); + this.parseSelection(); + this.parseProjection(); + this.parseData(); // (pathorder) depends on markDef; selection filters depend on parsed selections; depends on projection because some transforms require the finalized projection name. + this.parseAxisAndHeader(); // depends on scale and layout size + this.parseLegend(); // depends on scale, markDef + this.parseMarkGroup(); // depends on data name, scale, layout size, axisGroup, and children's scale, axis, legend and mark. + }; + Model.prototype.parseScale = function () { + parse_3.parseScale(this); + }; + Model.prototype.parseProjection = function () { + parse_2.parseProjection(this); + }; + /** + * Rename top-level spec's size to be just width / height, ignoring model name. + * This essentially merges the top-level spec's width/height signals with the width/height signals + * to help us reduce redundant signals declaration. + */ + Model.prototype.renameTopLevelLayoutSize = function () { + if (this.getName('width') !== 'width') { + this.renameLayoutSize(this.getName('width'), 'width'); + } + if (this.getName('height') !== 'height') { + this.renameLayoutSize(this.getName('height'), 'height'); + } + }; + Model.prototype.parseLegend = function () { + parse_1.parseLegend(this); + }; + Model.prototype.assembleGroupStyle = function () { + if (this.type === 'unit' || this.type === 'layer') { + return 'cell'; + } + return undefined; + }; + Model.prototype.assembleLayoutSize = function () { + if (this.type === 'unit' || this.type === 'layer') { + return { + width: this.getSizeSignalRef('width'), + height: this.getSizeSignalRef('height') + }; + } + return undefined; + }; + Model.prototype.assembleHeaderMarks = function () { + var layoutHeaders = this.component.layoutHeaders; + var headerMarks = []; + for (var _i = 0, HEADER_CHANNELS_1 = header_1.HEADER_CHANNELS; _i < HEADER_CHANNELS_1.length; _i++) { + var channel = HEADER_CHANNELS_1[_i]; + if (layoutHeaders[channel].title) { + headerMarks.push(header_1.getTitleGroup(this, channel)); + } + } + for (var _a = 0, HEADER_CHANNELS_2 = header_1.HEADER_CHANNELS; _a < HEADER_CHANNELS_2.length; _a++) { + var channel = HEADER_CHANNELS_2[_a]; + headerMarks = headerMarks.concat(header_1.getHeaderGroups(this, channel)); + } + return headerMarks; + }; + Model.prototype.assembleAxes = function () { + return assemble_1.assembleAxes(this.component.axes, this.config); + }; + Model.prototype.assembleLegends = function () { + return assemble_3.assembleLegends(this); + }; + Model.prototype.assembleProjections = function () { + return assemble_4.assembleProjections(this); + }; + Model.prototype.assembleTitle = function () { + var title = tslib_1.__assign({}, title_1.extractTitleConfig(this.config.title).nonMark, this.title); + if (title.text) { + if (!util_1.contains(['unit', 'layer'], this.type)) { + // As described in https://github.com/vega/vega-lite/issues/2875: + // Due to vega/vega#960 (comment), we only support title's anchor for unit and layered spec for now. + if (title.anchor && title.anchor !== 'start') { + log.warn(log.message.cannotSetTitleAnchor(this.type)); + } + title.anchor = 'start'; + } + return util_1.keys(title).length > 0 ? title : undefined; + } + return undefined; + }; + /** + * Assemble the mark group for this model. We accept optional `signals` so that we can include concat top-level signals with the top-level model's local signals. + */ + Model.prototype.assembleGroup = function (signals) { + if (signals === void 0) { signals = []; } + var group = {}; + signals = signals.concat(this.assembleSelectionSignals()); + if (signals.length > 0) { + group.signals = signals; + } + var layout = this.assembleLayout(); + if (layout) { + group.layout = layout; + } + group.marks = [].concat(this.assembleHeaderMarks(), this.assembleMarks()); + // Only include scales if this spec is top-level or if parent is facet. + // (Otherwise, it will be merged with upper-level's scope.) + var scales = (!this.parent || isFacetModel(this.parent)) ? assemble_5.assembleScales(this) : []; + if (scales.length > 0) { + group.scales = scales; + } + var axes = this.assembleAxes(); + if (axes.length > 0) { + group.axes = axes; + } + var legends = this.assembleLegends(); + if (legends.length > 0) { + group.legends = legends; + } + return group; + }; + Model.prototype.hasDescendantWithFieldOnChannel = function (channel) { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (isUnitModel(child)) { + if (child.channelHasField(channel)) { + return true; + } + } + else { + if (child.hasDescendantWithFieldOnChannel(channel)) { + return true; + } + } + } + return false; + }; + Model.prototype.getName = function (text) { + return util_1.varName((this.name ? this.name + '_' : '') + text); + }; + /** + * Request a data source name for the given data source type and mark that data source as required. This method should be called in parse, so that all used data source can be correctly instantiated in assembleData(). + */ + Model.prototype.requestDataName = function (name) { + var fullName = this.getName(name); + // Increase ref count. This is critical because otherwise we won't create a data source. + // We also increase the ref counts on OutputNode.getSource() calls. + var refCounts = this.component.data.outputNodeRefCounts; + refCounts[fullName] = (refCounts[fullName] || 0) + 1; + return fullName; + }; + Model.prototype.getSizeSignalRef = function (sizeType) { + if (isFacetModel(this.parent)) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var scaleComponent = this.component.scales[channel]; + if (scaleComponent && !scaleComponent.merged) { // independent scale + var type = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (scale_1.hasDiscreteDomain(type) && vega_schema_1.isVgRangeStep(range)) { + var scaleName = scaleComponent.get('name'); + var domain = domain_1.assembleDomain(this, channel); + var field = domain_1.getFieldFromDomain(domain); + if (field) { + var fieldRef = fielddef_1.vgField({ aggregate: 'distinct', field: field }, { expr: 'datum' }); + return { + signal: assemble_2.sizeExpr(scaleName, scaleComponent, fieldRef) + }; + } + else { + log.warn('Unknown field for ${channel}. Cannot calculate view size.'); + return null; + } + } + } + } + return { + signal: this.layoutSizeNameMap.get(this.getName(sizeType)) + }; + }; + /** + * Lookup the name of the datasource for an output node. You probably want to call this in assemble. + */ + Model.prototype.lookupDataSource = function (name) { + var node = this.component.data.outputNodes[name]; + if (!node) { + // Name not found in map so let's just return what we got. + // This can happen if we already have the correct name. + return name; + } + return node.getSource(); + }; + Model.prototype.getSizeName = function (oldSizeName) { + return this.layoutSizeNameMap.get(oldSizeName); + }; + Model.prototype.renameLayoutSize = function (oldName, newName) { + this.layoutSizeNameMap.rename(oldName, newName); + }; + Model.prototype.renameScale = function (oldName, newName) { + this.scaleNameMap.rename(oldName, newName); + }; + Model.prototype.renameProjection = function (oldName, newName) { + this.projectionNameMap.rename(oldName, newName); + }; + /** + * @return scale name for a given channel after the scale has been parsed and named. + */ + Model.prototype.scaleName = function (originalScaleName, parse) { + if (parse) { + // During the parse phase always return a value + // No need to refer to rename map because a scale can't be renamed + // before it has the original name. + return this.getName(originalScaleName); + } + // If there is a scale for the channel, it should either + // be in the scale component or exist in the name map + if ( + // If there is a scale for the channel, there should be a local scale component for it + (channel_1.isChannel(originalScaleName) && channel_1.isScaleChannel(originalScaleName) && this.component.scales[originalScaleName]) || + // in the scale name map (the scale get merged by its parent) + this.scaleNameMap.has(this.getName(originalScaleName))) { + return this.scaleNameMap.get(this.getName(originalScaleName)); + } + return undefined; + }; + /** + * @return projection name after the projection has been parsed and named. + */ + Model.prototype.projectionName = function (parse) { + if (parse) { + // During the parse phase always return a value + // No need to refer to rename map because a projection can't be renamed + // before it has the original name. + return this.getName('projection'); + } + if ((this.component.projection && !this.component.projection.merged) || this.projectionNameMap.has(this.getName('projection'))) { + return this.projectionNameMap.get(this.getName('projection')); + } + return undefined; + }; + /** + * Traverse a model's hierarchy to get the scale component for a particular channel. + */ + Model.prototype.getScaleComponent = function (channel) { + /* istanbul ignore next: This is warning for debugging test */ + if (!this.component.scales) { + throw new Error('getScaleComponent cannot be called before parseScale(). Make sure you have called parseScale or use parseUnitModelWithScale().'); + } + var localScaleComponent = this.component.scales[channel]; + if (localScaleComponent && !localScaleComponent.merged) { + return localScaleComponent; + } + return (this.parent ? this.parent.getScaleComponent(channel) : undefined); + }; + /** + * Traverse a model's hierarchy to get a particular selection component. + */ + Model.prototype.getSelectionComponent = function (variableName, origName) { + var sel = this.component.selection[variableName]; + if (!sel && this.parent) { + sel = this.parent.getSelectionComponent(variableName, origName); + } + if (!sel) { + throw new Error(log.message.selectionNotFound(origName)); + } + return sel; + }; + return Model; +}()); +exports.Model = Model; +/** Abstract class for UnitModel and FacetModel. Both of which can contain fieldDefs as a part of its own specification. */ +var ModelWithField = /** @class */ (function (_super) { + tslib_1.__extends(ModelWithField, _super); + function ModelWithField() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** Get "field" reference for vega */ + ModelWithField.prototype.vgField = function (channel, opt) { + if (opt === void 0) { opt = {}; } + var fieldDef = this.fieldDef(channel); + if (!fieldDef) { + return undefined; + } + return fielddef_1.vgField(fieldDef, opt); + }; + ModelWithField.prototype.reduceFieldDef = function (f, init, t) { + return encoding_1.reduce(this.getMapping(), function (acc, cd, c) { + var fieldDef = fielddef_1.getFieldDef(cd); + if (fieldDef) { + return f(acc, fieldDef, c); + } + return acc; + }, init, t); + }; + ModelWithField.prototype.forEachFieldDef = function (f, t) { + encoding_1.forEach(this.getMapping(), function (cd, c) { + var fieldDef = fielddef_1.getFieldDef(cd); + if (fieldDef) { + f(fieldDef, c); + } + }, t); + }; + return ModelWithField; +}(Model)); +exports.ModelWithField = ModelWithField; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBbUM7QUFDbkMsc0NBQThGO0FBRzlGLHdDQUE0QztBQUM1Qyx3Q0FBdUY7QUFDdkYsa0RBQThCO0FBRTlCLGtDQUEyQztBQUMzQyxnQ0FBOEM7QUFDOUMsa0NBQXlEO0FBQ3pELDBDQUEyRDtBQUMzRCxnQ0FBc0Q7QUFDdEQsOENBQTJKO0FBQzNKLDRDQUE2QztBQU03QywwQ0FBdUc7QUFDdkcsa0RBQStDO0FBRS9DLDhDQUFrRDtBQUVsRCx3Q0FBMkM7QUFDM0Msa0RBQTBEO0FBRTFELDRDQUFtRDtBQUduRCw2Q0FBZ0Q7QUFFaEQseUNBQWtFO0FBQ2xFLHVDQUF5QztBQUV6QyxpQ0FBOEI7QUF3QzlCO0lBR0U7UUFDRSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU0sd0JBQU0sR0FBYixVQUFjLE9BQWUsRUFBRSxPQUFlO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFHTSxxQkFBRyxHQUFWLFVBQVcsSUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFFTSxxQkFBRyxHQUFWLFVBQVcsSUFBWTtRQUNyQixxRUFBcUU7UUFDckUsNkVBQTZFO1FBQzdFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN4RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMzQjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILGNBQUM7QUFBRCxDQUFD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Q0FBZSxHQUF0QixVQUF1QixDQUE2QyxFQUFFLENBQU87UUFDM0Usa0JBQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsVUFBQyxFQUFzQixFQUFFLENBQVU7WUFDNUQsSUFBTSxRQUFRLEdBQUcsc0JBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQyxJQUFJLFFBQVEsRUFBRTtnQkFDWixDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ2hCO1FBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVILHFCQUFDO0FBQUQsQ0FBQyxBQW5DRCxDQUE2QyxLQUFLLEdBbUNqRDtBQW5DcUIsd0NBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtDaGFubmVsLCBpc0NoYW5uZWwsIGlzU2NhbGVDaGFubmVsLCBTY2FsZUNoYW5uZWwsIFNpbmdsZURlZkNoYW5uZWx9IGZyb20gJy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0RhdGEsIERhdGFTb3VyY2VUeXBlfSBmcm9tICcuLi9kYXRhJztcbmltcG9ydCB7Zm9yRWFjaCwgcmVkdWNlfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQge0NoYW5uZWxEZWYsIEZpZWxkRGVmLCBGaWVsZFJlZk9wdGlvbiwgZ2V0RmllbGREZWYsIHZnRmllbGR9IGZyb20gJy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW59IGZyb20gJy4uL3NjYWxlJztcbmltcG9ydCB7QmFzZVNwZWMsIGlzRmFjZXRTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7ZXh0cmFjdFRpdGxlQ29uZmlnLCBUaXRsZVBhcmFtc30gZnJvbSAnLi4vdGl0bGUnO1xuaW1wb3J0IHtub3JtYWxpemVUcmFuc2Zvcm0sIFRyYW5zZm9ybX0gZnJvbSAnLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7Y29udGFpbnMsIERpY3QsIGtleXMsIHZhck5hbWV9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwLCBWZ0F4aXMsIFZnRGF0YSwgVmdFbmNvZGVFbnRyeSwgVmdMYXlvdXQsIFZnTGVnZW5kLCBWZ01hcmtHcm91cCwgVmdQcm9qZWN0aW9uLCBWZ1NpZ25hbCwgVmdTaWduYWxSZWYsIFZnVGl0bGV9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YXNzZW1ibGVBeGVzfSBmcm9tICcuL2F4aXMvYXNzZW1ibGUnO1xuaW1wb3J0IHtBeGlzQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vYXhpcy9jb21wb25lbnQnO1xuaW1wb3J0IHtDb25jYXRNb2RlbH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtEYXRhQ29tcG9uZW50fSBmcm9tICcuL2RhdGEnO1xuaW1wb3J0IHtGYWNldE1vZGVsfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7TGF5ZXJNb2RlbH0gZnJvbSAnLi9sYXllcic7XG5pbXBvcnQge2dldEhlYWRlckdyb3VwcywgZ2V0VGl0bGVHcm91cCwgSEVBREVSX0NIQU5ORUxTLCBMYXlvdXRIZWFkZXJDb21wb25lbnR9IGZyb20gJy4vbGF5b3V0L2hlYWRlcic7XG5pbXBvcnQge3NpemVFeHByfSBmcm9tICcuL2xheW91dHNpemUvYXNzZW1ibGUnO1xuaW1wb3J0IHtMYXlvdXRTaXplQ29tcG9uZW50LCBMYXlvdXRTaXplSW5kZXh9IGZyb20gJy4vbGF5b3V0c2l6ZS9jb21wb25lbnQnO1xuaW1wb3J0IHthc3NlbWJsZUxlZ2VuZHN9IGZyb20gJy4vbGVnZW5kL2Fzc2VtYmxlJztcbmltcG9ydCB7TGVnZW5kQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vbGVnZW5kL2NvbXBvbmVudCc7XG5pbXBvcnQge3BhcnNlTGVnZW5kfSBmcm9tICcuL2xlZ2VuZC9wYXJzZSc7XG5pbXBvcnQge2Fzc2VtYmxlUHJvamVjdGlvbnN9IGZyb20gJy4vcHJvamVjdGlvbi9hc3NlbWJsZSc7XG5pbXBvcnQge1Byb2plY3Rpb25Db21wb25lbnR9IGZyb20gJy4vcHJvamVjdGlvbi9jb21wb25lbnQnO1xuaW1wb3J0IHtwYXJzZVByb2plY3Rpb259IGZyb20gJy4vcHJvamVjdGlvbi9wYXJzZSc7XG5pbXBvcnQge1JlcGVhdE1vZGVsfSBmcm9tICcuL3JlcGVhdCc7XG5pbXBvcnQge1JlcGVhdGVyVmFsdWV9IGZyb20gJy4vcmVwZWF0ZXInO1xuaW1wb3J0IHthc3NlbWJsZVNjYWxlc30gZnJvbSAnLi9zY2FsZS9hc3NlbWJsZSc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50LCBTY2FsZUNvbXBvbmVudEluZGV4fSBmcm9tICcuL3NjYWxlL2NvbXBvbmVudCc7XG5pbXBvcnQge2Fzc2VtYmxlRG9tYWluLCBnZXRGaWVsZEZyb21Eb21haW59IGZyb20gJy4vc2NhbGUvZG9tYWluJztcbmltcG9ydCB7cGFyc2VTY2FsZX0gZnJvbSAnLi9zY2FsZS9wYXJzZSc7XG5pbXBvcnQge1NlbGVjdGlvbkNvbXBvbmVudH0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7U3BsaXR9IGZyb20gJy4vc3BsaXQnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vdW5pdCc7XG5cbi8qKlxuICogQ29tcG9zYWJsZSBDb21wb25lbnRzIHRoYXQgYXJlIGludGVybWVkaWF0ZSByZXN1bHRzIG9mIHRoZSBwYXJzaW5nIHBoYXNlIG9mIHRoZVxuICogY29tcGlsYXRpb25zLiAgVGhlIGNvbXBvbmVudHMgcmVwcmVzZW50cyBwYXJ0cyBvZiB0aGUgc3BlY2lmaWNhdGlvbiBpbiBhIGZvcm0gdGhhdFxuICogY2FuIGJlIGVhc2lseSBtZXJnZWQgKGR1cmluZyBwYXJzaW5nIGZvciBjb21wb3NpdGUgc3BlY3MpLlxuICogSW4gYWRkaXRpb24sIHRoZXNlIGNvbXBvbmVudHMgYXJlIGVhc2lseSB0cmFuc2Zvcm1lZCBpbnRvIFZlZ2Egc3BlY2lmaWNhdGlvbnNcbiAqIGR1cmluZyB0aGUgXCJhc3NlbWJsZVwiIHBoYXNlLCB3aGljaCBpcyB0aGUgbGFzdCBwaGFzZSBvZiB0aGUgY29tcGlsYXRpb24gc3RlcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnQge1xuICBkYXRhOiBEYXRhQ29tcG9uZW50O1xuXG4gIGxheW91dFNpemU6IExheW91dFNpemVDb21wb25lbnQ7XG5cbiAgbGF5b3V0SGVhZGVyczoge1xuICAgIHJvdz86IExheW91dEhlYWRlckNvbXBvbmVudCxcbiAgICBjb2x1bW4/OiBMYXlvdXRIZWFkZXJDb21wb25lbnRcbiAgfTtcblxuICBtYXJrOiBWZ01hcmtHcm91cFtdO1xuICBzY2FsZXM6IFNjYWxlQ29tcG9uZW50SW5kZXg7XG4gIHByb2plY3Rpb246IFByb2plY3Rpb25Db21wb25lbnQ7XG4gIHNlbGVjdGlvbjogRGljdDxTZWxlY3Rpb25Db21wb25lbnQ+O1xuXG4gIC8qKiBEaWN0aW9uYXJ5IG1hcHBpbmcgY2hhbm5lbCB0byBWZ0F4aXMgZGVmaW5pdGlvbiAqL1xuICBheGVzOiBBeGlzQ29tcG9uZW50SW5kZXg7XG5cbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBjaGFubmVsIHRvIFZnTGVnZW5kIGRlZmluaXRpb24gKi9cbiAgbGVnZW5kczogTGVnZW5kQ29tcG9uZW50SW5kZXg7XG5cbiAgcmVzb2x2ZTogUmVzb2x2ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOYW1lTWFwSW50ZXJmYWNlIHtcbiAgcmVuYW1lKG9sZG5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKTogdm9pZDtcbiAgaGFzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBOYW1lTWFwIGltcGxlbWVudHMgTmFtZU1hcEludGVyZmFjZSB7XG4gIHByaXZhdGUgbmFtZU1hcDogRGljdDxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubmFtZU1hcCA9IHt9O1xuICB9XG5cbiAgcHVibGljIHJlbmFtZShvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIHRoaXMubmFtZU1hcFtvbGROYW1lXSA9IG5ld05hbWU7XG4gIH1cblxuXG4gIHB1YmxpYyBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubmFtZU1hcFtuYW1lXSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGdldChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIElmIHRoZSBuYW1lIGFwcGVhcnMgaW4gdGhlIF9uYW1lTWFwLCB3ZSBuZWVkIHRvIHJlYWQgaXRzIG5ldyBuYW1lLlxuICAgIC8vIFdlIGhhdmUgdG8gbG9vcCBvdmVyIHRoZSBkaWN0IGp1c3QgaW4gY2FzZSB0aGUgbmV3IG5hbWUgYWxzbyBnZXRzIHJlbmFtZWQuXG4gICAgd2hpbGUgKHRoaXMubmFtZU1hcFtuYW1lXSAmJiBuYW1lICE9PSB0aGlzLm5hbWVNYXBbbmFtZV0pIHtcbiAgICAgIG5hbWUgPSB0aGlzLm5hbWVNYXBbbmFtZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cbn1cblxuLypcbiAgV2UgdXNlIHR5cGUgZ3VhcmRzIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIGFzIGBpbnN0YW5jZW9mYCBtYWtlc1xuICBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGNvbXBpbGVyIGRlcGVuZCBvbiB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mXG4gIHRoZSBtb2RlbCBjbGFzc2VzLCB3aGljaCBpbiB0dXJuIGRlcGVuZCBvbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGNvbXBpbGVyLlxuICBUaHVzLCBgaW5zdGFuY2VvZmAgbGVhZHMgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeSBwcm9ibGVtcy5cblxuICBPbiB0aGUgb3RoZXIgaGFuZCwgdHlwZSBndWFyZHMgb25seSBtYWtlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY29tcGlsZXJcbiAgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBtb2RlbCBjbGFzc2VzLCBidXQgbm90IHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uXG4qL1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVbml0TW9kZWwobW9kZWw6IE1vZGVsKTogbW9kZWwgaXMgVW5pdE1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsICYmIG1vZGVsLnR5cGUgPT09ICd1bml0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFjZXRNb2RlbChtb2RlbDogTW9kZWwpOiBtb2RlbCBpcyBGYWNldE1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsICYmIG1vZGVsLnR5cGUgPT09ICdmYWNldCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcGVhdE1vZGVsKG1vZGVsOiBNb2RlbCk6IG1vZGVsIGlzIFJlcGVhdE1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsICYmIG1vZGVsLnR5cGUgPT09ICdyZXBlYXQnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jYXRNb2RlbChtb2RlbDogTW9kZWwpOiBtb2RlbCBpcyBDb25jYXRNb2RlbCB7XG4gIHJldHVybiBtb2RlbCAmJiBtb2RlbC50eXBlID09PSAnY29uY2F0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTGF5ZXJNb2RlbChtb2RlbDogTW9kZWwpOiBtb2RlbCBpcyBMYXllck1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsICYmIG1vZGVsLnR5cGUgPT09ICdsYXllcic7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNb2RlbCB7XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHR5cGU6ICd1bml0JyB8ICdmYWNldCcgfCAnbGF5ZXInIHwgJ2NvbmNhdCcgfCAncmVwZWF0JztcbiAgcHVibGljIHJlYWRvbmx5IHBhcmVudDogTW9kZWw7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBUaXRsZVBhcmFtcztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgcHVibGljIHJlYWRvbmx5IGRhdGE6IERhdGE7XG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2Zvcm1zOiBUcmFuc2Zvcm1bXTtcblxuICAvKiogTmFtZSBtYXAgZm9yIHNjYWxlcywgd2hpY2ggY2FuIGJlIHJlbmFtZWQgYnkgYSBtb2RlbCdzIHBhcmVudC4gKi9cbiAgcHJvdGVjdGVkIHNjYWxlTmFtZU1hcDogTmFtZU1hcEludGVyZmFjZTtcblxuICAvKiogTmFtZSBtYXAgZm9yIHByb2plY3Rpb25zLCB3aGljaCBjYW4gYmUgcmVuYW1lZCBieSBhIG1vZGVsJ3MgcGFyZW50LiAqL1xuICBwcm90ZWN0ZWQgcHJvamVjdGlvbk5hbWVNYXA6IE5hbWVNYXBJbnRlcmZhY2U7XG5cbiAgLyoqIE5hbWUgbWFwIGZvciBzaXplLCB3aGljaCBjYW4gYmUgcmVuYW1lZCBieSBhIG1vZGVsJ3MgcGFyZW50LiAqL1xuICBwcm90ZWN0ZWQgbGF5b3V0U2l6ZU5hbWVNYXA6IE5hbWVNYXBJbnRlcmZhY2U7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IENvbmZpZztcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50OiBDb21wb25lbnQ7XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNoaWxkcmVuOiBNb2RlbFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc3BlYzogQmFzZVNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLCBjb25maWc6IENvbmZpZywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIHJlc29sdmU6IFJlc29sdmUpIHtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnJlcGVhdGVyID0gcmVwZWF0ZXI7XG5cbiAgICAvLyBJZiBuYW1lIGlzIG5vdCBwcm92aWRlZCwgYWx3YXlzIHVzZSBwYXJlbnQncyBnaXZlbk5hbWUgdG8gYXZvaWQgbmFtZSBjb25mbGljdHMuXG4gICAgdGhpcy5uYW1lID0gc3BlYy5uYW1lIHx8IHBhcmVudEdpdmVuTmFtZTtcbiAgICB0aGlzLnRpdGxlID0gaXNTdHJpbmcoc3BlYy50aXRsZSkgPyB7dGV4dDogc3BlYy50aXRsZX0gOiBzcGVjLnRpdGxlO1xuXG4gICAgLy8gU2hhcmVkIG5hbWUgbWFwc1xuICAgIHRoaXMuc2NhbGVOYW1lTWFwID0gcGFyZW50ID8gcGFyZW50LnNjYWxlTmFtZU1hcCA6IG5ldyBOYW1lTWFwKCk7XG4gICAgdGhpcy5wcm9qZWN0aW9uTmFtZU1hcCA9IHBhcmVudCA/IHBhcmVudC5wcm9qZWN0aW9uTmFtZU1hcCA6IG5ldyBOYW1lTWFwKCk7XG4gICAgdGhpcy5sYXlvdXRTaXplTmFtZU1hcCA9IHBhcmVudCA/IHBhcmVudC5sYXlvdXRTaXplTmFtZU1hcCA6IG5ldyBOYW1lTWFwKCk7XG5cbiAgICB0aGlzLmRhdGEgPSBzcGVjLmRhdGE7XG5cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gc3BlYy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnRyYW5zZm9ybXMgPSBub3JtYWxpemVUcmFuc2Zvcm0oc3BlYy50cmFuc2Zvcm0gfHwgW10pO1xuXG4gICAgdGhpcy5jb21wb25lbnQgPSB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHNvdXJjZXM6IHBhcmVudCA/IHBhcmVudC5jb21wb25lbnQuZGF0YS5zb3VyY2VzIDoge30sXG4gICAgICAgIG91dHB1dE5vZGVzOiBwYXJlbnQgPyBwYXJlbnQuY29tcG9uZW50LmRhdGEub3V0cHV0Tm9kZXMgOiB7fSxcbiAgICAgICAgb3V0cHV0Tm9kZVJlZkNvdW50czogcGFyZW50ID8gcGFyZW50LmNvbXBvbmVudC5kYXRhLm91dHB1dE5vZGVSZWZDb3VudHMgOiB7fSxcbiAgICAgICAgLy8gZGF0YSBpcyBmYWNldGVkIGlmIHRoZSBzcGVjIGlzIGEgZmFjZXQgc3BlYyBvciB0aGUgcGFyZW50IGhhcyBmYWNldGVkIGRhdGEgYW5kIG5vIGRhdGEgaXMgZGVmaW5lZFxuICAgICAgICBpc0ZhY2V0ZWQ6IGlzRmFjZXRTcGVjKHNwZWMpIHx8IChwYXJlbnQgJiYgcGFyZW50LmNvbXBvbmVudC5kYXRhLmlzRmFjZXRlZCAmJiAhc3BlYy5kYXRhKVxuICAgICAgfSxcbiAgICAgIGxheW91dFNpemU6IG5ldyBTcGxpdDxMYXlvdXRTaXplSW5kZXg+KCksXG4gICAgICBsYXlvdXRIZWFkZXJzOntyb3c6IHt9LCBjb2x1bW46IHt9fSxcbiAgICAgIG1hcms6IG51bGwsXG4gICAgICByZXNvbHZlOiB7XG4gICAgICAgIHNjYWxlOiB7fSwgYXhpczoge30sIGxlZ2VuZDoge30sXG4gICAgICAgIC4uLihyZXNvbHZlIHx8IHt9KVxuICAgICAgfSxcbiAgICAgIHNlbGVjdGlvbjogbnVsbCxcbiAgICAgIHNjYWxlczogbnVsbCxcbiAgICAgIHByb2plY3Rpb246IG51bGwsXG4gICAgICBheGVzOiB7fSxcbiAgICAgIGxlZ2VuZHM6IHt9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdpZHRoKCk6IFZnU2lnbmFsUmVmIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTaXplU2lnbmFsUmVmKCd3aWR0aCcpO1xuICB9XG5cblxuICBwdWJsaWMgZ2V0IGhlaWdodCgpOiBWZ1NpZ25hbFJlZiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2l6ZVNpZ25hbFJlZignaGVpZ2h0Jyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5pdFNpemUoc2l6ZTogTGF5b3V0U2l6ZUluZGV4KSB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gc2l6ZTtcbiAgICBpZiAod2lkdGgpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50LmxheW91dFNpemUuc2V0KCd3aWR0aCcsIHdpZHRoLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICB0aGlzLmNvbXBvbmVudC5sYXlvdXRTaXplLnNldCgnaGVpZ2h0JywgaGVpZ2h0LCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2UoKSB7XG4gICAgdGhpcy5wYXJzZVNjYWxlKCk7XG5cbiAgICB0aGlzLnBhcnNlTGF5b3V0U2l6ZSgpOyAvLyBkZXBlbmRzIG9uIHNjYWxlXG4gICAgdGhpcy5yZW5hbWVUb3BMZXZlbExheW91dFNpemUoKTtcblxuICAgIHRoaXMucGFyc2VTZWxlY3Rpb24oKTtcbiAgICB0aGlzLnBhcnNlUHJvamVjdGlvbigpO1xuICAgIHRoaXMucGFyc2VEYXRhKCk7IC8vIChwYXRob3JkZXIpIGRlcGVuZHMgb24gbWFya0RlZjsgc2VsZWN0aW9uIGZpbHRlcnMgZGVwZW5kIG9uIHBhcnNlZCBzZWxlY3Rpb25zOyBkZXBlbmRzIG9uIHByb2plY3Rpb24gYmVjYXVzZSBzb21lIHRyYW5zZm9ybXMgcmVxdWlyZSB0aGUgZmluYWxpemVkIHByb2plY3Rpb24gbmFtZS5cbiAgICB0aGlzLnBhcnNlQXhpc0FuZEhlYWRlcigpOyAvLyBkZXBlbmRzIG9uIHNjYWxlIGFuZCBsYXlvdXQgc2l6ZVxuICAgIHRoaXMucGFyc2VMZWdlbmQoKTsgLy8gZGVwZW5kcyBvbiBzY2FsZSwgbWFya0RlZlxuICAgIHRoaXMucGFyc2VNYXJrR3JvdXAoKTsgLy8gZGVwZW5kcyBvbiBkYXRhIG5hbWUsIHNjYWxlLCBsYXlvdXQgc2l6ZSwgYXhpc0dyb3VwLCBhbmQgY2hpbGRyZW4ncyBzY2FsZSwgYXhpcywgbGVnZW5kIGFuZCBtYXJrLlxuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHBhcnNlRGF0YSgpOiB2b2lkO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBwYXJzZVNlbGVjdGlvbigpOiB2b2lkO1xuXG5cbiAgcHVibGljIHBhcnNlU2NhbGUoKSB7XG4gICAgcGFyc2VTY2FsZSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVByb2plY3Rpb24oKSB7XG4gICAgcGFyc2VQcm9qZWN0aW9uKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHBhcnNlTGF5b3V0U2l6ZSgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZW5hbWUgdG9wLWxldmVsIHNwZWMncyBzaXplIHRvIGJlIGp1c3Qgd2lkdGggLyBoZWlnaHQsIGlnbm9yaW5nIG1vZGVsIG5hbWUuXG4gICAqIFRoaXMgZXNzZW50aWFsbHkgbWVyZ2VzIHRoZSB0b3AtbGV2ZWwgc3BlYydzIHdpZHRoL2hlaWdodCBzaWduYWxzIHdpdGggdGhlIHdpZHRoL2hlaWdodCBzaWduYWxzXG4gICAqIHRvIGhlbHAgdXMgcmVkdWNlIHJlZHVuZGFudCBzaWduYWxzIGRlY2xhcmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5hbWVUb3BMZXZlbExheW91dFNpemUoKSB7XG4gICAgaWYgKHRoaXMuZ2V0TmFtZSgnd2lkdGgnKSAhPT0gJ3dpZHRoJykge1xuICAgICAgdGhpcy5yZW5hbWVMYXlvdXRTaXplKHRoaXMuZ2V0TmFtZSgnd2lkdGgnKSwgJ3dpZHRoJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldE5hbWUoJ2hlaWdodCcpICE9PSAnaGVpZ2h0Jykge1xuICAgICAgdGhpcy5yZW5hbWVMYXlvdXRTaXplKHRoaXMuZ2V0TmFtZSgnaGVpZ2h0JyksICdoZWlnaHQnKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcGFyc2VNYXJrR3JvdXAoKTogdm9pZDtcblxuICBwdWJsaWMgYWJzdHJhY3QgcGFyc2VBeGlzQW5kSGVhZGVyKCk6IHZvaWQ7XG5cbiAgcHVibGljIHBhcnNlTGVnZW5kKCkge1xuICAgIHBhcnNlTGVnZW5kKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IGFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKHNpZ25hbHM6IGFueVtdKTogYW55W107XG4gIHB1YmxpYyBhYnN0cmFjdCBhc3NlbWJsZVNlbGVjdGlvblNpZ25hbHMoKTogYW55W107XG5cbiAgcHVibGljIGFic3RyYWN0IGFzc2VtYmxlU2VsZWN0aW9uRGF0YShkYXRhOiBWZ0RhdGFbXSk6IFZnRGF0YVtdO1xuXG4gIHB1YmxpYyBhc3NlbWJsZUdyb3VwU3R5bGUoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5pdCcgfHwgdGhpcy50eXBlID09PSAnbGF5ZXInKSB7XG4gICAgICByZXR1cm4gJ2NlbGwnO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2l6ZSgpOiBWZ0VuY29kZUVudHJ5IHtcbiAgICBpZiAodGhpcy50eXBlID09PSAndW5pdCcgfHwgdGhpcy50eXBlID09PSAnbGF5ZXInKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3aWR0aDogdGhpcy5nZXRTaXplU2lnbmFsUmVmKCd3aWR0aCcpLFxuICAgICAgICBoZWlnaHQ6IHRoaXMuZ2V0U2l6ZVNpZ25hbFJlZignaGVpZ2h0JylcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQ7XG5cbiAgcHVibGljIGFic3RyYWN0IGFzc2VtYmxlTGF5b3V0U2lnbmFscygpOiBWZ1NpZ25hbFtdO1xuXG4gIHB1YmxpYyBhc3NlbWJsZUhlYWRlck1hcmtzKCk6IFZnTWFya0dyb3VwW10ge1xuICAgIGNvbnN0IHtsYXlvdXRIZWFkZXJzfSA9IHRoaXMuY29tcG9uZW50O1xuICAgIGxldCBoZWFkZXJNYXJrcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBjaGFubmVsIG9mIEhFQURFUl9DSEFOTkVMUykge1xuICAgICAgaWYgKGxheW91dEhlYWRlcnNbY2hhbm5lbF0udGl0bGUpIHtcbiAgICAgICAgaGVhZGVyTWFya3MucHVzaChnZXRUaXRsZUdyb3VwKHRoaXMsIGNoYW5uZWwpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgSEVBREVSX0NIQU5ORUxTKSB7XG4gICAgICBoZWFkZXJNYXJrcyA9IGhlYWRlck1hcmtzLmNvbmNhdChnZXRIZWFkZXJHcm91cHModGhpcywgY2hhbm5lbCkpO1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyTWFya3M7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgYXNzZW1ibGVNYXJrcygpOiBWZ01hcmtHcm91cFtdOyAvLyBUT0RPOiBWZ01hcmtHcm91cFtdXG5cbiAgcHVibGljIGFzc2VtYmxlQXhlcygpOiBWZ0F4aXNbXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlQXhlcyh0aGlzLmNvbXBvbmVudC5heGVzLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMZWdlbmRzKCk6IFZnTGVnZW5kW10ge1xuICAgIHJldHVybiBhc3NlbWJsZUxlZ2VuZHModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVQcm9qZWN0aW9ucygpOiBWZ1Byb2plY3Rpb25bXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlUHJvamVjdGlvbnModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVUaXRsZSgpOiBWZ1RpdGxlIHtcbiAgICBjb25zdCB0aXRsZTogVmdUaXRsZSA9IHtcbiAgICAgIC4uLmV4dHJhY3RUaXRsZUNvbmZpZyh0aGlzLmNvbmZpZy50aXRsZSkubm9uTWFyayxcbiAgICAgIC4uLnRoaXMudGl0bGVcbiAgICB9O1xuXG4gICAgaWYgKHRpdGxlLnRleHQpIHtcbiAgICAgIGlmICghY29udGFpbnMoWyd1bml0JywgJ2xheWVyJ10sIHRoaXMudHlwZSkpIHtcbiAgICAgICAgLy8gQXMgZGVzY3JpYmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjg3NTpcbiAgICAgICAgLy8gRHVlIHRvIHZlZ2EvdmVnYSM5NjAgKGNvbW1lbnQpLCB3ZSBvbmx5IHN1cHBvcnQgdGl0bGUncyBhbmNob3IgZm9yIHVuaXQgYW5kIGxheWVyZWQgc3BlYyBmb3Igbm93LlxuXG4gICAgICAgIGlmICh0aXRsZS5hbmNob3IgJiYgdGl0bGUuYW5jaG9yICE9PSAnc3RhcnQnKSB7XG4gICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuY2Fubm90U2V0VGl0bGVBbmNob3IodGhpcy50eXBlKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGl0bGUuYW5jaG9yID0gJ3N0YXJ0JztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGtleXModGl0bGUpLmxlbmd0aCA+IDAgPyB0aXRsZSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSB0aGUgbWFyayBncm91cCBmb3IgdGhpcyBtb2RlbC4gIFdlIGFjY2VwdCBvcHRpb25hbCBgc2lnbmFsc2Agc28gdGhhdCB3ZSBjYW4gaW5jbHVkZSBjb25jYXQgdG9wLWxldmVsIHNpZ25hbHMgd2l0aCB0aGUgdG9wLWxldmVsIG1vZGVsJ3MgbG9jYWwgc2lnbmFscy5cbiAgICovXG4gIHB1YmxpYyBhc3NlbWJsZUdyb3VwKHNpZ25hbHM6IFZnU2lnbmFsW10gPSBbXSkge1xuICAgIGNvbnN0IGdyb3VwOiBWZ01hcmtHcm91cCA9IHt9O1xuXG4gICAgc2lnbmFscyA9IHNpZ25hbHMuY29uY2F0KHRoaXMuYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCkpO1xuXG4gICAgaWYgKHNpZ25hbHMubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXAuc2lnbmFscyA9IHNpZ25hbHM7XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0ID0gdGhpcy5hc3NlbWJsZUxheW91dCgpO1xuICAgIGlmIChsYXlvdXQpIHtcbiAgICAgIGdyb3VwLmxheW91dCA9IGxheW91dDtcbiAgICB9XG5cbiAgICBncm91cC5tYXJrcyA9IFtdLmNvbmNhdChcbiAgICAgIHRoaXMuYXNzZW1ibGVIZWFkZXJNYXJrcygpLFxuICAgICAgdGhpcy5hc3NlbWJsZU1hcmtzKClcbiAgICApO1xuXG4gICAgLy8gT25seSBpbmNsdWRlIHNjYWxlcyBpZiB0aGlzIHNwZWMgaXMgdG9wLWxldmVsIG9yIGlmIHBhcmVudCBpcyBmYWNldC5cbiAgICAvLyAoT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHVwcGVyLWxldmVsJ3Mgc2NvcGUuKVxuICAgIGNvbnN0IHNjYWxlcyA9ICghdGhpcy5wYXJlbnQgfHwgaXNGYWNldE1vZGVsKHRoaXMucGFyZW50KSkgPyBhc3NlbWJsZVNjYWxlcyh0aGlzKSA6IFtdO1xuICAgIGlmIChzY2FsZXMubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXAuc2NhbGVzID0gc2NhbGVzO1xuICAgIH1cblxuICAgIGNvbnN0IGF4ZXMgPSB0aGlzLmFzc2VtYmxlQXhlcygpO1xuICAgIGlmIChheGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGdyb3VwLmF4ZXMgPSBheGVzO1xuICAgIH1cblxuICAgIGNvbnN0IGxlZ2VuZHMgPSB0aGlzLmFzc2VtYmxlTGVnZW5kcygpO1xuICAgIGlmIChsZWdlbmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGdyb3VwLmxlZ2VuZHMgPSBsZWdlbmRzO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cDtcbiAgfVxuXG4gIHB1YmxpYyBoYXNEZXNjZW5kYW50V2l0aEZpZWxkT25DaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIGlmIChpc1VuaXRNb2RlbChjaGlsZCkpIHtcbiAgICAgICAgaWYgKGNoaWxkLmNoYW5uZWxIYXNGaWVsZChjaGFubmVsKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2hpbGQuaGFzRGVzY2VuZGFudFdpdGhGaWVsZE9uQ2hhbm5lbChjaGFubmVsKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXROYW1lKHRleHQ6IHN0cmluZykge1xuICAgIHJldHVybiB2YXJOYW1lKCh0aGlzLm5hbWUgPyB0aGlzLm5hbWUgKyAnXycgOiAnJykgKyB0ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgZGF0YSBzb3VyY2UgbmFtZSBmb3IgdGhlIGdpdmVuIGRhdGEgc291cmNlIHR5cGUgYW5kIG1hcmsgdGhhdCBkYXRhIHNvdXJjZSBhcyByZXF1aXJlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBpbiBwYXJzZSwgc28gdGhhdCBhbGwgdXNlZCBkYXRhIHNvdXJjZSBjYW4gYmUgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBpbiBhc3NlbWJsZURhdGEoKS5cbiAgICovXG4gIHB1YmxpYyByZXF1ZXN0RGF0YU5hbWUobmFtZTogRGF0YVNvdXJjZVR5cGUpIHtcbiAgICBjb25zdCBmdWxsTmFtZSA9IHRoaXMuZ2V0TmFtZShuYW1lKTtcblxuICAgIC8vIEluY3JlYXNlIHJlZiBjb3VudC4gVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b24ndCBjcmVhdGUgYSBkYXRhIHNvdXJjZS5cbiAgICAvLyBXZSBhbHNvIGluY3JlYXNlIHRoZSByZWYgY291bnRzIG9uIE91dHB1dE5vZGUuZ2V0U291cmNlKCkgY2FsbHMuXG4gICAgY29uc3QgcmVmQ291bnRzID0gdGhpcy5jb21wb25lbnQuZGF0YS5vdXRwdXROb2RlUmVmQ291bnRzO1xuICAgIHJlZkNvdW50c1tmdWxsTmFtZV0gPSAocmVmQ291bnRzW2Z1bGxOYW1lXSB8fCAwKSArIDE7XG5cbiAgICByZXR1cm4gZnVsbE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2l6ZVNpZ25hbFJlZihzaXplVHlwZTogJ3dpZHRoJyB8ICdoZWlnaHQnKTogVmdTaWduYWxSZWYge1xuICAgIGlmIChpc0ZhY2V0TW9kZWwodGhpcy5wYXJlbnQpKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gc2l6ZVR5cGUgPT09ICd3aWR0aCcgPyAneCcgOiAneSc7XG4gICAgICBjb25zdCBzY2FsZUNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcblxuICAgICAgaWYgKHNjYWxlQ29tcG9uZW50ICYmICFzY2FsZUNvbXBvbmVudC5tZXJnZWQpIHsgLy8gaW5kZXBlbmRlbnQgc2NhbGVcbiAgICAgICAgY29uc3QgdHlwZSA9IHNjYWxlQ29tcG9uZW50LmdldCgndHlwZScpO1xuICAgICAgICBjb25zdCByYW5nZSA9IHNjYWxlQ29tcG9uZW50LmdldCgncmFuZ2UnKTtcblxuICAgICAgICBpZiAoaGFzRGlzY3JldGVEb21haW4odHlwZSkgJiYgaXNWZ1JhbmdlU3RlcChyYW5nZSkpIHtcbiAgICAgICAgICBjb25zdCBzY2FsZU5hbWUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ25hbWUnKTtcbiAgICAgICAgICBjb25zdCBkb21haW4gPSBhc3NlbWJsZURvbWFpbih0aGlzLCBjaGFubmVsKTtcbiAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldEZpZWxkRnJvbURvbWFpbihkb21haW4pO1xuICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRSZWYgPSB2Z0ZpZWxkKHthZ2dyZWdhdGU6ICdkaXN0aW5jdCcsIGZpZWxkfSwge2V4cHI6ICdkYXR1bSd9KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNpZ25hbDogc2l6ZUV4cHIoc2NhbGVOYW1lLCBzY2FsZUNvbXBvbmVudCwgZmllbGRSZWYpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cud2FybignVW5rbm93biBmaWVsZCBmb3IgJHtjaGFubmVsfS4gIENhbm5vdCBjYWxjdWxhdGUgdmlldyBzaXplLicpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiB0aGlzLmxheW91dFNpemVOYW1lTWFwLmdldCh0aGlzLmdldE5hbWUoc2l6ZVR5cGUpKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTG9va3VwIHRoZSBuYW1lIG9mIHRoZSBkYXRhc291cmNlIGZvciBhbiBvdXRwdXQgbm9kZS4gWW91IHByb2JhYmx5IHdhbnQgdG8gY2FsbCB0aGlzIGluIGFzc2VtYmxlLlxuICAgKi9cbiAgcHVibGljIGxvb2t1cERhdGFTb3VyY2UobmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuY29tcG9uZW50LmRhdGEub3V0cHV0Tm9kZXNbbmFtZV07XG5cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIC8vIE5hbWUgbm90IGZvdW5kIGluIG1hcCBzbyBsZXQncyBqdXN0IHJldHVybiB3aGF0IHdlIGdvdC5cbiAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGNvcnJlY3QgbmFtZS5cbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlLmdldFNvdXJjZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFNpemVOYW1lKG9sZFNpemVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICByZXR1cm4gdGhpcy5sYXlvdXRTaXplTmFtZU1hcC5nZXQob2xkU2l6ZU5hbWUpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUxheW91dFNpemUob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLmxheW91dFNpemVOYW1lTWFwLnJlbmFtZShvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVTY2FsZShvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2NhbGVOYW1lTWFwLnJlbmFtZShvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVQcm9qZWN0aW9uKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9qZWN0aW9uTmFtZU1hcC5yZW5hbWUob2xkTmFtZSwgbmV3TmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBzY2FsZSBuYW1lIGZvciBhIGdpdmVuIGNoYW5uZWwgYWZ0ZXIgdGhlIHNjYWxlIGhhcyBiZWVuIHBhcnNlZCBhbmQgbmFtZWQuXG4gICAqL1xuICBwdWJsaWMgc2NhbGVOYW1lKG9yaWdpbmFsU2NhbGVOYW1lOiBDaGFubmVsIHwgc3RyaW5nLCBwYXJzZT86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChwYXJzZSkge1xuICAgICAgLy8gRHVyaW5nIHRoZSBwYXJzZSBwaGFzZSBhbHdheXMgcmV0dXJuIGEgdmFsdWVcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVmZXIgdG8gcmVuYW1lIG1hcCBiZWNhdXNlIGEgc2NhbGUgY2FuJ3QgYmUgcmVuYW1lZFxuICAgICAgLy8gYmVmb3JlIGl0IGhhcyB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUob3JpZ2luYWxTY2FsZU5hbWUpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGEgc2NhbGUgZm9yIHRoZSBjaGFubmVsLCBpdCBzaG91bGQgZWl0aGVyXG4gICAgLy8gYmUgaW4gdGhlIHNjYWxlIGNvbXBvbmVudCBvciBleGlzdCBpbiB0aGUgbmFtZSBtYXBcbiAgICBpZiAoXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgc2NhbGUgZm9yIHRoZSBjaGFubmVsLCB0aGVyZSBzaG91bGQgYmUgYSBsb2NhbCBzY2FsZSBjb21wb25lbnQgZm9yIGl0XG4gICAgICAgIChpc0NoYW5uZWwob3JpZ2luYWxTY2FsZU5hbWUpICYmIGlzU2NhbGVDaGFubmVsKG9yaWdpbmFsU2NhbGVOYW1lKSAmJiB0aGlzLmNvbXBvbmVudC5zY2FsZXNbb3JpZ2luYWxTY2FsZU5hbWVdKSB8fFxuICAgICAgICAvLyBpbiB0aGUgc2NhbGUgbmFtZSBtYXAgKHRoZSBzY2FsZSBnZXQgbWVyZ2VkIGJ5IGl0cyBwYXJlbnQpXG4gICAgICAgIHRoaXMuc2NhbGVOYW1lTWFwLmhhcyh0aGlzLmdldE5hbWUob3JpZ2luYWxTY2FsZU5hbWUpKVxuICAgICAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY2FsZU5hbWVNYXAuZ2V0KHRoaXMuZ2V0TmFtZShvcmlnaW5hbFNjYWxlTmFtZSkpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gcHJvamVjdGlvbiBuYW1lIGFmdGVyIHRoZSBwcm9qZWN0aW9uIGhhcyBiZWVuIHBhcnNlZCBhbmQgbmFtZWQuXG4gICAqL1xuICBwdWJsaWMgcHJvamVjdGlvbk5hbWUocGFyc2U/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAocGFyc2UpIHtcbiAgICAgIC8vIER1cmluZyB0aGUgcGFyc2UgcGhhc2UgYWx3YXlzIHJldHVybiBhIHZhbHVlXG4gICAgICAvLyBObyBuZWVkIHRvIHJlZmVyIHRvIHJlbmFtZSBtYXAgYmVjYXVzZSBhIHByb2plY3Rpb24gY2FuJ3QgYmUgcmVuYW1lZFxuICAgICAgLy8gYmVmb3JlIGl0IGhhcyB0aGUgb3JpZ2luYWwgbmFtZS5cbiAgICAgIHJldHVybiB0aGlzLmdldE5hbWUoJ3Byb2plY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoKHRoaXMuY29tcG9uZW50LnByb2plY3Rpb24gJiYgIXRoaXMuY29tcG9uZW50LnByb2plY3Rpb24ubWVyZ2VkKSB8fCB0aGlzLnByb2plY3Rpb25OYW1lTWFwLmhhcyh0aGlzLmdldE5hbWUoJ3Byb2plY3Rpb24nKSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2plY3Rpb25OYW1lTWFwLmdldCh0aGlzLmdldE5hbWUoJ3Byb2plY3Rpb24nKSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQ29ycmVjdHMgdGhlIGRhdGEgcmVmZXJlbmNlcyBpbiBtYXJrcyBhZnRlciBhc3NlbWJsZS5cbiAgICovXG4gIHB1YmxpYyBjb3JyZWN0RGF0YU5hbWVzID0gKG1hcms6IFZnTWFya0dyb3VwKSA9PiB7XG4gICAgLy8gVE9ETzogbWFrZSB0aGlzIGNvcnJlY3RcblxuICAgIC8vIGZvciBub3JtYWwgZGF0YSByZWZlcmVuY2VzXG4gICAgaWYgKG1hcmsuZnJvbSAmJiBtYXJrLmZyb20uZGF0YSkge1xuICAgICAgbWFyay5mcm9tLmRhdGEgPSB0aGlzLmxvb2t1cERhdGFTb3VyY2UobWFyay5mcm9tLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIGZvciBhY2Nlc3MgdG8gZmFjZXQgZGF0YVxuICAgIGlmIChtYXJrLmZyb20gJiYgbWFyay5mcm9tLmZhY2V0ICYmIG1hcmsuZnJvbS5mYWNldC5kYXRhKSB7XG4gICAgICBtYXJrLmZyb20uZmFjZXQuZGF0YSA9IHRoaXMubG9va3VwRGF0YVNvdXJjZShtYXJrLmZyb20uZmFjZXQuZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcms7XG4gIH1cblxuICAvKipcbiAgICogVHJhdmVyc2UgYSBtb2RlbCdzIGhpZXJhcmNoeSB0byBnZXQgdGhlIHNjYWxlIGNvbXBvbmVudCBmb3IgYSBwYXJ0aWN1bGFyIGNoYW5uZWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbDogU2NhbGVDaGFubmVsKTogU2NhbGVDb21wb25lbnQge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBUaGlzIGlzIHdhcm5pbmcgZm9yIGRlYnVnZ2luZyB0ZXN0ICovXG4gICAgaWYgKCF0aGlzLmNvbXBvbmVudC5zY2FsZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0U2NhbGVDb21wb25lbnQgY2Fubm90IGJlIGNhbGxlZCBiZWZvcmUgcGFyc2VTY2FsZSgpLiAgTWFrZSBzdXJlIHlvdSBoYXZlIGNhbGxlZCBwYXJzZVNjYWxlIG9yIHVzZSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSgpLicpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvY2FsU2NhbGVDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgaWYgKGxvY2FsU2NhbGVDb21wb25lbnQgJiYgIWxvY2FsU2NhbGVDb21wb25lbnQubWVyZ2VkKSB7XG4gICAgICByZXR1cm4gbG9jYWxTY2FsZUNvbXBvbmVudDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpIDogdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSBhIG1vZGVsJ3MgaGllcmFyY2h5IHRvIGdldCBhIHBhcnRpY3VsYXIgc2VsZWN0aW9uIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBnZXRTZWxlY3Rpb25Db21wb25lbnQodmFyaWFibGVOYW1lOiBzdHJpbmcsIG9yaWdOYW1lOiBzdHJpbmcpOiBTZWxlY3Rpb25Db21wb25lbnQge1xuICAgIGxldCBzZWwgPSB0aGlzLmNvbXBvbmVudC5zZWxlY3Rpb25bdmFyaWFibGVOYW1lXTtcbiAgICBpZiAoIXNlbCAmJiB0aGlzLnBhcmVudCkge1xuICAgICAgc2VsID0gdGhpcy5wYXJlbnQuZ2V0U2VsZWN0aW9uQ29tcG9uZW50KHZhcmlhYmxlTmFtZSwgb3JpZ05hbWUpO1xuICAgIH1cbiAgICBpZiAoIXNlbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLnNlbGVjdGlvbk5vdEZvdW5kKG9yaWdOYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiBzZWw7XG4gIH1cbn1cblxuLyoqIEFic3RyYWN0IGNsYXNzIGZvciBVbml0TW9kZWwgYW5kIEZhY2V0TW9kZWwuICBCb3RoIG9mIHdoaWNoIGNhbiBjb250YWluIGZpZWxkRGVmcyBhcyBhIHBhcnQgb2YgaXRzIG93biBzcGVjaWZpY2F0aW9uLiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsV2l0aEZpZWxkIGV4dGVuZHMgTW9kZWwge1xuICBwdWJsaWMgYWJzdHJhY3QgZmllbGREZWYoY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCk6IEZpZWxkRGVmPHN0cmluZz47XG5cbiAgLyoqIEdldCBcImZpZWxkXCIgcmVmZXJlbmNlIGZvciB2ZWdhICovXG4gIHB1YmxpYyB2Z0ZpZWxkKGNoYW5uZWw6IFNpbmdsZURlZkNoYW5uZWwsIG9wdDogRmllbGRSZWZPcHRpb24gPSB7fSkge1xuICAgIGNvbnN0IGZpZWxkRGVmID0gdGhpcy5maWVsZERlZihjaGFubmVsKTtcblxuICAgIGlmICghZmllbGREZWYpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZnRmllbGQoZmllbGREZWYsIG9wdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0TWFwcGluZygpOiB7W2tleSBpbiBDaGFubmVsXT86IGFueX07XG5cbiAgcHVibGljIHJlZHVjZUZpZWxkRGVmPFQsIFU+KGY6IChhY2M6IFUsIGZkOiBGaWVsZERlZjxzdHJpbmc+LCBjOiBDaGFubmVsKSA9PiBVLCBpbml0OiBULCB0PzogYW55KSB7XG4gICAgcmV0dXJuIHJlZHVjZSh0aGlzLmdldE1hcHBpbmcoKSwgKGFjYzpVICwgY2Q6IENoYW5uZWxEZWY8c3RyaW5nPiwgYzogQ2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSBnZXRGaWVsZERlZihjZCk7XG4gICAgICBpZiAoZmllbGREZWYpIHtcbiAgICAgICAgcmV0dXJuIGYoYWNjLCBmaWVsZERlZiwgYyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIGluaXQsIHQpO1xuICB9XG5cbiAgcHVibGljIGZvckVhY2hGaWVsZERlZihmOiAoZmQ6IEZpZWxkRGVmPHN0cmluZz4sIGM6IENoYW5uZWwpID0+IHZvaWQsIHQ/OiBhbnkpIHtcbiAgICBmb3JFYWNoKHRoaXMuZ2V0TWFwcGluZygpLCAoY2Q6IENoYW5uZWxEZWY8c3RyaW5nPiwgYzogQ2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSBnZXRGaWVsZERlZihjZCk7XG4gICAgICBpZiAoZmllbGREZWYpIHtcbiAgICAgICAgZihmaWVsZERlZiwgYyk7XG4gICAgICB9XG4gICAgfSwgdCk7XG4gIH1cbiAgcHVibGljIGFic3RyYWN0IGNoYW5uZWxIYXNGaWVsZChjaGFubmVsOiBDaGFubmVsKTogYm9vbGVhbjtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/projection/assemble.d.ts b/build/src/compile/projection/assemble.d.ts new file mode 100644 index 0000000000..6e21546091 --- /dev/null +++ b/build/src/compile/projection/assemble.d.ts @@ -0,0 +1,5 @@ +import { VgProjection } from '../../vega.schema'; +import { Model } from '../model'; +export declare function assembleProjections(model: Model): VgProjection[]; +export declare function assembleProjectionsForModelAndChildren(model: Model): VgProjection[]; +export declare function assembleProjectionForModel(model: Model): VgProjection[]; diff --git a/build/src/compile/projection/assemble.js b/build/src/compile/projection/assemble.js new file mode 100644 index 0000000000..6d96030569 --- /dev/null +++ b/build/src/compile/projection/assemble.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("../../util"); +var vega_schema_1 = require("../../vega.schema"); +var model_1 = require("../model"); +function assembleProjections(model) { + if (model_1.isLayerModel(model) || model_1.isConcatModel(model) || model_1.isRepeatModel(model)) { + return assembleProjectionsForModelAndChildren(model); + } + else { + return assembleProjectionForModel(model); + } +} +exports.assembleProjections = assembleProjections; +function assembleProjectionsForModelAndChildren(model) { + return model.children.reduce(function (projections, child) { + return projections.concat(child.assembleProjections()); + }, assembleProjectionForModel(model)); +} +exports.assembleProjectionsForModelAndChildren = assembleProjectionsForModelAndChildren; +function assembleProjectionForModel(model) { + var component = model.component.projection; + if (!component || component.merged) { + return []; + } + var projection = component.combine(); + var name = projection.name, rest = tslib_1.__rest(projection, ["name"]); // we need to extract name so that it is always present in the output and pass TS type validation + var size = { + signal: "[" + component.size.map(function (ref) { return ref.signal; }).join(', ') + "]" + }; + var fit = component.data.reduce(function (sources, data) { + var source = vega_schema_1.isVgSignalRef(data) ? data.signal : "data('" + model.lookupDataSource(data) + "')"; + if (!util_1.contains(sources, source)) { + // build a unique list of sources + sources.push(source); + } + return sources; + }, []); + if (fit.length <= 0) { + throw new Error("Projection's fit didn't find any data sources"); + } + return [tslib_1.__assign({ name: name, + size: size, fit: { + signal: fit.length > 1 ? "[" + fit.join(', ') + "]" : fit[0] + } }, rest)]; +} +exports.assembleProjectionForModel = assembleProjectionForModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9wcm9qZWN0aW9uL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLG1DQUFvQztBQUNwQyxpREFBMkU7QUFDM0Usa0NBQTJFO0FBRTNFLDZCQUFvQyxLQUFZO0lBQzlDLElBQUksb0JBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxxQkFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLHFCQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdkUsT0FBTyxzQ0FBc0MsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUN0RDtTQUFNO1FBQ0wsT0FBTywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMxQztBQUNILENBQUM7QUFORCxrREFNQztBQUVELGdEQUF1RCxLQUFZO0lBQ2pFLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQyxXQUFXLEVBQUUsS0FBSztRQUM5QyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDLEVBQUUsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBSkQsd0ZBSUM7QUFFRCxvQ0FBMkMsS0FBWTtJQUNyRCxJQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQztJQUM3QyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7UUFDbEMsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELElBQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoQyxJQUFBLHNCQUFJLEVBQUUsMkNBQU8sQ0FBZSxDQUFFLGlHQUFpRztJQUV0SSxJQUFNLElBQUksR0FBZ0I7UUFDeEIsTUFBTSxFQUFFLE1BQUksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsTUFBTSxFQUFWLENBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBRztLQUNsRSxDQUFDO0lBRUYsSUFBTSxHQUFHLEdBQWEsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLEVBQUUsSUFBSTtRQUN4RCxJQUFNLE1BQU0sR0FBVywyQkFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFTLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBSSxDQUFDO1FBQ3JHLElBQUksQ0FBQyxlQUFRLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQzlCLGlDQUFpQztZQUNqQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7S0FDbEU7SUFFRCxPQUFPLG9CQUNMLElBQUksTUFBQTtZQUNKLElBQUksTUFBQSxFQUNKLEdBQUcsRUFBRTtnQkFDSCxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3hELElBQ0UsSUFBSSxFQUNQLENBQUM7QUFDTCxDQUFDO0FBbENELGdFQWtDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y29udGFpbnN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtpc1ZnU2lnbmFsUmVmLCBWZ1Byb2plY3Rpb24sIFZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzQ29uY2F0TW9kZWwsIGlzTGF5ZXJNb2RlbCwgaXNSZXBlYXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlUHJvamVjdGlvbnMobW9kZWw6IE1vZGVsKTogVmdQcm9qZWN0aW9uW10ge1xuICBpZiAoaXNMYXllck1vZGVsKG1vZGVsKSB8fCBpc0NvbmNhdE1vZGVsKG1vZGVsKSB8fCBpc1JlcGVhdE1vZGVsKG1vZGVsKSkge1xuICAgIHJldHVybiBhc3NlbWJsZVByb2plY3Rpb25zRm9yTW9kZWxBbmRDaGlsZHJlbihtb2RlbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlUHJvamVjdGlvbkZvck1vZGVsKG1vZGVsKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVQcm9qZWN0aW9uc0Zvck1vZGVsQW5kQ2hpbGRyZW4obW9kZWw6IE1vZGVsKTogVmdQcm9qZWN0aW9uW10ge1xuICByZXR1cm4gbW9kZWwuY2hpbGRyZW4ucmVkdWNlKChwcm9qZWN0aW9ucywgY2hpbGQpID0+IHtcbiAgICByZXR1cm4gcHJvamVjdGlvbnMuY29uY2F0KGNoaWxkLmFzc2VtYmxlUHJvamVjdGlvbnMoKSk7XG4gIH0sIGFzc2VtYmxlUHJvamVjdGlvbkZvck1vZGVsKG1vZGVsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVByb2plY3Rpb25Gb3JNb2RlbChtb2RlbDogTW9kZWwpOiBWZ1Byb2plY3Rpb25bXSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uO1xuICBpZiAoIWNvbXBvbmVudCB8fCBjb21wb25lbnQubWVyZ2VkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdGlvbiA9IGNvbXBvbmVudC5jb21iaW5lKCk7XG4gIGNvbnN0IHtuYW1lLCAuLi5yZXN0fSA9IHByb2plY3Rpb247ICAvLyB3ZSBuZWVkIHRvIGV4dHJhY3QgbmFtZSBzbyB0aGF0IGl0IGlzIGFsd2F5cyBwcmVzZW50IGluIHRoZSBvdXRwdXQgYW5kIHBhc3MgVFMgdHlwZSB2YWxpZGF0aW9uXG5cbiAgY29uc3Qgc2l6ZTogVmdTaWduYWxSZWYgPSB7XG4gICAgc2lnbmFsOiBgWyR7Y29tcG9uZW50LnNpemUubWFwKChyZWYpID0+IHJlZi5zaWduYWwpLmpvaW4oJywgJyl9XWBcbiAgfTtcblxuICBjb25zdCBmaXQ6IHN0cmluZ1tdID0gY29tcG9uZW50LmRhdGEucmVkdWNlKChzb3VyY2VzLCBkYXRhKSA9PiB7XG4gICAgY29uc3Qgc291cmNlOiBzdHJpbmcgPSBpc1ZnU2lnbmFsUmVmKGRhdGEpID8gZGF0YS5zaWduYWwgOiBgZGF0YSgnJHttb2RlbC5sb29rdXBEYXRhU291cmNlKGRhdGEpfScpYDtcbiAgICBpZiAoIWNvbnRhaW5zKHNvdXJjZXMsIHNvdXJjZSkpIHtcbiAgICAgIC8vIGJ1aWxkIGEgdW5pcXVlIGxpc3Qgb2Ygc291cmNlc1xuICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9LCBbXSk7XG5cbiAgaWYgKGZpdC5sZW5ndGggPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlByb2plY3Rpb24ncyBmaXQgZGlkbid0IGZpbmQgYW55IGRhdGEgc291cmNlc1wiKTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIG5hbWUsXG4gICAgc2l6ZSxcbiAgICBmaXQ6IHtcbiAgICAgIHNpZ25hbDogZml0Lmxlbmd0aCA+IDEgPyBgWyR7Zml0LmpvaW4oJywgJyl9XWAgOiBmaXRbMF1cbiAgICB9LFxuICAgIC4uLnJlc3RcbiAgfV07XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/projection/component.d.ts b/build/src/compile/projection/component.d.ts new file mode 100644 index 0000000000..ceae86e04b --- /dev/null +++ b/build/src/compile/projection/component.d.ts @@ -0,0 +1,10 @@ +import { Projection } from '../../projection'; +import { VgProjection, VgSignalRef } from '../../vega.schema'; +import { Split } from '../split'; +export declare class ProjectionComponent extends Split { + specifiedProjection: Projection; + size: VgSignalRef[]; + data: (string | VgSignalRef)[]; + merged: boolean; + constructor(name: string, specifiedProjection: Projection, size: VgSignalRef[], data: (string | VgSignalRef)[]); +} diff --git a/build/src/compile/projection/component.js b/build/src/compile/projection/component.js new file mode 100644 index 0000000000..c1e3b2539f --- /dev/null +++ b/build/src/compile/projection/component.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var split_1 = require("../split"); +var ProjectionComponent = /** @class */ (function (_super) { + tslib_1.__extends(ProjectionComponent, _super); + function ProjectionComponent(name, specifiedProjection, size, data) { + var _this = _super.call(this, tslib_1.__assign({}, specifiedProjection), // all explicit properties of projection + { name: name } // name as initial implicit property + ) || this; + _this.specifiedProjection = specifiedProjection; + _this.size = size; + _this.data = data; + _this.merged = false; + return _this; + } + return ProjectionComponent; +}(split_1.Split)); +exports.ProjectionComponent = ProjectionComponent; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvcHJvamVjdGlvbi9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0NBQStCO0FBRS9CO0lBQXlDLCtDQUFtQjtJQUcxRCw2QkFBWSxJQUFZLEVBQVMsbUJBQStCLEVBQVMsSUFBbUIsRUFBUyxJQUE4QjtRQUFuSSxZQUNFLHVDQUNNLG1CQUFtQixHQUFJLHdDQUF3QztRQUNuRSxFQUFDLElBQUksTUFBQSxFQUFDLENBQUUsb0NBQW9DO1NBQzdDLFNBQ0Y7UUFMZ0MseUJBQW1CLEdBQW5CLG1CQUFtQixDQUFZO1FBQVMsVUFBSSxHQUFKLElBQUksQ0FBZTtRQUFTLFVBQUksR0FBSixJQUFJLENBQTBCO1FBRjVILFlBQU0sR0FBRyxLQUFLLENBQUM7O0lBT3RCLENBQUM7SUFDSCwwQkFBQztBQUFELENBQUMsQUFURCxDQUF5QyxhQUFLLEdBUzdDO0FBVFksa0RBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQcm9qZWN0aW9ufSBmcm9tICcuLi8uLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7VmdQcm9qZWN0aW9uLCBWZ1NpZ25hbFJlZn0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi4vc3BsaXQnO1xuXG5leHBvcnQgY2xhc3MgUHJvamVjdGlvbkNvbXBvbmVudCBleHRlbmRzIFNwbGl0PFZnUHJvamVjdGlvbj4ge1xuICBwdWJsaWMgbWVyZ2VkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBwdWJsaWMgc3BlY2lmaWVkUHJvamVjdGlvbjogUHJvamVjdGlvbiwgcHVibGljIHNpemU6IFZnU2lnbmFsUmVmW10sIHB1YmxpYyBkYXRhOiAoc3RyaW5nIHwgVmdTaWduYWxSZWYpW10pIHtcbiAgICBzdXBlcihcbiAgICAgIHsuLi5zcGVjaWZpZWRQcm9qZWN0aW9ufSwgIC8vIGFsbCBleHBsaWNpdCBwcm9wZXJ0aWVzIG9mIHByb2plY3Rpb25cbiAgICAgIHtuYW1lfSAgLy8gbmFtZSBhcyBpbml0aWFsIGltcGxpY2l0IHByb3BlcnR5XG4gICAgKTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/projection/parse.d.ts b/build/src/compile/projection/parse.d.ts new file mode 100644 index 0000000000..587464fa0d --- /dev/null +++ b/build/src/compile/projection/parse.d.ts @@ -0,0 +1,2 @@ +import { Model } from '../model'; +export declare function parseProjection(model: Model): void; diff --git a/build/src/compile/projection/parse.js b/build/src/compile/projection/parse.js new file mode 100644 index 0000000000..1c15cd80c3 --- /dev/null +++ b/build/src/compile/projection/parse.js @@ -0,0 +1,121 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var data_1 = require("../../data"); +var projection_1 = require("../../projection"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var model_1 = require("../model"); +var component_1 = require("./component"); +function parseProjection(model) { + if (model_1.isUnitModel(model)) { + model.component.projection = parseUnitProjection(model); + } + else { + // because parse happens from leaves up (unit specs before layer spec), + // we can be sure that the above if statement has already occurred + // and therefore we have access to child.component.projection + // for each of model's children + model.component.projection = parseNonUnitProjections(model); + } +} +exports.parseProjection = parseProjection; +function parseUnitProjection(model) { + var specifiedProjection = model.specifiedProjection, config = model.config, hasProjection = model.hasProjection; + if (hasProjection) { + var data_2 = []; + [[channel_1.LONGITUDE, channel_1.LATITUDE], [channel_1.LONGITUDE2, channel_1.LATITUDE2]].forEach(function (posssiblePair) { + if (model.channelHasField(posssiblePair[0]) || model.channelHasField(posssiblePair[1])) { + data_2.push({ + signal: model.getName("geojson_" + data_2.length) + }); + } + }); + if (model.channelHasField(channel_1.SHAPE) && model.fieldDef(channel_1.SHAPE).type === type_1.GEOJSON) { + data_2.push({ + signal: model.getName("geojson_" + data_2.length) + }); + } + if (data_2.length === 0) { + // main source is geojson, so we can just use that + data_2.push(model.requestDataName(data_1.MAIN)); + } + return new component_1.ProjectionComponent(model.projectionName(true), tslib_1.__assign({}, (config.projection || {}), (specifiedProjection || {})), [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')], data_2); + } + return undefined; +} +function mergeIfNoConflict(first, second) { + var allPropertiesShared = util_1.every(projection_1.PROJECTION_PROPERTIES, function (prop) { + // neither has the poperty + if (!first.explicit.hasOwnProperty(prop) && + !second.explicit.hasOwnProperty(prop)) { + return true; + } + // both have property and an equal value for property + if (first.explicit.hasOwnProperty(prop) && + second.explicit.hasOwnProperty(prop) && + // some properties might be signals or objects and require hashing for comparison + util_1.stringify(first.get(prop)) === util_1.stringify(second.get(prop))) { + return true; + } + return false; + }); + var size = util_1.stringify(first.size) === util_1.stringify(second.size); + if (size) { + if (allPropertiesShared) { + return first; + } + else if (util_1.stringify(first.explicit) === util_1.stringify({})) { + return second; + } + else if (util_1.stringify(second.explicit) === util_1.stringify({})) { + return first; + } + } + // if all properties don't match, let each unit spec have its own projection + return null; +} +function parseNonUnitProjections(model) { + if (model.children.length === 0) { + return undefined; + } + var nonUnitProjection; + var mergable = util_1.every(model.children, function (child) { + parseProjection(child); + var projection = child.component.projection; + if (!projection) { + // child layer does not use a projection + return true; + } + else if (!nonUnitProjection) { + // cached 'projection' is null, cache this one + nonUnitProjection = projection; + return true; + } + else { + var merge = mergeIfNoConflict(nonUnitProjection, projection); + if (merge) { + nonUnitProjection = merge; + } + return !!merge; + } + }); + // it cached one and all other children share the same projection, + if (nonUnitProjection && mergable) { + // so we can elevate it to the layer level + var name_1 = model.projectionName(true); + var modelProjection_1 = new component_1.ProjectionComponent(name_1, nonUnitProjection.specifiedProjection, nonUnitProjection.size, util_1.duplicate(nonUnitProjection.data)); + // rename and assign all others as merged + model.children.forEach(function (child) { + if (child.component.projection) { + modelProjection_1.data = modelProjection_1.data.concat(child.component.projection.data); + child.renameProjection(child.component.projection.get('name'), name_1); + child.component.projection.merged = true; + } + }); + return modelProjection_1; + } + return undefined; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9wcm9qZWN0aW9uL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFnRjtBQUNoRixtQ0FBZ0M7QUFDaEMsK0NBQXVEO0FBQ3ZELG1DQUFtQztBQUNuQyxtQ0FBdUQ7QUFFdkQsa0NBQTRDO0FBRTVDLHlDQUFnRDtBQUVoRCx5QkFBZ0MsS0FBWTtJQUMxQyxJQUFJLG1CQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDekQ7U0FBTTtRQUNMLHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsNkRBQTZEO1FBQzdELCtCQUErQjtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3RDtBQUNILENBQUM7QUFWRCwwQ0FVQztBQUVELDZCQUE2QixLQUFnQjtJQUNwQyxJQUFBLCtDQUFtQixFQUFFLHFCQUFNLEVBQUUsbUNBQWEsQ0FBVTtJQUUzRCxJQUFJLGFBQWEsRUFBRTtRQUNqQixJQUFNLE1BQUksR0FBNkIsRUFBRSxDQUFDO1FBRTFDLENBQUMsQ0FBQyxtQkFBUyxFQUFFLGtCQUFRLENBQUMsRUFBRSxDQUFDLG9CQUFVLEVBQUUsbUJBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsYUFBYTtZQUNyRSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEYsTUFBSSxDQUFDLElBQUksQ0FBQztvQkFDUixNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFXLE1BQUksQ0FBQyxNQUFR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QyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBSSxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8saUJBQWUsQ0FBQztLQUN4QjtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xBVElUVURFLCBMQVRJVFVERTIsIExPTkdJVFVERSwgTE9OR0lUVURFMiwgU0hBUEV9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtNQUlOfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7UFJPSkVDVElPTl9QUk9QRVJUSUVTfSBmcm9tICcuLi8uLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7R0VPSlNPTn0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2R1cGxpY2F0ZSwgZXZlcnksIHN0cmluZ2lmeX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtQcm9qZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVByb2plY3Rpb24obW9kZWw6IE1vZGVsKSB7XG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBtb2RlbC5jb21wb25lbnQucHJvamVjdGlvbiA9IHBhcnNlVW5pdFByb2plY3Rpb24obW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJlY2F1c2UgcGFyc2UgaGFwcGVucyBmcm9tIGxlYXZlcyB1cCAodW5pdCBzcGVjcyBiZWZvcmUgbGF5ZXIgc3BlYyksXG4gICAgLy8gd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgYWJvdmUgaWYgc3RhdGVtZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkXG4gICAgLy8gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIGFjY2VzcyB0byBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvblxuICAgIC8vIGZvciBlYWNoIG9mIG1vZGVsJ3MgY2hpbGRyZW5cbiAgICBtb2RlbC5jb21wb25lbnQucHJvamVjdGlvbiA9IHBhcnNlTm9uVW5pdFByb2plY3Rpb25zKG1vZGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRQcm9qZWN0aW9uKG1vZGVsOiBVbml0TW9kZWwpOiBQcm9qZWN0aW9uQ29tcG9uZW50IHtcbiAgY29uc3Qge3NwZWNpZmllZFByb2plY3Rpb24sIGNvbmZpZywgaGFzUHJvamVjdGlvbn0gPSBtb2RlbDtcblxuICBpZiAoaGFzUHJvamVjdGlvbikge1xuICAgIGNvbnN0IGRhdGE6IChWZ1NpZ25hbFJlZiB8IHN0cmluZylbXSA9IFtdO1xuXG4gICAgW1tMT05HSVRVREUsIExBVElUVURFXSwgW0xPTkdJVFVERTIsIExBVElUVURFMl1dLmZvckVhY2goKHBvc3NzaWJsZVBhaXIpID0+IHtcbiAgICAgIGlmIChtb2RlbC5jaGFubmVsSGFzRmllbGQocG9zc3NpYmxlUGFpclswXSkgfHwgbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKHBvc3NzaWJsZVBhaXJbMV0pKSB7XG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7ZGF0YS5sZW5ndGh9YClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwuY2hhbm5lbEhhc0ZpZWxkKFNIQVBFKSAmJiBtb2RlbC5maWVsZERlZihTSEFQRSkudHlwZSA9PT0gR0VPSlNPTikge1xuICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7ZGF0YS5sZW5ndGh9YClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gbWFpbiBzb3VyY2UgaXMgZ2VvanNvbiwgc28gd2UgY2FuIGp1c3QgdXNlIHRoYXRcbiAgICAgIGRhdGEucHVzaChtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvamVjdGlvbkNvbXBvbmVudChtb2RlbC5wcm9qZWN0aW9uTmFtZSh0cnVlKSwge1xuICAgICAgLi4uKGNvbmZpZy5wcm9qZWN0aW9uIHx8IHt9KSxcbiAgICAgIC4uLihzcGVjaWZpZWRQcm9qZWN0aW9uIHx8IHt9KSxcbiAgICB9LCBbbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZignd2lkdGgnKSwgbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZignaGVpZ2h0JyldLCBkYXRhKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuZnVuY3Rpb24gbWVyZ2VJZk5vQ29uZmxpY3QoZmlyc3Q6IFByb2plY3Rpb25Db21wb25lbnQsIHNlY29uZDogUHJvamVjdGlvbkNvbXBvbmVudCk6IFByb2plY3Rpb25Db21wb25lbnQge1xuICBjb25zdCBhbGxQcm9wZXJ0aWVzU2hhcmVkID0gZXZlcnkoUFJPSkVDVElPTl9QUk9QRVJUSUVTLCAocHJvcCkgPT4ge1xuICAgIC8vIG5laXRoZXIgaGFzIHRoZSBwb3BlcnR5XG4gICAgaWYgKCFmaXJzdC5leHBsaWNpdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJlxuICAgICAgIXNlY29uZC5leHBsaWNpdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGJvdGggaGF2ZSBwcm9wZXJ0eSBhbmQgYW4gZXF1YWwgdmFsdWUgZm9yIHByb3BlcnR5XG4gICAgaWYgKGZpcnN0LmV4cGxpY2l0Lmhhc093blByb3BlcnR5KHByb3ApICYmXG4gICAgICBzZWNvbmQuZXhwbGljaXQuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgIC8vIHNvbWUgcHJvcGVydGllcyBtaWdodCBiZSBzaWduYWxzIG9yIG9iamVjdHMgYW5kIHJlcXVpcmUgaGFzaGluZyBmb3IgY29tcGFyaXNvblxuICAgICAgc3RyaW5naWZ5KGZpcnN0LmdldChwcm9wKSkgPT09IHN0cmluZ2lmeShzZWNvbmQuZ2V0KHByb3ApKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgY29uc3Qgc2l6ZSA9IHN0cmluZ2lmeShmaXJzdC5zaXplKSA9PT0gc3RyaW5naWZ5KHNlY29uZC5zaXplKTtcbiAgaWYgKHNpemUpIHtcbiAgICBpZiAoYWxsUHJvcGVydGllc1NoYXJlZCkge1xuICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH0gZWxzZSBpZiAoc3RyaW5naWZ5KGZpcnN0LmV4cGxpY2l0KSA9PT0gc3RyaW5naWZ5KHt9KSkge1xuICAgICAgcmV0dXJuIHNlY29uZDtcbiAgICB9IGVsc2UgaWYgKHN0cmluZ2lmeShzZWNvbmQuZXhwbGljaXQpID09PSBzdHJpbmdpZnkoe30pKSB7XG4gICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYWxsIHByb3BlcnRpZXMgZG9uJ3QgbWF0Y2gsIGxldCBlYWNoIHVuaXQgc3BlYyBoYXZlIGl0cyBvd24gcHJvamVjdGlvblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0UHJvamVjdGlvbnMobW9kZWw6IE1vZGVsKTogUHJvamVjdGlvbkNvbXBvbmVudCB7XG4gIGlmIChtb2RlbC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IG5vblVuaXRQcm9qZWN0aW9uOiBQcm9qZWN0aW9uQ29tcG9uZW50O1xuICBjb25zdCBtZXJnYWJsZSA9IGV2ZXJ5KG1vZGVsLmNoaWxkcmVuLCAoY2hpbGQpID0+IHtcbiAgICBwYXJzZVByb2plY3Rpb24oY2hpbGQpO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvbjtcbiAgICBpZiAoIXByb2plY3Rpb24pIHtcbiAgICAgIC8vIGNoaWxkIGxheWVyIGRvZXMgbm90IHVzZSBhIHByb2plY3Rpb25cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIW5vblVuaXRQcm9qZWN0aW9uKSB7XG4gICAgICAvLyBjYWNoZWQgJ3Byb2plY3Rpb24nIGlzIG51bGwsIGNhY2hlIHRoaXMgb25lXG4gICAgICBub25Vbml0UHJvamVjdGlvbiA9IHByb2plY3Rpb247XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVyZ2UgPSBtZXJnZUlmTm9Db25mbGljdChub25Vbml0UHJvamVjdGlvbiwgcHJvamVjdGlvbik7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgbm9uVW5pdFByb2plY3Rpb24gPSBtZXJnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIW1lcmdlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXQgY2FjaGVkIG9uZSBhbmQgYWxsIG90aGVyIGNoaWxkcmVuIHNoYXJlIHRoZSBzYW1lIHByb2plY3Rpb24sXG4gIGlmIChub25Vbml0UHJvamVjdGlvbiAmJiBtZXJnYWJsZSkge1xuICAgIC8vIHNvIHdlIGNhbiBlbGV2YXRlIGl0IHRvIHRoZSBsYXllciBsZXZlbFxuICAgIGNvbnN0IG5hbWUgPSBtb2RlbC5wcm9qZWN0aW9uTmFtZSh0cnVlKTtcbiAgICBjb25zdCBtb2RlbFByb2plY3Rpb24gPSBuZXcgUHJvamVjdGlvbkNvbXBvbmVudChcbiAgICAgIG5hbWUsXG4gICAgICBub25Vbml0UHJvamVjdGlvbi5zcGVjaWZpZWRQcm9qZWN0aW9uLFxuICAgICAgbm9uVW5pdFByb2plY3Rpb24uc2l6ZSxcbiAgICAgIGR1cGxpY2F0ZShub25Vbml0UHJvamVjdGlvbi5kYXRhKVxuICAgICk7XG5cbiAgICAvLyByZW5hbWUgYW5kIGFzc2lnbiBhbGwgb3RoZXJzIGFzIG1lcmdlZFxuICAgIG1vZGVsLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24pIHtcbiAgICAgICAgbW9kZWxQcm9qZWN0aW9uLmRhdGEgPSBtb2RlbFByb2plY3Rpb24uZGF0YS5jb25jYXQoY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YSk7XG4gICAgICAgIGNoaWxkLnJlbmFtZVByb2plY3Rpb24oY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24uZ2V0KCduYW1lJyksIG5hbWUpO1xuICAgICAgICBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvbi5tZXJnZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1vZGVsUHJvamVjdGlvbjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/repeat.d.ts b/build/src/compile/repeat.d.ts new file mode 100644 index 0000000000..7f72faedb3 --- /dev/null +++ b/build/src/compile/repeat.d.ts @@ -0,0 +1,16 @@ +import { Config } from '../config'; +import { Repeat } from '../repeat'; +import { NormalizedRepeatSpec } from '../spec'; +import { VgLayout } from '../vega.schema'; +import { BaseConcatModel } from './baseconcat'; +import { Model } from './model'; +import { RepeaterValue } from './repeater'; +export declare class RepeatModel extends BaseConcatModel { + readonly type: 'repeat'; + readonly repeat: Repeat; + readonly children: Model[]; + constructor(spec: NormalizedRepeatSpec, parent: Model, parentGivenName: string, repeatValues: RepeaterValue, config: Config); + private _initChildren; + parseLayoutSize(): void; + assembleLayout(): VgLayout; +} diff --git a/build/src/compile/repeat.js b/build/src/compile/repeat.js new file mode 100644 index 0000000000..f89281d879 --- /dev/null +++ b/build/src/compile/repeat.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../log")); +var baseconcat_1 = require("./baseconcat"); +var buildmodel_1 = require("./buildmodel"); +var parse_1 = require("./layoutsize/parse"); +var RepeatModel = /** @class */ (function (_super) { + tslib_1.__extends(RepeatModel, _super); + function RepeatModel(spec, parent, parentGivenName, repeatValues, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeatValues, spec.resolve) || this; + _this.type = 'repeat'; + if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) { + log.warn(log.message.REPEAT_CANNOT_SHARE_AXIS); + } + _this.repeat = spec.repeat; + _this.children = _this._initChildren(spec, _this.repeat, repeatValues, config); + return _this; + } + RepeatModel.prototype._initChildren = function (spec, repeat, repeater, config) { + var children = []; + var row = repeat.row || [repeater ? repeater.row : null]; + var column = repeat.column || [repeater ? repeater.column : null]; + // cross product + for (var _i = 0, row_1 = row; _i < row_1.length; _i++) { + var rowField = row_1[_i]; + for (var _a = 0, column_1 = column; _a < column_1.length; _a++) { + var columnField = column_1[_a]; + var name_1 = (rowField ? '_' + rowField : '') + (columnField ? '_' + columnField : ''); + var childRepeat = { + row: rowField, + column: columnField + }; + children.push(buildmodel_1.buildModel(spec.spec, this, this.getName('child' + name_1), undefined, childRepeat, config, false)); + } + } + return children; + }; + RepeatModel.prototype.parseLayoutSize = function () { + parse_1.parseRepeatLayoutSize(this); + }; + RepeatModel.prototype.assembleLayout = function () { + // TODO: allow customization + return { + padding: { row: 10, column: 10 }, + offset: 10, + columns: this.repeat && this.repeat.column ? this.repeat.column.length : 1, + bounds: 'full', + align: 'all' + }; + }; + return RepeatModel; +}(baseconcat_1.BaseConcatModel)); +exports.RepeatModel = RepeatModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvcmVwZWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGtEQUE4QjtBQUk5QiwyQ0FBNkM7QUFDN0MsMkNBQXdDO0FBQ3hDLDRDQUF5RDtBQUl6RDtJQUFpQyx1Q0FBZTtJQU05QyxxQkFBWSxJQUEwQixFQUFFLE1BQWEsRUFBRSxlQUF1QixFQUFFLFlBQTJCLEVBQUUsTUFBYztRQUEzSCxZQUNFLGtCQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQVF6RTtRQWRlLFVBQUksR0FBYSxRQUFRLENBQUM7UUFReEMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLEVBQUU7WUFDL0csR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDaEQ7UUFFRCxLQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDMUIsS0FBSSxDQUFDLFFBQVEsR0FBRyxLQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQzs7SUFDOUUsQ0FBQztJQUVPLG1DQUFhLEdBQXJCLFVBQXNCLElBQTBCLEVBQUUsTUFBYyxFQUFFLFFBQXVCLEVBQUUsTUFBYztRQUN2RyxJQUFNLFFBQVEsR0FBWSxFQUFFLENBQUM7UUFDN0IsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFcEUsZ0JBQWdCO1FBQ2hCLEtBQXVCLFVBQUcsRUFBSCxXQUFHLEVBQUgsaUJBQUcsRUFBSCxJQUFHLEVBQUU7WUFBdkIsSUFBTSxRQUFRLFlBQUE7WUFDakIsS0FBMEIsVUFBTSxFQUFOLGlCQUFNLEVBQU4sb0JBQU0sRUFBTixJQUFNLEVBQUU7Z0JBQTdCLElBQU0sV0FBVyxlQUFBO2dCQUNwQixJQUFNLE1BQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUV2RixJQUFNLFdBQVcsR0FBRztvQkFDbEIsR0FBRyxFQUFFLFFBQVE7b0JBQ2IsTUFBTSxFQUFFLFdBQVc7aUJBQ3BCLENBQUM7Z0JBRUYsUUFBUSxDQUFDLElBQUksQ0FBQyx1QkFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLE1BQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakg7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxxQ0FBZSxHQUF0QjtRQUNFLDZCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxvQ0FBYyxHQUFyQjtRQUNFLDRCQUE0QjtRQUM1QixPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDO1lBQzlCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUFyREQsQ0FBaUMsNEJBQWUsR0FxRC9DO0FBckRZLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtSZXBlYXR9IGZyb20gJy4uL3JlcGVhdCc7XG5pbXBvcnQge05vcm1hbGl6ZWRSZXBlYXRTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7VmdMYXlvdXR9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QmFzZUNvbmNhdE1vZGVsfSBmcm9tICcuL2Jhc2Vjb25jYXQnO1xuaW1wb3J0IHtidWlsZE1vZGVsfSBmcm9tICcuL2J1aWxkbW9kZWwnO1xuaW1wb3J0IHtwYXJzZVJlcGVhdExheW91dFNpemV9IGZyb20gJy4vbGF5b3V0c2l6ZS9wYXJzZSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5cbmV4cG9ydCBjbGFzcyBSZXBlYXRNb2RlbCBleHRlbmRzIEJhc2VDb25jYXRNb2RlbCB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiAncmVwZWF0JyA9ICdyZXBlYXQnO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVwZWF0OiBSZXBlYXQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNoaWxkcmVuOiBNb2RlbFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNwZWM6IE5vcm1hbGl6ZWRSZXBlYXRTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZywgcmVwZWF0VmFsdWVzOiBSZXBlYXRlclZhbHVlLCBjb25maWc6IENvbmZpZykge1xuICAgIHN1cGVyKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCBjb25maWcsIHJlcGVhdFZhbHVlcywgc3BlYy5yZXNvbHZlKTtcblxuICAgIGlmIChzcGVjLnJlc29sdmUgJiYgc3BlYy5yZXNvbHZlLmF4aXMgJiYgKHNwZWMucmVzb2x2ZS5heGlzLnggPT09ICdzaGFyZWQnIHx8IHNwZWMucmVzb2x2ZS5heGlzLnkgPT09ICdzaGFyZWQnKSkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuUkVQRUFUX0NBTk5PVF9TSEFSRV9BWElTKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlcGVhdCA9IHNwZWMucmVwZWF0O1xuICAgIHRoaXMuY2hpbGRyZW4gPSB0aGlzLl9pbml0Q2hpbGRyZW4oc3BlYywgdGhpcy5yZXBlYXQsIHJlcGVhdFZhbHVlcywgY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRDaGlsZHJlbihzcGVjOiBOb3JtYWxpemVkUmVwZWF0U3BlYywgcmVwZWF0OiBSZXBlYXQsIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlLCBjb25maWc6IENvbmZpZyk6IE1vZGVsW10ge1xuICAgIGNvbnN0IGNoaWxkcmVuOiBNb2RlbFtdID0gW107XG4gICAgY29uc3Qgcm93ID0gcmVwZWF0LnJvdyB8fCBbcmVwZWF0ZXIgPyByZXBlYXRlci5yb3cgOiBudWxsXTtcbiAgICBjb25zdCBjb2x1bW4gPSByZXBlYXQuY29sdW1uIHx8IFtyZXBlYXRlciA/IHJlcGVhdGVyLmNvbHVtbiA6IG51bGxdO1xuXG4gICAgLy8gY3Jvc3MgcHJvZHVjdFxuICAgIGZvciAoY29uc3Qgcm93RmllbGQgb2Ygcm93KSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbkZpZWxkIG9mIGNvbHVtbikge1xuICAgICAgICBjb25zdCBuYW1lID0gKHJvd0ZpZWxkID8gJ18nICsgcm93RmllbGQgOiAnJykgKyAoY29sdW1uRmllbGQgPyAnXycgKyBjb2x1bW5GaWVsZCA6ICcnKTtcblxuICAgICAgICBjb25zdCBjaGlsZFJlcGVhdCA9IHtcbiAgICAgICAgICByb3c6IHJvd0ZpZWxkLFxuICAgICAgICAgIGNvbHVtbjogY29sdW1uRmllbGRcbiAgICAgICAgfTtcblxuICAgICAgICBjaGlsZHJlbi5wdXNoKGJ1aWxkTW9kZWwoc3BlYy5zcGVjLCB0aGlzLCB0aGlzLmdldE5hbWUoJ2NoaWxkJyArIG5hbWUpLCB1bmRlZmluZWQsIGNoaWxkUmVwZWF0LCBjb25maWcsIGZhbHNlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG5cbiAgcHVibGljIHBhcnNlTGF5b3V0U2l6ZSgpIHtcbiAgICBwYXJzZVJlcGVhdExheW91dFNpemUodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIC8vIFRPRE86IGFsbG93IGN1c3RvbWl6YXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgcGFkZGluZzoge3JvdzogMTAsIGNvbHVtbjogMTB9LFxuICAgICAgb2Zmc2V0OiAxMCxcbiAgICAgIGNvbHVtbnM6IHRoaXMucmVwZWF0ICYmIHRoaXMucmVwZWF0LmNvbHVtbiA/IHRoaXMucmVwZWF0LmNvbHVtbi5sZW5ndGggOiAxLFxuICAgICAgYm91bmRzOiAnZnVsbCcsXG4gICAgICBhbGlnbjogJ2FsbCdcbiAgICB9O1xuICB9XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/repeater.d.ts b/build/src/compile/repeater.d.ts new file mode 100644 index 0000000000..9541e6b9ad --- /dev/null +++ b/build/src/compile/repeater.d.ts @@ -0,0 +1,9 @@ +import { Encoding } from '../encoding'; +import { FacetMapping } from '../facet'; +import { Field } from '../fielddef'; +export declare type RepeaterValue = { + row?: string; + column?: string; +}; +export declare function replaceRepeaterInFacet(facet: FacetMapping, repeater: RepeaterValue): FacetMapping; +export declare function replaceRepeaterInEncoding(encoding: Encoding, repeater: RepeaterValue): Encoding; diff --git a/build/src/compile/repeater.js b/build/src/compile/repeater.js new file mode 100644 index 0000000000..b8c6dfed4b --- /dev/null +++ b/build/src/compile/repeater.js @@ -0,0 +1,92 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var fielddef_1 = require("../fielddef"); +var log = tslib_1.__importStar(require("../log")); +var sort_1 = require("../sort"); +function replaceRepeaterInFacet(facet, repeater) { + return replaceRepeater(facet, repeater); +} +exports.replaceRepeaterInFacet = replaceRepeaterInFacet; +function replaceRepeaterInEncoding(encoding, repeater) { + return replaceRepeater(encoding, repeater); +} +exports.replaceRepeaterInEncoding = replaceRepeaterInEncoding; +/** + * Replaces repeated value and returns if the repeated value is valid. + */ +function replaceRepeat(o, repeater) { + if (fielddef_1.isRepeatRef(o.field)) { + if (o.field.repeat in repeater) { + // any needed to calm down ts compiler + return tslib_1.__assign({}, o, { field: repeater[o.field.repeat] }); + } + else { + log.warn(log.message.noSuchRepeatedValue(o.field.repeat)); + return undefined; + } + } + return o; +} +/** + * Replace repeater values in a field def with the concrete field name. + */ +function replaceRepeaterInFieldDef(fieldDef, repeater) { + fieldDef = replaceRepeat(fieldDef, repeater); + if (fieldDef === undefined) { + // the field def should be ignored + return undefined; + } + if (fieldDef.sort && sort_1.isSortField(fieldDef.sort)) { + var sort = replaceRepeat(fieldDef.sort, repeater); + fieldDef = tslib_1.__assign({}, fieldDef, (sort ? { sort: sort } : {})); + } + return fieldDef; +} +function replaceRepeaterInChannelDef(channelDef, repeater) { + if (fielddef_1.isFieldDef(channelDef)) { + var fd = replaceRepeaterInFieldDef(channelDef, repeater); + if (fd) { + return fd; + } + else if (fielddef_1.isConditionalDef(channelDef)) { + return { condition: channelDef.condition }; + } + } + else { + if (fielddef_1.hasConditionalFieldDef(channelDef)) { + var fd = replaceRepeaterInFieldDef(channelDef.condition, repeater); + if (fd) { + return tslib_1.__assign({}, channelDef, { condition: fd }); + } + else { + var condition = channelDef.condition, channelDefWithoutCondition = tslib_1.__rest(channelDef, ["condition"]); + return channelDefWithoutCondition; + } + } + return channelDef; + } + return undefined; +} +function replaceRepeater(mapping, repeater) { + var out = {}; + for (var channel in mapping) { + if (mapping.hasOwnProperty(channel)) { + var channelDef = mapping[channel]; + if (vega_util_1.isArray(channelDef)) { + // array cannot have condition + out[channel] = channelDef.map(function (cd) { return replaceRepeaterInChannelDef(cd, repeater); }) + .filter(function (cd) { return cd; }); + } + else { + var cd = replaceRepeaterInChannelDef(channelDef, repeater); + if (cd) { + out[channel] = cd; + } + } + } + } + return out; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9yZXBlYXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBa0M7QUFHbEMsd0NBQStHO0FBRS9HLGtEQUE4QjtBQUM5QixnQ0FBb0M7QUFPcEMsZ0NBQXVDLEtBQTBCLEVBQUUsUUFBdUI7SUFDeEYsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBeUIsQ0FBQztBQUNsRSxDQUFDO0FBRkQsd0RBRUM7QUFFRCxtQ0FBMEMsUUFBeUIsRUFBRSxRQUF1QjtJQUMxRixPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFxQixDQUFDO0FBQ2pFLENBQUM7QUFGRCw4REFFQztBQUVEOztHQUVHO0FBQ0gsdUJBQWtELENBQUksRUFBRSxRQUF1QjtJQUM3RSxJQUFJLHNCQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFO1lBQzlCLHNDQUFzQztZQUN0Qyw0QkFBVyxDQUFRLElBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFFO1NBQ3ZEO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0tBQ0Y7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7R0FFRztBQUNILG1DQUFtQyxRQUE4QixFQUFFLFFBQXVCO0lBQ3hGLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUMxQixrQ0FBa0M7UUFDbEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksa0JBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0MsSUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEQsUUFBUSx3QkFDSCxRQUFRLEVBQ1IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxNQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3hCLENBQUM7S0FDSDtJQUVELE9BQU8sUUFBaUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQscUNBQXFDLFVBQTZCLEVBQUUsUUFBdUI7SUFDekYsSUFBSSxxQkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzFCLElBQU0sRUFBRSxHQUFHLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMzRCxJQUFJLEVBQUUsRUFBRTtZQUNOLE9BQU8sRUFBRSxDQUFDO1NBQ1g7YUFBTSxJQUFJLDJCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBQyxDQUFDO1NBQzFDO0tBQ0Y7U0FBTTtRQUNMLElBQUksaUNBQXNCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDdEMsSUFBTSxFQUFFLEdBQUcseUJBQXlCLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNyRSxJQUFJLEVBQUUsRUFBRTtnQkFDTixPQUFPLHFCQUNGLFVBQVUsSUFDYixTQUFTLEVBQUUsRUFBRSxHQUNRLENBQUM7YUFDekI7aUJBQU07Z0JBQ0UsSUFBQSxnQ0FBUyxFQUFFLHNFQUE2QixDQUFlO2dCQUM5RCxPQUFPLDBCQUFnRCxDQUFDO2FBQ3pEO1NBQ0Y7UUFDRCxPQUFPLFVBQXNCLENBQUM7S0FDL0I7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBSUQseUJBQXlCLE9BQStCLEVBQUUsUUFBdUI7SUFDL0UsSUFBTSxHQUFHLEdBQTRCLEVBQUUsQ0FBQztJQUN4QyxLQUFLLElBQU0sT0FBTyxJQUFJLE9BQU8sRUFBRTtRQUM3QixJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbkMsSUFBTSxVQUFVLEdBQTRDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU3RSxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3ZCLDhCQUE4QjtnQkFDOUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSwyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQXpDLENBQXlDLENBQUM7cUJBQzNFLE1BQU0sQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsRUFBRixDQUFFLENBQUMsQ0FBQzthQUNyQjtpQkFBTTtnQkFDTCxJQUFNLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzdELElBQUksRUFBRSxFQUFFO29CQUNOLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ25CO2FBQ0Y7U0FDRjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7RmllbGQsIGhhc0NvbmRpdGlvbmFsRmllbGREZWYsIGlzQ29uZGl0aW9uYWxEZWYsIGlzRmllbGREZWYsIGlzUmVwZWF0UmVmLCBWYWx1ZURlZn0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtDaGFubmVsRGVmLCBTY2FsZUZpZWxkRGVmfSBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7aXNTb3J0RmllbGR9IGZyb20gJy4uL3NvcnQnO1xuXG5leHBvcnQgdHlwZSBSZXBlYXRlclZhbHVlID0ge1xuICByb3c/OiBzdHJpbmcsXG4gIGNvbHVtbj86IHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VSZXBlYXRlckluRmFjZXQoZmFjZXQ6IEZhY2V0TWFwcGluZzxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRmFjZXRNYXBwaW5nPHN0cmluZz4ge1xuICByZXR1cm4gcmVwbGFjZVJlcGVhdGVyKGZhY2V0LCByZXBlYXRlcikgYXMgRmFjZXRNYXBwaW5nPHN0cmluZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRW5jb2Rpbmc8c3RyaW5nPiB7XG4gIHJldHVybiByZXBsYWNlUmVwZWF0ZXIoZW5jb2RpbmcsIHJlcGVhdGVyKSBhcyBFbmNvZGluZzxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHJlcGVhdGVkIHZhbHVlIGFuZCByZXR1cm5zIGlmIHRoZSByZXBlYXRlZCB2YWx1ZSBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdDxUIGV4dGVuZHMge2ZpZWxkPzogRmllbGR9PihvOiBULCByZXBlYXRlcjogUmVwZWF0ZXJWYWx1ZSk6IFQge1xuICBpZiAoaXNSZXBlYXRSZWYoby5maWVsZCkpIHtcbiAgICBpZiAoby5maWVsZC5yZXBlYXQgaW4gcmVwZWF0ZXIpIHtcbiAgICAgIC8vIGFueSBuZWVkZWQgdG8gY2FsbSBkb3duIHRzIGNvbXBpbGVyXG4gICAgICByZXR1cm4gey4uLm8gYXMgYW55LCBmaWVsZDogcmVwZWF0ZXJbby5maWVsZC5yZXBlYXRdfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uubm9TdWNoUmVwZWF0ZWRWYWx1ZShvLmZpZWxkLnJlcGVhdCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59XG5cbi8qKlxuICogUmVwbGFjZSByZXBlYXRlciB2YWx1ZXMgaW4gYSBmaWVsZCBkZWYgd2l0aCB0aGUgY29uY3JldGUgZmllbGQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdGVySW5GaWVsZERlZihmaWVsZERlZjogU2NhbGVGaWVsZERlZjxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogU2NhbGVGaWVsZERlZjxzdHJpbmc+IHtcbiAgZmllbGREZWYgPSByZXBsYWNlUmVwZWF0KGZpZWxkRGVmLCByZXBlYXRlcik7XG5cbiAgaWYgKGZpZWxkRGVmID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyB0aGUgZmllbGQgZGVmIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChmaWVsZERlZi5zb3J0ICYmIGlzU29ydEZpZWxkKGZpZWxkRGVmLnNvcnQpKSB7XG4gICAgY29uc3Qgc29ydCA9IHJlcGxhY2VSZXBlYXQoZmllbGREZWYuc29ydCwgcmVwZWF0ZXIpO1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICAuLi4oc29ydCA/IHtzb3J0fSA6IHt9KVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmllbGREZWYgYXMgU2NhbGVGaWVsZERlZjxzdHJpbmc+O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlUmVwZWF0ZXJJbkNoYW5uZWxEZWYoY2hhbm5lbERlZjogQ2hhbm5lbERlZjxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogQ2hhbm5lbERlZjxzdHJpbmc+IHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICBjb25zdCBmZCA9IHJlcGxhY2VSZXBlYXRlckluRmllbGREZWYoY2hhbm5lbERlZiwgcmVwZWF0ZXIpO1xuICAgIGlmIChmZCkge1xuICAgICAgcmV0dXJuIGZkO1xuICAgIH0gZWxzZSBpZiAoaXNDb25kaXRpb25hbERlZihjaGFubmVsRGVmKSkge1xuICAgICAgcmV0dXJuIHtjb25kaXRpb246IGNoYW5uZWxEZWYuY29uZGl0aW9ufTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhhc0NvbmRpdGlvbmFsRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGNvbnN0IGZkID0gcmVwbGFjZVJlcGVhdGVySW5GaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbiwgcmVwZWF0ZXIpO1xuICAgICAgaWYgKGZkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2hhbm5lbERlZixcbiAgICAgICAgICBjb25kaXRpb246IGZkXG4gICAgICAgIH0gYXMgQ2hhbm5lbERlZjxzdHJpbmc+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge2NvbmRpdGlvbiwgLi4uY2hhbm5lbERlZldpdGhvdXRDb25kaXRpb259ID0gY2hhbm5lbERlZjtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxEZWZXaXRob3V0Q29uZGl0aW9uIGFzIENoYW5uZWxEZWY8c3RyaW5nPjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxEZWYgYXMgVmFsdWVEZWY7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxudHlwZSBFbmNvZGluZ09yRmFjZXQ8Rj4gPSBFbmNvZGluZzxGPiB8IEZhY2V0TWFwcGluZzxGPjtcblxuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdGVyKG1hcHBpbmc6IEVuY29kaW5nT3JGYWNldDxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRW5jb2RpbmdPckZhY2V0PHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IEVuY29kaW5nT3JGYWNldDxzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY2hhbm5lbCBpbiBtYXBwaW5nKSB7XG4gICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkoY2hhbm5lbCkpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8RmllbGQ+IHwgQ2hhbm5lbERlZjxGaWVsZD5bXSA9IG1hcHBpbmdbY2hhbm5lbF07XG5cbiAgICAgIGlmIChpc0FycmF5KGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIC8vIGFycmF5IGNhbm5vdCBoYXZlIGNvbmRpdGlvblxuICAgICAgICBvdXRbY2hhbm5lbF0gPSBjaGFubmVsRGVmLm1hcChjZCA9PiByZXBsYWNlUmVwZWF0ZXJJbkNoYW5uZWxEZWYoY2QsIHJlcGVhdGVyKSlcbiAgICAgICAgICAuZmlsdGVyKGNkID0+IGNkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkID0gcmVwbGFjZVJlcGVhdGVySW5DaGFubmVsRGVmKGNoYW5uZWxEZWYsIHJlcGVhdGVyKTtcbiAgICAgICAgaWYgKGNkKSB7XG4gICAgICAgICAgb3V0W2NoYW5uZWxdID0gY2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/resolve.d.ts b/build/src/compile/resolve.d.ts new file mode 100644 index 0000000000..1438c6e3a8 --- /dev/null +++ b/build/src/compile/resolve.d.ts @@ -0,0 +1,5 @@ +import { ScaleChannel } from '../channel'; +import { Resolve, ResolveMode } from '../resolve'; +import { Model } from './model'; +export declare function defaultScaleResolve(channel: ScaleChannel, model: Model): ResolveMode; +export declare function parseGuideResolve(resolve: Resolve, channel: ScaleChannel): ResolveMode; diff --git a/build/src/compile/resolve.js b/build/src/compile/resolve.js new file mode 100644 index 0000000000..4ea6ac8513 --- /dev/null +++ b/build/src/compile/resolve.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../channel"); +var log = tslib_1.__importStar(require("../log")); +var util_1 = require("../util"); +var model_1 = require("./model"); +function defaultScaleResolve(channel, model) { + if (model_1.isLayerModel(model) || model_1.isFacetModel(model)) { + return 'shared'; + } + else if (model_1.isConcatModel(model) || model_1.isRepeatModel(model)) { + return util_1.contains(channel_1.POSITION_SCALE_CHANNELS, channel) ? 'independent' : 'shared'; + } + /* istanbul ignore next: should never reach here. */ + throw new Error('invalid model type for resolve'); +} +exports.defaultScaleResolve = defaultScaleResolve; +function parseGuideResolve(resolve, channel) { + var channelScaleResolve = resolve.scale[channel]; + var guide = util_1.contains(channel_1.POSITION_SCALE_CHANNELS, channel) ? 'axis' : 'legend'; + if (channelScaleResolve === 'independent') { + if (resolve[guide][channel] === 'shared') { + log.warn(log.message.independentScaleMeansIndependentGuide(channel)); + } + return 'independent'; + } + return resolve[guide][channel] || 'shared'; +} +exports.parseGuideResolve = parseGuideResolve; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL3Jlc29sdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsc0NBQWlFO0FBQ2pFLGtEQUE4QjtBQUU5QixnQ0FBaUM7QUFDakMsaUNBQXdGO0FBRXhGLDZCQUFvQyxPQUFxQixFQUFFLEtBQVk7SUFDckUsSUFBSSxvQkFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLG9CQUFZLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDOUMsT0FBTyxRQUFRLENBQUM7S0FDakI7U0FBTSxJQUFJLHFCQUFhLENBQUMsS0FBSyxDQUFDLElBQUkscUJBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2RCxPQUFPLGVBQVEsQ0FBQyxpQ0FBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDOUU7SUFDRCxvREFBb0Q7SUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFSRCxrREFRQztBQUVELDJCQUFrQyxPQUFnQixFQUFFLE9BQXFCO0lBQ3ZFLElBQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRCxJQUFNLEtBQUssR0FBRyxlQUFRLENBQUMsaUNBQXVCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBRTdFLElBQUksbUJBQW1CLEtBQUssYUFBYSxFQUFFO1FBQ3pDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN4QyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sYUFBYSxDQUFDO0tBQ3RCO0lBRUQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksUUFBUSxDQUFDO0FBQzdDLENBQUM7QUFaRCw4Q0FZQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMsIFNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7UmVzb2x2ZSwgUmVzb2x2ZU1vZGV9IGZyb20gJy4uL3Jlc29sdmUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2lzQ29uY2F0TW9kZWwsIGlzRmFjZXRNb2RlbCwgaXNMYXllck1vZGVsLCBpc1JlcGVhdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2NhbGVSZXNvbHZlKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCwgbW9kZWw6IE1vZGVsKTogUmVzb2x2ZU1vZGUge1xuICBpZiAoaXNMYXllck1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgcmV0dXJuICdzaGFyZWQnO1xuICB9IGVsc2UgaWYgKGlzQ29uY2F0TW9kZWwobW9kZWwpIHx8IGlzUmVwZWF0TW9kZWwobW9kZWwpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBjaGFubmVsKSA/ICdpbmRlcGVuZGVudCcgOiAnc2hhcmVkJztcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuICovXG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtb2RlbCB0eXBlIGZvciByZXNvbHZlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUd1aWRlUmVzb2x2ZShyZXNvbHZlOiBSZXNvbHZlLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwpOiBSZXNvbHZlTW9kZSB7XG4gIGNvbnN0IGNoYW5uZWxTY2FsZVJlc29sdmUgPSByZXNvbHZlLnNjYWxlW2NoYW5uZWxdO1xuICBjb25zdCBndWlkZSA9IGNvbnRhaW5zKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBjaGFubmVsKSA/ICdheGlzJyA6ICdsZWdlbmQnO1xuXG4gIGlmIChjaGFubmVsU2NhbGVSZXNvbHZlID09PSAnaW5kZXBlbmRlbnQnKSB7XG4gICAgaWYgKHJlc29sdmVbZ3VpZGVdW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuaW5kZXBlbmRlbnRTY2FsZU1lYW5zSW5kZXBlbmRlbnRHdWlkZShjaGFubmVsKSk7XG4gICAgfVxuICAgIHJldHVybiAnaW5kZXBlbmRlbnQnO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVbZ3VpZGVdW2NoYW5uZWxdIHx8ICdzaGFyZWQnO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/scale/assemble.d.ts b/build/src/compile/scale/assemble.d.ts new file mode 100644 index 0000000000..4ed232b58c --- /dev/null +++ b/build/src/compile/scale/assemble.d.ts @@ -0,0 +1,6 @@ +import { Channel } from '../../channel'; +import { VgRange, VgScale } from '../../vega.schema'; +import { Model } from '../model'; +export declare function assembleScales(model: Model): VgScale[]; +export declare function assembleScalesForModel(model: Model): VgScale[]; +export declare function assembleScaleRange(scaleRange: VgRange, scaleName: string, model: Model, channel: Channel): VgRange; diff --git a/build/src/compile/scale/assemble.js b/build/src/compile/scale/assemble.js new file mode 100644 index 0000000000..c297a217c5 --- /dev/null +++ b/build/src/compile/scale/assemble.js @@ -0,0 +1,74 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var util_1 = require("../../util"); +var vega_schema_1 = require("../../vega.schema"); +var model_1 = require("../model"); +var selection_1 = require("../selection/selection"); +var domain_1 = require("./domain"); +function assembleScales(model) { + if (model_1.isLayerModel(model) || model_1.isConcatModel(model) || model_1.isRepeatModel(model)) { + // For concat / layer / repeat, include scales of children too + return model.children.reduce(function (scales, child) { + return scales.concat(assembleScales(child)); + }, assembleScalesForModel(model)); + } + else { + // For facet, child scales would not be included in the parent's scope. + // For unit, there is no child. + return assembleScalesForModel(model); + } +} +exports.assembleScales = assembleScales; +function assembleScalesForModel(model) { + return util_1.keys(model.component.scales).reduce(function (scales, channel) { + var scaleComponent = model.component.scales[channel]; + if (scaleComponent.merged) { + // Skipped merged scales + return scales; + } + var scale = scaleComponent.combine(); + // need to separate const and non const object destruction + var domainRaw = scale.domainRaw, range = scale.range; + var name = scale.name, type = scale.type, _d = scale.domainRaw, _r = scale.range, otherScaleProps = tslib_1.__rest(scale, ["name", "type", "domainRaw", "range"]); + range = assembleScaleRange(range, name, model, channel); + // As scale parsing occurs before selection parsing, a temporary signal + // is used for domainRaw. Here, we detect if this temporary signal + // is set, and replace it with the correct domainRaw signal. + // For more information, see isRawSelectionDomain in selection.ts. + if (domainRaw && selection_1.isRawSelectionDomain(domainRaw)) { + domainRaw = selection_1.selectionScaleDomain(model, domainRaw); + } + scales.push(tslib_1.__assign({ name: name, + type: type, domain: domain_1.assembleDomain(model, channel) }, (domainRaw ? { domainRaw: domainRaw } : {}), { range: range }, otherScaleProps)); + return scales; + }, []); +} +exports.assembleScalesForModel = assembleScalesForModel; +function assembleScaleRange(scaleRange, scaleName, model, channel) { + // add signals to x/y range + if (channel === 'x' || channel === 'y') { + if (vega_schema_1.isVgRangeStep(scaleRange)) { + // For x/y range step, use a signal created in layout assemble instead of a constant range step. + return { + step: { signal: scaleName + '_step' } + }; + } + else if (vega_util_1.isArray(scaleRange) && scaleRange.length === 2) { + var r0 = scaleRange[0]; + var r1 = scaleRange[1]; + if (r0 === 0 && vega_schema_1.isVgSignalRef(r1)) { + // Replace width signal just in case it is renamed. + return [0, { signal: model.getSizeName(r1.signal) }]; + } + else if (vega_schema_1.isVgSignalRef(r0) && r1 === 0) { + // Replace height signal just in case it is renamed. + return [{ signal: model.getSizeName(r0.signal) }, 0]; + } + } + } + return scaleRange; +} +exports.assembleScaleRange = assembleScaleRange; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9hc3NlbWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBa0M7QUFFbEMsbUNBQWdDO0FBQ2hDLGlEQUFpRjtBQUNqRixrQ0FBMkU7QUFDM0Usb0RBQWtGO0FBQ2xGLG1DQUF3QztBQUV4Qyx3QkFBK0IsS0FBWTtJQUN6QyxJQUFJLG9CQUFZLENBQUMsS0FBSyxDQUFDLElBQUkscUJBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxxQkFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZFLDhEQUE4RDtRQUM5RCxPQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUMsTUFBTSxFQUFFLEtBQUs7WUFDekMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlDLENBQUMsRUFBRSxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU07UUFDTCx1RUFBdUU7UUFDdkUsK0JBQStCO1FBQy9CLE9BQU8sc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdEM7QUFDSCxDQUFDO0FBWEQsd0NBV0M7QUFFRCxnQ0FBdUMsS0FBWTtJQUMvQyxPQUFPLFdBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQWlCLEVBQUUsT0FBcUI7UUFDbEYsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkQsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQ3pCLHdCQUF3QjtZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBRUQsSUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRXZDLDBEQUEwRDtRQUNyRCxJQUFBLDJCQUFTLEVBQUUsbUJBQUssQ0FBVTtRQUN4QixJQUFBLGlCQUFJLEVBQUUsaUJBQUksRUFBRSxvQkFBYSxFQUFFLGdCQUFTLEVBQUUsK0VBQWtCLENBQVU7UUFFekUsS0FBSyxHQUFHLGtCQUFrQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhELHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsNERBQTREO1FBQzVELGtFQUFrRTtRQUNsRSxJQUFJLFNBQVMsSUFBSSxnQ0FBb0IsQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUNoRCxTQUFTLEdBQUcsZ0NBQW9CLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3BEO1FBR0QsTUFBTSxDQUFDLElBQUksb0JBQ1QsSUFBSSxNQUFBO1lBQ0osSUFBSSxNQUFBLEVBQ0osTUFBTSxFQUFFLHVCQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUNuQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxTQUFTLFdBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFDakMsS0FBSyxFQUFFLEtBQUssSUFDVCxlQUFlLEVBQ2xCLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLEVBQUUsRUFBZSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQXBDRCx3REFvQ0M7QUFFRCw0QkFBbUMsVUFBbUIsRUFBRSxTQUFpQixFQUFFLEtBQVksRUFBRSxPQUFnQjtJQUN2RywyQkFBMkI7SUFDM0IsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLE9BQU8sS0FBSyxHQUFHLEVBQUU7UUFDdEMsSUFBSSwyQkFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdCLGdHQUFnRztZQUNoRyxPQUFPO2dCQUNMLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxFQUFDO2FBQ3BDLENBQUM7U0FDSDthQUFNLElBQUksbUJBQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN6RCxJQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSwyQkFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNqQyxtREFBbUQ7Z0JBQ25ELE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNLElBQUksMkJBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUN4QyxvREFBb0Q7Z0JBQ3BELE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO1NBQ0Y7S0FDRjtJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFyQkQsZ0RBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtDaGFubmVsLCBTY2FsZUNoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7aXNWZ1JhbmdlU3RlcCwgaXNWZ1NpZ25hbFJlZiwgVmdSYW5nZSwgVmdTY2FsZX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc0NvbmNhdE1vZGVsLCBpc0xheWVyTW9kZWwsIGlzUmVwZWF0TW9kZWwsIE1vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge2lzUmF3U2VsZWN0aW9uRG9tYWluLCBzZWxlY3Rpb25TY2FsZURvbWFpbn0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge2Fzc2VtYmxlRG9tYWlufSBmcm9tICcuL2RvbWFpbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVNjYWxlcyhtb2RlbDogTW9kZWwpOiBWZ1NjYWxlW10ge1xuICBpZiAoaXNMYXllck1vZGVsKG1vZGVsKSB8fCBpc0NvbmNhdE1vZGVsKG1vZGVsKSB8fCBpc1JlcGVhdE1vZGVsKG1vZGVsKSkge1xuICAgIC8vIEZvciBjb25jYXQgLyBsYXllciAvIHJlcGVhdCwgaW5jbHVkZSBzY2FsZXMgb2YgY2hpbGRyZW4gdG9vXG4gICAgcmV0dXJuIG1vZGVsLmNoaWxkcmVuLnJlZHVjZSgoc2NhbGVzLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIHNjYWxlcy5jb25jYXQoYXNzZW1ibGVTY2FsZXMoY2hpbGQpKTtcbiAgICB9LCBhc3NlbWJsZVNjYWxlc0Zvck1vZGVsKG1vZGVsKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gRm9yIGZhY2V0LCBjaGlsZCBzY2FsZXMgd291bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBwYXJlbnQncyBzY29wZS5cbiAgICAvLyBGb3IgdW5pdCwgdGhlcmUgaXMgbm8gY2hpbGQuXG4gICAgcmV0dXJuIGFzc2VtYmxlU2NhbGVzRm9yTW9kZWwobW9kZWwpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVNjYWxlc0Zvck1vZGVsKG1vZGVsOiBNb2RlbCk6IFZnU2NhbGVbXSB7XG4gICAgcmV0dXJuIGtleXMobW9kZWwuY29tcG9uZW50LnNjYWxlcykucmVkdWNlKChzY2FsZXM6IFZnU2NhbGVbXSwgY2hhbm5lbDogU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBzY2FsZUNvbXBvbmVudCA9IG1vZGVsLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICBpZiAoc2NhbGVDb21wb25lbnQubWVyZ2VkKSB7XG4gICAgICAgIC8vIFNraXBwZWQgbWVyZ2VkIHNjYWxlc1xuICAgICAgICByZXR1cm4gc2NhbGVzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzY2FsZSA9IHNjYWxlQ29tcG9uZW50LmNvbWJpbmUoKTtcblxuICAgICAgLy8gbmVlZCB0byBzZXBhcmF0ZSBjb25zdCBhbmQgbm9uIGNvbnN0IG9iamVjdCBkZXN0cnVjdGlvblxuICAgICAgbGV0IHtkb21haW5SYXcsIHJhbmdlfSA9IHNjYWxlO1xuICAgICAgY29uc3Qge25hbWUsIHR5cGUsIGRvbWFpblJhdzogX2QsIHJhbmdlOiBfciwgLi4ub3RoZXJTY2FsZVByb3BzfSA9IHNjYWxlO1xuXG4gICAgICByYW5nZSA9IGFzc2VtYmxlU2NhbGVSYW5nZShyYW5nZSwgbmFtZSwgbW9kZWwsIGNoYW5uZWwpO1xuXG4gICAgICAvLyBBcyBzY2FsZSBwYXJzaW5nIG9jY3VycyBiZWZvcmUgc2VsZWN0aW9uIHBhcnNpbmcsIGEgdGVtcG9yYXJ5IHNpZ25hbFxuICAgICAgLy8gaXMgdXNlZCBmb3IgZG9tYWluUmF3LiBIZXJlLCB3ZSBkZXRlY3QgaWYgdGhpcyB0ZW1wb3Jhcnkgc2lnbmFsXG4gICAgICAvLyBpcyBzZXQsIGFuZCByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlY3QgZG9tYWluUmF3IHNpZ25hbC5cbiAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaXNSYXdTZWxlY3Rpb25Eb21haW4gaW4gc2VsZWN0aW9uLnRzLlxuICAgICAgaWYgKGRvbWFpblJhdyAmJiBpc1Jhd1NlbGVjdGlvbkRvbWFpbihkb21haW5SYXcpKSB7XG4gICAgICAgIGRvbWFpblJhdyA9IHNlbGVjdGlvblNjYWxlRG9tYWluKG1vZGVsLCBkb21haW5SYXcpO1xuICAgICAgfVxuXG5cbiAgICAgIHNjYWxlcy5wdXNoKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZG9tYWluOiBhc3NlbWJsZURvbWFpbihtb2RlbCwgY2hhbm5lbCksXG4gICAgICAgIC4uLihkb21haW5SYXcgPyB7ZG9tYWluUmF3fSA6IHt9KSxcbiAgICAgICAgcmFuZ2U6IHJhbmdlLFxuICAgICAgICAuLi5vdGhlclNjYWxlUHJvcHNcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2NhbGVzO1xuICAgIH0sIFtdIGFzIFZnU2NhbGVbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVNjYWxlUmFuZ2Uoc2NhbGVSYW5nZTogVmdSYW5nZSwgc2NhbGVOYW1lOiBzdHJpbmcsIG1vZGVsOiBNb2RlbCwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICAvLyBhZGQgc2lnbmFscyB0byB4L3kgcmFuZ2VcbiAgaWYgKGNoYW5uZWwgPT09ICd4JyB8fCBjaGFubmVsID09PSAneScpIHtcbiAgICBpZiAoaXNWZ1JhbmdlU3RlcChzY2FsZVJhbmdlKSkge1xuICAgICAgLy8gRm9yIHgveSByYW5nZSBzdGVwLCB1c2UgYSBzaWduYWwgY3JlYXRlZCBpbiBsYXlvdXQgYXNzZW1ibGUgaW5zdGVhZCBvZiBhIGNvbnN0YW50IHJhbmdlIHN0ZXAuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGVwOiB7c2lnbmFsOiBzY2FsZU5hbWUgKyAnX3N0ZXAnfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoc2NhbGVSYW5nZSkgJiYgc2NhbGVSYW5nZS5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHIwID0gc2NhbGVSYW5nZVswXTtcbiAgICAgIGNvbnN0IHIxID0gc2NhbGVSYW5nZVsxXTtcbiAgICAgIGlmIChyMCA9PT0gMCAmJiBpc1ZnU2lnbmFsUmVmKHIxKSkge1xuICAgICAgICAvLyBSZXBsYWNlIHdpZHRoIHNpZ25hbCBqdXN0IGluIGNhc2UgaXQgaXMgcmVuYW1lZC5cbiAgICAgICAgcmV0dXJuIFswLCB7c2lnbmFsOiBtb2RlbC5nZXRTaXplTmFtZShyMS5zaWduYWwpfV07XG4gICAgICB9IGVsc2UgaWYgKGlzVmdTaWduYWxSZWYocjApICYmIHIxID09PSAwKSB7XG4gICAgICAgIC8vIFJlcGxhY2UgaGVpZ2h0IHNpZ25hbCBqdXN0IGluIGNhc2UgaXQgaXMgcmVuYW1lZC5cbiAgICAgICAgcmV0dXJuIFt7c2lnbmFsOiBtb2RlbC5nZXRTaXplTmFtZShyMC5zaWduYWwpfSwgMF07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzY2FsZVJhbmdlO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/scale/component.d.ts b/build/src/compile/scale/component.d.ts new file mode 100644 index 0000000000..75569d644f --- /dev/null +++ b/build/src/compile/scale/component.d.ts @@ -0,0 +1,21 @@ +import { ScaleChannel } from '../../channel'; +import { Scale, ScaleType } from '../../scale'; +import { Omit } from '../../util'; +import { VgNonUnionDomain, VgScale } from '../../vega.schema'; +import { Explicit, Split } from '../split'; +/** + * All VgDomain property except domain. + * (We exclude domain as we have a special "domains" array that allow us merge them all at once in assemble.) + */ +export declare type ScaleComponentProps = Omit; +export declare class ScaleComponent extends Split { + merged: boolean; + domains: VgNonUnionDomain[]; + constructor(name: string, typeWithExplicit: Explicit); +} +export declare type ScaleComponentIndex = { + [P in ScaleChannel]?: ScaleComponent; +}; +export declare type ScaleIndex = { + [P in ScaleChannel]?: Scale; +}; diff --git a/build/src/compile/scale/component.js b/build/src/compile/scale/component.js new file mode 100644 index 0000000000..ab5076ee40 --- /dev/null +++ b/build/src/compile/scale/component.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var split_1 = require("../split"); +var ScaleComponent = /** @class */ (function (_super) { + tslib_1.__extends(ScaleComponent, _super); + function ScaleComponent(name, typeWithExplicit) { + var _this = _super.call(this, {}, // no initial explicit property + { name: name } // name as initial implicit property + ) || this; + _this.merged = false; + _this.domains = []; + _this.setWithExplicit('type', typeWithExplicit); + return _this; + } + return ScaleComponent; +}(split_1.Split)); +exports.ScaleComponent = ScaleComponent; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2NhbGUvY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUlBLGtDQUF5QztBQVN6QztJQUFvQywwQ0FBMEI7SUFLNUQsd0JBQVksSUFBWSxFQUFFLGdCQUFxQztRQUEvRCxZQUNFLGtCQUNFLEVBQUUsRUFBTSwrQkFBK0I7UUFDdkMsRUFBQyxJQUFJLE1BQUEsRUFBQyxDQUFFLG9DQUFvQztTQUM3QyxTQUVGO1FBVk0sWUFBTSxHQUFHLEtBQUssQ0FBQztRQUVmLGFBQU8sR0FBdUIsRUFBRSxDQUFDO1FBT3RDLEtBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUM7O0lBQ2pELENBQUM7SUFDSCxxQkFBQztBQUFELENBQUMsQUFaRCxDQUFvQyxhQUFLLEdBWXhDO0FBWlksd0NBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge1NjYWxlLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7T21pdH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnTm9uVW5pb25Eb21haW4sIFZnU2NhbGV9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RXhwbGljaXQsIFNwbGl0fSBmcm9tICcuLi9zcGxpdCc7XG5cbi8qKlxuICogQWxsIFZnRG9tYWluIHByb3BlcnR5IGV4Y2VwdCBkb21haW4uXG4gKiAoV2UgZXhjbHVkZSBkb21haW4gYXMgd2UgaGF2ZSBhIHNwZWNpYWwgXCJkb21haW5zXCIgYXJyYXkgdGhhdCBhbGxvdyB1cyBtZXJnZSB0aGVtIGFsbCBhdCBvbmNlIGluIGFzc2VtYmxlLilcbiAqL1xuLy8gVE9ETzogYWxzbyBleGNsdWRlIGRvbWFpblJhdyBhbmQgcHJvcGVydHkgaW1wbGVtZW50IHRoZSByaWdodCBzY2FsZUNvbXBvbmVudCBmb3Igc2VsZWN0aW9uIGRvbWFpblxuZXhwb3J0IHR5cGUgU2NhbGVDb21wb25lbnRQcm9wcyA9IE9taXQ8VmdTY2FsZSwgJ2RvbWFpbic+O1xuXG5leHBvcnQgY2xhc3MgU2NhbGVDb21wb25lbnQgZXh0ZW5kcyBTcGxpdDxTY2FsZUNvbXBvbmVudFByb3BzPiB7XG4gIHB1YmxpYyBtZXJnZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgZG9tYWluczogVmdOb25VbmlvbkRvbWFpbltdID0gW107XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlV2l0aEV4cGxpY2l0OiBFeHBsaWNpdDxTY2FsZVR5cGU+KSB7XG4gICAgc3VwZXIoXG4gICAgICB7fSwgICAgIC8vIG5vIGluaXRpYWwgZXhwbGljaXQgcHJvcGVydHlcbiAgICAgIHtuYW1lfSAgLy8gbmFtZSBhcyBpbml0aWFsIGltcGxpY2l0IHByb3BlcnR5XG4gICAgKTtcbiAgICB0aGlzLnNldFdpdGhFeHBsaWNpdCgndHlwZScsIHR5cGVXaXRoRXhwbGljaXQpO1xuICB9XG59XG5cbi8vIFVzaW5nIE1hcHBlZCBUeXBlIHRvIGRlY2xhcmUgdHlwZSAoaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXMpXG5leHBvcnQgdHlwZSBTY2FsZUNvbXBvbmVudEluZGV4ID0ge1tQIGluIFNjYWxlQ2hhbm5lbF0/OiBTY2FsZUNvbXBvbmVudH07XG5cbmV4cG9ydCB0eXBlIFNjYWxlSW5kZXggPSB7W1AgaW4gU2NhbGVDaGFubmVsXT86IFNjYWxlfTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/scale/domain.d.ts b/build/src/compile/scale/domain.d.ts new file mode 100644 index 0000000000..17722e6666 --- /dev/null +++ b/build/src/compile/scale/domain.d.ts @@ -0,0 +1,32 @@ +import { ScaleChannel } from '../../channel'; +import { FieldDef } from '../../fielddef'; +import { ScaleType } from '../../scale'; +import { EncodingSortField } from '../../sort'; +import { VgDomain, VgNonUnionDomain } from '../../vega.schema'; +import { Model } from '../model'; +import { UnitModel } from '../unit'; +export declare function parseScaleDomain(model: Model): void; +export declare function parseDomainForChannel(model: UnitModel, channel: ScaleChannel): VgNonUnionDomain[]; +export declare function domainSort(model: UnitModel, channel: ScaleChannel, scaleType: ScaleType): true | EncodingSortField; +/** + * Determine if a scale can use unaggregated domain. + * @return {Boolean} Returns true if all of the following conditons applies: + * 1. `scale.domain` is `unaggregated` + * 2. Aggregation function is not `count` or `sum` + * 3. The scale is quantitative or time scale. + */ +export declare function canUseUnaggregatedDomain(fieldDef: FieldDef, scaleType: ScaleType): { + valid: boolean; + reason?: string; +}; +/** + * Converts an array of domains to a single Vega scale domain. + */ +export declare function mergeDomains(domains: VgNonUnionDomain[]): VgDomain; +/** + * Return a field if a scale single field. + * Return `undefined` otherwise. + * + */ +export declare function getFieldFromDomain(domain: VgDomain): string; +export declare function assembleDomain(model: Model, channel: ScaleChannel): VgDomain; diff --git a/build/src/compile/scale/domain.js b/build/src/compile/scale/domain.js new file mode 100644 index 0000000000..05234ecef8 --- /dev/null +++ b/build/src/compile/scale/domain.js @@ -0,0 +1,432 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var aggregate_1 = require("../../aggregate"); +var bin_1 = require("../../bin"); +var channel_1 = require("../../channel"); +var data_1 = require("../../data"); +var datetime_1 = require("../../datetime"); +var fielddef_1 = require("../../fielddef"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var sort_1 = require("../../sort"); +var util = tslib_1.__importStar(require("../../util")); +var vega_schema_1 = require("../../vega.schema"); +var common_1 = require("../common"); +var calculate_1 = require("../data/calculate"); +var optimize_1 = require("../data/optimize"); +var model_1 = require("../model"); +var selection_1 = require("../selection/selection"); +function parseScaleDomain(model) { + if (model_1.isUnitModel(model)) { + parseUnitScaleDomain(model); + } + else { + parseNonUnitScaleDomain(model); + } +} +exports.parseScaleDomain = parseScaleDomain; +function parseUnitScaleDomain(model) { + var scales = model.specifiedScales; + var localScaleComponents = model.component.scales; + util.keys(localScaleComponents).forEach(function (channel) { + var specifiedScale = scales[channel]; + var specifiedDomain = specifiedScale ? specifiedScale.domain : undefined; + var domains = parseDomainForChannel(model, channel); + var localScaleCmpt = localScaleComponents[channel]; + localScaleCmpt.domains = domains; + if (scale_1.isSelectionDomain(specifiedDomain)) { + // As scale parsing occurs before selection parsing, we use a temporary + // signal here and append the scale.domain definition. This is replaced + // with the correct domainRaw signal during scale assembly. + // For more information, see isRawSelectionDomain in selection.ts. + // FIXME: replace this with a special property in the scaleComponent + localScaleCmpt.set('domainRaw', { + signal: selection_1.SELECTION_DOMAIN + util.hash(specifiedDomain) + }, true); + } + if (model.component.data.isFaceted) { + // get resolve from closest facet parent as this decides whether we need to refer to cloned subtree or not + var facetParent = model; + while (!model_1.isFacetModel(facetParent) && facetParent.parent) { + facetParent = facetParent.parent; + } + var resolve = facetParent.component.resolve.scale[channel]; + if (resolve === 'shared') { + for (var _i = 0, domains_1 = domains; _i < domains_1.length; _i++) { + var domain = domains_1[_i]; + // Replace the scale domain with data output from a cloned subtree after the facet. + if (vega_schema_1.isDataRefDomain(domain)) { + // use data from cloned subtree (which is the same as data but with a prefix added once) + domain.data = optimize_1.FACET_SCALE_PREFIX + domain.data.replace(optimize_1.FACET_SCALE_PREFIX, ''); + } + } + } + } + }); +} +function parseNonUnitScaleDomain(model) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + parseScaleDomain(child); + } + var localScaleComponents = model.component.scales; + util.keys(localScaleComponents).forEach(function (channel) { + var domains; + var domainRaw = null; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childComponent = child.component.scales[channel]; + if (childComponent) { + if (domains === undefined) { + domains = childComponent.domains; + } + else { + domains = domains.concat(childComponent.domains); + } + var dr = childComponent.get('domainRaw'); + if (domainRaw && dr && domainRaw.signal !== dr.signal) { + log.warn('The same selection must be used to override scale domains in a layered view.'); + } + domainRaw = dr; + } + } + localScaleComponents[channel].domains = domains; + if (domainRaw) { + localScaleComponents[channel].set('domainRaw', domainRaw, true); + } + }); +} +/** + * Remove unaggregated domain if it is not applicable + * Add unaggregated domain if domain is not specified and config.scale.useUnaggregatedDomain is true. + */ +function normalizeUnaggregatedDomain(domain, fieldDef, scaleType, scaleConfig) { + if (domain === 'unaggregated') { + var _a = canUseUnaggregatedDomain(fieldDef, scaleType), valid = _a.valid, reason = _a.reason; + if (!valid) { + log.warn(reason); + return undefined; + } + } + else if (domain === undefined && scaleConfig.useUnaggregatedDomain) { + // Apply config if domain is not specified. + var valid = canUseUnaggregatedDomain(fieldDef, scaleType).valid; + if (valid) { + return 'unaggregated'; + } + } + return domain; +} +function parseDomainForChannel(model, channel) { + var scaleType = model.getScaleComponent(channel).get('type'); + var domain = normalizeUnaggregatedDomain(model.scaleDomain(channel), model.fieldDef(channel), scaleType, model.config.scale); + if (domain !== model.scaleDomain(channel)) { + model.specifiedScales[channel] = tslib_1.__assign({}, model.specifiedScales[channel], { domain: domain }); + } + // If channel is either X or Y then union them with X2 & Y2 if they exist + if (channel === 'x' && model.channelHasField('x2')) { + if (model.channelHasField('x')) { + return parseSingleChannelDomain(scaleType, domain, model, 'x').concat(parseSingleChannelDomain(scaleType, domain, model, 'x2')); + } + else { + return parseSingleChannelDomain(scaleType, domain, model, 'x2'); + } + } + else if (channel === 'y' && model.channelHasField('y2')) { + if (model.channelHasField('y')) { + return parseSingleChannelDomain(scaleType, domain, model, 'y').concat(parseSingleChannelDomain(scaleType, domain, model, 'y2')); + } + else { + return parseSingleChannelDomain(scaleType, domain, model, 'y2'); + } + } + return parseSingleChannelDomain(scaleType, domain, model, channel); +} +exports.parseDomainForChannel = parseDomainForChannel; +function parseSingleChannelDomain(scaleType, domain, model, channel) { + var fieldDef = model.fieldDef(channel); + if (domain && domain !== 'unaggregated' && !scale_1.isSelectionDomain(domain)) { // explicit value + if (datetime_1.isDateTime(domain[0])) { + return domain.map(function (dt) { + return { signal: "{data: " + datetime_1.dateTimeExpr(dt, true) + "}" }; + }); + } + return [domain]; + } + var stack = model.stack; + if (stack && channel === stack.fieldChannel) { + if (stack.offset === 'normalize') { + return [[0, 1]]; + } + var data = model.requestDataName(data_1.MAIN); + return [{ + data: data, + field: model.vgField(channel, { suffix: 'start' }) + }, { + data: data, + field: model.vgField(channel, { suffix: 'end' }) + }]; + } + var sort = channel_1.isScaleChannel(channel) ? domainSort(model, channel, scaleType) : undefined; + if (domain === 'unaggregated') { + var data = model.requestDataName(data_1.MAIN); + var field = fieldDef.field; + return [{ + data: data, + field: fielddef_1.vgField({ field: field, aggregate: 'min' }) + }, { + data: data, + field: fielddef_1.vgField({ field: field, aggregate: 'max' }) + }]; + } + else if (fieldDef.bin) { // bin + if (scale_1.isBinScale(scaleType)) { + var signal = model.getName(bin_1.binToString(fieldDef.bin) + "_" + fieldDef.field + "_bins"); + return [{ signal: "sequence(" + signal + ".start, " + signal + ".stop + " + signal + ".step, " + signal + ".step)" }]; + } + if (scale_1.hasDiscreteDomain(scaleType)) { + // ordinal bin scale takes domain from bin_range, ordered by bin start + // This is useful for both axis-based scale (x/y) and legend-based scale (other channels). + return [{ + // If sort by aggregation of a specified sort field, we need to use RAW table, + // so we can aggregate values for the scale independently from the main aggregation. + data: util.isBoolean(sort) ? model.requestDataName(data_1.MAIN) : model.requestDataName(data_1.RAW), + // Use range if we added it and the scale does not support computing a range as a signal. + field: model.vgField(channel, common_1.binRequiresRange(fieldDef, channel) ? { binSuffix: 'range' } : {}), + // we have to use a sort object if sort = true to make the sort correct by bin start + sort: sort === true || !sort_1.isSortField(sort) ? { + field: model.vgField(channel, {}), + op: 'min' // min or max doesn't matter since we sort by the start of the bin range + } : sort + }]; + } + else { // continuous scales + if (channel === 'x' || channel === 'y') { + if (bin_1.isBinParams(fieldDef.bin) && fieldDef.bin.extent) { + return [fieldDef.bin.extent]; + } + // X/Y position have to include start and end for non-ordinal scale + var data = model.requestDataName(data_1.MAIN); + return [{ + data: data, + field: model.vgField(channel, {}) + }, { + data: data, + field: model.vgField(channel, { binSuffix: 'end' }) + }]; + } + else { + // TODO: use bin_mid + return [{ + data: model.requestDataName(data_1.MAIN), + field: model.vgField(channel, {}) + }]; + } + } + } + else if (sort) { + return [{ + // If sort by aggregation of a specified sort field, we need to use RAW table, + // so we can aggregate values for the scale independently from the main aggregation. + data: util.isBoolean(sort) ? model.requestDataName(data_1.MAIN) : model.requestDataName(data_1.RAW), + field: model.vgField(channel), + sort: sort + }]; + } + else { + return [{ + data: model.requestDataName(data_1.MAIN), + field: model.vgField(channel) + }]; + } +} +function domainSort(model, channel, scaleType) { + if (!scale_1.hasDiscreteDomain(scaleType)) { + return undefined; + } + var fieldDef = model.fieldDef(channel); + var sort = fieldDef.sort; + // if the sort is specified with array, use the derived sort index field + if (sort_1.isSortArray(sort)) { + return { + op: 'min', + field: calculate_1.sortArrayIndexField(model, channel), + order: 'ascending' + }; + } + // Sorted based on an aggregate calculation over a specified sort field (only for ordinal scale) + if (sort_1.isSortField(sort)) { + // flatten nested fields + return tslib_1.__assign({}, sort, (sort.field ? { field: util.replacePathInField(sort.field) } : {})); + } + if (sort === 'descending') { + return { + op: 'min', + field: model.vgField(channel), + order: 'descending' + }; + } + if (util.contains(['ascending', undefined /* default =ascending*/], sort)) { + return true; + } + // sort == null + return undefined; +} +exports.domainSort = domainSort; +/** + * Determine if a scale can use unaggregated domain. + * @return {Boolean} Returns true if all of the following conditons applies: + * 1. `scale.domain` is `unaggregated` + * 2. Aggregation function is not `count` or `sum` + * 3. The scale is quantitative or time scale. + */ +function canUseUnaggregatedDomain(fieldDef, scaleType) { + if (!fieldDef.aggregate) { + return { + valid: false, + reason: log.message.unaggregateDomainHasNoEffectForRawField(fieldDef) + }; + } + if (!aggregate_1.SHARED_DOMAIN_OP_INDEX[fieldDef.aggregate]) { + return { + valid: false, + reason: log.message.unaggregateDomainWithNonSharedDomainOp(fieldDef.aggregate) + }; + } + if (fieldDef.type === 'quantitative') { + if (scaleType === 'log') { + return { + valid: false, + reason: log.message.unaggregatedDomainWithLogScale(fieldDef) + }; + } + } + return { valid: true }; +} +exports.canUseUnaggregatedDomain = canUseUnaggregatedDomain; +/** + * Converts an array of domains to a single Vega scale domain. + */ +function mergeDomains(domains) { + var uniqueDomains = util.unique(domains.map(function (domain) { + // ignore sort property when computing the unique domains + if (vega_schema_1.isDataRefDomain(domain)) { + var _s = domain.sort, domainWithoutSort = tslib_1.__rest(domain, ["sort"]); + return domainWithoutSort; + } + return domain; + }), util.hash); + var sorts = util.unique(domains.map(function (d) { + if (vega_schema_1.isDataRefDomain(d)) { + var s = d.sort; + if (s !== undefined && !util.isBoolean(s)) { + if (s.op === 'count') { + // let's make sure that if op is count, we don't use a field + delete s.field; + } + if (s.order === 'ascending') { + // drop order: ascending as it is the default + delete s.order; + } + } + return s; + } + return undefined; + }).filter(function (s) { return s !== undefined; }), util.hash); + if (uniqueDomains.length === 1) { + var domain = domains[0]; + if (vega_schema_1.isDataRefDomain(domain) && sorts.length > 0) { + var sort_2 = sorts[0]; + if (sorts.length > 1) { + log.warn(log.message.MORE_THAN_ONE_SORT); + sort_2 = true; + } + return tslib_1.__assign({}, domain, { sort: sort_2 }); + } + return domain; + } + // only keep simple sort properties that work with unioned domains + var simpleSorts = util.unique(sorts.map(function (s) { + if (s === true) { + return s; + } + if (s.op === 'count') { + return s; + } + log.warn(log.message.domainSortDropped(s)); + return true; + }), util.hash); + var sort = undefined; + if (simpleSorts.length === 1) { + sort = simpleSorts[0]; + } + else if (simpleSorts.length > 1) { + log.warn(log.message.MORE_THAN_ONE_SORT); + sort = true; + } + var allData = util.unique(domains.map(function (d) { + if (vega_schema_1.isDataRefDomain(d)) { + return d.data; + } + return null; + }), function (x) { return x; }); + if (allData.length === 1 && allData[0] !== null) { + // create a union domain of different fields with a single data source + var domain = tslib_1.__assign({ data: allData[0], fields: uniqueDomains.map(function (d) { return d.field; }) }, (sort ? { sort: sort } : {})); + return domain; + } + return tslib_1.__assign({ fields: uniqueDomains }, (sort ? { sort: sort } : {})); +} +exports.mergeDomains = mergeDomains; +/** + * Return a field if a scale single field. + * Return `undefined` otherwise. + * + */ +function getFieldFromDomain(domain) { + if (vega_schema_1.isDataRefDomain(domain) && vega_util_1.isString(domain.field)) { + return domain.field; + } + else if (vega_schema_1.isDataRefUnionedDomain(domain)) { + var field = void 0; + for (var _i = 0, _a = domain.fields; _i < _a.length; _i++) { + var nonUnionDomain = _a[_i]; + if (vega_schema_1.isDataRefDomain(nonUnionDomain) && vega_util_1.isString(nonUnionDomain.field)) { + if (!field) { + field = nonUnionDomain.field; + } + else if (field !== nonUnionDomain.field) { + log.warn('Detected faceted independent scales that union domain of multiple fields from different data sources. We will use the first field. The result view size may be incorrect.'); + return field; + } + } + } + log.warn('Detected faceted independent scales that union domain of identical fields from different source detected. We will assume that this is the same field from a different fork of the same data source. However, if this is not case, the result view size maybe incorrect.'); + return field; + } + else if (vega_schema_1.isFieldRefUnionDomain(domain)) { + log.warn('Detected faceted independent scales that union domain of multiple fields from the same data source. We will use the first field. The result view size may be incorrect.'); + var field = domain.fields[0]; + return vega_util_1.isString(field) ? field : undefined; + } + return undefined; +} +exports.getFieldFromDomain = getFieldFromDomain; +function assembleDomain(model, channel) { + var scaleComponent = model.component.scales[channel]; + var domains = scaleComponent.domains.map(function (domain) { + // Correct references to data as the original domain's data was determined + // in parseScale, which happens before parseData. Thus the original data + // reference can be incorrect. + if (vega_schema_1.isDataRefDomain(domain)) { + domain.data = model.lookupDataSource(domain.data); + } + return domain; + }); + // domains is an array that has to be merged into a single vega domain + return mergeDomains(domains); +} +exports.assembleDomain = assembleDomain; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2NhbGUvZG9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFtQztBQUNuQyw2Q0FBdUQ7QUFDdkQsaUNBQW1EO0FBQ25ELHlDQUEyRDtBQUMzRCxtQ0FBcUM7QUFDckMsMkNBQWtFO0FBQ2xFLDJDQUFnRTtBQUNoRSxxREFBaUM7QUFDakMscUNBQTZHO0FBQzdHLG1DQUF1RTtBQUN2RSx1REFBbUM7QUFDbkMsaURBQThMO0FBQzlMLG9DQUEyQztBQUMzQywrQ0FBc0Q7QUFDdEQsNkNBQW9EO0FBQ3BELGtDQUEwRDtBQUMxRCxvREFBd0Q7QUFLeEQsMEJBQWlDLEtBQVk7SUFDM0MsSUFBSSxtQkFBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzdCO1NBQU07UUFDTCx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNoQztBQUNILENBQUM7QUFORCw0Q0FNQztBQUVELDhCQUE4QixLQUFnQjtJQUM1QyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO0lBQ3JDLElBQU0sb0JBQW9CLEdBQXdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBRXpFLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxPQUFxQjtRQUM1RCxJQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsSUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFFM0UsSUFBTSxPQUFPLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELElBQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFD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QztRQUMvQixPQUFPLG9CQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0tBQzVDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQXhCRCxnREF3QkM7QUFFRCx3QkFBK0IsS0FBWSxFQUFFLE9BQXFCO0lBQ2hFLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZELElBQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQUEsTUFBTTtRQUMvQywwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLDhCQUE4QjtRQUU5QixJQUFJLDZCQUFlLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxzRUFBc0U7SUFDdEUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWZELHdDQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc1N0cmluZ30gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7U0hBUkVEX0RPTUFJTl9PUF9JTkRFWH0gZnJvbSAnLi4vLi4vYWdncmVnYXRlJztcbmltcG9ydCB7YmluVG9TdHJpbmcsIGlzQmluUGFyYW1zfSBmcm9tICcuLi8uLi9iaW4nO1xuaW1wb3J0IHtpc1NjYWxlQ2hhbm5lbCwgU2NhbGVDaGFubmVsfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7TUFJTiwgUkFXfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7RGF0ZVRpbWUsIGRhdGVUaW1lRXhwciwgaXNEYXRlVGltZX0gZnJvbSAnLi4vLi4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtGaWVsZERlZiwgU2NhbGVGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge0RvbWFpbiwgaGFzRGlzY3JldGVEb21haW4sIGlzQmluU2NhbGUsIGlzU2VsZWN0aW9uRG9tYWluLCBTY2FsZUNvbmZpZywgU2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge0VuY29kaW5nU29ydEZpZWxkLCBpc1NvcnRBcnJheSwgaXNTb3J0RmllbGR9IGZyb20gJy4uLy4uL3NvcnQnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7aXNEYXRhUmVmRG9tYWluLCBpc0RhdGFSZWZVbmlvbmVkRG9tYWluLCBpc0ZpZWxkUmVmVW5pb25Eb21haW4sIFZnRGF0YVJlZiwgVmdEb21haW4sIFZnRmllbGRSZWZVbmlvbkRvbWFpbiwgVmdOb25VbmlvbkRvbWFpbiwgVmdTb3J0RmllbGQsIFZnVW5pb25Tb3J0RmllbGR9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YmluUmVxdWlyZXNSYW5nZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7c29ydEFycmF5SW5kZXhGaWVsZH0gZnJvbSAnLi4vZGF0YS9jYWxjdWxhdGUnO1xuaW1wb3J0IHtGQUNFVF9TQ0FMRV9QUkVGSVh9IGZyb20gJy4uL2RhdGEvb3B0aW1pemUnO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtTRUxFQ1RJT05fRE9NQUlOfSBmcm9tICcuLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7U2NhbGVDb21wb25lbnRJbmRleH0gZnJvbSAnLi9jb21wb25lbnQnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYWxlRG9tYWluKG1vZGVsOiBNb2RlbCkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgcGFyc2VVbml0U2NhbGVEb21haW4obW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIHBhcnNlTm9uVW5pdFNjYWxlRG9tYWluKG1vZGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRTY2FsZURvbWFpbihtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHNjYWxlcyA9IG1vZGVsLnNwZWNpZmllZFNjYWxlcztcbiAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzO1xuXG4gIHV0aWwua2V5cyhsb2NhbFNjYWxlQ29tcG9uZW50cykuZm9yRWFjaCgoY2hhbm5lbDogU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgY29uc3Qgc3BlY2lmaWVkU2NhbGUgPSBzY2FsZXNbY2hhbm5lbF07XG4gICAgY29uc3Qgc3BlY2lmaWVkRG9tYWluID0gc3BlY2lmaWVkU2NhbGUgPyBzcGVjaWZpZWRTY2FsZS5kb21haW4gOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBkb21haW5zID0gcGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCBjaGFubmVsKTtcbiAgICBjb25zdCBsb2NhbFNjYWxlQ21wdCA9IGxvY2FsU2NhbGVDb21wb25lbnRzW2NoYW5uZWxdO1xuICAgIGxvY2FsU2NhbGVDbXB0LmRvbWFpbnMgPSBkb21haW5zO1xuXG4gICAgaWYgKGlzU2VsZWN0aW9uRG9tYWluKHNwZWNpZmllZERvbWFpbikpIHtcbiAgICAgIC8vIEFzIHNjYWxlIHBhcnNpbmcgb2NjdXJzIGJlZm9yZSBzZWxlY3Rpb24gcGFyc2luZywgd2UgdXNlIGEgdGVtcG9yYXJ5XG4gICAgICAvLyBzaWduYWwgaGVyZSBhbmQgYXBwZW5kIHRoZSBzY2FsZS5kb21haW4gZGVmaW5pdGlvbi4gVGhpcyBpcyByZXBsYWNlZFxuICAgICAgLy8gd2l0aCB0aGUgY29ycmVjdCBkb21haW5SYXcgc2lnbmFsIGR1cmluZyBzY2FsZSBhc3NlbWJseS5cbiAgICAgIC8vIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgaXNSYXdTZWxlY3Rpb25Eb21haW4gaW4gc2VsZWN0aW9uLnRzLlxuXG4gICAgICAvLyBGSVhNRTogcmVwbGFjZSB0aGlzIHdpdGggYSBzcGVjaWFsIHByb3BlcnR5IGluIHRoZSBzY2FsZUNvbXBvbmVudFxuICAgICAgbG9jYWxTY2FsZUNtcHQuc2V0KCdkb21haW5SYXcnLCB7XG4gICAgICAgIHNpZ25hbDogU0VMRUNUSU9OX0RPTUFJTiArIHV0aWwuaGFzaChzcGVjaWZpZWREb21haW4pXG4gICAgICB9LCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAobW9kZWwuY29tcG9uZW50LmRhdGEuaXNGYWNldGVkKSB7XG4gICAgICAvLyBnZXQgcmVzb2x2ZSBmcm9tIGNsb3Nlc3QgZmFjZXQgcGFyZW50IGFzIHRoaXMgZGVjaWRlcyB3aGV0aGVyIHdlIG5lZWQgdG8gcmVmZXIgdG8gY2xvbmVkIHN1YnRyZWUgb3Igbm90XG4gICAgICBsZXQgZmFjZXRQYXJlbnQ6IE1vZGVsID0gbW9kZWw7XG4gICAgICB3aGlsZSAoIWlzRmFjZXRNb2RlbChmYWNldFBhcmVudCkgJiYgZmFjZXRQYXJlbnQucGFyZW50KSB7XG4gICAgICAgIGZhY2V0UGFyZW50ID0gZmFjZXRQYXJlbnQucGFyZW50O1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNvbHZlID0gZmFjZXRQYXJlbnQuY29tcG9uZW50LnJlc29sdmUuc2NhbGVbY2hhbm5lbF07XG5cbiAgICAgIGlmIChyZXNvbHZlID09PSAnc2hhcmVkJykge1xuICAgICAgICBmb3IgKGNvbnN0IGRvbWFpbiBvZiBkb21haW5zKSB7XG4gICAgICAgICAgLy8gUmVwbGFjZSB0aGUgc2NhbGUgZG9tYWluIHdpdGggZGF0YSBvdXRwdXQgZnJvbSBhIGNsb25lZCBzdWJ0cmVlIGFmdGVyIHRoZSBmYWNldC5cbiAgICAgICAgICBpZiAoaXNEYXRhUmVmRG9tYWluKGRvbWFpbikpIHtcbiAgICAgICAgICAgIC8vIHVzZSBkYXRhIGZyb20gY2xvbmVkIHN1YnRyZWUgKHdoaWNoIGlzIHRoZSBzYW1lIGFzIGRhdGEgYnV0IHdpdGggYSBwcmVmaXggYWRkZWQgb25jZSlcbiAgICAgICAgICAgIGRvbWFpbi5kYXRhID0gRkFDRVRfU0NBTEVfUFJFRklYICsgZG9tYWluLmRhdGEucmVwbGFjZShGQUNFVF9TQ0FMRV9QUkVGSVgsICcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZU5vblVuaXRTY2FsZURvbWFpbihtb2RlbDogTW9kZWwpIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIHBhcnNlU2NhbGVEb21haW4oY2hpbGQpO1xuICB9XG5cbiAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzO1xuXG4gIHV0aWwua2V5cyhsb2NhbFNjYWxlQ29tcG9uZW50cykuZm9yRWFjaCgoY2hhbm5lbDogU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgbGV0IGRvbWFpbnM6IFZnTm9uVW5pb25Eb21haW5bXTtcbiAgICBsZXQgZG9tYWluUmF3ID0gbnVsbDtcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gY2hpbGQuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcbiAgICAgIGlmIChjaGlsZENvbXBvbmVudCkge1xuICAgICAgICBpZiAoZG9tYWlucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9tYWlucyA9IGNoaWxkQ29tcG9uZW50LmRvbWFpbnM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9tYWlucyA9IGRvbWFpbnMuY29uY2F0KGNoaWxkQ29tcG9uZW50LmRvbWFpbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZHIgPSBjaGlsZENvbXBvbmVudC5nZXQoJ2RvbWFpblJhdycpO1xuICAgICAgICBpZiAoZG9tYWluUmF3ICYmIGRyICYmIGRvbWFpblJhdy5zaWduYWwgIT09IGRyLnNpZ25hbCkge1xuICAgICAgICAgIGxvZy53YXJuKCdUaGUgc2FtZSBzZWxlY3Rpb24gbXVzdCBiZSB1c2VkIHRvIG92ZXJyaWRlIHNjYWxlIGRvbWFpbnMgaW4gYSBsYXllcmVkIHZpZXcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgZG9tYWluUmF3ID0gZHI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbG9jYWxTY2FsZUNvbXBvbmVudHNbY2hhbm5lbF0uZG9tYWlucyA9IGRvbWFpbnM7XG5cbiAgICBpZiAoZG9tYWluUmF3KSB7XG4gICAgICBsb2NhbFNjYWxlQ29tcG9uZW50c1tjaGFubmVsXS5zZXQoJ2RvbWFpblJhdycsIGRvbWFpblJhdywgdHJ1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuXG4vKipcbiAqIFJlbW92ZSB1bmFnZ3JlZ2F0ZWQgZG9tYWluIGlmIGl0IGlzIG5vdCBhcHBsaWNhYmxlXG4gKiBBZGQgdW5hZ2dyZWdhdGVkIGRvbWFpbiBpZiBkb21haW4gaXMgbm90IHNwZWNpZmllZCBhbmQgY29uZmlnLnNjYWxlLnVzZVVuYWdncmVnYXRlZERvbWFpbiBpcyB0cnVlLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVVbmFnZ3JlZ2F0ZWREb21haW4oZG9tYWluOiBEb21haW4sIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgc2NhbGVDb25maWc6IFNjYWxlQ29uZmlnKSB7XG4gIGlmIChkb21haW4gPT09ICd1bmFnZ3JlZ2F0ZWQnKSB7XG4gICAgY29uc3Qge3ZhbGlkLCByZWFzb259ID0gY2FuVXNlVW5hZ2dyZWdhdGVkRG9tYWluKGZpZWxkRGVmLCBzY2FsZVR5cGUpO1xuICAgIGlmKCF2YWxpZCkge1xuICAgICAgbG9nLndhcm4ocmVhc29uKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRvbWFpbiA9PT0gdW5kZWZpbmVkICYmIHNjYWxlQ29uZmlnLnVzZVVuYWdncmVnYXRlZERvbWFpbikge1xuICAgIC8vIEFwcGx5IGNvbmZpZyBpZiBkb21haW4gaXMgbm90IHNwZWNpZmllZC5cbiAgICBjb25zdCB7dmFsaWR9ID0gY2FuVXNlVW5hZ2dyZWdhdGVkRG9tYWluKGZpZWxkRGVmLCBzY2FsZVR5cGUpO1xuICAgIGlmICh2YWxpZCkge1xuICAgICAgcmV0dXJuICd1bmFnZ3JlZ2F0ZWQnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkb21haW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURvbWFpbkZvckNoYW5uZWwobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogU2NhbGVDaGFubmVsKTogVmdOb25VbmlvbkRvbWFpbltdIHtcbiAgY29uc3Qgc2NhbGVUeXBlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJyk7XG5cbiAgY29uc3QgZG9tYWluID0gbm9ybWFsaXplVW5hZ2dyZWdhdGVkRG9tYWluKG1vZGVsLnNjYWxlRG9tYWluKGNoYW5uZWwpLCBtb2RlbC5maWVsZERlZihjaGFubmVsKSwgc2NhbGVUeXBlLCBtb2RlbC5jb25maWcuc2NhbGUpO1xuICBpZiAoZG9tYWluICE9PSBtb2RlbC5zY2FsZURvbWFpbihjaGFubmVsKSkge1xuICAgIG1vZGVsLnNwZWNpZmllZFNjYWxlc1tjaGFubmVsXSA9IHtcbiAgICAgIC4uLm1vZGVsLnNwZWNpZmllZFNjYWxlc1tjaGFubmVsXSxcbiAgICAgIGRvbWFpblxuICAgIH07XG4gIH1cblxuICAvLyBJZiBjaGFubmVsIGlzIGVpdGhlciBYIG9yIFkgdGhlbiB1bmlvbiB0aGVtIHdpdGggWDIgJiBZMiBpZiB0aGV5IGV4aXN0XG4gIGlmIChjaGFubmVsID09PSAneCcgJiYgbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKCd4MicpKSB7XG4gICAgaWYgKG1vZGVsLmNoYW5uZWxIYXNGaWVsZCgneCcpKSB7XG4gICAgICByZXR1cm4gcGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3gnKS5jb25jYXQocGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3gyJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3gyJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNoYW5uZWwgPT09ICd5JyAmJiBtb2RlbC5jaGFubmVsSGFzRmllbGQoJ3kyJykpIHtcbiAgICBpZiAobW9kZWwuY2hhbm5lbEhhc0ZpZWxkKCd5JykpIHtcbiAgICAgIHJldHVybiBwYXJzZVNpbmdsZUNoYW5uZWxEb21haW4oc2NhbGVUeXBlLCBkb21haW4sIG1vZGVsLCAneScpLmNvbmNhdChwYXJzZVNpbmdsZUNoYW5uZWxEb21haW4oc2NhbGVUeXBlLCBkb21haW4sIG1vZGVsLCAneTInKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBwYXJzZVNpbmdsZUNoYW5uZWxEb21haW4oc2NhbGVUeXBlLCBkb21haW4sIG1vZGVsLCAneTInKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBhcnNlU2luZ2xlQ2hhbm5lbERvbWFpbihzY2FsZVR5cGUsIGRvbWFpbiwgbW9kZWwsIGNoYW5uZWwpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVNpbmdsZUNoYW5uZWxEb21haW4oc2NhbGVUeXBlOiBTY2FsZVR5cGUsIGRvbWFpbjogRG9tYWluLCBtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwgfCAneDInIHwgJ3kyJyk6IFZnTm9uVW5pb25Eb21haW5bXSB7XG4gIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCk7XG5cbiAgaWYgKGRvbWFpbiAmJiBkb21haW4gIT09ICd1bmFnZ3JlZ2F0ZWQnICYmICFpc1NlbGVjdGlvbkRvbWFpbihkb21haW4pKSB7IC8vIGV4cGxpY2l0IHZhbHVlXG4gICAgaWYgKGlzRGF0ZVRpbWUoZG9tYWluWzBdKSkge1xuICAgICAgcmV0dXJuIChkb21haW4gYXMgRGF0ZVRpbWVbXSkubWFwKChkdCkgPT4ge1xuICAgICAgICByZXR1cm4ge3NpZ25hbDogYHtkYXRhOiAke2RhdGVUaW1lRXhwcihkdCwgdHJ1ZSl9fWB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBbZG9tYWluXTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrID0gbW9kZWwuc3RhY2s7XG4gIGlmIChzdGFjayAmJiBjaGFubmVsID09PSBzdGFjay5maWVsZENoYW5uZWwpIHtcbiAgICBpZihzdGFjay5vZmZzZXQgPT09ICdub3JtYWxpemUnKSB7XG4gICAgICByZXR1cm4gW1swLCAxXV07XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKTtcbiAgICByZXR1cm4gW3tcbiAgICAgIGRhdGEsXG4gICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsLCB7c3VmZml4OiAnc3RhcnQnfSlcbiAgICB9LCB7XG4gICAgICBkYXRhLFxuICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCwge3N1ZmZpeDogJ2VuZCd9KVxuICAgIH1dO1xuICB9XG5cbiAgY29uc3Qgc29ydCA9IGlzU2NhbGVDaGFubmVsKGNoYW5uZWwpID8gZG9tYWluU29ydChtb2RlbCwgY2hhbm5lbCwgc2NhbGVUeXBlKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoZG9tYWluID09PSAndW5hZ2dyZWdhdGVkJykge1xuICAgIGNvbnN0IGRhdGEgPSBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTik7XG4gICAgY29uc3Qge2ZpZWxkfSA9IGZpZWxkRGVmO1xuICAgIHJldHVybiBbe1xuICAgICAgZGF0YSxcbiAgICAgIGZpZWxkOiB2Z0ZpZWxkKHtmaWVsZCwgYWdncmVnYXRlOiAnbWluJ30pXG4gICAgfSwge1xuICAgICAgZGF0YSxcbiAgICAgIGZpZWxkOiB2Z0ZpZWxkKHtmaWVsZCwgYWdncmVnYXRlOiAnbWF4J30pXG4gICAgfV07XG4gIH0gZWxzZSBpZiAoZmllbGREZWYuYmluKSB7IC8vIGJpblxuICAgIGlmIChpc0JpblNjYWxlKHNjYWxlVHlwZSkpIHtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IG1vZGVsLmdldE5hbWUoYCR7YmluVG9TdHJpbmcoZmllbGREZWYuYmluKX1fJHtmaWVsZERlZi5maWVsZH1fYmluc2ApO1xuICAgICAgcmV0dXJuIFt7c2lnbmFsOiBgc2VxdWVuY2UoJHtzaWduYWx9LnN0YXJ0LCAke3NpZ25hbH0uc3RvcCArICR7c2lnbmFsfS5zdGVwLCAke3NpZ25hbH0uc3RlcClgfV07XG4gICAgfVxuXG4gICAgaWYgKGhhc0Rpc2NyZXRlRG9tYWluKHNjYWxlVHlwZSkpIHtcbiAgICAgIC8vIG9yZGluYWwgYmluIHNjYWxlIHRha2VzIGRvbWFpbiBmcm9tIGJpbl9yYW5nZSwgb3JkZXJlZCBieSBiaW4gc3RhcnRcbiAgICAgIC8vIFRoaXMgaXMgdXNlZnVsIGZvciBib3RoIGF4aXMtYmFzZWQgc2NhbGUgKHgveSkgYW5kIGxlZ2VuZC1iYXNlZCBzY2FsZSAob3RoZXIgY2hhbm5lbHMpLlxuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIC8vIElmIHNvcnQgYnkgYWdncmVnYXRpb24gb2YgYSBzcGVjaWZpZWQgc29ydCBmaWVsZCwgd2UgbmVlZCB0byB1c2UgUkFXIHRhYmxlLFxuICAgICAgICAvLyBzbyB3ZSBjYW4gYWdncmVnYXRlIHZhbHVlcyBmb3IgdGhlIHNjYWxlIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgbWFpbiBhZ2dyZWdhdGlvbi5cbiAgICAgICAgZGF0YTogdXRpbC5pc0Jvb2xlYW4oc29ydCkgPyBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTikgOiBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoUkFXKSxcbiAgICAgICAgLy8gVXNlIHJhbmdlIGlmIHdlIGFkZGVkIGl0IGFuZCB0aGUgc2NhbGUgZG9lcyBub3Qgc3VwcG9ydCBjb21wdXRpbmcgYSByYW5nZSBhcyBhIHNpZ25hbC5cbiAgICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCwgYmluUmVxdWlyZXNSYW5nZShmaWVsZERlZiwgY2hhbm5lbCkgPyB7YmluU3VmZml4OiAncmFuZ2UnfSA6IHt9KSxcbiAgICAgICAgLy8gd2UgaGF2ZSB0byB1c2UgYSBzb3J0IG9iamVjdCBpZiBzb3J0ID0gdHJ1ZSB0byBtYWtlIHRoZSBzb3J0IGNvcnJlY3QgYnkgYmluIHN0YXJ0XG4gICAgICAgIHNvcnQ6IHNvcnQgPT09IHRydWUgfHwgIWlzU29ydEZpZWxkKHNvcnQpID8ge1xuICAgICAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIHt9KSxcbiAgICAgICAgICBvcDogJ21pbicgLy8gbWluIG9yIG1heCBkb2Vzbid0IG1hdHRlciBzaW5jZSB3ZSBzb3J0IGJ5IHRoZSBzdGFydCBvZiB0aGUgYmluIHJhbmdlXG4gICAgICAgIH0gOiBzb3J0XG4gICAgICB9XTtcbiAgICB9IGVsc2UgeyAvLyBjb250aW51b3VzIHNjYWxlc1xuICAgICAgaWYgKGNoYW5uZWwgPT09ICd4JyB8fCBjaGFubmVsID09PSAneScpIHtcbiAgICAgICAgaWYgKGlzQmluUGFyYW1zKGZpZWxkRGVmLmJpbikgJiYgZmllbGREZWYuYmluLmV4dGVudCkge1xuICAgICAgICAgIHJldHVybiBbZmllbGREZWYuYmluLmV4dGVudF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gWC9ZIHBvc2l0aW9uIGhhdmUgdG8gaW5jbHVkZSBzdGFydCBhbmQgZW5kIGZvciBub24tb3JkaW5hbCBzY2FsZVxuICAgICAgICBjb25zdCBkYXRhID0gbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pO1xuICAgICAgICByZXR1cm4gW3tcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIHt9KVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsLCB7YmluU3VmZml4OiAnZW5kJ30pXG4gICAgICAgIH1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogdXNlIGJpbl9taWRcbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgZGF0YTogbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pLFxuICAgICAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIHt9KVxuICAgICAgICB9XTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoc29ydCkge1xuICAgIHJldHVybiBbe1xuICAgICAgLy8gSWYgc29ydCBieSBhZ2dyZWdhdGlvbiBvZiBhIHNwZWNpZmllZCBzb3J0IGZpZWxkLCB3ZSBuZWVkIHRvIHVzZSBSQVcgdGFibGUsXG4gICAgICAvLyBzbyB3ZSBjYW4gYWdncmVnYXRlIHZhbHVlcyBmb3IgdGhlIHNjYWxlIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgbWFpbiBhZ2dyZWdhdGlvbi5cbiAgICAgIGRhdGE6IHV0aWwuaXNCb29sZWFuKHNvcnQpID8gbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pIDogbW9kZWwucmVxdWVzdERhdGFOYW1lKFJBVyksXG4gICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsKSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICB9XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIGRhdGE6IG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKSxcbiAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwpXG4gICAgfV07XG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZG9tYWluU29ydChtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlKTogdHJ1ZSB8IEVuY29kaW5nU29ydEZpZWxkPHN0cmluZz4ge1xuICBpZiAoIWhhc0Rpc2NyZXRlRG9tYWluKHNjYWxlVHlwZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZmllbGREZWY6IFNjYWxlRmllbGREZWY8c3RyaW5nPiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICBjb25zdCBzb3J0ID0gZmllbGREZWYuc29ydDtcblxuICAvLyBpZiB0aGUgc29ydCBpcyBzcGVjaWZpZWQgd2l0aCBhcnJheSwgdXNlIHRoZSBkZXJpdmVkIHNvcnQgaW5kZXggZmllbGRcbiAgaWYgKGlzU29ydEFycmF5KHNvcnQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnbWluJyxcbiAgICAgIGZpZWxkOiBzb3J0QXJyYXlJbmRleEZpZWxkKG1vZGVsLCBjaGFubmVsKSxcbiAgICAgIG9yZGVyOiAnYXNjZW5kaW5nJ1xuICAgIH07XG4gIH1cblxuICAvLyBTb3J0ZWQgYmFzZWQgb24gYW4gYWdncmVnYXRlIGNhbGN1bGF0aW9uIG92ZXIgYSBzcGVjaWZpZWQgc29ydCBmaWVsZCAob25seSBmb3Igb3JkaW5hbCBzY2FsZSlcbiAgaWYgKGlzU29ydEZpZWxkKHNvcnQpKSB7XG4gICAgLy8gZmxhdHRlbiBuZXN0ZWQgZmllbGRzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNvcnQsXG4gICAgICAuLi4oc29ydC5maWVsZCA/IHtmaWVsZDogdXRpbC5yZXBsYWNlUGF0aEluRmllbGQoc29ydC5maWVsZCl9IDoge30pXG4gICAgfTtcbiAgfVxuXG4gIGlmIChzb3J0ID09PSAnZGVzY2VuZGluZycpIHtcbiAgICByZXR1cm4ge1xuICAgICAgb3A6ICdtaW4nLFxuICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCksXG4gICAgICBvcmRlcjogJ2Rlc2NlbmRpbmcnXG4gICAgfTtcbiAgfVxuXG4gIGlmICh1dGlsLmNvbnRhaW5zKFsnYXNjZW5kaW5nJywgdW5kZWZpbmVkIC8qIGRlZmF1bHQgPWFzY2VuZGluZyovXSwgc29ydCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHNvcnQgPT0gbnVsbFxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBzY2FsZSBjYW4gdXNlIHVuYWdncmVnYXRlZCBkb21haW4uXG4gKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0b25zIGFwcGxpZXM6XG4gKiAxLiBgc2NhbGUuZG9tYWluYCBpcyBgdW5hZ2dyZWdhdGVkYFxuICogMi4gQWdncmVnYXRpb24gZnVuY3Rpb24gaXMgbm90IGBjb3VudGAgb3IgYHN1bWBcbiAqIDMuIFRoZSBzY2FsZSBpcyBxdWFudGl0YXRpdmUgb3IgdGltZSBzY2FsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhblVzZVVuYWdncmVnYXRlZERvbWFpbihmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVUeXBlOiBTY2FsZVR5cGUpOiB7dmFsaWQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZ30ge1xuICBpZiAoIWZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZmFsc2UsXG4gICAgICByZWFzb246IGxvZy5tZXNzYWdlLnVuYWdncmVnYXRlRG9tYWluSGFzTm9FZmZlY3RGb3JSYXdGaWVsZChmaWVsZERlZilcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFTSEFSRURfRE9NQUlOX09QX0lOREVYW2ZpZWxkRGVmLmFnZ3JlZ2F0ZV0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgcmVhc29uOiBsb2cubWVzc2FnZS51bmFnZ3JlZ2F0ZURvbWFpbldpdGhOb25TaGFyZWREb21haW5PcChmaWVsZERlZi5hZ2dyZWdhdGUpXG4gICAgfTtcbiAgfVxuXG4gIGlmIChmaWVsZERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgIGlmIChzY2FsZVR5cGUgPT09ICdsb2cnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWxpZDogZmFsc2UsXG4gICAgICAgIHJlYXNvbjogbG9nLm1lc3NhZ2UudW5hZ2dyZWdhdGVkRG9tYWluV2l0aExvZ1NjYWxlKGZpZWxkRGVmKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3ZhbGlkOiB0cnVlfTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBhcnJheSBvZiBkb21haW5zIHRvIGEgc2luZ2xlIFZlZ2Egc2NhbGUgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEb21haW5zKGRvbWFpbnM6IFZnTm9uVW5pb25Eb21haW5bXSk6IFZnRG9tYWluIHtcbiAgY29uc3QgdW5pcXVlRG9tYWlucyA9IHV0aWwudW5pcXVlKGRvbWFpbnMubWFwKGRvbWFpbiA9PiB7XG4gICAgLy8gaWdub3JlIHNvcnQgcHJvcGVydHkgd2hlbiBjb21wdXRpbmcgdGhlIHVuaXF1ZSBkb21haW5zXG4gICAgaWYgKGlzRGF0YVJlZkRvbWFpbihkb21haW4pKSB7XG4gICAgICBjb25zdCB7c29ydDogX3MsIC4uLmRvbWFpbldpdGhvdXRTb3J0fSA9IGRvbWFpbjtcbiAgICAgIHJldHVybiBkb21haW5XaXRob3V0U29ydDtcbiAgICB9XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfSksIHV0aWwuaGFzaCk7XG5cbiAgY29uc3Qgc29ydHM6IFZnU29ydEZpZWxkW10gPSB1dGlsLnVuaXF1ZShkb21haW5zLm1hcChkID0+IHtcbiAgICBpZiAoaXNEYXRhUmVmRG9tYWluKGQpKSB7XG4gICAgICBjb25zdCBzID0gZC5zb3J0O1xuICAgICAgaWYgKHMgIT09IHVuZGVmaW5lZCAmJiAhdXRpbC5pc0Jvb2xlYW4ocykpIHtcbiAgICAgICAgaWYgKHMub3AgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICAvLyBsZXQncyBtYWtlIHN1cmUgdGhhdCBpZiBvcCBpcyBjb3VudCwgd2UgZG9uJ3QgdXNlIGEgZmllbGRcbiAgICAgICAgICBkZWxldGUgcy5maWVsZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5vcmRlciA9PT0gJ2FzY2VuZGluZycpIHtcbiAgICAgICAgICAvLyBkcm9wIG9yZGVyOiBhc2NlbmRpbmcgYXMgaXQgaXMgdGhlIGRlZmF1bHRcbiAgICAgICAgICBkZWxldGUgcy5vcmRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0pLmZpbHRlcihzID0+IHMgIT09IHVuZGVmaW5lZCksIHV0aWwuaGFzaCk7XG5cbiAgaWYgKHVuaXF1ZURvbWFpbnMubGVuZ3RoID09PSAxKSB7XG4gICAgY29uc3QgZG9tYWluID0gZG9tYWluc1swXTtcbiAgICBpZiAoaXNEYXRhUmVmRG9tYWluKGRvbWFpbikgJiYgc29ydHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IHNvcnQgPSBzb3J0c1swXTtcbiAgICAgIGlmIChzb3J0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLk1PUkVfVEhBTl9PTkVfU09SVCk7XG4gICAgICAgIHNvcnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZG9tYWluLFxuICAgICAgICBzb3J0XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZG9tYWluO1xuICB9XG5cbiAgLy8gb25seSBrZWVwIHNpbXBsZSBzb3J0IHByb3BlcnRpZXMgdGhhdCB3b3JrIHdpdGggdW5pb25lZCBkb21haW5zXG4gIGNvbnN0IHNpbXBsZVNvcnRzID0gdXRpbC51bmlxdWUoc29ydHMubWFwKHMgPT4ge1xuICAgIGlmIChzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgaWYgKHMub3AgPT09ICdjb3VudCcpIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kb21haW5Tb3J0RHJvcHBlZChzKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pLCB1dGlsLmhhc2gpIGFzIFZnVW5pb25Tb3J0RmllbGRbXTtcblxuICBsZXQgc29ydDogVmdVbmlvblNvcnRGaWVsZCA9IHVuZGVmaW5lZDtcblxuICBpZiAoc2ltcGxlU29ydHMubGVuZ3RoID09PSAxKSB7XG4gICAgc29ydCA9IHNpbXBsZVNvcnRzWzBdO1xuICB9IGVsc2UgaWYgKHNpbXBsZVNvcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBsb2cud2Fybihsb2cubWVzc2FnZS5NT1JFX1RIQU5fT05FX1NPUlQpO1xuICAgIHNvcnQgPSB0cnVlO1xuICB9XG5cbiAgY29uc3QgYWxsRGF0YSA9IHV0aWwudW5pcXVlKGRvbWFpbnMubWFwKGQgPT4ge1xuICAgIGlmIChpc0RhdGFSZWZEb21haW4oZCkpIHtcbiAgICAgIHJldHVybiBkLmRhdGE7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9KSwgeCA9PiB4KTtcblxuICBpZiAoYWxsRGF0YS5sZW5ndGggPT09IDEgJiYgYWxsRGF0YVswXSAhPT0gbnVsbCkge1xuICAgIC8vIGNyZWF0ZSBhIHVuaW9uIGRvbWFpbiBvZiBkaWZmZXJlbnQgZmllbGRzIHdpdGggYSBzaW5nbGUgZGF0YSBzb3VyY2VcbiAgICBjb25zdCBkb21haW46IFZnRmllbGRSZWZVbmlvbkRvbWFpbiA9IHtcbiAgICAgIGRhdGE6IGFsbERhdGFbMF0sXG4gICAgICBmaWVsZHM6IHVuaXF1ZURvbWFpbnMubWFwKGQgPT4gKGQgYXMgVmdEYXRhUmVmKS5maWVsZCksXG4gICAgICAuLi4oc29ydCA/IHtzb3J0fSA6IHt9KVxuICAgIH07XG5cbiAgICByZXR1cm4gZG9tYWluO1xuICB9XG5cbiAgcmV0dXJuIHtmaWVsZHM6IHVuaXF1ZURvbWFpbnMsIC4uLihzb3J0ID8ge3NvcnR9IDoge30pfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmaWVsZCBpZiBhIHNjYWxlIHNpbmdsZSBmaWVsZC5cbiAqIFJldHVybiBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGRGcm9tRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBzdHJpbmcge1xuICBpZiAoaXNEYXRhUmVmRG9tYWluKGRvbWFpbikgJiYgaXNTdHJpbmcoZG9tYWluLmZpZWxkKSkge1xuICAgIHJldHVybiBkb21haW4uZmllbGQ7XG4gIH0gZWxzZSBpZiAoaXNEYXRhUmVmVW5pb25lZERvbWFpbihkb21haW4pKSB7XG4gICAgbGV0IGZpZWxkO1xuICAgIGZvciAoY29uc3Qgbm9uVW5pb25Eb21haW4gb2YgZG9tYWluLmZpZWxkcykge1xuICAgICAgaWYgKGlzRGF0YVJlZkRvbWFpbihub25VbmlvbkRvbWFpbikgJiYgaXNTdHJpbmcobm9uVW5pb25Eb21haW4uZmllbGQpKSB7XG4gICAgICAgIGlmICghZmllbGQpIHtcbiAgICAgICAgICBmaWVsZCA9IG5vblVuaW9uRG9tYWluLmZpZWxkO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkICE9PSBub25VbmlvbkRvbWFpbi5maWVsZCkge1xuICAgICAgICAgIGxvZy53YXJuKCdEZXRlY3RlZCBmYWNldGVkIGluZGVwZW5kZW50IHNjYWxlcyB0aGF0IHVuaW9uIGRvbWFpbiBvZiBtdWx0aXBsZSBmaWVsZHMgZnJvbSBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzLiAgV2Ugd2lsbCB1c2UgdGhlIGZpcnN0IGZpZWxkLiAgVGhlIHJlc3VsdCB2aWV3IHNpemUgbWF5IGJlIGluY29ycmVjdC4nKTtcbiAgICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbG9nLndhcm4oJ0RldGVjdGVkIGZhY2V0ZWQgaW5kZXBlbmRlbnQgc2NhbGVzIHRoYXQgdW5pb24gZG9tYWluIG9mIGlkZW50aWNhbCBmaWVsZHMgZnJvbSBkaWZmZXJlbnQgc291cmNlIGRldGVjdGVkLiAgV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGZpZWxkIGZyb20gYSBkaWZmZXJlbnQgZm9yayBvZiB0aGUgc2FtZSBkYXRhIHNvdXJjZS4gIEhvd2V2ZXIsIGlmIHRoaXMgaXMgbm90IGNhc2UsIHRoZSByZXN1bHQgdmlldyBzaXplIG1heWJlIGluY29ycmVjdC4nKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZFJlZlVuaW9uRG9tYWluKGRvbWFpbikpIHtcbiAgICBsb2cud2FybignRGV0ZWN0ZWQgZmFjZXRlZCBpbmRlcGVuZGVudCBzY2FsZXMgdGhhdCB1bmlvbiBkb21haW4gb2YgbXVsdGlwbGUgZmllbGRzIGZyb20gdGhlIHNhbWUgZGF0YSBzb3VyY2UuICBXZSB3aWxsIHVzZSB0aGUgZmlyc3QgZmllbGQuICBUaGUgcmVzdWx0IHZpZXcgc2l6ZSBtYXkgYmUgaW5jb3JyZWN0LicpO1xuICAgIGNvbnN0IGZpZWxkID0gZG9tYWluLmZpZWxkc1swXTtcbiAgICByZXR1cm4gaXNTdHJpbmcoZmllbGQpID8gZmllbGQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVEb21haW4obW9kZWw6IE1vZGVsLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwpIHtcbiAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdO1xuICBjb25zdCBkb21haW5zID0gc2NhbGVDb21wb25lbnQuZG9tYWlucy5tYXAoZG9tYWluID0+IHtcbiAgICAvLyBDb3JyZWN0IHJlZmVyZW5jZXMgdG8gZGF0YSBhcyB0aGUgb3JpZ2luYWwgZG9tYWluJ3MgZGF0YSB3YXMgZGV0ZXJtaW5lZFxuICAgIC8vIGluIHBhcnNlU2NhbGUsIHdoaWNoIGhhcHBlbnMgYmVmb3JlIHBhcnNlRGF0YS4gVGh1cyB0aGUgb3JpZ2luYWwgZGF0YVxuICAgIC8vIHJlZmVyZW5jZSBjYW4gYmUgaW5jb3JyZWN0LlxuXG4gICAgaWYgKGlzRGF0YVJlZkRvbWFpbihkb21haW4pKSB7XG4gICAgICBkb21haW4uZGF0YSA9IG1vZGVsLmxvb2t1cERhdGFTb3VyY2UoZG9tYWluLmRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gZG9tYWluO1xuICB9KTtcblxuICAvLyBkb21haW5zIGlzIGFuIGFycmF5IHRoYXQgaGFzIHRvIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHZlZ2EgZG9tYWluXG4gIHJldHVybiBtZXJnZURvbWFpbnMoZG9tYWlucyk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/scale/parse.d.ts b/build/src/compile/scale/parse.d.ts new file mode 100644 index 0000000000..3a1c753b06 --- /dev/null +++ b/build/src/compile/scale/parse.d.ts @@ -0,0 +1,3 @@ +import { Model } from '../model'; +export declare function parseScale(model: Model): void; +export declare function parseScaleCore(model: Model): void; diff --git a/build/src/compile/scale/parse.js b/build/src/compile/scale/parse.js new file mode 100644 index 0000000000..9c6d5e7b7f --- /dev/null +++ b/build/src/compile/scale/parse.js @@ -0,0 +1,129 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var channel_1 = require("../../channel"); +var fielddef_1 = require("../../fielddef"); +var mark_1 = require("../../mark"); +var scale_1 = require("../../scale"); +var type_1 = require("../../type"); +var util_1 = require("../../util"); +var model_1 = require("../model"); +var resolve_1 = require("../resolve"); +var split_1 = require("../split"); +var component_1 = require("./component"); +var domain_1 = require("./domain"); +var properties_1 = require("./properties"); +var range_1 = require("./range"); +var type_2 = require("./type"); +function parseScale(model) { + parseScaleCore(model); + domain_1.parseScaleDomain(model); + for (var _i = 0, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1 = scale_1.NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES; _i < NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1.length; _i++) { + var prop = NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1[_i]; + properties_1.parseScaleProperty(model, prop); + } + // range depends on zero + range_1.parseScaleRange(model); +} +exports.parseScale = parseScale; +function parseScaleCore(model) { + if (model_1.isUnitModel(model)) { + model.component.scales = parseUnitScaleCore(model); + } + else { + model.component.scales = parseNonUnitScaleCore(model); + } +} +exports.parseScaleCore = parseScaleCore; +/** + * Parse scales for all channels of a model. + */ +function parseUnitScaleCore(model) { + var encoding = model.encoding, config = model.config, mark = model.mark; + return channel_1.SCALE_CHANNELS.reduce(function (scaleComponents, channel) { + var fieldDef; + var specifiedScale = undefined; + var channelDef = encoding[channel]; + // Don't generate scale for shape of geoshape + if (fielddef_1.isFieldDef(channelDef) && mark === mark_1.GEOSHAPE && + channel === channel_1.SHAPE && channelDef.type === type_1.GEOJSON) { + return scaleComponents; + } + if (fielddef_1.isFieldDef(channelDef)) { + fieldDef = channelDef; + specifiedScale = channelDef.scale; + } + else if (fielddef_1.hasConditionalFieldDef(channelDef)) { + fieldDef = channelDef.condition; + specifiedScale = channelDef.condition['scale']; // We use ['scale'] since we know that channel here has scale for sure + } + else if (channel === channel_1.X) { + fieldDef = fielddef_1.getFieldDef(encoding.x2); + } + else if (channel === channel_1.Y) { + fieldDef = fielddef_1.getFieldDef(encoding.y2); + } + if (fieldDef && specifiedScale !== null && specifiedScale !== false) { + specifiedScale = specifiedScale || {}; + var specifiedScaleType = specifiedScale.type; + var sType = type_2.scaleType(specifiedScale.type, channel, fieldDef, mark, config.scale); + scaleComponents[channel] = new component_1.ScaleComponent(model.scaleName(channel + '', true), { value: sType, explicit: specifiedScaleType === sType }); + } + return scaleComponents; + }, {}); +} +var scaleTypeTieBreaker = split_1.tieBreakByComparing(function (st1, st2) { return (scale_1.scaleTypePrecedence(st1) - scale_1.scaleTypePrecedence(st2)); }); +function parseNonUnitScaleCore(model) { + var scaleComponents = model.component.scales = {}; + var scaleTypeWithExplicitIndex = {}; + var resolve = model.component.resolve; + var _loop_1 = function (child) { + parseScaleCore(child); + // Instead of always merging right away -- check if it is compatible to merge first! + util_1.keys(child.component.scales).forEach(function (channel) { + // if resolve is undefined, set default first + resolve.scale[channel] = resolve.scale[channel] || resolve_1.defaultScaleResolve(channel, model); + if (resolve.scale[channel] === 'shared') { + var explicitScaleType = scaleTypeWithExplicitIndex[channel]; + var childScaleType = child.component.scales[channel].getWithExplicit('type'); + if (explicitScaleType) { + if (scale_1.scaleCompatible(explicitScaleType.value, childScaleType.value)) { + // merge scale component if type are compatible + scaleTypeWithExplicitIndex[channel] = split_1.mergeValuesWithExplicit(explicitScaleType, childScaleType, 'type', 'scale', scaleTypeTieBreaker); + } + else { + // Otherwise, update conflicting channel to be independent + resolve.scale[channel] = 'independent'; + // Remove from the index so they don't get merged + delete scaleTypeWithExplicitIndex[channel]; + } + } + else { + scaleTypeWithExplicitIndex[channel] = childScaleType; + } + } + }); + }; + // Parse each child scale and determine if a particular channel can be merged. + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + // Merge each channel listed in the index + util_1.keys(scaleTypeWithExplicitIndex).forEach(function (channel) { + // Create new merged scale component + var name = model.scaleName(channel, true); + var typeWithExplicit = scaleTypeWithExplicitIndex[channel]; + scaleComponents[channel] = new component_1.ScaleComponent(name, typeWithExplicit); + // rename each child and mark them as merged + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childScale = child.component.scales[channel]; + if (childScale) { + child.renameScale(childScale.get('name'), name); + childScale.merged = true; + } + } + }); + return scaleComponents; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9wYXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHlDQUF3RTtBQUN4RSwyQ0FBeUY7QUFDekYsbUNBQW9DO0FBQ3BDLHFDQU1xQjtBQUNyQixtQ0FBbUM7QUFDbkMsbUNBQWdDO0FBRWhDLGtDQUE0QztBQUM1QyxzQ0FBK0M7QUFDL0Msa0NBQWdGO0FBRWhGLHlDQUFnRTtBQUNoRSxtQ0FBMEM7QUFDMUMsMkNBQWdEO0FBQ2hELGlDQUF3QztBQUN4QywrQkFBaUM7QUFFakMsb0JBQTJCLEtBQVk7SUFDckMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLHlCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLEtBQW1CLFVBQTJDLEVBQTNDLGdEQUFBLG1EQUEyQyxFQUEzQyx5REFBMkMsRUFBM0MsSUFBMkMsRUFBRTtRQUEzRCxJQUFNLElBQUksb0RBQUE7UUFDYiwrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDakM7SUFDRCx3QkFBd0I7SUFDeEIsdUJBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBUkQsZ0NBUUM7QUFFRCx3QkFBK0IsS0FBWTtJQUN6QyxJQUFJLG1CQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEQ7U0FBTTtRQUNMLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3ZEO0FBQ0gsQ0FBQztBQU5ELHdDQU1DO0FBRUQ7O0dBRUc7QUFDSCw0QkFBNEIsS0FBZ0I7SUFDbkMsSUFBQSx5QkFBUSxFQUFFLHFCQUFNLEVBQUUsaUJBQUksQ0FBVTtJQUV2QyxPQUFPLHdCQUFjLENBQUMsTUFBTSxDQUFDLFVBQUMsZUFBb0MsRUFBRSxPQUFxQjtRQUN2RixJQUFJLFFBQTBCLENBQUM7UUFDL0IsSUFBSSxjQUFjLEdBQWlCLFNBQVMsQ0FBQztRQUU3QyxJQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFckMsNkNBQTZDO1FBQzdDLElBQ0UscUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLEtBQUssZUFBUTtZQUMzQyxPQUFPLEtBQUssZUFBSyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssY0FBTyxFQUNoRDtZQUNBLE9BQU8sZUFBZSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxxQkFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzFCLFFBQVEsR0FBRyxVQUFVLENBQUM7WUFDdEIsY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7U0FDbkM7YUFBTSxJQUFJLGlDQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdDLFFBQVEsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDO1lBQ2hDLGNBQWMsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsc0VBQXNFO1NBQ3ZIO2FBQU0sSUFBSSxPQUFPLEtBQUssV0FBQyxFQUFFO1lBQ3hCLFFBQVEsR0FBRyxzQkFBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNyQzthQUFNLElBQUksT0FBTyxLQUFLLFdBQUMsRUFBRTtZQUN4QixRQUFRLEdBQUcsc0JBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDckM7UUFFRCxJQUFJLFFBQVEsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLGNBQWMsS0FBSyxLQUFLLEVBQUU7WUFDbkUsY0FBYyxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUM7WUFDdEMsSUFBTSxrQkFBa0IsR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQy9DLElBQU0sS0FBSyxHQUFHLGdCQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEYsZUFBZSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksMEJBQWMsQ0FDM0MsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUNuQyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixLQUFLLEtBQUssRUFBQyxDQUN2RCxDQUFDO1NBQ0g7UUFDRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDO0FBRUQsSUFBTSxtQkFBbUIsR0FBRywyQkFBbUIsQ0FDN0MsVUFBQyxHQUFjLEVBQUUsR0FBYyxJQUFLLE9BQUEsQ0FBQywyQkFBbUIsQ0FBQyxHQUFHLENBQUMsR0FBRywyQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFyRCxDQUFxRCxDQUMxRixDQUFDO0FBR0YsK0JBQStCLEtBQVk7SUFDekMsSUFBTSxlQUFlLEdBQXdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUV6RSxJQUFNLDBCQUEwQixHQUc1QixFQUFFLENBQUM7SUFDUCxJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQzs0QkFHN0IsS0FBSztRQUNkLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QixvRkFBb0Y7UUFDcEYsV0FBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsT0FBcUI7WUFDekQsNkNBQTZDO1lBQzdDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSw2QkFBbUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFdkYsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDdkMsSUFBTSxpQkFBaUIsR0FBRywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDOUQsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUUvRSxJQUFJLGlCQUFpQixFQUFFO29CQUNyQixJQUFJLHVCQUFlLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDbEUsK0NBQStDO3dCQUMvQywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsR0FBRywrQkFBdUIsQ0FDM0QsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLENBQ3hFLENBQUM7cUJBQ0g7eUJBQU07d0JBQ0wsMERBQTBEO3dCQUMxRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsQ0FBQzt3QkFDdkMsaURBQWlEO3dCQUNqRCxPQUFPLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO3FCQUM1QztpQkFDRjtxQkFBTTtvQkFDTCwwQkFBMEIsQ0FBQyxPQUFPLENBQUMsR0FBRyxjQUFjLENBQUM7aUJBQ3REO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUE5QkQsOEVBQThFO0lBQzlFLEtBQW9CLFVBQWMsRUFBZCxLQUFBLEtBQUssQ0FBQyxRQUFRLEVBQWQsY0FBYyxFQUFkLElBQWM7UUFBN0IsSUFBTSxLQUFLLFNBQUE7Z0JBQUwsS0FBSztLQTZCZjtJQUVELHlDQUF5QztJQUN6QyxXQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxPQUFxQjtRQUM3RCxvQ0FBb0M7UUFDcEMsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUMsSUFBTSxnQkFBZ0IsR0FBRywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RCxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsSUFBSSwwQkFBYyxDQUFDLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXRFLDRDQUE0QztRQUM1QyxLQUFvQixVQUFjLEVBQWQsS0FBQSxLQUFLLENBQUMsUUFBUSxFQUFkLGNBQWMsRUFBZCxJQUFjLEVBQUU7WUFBL0IsSUFBTSxLQUFLLFNBQUE7WUFDZCxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuRCxJQUFJLFVBQVUsRUFBRTtnQkFDZCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1NBQ0Y7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NDQUxFX0NIQU5ORUxTLCBTY2FsZUNoYW5uZWwsIFNIQVBFLCBYLCBZfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7RmllbGREZWYsIGdldEZpZWxkRGVmLCBoYXNDb25kaXRpb25hbEZpZWxkRGVmLCBpc0ZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0dFT1NIQVBFfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7XG4gIE5PTl9UWVBFX0RPTUFJTl9SQU5HRV9WRUdBX1NDQUxFX1BST1BFUlRJRVMsXG4gIFNjYWxlLFxuICBzY2FsZUNvbXBhdGlibGUsXG4gIFNjYWxlVHlwZSxcbiAgc2NhbGVUeXBlUHJlY2VkZW5jZSxcbn0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtHRU9KU09OfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2NhbGV9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7aXNVbml0TW9kZWwsIE1vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge2RlZmF1bHRTY2FsZVJlc29sdmV9IGZyb20gJy4uL3Jlc29sdmUnO1xuaW1wb3J0IHtFeHBsaWNpdCwgbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQsIHRpZUJyZWFrQnlDb21wYXJpbmd9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7U2NhbGVDb21wb25lbnQsIFNjYWxlQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7cGFyc2VTY2FsZURvbWFpbn0gZnJvbSAnLi9kb21haW4nO1xuaW1wb3J0IHtwYXJzZVNjYWxlUHJvcGVydHl9IGZyb20gJy4vcHJvcGVydGllcyc7XG5pbXBvcnQge3BhcnNlU2NhbGVSYW5nZX0gZnJvbSAnLi9yYW5nZSc7XG5pbXBvcnQge3NjYWxlVHlwZX0gZnJvbSAnLi90eXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NhbGUobW9kZWw6IE1vZGVsKSB7XG4gIHBhcnNlU2NhbGVDb3JlKG1vZGVsKTtcbiAgcGFyc2VTY2FsZURvbWFpbihtb2RlbCk7XG4gIGZvciAoY29uc3QgcHJvcCBvZiBOT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUSUVTKSB7XG4gICAgcGFyc2VTY2FsZVByb3BlcnR5KG1vZGVsLCBwcm9wKTtcbiAgfVxuICAvLyByYW5nZSBkZXBlbmRzIG9uIHplcm9cbiAgcGFyc2VTY2FsZVJhbmdlKG1vZGVsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NhbGVDb3JlKG1vZGVsOiBNb2RlbCkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgbW9kZWwuY29tcG9uZW50LnNjYWxlcyA9IHBhcnNlVW5pdFNjYWxlQ29yZShtb2RlbCk7XG4gIH0gZWxzZSB7XG4gICAgbW9kZWwuY29tcG9uZW50LnNjYWxlcyA9IHBhcnNlTm9uVW5pdFNjYWxlQ29yZShtb2RlbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBzY2FsZXMgZm9yIGFsbCBjaGFubmVscyBvZiBhIG1vZGVsLlxuICovXG5mdW5jdGlvbiBwYXJzZVVuaXRTY2FsZUNvcmUobW9kZWw6IFVuaXRNb2RlbCk6IFNjYWxlQ29tcG9uZW50SW5kZXgge1xuICBjb25zdCB7ZW5jb2RpbmcsIGNvbmZpZywgbWFya30gPSBtb2RlbDtcblxuICByZXR1cm4gU0NBTEVfQ0hBTk5FTFMucmVkdWNlKChzY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXgsIGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGxldCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPjtcbiAgICBsZXQgc3BlY2lmaWVkU2NhbGU6IFNjYWxlIHwgbnVsbCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcblxuICAgIC8vIERvbid0IGdlbmVyYXRlIHNjYWxlIGZvciBzaGFwZSBvZiBnZW9zaGFwZVxuICAgIGlmIChcbiAgICAgIGlzRmllbGREZWYoY2hhbm5lbERlZikgJiYgbWFyayA9PT0gR0VPU0hBUEUgJiZcbiAgICAgIGNoYW5uZWwgPT09IFNIQVBFICYmIGNoYW5uZWxEZWYudHlwZSA9PT0gR0VPSlNPTlxuICAgICkge1xuICAgICAgcmV0dXJuIHNjYWxlQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICBpZiAoaXNGaWVsZERlZihjaGFubmVsRGVmKSkge1xuICAgICAgZmllbGREZWYgPSBjaGFubmVsRGVmO1xuICAgICAgc3BlY2lmaWVkU2NhbGUgPSBjaGFubmVsRGVmLnNjYWxlO1xuICAgIH0gZWxzZSBpZiAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKSkge1xuICAgICAgZmllbGREZWYgPSBjaGFubmVsRGVmLmNvbmRpdGlvbjtcbiAgICAgIHNwZWNpZmllZFNjYWxlID0gY2hhbm5lbERlZi5jb25kaXRpb25bJ3NjYWxlJ107IC8vIFdlIHVzZSBbJ3NjYWxlJ10gc2luY2Ugd2Uga25vdyB0aGF0IGNoYW5uZWwgaGVyZSBoYXMgc2NhbGUgZm9yIHN1cmVcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWwgPT09IFgpIHtcbiAgICAgIGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmcueDIpO1xuICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PT0gWSkge1xuICAgICAgZmllbGREZWYgPSBnZXRGaWVsZERlZihlbmNvZGluZy55Mik7XG4gICAgfVxuXG4gICAgaWYgKGZpZWxkRGVmICYmIHNwZWNpZmllZFNjYWxlICE9PSBudWxsICYmIHNwZWNpZmllZFNjYWxlICE9PSBmYWxzZSkge1xuICAgICAgc3BlY2lmaWVkU2NhbGUgPSBzcGVjaWZpZWRTY2FsZSB8fCB7fTtcbiAgICAgIGNvbnN0IHNwZWNpZmllZFNjYWxlVHlwZSA9IHNwZWNpZmllZFNjYWxlLnR5cGU7XG4gICAgICBjb25zdCBzVHlwZSA9IHNjYWxlVHlwZShzcGVjaWZpZWRTY2FsZS50eXBlLCBjaGFubmVsLCBmaWVsZERlZiwgbWFyaywgY29uZmlnLnNjYWxlKTtcbiAgICAgIHNjYWxlQ29tcG9uZW50c1tjaGFubmVsXSA9IG5ldyBTY2FsZUNvbXBvbmVudChcbiAgICAgICAgbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwgKyAnJywgdHJ1ZSksXG4gICAgICAgIHt2YWx1ZTogc1R5cGUsIGV4cGxpY2l0OiBzcGVjaWZpZWRTY2FsZVR5cGUgPT09IHNUeXBlfVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNjYWxlQ29tcG9uZW50cztcbiAgfSwge30pO1xufVxuXG5jb25zdCBzY2FsZVR5cGVUaWVCcmVha2VyID0gdGllQnJlYWtCeUNvbXBhcmluZyhcbiAgKHN0MTogU2NhbGVUeXBlLCBzdDI6IFNjYWxlVHlwZSkgPT4gKHNjYWxlVHlwZVByZWNlZGVuY2Uoc3QxKSAtIHNjYWxlVHlwZVByZWNlZGVuY2Uoc3QyKSlcbik7XG5cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0U2NhbGVDb3JlKG1vZGVsOiBNb2RlbCkge1xuICBjb25zdCBzY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzID0ge307XG5cbiAgY29uc3Qgc2NhbGVUeXBlV2l0aEV4cGxpY2l0SW5kZXg6IHtcbiAgICAvLyBVc2luZyBNYXBwZWQgVHlwZSB0byBkZWNsYXJlIHR5cGUgKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2FkdmFuY2VkLXR5cGVzLmh0bWwjbWFwcGVkLXR5cGVzKVxuICAgIFtrIGluIFNjYWxlQ2hhbm5lbF0/OiBFeHBsaWNpdDxTY2FsZVR5cGU+XG4gIH0gPSB7fTtcbiAgY29uc3QgcmVzb2x2ZSA9IG1vZGVsLmNvbXBvbmVudC5yZXNvbHZlO1xuXG4gIC8vIFBhcnNlIGVhY2ggY2hpbGQgc2NhbGUgYW5kIGRldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgY2hhbm5lbCBjYW4gYmUgbWVyZ2VkLlxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgcGFyc2VTY2FsZUNvcmUoY2hpbGQpO1xuXG4gICAgLy8gSW5zdGVhZCBvZiBhbHdheXMgbWVyZ2luZyByaWdodCBhd2F5IC0tIGNoZWNrIGlmIGl0IGlzIGNvbXBhdGlibGUgdG8gbWVyZ2UgZmlyc3QhXG4gICAga2V5cyhjaGlsZC5jb21wb25lbnQuc2NhbGVzKS5mb3JFYWNoKChjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICAgIC8vIGlmIHJlc29sdmUgaXMgdW5kZWZpbmVkLCBzZXQgZGVmYXVsdCBmaXJzdFxuICAgICAgcmVzb2x2ZS5zY2FsZVtjaGFubmVsXSA9IHJlc29sdmUuc2NhbGVbY2hhbm5lbF0gfHwgZGVmYXVsdFNjYWxlUmVzb2x2ZShjaGFubmVsLCBtb2RlbCk7XG5cbiAgICAgIGlmIChyZXNvbHZlLnNjYWxlW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgICBjb25zdCBleHBsaWNpdFNjYWxlVHlwZSA9IHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4W2NoYW5uZWxdO1xuICAgICAgICBjb25zdCBjaGlsZFNjYWxlVHlwZSA9IGNoaWxkLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF0uZ2V0V2l0aEV4cGxpY2l0KCd0eXBlJyk7XG5cbiAgICAgICAgaWYgKGV4cGxpY2l0U2NhbGVUeXBlKSB7XG4gICAgICAgICAgaWYgKHNjYWxlQ29tcGF0aWJsZShleHBsaWNpdFNjYWxlVHlwZS52YWx1ZSwgY2hpbGRTY2FsZVR5cGUudmFsdWUpKSB7XG4gICAgICAgICAgICAvLyBtZXJnZSBzY2FsZSBjb21wb25lbnQgaWYgdHlwZSBhcmUgY29tcGF0aWJsZVxuICAgICAgICAgICAgc2NhbGVUeXBlV2l0aEV4cGxpY2l0SW5kZXhbY2hhbm5lbF0gPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ1NjYWxlLCBTY2FsZVR5cGU+KFxuICAgICAgICAgICAgICBleHBsaWNpdFNjYWxlVHlwZSwgY2hpbGRTY2FsZVR5cGUsICd0eXBlJywgJ3NjYWxlJywgc2NhbGVUeXBlVGllQnJlYWtlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB1cGRhdGUgY29uZmxpY3RpbmcgY2hhbm5lbCB0byBiZSBpbmRlcGVuZGVudFxuICAgICAgICAgICAgcmVzb2x2ZS5zY2FsZVtjaGFubmVsXSA9ICdpbmRlcGVuZGVudCc7XG4gICAgICAgICAgICAvLyBSZW1vdmUgZnJvbSB0aGUgaW5kZXggc28gdGhleSBkb24ndCBnZXQgbWVyZ2VkXG4gICAgICAgICAgICBkZWxldGUgc2NhbGVUeXBlV2l0aEV4cGxpY2l0SW5kZXhbY2hhbm5lbF07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4W2NoYW5uZWxdID0gY2hpbGRTY2FsZVR5cGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIE1lcmdlIGVhY2ggY2hhbm5lbCBsaXN0ZWQgaW4gdGhlIGluZGV4XG4gIGtleXMoc2NhbGVUeXBlV2l0aEV4cGxpY2l0SW5kZXgpLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIC8vIENyZWF0ZSBuZXcgbWVyZ2VkIHNjYWxlIGNvbXBvbmVudFxuICAgIGNvbnN0IG5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCwgdHJ1ZSk7XG4gICAgY29uc3QgdHlwZVdpdGhFeHBsaWNpdCA9IHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4W2NoYW5uZWxdO1xuICAgIHNjYWxlQ29tcG9uZW50c1tjaGFubmVsXSA9IG5ldyBTY2FsZUNvbXBvbmVudChuYW1lLCB0eXBlV2l0aEV4cGxpY2l0KTtcblxuICAgIC8vIHJlbmFtZSBlYWNoIGNoaWxkIGFuZCBtYXJrIHRoZW0gYXMgbWVyZ2VkXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgICAgY29uc3QgY2hpbGRTY2FsZSA9IGNoaWxkLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICBpZiAoY2hpbGRTY2FsZSkge1xuICAgICAgICBjaGlsZC5yZW5hbWVTY2FsZShjaGlsZFNjYWxlLmdldCgnbmFtZScpLCBuYW1lKTtcbiAgICAgICAgY2hpbGRTY2FsZS5tZXJnZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHNjYWxlQ29tcG9uZW50cztcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/scale/properties.d.ts b/build/src/compile/scale/properties.d.ts new file mode 100644 index 0000000000..5e8826c088 --- /dev/null +++ b/build/src/compile/scale/properties.d.ts @@ -0,0 +1,17 @@ +import { Channel } from '../../channel'; +import { Config } from '../../config'; +import { FieldDef, ScaleFieldDef } from '../../fielddef'; +import { BarConfig, MarkDef } from '../../mark'; +import { Domain, NiceTime, Scale, ScaleConfig, ScaleType } from '../../scale'; +import { EncodingSortField, SortOrder } from '../../sort'; +import { Model } from '../model'; +import { ScaleComponentProps } from './component'; +export declare function parseScaleProperty(model: Model, property: keyof (Scale | ScaleComponentProps)): void; +export declare function getDefaultValue(property: keyof Scale, channel: Channel, fieldDef: ScaleFieldDef, scaleType: ScaleType, scalePadding: number, scalePaddingInner: number, specifiedDomain: Scale['domain'], markDef: MarkDef, config: Config): any; +export declare function parseNonUnitScaleProperty(model: Model, property: keyof (Scale | ScaleComponentProps)): void; +export declare function nice(scaleType: ScaleType, channel: Channel, fieldDef: FieldDef): boolean | NiceTime; +export declare function padding(channel: Channel, scaleType: ScaleType, scaleConfig: ScaleConfig, fieldDef: FieldDef, markDef: MarkDef, barConfig: BarConfig): number; +export declare function paddingInner(paddingValue: number, channel: Channel, scaleConfig: ScaleConfig): number; +export declare function paddingOuter(paddingValue: number, channel: Channel, scaleType: ScaleType, paddingInnerValue: number, scaleConfig: ScaleConfig): number; +export declare function reverse(scaleType: ScaleType, sort: SortOrder | EncodingSortField | string[]): boolean; +export declare function zero(channel: Channel, fieldDef: FieldDef, specifiedScale: Domain, markDef: MarkDef): boolean; diff --git a/build/src/compile/scale/properties.js b/build/src/compile/scale/properties.js new file mode 100644 index 0000000000..02c9a7ee8b --- /dev/null +++ b/build/src/compile/scale/properties.js @@ -0,0 +1,215 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +var util = tslib_1.__importStar(require("../../util")); +var model_1 = require("../model"); +var split_1 = require("../split"); +var range_1 = require("./range"); +function parseScaleProperty(model, property) { + if (model_1.isUnitModel(model)) { + parseUnitScaleProperty(model, property); + } + else { + parseNonUnitScaleProperty(model, property); + } +} +exports.parseScaleProperty = parseScaleProperty; +function parseUnitScaleProperty(model, property) { + var localScaleComponents = model.component.scales; + util_1.keys(localScaleComponents).forEach(function (channel) { + var specifiedScale = model.specifiedScales[channel]; + var localScaleCmpt = localScaleComponents[channel]; + var mergedScaleCmpt = model.getScaleComponent(channel); + var fieldDef = model.fieldDef(channel); + var config = model.config; + var specifiedValue = specifiedScale[property]; + var sType = mergedScaleCmpt.get('type'); + var supportedByScaleType = scale_1.scaleTypeSupportProperty(sType, property); + var channelIncompatability = scale_1.channelScalePropertyIncompatability(channel, property); + if (specifiedValue !== undefined) { + // If there is a specified value, check if it is compatible with scale type and channel + if (!supportedByScaleType) { + log.warn(log.message.scalePropertyNotWorkWithScaleType(sType, property, channel)); + } + else if (channelIncompatability) { // channel + log.warn(channelIncompatability); + } + } + if (supportedByScaleType && channelIncompatability === undefined) { + if (specifiedValue !== undefined) { + // copyKeyFromObject ensure type safety + localScaleCmpt.copyKeyFromObject(property, specifiedScale); + } + else { + var value = getDefaultValue(property, channel, fieldDef, mergedScaleCmpt.get('type'), mergedScaleCmpt.get('padding'), mergedScaleCmpt.get('paddingInner'), specifiedScale.domain, model.markDef, config); + if (value !== undefined) { + localScaleCmpt.set(property, value, false); + } + } + } + }); +} +// Note: This method is used in Voyager. +function getDefaultValue(property, channel, fieldDef, scaleType, scalePadding, scalePaddingInner, specifiedDomain, markDef, config) { + var scaleConfig = config.scale; + // If we have default rule-base, determine default value first + switch (property) { + case 'nice': + return nice(scaleType, channel, fieldDef); + case 'padding': + return padding(channel, scaleType, scaleConfig, fieldDef, markDef, config.bar); + case 'paddingInner': + return paddingInner(scalePadding, channel, scaleConfig); + case 'paddingOuter': + return paddingOuter(scalePadding, channel, scaleType, scalePaddingInner, scaleConfig); + case 'reverse': + return reverse(scaleType, fieldDef.sort); + case 'zero': + return zero(channel, fieldDef, specifiedDomain, markDef); + } + // Otherwise, use scale config + return scaleConfig[property]; +} +exports.getDefaultValue = getDefaultValue; +function parseNonUnitScaleProperty(model, property) { + var localScaleComponents = model.component.scales; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (property === 'range') { + range_1.parseScaleRange(child); + } + else { + parseScaleProperty(child, property); + } + } + util_1.keys(localScaleComponents).forEach(function (channel) { + var valueWithExplicit; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childComponent = child.component.scales[channel]; + if (childComponent) { + var childValueWithExplicit = childComponent.getWithExplicit(property); + valueWithExplicit = split_1.mergeValuesWithExplicit(valueWithExplicit, childValueWithExplicit, property, 'scale', split_1.tieBreakByComparing(function (v1, v2) { + switch (property) { + case 'range': + // For range step, prefer larger step + if (v1.step && v2.step) { + return v1.step - v2.step; + } + return 0; + // TODO: precedence rule for other properties + } + return 0; + })); + } + } + localScaleComponents[channel].setWithExplicit(property, valueWithExplicit); + }); +} +exports.parseNonUnitScaleProperty = parseNonUnitScaleProperty; +function nice(scaleType, channel, fieldDef) { + if (fieldDef.bin || util.contains([scale_1.ScaleType.TIME, scale_1.ScaleType.UTC], scaleType)) { + return undefined; + } + return util.contains([channel_1.X, channel_1.Y], channel); // return true for quantitative X/Y unless binned +} +exports.nice = nice; +function padding(channel, scaleType, scaleConfig, fieldDef, markDef, barConfig) { + if (util.contains([channel_1.X, channel_1.Y], channel)) { + if (scale_1.isContinuousToContinuous(scaleType)) { + if (scaleConfig.continuousPadding !== undefined) { + return scaleConfig.continuousPadding; + } + var type = markDef.type, orient = markDef.orient; + if (type === 'bar' && !fieldDef.bin) { + if ((orient === 'vertical' && channel === 'x') || + (orient === 'horizontal' && channel === 'y')) { + return barConfig.continuousBandSize; + } + } + } + if (scaleType === scale_1.ScaleType.POINT) { + return scaleConfig.pointPadding; + } + } + return undefined; +} +exports.padding = padding; +function paddingInner(paddingValue, channel, scaleConfig) { + if (paddingValue !== undefined) { + // If user has already manually specified "padding", no need to add default paddingInner. + return undefined; + } + if (util.contains([channel_1.X, channel_1.Y], channel)) { + // Padding is only set for X and Y by default. + // Basically it doesn't make sense to add padding for color and size. + // paddingOuter would only be called if it's a band scale, just return the default for bandScale. + return scaleConfig.bandPaddingInner; + } + return undefined; +} +exports.paddingInner = paddingInner; +function paddingOuter(paddingValue, channel, scaleType, paddingInnerValue, scaleConfig) { + if (paddingValue !== undefined) { + // If user has already manually specified "padding", no need to add default paddingOuter. + return undefined; + } + if (util.contains([channel_1.X, channel_1.Y], channel)) { + // Padding is only set for X and Y by default. + // Basically it doesn't make sense to add padding for color and size. + if (scaleType === scale_1.ScaleType.BAND) { + if (scaleConfig.bandPaddingOuter !== undefined) { + return scaleConfig.bandPaddingOuter; + } + /* By default, paddingOuter is paddingInner / 2. The reason is that + size (width/height) = step * (cardinality - paddingInner + 2 * paddingOuter). + and we want the width/height to be integer by default. + Note that step (by default) and cardinality are integers.) */ + return paddingInnerValue / 2; + } + } + return undefined; +} +exports.paddingOuter = paddingOuter; +function reverse(scaleType, sort) { + if (scale_1.hasContinuousDomain(scaleType) && sort === 'descending') { + // For continuous domain scales, Vega does not support domain sort. + // Thus, we reverse range instead if sort is descending + return true; + } + return undefined; +} +exports.reverse = reverse; +function zero(channel, fieldDef, specifiedScale, markDef) { + // If users explicitly provide a domain range, we should not augment zero as that will be unexpected. + var hasCustomDomain = !!specifiedScale && specifiedScale !== 'unaggregated'; + if (hasCustomDomain) { + return false; + } + // If there is no custom domain, return true only for the following cases: + // 1) using quantitative field with size + // While this can be either ratio or interval fields, our assumption is that + // ratio are more common. + if (channel === 'size' && fieldDef.type === 'quantitative') { + return true; + } + // 2) non-binned, quantitative x-scale or y-scale + // (For binning, we should not include zero by default because binning are calculated without zero.) + if (!fieldDef.bin && util.contains([channel_1.X, channel_1.Y], channel)) { + var orient = markDef.orient, type = markDef.type; + if (util_1.contains(['bar', 'area', 'line', 'trail'], type)) { + if ((orient === 'horizontal' && channel === 'y') || + (orient === 'vertical' && channel === 'x')) { + return false; + } + } + return true; + } + return false; +} +exports.zero = zero; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL3Byb3BlcnRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQTBEO0FBRzFELHFEQUFpQztBQUVqQyxxQ0FBMEw7QUFFMUwsbUNBQTBDO0FBQzFDLHVEQUFtQztBQUVuQyxrQ0FBNEM7QUFDNUMsa0NBQWdGO0FBR2hGLGlDQUF3QztBQUV4Qyw0QkFBbUMsS0FBWSxFQUFFLFFBQTZDO0lBQzVGLElBQUksbUJBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0QixzQkFBc0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDekM7U0FBTTtRQUNMLHlCQUF5QixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztLQUM1QztBQUNILENBQUM7QUFORCxnREFNQztBQUVELGdDQUFnQyxLQUFnQixFQUFFLFFBQTZDO0lBQzdGLElBQU0sb0JBQW9CLEdBQXdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBRXpFLFdBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQXFCO1FBQ3ZELElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFNLGNBQWMsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFD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LENBQUM7S0FDYjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQWpDRCxvQkFpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5uZWwsIFNjYWxlQ2hhbm5lbCwgWCwgWX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7RmllbGREZWYsIFNjYWxlRmllbGREZWZ9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtCYXJDb25maWcsIE1hcmtEZWZ9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtjaGFubmVsU2NhbGVQcm9wZXJ0eUluY29tcGF0YWJpbGl0eSwgRG9tYWluLCBoYXNDb250aW51b3VzRG9tYWluLCBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXMsIE5pY2VUaW1lLCBTY2FsZSwgU2NhbGVDb25maWcsIFNjYWxlVHlwZSwgc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5fSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge0VuY29kaW5nU29ydEZpZWxkLCBTb3J0T3JkZXJ9IGZyb20gJy4uLy4uL3NvcnQnO1xuaW1wb3J0IHtjb250YWlucywga2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ1NjYWxlfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtFeHBsaWNpdCwgbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQsIHRpZUJyZWFrQnlDb21wYXJpbmd9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7U2NhbGVDb21wb25lbnQsIFNjYWxlQ29tcG9uZW50SW5kZXgsIFNjYWxlQ29tcG9uZW50UHJvcHN9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7cGFyc2VTY2FsZVJhbmdlfSBmcm9tICcuL3JhbmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2NhbGVQcm9wZXJ0eShtb2RlbDogTW9kZWwsIHByb3BlcnR5OiBrZXlvZiAoU2NhbGUgfCBTY2FsZUNvbXBvbmVudFByb3BzKSkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgcGFyc2VVbml0U2NhbGVQcm9wZXJ0eShtb2RlbCwgcHJvcGVydHkpO1xuICB9IGVsc2Uge1xuICAgIHBhcnNlTm9uVW5pdFNjYWxlUHJvcGVydHkobW9kZWwsIHByb3BlcnR5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRTY2FsZVByb3BlcnR5KG1vZGVsOiBVbml0TW9kZWwsIHByb3BlcnR5OiBrZXlvZiAoU2NhbGUgfCBTY2FsZUNvbXBvbmVudFByb3BzKSkge1xuICBjb25zdCBsb2NhbFNjYWxlQ29tcG9uZW50czogU2NhbGVDb21wb25lbnRJbmRleCA9IG1vZGVsLmNvbXBvbmVudC5zY2FsZXM7XG5cbiAga2V5cyhsb2NhbFNjYWxlQ29tcG9uZW50cykuZm9yRWFjaCgoY2hhbm5lbDogU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgY29uc3Qgc3BlY2lmaWVkU2NhbGUgPSBtb2RlbC5zcGVjaWZpZWRTY2FsZXNbY2hhbm5lbF07XG4gICAgY29uc3QgbG9jYWxTY2FsZUNtcHQgPSBsb2NhbFNjYWxlQ29tcG9uZW50c1tjaGFubmVsXTtcbiAgICBjb25zdCBtZXJnZWRTY2FsZUNtcHQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICAgIGNvbnN0IGNvbmZpZyA9IG1vZGVsLmNvbmZpZztcblxuICAgIGNvbnN0IHNwZWNpZmllZFZhbHVlID0gc3BlY2lmaWVkU2NhbGVbcHJvcGVydHldO1xuICAgIGNvbnN0IHNUeXBlID0gbWVyZ2VkU2NhbGVDbXB0LmdldCgndHlwZScpO1xuXG4gICAgY29uc3Qgc3VwcG9ydGVkQnlTY2FsZVR5cGUgPSBzY2FsZVR5cGVTdXBwb3J0UHJvcGVydHkoc1R5cGUsIHByb3BlcnR5KTtcbiAgICBjb25zdCBjaGFubmVsSW5jb21wYXRhYmlsaXR5ID0gY2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHkoY2hhbm5lbCwgcHJvcGVydHkpO1xuXG4gICAgaWYgKHNwZWNpZmllZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIHZhbHVlLCBjaGVjayBpZiBpdCBpcyBjb21wYXRpYmxlIHdpdGggc2NhbGUgdHlwZSBhbmQgY2hhbm5lbFxuICAgICAgaWYgKCFzdXBwb3J0ZWRCeVNjYWxlVHlwZSkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5zY2FsZVByb3BlcnR5Tm90V29ya1dpdGhTY2FsZVR5cGUoc1R5cGUsIHByb3BlcnR5LCBjaGFubmVsKSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxJbmNvbXBhdGFiaWxpdHkpIHsgLy8gY2hhbm5lbFxuICAgICAgICBsb2cud2FybihjaGFubmVsSW5jb21wYXRhYmlsaXR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN1cHBvcnRlZEJ5U2NhbGVUeXBlICYmIGNoYW5uZWxJbmNvbXBhdGFiaWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHNwZWNpZmllZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gY29weUtleUZyb21PYmplY3QgZW5zdXJlIHR5cGUgc2FmZXR5XG4gICAgICAgIGxvY2FsU2NhbGVDbXB0LmNvcHlLZXlGcm9tT2JqZWN0KHByb3BlcnR5LCBzcGVjaWZpZWRTY2FsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGdldERlZmF1bHRWYWx1ZShcbiAgICAgICAgICBwcm9wZXJ0eSwgY2hhbm5lbCwgZmllbGREZWYsXG4gICAgICAgICAgbWVyZ2VkU2NhbGVDbXB0LmdldCgndHlwZScpLFxuICAgICAgICAgIG1lcmdlZFNjYWxlQ21wdC5nZXQoJ3BhZGRpbmcnKSxcbiAgICAgICAgICBtZXJnZWRTY2FsZUNtcHQuZ2V0KCdwYWRkaW5nSW5uZXInKSxcbiAgICAgICAgICBzcGVjaWZpZWRTY2FsZS5kb21haW4sXG4gICAgICAgICAgbW9kZWwubWFya0RlZiwgY29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbG9jYWxTY2FsZUNtcHQuc2V0KHByb3BlcnR5LCB2YWx1ZSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gTm90ZTogVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBWb3lhZ2VyLlxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmF1bHRWYWx1ZShcbiAgcHJvcGVydHk6IGtleW9mIFNjYWxlLCBjaGFubmVsOiBDaGFubmVsLCBmaWVsZERlZjogU2NhbGVGaWVsZERlZjxzdHJpbmc+LFxuICBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgc2NhbGVQYWRkaW5nOiBudW1iZXIsIHNjYWxlUGFkZGluZ0lubmVyOiBudW1iZXIsXG4gIHNwZWNpZmllZERvbWFpbjogU2NhbGVbJ2RvbWFpbiddLCBtYXJrRGVmOiBNYXJrRGVmLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBzY2FsZUNvbmZpZyA9IGNvbmZpZy5zY2FsZTtcblxuICAvLyBJZiB3ZSBoYXZlIGRlZmF1bHQgcnVsZS1iYXNlLCBkZXRlcm1pbmUgZGVmYXVsdCB2YWx1ZSBmaXJzdFxuICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgY2FzZSAnbmljZSc6XG4gICAgICByZXR1cm4gbmljZShzY2FsZVR5cGUsIGNoYW5uZWwsIGZpZWxkRGVmKTtcbiAgICBjYXNlICdwYWRkaW5nJzpcbiAgICAgIHJldHVybiBwYWRkaW5nKGNoYW5uZWwsIHNjYWxlVHlwZSwgc2NhbGVDb25maWcsIGZpZWxkRGVmLCBtYXJrRGVmLCBjb25maWcuYmFyKTtcbiAgICBjYXNlICdwYWRkaW5nSW5uZXInOlxuICAgICAgcmV0dXJuIHBhZGRpbmdJbm5lcihzY2FsZVBhZGRpbmcsIGNoYW5uZWwsIHNjYWxlQ29uZmlnKTtcbiAgICBjYXNlICdwYWRkaW5nT3V0ZXInOlxuICAgICAgcmV0dXJuIHBhZGRpbmdPdXRlcihzY2FsZVBhZGRpbmcsIGNoYW5uZWwsIHNjYWxlVHlwZSwgc2NhbGVQYWRkaW5nSW5uZXIsIHNjYWxlQ29uZmlnKTtcbiAgICBjYXNlICdyZXZlcnNlJzpcbiAgICAgIHJldHVybiByZXZlcnNlKHNjYWxlVHlwZSwgZmllbGREZWYuc29ydCk7XG4gICAgY2FzZSAnemVybyc6XG4gICAgICByZXR1cm4gemVybyhjaGFubmVsLCBmaWVsZERlZiwgc3BlY2lmaWVkRG9tYWluLCBtYXJrRGVmKTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHVzZSBzY2FsZSBjb25maWdcbiAgcmV0dXJuIHNjYWxlQ29uZmlnW3Byb3BlcnR5XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm9uVW5pdFNjYWxlUHJvcGVydHkobW9kZWw6IE1vZGVsLCBwcm9wZXJ0eToga2V5b2YgKFNjYWxlIHwgU2NhbGVDb21wb25lbnRQcm9wcykpIHtcbiAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzO1xuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICBpZiAocHJvcGVydHkgPT09ICdyYW5nZScpIHtcbiAgICAgIHBhcnNlU2NhbGVSYW5nZShjaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlU2NhbGVQcm9wZXJ0eShjaGlsZCwgcHJvcGVydHkpO1xuICAgIH1cbiAgfVxuXG4gIGtleXMobG9jYWxTY2FsZUNvbXBvbmVudHMpLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGxldCB2YWx1ZVdpdGhFeHBsaWNpdDogRXhwbGljaXQ8YW55PjtcblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkQ29tcG9uZW50ID0gY2hpbGQuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcbiAgICAgIGlmIChjaGlsZENvbXBvbmVudCkge1xuICAgICAgICBjb25zdCBjaGlsZFZhbHVlV2l0aEV4cGxpY2l0ID0gY2hpbGRDb21wb25lbnQuZ2V0V2l0aEV4cGxpY2l0KHByb3BlcnR5KTtcbiAgICAgICAgdmFsdWVXaXRoRXhwbGljaXQgPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ1NjYWxlLCBhbnk+KFxuICAgICAgICAgIHZhbHVlV2l0aEV4cGxpY2l0LCBjaGlsZFZhbHVlV2l0aEV4cGxpY2l0LFxuICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICdzY2FsZScsXG4gICAgICAgICAgdGllQnJlYWtCeUNvbXBhcmluZzxWZ1NjYWxlLCBhbnk+KCh2MSwgdjIpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgY2FzZSAncmFuZ2UnOlxuICAgICAgICAgICAgICAgIC8vIEZvciByYW5nZSBzdGVwLCBwcmVmZXIgbGFyZ2VyIHN0ZXBcbiAgICAgICAgICAgICAgICBpZiAodjEuc3RlcCAmJiB2Mi5zdGVwKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gdjEuc3RlcCAtIHYyLnN0ZXA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAvLyBUT0RPOiBwcmVjZWRlbmNlIHJ1bGUgZm9yIG90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvY2FsU2NhbGVDb21wb25lbnRzW2NoYW5uZWxdLnNldFdpdGhFeHBsaWNpdChwcm9wZXJ0eSwgdmFsdWVXaXRoRXhwbGljaXQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5pY2Uoc2NhbGVUeXBlOiBTY2FsZVR5cGUsIGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+KTogYm9vbGVhbiB8IE5pY2VUaW1lIHtcbiAgaWYgKGZpZWxkRGVmLmJpbiB8fCB1dGlsLmNvbnRhaW5zKFtTY2FsZVR5cGUuVElNRSwgU2NhbGVUeXBlLlVUQ10sIHNjYWxlVHlwZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbnRhaW5zKFtYLCBZXSwgY2hhbm5lbCk7IC8vIHJldHVybiB0cnVlIGZvciBxdWFudGl0YXRpdmUgWC9ZIHVubGVzcyBiaW5uZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhZGRpbmcoY2hhbm5lbDogQ2hhbm5lbCwgc2NhbGVUeXBlOiBTY2FsZVR5cGUsIHNjYWxlQ29uZmlnOiBTY2FsZUNvbmZpZywgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIG1hcmtEZWY6IE1hcmtEZWYsIGJhckNvbmZpZzogQmFyQ29uZmlnKSB7XG4gIGlmICh1dGlsLmNvbnRhaW5zKFtYLCBZXSwgY2hhbm5lbCkpIHtcbiAgICBpZiAoaXNDb250aW51b3VzVG9Db250aW51b3VzKHNjYWxlVHlwZSkpIHtcbiAgICAgIGlmIChzY2FsZUNvbmZpZy5jb250aW51b3VzUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzY2FsZUNvbmZpZy5jb250aW51b3VzUGFkZGluZztcbiAgICAgIH1cblxuICAgICAgY29uc3Qge3R5cGUsIG9yaWVudH0gPSBtYXJrRGVmO1xuICAgICAgaWYgKHR5cGUgPT09ICdiYXInICYmICFmaWVsZERlZi5iaW4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChvcmllbnQgPT09ICd2ZXJ0aWNhbCcgJiYgY2hhbm5lbCA9PT0gJ3gnKSB8fFxuICAgICAgICAgIChvcmllbnQgPT09ICdob3Jpem9udGFsJyAmJiBjaGFubmVsID09PSAneScpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBiYXJDb25maWcuY29udGludW91c0JhbmRTaXplO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLlBPSU5UKSB7XG4gICAgICByZXR1cm4gc2NhbGVDb25maWcucG9pbnRQYWRkaW5nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkZGluZ0lubmVyKHBhZGRpbmdWYWx1ZTogbnVtYmVyLCBjaGFubmVsOiBDaGFubmVsLCBzY2FsZUNvbmZpZzogU2NhbGVDb25maWcpIHtcbiAgaWYgKHBhZGRpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gSWYgdXNlciBoYXMgYWxyZWFkeSBtYW51YWxseSBzcGVjaWZpZWQgXCJwYWRkaW5nXCIsIG5vIG5lZWQgdG8gYWRkIGRlZmF1bHQgcGFkZGluZ0lubmVyLlxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodXRpbC5jb250YWlucyhbWCwgWV0sIGNoYW5uZWwpKSB7XG4gICAgLy8gUGFkZGluZyBpcyBvbmx5IHNldCBmb3IgWCBhbmQgWSBieSBkZWZhdWx0LlxuICAgIC8vIEJhc2ljYWxseSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYWRkIHBhZGRpbmcgZm9yIGNvbG9yIGFuZCBzaXplLlxuXG4gICAgLy8gcGFkZGluZ091dGVyIHdvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGl0J3MgYSBiYW5kIHNjYWxlLCBqdXN0IHJldHVybiB0aGUgZGVmYXVsdCBmb3IgYmFuZFNjYWxlLlxuICAgIHJldHVybiBzY2FsZUNvbmZpZy5iYW5kUGFkZGluZ0lubmVyO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWRkaW5nT3V0ZXIocGFkZGluZ1ZhbHVlOiBudW1iZXIsIGNoYW5uZWw6IENoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlLCBwYWRkaW5nSW5uZXJWYWx1ZTogbnVtYmVyLCBzY2FsZUNvbmZpZzogU2NhbGVDb25maWcpIHtcbiAgaWYgKHBhZGRpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gSWYgdXNlciBoYXMgYWxyZWFkeSBtYW51YWxseSBzcGVjaWZpZWQgXCJwYWRkaW5nXCIsIG5vIG5lZWQgdG8gYWRkIGRlZmF1bHQgcGFkZGluZ091dGVyLlxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodXRpbC5jb250YWlucyhbWCwgWV0sIGNoYW5uZWwpKSB7XG4gICAgLy8gUGFkZGluZyBpcyBvbmx5IHNldCBmb3IgWCBhbmQgWSBieSBkZWZhdWx0LlxuICAgIC8vIEJhc2ljYWxseSBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYWRkIHBhZGRpbmcgZm9yIGNvbG9yIGFuZCBzaXplLlxuICAgIGlmIChzY2FsZVR5cGUgPT09IFNjYWxlVHlwZS5CQU5EKSB7XG4gICAgICBpZiAoc2NhbGVDb25maWcuYmFuZFBhZGRpbmdPdXRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzY2FsZUNvbmZpZy5iYW5kUGFkZGluZ091dGVyO1xuICAgICAgfVxuICAgICAgLyogQnkgZGVmYXVsdCwgcGFkZGluZ091dGVyIGlzIHBhZGRpbmdJbm5lciAvIDIuIFRoZSByZWFzb24gaXMgdGhhdFxuICAgICAgICAgIHNpemUgKHdpZHRoL2hlaWdodCkgPSBzdGVwICogKGNhcmRpbmFsaXR5IC0gcGFkZGluZ0lubmVyICsgMiAqIHBhZGRpbmdPdXRlcikuXG4gICAgICAgICAgYW5kIHdlIHdhbnQgdGhlIHdpZHRoL2hlaWdodCB0byBiZSBpbnRlZ2VyIGJ5IGRlZmF1bHQuXG4gICAgICAgICAgTm90ZSB0aGF0IHN0ZXAgKGJ5IGRlZmF1bHQpIGFuZCBjYXJkaW5hbGl0eSBhcmUgaW50ZWdlcnMuKSAqL1xuICAgICAgcmV0dXJuIHBhZGRpbmdJbm5lclZhbHVlIC8gMjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2Uoc2NhbGVUeXBlOiBTY2FsZVR5cGUsIHNvcnQ6IFNvcnRPcmRlciB8IEVuY29kaW5nU29ydEZpZWxkPHN0cmluZz4gfCBzdHJpbmdbXSkge1xuICBpZiAoaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpICYmIHNvcnQgPT09ICdkZXNjZW5kaW5nJykge1xuICAgIC8vIEZvciBjb250aW51b3VzIGRvbWFpbiBzY2FsZXMsIFZlZ2EgZG9lcyBub3Qgc3VwcG9ydCBkb21haW4gc29ydC5cbiAgICAvLyBUaHVzLCB3ZSByZXZlcnNlIHJhbmdlIGluc3RlYWQgaWYgc29ydCBpcyBkZXNjZW5kaW5nXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHplcm8oY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNwZWNpZmllZFNjYWxlOiBEb21haW4sIG1hcmtEZWY6IE1hcmtEZWYpIHtcblxuICAvLyBJZiB1c2VycyBleHBsaWNpdGx5IHByb3ZpZGUgYSBkb21haW4gcmFuZ2UsIHdlIHNob3VsZCBub3QgYXVnbWVudCB6ZXJvIGFzIHRoYXQgd2lsbCBiZSB1bmV4cGVjdGVkLlxuICBjb25zdCBoYXNDdXN0b21Eb21haW4gPSAhIXNwZWNpZmllZFNjYWxlICYmIHNwZWNpZmllZFNjYWxlICE9PSAndW5hZ2dyZWdhdGVkJztcbiAgaWYgKGhhc0N1c3RvbURvbWFpbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGlzIG5vIGN1c3RvbSBkb21haW4sIHJldHVybiB0cnVlIG9ubHkgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cbiAgLy8gMSkgdXNpbmcgcXVhbnRpdGF0aXZlIGZpZWxkIHdpdGggc2l6ZVxuICAvLyBXaGlsZSB0aGlzIGNhbiBiZSBlaXRoZXIgcmF0aW8gb3IgaW50ZXJ2YWwgZmllbGRzLCBvdXIgYXNzdW1wdGlvbiBpcyB0aGF0XG4gIC8vIHJhdGlvIGFyZSBtb3JlIGNvbW1vbi5cbiAgaWYgKGNoYW5uZWwgPT09ICdzaXplJyAmJiBmaWVsZERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gMikgbm9uLWJpbm5lZCwgcXVhbnRpdGF0aXZlIHgtc2NhbGUgb3IgeS1zY2FsZVxuICAvLyAoRm9yIGJpbm5pbmcsIHdlIHNob3VsZCBub3QgaW5jbHVkZSB6ZXJvIGJ5IGRlZmF1bHQgYmVjYXVzZSBiaW5uaW5nIGFyZSBjYWxjdWxhdGVkIHdpdGhvdXQgemVyby4pXG4gIGlmICghZmllbGREZWYuYmluICYmIHV0aWwuY29udGFpbnMoW1gsIFldLCBjaGFubmVsKSkge1xuICAgIGNvbnN0IHtvcmllbnQsIHR5cGV9ID0gbWFya0RlZjtcbiAgICBpZiAoY29udGFpbnMoWydiYXInLCAnYXJlYScsICdsaW5lJywgJ3RyYWlsJ10sIHR5cGUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvcmllbnQgPT09ICdob3Jpem9udGFsJyAmJiBjaGFubmVsID09PSAneScpIHx8XG4gICAgICAgIChvcmllbnQgPT09ICd2ZXJ0aWNhbCcgJiYgY2hhbm5lbCA9PT0gJ3gnKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/scale/range.d.ts b/build/src/compile/scale/range.d.ts new file mode 100644 index 0000000000..6f9c7c20d5 --- /dev/null +++ b/build/src/compile/scale/range.d.ts @@ -0,0 +1,22 @@ +import { Channel } from '../../channel'; +import { Config } from '../../config'; +import { Mark } from '../../mark'; +import { Range, Scale, ScaleType, Scheme } from '../../scale'; +import { Type } from '../../type'; +import { VgRange } from '../../vega.schema'; +import { Model } from '../model'; +import { Explicit } from '../split'; +export declare type RangeMixins = { + range: Range; +} | { + rangeStep: number; +} | { + scheme: Scheme; +}; +export declare const RANGE_PROPERTIES: (keyof Scale)[]; +export declare function parseScaleRange(model: Model): void; +/** + * Return mixins that includes one of the range properties (range, rangeStep, scheme). + */ +export declare function parseRangeForChannel(channel: Channel, scaleType: ScaleType, type: Type, specifiedScale: Scale, config: Config, zero: boolean, mark: Mark, sizeSpecified: boolean, sizeSignal: string, xyRangeSteps: number[]): Explicit; +export declare function defaultRange(channel: Channel, scaleType: ScaleType, type: Type, config: Config, zero: boolean, mark: Mark, sizeSignal: string, xyRangeSteps: number[], noRangeStep: boolean): VgRange; diff --git a/build/src/compile/scale/range.js b/build/src/compile/scale/range.js new file mode 100644 index 0000000000..e6de9dfce0 --- /dev/null +++ b/build/src/compile/scale/range.js @@ -0,0 +1,235 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var scale_2 = require("../../scale"); +var util = tslib_1.__importStar(require("../../util")); +var vega_schema_1 = require("../../vega.schema"); +var model_1 = require("../model"); +var split_1 = require("../split"); +var properties_1 = require("./properties"); +exports.RANGE_PROPERTIES = ['range', 'rangeStep', 'scheme']; +function parseScaleRange(model) { + if (model_1.isUnitModel(model)) { + parseUnitScaleRange(model); + } + else { + properties_1.parseNonUnitScaleProperty(model, 'range'); + } +} +exports.parseScaleRange = parseScaleRange; +function parseUnitScaleRange(model) { + var localScaleComponents = model.component.scales; + // use SCALE_CHANNELS instead of scales[channel] to ensure that x, y come first! + channel_1.SCALE_CHANNELS.forEach(function (channel) { + var localScaleCmpt = localScaleComponents[channel]; + if (!localScaleCmpt) { + return; + } + var mergedScaleCmpt = model.getScaleComponent(channel); + var specifiedScale = model.specifiedScales[channel]; + var fieldDef = model.fieldDef(channel); + // Read if there is a specified width/height + var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined; + var sizeSpecified = sizeType ? !!model.component.layoutSize.get(sizeType) : undefined; + var scaleType = mergedScaleCmpt.get('type'); + // if autosize is fit, size cannot be data driven + var rangeStep = util.contains(['point', 'band'], scaleType) || !!specifiedScale.rangeStep; + if (sizeType && model.fit && !sizeSpecified && rangeStep) { + log.warn(log.message.CANNOT_FIX_RANGE_STEP_WITH_FIT); + sizeSpecified = true; + } + var xyRangeSteps = getXYRangeStep(model); + var rangeWithExplicit = parseRangeForChannel(channel, scaleType, fieldDef.type, specifiedScale, model.config, localScaleCmpt.get('zero'), model.mark, sizeSpecified, model.getName(sizeType), xyRangeSteps); + localScaleCmpt.setWithExplicit('range', rangeWithExplicit); + }); +} +function getXYRangeStep(model) { + var xyRangeSteps = []; + var xScale = model.getScaleComponent('x'); + var xRange = xScale && xScale.get('range'); + if (xRange && vega_schema_1.isVgRangeStep(xRange) && vega_util_1.isNumber(xRange.step)) { + xyRangeSteps.push(xRange.step); + } + var yScale = model.getScaleComponent('y'); + var yRange = yScale && yScale.get('range'); + if (yRange && vega_schema_1.isVgRangeStep(yRange) && vega_util_1.isNumber(yRange.step)) { + xyRangeSteps.push(yRange.step); + } + return xyRangeSteps; +} +/** + * Return mixins that includes one of the range properties (range, rangeStep, scheme). + */ +function parseRangeForChannel(channel, scaleType, type, specifiedScale, config, zero, mark, sizeSpecified, sizeSignal, xyRangeSteps) { + var noRangeStep = sizeSpecified || specifiedScale.rangeStep === null; + // Check if any of the range properties is specified. + // If so, check if it is compatible and make sure that we only output one of the properties + for (var _i = 0, RANGE_PROPERTIES_1 = exports.RANGE_PROPERTIES; _i < RANGE_PROPERTIES_1.length; _i++) { + var property = RANGE_PROPERTIES_1[_i]; + if (specifiedScale[property] !== undefined) { + var supportedByScaleType = scale_1.scaleTypeSupportProperty(scaleType, property); + var channelIncompatability = scale_1.channelScalePropertyIncompatability(channel, property); + if (!supportedByScaleType) { + log.warn(log.message.scalePropertyNotWorkWithScaleType(scaleType, property, channel)); + } + else if (channelIncompatability) { // channel + log.warn(channelIncompatability); + } + else { + switch (property) { + case 'range': + return split_1.makeExplicit(specifiedScale[property]); + case 'scheme': + return split_1.makeExplicit(parseScheme(specifiedScale[property])); + case 'rangeStep': + var rangeStep = specifiedScale[property]; + if (rangeStep !== null) { + if (!sizeSpecified) { + return split_1.makeExplicit({ step: rangeStep }); + } + else { + // If top-level size is specified, we ignore specified rangeStep. + log.warn(log.message.rangeStepDropped(channel)); + } + } + } + } + } + } + return split_1.makeImplicit(defaultRange(channel, scaleType, type, config, zero, mark, sizeSignal, xyRangeSteps, noRangeStep)); +} +exports.parseRangeForChannel = parseRangeForChannel; +function parseScheme(scheme) { + if (scale_1.isExtendedScheme(scheme)) { + var r = { scheme: scheme.name }; + if (scheme.count) { + r.count = scheme.count; + } + if (scheme.extent) { + r.extent = scheme.extent; + } + return r; + } + return { scheme: scheme }; +} +function defaultRange(channel, scaleType, type, config, zero, mark, sizeSignal, xyRangeSteps, noRangeStep) { + switch (channel) { + case channel_1.X: + case channel_1.Y: + if (util.contains(['point', 'band'], scaleType) && !noRangeStep) { + if (channel === channel_1.X && mark === 'text') { + if (config.scale.textXRangeStep) { + return { step: config.scale.textXRangeStep }; + } + } + else { + if (config.scale.rangeStep) { + return { step: config.scale.rangeStep }; + } + } + } + // If range step is null, use zero to width or height. + // Note that these range signals are temporary + // as they can be merged and renamed. + // (We do not have the right size signal here since parseLayoutSize() happens after parseScale().) + // We will later replace these temporary names with + // the final name in assembleScaleRange() + if (channel === channel_1.Y && scale_2.hasContinuousDomain(scaleType)) { + // For y continuous scale, we have to start from the height as the bottom part has the max value. + return [{ signal: sizeSignal }, 0]; + } + else { + return [0, { signal: sizeSignal }]; + } + case channel_1.SIZE: + // TODO: support custom rangeMin, rangeMax + var rangeMin = sizeRangeMin(mark, zero, config); + var rangeMax = sizeRangeMax(mark, xyRangeSteps, config); + return [rangeMin, rangeMax]; + case channel_1.SHAPE: + return 'symbol'; + case channel_1.COLOR: + case channel_1.FILL: + case channel_1.STROKE: + if (scaleType === 'ordinal') { + // Only nominal data uses ordinal scale by default + return type === 'nominal' ? 'category' : 'ordinal'; + } + return mark === 'rect' || mark === 'geoshape' ? 'heatmap' : 'ramp'; + case channel_1.OPACITY: + // TODO: support custom rangeMin, rangeMax + return [config.scale.minOpacity, config.scale.maxOpacity]; + } + /* istanbul ignore next: should never reach here */ + throw new Error("Scale range undefined for channel " + channel); +} +exports.defaultRange = defaultRange; +function sizeRangeMin(mark, zero, config) { + if (zero) { + return 0; + } + switch (mark) { + case 'bar': + case 'tick': + return config.scale.minBandSize; + case 'line': + case 'trail': + case 'rule': + return config.scale.minStrokeWidth; + case 'text': + return config.scale.minFontSize; + case 'point': + case 'square': + case 'circle': + return config.scale.minSize; + } + /* istanbul ignore next: should never reach here */ + // sizeRangeMin not implemented for the mark + throw new Error(log.message.incompatibleChannel('size', mark)); +} +function sizeRangeMax(mark, xyRangeSteps, config) { + var scaleConfig = config.scale; + switch (mark) { + case 'bar': + case 'tick': + if (config.scale.maxBandSize !== undefined) { + return config.scale.maxBandSize; + } + return minXYRangeStep(xyRangeSteps, config.scale) - 1; + case 'line': + case 'trail': + case 'rule': + return config.scale.maxStrokeWidth; + case 'text': + return config.scale.maxFontSize; + case 'point': + case 'square': + case 'circle': + if (config.scale.maxSize) { + return config.scale.maxSize; + } + // FIXME this case totally should be refactored + var pointStep = minXYRangeStep(xyRangeSteps, scaleConfig); + return (pointStep - 2) * (pointStep - 2); + } + /* istanbul ignore next: should never reach here */ + // sizeRangeMax not implemented for the mark + throw new Error(log.message.incompatibleChannel('size', mark)); +} +/** + * @returns {number} Range step of x or y or minimum between the two if both are ordinal scale. + */ +function minXYRangeStep(xyRangeSteps, scaleConfig) { + if (xyRangeSteps.length > 0) { + return Math.min.apply(null, xyRangeSteps); + } + if (scaleConfig.rangeStep) { + return scaleConfig.rangeStep; + } + return 21; // FIXME: re-evaluate the default value here. +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBbUM7QUFFbkMseUNBQXFIO0FBRXJILHFEQUFpQztBQUVqQyxxQ0FTcUI7QUFDckIscUNBQWdEO0FBRWhELHVEQUFtQztBQUNuQyxpREFBbUU7QUFDbkUsa0NBQTRDO0FBQzVDLGtDQUE4RDtBQUc5RCwyQ0FBdUQ7QUFLMUMsUUFBQSxnQkFBZ0IsR0FBb0IsQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBR2xGLHlCQUFnQyxLQUFZO0lBQzFDLElBQUksbUJBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0QixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtTQUFNO1FBQ0wsc0NBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQU5ELDBDQU1DO0FBRUQsNkJBQTZCLEtBQWdCO0lBQzNDLElBQU0sb0JBQW9CLEdBQXdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBRXpFLGdGQUFnRjtJQUNoRix3QkFBYyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQXFCO1FBQzNDLElBQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDbkIsT0FBTztTQUNSO1FBQ0QsSUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBR3pELElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6Qyw0Q0FBNEM7UUFDNUMsSUFBTSxRQUFRLEdB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QUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxXQUFXLENBQUMsU0FBUyxFQUFFO1FBQ3pCLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQztLQUM5QjtJQUNELE9BQU8sRUFBRSxDQUFDLENBQUMsNkNBQTZDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzTnVtYmVyfSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0NoYW5uZWwsIENPTE9SLCBGSUxMLCBPUEFDSVRZLCBTQ0FMRV9DSEFOTkVMUywgU2NhbGVDaGFubmVsLCBTSEFQRSwgU0laRSwgU1RST0tFLCBYLCBZfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge01hcmt9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtcbiAgY2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHksXG4gIGlzRXh0ZW5kZWRTY2hlbWUsXG4gIFJhbmdlLFxuICBTY2FsZSxcbiAgU2NhbGVDb25maWcsXG4gIFNjYWxlVHlwZSxcbiAgc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5LFxuICBTY2hlbWUsXG59IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7aGFzQ29udGludW91c0RvbWFpbn0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtUeXBlfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFZnUmFuZ2UsIFZnU2NoZW1lfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtFeHBsaWNpdCwgbWFrZUV4cGxpY2l0LCBtYWtlSW1wbGljaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7U2NhbGVDb21wb25lbnRJbmRleH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtwYXJzZU5vblVuaXRTY2FsZVByb3BlcnR5fSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuXG5cbmV4cG9ydCB0eXBlIFJhbmdlTWl4aW5zID0ge3JhbmdlOiBSYW5nZX0gfCB7cmFuZ2VTdGVwOiBudW1iZXJ9IHwge3NjaGVtZTogU2NoZW1lfTtcblxuZXhwb3J0IGNvbnN0IFJBTkdFX1BST1BFUlRJRVM6IChrZXlvZiBTY2FsZSlbXSA9IFsncmFuZ2UnLCAncmFuZ2VTdGVwJywgJ3NjaGVtZSddO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYWxlUmFuZ2UobW9kZWw6IE1vZGVsKSB7XG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBwYXJzZVVuaXRTY2FsZVJhbmdlKG1vZGVsKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJzZU5vblVuaXRTY2FsZVByb3BlcnR5KG1vZGVsLCAncmFuZ2UnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRTY2FsZVJhbmdlKG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzO1xuXG4gIC8vIHVzZSBTQ0FMRV9DSEFOTkVMUyBpbnN0ZWFkIG9mIHNjYWxlc1tjaGFubmVsXSB0byBlbnN1cmUgdGhhdCB4LCB5IGNvbWUgZmlyc3QhXG4gIFNDQUxFX0NIQU5ORUxTLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGNvbnN0IGxvY2FsU2NhbGVDbXB0ID0gbG9jYWxTY2FsZUNvbXBvbmVudHNbY2hhbm5lbF07XG4gICAgaWYgKCFsb2NhbFNjYWxlQ21wdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXJnZWRTY2FsZUNtcHQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcblxuXG4gICAgY29uc3Qgc3BlY2lmaWVkU2NhbGUgPSBtb2RlbC5zcGVjaWZpZWRTY2FsZXNbY2hhbm5lbF07XG4gICAgY29uc3QgZmllbGREZWYgPSBtb2RlbC5maWVsZERlZihjaGFubmVsKTtcblxuICAgIC8vIFJlYWQgaWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgd2lkdGgvaGVpZ2h0XG4gICAgY29uc3Qgc2l6ZVR5cGUgPSBjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogY2hhbm5lbCA9PT0gJ3knID8gJ2hlaWdodCcgOiB1bmRlZmluZWQ7XG4gICAgbGV0IHNpemVTcGVjaWZpZWQgPSBzaXplVHlwZSA/ICEhbW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuZ2V0KHNpemVUeXBlKSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1lcmdlZFNjYWxlQ21wdC5nZXQoJ3R5cGUnKTtcblxuICAgIC8vIGlmIGF1dG9zaXplIGlzIGZpdCwgc2l6ZSBjYW5ub3QgYmUgZGF0YSBkcml2ZW5cbiAgICBjb25zdCByYW5nZVN0ZXAgPSB1dGlsLmNvbnRhaW5zKFsncG9pbnQnLCAnYmFuZCddLCBzY2FsZVR5cGUpIHx8ICEhc3BlY2lmaWVkU2NhbGUucmFuZ2VTdGVwO1xuICAgIGlmIChzaXplVHlwZSAmJiBtb2RlbC5maXQgJiYgIXNpemVTcGVjaWZpZWQgJiYgcmFuZ2VTdGVwKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5DQU5OT1RfRklYX1JBTkdFX1NURVBfV0lUSF9GSVQpO1xuICAgICAgc2l6ZVNwZWNpZmllZCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgeHlSYW5nZVN0ZXBzID0gZ2V0WFlSYW5nZVN0ZXAobW9kZWwpO1xuXG4gICAgY29uc3QgcmFuZ2VXaXRoRXhwbGljaXQgPSBwYXJzZVJhbmdlRm9yQ2hhbm5lbChcbiAgICAgIGNoYW5uZWwsIHNjYWxlVHlwZSwgZmllbGREZWYudHlwZSwgc3BlY2lmaWVkU2NhbGUsIG1vZGVsLmNvbmZpZyxcbiAgICAgIGxvY2FsU2NhbGVDbXB0LmdldCgnemVybycpLCBtb2RlbC5tYXJrLCBzaXplU3BlY2lmaWVkLCBtb2RlbC5nZXROYW1lKHNpemVUeXBlKSwgeHlSYW5nZVN0ZXBzXG4gICAgKTtcblxuICAgIGxvY2FsU2NhbGVDbXB0LnNldFdpdGhFeHBsaWNpdCgncmFuZ2UnLCByYW5nZVdpdGhFeHBsaWNpdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRYWVJhbmdlU3RlcChtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHh5UmFuZ2VTdGVwczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdCB4U2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgneCcpO1xuICBjb25zdCB4UmFuZ2UgPSB4U2NhbGUgJiYgeFNjYWxlLmdldCgncmFuZ2UnKTtcbiAgaWYgKHhSYW5nZSAmJiBpc1ZnUmFuZ2VTdGVwKHhSYW5nZSkgJiYgaXNOdW1iZXIoeFJhbmdlLnN0ZXApKSB7XG4gICAgeHlSYW5nZVN0ZXBzLnB1c2goeFJhbmdlLnN0ZXApO1xuICB9XG5cbiAgY29uc3QgeVNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3knKTtcbiAgY29uc3QgeVJhbmdlID0geVNjYWxlICYmIHlTY2FsZS5nZXQoJ3JhbmdlJyk7XG4gIGlmICh5UmFuZ2UgJiYgaXNWZ1JhbmdlU3RlcCh5UmFuZ2UpICYmIGlzTnVtYmVyKHlSYW5nZS5zdGVwKSkge1xuICAgIHh5UmFuZ2VTdGVwcy5wdXNoKHlSYW5nZS5zdGVwKTtcbiAgfVxuXG4gIHJldHVybiB4eVJhbmdlU3RlcHM7XG59XG5cbi8qKlxuICogUmV0dXJuIG1peGlucyB0aGF0IGluY2x1ZGVzIG9uZSBvZiB0aGUgcmFuZ2UgcHJvcGVydGllcyAocmFuZ2UsIHJhbmdlU3RlcCwgc2NoZW1lKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmFuZ2VGb3JDaGFubmVsKFxuICAgIGNoYW5uZWw6IENoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlLCB0eXBlOiBUeXBlLCBzcGVjaWZpZWRTY2FsZTogU2NhbGUsIGNvbmZpZzogQ29uZmlnLFxuICAgIHplcm86IGJvb2xlYW4sIG1hcms6IE1hcmssIHNpemVTcGVjaWZpZWQ6IGJvb2xlYW4sIHNpemVTaWduYWw6IHN0cmluZywgeHlSYW5nZVN0ZXBzOiBudW1iZXJbXVxuICApOiBFeHBsaWNpdDxWZ1JhbmdlPiB7XG5cbiAgY29uc3Qgbm9SYW5nZVN0ZXAgPSBzaXplU3BlY2lmaWVkIHx8IHNwZWNpZmllZFNjYWxlLnJhbmdlU3RlcCA9PT0gbnVsbDtcblxuICAvLyBDaGVjayBpZiBhbnkgb2YgdGhlIHJhbmdlIHByb3BlcnRpZXMgaXMgc3BlY2lmaWVkLlxuICAvLyBJZiBzbywgY2hlY2sgaWYgaXQgaXMgY29tcGF0aWJsZSBhbmQgbWFrZSBzdXJlIHRoYXQgd2Ugb25seSBvdXRwdXQgb25lIG9mIHRoZSBwcm9wZXJ0aWVzXG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgUkFOR0VfUFJPUEVSVElFUykge1xuICAgIGlmIChzcGVjaWZpZWRTY2FsZVtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3VwcG9ydGVkQnlTY2FsZVR5cGUgPSBzY2FsZVR5cGVTdXBwb3J0UHJvcGVydHkoc2NhbGVUeXBlLCBwcm9wZXJ0eSk7XG4gICAgICBjb25zdCBjaGFubmVsSW5jb21wYXRhYmlsaXR5ID0gY2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHkoY2hhbm5lbCwgcHJvcGVydHkpO1xuICAgICAgaWYgKCFzdXBwb3J0ZWRCeVNjYWxlVHlwZSkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5zY2FsZVByb3BlcnR5Tm90V29ya1dpdGhTY2FsZVR5cGUoc2NhbGVUeXBlLCBwcm9wZXJ0eSwgY2hhbm5lbCkpO1xuICAgICAgfSBlbHNlIGlmIChjaGFubmVsSW5jb21wYXRhYmlsaXR5KSB7IC8vIGNoYW5uZWxcbiAgICAgICAgbG9nLndhcm4oY2hhbm5lbEluY29tcGF0YWJpbGl0eSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgICAgICAgY2FzZSAncmFuZ2UnOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VFeHBsaWNpdChzcGVjaWZpZWRTY2FsZVtwcm9wZXJ0eV0pO1xuICAgICAgICAgIGNhc2UgJ3NjaGVtZSc6XG4gICAgICAgICAgICByZXR1cm4gbWFrZUV4cGxpY2l0KHBhcnNlU2NoZW1lKHNwZWNpZmllZFNjYWxlW3Byb3BlcnR5XSkpO1xuICAgICAgICAgIGNhc2UgJ3JhbmdlU3RlcCc6XG4gICAgICAgICAgICBjb25zdCByYW5nZVN0ZXAgPSBzcGVjaWZpZWRTY2FsZVtwcm9wZXJ0eV07XG4gICAgICAgICAgICBpZiAocmFuZ2VTdGVwICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGlmICghc2l6ZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYWtlRXhwbGljaXQoe3N0ZXA6IHJhbmdlU3RlcH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIElmIHRvcC1sZXZlbCBzaXplIGlzIHNwZWNpZmllZCwgd2UgaWdub3JlIHNwZWNpZmllZCByYW5nZVN0ZXAuXG4gICAgICAgICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UucmFuZ2VTdGVwRHJvcHBlZChjaGFubmVsKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWFrZUltcGxpY2l0KFxuICAgIGRlZmF1bHRSYW5nZShcbiAgICAgIGNoYW5uZWwsIHNjYWxlVHlwZSwgdHlwZSwgY29uZmlnLFxuICAgICAgemVybywgbWFyaywgc2l6ZVNpZ25hbCwgeHlSYW5nZVN0ZXBzLCBub1JhbmdlU3RlcFxuICAgIClcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTY2hlbWUoc2NoZW1lOiBTY2hlbWUpIHtcbiAgaWYgKGlzRXh0ZW5kZWRTY2hlbWUoc2NoZW1lKSkge1xuICAgIGNvbnN0IHI6IFZnU2NoZW1lID0ge3NjaGVtZTogc2NoZW1lLm5hbWV9O1xuICAgIGlmIChzY2hlbWUuY291bnQpIHtcbiAgICAgIHIuY291bnQgPSBzY2hlbWUuY291bnQ7XG4gICAgfVxuICAgIGlmIChzY2hlbWUuZXh0ZW50KSB7XG4gICAgICByLmV4dGVudCA9IHNjaGVtZS5leHRlbnQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG4gIHJldHVybiB7c2NoZW1lOiBzY2hlbWV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFJhbmdlKFxuICBjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgdHlwZTogVHlwZSwgY29uZmlnOiBDb25maWcsIHplcm86IGJvb2xlYW4sIG1hcms6IE1hcmssXG4gIHNpemVTaWduYWw6IHN0cmluZywgeHlSYW5nZVN0ZXBzOiBudW1iZXJbXSwgbm9SYW5nZVN0ZXA6IGJvb2xlYW5cbik6IFZnUmFuZ2Uge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlIFg6XG4gICAgY2FzZSBZOlxuICAgICAgaWYgKHV0aWwuY29udGFpbnMoWydwb2ludCcsICdiYW5kJ10sIHNjYWxlVHlwZSkgJiYgIW5vUmFuZ2VTdGVwKSB7XG4gICAgICAgIGlmIChjaGFubmVsID09PSBYICYmIG1hcmsgPT09ICd0ZXh0Jykge1xuICAgICAgICAgIGlmIChjb25maWcuc2NhbGUudGV4dFhSYW5nZVN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiB7c3RlcDogY29uZmlnLnNjYWxlLnRleHRYUmFuZ2VTdGVwfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXApIHtcbiAgICAgICAgICAgIHJldHVybiB7c3RlcDogY29uZmlnLnNjYWxlLnJhbmdlU3RlcH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHJhbmdlIHN0ZXAgaXMgbnVsbCwgdXNlIHplcm8gdG8gd2lkdGggb3IgaGVpZ2h0LlxuICAgICAgLy8gTm90ZSB0aGF0IHRoZXNlIHJhbmdlIHNpZ25hbHMgYXJlIHRlbXBvcmFyeVxuICAgICAgLy8gYXMgdGhleSBjYW4gYmUgbWVyZ2VkIGFuZCByZW5hbWVkLlxuICAgICAgLy8gKFdlIGRvIG5vdCBoYXZlIHRoZSByaWdodCBzaXplIHNpZ25hbCBoZXJlIHNpbmNlIHBhcnNlTGF5b3V0U2l6ZSgpIGhhcHBlbnMgYWZ0ZXIgcGFyc2VTY2FsZSgpLilcbiAgICAgIC8vIFdlIHdpbGwgbGF0ZXIgcmVwbGFjZSB0aGVzZSB0ZW1wb3JhcnkgbmFtZXMgd2l0aFxuICAgICAgLy8gdGhlIGZpbmFsIG5hbWUgaW4gYXNzZW1ibGVTY2FsZVJhbmdlKClcblxuICAgICAgaWYgKGNoYW5uZWwgPT09IFkgJiYgaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgICAgIC8vIEZvciB5IGNvbnRpbnVvdXMgc2NhbGUsIHdlIGhhdmUgdG8gc3RhcnQgZnJvbSB0aGUgaGVpZ2h0IGFzIHRoZSBib3R0b20gcGFydCBoYXMgdGhlIG1heCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIFt7c2lnbmFsOiBzaXplU2lnbmFsfSwgMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzAsIHtzaWduYWw6IHNpemVTaWduYWx9XTtcbiAgICAgIH1cbiAgICBjYXNlIFNJWkU6XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IGN1c3RvbSByYW5nZU1pbiwgcmFuZ2VNYXhcbiAgICAgIGNvbnN0IHJhbmdlTWluID0gc2l6ZVJhbmdlTWluKG1hcmssIHplcm8sIGNvbmZpZyk7XG4gICAgICBjb25zdCByYW5nZU1heCA9IHNpemVSYW5nZU1heChtYXJrLCB4eVJhbmdlU3RlcHMsIGNvbmZpZyk7XG4gICAgICByZXR1cm4gW3JhbmdlTWluLCByYW5nZU1heF07XG4gICAgY2FzZSBTSEFQRTpcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICBjYXNlIENPTE9SOlxuICAgIGNhc2UgRklMTDpcbiAgICBjYXNlIFNUUk9LRTpcbiAgICAgIGlmIChzY2FsZVR5cGUgPT09ICdvcmRpbmFsJykge1xuICAgICAgICAvLyBPbmx5IG5vbWluYWwgZGF0YSB1c2VzIG9yZGluYWwgc2NhbGUgYnkgZGVmYXVsdFxuICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ25vbWluYWwnID8gJ2NhdGVnb3J5JyA6ICdvcmRpbmFsJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXJrID09PSAncmVjdCcgfHwgbWFyayA9PT0gJ2dlb3NoYXBlJyA/ICdoZWF0bWFwJyA6ICdyYW1wJztcbiAgICBjYXNlIE9QQUNJVFk6XG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IGN1c3RvbSByYW5nZU1pbiwgcmFuZ2VNYXhcbiAgICAgIHJldHVybiBbY29uZmlnLnNjYWxlLm1pbk9wYWNpdHksIGNvbmZpZy5zY2FsZS5tYXhPcGFjaXR5XTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgdGhyb3cgbmV3IEVycm9yKGBTY2FsZSByYW5nZSB1bmRlZmluZWQgZm9yIGNoYW5uZWwgJHtjaGFubmVsfWApO1xufVxuXG5mdW5jdGlvbiBzaXplUmFuZ2VNaW4obWFyazogTWFyaywgemVybzogYm9vbGVhbiwgY29uZmlnOiBDb25maWcpIHtcbiAgaWYgKHplcm8pIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBzd2l0Y2ggKG1hcmspIHtcbiAgICBjYXNlICdiYXInOlxuICAgIGNhc2UgJ3RpY2snOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5taW5CYW5kU2l6ZTtcbiAgICBjYXNlICdsaW5lJzpcbiAgICBjYXNlICd0cmFpbCc6XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gY29uZmlnLnNjYWxlLm1pblN0cm9rZVdpZHRoO1xuICAgIGNhc2UgJ3RleHQnOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5taW5Gb250U2l6ZTtcbiAgICBjYXNlICdwb2ludCc6XG4gICAgY2FzZSAnc3F1YXJlJzpcbiAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5taW5TaXplO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSAqL1xuICAvLyBzaXplUmFuZ2VNaW4gbm90IGltcGxlbWVudGVkIGZvciB0aGUgbWFya1xuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW5jb21wYXRpYmxlQ2hhbm5lbCgnc2l6ZScsIG1hcmspKTtcbn1cblxuZnVuY3Rpb24gc2l6ZVJhbmdlTWF4KG1hcms6IE1hcmssIHh5UmFuZ2VTdGVwczogbnVtYmVyW10sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IHNjYWxlQ29uZmlnID0gY29uZmlnLnNjYWxlO1xuICBzd2l0Y2ggKG1hcmspIHtcbiAgICBjYXNlICdiYXInOlxuICAgIGNhc2UgJ3RpY2snOlxuICAgICAgaWYgKGNvbmZpZy5zY2FsZS5tYXhCYW5kU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWF4QmFuZFNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWluWFlSYW5nZVN0ZXAoeHlSYW5nZVN0ZXBzLCBjb25maWcuc2NhbGUpIC0gMTtcbiAgICBjYXNlICdsaW5lJzpcbiAgICBjYXNlICd0cmFpbCc6XG4gICAgY2FzZSAncnVsZSc6XG4gICAgICByZXR1cm4gY29uZmlnLnNjYWxlLm1heFN0cm9rZVdpZHRoO1xuICAgIGNhc2UgJ3RleHQnOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5tYXhGb250U2l6ZTtcbiAgICBjYXNlICdwb2ludCc6XG4gICAgY2FzZSAnc3F1YXJlJzpcbiAgICBjYXNlICdjaXJjbGUnOlxuICAgICAgaWYgKGNvbmZpZy5zY2FsZS5tYXhTaXplKSB7XG4gICAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWF4U2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gRklYTUUgdGhpcyBjYXNlIHRvdGFsbHkgc2hvdWxkIGJlIHJlZmFjdG9yZWRcbiAgICAgIGNvbnN0IHBvaW50U3RlcCA9IG1pblhZUmFuZ2VTdGVwKHh5UmFuZ2VTdGVwcywgc2NhbGVDb25maWcpO1xuICAgICAgcmV0dXJuIChwb2ludFN0ZXAgLSAyKSAqIChwb2ludFN0ZXAgLSAyKTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgLy8gc2l6ZVJhbmdlTWF4IG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhlIG1hcmtcbiAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLmluY29tcGF0aWJsZUNoYW5uZWwoJ3NpemUnLCBtYXJrKSk7XG59XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn0gUmFuZ2Ugc3RlcCBvZiB4IG9yIHkgb3IgbWluaW11bSBiZXR3ZWVuIHRoZSB0d28gaWYgYm90aCBhcmUgb3JkaW5hbCBzY2FsZS5cbiAqL1xuZnVuY3Rpb24gbWluWFlSYW5nZVN0ZXAoeHlSYW5nZVN0ZXBzOiBudW1iZXJbXSwgc2NhbGVDb25maWc6IFNjYWxlQ29uZmlnKTogbnVtYmVyIHtcbiAgaWYgKHh5UmFuZ2VTdGVwcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KG51bGwsIHh5UmFuZ2VTdGVwcyk7XG4gIH1cbiAgaWYgKHNjYWxlQ29uZmlnLnJhbmdlU3RlcCkge1xuICAgIHJldHVybiBzY2FsZUNvbmZpZy5yYW5nZVN0ZXA7XG4gIH1cbiAgcmV0dXJuIDIxOyAvLyBGSVhNRTogcmUtZXZhbHVhdGUgdGhlIGRlZmF1bHQgdmFsdWUgaGVyZS5cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/scale/type.d.ts b/build/src/compile/scale/type.d.ts new file mode 100644 index 0000000000..b6e317d975 --- /dev/null +++ b/build/src/compile/scale/type.d.ts @@ -0,0 +1,10 @@ +import { Channel } from '../../channel'; +import { FieldDef } from '../../fielddef'; +import { Mark } from '../../mark'; +import { ScaleConfig, ScaleType } from '../../scale'; +export declare type RangeType = 'continuous' | 'discrete' | 'flexible' | undefined; +/** + * Determine if there is a specified scale type and if it is appropriate, + * or determine default type if type is unspecified or inappropriate. + */ +export declare function scaleType(specifiedType: ScaleType, channel: Channel, fieldDef: FieldDef, mark: Mark, scaleConfig: ScaleConfig): ScaleType; diff --git a/build/src/compile/scale/type.js b/build/src/compile/scale/type.js new file mode 100644 index 0000000000..50ce691914 --- /dev/null +++ b/build/src/compile/scale/type.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../../channel"); +var log = tslib_1.__importStar(require("../../log")); +var scale_1 = require("../../scale"); +var util = tslib_1.__importStar(require("../../util")); +/** + * Determine if there is a specified scale type and if it is appropriate, + * or determine default type if type is unspecified or inappropriate. + */ +// NOTE: CompassQL uses this method. +function scaleType(specifiedType, channel, fieldDef, mark, scaleConfig) { + var defaultScaleType = defaultType(channel, fieldDef, mark, scaleConfig); + if (!channel_1.isScaleChannel(channel)) { + // There is no scale for these channels + return null; + } + if (specifiedType !== undefined) { + // Check if explicitly specified scale type is supported by the channel + if (!scale_1.channelSupportScaleType(channel, specifiedType)) { + log.warn(log.message.scaleTypeNotWorkWithChannel(channel, specifiedType, defaultScaleType)); + return defaultScaleType; + } + // Check if explicitly specified scale type is supported by the data type + if (!scale_1.scaleTypeSupportDataType(specifiedType, fieldDef.type, fieldDef.bin)) { + log.warn(log.message.scaleTypeNotWorkWithFieldDef(specifiedType, defaultScaleType)); + return defaultScaleType; + } + return specifiedType; + } + return defaultScaleType; +} +exports.scaleType = scaleType; +/** + * Determine appropriate default scale type. + */ +// NOTE: Voyager uses this method. +function defaultType(channel, fieldDef, mark, scaleConfig) { + switch (fieldDef.type) { + case 'nominal': + case 'ordinal': + if (channel_1.isColorChannel(channel) || channel_1.rangeType(channel) === 'discrete') { + if (channel === 'shape' && fieldDef.type === 'ordinal') { + log.warn(log.message.discreteChannelCannotEncode(channel, 'ordinal')); + } + return 'ordinal'; + } + if (util.contains(['x', 'y'], channel)) { + if (util.contains(['rect', 'bar', 'rule'], mark)) { + // The rect/bar mark should fit into a band. + // For rule, using band scale to make rule align with axis ticks better https://github.com/vega/vega-lite/issues/3429 + return 'band'; + } + if (mark === 'bar') { + return 'band'; + } + } + // Otherwise, use ordinal point scale so we can easily get center positions of the marks. + return 'point'; + case 'temporal': + if (channel_1.isColorChannel(channel)) { + return 'sequential'; + } + else if (channel_1.rangeType(channel) === 'discrete') { + log.warn(log.message.discreteChannelCannotEncode(channel, 'temporal')); + // TODO: consider using quantize (equivalent to binning) once we have it + return 'ordinal'; + } + return 'time'; + case 'quantitative': + if (channel_1.isColorChannel(channel)) { + if (fieldDef.bin) { + return 'bin-ordinal'; + } + // Use `sequential` as the default color scale for continuous data + // since it supports both array range and scheme range. + return 'sequential'; + } + else if (channel_1.rangeType(channel) === 'discrete') { + log.warn(log.message.discreteChannelCannotEncode(channel, 'quantitative')); + // TODO: consider using quantize (equivalent to binning) once we have it + return 'ordinal'; + } + // x and y use a linear scale because selections don't work with bin scales. + // Binned scales apply discretization but pan/zoom apply transformations to a [min, max] extent domain. + if (fieldDef.bin && channel !== 'x' && channel !== 'y') { + return 'bin-linear'; + } + return 'linear'; + case 'latitude': + case 'longitude': + case 'geojson': + return undefined; + } + /* istanbul ignore next: should never reach this */ + throw new Error(log.message.invalidFieldType(fieldDef.type)); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL3R5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQWlGO0FBRWpGLHFEQUFpQztBQUVqQyxxQ0FBc0c7QUFDdEcsdURBQW1DO0FBSW5DOzs7R0FHRztBQUNILG9DQUFvQztBQUNwQyxtQkFDRSxhQUF3QixFQUFFLE9BQWdCLEVBQUUsUUFBMEIsRUFDdEUsSUFBVSxFQUFFLFdBQXdCO0lBR3BDLElBQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTNFLElBQUksQ0FBQyx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVCLHVDQUF1QztRQUN2QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQy9CLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsK0JBQXVCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUM1RixPQUFPLGdCQUFnQixDQUFDO1NBQ3pCO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyxnQ0FBd0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDcEYsT0FBTyxnQkFBZ0IsQ0FBQztTQUN6QjtRQUVELE9BQU8sYUFBYSxDQUFDO0tBQ3RCO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDO0FBNUJELDhCQTRCQztBQUVEOztHQUVHO0FBQ0gsa0NBQWtDO0FBQ2xDLHFCQUNFLE9BQWdCLEVBQUUsUUFBMEIsRUFBRSxJQUFVLEVBQUUsV0FBd0I7SUFFbEYsUUFBUSxRQUFRLENBQUMsSUFBSSxFQUFFO1FBQ3JCLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1osSUFBSSx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxJQUFHLG1CQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxFQUFFO2dCQUMvRCxJQUFJLE9BQU8sS0FBSyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7b0JBQ3RELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztpQkFDdkU7Z0JBQ0QsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQ2hELDRDQUE0QztvQkFDNUMscUhBQXFIO29CQUNySCxPQUFPLE1BQU0sQ0FBQztpQkFDZjtnQkFDRCxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7b0JBQ2xCLE9BQU8sTUFBTSxDQUFDO2lCQUNmO2FBQ0Y7WUFDRCx5RkFBeUY7WUFDekYsT0FBTyxPQUFPLENBQUM7UUFFakIsS0FBSyxVQUFVO1lBQ2IsSUFBSSx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQixPQUFPLFlBQVksQ0FBQzthQUNyQjtpQkFBTSxJQUFJLG1CQUFTLENBQUMsT0FBTyxDQUFDLEtBQUssVUFBVSxFQUFFO2dCQUM1QyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZFLHdFQUF3RTtnQkFDeEUsT0FBTyxTQUFTLENBQUM7YUFDbEI7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUVoQixLQUFLLGNBQWM7WUFDakIsSUFBSSx3QkFBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMzQixJQUFJLFFBQVEsQ0FBQyxHQUFHLEVBQUU7b0JBQ2hCLE9BQU8sYUFBYSxDQUFDO2lCQUN0QjtnQkFDRCxrRUFBa0U7Z0JBQ2xFLHVEQUF1RDtnQkFDdkQsT0FBTyxZQUFZLENBQUM7YUFDckI7aUJBQU0sSUFBSSxtQkFBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsRUFBRTtnQkFDNUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSx3RUFBd0U7Z0JBQ3hFLE9BQU8sU0FBUyxDQUFDO2FBQ2xCO1lBRUQsNEVBQTRFO1lBQzVFLHVHQUF1RztZQUN2RyxJQUFJLFFBQVEsQ0FBQyxHQUFHLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssR0FBRyxFQUFFO2dCQUN0RCxPQUFPLFlBQVksQ0FBQzthQUNyQjtZQUNELE9BQU8sUUFBUSxDQUFDO1FBRWxCLEtBQUssVUFBVSxDQUFDO1FBQ2hCLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssU0FBUztZQUNaLE9BQU8sU0FBUyxDQUFDO0tBQ3BCO0lBRUQsbURBQW1EO0lBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFubmVsLCBpc0NvbG9yQ2hhbm5lbCwgaXNTY2FsZUNoYW5uZWwsIHJhbmdlVHlwZX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7TWFya30gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge2NoYW5uZWxTdXBwb3J0U2NhbGVUeXBlLCBTY2FsZUNvbmZpZywgU2NhbGVUeXBlLCBzY2FsZVR5cGVTdXBwb3J0RGF0YVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFJhbmdlVHlwZSA9ICdjb250aW51b3VzJyB8ICdkaXNjcmV0ZScgfCAnZmxleGlibGUnIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGVyZSBpcyBhIHNwZWNpZmllZCBzY2FsZSB0eXBlIGFuZCBpZiBpdCBpcyBhcHByb3ByaWF0ZSxcbiAqIG9yIGRldGVybWluZSBkZWZhdWx0IHR5cGUgaWYgdHlwZSBpcyB1bnNwZWNpZmllZCBvciBpbmFwcHJvcHJpYXRlLlxuICovXG4vLyBOT1RFOiBDb21wYXNzUUwgdXNlcyB0aGlzIG1ldGhvZC5cbmV4cG9ydCBmdW5jdGlvbiBzY2FsZVR5cGUoXG4gIHNwZWNpZmllZFR5cGU6IFNjYWxlVHlwZSwgY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sXG4gIG1hcms6IE1hcmssIHNjYWxlQ29uZmlnOiBTY2FsZUNvbmZpZ1xuKTogU2NhbGVUeXBlIHtcblxuICBjb25zdCBkZWZhdWx0U2NhbGVUeXBlID0gZGVmYXVsdFR5cGUoY2hhbm5lbCwgZmllbGREZWYsIG1hcmssIHNjYWxlQ29uZmlnKTtcblxuICBpZiAoIWlzU2NhbGVDaGFubmVsKGNoYW5uZWwpKSB7XG4gICAgLy8gVGhlcmUgaXMgbm8gc2NhbGUgZm9yIHRoZXNlIGNoYW5uZWxzXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHNwZWNpZmllZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIENoZWNrIGlmIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHNjYWxlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjaGFubmVsXG4gICAgaWYgKCFjaGFubmVsU3VwcG9ydFNjYWxlVHlwZShjaGFubmVsLCBzcGVjaWZpZWRUeXBlKSkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uuc2NhbGVUeXBlTm90V29ya1dpdGhDaGFubmVsKGNoYW5uZWwsIHNwZWNpZmllZFR5cGUsIGRlZmF1bHRTY2FsZVR5cGUpKTtcbiAgICAgIHJldHVybiBkZWZhdWx0U2NhbGVUeXBlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHNjYWxlIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkYXRhIHR5cGVcbiAgICBpZiAoIXNjYWxlVHlwZVN1cHBvcnREYXRhVHlwZShzcGVjaWZpZWRUeXBlLCBmaWVsZERlZi50eXBlLCBmaWVsZERlZi5iaW4pKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5zY2FsZVR5cGVOb3RXb3JrV2l0aEZpZWxkRGVmKHNwZWNpZmllZFR5cGUsIGRlZmF1bHRTY2FsZVR5cGUpKTtcbiAgICAgIHJldHVybiBkZWZhdWx0U2NhbGVUeXBlO1xuICAgIH1cblxuICAgIHJldHVybiBzcGVjaWZpZWRUeXBlO1xuICB9XG5cbiAgcmV0dXJuIGRlZmF1bHRTY2FsZVR5cGU7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGRlZmF1bHQgc2NhbGUgdHlwZS5cbiAqL1xuLy8gTk9URTogVm95YWdlciB1c2VzIHRoaXMgbWV0aG9kLlxuZnVuY3Rpb24gZGVmYXVsdFR5cGUoXG4gIGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBtYXJrOiBNYXJrLCBzY2FsZUNvbmZpZzogU2NhbGVDb25maWdcbik6IFNjYWxlVHlwZSB7XG4gIHN3aXRjaCAoZmllbGREZWYudHlwZSkge1xuICAgIGNhc2UgJ25vbWluYWwnOlxuICAgIGNhc2UgJ29yZGluYWwnOlxuICAgICAgaWYgKGlzQ29sb3JDaGFubmVsKGNoYW5uZWwpfHwgcmFuZ2VUeXBlKGNoYW5uZWwpID09PSAnZGlzY3JldGUnKSB7XG4gICAgICAgIGlmIChjaGFubmVsID09PSAnc2hhcGUnICYmIGZpZWxkRGVmLnR5cGUgPT09ICdvcmRpbmFsJykge1xuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRpc2NyZXRlQ2hhbm5lbENhbm5vdEVuY29kZShjaGFubmVsLCAnb3JkaW5hbCcpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ29yZGluYWwnO1xuICAgICAgfVxuXG4gICAgICBpZiAodXRpbC5jb250YWlucyhbJ3gnLCAneSddLCBjaGFubmVsKSkge1xuICAgICAgICBpZiAodXRpbC5jb250YWlucyhbJ3JlY3QnLCAnYmFyJywgJ3J1bGUnXSwgbWFyaykpIHtcbiAgICAgICAgICAvLyBUaGUgcmVjdC9iYXIgbWFyayBzaG91bGQgZml0IGludG8gYSBiYW5kLlxuICAgICAgICAgIC8vIEZvciBydWxlLCB1c2luZyBiYW5kIHNjYWxlIHRvIG1ha2UgcnVsZSBhbGlnbiB3aXRoIGF4aXMgdGlja3MgYmV0dGVyIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMzQyOVxuICAgICAgICAgIHJldHVybiAnYmFuZCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmsgPT09ICdiYXInKSB7XG4gICAgICAgICAgcmV0dXJuICdiYW5kJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT3RoZXJ3aXNlLCB1c2Ugb3JkaW5hbCBwb2ludCBzY2FsZSBzbyB3ZSBjYW4gZWFzaWx5IGdldCBjZW50ZXIgcG9zaXRpb25zIG9mIHRoZSBtYXJrcy5cbiAgICAgIHJldHVybiAncG9pbnQnO1xuXG4gICAgY2FzZSAndGVtcG9yYWwnOlxuICAgICAgaWYgKGlzQ29sb3JDaGFubmVsKGNoYW5uZWwpKSB7XG4gICAgICAgIHJldHVybiAnc2VxdWVudGlhbCc7XG4gICAgICB9IGVsc2UgaWYgKHJhbmdlVHlwZShjaGFubmVsKSA9PT0gJ2Rpc2NyZXRlJykge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kaXNjcmV0ZUNoYW5uZWxDYW5ub3RFbmNvZGUoY2hhbm5lbCwgJ3RlbXBvcmFsJykpO1xuICAgICAgICAvLyBUT0RPOiBjb25zaWRlciB1c2luZyBxdWFudGl6ZSAoZXF1aXZhbGVudCB0byBiaW5uaW5nKSBvbmNlIHdlIGhhdmUgaXRcbiAgICAgICAgcmV0dXJuICdvcmRpbmFsJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAndGltZSc7XG5cbiAgICBjYXNlICdxdWFudGl0YXRpdmUnOlxuICAgICAgaWYgKGlzQ29sb3JDaGFubmVsKGNoYW5uZWwpKSB7XG4gICAgICAgIGlmIChmaWVsZERlZi5iaW4pIHtcbiAgICAgICAgICByZXR1cm4gJ2Jpbi1vcmRpbmFsJztcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgYHNlcXVlbnRpYWxgIGFzIHRoZSBkZWZhdWx0IGNvbG9yIHNjYWxlIGZvciBjb250aW51b3VzIGRhdGFcbiAgICAgICAgLy8gc2luY2UgaXQgc3VwcG9ydHMgYm90aCBhcnJheSByYW5nZSBhbmQgc2NoZW1lIHJhbmdlLlxuICAgICAgICByZXR1cm4gJ3NlcXVlbnRpYWwnO1xuICAgICAgfSBlbHNlIGlmIChyYW5nZVR5cGUoY2hhbm5lbCkgPT09ICdkaXNjcmV0ZScpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKGNoYW5uZWwsICdxdWFudGl0YXRpdmUnKSk7XG4gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHF1YW50aXplIChlcXVpdmFsZW50IHRvIGJpbm5pbmcpIG9uY2Ugd2UgaGF2ZSBpdFxuICAgICAgICByZXR1cm4gJ29yZGluYWwnO1xuICAgICAgfVxuXG4gICAgICAvLyB4IGFuZCB5IHVzZSBhIGxpbmVhciBzY2FsZSBiZWNhdXNlIHNlbGVjdGlvbnMgZG9uJ3Qgd29yayB3aXRoIGJpbiBzY2FsZXMuXG4gICAgICAvLyBCaW5uZWQgc2NhbGVzIGFwcGx5IGRpc2NyZXRpemF0aW9uIGJ1dCBwYW4vem9vbSBhcHBseSB0cmFuc2Zvcm1hdGlvbnMgdG8gYSBbbWluLCBtYXhdIGV4dGVudCBkb21haW4uXG4gICAgICBpZiAoZmllbGREZWYuYmluICYmIGNoYW5uZWwgIT09ICd4JyAmJiBjaGFubmVsICE9PSAneScpIHtcbiAgICAgICAgcmV0dXJuICdiaW4tbGluZWFyJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnbGluZWFyJztcblxuICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICBjYXNlICdsb25naXR1ZGUnOlxuICAgIGNhc2UgJ2dlb2pzb24nOlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyAqL1xuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW52YWxpZEZpZWxkVHlwZShmaWVsZERlZi50eXBlKSk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/selection/interval.d.ts b/build/src/compile/selection/interval.d.ts new file mode 100644 index 0000000000..291c4dc4b5 --- /dev/null +++ b/build/src/compile/selection/interval.d.ts @@ -0,0 +1,5 @@ +import { SelectionCompiler } from './selection'; +export declare const BRUSH = "_brush"; +export declare const SCALE_TRIGGER = "_scale_trigger"; +declare const interval: SelectionCompiler; +export default interval; diff --git a/build/src/compile/selection/interval.js b/build/src/compile/selection/interval.js new file mode 100644 index 0000000000..c25bb2589d --- /dev/null +++ b/build/src/compile/selection/interval.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var log_1 = require("../../log"); +var scale_1 = require("../../scale"); +var util_1 = require("../../util"); +var selection_1 = require("./selection"); +var scales_1 = tslib_1.__importDefault(require("./transforms/scales")); +exports.BRUSH = '_brush'; +exports.SCALE_TRIGGER = '_scale_trigger'; +var interval = { + predicate: 'vlInterval', + scaleDomain: 'vlIntervalDomain', + signals: function (model, selCmpt) { + var name = selCmpt.name; + var hasScales = scales_1.default.has(selCmpt); + var signals = []; + var intervals = []; + var tupleTriggers = []; + var scaleTriggers = []; + if (selCmpt.translate && !hasScales) { + var filterExpr_1 = "!event.item || event.item.mark.name !== " + vega_util_1.stringValue(name + exports.BRUSH); + events(selCmpt, function (_, evt) { + var filters = evt.between[0].filter || (evt.between[0].filter = []); + if (filters.indexOf(filterExpr_1) < 0) { + filters.push(filterExpr_1); + } + }); + } + selCmpt.project.forEach(function (p) { + var channel = p.channel; + if (channel !== channel_1.X && channel !== channel_1.Y) { + log_1.warn('Interval selections only support x and y encoding channels.'); + return; + } + var cs = channelSignals(model, selCmpt, channel); + var dname = selection_1.channelSignalName(selCmpt, channel, 'data'); + var vname = selection_1.channelSignalName(selCmpt, channel, 'visual'); + var scaleStr = vega_util_1.stringValue(model.scaleName(channel)); + var scaleType = model.getScaleComponent(channel).get('type'); + var toNum = scale_1.hasContinuousDomain(scaleType) ? '+' : ''; + signals.push.apply(signals, cs); + tupleTriggers.push(dname); + intervals.push("{encoding: " + vega_util_1.stringValue(channel) + ", " + + ("field: " + vega_util_1.stringValue(p.field) + ", extent: " + dname + "}")); + scaleTriggers.push({ + scaleName: model.scaleName(channel), + expr: "(!isArray(" + dname + ") || " + + ("(" + toNum + "invert(" + scaleStr + ", " + vname + ")[0] === " + toNum + dname + "[0] && ") + + (toNum + "invert(" + scaleStr + ", " + vname + ")[1] === " + toNum + dname + "[1]))") + }); + }); + // Proxy scale reactions to ensure that an infinite loop doesn't occur + // when an interval selection filter touches the scale. + if (!hasScales) { + signals.push({ + name: name + exports.SCALE_TRIGGER, + update: scaleTriggers.map(function (t) { return t.expr; }).join(' && ') + + (" ? " + (name + exports.SCALE_TRIGGER) + " : {}") + }); + } + // Only add an interval to the store if it has valid data extents. Data extents + // are set to null if pixel extents are equal to account for intervals over + // ordinal/nominal domains which, when inverted, will still produce a valid datum. + return signals.concat({ + name: name + selection_1.TUPLE, + on: [{ + events: tupleTriggers.map(function (t) { return ({ signal: t }); }), + update: tupleTriggers.join(' && ') + + (" ? {unit: " + selection_1.unitName(model) + ", intervals: [" + intervals.join(', ') + "]} : null") + }] + }); + }, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + selection_1.TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'true' : "{unit: " + selection_1.unitName(model) + "}"); + }, + marks: function (model, selCmpt, marks) { + var name = selCmpt.name; + var _a = selection_1.positionalProjections(selCmpt), xi = _a.xi, yi = _a.yi; + var store = "data(" + vega_util_1.stringValue(selCmpt.name + selection_1.STORE) + ")"; + // Do not add a brush if we're binding to scales. + if (scales_1.default.has(selCmpt)) { + return marks; + } + var update = { + x: xi !== null ? { signal: name + "_x[0]" } : { value: 0 }, + y: yi !== null ? { signal: name + "_y[0]" } : { value: 0 }, + x2: xi !== null ? { signal: name + "_x[1]" } : { field: { group: 'width' } }, + y2: yi !== null ? { signal: name + "_y[1]" } : { field: { group: 'height' } } + }; + // If the selection is resolved to global, only a single interval is in + // the store. Wrap brush mark's encodings with a production rule to test + // this based on the `unit` property. Hide the brush mark if it corresponds + // to a unit different from the one in the store. + if (selCmpt.resolve === 'global') { + for (var _i = 0, _b = util_1.keys(update); _i < _b.length; _i++) { + var key = _b[_i]; + update[key] = [tslib_1.__assign({ test: store + ".length && " + store + "[0].unit === " + selection_1.unitName(model) }, update[key]), { value: 0 }]; + } + } + // Two brush marks ensure that fill colors and other aesthetic choices do + // not interefere with the core marks, but that the brushed region can still + // be interacted with (e.g., dragging it around). + var _c = selCmpt.mark, fill = _c.fill, fillOpacity = _c.fillOpacity, stroke = tslib_1.__rest(_c, ["fill", "fillOpacity"]); + var vgStroke = util_1.keys(stroke).reduce(function (def, k) { + def[k] = [{ + test: [ + xi !== null && name + "_x[0] !== " + name + "_x[1]", + yi != null && name + "_y[0] !== " + name + "_y[1]", + ].filter(function (x) { return x; }).join(' && '), + value: stroke[k] + }, { value: null }]; + return def; + }, {}); + return [{ + name: name + exports.BRUSH + '_bg', + type: 'rect', + clip: true, + encode: { + enter: { + fill: { value: fill }, + fillOpacity: { value: fillOpacity } + }, + update: update + } + }].concat(marks, { + name: name + exports.BRUSH, + type: 'rect', + clip: true, + encode: { + enter: { + fill: { value: 'transparent' } + }, + update: tslib_1.__assign({}, update, vgStroke) + } + }); + } +}; +exports.default = interval; +/** + * Returns the visual and data signals for an interval selection. + */ +function channelSignals(model, selCmpt, channel) { + var vname = selection_1.channelSignalName(selCmpt, channel, 'visual'); + var dname = selection_1.channelSignalName(selCmpt, channel, 'data'); + var hasScales = scales_1.default.has(selCmpt); + var scaleName = model.scaleName(channel); + var scaleStr = vega_util_1.stringValue(scaleName); + var scale = model.getScaleComponent(channel); + var scaleType = scale ? scale.get('type') : undefined; + var size = model.getSizeSignalRef(channel === channel_1.X ? 'width' : 'height').signal; + var coord = channel + "(unit)"; + var on = events(selCmpt, function (def, evt) { + return def.concat({ events: evt.between[0], update: "[" + coord + ", " + coord + "]" }, // Brush Start + { events: evt, update: "[" + vname + "[0], clamp(" + coord + ", 0, " + size + ")]" } // Brush End + ); + }); + // React to pan/zooms of continuous scales. Non-continuous scales + // (bin-linear, band, point) cannot be pan/zoomed and any other changes + // to their domains (e.g., filtering) should clear the brushes. + on.push({ + events: { signal: selCmpt.name + exports.SCALE_TRIGGER }, + update: scale_1.hasContinuousDomain(scaleType) && !scale_1.isBinScale(scaleType) ? + "[scale(" + scaleStr + ", " + dname + "[0]), scale(" + scaleStr + ", " + dname + "[1])]" : "[0, 0]" + }); + return hasScales ? [{ name: dname, on: [] }] : [{ + name: vname, value: [], on: on + }, { + name: dname, + on: [{ events: { signal: vname }, update: vname + "[0] === " + vname + "[1] ? null : invert(" + scaleStr + ", " + vname + ")" }] + }]; +} +function events(selCmpt, cb) { + return selCmpt.events.reduce(function (on, evt) { + if (!evt.between) { + log_1.warn(evt + " is not an ordered event stream for interval selections"); + return on; + } + return cb(on, evt); + }, []); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vaW50ZXJ2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXNDO0FBQ3RDLHlDQUFtQztBQUNuQyxpQ0FBK0I7QUFDL0IscUNBQTREO0FBQzVELG1DQUFnQztBQUdoQyx5Q0FRcUI7QUFDckIsdUVBQXlDO0FBRTVCLFFBQUEsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUNqQixRQUFBLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUU5QyxJQUFNLFFBQVEsR0FBcUI7SUFDakMsU0FBUyxFQUFFLFlBQVk7SUFDdkIsV0FBVyxFQUFFLGtCQUFrQjtJQUUvQixPQUFPLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTztRQUM5QixJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQU0sU0FBUyxHQUFHLGdCQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQU0sT0FBTyxHQUFVLEVBQUUsQ0FBQztRQUMxQixJQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7UUFDNUIsSUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ25DLElBQU0sYUFBYSxHQUFVLEVBQUUsQ0FBQztRQUVoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbkMsSUFBTSxZQUFVLEdBQUcsNkNBQTJDLHVCQUFXLENBQUMsSUFBSSxHQUFHLGFBQUssQ0FBRyxDQUFDO1lBQzFGLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBUyxDQUFRLEVBQUUsR0FBa0I7Z0JBQ25ELElBQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENB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LEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c3RyaW5nVmFsdWV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge1gsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHt3YXJufSBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtoYXNDb250aW51b3VzRG9tYWluLCBpc0JpblNjYWxlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0V2ZW50U3RyZWFtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge1xuICBjaGFubmVsU2lnbmFsTmFtZSxcbiAgcG9zaXRpb25hbFByb2plY3Rpb25zLFxuICBTZWxlY3Rpb25Db21waWxlcixcbiAgU2VsZWN0aW9uQ29tcG9uZW50LFxuICBTVE9SRSxcbiAgVFVQTEUsXG4gIHVuaXROYW1lLFxufSBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgc2NhbGVzIGZyb20gJy4vdHJhbnNmb3Jtcy9zY2FsZXMnO1xuXG5leHBvcnQgY29uc3QgQlJVU0ggPSAnX2JydXNoJztcbmV4cG9ydCBjb25zdCBTQ0FMRV9UUklHR0VSID0gJ19zY2FsZV90cmlnZ2VyJztcblxuY29uc3QgaW50ZXJ2YWw6U2VsZWN0aW9uQ29tcGlsZXIgPSB7XG4gIHByZWRpY2F0ZTogJ3ZsSW50ZXJ2YWwnLFxuICBzY2FsZURvbWFpbjogJ3ZsSW50ZXJ2YWxEb21haW4nLFxuXG4gIHNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0KSB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBjb25zdCBoYXNTY2FsZXMgPSBzY2FsZXMuaGFzKHNlbENtcHQpO1xuICAgIGNvbnN0IHNpZ25hbHM6IGFueVtdID0gW107XG4gICAgY29uc3QgaW50ZXJ2YWxzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHR1cGxlVHJpZ2dlcnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc2NhbGVUcmlnZ2VyczogYW55W10gPSBbXTtcblxuICAgIGlmIChzZWxDbXB0LnRyYW5zbGF0ZSAmJiAhaGFzU2NhbGVzKSB7XG4gICAgICBjb25zdCBmaWx0ZXJFeHByID0gYCFldmVudC5pdGVtIHx8IGV2ZW50Lml0ZW0ubWFyay5uYW1lICE9PSAke3N0cmluZ1ZhbHVlKG5hbWUgKyBCUlVTSCl9YDtcbiAgICAgIGV2ZW50cyhzZWxDbXB0LCBmdW5jdGlvbihfOiBhbnlbXSwgZXZ0OiBWZ0V2ZW50U3RyZWFtKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlcnMgPSBldnQuYmV0d2VlblswXS5maWx0ZXIgfHwgKGV2dC5iZXR3ZWVuWzBdLmZpbHRlciA9IFtdKTtcbiAgICAgICAgaWYgKGZpbHRlcnMuaW5kZXhPZihmaWx0ZXJFeHByKSA8IDApIHtcbiAgICAgICAgICBmaWx0ZXJzLnB1c2goZmlsdGVyRXhwcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNlbENtcHQucHJvamVjdC5mb3JFYWNoKGZ1bmN0aW9uKHApIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBwLmNoYW5uZWw7XG4gICAgICBpZiAoY2hhbm5lbCAhPT0gWCAmJiBjaGFubmVsICE9PSBZKSB7XG4gICAgICAgIHdhcm4oJ0ludGVydmFsIHNlbGVjdGlvbnMgb25seSBzdXBwb3J0IHggYW5kIHkgZW5jb2RpbmcgY2hhbm5lbHMuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3MgPSBjaGFubmVsU2lnbmFscyhtb2RlbCwgc2VsQ21wdCwgY2hhbm5lbCk7XG4gICAgICBjb25zdCBkbmFtZSA9IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICdkYXRhJyk7XG4gICAgICBjb25zdCB2bmFtZSA9IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICd2aXN1YWwnKTtcbiAgICAgIGNvbnN0IHNjYWxlU3RyID0gc3RyaW5nVmFsdWUobW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpKTtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuICAgICAgY29uc3QgdG9OdW0gPSBoYXNDb250aW51b3VzRG9tYWluKHNjYWxlVHlwZSkgPyAnKycgOiAnJztcblxuICAgICAgc2lnbmFscy5wdXNoLmFwcGx5KHNpZ25hbHMsIGNzKTtcbiAgICAgIHR1cGxlVHJpZ2dlcnMucHVzaChkbmFtZSk7XG4gICAgICBpbnRlcnZhbHMucHVzaChge2VuY29kaW5nOiAke3N0cmluZ1ZhbHVlKGNoYW5uZWwpfSwgYCArXG4gICAgICAgIGBmaWVsZDogJHtzdHJpbmdWYWx1ZShwLmZpZWxkKX0sIGV4dGVudDogJHtkbmFtZX19YCk7XG5cbiAgICAgIHNjYWxlVHJpZ2dlcnMucHVzaCh7XG4gICAgICAgIHNjYWxlTmFtZTogbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpLFxuICAgICAgICBleHByOiBgKCFpc0FycmF5KCR7ZG5hbWV9KSB8fCBgICtcbiAgICAgICAgICBgKCR7dG9OdW19aW52ZXJ0KCR7c2NhbGVTdHJ9LCAke3ZuYW1lfSlbMF0gPT09ICR7dG9OdW19JHtkbmFtZX1bMF0gJiYgYCArXG4gICAgICAgICAgICBgJHt0b051bX1pbnZlcnQoJHtzY2FsZVN0cn0sICR7dm5hbWV9KVsxXSA9PT0gJHt0b051bX0ke2RuYW1lfVsxXSkpYFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBQcm94eSBzY2FsZSByZWFjdGlvbnMgdG8gZW5zdXJlIHRoYXQgYW4gaW5maW5pdGUgbG9vcCBkb2Vzbid0IG9jY3VyXG4gICAgLy8gd2hlbiBhbiBpbnRlcnZhbCBzZWxlY3Rpb24gZmlsdGVyIHRvdWNoZXMgdGhlIHNjYWxlLlxuICAgIGlmICghaGFzU2NhbGVzKSB7XG4gICAgICBzaWduYWxzLnB1c2goe1xuICAgICAgICBuYW1lOiBuYW1lICsgU0NBTEVfVFJJR0dFUixcbiAgICAgICAgdXBkYXRlOiBzY2FsZVRyaWdnZXJzLm1hcCgodCkgPT4gdC5leHByKS5qb2luKCcgJiYgJykgK1xuICAgICAgICAgIGAgPyAke25hbWUgKyBTQ0FMRV9UUklHR0VSfSA6IHt9YFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gT25seSBhZGQgYW4gaW50ZXJ2YWwgdG8gdGhlIHN0b3JlIGlmIGl0IGhhcyB2YWxpZCBkYXRhIGV4dGVudHMuIERhdGEgZXh0ZW50c1xuICAgIC8vIGFyZSBzZXQgdG8gbnVsbCBpZiBwaXhlbCBleHRlbnRzIGFyZSBlcXVhbCB0byBhY2NvdW50IGZvciBpbnRlcnZhbHMgb3ZlclxuICAgIC8vIG9yZGluYWwvbm9taW5hbCBkb21haW5zIHdoaWNoLCB3aGVuIGludmVydGVkLCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB2YWxpZCBkYXR1bS5cbiAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoe1xuICAgICAgbmFtZTogbmFtZSArIFRVUExFLFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czogdHVwbGVUcmlnZ2Vycy5tYXAoKHQpID0+ICh7c2lnbmFsOiB0fSkpLFxuICAgICAgICB1cGRhdGU6IHR1cGxlVHJpZ2dlcnMuam9pbignICYmICcpICtcbiAgICAgICAgICBgID8ge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfSwgaW50ZXJ2YWxzOiBbJHtpbnRlcnZhbHMuam9pbignLCAnKX1dfSA6IG51bGxgXG4gICAgICB9XVxuICAgIH0pO1xuICB9LFxuXG4gIG1vZGlmeUV4cHI6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0KSB7XG4gICAgY29uc3QgdHBsID0gc2VsQ21wdC5uYW1lICsgVFVQTEU7XG4gICAgcmV0dXJuIHRwbCArICcsICcgK1xuICAgICAgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgPyAndHJ1ZScgOiBge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfX1gKTtcbiAgfSxcblxuICBtYXJrczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIG1hcmtzKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBjb25zdCB7eGksIHlpfSA9IHBvc2l0aW9uYWxQcm9qZWN0aW9ucyhzZWxDbXB0KTtcbiAgICBjb25zdCBzdG9yZSA9IGBkYXRhKCR7c3RyaW5nVmFsdWUoc2VsQ21wdC5uYW1lICsgU1RPUkUpfSlgO1xuXG4gICAgLy8gRG8gbm90IGFkZCBhIGJydXNoIGlmIHdlJ3JlIGJpbmRpbmcgdG8gc2NhbGVzLlxuICAgIGlmIChzY2FsZXMuaGFzKHNlbENtcHQpKSB7XG4gICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuXG4gICAgY29uc3QgdXBkYXRlOiBhbnkgPSB7XG4gICAgICB4OiB4aSAhPT0gbnVsbCA/IHtzaWduYWw6IGAke25hbWV9X3hbMF1gfSA6IHt2YWx1ZTogMH0sXG4gICAgICB5OiB5aSAhPT0gbnVsbCA/IHtzaWduYWw6IGAke25hbWV9X3lbMF1gfSA6IHt2YWx1ZTogMH0sXG4gICAgICB4MjogeGkgIT09IG51bGwgPyB7c2lnbmFsOiBgJHtuYW1lfV94WzFdYH0gOiB7ZmllbGQ6IHtncm91cDogJ3dpZHRoJ319LFxuICAgICAgeTI6IHlpICE9PSBudWxsID8ge3NpZ25hbDogYCR7bmFtZX1feVsxXWB9IDoge2ZpZWxkOiB7Z3JvdXA6ICdoZWlnaHQnfX1cbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlIHNlbGVjdGlvbiBpcyByZXNvbHZlZCB0byBnbG9iYWwsIG9ubHkgYSBzaW5nbGUgaW50ZXJ2YWwgaXMgaW5cbiAgICAvLyB0aGUgc3RvcmUuIFdyYXAgYnJ1c2ggbWFyaydzIGVuY29kaW5ncyB3aXRoIGEgcHJvZHVjdGlvbiBydWxlIHRvIHRlc3RcbiAgICAvLyB0aGlzIGJhc2VkIG9uIHRoZSBgdW5pdGAgcHJvcGVydHkuIEhpZGUgdGhlIGJydXNoIG1hcmsgaWYgaXQgY29ycmVzcG9uZHNcbiAgICAvLyB0byBhIHVuaXQgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBpbiB0aGUgc3RvcmUuXG4gICAgaWYgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXModXBkYXRlKSkge1xuICAgICAgICB1cGRhdGVba2V5XSA9IFt7XG4gICAgICAgICAgdGVzdDogYCR7c3RvcmV9Lmxlbmd0aCAmJiAke3N0b3JlfVswXS51bml0ID09PSAke3VuaXROYW1lKG1vZGVsKX1gLFxuICAgICAgICAgIC4uLnVwZGF0ZVtrZXldXG4gICAgICAgIH0sIHt2YWx1ZTogMH1dO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFR3byBicnVzaCBtYXJrcyBlbnN1cmUgdGhhdCBmaWxsIGNvbG9ycyBhbmQgb3RoZXIgYWVzdGhldGljIGNob2ljZXMgZG9cbiAgICAvLyBub3QgaW50ZXJlZmVyZSB3aXRoIHRoZSBjb3JlIG1hcmtzLCBidXQgdGhhdCB0aGUgYnJ1c2hlZCByZWdpb24gY2FuIHN0aWxsXG4gICAgLy8gYmUgaW50ZXJhY3RlZCB3aXRoIChlLmcuLCBkcmFnZ2luZyBpdCBhcm91bmQpLlxuICAgIGNvbnN0IHtmaWxsLCBmaWxsT3BhY2l0eSwgLi4uc3Ryb2tlfSA9IHNlbENtcHQubWFyaztcbiAgICBjb25zdCB2Z1N0cm9rZSA9IGtleXMoc3Ryb2tlKS5yZWR1Y2UoKGRlZiwgaykgPT4ge1xuICAgICAgZGVmW2tdID0gW3tcbiAgICAgICAgdGVzdDogW1xuICAgICAgICAgIHhpICE9PSBudWxsICYmIGAke25hbWV9X3hbMF0gIT09ICR7bmFtZX1feFsxXWAsXG4gICAgICAgICAgeWkgIT0gbnVsbCAmJiBgJHtuYW1lfV95WzBdICE9PSAke25hbWV9X3lbMV1gLFxuICAgICAgICBdLmZpbHRlcih4ID0+IHgpLmpvaW4oJyAmJiAnKSxcbiAgICAgICAgdmFsdWU6IHN0cm9rZVtrXVxuICAgICAgfSwge3ZhbHVlOiBudWxsfV07XG4gICAgICByZXR1cm4gZGVmO1xuICAgIH0sIHt9KTtcblxuICAgIHJldHVybiBbe1xuICAgICAgbmFtZTogbmFtZSArIEJSVVNIICsgJ19iZycsXG4gICAgICB0eXBlOiAncmVjdCcsXG4gICAgICBjbGlwOiB0cnVlLFxuICAgICAgZW5jb2RlOiB7XG4gICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgZmlsbDoge3ZhbHVlOiBmaWxsfSxcbiAgICAgICAgICBmaWxsT3BhY2l0eToge3ZhbHVlOiBmaWxsT3BhY2l0eX1cbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlOiB1cGRhdGVcbiAgICAgIH1cbiAgICB9IGFzIGFueV0uY29uY2F0KG1hcmtzLCB7XG4gICAgICBuYW1lOiBuYW1lICsgQlJVU0gsXG4gICAgICB0eXBlOiAncmVjdCcsXG4gICAgICBjbGlwOiB0cnVlLFxuICAgICAgZW5jb2RlOiB7XG4gICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgZmlsbDoge3ZhbHVlOiAndHJhbnNwYXJlbnQnfVxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGU6IHsuLi51cGRhdGUsIC4uLnZnU3Ryb2tlfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuZXhwb3J0IGRlZmF1bHQgaW50ZXJ2YWw7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmlzdWFsIGFuZCBkYXRhIHNpZ25hbHMgZm9yIGFuIGludGVydmFsIHNlbGVjdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2hhbm5lbFNpZ25hbHMobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBjaGFubmVsOiAneCd8J3knKTogYW55IHtcbiAgY29uc3Qgdm5hbWUgPSBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCAndmlzdWFsJyk7XG4gIGNvbnN0IGRuYW1lID0gY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKTtcbiAgY29uc3QgaGFzU2NhbGVzID0gc2NhbGVzLmhhcyhzZWxDbXB0KTtcbiAgY29uc3Qgc2NhbGVOYW1lID0gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuICBjb25zdCBzY2FsZVN0ciA9IHN0cmluZ1ZhbHVlKHNjYWxlTmFtZSk7XG4gIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlVHlwZSA9IHNjYWxlID8gc2NhbGUuZ2V0KCd0eXBlJykgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNpemUgPSBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKGNoYW5uZWwgPT09IFggPyAnd2lkdGgnIDogJ2hlaWdodCcpLnNpZ25hbDtcbiAgY29uc3QgY29vcmQgPSBgJHtjaGFubmVsfSh1bml0KWA7XG5cbiAgY29uc3Qgb24gPSBldmVudHMoc2VsQ21wdCwgZnVuY3Rpb24oZGVmOiBhbnlbXSwgZXZ0OiBWZ0V2ZW50U3RyZWFtKSB7XG4gICAgcmV0dXJuIGRlZi5jb25jYXQoXG4gICAgICB7ZXZlbnRzOiBldnQuYmV0d2VlblswXSwgdXBkYXRlOiBgWyR7Y29vcmR9LCAke2Nvb3JkfV1gfSwgICAgICAgICAgIC8vIEJydXNoIFN0YXJ0XG4gICAgICB7ZXZlbnRzOiBldnQsIHVwZGF0ZTogYFske3ZuYW1lfVswXSwgY2xhbXAoJHtjb29yZH0sIDAsICR7c2l6ZX0pXWB9IC8vIEJydXNoIEVuZFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIFJlYWN0IHRvIHBhbi96b29tcyBvZiBjb250aW51b3VzIHNjYWxlcy4gTm9uLWNvbnRpbnVvdXMgc2NhbGVzXG4gIC8vIChiaW4tbGluZWFyLCBiYW5kLCBwb2ludCkgY2Fubm90IGJlIHBhbi96b29tZWQgYW5kIGFueSBvdGhlciBjaGFuZ2VzXG4gIC8vIHRvIHRoZWlyIGRvbWFpbnMgKGUuZy4sIGZpbHRlcmluZykgc2hvdWxkIGNsZWFyIHRoZSBicnVzaGVzLlxuICBvbi5wdXNoKHtcbiAgICBldmVudHM6IHtzaWduYWw6IHNlbENtcHQubmFtZSArIFNDQUxFX1RSSUdHRVJ9LFxuICAgIHVwZGF0ZTogaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpICYmICFpc0JpblNjYWxlKHNjYWxlVHlwZSkgP1xuICAgICAgYFtzY2FsZSgke3NjYWxlU3RyfSwgJHtkbmFtZX1bMF0pLCBzY2FsZSgke3NjYWxlU3RyfSwgJHtkbmFtZX1bMV0pXWAgOiBgWzAsIDBdYFxuICB9KTtcblxuICByZXR1cm4gaGFzU2NhbGVzID8gW3tuYW1lOiBkbmFtZSwgb246IFtdfV0gOiBbe1xuICAgIG5hbWU6IHZuYW1lLCB2YWx1ZTogW10sIG9uOiBvblxuICB9LCB7XG4gICAgbmFtZTogZG5hbWUsXG4gICAgb246IFt7ZXZlbnRzOiB7c2lnbmFsOiB2bmFtZX0sIHVwZGF0ZTogYCR7dm5hbWV9WzBdID09PSAke3ZuYW1lfVsxXSA/IG51bGwgOiBpbnZlcnQoJHtzY2FsZVN0cn0sICR7dm5hbWV9KWB9XVxuICB9XTtcbn1cblxuZnVuY3Rpb24gZXZlbnRzKHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgY2I6IEZ1bmN0aW9uKSB7XG4gIHJldHVybiBzZWxDbXB0LmV2ZW50cy5yZWR1Y2UoZnVuY3Rpb24ob246IGFueVtdLCBldnQ6IFZnRXZlbnRTdHJlYW0pIHtcbiAgICBpZiAoIWV2dC5iZXR3ZWVuKSB7XG4gICAgICB3YXJuKGAke2V2dH0gaXMgbm90IGFuIG9yZGVyZWQgZXZlbnQgc3RyZWFtIGZvciBpbnRlcnZhbCBzZWxlY3Rpb25zYCk7XG4gICAgICByZXR1cm4gb247XG4gICAgfVxuICAgIHJldHVybiBjYihvbiwgZXZ0KTtcbiAgfSwgW10pO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/multi.d.ts b/build/src/compile/selection/multi.d.ts new file mode 100644 index 0000000000..d504dacddc --- /dev/null +++ b/build/src/compile/selection/multi.d.ts @@ -0,0 +1,13 @@ +import { UnitModel } from '../unit'; +import { SelectionCompiler, SelectionComponent } from './selection'; +export declare function signals(model: UnitModel, selCmpt: SelectionComponent): { + name: string; + value: {}; + on: { + events: any; + update: string; + force: boolean; + }[]; +}[]; +declare const multi: SelectionCompiler; +export default multi; diff --git a/build/src/compile/selection/multi.js b/build/src/compile/selection/multi.js new file mode 100644 index 0000000000..90ea095568 --- /dev/null +++ b/build/src/compile/selection/multi.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var util_1 = require("../../util"); +var selection_1 = require("./selection"); +var nearest_1 = tslib_1.__importDefault(require("./transforms/nearest")); +function signals(model, selCmpt) { + var proj = selCmpt.project; + var datum = nearest_1.default.has(selCmpt) ? + '(item().isVoronoi ? datum.datum : datum)' : 'datum'; + var bins = []; + var encodings = proj.map(function (p) { return vega_util_1.stringValue(p.channel); }).filter(function (e) { return e; }).join(', '); + var fields = proj.map(function (p) { return vega_util_1.stringValue(p.field); }).join(', '); + var values = proj.map(function (p) { + var channel = p.channel; + var fieldDef = model.fieldDef(channel); + // Binned fields should capture extents, for a range test against the raw field. + return (fieldDef && fieldDef.bin) ? (bins.push(p.field), + "[" + util_1.accessPathWithDatum(model.vgField(channel, {}), datum) + ", " + + (util_1.accessPathWithDatum(model.vgField(channel, { binSuffix: 'end' }), datum) + "]")) : + "" + util_1.accessPathWithDatum(p.field, datum); + }).join(', '); + // Only add a discrete selection to the store if a datum is present _and_ + // the interaction isn't occurring on a group mark. This guards against + // polluting interactive state with invalid values in faceted displays + // as the group marks are also data-driven. We force the update to account + // for constant null states but varying toggles (e.g., shift-click in + // whitespace followed by a click in whitespace; the store should only + // be cleared on the second click). + return [{ + name: selCmpt.name + selection_1.TUPLE, + value: {}, + on: [{ + events: selCmpt.events, + update: "datum && item().mark.marktype !== 'group' ? " + + ("{unit: " + selection_1.unitName(model) + ", encodings: [" + encodings + "], ") + + ("fields: [" + fields + "], values: [" + values + "]") + + (bins.length ? ', ' + bins.map(function (b) { return vega_util_1.stringValue('bin_' + b) + ": 1"; }).join(', ') : '') + + '} : null', + force: true + }] + }]; +} +exports.signals = signals; +var multi = { + predicate: 'vlMulti', + scaleDomain: 'vlMultiDomain', + signals: signals, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + selection_1.TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'null' : "{unit: " + selection_1.unitName(model) + "}"); + } +}; +exports.default = multi; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vbXVsdGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXNDO0FBRXRDLG1DQUErQztBQUUvQyx5Q0FBbUY7QUFDbkYseUVBQTJDO0FBRTNDLGlCQUF3QixLQUFnQixFQUFFLE9BQTJCO0lBQ25FLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDN0IsSUFBTSxLQUFLLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNsQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ3ZELElBQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsdUJBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQXRCLENBQXNCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLEVBQUQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RGLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSx1QkFBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRSxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQztRQUN4QixJQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzFCLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsZ0ZBQWdGO1FBQ2hGLE9BQU8sQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNyRCxNQUFJLDBCQUFtQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFJO2lCQUN2RCwwQkFBbUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFHLENBQUEsQ0FBQyxDQUFDLENBQUM7WUFDbkYsS0FBRywwQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBRyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVkLHlFQUF5RTtJQUN6RSx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLDBFQUEwRTtJQUMxRSxxRUFBcUU7SUFDckUsc0VBQXNFO0lBQ3RFLG1DQUFtQztJQUNuQyxPQUFPLENBQUM7WUFDTixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksR0FBRyxpQkFBSztZQUMxQixLQUFLLEVBQUUsRUFBRTtZQUNULEVBQUUsRUFBRSxDQUFDO29CQUNILE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsTUFBTSxFQUFFLDhDQUE4Qzt5QkFDcEQsWUFBVSxvQkFBUSxDQUFDLEtBQUssQ0FBQyxzQkFBaUIsU0FBUyxRQUFLLENBQUE7eUJBQ3hELGNBQVksTUFBTSxvQkFBZSxNQUFNLE1BQUcsQ0FBQTt3QkFDMUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFHLHVCQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFLLEVBQS9CLENBQStCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDdkYsVUFBVTtvQkFDWixLQUFLLEVBQUUsSUFBSTtpQkFDWixDQUFDO1NBQ0gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQXJDRCwwQkFxQ0M7QUFFRCxJQUFNLEtBQUssR0FBcUI7SUFDOUIsU0FBUyxFQUFFLFNBQVM7SUFDcEIsV0FBVyxFQUFFLGVBQWU7SUFFNUIsT0FBTyxFQUFFLE9BQU87SUFFaEIsVUFBVSxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU87UUFDakMsSUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxpQkFBSyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxHQUFHLElBQUk7WUFDZixDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVUsb0JBQVEsQ0FBQyxLQUFLLENBQUMsTUFBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGLENBQUM7QUFFRixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cmluZ1ZhbHVlfSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge2FjY2Vzc1BhdGhXaXRoRGF0dW19IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtTZWxlY3Rpb25Db21waWxlciwgU2VsZWN0aW9uQ29tcG9uZW50LCBUVVBMRSwgdW5pdE5hbWV9IGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBuZWFyZXN0IGZyb20gJy4vdHJhbnNmb3Jtcy9uZWFyZXN0JztcblxuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbHMobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50KSB7XG4gIGNvbnN0IHByb2ogPSBzZWxDbXB0LnByb2plY3Q7XG4gIGNvbnN0IGRhdHVtID0gbmVhcmVzdC5oYXMoc2VsQ21wdCkgP1xuICAgICcoaXRlbSgpLmlzVm9yb25vaSA/IGRhdHVtLmRhdHVtIDogZGF0dW0pJyA6ICdkYXR1bSc7XG4gIGNvbnN0IGJpbnM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGVuY29kaW5ncyA9IHByb2oubWFwKChwKSA9PiBzdHJpbmdWYWx1ZShwLmNoYW5uZWwpKS5maWx0ZXIoKGUpID0+IGUpLmpvaW4oJywgJyk7XG4gIGNvbnN0IGZpZWxkcyA9IHByb2oubWFwKChwKSA9PiBzdHJpbmdWYWx1ZShwLmZpZWxkKSkuam9pbignLCAnKTtcbiAgY29uc3QgdmFsdWVzID0gcHJvai5tYXAoKHApID0+IHtcbiAgICBjb25zdCBjaGFubmVsID0gcC5jaGFubmVsO1xuICAgIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCk7XG4gICAgLy8gQmlubmVkIGZpZWxkcyBzaG91bGQgY2FwdHVyZSBleHRlbnRzLCBmb3IgYSByYW5nZSB0ZXN0IGFnYWluc3QgdGhlIHJhdyBmaWVsZC5cbiAgICByZXR1cm4gKGZpZWxkRGVmICYmIGZpZWxkRGVmLmJpbikgPyAoYmlucy5wdXNoKHAuZmllbGQpLFxuICAgICAgYFske2FjY2Vzc1BhdGhXaXRoRGF0dW0obW9kZWwudmdGaWVsZChjaGFubmVsLCB7fSksIGRhdHVtKX0sIGAgK1xuICAgICAgICAgIGAke2FjY2Vzc1BhdGhXaXRoRGF0dW0obW9kZWwudmdGaWVsZChjaGFubmVsLCB7YmluU3VmZml4OiAnZW5kJ30pLCBkYXR1bSl9XWApIDpcbiAgICAgIGAke2FjY2Vzc1BhdGhXaXRoRGF0dW0ocC5maWVsZCwgZGF0dW0pfWA7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgLy8gT25seSBhZGQgYSBkaXNjcmV0ZSBzZWxlY3Rpb24gdG8gdGhlIHN0b3JlIGlmIGEgZGF0dW0gaXMgcHJlc2VudCBfYW5kX1xuICAvLyB0aGUgaW50ZXJhY3Rpb24gaXNuJ3Qgb2NjdXJyaW5nIG9uIGEgZ3JvdXAgbWFyay4gVGhpcyBndWFyZHMgYWdhaW5zdFxuICAvLyBwb2xsdXRpbmcgaW50ZXJhY3RpdmUgc3RhdGUgd2l0aCBpbnZhbGlkIHZhbHVlcyBpbiBmYWNldGVkIGRpc3BsYXlzXG4gIC8vIGFzIHRoZSBncm91cCBtYXJrcyBhcmUgYWxzbyBkYXRhLWRyaXZlbi4gV2UgZm9yY2UgdGhlIHVwZGF0ZSB0byBhY2NvdW50XG4gIC8vIGZvciBjb25zdGFudCBudWxsIHN0YXRlcyBidXQgdmFyeWluZyB0b2dnbGVzIChlLmcuLCBzaGlmdC1jbGljayBpblxuICAvLyB3aGl0ZXNwYWNlIGZvbGxvd2VkIGJ5IGEgY2xpY2sgaW4gd2hpdGVzcGFjZTsgdGhlIHN0b3JlIHNob3VsZCBvbmx5XG4gIC8vIGJlIGNsZWFyZWQgb24gdGhlIHNlY29uZCBjbGljaykuXG4gIHJldHVybiBbe1xuICAgIG5hbWU6IHNlbENtcHQubmFtZSArIFRVUExFLFxuICAgIHZhbHVlOiB7fSxcbiAgICBvbjogW3tcbiAgICAgIGV2ZW50czogc2VsQ21wdC5ldmVudHMsXG4gICAgICB1cGRhdGU6IGBkYXR1bSAmJiBpdGVtKCkubWFyay5tYXJrdHlwZSAhPT0gJ2dyb3VwJyA/IGAgK1xuICAgICAgICBge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfSwgZW5jb2RpbmdzOiBbJHtlbmNvZGluZ3N9XSwgYCArXG4gICAgICAgIGBmaWVsZHM6IFske2ZpZWxkc31dLCB2YWx1ZXM6IFske3ZhbHVlc31dYCArXG4gICAgICAgIChiaW5zLmxlbmd0aCA/ICcsICcgKyBiaW5zLm1hcCgoYikgPT4gYCR7c3RyaW5nVmFsdWUoJ2Jpbl8nICsgYil9OiAxYCkuam9pbignLCAnKSA6ICcnKSArXG4gICAgICAgICd9IDogbnVsbCcsXG4gICAgICBmb3JjZTogdHJ1ZVxuICAgIH1dXG4gIH1dO1xufVxuXG5jb25zdCBtdWx0aTpTZWxlY3Rpb25Db21waWxlciA9IHtcbiAgcHJlZGljYXRlOiAndmxNdWx0aScsXG4gIHNjYWxlRG9tYWluOiAndmxNdWx0aURvbWFpbicsXG5cbiAgc2lnbmFsczogc2lnbmFscyxcblxuICBtb2RpZnlFeHByOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCkge1xuICAgIGNvbnN0IHRwbCA9IHNlbENtcHQubmFtZSArIFRVUExFO1xuICAgIHJldHVybiB0cGwgKyAnLCAnICtcbiAgICAgIChzZWxDbXB0LnJlc29sdmUgPT09ICdnbG9iYWwnID8gJ251bGwnIDogYHt1bml0OiAke3VuaXROYW1lKG1vZGVsKX19YCk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG11bHRpO1xuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/selection.d.ts b/build/src/compile/selection/selection.d.ts new file mode 100644 index 0000000000..8cd4167e1d --- /dev/null +++ b/build/src/compile/selection/selection.d.ts @@ -0,0 +1,65 @@ +import { Channel, ScaleChannel } from '../../channel'; +import { LogicalOperand } from '../../logical'; +import { BrushConfig, SelectionDef, SelectionResolution, SelectionType } from '../../selection'; +import { Dict } from '../../util'; +import { VgBinding, VgData, VgEventStream, VgSignalRef } from '../../vega.schema'; +import { DataFlowNode } from '../data/dataflow'; +import { TimeUnitNode } from '../data/timeunit'; +import { LayerModel } from '../layer'; +import { Model } from '../model'; +import { UnitModel } from '../unit'; +import { SelectionComponent } from './selection'; +export declare const STORE = "_store"; +export declare const TUPLE = "_tuple"; +export declare const MODIFY = "_modify"; +export declare const SELECTION_DOMAIN = "_selection_domain_"; +export interface SelectionComponent { + name: string; + type: SelectionType; + events: VgEventStream; + bind?: 'scales' | VgBinding | { + [key: string]: VgBinding; + }; + resolve: SelectionResolution; + empty: 'all' | 'none'; + mark?: BrushConfig; + _signalNames: {}; + project?: ProjectComponent[]; + fields?: any; + timeUnit?: TimeUnitNode; + scales?: Channel[]; + toggle?: any; + translate?: any; + zoom?: any; + nearest?: any; +} +export interface ProjectComponent { + field?: string; + channel?: ScaleChannel; +} +export interface SelectionCompiler { + signals: (model: UnitModel, selCmpt: SelectionComponent) => any[]; + topLevelSignals?: (model: Model, selCmpt: SelectionComponent, signals: any[]) => any[]; + modifyExpr: (model: UnitModel, selCmpt: SelectionComponent) => string; + marks?: (model: UnitModel, selCmpt: SelectionComponent, marks: any[]) => any[]; + predicate: string; + scaleDomain: string; +} +export declare function parseUnitSelection(model: UnitModel, selDefs: Dict): Dict; +export declare function assembleUnitSelectionSignals(model: UnitModel, signals: any[]): any[]; +export declare function assembleTopLevelSignals(model: UnitModel, signals: any[]): any[]; +export declare function assembleUnitSelectionData(model: UnitModel, data: VgData[]): VgData[]; +export declare function assembleUnitSelectionMarks(model: UnitModel, marks: any[]): any[]; +export declare function assembleLayerSelectionMarks(model: LayerModel, marks: any[]): any[]; +export declare function selectionPredicate(model: Model, selections: LogicalOperand, dfnode?: DataFlowNode): string; +export declare function isRawSelectionDomain(domainRaw: VgSignalRef): boolean; +export declare function selectionScaleDomain(model: Model, domainRaw: VgSignalRef): VgSignalRef; +export declare function unitName(model: Model): string; +export declare function requiresSelectionId(model: Model): boolean; +export declare function channelSignalName(selCmpt: SelectionComponent, channel: Channel, range: 'visual' | 'data'): any; +export declare function positionalProjections(selCmpt: SelectionComponent): { + x: ProjectComponent; + xi: number; + y: ProjectComponent; + yi: number; +}; diff --git a/build/src/compile/selection/selection.js b/build/src/compile/selection/selection.js new file mode 100644 index 0000000000..61ecf232c8 --- /dev/null +++ b/build/src/compile/selection/selection.js @@ -0,0 +1,298 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_event_selector_1 = require("vega-event-selector"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../channel"); +var log_1 = require("../../log"); +var selection_1 = require("../../selection"); +var util_1 = require("../../util"); +var model_1 = require("../model"); +var interval_1 = tslib_1.__importDefault(require("./interval")); +var multi_1 = tslib_1.__importDefault(require("./multi")); +var single_1 = tslib_1.__importDefault(require("./single")); +var transforms_1 = require("./transforms/transforms"); +exports.STORE = '_store'; +exports.TUPLE = '_tuple'; +exports.MODIFY = '_modify'; +exports.SELECTION_DOMAIN = '_selection_domain_'; +function parseUnitSelection(model, selDefs) { + var selCmpts = {}; + var selectionConfig = model.config.selection; + var _loop_1 = function (name_1) { + if (!selDefs.hasOwnProperty(name_1)) { + return "continue"; + } + var selDef = selDefs[name_1]; + var cfg = selectionConfig[selDef.type]; + // Set default values from config if a property hasn't been specified, + // or if it is true. E.g., "translate": true should use the default + // event handlers for translate. However, true may be a valid value for + // a property (e.g., "nearest": true). + for (var key in cfg) { + // A selection should contain either `encodings` or `fields`, only use + // default values for these two values if neither of them is specified. + if ((key === 'encodings' && selDef.fields) || (key === 'fields' && selDef.encodings)) { + continue; + } + if (key === 'mark') { + selDef[key] = tslib_1.__assign({}, cfg[key], selDef[key]); + } + if (selDef[key] === undefined || selDef[key] === true) { + selDef[key] = cfg[key] || selDef[key]; + } + } + name_1 = util_1.varName(name_1); + var selCmpt = selCmpts[name_1] = tslib_1.__assign({}, selDef, { name: name_1, events: vega_util_1.isString(selDef.on) ? vega_event_selector_1.selector(selDef.on, 'scope') : selDef.on }); + transforms_1.forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.parse) { + txCompiler.parse(model, selDef, selCmpt); + } + }); + }; + for (var name_1 in selDefs) { + _loop_1(name_1); + } + return selCmpts; +} +exports.parseUnitSelection = parseUnitSelection; +function assembleUnitSelectionSignals(model, signals) { + forEachSelection(model, function (selCmpt, selCompiler) { + var name = selCmpt.name; + var modifyExpr = selCompiler.modifyExpr(model, selCmpt); + signals.push.apply(signals, selCompiler.signals(model, selCmpt)); + transforms_1.forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.signals) { + signals = txCompiler.signals(model, selCmpt, signals); + } + if (txCompiler.modifyExpr) { + modifyExpr = txCompiler.modifyExpr(model, selCmpt, modifyExpr); + } + }); + signals.push({ + name: name + exports.MODIFY, + on: [{ + events: { signal: name + exports.TUPLE }, + update: "modify(" + vega_util_1.stringValue(selCmpt.name + exports.STORE) + ", " + modifyExpr + ")" + }] + }); + }); + var facetModel = getFacetModel(model); + if (signals.length && facetModel) { + var name_2 = vega_util_1.stringValue(facetModel.getName('cell')); + signals.unshift({ + name: 'facet', + value: {}, + on: [{ + events: vega_event_selector_1.selector('mousemove', 'scope'), + update: "isTuple(facet) ? facet : group(" + name_2 + ").datum" + }] + }); + } + return signals; +} +exports.assembleUnitSelectionSignals = assembleUnitSelectionSignals; +function assembleTopLevelSignals(model, signals) { + var needsUnit = false; + forEachSelection(model, function (selCmpt, selCompiler) { + if (selCompiler.topLevelSignals) { + signals = selCompiler.topLevelSignals(model, selCmpt, signals); + } + transforms_1.forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.topLevelSignals) { + signals = txCompiler.topLevelSignals(model, selCmpt, signals); + } + }); + needsUnit = true; + }); + if (needsUnit) { + var hasUnit = signals.filter(function (s) { return s.name === 'unit'; }); + if (!(hasUnit.length)) { + signals.unshift({ + name: 'unit', + value: {}, + on: [{ events: 'mousemove', update: 'isTuple(group()) ? group() : unit' }] + }); + } + } + return signals; +} +exports.assembleTopLevelSignals = assembleTopLevelSignals; +function assembleUnitSelectionData(model, data) { + forEachSelection(model, function (selCmpt) { + var contains = data.filter(function (d) { return d.name === selCmpt.name + exports.STORE; }); + if (!contains.length) { + data.push({ name: selCmpt.name + exports.STORE }); + } + }); + return data; +} +exports.assembleUnitSelectionData = assembleUnitSelectionData; +function assembleUnitSelectionMarks(model, marks) { + forEachSelection(model, function (selCmpt, selCompiler) { + marks = selCompiler.marks ? selCompiler.marks(model, selCmpt, marks) : marks; + transforms_1.forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.marks) { + marks = txCompiler.marks(model, selCmpt, marks); + } + }); + }); + return marks; +} +exports.assembleUnitSelectionMarks = assembleUnitSelectionMarks; +function assembleLayerSelectionMarks(model, marks) { + model.children.forEach(function (child) { + if (model_1.isUnitModel(child)) { + marks = assembleUnitSelectionMarks(child, marks); + } + }); + return marks; +} +exports.assembleLayerSelectionMarks = assembleLayerSelectionMarks; +function selectionPredicate(model, selections, dfnode) { + var stores = []; + function expr(name) { + var vname = util_1.varName(name); + var selCmpt = model.getSelectionComponent(vname, name); + var store = vega_util_1.stringValue(vname + exports.STORE); + if (selCmpt.timeUnit) { + var child = dfnode || model.component.data.raw; + var tunode = selCmpt.timeUnit.clone(); + if (child.parent) { + tunode.insertAsParentOf(child); + } + else { + child.parent = tunode; + } + } + if (selCmpt.empty !== 'none') { + stores.push(store); + } + return compiler(selCmpt.type).predicate + ("(" + store + ", datum") + + (selCmpt.resolve === 'global' ? ')' : ", " + vega_util_1.stringValue(selCmpt.resolve) + ")"); + } + var predicateStr = util_1.logicalExpr(selections, expr); + return (stores.length + ? '!(' + stores.map(function (s) { return "length(data(" + s + "))"; }).join(' || ') + ') || ' + : '') + ("(" + predicateStr + ")"); +} +exports.selectionPredicate = selectionPredicate; +// Selections are parsed _after_ scales. If a scale domain is set to +// use a selection, the SELECTION_DOMAIN constant is used as the +// domainRaw.signal during scale.parse and then replaced with the necessary +// selection expression function during scale.assemble. To not pollute the +// type signatures to account for this setup, the selection domain definition +// is coerced to a string and appended to SELECTION_DOMAIN. +function isRawSelectionDomain(domainRaw) { + return domainRaw.signal.indexOf(exports.SELECTION_DOMAIN) >= 0; +} +exports.isRawSelectionDomain = isRawSelectionDomain; +function selectionScaleDomain(model, domainRaw) { + var selDomain = JSON.parse(domainRaw.signal.replace(exports.SELECTION_DOMAIN, '')); + var name = util_1.varName(selDomain.selection); + var selCmpt = model.component.selection && model.component.selection[name]; + if (selCmpt) { + log_1.warn('Use "bind": "scales" to setup a binding for scales and selections within the same view.'); + } + else { + selCmpt = model.getSelectionComponent(name, selDomain.selection); + if (!selDomain.encoding && !selDomain.field) { + selDomain.field = selCmpt.project[0].field; + if (selCmpt.project.length > 1) { + log_1.warn('A "field" or "encoding" must be specified when using a selection as a scale domain. ' + + ("Using \"field\": " + vega_util_1.stringValue(selDomain.field) + ".")); + } + } + return { + signal: compiler(selCmpt.type).scaleDomain + + ("(" + vega_util_1.stringValue(name + exports.STORE) + ", " + vega_util_1.stringValue(selDomain.encoding || null) + ", ") + + vega_util_1.stringValue(selDomain.field || null) + + (selCmpt.resolve === 'global' ? ')' : ", " + vega_util_1.stringValue(selCmpt.resolve) + ")") + }; + } + return { signal: 'null' }; +} +exports.selectionScaleDomain = selectionScaleDomain; +// Utility functions +function forEachSelection(model, cb) { + var selections = model.component.selection; + for (var name_3 in selections) { + if (selections.hasOwnProperty(name_3)) { + var sel = selections[name_3]; + cb(sel, compiler(sel.type)); + } + } +} +function compiler(type) { + switch (type) { + case 'single': + return single_1.default; + case 'multi': + return multi_1.default; + case 'interval': + return interval_1.default; + } + return null; +} +function getFacetModel(model) { + var parent = model.parent; + while (parent) { + if (model_1.isFacetModel(parent)) { + break; + } + parent = parent.parent; + } + return parent; +} +function unitName(model) { + var name = vega_util_1.stringValue(model.name); + var facet = getFacetModel(model); + if (facet) { + name += (facet.facet.row ? " + '_' + (" + util_1.accessPathWithDatum(facet.vgField('row'), 'facet') + ")" : '') + + (facet.facet.column ? " + '_' + (" + util_1.accessPathWithDatum(facet.vgField('column'), 'facet') + ")" : ''); + } + return name; +} +exports.unitName = unitName; +function requiresSelectionId(model) { + var identifier = false; + forEachSelection(model, function (selCmpt) { + identifier = identifier || selCmpt.project.some(function (proj) { return proj.field === selection_1.SELECTION_ID; }); + }); + return identifier; +} +exports.requiresSelectionId = requiresSelectionId; +function channelSignalName(selCmpt, channel, range) { + var sgNames = selCmpt._signalNames || (selCmpt._signalNames = {}); + if (sgNames[channel] && sgNames[channel][range]) { + return sgNames[channel][range]; + } + sgNames[channel] = sgNames[channel] || {}; + var basename = util_1.varName(selCmpt.name + '_' + (range === 'visual' ? channel : selCmpt.fields[channel])); + var name = basename; + var counter = 1; + while (sgNames[name]) { + name = basename + "_" + counter++; + } + return (sgNames[name] = sgNames[channel][range] = name); +} +exports.channelSignalName = channelSignalName; +function positionalProjections(selCmpt) { + var x = null; + var xi = null; + var y = null; + var yi = null; + selCmpt.project.forEach(function (p, i) { + if (p.channel === channel_1.X) { + x = p; + xi = i; + } + else if (p.channel === channel_1.Y) { + y = p; + yi = i; + } + }); + return { x: x, xi: xi, y: y, yi: yi }; +} +exports.positionalProjections = positionalProjections; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyREFBOEQ7QUFDOUQsdUNBQWdEO0FBQ2hELHlDQUEwRDtBQUMxRCxpQ0FBK0I7QUFFL0IsNkNBQTRHO0FBQzVHLG1DQUEyRTtBQU0zRSxrQ0FBMEQ7QUFFMUQsZ0VBQTBDO0FBQzFDLDBEQUFvQztBQUVwQyw0REFBc0M7QUFDdEMsc0RBQXlEO0FBRzVDLFFBQUEsS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUNqQixRQUFBLEtBQUssR0FBRyxRQUFRLENBQUM7QUFDakIsUUFBQSxNQUFNLEdBQUcsU0FBUyxDQUFDO0FBQ25CLFFBQUEsZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUF1Q3JELDRCQUFtQyxLQUFnQixFQUFFLE9BQTJCO0lBQzlFLElBQU0sUUFBUSxHQUE2QixFQUFFLENBQUM7SUFDOUMsSUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7NEJBRXRDLE1BQUk7UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFJLENBQUMsRUFBRTs7U0FFbEM7UUFFRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBSSxDQUFDLENBQUM7UUFDN0IsSUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxzRUFBc0U7UUFDdEUsbUVBQW1FO1FBQ25FLHVFQUF1RTtRQUN2RSxzQ0FBc0M7UUFDdEMsS0FBSyxJQUFNLEdBQUcsSUFBSSxHQUFHLEVBQUU7WUFDckIsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FB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QUUsQ0FBQyxHQUFBLEVBQUUsRUFBRSxJQUFBLEVBQUMsQ0FBQztBQUN4QixDQUFDO0FBaEJELHNEQWdCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2VsZWN0b3IgYXMgcGFyc2VTZWxlY3Rvcn0gZnJvbSAndmVnYS1ldmVudC1zZWxlY3Rvcic7XG5pbXBvcnQge2lzU3RyaW5nLCBzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgU2NhbGVDaGFubmVsLCBYLCBZfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7d2Fybn0gZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtCcnVzaENvbmZpZywgU0VMRUNUSU9OX0lELCBTZWxlY3Rpb25EZWYsIFNlbGVjdGlvblJlc29sdXRpb24sIFNlbGVjdGlvblR5cGV9IGZyb20gJy4uLy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge2FjY2Vzc1BhdGhXaXRoRGF0dW0sIERpY3QsIGxvZ2ljYWxFeHByLCB2YXJOYW1lfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdCaW5kaW5nLCBWZ0RhdGEsIFZnRXZlbnRTdHJlYW0sIFZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi4vZGF0YS9kYXRhZmxvdyc7XG5pbXBvcnQge1RpbWVVbml0Tm9kZX0gZnJvbSAnLi4vZGF0YS90aW1ldW5pdCc7XG5pbXBvcnQge0ZhY2V0TW9kZWx9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7TGF5ZXJNb2RlbH0gZnJvbSAnLi4vbGF5ZXInO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IGludGVydmFsQ29tcGlsZXIgZnJvbSAnLi9pbnRlcnZhbCc7XG5pbXBvcnQgbXVsdGlDb21waWxlciBmcm9tICcuL211bHRpJztcbmltcG9ydCB7U2VsZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgc2luZ2xlQ29tcGlsZXIgZnJvbSAnLi9zaW5nbGUnO1xuaW1wb3J0IHtmb3JFYWNoVHJhbnNmb3JtfSBmcm9tICcuL3RyYW5zZm9ybXMvdHJhbnNmb3Jtcyc7XG5cblxuZXhwb3J0IGNvbnN0IFNUT1JFID0gJ19zdG9yZSc7XG5leHBvcnQgY29uc3QgVFVQTEUgPSAnX3R1cGxlJztcbmV4cG9ydCBjb25zdCBNT0RJRlkgPSAnX21vZGlmeSc7XG5leHBvcnQgY29uc3QgU0VMRUNUSU9OX0RPTUFJTiA9ICdfc2VsZWN0aW9uX2RvbWFpbl8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvbkNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogU2VsZWN0aW9uVHlwZTtcbiAgZXZlbnRzOiBWZ0V2ZW50U3RyZWFtO1xuICAvLyBwcmVkaWNhdGU/OiBzdHJpbmc7XG4gIGJpbmQ/OiAnc2NhbGVzJyB8IFZnQmluZGluZyB8IHtba2V5OiBzdHJpbmddOiBWZ0JpbmRpbmd9O1xuICByZXNvbHZlOiBTZWxlY3Rpb25SZXNvbHV0aW9uO1xuICBlbXB0eTogJ2FsbCcgfCAnbm9uZSc7XG4gIG1hcms/OiBCcnVzaENvbmZpZztcblxuICBfc2lnbmFsTmFtZXM6IHt9O1xuXG4gIC8vIFRyYW5zZm9ybXNcbiAgcHJvamVjdD86IFByb2plY3RDb21wb25lbnRbXTtcbiAgZmllbGRzPzogYW55O1xuICB0aW1lVW5pdD86IFRpbWVVbml0Tm9kZTtcbiAgc2NhbGVzPzogQ2hhbm5lbFtdO1xuICB0b2dnbGU/OiBhbnk7XG4gIHRyYW5zbGF0ZT86IGFueTtcbiAgem9vbT86IGFueTtcbiAgbmVhcmVzdD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29tcG9uZW50IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBTY2FsZUNoYW5uZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uQ29tcGlsZXIge1xuICBzaWduYWxzOiAobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50KSA9PiBhbnlbXTtcbiAgdG9wTGV2ZWxTaWduYWxzPzogKG1vZGVsOiBNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBzaWduYWxzOiBhbnlbXSkgPT4gYW55W107XG4gIG1vZGlmeUV4cHI6IChtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQpID0+IHN0cmluZztcbiAgbWFya3M/OiAobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDpTZWxlY3Rpb25Db21wb25lbnQsIG1hcmtzOiBhbnlbXSkgPT4gYW55W107XG4gIHByZWRpY2F0ZTogc3RyaW5nOyAgLy8gVmVnYSBleHByIHN0cmluZyB0byBkZXRlcm1pbmUgaW5jbHVzaW9uIGluIHNlbGVjdGlvbi5cbiAgc2NhbGVEb21haW46IHN0cmluZzsgIC8vIFZlZ2EgZXhwciBzdHJpbmcgdG8gbWF0ZXJpYWxpemUgYSBzY2FsZSBkb21haW4uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRTZWxlY3Rpb24obW9kZWw6IFVuaXRNb2RlbCwgc2VsRGVmczogRGljdDxTZWxlY3Rpb25EZWY+KSB7XG4gIGNvbnN0IHNlbENtcHRzOiBEaWN0PFNlbGVjdGlvbkNvbXBvbmVudD4gPSB7fTtcbiAgY29uc3Qgc2VsZWN0aW9uQ29uZmlnID0gbW9kZWwuY29uZmlnLnNlbGVjdGlvbjtcblxuICBmb3IgKGxldCBuYW1lIGluIHNlbERlZnMpIHtcbiAgICBpZiAoIXNlbERlZnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbERlZiA9IHNlbERlZnNbbmFtZV07XG4gICAgY29uc3QgY2ZnID0gc2VsZWN0aW9uQ29uZmlnW3NlbERlZi50eXBlXTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmcm9tIGNvbmZpZyBpZiBhIHByb3BlcnR5IGhhc24ndCBiZWVuIHNwZWNpZmllZCxcbiAgICAvLyBvciBpZiBpdCBpcyB0cnVlLiBFLmcuLCBcInRyYW5zbGF0ZVwiOiB0cnVlIHNob3VsZCB1c2UgdGhlIGRlZmF1bHRcbiAgICAvLyBldmVudCBoYW5kbGVycyBmb3IgdHJhbnNsYXRlLiBIb3dldmVyLCB0cnVlIG1heSBiZSBhIHZhbGlkIHZhbHVlIGZvclxuICAgIC8vIGEgcHJvcGVydHkgKGUuZy4sIFwibmVhcmVzdFwiOiB0cnVlKS5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjZmcpIHtcbiAgICAgIC8vIEEgc2VsZWN0aW9uIHNob3VsZCBjb250YWluIGVpdGhlciBgZW5jb2RpbmdzYCBvciBgZmllbGRzYCwgb25seSB1c2VcbiAgICAgIC8vIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZSB0d28gdmFsdWVzIGlmIG5laXRoZXIgb2YgdGhlbSBpcyBzcGVjaWZpZWQuXG4gICAgICBpZiAoKGtleSA9PT0gJ2VuY29kaW5ncycgJiYgc2VsRGVmLmZpZWxkcykgfHwgKGtleSA9PT0gJ2ZpZWxkcycgJiYgc2VsRGVmLmVuY29kaW5ncykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdtYXJrJykge1xuICAgICAgICBzZWxEZWZba2V5XSA9IHsuLi5jZmdba2V5XSwgLi4uc2VsRGVmW2tleV19O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsRGVmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBzZWxEZWZba2V5XSA9PT0gdHJ1ZSkge1xuICAgICAgICBzZWxEZWZba2V5XSA9IGNmZ1trZXldIHx8IHNlbERlZltrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5hbWUgPSB2YXJOYW1lKG5hbWUpO1xuICAgIGNvbnN0IHNlbENtcHQgPSBzZWxDbXB0c1tuYW1lXSA9IHtcbiAgICAgIC4uLnNlbERlZixcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBldmVudHM6IGlzU3RyaW5nKHNlbERlZi5vbikgPyBwYXJzZVNlbGVjdG9yKHNlbERlZi5vbiwgJ3Njb3BlJykgOiBzZWxEZWYub24sXG4gICAgfSBhcyBTZWxlY3Rpb25Db21wb25lbnQ7XG5cbiAgICBmb3JFYWNoVHJhbnNmb3JtKHNlbENtcHQsIHR4Q29tcGlsZXIgPT4ge1xuICAgICAgaWYgKHR4Q29tcGlsZXIucGFyc2UpIHtcbiAgICAgICAgdHhDb21waWxlci5wYXJzZShtb2RlbCwgc2VsRGVmLCBzZWxDbXB0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWxDbXB0cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWw6IFVuaXRNb2RlbCwgc2lnbmFsczogYW55W10pIHtcbiAgZm9yRWFjaFNlbGVjdGlvbihtb2RlbCwgKHNlbENtcHQsIHNlbENvbXBpbGVyKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBsZXQgbW9kaWZ5RXhwciA9IHNlbENvbXBpbGVyLm1vZGlmeUV4cHIobW9kZWwsIHNlbENtcHQpO1xuXG4gICAgc2lnbmFscy5wdXNoLmFwcGx5KHNpZ25hbHMsIHNlbENvbXBpbGVyLnNpZ25hbHMobW9kZWwsIHNlbENtcHQpKTtcblxuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgdHhDb21waWxlciA9PiB7XG4gICAgICBpZiAodHhDb21waWxlci5zaWduYWxzKSB7XG4gICAgICAgIHNpZ25hbHMgPSB0eENvbXBpbGVyLnNpZ25hbHMobW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHR4Q29tcGlsZXIubW9kaWZ5RXhwcikge1xuICAgICAgICBtb2RpZnlFeHByID0gdHhDb21waWxlci5tb2RpZnlFeHByKG1vZGVsLCBzZWxDbXB0LCBtb2RpZnlFeHByKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNpZ25hbHMucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lICsgTU9ESUZZLFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czoge3NpZ25hbDogbmFtZSArIFRVUExFfSxcbiAgICAgICAgdXBkYXRlOiBgbW9kaWZ5KCR7c3RyaW5nVmFsdWUoc2VsQ21wdC5uYW1lICsgU1RPUkUpfSwgJHttb2RpZnlFeHByfSlgXG4gICAgICB9XVxuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBmYWNldE1vZGVsID0gZ2V0RmFjZXRNb2RlbChtb2RlbCk7XG4gIGlmIChzaWduYWxzLmxlbmd0aCAmJiBmYWNldE1vZGVsKSB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZ1ZhbHVlKGZhY2V0TW9kZWwuZ2V0TmFtZSgnY2VsbCcpKTtcbiAgICBzaWduYWxzLnVuc2hpZnQoe1xuICAgICAgbmFtZTogJ2ZhY2V0JyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IHBhcnNlU2VsZWN0b3IoJ21vdXNlbW92ZScsICdzY29wZScpLFxuICAgICAgICB1cGRhdGU6IGBpc1R1cGxlKGZhY2V0KSA/IGZhY2V0IDogZ3JvdXAoJHtuYW1lfSkuZGF0dW1gXG4gICAgICB9XVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVRvcExldmVsU2lnbmFscyhtb2RlbDogVW5pdE1vZGVsLCBzaWduYWxzOiBhbnlbXSkge1xuICBsZXQgbmVlZHNVbml0ID0gZmFsc2U7XG4gIGZvckVhY2hTZWxlY3Rpb24obW9kZWwsIChzZWxDbXB0LCBzZWxDb21waWxlcikgPT4ge1xuICAgIGlmIChzZWxDb21waWxlci50b3BMZXZlbFNpZ25hbHMpIHtcbiAgICAgIHNpZ25hbHMgPSBzZWxDb21waWxlci50b3BMZXZlbFNpZ25hbHMobW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpO1xuICAgIH1cblxuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgdHhDb21waWxlciA9PiB7XG4gICAgICBpZiAodHhDb21waWxlci50b3BMZXZlbFNpZ25hbHMpIHtcbiAgICAgICAgc2lnbmFscyA9IHR4Q29tcGlsZXIudG9wTGV2ZWxTaWduYWxzKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG5lZWRzVW5pdCA9IHRydWU7XG4gIH0pO1xuXG4gIGlmIChuZWVkc1VuaXQpIHtcbiAgICBjb25zdCBoYXNVbml0ID0gc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3VuaXQnKTtcbiAgICBpZiAoIShoYXNVbml0Lmxlbmd0aCkpIHtcbiAgICAgIHNpZ25hbHMudW5zaGlmdCh7XG4gICAgICAgIG5hbWU6ICd1bml0JyxcbiAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICBvbjogW3tldmVudHM6ICdtb3VzZW1vdmUnLCB1cGRhdGU6ICdpc1R1cGxlKGdyb3VwKCkpID8gZ3JvdXAoKSA6IHVuaXQnfV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaWduYWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVbml0U2VsZWN0aW9uRGF0YShtb2RlbDogVW5pdE1vZGVsLCBkYXRhOiBWZ0RhdGFbXSk6IFZnRGF0YVtdIHtcbiAgZm9yRWFjaFNlbGVjdGlvbihtb2RlbCwgc2VsQ21wdCA9PiB7XG4gICAgY29uc3QgY29udGFpbnMgPSBkYXRhLmZpbHRlcigoZCkgPT4gZC5uYW1lID09PSBzZWxDbXB0Lm5hbWUgKyBTVE9SRSk7XG4gICAgaWYgKCFjb250YWlucy5sZW5ndGgpIHtcbiAgICAgIGRhdGEucHVzaCh7bmFtZTogc2VsQ21wdC5uYW1lICsgU1RPUkV9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVbml0U2VsZWN0aW9uTWFya3MobW9kZWw6IFVuaXRNb2RlbCwgbWFya3M6IGFueVtdKTogYW55W10ge1xuICBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsLCAoc2VsQ21wdCwgc2VsQ29tcGlsZXIpID0+IHtcbiAgICBtYXJrcyA9IHNlbENvbXBpbGVyLm1hcmtzID8gc2VsQ29tcGlsZXIubWFya3MobW9kZWwsIHNlbENtcHQsIG1hcmtzKSA6IG1hcmtzO1xuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgKHR4Q29tcGlsZXIpID0+IHtcbiAgICAgIGlmICh0eENvbXBpbGVyLm1hcmtzKSB7XG4gICAgICAgIG1hcmtzID0gdHhDb21waWxlci5tYXJrcyhtb2RlbCwgc2VsQ21wdCwgbWFya3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gbWFya3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUxheWVyU2VsZWN0aW9uTWFya3MobW9kZWw6IExheWVyTW9kZWwsIG1hcmtzOiBhbnlbXSk6IGFueVtdIHtcbiAgbW9kZWwuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgaWYgKGlzVW5pdE1vZGVsKGNoaWxkKSkge1xuICAgICAgbWFya3MgPSBhc3NlbWJsZVVuaXRTZWxlY3Rpb25NYXJrcyhjaGlsZCwgbWFya3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uUHJlZGljYXRlKG1vZGVsOiBNb2RlbCwgc2VsZWN0aW9uczogTG9naWNhbE9wZXJhbmQ8c3RyaW5nPiwgZGZub2RlPzogRGF0YUZsb3dOb2RlKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RvcmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmdW5jdGlvbiBleHByKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgdm5hbWUgPSB2YXJOYW1lKG5hbWUpO1xuICAgIGNvbnN0IHNlbENtcHQgPSBtb2RlbC5nZXRTZWxlY3Rpb25Db21wb25lbnQodm5hbWUsIG5hbWUpO1xuICAgIGNvbnN0IHN0b3JlID0gc3RyaW5nVmFsdWUodm5hbWUgKyBTVE9SRSk7XG5cbiAgICBpZiAoc2VsQ21wdC50aW1lVW5pdCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBkZm5vZGUgfHwgbW9kZWwuY29tcG9uZW50LmRhdGEucmF3O1xuICAgICAgY29uc3QgdHVub2RlID0gc2VsQ21wdC50aW1lVW5pdC5jbG9uZSgpO1xuICAgICAgaWYgKGNoaWxkLnBhcmVudCkge1xuICAgICAgICB0dW5vZGUuaW5zZXJ0QXNQYXJlbnRPZihjaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSB0dW5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbENtcHQuZW1wdHkgIT09ICdub25lJykge1xuICAgICAgc3RvcmVzLnB1c2goc3RvcmUpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21waWxlcihzZWxDbXB0LnR5cGUpLnByZWRpY2F0ZSArIGAoJHtzdG9yZX0sIGRhdHVtYCArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/ICcpJyA6IGAsICR7c3RyaW5nVmFsdWUoc2VsQ21wdC5yZXNvbHZlKX0pYCk7XG4gIH1cblxuICBjb25zdCBwcmVkaWNhdGVTdHIgPSBsb2dpY2FsRXhwcihzZWxlY3Rpb25zLCBleHByKTtcbiAgcmV0dXJuIChzdG9yZXMubGVuZ3RoXG4gICAgPyAnISgnICsgc3RvcmVzLm1hcCgocykgPT4gYGxlbmd0aChkYXRhKCR7c30pKWApLmpvaW4oJyB8fCAnKSArICcpIHx8ICdcbiAgICA6ICcnXG4gICkgKyBgKCR7cHJlZGljYXRlU3RyfSlgO1xufVxuXG4vLyBTZWxlY3Rpb25zIGFyZSBwYXJzZWQgX2FmdGVyXyBzY2FsZXMuIElmIGEgc2NhbGUgZG9tYWluIGlzIHNldCB0b1xuLy8gdXNlIGEgc2VsZWN0aW9uLCB0aGUgU0VMRUNUSU9OX0RPTUFJTiBjb25zdGFudCBpcyB1c2VkIGFzIHRoZVxuLy8gZG9tYWluUmF3LnNpZ25hbCBkdXJpbmcgc2NhbGUucGFyc2UgYW5kIHRoZW4gcmVwbGFjZWQgd2l0aCB0aGUgbmVjZXNzYXJ5XG4vLyBzZWxlY3Rpb24gZXhwcmVzc2lvbiBmdW5jdGlvbiBkdXJpbmcgc2NhbGUuYXNzZW1ibGUuIFRvIG5vdCBwb2xsdXRlIHRoZVxuLy8gdHlwZSBzaWduYXR1cmVzIHRvIGFjY291bnQgZm9yIHRoaXMgc2V0dXAsIHRoZSBzZWxlY3Rpb24gZG9tYWluIGRlZmluaXRpb25cbi8vIGlzIGNvZXJjZWQgdG8gYSBzdHJpbmcgYW5kIGFwcGVuZGVkIHRvIFNFTEVDVElPTl9ET01BSU4uXG5leHBvcnQgZnVuY3Rpb24gaXNSYXdTZWxlY3Rpb25Eb21haW4oZG9tYWluUmF3OiBWZ1NpZ25hbFJlZikge1xuICByZXR1cm4gZG9tYWluUmF3LnNpZ25hbC5pbmRleE9mKFNFTEVDVElPTl9ET01BSU4pID49IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uU2NhbGVEb21haW4obW9kZWw6IE1vZGVsLCBkb21haW5SYXc6IFZnU2lnbmFsUmVmKTogVmdTaWduYWxSZWYge1xuICBjb25zdCBzZWxEb21haW4gPSBKU09OLnBhcnNlKGRvbWFpblJhdy5zaWduYWwucmVwbGFjZShTRUxFQ1RJT05fRE9NQUlOLCAnJykpO1xuICBjb25zdCBuYW1lID0gdmFyTmFtZShzZWxEb21haW4uc2VsZWN0aW9uKTtcblxuICBsZXQgc2VsQ21wdCA9IG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gJiYgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbltuYW1lXTtcbiAgaWYgKHNlbENtcHQpIHtcbiAgICB3YXJuKCdVc2UgXCJiaW5kXCI6IFwic2NhbGVzXCIgdG8gc2V0dXAgYSBiaW5kaW5nIGZvciBzY2FsZXMgYW5kIHNlbGVjdGlvbnMgd2l0aGluIHRoZSBzYW1lIHZpZXcuJyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsQ21wdCA9IG1vZGVsLmdldFNlbGVjdGlvbkNvbXBvbmVudChuYW1lLCBzZWxEb21haW4uc2VsZWN0aW9uKTtcbiAgICBpZiAoIXNlbERvbWFpbi5lbmNvZGluZyAmJiAhc2VsRG9tYWluLmZpZWxkKSB7XG4gICAgICBzZWxEb21haW4uZmllbGQgPSBzZWxDbXB0LnByb2plY3RbMF0uZmllbGQ7XG4gICAgICBpZiAoc2VsQ21wdC5wcm9qZWN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgd2FybignQSBcImZpZWxkXCIgb3IgXCJlbmNvZGluZ1wiIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdXNpbmcgYSBzZWxlY3Rpb24gYXMgYSBzY2FsZSBkb21haW4uICcgK1xuICAgICAgICBgVXNpbmcgXCJmaWVsZFwiOiAke3N0cmluZ1ZhbHVlKHNlbERvbWFpbi5maWVsZCl9LmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiBjb21waWxlcihzZWxDbXB0LnR5cGUpLnNjYWxlRG9tYWluICtcbiAgICAgICAgYCgke3N0cmluZ1ZhbHVlKG5hbWUgKyBTVE9SRSl9LCAke3N0cmluZ1ZhbHVlKHNlbERvbWFpbi5lbmNvZGluZyB8fCBudWxsKX0sIGAgK1xuICAgICAgICAgIHN0cmluZ1ZhbHVlKHNlbERvbWFpbi5maWVsZCB8fCBudWxsKSArXG4gICAgICAgICAgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgPyAnKScgOiBgLCAke3N0cmluZ1ZhbHVlKHNlbENtcHQucmVzb2x2ZSl9KWApXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7c2lnbmFsOiAnbnVsbCd9O1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuXG5mdW5jdGlvbiBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsOiBNb2RlbCwgY2I6IChzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIHNlbENvbXBpbGVyOiBTZWxlY3Rpb25Db21waWxlcikgPT4gdm9pZCkge1xuICBjb25zdCBzZWxlY3Rpb25zID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgZm9yIChjb25zdCBuYW1lIGluIHNlbGVjdGlvbnMpIHtcbiAgICBpZiAoc2VsZWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uc1tuYW1lXTtcbiAgICAgIGNiKHNlbCwgY29tcGlsZXIoc2VsLnR5cGUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZXIodHlwZTogU2VsZWN0aW9uVHlwZSk6IFNlbGVjdGlvbkNvbXBpbGVyIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgIHJldHVybiBzaW5nbGVDb21waWxlcjtcbiAgICBjYXNlICdtdWx0aSc6XG4gICAgICByZXR1cm4gbXVsdGlDb21waWxlcjtcbiAgICBjYXNlICdpbnRlcnZhbCc6XG4gICAgICByZXR1cm4gaW50ZXJ2YWxDb21waWxlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RmFjZXRNb2RlbChtb2RlbDogTW9kZWwpOiBGYWNldE1vZGVsIHtcbiAgbGV0IHBhcmVudCA9IG1vZGVsLnBhcmVudDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChpc0ZhY2V0TW9kZWwocGFyZW50KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gcGFyZW50IGFzIEZhY2V0TW9kZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bml0TmFtZShtb2RlbDogTW9kZWwpIHtcbiAgbGV0IG5hbWUgPSBzdHJpbmdWYWx1ZShtb2RlbC5uYW1lKTtcbiAgY29uc3QgZmFjZXQgPSBnZXRGYWNldE1vZGVsKG1vZGVsKTtcbiAgaWYgKGZhY2V0KSB7XG4gICAgbmFtZSArPSAoZmFjZXQuZmFjZXQucm93ID8gYCArICdfJyArICgke2FjY2Vzc1BhdGhXaXRoRGF0dW0oZmFjZXQudmdGaWVsZCgncm93JyksICdmYWNldCcpfSlgIDogJycpXG4gICAgICArIChmYWNldC5mYWNldC5jb2x1bW4gPyBgICsgJ18nICsgKCR7YWNjZXNzUGF0aFdpdGhEYXR1bShmYWNldC52Z0ZpZWxkKCdjb2x1bW4nKSwgJ2ZhY2V0Jyl9KWAgOiAnJyk7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc1NlbGVjdGlvbklkKG1vZGVsOiBNb2RlbCkge1xuICBsZXQgaWRlbnRpZmllciA9IGZhbHNlO1xuICBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsLCAoc2VsQ21wdCkgPT4ge1xuICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyIHx8IHNlbENtcHQucHJvamVjdC5zb21lKChwcm9qKSA9PiBwcm9qLmZpZWxkID09PSBTRUxFQ1RJT05fSUQpO1xuICB9KTtcbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIGNoYW5uZWw6IENoYW5uZWwsIHJhbmdlOiAndmlzdWFsJyB8ICdkYXRhJykge1xuICBjb25zdCBzZ05hbWVzID0gc2VsQ21wdC5fc2lnbmFsTmFtZXMgfHwgKHNlbENtcHQuX3NpZ25hbE5hbWVzID0ge30pO1xuICBpZiAoc2dOYW1lc1tjaGFubmVsXSAmJiBzZ05hbWVzW2NoYW5uZWxdW3JhbmdlXSkge1xuICAgIHJldHVybiBzZ05hbWVzW2NoYW5uZWxdW3JhbmdlXTtcbiAgfVxuXG4gIHNnTmFtZXNbY2hhbm5lbF0gPSBzZ05hbWVzW2NoYW5uZWxdIHx8IHt9O1xuICBjb25zdCBiYXNlbmFtZSA9IHZhck5hbWUoc2VsQ21wdC5uYW1lICsgJ18nICsgKHJhbmdlID09PSAndmlzdWFsJyA/IGNoYW5uZWwgOiBzZWxDbXB0LmZpZWxkc1tjaGFubmVsXSkpO1xuICBsZXQgbmFtZSA9IGJhc2VuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG4gIHdoaWxlIChzZ05hbWVzW25hbWVdKSB7XG4gICAgbmFtZSA9IGAke2Jhc2VuYW1lfV8ke2NvdW50ZXIrK31gO1xuICB9XG5cbiAgcmV0dXJuIChzZ05hbWVzW25hbWVdID0gc2dOYW1lc1tjaGFubmVsXVtyYW5nZV0gPSBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uYWxQcm9qZWN0aW9ucyhzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQpIHtcbiAgbGV0IHg6UHJvamVjdENvbXBvbmVudCA9IG51bGw7XG4gIGxldCB4aTpudW1iZXIgPSBudWxsO1xuICBsZXQgeTpQcm9qZWN0Q29tcG9uZW50ID0gbnVsbDtcbiAgbGV0IHlpOiBudW1iZXIgPSBudWxsO1xuXG4gIHNlbENtcHQucHJvamVjdC5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgaWYgKHAuY2hhbm5lbCA9PT0gWCkge1xuICAgICAgeCA9IHA7XG4gICAgICB4aSA9IGk7XG4gICAgfSBlbHNlIGlmIChwLmNoYW5uZWwgPT09IFkpIHtcbiAgICAgIHkgPSBwO1xuICAgICAgeWkgPSBpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7eCwgeGksIHksIHlpfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/selection/single.d.ts b/build/src/compile/selection/single.d.ts new file mode 100644 index 0000000000..5f9c718150 --- /dev/null +++ b/build/src/compile/selection/single.d.ts @@ -0,0 +1,3 @@ +import { SelectionCompiler } from './selection'; +declare const single: SelectionCompiler; +export default single; diff --git a/build/src/compile/selection/single.js b/build/src/compile/selection/single.js new file mode 100644 index 0000000000..cc8f211580 --- /dev/null +++ b/build/src/compile/selection/single.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var multi_1 = require("./multi"); +var selection_1 = require("./selection"); +var single = { + predicate: 'vlSingle', + scaleDomain: 'vlSingleDomain', + signals: multi_1.signals, + topLevelSignals: function (model, selCmpt, signals) { + var hasSignal = signals.filter(function (s) { return s.name === selCmpt.name; }); + var data = "data(" + vega_util_1.stringValue(selCmpt.name + selection_1.STORE) + ")"; + var values = data + "[0].values"; + return hasSignal.length ? signals : signals.concat({ + name: selCmpt.name, + update: data + ".length && {" + + selCmpt.project.map(function (p, i) { return p.field + ": " + values + "[" + i + "]"; }).join(', ') + '}' + }); + }, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + selection_1.TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'true' : "{unit: " + selection_1.unitName(model) + "}"); + } +}; +exports.default = single; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NpbmdsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHVDQUFzQztBQUV0QyxpQ0FBZ0Q7QUFDaEQseUNBQXNFO0FBR3RFLElBQU0sTUFBTSxHQUFxQjtJQUMvQixTQUFTLEVBQUUsVUFBVTtJQUNyQixXQUFXLEVBQUUsZ0JBQWdCO0lBRTdCLE9BQU8sRUFBRSxlQUFZO0lBRXJCLGVBQWUsRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUMvQyxJQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUF2QixDQUF1QixDQUFDLENBQUM7UUFDakUsSUFBTSxJQUFJLEdBQUcsVUFBUSx1QkFBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsaUJBQUssQ0FBQyxNQUFHLENBQUM7UUFDMUQsSUFBTSxNQUFNLEdBQU0sSUFBSSxlQUFZLENBQUM7UUFDbkMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBSyxJQUFJLGlCQUFjO2dCQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBRyxDQUFDLENBQUMsS0FBSyxVQUFLLE1BQU0sU0FBSSxDQUFDLE1BQUcsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO1NBQ2hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTztRQUNqQyxJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLGlCQUFLLENBQUM7UUFDakMsT0FBTyxHQUFHLEdBQUcsSUFBSTtZQUNmLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBVSxvQkFBUSxDQUFDLEtBQUssQ0FBQyxNQUFHLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YsQ0FBQztBQUVGLGtCQUFlLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c3RyaW5nVmFsdWV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7c2lnbmFscyBhcyBtdWx0aVNpZ25hbHN9IGZyb20gJy4vbXVsdGknO1xuaW1wb3J0IHtTZWxlY3Rpb25Db21waWxlciwgU1RPUkUsIFRVUExFLCB1bml0TmFtZX0gZnJvbSAnLi9zZWxlY3Rpb24nO1xuXG5cbmNvbnN0IHNpbmdsZTpTZWxlY3Rpb25Db21waWxlciA9IHtcbiAgcHJlZGljYXRlOiAndmxTaW5nbGUnLFxuICBzY2FsZURvbWFpbjogJ3ZsU2luZ2xlRG9tYWluJyxcblxuICBzaWduYWxzOiBtdWx0aVNpZ25hbHMsXG5cbiAgdG9wTGV2ZWxTaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIGNvbnN0IGhhc1NpZ25hbCA9IHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09IHNlbENtcHQubmFtZSk7XG4gICAgY29uc3QgZGF0YSA9IGBkYXRhKCR7c3RyaW5nVmFsdWUoc2VsQ21wdC5uYW1lICsgU1RPUkUpfSlgO1xuICAgIGNvbnN0IHZhbHVlcyA9IGAke2RhdGF9WzBdLnZhbHVlc2A7XG4gICAgcmV0dXJuIGhhc1NpZ25hbC5sZW5ndGggPyBzaWduYWxzIDogc2lnbmFscy5jb25jYXQoe1xuICAgICAgbmFtZTogc2VsQ21wdC5uYW1lLFxuICAgICAgdXBkYXRlOiBgJHtkYXRhfS5sZW5ndGggJiYge2AgK1xuICAgICAgICBzZWxDbXB0LnByb2plY3QubWFwKChwLCBpKSA9PiBgJHtwLmZpZWxkfTogJHt2YWx1ZXN9WyR7aX1dYCkuam9pbignLCAnKSArICd9J1xuICAgIH0pO1xuICB9LFxuXG4gIG1vZGlmeUV4cHI6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0KSB7XG4gICAgY29uc3QgdHBsID0gc2VsQ21wdC5uYW1lICsgVFVQTEU7XG4gICAgcmV0dXJuIHRwbCArICcsICcgK1xuICAgICAgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgPyAndHJ1ZScgOiBge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2luZ2xlO1xuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/transforms/inputs.d.ts b/build/src/compile/selection/transforms/inputs.d.ts new file mode 100644 index 0000000000..373049cd38 --- /dev/null +++ b/build/src/compile/selection/transforms/inputs.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const inputBindings: TransformCompiler; +export default inputBindings; diff --git a/build/src/compile/selection/transforms/inputs.js b/build/src/compile/selection/transforms/inputs.js new file mode 100644 index 0000000000..bb0b66f69b --- /dev/null +++ b/build/src/compile/selection/transforms/inputs.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var util_1 = require("../../../util"); +var selection_1 = require("../selection"); +var nearest_1 = tslib_1.__importDefault(require("./nearest")); +var inputBindings = { + has: function (selCmpt) { + return selCmpt.type === 'single' && selCmpt.resolve === 'global' && + selCmpt.bind && selCmpt.bind !== 'scales'; + }, + topLevelSignals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var proj = selCmpt.project; + var bind = selCmpt.bind; + var datum = nearest_1.default.has(selCmpt) ? + '(item().isVoronoi ? datum.datum : datum)' : 'datum'; + proj.forEach(function (p) { + var sgname = util_1.varName(name + "_" + p.field); + var hasSignal = signals.filter(function (s) { return s.name === sgname; }); + if (!hasSignal.length) { + signals.unshift({ + name: sgname, + value: '', + on: [{ + events: selCmpt.events, + update: "datum && item().mark.marktype !== 'group' ? " + util_1.accessPathWithDatum(p.field, datum) + " : null" + }], + bind: bind[p.field] || bind[p.channel] || bind + }); + } + }); + return signals; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var proj = selCmpt.project; + var signal = signals.filter(function (s) { return s.name === name + selection_1.TUPLE; })[0]; + var fields = proj.map(function (p) { return vega_util_1.stringValue(p.field); }).join(', '); + var values = proj.map(function (p) { return util_1.varName(name + "_" + p.field); }); + if (values.length) { + signal.update = values.join(' && ') + " ? {fields: [" + fields + "], values: [" + values.join(', ') + "]} : null"; + } + delete signal.value; + delete signal.on; + return signals; + } +}; +exports.default = inputBindings; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvaW5wdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFzQztBQUN0QyxzQ0FBMkQ7QUFDM0QsMENBQW1DO0FBQ25DLDhEQUFnQztBQUloQyxJQUFNLGFBQWEsR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUM5RCxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDL0MsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBTSxLQUFLLEdBQUcsaUJBQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRXZELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBUyxDQUFDO1lBQ3JCLElBQU0sTUFBTSxHQUFHLGNBQU8sQ0FBSSxJQUFJLFNBQUksQ0FBQyxDQUFDLEtBQU8sQ0FBQyxDQUFDO1lBQzdDLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1lBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFO2dCQUNyQixPQUFPLENBQUMsT0FBTyxDQUFDO29CQUNkLElBQUksRUFBRSxNQUFNO29CQUNaLEtBQUssRUFBRSxFQUFFO29CQUNULEVBQUUsRUFBRSxDQUFDOzRCQUNILE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTs0QkFDdEIsTUFBTSxFQUFFLGlEQUErQywwQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFTO3lCQUNwRyxDQUFDO29CQUNGLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSTtpQkFDL0MsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDdkMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksR0FBRyxpQkFBSyxFQUF2QixDQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLHVCQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxjQUFPLENBQUksSUFBSSxTQUFJLENBQUMsQ0FBQyxLQUFPLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDO1FBRTlELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixNQUFNLENBQUMsTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFnQixNQUFNLG9CQUFlLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQVcsQ0FBQztTQUN6RztRQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFFakIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGLENBQUM7QUFFRixrQkFBZSxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cmluZ1ZhbHVlfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHthY2Nlc3NQYXRoV2l0aERhdHVtLCB2YXJOYW1lfSBmcm9tICcuLi8uLi8uLi91dGlsJztcbmltcG9ydCB7VFVQTEV9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQgbmVhcmVzdCBmcm9tICcuL25lYXJlc3QnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Db21waWxlcn0gZnJvbSAnLi90cmFuc2Zvcm1zJztcblxuXG5jb25zdCBpbnB1dEJpbmRpbmdzOlRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbENtcHQpIHtcbiAgICByZXR1cm4gc2VsQ21wdC50eXBlID09PSAnc2luZ2xlJyAmJiBzZWxDbXB0LnJlc29sdmUgPT09ICdnbG9iYWwnICYmXG4gICAgICBzZWxDbXB0LmJpbmQgJiYgc2VsQ21wdC5iaW5kICE9PSAnc2NhbGVzJztcbiAgfSxcblxuICB0b3BMZXZlbFNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBjb25zdCBwcm9qID0gc2VsQ21wdC5wcm9qZWN0O1xuICAgIGNvbnN0IGJpbmQgPSBzZWxDbXB0LmJpbmQ7XG4gICAgY29uc3QgZGF0dW0gPSBuZWFyZXN0LmhhcyhzZWxDbXB0KSA/XG4gICAgICAnKGl0ZW0oKS5pc1Zvcm9ub2kgPyBkYXR1bS5kYXR1bSA6IGRhdHVtKScgOiAnZGF0dW0nO1xuXG4gICAgcHJvai5mb3JFYWNoKGZ1bmN0aW9uKHApIHtcbiAgICAgIGNvbnN0IHNnbmFtZSA9IHZhck5hbWUoYCR7bmFtZX1fJHtwLmZpZWxkfWApO1xuICAgICAgY29uc3QgaGFzU2lnbmFsID0gc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gc2duYW1lKTtcbiAgICAgIGlmICghaGFzU2lnbmFsLmxlbmd0aCkge1xuICAgICAgICBzaWduYWxzLnVuc2hpZnQoe1xuICAgICAgICAgIG5hbWU6IHNnbmFtZSxcbiAgICAgICAgICB2YWx1ZTogJycsXG4gICAgICAgICAgb246IFt7XG4gICAgICAgICAgICBldmVudHM6IHNlbENtcHQuZXZlbnRzLFxuICAgICAgICAgICAgdXBkYXRlOiBgZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyAke2FjY2Vzc1BhdGhXaXRoRGF0dW0ocC5maWVsZCwgZGF0dW0pfSA6IG51bGxgXG4gICAgICAgICAgfV0sXG4gICAgICAgICAgYmluZDogYmluZFtwLmZpZWxkXSB8fCBiaW5kW3AuY2hhbm5lbF0gfHwgYmluZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduYWxzO1xuICB9LFxuXG4gIHNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBjb25zdCBwcm9qID0gc2VsQ21wdC5wcm9qZWN0O1xuICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09IG5hbWUgKyBUVVBMRSlbMF07XG4gICAgY29uc3QgZmllbGRzID0gcHJvai5tYXAoKHApID0+IHN0cmluZ1ZhbHVlKHAuZmllbGQpKS5qb2luKCcsICcpO1xuICAgIGNvbnN0IHZhbHVlcyA9IHByb2oubWFwKChwKSA9PiB2YXJOYW1lKGAke25hbWV9XyR7cC5maWVsZH1gKSk7XG5cbiAgICBpZiAodmFsdWVzLmxlbmd0aCkge1xuICAgICAgc2lnbmFsLnVwZGF0ZSA9IGAke3ZhbHVlcy5qb2luKCcgJiYgJyl9ID8ge2ZpZWxkczogWyR7ZmllbGRzfV0sIHZhbHVlczogWyR7dmFsdWVzLmpvaW4oJywgJyl9XX0gOiBudWxsYDtcbiAgICB9XG5cbiAgICBkZWxldGUgc2lnbmFsLnZhbHVlO1xuICAgIGRlbGV0ZSBzaWduYWwub247XG5cbiAgICByZXR1cm4gc2lnbmFscztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgaW5wdXRCaW5kaW5ncztcbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/selection/transforms/nearest.d.ts b/build/src/compile/selection/transforms/nearest.d.ts new file mode 100644 index 0000000000..f8969314eb --- /dev/null +++ b/build/src/compile/selection/transforms/nearest.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const nearest: TransformCompiler; +export default nearest; diff --git a/build/src/compile/selection/transforms/nearest.js b/build/src/compile/selection/transforms/nearest.js new file mode 100644 index 0000000000..a6d3d88829 --- /dev/null +++ b/build/src/compile/selection/transforms/nearest.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../../../log")); +var mark_1 = require("../../../mark"); +var selection_1 = require("../selection"); +var VORONOI = 'voronoi'; +var nearest = { + has: function (selCmpt) { + return selCmpt.type !== 'interval' && selCmpt.nearest; + }, + marks: function (model, selCmpt, marks) { + var _a = selection_1.positionalProjections(selCmpt), x = _a.x, y = _a.y; + var markType = model.mark; + if (mark_1.isPathMark(markType)) { + log.warn(log.message.nearestNotSupportForContinuous(markType)); + return marks; + } + var cellDef = { + name: model.getName(VORONOI), + type: 'path', + from: { data: model.getName('marks') }, + encode: { + enter: { + fill: { value: 'transparent' }, + strokeWidth: { value: 0.35 }, + stroke: { value: 'transparent' }, + isVoronoi: { value: true } + } + }, + transform: [{ + type: 'voronoi', + x: { expr: (x || (!x && !y)) ? 'datum.datum.x || 0' : '0' }, + y: { expr: (y || (!x && !y)) ? 'datum.datum.y || 0' : '0' }, + size: [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')] + }] + }; + var index = 0; + var exists = false; + marks.forEach(function (mark, i) { + var name = mark.name || ''; + if (name === model.component.mark[0].name) { + index = i; + } + else if (name.indexOf(VORONOI) >= 0) { + exists = true; + } + }); + if (!exists) { + marks.splice(index + 1, 0, cellDef); + } + return marks; + } +}; +exports.default = nearest; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhcmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL25lYXJlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0RBQW9DO0FBQ3BDLHNDQUF5QztBQUN6QywwQ0FBbUQ7QUFHbkQsSUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBRTFCLElBQU0sT0FBTyxHQUFxQjtJQUNoQyxHQUFHLEVBQUUsVUFBUyxPQUFPO1FBQ25CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSyxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLO1FBQzdCLElBQUEsK0NBQXVDLEVBQXRDLFFBQUMsRUFBRSxRQUFDLENBQW1DO1FBQzlDLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxpQkFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQy9ELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxJQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM1QixJQUFJLEVBQUUsTUFBTTtZQUNaLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFDO1lBQ3BDLE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUU7b0JBQ0wsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQztvQkFDNUIsV0FBVyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQztvQkFDMUIsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQztvQkFDOUIsU0FBUyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQztpQkFDekI7YUFDRjtZQUNELFNBQVMsRUFBRSxDQUFDO29CQUNWLElBQUksRUFBRSxTQUFTO29CQUNmLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQztvQkFDekQsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFDO29CQUN6RCxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUMxRSxDQUFDO1NBQ0gsQ0FBQztRQUVGLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixLQUFLLENBQUMsT0FBTyxDQUFDLFVBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDN0IsSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO2dCQUN6QyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQ1g7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDckMsTUFBTSxHQUFHLElBQUksQ0FBQzthQUNmO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGLENBQUM7QUFFRixrQkFBZSxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vbG9nJztcbmltcG9ydCB7aXNQYXRoTWFya30gZnJvbSAnLi4vLi4vLi4vbWFyayc7XG5pbXBvcnQge3Bvc2l0aW9uYWxQcm9qZWN0aW9uc30gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7VHJhbnNmb3JtQ29tcGlsZXJ9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5cbmNvbnN0IFZPUk9OT0kgPSAndm9yb25vaSc7XG5cbmNvbnN0IG5lYXJlc3Q6VHJhbnNmb3JtQ29tcGlsZXIgPSB7XG4gIGhhczogZnVuY3Rpb24oc2VsQ21wdCkge1xuICAgIHJldHVybiBzZWxDbXB0LnR5cGUgIT09ICdpbnRlcnZhbCcgJiYgc2VsQ21wdC5uZWFyZXN0O1xuICB9LFxuXG4gIG1hcmtzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgbWFya3MpIHtcbiAgICBjb25zdCB7eCwgeX0gPSBwb3NpdGlvbmFsUHJvamVjdGlvbnMoc2VsQ21wdCk7XG4gICAgY29uc3QgbWFya1R5cGUgPSBtb2RlbC5tYXJrO1xuICAgIGlmIChpc1BhdGhNYXJrKG1hcmtUeXBlKSkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UubmVhcmVzdE5vdFN1cHBvcnRGb3JDb250aW51b3VzKG1hcmtUeXBlKSk7XG4gICAgICByZXR1cm4gbWFya3M7XG4gICAgfVxuXG4gICAgY29uc3QgY2VsbERlZiA9IHtcbiAgICAgIG5hbWU6IG1vZGVsLmdldE5hbWUoVk9ST05PSSksXG4gICAgICB0eXBlOiAncGF0aCcsXG4gICAgICBmcm9tOiB7ZGF0YTogbW9kZWwuZ2V0TmFtZSgnbWFya3MnKX0sXG4gICAgICBlbmNvZGU6IHtcbiAgICAgICAgZW50ZXI6IHtcbiAgICAgICAgICBmaWxsOiB7dmFsdWU6ICd0cmFuc3BhcmVudCd9LFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiB7dmFsdWU6IDAuMzV9LFxuICAgICAgICAgIHN0cm9rZToge3ZhbHVlOiAndHJhbnNwYXJlbnQnfSxcbiAgICAgICAgICBpc1Zvcm9ub2k6IHt2YWx1ZTogdHJ1ZX1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHRyYW5zZm9ybTogW3tcbiAgICAgICAgdHlwZTogJ3Zvcm9ub2knLFxuICAgICAgICB4OiB7ZXhwcjogKHggfHwgKCF4ICYmICF5KSkgPyAnZGF0dW0uZGF0dW0ueCB8fCAwJyA6ICcwJ30sXG4gICAgICAgIHk6IHtleHByOiAoeSB8fCAoIXggJiYgIXkpKSA/ICdkYXR1bS5kYXR1bS55IHx8IDAnIDogJzAnfSxcbiAgICAgICAgc2l6ZTogW21vZGVsLmdldFNpemVTaWduYWxSZWYoJ3dpZHRoJyksIG1vZGVsLmdldFNpemVTaWduYWxSZWYoJ2hlaWdodCcpXVxuICAgICAgfV1cbiAgICB9O1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBsZXQgZXhpc3RzID0gZmFsc2U7XG4gICAgbWFya3MuZm9yRWFjaCgobWFyaywgaSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IG1hcmsubmFtZSB8fCAnJztcbiAgICAgIGlmIChuYW1lID09PSBtb2RlbC5jb21wb25lbnQubWFya1swXS5uYW1lKSB7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZS5pbmRleE9mKFZPUk9OT0kpID49IDApIHtcbiAgICAgICAgZXhpc3RzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICBtYXJrcy5zcGxpY2UoaW5kZXggKyAxLCAwLCBjZWxsRGVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFya3M7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5lYXJlc3Q7XG4iXX0= \ No newline at end of file diff --git a/build/src/compile/selection/transforms/project.d.ts b/build/src/compile/selection/transforms/project.d.ts new file mode 100644 index 0000000000..c42bdba3e3 --- /dev/null +++ b/build/src/compile/selection/transforms/project.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const project: TransformCompiler; +export default project; diff --git a/build/src/compile/selection/transforms/project.js b/build/src/compile/selection/transforms/project.js new file mode 100644 index 0000000000..ac2e4fc4f6 --- /dev/null +++ b/build/src/compile/selection/transforms/project.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../../../log")); +var util_1 = require("../../../util"); +var timeunit_1 = require("../../data/timeunit"); +var project = { + has: function (selDef) { + var def = selDef; + return def.fields !== undefined || def.encodings !== undefined; + }, + parse: function (model, selDef, selCmpt) { + var channels = {}; + var timeUnits = {}; + // TODO: find a possible channel mapping for these fields. + (selDef.fields || []).forEach(function (field) { return channels[field] = null; }); + (selDef.encodings || []).forEach(function (channel) { + var fieldDef = model.fieldDef(channel); + if (fieldDef) { + if (fieldDef.timeUnit) { + var tuField = model.vgField(channel); + channels[tuField] = channel; + // Construct TimeUnitComponents which will be combined into a + // TimeUnitNode. This node may need to be inserted into the + // dataflow if the selection is used across views that do not + // have these time units defined. + timeUnits[tuField] = { + as: tuField, + field: fieldDef.field, + timeUnit: fieldDef.timeUnit + }; + } + else { + channels[fieldDef.field] = channel; + } + } + else { + log.warn(log.message.cannotProjectOnChannelWithoutField(channel)); + } + }); + var projection = selCmpt.project || (selCmpt.project = []); + for (var field in channels) { + if (channels.hasOwnProperty(field)) { + projection.push({ field: field, channel: channels[field] }); + } + } + var fields = selCmpt.fields || (selCmpt.fields = {}); + projection.filter(function (p) { return p.channel; }).forEach(function (p) { return fields[p.channel] = p.field; }); + if (util_1.keys(timeUnits).length) { + selCmpt.timeUnit = new timeunit_1.TimeUnitNode(null, timeUnits); + } + } +}; +exports.default = project; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3Byb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esd0RBQW9DO0FBRXBDLHNDQUFtQztBQUNuQyxnREFBb0U7QUFJcEUsSUFBTSxPQUFPLEdBQXNCO0lBQ2pDLEdBQUcsRUFBRSxVQUFTLE1BQXlDO1FBQ3JELElBQU0sR0FBRyxHQUFHLE1BQXNCLENBQUM7UUFDbkMsT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsS0FBSyxFQUFFLFVBQVMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPO1FBQ3BDLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFNLFNBQVMsR0FBdUMsRUFBRSxDQUFDO1FBRXpELDBEQUEwRDtRQUMxRCxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSyxJQUFLLE9BQUEsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksRUFBdEIsQ0FBc0IsQ0FBQyxDQUFDO1FBRWpFLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxPQUF5QjtZQUN6RCxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtvQkFDckIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDdkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLE9BQU8sQ0FBQztvQkFFNUIsNkRBQTZEO29CQUM3RCwyREFBMkQ7b0JBQzNELDZEQUE2RDtvQkFDN0QsaUNBQWlDO29CQUNqQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUc7d0JBQ25CLEVBQUUsRUFBRSxPQUFPO3dCQUNYLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSzt3QkFDckIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO3FCQUM1QixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO2lCQUNwQzthQUNGO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ25FO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3RCxLQUFLLElBQU0sS0FBSyxJQUFJLFFBQVEsRUFBRTtZQUM1QixJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2xDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDO2FBQzNEO1NBQ0Y7UUFFRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2RCxVQUFVLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLE9BQU8sRUFBVCxDQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQTNCLENBQTJCLENBQUMsQ0FBQztRQUVoRixJQUFJLFdBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDMUIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztDQUNGLENBQUM7QUFFRixrQkFBZSxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NpbmdsZURlZkNoYW5uZWx9IGZyb20gJy4uLy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uLy4uL2xvZyc7XG5pbXBvcnQge1NlbGVjdGlvbkRlZn0gZnJvbSAnLi4vLi4vLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vLi4vLi4vdXRpbCc7XG5pbXBvcnQge1RpbWVVbml0Q29tcG9uZW50LCBUaW1lVW5pdE5vZGV9IGZyb20gJy4uLy4uL2RhdGEvdGltZXVuaXQnO1xuaW1wb3J0IHtTZWxlY3Rpb25Db21wb25lbnR9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge1RyYW5zZm9ybUNvbXBpbGVyfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuXG5jb25zdCBwcm9qZWN0OiBUcmFuc2Zvcm1Db21waWxlciA9IHtcbiAgaGFzOiBmdW5jdGlvbihzZWxEZWY6IFNlbGVjdGlvbkNvbXBvbmVudCB8IFNlbGVjdGlvbkRlZikge1xuICAgIGNvbnN0IGRlZiA9IHNlbERlZiBhcyBTZWxlY3Rpb25EZWY7XG4gICAgcmV0dXJuIGRlZi5maWVsZHMgIT09IHVuZGVmaW5lZCB8fCBkZWYuZW5jb2RpbmdzICE9PSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgcGFyc2U6IGZ1bmN0aW9uKG1vZGVsLCBzZWxEZWYsIHNlbENtcHQpIHtcbiAgICBjb25zdCBjaGFubmVscyA9IHt9O1xuICAgIGNvbnN0IHRpbWVVbml0czoge1trZXk6IHN0cmluZ106IFRpbWVVbml0Q29tcG9uZW50fSA9IHt9O1xuXG4gICAgLy8gVE9ETzogZmluZCBhIHBvc3NpYmxlIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhlc2UgZmllbGRzLlxuICAgIChzZWxEZWYuZmllbGRzIHx8IFtdKS5mb3JFYWNoKChmaWVsZCkgPT4gY2hhbm5lbHNbZmllbGRdID0gbnVsbCk7XG5cbiAgICAoc2VsRGVmLmVuY29kaW5ncyB8fCBbXSkuZm9yRWFjaCgoY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSBtb2RlbC5maWVsZERlZihjaGFubmVsKTtcbiAgICAgIGlmIChmaWVsZERlZikge1xuICAgICAgICBpZiAoZmllbGREZWYudGltZVVuaXQpIHtcbiAgICAgICAgICBjb25zdCB0dUZpZWxkID0gbW9kZWwudmdGaWVsZChjaGFubmVsKTtcbiAgICAgICAgICBjaGFubmVsc1t0dUZpZWxkXSA9IGNoYW5uZWw7XG5cbiAgICAgICAgICAvLyBDb25zdHJ1Y3QgVGltZVVuaXRDb21wb25lbnRzIHdoaWNoIHdpbGwgYmUgY29tYmluZWQgaW50byBhXG4gICAgICAgICAgLy8gVGltZVVuaXROb2RlLiBUaGlzIG5vZGUgbWF5IG5lZWQgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAgICAvLyBkYXRhZmxvdyBpZiB0aGUgc2VsZWN0aW9uIGlzIHVzZWQgYWNyb3NzIHZpZXdzIHRoYXQgZG8gbm90XG4gICAgICAgICAgLy8gaGF2ZSB0aGVzZSB0aW1lIHVuaXRzIGRlZmluZWQuXG4gICAgICAgICAgdGltZVVuaXRzW3R1RmllbGRdID0ge1xuICAgICAgICAgICAgYXM6IHR1RmllbGQsXG4gICAgICAgICAgICBmaWVsZDogZmllbGREZWYuZmllbGQsXG4gICAgICAgICAgICB0aW1lVW5pdDogZmllbGREZWYudGltZVVuaXRcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNoYW5uZWxzW2ZpZWxkRGVmLmZpZWxkXSA9IGNoYW5uZWw7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmNhbm5vdFByb2plY3RPbkNoYW5uZWxXaXRob3V0RmllbGQoY2hhbm5lbCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvamVjdGlvbiA9IHNlbENtcHQucHJvamVjdCB8fCAoc2VsQ21wdC5wcm9qZWN0ID0gW10pO1xuICAgIGZvciAoY29uc3QgZmllbGQgaW4gY2hhbm5lbHMpIHtcbiAgICAgIGlmIChjaGFubmVscy5oYXNPd25Qcm9wZXJ0eShmaWVsZCkpIHtcbiAgICAgICAgcHJvamVjdGlvbi5wdXNoKHtmaWVsZDogZmllbGQsIGNoYW5uZWw6IGNoYW5uZWxzW2ZpZWxkXX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkcyA9IHNlbENtcHQuZmllbGRzIHx8IChzZWxDbXB0LmZpZWxkcyA9IHt9KTtcbiAgICBwcm9qZWN0aW9uLmZpbHRlcigocCkgPT4gcC5jaGFubmVsKS5mb3JFYWNoKChwKSA9PiBmaWVsZHNbcC5jaGFubmVsXSA9IHAuZmllbGQpO1xuXG4gICAgaWYgKGtleXModGltZVVuaXRzKS5sZW5ndGgpIHtcbiAgICAgIHNlbENtcHQudGltZVVuaXQgPSBuZXcgVGltZVVuaXROb2RlKG51bGwsIHRpbWVVbml0cyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwcm9qZWN0O1xuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/transforms/scales.d.ts b/build/src/compile/selection/transforms/scales.d.ts new file mode 100644 index 0000000000..d5f9f53c01 --- /dev/null +++ b/build/src/compile/selection/transforms/scales.d.ts @@ -0,0 +1,6 @@ +import { Channel } from '../../../channel'; +import { UnitModel } from '../../unit'; +import { TransformCompiler } from './transforms'; +declare const scaleBindings: TransformCompiler; +export default scaleBindings; +export declare function domain(model: UnitModel, channel: Channel): string; diff --git a/build/src/compile/selection/transforms/scales.js b/build/src/compile/selection/transforms/scales.js new file mode 100644 index 0000000000..8e57553857 --- /dev/null +++ b/build/src/compile/selection/transforms/scales.js @@ -0,0 +1,64 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../../channel"); +var log = tslib_1.__importStar(require("../../../log")); +var scale_1 = require("../../../scale"); +var selection_1 = require("../selection"); +var scaleBindings = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.resolve === 'global' && + selCmpt.bind && selCmpt.bind === 'scales'; + }, + parse: function (model, selDef, selCmpt) { + var bound = selCmpt.scales = []; + selCmpt.project.forEach(function (p) { + var channel = p.channel; + var scale = model.getScaleComponent(channel); + var scaleType = scale ? scale.get('type') : undefined; + if (!scale || !scale_1.hasContinuousDomain(scaleType) || scale_1.isBinScale(scaleType)) { + log.warn(log.message.SCALE_BINDINGS_CONTINUOUS); + return; + } + scale.set('domainRaw', { signal: selection_1.channelSignalName(selCmpt, channel, 'data') }, true); + bound.push(channel); + // Bind both x/y for diag plot of repeated views. + if (model.repeater && model.repeater.row === model.repeater.column) { + var scale2 = model.getScaleComponent(channel === channel_1.X ? channel_1.Y : channel_1.X); + scale2.set('domainRaw', { signal: selection_1.channelSignalName(selCmpt, channel, 'data') }, true); + } + }); + }, + topLevelSignals: function (model, selCmpt, signals) { + // Top-level signals are only needed when coordinating composed views. + if (!model.parent) { + return signals; + } + var channels = selCmpt.scales.filter(function (channel) { + return !(signals.filter(function (s) { return s.name === selection_1.channelSignalName(selCmpt, channel, 'data'); }).length); + }); + return signals.concat(channels.map(function (channel) { + return { name: selection_1.channelSignalName(selCmpt, channel, 'data') }; + })); + }, + signals: function (model, selCmpt, signals) { + // Nested signals need only push to top-level signals when within composed views. + if (model.parent) { + selCmpt.scales.forEach(function (channel) { + var signal = signals.filter(function (s) { return s.name === selection_1.channelSignalName(selCmpt, channel, 'data'); })[0]; + signal.push = 'outer'; + delete signal.value; + delete signal.update; + }); + } + return signals; + } +}; +exports.default = scaleBindings; +function domain(model, channel) { + var scale = vega_util_1.stringValue(model.scaleName(channel)); + return "domain(" + scale + ")"; +} +exports.domain = domain; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvc2NhbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFzQztBQUN0Qyw0Q0FBK0M7QUFDL0Msd0RBQW9DO0FBQ3BDLHdDQUErRDtBQUUvRCwwQ0FBK0M7QUFJL0MsSUFBTSxhQUFhLEdBQXFCO0lBQ3RDLEdBQUcsRUFBRSxVQUFTLE9BQU87UUFDbkIsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVE7WUFDaEUsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxFQUFFLFVBQVMsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPO1FBQ3BDLElBQU0sS0FBSyxHQUFjLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRTdDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVMsQ0FBQztZQUNoQyxJQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQzFCLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxJQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUV4RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsMkJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksa0JBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDdEUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLENBQUM7Z0JBQ2hELE9BQU87YUFDUjtZQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUMsTUFBTSxFQUFFLDZCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXBCLGlEQUFpRDtZQUNqRCxJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xFLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEtBQUssV0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFDLENBQUMsQ0FBQyxDQUFDLFdBQUMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSw2QkFBaUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDdEY7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxlQUFlLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDL0Msc0VBQXNFO1FBQ3RFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBRUQsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPO1lBQzdDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQXRELENBQXNELENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUMsT0FBTztZQUN6QyxPQUFPLEVBQUMsSUFBSSxFQUFFLDZCQUFpQixDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEVBQUMsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxpRkFBaUY7UUFDakYsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUEsT0FBTztnQkFDNUIsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssNkJBQWlCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBdEQsQ0FBc0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUU5RixNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDdEIsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNwQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7Q0FDRixDQUFDO0FBRUYsa0JBQWUsYUFBYSxDQUFDO0FBRTdCLGdCQUF1QixLQUFnQixFQUFFLE9BQWdCO0lBQ3ZELElBQU0sS0FBSyxHQUFHLHVCQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sWUFBVSxLQUFLLE1BQUcsQ0FBQztBQUM1QixDQUFDO0FBSEQsd0JBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3N0cmluZ1ZhbHVlfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtDaGFubmVsLCBYLCBZfSBmcm9tICcuLi8uLi8uLi9jaGFubmVsJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi8uLi9sb2cnO1xuaW1wb3J0IHtoYXNDb250aW51b3VzRG9tYWluLCBpc0JpblNjYWxlfSBmcm9tICcuLi8uLi8uLi9zY2FsZSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdW5pdCc7XG5pbXBvcnQge2NoYW5uZWxTaWduYWxOYW1lfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtUcmFuc2Zvcm1Db21waWxlcn0gZnJvbSAnLi90cmFuc2Zvcm1zJztcblxuXG5jb25zdCBzY2FsZUJpbmRpbmdzOlRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbENtcHQpIHtcbiAgICByZXR1cm4gc2VsQ21wdC50eXBlID09PSAnaW50ZXJ2YWwnICYmIHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgJiZcbiAgICAgIHNlbENtcHQuYmluZCAmJiBzZWxDbXB0LmJpbmQgPT09ICdzY2FsZXMnO1xuICB9LFxuXG4gIHBhcnNlOiBmdW5jdGlvbihtb2RlbCwgc2VsRGVmLCBzZWxDbXB0KSB7XG4gICAgY29uc3QgYm91bmQ6IENoYW5uZWxbXSA9IHNlbENtcHQuc2NhbGVzID0gW107XG5cbiAgICBzZWxDbXB0LnByb2plY3QuZm9yRWFjaChmdW5jdGlvbihwKSB7XG4gICAgICBjb25zdCBjaGFubmVsID0gcC5jaGFubmVsO1xuICAgICAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IHNjYWxlID8gc2NhbGUuZ2V0KCd0eXBlJykgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghc2NhbGUgfHwgIWhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSB8fCBpc0JpblNjYWxlKHNjYWxlVHlwZSkpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuU0NBTEVfQklORElOR1NfQ09OVElOVU9VUyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2NhbGUuc2V0KCdkb21haW5SYXcnLCB7c2lnbmFsOiBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCAnZGF0YScpfSwgdHJ1ZSk7XG4gICAgICBib3VuZC5wdXNoKGNoYW5uZWwpO1xuXG4gICAgICAvLyBCaW5kIGJvdGggeC95IGZvciBkaWFnIHBsb3Qgb2YgcmVwZWF0ZWQgdmlld3MuXG4gICAgICBpZiAobW9kZWwucmVwZWF0ZXIgJiYgbW9kZWwucmVwZWF0ZXIucm93ID09PSBtb2RlbC5yZXBlYXRlci5jb2x1bW4pIHtcbiAgICAgICAgY29uc3Qgc2NhbGUyID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCA9PT0gWCA/IFkgOiBYKTtcbiAgICAgICAgc2NhbGUyLnNldCgnZG9tYWluUmF3Jywge3NpZ25hbDogY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKX0sIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuXG4gIHRvcExldmVsU2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpIHtcbiAgICAvLyBUb3AtbGV2ZWwgc2lnbmFscyBhcmUgb25seSBuZWVkZWQgd2hlbiBjb29yZGluYXRpbmcgY29tcG9zZWQgdmlld3MuXG4gICAgaWYgKCFtb2RlbC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBzaWduYWxzO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWxzID0gc2VsQ21wdC5zY2FsZXMuZmlsdGVyKChjaGFubmVsKSA9PiB7XG4gICAgICByZXR1cm4gIShzaWduYWxzLmZpbHRlcihzID0+IHMubmFtZSA9PT0gY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKSkubGVuZ3RoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBzaWduYWxzLmNvbmNhdChjaGFubmVscy5tYXAoKGNoYW5uZWwpID0+IHtcbiAgICAgIHJldHVybiB7bmFtZTogY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKX07XG4gICAgfSkpO1xuICB9LFxuXG4gIHNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKSB7XG4gICAgLy8gTmVzdGVkIHNpZ25hbHMgbmVlZCBvbmx5IHB1c2ggdG8gdG9wLWxldmVsIHNpZ25hbHMgd2hlbiB3aXRoaW4gY29tcG9zZWQgdmlld3MuXG4gICAgaWYgKG1vZGVsLnBhcmVudCkge1xuICAgICAgc2VsQ21wdC5zY2FsZXMuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgICAgY29uc3Qgc2lnbmFsID0gc2lnbmFscy5maWx0ZXIocyA9PiBzLm5hbWUgPT09IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICdkYXRhJykpWzBdO1xuXG4gICAgICAgIHNpZ25hbC5wdXNoID0gJ291dGVyJztcbiAgICAgICAgZGVsZXRlIHNpZ25hbC52YWx1ZTtcbiAgICAgICAgZGVsZXRlIHNpZ25hbC51cGRhdGU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmFscztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2NhbGVCaW5kaW5ncztcblxuZXhwb3J0IGZ1bmN0aW9uIGRvbWFpbihtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsOiBDaGFubmVsKSB7XG4gIGNvbnN0IHNjYWxlID0gc3RyaW5nVmFsdWUobW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpKTtcbiAgcmV0dXJuIGBkb21haW4oJHtzY2FsZX0pYDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/selection/transforms/toggle.d.ts b/build/src/compile/selection/transforms/toggle.d.ts new file mode 100644 index 0000000000..f6ef21b38d --- /dev/null +++ b/build/src/compile/selection/transforms/toggle.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const toggle: TransformCompiler; +export default toggle; diff --git a/build/src/compile/selection/transforms/toggle.js b/build/src/compile/selection/transforms/toggle.js new file mode 100644 index 0000000000..672bc2a2e7 --- /dev/null +++ b/build/src/compile/selection/transforms/toggle.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var selection_1 = require("../selection"); +var TOGGLE = '_toggle'; +var toggle = { + has: function (selCmpt) { + return selCmpt.type === 'multi' && selCmpt.toggle; + }, + signals: function (model, selCmpt, signals) { + return signals.concat({ + name: selCmpt.name + TOGGLE, + value: false, + on: [{ events: selCmpt.events, update: selCmpt.toggle }] + }); + }, + modifyExpr: function (model, selCmpt, expr) { + var tpl = selCmpt.name + selection_1.TUPLE; + var signal = selCmpt.name + TOGGLE; + return signal + " ? null : " + tpl + ", " + + (selCmpt.resolve === 'global' ? + signal + " ? null : true, " : + signal + " ? null : {unit: " + selection_1.unitName(model) + "}, ") + + (signal + " ? " + tpl + " : null"); + } +}; +exports.default = toggle; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvdG9nZ2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsMENBQTZDO0FBSTdDLElBQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUV6QixJQUFNLE1BQU0sR0FBcUI7SUFDL0IsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDcEQsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDcEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTTtZQUMzQixLQUFLLEVBQUUsS0FBSztZQUNaLEVBQUUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQztTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJO1FBQ3ZDLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsaUJBQUssQ0FBQztRQUNqQyxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUVyQyxPQUFVLE1BQU0sa0JBQWEsR0FBRyxPQUFJO1lBQ2xDLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsQ0FBQztnQkFDMUIsTUFBTSxxQkFBa0IsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLHlCQUFvQixvQkFBUSxDQUFDLEtBQUssQ0FBQyxRQUFLLENBQUM7YUFDakQsTUFBTSxXQUFNLEdBQUcsWUFBUyxDQUFBLENBQUM7SUFDaEMsQ0FBQztDQUNGLENBQUM7QUFFRixrQkFBZSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7VFVQTEUsIHVuaXROYW1lfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtUcmFuc2Zvcm1Db21waWxlcn0gZnJvbSAnLi90cmFuc2Zvcm1zJztcblxuXG5jb25zdCBUT0dHTEUgPSAnX3RvZ2dsZSc7XG5cbmNvbnN0IHRvZ2dsZTpUcmFuc2Zvcm1Db21waWxlciA9IHtcbiAgaGFzOiBmdW5jdGlvbihzZWxDbXB0KSB7XG4gICAgcmV0dXJuIHNlbENtcHQudHlwZSA9PT0gJ211bHRpJyAmJiBzZWxDbXB0LnRvZ2dsZTtcbiAgfSxcblxuICBzaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIHJldHVybiBzaWduYWxzLmNvbmNhdCh7XG4gICAgICBuYW1lOiBzZWxDbXB0Lm5hbWUgKyBUT0dHTEUsXG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICBvbjogW3tldmVudHM6IHNlbENtcHQuZXZlbnRzLCB1cGRhdGU6IHNlbENtcHQudG9nZ2xlfV1cbiAgICB9KTtcbiAgfSxcblxuICBtb2RpZnlFeHByOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgZXhwcikge1xuICAgIGNvbnN0IHRwbCA9IHNlbENtcHQubmFtZSArIFRVUExFO1xuICAgIGNvbnN0IHNpZ25hbCA9IHNlbENtcHQubmFtZSArIFRPR0dMRTtcblxuICAgIHJldHVybiBgJHtzaWduYWx9ID8gbnVsbCA6ICR7dHBsfSwgYCArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/XG4gICAgICAgIGAke3NpZ25hbH0gPyBudWxsIDogdHJ1ZSwgYCA6XG4gICAgICAgIGAke3NpZ25hbH0gPyBudWxsIDoge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfX0sIGApICtcbiAgICAgIGAke3NpZ25hbH0gPyAke3RwbH0gOiBudWxsYDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9nZ2xlO1xuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/transforms/transforms.d.ts b/build/src/compile/selection/transforms/transforms.d.ts new file mode 100644 index 0000000000..2bcebfc18a --- /dev/null +++ b/build/src/compile/selection/transforms/transforms.d.ts @@ -0,0 +1,14 @@ +import { SelectionDef } from '../../../selection'; +import { VgSignal } from '../../../vega.schema'; +import { Model } from '../../model'; +import { UnitModel } from '../../unit'; +import { SelectionComponent } from '../selection'; +export interface TransformCompiler { + has: (selCmpt: SelectionComponent | SelectionDef) => boolean; + parse?: (model: UnitModel, def: SelectionDef, selCmpt: SelectionComponent) => void; + signals?: (model: UnitModel, selCmpt: SelectionComponent, signals: VgSignal[]) => VgSignal[]; + topLevelSignals?: (model: Model, selCmpt: SelectionComponent, signals: VgSignal[]) => VgSignal[]; + modifyExpr?: (model: UnitModel, selCmpt: SelectionComponent, expr: string) => string; + marks?: (model: UnitModel, selCmpt: SelectionComponent, marks: any[]) => any[]; +} +export declare function forEachTransform(selCmpt: SelectionComponent, cb: (tx: TransformCompiler) => void): void; diff --git a/build/src/compile/selection/transforms/transforms.js b/build/src/compile/selection/transforms/transforms.js new file mode 100644 index 0000000000..a734f38fdd --- /dev/null +++ b/build/src/compile/selection/transforms/transforms.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var inputs_1 = tslib_1.__importDefault(require("./inputs")); +var nearest_1 = tslib_1.__importDefault(require("./nearest")); +var project_1 = tslib_1.__importDefault(require("./project")); +var scales_1 = tslib_1.__importDefault(require("./scales")); +var toggle_1 = tslib_1.__importDefault(require("./toggle")); +var translate_1 = tslib_1.__importDefault(require("./translate")); +var zoom_1 = tslib_1.__importDefault(require("./zoom")); +var compilers = { project: project_1.default, toggle: toggle_1.default, scales: scales_1.default, + translate: translate_1.default, zoom: zoom_1.default, inputs: inputs_1.default, nearest: nearest_1.default }; +function forEachTransform(selCmpt, cb) { + for (var t in compilers) { + if (compilers[t].has(selCmpt)) { + cb(compilers[t]); + } + } +} +exports.forEachTransform = forEachTransform; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3Jtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3RyYW5zZm9ybXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBaUJBLDREQUE4QjtBQUM5Qiw4REFBZ0M7QUFDaEMsOERBQWdDO0FBQ2hDLDREQUE4QjtBQUM5Qiw0REFBOEI7QUFDOUIsa0VBQW9DO0FBQ3BDLHdEQUEwQjtBQUMxQixJQUFNLFNBQVMsR0FBNEIsRUFBQyxPQUFPLG1CQUFBLEVBQUUsTUFBTSxrQkFBQSxFQUFFLE1BQU0sa0JBQUE7SUFDakUsU0FBUyxxQkFBQSxFQUFFLElBQUksZ0JBQUEsRUFBRSxNQUFNLGtCQUFBLEVBQUUsT0FBTyxtQkFBQSxFQUFDLENBQUM7QUFFcEMsMEJBQWlDLE9BQTJCLEVBQUUsRUFBbUM7SUFDL0YsS0FBSyxJQUFNLENBQUMsSUFBSSxTQUFTLEVBQUU7UUFDekIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdCLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQjtLQUNGO0FBQ0gsQ0FBQztBQU5ELDRDQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZWxlY3Rpb25EZWZ9IGZyb20gJy4uLy4uLy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge0RpY3R9IGZyb20gJy4uLy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ1NpZ25hbH0gZnJvbSAnLi4vLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi4vLi4vbW9kZWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uLy4uL3VuaXQnO1xuaW1wb3J0IHtTZWxlY3Rpb25Db21wb25lbnR9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1Db21waWxlciB7XG4gIGhhczogKHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCB8IFNlbGVjdGlvbkRlZikgPT4gYm9vbGVhbjtcbiAgcGFyc2U/OiAobW9kZWw6IFVuaXRNb2RlbCwgZGVmOiBTZWxlY3Rpb25EZWYsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCkgPT4gdm9pZDtcbiAgc2lnbmFscz86IChtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIHNpZ25hbHM6IFZnU2lnbmFsW10pID0+IFZnU2lnbmFsW107XG4gIHRvcExldmVsU2lnbmFscz86IChtb2RlbDogTW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgc2lnbmFsczogVmdTaWduYWxbXSkgPT4gVmdTaWduYWxbXTtcbiAgbW9kaWZ5RXhwcj86IChtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIGV4cHI6IHN0cmluZykgPT4gc3RyaW5nO1xuICBtYXJrcz86IChtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OlNlbGVjdGlvbkNvbXBvbmVudCwgbWFya3M6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuaW1wb3J0IGlucHV0cyBmcm9tICcuL2lucHV0cyc7XG5pbXBvcnQgbmVhcmVzdCBmcm9tICcuL25lYXJlc3QnO1xuaW1wb3J0IHByb2plY3QgZnJvbSAnLi9wcm9qZWN0JztcbmltcG9ydCBzY2FsZXMgZnJvbSAnLi9zY2FsZXMnO1xuaW1wb3J0IHRvZ2dsZSBmcm9tICcuL3RvZ2dsZSc7XG5pbXBvcnQgdHJhbnNsYXRlIGZyb20gJy4vdHJhbnNsYXRlJztcbmltcG9ydCB6b29tIGZyb20gJy4vem9vbSc7XG5jb25zdCBjb21waWxlcnM6IERpY3Q8VHJhbnNmb3JtQ29tcGlsZXI+ID0ge3Byb2plY3QsIHRvZ2dsZSwgc2NhbGVzLFxuICB0cmFuc2xhdGUsIHpvb20sIGlucHV0cywgbmVhcmVzdH07XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoVHJhbnNmb3JtKHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgY2I6ICh0eDogVHJhbnNmb3JtQ29tcGlsZXIpID0+IHZvaWQpIHtcbiAgZm9yIChjb25zdCB0IGluIGNvbXBpbGVycykge1xuICAgIGlmIChjb21waWxlcnNbdF0uaGFzKHNlbENtcHQpKSB7XG4gICAgICBjYihjb21waWxlcnNbdF0pO1xuICAgIH1cbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/selection/transforms/translate.d.ts b/build/src/compile/selection/transforms/translate.d.ts new file mode 100644 index 0000000000..10335d8543 --- /dev/null +++ b/build/src/compile/selection/transforms/translate.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const translate: TransformCompiler; +export default translate; diff --git a/build/src/compile/selection/transforms/translate.js b/build/src/compile/selection/transforms/translate.js new file mode 100644 index 0000000000..47c486e477 --- /dev/null +++ b/build/src/compile/selection/transforms/translate.js @@ -0,0 +1,77 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_event_selector_1 = require("vega-event-selector"); +var channel_1 = require("../../../channel"); +var interval_1 = require("../interval"); +var selection_1 = require("../selection"); +var scales_1 = tslib_1.__importStar(require("./scales")); +var ANCHOR = '_translate_anchor'; +var DELTA = '_translate_delta'; +var translate = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.translate; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var hasScales = scales_1.default.has(selCmpt); + var anchor = name + ANCHOR; + var _a = selection_1.positionalProjections(selCmpt), x = _a.x, y = _a.y; + var events = vega_event_selector_1.selector(selCmpt.translate, 'scope'); + if (!hasScales) { + events = events.map(function (e) { return (e.between[0].markname = name + interval_1.BRUSH, e); }); + } + signals.push({ + name: anchor, + value: {}, + on: [{ + events: events.map(function (e) { return e.between[0]; }), + update: '{x: x(unit), y: y(unit)' + + (x !== null ? ', extent_x: ' + (hasScales ? scales_1.domain(model, channel_1.X) : + "slice(" + selection_1.channelSignalName(selCmpt, 'x', 'visual') + ")") : '') + + (y !== null ? ', extent_y: ' + (hasScales ? scales_1.domain(model, channel_1.Y) : + "slice(" + selection_1.channelSignalName(selCmpt, 'y', 'visual') + ")") : '') + '}' + }] + }, { + name: name + DELTA, + value: {}, + on: [{ + events: events, + update: "{x: " + anchor + ".x - x(unit), y: " + anchor + ".y - y(unit)}" + }] + }); + if (x !== null) { + onDelta(model, selCmpt, channel_1.X, 'width', signals); + } + if (y !== null) { + onDelta(model, selCmpt, channel_1.Y, 'height', signals); + } + return signals; + } +}; +exports.default = translate; +function onDelta(model, selCmpt, channel, size, signals) { + var name = selCmpt.name; + var hasScales = scales_1.default.has(selCmpt); + var signal = signals.filter(function (s) { + return s.name === selection_1.channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual'); + })[0]; + var anchor = name + ANCHOR; + var delta = name + DELTA; + var sizeSg = model.getSizeSignalRef(size).signal; + var scaleCmpt = model.getScaleComponent(channel); + var scaleType = scaleCmpt.get('type'); + var sign = hasScales && channel === channel_1.X ? '-' : ''; // Invert delta when panning x-scales. + var extent = anchor + ".extent_" + channel; + var offset = "" + sign + delta + "." + channel + " / " + (hasScales ? "" + sizeSg : "span(" + extent + ")"); + var panFn = !hasScales ? 'panLinear' : + scaleType === 'log' ? 'panLog' : + scaleType === 'pow' ? 'panPow' : 'panLinear'; + var update = panFn + "(" + extent + ", " + offset + + (hasScales && scaleType === 'pow' ? ", " + (scaleCmpt.get('exponent') || 1) : '') + ')'; + signal.on.push({ + events: { signal: delta }, + update: hasScales ? update : "clampRange(" + update + ", 0, " + sizeSg + ")" + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvdHJhbnNsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJEQUE4RDtBQUU5RCw0Q0FBb0Q7QUFFcEQsd0NBQW9EO0FBQ3BELDBDQUEwRjtBQUUxRix5REFBZ0Q7QUFJaEQsSUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUM7QUFDbkMsSUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUM7QUFFakMsSUFBTSxTQUFTLEdBQXFCO0lBQ2xDLEdBQUcsRUFBRSxVQUFTLE9BQU87UUFDbkIsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQzFELENBQUM7SUFFRCxPQUFPLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDdkMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLFNBQVMsR0FBRyxnQkFBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUEsK0NBQXVDLEVBQXRDLFFBQUMsRUFBRSxRQUFDLENBQW1DO1FBQzlDLElBQUksTUFBTSxHQUFHLDhCQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxnQkFBYyxFQUFFLENBQUMsQ0FBQyxFQUFsRCxDQUFrRCxDQUFDLENBQUM7U0FDaEY7UUFFRCxPQUFPLENB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QUFDLHNDQUFzQztJQUMxRixJQUFNLE1BQU0sR0FBTSxNQUFNLGdCQUFXLE9BQVMsQ0FBQztJQUM3QyxJQUFNLE1BQU0sR0FBRyxLQUFHLElBQUksR0FBRyxLQUFLLFNBQUksT0FBTyxRQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUcsTUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFRLE1BQU0sTUFBRyxDQUFDLENBQUM7SUFDL0YsSUFBTSxLQUFLLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hDLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQy9DLElBQU0sTUFBTSxHQUFNLEtBQUssU0FBSSxNQUFNLFVBQUssTUFBUTtRQUM1QyxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUV4RixNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNiLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7UUFDdkIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBYyxNQUFNLGFBQVEsTUFBTSxNQUFHO0tBQ25FLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3NlbGVjdG9yIGFzIHBhcnNlU2VsZWN0b3J9IGZyb20gJ3ZlZ2EtZXZlbnQtc2VsZWN0b3InO1xuXG5pbXBvcnQge1NjYWxlQ2hhbm5lbCwgWCwgWX0gZnJvbSAnLi4vLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge1ZnU2lnbmFsfSBmcm9tICcuLi8uLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0JSVVNIIGFzIElOVEVSVkFMX0JSVVNIfSBmcm9tICcuLi9pbnRlcnZhbCc7XG5pbXBvcnQge2NoYW5uZWxTaWduYWxOYW1lLCBwb3NpdGlvbmFsUHJvamVjdGlvbnMsIFNlbGVjdGlvbkNvbXBvbmVudH0gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLy4uLy4uL3VuaXQnO1xuaW1wb3J0IHNjYWxlc0NvbXBpbGVyLCB7ZG9tYWlufSBmcm9tICcuL3NjYWxlcyc7XG5pbXBvcnQge1RyYW5zZm9ybUNvbXBpbGVyfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuXG5cbmNvbnN0IEFOQ0hPUiA9ICdfdHJhbnNsYXRlX2FuY2hvcic7XG5jb25zdCBERUxUQSA9ICdfdHJhbnNsYXRlX2RlbHRhJztcblxuY29uc3QgdHJhbnNsYXRlOlRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbENtcHQpIHtcbiAgICByZXR1cm4gc2VsQ21wdC50eXBlID09PSAnaW50ZXJ2YWwnICYmIHNlbENtcHQudHJhbnNsYXRlO1xuICB9LFxuXG4gIHNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKSB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBjb25zdCBoYXNTY2FsZXMgPSBzY2FsZXNDb21waWxlci5oYXMoc2VsQ21wdCk7XG4gICAgY29uc3QgYW5jaG9yID0gbmFtZSArIEFOQ0hPUjtcbiAgICBjb25zdCB7eCwgeX0gPSBwb3NpdGlvbmFsUHJvamVjdGlvbnMoc2VsQ21wdCk7XG4gICAgbGV0IGV2ZW50cyA9IHBhcnNlU2VsZWN0b3Ioc2VsQ21wdC50cmFuc2xhdGUsICdzY29wZScpO1xuXG4gICAgaWYgKCFoYXNTY2FsZXMpIHtcbiAgICAgIGV2ZW50cyA9IGV2ZW50cy5tYXAoKGUpID0+IChlLmJldHdlZW5bMF0ubWFya25hbWUgPSBuYW1lICsgSU5URVJWQUxfQlJVU0gsIGUpKTtcbiAgICB9XG5cbiAgICBzaWduYWxzLnB1c2goe1xuICAgICAgbmFtZTogYW5jaG9yLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czogZXZlbnRzLm1hcCgoZSkgPT4gZS5iZXR3ZWVuWzBdKSxcbiAgICAgICAgdXBkYXRlOiAne3g6IHgodW5pdCksIHk6IHkodW5pdCknICtcbiAgICAgICAgICAoeCAhPT0gbnVsbCA/ICcsIGV4dGVudF94OiAnICsgKGhhc1NjYWxlcyA/IGRvbWFpbihtb2RlbCwgWCkgOlxuICAgICAgICAgICAgICBgc2xpY2UoJHtjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCAneCcsICd2aXN1YWwnKX0pYCkgOiAnJykgK1xuXG4gICAgICAgICAgKHkgIT09IG51bGwgPyAnLCBleHRlbnRfeTogJyArIChoYXNTY2FsZXMgPyBkb21haW4obW9kZWwsIFkpIDpcbiAgICAgICAgICAgICAgYHNsaWNlKCR7Y2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgJ3knLCAndmlzdWFsJyl9KWApIDogJycpICsgJ30nXG4gICAgICB9XVxuICAgIH0sIHtcbiAgICAgIG5hbWU6IG5hbWUgKyBERUxUQSxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IGV2ZW50cyxcbiAgICAgICAgdXBkYXRlOiBge3g6ICR7YW5jaG9yfS54IC0geCh1bml0KSwgeTogJHthbmNob3J9LnkgLSB5KHVuaXQpfWBcbiAgICAgIH1dXG4gICAgfSk7XG5cbiAgICBpZiAoeCAhPT0gbnVsbCkge1xuICAgICAgb25EZWx0YShtb2RlbCwgc2VsQ21wdCwgWCwgJ3dpZHRoJywgc2lnbmFscyk7XG4gICAgfVxuXG4gICAgaWYgKHkgIT09IG51bGwpIHtcbiAgICAgIG9uRGVsdGEobW9kZWwsIHNlbENtcHQsIFksICdoZWlnaHQnLCBzaWduYWxzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmFscztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdHJhbnNsYXRlO1xuXG5mdW5jdGlvbiBvbkRlbHRhKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgY2hhbm5lbDogU2NhbGVDaGFubmVsLCBzaXplOiAnd2lkdGgnIHwgJ2hlaWdodCcsIHNpZ25hbHM6IFZnU2lnbmFsW10pIHtcbiAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgY29uc3QgaGFzU2NhbGVzID0gc2NhbGVzQ29tcGlsZXIuaGFzKHNlbENtcHQpO1xuICBjb25zdCBzaWduYWwgPSBzaWduYWxzLmZpbHRlcihzID0+IHtcbiAgICByZXR1cm4gcy5uYW1lID09PSBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCBoYXNTY2FsZXMgPyAnZGF0YScgOiAndmlzdWFsJyk7XG4gIH0pWzBdO1xuICBjb25zdCBhbmNob3IgPSBuYW1lICsgQU5DSE9SO1xuICBjb25zdCBkZWx0YSA9IG5hbWUgKyBERUxUQTtcbiAgY29uc3Qgc2l6ZVNnID0gbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZihzaXplKS5zaWduYWw7XG4gIGNvbnN0IHNjYWxlQ21wdCA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpO1xuICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZUNtcHQuZ2V0KCd0eXBlJyk7XG4gIGNvbnN0IHNpZ24gPSBoYXNTY2FsZXMgJiYgY2hhbm5lbCA9PT0gWCA/ICctJyA6ICcnOyAvLyBJbnZlcnQgZGVsdGEgd2hlbiBwYW5uaW5nIHgtc2NhbGVzLlxuICBjb25zdCBleHRlbnQgPSBgJHthbmNob3J9LmV4dGVudF8ke2NoYW5uZWx9YDtcbiAgY29uc3Qgb2Zmc2V0ID0gYCR7c2lnbn0ke2RlbHRhfS4ke2NoYW5uZWx9IC8gYCArIChoYXNTY2FsZXMgPyBgJHtzaXplU2d9YCA6IGBzcGFuKCR7ZXh0ZW50fSlgKTtcbiAgY29uc3QgcGFuRm4gPSAhaGFzU2NhbGVzID8gJ3BhbkxpbmVhcicgOlxuICAgIHNjYWxlVHlwZSA9PT0gJ2xvZycgPyAncGFuTG9nJyA6XG4gICAgc2NhbGVUeXBlID09PSAncG93JyA/ICdwYW5Qb3cnIDogJ3BhbkxpbmVhcic7XG4gIGNvbnN0IHVwZGF0ZSA9IGAke3BhbkZufSgke2V4dGVudH0sICR7b2Zmc2V0fWAgK1xuICAgIChoYXNTY2FsZXMgJiYgc2NhbGVUeXBlID09PSAncG93JyA/IGAsICR7c2NhbGVDbXB0LmdldCgnZXhwb25lbnQnKSB8fCAxfWAgOiAnJykgKyAnKSc7XG5cbiAgc2lnbmFsLm9uLnB1c2goe1xuICAgIGV2ZW50czoge3NpZ25hbDogZGVsdGF9LFxuICAgIHVwZGF0ZTogaGFzU2NhbGVzID8gdXBkYXRlIDogYGNsYW1wUmFuZ2UoJHt1cGRhdGV9LCAwLCAke3NpemVTZ30pYFxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/selection/transforms/zoom.d.ts b/build/src/compile/selection/transforms/zoom.d.ts new file mode 100644 index 0000000000..1147a5bf64 --- /dev/null +++ b/build/src/compile/selection/transforms/zoom.d.ts @@ -0,0 +1,3 @@ +import { TransformCompiler } from './transforms'; +declare const zoom: TransformCompiler; +export default zoom; diff --git a/build/src/compile/selection/transforms/zoom.js b/build/src/compile/selection/transforms/zoom.js new file mode 100644 index 0000000000..6016e2702e --- /dev/null +++ b/build/src/compile/selection/transforms/zoom.js @@ -0,0 +1,77 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_event_selector_1 = require("vega-event-selector"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("../../../channel"); +var interval_1 = require("../interval"); +var selection_1 = require("../selection"); +var scales_1 = tslib_1.__importStar(require("./scales")); +var ANCHOR = '_zoom_anchor'; +var DELTA = '_zoom_delta'; +var zoom = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.zoom; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var hasScales = scales_1.default.has(selCmpt); + var delta = name + DELTA; + var _a = selection_1.positionalProjections(selCmpt), x = _a.x, y = _a.y; + var sx = vega_util_1.stringValue(model.scaleName(channel_1.X)); + var sy = vega_util_1.stringValue(model.scaleName(channel_1.Y)); + var events = vega_event_selector_1.selector(selCmpt.zoom, 'scope'); + if (!hasScales) { + events = events.map(function (e) { return (e.markname = name + interval_1.BRUSH, e); }); + } + signals.push({ + name: name + ANCHOR, + on: [{ + events: events, + update: !hasScales ? "{x: x(unit), y: y(unit)}" : + '{' + [ + (sx ? "x: invert(" + sx + ", x(unit))" : ''), + (sy ? "y: invert(" + sy + ", y(unit))" : '') + ].filter(function (expr) { return !!expr; }).join(', ') + '}' + }] + }, { + name: delta, + on: [{ + events: events, + force: true, + update: 'pow(1.001, event.deltaY * pow(16, event.deltaMode))' + }] + }); + if (x !== null) { + onDelta(model, selCmpt, 'x', 'width', signals); + } + if (y !== null) { + onDelta(model, selCmpt, 'y', 'height', signals); + } + return signals; + } +}; +exports.default = zoom; +function onDelta(model, selCmpt, channel, size, signals) { + var name = selCmpt.name; + var hasScales = scales_1.default.has(selCmpt); + var signal = signals.filter(function (s) { + return s.name === selection_1.channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual'); + })[0]; + var sizeSg = model.getSizeSignalRef(size).signal; + var scaleCmpt = model.getScaleComponent(channel); + var scaleType = scaleCmpt.get('type'); + var base = hasScales ? scales_1.domain(model, channel) : signal.name; + var delta = name + DELTA; + var anchor = "" + name + ANCHOR + "." + channel; + var zoomFn = !hasScales ? 'zoomLinear' : + scaleType === 'log' ? 'zoomLog' : + scaleType === 'pow' ? 'zoomPow' : 'zoomLinear'; + var update = zoomFn + "(" + base + ", " + anchor + ", " + delta + + (hasScales && scaleType === 'pow' ? ", " + (scaleCmpt.get('exponent') || 1) : '') + ')'; + signal.on.push({ + events: { signal: delta }, + update: hasScales ? update : "clampRange(" + update + ", 0, " + sizeSg + ")" + }); +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3pvb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkRBQThEO0FBQzlELHVDQUFzQztBQUN0Qyw0Q0FBb0Q7QUFFcEQsd0NBQW9EO0FBQ3BELDBDQUEwRjtBQUUxRix5REFBMkQ7QUFJM0QsSUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDO0FBQzlCLElBQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQztBQUU1QixJQUFNLElBQUksR0FBcUI7SUFDN0IsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQU0sU0FBUyxHQUFHLGdCQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQU0sS0FBSyxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBQSwrQ0FBdUMsRUFBdEMsUUFBQyxFQUFFLFFBQUMsQ0FBbUM7UUFDOUMsSUFBTSxFQUFFLEdBQUcsdUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBTSxFQUFFLEdBQUcsdUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFdBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxNQUFNLEdBQUcsOEJBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRWxELElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDZCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FB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QUMsU0FBUyxDQUFDLENBQUM7WUFDakMsU0FBUyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFDakQsSUFBTSxNQUFNLEdBQU0sTUFBTSxTQUFJLElBQUksVUFBSyxNQUFNLFVBQUssS0FBTztRQUNyRCxDQUFDLFNBQVMsSUFBSSxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUV4RixNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztRQUNiLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7UUFDdkIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxnQkFBYyxNQUFNLGFBQVEsTUFBTSxNQUFHO0tBQ25FLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3NlbGVjdG9yIGFzIHBhcnNlU2VsZWN0b3J9IGZyb20gJ3ZlZ2EtZXZlbnQtc2VsZWN0b3InO1xuaW1wb3J0IHtzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7U2NhbGVDaGFubmVsLCBYLCBZfSBmcm9tICcuLi8uLi8uLi9jaGFubmVsJztcbmltcG9ydCB7VmdTaWduYWx9IGZyb20gJy4uLy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QlJVU0ggYXMgSU5URVJWQUxfQlJVU0h9IGZyb20gJy4uL2ludGVydmFsJztcbmltcG9ydCB7Y2hhbm5lbFNpZ25hbE5hbWUsIHBvc2l0aW9uYWxQcm9qZWN0aW9ucywgU2VsZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vLi4vLi4vdW5pdCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgc2NhbGVzQ29tcGlsZXIsIGRvbWFpbn0gZnJvbSAnLi9zY2FsZXMnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Db21waWxlcn0gZnJvbSAnLi90cmFuc2Zvcm1zJztcblxuXG5jb25zdCBBTkNIT1IgPSAnX3pvb21fYW5jaG9yJztcbmNvbnN0IERFTFRBID0gJ196b29tX2RlbHRhJztcblxuY29uc3Qgem9vbTpUcmFuc2Zvcm1Db21waWxlciA9IHtcbiAgaGFzOiBmdW5jdGlvbihzZWxDbXB0KSB7XG4gICAgcmV0dXJuIHNlbENtcHQudHlwZSA9PT0gJ2ludGVydmFsJyAmJiBzZWxDbXB0Lnpvb207XG4gIH0sXG5cbiAgc2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IGhhc1NjYWxlcyA9IHNjYWxlc0NvbXBpbGVyLmhhcyhzZWxDbXB0KTtcbiAgICBjb25zdCBkZWx0YSA9IG5hbWUgKyBERUxUQTtcbiAgICBjb25zdCB7eCwgeX0gPSBwb3NpdGlvbmFsUHJvamVjdGlvbnMoc2VsQ21wdCk7XG4gICAgY29uc3Qgc3ggPSBzdHJpbmdWYWx1ZShtb2RlbC5zY2FsZU5hbWUoWCkpO1xuICAgIGNvbnN0IHN5ID0gc3RyaW5nVmFsdWUobW9kZWwuc2NhbGVOYW1lKFkpKTtcbiAgICBsZXQgZXZlbnRzID0gcGFyc2VTZWxlY3RvcihzZWxDbXB0Lnpvb20sICdzY29wZScpO1xuXG4gICAgaWYgKCFoYXNTY2FsZXMpIHtcbiAgICAgIGV2ZW50cyA9IGV2ZW50cy5tYXAoKGUpID0+IChlLm1hcmtuYW1lID0gbmFtZSArIElOVEVSVkFMX0JSVVNILCBlKSk7XG4gICAgfVxuXG4gICAgc2lnbmFscy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUgKyBBTkNIT1IsXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBldmVudHMsXG4gICAgICAgIHVwZGF0ZTogIWhhc1NjYWxlcyA/IGB7eDogeCh1bml0KSwgeTogeSh1bml0KX1gIDpcbiAgICAgICAgICAneycgKyBbXG4gICAgICAgICAgICAoc3ggPyBgeDogaW52ZXJ0KCR7c3h9LCB4KHVuaXQpKWAgOiAnJyksXG4gICAgICAgICAgICAoc3kgPyBgeTogaW52ZXJ0KCR7c3l9LCB5KHVuaXQpKWAgOiAnJylcbiAgICAgICAgICBdLmZpbHRlcigoZXhwcikgPT4gISFleHByKS5qb2luKCcsICcpICsgJ30nXG4gICAgICB9XVxuICAgIH0sIHtcbiAgICAgIG5hbWU6IGRlbHRhLFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czogZXZlbnRzLFxuICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgdXBkYXRlOiAncG93KDEuMDAxLCBldmVudC5kZWx0YVkgKiBwb3coMTYsIGV2ZW50LmRlbHRhTW9kZSkpJ1xuICAgICAgfV1cbiAgICB9KTtcblxuICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICBvbkRlbHRhKG1vZGVsLCBzZWxDbXB0LCAneCcsICd3aWR0aCcsIHNpZ25hbHMpO1xuICAgIH1cblxuICAgIGlmICh5ICE9PSBudWxsKSB7XG4gICAgICBvbkRlbHRhKG1vZGVsLCBzZWxDbXB0LCAneScsICdoZWlnaHQnLCBzaWduYWxzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2lnbmFscztcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgem9vbTtcblxuZnVuY3Rpb24gb25EZWx0YShtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCwgc2l6ZTogJ3dpZHRoJyB8ICdoZWlnaHQnLCBzaWduYWxzOiBWZ1NpZ25hbFtdKSB7XG4gIGNvbnN0IG5hbWUgPSBzZWxDbXB0Lm5hbWU7XG4gIGNvbnN0IGhhc1NjYWxlcyA9IHNjYWxlc0NvbXBpbGVyLmhhcyhzZWxDbXB0KTtcbiAgY29uc3Qgc2lnbmFsID0gc2lnbmFscy5maWx0ZXIocyA9PiB7XG4gICAgcmV0dXJuIHMubmFtZSA9PT0gY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgaGFzU2NhbGVzID8gJ2RhdGEnIDogJ3Zpc3VhbCcpO1xuICB9KVswXTtcbiAgY29uc3Qgc2l6ZVNnID0gbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZihzaXplKS5zaWduYWw7XG4gIGNvbnN0IHNjYWxlQ21wdCA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpO1xuICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZUNtcHQuZ2V0KCd0eXBlJyk7XG4gIGNvbnN0IGJhc2UgPSBoYXNTY2FsZXMgPyBkb21haW4obW9kZWwsIGNoYW5uZWwpIDogc2lnbmFsLm5hbWU7XG4gIGNvbnN0IGRlbHRhID0gbmFtZSArIERFTFRBO1xuICBjb25zdCBhbmNob3IgPSBgJHtuYW1lfSR7QU5DSE9SfS4ke2NoYW5uZWx9YDtcbiAgY29uc3Qgem9vbUZuID0gIWhhc1NjYWxlcyA/ICd6b29tTGluZWFyJyA6XG4gICAgc2NhbGVUeXBlID09PSAnbG9nJyA/ICd6b29tTG9nJyA6XG4gICAgc2NhbGVUeXBlID09PSAncG93JyA/ICd6b29tUG93JyA6ICd6b29tTGluZWFyJztcbiAgY29uc3QgdXBkYXRlID0gYCR7em9vbUZufSgke2Jhc2V9LCAke2FuY2hvcn0sICR7ZGVsdGF9YCArXG4gICAgKGhhc1NjYWxlcyAmJiBzY2FsZVR5cGUgPT09ICdwb3cnID8gYCwgJHtzY2FsZUNtcHQuZ2V0KCdleHBvbmVudCcpIHx8IDF9YCA6ICcnKSArICcpJztcblxuICBzaWduYWwub24ucHVzaCh7XG4gICAgZXZlbnRzOiB7c2lnbmFsOiBkZWx0YX0sXG4gICAgdXBkYXRlOiBoYXNTY2FsZXMgPyB1cGRhdGUgOiBgY2xhbXBSYW5nZSgke3VwZGF0ZX0sIDAsICR7c2l6ZVNnfSlgXG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/compile/split.d.ts b/build/src/compile/split.d.ts new file mode 100644 index 0000000000..0586861945 --- /dev/null +++ b/build/src/compile/split.d.ts @@ -0,0 +1,33 @@ +/** + * Generic class for storing properties that are explicitly specified + * and implicitly determined by the compiler. + * This is important for scale/axis/legend merging as + * we want to prioritize properties that users explicitly specified. + */ +export declare class Split { + readonly explicit: Partial; + readonly implicit: Partial; + constructor(explicit?: Partial, implicit?: Partial); + clone(): Split; + combine(): Partial; + get(key: K): T[K]; + getWithExplicit(key: K): Explicit; + setWithExplicit(key: K, value: Explicit): void; + set(key: K, value: T[K], explicit: boolean): this; + copyKeyFromSplit(key: keyof T, s: Split): void; + copyKeyFromObject>(key: keyof T, s: S): void; + /** + * Merge split object into this split object. Properties from the other split + * overwrite properties from this split. + */ + copyAll(other: Split): void; +} +export interface Explicit { + explicit: boolean; + value: T; +} +export declare function makeExplicit(value: T): Explicit; +export declare function makeImplicit(value: T): Explicit; +export declare function tieBreakByComparing(compare: (v1: T, v2: T) => number): (v1: Explicit, v2: Explicit, property: keyof S, propertyOf: string | number | symbol) => Explicit; +export declare function defaultTieBreaker(v1: Explicit, v2: Explicit, property: keyof S, propertyOf: string | number | symbol): Explicit; +export declare function mergeValuesWithExplicit(v1: Explicit, v2: Explicit, property: keyof S, propertyOf: 'scale' | 'axis' | 'legend' | '', tieBreaker?: (v1: Explicit, v2: Explicit, property: keyof S, propertyOf: string) => Explicit): Explicit; diff --git a/build/src/compile/split.js b/build/src/compile/split.js new file mode 100644 index 0000000000..a28354cb1d --- /dev/null +++ b/build/src/compile/split.js @@ -0,0 +1,135 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../log")); +var util_1 = require("../util"); +/** + * Generic class for storing properties that are explicitly specified + * and implicitly determined by the compiler. + * This is important for scale/axis/legend merging as + * we want to prioritize properties that users explicitly specified. + */ +var Split = /** @class */ (function () { + function Split(explicit, implicit) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + this.explicit = explicit; + this.implicit = implicit; + } + Split.prototype.clone = function () { + return new Split(util_1.duplicate(this.explicit), util_1.duplicate(this.implicit)); + }; + Split.prototype.combine = function () { + // FIXME remove "as any". + // Add "as any" to avoid an error "Spread types may only be created from object types". + return tslib_1.__assign({}, this.explicit, this.implicit); + }; + Split.prototype.get = function (key) { + // Explicit has higher precedence + return this.explicit[key] !== undefined ? this.explicit[key] : this.implicit[key]; + }; + Split.prototype.getWithExplicit = function (key) { + // Explicit has higher precedence + if (this.explicit[key] !== undefined) { + return { explicit: true, value: this.explicit[key] }; + } + else if (this.implicit[key] !== undefined) { + return { explicit: false, value: this.implicit[key] }; + } + return { explicit: false, value: undefined }; + }; + Split.prototype.setWithExplicit = function (key, value) { + if (value.value !== undefined) { + this.set(key, value.value, value.explicit); + } + }; + Split.prototype.set = function (key, value, explicit) { + delete this[explicit ? 'implicit' : 'explicit'][key]; + this[explicit ? 'explicit' : 'implicit'][key] = value; + return this; + }; + Split.prototype.copyKeyFromSplit = function (key, s) { + // Explicit has higher precedence + if (s.explicit[key] !== undefined) { + this.set(key, s.explicit[key], true); + } + else if (s.implicit[key] !== undefined) { + this.set(key, s.implicit[key], false); + } + }; + Split.prototype.copyKeyFromObject = function (key, s) { + // Explicit has higher precedence + if (s[key] !== undefined) { + this.set(key, s[key], true); + } + }; + /** + * Merge split object into this split object. Properties from the other split + * overwrite properties from this split. + */ + Split.prototype.copyAll = function (other) { + for (var _i = 0, _a = util_1.keys(other.combine()); _i < _a.length; _i++) { + var key = _a[_i]; + var val = other.getWithExplicit(key); + this.setWithExplicit(key, val); + } + }; + return Split; +}()); +exports.Split = Split; +function makeExplicit(value) { + return { + explicit: true, + value: value + }; +} +exports.makeExplicit = makeExplicit; +function makeImplicit(value) { + return { + explicit: false, + value: value + }; +} +exports.makeImplicit = makeImplicit; +function tieBreakByComparing(compare) { + return function (v1, v2, property, propertyOf) { + var diff = compare(v1.value, v2.value); + if (diff > 0) { + return v1; + } + else if (diff < 0) { + return v2; + } + return defaultTieBreaker(v1, v2, property, propertyOf); + }; +} +exports.tieBreakByComparing = tieBreakByComparing; +function defaultTieBreaker(v1, v2, property, propertyOf) { + if (v1.explicit && v2.explicit) { + log.warn(log.message.mergeConflictingProperty(property, propertyOf, v1.value, v2.value)); + } + // If equal score, prefer v1. + return v1; +} +exports.defaultTieBreaker = defaultTieBreaker; +function mergeValuesWithExplicit(v1, v2, property, propertyOf, tieBreaker) { + if (tieBreaker === void 0) { tieBreaker = defaultTieBreaker; } + if (v1 === undefined || v1.value === undefined) { + // For first run + return v2; + } + if (v1.explicit && !v2.explicit) { + return v1; + } + else if (v2.explicit && !v1.explicit) { + return v2; + } + else if (util_1.stringify(v1.value) === util_1.stringify(v2.value)) { + return v1; + } + else { + return tieBreaker(v1, v2, property, propertyOf); + } +} +exports.mergeValuesWithExplicit = mergeValuesWithExplicit; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxrREFBOEI7QUFDOUIsZ0NBQW1EO0FBR25EOzs7OztHQUtHO0FBQ0g7SUFDRSxlQUNrQixRQUF5QixFQUN6QixRQUF5QjtRQUR6Qix5QkFBQSxFQUFBLGFBQXlCO1FBQ3pCLHlCQUFBLEVBQUEsYUFBeUI7UUFEekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFDeEMsQ0FBQztJQUVHLHFCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksS0FBSyxDQUFDLGdCQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGdCQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVNLHVCQUFPLEdBQWQ7UUFDRSx5QkFBeUI7UUFDekIsdUZBQXVGO1FBQ3ZGLDRCQUNLLElBQUksQ0FBQyxRQUFlLEVBQ3BCLElBQUksQ0FBQyxRQUFlLEVBQ3ZCO0lBQ0osQ0FBQztJQUVNLG1CQUFHLEdBQVYsVUFBOEIsR0FBTTtRQUNsQyxpQ0FBaUM7UUFDakMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwRixDQUFDO0lBRU0sK0JBQWUsR0FBdEIsVUFBMEMsR0FBTTtRQUM5QyxpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUNwQyxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFH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LFFBQVEsRUFBRTtRQUN0QyxPQUFPLEVBQUUsQ0FBQztLQUNYO1NBQU0sSUFBSSxnQkFBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxnQkFBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0RCxPQUFPLEVBQUUsQ0FBQztLQUNYO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUNqRDtBQUNILENBQUM7QUFwQkQsMERBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge2R1cGxpY2F0ZSwga2V5cywgc3RyaW5naWZ5fSBmcm9tICcuLi91dGlsJztcblxuXG4vKipcbiAqIEdlbmVyaWMgY2xhc3MgZm9yIHN0b3JpbmcgcHJvcGVydGllcyB0aGF0IGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZFxuICogYW5kIGltcGxpY2l0bHkgZGV0ZXJtaW5lZCBieSB0aGUgY29tcGlsZXIuXG4gKiBUaGlzIGlzIGltcG9ydGFudCBmb3Igc2NhbGUvYXhpcy9sZWdlbmQgbWVyZ2luZyBhc1xuICogd2Ugd2FudCB0byBwcmlvcml0aXplIHByb3BlcnRpZXMgdGhhdCB1c2VycyBleHBsaWNpdGx5IHNwZWNpZmllZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwbGl0PFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGV4cGxpY2l0OiBQYXJ0aWFsPFQ+ID0ge30sXG4gICAgcHVibGljIHJlYWRvbmx5IGltcGxpY2l0OiBQYXJ0aWFsPFQ+ID0ge31cbiAgKSB7fVxuXG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFNwbGl0KGR1cGxpY2F0ZSh0aGlzLmV4cGxpY2l0KSwgZHVwbGljYXRlKHRoaXMuaW1wbGljaXQpKTtcbiAgfVxuXG4gIHB1YmxpYyBjb21iaW5lKCk6IFBhcnRpYWw8VD4ge1xuICAgIC8vIEZJWE1FIHJlbW92ZSBcImFzIGFueVwiLlxuICAgIC8vIEFkZCBcImFzIGFueVwiIHRvIGF2b2lkIGFuIGVycm9yIFwiU3ByZWFkIHR5cGVzIG1heSBvbmx5IGJlIGNyZWF0ZWQgZnJvbSBvYmplY3QgdHlwZXNcIi5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5leHBsaWNpdCBhcyBhbnksIC8vIEV4cGxpY2l0IHByb3BlcnRpZXMgY29tZXMgZmlyc3RcbiAgICAgIC4uLnRoaXMuaW1wbGljaXQgYXMgYW55XG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQ8SyBleHRlbmRzIGtleW9mIFQ+KGtleTogSyk6IFRbS10ge1xuICAgIC8vIEV4cGxpY2l0IGhhcyBoaWdoZXIgcHJlY2VkZW5jZVxuICAgIHJldHVybiB0aGlzLmV4cGxpY2l0W2tleV0gIT09IHVuZGVmaW5lZCA/IHRoaXMuZXhwbGljaXRba2V5XSA6IHRoaXMuaW1wbGljaXRba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRXaXRoRXhwbGljaXQ8SyBleHRlbmRzIGtleW9mIFQ+KGtleTogSyk6IEV4cGxpY2l0PFRbS10+IHtcbiAgICAvLyBFeHBsaWNpdCBoYXMgaGlnaGVyIHByZWNlZGVuY2VcbiAgICBpZiAodGhpcy5leHBsaWNpdFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7ZXhwbGljaXQ6IHRydWUsIHZhbHVlOiB0aGlzLmV4cGxpY2l0W2tleV19O1xuICAgIH0gZWxzZSBpZiAodGhpcy5pbXBsaWNpdFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7ZXhwbGljaXQ6IGZhbHNlLCB2YWx1ZTogdGhpcy5pbXBsaWNpdFtrZXldfTtcbiAgICB9XG4gICAgcmV0dXJuIHtleHBsaWNpdDogZmFsc2UsIHZhbHVlOiB1bmRlZmluZWR9O1xuICB9XG5cbiAgcHVibGljIHNldFdpdGhFeHBsaWNpdDxLIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBLLCB2YWx1ZTogRXhwbGljaXQ8VFtLXT4pIHtcbiAgICBpZiAodmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZS52YWx1ZSwgdmFsdWUuZXhwbGljaXQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXQ8SyBleHRlbmRzIGtleW9mIFQ+KGtleTogSywgdmFsdWU6IFRbS10sIGV4cGxpY2l0OiBib29sZWFuKSB7XG4gICAgZGVsZXRlIHRoaXNbZXhwbGljaXQgPyAnaW1wbGljaXQnIDogJ2V4cGxpY2l0J11ba2V5XTtcbiAgICB0aGlzW2V4cGxpY2l0ID8gJ2V4cGxpY2l0JyA6ICdpbXBsaWNpdCddW2tleV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBjb3B5S2V5RnJvbVNwbGl0PFMgZXh0ZW5kcyBUPihrZXk6IGtleW9mIFQsIHM6IFNwbGl0PFM+KSB7XG4gICAgLy8gRXhwbGljaXQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlXG4gICAgaWYgKHMuZXhwbGljaXRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldChrZXksIHMuZXhwbGljaXRba2V5XSwgdHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChzLmltcGxpY2l0W2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCBzLmltcGxpY2l0W2tleV0sIGZhbHNlKTtcbiAgICB9XG4gIH1cbiAgcHVibGljIGNvcHlLZXlGcm9tT2JqZWN0PFMgZXh0ZW5kcyBQYXJ0aWFsPFQ+PihrZXk6IGtleW9mIFQsIHM6IFMpIHtcbiAgICAvLyBFeHBsaWNpdCBoYXMgaGlnaGVyIHByZWNlZGVuY2VcbiAgICBpZiAoc1trZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgc1trZXldLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2Ugc3BsaXQgb2JqZWN0IGludG8gdGhpcyBzcGxpdCBvYmplY3QuIFByb3BlcnRpZXMgZnJvbSB0aGUgb3RoZXIgc3BsaXRcbiAgICogb3ZlcndyaXRlIHByb3BlcnRpZXMgZnJvbSB0aGlzIHNwbGl0LlxuICAgKi9cbiAgcHVibGljIGNvcHlBbGwob3RoZXI6IFNwbGl0PFQ+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhvdGhlci5jb21iaW5lKCkpKSB7XG4gICAgICBjb25zdCB2YWwgPSBvdGhlci5nZXRXaXRoRXhwbGljaXQoa2V5KTtcbiAgICAgIHRoaXMuc2V0V2l0aEV4cGxpY2l0KGtleSwgdmFsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBsaWNpdDxUPiB7XG4gIGV4cGxpY2l0OiBib29sZWFuO1xuICB2YWx1ZTogVDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZUV4cGxpY2l0PFQ+KHZhbHVlOiBUKTogRXhwbGljaXQ8VD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGxpY2l0OiB0cnVlLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW1wbGljaXQ8VD4odmFsdWU6IFQpOiBFeHBsaWNpdDxUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwbGljaXQ6IGZhbHNlLFxuICAgIHZhbHVlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWVCcmVha0J5Q29tcGFyaW5nPFMsIFQ+KGNvbXBhcmU6ICh2MTogVCwgdjI6IFQpID0+IG51bWJlcikge1xuICByZXR1cm4gKHYxOiBFeHBsaWNpdDxUPiwgdjI6IEV4cGxpY2l0PFQ+LCBwcm9wZXJ0eToga2V5b2YgUyB8IG5ldmVyLCBwcm9wZXJ0eU9mOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wpOiBFeHBsaWNpdDxUPiA9PiB7XG4gICAgY29uc3QgZGlmZiA9IGNvbXBhcmUodjEudmFsdWUsIHYyLnZhbHVlKTtcbiAgICBpZiAoZGlmZiA+IDApIHtcbiAgICAgIHJldHVybiB2MTtcbiAgICB9IGVsc2UgaWYgKGRpZmYgPCAwKSB7XG4gICAgICByZXR1cm4gdjI7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0VGllQnJlYWtlcjxTLCBUPih2MSwgdjIsIHByb3BlcnR5LCBwcm9wZXJ0eU9mKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRUaWVCcmVha2VyPFMsIFQ+KHYxOiBFeHBsaWNpdDxUPiwgdjI6IEV4cGxpY2l0PFQ+LCBwcm9wZXJ0eToga2V5b2YgUywgcHJvcGVydHlPZjogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sKSB7XG4gIGlmICh2MS5leHBsaWNpdCAmJiB2Mi5leHBsaWNpdCkge1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLm1lcmdlQ29uZmxpY3RpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlPZiwgdjEudmFsdWUsIHYyLnZhbHVlKSk7XG4gIH1cbiAgLy8gSWYgZXF1YWwgc2NvcmUsIHByZWZlciB2MS5cbiAgcmV0dXJuIHYxO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQ8UywgVD4oXG4gICAgdjE6IEV4cGxpY2l0PFQ+LCB2MjogRXhwbGljaXQ8VD4sXG4gICAgcHJvcGVydHk6IGtleW9mIFMsXG4gICAgcHJvcGVydHlPZjogJ3NjYWxlJyB8ICdheGlzJyB8ICdsZWdlbmQnIHwgJycsXG4gICAgdGllQnJlYWtlcjogKHYxOiBFeHBsaWNpdDxUPiwgdjI6IEV4cGxpY2l0PFQ+LCBwcm9wZXJ0eToga2V5b2YgUywgcHJvcGVydHlPZjogc3RyaW5nKSA9PiBFeHBsaWNpdDxUPiA9IGRlZmF1bHRUaWVCcmVha2VyXG4gICkge1xuICBpZiAodjEgPT09IHVuZGVmaW5lZCB8fCB2MS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gRm9yIGZpcnN0IHJ1blxuICAgIHJldHVybiB2MjtcbiAgfVxuXG4gIGlmICh2MS5leHBsaWNpdCAmJiAhdjIuZXhwbGljaXQpIHtcbiAgICByZXR1cm4gdjE7XG4gIH0gZWxzZSBpZiAodjIuZXhwbGljaXQgJiYgIXYxLmV4cGxpY2l0KSB7XG4gICAgcmV0dXJuIHYyO1xuICB9IGVsc2UgaWYgKHN0cmluZ2lmeSh2MS52YWx1ZSkgPT09IHN0cmluZ2lmeSh2Mi52YWx1ZSkpIHtcbiAgICByZXR1cm4gdjE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRpZUJyZWFrZXIodjEsIHYyLCBwcm9wZXJ0eSwgcHJvcGVydHlPZik7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compile/unit.d.ts b/build/src/compile/unit.d.ts new file mode 100644 index 0000000000..cc7f9d80ae --- /dev/null +++ b/build/src/compile/unit.d.ts @@ -0,0 +1,65 @@ +import { Axis } from '../axis'; +import { Channel, ScaleChannel, SingleDefChannel } from '../channel'; +import { Config } from '../config'; +import * as vlEncoding from '../encoding'; +import { Encoding } from '../encoding'; +import { FieldDef } from '../fielddef'; +import { Legend } from '../legend'; +import { Mark, MarkDef } from '../mark'; +import { Projection } from '../projection'; +import { Domain } from '../scale'; +import { SelectionDef } from '../selection'; +import { LayoutSizeMixins, NormalizedUnitSpec } from '../spec'; +import { StackProperties } from '../stack'; +import { Dict } from '../util'; +import { VgData, VgEncodeEntry, VgLayout, VgSignal } from '../vega.schema'; +import { AxisIndex } from './axis/component'; +import { LegendIndex } from './legend/component'; +import { Model, ModelWithField } from './model'; +import { RepeaterValue } from './repeater'; +import { ScaleIndex } from './scale/component'; +/** + * Internal model of Vega-Lite specification for the compiler. + */ +export declare class UnitModel extends ModelWithField { + fit: boolean; + readonly type: 'unit'; + readonly markDef: MarkDef; + readonly encoding: Encoding; + readonly specifiedScales: ScaleIndex; + readonly stack: StackProperties; + protected specifiedAxes: AxisIndex; + protected specifiedLegends: LegendIndex; + specifiedProjection: Projection; + readonly selection: Dict; + children: Model[]; + constructor(spec: NormalizedUnitSpec, parent: Model, parentGivenName: string, parentGivenSize: LayoutSizeMixins, repeater: RepeaterValue, config: Config, fit: boolean); + readonly hasProjection: boolean; + /** + * Return specified Vega-lite scale domain for a particular channel + * @param channel + */ + scaleDomain(channel: ScaleChannel): Domain; + axis(channel: Channel): Axis; + legend(channel: Channel): Legend; + private initScales; + private initAxes; + private initLegend; + parseData(): void; + parseLayoutSize(): void; + parseSelection(): void; + parseMarkGroup(): void; + parseAxisAndHeader(): void; + assembleSelectionTopLevelSignals(signals: any[]): VgSignal[]; + assembleSelectionSignals(): VgSignal[]; + assembleSelectionData(data: VgData[]): VgData[]; + assembleLayout(): VgLayout; + assembleLayoutSignals(): VgSignal[]; + assembleMarks(): any[]; + assembleLayoutSize(): VgEncodeEntry; + protected getMapping(): vlEncoding.Encoding; + toSpec(excludeConfig?: any, excludeData?: any): any; + readonly mark: Mark; + channelHasField(channel: Channel): boolean; + fieldDef(channel: SingleDefChannel): FieldDef; +} diff --git a/build/src/compile/unit.js b/build/src/compile/unit.js new file mode 100644 index 0000000000..7693dc74f5 --- /dev/null +++ b/build/src/compile/unit.js @@ -0,0 +1,211 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var channel_1 = require("../channel"); +var vlEncoding = tslib_1.__importStar(require("../encoding")); +var encoding_1 = require("../encoding"); +var fielddef_1 = require("../fielddef"); +var mark_1 = require("../mark"); +var stack_1 = require("../stack"); +var util_1 = require("../util"); +var parse_1 = require("./axis/parse"); +var parse_2 = require("./data/parse"); +var assemble_1 = require("./layoutsize/assemble"); +var parse_3 = require("./layoutsize/parse"); +var init_1 = require("./mark/init"); +var mark_2 = require("./mark/mark"); +var model_1 = require("./model"); +var repeater_1 = require("./repeater"); +var selection_1 = require("./selection/selection"); +/** + * Internal model of Vega-Lite specification for the compiler. + */ +var UnitModel = /** @class */ (function (_super) { + tslib_1.__extends(UnitModel, _super); + function UnitModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) { + if (parentGivenSize === void 0) { parentGivenSize = {}; } + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, undefined) || this; + _this.fit = fit; + _this.type = 'unit'; + _this.specifiedScales = {}; + _this.specifiedAxes = {}; + _this.specifiedLegends = {}; + _this.specifiedProjection = {}; + _this.selection = {}; + _this.children = []; + _this.initSize(tslib_1.__assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {}))); + var mark = mark_1.isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var encoding = _this.encoding = encoding_1.normalizeEncoding(repeater_1.replaceRepeaterInEncoding(spec.encoding || {}, repeater), mark); + _this.markDef = init_1.normalizeMarkDef(spec.mark, encoding, config); + // calculate stack properties + _this.stack = stack_1.stack(mark, encoding, _this.config.stack); + _this.specifiedScales = _this.initScales(mark, encoding); + _this.specifiedAxes = _this.initAxes(encoding); + _this.specifiedLegends = _this.initLegend(encoding); + _this.specifiedProjection = spec.projection; + // Selections will be initialized upon parse. + _this.selection = spec.selection; + return _this; + } + Object.defineProperty(UnitModel.prototype, "hasProjection", { + get: function () { + var encoding = this.encoding; + var isGeoShapeMark = this.mark === mark_1.GEOSHAPE; + var hasGeoPosition = encoding && channel_1.GEOPOSITION_CHANNELS.some(function (channel) { return fielddef_1.isFieldDef(encoding[channel]); }); + return isGeoShapeMark || hasGeoPosition; + }, + enumerable: true, + configurable: true + }); + /** + * Return specified Vega-lite scale domain for a particular channel + * @param channel + */ + UnitModel.prototype.scaleDomain = function (channel) { + var scale = this.specifiedScales[channel]; + return scale ? scale.domain : undefined; + }; + UnitModel.prototype.axis = function (channel) { + return this.specifiedAxes[channel]; + }; + UnitModel.prototype.legend = function (channel) { + return this.specifiedLegends[channel]; + }; + UnitModel.prototype.initScales = function (mark, encoding) { + return channel_1.SCALE_CHANNELS.reduce(function (scales, channel) { + var fieldDef; + var specifiedScale; + var channelDef = encoding[channel]; + if (fielddef_1.isFieldDef(channelDef)) { + fieldDef = channelDef; + specifiedScale = channelDef.scale; + } + else if (fielddef_1.hasConditionalFieldDef(channelDef)) { + fieldDef = channelDef.condition; + specifiedScale = channelDef.condition['scale']; + } + else if (channel === 'x') { + fieldDef = fielddef_1.getFieldDef(encoding.x2); + } + else if (channel === 'y') { + fieldDef = fielddef_1.getFieldDef(encoding.y2); + } + if (fieldDef) { + scales[channel] = specifiedScale || {}; + } + return scales; + }, {}); + }; + UnitModel.prototype.initAxes = function (encoding) { + return [channel_1.X, channel_1.Y].reduce(function (_axis, channel) { + // Position Axis + // TODO: handle ConditionFieldDef + var channelDef = encoding[channel]; + if (fielddef_1.isFieldDef(channelDef) || + (channel === channel_1.X && fielddef_1.isFieldDef(encoding.x2)) || + (channel === channel_1.Y && fielddef_1.isFieldDef(encoding.y2))) { + var axisSpec = fielddef_1.isFieldDef(channelDef) ? channelDef.axis : null; + // We no longer support false in the schema, but we keep false here for backward compatibility. + if (axisSpec !== null && axisSpec !== false) { + _axis[channel] = tslib_1.__assign({}, axisSpec); + } + } + return _axis; + }, {}); + }; + UnitModel.prototype.initLegend = function (encoding) { + return channel_1.NONPOSITION_SCALE_CHANNELS.reduce(function (_legend, channel) { + var channelDef = encoding[channel]; + if (channelDef) { + var legend = fielddef_1.isFieldDef(channelDef) ? channelDef.legend : + (fielddef_1.hasConditionalFieldDef(channelDef)) ? channelDef.condition['legend'] : null; + if (legend !== null && legend !== false) { + _legend[channel] = tslib_1.__assign({}, legend); + } + } + return _legend; + }, {}); + }; + UnitModel.prototype.parseData = function () { + this.component.data = parse_2.parseData(this); + }; + UnitModel.prototype.parseLayoutSize = function () { + parse_3.parseUnitLayoutSize(this); + }; + UnitModel.prototype.parseSelection = function () { + this.component.selection = selection_1.parseUnitSelection(this, this.selection); + }; + UnitModel.prototype.parseMarkGroup = function () { + this.component.mark = mark_2.parseMarkGroup(this); + }; + UnitModel.prototype.parseAxisAndHeader = function () { + this.component.axes = parse_1.parseUnitAxis(this); + }; + UnitModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return selection_1.assembleTopLevelSignals(this, signals); + }; + UnitModel.prototype.assembleSelectionSignals = function () { + return selection_1.assembleUnitSelectionSignals(this, []); + }; + UnitModel.prototype.assembleSelectionData = function (data) { + return selection_1.assembleUnitSelectionData(this, data); + }; + UnitModel.prototype.assembleLayout = function () { + return null; + }; + UnitModel.prototype.assembleLayoutSignals = function () { + return assemble_1.assembleLayoutSignals(this); + }; + UnitModel.prototype.assembleMarks = function () { + var marks = this.component.mark || []; + // If this unit is part of a layer, selections should augment + // all in concert rather than each unit individually. This + // ensures correct interleaving of clipping and brushed marks. + if (!this.parent || !model_1.isLayerModel(this.parent)) { + marks = selection_1.assembleUnitSelectionMarks(this, marks); + } + return marks.map(this.correctDataNames); + }; + UnitModel.prototype.assembleLayoutSize = function () { + return { + width: this.getSizeSignalRef('width'), + height: this.getSizeSignalRef('height') + }; + }; + UnitModel.prototype.getMapping = function () { + return this.encoding; + }; + UnitModel.prototype.toSpec = function (excludeConfig, excludeData) { + var encoding = util_1.duplicate(this.encoding); + var spec; + spec = { + mark: this.markDef, + encoding: encoding + }; + if (!excludeConfig) { + spec.config = util_1.duplicate(this.config); + } + if (!excludeData) { + spec.data = util_1.duplicate(this.data); + } + // remove defaults + return spec; + }; + Object.defineProperty(UnitModel.prototype, "mark", { + get: function () { + return this.markDef.type; + }, + enumerable: true, + configurable: true + }); + UnitModel.prototype.channelHasField = function (channel) { + return vlEncoding.channelHasField(this.encoding, channel); + }; + UnitModel.prototype.fieldDef = function (channel) { + var channelDef = this.encoding[channel]; + return fielddef_1.getFieldDef(channelDef); + }; + return UnitModel; +}(model_1.ModelWithField)); +exports.UnitModel = UnitModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL3VuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esc0NBQTJJO0FBRTNJLDhEQUEwQztBQUMxQyx3Q0FBd0Q7QUFDeEQsd0NBQWtHO0FBRWxHLGdDQUEyRDtBQUszRCxrQ0FBZ0Q7QUFDaEQsZ0NBQXdDO0FBR3hDLHNDQUEyQztBQUMzQyxzQ0FBdUM7QUFDdkMsa0RBQTREO0FBQzVELDRDQUF1RDtBQUV2RCxvQ0FBNkM7QUFDN0Msb0NBQTJDO0FBQzNDLGlDQUE0RDtBQUM1RCx1Q0FBb0U7QUFFcEUsbURBQXVLO0FBR3ZLOztHQUVHO0FBQ0g7SUFBK0IscUNBQWM7SUFrQjNDLG1CQUFZLElBQXdCLEVBQUUsTUFBYSxFQUFFLGVBQXVCLEVBQzFFLGVBQXNDLEVBQUUsUUFBdUIsRUFBRSxNQUFjLEVBQVMsR0FBWTtRQUFwRyxnQ0FBQSxFQUFBLG9CQUFzQztRQUR4QyxZQUdFLGtCQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLFNBc0JsRTtRQXhCeUYsU0FBRyxHQUFILEdBQUcsQ0FBUztRQWxCdEYsVUFBSSxHQUFXLE1BQU0sQ0FBQztRQUl0QixxQkFBZSxHQUFlLEVBQUUsQ0FBQztRQUl2QyxtQkFBYSxHQUFjLEVBQUUsQ0FBQztRQUU5QixzQkFBZ0IsR0FBZ0IsRUFBRSxDQUFDO1FBRXRDLHlCQUFtQixHQUFlLEVBQUUsQ0FBQztRQUU1QixlQUFTLEdBQXVCLEVBQUUsQ0FBQztRQUM1QyxjQUFRLEdBQVksRUFBRSxDQUFDO1FBTTVCLEtBQUksQ0FBQyxRQUFRLHNCQUNSLGVBQWUsRUFDZixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3ZDLENB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QUMsVUFBVSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXpPRCxDQUErQixzQkFBYyxHQXlPNUM7QUF6T1ksOEJBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F4aXN9IGZyb20gJy4uL2F4aXMnO1xuaW1wb3J0IHtDaGFubmVsLCBHRU9QT1NJVElPTl9DSEFOTkVMUywgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMsIFNDQUxFX0NIQU5ORUxTLCBTY2FsZUNoYW5uZWwsIFNpbmdsZURlZkNoYW5uZWwsIFgsIFl9IGZyb20gJy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyB2bEVuY29kaW5nIGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7RW5jb2RpbmcsIG5vcm1hbGl6ZUVuY29kaW5nfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQge0NoYW5uZWxEZWYsIEZpZWxkRGVmLCBnZXRGaWVsZERlZiwgaGFzQ29uZGl0aW9uYWxGaWVsZERlZiwgaXNGaWVsZERlZn0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtMZWdlbmR9IGZyb20gJy4uL2xlZ2VuZCc7XG5pbXBvcnQge0dFT1NIQVBFLCBpc01hcmtEZWYsIE1hcmssIE1hcmtEZWZ9IGZyb20gJy4uL21hcmsnO1xuaW1wb3J0IHtQcm9qZWN0aW9ufSBmcm9tICcuLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7RG9tYWluLCBTY2FsZX0gZnJvbSAnLi4vc2NhbGUnO1xuaW1wb3J0IHtTZWxlY3Rpb25EZWZ9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge0xheW91dFNpemVNaXhpbnMsIE5vcm1hbGl6ZWRVbml0U3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge3N0YWNrLCBTdGFja1Byb3BlcnRpZXN9IGZyb20gJy4uL3N0YWNrJztcbmltcG9ydCB7RGljdCwgZHVwbGljYXRlfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7VmdEYXRhLCBWZ0VuY29kZUVudHJ5LCBWZ0xheW91dCwgVmdTaWduYWx9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QXhpc0luZGV4fSBmcm9tICcuL2F4aXMvY29tcG9uZW50JztcbmltcG9ydCB7cGFyc2VVbml0QXhpc30gZnJvbSAnLi9heGlzL3BhcnNlJztcbmltcG9ydCB7cGFyc2VEYXRhfSBmcm9tICcuL2RhdGEvcGFyc2UnO1xuaW1wb3J0IHthc3NlbWJsZUxheW91dFNpZ25hbHN9IGZyb20gJy4vbGF5b3V0c2l6ZS9hc3NlbWJsZSc7XG5pbXBvcnQge3BhcnNlVW5pdExheW91dFNpemV9IGZyb20gJy4vbGF5b3V0c2l6ZS9wYXJzZSc7XG5pbXBvcnQge0xlZ2VuZEluZGV4fSBmcm9tICcuL2xlZ2VuZC9jb21wb25lbnQnO1xuaW1wb3J0IHtub3JtYWxpemVNYXJrRGVmfSBmcm9tICcuL21hcmsvaW5pdCc7XG5pbXBvcnQge3BhcnNlTWFya0dyb3VwfSBmcm9tICcuL21hcmsvbWFyayc7XG5pbXBvcnQge2lzTGF5ZXJNb2RlbCwgTW9kZWwsIE1vZGVsV2l0aEZpZWxkfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZSwgcmVwbGFjZVJlcGVhdGVySW5FbmNvZGluZ30gZnJvbSAnLi9yZXBlYXRlcic7XG5pbXBvcnQge1NjYWxlSW5kZXh9IGZyb20gJy4vc2NhbGUvY29tcG9uZW50JztcbmltcG9ydCB7YXNzZW1ibGVUb3BMZXZlbFNpZ25hbHMsIGFzc2VtYmxlVW5pdFNlbGVjdGlvbkRhdGEsIGFzc2VtYmxlVW5pdFNlbGVjdGlvbk1hcmtzLCBhc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzLCBwYXJzZVVuaXRTZWxlY3Rpb259IGZyb20gJy4vc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5cblxuLyoqXG4gKiBJbnRlcm5hbCBtb2RlbCBvZiBWZWdhLUxpdGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGNvbXBpbGVyLlxuICovXG5leHBvcnQgY2xhc3MgVW5pdE1vZGVsIGV4dGVuZHMgTW9kZWxXaXRoRmllbGQge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogJ3VuaXQnID0gJ3VuaXQnO1xuICBwdWJsaWMgcmVhZG9ubHkgbWFya0RlZjogTWFya0RlZjtcbiAgcHVibGljIHJlYWRvbmx5IGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+O1xuXG4gIHB1YmxpYyByZWFkb25seSBzcGVjaWZpZWRTY2FsZXM6IFNjYWxlSW5kZXggPSB7fTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2s6IFN0YWNrUHJvcGVydGllcztcblxuICBwcm90ZWN0ZWQgc3BlY2lmaWVkQXhlczogQXhpc0luZGV4ID0ge307XG5cbiAgcHJvdGVjdGVkIHNwZWNpZmllZExlZ2VuZHM6IExlZ2VuZEluZGV4ID0ge307XG5cbiAgcHVibGljIHNwZWNpZmllZFByb2plY3Rpb246IFByb2plY3Rpb24gPSB7fTtcblxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uOiBEaWN0PFNlbGVjdGlvbkRlZj4gPSB7fTtcbiAgcHVibGljIGNoaWxkcmVuOiBNb2RlbFtdID0gW107XG5cbiAgY29uc3RydWN0b3Ioc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZyxcbiAgICBwYXJlbnRHaXZlblNpemU6IExheW91dFNpemVNaXhpbnMgPSB7fSwgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnLCBwdWJsaWMgZml0OiBib29sZWFuKSB7XG5cbiAgICBzdXBlcihzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgY29uZmlnLCByZXBlYXRlciwgdW5kZWZpbmVkKTtcbiAgICB0aGlzLmluaXRTaXplKHtcbiAgICAgIC4uLnBhcmVudEdpdmVuU2l6ZSxcbiAgICAgIC4uLihzcGVjLndpZHRoID8ge3dpZHRoOiBzcGVjLndpZHRofSA6IHt9KSxcbiAgICAgIC4uLihzcGVjLmhlaWdodCA/IHtoZWlnaHQ6IHNwZWMuaGVpZ2h0fSA6IHt9KVxuICAgIH0pO1xuICAgIGNvbnN0IG1hcmsgPSBpc01hcmtEZWYoc3BlYy5tYXJrKSA/IHNwZWMubWFyay50eXBlIDogc3BlYy5tYXJrO1xuXG4gICAgY29uc3QgZW5jb2RpbmcgPSB0aGlzLmVuY29kaW5nID0gbm9ybWFsaXplRW5jb2RpbmcocmVwbGFjZVJlcGVhdGVySW5FbmNvZGluZyhzcGVjLmVuY29kaW5nIHx8IHt9LCByZXBlYXRlciksIG1hcmspO1xuXG4gICAgdGhpcy5tYXJrRGVmID0gbm9ybWFsaXplTWFya0RlZihzcGVjLm1hcmssIGVuY29kaW5nLCBjb25maWcpO1xuXG4gICAgLy8gY2FsY3VsYXRlIHN0YWNrIHByb3BlcnRpZXNcbiAgICB0aGlzLnN0YWNrID0gc3RhY2sobWFyaywgZW5jb2RpbmcsIHRoaXMuY29uZmlnLnN0YWNrKTtcbiAgICB0aGlzLnNwZWNpZmllZFNjYWxlcyA9IHRoaXMuaW5pdFNjYWxlcyhtYXJrLCBlbmNvZGluZyk7XG5cbiAgICB0aGlzLnNwZWNpZmllZEF4ZXMgPSB0aGlzLmluaXRBeGVzKGVuY29kaW5nKTtcbiAgICB0aGlzLnNwZWNpZmllZExlZ2VuZHMgPSB0aGlzLmluaXRMZWdlbmQoZW5jb2RpbmcpO1xuICAgIHRoaXMuc3BlY2lmaWVkUHJvamVjdGlvbiA9IHNwZWMucHJvamVjdGlvbjtcblxuICAgIC8vIFNlbGVjdGlvbnMgd2lsbCBiZSBpbml0aWFsaXplZCB1cG9uIHBhcnNlLlxuICAgIHRoaXMuc2VsZWN0aW9uID0gc3BlYy5zZWxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc1Byb2plY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgY29uc3Qge2VuY29kaW5nfSA9IHRoaXM7XG4gICAgY29uc3QgaXNHZW9TaGFwZU1hcmsgPSB0aGlzLm1hcmsgPT09IEdFT1NIQVBFO1xuICAgIGNvbnN0IGhhc0dlb1Bvc2l0aW9uID0gZW5jb2RpbmcgJiYgR0VPUE9TSVRJT05fQ0hBTk5FTFMuc29tZShcbiAgICAgIGNoYW5uZWwgPT4gaXNGaWVsZERlZihlbmNvZGluZ1tjaGFubmVsXSlcbiAgICApO1xuICAgIHJldHVybiBpc0dlb1NoYXBlTWFyayB8fCBoYXNHZW9Qb3NpdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc3BlY2lmaWVkIFZlZ2EtbGl0ZSBzY2FsZSBkb21haW4gZm9yIGEgcGFydGljdWxhciBjaGFubmVsXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICBwdWJsaWMgc2NhbGVEb21haW4oY2hhbm5lbDogU2NhbGVDaGFubmVsKTogRG9tYWluIHtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuc3BlY2lmaWVkU2NhbGVzW2NoYW5uZWxdO1xuICAgIHJldHVybiBzY2FsZSA/IHNjYWxlLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBheGlzKGNoYW5uZWw6IENoYW5uZWwpOiBBeGlzIHtcbiAgICByZXR1cm4gdGhpcy5zcGVjaWZpZWRBeGVzW2NoYW5uZWxdO1xuICB9XG5cbiAgcHVibGljIGxlZ2VuZChjaGFubmVsOiBDaGFubmVsKTogTGVnZW5kIHtcbiAgICByZXR1cm4gdGhpcy5zcGVjaWZpZWRMZWdlbmRzW2NoYW5uZWxdO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U2NhbGVzKG1hcms6IE1hcmssIGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+KTogU2NhbGVJbmRleCB7XG4gICAgcmV0dXJuIFNDQUxFX0NIQU5ORUxTLnJlZHVjZSgoc2NhbGVzLCBjaGFubmVsKSA9PiB7XG4gICAgICBsZXQgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz47XG4gICAgICBsZXQgc3BlY2lmaWVkU2NhbGU6IFNjYWxlO1xuXG4gICAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG5cbiAgICAgIGlmIChpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIGZpZWxkRGVmID0gY2hhbm5lbERlZjtcbiAgICAgICAgc3BlY2lmaWVkU2NhbGUgPSBjaGFubmVsRGVmLnNjYWxlO1xuICAgICAgfSBlbHNlIGlmIChoYXNDb25kaXRpb25hbEZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIGZpZWxkRGVmID0gY2hhbm5lbERlZi5jb25kaXRpb247XG4gICAgICAgIHNwZWNpZmllZFNjYWxlID0gY2hhbm5lbERlZi5jb25kaXRpb25bJ3NjYWxlJ107XG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWwgPT09ICd4Jykge1xuICAgICAgICBmaWVsZERlZiA9IGdldEZpZWxkRGVmKGVuY29kaW5nLngyKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PT0gJ3knKSB7XG4gICAgICAgIGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmcueTIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGREZWYpIHtcbiAgICAgICAgc2NhbGVzW2NoYW5uZWxdID0gc3BlY2lmaWVkU2NhbGUgfHwge307XG4gICAgICB9XG4gICAgICByZXR1cm4gc2NhbGVzO1xuICAgIH0sIHt9IGFzIFNjYWxlSW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QXhlcyhlbmNvZGluZzogRW5jb2Rpbmc8c3RyaW5nPik6IEF4aXNJbmRleCB7XG4gICAgcmV0dXJuIFtYLCBZXS5yZWR1Y2UoZnVuY3Rpb24oX2F4aXMsIGNoYW5uZWwpIHtcbiAgICAgIC8vIFBvc2l0aW9uIEF4aXNcblxuICAgICAgLy8gVE9ETzogaGFuZGxlIENvbmRpdGlvbkZpZWxkRGVmXG4gICAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG4gICAgICBpZiAoaXNGaWVsZERlZihjaGFubmVsRGVmKSB8fFxuICAgICAgICAgIChjaGFubmVsID09PSBYICYmIGlzRmllbGREZWYoZW5jb2RpbmcueDIpKSB8fFxuICAgICAgICAgIChjaGFubmVsID09PSBZICYmIGlzRmllbGREZWYoZW5jb2RpbmcueTIpKSkge1xuXG4gICAgICAgIGNvbnN0IGF4aXNTcGVjID0gaXNGaWVsZERlZihjaGFubmVsRGVmKSA/IGNoYW5uZWxEZWYuYXhpcyA6IG51bGw7XG5cbiAgICAgICAgLy8gV2Ugbm8gbG9uZ2VyIHN1cHBvcnQgZmFsc2UgaW4gdGhlIHNjaGVtYSwgYnV0IHdlIGtlZXAgZmFsc2UgaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgaWYgKGF4aXNTcGVjICE9PSBudWxsICYmIGF4aXNTcGVjICE9PSBmYWxzZSkge1xuICAgICAgICAgIF9heGlzW2NoYW5uZWxdID0ge1xuICAgICAgICAgICAgLi4uYXhpc1NwZWNcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gX2F4aXM7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0TGVnZW5kKGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+KTogTGVnZW5kSW5kZXgge1xuICAgIHJldHVybiBOT05QT1NJVElPTl9TQ0FMRV9DSEFOTkVMUy5yZWR1Y2UoZnVuY3Rpb24oX2xlZ2VuZCwgY2hhbm5lbCkge1xuICAgICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgICAgaWYgKGNoYW5uZWxEZWYpIHtcbiAgICAgICAgY29uc3QgbGVnZW5kID0gaXNGaWVsZERlZihjaGFubmVsRGVmKSA/IGNoYW5uZWxEZWYubGVnZW5kIDpcbiAgICAgICAgICAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKSkgPyBjaGFubmVsRGVmLmNvbmRpdGlvblsnbGVnZW5kJ10gOiBudWxsO1xuXG4gICAgICAgIGlmIChsZWdlbmQgIT09IG51bGwgJiYgbGVnZW5kICE9PSBmYWxzZSkge1xuICAgICAgICAgIF9sZWdlbmRbY2hhbm5lbF0gPSB7Li4ubGVnZW5kfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gX2xlZ2VuZDtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VEYXRhKCkge1xuICAgIHRoaXMuY29tcG9uZW50LmRhdGEgPSBwYXJzZURhdGEodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYXlvdXRTaXplKCkge1xuICAgIHBhcnNlVW5pdExheW91dFNpemUodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VTZWxlY3Rpb24oKSB7XG4gICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uID0gcGFyc2VVbml0U2VsZWN0aW9uKHRoaXMsIHRoaXMuc2VsZWN0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZU1hcmtHcm91cCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5tYXJrID0gcGFyc2VNYXJrR3JvdXAodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VBeGlzQW5kSGVhZGVyKCkge1xuICAgIHRoaXMuY29tcG9uZW50LmF4ZXMgPSBwYXJzZVVuaXRBeGlzKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKHNpZ25hbHM6IGFueVtdKTogVmdTaWduYWxbXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlVG9wTGV2ZWxTaWduYWxzKHRoaXMsIHNpZ25hbHMpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gYXNzZW1ibGVVbml0U2VsZWN0aW9uU2lnbmFscyh0aGlzLCBbXSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGE6IFZnRGF0YVtdKTogVmdEYXRhW10ge1xuICAgIHJldHVybiBhc3NlbWJsZVVuaXRTZWxlY3Rpb25EYXRhKHRoaXMsIGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0KCk6IFZnTGF5b3V0IHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxheW91dFNpZ25hbHMoKTogVmdTaWduYWxbXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlTGF5b3V0U2lnbmFscyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZU1hcmtzKCkge1xuICAgIGxldCBtYXJrcyA9IHRoaXMuY29tcG9uZW50Lm1hcmsgfHwgW107XG5cbiAgICAvLyBJZiB0aGlzIHVuaXQgaXMgcGFydCBvZiBhIGxheWVyLCBzZWxlY3Rpb25zIHNob3VsZCBhdWdtZW50XG4gICAgLy8gYWxsIGluIGNvbmNlcnQgcmF0aGVyIHRoYW4gZWFjaCB1bml0IGluZGl2aWR1YWxseS4gVGhpc1xuICAgIC8vIGVuc3VyZXMgY29ycmVjdCBpbnRlcmxlYXZpbmcgb2YgY2xpcHBpbmcgYW5kIGJydXNoZWQgbWFya3MuXG4gICAgaWYgKCF0aGlzLnBhcmVudCB8fCAhaXNMYXllck1vZGVsKHRoaXMucGFyZW50KSkge1xuICAgICAgbWFya3MgPSBhc3NlbWJsZVVuaXRTZWxlY3Rpb25NYXJrcyh0aGlzLCBtYXJrcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmtzLm1hcCh0aGlzLmNvcnJlY3REYXRhTmFtZXMpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2l6ZSgpOiBWZ0VuY29kZUVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuZ2V0U2l6ZVNpZ25hbFJlZignd2lkdGgnKSxcbiAgICAgIGhlaWdodDogdGhpcy5nZXRTaXplU2lnbmFsUmVmKCdoZWlnaHQnKVxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0TWFwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5lbmNvZGluZztcbiAgfVxuXG4gIHB1YmxpYyB0b1NwZWMoZXhjbHVkZUNvbmZpZz86IGFueSwgZXhjbHVkZURhdGE/OiBhbnkpIHtcbiAgICBjb25zdCBlbmNvZGluZyA9IGR1cGxpY2F0ZSh0aGlzLmVuY29kaW5nKTtcbiAgICBsZXQgc3BlYzogYW55O1xuXG4gICAgc3BlYyA9IHtcbiAgICAgIG1hcms6IHRoaXMubWFya0RlZixcbiAgICAgIGVuY29kaW5nOiBlbmNvZGluZ1xuICAgIH07XG5cbiAgICBpZiAoIWV4Y2x1ZGVDb25maWcpIHtcbiAgICAgIHNwZWMuY29uZmlnID0gZHVwbGljYXRlKHRoaXMuY29uZmlnKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4Y2x1ZGVEYXRhKSB7XG4gICAgICBzcGVjLmRhdGEgPSBkdXBsaWNhdGUodGhpcy5kYXRhKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgZGVmYXVsdHNcbiAgICByZXR1cm4gc3BlYztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWFyaygpOiBNYXJrIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrRGVmLnR5cGU7XG4gIH1cblxuICBwdWJsaWMgY2hhbm5lbEhhc0ZpZWxkKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICByZXR1cm4gdmxFbmNvZGluZy5jaGFubmVsSGFzRmllbGQodGhpcy5lbmNvZGluZywgY2hhbm5lbCk7XG4gIH1cblxuICBwdWJsaWMgZmllbGREZWYoY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCk6IEZpZWxkRGVmPHN0cmluZz4ge1xuICAgIGNvbnN0IGNoYW5uZWxEZWYgPSB0aGlzLmVuY29kaW5nW2NoYW5uZWxdIGFzIENoYW5uZWxEZWY8c3RyaW5nPjtcbiAgICByZXR1cm4gZ2V0RmllbGREZWYoY2hhbm5lbERlZik7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compositemark/boxplot.d.ts b/build/src/compositemark/boxplot.d.ts new file mode 100644 index 0000000000..610043219c --- /dev/null +++ b/build/src/compositemark/boxplot.d.ts @@ -0,0 +1,57 @@ +import { Config } from '../config'; +import { Encoding } from './../encoding'; +import { MarkConfig } from './../mark'; +import { GenericUnitSpec, NormalizedLayerSpec } from './../spec'; +import { Orient } from './../vega.schema'; +export declare const BOXPLOT: 'box-plot'; +export declare type BOXPLOT = typeof BOXPLOT; +export declare type BoxPlotStyle = 'boxWhisker' | 'box' | 'boxMid'; +export interface BoxPlotDef { + /** + * Type of the mark. For box plots, this should always be `"box-plot"`. + * [boxplot](https://vega.github.io/vega-lite/docs/compositemark.html#boxplot) + */ + type: BOXPLOT; + /** + * Orientation of the box plot. This is normally automatically determined, but can be specified when the orientation is ambiguous and cannot be automatically determined. + */ + orient?: Orient; + /** + * Extent is used to determine where the whiskers extend to. The options are + * - `"min-max": min and max are the lower and upper whiskers respectively. + * - A scalar (integer or floating point number) that will be multiplied by the IQR and the product will be added to the third quartile to get the upper whisker and subtracted from the first quartile to get the lower whisker. + * __Default value:__ `"1.5"`. + */ + extent?: 'min-max' | number; +} +export declare function isBoxPlotDef(mark: BOXPLOT | BoxPlotDef): mark is BoxPlotDef; +export declare const BOXPLOT_STYLES: BoxPlotStyle[]; +export interface BoxPlotConfig extends MarkConfig { + /** Size of the box and mid tick of a box plot */ + size?: number; + /** The default extent, which is used to determine where the whiskers extend to. The options are + * - `"min-max": min and max are the lower and upper whiskers respectively. + * - `"number": A scalar (integer or floating point number) that will be multiplied by the IQR and the product will be added to the third quartile to get the upper whisker and subtracted from the first quartile to get the lower whisker. + */ + extent?: 'min-max' | number; +} +export interface BoxPlotConfigMixins { + /** + * Box Config + * @hide + */ + box?: BoxPlotConfig; + /** + * @hide + */ + boxWhisker?: MarkConfig; + /** + * @hide + */ + boxMid?: MarkConfig; +} +export declare const VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX: { + [k in keyof BoxPlotConfigMixins]?: (keyof BoxPlotConfigMixins[k])[]; +}; +export declare function filterUnsupportedChannels(spec: GenericUnitSpec, BOXPLOT | BoxPlotDef>): GenericUnitSpec, BOXPLOT | BoxPlotDef>; +export declare function normalizeBoxPlot(spec: GenericUnitSpec, BOXPLOT | BoxPlotDef>, config: Config): NormalizedLayerSpec; diff --git a/build/src/compositemark/boxplot.js b/build/src/compositemark/boxplot.js new file mode 100644 index 0000000000..1d56fae43c --- /dev/null +++ b/build/src/compositemark/boxplot.js @@ -0,0 +1,264 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var encoding_1 = require("../encoding"); +var encoding_2 = require("./../encoding"); +var fielddef_1 = require("./../fielddef"); +var log = tslib_1.__importStar(require("./../log")); +var common_1 = require("./common"); +exports.BOXPLOT = 'box-plot'; +function isBoxPlotDef(mark) { + return !!mark['type']; +} +exports.isBoxPlotDef = isBoxPlotDef; +exports.BOXPLOT_STYLES = ['boxWhisker', 'box', 'boxMid']; +exports.VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX = { + box: ['size', 'color', 'extent'], + boxWhisker: ['color'], + boxMid: ['color'] +}; +var supportedChannels = ['x', 'y', 'color', 'detail', 'opacity', 'size']; +function filterUnsupportedChannels(spec) { + return tslib_1.__assign({}, spec, { encoding: encoding_1.reduce(spec.encoding, function (newEncoding, fieldDef, channel) { + if (supportedChannels.indexOf(channel) > -1) { + newEncoding[channel] = fieldDef; + } + else { + log.warn(log.message.incompatibleChannel(channel, exports.BOXPLOT)); + } + return newEncoding; + }, {}) }); +} +exports.filterUnsupportedChannels = filterUnsupportedChannels; +function normalizeBoxPlot(spec, config) { + var _a, _b, _c, _d; + spec = filterUnsupportedChannels(spec); + // TODO: use selection + var mark = spec.mark, encoding = spec.encoding, selection = spec.selection, _p = spec.projection, outerSpec = tslib_1.__rest(spec, ["mark", "encoding", "selection", "projection"]); + var kIQRScalar = undefined; + if (vega_util_1.isNumber(config.box.extent)) { + kIQRScalar = config.box.extent; + } + if (isBoxPlotDef(mark)) { + if (mark.extent) { + if (mark.extent === 'min-max') { + kIQRScalar = undefined; + } + } + } + var orient = boxOrient(spec); + var _e = boxParams(spec, orient, kIQRScalar), transform = _e.transform, continuousAxisChannelDef = _e.continuousAxisChannelDef, continuousAxis = _e.continuousAxis, encodingWithoutContinuousAxis = _e.encodingWithoutContinuousAxis; + var color = encodingWithoutContinuousAxis.color, size = encodingWithoutContinuousAxis.size, encodingWithoutSizeColorAndContinuousAxis = tslib_1.__rest(encodingWithoutContinuousAxis, ["color", "size"]); + // Size encoding or the default config.box.size is applied to box and boxMid + var sizeMixins = size ? { size: size } : common_1.getMarkSpecificConfigMixins(config.box, 'size'); + var continuousAxisScaleAndAxis = {}; + if (continuousAxisChannelDef.scale) { + continuousAxisScaleAndAxis['scale'] = continuousAxisChannelDef.scale; + } + if (continuousAxisChannelDef.axis) { + continuousAxisScaleAndAxis['axis'] = continuousAxisChannelDef.axis; + } + return tslib_1.__assign({}, outerSpec, { transform: transform, layer: [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + encoding: tslib_1.__assign((_a = {}, _a[continuousAxis] = tslib_1.__assign({ field: 'lower_whisker_' + continuousAxisChannelDef.field, type: continuousAxisChannelDef.type }, continuousAxisScaleAndAxis), _a[continuousAxis + '2'] = { + field: 'lower_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _a), encodingWithoutSizeColorAndContinuousAxis, common_1.getMarkSpecificConfigMixins(config.boxWhisker, 'color')) + }, { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + encoding: tslib_1.__assign((_b = {}, _b[continuousAxis] = { + field: 'upper_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _b[continuousAxis + '2'] = { + field: 'upper_whisker_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _b), encodingWithoutSizeColorAndContinuousAxis, common_1.getMarkSpecificConfigMixins(config.boxWhisker, 'color')) + }, + tslib_1.__assign({}, (selection ? { selection: selection } : {}), { mark: { + type: 'bar', + style: 'box' + }, encoding: tslib_1.__assign((_c = {}, _c[continuousAxis] = { + field: 'lower_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _c[continuousAxis + '2'] = { + field: 'upper_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _c), encodingWithoutContinuousAxis, (encodingWithoutContinuousAxis.color ? {} : common_1.getMarkSpecificConfigMixins(config.box, 'color')), sizeMixins) }), + { + mark: { + type: 'tick', + style: 'boxMid' + }, + encoding: tslib_1.__assign((_d = {}, _d[continuousAxis] = { + field: 'mid_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _d), encodingWithoutSizeColorAndContinuousAxis, common_1.getMarkSpecificConfigMixins(config.boxMid, 'color'), sizeMixins) + } + ] }); +} +exports.normalizeBoxPlot = normalizeBoxPlot; +function boxOrient(spec) { + var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = tslib_1.__rest(spec, ["mark", "encoding", "projection"]); + if (fielddef_1.isFieldDef(encoding.x) && fielddef_1.isContinuous(encoding.x)) { + // x is continuous + if (fielddef_1.isFieldDef(encoding.y) && fielddef_1.isContinuous(encoding.y)) { + // both x and y are continuous + if (encoding.x.aggregate === undefined && encoding.y.aggregate === exports.BOXPLOT) { + return 'vertical'; + } + else if (encoding.y.aggregate === undefined && encoding.x.aggregate === exports.BOXPLOT) { + return 'horizontal'; + } + else if (encoding.x.aggregate === exports.BOXPLOT && encoding.y.aggregate === exports.BOXPLOT) { + throw new Error('Both x and y cannot have aggregate'); + } + else { + if (isBoxPlotDef(mark) && mark.orient) { + return mark.orient; + } + // default orientation = vertical + return 'vertical'; + } + } + // x is continuous but y is not + return 'horizontal'; + } + else if (fielddef_1.isFieldDef(encoding.y) && fielddef_1.isContinuous(encoding.y)) { + // y is continuous but x is not + return 'vertical'; + } + else { + // Neither x nor y is continuous. + throw new Error('Need a valid continuous axis for boxplots'); + } +} +function boxContinousAxis(spec, orient) { + var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = tslib_1.__rest(spec, ["mark", "encoding", "projection"]); + var continuousAxisChannelDef; + var continuousAxis; + if (orient === 'vertical') { + continuousAxis = 'y'; + continuousAxisChannelDef = encoding.y; // Safe to cast because if y is not continuous fielddef, the orient would not be vertical. + } + else { + continuousAxis = 'x'; + continuousAxisChannelDef = encoding.x; // Safe to cast because if x is not continuous fielddef, the orient would not be horizontal. + } + if (continuousAxisChannelDef && continuousAxisChannelDef.aggregate) { + var aggregate = continuousAxisChannelDef.aggregate, continuousAxisWithoutAggregate = tslib_1.__rest(continuousAxisChannelDef, ["aggregate"]); + if (aggregate !== exports.BOXPLOT) { + log.warn("Continuous axis should not have customized aggregation function " + aggregate); + } + continuousAxisChannelDef = continuousAxisWithoutAggregate; + } + return { + continuousAxisChannelDef: continuousAxisChannelDef, + continuousAxis: continuousAxis + }; +} +function boxParams(spec, orient, kIQRScalar) { + var _a = boxContinousAxis(spec, orient), continuousAxisChannelDef = _a.continuousAxisChannelDef, continuousAxis = _a.continuousAxis; + var encoding = spec.encoding; + var isMinMax = kIQRScalar === undefined; + var aggregate = [ + { + op: 'q1', + field: continuousAxisChannelDef.field, + as: 'lower_box_' + continuousAxisChannelDef.field + }, + { + op: 'q3', + field: continuousAxisChannelDef.field, + as: 'upper_box_' + continuousAxisChannelDef.field + }, + { + op: 'median', + field: continuousAxisChannelDef.field, + as: 'mid_box_' + continuousAxisChannelDef.field + } + ]; + var postAggregateCalculates = []; + aggregate.push({ + op: 'min', + field: continuousAxisChannelDef.field, + as: (isMinMax ? 'lower_whisker_' : 'min_') + continuousAxisChannelDef.field + }); + aggregate.push({ + op: 'max', + field: continuousAxisChannelDef.field, + as: (isMinMax ? 'upper_whisker_' : 'max_') + continuousAxisChannelDef.field + }); + if (!isMinMax) { + postAggregateCalculates = [ + { + calculate: "datum.upper_box_" + continuousAxisChannelDef.field + " - datum.lower_box_" + continuousAxisChannelDef.field, + as: 'iqr_' + continuousAxisChannelDef.field + }, + { + calculate: "min(datum.upper_box_" + continuousAxisChannelDef.field + " + datum.iqr_" + continuousAxisChannelDef.field + " * " + kIQRScalar + ", datum.max_" + continuousAxisChannelDef.field + ")", + as: 'upper_whisker_' + continuousAxisChannelDef.field + }, + { + calculate: "max(datum.lower_box_" + continuousAxisChannelDef.field + " - datum.iqr_" + continuousAxisChannelDef.field + " * " + kIQRScalar + ", datum.min_" + continuousAxisChannelDef.field + ")", + as: 'lower_whisker_' + continuousAxisChannelDef.field + } + ]; + } + var groupby = []; + var bins = []; + var timeUnits = []; + var encodingWithoutContinuousAxis = {}; + encoding_2.forEach(encoding, function (channelDef, channel) { + if (channel === continuousAxis) { + // Skip continuous axis as we already handle it separately + return; + } + if (fielddef_1.isFieldDef(channelDef)) { + if (channelDef.aggregate && channelDef.aggregate !== exports.BOXPLOT) { + aggregate.push({ + op: channelDef.aggregate, + field: channelDef.field, + as: fielddef_1.vgField(channelDef) + }); + } + else if (channelDef.aggregate === undefined) { + var transformedField = fielddef_1.vgField(channelDef); + // Add bin or timeUnit transform if applicable + var bin = channelDef.bin; + if (bin) { + var field = channelDef.field; + bins.push({ bin: bin, field: field, as: transformedField }); + } + else if (channelDef.timeUnit) { + var timeUnit = channelDef.timeUnit, field = channelDef.field; + timeUnits.push({ timeUnit: timeUnit, field: field, as: transformedField }); + } + groupby.push(transformedField); + } + // now the field should refer to post-transformed field instead + encodingWithoutContinuousAxis[channel] = { + field: fielddef_1.vgField(channelDef), + type: channelDef.type + }; + } + else { + // For value def, just copy + encodingWithoutContinuousAxis[channel] = encoding[channel]; + } + }); + return { + transform: [].concat(bins, timeUnits, [{ aggregate: aggregate, groupby: groupby }], postAggregateCalculates), + continuousAxisChannelDef: continuousAxisChannelDef, + continuousAxis: continuousAxis, + encodingWithoutContinuousAxis: encodingWithoutContinuousAxis + }; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94cGxvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb3NpdGVtYXJrL2JveHBsb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQW1DO0FBR25DLHdDQUFtQztBQUVuQywwQ0FBZ0Q7QUFDaEQsMENBQW1HO0FBQ25HLG9EQUFnQztBQUloQyxtQ0FBcUQ7QUFHeEMsUUFBQSxPQUFPLEdBQWUsVUFBVSxDQUFDO0FBMEI5QyxzQkFBNkIsSUFBMEI7SUFDckQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFGRCxvQ0FFQztBQUVZLFFBQUEsY0FBYyxHQUFtQixDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUE4QmpFLFFBQUEscUNBQXFDLEdBRTlDO0lBQ0YsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7SUFDaEMsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3JCLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQztDQUNsQixDQUFDO0FBRUYsSUFBTSxpQkFBaUIsR0FBYyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEYsbUNBQTBDLElBQTZEO0lBQ3JHLDRCQUNLLElBQUksSUFDUCxRQUFRLEVBQUUsaUJBQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQzdELElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMzQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxt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QUFVLENBQUMsR0FBRyxDQUFDO2dCQUMzQixJQUFJLEdBQUcsRUFBRTtvQkFDQSxJQUFBLHdCQUFLLENBQWU7b0JBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEtBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO2lCQUMvQztxQkFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0JBQ3ZCLElBQUEsOEJBQVEsRUFBRSx3QkFBSyxDQUFlO29CQUNyQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxVQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztpQkFDekQ7Z0JBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsK0RBQStEO1lBQy9ELDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxHQUFHO2dCQUN2QyxLQUFLLEVBQUUsa0JBQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSTthQUN0QixDQUFDO1NBQ0g7YUFBTTtZQUNMLDJCQUEyQjtZQUMzQiw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUQ7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU87UUFDTCxTQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FDbEIsSUFBSSxFQUNKLFNBQVMsRUFDVCxDQUFDLEVBQUMsU0FBUyxXQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUMsQ0FBQyxFQUN0Qix1QkFBdUIsQ0FDeEI7UUFDRCx3QkFBd0IsMEJBQUE7UUFDeEIsY0FBYyxnQkFBQTtRQUNkLDZCQUE2QiwrQkFBQTtLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWx9IGZyb20gJy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtBZ2dyZWdhdGVkRmllbGREZWYsIEJpblRyYW5zZm9ybSwgQ2FsY3VsYXRlVHJhbnNmb3JtLCBUaW1lVW5pdFRyYW5zZm9ybX0gZnJvbSAnLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RW5jb2RpbmcsIGZvckVhY2h9IGZyb20gJy4vLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGaWVsZCwgRmllbGREZWYsIGlzQ29udGludW91cywgaXNGaWVsZERlZiwgUG9zaXRpb25GaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrQ29uZmlnfSBmcm9tICcuLy4uL21hcmsnO1xuaW1wb3J0IHtHZW5lcmljVW5pdFNwZWMsIE5vcm1hbGl6ZWRMYXllclNwZWN9IGZyb20gJy4vLi4vc3BlYyc7XG5pbXBvcnQge09yaWVudH0gZnJvbSAnLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2dldE1hcmtTcGVjaWZpY0NvbmZpZ01peGluc30gZnJvbSAnLi9jb21tb24nO1xuXG5cbmV4cG9ydCBjb25zdCBCT1hQTE9UOiAnYm94LXBsb3QnID0gJ2JveC1wbG90JztcbmV4cG9ydCB0eXBlIEJPWFBMT1QgPSB0eXBlb2YgQk9YUExPVDtcbmV4cG9ydCB0eXBlIEJveFBsb3RTdHlsZSA9ICdib3hXaGlza2VyJyB8ICdib3gnIHwgJ2JveE1pZCc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBCb3hQbG90RGVmIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIG1hcmsuICBGb3IgYm94IHBsb3RzLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgYFwiYm94LXBsb3RcImAuXG4gICAqIFtib3hwbG90XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbXBvc2l0ZW1hcmsuaHRtbCNib3hwbG90KVxuICAgKi9cbiAgdHlwZTogQk9YUExPVDtcblxuICAvKipcbiAgICogT3JpZW50YXRpb24gb2YgdGhlIGJveCBwbG90LiAgVGhpcyBpcyBub3JtYWxseSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQsIGJ1dCBjYW4gYmUgc3BlY2lmaWVkIHdoZW4gdGhlIG9yaWVudGF0aW9uIGlzIGFtYmlndW91cyBhbmQgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cbiAgICovXG4gIG9yaWVudD86IE9yaWVudDtcblxuICAvKipcbiAgICogRXh0ZW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aGlza2VycyBleHRlbmQgdG8uIFRoZSBvcHRpb25zIGFyZVxuICAgKiAtIGBcIm1pbi1tYXhcIjogbWluIGFuZCBtYXggYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIgd2hpc2tlcnMgcmVzcGVjdGl2ZWx5LlxuICAgKiAtICBBIHNjYWxhciAoaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXIpIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBJUVIgYW5kIHRoZSBwcm9kdWN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRoaXJkIHF1YXJ0aWxlIHRvIGdldCB0aGUgdXBwZXIgd2hpc2tlciBhbmQgc3VidHJhY3RlZCBmcm9tIHRoZSBmaXJzdCBxdWFydGlsZSB0byBnZXQgdGhlIGxvd2VyIHdoaXNrZXIuXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCIxLjVcImAuXG4gICAqL1xuICBleHRlbnQ/OiAnbWluLW1heCcgfCBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JveFBsb3REZWYobWFyazogQk9YUExPVCB8IEJveFBsb3REZWYpOiBtYXJrIGlzIEJveFBsb3REZWYge1xuICByZXR1cm4gISFtYXJrWyd0eXBlJ107XG59XG5cbmV4cG9ydCBjb25zdCBCT1hQTE9UX1NUWUxFUzogQm94UGxvdFN0eWxlW10gPSBbJ2JveFdoaXNrZXInLCAnYm94JywgJ2JveE1pZCddO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJveFBsb3RDb25maWcgZXh0ZW5kcyBNYXJrQ29uZmlnIHtcbiAgLyoqIFNpemUgb2YgdGhlIGJveCBhbmQgbWlkIHRpY2sgb2YgYSBib3ggcGxvdCAqL1xuICBzaXplPzogbnVtYmVyO1xuICAvKiogVGhlIGRlZmF1bHQgZXh0ZW50LCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGVyZSB0aGUgd2hpc2tlcnMgZXh0ZW5kIHRvLiBUaGUgb3B0aW9ucyBhcmVcbiAgICogLSBgXCJtaW4tbWF4XCI6IG1pbiBhbmQgbWF4IGFyZSB0aGUgbG93ZXIgYW5kIHVwcGVyIHdoaXNrZXJzIHJlc3BlY3RpdmVseS5cbiAgICogLSBgXCJudW1iZXJcIjogQSBzY2FsYXIgKGludGVnZXIgb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVyKSB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCBieSB0aGUgSVFSIGFuZCB0aGUgcHJvZHVjdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aGlyZCBxdWFydGlsZSB0byBnZXQgdGhlIHVwcGVyIHdoaXNrZXIgYW5kIHN1YnRyYWN0ZWQgZnJvbSB0aGUgZmlyc3QgcXVhcnRpbGUgdG8gZ2V0IHRoZSBsb3dlciB3aGlza2VyLlxuICAgKi9cbiAgZXh0ZW50PzogJ21pbi1tYXgnIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJveFBsb3RDb25maWdNaXhpbnMge1xuICAvKipcbiAgICogQm94IENvbmZpZ1xuICAgKiBAaGlkZVxuICAgKi9cbiAgYm94PzogQm94UGxvdENvbmZpZztcblxuICAvKipcbiAgICogQGhpZGVcbiAgICovXG4gIGJveFdoaXNrZXI/OiBNYXJrQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBAaGlkZVxuICAgKi9cbiAgYm94TWlkPzogTWFya0NvbmZpZztcbn1cblxuZXhwb3J0IGNvbnN0IFZMX09OTFlfQk9YUExPVF9DT05GSUdfUFJPUEVSVFlfSU5ERVg6IHtcbiAgW2sgaW4ga2V5b2YgQm94UGxvdENvbmZpZ01peGluc10/OiAoa2V5b2YgQm94UGxvdENvbmZpZ01peGluc1trXSlbXVxufSA9IHtcbiAgYm94OiBbJ3NpemUnLCAnY29sb3InLCAnZXh0ZW50J10sXG4gIGJveFdoaXNrZXI6IFsnY29sb3InXSxcbiAgYm94TWlkOiBbJ2NvbG9yJ11cbn07XG5cbmNvbnN0IHN1cHBvcnRlZENoYW5uZWxzOiBDaGFubmVsW10gPSBbJ3gnLCAneScsICdjb2xvcicsICdkZXRhaWwnLCAnb3BhY2l0eScsICdzaXplJ107XG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVW5zdXBwb3J0ZWRDaGFubmVscyhzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nPiwgQk9YUExPVCB8IEJveFBsb3REZWY+KTogR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZz4sIEJPWFBMT1QgfCBCb3hQbG90RGVmPiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3BlYyxcbiAgICBlbmNvZGluZzogcmVkdWNlKHNwZWMuZW5jb2RpbmcsIChuZXdFbmNvZGluZywgZmllbGREZWYsIGNoYW5uZWwpID0+IHtcbiAgICAgIGlmIChzdXBwb3J0ZWRDaGFubmVscy5pbmRleE9mKGNoYW5uZWwpID4gLTEpIHtcbiAgICAgICAgbmV3RW5jb2RpbmdbY2hhbm5lbF0gPSBmaWVsZERlZjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmluY29tcGF0aWJsZUNoYW5uZWwoY2hhbm5lbCwgQk9YUExPVCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld0VuY29kaW5nO1xuICAgIH0sIHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJveFBsb3Qoc3BlYzogR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZz4sIEJPWFBMT1QgfCBCb3hQbG90RGVmPiwgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkTGF5ZXJTcGVjIHtcbiAgc3BlYyA9IGZpbHRlclVuc3VwcG9ydGVkQ2hhbm5lbHMoc3BlYyk7XG4gIC8vIFRPRE86IHVzZSBzZWxlY3Rpb25cbiAgY29uc3Qge21hcmssIGVuY29kaW5nLCBzZWxlY3Rpb24sIHByb2plY3Rpb246IF9wLCAuLi5vdXRlclNwZWN9ID0gc3BlYztcblxuICBsZXQga0lRUlNjYWxhcjogbnVtYmVyID0gdW5kZWZpbmVkO1xuICBpZiAoaXNOdW1iZXIoY29uZmlnLmJveC5leHRlbnQpKSB7XG4gICAga0lRUlNjYWxhciA9IGNvbmZpZy5ib3guZXh0ZW50O1xuICB9XG5cbiAgaWYgKGlzQm94UGxvdERlZihtYXJrKSkge1xuICAgIGlmIChtYXJrLmV4dGVudCkge1xuICAgICAgaWYobWFyay5leHRlbnQgPT09ICdtaW4tbWF4Jykge1xuICAgICAgICBrSVFSU2NhbGFyID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9yaWVudDogT3JpZW50ID0gYm94T3JpZW50KHNwZWMpO1xuICBjb25zdCB7dHJhbnNmb3JtLCBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYsIGNvbnRpbnVvdXNBeGlzLCBlbmNvZGluZ1dpdGhvdXRDb250aW51b3VzQXhpc30gPSBib3hQYXJhbXMoc3BlYywgb3JpZW50LCBrSVFSU2NhbGFyKTtcblxuICBjb25zdCB7Y29sb3IsIHNpemUsIC4uLmVuY29kaW5nV2l0aG91dFNpemVDb2xvckFuZENvbnRpbnVvdXNBeGlzfSA9IGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzO1xuXG4gIC8vIFNpemUgZW5jb2Rpbmcgb3IgdGhlIGRlZmF1bHQgY29uZmlnLmJveC5zaXplIGlzIGFwcGxpZWQgdG8gYm94IGFuZCBib3hNaWRcbiAgY29uc3Qgc2l6ZU1peGlucyA9IHNpemUgPyB7c2l6ZX0gOiBnZXRNYXJrU3BlY2lmaWNDb25maWdNaXhpbnMoY29uZmlnLmJveCwgJ3NpemUnKTtcblxuICBjb25zdCBjb250aW51b3VzQXhpc1NjYWxlQW5kQXhpcyA9IHt9O1xuICBpZiAoY29udGludW91c0F4aXNDaGFubmVsRGVmLnNjYWxlKSB7XG4gICAgY29udGludW91c0F4aXNTY2FsZUFuZEF4aXNbJ3NjYWxlJ10gPSBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuc2NhbGU7XG4gIH1cbiAgaWYgKGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5heGlzKSB7XG4gICAgY29udGludW91c0F4aXNTY2FsZUFuZEF4aXNbJ2F4aXMnXSA9IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5heGlzO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vdXRlclNwZWMsXG4gICAgdHJhbnNmb3JtLFxuICAgIGxheWVyOiBbXG4gICAgICB7IC8vIGxvd2VyIHdoaXNrZXJcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzXToge1xuICAgICAgICAgICAgZmllbGQ6ICdsb3dlcl93aGlza2VyXycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZSxcbiAgICAgICAgICAgIC4uLmNvbnRpbnVvdXNBeGlzU2NhbGVBbmRBeGlzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbY29udGludW91c0F4aXMgKyAnMiddOiB7XG4gICAgICAgICAgICBmaWVsZDogJ2xvd2VyX2JveF8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkLFxuICAgICAgICAgICAgdHlwZTogY29udGludW91c0F4aXNDaGFubmVsRGVmLnR5cGVcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmVuY29kaW5nV2l0aG91dFNpemVDb2xvckFuZENvbnRpbnVvdXNBeGlzLFxuICAgICAgICAgIC4uLmdldE1hcmtTcGVjaWZpY0NvbmZpZ01peGlucyhjb25maWcuYm94V2hpc2tlciwgJ2NvbG9yJylcbiAgICAgICAgfVxuICAgICAgfSwgeyAvLyB1cHBlciB3aGlza2VyXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFtjb250aW51b3VzQXhpc106IHtcbiAgICAgICAgICAgIGZpZWxkOiAndXBwZXJfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzICsgJzInXToge1xuICAgICAgICAgICAgZmllbGQ6ICd1cHBlcl93aGlza2VyXycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uZW5jb2RpbmdXaXRob3V0U2l6ZUNvbG9yQW5kQ29udGludW91c0F4aXMsXG4gICAgICAgICAgLi4uZ2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zKGNvbmZpZy5ib3hXaGlza2VyLCAnY29sb3InKVxuICAgICAgICB9XG4gICAgICB9LCB7IC8vIGJveCAocTEgdG8gcTMpXG4gICAgICAgIC4uLihzZWxlY3Rpb24gPyB7c2VsZWN0aW9ufSA6IHt9KSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgIHN0eWxlOiAnYm94J1xuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFtjb250aW51b3VzQXhpc106IHtcbiAgICAgICAgICAgIGZpZWxkOiAnbG93ZXJfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzICsgJzInXToge1xuICAgICAgICAgICAgZmllbGQ6ICd1cHBlcl9ib3hfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICAgIHR5cGU6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi50eXBlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5lbmNvZGluZ1dpdGhvdXRDb250aW51b3VzQXhpcyxcbiAgICAgICAgICAuLi4oZW5jb2RpbmdXaXRob3V0Q29udGludW91c0F4aXMuY29sb3IgPyB7fSA6IGdldE1hcmtTcGVjaWZpY0NvbmZpZ01peGlucyhjb25maWcuYm94LCAnY29sb3InKSksXG4gICAgICAgICAgLi4uc2l6ZU1peGlucyxcbiAgICAgICAgfVxuICAgICAgfSwgeyAvLyBtaWQgdGlja1xuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgIHN0eWxlOiAnYm94TWlkJ1xuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFtjb250aW51b3VzQXhpc106IHtcbiAgICAgICAgICAgIGZpZWxkOiAnbWlkX2JveF8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkLFxuICAgICAgICAgICAgdHlwZTogY29udGludW91c0F4aXNDaGFubmVsRGVmLnR5cGVcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmVuY29kaW5nV2l0aG91dFNpemVDb2xvckFuZENvbnRpbnVvdXNBeGlzLFxuICAgICAgICAgIC4uLmdldE1hcmtTcGVjaWZpY0NvbmZpZ01peGlucyhjb25maWcuYm94TWlkLCAnY29sb3InKSxcbiAgICAgICAgICAuLi5zaXplTWl4aW5zLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgXVxuICB9O1xufVxuXG5mdW5jdGlvbiBib3hPcmllbnQoc3BlYzogR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPEZpZWxkPiwgQk9YUExPVCB8IEJveFBsb3REZWY+KTogT3JpZW50IHtcbiAgY29uc3Qge21hcms6IG1hcmssIGVuY29kaW5nOiBlbmNvZGluZywgcHJvamVjdGlvbjogX3AsIC4uLl9vdXRlclNwZWN9ID0gc3BlYztcblxuICBpZiAoaXNGaWVsZERlZihlbmNvZGluZy54KSAmJiBpc0NvbnRpbnVvdXMoZW5jb2RpbmcueCkpIHtcbiAgICAvLyB4IGlzIGNvbnRpbnVvdXNcbiAgICBpZiAoaXNGaWVsZERlZihlbmNvZGluZy55KSAmJiBpc0NvbnRpbnVvdXMoZW5jb2RpbmcueSkpIHtcbiAgICAgIC8vIGJvdGggeCBhbmQgeSBhcmUgY29udGludW91c1xuICAgICAgaWYgKGVuY29kaW5nLnguYWdncmVnYXRlID09PSB1bmRlZmluZWQgJiYgZW5jb2RpbmcueS5hZ2dyZWdhdGUgPT09IEJPWFBMT1QpIHtcbiAgICAgICAgcmV0dXJuICd2ZXJ0aWNhbCc7XG4gICAgICB9IGVsc2UgaWYgKGVuY29kaW5nLnkuYWdncmVnYXRlID09PSB1bmRlZmluZWQgJiYgZW5jb2RpbmcueC5hZ2dyZWdhdGUgPT09IEJPWFBMT1QpIHtcbiAgICAgICAgcmV0dXJuICdob3Jpem9udGFsJztcbiAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcueC5hZ2dyZWdhdGUgPT09IEJPWFBMT1QgJiYgZW5jb2RpbmcueS5hZ2dyZWdhdGUgPT09IEJPWFBMT1QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIHggYW5kIHkgY2Fubm90IGhhdmUgYWdncmVnYXRlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNCb3hQbG90RGVmKG1hcmspICYmIG1hcmsub3JpZW50KSB7XG4gICAgICAgICAgcmV0dXJuIG1hcmsub3JpZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGVmYXVsdCBvcmllbnRhdGlvbiA9IHZlcnRpY2FsXG4gICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHggaXMgY29udGludW91cyBidXQgeSBpcyBub3RcbiAgICByZXR1cm4gJ2hvcml6b250YWwnO1xuICB9IGVsc2UgaWYgKGlzRmllbGREZWYoZW5jb2RpbmcueSkgJiYgaXNDb250aW51b3VzKGVuY29kaW5nLnkpKSB7XG4gICAgLy8geSBpcyBjb250aW51b3VzIGJ1dCB4IGlzIG5vdFxuICAgIHJldHVybiAndmVydGljYWwnO1xuICB9IGVsc2Uge1xuICAgIC8vIE5laXRoZXIgeCBub3IgeSBpcyBjb250aW51b3VzLlxuICAgIHRocm93IG5ldyBFcnJvcignTmVlZCBhIHZhbGlkIGNvbnRpbnVvdXMgYXhpcyBmb3IgYm94cGxvdHMnKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGJveENvbnRpbm91c0F4aXMoc3BlYzogR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZz4sIEJPWFBMT1QgfCBCb3hQbG90RGVmPiwgb3JpZW50OiBPcmllbnQpIHtcbiAgY29uc3Qge21hcms6IG1hcmssIGVuY29kaW5nOiBlbmNvZGluZywgcHJvamVjdGlvbjogX3AsIC4uLl9vdXRlclNwZWN9ID0gc3BlYztcblxuICBsZXQgY29udGludW91c0F4aXNDaGFubmVsRGVmOiBQb3NpdGlvbkZpZWxkRGVmPHN0cmluZz47XG4gIGxldCBjb250aW51b3VzQXhpczogJ3gnIHwgJ3knO1xuXG4gIGlmIChvcmllbnQgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICBjb250aW51b3VzQXhpcyA9ICd5JztcbiAgICBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYgPSBlbmNvZGluZy55IGFzIEZpZWxkRGVmPHN0cmluZz47IC8vIFNhZmUgdG8gY2FzdCBiZWNhdXNlIGlmIHkgaXMgbm90IGNvbnRpbnVvdXMgZmllbGRkZWYsIHRoZSBvcmllbnQgd291bGQgbm90IGJlIHZlcnRpY2FsLlxuICB9IGVsc2Uge1xuICAgIGNvbnRpbnVvdXNBeGlzID0gJ3gnO1xuICAgIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZiA9IGVuY29kaW5nLnggYXMgRmllbGREZWY8c3RyaW5nPjsgLy8gU2FmZSB0byBjYXN0IGJlY2F1c2UgaWYgeCBpcyBub3QgY29udGludW91cyBmaWVsZGRlZiwgdGhlIG9yaWVudCB3b3VsZCBub3QgYmUgaG9yaXpvbnRhbC5cbiAgfVxuXG4gIGlmIChjb250aW51b3VzQXhpc0NoYW5uZWxEZWYgJiYgY29udGludW91c0F4aXNDaGFubmVsRGVmLmFnZ3JlZ2F0ZSkge1xuICAgIGNvbnN0IHthZ2dyZWdhdGUsIC4uLmNvbnRpbnVvdXNBeGlzV2l0aG91dEFnZ3JlZ2F0ZX0gPSBjb250aW51b3VzQXhpc0NoYW5uZWxEZWY7XG4gICAgaWYgKGFnZ3JlZ2F0ZSAhPT0gQk9YUExPVCkge1xuICAgICAgbG9nLndhcm4oYENvbnRpbnVvdXMgYXhpcyBzaG91bGQgbm90IGhhdmUgY3VzdG9taXplZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiAke2FnZ3JlZ2F0ZX1gKTtcbiAgICB9XG4gICAgY29udGludW91c0F4aXNDaGFubmVsRGVmID0gY29udGludW91c0F4aXNXaXRob3V0QWdncmVnYXRlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYsXG4gICAgY29udGludW91c0F4aXNcbiAgfTtcbn1cblxuZnVuY3Rpb24gYm94UGFyYW1zKHNwZWM6IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZzxzdHJpbmc+LCBCT1hQTE9UIHwgQm94UGxvdERlZj4sIG9yaWVudDogT3JpZW50LCBrSVFSU2NhbGFyOiAnbWluLW1heCcgfCBudW1iZXIpIHtcblxuICBjb25zdCB7Y29udGludW91c0F4aXNDaGFubmVsRGVmLCBjb250aW51b3VzQXhpc30gPSBib3hDb250aW5vdXNBeGlzKHNwZWMsIG9yaWVudCk7XG4gIGNvbnN0IGVuY29kaW5nID0gc3BlYy5lbmNvZGluZztcblxuICBjb25zdCBpc01pbk1heCA9IGtJUVJTY2FsYXIgPT09IHVuZGVmaW5lZDtcbiAgY29uc3QgYWdncmVnYXRlOiBBZ2dyZWdhdGVkRmllbGREZWZbXSA9IFtcbiAgICB7XG4gICAgICBvcDogJ3ExJyxcbiAgICAgIGZpZWxkOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICBhczogJ2xvd2VyX2JveF8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gICAgfSxcbiAgICB7XG4gICAgICBvcDogJ3EzJyxcbiAgICAgIGZpZWxkOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICBhczogJ3VwcGVyX2JveF8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gICAgfSxcbiAgICB7XG4gICAgICBvcDogJ21lZGlhbicsXG4gICAgICBmaWVsZDogY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkLFxuICAgICAgYXM6ICdtaWRfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGRcbiAgICB9XG4gIF07XG4gIGxldCBwb3N0QWdncmVnYXRlQ2FsY3VsYXRlczogQ2FsY3VsYXRlVHJhbnNmb3JtW10gPSBbXTtcblxuICBhZ2dyZWdhdGUucHVzaCh7XG4gICAgb3A6ICdtaW4nLFxuICAgIGZpZWxkOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgYXM6IChpc01pbk1heCA/ICdsb3dlcl93aGlza2VyXycgOiAnbWluXycpICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gIH0pO1xuICBhZ2dyZWdhdGUucHVzaCh7XG4gICAgb3A6ICdtYXgnLFxuICAgIGZpZWxkOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgYXM6ICAoaXNNaW5NYXggPyAndXBwZXJfd2hpc2tlcl8nIDogJ21heF8nKSArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZFxuICB9KTtcblxuICBpZiAoIWlzTWluTWF4KSB7XG4gICAgcG9zdEFnZ3JlZ2F0ZUNhbGN1bGF0ZXMgPSBbXG4gICAgICB7XG4gICAgICAgIGNhbGN1bGF0ZTogYGRhdHVtLnVwcGVyX2JveF8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH0gLSBkYXR1bS5sb3dlcl9ib3hfJHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGR9YCxcbiAgICAgICAgYXM6ICdpcXJfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2FsY3VsYXRlOiBgbWluKGRhdHVtLnVwcGVyX2JveF8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH0gKyBkYXR1bS5pcXJfJHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGR9ICogJHtrSVFSU2NhbGFyfSwgZGF0dW0ubWF4XyR7Y29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkfSlgLFxuICAgICAgICBhczogJ3VwcGVyX3doaXNrZXJfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgY2FsY3VsYXRlOiBgbWF4KGRhdHVtLmxvd2VyX2JveF8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH0gLSBkYXR1bS5pcXJfJHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGR9ICogJHtrSVFSU2NhbGFyfSwgZGF0dW0ubWluXyR7Y29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkfSlgLFxuICAgICAgICBhczogJ2xvd2VyX3doaXNrZXJfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZFxuICAgICAgfVxuICAgIF07XG4gIH1cblxuICBjb25zdCBncm91cGJ5OiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBiaW5zOiBCaW5UcmFuc2Zvcm1bXSA9IFtdO1xuICBjb25zdCB0aW1lVW5pdHM6IFRpbWVVbml0VHJhbnNmb3JtW10gPSBbXTtcblxuICBjb25zdCBlbmNvZGluZ1dpdGhvdXRDb250aW51b3VzQXhpczogRW5jb2Rpbmc8c3RyaW5nPiA9IHt9O1xuICBmb3JFYWNoKGVuY29kaW5nLCAoY2hhbm5lbERlZiwgY2hhbm5lbCkgPT4ge1xuICAgIGlmIChjaGFubmVsID09PSBjb250aW51b3VzQXhpcykge1xuICAgICAgLy8gU2tpcCBjb250aW51b3VzIGF4aXMgYXMgd2UgYWxyZWFkeSBoYW5kbGUgaXQgc2VwYXJhdGVseVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNGaWVsZERlZihjaGFubmVsRGVmKSkge1xuICAgICAgaWYgKGNoYW5uZWxEZWYuYWdncmVnYXRlICYmIGNoYW5uZWxEZWYuYWdncmVnYXRlICE9PSBCT1hQTE9UKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZS5wdXNoKHtcbiAgICAgICAgICBvcDogY2hhbm5lbERlZi5hZ2dyZWdhdGUsXG4gICAgICAgICAgZmllbGQ6IGNoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgYXM6IHZnRmllbGQoY2hhbm5lbERlZilcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5uZWxEZWYuYWdncmVnYXRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRGaWVsZCA9IHZnRmllbGQoY2hhbm5lbERlZik7XG5cbiAgICAgICAgLy8gQWRkIGJpbiBvciB0aW1lVW5pdCB0cmFuc2Zvcm0gaWYgYXBwbGljYWJsZVxuICAgICAgICBjb25zdCBiaW4gPSBjaGFubmVsRGVmLmJpbjtcbiAgICAgICAgaWYgKGJpbikge1xuICAgICAgICAgIGNvbnN0IHtmaWVsZH0gPSBjaGFubmVsRGVmO1xuICAgICAgICAgIGJpbnMucHVzaCh7YmluLCBmaWVsZCwgYXM6IHRyYW5zZm9ybWVkRmllbGR9KTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsRGVmLnRpbWVVbml0KSB7XG4gICAgICAgICAgY29uc3Qge3RpbWVVbml0LCBmaWVsZH0gPSBjaGFubmVsRGVmO1xuICAgICAgICAgIHRpbWVVbml0cy5wdXNoKHt0aW1lVW5pdCwgZmllbGQsIGFzOiB0cmFuc2Zvcm1lZEZpZWxkfSk7XG4gICAgICAgIH1cblxuICAgICAgICBncm91cGJ5LnB1c2godHJhbnNmb3JtZWRGaWVsZCk7XG4gICAgICB9XG4gICAgICAvLyBub3cgdGhlIGZpZWxkIHNob3VsZCByZWZlciB0byBwb3N0LXRyYW5zZm9ybWVkIGZpZWxkIGluc3RlYWRcbiAgICAgIGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzW2NoYW5uZWxdID0ge1xuICAgICAgICBmaWVsZDogdmdGaWVsZChjaGFubmVsRGVmKSxcbiAgICAgICAgdHlwZTogY2hhbm5lbERlZi50eXBlXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGb3IgdmFsdWUgZGVmLCBqdXN0IGNvcHlcbiAgICAgIGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzW2NoYW5uZWxdID0gZW5jb2RpbmdbY2hhbm5lbF07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHRyYW5zZm9ybTogW10uY29uY2F0KFxuICAgICAgYmlucyxcbiAgICAgIHRpbWVVbml0cyxcbiAgICAgIFt7YWdncmVnYXRlLCBncm91cGJ5fV0sXG4gICAgICBwb3N0QWdncmVnYXRlQ2FsY3VsYXRlc1xuICAgICksXG4gICAgY29udGludW91c0F4aXNDaGFubmVsRGVmLFxuICAgIGNvbnRpbnVvdXNBeGlzLFxuICAgIGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzXG4gIH07XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/compositemark/common.d.ts b/build/src/compositemark/common.d.ts new file mode 100644 index 0000000000..1857907f60 --- /dev/null +++ b/build/src/compositemark/common.d.ts @@ -0,0 +1,7 @@ +import { NonPositionChannel } from '../channel'; +import { MarkConfig } from '../mark'; +export declare function getMarkSpecificConfigMixins(markSpecificConfig: MarkConfig, channel: NonPositionChannel): { + [x: string]: { + value: any; + }; +}; diff --git a/build/src/compositemark/common.js b/build/src/compositemark/common.js new file mode 100644 index 0000000000..375223d890 --- /dev/null +++ b/build/src/compositemark/common.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function getMarkSpecificConfigMixins(markSpecificConfig, channel) { + var _a; + var value = markSpecificConfig[channel]; + return value !== undefined ? (_a = {}, _a[channel] = { value: value }, _a) : {}; +} +exports.getMarkSpecificConfigMixins = getMarkSpecificConfigMixins; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvc2l0ZW1hcmsvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBR0EscUNBQTRDLGtCQUE4QixFQUFFLE9BQTJCOztJQUNyRyxJQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxXQUFFLEdBQUMsT0FBTyxJQUFHLEVBQUMsS0FBSyxPQUFBLEVBQUMsTUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFIRCxrRUFHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Tm9uUG9zaXRpb25DaGFubmVsfSBmcm9tICcuLi9jaGFubmVsJztcbmltcG9ydCB7TWFya0NvbmZpZ30gZnJvbSAnLi4vbWFyayc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXJrU3BlY2lmaWNDb25maWdNaXhpbnMobWFya1NwZWNpZmljQ29uZmlnOiBNYXJrQ29uZmlnLCBjaGFubmVsOiBOb25Qb3NpdGlvbkNoYW5uZWwpIHtcbiAgY29uc3QgdmFsdWUgPSBtYXJrU3BlY2lmaWNDb25maWdbY2hhbm5lbF07XG4gIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8ge1tjaGFubmVsXToge3ZhbHVlfX0gOiB7fTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compositemark/errorbar.d.ts b/build/src/compositemark/errorbar.d.ts new file mode 100644 index 0000000000..4cfcbc24f9 --- /dev/null +++ b/build/src/compositemark/errorbar.d.ts @@ -0,0 +1,6 @@ +import { Field } from '../fielddef'; +import { Encoding } from './../encoding'; +import { GenericUnitSpec, NormalizedLayerSpec } from './../spec'; +export declare const ERRORBAR: 'error-bar'; +export declare type ERRORBAR = typeof ERRORBAR; +export declare function normalizeErrorBar(spec: GenericUnitSpec, ERRORBAR>): NormalizedLayerSpec; diff --git a/build/src/compositemark/errorbar.js b/build/src/compositemark/errorbar.js new file mode 100644 index 0000000000..1f5a35857f --- /dev/null +++ b/build/src/compositemark/errorbar.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +exports.ERRORBAR = 'error-bar'; +function normalizeErrorBar(spec) { + // TODO: use selection + var _m = spec.mark, _sel = spec.selection, _p = spec.projection, encoding = spec.encoding, outerSpec = tslib_1.__rest(spec, ["mark", "selection", "projection", "encoding"]); + var _s = encoding.size, encodingWithoutSize = tslib_1.__rest(encoding, ["size"]); + var _x2 = encoding.x2, _y2 = encoding.y2, encodingWithoutX2Y2 = tslib_1.__rest(encoding, ["x2", "y2"]); + var _x = encodingWithoutX2Y2.x, _y = encodingWithoutX2Y2.y, encodingWithoutX_X2_Y_Y2 = tslib_1.__rest(encodingWithoutX2Y2, ["x", "y"]); + if (!encoding.x2 && !encoding.y2) { + throw new Error('Neither x2 or y2 provided'); + } + return tslib_1.__assign({}, outerSpec, { layer: [ + { + mark: 'rule', + encoding: encodingWithoutSize + }, { + mark: 'tick', + encoding: encodingWithoutX2Y2 + }, { + mark: 'tick', + encoding: encoding.x2 ? tslib_1.__assign({ x: encoding.x2, y: encoding.y }, encodingWithoutX_X2_Y_Y2) : tslib_1.__assign({ x: encoding.x, y: encoding.y2 }, encodingWithoutX_X2_Y_Y2) + } + ] }); +} +exports.normalizeErrorBar = normalizeErrorBar; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JiYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9zaXRlbWFyay9lcnJvcmJhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFLYSxRQUFBLFFBQVEsR0FBZ0IsV0FBVyxDQUFDO0FBR2pELDJCQUFrQyxJQUFnRDtJQUNoRixzQkFBc0I7SUFDZixJQUFBLGNBQVEsRUFBRSxxQkFBZSxFQUFFLG9CQUFjLEVBQUUsd0JBQVEsRUFBRSxpRkFBWSxDQUFTO0lBQzFFLElBQUEsa0JBQVEsRUFBRSx3REFBc0IsQ0FBYTtJQUM3QyxJQUFBLGlCQUFPLEVBQUUsaUJBQU8sRUFBRSw0REFBc0IsQ0FBYTtJQUNyRCxJQUFBLDBCQUFLLEVBQUUsMEJBQUssRUFBRSwwRUFBMkIsQ0FBd0I7SUFFeEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztLQUM5QztJQUVELDRCQUNLLFNBQVMsSUFDWixLQUFLLEVBQUU7WUFDTDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsbUJBQW1CO2FBQzlCLEVBQUM7Z0JBQ0EsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLG1CQUFtQjthQUM5QixFQUFFO2dCQUNELElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsb0JBQ3JCLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUNkLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUNWLHdCQUF3QixFQUMzQixDQUFDLG9CQUNELENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUNiLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxJQUNYLHdCQUF3QixDQUM1QjthQUNGO1NBQ0YsSUFDRDtBQUNKLENBQUM7QUFsQ0QsOENBa0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi8uLi9lbmNvZGluZyc7XG5pbXBvcnQge0dlbmVyaWNVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi8uLi9zcGVjJztcblxuXG5leHBvcnQgY29uc3QgRVJST1JCQVI6ICdlcnJvci1iYXInID0gJ2Vycm9yLWJhcic7XG5leHBvcnQgdHlwZSBFUlJPUkJBUiA9IHR5cGVvZiBFUlJPUkJBUjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQmFyKHNwZWM6IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZzxGaWVsZD4sIEVSUk9SQkFSPik6IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuICAvLyBUT0RPOiB1c2Ugc2VsZWN0aW9uXG4gIGNvbnN0IHttYXJrOiBfbSwgc2VsZWN0aW9uOiBfc2VsLCBwcm9qZWN0aW9uOiBfcCwgZW5jb2RpbmcsIC4uLm91dGVyU3BlY30gPSBzcGVjO1xuICBjb25zdCB7c2l6ZTogX3MsIC4uLmVuY29kaW5nV2l0aG91dFNpemV9ID0gZW5jb2Rpbmc7XG4gIGNvbnN0IHt4MjogX3gyLCB5MjogX3kyLCAuLi5lbmNvZGluZ1dpdGhvdXRYMlkyfSA9IGVuY29kaW5nO1xuICBjb25zdCB7eDogX3gsIHk6IF95LCAuLi5lbmNvZGluZ1dpdGhvdXRYX1gyX1lfWTJ9ID0gZW5jb2RpbmdXaXRob3V0WDJZMjtcblxuICBpZiAoIWVuY29kaW5nLngyICYmICFlbmNvZGluZy55Mikge1xuICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciB4MiBvciB5MiBwcm92aWRlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vdXRlclNwZWMsXG4gICAgbGF5ZXI6IFtcbiAgICAgIHtcbiAgICAgICAgbWFyazogJ3J1bGUnLFxuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdXaXRob3V0U2l6ZVxuICAgICAgfSx7IC8vIExvd2VyIHRpY2tcbiAgICAgICAgbWFyazogJ3RpY2snLFxuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdXaXRob3V0WDJZMlxuICAgICAgfSwgeyAvLyBVcHBlciB0aWNrXG4gICAgICAgIG1hcms6ICd0aWNrJyxcbiAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLngyID8ge1xuICAgICAgICAgIHg6IGVuY29kaW5nLngyLFxuICAgICAgICAgIHk6IGVuY29kaW5nLnksXG4gICAgICAgICAgLi4uZW5jb2RpbmdXaXRob3V0WF9YMl9ZX1kyXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgeDogZW5jb2RpbmcueCxcbiAgICAgICAgICB5OiBlbmNvZGluZy55MixcbiAgICAgICAgICAuLi5lbmNvZGluZ1dpdGhvdXRYX1gyX1lfWTJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/compositemark/index.d.ts b/build/src/compositemark/index.d.ts new file mode 100644 index 0000000000..2a32f9d488 --- /dev/null +++ b/build/src/compositemark/index.d.ts @@ -0,0 +1,25 @@ +import { Config } from './../config'; +import { AnyMark } from './../mark'; +import { GenericUnitSpec, NormalizedLayerSpec } from './../spec'; +import { BOXPLOT, BoxPlotConfigMixins, BoxPlotDef } from './boxplot'; +import { ERRORBAR } from './errorbar'; +export { BoxPlotConfig } from './boxplot'; +export declare type UnitNormalizer = (spec: GenericUnitSpec, config: Config) => NormalizedLayerSpec; +export declare function add(mark: string, normalizer: UnitNormalizer): void; +export declare function remove(mark: string): void; +export declare type CompositeMark = BOXPLOT | ERRORBAR; +export declare type CompositeMarkDef = BoxPlotDef; +export declare type CompositeAggregate = BOXPLOT; +export declare const COMPOSITE_MARK_STYLES: import("./boxplot").BoxPlotStyle[]; +export declare type CompositeMarkStyle = typeof COMPOSITE_MARK_STYLES[0]; +export interface CompositeMarkConfigMixins extends BoxPlotConfigMixins { +} +export declare const VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX: { + box?: ("font" | "text" | "shape" | "orient" | "extent" | "color" | "fill" | "stroke" | "opacity" | "size" | "href" | "interpolate" | "strokeWidth" | "strokeDash" | "strokeDashOffset" | "strokeOpacity" | "fillOpacity" | "filled" | "strokeCap" | "tension" | "align" | "angle" | "baseline" | "dx" | "dy" | "radius" | "limit" | "theta" | "fontSize" | "fontStyle" | "fontWeight" | "cursor")[]; + boxWhisker?: ("font" | "text" | "shape" | "orient" | "color" | "fill" | "stroke" | "opacity" | "size" | "href" | "interpolate" | "strokeWidth" | "strokeDash" | "strokeDashOffset" | "strokeOpacity" | "fillOpacity" | "filled" | "strokeCap" | "tension" | "align" | "angle" | "baseline" | "dx" | "dy" | "radius" | "limit" | "theta" | "fontSize" | "fontStyle" | "fontWeight" | "cursor")[]; + boxMid?: ("font" | "text" | "shape" | "orient" | "color" | "fill" | "stroke" | "opacity" | "size" | "href" | "interpolate" | "strokeWidth" | "strokeDash" | "strokeDashOffset" | "strokeOpacity" | "fillOpacity" | "filled" | "strokeCap" | "tension" | "align" | "angle" | "baseline" | "dx" | "dy" | "radius" | "limit" | "theta" | "fontSize" | "fontStyle" | "fontWeight" | "cursor")[]; +}; +/** + * Transform a unit spec with composite mark into a normal layer spec. + */ +export declare function normalize(spec: GenericUnitSpec, config: Config): NormalizedLayerSpec; diff --git a/build/src/compositemark/index.js b/build/src/compositemark/index.js new file mode 100644 index 0000000000..bcdd37d423 --- /dev/null +++ b/build/src/compositemark/index.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var mark_1 = require("./../mark"); +var boxplot_1 = require("./boxplot"); +var errorbar_1 = require("./errorbar"); +/** + * Registry index for all composite mark's normalizer + */ +var normalizerRegistry = {}; +function add(mark, normalizer) { + normalizerRegistry[mark] = normalizer; +} +exports.add = add; +function remove(mark) { + delete normalizerRegistry[mark]; +} +exports.remove = remove; +exports.COMPOSITE_MARK_STYLES = boxplot_1.BOXPLOT_STYLES; +exports.VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = tslib_1.__assign({}, boxplot_1.VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX); +add(boxplot_1.BOXPLOT, boxplot_1.normalizeBoxPlot); +add(errorbar_1.ERRORBAR, errorbar_1.normalizeErrorBar); +/** + * Transform a unit spec with composite mark into a normal layer spec. + */ +function normalize( +// This GenericUnitSpec has any as Encoding because unit specs with composite mark can have additional encoding channels. +spec, config) { + var mark = mark_1.isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var normalizer = normalizerRegistry[mark]; + if (normalizer) { + return normalizer(spec, config); + } + throw new Error("Invalid mark type \"" + mark + "\""); +} +exports.normalize = normalize; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9zaXRlbWFyay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxrQ0FBNkM7QUFFN0MscUNBQTRJO0FBQzVJLHVDQUF1RDtBQU12RDs7R0FFRztBQUNILElBQU0sa0JBQWtCLEdBQXFDLEVBQUUsQ0FBQztBQUVoRSxhQUFvQixJQUFZLEVBQUUsVUFBMEI7SUFDMUQsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQ3hDLENBQUM7QUFGRCxrQkFFQztBQUVELGdCQUF1QixJQUFZO0lBQ2pDLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUZELHdCQUVDO0FBUVksUUFBQSxxQkFBcUIsR0FBRyx3QkFBYyxDQUFDO0FBS3ZDLFFBQUEscURBQXFELHdCQUM3RCwrQ0FBcUMsRUFDeEM7QUFFRixHQUFHLENBQUMsaUJBQU8sRUFBRSwwQkFBZ0IsQ0FBQyxDQUFDO0FBQy9CLEdBQUcsQ0FBQyxtQkFBUSxFQUFFLDRCQUFpQixDQUFDLENBQUM7QUFFakM7O0dBRUc7QUFDSDtBQUNJLHlIQUF5SDtBQUN6SCxJQUFtQyxFQUNuQyxNQUFjO0lBR2hCLElBQU0sSUFBSSxHQUFHLGdCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMvRCxJQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztLQUNqQztJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXNCLElBQUksT0FBRyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQWJELDhCQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWd9IGZyb20gJy4vLi4vY29uZmlnJztcbmltcG9ydCB7QW55TWFyaywgaXNNYXJrRGVmfSBmcm9tICcuLy4uL21hcmsnO1xuaW1wb3J0IHtHZW5lcmljVW5pdFNwZWMsIE5vcm1hbGl6ZWRMYXllclNwZWN9IGZyb20gJy4vLi4vc3BlYyc7XG5pbXBvcnQge0JPWFBMT1QsIEJPWFBMT1RfU1RZTEVTLCBCb3hQbG90Q29uZmlnTWl4aW5zLCBCb3hQbG90RGVmLCBub3JtYWxpemVCb3hQbG90LCBWTF9PTkxZX0JPWFBMT1RfQ09ORklHX1BST1BFUlRZX0lOREVYfSBmcm9tICcuL2JveHBsb3QnO1xuaW1wb3J0IHtFUlJPUkJBUiwgbm9ybWFsaXplRXJyb3JCYXJ9IGZyb20gJy4vZXJyb3JiYXInO1xuXG5cbmV4cG9ydCB7Qm94UGxvdENvbmZpZ30gZnJvbSAnLi9ib3hwbG90JztcbmV4cG9ydCB0eXBlIFVuaXROb3JtYWxpemVyID0gKHNwZWM6IEdlbmVyaWNVbml0U3BlYzxhbnksIGFueT4sIGNvbmZpZzogQ29uZmlnKT0+IE5vcm1hbGl6ZWRMYXllclNwZWM7XG5cbi8qKlxuICogUmVnaXN0cnkgaW5kZXggZm9yIGFsbCBjb21wb3NpdGUgbWFyaydzIG5vcm1hbGl6ZXJcbiAqL1xuY29uc3Qgbm9ybWFsaXplclJlZ2lzdHJ5OiB7W21hcms6IHN0cmluZ106IFVuaXROb3JtYWxpemVyfSA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkKG1hcms6IHN0cmluZywgbm9ybWFsaXplcjogVW5pdE5vcm1hbGl6ZXIpIHtcbiAgbm9ybWFsaXplclJlZ2lzdHJ5W21hcmtdID0gbm9ybWFsaXplcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZShtYXJrOiBzdHJpbmcpIHtcbiAgZGVsZXRlIG5vcm1hbGl6ZXJSZWdpc3RyeVttYXJrXTtcbn1cblxuZXhwb3J0IHR5cGUgQ29tcG9zaXRlTWFyayA9IEJPWFBMT1QgfCBFUlJPUkJBUjtcblxuZXhwb3J0IHR5cGUgQ29tcG9zaXRlTWFya0RlZiA9IEJveFBsb3REZWY7XG5cbmV4cG9ydCB0eXBlIENvbXBvc2l0ZUFnZ3JlZ2F0ZSA9IEJPWFBMT1Q7XG5cbmV4cG9ydCBjb25zdCBDT01QT1NJVEVfTUFSS19TVFlMRVMgPSBCT1hQTE9UX1NUWUxFUztcbmV4cG9ydCB0eXBlIENvbXBvc2l0ZU1hcmtTdHlsZSA9IHR5cGVvZiBDT01QT1NJVEVfTUFSS19TVFlMRVNbMF07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zaXRlTWFya0NvbmZpZ01peGlucyBleHRlbmRzIEJveFBsb3RDb25maWdNaXhpbnMge31cblxuZXhwb3J0IGNvbnN0IFZMX09OTFlfQ09NUE9TSVRFX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYID0ge1xuICAuLi5WTF9PTkxZX0JPWFBMT1RfQ09ORklHX1BST1BFUlRZX0lOREVYXG59O1xuXG5hZGQoQk9YUExPVCwgbm9ybWFsaXplQm94UGxvdCk7XG5hZGQoRVJST1JCQVIsIG5vcm1hbGl6ZUVycm9yQmFyKTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYSB1bml0IHNwZWMgd2l0aCBjb21wb3NpdGUgbWFyayBpbnRvIGEgbm9ybWFsIGxheWVyIHNwZWMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoXG4gICAgLy8gVGhpcyBHZW5lcmljVW5pdFNwZWMgaGFzIGFueSBhcyBFbmNvZGluZyBiZWNhdXNlIHVuaXQgc3BlY3Mgd2l0aCBjb21wb3NpdGUgbWFyayBjYW4gaGF2ZSBhZGRpdGlvbmFsIGVuY29kaW5nIGNoYW5uZWxzLlxuICAgIHNwZWM6IEdlbmVyaWNVbml0U3BlYzxhbnksIEFueU1hcms+LFxuICAgIGNvbmZpZzogQ29uZmlnXG4gICk6IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuXG4gIGNvbnN0IG1hcmsgPSBpc01hcmtEZWYoc3BlYy5tYXJrKSA/IHNwZWMubWFyay50eXBlIDogc3BlYy5tYXJrO1xuICBjb25zdCBub3JtYWxpemVyID0gbm9ybWFsaXplclJlZ2lzdHJ5W21hcmtdO1xuICBpZiAobm9ybWFsaXplcikge1xuICAgIHJldHVybiBub3JtYWxpemVyKHNwZWMsIGNvbmZpZyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWFyayB0eXBlIFwiJHttYXJrfVwiYCk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/config.d.ts b/build/src/config.d.ts new file mode 100644 index 0000000000..8496f6c800 --- /dev/null +++ b/build/src/config.d.ts @@ -0,0 +1,183 @@ +import { AxisConfigMixins } from './axis'; +import { CompositeMarkConfigMixins } from './compositemark/index'; +import { LegendConfig } from './legend'; +import { MarkConfigMixins } from './mark'; +import { ProjectionConfig } from './projection'; +import { ScaleConfig } from './scale'; +import { SelectionConfig } from './selection'; +import { StackOffset } from './stack'; +import { TopLevelProperties } from './toplevelprops'; +import { VgMarkConfig, VgScheme, VgTitleConfig } from './vega.schema'; +export interface ViewConfig { + /** + * The default width of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) x-scale or ordinal x-scale with `rangeStep` = `null`. + * + * __Default value:__ `200` + * + */ + width?: number; + /** + * The default height of the single plot or each plot in a trellis plot when the visualization has a continuous (non-ordinal) y-scale with `rangeStep` = `null`. + * + * __Default value:__ `200` + * + */ + height?: number; + /** + * Whether the view should be clipped. + */ + clip?: boolean; + /** + * The fill color. + * + * __Default value:__ (none) + * + */ + fill?: string; + /** + * The fill opacity (value between [0,1]). + * + * __Default value:__ (none) + * + */ + fillOpacity?: number; + /** + * The stroke color. + * + * __Default value:__ (none) + * + */ + stroke?: string; + /** + * The stroke opacity (value between [0,1]). + * + * __Default value:__ (none) + * + */ + strokeOpacity?: number; + /** + * The stroke width, in pixels. + * + * __Default value:__ (none) + * + */ + strokeWidth?: number; + /** + * An array of alternating stroke, space lengths for creating dashed or dotted lines. + * + * __Default value:__ (none) + * + */ + strokeDash?: number[]; + /** + * The offset (in pixels) into which to begin drawing with the stroke dash array. + * + * __Default value:__ (none) + * + */ + strokeDashOffset?: number; +} +export declare const defaultViewConfig: ViewConfig; +export declare type RangeConfigValue = (number | string)[] | VgScheme | { + step: number; +}; +export declare type RangeConfig = RangeConfigProps & { + [name: string]: RangeConfigValue; +}; +export interface RangeConfigProps { + /** + * Default range for _nominal_ (categorical) fields. + */ + category?: string[] | VgScheme; + /** + * Default range for diverging _quantitative_ fields. + */ + diverging?: string[] | VgScheme; + /** + * Default range for _quantitative_ heatmaps. + */ + heatmap?: string[] | VgScheme; + /** + * Default range for _ordinal_ fields. + */ + ordinal?: string[] | VgScheme; + /** + * Default range for _quantitative_ and _temporal_ fields. + */ + ramp?: string[] | VgScheme; + /** + * Default range palette for the `shape` channel. + */ + symbol?: string[]; +} +export interface VLOnlyConfig { + /** + * Default axis and legend title for count fields. + * + * __Default value:__ `'Number of Records'`. + * + * @type {string} + */ + countTitle?: string; + /** + * Defines how Vega-Lite should handle invalid values (`null` and `NaN`). + * - If set to `"filter"` (default), all data items with null values will be skipped (for line, trail, and area marks) or filtered (for other marks). + * - If `null`, all data items are included. In this case, invalid values will be interpreted as zeroes. + */ + invalidValues?: 'filter' | null; + /** + * Defines how Vega-Lite generates title for fields. There are three possible styles: + * - `"verbal"` (Default) - displays function in a verbal style (e.g., "Sum of field", "Year-month of date", "field (binned)"). + * - `"function"` - displays function using parentheses and capitalized texts (e.g., "SUM(field)", "YEARMONTH(date)", "BIN(field)"). + * - `"plain"` - displays only the field name without functions (e.g., "field", "date", "field"). + */ + fieldTitle?: 'verbal' | 'functional' | 'plain'; + /** + * D3 Number format for axis labels and text tables. For example "s" for SI units. Use [D3's number format pattern](https://github.com/d3/d3-format#locale_format). + */ + numberFormat?: string; + /** + * Default datetime format for axis and legend labels. The format can be set directly on each axis and legend. Use [D3's time format pattern](https://github.com/d3/d3-time-format#locale_format). + * + * __Default value:__ `''` (The format will be automatically determined). + * + */ + timeFormat?: string; + /** Default properties for [single view plots](https://vega.github.io/vega-lite/docs/spec.html#single). */ + view?: ViewConfig; + /** + * Scale configuration determines default properties for all [scales](https://vega.github.io/vega-lite/docs/scale.html). For a full list of scale configuration options, please see the [corresponding section of the scale documentation](https://vega.github.io/vega-lite/docs/scale.html#config). + */ + scale?: ScaleConfig; + /** An object hash for defining default properties for each type of selections. */ + selection?: SelectionConfig; + /** Default stack offset for stackable mark. */ + stack?: StackOffset; +} +export interface StyleConfigIndex { + [style: string]: VgMarkConfig; +} +export interface Config extends TopLevelProperties, VLOnlyConfig, MarkConfigMixins, CompositeMarkConfigMixins, AxisConfigMixins { + /** + * An object hash that defines default range arrays or schemes for using with scales. + * For a full list of scale range configuration options, please see the [corresponding section of the scale documentation](https://vega.github.io/vega-lite/docs/scale.html#config). + */ + range?: RangeConfig; + /** + * Legend configuration, which determines default properties for all [legends](https://vega.github.io/vega-lite/docs/legend.html). For a full list of legend configuration options, please see the [corresponding section of in the legend documentation](https://vega.github.io/vega-lite/docs/legend.html#config). + */ + legend?: LegendConfig; + /** + * Title configuration, which determines default properties for all [titles](https://vega.github.io/vega-lite/docs/title.html). For a full list of title configuration options, please see the [corresponding section of the title documentation](https://vega.github.io/vega-lite/docs/title.html#config). + */ + title?: VgTitleConfig; + /** + * Projection configuration, which determines default properties for all [projections](https://vega.github.io/vega-lite/docs/projection.html). For a full list of projection configuration options, please see the [corresponding section of the projection documentation](https://vega.github.io/vega-lite/docs/projection.html#config). + */ + projection?: ProjectionConfig; + /** An object hash that defines key-value mappings to determine default properties for marks with a given [style](https://vega.github.io/vega-lite/docs/mark.html#mark-def). The keys represent styles names; the values have to be valid [mark configuration objects](https://vega.github.io/vega-lite/docs/mark.html#config). */ + style?: StyleConfigIndex; +} +export declare const defaultConfig: Config; +export declare function initConfig(config: Config): Config; +export declare function stripAndRedirectConfig(config: Config): Config; diff --git a/build/src/config.js b/build/src/config.js new file mode 100644 index 0000000000..f10678ccc6 --- /dev/null +++ b/build/src/config.js @@ -0,0 +1,137 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var compositemark_1 = require("./compositemark"); +var index_1 = require("./compositemark/index"); +var guide_1 = require("./guide"); +var legend_1 = require("./legend"); +var mark_1 = require("./mark"); +var mark = tslib_1.__importStar(require("./mark")); +var scale_1 = require("./scale"); +var selection_1 = require("./selection"); +var title_1 = require("./title"); +var util_1 = require("./util"); +exports.defaultViewConfig = { + width: 200, + height: 200 +}; +exports.defaultConfig = { + padding: 5, + timeFormat: '', + countTitle: 'Number of Records', + invalidValues: 'filter', + view: exports.defaultViewConfig, + mark: mark.defaultMarkConfig, + area: {}, + bar: mark.defaultBarConfig, + circle: {}, + geoshape: {}, + line: {}, + point: {}, + rect: {}, + rule: { color: 'black' }, + square: {}, + text: { color: 'black' }, + tick: mark.defaultTickConfig, + trail: {}, + box: { size: 14, extent: 1.5 }, + boxWhisker: {}, + boxMid: { color: 'white' }, + scale: scale_1.defaultScaleConfig, + projection: {}, + axis: {}, + axisX: {}, + axisY: { minExtent: 30 }, + axisLeft: {}, + axisRight: {}, + axisTop: {}, + axisBottom: {}, + axisBand: {}, + legend: legend_1.defaultLegendConfig, + selection: selection_1.defaultConfig, + style: {}, + title: {}, +}; +function initConfig(config) { + return util_1.mergeDeep(util_1.duplicate(exports.defaultConfig), config); +} +exports.initConfig = initConfig; +var MARK_STYLES = ['view'].concat(mark_1.PRIMITIVE_MARKS, compositemark_1.COMPOSITE_MARK_STYLES); +var VL_ONLY_CONFIG_PROPERTIES = [ + 'padding', 'numberFormat', 'timeFormat', 'countTitle', + 'stack', 'scale', 'selection', 'invalidValues', + 'overlay' // FIXME: Redesign and unhide this +]; +var VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = tslib_1.__assign({ view: ['width', 'height'] }, mark_1.VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX, index_1.VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX); +function stripAndRedirectConfig(config) { + config = util_1.duplicate(config); + for (var _i = 0, VL_ONLY_CONFIG_PROPERTIES_1 = VL_ONLY_CONFIG_PROPERTIES; _i < VL_ONLY_CONFIG_PROPERTIES_1.length; _i++) { + var prop = VL_ONLY_CONFIG_PROPERTIES_1[_i]; + delete config[prop]; + } + // Remove Vega-Lite only axis/legend config + if (config.axis) { + for (var _a = 0, VL_ONLY_GUIDE_CONFIG_1 = guide_1.VL_ONLY_GUIDE_CONFIG; _a < VL_ONLY_GUIDE_CONFIG_1.length; _a++) { + var prop = VL_ONLY_GUIDE_CONFIG_1[_a]; + delete config.axis[prop]; + } + } + if (config.legend) { + for (var _b = 0, VL_ONLY_GUIDE_CONFIG_2 = guide_1.VL_ONLY_GUIDE_CONFIG; _b < VL_ONLY_GUIDE_CONFIG_2.length; _b++) { + var prop = VL_ONLY_GUIDE_CONFIG_2[_b]; + delete config.legend[prop]; + } + } + // Remove Vega-Lite only generic mark config + if (config.mark) { + for (var _c = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_1 = mark_1.VL_ONLY_MARK_CONFIG_PROPERTIES; _c < VL_ONLY_MARK_CONFIG_PROPERTIES_1.length; _c++) { + var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_1[_c]; + delete config.mark[prop]; + } + } + for (var _d = 0, MARK_STYLES_1 = MARK_STYLES; _d < MARK_STYLES_1.length; _d++) { + var markType = MARK_STYLES_1[_d]; + // Remove Vega-Lite-only mark config + for (var _e = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_2 = mark_1.VL_ONLY_MARK_CONFIG_PROPERTIES; _e < VL_ONLY_MARK_CONFIG_PROPERTIES_2.length; _e++) { + var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_2[_e]; + delete config[markType][prop]; + } + // Remove Vega-Lite only mark-specific config + var vlOnlyMarkSpecificConfigs = VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX[markType]; + if (vlOnlyMarkSpecificConfigs) { + for (var _f = 0, vlOnlyMarkSpecificConfigs_1 = vlOnlyMarkSpecificConfigs; _f < vlOnlyMarkSpecificConfigs_1.length; _f++) { + var prop = vlOnlyMarkSpecificConfigs_1[_f]; + delete config[markType][prop]; + } + } + // Redirect mark config to config.style so that mark config only affect its own mark type + // without affecting other marks that share the same underlying Vega marks. + // For example, config.rect should not affect bar marks. + redirectConfig(config, markType); + } + // Redirect config.title -- so that title config do not + // affect header labels, which also uses `title` directive to implement. + redirectConfig(config, 'title', 'group-title'); + // Remove empty config objects + for (var prop in config) { + if (vega_util_1.isObject(config[prop]) && util_1.keys(config[prop]).length === 0) { + delete config[prop]; + } + } + return util_1.keys(config).length > 0 ? config : undefined; +} +exports.stripAndRedirectConfig = stripAndRedirectConfig; +function redirectConfig(config, prop, toProp) { + var propConfig = prop === 'title' ? title_1.extractTitleConfig(config.title).mark : config[prop]; + if (prop === 'view') { + toProp = 'cell'; // View's default style is "cell" + } + var style = tslib_1.__assign({}, propConfig, config.style[prop]); + // set config.style if it is not an empty object + if (util_1.keys(style).length > 0) { + config.style[toProp || prop] = style; + } + delete config[prop]; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBbUM7QUFFbkMsaURBQXNEO0FBQ3RELCtDQUEySTtBQUMzSSxpQ0FBNkM7QUFDN0MsbUNBQTJEO0FBQzNELCtCQUE0STtBQUM1SSxtREFBK0I7QUFFL0IsaUNBQXdEO0FBQ3hELHlDQUFxRjtBQUVyRixpQ0FBMkM7QUFFM0MsK0JBQWtEO0FBb0ZyQyxRQUFBLGlCQUFpQixHQUFlO0lBQzNDLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLEdBQUc7Q0FDWixDQUFDO0FBNEhXLFFBQUEsYUFBYSxHQUFXO0lBQ25DLE9BQU8sRUFBRSxDQUFDO0lBQ1YsVUFBVSxFQUFFLEVBQUU7SUFDZCxVQUFVLEVBQUUsbUJBQW1CO0lBRS9CLGFBQWEsRUFBRSxRQUFRO0lBRXZCLElBQUksRUFBRSx5QkFBaUI7SUFFdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7SUFDNUIsSUFBSSxFQUFFLEVBQUU7SUFDUixHQUFHLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtJQUMxQixNQUFNLEVBQUUsRUFBRTtJQUNWLFFBQVEsRUFBRSxFQUFFO0lBQ1osSUFBSSxFQUFFLEVBQUU7SUFDUixLQUFLLEVBQUUsRUFBRTtJQUNULElBQUksRUFBRSxFQUFFO0lBQ1IsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQztJQUN0QixNQUFNLEVBQUUsRUFBRTtJQUNWLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUM7SUFDdEIsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7SUFDNUIsS0FBSyxFQUFFLEVBQUU7SUFFVCxHQUFHLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUM7SUFDNUIsVUFBVSxFQUFFLEVBQUU7SUFDZCxNQUFNLEVBQUUsRUFBQyxLQUFL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Syx3QkFDTixVQUFVLEVBQ1YsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FDdEIsQ0FBQztJQUNGLGdEQUFnRDtJQUNoRCxJQUFJLFdBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztLQUN0QztJQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzT2JqZWN0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtBeGlzQ29uZmlnTWl4aW5zfSBmcm9tICcuL2F4aXMnO1xuaW1wb3J0IHtDT01QT1NJVEVfTUFSS19TVFlMRVN9IGZyb20gJy4vY29tcG9zaXRlbWFyayc7XG5pbXBvcnQge0NvbXBvc2l0ZU1hcmtDb25maWdNaXhpbnMsIENvbXBvc2l0ZU1hcmtTdHlsZSwgVkxfT05MWV9DT01QT1NJVEVfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVh9IGZyb20gJy4vY29tcG9zaXRlbWFyay9pbmRleCc7XG5pbXBvcnQge1ZMX09OTFlfR1VJREVfQ09ORklHfSBmcm9tICcuL2d1aWRlJztcbmltcG9ydCB7ZGVmYXVsdExlZ2VuZENvbmZpZywgTGVnZW5kQ29uZmlnfSBmcm9tICcuL2xlZ2VuZCc7XG5pbXBvcnQge01hcmssIE1hcmtDb25maWdNaXhpbnMsIFBSSU1JVElWRV9NQVJLUywgVkxfT05MWV9NQVJLX0NPTkZJR19QUk9QRVJUSUVTLCBWTF9PTkxZX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0ICogYXMgbWFyayBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtQcm9qZWN0aW9uQ29uZmlnfSBmcm9tICcuL3Byb2plY3Rpb24nO1xuaW1wb3J0IHtkZWZhdWx0U2NhbGVDb25maWcsIFNjYWxlQ29uZmlnfSBmcm9tICcuL3NjYWxlJztcbmltcG9ydCB7ZGVmYXVsdENvbmZpZyBhcyBkZWZhdWx0U2VsZWN0aW9uQ29uZmlnLCBTZWxlY3Rpb25Db25maWd9IGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7U3RhY2tPZmZzZXR9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtleHRyYWN0VGl0bGVDb25maWd9IGZyb20gJy4vdGl0bGUnO1xuaW1wb3J0IHtUb3BMZXZlbFByb3BlcnRpZXN9IGZyb20gJy4vdG9wbGV2ZWxwcm9wcyc7XG5pbXBvcnQge2R1cGxpY2F0ZSwga2V5cywgbWVyZ2VEZWVwfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtWZ01hcmtDb25maWcsIFZnU2NoZW1lLCBWZ1RpdGxlQ29uZmlnfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdDb25maWcge1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgd2lkdGggb2YgdGhlIHNpbmdsZSBwbG90IG9yIGVhY2ggcGxvdCBpbiBhIHRyZWxsaXMgcGxvdCB3aGVuIHRoZSB2aXN1YWxpemF0aW9uIGhhcyBhIGNvbnRpbnVvdXMgKG5vbi1vcmRpbmFsKSB4LXNjYWxlIG9yIG9yZGluYWwgeC1zY2FsZSB3aXRoIGByYW5nZVN0ZXBgID0gYG51bGxgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDIwMGBcbiAgICpcbiAgICovXG4gIHdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgdGhlIHNpbmdsZSBwbG90IG9yIGVhY2ggcGxvdCBpbiBhIHRyZWxsaXMgcGxvdCB3aGVuIHRoZSB2aXN1YWxpemF0aW9uIGhhcyBhIGNvbnRpbnVvdXMgKG5vbi1vcmRpbmFsKSB5LXNjYWxlIHdpdGggYHJhbmdlU3RlcGAgPSBgbnVsbGAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMjAwYFxuICAgKlxuICAgKi9cbiAgaGVpZ2h0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB2aWV3IHNob3VsZCBiZSBjbGlwcGVkLlxuICAgKi9cbiAgY2xpcD86IGJvb2xlYW47XG5cbiAgLy8gRklMTF9TVFJPS0VfQ09ORklHXG4gIC8qKlxuICAgKiBUaGUgZmlsbCBjb2xvci5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIChub25lKVxuICAgKlxuICAgKi9cbiAgZmlsbD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpbGwgb3BhY2l0eSAodmFsdWUgYmV0d2VlbiBbMCwxXSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIGZpbGxPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3Ryb2tlIGNvbG9yLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKG5vbmUpXG4gICAqXG4gICAqL1xuICBzdHJva2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSAodmFsdWUgYmV0d2VlbiBbMCwxXSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIHN0cm9rZU9wYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugd2lkdGgsIGluIHBpeGVscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIChub25lKVxuICAgKlxuICAgKi9cbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGFsdGVybmF0aW5nIHN0cm9rZSwgc3BhY2UgbGVuZ3RocyBmb3IgY3JlYXRpbmcgZGFzaGVkIG9yIGRvdHRlZCBsaW5lcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIChub25lKVxuICAgKlxuICAgKi9cbiAgc3Ryb2tlRGFzaD86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IChpbiBwaXhlbHMpIGludG8gd2hpY2ggdG8gYmVnaW4gZHJhd2luZyB3aXRoIHRoZSBzdHJva2UgZGFzaCBhcnJheS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIChub25lKVxuICAgKlxuICAgKi9cbiAgc3Ryb2tlRGFzaE9mZnNldD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRWaWV3Q29uZmlnOiBWaWV3Q29uZmlnID0ge1xuICB3aWR0aDogMjAwLFxuICBoZWlnaHQ6IDIwMFxufTtcblxuZXhwb3J0IHR5cGUgUmFuZ2VDb25maWdWYWx1ZSA9IChudW1iZXJ8c3RyaW5nKVtdIHwgVmdTY2hlbWUgfCB7c3RlcDogbnVtYmVyfTtcblxuZXhwb3J0IHR5cGUgUmFuZ2VDb25maWcgPSBSYW5nZUNvbmZpZ1Byb3BzICYge1tuYW1lOiBzdHJpbmddOiBSYW5nZUNvbmZpZ1ZhbHVlfTtcblxuZXhwb3J0IGludGVyZmFjZSBSYW5nZUNvbmZpZ1Byb3BzIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgZm9yIF9ub21pbmFsXyAoY2F0ZWdvcmljYWwpIGZpZWxkcy5cbiAgICovXG4gIGNhdGVnb3J5Pzogc3RyaW5nW10gfCBWZ1NjaGVtZTtcblxuICAvKipcbiAgICogRGVmYXVsdCByYW5nZSBmb3IgZGl2ZXJnaW5nIF9xdWFudGl0YXRpdmVfIGZpZWxkcy5cbiAgICovXG4gIGRpdmVyZ2luZz86IHN0cmluZ1tdIHwgVmdTY2hlbWU7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgZm9yIF9xdWFudGl0YXRpdmVfIGhlYXRtYXBzLlxuICAgKi9cbiAgaGVhdG1hcD86IHN0cmluZ1tdIHwgVmdTY2hlbWU7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgZm9yIF9vcmRpbmFsXyBmaWVsZHMuXG4gICAqL1xuICBvcmRpbmFsPzogc3RyaW5nW10gfCBWZ1NjaGVtZTtcblxuICAvKipcbiAgICogRGVmYXVsdCByYW5nZSBmb3IgX3F1YW50aXRhdGl2ZV8gYW5kIF90ZW1wb3JhbF8gZmllbGRzLlxuICAgKi9cbiAgcmFtcD86IHN0cmluZ1tdIHwgVmdTY2hlbWU7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgcGFsZXR0ZSBmb3IgdGhlIGBzaGFwZWAgY2hhbm5lbC5cbiAgICovXG4gIHN5bWJvbD86IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZMT25seUNvbmZpZyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IGF4aXMgYW5kIGxlZ2VuZCB0aXRsZSBmb3IgY291bnQgZmllbGRzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYCdOdW1iZXIgb2YgUmVjb3JkcydgLlxuICAgKlxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKi9cbiAgY291bnRUaXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVmaW5lcyBob3cgVmVnYS1MaXRlIHNob3VsZCBoYW5kbGUgaW52YWxpZCB2YWx1ZXMgKGBudWxsYCBhbmQgYE5hTmApLlxuICAgKiAtIElmIHNldCB0byBgXCJmaWx0ZXJcImAgKGRlZmF1bHQpLCBhbGwgZGF0YSBpdGVtcyB3aXRoIG51bGwgdmFsdWVzIHdpbGwgYmUgc2tpcHBlZCAoZm9yIGxpbmUsIHRyYWlsLCBhbmQgYXJlYSBtYXJrcykgb3IgZmlsdGVyZWQgKGZvciBvdGhlciBtYXJrcykuXG4gICAqIC0gSWYgYG51bGxgLCBhbGwgZGF0YSBpdGVtcyBhcmUgaW5jbHVkZWQuIEluIHRoaXMgY2FzZSwgaW52YWxpZCB2YWx1ZXMgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyB6ZXJvZXMuXG4gICAqL1xuICBpbnZhbGlkVmFsdWVzPzogJ2ZpbHRlcicgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGhvdyBWZWdhLUxpdGUgZ2VuZXJhdGVzIHRpdGxlIGZvciBmaWVsZHMuICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgc3R5bGVzOlxuICAgKiAtIGBcInZlcmJhbFwiYCAoRGVmYXVsdCkgLSBkaXNwbGF5cyBmdW5jdGlvbiBpbiBhIHZlcmJhbCBzdHlsZSAoZS5nLiwgXCJTdW0gb2YgZmllbGRcIiwgXCJZZWFyLW1vbnRoIG9mIGRhdGVcIiwgXCJmaWVsZCAoYmlubmVkKVwiKS5cbiAgICogLSBgXCJmdW5jdGlvblwiYCAtIGRpc3BsYXlzIGZ1bmN0aW9uIHVzaW5nIHBhcmVudGhlc2VzIGFuZCBjYXBpdGFsaXplZCB0ZXh0cyAoZS5nLiwgXCJTVU0oZmllbGQpXCIsIFwiWUVBUk1PTlRIKGRhdGUpXCIsIFwiQklOKGZpZWxkKVwiKS5cbiAgICogLSBgXCJwbGFpblwiYCAtIGRpc3BsYXlzIG9ubHkgdGhlIGZpZWxkIG5hbWUgd2l0aG91dCBmdW5jdGlvbnMgKGUuZy4sIFwiZmllbGRcIiwgXCJkYXRlXCIsIFwiZmllbGRcIikuXG4gICAqL1xuICBmaWVsZFRpdGxlPzogJ3ZlcmJhbCcgfCAnZnVuY3Rpb25hbCcgfCAncGxhaW4nO1xuXG4gIC8qKlxuICAgKiBEMyBOdW1iZXIgZm9ybWF0IGZvciBheGlzIGxhYmVscyBhbmQgdGV4dCB0YWJsZXMuIEZvciBleGFtcGxlIFwic1wiIGZvciBTSSB1bml0cy4gVXNlIFtEMydzIG51bWJlciBmb3JtYXQgcGF0dGVybl0oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWZvcm1hdCNsb2NhbGVfZm9ybWF0KS5cbiAgICovXG4gIG51bWJlckZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogRGVmYXVsdCBkYXRldGltZSBmb3JtYXQgZm9yIGF4aXMgYW5kIGxlZ2VuZCBsYWJlbHMuIFRoZSBmb3JtYXQgY2FuIGJlIHNldCBkaXJlY3RseSBvbiBlYWNoIGF4aXMgYW5kIGxlZ2VuZC4gVXNlIFtEMydzIHRpbWUgZm9ybWF0IHBhdHRlcm5dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy10aW1lLWZvcm1hdCNsb2NhbGVfZm9ybWF0KS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAnJ2AgKFRoZSBmb3JtYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGVybWluZWQpLlxuICAgKlxuICAgKi9cbiAgdGltZUZvcm1hdD86IHN0cmluZztcblxuXG4gIC8qKiBEZWZhdWx0IHByb3BlcnRpZXMgZm9yIFtzaW5nbGUgdmlldyBwbG90c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwjc2luZ2xlKS4gKi9cbiAgdmlldz86IFZpZXdDb25maWc7XG5cbiAgLyoqXG4gICAqIFNjYWxlIGNvbmZpZ3VyYXRpb24gZGV0ZXJtaW5lcyBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIGFsbCBbc2NhbGVzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwpLiBGb3IgYSBmdWxsIGxpc3Qgb2Ygc2NhbGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBwbGVhc2Ugc2VlIHRoZSBbY29ycmVzcG9uZGluZyBzZWN0aW9uIG9mIHRoZSBzY2FsZSBkb2N1bWVudGF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjY29uZmlnKS5cbiAgICovXG4gIHNjYWxlPzogU2NhbGVDb25maWc7XG5cbiAgLyoqIEFuIG9iamVjdCBoYXNoIGZvciBkZWZpbmluZyBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIGVhY2ggdHlwZSBvZiBzZWxlY3Rpb25zLiAqL1xuICBzZWxlY3Rpb24/OiBTZWxlY3Rpb25Db25maWc7XG5cbiAgLyoqIERlZmF1bHQgc3RhY2sgb2Zmc2V0IGZvciBzdGFja2FibGUgbWFyay4gKi9cbiAgc3RhY2s/OiBTdGFja09mZnNldDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdHlsZUNvbmZpZ0luZGV4IHtcbiAgW3N0eWxlOiBzdHJpbmddOiBWZ01hcmtDb25maWc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBDb25maWcgZXh0ZW5kcyBUb3BMZXZlbFByb3BlcnRpZXMsIFZMT25seUNvbmZpZywgTWFya0NvbmZpZ01peGlucywgQ29tcG9zaXRlTWFya0NvbmZpZ01peGlucywgQXhpc0NvbmZpZ01peGlucyB7XG5cbiAgLyoqXG4gICAqIEFuIG9iamVjdCBoYXNoIHRoYXQgZGVmaW5lcyBkZWZhdWx0IHJhbmdlIGFycmF5cyBvciBzY2hlbWVzIGZvciB1c2luZyB3aXRoIHNjYWxlcy5cbiAgICogRm9yIGEgZnVsbCBsaXN0IG9mIHNjYWxlIHJhbmdlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgcGxlYXNlIHNlZSB0aGUgW2NvcnJlc3BvbmRpbmcgc2VjdGlvbiBvZiB0aGUgc2NhbGUgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykuXG4gICAqL1xuICByYW5nZT86IFJhbmdlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBMZWdlbmQgY29uZmlndXJhdGlvbiwgd2hpY2ggZGV0ZXJtaW5lcyBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIGFsbCBbbGVnZW5kc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sZWdlbmQuaHRtbCkuIEZvciBhIGZ1bGwgbGlzdCBvZiBsZWdlbmQgY29uZmlndXJhdGlvbiBvcHRpb25zLCBwbGVhc2Ugc2VlIHRoZSBbY29ycmVzcG9uZGluZyBzZWN0aW9uIG9mIGluIHRoZSBsZWdlbmQgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sZWdlbmQuaHRtbCNjb25maWcpLlxuICAgKi9cbiAgbGVnZW5kPzogTGVnZW5kQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaXRsZSBjb25maWd1cmF0aW9uLCB3aGljaCBkZXRlcm1pbmVzIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgYWxsIFt0aXRsZXNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvdGl0bGUuaHRtbCkuIEZvciBhIGZ1bGwgbGlzdCBvZiB0aXRsZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHBsZWFzZSBzZWUgdGhlIFtjb3JyZXNwb25kaW5nIHNlY3Rpb24gb2YgdGhlIHRpdGxlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvdGl0bGUuaHRtbCNjb25maWcpLlxuICAgKi9cbiAgdGl0bGU/OiBWZ1RpdGxlQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBQcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGRldGVybWluZXMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhbGwgW3Byb2plY3Rpb25zXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3Byb2plY3Rpb24uaHRtbCkuIEZvciBhIGZ1bGwgbGlzdCBvZiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgcGxlYXNlIHNlZSB0aGUgW2NvcnJlc3BvbmRpbmcgc2VjdGlvbiBvZiB0aGUgcHJvamVjdGlvbiBkb2N1bWVudGF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3Byb2plY3Rpb24uaHRtbCNjb25maWcpLlxuICAgKi9cbiAgcHJvamVjdGlvbj86IFByb2plY3Rpb25Db25maWc7XG5cbiAgLyoqIEFuIG9iamVjdCBoYXNoIHRoYXQgZGVmaW5lcyBrZXktdmFsdWUgbWFwcGluZ3MgdG8gZGV0ZXJtaW5lIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgbWFya3Mgd2l0aCBhIGdpdmVuIFtzdHlsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9tYXJrLmh0bWwjbWFyay1kZWYpLiAgVGhlIGtleXMgcmVwcmVzZW50IHN0eWxlcyBuYW1lczsgdGhlIHZhbHVlcyBoYXZlIHRvIGJlIHZhbGlkIFttYXJrIGNvbmZpZ3VyYXRpb24gb2JqZWN0c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9tYXJrLmh0bWwjY29uZmlnKS4gICovXG4gIHN0eWxlPzogU3R5bGVDb25maWdJbmRleDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWc6IENvbmZpZyA9IHtcbiAgcGFkZGluZzogNSxcbiAgdGltZUZvcm1hdDogJycsXG4gIGNvdW50VGl0bGU6ICdOdW1iZXIgb2YgUmVjb3JkcycsXG5cbiAgaW52YWxpZFZhbHVlczogJ2ZpbHRlcicsXG5cbiAgdmlldzogZGVmYXVsdFZpZXdDb25maWcsXG5cbiAgbWFyazogbWFyay5kZWZhdWx0TWFya0NvbmZpZyxcbiAgYXJlYToge30sXG4gIGJhcjogbWFyay5kZWZhdWx0QmFyQ29uZmlnLFxuICBjaXJjbGU6IHt9LFxuICBnZW9zaGFwZToge30sXG4gIGxpbmU6IHt9LFxuICBwb2ludDoge30sXG4gIHJlY3Q6IHt9LFxuICBydWxlOiB7Y29sb3I6ICdibGFjayd9LCAvLyBOZWVkIHRoaXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb2xvciBpbiBtYXJrIGNvbmZpZ1xuICBzcXVhcmU6IHt9LFxuICB0ZXh0OiB7Y29sb3I6ICdibGFjayd9LCAvLyBOZWVkIHRoaXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBjb2xvciBpbiBtYXJrIGNvbmZpZ1xuICB0aWNrOiBtYXJrLmRlZmF1bHRUaWNrQ29uZmlnLFxuICB0cmFpbDoge30sXG5cbiAgYm94OiB7c2l6ZTogMTQsIGV4dGVudDogMS41fSxcbiAgYm94V2hpc2tlcjoge30sXG4gIGJveE1pZDoge2NvbG9yOiAnd2hpdGUnfSxcblxuICBzY2FsZTogZGVmYXVsdFNjYWxlQ29uZmlnLFxuICBwcm9qZWN0aW9uOiB7fSxcbiAgYXhpczoge30sXG4gIGF4aXNYOiB7fSxcbiAgYXhpc1k6IHttaW5FeHRlbnQ6IDMwfSxcbiAgYXhpc0xlZnQ6IHt9LFxuICBheGlzUmlnaHQ6IHt9LFxuICBheGlzVG9wOiB7fSxcbiAgYXhpc0JvdHRvbToge30sXG4gIGF4aXNCYW5kOiB7fSxcbiAgbGVnZW5kOiBkZWZhdWx0TGVnZW5kQ29uZmlnLFxuXG4gIHNlbGVjdGlvbjogZGVmYXVsdFNlbGVjdGlvbkNvbmZpZyxcbiAgc3R5bGU6IHt9LFxuXG4gIHRpdGxlOiB7fSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbml0Q29uZmlnKGNvbmZpZzogQ29uZmlnKSB7XG4gIHJldHVybiBtZXJnZURlZXAoZHVwbGljYXRlKGRlZmF1bHRDb25maWcpLCBjb25maWcpO1xufVxuXG5jb25zdCBNQVJLX1NUWUxFUyA9IFsndmlldyddLmNvbmNhdChQUklNSVRJVkVfTUFSS1MsIENPTVBPU0lURV9NQVJLX1NUWUxFUykgYXMgKCd2aWV3JyB8IE1hcmsgfCBDb21wb3NpdGVNYXJrU3R5bGUpW107XG5cblxuY29uc3QgVkxfT05MWV9DT05GSUdfUFJPUEVSVElFUzogKGtleW9mIENvbmZpZylbXSA9IFtcbiAgJ3BhZGRpbmcnLCAnbnVtYmVyRm9ybWF0JywgJ3RpbWVGb3JtYXQnLCAnY291bnRUaXRsZScsXG4gICdzdGFjaycsICdzY2FsZScsICdzZWxlY3Rpb24nLCAnaW52YWxpZFZhbHVlcycsXG4gICdvdmVybGF5JyBhcyBrZXlvZiBDb25maWcgLy8gRklYTUU6IFJlZGVzaWduIGFuZCB1bmhpZGUgdGhpc1xuXTtcblxuY29uc3QgVkxfT05MWV9BTExfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVggPSB7XG4gIHZpZXc6IFsnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIC4uLlZMX09OTFlfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVgsXG4gIC4uLlZMX09OTFlfQ09NUE9TSVRFX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBBbmRSZWRpcmVjdENvbmZpZyhjb25maWc6IENvbmZpZykge1xuICBjb25maWcgPSBkdXBsaWNhdGUoY29uZmlnKTtcblxuICBmb3IgKGNvbnN0IHByb3Agb2YgVkxfT05MWV9DT05GSUdfUFJPUEVSVElFUykge1xuICAgIGRlbGV0ZSBjb25maWdbcHJvcF07XG4gIH1cblxuICAvLyBSZW1vdmUgVmVnYS1MaXRlIG9ubHkgYXhpcy9sZWdlbmQgY29uZmlnXG4gIGlmIChjb25maWcuYXhpcykge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBWTF9PTkxZX0dVSURFX0NPTkZJRykge1xuICAgICAgZGVsZXRlIGNvbmZpZy5heGlzW3Byb3BdO1xuICAgIH1cbiAgfVxuICBpZiAoY29uZmlnLmxlZ2VuZCkge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBWTF9PTkxZX0dVSURFX0NPTkZJRykge1xuICAgICAgZGVsZXRlIGNvbmZpZy5sZWdlbmRbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLy8gUmVtb3ZlIFZlZ2EtTGl0ZSBvbmx5IGdlbmVyaWMgbWFyayBjb25maWdcbiAgaWYgKGNvbmZpZy5tYXJrKSB7XG4gICAgZm9yIChjb25zdCBwcm9wIG9mIFZMX09OTFlfTUFSS19DT05GSUdfUFJPUEVSVElFUykge1xuICAgICAgZGVsZXRlIGNvbmZpZy5tYXJrW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgbWFya1R5cGUgb2YgTUFSS19TVFlMRVMpIHtcbiAgICAvLyBSZW1vdmUgVmVnYS1MaXRlLW9ubHkgbWFyayBjb25maWdcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgVkxfT05MWV9NQVJLX0NPTkZJR19QUk9QRVJUSUVTKSB7XG4gICAgICBkZWxldGUgY29uZmlnW21hcmtUeXBlXVtwcm9wXTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgVmVnYS1MaXRlIG9ubHkgbWFyay1zcGVjaWZpYyBjb25maWdcbiAgICBjb25zdCB2bE9ubHlNYXJrU3BlY2lmaWNDb25maWdzID0gVkxfT05MWV9BTExfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVhbbWFya1R5cGVdO1xuICAgIGlmICh2bE9ubHlNYXJrU3BlY2lmaWNDb25maWdzKSB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2YgdmxPbmx5TWFya1NwZWNpZmljQ29uZmlncykge1xuICAgICAgICBkZWxldGUgY29uZmlnW21hcmtUeXBlXVtwcm9wXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZWRpcmVjdCBtYXJrIGNvbmZpZyB0byBjb25maWcuc3R5bGUgc28gdGhhdCBtYXJrIGNvbmZpZyBvbmx5IGFmZmVjdCBpdHMgb3duIG1hcmsgdHlwZVxuICAgIC8vIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIG1hcmtzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZyBWZWdhIG1hcmtzLlxuICAgIC8vIEZvciBleGFtcGxlLCBjb25maWcucmVjdCBzaG91bGQgbm90IGFmZmVjdCBiYXIgbWFya3MuXG4gICAgcmVkaXJlY3RDb25maWcoY29uZmlnLCBtYXJrVHlwZSk7XG4gIH1cblxuICAvLyBSZWRpcmVjdCBjb25maWcudGl0bGUgLS0gc28gdGhhdCB0aXRsZSBjb25maWcgZG8gbm90XG4gIC8vIGFmZmVjdCBoZWFkZXIgbGFiZWxzLCB3aGljaCBhbHNvIHVzZXMgYHRpdGxlYCBkaXJlY3RpdmUgdG8gaW1wbGVtZW50LlxuICByZWRpcmVjdENvbmZpZyhjb25maWcsICd0aXRsZScsICdncm91cC10aXRsZScpO1xuXG4gIC8vIFJlbW92ZSBlbXB0eSBjb25maWcgb2JqZWN0c1xuICBmb3IgKGNvbnN0IHByb3AgaW4gY29uZmlnKSB7XG4gICAgaWYgKGlzT2JqZWN0KGNvbmZpZ1twcm9wXSkgJiYga2V5cyhjb25maWdbcHJvcF0pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGVsZXRlIGNvbmZpZ1twcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ga2V5cyhjb25maWcpLmxlbmd0aCA+IDAgPyBjb25maWcgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZGlyZWN0Q29uZmlnKGNvbmZpZzogQ29uZmlnLCBwcm9wOiBNYXJrIHwgQ29tcG9zaXRlTWFya1N0eWxlIHwgJ3RpdGxlJyB8ICd2aWV3JywgdG9Qcm9wPzogc3RyaW5nKSB7XG4gIGNvbnN0IHByb3BDb25maWc6IFZnTWFya0NvbmZpZyA9IHByb3AgPT09ICd0aXRsZScgPyBleHRyYWN0VGl0bGVDb25maWcoY29uZmlnLnRpdGxlKS5tYXJrIDogY29uZmlnW3Byb3BdO1xuXG4gIGlmIChwcm9wID09PSAndmlldycpIHtcbiAgICB0b1Byb3AgPSAnY2VsbCc7IC8vIFZpZXcncyBkZWZhdWx0IHN0eWxlIGlzIFwiY2VsbFwiXG4gIH1cblxuICBjb25zdCBzdHlsZTogVmdNYXJrQ29uZmlnID0ge1xuICAgIC4uLnByb3BDb25maWcsXG4gICAgLi4uY29uZmlnLnN0eWxlW3Byb3BdXG4gIH07XG4gIC8vIHNldCBjb25maWcuc3R5bGUgaWYgaXQgaXMgbm90IGFuIGVtcHR5IG9iamVjdFxuICBpZiAoa2V5cyhzdHlsZSkubGVuZ3RoID4gMCkge1xuICAgIGNvbmZpZy5zdHlsZVt0b1Byb3AgfHwgcHJvcF0gPSBzdHlsZTtcbiAgfVxuICBkZWxldGUgY29uZmlnW3Byb3BdO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/data.d.ts b/build/src/data.d.ts new file mode 100644 index 0000000000..a6f34dd752 --- /dev/null +++ b/build/src/data.d.ts @@ -0,0 +1,115 @@ +import { VgData } from './vega.schema'; +export interface Parse { + [field: string]: null | string | 'string' | 'boolean' | 'date' | 'number'; +} +export interface DataFormatBase { + /** + * If set to `"auto"` (the default), perform automatic type inference to determine the desired data types. + * If set to `null`, disable type inference based on the spec and only use type inference based on the data. + * Alternatively, a parsing directive object can be provided for explicit data types. Each property of the object corresponds to a field name, and the value to the desired data type (one of `"number"`, `"boolean"`, `"date"`, or null (do not parse the field)). + * For example, `"parse": {"modified_on": "date"}` parses the `modified_on` field in each input record a Date value. + * + * For `"date"`, we parse data based using Javascript's [`Date.parse()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse). + * For Specific date formats can be provided (e.g., `{foo: 'date:"%m%d%Y"'}`), using the [d3-time-format syntax](https://github.com/d3/d3-time-format#locale_format). UTC date format parsing is supported similarly (e.g., `{foo: 'utc:"%m%d%Y"'}`). See more about [UTC time](https://vega.github.io/vega-lite/docs/timeunit.html#utc) + */ + parse?: 'auto' | Parse | null; +} +export interface CsvDataFormat extends DataFormatBase { + /** + * Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`. + * The default format type is determined by the extension of the file URL. + * If no extension is detected, `"json"` will be used by default. + */ + type?: 'csv' | 'tsv'; +} +export interface DsvDataFormat extends DataFormatBase { + /** + * Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`. + * The default format type is determined by the extension of the file URL. + * If no extension is detected, `"json"` will be used by default. + */ + type?: 'dsv'; + /** + * The delimiter between records. The delimiter must be a single character (i.e., a single 16-bit code unit); so, ASCII delimiters are fine, but emoji delimiters are not. + * + * @minLength 1 + * @maxLength 1 + */ + delimiter: string; +} +export interface JsonDataFormat extends DataFormatBase { + /** + * Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`. + * The default format type is determined by the extension of the file URL. + * If no extension is detected, `"json"` will be used by default. + */ + type?: 'json'; + /** + * The JSON property containing the desired data. + * This parameter can be used when the loaded JSON file may have surrounding structure or meta-data. + * For example `"property": "values.features"` is equivalent to retrieving `json.values.features` + * from the loaded JSON object. + */ + property?: string; +} +export interface TopoDataFormat extends DataFormatBase { + /** + * Type of input data: `"json"`, `"csv"`, `"tsv"`, `"dsv"`. + * The default format type is determined by the extension of the file URL. + * If no extension is detected, `"json"` will be used by default. + */ + type?: 'topojson'; + /** + * The name of the TopoJSON object set to convert to a GeoJSON feature collection. + * For example, in a map of the world, there may be an object set named `"countries"`. + * Using the feature property, we can extract this set and generate a GeoJSON feature object for each country. + */ + feature?: string; + /** + * The name of the TopoJSON object set to convert to mesh. + * Similar to the `feature` option, `mesh` extracts a named TopoJSON object set. + * Unlike the `feature` option, the corresponding geo data is returned as a single, unified mesh instance, not as individual GeoJSON features. + * Extracting a mesh is useful for more efficiently drawing borders or other geographic elements that you do not need to associate with specific regions such as individual countries, states or counties. + */ + mesh?: string; +} +export declare type DataFormat = CsvDataFormat | DsvDataFormat | JsonDataFormat | TopoDataFormat; +export declare type DataFormatType = 'json' | 'csv' | 'tsv' | 'dsv' | 'topojson'; +export declare type Data = UrlData | InlineData | NamedData; +export declare type InlineDataset = number[] | string[] | boolean[] | object[] | string | object; +export interface DataBase { + /** + * An object that specifies the format for parsing the data. + */ + format?: DataFormat; + /** + * Provide a placeholder name and bind data at runtime. + */ + name?: string; +} +export interface UrlData extends DataBase { + /** + * An URL from which to load the data set. Use the `format.type` property + * to ensure the loaded data is correctly parsed. + */ + url: string; +} +export interface InlineData extends DataBase { + /** + * The full data set, included inline. This can be an array of objects or primitive values, an object, or a string. + * Arrays of primitive values are ingested as objects with a `data` property. Strings are parsed according to the specified format type. + */ + values: InlineDataset; +} +export interface NamedData extends DataBase { + /** + * Provide a placeholder name and bind data at runtime. + */ + name: string; +} +export declare function isUrlData(data: Partial | Partial): data is UrlData; +export declare function isInlineData(data: Partial | Partial): data is InlineData; +export declare function isNamedData(data: Partial): data is NamedData; +export declare type DataSourceType = 'raw' | 'main' | 'row' | 'column' | 'lookup'; +export declare const MAIN: 'main'; +export declare const RAW: 'raw'; diff --git a/build/src/data.js b/build/src/data.js new file mode 100644 index 0000000000..edd3acca45 --- /dev/null +++ b/build/src/data.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isUrlData(data) { + return !!data['url']; +} +exports.isUrlData = isUrlData; +function isInlineData(data) { + return !!data['values']; +} +exports.isInlineData = isInlineData; +function isNamedData(data) { + return !!data['name'] && !isUrlData(data) && !isInlineData(data); +} +exports.isNamedData = isNamedData; +exports.MAIN = 'main'; +exports.RAW = 'raw'; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBZ0lBLG1CQUEwQixJQUFxQztJQUM3RCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUZELDhCQUVDO0FBRUQsc0JBQTZCLElBQXFDO0lBQ2hFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRkQsb0NBRUM7QUFFRCxxQkFBNEIsSUFBbUI7SUFDN0MsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFGRCxrQ0FFQztBQUlZLFFBQUEsSUFBSSxHQUFXLE1BQU0sQ0FBQztBQUN0QixRQUFBLEdBQUcsR0FBVSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29uc3RhbnRzIGFuZCB1dGlsaXRpZXMgZm9yIGRhdGEuXG4gKi9cbmltcG9ydCB7VmdEYXRhfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZSB7XG4gIFtmaWVsZDogc3RyaW5nXTogbnVsbCB8IHN0cmluZyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nIHwgJ2RhdGUnIHwgJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdEJhc2Uge1xuICAvKipcbiAgICogSWYgc2V0IHRvIGBcImF1dG9cImAgKHRoZSBkZWZhdWx0KSwgcGVyZm9ybSBhdXRvbWF0aWMgdHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBkZXNpcmVkIGRhdGEgdHlwZXMuXG4gICAqIElmIHNldCB0byBgbnVsbGAsIGRpc2FibGUgdHlwZSBpbmZlcmVuY2UgYmFzZWQgb24gdGhlIHNwZWMgYW5kIG9ubHkgdXNlIHR5cGUgaW5mZXJlbmNlIGJhc2VkIG9uIHRoZSBkYXRhLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBhIHBhcnNpbmcgZGlyZWN0aXZlIG9iamVjdCBjYW4gYmUgcHJvdmlkZWQgZm9yIGV4cGxpY2l0IGRhdGEgdHlwZXMuIEVhY2ggcHJvcGVydHkgb2YgdGhlIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIGZpZWxkIG5hbWUsIGFuZCB0aGUgdmFsdWUgdG8gdGhlIGRlc2lyZWQgZGF0YSB0eXBlIChvbmUgb2YgYFwibnVtYmVyXCJgLCBgXCJib29sZWFuXCJgLCBgXCJkYXRlXCJgLCBvciBudWxsIChkbyBub3QgcGFyc2UgdGhlIGZpZWxkKSkuXG4gICAqIEZvciBleGFtcGxlLCBgXCJwYXJzZVwiOiB7XCJtb2RpZmllZF9vblwiOiBcImRhdGVcIn1gIHBhcnNlcyB0aGUgYG1vZGlmaWVkX29uYCBmaWVsZCBpbiBlYWNoIGlucHV0IHJlY29yZCBhIERhdGUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBgXCJkYXRlXCJgLCB3ZSBwYXJzZSBkYXRhIGJhc2VkIHVzaW5nIEphdmFzY3JpcHQncyBbYERhdGUucGFyc2UoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2UpLlxuICAgKiBGb3IgU3BlY2lmaWMgZGF0ZSBmb3JtYXRzIGNhbiBiZSBwcm92aWRlZCAoZS5nLiwgYHtmb286ICdkYXRlOlwiJW0lZCVZXCInfWApLCB1c2luZyB0aGUgW2QzLXRpbWUtZm9ybWF0IHN5bnRheF0oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXRpbWUtZm9ybWF0I2xvY2FsZV9mb3JtYXQpLiBVVEMgZGF0ZSBmb3JtYXQgcGFyc2luZyBpcyBzdXBwb3J0ZWQgc2ltaWxhcmx5IChlLmcuLCBge2ZvbzogJ3V0YzpcIiVtJWQlWVwiJ31gKS4gU2VlIG1vcmUgYWJvdXQgW1VUQyB0aW1lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RpbWV1bml0Lmh0bWwjdXRjKVxuICAgKi9cbiAgcGFyc2U/OiAnYXV0bycgfCBQYXJzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3N2RGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdjc3YnIHwgJ3Rzdic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHN2RGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdkc3YnO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsaW1pdGVyIGJldHdlZW4gcmVjb3Jkcy4gVGhlIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciAoaS5lLiwgYSBzaW5nbGUgMTYtYml0IGNvZGUgdW5pdCk7IHNvLCBBU0NJSSBkZWxpbWl0ZXJzIGFyZSBmaW5lLCBidXQgZW1vamkgZGVsaW1pdGVycyBhcmUgbm90LlxuICAgKlxuICAgKiBAbWluTGVuZ3RoIDFcbiAgICogQG1heExlbmd0aCAxXG4gICAqL1xuICBkZWxpbWl0ZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKc29uRGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdqc29uJztcbiAgLyoqXG4gICAqIFRoZSBKU09OIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgZGF0YS5cbiAgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgbG9hZGVkIEpTT04gZmlsZSBtYXkgaGF2ZSBzdXJyb3VuZGluZyBzdHJ1Y3R1cmUgb3IgbWV0YS1kYXRhLlxuICAgKiBGb3IgZXhhbXBsZSBgXCJwcm9wZXJ0eVwiOiBcInZhbHVlcy5mZWF0dXJlc1wiYCBpcyBlcXVpdmFsZW50IHRvIHJldHJpZXZpbmcgYGpzb24udmFsdWVzLmZlYXR1cmVzYFxuICAgKiBmcm9tIHRoZSBsb2FkZWQgSlNPTiBvYmplY3QuXG4gICAqL1xuICBwcm9wZXJ0eT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BvRGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICd0b3BvanNvbic7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgVG9wb0pTT04gb2JqZWN0IHNldCB0byBjb252ZXJ0IHRvIGEgR2VvSlNPTiBmZWF0dXJlIGNvbGxlY3Rpb24uXG4gICAqIEZvciBleGFtcGxlLCBpbiBhIG1hcCBvZiB0aGUgd29ybGQsIHRoZXJlIG1heSBiZSBhbiBvYmplY3Qgc2V0IG5hbWVkIGBcImNvdW50cmllc1wiYC5cbiAgICogVXNpbmcgdGhlIGZlYXR1cmUgcHJvcGVydHksIHdlIGNhbiBleHRyYWN0IHRoaXMgc2V0IGFuZCBnZW5lcmF0ZSBhIEdlb0pTT04gZmVhdHVyZSBvYmplY3QgZm9yIGVhY2ggY291bnRyeS5cbiAgICovXG4gIGZlYXR1cmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgVG9wb0pTT04gb2JqZWN0IHNldCB0byBjb252ZXJ0IHRvIG1lc2guXG4gICAqIFNpbWlsYXIgdG8gdGhlIGBmZWF0dXJlYCBvcHRpb24sIGBtZXNoYCBleHRyYWN0cyBhIG5hbWVkIFRvcG9KU09OIG9iamVjdCBzZXQuXG4gICAqICBVbmxpa2UgdGhlIGBmZWF0dXJlYCBvcHRpb24sIHRoZSBjb3JyZXNwb25kaW5nIGdlbyBkYXRhIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlLCB1bmlmaWVkIG1lc2ggaW5zdGFuY2UsIG5vdCBhcyBpbmRpdmlkdWFsIEdlb0pTT04gZmVhdHVyZXMuXG4gICAqIEV4dHJhY3RpbmcgYSBtZXNoIGlzIHVzZWZ1bCBmb3IgbW9yZSBlZmZpY2llbnRseSBkcmF3aW5nIGJvcmRlcnMgb3Igb3RoZXIgZ2VvZ3JhcGhpYyBlbGVtZW50cyB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBhc3NvY2lhdGUgd2l0aCBzcGVjaWZpYyByZWdpb25zIHN1Y2ggYXMgaW5kaXZpZHVhbCBjb3VudHJpZXMsIHN0YXRlcyBvciBjb3VudGllcy5cbiAgICovXG4gIG1lc2g/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSBDc3ZEYXRhRm9ybWF0IHwgRHN2RGF0YUZvcm1hdCB8IEpzb25EYXRhRm9ybWF0IHwgVG9wb0RhdGFGb3JtYXQ7XG5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXRUeXBlID0gJ2pzb24nIHwgJ2NzdicgfCAndHN2JyB8ICdkc3YnIHwgJ3RvcG9qc29uJztcblxuZXhwb3J0IHR5cGUgRGF0YSA9IFVybERhdGEgfCBJbmxpbmVEYXRhIHwgTmFtZWREYXRhO1xuXG5leHBvcnQgdHlwZSBJbmxpbmVEYXRhc2V0ID0gbnVtYmVyW10gfCBzdHJpbmdbXSB8IGJvb2xlYW5bXSB8IG9iamVjdFtdIHwgc3RyaW5nIHwgb2JqZWN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciBwYXJzaW5nIHRoZSBkYXRhLlxuICAgKi9cbiAgZm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBwbGFjZWhvbGRlciBuYW1lIGFuZCBiaW5kIGRhdGEgYXQgcnVudGltZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIEFuIFVSTCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIGRhdGEgc2V0LiBVc2UgdGhlIGBmb3JtYXQudHlwZWAgcHJvcGVydHlcbiAgICogdG8gZW5zdXJlIHRoZSBsb2FkZWQgZGF0YSBpcyBjb3JyZWN0bHkgcGFyc2VkLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGRhdGEgc2V0LCBpbmNsdWRlZCBpbmxpbmUuIFRoaXMgY2FuIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgcHJpbWl0aXZlIHZhbHVlcywgYW4gb2JqZWN0LCBvciBhIHN0cmluZy5cbiAgICogQXJyYXlzIG9mIHByaW1pdGl2ZSB2YWx1ZXMgYXJlIGluZ2VzdGVkIGFzIG9iamVjdHMgd2l0aCBhIGBkYXRhYCBwcm9wZXJ0eS4gU3RyaW5ncyBhcmUgcGFyc2VkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCB0eXBlLlxuICAgKi9cbiAgdmFsdWVzOiBJbmxpbmVEYXRhc2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBwbGFjZWhvbGRlciBuYW1lIGFuZCBiaW5kIGRhdGEgYXQgcnVudGltZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsRGF0YShkYXRhOiBQYXJ0aWFsPERhdGE+IHwgUGFydGlhbDxWZ0RhdGE+KTogZGF0YSBpcyBVcmxEYXRhIHtcbiAgcmV0dXJuICEhZGF0YVsndXJsJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZURhdGEoZGF0YTogUGFydGlhbDxEYXRhPiB8IFBhcnRpYWw8VmdEYXRhPik6IGRhdGEgaXMgSW5saW5lRGF0YSB7XG4gIHJldHVybiAhIWRhdGFbJ3ZhbHVlcyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lZERhdGEoZGF0YTogUGFydGlhbDxEYXRhPik6IGRhdGEgaXMgTmFtZWREYXRhIHtcbiAgcmV0dXJuICEhZGF0YVsnbmFtZSddICYmICFpc1VybERhdGEoZGF0YSkgJiYgIWlzSW5saW5lRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZVR5cGUgPSAncmF3JyB8ICdtYWluJyB8ICdyb3cnIHwgJ2NvbHVtbicgfCAnbG9va3VwJztcblxuZXhwb3J0IGNvbnN0IE1BSU46ICdtYWluJyA9ICdtYWluJztcbmV4cG9ydCBjb25zdCBSQVc6ICdyYXcnID0gJ3Jhdyc7XG4iXX0= \ No newline at end of file diff --git a/build/src/datetime.d.ts b/build/src/datetime.d.ts new file mode 100644 index 0000000000..bb69b23925 --- /dev/null +++ b/build/src/datetime.d.ts @@ -0,0 +1,105 @@ +/** + * @minimum 1 + * @maximum 12 + * @TJS-type integer + */ +export declare type Month = number; +/** + * @minimum 1 + * @maximum 7 + */ +export declare type Day = number; +/** + * Object for defining datetime in Vega-Lite Filter. + * If both month and quarter are provided, month has higher precedence. + * `day` cannot be combined with other date. + * We accept string for month and day names. + */ +export interface DateTime { + /** + * Integer value representing the year. + * @TJS-type integer + */ + year?: number; + /** + * Integer value representing the quarter of the year (from 1-4). + * @minimum 1 + * @maximum 4 + * @TJS-type integer + */ + quarter?: number; + /** One of: (1) integer value representing the month from `1`-`12`. `1` represents January; (2) case-insensitive month name (e.g., `"January"`); (3) case-insensitive, 3-character short month name (e.g., `"Jan"`). */ + month?: Month | string; + /** + * Integer value representing the date from 1-31. + * @minimum 1 + * @maximum 31 + * @TJS-type integer + */ + date?: number; + /** + * Value representing the day of a week. This can be one of: (1) integer value -- `1` represents Monday; (2) case-insensitive day name (e.g., `"Monday"`); (3) case-insensitive, 3-character short day name (e.g., `"Mon"`).
**Warning:** A DateTime definition object with `day`** should not be combined with `year`, `quarter`, `month`, or `date`. + */ + day?: Day | string; + /** + * Integer value representing the hour of a day from 0-23. + * @minimum 0 + * @maximum 23 + * @TJS-type integer + */ + hours?: number; + /** + * Integer value representing the minute segment of time from 0-59. + * @minimum 0 + * @maximum 59 + * @TJS-type integer + */ + minutes?: number; + /** + * Integer value representing the second segment (0-59) of a time value + * @minimum 0 + * @maximum 59 + * @TJS-type integer + */ + seconds?: number; + /** + * Integer value representing the millisecond segment of time. + * @minimum 0 + * @maximum 999 + * @TJS-type integer + */ + milliseconds?: number; + /** + * A boolean flag indicating if date time is in utc time. If false, the date time is in local time + */ + utc?: boolean; +} +/** + * Internal Object for defining datetime expressions. + * This is an expression version of DateTime. + * If both month and quarter are provided, month has higher precedence. + * `day` cannot be combined with other date. + */ +export interface DateTimeExpr { + year?: string; + quarter?: string; + month?: string; + date?: string; + day?: string; + hours?: string; + minutes?: string; + seconds?: string; + milliseconds?: string; + utc?: boolean; +} +export declare function isDateTime(o: any): o is DateTime; +export declare const MONTHS: string[]; +export declare const SHORT_MONTHS: string[]; +export declare const DAYS: string[]; +export declare const SHORT_DAYS: string[]; +/** + * Return Vega Expression for a particular date time. + * @param d + * @param normalize whether to normalize quarter, month, day. + */ +export declare function dateTimeExpr(d: DateTime | DateTimeExpr, normalize?: boolean): string; diff --git a/build/src/datetime.js b/build/src/datetime.js new file mode 100644 index 0000000000..194600d921 --- /dev/null +++ b/build/src/datetime.js @@ -0,0 +1,142 @@ +"use strict"; +// DateTime definition object +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var log = tslib_1.__importStar(require("./log")); +var util_1 = require("./util"); +/* + * A designated year that starts on Sunday. + */ +var SUNDAY_YEAR = 2006; +function isDateTime(o) { + return !!o && (!!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day || + !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds); +} +exports.isDateTime = isDateTime; +exports.MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; +exports.SHORT_MONTHS = exports.MONTHS.map(function (m) { return m.substr(0, 3); }); +exports.DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; +exports.SHORT_DAYS = exports.DAYS.map(function (d) { return d.substr(0, 3); }); +function normalizeQuarter(q) { + if (vega_util_1.isNumber(q)) { + if (q > 4) { + log.warn(log.message.invalidTimeUnit('quarter', q)); + } + // We accept 1-based quarter, so need to readjust to 0-based quarter + return (q - 1) + ''; + } + else { + // Invalid quarter + throw new Error(log.message.invalidTimeUnit('quarter', q)); + } +} +function normalizeMonth(m) { + if (vega_util_1.isNumber(m)) { + // We accept 1-based month, so need to readjust to 0-based month + return (m - 1) + ''; + } + else { + var lowerM = m.toLowerCase(); + var monthIndex = exports.MONTHS.indexOf(lowerM); + if (monthIndex !== -1) { + return monthIndex + ''; // 0 for january, ... + } + var shortM = lowerM.substr(0, 3); + var shortMonthIndex = exports.SHORT_MONTHS.indexOf(shortM); + if (shortMonthIndex !== -1) { + return shortMonthIndex + ''; + } + // Invalid month + throw new Error(log.message.invalidTimeUnit('month', m)); + } +} +function normalizeDay(d) { + if (vega_util_1.isNumber(d)) { + // mod so that this can be both 0-based where 0 = sunday + // and 1-based where 7=sunday + return (d % 7) + ''; + } + else { + var lowerD = d.toLowerCase(); + var dayIndex = exports.DAYS.indexOf(lowerD); + if (dayIndex !== -1) { + return dayIndex + ''; // 0 for january, ... + } + var shortD = lowerD.substr(0, 3); + var shortDayIndex = exports.SHORT_DAYS.indexOf(shortD); + if (shortDayIndex !== -1) { + return shortDayIndex + ''; + } + // Invalid day + throw new Error(log.message.invalidTimeUnit('day', d)); + } +} +/** + * Return Vega Expression for a particular date time. + * @param d + * @param normalize whether to normalize quarter, month, day. + */ +function dateTimeExpr(d, normalize) { + if (normalize === void 0) { normalize = false; } + var units = []; + if (normalize && d.day !== undefined) { + if (util_1.keys(d).length > 1) { + log.warn(log.message.droppedDay(d)); + d = util_1.duplicate(d); + delete d.day; + } + } + if (d.year !== undefined) { + units.push(d.year); + } + else if (d.day !== undefined) { + // Set year to 2006 for working with day since January 1 2006 is a Sunday + units.push(SUNDAY_YEAR); + } + else { + units.push(0); + } + if (d.month !== undefined) { + var month = normalize ? normalizeMonth(d.month) : d.month; + units.push(month); + } + else if (d.quarter !== undefined) { + var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter; + units.push(quarter + '*3'); + } + else { + units.push(0); // months start at zero in JS + } + if (d.date !== undefined) { + units.push(d.date); + } + else if (d.day !== undefined) { + // HACK: Day only works as a standalone unit + // This is only correct because we always set year to 2006 for day + var day = normalize ? normalizeDay(d.day) : d.day; + units.push(day + '+1'); + } + else { + units.push(1); // Date starts at 1 in JS + } + // Note: can't use TimeUnit enum here as importing it will create + // circular dependency problem! + for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) { + var timeUnit = _a[_i]; + if (d[timeUnit] !== undefined) { + units.push(d[timeUnit]); + } + else { + units.push(0); + } + } + if (d.utc) { + return "utc(" + units.join(', ') + ")"; + } + else { + return "datetime(" + units.join(', ') + ")"; + } +} +exports.dateTimeExpr = dateTimeExpr; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0ZXRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDZCQUE2Qjs7O0FBRTdCLHVDQUFtQztBQUNuQyxpREFBNkI7QUFDN0IsK0JBQXVDO0FBR3ZDOztHQUVHO0FBQ0gsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBOEd6QixvQkFBMkIsQ0FBTTtJQUMvQixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7UUFDeEUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBSEQsZ0NBR0M7QUFFWSxRQUFBLE1BQU0sR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDcEksUUFBQSxZQUFZLEdBQUcsY0FBTSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFkLENBQWMsQ0FBQyxDQUFDO0FBRWpELFFBQUEsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFVBQVUs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SSxDQUFDLElBQUksQ0FBQyxNQUFHLENBQUM7S0FDbkM7U0FBTTtRQUNMLE9BQU8sY0FBWSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFHLENBQUM7S0FDeEM7QUFDSCxDQUFDO0FBeERELG9DQXdEQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIERhdGVUaW1lIGRlZmluaXRpb24gb2JqZWN0XG5cbmltcG9ydCB7aXNOdW1iZXJ9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtkdXBsaWNhdGUsIGtleXN9IGZyb20gJy4vdXRpbCc7XG5cblxuLypcbiAqIEEgZGVzaWduYXRlZCB5ZWFyIHRoYXQgc3RhcnRzIG9uIFN1bmRheS5cbiAqL1xuY29uc3QgU1VOREFZX1lFQVIgPSAyMDA2O1xuXG4vKipcbiAqIEBtaW5pbXVtIDFcbiAqIEBtYXhpbXVtIDEyXG4gKiBAVEpTLXR5cGUgaW50ZWdlclxuICovXG5leHBvcnQgdHlwZSBNb250aCA9IG51bWJlcjtcblxuLyoqXG4gKiBAbWluaW11bSAxXG4gKiBAbWF4aW11bSA3XG4gKi9cbmV4cG9ydCB0eXBlIERheSA9IG51bWJlcjtcblxuLyoqXG4gKiBPYmplY3QgZm9yIGRlZmluaW5nIGRhdGV0aW1lIGluIFZlZ2EtTGl0ZSBGaWx0ZXIuXG4gKiBJZiBib3RoIG1vbnRoIGFuZCBxdWFydGVyIGFyZSBwcm92aWRlZCwgbW9udGggaGFzIGhpZ2hlciBwcmVjZWRlbmNlLlxuICogYGRheWAgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgZGF0ZS5cbiAqIFdlIGFjY2VwdCBzdHJpbmcgZm9yIG1vbnRoIGFuZCBkYXkgbmFtZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWUge1xuICAvKipcbiAgICogSW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHllYXIuXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICB5ZWFyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgcXVhcnRlciBvZiB0aGUgeWVhciAoZnJvbSAxLTQpLlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDRcbiAgICogQFRKUy10eXBlIGludGVnZXJcbiAgICovXG4gIHF1YXJ0ZXI/OiBudW1iZXI7XG5cbiAgLyoqIE9uZSBvZjogKDEpIGludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBtb250aCBmcm9tIGAxYC1gMTJgLiBgMWAgcmVwcmVzZW50cyBKYW51YXJ5OyAgKDIpIGNhc2UtaW5zZW5zaXRpdmUgbW9udGggbmFtZSAoZS5nLiwgYFwiSmFudWFyeVwiYCk7ICAoMykgY2FzZS1pbnNlbnNpdGl2ZSwgMy1jaGFyYWN0ZXIgc2hvcnQgbW9udGggbmFtZSAoZS5nLiwgYFwiSmFuXCJgKS4gKi9cbiAgbW9udGg/OiBNb250aCB8IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGRhdGUgZnJvbSAxLTMxLlxuICAgKiBAbWluaW11bSAxXG4gICAqIEBtYXhpbXVtIDMxXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBkYXRlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGRheSBvZiBhIHdlZWsuICBUaGlzIGNhbiBiZSBvbmUgb2Y6ICgxKSBpbnRlZ2VyIHZhbHVlIC0tIGAxYCByZXByZXNlbnRzIE1vbmRheTsgKDIpIGNhc2UtaW5zZW5zaXRpdmUgZGF5IG5hbWUgKGUuZy4sIGBcIk1vbmRheVwiYCk7ICAoMykgY2FzZS1pbnNlbnNpdGl2ZSwgMy1jaGFyYWN0ZXIgc2hvcnQgZGF5IG5hbWUgKGUuZy4sIGBcIk1vblwiYCkuICAgPGJyLz4gKipXYXJuaW5nOioqIEEgRGF0ZVRpbWUgZGVmaW5pdGlvbiBvYmplY3Qgd2l0aCBgZGF5YCoqIHNob3VsZCBub3QgYmUgY29tYmluZWQgd2l0aCBgeWVhcmAsIGBxdWFydGVyYCwgYG1vbnRoYCwgb3IgYGRhdGVgLlxuICAgKi9cbiAgZGF5PzogRGF5IHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgaG91ciBvZiBhIGRheSBmcm9tIDAtMjMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMjNcbiAgICogQFRKUy10eXBlIGludGVnZXJcbiAgICovXG4gIGhvdXJzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbWludXRlIHNlZ21lbnQgb2YgdGltZSBmcm9tIDAtNTkuXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gNTlcbiAgICogQFRKUy10eXBlIGludGVnZXJcbiAgICovXG4gIG1pbnV0ZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBzZWNvbmQgc2VnbWVudCAoMC01OSkgb2YgYSB0aW1lIHZhbHVlXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gNTlcbiAgICogQFRKUy10eXBlIGludGVnZXJcbiAgICovXG4gIHNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBtaWxsaXNlY29uZCBzZWdtZW50IG9mIHRpbWUuXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gOTk5XG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBtaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgZGF0ZSB0aW1lIGlzIGluIHV0YyB0aW1lLiBJZiBmYWxzZSwgdGhlIGRhdGUgdGltZSBpcyBpbiBsb2NhbCB0aW1lXG4gICAqL1xuICB1dGM/OiBib29sZWFuO1xufVxuXG5cbi8qKlxuICogSW50ZXJuYWwgT2JqZWN0IGZvciBkZWZpbmluZyBkYXRldGltZSBleHByZXNzaW9ucy5cbiAqIFRoaXMgaXMgYW4gZXhwcmVzc2lvbiB2ZXJzaW9uIG9mIERhdGVUaW1lLlxuICogSWYgYm90aCBtb250aCBhbmQgcXVhcnRlciBhcmUgcHJvdmlkZWQsIG1vbnRoIGhhcyBoaWdoZXIgcHJlY2VkZW5jZS5cbiAqIGBkYXlgIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0ZVRpbWVFeHByIHtcbiAgeWVhcj86IHN0cmluZztcbiAgcXVhcnRlcj86IHN0cmluZztcbiAgbW9udGg/OiBzdHJpbmc7XG4gIGRhdGU/OiBzdHJpbmc7XG4gIGRheT86IHN0cmluZztcbiAgaG91cnM/OiBzdHJpbmc7XG4gIG1pbnV0ZXM/OiBzdHJpbmc7XG4gIHNlY29uZHM/OiBzdHJpbmc7XG4gIG1pbGxpc2Vjb25kcz86IHN0cmluZztcbiAgdXRjPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZVRpbWUobzogYW55KTogbyBpcyBEYXRlVGltZSB7XG4gIHJldHVybiAhIW8gJiYgKCEhby55ZWFyIHx8ICEhby5xdWFydGVyIHx8ICEhby5tb250aCB8fCAhIW8uZGF0ZSB8fCAhIW8uZGF5IHx8XG4gICAgISFvLmhvdXJzIHx8ICEhby5taW51dGVzIHx8ICEhby5zZWNvbmRzIHx8ICEhby5taWxsaXNlY29uZHMpO1xufVxuXG5leHBvcnQgY29uc3QgTU9OVEhTID0gWydqYW51YXJ5JywgJ2ZlYnJ1YXJ5JywgJ21hcmNoJywgJ2FwcmlsJywgJ21heScsICdqdW5lJywgJ2p1bHknLCAnYXVndXN0JywgJ3NlcHRlbWJlcicsICdvY3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ107XG5leHBvcnQgY29uc3QgU0hPUlRfTU9OVEhTID0gTU9OVEhTLm1hcCgobSkgPT4gbS5zdWJzdHIoMCwgMykpO1xuXG5leHBvcnQgY29uc3QgREFZUyA9IFsnc3VuZGF5JywgJ21vbmRheScsICd0dWVzZGF5JywgJ3dlZG5lc2RheScsICd0aHVyc2RheScsICdmcmlkYXknLCAnc2F0dXJkYXknXTtcbmV4cG9ydCBjb25zdCBTSE9SVF9EQVlTID0gREFZUy5tYXAoKGQpID0+IGQuc3Vic3RyKDAsMykpO1xuXG5mdW5jdGlvbiBub3JtYWxpemVRdWFydGVyKHE6IG51bWJlciB8IHN0cmluZykge1xuICBpZiAoaXNOdW1iZXIocSkpIHtcbiAgICBpZiAocSA+IDQpIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRUaW1lVW5pdCgncXVhcnRlcicsIHEpKTtcbiAgICB9XG4gICAgLy8gV2UgYWNjZXB0IDEtYmFzZWQgcXVhcnRlciwgc28gbmVlZCB0byByZWFkanVzdCB0byAwLWJhc2VkIHF1YXJ0ZXJcbiAgICByZXR1cm4gKHEgLSAxKSArICcnO1xuICB9IGVsc2Uge1xuICAgIC8vIEludmFsaWQgcXVhcnRlclxuICAgIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5pbnZhbGlkVGltZVVuaXQoJ3F1YXJ0ZXInLCBxKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTW9udGgobTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmIChpc051bWJlcihtKSkge1xuICAgIC8vIFdlIGFjY2VwdCAxLWJhc2VkIG1vbnRoLCBzbyBuZWVkIHRvIHJlYWRqdXN0IHRvIDAtYmFzZWQgbW9udGhcbiAgICByZXR1cm4gKG0gLSAxKSArICcnO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvd2VyTSA9IG0udG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtb250aEluZGV4ID0gTU9OVEhTLmluZGV4T2YobG93ZXJNKTtcbiAgICBpZiAobW9udGhJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb250aEluZGV4ICsgJyc7IC8vIDAgZm9yIGphbnVhcnksIC4uLlxuICAgIH1cbiAgICBjb25zdCBzaG9ydE0gPSBsb3dlck0uc3Vic3RyKDAsIDMpO1xuICAgIGNvbnN0IHNob3J0TW9udGhJbmRleCA9IFNIT1JUX01PTlRIUy5pbmRleE9mKHNob3J0TSk7XG4gICAgaWYgKHNob3J0TW9udGhJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBzaG9ydE1vbnRoSW5kZXggKyAnJztcbiAgICB9XG4gICAgLy8gSW52YWxpZCBtb250aFxuICAgIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5pbnZhbGlkVGltZVVuaXQoJ21vbnRoJywgbSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZURheShkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgaWYgKGlzTnVtYmVyKGQpKSB7XG4gICAgLy8gbW9kIHNvIHRoYXQgdGhpcyBjYW4gYmUgYm90aCAwLWJhc2VkIHdoZXJlIDAgPSBzdW5kYXlcbiAgICAvLyBhbmQgMS1iYXNlZCB3aGVyZSA3PXN1bmRheVxuICAgIHJldHVybiAoZCAlIDcpICsgJyc7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbG93ZXJEID0gZC50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGRheUluZGV4ID0gREFZUy5pbmRleE9mKGxvd2VyRCk7XG4gICAgaWYgKGRheUluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGRheUluZGV4ICsgJyc7IC8vIDAgZm9yIGphbnVhcnksIC4uLlxuICAgIH1cbiAgICBjb25zdCBzaG9ydEQgPSBsb3dlckQuc3Vic3RyKDAsIDMpO1xuICAgIGNvbnN0IHNob3J0RGF5SW5kZXggPSBTSE9SVF9EQVlTLmluZGV4T2Yoc2hvcnREKTtcbiAgICBpZiAoc2hvcnREYXlJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBzaG9ydERheUluZGV4ICsgJyc7XG4gICAgfVxuICAgIC8vIEludmFsaWQgZGF5XG4gICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLmludmFsaWRUaW1lVW5pdCgnZGF5JywgZCkpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIFZlZ2EgRXhwcmVzc2lvbiBmb3IgYSBwYXJ0aWN1bGFyIGRhdGUgdGltZS5cbiAqIEBwYXJhbSBkXG4gKiBAcGFyYW0gbm9ybWFsaXplIHdoZXRoZXIgdG8gbm9ybWFsaXplIHF1YXJ0ZXIsIG1vbnRoLCBkYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRlVGltZUV4cHIoZDogRGF0ZVRpbWUgfCBEYXRlVGltZUV4cHIsIG5vcm1hbGl6ZSA9IGZhbHNlKSB7XG4gIGNvbnN0IHVuaXRzOiAoc3RyaW5nIHwgbnVtYmVyKVtdID0gW107XG5cbiAgaWYgKG5vcm1hbGl6ZSAmJiBkLmRheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGtleXMoZCkubGVuZ3RoID4gMSkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZHJvcHBlZERheShkKSk7XG4gICAgICBkID0gZHVwbGljYXRlKGQpO1xuICAgICAgZGVsZXRlIGQuZGF5O1xuICAgIH1cbiAgfVxuXG4gIGlmIChkLnllYXIgIT09IHVuZGVmaW5lZCkge1xuICAgIHVuaXRzLnB1c2goZC55ZWFyKTtcbiAgfSBlbHNlIGlmIChkLmRheSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gU2V0IHllYXIgdG8gMjAwNiBmb3Igd29ya2luZyB3aXRoIGRheSBzaW5jZSBKYW51YXJ5IDEgMjAwNiBpcyBhIFN1bmRheVxuICAgIHVuaXRzLnB1c2goU1VOREFZX1lFQVIpO1xuICB9IGVsc2Uge1xuICAgIHVuaXRzLnB1c2goMCk7XG4gIH1cblxuICBpZiAoZC5tb250aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbW9udGggPSBub3JtYWxpemUgPyBub3JtYWxpemVNb250aChkLm1vbnRoKSA6IGQubW9udGg7XG4gICAgdW5pdHMucHVzaChtb250aCk7XG4gIH0gZWxzZSBpZiAoZC5xdWFydGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBxdWFydGVyID0gbm9ybWFsaXplID8gbm9ybWFsaXplUXVhcnRlcihkLnF1YXJ0ZXIpIDogZC5xdWFydGVyO1xuICAgIHVuaXRzLnB1c2gocXVhcnRlciArICcqMycpO1xuICB9IGVsc2Uge1xuICAgIHVuaXRzLnB1c2goMCk7IC8vIG1vbnRocyBzdGFydCBhdCB6ZXJvIGluIEpTXG4gIH1cblxuICBpZiAoZC5kYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICB1bml0cy5wdXNoKGQuZGF0ZSk7XG4gIH0gZWxzZSBpZiAoZC5kYXkgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIEhBQ0s6IERheSBvbmx5IHdvcmtzIGFzIGEgc3RhbmRhbG9uZSB1bml0XG4gICAgLy8gVGhpcyBpcyBvbmx5IGNvcnJlY3QgYmVjYXVzZSB3ZSBhbHdheXMgc2V0IHllYXIgdG8gMjAwNiBmb3IgZGF5XG4gICAgY29uc3QgZGF5ID0gbm9ybWFsaXplID8gbm9ybWFsaXplRGF5KGQuZGF5KSA6IGQuZGF5O1xuICAgIHVuaXRzLnB1c2goZGF5ICsgJysxJyk7XG4gIH0gZWxzZSB7XG4gICAgdW5pdHMucHVzaCgxKTsgLy8gRGF0ZSBzdGFydHMgYXQgMSBpbiBKU1xuICB9XG5cbiAgLy8gTm90ZTogY2FuJ3QgdXNlIFRpbWVVbml0IGVudW0gaGVyZSBhcyBpbXBvcnRpbmcgaXQgd2lsbCBjcmVhdGVcbiAgLy8gY2lyY3VsYXIgZGVwZW5kZW5jeSBwcm9ibGVtIVxuICBmb3IgKGNvbnN0IHRpbWVVbml0IG9mIFsnaG91cnMnLCAnbWludXRlcycsICdzZWNvbmRzJywgJ21pbGxpc2Vjb25kcyddKSB7XG4gICAgaWYgKGRbdGltZVVuaXRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVuaXRzLnB1c2goZFt0aW1lVW5pdF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB1bml0cy5wdXNoKDApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkLnV0Yykge1xuICAgIHJldHVybiBgdXRjKCR7dW5pdHMuam9pbignLCAnKX0pYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYGRhdGV0aW1lKCR7dW5pdHMuam9pbignLCAnKX0pYDtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/encoding.d.ts b/build/src/encoding.d.ts new file mode 100644 index 0000000000..50f5c4d41f --- /dev/null +++ b/build/src/encoding.d.ts @@ -0,0 +1,128 @@ +import { Channel } from './channel'; +import { FacetMapping } from './facet'; +import { Field, FieldDef, FieldDefWithCondition, MarkPropFieldDef, OrderFieldDef, PositionFieldDef, TextFieldDef, ValueDef, ValueDefWithCondition } from './fielddef'; +import { Mark } from './mark'; +export interface Encoding { + /** + * X coordinates of the marks, or width of horizontal `"bar"` and `"area"`. + */ + x?: PositionFieldDef | ValueDef; + /** + * Y coordinates of the marks, or height of vertical `"bar"` and `"area"`. + */ + y?: PositionFieldDef | ValueDef; + /** + * X2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`. + */ + x2?: FieldDef | ValueDef; + /** + * Y2 coordinates for ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`. + */ + y2?: FieldDef | ValueDef; + /** + * Longitude position of geographically projected marks. + */ + longitude?: FieldDef; + /** + * Latitude position of geographically projected marks. + */ + latitude?: FieldDef; + /** + * Longitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`. + */ + longitude2?: FieldDef; + /** + * Latitude-2 position for geographically projected ranged `"area"`, `"bar"`, `"rect"`, and `"rule"`. + */ + latitude2?: FieldDef; + /** + * Color of the marks – either fill or stroke color based on the `filled` property of mark definition. + * By default, `color` represents fill color for `"area"`, `"bar"`, `"tick"`, + * `"text"`, `"trail"`, `"circle"`, and `"square"` / stroke color for `"line"` and `"point"`. + * + * __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark)'s `color` property. + * + * _Note:_ + * 1) For fine-grained control over both fill and stroke colors of the marks, please use the `fill` and `stroke` channels. If either `fill` or `stroke` channel is specified, `color` channel will be ignored. + * 2) See the scale documentation for more information about customizing [color scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme). + */ + color?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Fill color of the marks. + * __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark)'s `color` property. + * + * _Note:_ When using `fill` channel, `color ` channel will be ignored. To customize both fill and stroke, please use `fill` and `stroke` channels (not `fill` and `color`). + */ + fill?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Stroke color of the marks. + * __Default value:__ If undefined, the default color depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark)'s `color` property. + * + * _Note:_ When using `stroke` channel, `color ` channel will be ignored. To customize both stroke and fill, please use `stroke` and `fill` channels (not `stroke` and `color`). + */ + stroke?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Opacity of the marks – either can be a value or a range. + * + * __Default value:__ If undefined, the default opacity depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#mark)'s `opacity` property. + */ + opacity?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Size of the mark. + * - For `"point"`, `"square"` and `"circle"`, – the symbol size, or pixel area of the mark. + * - For `"bar"` and `"tick"` – the bar and tick's size. + * - For `"text"` – the text's font size. + * - Size is unsupported for `"line"`, `"area"`, and `"rect"`. (Use `"trail"` instead of line with varying size) + */ + size?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * For `point` marks the supported values are + * `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, + * or `"triangle-down"`, or else a custom SVG path string. + * For `geoshape` marks it should be a field definition of the geojson data + * + * __Default value:__ If undefined, the default shape depends on [mark config](https://vega.github.io/vega-lite/docs/config.html#point-config)'s `shape` property. + */ + shape?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Additional levels of detail for grouping data in aggregate views and + * in line, trail, and area marks without mapping data to a specific visual channel. + */ + detail?: FieldDef | FieldDef[]; + /** + * A data field to use as a unique key for data binding. When a visualization’s data is updated, the key value will be used to match data elements to existing mark instances. Use a key channel to enable object constancy for transitions over dynamic data. + */ + key?: FieldDef; + /** + * Text of the `text` mark. + */ + text?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * The tooltip text to show upon mouse hover. + */ + tooltip?: FieldDefWithCondition> | ValueDefWithCondition> | TextFieldDef[]; + /** + * A URL to load upon mouse click. + */ + href?: FieldDefWithCondition> | ValueDefWithCondition>; + /** + * Order of the marks. + * - For stacked marks, this `order` channel encodes [stack order](https://vega.github.io/vega-lite/docs/stack.html#order). + * - For line and trail marks, this `order` channel encodes order of data points in the lines. This can be useful for creating [a connected scatterplot](https://vega.github.io/vega-lite/examples/connected_scatterplot.html). Setting `order` to `{"value": null}` makes the line marks use the original order in the data sources. + * - Otherwise, this `order` channel encodes layer order of the marks. + * + * __Note__: In aggregate plots, `order` field should be `aggregate`d to avoid creating additional aggregation grouping. + */ + order?: OrderFieldDef | OrderFieldDef[] | ValueDef; +} +export interface EncodingWithFacet extends Encoding, FacetMapping { +} +export declare function channelHasField(encoding: EncodingWithFacet, channel: Channel): boolean; +export declare function isAggregate(encoding: EncodingWithFacet): boolean; +export declare function normalizeEncoding(encoding: Encoding, mark: Mark): Encoding; +export declare function isRanged(encoding: EncodingWithFacet): boolean; +export declare function fieldDefs(encoding: EncodingWithFacet): FieldDef[]; +export declare function forEach(mapping: any, f: (fd: FieldDef, c: Channel) => void, thisArg?: any): void; +export declare function reduce(mapping: U, f: (acc: any, fd: FieldDef, c: Channel) => U, init: T, thisArg?: any): any; diff --git a/build/src/encoding.js b/build/src/encoding.js new file mode 100644 index 0000000000..9e4372c1ed --- /dev/null +++ b/build/src/encoding.js @@ -0,0 +1,163 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("./channel"); +var fielddef_1 = require("./fielddef"); +var log = tslib_1.__importStar(require("./log")); +var type_1 = require("./type"); +var util_1 = require("./util"); +function channelHasField(encoding, channel) { + var channelDef = encoding && encoding[channel]; + if (channelDef) { + if (vega_util_1.isArray(channelDef)) { + return util_1.some(channelDef, function (fieldDef) { return !!fieldDef.field; }); + } + else { + return fielddef_1.isFieldDef(channelDef) || fielddef_1.hasConditionalFieldDef(channelDef); + } + } + return false; +} +exports.channelHasField = channelHasField; +function isAggregate(encoding) { + return util_1.some(channel_1.CHANNELS, function (channel) { + if (channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + if (vega_util_1.isArray(channelDef)) { + return util_1.some(channelDef, function (fieldDef) { return !!fieldDef.aggregate; }); + } + else { + var fieldDef = fielddef_1.getFieldDef(channelDef); + return fieldDef && !!fieldDef.aggregate; + } + } + return false; + }); +} +exports.isAggregate = isAggregate; +function normalizeEncoding(encoding, mark) { + return util_1.keys(encoding).reduce(function (normalizedEncoding, channel) { + var _a; + if (!channel_1.isChannel(channel)) { + // Drop invalid channel + log.warn(log.message.invalidEncodingChannel(channel)); + return normalizedEncoding; + } + if (!channel_1.supportMark(channel, mark)) { + // Drop unsupported channel + log.warn(log.message.incompatibleChannel(channel, mark)); + return normalizedEncoding; + } + // Drop line's size if the field is aggregated. + if (channel === 'size' && mark === 'line') { + var fieldDef = fielddef_1.getFieldDef(encoding[channel]); + if (fieldDef && fieldDef.aggregate) { + log.warn(log.message.LINE_WITH_VARYING_SIZE); + return normalizedEncoding; + } + } + // Drop color if either fill or stroke is specified + if (channel === 'color' && ('fill' in encoding || 'stroke' in encoding)) { + log.warn(log.message.droppingColor('encoding', { fill: 'fill' in encoding, stroke: 'stroke' in encoding })); + return normalizedEncoding; + } + var channelDef = encoding[channel]; + if (channel === 'detail' || + (channel === 'order' && !vega_util_1.isArray(channelDef) && !fielddef_1.isValueDef(channelDef)) || + (channel === 'tooltip' && vega_util_1.isArray(channelDef))) { + if (channelDef) { + // Array of fieldDefs for detail channel (or production rule) + normalizedEncoding[channel] = (vega_util_1.isArray(channelDef) ? channelDef : [channelDef]) + .reduce(function (defs, fieldDef) { + if (!fielddef_1.isFieldDef(fieldDef)) { + log.warn(log.message.emptyFieldDef(fieldDef, channel)); + } + else { + defs.push(fielddef_1.normalizeFieldDef(fieldDef, channel)); + } + return defs; + }, []); + } + } + else { + var fieldDef = fielddef_1.getFieldDef(encoding[channel]); + if (fieldDef && util_1.contains([type_1.Type.LATITUDE, type_1.Type.LONGITUDE], fieldDef.type)) { + var _b = channel, _ = normalizedEncoding[_b], newEncoding = tslib_1.__rest(normalizedEncoding, [typeof _b === "symbol" ? _b : _b + ""]); + var newChannel = channel === 'x' ? 'longitude' : + channel === 'y' ? 'latitude' : + channel === 'x2' ? 'longitude2' : + channel === 'y2' ? 'latitude2' : undefined; + log.warn(log.message.latLongDeprecated(channel, fieldDef.type, newChannel)); + return tslib_1.__assign({}, newEncoding, (_a = {}, _a[newChannel] = tslib_1.__assign({}, fielddef_1.normalize(fieldDef, channel), { type: 'quantitative' }), _a)); + } + if (!fielddef_1.isFieldDef(channelDef) && !fielddef_1.isValueDef(channelDef) && !fielddef_1.isConditionalDef(channelDef)) { + log.warn(log.message.emptyFieldDef(channelDef, channel)); + return normalizedEncoding; + } + normalizedEncoding[channel] = fielddef_1.normalize(channelDef, channel); + } + return normalizedEncoding; + }, {}); +} +exports.normalizeEncoding = normalizeEncoding; +function isRanged(encoding) { + return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2)); +} +exports.isRanged = isRanged; +function fieldDefs(encoding) { + var arr = []; + channel_1.CHANNELS.forEach(function (channel) { + if (channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + (vega_util_1.isArray(channelDef) ? channelDef : [channelDef]).forEach(function (def) { + if (fielddef_1.isFieldDef(def)) { + arr.push(def); + } + else if (fielddef_1.hasConditionalFieldDef(def)) { + arr.push(def.condition); + } + }); + } + }); + return arr; +} +exports.fieldDefs = fieldDefs; +function forEach(mapping, f, thisArg) { + if (!mapping) { + return; + } + var _loop_1 = function (channel) { + if (vega_util_1.isArray(mapping[channel])) { + mapping[channel].forEach(function (channelDef) { + f.call(thisArg, channelDef, channel); + }); + } + else { + f.call(thisArg, mapping[channel], channel); + } + }; + for (var _i = 0, _a = util_1.keys(mapping); _i < _a.length; _i++) { + var channel = _a[_i]; + _loop_1(channel); + } +} +exports.forEach = forEach; +function reduce(mapping, f, init, thisArg) { + if (!mapping) { + return init; + } + return util_1.keys(mapping).reduce(function (r, channel) { + var map = mapping[channel]; + if (vega_util_1.isArray(map)) { + return map.reduce(function (r1, channelDef) { + return f.call(thisArg, r1, channelDef, channel); + }, r); + } + else { + return f.call(thisArg, r, map, channel); + } + }, init); +} +exports.reduce = reduce; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUNBQWtDO0FBQ2xDLHFDQUFvRTtBQUVwRSx1Q0FrQm9CO0FBQ3BCLGlEQUE2QjtBQUU3QiwrQkFBNEI7QUFDNUIsK0JBQTRDO0FBOEk1Qyx5QkFBZ0MsUUFBa0MsRUFBRSxPQUFnQjtJQUNsRixJQUFNLFVBQVUsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELElBQUksVUFBVSxFQUFFO1FBQ2QsSUFBSSxtQkFBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sV0FBSSxDQUFDLFVBQVUsRUFBRSxVQUFDLFFBQVEsSUFBSyxPQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFoQixDQUFnQixDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNMLE9BQU8scUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBc0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNyRTtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBVkQsMENBVUM7QUFHRCxxQkFBNEIsUUFBa0M7SUFDNUQsT0FBTyxXQUFJLENBQUMsa0JBQVEsRUFBRSxVQUFDLE9BQU87UUFDNUIsSUFBSSxlQUFlLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3RDLElBQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQyxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3ZCLE9BQU8sV0FBSSxDQUFDLFVBQVUsRUFBRSxVQUFDLFFBQVEsSUFBSyxPQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFwQixDQUFvQixDQUFDLENBQUM7YUFDN0Q7aUJBQU07Z0JBQ0wsSUFBTSxRQUFRLEdBQUcsc0JBQVcsQ0FBQyxVQUFVLENBQUMs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LENBQUMsQ0FBQyxDQUFDO1NBQ1A7YUFBTTtZQUNMLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUN6QztJQUNILENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNYLENBQUM7QUFqQkQsd0JBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWwsIENIQU5ORUxTLCBpc0NoYW5uZWwsIHN1cHBvcnRNYXJrfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbERlZixcbiAgRmllbGQsXG4gIEZpZWxkRGVmLFxuICBGaWVsZERlZldpdGhDb25kaXRpb24sXG4gIGdldEZpZWxkRGVmLFxuICBoYXNDb25kaXRpb25hbEZpZWxkRGVmLFxuICBpc0NvbmRpdGlvbmFsRGVmLFxuICBpc0ZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBNYXJrUHJvcEZpZWxkRGVmLFxuICBub3JtYWxpemUsXG4gIG5vcm1hbGl6ZUZpZWxkRGVmLFxuICBPcmRlckZpZWxkRGVmLFxuICBQb3NpdGlvbkZpZWxkRGVmLFxuICBUZXh0RmllbGREZWYsXG4gIFZhbHVlRGVmLFxuICBWYWx1ZURlZldpdGhDb25kaXRpb25cbn0gZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtjb250YWlucywga2V5cywgc29tZX0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZzxGPiB7XG4gIC8qKlxuICAgKiBYIGNvb3JkaW5hdGVzIG9mIHRoZSBtYXJrcywgb3Igd2lkdGggb2YgaG9yaXpvbnRhbCBgXCJiYXJcImAgYW5kIGBcImFyZWFcImAuXG4gICAqL1xuICB4PzogUG9zaXRpb25GaWVsZERlZjxGPiB8IFZhbHVlRGVmO1xuXG4gIC8qKlxuICAgKiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBtYXJrcywgb3IgaGVpZ2h0IG9mIHZlcnRpY2FsIGBcImJhclwiYCBhbmQgYFwiYXJlYVwiYC5cbiAgICovXG4gIHk/OiBQb3NpdGlvbkZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cbiAgLyoqXG4gICAqIFgyIGNvb3JkaW5hdGVzIGZvciByYW5nZWQgYFwiYXJlYVwiYCwgYFwiYmFyXCJgLCBgXCJyZWN0XCJgLCBhbmQgIGBcInJ1bGVcImAuXG4gICAqL1xuICAvLyBUT0RPOiBIYW0gbmVlZCB0byBhZGQgZGVmYXVsdCBiZWhhdmlvclxuICB4Mj86IEZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cbiAgLyoqXG4gICAqIFkyIGNvb3JkaW5hdGVzIGZvciByYW5nZWQgYFwiYXJlYVwiYCwgYFwiYmFyXCJgLCBgXCJyZWN0XCJgLCBhbmQgIGBcInJ1bGVcImAuXG4gICAqL1xuICAvLyBUT0RPOiBIYW0gbmVlZCB0byBhZGQgZGVmYXVsdCBiZWhhdmlvclxuICB5Mj86IEZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cblxuICAvKipcbiAgICogTG9uZ2l0dWRlIHBvc2l0aW9uIG9mIGdlb2dyYXBoaWNhbGx5IHByb2plY3RlZCBtYXJrcy5cbiAgICovXG4gIGxvbmdpdHVkZT86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBMYXRpdHVkZSBwb3NpdGlvbiBvZiBnZW9ncmFwaGljYWxseSBwcm9qZWN0ZWQgbWFya3MuXG4gICAqL1xuICBsYXRpdHVkZT86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBMb25naXR1ZGUtMiBwb3NpdGlvbiBmb3IgZ2VvZ3JhcGhpY2FsbHkgcHJvamVjdGVkIHJhbmdlZCBgXCJhcmVhXCJgLCBgXCJiYXJcImAsIGBcInJlY3RcImAsIGFuZCAgYFwicnVsZVwiYC5cbiAgICovXG4gIGxvbmdpdHVkZTI/OiBGaWVsZERlZjxGPjtcblxuICAvKipcbiAgICogTGF0aXR1ZGUtMiBwb3NpdGlvbiBmb3IgZ2VvZ3JhcGhpY2FsbHkgcHJvamVjdGVkIHJhbmdlZCBgXCJhcmVhXCJgLCBgXCJiYXJcImAsIGBcInJlY3RcImAsIGFuZCAgYFwicnVsZVwiYC5cbiAgICovXG4gIGxhdGl0dWRlMj86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgbWFya3Mg4oCTIGVpdGhlciBmaWxsIG9yIHN0cm9rZSBjb2xvciBiYXNlZCBvbiAgdGhlIGBmaWxsZWRgIHByb3BlcnR5IG9mIG1hcmsgZGVmaW5pdGlvbi5cbiAgICogQnkgZGVmYXVsdCwgYGNvbG9yYCByZXByZXNlbnRzIGZpbGwgY29sb3IgZm9yIGBcImFyZWFcImAsIGBcImJhclwiYCwgYFwidGlja1wiYCxcbiAgICogYFwidGV4dFwiYCwgYFwidHJhaWxcImAsIGBcImNpcmNsZVwiYCwgYW5kIGBcInNxdWFyZVwiYCAvIHN0cm9rZSBjb2xvciBmb3IgYFwibGluZVwiYCBhbmQgYFwicG9pbnRcImAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IGNvbG9yIGRlcGVuZHMgb24gW21hcmsgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI21hcmspJ3MgYGNvbG9yYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogX05vdGU6X1xuICAgKiAxKSBGb3IgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMgb2YgdGhlIG1hcmtzLCBwbGVhc2UgdXNlIHRoZSBgZmlsbGAgYW5kIGBzdHJva2VgIGNoYW5uZWxzLiAgSWYgZWl0aGVyIGBmaWxsYCBvciBgc3Ryb2tlYCBjaGFubmVsIGlzIHNwZWNpZmllZCwgYGNvbG9yYCBjaGFubmVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICogMikgU2VlIHRoZSBzY2FsZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbWl6aW5nIFtjb2xvciBzY2hlbWVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzY2hlbWUpLlxuICAgKi9cbiAgY29sb3I/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIEZpbGwgY29sb3Igb2YgdGhlIG1hcmtzLlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gSWYgdW5kZWZpbmVkLCB0aGUgZGVmYXVsdCBjb2xvciBkZXBlbmRzIG9uIFttYXJrIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNtYXJrKSdzIGBjb2xvcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIF9Ob3RlOl8gV2hlbiB1c2luZyBgZmlsbGAgY2hhbm5lbCwgYGNvbG9yIGAgY2hhbm5lbCB3aWxsIGJlIGlnbm9yZWQuIFRvIGN1c3RvbWl6ZSBib3RoIGZpbGwgYW5kIHN0cm9rZSwgcGxlYXNlIHVzZSBgZmlsbGAgYW5kIGBzdHJva2VgIGNoYW5uZWxzIChub3QgYGZpbGxgIGFuZCBgY29sb3JgKS5cbiAgICovXG4gIGZpbGw/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cblxuICAvKipcbiAgICogU3Ryb2tlIGNvbG9yIG9mIHRoZSBtYXJrcy5cbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgdGhlIGRlZmF1bHQgY29sb3IgZGVwZW5kcyBvbiBbbWFyayBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwjbWFyaykncyBgY29sb3JgIHByb3BlcnR5LlxuICAgKlxuICAgKiBfTm90ZTpfIFdoZW4gdXNpbmcgYHN0cm9rZWAgY2hhbm5lbCwgYGNvbG9yIGAgY2hhbm5lbCB3aWxsIGJlIGlnbm9yZWQuIFRvIGN1c3RvbWl6ZSBib3RoIHN0cm9rZSBhbmQgZmlsbCwgcGxlYXNlIHVzZSBgc3Ryb2tlYCBhbmQgYGZpbGxgIGNoYW5uZWxzIChub3QgYHN0cm9rZWAgYW5kIGBjb2xvcmApLlxuICAgKi9cbiAgc3Ryb2tlPzogRmllbGREZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8Rj4+O1xuXG5cbiAgLyoqXG4gICAqIE9wYWNpdHkgb2YgdGhlIG1hcmtzIOKAkyBlaXRoZXIgY2FuIGJlIGEgdmFsdWUgb3IgYSByYW5nZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgdGhlIGRlZmF1bHQgb3BhY2l0eSBkZXBlbmRzIG9uIFttYXJrIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNtYXJrKSdzIGBvcGFjaXR5YCBwcm9wZXJ0eS5cbiAgICovXG4gIG9wYWNpdHk/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgdGhlIG1hcmsuXG4gICAqIC0gRm9yIGBcInBvaW50XCJgLCBgXCJzcXVhcmVcImAgYW5kIGBcImNpcmNsZVwiYCwg4oCTIHRoZSBzeW1ib2wgc2l6ZSwgb3IgcGl4ZWwgYXJlYSBvZiB0aGUgbWFyay5cbiAgICogLSBGb3IgYFwiYmFyXCJgIGFuZCBgXCJ0aWNrXCJgIOKAkyB0aGUgYmFyIGFuZCB0aWNrJ3Mgc2l6ZS5cbiAgICogLSBGb3IgYFwidGV4dFwiYCDigJMgdGhlIHRleHQncyBmb250IHNpemUuXG4gICAqIC0gU2l6ZSBpcyB1bnN1cHBvcnRlZCBmb3IgYFwibGluZVwiYCwgYFwiYXJlYVwiYCwgYW5kIGBcInJlY3RcImAuIChVc2UgYFwidHJhaWxcImAgaW5zdGVhZCBvZiBsaW5lIHdpdGggdmFyeWluZyBzaXplKVxuICAgKi9cbiAgc2l6ZT86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPEY+PiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPEY+PjtcblxuICAvKipcbiAgICogRm9yIGBwb2ludGAgbWFya3MgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlXG4gICAqIGBcImNpcmNsZVwiYCAoZGVmYXVsdCksIGBcInNxdWFyZVwiYCwgYFwiY3Jvc3NcImAsIGBcImRpYW1vbmRcImAsIGBcInRyaWFuZ2xlLXVwXCJgLFxuICAgKiBvciBgXCJ0cmlhbmdsZS1kb3duXCJgLCBvciBlbHNlIGEgY3VzdG9tIFNWRyBwYXRoIHN0cmluZy5cbiAgICogRm9yIGBnZW9zaGFwZWAgbWFya3MgaXQgc2hvdWxkIGJlIGEgZmllbGQgZGVmaW5pdGlvbiBvZiB0aGUgZ2VvanNvbiBkYXRhXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IHNoYXBlIGRlcGVuZHMgb24gW21hcmsgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI3BvaW50LWNvbmZpZykncyBgc2hhcGVgIHByb3BlcnR5LlxuICAgKi9cbiAgc2hhcGU/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47IC8vIFRPRE86IG1heWJlIGRpc3Rpbmd1aXNoIG9yZGluYWwtb25seVxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGxldmVscyBvZiBkZXRhaWwgZm9yIGdyb3VwaW5nIGRhdGEgaW4gYWdncmVnYXRlIHZpZXdzIGFuZFxuICAgKiBpbiBsaW5lLCB0cmFpbCwgYW5kIGFyZWEgbWFya3Mgd2l0aG91dCBtYXBwaW5nIGRhdGEgdG8gYSBzcGVjaWZpYyB2aXN1YWwgY2hhbm5lbC5cbiAgICovXG4gIGRldGFpbD86IEZpZWxkRGVmPEY+IHwgRmllbGREZWY8Rj5bXTtcblxuICAvKipcbiAgICogQSBkYXRhIGZpZWxkIHRvIHVzZSBhcyBhIHVuaXF1ZSBrZXkgZm9yIGRhdGEgYmluZGluZy4gV2hlbiBhIHZpc3VhbGl6YXRpb27igJlzIGRhdGEgaXMgdXBkYXRlZCwgdGhlIGtleSB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggZGF0YSBlbGVtZW50cyB0byBleGlzdGluZyBtYXJrIGluc3RhbmNlcy4gVXNlIGEga2V5IGNoYW5uZWwgdG8gZW5hYmxlIG9iamVjdCBjb25zdGFuY3kgZm9yIHRyYW5zaXRpb25zIG92ZXIgZHluYW1pYyBkYXRhLlxuICAgKi9cbiAga2V5PzogRmllbGREZWY8Rj47XG5cbiAgLyoqXG4gICAqIFRleHQgb2YgdGhlIGB0ZXh0YCBtYXJrLlxuICAgKi9cbiAgdGV4dD86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxUZXh0RmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPFRleHRGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sdGlwIHRleHQgdG8gc2hvdyB1cG9uIG1vdXNlIGhvdmVyLlxuICAgKi9cbiAgdG9vbHRpcD86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxUZXh0RmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPFRleHRGaWVsZERlZjxGPj4gfCBUZXh0RmllbGREZWY8Rj5bXTtcblxuICAvKipcbiAgICogQSBVUkwgdG8gbG9hZCB1cG9uIG1vdXNlIGNsaWNrLlxuICAgKi9cbiAgaHJlZj86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248RmllbGREZWY8Rj4+O1xuXG4gIC8qKlxuICAgKiBPcmRlciBvZiB0aGUgbWFya3MuXG4gICAqIC0gRm9yIHN0YWNrZWQgbWFya3MsIHRoaXMgYG9yZGVyYCBjaGFubmVsIGVuY29kZXMgW3N0YWNrIG9yZGVyXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3N0YWNrLmh0bWwjb3JkZXIpLlxuICAgKiAtIEZvciBsaW5lIGFuZCB0cmFpbCBtYXJrcywgdGhpcyBgb3JkZXJgIGNoYW5uZWwgZW5jb2RlcyBvcmRlciBvZiBkYXRhIHBvaW50cyBpbiB0aGUgbGluZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgW2EgY29ubmVjdGVkIHNjYXR0ZXJwbG90XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9leGFtcGxlcy9jb25uZWN0ZWRfc2NhdHRlcnBsb3QuaHRtbCkuICBTZXR0aW5nIGBvcmRlcmAgdG8gYHtcInZhbHVlXCI6IG51bGx9YCBtYWtlcyB0aGUgbGluZSBtYXJrcyB1c2UgdGhlIG9yaWdpbmFsIG9yZGVyIGluIHRoZSBkYXRhIHNvdXJjZXMuXG4gICAqIC0gT3RoZXJ3aXNlLCB0aGlzIGBvcmRlcmAgY2hhbm5lbCBlbmNvZGVzIGxheWVyIG9yZGVyIG9mIHRoZSBtYXJrcy5cbiAgICpcbiAgICogX19Ob3RlX186IEluIGFnZ3JlZ2F0ZSBwbG90cywgYG9yZGVyYCBmaWVsZCBzaG91bGQgYmUgYGFnZ3JlZ2F0ZWBkIHRvIGF2b2lkIGNyZWF0aW5nIGFkZGl0aW9uYWwgYWdncmVnYXRpb24gZ3JvdXBpbmcuXG4gICAqL1xuICBvcmRlcj86IE9yZGVyRmllbGREZWY8Rj4gfCBPcmRlckZpZWxkRGVmPEY+W10gfCBWYWx1ZURlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZ1dpdGhGYWNldDxGPiBleHRlbmRzIEVuY29kaW5nPEY+LCBGYWNldE1hcHBpbmc8Rj4ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5uZWxIYXNGaWVsZChlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8RmllbGQ+LCBjaGFubmVsOiBDaGFubmVsKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZyAmJiBlbmNvZGluZ1tjaGFubmVsXTtcbiAgaWYgKGNoYW5uZWxEZWYpIHtcbiAgICBpZiAoaXNBcnJheShjaGFubmVsRGVmKSkge1xuICAgICAgcmV0dXJuIHNvbWUoY2hhbm5lbERlZiwgKGZpZWxkRGVmKSA9PiAhIWZpZWxkRGVmLmZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzRmllbGREZWYoY2hhbm5lbERlZikgfHwgaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FnZ3JlZ2F0ZShlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8RmllbGQ+KSB7XG4gIHJldHVybiBzb21lKENIQU5ORUxTLCAoY2hhbm5lbCkgPT4ge1xuICAgIGlmIChjaGFubmVsSGFzRmllbGQoZW5jb2RpbmcsIGNoYW5uZWwpKSB7XG4gICAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG4gICAgICBpZiAoaXNBcnJheShjaGFubmVsRGVmKSkge1xuICAgICAgICByZXR1cm4gc29tZShjaGFubmVsRGVmLCAoZmllbGREZWYpID0+ICEhZmllbGREZWYuYWdncmVnYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWYoY2hhbm5lbERlZik7XG4gICAgICAgIHJldHVybiBmaWVsZERlZiAmJiAhIWZpZWxkRGVmLmFnZ3JlZ2F0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+LCBtYXJrOiBNYXJrKTogRW5jb2Rpbmc8c3RyaW5nPiB7XG4gICByZXR1cm4ga2V5cyhlbmNvZGluZykucmVkdWNlKChub3JtYWxpemVkRW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4sIGNoYW5uZWw6IENoYW5uZWwgfCBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWlzQ2hhbm5lbChjaGFubmVsKSkge1xuICAgICAgLy8gRHJvcCBpbnZhbGlkIGNoYW5uZWxcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRFbmNvZGluZ0NoYW5uZWwoY2hhbm5lbCkpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRNYXJrKGNoYW5uZWwsIG1hcmspKSB7XG4gICAgICAvLyBEcm9wIHVuc3VwcG9ydGVkIGNoYW5uZWxcblxuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuaW5jb21wYXRpYmxlQ2hhbm5lbChjaGFubmVsLCBtYXJrKSk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgIH1cblxuICAgIC8vIERyb3AgbGluZSdzIHNpemUgaWYgdGhlIGZpZWxkIGlzIGFnZ3JlZ2F0ZWQuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdzaXplJyAmJiBtYXJrID09PSAnbGluZScpIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmdbY2hhbm5lbF0pO1xuICAgICAgaWYgKGZpZWxkRGVmICYmIGZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5MSU5FX1dJVEhfVkFSWUlOR19TSVpFKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcm9wIGNvbG9yIGlmIGVpdGhlciBmaWxsIG9yIHN0cm9rZSBpcyBzcGVjaWZpZWRcbiAgICAgaWYgKGNoYW5uZWwgPT09ICdjb2xvcicgJiYgKCdmaWxsJyBpbiBlbmNvZGluZyB8fCAnc3Ryb2tlJyBpbiBlbmNvZGluZykgKSB7XG4gICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcignZW5jb2RpbmcnLCB7ZmlsbDogJ2ZpbGwnIGluIGVuY29kaW5nLCBzdHJva2U6ICdzdHJva2UnIGluIGVuY29kaW5nfSkpO1xuICAgICAgIHJldHVybiBub3JtYWxpemVkRW5jb2Rpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgIGlmIChcbiAgICAgIGNoYW5uZWwgPT09ICdkZXRhaWwnIHx8XG4gICAgICAoY2hhbm5lbCA9PT0gJ29yZGVyJyAmJiAhaXNBcnJheShjaGFubmVsRGVmKSAmJiAhaXNWYWx1ZURlZihjaGFubmVsRGVmKSkgfHxcbiAgICAgIChjaGFubmVsID09PSAndG9vbHRpcCcgJiYgaXNBcnJheShjaGFubmVsRGVmKSlcbiAgICApIHtcbiAgICAgIGlmIChjaGFubmVsRGVmKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGZpZWxkRGVmcyBmb3IgZGV0YWlsIGNoYW5uZWwgKG9yIHByb2R1Y3Rpb24gcnVsZSlcbiAgICAgICAgbm9ybWFsaXplZEVuY29kaW5nW2NoYW5uZWxdID0gKGlzQXJyYXkoY2hhbm5lbERlZikgPyBjaGFubmVsRGVmIDogW2NoYW5uZWxEZWZdKVxuICAgICAgICAgIC5yZWR1Y2UoKGRlZnM6IEZpZWxkRGVmPHN0cmluZz5bXSwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICAgICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW1wdHlGaWVsZERlZihmaWVsZERlZiwgY2hhbm5lbCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVmcy5wdXNoKG5vcm1hbGl6ZUZpZWxkRGVmKGZpZWxkRGVmLCBjaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmcztcbiAgICAgICAgICB9LCBbXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgZmllbGREZWYgPSBnZXRGaWVsZERlZihlbmNvZGluZ1tjaGFubmVsXSk7XG4gICAgICBpZiAoZmllbGREZWYgJiYgY29udGFpbnMoW1R5cGUuTEFUSVRVREUsIFR5cGUuTE9OR0lUVURFXSwgZmllbGREZWYudHlwZSkpIHtcbiAgICAgICAgY29uc3Qge1tjaGFubmVsXTogXywgLi4ubmV3RW5jb2Rpbmd9ID0gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgICAgICBjb25zdCBuZXdDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3gnID8gJ2xvbmdpdHVkZScgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd5JyA/ICdsYXRpdHVkZScgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd4MicgPyAnbG9uZ2l0dWRlMicgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd5MicgPyAnbGF0aXR1ZGUyJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UubGF0TG9uZ0RlcHJlY2F0ZWQoY2hhbm5lbCwgZmllbGREZWYudHlwZSwgbmV3Q2hhbm5lbCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLm5ld0VuY29kaW5nLFxuICAgICAgICAgIFtuZXdDaGFubmVsXToge1xuICAgICAgICAgICAgLi4ubm9ybWFsaXplKGZpZWxkRGVmIGFzIGFueSwgY2hhbm5lbCksXG4gICAgICAgICAgICB0eXBlOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpICYmICFpc1ZhbHVlRGVmKGNoYW5uZWxEZWYpICYmICFpc0NvbmRpdGlvbmFsRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmVtcHR5RmllbGREZWYoY2hhbm5lbERlZiwgY2hhbm5lbCkpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZEVuY29kaW5nW2NoYW5uZWxdID0gbm9ybWFsaXplKGNoYW5uZWxEZWYgYXMgQ2hhbm5lbERlZjxzdHJpbmc+LCBjaGFubmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgfSwge30pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JhbmdlZChlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8YW55Pikge1xuICByZXR1cm4gZW5jb2RpbmcgJiYgKCghIWVuY29kaW5nLnggJiYgISFlbmNvZGluZy54MikgfHwgKCEhZW5jb2RpbmcueSAmJiAhIWVuY29kaW5nLnkyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZERlZnMoZW5jb2Rpbmc6IEVuY29kaW5nV2l0aEZhY2V0PEZpZWxkPik6IEZpZWxkRGVmPEZpZWxkPltdIHtcbiAgY29uc3QgYXJyOiBGaWVsZERlZjxGaWVsZD5bXSA9IFtdO1xuICBDSEFOTkVMUy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5uZWwpIHtcbiAgICBpZiAoY2hhbm5lbEhhc0ZpZWxkKGVuY29kaW5nLCBjaGFubmVsKSkge1xuICAgICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgICAgKGlzQXJyYXkoY2hhbm5lbERlZikgPyBjaGFubmVsRGVmIDogW2NoYW5uZWxEZWZdKS5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgICAgaWYgKGlzRmllbGREZWYoZGVmKSkge1xuICAgICAgICAgIGFyci5wdXNoKGRlZik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihkZWYpKSB7XG4gICAgICAgICAgYXJyLnB1c2goZGVmLmNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKG1hcHBpbmc6IGFueSxcbiAgICBmOiAoZmQ6IEZpZWxkRGVmPHN0cmluZz4sIGM6IENoYW5uZWwpID0+IHZvaWQsXG4gICAgdGhpc0FyZz86IGFueSkge1xuICBpZiAoIW1hcHBpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYW5uZWwgb2Yga2V5cyhtYXBwaW5nKSkge1xuICAgIGlmIChpc0FycmF5KG1hcHBpbmdbY2hhbm5lbF0pKSB7XG4gICAgICBtYXBwaW5nW2NoYW5uZWxdLmZvckVhY2goZnVuY3Rpb24oY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+KSB7XG4gICAgICAgIGYuY2FsbCh0aGlzQXJnLCBjaGFubmVsRGVmLCBjaGFubmVsKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmLmNhbGwodGhpc0FyZywgbWFwcGluZ1tjaGFubmVsXSwgY2hhbm5lbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2U8VCwgVSBleHRlbmRzIHtbayBpbiBDaGFubmVsXT86IGFueX0+KG1hcHBpbmc6IFUsXG4gICAgZjogKGFjYzogYW55LCBmZDogRmllbGREZWY8c3RyaW5nPiwgYzogQ2hhbm5lbCkgPT4gVSxcbiAgICBpbml0OiBULCB0aGlzQXJnPzogYW55KSB7XG4gIGlmICghbWFwcGluZykge1xuICAgIHJldHVybiBpbml0O1xuICB9XG5cbiAgcmV0dXJuIGtleXMobWFwcGluZykucmVkdWNlKChyLCBjaGFubmVsKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbWFwcGluZ1tjaGFubmVsXTtcbiAgICBpZiAoaXNBcnJheShtYXApKSB7XG4gICAgICByZXR1cm4gbWFwLnJlZHVjZSgocjE6IFQsIGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8c3RyaW5nPikgPT4ge1xuICAgICAgICByZXR1cm4gZi5jYWxsKHRoaXNBcmcsIHIxLCBjaGFubmVsRGVmLCBjaGFubmVsKTtcbiAgICAgIH0sIHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZi5jYWxsKHRoaXNBcmcsIHIsIG1hcCwgY2hhbm5lbCk7XG4gICAgfVxuICB9LCBpbml0KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/facet.d.ts b/build/src/facet.d.ts new file mode 100644 index 0000000000..c16e8ce6e0 --- /dev/null +++ b/build/src/facet.d.ts @@ -0,0 +1,38 @@ +import { FieldDef } from './fielddef'; +import { Guide } from './guide'; +import { SortOrder } from './sort'; +/** + * Headers of row / column channels for faceted plots. + */ +export interface Header extends Guide { + /** + * The rotation angle of the header labels. + * + * __Default value:__ `0`. + * + * @minimum -360 + * @maximum 360 + */ + labelAngle?: number; +} +export interface FacetFieldDef extends FieldDef { + /** + * An object defining properties of a facet's header. + */ + header?: Header; + /** + * Sort order for a facet field. + * This can be `"ascending"`, `"descending"`. + */ + sort?: SortOrder; +} +export interface FacetMapping { + /** + * Vertical facets for trellis plots. + */ + row?: FacetFieldDef; + /** + * Horizontal facets for trellis plots. + */ + column?: FacetFieldDef; +} diff --git a/build/src/facet.js b/build/src/facet.js new file mode 100644 index 0000000000..bc4373f4dc --- /dev/null +++ b/build/src/facet.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFjZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0IHtHdWlkZX0gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge1NvcnRPcmRlcn0gZnJvbSAnLi9zb3J0JztcblxuXG4vKipcbiAqIEhlYWRlcnMgb2Ygcm93IC8gY29sdW1uIGNoYW5uZWxzIGZvciBmYWNldGVkIHBsb3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWRlciBleHRlbmRzIEd1aWRlIHtcbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgaGVhZGVyIGxhYmVscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAwYC5cbiAgICpcbiAgICogQG1pbmltdW0gLTM2MFxuICAgKiBAbWF4aW11bSAzNjBcbiAgICovXG4gIGxhYmVsQW5nbGU/OiBudW1iZXI7XG5cbiAgLy8gVE9ETzogbGFiZWxQYWRkaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZXRGaWVsZERlZjxGPiBleHRlbmRzIEZpZWxkRGVmPEY+IHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIGEgZmFjZXQncyBoZWFkZXIuXG4gICAqL1xuICBoZWFkZXI/OiBIZWFkZXI7XG5cbiAgLyoqXG4gICAqIFNvcnQgb3JkZXIgZm9yIGEgZmFjZXQgZmllbGQuXG4gICAqIFRoaXMgY2FuIGJlIGBcImFzY2VuZGluZ1wiYCwgYFwiZGVzY2VuZGluZ1wiYC5cbiAgICovXG4gIHNvcnQ/OiBTb3J0T3JkZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmFjZXRNYXBwaW5nPEY+IHtcblxuICAvKipcbiAgICogVmVydGljYWwgZmFjZXRzIGZvciB0cmVsbGlzIHBsb3RzLlxuICAgKi9cbiAgcm93PzogRmFjZXRGaWVsZERlZjxGPjtcblxuICAvKipcbiAgICogSG9yaXpvbnRhbCBmYWNldHMgZm9yIHRyZWxsaXMgcGxvdHMuXG4gICAqL1xuICBjb2x1bW4/OiBGYWNldEZpZWxkRGVmPEY+O1xufVxuIl19 \ No newline at end of file diff --git a/build/src/fielddef.d.ts b/build/src/fielddef.d.ts new file mode 100644 index 0000000000..eea9b48686 --- /dev/null +++ b/build/src/fielddef.d.ts @@ -0,0 +1,257 @@ +import { AggregateOp } from 'vega'; +import { Axis } from './axis'; +import { BinParams } from './bin'; +import { Channel } from './channel'; +import { CompositeAggregate } from './compositemark'; +import { Config } from './config'; +import { TitleMixins } from './guide'; +import { Legend } from './legend'; +import { LogicalOperand } from './logical'; +import { Predicate } from './predicate'; +import { Scale } from './scale'; +import { EncodingSortField, SortOrder } from './sort'; +import { StackOffset } from './stack'; +import { TimeUnit } from './timeunit'; +import { AggregatedFieldDef, WindowFieldDef } from './transform'; +import { Type } from './type'; +/** + * Definition object for a constant value of an encoding channel. + */ +export interface ValueDef { + /** + * A constant value in visual domain (e.g., `"red"` / "#0099ff" for color, values between `0` to `1` for opacity). + */ + value: number | string | boolean; +} +/** + * Generic type for conditional channelDef. + * F defines the underlying FieldDef type. + */ +export declare type ChannelDefWithCondition> = FieldDefWithCondition | ValueDefWithCondition; +export declare type Conditional = ConditionalPredicate | ConditionalSelection; +export declare type ConditionalPredicate = { + test: LogicalOperand; +} & T; +export declare type ConditionalSelection = { + /** + * A [selection name](https://vega.github.io/vega-lite/docs/selection.html), or a series of [composed selections](https://vega.github.io/vega-lite/docs/selection.html#compose). + */ + selection: LogicalOperand; +} & T; +export declare function isConditionalSelection(c: Conditional): c is ConditionalSelection; +export interface ConditionValueDefMixins { + /** + * One or more value definition(s) with a selection predicate. + * + * __Note:__ A field definition's `condition` property can only contain [value definitions](https://vega.github.io/vega-lite/docs/encoding.html#value-def) + * since Vega-Lite only allows at most one encoded field per encoding channel. + */ + condition?: Conditional | Conditional[]; +} +/** + * A FieldDef with Condition + * { + * condition: {value: ...}, + * field: ..., + * ... + * } + */ +export declare type FieldDefWithCondition> = F & ConditionValueDefMixins; +/** + * A ValueDef with Condition + * { + * condition: {field: ...} | {value: ...}, + * value: ..., + * } + */ +export interface ValueDefWithCondition> { + /** + * A field definition or one or more value definition(s) with a selection predicate. + */ + condition?: Conditional | Conditional | Conditional[]; + /** + * A constant value in visual domain. + */ + value?: number | string | boolean; +} +/** + * Reference to a repeated value. + */ +export declare type RepeatRef = { + repeat: 'row' | 'column'; +}; +export declare type Field = string | RepeatRef; +export declare function isRepeatRef(field: Field): field is RepeatRef; +/** @hide */ +export declare type HiddenCompositeAggregate = CompositeAggregate; +export declare type Aggregate = AggregateOp | HiddenCompositeAggregate; +export interface FieldDefBase { + /** + * __Required.__ A string defining the name of the field from which to pull a data value + * or an object defining iterated values from the [`repeat`](https://vega.github.io/vega-lite/docs/repeat.html) operator. + * + * __Note:__ Dots (`.`) and brackets (`[` and `]`) can be used to access nested objects (e.g., `"field": "foo.bar"` and `"field": "foo['bar']"`). + * If field names contain dots or brackets but are not nested, you can use `\\` to escape dots and brackets (e.g., `"a\\.b"` and `"a\\[0\\]"`). + * See more details about escaping in the [field documentation](https://vega.github.io/vega-lite/docs/field.html). + * + * __Note:__ `field` is not required if `aggregate` is `count`. + */ + field?: F; + /** + * Time unit (e.g., `year`, `yearmonth`, `month`, `hours`) for a temporal field. + * or [a temporal field that gets casted as ordinal](https://vega.github.io/vega-lite/docs/type.html#cast). + * + * __Default value:__ `undefined` (None) + */ + timeUnit?: TimeUnit; + /** + * A flag for binning a `quantitative` field, or [an object defining binning parameters](https://vega.github.io/vega-lite/docs/bin.html#params). + * If `true`, default [binning parameters](https://vega.github.io/vega-lite/docs/bin.html) will be applied. + * + * __Default value:__ `false` + */ + bin?: boolean | BinParams; + /** + * Aggregation function for the field + * (e.g., `mean`, `sum`, `median`, `min`, `max`, `count`). + * + * __Default value:__ `undefined` (None) + */ + aggregate?: Aggregate; +} +export declare function toFieldDefBase(fieldDef: FieldDef): FieldDefBase; +/** + * Definition object for a data field, its type and transformation of an encoding channel. + */ +export interface FieldDef extends FieldDefBase, TitleMixins { + /** + * The encoded field's type of measurement (`"quantitative"`, `"temporal"`, `"ordinal"`, or `"nominal"`). + * It can also be a `"geojson"` type for encoding ['geoshape'](https://vega.github.io/vega-lite/docs/geoshape.html). + */ + type: Type; +} +export interface ScaleFieldDef extends FieldDef { + /** + * An object defining properties of the channel's scale, which is the function that transforms values in the data domain (numbers, dates, strings, etc) to visual values (pixels, colors, sizes) of the encoding channels. + * + * If `null`, the scale will be [disabled and the data value will be directly encoded](https://vega.github.io/vega-lite/docs/scale.html#disable). + * + * __Default value:__ If undefined, default [scale properties](https://vega.github.io/vega-lite/docs/scale.html) are applied. + */ + scale?: Scale | null; + /** + * Sort order for the encoded field. + * Supported `sort` values include `"ascending"`, `"descending"`, `null` (no sorting), or an array specifying the preferred order of values. + * For fields with discrete domains, `sort` can also be a [sort field definition object](https://vega.github.io/vega-lite/docs/sort.html#sort-field). + * For `sort` as an [array specifying the preferred order of values](https://vega.github.io/vega-lite/docs/sort.html#sort-array), the sort order will obey the values in the array, followed by any unspecified values in their original order. + * + * __Default value:__ `"ascending"` + */ + sort?: string[] | SortOrder | EncodingSortField | null; +} +export interface PositionFieldDef extends ScaleFieldDef { + /** + * An object defining properties of axis's gridlines, ticks and labels. + * If `null`, the axis for the encoding channel will be removed. + * + * __Default value:__ If undefined, default [axis properties](https://vega.github.io/vega-lite/docs/axis.html) are applied. + */ + axis?: Axis | null; + /** + * Type of stacking offset if the field should be stacked. + * `stack` is only applicable for `x` and `y` channels with continuous domains. + * For example, `stack` of `y` can be used to customize stacking for a vertical bar chart. + * + * `stack` can be one of the following values: + * - `"zero"`: stacking with baseline offset at zero value of the scale (for creating typical stacked [bar](https://vega.github.io/vega-lite/docs/stack.html#bar) and [area](https://vega.github.io/vega-lite/docs/stack.html#area) chart). + * - `"normalize"` - stacking with normalized domain (for creating [normalized stacked bar and area charts](https://vega.github.io/vega-lite/docs/stack.html#normalized).
+ * -`"center"` - stacking with center baseline (for [streamgraph](https://vega.github.io/vega-lite/docs/stack.html#streamgraph)). + * - `null` - No-stacking. This will produce layered [bar](https://vega.github.io/vega-lite/docs/stack.html#layered-bar-chart) and area chart. + * + * __Default value:__ `zero` for plots with all of the following conditions are true: + * (1) the mark is `bar` or `area`; + * (2) the stacked measure channel (x or y) has a linear scale; + * (3) At least one of non-position channels mapped to an unaggregated field that is different from x and y. Otherwise, `null` by default. + */ + stack?: StackOffset | null; +} +/** + * Field definition of a mark property, which can contain a legend. + */ +export interface MarkPropFieldDef extends ScaleFieldDef { + /** + * An object defining properties of the legend. + * If `null`, the legend for the encoding channel will be removed. + * + * __Default value:__ If undefined, default [legend properties](https://vega.github.io/vega-lite/docs/legend.html) are applied. + */ + legend?: Legend | null; +} +export interface OrderFieldDef extends FieldDef { + /** + * The sort order. One of `"ascending"` (default) or `"descending"`. + */ + sort?: SortOrder; +} +export interface TextFieldDef extends FieldDef { + /** + * The [formatting pattern](https://vega.github.io/vega-lite/docs/format.html) for a text field. If not defined, this will be determined automatically. + */ + format?: string; +} +export declare type ChannelDef = ChannelDefWithCondition>; +export declare function isConditionalDef(channelDef: ChannelDef): channelDef is ChannelDefWithCondition>; +/** + * Return if a channelDef is a ConditionalValueDef with ConditionFieldDef + */ +export declare function hasConditionalFieldDef(channelDef: ChannelDef): channelDef is (ValueDef & { + condition: Conditional>; +}); +export declare function hasConditionalValueDef(channelDef: ChannelDef): channelDef is (ValueDef & { + condition: Conditional | Conditional[]; +}); +export declare function isFieldDef(channelDef: ChannelDef): channelDef is FieldDef | PositionFieldDef | ScaleFieldDef | MarkPropFieldDef | OrderFieldDef | TextFieldDef; +export declare function isStringFieldDef(fieldDef: ChannelDef): fieldDef is FieldDef; +export declare function isValueDef(channelDef: ChannelDef): channelDef is ValueDef; +export declare function isScaleFieldDef(channelDef: ChannelDef): channelDef is ScaleFieldDef; +export interface FieldRefOption { + /** exclude bin, aggregate, timeUnit */ + nofn?: boolean; + /** Wrap the field with datum or parent (e.g., datum['...'] for Vega Expression */ + expr?: 'datum' | 'parent'; + /** prepend fn with custom function prefix */ + prefix?: string; + /** append suffix to the field ref for bin (default='start') */ + binSuffix?: 'end' | 'range' | 'mid'; + /** append suffix to the field ref (general) */ + suffix?: string; +} +export declare function vgField(fieldDef: FieldDefBase | WindowFieldDef | AggregatedFieldDef, opt?: FieldRefOption): string; +export declare function isDiscrete(fieldDef: FieldDef): boolean; +export declare function isContinuous(fieldDef: FieldDef): boolean; +export declare function isCount(fieldDef: FieldDefBase): boolean; +export declare type FieldTitleFormatter = (fieldDef: FieldDefBase, config: Config) => string; +export declare function verbalTitleFormatter(fieldDef: FieldDefBase, config: Config): string; +export declare function functionalTitleFormatter(fieldDef: FieldDefBase, config: Config): string; +export declare const defaultTitleFormatter: FieldTitleFormatter; +export declare function setTitleFormatter(formatter: FieldTitleFormatter): void; +export declare function resetTitleFormatter(): void; +export declare function title(fieldDef: FieldDefBase, config: Config): string; +export declare function defaultType(fieldDef: FieldDef, channel: Channel): Type; +/** + * Returns the fieldDef -- either from the outer channelDef or from the condition of channelDef. + * @param channelDef + */ +export declare function getFieldDef(channelDef: ChannelDef): FieldDef; +/** + * Convert type to full, lowercase type, or augment the fieldDef with a default type if missing. + */ +export declare function normalize(channelDef: ChannelDef, channel: Channel): ChannelDef; +export declare function normalizeFieldDef(fieldDef: FieldDef, channel: Channel): FieldDef; +export declare function normalizeBin(bin: BinParams | boolean, channel: Channel): BinParams; +export declare function channelCompatibility(fieldDef: FieldDef, channel: Channel): { + compatible: boolean; + warning?: string; +}; +export declare function isNumberFieldDef(fieldDef: FieldDef): boolean; +export declare function isTimeFieldDef(fieldDef: FieldDef): boolean; diff --git a/build/src/fielddef.js b/build/src/fielddef.js new file mode 100644 index 0000000000..24c9b7e916 --- /dev/null +++ b/build/src/fielddef.js @@ -0,0 +1,362 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var aggregate_1 = require("./aggregate"); +var bin_1 = require("./bin"); +var channel_1 = require("./channel"); +var log = tslib_1.__importStar(require("./log")); +var timeunit_1 = require("./timeunit"); +var type_1 = require("./type"); +var util_1 = require("./util"); +function isConditionalSelection(c) { + return c['selection']; +} +exports.isConditionalSelection = isConditionalSelection; +function isRepeatRef(field) { + return field && !vega_util_1.isString(field) && 'repeat' in field; +} +exports.isRepeatRef = isRepeatRef; +function toFieldDefBase(fieldDef) { + var field = fieldDef.field, timeUnit = fieldDef.timeUnit, bin = fieldDef.bin, aggregate = fieldDef.aggregate; + return tslib_1.__assign({}, (timeUnit ? { timeUnit: timeUnit } : {}), (bin ? { bin: bin } : {}), (aggregate ? { aggregate: aggregate } : {}), { field: field }); +} +exports.toFieldDefBase = toFieldDefBase; +function isConditionalDef(channelDef) { + return !!channelDef && !!channelDef.condition; +} +exports.isConditionalDef = isConditionalDef; +/** + * Return if a channelDef is a ConditionalValueDef with ConditionFieldDef + */ +function hasConditionalFieldDef(channelDef) { + return !!channelDef && !!channelDef.condition && !vega_util_1.isArray(channelDef.condition) && isFieldDef(channelDef.condition); +} +exports.hasConditionalFieldDef = hasConditionalFieldDef; +function hasConditionalValueDef(channelDef) { + return !!channelDef && !!channelDef.condition && (vega_util_1.isArray(channelDef.condition) || isValueDef(channelDef.condition)); +} +exports.hasConditionalValueDef = hasConditionalValueDef; +function isFieldDef(channelDef) { + return !!channelDef && (!!channelDef['field'] || channelDef['aggregate'] === 'count'); +} +exports.isFieldDef = isFieldDef; +function isStringFieldDef(fieldDef) { + return isFieldDef(fieldDef) && vega_util_1.isString(fieldDef.field); +} +exports.isStringFieldDef = isStringFieldDef; +function isValueDef(channelDef) { + return channelDef && 'value' in channelDef && channelDef['value'] !== undefined; +} +exports.isValueDef = isValueDef; +function isScaleFieldDef(channelDef) { + return !!channelDef && (!!channelDef['scale'] || !!channelDef['sort']); +} +exports.isScaleFieldDef = isScaleFieldDef; +function isOpFieldDef(fieldDef) { + return !!fieldDef['op']; +} +function vgField(fieldDef, opt) { + if (opt === void 0) { opt = {}; } + var field = fieldDef.field; + var prefix = opt.prefix; + var suffix = opt.suffix; + if (isCount(fieldDef)) { + field = 'count_*'; + } + else { + var fn = undefined; + if (!opt.nofn) { + if (isOpFieldDef(fieldDef)) { + fn = fieldDef.op; + } + else if (fieldDef.bin) { + fn = bin_1.binToString(fieldDef.bin); + suffix = opt.binSuffix || ''; + } + else if (fieldDef.aggregate) { + fn = String(fieldDef.aggregate); + } + else if (fieldDef.timeUnit) { + fn = String(fieldDef.timeUnit); + } + } + if (fn) { + field = field ? fn + "_" + field : fn; + } + } + if (suffix) { + field = field + "_" + suffix; + } + if (prefix) { + field = prefix + "_" + field; + } + if (opt.expr) { + // Expression to access flattened field. No need to escape dots. + return util_1.flatAccessWithDatum(field, opt.expr); + } + else { + // We flattened all fields so paths should have become dot. + return util_1.replacePathInField(field); + } +} +exports.vgField = vgField; +function isDiscrete(fieldDef) { + switch (fieldDef.type) { + case 'nominal': + case 'ordinal': + case 'geojson': + return true; + case 'quantitative': + return !!fieldDef.bin; + case 'latitude': + case 'longitude': + case 'temporal': + return false; + } + throw new Error(log.message.invalidFieldType(fieldDef.type)); +} +exports.isDiscrete = isDiscrete; +function isContinuous(fieldDef) { + return !isDiscrete(fieldDef); +} +exports.isContinuous = isContinuous; +function isCount(fieldDef) { + return fieldDef.aggregate === 'count'; +} +exports.isCount = isCount; +function verbalTitleFormatter(fieldDef, config) { + var field = fieldDef.field, bin = fieldDef.bin, timeUnit = fieldDef.timeUnit, aggregate = fieldDef.aggregate; + if (aggregate === 'count') { + return config.countTitle; + } + else if (bin) { + return field + " (binned)"; + } + else if (timeUnit) { + var units = timeunit_1.getTimeUnitParts(timeUnit).join('-'); + return field + " (" + units + ")"; + } + else if (aggregate) { + return util_1.titlecase(aggregate) + " of " + field; + } + return field; +} +exports.verbalTitleFormatter = verbalTitleFormatter; +function functionalTitleFormatter(fieldDef, config) { + var fn = fieldDef.aggregate || fieldDef.timeUnit || (fieldDef.bin && 'bin'); + if (fn) { + return fn.toUpperCase() + '(' + fieldDef.field + ')'; + } + else { + return fieldDef.field; + } +} +exports.functionalTitleFormatter = functionalTitleFormatter; +exports.defaultTitleFormatter = function (fieldDef, config) { + switch (config.fieldTitle) { + case 'plain': + return fieldDef.field; + case 'functional': + return functionalTitleFormatter(fieldDef, config); + default: + return verbalTitleFormatter(fieldDef, config); + } +}; +var titleFormatter = exports.defaultTitleFormatter; +function setTitleFormatter(formatter) { + titleFormatter = formatter; +} +exports.setTitleFormatter = setTitleFormatter; +function resetTitleFormatter() { + setTitleFormatter(exports.defaultTitleFormatter); +} +exports.resetTitleFormatter = resetTitleFormatter; +function title(fieldDef, config) { + return titleFormatter(fieldDef, config); +} +exports.title = title; +function defaultType(fieldDef, channel) { + if (fieldDef.timeUnit) { + return 'temporal'; + } + if (fieldDef.bin) { + return 'quantitative'; + } + switch (channel_1.rangeType(channel)) { + case 'continuous': + return 'quantitative'; + case 'discrete': + return 'nominal'; + case 'flexible': // color + return 'nominal'; + default: + return 'quantitative'; + } +} +exports.defaultType = defaultType; +/** + * Returns the fieldDef -- either from the outer channelDef or from the condition of channelDef. + * @param channelDef + */ +function getFieldDef(channelDef) { + if (isFieldDef(channelDef)) { + return channelDef; + } + else if (hasConditionalFieldDef(channelDef)) { + return channelDef.condition; + } + return undefined; +} +exports.getFieldDef = getFieldDef; +/** + * Convert type to full, lowercase type, or augment the fieldDef with a default type if missing. + */ +function normalize(channelDef, channel) { + if (vega_util_1.isString(channelDef) || vega_util_1.isNumber(channelDef) || vega_util_1.isBoolean(channelDef)) { + var primitiveType = vega_util_1.isString(channelDef) ? 'string' : + vega_util_1.isNumber(channelDef) ? 'number' : 'boolean'; + log.warn(log.message.primitiveChannelDef(channel, primitiveType, channelDef)); + return { value: channelDef }; + } + // If a fieldDef contains a field, we need type. + if (isFieldDef(channelDef)) { + return normalizeFieldDef(channelDef, channel); + } + else if (hasConditionalFieldDef(channelDef)) { + return tslib_1.__assign({}, channelDef, { + // Need to cast as normalizeFieldDef normally return FieldDef, but here we know that it is definitely Condition + condition: normalizeFieldDef(channelDef.condition, channel) }); + } + return channelDef; +} +exports.normalize = normalize; +function normalizeFieldDef(fieldDef, channel) { + // Drop invalid aggregate + if (fieldDef.aggregate && !aggregate_1.isAggregateOp(fieldDef.aggregate)) { + var aggregate = fieldDef.aggregate, fieldDefWithoutAggregate = tslib_1.__rest(fieldDef, ["aggregate"]); + log.warn(log.message.invalidAggregate(fieldDef.aggregate)); + fieldDef = fieldDefWithoutAggregate; + } + // Normalize Time Unit + if (fieldDef.timeUnit) { + fieldDef = tslib_1.__assign({}, fieldDef, { timeUnit: timeunit_1.normalizeTimeUnit(fieldDef.timeUnit) }); + } + // Normalize bin + if (fieldDef.bin) { + fieldDef = tslib_1.__assign({}, fieldDef, { bin: normalizeBin(fieldDef.bin, channel) }); + } + // Normalize Type + if (fieldDef.type) { + var fullType = type_1.getFullName(fieldDef.type); + if (fieldDef.type !== fullType) { + // convert short type to full type + fieldDef = tslib_1.__assign({}, fieldDef, { type: fullType }); + } + if (fieldDef.type !== 'quantitative') { + if (aggregate_1.isCountingAggregateOp(fieldDef.aggregate)) { + log.warn(log.message.invalidFieldTypeForCountAggregate(fieldDef.type, fieldDef.aggregate)); + fieldDef = tslib_1.__assign({}, fieldDef, { type: 'quantitative' }); + } + } + } + else { + // If type is empty / invalid, then augment with default type + var newType = defaultType(fieldDef, channel); + log.warn(log.message.emptyOrInvalidFieldType(fieldDef.type, channel, newType)); + fieldDef = tslib_1.__assign({}, fieldDef, { type: newType }); + } + var _a = channelCompatibility(fieldDef, channel), compatible = _a.compatible, warning = _a.warning; + if (!compatible) { + log.warn(warning); + } + return fieldDef; +} +exports.normalizeFieldDef = normalizeFieldDef; +function normalizeBin(bin, channel) { + if (vega_util_1.isBoolean(bin)) { + return { maxbins: bin_1.autoMaxBins(channel) }; + } + else if (!bin.maxbins && !bin.step) { + return tslib_1.__assign({}, bin, { maxbins: bin_1.autoMaxBins(channel) }); + } + else { + return bin; + } +} +exports.normalizeBin = normalizeBin; +var COMPATIBLE = { compatible: true }; +function channelCompatibility(fieldDef, channel) { + var type = fieldDef.type; + switch (channel) { + case 'row': + case 'column': + if (isContinuous(fieldDef)) { + return { + compatible: false, + warning: log.message.facetChannelShouldBeDiscrete(channel) + }; + } + return COMPATIBLE; + case 'x': + case 'y': + case 'color': + case 'fill': + case 'stroke': + case 'text': + case 'detail': + case 'key': + case 'tooltip': + case 'href': + return COMPATIBLE; + case 'longitude': + case 'longitude2': + case 'latitude': + case 'latitude2': + if (type !== type_1.QUANTITATIVE) { + return { + compatible: false, + warning: "Channel " + channel + " should be used with a quantitative field only, not " + fieldDef.type + " field." + }; + } + return COMPATIBLE; + case 'opacity': + case 'size': + case 'x2': + case 'y2': + if ((type === 'nominal' && !fieldDef['sort']) || type === 'geojson') { + return { + compatible: false, + warning: "Channel " + channel + " should not be used with an unsorted discrete field." + }; + } + return COMPATIBLE; + case 'shape': + if (fieldDef.type !== 'nominal' && fieldDef.type !== 'geojson') { + return { + compatible: false, + warning: 'Shape channel should be used with only either nominal or geojson data' + }; + } + return COMPATIBLE; + case 'order': + if (fieldDef.type === 'nominal') { + return { + compatible: false, + warning: "Channel order is inappropriate for nominal field, which has no inherent order." + }; + } + return COMPATIBLE; + } + throw new Error('channelCompatability not implemented for channel ' + channel); +} +exports.channelCompatibility = channelCompatibility; +function isNumberFieldDef(fieldDef) { + return fieldDef.type === 'quantitative' || !!fieldDef.bin; +} +exports.isNumberFieldDef = isNumberFieldDef; +function isTimeFieldDef(fieldDef) { + return fieldDef.type === 'temporal' || !!fieldDef.timeUnit; +} +exports.isTimeFieldDef = isTimeFieldDef; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRkZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmllbGRkZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsdUNBQWlFO0FBQ2pFLHlDQUFpRTtBQUVqRSw2QkFBMEQ7QUFDMUQscUNBQTZDO0FBSzdDLGlEQUE2QjtBQU03Qix1Q0FBeUU7QUFFekUsK0JBQXVEO0FBQ3ZELCtCQUEwRTtBQWdDMUUsZ0NBQTBDLENBQWlCO0lBQ3pELE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFGRCx3REFFQztBQW1ERCxxQkFBNEIsS0FBWTtJQUN0QyxPQUFPLEtBQUssSUFBSSxDQUFDLG9CQUFRLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQztBQUN4RCxDQUFDO0FBRkQsa0NBRUM7QUFnREQsd0JBQStCLFFBQTBCO0lBQ2hELElBQUEsc0JBQUssRUFBRSw0QkFBUSxFQUFFLGtCQUFHLEVBQUUsOEJBQVMsQ0FBYTtJQUNuRCw0QkFDSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxRQUFRLFVBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxLQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ2xCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFDLFNBQVMsV0FBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUNqQyxLQUFLLE9BQUEsSUFDTDtBQUNKLENBQUM7QUFSRCx3Q0FRQztBQWlHRCwwQkFBb0MsVUFBeUI7SUFDM0QsT0FBTyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDO0FBQ2hELENBQUM7QUFGRCw0Q0FFQztBQUVEOztHQUVHO0FBQ0gsZ0NBQTBDLFVBQXlCO0lBQ2pFLE9BQU8sQ0FB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LFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUMvQixPQUFPO29CQUNMLFVBQVUsRUFBRSxLQUFLO29CQUNqQixPQUFPLEVBQUUsZ0ZBQWdGO2lCQUMxRixDQUFDO2FBQ0g7WUFDRCxPQUFPLFVBQVUsQ0FBQztLQUNyQjtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELEdBQUcsT0FBTyxDQUFDLENBQUM7QUFDakYsQ0FBQztBQXJFRCxvREFxRUM7QUFFRCwwQkFBaUMsUUFBdUI7SUFDdEQsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztBQUM1RCxDQUFDO0FBRkQsNENBRUM7QUFFRCx3QkFBK0IsUUFBdUI7SUFDcEQsT0FBTyxRQUFRLENBQUMsSUFBSSxLQUFLLFVBQVUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztBQUM3RCxDQUFDO0FBRkQsd0NBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZWNsYXJhdGlvbiBhbmQgdXRpbGl0eSBmb3IgdmFyaWFudHMgb2YgYSBmaWVsZCBkZWZpbml0aW9uIG9iamVjdFxuaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge2lzQXJyYXksIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtpc0FnZ3JlZ2F0ZU9wLCBpc0NvdW50aW5nQWdncmVnYXRlT3B9IGZyb20gJy4vYWdncmVnYXRlJztcbmltcG9ydCB7QXhpc30gZnJvbSAnLi9heGlzJztcbmltcG9ydCB7YXV0b01heEJpbnMsIEJpblBhcmFtcywgYmluVG9TdHJpbmd9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2hhbm5lbCwgcmFuZ2VUeXBlfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtDb21wb3NpdGVBZ2dyZWdhdGV9IGZyb20gJy4vY29tcG9zaXRlbWFyayc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtUaXRsZU1peGluc30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge0xlZ2VuZH0gZnJvbSAnLi9sZWdlbmQnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4vbG9naWNhbCc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtTY2FsZX0gZnJvbSAnLi9zY2FsZSc7XG5pbXBvcnQge0VuY29kaW5nU29ydEZpZWxkLCBTb3J0T3JkZXJ9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7Z2V0VGltZVVuaXRQYXJ0cywgbm9ybWFsaXplVGltZVVuaXQsIFRpbWVVbml0fSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7QWdncmVnYXRlZEZpZWxkRGVmLCBXaW5kb3dGaWVsZERlZn0gZnJvbSAnLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtnZXRGdWxsTmFtZSwgUVVBTlRJVEFUSVZFLCBUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtmbGF0QWNjZXNzV2l0aERhdHVtLCByZXBsYWNlUGF0aEluRmllbGQsIHRpdGxlY2FzZX0gZnJvbSAnLi91dGlsJztcblxuXG4vKipcbiAqIERlZmluaXRpb24gb2JqZWN0IGZvciBhIGNvbnN0YW50IHZhbHVlIG9mIGFuIGVuY29kaW5nIGNoYW5uZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVEZWYge1xuICAvKipcbiAgICogQSBjb25zdGFudCB2YWx1ZSBpbiB2aXN1YWwgZG9tYWluIChlLmcuLCBgXCJyZWRcImAgLyBcIiMwMDk5ZmZcIiBmb3IgY29sb3IsIHZhbHVlcyBiZXR3ZWVuIGAwYCB0byBgMWAgZm9yIG9wYWNpdHkpLlxuICAgKi9cbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2VuZXJpYyB0eXBlIGZvciBjb25kaXRpb25hbCBjaGFubmVsRGVmLlxuICogRiBkZWZpbmVzIHRoZSB1bmRlcmx5aW5nIEZpZWxkRGVmIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5uZWxEZWZXaXRoQ29uZGl0aW9uPEYgZXh0ZW5kcyBGaWVsZERlZjxhbnk+PiA9IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxGPiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxGPjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uYWw8VD4gPSBDb25kaXRpb25hbFByZWRpY2F0ZTxUPiB8IENvbmRpdGlvbmFsU2VsZWN0aW9uPFQ+O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFByZWRpY2F0ZTxUPiA9IHtcbiAgdGVzdDogTG9naWNhbE9wZXJhbmQ8UHJlZGljYXRlPjtcbn0gJiBUO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFNlbGVjdGlvbjxUPiA9IHtcbiAgLyoqXG4gICAqIEEgW3NlbGVjdGlvbiBuYW1lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sKSwgb3IgYSBzZXJpZXMgb2YgW2NvbXBvc2VkIHNlbGVjdGlvbnNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2VsZWN0aW9uLmh0bWwjY29tcG9zZSkuXG4gICAqL1xuICBzZWxlY3Rpb246IExvZ2ljYWxPcGVyYW5kPHN0cmluZz47XG59ICYgVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWxTZWxlY3Rpb248VD4oYzogQ29uZGl0aW9uYWw8VD4pOiBjIGlzIENvbmRpdGlvbmFsU2VsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIGNbJ3NlbGVjdGlvbiddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvblZhbHVlRGVmTWl4aW5zIHtcbiAgLyoqXG4gICAqIE9uZSBvciBtb3JlIHZhbHVlIGRlZmluaXRpb24ocykgd2l0aCBhIHNlbGVjdGlvbiBwcmVkaWNhdGUuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBBIGZpZWxkIGRlZmluaXRpb24ncyBgY29uZGl0aW9uYCBwcm9wZXJ0eSBjYW4gb25seSBjb250YWluIFt2YWx1ZSBkZWZpbml0aW9uc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9lbmNvZGluZy5odG1sI3ZhbHVlLWRlZilcbiAgICogc2luY2UgVmVnYS1MaXRlIG9ubHkgYWxsb3dzIGF0IG1vc3Qgb25lIGVuY29kZWQgZmllbGQgcGVyIGVuY29kaW5nIGNoYW5uZWwuXG4gICAqL1xuICBjb25kaXRpb24/OiBDb25kaXRpb25hbDxWYWx1ZURlZj4gfCBDb25kaXRpb25hbDxWYWx1ZURlZj5bXTtcbn1cblxuLyoqXG4gKiBBIEZpZWxkRGVmIHdpdGggQ29uZGl0aW9uPFZhbHVlRGVmPlxuICoge1xuICogICBjb25kaXRpb246IHt2YWx1ZTogLi4ufSxcbiAqICAgZmllbGQ6IC4uLixcbiAqICAgLi4uXG4gKiB9XG4gKi9cblxuZXhwb3J0IHR5cGUgRmllbGREZWZXaXRoQ29uZGl0aW9uPEYgZXh0ZW5kcyBGaWVsZERlZjxhbnk+PiA9IEYgJiBDb25kaXRpb25WYWx1ZURlZk1peGlucztcblxuLyoqXG4gKiBBIFZhbHVlRGVmIHdpdGggQ29uZGl0aW9uPFZhbHVlRGVmIHwgRmllbGREZWY+XG4gKiB7XG4gKiAgIGNvbmRpdGlvbjoge2ZpZWxkOiAuLi59IHwge3ZhbHVlOiAuLi59LFxuICogICB2YWx1ZTogLi4uLFxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlRGVmV2l0aENvbmRpdGlvbjxGIGV4dGVuZHMgRmllbGREZWY8YW55Pj4ge1xuICAvKipcbiAgICogQSBmaWVsZCBkZWZpbml0aW9uIG9yIG9uZSBvciBtb3JlIHZhbHVlIGRlZmluaXRpb24ocykgd2l0aCBhIHNlbGVjdGlvbiBwcmVkaWNhdGUuXG4gICAqL1xuICBjb25kaXRpb24/OiBDb25kaXRpb25hbDxGPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPltdO1xuXG4gIC8qKlxuICAgKiBBIGNvbnN0YW50IHZhbHVlIGluIHZpc3VhbCBkb21haW4uXG4gICAqL1xuICB2YWx1ZT86IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgcmVwZWF0ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGVhdFJlZiA9IHtcbiAgcmVwZWF0OiAncm93JyB8ICdjb2x1bW4nXG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZCA9IHN0cmluZyB8IFJlcGVhdFJlZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwZWF0UmVmKGZpZWxkOiBGaWVsZCk6IGZpZWxkIGlzIFJlcGVhdFJlZiB7XG4gIHJldHVybiBmaWVsZCAmJiAhaXNTdHJpbmcoZmllbGQpICYmICdyZXBlYXQnIGluIGZpZWxkO1xufVxuXG4vKiogQGhpZGUgKi9cbmV4cG9ydCB0eXBlIEhpZGRlbkNvbXBvc2l0ZUFnZ3JlZ2F0ZSA9IENvbXBvc2l0ZUFnZ3JlZ2F0ZTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRlID0gQWdncmVnYXRlT3AgfCBIaWRkZW5Db21wb3NpdGVBZ2dyZWdhdGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGREZWZCYXNlPEY+IHtcblxuICAvKipcbiAgICogX19SZXF1aXJlZC5fXyBBIHN0cmluZyBkZWZpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgZnJvbSB3aGljaCB0byBwdWxsIGEgZGF0YSB2YWx1ZVxuICAgKiBvciBhbiBvYmplY3QgZGVmaW5pbmcgaXRlcmF0ZWQgdmFsdWVzIGZyb20gdGhlIFtgcmVwZWF0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9yZXBlYXQuaHRtbCkgb3BlcmF0b3IuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBEb3RzIChgLmApIGFuZCBicmFja2V0cyAoYFtgIGFuZCBgXWApIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBuZXN0ZWQgb2JqZWN0cyAoZS5nLiwgYFwiZmllbGRcIjogXCJmb28uYmFyXCJgIGFuZCBgXCJmaWVsZFwiOiBcImZvb1snYmFyJ11cImApLlxuICAgKiBJZiBmaWVsZCBuYW1lcyBjb250YWluIGRvdHMgb3IgYnJhY2tldHMgYnV0IGFyZSBub3QgbmVzdGVkLCB5b3UgY2FuIHVzZSBgXFxcXGAgdG8gZXNjYXBlIGRvdHMgYW5kIGJyYWNrZXRzIChlLmcuLCBgXCJhXFxcXC5iXCJgIGFuZCBgXCJhXFxcXFswXFxcXF1cImApLlxuICAgKiBTZWUgbW9yZSBkZXRhaWxzIGFib3V0IGVzY2FwaW5nIGluIHRoZSBbZmllbGQgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9maWVsZC5odG1sKS5cbiAgICpcbiAgICogX19Ob3RlOl9fIGBmaWVsZGAgaXMgbm90IHJlcXVpcmVkIGlmIGBhZ2dyZWdhdGVgIGlzIGBjb3VudGAuXG4gICAqL1xuICBmaWVsZD86IEY7XG5cbiAgLy8gZnVuY3Rpb25cblxuICAvKipcbiAgICogVGltZSB1bml0IChlLmcuLCBgeWVhcmAsIGB5ZWFybW9udGhgLCBgbW9udGhgLCBgaG91cnNgKSBmb3IgYSB0ZW1wb3JhbCBmaWVsZC5cbiAgICogb3IgW2EgdGVtcG9yYWwgZmllbGQgdGhhdCBnZXRzIGNhc3RlZCBhcyBvcmRpbmFsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGUuaHRtbCNjYXN0KS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB1bmRlZmluZWRgIChOb25lKVxuICAgKi9cbiAgdGltZVVuaXQ/OiBUaW1lVW5pdDtcblxuICAvKipcbiAgICogQSBmbGFnIGZvciBiaW5uaW5nIGEgYHF1YW50aXRhdGl2ZWAgZmllbGQsIG9yIFthbiBvYmplY3QgZGVmaW5pbmcgYmlubmluZyBwYXJhbWV0ZXJzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2Jpbi5odG1sI3BhcmFtcykuXG4gICAqIElmIGB0cnVlYCwgZGVmYXVsdCBbYmlubmluZyBwYXJhbWV0ZXJzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2Jpbi5odG1sKSB3aWxsIGJlIGFwcGxpZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgZmFsc2VgXG4gICAqL1xuICBiaW4/OiBib29sZWFuIHwgQmluUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGZpZWxkXG4gICAqIChlLmcuLCBgbWVhbmAsIGBzdW1gLCBgbWVkaWFuYCwgYG1pbmAsIGBtYXhgLCBgY291bnRgKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB1bmRlZmluZWRgIChOb25lKVxuICAgKi9cbiAgYWdncmVnYXRlPzogQWdncmVnYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9GaWVsZERlZkJhc2UoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pOiBGaWVsZERlZkJhc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtmaWVsZCwgdGltZVVuaXQsIGJpbiwgYWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICByZXR1cm4ge1xuICAgIC4uLih0aW1lVW5pdCA/IHt0aW1lVW5pdH0gOiB7fSksXG4gICAgLi4uKGJpbiA/IHtiaW59IDoge30pLFxuICAgIC4uLihhZ2dyZWdhdGUgPyB7YWdncmVnYXRlfSA6IHt9KSxcbiAgICBmaWVsZFxuICB9O1xufVxuXG4vKipcbiAqICBEZWZpbml0aW9uIG9iamVjdCBmb3IgYSBkYXRhIGZpZWxkLCBpdHMgdHlwZSBhbmQgdHJhbnNmb3JtYXRpb24gb2YgYW4gZW5jb2RpbmcgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZERlZjxGPiBleHRlbmRzIEZpZWxkRGVmQmFzZTxGPiwgVGl0bGVNaXhpbnMge1xuICAvKipcbiAgICogVGhlIGVuY29kZWQgZmllbGQncyB0eXBlIG9mIG1lYXN1cmVtZW50IChgXCJxdWFudGl0YXRpdmVcImAsIGBcInRlbXBvcmFsXCJgLCBgXCJvcmRpbmFsXCJgLCBvciBgXCJub21pbmFsXCJgKS5cbiAgICogSXQgY2FuIGFsc28gYmUgYSBgXCJnZW9qc29uXCJgIHR5cGUgZm9yIGVuY29kaW5nIFsnZ2Vvc2hhcGUnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2dlb3NoYXBlLmh0bWwpLlxuICAgKi9cbiAgLy8gKiBvciBhbiBpbml0aWFsIGNoYXJhY3RlciBvZiB0aGUgdHlwZSBuYW1lIChgXCJRXCJgLCBgXCJUXCJgLCBgXCJPXCJgLCBgXCJOXCJgKS5cbiAgLy8gKiBUaGlzIHByb3BlcnR5IGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gIHR5cGU6IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGVGaWVsZERlZjxGPiBleHRlbmRzIEZpZWxkRGVmPEY+IHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFubmVsJ3Mgc2NhbGUsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdmFsdWVzIGluIHRoZSBkYXRhIGRvbWFpbiAobnVtYmVycywgZGF0ZXMsIHN0cmluZ3MsIGV0YykgdG8gdmlzdWFsIHZhbHVlcyAocGl4ZWxzLCBjb2xvcnMsIHNpemVzKSBvZiB0aGUgZW5jb2RpbmcgY2hhbm5lbHMuXG4gICAqXG4gICAqIElmIGBudWxsYCwgdGhlIHNjYWxlIHdpbGwgYmUgW2Rpc2FibGVkIGFuZCB0aGUgZGF0YSB2YWx1ZSB3aWxsIGJlIGRpcmVjdGx5IGVuY29kZWRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNhYmxlKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgZGVmYXVsdCBbc2NhbGUgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sKSBhcmUgYXBwbGllZC5cbiAgICovXG4gIHNjYWxlPzogU2NhbGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGZvciB0aGUgZW5jb2RlZCBmaWVsZC5cbiAgICogU3VwcG9ydGVkIGBzb3J0YCB2YWx1ZXMgaW5jbHVkZSBgXCJhc2NlbmRpbmdcImAsIGBcImRlc2NlbmRpbmdcImAsIGBudWxsYCAobm8gc29ydGluZyksIG9yIGFuIGFycmF5IHNwZWNpZnlpbmcgdGhlIHByZWZlcnJlZCBvcmRlciBvZiB2YWx1ZXMuXG4gICAqIEZvciBmaWVsZHMgd2l0aCBkaXNjcmV0ZSBkb21haW5zLCBgc29ydGAgY2FuIGFsc28gYmUgYSBbc29ydCBmaWVsZCBkZWZpbml0aW9uIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zb3J0Lmh0bWwjc29ydC1maWVsZCkuXG4gICAqIEZvciBgc29ydGAgYXMgYW4gW2FycmF5IHNwZWNpZnlpbmcgdGhlIHByZWZlcnJlZCBvcmRlciBvZiB2YWx1ZXNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc29ydC5odG1sI3NvcnQtYXJyYXkpLCB0aGUgc29ydCBvcmRlciB3aWxsIG9iZXkgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXksIGZvbGxvd2VkIGJ5IGFueSB1bnNwZWNpZmllZCB2YWx1ZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJhc2NlbmRpbmdcImBcbiAgICovXG4gIHNvcnQ/OiBzdHJpbmdbXSB8IFNvcnRPcmRlciB8IEVuY29kaW5nU29ydEZpZWxkPEY+IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3NpdGlvbkZpZWxkRGVmPEY+IGV4dGVuZHMgU2NhbGVGaWVsZERlZjxGPiB7XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiBheGlzJ3MgZ3JpZGxpbmVzLCB0aWNrcyBhbmQgbGFiZWxzLlxuICAgKiBJZiBgbnVsbGAsIHRoZSBheGlzIGZvciB0aGUgZW5jb2RpbmcgY2hhbm5lbCB3aWxsIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIGRlZmF1bHQgW2F4aXMgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9heGlzLmh0bWwpIGFyZSBhcHBsaWVkLlxuICAgKi9cbiAgYXhpcz86IEF4aXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlIG9mIHN0YWNraW5nIG9mZnNldCBpZiB0aGUgZmllbGQgc2hvdWxkIGJlIHN0YWNrZWQuXG4gICAqIGBzdGFja2AgaXMgb25seSBhcHBsaWNhYmxlIGZvciBgeGAgYW5kIGB5YCBjaGFubmVscyB3aXRoIGNvbnRpbnVvdXMgZG9tYWlucy5cbiAgICogRm9yIGV4YW1wbGUsIGBzdGFja2Agb2YgYHlgIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBzdGFja2luZyBmb3IgYSB2ZXJ0aWNhbCBiYXIgY2hhcnQuXG4gICAqXG4gICAqIGBzdGFja2AgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczpcbiAgICogLSBgXCJ6ZXJvXCJgOiBzdGFja2luZyB3aXRoIGJhc2VsaW5lIG9mZnNldCBhdCB6ZXJvIHZhbHVlIG9mIHRoZSBzY2FsZSAoZm9yIGNyZWF0aW5nIHR5cGljYWwgc3RhY2tlZCBbYmFyXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3N0YWNrLmh0bWwjYmFyKSBhbmQgW2FyZWFdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNhcmVhKSBjaGFydCkuXG4gICAqIC0gYFwibm9ybWFsaXplXCJgIC0gc3RhY2tpbmcgd2l0aCBub3JtYWxpemVkIGRvbWFpbiAoZm9yIGNyZWF0aW5nIFtub3JtYWxpemVkIHN0YWNrZWQgYmFyIGFuZCBhcmVhIGNoYXJ0c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zdGFjay5odG1sI25vcm1hbGl6ZWQpLiA8YnIvPlxuICAgKiAtYFwiY2VudGVyXCJgIC0gc3RhY2tpbmcgd2l0aCBjZW50ZXIgYmFzZWxpbmUgKGZvciBbc3RyZWFtZ3JhcGhdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNzdHJlYW1ncmFwaCkpLlxuICAgKiAtIGBudWxsYCAtIE5vLXN0YWNraW5nLiBUaGlzIHdpbGwgcHJvZHVjZSBsYXllcmVkIFtiYXJdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNsYXllcmVkLWJhci1jaGFydCkgYW5kIGFyZWEgY2hhcnQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgemVyb2AgZm9yIHBsb3RzIHdpdGggYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICogKDEpIHRoZSBtYXJrIGlzIGBiYXJgIG9yIGBhcmVhYDtcbiAgICogKDIpIHRoZSBzdGFja2VkIG1lYXN1cmUgY2hhbm5lbCAoeCBvciB5KSBoYXMgYSBsaW5lYXIgc2NhbGU7XG4gICAqICgzKSBBdCBsZWFzdCBvbmUgb2Ygbm9uLXBvc2l0aW9uIGNoYW5uZWxzIG1hcHBlZCB0byBhbiB1bmFnZ3JlZ2F0ZWQgZmllbGQgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB4IGFuZCB5LiAgT3RoZXJ3aXNlLCBgbnVsbGAgYnkgZGVmYXVsdC5cbiAgICovXG4gIHN0YWNrPzogU3RhY2tPZmZzZXQgfCBudWxsO1xufVxuXG4vKipcbiAqIEZpZWxkIGRlZmluaXRpb24gb2YgYSBtYXJrIHByb3BlcnR5LCB3aGljaCBjYW4gY29udGFpbiBhIGxlZ2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrUHJvcEZpZWxkRGVmPEY+IGV4dGVuZHMgU2NhbGVGaWVsZERlZjxGPiB7XG4gICAvKipcbiAgICAqIEFuIG9iamVjdCBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsZWdlbmQuXG4gICAgKiBJZiBgbnVsbGAsIHRoZSBsZWdlbmQgZm9yIHRoZSBlbmNvZGluZyBjaGFubmVsIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAqXG4gICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gSWYgdW5kZWZpbmVkLCBkZWZhdWx0IFtsZWdlbmQgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sZWdlbmQuaHRtbCkgYXJlIGFwcGxpZWQuXG4gICAgKi9cbiAgbGVnZW5kPzogTGVnZW5kIHwgbnVsbDtcbn1cblxuLy8gRGV0YWlsXG5cbi8vIE9yZGVyIFBhdGggaGF2ZSBubyBzY2FsZVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVyRmllbGREZWY8Rj4gZXh0ZW5kcyBGaWVsZERlZjxGPiB7XG4gIC8qKlxuICAgKiBUaGUgc29ydCBvcmRlci4gT25lIG9mIGBcImFzY2VuZGluZ1wiYCAoZGVmYXVsdCkgb3IgYFwiZGVzY2VuZGluZ1wiYC5cbiAgICovXG4gIHNvcnQ/OiBTb3J0T3JkZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZpZWxkRGVmPEY+IGV4dGVuZHMgRmllbGREZWY8Rj4ge1xuICAvKipcbiAgICogVGhlIFtmb3JtYXR0aW5nIHBhdHRlcm5dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZm9ybWF0Lmh0bWwpIGZvciBhIHRleHQgZmllbGQuIElmIG5vdCBkZWZpbmVkLCB0aGlzIHdpbGwgYmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgZm9ybWF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDaGFubmVsRGVmPEY+ID0gQ2hhbm5lbERlZldpdGhDb25kaXRpb248RmllbGREZWY8Rj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25kaXRpb25hbERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyBDaGFubmVsRGVmV2l0aENvbmRpdGlvbjxGaWVsZERlZjxGPj4ge1xuICByZXR1cm4gISFjaGFubmVsRGVmICYmICEhY2hhbm5lbERlZi5jb25kaXRpb247XG59XG5cbi8qKlxuICogUmV0dXJuIGlmIGEgY2hhbm5lbERlZiBpcyBhIENvbmRpdGlvbmFsVmFsdWVEZWYgd2l0aCBDb25kaXRpb25GaWVsZERlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ29uZGl0aW9uYWxGaWVsZERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyAoVmFsdWVEZWYgJiB7Y29uZGl0aW9uOiBDb25kaXRpb25hbDxGaWVsZERlZjxGPj59KSB7XG4gIHJldHVybiAhIWNoYW5uZWxEZWYgJiYgISFjaGFubmVsRGVmLmNvbmRpdGlvbiAmJiAhaXNBcnJheShjaGFubmVsRGVmLmNvbmRpdGlvbikgJiYgaXNGaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb25kaXRpb25hbFZhbHVlRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIChWYWx1ZURlZiAmIHtjb25kaXRpb246IENvbmRpdGlvbmFsPFZhbHVlRGVmPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPltdfSkge1xuICByZXR1cm4gISFjaGFubmVsRGVmICYmICEhY2hhbm5lbERlZi5jb25kaXRpb24gJiYgKFxuICAgIGlzQXJyYXkoY2hhbm5lbERlZi5jb25kaXRpb24pIHx8IGlzVmFsdWVEZWYoY2hhbm5lbERlZi5jb25kaXRpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIEZpZWxkRGVmPEY+IHwgUG9zaXRpb25GaWVsZERlZjxGPiB8IFNjYWxlRmllbGREZWY8Rj4gfCBNYXJrUHJvcEZpZWxkRGVmPEY+IHwgT3JkZXJGaWVsZERlZjxGPiB8IFRleHRGaWVsZERlZjxGPiB7XG4gIHJldHVybiAhIWNoYW5uZWxEZWYgJiYgKCEhY2hhbm5lbERlZlsnZmllbGQnXSB8fCBjaGFubmVsRGVmWydhZ2dyZWdhdGUnXSA9PT0gJ2NvdW50Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0ZpZWxkRGVmKGZpZWxkRGVmOiBDaGFubmVsRGVmPHN0cmluZ3xSZXBlYXRSZWY+KTogZmllbGREZWYgaXMgRmllbGREZWY8c3RyaW5nPiB7XG4gIHJldHVybiBpc0ZpZWxkRGVmKGZpZWxkRGVmKSAmJiBpc1N0cmluZyhmaWVsZERlZi5maWVsZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbHVlRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIFZhbHVlRGVmIHtcbiAgcmV0dXJuIGNoYW5uZWxEZWYgJiYgJ3ZhbHVlJyBpbiBjaGFubmVsRGVmICYmIGNoYW5uZWxEZWZbJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGVGaWVsZERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyBTY2FsZUZpZWxkRGVmPEY+IHtcbiAgcmV0dXJuICEhY2hhbm5lbERlZiAmJiAoISFjaGFubmVsRGVmWydzY2FsZSddIHx8ICEhY2hhbm5lbERlZlsnc29ydCddKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFJlZk9wdGlvbiB7XG4gIC8qKiBleGNsdWRlIGJpbiwgYWdncmVnYXRlLCB0aW1lVW5pdCAqL1xuICBub2ZuPzogYm9vbGVhbjtcbiAgLyoqIFdyYXAgdGhlIGZpZWxkIHdpdGggZGF0dW0gb3IgcGFyZW50IChlLmcuLCBkYXR1bVsnLi4uJ10gZm9yIFZlZ2EgRXhwcmVzc2lvbiAqL1xuICBleHByPzogJ2RhdHVtJyB8ICdwYXJlbnQnO1xuICAvKiogcHJlcGVuZCBmbiB3aXRoIGN1c3RvbSBmdW5jdGlvbiBwcmVmaXggKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogYXBwZW5kIHN1ZmZpeCB0byB0aGUgZmllbGQgcmVmIGZvciBiaW4gKGRlZmF1bHQ9J3N0YXJ0JykgKi9cbiAgYmluU3VmZml4PzogJ2VuZCcgfCAncmFuZ2UnIHwgJ21pZCc7XG4gIC8qKiBhcHBlbmQgc3VmZml4IHRvIHRoZSBmaWVsZCByZWYgKGdlbmVyYWwpICovXG4gIHN1ZmZpeD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNPcEZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiB8IFdpbmRvd0ZpZWxkRGVmIHwgQWdncmVnYXRlZEZpZWxkRGVmKTogZmllbGREZWYgaXMgV2luZG93RmllbGREZWYgfCBBZ2dyZWdhdGVkRmllbGREZWYge1xuICByZXR1cm4gISFmaWVsZERlZlsnb3AnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZnRmllbGQoZmllbGREZWY6IEZpZWxkRGVmQmFzZTxzdHJpbmc+IHwgV2luZG93RmllbGREZWYgfCBBZ2dyZWdhdGVkRmllbGREZWYsIG9wdDogRmllbGRSZWZPcHRpb24gPSB7fSk6IHN0cmluZyB7XG4gIGxldCBmaWVsZCA9IGZpZWxkRGVmLmZpZWxkO1xuICBjb25zdCBwcmVmaXggPSBvcHQucHJlZml4O1xuICBsZXQgc3VmZml4ID0gb3B0LnN1ZmZpeDtcblxuICBpZiAoaXNDb3VudChmaWVsZERlZikpIHtcbiAgICBmaWVsZCA9ICdjb3VudF8qJztcbiAgfSBlbHNlIHtcbiAgICBsZXQgZm46IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICAgIGlmICghb3B0Lm5vZm4pIHtcbiAgICAgIGlmIChpc09wRmllbGREZWYoZmllbGREZWYpKSB7XG4gICAgICAgIGZuID0gZmllbGREZWYub3A7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgICAgICBmbiA9IGJpblRvU3RyaW5nKGZpZWxkRGVmLmJpbik7XG4gICAgICAgIHN1ZmZpeCA9IG9wdC5iaW5TdWZmaXggfHwgJyc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICBmbiA9IFN0cmluZyhmaWVsZERlZi5hZ2dyZWdhdGUpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZERlZi50aW1lVW5pdCkge1xuICAgICAgICBmbiA9IFN0cmluZyhmaWVsZERlZi50aW1lVW5pdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZuKSB7XG4gICAgICBmaWVsZCA9IGZpZWxkID8gYCR7Zm59XyR7ZmllbGR9YCA6IGZuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdWZmaXgpIHtcbiAgICBmaWVsZCA9IGAke2ZpZWxkfV8ke3N1ZmZpeH1gO1xuICB9XG5cbiAgaWYgKHByZWZpeCkge1xuICAgIGZpZWxkID0gYCR7cHJlZml4fV8ke2ZpZWxkfWA7XG4gIH1cblxuICBpZiAob3B0LmV4cHIpIHtcbiAgICAvLyBFeHByZXNzaW9uIHRvIGFjY2VzcyBmbGF0dGVuZWQgZmllbGQuIE5vIG5lZWQgdG8gZXNjYXBlIGRvdHMuXG4gICAgcmV0dXJuIGZsYXRBY2Nlc3NXaXRoRGF0dW0oZmllbGQsIG9wdC5leHByKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBmbGF0dGVuZWQgYWxsIGZpZWxkcyBzbyBwYXRocyBzaG91bGQgaGF2ZSBiZWNvbWUgZG90LlxuICAgIHJldHVybiByZXBsYWNlUGF0aEluRmllbGQoZmllbGQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NyZXRlKGZpZWxkRGVmOiBGaWVsZERlZjxGaWVsZD4pIHtcbiAgc3dpdGNoIChmaWVsZERlZi50eXBlKSB7XG4gICAgY2FzZSAnbm9taW5hbCc6XG4gICAgY2FzZSAnb3JkaW5hbCc6XG4gICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdxdWFudGl0YXRpdmUnOlxuICAgICAgcmV0dXJuICEhZmllbGREZWYuYmluO1xuICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICBjYXNlICdsb25naXR1ZGUnOlxuICAgIGNhc2UgJ3RlbXBvcmFsJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW52YWxpZEZpZWxkVHlwZShmaWVsZERlZi50eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVvdXMoZmllbGREZWY6IEZpZWxkRGVmPEZpZWxkPikge1xuICByZXR1cm4gIWlzRGlzY3JldGUoZmllbGREZWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudChmaWVsZERlZjogRmllbGREZWZCYXNlPEZpZWxkPikge1xuICByZXR1cm4gZmllbGREZWYuYWdncmVnYXRlID09PSAnY291bnQnO1xufVxuXG5leHBvcnQgdHlwZSBGaWVsZFRpdGxlRm9ybWF0dGVyID0gKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpID0+IHN0cmluZztcblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmJhbFRpdGxlRm9ybWF0dGVyKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3Qge2ZpZWxkOiBmaWVsZCwgYmluLCB0aW1lVW5pdCwgYWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICBpZiAoYWdncmVnYXRlID09PSAnY291bnQnKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5jb3VudFRpdGxlO1xuICB9IGVsc2UgaWYgKGJpbikge1xuICAgIHJldHVybiBgJHtmaWVsZH0gKGJpbm5lZClgO1xuICB9IGVsc2UgaWYgKHRpbWVVbml0KSB7XG4gICAgY29uc3QgdW5pdHMgPSBnZXRUaW1lVW5pdFBhcnRzKHRpbWVVbml0KS5qb2luKCctJyk7XG4gICAgcmV0dXJuIGAke2ZpZWxkfSAoJHt1bml0c30pYDtcbiAgfSBlbHNlIGlmIChhZ2dyZWdhdGUpIHtcbiAgICByZXR1cm4gYCR7dGl0bGVjYXNlKGFnZ3JlZ2F0ZSl9IG9mICR7ZmllbGR9YDtcbiAgfVxuICByZXR1cm4gZmllbGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvbmFsVGl0bGVGb3JtYXR0ZXIoZmllbGREZWY6IEZpZWxkRGVmQmFzZTxzdHJpbmc+LCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBmbiA9IGZpZWxkRGVmLmFnZ3JlZ2F0ZSB8fCBmaWVsZERlZi50aW1lVW5pdCB8fCAoZmllbGREZWYuYmluICYmICdiaW4nKTtcbiAgaWYgKGZuKSB7XG4gICAgcmV0dXJuIGZuLnRvVXBwZXJDYXNlKCkgKyAnKCcgKyBmaWVsZERlZi5maWVsZCArICcpJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmllbGREZWYuZmllbGQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRUaXRsZUZvcm1hdHRlcjogRmllbGRUaXRsZUZvcm1hdHRlciA9IChmaWVsZERlZjogRmllbGREZWZCYXNlPHN0cmluZz4sIGNvbmZpZzogQ29uZmlnKSA9PiB7XG4gIHN3aXRjaCAoY29uZmlnLmZpZWxkVGl0bGUpIHtcbiAgICBjYXNlICdwbGFpbic6XG4gICAgICByZXR1cm4gZmllbGREZWYuZmllbGQ7XG4gICAgY2FzZSAnZnVuY3Rpb25hbCc6XG4gICAgICByZXR1cm4gZnVuY3Rpb25hbFRpdGxlRm9ybWF0dGVyKGZpZWxkRGVmLCBjb25maWcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmVyYmFsVGl0bGVGb3JtYXR0ZXIoZmllbGREZWYsIGNvbmZpZyk7XG4gIH1cbn07XG5cbmxldCB0aXRsZUZvcm1hdHRlciA9IGRlZmF1bHRUaXRsZUZvcm1hdHRlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRpdGxlRm9ybWF0dGVyKGZvcm1hdHRlcjogRmllbGRUaXRsZUZvcm1hdHRlcikge1xuICB0aXRsZUZvcm1hdHRlciA9IGZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VGl0bGVGb3JtYXR0ZXIoKSB7XG4gIHNldFRpdGxlRm9ybWF0dGVyKGRlZmF1bHRUaXRsZUZvcm1hdHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aXRsZShmaWVsZERlZjogRmllbGREZWZCYXNlPHN0cmluZz4sIGNvbmZpZzogQ29uZmlnKSB7XG4gIHJldHVybiB0aXRsZUZvcm1hdHRlcihmaWVsZERlZiwgY29uZmlnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRUeXBlKGZpZWxkRGVmOiBGaWVsZERlZjxGaWVsZD4sIGNoYW5uZWw6IENoYW5uZWwpOiBUeXBlIHtcbiAgaWYgKGZpZWxkRGVmLnRpbWVVbml0KSB7XG4gICAgcmV0dXJuICd0ZW1wb3JhbCc7XG4gIH1cbiAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgIHJldHVybiAncXVhbnRpdGF0aXZlJztcbiAgfVxuICBzd2l0Y2ggKHJhbmdlVHlwZShjaGFubmVsKSkge1xuICAgIGNhc2UgJ2NvbnRpbnVvdXMnOlxuICAgICAgcmV0dXJuICdxdWFudGl0YXRpdmUnO1xuICAgIGNhc2UgJ2Rpc2NyZXRlJzpcbiAgICAgIHJldHVybiAnbm9taW5hbCc7XG4gICAgY2FzZSAnZmxleGlibGUnOiAvLyBjb2xvclxuICAgICAgcmV0dXJuICdub21pbmFsJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdxdWFudGl0YXRpdmUnO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmllbGREZWYgLS0gZWl0aGVyIGZyb20gdGhlIG91dGVyIGNoYW5uZWxEZWYgb3IgZnJvbSB0aGUgY29uZGl0aW9uIG9mIGNoYW5uZWxEZWYuXG4gKiBAcGFyYW0gY2hhbm5lbERlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGREZWY8Rj4oY2hhbm5lbERlZjogQ2hhbm5lbERlZjxGPik6IEZpZWxkRGVmPEY+IHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gY2hhbm5lbERlZjtcbiAgfSBlbHNlIGlmIChoYXNDb25kaXRpb25hbEZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgcmV0dXJuIGNoYW5uZWxEZWYuY29uZGl0aW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udmVydCB0eXBlIHRvIGZ1bGwsIGxvd2VyY2FzZSB0eXBlLCBvciBhdWdtZW50IHRoZSBmaWVsZERlZiB3aXRoIGEgZGVmYXVsdCB0eXBlIGlmIG1pc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbERlZjxhbnk+IHtcbiAgaWYgKGlzU3RyaW5nKGNoYW5uZWxEZWYpIHx8IGlzTnVtYmVyKGNoYW5uZWxEZWYpIHx8IGlzQm9vbGVhbihjaGFubmVsRGVmKSkge1xuICAgIGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBpc1N0cmluZyhjaGFubmVsRGVmKSA/ICdzdHJpbmcnIDpcbiAgICAgIGlzTnVtYmVyKGNoYW5uZWxEZWYpID8gJ251bWJlcicgOiAnYm9vbGVhbic7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UucHJpbWl0aXZlQ2hhbm5lbERlZihjaGFubmVsLCBwcmltaXRpdmVUeXBlLCBjaGFubmVsRGVmKSk7XG4gICAgcmV0dXJuIHt2YWx1ZTogY2hhbm5lbERlZn07XG4gIH1cblxuICAvLyBJZiBhIGZpZWxkRGVmIGNvbnRhaW5zIGEgZmllbGQsIHdlIG5lZWQgdHlwZS5cbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRmllbGREZWYoY2hhbm5lbERlZiwgY2hhbm5lbCk7XG4gIH0gZWxzZSBpZiAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jaGFubmVsRGVmLFxuICAgICAgLy8gTmVlZCB0byBjYXN0IGFzIG5vcm1hbGl6ZUZpZWxkRGVmIG5vcm1hbGx5IHJldHVybiBGaWVsZERlZiwgYnV0IGhlcmUgd2Uga25vdyB0aGF0IGl0IGlzIGRlZmluaXRlbHkgQ29uZGl0aW9uPEZpZWxkRGVmPlxuICAgICAgY29uZGl0aW9uOiBub3JtYWxpemVGaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbiwgY2hhbm5lbCkgYXMgQ29uZGl0aW9uYWw8RmllbGREZWY8c3RyaW5nPj5cbiAgICB9O1xuICB9XG4gIHJldHVybiBjaGFubmVsRGVmO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gIC8vIERyb3AgaW52YWxpZCBhZ2dyZWdhdGVcbiAgaWYgKGZpZWxkRGVmLmFnZ3JlZ2F0ZSAmJiAhaXNBZ2dyZWdhdGVPcChmaWVsZERlZi5hZ2dyZWdhdGUpKSB7XG4gICAgY29uc3Qge2FnZ3JlZ2F0ZSwgLi4uZmllbGREZWZXaXRob3V0QWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRBZ2dyZWdhdGUoZmllbGREZWYuYWdncmVnYXRlKSk7XG4gICAgZmllbGREZWYgPSBmaWVsZERlZldpdGhvdXRBZ2dyZWdhdGU7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgVGltZSBVbml0XG4gIGlmIChmaWVsZERlZi50aW1lVW5pdCkge1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICB0aW1lVW5pdDogbm9ybWFsaXplVGltZVVuaXQoZmllbGREZWYudGltZVVuaXQpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBiaW5cbiAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICBiaW46IG5vcm1hbGl6ZUJpbihmaWVsZERlZi5iaW4sIGNoYW5uZWwpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBUeXBlXG4gIGlmIChmaWVsZERlZi50eXBlKSB7XG4gICAgY29uc3QgZnVsbFR5cGUgPSBnZXRGdWxsTmFtZShmaWVsZERlZi50eXBlKTtcbiAgICBpZiAoZmllbGREZWYudHlwZSAhPT0gZnVsbFR5cGUpIHtcbiAgICAgIC8vIGNvbnZlcnQgc2hvcnQgdHlwZSB0byBmdWxsIHR5cGVcbiAgICAgIGZpZWxkRGVmID0ge1xuICAgICAgICAuLi5maWVsZERlZixcbiAgICAgICAgdHlwZTogZnVsbFR5cGVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChmaWVsZERlZi50eXBlICE9PSAncXVhbnRpdGF0aXZlJykge1xuICAgICAgaWYgKGlzQ291bnRpbmdBZ2dyZWdhdGVPcChmaWVsZERlZi5hZ2dyZWdhdGUpKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRGaWVsZFR5cGVGb3JDb3VudEFnZ3JlZ2F0ZShmaWVsZERlZi50eXBlLCBmaWVsZERlZi5hZ2dyZWdhdGUpKTtcbiAgICAgICAgZmllbGREZWYgPSB7XG4gICAgICAgICAgLi4uZmllbGREZWYsXG4gICAgICAgICAgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdHlwZSBpcyBlbXB0eSAvIGludmFsaWQsIHRoZW4gYXVnbWVudCB3aXRoIGRlZmF1bHQgdHlwZVxuICAgIGNvbnN0IG5ld1R5cGUgPSBkZWZhdWx0VHlwZShmaWVsZERlZiwgY2hhbm5lbCk7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW1wdHlPckludmFsaWRGaWVsZFR5cGUoZmllbGREZWYudHlwZSwgY2hhbm5lbCwgbmV3VHlwZSkpO1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgICAuLi5maWVsZERlZixcbiAgICAgIHR5cGU6IG5ld1R5cGVcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qge2NvbXBhdGlibGUsIHdhcm5pbmd9ID0gY2hhbm5lbENvbXBhdGliaWxpdHkoZmllbGREZWYsIGNoYW5uZWwpO1xuICBpZiAoIWNvbXBhdGlibGUpIHtcbiAgICBsb2cud2Fybih3YXJuaW5nKTtcbiAgfVxuICByZXR1cm4gZmllbGREZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCaW4oYmluOiBCaW5QYXJhbXN8Ym9vbGVhbiwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICBpZiAoaXNCb29sZWFuKGJpbikpIHtcbiAgICByZXR1cm4ge21heGJpbnM6IGF1dG9NYXhCaW5zKGNoYW5uZWwpfTtcbiAgfSBlbHNlIGlmICghYmluLm1heGJpbnMgJiYgIWJpbi5zdGVwKSB7XG4gICAgcmV0dXJuIHsuLi5iaW4sIG1heGJpbnM6IGF1dG9NYXhCaW5zKGNoYW5uZWwpfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmluO1xuICB9XG59XG5cbmNvbnN0IENPTVBBVElCTEUgPSB7Y29tcGF0aWJsZTogdHJ1ZX07XG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbENvbXBhdGliaWxpdHkoZmllbGREZWY6IEZpZWxkRGVmPEZpZWxkPiwgY2hhbm5lbDogQ2hhbm5lbCk6IHtjb21wYXRpYmxlOiBib29sZWFuOyB3YXJuaW5nPzogc3RyaW5nO30ge1xuICBjb25zdCB0eXBlID0gZmllbGREZWYudHlwZTtcblxuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlICdyb3cnOlxuICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICBpZiAoaXNDb250aW51b3VzKGZpZWxkRGVmKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGxvZy5tZXNzYWdlLmZhY2V0Q2hhbm5lbFNob3VsZEJlRGlzY3JldGUoY2hhbm5lbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDT01QQVRJQkxFO1xuXG4gICAgY2FzZSAneCc6XG4gICAgY2FzZSAneSc6XG4gICAgY2FzZSAnY29sb3InOlxuICAgIGNhc2UgJ2ZpbGwnOlxuICAgIGNhc2UgJ3N0cm9rZSc6XG4gICAgY2FzZSAndGV4dCc6XG4gICAgY2FzZSAnZGV0YWlsJzpcbiAgICBjYXNlICdrZXknOlxuICAgIGNhc2UgJ3Rvb2x0aXAnOlxuICAgIGNhc2UgJ2hyZWYnOlxuICAgICAgcmV0dXJuIENPTVBBVElCTEU7XG5cbiAgICBjYXNlICdsb25naXR1ZGUnOlxuICAgIGNhc2UgJ2xvbmdpdHVkZTInOlxuICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICBjYXNlICdsYXRpdHVkZTInOlxuICAgICAgaWYgKHR5cGUgIT09IFFVQU5USVRBVElWRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGBDaGFubmVsICR7Y2hhbm5lbH0gc2hvdWxkIGJlIHVzZWQgd2l0aCBhIHF1YW50aXRhdGl2ZSBmaWVsZCBvbmx5LCBub3QgJHtmaWVsZERlZi50eXBlfSBmaWVsZC5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcblxuICAgIGNhc2UgJ29wYWNpdHknOlxuICAgIGNhc2UgJ3NpemUnOlxuICAgIGNhc2UgJ3gyJzpcbiAgICBjYXNlICd5Mic6XG4gICAgICBpZiAoKHR5cGUgPT09ICdub21pbmFsJyAmJiAhZmllbGREZWZbJ3NvcnQnXSkgfHwgdHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgICAgICAgd2FybmluZzogYENoYW5uZWwgJHtjaGFubmVsfSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhbiB1bnNvcnRlZCBkaXNjcmV0ZSBmaWVsZC5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcblxuICAgIGNhc2UgJ3NoYXBlJzpcbiAgICAgIGlmIChmaWVsZERlZi50eXBlICE9PSAnbm9taW5hbCcgJiYgZmllbGREZWYudHlwZSAhPT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgICAgICAgd2FybmluZzogJ1NoYXBlIGNoYW5uZWwgc2hvdWxkIGJlIHVzZWQgd2l0aCBvbmx5IGVpdGhlciBub21pbmFsIG9yIGdlb2pzb24gZGF0YSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDT01QQVRJQkxFO1xuXG4gICAgY2FzZSAnb3JkZXInOlxuICAgICAgaWYgKGZpZWxkRGVmLnR5cGUgPT09ICdub21pbmFsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGBDaGFubmVsIG9yZGVyIGlzIGluYXBwcm9wcmlhdGUgZm9yIG5vbWluYWwgZmllbGQsIHdoaWNoIGhhcyBubyBpbmhlcmVudCBvcmRlci5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWxDb21wYXRhYmlsaXR5IG5vdCBpbXBsZW1lbnRlZCBmb3IgY2hhbm5lbCAnICsgY2hhbm5lbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxhbnk+KSB7XG4gIHJldHVybiBmaWVsZERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJyB8fCAhIWZpZWxkRGVmLmJpbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZUZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxhbnk+KSB7XG4gIHJldHVybiBmaWVsZERlZi50eXBlID09PSAndGVtcG9yYWwnIHx8ICEhZmllbGREZWYudGltZVVuaXQ7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/guide.d.ts b/build/src/guide.d.ts new file mode 100644 index 0000000000..eb1d139748 --- /dev/null +++ b/build/src/guide.d.ts @@ -0,0 +1,38 @@ +import { ConditionValueDefMixins, ValueDef } from './fielddef'; +import { VgEncodeChannel } from './vega.schema'; +export interface TitleMixins { + /** + * A title for the field. If `null`, the title will be removed. + * + * __Default value:__ derived from the field's name and transformation function (`aggregate`, `bin` and `timeUnit`). If the field has an aggregate function, the function is displayed as part of the title (e.g., `"Sum of Profit"`). If the field is binned or has a time unit applied, the applied function is shown in parentheses (e.g., `"Profit (binned)"`, `"Transaction Date (year-month)"`). Otherwise, the title is simply the field name. + * + * __Notes__: + * + * 1) You can customize the default field title format by providing the [`fieldTitle` property in the [config](https://vega.github.io/vega-lite/docs/config.html) or [`fieldTitle` function via the `compile` function's options](https://vega.github.io/vega-lite/docs/compile.html#field-title). + * + * 2) If both field definition's `title` and axis, header, or legend `title` are defined, axis/header/legend title will be used. + */ + title?: string | null; +} +export interface Guide extends TitleMixins { + /** + * The formatting pattern for labels. This is D3's [number format pattern](https://github.com/d3/d3-format#locale_format) for quantitative fields and D3's [time format pattern](https://github.com/d3/d3-time-format#locale_format) for time field. + * + * See the [format documentation](https://vega.github.io/vega-lite/docs/format.html) for more information. + * + * __Default value:__ derived from [numberFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for quantitative fields and from [timeFormat](https://vega.github.io/vega-lite/docs/config.html#format) config for temporal fields. + */ + format?: string; +} +export interface VlOnlyGuideConfig { + /** + * Whether month names and weekday names should be abbreviated. + * + * __Default value:__ `false` + */ + shortTimeLabels?: boolean; +} +export declare type GuideEncodingEntry = { + [k in VgEncodeChannel]?: ValueDef & ConditionValueDefMixins; +}; +export declare const VL_ONLY_GUIDE_CONFIG: (keyof VlOnlyGuideConfig)[]; diff --git a/build/src/guide.js b/build/src/guide.js new file mode 100644 index 0000000000..14d9a5e66c --- /dev/null +++ b/build/src/guide.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VL_ONLY_GUIDE_CONFIG = ['shortTimeLabels']; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3VpZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEyQ2EsUUFBQSxvQkFBb0IsR0FBZ0MsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25kaXRpb25WYWx1ZURlZk1peGlucywgVmFsdWVEZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0IHtWZ0VuY29kZUNoYW5uZWx9IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpdGxlTWl4aW5zIHtcbiAgLyoqXG4gICAqIEEgdGl0bGUgZm9yIHRoZSBmaWVsZC4gSWYgYG51bGxgLCB0aGUgdGl0bGUgd2lsbCBiZSByZW1vdmVkLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGRlcml2ZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGFuZCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiAoYGFnZ3JlZ2F0ZWAsIGBiaW5gIGFuZCBgdGltZVVuaXRgKS4gIElmIHRoZSBmaWVsZCBoYXMgYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCB0aGUgZnVuY3Rpb24gaXMgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlIHRpdGxlIChlLmcuLCBgXCJTdW0gb2YgUHJvZml0XCJgKS4gSWYgdGhlIGZpZWxkIGlzIGJpbm5lZCBvciBoYXMgYSB0aW1lIHVuaXQgYXBwbGllZCwgdGhlIGFwcGxpZWQgZnVuY3Rpb24gaXMgc2hvd24gaW4gcGFyZW50aGVzZXMgKGUuZy4sIGBcIlByb2ZpdCAoYmlubmVkKVwiYCwgYFwiVHJhbnNhY3Rpb24gRGF0ZSAoeWVhci1tb250aClcImApLiAgT3RoZXJ3aXNlLCB0aGUgdGl0bGUgaXMgc2ltcGx5IHRoZSBmaWVsZCBuYW1lLlxuICAgKlxuICAgKiBfX05vdGVzX186XG4gICAqXG4gICAqIDEpIFlvdSBjYW4gY3VzdG9taXplIHRoZSBkZWZhdWx0IGZpZWxkIHRpdGxlIGZvcm1hdCBieSBwcm92aWRpbmcgdGhlIFtgZmllbGRUaXRsZWAgcHJvcGVydHkgaW4gdGhlIFtjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwpIG9yIFtgZmllbGRUaXRsZWAgZnVuY3Rpb24gdmlhIHRoZSBgY29tcGlsZWAgZnVuY3Rpb24ncyBvcHRpb25zXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbXBpbGUuaHRtbCNmaWVsZC10aXRsZSkuXG4gICAqXG4gICAqIDIpIElmIGJvdGggZmllbGQgZGVmaW5pdGlvbidzIGB0aXRsZWAgYW5kIGF4aXMsIGhlYWRlciwgb3IgbGVnZW5kIGB0aXRsZWAgYXJlIGRlZmluZWQsIGF4aXMvaGVhZGVyL2xlZ2VuZCB0aXRsZSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3VpZGUgZXh0ZW5kcyBUaXRsZU1peGlucyB7XG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0dGluZyBwYXR0ZXJuIGZvciBsYWJlbHMuIFRoaXMgaXMgRDMncyBbbnVtYmVyIGZvcm1hdCBwYXR0ZXJuXShodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZm9ybWF0I2xvY2FsZV9mb3JtYXQpIGZvciBxdWFudGl0YXRpdmUgZmllbGRzIGFuZCBEMydzIFt0aW1lIGZvcm1hdCBwYXR0ZXJuXShodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtdGltZS1mb3JtYXQjbG9jYWxlX2Zvcm1hdCkgZm9yIHRpbWUgZmllbGQuXG4gICAqXG4gICAqIFNlZSB0aGUgW2Zvcm1hdCBkb2N1bWVudGF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2Zvcm1hdC5odG1sKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICBkZXJpdmVkIGZyb20gW251bWJlckZvcm1hdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNmb3JtYXQpIGNvbmZpZyBmb3IgcXVhbnRpdGF0aXZlIGZpZWxkcyBhbmQgZnJvbSBbdGltZUZvcm1hdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNmb3JtYXQpIGNvbmZpZyBmb3IgdGVtcG9yYWwgZmllbGRzLlxuICAgKi9cbiAgZm9ybWF0Pzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBWbE9ubHlHdWlkZUNvbmZpZyB7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbW9udGggbmFtZXMgYW5kIHdlZWtkYXkgbmFtZXMgc2hvdWxkIGJlIGFiYnJldmlhdGVkLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGBmYWxzZWBcbiAgICovXG4gIHNob3J0VGltZUxhYmVscz86IGJvb2xlYW47XG59XG5cblxuZXhwb3J0IHR5cGUgR3VpZGVFbmNvZGluZ0VudHJ5ID0ge1xuICBbayBpbiBWZ0VuY29kZUNoYW5uZWxdPzogVmFsdWVEZWYgJiBDb25kaXRpb25WYWx1ZURlZk1peGlucztcbn07XG5cbmV4cG9ydCBjb25zdCBWTF9PTkxZX0dVSURFX0NPTkZJRzogKGtleW9mIFZsT25seUd1aWRlQ29uZmlnKVtdID0gWydzaG9ydFRpbWVMYWJlbHMnXTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/index.d.ts b/build/src/index.d.ts new file mode 100644 index 0000000000..83e8aaa364 --- /dev/null +++ b/build/src/index.d.ts @@ -0,0 +1,27 @@ +import * as aggregate from './aggregate'; +import * as axis from './axis'; +import * as bin from './bin'; +import * as channel from './channel'; +import * as compositeMark from './compositemark'; +export { TopLevelSpec } from './spec'; +export { compile } from './compile/compile'; +export { Config } from './config'; +import * as config from './config'; +import * as data from './data'; +import * as datetime from './datetime'; +import * as encoding from './encoding'; +import * as facet from './facet'; +import * as fieldDef from './fielddef'; +import * as legend from './legend'; +import * as mark from './mark'; +import * as scale from './scale'; +import * as sort from './sort'; +import * as spec from './spec'; +import * as stack from './stack'; +import * as timeUnit from './timeunit'; +import * as transform from './transform'; +import * as type from './type'; +import * as util from './util'; +import * as validate from './validate'; +export { version } from './package.json'; +export { aggregate, axis, bin, channel, compositeMark, config, data, datetime, encoding, facet, fieldDef, legend, mark, scale, sort, spec, stack, timeUnit, transform, type, util, validate }; diff --git a/build/src/index.js b/build/src/index.js new file mode 100644 index 0000000000..52486e837f --- /dev/null +++ b/build/src/index.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var aggregate = tslib_1.__importStar(require("./aggregate")); +exports.aggregate = aggregate; +var axis = tslib_1.__importStar(require("./axis")); +exports.axis = axis; +var bin = tslib_1.__importStar(require("./bin")); +exports.bin = bin; +var channel = tslib_1.__importStar(require("./channel")); +exports.channel = channel; +var compositeMark = tslib_1.__importStar(require("./compositemark")); +exports.compositeMark = compositeMark; +var compile_1 = require("./compile/compile"); +exports.compile = compile_1.compile; +var config = tslib_1.__importStar(require("./config")); +exports.config = config; +var data = tslib_1.__importStar(require("./data")); +exports.data = data; +var datetime = tslib_1.__importStar(require("./datetime")); +exports.datetime = datetime; +var encoding = tslib_1.__importStar(require("./encoding")); +exports.encoding = encoding; +var facet = tslib_1.__importStar(require("./facet")); +exports.facet = facet; +var fieldDef = tslib_1.__importStar(require("./fielddef")); +exports.fieldDef = fieldDef; +var legend = tslib_1.__importStar(require("./legend")); +exports.legend = legend; +var mark = tslib_1.__importStar(require("./mark")); +exports.mark = mark; +var scale = tslib_1.__importStar(require("./scale")); +exports.scale = scale; +var sort = tslib_1.__importStar(require("./sort")); +exports.sort = sort; +var spec = tslib_1.__importStar(require("./spec")); +exports.spec = spec; +var stack = tslib_1.__importStar(require("./stack")); +exports.stack = stack; +var timeUnit = tslib_1.__importStar(require("./timeunit")); +exports.timeUnit = timeUnit; +var transform = tslib_1.__importStar(require("./transform")); +exports.transform = transform; +var type = tslib_1.__importStar(require("./type")); +exports.type = type; +var util = tslib_1.__importStar(require("./util")); +exports.util = util; +var validate = tslib_1.__importStar(require("./validate")); +exports.validate = validate; +var package_json_1 = require("./package.json"); +exports.version = package_json_1.version; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkRBQXlDO0FBOEJqQyw4QkFBUztBQTdCakIsbURBQStCO0FBNkJaLG9CQUFJO0FBNUJ2QixpREFBNkI7QUE0Qkosa0JBQUc7QUEzQjVCLHlEQUFxQztBQTJCUCwwQkFBTztBQTFCckMscUVBQWlEO0FBMEJWLHNDQUFhO0FBeEJwRCw2Q0FBMEM7QUFBbEMsNEJBQUEsT0FBTyxDQUFBO0FBRWYsdURBQW1DO0FBc0JtQix3QkFBTTtBQXJCNUQsbURBQStCO0FBcUIrQixvQkFBSTtBQXBCbEUsMkRBQXVDO0FBb0I2Qiw0QkFBUTtBQW5CNUUsMkRBQXVDO0FBbUJ1Qyw0QkFBUTtBQWxCdEYscURBQWlDO0FBa0J1RCxzQkFBSztBQWpCN0YsMkRBQXVDO0FBaUJ3RCw0QkFBUTtBQWhCdkcsdURBQW1DO0FBZ0JzRSx3QkFBTTtBQWYvRyxtREFBK0I7QUFla0Ysb0JBQUk7QUFkckgscURBQWlDO0FBY3NGLHNCQUFLO0FBYjVILG1EQUErQjtBQWErRixvQkFBSTtBQVpsSSxtREFBK0I7QUFZcUcsb0JBQUk7QUFYeEkscURBQWlDO0FBV3lHLHNCQUFLO0FBVi9JLDJEQUF1QztBQVUwRyw0QkFBUTtBQVR6Siw2REFBeUM7QUFTa0gsOEJBQVM7QUFScEssbURBQStCO0FBUXVJLG9CQUFJO0FBUDFLLG1EQUErQjtBQU82SSxvQkFBSTtBQU5oTCwyREFBdUM7QUFNMkksNEJBQVE7QUFKMUwsK0NBRXdCO0FBRHRCLGlDQUFBLE9BQU8sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFnZ3JlZ2F0ZSBmcm9tICcuL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQgKiBhcyBheGlzIGZyb20gJy4vYXhpcyc7XG5pbXBvcnQgKiBhcyBiaW4gZnJvbSAnLi9iaW4nO1xuaW1wb3J0ICogYXMgY2hhbm5lbCBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0ICogYXMgY29tcG9zaXRlTWFyayBmcm9tICcuL2NvbXBvc2l0ZW1hcmsnO1xuZXhwb3J0IHtUb3BMZXZlbFNwZWN9IGZyb20gJy4vc3BlYyc7XG5leHBvcnQge2NvbXBpbGV9IGZyb20gJy4vY29tcGlsZS9jb21waWxlJztcbmV4cG9ydCB7Q29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBjb25maWcgZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0ICogYXMgZGF0YSBmcm9tICcuL2RhdGEnO1xuaW1wb3J0ICogYXMgZGF0ZXRpbWUgZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBlbmNvZGluZyBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCAqIGFzIGZhY2V0IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0ICogYXMgZmllbGREZWYgZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsZWdlbmQgZnJvbSAnLi9sZWdlbmQnO1xuaW1wb3J0ICogYXMgbWFyayBmcm9tICcuL21hcmsnO1xuaW1wb3J0ICogYXMgc2NhbGUgZnJvbSAnLi9zY2FsZSc7XG5pbXBvcnQgKiBhcyBzb3J0IGZyb20gJy4vc29ydCc7XG5pbXBvcnQgKiBhcyBzcGVjIGZyb20gJy4vc3BlYyc7XG5pbXBvcnQgKiBhcyBzdGFjayBmcm9tICcuL3N0YWNrJztcbmltcG9ydCAqIGFzIHRpbWVVbml0IGZyb20gJy4vdGltZXVuaXQnO1xuaW1wb3J0ICogYXMgdHJhbnNmb3JtIGZyb20gJy4vdHJhbnNmb3JtJztcbmltcG9ydCAqIGFzIHR5cGUgZnJvbSAnLi90eXBlJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCAqIGFzIHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUnO1xuXG5leHBvcnQge1xuICB2ZXJzaW9uXG59IGZyb20gJy4vcGFja2FnZS5qc29uJztcblxuZXhwb3J0IHthZ2dyZWdhdGUsIGF4aXMsIGJpbiwgY2hhbm5lbCwgY29tcG9zaXRlTWFyaywgY29uZmlnLCBkYXRhLCBkYXRldGltZSwgZW5jb2RpbmcsIGZhY2V0LCBmaWVsZERlZiwgbGVnZW5kLCBtYXJrLCBzY2FsZSwgc29ydCwgc3BlYywgc3RhY2ssIHRpbWVVbml0LCB0cmFuc2Zvcm0sIHR5cGUsIHV0aWwsIHZhbGlkYXRlfTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/legend.d.ts b/build/src/legend.d.ts new file mode 100644 index 0000000000..9908fa6ddd --- /dev/null +++ b/build/src/legend.d.ts @@ -0,0 +1,64 @@ +import { DateTime } from './datetime'; +import { Guide, GuideEncodingEntry, VlOnlyGuideConfig } from './guide'; +import { VgLegendBase, VgLegendConfig } from './vega.schema'; +export interface LegendConfig extends VgLegendConfig, VlOnlyGuideConfig { +} +/** + * Properties of a legend or boolean flag for determining whether to show it. + */ +export interface Legend extends VgLegendBase, Guide { + /** + * Mark definitions for custom legend encoding. + * + * @hide + */ + encoding?: LegendEncoding; + /** + * The desired number of tick values for quantitative legends. + */ + tickCount?: number; + /** + * Explicitly set the visible legend values. + */ + values?: number[] | string[] | DateTime[]; + /** + * The type of the legend. Use `"symbol"` to create a discrete legend and `"gradient"` for a continuous color gradient. + * + * __Default value:__ `"gradient"` for non-binned quantitative fields and temporal fields; `"symbol"` otherwise. + */ + type?: 'symbol' | 'gradient'; + /** + * A non-positive integer indicating z-index of the legend. + * If zindex is 0, legend should be drawn behind all chart elements. + * To put them in front, use zindex = 1. + * @TJS-type integer + * @minimum 0 + */ + zindex?: number; +} +export declare type LegendEncoding = { + /** + * Custom encoding for the legend container. + * This can be useful for creating legend with custom x, y position. + */ + legend?: GuideEncodingEntry; + /** + * Custom encoding for the legend title text mark. + */ + title?: GuideEncodingEntry; + /** + * Custom encoding for legend label text marks. + */ + labels?: GuideEncodingEntry; + /** + * Custom encoding for legend symbol marks. + */ + symbols?: GuideEncodingEntry; + /** + * Custom encoding for legend gradient filled rect marks. + */ + gradient?: GuideEncodingEntry; +}; +export declare const defaultLegendConfig: LegendConfig; +export declare const LEGEND_PROPERTIES: ("title" | "padding" | "type" | "orient" | "zindex" | "tickCount" | "format" | "values" | "offset" | "entryPadding")[]; +export declare const VG_LEGEND_PROPERTIES: ("title" | "padding" | "type" | "shape" | "orient" | "zindex" | "tickCount" | "format" | "values" | "offset" | "encode" | "fill" | "stroke" | "opacity" | "size" | "entryPadding")[]; diff --git a/build/src/legend.js b/build/src/legend.js new file mode 100644 index 0000000000..68baeb90f8 --- /dev/null +++ b/build/src/legend.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var util_1 = require("./util"); +exports.defaultLegendConfig = {}; +var COMMON_LEGEND_PROPERTY_INDEX = { + entryPadding: 1, + format: 1, + offset: 1, + orient: 1, + padding: 1, + tickCount: 1, + title: 1, + type: 1, + values: 1, + zindex: 1 +}; +var VG_LEGEND_PROPERTY_INDEX = tslib_1.__assign({}, COMMON_LEGEND_PROPERTY_INDEX, { + // channel scales + opacity: 1, shape: 1, stroke: 1, fill: 1, size: 1, + // encode + encode: 1 }); +exports.LEGEND_PROPERTIES = util_1.flagKeys(COMMON_LEGEND_PROPERTY_INDEX); +exports.VG_LEGEND_PROPERTIES = util_1.flagKeys(VG_LEGEND_PROPERTY_INDEX); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xlZ2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSwrQkFBc0M7QUF3RXpCLFFBQUEsbUJBQW1CLEdBQWlCLEVBQUUsQ0FBQztBQUVwRCxJQUFNLDRCQUE0QixHQUFvQztJQUNwRSxZQUFZLEVBQUUsQ0FBQztJQUNmLE1BQU0sRUFBRSxDQUFDO0lBQ1QsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLENBQUM7SUFDWixLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7QUFFRixJQUFNLHdCQUF3Qix3QkFDekIsNEJBQTRCO0lBQy9CLGlCQUFpQjtJQUNqQixPQUFPLEVBQUUsQ0FBQyxFQUNWLEtBQUssRUFBRSxDQUFDLEVBQ1IsTUFBTSxFQUFFLENBQUMsRUFDVCxJQUFJLEVBQUUsQ0FBQyxFQUNQLElBQUksRUFBRSxDQUFDO0lBQ1AsU0FBUztJQUNULE1BQU0sRUFBRSxDQUFDLEdBQ1YsQ0FBQztBQUVXLFFBQUEsaUJBQWlCLEdBQUcsZUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUM7QUFFM0QsUUFBQSxvQkFBb0IsR0FBRyxlQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtHdWlkZSwgR3VpZGVFbmNvZGluZ0VudHJ5LCBWbE9ubHlHdWlkZUNvbmZpZ30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge0ZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtWZ0xlZ2VuZCwgVmdMZWdlbmRCYXNlLCBWZ0xlZ2VuZENvbmZpZ30gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBMZWdlbmRDb25maWcgZXh0ZW5kcyBWZ0xlZ2VuZENvbmZpZywgVmxPbmx5R3VpZGVDb25maWcge31cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIG9mIGEgbGVnZW5kIG9yIGJvb2xlYW4gZmxhZyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0byBzaG93IGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExlZ2VuZCBleHRlbmRzIFZnTGVnZW5kQmFzZSwgR3VpZGUge1xuICAvKipcbiAgICogTWFyayBkZWZpbml0aW9ucyBmb3IgY3VzdG9tIGxlZ2VuZCBlbmNvZGluZy5cbiAgICpcbiAgICogQGhpZGVcbiAgICovXG4gIGVuY29kaW5nPzogTGVnZW5kRW5jb2Rpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpcmVkIG51bWJlciBvZiB0aWNrIHZhbHVlcyBmb3IgcXVhbnRpdGF0aXZlIGxlZ2VuZHMuXG4gICAqL1xuICB0aWNrQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0bHkgc2V0IHRoZSB2aXNpYmxlIGxlZ2VuZCB2YWx1ZXMuXG4gICAqL1xuICB2YWx1ZXM/OiBudW1iZXJbXSB8IHN0cmluZ1tdIHwgRGF0ZVRpbWVbXTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhlIGxlZ2VuZC4gVXNlIGBcInN5bWJvbFwiYCB0byBjcmVhdGUgYSBkaXNjcmV0ZSBsZWdlbmQgYW5kIGBcImdyYWRpZW50XCJgIGZvciBhIGNvbnRpbnVvdXMgY29sb3IgZ3JhZGllbnQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJncmFkaWVudFwiYCBmb3Igbm9uLWJpbm5lZCBxdWFudGl0YXRpdmUgZmllbGRzIGFuZCB0ZW1wb3JhbCBmaWVsZHM7IGBcInN5bWJvbFwiYCBvdGhlcndpc2UuXG4gICAqL1xuICB0eXBlPzogJ3N5bWJvbCcgfCAnZ3JhZGllbnQnO1xuXG4gIC8qKlxuICAgKiBBIG5vbi1wb3NpdGl2ZSBpbnRlZ2VyIGluZGljYXRpbmcgei1pbmRleCBvZiB0aGUgbGVnZW5kLlxuICAgKiBJZiB6aW5kZXggaXMgMCwgbGVnZW5kIHNob3VsZCBiZSBkcmF3biBiZWhpbmQgYWxsIGNoYXJ0IGVsZW1lbnRzLlxuICAgKiBUbyBwdXQgdGhlbSBpbiBmcm9udCwgdXNlIHppbmRleCA9IDEuXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHppbmRleD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgTGVnZW5kRW5jb2RpbmcgPSB7XG4gIC8qKlxuICAgKiBDdXN0b20gZW5jb2RpbmcgZm9yIHRoZSBsZWdlbmQgY29udGFpbmVyLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGNyZWF0aW5nIGxlZ2VuZCB3aXRoIGN1c3RvbSB4LCB5IHBvc2l0aW9uLlxuICAgKi9cbiAgbGVnZW5kPzogR3VpZGVFbmNvZGluZ0VudHJ5O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZW5jb2RpbmcgZm9yIHRoZSBsZWdlbmQgdGl0bGUgdGV4dCBtYXJrLlxuICAgKi9cbiAgdGl0bGU/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgbGVnZW5kIGxhYmVsIHRleHQgbWFya3MuXG4gICAqL1xuICBsYWJlbHM/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgbGVnZW5kIHN5bWJvbCBtYXJrcy5cbiAgICovXG4gIHN5bWJvbHM/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgbGVnZW5kIGdyYWRpZW50IGZpbGxlZCByZWN0IG1hcmtzLlxuICAgKi9cbiAgZ3JhZGllbnQ/OiBHdWlkZUVuY29kaW5nRW50cnk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdExlZ2VuZENvbmZpZzogTGVnZW5kQ29uZmlnID0ge307XG5cbmNvbnN0IENPTU1PTl9MRUdFTkRfUFJPUEVSVFlfSU5ERVg6IEZsYWc8a2V5b2YgKFZnTGVnZW5kIHwgTGVnZW5kKT4gPSB7XG4gIGVudHJ5UGFkZGluZzogMSxcbiAgZm9ybWF0OiAxLFxuICBvZmZzZXQ6IDEsXG4gIG9yaWVudDogMSxcbiAgcGFkZGluZzogMSxcbiAgdGlja0NvdW50OiAxLFxuICB0aXRsZTogMSxcbiAgdHlwZTogMSxcbiAgdmFsdWVzOiAxLFxuICB6aW5kZXg6IDFcbn07XG5cbmNvbnN0IFZHX0xFR0VORF9QUk9QRVJUWV9JTkRFWDogRmxhZzxrZXlvZiBWZ0xlZ2VuZD4gPSB7XG4gIC4uLkNPTU1PTl9MRUdFTkRfUFJPUEVSVFlfSU5ERVgsXG4gIC8vIGNoYW5uZWwgc2NhbGVzXG4gIG9wYWNpdHk6IDEsXG4gIHNoYXBlOiAxLFxuICBzdHJva2U6IDEsXG4gIGZpbGw6IDEsXG4gIHNpemU6IDEsXG4gIC8vIGVuY29kZVxuICBlbmNvZGU6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBMRUdFTkRfUFJPUEVSVElFUyA9IGZsYWdLZXlzKENPTU1PTl9MRUdFTkRfUFJPUEVSVFlfSU5ERVgpO1xuXG5leHBvcnQgY29uc3QgVkdfTEVHRU5EX1BST1BFUlRJRVMgPSBmbGFnS2V5cyhWR19MRUdFTkRfUFJPUEVSVFlfSU5ERVgpO1xuIl19 \ No newline at end of file diff --git a/build/src/log.d.ts b/build/src/log.d.ts new file mode 100644 index 0000000000..cc2fe2c9ac --- /dev/null +++ b/build/src/log.d.ts @@ -0,0 +1,112 @@ +/** + * Vega-Lite's singleton logger utility. + */ +import { AggregateOp } from 'vega'; +import { LoggerInterface } from 'vega-util'; +import { Channel, GeoPositionChannel } from './channel'; +import { CompositeMark } from './compositemark'; +import { DateTime, DateTimeExpr } from './datetime'; +import { FieldDef } from './fielddef'; +import { Mark } from './mark'; +import { Projection } from './projection'; +import { ScaleType } from './scale'; +import { Type } from './type'; +import { VgSortField } from './vega.schema'; +export { LoggerInterface } from 'vega-util'; +/** + * Logger tool for checking if the code throws correct warning + */ +export declare class LocalLogger implements LoggerInterface { + warns: any[]; + infos: any[]; + debugs: any[]; + level(): this; + warn(...args: any[]): this; + info(...args: any[]): this; + debug(...args: any[]): this; +} +export declare function wrap(f: (logger: LocalLogger) => void): () => void; +/** + * Set the singleton logger to be a custom logger + */ +export declare function set(newLogger: LoggerInterface): LoggerInterface; +/** + * Reset the main logger to use the default Vega Logger + */ +export declare function reset(): LoggerInterface; +export declare function warn(..._: any[]): void; +export declare function info(..._: any[]): void; +export declare function debug(..._: any[]): void; +/** + * Collection of all Vega-Lite Error Messages + */ +export declare namespace message { + const INVALID_SPEC = "Invalid spec"; + const FIT_NON_SINGLE = "Autosize \"fit\" only works for single views and layered views."; + const CANNOT_FIX_RANGE_STEP_WITH_FIT = "Cannot use a fixed value of \"rangeStep\" when \"autosize\" is \"fit\"."; + function cannotProjectOnChannelWithoutField(channel: Channel): string; + function nearestNotSupportForContinuous(mark: string): string; + function selectionNotFound(name: string): string; + const SCALE_BINDINGS_CONTINUOUS = "Scale bindings are currently only supported for scales with unbinned, continuous domains."; + function noSuchRepeatedValue(field: string): string; + const CONCAT_CANNOT_SHARE_AXIS = "Axes cannot be shared in concatenated views."; + const REPEAT_CANNOT_SHARE_AXIS = "Axes cannot be shared in repeated views."; + function cannotSetTitleAnchor(type: string): string; + function unrecognizedParse(p: string): string; + function differentParse(field: string, local: string, ancestor: string): string; + function invalidTransformIgnored(transform: any): string; + const NO_FIELDS_NEEDS_AS = "If \"from.fields\" is not specified, \"as\" has to be a string that specifies the key to be used for the data from the secondary source."; + function encodingOverridden(channels: Channel[]): string; + function projectionOverridden(opt: { + parentProjection: Projection; + projection: Projection; + }): string; + function primitiveChannelDef(channel: Channel, type: 'string' | 'number' | 'boolean', value: string | number | boolean): string; + function invalidFieldType(type: Type): string; + function nonZeroScaleUsedWithLengthMark(mark: 'bar' | 'area', channel: Channel, opt: { + scaleType?: ScaleType; + zeroFalse?: boolean; + }): string; + function invalidFieldTypeForCountAggregate(type: Type, aggregate: string): string; + function invalidAggregate(aggregate: AggregateOp | string): string; + function emptyOrInvalidFieldType(type: Type | string, channel: Channel, newType: Type): string; + function droppingColor(type: 'encoding' | 'property', opt: { + fill?: boolean; + stroke?: boolean; + }): string; + function emptyFieldDef(fieldDef: FieldDef, channel: Channel): string; + function latLongDeprecated(channel: Channel, type: Type, newChannel: GeoPositionChannel): string; + const LINE_WITH_VARYING_SIZE = "Line marks cannot encode size with a non-groupby field. You may want to use trail marks instead."; + function incompatibleChannel(channel: Channel, markOrFacet: Mark | 'facet' | CompositeMark, when?: string): string; + function invalidEncodingChannel(channel: string): string; + function facetChannelShouldBeDiscrete(channel: string): string; + function discreteChannelCannotEncode(channel: Channel, type: Type): string; + const BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL = "Bar mark should not be used with point scale when rangeStep is null. Please use band scale instead."; + function lineWithRange(hasX2: boolean, hasY2: boolean): string; + function unclearOrientContinuous(mark: Mark): string; + function unclearOrientDiscreteOrEmpty(mark: Mark): string; + function orientOverridden(original: string, actual: string): string; + const CANNOT_UNION_CUSTOM_DOMAIN_WITH_FIELD_DOMAIN = "custom domain scale cannot be unioned with default field-based domain"; + function cannotUseScalePropertyWithNonColor(prop: string): string; + function unaggregateDomainHasNoEffectForRawField(fieldDef: FieldDef): string; + function unaggregateDomainWithNonSharedDomainOp(aggregate: string): string; + function unaggregatedDomainWithLogScale(fieldDef: FieldDef): string; + function cannotApplySizeToNonOrientedMark(mark: Mark): string; + function rangeStepDropped(channel: Channel): string; + function scaleTypeNotWorkWithChannel(channel: Channel, scaleType: ScaleType, defaultScaleType: ScaleType): string; + function scaleTypeNotWorkWithFieldDef(scaleType: ScaleType, defaultScaleType: ScaleType): string; + function scalePropertyNotWorkWithScaleType(scaleType: ScaleType, propName: string, channel: Channel): string; + function scaleTypeNotWorkWithMark(mark: Mark, scaleType: ScaleType): string; + function mergeConflictingProperty(property: string | number | symbol, propertyOf: string | number | symbol, v1: T, v2: T): string; + function independentScaleMeansIndependentGuide(channel: Channel): string; + function domainSortDropped(sort: VgSortField): string; + const UNABLE_TO_MERGE_DOMAINS = "Unable to merge domains"; + const MORE_THAN_ONE_SORT = "Domains that should be unioned has conflicting sort properties. Sort will be set to true."; + const INVALID_CHANNEL_FOR_AXIS = "Invalid channel for axis."; + function cannotStackRangedMark(channel: Channel): string; + function cannotStackNonLinearScale(scaleType: ScaleType): string; + function stackNonSummativeAggregate(aggregate: string): string; + function invalidTimeUnit(unitName: string, value: string | number): string; + function dayReplacedWithDate(fullTimeUnit: string): string; + function droppedDay(d: DateTime | DateTimeExpr): string; +} diff --git a/build/src/log.js b/build/src/log.js new file mode 100644 index 0000000000..22c0fbdfe9 --- /dev/null +++ b/build/src/log.js @@ -0,0 +1,326 @@ +"use strict"; +/** + * Vega-Lite's singleton logger utility. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var util_1 = require("./util"); +/** + * Main (default) Vega Logger instance for Vega-Lite + */ +var main = vega_util_1.logger(vega_util_1.Warn); +var current = main; +/** + * Logger tool for checking if the code throws correct warning + */ +var LocalLogger = /** @class */ (function () { + function LocalLogger() { + this.warns = []; + this.infos = []; + this.debugs = []; + } + LocalLogger.prototype.level = function () { + return this; + }; + LocalLogger.prototype.warn = function () { + var _a; + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + (_a = this.warns).push.apply(_a, args); + return this; + }; + LocalLogger.prototype.info = function () { + var _a; + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + (_a = this.infos).push.apply(_a, args); + return this; + }; + LocalLogger.prototype.debug = function () { + var _a; + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + (_a = this.debugs).push.apply(_a, args); + return this; + }; + return LocalLogger; +}()); +exports.LocalLogger = LocalLogger; +function wrap(f) { + return function () { + current = new LocalLogger(); + f(current); + reset(); + }; +} +exports.wrap = wrap; +/** + * Set the singleton logger to be a custom logger + */ +function set(newLogger) { + current = newLogger; + return current; +} +exports.set = set; +/** + * Reset the main logger to use the default Vega Logger + */ +function reset() { + current = main; + return current; +} +exports.reset = reset; +function warn() { + var _ = []; + for (var _i = 0; _i < arguments.length; _i++) { + _[_i] = arguments[_i]; + } + current.warn.apply(current, arguments); +} +exports.warn = warn; +function info() { + var _ = []; + for (var _i = 0; _i < arguments.length; _i++) { + _[_i] = arguments[_i]; + } + current.info.apply(current, arguments); +} +exports.info = info; +function debug() { + var _ = []; + for (var _i = 0; _i < arguments.length; _i++) { + _[_i] = arguments[_i]; + } + current.debug.apply(current, arguments); +} +exports.debug = debug; +/** + * Collection of all Vega-Lite Error Messages + */ +var message; +(function (message) { + message.INVALID_SPEC = 'Invalid spec'; + // FIT + message.FIT_NON_SINGLE = 'Autosize "fit" only works for single views and layered views.'; + message.CANNOT_FIX_RANGE_STEP_WITH_FIT = 'Cannot use a fixed value of "rangeStep" when "autosize" is "fit".'; + // SELECTION + function cannotProjectOnChannelWithoutField(channel) { + return "Cannot project a selection on encoding channel \"" + channel + "\", which has no field."; + } + message.cannotProjectOnChannelWithoutField = cannotProjectOnChannelWithoutField; + function nearestNotSupportForContinuous(mark) { + return "The \"nearest\" transform is not supported for " + mark + " marks."; + } + message.nearestNotSupportForContinuous = nearestNotSupportForContinuous; + function selectionNotFound(name) { + return "Cannot find a selection named \"" + name + "\""; + } + message.selectionNotFound = selectionNotFound; + message.SCALE_BINDINGS_CONTINUOUS = 'Scale bindings are currently only supported for scales with unbinned, continuous domains.'; + // REPEAT + function noSuchRepeatedValue(field) { + return "Unknown repeated value \"" + field + "\"."; + } + message.noSuchRepeatedValue = noSuchRepeatedValue; + // CONCAT + message.CONCAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in concatenated views.'; + // REPEAT + message.REPEAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in repeated views.'; + // TITLE + function cannotSetTitleAnchor(type) { + return "Cannot set title \"anchor\" for a " + type + " spec"; + } + message.cannotSetTitleAnchor = cannotSetTitleAnchor; + // DATA + function unrecognizedParse(p) { + return "Unrecognized parse \"" + p + "\"."; + } + message.unrecognizedParse = unrecognizedParse; + function differentParse(field, local, ancestor) { + return "An ancestor parsed field \"" + field + "\" as " + ancestor + " but a child wants to parse the field as " + local + "."; + } + message.differentParse = differentParse; + // TRANSFORMS + function invalidTransformIgnored(transform) { + return "Ignoring an invalid transform: " + util_1.stringify(transform) + "."; + } + message.invalidTransformIgnored = invalidTransformIgnored; + message.NO_FIELDS_NEEDS_AS = 'If "from.fields" is not specified, "as" has to be a string that specifies the key to be used for the data from the secondary source.'; + // ENCODING & FACET + function encodingOverridden(channels) { + return "Layer's shared " + channels.join(',') + " channel " + (channels.length === 1 ? 'is' : 'are') + " overriden"; + } + message.encodingOverridden = encodingOverridden; + function projectionOverridden(opt) { + var parentProjection = opt.parentProjection, projection = opt.projection; + return "Layer's shared projection " + util_1.stringify(parentProjection) + " is overridden by a child projection " + util_1.stringify(projection) + "."; + } + message.projectionOverridden = projectionOverridden; + function primitiveChannelDef(channel, type, value) { + return "Channel " + channel + " is a " + type + ". Converted to {value: " + util_1.stringify(value) + "}."; + } + message.primitiveChannelDef = primitiveChannelDef; + function invalidFieldType(type) { + return "Invalid field type \"" + type + "\""; + } + message.invalidFieldType = invalidFieldType; + function nonZeroScaleUsedWithLengthMark(mark, channel, opt) { + var scaleText = opt.scaleType ? opt.scaleType + " scale" : + opt.zeroFalse ? 'scale with zero=false' : + 'scale with custom domain that excludes zero'; + return "A " + scaleText + " is used with " + mark + " mark. This can be misleading as the " + (channel === 'x' ? 'width' : 'height') + " of the " + mark + " can be arbitrary based on the scale domain. You may want to use point mark instead."; + } + message.nonZeroScaleUsedWithLengthMark = nonZeroScaleUsedWithLengthMark; + function invalidFieldTypeForCountAggregate(type, aggregate) { + return "Invalid field type \"" + type + "\" for aggregate: \"" + aggregate + "\", using \"quantitative\" instead."; + } + message.invalidFieldTypeForCountAggregate = invalidFieldTypeForCountAggregate; + function invalidAggregate(aggregate) { + return "Invalid aggregation operator \"" + aggregate + "\""; + } + message.invalidAggregate = invalidAggregate; + function emptyOrInvalidFieldType(type, channel, newType) { + return "Invalid field type \"" + type + "\" for channel \"" + channel + "\", using \"" + newType + "\" instead."; + } + message.emptyOrInvalidFieldType = emptyOrInvalidFieldType; + function droppingColor(type, opt) { + var fill = opt.fill, stroke = opt.stroke; + return "Dropping color " + type + " as the plot also has " + (fill && stroke ? 'fill and stroke' : fill ? 'fill' : 'stroke'); + } + message.droppingColor = droppingColor; + function emptyFieldDef(fieldDef, channel) { + return "Dropping " + util_1.stringify(fieldDef) + " from channel \"" + channel + "\" since it does not contain data field or value."; + } + message.emptyFieldDef = emptyFieldDef; + function latLongDeprecated(channel, type, newChannel) { + return channel + "-encoding with type " + type + " is deprecated. Replacing with " + newChannel + "-encoding."; + } + message.latLongDeprecated = latLongDeprecated; + message.LINE_WITH_VARYING_SIZE = 'Line marks cannot encode size with a non-groupby field. You may want to use trail marks instead.'; + function incompatibleChannel(channel, markOrFacet, when) { + return channel + " dropped as it is incompatible with \"" + markOrFacet + "\"" + (when ? " when " + when : '') + "."; + } + message.incompatibleChannel = incompatibleChannel; + function invalidEncodingChannel(channel) { + return channel + "-encoding is dropped as " + channel + " is not a valid encoding channel."; + } + message.invalidEncodingChannel = invalidEncodingChannel; + function facetChannelShouldBeDiscrete(channel) { + return channel + " encoding should be discrete (ordinal / nominal / binned)."; + } + message.facetChannelShouldBeDiscrete = facetChannelShouldBeDiscrete; + function discreteChannelCannotEncode(channel, type) { + return "Using discrete channel \"" + channel + "\" to encode \"" + type + "\" field can be misleading as it does not encode " + (type === 'ordinal' ? 'order' : 'magnitude') + "."; + } + message.discreteChannelCannotEncode = discreteChannelCannotEncode; + // Mark + message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL = 'Bar mark should not be used with point scale when rangeStep is null. Please use band scale instead.'; + function lineWithRange(hasX2, hasY2) { + var channels = hasX2 && hasY2 ? 'x2 and y2' : hasX2 ? 'x2' : 'y2'; + return "Line mark is for continuous lines and thus cannot be used with " + channels + ". We will use the rule mark (line segments) instead."; + } + message.lineWithRange = lineWithRange; + function unclearOrientContinuous(mark) { + return "Cannot clearly determine orientation for \"" + mark + "\" since both x and y channel encode continuous fields. In this case, we use vertical by default"; + } + message.unclearOrientContinuous = unclearOrientContinuous; + function unclearOrientDiscreteOrEmpty(mark) { + return "Cannot clearly determine orientation for \"" + mark + "\" since both x and y channel encode discrete or empty fields."; + } + message.unclearOrientDiscreteOrEmpty = unclearOrientDiscreteOrEmpty; + function orientOverridden(original, actual) { + return "Specified orient \"" + original + "\" overridden with \"" + actual + "\""; + } + message.orientOverridden = orientOverridden; + // SCALE + message.CANNOT_UNION_CUSTOM_DOMAIN_WITH_FIELD_DOMAIN = 'custom domain scale cannot be unioned with default field-based domain'; + function cannotUseScalePropertyWithNonColor(prop) { + return "Cannot use the scale property \"" + prop + "\" with non-color channel."; + } + message.cannotUseScalePropertyWithNonColor = cannotUseScalePropertyWithNonColor; + function unaggregateDomainHasNoEffectForRawField(fieldDef) { + return "Using unaggregated domain with raw field has no effect (" + util_1.stringify(fieldDef) + ")."; + } + message.unaggregateDomainHasNoEffectForRawField = unaggregateDomainHasNoEffectForRawField; + function unaggregateDomainWithNonSharedDomainOp(aggregate) { + return "Unaggregated domain not applicable for \"" + aggregate + "\" since it produces values outside the origin domain of the source data."; + } + message.unaggregateDomainWithNonSharedDomainOp = unaggregateDomainWithNonSharedDomainOp; + function unaggregatedDomainWithLogScale(fieldDef) { + return "Unaggregated domain is currently unsupported for log scale (" + util_1.stringify(fieldDef) + ")."; + } + message.unaggregatedDomainWithLogScale = unaggregatedDomainWithLogScale; + function cannotApplySizeToNonOrientedMark(mark) { + return "Cannot apply size to non-oriented mark \"" + mark + "\"."; + } + message.cannotApplySizeToNonOrientedMark = cannotApplySizeToNonOrientedMark; + function rangeStepDropped(channel) { + return "rangeStep for \"" + channel + "\" is dropped as top-level " + (channel === 'x' ? 'width' : 'height') + " is provided."; + } + message.rangeStepDropped = rangeStepDropped; + function scaleTypeNotWorkWithChannel(channel, scaleType, defaultScaleType) { + return "Channel \"" + channel + "\" does not work with \"" + scaleType + "\" scale. We are using \"" + defaultScaleType + "\" scale instead."; + } + message.scaleTypeNotWorkWithChannel = scaleTypeNotWorkWithChannel; + function scaleTypeNotWorkWithFieldDef(scaleType, defaultScaleType) { + return "FieldDef does not work with \"" + scaleType + "\" scale. We are using \"" + defaultScaleType + "\" scale instead."; + } + message.scaleTypeNotWorkWithFieldDef = scaleTypeNotWorkWithFieldDef; + function scalePropertyNotWorkWithScaleType(scaleType, propName, channel) { + return channel + "-scale's \"" + propName + "\" is dropped as it does not work with " + scaleType + " scale."; + } + message.scalePropertyNotWorkWithScaleType = scalePropertyNotWorkWithScaleType; + function scaleTypeNotWorkWithMark(mark, scaleType) { + return "Scale type \"" + scaleType + "\" does not work with mark \"" + mark + "\"."; + } + message.scaleTypeNotWorkWithMark = scaleTypeNotWorkWithMark; + function mergeConflictingProperty(property, propertyOf, v1, v2) { + return "Conflicting " + propertyOf.toString() + " property \"" + property.toString() + "\" (" + util_1.stringify(v1) + " and " + util_1.stringify(v2) + "). Using " + util_1.stringify(v1) + "."; + } + message.mergeConflictingProperty = mergeConflictingProperty; + function independentScaleMeansIndependentGuide(channel) { + return "Setting the scale to be independent for \"" + channel + "\" means we also have to set the guide (axis or legend) to be independent."; + } + message.independentScaleMeansIndependentGuide = independentScaleMeansIndependentGuide; + function domainSortDropped(sort) { + return "Dropping sort property " + util_1.stringify(sort) + " as unioned domains only support boolean or op 'count'."; + } + message.domainSortDropped = domainSortDropped; + message.UNABLE_TO_MERGE_DOMAINS = 'Unable to merge domains'; + message.MORE_THAN_ONE_SORT = 'Domains that should be unioned has conflicting sort properties. Sort will be set to true.'; + // AXIS + message.INVALID_CHANNEL_FOR_AXIS = 'Invalid channel for axis.'; + // STACK + function cannotStackRangedMark(channel) { + return "Cannot stack \"" + channel + "\" if there is already \"" + channel + "2\""; + } + message.cannotStackRangedMark = cannotStackRangedMark; + function cannotStackNonLinearScale(scaleType) { + return "Cannot stack non-linear scale (" + scaleType + ")"; + } + message.cannotStackNonLinearScale = cannotStackNonLinearScale; + function stackNonSummativeAggregate(aggregate) { + return "Stacking is applied even though the aggregate function is non-summative (\"" + aggregate + "\")"; + } + message.stackNonSummativeAggregate = stackNonSummativeAggregate; + // TIMEUNIT + function invalidTimeUnit(unitName, value) { + return "Invalid " + unitName + ": " + util_1.stringify(value); + } + message.invalidTimeUnit = invalidTimeUnit; + function dayReplacedWithDate(fullTimeUnit) { + return "Time unit \"" + fullTimeUnit + "\" is not supported. We are replacing it with " + fullTimeUnit.replace('day', 'date') + "."; + } + message.dayReplacedWithDate = dayReplacedWithDate; + function droppedDay(d) { + return "Dropping day from datetime " + util_1.stringify(d) + " as day cannot be combined with other units."; + } + message.droppedDay = droppedDay; +})(message = exports.message || (exports.message = {})); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBR0gsdUNBQXdEO0FBU3hELCtCQUFpQztBQU1qQzs7R0FFRztBQUNILElBQU0sSUFBSSxHQUFHLGtCQUFNLENBQUMsZ0JBQUksQ0FBQyxDQUFDO0FBQzFCLElBQUksT0FBTyxHQUFvQixJQUFJLENBQUM7QUFFcEM7O0dBRUc7QUFDSDtJQUFBO1FBQ1MsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLFdBQU0sR0FBVSxFQUFFLENBQUM7SUFvQjVCLENBQUM7SUFsQlEsMkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDBCQUFJLEdBQVg7O1FBQVksY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDeEIsQ0FBQSxLQUFBLElBQUksQ0FBQyxLQUFLLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDBCQUFJLEdBQVg7O1FBQVksY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDeEIsQ0FBQSxLQUFBLElBQUksQ0FBQyxLQUFLLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDJCQUFLLEdBQVo7O1FBQWEsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDekIsQ0FBQSxLQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxFQUFFO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQXZCRCxJ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MkYsQ0FBQztJQUU5SCxPQUFPO0lBQ00sZ0NBQXdCLEdBQUcsMkJBQTJCLENBQUM7SUFFcEUsUUFBUTtJQUNSLCtCQUFzQyxPQUFnQjtRQUNwRCxPQUFPLG9CQUFpQixPQUFPLGlDQUEwQixPQUFPLFFBQUksQ0FBQztJQUN2RSxDQUFDO0lBRmUsNkJBQXFCLHdCQUVwQyxDQUFBO0lBRUQsbUNBQTBDLFNBQW9CO1FBQzVELE9BQU8sb0NBQWtDLFNBQVMsTUFBRyxDQUFDO0lBQ3hELENBQUM7SUFGZSxpQ0FBeUIsNEJBRXhDLENBQUE7SUFFRCxvQ0FBMkMsU0FBaUI7UUFDMUQsT0FBTyxnRkFBNkUsU0FBUyxRQUFJLENBQUM7SUFDcEcsQ0FBQztJQUZlLGtDQUEwQiw2QkFFekMsQ0FBQTtJQUVELFdBQVc7SUFDWCx5QkFBZ0MsUUFBZ0IsRUFBRSxLQUFzQjtRQUN0RSxPQUFPLGFBQVcsUUFBUSxVQUFLLGdCQUFTLENBQUMsS0FBSyxDQUFHLENBQUM7SUFDcEQsQ0FBQztJQUZlLHVCQUFlLGtCQUU5QixDQUFBO0lBRUQsNkJBQW9DLFlBQW9CO1FBQ3RELE9BQU8saUJBQWMsWUFBWSxzREFDL0IsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQUcsQ0FBQztJQUMzQyxDQUFDO0lBSGUsMkJBQW1CLHNCQUdsQyxDQUFBO0lBRUQsb0JBQTJCLENBQTBCO1FBQ25ELE9BQU8sZ0NBQThCLGdCQUFTLENBQUMsQ0FBQyxDQUFDLGlEQUE4QyxDQUFDO0lBQ2xHLENBQUM7SUFGZSxrQkFBVSxhQUV6QixDQUFBO0FBQ0gsQ0FBQyxFQTVPZ0IsT0FBTyxHQUFQLGVBQU8sS0FBUCxlQUFPLFFBNE92QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVnYS1MaXRlJ3Mgc2luZ2xldG9uIGxvZ2dlciB1dGlsaXR5LlxuICovXG5cbmltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtsb2dnZXIsIExvZ2dlckludGVyZmFjZSwgV2Fybn0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgR2VvUG9zaXRpb25DaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtDb21wb3NpdGVNYXJrfSBmcm9tICcuL2NvbXBvc2l0ZW1hcmsnO1xuaW1wb3J0IHtEYXRlVGltZSwgRGF0ZVRpbWVFeHByfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtQcm9qZWN0aW9ufSBmcm9tICcuL3Byb2plY3Rpb24nO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4vc2NhbGUnO1xuaW1wb3J0IHtUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtzdHJpbmdpZnl9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge1ZnU29ydEZpZWxkfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQge0xvZ2dlckludGVyZmFjZX0gZnJvbSAndmVnYS11dGlsJztcblxuLyoqXG4gKiBNYWluIChkZWZhdWx0KSBWZWdhIExvZ2dlciBpbnN0YW5jZSBmb3IgVmVnYS1MaXRlXG4gKi9cbmNvbnN0IG1haW4gPSBsb2dnZXIoV2Fybik7XG5sZXQgY3VycmVudDogTG9nZ2VySW50ZXJmYWNlID0gbWFpbjtcblxuLyoqXG4gKiBMb2dnZXIgdG9vbCBmb3IgY2hlY2tpbmcgaWYgdGhlIGNvZGUgdGhyb3dzIGNvcnJlY3Qgd2FybmluZ1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWxMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXJJbnRlcmZhY2Uge1xuICBwdWJsaWMgd2FybnM6IGFueVtdID0gW107XG4gIHB1YmxpYyBpbmZvczogYW55W10gPSBbXTtcbiAgcHVibGljIGRlYnVnczogYW55W10gPSBbXTtcblxuICBwdWJsaWMgbGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgd2FybiguLi5hcmdzOiBhbnlbXSkge1xuICAgIHRoaXMud2FybnMucHVzaCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBpbmZvKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5pbmZvcy5wdXNoKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5kZWJ1Z3MucHVzaCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcChmOiAobG9nZ2VyOiBMb2NhbExvZ2dlcikgPT4gdm9pZCkge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGN1cnJlbnQgPSBuZXcgTG9jYWxMb2dnZXIoKTtcbiAgICBmKGN1cnJlbnQgYXMgTG9jYWxMb2dnZXIpO1xuICAgIHJlc2V0KCk7XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHRoZSBzaW5nbGV0b24gbG9nZ2VyIHRvIGJlIGEgY3VzdG9tIGxvZ2dlclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5ld0xvZ2dlcjogTG9nZ2VySW50ZXJmYWNlKSB7XG4gIGN1cnJlbnQgPSBuZXdMb2dnZXI7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBtYWluIGxvZ2dlciB0byB1c2UgdGhlIGRlZmF1bHQgVmVnYSBMb2dnZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjdXJyZW50ID0gbWFpbjtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKC4uLl86IGFueVtdKSB7XG4gIGN1cnJlbnQud2Fybi5hcHBseShjdXJyZW50LCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mbyguLi5fOiBhbnlbXSkge1xuICBjdXJyZW50LmluZm8uYXBwbHkoY3VycmVudCwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKC4uLl86IGFueVtdKSB7XG4gIGN1cnJlbnQuZGVidWcuYXBwbHkoY3VycmVudCwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGFsbCBWZWdhLUxpdGUgRXJyb3IgTWVzc2FnZXNcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBtZXNzYWdlIHtcbiAgZXhwb3J0IGNvbnN0IElOVkFMSURfU1BFQyA9ICdJbnZhbGlkIHNwZWMnO1xuXG4gIC8vIEZJVFxuICBleHBvcnQgY29uc3QgRklUX05PTl9TSU5HTEUgPSAnQXV0b3NpemUgXCJmaXRcIiBvbmx5IHdvcmtzIGZvciBzaW5nbGUgdmlld3MgYW5kIGxheWVyZWQgdmlld3MuJztcblxuICBleHBvcnQgY29uc3QgQ0FOTk9UX0ZJWF9SQU5HRV9TVEVQX1dJVEhfRklUID0gJ0Nhbm5vdCB1c2UgYSBmaXhlZCB2YWx1ZSBvZiBcInJhbmdlU3RlcFwiIHdoZW4gXCJhdXRvc2l6ZVwiIGlzIFwiZml0XCIuJztcblxuICAvLyBTRUxFQ1RJT05cbiAgZXhwb3J0IGZ1bmN0aW9uIGNhbm5vdFByb2plY3RPbkNoYW5uZWxXaXRob3V0RmllbGQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgQ2Fubm90IHByb2plY3QgYSBzZWxlY3Rpb24gb24gZW5jb2RpbmcgY2hhbm5lbCBcIiR7Y2hhbm5lbH1cIiwgd2hpY2ggaGFzIG5vIGZpZWxkLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbmVhcmVzdE5vdFN1cHBvcnRGb3JDb250aW51b3VzKG1hcms6IHN0cmluZykge1xuICAgIHJldHVybiBgVGhlIFwibmVhcmVzdFwiIHRyYW5zZm9ybSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke21hcmt9IG1hcmtzLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uTm90Rm91bmQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBDYW5ub3QgZmluZCBhIHNlbGVjdGlvbiBuYW1lZCBcIiR7bmFtZX1cImA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgU0NBTEVfQklORElOR1NfQ09OVElOVU9VUyA9ICdTY2FsZSBiaW5kaW5ncyBhcmUgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBzY2FsZXMgd2l0aCB1bmJpbm5lZCwgY29udGludW91cyBkb21haW5zLic7XG5cbiAgLy8gUkVQRUFUXG4gIGV4cG9ydCBmdW5jdGlvbiBub1N1Y2hSZXBlYXRlZFZhbHVlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFVua25vd24gcmVwZWF0ZWQgdmFsdWUgXCIke2ZpZWxkfVwiLmA7XG4gIH1cblxuICAvLyBDT05DQVRcbiAgZXhwb3J0IGNvbnN0IENPTkNBVF9DQU5OT1RfU0hBUkVfQVhJUyA9ICdBeGVzIGNhbm5vdCBiZSBzaGFyZWQgaW4gY29uY2F0ZW5hdGVkIHZpZXdzLic7XG5cbiAgLy8gUkVQRUFUXG4gIGV4cG9ydCBjb25zdCBSRVBFQVRfQ0FOTk9UX1NIQVJFX0FYSVMgPSAnQXhlcyBjYW5ub3QgYmUgc2hhcmVkIGluIHJlcGVhdGVkIHZpZXdzLic7XG5cbiAgLy8gVElUTEVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNhbm5vdFNldFRpdGxlQW5jaG9yKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBgQ2Fubm90IHNldCB0aXRsZSBcImFuY2hvclwiIGZvciBhICR7dHlwZX0gc3BlY2A7XG4gIH1cblxuICAvLyBEQVRBXG4gIGV4cG9ydCBmdW5jdGlvbiB1bnJlY29nbml6ZWRQYXJzZShwOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFVucmVjb2duaXplZCBwYXJzZSBcIiR7cH1cIi5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVudFBhcnNlKGZpZWxkOiBzdHJpbmcsIGxvY2FsOiBzdHJpbmcsIGFuY2VzdG9yOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEFuIGFuY2VzdG9yIHBhcnNlZCBmaWVsZCBcIiR7ZmllbGR9XCIgYXMgJHthbmNlc3Rvcn0gYnV0IGEgY2hpbGQgd2FudHMgdG8gcGFyc2UgdGhlIGZpZWxkIGFzICR7bG9jYWx9LmA7XG4gIH1cblxuICAvLyBUUkFOU0ZPUk1TXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkVHJhbnNmb3JtSWdub3JlZCh0cmFuc2Zvcm06IGFueSkge1xuICAgIHJldHVybiBgSWdub3JpbmcgYW4gaW52YWxpZCB0cmFuc2Zvcm06ICR7c3RyaW5naWZ5KHRyYW5zZm9ybSl9LmA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgTk9fRklFTERTX05FRURTX0FTID0gJ0lmIFwiZnJvbS5maWVsZHNcIiBpcyBub3Qgc3BlY2lmaWVkLCBcImFzXCIgaGFzIHRvIGJlIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgdGhlIGRhdGEgZnJvbSB0aGUgc2Vjb25kYXJ5IHNvdXJjZS4nO1xuXG4gIC8vIEVOQ09ESU5HICYgRkFDRVRcblxuICBleHBvcnQgZnVuY3Rpb24gZW5jb2RpbmdPdmVycmlkZGVuKGNoYW5uZWxzOiBDaGFubmVsW10pIHtcbiAgICByZXR1cm4gYExheWVyJ3Mgc2hhcmVkICR7Y2hhbm5lbHMuam9pbignLCcpfSBjaGFubmVsICR7Y2hhbm5lbHMubGVuZ3RoID09PSAxID8gJ2lzJyA6ICdhcmUnfSBvdmVycmlkZW5gO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uT3ZlcnJpZGRlbihvcHQ6IHtwYXJlbnRQcm9qZWN0aW9uOiBQcm9qZWN0aW9uLCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9ufSkge1xuICAgIGNvbnN0IHtwYXJlbnRQcm9qZWN0aW9uLCBwcm9qZWN0aW9ufSA9IG9wdDtcbiAgICByZXR1cm4gYExheWVyJ3Mgc2hhcmVkIHByb2plY3Rpb24gJHtzdHJpbmdpZnkocGFyZW50UHJvamVjdGlvbil9IGlzIG92ZXJyaWRkZW4gYnkgYSBjaGlsZCBwcm9qZWN0aW9uICR7c3RyaW5naWZ5KHByb2plY3Rpb24pfS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHByaW1pdGl2ZUNoYW5uZWxEZWYoY2hhbm5lbDogQ2hhbm5lbCwgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gYENoYW5uZWwgJHtjaGFubmVsfSBpcyBhICR7dHlwZX0uIENvbnZlcnRlZCB0byB7dmFsdWU6ICR7c3RyaW5naWZ5KHZhbHVlKX19LmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaW52YWxpZEZpZWxkVHlwZSh0eXBlOiBUeXBlKSB7XG4gICAgcmV0dXJuIGBJbnZhbGlkIGZpZWxkIHR5cGUgXCIke3R5cGV9XCJgO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG5vblplcm9TY2FsZVVzZWRXaXRoTGVuZ3RoTWFyayhcbiAgICBtYXJrOiAnYmFyJyB8ICdhcmVhJywgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBvcHQ6IHtzY2FsZVR5cGU/OiBTY2FsZVR5cGUsIHplcm9GYWxzZT86IGJvb2xlYW59XG4gICkge1xuICAgIGNvbnN0IHNjYWxlVGV4dCA9IG9wdC5zY2FsZVR5cGUgPyBgJHtvcHQuc2NhbGVUeXBlfSBzY2FsZWAgOlxuICAgICAgb3B0Lnplcm9GYWxzZSA/ICdzY2FsZSB3aXRoIHplcm89ZmFsc2UnIDpcbiAgICAgICdzY2FsZSB3aXRoIGN1c3RvbSBkb21haW4gdGhhdCBleGNsdWRlcyB6ZXJvJztcblxuICAgIHJldHVybiBgQSAke3NjYWxlVGV4dH0gaXMgdXNlZCB3aXRoICR7bWFya30gbWFyay4gVGhpcyBjYW4gYmUgbWlzbGVhZGluZyBhcyB0aGUgJHtjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogJ2hlaWdodCd9IG9mIHRoZSAke21hcmt9IGNhbiBiZSBhcmJpdHJhcnkgYmFzZWQgb24gdGhlIHNjYWxlIGRvbWFpbi4gWW91IG1heSB3YW50IHRvIHVzZSBwb2ludCBtYXJrIGluc3RlYWQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkRmllbGRUeXBlRm9yQ291bnRBZ2dyZWdhdGUodHlwZTogVHlwZSwgYWdncmVnYXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEludmFsaWQgZmllbGQgdHlwZSBcIiR7dHlwZX1cIiBmb3IgYWdncmVnYXRlOiBcIiR7YWdncmVnYXRlfVwiLCB1c2luZyBcInF1YW50aXRhdGl2ZVwiIGluc3RlYWQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkQWdncmVnYXRlKGFnZ3JlZ2F0ZTogQWdncmVnYXRlT3AgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEludmFsaWQgYWdncmVnYXRpb24gb3BlcmF0b3IgXCIke2FnZ3JlZ2F0ZX1cImA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1wdHlPckludmFsaWRGaWVsZFR5cGUodHlwZTogVHlwZSB8IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbCwgbmV3VHlwZTogVHlwZSkge1xuICAgIHJldHVybiBgSW52YWxpZCBmaWVsZCB0eXBlIFwiJHt0eXBlfVwiIGZvciBjaGFubmVsIFwiJHtjaGFubmVsfVwiLCB1c2luZyBcIiR7bmV3VHlwZX1cIiBpbnN0ZWFkLmA7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGRyb3BwaW5nQ29sb3IodHlwZTogJ2VuY29kaW5nJyB8ICdwcm9wZXJ0eScsIG9wdDoge2ZpbGw/OiBib29sZWFuLCBzdHJva2U/OiBib29sZWFufSkge1xuICAgIGNvbnN0IHtmaWxsLCBzdHJva2V9ID0gb3B0O1xuICAgIHJldHVybiBgRHJvcHBpbmcgY29sb3IgJHt0eXBlfSBhcyB0aGUgcGxvdCBhbHNvIGhhcyBgICsgKFxuICAgICAgZmlsbCAmJiBzdHJva2UgPyAnZmlsbCBhbmQgc3Ryb2tlJyA6IGZpbGwgPyAnZmlsbCcgOiAnc3Ryb2tlJ1xuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1wdHlGaWVsZERlZihmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgRHJvcHBpbmcgJHtzdHJpbmdpZnkoZmllbGREZWYpfSBmcm9tIGNoYW5uZWwgXCIke2NoYW5uZWx9XCIgc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiBkYXRhIGZpZWxkIG9yIHZhbHVlLmA7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxhdExvbmdEZXByZWNhdGVkKGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IFR5cGUsIG5ld0NoYW5uZWw6IEdlb1Bvc2l0aW9uQ2hhbm5lbCkge1xuICAgIHJldHVybiBgJHtjaGFubmVsfS1lbmNvZGluZyB3aXRoIHR5cGUgJHt0eXBlfSBpcyBkZXByZWNhdGVkLiBSZXBsYWNpbmcgd2l0aCAke25ld0NoYW5uZWx9LWVuY29kaW5nLmA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgTElORV9XSVRIX1ZBUllJTkdfU0laRSA9ICdMaW5lIG1hcmtzIGNhbm5vdCBlbmNvZGUgc2l6ZSB3aXRoIGEgbm9uLWdyb3VwYnkgZmllbGQuIFlvdSBtYXkgd2FudCB0byB1c2UgdHJhaWwgbWFya3MgaW5zdGVhZC4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNvbXBhdGlibGVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwsIG1hcmtPckZhY2V0OiBNYXJrIHwgJ2ZhY2V0JyB8IENvbXBvc2l0ZU1hcmssIHdoZW4/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7Y2hhbm5lbH0gZHJvcHBlZCBhcyBpdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBcIiR7bWFya09yRmFjZXR9XCIke3doZW4gPyBgIHdoZW4gJHt3aGVufWAgOiAnJ30uYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkRW5jb2RpbmdDaGFubmVsKGNoYW5uZWw6IHN0cmluZykge1xuICAgIHJldHVybiBgJHtjaGFubmVsfS1lbmNvZGluZyBpcyBkcm9wcGVkIGFzICR7Y2hhbm5lbH0gaXMgbm90IGEgdmFsaWQgZW5jb2RpbmcgY2hhbm5lbC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZhY2V0Q2hhbm5lbFNob3VsZEJlRGlzY3JldGUoY2hhbm5lbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2NoYW5uZWx9IGVuY29kaW5nIHNob3VsZCBiZSBkaXNjcmV0ZSAob3JkaW5hbCAvIG5vbWluYWwgLyBiaW5uZWQpLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IFR5cGUpIHtcbiAgICByZXR1cm4gYFVzaW5nIGRpc2NyZXRlIGNoYW5uZWwgXCIke2NoYW5uZWx9XCIgdG8gZW5jb2RlIFwiJHt0eXBlfVwiIGZpZWxkIGNhbiBiZSBtaXNsZWFkaW5nIGFzIGl0IGRvZXMgbm90IGVuY29kZSAke3R5cGUgPT09ICdvcmRpbmFsJyA/ICdvcmRlcicgOiAnbWFnbml0dWRlJ30uYDtcbiAgfVxuXG4gIC8vIE1hcmtcbiAgZXhwb3J0IGNvbnN0IEJBUl9XSVRIX1BPSU5UX1NDQUxFX0FORF9SQU5HRVNURVBfTlVMTCA9ICdCYXIgbWFyayBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBwb2ludCBzY2FsZSB3aGVuIHJhbmdlU3RlcCBpcyBudWxsLiBQbGVhc2UgdXNlIGJhbmQgc2NhbGUgaW5zdGVhZC4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBsaW5lV2l0aFJhbmdlKGhhc1gyOiBib29sZWFuLCBoYXNZMjogYm9vbGVhbikge1xuICAgIGNvbnN0IGNoYW5uZWxzID0gaGFzWDIgJiYgaGFzWTIgPyAneDIgYW5kIHkyJyA6IGhhc1gyID8gJ3gyJyA6ICd5Mic7XG4gICAgcmV0dXJuIGBMaW5lIG1hcmsgaXMgZm9yIGNvbnRpbnVvdXMgbGluZXMgYW5kIHRodXMgY2Fubm90IGJlIHVzZWQgd2l0aCAke2NoYW5uZWxzfS4gV2Ugd2lsbCB1c2UgdGhlIHJ1bGUgbWFyayAobGluZSBzZWdtZW50cykgaW5zdGVhZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuY2xlYXJPcmllbnRDb250aW51b3VzKG1hcms6IE1hcmspIHtcbiAgICByZXR1cm4gYENhbm5vdCBjbGVhcmx5IGRldGVybWluZSBvcmllbnRhdGlvbiBmb3IgXCIke21hcmt9XCIgc2luY2UgYm90aCB4IGFuZCB5IGNoYW5uZWwgZW5jb2RlIGNvbnRpbnVvdXMgZmllbGRzLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB2ZXJ0aWNhbCBieSBkZWZhdWx0YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB1bmNsZWFyT3JpZW50RGlzY3JldGVPckVtcHR5KG1hcms6IE1hcmspIHtcbiAgICByZXR1cm4gYENhbm5vdCBjbGVhcmx5IGRldGVybWluZSBvcmllbnRhdGlvbiBmb3IgXCIke21hcmt9XCIgc2luY2UgYm90aCB4IGFuZCB5IGNoYW5uZWwgZW5jb2RlIGRpc2NyZXRlIG9yIGVtcHR5IGZpZWxkcy5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9yaWVudE92ZXJyaWRkZW4ob3JpZ2luYWw6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFNwZWNpZmllZCBvcmllbnQgXCIke29yaWdpbmFsfVwiIG92ZXJyaWRkZW4gd2l0aCBcIiR7YWN0dWFsfVwiYDtcbiAgfVxuXG4gIC8vIFNDQUxFXG4gIGV4cG9ydCBjb25zdCBDQU5OT1RfVU5JT05fQ1VTVE9NX0RPTUFJTl9XSVRIX0ZJRUxEX0RPTUFJTiA9ICdjdXN0b20gZG9tYWluIHNjYWxlIGNhbm5vdCBiZSB1bmlvbmVkIHdpdGggZGVmYXVsdCBmaWVsZC1iYXNlZCBkb21haW4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RVc2VTY2FsZVByb3BlcnR5V2l0aE5vbkNvbG9yKHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiBgQ2Fubm90IHVzZSB0aGUgc2NhbGUgcHJvcGVydHkgXCIke3Byb3B9XCIgd2l0aCBub24tY29sb3IgY2hhbm5lbC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlRG9tYWluSGFzTm9FZmZlY3RGb3JSYXdGaWVsZChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPikge1xuICAgIHJldHVybiBgVXNpbmcgdW5hZ2dyZWdhdGVkIGRvbWFpbiB3aXRoIHJhdyBmaWVsZCBoYXMgbm8gZWZmZWN0ICgke3N0cmluZ2lmeShmaWVsZERlZil9KS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlRG9tYWluV2l0aE5vblNoYXJlZERvbWFpbk9wKGFnZ3JlZ2F0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBVbmFnZ3JlZ2F0ZWQgZG9tYWluIG5vdCBhcHBsaWNhYmxlIGZvciBcIiR7YWdncmVnYXRlfVwiIHNpbmNlIGl0IHByb2R1Y2VzIHZhbHVlcyBvdXRzaWRlIHRoZSBvcmlnaW4gZG9tYWluIG9mIHRoZSBzb3VyY2UgZGF0YS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlZERvbWFpbldpdGhMb2dTY2FsZShmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPikge1xuICAgIHJldHVybiBgVW5hZ2dyZWdhdGVkIGRvbWFpbiBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZm9yIGxvZyBzY2FsZSAoJHtzdHJpbmdpZnkoZmllbGREZWYpfSkuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RBcHBseVNpemVUb05vbk9yaWVudGVkTWFyayhtYXJrOiBNYXJrKSB7XG4gICAgcmV0dXJuIGBDYW5ub3QgYXBwbHkgc2l6ZSB0byBub24tb3JpZW50ZWQgbWFyayBcIiR7bWFya31cIi5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJhbmdlU3RlcERyb3BwZWQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgcmFuZ2VTdGVwIGZvciBcIiR7Y2hhbm5lbH1cIiBpcyBkcm9wcGVkIGFzIHRvcC1sZXZlbCAke1xuICAgICAgY2hhbm5lbCA9PT0gJ3gnID8gJ3dpZHRoJyA6ICdoZWlnaHQnfSBpcyBwcm92aWRlZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgZGVmYXVsdFNjYWxlVHlwZTogU2NhbGVUeXBlKSB7XG4gICAgcmV0dXJuIGBDaGFubmVsIFwiJHtjaGFubmVsfVwiIGRvZXMgbm90IHdvcmsgd2l0aCBcIiR7c2NhbGVUeXBlfVwiIHNjYWxlLiBXZSBhcmUgdXNpbmcgXCIke2RlZmF1bHRTY2FsZVR5cGV9XCIgc2NhbGUgaW5zdGVhZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoRmllbGREZWYoc2NhbGVUeXBlOiBTY2FsZVR5cGUsIGRlZmF1bHRTY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICAgIHJldHVybiBgRmllbGREZWYgZG9lcyBub3Qgd29yayB3aXRoIFwiJHtzY2FsZVR5cGV9XCIgc2NhbGUuIFdlIGFyZSB1c2luZyBcIiR7ZGVmYXVsdFNjYWxlVHlwZX1cIiBzY2FsZSBpbnN0ZWFkLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc2NhbGVQcm9wZXJ0eU5vdFdvcmtXaXRoU2NhbGVUeXBlKHNjYWxlVHlwZTogU2NhbGVUeXBlLCBwcm9wTmFtZTogc3RyaW5nLCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgcmV0dXJuIGAke2NoYW5uZWx9LXNjYWxlJ3MgXCIke3Byb3BOYW1lfVwiIGlzIGRyb3BwZWQgYXMgaXQgZG9lcyBub3Qgd29yayB3aXRoICR7c2NhbGVUeXBlfSBzY2FsZS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhtYXJrOiBNYXJrLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICAgIHJldHVybiBgU2NhbGUgdHlwZSBcIiR7c2NhbGVUeXBlfVwiIGRvZXMgbm90IHdvcmsgd2l0aCBtYXJrIFwiJHttYXJrfVwiLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25mbGljdGluZ1Byb3BlcnR5PFQ+KHByb3BlcnR5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHByb3BlcnR5T2Y6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdjE6IFQsIHYyOiBUKSB7XG4gICAgcmV0dXJuIGBDb25mbGljdGluZyAke3Byb3BlcnR5T2YudG9TdHJpbmcoKX0gcHJvcGVydHkgXCIke3Byb3BlcnR5LnRvU3RyaW5nKCl9XCIgKCR7c3RyaW5naWZ5KHYxKX0gYW5kICR7c3RyaW5naWZ5KHYyKX0pLiAgVXNpbmcgJHtzdHJpbmdpZnkodjEpfS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluZGVwZW5kZW50U2NhbGVNZWFuc0luZGVwZW5kZW50R3VpZGUoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgU2V0dGluZyB0aGUgc2NhbGUgdG8gYmUgaW5kZXBlbmRlbnQgZm9yIFwiJHtjaGFubmVsfVwiIG1lYW5zIHdlIGFsc28gaGF2ZSB0byBzZXQgdGhlIGd1aWRlIChheGlzIG9yIGxlZ2VuZCkgdG8gYmUgaW5kZXBlbmRlbnQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkb21haW5Tb3J0RHJvcHBlZChzb3J0OiBWZ1NvcnRGaWVsZCkge1xuICAgIHJldHVybiBgRHJvcHBpbmcgc29ydCBwcm9wZXJ0eSAke3N0cmluZ2lmeShzb3J0KX0gYXMgdW5pb25lZCBkb21haW5zIG9ubHkgc3VwcG9ydCBib29sZWFuIG9yIG9wICdjb3VudCcuYDtcbiAgfVxuXG4gIGV4cG9ydCBjb25zdCBVTkFCTEVfVE9fTUVSR0VfRE9NQUlOUyA9ICdVbmFibGUgdG8gbWVyZ2UgZG9tYWlucyc7XG5cbiAgZXhwb3J0IGNvbnN0IE1PUkVfVEhBTl9PTkVfU09SVCA9ICdEb21haW5zIHRoYXQgc2hvdWxkIGJlIHVuaW9uZWQgaGFzIGNvbmZsaWN0aW5nIHNvcnQgcHJvcGVydGllcy4gU29ydCB3aWxsIGJlIHNldCB0byB0cnVlLic7XG5cbiAgLy8gQVhJU1xuICBleHBvcnQgY29uc3QgSU5WQUxJRF9DSEFOTkVMX0ZPUl9BWElTID0gJ0ludmFsaWQgY2hhbm5lbCBmb3IgYXhpcy4nO1xuXG4gIC8vIFNUQUNLXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RTdGFja1JhbmdlZE1hcmsoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgQ2Fubm90IHN0YWNrIFwiJHtjaGFubmVsfVwiIGlmIHRoZXJlIGlzIGFscmVhZHkgXCIke2NoYW5uZWx9MlwiYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RTdGFja05vbkxpbmVhclNjYWxlKHNjYWxlVHlwZTogU2NhbGVUeXBlKSB7XG4gICAgcmV0dXJuIGBDYW5ub3Qgc3RhY2sgbm9uLWxpbmVhciBzY2FsZSAoJHtzY2FsZVR5cGV9KWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc3RhY2tOb25TdW1tYXRpdmVBZ2dyZWdhdGUoYWdncmVnYXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFN0YWNraW5nIGlzIGFwcGxpZWQgZXZlbiB0aG91Z2ggdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBpcyBub24tc3VtbWF0aXZlIChcIiR7YWdncmVnYXRlfVwiKWA7XG4gIH1cblxuICAvLyBUSU1FVU5JVFxuICBleHBvcnQgZnVuY3Rpb24gaW52YWxpZFRpbWVVbml0KHVuaXROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gYEludmFsaWQgJHt1bml0TmFtZX06ICR7c3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGRheVJlcGxhY2VkV2l0aERhdGUoZnVsbFRpbWVVbml0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFRpbWUgdW5pdCBcIiR7ZnVsbFRpbWVVbml0fVwiIGlzIG5vdCBzdXBwb3J0ZWQuIFdlIGFyZSByZXBsYWNpbmcgaXQgd2l0aCAke1xuICAgICAgZnVsbFRpbWVVbml0LnJlcGxhY2UoJ2RheScsICdkYXRlJyl9LmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZHJvcHBlZERheShkOiBEYXRlVGltZSB8IERhdGVUaW1lRXhwcikge1xuICAgIHJldHVybiBgRHJvcHBpbmcgZGF5IGZyb20gZGF0ZXRpbWUgJHtzdHJpbmdpZnkoZCl9IGFzIGRheSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB1bml0cy5gO1xuICB9XG59XG5cbiJdfQ== \ No newline at end of file diff --git a/build/src/logical.d.ts b/build/src/logical.d.ts new file mode 100644 index 0000000000..8abc152b3b --- /dev/null +++ b/build/src/logical.d.ts @@ -0,0 +1,15 @@ +export declare type LogicalOperand = LogicalNot | LogicalAnd | LogicalOr | T; +export interface LogicalOr { + or: LogicalOperand[]; +} +export interface LogicalAnd { + and: LogicalOperand[]; +} +export interface LogicalNot { + not: LogicalOperand; +} +export declare function isLogicalOr(op: LogicalOperand): op is LogicalOr; +export declare function isLogicalAnd(op: LogicalOperand): op is LogicalAnd; +export declare function isLogicalNot(op: LogicalOperand): op is LogicalNot; +export declare function forEachLeaf(op: LogicalOperand, fn: (op: T) => void): void; +export declare function normalizeLogicalOperand(op: LogicalOperand, normalizer: (o: T) => T): LogicalOperand; diff --git a/build/src/logical.js b/build/src/logical.js new file mode 100644 index 0000000000..b241ff5cb8 --- /dev/null +++ b/build/src/logical.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function isLogicalOr(op) { + return !!op.or; +} +exports.isLogicalOr = isLogicalOr; +function isLogicalAnd(op) { + return !!op.and; +} +exports.isLogicalAnd = isLogicalAnd; +function isLogicalNot(op) { + return !!op.not; +} +exports.isLogicalNot = isLogicalNot; +function forEachLeaf(op, fn) { + if (isLogicalNot(op)) { + forEachLeaf(op.not, fn); + } + else if (isLogicalAnd(op)) { + for (var _i = 0, _a = op.and; _i < _a.length; _i++) { + var subop = _a[_i]; + forEachLeaf(subop, fn); + } + } + else if (isLogicalOr(op)) { + for (var _b = 0, _c = op.or; _b < _c.length; _b++) { + var subop = _c[_b]; + forEachLeaf(subop, fn); + } + } + else { + fn(op); + } +} +exports.forEachLeaf = forEachLeaf; +function normalizeLogicalOperand(op, normalizer) { + if (isLogicalNot(op)) { + return { not: normalizeLogicalOperand(op.not, normalizer) }; + } + else if (isLogicalAnd(op)) { + return { and: op.and.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) }; + } + else if (isLogicalOr(op)) { + return { or: op.or.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) }; + } + else { + return normalizer(op); + } +} +exports.normalizeLogicalOperand = normalizeLogicalOperand; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dpY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBY0EscUJBQTRCLEVBQXVCO0lBQ2pELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQUZELGtDQUVDO0FBRUQsc0JBQTZCLEVBQXVCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDbEIsQ0FBQztBQUZELG9DQUVDO0FBRUQsc0JBQTZCLEVBQXVCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDbEIsQ0FBQztBQUZELG9DQUVDO0FBRUQscUJBQStCLEVBQXFCLEVBQUUsRUFBbUI7SUFDdkUsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDcEIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDekI7U0FBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMzQixLQUFvQixVQUFNLEVBQU4sS0FBQSxFQUFFLENBQUMsR0FBRyxFQUFOLGNBQU0sRUFBTixJQUFNLEVBQUU7WUFBdkIsSUFBTSxLQUFLLFNBQUE7WUFDZCxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7U0FBTSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMxQixLQUFvQixVQUFLLEVBQUwsS0FBQSxFQUFFLENBQUMsRUFBRSxFQUFMLGNBQUssRUFBTCxJQUFLLEVBQUU7WUFBdEIsSUFBTSxLQUFLLFNBQUE7WUFDZCxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7U0FBTTtRQUNMLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNSO0FBQ0gsQ0FBQztBQWRELGtDQWNDO0FBRUQsaUNBQTJDLEVBQXFCLEVBQUUsVUFBdUI7SUFDdkYsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDcEIsT0FBTyxFQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFDLENBQUM7S0FDM0Q7U0FBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUF0QyxDQUFzQyxDQUFDLEVBQUMsQ0FBQztLQUN2RTtTQUFNLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzFCLE9BQU8sRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQXRDLENBQXNDLENBQUMsRUFBQyxDQUFDO0tBQ3JFO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtBQUNILENBQUM7QUFWRCwwREFVQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIExvZ2ljYWxPcGVyYW5kPFQ+ID0gTG9naWNhbE5vdDxUPiB8IExvZ2ljYWxBbmQ8VD4gfCBMb2dpY2FsT3I8VD4gfCBUO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljYWxPcjxUPiB7XG4gIG9yOiBMb2dpY2FsT3BlcmFuZDxUPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljYWxBbmQ8VD4ge1xuICBhbmQ6IExvZ2ljYWxPcGVyYW5kPFQ+W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbE5vdDxUPiB7XG4gIG5vdDogTG9naWNhbE9wZXJhbmQ8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2ljYWxPcihvcDogTG9naWNhbE9wZXJhbmQ8YW55Pik6IG9wIGlzIExvZ2ljYWxPcjxhbnk+IHtcbiAgcmV0dXJuICEhb3Aub3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2ljYWxBbmQob3A6IExvZ2ljYWxPcGVyYW5kPGFueT4pOiBvcCBpcyBMb2dpY2FsQW5kPGFueT4ge1xuICByZXR1cm4gISFvcC5hbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvZ2ljYWxOb3Qob3A6IExvZ2ljYWxPcGVyYW5kPGFueT4pOiBvcCBpcyBMb2dpY2FsTm90PGFueT4ge1xuICByZXR1cm4gISFvcC5ub3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoTGVhZjxUPihvcDogTG9naWNhbE9wZXJhbmQ8VD4sIGZuOiAob3A6IFQpID0+IHZvaWQpIHtcbiAgaWYgKGlzTG9naWNhbE5vdChvcCkpIHtcbiAgICBmb3JFYWNoTGVhZihvcC5ub3QsIGZuKTtcbiAgfSBlbHNlIGlmIChpc0xvZ2ljYWxBbmQob3ApKSB7XG4gICAgZm9yIChjb25zdCBzdWJvcCBvZiBvcC5hbmQpIHtcbiAgICAgIGZvckVhY2hMZWFmKHN1Ym9wLCBmbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTG9naWNhbE9yKG9wKSkge1xuICAgIGZvciAoY29uc3Qgc3Vib3Agb2Ygb3Aub3IpIHtcbiAgICAgIGZvckVhY2hMZWFmKHN1Ym9wLCBmbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZuKG9wKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTG9naWNhbE9wZXJhbmQ8VD4ob3A6IExvZ2ljYWxPcGVyYW5kPFQ+LCBub3JtYWxpemVyOiAobzogVCkgPT4gVCk6IExvZ2ljYWxPcGVyYW5kPFQ+IHtcbiAgaWYgKGlzTG9naWNhbE5vdChvcCkpIHtcbiAgICByZXR1cm4ge25vdDogbm9ybWFsaXplTG9naWNhbE9wZXJhbmQob3Aubm90LCBub3JtYWxpemVyKX07XG4gIH0gZWxzZSBpZiAoaXNMb2dpY2FsQW5kKG9wKSkge1xuICAgIHJldHVybiB7YW5kOiBvcC5hbmQubWFwKG8gPT4gbm9ybWFsaXplTG9naWNhbE9wZXJhbmQobywgbm9ybWFsaXplcikpfTtcbiAgfSBlbHNlIGlmIChpc0xvZ2ljYWxPcihvcCkpIHtcbiAgICByZXR1cm4ge29yOiBvcC5vci5tYXAobyA9PiBub3JtYWxpemVMb2dpY2FsT3BlcmFuZChvLCBub3JtYWxpemVyKSl9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBub3JtYWxpemVyKG9wKTtcbiAgfVxufVxuIl19 \ No newline at end of file diff --git a/build/src/mark.d.ts b/build/src/mark.d.ts new file mode 100644 index 0000000000..4b460d49dc --- /dev/null +++ b/build/src/mark.d.ts @@ -0,0 +1,215 @@ +import { CompositeMark, CompositeMarkDef } from './compositemark/index'; +import { VgMarkConfig } from './vega.schema'; +export declare namespace Mark { + const AREA: 'area'; + const BAR: 'bar'; + const LINE: 'line'; + const POINT: 'point'; + const RECT: 'rect'; + const RULE: 'rule'; + const TEXT: 'text'; + const TICK: 'tick'; + const TRAIL: 'trail'; + const CIRCLE: 'circle'; + const SQUARE: 'square'; + const GEOSHAPE: 'geoshape'; +} +/** + * All types of primitive marks. + */ +export declare type Mark = typeof Mark.AREA | typeof Mark.BAR | typeof Mark.LINE | typeof Mark.TRAIL | typeof Mark.POINT | typeof Mark.TEXT | typeof Mark.TICK | typeof Mark.RECT | typeof Mark.RULE | typeof Mark.CIRCLE | typeof Mark.SQUARE | typeof Mark.GEOSHAPE; +export declare const AREA: "area"; +export declare const BAR: "bar"; +export declare const LINE: "line"; +export declare const POINT: "point"; +export declare const TEXT: "text"; +export declare const TICK: "tick"; +export declare const TRAIL: "trail"; +export declare const RECT: "rect"; +export declare const RULE: "rule"; +export declare const GEOSHAPE: "geoshape"; +export declare const CIRCLE: "circle"; +export declare const SQUARE: "square"; +export declare function isMark(m: string): m is Mark; +export declare function isPathMark(m: Mark | CompositeMark): m is 'line' | 'area' | 'trail'; +export declare const PRIMITIVE_MARKS: Mark[]; +export interface MarkConfig extends VgMarkConfig { + /** + * Whether the mark's color should be used as fill color instead of stroke color. + * + * __Default value:__ `true` for all marks except `point` and `false` for `point`. + * + * __Applicable for:__ `bar`, `point`, `circle`, `square`, and `area` marks. + * + * __Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config). + * + */ + filled?: boolean; + /** + * Default color. Note that `fill` and `stroke` have higher precedence than `color` and will override `color`. + * + * __Default value:__ `"#4682b4"` + * + * __Note:__ This property cannot be used in a [style config](https://vega.github.io/vega-lite/docs/mark.html#style-config). + */ + color?: string; +} +export interface BarBinSpacingMixins { + /** + * Offset between bars for binned field. Ideal value for this is either 0 (Preferred by statisticians) or 1 (Vega-Lite Default, D3 example style). + * + * __Default value:__ `1` + * + * @minimum 0 + */ + binSpacing?: number; +} +/** @hide */ +export declare type HiddenComposite = CompositeMark | CompositeMarkDef; +export declare type AnyMark = HiddenComposite | Mark | MarkDef; +export declare function isMarkDef(mark: AnyMark): mark is (MarkDef | CompositeMarkDef); +export declare function isPrimitiveMark(mark: CompositeMark | CompositeMarkDef | Mark | MarkDef): mark is Mark; +export declare const STROKE_CONFIG: string[]; +export declare const FILL_CONFIG: string[]; +export declare const FILL_STROKE_CONFIG: any[]; +export declare const VL_ONLY_MARK_CONFIG_PROPERTIES: (keyof MarkConfig)[]; +export declare const VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX: { + [k in (typeof PRIMITIVE_MARKS[0])]?: (keyof MarkConfigMixins[k])[]; +}; +export declare const defaultMarkConfig: MarkConfig; +export interface MarkConfigMixins { + /** Mark Config */ + mark?: MarkConfig; + /** Area-Specific Config */ + area?: AreaConfig; + /** Bar-Specific Config */ + bar?: BarConfig; + /** Circle-Specific Config */ + circle?: MarkConfig; + /** Line-Specific Config */ + line?: LineConfig; + /** Point-Specific Config */ + point?: MarkConfig; + /** Rect-Specific Config */ + rect?: MarkConfig; + /** Rule-Specific Config */ + rule?: MarkConfig; + /** Square-Specific Config */ + square?: MarkConfig; + /** Text-Specific Config */ + text?: TextConfig; + /** Tick-Specific Config */ + tick?: TickConfig; + /** Trail-Specific Config */ + trail?: LineConfig; + /** Geoshape-Specific Config */ + geoshape?: MarkConfig; +} +export interface BarConfig extends BarBinSpacingMixins, MarkConfig { + /** + * The default size of the bars on continuous scales. + * + * __Default value:__ `5` + * + * @minimum 0 + */ + continuousBandSize?: number; + /** + * The size of the bars. If unspecified, the default size is `bandSize-1`, + * which provides 1 pixel offset between bars. + * @minimum 0 + */ + discreteBandSize?: number; +} +export interface PointOverlayMixins { + /** + * A flag for overlaying points on top of line or area marks, or an object defining the properties of the overlayed points. + * + * - If this property is `"transparent"`, transparent points will be used (for enhancing tooltips and selections). + * + * - If this property is an empty object (`{}`) or `true`, filled points with default properties will be used. + * + * - If this property is `false`, no points would be automatically added to line or area marks. + * + * __Default value:__ `false`. + */ + point?: boolean | MarkConfig | 'transparent'; +} +export interface LineConfig extends MarkConfig, PointOverlayMixins { +} +export interface LineOverlayMixins { + /** + * A flag for overlaying line on top of area marks, or an object defining the properties of the overlayed lines. + * + * - If this value is an empty object (`{}`) or `true`, lines with default properties will be used. + * + * - If this value is `false`, no lines would be automatically added to area marks. + * + * __Default value:__ `false`. + */ + line?: boolean | MarkConfig; +} +export interface AreaConfig extends MarkConfig, PointOverlayMixins, LineOverlayMixins { +} +export interface TickThicknessMixins { + /** + * Thickness of the tick mark. + * + * __Default value:__ `1` + * + * @minimum 0 + */ + thickness?: number; +} +export interface MarkDef extends BarBinSpacingMixins, MarkConfig, PointOverlayMixins, LineOverlayMixins, TickThicknessMixins { + /** + * The mark type. + * One of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`, + * `"area"`, `"point"`, `"geoshape"`, `"rule"`, and `"text"`. + */ + type: Mark; + /** + * A string or array of strings indicating the name of custom styles to apply to the mark. A style is a named collection of mark property defaults defined within the [style configuration](https://vega.github.io/vega-lite/docs/mark.html#style-config). If style is an array, later styles will override earlier styles. Any [mark properties](https://vega.github.io/vega-lite/docs/encoding.html#mark-prop) explicitly defined within the `encoding` will override a style default. + * + * __Default value:__ The mark's name. For example, a bar mark will have style `"bar"` by default. + * __Note:__ Any specified style will augment the default style. For example, a bar mark with `"style": "foo"` will receive from `config.style.bar` and `config.style.foo` (the specified style `"foo"` has higher precedence). + */ + style?: string | string[]; + /** + * Whether a mark be clipped to the enclosing group’s width and height. + */ + clip?: boolean; + /** + * Offset for x-position. + */ + xOffset?: number; + /** + * Offset for y-position. + */ + yOffset?: number; + /** + * Offset for x2-position. + */ + x2Offset?: number; + /** + * Offset for y2-position. + */ + y2Offset?: number; +} +export declare const defaultBarConfig: BarConfig; +export interface TextConfig extends MarkConfig { + /** + * Whether month names and weekday names should be abbreviated. + */ + shortTimeLabels?: boolean; +} +export interface TickConfig extends MarkConfig, TickThicknessMixins { + /** + * The width of the ticks. + * + * __Default value:__ 2/3 of rangeStep. + * @minimum 0 + */ + bandSize?: number; +} +export declare const defaultTickConfig: TickConfig; diff --git a/build/src/mark.js b/build/src/mark.js new file mode 100644 index 0000000000..106b11900f --- /dev/null +++ b/build/src/mark.js @@ -0,0 +1,88 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var util_1 = require("./util"); +var Mark; +(function (Mark) { + Mark.AREA = 'area'; + Mark.BAR = 'bar'; + Mark.LINE = 'line'; + Mark.POINT = 'point'; + Mark.RECT = 'rect'; + Mark.RULE = 'rule'; + Mark.TEXT = 'text'; + Mark.TICK = 'tick'; + Mark.TRAIL = 'trail'; + Mark.CIRCLE = 'circle'; + Mark.SQUARE = 'square'; + Mark.GEOSHAPE = 'geoshape'; +})(Mark = exports.Mark || (exports.Mark = {})); +exports.AREA = Mark.AREA; +exports.BAR = Mark.BAR; +exports.LINE = Mark.LINE; +exports.POINT = Mark.POINT; +exports.TEXT = Mark.TEXT; +exports.TICK = Mark.TICK; +exports.TRAIL = Mark.TRAIL; +exports.RECT = Mark.RECT; +exports.RULE = Mark.RULE; +exports.GEOSHAPE = Mark.GEOSHAPE; +exports.CIRCLE = Mark.CIRCLE; +exports.SQUARE = Mark.SQUARE; +// Using mapped type to declare index, ensuring we always have all marks when we add more. +var MARK_INDEX = { + area: 1, + bar: 1, + line: 1, + point: 1, + text: 1, + tick: 1, + trail: 1, + rect: 1, + geoshape: 1, + rule: 1, + circle: 1, + square: 1 +}; +function isMark(m) { + return !!MARK_INDEX[m]; +} +exports.isMark = isMark; +function isPathMark(m) { + return util_1.contains(['line', 'area', 'trail'], m); +} +exports.isPathMark = isPathMark; +exports.PRIMITIVE_MARKS = util_1.flagKeys(MARK_INDEX); +function isMarkDef(mark) { + return mark['type']; +} +exports.isMarkDef = isMarkDef; +var PRIMITIVE_MARK_INDEX = vega_util_1.toSet(exports.PRIMITIVE_MARKS); +function isPrimitiveMark(mark) { + var markType = isMarkDef(mark) ? mark.type : mark; + return markType in PRIMITIVE_MARK_INDEX; +} +exports.isPrimitiveMark = isPrimitiveMark; +exports.STROKE_CONFIG = ['stroke', 'strokeWidth', + 'strokeDash', 'strokeDashOffset', 'strokeOpacity']; +exports.FILL_CONFIG = ['fill', 'fillOpacity']; +exports.FILL_STROKE_CONFIG = [].concat(exports.STROKE_CONFIG, exports.FILL_CONFIG); +exports.VL_ONLY_MARK_CONFIG_PROPERTIES = ['filled', 'color']; +exports.VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = { + area: ['line', 'point'], + bar: ['binSpacing', 'continuousBandSize', 'discreteBandSize'], + line: ['point'], + text: ['shortTimeLabels'], + tick: ['bandSize', 'thickness'] +}; +exports.defaultMarkConfig = { + color: '#4c78a8', +}; +exports.defaultBarConfig = { + binSpacing: 1, + continuousBandSize: 5 +}; +exports.defaultTickConfig = { + thickness: 1 +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdUNBQWdDO0FBRWhDLCtCQUEwQztBQUcxQyxJQUFpQixJQUFJLENBYXBCO0FBYkQsV0FBaUIsSUFBSTtJQUNOLFNBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsUUFBRyxHQUFVLEtBQUssQ0FBQztJQUNuQixTQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLFVBQUssR0FBWSxPQUFPLENBQUM7SUFDekIsU0FBSSxHQUFXLE1BQU0sQ0FBQztJQUN0QixTQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLFNBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsU0FBSSxHQUFXLE1BQU0sQ0FBQztJQUN0QixVQUFLLEdBQVksT0FBTyxDQUFDO0lBQ3pCLFdBQU0sR0FBYSxRQUFRLENBQUM7SUFDNUIsV0FBTSxHQUFhLFFBQVEsQ0FBQztJQUM1QixhQUFRLEdBQWUsVUFBVSxDQUFDO0FBQ2pELENBQUMsRUFiZ0IsSUFBSSxHQUFKLFlBQUksS0FBSixZQUFJLFFBYXBCO0FBUVksUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNqQixRQUFBLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQ2YsUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNqQixRQUFBLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ25CLFFBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDakIsUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNqQixRQUFBLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ25CLFFBQUEsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDakIsUUFBQSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUNqQixRQUFBLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBRXpCLFFBQUEsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDckIsUUFBQSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUVsQywwRkFBMEY7QUFDMUYsSUFBTSxVQUFVLEdBQXFCO0lBQ25DLElBQUksRUFBRSxDQUFDO0lBQ1AsR0FBRyxFQUFFLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBSSxFQUFFLENBQUM7SUFDUCxJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBSSxFQUFFLENBQUM7SUFDUCxRQUFRLEVBQUUsQ0FBQztJQUNYLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7QUFFRixnQkFBdUIsQ0FBUztJQUM5QixPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsQ0FBQztBQUZELHdCQUVDO0FBRUQsb0JBQTJCLENBQXVCO0lBQ2hELE9BQU8sZUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRkQsZ0NBRUM7QUFFWSxRQUFBLGVBQWUsR0FBRyxlQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUErQ3BELG1CQUEwQixJQUFhO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3RCLENBQUM7QUFGRCw4QkFFQztBQUVELElBQU0sb0JBQW9CLEdBQUcsaUJBQUssQ0FBQyx1QkFBZSxDQUFDLENBQUM7QUFFcEQseUJBQWdDLElBQXVEO0lBQ3JGLElBQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BELE9BQU8sUUFBUSxJQUFJLG9CQUFvQixDQUFDO0FBQzFDLENBQUM7QUFIRCwwQ0FHQztBQUVZLFFBQUEsYUFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLGFBQWE7SUFDbkQsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBRXhDLFFBQUEsV0FBVyxHQUFHLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBRXRDLFFBQUEsa0JBQWtCLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxxQkFBYSxFQUFFLG1CQUFXLENBQUMsQ0FBQztBQUUzRCxRQUFBLDhCQUE4QixHQUF5QixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUUzRSxRQUFBLDJDQUEyQyxHQUVwRDtJQUNGLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUM7SUFDdkIsR0FBRyxFQUFFLENBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDO0lBQzdELElBQUksRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUNmLElBQUksRUFBRSxDQUFDLGlCQUFpQixDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUM7Q0FDaEMsQ0FBQztBQUVXLFFBQUEsaUJBQWlCLEdBQWU7SUFDM0MsS0FBSyxFQUFFLFNBQVM7Q0FDakIsQ0FBQztBQXdKVyxRQUFBLGdCQUFnQixHQUFjO0lBQ3pDLFVBQVUsRUFBRSxDQUFDO0lBQ2Isa0JBQWtCLEVBQUUsQ0FBQztDQUN0QixDQUFDO0FBbUJXLFFBQUEsaUJBQWlCLEdBQWU7SUFDM0MsU0FBUyxFQUFFLENBQUM7Q0FDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHt0b1NldH0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q29tcG9zaXRlTWFyaywgQ29tcG9zaXRlTWFya0RlZn0gZnJvbSAnLi9jb21wb3NpdGVtYXJrL2luZGV4JztcbmltcG9ydCB7Y29udGFpbnMsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtWZ01hcmtDb25maWd9IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgbmFtZXNwYWNlIE1hcmsge1xuICBleHBvcnQgY29uc3QgQVJFQTogJ2FyZWEnID0gJ2FyZWEnO1xuICBleHBvcnQgY29uc3QgQkFSOiAnYmFyJyA9ICdiYXInO1xuICBleHBvcnQgY29uc3QgTElORTogJ2xpbmUnID0gJ2xpbmUnO1xuICBleHBvcnQgY29uc3QgUE9JTlQ6ICdwb2ludCcgPSAncG9pbnQnO1xuICBleHBvcnQgY29uc3QgUkVDVDogJ3JlY3QnID0gJ3JlY3QnO1xuICBleHBvcnQgY29uc3QgUlVMRTogJ3J1bGUnID0gJ3J1bGUnO1xuICBleHBvcnQgY29uc3QgVEVYVDogJ3RleHQnID0gJ3RleHQnO1xuICBleHBvcnQgY29uc3QgVElDSzogJ3RpY2snID0gJ3RpY2snO1xuICBleHBvcnQgY29uc3QgVFJBSUw6ICd0cmFpbCcgPSAndHJhaWwnO1xuICBleHBvcnQgY29uc3QgQ0lSQ0xFOiAnY2lyY2xlJyA9ICdjaXJjbGUnO1xuICBleHBvcnQgY29uc3QgU1FVQVJFOiAnc3F1YXJlJyA9ICdzcXVhcmUnO1xuICBleHBvcnQgY29uc3QgR0VPU0hBUEU6ICdnZW9zaGFwZScgPSAnZ2Vvc2hhcGUnO1xufVxuXG4vKipcbiAqIEFsbCB0eXBlcyBvZiBwcmltaXRpdmUgbWFya3MuXG4gKi9cbmV4cG9ydCB0eXBlIE1hcmsgPSB0eXBlb2YgTWFyay5BUkVBIHwgdHlwZW9mIE1hcmsuQkFSIHwgdHlwZW9mIE1hcmsuTElORSB8IHR5cGVvZiBNYXJrLlRSQUlMIHwgdHlwZW9mIE1hcmsuUE9JTlQgfCB0eXBlb2YgTWFyay5URVhUIHwgdHlwZW9mIE1hcmsuVElDSyB8IHR5cGVvZiBNYXJrLlJFQ1QgfCB0eXBlb2YgTWFyay5SVUxFIHwgdHlwZW9mIE1hcmsuQ0lSQ0xFIHwgdHlwZW9mIE1hcmsuU1FVQVJFIHwgdHlwZW9mIE1hcmsuR0VPU0hBUEU7XG5cblxuZXhwb3J0IGNvbnN0IEFSRUEgPSBNYXJrLkFSRUE7XG5leHBvcnQgY29uc3QgQkFSID0gTWFyay5CQVI7XG5leHBvcnQgY29uc3QgTElORSA9IE1hcmsuTElORTtcbmV4cG9ydCBjb25zdCBQT0lOVCA9IE1hcmsuUE9JTlQ7XG5leHBvcnQgY29uc3QgVEVYVCA9IE1hcmsuVEVYVDtcbmV4cG9ydCBjb25zdCBUSUNLID0gTWFyay5USUNLO1xuZXhwb3J0IGNvbnN0IFRSQUlMID0gTWFyay5UUkFJTDtcbmV4cG9ydCBjb25zdCBSRUNUID0gTWFyay5SRUNUO1xuZXhwb3J0IGNvbnN0IFJVTEUgPSBNYXJrLlJVTEU7XG5leHBvcnQgY29uc3QgR0VPU0hBUEUgPSBNYXJrLkdFT1NIQVBFO1xuXG5leHBvcnQgY29uc3QgQ0lSQ0xFID0gTWFyay5DSVJDTEU7XG5leHBvcnQgY29uc3QgU1FVQVJFID0gTWFyay5TUVVBUkU7XG5cbi8vIFVzaW5nIG1hcHBlZCB0eXBlIHRvIGRlY2xhcmUgaW5kZXgsIGVuc3VyaW5nIHdlIGFsd2F5cyBoYXZlIGFsbCBtYXJrcyB3aGVuIHdlIGFkZCBtb3JlLlxuY29uc3QgTUFSS19JTkRFWDoge1tNIGluIE1hcmtdOiAxfSA9IHtcbiAgYXJlYTogMSxcbiAgYmFyOiAxLFxuICBsaW5lOiAxLFxuICBwb2ludDogMSxcbiAgdGV4dDogMSxcbiAgdGljazogMSxcbiAgdHJhaWw6IDEsXG4gIHJlY3Q6IDEsXG4gIGdlb3NoYXBlOiAxLFxuICBydWxlOiAxLFxuICBjaXJjbGU6IDEsXG4gIHNxdWFyZTogMVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFyayhtOiBzdHJpbmcpOiBtIGlzIE1hcmsge1xuICByZXR1cm4gISFNQVJLX0lOREVYW21dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQYXRoTWFyayhtOiBNYXJrIHwgQ29tcG9zaXRlTWFyayk6IG0gaXMgJ2xpbmUnIHwgJ2FyZWEnIHwgJ3RyYWlsJyB7XG4gIHJldHVybiBjb250YWlucyhbJ2xpbmUnLCAnYXJlYScsICd0cmFpbCddLCBtKTtcbn1cblxuZXhwb3J0IGNvbnN0IFBSSU1JVElWRV9NQVJLUyA9IGZsYWdLZXlzKE1BUktfSU5ERVgpO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFya0NvbmZpZyBleHRlbmRzIFZnTWFya0NvbmZpZyB7XG4gIC8vIC0tLS0tLS0tLS0gQ29sb3IgLS0tLS0tLS0tLVxuICAvKipcbiAgICogV2hldGhlciB0aGUgbWFyaydzIGNvbG9yIHNob3VsZCBiZSB1c2VkIGFzIGZpbGwgY29sb3IgaW5zdGVhZCBvZiBzdHJva2UgY29sb3IuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgdHJ1ZWAgZm9yIGFsbCBtYXJrcyBleGNlcHQgYHBvaW50YCBhbmQgYGZhbHNlYCBmb3IgYHBvaW50YC5cbiAgICpcbiAgICogX19BcHBsaWNhYmxlIGZvcjpfXyBgYmFyYCwgYHBvaW50YCwgYGNpcmNsZWAsIGBzcXVhcmVgLCBhbmQgYGFyZWFgIG1hcmtzLlxuICAgKlxuICAgKiBfX05vdGU6X18gVGhpcyBwcm9wZXJ0eSBjYW5ub3QgYmUgdXNlZCBpbiBhIFtzdHlsZSBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbWFyay5odG1sI3N0eWxlLWNvbmZpZykuXG4gICAqXG4gICAqL1xuICBmaWxsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGNvbG9yLiAgTm90ZSB0aGF0IGBmaWxsYCBhbmQgYHN0cm9rZWAgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGBjb2xvcmAgYW5kIHdpbGwgb3ZlcnJpZGUgYGNvbG9yYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIDxzcGFuIHN0eWxlPVwiY29sb3I6ICM0NjgyYjQ7XCI+JiM5NjMyOzwvc3Bhbj4gYFwiIzQ2ODJiNFwiYFxuICAgKlxuICAgKiBfX05vdGU6X18gVGhpcyBwcm9wZXJ0eSBjYW5ub3QgYmUgdXNlZCBpbiBhIFtzdHlsZSBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbWFyay5odG1sI3N0eWxlLWNvbmZpZykuXG4gICAqL1xuICBjb2xvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXJCaW5TcGFjaW5nTWl4aW5zIHtcbiAgLyoqXG4gICAqIE9mZnNldCBiZXR3ZWVuIGJhcnMgZm9yIGJpbm5lZCBmaWVsZC4gIElkZWFsIHZhbHVlIGZvciB0aGlzIGlzIGVpdGhlciAwIChQcmVmZXJyZWQgYnkgc3RhdGlzdGljaWFucykgb3IgMSAoVmVnYS1MaXRlIERlZmF1bHQsIEQzIGV4YW1wbGUgc3R5bGUpLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGJpblNwYWNpbmc/OiBudW1iZXI7XG59XG5cblxuLyoqIEBoaWRlICovXG5leHBvcnQgdHlwZSBIaWRkZW5Db21wb3NpdGUgPSBDb21wb3NpdGVNYXJrIHwgQ29tcG9zaXRlTWFya0RlZjtcblxuZXhwb3J0IHR5cGUgQW55TWFyayA9XG4gIEhpZGRlbkNvbXBvc2l0ZSB8XG4gIE1hcmsgfFxuICBNYXJrRGVmO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNNYXJrRGVmKG1hcms6IEFueU1hcmspOiBtYXJrIGlzIChNYXJrRGVmIHwgQ29tcG9zaXRlTWFya0RlZikge1xuICByZXR1cm4gbWFya1sndHlwZSddO1xufVxuXG5jb25zdCBQUklNSVRJVkVfTUFSS19JTkRFWCA9IHRvU2V0KFBSSU1JVElWRV9NQVJLUyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ByaW1pdGl2ZU1hcmsobWFyazogQ29tcG9zaXRlTWFyayB8IENvbXBvc2l0ZU1hcmtEZWYgfCBNYXJrIHwgTWFya0RlZik6IG1hcmsgaXMgTWFyayB7XG4gIGNvbnN0IG1hcmtUeXBlID0gaXNNYXJrRGVmKG1hcmspID8gbWFyay50eXBlIDogbWFyaztcbiAgcmV0dXJuIG1hcmtUeXBlIGluIFBSSU1JVElWRV9NQVJLX0lOREVYO1xufVxuXG5leHBvcnQgY29uc3QgU1RST0tFX0NPTkZJRyA9IFsnc3Ryb2tlJywgJ3N0cm9rZVdpZHRoJyxcbiAgJ3N0cm9rZURhc2gnLCAnc3Ryb2tlRGFzaE9mZnNldCcsICdzdHJva2VPcGFjaXR5J107XG5cbmV4cG9ydCBjb25zdCBGSUxMX0NPTkZJRyA9IFsnZmlsbCcsICdmaWxsT3BhY2l0eSddO1xuXG5leHBvcnQgY29uc3QgRklMTF9TVFJPS0VfQ09ORklHID0gW10uY29uY2F0KFNUUk9LRV9DT05GSUcsIEZJTExfQ09ORklHKTtcblxuZXhwb3J0IGNvbnN0IFZMX09OTFlfTUFSS19DT05GSUdfUFJPUEVSVElFUzogKGtleW9mIE1hcmtDb25maWcpW10gPSBbJ2ZpbGxlZCcsICdjb2xvciddO1xuXG5leHBvcnQgY29uc3QgVkxfT05MWV9NQVJLX1NQRUNJRklDX0NPTkZJR19QUk9QRVJUWV9JTkRFWDoge1xuICBbayBpbiAodHlwZW9mIFBSSU1JVElWRV9NQVJLU1swXSldPzogKGtleW9mIE1hcmtDb25maWdNaXhpbnNba10pW11cbn0gPSB7XG4gIGFyZWE6IFsnbGluZScsICdwb2ludCddLFxuICBiYXI6IFsnYmluU3BhY2luZycsICdjb250aW51b3VzQmFuZFNpemUnLCAnZGlzY3JldGVCYW5kU2l6ZSddLFxuICBsaW5lOiBbJ3BvaW50J10sXG4gIHRleHQ6IFsnc2hvcnRUaW1lTGFiZWxzJ10sXG4gIHRpY2s6IFsnYmFuZFNpemUnLCAndGhpY2tuZXNzJ11cbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TWFya0NvbmZpZzogTWFya0NvbmZpZyA9IHtcbiAgY29sb3I6ICcjNGM3OGE4Jyxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFya0NvbmZpZ01peGlucyB7XG4gIC8qKiBNYXJrIENvbmZpZyAqL1xuICBtYXJrPzogTWFya0NvbmZpZztcblxuICAvLyBNQVJLLVNQRUNJRklDIENPTkZJR1NcbiAgLyoqIEFyZWEtU3BlY2lmaWMgQ29uZmlnICovXG4gIGFyZWE/OiBBcmVhQ29uZmlnO1xuXG4gIC8qKiBCYXItU3BlY2lmaWMgQ29uZmlnICovXG4gIGJhcj86IEJhckNvbmZpZztcblxuICAvKiogQ2lyY2xlLVNwZWNpZmljIENvbmZpZyAqL1xuICBjaXJjbGU/OiBNYXJrQ29uZmlnO1xuXG4gIC8qKiBMaW5lLVNwZWNpZmljIENvbmZpZyAqL1xuICBsaW5lPzogTGluZUNvbmZpZztcblxuICAvKiogUG9pbnQtU3BlY2lmaWMgQ29uZmlnICovXG4gIHBvaW50PzogTWFya0NvbmZpZztcblxuICAvKiogUmVjdC1TcGVjaWZpYyBDb25maWcgKi9cbiAgcmVjdD86IE1hcmtDb25maWc7XG5cbiAgLyoqIFJ1bGUtU3BlY2lmaWMgQ29uZmlnICovXG4gIHJ1bGU/OiBNYXJrQ29uZmlnO1xuXG4gIC8qKiBTcXVhcmUtU3BlY2lmaWMgQ29uZmlnICovXG4gIHNxdWFyZT86IE1hcmtDb25maWc7XG5cbiAgLyoqIFRleHQtU3BlY2lmaWMgQ29uZmlnICovXG4gIHRleHQ/OiBUZXh0Q29uZmlnO1xuXG4gIC8qKiBUaWNrLVNwZWNpZmljIENvbmZpZyAqL1xuICB0aWNrPzogVGlja0NvbmZpZztcblxuICAvKiogVHJhaWwtU3BlY2lmaWMgQ29uZmlnICovXG4gIHRyYWlsPzogTGluZUNvbmZpZztcblxuICAvKiogR2Vvc2hhcGUtU3BlY2lmaWMgQ29uZmlnICovXG4gIGdlb3NoYXBlPzogTWFya0NvbmZpZztcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEJhckNvbmZpZyBleHRlbmRzIEJhckJpblNwYWNpbmdNaXhpbnMsIE1hcmtDb25maWcge1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBzaXplIG9mIHRoZSBiYXJzIG9uIGNvbnRpbnVvdXMgc2NhbGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDVgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGNvbnRpbnVvdXNCYW5kU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIGJhcnMuICBJZiB1bnNwZWNpZmllZCwgdGhlIGRlZmF1bHQgc2l6ZSBpcyAgYGJhbmRTaXplLTFgLFxuICAgKiB3aGljaCBwcm92aWRlcyAxIHBpeGVsIG9mZnNldCBiZXR3ZWVuIGJhcnMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGRpc2NyZXRlQmFuZFNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnRPdmVybGF5TWl4aW5zIHtcbiAgLyoqXG4gICAqIEEgZmxhZyBmb3Igb3ZlcmxheWluZyBwb2ludHMgb24gdG9wIG9mIGxpbmUgb3IgYXJlYSBtYXJrcywgb3IgYW4gb2JqZWN0IGRlZmluaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvdmVybGF5ZWQgcG9pbnRzLlxuICAgKlxuICAgKiAtIElmIHRoaXMgcHJvcGVydHkgaXMgYFwidHJhbnNwYXJlbnRcImAsIHRyYW5zcGFyZW50IHBvaW50cyB3aWxsIGJlIHVzZWQgKGZvciBlbmhhbmNpbmcgdG9vbHRpcHMgYW5kIHNlbGVjdGlvbnMpLlxuICAgKlxuICAgKiAtIElmIHRoaXMgcHJvcGVydHkgaXMgYW4gZW1wdHkgb2JqZWN0IChge31gKSBvciBgdHJ1ZWAsIGZpbGxlZCBwb2ludHMgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiAtIElmIHRoaXMgcHJvcGVydHkgaXMgYGZhbHNlYCwgbm8gcG9pbnRzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gbGluZSBvciBhcmVhIG1hcmtzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYC5cbiAgICovXG4gIHBvaW50PzogYm9vbGVhbiB8IE1hcmtDb25maWcgfCAndHJhbnNwYXJlbnQnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmVDb25maWcgZXh0ZW5kcyBNYXJrQ29uZmlnLCBQb2ludE92ZXJsYXlNaXhpbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBMaW5lT3ZlcmxheU1peGlucyB7XG4gIC8qKlxuICAgKiBBIGZsYWcgZm9yIG92ZXJsYXlpbmcgbGluZSBvbiB0b3Agb2YgYXJlYSBtYXJrcywgb3IgYW4gb2JqZWN0IGRlZmluaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvdmVybGF5ZWQgbGluZXMuXG4gICAqXG4gICAqIC0gSWYgdGhpcyB2YWx1ZSBpcyBhbiBlbXB0eSBvYmplY3QgKGB7fWApIG9yIGB0cnVlYCwgbGluZXMgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiAtIElmIHRoaXMgdmFsdWUgaXMgYGZhbHNlYCwgbm8gbGluZXMgd291bGQgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBhcmVhIG1hcmtzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYC5cbiAgICovXG4gIGxpbmU/OiBib29sZWFuIHwgTWFya0NvbmZpZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcmVhQ29uZmlnIGV4dGVuZHMgTWFya0NvbmZpZywgUG9pbnRPdmVybGF5TWl4aW5zLCBMaW5lT3ZlcmxheU1peGlucyB7fVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tUaGlja25lc3NNaXhpbnMge1xuICAvKipcbiAgICogVGhpY2tuZXNzIG9mIHRoZSB0aWNrIG1hcmsuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHRoaWNrbmVzcz86IG51bWJlcjtcbn1cblxuLy8gUG9pbnQvTGluZSBPdmVybGF5TWl4aW5zIGFyZSBvbmx5IGZvciBhcmVhLCBsaW5lLCBhbmQgdHJhaWwgYnV0IHdlIGRvbid0IHdhbnQgdG8gZGVjbGFyZSBtdWx0aXBsZSB0eXBlcyBvZiBNYXJrRGVmXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtEZWYgZXh0ZW5kcyBCYXJCaW5TcGFjaW5nTWl4aW5zLCBNYXJrQ29uZmlnLCBQb2ludE92ZXJsYXlNaXhpbnMsIExpbmVPdmVybGF5TWl4aW5zLCBUaWNrVGhpY2tuZXNzTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoZSBtYXJrIHR5cGUuXG4gICAqIE9uZSBvZiBgXCJiYXJcImAsIGBcImNpcmNsZVwiYCwgYFwic3F1YXJlXCJgLCBgXCJ0aWNrXCJgLCBgXCJsaW5lXCJgLFxuICAgKiBgXCJhcmVhXCJgLCBgXCJwb2ludFwiYCwgYFwiZ2Vvc2hhcGVcImAsIGBcInJ1bGVcImAsIGFuZCBgXCJ0ZXh0XCJgLlxuICAgKi9cbiAgdHlwZTogTWFyaztcblxuICAvKipcbiAgICogQSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIGN1c3RvbSBzdHlsZXMgdG8gYXBwbHkgdG8gdGhlIG1hcmsuIEEgc3R5bGUgaXMgYSBuYW1lZCBjb2xsZWN0aW9uIG9mIG1hcmsgcHJvcGVydHkgZGVmYXVsdHMgZGVmaW5lZCB3aXRoaW4gdGhlIFtzdHlsZSBjb25maWd1cmF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL21hcmsuaHRtbCNzdHlsZS1jb25maWcpLiBJZiBzdHlsZSBpcyBhbiBhcnJheSwgbGF0ZXIgc3R5bGVzIHdpbGwgb3ZlcnJpZGUgZWFybGllciBzdHlsZXMuIEFueSBbbWFyayBwcm9wZXJ0aWVzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2VuY29kaW5nLmh0bWwjbWFyay1wcm9wKSBleHBsaWNpdGx5IGRlZmluZWQgd2l0aGluIHRoZSBgZW5jb2RpbmdgIHdpbGwgb3ZlcnJpZGUgYSBzdHlsZSBkZWZhdWx0LlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gVGhlIG1hcmsncyBuYW1lLiAgRm9yIGV4YW1wbGUsIGEgYmFyIG1hcmsgd2lsbCBoYXZlIHN0eWxlIGBcImJhclwiYCBieSBkZWZhdWx0LlxuICAgKiBfX05vdGU6X18gQW55IHNwZWNpZmllZCBzdHlsZSB3aWxsIGF1Z21lbnQgdGhlIGRlZmF1bHQgc3R5bGUuIEZvciBleGFtcGxlLCBhIGJhciBtYXJrIHdpdGggYFwic3R5bGVcIjogXCJmb29cImAgd2lsbCByZWNlaXZlIGZyb20gYGNvbmZpZy5zdHlsZS5iYXJgIGFuZCBgY29uZmlnLnN0eWxlLmZvb2AgKHRoZSBzcGVjaWZpZWQgc3R5bGUgYFwiZm9vXCJgIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSkuXG4gICAqL1xuICBzdHlsZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgbWFyayBiZSBjbGlwcGVkIHRvIHRoZSBlbmNsb3NpbmcgZ3JvdXDigJlzIHdpZHRoIGFuZCBoZWlnaHQuXG4gICAqL1xuICBjbGlwPzogYm9vbGVhbjtcblxuICAvLyBPZmZzZXQgcHJvcGVydGllcyBzaG91bGQgbm90IGJlIGEgcGFydCBvZiBjb25maWdcblxuICAvKipcbiAgICogT2Zmc2V0IGZvciB4LXBvc2l0aW9uLlxuICAgKi9cbiAgeE9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogT2Zmc2V0IGZvciB5LXBvc2l0aW9uLlxuICAgKi9cbiAgeU9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogT2Zmc2V0IGZvciB4Mi1wb3NpdGlvbi5cbiAgICovXG4gIHgyT2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPZmZzZXQgZm9yIHkyLXBvc2l0aW9uLlxuICAgKi9cbiAgeTJPZmZzZXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0QmFyQ29uZmlnOiBCYXJDb25maWcgPSB7XG4gIGJpblNwYWNpbmc6IDEsXG4gIGNvbnRpbnVvdXNCYW5kU2l6ZTogNVxufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZXh0Q29uZmlnIGV4dGVuZHMgTWFya0NvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG1vbnRoIG5hbWVzIGFuZCB3ZWVrZGF5IG5hbWVzIHNob3VsZCBiZSBhYmJyZXZpYXRlZC5cbiAgICovXG4gIHNob3J0VGltZUxhYmVscz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGlja0NvbmZpZyBleHRlbmRzIE1hcmtDb25maWcsIFRpY2tUaGlja25lc3NNaXhpbnMge1xuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSB0aWNrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICAyLzMgb2YgcmFuZ2VTdGVwLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBiYW5kU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRUaWNrQ29uZmlnOiBUaWNrQ29uZmlnID0ge1xuICB0aGlja25lc3M6IDFcbn07XG4iXX0= \ No newline at end of file diff --git a/build/src/package.json b/build/src/package.json new file mode 100644 index 0000000000..f295b19320 --- /dev/null +++ b/build/src/package.json @@ -0,0 +1,141 @@ +{ + "name": "vega-lite", + "author": "Jeffrey Heer, Dominik Moritz, Kanit \"Ham\" Wongsuphasawat", + "version": "2.5.1", + "collaborators": [ + "Kanit Wongsuphasawat (http://kanitw.yellowpigz.com)", + "Dominik Moritz (https://www.domoritz.de)", + "Jeffrey Heer (http://jheer.org)" + ], + "homepage": "https://vega.github.io/vega-lite/", + "description": "Vega-Lite is a concise high-level language for interactive visualization.", + "main": "build/vega-lite.js", + "unpkg": "build/vega-lite.min.js", + "jsdelivr": "build/vega-lite.min.js", + "module": "build/src/index", + "types": "build/src/index.d.ts", + "bin": { + "vl2png": "./bin/vl2png", + "vl2svg": "./bin/vl2svg", + "vl2vg": "./bin/vl2vg" + }, + "directories": { + "test": "test" + }, + "scripts": { + "prebuild": "mkdir -p build/src", + "build": "npm run build:only", + "build:only": "tsc && cp package.json build/src/ && rollup -c", + "postbuild": "uglifyjs build/vega-lite.js -cm --source-map content=build/vega-lite.js.map,filename=build/vega-lite.min.js.map -o build/vega-lite.min.js && npm run schema", + "build:examples": "npm run data && TZ=America/Los_Angeles scripts/build-examples.sh", + "build:examples-full": "TZ=America/Los_Angeles scripts/build-examples.sh 1", + "build:example": "TZ=America/Los_Angeles scripts/build-example.sh", + "build:toc": "bundle exec jekyll build -q && scripts/generate-toc", + "build:site": "tsc -p site && webpack --config site/webpack.config.js", + "build:versions": "scripts/update-version.sh", + "check:examples": "scripts/check-examples.sh", + "check:schema": "scripts/check-schema.sh", + "clean": "rm -rf build && rm -f examples/compiled/*.png && find site/examples ! -name 'index.md' -type f -delete", + "data": "rsync -r node_modules/vega-datasets/data/* data", + "deploy": "scripts/deploy.sh", + "deploy:gh": "scripts/deploy-gh.sh", + "deploy:schema": "scripts/deploy-schema.sh", + "preschema": "npm run prebuild", + "schema": "node --stack-size=1200 ./node_modules/.bin/ts-json-schema-generator --path tsconfig.json --type TopLevelSpec > build/vega-lite-schema.json && npm run renameschema && cp build/vega-lite-schema.json _data/", + "renameschema": "scripts/rename-schema.sh", + "presite": "npm run prebuild && npm run data && npm run build:site && npm run build:toc && npm run build:versions && scripts/create-example-pages", + "site": "bundle exec jekyll serve --incremental", + "lint": "tslint -p .", + "test": "jest test/ && npm run lint && npm run schema && jest examples/ && npm run test:runtime", + "test:inspect": "node --inspect-brk ./node_modules/.bin/jest --runInBand test", + "test:runtime": "TZ=America/Los_Angeles TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' wdio wdio.conf.js", + "test:runtime:generate": "rm -Rf test-runtime/resources && VL_GENERATE_TESTS=true npm run test:runtime", + "watch:build": "npm run build:only && concurrently --kill-others -n Typescript,Rollup 'tsc -w' 'rollup -c -w'", + "watch:site": "concurrently --kill-others -n Typescript,Webpack 'tsc -p site --watch' 'webpack --config site/webpack.config.js --mode development --watch'", + "watch:test": "jest --watch" + }, + "repository": { + "type": "git", + "url": "https://github.com/vega/vega-lite.git" + }, + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/vega/vega-lite/issues" + }, + "devDependencies": { + "@types/chai": "^4.1.3", + "@types/d3": "^5.0.0", + "@types/highlight.js": "^9.12.3", + "@types/jest": "^22.2.3", + "@types/mkdirp": "^0.5.2", + "@types/node": "^9.0.0", + "@types/webdriverio": "^4.10.2", + "ajv": "^6.5.0", + "chai": "^4.1.2", + "cheerio": "^1.0.0-rc.2", + "chromedriver": "^2.38.3", + "codecov": "^3.0.2", + "concurrently": "^3.5.1", + "d3": "^5.4.0", + "highlight.js": "^9.12.0", + "jest": "^23.1.0", + "mkdirp": "^0.5.1", + "rollup": "^0.59.4", + "rollup-plugin-commonjs": "^9.1.3", + "rollup-plugin-json": "^3.0.0", + "rollup-plugin-node-resolve": "^3.3.0", + "source-map-support": "^0.5.6", + "svg2png-many": "^0.0.7", + "ts-jest": "^22.4.6", + "ts-json-schema-generator": "^0.26.0", + "ts-node": "^6.0.5", + "tslint": "5.10.0", + "tslint-eslint-rules": "^5.3.1", + "typescript": "^2.9.1", + "uglify-js": "^3.3.28", + "vega": "^4.0.0-rc.2", + "vega-datasets": "^1.19.0", + "vega-embed": "^3.14.0", + "vega-tooltip": "^0.11.0", + "wdio-chromedriver-service": "^0.1.3", + "wdio-dot-reporter": "0.0.9", + "wdio-mocha-framework": "^0.5.13", + "wdio-static-server-service": "^1.0.1", + "webdriverio": "^4.12.0", + "webpack": "^4.10.2", + "webpack-cli": "^2.1.4", + "yaml-front-matter": "^4.0.0" + }, + "dependencies": { + "@types/json-stable-stringify": "^1.0.32", + "json-stable-stringify": "^1.0.1", + "tslib": "^1.9.2", + "vega-event-selector": "^2.0.0", + "vega-typings": "^0.3.4", + "vega-util": "^1.7.0", + "yargs": "^11.0.0" + }, + "jest": { + "transform": { + "^.+\\.tsx?$": "ts-jest" + }, + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ], + "testPathIgnorePatterns": [ + "node_modules", + "test-runtime", + "/build", + "_site", + "src" + ], + "coverageDirectory": "./coverage/", + "collectCoverage": false + } +} diff --git a/build/src/predicate.d.ts b/build/src/predicate.d.ts new file mode 100644 index 0000000000..1caa41ac00 --- /dev/null +++ b/build/src/predicate.d.ts @@ -0,0 +1,84 @@ +import { DataFlowNode } from './compile/data/dataflow'; +import { Model } from './compile/model'; +import { DateTime } from './datetime'; +import { LogicalOperand } from './logical'; +import { TimeUnit } from './timeunit'; +export declare type Predicate = FieldEqualPredicate | FieldRangePredicate | FieldOneOfPredicate | FieldLTPredicate | FieldGTPredicate | FieldLTEPredicate | FieldGTEPredicate | SelectionPredicate | string; +export declare type FieldPredicate = FieldEqualPredicate | FieldLTPredicate | FieldGTPredicate | FieldLTEPredicate | FieldGTEPredicate | FieldRangePredicate | FieldOneOfPredicate; +export interface SelectionPredicate { + /** + * Filter using a selection name. + */ + selection: LogicalOperand; +} +export declare function isSelectionPredicate(predicate: LogicalOperand): predicate is SelectionPredicate; +export interface FieldPredicateBase { + /** + * Time unit for the field to be filtered. + */ + timeUnit?: TimeUnit; + /** + * Field to be filtered. + */ + field: string; +} +export interface FieldEqualPredicate extends FieldPredicateBase { + /** + * The value that the field should be equal to. + */ + equal: string | number | boolean | DateTime; +} +export declare function isFieldEqualPredicate(predicate: any): predicate is FieldEqualPredicate; +export interface FieldLTPredicate extends FieldPredicateBase { + /** + * The value that the field should be less than. + */ + lt: string | number | DateTime; +} +export declare function isFieldLTPredicate(predicate: any): predicate is FieldLTPredicate; +export interface FieldLTEPredicate extends FieldPredicateBase { + /** + * The value that the field should be less than or equals to. + */ + lte: string | number | DateTime; +} +export declare function isFieldLTEPredicate(predicate: any): predicate is FieldLTEPredicate; +export interface FieldGTPredicate extends FieldPredicateBase { + /** + * The value that the field should be greater than. + */ + gt: string | number | DateTime; +} +export declare function isFieldGTPredicate(predicate: any): predicate is FieldGTPredicate; +export interface FieldGTEPredicate extends FieldPredicateBase { + /** + * The value that the field should be greater than or equals to. + */ + gte: string | number | DateTime; +} +export declare function isFieldGTEPredicate(predicate: any): predicate is FieldGTEPredicate; +export interface FieldRangePredicate extends FieldPredicateBase { + /** + * An array of inclusive minimum and maximum values + * for a field value of a data item to be included in the filtered data. + * @maxItems 2 + * @minItems 2 + */ + range: (number | DateTime | null)[]; +} +export declare function isFieldRangePredicate(predicate: any): predicate is FieldRangePredicate; +export interface FieldOneOfPredicate extends FieldPredicateBase { + /** + * A set of values that the `field`'s value should be a member of, + * for a data item included in the filtered data. + */ + oneOf: string[] | number[] | boolean[] | DateTime[]; +} +export declare function isFieldOneOfPredicate(predicate: any): predicate is FieldOneOfPredicate; +export declare function isFieldPredicate(predicate: Predicate): predicate is FieldOneOfPredicate | FieldEqualPredicate | FieldRangePredicate | FieldLTPredicate | FieldGTPredicate | FieldLTEPredicate | FieldGTEPredicate; +/** + * Converts a predicate into an expression. + */ +export declare function expression(model: Model, filterOp: LogicalOperand, node?: DataFlowNode): string; +export declare function fieldFilterExpression(predicate: FieldPredicate, useInRange?: boolean): string; +export declare function normalizePredicate(f: Predicate): Predicate; diff --git a/build/src/predicate.js b/build/src/predicate.js new file mode 100644 index 0000000000..a5b2a9b0f2 --- /dev/null +++ b/build/src/predicate.js @@ -0,0 +1,150 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var selection_1 = require("./compile/selection/selection"); +var datetime_1 = require("./datetime"); +var fielddef_1 = require("./fielddef"); +var timeunit_1 = require("./timeunit"); +var util_1 = require("./util"); +function isSelectionPredicate(predicate) { + return predicate && predicate['selection']; +} +exports.isSelectionPredicate = isSelectionPredicate; +function isFieldEqualPredicate(predicate) { + return predicate && !!predicate.field && predicate.equal !== undefined; +} +exports.isFieldEqualPredicate = isFieldEqualPredicate; +function isFieldLTPredicate(predicate) { + return predicate && !!predicate.field && predicate.lt !== undefined; +} +exports.isFieldLTPredicate = isFieldLTPredicate; +function isFieldLTEPredicate(predicate) { + return predicate && !!predicate.field && predicate.lte !== undefined; +} +exports.isFieldLTEPredicate = isFieldLTEPredicate; +function isFieldGTPredicate(predicate) { + return predicate && !!predicate.field && predicate.gt !== undefined; +} +exports.isFieldGTPredicate = isFieldGTPredicate; +function isFieldGTEPredicate(predicate) { + return predicate && !!predicate.field && predicate.gte !== undefined; +} +exports.isFieldGTEPredicate = isFieldGTEPredicate; +function isFieldRangePredicate(predicate) { + if (predicate && predicate.field) { + if (vega_util_1.isArray(predicate.range) && predicate.range.length === 2) { + return true; + } + } + return false; +} +exports.isFieldRangePredicate = isFieldRangePredicate; +function isFieldOneOfPredicate(predicate) { + return predicate && !!predicate.field && (vega_util_1.isArray(predicate.oneOf) || + vega_util_1.isArray(predicate.in) // backward compatibility + ); +} +exports.isFieldOneOfPredicate = isFieldOneOfPredicate; +function isFieldPredicate(predicate) { + return isFieldOneOfPredicate(predicate) || isFieldEqualPredicate(predicate) || isFieldRangePredicate(predicate) || isFieldLTPredicate(predicate) || isFieldGTPredicate(predicate) || isFieldLTEPredicate(predicate) || isFieldGTEPredicate(predicate); +} +exports.isFieldPredicate = isFieldPredicate; +/** + * Converts a predicate into an expression. + */ +// model is only used for selection filters. +function expression(model, filterOp, node) { + return util_1.logicalExpr(filterOp, function (predicate) { + if (vega_util_1.isString(predicate)) { + return predicate; + } + else if (isSelectionPredicate(predicate)) { + return selection_1.selectionPredicate(model, predicate.selection, node); + } + else { // Filter Object + return fieldFilterExpression(predicate); + } + }); +} +exports.expression = expression; +// This method is used by Voyager. Do not change its behavior without changing Voyager. +function fieldFilterExpression(predicate, useInRange) { + if (useInRange === void 0) { useInRange = true; } + var fieldExpr = predicate.timeUnit ? + // For timeUnit, cast into integer with time() so we can use ===, inrange, indexOf to compare values directly. + // TODO: We calculate timeUnit on the fly here. Consider if we would like to consolidate this with timeUnit pipeline + // TODO: support utc + ('time(' + timeunit_1.fieldExpr(predicate.timeUnit, predicate.field) + ')') : + fielddef_1.vgField(predicate, { expr: 'datum' }); + if (isFieldEqualPredicate(predicate)) { + return fieldExpr + '===' + valueExpr(predicate.equal, predicate.timeUnit); + } + else if (isFieldLTPredicate(predicate)) { + var upper = predicate.lt; + return fieldExpr + "<" + valueExpr(upper, predicate.timeUnit); + } + else if (isFieldGTPredicate(predicate)) { + var lower = predicate.gt; + return fieldExpr + ">" + valueExpr(lower, predicate.timeUnit); + } + else if (isFieldLTEPredicate(predicate)) { + var upper = predicate.lte; + return fieldExpr + "<=" + valueExpr(upper, predicate.timeUnit); + } + else if (isFieldGTEPredicate(predicate)) { + var lower = predicate.gte; + return fieldExpr + ">=" + valueExpr(lower, predicate.timeUnit); + } + else if (isFieldOneOfPredicate(predicate)) { + // "oneOf" was formerly "in" -- so we need to add backward compatibility + var oneOf = predicate.oneOf || predicate['in']; + return 'indexof([' + + oneOf.map(function (v) { return valueExpr(v, predicate.timeUnit); }).join(',') + + '], ' + fieldExpr + ') !== -1'; + } + else if (isFieldRangePredicate(predicate)) { + var lower = predicate.range[0]; + var upper = predicate.range[1]; + if (lower !== null && upper !== null && useInRange) { + return 'inrange(' + fieldExpr + ', [' + + valueExpr(lower, predicate.timeUnit) + ', ' + + valueExpr(upper, predicate.timeUnit) + '])'; + } + var exprs = []; + if (lower !== null) { + exprs.push(fieldExpr + " >= " + valueExpr(lower, predicate.timeUnit)); + } + if (upper !== null) { + exprs.push(fieldExpr + " <= " + valueExpr(upper, predicate.timeUnit)); + } + return exprs.length > 0 ? exprs.join(' && ') : 'true'; + } + /* istanbul ignore next: it should never reach here */ + throw new Error("Invalid field predicate: " + JSON.stringify(predicate)); +} +exports.fieldFilterExpression = fieldFilterExpression; +function valueExpr(v, timeUnit) { + if (datetime_1.isDateTime(v)) { + var expr = datetime_1.dateTimeExpr(v, true); + return 'time(' + expr + ')'; + } + if (timeunit_1.isLocalSingleTimeUnit(timeUnit)) { + var datetime = {}; + datetime[timeUnit] = v; + var expr = datetime_1.dateTimeExpr(datetime, true); + return 'time(' + expr + ')'; + } + else if (timeunit_1.isUtcSingleTimeUnit(timeUnit)) { + return valueExpr(v, timeunit_1.getLocalTimeUnit(timeUnit)); + } + return JSON.stringify(v); +} +function normalizePredicate(f) { + if (isFieldPredicate(f) && f.timeUnit) { + return tslib_1.__assign({}, f, { timeUnit: timeunit_1.normalizeTimeUnit(f.timeUnit) }); + } + return f; +} +exports.normalizePredicate = normalizePredicate; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGljYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ByZWRpY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1Q0FBNEM7QUFHNUMsMkRBQWlFO0FBQ2pFLHVDQUE4RDtBQUM5RCx1Q0FBbUM7QUFFbkMsdUNBQXFKO0FBQ3JKLCtCQUFtQztBQXNCbkMsOEJBQXFDLFNBQW9DO0lBQ3ZFLE9BQU8sU0FBUyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRkQsb0RBRUM7QUF3QkQsK0JBQXNDLFNBQWM7SUFDbEQsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7QUFDekUsQ0FBQztBQUZELHNEQUVDO0FBVUQsNEJBQW1DLFNBQWM7SUFDL0MsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUM7QUFDdEUsQ0FBQztBQUZELGdEQUVDO0FBV0QsNkJBQW9DLFNBQWM7SUFDaEQsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDdkUsQ0FBQztBQUZELGtEQUVDO0FBV0QsNEJBQW1DLFNBQWM7SUFDL0MsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUM7QUFDdEUsQ0FBQztBQUZELGdEQUVDO0FBVUQsNkJBQW9DLFNBQWM7SUFDaEQsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDdkUsQ0FBQztBQUZELGtEQUVDO0FBWUQsK0JBQXNDLFNBQWM7SUFD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SUFBSSw4QkFBbUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN4QyxPQUFPLFNBQVMsQ0FBQyxDQUFDLEVBQUUsMkJBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUNqRDtJQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNEJBQW1DLENBQVk7SUFDN0MsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ3JDLDRCQUNLLENBQUMsSUFDSixRQUFRLEVBQUUsNEJBQWlCLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUN2QztLQUNIO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBUkQsZ0RBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXksIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vY29tcGlsZS9kYXRhL2RhdGFmbG93JztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4vY29tcGlsZS9tb2RlbCc7XG5pbXBvcnQge3NlbGVjdGlvblByZWRpY2F0ZX0gZnJvbSAnLi9jb21waWxlL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtEYXRlVGltZSwgZGF0ZVRpbWVFeHByLCBpc0RhdGVUaW1lfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7dmdGaWVsZH0gZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQge0xvZ2ljYWxPcGVyYW5kfSBmcm9tICcuL2xvZ2ljYWwnO1xuaW1wb3J0IHtmaWVsZEV4cHIgYXMgdGltZVVuaXRGaWVsZEV4cHIsIGdldExvY2FsVGltZVVuaXQsIGlzTG9jYWxTaW5nbGVUaW1lVW5pdCwgaXNVdGNTaW5nbGVUaW1lVW5pdCwgbm9ybWFsaXplVGltZVVuaXQsIFRpbWVVbml0fSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7bG9naWNhbEV4cHJ9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFByZWRpY2F0ZSA9XG4gIC8vIGEpIEZpZWxkUHJlZGljYXRlIChidXQgd2UgZG9uJ3QgdHlwZSBGaWVsZEZpbHRlciBoZXJlIHNvIHRoZSBzY2hlbWEgaGFzIG5vIG5lc3RpbmdcbiAgLy8gYW5kIHRodXMgdGhlIGRvY3VtZW50YXRpb24gc2hvd3MgYWxsIG9mIHRoZSB0eXBlcyBjbGVhcmx5KVxuICBGaWVsZEVxdWFsUHJlZGljYXRlIHwgRmllbGRSYW5nZVByZWRpY2F0ZSB8IEZpZWxkT25lT2ZQcmVkaWNhdGUgfCBGaWVsZExUUHJlZGljYXRlIHwgRmllbGRHVFByZWRpY2F0ZSB8IEZpZWxkTFRFUHJlZGljYXRlIHwgRmllbGRHVEVQcmVkaWNhdGUgfFxuICAvLyBiKSBTZWxlY3Rpb24gUHJlZGljYXRlXG4gIFNlbGVjdGlvblByZWRpY2F0ZSB8XG4gIC8vIGMpIFZlZ2EgRXhwcmVzc2lvbiBzdHJpbmdcbiAgc3RyaW5nO1xuXG5cblxuZXhwb3J0IHR5cGUgRmllbGRQcmVkaWNhdGUgPSBGaWVsZEVxdWFsUHJlZGljYXRlIHwgRmllbGRMVFByZWRpY2F0ZSB8IEZpZWxkR1RQcmVkaWNhdGUgfCBGaWVsZExURVByZWRpY2F0ZSB8IEZpZWxkR1RFUHJlZGljYXRlIHxGaWVsZFJhbmdlUHJlZGljYXRlIHwgRmllbGRPbmVPZlByZWRpY2F0ZTtcblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3Rpb25QcmVkaWNhdGUge1xuICAvKipcbiAgICogRmlsdGVyIHVzaW5nIGEgc2VsZWN0aW9uIG5hbWUuXG4gICAqL1xuICBzZWxlY3Rpb246IExvZ2ljYWxPcGVyYW5kPHN0cmluZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGVjdGlvblByZWRpY2F0ZShwcmVkaWNhdGU6IExvZ2ljYWxPcGVyYW5kPFByZWRpY2F0ZT4pOiBwcmVkaWNhdGUgaXMgU2VsZWN0aW9uUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiBwcmVkaWNhdGVbJ3NlbGVjdGlvbiddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8vIFRPRE86IHN1cHBvcnQgYWdncmVnYXRlXG5cbiAgLyoqXG4gICAqIFRpbWUgdW5pdCBmb3IgdGhlIGZpZWxkIHRvIGJlIGZpbHRlcmVkLlxuICAgKi9cbiAgdGltZVVuaXQ/OiBUaW1lVW5pdDtcblxuICAvKipcbiAgICogRmllbGQgdG8gYmUgZmlsdGVyZWQuXG4gICAqL1xuICBmaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkRXF1YWxQcmVkaWNhdGUgZXh0ZW5kcyBGaWVsZFByZWRpY2F0ZUJhc2Uge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBlcXVhbCB0by5cbiAgICovXG4gIGVxdWFsOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZVRpbWU7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRFcXVhbFByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZEVxdWFsUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiBwcmVkaWNhdGUuZXF1YWwgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZExUUHJlZGljYXRlIGV4dGVuZHMgRmllbGRQcmVkaWNhdGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgbGVzcyB0aGFuLlxuICAgKi9cbiAgbHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGVUaW1lO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkTFRQcmVkaWNhdGUocHJlZGljYXRlOiBhbnkpOiBwcmVkaWNhdGUgaXMgRmllbGRMVFByZWRpY2F0ZSB7XG4gIHJldHVybiBwcmVkaWNhdGUgJiYgISFwcmVkaWNhdGUuZmllbGQgJiYgcHJlZGljYXRlLmx0ICE9PSB1bmRlZmluZWQ7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZExURVByZWRpY2F0ZSBleHRlbmRzIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbHMgdG8uXG4gICAqL1xuICBsdGU6IHN0cmluZyB8IG51bWJlciB8IERhdGVUaW1lO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkTFRFUHJlZGljYXRlKHByZWRpY2F0ZTogYW55KTogcHJlZGljYXRlIGlzIEZpZWxkTFRFUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiBwcmVkaWNhdGUubHRlICE9PSB1bmRlZmluZWQ7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEdUUHJlZGljYXRlIGV4dGVuZHMgRmllbGRQcmVkaWNhdGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuLlxuICAgKi9cbiAgZ3Q6IHN0cmluZyB8IG51bWJlciB8IERhdGVUaW1lO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkR1RQcmVkaWNhdGUocHJlZGljYXRlOiBhbnkpOiBwcmVkaWNhdGUgaXMgRmllbGRHVFByZWRpY2F0ZSB7XG4gIHJldHVybiBwcmVkaWNhdGUgJiYgISFwcmVkaWNhdGUuZmllbGQgJiYgcHJlZGljYXRlLmd0ICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRHVEVQcmVkaWNhdGUgZXh0ZW5kcyBGaWVsZFByZWRpY2F0ZUJhc2Uge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWxzIHRvLlxuICAgKi9cbiAgZ3RlOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlVGltZTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZEdURVByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZEdURVByZWRpY2F0ZSB7XG4gIHJldHVybiBwcmVkaWNhdGUgJiYgISFwcmVkaWNhdGUuZmllbGQgJiYgcHJlZGljYXRlLmd0ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkUmFuZ2VQcmVkaWNhdGUgZXh0ZW5kcyBGaWVsZFByZWRpY2F0ZUJhc2Uge1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgaW5jbHVzaXZlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzXG4gICAqIGZvciBhIGZpZWxkIHZhbHVlIG9mIGEgZGF0YSBpdGVtIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmaWx0ZXJlZCBkYXRhLlxuICAgKiBAbWF4SXRlbXMgMlxuICAgKiBAbWluSXRlbXMgMlxuICAgKi9cbiAgcmFuZ2U6IChudW1iZXJ8RGF0ZVRpbWV8bnVsbClbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRSYW5nZVByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZFJhbmdlUHJlZGljYXRlIHtcbiAgaWYgKHByZWRpY2F0ZSAmJiBwcmVkaWNhdGUuZmllbGQpIHtcbiAgICBpZiAoaXNBcnJheShwcmVkaWNhdGUucmFuZ2UpICYmIHByZWRpY2F0ZS5yYW5nZS5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRPbmVPZlByZWRpY2F0ZSBleHRlbmRzIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8qKlxuICAgKiBBIHNldCBvZiB2YWx1ZXMgdGhhdCB0aGUgYGZpZWxkYCdzIHZhbHVlIHNob3VsZCBiZSBhIG1lbWJlciBvZixcbiAgICogZm9yIGEgZGF0YSBpdGVtIGluY2x1ZGVkIGluIHRoZSBmaWx0ZXJlZCBkYXRhLlxuICAgKi9cbiAgb25lT2Y6IHN0cmluZ1tdIHwgbnVtYmVyW10gfCBib29sZWFuW10gfCBEYXRlVGltZVtdO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkT25lT2ZQcmVkaWNhdGUocHJlZGljYXRlOiBhbnkpOiBwcmVkaWNhdGUgaXMgRmllbGRPbmVPZlByZWRpY2F0ZSB7XG4gIHJldHVybiBwcmVkaWNhdGUgJiYgISFwcmVkaWNhdGUuZmllbGQgJiYgKFxuICAgIGlzQXJyYXkocHJlZGljYXRlLm9uZU9mKSB8fFxuICAgIGlzQXJyYXkocHJlZGljYXRlLmluKSAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkUHJlZGljYXRlKHByZWRpY2F0ZTogUHJlZGljYXRlKTogcHJlZGljYXRlIGlzIEZpZWxkT25lT2ZQcmVkaWNhdGUgfCBGaWVsZEVxdWFsUHJlZGljYXRlIHwgRmllbGRSYW5nZVByZWRpY2F0ZSB8IEZpZWxkTFRQcmVkaWNhdGUgfCBGaWVsZEdUUHJlZGljYXRlIHwgRmllbGRMVEVQcmVkaWNhdGUgfCBGaWVsZEdURVByZWRpY2F0ZSB7XG4gIHJldHVybiBpc0ZpZWxkT25lT2ZQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkRXF1YWxQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkUmFuZ2VQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkTFRQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkR1RQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkTFRFUHJlZGljYXRlKHByZWRpY2F0ZSkgfHwgaXNGaWVsZEdURVByZWRpY2F0ZShwcmVkaWNhdGUpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcHJlZGljYXRlIGludG8gYW4gZXhwcmVzc2lvbi5cbiAqL1xuLy8gbW9kZWwgaXMgb25seSB1c2VkIGZvciBzZWxlY3Rpb24gZmlsdGVycy5cbmV4cG9ydCBmdW5jdGlvbiBleHByZXNzaW9uKG1vZGVsOiBNb2RlbCwgZmlsdGVyT3A6IExvZ2ljYWxPcGVyYW5kPFByZWRpY2F0ZT4sIG5vZGU/OiBEYXRhRmxvd05vZGUpOiBzdHJpbmcge1xuICByZXR1cm4gbG9naWNhbEV4cHIoZmlsdGVyT3AsIChwcmVkaWNhdGU6IFByZWRpY2F0ZSkgPT4ge1xuICAgIGlmIChpc1N0cmluZyhwcmVkaWNhdGUpKSB7XG4gICAgICByZXR1cm4gcHJlZGljYXRlO1xuICAgIH0gZWxzZSBpZiAoaXNTZWxlY3Rpb25QcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgICAgcmV0dXJuIHNlbGVjdGlvblByZWRpY2F0ZShtb2RlbCwgcHJlZGljYXRlLnNlbGVjdGlvbiwgbm9kZSk7XG4gICAgfSBlbHNlIHsgLy8gRmlsdGVyIE9iamVjdFxuICAgICAgcmV0dXJuIGZpZWxkRmlsdGVyRXhwcmVzc2lvbihwcmVkaWNhdGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgVm95YWdlci4gIERvIG5vdCBjaGFuZ2UgaXRzIGJlaGF2aW9yIHdpdGhvdXQgY2hhbmdpbmcgVm95YWdlci5cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZEZpbHRlckV4cHJlc3Npb24ocHJlZGljYXRlOiBGaWVsZFByZWRpY2F0ZSwgdXNlSW5SYW5nZT10cnVlKSB7XG4gIGNvbnN0IGZpZWxkRXhwciA9IHByZWRpY2F0ZS50aW1lVW5pdCA/XG4gICAgLy8gRm9yIHRpbWVVbml0LCBjYXN0IGludG8gaW50ZWdlciB3aXRoIHRpbWUoKSBzbyB3ZSBjYW4gdXNlID09PSwgaW5yYW5nZSwgaW5kZXhPZiB0byBjb21wYXJlIHZhbHVlcyBkaXJlY3RseS5cbiAgICAgIC8vIFRPRE86IFdlIGNhbGN1bGF0ZSB0aW1lVW5pdCBvbiB0aGUgZmx5IGhlcmUuIENvbnNpZGVyIGlmIHdlIHdvdWxkIGxpa2UgdG8gY29uc29saWRhdGUgdGhpcyB3aXRoIHRpbWVVbml0IHBpcGVsaW5lXG4gICAgICAvLyBUT0RPOiBzdXBwb3J0IHV0Y1xuICAgICgndGltZSgnICsgdGltZVVuaXRGaWVsZEV4cHIocHJlZGljYXRlLnRpbWVVbml0LCBwcmVkaWNhdGUuZmllbGQpICsgJyknKSA6XG4gICAgdmdGaWVsZChwcmVkaWNhdGUsIHtleHByOiAnZGF0dW0nfSk7XG5cbiAgaWYgKGlzRmllbGRFcXVhbFByZWRpY2F0ZShwcmVkaWNhdGUpKSB7XG4gICAgcmV0dXJuIGZpZWxkRXhwciArICc9PT0nICsgdmFsdWVFeHByKHByZWRpY2F0ZS5lcXVhbCwgcHJlZGljYXRlLnRpbWVVbml0KTtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkTFRQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIGNvbnN0IHVwcGVyID0gcHJlZGljYXRlLmx0O1xuICAgIHJldHVybiBgJHtmaWVsZEV4cHJ9PCR7dmFsdWVFeHByKHVwcGVyLCBwcmVkaWNhdGUudGltZVVuaXQpfWA7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZEdUUHJlZGljYXRlKHByZWRpY2F0ZSkpIHtcbiAgICBjb25zdCBsb3dlciA9IHByZWRpY2F0ZS5ndDtcbiAgICByZXR1cm4gYCR7ZmllbGRFeHByfT4ke3ZhbHVlRXhwcihsb3dlciwgcHJlZGljYXRlLnRpbWVVbml0KX1gO1xuICB9IGVsc2UgaWYgKGlzRmllbGRMVEVQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIGNvbnN0IHVwcGVyID0gcHJlZGljYXRlLmx0ZTtcbiAgICByZXR1cm4gYCR7ZmllbGRFeHByfTw9JHt2YWx1ZUV4cHIodXBwZXIsIHByZWRpY2F0ZS50aW1lVW5pdCl9YDtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkR1RFUHJlZGljYXRlKHByZWRpY2F0ZSkpIHtcbiAgICBjb25zdCBsb3dlciA9IHByZWRpY2F0ZS5ndGU7XG4gICAgcmV0dXJuIGAke2ZpZWxkRXhwcn0+PSR7dmFsdWVFeHByKGxvd2VyLCBwcmVkaWNhdGUudGltZVVuaXQpfWA7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZE9uZU9mUHJlZGljYXRlKHByZWRpY2F0ZSkpIHtcbiAgICAvLyBcIm9uZU9mXCIgd2FzIGZvcm1lcmx5IFwiaW5cIiAtLSBzbyB3ZSBuZWVkIHRvIGFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgY29uc3Qgb25lT2Y6IEZpZWxkT25lT2ZQcmVkaWNhdGVbXSA9IHByZWRpY2F0ZS5vbmVPZiB8fCBwcmVkaWNhdGVbJ2luJ107XG4gICAgcmV0dXJuICdpbmRleG9mKFsnICtcbiAgICAgIG9uZU9mLm1hcCgodikgPT4gdmFsdWVFeHByKHYsIHByZWRpY2F0ZS50aW1lVW5pdCkpLmpvaW4oJywnKSArXG4gICAgICAnXSwgJyArIGZpZWxkRXhwciArICcpICE9PSAtMSc7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZFJhbmdlUHJlZGljYXRlKHByZWRpY2F0ZSkpIHtcbiAgICBjb25zdCBsb3dlciA9IHByZWRpY2F0ZS5yYW5nZVswXTtcbiAgICBjb25zdCB1cHBlciA9IHByZWRpY2F0ZS5yYW5nZVsxXTtcblxuICAgIGlmIChsb3dlciAhPT0gbnVsbCAmJiB1cHBlciAhPT0gbnVsbCAmJiB1c2VJblJhbmdlKSB7XG4gICAgICByZXR1cm4gJ2lucmFuZ2UoJyArIGZpZWxkRXhwciArICcsIFsnICtcbiAgICAgICAgdmFsdWVFeHByKGxvd2VyLCBwcmVkaWNhdGUudGltZVVuaXQpICsgJywgJyArXG4gICAgICAgIHZhbHVlRXhwcih1cHBlciwgcHJlZGljYXRlLnRpbWVVbml0KSArICddKSc7XG4gICAgfVxuXG4gICAgY29uc3QgZXhwcnMgPSBbXTtcbiAgICBpZiAobG93ZXIgIT09IG51bGwpIHtcbiAgICAgIGV4cHJzLnB1c2goYCR7ZmllbGRFeHByfSA+PSAke3ZhbHVlRXhwcihsb3dlciwgcHJlZGljYXRlLnRpbWVVbml0KX1gKTtcbiAgICB9XG4gICAgaWYgKHVwcGVyICE9PSBudWxsKSB7XG4gICAgICBleHBycy5wdXNoKGAke2ZpZWxkRXhwcn0gPD0gJHt2YWx1ZUV4cHIodXBwZXIsIHByZWRpY2F0ZS50aW1lVW5pdCl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGV4cHJzLmxlbmd0aCA+IDAgPyBleHBycy5qb2luKCcgJiYgJykgOiAndHJ1ZSc7XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaXQgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZpZWxkIHByZWRpY2F0ZTogJHtKU09OLnN0cmluZ2lmeShwcmVkaWNhdGUpfWApO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUV4cHIodjogYW55LCB0aW1lVW5pdDogVGltZVVuaXQpOiBzdHJpbmcge1xuICBpZiAoaXNEYXRlVGltZSh2KSkge1xuICAgIGNvbnN0IGV4cHIgPSBkYXRlVGltZUV4cHIodiwgdHJ1ZSk7XG4gICAgcmV0dXJuICd0aW1lKCcgKyBleHByICsgJyknO1xuICB9XG4gIGlmIChpc0xvY2FsU2luZ2xlVGltZVVuaXQodGltZVVuaXQpKSB7XG4gICAgY29uc3QgZGF0ZXRpbWU6IERhdGVUaW1lID0ge307XG4gICAgZGF0ZXRpbWVbdGltZVVuaXRdID0gdjtcbiAgICBjb25zdCBleHByID0gZGF0ZVRpbWVFeHByKGRhdGV0aW1lLCB0cnVlKTtcbiAgICByZXR1cm4gJ3RpbWUoJyArIGV4cHIgKyAnKSc7XG4gIH0gZWxzZSBpZiAoaXNVdGNTaW5nbGVUaW1lVW5pdCh0aW1lVW5pdCkpIHtcbiAgICByZXR1cm4gdmFsdWVFeHByKHYsIGdldExvY2FsVGltZVVuaXQodGltZVVuaXQpKTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQcmVkaWNhdGUoZjogUHJlZGljYXRlKTogUHJlZGljYXRlIHtcbiAgaWYgKGlzRmllbGRQcmVkaWNhdGUoZikgJiYgZi50aW1lVW5pdCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5mLFxuICAgICAgdGltZVVuaXQ6IG5vcm1hbGl6ZVRpbWVVbml0KGYudGltZVVuaXQpXG4gICAgfTtcbiAgfVxuICByZXR1cm4gZjtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/projection.d.ts b/build/src/projection.d.ts new file mode 100644 index 0000000000..7d0a2b4b22 --- /dev/null +++ b/build/src/projection.d.ts @@ -0,0 +1,49 @@ +import { VgProjectionType } from './vega.schema'; +export declare type ProjectionType = VgProjectionType; +export interface Projection { + /** + * The cartographic projection to use. This value is case-insensitive, for example `"albers"` and `"Albers"` indicate the same projection type. You can find all valid projection types [in the documentation](https://vega.github.io/vega-lite/docs/projection.html#projection-types). + * + * __Default value:__ `mercator` + */ + type?: ProjectionType; + /** + * Sets the projection’s clipping circle radius to the specified angle in degrees. If `null`, switches to [antimeridian](http://bl.ocks.org/mbostock/3788999) cutting rather than small-circle clipping. + */ + clipAngle?: number; + /** + * Sets the projection’s viewport clip extent to the specified bounds in pixels. The extent bounds are specified as an array `[[x0, y0], [x1, y1]]`, where `x0` is the left-side of the viewport, `y0` is the top, `x1` is the right and `y1` is the bottom. If `null`, no viewport clipping is performed. + */ + clipExtent?: number[][]; + /** + * Sets the projection’s center to the specified center, a two-element array of longitude and latitude in degrees. + * + * __Default value:__ `[0, 0]` + */ + center?: number[]; + /** + * Sets the projection’s three-axis rotation to the specified angles, which must be a two- or three-element array of numbers [`lambda`, `phi`, `gamma`] specifying the rotation angles in degrees about each spherical axis. (These correspond to yaw, pitch and roll.) + * + * __Default value:__ `[0, 0, 0]` + */ + rotate?: number[]; + /** + * Sets the threshold for the projection’s [adaptive resampling](http://bl.ocks.org/mbostock/3795544) to the specified value in pixels. This value corresponds to the [Douglas–Peucker distance](http://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm). If precision is not specified, returns the projection’s current resampling precision which defaults to `√0.5 ≅ 0.70710…`. + */ + precision?: String; + coefficient?: number; + distance?: number; + fraction?: number; + lobes?: number; + parallel?: number; + radius?: number; + ratio?: number; + spacing?: number; + tilt?: number; +} +/** + * Any property of Projection can be in config + */ +export interface ProjectionConfig extends Projection { +} +export declare const PROJECTION_PROPERTIES: (keyof Projection)[]; diff --git a/build/src/projection.js b/build/src/projection.js new file mode 100644 index 0000000000..2d2c9e12d8 --- /dev/null +++ b/build/src/projection.js @@ -0,0 +1,20 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PROJECTION_PROPERTIES = [ + 'type', + 'clipAngle', + 'clipExtent', + 'center', + 'rotate', + 'precision', + 'coefficient', + 'distance', + 'fraction', + 'lobes', + 'parallel', + 'radius', + 'ratio', + 'spacing', + 'tilt' +]; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkRhLFFBQUEscUJBQXFCLEdBQXlCO0lBQ3pELE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0lBQ1YsVUFBVTtJQUNWLE9BQU87SUFDUCxVQUFVO0lBQ1YsUUFBUTtJQUNSLE9BQU87SUFDUCxTQUFTO0lBQ1QsTUFBTTtDQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7VmdQcm9qZWN0aW9uVHlwZX0gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cbmV4cG9ydCB0eXBlIFByb2plY3Rpb25UeXBlID0gVmdQcm9qZWN0aW9uVHlwZTtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSBjYXJ0b2dyYXBoaWMgcHJvamVjdGlvbiB0byB1c2UuIFRoaXMgdmFsdWUgaXMgY2FzZS1pbnNlbnNpdGl2ZSwgZm9yIGV4YW1wbGUgYFwiYWxiZXJzXCJgIGFuZCBgXCJBbGJlcnNcImAgaW5kaWNhdGUgdGhlIHNhbWUgcHJvamVjdGlvbiB0eXBlLiBZb3UgY2FuIGZpbmQgYWxsIHZhbGlkIHByb2plY3Rpb24gdHlwZXMgW2luIHRoZSBkb2N1bWVudGF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3Byb2plY3Rpb24uaHRtbCNwcm9qZWN0aW9uLXR5cGVzKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBtZXJjYXRvcmBcbiAgICovXG4gIHR5cGU/OiBQcm9qZWN0aW9uVHlwZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgcHJvamVjdGlvbuKAmXMgY2xpcHBpbmcgY2lyY2xlIHJhZGl1cyB0byB0aGUgc3BlY2lmaWVkIGFuZ2xlIGluIGRlZ3JlZXMuIElmIGBudWxsYCwgc3dpdGNoZXMgdG8gW2FudGltZXJpZGlhbl0oaHR0cDovL2JsLm9ja3Mub3JnL21ib3N0b2NrLzM3ODg5OTkpIGN1dHRpbmcgcmF0aGVyIHRoYW4gc21hbGwtY2lyY2xlIGNsaXBwaW5nLlxuICAgKi9cbiAgY2xpcEFuZ2xlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9qZWN0aW9u4oCZcyB2aWV3cG9ydCBjbGlwIGV4dGVudCB0byB0aGUgc3BlY2lmaWVkIGJvdW5kcyBpbiBwaXhlbHMuIFRoZSBleHRlbnQgYm91bmRzIGFyZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgYFtbeDAsIHkwXSwgW3gxLCB5MV1dYCwgd2hlcmUgYHgwYCBpcyB0aGUgbGVmdC1zaWRlIG9mIHRoZSB2aWV3cG9ydCwgYHkwYCBpcyB0aGUgdG9wLCBgeDFgIGlzIHRoZSByaWdodCBhbmQgYHkxYCBpcyB0aGUgYm90dG9tLiBJZiBgbnVsbGAsIG5vIHZpZXdwb3J0IGNsaXBwaW5nIGlzIHBlcmZvcm1lZC5cbiAgICovXG4gIGNsaXBFeHRlbnQ/OiBudW1iZXJbXVtdO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9qZWN0aW9u4oCZcyBjZW50ZXIgdG8gdGhlIHNwZWNpZmllZCBjZW50ZXIsIGEgdHdvLWVsZW1lbnQgYXJyYXkgb2YgbG9uZ2l0dWRlIGFuZCBsYXRpdHVkZSBpbiBkZWdyZWVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFswLCAwXWBcbiAgICovXG4gIGNlbnRlcj86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9qZWN0aW9u4oCZcyB0aHJlZS1heGlzIHJvdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYW5nbGVzLCB3aGljaCBtdXN0IGJlIGEgdHdvLSBvciB0aHJlZS1lbGVtZW50IGFycmF5IG9mIG51bWJlcnMgW2BsYW1iZGFgLCBgcGhpYCwgYGdhbW1hYF0gc3BlY2lmeWluZyB0aGUgcm90YXRpb24gYW5nbGVzIGluIGRlZ3JlZXMgYWJvdXQgZWFjaCBzcGhlcmljYWwgYXhpcy4gKFRoZXNlIGNvcnJlc3BvbmQgdG8geWF3LCBwaXRjaCBhbmQgcm9sbC4pXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgWzAsIDAsIDBdYFxuICAgKi9cbiAgcm90YXRlPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHRocmVzaG9sZCBmb3IgdGhlIHByb2plY3Rpb27igJlzIFthZGFwdGl2ZSByZXNhbXBsaW5nXShodHRwOi8vYmwub2Nrcy5vcmcvbWJvc3RvY2svMzc5NTU0NCkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiBwaXhlbHMuIFRoaXMgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIFtEb3VnbGFz4oCTUGV1Y2tlciBkaXN0YW5jZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SYW1lciVFMiU4MCU5M0RvdWdsYXMlRTIlODAlOTNQZXVja2VyX2FsZ29yaXRobSkuIElmIHByZWNpc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBwcm9qZWN0aW9u4oCZcyBjdXJyZW50IHJlc2FtcGxpbmcgcHJlY2lzaW9uIHdoaWNoIGRlZmF1bHRzIHRvIGDiiJowLjUg4omFIDAuNzA3MTDigKZgLlxuICAgKi9cbiAgcHJlY2lzaW9uPzogU3RyaW5nO1xuXG4gIC8qIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgYWxsIHN1cHBvcnRlZCBmb3Igc3BlY2lmaWMgdHlwZXMgb2YgcHJvamVjdGlvbnMuIENvbnN1bHQgdGhlIGQzLWdlby1wcm9qZWN0aW9uIGxpYnJhcnkgZm9yIG1vcmUgaW5mb3JtYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1nZW8tcHJvamVjdGlvbiAqL1xuICBjb2VmZmljaWVudD86IG51bWJlcjtcbiAgZGlzdGFuY2U/OiBudW1iZXI7XG4gIGZyYWN0aW9uPzogbnVtYmVyO1xuICBsb2Jlcz86IG51bWJlcjtcbiAgcGFyYWxsZWw/OiBudW1iZXI7XG4gIHJhZGl1cz86IG51bWJlcjtcbiAgcmF0aW8/OiBudW1iZXI7XG4gIHNwYWNpbmc/OiBudW1iZXI7XG4gIHRpbHQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQW55IHByb3BlcnR5IG9mIFByb2plY3Rpb24gY2FuIGJlIGluIGNvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3Rpb25Db25maWcgZXh0ZW5kcyBQcm9qZWN0aW9uIHsgfVxuXG5leHBvcnQgY29uc3QgUFJPSkVDVElPTl9QUk9QRVJUSUVTOiAoa2V5b2YgUHJvamVjdGlvbilbXSA9IFtcbiAgJ3R5cGUnLFxuICAnY2xpcEFuZ2xlJyxcbiAgJ2NsaXBFeHRlbnQnLFxuICAnY2VudGVyJyxcbiAgJ3JvdGF0ZScsXG4gICdwcmVjaXNpb24nLFxuICAnY29lZmZpY2llbnQnLFxuICAnZGlzdGFuY2UnLFxuICAnZnJhY3Rpb24nLFxuICAnbG9iZXMnLFxuICAncGFyYWxsZWwnLFxuICAncmFkaXVzJyxcbiAgJ3JhdGlvJyxcbiAgJ3NwYWNpbmcnLFxuICAndGlsdCdcbl07XG4iXX0= \ No newline at end of file diff --git a/build/src/repeat.d.ts b/build/src/repeat.d.ts new file mode 100644 index 0000000000..2d5d79a2de --- /dev/null +++ b/build/src/repeat.d.ts @@ -0,0 +1,10 @@ +export interface Repeat { + /** + * Vertical repeated views. + */ + row?: string[]; + /** + * Horizontal repeated views. + */ + column?: string[]; +} diff --git a/build/src/repeat.js b/build/src/repeat.js new file mode 100644 index 0000000000..71fe9da293 --- /dev/null +++ b/build/src/repeat.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlcGVhdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBSZXBlYXQge1xuXG4gIC8qKlxuICAgKiBWZXJ0aWNhbCByZXBlYXRlZCB2aWV3cy5cbiAgICovXG4gIHJvdz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIHJlcGVhdGVkIHZpZXdzLlxuICAgKi9cbiAgY29sdW1uPzogc3RyaW5nW107XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/resolve.d.ts b/build/src/resolve.d.ts new file mode 100644 index 0000000000..f9d8296fde --- /dev/null +++ b/build/src/resolve.d.ts @@ -0,0 +1,19 @@ +import { NonPositionScaleChannel, PositionScaleChannel, ScaleChannel } from './channel'; +export declare type ResolveMode = 'independent' | 'shared'; +/** + * Defines how scales, axes, and legends from different specs should be combined. Resolve is a mapping from `scale`, `axis`, and `legend` to a mapping from channels to resolutions. + */ +export interface Resolve { + scale?: ScaleResolveMap; + axis?: AxisResolveMap; + legend?: LegendResolveMap; +} +export declare type ScaleResolveMap = { + [C in ScaleChannel]?: ResolveMode; +}; +export declare type AxisResolveMap = { + [C in PositionScaleChannel]?: ResolveMode; +}; +export declare type LegendResolveMap = { + [C in NonPositionScaleChannel]?: ResolveMode; +}; diff --git a/build/src/resolve.js b/build/src/resolve.js new file mode 100644 index 0000000000..aa58dffb19 --- /dev/null +++ b/build/src/resolve.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXNvbHZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05vblBvc2l0aW9uU2NhbGVDaGFubmVsLCBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgU2NhbGVDaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuXG5cbmV4cG9ydCB0eXBlIFJlc29sdmVNb2RlID0gJ2luZGVwZW5kZW50JyB8ICdzaGFyZWQnO1xuXG4vKipcbiAqIERlZmluZXMgaG93IHNjYWxlcywgYXhlcywgYW5kIGxlZ2VuZHMgZnJvbSBkaWZmZXJlbnQgc3BlY3Mgc2hvdWxkIGJlIGNvbWJpbmVkLiBSZXNvbHZlIGlzIGEgbWFwcGluZyBmcm9tIGBzY2FsZWAsIGBheGlzYCwgYW5kIGBsZWdlbmRgIHRvIGEgbWFwcGluZyBmcm9tIGNoYW5uZWxzIHRvIHJlc29sdXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmUge1xuICBzY2FsZT86IFNjYWxlUmVzb2x2ZU1hcDtcblxuICBheGlzPzogQXhpc1Jlc29sdmVNYXA7XG5cbiAgbGVnZW5kPzogTGVnZW5kUmVzb2x2ZU1hcDtcbn1cblxuZXhwb3J0IHR5cGUgU2NhbGVSZXNvbHZlTWFwID0ge1xuICBbQyBpbiBTY2FsZUNoYW5uZWxdPzogUmVzb2x2ZU1vZGVcbn07XG5cbmV4cG9ydCB0eXBlIEF4aXNSZXNvbHZlTWFwID0ge1xuICBbQyBpbiBQb3NpdGlvblNjYWxlQ2hhbm5lbF0/OiBSZXNvbHZlTW9kZVxufTtcblxuZXhwb3J0IHR5cGUgTGVnZW5kUmVzb2x2ZU1hcCA9IHtcbiAgW0MgaW4gTm9uUG9zaXRpb25TY2FsZUNoYW5uZWxdPzogUmVzb2x2ZU1vZGVcbn07XG4iXX0= \ No newline at end of file diff --git a/build/src/scale.d.ts b/build/src/scale.d.ts new file mode 100644 index 0000000000..f7f62b075c --- /dev/null +++ b/build/src/scale.d.ts @@ -0,0 +1,417 @@ +import { BinParams } from './bin'; +import { Channel } from './channel'; +import { DateTime } from './datetime'; +import { Type } from './type'; +import { ScaleInterpolate, ScaleInterpolateParams } from './vega.schema'; +export declare namespace ScaleType { + const LINEAR: 'linear'; + const BIN_LINEAR: 'bin-linear'; + const LOG: 'log'; + const POW: 'pow'; + const SQRT: 'sqrt'; + const TIME: 'time'; + const UTC: 'utc'; + const SEQUENTIAL: 'sequential'; + const QUANTILE: 'quantile'; + const QUANTIZE: 'quantize'; + const THRESHOLD: 'threshold'; + const ORDINAL: 'ordinal'; + const BIN_ORDINAL: 'bin-ordinal'; + const POINT: 'point'; + const BAND: 'band'; +} +export declare type ScaleType = typeof ScaleType.LINEAR | typeof ScaleType.BIN_LINEAR | typeof ScaleType.LOG | typeof ScaleType.POW | typeof ScaleType.SQRT | typeof ScaleType.TIME | typeof ScaleType.UTC | typeof ScaleType.SEQUENTIAL | // typeof ScaleType.QUANTILE | typeof ScaleType.QUANTIZE | typeof ScaleType.THRESHOLD | +typeof ScaleType.ORDINAL | typeof ScaleType.BIN_ORDINAL | typeof ScaleType.POINT | typeof ScaleType.BAND; +export declare const SCALE_TYPES: ScaleType[]; +/** + * Whether the two given scale types can be merged together. + */ +export declare function scaleCompatible(scaleType1: ScaleType, scaleType2: ScaleType): boolean; +/** + * Return scale categories -- only scale of the same categories can be merged together. + */ +export declare function scaleTypePrecedence(scaleType: ScaleType): number; +export declare const CONTINUOUS_TO_CONTINUOUS_SCALES: ScaleType[]; +export declare const CONTINUOUS_DOMAIN_SCALES: ScaleType[]; +export declare const DISCRETE_DOMAIN_SCALES: ScaleType[]; +export declare const TIME_SCALE_TYPES: ScaleType[]; +export declare function hasDiscreteDomain(type: ScaleType): type is 'ordinal' | 'bin-ordinal' | 'point' | 'band'; +export declare function isBinScale(type: ScaleType): type is 'bin-linear' | 'bin-ordinal'; +export declare function hasContinuousDomain(type: ScaleType): type is 'linear' | 'log' | 'pow' | 'sqrt' | 'time' | 'utc' | 'sequential'; +export declare function isContinuousToContinuous(type: ScaleType): type is 'linear' | 'bin-linear' | 'log' | 'pow' | 'sqrt' | 'time' | 'utc'; +export declare type NiceTime = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'; +export interface ScaleConfig { + /** + * If true, rounds numeric output values to integers. + * This can be helpful for snapping to the pixel grid. + * (Only available for `x`, `y`, and `size` scales.) + */ + round?: boolean; + /** + * If true, values that exceed the data domain are clamped to either the minimum or maximum range value + */ + clamp?: boolean; + /** + * Default range step for `x` band and point scales of text marks. + * + * __Default value:__ `90` + * + * @minimum 0 + */ + textXRangeStep?: number; + /** + * Default range step for band and point scales of (1) the `y` channel + * and (2) the `x` channel when the mark is not `text`. + * + * __Default value:__ `21` + * + * @minimum 0 + */ + rangeStep?: number | null; + /** + * Default inner padding for `x` and `y` band-ordinal scales. + * + * __Default value:__ `0.1` + * + * @minimum 0 + * @maximum 1 + */ + bandPaddingInner?: number; + /** + * Default outer padding for `x` and `y` band-ordinal scales. + * If not specified, by default, band scale's paddingOuter is paddingInner/2. + * @minimum 0 + * @maximum 1 + */ + bandPaddingOuter?: number; + /** + * Default padding for continuous scales. + * + * __Default:__ `5` for continuous x-scale of a vertical bar and continuous y-scale of a horizontal bar.; `0` otherwise. + * + * @minimum 0 + */ + continuousPadding?: number; + /** + * Default outer padding for `x` and `y` point-ordinal scales. + * + * __Default value:__ `0.5` + * + * @minimum 0 + * @maximum 1 + */ + pointPadding?: number; + /** + * Use the source data range before aggregation as scale domain instead of aggregated data for aggregate axis. + * + * This is equivalent to setting `domain` to `"unaggregate"` for aggregated _quantitative_ fields by default. + * + * This property only works with aggregate functions that produce values within the raw data domain (`"mean"`, `"average"`, `"median"`, `"q1"`, `"q3"`, `"min"`, `"max"`). For other aggregations that produce values outside of the raw data domain (e.g. `"count"`, `"sum"`), this property is ignored. + * + * __Default value:__ `false` + */ + useUnaggregatedDomain?: boolean; + /** + * The default max value for mapping quantitative fields to bar's size/bandSize. + * + * If undefined (default), we will use the scale's `rangeStep` - 1. + * @minimum 0 + */ + maxBandSize?: number; + /** + * The default min value for mapping quantitative fields to bar and tick's size/bandSize scale with zero=false. + * + * __Default value:__ `2` + * + * @minimum 0 + */ + minBandSize?: number; + /** + * The default max value for mapping quantitative fields to text's size/fontSize. + * + * __Default value:__ `40` + * + * @minimum 0 + */ + maxFontSize?: number; + /** + * The default min value for mapping quantitative fields to tick's size/fontSize scale with zero=false + * + * __Default value:__ `8` + * + * @minimum 0 + */ + minFontSize?: number; + /** + * Default minimum opacity for mapping a field to opacity. + * + * __Default value:__ `0.3` + * + * @minimum 0 + * @maximum 1 + */ + minOpacity?: number; + /** + * Default max opacity for mapping a field to opacity. + * + * __Default value:__ `0.8` + * + * @minimum 0 + * @maximum 1 + */ + maxOpacity?: number; + /** + * Default minimum value for point size scale with zero=false. + * + * __Default value:__ `9` + * + * @minimum 0 + */ + minSize?: number; + /** + * Default max value for point size scale. + * @minimum 0 + */ + maxSize?: number; + /** + * Default minimum strokeWidth for the scale of strokeWidth for rule and line marks and of size for trail marks with zero=false. + * + * __Default value:__ `1` + * + * @minimum 0 + */ + minStrokeWidth?: number; + /** + * Default max strokeWidth for the scale of strokeWidth for rule and line marks and of size for trail marks. + * + * __Default value:__ `4` + * + * @minimum 0 + */ + maxStrokeWidth?: number; +} +export declare const defaultScaleConfig: { + textXRangeStep: number; + rangeStep: number; + pointPadding: number; + bandPaddingInner: number; + facetSpacing: number; + minBandSize: number; + minFontSize: number; + maxFontSize: number; + minOpacity: number; + maxOpacity: number; + minSize: number; + minStrokeWidth: number; + maxStrokeWidth: number; +}; +export interface SchemeParams { + /** + * A color scheme name for sequential/ordinal scales (e.g., `"category10"` or `"viridis"`). + * + * For the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference. + */ + name: string; + /** + * For sequential and diverging schemes only, determines the extent of the color range to use. For example `[0.2, 1]` will rescale the color scheme such that color values in the range _[0, 0.2)_ are excluded from the scheme. + */ + extent?: number[]; + /** + * The number of colors to use in the scheme. This can be useful for scale types such as `"quantize"`, which use the length of the scale range to determine the number of discrete bins for the scale domain. + * + * @hide + */ + count?: number; +} +export declare type SelectionDomain = { + /** + * The name of a selection. + */ + selection: string; + /** + * The field name to extract selected values for, when a selection is [projected](https://vega.github.io/vega-lite/docs/project.html) + * over multiple fields or encodings. + */ + field?: string; +} | { + /** + * The name of a selection. + */ + selection: string; + /** + * The encoding channel to extract selected values for, when a selection is [projected](https://vega.github.io/vega-lite/docs/project.html) + * over multiple fields or encodings. + */ + encoding?: string; +}; +export declare type Domain = number[] | string[] | boolean[] | DateTime[] | 'unaggregated' | SelectionDomain; +export declare type Scheme = string | SchemeParams; +export declare type Range = number[] | string[] | string; +export declare function isExtendedScheme(scheme: string | SchemeParams): scheme is SchemeParams; +export declare function isSelectionDomain(domain: Domain): domain is SelectionDomain; +export interface Scale { + /** + * The type of scale. Vega-Lite supports the following categories of scale types: + * + * 1) [**Continuous Scales**](https://vega.github.io/vega-lite/docs/scale.html#continuous) -- mapping continuous domains to continuous output ranges ([`"linear"`](https://vega.github.io/vega-lite/docs/scale.html#linear), [`"pow"`](https://vega.github.io/vega-lite/docs/scale.html#pow), [`"sqrt"`](https://vega.github.io/vega-lite/docs/scale.html#sqrt), [`"log"`](https://vega.github.io/vega-lite/docs/scale.html#log), [`"time"`](https://vega.github.io/vega-lite/docs/scale.html#time), [`"utc"`](https://vega.github.io/vega-lite/docs/scale.html#utc), [`"sequential"`](https://vega.github.io/vega-lite/docs/scale.html#sequential)). + * + * 2) [**Discrete Scales**](https://vega.github.io/vega-lite/docs/scale.html#discrete) -- mapping discrete domains to discrete ([`"ordinal"`](https://vega.github.io/vega-lite/docs/scale.html#ordinal)) or continuous ([`"band"`](https://vega.github.io/vega-lite/docs/scale.html#band) and [`"point"`](https://vega.github.io/vega-lite/docs/scale.html#point)) output ranges. + * + * 3) [**Discretizing Scales**](https://vega.github.io/vega-lite/docs/scale.html#discretizing) -- mapping continuous domains to discrete output ranges ([`"bin-linear"`](https://vega.github.io/vega-lite/docs/scale.html#bin-linear) and [`"bin-ordinal"`](https://vega.github.io/vega-lite/docs/scale.html#bin-ordinal)). + * + * __Default value:__ please see the [scale type table](https://vega.github.io/vega-lite/docs/scale.html#type). + */ + type?: ScaleType; + /** + * Customized domain values. + * + * For _quantitative_ fields, `domain` can take the form of a two-element array with minimum and maximum values. [Piecewise scales](https://vega.github.io/vega-lite/docs/scale.html#piecewise) can be created by providing a `domain` with more than two entries. + * If the input field is aggregated, `domain` can also be a string value `"unaggregated"`, indicating that the domain should include the raw data values prior to the aggregation. + * + * For _temporal_ fields, `domain` can be a two-element array minimum and maximum values, in the form of either timestamps or the [DateTime definition objects](https://vega.github.io/vega-lite/docs/types.html#datetime). + * + * For _ordinal_ and _nominal_ fields, `domain` can be an array that lists valid input values. + * + * The `selection` property can be used to [interactively determine](https://vega.github.io/vega-lite/docs/selection.html#scale-domains) the scale domain. + */ + domain?: number[] | string[] | boolean[] | DateTime[] | 'unaggregated' | SelectionDomain; + /** + * If true, reverses the order of the scale range. + * __Default value:__ `false`. + * + * @hide + */ + reverse?: boolean; + /** + * The range of the scale. One of: + * + * - A string indicating a [pre-defined named scale range](https://vega.github.io/vega-lite/docs/scale.html#range-config) (e.g., example, `"symbol"`, or `"diverging"`). + * + * - For [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous), two-element array indicating minimum and maximum values, or an array with more than two entries for specifying a [piecewise scale](https://vega.github.io/vega-lite/docs/scale.html#piecewise). + * + * - For [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) and [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales, an array of desired output values. + * + * __Notes:__ + * + * 1) For [sequential](https://vega.github.io/vega-lite/docs/scale.html#sequential), [ordinal](https://vega.github.io/vega-lite/docs/scale.html#ordinal), and discretizing color scales, you can also specify a color [`scheme`](https://vega.github.io/vega-lite/docs/scale.html#scheme) instead of `range`. + * + * 2) Any directly specified `range` for `x` and `y` channels will be ignored. Range can be customized via the view's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` and `height`) or via [range steps and paddings properties](#range-step) for [band](#band) and [point](#point) scales. + */ + range?: number[] | string[] | string; + /** + * The distance between the starts of adjacent bands or points in [band](https://vega.github.io/vega-lite/docs/scale.html#band) and [point](https://vega.github.io/vega-lite/docs/scale.html#point) scales. + * + * If `rangeStep` is `null` or if the view contains the scale's corresponding [size](https://vega.github.io/vega-lite/docs/size.html) (`width` for `x` scales and `height` for `y` scales), `rangeStep` will be automatically determined to fit the size of the view. + * + * __Default value:__ derived the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `textXRangeStep` (`90` by default) for x-scales of `text` marks and `rangeStep` (`21` by default) for x-scales of other marks and y-scales. + * + * __Warning__: If `rangeStep` is `null` and the cardinality of the scale's domain is higher than `width` or `height`, the rangeStep might become less than one pixel and the mark might not appear correctly. + * + * @minimum 0 + */ + rangeStep?: number | null; + /** + * A string indicating a color [scheme](https://vega.github.io/vega-lite/docs/scale.html#scheme) name (e.g., `"category10"` or `"viridis"`) or a [scheme parameter object](https://vega.github.io/vega-lite/docs/scale.html#scheme-params). + * + * Discrete color schemes may be used with [discrete](https://vega.github.io/vega-lite/docs/scale.html#discrete) or [discretizing](https://vega.github.io/vega-lite/docs/scale.html#discretizing) scales. Continuous color schemes are intended for use with [sequential](https://vega.github.io/vega-lite/docs/scales.html#sequential) scales. + * + * For the full list of supported schemes, please refer to the [Vega Scheme](https://vega.github.io/vega/docs/schemes/#reference) reference. + */ + scheme?: string | SchemeParams; + /** + * If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid. + * + * __Default value:__ `false`. + */ + round?: boolean; + /** + * For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the zero, nice, domainMin, and domainMax properties. + * + * For _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value. + * + * For _[point](https://vega.github.io/vega-lite/docs/scale.html#point)_ scales, alias for `paddingOuter`. + * + * __Default value:__ For _continuous_ scales, derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `continuousPadding`. + * For _band and point_ scales, see `paddingInner` and `paddingOuter`. + * + * @minimum 0 + */ + padding?: number; + /** + * The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1]. + * + * For point scale, this property is invalid as point scales do not have internal band widths (only step sizes between bands). + * + * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingInner`. + * + * @minimum 0 + * @maximum 1 + */ + paddingInner?: number; + /** + * The outer padding (spacing) at the ends of the range of band and point scales, + * as a fraction of the step size. This value must lie in the range [0,1]. + * + * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/scale.html#config)'s `bandPaddingOuter` for band scales and `pointPadding` for point scales. + * + * @minimum 0 + * @maximum 1 + */ + paddingOuter?: number; + /** + * If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value + * + * __Default value:__ derived from the [scale config](https://vega.github.io/vega-lite/docs/config.html#scale-config)'s `clamp` (`true` by default). + */ + clamp?: boolean; + /** + * Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_. + * + * For quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain. + * + * For temporal fields with time and utc scales, the `nice` value can be a string indicating the desired time interval. Legal values are `"millisecond"`, `"second"`, `"minute"`, `"hour"`, `"day"`, `"week"`, `"month"`, and `"year"`. Alternatively, `time` and `utc` scales can accept an object-valued interval specifier of the form `{"interval": "month", "step": 3}`, which includes a desired number of interval steps. Here, the domain would snap to quarter (Jan, Apr, Jul, Oct) boundaries. + * + * __Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise. + * + */ + nice?: boolean | number | NiceTime | { + interval: string; + step: number; + }; + /** + * The logarithm base of the `log` scale (default `10`). + */ + base?: number; + /** + * The exponent of the `pow` scale. + */ + exponent?: number; + /** + * If `true`, ensures that a zero baseline value is included in the scale domain. + * + * __Default value:__ `true` for x and y channels if the quantitative field is not binned and no custom `domain` is provided; `false` otherwise. + * + * __Note:__ Log, time, and utc scales do not support `zero`. + */ + zero?: boolean; + /** + * The interpolation method for range values. By default, a general interpolator for numbers, dates, strings and colors (in RGB space) is used. For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate). + * + * __Note:__ Sequential scales do not support `interpolate` as they have a fixed interpolator. Since Vega-Lite uses sequential scales for quantitative fields by default, you have to set the scale `type` to other quantitative scale type such as `"linear"` to customize `interpolate`. + */ + interpolate?: ScaleInterpolate | ScaleInterpolateParams; +} +export declare const SCALE_PROPERTIES: ("reverse" | "base" | "padding" | "type" | "domain" | "range" | "zero" | "nice" | "rangeStep" | "scheme" | "round" | "paddingInner" | "paddingOuter" | "clamp" | "exponent" | "interpolate")[]; +export declare const NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES: ("reverse" | "base" | "padding" | "zero" | "nice" | "round" | "paddingInner" | "paddingOuter" | "clamp" | "exponent" | "interpolate")[]; +export declare const SCALE_TYPE_INDEX: ScaleTypeIndex; +export declare function scaleTypeSupportProperty(scaleType: ScaleType, propName: keyof Scale): boolean; +/** + * Returns undefined if the input channel supports the input scale property name + */ +export declare function channelScalePropertyIncompatability(channel: Channel, propName: keyof Scale): string; +export declare function scaleTypeSupportDataType(specifiedType: ScaleType, fieldDefType: Type, bin: boolean | BinParams): boolean; +export declare function channelSupportScaleType(channel: Channel, scaleType: ScaleType): boolean; +export declare function getSupportedScaleType(channel: Channel, fieldDefType: Type, bin?: boolean): ScaleType[]; +export interface ScaleTypeIndex { + [channel: string]: ScaleType[]; +} diff --git a/build/src/scale.js b/build/src/scale.js new file mode 100644 index 0000000000..e6fcc571e4 --- /dev/null +++ b/build/src/scale.js @@ -0,0 +1,302 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("./channel"); +var log = tslib_1.__importStar(require("./log")); +var type_1 = require("./type"); +var util_1 = require("./util"); +var ScaleType; +(function (ScaleType) { + // Continuous - Quantitative + ScaleType.LINEAR = 'linear'; + ScaleType.BIN_LINEAR = 'bin-linear'; + ScaleType.LOG = 'log'; + ScaleType.POW = 'pow'; + ScaleType.SQRT = 'sqrt'; + // Continuous - Time + ScaleType.TIME = 'time'; + ScaleType.UTC = 'utc'; + // sequential + ScaleType.SEQUENTIAL = 'sequential'; + // Quantile, Quantize, threshold + ScaleType.QUANTILE = 'quantile'; + ScaleType.QUANTIZE = 'quantize'; + ScaleType.THRESHOLD = 'threshold'; + ScaleType.ORDINAL = 'ordinal'; + ScaleType.BIN_ORDINAL = 'bin-ordinal'; + ScaleType.POINT = 'point'; + ScaleType.BAND = 'band'; +})(ScaleType = exports.ScaleType || (exports.ScaleType = {})); +/** + * Index for scale categories -- only scale of the same categories can be merged together. + * Current implementation is trying to be conservative and avoid merging scale type that might not work together + */ +var SCALE_CATEGORY_INDEX = { + linear: 'numeric', + log: 'numeric', + pow: 'numeric', + sqrt: 'numeric', + 'bin-linear': 'bin-linear', + time: 'time', + utc: 'time', + sequential: 'sequential', + ordinal: 'ordinal', + 'bin-ordinal': 'bin-ordinal', + point: 'ordinal-position', + band: 'ordinal-position' +}; +exports.SCALE_TYPES = util_1.keys(SCALE_CATEGORY_INDEX); +/** + * Whether the two given scale types can be merged together. + */ +function scaleCompatible(scaleType1, scaleType2) { + var scaleCategory1 = SCALE_CATEGORY_INDEX[scaleType1]; + var scaleCategory2 = SCALE_CATEGORY_INDEX[scaleType2]; + return scaleCategory1 === scaleCategory2 || + (scaleCategory1 === 'ordinal-position' && scaleCategory2 === 'time') || + (scaleCategory2 === 'ordinal-position' && scaleCategory1 === 'time'); +} +exports.scaleCompatible = scaleCompatible; +/** + * Index for scale precedence -- high score = higher priority for merging. + */ +var SCALE_PRECEDENCE_INDEX = { + // numeric + linear: 0, + log: 1, + pow: 1, + sqrt: 1, + // time + time: 0, + utc: 0, + // ordinal-position -- these have higher precedence than continuous scales as they support more types of data + point: 10, + band: 11, + // non grouped types + 'bin-linear': 0, + sequential: 0, + ordinal: 0, + 'bin-ordinal': 0, +}; +/** + * Return scale categories -- only scale of the same categories can be merged together. + */ +function scaleTypePrecedence(scaleType) { + return SCALE_PRECEDENCE_INDEX[scaleType]; +} +exports.scaleTypePrecedence = scaleTypePrecedence; +exports.CONTINUOUS_TO_CONTINUOUS_SCALES = ['linear', 'bin-linear', 'log', 'pow', 'sqrt', 'time', 'utc']; +var CONTINUOUS_TO_CONTINUOUS_INDEX = vega_util_1.toSet(exports.CONTINUOUS_TO_CONTINUOUS_SCALES); +exports.CONTINUOUS_DOMAIN_SCALES = exports.CONTINUOUS_TO_CONTINUOUS_SCALES.concat(['sequential' /* TODO add 'quantile', 'quantize', 'threshold'*/]); +var CONTINUOUS_DOMAIN_INDEX = vega_util_1.toSet(exports.CONTINUOUS_DOMAIN_SCALES); +exports.DISCRETE_DOMAIN_SCALES = ['ordinal', 'bin-ordinal', 'point', 'band']; +var DISCRETE_DOMAIN_INDEX = vega_util_1.toSet(exports.DISCRETE_DOMAIN_SCALES); +var BIN_SCALES_INDEX = vega_util_1.toSet(['bin-linear', 'bin-ordinal']); +exports.TIME_SCALE_TYPES = ['time', 'utc']; +function hasDiscreteDomain(type) { + return type in DISCRETE_DOMAIN_INDEX; +} +exports.hasDiscreteDomain = hasDiscreteDomain; +function isBinScale(type) { + return type in BIN_SCALES_INDEX; +} +exports.isBinScale = isBinScale; +function hasContinuousDomain(type) { + return type in CONTINUOUS_DOMAIN_INDEX; +} +exports.hasContinuousDomain = hasContinuousDomain; +function isContinuousToContinuous(type) { + return type in CONTINUOUS_TO_CONTINUOUS_INDEX; +} +exports.isContinuousToContinuous = isContinuousToContinuous; +exports.defaultScaleConfig = { + textXRangeStep: 90, + rangeStep: 21, + pointPadding: 0.5, + bandPaddingInner: 0.1, + facetSpacing: 16, + minBandSize: 2, + minFontSize: 8, + maxFontSize: 40, + minOpacity: 0.3, + maxOpacity: 0.8, + // FIXME: revise if these *can* become ratios of rangeStep + minSize: 9, + minStrokeWidth: 1, + maxStrokeWidth: 4 +}; +function isExtendedScheme(scheme) { + return scheme && !!scheme['name']; +} +exports.isExtendedScheme = isExtendedScheme; +function isSelectionDomain(domain) { + return domain && domain['selection']; +} +exports.isSelectionDomain = isSelectionDomain; +var SCALE_PROPERTY_INDEX = { + type: 1, + domain: 1, + range: 1, + rangeStep: 1, + scheme: 1, + // Other properties + reverse: 1, + round: 1, + // quantitative / time + clamp: 1, + nice: 1, + // quantitative + base: 1, + exponent: 1, + interpolate: 1, + zero: 1, + // band/point + padding: 1, + paddingInner: 1, + paddingOuter: 1 +}; +exports.SCALE_PROPERTIES = util_1.flagKeys(SCALE_PROPERTY_INDEX); +var type = SCALE_PROPERTY_INDEX.type, domain = SCALE_PROPERTY_INDEX.domain, range = SCALE_PROPERTY_INDEX.range, rangeStep = SCALE_PROPERTY_INDEX.rangeStep, scheme = SCALE_PROPERTY_INDEX.scheme, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX = tslib_1.__rest(SCALE_PROPERTY_INDEX, ["type", "domain", "range", "rangeStep", "scheme"]); +exports.NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES = util_1.flagKeys(NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX); +exports.SCALE_TYPE_INDEX = generateScaleTypeIndex(); +function scaleTypeSupportProperty(scaleType, propName) { + switch (propName) { + case 'type': + case 'domain': + case 'reverse': + case 'range': + return true; + case 'scheme': + return util_1.contains(['sequential', 'ordinal', 'bin-ordinal', 'quantile', 'quantize'], scaleType); + case 'interpolate': + // FIXME(https://github.com/vega/vega-lite/issues/2902) how about ordinal? + return util_1.contains(['linear', 'bin-linear', 'pow', 'log', 'sqrt', 'utc', 'time'], scaleType); + case 'round': + return isContinuousToContinuous(scaleType) || scaleType === 'band' || scaleType === 'point'; + case 'padding': + return isContinuousToContinuous(scaleType) || util_1.contains(['point', 'band'], scaleType); + case 'paddingOuter': + case 'rangeStep': + return util_1.contains(['point', 'band'], scaleType); + case 'paddingInner': + return scaleType === 'band'; + case 'clamp': + return isContinuousToContinuous(scaleType) || scaleType === 'sequential'; + case 'nice': + return isContinuousToContinuous(scaleType) || scaleType === 'sequential' || scaleType === 'quantize'; + case 'exponent': + return scaleType === 'pow'; + case 'base': + return scaleType === 'log'; + case 'zero': + return hasContinuousDomain(scaleType) && !util_1.contains([ + 'log', + 'time', 'utc', + 'bin-linear', + 'threshold', + 'quantile' // quantile depends on distribution so zero does not matter + ], scaleType); + } + /* istanbul ignore next: should never reach here*/ + throw new Error("Invalid scale property " + propName + "."); +} +exports.scaleTypeSupportProperty = scaleTypeSupportProperty; +/** + * Returns undefined if the input channel supports the input scale property name + */ +function channelScalePropertyIncompatability(channel, propName) { + switch (propName) { + case 'interpolate': + case 'scheme': + if (!channel_1.isColorChannel(channel)) { + return log.message.cannotUseScalePropertyWithNonColor(channel); + } + return undefined; + case 'type': + case 'domain': + case 'range': + case 'base': + case 'exponent': + case 'nice': + case 'padding': + case 'paddingInner': + case 'paddingOuter': + case 'rangeStep': + case 'reverse': + case 'round': + case 'clamp': + case 'zero': + return undefined; // GOOD! + } + /* istanbul ignore next: it should never reach here */ + throw new Error("Invalid scale property \"" + propName + "\"."); +} +exports.channelScalePropertyIncompatability = channelScalePropertyIncompatability; +function scaleTypeSupportDataType(specifiedType, fieldDefType, bin) { + if (util_1.contains([type_1.Type.ORDINAL, type_1.Type.NOMINAL], fieldDefType)) { + return specifiedType === undefined || hasDiscreteDomain(specifiedType); + } + else if (fieldDefType === type_1.Type.TEMPORAL) { + return util_1.contains([ScaleType.TIME, ScaleType.UTC, ScaleType.SEQUENTIAL, undefined], specifiedType); + } + else if (fieldDefType === type_1.Type.QUANTITATIVE) { + if (bin) { + return util_1.contains([ScaleType.BIN_LINEAR, ScaleType.BIN_ORDINAL, ScaleType.LINEAR], specifiedType); + } + return util_1.contains([ScaleType.LOG, ScaleType.POW, ScaleType.SQRT, ScaleType.QUANTILE, ScaleType.QUANTIZE, ScaleType.LINEAR, ScaleType.SEQUENTIAL, undefined], specifiedType); + } + return true; +} +exports.scaleTypeSupportDataType = scaleTypeSupportDataType; +function channelSupportScaleType(channel, scaleType) { + switch (channel) { + case channel_1.Channel.X: + case channel_1.Channel.Y: + case channel_1.Channel.SIZE: // TODO: size and opacity can support ordinal with more modification + case channel_1.Channel.OPACITY: + // Although it generally doesn't make sense to use band with size and opacity, + // it can also work since we use band: 0.5 to get midpoint. + return isContinuousToContinuous(scaleType) || util_1.contains(['band', 'point'], scaleType); + case channel_1.Channel.COLOR: + case channel_1.Channel.FILL: + case channel_1.Channel.STROKE: + return scaleType !== 'band'; // band does not make sense with color + case channel_1.Channel.SHAPE: + return scaleType === 'ordinal'; // shape = lookup only + } + /* istanbul ignore next: it should never reach here */ + return false; +} +exports.channelSupportScaleType = channelSupportScaleType; +function getSupportedScaleType(channel, fieldDefType, bin) { + return exports.SCALE_TYPE_INDEX[generateScaleTypeIndexKey(channel, fieldDefType, bin)]; +} +exports.getSupportedScaleType = getSupportedScaleType; +// generates ScaleTypeIndex where keys are encoding channels and values are list of valid ScaleTypes +function generateScaleTypeIndex() { + var index = {}; + for (var _i = 0, CHANNELS_1 = channel_1.CHANNELS; _i < CHANNELS_1.length; _i++) { + var channel = CHANNELS_1[_i]; + for (var _a = 0, _b = util_1.keys(type_1.TYPE_INDEX); _a < _b.length; _a++) { + var fieldDefType = _b[_a]; + for (var _c = 0, SCALE_TYPES_1 = exports.SCALE_TYPES; _c < SCALE_TYPES_1.length; _c++) { + var scaleType = SCALE_TYPES_1[_c]; + for (var _d = 0, _e = [false, true]; _d < _e.length; _d++) { + var bin = _e[_d]; + var key = generateScaleTypeIndexKey(channel, fieldDefType, bin); + if (channelSupportScaleType(channel, scaleType) && scaleTypeSupportDataType(scaleType, fieldDefType, bin)) { + index[key] = index[key] || []; + index[key].push(scaleType); + } + } + } + } + } + return index; +} +function generateScaleTypeIndexKey(channel, fieldDefType, bin) { + var key = channel + '_' + fieldDefType; + return bin ? key + '_bin' : key; +} +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NhbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQWdDO0FBRWhDLHFDQUE0RDtBQUU1RCxpREFBNkI7QUFDN0IsK0JBQXdDO0FBQ3hDLCtCQUFzRDtBQUd0RCxJQUFpQixTQUFTLENBc0J6QjtBQXRCRCxXQUFpQixTQUFTO0lBQ3hCLDRCQUE0QjtJQUNmLGdCQUFNLEdBQWEsUUFBUSxDQUFDO0lBQzVCLG9CQUFVLEdBQWlCLFlBQVksQ0FBQztJQUN4QyxhQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGFBQUcsR0FBVSxLQUFLLENBQUM7SUFDbkIsY0FBSSxHQUFXLE1BQU0sQ0FBQztJQUNuQyxvQkFBb0I7SUFDUCxjQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLGFBQUcsR0FBVSxLQUFLLENBQUM7SUFDaEMsYUFBYTtJQUNBLG9CQUFVLEdBQWlCLFlBQVksQ0FBQztJQUVyRCxnQ0FBZ0M7SUFDbkIsa0JBQVEsR0FBZSxVQUFVLENBQUM7SUFDbEMsa0JBQVEsR0FBZSxVQUFVLENBQUM7SUFDbEMsbUJBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBRXJDLGlCQUFPLEdBQWMsU0FBUyxDQUFDO0lBQy9CLHFCQUFXLEdBQWtCLGFBQWEsQ0FBQztJQUMzQyxlQUFLLEdBQVksT0FBTyxDQUFDO0lBQ3pCLGNBQUksR0FBVyxNQUFNLENBQUM7QUFDckMsQ0FBQyxFQXRCZ0IsU0FBUyxHQUFULGlCQUFTLEtBQVQsaUJBQVMsUUFzQnpCO0FBVUQ7OztHQUdHO0FBQ0gsSUFBTSxvQkFBb0IsR0FHdEI7SUFDRixNQUFNLEVBQUUsU0FBUztJQUNqQixHQUFHLEVBQUUsU0FBUztJQUNkLEdBQUcsRUFBRSxTQUFTO0lBQ2QsSUFBSSxFQUFFLFNBQVM7SUFDZixZQUFZLEVBQUUsWUFBWTtJQUMxQixJQUFJLEVBQUUsTUFBTTtJQUNaLEdBQUcsRUFBRSxNQUFNO0lBQ1gsVUFBVSxF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QTNCLElBQU0sT0FBTyxpQkFBQTtRQUNoQixLQUEyQixVQUFnQixFQUFoQixLQUFBLFdBQUksQ0FBQyxpQkFBVSxDQUFDLEVBQWhCLGNBQWdCLEVBQWhCLElBQWdCLEVBQUU7WUFBeEMsSUFBTSxZQUFZLFNBQUE7WUFDckIsS0FBd0IsVUFBVyxFQUFYLGdCQUFBLG1CQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7Z0JBQWhDLElBQU0sU0FBUyxvQkFBQTtnQkFDbEIsS0FBa0IsVUFBYSxFQUFiLE1BQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7b0JBQTVCLElBQU0sR0FBRyxTQUFBO29CQUNaLElBQU0sR0FBRyxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2xFLElBQUksdUJBQXVCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLEVBQUU7d0JBQ3pHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM5QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUM1QjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELG1DQUFtQyxPQUFnQixFQUFFLFlBQWtCLEVBQUUsR0FBWTtJQUNuRixJQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQztJQUN6QyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3RvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtCaW5QYXJhbXN9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2hhbm5lbCwgQ0hBTk5FTFMsIGlzQ29sb3JDaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtUeXBlLCBUWVBFX0lOREVYfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtjb250YWlucywgRmxhZywgZmxhZ0tleXMsIGtleXN9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge1NjYWxlSW50ZXJwb2xhdGUsIFNjYWxlSW50ZXJwb2xhdGVQYXJhbXN9IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFNjYWxlVHlwZSB7XG4gIC8vIENvbnRpbnVvdXMgLSBRdWFudGl0YXRpdmVcbiAgZXhwb3J0IGNvbnN0IExJTkVBUjogJ2xpbmVhcicgPSAnbGluZWFyJztcbiAgZXhwb3J0IGNvbnN0IEJJTl9MSU5FQVI6ICdiaW4tbGluZWFyJyA9ICdiaW4tbGluZWFyJztcbiAgZXhwb3J0IGNvbnN0IExPRzogJ2xvZycgPSAnbG9nJztcbiAgZXhwb3J0IGNvbnN0IFBPVzogJ3BvdycgPSAncG93JztcbiAgZXhwb3J0IGNvbnN0IFNRUlQ6ICdzcXJ0JyA9ICdzcXJ0JztcbiAgLy8gQ29udGludW91cyAtIFRpbWVcbiAgZXhwb3J0IGNvbnN0IFRJTUU6ICd0aW1lJyA9ICd0aW1lJztcbiAgZXhwb3J0IGNvbnN0IFVUQzogJ3V0YycgPSAndXRjJztcbiAgLy8gc2VxdWVudGlhbFxuICBleHBvcnQgY29uc3QgU0VRVUVOVElBTDogJ3NlcXVlbnRpYWwnID0gJ3NlcXVlbnRpYWwnO1xuXG4gIC8vIFF1YW50aWxlLCBRdWFudGl6ZSwgdGhyZXNob2xkXG4gIGV4cG9ydCBjb25zdCBRVUFOVElMRTogJ3F1YW50aWxlJyA9ICdxdWFudGlsZSc7XG4gIGV4cG9ydCBjb25zdCBRVUFOVElaRTogJ3F1YW50aXplJyA9ICdxdWFudGl6ZSc7XG4gIGV4cG9ydCBjb25zdCBUSFJFU0hPTEQ6ICd0aHJlc2hvbGQnID0gJ3RocmVzaG9sZCc7XG5cbiAgZXhwb3J0IGNvbnN0IE9SRElOQUw6ICdvcmRpbmFsJyA9ICdvcmRpbmFsJztcbiAgZXhwb3J0IGNvbnN0IEJJTl9PUkRJTkFMOiAnYmluLW9yZGluYWwnID0gJ2Jpbi1vcmRpbmFsJztcbiAgZXhwb3J0IGNvbnN0IFBPSU5UOiAncG9pbnQnID0gJ3BvaW50JztcbiAgZXhwb3J0IGNvbnN0IEJBTkQ6ICdiYW5kJyA9ICdiYW5kJztcbn1cblxuZXhwb3J0IHR5cGUgU2NhbGVUeXBlID0gdHlwZW9mIFNjYWxlVHlwZS5MSU5FQVIgfCB0eXBlb2YgU2NhbGVUeXBlLkJJTl9MSU5FQVIgfFxuICB0eXBlb2YgU2NhbGVUeXBlLkxPRyB8IHR5cGVvZiBTY2FsZVR5cGUuUE9XIHwgdHlwZW9mIFNjYWxlVHlwZS5TUVJUIHxcbiAgdHlwZW9mIFNjYWxlVHlwZS5USU1FIHwgdHlwZW9mIFNjYWxlVHlwZS5VVEMgfFxuICAvLyBUT0RPOiBhZGQgJ3F1YW50aXplJywgJ3F1YW50aWxlJywgJ3RocmVzaG9sZCcgYmFjayB3aGVuIHdlIHJlYWxseSBzdXBwb3J0IHRoZW1cbiAgdHlwZW9mIFNjYWxlVHlwZS5TRVFVRU5USUFMIHwgLy8gdHlwZW9mIFNjYWxlVHlwZS5RVUFOVElMRSB8IHR5cGVvZiBTY2FsZVR5cGUuUVVBTlRJWkUgfCB0eXBlb2YgU2NhbGVUeXBlLlRIUkVTSE9MRCB8XG4gIHR5cGVvZiBTY2FsZVR5cGUuT1JESU5BTCB8IHR5cGVvZiBTY2FsZVR5cGUuQklOX09SRElOQUwgfCB0eXBlb2YgU2NhbGVUeXBlLlBPSU5UIHwgdHlwZW9mIFNjYWxlVHlwZS5CQU5EO1xuXG5cbi8qKlxuICogSW5kZXggZm9yIHNjYWxlIGNhdGVnb3JpZXMgLS0gb25seSBzY2FsZSBvZiB0aGUgc2FtZSBjYXRlZ29yaWVzIGNhbiBiZSBtZXJnZWQgdG9nZXRoZXIuXG4gKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRyeWluZyB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGF2b2lkIG1lcmdpbmcgc2NhbGUgdHlwZSB0aGF0IG1pZ2h0IG5vdCB3b3JrIHRvZ2V0aGVyXG4gKi9cbmNvbnN0IFNDQUxFX0NBVEVHT1JZX0lOREVYOiB7XG4gIC8vIFVzaW5nIE1hcHBlZCBUeXBlIHRvIGRlY2xhcmUgdHlwZSAoaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXMpXG4gIFtrIGluIFNjYWxlVHlwZV06IFNjYWxlVHlwZSB8ICdudW1lcmljJyB8ICdvcmRpbmFsLXBvc2l0aW9uJ1xufSA9IHtcbiAgbGluZWFyOiAnbnVtZXJpYycsXG4gIGxvZzogJ251bWVyaWMnLFxuICBwb3c6ICdudW1lcmljJyxcbiAgc3FydDogJ251bWVyaWMnLFxuICAnYmluLWxpbmVhcic6ICdiaW4tbGluZWFyJywgLy8gVE9ETzogc2hvdWxkIGJpbi1saW5lYXIgc3VwcG9ydCBtZXJnaW5nIHdpdGggb3RoZXJcbiAgdGltZTogJ3RpbWUnLFxuICB1dGM6ICd0aW1lJyxcbiAgc2VxdWVudGlhbDogJ3NlcXVlbnRpYWwnLFxuICBvcmRpbmFsOiAnb3JkaW5hbCcsXG4gICdiaW4tb3JkaW5hbCc6ICdiaW4tb3JkaW5hbCcsIC8vIFRPRE86IHNob3VsZCBiaW4tb3JkaW5hbCBzdXBwb3J0IG1lcmdpbmcgd2l0aCBvdGhlclxuICBwb2ludDogJ29yZGluYWwtcG9zaXRpb24nLFxuICBiYW5kOiAnb3JkaW5hbC1wb3NpdGlvbidcbn07XG5cbmV4cG9ydCBjb25zdCBTQ0FMRV9UWVBFUyA9IGtleXMoU0NBTEVfQ0FURUdPUllfSU5ERVgpIGFzIFNjYWxlVHlwZVtdO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHR3byBnaXZlbiBzY2FsZSB0eXBlcyBjYW4gYmUgbWVyZ2VkIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVDb21wYXRpYmxlKHNjYWxlVHlwZTE6IFNjYWxlVHlwZSwgc2NhbGVUeXBlMjogU2NhbGVUeXBlKSB7XG4gIGNvbnN0IHNjYWxlQ2F0ZWdvcnkxID0gU0NBTEVfQ0FURUdPUllfSU5ERVhbc2NhbGVUeXBlMV07XG4gIGNvbnN0IHNjYWxlQ2F0ZWdvcnkyID0gU0NBTEVfQ0FURUdPUllfSU5ERVhbc2NhbGVUeXBlMl07XG4gIHJldHVybiBzY2FsZUNhdGVnb3J5MSA9PT0gc2NhbGVDYXRlZ29yeTIgfHxcbiAgICAoc2NhbGVDYXRlZ29yeTEgPT09ICdvcmRpbmFsLXBvc2l0aW9uJyAmJiBzY2FsZUNhdGVnb3J5MiA9PT0gJ3RpbWUnKSB8fFxuICAgIChzY2FsZUNhdGVnb3J5MiA9PT0gJ29yZGluYWwtcG9zaXRpb24nICYmIHNjYWxlQ2F0ZWdvcnkxID09PSAndGltZScpO1xufVxuXG4vKipcbiAqIEluZGV4IGZvciBzY2FsZSBwcmVjZWRlbmNlIC0tIGhpZ2ggc2NvcmUgPSBoaWdoZXIgcHJpb3JpdHkgZm9yIG1lcmdpbmcuXG4gKi9cbmNvbnN0IFNDQUxFX1BSRUNFREVOQ0VfSU5ERVg6IHtcbiAgLy8gVXNpbmcgTWFwcGVkIFR5cGUgdG8gZGVjbGFyZSB0eXBlIChodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlcylcbiAgW2sgaW4gU2NhbGVUeXBlXTogbnVtYmVyXG59ID0ge1xuICAvLyBudW1lcmljXG4gIGxpbmVhcjogMCxcbiAgbG9nOiAxLFxuICBwb3c6IDEsXG4gIHNxcnQ6IDEsXG4gIC8vIHRpbWVcbiAgdGltZTogMCxcbiAgdXRjOiAwLFxuICAvLyBvcmRpbmFsLXBvc2l0aW9uIC0tIHRoZXNlIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBjb250aW51b3VzIHNjYWxlcyBhcyB0aGV5IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBkYXRhXG4gIHBvaW50OiAxMCxcbiAgYmFuZDogMTEsIC8vIGJhbmQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIGFzIGl0IGlzIGJldHRlciBmb3IgaW50ZXJhY3Rpb25cbiAgLy8gbm9uIGdyb3VwZWQgdHlwZXNcbiAgJ2Jpbi1saW5lYXInOiAwLFxuICBzZXF1ZW50aWFsOiAwLFxuICBvcmRpbmFsOiAwLFxuICAnYmluLW9yZGluYWwnOiAwLFxufTtcblxuLyoqXG4gKiBSZXR1cm4gc2NhbGUgY2F0ZWdvcmllcyAtLSBvbmx5IHNjYWxlIG9mIHRoZSBzYW1lIGNhdGVnb3JpZXMgY2FuIGJlIG1lcmdlZCB0b2dldGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZVByZWNlZGVuY2Uoc2NhbGVUeXBlOiBTY2FsZVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gU0NBTEVfUFJFQ0VERU5DRV9JTkRFWFtzY2FsZVR5cGVdO1xufVxuXG5leHBvcnQgY29uc3QgQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUzogU2NhbGVUeXBlW10gPSBbJ2xpbmVhcicsICdiaW4tbGluZWFyJywgJ2xvZycsICdwb3cnLCAnc3FydCcsICd0aW1lJywgJ3V0YyddO1xuY29uc3QgQ09OVElOVU9VU19UT19DT05USU5VT1VTX0lOREVYID0gdG9TZXQoQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUyk7XG5cbmV4cG9ydCBjb25zdCBDT05USU5VT1VTX0RPTUFJTl9TQ0FMRVM6IFNjYWxlVHlwZVtdID0gQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUy5jb25jYXQoWydzZXF1ZW50aWFsJyAvKiBUT0RPIGFkZCAncXVhbnRpbGUnLCAncXVhbnRpemUnLCAndGhyZXNob2xkJyovXSk7XG5jb25zdCBDT05USU5VT1VTX0RPTUFJTl9JTkRFWCA9IHRvU2V0KENPTlRJTlVPVVNfRE9NQUlOX1NDQUxFUyk7XG5cbmV4cG9ydCBjb25zdCBESVNDUkVURV9ET01BSU5fU0NBTEVTOiBTY2FsZVR5cGVbXSA9IFsnb3JkaW5hbCcsICdiaW4tb3JkaW5hbCcsICdwb2ludCcsICdiYW5kJ107XG5jb25zdCBESVNDUkVURV9ET01BSU5fSU5ERVggPSB0b1NldChESVNDUkVURV9ET01BSU5fU0NBTEVTKTtcblxuY29uc3QgQklOX1NDQUxFU19JTkRFWCA9IHRvU2V0KFsnYmluLWxpbmVhcicsICdiaW4tb3JkaW5hbCddKTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0NBTEVfVFlQRVM6IFNjYWxlVHlwZVtdID0gWyd0aW1lJywgJ3V0YyddO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzRGlzY3JldGVEb21haW4odHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnb3JkaW5hbCcgfCAnYmluLW9yZGluYWwnIHwgJ3BvaW50JyB8ICdiYW5kJyB7XG4gIHJldHVybiB0eXBlIGluIERJU0NSRVRFX0RPTUFJTl9JTkRFWDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmluU2NhbGUodHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnYmluLWxpbmVhcicgfCAnYmluLW9yZGluYWwnIHtcbiAgcmV0dXJuIHR5cGUgaW4gQklOX1NDQUxFU19JTkRFWDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRpbnVvdXNEb21haW4odHlwZTogU2NhbGVUeXBlKTpcbiAgdHlwZSBpcyAnbGluZWFyJyB8ICdsb2cnIHwgJ3BvdycgfCAnc3FydCcgfCAndGltZScgfCAndXRjJ3xcbiAgICAgICAgICAnc2VxdWVudGlhbCcgLyogVE9ETyBhZGQgfCAncXVhbnRpbGUnIHwgJ3F1YW50aXplJyB8ICd0aHJlc2hvbGQnICovIHtcbiAgcmV0dXJuIHR5cGUgaW4gQ09OVElOVU9VU19ET01BSU5fSU5ERVg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXModHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnbGluZWFyJyB8ICdiaW4tbGluZWFyJyB8ICdsb2cnIHwgJ3BvdycgfCAnc3FydCcgfCAndGltZScgfCAndXRjJyB7XG4gIHJldHVybiB0eXBlIGluIENPTlRJTlVPVVNfVE9fQ09OVElOVU9VU19JTkRFWDtcbn1cblxuZXhwb3J0IHR5cGUgTmljZVRpbWUgPSAnc2Vjb25kJyB8ICdtaW51dGUnIHwgJ2hvdXInIHwgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxlQ29uZmlnIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHJvdW5kcyBudW1lcmljIG91dHB1dCB2YWx1ZXMgdG8gaW50ZWdlcnMuXG4gICAqIFRoaXMgY2FuIGJlIGhlbHBmdWwgZm9yIHNuYXBwaW5nIHRvIHRoZSBwaXhlbCBncmlkLlxuICAgKiAoT25seSBhdmFpbGFibGUgZm9yIGB4YCwgYHlgLCBhbmQgYHNpemVgIHNjYWxlcy4pXG4gICAqL1xuICByb3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZGF0YSBkb21haW4gYXJlIGNsYW1wZWQgdG8gZWl0aGVyIHRoZSBtaW5pbXVtIG9yIG1heGltdW0gcmFuZ2UgdmFsdWVcbiAgICovXG4gIGNsYW1wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBEZWZhdWx0IHJhbmdlIHN0ZXAgZm9yIGB4YCBiYW5kIGFuZCBwb2ludCBzY2FsZXMgb2YgdGV4dCBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA5MGBcbiAgICpcbiAgICogIEBtaW5pbXVtIDBcbiAgICovXG4gIHRleHRYUmFuZ2VTdGVwPzogbnVtYmVyOyAvLyBGSVhNRTogY29uc2lkZXIgaWYgd2Ugd2lsbCByZW5hbWUgdGhpcyBcInRhYmxlQ29sdW1uV2lkdGhcIlxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIHN0ZXAgZm9yIGJhbmQgYW5kIHBvaW50IHNjYWxlcyBvZiAoMSkgdGhlIGB5YCBjaGFubmVsXG4gICAqIGFuZCAoMikgdGhlIGB4YCBjaGFubmVsIHdoZW4gdGhlIG1hcmsgaXMgbm90IGB0ZXh0YC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAyMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmFuZ2VTdGVwPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogRGVmYXVsdCBpbm5lciBwYWRkaW5nIGZvciBgeGAgYW5kIGB5YCBiYW5kLW9yZGluYWwgc2NhbGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBiYW5kUGFkZGluZ0lubmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG91dGVyIHBhZGRpbmcgZm9yIGB4YCBhbmQgYHlgIGJhbmQtb3JkaW5hbCBzY2FsZXMuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQsIGJhbmQgc2NhbGUncyBwYWRkaW5nT3V0ZXIgaXMgcGFkZGluZ0lubmVyLzIuXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgYmFuZFBhZGRpbmdPdXRlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBwYWRkaW5nIGZvciBjb250aW51b3VzIHNjYWxlcy5cbiAgICpcbiAgICogX19EZWZhdWx0Ol9fIGA1YCBmb3IgY29udGludW91cyB4LXNjYWxlIG9mIGEgdmVydGljYWwgYmFyIGFuZCBjb250aW51b3VzIHktc2NhbGUgb2YgYSBob3Jpem9udGFsIGJhci47IGAwYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGNvbnRpbnVvdXNQYWRkaW5nPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG91dGVyIHBhZGRpbmcgZm9yIGB4YCBhbmQgYHlgIHBvaW50LW9yZGluYWwgc2NhbGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuNWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBwb2ludFBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc291cmNlIGRhdGEgcmFuZ2UgYmVmb3JlIGFnZ3JlZ2F0aW9uIGFzIHNjYWxlIGRvbWFpbiBpbnN0ZWFkIG9mIGFnZ3JlZ2F0ZWQgZGF0YSBmb3IgYWdncmVnYXRlIGF4aXMuXG4gICAqXG4gICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGBkb21haW5gIHRvIGBcInVuYWdncmVnYXRlXCJgIGZvciBhZ2dyZWdhdGVkIF9xdWFudGl0YXRpdmVfIGZpZWxkcyBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgd29ya3Mgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRoYXQgcHJvZHVjZSB2YWx1ZXMgd2l0aGluIHRoZSByYXcgZGF0YSBkb21haW4gKGBcIm1lYW5cImAsIGBcImF2ZXJhZ2VcImAsIGBcIm1lZGlhblwiYCwgYFwicTFcImAsIGBcInEzXCJgLCBgXCJtaW5cImAsIGBcIm1heFwiYCkuIEZvciBvdGhlciBhZ2dyZWdhdGlvbnMgdGhhdCBwcm9kdWNlIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYXcgZGF0YSBkb21haW4gKGUuZy4gYFwiY291bnRcImAsIGBcInN1bVwiYCksIHRoaXMgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWBcbiAgICovXG4gIHVzZVVuYWdncmVnYXRlZERvbWFpbj86IGJvb2xlYW47XG5cbiAgLy8gbmljZSBzaG91bGQgZGVwZW5kcyBvbiB0eXBlIChxdWFudGl0YXRpdmUgb3IgdGVtcG9yYWwpLCBzb1xuICAvLyBsZXQncyBub3QgbWFrZSBhIGNvbmZpZy5cblxuICAvLyBDb25maWdzIGZvciBSYW5nZVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtYXggdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byBiYXIncyBzaXplL2JhbmRTaXplLlxuICAgKlxuICAgKiBJZiB1bmRlZmluZWQgKGRlZmF1bHQpLCB3ZSB3aWxsIHVzZSB0aGUgc2NhbGUncyBgcmFuZ2VTdGVwYCAtIDEuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1heEJhbmRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtaW4gdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byBiYXIgYW5kIHRpY2sncyBzaXplL2JhbmRTaXplIHNjYWxlIHdpdGggemVybz1mYWxzZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAyYFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtaW5CYW5kU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgbWF4IHZhbHVlIGZvciBtYXBwaW5nIHF1YW50aXRhdGl2ZSBmaWVsZHMgdG8gdGV4dCdzIHNpemUvZm9udFNpemUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgNDBgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1heEZvbnRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtaW4gdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byB0aWNrJ3Mgc2l6ZS9mb250U2l6ZSBzY2FsZSB3aXRoIHplcm89ZmFsc2VcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA4YFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtaW5Gb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtaW5pbXVtIG9wYWNpdHkgZm9yIG1hcHBpbmcgYSBmaWVsZCB0byBvcGFjaXR5LlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuM2BcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBtaW5PcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBvcGFjaXR5IGZvciBtYXBwaW5nIGEgZmllbGQgdG8gb3BhY2l0eS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAwLjhgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgbWF4T3BhY2l0eT86IG51bWJlcjtcblxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1pbmltdW0gdmFsdWUgZm9yIHBvaW50IHNpemUgc2NhbGUgd2l0aCB6ZXJvPWZhbHNlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDlgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1pblNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4IHZhbHVlIGZvciBwb2ludCBzaXplIHNjYWxlLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1pbmltdW0gc3Ryb2tlV2lkdGggZm9yIHRoZSBzY2FsZSBvZiBzdHJva2VXaWR0aCBmb3IgcnVsZSBhbmQgbGluZSBtYXJrcyBhbmQgb2Ygc2l6ZSBmb3IgdHJhaWwgbWFya3Mgd2l0aCB6ZXJvPWZhbHNlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1pblN0cm9rZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBzdHJva2VXaWR0aCBmb3IgdGhlIHNjYWxlIG9mIHN0cm9rZVdpZHRoIGZvciBydWxlIGFuZCBsaW5lIG1hcmtzIGFuZCBvZiBzaXplIGZvciB0cmFpbCBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA0YFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtYXhTdHJva2VXaWR0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTY2FsZUNvbmZpZyA9IHtcbiAgdGV4dFhSYW5nZVN0ZXA6IDkwLFxuICByYW5nZVN0ZXA6IDIxLFxuICBwb2ludFBhZGRpbmc6IDAuNSxcbiAgYmFuZFBhZGRpbmdJbm5lcjogMC4xLFxuICBmYWNldFNwYWNpbmc6IDE2LFxuXG4gIG1pbkJhbmRTaXplOiAyLFxuXG4gIG1pbkZvbnRTaXplOiA4LFxuICBtYXhGb250U2l6ZTogNDAsXG5cbiAgbWluT3BhY2l0eTogMC4zLFxuICBtYXhPcGFjaXR5OiAwLjgsXG5cbiAgLy8gRklYTUU6IHJldmlzZSBpZiB0aGVzZSAqY2FuKiBiZWNvbWUgcmF0aW9zIG9mIHJhbmdlU3RlcFxuICBtaW5TaXplOiA5LCAvLyBQb2ludCBzaXplIGlzIGFyZWEuIEZvciBzcXVhcmUgcG9pbnQsIDkgPSAzIHBpeGVsIF4gMiwgbm90IHRvbyBzbWFsbCFcblxuICBtaW5TdHJva2VXaWR0aDogMSxcbiAgbWF4U3Ryb2tlV2lkdGg6IDRcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1lUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY29sb3Igc2NoZW1lIG5hbWUgZm9yIHNlcXVlbnRpYWwvb3JkaW5hbCBzY2FsZXMgKGUuZy4sIGBcImNhdGVnb3J5MTBcImAgb3IgYFwidmlyaWRpc1wiYCkuXG4gICAqXG4gICAqIEZvciB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBzY2hlbWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtWZWdhIFNjaGVtZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhL2RvY3Mvc2NoZW1lcy8jcmVmZXJlbmNlKSByZWZlcmVuY2UuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBzZXF1ZW50aWFsIGFuZCBkaXZlcmdpbmcgc2NoZW1lcyBvbmx5LCBkZXRlcm1pbmVzIHRoZSBleHRlbnQgb2YgdGhlIGNvbG9yIHJhbmdlIHRvIHVzZS4gRm9yIGV4YW1wbGUgYFswLjIsIDFdYCB3aWxsIHJlc2NhbGUgdGhlIGNvbG9yIHNjaGVtZSBzdWNoIHRoYXQgY29sb3IgdmFsdWVzIGluIHRoZSByYW5nZSBfWzAsIDAuMilfIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzY2hlbWUuXG4gICAqL1xuICBleHRlbnQ/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2xvcnMgdG8gdXNlIGluIHRoZSBzY2hlbWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc2NhbGUgdHlwZXMgc3VjaCBhcyBgXCJxdWFudGl6ZVwiYCwgd2hpY2ggdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNjYWxlIHJhbmdlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGRpc2NyZXRlIGJpbnMgZm9yIHRoZSBzY2FsZSBkb21haW4uXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uRG9tYWluID0ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgYSBzZWxlY3Rpb24uXG4gICAqL1xuICBzZWxlY3Rpb246IHN0cmluZyxcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIHRvIGV4dHJhY3Qgc2VsZWN0ZWQgdmFsdWVzIGZvciwgd2hlbiBhIHNlbGVjdGlvbiBpcyBbcHJvamVjdGVkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3Byb2plY3QuaHRtbClcbiAgICogb3ZlciBtdWx0aXBsZSBmaWVsZHMgb3IgZW5jb2RpbmdzLlxuICAgKi9cbiAgZmllbGQ/OiBzdHJpbmdcbn0gfCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIHNlbGVjdGlvbi5cbiAgICovXG4gIHNlbGVjdGlvbjogc3RyaW5nLFxuICAvKipcbiAgICogVGhlIGVuY29kaW5nIGNoYW5uZWwgdG8gZXh0cmFjdCBzZWxlY3RlZCB2YWx1ZXMgZm9yLCB3aGVuIGEgc2VsZWN0aW9uIGlzIFtwcm9qZWN0ZWRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvcHJvamVjdC5odG1sKVxuICAgKiBvdmVyIG11bHRpcGxlIGZpZWxkcyBvciBlbmNvZGluZ3MuXG4gICAqL1xuICBlbmNvZGluZz86IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgRG9tYWluID0gbnVtYmVyW10gfCBzdHJpbmdbXSB8IGJvb2xlYW5bXSB8IERhdGVUaW1lW10gfCAndW5hZ2dyZWdhdGVkJyB8IFNlbGVjdGlvbkRvbWFpbjtcbmV4cG9ydCB0eXBlIFNjaGVtZSA9IHN0cmluZyB8IFNjaGVtZVBhcmFtcztcblxuZXhwb3J0IHR5cGUgUmFuZ2UgPSBudW1iZXJbXSB8IHN0cmluZ1tdIHwgc3RyaW5nO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlbmRlZFNjaGVtZShzY2hlbWU6IHN0cmluZyB8IFNjaGVtZVBhcmFtcyk6IHNjaGVtZSBpcyBTY2hlbWVQYXJhbXMge1xuICByZXR1cm4gc2NoZW1lICYmICEhc2NoZW1lWyduYW1lJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGVjdGlvbkRvbWFpbihkb21haW46IERvbWFpbik6IGRvbWFpbiBpcyBTZWxlY3Rpb25Eb21haW4ge1xuICByZXR1cm4gZG9tYWluICYmIGRvbWFpblsnc2VsZWN0aW9uJ107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2NhbGUuICBWZWdhLUxpdGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHNjYWxlIHR5cGVzOlxuICAgKlxuICAgKiAxKSBbKipDb250aW51b3VzIFNjYWxlcyoqXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjY29udGludW91cykgLS0gbWFwcGluZyBjb250aW51b3VzIGRvbWFpbnMgdG8gY29udGludW91cyBvdXRwdXQgcmFuZ2VzIChbYFwibGluZWFyXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjbGluZWFyKSwgW2BcInBvd1wiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3BvdyksIFtgXCJzcXJ0XCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjc3FydCksIFtgXCJsb2dcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNsb2cpLCBbYFwidGltZVwiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3RpbWUpLCBbYFwidXRjXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjdXRjKSwgW2BcInNlcXVlbnRpYWxcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzZXF1ZW50aWFsKSkuXG4gICAqXG4gICAqIDIpIFsqKkRpc2NyZXRlIFNjYWxlcyoqXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIC0tIG1hcHBpbmcgZGlzY3JldGUgZG9tYWlucyB0byBkaXNjcmV0ZSAoW2BcIm9yZGluYWxcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNvcmRpbmFsKSkgb3IgY29udGludW91cyAoW2BcImJhbmRcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBhbmQgW2BcInBvaW50XCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpKSBvdXRwdXQgcmFuZ2VzLlxuICAgKlxuICAgKiAzKSBbKipEaXNjcmV0aXppbmcgU2NhbGVzKipdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNjcmV0aXppbmcpIC0tIG1hcHBpbmcgY29udGludW91cyBkb21haW5zIHRvIGRpc2NyZXRlIG91dHB1dCByYW5nZXMgKFtgXCJiaW4tbGluZWFyXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmluLWxpbmVhcikgYW5kIFtgXCJiaW4tb3JkaW5hbFwiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2Jpbi1vcmRpbmFsKSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBwbGVhc2Ugc2VlIHRoZSBbc2NhbGUgdHlwZSB0YWJsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3R5cGUpLlxuICAgKi9cbiAgdHlwZT86IFNjYWxlVHlwZTtcblxuICAvKipcbiAgICogQ3VzdG9taXplZCBkb21haW4gdmFsdWVzLlxuICAgKlxuICAgKiBGb3IgX3F1YW50aXRhdGl2ZV8gZmllbGRzLCBgZG9tYWluYCBjYW4gdGFrZSB0aGUgZm9ybSBvZiBhIHR3by1lbGVtZW50IGFycmF5IHdpdGggbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMuICBbUGllY2V3aXNlIHNjYWxlc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3BpZWNld2lzZSkgY2FuIGJlIGNyZWF0ZWQgYnkgcHJvdmlkaW5nIGEgYGRvbWFpbmAgd2l0aCBtb3JlIHRoYW4gdHdvIGVudHJpZXMuXG4gICAqIElmIHRoZSBpbnB1dCBmaWVsZCBpcyBhZ2dyZWdhdGVkLCBgZG9tYWluYCBjYW4gYWxzbyBiZSBhIHN0cmluZyB2YWx1ZSBgXCJ1bmFnZ3JlZ2F0ZWRcImAsIGluZGljYXRpbmcgdGhhdCB0aGUgZG9tYWluIHNob3VsZCBpbmNsdWRlIHRoZSByYXcgZGF0YSB2YWx1ZXMgcHJpb3IgdG8gdGhlIGFnZ3JlZ2F0aW9uLlxuICAgKlxuICAgKiBGb3IgX3RlbXBvcmFsXyBmaWVsZHMsIGBkb21haW5gIGNhbiBiZSBhIHR3by1lbGVtZW50IGFycmF5IG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLCBpbiB0aGUgZm9ybSBvZiBlaXRoZXIgdGltZXN0YW1wcyBvciB0aGUgW0RhdGVUaW1lIGRlZmluaXRpb24gb2JqZWN0c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy90eXBlcy5odG1sI2RhdGV0aW1lKS5cbiAgICpcbiAgICogRm9yIF9vcmRpbmFsXyBhbmQgX25vbWluYWxfIGZpZWxkcywgYGRvbWFpbmAgY2FuIGJlIGFuIGFycmF5IHRoYXQgbGlzdHMgdmFsaWQgaW5wdXQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgYHNlbGVjdGlvbmAgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gW2ludGVyYWN0aXZlbHkgZGV0ZXJtaW5lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sI3NjYWxlLWRvbWFpbnMpIHRoZSBzY2FsZSBkb21haW4uXG4gICAqL1xuICBkb21haW4/OiBudW1iZXJbXSB8IHN0cmluZ1tdIHwgYm9vbGVhbltdIHwgRGF0ZVRpbWVbXSB8ICd1bmFnZ3JlZ2F0ZWQnIHwgU2VsZWN0aW9uRG9tYWluO1xuXG5cbiAgLy8gSGlkZSBiZWNhdXNlIHdlIG1pZ2h0IG5vdCByZWFsbHkgbmVlZCB0aGlzLlxuICAvKipcbiAgICogSWYgdHJ1ZSwgcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBzY2FsZSByYW5nZS5cbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICByZXZlcnNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJhbmdlIG9mIHRoZSBzY2FsZS4gT25lIG9mOlxuICAgKlxuICAgKiAtIEEgc3RyaW5nIGluZGljYXRpbmcgYSBbcHJlLWRlZmluZWQgbmFtZWQgc2NhbGUgcmFuZ2VdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNyYW5nZS1jb25maWcpIChlLmcuLCBleGFtcGxlLCBgXCJzeW1ib2xcImAsIG9yIGBcImRpdmVyZ2luZ1wiYCkuXG4gICAqXG4gICAqIC0gRm9yIFtjb250aW51b3VzIHNjYWxlc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0d28tZWxlbWVudCBhcnJheSBpbmRpY2F0aW5nICBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgb3IgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gdHdvIGVudHJpZXMgZm9yIHNwZWNpZnlpbmcgYSBbcGllY2V3aXNlIHNjYWxlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcGllY2V3aXNlKS5cbiAgICpcbiAgICogLSBGb3IgW2Rpc2NyZXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIGFuZCBbZGlzY3JldGl6aW5nXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGl6aW5nKSBzY2FsZXMsIGFuIGFycmF5IG9mIGRlc2lyZWQgb3V0cHV0IHZhbHVlcy5cbiAgICpcbiAgICogX19Ob3RlczpfX1xuICAgKlxuICAgKiAxKSBGb3IgW3NlcXVlbnRpYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzZXF1ZW50aWFsKSwgW29yZGluYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNvcmRpbmFsKSwgYW5kIGRpc2NyZXRpemluZyBjb2xvciBzY2FsZXMsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgY29sb3IgW2BzY2hlbWVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjc2NoZW1lKSBpbnN0ZWFkIG9mIGByYW5nZWAuXG4gICAqXG4gICAqIDIpIEFueSBkaXJlY3RseSBzcGVjaWZpZWQgYHJhbmdlYCBmb3IgYHhgIGFuZCBgeWAgY2hhbm5lbHMgd2lsbCBiZSBpZ25vcmVkLiBSYW5nZSBjYW4gYmUgY3VzdG9taXplZCB2aWEgdGhlIHZpZXcncyBjb3JyZXNwb25kaW5nIFtzaXplXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCkgKGB3aWR0aGAgYW5kIGBoZWlnaHRgKSBvciB2aWEgW3JhbmdlIHN0ZXBzIGFuZCBwYWRkaW5ncyBwcm9wZXJ0aWVzXSgjcmFuZ2Utc3RlcCkgZm9yIFtiYW5kXSgjYmFuZCkgYW5kIFtwb2ludF0oI3BvaW50KSBzY2FsZXMuXG4gICAqL1xuICByYW5nZT86IG51bWJlcltdIHwgc3RyaW5nW10gfCBzdHJpbmc7XG5cbiAgLy8gb3JkaW5hbFxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBhZGphY2VudCBiYW5kcyBvciBwb2ludHMgaW4gW2JhbmRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBhbmQgW3BvaW50XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpIHNjYWxlcy5cbiAgICpcbiAgICogSWYgYHJhbmdlU3RlcGAgaXMgYG51bGxgIG9yIGlmIHRoZSB2aWV3IGNvbnRhaW5zIHRoZSBzY2FsZSdzIGNvcnJlc3BvbmRpbmcgW3NpemVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sKSAoYHdpZHRoYCBmb3IgYHhgIHNjYWxlcyBhbmQgYGhlaWdodGAgZm9yIGB5YCBzY2FsZXMpLCBgcmFuZ2VTdGVwYCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCB0byBmaXQgdGhlIHNpemUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgZGVyaXZlZCB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNzY2FsZS1jb25maWcpJ3MgYHRleHRYUmFuZ2VTdGVwYCAoYDkwYCBieSBkZWZhdWx0KSBmb3IgeC1zY2FsZXMgb2YgYHRleHRgIG1hcmtzIGFuZCBgcmFuZ2VTdGVwYCAoYDIxYCBieSBkZWZhdWx0KSBmb3IgeC1zY2FsZXMgb2Ygb3RoZXIgbWFya3MgYW5kIHktc2NhbGVzLlxuICAgKlxuICAgKiBfX1dhcm5pbmdfXzogSWYgYHJhbmdlU3RlcGAgaXMgYG51bGxgIGFuZCB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHNjYWxlJ3MgZG9tYWluIGlzIGhpZ2hlciB0aGFuIGB3aWR0aGAgb3IgYGhlaWdodGAsIHRoZSByYW5nZVN0ZXAgbWlnaHQgYmVjb21lIGxlc3MgdGhhbiBvbmUgcGl4ZWwgYW5kIHRoZSBtYXJrIG1pZ2h0IG5vdCBhcHBlYXIgY29ycmVjdGx5LlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICByYW5nZVN0ZXA/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIGEgY29sb3IgW3NjaGVtZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3NjaGVtZSkgbmFtZSAoZS5nLiwgYFwiY2F0ZWdvcnkxMFwiYCBvciBgXCJ2aXJpZGlzXCJgKSBvciBhIFtzY2hlbWUgcGFyYW1ldGVyIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3NjaGVtZS1wYXJhbXMpLlxuICAgKlxuICAgKiBEaXNjcmV0ZSBjb2xvciBzY2hlbWVzIG1heSBiZSB1c2VkIHdpdGggW2Rpc2NyZXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIG9yIFtkaXNjcmV0aXppbmddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNjcmV0aXppbmcpIHNjYWxlcy4gQ29udGludW91cyBjb2xvciBzY2hlbWVzIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggW3NlcXVlbnRpYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGVzLmh0bWwjc2VxdWVudGlhbCkgc2NhbGVzLlxuICAgKlxuICAgKiBGb3IgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgc2NoZW1lcywgcGxlYXNlIHJlZmVyIHRvIHRoZSBbVmVnYSBTY2hlbWVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL3NjaGVtZXMvI3JlZmVyZW5jZSkgcmVmZXJlbmNlLlxuICAgKi9cbiAgc2NoZW1lPzogc3RyaW5nIHwgU2NoZW1lUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJvdW5kcyBudW1lcmljIG91dHB1dCB2YWx1ZXMgdG8gaW50ZWdlcnMuIFRoaXMgY2FuIGJlIGhlbHBmdWwgZm9yIHNuYXBwaW5nIHRvIHRoZSBwaXhlbCBncmlkLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYC5cbiAgICovXG4gIHJvdW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yIF9bY29udGludW91c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpXyBzY2FsZXMsIGV4cGFuZHMgdGhlIHNjYWxlIGRvbWFpbiB0byBhY2NvbW1vZGF0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwaXhlbHMgb24gZWFjaCBvZiB0aGUgc2NhbGUgcmFuZ2UuIFRoZSBzY2FsZSByYW5nZSBtdXN0IHJlcHJlc2VudCBwaXhlbHMgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIGFzIGludGVuZGVkLiBQYWRkaW5nIGFkanVzdG1lbnQgaXMgcGVyZm9ybWVkwqBwcmlvcsKgdG8gYWxsIG90aGVyIGFkanVzdG1lbnRzLCBpbmNsdWRpbmcgdGhlIGVmZmVjdHMgb2YgdGhlwqB6ZXJvLMKgbmljZSzCoGRvbWFpbk1pbiwgYW5kwqBkb21haW5NYXjCoHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEZvciBfW2JhbmRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKV8gc2NhbGVzLCBzaG9ydGN1dCBmb3Igc2V0dGluZyBgcGFkZGluZ0lubmVyYCBhbmQgYHBhZGRpbmdPdXRlcmAgdG8gdGhlIHNhbWUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBfW3BvaW50XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpXyBzY2FsZXMsIGFsaWFzIGZvciBgcGFkZGluZ091dGVyYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIEZvciBfY29udGludW91c18gc2NhbGVzLCBkZXJpdmVkIGZyb20gdGhlIFtzY2FsZSBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNjb25maWcpJ3MgYGNvbnRpbnVvdXNQYWRkaW5nYC5cbiAgICogRm9yIF9iYW5kIGFuZCBwb2ludF8gc2NhbGVzLCBzZWUgYHBhZGRpbmdJbm5lcmAgYW5kIGBwYWRkaW5nT3V0ZXJgLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5uZXIgcGFkZGluZyAoc3BhY2luZykgd2l0aGluIGVhY2ggYmFuZCBzdGVwIG9mIGJhbmQgc2NhbGVzLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBzdGVwIHNpemUuIFRoaXMgdmFsdWUgbXVzdCBsaWUgaW4gdGhlIHJhbmdlIFswLDFdLlxuICAgKlxuICAgKiBGb3IgcG9pbnQgc2NhbGUsIHRoaXMgcHJvcGVydHkgaXMgaW52YWxpZCBhcyBwb2ludCBzY2FsZXMgZG8gbm90IGhhdmUgaW50ZXJuYWwgYmFuZCB3aWR0aHMgKG9ubHkgc3RlcCBzaXplcyBiZXR3ZWVuIGJhbmRzKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykncyBgYmFuZFBhZGRpbmdJbm5lcmAuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgcGFkZGluZ0lubmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3V0ZXIgcGFkZGluZyAoc3BhY2luZykgYXQgdGhlIGVuZHMgb2YgdGhlIHJhbmdlIG9mIGJhbmQgYW5kIHBvaW50IHNjYWxlcyxcbiAgICogYXMgYSBmcmFjdGlvbiBvZiB0aGUgc3RlcCBzaXplLiBUaGlzIHZhbHVlIG11c3QgbGllIGluIHRoZSByYW5nZSBbMCwxXS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykncyBgYmFuZFBhZGRpbmdPdXRlcmAgZm9yIGJhbmQgc2NhbGVzIGFuZCBgcG9pbnRQYWRkaW5nYCBmb3IgcG9pbnQgc2NhbGVzLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDFcbiAgICovXG4gIHBhZGRpbmdPdXRlcj86IG51bWJlcjtcblxuICAvLyB0eXBpY2FsXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZGF0YSBkb21haW4gYXJlIGNsYW1wZWQgdG8gZWl0aGVyIHRoZSBtaW5pbXVtIG9yIG1heGltdW0gcmFuZ2UgdmFsdWVcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNzY2FsZS1jb25maWcpJ3MgYGNsYW1wYCAoYHRydWVgIGJ5IGRlZmF1bHQpLlxuICAgKi9cbiAgY2xhbXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRlbmRpbmcgdGhlIGRvbWFpbiBzbyB0aGF0IGl0IHN0YXJ0cyBhbmQgZW5kcyBvbiBuaWNlIHJvdW5kIHZhbHVlcy4gVGhpcyBtZXRob2QgdHlwaWNhbGx5IG1vZGlmaWVzIHRoZSBzY2FsZeKAmXMgZG9tYWluLCBhbmQgbWF5IG9ubHkgZXh0ZW5kIHRoZSBib3VuZHMgdG8gdGhlIG5lYXJlc3Qgcm91bmQgdmFsdWUuIE5pY2luZyBpcyB1c2VmdWwgaWYgdGhlIGRvbWFpbiBpcyBjb21wdXRlZCBmcm9tIGRhdGEgYW5kIG1heSBiZSBpcnJlZ3VsYXIuIEZvciBleGFtcGxlLCBmb3IgYSBkb21haW4gb2YgX1swLjIwMTQ3OeKApiwgMC45OTY2NznigKZdXywgYSBuaWNlIGRvbWFpbiBtaWdodCBiZSBfWzAuMiwgMS4wXV8uXG4gICAqXG4gICAqIEZvciBxdWFudGl0YXRpdmUgc2NhbGVzIHN1Y2ggYXMgbGluZWFyLCBgbmljZWAgY2FuIGJlIGVpdGhlciBhIGJvb2xlYW4gZmxhZyBvciBhIG51bWJlci4gSWYgYG5pY2VgIGlzIGEgbnVtYmVyLCBpdCB3aWxsIHJlcHJlc2VudCBhIGRlc2lyZWQgdGljayBjb3VudC4gVGhpcyBhbGxvd3MgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIHN0ZXAgc2l6ZSB1c2VkIHRvIGV4dGVuZCB0aGUgYm91bmRzLCBndWFyYW50ZWVpbmcgdGhhdCB0aGUgcmV0dXJuZWQgdGlja3Mgd2lsbCBleGFjdGx5IGNvdmVyIHRoZSBkb21haW4uXG4gICAqXG4gICAqIEZvciB0ZW1wb3JhbCBmaWVsZHMgd2l0aCB0aW1lIGFuZCB1dGMgc2NhbGVzLCB0aGUgYG5pY2VgIHZhbHVlIGNhbiBiZSBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBkZXNpcmVkIHRpbWUgaW50ZXJ2YWwuIExlZ2FsIHZhbHVlcyBhcmUgYFwibWlsbGlzZWNvbmRcImAsIGBcInNlY29uZFwiYCwgYFwibWludXRlXCJgLCBgXCJob3VyXCJgLCBgXCJkYXlcImAsIGBcIndlZWtcImAsIGBcIm1vbnRoXCJgLCBhbmQgYFwieWVhclwiYC4gQWx0ZXJuYXRpdmVseSwgYHRpbWVgIGFuZCBgdXRjYCBzY2FsZXMgY2FuIGFjY2VwdCBhbiBvYmplY3QtdmFsdWVkIGludGVydmFsIHNwZWNpZmllciBvZiB0aGUgZm9ybSBge1wiaW50ZXJ2YWxcIjogXCJtb250aFwiLCBcInN0ZXBcIjogM31gLCB3aGljaCBpbmNsdWRlcyBhIGRlc2lyZWQgbnVtYmVyIG9mIGludGVydmFsIHN0ZXBzLiBIZXJlLCB0aGUgZG9tYWluIHdvdWxkIHNuYXAgdG8gcXVhcnRlciAoSmFuLCBBcHIsIEp1bCwgT2N0KSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgIGZvciB1bmJpbm5lZCBfcXVhbnRpdGF0aXZlXyBmaWVsZHM7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKi9cbiAgbmljZT86IGJvb2xlYW4gfCBudW1iZXIgfCBOaWNlVGltZSB8IHtpbnRlcnZhbDogc3RyaW5nLCBzdGVwOiBudW1iZXJ9O1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nYXJpdGhtIGJhc2Ugb2YgdGhlIGBsb2dgIHNjYWxlIChkZWZhdWx0IGAxMGApLlxuICAgKi9cbiAgYmFzZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGV4cG9uZW50IG9mIHRoZSBgcG93YCBzY2FsZS5cbiAgICovXG4gIGV4cG9uZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGVuc3VyZXMgdGhhdCBhIHplcm8gYmFzZWxpbmUgdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIHNjYWxlIGRvbWFpbi5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCBmb3IgeCBhbmQgeSBjaGFubmVscyBpZiB0aGUgcXVhbnRpdGF0aXZlIGZpZWxkIGlzIG5vdCBiaW5uZWQgYW5kIG5vIGN1c3RvbSBgZG9tYWluYCBpcyBwcm92aWRlZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBMb2csIHRpbWUsIGFuZCB1dGMgc2NhbGVzIGRvIG5vdCBzdXBwb3J0IGB6ZXJvYC5cbiAgICovXG4gIHplcm8/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJwb2xhdGlvbiBtZXRob2QgZm9yIHJhbmdlIHZhbHVlcy4gQnkgZGVmYXVsdCwgYSBnZW5lcmFsIGludGVycG9sYXRvciBmb3IgbnVtYmVycywgZGF0ZXMsIHN0cmluZ3MgYW5kIGNvbG9ycyAoaW4gUkdCIHNwYWNlKSBpcyB1c2VkLiBGb3IgY29sb3IgcmFuZ2VzLCB0aGlzIHByb3BlcnR5IGFsbG93cyBpbnRlcnBvbGF0aW9uIGluIGFsdGVybmF0aXZlIGNvbG9yIHNwYWNlcy4gTGVnYWwgdmFsdWVzIGluY2x1ZGUgYHJnYmAsIGBoc2xgLCBgaHNsLWxvbmdgLCBgbGFiYCwgYGhjbGAsIGBoY2wtbG9uZ2AsIGBjdWJlaGVsaXhgIGFuZCBgY3ViZWhlbGl4LWxvbmdgICgnLWxvbmcnIHZhcmlhbnRzIHVzZSBsb25nZXIgcGF0aHMgaW4gcG9sYXIgY29vcmRpbmF0ZSBzcGFjZXMpLiBJZiBvYmplY3QtdmFsdWVkLCB0aGlzIHByb3BlcnR5IGFjY2VwdHMgYW4gb2JqZWN0IHdpdGggYSBzdHJpbmctdmFsdWVkIF90eXBlXyBwcm9wZXJ0eSBhbmQgYW4gb3B0aW9uYWwgbnVtZXJpYyBfZ2FtbWFfIHByb3BlcnR5IGFwcGxpY2FibGUgdG8gcmdiIGFuZCBjdWJlaGVsaXggaW50ZXJwb2xhdG9ycy4gRm9yIG1vcmUsIHNlZSB0aGUgW2QzLWludGVycG9sYXRlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1pbnRlcnBvbGF0ZSkuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBTZXF1ZW50aWFsIHNjYWxlcyBkbyBub3Qgc3VwcG9ydCBgaW50ZXJwb2xhdGVgIGFzIHRoZXkgaGF2ZSBhIGZpeGVkIGludGVycG9sYXRvci4gIFNpbmNlIFZlZ2EtTGl0ZSB1c2VzIHNlcXVlbnRpYWwgc2NhbGVzIGZvciBxdWFudGl0YXRpdmUgZmllbGRzIGJ5IGRlZmF1bHQsIHlvdSBoYXZlIHRvIHNldCB0aGUgc2NhbGUgYHR5cGVgIHRvIG90aGVyIHF1YW50aXRhdGl2ZSBzY2FsZSB0eXBlIHN1Y2ggYXMgYFwibGluZWFyXCJgIHRvIGN1c3RvbWl6ZSBgaW50ZXJwb2xhdGVgLlxuICAgKi9cbiAgaW50ZXJwb2xhdGU/OiBTY2FsZUludGVycG9sYXRlIHwgU2NhbGVJbnRlcnBvbGF0ZVBhcmFtcztcbn1cblxuY29uc3QgU0NBTEVfUFJPUEVSVFlfSU5ERVg6IEZsYWc8a2V5b2YgU2NhbGU+ID0ge1xuICB0eXBlOiAxLFxuICBkb21haW46IDEsXG4gIHJhbmdlOiAxLFxuICByYW5nZVN0ZXA6IDEsXG4gIHNjaGVtZTogMSxcbiAgLy8gT3RoZXIgcHJvcGVydGllc1xuICByZXZlcnNlOiAxLFxuICByb3VuZDogMSxcbiAgLy8gcXVhbnRpdGF0aXZlIC8gdGltZVxuICBjbGFtcDogMSxcbiAgbmljZTogMSxcbiAgLy8gcXVhbnRpdGF0aXZlXG4gIGJhc2U6IDEsXG4gIGV4cG9uZW50OiAxLFxuICBpbnRlcnBvbGF0ZTogMSxcbiAgemVybzogMSwgLy8gemVybyBkZXBlbmRzIG9uIGRvbWFpblxuICAvLyBiYW5kL3BvaW50XG4gIHBhZGRpbmc6IDEsXG4gIHBhZGRpbmdJbm5lcjogMSxcbiAgcGFkZGluZ091dGVyOiAxXG59O1xuXG5leHBvcnQgY29uc3QgU0NBTEVfUFJPUEVSVElFUyA9IGZsYWdLZXlzKFNDQUxFX1BST1BFUlRZX0lOREVYKTtcblxuY29uc3Qge3R5cGUsIGRvbWFpbiwgcmFuZ2UsIHJhbmdlU3RlcCwgc2NoZW1lLCAuLi5OT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUWV9JTkRFWH0gPSBTQ0FMRV9QUk9QRVJUWV9JTkRFWDtcblxuZXhwb3J0IGNvbnN0IE5PTl9UWVBFX0RPTUFJTl9SQU5HRV9WRUdBX1NDQUxFX1BST1BFUlRJRVMgPSBmbGFnS2V5cyhOT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUWV9JTkRFWCk7XG5cbmV4cG9ydCBjb25zdCBTQ0FMRV9UWVBFX0lOREVYID0gZ2VuZXJhdGVTY2FsZVR5cGVJbmRleCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5KHNjYWxlVHlwZTogU2NhbGVUeXBlLCBwcm9wTmFtZToga2V5b2YgU2NhbGUpIHtcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ3R5cGUnOlxuICAgIGNhc2UgJ2RvbWFpbic6XG4gICAgY2FzZSAncmV2ZXJzZSc6XG4gICAgY2FzZSAncmFuZ2UnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnc2NoZW1lJzpcbiAgICAgIHJldHVybiBjb250YWlucyhbJ3NlcXVlbnRpYWwnLCAnb3JkaW5hbCcsICdiaW4tb3JkaW5hbCcsICdxdWFudGlsZScsICdxdWFudGl6ZSddLCBzY2FsZVR5cGUpO1xuICAgIGNhc2UgJ2ludGVycG9sYXRlJzpcbiAgICAgIC8vIEZJWE1FKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjkwMikgaG93IGFib3V0IG9yZGluYWw/XG4gICAgICByZXR1cm4gY29udGFpbnMoWydsaW5lYXInLCAnYmluLWxpbmVhcicsICdwb3cnLCAnbG9nJywgJ3NxcnQnLCAndXRjJywgJ3RpbWUnXSwgc2NhbGVUeXBlKTtcbiAgICBjYXNlICdyb3VuZCc6XG4gICAgICByZXR1cm4gaXNDb250aW51b3VzVG9Db250aW51b3VzKHNjYWxlVHlwZSkgfHwgc2NhbGVUeXBlID09PSAnYmFuZCcgfHwgc2NhbGVUeXBlID09PSAncG9pbnQnO1xuICAgIGNhc2UgJ3BhZGRpbmcnOlxuICAgICAgcmV0dXJuIGlzQ29udGludW91c1RvQ29udGludW91cyhzY2FsZVR5cGUpIHx8IGNvbnRhaW5zKFsncG9pbnQnLCAnYmFuZCddLCBzY2FsZVR5cGUpO1xuICAgIGNhc2UgJ3BhZGRpbmdPdXRlcic6XG4gICAgY2FzZSAncmFuZ2VTdGVwJzpcbiAgICAgIHJldHVybiBjb250YWlucyhbJ3BvaW50JywgJ2JhbmQnXSwgc2NhbGVUeXBlKTtcbiAgICBjYXNlICdwYWRkaW5nSW5uZXInOlxuICAgICAgcmV0dXJuIHNjYWxlVHlwZSA9PT0gJ2JhbmQnO1xuICAgIGNhc2UgJ2NsYW1wJzpcbiAgICAgIHJldHVybiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXMoc2NhbGVUeXBlKSB8fCBzY2FsZVR5cGUgPT09ICdzZXF1ZW50aWFsJztcbiAgICBjYXNlICduaWNlJzpcbiAgICAgIHJldHVybiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXMoc2NhbGVUeXBlKSB8fCBzY2FsZVR5cGUgPT09ICdzZXF1ZW50aWFsJyB8fCBzY2FsZVR5cGUgYXMgYW55ID09PSAncXVhbnRpemUnO1xuICAgIGNhc2UgJ2V4cG9uZW50JzpcbiAgICAgIHJldHVybiBzY2FsZVR5cGUgPT09ICdwb3cnO1xuICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgcmV0dXJuIHNjYWxlVHlwZSA9PT0gJ2xvZyc7XG4gICAgY2FzZSAnemVybyc6XG4gICAgICByZXR1cm4gaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpICYmICFjb250YWlucyhbXG4gICAgICAgICdsb2cnLCAgLy8gbG9nIHNjYWxlIGNhbm5vdCBoYXZlIHplcm8gdmFsdWVcbiAgICAgICAgJ3RpbWUnLCAndXRjJywgLy8gemVybyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGltZVxuICAgICAgICAnYmluLWxpbmVhcicsIC8vIGJpbm5pbmcgc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IGFkZCB6ZXJvXG4gICAgICAgICd0aHJlc2hvbGQnLCAvLyB0aHJlc2hvbGQgcmVxdWlyZXMgY3VzdG9tIGRvbWFpbiBzbyB6ZXJvIGRvZXMgbm90IG1hdHRlclxuICAgICAgICAncXVhbnRpbGUnIC8vIHF1YW50aWxlIGRlcGVuZHMgb24gZGlzdHJpYnV0aW9uIHNvIHplcm8gZG9lcyBub3QgbWF0dGVyXG4gICAgICBdLCBzY2FsZVR5cGUpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSovXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY2FsZSBwcm9wZXJ0eSAke3Byb3BOYW1lfS5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaW5wdXQgY2hhbm5lbCBzdXBwb3J0cyB0aGUgaW5wdXQgc2NhbGUgcHJvcGVydHkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHkoY2hhbm5lbDogQ2hhbm5lbCwgcHJvcE5hbWU6IGtleW9mIFNjYWxlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ2ludGVycG9sYXRlJzpcbiAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgaWYgKCFpc0NvbG9yQ2hhbm5lbChjaGFubmVsKSkge1xuICAgICAgICByZXR1cm4gbG9nLm1lc3NhZ2UuY2Fubm90VXNlU2NhbGVQcm9wZXJ0eVdpdGhOb25Db2xvcihjaGFubmVsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgY2FzZSAnZG9tYWluJzpcbiAgICBjYXNlICdyYW5nZSc6XG4gICAgY2FzZSAnYmFzZSc6XG4gICAgY2FzZSAnZXhwb25lbnQnOlxuICAgIGNhc2UgJ25pY2UnOlxuICAgIGNhc2UgJ3BhZGRpbmcnOlxuICAgIGNhc2UgJ3BhZGRpbmdJbm5lcic6XG4gICAgY2FzZSAncGFkZGluZ091dGVyJzpcbiAgICBjYXNlICdyYW5nZVN0ZXAnOlxuICAgIGNhc2UgJ3JldmVyc2UnOlxuICAgIGNhc2UgJ3JvdW5kJzpcbiAgICBjYXNlICdjbGFtcCc6XG4gICAgY2FzZSAnemVybyc6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBHT09EIVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpdCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSAqL1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NhbGUgcHJvcGVydHkgXCIke3Byb3BOYW1lfVwiLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUeXBlU3VwcG9ydERhdGFUeXBlKHNwZWNpZmllZFR5cGU6IFNjYWxlVHlwZSwgZmllbGREZWZUeXBlOiBUeXBlLCBiaW46IGJvb2xlYW58QmluUGFyYW1zKTpib29sZWFuIHtcbiAgaWYgKGNvbnRhaW5zKFtUeXBlLk9SRElOQUwsIFR5cGUuTk9NSU5BTF0sIGZpZWxkRGVmVHlwZSkpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVkVHlwZSA9PT0gdW5kZWZpbmVkIHx8IGhhc0Rpc2NyZXRlRG9tYWluKHNwZWNpZmllZFR5cGUpO1xuICB9IGVsc2UgaWYgKGZpZWxkRGVmVHlwZSA9PT0gVHlwZS5URU1QT1JBTCkge1xuICAgIHJldHVybiBjb250YWlucyhbU2NhbGVUeXBlLlRJTUUsIFNjYWxlVHlwZS5VVEMsIFNjYWxlVHlwZS5TRVFVRU5USUFMLCB1bmRlZmluZWRdLCBzcGVjaWZpZWRUeXBlKTtcbiAgfSBlbHNlIGlmIChmaWVsZERlZlR5cGUgPT09IFR5cGUuUVVBTlRJVEFUSVZFKSB7XG4gICAgaWYgKGJpbikge1xuICAgICAgcmV0dXJuIGNvbnRhaW5zKFtTY2FsZVR5cGUuQklOX0xJTkVBUiwgU2NhbGVUeXBlLkJJTl9PUkRJTkFMLCBTY2FsZVR5cGUuTElORUFSXSwgc3BlY2lmaWVkVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWlucyhbU2NhbGVUeXBlLkxPRywgU2NhbGVUeXBlLlBPVywgU2NhbGVUeXBlLlNRUlQsIFNjYWxlVHlwZS5RVUFOVElMRSwgU2NhbGVUeXBlLlFVQU5USVpFLCBTY2FsZVR5cGUuTElORUFSLCBTY2FsZVR5cGUuU0VRVUVOVElBTCwgdW5kZWZpbmVkXSwgc3BlY2lmaWVkVHlwZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWw6IENoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgQ2hhbm5lbC5YOlxuICAgIGNhc2UgQ2hhbm5lbC5ZOlxuICAgIGNhc2UgQ2hhbm5lbC5TSVpFOiAvLyBUT0RPOiBzaXplIGFuZCBvcGFjaXR5IGNhbiBzdXBwb3J0IG9yZGluYWwgd2l0aCBtb3JlIG1vZGlmaWNhdGlvblxuICAgIGNhc2UgQ2hhbm5lbC5PUEFDSVRZOlxuICAgICAgLy8gQWx0aG91Z2ggaXQgZ2VuZXJhbGx5IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byB1c2UgYmFuZCB3aXRoIHNpemUgYW5kIG9wYWNpdHksXG4gICAgICAvLyBpdCBjYW4gYWxzbyB3b3JrIHNpbmNlIHdlIHVzZSBiYW5kOiAwLjUgdG8gZ2V0IG1pZHBvaW50LlxuICAgICAgcmV0dXJuIGlzQ29udGludW91c1RvQ29udGludW91cyhzY2FsZVR5cGUpIHx8IGNvbnRhaW5zKFsnYmFuZCcsICdwb2ludCddLCBzY2FsZVR5cGUpO1xuXG4gICAgY2FzZSBDaGFubmVsLkNPTE9SOlxuICAgIGNhc2UgQ2hhbm5lbC5GSUxMOlxuICAgIGNhc2UgQ2hhbm5lbC5TVFJPS0U6XG4gICAgICByZXR1cm4gc2NhbGVUeXBlICE9PSAnYmFuZCc7ICAgIC8vIGJhbmQgZG9lcyBub3QgbWFrZSBzZW5zZSB3aXRoIGNvbG9yXG5cbiAgICBjYXNlIENoYW5uZWwuU0hBUEU6XG4gICAgICByZXR1cm4gc2NhbGVUeXBlID09PSAnb3JkaW5hbCc7IC8vIHNoYXBlID0gbG9va3VwIG9ubHlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaXQgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkU2NhbGVUeXBlKGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmVHlwZTogVHlwZSwgYmluPzogYm9vbGVhbikge1xuICByZXR1cm4gU0NBTEVfVFlQRV9JTkRFWFtnZW5lcmF0ZVNjYWxlVHlwZUluZGV4S2V5KGNoYW5uZWwsIGZpZWxkRGVmVHlwZSwgYmluKV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGVUeXBlSW5kZXgge1xuICBbY2hhbm5lbDogc3RyaW5nXTogU2NhbGVUeXBlW107XG59XG5cbi8vIGdlbmVyYXRlcyBTY2FsZVR5cGVJbmRleCB3aGVyZSBrZXlzIGFyZSBlbmNvZGluZyBjaGFubmVscyBhbmQgdmFsdWVzIGFyZSBsaXN0IG9mIHZhbGlkIFNjYWxlVHlwZXNcbmZ1bmN0aW9uIGdlbmVyYXRlU2NhbGVUeXBlSW5kZXgoKSB7XG4gIGNvbnN0IGluZGV4OiBTY2FsZVR5cGVJbmRleCA9IHt9O1xuICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgQ0hBTk5FTFMpIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkRGVmVHlwZSBvZiBrZXlzKFRZUEVfSU5ERVgpKSB7XG4gICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBTQ0FMRV9UWVBFUykge1xuICAgICAgICBmb3IgKGNvbnN0IGJpbiBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gZ2VuZXJhdGVTY2FsZVR5cGVJbmRleEtleShjaGFubmVsLCBmaWVsZERlZlR5cGUsIGJpbik7XG4gICAgICAgICAgaWYgKGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNjYWxlVHlwZSkgJiYgc2NhbGVUeXBlU3VwcG9ydERhdGFUeXBlKHNjYWxlVHlwZSwgZmllbGREZWZUeXBlLCBiaW4pKSB7XG4gICAgICAgICAgICBpbmRleFtrZXldID0gaW5kZXhba2V5XSB8fCBbXTtcbiAgICAgICAgICAgIGluZGV4W2tleV0ucHVzaChzY2FsZVR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU2NhbGVUeXBlSW5kZXhLZXkoY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWZUeXBlOiBUeXBlLCBiaW46IGJvb2xlYW4pIHtcbiAgY29uc3Qga2V5ID0gY2hhbm5lbCArICdfJyArIGZpZWxkRGVmVHlwZTtcbiAgcmV0dXJuIGJpbiA/IGtleSArICdfYmluJyA6IGtleTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/selection.d.ts b/build/src/selection.d.ts new file mode 100644 index 0000000000..c81e849c37 --- /dev/null +++ b/build/src/selection.d.ts @@ -0,0 +1,183 @@ +import { SingleDefChannel } from './channel'; +import { VgBinding, VgEventStream } from './vega.schema'; +export declare const SELECTION_ID = "_vgsid_"; +export declare type SelectionType = 'single' | 'multi' | 'interval'; +export declare type SelectionResolution = 'global' | 'union' | 'intersect'; +export interface BaseSelectionDef { + /** + * A [Vega event stream](https://vega.github.io/vega/docs/event-streams/) (object or selector) that triggers the selection. + * For interval selections, the event stream must specify a [start and end](https://vega.github.io/vega/docs/event-streams/#between-filters). + */ + on?: VgEventStream; + /** + * With layered and multi-view displays, a strategy that determines how + * selections' data queries are resolved when applied in a filter transform, + * conditional encoding rule, or scale domain. + * + */ + resolve?: SelectionResolution; + /** + * An array of encoding channels. The corresponding data field values + * must match for a data tuple to fall within the selection. + */ + encodings?: SingleDefChannel[]; + /** + * An array of field names whose values must match for a data tuple to + * fall within the selection. + */ + fields?: string[]; + /** + * By default, all data values are considered to lie within an empty selection. + * When set to `none`, empty selections contain no data values. + */ + empty?: 'all' | 'none'; +} +export interface SingleSelectionConfig extends BaseSelectionDef { + /** + * Establish a two-way binding between a single selection and input elements + * (also known as dynamic query widgets). A binding takes the form of + * Vega's [input element binding definition](https://vega.github.io/vega/docs/signals/#bind) + * or can be a mapping between projected field/encodings and binding definitions. + * + * See the [bind transform](https://vega.github.io/vega-lite/docs/bind.html) documentation for more information. + */ + bind?: VgBinding | { + [key: string]: VgBinding; + }; + /** + * When true, an invisible voronoi diagram is computed to accelerate discrete + * selection. The data value _nearest_ the mouse cursor is added to the selection. + * + * See the [nearest transform](https://vega.github.io/vega-lite/docs/nearest.html) documentation for more information. + */ + nearest?: boolean; +} +export interface MultiSelectionConfig extends BaseSelectionDef { + /** + * Controls whether data values should be toggled or only ever inserted into + * multi selections. Can be `true`, `false` (for insertion only), or a + * [Vega expression](https://vega.github.io/vega/docs/expressions/). + * + * __Default value:__ `true`, which corresponds to `event.shiftKey` (i.e., + * data values are toggled when a user interacts with the shift-key pressed). + * + * See the [toggle transform](https://vega.github.io/vega-lite/docs/toggle.html) documentation for more information. + */ + toggle?: string | boolean; + /** + * When true, an invisible voronoi diagram is computed to accelerate discrete + * selection. The data value _nearest_ the mouse cursor is added to the selection. + * + * See the [nearest transform](https://vega.github.io/vega-lite/docs/nearest.html) documentation for more information. + */ + nearest?: boolean; +} +export interface BrushConfig { + /** + * The fill color of the interval mark. + * + * __Default value:__ `#333333` + * + */ + fill?: string; + /** + * The fill opacity of the interval mark (a value between 0 and 1). + * + * __Default value:__ `0.125` + */ + fillOpacity?: number; + /** + * The stroke color of the interval mark. + * + * __Default value:__ `#ffffff` + */ + stroke?: string; + /** + * The stroke opacity of the interval mark (a value between 0 and 1). + */ + strokeOpacity?: number; + /** + * The stroke width of the interval mark. + */ + strokeWidth?: number; + /** + * An array of alternating stroke and space lengths, + * for creating dashed or dotted lines. + */ + strokeDash?: number[]; + /** + * The offset (in pixels) with which to begin drawing the stroke dash array. + */ + strokeDashOffset?: number; +} +export interface IntervalSelectionConfig extends BaseSelectionDef { + /** + * When truthy, allows a user to interactively move an interval selection + * back-and-forth. Can be `true`, `false` (to disable panning), or a + * [Vega event stream definition](https://vega.github.io/vega/docs/event-streams/) + * which must include a start and end event to trigger continuous panning. + * + * __Default value:__ `true`, which corresponds to + * `[mousedown, window:mouseup] > window:mousemove!` which corresponds to + * clicks and dragging within an interval selection to reposition it. + */ + translate?: string | boolean; + /** + * When truthy, allows a user to interactively resize an interval selection. + * Can be `true`, `false` (to disable zooming), or a [Vega event stream + * definition](https://vega.github.io/vega/docs/event-streams/). Currently, + * only `wheel` events are supported. + * + * + * __Default value:__ `true`, which corresponds to `wheel!`. + */ + zoom?: string | boolean; + /** + * Establishes a two-way binding between the interval selection and the scales + * used within the same view. This allows a user to interactively pan and + * zoom the view. + */ + bind?: 'scales'; + /** + * An interval selection also adds a rectangle mark to depict the + * extents of the interval. The `mark` property can be used to customize the + * appearance of the mark. + */ + mark?: BrushConfig; +} +export interface SingleSelection extends SingleSelectionConfig { + type: 'single'; +} +export interface MultiSelection extends MultiSelectionConfig { + type: 'multi'; +} +export interface IntervalSelection extends IntervalSelectionConfig { + type: 'interval'; +} +export declare type SelectionDef = SingleSelection | MultiSelection | IntervalSelection; +export interface SelectionConfig { + /** + * The default definition for a [`single`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All properties and transformations + * for a single selection definition (except `type`) may be specified here. + * + * For instance, setting `single` to `{"on": "dblclick"}` populates single selections on double-click by default. + */ + single?: SingleSelectionConfig; + /** + * The default definition for a [`multi`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All properties and transformations + * for a multi selection definition (except `type`) may be specified here. + * + * For instance, setting `multi` to `{"toggle": "event.altKey"}` adds additional values to + * multi selections when clicking with the alt-key pressed by default. + */ + multi?: MultiSelectionConfig; + /** + * The default definition for an [`interval`](https://vega.github.io/vega-lite/docs/selection.html#type) selection. All properties and transformations + * for an interval selection definition (except `type`) may be specified here. + * + * For instance, setting `interval` to `{"translate": false}` disables the ability to move + * interval selections by default. + */ + interval?: IntervalSelectionConfig; +} +export declare const defaultConfig: SelectionConfig; diff --git a/build/src/selection.js b/build/src/selection.js new file mode 100644 index 0000000000..8cd637d289 --- /dev/null +++ b/build/src/selection.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SELECTION_ID = '_vgsid_'; +exports.defaultConfig = { + single: { + on: 'click', + fields: [exports.SELECTION_ID], + resolve: 'global', + empty: 'all' + }, + multi: { + on: 'click', + fields: [exports.SELECTION_ID], + toggle: 'event.shiftKey', + resolve: 'global', + empty: 'all' + }, + interval: { + on: '[mousedown, window:mouseup] > window:mousemove!', + encodings: ['x', 'y'], + translate: '[mousedown, window:mouseup] > window:mousemove!', + zoom: 'wheel!', + mark: { fill: '#333', fillOpacity: 0.125, stroke: 'white' }, + resolve: 'global' + } +}; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdhLFFBQUEsWUFBWSxHQUFHLFNBQVMsQ0FBQztBQTJNekIsUUFBQSxhQUFhLEdBQW1CO0lBQzNDLE1BQU0sRUFBRTtRQUNOLEVBQUUsRUFBRSxPQUFPO1FBQ1gsTUFBTSxFQUFFLENBQUMsb0JBQVksQ0FBQztRQUN0QixPQUFPLEVBQUUsUUFBUTtRQUNqQixLQUFLLEVBQUUsS0FBSztLQUNiO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsRUFBRSxFQUFFLE9BQU87UUFDWCxNQUFNLEVBQUUsQ0FBQyxvQkFBWSxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxnQkFBZ0I7UUFDeEIsT0FBTyxFQUFFLFFBQVE7UUFDakIsS0FBSyxFQUFFLEtBQUs7S0FDYjtJQUNELFFBQVEsRUFBRTtRQUNSLEVBQUUsRUFBRSxpREFBaUQ7UUFDckQsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztRQUNyQixTQUFTLEVBQUUsaURBQWlEO1FBQzVELElBQUksRUFBRSxRQUFRO1FBQ2QsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUM7UUFDekQsT0FBTyxFQUFFLFFBQVE7S0FDbEI7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTaW5nbGVEZWZDaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtWZ0JpbmRpbmcsIFZnRXZlbnRTdHJlYW19IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgY29uc3QgU0VMRUNUSU9OX0lEID0gJ192Z3NpZF8nO1xuZXhwb3J0IHR5cGUgU2VsZWN0aW9uVHlwZSA9ICdzaW5nbGUnIHwgJ211bHRpJyB8ICdpbnRlcnZhbCc7XG5leHBvcnQgdHlwZSBTZWxlY3Rpb25SZXNvbHV0aW9uID0gJ2dsb2JhbCcgfCAndW5pb24nIHwgJ2ludGVyc2VjdCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVNlbGVjdGlvbkRlZiB7XG4gIC8qKlxuICAgKiBBIFtWZWdhIGV2ZW50IHN0cmVhbV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhL2RvY3MvZXZlbnQtc3RyZWFtcy8pIChvYmplY3Qgb3Igc2VsZWN0b3IpIHRoYXQgdHJpZ2dlcnMgdGhlIHNlbGVjdGlvbi5cbiAgICogRm9yIGludGVydmFsIHNlbGVjdGlvbnMsIHRoZSBldmVudCBzdHJlYW0gbXVzdCBzcGVjaWZ5IGEgW3N0YXJ0IGFuZCBlbmRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL2V2ZW50LXN0cmVhbXMvI2JldHdlZW4tZmlsdGVycykuXG4gICAqL1xuICBvbj86IFZnRXZlbnRTdHJlYW07XG4gIC8qKlxuICAgKiBXaXRoIGxheWVyZWQgYW5kIG11bHRpLXZpZXcgZGlzcGxheXMsIGEgc3RyYXRlZ3kgdGhhdCBkZXRlcm1pbmVzIGhvd1xuICAgKiBzZWxlY3Rpb25zJyBkYXRhIHF1ZXJpZXMgYXJlIHJlc29sdmVkIHdoZW4gYXBwbGllZCBpbiBhIGZpbHRlciB0cmFuc2Zvcm0sXG4gICAqIGNvbmRpdGlvbmFsIGVuY29kaW5nIHJ1bGUsIG9yIHNjYWxlIGRvbWFpbi5cbiAgICpcbiAgICovXG4gIHJlc29sdmU/OiBTZWxlY3Rpb25SZXNvbHV0aW9uO1xuXG4gIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yNTk2KS5cbiAgLy8gcHJlZGljYXRlPzogc3RyaW5nO1xuICAvLyBkb21haW4/OiBTZWxlY3Rpb25Eb21haW47XG5cbiAgLy8gVHJhbnNmb3Jtc1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBlbmNvZGluZyBjaGFubmVscy4gVGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBmaWVsZCB2YWx1ZXNcbiAgICogbXVzdCBtYXRjaCBmb3IgYSBkYXRhIHR1cGxlIHRvIGZhbGwgd2l0aGluIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBlbmNvZGluZ3M/OiBTaW5nbGVEZWZDaGFubmVsW107XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGZpZWxkIG5hbWVzIHdob3NlIHZhbHVlcyBtdXN0IG1hdGNoIGZvciBhIGRhdGEgdHVwbGUgdG9cbiAgICogZmFsbCB3aXRoaW4gdGhlIHNlbGVjdGlvbi5cbiAgICovXG4gIGZpZWxkcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBhbGwgZGF0YSB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdG8gbGllIHdpdGhpbiBhbiBlbXB0eSBzZWxlY3Rpb24uXG4gICAqIFdoZW4gc2V0IHRvIGBub25lYCwgZW1wdHkgc2VsZWN0aW9ucyBjb250YWluIG5vIGRhdGEgdmFsdWVzLlxuICAgKi9cbiAgZW1wdHk/OiAnYWxsJyB8ICdub25lJztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVTZWxlY3Rpb25Db25maWcgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uRGVmIHtcbiAgLyoqXG4gICAqIEVzdGFibGlzaCBhIHR3by13YXkgYmluZGluZyBiZXR3ZWVuIGEgc2luZ2xlIHNlbGVjdGlvbiBhbmQgaW5wdXQgZWxlbWVudHNcbiAgICogKGFsc28ga25vd24gYXMgZHluYW1pYyBxdWVyeSB3aWRnZXRzKS4gQSBiaW5kaW5nIHRha2VzIHRoZSBmb3JtIG9mXG4gICAqIFZlZ2EncyBbaW5wdXQgZWxlbWVudCBiaW5kaW5nIGRlZmluaXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL3NpZ25hbHMvI2JpbmQpXG4gICAqIG9yIGNhbiBiZSBhIG1hcHBpbmcgYmV0d2VlbiBwcm9qZWN0ZWQgZmllbGQvZW5jb2RpbmdzIGFuZCBiaW5kaW5nIGRlZmluaXRpb25zLlxuICAgKlxuICAgKiBTZWUgdGhlIFtiaW5kIHRyYW5zZm9ybV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9iaW5kLmh0bWwpIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBiaW5kPzogVmdCaW5kaW5nIHwge1trZXk6IHN0cmluZ106IFZnQmluZGluZ307XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYW4gaW52aXNpYmxlIHZvcm9ub2kgZGlhZ3JhbSBpcyBjb21wdXRlZCB0byBhY2NlbGVyYXRlIGRpc2NyZXRlXG4gICAqIHNlbGVjdGlvbi4gVGhlIGRhdGEgdmFsdWUgX25lYXJlc3RfIHRoZSBtb3VzZSBjdXJzb3IgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICpcbiAgICogU2VlIHRoZSBbbmVhcmVzdCB0cmFuc2Zvcm1dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbmVhcmVzdC5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgbmVhcmVzdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTZWxlY3Rpb25Db25maWcgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uRGVmIHtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIHRvZ2dsZWQgb3Igb25seSBldmVyIGluc2VydGVkIGludG9cbiAgICogbXVsdGkgc2VsZWN0aW9ucy4gQ2FuIGJlIGB0cnVlYCwgYGZhbHNlYCAoZm9yIGluc2VydGlvbiBvbmx5KSwgb3IgYVxuICAgKiBbVmVnYSBleHByZXNzaW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EvZG9jcy9leHByZXNzaW9ucy8pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgLCB3aGljaCBjb3JyZXNwb25kcyB0byBgZXZlbnQuc2hpZnRLZXlgIChpLmUuLFxuICAgKiBkYXRhIHZhbHVlcyBhcmUgdG9nZ2xlZCB3aGVuIGEgdXNlciBpbnRlcmFjdHMgd2l0aCB0aGUgc2hpZnQta2V5IHByZXNzZWQpLlxuICAgKlxuICAgKiBTZWUgdGhlIFt0b2dnbGUgdHJhbnNmb3JtXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RvZ2dsZS5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgdG9nZ2xlPzogc3RyaW5nIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB0cnVlLCBhbiBpbnZpc2libGUgdm9yb25vaSBkaWFncmFtIGlzIGNvbXB1dGVkIHRvIGFjY2VsZXJhdGUgZGlzY3JldGVcbiAgICogc2VsZWN0aW9uLiBUaGUgZGF0YSB2YWx1ZSBfbmVhcmVzdF8gdGhlIG1vdXNlIGN1cnNvciBpcyBhZGRlZCB0byB0aGUgc2VsZWN0aW9uLlxuICAgKlxuICAgKiBTZWUgdGhlIFtuZWFyZXN0IHRyYW5zZm9ybV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9uZWFyZXN0Lmh0bWwpIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBuZWFyZXN0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCcnVzaENvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZmlsbCBjb2xvciBvZiB0aGUgaW50ZXJ2YWwgbWFyay5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAjMzMzMzMzYFxuICAgKlxuICAgKi9cbiAgZmlsbD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBmaWxsIG9wYWNpdHkgb2YgdGhlIGludGVydmFsIG1hcmsgKGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAxKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAwLjEyNWBcbiAgICovXG4gIGZpbGxPcGFjaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0cm9rZSBjb2xvciBvZiB0aGUgaW50ZXJ2YWwgbWFyay5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAjZmZmZmZmYFxuICAgKi9cbiAgc3Ryb2tlPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0cm9rZSBvcGFjaXR5IG9mIHRoZSBpbnRlcnZhbCBtYXJrIChhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSkuXG4gICAqL1xuICBzdHJva2VPcGFjaXR5PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0cm9rZSB3aWR0aCBvZiB0aGUgaW50ZXJ2YWwgbWFyay5cbiAgICovXG4gIHN0cm9rZVdpZHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWx0ZXJuYXRpbmcgc3Ryb2tlIGFuZCBzcGFjZSBsZW5ndGhzLFxuICAgKiBmb3IgY3JlYXRpbmcgZGFzaGVkIG9yIGRvdHRlZCBsaW5lcy5cbiAgICovXG4gIHN0cm9rZURhc2g/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgKGluIHBpeGVscykgd2l0aCB3aGljaCB0byBiZWdpbiBkcmF3aW5nIHRoZSBzdHJva2UgZGFzaCBhcnJheS5cbiAgICovXG4gIHN0cm9rZURhc2hPZmZzZXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJ2YWxTZWxlY3Rpb25Db25maWcgZXh0ZW5kcyBCYXNlU2VsZWN0aW9uRGVmIHtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1dGh5LCBhbGxvd3MgYSB1c2VyIHRvIGludGVyYWN0aXZlbHkgbW92ZSBhbiBpbnRlcnZhbCBzZWxlY3Rpb25cbiAgICogYmFjay1hbmQtZm9ydGguIENhbiBiZSBgdHJ1ZWAsIGBmYWxzZWAgKHRvIGRpc2FibGUgcGFubmluZyksIG9yIGFcbiAgICogW1ZlZ2EgZXZlbnQgc3RyZWFtIGRlZmluaXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL2V2ZW50LXN0cmVhbXMvKVxuICAgKiB3aGljaCBtdXN0IGluY2x1ZGUgYSBzdGFydCBhbmQgZW5kIGV2ZW50IHRvIHRyaWdnZXIgY29udGludW91cyBwYW5uaW5nLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgLCB3aGljaCBjb3JyZXNwb25kcyB0b1xuICAgKiBgW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSFgIHdoaWNoIGNvcnJlc3BvbmRzIHRvXG4gICAqIGNsaWNrcyBhbmQgZHJhZ2dpbmcgd2l0aGluIGFuIGludGVydmFsIHNlbGVjdGlvbiB0byByZXBvc2l0aW9uIGl0LlxuICAgKi9cbiAgdHJhbnNsYXRlPzogc3RyaW5nIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB0cnV0aHksIGFsbG93cyBhIHVzZXIgdG8gaW50ZXJhY3RpdmVseSByZXNpemUgYW4gaW50ZXJ2YWwgc2VsZWN0aW9uLlxuICAgKiBDYW4gYmUgYHRydWVgLCBgZmFsc2VgICh0byBkaXNhYmxlIHpvb21pbmcpLCBvciBhIFtWZWdhIGV2ZW50IHN0cmVhbVxuICAgKiBkZWZpbml0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EvZG9jcy9ldmVudC1zdHJlYW1zLykuIEN1cnJlbnRseSxcbiAgICogb25seSBgd2hlZWxgIGV2ZW50cyBhcmUgc3VwcG9ydGVkLlxuICAgKlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgLCB3aGljaCBjb3JyZXNwb25kcyB0byBgd2hlZWwhYC5cbiAgICovXG4gIHpvb20/OiBzdHJpbmcgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2hlcyBhIHR3by13YXkgYmluZGluZyBiZXR3ZWVuIHRoZSBpbnRlcnZhbCBzZWxlY3Rpb24gYW5kIHRoZSBzY2FsZXNcbiAgICogdXNlZCB3aXRoaW4gdGhlIHNhbWUgdmlldy4gVGhpcyBhbGxvd3MgYSB1c2VyIHRvIGludGVyYWN0aXZlbHkgcGFuIGFuZFxuICAgKiB6b29tIHRoZSB2aWV3LlxuICAgKi9cbiAgYmluZD86ICdzY2FsZXMnO1xuXG4gIC8qKlxuICAgKiBBbiBpbnRlcnZhbCBzZWxlY3Rpb24gYWxzbyBhZGRzIGEgcmVjdGFuZ2xlIG1hcmsgdG8gZGVwaWN0IHRoZVxuICAgKiBleHRlbnRzIG9mIHRoZSBpbnRlcnZhbC4gVGhlIGBtYXJrYCBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgdGhlXG4gICAqIGFwcGVhcmFuY2Ugb2YgdGhlIG1hcmsuXG4gICAqL1xuICBtYXJrPzogQnJ1c2hDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlU2VsZWN0aW9uIGV4dGVuZHMgU2luZ2xlU2VsZWN0aW9uQ29uZmlnIHtcbiAgdHlwZTogJ3NpbmdsZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlTZWxlY3Rpb24gZXh0ZW5kcyBNdWx0aVNlbGVjdGlvbkNvbmZpZyB7XG4gIHR5cGU6ICdtdWx0aSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJ2YWxTZWxlY3Rpb24gZXh0ZW5kcyBJbnRlcnZhbFNlbGVjdGlvbkNvbmZpZyB7XG4gIHR5cGU6ICdpbnRlcnZhbCc7XG59XG5cbmV4cG9ydCB0eXBlIFNlbGVjdGlvbkRlZiA9IFNpbmdsZVNlbGVjdGlvbiB8IE11bHRpU2VsZWN0aW9uIHwgSW50ZXJ2YWxTZWxlY3Rpb247XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIGEgW2BzaW5nbGVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sI3R5cGUpIHNlbGVjdGlvbi4gQWxsIHByb3BlcnRpZXMgYW5kIHRyYW5zZm9ybWF0aW9uc1xuICAgKiAgZm9yIGEgc2luZ2xlIHNlbGVjdGlvbiBkZWZpbml0aW9uIChleGNlcHQgYHR5cGVgKSBtYXkgYmUgc3BlY2lmaWVkIGhlcmUuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgc2V0dGluZyBgc2luZ2xlYCB0byBge1wib25cIjogXCJkYmxjbGlja1wifWAgcG9wdWxhdGVzIHNpbmdsZSBzZWxlY3Rpb25zIG9uIGRvdWJsZS1jbGljayBieSBkZWZhdWx0LlxuICAgKi9cbiAgc2luZ2xlPzogU2luZ2xlU2VsZWN0aW9uQ29uZmlnO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgYSBbYG11bHRpYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zZWxlY3Rpb24uaHRtbCN0eXBlKSBzZWxlY3Rpb24uIEFsbCBwcm9wZXJ0aWVzIGFuZCB0cmFuc2Zvcm1hdGlvbnNcbiAgICogZm9yIGEgbXVsdGkgc2VsZWN0aW9uIGRlZmluaXRpb24gKGV4Y2VwdCBgdHlwZWApIG1heSBiZSBzcGVjaWZpZWQgaGVyZS5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCBzZXR0aW5nIGBtdWx0aWAgdG8gYHtcInRvZ2dsZVwiOiBcImV2ZW50LmFsdEtleVwifWAgYWRkcyBhZGRpdGlvbmFsIHZhbHVlcyB0b1xuICAgKiBtdWx0aSBzZWxlY3Rpb25zIHdoZW4gY2xpY2tpbmcgd2l0aCB0aGUgYWx0LWtleSBwcmVzc2VkIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBtdWx0aT86IE11bHRpU2VsZWN0aW9uQ29uZmlnO1xuICAvKipcbiAgICogVGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBmb3IgYW4gW2BpbnRlcnZhbGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2VsZWN0aW9uLmh0bWwjdHlwZSkgc2VsZWN0aW9uLiBBbGwgcHJvcGVydGllcyBhbmQgdHJhbnNmb3JtYXRpb25zXG4gICAqIGZvciBhbiBpbnRlcnZhbCBzZWxlY3Rpb24gZGVmaW5pdGlvbiAoZXhjZXB0IGB0eXBlYCkgbWF5IGJlIHNwZWNpZmllZCBoZXJlLlxuICAgKlxuICAgKiBGb3IgaW5zdGFuY2UsIHNldHRpbmcgYGludGVydmFsYCB0byBge1widHJhbnNsYXRlXCI6IGZhbHNlfWAgZGlzYWJsZXMgdGhlIGFiaWxpdHkgdG8gbW92ZVxuICAgKiBpbnRlcnZhbCBzZWxlY3Rpb25zIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBpbnRlcnZhbD86IEludGVydmFsU2VsZWN0aW9uQ29uZmlnO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdENvbmZpZzpTZWxlY3Rpb25Db25maWcgPSB7XG4gIHNpbmdsZToge1xuICAgIG9uOiAnY2xpY2snLFxuICAgIGZpZWxkczogW1NFTEVDVElPTl9JRF0sXG4gICAgcmVzb2x2ZTogJ2dsb2JhbCcsXG4gICAgZW1wdHk6ICdhbGwnXG4gIH0sXG4gIG11bHRpOiB7XG4gICAgb246ICdjbGljaycsXG4gICAgZmllbGRzOiBbU0VMRUNUSU9OX0lEXSxcbiAgICB0b2dnbGU6ICdldmVudC5zaGlmdEtleScsXG4gICAgcmVzb2x2ZTogJ2dsb2JhbCcsXG4gICAgZW1wdHk6ICdhbGwnXG4gIH0sXG4gIGludGVydmFsOiB7XG4gICAgb246ICdbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIScsXG4gICAgZW5jb2RpbmdzOiBbJ3gnLCAneSddLFxuICAgIHRyYW5zbGF0ZTogJ1ttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhJyxcbiAgICB6b29tOiAnd2hlZWwhJyxcbiAgICBtYXJrOiB7ZmlsbDogJyMzMzMnLCBmaWxsT3BhY2l0eTogMC4xMjUsIHN0cm9rZTogJ3doaXRlJ30sXG4gICAgcmVzb2x2ZTogJ2dsb2JhbCdcbiAgfVxufTtcbiJdfQ== \ No newline at end of file diff --git a/build/src/sort.d.ts b/build/src/sort.d.ts new file mode 100644 index 0000000000..425e0da6ab --- /dev/null +++ b/build/src/sort.d.ts @@ -0,0 +1,41 @@ +import { AggregateOp } from 'vega'; +import { VgComparatorOrder } from './vega.schema'; +export declare type SortOrder = VgComparatorOrder | null; +/** + * A sort definition for transform + */ +export interface SortField { + /** + * The name of the field to sort. + */ + field: string; + /** + * Whether to sort the field in ascending or descending order. + */ + order?: VgComparatorOrder; +} +/** + * A sort definition for sorting a discrete scale in an encoding field definition. + */ +export interface EncodingSortField { + /** + * The data [field](https://vega.github.io/vega-lite/docs/field.html) to sort by. + * + * __Default value:__ If unspecified, defaults to the field specified in the outer data reference. + */ + field?: F; + /** + * An [aggregate operation](https://vega.github.io/vega-lite/docs/aggregate.html#ops) to perform on the field prior to sorting (e.g., `"count"`, `"mean"` and `"median"`). + * This property is required in cases where the sort field and the data reference field do not match. + * The input data objects will be aggregated, grouped by the encoded data field. + * + * For a full list of operations, please see the documentation for [aggregate](https://vega.github.io/vega-lite/docs/aggregate.html#ops). + */ + op: AggregateOp; + /** + * The sort order. One of `"ascending"` (default), `"descending"`, or `null` (no not sort). + */ + order?: SortOrder; +} +export declare function isSortField(sort: string[] | SortOrder | EncodingSortField): sort is EncodingSortField; +export declare function isSortArray(sort: string[] | SortOrder | EncodingSortField): sort is string[]; diff --git a/build/src/sort.js b/build/src/sort.js new file mode 100644 index 0000000000..2a42ddad2f --- /dev/null +++ b/build/src/sort.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +function isSortField(sort) { + return !!sort && (sort['op'] === 'count' || !!sort['field']) && !!sort['op']; +} +exports.isSortField = isSortField; +function isSortArray(sort) { + return !!sort && vega_util_1.isArray(sort) && sort.every(function (s) { return vega_util_1.isString(s); }); +} +exports.isSortArray = isSortArray; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsdUNBQTRDO0FBa0Q1QyxxQkFBK0IsSUFBaUQ7SUFDOUUsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvRSxDQUFDO0FBRkQsa0NBRUM7QUFFRCxxQkFBK0IsSUFBaUQ7SUFDOUUsT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLG1CQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLG9CQUFRLENBQUMsQ0FBQyxDQUFDLEVBQVgsQ0FBVyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUZELGtDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge2lzQXJyYXksIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge1ZnQ29tcGFyYXRvck9yZGVyfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQgdHlwZSBTb3J0T3JkZXIgPSBWZ0NvbXBhcmF0b3JPcmRlciB8IG51bGw7XG5cblxuLyoqXG4gKiBBIHNvcnQgZGVmaW5pdGlvbiBmb3IgdHJhbnNmb3JtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29ydEZpZWxkIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCB0byBzb3J0LlxuICAgKi9cbiAgZmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBzb3J0IHRoZSBmaWVsZCBpbiBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci5cbiAgICovXG4gIG9yZGVyPzogVmdDb21wYXJhdG9yT3JkZXI7XG59XG5cblxuLyoqXG4gKiBBIHNvcnQgZGVmaW5pdGlvbiBmb3Igc29ydGluZyBhIGRpc2NyZXRlIHNjYWxlIGluIGFuIGVuY29kaW5nIGZpZWxkIGRlZmluaXRpb24uXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZ1NvcnRGaWVsZDxGPiB7XG4gIC8qKlxuICAgKiBUaGUgZGF0YSBbZmllbGRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmllbGQuaHRtbCkgdG8gc29ydCBieS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuc3BlY2lmaWVkLCBkZWZhdWx0cyB0byB0aGUgZmllbGQgc3BlY2lmaWVkIGluIHRoZSBvdXRlciBkYXRhIHJlZmVyZW5jZS5cbiAgICovXG4gIGZpZWxkPzogRjtcbiAgLyoqXG4gICAqIEFuIFthZ2dyZWdhdGUgb3BlcmF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2FnZ3JlZ2F0ZS5odG1sI29wcykgdG8gcGVyZm9ybSBvbiB0aGUgZmllbGQgcHJpb3IgdG8gc29ydGluZyAoZS5nLiwgYFwiY291bnRcImAsIGBcIm1lYW5cImAgYW5kIGBcIm1lZGlhblwiYCkuXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgcmVxdWlyZWQgaW4gY2FzZXMgd2hlcmUgdGhlIHNvcnQgZmllbGQgYW5kIHRoZSBkYXRhIHJlZmVyZW5jZSBmaWVsZCBkbyBub3QgbWF0Y2guXG4gICAqIFRoZSBpbnB1dCBkYXRhIG9iamVjdHMgd2lsbCBiZSBhZ2dyZWdhdGVkLCBncm91cGVkIGJ5IHRoZSBlbmNvZGVkIGRhdGEgZmllbGQuXG4gICAqXG4gICAqIEZvciBhIGZ1bGwgbGlzdCBvZiBvcGVyYXRpb25zLCBwbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBbYWdncmVnYXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2FnZ3JlZ2F0ZS5odG1sI29wcykuXG4gICAqL1xuICBvcDogQWdncmVnYXRlT3A7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3J0IG9yZGVyLiBPbmUgb2YgYFwiYXNjZW5kaW5nXCJgIChkZWZhdWx0KSwgYFwiZGVzY2VuZGluZ1wiYCwgb3IgYG51bGxgIChubyBub3Qgc29ydCkuXG4gICAqL1xuICBvcmRlcj86IFNvcnRPcmRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU29ydEZpZWxkPEY+KHNvcnQ6IHN0cmluZ1tdIHwgU29ydE9yZGVyIHwgRW5jb2RpbmdTb3J0RmllbGQ8Rj4pOiBzb3J0IGlzIEVuY29kaW5nU29ydEZpZWxkPEY+IHtcbiAgcmV0dXJuICEhc29ydCAmJiAoc29ydFsnb3AnXSA9PT0gJ2NvdW50JyB8fCAhIXNvcnRbJ2ZpZWxkJ10pICYmICEhc29ydFsnb3AnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU29ydEFycmF5PEY+KHNvcnQ6IHN0cmluZ1tdIHwgU29ydE9yZGVyIHwgRW5jb2RpbmdTb3J0RmllbGQ8Rj4pOiBzb3J0IGlzIHN0cmluZ1tdIHtcbiAgcmV0dXJuICEhc29ydCAmJiBpc0FycmF5KHNvcnQpICYmIHNvcnQuZXZlcnkocyA9PiBpc1N0cmluZyhzKSk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/spec.d.ts b/build/src/spec.d.ts new file mode 100644 index 0000000000..029cf35b71 --- /dev/null +++ b/build/src/spec.d.ts @@ -0,0 +1,204 @@ +import { Config } from './config'; +import { Data } from './data'; +import { Encoding, EncodingWithFacet } from './encoding'; +import { FacetMapping } from './facet'; +import { FieldDef, RepeatRef } from './fielddef'; +import { AnyMark, Mark, MarkDef } from './mark'; +import { Projection } from './projection'; +import { Repeat } from './repeat'; +import { Resolve } from './resolve'; +import { SelectionDef } from './selection'; +import { TitleParams } from './title'; +import { TopLevelProperties } from './toplevelprops'; +import { Transform } from './transform'; +export declare type TopLevel = S & TopLevelProperties & { + /** + * URL to [JSON schema](http://json-schema.org/) for a Vega-Lite specification. Unless you have a reason to change this, use `https://vega.github.io/schema/vega-lite/v2.json`. Setting the `$schema` property allows automatic validation and autocomplete in editors that support JSON schema. + * @format uri + */ + $schema?: string; + /** + * Vega-Lite configuration object. This property can only be defined at the top-level of a specification. + */ + config?: Config; +}; +export declare type BaseSpec = Partial & { + /** + * Title for the plot. + */ + title?: string | TitleParams; + /** + * Name of the visualization for later reference. + */ + name?: string; + /** + * Description of this mark for commenting purpose. + */ + description?: string; + /** + * An object describing the data source + */ + data?: Data; + /** + * An array of data transformations such as filter and new field calculation. + */ + transform?: Transform[]; +}; +export declare type DataMixins = { + /** + * An object describing the data source + */ + data: Data; +}; +export interface LayoutSizeMixins { + /** + * The width of a visualization. + * + * __Default value:__ This will be determined by the following rules: + * + * - If a view's [`autosize`](https://vega.github.io/vega-lite/docs/size.html#autosize) type is `"fit"` or its x-channel has a [continuous scale](https://vega.github.io/vega-lite/docs/scale.html#continuous), the width will be the value of [`config.view.width`](https://vega.github.io/vega-lite/docs/spec.html#config). + * - For x-axis with a band or point scale: if [`rangeStep`](https://vega.github.io/vega-lite/docs/scale.html#band) is a numeric value or unspecified, the width is [determined by the range step, paddings, and the cardinality of the field mapped to x-channel](https://vega.github.io/vega-lite/docs/scale.html#band). Otherwise, if the `rangeStep` is `null`, the width will be the value of [`config.view.width`](https://vega.github.io/vega-lite/docs/spec.html#config). + * - If no field is mapped to `x` channel, the `width` will be the value of [`config.scale.textXRangeStep`](https://vega.github.io/vega-lite/docs/size.html#default-width-and-height) for `text` mark and the value of `rangeStep` for other marks. + * + * __Note:__ For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the width of a single view. + * + * __See also:__ The documentation for [width and height](https://vega.github.io/vega-lite/docs/size.html) contains more examples. + */ + width?: number; + /** + * The height of a visualization. + * + * __Default value:__ + * - If a view's [`autosize`](https://vega.github.io/vega-lite/docs/size.html#autosize) type is `"fit"` or its y-channel has a [continuous scale](https://vega.github.io/vega-lite/docs/scale.html#continuous), the height will be the value of [`config.view.height`](https://vega.github.io/vega-lite/docs/spec.html#config). + * - For y-axis with a band or point scale: if [`rangeStep`](https://vega.github.io/vega-lite/docs/scale.html#band) is a numeric value or unspecified, the height is [determined by the range step, paddings, and the cardinality of the field mapped to y-channel](https://vega.github.io/vega-lite/docs/scale.html#band). Otherwise, if the `rangeStep` is `null`, the height will be the value of [`config.view.height`](https://vega.github.io/vega-lite/docs/spec.html#config). + * - If no field is mapped to `y` channel, the `height` will be the value of `rangeStep`. + * + * __Note__: For plots with [`row` and `column` channels](https://vega.github.io/vega-lite/docs/encoding.html#facet), this represents the height of a single view. + * + * __See also:__ The documentation for [width and height](https://vega.github.io/vega-lite/docs/size.html) contains more examples. + */ + height?: number; +} +export interface GenericUnitSpec, M> extends BaseSpec, LayoutSizeMixins { + /** + * A string describing the mark type (one of `"bar"`, `"circle"`, `"square"`, `"tick"`, `"line"`, + * `"area"`, `"point"`, `"rule"`, `"geoshape"`, and `"text"`) or a [mark definition object](https://vega.github.io/vega-lite/docs/mark.html#mark-def). + */ + mark: M; + /** + * A key-value mapping between encoding channels and definition of fields. + */ + encoding?: E; + /** + * An object defining properties of geographic projection, which will be applied to `shape` path for `"geoshape"` marks + * and to `latitude` and `"longitude"` channels for other marks. + */ + projection?: Projection; + /** + * A key-value mapping between selection names and definitions. + */ + selection?: { + [name: string]: SelectionDef; + }; +} +export declare type NormalizedUnitSpec = GenericUnitSpec, Mark | MarkDef>; +/** + * Unit spec that can have a composite mark. + */ +export declare type CompositeUnitSpec = GenericUnitSpec, AnyMark>; +/** + * Unit spec that can have a composite mark and row or column channels. + */ +export declare type FacetedCompositeUnitSpec = GenericUnitSpec, AnyMark>; +export interface GenericLayerSpec> extends BaseSpec, LayoutSizeMixins { + /** + * Layer or single view specifications to be layered. + * + * __Note__: Specifications inside `layer` cannot use `row` and `column` channels as layering facet specifications is not allowed. + */ + layer: (GenericLayerSpec | U)[]; + /** + * Scale, axis, and legend resolutions for layers. + */ + resolve?: Resolve; +} +/** + * Layer Spec with encoding and projection + */ +export interface ExtendedLayerSpec extends GenericLayerSpec { + /** + * A shared key-value mapping between encoding channels and definition of fields in the underlying layers. + */ + encoding?: Encoding; + /** + * An object defining properties of the geographic projection shared by underlying layers. + */ + projection?: Projection; +} +export declare type NormalizedLayerSpec = GenericLayerSpec; +export interface GenericFacetSpec, L extends GenericLayerSpec> extends BaseSpec { + /** + * An object that describes mappings between `row` and `column` channels and their field definitions. + */ + facet: FacetMapping; + /** + * A specification of the view that gets faceted. + */ + spec: L | U; + /** + * Scale, axis, and legend resolutions for facets. + */ + resolve?: Resolve; +} +export declare type NormalizedFacetSpec = GenericFacetSpec; +export interface GenericRepeatSpec, L extends GenericLayerSpec> extends BaseSpec { + /** + * An object that describes what fields should be repeated into views that are laid out as a `row` or `column`. + */ + repeat: Repeat; + spec: GenericSpec; + /** + * Scale and legend resolutions for repeated charts. + */ + resolve?: Resolve; +} +export declare type NormalizedRepeatSpec = GenericRepeatSpec; +export interface GenericVConcatSpec, L extends GenericLayerSpec> extends BaseSpec { + /** + * A list of views that should be concatenated and put into a column. + */ + vconcat: (GenericSpec)[]; + /** + * Scale, axis, and legend resolutions for vertically concatenated charts. + */ + resolve?: Resolve; +} +export interface GenericHConcatSpec, L extends GenericLayerSpec> extends BaseSpec { + /** + * A list of views that should be concatenated and put into a row. + */ + hconcat: (GenericSpec)[]; + /** + * Scale, axis, and legend resolutions for horizontally concatenated charts. + */ + resolve?: Resolve; +} +export declare type NormalizedConcatSpec = GenericVConcatSpec | GenericHConcatSpec; +export declare type GenericSpec, L extends GenericLayerSpec> = U | L | GenericFacetSpec | GenericRepeatSpec | GenericVConcatSpec | GenericHConcatSpec; +export declare type NormalizedSpec = GenericSpec; +export declare type TopLevelFacetedUnitSpec = TopLevel & DataMixins; +export declare type TopLevelFacetSpec = TopLevel> & DataMixins; +export declare type TopLevelSpec = TopLevelFacetedUnitSpec | TopLevelFacetSpec | TopLevel | TopLevel> | TopLevel> | TopLevel>; +export declare function isFacetSpec(spec: BaseSpec): spec is GenericFacetSpec; +export declare function isUnitSpec(spec: BaseSpec): spec is FacetedCompositeUnitSpec | NormalizedUnitSpec; +export declare function isLayerSpec(spec: BaseSpec): spec is GenericLayerSpec; +export declare function isRepeatSpec(spec: BaseSpec): spec is GenericRepeatSpec; +export declare function isConcatSpec(spec: BaseSpec): spec is GenericVConcatSpec | GenericHConcatSpec; +export declare function isVConcatSpec(spec: BaseSpec): spec is GenericVConcatSpec; +export declare function isHConcatSpec(spec: BaseSpec): spec is GenericHConcatSpec; +/** + * Decompose extended unit specs into composition of pure unit specs. + */ +export declare function normalize(spec: TopLevelSpec | GenericSpec | FacetedCompositeUnitSpec, config: Config): NormalizedSpec; +export declare function fieldDefs(spec: GenericSpec): FieldDef[]; +export declare function isStacked(spec: TopLevel, config?: Config): boolean; diff --git a/build/src/spec.js b/build/src/spec.js new file mode 100644 index 0000000000..b8241041d3 --- /dev/null +++ b/build/src/spec.js @@ -0,0 +1,317 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var channel_1 = require("./channel"); +var compositeMark = tslib_1.__importStar(require("./compositemark")); +var encoding_1 = require("./encoding"); +var vlEncoding = tslib_1.__importStar(require("./encoding")); +var log = tslib_1.__importStar(require("./log")); +var mark_1 = require("./mark"); +var stack_1 = require("./stack"); +var util_1 = require("./util"); +/* Custom type guards */ +function isFacetSpec(spec) { + return spec['facet'] !== undefined; +} +exports.isFacetSpec = isFacetSpec; +function isUnitSpec(spec) { + return !!spec['mark']; +} +exports.isUnitSpec = isUnitSpec; +function isLayerSpec(spec) { + return spec['layer'] !== undefined; +} +exports.isLayerSpec = isLayerSpec; +function isRepeatSpec(spec) { + return spec['repeat'] !== undefined; +} +exports.isRepeatSpec = isRepeatSpec; +function isConcatSpec(spec) { + return isVConcatSpec(spec) || isHConcatSpec(spec); +} +exports.isConcatSpec = isConcatSpec; +function isVConcatSpec(spec) { + return spec['vconcat'] !== undefined; +} +exports.isVConcatSpec = isVConcatSpec; +function isHConcatSpec(spec) { + return spec['hconcat'] !== undefined; +} +exports.isHConcatSpec = isHConcatSpec; +/** + * Decompose extended unit specs into composition of pure unit specs. + */ +// TODO: consider moving this to another file. Maybe vl.spec.normalize or vl.normalize +function normalize(spec, config) { + if (isFacetSpec(spec)) { + return normalizeFacet(spec, config); + } + if (isLayerSpec(spec)) { + return normalizeLayer(spec, config); + } + if (isRepeatSpec(spec)) { + return normalizeRepeat(spec, config); + } + if (isVConcatSpec(spec)) { + return normalizeVConcat(spec, config); + } + if (isHConcatSpec(spec)) { + return normalizeHConcat(spec, config); + } + if (isUnitSpec(spec)) { + var hasRow = encoding_1.channelHasField(spec.encoding, channel_1.ROW); + var hasColumn = encoding_1.channelHasField(spec.encoding, channel_1.COLUMN); + if (hasRow || hasColumn) { + return normalizeFacetedUnit(spec, config); + } + return normalizeNonFacetUnit(spec, config); + } + throw new Error(log.message.INVALID_SPEC); +} +exports.normalize = normalize; +function normalizeFacet(spec, config) { + var subspec = spec.spec, rest = tslib_1.__rest(spec, ["spec"]); + return tslib_1.__assign({}, rest, { + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + spec: normalize(subspec, config) }); +} +function mergeEncoding(opt) { + var parentEncoding = opt.parentEncoding, encoding = opt.encoding; + if (parentEncoding && encoding) { + var overriden = util_1.keys(parentEncoding).reduce(function (o, key) { + if (encoding[key]) { + o.push(key); + } + return o; + }, []); + if (overriden.length > 0) { + log.warn(log.message.encodingOverridden(overriden)); + } + } + var merged = tslib_1.__assign({}, (parentEncoding || {}), (encoding || {})); + return util_1.keys(merged).length > 0 ? merged : undefined; +} +function mergeProjection(opt) { + var parentProjection = opt.parentProjection, projection = opt.projection; + if (parentProjection && projection) { + log.warn(log.message.projectionOverridden({ parentProjection: parentProjection, projection: projection })); + } + return projection || parentProjection; +} +function normalizeLayer(spec, config, parentEncoding, parentProjection) { + var layer = spec.layer, encoding = spec.encoding, projection = spec.projection, rest = tslib_1.__rest(spec, ["layer", "encoding", "projection"]); + var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding }); + var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection }); + return tslib_1.__assign({}, rest, { layer: layer.map(function (subspec) { + if (isLayerSpec(subspec)) { + return normalizeLayer(subspec, config, mergedEncoding, mergedProjection); + } + return normalizeNonFacetUnit(subspec, config, mergedEncoding, mergedProjection); + }) }); +} +function normalizeRepeat(spec, config) { + var subspec = spec.spec, rest = tslib_1.__rest(spec, ["spec"]); + return tslib_1.__assign({}, rest, { spec: normalize(subspec, config) }); +} +function normalizeVConcat(spec, config) { + var vconcat = spec.vconcat, rest = tslib_1.__rest(spec, ["vconcat"]); + return tslib_1.__assign({}, rest, { vconcat: vconcat.map(function (subspec) { return normalize(subspec, config); }) }); +} +function normalizeHConcat(spec, config) { + var hconcat = spec.hconcat, rest = tslib_1.__rest(spec, ["hconcat"]); + return tslib_1.__assign({}, rest, { hconcat: hconcat.map(function (subspec) { return normalize(subspec, config); }) }); +} +function normalizeFacetedUnit(spec, config) { + // New encoding in the inside spec should not contain row / column + // as row/column should be moved to facet + var _a = spec.encoding, row = _a.row, column = _a.column, encoding = tslib_1.__rest(_a, ["row", "column"]); + // Mark and encoding should be moved into the inner spec + var mark = spec.mark, width = spec.width, projection = spec.projection, height = spec.height, selection = spec.selection, _ = spec.encoding, outerSpec = tslib_1.__rest(spec, ["mark", "width", "projection", "height", "selection", "encoding"]); + return tslib_1.__assign({}, outerSpec, { facet: tslib_1.__assign({}, (row ? { row: row } : {}), (column ? { column: column } : {})), spec: normalizeNonFacetUnit(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: mark }, (width ? { width: width } : {}), (height ? { height: height } : {}), { encoding: encoding }, (selection ? { selection: selection } : {})), config) }); +} +function isNonFacetUnitSpecWithPrimitiveMark(spec) { + return mark_1.isPrimitiveMark(spec.mark); +} +function getPointOverlay(markDef, markConfig, encoding) { + if (markDef.point === 'transparent') { + return { opacity: 0 }; + } + else if (markDef.point) { // truthy : true or object + return vega_util_1.isObject(markDef.point) ? markDef.point : {}; + } + else if (markDef.point !== undefined) { // false or null + return null; + } + else { // undefined (not disabled) + if (markConfig.point || encoding.shape) { + // enable point overlay if config[mark].point is truthy or if encoding.shape is provided + return vega_util_1.isObject(markConfig.point) ? markConfig.point : {}; + } + // markDef.point is defined as falsy + return null; + } +} +function getLineOverlay(markDef, markConfig) { + if (markDef.line) { // true or object + return markDef.line === true ? {} : markDef.line; + } + else if (markDef.line !== undefined) { // false or null + return null; + } + else { // undefined (not disabled) + if (markConfig.line) { + // enable line overlay if config[mark].line is truthy + return markConfig.line === true ? {} : markConfig.line; + } + // markDef.point is defined as falsy + return null; + } +} +function normalizeNonFacetUnit(spec, config, parentEncoding, parentProjection) { + var encoding = spec.encoding, projection = spec.projection; + var mark = mark_1.isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + // merge parent encoding / projection first + if (parentEncoding || parentProjection) { + var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection }); + var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding }); + return normalizeNonFacetUnit(tslib_1.__assign({}, spec, (mergedProjection ? { projection: mergedProjection } : {}), (mergedEncoding ? { encoding: mergedEncoding } : {})), config); + } + if (isNonFacetUnitSpecWithPrimitiveMark(spec)) { + // TODO: thoroughly test + if (encoding_1.isRanged(encoding)) { + return normalizeRangedUnit(spec); + } + if (mark === 'line' && (encoding.x2 || encoding.y2)) { + log.warn(log.message.lineWithRange(!!encoding.x2, !!encoding.y2)); + return normalizeNonFacetUnit(tslib_1.__assign({ mark: 'rule' }, spec), config, parentEncoding, parentProjection); + } + if (mark_1.isPathMark(mark)) { + return normalizePathOverlay(spec, config); + } + return spec; // Nothing to normalize + } + else { + return compositeMark.normalize(spec, config); + } +} +function normalizeRangedUnit(spec) { + var hasX = encoding_1.channelHasField(spec.encoding, channel_1.X); + var hasY = encoding_1.channelHasField(spec.encoding, channel_1.Y); + var hasX2 = encoding_1.channelHasField(spec.encoding, channel_1.X2); + var hasY2 = encoding_1.channelHasField(spec.encoding, channel_1.Y2); + if ((hasX2 && !hasX) || (hasY2 && !hasY)) { + var normalizedSpec = util_1.duplicate(spec); + if (hasX2 && !hasX) { + normalizedSpec.encoding.x = normalizedSpec.encoding.x2; + delete normalizedSpec.encoding.x2; + } + if (hasY2 && !hasY) { + normalizedSpec.encoding.y = normalizedSpec.encoding.y2; + delete normalizedSpec.encoding.y2; + } + return normalizedSpec; + } + return spec; +} +function dropLineAndPoint(markDef) { + var _point = markDef.point, _line = markDef.line, mark = tslib_1.__rest(markDef, ["point", "line"]); + return util_1.keys(mark).length > 1 ? mark : mark.type; +} +function normalizePathOverlay(spec, config) { + var _a; + if (config === void 0) { config = {}; } + // _ is used to denote a dropped property of the unit spec + // which should not be carried over to the layer spec + var selection = spec.selection, projection = spec.projection, encoding = spec.encoding, mark = spec.mark, outerSpec = tslib_1.__rest(spec, ["selection", "projection", "encoding", "mark"]); + var markDef = mark_1.isMarkDef(mark) ? mark : { type: mark }; + var pointOverlay = getPointOverlay(markDef, config[markDef.type], encoding); + var lineOverlay = markDef.type === 'area' && getLineOverlay(markDef, config[markDef.type]); + if (!pointOverlay && !lineOverlay) { + return tslib_1.__assign({}, spec, { + // Do not include point / line overlay in the normalize spec + mark: dropLineAndPoint(markDef) }); + } + var layer = [tslib_1.__assign({}, (selection ? { selection: selection } : {}), { + // Do not include point / line overlay in the normalize spec + mark: dropLineAndPoint(tslib_1.__assign({}, markDef, (markDef.type === 'area' ? { opacity: 0.7 } : {}))), + // drop shape from encoding as this might be used to trigger point overlay + encoding: util_1.omit(encoding, ['shape']) })]; + // FIXME: disable tooltip for the line layer if tooltip is not group-by field. + // FIXME: determine rules for applying selections. + // Need to copy stack config to overlayed layer + var stackProps = stack_1.stack(markDef, encoding, config ? config.stack : undefined); + var overlayEncoding = encoding; + if (stackProps) { + var stackFieldChannel = stackProps.fieldChannel, offset = stackProps.offset; + overlayEncoding = tslib_1.__assign({}, encoding, (_a = {}, _a[stackFieldChannel] = tslib_1.__assign({}, encoding[stackFieldChannel], (offset ? { stack: offset } : {})), _a)); + } + if (lineOverlay) { + var interpolate = markDef.interpolate; + layer.push(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: tslib_1.__assign({ type: 'line' }, lineOverlay, (interpolate ? { interpolate: interpolate } : {})), encoding: overlayEncoding })); + } + if (pointOverlay) { + layer.push(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: tslib_1.__assign({ type: 'point', opacity: 1, filled: true }, pointOverlay), encoding: overlayEncoding })); + } + return tslib_1.__assign({}, outerSpec, { layer: layer }); +} +// TODO: add vl.spec.validate & move stuff from vl.validate to here +/* Accumulate non-duplicate fieldDefs in a dictionary */ +function accumulate(dict, defs) { + defs.forEach(function (fieldDef) { + // Consider only pure fieldDef properties (ignoring scale, axis, legend) + var pureFieldDef = ['field', 'type', 'value', 'timeUnit', 'bin', 'aggregate'].reduce(function (f, key) { + if (fieldDef[key] !== undefined) { + f[key] = fieldDef[key]; + } + return f; + }, {}); + var key = util_1.hash(pureFieldDef); + dict[key] = dict[key] || fieldDef; + }); + return dict; +} +/* Recursively get fieldDefs from a spec, returns a dictionary of fieldDefs */ +function fieldDefIndex(spec, dict) { + if (dict === void 0) { dict = {}; } + // FIXME(https://github.com/vega/vega-lite/issues/2207): Support fieldDefIndex for repeat + if (isLayerSpec(spec)) { + spec.layer.forEach(function (layer) { + if (isUnitSpec(layer)) { + accumulate(dict, vlEncoding.fieldDefs(layer.encoding)); + } + else { + fieldDefIndex(layer, dict); + } + }); + } + else if (isFacetSpec(spec)) { + accumulate(dict, vlEncoding.fieldDefs(spec.facet)); + fieldDefIndex(spec.spec, dict); + } + else if (isRepeatSpec(spec)) { + fieldDefIndex(spec.spec, dict); + } + else if (isConcatSpec(spec)) { + var childSpec = isVConcatSpec(spec) ? spec.vconcat : spec.hconcat; + childSpec.forEach(function (child) { return fieldDefIndex(child, dict); }); + } + else { // Unit Spec + accumulate(dict, vlEncoding.fieldDefs(spec.encoding)); + } + return dict; +} +/* Returns all non-duplicate fieldDefs in a spec in a flat array */ +function fieldDefs(spec) { + return util_1.vals(fieldDefIndex(spec)); +} +exports.fieldDefs = fieldDefs; +function isStacked(spec, config) { + config = config || spec.config; + if (mark_1.isPrimitiveMark(spec.mark)) { + return stack_1.stack(spec.mark, spec.encoding, config ? config.stack : undefined) !== null; + } + return false; +} +exports.isStacked = isStacked; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFtQztBQUNuQyxxQ0FBb0Q7QUFDcEQscUVBQWlEO0FBR2pELHVDQUFrRjtBQUNsRiw2REFBeUM7QUFHekMsaURBQTZCO0FBQzdCLCtCQUEwSDtBQUsxSCxpQ0FBOEI7QUFJOUIsK0JBQStEO0FBbVAvRCx3QkFBd0I7QUFHeEIscUJBQTRCLElBQWM7SUFDeEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3JDLENBQUM7QUFGRCxrQ0FFQztBQUVELG9CQUEyQixJQUFjO0lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBRkQsZ0NBRUM7QUFFRCxxQkFBNEIsSUFBYztJQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDckMsQ0FBQztBQUZELGtDQUVDO0FBRUQsc0JBQTZCLElBQWM7SUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3RDLENBQUM7QUFGRCxvQ0FFQztBQUVELHNCQUE2QixJQUFjO0lBR3pDLE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBSkQsb0NBSUM7QUFFRCx1QkFBOEIsSUFBYztJQUMxQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDdkMsQ0FBQztBQUZELHNDQUVDO0FBRUQsdUJBQThCLElBQWM7SUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3ZDLENBQUM7QUFGRCxzQ0FFQztBQUVEOztHQUVHO0FBQ0gsdUZBQXVGO0FBQ3ZGLG1CQUEwQixJQUFpRyxFQUFFLE1BQWM7SUFD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bEI7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFSRCw4QkFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNPYmplY3R9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NPTFVNTiwgUk9XLCBYLCBYMiwgWSwgWTJ9IGZyb20gJy4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBjb21wb3NpdGVNYXJrIGZyb20gJy4vY29tcG9zaXRlbWFyayc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtEYXRhfSBmcm9tICcuL2RhdGEnO1xuaW1wb3J0IHtjaGFubmVsSGFzRmllbGQsIEVuY29kaW5nLCBFbmNvZGluZ1dpdGhGYWNldCwgaXNSYW5nZWR9IGZyb20gJy4vZW5jb2RpbmcnO1xuaW1wb3J0ICogYXMgdmxFbmNvZGluZyBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCB7RmFjZXRNYXBwaW5nfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7RmllbGQsIEZpZWxkRGVmLCBSZXBlYXRSZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7QW55TWFyaywgQXJlYUNvbmZpZywgaXNNYXJrRGVmLCBpc1BhdGhNYXJrLCBpc1ByaW1pdGl2ZU1hcmssIExpbmVDb25maWcsIE1hcmssIE1hcmtDb25maWcsIE1hcmtEZWZ9IGZyb20gJy4vbWFyayc7XG5pbXBvcnQge1Byb2plY3Rpb259IGZyb20gJy4vcHJvamVjdGlvbic7XG5pbXBvcnQge1JlcGVhdH0gZnJvbSAnLi9yZXBlYXQnO1xuaW1wb3J0IHtSZXNvbHZlfSBmcm9tICcuL3Jlc29sdmUnO1xuaW1wb3J0IHtTZWxlY3Rpb25EZWZ9IGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7c3RhY2t9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtUaXRsZVBhcmFtc30gZnJvbSAnLi90aXRsZSc7XG5pbXBvcnQge1RvcExldmVsUHJvcGVydGllc30gZnJvbSAnLi90b3BsZXZlbHByb3BzJztcbmltcG9ydCB7VHJhbnNmb3JtfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5pbXBvcnQge0RpY3QsIGR1cGxpY2F0ZSwgaGFzaCwga2V5cywgb21pdCwgdmFsc30gZnJvbSAnLi91dGlsJztcblxuXG5leHBvcnQgdHlwZSBUb3BMZXZlbDxTIGV4dGVuZHMgQmFzZVNwZWM+ID0gUyAmIFRvcExldmVsUHJvcGVydGllcyAmIHtcbiAgLyoqXG4gICAqIFVSTCB0byBbSlNPTiBzY2hlbWFdKGh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvKSBmb3IgYSBWZWdhLUxpdGUgc3BlY2lmaWNhdGlvbi4gVW5sZXNzIHlvdSBoYXZlIGEgcmVhc29uIHRvIGNoYW5nZSB0aGlzLCB1c2UgYGh0dHBzOi8vdmVnYS5naXRodWIuaW8vc2NoZW1hL3ZlZ2EtbGl0ZS92Mi5qc29uYC4gU2V0dGluZyB0aGUgYCRzY2hlbWFgIHByb3BlcnR5IGFsbG93cyBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgYXV0b2NvbXBsZXRlIGluIGVkaXRvcnMgdGhhdCBzdXBwb3J0IEpTT04gc2NoZW1hLlxuICAgKiBAZm9ybWF0IHVyaVxuICAgKi9cbiAgJHNjaGVtYT86IHN0cmluZztcblxuICAvKipcbiAgICogVmVnYS1MaXRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiAgVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBkZWZpbmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgYSBzcGVjaWZpY2F0aW9uLlxuICAgKi9cbiAgY29uZmlnPzogQ29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgQmFzZVNwZWMgPSBQYXJ0aWFsPERhdGFNaXhpbnM+ICYge1xuICAvKipcbiAgICogVGl0bGUgZm9yIHRoZSBwbG90LlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmcgfCBUaXRsZVBhcmFtcztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdmlzdWFsaXphdGlvbiBmb3IgbGF0ZXIgcmVmZXJlbmNlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhpcyBtYXJrIGZvciBjb21tZW50aW5nIHB1cnBvc2UuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGRhdGEgc291cmNlXG4gICAqL1xuICBkYXRhPzogRGF0YTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyBmaWx0ZXIgYW5kIG5ldyBmaWVsZCBjYWxjdWxhdGlvbi5cbiAgICovXG4gIHRyYW5zZm9ybT86IFRyYW5zZm9ybVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YU1peGlucyA9IHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBkYXRhIHNvdXJjZVxuICAgKi9cbiAgZGF0YTogRGF0YTtcbn07XG5cblxuLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI1MDMpOiBNYWtlIHRoaXMgZ2VuZXJpYyBzbyB3ZSBjYW4gc3VwcG9ydCBzb21lIGZvcm0gb2YgdG9wLWRvd24gc2l6aW5nLlxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRTaXplTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiBhIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBUaGlzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuICAgKlxuICAgKiAtIElmIGEgdmlldydzIFtgYXV0b3NpemVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCNhdXRvc2l6ZSkgdHlwZSBpcyBgXCJmaXRcImAgb3IgaXRzIHgtY2hhbm5lbCBoYXMgYSBbY29udGludW91cyBzY2FsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0aGUgd2lkdGggd2lsbCBiZSB0aGUgdmFsdWUgb2YgW2Bjb25maWcudmlldy53aWR0aGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gRm9yIHgtYXhpcyB3aXRoIGEgYmFuZCBvciBwb2ludCBzY2FsZTogaWYgW2ByYW5nZVN0ZXBgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkgaXMgYSBudW1lcmljIHZhbHVlIG9yIHVuc3BlY2lmaWVkLCB0aGUgd2lkdGggaXMgW2RldGVybWluZWQgYnkgdGhlIHJhbmdlIHN0ZXAsIHBhZGRpbmdzLCBhbmQgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBmaWVsZCBtYXBwZWQgdG8geC1jaGFubmVsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkuICAgT3RoZXJ3aXNlLCBpZiB0aGUgYHJhbmdlU3RlcGAgaXMgYG51bGxgLCB0aGUgd2lkdGggd2lsbCBiZSB0aGUgdmFsdWUgb2YgW2Bjb25maWcudmlldy53aWR0aGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gSWYgbm8gZmllbGQgaXMgbWFwcGVkIHRvIGB4YCBjaGFubmVsLCB0aGUgYHdpZHRoYCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBbYGNvbmZpZy5zY2FsZS50ZXh0WFJhbmdlU3RlcGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sI2RlZmF1bHQtd2lkdGgtYW5kLWhlaWdodCkgZm9yIGB0ZXh0YCBtYXJrIGFuZCB0aGUgdmFsdWUgb2YgYHJhbmdlU3RlcGAgZm9yIG90aGVyIG1hcmtzLlxuICAgKlxuICAgKiBfX05vdGU6X18gRm9yIHBsb3RzIHdpdGggW2Byb3dgIGFuZCBgY29sdW1uYCBjaGFubmVsc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9lbmNvZGluZy5odG1sI2ZhY2V0KSwgdGhpcyByZXByZXNlbnRzIHRoZSB3aWR0aCBvZiBhIHNpbmdsZSB2aWV3LlxuICAgKlxuICAgKiBfX1NlZSBhbHNvOl9fIFRoZSBkb2N1bWVudGF0aW9uIGZvciBbd2lkdGggYW5kIGhlaWdodF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zaXplLmh0bWwpIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMuXG4gICAqL1xuICB3aWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiBhIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfX1xuICAgKiAtIElmIGEgdmlldydzIFtgYXV0b3NpemVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCNhdXRvc2l6ZSkgdHlwZSBpcyBgXCJmaXRcImAgb3IgaXRzIHktY2hhbm5lbCBoYXMgYSBbY29udGludW91cyBzY2FsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0aGUgaGVpZ2h0IHdpbGwgYmUgdGhlIHZhbHVlIG9mIFtgY29uZmlnLnZpZXcuaGVpZ2h0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwjY29uZmlnKS5cbiAgICogLSBGb3IgeS1heGlzIHdpdGggYSBiYW5kIG9yIHBvaW50IHNjYWxlOiBpZiBbYHJhbmdlU3RlcGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBpcyBhIG51bWVyaWMgdmFsdWUgb3IgdW5zcGVjaWZpZWQsIHRoZSBoZWlnaHQgaXMgW2RldGVybWluZWQgYnkgdGhlIHJhbmdlIHN0ZXAsIHBhZGRpbmdzLCBhbmQgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBmaWVsZCBtYXBwZWQgdG8geS1jaGFubmVsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkuIE90aGVyd2lzZSwgaWYgdGhlIGByYW5nZVN0ZXBgIGlzIGBudWxsYCwgdGhlIGhlaWdodCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBbYGNvbmZpZy52aWV3LmhlaWdodGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gSWYgbm8gZmllbGQgaXMgbWFwcGVkIHRvIGB5YCBjaGFubmVsLCB0aGUgYGhlaWdodGAgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHJhbmdlU3RlcGAuXG4gICAqXG4gICAqIF9fTm90ZV9fOiBGb3IgcGxvdHMgd2l0aCBbYHJvd2AgYW5kIGBjb2x1bW5gIGNoYW5uZWxzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2VuY29kaW5nLmh0bWwjZmFjZXQpLCB0aGlzIHJlcHJlc2VudHMgdGhlIGhlaWdodCBvZiBhIHNpbmdsZSB2aWV3LlxuICAgKlxuICAgKiBfX1NlZSBhbHNvOl9fIFRoZSBkb2N1bWVudGF0aW9uIGZvciBbd2lkdGggYW5kIGhlaWdodF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zaXplLmh0bWwpIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMuXG4gICAqL1xuICBoZWlnaHQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1VuaXRTcGVjPEUgZXh0ZW5kcyBFbmNvZGluZzxhbnk+LCBNPiBleHRlbmRzIEJhc2VTcGVjLCBMYXlvdXRTaXplTWl4aW5zIHtcblxuICAvKipcbiAgICogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWFyayB0eXBlIChvbmUgb2YgYFwiYmFyXCJgLCBgXCJjaXJjbGVcImAsIGBcInNxdWFyZVwiYCwgYFwidGlja1wiYCwgYFwibGluZVwiYCxcbiAgICogYFwiYXJlYVwiYCwgYFwicG9pbnRcImAsIGBcInJ1bGVcImAsIGBcImdlb3NoYXBlXCJgLCBhbmQgYFwidGV4dFwiYCkgb3IgYSBbbWFyayBkZWZpbml0aW9uIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9tYXJrLmh0bWwjbWFyay1kZWYpLlxuICAgKi9cbiAgbWFyazogTTtcblxuICAvKipcbiAgICogQSBrZXktdmFsdWUgbWFwcGluZyBiZXR3ZWVuIGVuY29kaW5nIGNoYW5uZWxzIGFuZCBkZWZpbml0aW9uIG9mIGZpZWxkcy5cbiAgICovXG4gIGVuY29kaW5nPzogRTtcblxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiBnZW9ncmFwaGljIHByb2plY3Rpb24sIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byBgc2hhcGVgIHBhdGggZm9yIGBcImdlb3NoYXBlXCJgIG1hcmtzXG4gICAqIGFuZCB0byBgbGF0aXR1ZGVgIGFuZCBgXCJsb25naXR1ZGVcImAgY2hhbm5lbHMgZm9yIG90aGVyIG1hcmtzLlxuICAgKi9cbiAgcHJvamVjdGlvbj86IFByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIEEga2V5LXZhbHVlIG1hcHBpbmcgYmV0d2VlbiBzZWxlY3Rpb24gbmFtZXMgYW5kIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc2VsZWN0aW9uPzoge1tuYW1lOiBzdHJpbmddOiBTZWxlY3Rpb25EZWZ9O1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkVW5pdFNwZWMgPSBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPiwgTWFyayB8IE1hcmtEZWY+O1xuXG4vKipcbiAqIFVuaXQgc3BlYyB0aGF0IGNhbiBoYXZlIGEgY29tcG9zaXRlIG1hcmsuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvc2l0ZVVuaXRTcGVjID0gR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZyB8IFJlcGVhdFJlZj4sIEFueU1hcms+O1xuXG4vKipcbiAqIFVuaXQgc3BlYyB0aGF0IGNhbiBoYXZlIGEgY29tcG9zaXRlIG1hcmsgYW5kIHJvdyBvciBjb2x1bW4gY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCB0eXBlIEZhY2V0ZWRDb21wb3NpdGVVbml0U3BlYyA9IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZ1dpdGhGYWNldDxzdHJpbmcgfCBSZXBlYXRSZWY+LCBBbnlNYXJrPjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljTGF5ZXJTcGVjPFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+PiBleHRlbmRzIEJhc2VTcGVjLCBMYXlvdXRTaXplTWl4aW5zIHtcbiAgLyoqXG4gICAqIExheWVyIG9yIHNpbmdsZSB2aWV3IHNwZWNpZmljYXRpb25zIHRvIGJlIGxheWVyZWQuXG4gICAqXG4gICAqIF9fTm90ZV9fOiBTcGVjaWZpY2F0aW9ucyBpbnNpZGUgYGxheWVyYCBjYW5ub3QgdXNlIGByb3dgIGFuZCBgY29sdW1uYCBjaGFubmVscyBhcyBsYXllcmluZyBmYWNldCBzcGVjaWZpY2F0aW9ucyBpcyBub3QgYWxsb3dlZC5cbiAgICovXG4gIGxheWVyOiAoR2VuZXJpY0xheWVyU3BlYzxVPiB8IFUpW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciBsYXllcnMuXG4gICAqL1xuICByZXNvbHZlPzogUmVzb2x2ZTtcbn1cblxuLyoqXG4gKiBMYXllciBTcGVjIHdpdGggZW5jb2RpbmcgYW5kIHByb2plY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZExheWVyU3BlYyBleHRlbmRzIEdlbmVyaWNMYXllclNwZWM8Q29tcG9zaXRlVW5pdFNwZWM+IHtcbiAgLyoqXG4gICAqIEEgc2hhcmVkIGtleS12YWx1ZSBtYXBwaW5nIGJldHdlZW4gZW5jb2RpbmcgY2hhbm5lbHMgYW5kIGRlZmluaXRpb24gb2YgZmllbGRzIGluIHRoZSB1bmRlcmx5aW5nIGxheWVycy5cbiAgICovXG4gIGVuY29kaW5nPzogRW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPjtcblxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiB0aGUgZ2VvZ3JhcGhpYyBwcm9qZWN0aW9uIHNoYXJlZCBieSB1bmRlcmx5aW5nIGxheWVycy5cbiAgICovXG4gIHByb2plY3Rpb24/OiBQcm9qZWN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkTGF5ZXJTcGVjID0gR2VuZXJpY0xheWVyU3BlYzxOb3JtYWxpemVkVW5pdFNwZWM+O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY0ZhY2V0U3BlYzxcbiAgVSBleHRlbmRzIEdlbmVyaWNVbml0U3BlYzxhbnksIGFueT4sXG4gIEwgZXh0ZW5kcyBHZW5lcmljTGF5ZXJTcGVjPGFueT5cbiAgPiBleHRlbmRzIEJhc2VTcGVjIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBtYXBwaW5ncyBiZXR3ZWVuIGByb3dgIGFuZCBgY29sdW1uYCBjaGFubmVscyBhbmQgdGhlaXIgZmllbGQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBmYWNldDogRmFjZXRNYXBwaW5nPHN0cmluZyB8IFJlcGVhdFJlZj47XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdmlldyB0aGF0IGdldHMgZmFjZXRlZC5cbiAgICovXG4gIHNwZWM6IEwgfCBVO1xuICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBHZW5lcmljU3BlYzxVPiBvbmNlIHdlIHN1cHBvcnQgYWxsIGNhc2VzO1xuXG4gIC8qKlxuICAgKiBTY2FsZSwgYXhpcywgYW5kIGxlZ2VuZCByZXNvbHV0aW9ucyBmb3IgZmFjZXRzLlxuICAgKi9cbiAgcmVzb2x2ZT86IFJlc29sdmU7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRGYWNldFNwZWMgPSBHZW5lcmljRmFjZXRTcGVjPE5vcm1hbGl6ZWRVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlYz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1JlcGVhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHdoYXQgZmllbGRzIHNob3VsZCBiZSByZXBlYXRlZCBpbnRvIHZpZXdzIHRoYXQgYXJlIGxhaWQgb3V0IGFzIGEgYHJvd2Agb3IgYGNvbHVtbmAuXG4gICAqL1xuICByZXBlYXQ6IFJlcGVhdDtcblxuICBzcGVjOiBHZW5lcmljU3BlYzxVLCBMPjtcblxuICAvKipcbiAgICogU2NhbGUgYW5kIGxlZ2VuZCByZXNvbHV0aW9ucyBmb3IgcmVwZWF0ZWQgY2hhcnRzLlxuICAgKi9cbiAgcmVzb2x2ZT86IFJlc29sdmU7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRSZXBlYXRTcGVjID0gR2VuZXJpY1JlcGVhdFNwZWM8Tm9ybWFsaXplZFVuaXRTcGVjLCBOb3JtYWxpemVkTGF5ZXJTcGVjPjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljVkNvbmNhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZpZXdzIHRoYXQgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBhbmQgcHV0IGludG8gYSBjb2x1bW4uXG4gICAqL1xuICB2Y29uY2F0OiAoR2VuZXJpY1NwZWM8VSwgTD4pW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciB2ZXJ0aWNhbGx5IGNvbmNhdGVuYXRlZCBjaGFydHMuXG4gICAqL1xuICByZXNvbHZlPzogUmVzb2x2ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljSENvbmNhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZpZXdzIHRoYXQgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBhbmQgcHV0IGludG8gYSByb3cuXG4gICAqL1xuICBoY29uY2F0OiAoR2VuZXJpY1NwZWM8VSwgTD4pW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciBob3Jpem9udGFsbHkgY29uY2F0ZW5hdGVkIGNoYXJ0cy5cbiAgICovXG4gIHJlc29sdmU/OiBSZXNvbHZlO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQ29uY2F0U3BlYyA9XG4gIEdlbmVyaWNWQ29uY2F0U3BlYzxOb3JtYWxpemVkVW5pdFNwZWMsIE5vcm1hbGl6ZWRMYXllclNwZWM+IHwgR2VuZXJpY0hDb25jYXRTcGVjPE5vcm1hbGl6ZWRVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlYz47XG5cbmV4cG9ydCB0eXBlIEdlbmVyaWNTcGVjPFxuICBVIGV4dGVuZHMgR2VuZXJpY1VuaXRTcGVjPGFueSwgYW55PixcbiAgTCBleHRlbmRzIEdlbmVyaWNMYXllclNwZWM8YW55PlxuPiA9IFUgfCBMIHwgR2VuZXJpY0ZhY2V0U3BlYzxVLCBMPiB8IEdlbmVyaWNSZXBlYXRTcGVjPFUsIEw+IHxcbiAgR2VuZXJpY1ZDb25jYXRTcGVjPFUsIEw+IHxHZW5lcmljSENvbmNhdFNwZWM8VSwgTD47XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTcGVjID0gR2VuZXJpY1NwZWM8Tm9ybWFsaXplZFVuaXRTcGVjLCBOb3JtYWxpemVkTGF5ZXJTcGVjPjtcblxuZXhwb3J0IHR5cGUgVG9wTGV2ZWxGYWNldGVkVW5pdFNwZWMgPSBUb3BMZXZlbDxGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWM+ICYgRGF0YU1peGlucztcbmV4cG9ydCB0eXBlIFRvcExldmVsRmFjZXRTcGVjID0gVG9wTGV2ZWw8R2VuZXJpY0ZhY2V0U3BlYzxDb21wb3NpdGVVbml0U3BlYywgRXh0ZW5kZWRMYXllclNwZWM+PiAmIERhdGFNaXhpbnM7XG5cbmV4cG9ydCB0eXBlIFRvcExldmVsU3BlYyA9IFRvcExldmVsRmFjZXRlZFVuaXRTcGVjIHwgVG9wTGV2ZWxGYWNldFNwZWMgfCBUb3BMZXZlbDxFeHRlbmRlZExheWVyU3BlYz4gfFxuVG9wTGV2ZWw8R2VuZXJpY1JlcGVhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj4gfCBUb3BMZXZlbDxHZW5lcmljVkNvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj4gfCBUb3BMZXZlbDxHZW5lcmljSENvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj47XG5cbi8qIEN1c3RvbSB0eXBlIGd1YXJkcyAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhY2V0U3BlYyhzcGVjOiBCYXNlU3BlYyk6IHNwZWMgaXMgR2VuZXJpY0ZhY2V0U3BlYzxhbnksIGFueT4ge1xuICByZXR1cm4gc3BlY1snZmFjZXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbml0U3BlYyhzcGVjOiBCYXNlU3BlYyk6IHNwZWMgaXMgRmFjZXRlZENvbXBvc2l0ZVVuaXRTcGVjIHwgTm9ybWFsaXplZFVuaXRTcGVjIHtcbiAgcmV0dXJuICEhc3BlY1snbWFyayddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNMYXllclNwZWM8YW55PiB7XG4gIHJldHVybiBzcGVjWydsYXllciddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcGVhdFNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNSZXBlYXRTcGVjPGFueSwgYW55PiB7XG4gIHJldHVybiBzcGVjWydyZXBlYXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jYXRTcGVjKHNwZWM6IEJhc2VTcGVjKTpcbiAgc3BlYyBpcyBHZW5lcmljVkNvbmNhdFNwZWM8YW55LCBhbnk+IHxcbiAgICBHZW5lcmljSENvbmNhdFNwZWM8YW55LCBhbnk+IHtcbiAgcmV0dXJuIGlzVkNvbmNhdFNwZWMoc3BlYykgfHwgaXNIQ29uY2F0U3BlYyhzcGVjKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVkNvbmNhdFNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNWQ29uY2F0U3BlYzxhbnksIGFueT4ge1xuICByZXR1cm4gc3BlY1sndmNvbmNhdCddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hDb25jYXRTcGVjKHNwZWM6IEJhc2VTcGVjKTogc3BlYyBpcyBHZW5lcmljSENvbmNhdFNwZWM8YW55LCBhbnk+IHtcbiAgcmV0dXJuIHNwZWNbJ2hjb25jYXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlY29tcG9zZSBleHRlbmRlZCB1bml0IHNwZWNzIGludG8gY29tcG9zaXRpb24gb2YgcHVyZSB1bml0IHNwZWNzLlxuICovXG4vLyBUT0RPOiBjb25zaWRlciBtb3ZpbmcgdGhpcyB0byBhbm90aGVyIGZpbGUuICBNYXliZSB2bC5zcGVjLm5vcm1hbGl6ZSBvciB2bC5ub3JtYWxpemVcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoc3BlYzogVG9wTGV2ZWxTcGVjIHwgR2VuZXJpY1NwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiB8IEZhY2V0ZWRDb21wb3NpdGVVbml0U3BlYywgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkU3BlYyB7XG4gIGlmIChpc0ZhY2V0U3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBub3JtYWxpemVGYWNldChzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc0xheWVyU3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBub3JtYWxpemVMYXllcihzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc1JlcGVhdFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVwZWF0KHNwZWMsIGNvbmZpZyk7XG4gIH1cbiAgaWYgKGlzVkNvbmNhdFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplVkNvbmNhdChzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc0hDb25jYXRTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUhDb25jYXQoc3BlYywgY29uZmlnKTtcbiAgfVxuICBpZiAoaXNVbml0U3BlYyhzcGVjKSkge1xuICAgIGNvbnN0IGhhc1JvdyA9IGNoYW5uZWxIYXNGaWVsZChzcGVjLmVuY29kaW5nLCBST1cpO1xuICAgIGNvbnN0IGhhc0NvbHVtbiA9IGNoYW5uZWxIYXNGaWVsZChzcGVjLmVuY29kaW5nLCBDT0xVTU4pO1xuXG4gICAgaWYgKGhhc1JvdyB8fCBoYXNDb2x1bW4pIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVGYWNldGVkVW5pdChzcGVjLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplTm9uRmFjZXRVbml0KHNwZWMsIGNvbmZpZyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLklOVkFMSURfU1BFQyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZhY2V0KHNwZWM6IEdlbmVyaWNGYWNldFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiwgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkRmFjZXRTcGVjIHtcbiAgY29uc3Qge3NwZWM6IHN1YnNwZWMsIC4uLnJlc3R9ID0gc3BlYztcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN0LFxuICAgIC8vIFRPRE86IHJlbW92ZSBcImFueVwiIG9uY2Ugd2Ugc3VwcG9ydCBhbGwgZmFjZXQgbGlzdGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjc2MFxuICAgIHNwZWM6IG5vcm1hbGl6ZShzdWJzcGVjLCBjb25maWcpIGFzIGFueVxuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUVuY29kaW5nKG9wdDoge3BhcmVudEVuY29kaW5nOiBFbmNvZGluZzxhbnk+LCBlbmNvZGluZzogRW5jb2Rpbmc8YW55Pn0pOiBFbmNvZGluZzxhbnk+IHtcbiAgY29uc3Qge3BhcmVudEVuY29kaW5nLCBlbmNvZGluZ30gPSBvcHQ7XG4gIGlmIChwYXJlbnRFbmNvZGluZyAmJiBlbmNvZGluZykge1xuICAgIGNvbnN0IG92ZXJyaWRlbiA9IGtleXMocGFyZW50RW5jb2RpbmcpLnJlZHVjZSgobywga2V5KSA9PiB7XG4gICAgICBpZiAoZW5jb2Rpbmdba2V5XSkge1xuICAgICAgICBvLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvO1xuICAgIH0sIFtdKTtcblxuICAgIGlmIChvdmVycmlkZW4ubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW5jb2RpbmdPdmVycmlkZGVuKG92ZXJyaWRlbikpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICAuLi4ocGFyZW50RW5jb2RpbmcgfHwge30pLFxuICAgIC4uLihlbmNvZGluZyB8fCB7fSlcbiAgfTtcbiAgcmV0dXJuIGtleXMobWVyZ2VkKS5sZW5ndGggPiAwID8gbWVyZ2VkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb2plY3Rpb24ob3B0OiB7cGFyZW50UHJvamVjdGlvbjogUHJvamVjdGlvbiwgcHJvamVjdGlvbjogUHJvamVjdGlvbn0pIHtcbiAgY29uc3Qge3BhcmVudFByb2plY3Rpb24sIHByb2plY3Rpb259ID0gb3B0O1xuICBpZiAocGFyZW50UHJvamVjdGlvbiAmJiBwcm9qZWN0aW9uKSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UucHJvamVjdGlvbk92ZXJyaWRkZW4oe3BhcmVudFByb2plY3Rpb24sIHByb2plY3Rpb259KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Rpb24gfHwgcGFyZW50UHJvamVjdGlvbjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5ZXIoXG4gIHNwZWM6IEV4dGVuZGVkTGF5ZXJTcGVjLFxuICBjb25maWc6IENvbmZpZyxcbiAgcGFyZW50RW5jb2Rpbmc/OiBFbmNvZGluZzxzdHJpbmcgfCBSZXBlYXRSZWY+LFxuICBwYXJlbnRQcm9qZWN0aW9uPzogUHJvamVjdGlvblxuKTogTm9ybWFsaXplZExheWVyU3BlYyB7XG4gIGNvbnN0IHtsYXllciwgZW5jb2RpbmcsIHByb2plY3Rpb24sIC4uLnJlc3R9ID0gc3BlYztcbiAgY29uc3QgbWVyZ2VkRW5jb2RpbmcgPSBtZXJnZUVuY29kaW5nKHtwYXJlbnRFbmNvZGluZywgZW5jb2Rpbmd9KTtcbiAgY29uc3QgbWVyZ2VkUHJvamVjdGlvbiA9IG1lcmdlUHJvamVjdGlvbih7cGFyZW50UHJvamVjdGlvbiwgcHJvamVjdGlvbn0pO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgbGF5ZXI6IGxheWVyLm1hcCgoc3Vic3BlYykgPT4ge1xuICAgICAgaWYgKGlzTGF5ZXJTcGVjKHN1YnNwZWMpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVMYXllcihzdWJzcGVjLCBjb25maWcsIG1lcmdlZEVuY29kaW5nLCBtZXJnZWRQcm9qZWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub3JtYWxpemVOb25GYWNldFVuaXQoc3Vic3BlYywgY29uZmlnLCBtZXJnZWRFbmNvZGluZywgbWVyZ2VkUHJvamVjdGlvbik7XG4gICAgfSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwZWF0KHNwZWM6IEdlbmVyaWNSZXBlYXRTcGVjPENvbXBvc2l0ZVVuaXRTcGVjLCBFeHRlbmRlZExheWVyU3BlYz4sIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZFJlcGVhdFNwZWMge1xuICBjb25zdCB7c3BlYzogc3Vic3BlYywgLi4ucmVzdH0gPSBzcGVjO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgc3BlYzogbm9ybWFsaXplKHN1YnNwZWMsIGNvbmZpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVkNvbmNhdChzcGVjOiBHZW5lcmljVkNvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiwgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkQ29uY2F0U3BlYyB7XG4gIGNvbnN0IHt2Y29uY2F0OiB2Y29uY2F0LCAuLi5yZXN0fSA9IHNwZWM7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdCxcbiAgICB2Y29uY2F0OiB2Y29uY2F0Lm1hcCgoc3Vic3BlYykgPT4gbm9ybWFsaXplKHN1YnNwZWMsIGNvbmZpZykpXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhDb25jYXQoc3BlYzogR2VuZXJpY0hDb25jYXRTcGVjPENvbXBvc2l0ZVVuaXRTcGVjLCBFeHRlbmRlZExheWVyU3BlYz4sIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZENvbmNhdFNwZWMge1xuICBjb25zdCB7aGNvbmNhdDogaGNvbmNhdCwgLi4ucmVzdH0gPSBzcGVjO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgaGNvbmNhdDogaGNvbmNhdC5tYXAoKHN1YnNwZWMpID0+IG5vcm1hbGl6ZShzdWJzcGVjLCBjb25maWcpKVxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGYWNldGVkVW5pdChzcGVjOiBGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWMsIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZEZhY2V0U3BlYyB7XG4gIC8vIE5ldyBlbmNvZGluZyBpbiB0aGUgaW5zaWRlIHNwZWMgc2hvdWxkIG5vdCBjb250YWluIHJvdyAvIGNvbHVtblxuICAvLyBhcyByb3cvY29sdW1uIHNob3VsZCBiZSBtb3ZlZCB0byBmYWNldFxuICBjb25zdCB7cm93OiByb3csIGNvbHVtbjogY29sdW1uLCAuLi5lbmNvZGluZ30gPSBzcGVjLmVuY29kaW5nO1xuXG4gIC8vIE1hcmsgYW5kIGVuY29kaW5nIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBpbm5lciBzcGVjXG4gIGNvbnN0IHttYXJrLCB3aWR0aCwgcHJvamVjdGlvbiwgaGVpZ2h0LCBzZWxlY3Rpb24sIGVuY29kaW5nOiBfLCAuLi5vdXRlclNwZWN9ID0gc3BlYztcblxuICByZXR1cm4ge1xuICAgIC4uLm91dGVyU3BlYyxcbiAgICBmYWNldDoge1xuICAgICAgLi4uKHJvdyA/IHtyb3d9IDoge30pLFxuICAgICAgLi4uKGNvbHVtbiA/IHtjb2x1bW59OiB7fSksXG4gICAgfSxcbiAgICBzcGVjOiBub3JtYWxpemVOb25GYWNldFVuaXQoe1xuICAgICAgLi4uKHByb2plY3Rpb24gPyB7cHJvamVjdGlvbn0gOiB7fSksXG4gICAgICBtYXJrLFxuICAgICAgLi4uKHdpZHRoID8ge3dpZHRofSA6IHt9KSxcbiAgICAgIC4uLihoZWlnaHQgPyB7aGVpZ2h0fSA6IHt9KSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgLi4uKHNlbGVjdGlvbiA/IHtzZWxlY3Rpb259IDoge30pXG4gICAgfSwgY29uZmlnKVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc05vbkZhY2V0VW5pdFNwZWNXaXRoUHJpbWl0aXZlTWFyayhzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8RmllbGQ+LCBBbnlNYXJrPik6XG4gIHNwZWMgaXMgR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPEZpZWxkPiwgTWFyaz4ge1xuICAgIHJldHVybiBpc1ByaW1pdGl2ZU1hcmsoc3BlYy5tYXJrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9pbnRPdmVybGF5KG1hcmtEZWY6IE1hcmtEZWYsIG1hcmtDb25maWc6IExpbmVDb25maWcsIGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4pOiBNYXJrQ29uZmlnIHtcbiAgaWYgKG1hcmtEZWYucG9pbnQgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICByZXR1cm4ge29wYWNpdHk6IDB9O1xuICB9IGVsc2UgaWYgKG1hcmtEZWYucG9pbnQpIHsgLy8gdHJ1dGh5IDogdHJ1ZSBvciBvYmplY3RcbiAgICByZXR1cm4gaXNPYmplY3QobWFya0RlZi5wb2ludCkgPyBtYXJrRGVmLnBvaW50IDoge307XG4gIH0gZWxzZSBpZiAobWFya0RlZi5wb2ludCAhPT0gdW5kZWZpbmVkKSB7IC8vIGZhbHNlIG9yIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHsgLy8gdW5kZWZpbmVkIChub3QgZGlzYWJsZWQpXG4gICAgaWYgKG1hcmtDb25maWcucG9pbnQgfHwgZW5jb2Rpbmcuc2hhcGUpIHtcbiAgICAgIC8vIGVuYWJsZSBwb2ludCBvdmVybGF5IGlmIGNvbmZpZ1ttYXJrXS5wb2ludCBpcyB0cnV0aHkgb3IgaWYgZW5jb2Rpbmcuc2hhcGUgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiBpc09iamVjdChtYXJrQ29uZmlnLnBvaW50KSA/IG1hcmtDb25maWcucG9pbnQgOiB7fTtcbiAgICB9XG4gICAgLy8gbWFya0RlZi5wb2ludCBpcyBkZWZpbmVkIGFzIGZhbHN5XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGluZU92ZXJsYXkobWFya0RlZjogTWFya0RlZiwgbWFya0NvbmZpZzogQXJlYUNvbmZpZyk6IE1hcmtDb25maWcge1xuICBpZiAobWFya0RlZi5saW5lKSB7IC8vIHRydWUgb3Igb2JqZWN0XG4gICAgcmV0dXJuIG1hcmtEZWYubGluZSA9PT0gdHJ1ZSA/IHt9IDogbWFya0RlZi5saW5lO1xuICB9IGVsc2UgaWYgKG1hcmtEZWYubGluZSAhPT0gdW5kZWZpbmVkKSB7IC8vIGZhbHNlIG9yIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHsgLy8gdW5kZWZpbmVkIChub3QgZGlzYWJsZWQpXG4gICAgaWYgKG1hcmtDb25maWcubGluZSkge1xuICAgICAgLy8gZW5hYmxlIGxpbmUgb3ZlcmxheSBpZiBjb25maWdbbWFya10ubGluZSBpcyB0cnV0aHlcbiAgICAgIHJldHVybiBtYXJrQ29uZmlnLmxpbmUgPT09IHRydWUgPyB7fSA6IG1hcmtDb25maWcubGluZTtcbiAgICB9XG4gICAgLy8gbWFya0RlZi5wb2ludCBpcyBkZWZpbmVkIGFzIGZhbHN5XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTm9uRmFjZXRVbml0KFxuICBzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8RmllbGQ+LCBBbnlNYXJrPiwgY29uZmlnOiBDb25maWcsXG4gIHBhcmVudEVuY29kaW5nPzogRW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPiwgcGFyZW50UHJvamVjdGlvbj86IFByb2plY3Rpb25cbik6IE5vcm1hbGl6ZWRVbml0U3BlYyB8IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuICBjb25zdCB7ZW5jb2RpbmcsIHByb2plY3Rpb259ID0gc3BlYztcbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG5cblxuICAvLyBtZXJnZSBwYXJlbnQgZW5jb2RpbmcgLyBwcm9qZWN0aW9uIGZpcnN0XG4gIGlmIChwYXJlbnRFbmNvZGluZyB8fCBwYXJlbnRQcm9qZWN0aW9uKSB7XG4gICAgY29uc3QgbWVyZ2VkUHJvamVjdGlvbiA9IG1lcmdlUHJvamVjdGlvbih7cGFyZW50UHJvamVjdGlvbiwgcHJvamVjdGlvbn0pO1xuICAgIGNvbnN0IG1lcmdlZEVuY29kaW5nID0gbWVyZ2VFbmNvZGluZyh7cGFyZW50RW5jb2RpbmcsIGVuY29kaW5nfSk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU5vbkZhY2V0VW5pdCh7XG4gICAgICAuLi5zcGVjLFxuICAgICAgLi4uKG1lcmdlZFByb2plY3Rpb24gPyB7cHJvamVjdGlvbjogbWVyZ2VkUHJvamVjdGlvbn0gOiB7fSksXG4gICAgICAuLi4obWVyZ2VkRW5jb2RpbmcgPyB7ZW5jb2Rpbmc6IG1lcmdlZEVuY29kaW5nfSA6IHt9KSxcbiAgICB9LCBjb25maWcpO1xuICB9XG5cbiAgaWYgKGlzTm9uRmFjZXRVbml0U3BlY1dpdGhQcmltaXRpdmVNYXJrKHNwZWMpKSB7XG4gICAgLy8gVE9ETzogdGhvcm91Z2hseSB0ZXN0XG4gICAgaWYgKGlzUmFuZ2VkKGVuY29kaW5nKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJhbmdlZFVuaXQoc3BlYyk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmsgPT09ICdsaW5lJyAmJiAoZW5jb2RpbmcueDIgfHwgZW5jb2RpbmcueTIpKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5saW5lV2l0aFJhbmdlKCEhZW5jb2RpbmcueDIsICEhZW5jb2RpbmcueTIpKTtcblxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZU5vbkZhY2V0VW5pdCh7XG4gICAgICAgIG1hcms6ICdydWxlJyxcbiAgICAgICAgLi4uc3BlY1xuICAgICAgfSwgY29uZmlnLCBwYXJlbnRFbmNvZGluZywgcGFyZW50UHJvamVjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGlzUGF0aE1hcmsobWFyaykpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVQYXRoT3ZlcmxheShzcGVjLCBjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBzcGVjOyAvLyBOb3RoaW5nIHRvIG5vcm1hbGl6ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb3NpdGVNYXJrLm5vcm1hbGl6ZShzcGVjLCBjb25maWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmdlZFVuaXQoc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjKSB7XG4gIGNvbnN0IGhhc1ggPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWCk7XG4gIGNvbnN0IGhhc1kgPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWSk7XG4gIGNvbnN0IGhhc1gyID0gY2hhbm5lbEhhc0ZpZWxkKHNwZWMuZW5jb2RpbmcsIFgyKTtcbiAgY29uc3QgaGFzWTIgPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWTIpO1xuICBpZiAoKGhhc1gyICYmICFoYXNYKSB8fCAoaGFzWTIgJiYgIWhhc1kpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNwZWMgPSBkdXBsaWNhdGUoc3BlYyk7XG4gICAgaWYgKGhhc1gyICYmICFoYXNYKSB7XG4gICAgICBub3JtYWxpemVkU3BlYy5lbmNvZGluZy54ID0gbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueDI7XG4gICAgICBkZWxldGUgbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueDI7XG4gICAgfVxuICAgIGlmIChoYXNZMiAmJiAhaGFzWSkge1xuICAgICAgbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueSA9IG5vcm1hbGl6ZWRTcGVjLmVuY29kaW5nLnkyO1xuICAgICAgZGVsZXRlIG5vcm1hbGl6ZWRTcGVjLmVuY29kaW5nLnkyO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkU3BlYztcbiAgfVxuICByZXR1cm4gc3BlYztcbn1cblxuZnVuY3Rpb24gZHJvcExpbmVBbmRQb2ludChtYXJrRGVmOiBNYXJrRGVmKTogTWFya0RlZiB8IE1hcmsge1xuICBjb25zdCB7cG9pbnQ6IF9wb2ludCwgbGluZTogX2xpbmUsIC4uLm1hcmt9ID0gbWFya0RlZjtcblxuICByZXR1cm4ga2V5cyhtYXJrKS5sZW5ndGggPiAxID8gbWFyayA6IG1hcmsudHlwZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aE92ZXJsYXkoc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjLCBjb25maWc6IENvbmZpZyA9IHt9KTogTm9ybWFsaXplZExheWVyU3BlYyB8IE5vcm1hbGl6ZWRVbml0U3BlYyB7XG5cbiAgLy8gXyBpcyB1c2VkIHRvIGRlbm90ZSBhIGRyb3BwZWQgcHJvcGVydHkgb2YgdGhlIHVuaXQgc3BlY1xuICAvLyB3aGljaCBzaG91bGQgbm90IGJlIGNhcnJpZWQgb3ZlciB0byB0aGUgbGF5ZXIgc3BlY1xuICBjb25zdCB7c2VsZWN0aW9uLCBwcm9qZWN0aW9uLCBlbmNvZGluZywgbWFyaywgLi4ub3V0ZXJTcGVjfSA9IHNwZWM7XG4gIGNvbnN0IG1hcmtEZWYgPSBpc01hcmtEZWYobWFyaykgPyBtYXJrIDoge3R5cGU6IG1hcmt9O1xuXG4gIGNvbnN0IHBvaW50T3ZlcmxheSA9IGdldFBvaW50T3ZlcmxheShtYXJrRGVmLCBjb25maWdbbWFya0RlZi50eXBlXSwgZW5jb2RpbmcpO1xuICBjb25zdCBsaW5lT3ZlcmxheSA9IG1hcmtEZWYudHlwZSA9PT0gJ2FyZWEnICYmIGdldExpbmVPdmVybGF5KG1hcmtEZWYsIGNvbmZpZ1ttYXJrRGVmLnR5cGVdKTtcblxuICBpZiAoIXBvaW50T3ZlcmxheSAmJiAhbGluZU92ZXJsYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3BlYyxcbiAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHBvaW50IC8gbGluZSBvdmVybGF5IGluIHRoZSBub3JtYWxpemUgc3BlY1xuICAgICAgbWFyazogZHJvcExpbmVBbmRQb2ludChtYXJrRGVmKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBsYXllcjogTm9ybWFsaXplZFVuaXRTcGVjW10gPSBbe1xuICAgIC4uLihzZWxlY3Rpb24gPyB7c2VsZWN0aW9ufSA6IHt9KSxcbiAgICAvLyBEbyBub3QgaW5jbHVkZSBwb2ludCAvIGxpbmUgb3ZlcmxheSBpbiB0aGUgbm9ybWFsaXplIHNwZWNcbiAgICBtYXJrOiBkcm9wTGluZUFuZFBvaW50KHtcbiAgICAgIC4uLm1hcmtEZWYsXG4gICAgICAvLyBtYWtlIGFyZWEgbWFyayB0cmFuc2x1Y2VudCBieSBkZWZhdWx0XG4gICAgICAvLyBUT0RPOiBleHRyYWN0IHRoaXMgMC43IHRvIGJlIHNoYXJlZCB3aXRoIGRlZmF1bHQgb3BhY2l0eSBmb3IgcG9pbnQvdGljay8uLi5cbiAgICAgIC4uLihtYXJrRGVmLnR5cGUgPT09ICdhcmVhJyA/IHtvcGFjaXR5OiAwLjd9IDoge30pLFxuICAgIH0pLFxuICAgIC8vIGRyb3Agc2hhcGUgZnJvbSBlbmNvZGluZyBhcyB0aGlzIG1pZ2h0IGJlIHVzZWQgdG8gdHJpZ2dlciBwb2ludCBvdmVybGF5XG4gICAgZW5jb2Rpbmc6IG9taXQoZW5jb2RpbmcsIFsnc2hhcGUnXSlcbiAgfV07XG5cbiAgLy8gRklYTUU6IGRpc2FibGUgdG9vbHRpcCBmb3IgdGhlIGxpbmUgbGF5ZXIgaWYgdG9vbHRpcCBpcyBub3QgZ3JvdXAtYnkgZmllbGQuXG4gIC8vIEZJWE1FOiBkZXRlcm1pbmUgcnVsZXMgZm9yIGFwcGx5aW5nIHNlbGVjdGlvbnMuXG5cbiAgLy8gTmVlZCB0byBjb3B5IHN0YWNrIGNvbmZpZyB0byBvdmVybGF5ZWQgbGF5ZXJcbiAgY29uc3Qgc3RhY2tQcm9wcyA9IHN0YWNrKG1hcmtEZWYsIGVuY29kaW5nLCBjb25maWcgPyBjb25maWcuc3RhY2sgOiB1bmRlZmluZWQpO1xuXG4gIGxldCBvdmVybGF5RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKHN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCB7ZmllbGRDaGFubmVsOiBzdGFja0ZpZWxkQ2hhbm5lbCwgb2Zmc2V0fSA9IHN0YWNrUHJvcHM7XG4gICAgb3ZlcmxheUVuY29kaW5nID0ge1xuICAgICAgLi4uZW5jb2RpbmcsXG4gICAgICBbc3RhY2tGaWVsZENoYW5uZWxdOiB7XG4gICAgICAgIC4uLmVuY29kaW5nW3N0YWNrRmllbGRDaGFubmVsXSxcbiAgICAgICAgLi4uKG9mZnNldCA/IHtzdGFjazogb2Zmc2V0fSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpZiAobGluZU92ZXJsYXkpIHtcbiAgICBjb25zdCB7aW50ZXJwb2xhdGV9ID0gbWFya0RlZjtcbiAgICBsYXllci5wdXNoKHtcbiAgICAgIC4uLihwcm9qZWN0aW9uID8ge3Byb2plY3Rpb259IDoge30pLFxuICAgICAgbWFyazoge1xuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIC4uLmxpbmVPdmVybGF5LFxuICAgICAgICAuLi4oaW50ZXJwb2xhdGUgPyB7aW50ZXJwb2xhdGV9IDoge30pXG4gICAgICB9LFxuICAgICAgZW5jb2Rpbmc6IG92ZXJsYXlFbmNvZGluZ1xuICAgIH0pO1xuICB9XG4gIGlmIChwb2ludE92ZXJsYXkpIHtcbiAgICBsYXllci5wdXNoKHtcbiAgICAgIC4uLihwcm9qZWN0aW9uID8ge3Byb2plY3Rpb259IDoge30pLFxuICAgICAgbWFyazoge1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBmaWxsZWQ6IHRydWUsXG4gICAgICAgIC4uLnBvaW50T3ZlcmxheVxuICAgICAgfSxcbiAgICAgIGVuY29kaW5nOiBvdmVybGF5RW5jb2RpbmdcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub3V0ZXJTcGVjLFxuICAgIGxheWVyXG4gIH07XG59XG5cbi8vIFRPRE86IGFkZCB2bC5zcGVjLnZhbGlkYXRlICYgbW92ZSBzdHVmZiBmcm9tIHZsLnZhbGlkYXRlIHRvIGhlcmVcblxuLyogQWNjdW11bGF0ZSBub24tZHVwbGljYXRlIGZpZWxkRGVmcyBpbiBhIGRpY3Rpb25hcnkgKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGUoZGljdDogYW55LCBkZWZzOiBGaWVsZERlZjxGaWVsZD5bXSk6IGFueSB7XG4gIGRlZnMuZm9yRWFjaChmdW5jdGlvbihmaWVsZERlZikge1xuICAgIC8vIENvbnNpZGVyIG9ubHkgcHVyZSBmaWVsZERlZiBwcm9wZXJ0aWVzIChpZ25vcmluZyBzY2FsZSwgYXhpcywgbGVnZW5kKVxuICAgIGNvbnN0IHB1cmVGaWVsZERlZiA9IFsnZmllbGQnLCAndHlwZScsICd2YWx1ZScsICd0aW1lVW5pdCcsICdiaW4nLCAnYWdncmVnYXRlJ10ucmVkdWNlKChmLCBrZXkpID0+IHtcbiAgICAgIGlmIChmaWVsZERlZltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZltrZXldID0gZmllbGREZWZba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBrZXkgPSBoYXNoKHB1cmVGaWVsZERlZik7XG4gICAgZGljdFtrZXldID0gZGljdFtrZXldIHx8IGZpZWxkRGVmO1xuICB9KTtcbiAgcmV0dXJuIGRpY3Q7XG59XG5cbi8qIFJlY3Vyc2l2ZWx5IGdldCBmaWVsZERlZnMgZnJvbSBhIHNwZWMsIHJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIGZpZWxkRGVmcyAqL1xuZnVuY3Rpb24gZmllbGREZWZJbmRleDxUPihzcGVjOiBHZW5lcmljU3BlYzxhbnksIGFueT4sIGRpY3Q6IERpY3Q8RmllbGREZWY8VD4+ID0ge30pOiBEaWN0PEZpZWxkRGVmPFQ+PiB7XG4gIC8vIEZJWE1FKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjIwNyk6IFN1cHBvcnQgZmllbGREZWZJbmRleCBmb3IgcmVwZWF0XG4gIGlmIChpc0xheWVyU3BlYyhzcGVjKSkge1xuICAgIHNwZWMubGF5ZXIuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICBpZiAoaXNVbml0U3BlYyhsYXllcikpIHtcbiAgICAgICAgYWNjdW11bGF0ZShkaWN0LCB2bEVuY29kaW5nLmZpZWxkRGVmcyhsYXllci5lbmNvZGluZykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGREZWZJbmRleChsYXllciwgZGljdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNGYWNldFNwZWMoc3BlYykpIHtcbiAgICBhY2N1bXVsYXRlKGRpY3QsIHZsRW5jb2RpbmcuZmllbGREZWZzKHNwZWMuZmFjZXQpKTtcbiAgICBmaWVsZERlZkluZGV4KHNwZWMuc3BlYywgZGljdCk7XG4gIH0gZWxzZSBpZiAoaXNSZXBlYXRTcGVjKHNwZWMpKSB7XG4gICAgZmllbGREZWZJbmRleChzcGVjLnNwZWMsIGRpY3QpO1xuICB9IGVsc2UgaWYgKGlzQ29uY2F0U3BlYyhzcGVjKSkge1xuICAgIGNvbnN0IGNoaWxkU3BlYyA9IGlzVkNvbmNhdFNwZWMoc3BlYykgPyBzcGVjLnZjb25jYXQgOiBzcGVjLmhjb25jYXQ7XG4gICAgY2hpbGRTcGVjLmZvckVhY2goY2hpbGQgPT4gZmllbGREZWZJbmRleChjaGlsZCwgZGljdCkpO1xuICB9IGVsc2UgeyAvLyBVbml0IFNwZWNcbiAgICBhY2N1bXVsYXRlKGRpY3QsIHZsRW5jb2RpbmcuZmllbGREZWZzKHNwZWMuZW5jb2RpbmcpKTtcbiAgfVxuICByZXR1cm4gZGljdDtcbn1cblxuLyogUmV0dXJucyBhbGwgbm9uLWR1cGxpY2F0ZSBmaWVsZERlZnMgaW4gYSBzcGVjIGluIGEgZmxhdCBhcnJheSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkRGVmcyhzcGVjOiBHZW5lcmljU3BlYzxhbnksIGFueT4pOiBGaWVsZERlZjxhbnk+W10ge1xuICByZXR1cm4gdmFscyhmaWVsZERlZkluZGV4KHNwZWMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhY2tlZChzcGVjOiBUb3BMZXZlbDxGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWM+LCBjb25maWc/OiBDb25maWcpOiBib29sZWFuIHtcbiAgY29uZmlnID0gY29uZmlnIHx8IHNwZWMuY29uZmlnO1xuICBpZiAoaXNQcmltaXRpdmVNYXJrKHNwZWMubWFyaykpIHtcbiAgICByZXR1cm4gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLFxuICAgICAgICAgICAgY29uZmlnID8gY29uZmlnLnN0YWNrIDogdW5kZWZpbmVkXG4gICAgICAgICAgKSAhPT0gbnVsbDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/stack.d.ts b/build/src/stack.d.ts new file mode 100644 index 0000000000..134d9c3be8 --- /dev/null +++ b/build/src/stack.d.ts @@ -0,0 +1,28 @@ +import { NonPositionChannel } from './channel'; +import { Encoding } from './encoding'; +import { Field, FieldDef } from './fielddef'; +import { Mark, MarkDef } from './mark'; +export declare type StackOffset = 'zero' | 'center' | 'normalize'; +export declare function isStackOffset(s: string): s is StackOffset; +export interface StackProperties { + /** Dimension axis of the stack. */ + groupbyChannel: 'x' | 'y'; + /** Measure axis of the stack. */ + fieldChannel: 'x' | 'y'; + /** Stack-by fields e.g., color, detail */ + stackBy: { + fieldDef: FieldDef; + channel: NonPositionChannel; + }[]; + /** + * See `"stack"` property of Position Field Def. + */ + offset: StackOffset; + /** + * Whether this stack will produce impute transform + */ + impute: boolean; +} +export declare const STACKABLE_MARKS: ("square" | "area" | "circle" | "line" | "text" | "rule" | "point" | "bar" | "tick")[]; +export declare const STACK_BY_DEFAULT_MARKS: ("area" | "bar")[]; +export declare function stack(m: Mark | MarkDef, encoding: Encoding, stackConfig: StackOffset): StackProperties; diff --git a/build/src/stack.js b/build/src/stack.js new file mode 100644 index 0000000000..79b0c6b7bb --- /dev/null +++ b/build/src/stack.js @@ -0,0 +1,134 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var aggregate_1 = require("./aggregate"); +var channel_1 = require("./channel"); +var encoding_1 = require("./encoding"); +var fielddef_1 = require("./fielddef"); +var log = tslib_1.__importStar(require("./log")); +var mark_1 = require("./mark"); +var scale_1 = require("./scale"); +var util_1 = require("./util"); +var STACK_OFFSET_INDEX = { + zero: 1, + center: 1, + normalize: 1 +}; +function isStackOffset(s) { + return !!STACK_OFFSET_INDEX[s]; +} +exports.isStackOffset = isStackOffset; +exports.STACKABLE_MARKS = [mark_1.BAR, mark_1.AREA, mark_1.RULE, mark_1.POINT, mark_1.CIRCLE, mark_1.SQUARE, mark_1.LINE, mark_1.TEXT, mark_1.TICK]; +exports.STACK_BY_DEFAULT_MARKS = [mark_1.BAR, mark_1.AREA]; +function potentialStackedChannel(encoding) { + var xDef = encoding.x; + var yDef = encoding.y; + if (fielddef_1.isFieldDef(xDef) && fielddef_1.isFieldDef(yDef)) { + if (xDef.type === 'quantitative' && yDef.type === 'quantitative') { + if (xDef.stack) { + return 'x'; + } + else if (yDef.stack) { + return 'y'; + } + // if there is no explicit stacking, only apply stack if there is only one aggregate for x or y + if ((!!xDef.aggregate) !== (!!yDef.aggregate)) { + return xDef.aggregate ? 'x' : 'y'; + } + } + else if (xDef.type === 'quantitative') { + return 'x'; + } + else if (yDef.type === 'quantitative') { + return 'y'; + } + } + else if (fielddef_1.isFieldDef(xDef) && xDef.type === 'quantitative') { + return 'x'; + } + else if (fielddef_1.isFieldDef(yDef) && yDef.type === 'quantitative') { + return 'y'; + } + return undefined; +} +// Note: CompassQL uses this method and only pass in required properties of each argument object. +// If required properties change, make sure to update CompassQL. +function stack(m, encoding, stackConfig) { + var mark = mark_1.isMarkDef(m) ? m.type : m; + // Should have stackable mark + if (!util_1.contains(exports.STACKABLE_MARKS, mark)) { + return null; + } + var fieldChannel = potentialStackedChannel(encoding); + if (!fieldChannel) { + return null; + } + var stackedFieldDef = encoding[fieldChannel]; + var stackedField = fielddef_1.isStringFieldDef(stackedFieldDef) ? fielddef_1.vgField(stackedFieldDef, {}) : undefined; + var dimensionChannel = fieldChannel === 'x' ? 'y' : 'x'; + var dimensionDef = encoding[dimensionChannel]; + var dimensionField = fielddef_1.isStringFieldDef(dimensionDef) ? fielddef_1.vgField(dimensionDef, {}) : undefined; + // Should have grouping level of detail that is different from the dimension field + var stackBy = channel_1.NONPOSITION_CHANNELS.reduce(function (sc, channel) { + if (encoding_1.channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + (vega_util_1.isArray(channelDef) ? channelDef : [channelDef]).forEach(function (cDef) { + var fieldDef = fielddef_1.getFieldDef(cDef); + if (fieldDef.aggregate) { + return; + } + // Check whether the channel's field is identical to x/y's field or if the channel is a repeat + var f = fielddef_1.isStringFieldDef(fieldDef) ? fielddef_1.vgField(fieldDef, {}) : undefined; + if ( + // if fielddef is a repeat, just include it in the stack by + !f || + // otherwise, the field must be different from x and y fields. + (f !== dimensionField && f !== stackedField)) { + sc.push({ channel: channel, fieldDef: fieldDef }); + } + }); + } + return sc; + }, []); + if (stackBy.length === 0) { + return null; + } + // Automatically determine offset + var offset = undefined; + if (stackedFieldDef.stack !== undefined) { + offset = stackedFieldDef.stack; + } + else if (util_1.contains(exports.STACK_BY_DEFAULT_MARKS, mark)) { + // Bar and Area with sum ops are automatically stacked by default + offset = stackConfig === undefined ? 'zero' : stackConfig; + } + else { + offset = stackConfig; + } + if (!offset || !isStackOffset(offset)) { + return null; + } + // warn when stacking non-linear + if (stackedFieldDef.scale && stackedFieldDef.scale.type && stackedFieldDef.scale.type !== scale_1.ScaleType.LINEAR) { + log.warn(log.message.cannotStackNonLinearScale(stackedFieldDef.scale.type)); + } + // Check if it is a ranged mark + if (encoding_1.channelHasField(encoding, fieldChannel === channel_1.X ? channel_1.X2 : channel_1.Y2)) { + log.warn(log.message.cannotStackRangedMark(fieldChannel)); + return null; + } + // Warn if stacking summative aggregate + if (stackedFieldDef.aggregate && !util_1.contains(aggregate_1.SUM_OPS, stackedFieldDef.aggregate)) { + log.warn(log.message.stackNonSummativeAggregate(stackedFieldDef.aggregate)); + } + return { + groupbyChannel: dimensionDef ? dimensionChannel : undefined, + fieldChannel: fieldChannel, + impute: mark_1.isPathMark(mark), + stackBy: stackBy, + offset: offset + }; +} +exports.stack = stack; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQWtDO0FBQ2xDLHlDQUFvQztBQUNwQyxxQ0FBOEU7QUFDOUUsdUNBQXFEO0FBQ3JELHVDQUFpSDtBQUNqSCxpREFBNkI7QUFDN0IsK0JBQXNIO0FBQ3RILGlDQUFrQztBQUNsQywrQkFBc0M7QUFLdEMsSUFBTSxrQkFBa0IsR0FBc0I7SUFDNUMsSUFBSSxFQUFFLENBQUM7SUFDUCxNQUFNLEVBQUUsQ0FBQztJQUNULFNBQVMsRUFBRSxDQUFDO0NBQ2IsQ0FBQztBQUVGLHVCQUE4QixDQUFTO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFGRCxzQ0FFQztBQTBCWSxRQUFBLGVBQWUsR0FBRyxDQUFDLFVBQUcsRUFBRSxXQUFJLEVBQUUsV0FBSSxFQUFFLFlBQUssRUFBRSxhQUFNLEVBQUUsYUFBTSxFQUFFLFdBQUksRUFBRSxXQUFJLEVBQUUsV0FBSSxDQUFDLENBQUM7QUFDN0UsUUFBQSxzQkFBc0IsR0FBRyxDQUFDLFVBQUcsRUFBRSxXQUFJLENBQUMsQ0FBQztBQUdsRCxpQ0FBaUMsUUFBeUI7SUFDeEQsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN4QixJQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRXhCLElBQUkscUJBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxxQkFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3hDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxjQUFjLEVBQUU7WUFDaEUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLE9BQU8sR0FBRyxDQUFDO2FBQ1o7aUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFF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QUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM3RTtJQUVELCtCQUErQjtJQUMvQixJQUFJLDBCQUFlLENBQUMsUUFBUSxFQUFFLFlBQVksS0FBSyxXQUFDLENBQUMsQ0FBQyxDQUFDLFlBQUUsQ0FBQyxDQUFDLENBQUMsWUFBRSxDQUFDLEVBQUU7UUFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELHVDQUF1QztJQUN2QyxJQUFJLGVBQWUsQ0FBQyxTQUFTLElBQUksQ0FBQyxlQUFRLENBQUMsbUJBQU8sRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDOUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQzdFO0lBRUQsT0FBTztRQUNMLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzNELFlBQVksY0FBQTtRQUNaLE1BQU0sRUFBRSxpQkFBVSxDQUFDLElBQUksQ0FBQztRQUN4QixPQUFPLFNBQUE7UUFDUCxNQUFNLFFBQUE7S0FDUCxDQUFDO0FBQ0osQ0FBQztBQXRGRCxzQkFzRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge1NVTV9PUFN9IGZyb20gJy4vYWdncmVnYXRlJztcbmltcG9ydCB7Tk9OUE9TSVRJT05fQ0hBTk5FTFMsIE5vblBvc2l0aW9uQ2hhbm5lbCwgWCwgWDIsIFkyfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtjaGFubmVsSGFzRmllbGQsIEVuY29kaW5nfSBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCB7RmllbGQsIEZpZWxkRGVmLCBnZXRGaWVsZERlZiwgaXNGaWVsZERlZiwgaXNTdHJpbmdGaWVsZERlZiwgUG9zaXRpb25GaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtBUkVBLCBCQVIsIENJUkNMRSwgaXNNYXJrRGVmLCBpc1BhdGhNYXJrLCBMSU5FLCBNYXJrLCBNYXJrRGVmLCBQT0lOVCwgUlVMRSwgU1FVQVJFLCBURVhULCBUSUNLfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4vc2NhbGUnO1xuaW1wb3J0IHtjb250YWlucywgRmxhZ30gZnJvbSAnLi91dGlsJztcblxuXG5leHBvcnQgdHlwZSBTdGFja09mZnNldCA9ICd6ZXJvJyB8ICdjZW50ZXInIHwgJ25vcm1hbGl6ZSc7XG5cbmNvbnN0IFNUQUNLX09GRlNFVF9JTkRFWDogRmxhZzxTdGFja09mZnNldD4gPSB7XG4gIHplcm86IDEsXG4gIGNlbnRlcjogMSxcbiAgbm9ybWFsaXplOiAxXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNTdGFja09mZnNldChzOiBzdHJpbmcpOiBzIGlzIFN0YWNrT2Zmc2V0IHtcbiAgcmV0dXJuICEhU1RBQ0tfT0ZGU0VUX0lOREVYW3NdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrUHJvcGVydGllcyB7XG4gIC8qKiBEaW1lbnNpb24gYXhpcyBvZiB0aGUgc3RhY2suICovXG4gIGdyb3VwYnlDaGFubmVsOiAneCcgfCAneSc7XG5cbiAgLyoqIE1lYXN1cmUgYXhpcyBvZiB0aGUgc3RhY2suICovXG4gIGZpZWxkQ2hhbm5lbDogJ3gnIHwgJ3knO1xuXG4gIC8qKiBTdGFjay1ieSBmaWVsZHMgZS5nLiwgY29sb3IsIGRldGFpbCAqL1xuICBzdGFja0J5OiB7XG4gICAgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sXG4gICAgY2hhbm5lbDogTm9uUG9zaXRpb25DaGFubmVsXG4gIH1bXTtcblxuICAvKipcbiAgICogU2VlIGBcInN0YWNrXCJgIHByb3BlcnR5IG9mIFBvc2l0aW9uIEZpZWxkIERlZi5cbiAgICovXG4gIG9mZnNldDogU3RhY2tPZmZzZXQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBzdGFjayB3aWxsIHByb2R1Y2UgaW1wdXRlIHRyYW5zZm9ybVxuICAgKi9cbiAgaW1wdXRlOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU1RBQ0tBQkxFX01BUktTID0gW0JBUiwgQVJFQSwgUlVMRSwgUE9JTlQsIENJUkNMRSwgU1FVQVJFLCBMSU5FLCBURVhULCBUSUNLXTtcbmV4cG9ydCBjb25zdCBTVEFDS19CWV9ERUZBVUxUX01BUktTID0gW0JBUiwgQVJFQV07XG5cblxuZnVuY3Rpb24gcG90ZW50aWFsU3RhY2tlZENoYW5uZWwoZW5jb2Rpbmc6IEVuY29kaW5nPEZpZWxkPik6ICd4JyB8ICd5JyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHhEZWYgPSBlbmNvZGluZy54O1xuICBjb25zdCB5RGVmID0gZW5jb2RpbmcueTtcblxuICBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiBpc0ZpZWxkRGVmKHlEZWYpKSB7XG4gICAgaWYgKHhEZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScgJiYgeURlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgICAgaWYgKHhEZWYuc3RhY2spIHtcbiAgICAgICAgcmV0dXJuICd4JztcbiAgICAgIH0gZWxzZSBpZiAoeURlZi5zdGFjaykge1xuICAgICAgICByZXR1cm4gJ3knO1xuICAgICAgfVxuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgc3RhY2tpbmcsIG9ubHkgYXBwbHkgc3RhY2sgaWYgdGhlcmUgaXMgb25seSBvbmUgYWdncmVnYXRlIGZvciB4IG9yIHlcbiAgICAgIGlmICgoISF4RGVmLmFnZ3JlZ2F0ZSkgIT09ICghIXlEZWYuYWdncmVnYXRlKSkge1xuICAgICAgICByZXR1cm4geERlZi5hZ2dyZWdhdGUgPyAneCcgOiAneSc7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh4RGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnKSB7XG4gICAgICByZXR1cm4gJ3gnO1xuICAgIH0gZWxzZSBpZiAoeURlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgICAgcmV0dXJuICd5JztcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiB4RGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnKSB7XG4gICAgcmV0dXJuICd4JztcbiAgfSBlbHNlIGlmIChpc0ZpZWxkRGVmKHlEZWYpICYmIHlEZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICByZXR1cm4gJ3knO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8vIE5vdGU6IENvbXBhc3NRTCB1c2VzIHRoaXMgbWV0aG9kIGFuZCBvbmx5IHBhc3MgaW4gcmVxdWlyZWQgcHJvcGVydGllcyBvZiBlYWNoIGFyZ3VtZW50IG9iamVjdC5cbi8vIElmIHJlcXVpcmVkIHByb3BlcnRpZXMgY2hhbmdlLCBtYWtlIHN1cmUgdG8gdXBkYXRlIENvbXBhc3NRTC5cbmV4cG9ydCBmdW5jdGlvbiBzdGFjayhtOiBNYXJrIHwgTWFya0RlZiwgZW5jb2Rpbmc6IEVuY29kaW5nPEZpZWxkPiwgc3RhY2tDb25maWc6IFN0YWNrT2Zmc2V0KTogU3RhY2tQcm9wZXJ0aWVzIHtcbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihtKSA/IG0udHlwZSA6IG07XG4gIC8vIFNob3VsZCBoYXZlIHN0YWNrYWJsZSBtYXJrXG4gIGlmICghY29udGFpbnMoU1RBQ0tBQkxFX01BUktTLCBtYXJrKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZmllbGRDaGFubmVsID0gcG90ZW50aWFsU3RhY2tlZENoYW5uZWwoZW5jb2RpbmcpO1xuICBpZiAoIWZpZWxkQ2hhbm5lbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc3RhY2tlZEZpZWxkRGVmID0gZW5jb2RpbmdbZmllbGRDaGFubmVsXSBhcyBQb3NpdGlvbkZpZWxkRGVmPHN0cmluZz47XG4gIGNvbnN0IHN0YWNrZWRGaWVsZCA9IGlzU3RyaW5nRmllbGREZWYoc3RhY2tlZEZpZWxkRGVmKSA/IHZnRmllbGQoc3RhY2tlZEZpZWxkRGVmLCB7fSkgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgZGltZW5zaW9uQ2hhbm5lbCA9IGZpZWxkQ2hhbm5lbCA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICBjb25zdCBkaW1lbnNpb25EZWYgPSBlbmNvZGluZ1tkaW1lbnNpb25DaGFubmVsXTtcbiAgY29uc3QgZGltZW5zaW9uRmllbGQgPSBpc1N0cmluZ0ZpZWxkRGVmKGRpbWVuc2lvbkRlZikgPyB2Z0ZpZWxkKGRpbWVuc2lvbkRlZiwge30pIDogdW5kZWZpbmVkO1xuXG4gIC8vIFNob3VsZCBoYXZlIGdyb3VwaW5nIGxldmVsIG9mIGRldGFpbCB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkaW1lbnNpb24gZmllbGRcbiAgY29uc3Qgc3RhY2tCeSA9IE5PTlBPU0lUSU9OX0NIQU5ORUxTLnJlZHVjZSgoc2MsIGNoYW5uZWwpID0+IHtcbiAgICBpZiAoY2hhbm5lbEhhc0ZpZWxkKGVuY29kaW5nLCBjaGFubmVsKSkge1xuICAgICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgICAgKGlzQXJyYXkoY2hhbm5lbERlZikgPyBjaGFubmVsRGVmIDogW2NoYW5uZWxEZWZdKS5mb3JFYWNoKChjRGVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWYoY0RlZik7XG4gICAgICAgIGlmIChmaWVsZERlZi5hZ2dyZWdhdGUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBjaGFubmVsJ3MgZmllbGQgaXMgaWRlbnRpY2FsIHRvIHgveSdzIGZpZWxkIG9yIGlmIHRoZSBjaGFubmVsIGlzIGEgcmVwZWF0XG4gICAgICAgIGNvbnN0IGYgPSBpc1N0cmluZ0ZpZWxkRGVmKGZpZWxkRGVmKSA/IHZnRmllbGQoZmllbGREZWYsIHt9KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIC8vIGlmIGZpZWxkZGVmIGlzIGEgcmVwZWF0LCBqdXN0IGluY2x1ZGUgaXQgaW4gdGhlIHN0YWNrIGJ5XG4gICAgICAgICAgIWYgfHxcbiAgICAgICAgICAvLyBvdGhlcndpc2UsIHRoZSBmaWVsZCBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIHggYW5kIHkgZmllbGRzLlxuICAgICAgICAgIChmICE9PSBkaW1lbnNpb25GaWVsZCAmJiBmICE9PSBzdGFja2VkRmllbGQpXG4gICAgICAgICkge1xuICAgICAgICAgIHNjLnB1c2goe2NoYW5uZWwsIGZpZWxkRGVmfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2M7XG4gIH0sIFtdKTtcblxuICBpZiAoc3RhY2tCeS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIEF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIG9mZnNldFxuICBsZXQgb2Zmc2V0OiBTdGFja09mZnNldCA9IHVuZGVmaW5lZDtcbiAgaWYgKHN0YWNrZWRGaWVsZERlZi5zdGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgb2Zmc2V0ID0gc3RhY2tlZEZpZWxkRGVmLnN0YWNrO1xuICB9IGVsc2UgaWYgKGNvbnRhaW5zKFNUQUNLX0JZX0RFRkFVTFRfTUFSS1MsIG1hcmspKSB7XG4gICAgLy8gQmFyIGFuZCBBcmVhIHdpdGggc3VtIG9wcyBhcmUgYXV0b21hdGljYWxseSBzdGFja2VkIGJ5IGRlZmF1bHRcbiAgICBvZmZzZXQgPSBzdGFja0NvbmZpZyA9PT0gdW5kZWZpbmVkID8gJ3plcm8nIDogc3RhY2tDb25maWc7XG4gIH0gZWxzZSB7XG4gICAgb2Zmc2V0ID0gc3RhY2tDb25maWc7XG4gIH1cblxuICBpZiAoIW9mZnNldCB8fCAhaXNTdGFja09mZnNldChvZmZzZXQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyB3YXJuIHdoZW4gc3RhY2tpbmcgbm9uLWxpbmVhclxuICBpZiAoc3RhY2tlZEZpZWxkRGVmLnNjYWxlICYmIHN0YWNrZWRGaWVsZERlZi5zY2FsZS50eXBlICYmIHN0YWNrZWRGaWVsZERlZi5zY2FsZS50eXBlICE9PSBTY2FsZVR5cGUuTElORUFSKSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuY2Fubm90U3RhY2tOb25MaW5lYXJTY2FsZShzdGFja2VkRmllbGREZWYuc2NhbGUudHlwZSkpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgaXQgaXMgYSByYW5nZWQgbWFya1xuICBpZiAoY2hhbm5lbEhhc0ZpZWxkKGVuY29kaW5nLCBmaWVsZENoYW5uZWwgPT09IFggPyBYMiA6IFkyKSkge1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmNhbm5vdFN0YWNrUmFuZ2VkTWFyayhmaWVsZENoYW5uZWwpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFdhcm4gaWYgc3RhY2tpbmcgc3VtbWF0aXZlIGFnZ3JlZ2F0ZVxuICBpZiAoc3RhY2tlZEZpZWxkRGVmLmFnZ3JlZ2F0ZSAmJiAhY29udGFpbnMoU1VNX09QUywgc3RhY2tlZEZpZWxkRGVmLmFnZ3JlZ2F0ZSkpIHtcbiAgICBsb2cud2Fybihsb2cubWVzc2FnZS5zdGFja05vblN1bW1hdGl2ZUFnZ3JlZ2F0ZShzdGFja2VkRmllbGREZWYuYWdncmVnYXRlKSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdyb3VwYnlDaGFubmVsOiBkaW1lbnNpb25EZWYgPyBkaW1lbnNpb25DaGFubmVsIDogdW5kZWZpbmVkLFxuICAgIGZpZWxkQ2hhbm5lbCxcbiAgICBpbXB1dGU6IGlzUGF0aE1hcmsobWFyayksXG4gICAgc3RhY2tCeSxcbiAgICBvZmZzZXRcbiAgfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/timeunit.d.ts b/build/src/timeunit.d.ts new file mode 100644 index 0000000000..7b3fb99f3e --- /dev/null +++ b/build/src/timeunit.d.ts @@ -0,0 +1,80 @@ +export declare namespace TimeUnit { + const YEAR: 'year'; + const MONTH: 'month'; + const DAY: 'day'; + const DATE: 'date'; + const HOURS: 'hours'; + const MINUTES: 'minutes'; + const SECONDS: 'seconds'; + const MILLISECONDS: 'milliseconds'; + const YEARMONTH: 'yearmonth'; + const YEARMONTHDATE: 'yearmonthdate'; + const YEARMONTHDATEHOURS: 'yearmonthdatehours'; + const YEARMONTHDATEHOURSMINUTES: 'yearmonthdatehoursminutes'; + const YEARMONTHDATEHOURSMINUTESSECONDS: 'yearmonthdatehoursminutesseconds'; + const MONTHDATE: 'monthdate'; + const HOURSMINUTES: 'hoursminutes'; + const HOURSMINUTESSECONDS: 'hoursminutesseconds'; + const MINUTESSECONDS: 'minutesseconds'; + const SECONDSMILLISECONDS: 'secondsmilliseconds'; + const QUARTER: 'quarter'; + const YEARQUARTER: 'yearquarter'; + const QUARTERMONTH: 'quartermonth'; + const YEARQUARTERMONTH: 'yearquartermonth'; + const UTCYEAR: 'utcyear'; + const UTCMONTH: 'utcmonth'; + const UTCDAY: 'utcday'; + const UTCDATE: 'utcdate'; + const UTCHOURS: 'utchours'; + const UTCMINUTES: 'utcminutes'; + const UTCSECONDS: 'utcseconds'; + const UTCMILLISECONDS: 'utcmilliseconds'; + const UTCYEARMONTH: 'utcyearmonth'; + const UTCYEARMONTHDATE: 'utcyearmonthdate'; + const UTCYEARMONTHDATEHOURS: 'utcyearmonthdatehours'; + const UTCYEARMONTHDATEHOURSMINUTES: 'utcyearmonthdatehoursminutes'; + const UTCYEARMONTHDATEHOURSMINUTESSECONDS: 'utcyearmonthdatehoursminutesseconds'; + const UTCMONTHDATE: 'utcmonthdate'; + const UTCHOURSMINUTES: 'utchoursminutes'; + const UTCHOURSMINUTESSECONDS: 'utchoursminutesseconds'; + const UTCMINUTESSECONDS: 'utcminutesseconds'; + const UTCSECONDSMILLISECONDS: 'utcsecondsmilliseconds'; + const UTCQUARTER: 'utcquarter'; + const UTCYEARQUARTER: 'utcyearquarter'; + const UTCQUARTERMONTH: 'utcquartermonth'; + const UTCYEARQUARTERMONTH: 'utcyearquartermonth'; +} +export declare type LocalSingleTimeUnit = typeof TimeUnit.YEAR | typeof TimeUnit.QUARTER | typeof TimeUnit.MONTH | typeof TimeUnit.DAY | typeof TimeUnit.DATE | typeof TimeUnit.HOURS | typeof TimeUnit.MINUTES | typeof TimeUnit.SECONDS | typeof TimeUnit.MILLISECONDS; +export declare const TIMEUNIT_PARTS: LocalSingleTimeUnit[]; +export declare function isLocalSingleTimeUnit(timeUnit: string): timeUnit is LocalSingleTimeUnit; +export declare type UtcSingleTimeUnit = typeof TimeUnit.UTCYEAR | typeof TimeUnit.UTCQUARTER | typeof TimeUnit.UTCMONTH | typeof TimeUnit.UTCDAY | typeof TimeUnit.UTCDATE | typeof TimeUnit.UTCHOURS | typeof TimeUnit.UTCMINUTES | typeof TimeUnit.UTCSECONDS | typeof TimeUnit.UTCMILLISECONDS; +export declare function isUtcSingleTimeUnit(timeUnit: string): timeUnit is UtcSingleTimeUnit; +export declare type SingleTimeUnit = LocalSingleTimeUnit | UtcSingleTimeUnit; +export declare type LocalMultiTimeUnit = typeof TimeUnit.YEARQUARTER | typeof TimeUnit.YEARQUARTERMONTH | typeof TimeUnit.YEARMONTH | typeof TimeUnit.YEARMONTHDATE | typeof TimeUnit.YEARMONTHDATEHOURS | typeof TimeUnit.YEARMONTHDATEHOURSMINUTES | typeof TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS | typeof TimeUnit.QUARTERMONTH | typeof TimeUnit.MONTHDATE | typeof TimeUnit.HOURSMINUTES | typeof TimeUnit.HOURSMINUTESSECONDS | typeof TimeUnit.MINUTESSECONDS | typeof TimeUnit.SECONDSMILLISECONDS; +export declare type UtcMultiTimeUnit = typeof TimeUnit.UTCYEARQUARTER | typeof TimeUnit.UTCYEARQUARTERMONTH | typeof TimeUnit.UTCYEARMONTH | typeof TimeUnit.UTCYEARMONTHDATE | typeof TimeUnit.UTCYEARMONTHDATEHOURS | typeof TimeUnit.UTCYEARMONTHDATEHOURSMINUTES | typeof TimeUnit.UTCYEARMONTHDATEHOURSMINUTESSECONDS | typeof TimeUnit.UTCQUARTERMONTH | typeof TimeUnit.UTCMONTHDATE | typeof TimeUnit.UTCHOURSMINUTES | typeof TimeUnit.UTCHOURSMINUTESSECONDS | typeof TimeUnit.UTCMINUTESSECONDS | typeof TimeUnit.UTCSECONDSMILLISECONDS; +export declare type MultiTimeUnit = LocalMultiTimeUnit | UtcMultiTimeUnit; +export declare type LocalTimeUnit = LocalSingleTimeUnit | LocalMultiTimeUnit; +export declare type UtcTimeUnit = UtcSingleTimeUnit | UtcMultiTimeUnit; +export declare function isUTCTimeUnit(t: string): t is UtcTimeUnit; +export declare function getLocalTimeUnit(t: UtcTimeUnit): LocalTimeUnit; +export declare type TimeUnit = SingleTimeUnit | MultiTimeUnit; +export declare const TIMEUNITS: TimeUnit[]; +export declare function isTimeUnit(t: string): t is TimeUnit; +/** + * Converts a date to only have the measurements relevant to the specified unit + * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00' + * Note: the base date is Jan 01 1900 00:00:00 + */ +export declare function convert(unit: TimeUnit, date: Date): Date; +export declare function getTimeUnitParts(timeUnit: TimeUnit): any[]; +/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */ +export declare function containsTimeUnit(fullTimeUnit: TimeUnit, timeUnit: TimeUnit): boolean; +/** + * Returns Vega expresssion for a given timeUnit and fieldRef + */ +export declare function fieldExpr(fullTimeUnit: TimeUnit, field: string): string; +/** + * returns the signal expression used for axis labels for a time unit + */ +export declare function formatExpression(timeUnit: TimeUnit, field: string, shortTimeLabels: boolean, isUTCScale: boolean): string; +export declare function normalizeTimeUnit(timeUnit: TimeUnit): TimeUnit; diff --git a/build/src/timeunit.js b/build/src/timeunit.js new file mode 100644 index 0000000000..79ef48e420 --- /dev/null +++ b/build/src/timeunit.js @@ -0,0 +1,300 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var datetime_1 = require("./datetime"); +var log = tslib_1.__importStar(require("./log")); +var util_1 = require("./util"); +var TimeUnit; +(function (TimeUnit) { + TimeUnit.YEAR = 'year'; + TimeUnit.MONTH = 'month'; + TimeUnit.DAY = 'day'; + TimeUnit.DATE = 'date'; + TimeUnit.HOURS = 'hours'; + TimeUnit.MINUTES = 'minutes'; + TimeUnit.SECONDS = 'seconds'; + TimeUnit.MILLISECONDS = 'milliseconds'; + TimeUnit.YEARMONTH = 'yearmonth'; + TimeUnit.YEARMONTHDATE = 'yearmonthdate'; + TimeUnit.YEARMONTHDATEHOURS = 'yearmonthdatehours'; + TimeUnit.YEARMONTHDATEHOURSMINUTES = 'yearmonthdatehoursminutes'; + TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS = 'yearmonthdatehoursminutesseconds'; + // MONTHDATE always include 29 February since we use year 0th (which is a leap year); + TimeUnit.MONTHDATE = 'monthdate'; + TimeUnit.HOURSMINUTES = 'hoursminutes'; + TimeUnit.HOURSMINUTESSECONDS = 'hoursminutesseconds'; + TimeUnit.MINUTESSECONDS = 'minutesseconds'; + TimeUnit.SECONDSMILLISECONDS = 'secondsmilliseconds'; + TimeUnit.QUARTER = 'quarter'; + TimeUnit.YEARQUARTER = 'yearquarter'; + TimeUnit.QUARTERMONTH = 'quartermonth'; + TimeUnit.YEARQUARTERMONTH = 'yearquartermonth'; + TimeUnit.UTCYEAR = 'utcyear'; + TimeUnit.UTCMONTH = 'utcmonth'; + TimeUnit.UTCDAY = 'utcday'; + TimeUnit.UTCDATE = 'utcdate'; + TimeUnit.UTCHOURS = 'utchours'; + TimeUnit.UTCMINUTES = 'utcminutes'; + TimeUnit.UTCSECONDS = 'utcseconds'; + TimeUnit.UTCMILLISECONDS = 'utcmilliseconds'; + TimeUnit.UTCYEARMONTH = 'utcyearmonth'; + TimeUnit.UTCYEARMONTHDATE = 'utcyearmonthdate'; + TimeUnit.UTCYEARMONTHDATEHOURS = 'utcyearmonthdatehours'; + TimeUnit.UTCYEARMONTHDATEHOURSMINUTES = 'utcyearmonthdatehoursminutes'; + TimeUnit.UTCYEARMONTHDATEHOURSMINUTESSECONDS = 'utcyearmonthdatehoursminutesseconds'; + // MONTHDATE always include 29 February since we use year 0th (which is a leap year); + TimeUnit.UTCMONTHDATE = 'utcmonthdate'; + TimeUnit.UTCHOURSMINUTES = 'utchoursminutes'; + TimeUnit.UTCHOURSMINUTESSECONDS = 'utchoursminutesseconds'; + TimeUnit.UTCMINUTESSECONDS = 'utcminutesseconds'; + TimeUnit.UTCSECONDSMILLISECONDS = 'utcsecondsmilliseconds'; + TimeUnit.UTCQUARTER = 'utcquarter'; + TimeUnit.UTCYEARQUARTER = 'utcyearquarter'; + TimeUnit.UTCQUARTERMONTH = 'utcquartermonth'; + TimeUnit.UTCYEARQUARTERMONTH = 'utcyearquartermonth'; +})(TimeUnit = exports.TimeUnit || (exports.TimeUnit = {})); +/** Time Unit that only corresponds to only one part of Date objects. */ +var LOCAL_SINGLE_TIMEUNIT_INDEX = { + year: 1, + quarter: 1, + month: 1, + day: 1, + date: 1, + hours: 1, + minutes: 1, + seconds: 1, + milliseconds: 1 +}; +exports.TIMEUNIT_PARTS = util_1.flagKeys(LOCAL_SINGLE_TIMEUNIT_INDEX); +function isLocalSingleTimeUnit(timeUnit) { + return !!LOCAL_SINGLE_TIMEUNIT_INDEX[timeUnit]; +} +exports.isLocalSingleTimeUnit = isLocalSingleTimeUnit; +var UTC_SINGLE_TIMEUNIT_INDEX = { + utcyear: 1, + utcquarter: 1, + utcmonth: 1, + utcday: 1, + utcdate: 1, + utchours: 1, + utcminutes: 1, + utcseconds: 1, + utcmilliseconds: 1 +}; +function isUtcSingleTimeUnit(timeUnit) { + return !!UTC_SINGLE_TIMEUNIT_INDEX[timeUnit]; +} +exports.isUtcSingleTimeUnit = isUtcSingleTimeUnit; +var LOCAL_MULTI_TIMEUNIT_INDEX = { + yearquarter: 1, + yearquartermonth: 1, + yearmonth: 1, + yearmonthdate: 1, + yearmonthdatehours: 1, + yearmonthdatehoursminutes: 1, + yearmonthdatehoursminutesseconds: 1, + quartermonth: 1, + monthdate: 1, + hoursminutes: 1, + hoursminutesseconds: 1, + minutesseconds: 1, + secondsmilliseconds: 1 +}; +var UTC_MULTI_TIMEUNIT_INDEX = { + utcyearquarter: 1, + utcyearquartermonth: 1, + utcyearmonth: 1, + utcyearmonthdate: 1, + utcyearmonthdatehours: 1, + utcyearmonthdatehoursminutes: 1, + utcyearmonthdatehoursminutesseconds: 1, + utcquartermonth: 1, + utcmonthdate: 1, + utchoursminutes: 1, + utchoursminutesseconds: 1, + utcminutesseconds: 1, + utcsecondsmilliseconds: 1 +}; +var UTC_TIMEUNIT_INDEX = tslib_1.__assign({}, UTC_SINGLE_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX); +function isUTCTimeUnit(t) { + return !!UTC_TIMEUNIT_INDEX[t]; +} +exports.isUTCTimeUnit = isUTCTimeUnit; +function getLocalTimeUnit(t) { + return t.substr(3); +} +exports.getLocalTimeUnit = getLocalTimeUnit; +var TIMEUNIT_INDEX = tslib_1.__assign({}, LOCAL_SINGLE_TIMEUNIT_INDEX, UTC_SINGLE_TIMEUNIT_INDEX, LOCAL_MULTI_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX); +exports.TIMEUNITS = util_1.flagKeys(TIMEUNIT_INDEX); +function isTimeUnit(t) { + return !!TIMEUNIT_INDEX[t]; +} +exports.isTimeUnit = isTimeUnit; +var SET_DATE_METHOD = { + year: 'setFullYear', + month: 'setMonth', + date: 'setDate', + hours: 'setHours', + minutes: 'setMinutes', + seconds: 'setSeconds', + milliseconds: 'setMilliseconds', + // Day and quarter have their own special cases + quarter: null, + day: null, +}; +/** + * Converts a date to only have the measurements relevant to the specified unit + * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00' + * Note: the base date is Jan 01 1900 00:00:00 + */ +function convert(unit, date) { + var isUTC = isUTCTimeUnit(unit); + var result = isUTC ? + // start with uniform date + new Date(Date.UTC(0, 0, 1, 0, 0, 0, 0)) : + new Date(0, 0, 1, 0, 0, 0, 0); + for (var _i = 0, TIMEUNIT_PARTS_1 = exports.TIMEUNIT_PARTS; _i < TIMEUNIT_PARTS_1.length; _i++) { + var timeUnitPart = TIMEUNIT_PARTS_1[_i]; + if (containsTimeUnit(unit, timeUnitPart)) { + switch (timeUnitPart) { + case TimeUnit.DAY: + throw new Error('Cannot convert to TimeUnits containing \'day\''); + case TimeUnit.QUARTER: { + var _a = dateMethods('month', isUTC), getDateMethod_1 = _a.getDateMethod, setDateMethod_1 = _a.setDateMethod; + // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3) + result[setDateMethod_1]((Math.floor(date[getDateMethod_1]() / 3)) * 3); + break; + } + default: + var _b = dateMethods(timeUnitPart, isUTC), getDateMethod = _b.getDateMethod, setDateMethod = _b.setDateMethod; + result[setDateMethod](date[getDateMethod]()); + } + } + } + return result; +} +exports.convert = convert; +function dateMethods(singleUnit, isUtc) { + var rawSetDateMethod = SET_DATE_METHOD[singleUnit]; + var setDateMethod = isUtc ? 'setUTC' + rawSetDateMethod.substr(3) : rawSetDateMethod; + var getDateMethod = 'get' + (isUtc ? 'UTC' : '') + rawSetDateMethod.substr(3); + return { setDateMethod: setDateMethod, getDateMethod: getDateMethod }; +} +function getTimeUnitParts(timeUnit) { + return exports.TIMEUNIT_PARTS.reduce(function (parts, part) { + if (containsTimeUnit(timeUnit, part)) { + return parts.concat(part); + } + return parts; + }, []); +} +exports.getTimeUnitParts = getTimeUnitParts; +/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */ +function containsTimeUnit(fullTimeUnit, timeUnit) { + var index = fullTimeUnit.indexOf(timeUnit); + return index > -1 && + (timeUnit !== TimeUnit.SECONDS || + index === 0 || + fullTimeUnit.charAt(index - 1) !== 'i' // exclude milliseconds + ); +} +exports.containsTimeUnit = containsTimeUnit; +/** + * Returns Vega expresssion for a given timeUnit and fieldRef + */ +function fieldExpr(fullTimeUnit, field) { + var fieldRef = util_1.accessPathWithDatum(field); + var utc = isUTCTimeUnit(fullTimeUnit) ? 'utc' : ''; + function func(timeUnit) { + if (timeUnit === TimeUnit.QUARTER) { + // quarter starting at 0 (0,3,6,9). + return "(" + utc + "quarter(" + fieldRef + ")-1)"; + } + else { + return "" + utc + timeUnit + "(" + fieldRef + ")"; + } + } + var d = exports.TIMEUNIT_PARTS.reduce(function (dateExpr, tu) { + if (containsTimeUnit(fullTimeUnit, tu)) { + dateExpr[tu] = func(tu); + } + return dateExpr; + }, {}); + return datetime_1.dateTimeExpr(d); +} +exports.fieldExpr = fieldExpr; +/** + * returns the signal expression used for axis labels for a time unit + */ +function formatExpression(timeUnit, field, shortTimeLabels, isUTCScale) { + if (!timeUnit) { + return undefined; + } + var dateComponents = []; + var expression = ''; + var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR); + if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) { + // special expression for quarter as prefix + expression = "'Q' + quarter(" + field + ")"; + } + if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) { + // By default use short month name + dateComponents.push(shortTimeLabels !== false ? '%b' : '%B'); + } + if (containsTimeUnit(timeUnit, TimeUnit.DAY)) { + dateComponents.push(shortTimeLabels ? '%a' : '%A'); + } + else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) { + dateComponents.push('%d' + (hasYear ? ',' : '')); // add comma if there is year + } + if (hasYear) { + dateComponents.push(shortTimeLabels ? '%y' : '%Y'); + } + var timeComponents = []; + if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) { + timeComponents.push('%H'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) { + timeComponents.push('%M'); + } + if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) { + timeComponents.push('%S'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) { + timeComponents.push('%L'); + } + var dateTimeComponents = []; + if (dateComponents.length > 0) { + dateTimeComponents.push(dateComponents.join(' ')); + } + if (timeComponents.length > 0) { + dateTimeComponents.push(timeComponents.join(':')); + } + if (dateTimeComponents.length > 0) { + if (expression) { + // Add space between quarter and main time format + expression += " + ' ' + "; + } + // We only use utcFormat for utc scale + // For utc time units, the data is already converted as a part of timeUnit transform. + // Thus, utc time units should use timeFormat to avoid shifting the time twice. + if (isUTCScale) { + expression += "utcFormat(" + field + ", '" + dateTimeComponents.join(' ') + "')"; + } + else { + expression += "timeFormat(" + field + ", '" + dateTimeComponents.join(' ') + "')"; + } + } + // If expression is still an empty string, return undefined instead. + return expression || undefined; +} +exports.formatExpression = formatExpression; +function normalizeTimeUnit(timeUnit) { + if (timeUnit !== 'day' && timeUnit.indexOf('day') >= 0) { + log.warn(log.message.dayReplacedWithDate(timeUnit)); + return timeUnit.replace('day', 'date'); + } + return timeUnit; +} +exports.normalizeTimeUnit = normalizeTimeUnit; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGltZXVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQXNEO0FBQ3RELGlEQUE2QjtBQUM3QiwrQkFBMkQ7QUFFM0QsSUFBaUIsUUFBUSxDQWlEeEI7QUFqREQsV0FBaUIsUUFBUTtJQUNWLGFBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsY0FBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixZQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGFBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsY0FBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixnQkFBTyxHQUFjLFNBQVMsQ0FBQztJQUMvQixnQkFBTyxHQUFjLFNBQVMsQ0FBQztJQUMvQixxQkFBWSxHQUFtQixjQUFjLENBQUM7SUFDOUMsa0JBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLHNCQUFhLEdBQW9CLGVBQWUsQ0FBQztJQUNqRCwyQkFBa0IsR0FBeUIsb0JBQW9CLENBQUM7SUFDaEUsa0NBQXlCLEdBQWdDLDJCQUEyQixDQUFDO0lBQ3JGLHlDQUFnQyxHQUF1QyxrQ0FBa0MsQ0FBQztJQUV2SCxxRkFBcUY7SUFDeEUsa0JBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLHFCQUFZLEdBQW1CLGNBQWMsQ0FBQztJQUM5Qyw0QkFBbUIsR0FBMEIscUJBQXFCLENBQUM7SUFDbkUsdUJBQWMsR0FBcUIsZ0JBQWdCLENBQUM7SUFDcEQsNEJBQW1CLEdBQTBCLHFCQUFxQixDQUFDO0lBQ25FLGdCQUFPLEdBQWMsU0FBUyxDQUFDO0lBQy9CLG9CQUFXLEdBQWtCLGFBQWEsQ0FBQztJQUMzQyxxQkFBWSxHQUFtQixjQUFjLENBQUM7SUFDOUMseUJBQWdCLEdBQXVCLGtCQUFrQixDQUFDO0lBQzFELGdCQUFPLEdBQWMsU0FBUyxDQUFDO0lBQy9CLGlCQUFRLEdBQWUsVUFBVSxDQUFDO0lBQ2xDLGVBQU0sR0FBYSxRQUFR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LDRDQXNFQztBQUVELDJCQUFrQyxRQUFrQjtJQUNsRCxJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdEQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQWEsQ0FBQztLQUNwRDtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFORCw4Q0FNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVRpbWVFeHByLCBkYXRlVGltZUV4cHJ9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7YWNjZXNzUGF0aFdpdGhEYXR1bSwgRmxhZywgZmxhZ0tleXN9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgVGltZVVuaXQge1xuICBleHBvcnQgY29uc3QgWUVBUjogJ3llYXInID0gJ3llYXInO1xuICBleHBvcnQgY29uc3QgTU9OVEg6ICdtb250aCcgPSAnbW9udGgnO1xuICBleHBvcnQgY29uc3QgREFZOiAnZGF5JyA9ICdkYXknO1xuICBleHBvcnQgY29uc3QgREFURTogJ2RhdGUnID0gJ2RhdGUnO1xuICBleHBvcnQgY29uc3QgSE9VUlM6ICdob3VycycgPSAnaG91cnMnO1xuICBleHBvcnQgY29uc3QgTUlOVVRFUzogJ21pbnV0ZXMnID0gJ21pbnV0ZXMnO1xuICBleHBvcnQgY29uc3QgU0VDT05EUzogJ3NlY29uZHMnID0gJ3NlY29uZHMnO1xuICBleHBvcnQgY29uc3QgTUlMTElTRUNPTkRTOiAnbWlsbGlzZWNvbmRzJyA9ICdtaWxsaXNlY29uZHMnO1xuICBleHBvcnQgY29uc3QgWUVBUk1PTlRIOiAneWVhcm1vbnRoJyA9ICd5ZWFybW9udGgnO1xuICBleHBvcnQgY29uc3QgWUVBUk1PTlRIREFURTogJ3llYXJtb250aGRhdGUnID0gJ3llYXJtb250aGRhdGUnO1xuICBleHBvcnQgY29uc3QgWUVBUk1PTlRIREFURUhPVVJTOiAneWVhcm1vbnRoZGF0ZWhvdXJzJyA9ICd5ZWFybW9udGhkYXRlaG91cnMnO1xuICBleHBvcnQgY29uc3QgWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFUzogJ3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXMnID0gJ3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXMnO1xuICBleHBvcnQgY29uc3QgWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU1NFQ09ORFM6ICd5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzc2Vjb25kcycgPSAneWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlc3NlY29uZHMnO1xuXG4gIC8vIE1PTlRIREFURSBhbHdheXMgaW5jbHVkZSAyOSBGZWJydWFyeSBzaW5jZSB3ZSB1c2UgeWVhciAwdGggKHdoaWNoIGlzIGEgbGVhcCB5ZWFyKTtcbiAgZXhwb3J0IGNvbnN0IE1PTlRIREFURTogJ21vbnRoZGF0ZScgPSAnbW9udGhkYXRlJztcbiAgZXhwb3J0IGNvbnN0IEhPVVJTTUlOVVRFUzogJ2hvdXJzbWludXRlcycgPSAnaG91cnNtaW51dGVzJztcbiAgZXhwb3J0IGNvbnN0IEhPVVJTTUlOVVRFU1NFQ09ORFM6ICdob3Vyc21pbnV0ZXNzZWNvbmRzJyA9ICdob3Vyc21pbnV0ZXNzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IE1JTlVURVNTRUNPTkRTOiAnbWludXRlc3NlY29uZHMnID0gJ21pbnV0ZXNzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFNFQ09ORFNNSUxMSVNFQ09ORFM6ICdzZWNvbmRzbWlsbGlzZWNvbmRzJyA9ICdzZWNvbmRzbWlsbGlzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFFVQVJURVI6ICdxdWFydGVyJyA9ICdxdWFydGVyJztcbiAgZXhwb3J0IGNvbnN0IFlFQVJRVUFSVEVSOiAneWVhcnF1YXJ0ZXInID0gJ3llYXJxdWFydGVyJztcbiAgZXhwb3J0IGNvbnN0IFFVQVJURVJNT05USDogJ3F1YXJ0ZXJtb250aCcgPSAncXVhcnRlcm1vbnRoJztcbiAgZXhwb3J0IGNvbnN0IFlFQVJRVUFSVEVSTU9OVEg6ICd5ZWFycXVhcnRlcm1vbnRoJyA9ICd5ZWFycXVhcnRlcm1vbnRoJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVI6ICd1dGN5ZWFyJyA9ICd1dGN5ZWFyJztcbiAgZXhwb3J0IGNvbnN0IFVUQ01PTlRIOiAndXRjbW9udGgnID0gJ3V0Y21vbnRoJztcbiAgZXhwb3J0IGNvbnN0IFVUQ0RBWTogJ3V0Y2RheScgPSAndXRjZGF5JztcbiAgZXhwb3J0IGNvbnN0IFVUQ0RBVEU6ICd1dGNkYXRlJyA9ICd1dGNkYXRlJztcbiAgZXhwb3J0IGNvbnN0IFVUQ0hPVVJTOiAndXRjaG91cnMnID0gJ3V0Y2hvdXJzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ01JTlVURVM6ICd1dGNtaW51dGVzJyA9ICd1dGNtaW51dGVzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1NFQ09ORFM6ICd1dGNzZWNvbmRzJyA9ICd1dGNzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ01JTExJU0VDT05EUzogJ3V0Y21pbGxpc2Vjb25kcycgPSAndXRjbWlsbGlzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJNT05USDogJ3V0Y3llYXJtb250aCcgPSAndXRjeWVhcm1vbnRoJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJNT05USERBVEU6ICd1dGN5ZWFybW9udGhkYXRlJyA9ICd1dGN5ZWFybW9udGhkYXRlJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJNT05USERBVEVIT1VSUzogJ3V0Y3llYXJtb250aGRhdGVob3VycycgPSAndXRjeWVhcm1vbnRoZGF0ZWhvdXJzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJNT05USERBVEVIT1VSU01JTlVURVM6ICd1dGN5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzJyA9ICd1dGN5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTOiAndXRjeWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlc3NlY29uZHMnID0gJ3V0Y3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXNzZWNvbmRzJztcblxuICAvLyBNT05USERBVEUgYWx3YXlzIGluY2x1ZGUgMjkgRmVicnVhcnkgc2luY2Ugd2UgdXNlIHllYXIgMHRoICh3aGljaCBpcyBhIGxlYXAgeWVhcik7XG4gIGV4cG9ydCBjb25zdCBVVENNT05USERBVEU6ICd1dGNtb250aGRhdGUnID0gJ3V0Y21vbnRoZGF0ZSc7XG4gIGV4cG9ydCBjb25zdCBVVENIT1VSU01JTlVURVM6ICd1dGNob3Vyc21pbnV0ZXMnID0gJ3V0Y2hvdXJzbWludXRlcyc7XG4gIGV4cG9ydCBjb25zdCBVVENIT1VSU01JTlVURVNTRUNPTkRTOiAndXRjaG91cnNtaW51dGVzc2Vjb25kcycgPSAndXRjaG91cnNtaW51dGVzc2Vjb25kcyc7XG4gIGV4cG9ydCBjb25zdCBVVENNSU5VVEVTU0VDT05EUzogJ3V0Y21pbnV0ZXNzZWNvbmRzJyA9ICd1dGNtaW51dGVzc2Vjb25kcyc7XG4gIGV4cG9ydCBjb25zdCBVVENTRUNPTkRTTUlMTElTRUNPTkRTOiAndXRjc2Vjb25kc21pbGxpc2Vjb25kcycgPSAndXRjc2Vjb25kc21pbGxpc2Vjb25kcyc7XG4gIGV4cG9ydCBjb25zdCBVVENRVUFSVEVSOiAndXRjcXVhcnRlcicgPSAndXRjcXVhcnRlcic7XG4gIGV4cG9ydCBjb25zdCBVVENZRUFSUVVBUlRFUjogJ3V0Y3llYXJxdWFydGVyJyA9ICd1dGN5ZWFycXVhcnRlcic7XG4gIGV4cG9ydCBjb25zdCBVVENRVUFSVEVSTU9OVEg6ICd1dGNxdWFydGVybW9udGgnID0gJ3V0Y3F1YXJ0ZXJtb250aCc7XG4gIGV4cG9ydCBjb25zdCBVVENZRUFSUVVBUlRFUk1PTlRIOiAndXRjeWVhcnF1YXJ0ZXJtb250aCcgPSAndXRjeWVhcnF1YXJ0ZXJtb250aCc7XG59XG5cbmV4cG9ydCB0eXBlIExvY2FsU2luZ2xlVGltZVVuaXQgPVxuICB0eXBlb2YgVGltZVVuaXQuWUVBUiB8XG4gIHR5cGVvZiBUaW1lVW5pdC5RVUFSVEVSIHxcbiAgdHlwZW9mIFRpbWVVbml0Lk1PTlRIIHxcbiAgdHlwZW9mIFRpbWVVbml0LkRBWSB8XG4gIHR5cGVvZiBUaW1lVW5pdC5EQVRFIHxcbiAgdHlwZW9mIFRpbWVVbml0LkhPVVJTIHxcbiAgdHlwZW9mIFRpbWVVbml0Lk1JTlVURVMgfFxuICB0eXBlb2YgVGltZVVuaXQuU0VDT05EUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7XG5cbi8qKiBUaW1lIFVuaXQgdGhhdCBvbmx5IGNvcnJlc3BvbmRzIHRvIG9ubHkgb25lIHBhcnQgb2YgRGF0ZSBvYmplY3RzLiAqL1xuY29uc3QgTE9DQUxfU0lOR0xFX1RJTUVVTklUX0lOREVYOiBGbGFnPExvY2FsU2luZ2xlVGltZVVuaXQ+ID0ge1xuICB5ZWFyOiAxLFxuICBxdWFydGVyOiAxLFxuICBtb250aDogMSxcbiAgZGF5OiAxLFxuICBkYXRlOiAxLFxuICBob3VyczogMSxcbiAgbWludXRlczogMSxcbiAgc2Vjb25kczogMSxcbiAgbWlsbGlzZWNvbmRzOiAxXG59O1xuXG5leHBvcnQgY29uc3QgVElNRVVOSVRfUEFSVFMgPSBmbGFnS2V5cyhMT0NBTF9TSU5HTEVfVElNRVVOSVRfSU5ERVgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2NhbFNpbmdsZVRpbWVVbml0KHRpbWVVbml0OiBzdHJpbmcpOiB0aW1lVW5pdCBpcyBMb2NhbFNpbmdsZVRpbWVVbml0IHtcbiAgcmV0dXJuICEhTE9DQUxfU0lOR0xFX1RJTUVVTklUX0lOREVYW3RpbWVVbml0XTtcbn1cblxuZXhwb3J0IHR5cGUgVXRjU2luZ2xlVGltZVVuaXQgPVxuICB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUiB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENRVUFSVEVSIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ01PTlRIIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ0RBWSB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENEQVRFIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ0hPVVJTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ01JTlVURVMgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDU0VDT05EUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENNSUxMSVNFQ09ORFM7XG5cbmNvbnN0IFVUQ19TSU5HTEVfVElNRVVOSVRfSU5ERVg6IEZsYWc8VXRjU2luZ2xlVGltZVVuaXQ+ID0ge1xuICB1dGN5ZWFyOiAxLFxuICB1dGNxdWFydGVyOiAxLFxuICB1dGNtb250aDogMSxcbiAgdXRjZGF5OiAxLFxuICB1dGNkYXRlOiAxLFxuICB1dGNob3VyczogMSxcbiAgdXRjbWludXRlczogMSxcbiAgdXRjc2Vjb25kczogMSxcbiAgdXRjbWlsbGlzZWNvbmRzOiAxXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVdGNTaW5nbGVUaW1lVW5pdCh0aW1lVW5pdDogc3RyaW5nKTogdGltZVVuaXQgaXMgVXRjU2luZ2xlVGltZVVuaXQge1xuICByZXR1cm4gISFVVENfU0lOR0xFX1RJTUVVTklUX0lOREVYW3RpbWVVbml0XTtcbn1cblxuZXhwb3J0IHR5cGUgU2luZ2xlVGltZVVuaXQgPSBMb2NhbFNpbmdsZVRpbWVVbml0IHwgVXRjU2luZ2xlVGltZVVuaXQ7XG5cbmV4cG9ydCB0eXBlIExvY2FsTXVsdGlUaW1lVW5pdCA9XG4gIC8vIExvY2FsIFRpbWVcbiAgdHlwZW9mIFRpbWVVbml0LllFQVJRVUFSVEVSIHwgdHlwZW9mIFRpbWVVbml0LllFQVJRVUFSVEVSTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuWUVBUk1PTlRIIHwgdHlwZW9mIFRpbWVVbml0LllFQVJNT05USERBVEUgfCB0eXBlb2YgVGltZVVuaXQuWUVBUk1PTlRIREFURUhPVVJTIHwgdHlwZW9mIFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSU01JTlVURVN8IHR5cGVvZiBUaW1lVW5pdC5ZRUFSTU9OVEhEQVRFSE9VUlNNSU5VVEVTU0VDT05EUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5RVUFSVEVSTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuTU9OVEhEQVRFIHxcbiAgdHlwZW9mIFRpbWVVbml0LkhPVVJTTUlOVVRFUyB8IHR5cGVvZiBUaW1lVW5pdC5IT1VSU01JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0Lk1JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlNFQ09ORFNNSUxMSVNFQ09ORFM7XG5cbmNvbnN0IExPQ0FMX01VTFRJX1RJTUVVTklUX0lOREVYOiBGbGFnPExvY2FsTXVsdGlUaW1lVW5pdD4gPSB7XG4gIHllYXJxdWFydGVyOiAxLFxuICB5ZWFycXVhcnRlcm1vbnRoOiAxLFxuXG4gIHllYXJtb250aDogMSxcbiAgeWVhcm1vbnRoZGF0ZTogMSxcbiAgeWVhcm1vbnRoZGF0ZWhvdXJzOiAxLFxuICB5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzOiAxLFxuICB5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzc2Vjb25kczogMSxcblxuICBxdWFydGVybW9udGg6IDEsXG5cbiAgbW9udGhkYXRlOiAxLFxuXG4gIGhvdXJzbWludXRlczogMSxcbiAgaG91cnNtaW51dGVzc2Vjb25kczogMSxcblxuICBtaW51dGVzc2Vjb25kczogMSxcblxuICBzZWNvbmRzbWlsbGlzZWNvbmRzOiAxXG59O1xuXG5leHBvcnQgdHlwZSBVdGNNdWx0aVRpbWVVbml0ID1cbiAgdHlwZW9mIFRpbWVVbml0LlVUQ1lFQVJRVUFSVEVSIHwgdHlwZW9mIFRpbWVVbml0LlVUQ1lFQVJRVUFSVEVSTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUk1PTlRIIHwgdHlwZW9mIFRpbWVVbml0LlVUQ1lFQVJNT05USERBVEUgfCB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUk1PTlRIREFURUhPVVJTIHwgdHlwZW9mIFRpbWVVbml0LlVUQ1lFQVJNT05USERBVEVIT1VSU01JTlVURVN8IHR5cGVvZiBUaW1lVW5pdC5VVENZRUFSTU9OVEhEQVRFSE9VUlNNSU5VVEVTU0VDT05EUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENRVUFSVEVSTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDTU9OVEhEQVRFIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ0hPVVJTTUlOVVRFUyB8IHR5cGVvZiBUaW1lVW5pdC5VVENIT1VSU01JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ01JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ1NFQ09ORFNNSUxMSVNFQ09ORFM7XG5cbmNvbnN0IFVUQ19NVUxUSV9USU1FVU5JVF9JTkRFWDogRmxhZzxVdGNNdWx0aVRpbWVVbml0PiA9IHtcbiAgdXRjeWVhcnF1YXJ0ZXI6IDEsXG4gIHV0Y3llYXJxdWFydGVybW9udGg6IDEsXG5cbiAgdXRjeWVhcm1vbnRoOiAxLFxuICB1dGN5ZWFybW9udGhkYXRlOiAxLFxuICB1dGN5ZWFybW9udGhkYXRlaG91cnM6IDEsXG4gIHV0Y3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXM6IDEsXG4gIHV0Y3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIHV0Y3F1YXJ0ZXJtb250aDogMSxcblxuICB1dGNtb250aGRhdGU6IDEsXG5cbiAgdXRjaG91cnNtaW51dGVzOiAxLFxuICB1dGNob3Vyc21pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIHV0Y21pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIHV0Y3NlY29uZHNtaWxsaXNlY29uZHM6IDFcbn07XG5cbmV4cG9ydCB0eXBlIE11bHRpVGltZVVuaXQgPSBMb2NhbE11bHRpVGltZVVuaXQgfCBVdGNNdWx0aVRpbWVVbml0O1xuXG5cbmV4cG9ydCB0eXBlIExvY2FsVGltZVVuaXQgPSBMb2NhbFNpbmdsZVRpbWVVbml0IHwgTG9jYWxNdWx0aVRpbWVVbml0O1xuZXhwb3J0IHR5cGUgVXRjVGltZVVuaXQgPSBVdGNTaW5nbGVUaW1lVW5pdCB8IFV0Y011bHRpVGltZVVuaXQ7XG5cbmNvbnN0IFVUQ19USU1FVU5JVF9JTkRFWDogRmxhZzxVdGNUaW1lVW5pdD4gPSB7XG4gIC4uLlVUQ19TSU5HTEVfVElNRVVOSVRfSU5ERVgsXG4gIC4uLlVUQ19NVUxUSV9USU1FVU5JVF9JTkRFWFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVVRDVGltZVVuaXQodDogc3RyaW5nKTogdCBpcyBVdGNUaW1lVW5pdCB7XG4gIHJldHVybiAhIVVUQ19USU1FVU5JVF9JTkRFWFt0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2FsVGltZVVuaXQodDogVXRjVGltZVVuaXQpOiBMb2NhbFRpbWVVbml0IHtcbiAgcmV0dXJuIHQuc3Vic3RyKDMpIGFzIExvY2FsVGltZVVuaXQ7XG59XG5cbmV4cG9ydCB0eXBlIFRpbWVVbml0ID0gU2luZ2xlVGltZVVuaXQgfCBNdWx0aVRpbWVVbml0O1xuXG5jb25zdCBUSU1FVU5JVF9JTkRFWDogRmxhZzxUaW1lVW5pdD4gPSB7XG4gIC4uLkxPQ0FMX1NJTkdMRV9USU1FVU5JVF9JTkRFWCxcbiAgLi4uVVRDX1NJTkdMRV9USU1FVU5JVF9JTkRFWCxcbiAgLi4uTE9DQUxfTVVMVElfVElNRVVOSVRfSU5ERVgsXG4gIC4uLlVUQ19NVUxUSV9USU1FVU5JVF9JTkRFWFxufTtcblxuZXhwb3J0IGNvbnN0IFRJTUVVTklUUyA9IGZsYWdLZXlzKFRJTUVVTklUX0lOREVYKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZVVuaXQodDogc3RyaW5nKTogdCBpcyBUaW1lVW5pdCB7XG4gIHJldHVybiAhIVRJTUVVTklUX0lOREVYW3RdO1xufVxuXG50eXBlIERhdGVNZXRob2ROYW1lID0ga2V5b2YgRGF0ZTtcblxuY29uc3QgU0VUX0RBVEVfTUVUSE9EOiBSZWNvcmQ8TG9jYWxTaW5nbGVUaW1lVW5pdCwgRGF0ZU1ldGhvZE5hbWU+ID0ge1xuICB5ZWFyOiAnc2V0RnVsbFllYXInLFxuICBtb250aDogJ3NldE1vbnRoJyxcbiAgZGF0ZTogJ3NldERhdGUnLFxuICBob3VyczogJ3NldEhvdXJzJyxcbiAgbWludXRlczogJ3NldE1pbnV0ZXMnLFxuICBzZWNvbmRzOiAnc2V0U2Vjb25kcycsXG4gIG1pbGxpc2Vjb25kczogJ3NldE1pbGxpc2Vjb25kcycsXG4gIC8vIERheSBhbmQgcXVhcnRlciBoYXZlIHRoZWlyIG93biBzcGVjaWFsIGNhc2VzXG4gIHF1YXJ0ZXI6IG51bGwsXG4gIGRheTogbnVsbCxcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSBkYXRlIHRvIG9ubHkgaGF2ZSB0aGUgbWVhc3VyZW1lbnRzIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgdW5pdFxuICogaS5lLiAoJ3llYXJtb250aCcsICcyMDAwLTEyLTA0IDA3OjU4OjE0JykgLT4gJzIwMDAtMTItMDEgMDA6MDA6MDAnXG4gKiBOb3RlOiB0aGUgYmFzZSBkYXRlIGlzIEphbiAwMSAxOTAwIDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0KHVuaXQ6IFRpbWVVbml0LCBkYXRlOiBEYXRlKTogRGF0ZSB7XG4gIGNvbnN0IGlzVVRDID0gaXNVVENUaW1lVW5pdCh1bml0KTtcbiAgY29uc3QgcmVzdWx0OiBEYXRlID0gaXNVVEMgP1xuICAgIC8vIHN0YXJ0IHdpdGggdW5pZm9ybSBkYXRlXG4gICAgbmV3IERhdGUoRGF0ZS5VVEMoMCwgMCwgMSwgMCwgMCwgMCwgMCkpIDpcbiAgICBuZXcgRGF0ZSgwLCAwLCAxLCAwLCAwLCAwLCAwKTtcbiAgICBmb3IgKGNvbnN0IHRpbWVVbml0UGFydCBvZiBUSU1FVU5JVF9QQVJUUykge1xuICAgIGlmIChjb250YWluc1RpbWVVbml0KHVuaXQsIHRpbWVVbml0UGFydCkpIHtcbiAgICAgIHN3aXRjaCAodGltZVVuaXRQYXJ0KSB7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuREFZOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gVGltZVVuaXRzIGNvbnRhaW5pbmcgXFwnZGF5XFwnJyk7XG4gICAgICAgIGNhc2UgVGltZVVuaXQuUVVBUlRFUjoge1xuICAgICAgICAgIGNvbnN0IHtnZXREYXRlTWV0aG9kLCBzZXREYXRlTWV0aG9kfSA9IGRhdGVNZXRob2RzKCdtb250aCcsIGlzVVRDKTtcbiAgICAgICAgICAvLyBpbmRpY2F0ZSBxdWFydGVyIGJ5IHNldHRpbmcgbW9udGggdG8gYmUgdGhlIGZpcnN0IG9mIHRoZSBxdWFydGVyIGkuZS4gbWF5ICg0KSAtPiBhcHJpbCAoMylcbiAgICAgICAgICByZXN1bHRbc2V0RGF0ZU1ldGhvZF0oKE1hdGguZmxvb3IoZGF0ZVtnZXREYXRlTWV0aG9kXSgpIC8gMykpICogMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zdCB7Z2V0RGF0ZU1ldGhvZCwgc2V0RGF0ZU1ldGhvZH0gPSBkYXRlTWV0aG9kcyh0aW1lVW5pdFBhcnQsIGlzVVRDKTtcbiAgICAgICAgICByZXN1bHRbc2V0RGF0ZU1ldGhvZF0oZGF0ZVtnZXREYXRlTWV0aG9kXSgpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZGF0ZU1ldGhvZHMoc2luZ2xlVW5pdDogU2luZ2xlVGltZVVuaXQsIGlzVXRjOiBib29sZWFuKSB7XG4gIGNvbnN0IHJhd1NldERhdGVNZXRob2QgPSBTRVRfREFURV9NRVRIT0Rbc2luZ2xlVW5pdF07XG4gIGNvbnN0IHNldERhdGVNZXRob2QgPSBpc1V0YyA/ICdzZXRVVEMnICsgcmF3U2V0RGF0ZU1ldGhvZC5zdWJzdHIoMykgOiByYXdTZXREYXRlTWV0aG9kO1xuICBjb25zdCBnZXREYXRlTWV0aG9kID0gJ2dldCcgKyAoaXNVdGMgPyAnVVRDJyA6ICcnKSArIHJhd1NldERhdGVNZXRob2Quc3Vic3RyKDMpO1xuICByZXR1cm4ge3NldERhdGVNZXRob2QsIGdldERhdGVNZXRob2R9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZVVuaXRQYXJ0cyh0aW1lVW5pdDogVGltZVVuaXQpIHtcbiAgcmV0dXJuIFRJTUVVTklUX1BBUlRTLnJlZHVjZSgocGFydHMsIHBhcnQpID0+IHtcbiAgICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgcGFydCkpIHtcbiAgICAgIHJldHVybiBwYXJ0cy5jb25jYXQocGFydCk7XG4gICAgfVxuICAgIHJldHVybiBwYXJ0cztcbiAgfSwgW10pO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGZ1bGxUaW1lVW5pdCBjb250YWlucyB0aGUgdGltZVVuaXQsIGZhbHNlIG90aGVyd2lzZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb250YWluc1RpbWVVbml0KGZ1bGxUaW1lVW5pdDogVGltZVVuaXQsIHRpbWVVbml0OiBUaW1lVW5pdCkge1xuICBjb25zdCBpbmRleCA9IGZ1bGxUaW1lVW5pdC5pbmRleE9mKHRpbWVVbml0KTtcbiAgcmV0dXJuIGluZGV4ID4gLTEgJiZcbiAgICAoXG4gICAgICB0aW1lVW5pdCAhPT0gVGltZVVuaXQuU0VDT05EUyB8fFxuICAgICAgaW5kZXggPT09IDAgfHxcbiAgICAgIGZ1bGxUaW1lVW5pdC5jaGFyQXQoaW5kZXgtMSkgIT09ICdpJyAvLyBleGNsdWRlIG1pbGxpc2Vjb25kc1xuICAgICk7XG59XG5cbi8qKlxuICogUmV0dXJucyBWZWdhIGV4cHJlc3NzaW9uIGZvciBhIGdpdmVuIHRpbWVVbml0IGFuZCBmaWVsZFJlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRFeHByKGZ1bGxUaW1lVW5pdDogVGltZVVuaXQsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmaWVsZFJlZiA9IGFjY2Vzc1BhdGhXaXRoRGF0dW0oZmllbGQpO1xuXG4gIGNvbnN0IHV0YyA9IGlzVVRDVGltZVVuaXQoZnVsbFRpbWVVbml0KSA/ICd1dGMnIDogJyc7XG4gIGZ1bmN0aW9uIGZ1bmModGltZVVuaXQ6IFRpbWVVbml0KSB7XG4gICAgaWYgKHRpbWVVbml0ID09PSBUaW1lVW5pdC5RVUFSVEVSKSB7XG4gICAgICAvLyBxdWFydGVyIHN0YXJ0aW5nIGF0IDAgKDAsMyw2LDkpLlxuICAgICAgcmV0dXJuIGAoJHt1dGN9cXVhcnRlcigke2ZpZWxkUmVmfSktMSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dXRjfSR7dGltZVVuaXR9KCR7ZmllbGRSZWZ9KWA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZCA9IFRJTUVVTklUX1BBUlRTLnJlZHVjZSgoZGF0ZUV4cHI6IERhdGVUaW1lRXhwciwgdHU6IFRpbWVVbml0KSA9PiB7XG4gICAgaWYgKGNvbnRhaW5zVGltZVVuaXQoZnVsbFRpbWVVbml0LCB0dSkpIHtcbiAgICAgIGRhdGVFeHByW3R1XSA9IGZ1bmModHUpO1xuICAgIH1cbiAgICByZXR1cm4gZGF0ZUV4cHI7XG4gIH0sIHt9IGFzIHtba2V5IGluIFNpbmdsZVRpbWVVbml0XTogc3RyaW5nfSk7XG5cbiAgcmV0dXJuIGRhdGVUaW1lRXhwcihkKTtcbn1cblxuLyoqXG4gKiByZXR1cm5zIHRoZSBzaWduYWwgZXhwcmVzc2lvbiB1c2VkIGZvciBheGlzIGxhYmVscyBmb3IgYSB0aW1lIHVuaXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEV4cHJlc3Npb24odGltZVVuaXQ6IFRpbWVVbml0LCBmaWVsZDogc3RyaW5nLCBzaG9ydFRpbWVMYWJlbHM6IGJvb2xlYW4sIGlzVVRDU2NhbGU6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoIXRpbWVVbml0KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGRhdGVDb21wb25lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZXhwcmVzc2lvbiA9ICcnO1xuICBjb25zdCBoYXNZZWFyID0gY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuWUVBUik7XG5cbiAgaWYgKGNvbnRhaW5zVGltZVVuaXQodGltZVVuaXQsIFRpbWVVbml0LlFVQVJURVIpKSB7XG4gICAvLyBzcGVjaWFsIGV4cHJlc3Npb24gZm9yIHF1YXJ0ZXIgYXMgcHJlZml4XG4gICAgZXhwcmVzc2lvbiA9IGAnUScgKyBxdWFydGVyKCR7ZmllbGR9KWA7XG4gIH1cblxuICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuTU9OVEgpKSB7XG4gICAgLy8gQnkgZGVmYXVsdCB1c2Ugc2hvcnQgbW9udGggbmFtZVxuICAgIGRhdGVDb21wb25lbnRzLnB1c2goc2hvcnRUaW1lTGFiZWxzICE9PSBmYWxzZSA/ICclYicgOiAnJUInKTtcbiAgfVxuXG4gIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5EQVkpKSB7XG4gICAgZGF0ZUNvbXBvbmVudHMucHVzaChzaG9ydFRpbWVMYWJlbHMgPyAnJWEnIDogJyVBJyk7XG4gIH0gZWxzZSBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuREFURSkpIHtcbiAgICBkYXRlQ29tcG9uZW50cy5wdXNoKCclZCcgKyAoaGFzWWVhciA/ICcsJyA6ICcnKSk7IC8vIGFkZCBjb21tYSBpZiB0aGVyZSBpcyB5ZWFyXG4gIH1cblxuICBpZiAoaGFzWWVhcikge1xuICAgIGRhdGVDb21wb25lbnRzLnB1c2goc2hvcnRUaW1lTGFiZWxzID8gJyV5JyA6ICclWScpO1xuICB9XG5cbiAgY29uc3QgdGltZUNvbXBvbmVudHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGNvbnRhaW5zVGltZVVuaXQodGltZVVuaXQsIFRpbWVVbml0LkhPVVJTKSkge1xuICAgIHRpbWVDb21wb25lbnRzLnB1c2goJyVIJyk7XG4gIH1cbiAgaWYgKGNvbnRhaW5zVGltZVVuaXQodGltZVVuaXQsIFRpbWVVbml0Lk1JTlVURVMpKSB7XG4gICAgdGltZUNvbXBvbmVudHMucHVzaCgnJU0nKTtcbiAgfVxuICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuU0VDT05EUykpIHtcbiAgICB0aW1lQ29tcG9uZW50cy5wdXNoKCclUycpO1xuICB9XG4gIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKSB7XG4gICAgdGltZUNvbXBvbmVudHMucHVzaCgnJUwnKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGVUaW1lQ29tcG9uZW50czogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGRhdGVDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBkYXRlVGltZUNvbXBvbmVudHMucHVzaChkYXRlQ29tcG9uZW50cy5qb2luKCcgJykpO1xuICB9XG4gIGlmICh0aW1lQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgZGF0ZVRpbWVDb21wb25lbnRzLnB1c2godGltZUNvbXBvbmVudHMuam9pbignOicpKTtcbiAgfVxuXG4gIGlmIChkYXRlVGltZUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgIGlmIChleHByZXNzaW9uKSB7XG4gICAgICAvLyBBZGQgc3BhY2UgYmV0d2VlbiBxdWFydGVyIGFuZCBtYWluIHRpbWUgZm9ybWF0XG4gICAgICBleHByZXNzaW9uICs9IGAgKyAnICcgKyBgO1xuICAgIH1cblxuICAgIC8vIFdlIG9ubHkgdXNlIHV0Y0Zvcm1hdCBmb3IgdXRjIHNjYWxlXG4gICAgLy8gRm9yIHV0YyB0aW1lIHVuaXRzLCB0aGUgZGF0YSBpcyBhbHJlYWR5IGNvbnZlcnRlZCBhcyBhIHBhcnQgb2YgdGltZVVuaXQgdHJhbnNmb3JtLlxuICAgIC8vIFRodXMsIHV0YyB0aW1lIHVuaXRzIHNob3VsZCB1c2UgdGltZUZvcm1hdCB0byBhdm9pZCBzaGlmdGluZyB0aGUgdGltZSB0d2ljZS5cbiAgICBpZiAoaXNVVENTY2FsZSkge1xuICAgICAgZXhwcmVzc2lvbiArPSBgdXRjRm9ybWF0KCR7ZmllbGR9LCAnJHtkYXRlVGltZUNvbXBvbmVudHMuam9pbignICcpfScpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwcmVzc2lvbiArPSBgdGltZUZvcm1hdCgke2ZpZWxkfSwgJyR7ZGF0ZVRpbWVDb21wb25lbnRzLmpvaW4oJyAnKX0nKWA7XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgZXhwcmVzc2lvbiBpcyBzdGlsbCBhbiBlbXB0eSBzdHJpbmcsIHJldHVybiB1bmRlZmluZWQgaW5zdGVhZC5cbiAgcmV0dXJuIGV4cHJlc3Npb24gfHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVGltZVVuaXQodGltZVVuaXQ6IFRpbWVVbml0KTogVGltZVVuaXQge1xuICBpZiAodGltZVVuaXQgIT09ICdkYXknICYmIHRpbWVVbml0LmluZGV4T2YoJ2RheScpID49IDApIHtcbiAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kYXlSZXBsYWNlZFdpdGhEYXRlKHRpbWVVbml0KSk7XG4gICAgcmV0dXJuIHRpbWVVbml0LnJlcGxhY2UoJ2RheScsICdkYXRlJykgYXMgVGltZVVuaXQ7XG4gIH1cbiAgcmV0dXJuIHRpbWVVbml0O1xufVxuIl19 \ No newline at end of file diff --git a/build/src/title.d.ts b/build/src/title.d.ts new file mode 100644 index 0000000000..29805226d0 --- /dev/null +++ b/build/src/title.d.ts @@ -0,0 +1,36 @@ +import { Anchor, TitleOrient, VgMarkConfig, VgTitleConfig } from './vega.schema'; +export interface TitleBase { + /** + * The orientation of the title relative to the chart. One of `"top"` (the default), `"bottom"`, `"left"`, or `"right"`. + */ + orient?: TitleOrient; + /** + * The anchor position for placing the title. One of `"start"`, `"middle"`, or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title. + * + * __Default value:__ `"middle"` for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. + * `"start"` for other composite views. + * + * __Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. For other composite views, `anchor` is always `"start"`. + */ + anchor?: Anchor; + /** + * The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart. + */ + offset?: number; + /** + * A [mark style property](https://vega.github.io/vega-lite/docs/config.html#style) to apply to the title text mark. + * + * __Default value:__ `"group-title"`. + */ + style?: string | string[]; +} +export interface TitleParams extends TitleBase { + /** + * The title text. + */ + text: string; +} +export declare function extractTitleConfig(titleConfig: VgTitleConfig): { + mark: VgMarkConfig; + nonMark: TitleBase; +}; diff --git a/build/src/title.js b/build/src/title.js new file mode 100644 index 0000000000..7d214664ad --- /dev/null +++ b/build/src/title.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +function extractTitleConfig(titleConfig) { + var + // These are non-mark title config that need to be hardcoded + anchor = titleConfig.anchor, offset = titleConfig.offset, orient = titleConfig.orient, + // color needs to be redirect to fill + color = titleConfig.color, + // The rest are mark config. + titleMarkConfig = tslib_1.__rest(titleConfig, ["anchor", "offset", "orient", "color"]); + var mark = tslib_1.__assign({}, titleMarkConfig, color ? { fill: color } : {}); + var nonMark = tslib_1.__assign({}, anchor ? { anchor: anchor } : {}, offset ? { offset: offset } : {}, orient ? { orient: orient } : {}); + return { mark: mark, nonMark: nonMark }; +} +exports.extractTitleConfig = extractTitleConfig; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGl0bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGl0bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBd0NBLDRCQUFtQyxXQUEwQjtJQU16RDtJQURBLDREQUE0RDtJQUM1RCwyQkFBTSxFQUFFLDJCQUFNLEVBQUUsMkJBQU07SUFDdEIscUNBQXFDO0lBQ3JDLHlCQUFLO0lBQ0wsNEJBQTRCO0lBQzVCLHNGQUFrQixDQUNKO0lBRWhCLElBQU0sSUFBSSx3QkFDTCxlQUFlLEVBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM5QixDQUFDO0lBRUYsSUFBTSxPQUFPLHdCQUNSLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzFCLENBQUM7SUFFRixPQUFPLEVBQUMsSUFBSSxNQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUMsQ0FBQztBQUN6QixDQUFDO0FBekJELGdEQXlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QW5jaG9yLCBUaXRsZU9yaWVudCwgVmdNYXJrQ29uZmlnLCBWZ1RpdGxlQ29uZmlnfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBUaXRsZUJhc2Uge1xuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0aXRsZSByZWxhdGl2ZSB0byB0aGUgY2hhcnQuIE9uZSBvZiBgXCJ0b3BcImAgKHRoZSBkZWZhdWx0KSwgYFwiYm90dG9tXCJgLCBgXCJsZWZ0XCJgLCBvciBgXCJyaWdodFwiYC5cbiAgICovXG4gIG9yaWVudD86IFRpdGxlT3JpZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgYW5jaG9yIHBvc2l0aW9uIGZvciBwbGFjaW5nIHRoZSB0aXRsZS4gT25lIG9mIGBcInN0YXJ0XCJgLCBgXCJtaWRkbGVcImAsIG9yIGBcImVuZFwiYC4gRm9yIGV4YW1wbGUsIHdpdGggYW4gb3JpZW50YXRpb24gb2YgdG9wIHRoZXNlIGFuY2hvciBwb3NpdGlvbnMgbWFwIHRvIGEgbGVmdC0sIGNlbnRlci0sIG9yIHJpZ2h0LWFsaWduZWQgdGl0bGUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJtaWRkbGVcImAgZm9yIFtzaW5nbGVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sKSBhbmQgW2xheWVyZWRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbGF5ZXIuaHRtbCkgdmlld3MuXG4gICAqIGBcInN0YXJ0XCJgIGZvciBvdGhlciBjb21wb3NpdGUgdmlld3MuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBbRm9yIG5vd10oaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yODc1KSwgYGFuY2hvcmAgaXMgb25seSBjdXN0b21pemFibGUgb25seSBmb3IgW3NpbmdsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwpIGFuZCBbbGF5ZXJlZF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sYXllci5odG1sKSB2aWV3cy4gIEZvciBvdGhlciBjb21wb3NpdGUgdmlld3MsIGBhbmNob3JgIGlzIGFsd2F5cyBgXCJzdGFydFwiYC5cbiAgICovXG4gIGFuY2hvcj86IEFuY2hvcjtcblxuICAvKipcbiAgICogVGhlIG9ydGhvZ29uYWwgb2Zmc2V0IGluIHBpeGVscyBieSB3aGljaCB0byBkaXNwbGFjZSB0aGUgdGl0bGUgZnJvbSBpdHMgcG9zaXRpb24gYWxvbmcgdGhlIGVkZ2Ugb2YgdGhlIGNoYXJ0LlxuICAgKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIFttYXJrIHN0eWxlIHByb3BlcnR5XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI3N0eWxlKSB0byBhcHBseSB0byB0aGUgdGl0bGUgdGV4dCBtYXJrLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwiZ3JvdXAtdGl0bGVcImAuXG4gICAqL1xuICBzdHlsZT86IHN0cmluZyB8IHN0cmluZ1tdO1xuXG4gIC8vIFRPRE86IG5hbWUsIGVuY29kZSwgaW50ZXJhY3RpdmUsIHppbmRleFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpdGxlUGFyYW1zIGV4dGVuZHMgVGl0bGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSB0ZXh0LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFRpdGxlQ29uZmlnKHRpdGxlQ29uZmlnOiBWZ1RpdGxlQ29uZmlnKToge1xuICBtYXJrOiBWZ01hcmtDb25maWcsXG4gIG5vbk1hcms6IFRpdGxlQmFzZVxufSB7XG4gIGNvbnN0IHtcbiAgICAvLyBUaGVzZSBhcmUgbm9uLW1hcmsgdGl0bGUgY29uZmlnIHRoYXQgbmVlZCB0byBiZSBoYXJkY29kZWRcbiAgICBhbmNob3IsIG9mZnNldCwgb3JpZW50LFxuICAgIC8vIGNvbG9yIG5lZWRzIHRvIGJlIHJlZGlyZWN0IHRvIGZpbGxcbiAgICBjb2xvcixcbiAgICAvLyBUaGUgcmVzdCBhcmUgbWFyayBjb25maWcuXG4gICAgLi4udGl0bGVNYXJrQ29uZmlnXG4gIH0gPSB0aXRsZUNvbmZpZztcblxuICBjb25zdCBtYXJrOiBWZ01hcmtDb25maWcgPSB7XG4gICAgLi4udGl0bGVNYXJrQ29uZmlnLFxuICAgIC4uLmNvbG9yID8ge2ZpbGw6IGNvbG9yfSA6IHt9XG4gIH07XG5cbiAgY29uc3Qgbm9uTWFyazogVGl0bGVCYXNlID0ge1xuICAgIC4uLmFuY2hvciA/IHthbmNob3J9IDoge30sXG4gICAgLi4ub2Zmc2V0ID8ge29mZnNldH0gOiB7fSxcbiAgICAuLi5vcmllbnQgPyB7b3JpZW50fSA6IHt9XG4gIH07XG5cbiAgcmV0dXJuIHttYXJrLCBub25NYXJrfTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/toplevelprops.d.ts b/build/src/toplevelprops.d.ts new file mode 100644 index 0000000000..e4e48fa891 --- /dev/null +++ b/build/src/toplevelprops.d.ts @@ -0,0 +1,63 @@ +import { InlineDataset } from './data'; +import { Dict } from './util'; +/** + * @minimum 0 + */ +export declare type Padding = number | { + top?: number; + bottom?: number; + left?: number; + right?: number; +}; +export declare type Datasets = Dict; +export interface TopLevelProperties { + /** + * CSS color property to use as the background of visualization. + * + * __Default value:__ none (transparent) + */ + background?: string; + /** + * The default visualization padding, in pixels, from the edge of the visualization canvas to the data rectangle. If a number, specifies padding for all sides. + * If an object, the value should have the format `{"left": 5, "top": 5, "right": 5, "bottom": 5}` to specify padding for each side of the visualization. + * + * __Default value__: `5` + */ + padding?: Padding; + /** + * Sets how the visualization size should be determined. If a string, should be one of `"pad"`, `"fit"` or `"none"`. + * Object values can additionally specify parameters for content sizing and automatic resizing. + * `"fit"` is only supported for single and layered views that don't use `rangeStep`. + * + * __Default value__: `pad` + */ + autosize?: AutosizeType | AutoSizeParams; + /** + * A global data store for named datasets. This is a mapping from names to inline datasets. + * This can be an array of objects or primitive values or a string. Arrays of primitive values are ingested as objects with a `data` property. + */ + datasets?: Datasets; +} +export declare type AutosizeType = 'pad' | 'fit' | 'none'; +export interface AutoSizeParams { + /** + * The sizing format type. One of `"pad"`, `"fit"` or `"none"`. See the [autosize type](https://vega.github.io/vega-lite/docs/size.html#autosize) documentation for descriptions of each. + * + * __Default value__: `"pad"` + */ + type?: AutosizeType; + /** + * A boolean flag indicating if autosize layout should be re-calculated on every view update. + * + * __Default value__: `false` + */ + resize?: boolean; + /** + * Determines how size calculation should be performed, one of `"content"` or `"padding"`. The default setting (`"content"`) interprets the width and height settings as the data rectangle (plotting) dimensions, to which padding is then added. In contrast, the `"padding"` setting includes the padding within the view size calculations, such that the width and height settings indicate the **total** intended size of the view. + * + * __Default value__: `"content"` + */ + contains?: 'content' | 'padding'; +} +export declare function normalizeAutoSize(topLevelAutosize: AutosizeType | AutoSizeParams, configAutosize: AutosizeType | AutoSizeParams, isUnitOrLayer?: boolean): AutoSizeParams; +export declare function extractTopLevelProperties(t: T): {}; diff --git a/build/src/toplevelprops.js b/build/src/toplevelprops.js new file mode 100644 index 0000000000..eb48c6044f --- /dev/null +++ b/build/src/toplevelprops.js @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var vega_util_1 = require("vega-util"); +var log = tslib_1.__importStar(require("./log")); +function _normalizeAutoSize(autosize) { + return vega_util_1.isString(autosize) ? { type: autosize } : autosize || {}; +} +function normalizeAutoSize(topLevelAutosize, configAutosize, isUnitOrLayer) { + if (isUnitOrLayer === void 0) { isUnitOrLayer = true; } + var autosize = tslib_1.__assign({ type: 'pad' }, _normalizeAutoSize(configAutosize), _normalizeAutoSize(topLevelAutosize)); + if (autosize.type === 'fit') { + if (!isUnitOrLayer) { + log.warn(log.message.FIT_NON_SINGLE); + autosize.type = 'pad'; + } + } + return autosize; +} +exports.normalizeAutoSize = normalizeAutoSize; +var TOP_LEVEL_PROPERTIES = [ + 'background', 'padding', 'datasets' + // We do not include "autosize" here as it is supported by only unit and layer specs and thus need to be normalized +]; +function extractTopLevelProperties(t) { + return TOP_LEVEL_PROPERTIES.reduce(function (o, p) { + if (t && t[p] !== undefined) { + o[p] = t[p]; + } + return o; + }, {}); +} +exports.extractTopLevelProperties = extractTopLevelProperties; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wbGV2ZWxwcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b3BsZXZlbHByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUFtQztBQUduQyxpREFBNkI7QUFtRTdCLDRCQUE0QixRQUF1QztJQUNqRSxPQUFPLG9CQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQ2hFLENBQUM7QUFFRCwyQkFBa0MsZ0JBQStDLEVBQUUsY0FBNkMsRUFBRSxhQUE2QjtJQUE3Qiw4QkFBQSxFQUFBLG9CQUE2QjtJQUM3SixJQUFNLFFBQVEsc0JBQ1osSUFBSSxFQUFFLEtBQUssSUFDUixrQkFBa0IsQ0FBQyxjQUFjLENBQUMsRUFDbEMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FDeEMsQ0FBQztJQUVGLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUU7UUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7U0FDdkI7S0FDRjtJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFmRCw4Q0FlQztBQUVELElBQU0sb0JBQW9CLEdBQWlDO0lBQ3pELFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVTtJQUNuQyxtSEFBbUg7Q0FDcEgsQ0FBQztBQUVGLG1DQUF3RSxDQUFJO0lBQzFFLE9BQU8sb0JBQW9CLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2I7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNULENBQUM7QUFQRCw4REFPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7SW5saW5lRGF0YXNldH0gZnJvbSAnLi9kYXRhJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge0RpY3R9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQG1pbmltdW0gMFxuICovXG5leHBvcnQgdHlwZSBQYWRkaW5nID0gbnVtYmVyIHwge3RvcD86IG51bWJlciwgYm90dG9tPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIERhdGFzZXRzID0gRGljdDxJbmxpbmVEYXRhc2V0PjtcblxuZXhwb3J0IGludGVyZmFjZSBUb3BMZXZlbFByb3BlcnRpZXMge1xuICAvKipcbiAgICogQ1NTIGNvbG9yIHByb3BlcnR5IHRvIHVzZSBhcyB0aGUgYmFja2dyb3VuZCBvZiB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gbm9uZSAodHJhbnNwYXJlbnQpXG4gICAqL1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB2aXN1YWxpemF0aW9uIHBhZGRpbmcsIGluIHBpeGVscywgZnJvbSB0aGUgZWRnZSBvZiB0aGUgdmlzdWFsaXphdGlvbiBjYW52YXMgdG8gdGhlIGRhdGEgcmVjdGFuZ2xlLiAgSWYgYSBudW1iZXIsIHNwZWNpZmllcyBwYWRkaW5nIGZvciBhbGwgc2lkZXMuXG4gICAqIElmIGFuIG9iamVjdCwgdGhlIHZhbHVlIHNob3VsZCBoYXZlIHRoZSBmb3JtYXQgYHtcImxlZnRcIjogNSwgXCJ0b3BcIjogNSwgXCJyaWdodFwiOiA1LCBcImJvdHRvbVwiOiA1fWAgdG8gc3BlY2lmeSBwYWRkaW5nIGZvciBlYWNoIHNpZGUgb2YgdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgNWBcbiAgICovXG4gIHBhZGRpbmc/OiBQYWRkaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIGhvdyB0aGUgdmlzdWFsaXphdGlvbiBzaXplIHNob3VsZCBiZSBkZXRlcm1pbmVkLiBJZiBhIHN0cmluZywgc2hvdWxkIGJlIG9uZSBvZiBgXCJwYWRcImAsIGBcImZpdFwiYCBvciBgXCJub25lXCJgLlxuICAgKiBPYmplY3QgdmFsdWVzIGNhbiBhZGRpdGlvbmFsbHkgc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciBjb250ZW50IHNpemluZyBhbmQgYXV0b21hdGljIHJlc2l6aW5nLlxuICAgKiBgXCJmaXRcImAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHNpbmdsZSBhbmQgbGF5ZXJlZCB2aWV3cyB0aGF0IGRvbid0IHVzZSBgcmFuZ2VTdGVwYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGBwYWRgXG4gICAqL1xuICBhdXRvc2l6ZT86IEF1dG9zaXplVHlwZSB8IEF1dG9TaXplUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIGdsb2JhbCBkYXRhIHN0b3JlIGZvciBuYW1lZCBkYXRhc2V0cy4gVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBpbmxpbmUgZGF0YXNldHMuXG4gICAqIFRoaXMgY2FuIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgcHJpbWl0aXZlIHZhbHVlcyBvciBhIHN0cmluZy4gQXJyYXlzIG9mIHByaW1pdGl2ZSB2YWx1ZXMgYXJlIGluZ2VzdGVkIGFzIG9iamVjdHMgd2l0aCBhIGBkYXRhYCBwcm9wZXJ0eS5cbiAgICovXG4gIGRhdGFzZXRzPzogRGF0YXNldHM7XG59XG5cbmV4cG9ydCB0eXBlIEF1dG9zaXplVHlwZSA9ICdwYWQnIHwgJ2ZpdCcgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHNpemluZyBmb3JtYXQgdHlwZS4gT25lIG9mIGBcInBhZFwiYCwgYFwiZml0XCJgIG9yIGBcIm5vbmVcImAuIFNlZSB0aGUgW2F1dG9zaXplIHR5cGVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sI2F1dG9zaXplKSBkb2N1bWVudGF0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgZWFjaC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGBcInBhZFwiYFxuICAgKi9cbiAgdHlwZT86IEF1dG9zaXplVHlwZTtcblxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBhdXRvc2l6ZSBsYXlvdXQgc2hvdWxkIGJlIHJlLWNhbGN1bGF0ZWQgb24gZXZlcnkgdmlldyB1cGRhdGUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgZmFsc2VgXG4gICAqL1xuICByZXNpemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyBzaXplIGNhbGN1bGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQsIG9uZSBvZiBgXCJjb250ZW50XCJgIG9yIGBcInBhZGRpbmdcImAuIFRoZSBkZWZhdWx0IHNldHRpbmcgKGBcImNvbnRlbnRcImApIGludGVycHJldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgc2V0dGluZ3MgYXMgdGhlIGRhdGEgcmVjdGFuZ2xlIChwbG90dGluZykgZGltZW5zaW9ucywgdG8gd2hpY2ggcGFkZGluZyBpcyB0aGVuIGFkZGVkLiBJbiBjb250cmFzdCwgdGhlIGBcInBhZGRpbmdcImAgc2V0dGluZyBpbmNsdWRlcyB0aGUgcGFkZGluZyB3aXRoaW4gdGhlIHZpZXcgc2l6ZSBjYWxjdWxhdGlvbnMsIHN1Y2ggdGhhdCB0aGUgd2lkdGggYW5kIGhlaWdodCBzZXR0aW5ncyBpbmRpY2F0ZSB0aGUgKip0b3RhbCoqIGludGVuZGVkIHNpemUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgXCJjb250ZW50XCJgXG4gICAqL1xuICBjb250YWlucz86ICdjb250ZW50JyB8ICdwYWRkaW5nJztcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZUF1dG9TaXplKGF1dG9zaXplOiBBdXRvc2l6ZVR5cGUgfCBBdXRvU2l6ZVBhcmFtcykge1xuICByZXR1cm4gaXNTdHJpbmcoYXV0b3NpemUpID8ge3R5cGU6IGF1dG9zaXplfSA6IGF1dG9zaXplIHx8IHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXV0b1NpemUodG9wTGV2ZWxBdXRvc2l6ZTogQXV0b3NpemVUeXBlIHwgQXV0b1NpemVQYXJhbXMsIGNvbmZpZ0F1dG9zaXplOiBBdXRvc2l6ZVR5cGUgfCBBdXRvU2l6ZVBhcmFtcywgaXNVbml0T3JMYXllcjogYm9vbGVhbiA9IHRydWUpOiBBdXRvU2l6ZVBhcmFtcyB7XG4gIGNvbnN0IGF1dG9zaXplOiBBdXRvU2l6ZVBhcmFtcyA9IHtcbiAgICB0eXBlOiAncGFkJyxcbiAgICAuLi5fbm9ybWFsaXplQXV0b1NpemUoY29uZmlnQXV0b3NpemUpLFxuICAgIC4uLl9ub3JtYWxpemVBdXRvU2l6ZSh0b3BMZXZlbEF1dG9zaXplKVxuICB9O1xuXG4gIGlmIChhdXRvc2l6ZS50eXBlID09PSAnZml0Jykge1xuICAgIGlmICghaXNVbml0T3JMYXllcikge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuRklUX05PTl9TSU5HTEUpO1xuICAgICAgYXV0b3NpemUudHlwZSA9ICdwYWQnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdXRvc2l6ZTtcbn1cblxuY29uc3QgVE9QX0xFVkVMX1BST1BFUlRJRVM6IChrZXlvZiBUb3BMZXZlbFByb3BlcnRpZXMpW10gPSBbXG4gICdiYWNrZ3JvdW5kJywgJ3BhZGRpbmcnLCAnZGF0YXNldHMnXG4gIC8vIFdlIGRvIG5vdCBpbmNsdWRlIFwiYXV0b3NpemVcIiBoZXJlIGFzIGl0IGlzIHN1cHBvcnRlZCBieSBvbmx5IHVuaXQgYW5kIGxheWVyIHNwZWNzIGFuZCB0aHVzIG5lZWQgdG8gYmUgbm9ybWFsaXplZFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUb3BMZXZlbFByb3BlcnRpZXM8VCBleHRlbmRzIFRvcExldmVsUHJvcGVydGllcz4odDogVCkge1xuICByZXR1cm4gVE9QX0xFVkVMX1BST1BFUlRJRVMucmVkdWNlKChvLCBwKSA9PiB7XG4gICAgaWYgKHQgJiYgdFtwXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvW3BdID0gdFtwXTtcbiAgICB9XG4gICAgcmV0dXJuIG87XG4gIH0sIHt9KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/transform.d.ts b/build/src/transform.d.ts new file mode 100644 index 0000000000..d9cdf4dc0d --- /dev/null +++ b/build/src/transform.d.ts @@ -0,0 +1,217 @@ +import { AggregateOp } from 'vega'; +import { BinParams } from './bin'; +import { Data } from './data'; +import { LogicalOperand } from './logical'; +import { Predicate } from './predicate'; +import { SortField } from './sort'; +import { TimeUnit } from './timeunit'; +export interface FilterTransform { + /** + * The `filter` property must be one of the predicate definitions: + * + * 1) an [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string, + * where `datum` can be used to refer to the current data object + * + * 2) one of the field predicates: [`equal`](https://vega.github.io/vega-lite/docs/filter.html#equal-predicate), + * [`lt`](https://vega.github.io/vega-lite/docs/filter.html#lt-predicate), + * [`lte`](https://vega.github.io/vega-lite/docs/filter.html#lte-predicate), + * [`gt`](https://vega.github.io/vega-lite/docs/filter.html#gt-predicate), + * [`gte`](https://vega.github.io/vega-lite/docs/filter.html#gte-predicate), + * [`range`](https://vega.github.io/vega-lite/docs/filter.html#range-predicate), + * or [`oneOf`](https://vega.github.io/vega-lite/docs/filter.html#one-of-predicate). + * + * 3) a [selection predicate](https://vega.github.io/vega-lite/docs/filter.html#selection-predicate) + * + * 4) a logical operand that combines (1), (2), or (3). + */ + filter: LogicalOperand; +} +export declare function isFilter(t: Transform): t is FilterTransform; +export interface CalculateTransform { + /** + * A [expression](https://vega.github.io/vega-lite/docs/types.html#expression) string. Use the variable `datum` to refer to the current data object. + */ + calculate: string; + /** + * The field for storing the computed formula value. + */ + as: string; +} +export interface BinTransform { + /** + * An object indicating bin properties, or simply `true` for using default bin parameters. + */ + bin: boolean | BinParams; + /** + * The data field to bin. + */ + field: string; + /** + * The output fields at which to write the start and end bin values. + */ + as: string; +} +export interface TimeUnitTransform { + /** + * The timeUnit. + */ + timeUnit: TimeUnit; + /** + * The data field to apply time unit. + */ + field: string; + /** + * The output field to write the timeUnit value. + */ + as: string; +} +export interface AggregateTransform { + /** + * Array of objects that define fields to aggregate. + */ + aggregate: AggregatedFieldDef[]; + /** + * The data fields to group by. If not specified, a single group containing all data objects will be used. + */ + groupby?: string[]; +} +export interface AggregatedFieldDef { + /** + * The aggregation operations to apply to the fields, such as sum, average or count. + * See the [full list of supported aggregation operations](https://vega.github.io/vega-lite/docs/aggregate.html#ops) + * for more information. + */ + op: AggregateOp; + /** + * The data field for which to compute aggregate function. This is required for all aggregation operations except `"count"`. + */ + field?: string; + /** + * The output field names to use for each aggregated field. + */ + as: string; +} +/** + * @hide + */ +export interface StackTransform { + /** + * The field which is stacked. + */ + stack: string; + /** + * The data fields to group by. + */ + groupby: string[]; + /** + * Mode for stacking marks. + * __Default value:__ `"zero"` + */ + offset?: 'zero' | 'center' | 'normalize'; + /** + * Field that determines the order of leaves in the stacked charts. + */ + sort?: SortField[]; + /** + * Output field names. This can be either a string or an array of strings with + * two elements denoting the name for the fields for stack start and stack end + * respectively. + * If a single string(eg."val") is provided, the end field will be "val_end". + */ + as: string | string[]; +} +export declare type WindowOnlyOp = 'row_number' | 'rank' | 'dense_rank' | 'percent_rank' | 'cume_dist' | 'ntile' | 'lag' | 'lead' | 'first_value' | 'last_value' | 'nth_value'; +export interface WindowFieldDef { + /** + * The window or aggregation operations to apply within a window, including `rank`, `lead`, `sum`, `average` or `count`. See the list of all supported operations [here](https://vega.github.io/vega-lite/docs/window.html#ops). + */ + op: AggregateOp | WindowOnlyOp; + /** + * Parameter values for the window functions. Parameter values can be omitted for operations that do not accept a parameter. + * + * See the list of all supported operations and their parameters [here](https://vega.github.io/vega-lite/docs/transforms/window.html). + */ + param?: number; + /** + * The data field for which to compute the aggregate or window function. This can be omitted for window functions that do not operate over a field such as `count`, `rank`, `dense_rank`. + */ + field?: string; + /** + * The output name for the window operation. + */ + as: string; +} +export interface WindowTransform { + /** + * The definition of the fields in the window, and what calculations to use. + */ + window: WindowFieldDef[]; + /** + * A frame specification as a two-element array indicating how the sliding window should proceed. The array entries should either be a number indicating the offset from the current data object, or null to indicate unbounded rows preceding or following the current data object. The default value is `[null, 0]`, indicating that the sliding window includes the current object and all preceding objects. The value `[-5, 5]` indicates that the window should include five objects preceding and five objects following the current object. Finally, `[null, null]` indicates that the window frame should always include all data objects. The only operators affected are the aggregation operations and the `first_value`, `last_value`, and `nth_value` window operations. The other window operations are not affected by this. + * + * __Default value:__: `[null, 0]` (includes the current object and all preceding objects) + */ + frame?: (null | number)[]; + /** + * Indicates if the sliding window frame should ignore peer values. (Peer values are those considered identical by the sort criteria). The default is false, causing the window frame to expand to include all peer values. If set to true, the window frame will be defined by offset values only. This setting only affects those operations that depend on the window frame, namely aggregation operations and the first_value, last_value, and nth_value window operations. + * + * __Default value:__ `false` + */ + ignorePeers?: boolean; + /** + * The data fields for partitioning the data objects into separate windows. If unspecified, all data points will be a single group. + */ + groupby?: string[]; + /** + * A sort field definition for sorting data objects within a window. If two data objects are considered equal by the comparator, they are considered “peer” values of equal rank. If sort is not specified, the order is undefined: data objects are processed in the order they are observed and none are considered peers (the ignorePeers parameter is ignored and treated as if set to `true`). + */ + sort?: SortField[]; +} +export interface LookupData { + /** + * Secondary data source to lookup in. + */ + data: Data; + /** + * Key in data to lookup. + */ + key: string; + /** + * Fields in foreign data to lookup. + * If not specified, the entire object is queried. + */ + fields?: string[]; +} +export interface LookupTransform { + /** + * Key in primary data source. + */ + lookup: string; + /** + * Secondary data reference. + */ + from: LookupData; + /** + * The field or fields for storing the computed formula value. + * If `from.fields` is specified, the transform will use the same names for `as`. + * If `from.fields` is not specified, `as` has to be a string and we put the whole object into the data under the specified name. + */ + as?: string | string[]; + /** + * The default value to use if lookup fails. + * + * __Default value:__ `null` + */ + default?: string; +} +export declare function isLookup(t: Transform): t is LookupTransform; +export declare function isWindow(t: Transform): t is WindowTransform; +export declare function isCalculate(t: Transform): t is CalculateTransform; +export declare function isBin(t: Transform): t is BinTransform; +export declare function isTimeUnit(t: Transform): t is TimeUnitTransform; +export declare function isAggregate(t: Transform): t is AggregateTransform; +export declare function isStack(t: Transform): t is StackTransform; +export declare type Transform = FilterTransform | CalculateTransform | LookupTransform | BinTransform | TimeUnitTransform | AggregateTransform | WindowTransform | StackTransform; +export declare function normalizeTransform(transform: Transform[]): (CalculateTransform | LookupTransform | BinTransform | TimeUnitTransform | AggregateTransform | WindowTransform | StackTransform | { + filter: LogicalOperand; +})[]; diff --git a/build/src/transform.js b/build/src/transform.js new file mode 100644 index 0000000000..882aa62530 --- /dev/null +++ b/build/src/transform.js @@ -0,0 +1,48 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var logical_1 = require("./logical"); +var predicate_1 = require("./predicate"); +function isFilter(t) { + return t['filter'] !== undefined; +} +exports.isFilter = isFilter; +function isLookup(t) { + return t['lookup'] !== undefined; +} +exports.isLookup = isLookup; +function isWindow(t) { + return t['window'] !== undefined; +} +exports.isWindow = isWindow; +function isCalculate(t) { + return t['calculate'] !== undefined; +} +exports.isCalculate = isCalculate; +function isBin(t) { + return !!t['bin']; +} +exports.isBin = isBin; +function isTimeUnit(t) { + return t['timeUnit'] !== undefined; +} +exports.isTimeUnit = isTimeUnit; +function isAggregate(t) { + return t['aggregate'] !== undefined; +} +exports.isAggregate = isAggregate; +function isStack(t) { + return t['stack'] !== undefined; +} +exports.isStack = isStack; +function normalizeTransform(transform) { + return transform.map(function (t) { + if (isFilter(t)) { + return { + filter: logical_1.normalizeLogicalOperand(t.filter, predicate_1.normalizePredicate) + }; + } + return t; + }); +} +exports.normalizeTransform = normalizeTransform; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUlBLHFDQUFrRTtBQUNsRSx5Q0FBMEQ7QUEyQjFELGtCQUF5QixDQUFZO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNuQyxDQUFDO0FBRkQsNEJBRUM7QUFnT0Qsa0JBQXlCLENBQVk7SUFDbkMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ25DLENBQUM7QUFGRCw0QkFFQztBQUVELGtCQUF5QixDQUFZO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNuQyxDQUFDO0FBRkQsNEJBRUM7QUFFRCxxQkFBNEIsQ0FBWTtJQUN0QyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDdEMsQ0FBQztBQUZELGtDQUVDO0FBRUQsZUFBc0IsQ0FBWTtJQUNoQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEIsQ0FBQztBQUZELHNCQUVDO0FBRUQsb0JBQTJCLENBQVk7SUFDckMsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3JDLENBQUM7QUFGRCxnQ0FFQztBQUVELHFCQUE0QixDQUFZO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUN0QyxDQUFDO0FBRkQsa0NBRUM7QUFFRCxpQkFBd0IsQ0FBWTtJQUNsQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDbEMsQ0FBQztBQUZELDBCQUVDO0FBSUQsNEJBQW1DLFNBQXNCO0lBQ3ZELE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUM7UUFDcEIsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDZixPQUFPO2dCQUNMLE1BQU0sRUFBRSxpQ0FBdUIsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLDhCQUFrQixDQUFDO2FBQzlELENBQUM7U0FDSDtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBVEQsZ0RBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FnZ3JlZ2F0ZU9wfSBmcm9tICd2ZWdhJztcblxuaW1wb3J0IHtCaW5QYXJhbXN9IGZyb20gJy4vYmluJztcbmltcG9ydCB7RGF0YX0gZnJvbSAnLi9kYXRhJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmQsIG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kfSBmcm9tICcuL2xvZ2ljYWwnO1xuaW1wb3J0IHtub3JtYWxpemVQcmVkaWNhdGUsIFByZWRpY2F0ZX0gZnJvbSAnLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtTb3J0RmllbGR9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1RpbWVVbml0fSBmcm9tICcuL3RpbWV1bml0JztcblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVGhlIGBmaWx0ZXJgIHByb3BlcnR5IG11c3QgYmUgb25lIG9mIHRoZSBwcmVkaWNhdGUgZGVmaW5pdGlvbnM6XG4gICAqXG4gICAqIDEpIGFuIFtleHByZXNzaW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGVzLmh0bWwjZXhwcmVzc2lvbikgc3RyaW5nLFxuICAgKiB3aGVyZSBgZGF0dW1gIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGRhdGEgb2JqZWN0XG4gICAqXG4gICAqIDIpIG9uZSBvZiB0aGUgZmllbGQgcHJlZGljYXRlczogW2BlcXVhbGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjZXF1YWwtcHJlZGljYXRlKSxcbiAgICogW2BsdGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjbHQtcHJlZGljYXRlKSxcbiAgICogW2BsdGVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI2x0ZS1wcmVkaWNhdGUpLFxuICAgKiBbYGd0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9maWx0ZXIuaHRtbCNndC1wcmVkaWNhdGUpLFxuICAgKiBbYGd0ZWBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjZ3RlLXByZWRpY2F0ZSksXG4gICAqIFtgcmFuZ2VgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI3JhbmdlLXByZWRpY2F0ZSksXG4gICAqIG9yIFtgb25lT2ZgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI29uZS1vZi1wcmVkaWNhdGUpLlxuICAgKlxuICAgKiAzKSBhIFtzZWxlY3Rpb24gcHJlZGljYXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI3NlbGVjdGlvbi1wcmVkaWNhdGUpXG4gICAqXG4gICAqIDQpIGEgbG9naWNhbCBvcGVyYW5kIHRoYXQgY29tYmluZXMgKDEpLCAoMiksIG9yICgzKS5cbiAgICovXG4gIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjkwMVxuICBmaWx0ZXI6IExvZ2ljYWxPcGVyYW5kPFByZWRpY2F0ZT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbHRlcih0OiBUcmFuc2Zvcm0pOiB0IGlzIEZpbHRlclRyYW5zZm9ybSB7XG4gIHJldHVybiB0WydmaWx0ZXInXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGN1bGF0ZVRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBBIFtleHByZXNzaW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGVzLmh0bWwjZXhwcmVzc2lvbikgc3RyaW5nLiBVc2UgdGhlIHZhcmlhYmxlIGBkYXR1bWAgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgZGF0YSBvYmplY3QuXG4gICAqL1xuICBjYWxjdWxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpZWxkIGZvciBzdG9yaW5nIHRoZSBjb21wdXRlZCBmb3JtdWxhIHZhbHVlLlxuICAgKi9cbiAgYXM6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaW5UcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQW4gb2JqZWN0IGluZGljYXRpbmcgYmluIHByb3BlcnRpZXMsIG9yIHNpbXBseSBgdHJ1ZWAgZm9yIHVzaW5nIGRlZmF1bHQgYmluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBiaW46IGJvb2xlYW4gfCBCaW5QYXJhbXM7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkIHRvIGJpbi5cbiAgICovXG4gIGZpZWxkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgZmllbGRzIGF0IHdoaWNoIHRvIHdyaXRlIHRoZSBzdGFydCBhbmQgZW5kIGJpbiB2YWx1ZXMuXG4gICAqL1xuICBhczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVVbml0VHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lVW5pdC5cbiAgICovXG4gIHRpbWVVbml0OiBUaW1lVW5pdDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgZmllbGQgdG8gYXBwbHkgdGltZSB1bml0LlxuICAgKi9cbiAgZmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmaWVsZCB0byB3cml0ZSB0aGUgdGltZVVuaXQgdmFsdWUuXG4gICAqL1xuICBhczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZ3JlZ2F0ZVRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIGZpZWxkcyB0byBhZ2dyZWdhdGUuXG4gICAqL1xuICBhZ2dyZWdhdGU6IEFnZ3JlZ2F0ZWRGaWVsZERlZltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmaWVsZHMgdG8gZ3JvdXAgYnkuIElmIG5vdCBzcGVjaWZpZWQsIGEgc2luZ2xlIGdyb3VwIGNvbnRhaW5pbmcgYWxsIGRhdGEgb2JqZWN0cyB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBncm91cGJ5Pzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdncmVnYXRlZEZpZWxkRGVmIHtcbiAgLyoqXG4gICAqIFRoZSBhZ2dyZWdhdGlvbiBvcGVyYXRpb25zIHRvIGFwcGx5IHRvIHRoZSBmaWVsZHMsIHN1Y2ggYXMgc3VtLCBhdmVyYWdlIG9yIGNvdW50LlxuICAgKiBTZWUgdGhlIFtmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGFnZ3JlZ2F0aW9uIG9wZXJhdGlvbnNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYWdncmVnYXRlLmh0bWwjb3BzKVxuICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIG9wOiBBZ2dyZWdhdGVPcDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgZmllbGQgZm9yIHdoaWNoIHRvIGNvbXB1dGUgYWdncmVnYXRlIGZ1bmN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBhbGwgYWdncmVnYXRpb24gb3BlcmF0aW9ucyBleGNlcHQgYFwiY291bnRcImAuXG4gICAqL1xuICBmaWVsZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmaWVsZCBuYW1lcyB0byB1c2UgZm9yIGVhY2ggYWdncmVnYXRlZCBmaWVsZC5cbiAgICovXG4gIGFzOiBzdHJpbmc7XG59XG5cblxuLyoqXG4gKiBAaGlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCB3aGljaCBpcyBzdGFja2VkLlxuICAgKi9cbiAgc3RhY2s6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkcyB0byBncm91cCBieS5cbiAgICovXG4gIGdyb3VwYnk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogTW9kZSBmb3Igc3RhY2tpbmcgbWFya3MuXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJ6ZXJvXCJgXG4gICAqL1xuICBvZmZzZXQ/OiAnemVybycgfCAnY2VudGVyJyB8ICdub3JtYWxpemUnO1xuICAvKipcbiAgICogRmllbGQgdGhhdCBkZXRlcm1pbmVzIHRoZSBvcmRlciBvZiBsZWF2ZXMgaW4gdGhlIHN0YWNrZWQgY2hhcnRzLlxuICAgKi9cbiAgc29ydD86IFNvcnRGaWVsZFtdO1xuICAvKipcbiAgICogT3V0cHV0IGZpZWxkIG5hbWVzLiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoXG4gICAqIHR3byBlbGVtZW50cyBkZW5vdGluZyB0aGUgbmFtZSBmb3IgdGhlIGZpZWxkcyBmb3Igc3RhY2sgc3RhcnQgYW5kIHN0YWNrIGVuZFxuICAgKiByZXNwZWN0aXZlbHkuXG4gICAqIElmIGEgc2luZ2xlIHN0cmluZyhlZy5cInZhbFwiKSBpcyBwcm92aWRlZCwgdGhlIGVuZCBmaWVsZCB3aWxsIGJlIFwidmFsX2VuZFwiLlxuICAgKi9cbiAgYXM6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG59XG5cblxuZXhwb3J0IHR5cGUgV2luZG93T25seU9wID1cbiAgJ3Jvd19udW1iZXInIHxcbiAgICdyYW5rJyB8XG4gICAnZGVuc2VfcmFuaycgfFxuICAgJ3BlcmNlbnRfcmFuaycgfFxuICAgJ2N1bWVfZGlzdCcgfFxuICAgJ250aWxlJyB8XG4gICAnbGFnJyB8XG4gICAnbGVhZCcgfFxuICAgJ2ZpcnN0X3ZhbHVlJyB8XG4gICAnbGFzdF92YWx1ZScgfFxuICAgJ250aF92YWx1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luZG93RmllbGREZWYge1xuICAvKipcbiAgICogVGhlIHdpbmRvdyBvciBhZ2dyZWdhdGlvbiBvcGVyYXRpb25zIHRvIGFwcGx5IHdpdGhpbiBhIHdpbmRvdywgaW5jbHVkaW5nIGByYW5rYCwgYGxlYWRgLCBgc3VtYCwgYGF2ZXJhZ2VgIG9yIGBjb3VudGAuIFNlZSB0aGUgbGlzdCBvZiBhbGwgc3VwcG9ydGVkIG9wZXJhdGlvbnMgW2hlcmVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvd2luZG93Lmh0bWwjb3BzKS5cbiAgICovXG4gIG9wOiBBZ2dyZWdhdGVPcCB8IFdpbmRvd09ubHlPcDtcblxuICAvKipcbiAgICogUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHdpbmRvdyBmdW5jdGlvbnMuIFBhcmFtZXRlciB2YWx1ZXMgY2FuIGJlIG9taXR0ZWQgZm9yIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgYWNjZXB0IGEgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBTZWUgdGhlIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCBvcGVyYXRpb25zIGFuZCB0aGVpciBwYXJhbWV0ZXJzIFtoZXJlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RyYW5zZm9ybXMvd2luZG93Lmh0bWwpLlxuICAgKi9cbiAgcGFyYW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBhZ2dyZWdhdGUgb3Igd2luZG93IGZ1bmN0aW9uLiBUaGlzIGNhbiBiZSBvbWl0dGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHRoYXQgZG8gbm90IG9wZXJhdGUgb3ZlciBhIGZpZWxkIHN1Y2ggYXMgYGNvdW50YCwgYHJhbmtgLCBgZGVuc2VfcmFua2AuXG4gICAqL1xuICBmaWVsZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBuYW1lIGZvciB0aGUgd2luZG93IG9wZXJhdGlvbi5cbiAgICovXG4gIGFzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luZG93VHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHdpbmRvdywgYW5kIHdoYXQgY2FsY3VsYXRpb25zIHRvIHVzZS5cbiAgICovXG4gIHdpbmRvdzogV2luZG93RmllbGREZWZbXTtcblxuICAvKipcbiAgICogQSBmcmFtZSBzcGVjaWZpY2F0aW9uIGFzIGEgdHdvLWVsZW1lbnQgYXJyYXkgaW5kaWNhdGluZyBob3cgdGhlIHNsaWRpbmcgd2luZG93IHNob3VsZCBwcm9jZWVkLiBUaGUgYXJyYXkgZW50cmllcyBzaG91bGQgZWl0aGVyIGJlIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGRhdGEgb2JqZWN0LCBvciBudWxsIHRvIGluZGljYXRlIHVuYm91bmRlZCByb3dzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgZGF0YSBvYmplY3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBbbnVsbCwgMF1gLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNsaWRpbmcgd2luZG93IGluY2x1ZGVzIHRoZSBjdXJyZW50IG9iamVjdCBhbmQgYWxsIHByZWNlZGluZyBvYmplY3RzLiBUaGUgdmFsdWUgYFstNSwgNV1gIGluZGljYXRlcyB0aGF0IHRoZSB3aW5kb3cgc2hvdWxkIGluY2x1ZGUgZml2ZSBvYmplY3RzIHByZWNlZGluZyBhbmQgZml2ZSBvYmplY3RzIGZvbGxvd2luZyB0aGUgY3VycmVudCBvYmplY3QuIEZpbmFsbHksIGBbbnVsbCwgbnVsbF1gIGluZGljYXRlcyB0aGF0IHRoZSB3aW5kb3cgZnJhbWUgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIGFsbCBkYXRhIG9iamVjdHMuIFRoZSBvbmx5IG9wZXJhdG9ycyBhZmZlY3RlZCBhcmUgdGhlIGFnZ3JlZ2F0aW9uIG9wZXJhdGlvbnMgYW5kIHRoZSBgZmlyc3RfdmFsdWVgLCBgbGFzdF92YWx1ZWAsIGFuZCBgbnRoX3ZhbHVlYCB3aW5kb3cgb3BlcmF0aW9ucy4gVGhlIG90aGVyIHdpbmRvdyBvcGVyYXRpb25zIGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhpcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fOiAgYFtudWxsLCAwXWAgKGluY2x1ZGVzIHRoZSBjdXJyZW50IG9iamVjdCBhbmQgYWxsIHByZWNlZGluZyBvYmplY3RzKVxuICAgKi9cbiAgZnJhbWU/OiAobnVsbCB8IG51bWJlcilbXTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBzbGlkaW5nIHdpbmRvdyBmcmFtZSBzaG91bGQgaWdub3JlIHBlZXIgdmFsdWVzLiAoUGVlciB2YWx1ZXMgYXJlIHRob3NlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIGJ5IHRoZSBzb3J0IGNyaXRlcmlhKS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UsIGNhdXNpbmcgdGhlIHdpbmRvdyBmcmFtZSB0byBleHBhbmQgdG8gaW5jbHVkZSBhbGwgcGVlciB2YWx1ZXMuIElmIHNldCB0byB0cnVlLCB0aGUgd2luZG93IGZyYW1lIHdpbGwgYmUgZGVmaW5lZCBieSBvZmZzZXQgdmFsdWVzIG9ubHkuIFRoaXMgc2V0dGluZyBvbmx5IGFmZmVjdHMgdGhvc2Ugb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCBvbiB0aGUgd2luZG93IGZyYW1lLCBuYW1lbHkgYWdncmVnYXRpb24gb3BlcmF0aW9ucyBhbmQgdGhlIGZpcnN0X3ZhbHVlLCBsYXN0X3ZhbHVlLCBhbmQgbnRoX3ZhbHVlIHdpbmRvdyBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYFxuICAgKi9cbiAgaWdub3JlUGVlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmaWVsZHMgZm9yIHBhcnRpdGlvbmluZyB0aGUgZGF0YSBvYmplY3RzIGludG8gc2VwYXJhdGUgd2luZG93cy4gSWYgdW5zcGVjaWZpZWQsIGFsbCBkYXRhIHBvaW50cyB3aWxsIGJlIGEgc2luZ2xlIGdyb3VwLlxuICAgKi9cbiAgZ3JvdXBieT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIHNvcnQgZmllbGQgZGVmaW5pdGlvbiBmb3Igc29ydGluZyBkYXRhIG9iamVjdHMgd2l0aGluIGEgd2luZG93LiBJZiB0d28gZGF0YSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGJ5IHRoZSBjb21wYXJhdG9yLCB0aGV5IGFyZSBjb25zaWRlcmVkIOKAnHBlZXLigJ0gdmFsdWVzIG9mIGVxdWFsIHJhbmsuIElmIHNvcnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIG9yZGVyIGlzIHVuZGVmaW5lZDogZGF0YSBvYmplY3RzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIG9ic2VydmVkIGFuZCBub25lIGFyZSBjb25zaWRlcmVkIHBlZXJzICh0aGUgaWdub3JlUGVlcnMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgc2V0IHRvIGB0cnVlYCkuXG4gICAqL1xuICBzb3J0PzogU29ydEZpZWxkW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRGF0YSB7XG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgZGF0YSBzb3VyY2UgdG8gbG9va3VwIGluLlxuICAgKi9cbiAgZGF0YTogRGF0YTtcbiAgLyoqXG4gICAqIEtleSBpbiBkYXRhIHRvIGxvb2t1cC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuICAvKipcbiAgICogRmllbGRzIGluIGZvcmVpZ24gZGF0YSB0byBsb29rdXAuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBlbnRpcmUgb2JqZWN0IGlzIHF1ZXJpZWQuXG4gICAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogS2V5IGluIHByaW1hcnkgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBsb29rdXA6IHN0cmluZztcblxuICAvKipcbiAgICogU2Vjb25kYXJ5IGRhdGEgcmVmZXJlbmNlLlxuICAgKi9cbiAgZnJvbTogTG9va3VwRGF0YTtcblxuICAvKipcbiAgICogVGhlIGZpZWxkIG9yIGZpZWxkcyBmb3Igc3RvcmluZyB0aGUgY29tcHV0ZWQgZm9ybXVsYSB2YWx1ZS5cbiAgICogSWYgYGZyb20uZmllbGRzYCBpcyBzcGVjaWZpZWQsIHRoZSB0cmFuc2Zvcm0gd2lsbCB1c2UgdGhlIHNhbWUgbmFtZXMgZm9yIGBhc2AuXG4gICAqIElmIGBmcm9tLmZpZWxkc2AgaXMgbm90IHNwZWNpZmllZCwgYGFzYCBoYXMgdG8gYmUgYSBzdHJpbmcgYW5kIHdlIHB1dCB0aGUgd2hvbGUgb2JqZWN0IGludG8gdGhlIGRhdGEgdW5kZXIgdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgKi9cbiAgYXM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIGxvb2t1cCBmYWlscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBudWxsYFxuICAgKi9cbiAgZGVmYXVsdD86IHN0cmluZztcbn1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb2t1cCh0OiBUcmFuc2Zvcm0pOiB0IGlzIExvb2t1cFRyYW5zZm9ybSB7XG4gIHJldHVybiB0Wydsb29rdXAnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3codDogVHJhbnNmb3JtKTogdCBpcyBXaW5kb3dUcmFuc2Zvcm0ge1xuICByZXR1cm4gdFsnd2luZG93J10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FsY3VsYXRlKHQ6IFRyYW5zZm9ybSk6IHQgaXMgQ2FsY3VsYXRlVHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ2NhbGN1bGF0ZSddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jpbih0OiBUcmFuc2Zvcm0pOiB0IGlzIEJpblRyYW5zZm9ybSB7XG4gIHJldHVybiAhIXRbJ2JpbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVW5pdCh0OiBUcmFuc2Zvcm0pOiB0IGlzIFRpbWVVbml0VHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ3RpbWVVbml0J10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWdncmVnYXRlKHQ6IFRyYW5zZm9ybSk6IHQgaXMgQWdncmVnYXRlVHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ2FnZ3JlZ2F0ZSddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrKHQ6IFRyYW5zZm9ybSk6IHQgaXMgU3RhY2tUcmFuc2Zvcm0ge1xuICByZXR1cm4gdFsnc3RhY2snXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm0gPSBGaWx0ZXJUcmFuc2Zvcm0gfCBDYWxjdWxhdGVUcmFuc2Zvcm0gfCBMb29rdXBUcmFuc2Zvcm0gfCBCaW5UcmFuc2Zvcm0gfCBUaW1lVW5pdFRyYW5zZm9ybSB8IEFnZ3JlZ2F0ZVRyYW5zZm9ybSB8IFdpbmRvd1RyYW5zZm9ybSB8IFN0YWNrVHJhbnNmb3JtO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVHJhbnNmb3JtKHRyYW5zZm9ybTogVHJhbnNmb3JtW10pIHtcbiAgcmV0dXJuIHRyYW5zZm9ybS5tYXAodCA9PiB7XG4gICAgaWYgKGlzRmlsdGVyKHQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWx0ZXI6IG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kKHQuZmlsdGVyLCBub3JtYWxpemVQcmVkaWNhdGUpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/type.d.ts b/build/src/type.d.ts new file mode 100644 index 0000000000..3036050339 --- /dev/null +++ b/build/src/type.d.ts @@ -0,0 +1,28 @@ +import { Flag } from './util'; +/** Constants and utilities for data type */ +/** Data type based on level of measurement */ +export declare namespace Type { + const QUANTITATIVE: 'quantitative'; + const ORDINAL: 'ordinal'; + const TEMPORAL: 'temporal'; + const NOMINAL: 'nominal'; + const LATITUDE: 'latitude'; + const LONGITUDE: 'longitude'; + const GEOJSON: 'geojson'; +} +export declare type BasicType = typeof Type.QUANTITATIVE | typeof Type.ORDINAL | typeof Type.TEMPORAL | typeof Type.NOMINAL; +export declare type GeoType = typeof Type.LATITUDE | typeof Type.LONGITUDE | typeof Type.GEOJSON; +export declare type Type = BasicType | GeoType; +export declare const TYPE_INDEX: Flag; +export declare function isType(t: any): t is Type; +export declare const QUANTITATIVE: "quantitative"; +export declare const ORDINAL: "ordinal"; +export declare const TEMPORAL: "temporal"; +export declare const NOMINAL: "nominal"; +export declare const GEOJSON: "geojson"; +/** + * Get full, lowercase type name for a given type. + * @param type + * @return Full type name. + */ +export declare function getFullName(type: Type | string): Type; diff --git a/build/src/type.js b/build/src/type.js new file mode 100644 index 0000000000..ee265c0044 --- /dev/null +++ b/build/src/type.js @@ -0,0 +1,66 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** Constants and utilities for data type */ +/** Data type based on level of measurement */ +var Type; +(function (Type) { + Type.QUANTITATIVE = 'quantitative'; + Type.ORDINAL = 'ordinal'; + Type.TEMPORAL = 'temporal'; + Type.NOMINAL = 'nominal'; + Type.LATITUDE = 'latitude'; + Type.LONGITUDE = 'longitude'; + Type.GEOJSON = 'geojson'; +})(Type = exports.Type || (exports.Type = {})); +exports.TYPE_INDEX = { + quantitative: 1, + ordinal: 1, + temporal: 1, + nominal: 1, + latitude: 1, + longitude: 1, + geojson: 1 +}; +function isType(t) { + return !!exports.TYPE_INDEX[t]; +} +exports.isType = isType; +exports.QUANTITATIVE = Type.QUANTITATIVE; +exports.ORDINAL = Type.ORDINAL; +exports.TEMPORAL = Type.TEMPORAL; +exports.NOMINAL = Type.NOMINAL; +exports.GEOJSON = Type.GEOJSON; +/** + * Get full, lowercase type name for a given type. + * @param type + * @return Full type name. + */ +function getFullName(type) { + if (type) { + type = type.toLowerCase(); + switch (type) { + case 'q': + case exports.QUANTITATIVE: + return 'quantitative'; + case 't': + case exports.TEMPORAL: + return 'temporal'; + case 'o': + case exports.ORDINAL: + return 'ordinal'; + case 'n': + case exports.NOMINAL: + return 'nominal'; + case Type.LATITUDE: + return 'latitude'; + case Type.LONGITUDE: + return 'longitude'; + case exports.GEOJSON: + return 'geojson'; + } + } + // If we get invalid input, return undefined type. + return undefined; +} +exports.getFullName = getFullName; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsNENBQTRDO0FBQzVDLDhDQUE4QztBQUU5QyxJQUFpQixJQUFJLENBU3BCO0FBVEQsV0FBaUIsSUFBSTtJQUNOLGlCQUFZLEdBQW1CLGNBQWMsQ0FBQztJQUM5QyxZQUFPLEdBQWMsU0FBUyxDQUFDO0lBQy9CLGFBQVEsR0FBZSxVQUFVLENBQUM7SUFDbEMsWUFBTyxHQUFjLFNBQVMsQ0FBQztJQUUvQixhQUFRLEdBQWUsVUFBVSxDQUFDO0lBQ2xDLGNBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLFlBQU8sR0FBYyxTQUFTLENBQUM7QUFDOUMsQ0FBQyxFQVRnQixJQUFJLEdBQUosWUFBSSxLQUFKLFlBQUksUUFTcEI7QUFNWSxRQUFBLFVBQVUsR0FBZTtJQUNwQyxZQUFZLEVBQUUsQ0FBQztJQUNmLE9BQU8sRUFBRSxDQUFDO0lBQ1YsUUFBUSxFQUFFLENBQUM7SUFDWCxPQUFPLEVBQUUsQ0FBQztJQUNWLFFBQVEsRUFBRSxDQUFDO0lBQ1gsU0FBUyxFQUFFLENBQUM7SUFDWixPQUFPLEVBQUUsQ0FBQztDQUNYLENBQUM7QUFFRixnQkFBdUIsQ0FBTTtJQUMzQixPQUFPLENBQUMsQ0FBQyxrQkFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFGRCx3QkFFQztBQUVZLFFBQUEsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7QUFDakMsUUFBQSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN2QixRQUFBLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ3pCLFFBQUEsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFFdkIsUUFBQSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVwQzs7OztHQUlHO0FBQ0gscUJBQTRCLElBQWlCO0lBQzNDLElBQUksSUFBSSxFQUFFO1FBQ1IsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixRQUFRLElBQUksRUFBRTtZQUNaLEtBQUssR0FBRyxDQUFDO1lBQ1QsS0FBSyxvQkFBWTtnQkFDZixPQUFPLGNBQWMsQ0FBQztZQUN4QixLQUFLLEdBQUcsQ0FBQztZQUNULEtBQUssZ0JBQVE7Z0JBQ1gsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLGVBQU87Z0JBQ1YsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLGVBQU87Z0JBQ1YsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsUUFBUTtnQkFDaEIsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsU0FBUztnQkFDakIsT0FBTyxXQUFXLENBQUM7WUFDckIsS0FBSyxlQUFPO2dCQUNWLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0tBQ0Y7SUFDRCxrREFBa0Q7SUFDbEQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQTFCRCxrQ0EwQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0ZsYWd9IGZyb20gJy4vdXRpbCc7XG4vKiogQ29uc3RhbnRzIGFuZCB1dGlsaXRpZXMgZm9yIGRhdGEgdHlwZSAqL1xuLyoqIERhdGEgdHlwZSBiYXNlZCBvbiBsZXZlbCBvZiBtZWFzdXJlbWVudCAqL1xuXG5leHBvcnQgbmFtZXNwYWNlIFR5cGUge1xuICBleHBvcnQgY29uc3QgUVVBTlRJVEFUSVZFOiAncXVhbnRpdGF0aXZlJyA9ICdxdWFudGl0YXRpdmUnO1xuICBleHBvcnQgY29uc3QgT1JESU5BTDogJ29yZGluYWwnID0gJ29yZGluYWwnO1xuICBleHBvcnQgY29uc3QgVEVNUE9SQUw6ICd0ZW1wb3JhbCcgPSAndGVtcG9yYWwnO1xuICBleHBvcnQgY29uc3QgTk9NSU5BTDogJ25vbWluYWwnID0gJ25vbWluYWwnO1xuXG4gIGV4cG9ydCBjb25zdCBMQVRJVFVERTogJ2xhdGl0dWRlJyA9ICdsYXRpdHVkZSc7XG4gIGV4cG9ydCBjb25zdCBMT05HSVRVREU6ICdsb25naXR1ZGUnID0gJ2xvbmdpdHVkZSc7XG4gIGV4cG9ydCBjb25zdCBHRU9KU09OOiAnZ2VvanNvbicgPSAnZ2VvanNvbic7XG59XG5leHBvcnQgdHlwZSBCYXNpY1R5cGUgPSB0eXBlb2YgVHlwZS5RVUFOVElUQVRJVkUgfCB0eXBlb2YgVHlwZS5PUkRJTkFMIHwgdHlwZW9mIFR5cGUuVEVNUE9SQUwgfCB0eXBlb2YgVHlwZS5OT01JTkFMO1xuZXhwb3J0IHR5cGUgR2VvVHlwZSA9IHR5cGVvZiBUeXBlLkxBVElUVURFIHwgdHlwZW9mIFR5cGUuTE9OR0lUVURFIHwgdHlwZW9mIFR5cGUuR0VPSlNPTjtcblxuZXhwb3J0IHR5cGUgVHlwZSA9IEJhc2ljVHlwZSB8IEdlb1R5cGU7XG5cbmV4cG9ydCBjb25zdCBUWVBFX0lOREVYOiBGbGFnPFR5cGU+ID0ge1xuICBxdWFudGl0YXRpdmU6IDEsXG4gIG9yZGluYWw6IDEsXG4gIHRlbXBvcmFsOiAxLFxuICBub21pbmFsOiAxLFxuICBsYXRpdHVkZTogMSxcbiAgbG9uZ2l0dWRlOiAxLFxuICBnZW9qc29uOiAxXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUeXBlKHQ6IGFueSk6IHQgaXMgVHlwZSB7XG4gIHJldHVybiAhIVRZUEVfSU5ERVhbdF07XG59XG5cbmV4cG9ydCBjb25zdCBRVUFOVElUQVRJVkUgPSBUeXBlLlFVQU5USVRBVElWRTtcbmV4cG9ydCBjb25zdCBPUkRJTkFMID0gVHlwZS5PUkRJTkFMO1xuZXhwb3J0IGNvbnN0IFRFTVBPUkFMID0gVHlwZS5URU1QT1JBTDtcbmV4cG9ydCBjb25zdCBOT01JTkFMID0gVHlwZS5OT01JTkFMO1xuXG5leHBvcnQgY29uc3QgR0VPSlNPTiA9IFR5cGUuR0VPSlNPTjtcblxuLyoqXG4gKiBHZXQgZnVsbCwgbG93ZXJjYXNlIHR5cGUgbmFtZSBmb3IgYSBnaXZlbiB0eXBlLlxuICogQHBhcmFtICB0eXBlXG4gKiBAcmV0dXJuIEZ1bGwgdHlwZSBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVsbE5hbWUodHlwZTogVHlwZXxzdHJpbmcpOiBUeXBlIHtcbiAgaWYgKHR5cGUpIHtcbiAgICB0eXBlID0gdHlwZS50b0xvd2VyQ2FzZSgpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAncSc6XG4gICAgICBjYXNlIFFVQU5USVRBVElWRTpcbiAgICAgICAgcmV0dXJuICdxdWFudGl0YXRpdmUnO1xuICAgICAgY2FzZSAndCc6XG4gICAgICBjYXNlIFRFTVBPUkFMOlxuICAgICAgICByZXR1cm4gJ3RlbXBvcmFsJztcbiAgICAgIGNhc2UgJ28nOlxuICAgICAgY2FzZSBPUkRJTkFMOlxuICAgICAgICByZXR1cm4gJ29yZGluYWwnO1xuICAgICAgY2FzZSAnbic6XG4gICAgICBjYXNlIE5PTUlOQUw6XG4gICAgICAgIHJldHVybiAnbm9taW5hbCc7XG4gICAgICBjYXNlIFR5cGUuTEFUSVRVREU6XG4gICAgICAgIHJldHVybiAnbGF0aXR1ZGUnO1xuICAgICAgY2FzZSBUeXBlLkxPTkdJVFVERTpcbiAgICAgICAgcmV0dXJuICdsb25naXR1ZGUnO1xuICAgICAgY2FzZSBHRU9KU09OOlxuICAgICAgICByZXR1cm4gJ2dlb2pzb24nO1xuICAgIH1cbiAgfVxuICAvLyBJZiB3ZSBnZXQgaW52YWxpZCBpbnB1dCwgcmV0dXJuIHVuZGVmaW5lZCB0eXBlLlxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19 \ No newline at end of file diff --git a/build/src/util.d.ts b/build/src/util.d.ts new file mode 100644 index 0000000000..03db493848 --- /dev/null +++ b/build/src/util.d.ts @@ -0,0 +1,111 @@ +import stableStringify from 'json-stable-stringify'; +import { LogicalOperand } from './logical'; +/** + * Creates an object composed of the picked object properties. + * + * Example: (from lodash) + * + * var object = {'a': 1, 'b': '2', 'c': 3}; + * pick(object, ['a', 'c']); + * // → {'a': 1, 'c': 3} + * + */ +export declare function pick(obj: object, props: string[]): {}; +/** + * The opposite of _.pick; this method creates an object composed of the own + * and inherited enumerable string keyed properties of object that are not omitted. + */ +export declare function omit(obj: object, props: string[]): {}; +/** + * Converts any object into a string representation that can be consumed by humans. + */ +export declare const stringify: typeof stableStringify; +/** + * Converts any object into a string of limited size, or a number. + */ +export declare function hash(a: any): string | number; +export declare function contains(array: T[], item: T): boolean; +/** Returns the array without the elements in item */ +export declare function without(array: T[], excludedItems: T[]): T[]; +export declare function union(array: T[], other: T[]): T[]; +/** + * Returns true if any item returns true. + */ +export declare function some(arr: T[], f: (d: T, k?: any, i?: any) => boolean): boolean; +/** + * Returns true if all items return true. + */ +export declare function every(arr: T[], f: (d: T, k?: any, i?: any) => boolean): boolean; +export declare function flatten(arrays: any[]): any; +/** + * recursively merges src into dest + */ +export declare function mergeDeep(dest: T, ...src: Partial[]): T; +export declare function unique(values: T[], f: (item: T) => string | number): T[]; +export interface Dict { + [key: string]: T; +} +export declare type StringSet = Dict; +/** + * Returns true if the two dictionaries disagree. Applies only to defined values. + */ +export declare function differ(dict: Dict, other: Dict): boolean; +export declare function hasIntersection(a: StringSet, b: StringSet): boolean; +export declare function isNumeric(num: string | number): boolean; +export declare function differArray(array: T[], other: T[]): boolean; +export declare const keys: (o: T) => Extract[]; +export declare function vals(x: { + [key: string]: T; +}): T[]; +export declare type Flag = { + [K in S]: 1; +}; +export declare function flagKeys(f: Flag): S[]; +export declare function duplicate(obj: T): T; +export declare function isBoolean(b: any): b is boolean; +/** + * Convert a string into a valid variable name + */ +export declare function varName(s: string): string; +export declare function logicalExpr(op: LogicalOperand, cb: Function): string; +export declare type Diff = ({ + [P in T]: P; +} & { + [P in U]: never; +} & { + [x: string]: never; +})[T]; +export declare type Omit = { + [P in Diff]: T[P]; +}; +/** + * Delete nested property of an object, and delete the ancestors of the property if they become empty. + */ +export declare function deleteNestedProperty(obj: any, orderedProps: string[]): boolean; +export declare function titlecase(s: string): string; +/** + * Converts a path to an access path with datum. + * @param path The field name. + * @param datum The string to use for `datum`. + */ +export declare function accessPathWithDatum(path: string, datum?: string): string; +/** + * Return access with datum to the falttened field. + * @param path The field name. + * @param datum The string to use for `datum`. + */ +export declare function flatAccessWithDatum(path: string, datum?: string): string; +/** + * Replaces path accesses with access to non-nested field. + * For example, `foo["bar"].baz` becomes `foo\\.bar\\.baz`. + */ +export declare function replacePathInField(path: string): string; +/** + * Remove path accesses with access from field. + * For example, `foo["bar"].baz` becomes `foo.bar.baz`. + */ +export declare function removePathFromField(path: string): string; +/** + * Count the depth of the path. Returns 1 for fields that are not nested. + */ +export declare function accessPathDepth(path: string): number; diff --git a/build/src/util.js b/build/src/util.js new file mode 100644 index 0000000000..b02b226107 --- /dev/null +++ b/build/src/util.js @@ -0,0 +1,325 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var json_stable_stringify_1 = tslib_1.__importDefault(require("json-stable-stringify")); +var vega_util_1 = require("vega-util"); +var logical_1 = require("./logical"); +/** + * Creates an object composed of the picked object properties. + * + * Example: (from lodash) + * + * var object = {'a': 1, 'b': '2', 'c': 3}; + * pick(object, ['a', 'c']); + * // → {'a': 1, 'c': 3} + * + */ +function pick(obj, props) { + var copy = {}; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + if (obj.hasOwnProperty(prop)) { + copy[prop] = obj[prop]; + } + } + return copy; +} +exports.pick = pick; +/** + * The opposite of _.pick; this method creates an object composed of the own + * and inherited enumerable string keyed properties of object that are not omitted. + */ +function omit(obj, props) { + var copy = tslib_1.__assign({}, obj); + for (var _i = 0, props_2 = props; _i < props_2.length; _i++) { + var prop = props_2[_i]; + delete copy[prop]; + } + return copy; +} +exports.omit = omit; +/** + * Converts any object into a string representation that can be consumed by humans. + */ +exports.stringify = json_stable_stringify_1.default; +/** + * Converts any object into a string of limited size, or a number. + */ +function hash(a) { + if (vega_util_1.isNumber(a)) { + return a; + } + var str = vega_util_1.isString(a) ? a : json_stable_stringify_1.default(a); + // short strings can be used as hash directly, longer strings are hashed to reduce memory usage + if (str.length < 100) { + return str; + } + // from http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ + var h = 0; + for (var i = 0; i < str.length; i++) { + var char = str.charCodeAt(i); + h = ((h << 5) - h) + char; + h = h & h; // Convert to 32bit integer + } + return h; +} +exports.hash = hash; +function contains(array, item) { + return array.indexOf(item) > -1; +} +exports.contains = contains; +/** Returns the array without the elements in item */ +function without(array, excludedItems) { + return array.filter(function (item) { return !contains(excludedItems, item); }); +} +exports.without = without; +function union(array, other) { + return array.concat(without(other, array)); +} +exports.union = union; +/** + * Returns true if any item returns true. + */ +function some(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (f(arr[k], k, i++)) { + return true; + } + } + return false; +} +exports.some = some; +/** + * Returns true if all items return true. + */ +function every(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (!f(arr[k], k, i++)) { + return false; + } + } + return true; +} +exports.every = every; +function flatten(arrays) { + return [].concat.apply([], arrays); +} +exports.flatten = flatten; +/** + * recursively merges src into dest + */ +function mergeDeep(dest) { + var src = []; + for (var _i = 1; _i < arguments.length; _i++) { + src[_i - 1] = arguments[_i]; + } + for (var _a = 0, src_1 = src; _a < src_1.length; _a++) { + var s = src_1[_a]; + dest = deepMerge_(dest, s); + } + return dest; +} +exports.mergeDeep = mergeDeep; +// recursively merges src into dest +function deepMerge_(dest, src) { + if (typeof src !== 'object' || src === null) { + return dest; + } + for (var p in src) { + if (!src.hasOwnProperty(p)) { + continue; + } + if (src[p] === undefined) { + continue; + } + if (typeof src[p] !== 'object' || vega_util_1.isArray(src[p]) || src[p] === null) { + dest[p] = src[p]; + } + else if (typeof dest[p] !== 'object' || dest[p] === null) { + dest[p] = mergeDeep(vega_util_1.isArray(src[p].constructor) ? [] : {}, src[p]); + } + else { + mergeDeep(dest[p], src[p]); + } + } + return dest; +} +function unique(values, f) { + var results = []; + var u = {}; + var v; + for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { + var val = values_1[_i]; + v = f(val); + if (v in u) { + continue; + } + u[v] = 1; + results.push(val); + } + return results; +} +exports.unique = unique; +/** + * Returns true if the two dictionaries disagree. Applies only to defined values. + */ +function differ(dict, other) { + for (var key in dict) { + if (dict.hasOwnProperty(key)) { + if (other[key] && dict[key] && other[key] !== dict[key]) { + return true; + } + } + } + return false; +} +exports.differ = differ; +function hasIntersection(a, b) { + for (var key in a) { + if (key in b) { + return true; + } + } + return false; +} +exports.hasIntersection = hasIntersection; +function isNumeric(num) { + return !isNaN(num); +} +exports.isNumeric = isNumeric; +function differArray(array, other) { + if (array.length !== other.length) { + return true; + } + array.sort(); + other.sort(); + for (var i = 0; i < array.length; i++) { + if (other[i] !== array[i]) { + return true; + } + } + return false; +} +exports.differArray = differArray; +// This is a stricter version of Object.keys but with better types. See https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208 +exports.keys = Object.keys; +function vals(x) { + var _vals = []; + for (var k in x) { + if (x.hasOwnProperty(k)) { + _vals.push(x[k]); + } + } + return _vals; +} +exports.vals = vals; +function flagKeys(f) { + return exports.keys(f); +} +exports.flagKeys = flagKeys; +function duplicate(obj) { + return JSON.parse(JSON.stringify(obj)); +} +exports.duplicate = duplicate; +function isBoolean(b) { + return b === true || b === false; +} +exports.isBoolean = isBoolean; +/** + * Convert a string into a valid variable name + */ +function varName(s) { + // Replace non-alphanumeric characters (anything besides a-zA-Z0-9_) with _ + var alphanumericS = s.replace(/\W/g, '_'); + // Add _ if the string has leading numbers. + return (s.match(/^\d+/) ? '_' : '') + alphanumericS; +} +exports.varName = varName; +function logicalExpr(op, cb) { + if (logical_1.isLogicalNot(op)) { + return '!(' + logicalExpr(op.not, cb) + ')'; + } + else if (logical_1.isLogicalAnd(op)) { + return '(' + op.and.map(function (and) { return logicalExpr(and, cb); }).join(') && (') + ')'; + } + else if (logical_1.isLogicalOr(op)) { + return '(' + op.or.map(function (or) { return logicalExpr(or, cb); }).join(') || (') + ')'; + } + else { + return cb(op); + } +} +exports.logicalExpr = logicalExpr; +/** + * Delete nested property of an object, and delete the ancestors of the property if they become empty. + */ +function deleteNestedProperty(obj, orderedProps) { + if (orderedProps.length === 0) { + return true; + } + var prop = orderedProps.shift(); + if (deleteNestedProperty(obj[prop], orderedProps)) { + delete obj[prop]; + } + return Object.keys(obj).length === 0; +} +exports.deleteNestedProperty = deleteNestedProperty; +function titlecase(s) { + return s.charAt(0).toUpperCase() + s.substr(1); +} +exports.titlecase = titlecase; +/** + * Converts a path to an access path with datum. + * @param path The field name. + * @param datum The string to use for `datum`. + */ +function accessPathWithDatum(path, datum) { + if (datum === void 0) { datum = 'datum'; } + var pieces = vega_util_1.splitAccessPath(path); + var prefixes = []; + for (var i = 1; i <= pieces.length; i++) { + var prefix = "[" + pieces.slice(0, i).map(vega_util_1.stringValue).join('][') + "]"; + prefixes.push("" + datum + prefix); + } + return prefixes.join(' && '); +} +exports.accessPathWithDatum = accessPathWithDatum; +/** + * Return access with datum to the falttened field. + * @param path The field name. + * @param datum The string to use for `datum`. + */ +function flatAccessWithDatum(path, datum) { + if (datum === void 0) { datum = 'datum'; } + return datum + "[" + vega_util_1.stringValue(vega_util_1.splitAccessPath(path).join('.')) + "]"; +} +exports.flatAccessWithDatum = flatAccessWithDatum; +/** + * Replaces path accesses with access to non-nested field. + * For example, `foo["bar"].baz` becomes `foo\\.bar\\.baz`. + */ +function replacePathInField(path) { + return "" + vega_util_1.splitAccessPath(path).map(function (p) { return p.replace('.', '\\.'); }).join('\\.'); +} +exports.replacePathInField = replacePathInField; +/** + * Remove path accesses with access from field. + * For example, `foo["bar"].baz` becomes `foo.bar.baz`. + */ +function removePathFromField(path) { + return "" + vega_util_1.splitAccessPath(path).join('.'); +} +exports.removePathFromField = removePathFromField; +/** + * Count the depth of the path. Returns 1 for fields that are not nested. + */ +function accessPathDepth(path) { + if (!path) { + return 0; + } + return vega_util_1.splitAccessPath(path).length; +} +exports.accessPathDepth = accessPathDepth; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdGQUFvRDtBQUNwRCx1Q0FBb0Y7QUFDcEYscUNBQWtGO0FBRWxGOzs7Ozs7Ozs7R0FTRztBQUNILGNBQXFCLEdBQVcsRUFBRSxLQUFlO0lBQy9DLElBQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFtQixVQUFLLEVBQUwsZUFBSyxFQUFMLG1CQUFLLEVBQUwsSUFBSyxFQUFFO1FBQXJCLElBQU0sSUFBSSxjQUFBO1FBQ2IsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzVCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEI7S0FDRjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQVJELG9CQVFDO0FBRUQ7OztHQUdHO0FBQ0gsY0FBcUIsR0FBVyxFQUFFLEtBQWU7SUFDL0MsSUFBTSxJQUFJLHdCQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLEtBQW1CLFVBQUssRUFBTCxlQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLLEVBQUU7UUFBckIsSUFBTSxJQUFJLGNBQUE7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNuQjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQU5ELG9CQU1DO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLFNBQVMsR0FBRywrQkFBZSxDQUFDO0FBRXpDOztHQUVHO0FBQ0gsY0FBcUIsQ0FBTTtJQUN6QixJQUFJLG9CQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDZixPQUFPLENBQUMsQ0FBQztLQUNWO0lBRUQsSUFBTSxHQUFHLEdBQUcsb0JBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywrQkFBZSxDQUFDLENBQUMs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Q0QsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFSRCxrREFRQztBQUVEOzs7O0dBSUc7QUFDSCw2QkFBb0MsSUFBWSxFQUFFLEtBQWE7SUFBYixzQkFBQSxFQUFBLGVBQWE7SUFDN0QsT0FBVSxLQUFLLFNBQUksdUJBQVcsQ0FBQywyQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFHLENBQUM7QUFDckUsQ0FBQztBQUZELGtEQUVDO0FBRUQ7OztHQUdHO0FBQ0gsNEJBQW1DLElBQVk7SUFDN0MsT0FBTyxLQUFHLDJCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQXJCLENBQXFCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFHLENBQUM7QUFDaEYsQ0FBQztBQUZELGdEQUVDO0FBRUQ7OztHQUdHO0FBQ0gsNkJBQW9DLElBQVk7SUFDOUMsT0FBTyxLQUFHLDJCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBRyxDQUFDO0FBQzlDLENBQUM7QUFGRCxrREFFQztBQUVEOztHQUVHO0FBQ0gseUJBQWdDLElBQVk7SUFDMUMsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNULE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxPQUFPLDJCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RDLENBQUM7QUFMRCwwQ0FLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzdGFibGVTdHJpbmdpZnkgZnJvbSAnanNvbi1zdGFibGUtc3RyaW5naWZ5JztcbmltcG9ydCB7aXNBcnJheSwgaXNOdW1iZXIsIGlzU3RyaW5nLCBzcGxpdEFjY2Vzc1BhdGgsIHN0cmluZ1ZhbHVlfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtpc0xvZ2ljYWxBbmQsIGlzTG9naWNhbE5vdCwgaXNMb2dpY2FsT3IsIExvZ2ljYWxPcGVyYW5kfSBmcm9tICcuL2xvZ2ljYWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgb2JqZWN0IHByb3BlcnRpZXMuXG4gKlxuICogRXhhbXBsZTogIChmcm9tIGxvZGFzaClcbiAqXG4gKiB2YXIgb2JqZWN0ID0geydhJzogMSwgJ2InOiAnMicsICdjJzogM307XG4gKiBwaWNrKG9iamVjdCwgWydhJywgJ2MnXSk7XG4gKiAvLyDihpIgeydhJzogMSwgJ2MnOiAzfVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2sob2JqOiBvYmplY3QsIHByb3BzOiBzdHJpbmdbXSkge1xuICBjb25zdCBjb3B5ID0ge307XG4gIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpIHtcbiAgICAgIGNvcHlbcHJvcF0gPSBvYmpbcHJvcF07XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3B5O1xufVxuXG4vKipcbiAqIFRoZSBvcHBvc2l0ZSBvZiBfLnBpY2s7IHRoaXMgbWV0aG9kIGNyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBvd25cbiAqIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBvYmplY3QgdGhhdCBhcmUgbm90IG9taXR0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbWl0KG9iajogb2JqZWN0LCBwcm9wczogc3RyaW5nW10pIHtcbiAgY29uc3QgY29weSA9IHsuLi5vYmp9O1xuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICBkZWxldGUgY29weVtwcm9wXTtcbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbnkgb2JqZWN0IGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgaHVtYW5zLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5naWZ5ID0gc3RhYmxlU3RyaW5naWZ5O1xuXG4vKipcbiAqIENvbnZlcnRzIGFueSBvYmplY3QgaW50byBhIHN0cmluZyBvZiBsaW1pdGVkIHNpemUsIG9yIGEgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaChhOiBhbnkpIHtcbiAgaWYgKGlzTnVtYmVyKGEpKSB7XG4gICAgcmV0dXJuIGE7XG4gIH1cblxuICBjb25zdCBzdHIgPSBpc1N0cmluZyhhKSA/IGEgOiBzdGFibGVTdHJpbmdpZnkoYSk7XG5cbiAgLy8gc2hvcnQgc3RyaW5ncyBjYW4gYmUgdXNlZCBhcyBoYXNoIGRpcmVjdGx5LCBsb25nZXIgc3RyaW5ncyBhcmUgaGFzaGVkIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2VcbiAgaWYgKHN0ci5sZW5ndGggPCAxMDApIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgLy8gZnJvbSBodHRwOi8vd2VyeGx0ZC5jb20vd3AvMjAxMC8wNS8xMy9qYXZhc2NyaXB0LWltcGxlbWVudGF0aW9uLW9mLWphdmFzLXN0cmluZy1oYXNoY29kZS1tZXRob2QvXG4gIGxldCBoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjaGFyID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gICAgaCA9ICgoaDw8NSktaCkrY2hhcjtcbiAgICBoID0gaCAmIGg7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICB9XG4gIHJldHVybiBoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnM8VD4oYXJyYXk6IFRbXSwgaXRlbTogVCkge1xuICByZXR1cm4gYXJyYXkuaW5kZXhPZihpdGVtKSA+IC0xO1xufVxuXG4vKiogUmV0dXJucyB0aGUgYXJyYXkgd2l0aG91dCB0aGUgZWxlbWVudHMgaW4gaXRlbSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhvdXQ8VD4oYXJyYXk6IFRbXSwgZXhjbHVkZWRJdGVtczogVFtdKSB7XG4gIHJldHVybiBhcnJheS5maWx0ZXIoaXRlbSA9PiAhY29udGFpbnMoZXhjbHVkZWRJdGVtcywgaXRlbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pb248VD4oYXJyYXk6IFRbXSwgb3RoZXI6IFRbXSkge1xuICByZXR1cm4gYXJyYXkuY29uY2F0KHdpdGhvdXQob3RoZXIsIGFycmF5KSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFueSBpdGVtIHJldHVybnMgdHJ1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvbWU8VD4oYXJyOiBUW10sIGY6IChkOiBULCBrPzogYW55LCBpPzogYW55KSA9PiBib29sZWFuKSB7XG4gIGxldCBpID0gMDtcbiAgZm9yIChsZXQgayA9IDA7IGs8YXJyLmxlbmd0aDsgaysrKSB7XG4gICAgaWYgKGYoYXJyW2tdLCBrLCBpKyspKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgaXRlbXMgcmV0dXJuIHRydWUuXG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gZXZlcnk8VD4oYXJyOiBUW10sIGY6IChkOiBULCBrPzogYW55LCBpPzogYW55KSA9PiBib29sZWFuKSB7XG4gIGxldCBpID0gMDtcbiAgZm9yIChsZXQgayA9IDA7IGs8YXJyLmxlbmd0aDsgaysrKSB7XG4gICAgaWYgKCFmKGFycltrXSwgaywgaSsrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXlzOiBhbnlbXSkge1xuICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBhcnJheXMpO1xufVxuXG4vKipcbiAqIHJlY3Vyc2l2ZWx5IG1lcmdlcyBzcmMgaW50byBkZXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXA8VD4oZGVzdDogVCwgLi4uc3JjOiBQYXJ0aWFsPFQ+W10pOiBUIHtcbiAgZm9yIChjb25zdCBzIG9mIHNyYykge1xuICAgIGRlc3QgPSBkZWVwTWVyZ2VfKGRlc3QsIHMpO1xuICB9XG4gIHJldHVybiBkZXN0O1xufVxuXG4vLyByZWN1cnNpdmVseSBtZXJnZXMgc3JjIGludG8gZGVzdFxuZnVuY3Rpb24gZGVlcE1lcmdlXyhkZXN0OiBhbnksIHNyYzogYW55KSB7XG4gIGlmICh0eXBlb2Ygc3JjICE9PSAnb2JqZWN0JyB8fCBzcmMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZGVzdDtcbiAgfVxuXG4gIGZvciAoY29uc3QgcCBpbiBzcmMpIHtcbiAgICBpZiAoIXNyYy5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzcmNbcF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc3JjW3BdICE9PSAnb2JqZWN0JyB8fCBpc0FycmF5KHNyY1twXSkgfHwgc3JjW3BdID09PSBudWxsKSB7XG4gICAgICBkZXN0W3BdID0gc3JjW3BdO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlc3RbcF0gIT09ICdvYmplY3QnIHx8IGRlc3RbcF0gPT09IG51bGwpIHtcbiAgICAgIGRlc3RbcF0gPSBtZXJnZURlZXAoaXNBcnJheShzcmNbcF0uY29uc3RydWN0b3IpID8gW10gOiB7fSwgc3JjW3BdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VEZWVwKGRlc3RbcF0sIHNyY1twXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBkZXN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlPFQ+KHZhbHVlczogVFtdLCBmOiAoaXRlbTogVCkgPT4gc3RyaW5nIHwgbnVtYmVyKTogVFtdIHtcbiAgY29uc3QgcmVzdWx0czogYW55W10gPSBbXTtcbiAgY29uc3QgdSA9IHt9O1xuICBsZXQgdjogc3RyaW5nIHwgbnVtYmVyO1xuICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMpIHtcbiAgICB2ID0gZih2YWwpO1xuICAgIGlmICh2IGluIHUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB1W3ZdID0gMTtcbiAgICByZXN1bHRzLnB1c2godmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWN0PFQ+IHtcbiAgW2tleTogc3RyaW5nXTogVDtcbn1cblxuZXhwb3J0IHR5cGUgU3RyaW5nU2V0ID0gRGljdDx0cnVlPjtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBkaWN0aW9uYXJpZXMgZGlzYWdyZWUuIEFwcGxpZXMgb25seSB0byBkZWZpbmVkIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcjxUPihkaWN0OiBEaWN0PFQ+LCBvdGhlcjogRGljdDxUPikge1xuICBmb3IgKGNvbnN0IGtleSBpbiBkaWN0KSB7XG4gICAgaWYgKGRpY3QuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgaWYgKG90aGVyW2tleV0gJiYgZGljdFtrZXldICYmIG90aGVyW2tleV0gIT09IGRpY3Rba2V5XSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzSW50ZXJzZWN0aW9uKGE6IFN0cmluZ1NldCwgYjogU3RyaW5nU2V0KSB7XG4gIGZvciAoY29uc3Qga2V5IGluIGEpIHtcbiAgICBpZiAoa2V5IGluIGIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWVyaWMobnVtOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgcmV0dXJuICFpc05hTihudW0gYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlckFycmF5PFQ+KGFycmF5OiBUW10sIG90aGVyOiBUW10pIHtcbiAgaWYgKGFycmF5Lmxlbmd0aCAhPT0gb3RoZXIubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhcnJheS5zb3J0KCk7XG4gIG90aGVyLnNvcnQoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG90aGVyW2ldICE9PSBhcnJheVtpXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBUaGlzIGlzIGEgc3RyaWN0ZXIgdmVyc2lvbiBvZiBPYmplY3Qua2V5cyBidXQgd2l0aCBiZXR0ZXIgdHlwZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvcHVsbC8xMjI1MyNpc3N1ZWNvbW1lbnQtMjYzMTMyMjA4XG5leHBvcnQgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzIGFzIDxUPihvOiBUKSA9PiAoRXh0cmFjdDxrZXlvZiBULCBzdHJpbmc+KVtdO1xuXG5leHBvcnQgZnVuY3Rpb24gdmFsczxUPih4OiB7W2tleTogc3RyaW5nXTogVH0pOiBUW10ge1xuICBjb25zdCBfdmFsczogVFtdID0gW107XG4gIGZvciAoY29uc3QgayBpbiB4KSB7XG4gICAgaWYgKHguaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgIF92YWxzLnB1c2goeFtrXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBfdmFscztcbn1cblxuLy8gVXNpbmcgbWFwcGVkIHR5cGUgdG8gZGVjbGFyZSBhIGNvbGxlY3Qgb2YgZmxhZ3MgZm9yIGEgc3RyaW5nIGxpdGVyYWwgdHlwZSBTXG4vLyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlc1xuZXhwb3J0IHR5cGUgRmxhZzxTIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW0sgaW4gU106IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGFnS2V5czxTIGV4dGVuZHMgc3RyaW5nPihmOiBGbGFnPFM+KTogU1tdIHtcbiAgcmV0dXJuIGtleXMoZikgYXMgU1tdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZHVwbGljYXRlPFQ+KG9iajogVCk6IFQge1xuICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm9vbGVhbihiOiBhbnkpOiBiIGlzIGJvb2xlYW4ge1xuICByZXR1cm4gYiA9PT0gdHJ1ZSB8fCBiID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYSB2YWxpZCB2YXJpYWJsZSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJOYW1lKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFJlcGxhY2Ugbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIChhbnl0aGluZyBiZXNpZGVzIGEtekEtWjAtOV8pIHdpdGggX1xuICBjb25zdCBhbHBoYW51bWVyaWNTID0gcy5yZXBsYWNlKC9cXFcvZywgJ18nKTtcblxuICAvLyBBZGQgXyBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG51bWJlcnMuXG4gIHJldHVybiAocy5tYXRjaCgvXlxcZCsvKSA/ICdfJyA6ICcnKSArIGFscGhhbnVtZXJpY1M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2dpY2FsRXhwcjxUPihvcDogTG9naWNhbE9wZXJhbmQ8VD4sIGNiOiBGdW5jdGlvbik6IHN0cmluZyB7XG4gIGlmIChpc0xvZ2ljYWxOb3Qob3ApKSB7XG4gICAgcmV0dXJuICchKCcgKyBsb2dpY2FsRXhwcihvcC5ub3QsIGNiKSArICcpJztcbiAgfSBlbHNlIGlmIChpc0xvZ2ljYWxBbmQob3ApKSB7XG4gICAgcmV0dXJuICcoJyArIG9wLmFuZC5tYXAoKGFuZDogTG9naWNhbE9wZXJhbmQ8VD4pID0+IGxvZ2ljYWxFeHByKGFuZCwgY2IpKS5qb2luKCcpICYmICgnKSArICcpJztcbiAgfSBlbHNlIGlmIChpc0xvZ2ljYWxPcihvcCkpIHtcbiAgICByZXR1cm4gJygnICsgb3Aub3IubWFwKChvcjogTG9naWNhbE9wZXJhbmQ8VD4pID0+IGxvZ2ljYWxFeHByKG9yLCBjYikpLmpvaW4oJykgfHwgKCcpICsgJyknO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjYihvcCk7XG4gIH1cbn1cblxuLy8gT21pdCBmcm9tIGh0dHA6Ly9pZGVhc2ludG9zb2Z0d2FyZS5jb20vdHlwZXNjcmlwdC1hZHZhbmNlZC10cmlja3MvXG5leHBvcnQgdHlwZSBEaWZmPFQgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIFUgZXh0ZW5kcyBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+ID0gKHtbUCBpbiBUXTogUCB9ICYge1tQIGluIFVdOiBuZXZlciB9ICYgeyBbeDogc3RyaW5nXTogbmV2ZXIgfSlbVF07XG5leHBvcnQgdHlwZSBPbWl0PFQsIEsgZXh0ZW5kcyBrZXlvZiBUPiA9IHtbUCBpbiBEaWZmPGtleW9mIFQsIEs+XTogVFtQXX07XG5cbi8qKlxuICogRGVsZXRlIG5lc3RlZCBwcm9wZXJ0eSBvZiBhbiBvYmplY3QsIGFuZCBkZWxldGUgdGhlIGFuY2VzdG9ycyBvZiB0aGUgcHJvcGVydHkgaWYgdGhleSBiZWNvbWUgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVOZXN0ZWRQcm9wZXJ0eShvYmo6IGFueSwgb3JkZXJlZFByb3BzOiBzdHJpbmdbXSkge1xuICBpZiAob3JkZXJlZFByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHByb3AgPSBvcmRlcmVkUHJvcHMuc2hpZnQoKTtcbiAgaWYgKGRlbGV0ZU5lc3RlZFByb3BlcnR5KG9ialtwcm9wXSwgb3JkZXJlZFByb3BzKSkge1xuICAgIGRlbGV0ZSBvYmpbcHJvcF07XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGl0bGVjYXNlKHM6IHN0cmluZykge1xuICByZXR1cm4gcy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHMuc3Vic3RyKDEpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgcGF0aCB0byBhbiBhY2Nlc3MgcGF0aCB3aXRoIGRhdHVtLlxuICogQHBhcmFtIHBhdGggVGhlIGZpZWxkIG5hbWUuXG4gKiBAcGFyYW0gZGF0dW0gVGhlIHN0cmluZyB0byB1c2UgZm9yIGBkYXR1bWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhY2Nlc3NQYXRoV2l0aERhdHVtKHBhdGg6IHN0cmluZywgZGF0dW09J2RhdHVtJykge1xuICBjb25zdCBwaWVjZXMgPSBzcGxpdEFjY2Vzc1BhdGgocGF0aCk7XG4gIGNvbnN0IHByZWZpeGVzID0gW107XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IHBpZWNlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHByZWZpeCA9IGBbJHtwaWVjZXMuc2xpY2UoMCxpKS5tYXAoc3RyaW5nVmFsdWUpLmpvaW4oJ11bJyl9XWA7XG4gICAgcHJlZml4ZXMucHVzaChgJHtkYXR1bX0ke3ByZWZpeH1gKTtcbiAgfVxuICByZXR1cm4gcHJlZml4ZXMuam9pbignICYmICcpO1xufVxuXG4vKipcbiAqIFJldHVybiBhY2Nlc3Mgd2l0aCBkYXR1bSB0byB0aGUgZmFsdHRlbmVkIGZpZWxkLlxuICogQHBhcmFtIHBhdGggVGhlIGZpZWxkIG5hbWUuXG4gKiBAcGFyYW0gZGF0dW0gVGhlIHN0cmluZyB0byB1c2UgZm9yIGBkYXR1bWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0QWNjZXNzV2l0aERhdHVtKHBhdGg6IHN0cmluZywgZGF0dW09J2RhdHVtJykge1xuICByZXR1cm4gYCR7ZGF0dW19WyR7c3RyaW5nVmFsdWUoc3BsaXRBY2Nlc3NQYXRoKHBhdGgpLmpvaW4oJy4nKSl9XWA7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgcGF0aCBhY2Nlc3NlcyB3aXRoIGFjY2VzcyB0byBub24tbmVzdGVkIGZpZWxkLlxuICogRm9yIGV4YW1wbGUsIGBmb29bXCJiYXJcIl0uYmF6YCBiZWNvbWVzIGBmb29cXFxcLmJhclxcXFwuYmF6YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VQYXRoSW5GaWVsZChwYXRoOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke3NwbGl0QWNjZXNzUGF0aChwYXRoKS5tYXAocCA9PiBwLnJlcGxhY2UoJy4nLCAnXFxcXC4nKSkuam9pbignXFxcXC4nKX1gO1xufVxuXG4vKipcbiAqIFJlbW92ZSBwYXRoIGFjY2Vzc2VzIHdpdGggYWNjZXNzIGZyb20gZmllbGQuXG4gKiBGb3IgZXhhbXBsZSwgYGZvb1tcImJhclwiXS5iYXpgIGJlY29tZXMgYGZvby5iYXIuYmF6YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhdGhGcm9tRmllbGQocGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtzcGxpdEFjY2Vzc1BhdGgocGF0aCkuam9pbignLicpfWA7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIGRlcHRoIG9mIHRoZSBwYXRoLiBSZXR1cm5zIDEgZm9yIGZpZWxkcyB0aGF0IGFyZSBub3QgbmVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNjZXNzUGF0aERlcHRoKHBhdGg6IHN0cmluZykge1xuICBpZiAoIXBhdGgpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gc3BsaXRBY2Nlc3NQYXRoKHBhdGgpLmxlbmd0aDtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/src/validate.d.ts b/build/src/validate.d.ts new file mode 100644 index 0000000000..58369b36b0 --- /dev/null +++ b/build/src/validate.d.ts @@ -0,0 +1,31 @@ +import { FacetedCompositeUnitSpec } from './spec'; +export interface RequiredChannelMap { + [mark: string]: Array; +} +/** + * Required Encoding Channels for each mark type + */ +export declare const DEFAULT_REQUIRED_CHANNEL_MAP: RequiredChannelMap; +export interface SupportedChannelMap { + [mark: string]: { + [channel: string]: boolean; + }; +} +/** + * Supported Encoding Channel for each mark type + */ +export declare const DEFAULT_SUPPORTED_CHANNEL_TYPE: SupportedChannelMap; +/** + * Further check if encoding mapping of a spec is invalid and + * return error if it is invalid. + * + * This checks if + * (1) all the required encoding channels for the mark type are specified + * (2) all the specified encoding channels are supported by the mark type + * @param {[type]} spec [description] + * @param {RequiredChannelMap = DefaultRequiredChannelMap} requiredChannelMap + * @param {SupportedChannelMap = DefaultSupportedChannelMap} supportedChannelMap + * @return {String} Return one reason why the encoding is invalid, + * or null if the encoding is valid. + */ +export declare function getEncodingMappingError(spec: FacetedCompositeUnitSpec, requiredChannelMap?: RequiredChannelMap, supportedChannelMap?: SupportedChannelMap): string; diff --git a/build/src/validate.js b/build/src/validate.js new file mode 100644 index 0000000000..5987b808f2 --- /dev/null +++ b/build/src/validate.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var mark_1 = require("./mark"); +var mark_2 = require("./mark"); +/** + * Required Encoding Channels for each mark type + */ +exports.DEFAULT_REQUIRED_CHANNEL_MAP = { + text: ['text'], + line: ['x', 'y'], + trail: ['x', 'y'], + area: ['x', 'y'] +}; +/** + * Supported Encoding Channel for each mark type + */ +exports.DEFAULT_SUPPORTED_CHANNEL_TYPE = { + bar: vega_util_1.toSet(['row', 'column', 'x', 'y', 'size', 'color', 'fill', 'stroke', 'detail']), + line: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail']), + trail: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail', 'size']), + area: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']), + tick: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']), + circle: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']), + square: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']), + point: vega_util_1.toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail', 'shape']), + geoshape: vega_util_1.toSet(['row', 'column', 'color', 'fill', 'stroke', 'detail', 'shape']), + text: vega_util_1.toSet(['row', 'column', 'size', 'color', 'fill', 'stroke', 'text']) // TODO(#724) revise +}; +// TODO: consider if we should add validate method and +// requires ZSchema in the main vega-lite repo +/** + * Further check if encoding mapping of a spec is invalid and + * return error if it is invalid. + * + * This checks if + * (1) all the required encoding channels for the mark type are specified + * (2) all the specified encoding channels are supported by the mark type + * @param {[type]} spec [description] + * @param {RequiredChannelMap = DefaultRequiredChannelMap} requiredChannelMap + * @param {SupportedChannelMap = DefaultSupportedChannelMap} supportedChannelMap + * @return {String} Return one reason why the encoding is invalid, + * or null if the encoding is valid. + */ +function getEncodingMappingError(spec, requiredChannelMap, supportedChannelMap) { + if (requiredChannelMap === void 0) { requiredChannelMap = exports.DEFAULT_REQUIRED_CHANNEL_MAP; } + if (supportedChannelMap === void 0) { supportedChannelMap = exports.DEFAULT_SUPPORTED_CHANNEL_TYPE; } + var mark = mark_1.isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var encoding = spec.encoding; + var requiredChannels = requiredChannelMap[mark]; + var supportedChannels = supportedChannelMap[mark]; + for (var i in requiredChannels) { // all required channels are in encoding` + if (!(requiredChannels[i] in encoding)) { + return 'Missing encoding channel \"' + requiredChannels[i] + + '\" for mark \"' + mark + '\"'; + } + } + for (var channel in encoding) { // all channels in encoding are supported + if (!supportedChannels[channel]) { + return 'Encoding channel \"' + channel + + '\" is not supported by mark type \"' + mark + '\"'; + } + } + if (mark === mark_2.BAR && !encoding.x && !encoding.y) { + return 'Missing both x and y for bar'; + } + return null; +} +exports.getEncodingMappingError = getEncodingMappingError; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSx1Q0FBZ0M7QUFDaEMsK0JBQWlDO0FBQ2pDLCtCQUEyQjtBQVUzQjs7R0FFRztBQUNVLFFBQUEsNEJBQTRCLEdBQXVCO0lBQzlELElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUNkLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDaEIsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNqQixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0NBQ2pCLENBQUM7QUFRRjs7R0FFRztBQUNVLFFBQUEsOEJBQThCLEdBQXdCO0lBQ2pFLEdBQUcsRUFBRSxpQkFBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwRixJQUFJLEVBQUUsaUJBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEYsS0FBSyxFQUFFLGlCQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRixJQUFJLEVBQUUsaUJBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RSxJQUFJLEVBQUUsaUJBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3RSxNQUFNLEVBQUUsaUJBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkYsTUFBTSxFQUFFLGlCQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZGLEtBQUssRUFBRSxpQkFBSyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDL0YsUUFBUSxFQUFFLGlCQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRixJQUFJLEVBQUUsaUJBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQXlCLG9CQUFvQjtDQUN2SCxDQUFDO0FBRUYsc0RBQXNEO0FBQ3RELDhDQUE4QztBQUU5Qzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxpQ0FBd0MsSUFBOEIsRUFDcEUsa0JBQXFFLEVBQ3JFLG1CQUF5RTtJQUR6RSxtQ0FBQSxFQUFBLHFCQUF5QyxvQ0FBNEI7SUFDckUsb0NBQUEsRUFBQSxzQkFBMkMsc0NBQThCO0lBRXpFLElBQU0sSUFBSSxHQUFHLGdCQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztJQUMvRCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQy9CLElBQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsSUFBTSxpQkFBaUIsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwRCxLQUFLLElBQU0sQ0FBQyxJQUFJLGdCQUFnQixFQUFFLEVBQUUseUNBQXlDO1FBQzNFLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxFQUFFO1lBQ3RDLE9BQU8sNkJBQTZCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxnQkFBZ0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO0tBQ0Y7SUFFRCxLQUFLLElBQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxFQUFFLHlDQUF5QztRQUN6RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0IsT0FBTyxxQkFBcUIsR0FBRyxPQUFPO2dCQUNwQyxxQ0FBcUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQ3ZEO0tBQ0Y7SUFFRCxJQUFJLElBQUksS0FBSyxVQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtRQUM5QyxPQUFPLDhCQUE4QixDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBNUJELDBEQTRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dG9TZXR9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge2lzTWFya0RlZn0gZnJvbSAnLi9tYXJrJztcbmltcG9ydCB7QkFSfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWN9IGZyb20gJy4vc3BlYyc7XG5cblxuXG4vLyBUT0RPOiBtb3ZlIHRvIHZsLnNwZWMudmFsaWRhdG9yP1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZENoYW5uZWxNYXAge1xuICBbbWFyazogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBSZXF1aXJlZCBFbmNvZGluZyBDaGFubmVscyBmb3IgZWFjaCBtYXJrIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUlSRURfQ0hBTk5FTF9NQVA6IFJlcXVpcmVkQ2hhbm5lbE1hcCA9IHtcbiAgdGV4dDogWyd0ZXh0J10sXG4gIGxpbmU6IFsneCcsICd5J10sXG4gIHRyYWlsOiBbJ3gnLCAneSddLFxuICBhcmVhOiBbJ3gnLCAneSddXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHBvcnRlZENoYW5uZWxNYXAge1xuICBbbWFyazogc3RyaW5nXToge1xuICAgIFtjaGFubmVsOiBzdHJpbmddOiBib29sZWFuXG4gIH07XG59XG5cbi8qKlxuICogU3VwcG9ydGVkIEVuY29kaW5nIENoYW5uZWwgZm9yIGVhY2ggbWFyayB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NVUFBPUlRFRF9DSEFOTkVMX1RZUEU6IFN1cHBvcnRlZENoYW5uZWxNYXAgPSB7XG4gIGJhcjogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdzaXplJywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2RldGFpbCddKSxcbiAgbGluZTogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdjb2xvcicsICdkZXRhaWwnXSksXG4gIHRyYWlsOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2NvbG9yJywgJ2RldGFpbCcsICdzaXplJ10pLFxuICBhcmVhOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2RldGFpbCddKSxcbiAgdGljazogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdkZXRhaWwnXSksXG4gIGNpcmNsZTogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdzaXplJywgJ2RldGFpbCddKSxcbiAgc3F1YXJlOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ3NpemUnLCAnZGV0YWlsJ10pLFxuICBwb2ludDogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdzaXplJywgJ2RldGFpbCcsICdzaGFwZSddKSxcbiAgZ2Vvc2hhcGU6IHRvU2V0KFsncm93JywgJ2NvbHVtbicsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdkZXRhaWwnLCAnc2hhcGUnXSksXG4gIHRleHQ6IHRvU2V0KFsncm93JywgJ2NvbHVtbicsICdzaXplJywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ3RleHQnXSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETygjNzI0KSByZXZpc2Vcbn07XG5cbi8vIFRPRE86IGNvbnNpZGVyIGlmIHdlIHNob3VsZCBhZGQgdmFsaWRhdGUgbWV0aG9kIGFuZFxuLy8gcmVxdWlyZXMgWlNjaGVtYSBpbiB0aGUgbWFpbiB2ZWdhLWxpdGUgcmVwb1xuXG4vKipcbiAqIEZ1cnRoZXIgY2hlY2sgaWYgZW5jb2RpbmcgbWFwcGluZyBvZiBhIHNwZWMgaXMgaW52YWxpZCBhbmRcbiAqIHJldHVybiBlcnJvciBpZiBpdCBpcyBpbnZhbGlkLlxuICpcbiAqIFRoaXMgY2hlY2tzIGlmXG4gKiAoMSkgYWxsIHRoZSByZXF1aXJlZCBlbmNvZGluZyBjaGFubmVscyBmb3IgdGhlIG1hcmsgdHlwZSBhcmUgc3BlY2lmaWVkXG4gKiAoMikgYWxsIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgbWFyayB0eXBlXG4gKiBAcGFyYW0gIHtbdHlwZV19IHNwZWMgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7UmVxdWlyZWRDaGFubmVsTWFwID0gRGVmYXVsdFJlcXVpcmVkQ2hhbm5lbE1hcH0gIHJlcXVpcmVkQ2hhbm5lbE1hcFxuICogQHBhcmFtICB7U3VwcG9ydGVkQ2hhbm5lbE1hcCA9IERlZmF1bHRTdXBwb3J0ZWRDaGFubmVsTWFwfSBzdXBwb3J0ZWRDaGFubmVsTWFwXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJldHVybiBvbmUgcmVhc29uIHdoeSB0aGUgZW5jb2RpbmcgaXMgaW52YWxpZCxcbiAqICAgICAgICAgICAgICAgICAgb3IgbnVsbCBpZiB0aGUgZW5jb2RpbmcgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmNvZGluZ01hcHBpbmdFcnJvcihzcGVjOiBGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWMsXG4gIHJlcXVpcmVkQ2hhbm5lbE1hcDogUmVxdWlyZWRDaGFubmVsTWFwID0gREVGQVVMVF9SRVFVSVJFRF9DSEFOTkVMX01BUCxcbiAgc3VwcG9ydGVkQ2hhbm5lbE1hcDogU3VwcG9ydGVkQ2hhbm5lbE1hcCA9IERFRkFVTFRfU1VQUE9SVEVEX0NIQU5ORUxfVFlQRVxuICApIHtcbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG4gIGNvbnN0IGVuY29kaW5nID0gc3BlYy5lbmNvZGluZztcbiAgY29uc3QgcmVxdWlyZWRDaGFubmVscyA9IHJlcXVpcmVkQ2hhbm5lbE1hcFttYXJrXTtcbiAgY29uc3Qgc3VwcG9ydGVkQ2hhbm5lbHMgPSBzdXBwb3J0ZWRDaGFubmVsTWFwW21hcmtdO1xuXG4gIGZvciAoY29uc3QgaSBpbiByZXF1aXJlZENoYW5uZWxzKSB7IC8vIGFsbCByZXF1aXJlZCBjaGFubmVscyBhcmUgaW4gZW5jb2RpbmdgXG4gICAgaWYgKCEocmVxdWlyZWRDaGFubmVsc1tpXSBpbiBlbmNvZGluZykpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBlbmNvZGluZyBjaGFubmVsIFxcXCInICsgcmVxdWlyZWRDaGFubmVsc1tpXSArXG4gICAgICAgICdcXFwiIGZvciBtYXJrIFxcXCInICsgbWFyayArICdcXFwiJztcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYW5uZWwgaW4gZW5jb2RpbmcpIHsgLy8gYWxsIGNoYW5uZWxzIGluIGVuY29kaW5nIGFyZSBzdXBwb3J0ZWRcbiAgICBpZiAoIXN1cHBvcnRlZENoYW5uZWxzW2NoYW5uZWxdKSB7XG4gICAgICByZXR1cm4gJ0VuY29kaW5nIGNoYW5uZWwgXFxcIicgKyBjaGFubmVsICtcbiAgICAgICAgJ1xcXCIgaXMgbm90IHN1cHBvcnRlZCBieSBtYXJrIHR5cGUgXFxcIicgKyBtYXJrICsgJ1xcXCInO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXJrID09PSBCQVIgJiYgIWVuY29kaW5nLnggJiYgIWVuY29kaW5nLnkpIHtcbiAgICByZXR1cm4gJ01pc3NpbmcgYm90aCB4IGFuZCB5IGZvciBiYXInO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0= \ No newline at end of file diff --git a/build/src/vega.schema.d.ts b/build/src/vega.schema.d.ts new file mode 100644 index 0000000000..b910fbe876 --- /dev/null +++ b/build/src/vega.schema.d.ts @@ -0,0 +1,1017 @@ +import { AggregateOp } from 'vega'; +import { BaseBin } from './bin'; +import { NiceTime, ScaleType } from './scale'; +import { SortOrder } from './sort'; +import { StackOffset } from './stack'; +import { WindowOnlyOp } from './transform'; +export interface VgData { + name: string; + source?: string; + values?: any; + format?: { + type?: string; + parse?: string | object; + property?: string; + feature?: string; + mesh?: string; + }; + url?: string; + transform?: VgTransform[]; +} +export interface VgParentRef { + parent: string; +} +export declare type VgFieldRef = string | VgParentRef | VgParentRef[]; +export declare type VgSortField = true | { + field?: VgFieldRef; + op: AggregateOp; + order?: SortOrder; +}; +/** + * Unioned domains can only be sorted by count aggregate. + */ +export declare type VgUnionSortField = true | { + op: 'count'; + order?: SortOrder; +}; +export interface VgDataRef { + data: string; + field: VgFieldRef; + sort?: VgSortField; +} +export interface VgSignalRef { + signal: string; +} +export declare function isVgSignalRef(o: any): o is VgSignalRef; +export declare type VgEventStream = any; +export interface VgValueRef { + value?: number | string | boolean; + field?: string | { + datum?: string; + group?: string; + parent?: string; + }; + signal?: string; + scale?: string; + mult?: number; + offset?: number | VgValueRef; + band?: boolean | number | VgValueRef; +} +export interface DataRefUnionDomain { + fields: (any[] | VgDataRef | VgSignalRef)[]; + sort?: VgUnionSortField; +} +export interface VgFieldRefUnionDomain { + data: string; + fields: VgFieldRef[]; + sort?: VgUnionSortField; +} +export declare type VgScheme = { + scheme: string; + extent?: number[]; + count?: number; +}; +export declare type VgRange = string | VgDataRef | (number | string | VgDataRef | VgSignalRef)[] | VgScheme | VgRangeStep; +export declare type VgRangeStep = { + step: number | VgSignalRef; +}; +export declare function isVgRangeStep(range: VgRange): range is VgRangeStep; +export declare type VgNonUnionDomain = any[] | VgDataRef | VgSignalRef; +export declare type VgDomain = VgNonUnionDomain | DataRefUnionDomain | VgFieldRefUnionDomain; +export declare type VgMarkGroup = any; +export declare type VgProjectionType = 'albers' | 'albersUsa' | 'azimuthalEqualArea' | 'azimuthalEquidistant' | 'conicConformal' | 'conicEqualArea' | 'conicEquidistant' | 'equirectangular' | 'gnomonic' | 'mercator' | 'orthographic' | 'stereographic' | 'transverseMercator'; +export declare type VgProjection = { + name: string; + type?: VgProjectionType; + clipAngle?: number; + clipExtent?: number[][]; + scale?: number; + translate?: number[]; + center?: number[]; + /** + * The rotation of the projection. + */ + rotate?: number[]; + precision?: String; + fit?: VgSignalRef | Object | any[]; + extent?: VgSignalRef | number[][]; + size?: VgSignalRef | (number | VgSignalRef)[]; + coefficient?: number; + distance?: number; + fraction?: number; + lobes?: number; + parallel?: number; + radius?: number; + ratio?: number; + spacing?: number; + tilt?: number; +}; +export interface VgScale { + name: string; + type: ScaleType; + domain: VgDomain; + domainRaw?: VgSignalRef; + range: VgRange; + clamp?: boolean; + base?: number; + exponent?: number; + interpolate?: ScaleInterpolate | ScaleInterpolateParams; + nice?: boolean | number | NiceTime | { + interval: string; + step: number; + }; + padding?: number; + paddingInner?: number; + paddingOuter?: number; + reverse?: boolean; + round?: boolean; + zero?: boolean; +} +export declare type ScaleInterpolate = 'rgb' | 'lab' | 'hcl' | 'hsl' | 'hsl-long' | 'hcl-long' | 'cubehelix' | 'cubehelix-long'; +export interface ScaleInterpolateParams { + type: 'rgb' | 'cubehelix' | 'cubehelix-long'; + gamma?: number; +} +export declare type VgLayoutAlign = 'none' | 'each' | 'all'; +export declare type RowCol = { + row?: T; + column?: T; +}; +export interface VgLayout { + padding: number | RowCol; + headerBand?: number | RowCol; + footerBand?: number | RowCol; + offset: number | { + rowHeader: number; + rowFooter: number; + rowTitle: number; + columnHeader: number; + columnFooter: number; + columnTitle: number; + }; + bounds: 'full' | 'flush'; + columns?: number | { + signal: string; + }; + align?: VgLayoutAlign | { + row: VgLayoutAlign; + column: VgLayoutAlign; + }; +} +export declare function isDataRefUnionedDomain(domain: VgDomain): domain is DataRefUnionDomain; +export declare function isFieldRefUnionDomain(domain: VgDomain): domain is VgFieldRefUnionDomain; +export declare function isDataRefDomain(domain: VgDomain): domain is VgDataRef; +export declare function isSignalRefDomain(domain: VgDomain): domain is VgSignalRef; +export interface VgEventHandler { + events: string[] | VgSignalRef; + update?: string; + encode?: string; + force?: boolean; + between?: any[]; +} +export interface VgSignal { + name: string; + bind?: string; + description?: string; + on?: VgEventHandler[]; + update?: string; + react?: boolean; + value?: string | number | boolean | {} | VgSignalRef; + push?: string; +} +export declare type VgEncodeChannel = 'x' | 'x2' | 'xc' | 'width' | 'y' | 'y2' | 'yc' | 'height' | 'opacity' | 'fill' | 'fillOpacity' | 'stroke' | 'strokeWidth' | 'strokeCap' | 'strokeOpacity' | 'strokeDash' | 'strokeDashOffset' | 'cursor' | 'clip' | 'size' | 'shape' | 'path' | 'innerRadius' | 'outerRadius' | 'startAngle' | 'endAngle' | 'interpolate' | 'tension' | 'orient' | 'url' | 'align' | 'baseline' | 'text' | 'dir' | 'ellipsis' | 'limit' | 'dx' | 'dy' | 'radius' | 'theta' | 'angle' | 'font' | 'fontSize' | 'fontWeight' | 'fontStyle' | 'tooltip' | 'href' | 'cursor' | 'defined'; +export declare type VgEncodeEntry = { + [k in VgEncodeChannel]?: VgValueRef | (VgValueRef & { + test?: string; + })[]; +}; +export declare type AxisOrient = 'top' | 'right' | 'left' | 'bottom'; +export interface VgAxis { + scale: string; + domain?: boolean; + format?: string; + grid?: boolean; + gridScale?: string; + labels?: boolean; + labelBound?: boolean | number; + labelFlush?: boolean | number; + labelPadding?: number; + labelOverlap?: boolean | 'parity' | 'greedy'; + maxExtent?: number; + minExtent?: number; + offset?: number; + orient?: AxisOrient; + position?: number; + ticks?: boolean; + tickCount?: number; + tickSize?: number; + title?: string; + titlePadding?: number; + values?: any[] | VgSignalRef; + zindex?: number; + encode?: VgAxisEncode; +} +export declare type LegendType = 'symbol' | 'gradient'; +export interface VgLegend { + fill?: string; + stroke?: string; + size?: string; + shape?: string; + opacity?: string; + entryPadding?: number; + format?: string; + offset?: number; + orient?: LegendOrient; + padding?: number; + tickCount?: number; + title?: string; + type?: LegendType; + values?: any[] | VgSignalRef; + zindex?: number; + encode?: VgLegendEncode; +} +export interface VgBinTransform extends BaseBin { + type: 'bin'; + extent?: number[] | { + signal: string; + }; + field: string; + as: string[]; + signal?: string; +} +export interface VgExtentTransform { + type: 'extent'; + field: string; + signal: string; +} +export interface VgFormulaTransform { + type: 'formula'; + as: string; + expr: string; +} +export interface VgFilterTransform { + type: 'filter'; + expr: string; +} +export interface VgAggregateTransform { + type: 'aggregate'; + groupby?: VgFieldRef[]; + fields?: VgFieldRef[]; + ops?: AggregateOp[]; + as?: string[]; + cross?: boolean; + drop?: boolean; +} +export interface VgCollectTransform { + type: 'collect'; + sort: VgSort; +} +export interface VgLookupTransform { + type: 'lookup'; + from: string; + key: string; + fields: string[]; + values?: string[]; + as?: string[]; + default?: string; +} +export interface VgStackTransform { + type: 'stack'; + offset?: StackOffset; + groupby: string[]; + field: string; + sort: VgSort; + as: string[]; +} +export interface VgIdentifierTransform { + type: 'identifier'; + as: string; +} +export declare type VgTransform = VgBinTransform | VgExtentTransform | VgFormulaTransform | VgAggregateTransform | VgFilterTransform | VgImputeTransform | VgStackTransform | VgCollectTransform | VgLookupTransform | VgIdentifierTransform | VgGeoPointTransform | VgGeoJSONTransform | VgGeoJSONTransform | VgWindowTransform; +export interface VgGeoPointTransform { + type: 'geopoint'; + projection: string; + fields: VgFieldRef[]; + as?: string[]; +} +export interface VgGeoShapeTransform { + type: 'geoshape'; + projection: string; + field?: VgFieldRef; + as?: string; +} +export interface VgGeoJSONTransform { + type: 'geojson'; + fields?: VgFieldRef[]; + geojson?: VgFieldRef; + signal: string; +} +export declare type VgPostEncodingTransform = VgGeoShapeTransform; +export interface VgAxisEncode { + ticks?: VgGuideEncode; + labels?: VgGuideEncode; + title?: VgGuideEncode; + grid?: VgGuideEncode; + domain?: VgGuideEncode; +} +export interface VgLegendEncode { + title?: VgGuideEncode; + labels?: VgGuideEncode; + legend?: VgGuideEncode; + symbols?: VgGuideEncode; + gradient?: VgGuideEncode; +} +export declare type VgGuideEncode = any; +export declare type VgSort = { + field: string; + order?: VgComparatorOrder; +} | { + field: string[]; + order?: (VgComparatorOrder)[]; +}; +export interface VgImputeTransform { + type: 'impute'; + groupby?: string[]; + field: string; + key: string; + keyvals?: string[]; + method?: 'value' | 'median' | 'max' | 'min' | 'mean'; + value?: any; +} +export declare type VgCheckboxBinding = { + input: 'checkbox'; + element?: string; +}; +export declare type VgRadioBinding = { + input: 'radio'; + options: string[]; + element?: string; +}; +export declare type VgSelectBinding = { + input: 'select'; + options: string[]; + element?: string; +}; +export declare type VgRangeBinding = { + input: 'range'; + min?: number; + max?: number; + step?: number; + element?: string; +}; +export declare type VgGenericBinding = { + input: string; + element?: string; +}; +export declare type VgBinding = VgCheckboxBinding | VgRadioBinding | VgSelectBinding | VgRangeBinding | VgGenericBinding; +/** + * Base object for Vega's Axis and Axis Config. + * All of these properties are both properties of Vega's Axis and Axis Config. + */ +export interface VgAxisBase { + /** + * A boolean flag indicating if the domain (the axis baseline) should be included as part of the axis. + * + * __Default value:__ `true` + */ + domain?: boolean; + /** + * A boolean flag indicating if grid lines should be included as part of the axis + * + * __Default value:__ `true` for [continuous scales](https://vega.github.io/vega-lite/docs/scale.html#continuous) that are not binned; otherwise, `false`. + */ + grid?: boolean; + /** + * A boolean flag indicating if labels should be included as part of the axis. + * + * __Default value:__ `true`. + */ + labels?: boolean; + /** + * Indicates if labels should be hidden if they exceed the axis range. If `false `(the default) no bounds overlap analysis is performed. If `true`, labels will be hidden if they exceed the axis range by more than 1 pixel. If this property is a number, it specifies the pixel tolerance: the maximum amount by which a label bounding box may exceed the axis range. + * + * __Default value:__ `false`. + */ + labelBound?: boolean | number; + /** + * Indicates if the first and last axis labels should be aligned flush with the scale range. Flush alignment for a horizontal axis will left-align the first label and right-align the last label. For vertical axes, bottom and top text baselines are applied instead. If this property is a number, it also indicates the number of pixels by which to offset the first and last labels; for example, a value of 2 will flush-align the first and last labels and also push them 2 pixels outward from the center of the axis. The additional adjustment can sometimes help the labels better visually group with corresponding axis ticks. + * + * __Default value:__ `true` for axis of a continuous x-scale. Otherwise, `false`. + */ + labelFlush?: boolean | number; + /** + * The strategy to use for resolving overlap of axis labels. If `false` (the default), no overlap reduction is attempted. If set to `true` or `"parity"`, a strategy of removing every other label is used (this works well for standard linear axes). If set to `"greedy"`, a linear scan of the labels is performed, removing any labels that overlaps with the last visible label (this often works better for log-scaled axes). + * + * __Default value:__ `true` for non-nominal fields with non-log scales; `"greedy"` for log scales; otherwise `false`. + */ + labelOverlap?: boolean | 'parity' | 'greedy'; + /** + * The padding, in pixels, between axis and text labels. + */ + labelPadding?: number; + /** + * Boolean value that determines whether the axis should include ticks. + */ + ticks?: boolean; + /** + * The size in pixels of axis ticks. + * + * @minimum 0 + */ + tickSize?: number; + /** + * Max length for axis title if the title is automatically generated from the field's description. + * + * @minimum 0 + * __Default value:__ `undefined`. + */ + titleMaxLength?: number; + /** + * The padding, in pixels, between title and axis. + */ + titlePadding?: number; + /** + * The minimum extent in pixels that axis ticks and labels should use. This determines a minimum offset value for axis titles. + * + * __Default value:__ `30` for y-axis; `undefined` for x-axis. + */ + minExtent?: number; + /** + * The maximum extent in pixels that axis ticks and labels should use. This determines a maximum offset value for axis titles. + * + * __Default value:__ `undefined`. + */ + maxExtent?: number; +} +export interface VgAxisConfig extends VgAxisBase { + /** + * An interpolation fraction indicating where, for `band` scales, axis ticks should be positioned. A value of `0` places ticks at the left edge of their bands. A value of `0.5` places ticks in the middle of their bands. + */ + bandPosition?: number; + /** + * Stroke width of axis domain line + * + * __Default value:__ (none, using Vega default). + */ + domainWidth?: number; + /** + * Color of axis domain line. + * + * __Default value:__ (none, using Vega default). + */ + domainColor?: string; + /** + * Color of gridlines. + */ + gridColor?: string; + /** + * The offset (in pixels) into which to begin drawing with the grid dash array. + */ + gridDash?: number[]; + /** + * The stroke opacity of grid (value between [0,1]) + * + * __Default value:__ (`1` by default) + * @minimum 0 + * @maximum 1 + */ + gridOpacity?: number; + /** + * The grid width, in pixels. + * @minimum 0 + */ + gridWidth?: number; + /** + * The color of the axis's tick. + */ + tickColor?: string; + /** + * The rotation angle of the axis labels. + * + * __Default value:__ `-90` for nominal and ordinal fields; `0` otherwise. + * + * @minimum -360 + * @maximum 360 + */ + labelAngle?: number; + /** + * The color of the tick label, can be in hex color code or regular color name. + */ + labelColor?: string; + /** + * The font of the tick label. + */ + labelFont?: string; + /** + * The font size of the label, in pixels. + * + * @minimum 0 + */ + labelFontSize?: number; + /** + * Maximum allowed pixel width of axis tick labels. + */ + labelLimit?: number; + /** + * Boolean flag indicating if pixel position values should be rounded to the nearest integer. + */ + tickRound?: boolean; + /** + * The width, in pixels, of ticks. + * + * @minimum 0 + */ + tickWidth?: number; + /** + * Horizontal text alignment of axis titles. + */ + titleAlign?: string; + /** + * Angle in degrees of axis titles. + */ + titleAngle?: number; + /** + * Vertical text baseline for axis titles. + */ + titleBaseline?: string; + /** + * Color of the title, can be in hex color code or regular color name. + */ + titleColor?: string; + /** + * Font of the title. (e.g., `"Helvetica Neue"`). + */ + titleFont?: string; + /** + * Font size of the title. + * + * @minimum 0 + */ + titleFontSize?: number; + /** + * Font weight of the title. + * This can be either a string (e.g `"bold"`, `"normal"`) or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`). + */ + titleFontWeight?: FontWeight; + /** + * Maximum allowed pixel width of axis titles. + */ + titleLimit?: number; + /** + * X-coordinate of the axis title relative to the axis group. + */ + titleX?: number; + /** + * Y-coordinate of the axis title relative to the axis group. + */ + titleY?: number; +} +export declare type LegendOrient = 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none'; +export interface VgLegendBase { + /** + * Padding (in pixels) between legend entries in a symbol legend. + */ + entryPadding?: number; + /** + * The orientation of the legend, which determines how the legend is positioned within the scene. One of "left", "right", "top-left", "top-right", "bottom-left", "bottom-right", "none". + * + * __Default value:__ `"right"` + */ + orient?: LegendOrient; + /** + * The offset, in pixels, by which to displace the legend from the edge of the enclosing group or data rectangle. + * + * __Default value:__ `0` + */ + offset?: number; + /** + * The padding, in pixels, between the legend and axis. + */ + padding?: number; +} +export interface VgLegendConfig extends VgLegendBase { + /** + * Corner radius for the full legend. + */ + cornerRadius?: number; + /** + * Background fill color for the full legend. + */ + fillColor?: string; + /** + * Border stroke color for the full legend. + */ + strokeColor?: string; + /** + * Border stroke dash pattern for the full legend. + */ + strokeDash?: number[]; + /** + * Border stroke width for the full legend. + */ + strokeWidth?: number; + /** + * The color of the gradient stroke, can be in hex color code or regular color name. + */ + gradientStrokeColor?: string; + /** + * The width of the gradient stroke, in pixels. + * @minimum 0 + */ + gradientStrokeWidth?: number; + /** + * The height of the gradient, in pixels. + * @minimum 0 + */ + gradientHeight?: number; + /** + * Text baseline for color ramp gradient labels. + */ + gradientLabelBaseline?: string; + /** + * The maximum allowed length in pixels of color ramp gradient labels. + */ + gradientLabelLimit?: number; + /** + * Vertical offset in pixels for color ramp gradient labels. + */ + gradientLabelOffset?: number; + /** + * The width of the gradient, in pixels. + * @minimum 0 + */ + gradientWidth?: number; + /** + * The alignment of the legend label, can be left, middle or right. + */ + labelAlign?: string; + /** + * The position of the baseline of legend label, can be top, middle or bottom. + */ + labelBaseline?: string; + /** + * The color of the legend label, can be in hex color code or regular color name. + */ + labelColor?: string; + /** + * The font of the legend label. + */ + labelFont?: string; + /** + * The font size of legend label. + * + * __Default value:__ `10`. + * + * @minimum 0 + */ + labelFontSize?: number; + /** + * Maximum allowed pixel width of axis tick labels. + */ + labelLimit?: number; + /** + * The offset of the legend label. + * @minimum 0 + */ + labelOffset?: number; + /** + * The color of the legend symbol, + */ + symbolColor?: string; + /** + * Default shape type (such as "circle") for legend symbols. + */ + symbolType?: string; + /** + * The size of the legend symbol, in pixels. + * @minimum 0 + */ + symbolSize?: number; + /** + * The width of the symbol's stroke. + * @minimum 0 + */ + symbolStrokeWidth?: number; + /** + * Horizontal text alignment for legend titles. + */ + titleAlign?: string; + /** + * Vertical text baseline for legend titles. + */ + titleBaseline?: string; + /** + * The color of the legend title, can be in hex color code or regular color name. + */ + titleColor?: string; + /** + * The font of the legend title. + */ + titleFont?: string; + /** + * The font size of the legend title. + */ + titleFontSize?: number; + /** + * The font weight of the legend title. + * This can be either a string (e.g `"bold"`, `"normal"`) or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`). + */ + titleFontWeight?: FontWeight; + /** + * Maximum allowed pixel width of axis titles. + */ + titleLimit?: number; + /** + * The padding, in pixels, between title and legend. + */ + titlePadding?: number; +} +export declare type FontStyle = 'normal' | 'italic'; +export declare type FontWeightString = 'normal' | 'bold'; +/** + * @TJS-type integer + * @minimum 100 + * @maximum 900 + */ +export declare type FontWeightNumber = number; +export declare type FontWeight = FontWeightString | FontWeightNumber; +export declare type HorizontalAlign = 'left' | 'right' | 'center'; +export declare type Interpolate = 'linear' | 'linear-closed' | 'step' | 'step-before' | 'step-after' | 'basis' | 'basis-open' | 'basis-closed' | 'cardinal' | 'cardinal-open' | 'cardinal-closed' | 'bundle' | 'monotone'; +export declare type Orient = 'horizontal' | 'vertical'; +export declare type VerticalAlign = 'top' | 'middle' | 'bottom'; +export interface VgMarkConfig { + /** + * Default Fill Color. This has higher precedence than `config.color` + * + * __Default value:__ (None) + * + */ + fill?: string; + /** + * Default Stroke Color. This has higher precedence than `config.color` + * + * __Default value:__ (None) + * + */ + stroke?: string; + /** + * The overall opacity (value between [0,1]). + * + * __Default value:__ `0.7` for non-aggregate plots with `point`, `tick`, `circle`, or `square` marks or layered `bar` charts and `1` otherwise. + * + * @minimum 0 + * @maximum 1 + */ + opacity?: number; + /** + * The fill opacity (value between [0,1]). + * + * __Default value:__ `1` + * + * @minimum 0 + * @maximum 1 + */ + fillOpacity?: number; + /** + * The stroke opacity (value between [0,1]). + * + * __Default value:__ `1` + * + * @minimum 0 + * @maximum 1 + */ + strokeOpacity?: number; + /** + * The stroke width, in pixels. + * + * @minimum 0 + */ + strokeWidth?: number; + /** + * The stroke cap for line ending style. One of `"butt"`, `"round"`, or `"square"`. + * + * __Default value:__ `"square"` + */ + strokeCap?: 'butt' | 'round' | 'square'; + /** + * An array of alternating stroke, space lengths for creating dashed or dotted lines. + */ + strokeDash?: number[]; + /** + * The offset (in pixels) into which to begin drawing with the stroke dash array. + */ + strokeDashOffset?: number; + /** + * The orientation of a non-stacked bar, tick, area, and line charts. + * The value is either horizontal (default) or vertical. + * - For bar, rule and tick, this determines whether the size of the bar and tick + * should be applied to x or y dimension. + * - For area, this property determines the orient property of the Vega output. + * - For line and trail marks, this property determines the sort order of the points in the line + * if `config.sortLineBy` is not specified. + * For stacked charts, this is always determined by the orientation of the stack; + * therefore explicitly specified value will be ignored. + */ + orient?: Orient; + /** + * The line interpolation method to use for line and area marks. One of the following: + * - `"linear"`: piecewise linear segments, as in a polyline. + * - `"linear-closed"`: close the linear segments to form a polygon. + * - `"step"`: alternate between horizontal and vertical segments, as in a step function. + * - `"step-before"`: alternate between vertical and horizontal segments, as in a step function. + * - `"step-after"`: alternate between horizontal and vertical segments, as in a step function. + * - `"basis"`: a B-spline, with control point duplication on the ends. + * - `"basis-open"`: an open B-spline; may not intersect the start or end. + * - `"basis-closed"`: a closed B-spline, as in a loop. + * - `"cardinal"`: a Cardinal spline, with control point duplication on the ends. + * - `"cardinal-open"`: an open Cardinal spline; may not intersect the start or end, but will intersect other control points. + * - `"cardinal-closed"`: a closed Cardinal spline, as in a loop. + * - `"bundle"`: equivalent to basis, except the tension parameter is used to straighten the spline. + * - `"monotone"`: cubic interpolation that preserves monotonicity in y. + */ + interpolate?: Interpolate; + /** + * Depending on the interpolation type, sets the tension parameter (for line and area marks). + * @minimum 0 + * @maximum 1 + */ + tension?: number; + /** + * The default symbol shape to use. One of: `"circle"` (default), `"square"`, `"cross"`, `"diamond"`, `"triangle-up"`, or `"triangle-down"`, or a custom SVG path. + * + * __Default value:__ `"circle"` + * + */ + shape?: string; + /** + * The pixel area each the point/circle/square. + * For example: in the case of circles, the radius is determined in part by the square root of the size value. + * + * __Default value:__ `30` + * + * @minimum 0 + */ + size?: number; + /** + * The horizontal alignment of the text. One of `"left"`, `"right"`, `"center"`. + */ + align?: HorizontalAlign; + /** + * The rotation angle of the text, in degrees. + * @minimum 0 + * @maximum 360 + */ + angle?: number; + /** + * The vertical alignment of the text. One of `"top"`, `"middle"`, `"bottom"`. + * + * __Default value:__ `"middle"` + * + */ + baseline?: VerticalAlign; + /** + * The horizontal offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property. + */ + dx?: number; + /** + * The vertical offset, in pixels, between the text label and its anchor point. The offset is applied after rotation by the _angle_ property. + */ + dy?: number; + /** + * Polar coordinate radial offset, in pixels, of the text label from the origin determined by the `x` and `y` properties. + * @minimum 0 + */ + radius?: number; + /** + * The maximum length of the text mark in pixels (default 0, indicating no limit). The text value will be automatically truncated if the rendered size exceeds the limit. + */ + limit?: number; + /** + * Polar coordinate angle, in radians, of the text label from the origin determined by the `x` and `y` properties. Values for `theta` follow the same convention of `arc` mark `startAngle` and `endAngle` properties: angles are measured in radians, with `0` indicating "north". + */ + theta?: number; + /** + * The typeface to set the text in (e.g., `"Helvetica Neue"`). + */ + font?: string; + /** + * The font size, in pixels. + * @minimum 0 + */ + fontSize?: number; + /** + * The font style (e.g., `"italic"`). + */ + fontStyle?: FontStyle; + /** + * The font weight. + * This can be either a string (e.g `"bold"`, `"normal"`) or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`). + */ + fontWeight?: FontWeight; + /** + * Placeholder text if the `text` channel is not specified + */ + text?: string; + /** + * A URL to load upon mouse click. If defined, the mark acts as a hyperlink. + * + * @format uri + */ + href?: string; + /** + * The mouse cursor used over the mark. Any valid [CSS cursor type](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#Values) can be used. + */ + cursor?: 'auto' | 'default' | 'none' | 'context-menu' | 'help' | 'pointer' | 'progress' | 'wait' | 'cell' | 'crosshair' | 'text' | 'vertical-text' | 'alias' | 'copy' | 'move' | 'no-drop' | 'not-allowed' | 'e-resize' | 'n-resize' | 'ne-resize' | 'nw-resize' | 's-resize' | 'se-resize' | 'sw-resize' | 'w-resize' | 'ew-resize' | 'ns-resize' | 'nesw-resize' | 'nwse-resize' | 'col-resize' | 'row-resize' | 'all-scroll' | 'zoom-in' | 'zoom-out' | 'grab' | 'grabbing'; +} +export declare const VG_MARK_CONFIGS: ("font" | "text" | "shape" | "orient" | "fill" | "stroke" | "opacity" | "size" | "href" | "interpolate" | "strokeWidth" | "strokeDash" | "strokeDashOffset" | "strokeOpacity" | "fillOpacity" | "strokeCap" | "tension" | "align" | "angle" | "baseline" | "dx" | "dy" | "radius" | "limit" | "theta" | "fontSize" | "fontStyle" | "fontWeight" | "cursor")[]; +export declare type Anchor = 'start' | 'middle' | 'end'; +export interface VgTitle { + /** + * The title text. + */ + text: string; + /** + * The orientation of the title relative to the chart. One of `"top"` (the default), `"bottom"`, `"left"`, or `"right"`. + */ + orient?: TitleOrient; + /** + * The anchor position for placing the title. One of `"start"`, `"middle"` (the default), or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title. + */ + anchor?: Anchor; + /** + * The orthogonal offset in pixels by which to displace the title from its position along the edge of the chart. + */ + offset?: number; + style?: string | string[]; +} +export declare type TitleOrient = 'top' | 'bottom' | 'left' | 'right'; +export interface VgTitleConfig { + /** + * The anchor position for placing the title. One of `"start"`, `"middle"`, or `"end"`. For example, with an orientation of top these anchor positions map to a left-, center-, or right-aligned title. + * + * __Default value:__ `"middle"` for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. + * `"start"` for other composite views. + * + * __Note:__ [For now](https://github.com/vega/vega-lite/issues/2875), `anchor` is only customizable only for [single](https://vega.github.io/vega-lite/docs/spec.html) and [layered](https://vega.github.io/vega-lite/docs/layer.html) views. For other composite views, `anchor` is always `"start"`. + */ + anchor?: Anchor; + /** + * Angle in degrees of title text. + */ + angle?: number; + /** + * Vertical text baseline for title text. + */ + baseline?: VerticalAlign; + /** + * Text color for title text. + */ + color?: string; + /** + * Font name for title text. + */ + font?: string; + /** + * Font size in pixels for title text. + * + * __Default value:__ `10`. + * + * @minimum 0 + */ + fontSize?: number; + /** + * Font weight for title text. + * This can be either a string (e.g `"bold"`, `"normal"`) or a number (`100`, `200`, `300`, ..., `900` where `"normal"` = `400` and `"bold"` = `700`). + */ + fontWeight?: FontWeight; + /** + * The maximum allowed length in pixels of legend labels. + * + * @minimum 0 + */ + limit?: number; + /** + * Offset in pixels of the title from the chart body and axes. + */ + offset?: number; + /** + * Default title orientation ("top", "bottom", "left", or "right") + */ + orient?: TitleOrient; +} +export declare type VgComparatorOrder = 'ascending' | 'descending'; +export interface VgComparator { + field?: string | string[]; + order?: VgComparatorOrder | VgComparatorOrder[]; +} +export interface VgWindowTransform { + type: 'window'; + params?: Number[]; + as?: string[]; + ops?: (AggregateOp | WindowOnlyOp)[]; + fields?: string[]; + frame?: Number[]; + ignorePeers?: Boolean; + groupby?: string[]; + sort?: VgComparator; +} diff --git a/build/src/vega.schema.js b/build/src/vega.schema.js new file mode 100644 index 0000000000..4a6d413b92 --- /dev/null +++ b/build/src/vega.schema.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var vega_util_1 = require("vega-util"); +var util_1 = require("./util"); +function isVgSignalRef(o) { + return !!o['signal']; +} +exports.isVgSignalRef = isVgSignalRef; +function isVgRangeStep(range) { + return !!range['step']; +} +exports.isVgRangeStep = isVgRangeStep; +function isDataRefUnionedDomain(domain) { + if (!vega_util_1.isArray(domain)) { + return 'fields' in domain && !('data' in domain); + } + return false; +} +exports.isDataRefUnionedDomain = isDataRefUnionedDomain; +function isFieldRefUnionDomain(domain) { + if (!vega_util_1.isArray(domain)) { + return 'fields' in domain && 'data' in domain; + } + return false; +} +exports.isFieldRefUnionDomain = isFieldRefUnionDomain; +function isDataRefDomain(domain) { + if (!vega_util_1.isArray(domain)) { + return 'field' in domain && 'data' in domain; + } + return false; +} +exports.isDataRefDomain = isDataRefDomain; +function isSignalRefDomain(domain) { + if (!vega_util_1.isArray(domain)) { + return 'signal' in domain; + } + return false; +} +exports.isSignalRefDomain = isSignalRefDomain; +var VG_MARK_CONFIG_INDEX = { + opacity: 1, + fill: 1, + fillOpacity: 1, + stroke: 1, + strokeCap: 1, + strokeWidth: 1, + strokeOpacity: 1, + strokeDash: 1, + strokeDashOffset: 1, + size: 1, + shape: 1, + interpolate: 1, + tension: 1, + orient: 1, + align: 1, + baseline: 1, + text: 1, + limit: 1, + dx: 1, + dy: 1, + radius: 1, + theta: 1, + angle: 1, + font: 1, + fontSize: 1, + fontWeight: 1, + fontStyle: 1, + cursor: 1, + href: 1, +}; +exports.VG_MARK_CONFIGS = util_1.flagKeys(VG_MARK_CONFIG_INDEX); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVnYS5zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVnYS5zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSx1Q0FBa0M7QUFNbEMsK0JBQXNDO0FBZ0R0Qyx1QkFBOEIsQ0FBTTtJQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUZELHNDQUVDO0FBbUNELHVCQUE4QixLQUFjO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRkQsc0NBRUM7QUErSEQsZ0NBQXVDLE1BQWdCO0lBQ3JELElBQUksQ0FBQyxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sUUFBUSxJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDO0tBQ2xEO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBTEQsd0RBS0M7QUFFRCwrQkFBc0MsTUFBZ0I7SUFDcEQsSUFBSSxDQUFDLG1CQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDcEIsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUM7S0FDL0M7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFMRCxzREFLQztBQUVELHlCQUFnQyxNQUFnQjtJQUM5QyxJQUFJLENBQUMsbUJBQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuQixPQUFPLE9BQU8sSUFBSSxNQUFNLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQztLQUMvQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUxELDBDQUtDO0FBRUQsMkJBQWtDLE1BQWdCO0lBQ2hELElBQUksQ0FBQyxtQkFBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sUUFBUSxJQUFJLE1BQU0sQ0FBQztLQUMzQjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUxELDhDQUtDO0FBczZCRCxJQUFNLG9CQUFvQixHQUE2QjtJQUNyRCxPQUFPLEVBQUUsQ0FBQztJQUNWLElBQUksRUFBRSxDQUFDO0lBQ1AsV0FBVyxFQUFFLENBQUM7SUFDZCxNQUFNLEVBQUUsQ0FBQztJQUNULFNBQVMsRUFBRSxDQUFDO0lBQ1osV0FBVyxFQUFFLENBQUM7SUFDZCxhQUFhLEVBQUUsQ0FBQztJQUNoQixVQUFVLEVBQUUsQ0FBQztJQUNiLGdCQUFnQixFQUFFLENBQUM7SUFDbkIsSUFBSSxFQUFFLENBQUM7SUFDUCxLQUFLLEVBQUUsQ0FBQztJQUNSLFdBQVcsRUFBRSxDQUFDO0lBQ2QsT0FBTyxFQUFFLENBQUM7SUFDVixNQUFNLEVBQUUsQ0FBQztJQUNULEtBQUssRUFBRSxDQUFDO0lBQ1IsUUFBUSxFQUFFLENBQUM7SUFDWCxJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsRUFBRSxFQUFFLENBQUM7SUFDTCxFQUFFLEVBQUUsQ0FBQztJQUNMLE1BQU0sRUFBRSxDQUFDO0lBQ1QsS0FBSyxFQUFFLENBQUM7SUFDUixLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsUUFBUSxFQUFFLENBQUM7SUFDWCxVQUFVLEVBQUUsQ0FBQztJQUNiLFNBQVMsRUFBRSxDQUFDO0lBQ1osTUFBTSxFQUFFLENBQUM7SUFDVCxJQUFJLEVBQUUsQ0FBQztDQVlSLENBQUM7QUFFVyxRQUFBLGVBQWUsR0FBRyxlQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtCYXNlQmlufSBmcm9tICcuL2Jpbic7XG5pbXBvcnQge05pY2VUaW1lLCBTY2FsZVR5cGV9IGZyb20gJy4vc2NhbGUnO1xuaW1wb3J0IHtTb3J0T3JkZXJ9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7V2luZG93T25seU9wfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5pbXBvcnQge0ZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnRGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nO1xuICB2YWx1ZXM/OiBhbnk7XG4gIGZvcm1hdD86IHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHBhcnNlPzogc3RyaW5nIHwgb2JqZWN0O1xuICAgIHByb3BlcnR5Pzogc3RyaW5nO1xuICAgIGZlYXR1cmU/OiBzdHJpbmc7XG4gICAgbWVzaD86IHN0cmluZztcbiAgfTtcbiAgdXJsPzogc3RyaW5nO1xuICB0cmFuc2Zvcm0/OiBWZ1RyYW5zZm9ybVtdO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdQYXJlbnRSZWYge1xuICBwYXJlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVmdGaWVsZFJlZiA9IHN0cmluZyB8IFZnUGFyZW50UmVmIHwgVmdQYXJlbnRSZWZbXTtcblxuZXhwb3J0IHR5cGUgVmdTb3J0RmllbGQgPSB0cnVlIHwge1xuICBmaWVsZD86IFZnRmllbGRSZWYsXG4gIG9wOiBBZ2dyZWdhdGVPcCxcbiAgb3JkZXI/OiBTb3J0T3JkZXJcbn07XG5cbi8qKlxuICogVW5pb25lZCBkb21haW5zIGNhbiBvbmx5IGJlIHNvcnRlZCBieSBjb3VudCBhZ2dyZWdhdGUuXG4gKi9cbmV4cG9ydCB0eXBlIFZnVW5pb25Tb3J0RmllbGQgPSB0cnVlIHwge1xuICBvcDogJ2NvdW50J1xuICBvcmRlcj86IFNvcnRPcmRlclxufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ0RhdGFSZWYge1xuICBkYXRhOiBzdHJpbmc7XG4gIGZpZWxkOiBWZ0ZpZWxkUmVmO1xuICBzb3J0PzogVmdTb3J0RmllbGQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdTaWduYWxSZWYge1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmdTaWduYWxSZWYobzogYW55KTogbyBpcyBWZ1NpZ25hbFJlZiB7XG4gIHJldHVybiAhIW9bJ3NpZ25hbCddO1xufVxuXG5leHBvcnQgdHlwZSBWZ0V2ZW50U3RyZWFtID0gYW55O1xuXG4vLyBUT0RPOiBhZGQgdHlwZSBvZiB2YWx1ZSAoTWFrZSBpdCBWZ1ZhbHVlUmVmPFQ+IHt2YWx1ZT86VCAuLi59KVxuZXhwb3J0IGludGVyZmFjZSBWZ1ZhbHVlUmVmIHtcbiAgdmFsdWU/OiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuO1xuICBmaWVsZD86IHN0cmluZyB8IHtcbiAgICBkYXR1bT86IHN0cmluZyxcbiAgICBncm91cD86IHN0cmluZyxcbiAgICBwYXJlbnQ/OiBzdHJpbmdcbiAgfTtcbiAgc2lnbmFsPzogc3RyaW5nO1xuICBzY2FsZT86IHN0cmluZzsgLy8gVE9ETzogb2JqZWN0XG4gIG11bHQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlciB8IFZnVmFsdWVSZWY7XG4gIGJhbmQ/OiBib29sZWFuIHwgbnVtYmVyIHwgVmdWYWx1ZVJlZjtcbn1cblxuLy8gVE9ETzogYWRkIHZnIHByZWZpeFxuZXhwb3J0IGludGVyZmFjZSBEYXRhUmVmVW5pb25Eb21haW4ge1xuICBmaWVsZHM6IChhbnlbXSB8IFZnRGF0YVJlZiB8IFZnU2lnbmFsUmVmKVtdO1xuICBzb3J0PzogVmdVbmlvblNvcnRGaWVsZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0ZpZWxkUmVmVW5pb25Eb21haW4ge1xuICBkYXRhOiBzdHJpbmc7XG4gIGZpZWxkczogVmdGaWVsZFJlZltdO1xuICBzb3J0PzogVmdVbmlvblNvcnRGaWVsZDtcbn1cblxuZXhwb3J0IHR5cGUgVmdTY2hlbWUgPSB7c2NoZW1lOiBzdHJpbmcsIGV4dGVudD86IG51bWJlcltdLCBjb3VudD86IG51bWJlcn07XG5leHBvcnQgdHlwZSBWZ1JhbmdlID0gc3RyaW5nIHwgVmdEYXRhUmVmIHwgKG51bWJlcnxzdHJpbmd8VmdEYXRhUmVmfFZnU2lnbmFsUmVmKVtdIHwgVmdTY2hlbWUgfCBWZ1JhbmdlU3RlcDtcblxuZXhwb3J0IHR5cGUgVmdSYW5nZVN0ZXAgPSB7c3RlcDogbnVtYmVyIHwgVmdTaWduYWxSZWZ9O1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmdSYW5nZVN0ZXAocmFuZ2U6IFZnUmFuZ2UpOiByYW5nZSBpcyBWZ1JhbmdlU3RlcCB7XG4gIHJldHVybiAhIXJhbmdlWydzdGVwJ107XG59XG5cbi8vIERvbWFpbnMgdGhhdCBhcmUgbm90IGEgdW5pb24gb2YgZG9tYWluc1xuZXhwb3J0IHR5cGUgVmdOb25VbmlvbkRvbWFpbiA9IGFueVtdIHwgVmdEYXRhUmVmIHwgVmdTaWduYWxSZWY7XG5leHBvcnQgdHlwZSBWZ0RvbWFpbiA9IFZnTm9uVW5pb25Eb21haW4gfCBEYXRhUmVmVW5pb25Eb21haW4gfCBWZ0ZpZWxkUmVmVW5pb25Eb21haW47XG5cbmV4cG9ydCB0eXBlIFZnTWFya0dyb3VwID0gYW55O1xuXG5leHBvcnQgdHlwZSBWZ1Byb2plY3Rpb25UeXBlID0gJ2FsYmVycycgfCAnYWxiZXJzVXNhJyB8ICdhemltdXRoYWxFcXVhbEFyZWEnIHwgJ2F6aW11dGhhbEVxdWlkaXN0YW50JyB8ICdjb25pY0NvbmZvcm1hbCcgfCAnY29uaWNFcXVhbEFyZWEnIHwgJ2NvbmljRXF1aWRpc3RhbnQnIHwgJ2VxdWlyZWN0YW5ndWxhcicgfCAnZ25vbW9uaWMnIHwgJ21lcmNhdG9yJyB8ICdvcnRob2dyYXBoaWMnIHwgJ3N0ZXJlb2dyYXBoaWMnIHwgJ3RyYW5zdmVyc2VNZXJjYXRvcic7XG5cblxuZXhwb3J0IHR5cGUgVmdQcm9qZWN0aW9uID0ge1xuICAvKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdGlvbi5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLypcbiAgICogVGhlIHR5cGUgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICB0eXBlPzogVmdQcm9qZWN0aW9uVHlwZTtcbiAgLypcbiAgICogVGhlIGNsaXAgYW5nbGUgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBjbGlwQW5nbGU/OiBudW1iZXI7XG4gIC8qXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHZpZXdwb3J0IGNsaXAgZXh0ZW50IHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzIGluIHBpeGVsc1xuICAgKi9cbiAgY2xpcEV4dGVudD86IG51bWJlcltdW107XG4gIC8qXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHNjYWxlIGZhY3RvciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqL1xuICBzY2FsZT86IG51bWJlcjtcbiAgLypcbiAgICogVGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBwcm9qZWN0aW9uLlxuICAgKi9cbiAgdHJhbnNsYXRlPzogbnVtYmVyW107XG4gIC8qXG4gICAqIFRoZSBjZW50ZXIgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBjZW50ZXI/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBvZiB0aGUgcHJvamVjdGlvbi5cbiAgICovXG4gIHJvdGF0ZT86IG51bWJlcltdO1xuICAvKlxuICAgKiBUaGUgZGVzaXJlZCBwcmVjaXNpb24gb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBwcmVjaXNpb24/OiBTdHJpbmc7XG4gIC8qXG4gICAqIEdlb0pTT04gZGF0YSB0byB3aGljaCB0aGUgcHJvamVjdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IGZpdCB0aGUgdHJhbnNsYXRlIGFuZCBzY2FsZSBwYXJhbWV0ZXJzLi5cbiAgICovXG4gIGZpdD86IFZnU2lnbmFsUmVmIHwgT2JqZWN0IHwgYW55W107XG4gIC8qXG4gICAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBmaXQsIHByb3ZpZGVzIHRoZSBwaXhlbCBhcmVhIHRvIHdoaWNoIHRoZSBwcm9qZWN0aW9uIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGZpdC5cbiAgICovXG4gIGV4dGVudD86IFZnU2lnbmFsUmVmIHwgbnVtYmVyW11bXTtcbiAgLypcbiAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGZpdCwgcHJvdmlkZXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBhcmVhIHRvIHdoaWNoIHRoZSBwcm9qZWN0aW9uIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGZpdC5cbiAgICovXG4gIHNpemU/OiBWZ1NpZ25hbFJlZiB8IChudW1iZXIgfCBWZ1NpZ25hbFJlZilbXTtcblxuICAvKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGFsbCBzdXBwb3J0ZWQgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3Rpb25zLiBDb25zdWx0IHRoZSBkMy1nZW8tcHJvamVjdGlvbiBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZ2VvLXByb2plY3Rpb24gKi9cbiAgY29lZmZpY2llbnQ/OiBudW1iZXI7XG4gIGRpc3RhbmNlPzogbnVtYmVyO1xuICBmcmFjdGlvbj86IG51bWJlcjtcbiAgbG9iZXM/OiBudW1iZXI7XG4gIHBhcmFsbGVsPzogbnVtYmVyO1xuICByYWRpdXM/OiBudW1iZXI7XG4gIHJhdGlvPzogbnVtYmVyO1xuICBzcGFjaW5nPzogbnVtYmVyO1xuICB0aWx0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ1NjYWxlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBTY2FsZVR5cGU7XG4gIGRvbWFpbjogVmdEb21haW47XG4gIGRvbWFpblJhdz86IFZnU2lnbmFsUmVmO1xuICByYW5nZTogVmdSYW5nZTtcblxuICBjbGFtcD86IGJvb2xlYW47XG4gIGJhc2U/OiBudW1iZXI7XG4gIGV4cG9uZW50PzogbnVtYmVyO1xuICBpbnRlcnBvbGF0ZT86IFNjYWxlSW50ZXJwb2xhdGUgfCBTY2FsZUludGVycG9sYXRlUGFyYW1zO1xuICBuaWNlPzogYm9vbGVhbiB8IG51bWJlciB8IE5pY2VUaW1lIHwge2ludGVydmFsOiBzdHJpbmcsIHN0ZXA6IG51bWJlcn07XG4gIHBhZGRpbmc/OiBudW1iZXI7XG4gIHBhZGRpbmdJbm5lcj86IG51bWJlcjtcbiAgcGFkZGluZ091dGVyPzogbnVtYmVyO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgcm91bmQ/OiBib29sZWFuO1xuICB6ZXJvPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU2NhbGVJbnRlcnBvbGF0ZSA9ICdyZ2InfCAnbGFiJyB8ICdoY2wnIHwgJ2hzbCcgfCAnaHNsLWxvbmcnIHwgJ2hjbC1sb25nJyB8ICdjdWJlaGVsaXgnIHwgJ2N1YmVoZWxpeC1sb25nJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2FsZUludGVycG9sYXRlUGFyYW1zIHtcbiAgdHlwZTogJ3JnYicgfCAnY3ViZWhlbGl4JyB8ICdjdWJlaGVsaXgtbG9uZyc7XG4gIGdhbW1hPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBWZ0xheW91dEFsaWduID0gJ25vbmUnIHwgJ2VhY2gnIHwgJ2FsbCc7XG5cbmV4cG9ydCB0eXBlIFJvd0NvbDxUPiA9IHtcbiAgcm93PzogVCxcbiAgY29sdW1uPzogVFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ0xheW91dCB7XG4gIHBhZGRpbmc6IG51bWJlciB8IFJvd0NvbDxudW1iZXI+O1xuICBoZWFkZXJCYW5kPzogbnVtYmVyIHwgUm93Q29sPG51bWJlcj47XG4gIGZvb3RlckJhbmQ/OiBudW1iZXIgfCBSb3dDb2w8bnVtYmVyPjtcbiAgb2Zmc2V0OiBudW1iZXIgfCB7XG4gICAgcm93SGVhZGVyOiBudW1iZXIsXG4gICAgcm93Rm9vdGVyOiBudW1iZXIsXG4gICAgcm93VGl0bGU6IG51bWJlcixcbiAgICBjb2x1bW5IZWFkZXI6IG51bWJlcixcbiAgICBjb2x1bW5Gb290ZXI6IG51bWJlcixcbiAgICBjb2x1bW5UaXRsZTogbnVtYmVyXG4gIH07XG4gIGJvdW5kczogJ2Z1bGwnIHwgJ2ZsdXNoJztcbiAgY29sdW1ucz86IG51bWJlciB8IHtzaWduYWw6IHN0cmluZ307XG4gIGFsaWduPzogVmdMYXlvdXRBbGlnbiB8IHtcbiAgICByb3c6IFZnTGF5b3V0QWxpZ24sXG4gICAgY29sdW1uOiBWZ0xheW91dEFsaWduXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFSZWZVbmlvbmVkRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgRGF0YVJlZlVuaW9uRG9tYWluIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICByZXR1cm4gJ2ZpZWxkcycgaW4gZG9tYWluICYmICEoJ2RhdGEnIGluIGRvbWFpbik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFJlZlVuaW9uRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgVmdGaWVsZFJlZlVuaW9uRG9tYWluIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICByZXR1cm4gJ2ZpZWxkcycgaW4gZG9tYWluICYmICdkYXRhJyBpbiBkb21haW47XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhUmVmRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgVmdEYXRhUmVmIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICAgcmV0dXJuICdmaWVsZCcgaW4gZG9tYWluICYmICdkYXRhJyBpbiBkb21haW47XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaWduYWxSZWZEb21haW4oZG9tYWluOiBWZ0RvbWFpbik6IGRvbWFpbiBpcyBWZ1NpZ25hbFJlZiB7XG4gIGlmICghaXNBcnJheShkb21haW4pKSB7XG4gICAgcmV0dXJuICdzaWduYWwnIGluIGRvbWFpbjtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdFdmVudEhhbmRsZXIge1xuICBldmVudHM6IHN0cmluZ1tdIHwgVmdTaWduYWxSZWY7XG4gIHVwZGF0ZT86IHN0cmluZztcbiAgZW5jb2RlPzogc3RyaW5nO1xuICBmb3JjZT86IGJvb2xlYW47XG4gIGJldHdlZW4/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ1NpZ25hbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgYmluZD86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uPzogVmdFdmVudEhhbmRsZXJbXTtcbiAgdXBkYXRlPzogc3RyaW5nO1xuICByZWFjdD86IGJvb2xlYW47XG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHt9IHwgVmdTaWduYWxSZWY7XG4gIC8vIG9ubHkgZm9yIG5lc3RlZCBzaWduYWxzXG4gIHB1c2g/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFZnRW5jb2RlQ2hhbm5lbCA9ICd4J3wneDInfCd4Yyd8J3dpZHRoJ3wneSd8J3kyJ3wneWMnfCdoZWlnaHQnfCdvcGFjaXR5J3wnZmlsbCd8J2ZpbGxPcGFjaXR5J3wnc3Ryb2tlJ3wnc3Ryb2tlV2lkdGgnfCdzdHJva2VDYXAnfCdzdHJva2VPcGFjaXR5J3wnc3Ryb2tlRGFzaCd8J3N0cm9rZURhc2hPZmZzZXQnfCdjdXJzb3InfCdjbGlwJ3wnc2l6ZSd8J3NoYXBlJ3wncGF0aCd8J2lubmVyUmFkaXVzJ3wnb3V0ZXJSYWRpdXMnfCdzdGFydEFuZ2xlJ3wnZW5kQW5nbGUnfCdpbnRlcnBvbGF0ZSd8J3RlbnNpb24nfCdvcmllbnQnfCd1cmwnfCdhbGlnbid8J2Jhc2VsaW5lJ3wndGV4dCd8J2Rpcid8J2VsbGlwc2lzJ3wnbGltaXQnfCdkeCd8J2R5J3wncmFkaXVzJ3wndGhldGEnfCdhbmdsZSd8J2ZvbnQnfCdmb250U2l6ZSd8J2ZvbnRXZWlnaHQnfCdmb250U3R5bGUnfCd0b29sdGlwJ3wnaHJlZid8J2N1cnNvcid8J2RlZmluZWQnO1xuZXhwb3J0IHR5cGUgVmdFbmNvZGVFbnRyeSA9IHtcbiAgW2sgaW4gVmdFbmNvZGVDaGFubmVsXT86IFZnVmFsdWVSZWYgfCAoVmdWYWx1ZVJlZiAmIHt0ZXN0Pzogc3RyaW5nfSlbXTtcbn07XG5cblxuLy8gVE9ETzogbWFrZSBleHBvcnQgaW50ZXJmYWNlIFZnRW5jb2RlRW50cnkge1xuLy8gICB4PzogVmdWYWx1ZVJlZjxudW1iZXI+XG4vLyAgIHk/OiBWZ1ZhbHVlUmVmPG51bWJlcj5cbi8vICAuLi5cbi8vICAgY29sb3I/OiBWZ1ZhbHVlUmVmPHN0cmluZz5cbi8vICAuLi5cbi8vIH1cblxuZXhwb3J0IHR5cGUgQXhpc09yaWVudCA9ICd0b3AnIHwgJ3JpZ2h0JyB8ICdsZWZ0JyB8ICdib3R0b20nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnQXhpcyB7XG4gIHNjYWxlOiBzdHJpbmc7XG4gIGRvbWFpbj86IGJvb2xlYW47XG4gIGZvcm1hdD86IHN0cmluZztcbiAgZ3JpZD86IGJvb2xlYW47XG4gIGdyaWRTY2FsZT86IHN0cmluZztcblxuICBsYWJlbHM/OiBib29sZWFuO1xuXG4gIGxhYmVsQm91bmQ/OiBib29sZWFuIHwgbnVtYmVyO1xuICBsYWJlbEZsdXNoPzogYm9vbGVhbiB8IG51bWJlcjtcbiAgbGFiZWxQYWRkaW5nPzogbnVtYmVyO1xuICBsYWJlbE92ZXJsYXA/OiBib29sZWFuIHwgJ3Bhcml0eScgfCAnZ3JlZWR5JztcbiAgbWF4RXh0ZW50PzogbnVtYmVyO1xuICBtaW5FeHRlbnQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgb3JpZW50PzogQXhpc09yaWVudDtcbiAgcG9zaXRpb24/OiBudW1iZXI7XG5cbiAgdGlja3M/OiBib29sZWFuO1xuICB0aWNrQ291bnQ/OiBudW1iZXI7XG4gIHRpY2tTaXplPzogbnVtYmVyO1xuXG4gIHRpdGxlPzogc3RyaW5nO1xuICB0aXRsZVBhZGRpbmc/OiBudW1iZXI7XG5cbiAgdmFsdWVzPzogYW55W10gfCBWZ1NpZ25hbFJlZjtcbiAgemluZGV4PzogbnVtYmVyO1xuXG4gIGVuY29kZT86IFZnQXhpc0VuY29kZTtcbn1cblxuZXhwb3J0IHR5cGUgTGVnZW5kVHlwZSA9ICdzeW1ib2wnIHwgJ2dyYWRpZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBWZ0xlZ2VuZCB7XG4gIGZpbGw/OiBzdHJpbmc7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc2l6ZT86IHN0cmluZztcbiAgc2hhcGU/OiBzdHJpbmc7XG4gIG9wYWNpdHk/OiBzdHJpbmc7XG5cbiAgZW50cnlQYWRkaW5nPzogbnVtYmVyO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBvcmllbnQ/OiBMZWdlbmRPcmllbnQ7XG4gIHBhZGRpbmc/OiBudW1iZXI7XG5cbiAgdGlja0NvdW50PzogbnVtYmVyO1xuICB0aXRsZT86IHN0cmluZztcbiAgdHlwZT86IExlZ2VuZFR5cGU7XG4gIHZhbHVlcz86IGFueVtdIHwgVmdTaWduYWxSZWY7XG4gIHppbmRleD86IG51bWJlcjtcblxuICBlbmNvZGU/OiBWZ0xlZ2VuZEVuY29kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0JpblRyYW5zZm9ybSBleHRlbmRzIEJhc2VCaW4ge1xuICB0eXBlOiAnYmluJztcbiAgZXh0ZW50PzogbnVtYmVyW10gfCB7c2lnbmFsOiBzdHJpbmd9O1xuICBmaWVsZDogc3RyaW5nO1xuICBhczogc3RyaW5nW107XG4gIHNpZ25hbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0V4dGVudFRyYW5zZm9ybSB7XG4gIHR5cGU6ICdleHRlbnQnO1xuICBmaWVsZDogc3RyaW5nO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0Zvcm11bGFUcmFuc2Zvcm0ge1xuICB0eXBlOiAnZm9ybXVsYSc7XG4gIGFzOiBzdHJpbmc7XG4gIGV4cHI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0ZpbHRlclRyYW5zZm9ybSB7XG4gIHR5cGU6ICdmaWx0ZXInO1xuICBleHByOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBZ2dyZWdhdGVUcmFuc2Zvcm0ge1xuICB0eXBlOiAnYWdncmVnYXRlJztcbiAgZ3JvdXBieT86IFZnRmllbGRSZWZbXTtcbiAgZmllbGRzPzogVmdGaWVsZFJlZltdO1xuICBvcHM/OiBBZ2dyZWdhdGVPcFtdO1xuICBhcz86IHN0cmluZ1tdO1xuICBjcm9zcz86IGJvb2xlYW47XG4gIGRyb3A/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnQ29sbGVjdFRyYW5zZm9ybSB7XG4gIHR5cGU6ICdjb2xsZWN0JztcbiAgc29ydDogVmdTb3J0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnTG9va3VwVHJhbnNmb3JtIHtcbiAgdHlwZTogJ2xvb2t1cCc7XG4gIGZyb206IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG4gIGZpZWxkczogc3RyaW5nW107XG4gIHZhbHVlcz86IHN0cmluZ1tdO1xuICBhcz86IHN0cmluZ1tdO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnU3RhY2tUcmFuc2Zvcm0ge1xuICB0eXBlOiAnc3RhY2snO1xuICBvZmZzZXQ/OiBTdGFja09mZnNldDtcbiAgZ3JvdXBieTogc3RyaW5nW107XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHNvcnQ6IFZnU29ydDtcbiAgYXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnSWRlbnRpZmllclRyYW5zZm9ybSB7XG4gIHR5cGU6ICdpZGVudGlmaWVyJztcbiAgYXM6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVmdUcmFuc2Zvcm0gPSBWZ0JpblRyYW5zZm9ybSB8IFZnRXh0ZW50VHJhbnNmb3JtIHwgVmdGb3JtdWxhVHJhbnNmb3JtIHwgVmdBZ2dyZWdhdGVUcmFuc2Zvcm0gfCBWZ0ZpbHRlclRyYW5zZm9ybSB8IFZnSW1wdXRlVHJhbnNmb3JtIHwgVmdTdGFja1RyYW5zZm9ybSB8IFZnQ29sbGVjdFRyYW5zZm9ybSB8IFZnTG9va3VwVHJhbnNmb3JtIHwgVmdJZGVudGlmaWVyVHJhbnNmb3JtIHwgVmdHZW9Qb2ludFRyYW5zZm9ybSB8IFZnR2VvSlNPTlRyYW5zZm9ybSB8IFZnR2VvSlNPTlRyYW5zZm9ybSB8IFZnV2luZG93VHJhbnNmb3JtO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnR2VvUG9pbnRUcmFuc2Zvcm0ge1xuICB0eXBlOiAnZ2VvcG9pbnQnO1xuICBwcm9qZWN0aW9uOiBzdHJpbmc7IC8vIHByb2plY3Rpb24gbmFtZVxuICBmaWVsZHM6IFZnRmllbGRSZWZbXTtcbiAgYXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0dlb1NoYXBlVHJhbnNmb3JtIHtcbiAgdHlwZTogJ2dlb3NoYXBlJztcbiAgcHJvamVjdGlvbjogc3RyaW5nOyAvLyBwcm9qZWN0aW9uIG5hbWVcbiAgZmllbGQ/OiBWZ0ZpZWxkUmVmO1xuICBhcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0dlb0pTT05UcmFuc2Zvcm0ge1xuICB0eXBlOiAnZ2VvanNvbic7XG4gIGZpZWxkcz86IFZnRmllbGRSZWZbXTtcbiAgZ2VvanNvbj86IFZnRmllbGRSZWY7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBWZ1Bvc3RFbmNvZGluZ1RyYW5zZm9ybSA9IFZnR2VvU2hhcGVUcmFuc2Zvcm07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBeGlzRW5jb2RlIHtcbiAgdGlja3M/OiBWZ0d1aWRlRW5jb2RlO1xuICBsYWJlbHM/OiBWZ0d1aWRlRW5jb2RlO1xuICB0aXRsZT86IFZnR3VpZGVFbmNvZGU7XG4gIGdyaWQ/OiBWZ0d1aWRlRW5jb2RlO1xuICBkb21haW4/OiBWZ0d1aWRlRW5jb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnTGVnZW5kRW5jb2RlIHtcbiAgdGl0bGU/OiBWZ0d1aWRlRW5jb2RlO1xuICBsYWJlbHM/OiBWZ0d1aWRlRW5jb2RlO1xuICBsZWdlbmQ/OiBWZ0d1aWRlRW5jb2RlO1xuICBzeW1ib2xzPzogVmdHdWlkZUVuY29kZTtcbiAgZ3JhZGllbnQ/OiBWZ0d1aWRlRW5jb2RlO1xufVxuXG5leHBvcnQgdHlwZSBWZ0d1aWRlRW5jb2RlID0gYW55OyAvLyBUT0RPOiByZXBsYWNlIHRoaXMgKFNlZSBndWlkZUVuY29kZSBpbiBWZWdhIFNjaGVtYSlcblxuZXhwb3J0IHR5cGUgVmdTb3J0ID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcmRlcj86IFZnQ29tcGFyYXRvck9yZGVyO1xufSB8IHtcbiAgZmllbGQ6IHN0cmluZ1tdO1xuICBvcmRlcj86IChWZ0NvbXBhcmF0b3JPcmRlcilbXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdJbXB1dGVUcmFuc2Zvcm0ge1xuICB0eXBlOiAnaW1wdXRlJztcbiAgZ3JvdXBieT86IHN0cmluZ1tdO1xuICBmaWVsZDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAga2V5dmFscz86IHN0cmluZ1tdO1xuICBtZXRob2Q/OiAndmFsdWUnIHwgJ21lZGlhbicgfCAnbWF4JyB8ICdtaW4nIHwgJ21lYW4nO1xuICB2YWx1ZT86IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgVmdDaGVja2JveEJpbmRpbmcgPSB7XG4gIGlucHV0OiAnY2hlY2tib3gnO1xuICBlbGVtZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVmdSYWRpb0JpbmRpbmcgPSB7XG4gIGlucHV0OiAncmFkaW8nO1xuICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgZWxlbWVudD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZnU2VsZWN0QmluZGluZyA9IHtcbiAgaW5wdXQ6ICdzZWxlY3QnO1xuICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgZWxlbWVudD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZnUmFuZ2VCaW5kaW5nID0ge1xuICBpbnB1dDogJ3JhbmdlJztcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHN0ZXA/OiBudW1iZXI7XG4gIGVsZW1lbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBWZ0dlbmVyaWNCaW5kaW5nID0ge1xuICBpbnB1dDogc3RyaW5nO1xuICBlbGVtZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVmdCaW5kaW5nID0gVmdDaGVja2JveEJpbmRpbmcgfCBWZ1JhZGlvQmluZGluZyB8XG4gIFZnU2VsZWN0QmluZGluZyB8IFZnUmFuZ2VCaW5kaW5nIHwgVmdHZW5lcmljQmluZGluZztcblxuXG4vKipcbiAqIEJhc2Ugb2JqZWN0IGZvciBWZWdhJ3MgQXhpcyBhbmQgQXhpcyBDb25maWcuXG4gKiBBbGwgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgYm90aCBwcm9wZXJ0aWVzIG9mIFZlZ2EncyBBeGlzIGFuZCBBeGlzIENvbmZpZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZ0F4aXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGRvbWFpbiAodGhlIGF4aXMgYmFzZWxpbmUpIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBheGlzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgXG4gICAqL1xuICBkb21haW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIGdyaWQgbGluZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGF4aXNcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCBmb3IgW2NvbnRpbnVvdXMgc2NhbGVzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjY29udGludW91cykgdGhhdCBhcmUgbm90IGJpbm5lZDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgKi9cbiAgZ3JpZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgbGFiZWxzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBheGlzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGB0cnVlYC5cbiAgICovXG4gIGxhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBsYWJlbHMgc2hvdWxkIGJlIGhpZGRlbiBpZiB0aGV5IGV4Y2VlZCB0aGUgYXhpcyByYW5nZS4gSWbCoGBmYWxzZcKgYCh0aGUgZGVmYXVsdCkgbm8gYm91bmRzIG92ZXJsYXAgYW5hbHlzaXMgaXMgcGVyZm9ybWVkLiBJZsKgYHRydWVgLCBsYWJlbHMgd2lsbCBiZSBoaWRkZW4gaWYgdGhleSBleGNlZWQgdGhlIGF4aXMgcmFuZ2UgYnkgbW9yZSB0aGFuIDEgcGl4ZWwuIElmIHRoaXMgcHJvcGVydHkgaXMgYSBudW1iZXIsIGl0IHNwZWNpZmllcyB0aGUgcGl4ZWwgdG9sZXJhbmNlOiB0aGUgbWF4aW11bSBhbW91bnQgYnkgd2hpY2ggYSBsYWJlbCBib3VuZGluZyBib3ggbWF5IGV4Y2VlZCB0aGUgYXhpcyByYW5nZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqL1xuICBsYWJlbEJvdW5kPzogYm9vbGVhbiB8IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaXJzdCBhbmQgbGFzdCBheGlzIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBmbHVzaCB3aXRoIHRoZSBzY2FsZSByYW5nZS4gRmx1c2ggYWxpZ25tZW50IGZvciBhIGhvcml6b250YWwgYXhpcyB3aWxsIGxlZnQtYWxpZ24gdGhlIGZpcnN0IGxhYmVsIGFuZCByaWdodC1hbGlnbiB0aGUgbGFzdCBsYWJlbC4gRm9yIHZlcnRpY2FsIGF4ZXMsIGJvdHRvbSBhbmQgdG9wIHRleHQgYmFzZWxpbmVzIGFyZSBhcHBsaWVkIGluc3RlYWQuIElmIHRoaXMgcHJvcGVydHkgaXMgYSBudW1iZXIsIGl0IGFsc28gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGJ5IHdoaWNoIHRvIG9mZnNldCB0aGUgZmlyc3QgYW5kIGxhc3QgbGFiZWxzOyBmb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIHdpbGwgZmx1c2gtYWxpZ24gdGhlIGZpcnN0IGFuZCBsYXN0IGxhYmVscyBhbmQgYWxzbyBwdXNoIHRoZW0gMiBwaXhlbHMgb3V0d2FyZCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGF4aXMuIFRoZSBhZGRpdGlvbmFsIGFkanVzdG1lbnQgY2FuIHNvbWV0aW1lcyBoZWxwIHRoZSBsYWJlbHMgYmV0dGVyIHZpc3VhbGx5IGdyb3VwIHdpdGggY29ycmVzcG9uZGluZyBheGlzIHRpY2tzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgIGZvciBheGlzIG9mIGEgY29udGludW91cyB4LXNjYWxlLiBPdGhlcndpc2UsIGBmYWxzZWAuXG4gICAqL1xuICBsYWJlbEZsdXNoPzogYm9vbGVhbiB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0cmF0ZWd5IHRvIHVzZSBmb3IgcmVzb2x2aW5nIG92ZXJsYXAgb2YgYXhpcyBsYWJlbHMuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgbm8gb3ZlcmxhcCByZWR1Y3Rpb24gaXMgYXR0ZW1wdGVkLiBJZiBzZXQgdG8gYHRydWVgIG9yIGBcInBhcml0eVwiYCwgYSBzdHJhdGVneSBvZiByZW1vdmluZyBldmVyeSBvdGhlciBsYWJlbCBpcyB1c2VkICh0aGlzIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIGxpbmVhciBheGVzKS4gSWYgc2V0IHRvIGBcImdyZWVkeVwiYCwgYSBsaW5lYXIgc2NhbiBvZiB0aGUgbGFiZWxzIGlzIHBlcmZvcm1lZCwgcmVtb3ZpbmcgYW55IGxhYmVscyB0aGF0IG92ZXJsYXBzIHdpdGggdGhlIGxhc3QgdmlzaWJsZSBsYWJlbCAodGhpcyBvZnRlbiB3b3JrcyBiZXR0ZXIgZm9yIGxvZy1zY2FsZWQgYXhlcykuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgdHJ1ZWAgZm9yIG5vbi1ub21pbmFsIGZpZWxkcyB3aXRoIG5vbi1sb2cgc2NhbGVzOyBgXCJncmVlZHlcImAgZm9yIGxvZyBzY2FsZXM7IG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgbGFiZWxPdmVybGFwPzogYm9vbGVhbiB8ICdwYXJpdHknIHwgJ2dyZWVkeSc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWRkaW5nLCBpbiBwaXhlbHMsIGJldHdlZW4gYXhpcyBhbmQgdGV4dCBsYWJlbHMuXG4gICAqL1xuICBsYWJlbFBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGF4aXMgc2hvdWxkIGluY2x1ZGUgdGlja3MuXG4gICAqL1xuICB0aWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIGluIHBpeGVscyBvZiBheGlzIHRpY2tzLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICB0aWNrU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4IGxlbmd0aCBmb3IgYXhpcyB0aXRsZSBpZiB0aGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgZmllbGQncyBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHVuZGVmaW5lZGAuXG4gICAqL1xuICB0aXRsZU1heExlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aXRsZSBhbmQgYXhpcy5cbiAgICovXG4gIHRpdGxlUGFkZGluZz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gZXh0ZW50IGluIHBpeGVscyB0aGF0IGF4aXMgdGlja3MgYW5kIGxhYmVscyBzaG91bGQgdXNlLiBUaGlzIGRldGVybWluZXMgYSBtaW5pbXVtIG9mZnNldCB2YWx1ZSBmb3IgYXhpcyB0aXRsZXMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMzBgIGZvciB5LWF4aXM7IGB1bmRlZmluZWRgIGZvciB4LWF4aXMuXG4gICAqL1xuICBtaW5FeHRlbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGV4dGVudCBpbiBwaXhlbHMgdGhhdCBheGlzIHRpY2tzIGFuZCBsYWJlbHMgc2hvdWxkIHVzZS4gVGhpcyBkZXRlcm1pbmVzIGEgbWF4aW11bSBvZmZzZXQgdmFsdWUgZm9yIGF4aXMgdGl0bGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHVuZGVmaW5lZGAuXG4gICAqL1xuICBtYXhFeHRlbnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBeGlzQ29uZmlnIGV4dGVuZHMgVmdBeGlzQmFzZSB7XG4gIC8qKlxuICAgKiBBbiBpbnRlcnBvbGF0aW9uIGZyYWN0aW9uIGluZGljYXRpbmcgd2hlcmUsIGZvciBgYmFuZGAgc2NhbGVzLCBheGlzIHRpY2tzIHNob3VsZCBiZSBwb3NpdGlvbmVkLiBBIHZhbHVlIG9mIGAwYCBwbGFjZXMgdGlja3MgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGVpciBiYW5kcy4gQSB2YWx1ZSBvZiBgMC41YCBwbGFjZXMgdGlja3MgaW4gdGhlIG1pZGRsZSBvZiB0aGVpciBiYW5kcy5cbiAgICovXG4gIGJhbmRQb3NpdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFN0cm9rZSB3aWR0aCBvZiBheGlzIGRvbWFpbiBsaW5lXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgKG5vbmUsIHVzaW5nIFZlZ2EgZGVmYXVsdCkuXG4gICAqL1xuICBkb21haW5XaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29sb3Igb2YgYXhpcyBkb21haW4gbGluZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICAobm9uZSwgdXNpbmcgVmVnYSBkZWZhdWx0KS5cbiAgICovXG4gIGRvbWFpbkNvbG9yPzogc3RyaW5nO1xuXG4gIC8vIC0tLS0tLS0tLS0gR3JpZCAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBDb2xvciBvZiBncmlkbGluZXMuXG4gICAqL1xuICBncmlkQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgKGluIHBpeGVscykgaW50byB3aGljaCB0byBiZWdpbiBkcmF3aW5nIHdpdGggdGhlIGdyaWQgZGFzaCBhcnJheS5cbiAgICovXG4gIGdyaWREYXNoPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSBvZiBncmlkICh2YWx1ZSBiZXR3ZWVuIFswLDFdKVxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKGAxYCBieSBkZWZhdWx0KVxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDFcbiAgICovXG4gIGdyaWRPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3JpZCB3aWR0aCwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBncmlkV2lkdGg/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBUaWNrcyAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGF4aXMncyB0aWNrLlxuICAgKi9cbiAgdGlja0NvbG9yPzogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgYXhpcyBsYWJlbHMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgLTkwYCBmb3Igbm9taW5hbCBhbmQgb3JkaW5hbCBmaWVsZHM7IGAwYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBtaW5pbXVtIC0zNjBcbiAgICogQG1heGltdW0gMzYwXG4gICAqL1xuICBsYWJlbEFuZ2xlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIHRpY2sgbGFiZWwsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICBsYWJlbENvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBvZiB0aGUgdGljayBsYWJlbC5cbiAgICovXG4gIGxhYmVsRm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnQgc2l6ZSBvZiB0aGUgbGFiZWwsIGluIHBpeGVscy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgbGFiZWxGb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGljayBsYWJlbHMuXG4gICAqL1xuICBsYWJlbExpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBwaXhlbCBwb3NpdGlvbiB2YWx1ZXMgc2hvdWxkIGJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAgICovXG4gIHRpY2tSb3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCwgaW4gcGl4ZWxzLCBvZiB0aWNrcy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgdGlja1dpZHRoPzogbnVtYmVyO1xuXG4gIC8vIC0tLS0tLS0tLS0gVGl0bGUgLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIHRleHQgYWxpZ25tZW50IG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVBbGlnbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW5nbGUgaW4gZGVncmVlcyBvZiBheGlzIHRpdGxlcy5cbiAgICovXG4gIHRpdGxlQW5nbGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBWZXJ0aWNhbCB0ZXh0IGJhc2VsaW5lIGZvciBheGlzIHRpdGxlcy5cbiAgICovXG4gIHRpdGxlQmFzZWxpbmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdGl0bGUsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICB0aXRsZUNvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb250IG9mIHRoZSB0aXRsZS4gKGUuZy4sIGBcIkhlbHZldGljYSBOZXVlXCJgKS5cbiAgICovXG4gIHRpdGxlRm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogRm9udCBzaXplIG9mIHRoZSB0aXRsZS5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgdGl0bGVGb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9udCB3ZWlnaHQgb2YgdGhlIHRpdGxlLlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgKGUuZyBgXCJib2xkXCJgLCBgXCJub3JtYWxcImApIG9yIGEgbnVtYmVyIChgMTAwYCwgYDIwMGAsIGAzMDBgLCAuLi4sIGA5MDBgIHdoZXJlIGBcIm5vcm1hbFwiYCA9IGA0MDBgIGFuZCBgXCJib2xkXCJgID0gYDcwMGApLlxuICAgKi9cbiAgdGl0bGVGb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogWC1jb29yZGluYXRlIG9mIHRoZSBheGlzIHRpdGxlIHJlbGF0aXZlIHRvIHRoZSBheGlzIGdyb3VwLlxuICAgKi9cbiAgdGl0bGVYPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBZLWNvb3JkaW5hdGUgb2YgdGhlIGF4aXMgdGl0bGUgcmVsYXRpdmUgdG8gdGhlIGF4aXMgZ3JvdXAuXG4gICAqL1xuICB0aXRsZVk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIExlZ2VuZE9yaWVudCA9ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCcgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdMZWdlbmRCYXNlIHtcbiAgLyoqXG4gICAqIFBhZGRpbmcgKGluIHBpeGVscykgYmV0d2VlbiBsZWdlbmQgZW50cmllcyBpbiBhIHN5bWJvbCBsZWdlbmQuXG4gICAqL1xuICBlbnRyeVBhZGRpbmc/OiBudW1iZXI7XG5cblxuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsZWdlbmQsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBsZWdlbmQgaXMgcG9zaXRpb25lZCB3aXRoaW4gdGhlIHNjZW5lLiBPbmUgb2YgXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsIFwiYm90dG9tLXJpZ2h0XCIsIFwibm9uZVwiLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwicmlnaHRcImBcbiAgICovXG4gIG9yaWVudD86IExlZ2VuZE9yaWVudDtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCwgaW4gcGl4ZWxzLCBieSB3aGljaCB0byBkaXNwbGFjZSB0aGUgbGVnZW5kIGZyb20gdGhlIGVkZ2Ugb2YgdGhlIGVuY2xvc2luZyBncm91cCBvciBkYXRhIHJlY3RhbmdsZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICBgMGBcbiAgICovXG4gIG9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aGUgbGVnZW5kIGFuZCBheGlzLlxuICAgKi9cbiAgcGFkZGluZz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0xlZ2VuZENvbmZpZyBleHRlbmRzIFZnTGVnZW5kQmFzZSB7XG5cbiAgLyoqXG4gICAqIENvcm5lciByYWRpdXMgZm9yIHRoZSBmdWxsIGxlZ2VuZC5cbiAgICovXG4gIGNvcm5lclJhZGl1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQmFja2dyb3VuZCBmaWxsIGNvbG9yIGZvciB0aGUgZnVsbCBsZWdlbmQuXG4gICAqL1xuICBmaWxsQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJvcmRlciBzdHJva2UgY29sb3IgZm9yIHRoZSBmdWxsIGxlZ2VuZC5cbiAgICovXG4gIHN0cm9rZUNvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb3JkZXIgc3Ryb2tlIGRhc2ggcGF0dGVybiBmb3IgdGhlIGZ1bGwgbGVnZW5kLlxuICAgKi9cbiAgc3Ryb2tlRGFzaD86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBCb3JkZXIgc3Ryb2tlIHdpZHRoIGZvciB0aGUgZnVsbCBsZWdlbmQuXG4gICAqL1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgLy8gLS0tLS0tLS0tLSBHcmFkaWVudCAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGdyYWRpZW50IHN0cm9rZSwgY2FuIGJlIGluIGhleCBjb2xvciBjb2RlIG9yIHJlZ3VsYXIgY29sb3IgbmFtZS5cbiAgICovXG4gIGdyYWRpZW50U3Ryb2tlQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZ3JhZGllbnQgc3Ryb2tlLCBpbiBwaXhlbHMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGdyYWRpZW50U3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGdyYWRpZW50LCBpbiBwaXhlbHMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGdyYWRpZW50SGVpZ2h0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUZXh0IGJhc2VsaW5lIGZvciBjb2xvciByYW1wIGdyYWRpZW50IGxhYmVscy5cbiAgICovXG4gIGdyYWRpZW50TGFiZWxCYXNlbGluZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggaW4gcGl4ZWxzIG9mIGNvbG9yIHJhbXAgZ3JhZGllbnQgbGFiZWxzLlxuICAgKi9cbiAgZ3JhZGllbnRMYWJlbExpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWZXJ0aWNhbCBvZmZzZXQgaW4gcGl4ZWxzIGZvciBjb2xvciByYW1wIGdyYWRpZW50IGxhYmVscy5cbiAgICovXG4gIGdyYWRpZW50TGFiZWxPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZ3JhZGllbnQsIGluIHBpeGVscy5cbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgZ3JhZGllbnRXaWR0aD86IG51bWJlcjtcblxuICAvLyAtLS0tLS0tLS0tIExhYmVsIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGxlZ2VuZCBsYWJlbCwgY2FuIGJlIGxlZnQsIG1pZGRsZSBvciByaWdodC5cbiAgICovXG4gIGxhYmVsQWxpZ24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgYmFzZWxpbmUgb2YgbGVnZW5kIGxhYmVsLCBjYW4gYmUgdG9wLCBtaWRkbGUgb3IgYm90dG9tLlxuICAgKi9cbiAgbGFiZWxCYXNlbGluZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBsZWdlbmQgbGFiZWwsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICBsYWJlbENvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBvZiB0aGUgbGVnZW5kIGxhYmVsLlxuICAgKi9cbiAgbGFiZWxGb250Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBzaXplIG9mIGxlZ2VuZCBsYWJlbC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAxMGAuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGxhYmVsRm9udFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gYWxsb3dlZCBwaXhlbCB3aWR0aCBvZiBheGlzIHRpY2sgbGFiZWxzLlxuICAgKi9cbiAgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgbGVnZW5kIGxhYmVsLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBsYWJlbE9mZnNldD86IG51bWJlcjtcblxuICAvLyAtLS0tLS0tLS0tIFN5bWJvbHMgLS0tLS0tLS0tLVxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBsZWdlbmQgc3ltYm9sLFxuICAgKi9cbiAgc3ltYm9sQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgc2hhcGUgdHlwZSAoc3VjaCBhcyBcImNpcmNsZVwiKSBmb3IgbGVnZW5kIHN5bWJvbHMuXG4gICAqL1xuICBzeW1ib2xUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHN5bWJvbCwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBzeW1ib2xTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHN5bWJvbCdzIHN0cm9rZS5cbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgc3ltYm9sU3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBUaXRsZSAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIHRleHQgYWxpZ25tZW50IGZvciBsZWdlbmQgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVBbGlnbj86IHN0cmluZztcblxuICAgLyoqXG4gICAgKiBWZXJ0aWNhbCB0ZXh0IGJhc2VsaW5lIGZvciBsZWdlbmQgdGl0bGVzLlxuICAgICovXG4gIHRpdGxlQmFzZWxpbmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGxlZ2VuZCB0aXRsZSwgY2FuIGJlIGluIGhleCBjb2xvciBjb2RlIG9yIHJlZ3VsYXIgY29sb3IgbmFtZS5cbiAgICovXG4gIHRpdGxlQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IG9mIHRoZSBsZWdlbmQgdGl0bGUuXG4gICAqL1xuICB0aXRsZUZvbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IHNpemUgb2YgdGhlIGxlZ2VuZCB0aXRsZS5cbiAgICovXG4gIHRpdGxlRm9udFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IHdlaWdodCBvZiB0aGUgbGVnZW5kIHRpdGxlLlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgKGUuZyBgXCJib2xkXCJgLCBgXCJub3JtYWxcImApIG9yIGEgbnVtYmVyIChgMTAwYCwgYDIwMGAsIGAzMDBgLCAuLi4sIGA5MDBgIHdoZXJlIGBcIm5vcm1hbFwiYCA9IGA0MDBgIGFuZCBgXCJib2xkXCJgID0gYDcwMGApLlxuICAgKi9cbiAgdGl0bGVGb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aXRsZSBhbmQgbGVnZW5kLlxuICAgKi9cbiAgdGl0bGVQYWRkaW5nPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBGb250U3R5bGUgPSAnbm9ybWFsJyB8ICdpdGFsaWMnO1xuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0U3RyaW5nID0gJ25vcm1hbCcgfCAnYm9sZCc7XG4vKipcbiAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gKiBAbWluaW11bSAxMDBcbiAqIEBtYXhpbXVtIDkwMFxuICovXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0TnVtYmVyID0gbnVtYmVyO1xuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9IEZvbnRXZWlnaHRTdHJpbmcgfCBGb250V2VpZ2h0TnVtYmVyO1xuZXhwb3J0IHR5cGUgSG9yaXpvbnRhbEFsaWduID0gJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdjZW50ZXInO1xuZXhwb3J0IHR5cGUgSW50ZXJwb2xhdGUgPSAnbGluZWFyJyB8ICdsaW5lYXItY2xvc2VkJyB8XG4gICdzdGVwJyB8ICdzdGVwLWJlZm9yZScgfCAnc3RlcC1hZnRlcicgfFxuICAnYmFzaXMnIHwgJ2Jhc2lzLW9wZW4nIHwgJ2Jhc2lzLWNsb3NlZCcgfFxuICAnY2FyZGluYWwnIHwgJ2NhcmRpbmFsLW9wZW4nIHwgJ2NhcmRpbmFsLWNsb3NlZCcgfFxuICAnYnVuZGxlJyB8ICdtb25vdG9uZSc7XG5leHBvcnQgdHlwZSBPcmllbnQgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IHR5cGUgVmVydGljYWxBbGlnbiA9ICd0b3AnIHwgJ21pZGRsZScgfCAnYm90dG9tJztcblxuZXhwb3J0IGludGVyZmFjZSBWZ01hcmtDb25maWcge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IEZpbGwgQ29sb3IuICBUaGlzIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGBjb25maWcuY29sb3JgXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAoTm9uZSlcbiAgICpcbiAgICovXG4gIGZpbGw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgU3Ryb2tlIENvbG9yLiAgVGhpcyBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgY29uZmlnLmNvbG9yYFxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKE5vbmUpXG4gICAqXG4gICAqL1xuICBzdHJva2U/OiBzdHJpbmc7XG5cbiAgLy8gLS0tLS0tLS0tLSBPcGFjaXR5IC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBvdmVyYWxsIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuN2AgZm9yIG5vbi1hZ2dyZWdhdGUgcGxvdHMgd2l0aCBgcG9pbnRgLCBgdGlja2AsIGBjaXJjbGVgLCBvciBgc3F1YXJlYCBtYXJrcyBvciBsYXllcmVkIGBiYXJgIGNoYXJ0cyBhbmQgYDFgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBvcGFjaXR5PzogbnVtYmVyO1xuXG5cbiAgLyoqXG4gICAqIFRoZSBmaWxsIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSAodmFsdWUgYmV0d2VlbiBbMCwxXSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBzdHJva2VPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8vIC0tLS0tLS0tLS0gU3Ryb2tlIFN0eWxlIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugd2lkdGgsIGluIHBpeGVscy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2UgY2FwIGZvciBsaW5lIGVuZGluZyBzdHlsZS4gT25lIG9mIGBcImJ1dHRcImAsIGBcInJvdW5kXCJgLCBvciBgXCJzcXVhcmVcImAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJzcXVhcmVcImBcbiAgICovXG4gIHN0cm9rZUNhcD86ICdidXR0JyB8ICdyb3VuZCcgfCAnc3F1YXJlJztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWx0ZXJuYXRpbmcgc3Ryb2tlLCBzcGFjZSBsZW5ndGhzIGZvciBjcmVhdGluZyBkYXNoZWQgb3IgZG90dGVkIGxpbmVzLlxuICAgKi9cbiAgc3Ryb2tlRGFzaD86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IChpbiBwaXhlbHMpIGludG8gd2hpY2ggdG8gYmVnaW4gZHJhd2luZyB3aXRoIHRoZSBzdHJva2UgZGFzaCBhcnJheS5cbiAgICovXG4gIHN0cm9rZURhc2hPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBPcmllbnRhdGlvbjogQmFyLCBUaWNrLCBMaW5lLCBBcmVhIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBvcmllbnRhdGlvbiBvZiBhIG5vbi1zdGFja2VkIGJhciwgdGljaywgYXJlYSwgYW5kIGxpbmUgY2hhcnRzLlxuICAgKiBUaGUgdmFsdWUgaXMgZWl0aGVyIGhvcml6b250YWwgKGRlZmF1bHQpIG9yIHZlcnRpY2FsLlxuICAgKiAtIEZvciBiYXIsIHJ1bGUgYW5kIHRpY2ssIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzaXplIG9mIHRoZSBiYXIgYW5kIHRpY2tcbiAgICogc2hvdWxkIGJlIGFwcGxpZWQgdG8geCBvciB5IGRpbWVuc2lvbi5cbiAgICogLSBGb3IgYXJlYSwgdGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBvcmllbnQgcHJvcGVydHkgb2YgdGhlIFZlZ2Egb3V0cHV0LlxuICAgKiAtIEZvciBsaW5lIGFuZCB0cmFpbCBtYXJrcywgdGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGxpbmVcbiAgICogaWYgYGNvbmZpZy5zb3J0TGluZUJ5YCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgKiBGb3Igc3RhY2tlZCBjaGFydHMsIHRoaXMgaXMgYWx3YXlzIGRldGVybWluZWQgYnkgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdGFjaztcbiAgICogdGhlcmVmb3JlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZhbHVlIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIG9yaWVudD86IE9yaWVudDtcblxuICAvLyAtLS0tLS0tLS0tIEludGVycG9sYXRpb246IExpbmUgLyBhcmVhIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGludGVycG9sYXRpb24gbWV0aG9kIHRvIHVzZSBmb3IgbGluZSBhbmQgYXJlYSBtYXJrcy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gYFwibGluZWFyXCJgOiBwaWVjZXdpc2UgbGluZWFyIHNlZ21lbnRzLCBhcyBpbiBhIHBvbHlsaW5lLlxuICAgKiAtIGBcImxpbmVhci1jbG9zZWRcImA6IGNsb3NlIHRoZSBsaW5lYXIgc2VnbWVudHMgdG8gZm9ybSBhIHBvbHlnb24uXG4gICAqIC0gYFwic3RlcFwiYDogYWx0ZXJuYXRlIGJldHdlZW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2VnbWVudHMsIGFzIGluIGEgc3RlcCBmdW5jdGlvbi5cbiAgICogLSBgXCJzdGVwLWJlZm9yZVwiYDogYWx0ZXJuYXRlIGJldHdlZW4gdmVydGljYWwgYW5kIGhvcml6b250YWwgc2VnbWVudHMsIGFzIGluIGEgc3RlcCBmdW5jdGlvbi5cbiAgICogLSBgXCJzdGVwLWFmdGVyXCJgOiBhbHRlcm5hdGUgYmV0d2VlbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzZWdtZW50cywgYXMgaW4gYSBzdGVwIGZ1bmN0aW9uLlxuICAgKiAtIGBcImJhc2lzXCJgOiBhIEItc3BsaW5lLCB3aXRoIGNvbnRyb2wgcG9pbnQgZHVwbGljYXRpb24gb24gdGhlIGVuZHMuXG4gICAqIC0gYFwiYmFzaXMtb3BlblwiYDogYW4gb3BlbiBCLXNwbGluZTsgbWF5IG5vdCBpbnRlcnNlY3QgdGhlIHN0YXJ0IG9yIGVuZC5cbiAgICogLSBgXCJiYXNpcy1jbG9zZWRcImA6IGEgY2xvc2VkIEItc3BsaW5lLCBhcyBpbiBhIGxvb3AuXG4gICAqIC0gYFwiY2FyZGluYWxcImA6IGEgQ2FyZGluYWwgc3BsaW5lLCB3aXRoIGNvbnRyb2wgcG9pbnQgZHVwbGljYXRpb24gb24gdGhlIGVuZHMuXG4gICAqIC0gYFwiY2FyZGluYWwtb3BlblwiYDogYW4gb3BlbiBDYXJkaW5hbCBzcGxpbmU7IG1heSBub3QgaW50ZXJzZWN0IHRoZSBzdGFydCBvciBlbmQsIGJ1dCB3aWxsIGludGVyc2VjdCBvdGhlciBjb250cm9sIHBvaW50cy5cbiAgICogLSBgXCJjYXJkaW5hbC1jbG9zZWRcImA6IGEgY2xvc2VkIENhcmRpbmFsIHNwbGluZSwgYXMgaW4gYSBsb29wLlxuICAgKiAtIGBcImJ1bmRsZVwiYDogZXF1aXZhbGVudCB0byBiYXNpcywgZXhjZXB0IHRoZSB0ZW5zaW9uIHBhcmFtZXRlciBpcyB1c2VkIHRvIHN0cmFpZ2h0ZW4gdGhlIHNwbGluZS5cbiAgICogLSBgXCJtb25vdG9uZVwiYDogY3ViaWMgaW50ZXJwb2xhdGlvbiB0aGF0IHByZXNlcnZlcyBtb25vdG9uaWNpdHkgaW4geS5cbiAgICovXG4gIGludGVycG9sYXRlPzogSW50ZXJwb2xhdGU7XG4gIC8qKlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIGludGVycG9sYXRpb24gdHlwZSwgc2V0cyB0aGUgdGVuc2lvbiBwYXJhbWV0ZXIgKGZvciBsaW5lIGFuZCBhcmVhIG1hcmtzKS5cbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICB0ZW5zaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBzeW1ib2wgc2hhcGUgdG8gdXNlLiBPbmUgb2Y6IGBcImNpcmNsZVwiYCAoZGVmYXVsdCksIGBcInNxdWFyZVwiYCwgYFwiY3Jvc3NcImAsIGBcImRpYW1vbmRcImAsIGBcInRyaWFuZ2xlLXVwXCJgLCBvciBgXCJ0cmlhbmdsZS1kb3duXCJgLCBvciBhIGN1c3RvbSBTVkcgcGF0aC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcImNpcmNsZVwiYFxuICAgKlxuICAgKi9cbiAgc2hhcGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaXhlbCBhcmVhIGVhY2ggdGhlIHBvaW50L2NpcmNsZS9zcXVhcmUuXG4gICAqIEZvciBleGFtcGxlOiBpbiB0aGUgY2FzZSBvZiBjaXJjbGVzLCB0aGUgcmFkaXVzIGlzIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHNpemUgdmFsdWUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMzBgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHNpemU/OiBudW1iZXI7XG5cbiAgLy8gVGV4dCAvIExhYmVsIE1hcmsgQ29uZmlnXG5cbiAgLyoqXG4gICAqIFRoZSBob3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGUgdGV4dC4gT25lIG9mIGBcImxlZnRcImAsIGBcInJpZ2h0XCJgLCBgXCJjZW50ZXJcImAuXG4gICAqL1xuICBhbGlnbj86IEhvcml6b250YWxBbGlnbjtcblxuICAvKipcbiAgICogVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSB0ZXh0LCBpbiBkZWdyZWVzLlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDM2MFxuICAgKi9cbiAgYW5nbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIHRleHQuIE9uZSBvZiBgXCJ0b3BcImAsIGBcIm1pZGRsZVwiYCwgYFwiYm90dG9tXCJgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwibWlkZGxlXCJgXG4gICAqXG4gICAqL1xuICBiYXNlbGluZT86IFZlcnRpY2FsQWxpZ247XG5cbiAgLyoqXG4gICAqIFRoZSBob3Jpem9udGFsIG9mZnNldCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSB0ZXh0IGxhYmVsIGFuZCBpdHMgYW5jaG9yIHBvaW50LiBUaGUgb2Zmc2V0IGlzIGFwcGxpZWQgYWZ0ZXIgcm90YXRpb24gYnkgdGhlIF9hbmdsZV8gcHJvcGVydHkuXG4gICAqL1xuICBkeD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZlcnRpY2FsIG9mZnNldCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSB0ZXh0IGxhYmVsIGFuZCBpdHMgYW5jaG9yIHBvaW50LiBUaGUgb2Zmc2V0IGlzIGFwcGxpZWQgYWZ0ZXIgcm90YXRpb24gYnkgdGhlIF9hbmdsZV8gcHJvcGVydHkuXG4gICAqL1xuICBkeT86IG51bWJlcjtcblxuICAvKipcbiAgICogUG9sYXIgY29vcmRpbmF0ZSByYWRpYWwgb2Zmc2V0LCBpbiBwaXhlbHMsIG9mIHRoZSB0ZXh0IGxhYmVsIGZyb20gdGhlIG9yaWdpbiBkZXRlcm1pbmVkIGJ5IHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICByYWRpdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBtYXJrIGluIHBpeGVscyAoZGVmYXVsdCAwLCBpbmRpY2F0aW5nIG5vIGxpbWl0KS4gVGhlIHRleHQgdmFsdWUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRydW5jYXRlZCBpZiB0aGUgcmVuZGVyZWQgc2l6ZSBleGNlZWRzIHRoZSBsaW1pdC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb2xhciBjb29yZGluYXRlIGFuZ2xlLCBpbiByYWRpYW5zLCBvZiB0aGUgdGV4dCBsYWJlbCBmcm9tIHRoZSBvcmlnaW4gZGV0ZXJtaW5lZCBieSB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy4gVmFsdWVzIGZvciBgdGhldGFgIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIG9mIGBhcmNgIG1hcmsgYHN0YXJ0QW5nbGVgIGFuZCBgZW5kQW5nbGVgIHByb3BlcnRpZXM6IGFuZ2xlcyBhcmUgbWVhc3VyZWQgaW4gcmFkaWFucywgd2l0aCBgMGAgaW5kaWNhdGluZyBcIm5vcnRoXCIuXG4gICAqL1xuICB0aGV0YT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGVmYWNlIHRvIHNldCB0aGUgdGV4dCBpbiAoZS5nLiwgYFwiSGVsdmV0aWNhIE5ldWVcImApLlxuICAgKi9cbiAgZm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnQgc2l6ZSwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBmb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZvbnQgc3R5bGUgKGUuZy4sIGBcIml0YWxpY1wiYCkuXG4gICAqL1xuICBmb250U3R5bGU/OiBGb250U3R5bGU7XG4gIC8qKlxuICAgKiBUaGUgZm9udCB3ZWlnaHQuXG4gICAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZyAoZS5nIGBcImJvbGRcImAsIGBcIm5vcm1hbFwiYCkgb3IgYSBudW1iZXIgKGAxMDBgLCBgMjAwYCwgYDMwMGAsIC4uLiwgYDkwMGAgd2hlcmUgYFwibm9ybWFsXCJgID0gYDQwMGAgYW5kIGBcImJvbGRcImAgPSBgNzAwYCkuXG4gICAqL1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBpZiB0aGUgYHRleHRgIGNoYW5uZWwgaXMgbm90IHNwZWNpZmllZFxuICAgKi9cbiAgdGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBVUkwgdG8gbG9hZCB1cG9uIG1vdXNlIGNsaWNrLiBJZiBkZWZpbmVkLCB0aGUgbWFyayBhY3RzIGFzIGEgaHlwZXJsaW5rLlxuICAgKlxuICAgKiBAZm9ybWF0IHVyaVxuICAgKi9cbiAgaHJlZj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vdXNlIGN1cnNvciB1c2VkIG92ZXIgdGhlIG1hcmsuIEFueSB2YWxpZCBbQ1NTIGN1cnNvciB0eXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY3Vyc29yI1ZhbHVlcykgY2FuIGJlIHVzZWQuXG4gICAqL1xuICBjdXJzb3I/OiAnYXV0bycgfCAnZGVmYXVsdCcgfCAnbm9uZScgfCAnY29udGV4dC1tZW51JyB8ICdoZWxwJyB8ICdwb2ludGVyJyB8ICdwcm9ncmVzcycgfCAnd2FpdCcgfCAnY2VsbCcgfCAnY3Jvc3NoYWlyJyB8ICd0ZXh0JyB8ICd2ZXJ0aWNhbC10ZXh0JyB8ICdhbGlhcycgfCAnY29weScgfCAnbW92ZScgfCAnbm8tZHJvcCcgfCAnbm90LWFsbG93ZWQnIHwgJ2UtcmVzaXplJyB8ICduLXJlc2l6ZScgfCAnbmUtcmVzaXplJyB8ICdudy1yZXNpemUnIHwgJ3MtcmVzaXplJyB8ICdzZS1yZXNpemUnIHwgJ3N3LXJlc2l6ZScgfCAndy1yZXNpemUnIHwgJ2V3LXJlc2l6ZScgfCAnbnMtcmVzaXplJyB8ICduZXN3LXJlc2l6ZScgfCAnbndzZS1yZXNpemUnIHwgJ2NvbC1yZXNpemUnIHwgJ3Jvdy1yZXNpemUnIHwgJ2FsbC1zY3JvbGwnIHwgJ3pvb20taW4nIHwgJ3pvb20tb3V0JyB8ICdncmFiJyB8ICdncmFiYmluZyc7XG59XG5cbmNvbnN0IFZHX01BUktfQ09ORklHX0lOREVYOiBGbGFnPGtleW9mIFZnTWFya0NvbmZpZz4gPSB7XG4gIG9wYWNpdHk6IDEsXG4gIGZpbGw6IDEsXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBzdHJva2U6IDEsXG4gIHN0cm9rZUNhcDogMSxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZURhc2g6IDEsXG4gIHN0cm9rZURhc2hPZmZzZXQ6IDEsXG4gIHNpemU6IDEsXG4gIHNoYXBlOiAxLFxuICBpbnRlcnBvbGF0ZTogMSxcbiAgdGVuc2lvbjogMSxcbiAgb3JpZW50OiAxLFxuICBhbGlnbjogMSxcbiAgYmFzZWxpbmU6IDEsXG4gIHRleHQ6IDEsXG4gIGxpbWl0OiAxLFxuICBkeDogMSxcbiAgZHk6IDEsXG4gIHJhZGl1czogMSxcbiAgdGhldGE6IDEsXG4gIGFuZ2xlOiAxLFxuICBmb250OiAxLFxuICBmb250U2l6ZTogMSxcbiAgZm9udFdlaWdodDogMSxcbiAgZm9udFN0eWxlOiAxLFxuICBjdXJzb3I6IDEsXG4gIGhyZWY6IDEsXG4gIC8vIGNvbW1lbnRlZCBiZWxvdyBhcmUgdmcgY2hhbm5lbCB0aGF0IGRvIG5vdCBoYXZlIG1hcmsgY29uZmlnLlxuICAvLyAneCd8J3gyJ3wneGMnfCd3aWR0aCd8J3knfCd5Mid8J3ljJ3wnaGVpZ2h0J1xuICAvLyBjbGlwOiAxLFxuICAvLyBkaXI6IDEsXG4gIC8vIGVsbGlwc2lzOiAxLFxuICAvLyBlbmRBbmdsZTogMSxcbiAgLy8gaW5uZXJSYWRpdXM6IDEsXG4gIC8vIG91dGVyUmFkaXVzOiAxLFxuICAvLyBwYXRoOiAxLFxuICAvLyBzdGFydEFuZ2xlOiAxLFxuICAvLyB1cmw6IDEsXG59O1xuXG5leHBvcnQgY29uc3QgVkdfTUFSS19DT05GSUdTID0gZmxhZ0tleXMoVkdfTUFSS19DT05GSUdfSU5ERVgpO1xuXG5leHBvcnQgdHlwZSBBbmNob3IgPSAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJztcblxuZXhwb3J0IGludGVyZmFjZSBWZ1RpdGxlIHtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSB0ZXh0LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIHRpdGxlIHJlbGF0aXZlIHRvIHRoZSBjaGFydC4gT25lIG9mIGBcInRvcFwiYCAodGhlIGRlZmF1bHQpLCBgXCJib3R0b21cImAsIGBcImxlZnRcImAsIG9yIGBcInJpZ2h0XCJgLlxuICAgKi9cbiAgb3JpZW50PzogVGl0bGVPcmllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgcG9zaXRpb24gZm9yIHBsYWNpbmcgdGhlIHRpdGxlLiBPbmUgb2YgYFwic3RhcnRcImAsIGBcIm1pZGRsZVwiYCAodGhlIGRlZmF1bHQpLCBvciBgXCJlbmRcImAuIEZvciBleGFtcGxlLCB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIHRvcCB0aGVzZSBhbmNob3IgcG9zaXRpb25zIG1hcCB0byBhIGxlZnQtLCBjZW50ZXItLCBvciByaWdodC1hbGlnbmVkIHRpdGxlLlxuICAgKi9cbiAgYW5jaG9yPzogQW5jaG9yO1xuXG4gIC8qKlxuICAgKiBUaGUgb3J0aG9nb25hbCBvZmZzZXQgaW4gcGl4ZWxzIGJ5IHdoaWNoIHRvIGRpc3BsYWNlIHRoZSB0aXRsZSBmcm9tIGl0cyBwb3NpdGlvbiBhbG9uZyB0aGUgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBvZmZzZXQ/OiBudW1iZXI7XG5cbiAgc3R5bGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyBUT0RPOiBuYW1lLCBlbmNvZGUsIGludGVyYWN0aXZlLCB6aW5kZXhcbn1cblxuZXhwb3J0IHR5cGUgVGl0bGVPcmllbnQgPSAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcblxuZXhwb3J0IGludGVyZmFjZSBWZ1RpdGxlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgcG9zaXRpb24gZm9yIHBsYWNpbmcgdGhlIHRpdGxlLiBPbmUgb2YgYFwic3RhcnRcImAsIGBcIm1pZGRsZVwiYCwgb3IgYFwiZW5kXCJgLiBGb3IgZXhhbXBsZSwgd2l0aCBhbiBvcmllbnRhdGlvbiBvZiB0b3AgdGhlc2UgYW5jaG9yIHBvc2l0aW9ucyBtYXAgdG8gYSBsZWZ0LSwgY2VudGVyLSwgb3IgcmlnaHQtYWxpZ25lZCB0aXRsZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcIm1pZGRsZVwiYCBmb3IgW3NpbmdsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwpIGFuZCBbbGF5ZXJlZF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sYXllci5odG1sKSB2aWV3cy5cbiAgICogYFwic3RhcnRcImAgZm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cy5cbiAgICpcbiAgICogX19Ob3RlOl9fIFtGb3Igbm93XShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI4NzUpLCBgYW5jaG9yYCBpcyBvbmx5IGN1c3RvbWl6YWJsZSBvbmx5IGZvciBbc2luZ2xlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NwZWMuaHRtbCkgYW5kIFtsYXllcmVkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2xheWVyLmh0bWwpIHZpZXdzLiAgRm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cywgYGFuY2hvcmAgaXMgYWx3YXlzIGBcInN0YXJ0XCJgLlxuICAgKi9cbiAgYW5jaG9yPzogQW5jaG9yO1xuICAvKipcbiAgICogQW5nbGUgaW4gZGVncmVlcyBvZiB0aXRsZSB0ZXh0LlxuICAgKi9cbiAgYW5nbGU/Olx0bnVtYmVyO1xuICAvKipcbiAgICogVmVydGljYWwgdGV4dCBiYXNlbGluZSBmb3IgdGl0bGUgdGV4dC5cbiAgICovXG4gIGJhc2VsaW5lPzogVmVydGljYWxBbGlnbjtcbiAgLyoqXG4gICAqIFRleHQgY29sb3IgZm9yIHRpdGxlIHRleHQuXG4gICAqL1xuICBjb2xvcj86XHRzdHJpbmc7XG4gIC8qKlxuICAgKiBGb250IG5hbWUgZm9yIHRpdGxlIHRleHQuXG4gICAqL1xuICBmb250PzpcdHN0cmluZztcbiAgLyoqXG4gICAqIEZvbnQgc2l6ZSBpbiBwaXhlbHMgZm9yIHRpdGxlIHRleHQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMTBgLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBmb250U2l6ZT86XHRudW1iZXI7XG4gIC8qKlxuICAgKiBGb250IHdlaWdodCBmb3IgdGl0bGUgdGV4dC5cbiAgICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIChlLmcgYFwiYm9sZFwiYCwgYFwibm9ybWFsXCJgKSBvciBhIG51bWJlciAoYDEwMGAsIGAyMDBgLCBgMzAwYCwgLi4uLCBgOTAwYCB3aGVyZSBgXCJub3JtYWxcImAgPSBgNDAwYCBhbmQgYFwiYm9sZFwiYCA9IGA3MDBgKS5cbiAgICovXG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggaW4gcGl4ZWxzIG9mIGxlZ2VuZCBsYWJlbHMuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGxpbWl0PzpcdG51bWJlcjtcbiAgLyoqXG4gICAqIE9mZnNldCBpbiBwaXhlbHMgb2YgdGhlIHRpdGxlIGZyb20gdGhlIGNoYXJ0IGJvZHkgYW5kIGF4ZXMuXG4gICAqL1xuICBvZmZzZXQ/Olx0bnVtYmVyO1xuICAvKipcbiAgICogRGVmYXVsdCB0aXRsZSBvcmllbnRhdGlvbiAoXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIG9yIFwicmlnaHRcIilcbiAgICovXG4gIG9yaWVudD86IFRpdGxlT3JpZW50O1xufVxuXG5leHBvcnQgdHlwZSBWZ0NvbXBhcmF0b3JPcmRlciA9ICdhc2NlbmRpbmcnIHwgJ2Rlc2NlbmRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnQ29tcGFyYXRvciB7XG4gIGZpZWxkPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIG9yZGVyPzogVmdDb21wYXJhdG9yT3JkZXIgfCBWZ0NvbXBhcmF0b3JPcmRlcltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnV2luZG93VHJhbnNmb3JtIHtcbiAgdHlwZTogJ3dpbmRvdyc7XG4gIHBhcmFtcz86IE51bWJlcltdO1xuICBhcz86IHN0cmluZ1tdO1xuICBvcHM/OiAoQWdncmVnYXRlT3AgfCBXaW5kb3dPbmx5T3ApW107XG4gIGZpZWxkcz86IHN0cmluZ1tdO1xuICBmcmFtZT86IE51bWJlcltdO1xuICBpZ25vcmVQZWVycz86IEJvb2xlYW47XG4gIGdyb3VwYnk/OiBzdHJpbmdbXTtcbiAgc29ydD86IFZnQ29tcGFyYXRvcjtcbn1cbiJdfQ== \ No newline at end of file diff --git a/build/test/axis.test.d.ts b/build/test/axis.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/axis.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/axis.test.js b/build/test/axis.test.js new file mode 100644 index 0000000000..ef884b352f --- /dev/null +++ b/build/test/axis.test.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var axis_1 = require("../src/axis"); +describe('axis', function () { + describe('VG_AXIS_PROPERTIES', function () { + it('should have scale and orient as the first two items', function () { + chai_1.assert.equal(axis_1.VG_AXIS_PROPERTIES[0], 'scale'); + chai_1.assert.equal(axis_1.VG_AXIS_PROPERTIES[1], 'orient'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9heGlzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsb0NBQStDO0FBRS9DLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDZixRQUFRLENBQUMsb0JBQW9CLEVBQUU7UUFDN0IsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELGFBQU0sQ0FBQyxLQUFLLENBQUMseUJBQWtCLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0MsYUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge1ZHX0FYSVNfUFJPUEVSVElFU30gZnJvbSAnLi4vc3JjL2F4aXMnO1xuXG5kZXNjcmliZSgnYXhpcycsICgpID0+IHtcbiAgZGVzY3JpYmUoJ1ZHX0FYSVNfUFJPUEVSVElFUycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgYW5kIG9yaWVudCBhcyB0aGUgZmlyc3QgdHdvIGl0ZW1zJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKFZHX0FYSVNfUFJPUEVSVElFU1swXSwgJ3NjYWxlJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoVkdfQVhJU19QUk9QRVJUSUVTWzFdLCAnb3JpZW50Jyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/bin.test.d.ts b/build/test/bin.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/bin.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/bin.test.js b/build/test/bin.test.js new file mode 100644 index 0000000000..1916bcc9e0 --- /dev/null +++ b/build/test/bin.test.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var bin_1 = require("../src/bin"); +var channel_1 = require("../src/channel"); +describe('autoMaxBins', function () { + it('should assign generate correct defaults for different channels', function () { + // Not testing case for 10 because it's already tested + [channel_1.COLOR, channel_1.OPACITY, channel_1.SHAPE, channel_1.ROW, channel_1.COLUMN].forEach(function (a) { return chai_1.assert.deepEqual(bin_1.autoMaxBins(a), 6); }); + }); +}); +describe('binToString', function () { + it('should generate the corrrect key for boolean', function () { + chai_1.assert.deepEqual(bin_1.binToString(true), 'bin'); + chai_1.assert.deepEqual(bin_1.binToString(false), 'bin'); + }); +}); +describe('isBinParams', function () { + it('should detect whether the input is BinParams or not', function () { + chai_1.assert.deepEqual(bin_1.isBinParams(true), false); + chai_1.assert.deepEqual(bin_1.isBinParams({}), true); + chai_1.assert.deepEqual(bin_1.isBinParams({ extent: [0, 1] }), true); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L2Jpbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLGtDQUFpRTtBQUNqRSwwQ0FBa0U7QUFFbEUsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixFQUFFLENBQUMsZ0VBQWdFLEVBQUU7UUFDbkUsc0RBQXNEO1FBQ3RELENBQUMsZUFBSyxFQUFFLGlCQUFPLEVBQUUsZUFBSyxFQUFFLGFBQUcsRUFBRSxnQkFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsYUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFuQyxDQUFtQyxDQUFDLENBQUM7SUFDM0YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1FBQ2xELGFBQU0sQ0FBQyxTQUFTLENBQUMsaUJBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxhQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQztBQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1FBQ3pELGFBQU0sQ0FBQyxTQUFTLENBQUMsaUJBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQyxhQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBVyxDQUFDLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHthdXRvTWF4QmlucywgYmluVG9TdHJpbmcsIGlzQmluUGFyYW1zfSBmcm9tICcuLi9zcmMvYmluJztcbmltcG9ydCB7Q09MT1IsIENPTFVNTiwgT1BBQ0lUWSwgUk9XLCBTSEFQRX0gZnJvbSAnLi4vc3JjL2NoYW5uZWwnO1xuXG5kZXNjcmliZSgnYXV0b01heEJpbnMnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgYXNzaWduIGdlbmVyYXRlIGNvcnJlY3QgZGVmYXVsdHMgZm9yIGRpZmZlcmVudCBjaGFubmVscycsICgpID0+IHtcbiAgICAvLyBOb3QgdGVzdGluZyBjYXNlIGZvciAxMCBiZWNhdXNlIGl0J3MgYWxyZWFkeSB0ZXN0ZWRcbiAgICBbQ09MT1IsIE9QQUNJVFksIFNIQVBFLCBST1csIENPTFVNTl0uZm9yRWFjaCgoYSkgPT4gYXNzZXJ0LmRlZXBFcXVhbChhdXRvTWF4QmlucyhhKSwgNikpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnYmluVG9TdHJpbmcnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZ2VuZXJhdGUgdGhlIGNvcnJyZWN0IGtleSBmb3IgYm9vbGVhbicsICgpID0+IHtcbiAgIGFzc2VydC5kZWVwRXF1YWwoYmluVG9TdHJpbmcodHJ1ZSksICdiaW4nKTtcbiAgIGFzc2VydC5kZWVwRXF1YWwoYmluVG9TdHJpbmcoZmFsc2UpLCAnYmluJyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdpc0JpblBhcmFtcycsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBkZXRlY3Qgd2hldGhlciB0aGUgaW5wdXQgaXMgQmluUGFyYW1zIG9yIG5vdCcsICgpID0+IHtcbiAgIGFzc2VydC5kZWVwRXF1YWwoaXNCaW5QYXJhbXModHJ1ZSksIGZhbHNlKTtcbiAgIGFzc2VydC5kZWVwRXF1YWwoaXNCaW5QYXJhbXMoe30pLCB0cnVlKTtcbiAgIGFzc2VydC5kZWVwRXF1YWwoaXNCaW5QYXJhbXMoe2V4dGVudDogWzAsMV19KSwgdHJ1ZSk7XG4gIH0pO1xufSk7XG5cbiJdfQ== \ No newline at end of file diff --git a/build/test/channel.test.d.ts b/build/test/channel.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/channel.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/channel.test.js b/build/test/channel.test.js new file mode 100644 index 0000000000..542166d21e --- /dev/null +++ b/build/test/channel.test.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var channel_1 = require("../src/channel"); +var channel_2 = require("../src/channel"); +var util_1 = require("../src/util"); +describe('channel', function () { + describe('UNIT_CHANNELS', function () { + it('should be CHANNELS without row and column', function () { + chai_1.assert.deepEqual(channel_2.UNIT_CHANNELS, util_1.without(channel_2.CHANNELS, ['row', 'column'])); + }); + }); + describe('SINGLE_DEF_CHANNELS', function () { + it('should be CHANNELS without detail and order', function () { + chai_1.assert.deepEqual(channel_1.SINGLE_DEF_CHANNELS, util_1.without(channel_2.CHANNELS, ['detail', 'order'])); + }); + }); + describe('SCALE_CHANNELS', function () { + it('should be UNIT_CHANNELS without X2, Y2, ORDER, DETAIL, TEXT, LABEL, TOOLTIP', function () { + chai_1.assert.deepEqual(channel_2.SCALE_CHANNELS, util_1.without(channel_2.UNIT_CHANNELS, ['x2', 'y2', 'latitude', 'longitude', 'latitude2', 'longitude2', 'order', 'detail', 'key', 'text', 'label', 'tooltip', 'href'])); + }); + }); + describe('NONPOSITION_SCALE_CHANNELS', function () { + it('should be SCALE_CHANNELS without x, y, x2, y2', function () { + chai_1.assert.deepEqual(channel_2.NONPOSITION_SCALE_CHANNELS, util_1.without(channel_2.SCALE_CHANNELS, ['x', 'y'])); + }); + }); + describe('isScaleChannel', function () { + it('should return true for all scale channel', function () { + for (var _i = 0, SCALE_CHANNELS_1 = channel_2.SCALE_CHANNELS; _i < SCALE_CHANNELS_1.length; _i++) { + var channel = SCALE_CHANNELS_1[_i]; + chai_1.assert(channel_1.isScaleChannel(channel)); + } + }); + }); + describe('rangeType', function () { + it('should be defined for all channels (no error).', function () { + var _loop_1 = function (c) { + chai_1.assert.doesNotThrow(function () { + channel_1.rangeType(c); + }); + }; + for (var _i = 0, CHANNELS_1 = channel_2.CHANNELS; _i < CHANNELS_1.length; _i++) { + var c = CHANNELS_1[_i]; + _loop_1(c); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9jaGFubmVsLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsMENBQThFO0FBQzlFLDBDQUFtRztBQUNuRyxvQ0FBb0M7QUFFcEMsUUFBUSxDQUFDLFNBQVMsRUFBRTtJQUNsQixRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxhQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFhLEVBQUUsY0FBTyxDQUFDLGtCQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELGFBQU0sQ0FBQyxTQUFTLENBQUMsNkJBQW1CLEVBQUUsY0FBTyxDQUFDLGtCQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLDZFQUE2RSxFQUFFO1lBQ2hGLGFBQU0sQ0FBQyxTQUFTLENBQUMsd0JBQWMsRUFBRSxjQUFPLENBQUMsdUJBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDRCQUE0QixFQUFFO1FBQ3JDLEVBQUUsQ0FBQywrQ0FBK0MsRUFBRTtZQUNsRCxhQUFNLENBQUMsU0FBUyxDQUFDLG9DQUEwQixFQUFFLGNBQU8sQ0FBQyx3QkFBYyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxLQUFzQixVQUFjLEVBQWQsbUJBQUEsd0JBQWMsRUFBZCw0QkFBYyxFQUFkLElBQWMsRUFBRTtnQkFBakMsSUFBTSxPQUFPLHVCQUFBO2dCQUNoQixhQUFNLENBQUMsd0JBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDcEIsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO29DQUN4QyxDQUFDO2dCQUNWLGFBQU0sQ0FBQyxZQUFZLENBQUM7b0JBQ2xCLG1CQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2YsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBSkQsS0FBZ0IsVUFBUSxFQUFSLGFBQUEsa0JBQVEsRUFBUixzQkFBUSxFQUFSLElBQVE7Z0JBQW5CLElBQU0sQ0FBQyxpQkFBQTt3QkFBRCxDQUFDO2FBSVg7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge2lzU2NhbGVDaGFubmVsLCByYW5nZVR5cGUsIFNJTkdMRV9ERUZfQ0hBTk5FTFN9IGZyb20gJy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7Q0hBTk5FTFMsIE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBTQ0FMRV9DSEFOTkVMUywgVU5JVF9DSEFOTkVMU30gZnJvbSAnLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0IHt3aXRob3V0fSBmcm9tICcuLi9zcmMvdXRpbCc7XG5cbmRlc2NyaWJlKCdjaGFubmVsJywgKCkgPT4ge1xuICBkZXNjcmliZSgnVU5JVF9DSEFOTkVMUycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIENIQU5ORUxTIHdpdGhvdXQgcm93IGFuZCBjb2x1bW4nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFVOSVRfQ0hBTk5FTFMsIHdpdGhvdXQoQ0hBTk5FTFMsIFsncm93JywgJ2NvbHVtbiddKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTSU5HTEVfREVGX0NIQU5ORUxTJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYmUgQ0hBTk5FTFMgd2l0aG91dCBkZXRhaWwgYW5kIG9yZGVyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChTSU5HTEVfREVGX0NIQU5ORUxTLCB3aXRob3V0KENIQU5ORUxTLCBbJ2RldGFpbCcsICdvcmRlciddKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTQ0FMRV9DSEFOTkVMUycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIFVOSVRfQ0hBTk5FTFMgd2l0aG91dCBYMiwgWTIsIE9SREVSLCBERVRBSUwsIFRFWFQsIExBQkVMLCBUT09MVElQJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChTQ0FMRV9DSEFOTkVMUywgd2l0aG91dChVTklUX0NIQU5ORUxTLCBbJ3gyJywgJ3kyJywgJ2xhdGl0dWRlJywgJ2xvbmdpdHVkZScsICdsYXRpdHVkZTInLCAnbG9uZ2l0dWRlMicsICdvcmRlcicsICdkZXRhaWwnLCAna2V5JywgJ3RleHQnLCAnbGFiZWwnLCAndG9vbHRpcCcsICdocmVmJ10pKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYmUgU0NBTEVfQ0hBTk5FTFMgd2l0aG91dCB4LCB5LCB4MiwgeTInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCB3aXRob3V0KFNDQUxFX0NIQU5ORUxTLCBbJ3gnLCAneSddKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpc1NjYWxlQ2hhbm5lbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhbGwgc2NhbGUgY2hhbm5lbCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBTQ0FMRV9DSEFOTkVMUykge1xuICAgICAgICBhc3NlcnQoaXNTY2FsZUNoYW5uZWwoY2hhbm5lbCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmFuZ2VUeXBlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYmUgZGVmaW5lZCBmb3IgYWxsIGNoYW5uZWxzIChubyBlcnJvcikuJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjIG9mIENIQU5ORUxTKSB7XG4gICAgICAgIGFzc2VydC5kb2VzTm90VGhyb3coKCkgPT4ge1xuICAgICAgICAgIHJhbmdlVHlwZShjKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/axis/assemble.test.d.ts b/build/test/compile/axis/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/axis/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/axis/assemble.test.js b/build/test/compile/axis/assemble.test.js new file mode 100644 index 0000000000..7bbfe7baea --- /dev/null +++ b/build/test/compile/axis/assemble.test.js @@ -0,0 +1,52 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/axis/assemble"); +var component_1 = require("../../../src/compile/axis/component"); +var config_1 = require("../../../src/config"); +describe('compile/axis/assemble', function () { + describe('assembleAxis()', function () { + it('outputs grid axis with only grid encode blocks', function () { + var axisCmpt = new component_1.AxisComponent({ + orient: 'left', + grid: true, + encode: { + grid: { update: { stroke: { value: 'red' } } }, + labels: { update: { fill: { value: 'red' } } } + } + }); + var axis = assemble_1.assembleAxis(axisCmpt, 'grid', config_1.defaultConfig); + chai_1.assert.isUndefined(axis.encode.labels); + }); + it('outputs grid axis with custom zindex', function () { + var axisCmpt = new component_1.AxisComponent({ + orient: 'left', + grid: true, + zindex: 3 + }); + var axis = assemble_1.assembleAxis(axisCmpt, 'grid', config_1.defaultConfig); + chai_1.assert.equal(axis.zindex, 3); + }); + it('outputs main axis without grid encode blocks', function () { + var axisCmpt = new component_1.AxisComponent({ + orient: 'left', + encode: { + grid: { update: { stroke: { value: 'red' } } }, + labels: { update: { fill: { value: 'red' } } } + } + }); + var axis = assemble_1.assembleAxis(axisCmpt, 'main', config_1.defaultConfig); + chai_1.assert.isUndefined(axis.encode.grid); + }); + it('correctly assemble title fieldDefs', function () { + var axisCmpt = new component_1.AxisComponent({ + orient: 'left', + title: [{ aggregate: 'max', field: 'a' }, { aggregate: 'min', field: 'b' }] + }); + var axis = assemble_1.assembleAxis(axisCmpt, 'main', config_1.defaultConfig); + chai_1.assert.equal(axis.title, 'Max of a, Min of b'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9heGlzL2Fzc2VtYmxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLCtEQUFnRTtBQUNoRSxpRUFBa0U7QUFDbEUsOENBQWtEO0FBSWxELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtJQUNoQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1lBQ25ELElBQU0sUUFBUSxHQUFHLElBQUkseUJBQWEsQ0FBQztnQkFDakMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsTUFBTSxFQUFFO29CQUNOLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsRUFBQyxFQUFDO29CQUN4QyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLEVBQUMsRUFBQztpQkFDekM7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFNLElBQUksR0FBRyx1QkFBWSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsc0JBQWEsQ0FBQyxDQUFDO1lBQzNELGFBQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxJQUFNLFFBQVEsR0FBRyxJQUFJLHlCQUFhLENBQUM7Z0JBQ2pDLE1BQU0sRUFBRSxNQUFNO2dCQUNkLElBQUksRUFBRSxJQUFJO2dCQUNWLE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxJQUFJLEdBQUcsdUJBQVksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLHNCQUFhLENBQUMsQ0FBQztZQUMzRCxhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsSUFBTSxRQUFRLEdBQUcsSUFBSSx5QkFBYSxDQUFDO2dCQUNqQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxFQUFDLEVBQUM7b0JBQ3hDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsRUFBQyxFQUFDO2lCQUN6QzthQUNGLENBQUMsQ0FBQztZQUNILElBQU0sSUFBSSxHQUFHLHVCQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxzQkFBYSxDQUFDLENBQUM7WUFDM0QsYUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFO1lBQ3ZDLElBQU0sUUFBUSxHQUFHLElBQUkseUJBQWEsQ0FBQztnQkFDakMsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsS0FBSyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDO2FBQ3hFLENBQUMsQ0FBQztZQUNILElBQU0sSUFBSSxHQUFHLHVCQUFZLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxzQkFBYSxDQUFDLENBQUM7WUFDM0QsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUVMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7YXNzZW1ibGVBeGlzfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL2Fzc2VtYmxlJztcbmltcG9ydCB7QXhpc0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9jb21wb25lbnQnO1xuaW1wb3J0IHtkZWZhdWx0Q29uZmlnfSBmcm9tICcuLi8uLi8uLi9zcmMvY29uZmlnJztcblxuXG5cbmRlc2NyaWJlKCdjb21waWxlL2F4aXMvYXNzZW1ibGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhc3NlbWJsZUF4aXMoKScsICgpID0+IHtcbiAgICBpdCgnb3V0cHV0cyBncmlkIGF4aXMgd2l0aCBvbmx5IGdyaWQgZW5jb2RlIGJsb2NrcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXNDbXB0ID0gbmV3IEF4aXNDb21wb25lbnQoe1xuICAgICAgICBvcmllbnQ6ICdsZWZ0JyxcbiAgICAgICAgZ3JpZDogdHJ1ZSxcbiAgICAgICAgZW5jb2RlOiB7XG4gICAgICAgICAgZ3JpZDoge3VwZGF0ZToge3N0cm9rZToge3ZhbHVlOiAncmVkJ319fSxcbiAgICAgICAgICBsYWJlbHM6IHt1cGRhdGU6IHtmaWxsOiB7dmFsdWU6ICdyZWQnfX19XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXhpcyA9IGFzc2VtYmxlQXhpcyhheGlzQ21wdCwgJ2dyaWQnLCBkZWZhdWx0Q29uZmlnKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChheGlzLmVuY29kZS5sYWJlbHMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ291dHB1dHMgZ3JpZCBheGlzIHdpdGggY3VzdG9tIHppbmRleCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXNDbXB0ID0gbmV3IEF4aXNDb21wb25lbnQoe1xuICAgICAgICBvcmllbnQ6ICdsZWZ0JyxcbiAgICAgICAgZ3JpZDogdHJ1ZSxcbiAgICAgICAgemluZGV4OiAzXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGF4aXMgPSBhc3NlbWJsZUF4aXMoYXhpc0NtcHQsICdncmlkJywgZGVmYXVsdENvbmZpZyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpcy56aW5kZXgsIDMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ291dHB1dHMgbWFpbiBheGlzIHdpdGhvdXQgZ3JpZCBlbmNvZGUgYmxvY2tzJywgKCkgPT4ge1xuICAgICAgY29uc3QgYXhpc0NtcHQgPSBuZXcgQXhpc0NvbXBvbmVudCh7XG4gICAgICAgIG9yaWVudDogJ2xlZnQnLFxuICAgICAgICBlbmNvZGU6IHtcbiAgICAgICAgICBncmlkOiB7dXBkYXRlOiB7c3Ryb2tlOiB7dmFsdWU6ICdyZWQnfX19LFxuICAgICAgICAgIGxhYmVsczoge3VwZGF0ZToge2ZpbGw6IHt2YWx1ZTogJ3JlZCd9fX1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzID0gYXNzZW1ibGVBeGlzKGF4aXNDbXB0LCAnbWFpbicsIGRlZmF1bHRDb25maWcpO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKGF4aXMuZW5jb2RlLmdyaWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBhc3NlbWJsZSB0aXRsZSBmaWVsZERlZnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBheGlzQ21wdCA9IG5ldyBBeGlzQ29tcG9uZW50KHtcbiAgICAgICAgb3JpZW50OiAnbGVmdCcsXG4gICAgICAgIHRpdGxlOiBbe2FnZ3JlZ2F0ZTogJ21heCcsIGZpZWxkOiAnYSd9LCB7YWdncmVnYXRlOiAnbWluJywgZmllbGQ6ICdiJ31dXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGF4aXMgPSBhc3NlbWJsZUF4aXMoYXhpc0NtcHQsICdtYWluJywgZGVmYXVsdENvbmZpZyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpcy50aXRsZSwgJ01heCBvZiBhLCBNaW4gb2YgYicpO1xuICAgIH0pO1xuICB9KTtcblxufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/axis/encode.test.d.ts b/build/test/compile/axis/encode.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/axis/encode.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/axis/encode.test.js b/build/test/compile/axis/encode.test.js new file mode 100644 index 0000000000..57cb1cb3e7 --- /dev/null +++ b/build/test/compile/axis/encode.test.js @@ -0,0 +1,142 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var encode = tslib_1.__importStar(require("../../../src/compile/axis/encode")); +var encode_1 = require("../../../src/compile/axis/encode"); +var util_1 = require("../../util"); +describe('compile/axis/encode', function () { + describe('encode.labels()', function () { + it('should not rotate label for temporal field by default', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal", timeUnit: "month" } + } + }); + var labels = encode.labels(model, 'x', {}, 'bottom'); + chai_1.assert.isUndefined(labels.angle); + }); + it('should do not rotate label for temporal field if labelAngle is specified in axis config', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal", timeUnit: "month" } + }, + config: { axisX: { labelAngle: 90 } } + }); + var labels = encode.labels(model, 'x', {}, 'bottom'); + chai_1.assert.isUndefined(labels.angle); + }); + it('should have correct text.signal for quarter timeUnits', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal", timeUnit: "quarter" } + } + }); + var labels = encode.labels(model, 'x', {}, 'bottom'); + var expected = "'Q' + quarter(datum.value)"; + chai_1.assert.equal(labels.text.signal, expected); + }); + it('should have correct text.signal for yearquartermonth timeUnits', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal", timeUnit: "yearquartermonth" } + } + }); + var labels = encode.labels(model, 'x', {}, 'bottom'); + var expected = "'Q' + quarter(datum.value) + ' ' + timeFormat(datum.value, '%b %Y')"; + chai_1.assert.equal(labels.text.signal, expected); + }); + }); + describe('labelAlign', function () { + describe('horizontal orients', function () { + it('360 degree check for horizonatal orients return to see if they orient properly', function () { + chai_1.assert.equal(encode_1.labelAlign(0, 'top'), 'center'); + chai_1.assert.equal(encode_1.labelAlign(15, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(30, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(45, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(60, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(75, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(90, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(105, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(120, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(135, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(150, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(165, 'top'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(180, 'top'), 'center'); + chai_1.assert.equal(encode_1.labelAlign(195, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(210, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(225, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(240, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(255, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(270, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(285, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(300, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(315, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(330, 'bottom'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(345, 'bottom'), 'right'); + }); + it('360 degree check for vertical orients return to see if they orient properly', function () { + chai_1.assert.equal(encode_1.labelAlign(0, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(15, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(30, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(45, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(60, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(75, 'left'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(90, 'left'), 'center'); + chai_1.assert.equal(encode_1.labelAlign(105, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(120, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(135, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(150, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(165, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(180, 'left'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(195, 'right'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(210, 'right'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(225, 'right'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(240, 'right'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(255, 'right'), 'right'); + chai_1.assert.equal(encode_1.labelAlign(270, 'right'), 'center'); + chai_1.assert.equal(encode_1.labelAlign(285, 'right'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(300, 'right'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(315, 'right'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(330, 'right'), 'left'); + chai_1.assert.equal(encode_1.labelAlign(345, 'right'), 'left'); + }); + }); + }); + describe('labelBaseline', function () { + it('is middle for perpendiculars horizontal orients', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(90, 'top'), { value: 'middle' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(270, 'bottom'), { value: 'middle' }); + }); + it('is top for bottom orients for 1st and 4th quadrants', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(45, 'bottom'), { value: 'top' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(180, 'top'), { value: 'top' }); + }); + it('is bottom for bottom orients for 2nd and 3rd quadrants', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(100, 'bottom'), { value: 'middle' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(260, 'bottom'), { value: 'middle' }); + }); + it('is middle for 0 and 180 horizontal orients', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(0, 'left'), { value: 'middle' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(180, 'right'), { value: 'middle' }); + }); + it('is top for bottom orients for 1st and 2nd quadrants', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(80, 'left'), { value: 'top' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(100, 'left'), { value: 'top' }); + }); + it('is bottom for bottom orients for 3rd and 4th quadrants', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(280, 'left'), { value: 'bottom' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(260, 'left'), { value: 'bottom' }); + }); + it('is bottom for bottom orients for 3rd and 4th quadrants', function () { + chai_1.assert.deepEqual(encode_1.labelBaseline(280, 'left'), { value: 'bottom' }); + chai_1.assert.deepEqual(encode_1.labelBaseline(260, 'left'), { value: 'bottom' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvYXhpcy9lbmNvZGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBRTVCLCtFQUEyRDtBQUMzRCwyREFBMkU7QUFDM0UsbUNBQW1EO0FBR25ELFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtJQUM5QixRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsRUFBRSxDQUFDLHVEQUF1RCxFQUFFO1lBQzFELElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO2dCQUNwQyxJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUM7aUJBQ3JEO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxhQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx5RkFBeUYsRUFBRTtZQUM1RixJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUNyRDtnQkFDRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxVQUFVLEVBQUUsRUFBRSxFQUFDLEVBQUM7YUFDbEMsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxhQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtZQUMxRCxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFDO2lCQUN2RDthQUNGLENBQUMsQ0FBQztZQUNILElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7WUFDOUMsYUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnRUFBZ0UsRUFBRTtZQUNuRSxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUM7aUJBQ2hFO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFNLFFBQVEsR0FBRyxxRUFBcUUsQ0FBQztZQUN2RixhQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxFQUFFO1FBQ3JCLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixFQUFFLENBQUMsZ0ZBQWdGLEVBQUU7Z0JBQ25GLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsNkVBQTZFLEVBQUU7Z0JBQ2hGLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQy9DLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2pELGFBQU0sQ0FBQyxLQUFLLENBQUMsbUJBQVUsQ0FB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LHNCQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsYUFBTSxDQUFDLFNBQVMsQ0FBQyxzQkFBYSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1lBQ2hFLGFBQU0sQ0FBQyxTQUFTLENBQUMsc0JBQWEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQgKiBhcyBlbmNvZGUgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9lbmNvZGUnO1xuaW1wb3J0IHtsYWJlbEFsaWduLCBsYWJlbEJhc2VsaW5lfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL2VuY29kZSc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi8uLi91dGlsJztcblxuXG5kZXNjcmliZSgnY29tcGlsZS9heGlzL2VuY29kZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2VuY29kZS5sYWJlbHMoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIG5vdCByb3RhdGUgbGFiZWwgZm9yIHRlbXBvcmFsIGZpZWxkIGJ5IGRlZmF1bHQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJ0ZW1wb3JhbFwiLCB0aW1lVW5pdDogXCJtb250aFwifVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxhYmVscyA9IGVuY29kZS5sYWJlbHMobW9kZWwsICd4Jywge30sICdib3R0b20nKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChsYWJlbHMuYW5nbGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkbyBub3Qgcm90YXRlIGxhYmVsIGZvciB0ZW1wb3JhbCBmaWVsZCBpZiBsYWJlbEFuZ2xlIGlzIHNwZWNpZmllZCBpbiBheGlzIGNvbmZpZycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6IFwiYVwiLCB0eXBlOiBcInRlbXBvcmFsXCIsIHRpbWVVbml0OiBcIm1vbnRoXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbmZpZzoge2F4aXNYOiB7bGFiZWxBbmdsZTogOTB9fVxuICAgICAgfSk7XG4gICAgICBjb25zdCBsYWJlbHMgPSBlbmNvZGUubGFiZWxzKG1vZGVsLCAneCcsIHt9LCAnYm90dG9tJyk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQobGFiZWxzLmFuZ2xlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHRleHQuc2lnbmFsIGZvciBxdWFydGVyIHRpbWVVbml0cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJ0ZW1wb3JhbFwiLCB0aW1lVW5pdDogXCJxdWFydGVyXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGFiZWxzID0gZW5jb2RlLmxhYmVscyhtb2RlbCwgJ3gnLCB7fSwgJ2JvdHRvbScpO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBcIidRJyArIHF1YXJ0ZXIoZGF0dW0udmFsdWUpXCI7XG4gICAgICBhc3NlcnQuZXF1YWwobGFiZWxzLnRleHQuc2lnbmFsLCBleHBlY3RlZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCB0ZXh0LnNpZ25hbCBmb3IgeWVhcnF1YXJ0ZXJtb250aCB0aW1lVW5pdHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwidGVtcG9yYWxcIiwgdGltZVVuaXQ6IFwieWVhcnF1YXJ0ZXJtb250aFwifVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxhYmVscyA9IGVuY29kZS5sYWJlbHMobW9kZWwsICd4Jywge30sICdib3R0b20nKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkID0gXCInUScgKyBxdWFydGVyKGRhdHVtLnZhbHVlKSArICcgJyArIHRpbWVGb3JtYXQoZGF0dW0udmFsdWUsICclYiAlWScpXCI7XG4gICAgICBhc3NlcnQuZXF1YWwobGFiZWxzLnRleHQuc2lnbmFsLCBleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbEFsaWduJywgKCkgPT4ge1xuICAgIGRlc2NyaWJlKCdob3Jpem9udGFsIG9yaWVudHMnLCAoKSA9PiB7XG4gICAgICBpdCgnMzYwIGRlZ3JlZSBjaGVjayBmb3IgaG9yaXpvbmF0YWwgb3JpZW50cyByZXR1cm4gdG8gc2VlIGlmIHRoZXkgb3JpZW50IHByb3Blcmx5JywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigwLCAndG9wJyksICdjZW50ZXInKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTUsICd0b3AnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDMwLCAndG9wJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbig0NSwgJ3RvcCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oNjAsICd0b3AnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDc1LCAndG9wJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbig5MCwgJ3RvcCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTA1LCAndG9wJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigxMjAsICd0b3AnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDEzNSwgJ3RvcCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTUwLCAndG9wJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigxNjUsICd0b3AnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDE4MCwgJ3RvcCcpLCAnY2VudGVyJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDE5NSwgJ2JvdHRvbScpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMjEwLCAnYm90dG9tJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigyMjUsICdib3R0b20nKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDI0MCwgJ2JvdHRvbScpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMjU1LCAnYm90dG9tJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigyNzAsICdib3R0b20nKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDI4NSwgJ2JvdHRvbScpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMzAwLCAnYm90dG9tJyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzMTUsICdib3R0b20nKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDMzMCwgJ2JvdHRvbScpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMzQ1LCAnYm90dG9tJyksICdyaWdodCcpO1xuICAgICAgfSk7XG4gICAgICBpdCgnMzYwIGRlZ3JlZSBjaGVjayBmb3IgdmVydGljYWwgb3JpZW50cyByZXR1cm4gdG8gc2VlIGlmIHRoZXkgb3JpZW50IHByb3Blcmx5JywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigwLCAnbGVmdCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTUsICdsZWZ0JyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzMCwgJ2xlZnQnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDQ1LCAnbGVmdCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oNjAsICdsZWZ0JyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbig3NSwgJ2xlZnQnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDkwLCAnbGVmdCcpLCAnY2VudGVyJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDEwNSwgJ2xlZnQnKSwgJ2xlZnQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTIwLCAnbGVmdCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigxMzUsICdsZWZ0JyksICdsZWZ0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDE1MCwgJ2xlZnQnKSwgJ2xlZnQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMTY1LCAnbGVmdCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigxODAsICdsZWZ0JyksICdsZWZ0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDE5NSwgJ3JpZ2h0JyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigyMTAsICdyaWdodCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMjI1LCAncmlnaHQnKSwgJ3JpZ2h0Jyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsYWJlbEFsaWduKDI0MCwgJ3JpZ2h0JyksICdyaWdodCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigyNTUsICdyaWdodCcpLCAncmlnaHQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxhYmVsQWxpZ24oMjcwLCAncmlnaHQnKSwgJ2NlbnRlcicpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigyODUsICdyaWdodCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzMDAsICdyaWdodCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzMTUsICdyaWdodCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzMzAsICdyaWdodCcpLCAnbGVmdCcpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobGFiZWxBbGlnbigzNDUsICdyaWdodCcpLCAnbGVmdCcpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdsYWJlbEJhc2VsaW5lJywgKCkgPT4ge1xuICAgIGl0KCdpcyBtaWRkbGUgZm9yIHBlcnBlbmRpY3VsYXJzIGhvcml6b250YWwgb3JpZW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSg5MCwgJ3RvcCcpLCB7dmFsdWU6ICdtaWRkbGUnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoMjcwLCAnYm90dG9tJyksIHt2YWx1ZTogJ21pZGRsZSd9KTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ2lzIHRvcCBmb3IgYm90dG9tIG9yaWVudHMgZm9yIDFzdCBhbmQgNHRoIHF1YWRyYW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSg0NSwgJ2JvdHRvbScpLCB7dmFsdWU6ICd0b3AnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoMTgwLCAndG9wJyksIHt2YWx1ZTogJ3RvcCd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdpcyBib3R0b20gZm9yIGJvdHRvbSBvcmllbnRzIGZvciAybmQgYW5kIDNyZCBxdWFkcmFudHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoMTAwLCAnYm90dG9tJyksIHt2YWx1ZTogJ21pZGRsZSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSgyNjAsICdib3R0b20nKSwge3ZhbHVlOiAnbWlkZGxlJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIG1pZGRsZSBmb3IgMCBhbmQgMTgwIGhvcml6b250YWwgb3JpZW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSgwLCAnbGVmdCcpLCB7dmFsdWU6ICdtaWRkbGUnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoMTgwLCAncmlnaHQnKSwge3ZhbHVlOiAnbWlkZGxlJ30pO1xuICAgIH0pO1xuXG5cbiAgICBpdCgnaXMgdG9wIGZvciBib3R0b20gb3JpZW50cyBmb3IgMXN0IGFuZCAybmQgcXVhZHJhbnRzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChsYWJlbEJhc2VsaW5lKDgwLCAnbGVmdCcpLCB7dmFsdWU6ICd0b3AnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoMTAwLCAnbGVmdCcpLCB7dmFsdWU6ICd0b3AnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaXMgYm90dG9tIGZvciBib3R0b20gb3JpZW50cyBmb3IgM3JkIGFuZCA0dGggcXVhZHJhbnRzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChsYWJlbEJhc2VsaW5lKDI4MCwgJ2xlZnQnKSwge3ZhbHVlOiAnYm90dG9tJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChsYWJlbEJhc2VsaW5lKDI2MCwgJ2xlZnQnKSwge3ZhbHVlOiAnYm90dG9tJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2lzIGJvdHRvbSBmb3IgYm90dG9tIG9yaWVudHMgZm9yIDNyZCBhbmQgNHRoIHF1YWRyYW50cycsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSgyODAsICdsZWZ0JyksIHt2YWx1ZTogJ2JvdHRvbSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSgyNjAsICdsZWZ0JyksIHt2YWx1ZTogJ2JvdHRvbSd9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/axis/parse.test.d.ts b/build/test/compile/axis/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/axis/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/axis/parse.test.js b/build/test/compile/axis/parse.test.js new file mode 100644 index 0000000000..ebf9e72499 --- /dev/null +++ b/build/test/compile/axis/parse.test.js @@ -0,0 +1,306 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var parse_1 = require("../../../src/compile/axis/parse"); +var util_1 = require("../../util"); +describe('Axis', function () { + // TODO: move this to model.test.ts + describe('= true', function () { + it('should produce default properties for axis', function () { + var model1 = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" } + }, + "data": { "url": "data/movies.json" } + }); + var model2 = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" } + }, + "data": { "url": "data/movies.json" } + }); + chai_1.assert.deepEqual(model1.axis(channel_1.Y), model2.axis(channel_1.Y)); + }); + }); + describe('parseUnitAxis', function () { + it('should produce Vega grid', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative", + axis: { grid: true, gridColor: "blue", gridWidth: 20 } + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.grid, true); + }); + it('should produce Vega grid when axis config is specified.', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative" + } + }, + "config": { "axisX": { "grid": true } } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].implicit.grid, true); + }); + it('should produce axis component with grid=false', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative", + axis: { grid: false, gridColor: "blue", gridWidth: 20 } + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.grid, false); + }); + it('should ignore null scales', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + longitude: { + field: "a", + type: "quantitative" + }, + latitude: { + field: "b", + type: "quantitative" + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.isUndefined(axisComponent['x']); + chai_1.assert.isUndefined(axisComponent['y']); + }); + it('should produce Vega grid axis = undefined axis if grid is disabled via config.axisX', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative" + } + }, + config: { axisX: { grid: false } } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.grid, undefined); + }); + it('should produce Vega grid axis = undefined axis if grid is disabled via config.axis', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative" + } + }, + config: { axis: { grid: false } } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.grid, undefined); + }); + it('should store the title value if title = null, "", or false', function () { + for (var _i = 0, _a = [null, '', false]; _i < _a.length; _i++) { + var val = _a[_i]; + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative", + axis: { title: val } // Need to cast as false is not valid, but we want to fall back gracefully + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.title, val); + } + }); + it('should store the fieldDef title value if title = null, "", or false', function () { + for (var _i = 0, _a = [null, '', false]; _i < _a.length; _i++) { + var val = _a[_i]; + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative", + title: val // Need to cast as false is not valid, but we want to fall back gracefully + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.title, val); + } + }); + it('should store fieldDef.title as explicit', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { + field: "a", + type: "quantitative", + title: 'foo' + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.title, 'foo'); + }); + it('should merge title of fieldDef and fieldDef2', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "bar", + encoding: { + x: { + field: "a", + type: "quantitative", + title: 'foo' + }, + x2: { + field: "b", + type: "quantitative", + title: 'bar' + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.title, 'foo, bar'); + }); + it('should use title of fieldDef2', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "bar", + encoding: { + x: { + field: "a", + type: "quantitative" + }, + x2: { + field: "b", + type: "quantitative", + title: 'bar' + } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.equal(axisComponent['x'][0].explicit.title, 'bar'); + }); + it('should store both x and x2 for ranged mark', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "rule", + encoding: { + x: { field: "a", type: "quantitative" }, + x2: { field: "a2", type: "quantitative" } + } + }); + var axisComponent = parse_1.parseUnitAxis(model); + chai_1.assert.equal(axisComponent['x'].length, 1); + chai_1.assert.deepEqual(axisComponent['x'][0].get('title'), [{ field: "a" }, { field: "a2" }]); + }); + }); + describe('parseLayerAxis', function () { + var globalRuleOverlay = util_1.parseLayerModel({ + "layer": [ + { + "mark": "rule", + "encoding": { + "y": { + "aggregate": "mean", + "field": "a", + "type": "quantitative" + } + } + }, + { + "mark": "line", + "encoding": { + "y": { + "aggregate": "mean", + "field": "a", + "type": "quantitative" + }, + "x": { + "timeUnit": "month", + "type": "temporal", + "field": "date" + } + } + } + ] + }); + globalRuleOverlay.parseScale(); + globalRuleOverlay.parseLayoutSize(); + parse_1.parseLayerAxis(globalRuleOverlay); + it('correctly merges gridScale if one layer does not have one of the axis', function () { + var axisComponents = globalRuleOverlay.component.axes; + chai_1.assert.equal(axisComponents.y.length, 1); + chai_1.assert.equal(axisComponents.y[0].get('gridScale'), 'x'); + }); + it('correctly merges similar title', function () { + var axisComponents = globalRuleOverlay.component.axes; + chai_1.assert.deepEqual(axisComponents.y[0].get('title'), [{ aggregate: 'mean', field: 'a' }]); + }); + it('correctly combines different title', function () { + var model = util_1.parseLayerModel({ + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "data": { "url": "data/cars.json" }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "Cylinders", "type": "ordinal" }, + "y": { + "aggregate": "max", + "field": "Horsepower", + "type": "quantitative" + }, + "color": { "value": "darkred" } + } + }, + { + "data": { "url": "data/cars.json" }, + "mark": "line", + "encoding": { + "x": { "field": "Cylinders", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "Horsepower", + "type": "quantitative" + } + } + } + ] + }); + model.parseScale(); + parse_1.parseLayerAxis(model); + var axisComponents = model.component.axes; + chai_1.assert.deepEqual(axisComponents.y[0].get('title'), [{ aggregate: 'max', field: 'Horsepower' }, { aggregate: 'min', field: 'Horsepower' }]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9heGlzL3BhcnNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLGdEQUF1QztBQUN2Qyx5REFBOEU7QUFDOUUsbUNBQW9FO0FBRXBFLFFBQVEsQ0FBQyxNQUFNLEVBQUU7SUFDZixtQ0FBbUM7SUFDbkMsUUFBUSxDQUFDLFFBQVEsRUFBRTtRQUNqQixFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsSUFBTSxNQUFNLEdBQUcsOEJBQXVCLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBQztpQkFDdkU7Z0JBQ0QsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDO2FBQ3BDLENBQUMsQ0FBQztZQUVILElBQU0sTUFBTSxHQUFHLDhCQUF1QixDQUFDO2dCQUNyQyxNQUFNLEVBQUUsS0FBSztnQkFDYixVQUFVLEVBQUU7b0JBQ1YsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUM7aUJBQ3ZFO2dCQUNELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBQzthQUNwQyxDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLEVB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QyxPQUFPLENBQUMsRUFDaEMsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FDbkYsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge1l9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7cGFyc2VMYXllckF4aXMsIHBhcnNlVW5pdEF4aXN9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2F4aXMvcGFyc2UnO1xuaW1wb3J0IHtwYXJzZUxheWVyTW9kZWwsIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ0F4aXMnLCBmdW5jdGlvbigpIHtcbiAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIG1vZGVsLnRlc3QudHNcbiAgZGVzY3JpYmUoJz0gdHJ1ZScsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIGF4aXMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsMSA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ1VTX0dyb3NzJywgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvbW92aWVzLmpzb25cIn1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBtb2RlbDIgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInlcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6ICdVU19Hcm9zcycsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL21vdmllcy5qc29uXCJ9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwxLmF4aXMoWSksIG1vZGVsMi5heGlzKFkpKTtcbiAgICB9KTtcbiAgfSk7XG4gIGRlc2NyaWJlKCdwYXJzZVVuaXRBeGlzJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIFZlZ2EgZ3JpZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgYXhpczoge2dyaWQ6IHRydWUsIGdyaWRDb2xvcjogXCJibHVlXCIsIGdyaWRXaWR0aDogMjB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGF4aXNDb21wb25lbnQgPSBwYXJzZVVuaXRBeGlzKG1vZGVsKTtcbiAgICAgIGFzc2VydC5lcXVhbChheGlzQ29tcG9uZW50Wyd4J10ubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5lcXVhbChheGlzQ29tcG9uZW50Wyd4J11bMF0uZXhwbGljaXQuZ3JpZCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgVmVnYSBncmlkIHdoZW4gYXhpcyBjb25maWcgaXMgc3BlY2lmaWVkLicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImNvbmZpZ1wiOiB7XCJheGlzWFwiOiB7XCJncmlkXCI6IHRydWV9fVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50ID0gcGFyc2VVbml0QXhpcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmltcGxpY2l0LmdyaWQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGF4aXMgY29tcG9uZW50IHdpdGggZ3JpZD1mYWxzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgYXhpczoge2dyaWQ6IGZhbHNlLCBncmlkQ29sb3I6IFwiYmx1ZVwiLCBncmlkV2lkdGg6IDIwfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50ID0gcGFyc2VVbml0QXhpcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmV4cGxpY2l0LmdyaWQsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaWdub3JlIG51bGwgc2NhbGVzJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIGxvbmdpdHVkZToge1xuICAgICAgICAgICAgZmllbGQ6IFwiYVwiLFxuICAgICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGF0aXR1ZGU6IHtcbiAgICAgICAgICAgIGZpZWxkOiBcImJcIixcbiAgICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXhpc0NvbXBvbmVudCA9IHBhcnNlVW5pdEF4aXMobW9kZWwpO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKGF4aXNDb21wb25lbnRbJ3gnXSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQoYXhpc0NvbXBvbmVudFsneSddKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBWZWdhIGdyaWQgYXhpcyA9IHVuZGVmaW5lZCBheGlzIGlmIGdyaWQgaXMgZGlzYWJsZWQgdmlhIGNvbmZpZy5heGlzWCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWc6IHtheGlzWDoge2dyaWQ6IGZhbHNlfX1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXhpc0NvbXBvbmVudCA9IHBhcnNlVW5pdEF4aXMobW9kZWwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXVswXS5leHBsaWNpdC5ncmlkLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgVmVnYSBncmlkIGF4aXMgPSB1bmRlZmluZWQgYXhpcyBpZiBncmlkIGlzIGRpc2FibGVkIHZpYSBjb25maWcuYXhpcycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWc6IHtheGlzOiB7Z3JpZDogZmFsc2V9fVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50ID0gcGFyc2VVbml0QXhpcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmV4cGxpY2l0LmdyaWQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN0b3JlIHRoZSB0aXRsZSB2YWx1ZSBpZiB0aXRsZSA9IG51bGwsIFwiXCIsIG9yIGZhbHNlJywgZnVuY3Rpb24gKCkge1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgW251bGwsICcnLCBmYWxzZV0pIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBcImFcIixcbiAgICAgICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgYXhpczoge3RpdGxlOiB2YWwgYXMgYW55fSAvLyBOZWVkIHRvIGNhc3QgYXMgZmFsc2UgaXMgbm90IHZhbGlkLCBidXQgd2Ugd2FudCB0byBmYWxsIGJhY2sgZ3JhY2VmdWxseVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGF4aXNDb21wb25lbnQgPSBwYXJzZVVuaXRBeGlzKG1vZGVsKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXS5sZW5ndGgsIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmV4cGxpY2l0LnRpdGxlLCB2YWwgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RvcmUgdGhlIGZpZWxkRGVmIHRpdGxlIHZhbHVlIGlmIHRpdGxlID0gbnVsbCwgXCJcIiwgb3IgZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiBbbnVsbCwgJycsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgZmllbGQ6IFwiYVwiLFxuICAgICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICB0aXRsZTogdmFsIGFzIGFueSAvLyBOZWVkIHRvIGNhc3QgYXMgZmFsc2UgaXMgbm90IHZhbGlkLCBidXQgd2Ugd2FudCB0byBmYWxsIGJhY2sgZ3JhY2VmdWxseVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGF4aXNDb21wb25lbnQgPSBwYXJzZVVuaXRBeGlzKG1vZGVsKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXS5sZW5ndGgsIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmV4cGxpY2l0LnRpdGxlLCB2YWwgYXMgYW55KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc3RvcmUgZmllbGREZWYudGl0bGUgYXMgZXhwbGljaXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgIGZpZWxkOiBcImFcIixcbiAgICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICB0aXRsZTogJ2ZvbydcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXhpc0NvbXBvbmVudCA9IHBhcnNlVW5pdEF4aXMobW9kZWwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXVswXS5leHBsaWNpdC50aXRsZSwgJ2ZvbycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZXJnZSB0aXRsZSBvZiBmaWVsZERlZiBhbmQgZmllbGREZWYyJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwiYmFyXCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge1xuICAgICAgICAgICAgZmllbGQ6IFwiYVwiLFxuICAgICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIHRpdGxlOiAnZm9vJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeDI6IHtcbiAgICAgICAgICAgIGZpZWxkOiBcImJcIixcbiAgICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICB0aXRsZTogJ2JhcidcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYXhpc0NvbXBvbmVudCA9IHBhcnNlVW5pdEF4aXMobW9kZWwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXVswXS5leHBsaWNpdC50aXRsZSwgJ2ZvbywgYmFyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB0aXRsZSBvZiBmaWVsZERlZjInLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJiYXJcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7XG4gICAgICAgICAgICBmaWVsZDogXCJhXCIsXG4gICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB4Mjoge1xuICAgICAgICAgICAgZmllbGQ6IFwiYlwiLFxuICAgICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIHRpdGxlOiAnYmFyJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50ID0gcGFyc2VVbml0QXhpcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddWzBdLmV4cGxpY2l0LnRpdGxlLCAnYmFyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN0b3JlIGJvdGggeCBhbmQgeDIgZm9yIHJhbmdlZCBtYXJrJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicnVsZVwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIHgyOiB7ZmllbGQ6IFwiYTJcIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50ID0gcGFyc2VVbml0QXhpcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudFsneCddLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGF4aXNDb21wb25lbnRbJ3gnXVswXS5nZXQoJ3RpdGxlJyksIFt7ZmllbGQ6IFwiYVwifSwge2ZpZWxkOiBcImEyXCJ9XSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUxheWVyQXhpcycsICgpID0+IHtcbiAgICBjb25zdCBnbG9iYWxSdWxlT3ZlcmxheSA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICBcImxheWVyXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLFxuICAgICAgICAgICAgICBcImZpZWxkXCI6IFwiYVwiLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibWFya1wiOiBcImxpbmVcIixcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLFxuICAgICAgICAgICAgICBcImZpZWxkXCI6IFwiYVwiLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgIFwidGltZVVuaXRcIjogXCJtb250aFwiLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJ0ZW1wb3JhbFwiLFxuICAgICAgICAgICAgICBcImZpZWxkXCI6IFwiZGF0ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gICAgZ2xvYmFsUnVsZU92ZXJsYXkucGFyc2VTY2FsZSgpO1xuICAgIGdsb2JhbFJ1bGVPdmVybGF5LnBhcnNlTGF5b3V0U2l6ZSgpO1xuICAgIHBhcnNlTGF5ZXJBeGlzKGdsb2JhbFJ1bGVPdmVybGF5KTtcblxuXG4gICAgaXQoJ2NvcnJlY3RseSBtZXJnZXMgZ3JpZFNjYWxlIGlmIG9uZSBsYXllciBkb2VzIG5vdCBoYXZlIG9uZSBvZiB0aGUgYXhpcycsICgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXNDb21wb25lbnRzID0gZ2xvYmFsUnVsZU92ZXJsYXkuY29tcG9uZW50LmF4ZXM7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc0NvbXBvbmVudHMueS5sZW5ndGgsIDEpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNDb21wb25lbnRzLnlbMF0uZ2V0KCdncmlkU2NhbGUnKSwgJ3gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgbWVyZ2VzIHNpbWlsYXIgdGl0bGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBheGlzQ29tcG9uZW50cyA9IGdsb2JhbFJ1bGVPdmVybGF5LmNvbXBvbmVudC5heGVzO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChheGlzQ29tcG9uZW50cy55WzBdLmdldCgndGl0bGUnKSwgW3thZ2dyZWdhdGU6ICdtZWFuJywgZmllbGQ6ICdhJ31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgY29tYmluZXMgZGlmZmVyZW50IHRpdGxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBcIiRzY2hlbWFcIjogXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuanNvblwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9jYXJzLmpzb25cIn0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImxpbmVcIixcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJDeWxpbmRlcnNcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwiZGFya3JlZFwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkN5bGluZGVyc1wiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICAgICAgcGFyc2VMYXllckF4aXMobW9kZWwpO1xuICAgICAgY29uc3QgYXhpc0NvbXBvbmVudHMgPSBtb2RlbC5jb21wb25lbnQuYXhlcztcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgYXhpc0NvbXBvbmVudHMueVswXS5nZXQoJ3RpdGxlJyksXG4gICAgICAgIFt7YWdncmVnYXRlOiAnbWF4JywgZmllbGQ6ICdIb3JzZXBvd2VyJ30sIHthZ2dyZWdhdGU6ICdtaW4nLCBmaWVsZDogJ0hvcnNlcG93ZXInfV1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/axis/properties.test.d.ts b/build/test/compile/axis/properties.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/axis/properties.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/axis/properties.test.js b/build/test/compile/axis/properties.test.js new file mode 100644 index 0000000000..260b630e16 --- /dev/null +++ b/build/test/compile/axis/properties.test.js @@ -0,0 +1,105 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var properties = tslib_1.__importStar(require("../../../src/compile/axis/properties")); +var util_1 = require("../../util"); +describe('compile/axis', function () { + describe('grid()', function () { + it('should return true by default for continuous scale that is not binned', function () { + var grid = properties.grid('linear', { field: 'a', type: 'quantitative' }); + chai_1.assert.deepEqual(grid, true); + }); + it('should return false by default for binned field', function () { + var grid = properties.grid('linear', { bin: true, field: 'a', type: 'quantitative' }); + chai_1.assert.deepEqual(grid, false); + }); + it('should return false by default for a discrete scale', function () { + var grid = properties.grid('point', { field: 'a', type: 'quantitative' }); + chai_1.assert.deepEqual(grid, false); + }); + }); + describe('orient()', function () { + it('should return bottom for x by default', function () { + var orient = properties.orient('x'); + chai_1.assert.deepEqual(orient, 'bottom'); + }); + it('should return left for y by default', function () { + var orient = properties.orient('y'); + chai_1.assert.deepEqual(orient, 'left'); + }); + }); + describe('tickCount', function () { + it('should return undefined by default for a binned field', function () { + var tickCount = properties.tickCount('x', { bin: { maxbins: 10 }, field: 'a', type: 'quantitative' }, 'linear', { signal: 'a' }); + chai_1.assert.deepEqual(tickCount, { signal: 'ceil(a/20)' }); + }); + var _loop_1 = function (timeUnit) { + it("should return undefined by default for a temporal field with timeUnit=" + timeUnit, function () { + var tickCount = properties.tickCount('x', { timeUnit: timeUnit, field: 'a', type: 'temporal' }, 'linear', { signal: 'a' }); + chai_1.assert.isUndefined(tickCount); + }); + }; + for (var _i = 0, _a = ['month', 'hours', 'day', 'quarter']; _i < _a.length; _i++) { + var timeUnit = _a[_i]; + _loop_1(timeUnit); + } + it('should return size/40 by default for linear scale', function () { + var tickCount = properties.tickCount('x', { field: 'a', type: 'quantitative' }, 'linear', { signal: 'a' }); + chai_1.assert.deepEqual(tickCount, { signal: 'ceil(a/40)' }); + }); + it('should return undefined by default for log scale', function () { + var tickCount = properties.tickCount('x', { field: 'a', type: 'quantitative' }, 'log', undefined); + chai_1.assert.deepEqual(tickCount, undefined); + }); + it('should return undefined by default for point scale', function () { + var tickCount = properties.tickCount('x', { field: 'a', type: 'quantitative' }, 'point', undefined); + chai_1.assert.deepEqual(tickCount, undefined); + }); + }); + describe('title()', function () { + it('should add return fieldTitle by default', function () { + var title = properties.title(3, { field: 'a', type: "quantitative" }, {}); + chai_1.assert.deepEqual(title, 'a'); + }); + it('should add return fieldTitle by default', function () { + var title = properties.title(10, { aggregate: 'sum', field: 'a', type: "quantitative" }, {}); + chai_1.assert.deepEqual(title, 'Sum of a'); + }); + it('should add return fieldTitle by default and truncate', function () { + var title = properties.title(3, { aggregate: 'sum', field: 'a', type: "quantitative" }, {}); + chai_1.assert.deepEqual(title, 'Su…'); + }); + }); + describe('values', function () { + it('should return correct timestamp values for DateTimes', function () { + var values = properties.values({ values: [{ year: 1970 }, { year: 1980 }] }, null, null, "x"); + chai_1.assert.deepEqual(values, [ + { "signal": "datetime(1970, 0, 1, 0, 0, 0, 0)" }, + { "signal": "datetime(1980, 0, 1, 0, 0, 0, 0)" } + ]); + }); + it('should simply return values for non-DateTime', function () { + var values = properties.values({ values: [1, 2, 3, 4] }, null, null, "x"); + chai_1.assert.deepEqual(values, [1, 2, 3, 4]); + }); + it('should simply drop values when domain is specified', function () { + var model1 = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "y": { + "type": "quantitative", + "field": 'US_Gross', + "scale": { "domain": [-1, 2] }, + "bin": { "extent": [0, 1] } + } + }, + "data": { "url": "data/movies.json" } + }); + var values = properties.values({}, model1, model1.fieldDef("y"), "y"); + chai_1.assert.deepEqual(values, undefined); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL2F4aXMvcHJvcGVydGllcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsdUZBQW1FO0FBRW5FLG1DQUFtRDtBQUVuRCxRQUFRLENBQUMsY0FBYyxFQUFFO0lBQ3ZCLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDakIsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1lBQzFFLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQztZQUMzRSxhQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpREFBaUQsRUFBRTtZQUNwRCxJQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsQ0FBQztZQUN0RixhQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRTtZQUN4RCxJQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLENBQUM7WUFDMUUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMs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QUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUV4RSxhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0ICogYXMgcHJvcGVydGllcyBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtUaW1lVW5pdH0gZnJvbSAnLi4vLi4vLi4vc3JjL3RpbWV1bml0JztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9heGlzJywgKCk9PiB7XG4gIGRlc2NyaWJlKCdncmlkKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBieSBkZWZhdWx0IGZvciBjb250aW51b3VzIHNjYWxlIHRoYXQgaXMgbm90IGJpbm5lZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGdyaWQgPSBwcm9wZXJ0aWVzLmdyaWQoJ2xpbmVhcicsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChncmlkLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQgZm9yIGJpbm5lZCBmaWVsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGdyaWQgPSBwcm9wZXJ0aWVzLmdyaWQoJ2xpbmVhcicsIHtiaW46IHRydWUsIGZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGdyaWQsIGZhbHNlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGJ5IGRlZmF1bHQgZm9yIGEgZGlzY3JldGUgc2NhbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBncmlkID0gcHJvcGVydGllcy5ncmlkKCdwb2ludCcsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChncmlkLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdvcmllbnQoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBib3R0b20gZm9yIHggYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG9yaWVudCA9IHByb3BlcnRpZXMub3JpZW50KCd4Jyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG9yaWVudCwgJ2JvdHRvbScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbGVmdCBmb3IgeSBieSBkZWZhdWx0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgb3JpZW50ID0gcHJvcGVydGllcy5vcmllbnQoJ3knKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwob3JpZW50LCAnbGVmdCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndGlja0NvdW50JywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIGEgYmlubmVkIGZpZWxkJywgKCkgPT4ge1xuICAgICAgY29uc3QgdGlja0NvdW50ID0gcHJvcGVydGllcy50aWNrQ291bnQoJ3gnLCB7YmluOiB7bWF4YmluczogMTB9LCBmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sICdsaW5lYXInLCB7c2lnbmFsIDogJ2EnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHRpY2tDb3VudCwge3NpZ25hbDogJ2NlaWwoYS8yMCknfSk7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHRpbWVVbml0IG9mIFsnbW9udGgnLCAnaG91cnMnLCAnZGF5JywgJ3F1YXJ0ZXInXSBhcyBUaW1lVW5pdFtdKSB7XG4gICAgICAgIGl0KGBzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhIHRlbXBvcmFsIGZpZWxkIHdpdGggdGltZVVuaXQ9JHt0aW1lVW5pdH1gLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGlja0NvdW50ID0gcHJvcGVydGllcy50aWNrQ291bnQoJ3gnLCB7dGltZVVuaXQsIGZpZWxkOiAnYScsIHR5cGU6ICd0ZW1wb3JhbCd9LCAnbGluZWFyJywge3NpZ25hbCA6ICdhJ30pO1xuICAgICAgICAgIGFzc2VydC5pc1VuZGVmaW5lZCh0aWNrQ291bnQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzaXplLzQwIGJ5IGRlZmF1bHQgZm9yIGxpbmVhciBzY2FsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRpY2tDb3VudCA9IHByb3BlcnRpZXMudGlja0NvdW50KCd4Jywge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgJ2xpbmVhcicsIHtzaWduYWwgOiAnYSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodGlja0NvdW50LCB7c2lnbmFsOiAnY2VpbChhLzQwKSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBieSBkZWZhdWx0IGZvciBsb2cgc2NhbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0aWNrQ291bnQgPSBwcm9wZXJ0aWVzLnRpY2tDb3VudCgneCcsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sICdsb2cnLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0aWNrQ291bnQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgYnkgZGVmYXVsdCBmb3IgcG9pbnQgc2NhbGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0aWNrQ291bnQgPSBwcm9wZXJ0aWVzLnRpY2tDb3VudCgneCcsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sICdwb2ludCcsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHRpY2tDb3VudCwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RpdGxlKCknLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgcmV0dXJuIGZpZWxkVGl0bGUgYnkgZGVmYXVsdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRpdGxlID0gcHJvcGVydGllcy50aXRsZSgzLCB7ZmllbGQ6ICdhJywgdHlwZTogXCJxdWFudGl0YXRpdmVcIn0sIHt9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodGl0bGUsICdhJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCByZXR1cm4gZmllbGRUaXRsZSBieSBkZWZhdWx0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdGl0bGUgPSBwcm9wZXJ0aWVzLnRpdGxlKDEwLCB7YWdncmVnYXRlOiAnc3VtJywgZmllbGQ6ICdhJywgdHlwZTogXCJxdWFudGl0YXRpdmVcIn0sIHt9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodGl0bGUsICdTdW0gb2YgYScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgcmV0dXJuIGZpZWxkVGl0bGUgYnkgZGVmYXVsdCBhbmQgdHJ1bmNhdGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0aXRsZSA9IHByb3BlcnRpZXMudGl0bGUoMywge2FnZ3JlZ2F0ZTogJ3N1bScsIGZpZWxkOiAnYScsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LCB7fSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHRpdGxlLCAnU3XigKYnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZhbHVlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRpbWVzdGFtcCB2YWx1ZXMgZm9yIERhdGVUaW1lcycsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BlcnRpZXMudmFsdWVzKHt2YWx1ZXM6IFt7eWVhcjogMTk3MH0sIHt5ZWFyOiAxOTgwfV19LCBudWxsLCBudWxsLCBcInhcIik7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLCBbXG4gICAgICAgIHtcInNpZ25hbFwiOiBcImRhdGV0aW1lKDE5NzAsIDAsIDEsIDAsIDAsIDAsIDApXCJ9LFxuICAgICAgICB7XCJzaWduYWxcIjogXCJkYXRldGltZSgxOTgwLCAwLCAxLCAwLCAwLCAwLCAwKVwifVxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNpbXBseSByZXR1cm4gdmFsdWVzIGZvciBub24tRGF0ZVRpbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wZXJ0aWVzLnZhbHVlcyh7dmFsdWVzOiBbMSwyLDMsNF19LCBudWxsLCBudWxsLCBcInhcIik7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLCBbMSwyLDMsNF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaW1wbHkgZHJvcCB2YWx1ZXMgd2hlbiBkb21haW4gaXMgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwxID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLFxuICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJkb21haW5cIjpbLTEsMl19LFxuICAgICAgICAgICAgXCJiaW5cIjoge1wiZXh0ZW50XCI6WzAsMV19XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9tb3ZpZXMuanNvblwifVxuICAgICAgfSk7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wZXJ0aWVzLnZhbHVlcyh7fSwgbW9kZWwxLCBtb2RlbDEuZmllbGREZWYoXCJ5XCIpLCBcInlcIik7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmFsdWVzLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/common.test.d.ts b/build/test/compile/common.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/common.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/common.test.js b/build/test/compile/common.test.js new file mode 100644 index 0000000000..da192fa895 --- /dev/null +++ b/build/test/compile/common.test.js @@ -0,0 +1,63 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var common_1 = require("../../src/compile/common"); +var config_1 = require("../../src/config"); +var fielddef_1 = require("../../src/fielddef"); +var timeunit_1 = require("../../src/timeunit"); +var type_1 = require("../../src/type"); +describe('Common', function () { + describe('timeFormat()', function () { + it('should get the right time expression for month with shortTimeLabels=true', function () { + var fieldDef = { timeUnit: timeunit_1.TimeUnit.MONTH, field: 'a', type: type_1.TEMPORAL }; + var expression = common_1.timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: 'datum' }), timeunit_1.TimeUnit.MONTH, undefined, true, config_1.defaultConfig.timeFormat, false); + chai_1.assert.equal(expression, "timeFormat(datum[\"month_a\"], '%b')"); + }); + it('should get the right time expression for month with shortTimeLabels=false', function () { + var fieldDef = { timeUnit: timeunit_1.TimeUnit.MONTH, field: 'a', type: type_1.TEMPORAL }; + var expression = common_1.timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: 'datum' }), timeunit_1.TimeUnit.MONTH, undefined, false, config_1.defaultConfig.timeFormat, false); + chai_1.assert.equal(expression, "timeFormat(datum[\"month_a\"], '%B')"); + }); + it('should get the right time expression for yearmonth with custom format', function () { + var fieldDef = { timeUnit: timeunit_1.TimeUnit.YEARMONTH, field: 'a', type: type_1.TEMPORAL }; + var expression = common_1.timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: 'datum' }), timeunit_1.TimeUnit.MONTH, '%Y', true, config_1.defaultConfig.timeFormat, false); + chai_1.assert.equal(expression, "timeFormat(datum[\"yearmonth_a\"], '%Y')"); + }); + it('should get the right time expression for quarter', function () { + var fieldDef = { timeUnit: timeunit_1.TimeUnit.QUARTER, field: 'a', type: type_1.TEMPORAL }; + var expression = common_1.timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: 'datum' }), timeunit_1.TimeUnit.QUARTER, undefined, true, config_1.defaultConfig.timeFormat, false); + chai_1.assert.equal(expression, "'Q' + quarter(datum[\"quarter_a\"])"); + }); + it('should get the right time expression for yearquarter', function () { + var expression = common_1.timeFormatExpression('datum["data"]', timeunit_1.TimeUnit.YEARQUARTER, undefined, true, config_1.defaultConfig.timeFormat, false); + chai_1.assert.equal(expression, "'Q' + quarter(datum[\"data\"]) + ' ' + timeFormat(datum[\"data\"], '%y')"); + }); + it('should get the right time expression for yearmonth with custom format and utc scale type', function () { + var fieldDef = { timeUnit: timeunit_1.TimeUnit.YEARMONTH, field: 'a', type: type_1.TEMPORAL }; + var expression = common_1.timeFormatExpression(fielddef_1.vgField(fieldDef, { expr: 'datum' }), timeunit_1.TimeUnit.MONTH, '%Y', true, config_1.defaultConfig.timeFormat, true); + chai_1.assert.equal(expression, "utcFormat(datum[\"yearmonth_a\"], '%Y')"); + }); + }); + describe('numberFormat()', function () { + it('should use number format for quantitative scale', function () { + chai_1.assert.equal(common_1.numberFormat({ field: 'a', type: type_1.QUANTITATIVE }, undefined, { numberFormat: 'd' }), 'd'); + }); + it('should support empty number format', function () { + chai_1.assert.equal(common_1.numberFormat({ field: 'a', type: type_1.QUANTITATIVE }, undefined, { numberFormat: '' }), ''); + }); + it('should use format if provided', function () { + chai_1.assert.equal(common_1.numberFormat({ field: 'a', type: type_1.QUANTITATIVE }, 'a', {}), 'a'); + }); + it('should not use number format for binned quantitative scale', function () { + chai_1.assert.equal(common_1.numberFormat({ bin: true, field: 'a', type: type_1.QUANTITATIVE }, undefined, {}), undefined); + }); + it('should not use number format for non-quantitative scale', function () { + for (var _i = 0, _a = [type_1.TEMPORAL, type_1.NOMINAL, type_1.ORDINAL]; _i < _a.length; _i++) { + var type = _a[_i]; + chai_1.assert.equal(common_1.numberFormat({ bin: true, field: 'a', type: type }, undefined, {}), undefined); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2NvbXBpbGUvY29tbW9uLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLG1EQUE0RTtBQUM1RSwyQ0FBK0M7QUFDL0MsK0NBQTJDO0FBQzNDLCtDQUE0QztBQUM1Qyx1Q0FBd0U7QUFFeEUsUUFBUSxDQUFDLFFBQVEsRUFBRTtJQUNqQixRQUFRLENBQUMsY0FBYyxFQUFFO1FBQ3ZCLEVBQUUsQ0FBQywwRUFBMEUsRUFBRTtZQUM3RSxJQUFNLFFBQVEsR0FBRyxFQUFDLFFBQVEsRUFBRSxtQkFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFRLEVBQUMsQ0FBQztZQUN4RSxJQUFNLFVBQVUsR0FBRyw2QkFBb0IsQ0FBQyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxFQUFFLG1CQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsc0JBQWEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUksYUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsc0NBQW9DLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyRUFBMkUsRUFBRTtZQUM5RSxJQUFNLFFBQVEsR0FBRyxFQUFDLFFBQVEsRUFBRSxtQkFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFRLEVBQUMsQ0FBQztZQUN4RSxJQUFNLFVBQVUsR0FBRyw2QkFBb0IsQ0FBQyxrQkFBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxFQUFFLG1CQUFRLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUs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UyxFQUFFLEVBQUMsWUFBWSxFQUFFLEVBQUUsRUFBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0JBQStCLEVBQUU7WUFDbEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxxQkFBWSxDQUFDLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsbUJBQVksRUFBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRTtZQUMvRCxhQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFZLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLG1CQUFZLEVBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsS0FBbUIsVUFBNEIsRUFBNUIsTUFBQyxlQUFRLEVBQUUsY0FBTyxFQUFFLGNBQU8sQ0FBQyxFQUE1QixjQUE0QixFQUE1QixJQUE0QixFQUFFO2dCQUE1QyxJQUFNLElBQUksU0FBQTtnQkFDYixhQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFZLENBQUMsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQzthQUMzRjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge251bWJlckZvcm1hdCwgdGltZUZvcm1hdEV4cHJlc3Npb259IGZyb20gJy4uLy4uL3NyYy9jb21waWxlL2NvbW1vbic7XG5pbXBvcnQge2RlZmF1bHRDb25maWd9IGZyb20gJy4uLy4uL3NyYy9jb25maWcnO1xuaW1wb3J0IHt2Z0ZpZWxkfSBmcm9tICcuLi8uLi9zcmMvZmllbGRkZWYnO1xuaW1wb3J0IHtUaW1lVW5pdH0gZnJvbSAnLi4vLi4vc3JjL3RpbWV1bml0JztcbmltcG9ydCB7Tk9NSU5BTCwgT1JESU5BTCwgUVVBTlRJVEFUSVZFLCBURU1QT1JBTH0gZnJvbSAnLi4vLi4vc3JjL3R5cGUnO1xuXG5kZXNjcmliZSgnQ29tbW9uJywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCd0aW1lRm9ybWF0KCknLCBmdW5jdGlvbigpIHtcbiAgICBpdCgnc2hvdWxkIGdldCB0aGUgcmlnaHQgdGltZSBleHByZXNzaW9uIGZvciBtb250aCB3aXRoIHNob3J0VGltZUxhYmVscz10cnVlJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHt0aW1lVW5pdDogVGltZVVuaXQuTU9OVEgsIGZpZWxkOiAnYScsIHR5cGU6IFRFTVBPUkFMfTtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aW1lRm9ybWF0RXhwcmVzc2lvbih2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pLCBUaW1lVW5pdC5NT05USCwgdW5kZWZpbmVkLCB0cnVlLCBkZWZhdWx0Q29uZmlnLnRpbWVGb3JtYXQsIGZhbHNlKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uLCBgdGltZUZvcm1hdChkYXR1bVtcIm1vbnRoX2FcIl0sICclYicpYCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCB0aGUgcmlnaHQgdGltZSBleHByZXNzaW9uIGZvciBtb250aCB3aXRoIHNob3J0VGltZUxhYmVscz1mYWxzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZmllbGREZWYgPSB7dGltZVVuaXQ6IFRpbWVVbml0Lk1PTlRILCBmaWVsZDogJ2EnLCB0eXBlOiBURU1QT1JBTH07XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gdGltZUZvcm1hdEV4cHJlc3Npb24odmdGaWVsZChmaWVsZERlZiwge2V4cHI6ICdkYXR1bSd9KSwgVGltZVVuaXQuTU9OVEgsIHVuZGVmaW5lZCwgZmFsc2UsIGRlZmF1bHRDb25maWcudGltZUZvcm1hdCwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHJlc3Npb24sIGB0aW1lRm9ybWF0KGRhdHVtW1wibW9udGhfYVwiXSwgJyVCJylgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSByaWdodCB0aW1lIGV4cHJlc3Npb24gZm9yIHllYXJtb250aCB3aXRoIGN1c3RvbSBmb3JtYXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0ge3RpbWVVbml0OiBUaW1lVW5pdC5ZRUFSTU9OVEgsIGZpZWxkOiAnYScsIHR5cGU6IFRFTVBPUkFMfTtcbiAgICAgIGNvbnN0IGV4cHJlc3Npb24gPSB0aW1lRm9ybWF0RXhwcmVzc2lvbih2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pLCBUaW1lVW5pdC5NT05USCwgJyVZJywgdHJ1ZSwgZGVmYXVsdENvbmZpZy50aW1lRm9ybWF0LCBmYWxzZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwcmVzc2lvbiwgYHRpbWVGb3JtYXQoZGF0dW1bXCJ5ZWFybW9udGhfYVwiXSwgJyVZJylgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSByaWdodCB0aW1lIGV4cHJlc3Npb24gZm9yIHF1YXJ0ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0ge3RpbWVVbml0OiBUaW1lVW5pdC5RVUFSVEVSLCBmaWVsZDogJ2EnLCB0eXBlOiBURU1QT1JBTH07XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gdGltZUZvcm1hdEV4cHJlc3Npb24odmdGaWVsZChmaWVsZERlZiwge2V4cHI6ICdkYXR1bSd9KSwgVGltZVVuaXQuUVVBUlRFUiwgdW5kZWZpbmVkLCB0cnVlLCBkZWZhdWx0Q29uZmlnLnRpbWVGb3JtYXQsIGZhbHNlKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uLCBgJ1EnICsgcXVhcnRlcihkYXR1bVtcInF1YXJ0ZXJfYVwiXSlgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSByaWdodCB0aW1lIGV4cHJlc3Npb24gZm9yIHllYXJxdWFydGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gdGltZUZvcm1hdEV4cHJlc3Npb24oJ2RhdHVtW1wiZGF0YVwiXScsIFRpbWVVbml0LllFQVJRVUFSVEVSLCB1bmRlZmluZWQsIHRydWUsIGRlZmF1bHRDb25maWcudGltZUZvcm1hdCwgZmFsc2UpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHJlc3Npb24sIGAnUScgKyBxdWFydGVyKGRhdHVtW1wiZGF0YVwiXSkgKyAnICcgKyB0aW1lRm9ybWF0KGRhdHVtW1wiZGF0YVwiXSwgJyV5JylgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZ2V0IHRoZSByaWdodCB0aW1lIGV4cHJlc3Npb24gZm9yIHllYXJtb250aCB3aXRoIGN1c3RvbSBmb3JtYXQgYW5kIHV0YyBzY2FsZSB0eXBlJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHt0aW1lVW5pdDogVGltZVVuaXQuWUVBUk1PTlRILCBmaWVsZDogJ2EnLCB0eXBlOiBURU1QT1JBTH07XG4gICAgICBjb25zdCBleHByZXNzaW9uID0gdGltZUZvcm1hdEV4cHJlc3Npb24odmdGaWVsZChmaWVsZERlZiwge2V4cHI6ICdkYXR1bSd9KSwgVGltZVVuaXQuTU9OVEgsICclWScsIHRydWUsIGRlZmF1bHRDb25maWcudGltZUZvcm1hdCwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwcmVzc2lvbiwgYHV0Y0Zvcm1hdChkYXR1bVtcInllYXJtb250aF9hXCJdLCAnJVknKWApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbnVtYmVyRm9ybWF0KCknLCBmdW5jdGlvbigpIHtcbiAgICBpdCgnc2hvdWxkIHVzZSBudW1iZXIgZm9ybWF0IGZvciBxdWFudGl0YXRpdmUgc2NhbGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5lcXVhbChudW1iZXJGb3JtYXQoe2ZpZWxkOiAnYScsIHR5cGU6IFFVQU5USVRBVElWRX0sIHVuZGVmaW5lZCwge251bWJlckZvcm1hdDogJ2QnfSksICdkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgZW1wdHkgbnVtYmVyIGZvcm1hdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKG51bWJlckZvcm1hdCh7ZmllbGQ6ICdhJywgdHlwZTogUVVBTlRJVEFUSVZFfSwgdW5kZWZpbmVkLCB7bnVtYmVyRm9ybWF0OiAnJ30pLCAnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBmb3JtYXQgaWYgcHJvdmlkZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5lcXVhbChudW1iZXJGb3JtYXQoe2ZpZWxkOiAnYScsIHR5cGU6IFFVQU5USVRBVElWRX0sICdhJywge30pLCAnYScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgdXNlIG51bWJlciBmb3JtYXQgZm9yIGJpbm5lZCBxdWFudGl0YXRpdmUgc2NhbGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5lcXVhbChudW1iZXJGb3JtYXQoe2JpbjogdHJ1ZSwgZmllbGQ6ICdhJywgdHlwZTogUVVBTlRJVEFUSVZFfSwgdW5kZWZpbmVkLCB7fSksIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCB1c2UgbnVtYmVyIGZvcm1hdCBmb3Igbm9uLXF1YW50aXRhdGl2ZSBzY2FsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCB0eXBlIG9mIFtURU1QT1JBTCwgTk9NSU5BTCwgT1JESU5BTF0pIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG51bWJlckZvcm1hdCh7YmluOiB0cnVlLCBmaWVsZDogJ2EnLCB0eXBlOiB0eXBlfSwgdW5kZWZpbmVkLCB7fSksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/compile.test.d.ts b/build/test/compile/compile.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/compile.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/compile.test.js b/build/test/compile/compile.test.js new file mode 100644 index 0000000000..ed88b876b6 --- /dev/null +++ b/build/test/compile/compile.test.js @@ -0,0 +1,266 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var log = tslib_1.__importStar(require("../../src/log")); +var compile_1 = require("../../src/compile/compile"); +describe('compile/compile', function () { + it('should throw error for invalid spec', function () { + chai_1.assert.throws(function () { + compile_1.compile({}); + }, Error, log.message.INVALID_SPEC); + }); + it('should return a spec with default top-level properties, size signals, data, marks, and title', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "title": { "text": "test" }, + "mark": "point", + "encoding": {} + }).spec; + chai_1.assert.equal(spec.padding, 5); + chai_1.assert.equal(spec.autosize, 'pad'); + chai_1.assert.equal(spec.width, 21); + chai_1.assert.equal(spec.height, 21); + chai_1.assert.deepEqual(spec.title, { text: 'test' }); + chai_1.assert.equal(spec.data.length, 1); // just source + chai_1.assert.equal(spec.marks.length, 1); // just the root group + }); + it('should return a spec with specified top-level properties, size signals, data and marks', function () { + var spec = compile_1.compile({ + "padding": 123, + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "mark": "point", + "encoding": {} + }).spec; + chai_1.assert.equal(spec.padding, 123); + chai_1.assert.equal(spec.autosize, 'pad'); + chai_1.assert.equal(spec.width, 21); + chai_1.assert.equal(spec.height, 21); + chai_1.assert.equal(spec.data.length, 1); // just source. + chai_1.assert.equal(spec.marks.length, 1); // just the root group + }); + it('should use size signal for bar chart width', function () { + var spec = compile_1.compile({ + "data": { "values": [{ "a": "A", "b": 28 }] }, + "mark": "bar", + "encoding": { + "x": { "field": "a", "type": "ordinal" }, + "y": { "field": "b", "type": "quantitative" } + } + }).spec; + chai_1.assert.deepEqual(spec.signals, [{ + name: 'x_step', + value: 21 + }, { + name: 'width', + update: "bandspace(domain('x').length, 0.1, 0.05) * x_step" + }]); + chai_1.assert.equal(spec.height, 200); + }); + it('should set resize to true if requested', function () { + var spec = compile_1.compile({ + "autosize": { + "resize": true + }, + "data": { "url": "foo.csv" }, + "mark": "point", + "encoding": {} + }).spec; + chai_1.assert(spec.autosize.resize); + }); + it('should set autosize to fit and containment if requested', function () { + var spec = compile_1.compile({ + "autosize": { + "type": "fit", + "contains": "content" + }, + "data": { "url": "foo.csv" }, + "mark": "point", + "encoding": {} + }).spec; + chai_1.assert.deepEqual(spec.autosize, { type: 'fit', contains: 'content' }); + }); + it('should set autosize to fit if requested', function () { + var spec = compile_1.compile({ + "autosize": "fit", + "data": { "url": "foo.csv" }, + "mark": "point", + "encoding": {} + }).spec; + chai_1.assert.equal(spec.autosize, "fit"); + }); + it('warn if size is data driven and autosize is fit', log.wrap(function (localLogger) { + var spec = compile_1.compile({ + "data": { "values": [{ "a": "A", "b": 28 }] }, + "mark": "bar", + "autosize": "fit", + "encoding": { + "x": { "field": "a", "type": "ordinal" }, + "y": { "field": "b", "type": "quantitative" } + } + }).spec; + chai_1.assert.equal(localLogger.warns[0], log.message.CANNOT_FIX_RANGE_STEP_WITH_FIT); + chai_1.assert.equal(spec.width, 200); + chai_1.assert.equal(spec.height, 200); + })); + it('warn if trying to fit composed spec', log.wrap(function (localLogger) { + var spec = compile_1.compile({ + "data": { "values": [{ "a": "A", "b": 28 }] }, + "autosize": "fit", + "vconcat": [{ + "mark": "point", + "encoding": {} + }] + }).spec; + chai_1.assert.equal(localLogger.warns[0], log.message.FIT_NON_SINGLE); + chai_1.assert.equal(spec.autosize, 'pad'); + })); + it('should return title for a layered spec.', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "title": { "text": "test" }, + "layer": [{ + "mark": "point", + "encoding": {} + }] + }).spec; + chai_1.assert.deepEqual(spec.title, { text: 'test' }); + }); + it('should return title (string) for a layered spec.', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "title": "test", + "layer": [{ + "mark": "point", + "encoding": {} + }] + }).spec; + chai_1.assert.deepEqual(spec.title, { text: 'test' }); + }); + it('should return title from a child of a layer spec if parent has no title.', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "layer": [{ + "title": { "text": "test" }, + "mark": "point", + "encoding": {} + }] + }).spec; + chai_1.assert.deepEqual(spec.title, { text: 'test' }); + }); + it('should return a title for a concat spec, throw warning if anchor is set to other values than "start" and automatically set anchor to "start".', log.wrap(function (localLogger) { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "title": { "text": "test" }, + "hconcat": [{ + "mark": "point", + "encoding": {} + }], + "config": { "title": { "anchor": "middle" } } + }).spec; + chai_1.assert.deepEqual(spec.title, { + text: 'test', + anchor: 'start' // We only support anchor as start for concat + }); + chai_1.assert.equal(localLogger.warns[0], log.message.cannotSetTitleAnchor('concat')); + })); + it('should return a title for a concat spec, automatically set anchor to "start", and augment the title with non-mark title config (e.g., offset).', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "title": { "text": "test" }, + "hconcat": [{ + "mark": "point", + "encoding": {} + }], + "config": { "title": { "offset": 5 } } + }).spec; + chai_1.assert.deepEqual(spec.title, { + text: 'test', + anchor: 'start', + offset: 5 + }); + }); + it('should not have title if there is no title.', function () { + var spec = compile_1.compile({ + "data": { + "values": [{ "a": "A", "b": 28 }] + }, + "hconcat": [{ + "mark": "point", + "encoding": {} + }], + "config": { "title": { "offset": 5 } } + }).spec; + chai_1.assert.isUndefined(spec.title); + }); + it('should use provided config.', function () { + var spec = compile_1.compile({ + mark: "point", + data: { url: "foo.csv" }, + encoding: {} + }, { config: { + background: "blue" + } }).spec; + chai_1.assert.equal(spec.config.background, "blue"); + }); + it('should merge spec and provided config.', function () { + var spec = compile_1.compile({ + mark: "point", + data: { url: "foo.csv" }, + encoding: {}, + config: { + background: "red" + } + }, { config: { + background: "blue" + } }).spec; + chai_1.assert.equal(spec.config.background, "red"); + }); + it('should return a spec with projections (implicit)', function () { + var spec = compile_1.compile({ + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }).spec; + chai_1.assert.isDefined(spec.projections); + }); + it('should return a spec with projections (explicit)', function () { + var spec = compile_1.compile({ + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }).spec; + chai_1.assert.isDefined(spec.projections); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9jb21waWxlL2NvbXBpbGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBRTVCLHlEQUFxQztBQUVyQyxxREFBa0Q7QUFHbEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtRQUN4QyxhQUFNLENBQUMsTUFBTSxDQUFDO1lBQ1osaUJBQU8sQ0FBQyxFQUFTLENBQUMsQ0FBQztRQUNyQixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEZBQThGLEVBQUU7UUFDakcsSUFBTSxJQUFJLEdBQUcsaUJBQU8sQ0FBQztZQUNuQixNQUFNLEVBQUU7Z0JBQ04sUUFBUSxFQUFFLENBQUMsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUMsQ0FBQzthQUMvQjtZQUNELE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUM7WUFDekIsTUFBTSxFQUFFLE9BQU87WUFDZixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFUixhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUIsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25DLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUIsYUFBTSxDQUFDLFNBQVMs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QUFDO1lBQ25CLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsV0FBVzthQUNwQjtZQUNELE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsa0JBQWtCO2dCQUN6QixRQUFRLEVBQUU7b0JBQ1IsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLFNBQVMsRUFBRSxRQUFRO2lCQUNwQjthQUNGO1lBQ0QsVUFBVSxFQUFFLEVBQUU7U0FDZixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1IsYUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9zcmMvbG9nJztcblxuaW1wb3J0IHtjb21waWxlfSBmcm9tICcuLi8uLi9zcmMvY29tcGlsZS9jb21waWxlJztcblxuXG5kZXNjcmliZSgnY29tcGlsZS9jb21waWxlJywgZnVuY3Rpb24oKSB7XG4gIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgc3BlYycsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIGNvbXBpbGUoe30gYXMgYW55KTtcbiAgICB9LCBFcnJvciwgbG9nLm1lc3NhZ2UuSU5WQUxJRF9TUEVDKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzcGVjIHdpdGggZGVmYXVsdCB0b3AtbGV2ZWwgcHJvcGVydGllcywgc2l6ZSBzaWduYWxzLCBkYXRhLCBtYXJrcywgYW5kIHRpdGxlJywgKCkgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgIFwidmFsdWVzXCI6IFt7XCJhXCI6IFwiQVwiLFwiYlwiOiAyOH1dXG4gICAgICB9LFxuICAgICAgXCJ0aXRsZVwiOiB7XCJ0ZXh0XCI6IFwidGVzdFwifSxcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgfSkuc3BlYztcblxuICAgIGFzc2VydC5lcXVhbChzcGVjLnBhZGRpbmcsIDUpO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLmF1dG9zaXplLCAncGFkJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHNwZWMud2lkdGgsIDIxKTtcbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5oZWlnaHQsIDIxKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHNwZWMudGl0bGUsIHt0ZXh0OiAndGVzdCd9KTtcblxuICAgIGFzc2VydC5lcXVhbChzcGVjLmRhdGEubGVuZ3RoLCAxKTsgLy8ganVzdCBzb3VyY2VcbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5tYXJrcy5sZW5ndGgsIDEpOyAvLyBqdXN0IHRoZSByb290IGdyb3VwXG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgc3BlYyB3aXRoIHNwZWNpZmllZCB0b3AtbGV2ZWwgcHJvcGVydGllcywgc2l6ZSBzaWduYWxzLCBkYXRhIGFuZCBtYXJrcycsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcInBhZGRpbmdcIjogMTIzLFxuICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgXCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV1cbiAgICAgIH0sXG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgIH0pLnNwZWM7XG5cbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5wYWRkaW5nLCAxMjMpO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLmF1dG9zaXplLCAncGFkJyk7XG4gICAgYXNzZXJ0LmVxdWFsKHNwZWMud2lkdGgsIDIxKTtcbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5oZWlnaHQsIDIxKTtcblxuICAgIGFzc2VydC5lcXVhbChzcGVjLmRhdGEubGVuZ3RoLCAxKTsgLy8ganVzdCBzb3VyY2UuXG4gICAgYXNzZXJ0LmVxdWFsKHNwZWMubWFya3MubGVuZ3RoLCAxKTsgLy8ganVzdCB0aGUgcm9vdCBncm91cFxuICB9KTtcblxuICBpdCgnc2hvdWxkIHVzZSBzaXplIHNpZ25hbCBmb3IgYmFyIGNoYXJ0IHdpZHRoJywgKCkgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV19LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pLnNwZWM7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKHNwZWMuc2lnbmFscywgW3tcbiAgICAgIG5hbWU6ICd4X3N0ZXAnLFxuICAgICAgdmFsdWU6IDIxXG4gICAgfSwge1xuICAgICAgbmFtZTogJ3dpZHRoJyxcbiAgICAgIHVwZGF0ZTogYGJhbmRzcGFjZShkb21haW4oJ3gnKS5sZW5ndGgsIDAuMSwgMC4wNSkgKiB4X3N0ZXBgXG4gICAgfV0pO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLmhlaWdodCwgMjAwKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBzZXQgcmVzaXplIHRvIHRydWUgaWYgcmVxdWVzdGVkJywgKCkgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiYXV0b3NpemVcIjoge1xuICAgICAgICBcInJlc2l6ZVwiOiB0cnVlXG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImZvby5jc3ZcIn0sXG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgIH0pLnNwZWM7XG5cbiAgICBhc3NlcnQoc3BlYy5hdXRvc2l6ZS5yZXNpemUpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNldCBhdXRvc2l6ZSB0byBmaXQgYW5kIGNvbnRhaW5tZW50IGlmIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcImF1dG9zaXplXCI6IHtcbiAgICAgICAgXCJ0eXBlXCI6IFwiZml0XCIsXG4gICAgICAgIFwiY29udGFpbnNcIjogXCJjb250ZW50XCJcbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZm9vLmNzdlwifSxcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgfSkuc3BlYztcblxuICAgIGFzc2VydC5kZWVwRXF1YWwoc3BlYy5hdXRvc2l6ZSwge3R5cGU6ICdmaXQnLCBjb250YWluczogJ2NvbnRlbnQnfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgc2V0IGF1dG9zaXplIHRvIGZpdCBpZiByZXF1ZXN0ZWQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbXBpbGUoe1xuICAgICAgXCJhdXRvc2l6ZVwiOiBcImZpdFwiLFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImZvby5jc3ZcIn0sXG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgIH0pLnNwZWM7XG5cbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5hdXRvc2l6ZSwgXCJmaXRcIik7XG4gIH0pO1xuXG4gIGl0KCd3YXJuIGlmIHNpemUgaXMgZGF0YSBkcml2ZW4gYW5kIGF1dG9zaXplIGlzIGZpdCcsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV19LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImF1dG9zaXplXCI6IFwiZml0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pLnNwZWM7XG4gICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5DQU5OT1RfRklYX1JBTkdFX1NURVBfV0lUSF9GSVQpO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLndpZHRoLCAyMDApO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLmhlaWdodCwgMjAwKTtcbiAgfSkpO1xuXG4gIGl0KCd3YXJuIGlmIHRyeWluZyB0byBmaXQgY29tcG9zZWQgc3BlYycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV19LFxuICAgICAgXCJhdXRvc2l6ZVwiOiBcImZpdFwiLFxuICAgICAgXCJ2Y29uY2F0XCI6IFt7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH1dXG4gICAgfSkuc3BlYztcbiAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLkZJVF9OT05fU0lOR0xFKTtcbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5hdXRvc2l6ZSwgJ3BhZCcpO1xuICB9KSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGl0bGUgZm9yIGEgbGF5ZXJlZCBzcGVjLicsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcImRhdGFcIjoge1xuICAgICAgICBcInZhbHVlc1wiOiBbe1wiYVwiOiBcIkFcIixcImJcIjogMjh9XVxuICAgICAgfSxcbiAgICAgIFwidGl0bGVcIjoge1widGV4dFwiOiBcInRlc3RcIn0sXG4gICAgICBcImxheWVyXCI6IFt7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH1dXG4gICAgfSkuc3BlYztcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHNwZWMudGl0bGUsIHt0ZXh0OiAndGVzdCd9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGl0bGUgKHN0cmluZykgZm9yIGEgbGF5ZXJlZCBzcGVjLicsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcImRhdGFcIjoge1xuICAgICAgICBcInZhbHVlc1wiOiBbe1wiYVwiOiBcIkFcIixcImJcIjogMjh9XVxuICAgICAgfSxcbiAgICAgIFwidGl0bGVcIjogXCJ0ZXN0XCIsXG4gICAgICBcImxheWVyXCI6IFt7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH1dXG4gICAgfSkuc3BlYztcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHNwZWMudGl0bGUsIHt0ZXh0OiAndGVzdCd9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gdGl0bGUgZnJvbSBhIGNoaWxkIG9mIGEgbGF5ZXIgc3BlYyBpZiBwYXJlbnQgaGFzIG5vIHRpdGxlLicsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcImRhdGFcIjoge1xuICAgICAgICBcInZhbHVlc1wiOiBbe1wiYVwiOiBcIkFcIixcImJcIjogMjh9XVxuICAgICAgfSxcbiAgICAgIFwibGF5ZXJcIjogW3tcbiAgICAgICAgXCJ0aXRsZVwiOiB7XCJ0ZXh0XCI6IFwidGVzdFwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgICAgfV1cbiAgICB9KS5zcGVjO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoc3BlYy50aXRsZSwge3RleHQ6ICd0ZXN0J30pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIHRpdGxlIGZvciBhIGNvbmNhdCBzcGVjLCB0aHJvdyB3YXJuaW5nIGlmIGFuY2hvciBpcyBzZXQgdG8gb3RoZXIgdmFsdWVzIHRoYW4gXCJzdGFydFwiIGFuZCBhdXRvbWF0aWNhbGx5IHNldCBhbmNob3IgdG8gXCJzdGFydFwiLicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgIFwidmFsdWVzXCI6IFt7XCJhXCI6IFwiQVwiLFwiYlwiOiAyOH1dXG4gICAgICB9LFxuICAgICAgXCJ0aXRsZVwiOiB7XCJ0ZXh0XCI6IFwidGVzdFwifSxcbiAgICAgIFwiaGNvbmNhdFwiOiBbe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgICB9XSxcbiAgICAgIFwiY29uZmlnXCI6IHtcInRpdGxlXCI6IHtcImFuY2hvclwiOiBcIm1pZGRsZVwifX1cbiAgICB9KS5zcGVjO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoc3BlYy50aXRsZSwge1xuICAgICAgdGV4dDogJ3Rlc3QnLFxuICAgICAgYW5jaG9yOiAnc3RhcnQnIC8vIFdlIG9ubHkgc3VwcG9ydCBhbmNob3IgYXMgc3RhcnQgZm9yIGNvbmNhdFxuICAgIH0pO1xuICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuY2Fubm90U2V0VGl0bGVBbmNob3IoJ2NvbmNhdCcpKTtcbiAgfSkpO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgdGl0bGUgZm9yIGEgY29uY2F0IHNwZWMsIGF1dG9tYXRpY2FsbHkgc2V0IGFuY2hvciB0byBcInN0YXJ0XCIsIGFuZCBhdWdtZW50IHRoZSB0aXRsZSB3aXRoIG5vbi1tYXJrIHRpdGxlIGNvbmZpZyAoZS5nLiwgb2Zmc2V0KS4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbXBpbGUoe1xuICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgXCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV1cbiAgICAgIH0sXG4gICAgICBcInRpdGxlXCI6IHtcInRleHRcIjogXCJ0ZXN0XCJ9LFxuICAgICAgXCJoY29uY2F0XCI6IFt7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH1dLFxuICAgICAgXCJjb25maWdcIjoge1widGl0bGVcIjoge1wib2Zmc2V0XCI6IDV9fVxuICAgIH0pLnNwZWM7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChzcGVjLnRpdGxlLCB7XG4gICAgICB0ZXh0OiAndGVzdCcsXG4gICAgICBhbmNob3I6ICdzdGFydCcsXG4gICAgICBvZmZzZXQ6IDVcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBub3QgaGF2ZSB0aXRsZSBpZiB0aGVyZSBpcyBubyB0aXRsZS4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbXBpbGUoe1xuICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgXCJ2YWx1ZXNcIjogW3tcImFcIjogXCJBXCIsXCJiXCI6IDI4fV1cbiAgICAgIH0sXG4gICAgICBcImhjb25jYXRcIjogW3tcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgICAgfV0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJ0aXRsZVwiOiB7XCJvZmZzZXRcIjogNX19XG4gICAgfSkuc3BlYztcbiAgICBhc3NlcnQuaXNVbmRlZmluZWQoc3BlYy50aXRsZSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdXNlIHByb3ZpZGVkIGNvbmZpZy4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbXBpbGUoe1xuICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgZGF0YToge3VybDogXCJmb28uY3N2XCJ9LFxuICAgICAgZW5jb2Rpbmc6IHt9XG4gICAgfSwge2NvbmZpZzoge1xuICAgICAgYmFja2dyb3VuZDogXCJibHVlXCJcbiAgICB9fSkuc3BlYztcbiAgICBhc3NlcnQuZXF1YWwoc3BlYy5jb25maWcuYmFja2dyb3VuZCwgXCJibHVlXCIpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIG1lcmdlIHNwZWMgYW5kIHByb3ZpZGVkIGNvbmZpZy4nLCAoKSA9PiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbXBpbGUoe1xuICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgZGF0YToge3VybDogXCJmb28uY3N2XCJ9LFxuICAgICAgZW5jb2Rpbmc6IHt9LFxuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IFwicmVkXCJcbiAgICAgIH1cbiAgICB9LCB7Y29uZmlnOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcImJsdWVcIlxuICAgIH19KS5zcGVjO1xuICAgIGFzc2VydC5lcXVhbChzcGVjLmNvbmZpZy5iYWNrZ3JvdW5kLCBcInJlZFwiKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBzcGVjIHdpdGggcHJvamVjdGlvbnMgKGltcGxpY2l0KScsICgpID0+IHtcbiAgICBjb25zdCBzcGVjID0gY29tcGlsZSh7XG4gICAgICBcIm1hcmtcIjogXCJnZW9zaGFwZVwiLFxuICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgfSkuc3BlYztcbiAgICBhc3NlcnQuaXNEZWZpbmVkKHNwZWMucHJvamVjdGlvbnMpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHJldHVybiBhIHNwZWMgd2l0aCBwcm9qZWN0aW9ucyAoZXhwbGljaXQpJywgKCkgPT4ge1xuICAgIGNvbnN0IHNwZWMgPSBjb21waWxlKHtcbiAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICBcInByb2plY3Rpb25cIjoge1xuICAgICAgICBcInR5cGVcIjogXCJhbGJlcnNVc2FcIlxuICAgICAgfSxcbiAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgIFwidXJsXCI6IFwiZGF0YS91cy0xMG0uanNvblwiLFxuICAgICAgICBcImZvcm1hdFwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwidG9wb2pzb25cIixcbiAgICAgICAgICBcImZlYXR1cmVcIjogXCJzdGF0ZXNcIlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgIH0pLnNwZWM7XG4gICAgYXNzZXJ0LmlzRGVmaW5lZChzcGVjLnByb2plY3Rpb25zKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/concat.test.d.ts b/build/test/compile/concat.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/concat.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/concat.test.js b/build/test/compile/concat.test.js new file mode 100644 index 0000000000..1d1b9c2c6c --- /dev/null +++ b/build/test/compile/concat.test.js @@ -0,0 +1,95 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var log = tslib_1.__importStar(require("../../src/log")); +var util_1 = require("../util"); +describe('Concat', function () { + describe('merge scale domains', function () { + it('should instantiate all children in vconcat', function () { + var model = util_1.parseConcatModel({ + vconcat: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }, { + mark: 'bar', + encoding: { + x: { field: 'b', type: 'ordinal' }, + y: { field: 'c', type: 'quantitative' } + } + }] + }); + chai_1.assert.equal(model.children.length, 2); + chai_1.assert(model.isVConcat); + }); + it('should instantiate all children in hconcat', function () { + var model = util_1.parseConcatModel({ + hconcat: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }, { + mark: 'bar', + encoding: { + x: { field: 'b', type: 'ordinal' }, + y: { field: 'c', type: 'quantitative' } + } + }] + }); + chai_1.assert.equal(model.children.length, 2); + chai_1.assert(!model.isVConcat); + }); + it('should create correct layout for vconcat', function () { + var model = util_1.parseConcatModel({ + vconcat: [{ + mark: 'point', + encoding: {} + }, { + mark: 'bar', + encoding: {} + }] + }); + chai_1.assert.deepEqual(model.assembleLayout(), { + padding: { row: 10, column: 10 }, + offset: 10, + columns: 1, + bounds: 'full', + align: 'each' + }); + }); + it('should create correct layout for hconcat', function () { + var model = util_1.parseConcatModel({ + hconcat: [{ + mark: 'point', + encoding: {} + }, { + mark: 'bar', + encoding: {} + }] + }); + chai_1.assert.deepEqual(model.assembleLayout(), { + padding: { row: 10, column: 10 }, + offset: 10, + bounds: 'full', + align: 'each' + }); + }); + }); + describe('resolve', function () { + it('cannot share axes', log.wrap(function (localLogger) { + util_1.parseConcatModel({ + hconcat: [], + resolve: { + axis: { + x: 'shared' + } + } + }); + chai_1.assert.equal(localLogger.warns[0], log.message.CONCAT_CANNOT_SHARE_AXIS); + })); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2NvbXBpbGUvY29uY2F0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTRCO0FBQzVCLHlEQUFxQztBQUVyQyxnQ0FBeUM7QUFFekMsUUFBUSxDQUFDLFFBQVEsRUFBRTtJQUNqQixRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLElBQU0sS0FBSyxHQUFHLHVCQUFnQixDQUFDO2dCQUM3QixPQUFPLEVBQUUsQ0FBQzt3QkFDUixJQUFJLEVBQUUsT0FBTzt3QkFDYixRQUFRLEVBQUU7NEJBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO3lCQUNqQztxQkFDRixFQUFDO3dCQUNBLElBQUksRUFBRSxLQUFLO3dCQUNYLFFBQVEsRUFBRTs0QkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7NEJBQ2hDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQzt5QkFDdEM7cUJBQ0YsQ0FBQzthQUNILENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRTtZQUMvQyxJQUFNLEtBQUssR0FBRyx1QkFBZ0IsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7d0JBQ1IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsUUFBUSxFQUFFOzRCQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQzt5QkFDakM7cUJBQ0YsRUFBQzt3QkFDQSxJQUFJLEVBQUUsS0FBSzt3QkFDWCxRQUFRLEVBQUU7NEJBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDOzRCQUNoQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7eUJBQ3RDO3FCQUNGLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLGFBQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxJQUFNLEtBQUssR0FBRyx1QkFBZ0IsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7d0JBQ1IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsUUFBUSxFQUFFLEVBQ1Q7cUJBQ0YsRUFBQzt3QkFDQSxJQUFJLEVBQUUsS0FBSzt3QkFDWCxRQUFRLEVBQUUsRUFDVDtxQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBVyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQ2pELE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQztnQkFDOUIsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxJQUFNLEtBQUssR0FBRyx1QkFBZ0IsQ0FBQztnQkFDN0IsT0FBTyxFQUFFLENBQUM7d0JBQ1IsSUFBSSxFQUFFLE9BQU87d0JBQ2IsUUFBUSxFQUFFLEVBQ1Q7cUJBQ0YsRUFBQzt3QkFDQSxJQUFJLEVBQUUsS0FBSzt3QkFDWCxRQUFRLEVBQUUsRUFDVDtxQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBVyxLQUFLLENBQUMsY0FBYyxFQUFFLEVBQUU7Z0JBQ2pELE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQztnQkFDOUIsTUFBTSxFQUFFLEVBQUU7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNsQixFQUFFLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7WUFDM0MsdUJBQWdCLENBQUM7Z0JBQ2YsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRTt3QkFDSixDQUFDLEVBQUUsUUFBUTtxQkFDWjtpQkFDRjthQUNGLENBQUMsQ0FBQztZQUNILGFBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDM0UsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge1ZnTGF5b3V0fSBmcm9tICcuLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZUNvbmNhdE1vZGVsfSBmcm9tICcuLi91dGlsJztcblxuZGVzY3JpYmUoJ0NvbmNhdCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ21lcmdlIHNjYWxlIGRvbWFpbnMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBpbnN0YW50aWF0ZSBhbGwgY2hpbGRyZW4gaW4gdmNvbmNhdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VDb25jYXRNb2RlbCh7XG4gICAgICAgIHZjb25jYXQ6IFt7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgICB9XG4gICAgICAgIH0se1xuICAgICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ29yZGluYWwnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1dXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNoaWxkcmVuLmxlbmd0aCwgMik7XG4gICAgICBhc3NlcnQobW9kZWwuaXNWQ29uY2F0KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5zdGFudGlhdGUgYWxsIGNoaWxkcmVuIGluIGhjb25jYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlQ29uY2F0TW9kZWwoe1xuICAgICAgICBoY29uY2F0OiBbe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9XG4gICAgICAgICAgfVxuICAgICAgICB9LHtcbiAgICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdvcmRpbmFsJ30sXG4gICAgICAgICAgICB5OiB7ZmllbGQ6ICdjJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgfVxuICAgICAgICB9XVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5jaGlsZHJlbi5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0KCFtb2RlbC5pc1ZDb25jYXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgY29ycmVjdCBsYXlvdXQgZm9yIHZjb25jYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlQ29uY2F0TW9kZWwoe1xuICAgICAgICB2Y29uY2F0OiBbe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB9XG4gICAgICAgIH0se1xuICAgICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgfVxuICAgICAgICB9XVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdMYXlvdXQ+KG1vZGVsLmFzc2VtYmxlTGF5b3V0KCksIHtcbiAgICAgICAgcGFkZGluZzoge3JvdzogMTAsIGNvbHVtbjogMTB9LFxuICAgICAgICBvZmZzZXQ6IDEwLFxuICAgICAgICBjb2x1bW5zOiAxLFxuICAgICAgICBib3VuZHM6ICdmdWxsJyxcbiAgICAgICAgYWxpZ246ICdlYWNoJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBjb3JyZWN0IGxheW91dCBmb3IgaGNvbmNhdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VDb25jYXRNb2RlbCh7XG4gICAgICAgIGhjb25jYXQ6IFt7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIH1cbiAgICAgICAgfSx7XG4gICAgICAgICAgbWFyazogJ2JhcicsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB9XG4gICAgICAgIH1dXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ0xheW91dD4obW9kZWwuYXNzZW1ibGVMYXlvdXQoKSwge1xuICAgICAgICBwYWRkaW5nOiB7cm93OiAxMCwgY29sdW1uOiAxMH0sXG4gICAgICAgIG9mZnNldDogMTAsXG4gICAgICAgIGJvdW5kczogJ2Z1bGwnLFxuICAgICAgICBhbGlnbjogJ2VhY2gnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmUnLCAoKSA9PiB7XG4gICAgaXQoJ2Nhbm5vdCBzaGFyZSBheGVzJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBwYXJzZUNvbmNhdE1vZGVsKHtcbiAgICAgICAgaGNvbmNhdDogW10sXG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBheGlzOiB7XG4gICAgICAgICAgICB4OiAnc2hhcmVkJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLkNPTkNBVF9DQU5OT1RfU0hBUkVfQVhJUyk7XG4gICAgfSkpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/data/aggregate.test.d.ts b/build/test/compile/data/aggregate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/aggregate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/aggregate.test.js b/build/test/compile/data/aggregate.test.js new file mode 100644 index 0000000000..e9d7698a72 --- /dev/null +++ b/build/test/compile/data/aggregate.test.js @@ -0,0 +1,171 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var aggregate_1 = require("../../../src/compile/data/aggregate"); +var util_1 = require("../../util"); +describe('compile/data/summary', function () { + describe('clone', function () { + it('should have correct type', function () { + var agg = new aggregate_1.AggregateNode(null, {}, {}); + chai_1.assert(agg instanceof aggregate_1.AggregateNode); + var clone = agg.clone(); + chai_1.assert(clone instanceof aggregate_1.AggregateNode); + }); + it('should have make a deep copy', function () { + var agg = new aggregate_1.AggregateNode(null, { foo: true }, {}); + var clone = agg.clone(); + clone.addDimensions(['bar']); + chai_1.assert.deepEqual(clone.dependentFields(), { 'foo': true, 'bar': true }); + chai_1.assert.deepEqual(agg.dependentFields(), { 'foo': true }); + }); + }); + describe('parseUnit', function () { + it('should produce the correct summary component for sum(Acceleration) and count(*)', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + 'y': { + 'aggregate': 'sum', + 'field': 'Acceleration', + 'type': "quantitative" + }, + 'x': { + 'field': 'Origin', + 'type': "ordinal" + }, + color: { type: "quantitative", aggregate: 'count' } + } + }); + var agg = aggregate_1.AggregateNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: ['Origin'], + ops: ['sum', 'count'], + fields: ['Acceleration', '*'], + as: [ + "sum_Acceleration", + "count_*" + ] + }); + }); + it('should produce the correct summary component for aggregated plot with detail arrays', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + 'x': { 'aggregate': 'mean', 'field': 'Displacement', 'type': "quantitative" }, + 'detail': [ + { 'field': 'Origin', 'type': "ordinal" }, + { 'field': 'Cylinders', 'type': "quantitative" } + ] + } + }); + var agg = aggregate_1.AggregateNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: ['Origin', 'Cylinders'], + ops: ['mean'], + fields: ['Displacement'], + as: ['mean_Displacement'] + }); + }); + it('should include conditional field in the summary component', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + 'x': { 'aggregate': 'mean', 'field': 'Displacement', 'type': "quantitative" }, + color: { + condition: { selection: 'a', field: 'Origin', 'type': "ordinal" }, + value: 'red' + } + } + }); + var agg = aggregate_1.AggregateNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: ['Origin'], + ops: ['mean'], + fields: ['Displacement'], + as: ['mean_Displacement'] + }); + }); + it('should add min and max if needed for unaggregated scale domain', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + 'x': { 'aggregate': 'mean', 'field': 'Displacement', 'type': "quantitative", scale: { domain: 'unaggregated' } }, + } + }); + var agg = aggregate_1.AggregateNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: [], + ops: ['mean', 'min', 'max'], + fields: ['Displacement', 'Displacement', 'Displacement'], + as: [ + "mean_Displacement", + "min_Displacement", + "max_Displacement" + ] + }); + }); + it('should add correct dimensions when binning', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + 'x': { 'bin': true, 'field': 'Displacement', 'type': "quantitative" }, + 'y': { 'bin': true, 'field': 'Acceleration', 'type': "ordinal" }, + 'color': { 'aggregate': 'count', 'type': "quantitative" } + } + }); + var agg = aggregate_1.AggregateNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: [ + 'bin_maxbins_10_Displacement', + 'bin_maxbins_10_Displacement_end', + 'bin_maxbins_10_Acceleration', + 'bin_maxbins_10_Acceleration_end', + 'bin_maxbins_10_Acceleration_range' + ], + ops: ['count'], + fields: ['*'], + as: ['count_*'] + }); + }); + it('should produce the correct summary component from transform array', function () { + var t = { + aggregate: [ + { op: 'mean', field: 'Displacement', as: 'Displacement_mean' }, + { op: 'sum', field: 'Acceleration', as: 'Acceleration_sum' } + ], + groupby: ['Displacement_mean', 'Acceleration_sum'] + }; + var agg = aggregate_1.AggregateNode.makeFromTransform(null, t); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: ['Displacement_mean', 'Acceleration_sum'], + ops: ['mean', 'sum'], + fields: ['Displacement', 'Acceleration'], + as: ['Displacement_mean', 'Acceleration_sum'] + }); + }); + it('should produce the correct summary component from transform array with different aggregrations for the same field', function () { + var t = { aggregate: [ + { op: 'mean', field: 'Displacement', as: 'Displacement_mean' }, + { op: 'max', field: 'Displacement', as: 'Displacement_max' }, + { op: 'sum', field: 'Acceleration', as: 'Acceleration_sum' } + ], + groupby: ['Displacement_mean', 'Acceleration_sum'] }; + var agg = aggregate_1.AggregateNode.makeFromTransform(null, t); + chai_1.assert.deepEqual(agg.assemble(), { + type: 'aggregate', + groupby: ['Displacement_mean', 'Acceleration_sum'], + ops: ['mean', 'max', 'sum'], + fields: ['Displacement', 'Displacement', 'Acceleration'], + as: ['Displacement_mean', 'Displacement_max', 'Acceleration_sum'] + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9hZ2dyZWdhdGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOztBQUU5Qiw2QkFBNEI7QUFFNUIsaUVBQWtFO0FBSWxFLG1DQUEwQztBQUUxQyxRQUFRLENBQUMsc0JBQXNCLEVBQUU7SUFDL0IsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUNoQixFQUFFLENBQUMsMEJBQTBCLEVBQUU7WUFDN0IsSUFBTSxHQUFHLEdBQUcsSUFBSSx5QkFBYSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUMsYUFBTSxDQUFDLEdBQUcsWUFBWSx5QkFBYSxDQUFDLENBQUM7WUFDckMsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLGFBQU0sQ0FBQyxLQUFLLFlBQVkseUJBQWEsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFO1lBQ2pDLElBQU0sR0FBRyxHQUFHLElBQUkseUJBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDckQsSUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzdCLGFBQU0sQ0FBQyxTQUFTLENBQVksS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUNqRixhQUFNLENBQUMsU0FBUyxDQUFZLEdBQUcsQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FB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LENBQUM7Z0JBQ2xELEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUMzQixNQUFNLEVBQUUsQ0FBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsQ0FBQztnQkFDeEQsRUFBRSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUM7YUFDbEUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcblxuaW1wb3J0IHtBZ2dyZWdhdGVOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge0FnZ3JlZ2F0ZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zZm9ybSc7XG5pbXBvcnQge1N0cmluZ1NldH0gZnJvbSAnLi4vLi4vLi4vc3JjL3V0aWwnO1xuaW1wb3J0IHtWZ0FnZ3JlZ2F0ZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vLi4vc3JjL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL3N1bW1hcnknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdjbG9uZScsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHR5cGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGFnZyA9IG5ldyBBZ2dyZWdhdGVOb2RlKG51bGwsIHt9LCB7fSk7XG4gICAgICBhc3NlcnQoYWdnIGluc3RhbmNlb2YgQWdncmVnYXRlTm9kZSk7XG4gICAgICBjb25zdCBjbG9uZSA9IGFnZy5jbG9uZSgpO1xuICAgICAgYXNzZXJ0KGNsb25lIGluc3RhbmNlb2YgQWdncmVnYXRlTm9kZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgbWFrZSBhIGRlZXAgY29weScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgYWdnID0gbmV3IEFnZ3JlZ2F0ZU5vZGUobnVsbCwge2ZvbzogdHJ1ZX0sIHt9KTtcbiAgICAgIGNvbnN0IGNsb25lID0gYWdnLmNsb25lKCk7XG4gICAgICBjbG9uZS5hZGREaW1lbnNpb25zKFsnYmFyJ10pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxTdHJpbmdTZXQ+KGNsb25lLmRlcGVuZGVudEZpZWxkcygpLCB7J2Zvbyc6IHRydWUsICdiYXInOiB0cnVlfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFN0cmluZ1NldD4oYWdnLmRlcGVuZGVudEZpZWxkcygpLCB7J2Zvbyc6IHRydWV9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlVW5pdCcsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSB0aGUgY29ycmVjdCBzdW1tYXJ5IGNvbXBvbmVudCBmb3Igc3VtKEFjY2VsZXJhdGlvbikgYW5kIGNvdW50KCopJyAsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgJ3knOiB7XG4gICAgICAgICAgICAnYWdncmVnYXRlJzogJ3N1bScsXG4gICAgICAgICAgICAnZmllbGQnOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgICAgICAgICd0eXBlJzogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3gnOiB7XG4gICAgICAgICAgICAnZmllbGQnOiAnT3JpZ2luJyxcbiAgICAgICAgICAgICd0eXBlJzogXCJvcmRpbmFsXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbG9yOiB7dHlwZTogXCJxdWFudGl0YXRpdmVcIiwgYWdncmVnYXRlOiAnY291bnQnfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbJ09yaWdpbiddLFxuICAgICAgICBvcHM6IFsnc3VtJywgJ2NvdW50J10sXG4gICAgICAgIGZpZWxkczogWydBY2NlbGVyYXRpb24nLCAnKiddLFxuICAgICAgICBhczogW1xuICAgICAgICAgIFwic3VtX0FjY2VsZXJhdGlvblwiLFxuICAgICAgICAgIFwiY291bnRfKlwiXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHRoZSBjb3JyZWN0IHN1bW1hcnkgY29tcG9uZW50IGZvciBhZ2dyZWdhdGVkIHBsb3Qgd2l0aCBkZXRhaWwgYXJyYXlzJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICd4JzogeydhZ2dyZWdhdGUnOiAnbWVhbicsICdmaWVsZCc6ICdEaXNwbGFjZW1lbnQnLCAndHlwZSc6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICdkZXRhaWwnOiBbXG4gICAgICAgICAgICB7J2ZpZWxkJzogJ09yaWdpbicsICd0eXBlJzogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgeydmaWVsZCc6ICdDeWxpbmRlcnMnLCAndHlwZSc6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgXVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbJ09yaWdpbicsICdDeWxpbmRlcnMnXSxcbiAgICAgICAgb3BzOiBbJ21lYW4nXSxcbiAgICAgICAgZmllbGRzOiBbJ0Rpc3BsYWNlbWVudCddLFxuICAgICAgICBhczogWydtZWFuX0Rpc3BsYWNlbWVudCddXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaW5jbHVkZSBjb25kaXRpb25hbCBmaWVsZCBpbiB0aGUgc3VtbWFyeSBjb21wb25lbnQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgJ3gnOiB7J2FnZ3JlZ2F0ZSc6ICdtZWFuJywgJ2ZpZWxkJzogJ0Rpc3BsYWNlbWVudCcsICd0eXBlJzogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjoge3NlbGVjdGlvbjogJ2EnLCBmaWVsZDogJ09yaWdpbicsICd0eXBlJzogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgdmFsdWU6ICdyZWQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbJ09yaWdpbiddLFxuICAgICAgICBvcHM6IFsnbWVhbiddLFxuICAgICAgICBmaWVsZHM6IFsnRGlzcGxhY2VtZW50J10sXG4gICAgICAgIGFzOiBbJ21lYW5fRGlzcGxhY2VtZW50J11cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgbWluIGFuZCBtYXggaWYgbmVlZGVkIGZvciB1bmFnZ3JlZ2F0ZWQgc2NhbGUgZG9tYWluJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICd4JzogeydhZ2dyZWdhdGUnOiAnbWVhbicsICdmaWVsZCc6ICdEaXNwbGFjZW1lbnQnLCAndHlwZSc6IFwicXVhbnRpdGF0aXZlXCIsIHNjYWxlOiB7ZG9tYWluOiAndW5hZ2dyZWdhdGVkJ319LFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbXSxcbiAgICAgICAgb3BzOiBbJ21lYW4nLCAnbWluJywgJ21heCddLFxuICAgICAgICBmaWVsZHM6IFsnRGlzcGxhY2VtZW50JywgJ0Rpc3BsYWNlbWVudCcsICdEaXNwbGFjZW1lbnQnXSxcbiAgICAgICAgYXM6IFtcbiAgICAgICAgICBcIm1lYW5fRGlzcGxhY2VtZW50XCIsXG4gICAgICAgICAgXCJtaW5fRGlzcGxhY2VtZW50XCIsXG4gICAgICAgICAgXCJtYXhfRGlzcGxhY2VtZW50XCJcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBjb3JyZWN0IGRpbWVuc2lvbnMgd2hlbiBiaW5uaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICd4JzogeydiaW4nOiB0cnVlLCAnZmllbGQnOiAnRGlzcGxhY2VtZW50JywgJ3R5cGUnOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAneSc6IHsnYmluJzogdHJ1ZSwgJ2ZpZWxkJzogJ0FjY2VsZXJhdGlvbicsICd0eXBlJzogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICdjb2xvcic6IHsnYWdncmVnYXRlJzogJ2NvdW50JywgJ3R5cGUnOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbXG4gICAgICAgICAgJ2Jpbl9tYXhiaW5zXzEwX0Rpc3BsYWNlbWVudCcsXG4gICAgICAgICAgJ2Jpbl9tYXhiaW5zXzEwX0Rpc3BsYWNlbWVudF9lbmQnLFxuICAgICAgICAgICdiaW5fbWF4Ymluc18xMF9BY2NlbGVyYXRpb24nLFxuICAgICAgICAgICdiaW5fbWF4Ymluc18xMF9BY2NlbGVyYXRpb25fZW5kJyxcbiAgICAgICAgICAnYmluX21heGJpbnNfMTBfQWNjZWxlcmF0aW9uX3JhbmdlJ1xuICAgICAgICBdLFxuICAgICAgICBvcHM6IFsnY291bnQnXSxcbiAgICAgICAgZmllbGRzOiBbJyonXSxcbiAgICAgICAgYXM6IFsnY291bnRfKiddXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSB0aGUgY29ycmVjdCBzdW1tYXJ5IGNvbXBvbmVudCBmcm9tIHRyYW5zZm9ybSBhcnJheScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgdDogQWdncmVnYXRlVHJhbnNmb3JtID0ge1xuICAgICAgICBhZ2dyZWdhdGU6IFtcbiAgICAgICAgICB7b3A6ICdtZWFuJywgZmllbGQ6ICdEaXNwbGFjZW1lbnQnLCBhczogJ0Rpc3BsYWNlbWVudF9tZWFuJ30sXG4gICAgICAgICAge29wOiAnc3VtJywgZmllbGQ6ICdBY2NlbGVyYXRpb24nLCBhczogJ0FjY2VsZXJhdGlvbl9zdW0nfVxuICAgICAgICBdLFxuICAgICAgICBncm91cGJ5OiBbJ0Rpc3BsYWNlbWVudF9tZWFuJywgJ0FjY2VsZXJhdGlvbl9zdW0nXX07XG5cbiAgICAgIGNvbnN0IGFnZyA9IEFnZ3JlZ2F0ZU5vZGUubWFrZUZyb21UcmFuc2Zvcm0obnVsbCwgdCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnQWdncmVnYXRlVHJhbnNmb3JtPihhZ2cuYXNzZW1ibGUoKSwge1xuICAgICAgICB0eXBlOiAnYWdncmVnYXRlJyxcbiAgICAgICAgZ3JvdXBieTogWydEaXNwbGFjZW1lbnRfbWVhbicsICdBY2NlbGVyYXRpb25fc3VtJ10sXG4gICAgICAgIG9wczogWydtZWFuJywgJ3N1bSddLFxuICAgICAgICBmaWVsZHM6IFsnRGlzcGxhY2VtZW50JywgJ0FjY2VsZXJhdGlvbiddLFxuICAgICAgICBhczogWydEaXNwbGFjZW1lbnRfbWVhbicsICdBY2NlbGVyYXRpb25fc3VtJ11cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHRoZSBjb3JyZWN0IHN1bW1hcnkgY29tcG9uZW50IGZyb20gdHJhbnNmb3JtIGFycmF5IHdpdGggZGlmZmVyZW50IGFnZ3JlZ3JhdGlvbnMgZm9yIHRoZSBzYW1lIGZpZWxkJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCB0OiBBZ2dyZWdhdGVUcmFuc2Zvcm0gPSB7YWdncmVnYXRlOiBbXG4gICAgICAgIHtvcDogJ21lYW4nLCBmaWVsZDogJ0Rpc3BsYWNlbWVudCcsIGFzOiAnRGlzcGxhY2VtZW50X21lYW4nfSxcbiAgICAgICAge29wOiAnbWF4JywgZmllbGQ6ICdEaXNwbGFjZW1lbnQnLCBhczogJ0Rpc3BsYWNlbWVudF9tYXgnfSxcbiAgICAgICAge29wOiAnc3VtJywgZmllbGQ6ICdBY2NlbGVyYXRpb24nLCBhczogJ0FjY2VsZXJhdGlvbl9zdW0nfV0sXG4gICAgICAgIGdyb3VwYnk6IFsnRGlzcGxhY2VtZW50X21lYW4nLCAnQWNjZWxlcmF0aW9uX3N1bSddfTtcblxuICAgICAgY29uc3QgYWdnID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbVRyYW5zZm9ybShudWxsLCB0KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdBZ2dyZWdhdGVUcmFuc2Zvcm0+KGFnZy5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBbJ0Rpc3BsYWNlbWVudF9tZWFuJywgJ0FjY2VsZXJhdGlvbl9zdW0nXSxcbiAgICAgICAgb3BzOiBbJ21lYW4nLCAnbWF4JywgJ3N1bSddLFxuICAgICAgICBmaWVsZHM6IFsnRGlzcGxhY2VtZW50JywgJ0Rpc3BsYWNlbWVudCcsICdBY2NlbGVyYXRpb24nXSxcbiAgICAgICAgYXM6IFsnRGlzcGxhY2VtZW50X21lYW4nLCAnRGlzcGxhY2VtZW50X21heCcsICdBY2NlbGVyYXRpb25fc3VtJ11cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/data/assemble.test.d.ts b/build/test/compile/data/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/assemble.test.js b/build/test/compile/data/assemble.test.js new file mode 100644 index 0000000000..d80d3b81a7 --- /dev/null +++ b/build/test/compile/data/assemble.test.js @@ -0,0 +1,139 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var aggregate_1 = require("../../../src/compile/data/aggregate"); +var assemble_1 = require("../../../src/compile/data/assemble"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var source_1 = require("../../../src/compile/data/source"); +var window_1 = require("../../../src/compile/data/window"); +describe('compile/data/assemble', function () { + describe('assembleData', function () { + it('should assemble named data source', function () { + var src = new source_1.SourceNode({ name: 'foo' }); + var outputNodeRefCounts = {}; + var main = new dataflow_1.OutputNode(null, 'mainOut', 'main', outputNodeRefCounts); + main.parent = src; + chai_1.assert.equal(main.getSource(), 'mainOut'); + var data = assemble_1.assembleRootData({ + sources: { named: src }, + outputNodes: { out: main }, + outputNodeRefCounts: outputNodeRefCounts, + isFaceted: false + }, {}); + chai_1.assert.equal(data.length, 1); + chai_1.assert.equal(data[0].name, "foo"); + }); + it('should assemble raw and main output', function () { + var src = new source_1.SourceNode({ url: 'foo.csv' }); + var outputNodeRefCounts = {}; + var raw = new dataflow_1.OutputNode(null, 'rawOut', 'raw', outputNodeRefCounts); + raw.parent = src; + var agg = new aggregate_1.AggregateNode(null, { a: true }, { b: { count: 'count_*' } }); + agg.parent = raw; + var main = new dataflow_1.OutputNode(null, 'mainOut', 'main', outputNodeRefCounts); + main.parent = agg; + chai_1.assert.equal(raw.getSource(), 'rawOut'); + chai_1.assert.equal(main.getSource(), 'mainOut'); + var data = assemble_1.assembleRootData({ + sources: { named: src }, + outputNodes: { out: main }, + outputNodeRefCounts: outputNodeRefCounts, + isFaceted: false + }, {}); + chai_1.assert.deepEqual(data, [{ + name: 'source_0', + url: 'foo.csv', + format: { type: 'csv' } + }, { + name: 'data_0', + source: 'source_0', + transform: [{ + type: 'aggregate', + groupby: ['a'], + ops: ['count'], + fields: ['b'], + as: ['count_*'] + }] + } + ]); + }); + it('should assemble window transform node', function () { + var src = new source_1.SourceNode({ url: 'foo.csv' }); + var outputNodeRefCounts = {}; + var raw = new dataflow_1.OutputNode(null, 'rawOut', 'raw', outputNodeRefCounts); + raw.parent = src; + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ], + groupby: ['f'], + frame: [null, 0] + }; + var agg = new window_1.WindowTransformNode(null, transform); + agg.parent = raw; + var main = new dataflow_1.OutputNode(null, 'mainOut', 'main', outputNodeRefCounts); + main.parent = agg; + chai_1.assert.equal(raw.getSource(), 'rawOut'); + chai_1.assert.equal(main.getSource(), 'mainOut'); + var data = assemble_1.assembleRootData({ + sources: { named: src }, + outputNodes: { out: main }, + outputNodeRefCounts: outputNodeRefCounts, + isFaceted: false + }, {}); + chai_1.assert.deepEqual(data, [{ + name: 'source_0', + url: 'foo.csv', + format: { type: 'csv' } + }, { + name: 'data_0', + source: 'source_0', + transform: [{ + type: 'window', + ops: ['row_number'], + fields: [null], + params: [null], + sort: { + field: ["f"], + order: ["ascending"], + }, + ignorePeers: false, + as: ['ordered_row_number'], + frame: [null, 0], + groupby: ['f'] + }] + } + ]); + }); + it('should assemble named datasets with datastore', function () { + var src = new source_1.SourceNode({ name: 'foo' }); + var outputNodeRefCounts = {}; + var main = new dataflow_1.OutputNode(null, 'mainOut', 'main', outputNodeRefCounts); + main.parent = src; + var data = assemble_1.assembleRootData({ + sources: { named: src }, + outputNodes: { out: main }, + outputNodeRefCounts: outputNodeRefCounts, + isFaceted: false + }, { + foo: [1, 2, 3] + }); + chai_1.assert.deepEqual(data, [{ + name: 'foo', + values: [1, 2, 3] + }]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL2Fzc2VtYmxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLGlFQUFrRTtBQUNsRSwrREFBb0U7QUFDcEUsK0RBQThEO0FBQzlELDJEQUE0RDtBQUM1RCwyREFBcUU7QUFJckUsUUFBUSxDQUFDLHVCQUF1QixFQUFFO0lBQ2hDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7UUFDdkIsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLElBQU0sR0FBRyxHQUFHLElBQUksbUJBQVUsQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1lBQy9CLElBQU0sSUFBSSxHQUFHLElBQUkscUJBQVUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBRWxCLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBRTFDLElBQU0sSUFBSSxHQUFHLDJCQUFnQixDQUFDO2dCQUM1QixPQUFPLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDO2dCQUNyQixXQUFXLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDO2dCQUN4QixtQkFBbUIscUJBQUE7Z0JBQ25CLFNBQVMsRUFBRSxLQUFLO2FBQ2pCLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFFUCxhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtBZ2dyZWdhdGVOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge2Fzc2VtYmxlUm9vdERhdGF9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvYXNzZW1ibGUnO1xuaW1wb3J0IHtPdXRwdXROb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93JztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9zb3VyY2UnO1xuaW1wb3J0IHtXaW5kb3dUcmFuc2Zvcm1Ob2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3dpbmRvdyc7XG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zZm9ybSc7XG5pbXBvcnQge1ZnRGF0YX0gZnJvbSAnLi4vLi4vLi4vc3JjL3ZlZ2Euc2NoZW1hJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9hc3NlbWJsZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlRGF0YScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGFzc2VtYmxlIG5hbWVkIGRhdGEgc291cmNlJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3JjID0gbmV3IFNvdXJjZU5vZGUoe25hbWU6ICdmb28nfSk7XG4gICAgICBjb25zdCBvdXRwdXROb2RlUmVmQ291bnRzID0ge307XG4gICAgICBjb25zdCBtYWluID0gbmV3IE91dHB1dE5vZGUobnVsbCwgJ21haW5PdXQnLCAnbWFpbicsIG91dHB1dE5vZGVSZWZDb3VudHMpO1xuICAgICAgbWFpbi5wYXJlbnQgPSBzcmM7XG5cbiAgICAgIGFzc2VydC5lcXVhbChtYWluLmdldFNvdXJjZSgpLCAnbWFpbk91dCcpO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXNzZW1ibGVSb290RGF0YSh7XG4gICAgICAgIHNvdXJjZXM6IHtuYW1lZDogc3JjfSxcbiAgICAgICAgb3V0cHV0Tm9kZXM6IHtvdXQ6IG1haW59LFxuICAgICAgICBvdXRwdXROb2RlUmVmQ291bnRzLFxuICAgICAgICBpc0ZhY2V0ZWQ6IGZhbHNlXG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChkYXRhLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0YVswXS5uYW1lLCBcImZvb1wiKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXNzZW1ibGUgcmF3IGFuZCBtYWluIG91dHB1dCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHNyYyA9IG5ldyBTb3VyY2VOb2RlKHt1cmw6ICdmb28uY3N2J30pO1xuICAgICAgY29uc3Qgb3V0cHV0Tm9kZVJlZkNvdW50cyA9IHt9O1xuICAgICAgY29uc3QgcmF3ID0gbmV3IE91dHB1dE5vZGUobnVsbCwgJ3Jhd091dCcsICdyYXcnLCBvdXRwdXROb2RlUmVmQ291bnRzKTtcbiAgICAgIHJhdy5wYXJlbnQgPSBzcmM7XG4gICAgICBjb25zdCBhZ2cgPSBuZXcgQWdncmVnYXRlTm9kZShudWxsLCB7YTogdHJ1ZX0sIHtiOiB7Y291bnQ6ICdjb3VudF8qJ319KTtcbiAgICAgIGFnZy5wYXJlbnQgPSByYXc7XG4gICAgICBjb25zdCBtYWluID0gbmV3IE91dHB1dE5vZGUobnVsbCwgJ21haW5PdXQnLCAnbWFpbicsIG91dHB1dE5vZGVSZWZDb3VudHMpO1xuICAgICAgbWFpbi5wYXJlbnQgPSBhZ2c7XG5cbiAgICAgIGFzc2VydC5lcXVhbChyYXcuZ2V0U291cmNlKCksICdyYXdPdXQnKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYWluLmdldFNvdXJjZSgpLCAnbWFpbk91dCcpO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXNzZW1ibGVSb290RGF0YSh7XG4gICAgICAgIHNvdXJjZXM6IHtuYW1lZDogc3JjfSxcbiAgICAgICAgb3V0cHV0Tm9kZXM6IHtvdXQ6IG1haW59LFxuICAgICAgICBvdXRwdXROb2RlUmVmQ291bnRzLFxuICAgICAgICBpc0ZhY2V0ZWQ6IGZhbHNlXG4gICAgICB9LCB7fSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdEYXRhW10+KGRhdGEsIFt7XG4gICAgICAgIG5hbWU6ICdzb3VyY2VfMCcsXG4gICAgICAgIHVybDogJ2Zvby5jc3YnLFxuICAgICAgICBmb3JtYXQ6IHt0eXBlOiAnY3N2J31cbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ2RhdGFfMCcsXG4gICAgICAgIHNvdXJjZTogJ3NvdXJjZV8wJyxcbiAgICAgICAgdHJhbnNmb3JtOiBbe1xuICAgICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICAgIGdyb3VwYnk6IFsnYSddLFxuICAgICAgICAgIG9wczogWydjb3VudCddLFxuICAgICAgICAgIGZpZWxkczogWydiJ10sXG4gICAgICAgICAgYXM6IFsnY291bnRfKiddXG4gICAgICAgIH1dfVxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFzc2VtYmxlIHdpbmRvdyB0cmFuc2Zvcm0gbm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNyYyA9IG5ldyBTb3VyY2VOb2RlKHt1cmw6ICdmb28uY3N2J30pO1xuICAgICAgY29uc3Qgb3V0cHV0Tm9kZVJlZkNvdW50cyA9IHt9O1xuICAgICAgY29uc3QgcmF3ID0gbmV3IE91dHB1dE5vZGUobnVsbCwgJ3Jhd091dCcsICdyYXcnLCBvdXRwdXROb2RlUmVmQ291bnRzKTtcbiAgICAgIHJhdy5wYXJlbnQgPSBzcmM7XG4gICAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybSA9IHtcbiAgICAgICAgd2luZG93OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgb3A6ICdyb3dfbnVtYmVyJyxcbiAgICAgICAgICAgIGFzOiAnb3JkZXJlZF9yb3dfbnVtYmVyJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpZ25vcmVQZWVyczogZmFsc2UsXG4gICAgICAgIHNvcnQ6XG4gICAgICAgICAgW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWVsZDonZicsXG4gICAgICAgICAgICAgIG9yZGVyOidhc2NlbmRpbmcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgZ3JvdXBieTogWydmJ10sXG4gICAgICAgIGZyYW1lOiBbbnVsbCwgMF1cbiAgICAgIH07XG4gICAgICBjb25zdCBhZ2cgPSBuZXcgV2luZG93VHJhbnNmb3JtTm9kZShudWxsLCB0cmFuc2Zvcm0pO1xuICAgICAgYWdnLnBhcmVudCA9IHJhdztcbiAgICAgIGNvbnN0IG1haW4gPSBuZXcgT3V0cHV0Tm9kZShudWxsLCAnbWFpbk91dCcsICdtYWluJywgb3V0cHV0Tm9kZVJlZkNvdW50cyk7XG4gICAgICBtYWluLnBhcmVudCA9IGFnZztcblxuICAgICAgYXNzZXJ0LmVxdWFsKHJhdy5nZXRTb3VyY2UoKSwgJ3Jhd091dCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1haW4uZ2V0U291cmNlKCksICdtYWluT3V0Jyk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhc3NlbWJsZVJvb3REYXRhKHtcbiAgICAgICAgc291cmNlczoge25hbWVkOiBzcmN9LFxuICAgICAgICBvdXRwdXROb2Rlczoge291dDogbWFpbn0sXG4gICAgICAgIG91dHB1dE5vZGVSZWZDb3VudHMsXG4gICAgICAgIGlzRmFjZXRlZDogZmFsc2VcbiAgICAgIH0sIHt9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ0RhdGFbXT4oZGF0YSwgW3tcbiAgICAgICAgbmFtZTogJ3NvdXJjZV8wJyxcbiAgICAgICAgdXJsOiAnZm9vLmNzdicsXG4gICAgICAgIGZvcm1hdDoge3R5cGU6ICdjc3YnfVxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnZGF0YV8wJyxcbiAgICAgICAgc291cmNlOiAnc291cmNlXzAnLFxuICAgICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgICAgdHlwZTogJ3dpbmRvdycsXG4gICAgICAgICAgb3BzOiBbJ3Jvd19udW1iZXInXSxcbiAgICAgICAgICBmaWVsZHM6IFtudWxsXSxcbiAgICAgICAgICBwYXJhbXM6IFtudWxsXSxcbiAgICAgICAgICBzb3J0IDoge1xuICAgICAgICAgICAgZmllbGQ6IFtcImZcIl0sXG4gICAgICAgICAgICBvcmRlcjogW1wiYXNjZW5kaW5nXCJdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgICAgIGFzOiBbJ29yZGVyZWRfcm93X251bWJlciddLFxuICAgICAgICAgIGZyYW1lOiBbbnVsbCwgMF0sXG4gICAgICAgICAgZ3JvdXBieTogWydmJ11cbiAgICAgICAgfV19XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXNzZW1ibGUgbmFtZWQgZGF0YXNldHMgd2l0aCBkYXRhc3RvcmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcmMgPSBuZXcgU291cmNlTm9kZSh7bmFtZTogJ2Zvbyd9KTtcbiAgICAgIGNvbnN0IG91dHB1dE5vZGVSZWZDb3VudHMgPSB7fTtcbiAgICAgIGNvbnN0IG1haW4gPSBuZXcgT3V0cHV0Tm9kZShudWxsLCAnbWFpbk91dCcsICdtYWluJywgb3V0cHV0Tm9kZVJlZkNvdW50cyk7XG4gICAgICBtYWluLnBhcmVudCA9IHNyYztcblxuICAgICAgY29uc3QgZGF0YSA9IGFzc2VtYmxlUm9vdERhdGEoe1xuICAgICAgICBzb3VyY2VzOiB7bmFtZWQ6IHNyY30sXG4gICAgICAgIG91dHB1dE5vZGVzOiB7b3V0OiBtYWlufSxcbiAgICAgICAgb3V0cHV0Tm9kZVJlZkNvdW50cyxcbiAgICAgICAgaXNGYWNldGVkOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBmb286IFsxLDIsM11cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnRGF0YVtdPihkYXRhLCBbe1xuICAgICAgICBuYW1lOiAnZm9vJyxcbiAgICAgICAgdmFsdWVzOiBbMSwyLDNdXG4gICAgICB9XSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/data/bin.test.d.ts b/build/test/compile/data/bin.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/bin.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/bin.test.js b/build/test/compile/data/bin.test.js new file mode 100644 index 0000000000..6a557ffb6b --- /dev/null +++ b/build/test/compile/data/bin.test.js @@ -0,0 +1,161 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var bin_1 = require("../../../src/compile/data/bin"); +var util_1 = require("../../util"); +function assembleFromEncoding(model) { + return bin_1.BinNode.makeFromEncoding(null, model).assemble(); +} +function assembleFromTransform(model, t) { + return bin_1.BinNode.makeFromTransform(null, t, model).assemble(); +} +describe('compile/data/bin', function () { + it('should add bin transform and correctly apply bin with custom extent', function () { + var model = util_1.parseUnitModelWithScale({ + mark: 'point', + encoding: { + y: { + bin: { extent: [0, 100] }, + 'field': 'Acceleration', + 'type': 'quantitative' + } + } + }); + chai_1.assert.deepEqual(assembleFromEncoding(model)[0], { + type: 'bin', + field: 'Acceleration', + as: ['bin_extent_0_100_maxbins_10_Acceleration', 'bin_extent_0_100_maxbins_10_Acceleration_end'], + maxbins: 10, + extent: [0, 100], + signal: "bin_extent_0_100_maxbins_10_Acceleration_bins", + }); + }); + it('should add bin transform and correctly apply bin for binned field without custom extent', function () { + var model = util_1.parseUnitModelWithScale({ + mark: 'point', + encoding: { + y: { + bin: true, + 'field': 'Acceleration', + 'type': 'quantitative' + } + } + }); + var transform = assembleFromEncoding(model); + chai_1.assert.deepEqual(transform.length, 2); + chai_1.assert.deepEqual(transform[0], { + type: 'extent', + field: 'Acceleration', + signal: 'bin_maxbins_10_Acceleration_extent' + }); + chai_1.assert.deepEqual(transform[1], { + type: 'bin', + field: 'Acceleration', + as: ['bin_maxbins_10_Acceleration', 'bin_maxbins_10_Acceleration_end'], + maxbins: 10, + signal: 'bin_maxbins_10_Acceleration_bins', + extent: { signal: 'bin_maxbins_10_Acceleration_extent' } + }); + }); + it('should apply the bin transform only once for a binned field encoded in multiple channels', function () { + var model = util_1.parseUnitModelWithScale({ + data: { url: "data/movies.json" }, + mark: "circle", + encoding: { + x: { + bin: true, + field: "Rotten_Tomatoes_Rating", + type: "quantitative" + }, + color: { + bin: { "maxbins": 10 }, + field: "Rotten_Tomatoes_Rating", + type: "ordinal" + } + } + }); + var transform = assembleFromEncoding(model); + chai_1.assert.deepEqual(transform.length, 3); + chai_1.assert.deepEqual(transform[0], { + type: 'extent', + field: 'Rotten_Tomatoes_Rating', + signal: 'bin_maxbins_10_Rotten_Tomatoes_Rating_extent' + }); + chai_1.assert.deepEqual(transform[1], { + type: 'bin', + field: 'Rotten_Tomatoes_Rating', + as: ['bin_maxbins_10_Rotten_Tomatoes_Rating', + 'bin_maxbins_10_Rotten_Tomatoes_Rating_end'], + signal: 'bin_maxbins_10_Rotten_Tomatoes_Rating_bins', + maxbins: 10, + extent: { signal: 'bin_maxbins_10_Rotten_Tomatoes_Rating_extent' } + }); + chai_1.assert.deepEqual(transform[2], { + type: 'formula', + as: 'bin_maxbins_10_Rotten_Tomatoes_Rating_range', + expr: "datum[\"bin_maxbins_10_Rotten_Tomatoes_Rating\"] === null || isNaN(datum[\"bin_maxbins_10_Rotten_Tomatoes_Rating\"]) ? \"null\" : format(datum[\"bin_maxbins_10_Rotten_Tomatoes_Rating\"], \"\") + \" - \" + format(datum[\"bin_maxbins_10_Rotten_Tomatoes_Rating_end\"], \"\")" + }); + }); + it('should add bin transform from transform array and correctly apply bin with custom extent', function () { + var t = { + bin: { extent: [0, 100] }, + field: 'Acceleration', + as: 'binned_acceleration' + }; + var model = util_1.parseUnitModelWithScale({ + data: { url: "data/movies.json" }, + mark: "circle", + transform: [t], + encoding: { + x: { + field: "Rotten_Tomatoes_Rating", + type: "quantitative" + }, + color: { + field: "Rotten_Tomatoes_Rating", + type: "quantitative" + } + } + }); + chai_1.assert.deepEqual(assembleFromTransform(model, t)[0], { + type: 'bin', + field: 'Acceleration', + "maxbins": 10, + as: ['binned_acceleration', 'binned_acceleration_end'], + extent: [0, 100], + signal: "bin_extent_0_100_maxbins_10_Acceleration_bins", + }); + }); + it('should add bin transform from transform array and correctly apply bin with custom extent', function () { + var t = { + bin: { extent: [0, 100], maxbins: 20 }, + field: 'Acceleration', + as: 'binned_acceleration' + }; + var model = util_1.parseUnitModelWithScale({ + data: { url: "data/movies.json" }, + mark: "circle", + transform: [t], + encoding: { + x: { + field: "Rotten_Tomatoes_Rating", + type: "quantitative" + }, + color: { + field: "Rotten_Tomatoes_Rating", + type: "quantitative" + } + } + }); + chai_1.assert.deepEqual(assembleFromTransform(model, t)[0], { + type: 'bin', + field: 'Acceleration', + "maxbins": 20, + as: ['binned_acceleration', 'binned_acceleration_end'], + extent: [0, 100], + signal: "bin_extent_0_100_maxbins_20_Acceleration_bins", + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9iaW4udGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOztBQUU5Qiw2QkFBNEI7QUFFNUIscURBQXNEO0FBSXRELG1DQUFtRDtBQUVuRCw4QkFBOEIsS0FBcUI7SUFDakQsT0FBTyxhQUFPLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzFELENBQUM7QUFFRCwrQkFBK0IsS0FBWSxFQUFFLENBQWU7SUFDMUQsT0FBTyxhQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUM5RCxDQUFDO0FBRUQsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLEVBQUUsQ0FBQyxxRUFBcUUsRUFBRTtRQUN4RSxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztZQUNwQyxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRTtnQkFDUixDQUFDLEVBQUU7b0JBQ0QsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFDO29CQUN2QixPQUFPLEVBQUUsY0FBYztvQkFDdkIsTUFBTSxFQUFFLGNBQWM7aUJBQ3ZCO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxhQUFNLENBQUMsU0FBUyxDQUFjLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzVELElBQUksRUFBRSxLQUFLO1lBQ1gsS0FBSyxFQUFFLGNBQWM7WUFDckIsRUFBRSxFQUFFLENBQUMsMENBQTBDLEVBQUUsOENBQThDLENBQUM7WUFDaEcsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQ2hCLE1B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LENBQUM7WUFDcEMsSUFBSSxFQUFFLEVBQUMsR0FBRyxFQUFFLGtCQUFrQixFQUFDO1lBQy9CLElBQUksRUFBRSxRQUFRO1lBQ2QsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2QsUUFBUSxFQUFFO2dCQUNSLENBQUMsRUFBRTtvQkFDRCxLQUFLLEVBQUUsd0JBQXdCO29CQUMvQixJQUFJLEVBQUUsY0FBYztpQkFDckI7Z0JBQ0QsS0FBSyxFQUFFO29CQUNMLEtBQUssRUFBRSx3QkFBd0I7b0JBQy9CLElBQUksRUFBRSxjQUFjO2lCQUNyQjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBYyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDaEUsSUFBSSxFQUFFLEtBQUs7WUFDWCxLQUFLLEVBQUUsY0FBYztZQUNyQixTQUFTLEVBQUUsRUFBRTtZQUNiLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixFQUFFLHlCQUF5QixDQUFDO1lBQ3RELE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDaEIsTUFBTSxFQUFFLCtDQUErQztTQUN4RCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcblxuaW1wb3J0IHtCaW5Ob2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Jpbic7XG5pbXBvcnQge01vZGVsLCBNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbW9kZWwnO1xuaW1wb3J0IHtCaW5UcmFuc2Zvcm19IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2Zvcm0nO1xuaW1wb3J0IHtWZ1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vLi4vc3JjL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5mdW5jdGlvbiBhc3NlbWJsZUZyb21FbmNvZGluZyhtb2RlbDogTW9kZWxXaXRoRmllbGQpIHtcbiAgcmV0dXJuIEJpbk5vZGUubWFrZUZyb21FbmNvZGluZyhudWxsLCBtb2RlbCkuYXNzZW1ibGUoKTtcbn1cblxuZnVuY3Rpb24gYXNzZW1ibGVGcm9tVHJhbnNmb3JtKG1vZGVsOiBNb2RlbCwgdDogQmluVHJhbnNmb3JtKSB7XG4gIHJldHVybiBCaW5Ob2RlLm1ha2VGcm9tVHJhbnNmb3JtKG51bGwsIHQsIG1vZGVsKS5hc3NlbWJsZSgpO1xufVxuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL2JpbicsIGZ1bmN0aW9uKCkge1xuICBpdCgnc2hvdWxkIGFkZCBiaW4gdHJhbnNmb3JtIGFuZCBjb3JyZWN0bHkgYXBwbHkgYmluIHdpdGggY3VzdG9tIGV4dGVudCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgIHk6IHtcbiAgICAgICAgICBiaW46IHtleHRlbnQ6IFswLCAxMDBdfSxcbiAgICAgICAgICAnZmllbGQnOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgICAgICAndHlwZSc6ICdxdWFudGl0YXRpdmUnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGFzc2VydC5kZWVwRXF1YWw8VmdUcmFuc2Zvcm0+KGFzc2VtYmxlRnJvbUVuY29kaW5nKG1vZGVsKVswXSwge1xuICAgICAgdHlwZTogJ2JpbicsXG4gICAgICBmaWVsZDogJ0FjY2VsZXJhdGlvbicsXG4gICAgICBhczogWydiaW5fZXh0ZW50XzBfMTAwX21heGJpbnNfMTBfQWNjZWxlcmF0aW9uJywgJ2Jpbl9leHRlbnRfMF8xMDBfbWF4Ymluc18xMF9BY2NlbGVyYXRpb25fZW5kJ10sXG4gICAgICBtYXhiaW5zOiAxMCxcbiAgICAgIGV4dGVudDogWzAsIDEwMF0sXG4gICAgICBzaWduYWw6IFwiYmluX2V4dGVudF8wXzEwMF9tYXhiaW5zXzEwX0FjY2VsZXJhdGlvbl9iaW5zXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0ICgnc2hvdWxkIGFkZCBiaW4gdHJhbnNmb3JtIGFuZCBjb3JyZWN0bHkgYXBwbHkgYmluIGZvciBiaW5uZWQgZmllbGQgd2l0aG91dCBjdXN0b20gZXh0ZW50JywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgIHk6IHtcbiAgICAgICAgICBiaW46IHRydWUsXG4gICAgICAgICAgJ2ZpZWxkJzogJ0FjY2VsZXJhdGlvbicsXG4gICAgICAgICAgJ3R5cGUnOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gYXNzZW1ibGVGcm9tRW5jb2RpbmcobW9kZWwpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwodHJhbnNmb3JtLmxlbmd0aCwgMik7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybT4odHJhbnNmb3JtWzBdLCB7XG4gICAgICB0eXBlOiAnZXh0ZW50JyxcbiAgICAgIGZpZWxkOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgIHNpZ25hbDogJ2Jpbl9tYXhiaW5zXzEwX0FjY2VsZXJhdGlvbl9leHRlbnQnXG4gICAgfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybT4odHJhbnNmb3JtWzFdLCB7XG4gICAgICB0eXBlOiAnYmluJyxcbiAgICAgIGZpZWxkOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgIGFzOiBbJ2Jpbl9tYXhiaW5zXzEwX0FjY2VsZXJhdGlvbicsICdiaW5fbWF4Ymluc18xMF9BY2NlbGVyYXRpb25fZW5kJ10sXG4gICAgICBtYXhiaW5zOiAxMCxcbiAgICAgIHNpZ25hbDogJ2Jpbl9tYXhiaW5zXzEwX0FjY2VsZXJhdGlvbl9iaW5zJyxcbiAgICAgIGV4dGVudDoge3NpZ25hbDogJ2Jpbl9tYXhiaW5zXzEwX0FjY2VsZXJhdGlvbl9leHRlbnQnfVxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFwcGx5IHRoZSBiaW4gdHJhbnNmb3JtIG9ubHkgb25jZSBmb3IgYSBiaW5uZWQgZmllbGQgZW5jb2RlZCBpbiBtdWx0aXBsZSBjaGFubmVscycsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgIGRhdGE6IHt1cmw6IFwiZGF0YS9tb3ZpZXMuanNvblwifSxcbiAgICAgIG1hcms6IFwiY2lyY2xlXCIsXG4gICAgICBlbmNvZGluZzoge1xuICAgICAgICB4OiB7XG4gICAgICAgICAgYmluOiB0cnVlLFxuICAgICAgICAgIGZpZWxkOiBcIlJvdHRlbl9Ub21hdG9lc19SYXRpbmdcIixcbiAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgYmluOiB7XCJtYXhiaW5zXCI6IDEwfSxcbiAgICAgICAgICBmaWVsZDogXCJSb3R0ZW5fVG9tYXRvZXNfUmF0aW5nXCIsXG4gICAgICAgICAgdHlwZTogXCJvcmRpbmFsXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHRyYW5zZm9ybSA9IGFzc2VtYmxlRnJvbUVuY29kaW5nKG1vZGVsKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHRyYW5zZm9ybS5sZW5ndGgsIDMpO1xuICAgIGFzc2VydC5kZWVwRXF1YWw8VmdUcmFuc2Zvcm0+KHRyYW5zZm9ybVswXSwge1xuICAgICAgdHlwZTogJ2V4dGVudCcsXG4gICAgICBmaWVsZDogJ1JvdHRlbl9Ub21hdG9lc19SYXRpbmcnLFxuICAgICAgc2lnbmFsOiAnYmluX21heGJpbnNfMTBfUm90dGVuX1RvbWF0b2VzX1JhdGluZ19leHRlbnQnXG4gICAgfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybT4odHJhbnNmb3JtWzFdLCB7XG4gICAgICB0eXBlOiAnYmluJyxcbiAgICAgIGZpZWxkOiAnUm90dGVuX1RvbWF0b2VzX1JhdGluZycsXG4gICAgICBhczpcbiAgICAgIFsgJ2Jpbl9tYXhiaW5zXzEwX1JvdHRlbl9Ub21hdG9lc19SYXRpbmcnLFxuICAgICAgICAnYmluX21heGJpbnNfMTBfUm90dGVuX1RvbWF0b2VzX1JhdGluZ19lbmQnIF0sXG4gICAgICBzaWduYWw6ICdiaW5fbWF4Ymluc18xMF9Sb3R0ZW5fVG9tYXRvZXNfUmF0aW5nX2JpbnMnLFxuICAgICAgbWF4YmluczogMTAsXG4gICAgICBleHRlbnQ6IHtzaWduYWw6ICdiaW5fbWF4Ymluc18xMF9Sb3R0ZW5fVG9tYXRvZXNfUmF0aW5nX2V4dGVudCd9XG4gICAgfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybT4odHJhbnNmb3JtWzJdLCB7XG4gICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICBhczogJ2Jpbl9tYXhiaW5zXzEwX1JvdHRlbl9Ub21hdG9lc19SYXRpbmdfcmFuZ2UnLFxuICAgICAgZXhwcjogYGRhdHVtW1wiYmluX21heGJpbnNfMTBfUm90dGVuX1RvbWF0b2VzX1JhdGluZ1wiXSA9PT0gbnVsbCB8fCBpc05hTihkYXR1bVtcImJpbl9tYXhiaW5zXzEwX1JvdHRlbl9Ub21hdG9lc19SYXRpbmdcIl0pID8gXCJudWxsXCIgOiBmb3JtYXQoZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9Sb3R0ZW5fVG9tYXRvZXNfUmF0aW5nXCJdLCBcIlwiKSArIFwiIC0gXCIgKyBmb3JtYXQoZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9Sb3R0ZW5fVG9tYXRvZXNfUmF0aW5nX2VuZFwiXSwgXCJcIilgXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWRkIGJpbiB0cmFuc2Zvcm0gZnJvbSB0cmFuc2Zvcm0gYXJyYXkgYW5kIGNvcnJlY3RseSBhcHBseSBiaW4gd2l0aCBjdXN0b20gZXh0ZW50JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgdDogQmluVHJhbnNmb3JtID0ge1xuICAgICAgYmluOiB7ZXh0ZW50OiBbMCwgMTAwXX0sXG4gICAgICBmaWVsZDogJ0FjY2VsZXJhdGlvbicsXG4gICAgICBhczogJ2Jpbm5lZF9hY2NlbGVyYXRpb24nXG4gICAgfTtcblxuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgZGF0YToge3VybDogXCJkYXRhL21vdmllcy5qc29uXCJ9LFxuICAgICAgbWFyazogXCJjaXJjbGVcIixcbiAgICAgIHRyYW5zZm9ybTogW3RdLFxuICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgeDoge1xuICAgICAgICAgIGZpZWxkOiBcIlJvdHRlbl9Ub21hdG9lc19SYXRpbmdcIixcbiAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgZmllbGQ6IFwiUm90dGVuX1RvbWF0b2VzX1JhdGluZ1wiLFxuICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybT4oYXNzZW1ibGVGcm9tVHJhbnNmb3JtKG1vZGVsLCB0KVswXSwge1xuICAgICAgdHlwZTogJ2JpbicsXG4gICAgICBmaWVsZDogJ0FjY2VsZXJhdGlvbicsXG4gICAgICBcIm1heGJpbnNcIjogMTAsXG4gICAgICBhczogWydiaW5uZWRfYWNjZWxlcmF0aW9uJywgJ2Jpbm5lZF9hY2NlbGVyYXRpb25fZW5kJ10sXG4gICAgICBleHRlbnQ6IFswLCAxMDBdLFxuICAgICAgc2lnbmFsOiBcImJpbl9leHRlbnRfMF8xMDBfbWF4Ymluc18xMF9BY2NlbGVyYXRpb25fYmluc1wiLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGFkZCBiaW4gdHJhbnNmb3JtIGZyb20gdHJhbnNmb3JtIGFycmF5IGFuZCBjb3JyZWN0bHkgYXBwbHkgYmluIHdpdGggY3VzdG9tIGV4dGVudCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHQ6IEJpblRyYW5zZm9ybSA9IHtcbiAgICAgIGJpbjoge2V4dGVudDogWzAsIDEwMF0sIG1heGJpbnM6IDIwfSxcbiAgICAgIGZpZWxkOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgIGFzOiAnYmlubmVkX2FjY2VsZXJhdGlvbidcbiAgICB9O1xuXG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICBkYXRhOiB7dXJsOiBcImRhdGEvbW92aWVzLmpzb25cIn0sXG4gICAgICBtYXJrOiBcImNpcmNsZVwiLFxuICAgICAgdHJhbnNmb3JtOiBbdF0sXG4gICAgICBlbmNvZGluZzoge1xuICAgICAgICB4OiB7XG4gICAgICAgICAgZmllbGQ6IFwiUm90dGVuX1RvbWF0b2VzX1JhdGluZ1wiLFxuICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgfSxcbiAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICBmaWVsZDogXCJSb3R0ZW5fVG9tYXRvZXNfUmF0aW5nXCIsXG4gICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsPFZnVHJhbnNmb3JtPihhc3NlbWJsZUZyb21UcmFuc2Zvcm0obW9kZWwsIHQpWzBdLCB7XG4gICAgICB0eXBlOiAnYmluJyxcbiAgICAgIGZpZWxkOiAnQWNjZWxlcmF0aW9uJyxcbiAgICAgIFwibWF4Ymluc1wiOiAyMCxcbiAgICAgIGFzOiBbJ2Jpbm5lZF9hY2NlbGVyYXRpb24nLCAnYmlubmVkX2FjY2VsZXJhdGlvbl9lbmQnXSxcbiAgICAgIGV4dGVudDogWzAsIDEwMF0sXG4gICAgICBzaWduYWw6IFwiYmluX2V4dGVudF8wXzEwMF9tYXhiaW5zXzIwX0FjY2VsZXJhdGlvbl9iaW5zXCIsXG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/data/calculate.test.d.ts b/build/test/compile/data/calculate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/calculate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/calculate.test.js b/build/test/compile/data/calculate.test.js new file mode 100644 index 0000000000..3a44f97c86 --- /dev/null +++ b/build/test/compile/data/calculate.test.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var calculate_1 = require("../../../src/compile/data/calculate"); +var util_1 = require("../../util"); +function assembleFromSortArray(model) { + var node = calculate_1.CalculateNode.parseAllForSortIndex(null, model); + return node.assemble(); +} +describe('compile/data/calculate', function () { + it('makeAllForSortIndex', function () { + var model = util_1.parseUnitModel({ + data: { + values: [ + { a: 'A', b: 28 }, { a: 'B', b: 55 }, { a: 'C', b: 43 } + ] + }, + mark: 'bar', + encoding: { + x: { field: 'a', type: 'ordinal', sort: ['B', 'A', 'C'] }, + y: { field: 'b', type: 'quantitative' } + } + }); + var nodes = assembleFromSortArray(model); + chai_1.assert.deepEqual(nodes, { + type: 'formula', + expr: "datum.a === 'B' ? 0 : datum.a === 'A' ? 1 : datum.a === 'C' ? 2 : 3", + as: 'x_a_sort_index' + }); + }); + it('calculateExpressionFromSortField', function () { + var expression = calculate_1.CalculateNode.calculateExpressionFromSortField('a', ["B", "A", "C"]); + chai_1.assert.equal(expression, "datum.a === 'B' ? 0 : datum.a === 'A' ? 1 : datum.a === 'C' ? 2 : 3"); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9jYWxjdWxhdGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDhCQUE4QjtBQUM5Qiw2QkFBNEI7QUFFNUIsaUVBQWtFO0FBRWxFLG1DQUEwQztBQUcxQywrQkFBK0IsS0FBcUI7SUFDbEQsSUFBTSxJQUFJLEdBQUcseUJBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFrQixDQUFDO0lBQzlFLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxRQUFRLENBQUMsd0JBQXdCLEVBQUU7SUFDakMsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1FBQ3hCLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7WUFDM0IsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRTtvQkFDTixFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUM7aUJBQy9DO2FBQ0Y7WUFDRCxJQUFJLEVBQUUsS0FBSztZQUNULFFBQVEsRUFBRTtnQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQztnQkFDdkQsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2FBQ3RDO1NBQ0osQ0FBQyxDQUFDO1FBQ0gsSUFBTSxLQUFLLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDdEIsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUscUVBQXFFO1lBQzNFLEVBQUUsRUFBRSxnQkFBZ0I7U0FDckIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0NBQWtDLEVBQUU7UUFDckMsSUFBTSxVQUFVLEdBQUcseUJBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEYsYUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUscUVBQXFFLENBQUMsQ0FBQztJQUNsRyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCB7Q2FsY3VsYXRlTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9jYWxjdWxhdGUnO1xuaW1wb3J0IHtNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbW9kZWwnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cblxuZnVuY3Rpb24gYXNzZW1ibGVGcm9tU29ydEFycmF5KG1vZGVsOiBNb2RlbFdpdGhGaWVsZCkge1xuICBjb25zdCBub2RlID0gQ2FsY3VsYXRlTm9kZS5wYXJzZUFsbEZvclNvcnRJbmRleChudWxsLCBtb2RlbCkgYXMgQ2FsY3VsYXRlTm9kZTtcbiAgcmV0dXJuIG5vZGUuYXNzZW1ibGUoKTtcbn1cblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9jYWxjdWxhdGUnLCAoKSA9PiB7XG4gIGl0KCdtYWtlQWxsRm9yU29ydEluZGV4JywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgZGF0YToge1xuICAgICAgICB2YWx1ZXM6IFtcbiAgICAgICAgICB7YTogJ0EnLGI6IDI4fSwge2E6ICdCJyxiOiA1NX0sIHthOiAnQycsYjogNDN9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnLCBzb3J0OiBbJ0InLCAnQScsICdDJ119LFxuICAgICAgICAgIHk6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IG5vZGVzID0gYXNzZW1ibGVGcm9tU29ydEFycmF5KG1vZGVsKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKG5vZGVzLCB7XG4gICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICBleHByOiBcImRhdHVtLmEgPT09ICdCJyA/IDAgOiBkYXR1bS5hID09PSAnQScgPyAxIDogZGF0dW0uYSA9PT0gJ0MnID8gMiA6IDNcIixcbiAgICAgIGFzOiAneF9hX3NvcnRfaW5kZXgnXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdjYWxjdWxhdGVFeHByZXNzaW9uRnJvbVNvcnRGaWVsZCcsICgpID0+IHtcbiAgICBjb25zdCBleHByZXNzaW9uID0gQ2FsY3VsYXRlTm9kZS5jYWxjdWxhdGVFeHByZXNzaW9uRnJvbVNvcnRGaWVsZCgnYScsIFtcIkJcIiwgXCJBXCIsIFwiQ1wiXSk7XG4gICAgYXNzZXJ0LmVxdWFsKGV4cHJlc3Npb24sIFwiZGF0dW0uYSA9PT0gJ0InID8gMCA6IGRhdHVtLmEgPT09ICdBJyA/IDEgOiBkYXR1bS5hID09PSAnQycgPyAyIDogM1wiKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/dataflow.test.d.ts b/build/test/compile/data/dataflow.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/dataflow.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/dataflow.test.js b/build/test/compile/data/dataflow.test.js new file mode 100644 index 0000000000..2103a76688 --- /dev/null +++ b/build/test/compile/data/dataflow.test.js @@ -0,0 +1,77 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +describe('compile/data/dataflow', function () { + describe('DataFlowNode', function () { + describe('swap', function () { + it('should correctly swap two nodes in a simple chain', function () { + var a = new dataflow_1.DataFlowNode(null, 'a'); + var b = new dataflow_1.DataFlowNode(a, 'b'); + var c = new dataflow_1.DataFlowNode(b, 'c'); + var d = new dataflow_1.DataFlowNode(c, 'd'); + c.swapWithParent(); + chai_1.assert.equal(a.numChildren(), 1); + chai_1.assert.equal(a.children[0].debugName, 'c'); + chai_1.assert.equal(b.numChildren(), 1); + chai_1.assert.equal(b.children[0].debugName, 'd'); + chai_1.assert.equal(c.numChildren(), 1); + chai_1.assert.equal(c.children[0].debugName, 'b'); + chai_1.assert.equal(d.numChildren(), 0); + }); + it('should correctly swap two nodes', function () { + var root = new dataflow_1.DataFlowNode(null, 'root'); + var parent = new dataflow_1.DataFlowNode(root, 'parent'); + var node = new dataflow_1.DataFlowNode(parent, 'node'); + var child1 = new dataflow_1.DataFlowNode(node, 'child1'); + var child2 = new dataflow_1.DataFlowNode(node, 'child2'); + var parentChild1 = new dataflow_1.DataFlowNode(parent, 'parentChild1'); + var parentChild2 = new dataflow_1.DataFlowNode(parent, 'parentChild2'); + node.swapWithParent(); + chai_1.assert.equal(root.numChildren(), 1); + chai_1.assert.equal(root.children[0].debugName, 'node'); + chai_1.assert.equal(node.parent.debugName, 'root'); + chai_1.assert.equal(node.numChildren(), 1); + chai_1.assert.equal(node.children[0].debugName, 'parent'); + chai_1.assert.equal(parent.parent.debugName, 'node'); + chai_1.assert.equal(parent.numChildren(), 4); + parent.children.forEach(function (c) { + chai_1.assert.equal(c.numChildren(), 0); + chai_1.assert.equal(c.parent.debugName, 'parent'); + }); + chai_1.assert.equal(child1.debugName, 'child1'); + chai_1.assert.equal(child2.debugName, 'child2'); + chai_1.assert.equal(parentChild1.debugName, 'parentChild1'); + chai_1.assert.equal(parentChild2.debugName, 'parentChild2'); + }); + }); + describe('remove', function () { + it('should remove node from dataflow', function () { + var a = new dataflow_1.DataFlowNode(null, 'a'); + var b = new dataflow_1.DataFlowNode(a, 'b'); + var c = new dataflow_1.DataFlowNode(b, 'c'); + chai_1.assert.deepEqual(a.children, [b]); + chai_1.assert.equal(b.parent, a); + chai_1.assert.equal(c.parent, b); + b.remove(); + chai_1.assert.deepEqual(a.children, [c]); + chai_1.assert.equal(c.parent, a); + }); + }); + describe('insertAsParentOf', function () { + it('should insert node into dataflow', function () { + var a = new dataflow_1.DataFlowNode(null, 'a'); + var anotherChild = new dataflow_1.DataFlowNode(a, 'a'); + var b = new dataflow_1.DataFlowNode(null, 'b'); + var c = new dataflow_1.DataFlowNode(a, 'c'); + b.insertAsParentOf(c); + chai_1.assert.sameDeepMembers(a.children, [anotherChild, b]); + chai_1.assert.equal(b.parent, a); + chai_1.assert.equal(c.parent, b); + chai_1.assert.equal(anotherChild.parent, a); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZsb3cudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL2RhdGFmbG93LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLCtEQUFnRTtBQUVoRSxRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsUUFBUSxDQUFDLGNBQWMsRUFBRTtRQUN2QixRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2YsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO2dCQUN0RCxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QyxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVuQyxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVuQyxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFZLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVuQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBRW5CLGFBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNqQyxhQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUUzQyxhQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDakMsYUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFFM0MsYUFBTSxDQUFDLEtBQUss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QUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRCLGFBQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN0RCxhQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLGFBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDMUIsYUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93JztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9kYXRhZmxvdycsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnRGF0YUZsb3dOb2RlJywgZnVuY3Rpb24oKSB7XG4gICAgZGVzY3JpYmUoJ3N3YXAnLCAoKSA9PiB7XG4gICAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBzd2FwIHR3byBub2RlcyBpbiBhIHNpbXBsZSBjaGFpbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBhID0gbmV3IERhdGFGbG93Tm9kZShudWxsLCAnYScpO1xuICAgICAgICBjb25zdCBiID0gbmV3IERhdGFGbG93Tm9kZShhLCAnYicpO1xuXG4gICAgICAgIGNvbnN0IGMgPSBuZXcgRGF0YUZsb3dOb2RlKGIsICdjJyk7XG5cbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRhRmxvd05vZGUoYywgJ2QnKTtcblxuICAgICAgICBjLnN3YXBXaXRoUGFyZW50KCk7XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKGEubnVtQ2hpbGRyZW4oKSwgMSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChhLmNoaWxkcmVuWzBdLmRlYnVnTmFtZSwgJ2MnKTtcblxuICAgICAgICBhc3NlcnQuZXF1YWwoYi5udW1DaGlsZHJlbigpLCAxKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGIuY2hpbGRyZW5bMF0uZGVidWdOYW1lLCAnZCcpO1xuXG4gICAgICAgIGFzc2VydC5lcXVhbChjLm51bUNoaWxkcmVuKCksIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoYy5jaGlsZHJlblswXS5kZWJ1Z05hbWUsICdiJyk7XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKGQubnVtQ2hpbGRyZW4oKSwgMCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgc3dhcCB0d28gbm9kZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3Qgcm9vdCA9IG5ldyBEYXRhRmxvd05vZGUobnVsbCwgJ3Jvb3QnKTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gbmV3IERhdGFGbG93Tm9kZShyb290LCAncGFyZW50Jyk7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IG5ldyBEYXRhRmxvd05vZGUocGFyZW50LCAnbm9kZScpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkMSA9IG5ldyBEYXRhRmxvd05vZGUobm9kZSwgJ2NoaWxkMScpO1xuICAgICAgICBjb25zdCBjaGlsZDIgPSBuZXcgRGF0YUZsb3dOb2RlKG5vZGUsICdjaGlsZDInKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRDaGlsZDEgPSBuZXcgRGF0YUZsb3dOb2RlKHBhcmVudCwgJ3BhcmVudENoaWxkMScpO1xuICAgICAgICBjb25zdCBwYXJlbnRDaGlsZDIgPSBuZXcgRGF0YUZsb3dOb2RlKHBhcmVudCwgJ3BhcmVudENoaWxkMicpO1xuXG4gICAgICAgIG5vZGUuc3dhcFdpdGhQYXJlbnQoKTtcblxuICAgICAgICBhc3NlcnQuZXF1YWwocm9vdC5udW1DaGlsZHJlbigpLCAxKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHJvb3QuY2hpbGRyZW5bMF0uZGVidWdOYW1lLCAnbm9kZScpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobm9kZS5wYXJlbnQuZGVidWdOYW1lLCAncm9vdCcpO1xuXG4gICAgICAgIGFzc2VydC5lcXVhbChub2RlLm51bUNoaWxkcmVuKCksIDEpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobm9kZS5jaGlsZHJlblswXS5kZWJ1Z05hbWUsICdwYXJlbnQnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHBhcmVudC5wYXJlbnQuZGVidWdOYW1lLCAnbm9kZScpO1xuXG4gICAgICAgIGFzc2VydC5lcXVhbChwYXJlbnQubnVtQ2hpbGRyZW4oKSwgNCk7XG4gICAgICAgIHBhcmVudC5jaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChjLm51bUNoaWxkcmVuKCksIDApO1xuICAgICAgICAgIGFzc2VydC5lcXVhbChjLnBhcmVudC5kZWJ1Z05hbWUsICdwYXJlbnQnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNoaWxkMS5kZWJ1Z05hbWUsICdjaGlsZDEnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNoaWxkMi5kZWJ1Z05hbWUsICdjaGlsZDInKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHBhcmVudENoaWxkMS5kZWJ1Z05hbWUsICdwYXJlbnRDaGlsZDEnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHBhcmVudENoaWxkMi5kZWJ1Z05hbWUsICdwYXJlbnRDaGlsZDInKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZW1vdmUgbm9kZSBmcm9tIGRhdGFmbG93JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IGEgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwsICdhJyk7XG4gICAgICAgIGNvbnN0IGIgPSBuZXcgRGF0YUZsb3dOb2RlKGEsICdiJyk7XG5cbiAgICAgICAgY29uc3QgYyA9IG5ldyBEYXRhRmxvd05vZGUoYiwgJ2MnKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuY2hpbGRyZW4sIFtiXSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChiLnBhcmVudCwgYSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChjLnBhcmVudCwgYik7XG5cbiAgICAgICAgYi5yZW1vdmUoKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKGEuY2hpbGRyZW4sIFtjXSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChjLnBhcmVudCwgYSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpbnNlcnRBc1BhcmVudE9mJywgZnVuY3Rpb24oKSB7XG4gICAgICBpdCgnc2hvdWxkIGluc2VydCBub2RlIGludG8gZGF0YWZsb3cnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBEYXRhRmxvd05vZGUobnVsbCwgJ2EnKTtcbiAgICAgICAgY29uc3QgYW5vdGhlckNoaWxkID0gbmV3IERhdGFGbG93Tm9kZShhLCAnYScpO1xuICAgICAgICBjb25zdCBiID0gbmV3IERhdGFGbG93Tm9kZShudWxsLCAnYicpO1xuICAgICAgICBjb25zdCBjID0gbmV3IERhdGFGbG93Tm9kZShhLCAnYycpO1xuXG4gICAgICAgIGIuaW5zZXJ0QXNQYXJlbnRPZihjKTtcblxuICAgICAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGEuY2hpbGRyZW4sIFthbm90aGVyQ2hpbGQsIGJdKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGIucGFyZW50LCBhKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGMucGFyZW50LCBiKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGFub3RoZXJDaGlsZC5wYXJlbnQsIGEpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/data/facet.test.d.ts b/build/test/compile/data/facet.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/facet.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/facet.test.js b/build/test/compile/data/facet.test.js new file mode 100644 index 0000000000..eb2798fbaa --- /dev/null +++ b/build/test/compile/data/facet.test.js @@ -0,0 +1,114 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var facet_1 = require("../../../src/compile/data/facet"); +var util_1 = require("../../util"); +describe('compile/data/facet', function () { + describe('assemble', function () { + it('should calculate column distinct if child has an independent discrete scale with step', function () { + var model = util_1.parseFacetModelWithScale({ + '$schema': 'https://vega.github.io/schema/vega-lite/v2.json', + 'description': 'A trellis bar chart showing the US population distribution of age groups and gender in 2000.', + 'data': { 'url': 'data/population.json' }, + 'facet': { 'column': { 'field': 'gender', 'type': 'nominal' } }, + 'spec': { + 'mark': 'bar', + 'encoding': { + 'y': { + 'aggregate': 'sum', 'field': 'people', 'type': 'quantitative', + 'axis': { 'title': 'population' } + }, + 'x': { + 'field': 'age', 'type': 'ordinal', + 'scale': { 'rangeStep': 17 } + }, + 'color': { + 'field': 'gender', 'type': 'nominal', + 'scale': { 'range': ['#EA98D2', '#659CCA'] } + } + } + }, + 'resolve': { + 'scale': { 'x': 'independent' } + }, + 'config': { 'view': { 'fill': 'yellow' } } + }); + var node = new facet_1.FacetNode(null, model, 'facetName', 'dataName'); + var data = node.assemble(); + chai_1.assert.deepEqual(data[0], { + name: 'column_domain', + source: 'dataName', + transform: [{ + type: 'aggregate', + groupby: ['gender'], + fields: ['age'], + ops: ['distinct'] + }] + }); + }); + it('should calculate column and row distinct if child has an independent discrete scale with step and the facet has both row and column', function () { + var model = util_1.parseFacetModelWithScale({ + '$schema': 'https://vega.github.io/schema/vega-lite/v2.json', + 'data': { 'values': [ + { 'r': 'r1', 'c': 'c1', 'a': 'a1', 'b': 'b1' }, + { 'r': 'r1', 'c': 'c1', 'a': 'a2', 'b': 'b2' }, + { 'r': 'r2', 'c': 'c2', 'a': 'a1', 'b': 'b1' }, + { 'r': 'r3', 'c': 'c2', 'a': 'a3', 'b': 'b2' } + ] }, + 'facet': { + 'row': { 'field': 'r', 'type': 'nominal' }, + 'column': { 'field': 'c', 'type': 'nominal' } + }, + 'spec': { + 'mark': 'rect', + 'encoding': { + 'y': { 'field': 'b', 'type': 'nominal' }, + 'x': { 'field': 'a', 'type': 'nominal' } + } + }, + 'resolve': { + 'scale': { + 'x': 'independent', + 'y': 'independent' + } + } + }); + var node = new facet_1.FacetNode(null, model, 'facetName', 'dataName'); + var data = node.assemble(); + // crossed data + chai_1.assert.deepEqual(data[0], { + name: 'cross_column_domain_row_domain', + source: 'dataName', + transform: [{ + type: 'aggregate', + groupby: ['c', 'r'], + fields: ['a', 'b'], + ops: ['distinct', 'distinct'] + }] + }); + chai_1.assert.deepEqual(data[1], { + name: 'column_domain', + source: 'cross_column_domain_row_domain', + transform: [{ + type: 'aggregate', + groupby: ['c'], + fields: ['distinct_a'], + ops: ['max'], + as: ['distinct_a'] + }] + }); + chai_1.assert.deepEqual(data[2], { + name: 'row_domain', + source: 'cross_column_domain_row_domain', + transform: [{ + type: 'aggregate', + groupby: ['r'], + fields: ['distinct_b'], + ops: ['max'], + as: ['distinct_b'] + }] + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL2ZhY2V0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIseURBQTBEO0FBQzFELG1DQUFvRDtBQUVwRCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNuQixFQUFFLENBQUMsdUZBQXVGLEVBQUU7WUFDMUYsSUFBTSxLQUFLLEdBQUcsK0JBQXdCLENBQUM7Z0JBQ3JDLFNBQVMsRUFBRSxpREFBaUQ7Z0JBQzVELGFBQWEsRUFBRSw4RkFBOEY7Z0JBQzdHLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBQztnQkFDdkMsT0FBTyxFQUFFLEVBQUMsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLEVBQUM7Z0JBQzNELE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsS0FBSztvQkFDYixVQUFVLEVBQUU7d0JBQ1YsR0FBRyxFQUFFOzRCQUNILFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBYzs0QkFDN0QsTUFBTSxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQzt5QkFDaEM7d0JBQ0QsR0FBRyxFQUFFOzRCQUNILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVM7NEJBQ2pDLE9BQU8sRUFBRSxFQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUM7eUJBQzNCO3dCQUNELE9BQU8sRUFBRTs0QkFDUCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTOzRCQUNwQyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLEVBQUM7eUJBQzFDO3FCQUNGO2lCQUNGO2dCQUNELFNBQVMsRUFB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QUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzt3QkFDbEIsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztxQkFDOUIsQ0FBQzthQUNILENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLEVBQUUsZUFBZTtnQkFDckIsTUFBTSxFQUFFLGdDQUFnQztnQkFDeEMsU0FBUyxFQUFDLENBQUM7d0JBQ1QsSUFBSSxFQUFFLFdBQVc7d0JBQ2pCLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQzt3QkFDZCxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUM7d0JBQ3RCLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQzt3QkFDWixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUM7cUJBQ25CLENBQUM7YUFDSCxDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLE1BQU0sRUFBRSxnQ0FBZ0M7Z0JBQ3hDLFNBQVMsRUFBQyxDQUFDO3dCQUNULElBQUksRUFBRSxXQUFXO3dCQUNqQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0JBQ2QsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO3dCQUN0QixHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7d0JBQ1osRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUNuQixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtGYWNldE5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZmFjZXQnO1xuaW1wb3J0IHtwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL2ZhY2V0JywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCdhc3NlbWJsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNhbGN1bGF0ZSBjb2x1bW4gZGlzdGluY3QgaWYgY2hpbGQgaGFzIGFuIGluZGVwZW5kZW50IGRpc2NyZXRlIHNjYWxlIHdpdGggc3RlcCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgJyRzY2hlbWEnOiAnaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby9zY2hlbWEvdmVnYS1saXRlL3YyLmpzb24nLFxuICAgICAgICAnZGVzY3JpcHRpb24nOiAnQSB0cmVsbGlzIGJhciBjaGFydCBzaG93aW5nIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGFuZCBnZW5kZXIgaW4gMjAwMC4nLFxuICAgICAgICAnZGF0YSc6IHsndXJsJzogJ2RhdGEvcG9wdWxhdGlvbi5qc29uJ30sXG4gICAgICAgICdmYWNldCc6IHsnY29sdW1uJzogeydmaWVsZCc6ICdnZW5kZXInLCAndHlwZSc6ICdub21pbmFsJ319LFxuICAgICAgICAnc3BlYyc6IHtcbiAgICAgICAgICAnbWFyayc6ICdiYXInLFxuICAgICAgICAgICdlbmNvZGluZyc6IHtcbiAgICAgICAgICAgICd5Jzoge1xuICAgICAgICAgICAgICAnYWdncmVnYXRlJzogJ3N1bScsICdmaWVsZCc6ICdwZW9wbGUnLCAndHlwZSc6ICdxdWFudGl0YXRpdmUnLFxuICAgICAgICAgICAgICAnYXhpcyc6IHsndGl0bGUnOiAncG9wdWxhdGlvbid9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJ3gnOiB7XG4gICAgICAgICAgICAgICdmaWVsZCc6ICdhZ2UnLCAndHlwZSc6ICdvcmRpbmFsJyxcbiAgICAgICAgICAgICAgJ3NjYWxlJzogeydyYW5nZVN0ZXAnOiAxN31cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnY29sb3InOiB7XG4gICAgICAgICAgICAgICdmaWVsZCc6ICdnZW5kZXInLCAndHlwZSc6ICdub21pbmFsJyxcbiAgICAgICAgICAgICAgJ3NjYWxlJzogeydyYW5nZSc6IFsnI0VBOThEMicsJyM2NTlDQ0EnXX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICdyZXNvbHZlJzoge1xuICAgICAgICAgICdzY2FsZSc6IHsneCc6ICdpbmRlcGVuZGVudCd9XG4gICAgICAgIH0sXG4gICAgICAgICdjb25maWcnOiB7J3ZpZXcnOiB7J2ZpbGwnOiAneWVsbG93J319XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBGYWNldE5vZGUobnVsbCwgbW9kZWwsICdmYWNldE5hbWUnLCAnZGF0YU5hbWUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBub2RlLmFzc2VtYmxlKCk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZGF0YVswXSwge1xuICAgICAgICBuYW1lOiAnY29sdW1uX2RvbWFpbicsXG4gICAgICAgIHNvdXJjZTogJ2RhdGFOYW1lJyxcbiAgICAgICAgdHJhbnNmb3JtOlt7XG4gICAgICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICAgICAgZ3JvdXBieTogWydnZW5kZXInXSxcbiAgICAgICAgICBmaWVsZHM6IFsnYWdlJ10sXG4gICAgICAgICAgb3BzOiBbJ2Rpc3RpbmN0J11cbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjYWxjdWxhdGUgY29sdW1uIGFuZCByb3cgZGlzdGluY3QgaWYgY2hpbGQgaGFzIGFuIGluZGVwZW5kZW50IGRpc2NyZXRlIHNjYWxlIHdpdGggc3RlcCBhbmQgdGhlIGZhY2V0IGhhcyBib3RoIHJvdyBhbmQgY29sdW1uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAnJHNjaGVtYSc6ICdodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuanNvbicsXG4gICAgICAgICdkYXRhJzogeyd2YWx1ZXMnOiBbXG4gICAgICAgICAgeydyJzogJ3IxJywgJ2MnOiAnYzEnLCAnYSc6ICdhMScsICdiJzogJ2IxJ30sXG4gICAgICAgICAgeydyJzogJ3IxJywgJ2MnOiAnYzEnLCAnYSc6ICdhMicsICdiJzogJ2IyJ30sXG4gICAgICAgICAgeydyJzogJ3IyJywgJ2MnOiAnYzInLCAnYSc6ICdhMScsICdiJzogJ2IxJ30sXG4gICAgICAgICAgeydyJzogJ3IzJywgJ2MnOiAnYzInLCAnYSc6ICdhMycsICdiJzogJ2IyJ31cbiAgICAgICAgXX0sXG4gICAgICAgICdmYWNldCc6IHtcbiAgICAgICAgICAncm93JzogeydmaWVsZCc6ICdyJywgJ3R5cGUnOiAnbm9taW5hbCd9LFxuICAgICAgICAgICdjb2x1bW4nOiB7J2ZpZWxkJzogJ2MnLCAndHlwZSc6ICdub21pbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgJ3NwZWMnOiB7XG4gICAgICAgICAgJ21hcmsnOiAncmVjdCcsXG4gICAgICAgICAgJ2VuY29kaW5nJzoge1xuICAgICAgICAgICAgJ3knOiB7J2ZpZWxkJzogJ2InLCAndHlwZSc6ICdub21pbmFsJ30sXG4gICAgICAgICAgICAneCc6IHsnZmllbGQnOiAnYScsICd0eXBlJzogJ25vbWluYWwnfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ3Jlc29sdmUnOiB7XG4gICAgICAgICAgJ3NjYWxlJzoge1xuICAgICAgICAgICAgJ3gnOiAnaW5kZXBlbmRlbnQnLFxuICAgICAgICAgICAgJ3knOiAnaW5kZXBlbmRlbnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgbm9kZSA9IG5ldyBGYWNldE5vZGUobnVsbCwgbW9kZWwsICdmYWNldE5hbWUnLCAnZGF0YU5hbWUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBub2RlLmFzc2VtYmxlKCk7XG5cbiAgICAgIC8vIGNyb3NzZWQgZGF0YVxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChkYXRhWzBdLCB7XG4gICAgICAgIG5hbWU6ICdjcm9zc19jb2x1bW5fZG9tYWluX3Jvd19kb21haW4nLFxuICAgICAgICBzb3VyY2U6ICdkYXRhTmFtZScsXG4gICAgICAgIHRyYW5zZm9ybTpbe1xuICAgICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICAgIGdyb3VwYnk6IFsnYycsICdyJ10sXG4gICAgICAgICAgZmllbGRzOiBbJ2EnLCAnYiddLFxuICAgICAgICAgIG9wczogWydkaXN0aW5jdCcsICdkaXN0aW5jdCddXG4gICAgICAgIH1dXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChkYXRhWzFdLCB7XG4gICAgICAgIG5hbWU6ICdjb2x1bW5fZG9tYWluJyxcbiAgICAgICAgc291cmNlOiAnY3Jvc3NfY29sdW1uX2RvbWFpbl9yb3dfZG9tYWluJyxcbiAgICAgICAgdHJhbnNmb3JtOlt7XG4gICAgICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICAgICAgZ3JvdXBieTogWydjJ10sXG4gICAgICAgICAgZmllbGRzOiBbJ2Rpc3RpbmN0X2EnXSxcbiAgICAgICAgICBvcHM6IFsnbWF4J10sXG4gICAgICAgICAgYXM6IFsnZGlzdGluY3RfYSddXG4gICAgICAgIH1dXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChkYXRhWzJdLCB7XG4gICAgICAgIG5hbWU6ICdyb3dfZG9tYWluJyxcbiAgICAgICAgc291cmNlOiAnY3Jvc3NfY29sdW1uX2RvbWFpbl9yb3dfZG9tYWluJyxcbiAgICAgICAgdHJhbnNmb3JtOlt7XG4gICAgICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICAgICAgZ3JvdXBieTogWydyJ10sXG4gICAgICAgICAgZmllbGRzOiBbJ2Rpc3RpbmN0X2InXSxcbiAgICAgICAgICBvcHM6IFsnbWF4J10sXG4gICAgICAgICAgYXM6IFsnZGlzdGluY3RfYiddXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/filter.test.d.ts b/build/test/compile/data/filter.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/filter.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/filter.test.js b/build/test/compile/data/filter.test.js new file mode 100644 index 0000000000..f3ed54e1ba --- /dev/null +++ b/build/test/compile/data/filter.test.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var data_1 = require("../../../src/compile/data"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var formatparse_1 = require("../../../src/compile/data/formatparse"); +var parse_1 = require("../../../src/compile/data/parse"); +var util_1 = require("../../util"); +describe('compile/data/filter', function () { + it('should create parse for filtered fields', function () { + var model = util_1.parseUnitModel({ + 'data': { 'url': 'a.json' }, + 'transform': [ + { 'filter': { 'field': 'a', 'equal': { year: 2000 } } }, + { 'filter': { 'field': 'b', 'oneOf': ['a', 'b'] } }, + { 'filter': { 'field': 'c', 'range': [{ year: 2000 }, { year: 2001 }] } }, + { 'filter': { 'field': 'd', 'range': [1, 2] } } + ], + 'mark': 'point', + encoding: {} + }); + var parse = {}; + // extract the parse from the parse nodes that were generated along with the filter nodes + var root = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + var node = root.children[0]; + while (node.numChildren() > 0) { + if (node instanceof formatparse_1.ParseNode) { + parse = tslib_1.__assign({}, parse, node.parse); + } + chai_1.assert.equal(node.numChildren(), 1); + node = node.children[0]; + } + chai_1.assert.deepEqual(parse, { + a: 'date', + b: 'string', + c: 'date', + d: 'number' + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9maWx0ZXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsa0RBQXdEO0FBQ3hELCtEQUFnRTtBQUNoRSxxRUFBZ0U7QUFDaEUseURBQW9FO0FBRXBFLG1DQUEwQztBQUUxQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1FBQzVDLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7WUFDM0IsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztZQUN6QixXQUFXLEVBQUU7Z0JBQ1gsRUFBQyxRQUFRLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsRUFBQyxFQUFDO2dCQUNqRCxFQUFDLFFBQVEsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDLEVBQUM7Z0JBQy9DLEVBQUMsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxFQUFDLEVBQUM7Z0JBQ2pFLEVBQUMsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBQzthQUM1QztZQUNELE1BQU0sRUFBRSxPQUFPO1lBQ2YsUUFBUSxFQUFFLEVBQUU7U0FDYixDQUFDLENBQUM7UUFFSCxJQUFJLEtBQUssR0FBaUIsRUFBRSxDQUFDO1FBRTdCLHlGQUF5RjtRQUN6RixJQUFNLElBQUksR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsMkJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFNUIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLElBQUksSUFBSSxZQUFZLHVCQUFTLEVBQUU7Z0JBQzdCLEtBQUssd0JBQU8sS0FBSyxFQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztZQUNELGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUU7WUFDdEIsQ0FBQyxFQUFFLE1BQU07WUFDVCxDQUFDLEVBQUUsUUFBUTtZQUNYLENBQUMsRUFBRSxNQUFNO1lBQ1QsQ0FBQyxFQUFFLFFBQVE7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtBbmNlc3RvclBhcnNlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93JztcbmltcG9ydCB7UGFyc2VOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Zvcm1hdHBhcnNlJztcbmltcG9ydCB7cGFyc2VUcmFuc2Zvcm1BcnJheX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9wYXJzZSc7XG5pbXBvcnQge0RpY3R9IGZyb20gJy4uLy4uLy4uL3NyYy91dGlsJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL2ZpbHRlcicsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBjcmVhdGUgcGFyc2UgZm9yIGZpbHRlcmVkIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICdkYXRhJzogeyd1cmwnOiAnYS5qc29uJ30sXG4gICAgICAndHJhbnNmb3JtJzogW1xuICAgICAgICB7J2ZpbHRlcic6IHsnZmllbGQnOiAnYScsICdlcXVhbCc6IHt5ZWFyOiAyMDAwfX19LFxuICAgICAgICB7J2ZpbHRlcic6IHsnZmllbGQnOiAnYicsICdvbmVPZic6IFsnYScsICdiJ119fSxcbiAgICAgICAgeydmaWx0ZXInOiB7J2ZpZWxkJzogJ2MnLCAncmFuZ2UnOiBbe3llYXI6IDIwMDB9LCB7eWVhcjogMjAwMX1dfX0sXG4gICAgICAgIHsnZmlsdGVyJzogeydmaWVsZCc6ICdkJywgJ3JhbmdlJzogWzEsIDJdfX1cbiAgICAgIF0sXG4gICAgICAnbWFyayc6ICdwb2ludCcsXG4gICAgICBlbmNvZGluZzoge31cbiAgICB9KTtcblxuICAgIGxldCBwYXJzZTogRGljdDxzdHJpbmc+ID0ge307XG5cbiAgICAvLyBleHRyYWN0IHRoZSBwYXJzZSBmcm9tIHRoZSBwYXJzZSBub2RlcyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGFsb25nIHdpdGggdGhlIGZpbHRlciBub2Rlc1xuICAgIGNvbnN0IHJvb3QgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgIHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpO1xuICAgIGxldCBub2RlID0gcm9vdC5jaGlsZHJlblswXTtcblxuICAgIHdoaWxlIChub2RlLm51bUNoaWxkcmVuKCkgPiAwKSB7XG4gICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFBhcnNlTm9kZSkge1xuICAgICAgICBwYXJzZSA9IHsuLi5wYXJzZSwgLi4ubm9kZS5wYXJzZX07XG4gICAgICB9XG4gICAgICBhc3NlcnQuZXF1YWwobm9kZS5udW1DaGlsZHJlbigpLCAxKTtcbiAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIGFzc2VydC5kZWVwRXF1YWwocGFyc2UsIHtcbiAgICAgIGE6ICdkYXRlJyxcbiAgICAgIGI6ICdzdHJpbmcnLFxuICAgICAgYzogJ2RhdGUnLFxuICAgICAgZDogJ251bWJlcidcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/filterinvalid.test.d.ts b/build/test/compile/data/filterinvalid.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/filterinvalid.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/filterinvalid.test.js b/build/test/compile/data/filterinvalid.test.js new file mode 100644 index 0000000000..333bd9da8d --- /dev/null +++ b/build/test/compile/data/filterinvalid.test.js @@ -0,0 +1,85 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var filterinvalid_1 = require("../../../src/compile/data/filterinvalid"); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +function parse(model) { + return filterinvalid_1.FilterInvalidNode.make(null, model); +} +describe('compile/data/nullfilter', function () { + describe('compileUnit', function () { + var spec = { + mark: "point", + encoding: { + y: { field: 'qq', type: "quantitative" }, + x: { field: 'tt', type: "temporal" }, + color: { field: 'oo', type: "ordinal" }, + shape: { field: 'nn', type: "nominal" } + } + }; + it('should add filterNull for Q and T by default', function () { + var model = util_2.parseUnitModelWithScale(spec); + chai_1.assert.deepEqual(parse(model).filter, { + qq: { field: 'qq', type: "quantitative" }, + tt: { field: 'tt', type: "temporal" } + }); + }); + it('should add filterNull for Q and T when invalidValues is "filter".', function () { + var model = util_2.parseUnitModelWithScale(util_1.mergeDeep(spec, { + config: { + invalidValues: 'filter' + } + })); + chai_1.assert.deepEqual(parse(model).filter, { + qq: { field: 'qq', type: "quantitative" }, + tt: { field: 'tt', type: "temporal" } + }); + }); + it('should add no null filter if when invalidValues is null', function () { + var model = util_2.parseUnitModelWithScale(util_1.mergeDeep(spec, { + config: { + invalidValues: null + } + })); + chai_1.assert.deepEqual(parse(model), null); + }); + it('should add no null filter for count field', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + y: { aggregate: 'count', type: "quantitative" } + } + }); + chai_1.assert.deepEqual(parse(model), null); + }); + }); + describe('assemble', function () { + it('should assemble simple filter', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + y: { field: 'foo', type: "quantitative" } + } + }); + chai_1.assert.deepEqual(parse(model).assemble(), { + type: 'filter', + expr: 'datum["foo"] !== null && !isNaN(datum["foo"])' + }); + }); + it('should assemble filter for nested data', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + y: { field: 'foo.bar', type: "quantitative" } + } + }); + chai_1.assert.deepEqual(parse(model).assemble(), { + type: 'filter', + expr: 'datum["foo.bar"] !== null && !isNaN(datum["foo.bar"])' + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyaW52YWxpZC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL2RhdGEvZmlsdGVyaW52YWxpZC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7O0FBRTlCLDZCQUE0QjtBQUM1Qix5RUFBMEU7QUFHMUUsMENBQTRDO0FBQzVDLG1DQUFtRDtBQUduRCxlQUFlLEtBQWdCO0lBQzdCLE9BQU8saUNBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsUUFBUSxDQUFDLHlCQUF5QixFQUFFO0lBQ2xDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsSUFBTSxJQUFJLEdBQXVCO1lBQy9CLElBQUksRUFBRSxPQUFPO1lBQ2IsUUFBUSxFQUFFO2dCQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztnQkFDdEMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDO2dCQUNsQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7Z0JBQ3JDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQzthQUN0QztTQUNGLENBQUM7UUFFRixFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNwQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7Z0JBQ3ZDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQzthQUNwQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRUFBbUUsRUFBRTtZQUN0RSxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQyxnQkFBUyxDQUErQixJQUFJLEVBQUU7Z0JBQ2xGLE1BQU0sRUFBRTtvQkFDTixhQUFhLEVBQUUsUUFBUTtpQkFDeEI7YUFDRixDQUFDLENBQUMsQ0FBQztZQUNKLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtnQkFDcEMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2dCQUN2QyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUM7YUFDcEMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseURBQXlELEVBQUU7WUFDNUQsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUMsZ0JBQVMsQ0FBK0IsSUFBSSxFQUFFO2dCQUNsRixNQUFNLEVBQUU7b0JBQ04sYUFBYSxFQUFFLElBQUk7aUJBQ3BCO2FBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDSixhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBRSwyQ0FBMkMsRUFBRTtZQUMvQyxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztpQkFDOUM7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFVBQVUsRUFBRTtRQUNuQixFQUFFLENBQUUsK0JBQStCLEVBQUU7WUFDbkMsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7aUJBQ3hDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSwrQ0FBK0M7YUFDdEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUUsd0NBQXdDLEVBQUU7WUFDNUMsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUM7Z0JBQ3BDLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3hDLElBQUksRUFBRSxRQUFRO2dCQUNkLElBQUksRUFBRSx1REFBdUQ7YUFDOUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7RmlsdGVySW52YWxpZE5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZmlsdGVyaW52YWxpZCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvdW5pdCc7XG5pbXBvcnQge05vcm1hbGl6ZWRVbml0U3BlYywgVG9wTGV2ZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9zcGVjJztcbmltcG9ydCB7bWVyZ2VEZWVwfSBmcm9tICcuLi8uLi8uLi9zcmMvdXRpbCc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi8uLi91dGlsJztcblxuXG5mdW5jdGlvbiBwYXJzZShtb2RlbDogVW5pdE1vZGVsKSB7XG4gIHJldHVybiBGaWx0ZXJJbnZhbGlkTm9kZS5tYWtlKG51bGwsIG1vZGVsKTtcbn1cblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9udWxsZmlsdGVyJywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCdjb21waWxlVW5pdCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNwZWM6IE5vcm1hbGl6ZWRVbml0U3BlYyA9IHtcbiAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgIHk6IHtmaWVsZDogJ3FxJywgdHlwZTogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIHg6IHtmaWVsZDogJ3R0JywgdHlwZTogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgY29sb3I6IHtmaWVsZDogJ29vJywgdHlwZTogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBzaGFwZToge2ZpZWxkOiAnbm4nLCB0eXBlOiBcIm5vbWluYWxcIn1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgZmlsdGVyTnVsbCBmb3IgUSBhbmQgVCBieSBkZWZhdWx0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZShzcGVjKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocGFyc2UobW9kZWwpLmZpbHRlciwge1xuICAgICAgICBxcToge2ZpZWxkOiAncXEnLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgdHQ6IHtmaWVsZDogJ3R0JywgdHlwZTogXCJ0ZW1wb3JhbFwifVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFkZCBmaWx0ZXJOdWxsIGZvciBRIGFuZCBUIHdoZW4gaW52YWxpZFZhbHVlcyBpcyBcImZpbHRlclwiLicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUobWVyZ2VEZWVwPFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4+KHNwZWMsIHtcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgaW52YWxpZFZhbHVlczogJ2ZpbHRlcidcbiAgICAgICAgfVxuICAgICAgfSkpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwYXJzZShtb2RlbCkuZmlsdGVyLCB7XG4gICAgICAgIHFxOiB7ZmllbGQ6ICdxcScsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICB0dDoge2ZpZWxkOiAndHQnLCB0eXBlOiBcInRlbXBvcmFsXCJ9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIG5vIG51bGwgZmlsdGVyIGlmIHdoZW4gaW52YWxpZFZhbHVlcyBpcyBudWxsJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZShtZXJnZURlZXA8VG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPj4oc3BlYywge1xuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBpbnZhbGlkVmFsdWVzOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH0pKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocGFyc2UobW9kZWwpLCBudWxsKTtcbiAgICB9KTtcblxuICAgIGl0ICgnc2hvdWxkIGFkZCBubyBudWxsIGZpbHRlciBmb3IgY291bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHk6IHthZ2dyZWdhdGU6ICdjb3VudCcsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHBhcnNlKG1vZGVsKSwgbnVsbCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhc3NlbWJsZScsIGZ1bmN0aW9uKCkge1xuICAgIGl0ICgnc2hvdWxkIGFzc2VtYmxlIHNpbXBsZSBmaWx0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHk6IHtmaWVsZDogJ2ZvbycsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHBhcnNlKG1vZGVsKS5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdmaWx0ZXInLFxuICAgICAgICBleHByOiAnZGF0dW1bXCJmb29cIl0gIT09IG51bGwgJiYgIWlzTmFOKGRhdHVtW1wiZm9vXCJdKSdcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQgKCdzaG91bGQgYXNzZW1ibGUgZmlsdGVyIGZvciBuZXN0ZWQgZGF0YScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeToge2ZpZWxkOiAnZm9vLmJhcicsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHBhcnNlKG1vZGVsKS5hc3NlbWJsZSgpLCB7XG4gICAgICAgIHR5cGU6ICdmaWx0ZXInLFxuICAgICAgICBleHByOiAnZGF0dW1bXCJmb28uYmFyXCJdICE9PSBudWxsICYmICFpc05hTihkYXR1bVtcImZvby5iYXJcIl0pJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/data/formatparse.test.d.ts b/build/test/compile/data/formatparse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/formatparse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/formatparse.test.js b/build/test/compile/data/formatparse.test.js new file mode 100644 index 0000000000..91280c43bd --- /dev/null +++ b/build/test/compile/data/formatparse.test.js @@ -0,0 +1,276 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var data_1 = require("../../../src/compile/data"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var formatparse_1 = require("../../../src/compile/data/formatparse"); +var parse_1 = require("../../../src/compile/data/parse"); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../util"); +describe('compile/data/formatparse', function () { + describe('parseUnit', function () { + it('should parse binned fields as numbers', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "encoding": { + "x": { "field": "a", "type": "ordinal", "bin": true }, + "y": { "field": "b", "type": "ordinal" } + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, new data_1.AncestorParse()).parse, { + a: 'number' + }); + }); + it('should flatten nested fields that are used to sort domains', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "encoding": { + x: { field: 'a', type: 'ordinal', sort: { field: 'foo.bar', op: 'mean' } }, + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, new data_1.AncestorParse()).parse, { + 'foo.bar': 'flatten' + }); + }); + it('should return a correct customized parse.', function () { + var model = util_1.parseUnitModel({ + "data": { "url": "a.json", "format": { "parse": { "c": "number", "d": "date" } } }, + "mark": "point", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "temporal" }, + "color": { "field": "c", "type": "ordinal" }, + "shape": { "field": "c", "type": "nominal" } + } + }); + var ancestorParese = new data_1.AncestorParse(); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, ancestorParese).parse, { + a: 'number', + b: 'date' + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeExplicit(null, model, ancestorParese).parse, { + c: 'number', + d: 'date' + }); + }); + it('should include parse for all applicable fields, and exclude calculated fields', function () { + var model = util_1.parseUnitModel({ + transform: [{ calculate: 'datum["b"] * 2', as: 'b2' }], + mark: "point", + encoding: { + x: { field: 'a', type: "temporal" }, + y: { field: 'b', type: "quantitative" }, + color: { type: "quantitative", aggregate: 'count' }, + size: { field: 'b2', type: "quantitative" }, + } + }); + var ancestorParse = new data_1.AncestorParse(); + var parent = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(parent, model, ancestorParse); + chai_1.assert.deepEqual(ancestorParse.combine(), { 'b2': 'derived' }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, ancestorParse).parse, { + 'a': 'date', + 'b': 'number' + }); + }); + it('should not parse fields with aggregate=missing/valid/distinct', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + x: { aggregate: 'missing', field: 'b', type: "quantitative" }, + y: { aggregate: 'valid', field: 'b', type: "quantitative" }, + color: { aggregate: 'distinct', field: 'b', type: "quantitative" } + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, new data_1.AncestorParse()), null); + }); + it('should not parse the same field twice', function () { + var model = util_1.parseFacetModel({ + data: { + values: [], + format: { + parse: { + a: 'number' + } + } + }, + facet: { + row: { field: 'a', type: 'ordinal' } + }, + spec: { + mark: "point", + encoding: { + x: { field: 'a', type: "quantitative" }, + y: { field: 'b', type: "temporal" } + } + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeExplicit(null, model, new data_1.AncestorParse()).parse, { + 'a': 'number' + }); + model.parseScale(); + model.parseData(); + chai_1.assert.deepEqual(model.child.component.data.ancestorParse.combine(), { + 'a': 'number', + 'b': 'date' + }); + // set the ancestor parse to see whether fields from it are not parsed + model.child.component.data.ancestorParse = new data_1.AncestorParse({ a: 'number' }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model.child, model.child.component.data.ancestorParse).parse, { + 'b': 'date' + }); + }); + it('should not parse the same field twice in explicit', function () { + var model = util_1.parseUnitModel({ + data: { + values: [], + format: { + parse: { + a: 'number' + } + } + }, + mark: "point", + encoding: {} + }); + chai_1.assert.isNull(formatparse_1.ParseNode.makeExplicit(null, model, new data_1.AncestorParse({ a: 'number' }, {}))); + }); + it('should not parse the same field twice in implicit', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + x: { field: 'a', type: 'quantitative' } + } + }); + chai_1.assert.isNull(formatparse_1.ParseNode.makeExplicit(null, model, new data_1.AncestorParse({ a: 'number' }, {}))); + }); + it('should not parse counts', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "encoding": { + "x": { "aggregate": "sum", "field": "foo", "type": "quantitative" }, + "y": { "aggregate": "count", "type": "quantitative" } + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, new data_1.AncestorParse()).parse, { + "foo": "number" + }); + }); + it('should add flatten for nested fields', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "encoding": { + "x": { "field": "foo.bar", "type": "quantitative" }, + "y": { "field": "foo.baz", "type": "ordinal" } + } + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, new data_1.AncestorParse()).parse, { + "foo.bar": "number", + "foo.baz": "flatten" + }); + }); + it('should not parse if parse is disabled for a field', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "data": { + "values": [], + "format": { + "parse": { + "b": null + } + } + }, + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "quantitative" } + } + }); + var ancestorParse = new data_1.AncestorParse(); + chai_1.assert.isNull(formatparse_1.ParseNode.makeExplicit(null, model, ancestorParse), null); + chai_1.assert.deepEqual(ancestorParse.combine(), { + b: null + }); + chai_1.assert.deepEqual(formatparse_1.ParseNode.makeImplicitFromEncoding(null, model, ancestorParse).parse, { + a: 'number' + }); + }); + it('should not parse if parse is disabled', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "data": { + "values": [], + "format": { + "parse": null // implies AncestorParse.makeExplicit = true + } + }, + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "quantitative" } + } + }); + chai_1.assert.isNull(formatparse_1.ParseNode.makeExplicit(null, model, new data_1.AncestorParse({}, {}, true))); + }); + }); + describe('assembleTransforms', function () { + it('should assemble correct parse expressions', function () { + var p = new formatparse_1.ParseNode(null, { + n: 'number', + b: 'boolean', + s: 'string', + d1: 'date', + d2: 'date:"%y"', + d3: 'utc:"%y"' + }); + chai_1.assert.deepEqual(p.assembleTransforms(), [ + { type: 'formula', expr: 'toNumber(datum["n"])', as: 'n' }, + { type: 'formula', expr: 'toBoolean(datum["b"])', as: 'b' }, + { type: 'formula', expr: 'toString(datum["s"])', as: 's' }, + { type: 'formula', expr: 'toDate(datum["d1"])', as: 'd1' }, + { type: 'formula', expr: 'timeParse(datum["d2"],"%y")', as: 'd2' }, + { type: 'formula', expr: 'utcParse(datum["d3"],"%y")', as: 'd3' } + ]); + }); + it('should assemble flatten for nested fields', function () { + var p = new formatparse_1.ParseNode(null, { + flat: 'number', + 'nested.field': 'flatten' + }); + chai_1.assert.deepEqual(p.assembleTransforms(true), [ + { type: 'formula', expr: 'datum["nested"] && datum["nested"]["field"]', as: 'nested.field' } + ]); + }); + it('should show warning for unrecognized types', log.wrap(function (localLogger) { + var p = new formatparse_1.ParseNode(null, { + x: 'foo', + }); + chai_1.assert.deepEqual(p.assembleTransforms(), []); + chai_1.assert.equal(localLogger.warns[0], log.message.unrecognizedParse('foo')); + })); + }); + describe('assembleFormatParse', function () { + it('should assemble correct parse', function () { + var p = new formatparse_1.ParseNode(null, { + n: 'number', + b: 'boolean', + 'nested.field': 'flatten' + }); + chai_1.assert.deepEqual(p.assembleFormatParse(), { + n: 'number', + b: 'boolean' + }); + }); + }); + describe('producedFields', function () { + it('should produce the correct fields', function () { + var p = new formatparse_1.ParseNode(null, { + n: 'number', + b: 'boolean', + 'nested.field': 'flatten' + }); + chai_1.assert.deepEqual(p.producedFields(), { n: true, b: true, 'nested.field': true }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0cGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL2Zvcm1hdHBhcnNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOEJBQThCO0FBQzlCLDZCQUE0QjtBQUM1QixrREFBd0Q7QUFDeEQsK0RBQWdFO0FBQ2hFLHFFQUFnRTtBQUNoRSx5REFBb0U7QUFFcEUsNERBQXdDO0FBQ3hDLG1DQUEyRDtBQUUzRCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7SUFDbkMsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUNwQixFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO29CQUNuRCxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7aUJBQ3ZDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxvQkFBYSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzNGLENBQUMsRUFBRSxRQUFRO2FBQ1osQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNERBQTRELEVBQUU7WUFDL0QsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUMsRUFBQztpQkFDdkU7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDM0YsU0FBUyxFQUFFLFNBQVM7YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBQyxPQUFPLEVBQUUsRUFBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUMsRUFBQyxFQUFDO2dCQUM1RSxNQUFNLEVBQUUsT0FBTztnQkFDZixVQUFVLEVBQUU7b0JBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUMzQyxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUM7b0JBQ3ZDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztvQkFDMUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO2lCQUMzQzthQUNGLENBQUMsQ0FBQztZQUVILElBQU0sY0FBYyxHQUFHLElBQUksb0JBQWEsRUFBRSxDQUFDO1lBQzNDLGFBQU0sQ0FBQyxTQUFTLENBQUMsdUJBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDdEYsQ0FBQyxFQUFFLFFBQVE7Z0JBQ1gsQ0FBQyxFQUFFLE1BQU07YUFDVixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUMxRSxDQUFDLEVBQUUsUUFBUTtnQkFDWCxDQUFDLEVBQUUsTUFBTTthQUNWLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtFQUErRSxFQUFFO1lBQ2xGLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLFNBQVMsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUMsQ0FBQztnQkFDcEQsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBQztvQkFDakMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO29CQUNyQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUM7b0JBQ2pELElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztpQkFDMUM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFNLGFBQWEsR0FBRyxJQUFJLG9CQUFhLEVBQUUsQ0FBQztZQUMxQyxJQUFNLE1BQU0sR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsMkJBQW1CLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztZQUNsRCxhQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQyxDQUFDO1lBQzdELGFBQU0sQ0FBQyxTQUFTLENBQUMsdUJBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDckYsR0FBRyxFQUFFLE1BQU07Z0JBQ1gsR0FBRyxFQUFFLFFBQVE7YUFDZCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRTtZQUNsRSxJQUFNLEtBQUssR0FBRyxxQkFBYyxDQUFDO2dCQUMzQixJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7b0JBQzNELENBQUMsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO29CQUN6RCxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztpQkFDakU7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9GLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLHNCQUFlLENBQUM7Z0JBQzVCLElBQUksRUFBRTtvQkFDSixNQUFNLEVBQUUsRUFBRTtvQkFDVixNQUFNLEVBQUU7d0JBQ04sS0FBSyxFQUFFOzRCQUNMLENBQUMsRUFBRSxRQUFRO3lCQUNaO3FCQUNGO2lCQUNGO2dCQUNELEtBQUssRUFBRTtvQkFDTCxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7aUJBQ25DO2dCQUNELElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsT0FBTztvQkFDYixRQUFRLEVBQUU7d0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO3dCQUNyQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUM7cUJBQ2xDO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUMvRSxHQUFHLEVBQUUsUUFBUTthQUNkLENBQUMsQ0FBQztZQUNILEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFbEIsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuRSxHQUFHLEVBQUUsUUFBUTtnQkFDYixHQUFHLEVBQUUsTUFBTTthQUNaLENBQUMsQ0FBQztZQUVILHNFQUFzRTtZQUN0RSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksb0JBQWEsQ0FBQyxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1lBQzVFLGFBQU0sQ0FBQyxTQUFTLENBQUMsdUJBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQXVCLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDeEksR0FBRyxFQUFFLE1BQU07YUFDWixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtREFBbUQsRUFBRTtZQUN0RCxJQUFNLEtBQUssR0FBRyxxQkFBYyxDQUFDO2dCQUMzQixJQUFJLEVBQUU7b0JBQ0osTUFBTSxFQUFFLEVBQUU7b0JBQ1YsTUFBTSxFQUFFO3dCQUNOLEtBQUssRUFBRTs0QkFDTCxDQUFDLEVBQUUsUUFBUTt5QkFDWjtxQkFDRjtpQkFDRjtnQkFDRCxJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUUsRUFBRTthQUNiLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxNQUFNLENBQUMsdUJBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLENBQUMsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7aUJBQ3RDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLE1BQU0sQ0FBQyx1QkFBUyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsQ0FBQyxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0YsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUJBQXlCLEVBQUU7WUFDNUIsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUNqRSxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7aUJBQ3BEO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxvQkFBYSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzNGLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ2pELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztpQkFDN0M7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLHVCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDM0YsU0FBUyxFQUFFLFFBQVE7Z0JBQ25CLFNBQVMsRUFBRSxTQUFTO2FBQ3JCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1EQUFtRCxFQUFFO1lBQ3RELElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsRUFBRTtvQkFDWixRQUFRLEVBQUU7d0JBQ1IsT0FBTyxFQUFFOzRCQUNQLEdBQUcsRUFBRSxJQUFJO3lCQUNWO3FCQUNGO2lCQUNGO2dCQUNELFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQzNDLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFNLGFBQWEsR0FBRyxJQUFJLG9CQUFhLEVBQUUsQ0FBQztZQUMxQyxhQUFNLENBQUMsTUFBTSxDQUFDLHVCQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDeEUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ3hDLENBQUMsRUFBRSxJQUFJO2FBQ1IsQ0FBQyxDQUFDO1lBQ0gsYUFBTSxDQUFDLFNBQVMsQ0FBQyx1QkFBUyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFO2dCQUNyRixDQUFDLEVBQUUsUUFBUTthQUNaLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRTtvQkFDTixRQUFRLEVBQUUsRUFBRTtvQkFDWixRQUFRLEVBQUU7d0JBQ1IsT0FBTyxFQUFFLElBQUksQ0FBRSw0Q0FBNEM7cUJBQzVEO2lCQUNGO2dCQUNELFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQzNDLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsTUFBTSxDQUFDLHVCQUFTLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxvQkFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsb0JBQW9CLEVBQUU7UUFDN0IsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLElBQU0sQ0FBQyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVCLENBQUMsRUFBRSxRQUFRO2dCQUNYLENBQUMsRUFBRSxTQUFTO2dCQUNaLENBQUMsRUFBRSxRQUFRO2dCQUNYLEVBQUUsRUFBRSxNQUFNO2dCQUNWLEVBQUUsRUFBRSxXQUFXO2dCQUNmLEVBQUUsRUFBRSxVQUFVO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRTtnQkFDdkMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFDO2dCQUN4RCxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUM7Z0JBQ3pELEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBQztnQkFDeEQsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDO2dCQUN4RCxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLDZCQUE2QixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUM7Z0JBQ2hFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBQzthQUNoRSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFO2dCQUM1QixJQUFJLEVBQUUsUUFBUTtnQkFDZCxjQUFjLEVBQUUsU0FBUzthQUMxQixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDM0MsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSw2Q0FBNkMsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFDO2FBQzNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQ3BFLElBQU0sQ0FBQyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUU7Z0JBQzVCLENBQUMsRUFBRSxLQUFLO2FBQ1QsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QixFQUFFLENBQUMsK0JBQStCLEVBQUU7WUFDbEMsSUFBTSxDQUFDLEdBQUcsSUFBSSx1QkFBUyxDQUFDLElBQUksRUFBRTtnQkFDNUIsQ0FBQyxFQUFFLFFBQVE7Z0JBQ1gsQ0FBQyxFQUFFLFNBQVM7Z0JBQ1osY0FBYyxFQUFFLFNBQVM7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsRUFBRTtnQkFDeEMsQ0FBQyxFQUFFLFFBQVE7Z0JBQ1gsQ0FBQyxFQUFFLFNBQVM7YUFDYixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtZQUN0QyxJQUFNLENBQUMsR0FBRyxJQUFJLHVCQUFTLENBQUMsSUFBSSxFQUFFO2dCQUM1QixDQUFDLEVBQUUsUUFBUTtnQkFDWCxDQUFDLEVBQUUsU0FBUztnQkFDWixjQUFjLEVBQUUsU0FBUzthQUMxQixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUNqRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7QW5jZXN0b3JQYXJzZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9kYXRhZmxvdyc7XG5pbXBvcnQge1BhcnNlTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9mb3JtYXRwYXJzZSc7XG5pbXBvcnQge3BhcnNlVHJhbnNmb3JtQXJyYXl9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvcGFyc2UnO1xuaW1wb3J0IHtNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbW9kZWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uLy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtwYXJzZUZhY2V0TW9kZWwsIHBhcnNlVW5pdE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9mb3JtYXRwYXJzZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3BhcnNlVW5pdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHBhcnNlIGJpbm5lZCBmaWVsZHMgYXMgbnVtYmVycycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIiwgXCJiaW5cIjogdHJ1ZX0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFBhcnNlTm9kZS5tYWtlSW1wbGljaXRGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpLnBhcnNlLCB7XG4gICAgICAgIGE6ICdudW1iZXInXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmxhdHRlbiBuZXN0ZWQgZmllbGRzIHRoYXQgYXJlIHVzZWQgdG8gc29ydCBkb21haW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNvcnQ6IHtmaWVsZDogJ2Zvby5iYXInLCBvcDogJ21lYW4nfX0sXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFBhcnNlTm9kZS5tYWtlSW1wbGljaXRGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpLnBhcnNlLCB7XG4gICAgICAgICdmb28uYmFyJzogJ2ZsYXR0ZW4nXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBjdXN0b21pemVkIHBhcnNlLicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiYS5qc29uXCIsIFwiZm9ybWF0XCI6IHtcInBhcnNlXCI6IHtcImNcIjogXCJudW1iZXJcIiwgXCJkXCI6IFwiZGF0ZVwifX19LFxuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJjXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJzaGFwZVwiOiB7XCJmaWVsZFwiOiBcImNcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYW5jZXN0b3JQYXJlc2UgPSBuZXcgQW5jZXN0b3JQYXJzZSgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChQYXJzZU5vZGUubWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKG51bGwsIG1vZGVsLCBhbmNlc3RvclBhcmVzZSkucGFyc2UsIHtcbiAgICAgICAgYTogJ251bWJlcicsXG4gICAgICAgIGI6ICdkYXRlJ1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoUGFyc2VOb2RlLm1ha2VFeHBsaWNpdChudWxsLCBtb2RlbCwgYW5jZXN0b3JQYXJlc2UpLnBhcnNlLCB7XG4gICAgICAgIGM6ICdudW1iZXInLFxuICAgICAgICBkOiAnZGF0ZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBpbmNsdWRlIHBhcnNlIGZvciBhbGwgYXBwbGljYWJsZSBmaWVsZHMsIGFuZCBleGNsdWRlIGNhbGN1bGF0ZWQgZmllbGRzJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgdHJhbnNmb3JtOiBbe2NhbGN1bGF0ZTogJ2RhdHVtW1wiYlwiXSAqIDInLCBhczogJ2IyJ31dLFxuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIGNvbG9yOiB7dHlwZTogXCJxdWFudGl0YXRpdmVcIiwgYWdncmVnYXRlOiAnY291bnQnfSxcbiAgICAgICAgICBzaXplOiB7ZmllbGQ6ICdiMicsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYW5jZXN0b3JQYXJzZSA9IG5ldyBBbmNlc3RvclBhcnNlKCk7XG4gICAgICBjb25zdCBwYXJlbnQgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgICAgcGFyc2VUcmFuc2Zvcm1BcnJheShwYXJlbnQsIG1vZGVsLCBhbmNlc3RvclBhcnNlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYW5jZXN0b3JQYXJzZS5jb21iaW5lKCksIHsnYjInOiAnZGVyaXZlZCd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoUGFyc2VOb2RlLm1ha2VJbXBsaWNpdEZyb21FbmNvZGluZyhudWxsLCBtb2RlbCwgYW5jZXN0b3JQYXJzZSkucGFyc2UsIHtcbiAgICAgICAgJ2EnOiAnZGF0ZScsXG4gICAgICAgICdiJzogJ251bWJlcidcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcGFyc2UgZmllbGRzIHdpdGggYWdncmVnYXRlPW1pc3NpbmcvdmFsaWQvZGlzdGluY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2FnZ3JlZ2F0ZTogJ21pc3NpbmcnLCBmaWVsZDogJ2InLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICB5OiB7YWdncmVnYXRlOiAndmFsaWQnLCBmaWVsZDogJ2InLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBjb2xvcjoge2FnZ3JlZ2F0ZTogJ2Rpc3RpbmN0JywgZmllbGQ6ICdiJywgdHlwZTogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoUGFyc2VOb2RlLm1ha2VJbXBsaWNpdEZyb21FbmNvZGluZyhudWxsLCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2UoKSksIG51bGwpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcGFyc2UgdGhlIHNhbWUgZmllbGQgdHdpY2UnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHtcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHZhbHVlczogW10sXG4gICAgICAgICAgZm9ybWF0OiB7XG4gICAgICAgICAgICBwYXJzZToge1xuICAgICAgICAgICAgICBhOiAnbnVtYmVyJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICByb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9XG4gICAgICAgIH0sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2InLCB0eXBlOiBcInRlbXBvcmFsXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChQYXJzZU5vZGUubWFrZUV4cGxpY2l0KG51bGwsIG1vZGVsLCBuZXcgQW5jZXN0b3JQYXJzZSgpKS5wYXJzZSwge1xuICAgICAgICAnYSc6ICdudW1iZXInXG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICAgIG1vZGVsLnBhcnNlRGF0YSgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNoaWxkLmNvbXBvbmVudC5kYXRhLmFuY2VzdG9yUGFyc2UuY29tYmluZSgpLCB7XG4gICAgICAgICdhJzogJ251bWJlcicsXG4gICAgICAgICdiJzogJ2RhdGUnXG4gICAgICB9KTtcblxuICAgICAgLy8gc2V0IHRoZSBhbmNlc3RvciBwYXJzZSB0byBzZWUgd2hldGhlciBmaWVsZHMgZnJvbSBpdCBhcmUgbm90IHBhcnNlZFxuICAgICAgbW9kZWwuY2hpbGQuY29tcG9uZW50LmRhdGEuYW5jZXN0b3JQYXJzZSA9IG5ldyBBbmNlc3RvclBhcnNlKHthOiAnbnVtYmVyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChQYXJzZU5vZGUubWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKG51bGwsIG1vZGVsLmNoaWxkIGFzIE1vZGVsV2l0aEZpZWxkLCBtb2RlbC5jaGlsZC5jb21wb25lbnQuZGF0YS5hbmNlc3RvclBhcnNlKS5wYXJzZSwge1xuICAgICAgICAnYic6ICdkYXRlJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwYXJzZSB0aGUgc2FtZSBmaWVsZCB0d2ljZSBpbiBleHBsaWNpdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICB2YWx1ZXM6IFtdLFxuICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgcGFyc2U6IHtcbiAgICAgICAgICAgICAgYTogJ251bWJlcidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHt9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmlzTnVsbChQYXJzZU5vZGUubWFrZUV4cGxpY2l0KG51bGwsIG1vZGVsLCBuZXcgQW5jZXN0b3JQYXJzZSh7YTogJ251bWJlcid9LCB7fSkpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHBhcnNlIHRoZSBzYW1lIGZpZWxkIHR3aWNlIGluIGltcGxpY2l0JywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5pc051bGwoUGFyc2VOb2RlLm1ha2VFeHBsaWNpdChudWxsLCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2Uoe2E6ICdudW1iZXInfSwge30pKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwYXJzZSBjb3VudHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwiZm9vXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwiY291bnRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFBhcnNlTm9kZS5tYWtlSW1wbGljaXRGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpLnBhcnNlLCB7XG4gICAgICAgIFwiZm9vXCI6IFwibnVtYmVyXCJcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgZmxhdHRlbiBmb3IgbmVzdGVkIGZpZWxkcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJmb28uYmFyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJmb28uYmF6XCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoUGFyc2VOb2RlLm1ha2VJbXBsaWNpdEZyb21FbmNvZGluZyhudWxsLCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2UoKSkucGFyc2UsIHtcbiAgICAgICAgXCJmb28uYmFyXCI6IFwibnVtYmVyXCIsXG4gICAgICAgIFwiZm9vLmJhelwiOiBcImZsYXR0ZW5cIlxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwYXJzZSBpZiBwYXJzZSBpcyBkaXNhYmxlZCBmb3IgYSBmaWVsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgIFwidmFsdWVzXCI6IFtdLFxuICAgICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICAgIFwicGFyc2VcIjoge1xuICAgICAgICAgICAgICBcImJcIjogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFuY2VzdG9yUGFyc2UgPSBuZXcgQW5jZXN0b3JQYXJzZSgpO1xuICAgICAgYXNzZXJ0LmlzTnVsbChQYXJzZU5vZGUubWFrZUV4cGxpY2l0KG51bGwsIG1vZGVsLCBhbmNlc3RvclBhcnNlKSwgbnVsbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGFuY2VzdG9yUGFyc2UuY29tYmluZSgpLCB7XG4gICAgICAgIGI6IG51bGxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChQYXJzZU5vZGUubWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKG51bGwsIG1vZGVsLCBhbmNlc3RvclBhcnNlKS5wYXJzZSwge1xuICAgICAgICBhOiAnbnVtYmVyJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBwYXJzZSBpZiBwYXJzZSBpcyBkaXNhYmxlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgIFwidmFsdWVzXCI6IFtdLFxuICAgICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICAgIFwicGFyc2VcIjogbnVsbCAgLy8gaW1wbGllcyBBbmNlc3RvclBhcnNlLm1ha2VFeHBsaWNpdCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuaXNOdWxsKFBhcnNlTm9kZS5tYWtlRXhwbGljaXQobnVsbCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKHt9LCB7fSwgdHJ1ZSkpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlVHJhbnNmb3JtcycsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgYXNzZW1ibGUgY29ycmVjdCBwYXJzZSBleHByZXNzaW9ucycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgcCA9IG5ldyBQYXJzZU5vZGUobnVsbCwge1xuICAgICAgICBuOiAnbnVtYmVyJyxcbiAgICAgICAgYjogJ2Jvb2xlYW4nLFxuICAgICAgICBzOiAnc3RyaW5nJyxcbiAgICAgICAgZDE6ICdkYXRlJyxcbiAgICAgICAgZDI6ICdkYXRlOlwiJXlcIicsXG4gICAgICAgIGQzOiAndXRjOlwiJXlcIidcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHAuYXNzZW1ibGVUcmFuc2Zvcm1zKCksIFtcbiAgICAgICAge3R5cGU6ICdmb3JtdWxhJywgZXhwcjogJ3RvTnVtYmVyKGRhdHVtW1wiblwiXSknLCBhczogJ24nfSxcbiAgICAgICAge3R5cGU6ICdmb3JtdWxhJywgZXhwcjogJ3RvQm9vbGVhbihkYXR1bVtcImJcIl0pJywgYXM6ICdiJ30sXG4gICAgICAgIHt0eXBlOiAnZm9ybXVsYScsIGV4cHI6ICd0b1N0cmluZyhkYXR1bVtcInNcIl0pJywgYXM6ICdzJ30sXG4gICAgICAgIHt0eXBlOiAnZm9ybXVsYScsIGV4cHI6ICd0b0RhdGUoZGF0dW1bXCJkMVwiXSknLCBhczogJ2QxJ30sXG4gICAgICAgIHt0eXBlOiAnZm9ybXVsYScsIGV4cHI6ICd0aW1lUGFyc2UoZGF0dW1bXCJkMlwiXSxcIiV5XCIpJywgYXM6ICdkMid9LFxuICAgICAgICB7dHlwZTogJ2Zvcm11bGEnLCBleHByOiAndXRjUGFyc2UoZGF0dW1bXCJkM1wiXSxcIiV5XCIpJywgYXM6ICdkMyd9XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYXNzZW1ibGUgZmxhdHRlbiBmb3IgbmVzdGVkIGZpZWxkcycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgcCA9IG5ldyBQYXJzZU5vZGUobnVsbCwge1xuICAgICAgICBmbGF0OiAnbnVtYmVyJyxcbiAgICAgICAgJ25lc3RlZC5maWVsZCc6ICdmbGF0dGVuJ1xuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocC5hc3NlbWJsZVRyYW5zZm9ybXModHJ1ZSksIFtcbiAgICAgICAge3R5cGU6ICdmb3JtdWxhJywgZXhwcjogJ2RhdHVtW1wibmVzdGVkXCJdICYmIGRhdHVtW1wibmVzdGVkXCJdW1wiZmllbGRcIl0nLCBhczogJ25lc3RlZC5maWVsZCd9XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIGZvciB1bnJlY29nbml6ZWQgdHlwZXMnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IHAgPSBuZXcgUGFyc2VOb2RlKG51bGwsIHtcbiAgICAgICAgeDogJ2ZvbycsXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwLmFzc2VtYmxlVHJhbnNmb3JtcygpLCBbXSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLnVucmVjb2duaXplZFBhcnNlKCdmb28nKSk7XG4gICAgfSkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXNzZW1ibGVGb3JtYXRQYXJzZScsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgYXNzZW1ibGUgY29ycmVjdCBwYXJzZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgcCA9IG5ldyBQYXJzZU5vZGUobnVsbCwge1xuICAgICAgICBuOiAnbnVtYmVyJyxcbiAgICAgICAgYjogJ2Jvb2xlYW4nLFxuICAgICAgICAnbmVzdGVkLmZpZWxkJzogJ2ZsYXR0ZW4nXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwLmFzc2VtYmxlRm9ybWF0UGFyc2UoKSwge1xuICAgICAgICBuOiAnbnVtYmVyJyxcbiAgICAgICAgYjogJ2Jvb2xlYW4nXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Byb2R1Y2VkRmllbGRzJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIHRoZSBjb3JyZWN0IGZpZWxkcycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgcCA9IG5ldyBQYXJzZU5vZGUobnVsbCwge1xuICAgICAgICBuOiAnbnVtYmVyJyxcbiAgICAgICAgYjogJ2Jvb2xlYW4nLFxuICAgICAgICAnbmVzdGVkLmZpZWxkJzogJ2ZsYXR0ZW4nXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwLnByb2R1Y2VkRmllbGRzKCksIHtuOiB0cnVlLCBiOiB0cnVlLCAnbmVzdGVkLmZpZWxkJzogdHJ1ZX0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/data/geojson.test.d.ts b/build/test/compile/data/geojson.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/geojson.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/geojson.test.js b/build/test/compile/data/geojson.test.js new file mode 100644 index 0000000000..8bc5920f75 --- /dev/null +++ b/build/test/compile/data/geojson.test.js @@ -0,0 +1,47 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var geojson_1 = require("../../../src/compile/data/geojson"); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +/* tslint:disable:quotemark */ +describe('compile/data/geojson', function () { + it('should make transform and assemble correctly', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "data": { + "url": "data/zipcodes.csv", + "format": { + "type": "csv" + } + }, + "mark": "circle", + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + }); + var root = new dataflow_1.DataFlowNode(null); + geojson_1.GeoJSONNode.parseAll(root, model); + var node = root.children[0]; + var _loop_1 = function () { + chai_1.assert.instanceOf(node, geojson_1.GeoJSONNode); + var transform = node.assemble(); + chai_1.assert.equal(transform.type, 'geojson'); + chai_1.assert.isTrue(util_1.every(['longitude', 'latitude'], function (field) { return util_1.contains(transform.fields, field); })); + chai_1.assert.isUndefined(transform.geojson); + chai_1.assert.isAtMost(node.children.length, 1); + node = node.children[0]; + }; + while (node != null) { + _loop_1(); + } + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvanNvbi50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL2RhdGEvZ2VvanNvbi50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLCtEQUFnRTtBQUNoRSw2REFBOEQ7QUFDOUQsMENBQWtEO0FBQ2xELG1DQUFnRTtBQUNoRSw4QkFBOEI7QUFFOUIsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtRQUNqRCxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLG1CQUFtQjtnQkFDMUIsUUFBUSxFQUFFO29CQUNSLE1BQU0sRUFBRSxLQUFLO2lCQUNkO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsUUFBUTtZQUNoQixVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFO29CQUNYLE9BQU8sRUFBRSxXQUFXO29CQUNwQixNQUFNLEVBQUUsY0FBYztpQkFDdkI7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLE9BQU8sRUFBRSxVQUFVO29CQUNuQixNQUFNLEVBQUUsY0FBYztpQkFDdkI7YUFDRjtTQUNGLENBQUMsQ0FBQztRQUVILElBQU0sSUFBSSxHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxxQkFBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFbEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7WUFHMUIsYUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUscUJBQVcsQ0FBQyxDQUFDO1lBQ3JDLElBQU0sU0FBUyxHQUFpQixJQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDakQsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ3hDLGFBQU0sQ0FBQyxNQUFNLENBQUMsWUFBSyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFVBQUMsS0FBSyxJQUFLLE9BQUEsZUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQWpDLENBQWlDLENBQUMsQ0FBQyxDQUFDO1lBQzlGLGFBQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRDLGFBQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQVRELE9BQU8sSUFBSSxJQUFJLElBQUk7O1NBU2xCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93JztcbmltcG9ydCB7R2VvSlNPTk5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZ2VvanNvbic7XG5pbXBvcnQge2NvbnRhaW5zLCBldmVyeX0gZnJvbSAnLi4vLi4vLi4vc3JjL3V0aWwnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmRlc2NyaWJlKCdjb21waWxlL2RhdGEvZ2VvanNvbicsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCBtYWtlIHRyYW5zZm9ybSBhbmQgYXNzZW1ibGUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgIFwidXJsXCI6IFwiZGF0YS96aXBjb2Rlcy5jc3ZcIixcbiAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImNzdlwiXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcImxvbmdpdHVkZVwiOiB7XG4gICAgICAgICAgXCJmaWVsZFwiOiBcImxvbmdpdHVkZVwiLFxuICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGF0aXR1ZGVcIjoge1xuICAgICAgICAgIFwiZmllbGRcIjogXCJsYXRpdHVkZVwiLFxuICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJvb3QgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgIEdlb0pTT05Ob2RlLnBhcnNlQWxsKHJvb3QsIG1vZGVsKTtcblxuICAgIGxldCBub2RlID0gcm9vdC5jaGlsZHJlblswXTtcblxuICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgIGFzc2VydC5pbnN0YW5jZU9mKG5vZGUsIEdlb0pTT05Ob2RlKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybSA9ICg8R2VvSlNPTk5vZGU+bm9kZSkuYXNzZW1ibGUoKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0cmFuc2Zvcm0udHlwZSwgJ2dlb2pzb24nKTtcbiAgICAgIGFzc2VydC5pc1RydWUoZXZlcnkoWydsb25naXR1ZGUnLCAnbGF0aXR1ZGUnXSwgKGZpZWxkKSA9PiBjb250YWlucyh0cmFuc2Zvcm0uZmllbGRzLCBmaWVsZCkpKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZCh0cmFuc2Zvcm0uZ2VvanNvbik7XG5cbiAgICAgIGFzc2VydC5pc0F0TW9zdChub2RlLmNoaWxkcmVuLmxlbmd0aCwgMSk7XG4gICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/data/geopoint.test.d.ts b/build/test/compile/data/geopoint.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/geopoint.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/geopoint.test.js b/build/test/compile/data/geopoint.test.js new file mode 100644 index 0000000000..fe9340f0dd --- /dev/null +++ b/build/test/compile/data/geopoint.test.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var geopoint_1 = require("../../../src/compile/data/geopoint"); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +describe('compile/data/geopoint', function () { + describe('geojson', function () { + it('should make transform and assemble correctly', function () { + var model = util_2.parseUnitModel({ + 'data': { + 'url': 'data/zipcodes.csv', + 'format': { + 'type': 'csv' + } + }, + 'mark': 'circle', + 'encoding': { + 'longitude': { + 'field': 'longitude', + 'type': 'quantitative' + }, + 'latitude': { + 'field': 'latitude', + 'type': 'quantitative' + } + } + }); + model.parse(); + var root = new dataflow_1.DataFlowNode(null); + geopoint_1.GeoPointNode.parseAll(root, model); + var node = root.children[0]; + var _loop_1 = function () { + chai_1.assert.instanceOf(node, geopoint_1.GeoPointNode); + var transform = node.assemble(); + chai_1.assert.equal(transform.type, 'geopoint'); + chai_1.assert.isTrue(util_1.every(['longitude', 'latitude'], function (field) { return util_1.contains(transform.fields, field); })); + chai_1.assert.isTrue(util_1.every([model.getName('x'), model.getName('y')], function (a) { return util_1.contains(transform.as, a); })); + chai_1.assert.isDefined(transform.projection); + chai_1.assert.isAtMost(node.children.length, 1); + node = node.children[0]; + }; + while (node != null) { + _loop_1(); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL2dlb3BvaW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsK0RBQWdFO0FBQ2hFLCtEQUFnRTtBQUNoRSwwQ0FBa0Q7QUFFbEQsbUNBQTBDO0FBRTFDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtJQUNoQyxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxJQUFNLEtBQUssR0FBRyxxQkFBYyxDQUFDO2dCQUMzQixNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLG1CQUFtQjtvQkFDMUIsUUFBUSxFQUFFO3dCQUNSLE1BQU0sRUFBRSxLQUFLO3FCQUNkO2lCQUNGO2dCQUNELE1BQU0sRUFBRSxRQUFRO2dCQUNoQixVQUFVLEVBQUU7b0JBQ1YsV0FBVyxFQUFFO3dCQUNYLE9BQU8sRUFBRSxXQUFXO3dCQUNwQixNQUFNLEVBQUUsY0FBYztxQkFDdkI7b0JBQ0QsVUFBVSxFQUFFO3dCQUNWLE9BQU8sRUFBRSxVQUFVO3dCQUNuQixNQUFNLEVBQUUsY0FBYztxQkFDdkI7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFZCxJQUFNLElBQUksR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsdUJBQVksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRW5DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUcxQixhQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSx1QkFBWSxDQUFDLENBQUM7Z0JBRXRDLElBQU0sU0FBUyxHQUF1QyxJQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3ZFLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekMsYUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEVBQUUsVUFBQyxLQUFLLElBQUssT0FBQSxlQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBakMsQ0FBaUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlGLGFBQU0sQ0FBQyxNQUFNLENBQUMsWUFBSyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBQyxDQUFDLElBQUssT0FBQSxlQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBekIsQ0FBeUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pHLGFBQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QyxhQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBVkQsT0FBTyxJQUFJLElBQUksSUFBSTs7YUFVbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9kYXRhZmxvdyc7XG5pbXBvcnQge0dlb1BvaW50Tm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9nZW9wb2ludCc7XG5pbXBvcnQge2NvbnRhaW5zLCBldmVyeX0gZnJvbSAnLi4vLi4vLi4vc3JjL3V0aWwnO1xuaW1wb3J0IHtWZ0dlb1BvaW50VHJhbnNmb3JtfSBmcm9tICcuLi8uLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdjb21waWxlL2RhdGEvZ2VvcG9pbnQnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdnZW9qc29uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgbWFrZSB0cmFuc2Zvcm0gYW5kIGFzc2VtYmxlIGNvcnJlY3RseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAnZGF0YSc6IHtcbiAgICAgICAgICAndXJsJzogJ2RhdGEvemlwY29kZXMuY3N2JyxcbiAgICAgICAgICAnZm9ybWF0Jzoge1xuICAgICAgICAgICAgJ3R5cGUnOiAnY3N2J1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJ21hcmsnOiAnY2lyY2xlJyxcbiAgICAgICAgJ2VuY29kaW5nJzoge1xuICAgICAgICAgICdsb25naXR1ZGUnOiB7XG4gICAgICAgICAgICAnZmllbGQnOiAnbG9uZ2l0dWRlJyxcbiAgICAgICAgICAgICd0eXBlJzogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgICdsYXRpdHVkZSc6IHtcbiAgICAgICAgICAgICdmaWVsZCc6ICdsYXRpdHVkZScsXG4gICAgICAgICAgICAndHlwZSc6ICdxdWFudGl0YXRpdmUnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG5cbiAgICAgIGNvbnN0IHJvb3QgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgICAgR2VvUG9pbnROb2RlLnBhcnNlQWxsKHJvb3QsIG1vZGVsKTtcblxuICAgICAgbGV0IG5vZGUgPSByb290LmNoaWxkcmVuWzBdO1xuXG4gICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIGFzc2VydC5pbnN0YW5jZU9mKG5vZGUsIEdlb1BvaW50Tm9kZSk7XG5cbiAgICAgICAgY29uc3QgdHJhbnNmb3JtOiBWZ0dlb1BvaW50VHJhbnNmb3JtID0gKDxHZW9Qb2ludE5vZGU+bm9kZSkuYXNzZW1ibGUoKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHRyYW5zZm9ybS50eXBlLCAnZ2VvcG9pbnQnKTtcbiAgICAgICAgYXNzZXJ0LmlzVHJ1ZShldmVyeShbJ2xvbmdpdHVkZScsICdsYXRpdHVkZSddLCAoZmllbGQpID0+IGNvbnRhaW5zKHRyYW5zZm9ybS5maWVsZHMsIGZpZWxkKSkpO1xuICAgICAgICBhc3NlcnQuaXNUcnVlKGV2ZXJ5KFttb2RlbC5nZXROYW1lKCd4JyksIG1vZGVsLmdldE5hbWUoJ3knKV0sIChhKSA9PiBjb250YWlucyh0cmFuc2Zvcm0uYXMsIGEpKSk7XG4gICAgICAgIGFzc2VydC5pc0RlZmluZWQodHJhbnNmb3JtLnByb2plY3Rpb24pO1xuICAgICAgICBhc3NlcnQuaXNBdE1vc3Qobm9kZS5jaGlsZHJlbi5sZW5ndGgsIDEpO1xuICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/lookup.test.d.ts b/build/test/compile/data/lookup.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/lookup.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/lookup.test.js b/build/test/compile/data/lookup.test.js new file mode 100644 index 0000000000..e81eb28d94 --- /dev/null +++ b/build/test/compile/data/lookup.test.js @@ -0,0 +1,80 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var data_1 = require("../../../src/compile/data"); +var lookup_1 = require("../../../src/compile/data/lookup"); +var parse_1 = require("../../../src/compile/data/parse"); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../util"); +describe('compile/data/lookup', function () { + it('should parse lookup from array', function () { + var model = util_1.parseUnitModel({ + 'data': { 'url': 'data/lookup_groups.csv' }, + 'transform': [{ + 'lookup': 'person', + 'from': { + 'data': { 'url': 'data/lookup_people.csv' }, + 'key': 'name', + 'fields': ['age', 'height'] + } + }], + 'mark': 'bar', + 'encoding': {} + }); + var t = parse_1.parseTransformArray(null, model, new data_1.AncestorParse); + chai_1.assert.deepEqual(t.assemble(), { + type: 'lookup', + from: 'lookup_0', + key: 'name', + fields: ['person'], + values: ['age', 'height'] + }); + }); + it('should create node for flat lookup', function () { + var lookup = new lookup_1.LookupNode(null, { + 'lookup': 'person', + 'from': { + 'data': { 'url': 'data/lookup_people.csv' }, + 'key': 'name', + 'fields': ['age', 'height'] + } + }, 'lookup_0'); + chai_1.assert.deepEqual(lookup.assemble(), { + type: 'lookup', + from: 'lookup_0', + key: 'name', + fields: ['person'], + values: ['age', 'height'] + }); + }); + it('should create node for nested lookup', function () { + var lookup = new lookup_1.LookupNode(null, { + 'lookup': 'person', + 'from': { + 'data': { 'url': 'data/lookup_people.csv' }, + 'key': 'name' + }, + 'as': 'foo' + }, 'lookup_0'); + chai_1.assert.deepEqual(lookup.assemble(), { + type: 'lookup', + from: 'lookup_0', + key: 'name', + fields: ['person'], + as: ['foo'] + }); + }); + it('should warn if fields are not specified and as is missing', log.wrap(function (localLogger) { + var lookup = new lookup_1.LookupNode(null, { + 'lookup': 'person', + 'from': { + 'data': { 'url': 'data/lookup_people.csv' }, + 'key': 'name' + } + }, 'lookup_0'); + lookup.assemble(); + chai_1.assert.equal(localLogger.warns[0], log.message.NO_FIELDS_NEEDS_AS); + })); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9sb29rdXAudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsa0RBQXdEO0FBQ3hELDJEQUE0RDtBQUM1RCx5REFBb0U7QUFDcEUsNERBQXdDO0FBRXhDLG1DQUEwQztBQUUxQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1FBQ25DLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7WUFDM0IsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFDO1lBQ3pDLFdBQVcsRUFBRSxDQUFDO29CQUNaLFFBQVEsRUFBRSxRQUFRO29CQUNsQixNQUFNLEVBQUU7d0JBQ04sTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFDO3dCQUN6QyxLQUFLLEVBQUUsTUFBTTt3QkFDYixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO3FCQUM1QjtpQkFDRixDQUFDO1lBQ0YsTUFBTSxFQUFFLEtBQUs7WUFDYixVQUFVLEVBQUUsRUFBRTtTQUNmLENBQUMsQ0FBQztRQUVILElBQU0sQ0FBQyxHQUFHLDJCQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxvQkFBYSxDQUFDLENBQUM7UUFDOUQsYUFBTSxDQUFDLFNBQVMsQ0FBcUIsQ0FBZ0IsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNoRSxJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxVQUFVO1lBQ2hCLEdBQUcsRUFBRSxNQUFNO1lBQ1gsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ2xCLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDdkMsSUFBTSxNQUFNLEdBQUcsSUFBSSxtQkFBVSxDQUFDLElBQUksRUFBRTtZQUNoQyxRQUFRLEVBQUUsUUFBUTtZQUNsQixNQUFNLEVBQUU7Z0JBQ04sTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHdCQUF3QixFQUFDO2dCQUN6QyxLQUFLLEVBQUUsTUFBTTtnQkFDYixRQUFRLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO2FBQzVCO1NBQ0YsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqQixhQUFNLENBQUMsU0FBUyxDQUFvQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDckQsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsVUFBVTtZQUNoQixHQUFHLEVBQUUsTUFBTTtZQUNYLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNsQixNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1FBQ3pDLElBQU0sTUFBTSxHQUFHLElBQUksbUJBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDaEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFO2dCQUNOLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSx3QkFBd0IsRUFBQztnQkFDekMsS0FBSyxFQUFFLE1BQU07YUFDZDtZQUNELElBQUksRUFBRSxLQUFLO1NBQ1osRUFBRSxVQUFVLENBQUMsQ0FBQztRQUVqQixhQUFNLENBQUMsU0FBUyxDQUFvQixNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDckQsSUFBSSxFQUFFLFFBQVE7WUFDZCxJQUFJLEVBQUUsVUFBVTtZQUNoQixHQUFHLEVBQUUsTUFBTTtZQUNYLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNsQixFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDWixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyREFBMkQsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQUMsV0FBVztRQUNuRixJQUFNLE1BQU0sR0FBRyxJQUFJLG1CQUFVLENBQUMsSUFBSSxFQUFFO1lBQ2hDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE1BQU0sRUFBRTtnQkFDTixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsd0JBQXdCLEVBQUM7Z0JBQ3pDLEtBQUssRUFBRSxNQUFNO2FBQ2Q7U0FDRixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVsQixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7QW5jZXN0b3JQYXJzZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YSc7XG5pbXBvcnQge0xvb2t1cE5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvbG9va3VwJztcbmltcG9ydCB7cGFyc2VUcmFuc2Zvcm1BcnJheX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9wYXJzZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge1ZnTG9va3VwVHJhbnNmb3JtfSBmcm9tICcuLi8uLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdjb21waWxlL2RhdGEvbG9va3VwJywgZnVuY3Rpb24oKSB7XG4gIGl0KCdzaG91bGQgcGFyc2UgbG9va3VwIGZyb20gYXJyYXknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAnZGF0YSc6IHsndXJsJzogJ2RhdGEvbG9va3VwX2dyb3Vwcy5jc3YnfSxcbiAgICAgICd0cmFuc2Zvcm0nOiBbe1xuICAgICAgICAnbG9va3VwJzogJ3BlcnNvbicsXG4gICAgICAgICdmcm9tJzoge1xuICAgICAgICAgICdkYXRhJzogeyd1cmwnOiAnZGF0YS9sb29rdXBfcGVvcGxlLmNzdid9LFxuICAgICAgICAgICdrZXknOiAnbmFtZScsXG4gICAgICAgICAgJ2ZpZWxkcyc6IFsnYWdlJywgJ2hlaWdodCddXG4gICAgICAgIH1cbiAgICAgIH1dLFxuICAgICAgJ21hcmsnOiAnYmFyJyxcbiAgICAgICdlbmNvZGluZyc6IHt9XG4gICAgfSk7XG5cbiAgICBjb25zdCB0ID0gcGFyc2VUcmFuc2Zvcm1BcnJheShudWxsLCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2UpO1xuICAgIGFzc2VydC5kZWVwRXF1YWw8VmdMb29rdXBUcmFuc2Zvcm0+KCh0IGFzIExvb2t1cE5vZGUpLmFzc2VtYmxlKCksIHtcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgZnJvbTogJ2xvb2t1cF8wJyxcbiAgICAgIGtleTogJ25hbWUnLFxuICAgICAgZmllbGRzOiBbJ3BlcnNvbiddLFxuICAgICAgdmFsdWVzOiBbJ2FnZScsICdoZWlnaHQnXVxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGNyZWF0ZSBub2RlIGZvciBmbGF0IGxvb2t1cCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBsb29rdXAgPSBuZXcgTG9va3VwTm9kZShudWxsLCB7XG4gICAgICAgICdsb29rdXAnOiAncGVyc29uJyxcbiAgICAgICAgJ2Zyb20nOiB7XG4gICAgICAgICAgJ2RhdGEnOiB7J3VybCc6ICdkYXRhL2xvb2t1cF9wZW9wbGUuY3N2J30sXG4gICAgICAgICAgJ2tleSc6ICduYW1lJyxcbiAgICAgICAgICAnZmllbGRzJzogWydhZ2UnLCAnaGVpZ2h0J11cbiAgICAgICAgfVxuICAgICAgfSwgJ2xvb2t1cF8wJyk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsPFZnTG9va3VwVHJhbnNmb3JtPihsb29rdXAuYXNzZW1ibGUoKSwge1xuICAgICAgdHlwZTogJ2xvb2t1cCcsXG4gICAgICBmcm9tOiAnbG9va3VwXzAnLFxuICAgICAga2V5OiAnbmFtZScsXG4gICAgICBmaWVsZHM6IFsncGVyc29uJ10sXG4gICAgICB2YWx1ZXM6IFsnYWdlJywgJ2hlaWdodCddXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgY3JlYXRlIG5vZGUgZm9yIG5lc3RlZCBsb29rdXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbG9va3VwID0gbmV3IExvb2t1cE5vZGUobnVsbCwge1xuICAgICAgICAnbG9va3VwJzogJ3BlcnNvbicsXG4gICAgICAgICdmcm9tJzoge1xuICAgICAgICAgICdkYXRhJzogeyd1cmwnOiAnZGF0YS9sb29rdXBfcGVvcGxlLmNzdid9LFxuICAgICAgICAgICdrZXknOiAnbmFtZSdcbiAgICAgICAgfSxcbiAgICAgICAgJ2FzJzogJ2ZvbydcbiAgICAgIH0sICdsb29rdXBfMCcpO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ0xvb2t1cFRyYW5zZm9ybT4obG9va3VwLmFzc2VtYmxlKCksIHtcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgZnJvbTogJ2xvb2t1cF8wJyxcbiAgICAgIGtleTogJ25hbWUnLFxuICAgICAgZmllbGRzOiBbJ3BlcnNvbiddLFxuICAgICAgYXM6IFsnZm9vJ11cbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB3YXJuIGlmIGZpZWxkcyBhcmUgbm90IHNwZWNpZmllZCBhbmQgYXMgaXMgbWlzc2luZycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGNvbnN0IGxvb2t1cCA9IG5ldyBMb29rdXBOb2RlKG51bGwsIHtcbiAgICAgICAgJ2xvb2t1cCc6ICdwZXJzb24nLFxuICAgICAgICAnZnJvbSc6IHtcbiAgICAgICAgICAnZGF0YSc6IHsndXJsJzogJ2RhdGEvbG9va3VwX3Blb3BsZS5jc3YnfSxcbiAgICAgICAgICAna2V5JzogJ25hbWUnXG4gICAgICAgIH1cbiAgICAgIH0sICdsb29rdXBfMCcpO1xuICAgIGxvb2t1cC5hc3NlbWJsZSgpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5OT19GSUVMRFNfTkVFRFNfQVMpO1xuICB9KSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/parse.test.d.ts b/build/test/compile/data/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/parse.test.js b/build/test/compile/data/parse.test.js new file mode 100644 index 0000000000..8713f30405 --- /dev/null +++ b/build/test/compile/data/parse.test.js @@ -0,0 +1,209 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var data_1 = require("../../../src/compile/data"); +var aggregate_1 = require("../../../src/compile/data/aggregate"); +var bin_1 = require("../../../src/compile/data/bin"); +var calculate_1 = require("../../../src/compile/data/calculate"); +var dataflow_1 = require("../../../src/compile/data/dataflow"); +var filter_1 = require("../../../src/compile/data/filter"); +var formatparse_1 = require("../../../src/compile/data/formatparse"); +var parse_1 = require("../../../src/compile/data/parse"); +var timeunit_1 = require("../../../src/compile/data/timeunit"); +var window_1 = require("../../../src/compile/data/window"); +var util_1 = require("../../util"); +describe('compile/data/parse', function () { + describe('parseTransformArray()', function () { + it('should return a CalculateNode and a FilterNode', function () { + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [{ calculate: 'calculate', as: 'as' }, { filter: 'filter' }], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + var result = parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof calculate_1.CalculateNode); + chai_1.assert.isTrue(result instanceof filter_1.FilterNode); + }); + it('should add a parse node for filter transforms with time unit', function () { + var model = util_1.parseUnitModel({ + "data": { "url": "a.json" }, + "transform": [{ + "filter": { + "not": { + "and": [{ + "or": [ + { + "timeUnit": "year", + "field": "date", + "equal": 2005 + }, + "datum.a > 5" + ] + }] + } + } + }], + "mark": "point", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "temporal" }, + "color": { "field": "c", "type": "ordinal" }, + "shape": { "field": "d", "type": "nominal" } + } + }); + var root = new dataflow_1.DataFlowNode(null); + var parse = new data_1.AncestorParse(); + var result = parse_1.parseTransformArray(root, model, parse); + chai_1.assert.isTrue(root.children[0] instanceof formatparse_1.ParseNode); + chai_1.assert.isTrue(result instanceof filter_1.FilterNode); + chai_1.assert.deepEqual(root.children[0].parse, { + date: 'date' + }); + chai_1.assert.deepEqual(parse.combine(), { date: 'date' }); + }); + it('should return a BinNode node and a TimeUnitNode', function () { + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [{ bin: true, field: 'field', as: 'a' }, { timeUnit: 'month', field: 'field', as: 'b' }], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + var parse = new data_1.AncestorParse(); + var result = parse_1.parseTransformArray(root, model, parse); + chai_1.assert.isTrue(root.children[0] instanceof bin_1.BinNode); + chai_1.assert.isTrue(result instanceof timeunit_1.TimeUnitNode); + chai_1.assert.deepEqual(parse.combine(), { a: 'number', b: 'date' }); + }); + it('should return a BinNode and a AggregateNode', function () { + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [{ bin: true, field: 'field', as: 'a' }, { aggregate: [{ op: 'count', field: 'f', as: 'b' }, { op: 'sum', field: 'f', as: 'c' }], groupby: ['field'] }], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + var result = parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof bin_1.BinNode); + chai_1.assert.isTrue(result instanceof aggregate_1.AggregateNode); + }); + it('should return a WindowTransform Node', function () { + var transform = { + window: [ + { + op: 'count', + field: 'f', + as: 'b', + } + ], + }; + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [ + transform + ], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof window_1.WindowTransformNode); + }); + it('should return a WindowTransform Node with optional properties', function () { + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ] + }; + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [ + transform + ], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof window_1.WindowTransformNode); + }); + it('should return a WindowTransform Node', function () { + var transform = { + window: [ + { + op: 'count', + field: 'f', + as: 'b', + } + ], + }; + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [ + transform + ], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof window_1.WindowTransformNode); + }); + it('should return a WindowTransform Node with optional properties', function () { + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ] + }; + var model = util_1.parseUnitModel({ + data: { values: [] }, + mark: 'point', + transform: [ + transform + ], + encoding: { + x: { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + var root = new dataflow_1.DataFlowNode(null); + parse_1.parseTransformArray(root, model, new data_1.AncestorParse()); + chai_1.assert.isTrue(root.children[0] instanceof window_1.WindowTransformNode); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL3BhcnNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLGtEQUF3RDtBQUN4RCxpRUFBa0U7QUFDbEUscURBQXNEO0FBQ3RELGlFQUFrRTtBQUNsRSwrREFBZ0U7QUFDaEUsMkRBQTREO0FBQzVELHFFQUFnRTtBQUNoRSx5REFBb0U7QUFDcEUsK0RBQWdFO0FBQ2hFLDJEQUFxRTtBQUVyRSxtQ0FBMEM7QUFFMUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFO0lBQzdCLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQztnQkFDbEIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQztnQkFDbkUsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUNyRDthQUNGLENBQUMsQ0FBQztZQUVILElBQU0sSUFBSSxHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFNLE1BQU0sR0FBRywyQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsRUFBRSxDQUFDLENBQUM7WUFDckUsYUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLHlCQUFhLENBQUMsQ0FBQztZQUN6RCxhQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxtQkFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOERBQThELEVBQUU7WUFDakUsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQztnQkFDekIsV0FBVyxFQUFFLENBQUM7d0JBQ1osUUFBUSxFQUFFOzRCQUNSLEtBQUssRUFBRTtnQ0FDTCxLQUFLLEVBQUUsQ0FBQzt3Q0FDTixJQUFJLEVBQUU7NENBQ0o7Z0RBQ0UsVUFBVSxFQUFFLE1BQU07Z0RBQ2xCLE9BQU8sRUFBRSxNQUFNO2dEQUNmLE9BQU8sRUFBRSxJQUFJOzZDQUNkOzRDQUNELGFBQWE7eUNBQ2Q7cUNBQ0YsQ0FBQzs2QkFDSDt5QkFDRjtxQkFDRixDQUFDO2dCQUNGLE1BQU0sRUFBRSxPQUFPO2dCQUNmLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQzNDLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQztvQkFDdkMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO29CQUMxQyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7aUJBQzNDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsSUFBTSxJQUFJLEdBQUcsSUFBSSx1QkFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQU0sS0FBSyxHQUFHLElBQUksb0JBQWEsRUFBRSxDQUFDO1lBQ2xDLElBQU0sTUFBTSxHQUFHLDJCQUFtQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFdkQsYUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLHVCQUFTLENBQUMsQ0FBQztZQUNyRCxhQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxtQkFBVSxDQUFDLENBQUM7WUFDNUMsYUFBTSxDQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBZSxDQUFDLEtBQUssRUFBRTtnQkFDdEQsSUFBSSxFQUFFLE1BQU07YUFDYixDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUM7Z0JBQ2xCLElBQUksRUFBRSxPQUFPO2dCQUNiLFNBQVMsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFDLENBQUM7Z0JBQy9GLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQztpQkFDckQ7YUFDRixDQUFDLENBQUM7WUFFSCxJQUFNLElBQUksR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBTSxLQUFLLEdBQUcsSUFBSSxvQkFBYSxFQUFFLENBQUM7WUFDbEMsSUFBTSxNQUFNLEdBQUcsMkJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RCxhQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksYUFBTyxDQUFDLENBQUM7WUFDbkQsYUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLFlBQVksdUJBQVksQ0FBQyxDQUFDO1lBQzlDLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtZQUNoRCxJQUFNLEtBQUssR0FBRyxxQkFBYyxDQUFDO2dCQUMzQixJQUFJLEVBQUUsRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDO2dCQUNsQixJQUFJLEVBQUUsT0FBTztnQkFDYixTQUFTLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFDLEVBQUUsRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFDLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFDLEVBQUUsRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQztnQkFDMUosUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUNyRDthQUNGLENBQUMsQ0FBQztZQUVILElBQU0sSUFBSSxHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFNLE1BQU0sR0FBRywyQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsRUFBRSxDQUFDLENBQUM7WUFDckUsYUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLGFBQU8sQ0FBQyxDQUFDO1lBQ25ELGFBQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxZQUFZLHlCQUFhLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBRSxzQ0FBc0MsRUFBRTtZQUMxQyxJQUFNLFNBQVMsR0FBYztnQkFDM0IsTUFBTSxFQUFFO29CQUNOO3dCQUNFLEVBQUUsRUFBRSxPQUFPO3dCQUNYLEtBQUssRUFBRSxHQUFHO3dCQUNWLEVBQUUsRUFBRSxHQUFHO3FCQUNSO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUM7Z0JBQ2xCLElBQUksRUFBRSxPQUFPO2dCQUNiLFNBQVMsRUFBRTtvQkFDVCxTQUFTO2lCQUNWO2dCQUNELFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQztpQkFDckQ7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFNLElBQUksR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsMkJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELGFBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSw0QkFBbUIsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsRUFBRSxDQUFFLCtEQUErRCxFQUFFO1lBQ25FLElBQU0sU0FBUyxHQUFjO2dCQUMzQixNQUFNLEVBQUU7b0JBQ047d0JBQ0UsRUFBRSxFQUFFLFlBQVk7d0JBQ2hCLEVBQUUsRUFBRSxvQkFBb0I7cUJBQ3pCO2lCQUNGO2dCQUNELFdBQVcsRUFBRSxLQUFLO2dCQUNsQixJQUFJLEVBQUc7b0JBQ0w7d0JBQ0UsS0FBSyxFQUFDLEdBQUc7d0JBQ1QsS0FBSyxFQUFDLFdBQVc7cUJBQ2xCO2lCQUNGO2FBQ0YsQ0FBQztZQUNGLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUM7Z0JBQ2xCLElBQUksRUFBRSxPQUFPO2dCQUNiLFNBQVMsRUFBRTtvQkFDVCxTQUFTO2lCQUNWO2dCQUNELFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQztpQkFDckQ7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFNLElBQUksR0FBRyxJQUFJLHVCQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsMkJBQW1CLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLG9CQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELGFBQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSw0QkFBbUIsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFFLHNDQUFzQyxFQUFFO1lBQzFDLElBQU0sU0FBUyxHQUFjO2dCQUMzQixNQUFNLEVBQUU7b0JBQ047d0JBQ0UsRUFBRSxFQUFFLE9BQU87d0JBQ1gsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsRUFBRSxFQUFFLEdBQUc7cUJBQ1I7aUJBQ0Y7YUFDRixDQUFDO1lBQ0YsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQztnQkFDbEIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFO29CQUNULFNBQVM7aUJBQ1Y7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUNyRDthQUNGLENBQUMsQ0FBQztZQUNILElBQU0sSUFBSSxHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQywyQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsRUFBRSxDQUFDLENBQUM7WUFDdEQsYUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLDRCQUFtQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUUsK0RBQStELEVBQUU7WUFDbkUsSUFBTSxTQUFTLEdBQWM7Z0JBQzNCLE1BQU0sRUFBRTtvQkFDTjt3QkFDRSxFQUFFLEVBQUUsWUFBWTt3QkFDaEIsRUFBRSxFQUFFLG9CQUFvQjtxQkFDekI7aUJBQ0Y7Z0JBQ0QsV0FBVyxFQUFFLEtBQUs7Z0JBQ2xCLElBQUksRUFBRTtvQkFDRjt3QkFDRSxLQUFLLEVBQUMsR0FBRzt3QkFDVCxLQUFLLEVBQUMsV0FBVztxQkFDbEI7aUJBQ0Y7YUFDSixDQUFDO1lBQ0YsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQztnQkFDbEIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFO29CQUNULFNBQVM7aUJBQ1Y7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUNyRDthQUNGLENBQUMsQ0FBQztZQUNILElBQU0sSUFBSSxHQUFHLElBQUksdUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQywyQkFBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksb0JBQWEsRUFBRSxDQUFDLENBQUM7WUFDdEQsYUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLDRCQUFtQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7QW5jZXN0b3JQYXJzZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YSc7XG5pbXBvcnQge0FnZ3JlZ2F0ZU5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvYWdncmVnYXRlJztcbmltcG9ydCB7QmluTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9iaW4nO1xuaW1wb3J0IHtDYWxjdWxhdGVOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2NhbGN1bGF0ZSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9kYXRhZmxvdyc7XG5pbXBvcnQge0ZpbHRlck5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZmlsdGVyJztcbmltcG9ydCB7UGFyc2VOb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Zvcm1hdHBhcnNlJztcbmltcG9ydCB7cGFyc2VUcmFuc2Zvcm1BcnJheX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9wYXJzZSc7XG5pbXBvcnQge1RpbWVVbml0Tm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS90aW1ldW5pdCc7XG5pbXBvcnQge1dpbmRvd1RyYW5zZm9ybU5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvd2luZG93JztcbmltcG9ydCB7VHJhbnNmb3JtfSBmcm9tICcuLi8uLi8uLi9zcmMvdHJhbnNmb3JtJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL3BhcnNlJywgKCkgPT4ge1xuICBkZXNjcmliZSgncGFyc2VUcmFuc2Zvcm1BcnJheSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgQ2FsY3VsYXRlTm9kZSBhbmQgYSBGaWx0ZXJOb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIGRhdGE6IHt2YWx1ZXM6IFtdfSxcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgdHJhbnNmb3JtOiBbe2NhbGN1bGF0ZTogJ2NhbGN1bGF0ZScsIGFzOiAnYXMnfSwge2ZpbHRlcjogJ2ZpbHRlcid9XSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ3RlbXBvcmFsJywgdGltZVVuaXQ6ICdtb250aCd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByb290ID0gbmV3IERhdGFGbG93Tm9kZShudWxsKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShyb290LmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgQ2FsY3VsYXRlTm9kZSk7XG4gICAgICBhc3NlcnQuaXNUcnVlKHJlc3VsdCBpbnN0YW5jZW9mIEZpbHRlck5vZGUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgYSBwYXJzZSBub2RlIGZvciBmaWx0ZXIgdHJhbnNmb3JtcyB3aXRoIHRpbWUgdW5pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiYS5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbe1xuICAgICAgICAgIFwiZmlsdGVyXCI6IHtcbiAgICAgICAgICAgIFwibm90XCI6IHtcbiAgICAgICAgICAgICAgXCJhbmRcIjogW3tcbiAgICAgICAgICAgICAgICBcIm9yXCI6IFtcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJ0aW1lVW5pdFwiOiBcInllYXJcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJlcXVhbFwiOiAyMDA1XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXCJkYXR1bS5hID4gNVwiXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfV0sXG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcImNcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBcInNoYXBlXCI6IHtcImZpZWxkXCI6IFwiZFwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByb290ID0gbmV3IERhdGFGbG93Tm9kZShudWxsKTtcbiAgICAgIGNvbnN0IHBhcnNlID0gbmV3IEFuY2VzdG9yUGFyc2UoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIHBhcnNlKTtcblxuICAgICAgYXNzZXJ0LmlzVHJ1ZShyb290LmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgUGFyc2VOb2RlKTtcbiAgICAgIGFzc2VydC5pc1RydWUocmVzdWx0IGluc3RhbmNlb2YgRmlsdGVyTm9kZSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKChyb290LmNoaWxkcmVuWzBdIGFzIFBhcnNlTm9kZSkucGFyc2UsIHtcbiAgICAgICAgZGF0ZTogJ2RhdGUnXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocGFyc2UuY29tYmluZSgpLCB7ZGF0ZTogJ2RhdGUnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIEJpbk5vZGUgbm9kZSBhbmQgYSBUaW1lVW5pdE5vZGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgZGF0YToge3ZhbHVlczogW119LFxuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICB0cmFuc2Zvcm06IFt7YmluOiB0cnVlLCBmaWVsZDogJ2ZpZWxkJywgYXM6ICdhJ30sIHt0aW1lVW5pdDogJ21vbnRoJywgZmllbGQ6ICdmaWVsZCcsIGFzOiAnYid9XSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ3RlbXBvcmFsJywgdGltZVVuaXQ6ICdtb250aCd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByb290ID0gbmV3IERhdGFGbG93Tm9kZShudWxsKTtcbiAgICAgIGNvbnN0IHBhcnNlID0gbmV3IEFuY2VzdG9yUGFyc2UoKTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIHBhcnNlKTtcbiAgICAgIGFzc2VydC5pc1RydWUocm9vdC5jaGlsZHJlblswXSBpbnN0YW5jZW9mIEJpbk5vZGUpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShyZXN1bHQgaW5zdGFuY2VvZiBUaW1lVW5pdE5vZGUpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwYXJzZS5jb21iaW5lKCksIHthOiAnbnVtYmVyJywgYjogJ2RhdGUnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIEJpbk5vZGUgYW5kIGEgQWdncmVnYXRlTm9kZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBkYXRhOiB7dmFsdWVzOiBbXX0sXG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIHRyYW5zZm9ybTogW3tiaW46IHRydWUsIGZpZWxkOiAnZmllbGQnLCBhczogJ2EnfSwge2FnZ3JlZ2F0ZTogW3tvcDogJ2NvdW50JywgZmllbGQ6ICdmJywgYXM6ICdiJ30sIHtvcDogJ3N1bScsIGZpZWxkOiAnZicsIGFzOiAnYyd9XSwgZ3JvdXBieTogWydmaWVsZCddfV0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICd0ZW1wb3JhbCcsIHRpbWVVbml0OiAnbW9udGgnfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgcm9vdCA9IG5ldyBEYXRhRmxvd05vZGUobnVsbCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBwYXJzZVRyYW5zZm9ybUFycmF5KHJvb3QsIG1vZGVsLCBuZXcgQW5jZXN0b3JQYXJzZSgpKTtcbiAgICAgIGFzc2VydC5pc1RydWUocm9vdC5jaGlsZHJlblswXSBpbnN0YW5jZW9mIEJpbk5vZGUpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShyZXN1bHQgaW5zdGFuY2VvZiBBZ2dyZWdhdGVOb2RlKTtcbiAgICB9KTtcblxuICAgIGl0ICgnc2hvdWxkIHJldHVybiBhIFdpbmRvd1RyYW5zZm9ybSBOb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB7XG4gICAgICAgIHdpbmRvdzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wOiAnY291bnQnLFxuICAgICAgICAgICAgZmllbGQ6ICdmJyxcbiAgICAgICAgICAgIGFzOiAnYicsXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBkYXRhOiB7dmFsdWVzOiBbXX0sXG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIHRyYW5zZm9ybTogW1xuICAgICAgICAgIHRyYW5zZm9ybVxuICAgICAgICBdLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ21vbnRoJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCByb290ID0gbmV3IERhdGFGbG93Tm9kZShudWxsKTtcbiAgICAgIHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShyb290LmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgV2luZG93VHJhbnNmb3JtTm9kZSk7XG4gICAgfSk7XG4gICAgaXQgKCdzaG91bGQgcmV0dXJuIGEgV2luZG93VHJhbnNmb3JtIE5vZGUgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB7XG4gICAgICAgIHdpbmRvdzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wOiAncm93X251bWJlcicsXG4gICAgICAgICAgICBhczogJ29yZGVyZWRfcm93X251bWJlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgICBzb3J0OiAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOidmJyxcbiAgICAgICAgICAgIG9yZGVyOidhc2NlbmRpbmcnXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIGRhdGE6IHt2YWx1ZXM6IFtdfSxcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgdHJhbnNmb3JtOiBbXG4gICAgICAgICAgdHJhbnNmb3JtXG4gICAgICAgIF0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICd0ZW1wb3JhbCcsIHRpbWVVbml0OiAnbW9udGgnfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJvb3QgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgICAgcGFyc2VUcmFuc2Zvcm1BcnJheShyb290LCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2UoKSk7XG4gICAgICBhc3NlcnQuaXNUcnVlKHJvb3QuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBXaW5kb3dUcmFuc2Zvcm1Ob2RlKTtcbiAgICB9KTtcblxuICAgIGl0ICgnc2hvdWxkIHJldHVybiBhIFdpbmRvd1RyYW5zZm9ybSBOb2RlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB7XG4gICAgICAgIHdpbmRvdzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wOiAnY291bnQnLFxuICAgICAgICAgICAgZmllbGQ6ICdmJyxcbiAgICAgICAgICAgIGFzOiAnYicsXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBkYXRhOiB7dmFsdWVzOiBbXX0sXG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIHRyYW5zZm9ybTogW1xuICAgICAgICAgIHRyYW5zZm9ybVxuICAgICAgICBdLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ21vbnRoJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCByb290ID0gbmV3IERhdGFGbG93Tm9kZShudWxsKTtcbiAgICAgIHBhcnNlVHJhbnNmb3JtQXJyYXkocm9vdCwgbW9kZWwsIG5ldyBBbmNlc3RvclBhcnNlKCkpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShyb290LmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgV2luZG93VHJhbnNmb3JtTm9kZSk7XG4gICAgfSk7XG4gICAgaXQgKCdzaG91bGQgcmV0dXJuIGEgV2luZG93VHJhbnNmb3JtIE5vZGUgd2l0aCBvcHRpb25hbCBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB7XG4gICAgICAgIHdpbmRvdzogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9wOiAncm93X251bWJlcicsXG4gICAgICAgICAgICBhczogJ29yZGVyZWRfcm93X251bWJlcicsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgICBzb3J0OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGZpZWxkOidmJyxcbiAgICAgICAgICAgICAgb3JkZXI6J2FzY2VuZGluZydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICB9O1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIGRhdGE6IHt2YWx1ZXM6IFtdfSxcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgdHJhbnNmb3JtOiBbXG4gICAgICAgICAgdHJhbnNmb3JtXG4gICAgICAgIF0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICd0ZW1wb3JhbCcsIHRpbWVVbml0OiAnbW9udGgnfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJvb3QgPSBuZXcgRGF0YUZsb3dOb2RlKG51bGwpO1xuICAgICAgcGFyc2VUcmFuc2Zvcm1BcnJheShyb290LCBtb2RlbCwgbmV3IEFuY2VzdG9yUGFyc2UoKSk7XG4gICAgICBhc3NlcnQuaXNUcnVlKHJvb3QuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBXaW5kb3dUcmFuc2Zvcm1Ob2RlKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/data/source.test.d.ts b/build/test/compile/data/source.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/source.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/source.test.js b/build/test/compile/data/source.test.js new file mode 100644 index 0000000000..0da8a41c03 --- /dev/null +++ b/build/test/compile/data/source.test.js @@ -0,0 +1,107 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var source_1 = require("../../../src/compile/data/source"); +function parse(data) { + return new source_1.SourceNode(data); +} +describe('compile/data/source', function () { + describe('compileUnit', function () { + describe('with explicit values', function () { + var source = parse({ + values: [{ a: 1, b: 2, c: 3 }, { a: 4, b: 5, c: 6 }] + }); + it('should have values', function () { + chai_1.assert.deepEqual(source.data.values, [{ a: 1, b: 2, c: 3 }, { a: 4, b: 5, c: 6 }]); + }); + it('should have no source.format.type', function () { + chai_1.assert.deepEqual(source.data.format, undefined); + }); + }); + describe('with explicit values as CSV', function () { + var source = parse({ + values: "a\n1\n2\n3", + format: { type: 'csv' } + }); + it('should have values', function () { + chai_1.assert.deepEqual(source.data.values, "a\n1\n2\n3"); + }); + it('should have correct type', function () { + chai_1.assert.equal(source.data.format.type, 'csv'); + }); + }); + describe('with link to url', function () { + var source = parse({ + url: 'http://foo.bar/file.csv', + }); + it('should have format.type csv', function () { + chai_1.assert.equal(source.data.format.type, 'csv'); + }); + it('should have correct url', function () { + chai_1.assert.equal(source.data.url, 'http://foo.bar/file.csv'); + }); + }); + describe('without file ending', function () { + var source = parse({ + url: 'http://foo.bar/file.baz', + }); + it('should have format.type json', function () { + chai_1.assert.equal(source.data.format.type, 'json'); + }); + }); + describe('with no data specified', function () { + var source = parse(undefined); + it('should provide placeholder source data', function () { + chai_1.assert.equal(source.dataName, 'source'); + }); + }); + describe('with named data source provided', function () { + var source = parse({ name: 'foo' }); + it('should provide named source data', function () { + chai_1.assert.equal(source.dataName, 'foo'); + }); + }); + describe('data format', function () { + describe('json', function () { + it('should include property if specified', function () { + var source = parse({ + url: 'http://foo.bar', + format: { type: 'json', property: 'baz' } + }); + chai_1.assert.equal(source.data.format.property, 'baz'); + }); + }); + describe('topojson', function () { + describe('feature property is specified', function () { + var source = parse({ + url: 'http://foo.bar', + format: { type: 'topojson', feature: 'baz' } + }); + it('should have format.type topojson', function () { + chai_1.assert.equal(source.data.format.type, 'topojson'); + }); + it('should have format.feature baz', function () { + chai_1.assert.equal(source.data.format.feature, 'baz'); + }); + }); + describe('mesh property is specified', function () { + var source = parse({ + url: 'http://foo.bar', + format: { type: 'topojson', mesh: 'baz' } + }); + it('should have format.type topojson', function () { + chai_1.assert.equal(source.data.format.type, 'topojson'); + }); + it('should have format.mesh baz', function () { + chai_1.assert.equal(source.data.format.mesh, 'baz'); + }); + }); + }); + }); + }); + describe('assemble', function () { + // TODO: write test + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS9zb3VyY2UudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOztBQUU5Qiw2QkFBNEI7QUFFNUIsMkRBQTREO0FBRzVELGVBQWUsSUFBVTtJQUN2QixPQUFPLElBQUksbUJBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBRUQsUUFBUSxDQUFDLHFCQUFxQixFQUFFO0lBQzlCLFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsUUFBUSxDQUFDLHNCQUFzQixFQUFFO1lBQy9CLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztnQkFDbkIsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBQyxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQzthQUM3QyxDQUFDLENBQUM7WUFFSCxFQUFFLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3ZCLGFBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztZQUM3RSxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyxtQ0FBbUMsRUFBRTtnQkFDdEMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxD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QUFDO29CQUMvQyxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDbkIsbUJBQW1CO0lBQ3JCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvc291cmNlJztcbmltcG9ydCB7RGF0YX0gZnJvbSAnLi4vLi4vLi4vc3JjL2RhdGEnO1xuXG5mdW5jdGlvbiBwYXJzZShkYXRhOiBEYXRhKSB7XG4gIHJldHVybiBuZXcgU291cmNlTm9kZShkYXRhKTtcbn1cblxuZGVzY3JpYmUoJ2NvbXBpbGUvZGF0YS9zb3VyY2UnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdjb21waWxlVW5pdCcsICgpID0+IHtcbiAgICBkZXNjcmliZSgnd2l0aCBleHBsaWNpdCB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXJzZSh7XG4gICAgICAgIHZhbHVlczogW3thOiAxLCBiOjIsIGM6M30sIHthOiA0LCBiOjUsIGM6Nn1dXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIHZhbHVlcycsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzb3VyY2UuZGF0YS52YWx1ZXMsIFt7YTogMSwgYjoyLCBjOjN9LCB7YTogNCwgYjo1LCBjOjZ9XSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIG5vIHNvdXJjZS5mb3JtYXQudHlwZScsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzb3VyY2UuZGF0YS5mb3JtYXQsIHVuZGVmaW5lZCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGV4cGxpY2l0IHZhbHVlcyBhcyBDU1YnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXJzZSh7XG4gICAgICAgIHZhbHVlczogXCJhXFxuMVxcbjJcXG4zXCIsXG4gICAgICAgIGZvcm1hdDoge3R5cGU6ICdjc3YnfVxuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgaGF2ZSB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoc291cmNlLmRhdGEudmFsdWVzLCBcImFcXG4xXFxuMlxcbjNcIik7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgdHlwZScsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNvdXJjZS5kYXRhLmZvcm1hdC50eXBlLCAnY3N2Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRoIGxpbmsgdG8gdXJsJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gcGFyc2Uoe1xuICAgICAgICB1cmw6ICdodHRwOi8vZm9vLmJhci9maWxlLmNzdicsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGZvcm1hdC50eXBlIGNzdicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNvdXJjZS5kYXRhLmZvcm1hdC50eXBlLCAnY3N2Jyk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHVybCcsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNvdXJjZS5kYXRhLnVybCwgJ2h0dHA6Ly9mb28uYmFyL2ZpbGUuY3N2Jyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCd3aXRob3V0IGZpbGUgZW5kaW5nJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gcGFyc2Uoe1xuICAgICAgICB1cmw6ICdodHRwOi8vZm9vLmJhci9maWxlLmJheicsXG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBoYXZlIGZvcm1hdC50eXBlIGpzb24nLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChzb3VyY2UuZGF0YS5mb3JtYXQudHlwZSwgJ2pzb24nKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGggbm8gZGF0YSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXJzZSh1bmRlZmluZWQpO1xuXG4gICAgICBpdCgnc2hvdWxkIHByb3ZpZGUgcGxhY2Vob2xkZXIgc291cmNlIGRhdGEnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChzb3VyY2UuZGF0YU5hbWUsICdzb3VyY2UnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3dpdGggbmFtZWQgZGF0YSBzb3VyY2UgcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBwYXJzZSh7bmFtZTogJ2Zvbyd9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBwcm92aWRlIG5hbWVkIHNvdXJjZSBkYXRhJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoc291cmNlLmRhdGFOYW1lLCAnZm9vJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdkYXRhIGZvcm1hdCcsICgpID0+IHtcbiAgICAgIGRlc2NyaWJlKCdqc29uJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIGluY2x1ZGUgcHJvcGVydHkgaWYgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHBhcnNlKHtcbiAgICAgICAgICAgIHVybDogJ2h0dHA6Ly9mb28uYmFyJyxcbiAgICAgICAgICAgIGZvcm1hdDoge3R5cGU6ICdqc29uJywgcHJvcGVydHk6ICdiYXonfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKHNvdXJjZS5kYXRhLmZvcm1hdC5wcm9wZXJ0eSwgJ2JheicpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgndG9wb2pzb24nLCAoKSA9PiB7XG4gICAgICAgIGRlc2NyaWJlKCdmZWF0dXJlIHByb3BlcnR5IGlzIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBwYXJzZSh7XG4gICAgICAgICAgICB1cmw6ICdodHRwOi8vZm9vLmJhcicsXG4gICAgICAgICAgICBmb3JtYXQ6IHt0eXBlOiAndG9wb2pzb24nLCBmZWF0dXJlOiAnYmF6J31cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGl0KCdzaG91bGQgaGF2ZSBmb3JtYXQudHlwZSB0b3BvanNvbicsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5lcXVhbChzb3VyY2UuZGF0YS5mb3JtYXQudHlwZSwgJ3RvcG9qc29uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXQoJ3Nob3VsZCBoYXZlIGZvcm1hdC5mZWF0dXJlIGJheicsICgpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5lcXVhbChzb3VyY2UuZGF0YS5mb3JtYXQuZmVhdHVyZSwgJ2JheicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBkZXNjcmliZSgnbWVzaCBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc291cmNlID0gcGFyc2Uoe1xuICAgICAgICAgICAgdXJsOiAnaHR0cDovL2Zvby5iYXInLFxuICAgICAgICAgICAgZm9ybWF0OiB7dHlwZTogJ3RvcG9qc29uJywgbWVzaDogJ2Jheid9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpdCgnc2hvdWxkIGhhdmUgZm9ybWF0LnR5cGUgdG9wb2pzb24nLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZXF1YWwoc291cmNlLmRhdGEuZm9ybWF0LnR5cGUsICd0b3BvanNvbicpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGl0KCdzaG91bGQgaGF2ZSBmb3JtYXQubWVzaCBiYXonLCAoKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZXF1YWwoc291cmNlLmRhdGEuZm9ybWF0Lm1lc2gsICdiYXonKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlJywgKCkgPT4ge1xuICAgIC8vIFRPRE86IHdyaXRlIHRlc3RcbiAgfSk7XG59KTtcblxuIl19 \ No newline at end of file diff --git a/build/test/compile/data/stack.test.d.ts b/build/test/compile/data/stack.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/stack.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/stack.test.js b/build/test/compile/data/stack.test.js new file mode 100644 index 0000000000..291b2e7468 --- /dev/null +++ b/build/test/compile/data/stack.test.js @@ -0,0 +1,292 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var stack_1 = require("../../../src/compile/data/stack"); +var util_1 = require("../../util"); +function parse(model) { + return stack_1.StackNode.makeFromEncoding(null, model).stack; +} +function assemble(model) { + return stack_1.StackNode.makeFromEncoding(null, model).assemble(); +} +describe('compile/data/stack', function () { + describe('StackNode.makeFromEncoding', function () { + it('should produce correct stack component for bar with color', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "nominal" }, + "color": { "field": "c", "type": "ordinal", } + } + }); + chai_1.assert.deepEqual(parse(model), { + dimensionFieldDef: { field: 'b', type: 'nominal' }, + facetby: [], + stackField: 'sum_a', + stackby: ['c'], + sort: { + field: ['c'], + order: ['descending'] + }, + offset: 'zero', + impute: false, + as: ['sum_a_start', 'sum_a_end'] + }); + }); + it('should produce correct stack component with both start and end of the binned field for bar with color and binned y', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "y": { "bin": true, "field": "b", "type": "quantitative" }, + "color": { "field": "c", "type": "ordinal", } + } + }); + chai_1.assert.deepEqual(parse(model), { + dimensionFieldDef: { "bin": { maxbins: 10 }, "field": "b", "type": "quantitative" }, + facetby: [], + stackField: 'sum_a', + stackby: ['c'], + sort: { + field: ['c'], + order: ['descending'] + }, + offset: 'zero', + impute: false, + as: ['sum_a_start', 'sum_a_end'] + }); + }); + it('should produce correct stack component for 1D bar with color', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "c", "type": "ordinal", } + } + }); + chai_1.assert.deepEqual(parse(model), { + dimensionFieldDef: undefined, + facetby: [], + stackField: 'sum_a', + stackby: ['c'], + sort: { + field: ['c'], + order: ['descending'] + }, + offset: 'zero', + impute: false, + as: ['sum_a_start', 'sum_a_end'] + }); + chai_1.assert.deepEqual(assemble(model), [{ + type: 'stack', + groupby: [], + field: 'sum_a', + sort: { + field: ['c'], + order: ['descending'] + }, + as: ['sum_a_start', 'sum_a_end'], + offset: 'zero' + } + ]); + }); + it('should produce correct stack component for area with color and order', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "area", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "nominal" }, + "color": { "field": "c", "type": "nominal" }, + "order": { "aggregate": "mean", "field": "d", "type": "quantitative" } + } + }); + chai_1.assert.deepEqual(parse(model), { + dimensionFieldDef: { field: 'b', type: 'nominal' }, + facetby: [], + stackField: 'sum_a', + stackby: ['c'], + sort: { + field: ['mean_d'], + order: ['ascending'] + }, + offset: 'zero', + impute: true, + as: ['sum_a_start', 'sum_a_end'] + }); + chai_1.assert.deepEqual(assemble(model), [ + { + type: 'impute', + field: 'sum_a', + groupby: ['c'], + key: 'b', + method: "value", + value: 0 + }, + { + type: 'stack', + groupby: ['b'], + field: 'sum_a', + sort: { + field: ['mean_d'], + order: ['ascending'] + }, + as: ['sum_a_start', 'sum_a_end'], + offset: 'zero' + } + ]); + }); + it('should produce correct stack component for area with color and binned dimension', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "area", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "y": { "bin": true, "field": "b", "type": "quantitative" }, + "color": { "field": "c", "type": "nominal" } + } + }); + chai_1.assert.deepEqual(parse(model), { + dimensionFieldDef: { "bin": { maxbins: 10 }, "field": "b", "type": "quantitative" }, + facetby: [], + stackField: 'sum_a', + stackby: ['c'], + sort: { + field: ['c'], + order: ['descending'] + }, + offset: 'zero', + impute: true, + as: ['sum_a_start', 'sum_a_end'] + }); + chai_1.assert.deepEqual(assemble(model), [ + { + type: 'formula', + expr: '(datum[\"bin_maxbins_10_b\"]+datum[\"bin_maxbins_10_b_end\"])/2', + as: 'bin_maxbins_10_b_mid' + }, + { + type: 'impute', + field: 'sum_a', + groupby: ['c'], + key: 'bin_maxbins_10_b_mid', + method: "value", + value: 0 + }, + { + type: 'stack', + groupby: ['bin_maxbins_10_b_mid'], + field: 'sum_a', + sort: { + field: ['c'], + order: ['descending'] + }, + as: ['sum_a_start', 'sum_a_end'], + offset: 'zero' + } + ]); + }); + }); + describe('StackNode.makeFromTransform', function () { + it('should fill in offset and sort properly', function () { + var transform = { + stack: 'people', + groupby: ['age'], + as: ['v1', 'v2'] + }; + var stack = stack_1.StackNode.makeFromTransform(null, transform); + chai_1.assert.deepEqual(stack.assemble(), [{ + type: 'stack', + groupby: ['age'], + field: 'people', + offset: 'zero', + sort: { field: [], order: [] }, + as: ['v1', 'v2'] + }]); + }); + it('should fill in partial "as" field properly', function () { + var transform = { + stack: 'people', + groupby: ['age', 'gender'], + offset: 'normalize', + as: "val" + }; + var stack = stack_1.StackNode.makeFromTransform(null, transform); + chai_1.assert.deepEqual(stack.assemble(), [{ + type: 'stack', + groupby: ['age', 'gender'], + field: 'people', + offset: 'normalize', + sort: { field: [], order: [] }, + as: ["val", "val_end"] + }]); + }); + it('should handle complete "sort"', function () { + var transform = { + stack: 'people', + groupby: ['age', 'gender'], + offset: 'normalize', + sort: [{ 'field': 'height', 'order': 'ascending' }, + { 'field': 'weight', 'order': 'descending' }], + as: 'val' + }; + var stack = stack_1.StackNode.makeFromTransform(null, transform); + chai_1.assert.deepEqual(stack.assemble(), [{ + type: 'stack', + groupby: ['age', 'gender'], + field: 'people', + offset: 'normalize', + sort: { field: ['height', 'weight'], order: ['ascending', 'descending'] }, + as: ["val", "val_end"] + }]); + }); + it('should handle incomplete "sort" field', function () { + var transform = { + stack: 'people', + groupby: ['age', 'gender'], + offset: 'normalize', + sort: [{ 'field': 'height' }], + as: 'val' + }; + var stack = stack_1.StackNode.makeFromTransform(null, transform); + chai_1.assert.deepEqual(stack.assemble(), [{ + type: 'stack', + groupby: ['age', 'gender'], + field: 'people', + offset: 'normalize', + sort: { field: ['height'], order: ['ascending'] }, + as: ["val", "val_end"] + }]); + }); + }); + describe('StackNode.producedFields', function () { + it('should give producedfields correctly', function () { + var transform = { + stack: 'people', + groupby: ['age'], + as: 'people' + }; + var stack = stack_1.StackNode.makeFromTransform(null, transform); + chai_1.assert.deepEqual(stack.producedFields(), { + people: true, + people_end: true + }); + }); + it('should give producedFields correctly when in encoding channel', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "bar", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "nominal" }, + "color": { "field": "c", "type": "ordinal", } + } + }); + var stack = stack_1.StackNode.makeFromEncoding(null, model); + chai_1.assert.deepEqual(stack.producedFields(), { + sum_a_start: true, + sum_a_end: true + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2sudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL3N0YWNrLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBRTVCLHlEQUEwRTtBQUkxRSxtQ0FBbUQ7QUFFbkQsZUFBZSxLQUFnQjtJQUM3QixPQUFPLGlCQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2RCxDQUFDO0FBRUQsa0JBQWtCLEtBQWdCO0lBQ2hDLE9BQU8saUJBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDNUQsQ0FBQztBQUNELFFBQVEsQ0FBRSxvQkFBb0IsRUFBRTtJQUU5QixRQUFRLENBQUMsNEJBQTRCLEVBQUU7UUFDckMsRUFBRSxDQUFDLDJEQUEyRCxFQUFFO1lBQzlELElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO2dCQUNwQyxNQUFNLEVBQUUsS0FBSztnQkFDYixVQUFVLEVBQUU7b0JBQ1YsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQy9ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztvQkFDdEMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxHQUFFO2lCQUM1QzthQUNGLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQWlCLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0MsaUJBQWlCLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7Z0JBQ2hELE9BQU8sRUFBRSxFQUFFO2dCQUNYLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDWixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3RCO2dCQUNELE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxLQUFLO2dCQUNiLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7YUFDakMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0hBQW9ILEVBQUU7WUFDdkgsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztvQkFDL0QsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ3hELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FBRTtpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFpQixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdDLGlCQUFpQixFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztnQkFDL0UsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsVUFBVSxFQUFFLE9BQU87Z0JBQ25CLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDZCxJQUFJLEVBQUU7b0JBQ0osS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO29CQUNaLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztpQkFDdEI7Z0JBQ0QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQzthQUNqQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4REFBOEQsRUFBRTtZQUNqRSxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUMvRCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEdBQUU7aUJBQzVDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBaUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QyxpQkFBaUIsRUFBRSxTQUFTO2dCQUM1QixPQUFPLEVBQUUsRUFBRTtnQkFDWCxVQUFVLEVBQUUsT0FBTztnQkFDbkIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNkLElBQUksRUFBRTtvQkFDSixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ1osS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDO2lCQUN0QjtnQkFDRCxNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsS0FBSztnQkFDYixFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDO2FBQ2pDLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQWdCLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoRCxJQUFJLEVBQUUsT0FBTztvQkFDYixPQUFPLEVBQUUsRUFBRTtvQkFDWCxLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUU7d0JBQ0osS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDO3dCQUNaLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztxQkFDdEI7b0JBQ0QsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQztvQkFDaEMsTUFBTSxFQUFFLE1BQU07aUJBQ2Y7YUFDaUQsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNFQUFzRSxFQUFFO1lBQ3pFLElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO2dCQUNwQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxVQUFVLEVBQUU7b0JBQ1YsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQy9ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztvQkFDdEMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO29CQUMxQyxPQUFPLEVBQUUsRUFBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztpQkFDckU7YUFDRixDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFpQixLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdDLGlCQUFpQixFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO2dCQUNoRCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxVQUFVLEVBQUUsT0FBTztnQkFDbkIsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO2dCQUNkLElBQUksRUFBRTtvQkFDSixLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ2pCLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQztpQkFDckI7Z0JBQ0QsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLElBQUk7Z0JBQ1osRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQzthQUNqQyxDQUFDLENBQUM7WUFFSCxhQUFNLENBQUMsU0FBUyxDQUFnQixRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQy9DO29CQUNFLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxPQUFPO29CQUNkLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDZCxHQUFHLEVBQUUsR0FBRztvQkFDUixNQUFNLEVBQUUsT0FBTztvQkFDZixLQUFLLEVBQUUsQ0FBQztpQkFDVDtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsT0FBTztvQkFDYixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ2QsS0FBSyxFQUFFLE9BQU87b0JBQ2QsSUFBSSxFQUFFO3dCQUNKLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQzt3QkFDakIsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO3FCQUNyQjtvQkFDRCxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDO29CQUNoQyxNQUFNLEVBQUUsTUFBTTtpQkFDZjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlGQUFpRixFQUFFO1lBQ3BGLElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO2dCQUNwQyxNQUFNLEVBQUUsTUFBTTtnQkFDZCxVQUFVLEVBQUU7b0JBQ1YsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQy9ELEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUN4RCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7aUJBQzNDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBaUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUM3QyxpQkFBaUIsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7Z0JBQy9FLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2QsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDWixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7aUJBQ3RCO2dCQUNELE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxJQUFJO2dCQUNaLEVBQUUsRUFBRSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7YUFDakMsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBZ0IsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUMvQztvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixJQUFJLEVBQUUsaUVBQWlFO29CQUN2RSxFQUFFLEVBQUUsc0JBQXNCO2lCQUMzQjtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsT0FBTztvQkFDZCxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ2QsR0FBRyxFQUFFLHNCQUFzQjtvQkFDM0IsTUFBTSxFQUFFLE9BQU87b0JBQ2YsS0FBSyxFQUFFLENBQUM7aUJBQ1Q7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLE9BQU87b0JBQ2IsT0FBTyxFQUFFLENBQUMsc0JBQXNCLENBQUM7b0JBQ2pDLEtBQUssRUFBRSxPQUFPO29CQUNkLElBQUksRUFBRTt3QkFDSixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUM7d0JBQ1osS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDO3FCQUN0QjtvQkFDRCxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDO29CQUNoQyxNQUFNLEVBQUUsTUFBTTtpQkFDZjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNkJBQTZCLEVBQUU7UUFDdEMsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLElBQU0sU0FBUyxHQUFjO2dCQUMzQixLQUFLLEVBQUcsUUFBUTtnQkFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNoQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ2pCLENBQUM7WUFDRixJQUFNLEtBQUssR0FBRyxpQkFBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUMzRCxhQUFNLENBQUMsU0FBUyxDQUFnQixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztvQkFDakQsSUFBSSxFQUFFLE9BQU87b0JBQ2IsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDO29CQUNoQixLQUFLLEVBQUUsUUFBUTtvQkFDZixNQUFNLEVBQUUsTUFBTTtvQkFDZCxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBYyxFQUFFLEtBQUssRUFBRSxFQUF5QixFQUFXO29CQUN6RSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDO2lCQUNqQixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLElBQU0sU0FBUyxHQUFjO2dCQUMzQixLQUFLLEVBQUcsUUFBUTtnQkFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztnQkFDMUIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLEVBQUUsRUFBRSxLQUFLO2FBQ1YsQ0FBQztZQUNGLElBQU0sS0FBSyxHQUFHLGlCQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELGFBQU0sQ0FBQyxTQUFTLENBQWdCLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO29CQUNqRCxJQUFJLEVBQUUsT0FBTztvQkFDYixPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO29CQUMxQixLQUFLLEVBQUUsUUFBUTtvQkFDZixNQUFNLEVBQUUsV0FBVztvQkFDbkIsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQWMsRUFBRSxLQUFLLEVBQUUsRUFBeUIsRUFBVztvQkFDekUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQztpQkFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxJQUFNLFNBQVMsR0FBYztnQkFDM0IsS0FBSyxFQUFHLFFBQVE7Z0JBQ2hCLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7Z0JBQzFCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixJQUFJLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBQztvQkFDekMsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUMsQ0FBQztnQkFDbEQsRUFBRSxFQUFFLEtBQUs7YUFDVixDQUFDO1lBQ0YsSUFBTSxLQUFLLEdBQUcsaUJBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDM0QsYUFBTSxDQUFDLFNBQVMsQ0FBZ0IsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7b0JBQ2pELElBQUksRUFBRSxPQUFPO29CQUNiLE9BQU8sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7b0JBQzFCLEtBQUssRUFBRSxRQUFRO29CQUNmLE1BQU0sRUFBRSxXQUFXO29CQUNuQixJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFDO29CQUN2RSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO2lCQUN2QixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHVDQUF1QyxFQUFFO1lBQzFDLElBQU0sU0FBUyxHQUFjO2dCQUMzQixLQUFLLEVBQUcsUUFBUTtnQkFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztnQkFDMUIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLElBQUksRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO2dCQUMzQixFQUFFLEVBQUUsS0FBSzthQUNWLENBQUM7WUFDRixJQUFNLEtBQUssR0FBRyxpQkFBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUUzRCxhQUFNLENBQUMsU0FBUyxDQUFnQixLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztvQkFDakQsSUFBSSxFQUFFLE9BQU87b0JBQ2IsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQztvQkFDMUIsS0FBSyxFQUFFLFFBQVE7b0JBQ2YsTUFBTSxFQUFFLFdBQVc7b0JBQ25CLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFDO29CQUMvQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDO2lCQUN2QixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsMEJBQTBCLEVBQUU7UUFDbkMsRUFBRSxDQUFDLHNDQUFzQyxFQUFFO1lBQ3pDLElBQU0sU0FBUyxHQUFjO2dCQUMzQixLQUFLLEVBQUUsUUFBUTtnQkFDZixPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hCLEVBQUUsRUFBRSxRQUFRO2FBRWIsQ0FBQztZQUNGLElBQU0sS0FBSyxHQUFHLGlCQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzNELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFO2dCQUN2QyxNQUFNLEVBQUUsSUFBSTtnQkFDWixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7UUFFTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywrREFBK0QsRUFBRTtZQUNsRSxJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztnQkFDcEMsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUMvRCxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7b0JBQ3RDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FBRTtpQkFDNUM7YUFDRixDQUFDLENBQUM7WUFDSCxJQUFNLEtBQUssR0FBRyxpQkFBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDdkMsV0FBVyxFQUFFLElBQUk7Z0JBQ2pCLFNBQVMsRUFBRSxJQUFJO2FBQ2hCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCB7U3RhY2tDb21wb25lbnQsIFN0YWNrTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9zdGFjayc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvdW5pdCc7XG5pbXBvcnQge1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vLi4vc3JjL3RyYW5zZm9ybSc7XG5pbXBvcnQge1ZnQ29tcGFyYXRvck9yZGVyLCBWZ1NvcnQsIFZnVHJhbnNmb3JtfSBmcm9tICcuLi8uLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmZ1bmN0aW9uIHBhcnNlKG1vZGVsOiBVbml0TW9kZWwpIHtcbiAgcmV0dXJuIFN0YWNrTm9kZS5tYWtlRnJvbUVuY29kaW5nKG51bGwsIG1vZGVsKS5zdGFjaztcbn1cblxuZnVuY3Rpb24gYXNzZW1ibGUobW9kZWw6IFVuaXRNb2RlbCkge1xuICByZXR1cm4gU3RhY2tOb2RlLm1ha2VGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwpLmFzc2VtYmxlKCk7XG59XG5kZXNjcmliZSAoJ2NvbXBpbGUvZGF0YS9zdGFjaycsICgpID0+IHtcblxuICBkZXNjcmliZSgnU3RhY2tOb2RlLm1ha2VGcm9tRW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvcnJlY3Qgc3RhY2sgY29tcG9uZW50IGZvciBiYXIgd2l0aCBjb2xvcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJjXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIix9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFN0YWNrQ29tcG9uZW50PihwYXJzZShtb2RlbCksIHtcbiAgICAgICAgZGltZW5zaW9uRmllbGREZWY6IHtmaWVsZDogJ2InLCB0eXBlOiAnbm9taW5hbCd9LFxuICAgICAgICBmYWNldGJ5OiBbXSxcbiAgICAgICAgc3RhY2tGaWVsZDogJ3N1bV9hJyxcbiAgICAgICAgc3RhY2tieTogWydjJ10sXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICBmaWVsZDogWydjJ10sXG4gICAgICAgICAgb3JkZXI6IFsnZGVzY2VuZGluZyddXG4gICAgICAgIH0sXG4gICAgICAgIG9mZnNldDogJ3plcm8nLFxuICAgICAgICBpbXB1dGU6IGZhbHNlLFxuICAgICAgICBhczogWydzdW1fYV9zdGFydCcsICdzdW1fYV9lbmQnXVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29ycmVjdCBzdGFjayBjb21wb25lbnQgd2l0aCBib3RoIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGJpbm5lZCBmaWVsZCBmb3IgYmFyIHdpdGggY29sb3IgYW5kIGJpbm5lZCB5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiY1wiLCBcInR5cGVcIjogXCJvcmRpbmFsXCIsfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxTdGFja0NvbXBvbmVudD4ocGFyc2UobW9kZWwpLCB7XG4gICAgICAgIGRpbWVuc2lvbkZpZWxkRGVmOiB7XCJiaW5cIjoge21heGJpbnM6IDEwfSwgXCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBmYWNldGJ5OiBbXSxcbiAgICAgICAgc3RhY2tGaWVsZDogJ3N1bV9hJyxcbiAgICAgICAgc3RhY2tieTogWydjJ10sXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICBmaWVsZDogWydjJ10sXG4gICAgICAgICAgb3JkZXI6IFsnZGVzY2VuZGluZyddXG4gICAgICAgIH0sXG4gICAgICAgIG9mZnNldDogJ3plcm8nLFxuICAgICAgICBpbXB1dGU6IGZhbHNlLFxuICAgICAgICBhczogWydzdW1fYV9zdGFydCcsICdzdW1fYV9lbmQnXVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29ycmVjdCBzdGFjayBjb21wb25lbnQgZm9yIDFEIGJhciB3aXRoIGNvbG9yJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiY1wiLCBcInR5cGVcIjogXCJvcmRpbmFsXCIsfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxTdGFja0NvbXBvbmVudD4ocGFyc2UobW9kZWwpLCB7XG4gICAgICAgIGRpbWVuc2lvbkZpZWxkRGVmOiB1bmRlZmluZWQsXG4gICAgICAgIGZhY2V0Ynk6IFtdLFxuICAgICAgICBzdGFja0ZpZWxkOiAnc3VtX2EnLFxuICAgICAgICBzdGFja2J5OiBbJ2MnXSxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIGZpZWxkOiBbJ2MnXSxcbiAgICAgICAgICBvcmRlcjogWydkZXNjZW5kaW5nJ11cbiAgICAgICAgfSxcbiAgICAgICAgb2Zmc2V0OiAnemVybycsXG4gICAgICAgIGltcHV0ZTogZmFsc2UsXG4gICAgICAgIGFzOiBbJ3N1bV9hX3N0YXJ0JywgJ3N1bV9hX2VuZCddXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybVtdPihhc3NlbWJsZShtb2RlbCksIFt7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwYnk6IFtdLFxuICAgICAgICBmaWVsZDogJ3N1bV9hJyxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIGZpZWxkOiBbJ2MnXSxcbiAgICAgICAgICBvcmRlcjogWydkZXNjZW5kaW5nJ11cbiAgICAgICAgfSxcbiAgICAgICAgYXM6IFsnc3VtX2Ffc3RhcnQnLCAnc3VtX2FfZW5kJ10sXG4gICAgICAgIG9mZnNldDogJ3plcm8nXG4gICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgY29ycmVjdCBzdGFjayBjb21wb25lbnQgZm9yIGFyZWEgd2l0aCBjb2xvciBhbmQgb3JkZXInLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiY1wiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgIFwib3JkZXJcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6IFwiZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8U3RhY2tDb21wb25lbnQ+KHBhcnNlKG1vZGVsKSwge1xuICAgICAgICBkaW1lbnNpb25GaWVsZERlZjoge2ZpZWxkOiAnYicsIHR5cGU6ICdub21pbmFsJ30sXG4gICAgICAgIGZhY2V0Ynk6IFtdLFxuICAgICAgICBzdGFja0ZpZWxkOiAnc3VtX2EnLFxuICAgICAgICBzdGFja2J5OiBbJ2MnXSxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIGZpZWxkOiBbJ21lYW5fZCddLFxuICAgICAgICAgIG9yZGVyOiBbJ2FzY2VuZGluZyddXG4gICAgICAgIH0sXG4gICAgICAgIG9mZnNldDogJ3plcm8nLFxuICAgICAgICBpbXB1dGU6IHRydWUsXG4gICAgICAgIGFzOiBbJ3N1bV9hX3N0YXJ0JywgJ3N1bV9hX2VuZCddXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybVtdPihhc3NlbWJsZShtb2RlbCksIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdpbXB1dGUnLFxuICAgICAgICAgIGZpZWxkOiAnc3VtX2EnLFxuICAgICAgICAgIGdyb3VwYnk6IFsnYyddLFxuICAgICAgICAgIGtleTogJ2InLFxuICAgICAgICAgIG1ldGhvZDogXCJ2YWx1ZVwiLFxuICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgICAgIGdyb3VwYnk6IFsnYiddLFxuICAgICAgICAgIGZpZWxkOiAnc3VtX2EnLFxuICAgICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICAgIGZpZWxkOiBbJ21lYW5fZCddLFxuICAgICAgICAgICAgb3JkZXI6IFsnYXNjZW5kaW5nJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzOiBbJ3N1bV9hX3N0YXJ0JywgJ3N1bV9hX2VuZCddLFxuICAgICAgICAgIG9mZnNldDogJ3plcm8nXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGNvcnJlY3Qgc3RhY2sgY29tcG9uZW50IGZvciBhcmVhIHdpdGggY29sb3IgYW5kIGJpbm5lZCBkaW1lbnNpb24nLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJjXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8U3RhY2tDb21wb25lbnQ+KHBhcnNlKG1vZGVsKSwge1xuICAgICAgICBkaW1lbnNpb25GaWVsZERlZjoge1wiYmluXCI6IHttYXhiaW5zOiAxMH0sIFwiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgZmFjZXRieTogW10sXG4gICAgICAgIHN0YWNrRmllbGQ6ICdzdW1fYScsXG4gICAgICAgIHN0YWNrYnk6IFsnYyddLFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgZmllbGQ6IFsnYyddLFxuICAgICAgICAgIG9yZGVyOiBbJ2Rlc2NlbmRpbmcnXVxuICAgICAgICB9LFxuICAgICAgICBvZmZzZXQ6ICd6ZXJvJyxcbiAgICAgICAgaW1wdXRlOiB0cnVlLFxuICAgICAgICBhczogWydzdW1fYV9zdGFydCcsICdzdW1fYV9lbmQnXVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdUcmFuc2Zvcm1bXT4oYXNzZW1ibGUobW9kZWwpLCBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICAgICAgZXhwcjogJyhkYXR1bVtcXFwiYmluX21heGJpbnNfMTBfYlxcXCJdK2RhdHVtW1xcXCJiaW5fbWF4Ymluc18xMF9iX2VuZFxcXCJdKS8yJyxcbiAgICAgICAgICBhczogJ2Jpbl9tYXhiaW5zXzEwX2JfbWlkJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ2ltcHV0ZScsXG4gICAgICAgICAgZmllbGQ6ICdzdW1fYScsXG4gICAgICAgICAgZ3JvdXBieTogWydjJ10sXG4gICAgICAgICAga2V5OiAnYmluX21heGJpbnNfMTBfYl9taWQnLFxuICAgICAgICAgIG1ldGhvZDogXCJ2YWx1ZVwiLFxuICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgICAgIGdyb3VwYnk6IFsnYmluX21heGJpbnNfMTBfYl9taWQnXSxcbiAgICAgICAgICBmaWVsZDogJ3N1bV9hJyxcbiAgICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgICBmaWVsZDogWydjJ10sXG4gICAgICAgICAgICBvcmRlcjogWydkZXNjZW5kaW5nJ11cbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzOiBbJ3N1bV9hX3N0YXJ0JywgJ3N1bV9hX2VuZCddLFxuICAgICAgICAgIG9mZnNldDogJ3plcm8nXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU3RhY2tOb2RlLm1ha2VGcm9tVHJhbnNmb3JtJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmlsbCBpbiBvZmZzZXQgYW5kIHNvcnQgcHJvcGVybHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybSA9IHtcbiAgICAgICAgc3RhY2sgOiAncGVvcGxlJyxcbiAgICAgICAgZ3JvdXBieTogWydhZ2UnXSxcbiAgICAgICAgYXM6IFsndjEnLCAndjInXVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2tOb2RlLm1ha2VGcm9tVHJhbnNmb3JtKG51bGwsIHRyYW5zZm9ybSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnVHJhbnNmb3JtW10+KHN0YWNrLmFzc2VtYmxlKCksIFt7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwYnk6IFsnYWdlJ10sXG4gICAgICAgIGZpZWxkOiAncGVvcGxlJyxcbiAgICAgICAgb2Zmc2V0OiAnemVybycsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogW10gYXMgc3RyaW5nW10sIG9yZGVyOiBbXSBhcyBWZ0NvbXBhcmF0b3JPcmRlcltdfSBhcyBWZ1NvcnQsXG4gICAgICAgIGFzOiBbJ3YxJywgJ3YyJ11cbiAgICAgIH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmlsbCBpbiBwYXJ0aWFsIFwiYXNcIiBmaWVsZCBwcm9wZXJseScsICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybTogVHJhbnNmb3JtID0ge1xuICAgICAgICBzdGFjayA6ICdwZW9wbGUnLFxuICAgICAgICBncm91cGJ5OiBbJ2FnZScsICdnZW5kZXInXSxcbiAgICAgICAgb2Zmc2V0OiAnbm9ybWFsaXplJyxcbiAgICAgICAgYXM6IFwidmFsXCJcbiAgICAgIH07XG4gICAgICBjb25zdCBzdGFjayA9IFN0YWNrTm9kZS5tYWtlRnJvbVRyYW5zZm9ybShudWxsLCB0cmFuc2Zvcm0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1RyYW5zZm9ybVtdPihzdGFjay5hc3NlbWJsZSgpLCBbe1xuICAgICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgICBncm91cGJ5OiBbJ2FnZScsICdnZW5kZXInXSxcbiAgICAgICAgZmllbGQ6ICdwZW9wbGUnLFxuICAgICAgICBvZmZzZXQ6ICdub3JtYWxpemUnLFxuICAgICAgICBzb3J0OiB7ZmllbGQ6IFtdIGFzIHN0cmluZ1tdLCBvcmRlcjogW10gYXMgVmdDb21wYXJhdG9yT3JkZXJbXX0gYXMgVmdTb3J0LFxuICAgICAgICBhczogW1widmFsXCIsIFwidmFsX2VuZFwiXVxuICAgICAgfV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgY29tcGxldGUgXCJzb3J0XCInLCAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybSA9IHtcbiAgICAgICAgc3RhY2sgOiAncGVvcGxlJyxcbiAgICAgICAgZ3JvdXBieTogWydhZ2UnLCAnZ2VuZGVyJ10sXG4gICAgICAgIG9mZnNldDogJ25vcm1hbGl6ZScsXG4gICAgICAgIHNvcnQ6IFt7J2ZpZWxkJzogJ2hlaWdodCcsICdvcmRlcic6ICdhc2NlbmRpbmcnfSxcbiAgICAgICAgICAgICAgIHsnZmllbGQnOiAnd2VpZ2h0JywgJ29yZGVyJzogJ2Rlc2NlbmRpbmcnfV0sXG4gICAgICAgIGFzOiAndmFsJ1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2tOb2RlLm1ha2VGcm9tVHJhbnNmb3JtKG51bGwsIHRyYW5zZm9ybSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnVHJhbnNmb3JtW10+KHN0YWNrLmFzc2VtYmxlKCksIFt7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwYnk6IFsnYWdlJywgJ2dlbmRlciddLFxuICAgICAgICBmaWVsZDogJ3Blb3BsZScsXG4gICAgICAgIG9mZnNldDogJ25vcm1hbGl6ZScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogWydoZWlnaHQnLCAnd2VpZ2h0J10sIG9yZGVyOiBbJ2FzY2VuZGluZycsICdkZXNjZW5kaW5nJ119LFxuICAgICAgICBhczogW1widmFsXCIsIFwidmFsX2VuZFwiXVxuICAgICAgfV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYW5kbGUgaW5jb21wbGV0ZSBcInNvcnRcIiBmaWVsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybTogVHJhbnNmb3JtID0ge1xuICAgICAgICBzdGFjayA6ICdwZW9wbGUnLFxuICAgICAgICBncm91cGJ5OiBbJ2FnZScsICdnZW5kZXInXSxcbiAgICAgICAgb2Zmc2V0OiAnbm9ybWFsaXplJyxcbiAgICAgICAgc29ydDogW3snZmllbGQnOiAnaGVpZ2h0J31dLFxuICAgICAgICBhczogJ3ZhbCdcbiAgICAgIH07XG4gICAgICBjb25zdCBzdGFjayA9IFN0YWNrTm9kZS5tYWtlRnJvbVRyYW5zZm9ybShudWxsLCB0cmFuc2Zvcm0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnVHJhbnNmb3JtW10+KHN0YWNrLmFzc2VtYmxlKCksIFt7XG4gICAgICAgIHR5cGU6ICdzdGFjaycsXG4gICAgICAgIGdyb3VwYnk6IFsnYWdlJywgJ2dlbmRlciddLFxuICAgICAgICBmaWVsZDogJ3Blb3BsZScsXG4gICAgICAgIG9mZnNldDogJ25vcm1hbGl6ZScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogWydoZWlnaHQnXSwgb3JkZXI6IFsnYXNjZW5kaW5nJ119LFxuICAgICAgICBhczogW1widmFsXCIsIFwidmFsX2VuZFwiXVxuICAgICAgfV0pO1xuICAgIH0pO1xuXG4gIH0pO1xuICBkZXNjcmliZSgnU3RhY2tOb2RlLnByb2R1Y2VkRmllbGRzJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZ2l2ZSBwcm9kdWNlZGZpZWxkcyBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybSA9IHtcbiAgICAgICAgc3RhY2s6ICdwZW9wbGUnLFxuICAgICAgICBncm91cGJ5OiBbJ2FnZSddLFxuICAgICAgICBhczogJ3Blb3BsZSdcblxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2tOb2RlLm1ha2VGcm9tVHJhbnNmb3JtKG51bGwsIHRyYW5zZm9ybSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHN0YWNrLnByb2R1Y2VkRmllbGRzKCksIHtcbiAgICAgICAgcGVvcGxlOiB0cnVlLFxuICAgICAgICBwZW9wbGVfZW5kOiB0cnVlXG4gICAgICB9KTtcblxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnaXZlIHByb2R1Y2VkRmllbGRzIGNvcnJlY3RseSB3aGVuIGluIGVuY29kaW5nIGNoYW5uZWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiY1wiLCBcInR5cGVcIjogXCJvcmRpbmFsXCIsfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2tOb2RlLm1ha2VGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzdGFjay5wcm9kdWNlZEZpZWxkcygpLCB7XG4gICAgICAgIHN1bV9hX3N0YXJ0OiB0cnVlLFxuICAgICAgICBzdW1fYV9lbmQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/data/timeunit.test.d.ts b/build/test/compile/data/timeunit.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/timeunit.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/timeunit.test.js b/build/test/compile/data/timeunit.test.js new file mode 100644 index 0000000000..49332e70c1 --- /dev/null +++ b/build/test/compile/data/timeunit.test.js @@ -0,0 +1,39 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var timeunit_1 = require("../../../src/compile/data/timeunit"); +var util_1 = require("../../util"); +function assembleFromEncoding(model) { + return timeunit_1.TimeUnitNode.makeFromEncoding(null, model).assemble(); +} +function assembleFromTransform(t) { + return timeunit_1.TimeUnitNode.makeFromTransform(null, t).assemble(); +} +describe('compile/data/timeunit', function () { + describe('parseUnit', function () { + it('should return a dictionary of formula transform', function () { + var model = util_1.parseUnitModel({ + "data": { "values": [] }, + "mark": "point", + "encoding": { + "x": { field: 'a', type: 'temporal', timeUnit: 'month' } + } + }); + chai_1.assert.deepEqual(assembleFromEncoding(model), [{ + type: 'formula', + as: 'month_a', + expr: 'datetime(0, month(datum["a"]), 1, 0, 0, 0, 0)' + }]); + }); + it('should return a dictionary of formula transform from transform array', function () { + var t = { field: 'date', as: 'month_date', timeUnit: 'month' }; + chai_1.assert.deepEqual(assembleFromTransform(t), [{ + type: 'formula', + as: 'month_date', + expr: 'datetime(0, month(datum["date"]), 1, 0, 0, 0, 0)' + }]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9kYXRhL3RpbWV1bml0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLCtEQUFnRTtBQUdoRSxtQ0FBMEM7QUFFMUMsOEJBQThCLEtBQXFCO0lBQ2pELE9BQU8sdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0QsQ0FBQztBQUVELCtCQUErQixDQUFvQjtJQUNqRCxPQUFPLHVCQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQzVELENBQUM7QUFFRCxRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUVwQixFQUFFLENBQUMsaURBQWlELEVBQUU7WUFFcEQsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBQztnQkFDdEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDO2lCQUN2RDthQUNGLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDN0MsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsRUFBRSxFQUFFLFNBQVM7b0JBQ2IsSUFBSSxFQUFFLCtDQUErQztpQkFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzRUFBc0UsRUFBRTtZQUN6RSxJQUFNLENBQUMsR0FBc0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDO1lBRWxGLGFBQU0sQ0FBQyxTQUFTLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsRUFBRSxFQUFFLFlBQVk7b0JBQ2hCLElBQUksRUFBRSxrREFBa0Q7aUJBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3RpbWV1bml0JztcbmltcG9ydCB7TW9kZWxXaXRoRmllbGR9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL21vZGVsJztcbmltcG9ydCB7VGltZVVuaXRUcmFuc2Zvcm19IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2Zvcm0nO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmZ1bmN0aW9uIGFzc2VtYmxlRnJvbUVuY29kaW5nKG1vZGVsOiBNb2RlbFdpdGhGaWVsZCkge1xuICByZXR1cm4gVGltZVVuaXROb2RlLm1ha2VGcm9tRW5jb2RpbmcobnVsbCwgbW9kZWwpLmFzc2VtYmxlKCk7XG59XG5cbmZ1bmN0aW9uIGFzc2VtYmxlRnJvbVRyYW5zZm9ybSh0OiBUaW1lVW5pdFRyYW5zZm9ybSkge1xuICByZXR1cm4gVGltZVVuaXROb2RlLm1ha2VGcm9tVHJhbnNmb3JtKG51bGwsIHQpLmFzc2VtYmxlKCk7XG59XG5cbmRlc2NyaWJlKCdjb21waWxlL2RhdGEvdGltZXVuaXQnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdwYXJzZVVuaXQnLCAoKSA9PiB7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgZm9ybXVsYSB0cmFuc2Zvcm0nLCAoKSA9PiB7XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcImRhdGFcIjoge1widmFsdWVzXCI6IFtdfSxcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtmaWVsZDogJ2EnLCB0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ21vbnRoJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoYXNzZW1ibGVGcm9tRW5jb2RpbmcobW9kZWwpLCBbe1xuICAgICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICAgIGFzOiAnbW9udGhfYScsXG4gICAgICAgIGV4cHI6ICdkYXRldGltZSgwLCBtb250aChkYXR1bVtcImFcIl0pLCAxLCAwLCAwLCAwLCAwKSdcbiAgICAgIH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgZGljdGlvbmFyeSBvZiBmb3JtdWxhIHRyYW5zZm9ybSBmcm9tIHRyYW5zZm9ybSBhcnJheScsICgpID0+IHtcbiAgICAgIGNvbnN0IHQ6IFRpbWVVbml0VHJhbnNmb3JtID0ge2ZpZWxkOiAnZGF0ZScsIGFzOiAnbW9udGhfZGF0ZScsIHRpbWVVbml0OiAnbW9udGgnfTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChhc3NlbWJsZUZyb21UcmFuc2Zvcm0odCksIFt7XG4gICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgYXM6ICdtb250aF9kYXRlJyxcbiAgICAgICAgZXhwcjogJ2RhdGV0aW1lKDAsIG1vbnRoKGRhdHVtW1wiZGF0ZVwiXSksIDEsIDAsIDAsIDAsIDApJ1xuICAgICAgfV0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/data/window.test.d.ts b/build/test/compile/data/window.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/data/window.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/data/window.test.js b/build/test/compile/data/window.test.js new file mode 100644 index 0000000000..06213e2fce --- /dev/null +++ b/build/test/compile/data/window.test.js @@ -0,0 +1,126 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var window_1 = require("../../../src/compile/data/window"); +describe('compile/data/window', function () { + it('should return a proper vg transform', function () { + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ], + groupby: ['f'], + frame: [null, 0] + }; + var window = new window_1.WindowTransformNode(null, transform); + chai_1.assert.deepEqual(window.assemble(), { + type: 'window', + ops: ['row_number'], + fields: [null], + params: [null], + sort: { + field: ["f"], + order: ["ascending"], + }, + ignorePeers: false, + as: ['ordered_row_number'], + frame: [null, 0], + groupby: ['f'] + }); + }); + it('should augment as with default as', function () { + var transform = { + window: [ + { + op: 'row_number', + as: undefined // intentionally omit for testing + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ], + groupby: ['f'], + frame: [null, 0] + }; + var window = new window_1.WindowTransformNode(null, transform); + chai_1.assert.deepEqual(window.assemble(), { + type: 'window', + ops: ['row_number'], + fields: [null], + params: [null], + sort: { + field: ["f"], + order: ["ascending"], + }, + ignorePeers: false, + as: ['row_number'], + frame: [null, 0], + groupby: ['f'] + }); + }); + it('should return a proper produced fields', function () { + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + { + op: 'count', + as: 'count_field' + }, + { + op: 'sum', + as: 'sum_field' + } + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ], + groupby: ['f'], + frame: [null, 0] + }; + var window = new window_1.WindowTransformNode(null, transform); + chai_1.assert.deepEqual({ "count_field": true, "ordered_row_number": true, "sum_field": true }, window.producedFields()); + }); + it('should clone to an equivalent version', function () { + var transform = { + window: [ + { + op: 'row_number', + as: 'ordered_row_number', + }, + ], + ignorePeers: false, + sort: [ + { + field: 'f', + order: 'ascending' + } + ], + groupby: ['f'], + frame: [null, 0] + }; + var window = new window_1.WindowTransformNode(null, transform); + chai_1.assert.deepEqual(window, window.clone()); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvZGF0YS93aW5kb3cudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOztBQUU5Qiw2QkFBNEI7QUFDNUIsMkRBQXFFO0FBR3JFLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtJQUM5QixFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsSUFBTSxTQUFTLEdBQWM7WUFDM0IsTUFBTSxFQUFFO2dCQUNOO29CQUNFLEVBQUUsRUFBRSxZQUFZO29CQUNoQixFQUFFLEVBQUUsb0JBQW9CO2lCQUN6QjthQUNGO1lBQ0QsV0FBVyxFQUFFLEtBQUs7WUFDbEIsSUFBSSxFQUNGO2dCQUNFO29CQUNFLEtBQUssRUFBRSxHQUFHO29CQUNWLEtBQUssRUFBRSxXQUFXO2lCQUNuQjthQUNGO1lBQ0gsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2QsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNqQixDQUFDO1FBQ0YsSUFBTSxNQUFNLEdBQUcsSUFBSSw0QkFBbUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDbEMsSUFBSSxFQUFFLFFBQVE7WUFDZCxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDbkIsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2QsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2QsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQztnQkFDWixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUM7YUFDckI7WUFDRCxXQUFXLEVBQUUsS0FBSztZQUNsQixFQUFFLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQztZQUMxQixLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUs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R0FBRyxJQUFJLDRCQUFtQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN4RCxhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7V2luZG93VHJhbnNmb3JtTm9kZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS93aW5kb3cnO1xuaW1wb3J0IHtUcmFuc2Zvcm19IGZyb20gJy4uLy4uLy4uL3NyYy90cmFuc2Zvcm0nO1xuXG5kZXNjcmliZSgnY29tcGlsZS9kYXRhL3dpbmRvdycsICgpID0+IHtcbiAgaXQoJ3Nob3VsZCByZXR1cm4gYSBwcm9wZXIgdmcgdHJhbnNmb3JtJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybTogVHJhbnNmb3JtID0ge1xuICAgICAgd2luZG93OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcDogJ3Jvd19udW1iZXInLFxuICAgICAgICAgIGFzOiAnb3JkZXJlZF9yb3dfbnVtYmVyJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpZ25vcmVQZWVyczogZmFsc2UsXG4gICAgICBzb3J0OlxuICAgICAgICBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmllbGQ6ICdmJyxcbiAgICAgICAgICAgIG9yZGVyOiAnYXNjZW5kaW5nJ1xuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgIGdyb3VwYnk6IFsnZiddLFxuICAgICAgZnJhbWU6IFtudWxsLCAwXVxuICAgIH07XG4gICAgY29uc3Qgd2luZG93ID0gbmV3IFdpbmRvd1RyYW5zZm9ybU5vZGUobnVsbCwgdHJhbnNmb3JtKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHdpbmRvdy5hc3NlbWJsZSgpLCB7XG4gICAgICB0eXBlOiAnd2luZG93JyxcbiAgICAgIG9wczogWydyb3dfbnVtYmVyJ10sXG4gICAgICBmaWVsZHM6IFtudWxsXSxcbiAgICAgIHBhcmFtczogW251bGxdLFxuICAgICAgc29ydDoge1xuICAgICAgICBmaWVsZDogW1wiZlwiXSxcbiAgICAgICAgb3JkZXI6IFtcImFzY2VuZGluZ1wiXSxcbiAgICAgIH0sXG4gICAgICBpZ25vcmVQZWVyczogZmFsc2UsXG4gICAgICBhczogWydvcmRlcmVkX3Jvd19udW1iZXInXSxcbiAgICAgIGZyYW1lOiBbbnVsbCwgMF0sXG4gICAgICBncm91cGJ5OiBbJ2YnXVxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGF1Z21lbnQgYXMgd2l0aCBkZWZhdWx0IGFzJywgKCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zZm9ybTogVHJhbnNmb3JtID0ge1xuICAgICAgd2luZG93OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBvcDogJ3Jvd19udW1iZXInLFxuICAgICAgICAgIGFzOiB1bmRlZmluZWQgLy8gaW50ZW50aW9uYWxseSBvbWl0IGZvciB0ZXN0aW5nXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgc29ydDpcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZicsXG4gICAgICAgICAgICBvcmRlcjogJ2FzY2VuZGluZydcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICBncm91cGJ5OiBbJ2YnXSxcbiAgICAgIGZyYW1lOiBbbnVsbCwgMF1cbiAgICB9O1xuICAgIGNvbnN0IHdpbmRvdyA9IG5ldyBXaW5kb3dUcmFuc2Zvcm1Ob2RlKG51bGwsIHRyYW5zZm9ybSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbCh3aW5kb3cuYXNzZW1ibGUoKSwge1xuICAgICAgdHlwZTogJ3dpbmRvdycsXG4gICAgICBvcHM6IFsncm93X251bWJlciddLFxuICAgICAgZmllbGRzOiBbbnVsbF0sXG4gICAgICBwYXJhbXM6IFtudWxsXSxcbiAgICAgIHNvcnQ6IHtcbiAgICAgICAgZmllbGQ6IFtcImZcIl0sXG4gICAgICAgIG9yZGVyOiBbXCJhc2NlbmRpbmdcIl0sXG4gICAgICB9LFxuICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgYXM6IFsncm93X251bWJlciddLFxuICAgICAgZnJhbWU6IFtudWxsLCAwXSxcbiAgICAgIGdyb3VwYnk6IFsnZiddXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcmV0dXJuIGEgcHJvcGVyIHByb2R1Y2VkIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybSA9IHtcbiAgICAgIHdpbmRvdzogW1xuICAgICAgICB7XG4gICAgICAgICAgb3A6ICdyb3dfbnVtYmVyJyxcbiAgICAgICAgICBhczogJ29yZGVyZWRfcm93X251bWJlcicsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvcDogJ2NvdW50JyxcbiAgICAgICAgICBhczogJ2NvdW50X2ZpZWxkJ1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb3A6ICdzdW0nLFxuICAgICAgICAgIGFzOiAnc3VtX2ZpZWxkJ1xuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgaWdub3JlUGVlcnM6IGZhbHNlLFxuICAgICAgc29ydDpcbiAgICAgICAgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOidmJyxcbiAgICAgICAgICAgIG9yZGVyOidhc2NlbmRpbmcnXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgZ3JvdXBieTogWydmJ10sXG4gICAgICBmcmFtZTogW251bGwsIDBdXG4gICAgfTtcbiAgICBjb25zdCB3aW5kb3cgPSBuZXcgV2luZG93VHJhbnNmb3JtTm9kZShudWxsLCB0cmFuc2Zvcm0pO1xuICAgIGFzc2VydC5kZWVwRXF1YWwoe1wiY291bnRfZmllbGRcIjogdHJ1ZSwgXCJvcmRlcmVkX3Jvd19udW1iZXJcIjogdHJ1ZSwgXCJzdW1fZmllbGRcIjogdHJ1ZX0sIHdpbmRvdy5wcm9kdWNlZEZpZWxkcygpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjbG9uZSB0byBhbiBlcXVpdmFsZW50IHZlcnNpb24nLCAoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtOiBUcmFuc2Zvcm0gPSB7XG4gICAgICB3aW5kb3c6IFtcbiAgICAgICAge1xuICAgICAgICAgIG9wOiAncm93X251bWJlcicsXG4gICAgICAgICAgYXM6ICdvcmRlcmVkX3Jvd19udW1iZXInLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGlnbm9yZVBlZXJzOiBmYWxzZSxcbiAgICAgIHNvcnQ6XG4gICAgICAgIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDonZicsXG4gICAgICAgICAgICBvcmRlcjonYXNjZW5kaW5nJ1xuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgIGdyb3VwYnk6IFsnZiddLFxuICAgICAgZnJhbWU6IFtudWxsLCAwXVxuICAgIH07XG4gICAgY29uc3Qgd2luZG93ID0gbmV3IFdpbmRvd1RyYW5zZm9ybU5vZGUobnVsbCwgdHJhbnNmb3JtKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHdpbmRvdywgd2luZG93LmNsb25lKCkpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/facet.test.d.ts b/build/test/compile/facet.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/facet.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/facet.test.js b/build/test/compile/facet.test.js new file mode 100644 index 0000000000..8012dbe41c --- /dev/null +++ b/build/test/compile/facet.test.js @@ -0,0 +1,347 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../src/channel"); +var log = tslib_1.__importStar(require("../../src/log")); +var type_1 = require("../../src/type"); +var util_1 = require("../util"); +describe('FacetModel', function () { + describe('initFacet', function () { + it('should drop unsupported channel and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseFacetModel({ + facet: ({ + shape: { field: 'a', type: 'quantitative' } + }), + spec: { + mark: 'point', + encoding: {} + } + }); + chai_1.assert.equal(model.facet['shape'], undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.incompatibleChannel(channel_1.SHAPE, 'facet')); + })); + it('should drop channel without field and value and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseFacetModel({ + facet: { + row: { type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: {} + } + }); + chai_1.assert.equal(model.facet.row, undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.emptyFieldDef({ type: type_1.ORDINAL }, channel_1.ROW)); + })); + it('should drop channel without field and value and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: {} + } + }); + chai_1.assert.deepEqual(model.facet.row, { field: 'a', type: 'quantitative' }); + chai_1.assert.equal(localLogger.warns[0], log.message.facetChannelShouldBeDiscrete(channel_1.ROW)); + })); + }); + describe('parseAxisAndHeader', function () { + // TODO: add more tests + // - correctly join title for nested facet + // - correctly generate headers with right labels and axes + it('applies text format to the fieldref of a temporal field', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { timeUnit: 'year', field: 'date', type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseAxisAndHeader(); + var headerMarks = model.assembleHeaderMarks(); + var columnHeader = headerMarks.filter(function (d) { + return d.name === "column_header"; + })[0]; + chai_1.assert(columnHeader.title.text.signal, "timeFormat(parent[\"year_date\"], '%Y')"); + }); + it('applies number format for fieldref of a quantitative field', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative', format: 'd' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseAxisAndHeader(); + var headerMarks = model.assembleHeaderMarks(); + var columnHeader = headerMarks.filter(function (d) { + return d.name === "column_header"; + })[0]; + chai_1.assert(columnHeader.title.text.signal, "format(parent[\"a\"], 'd')"); + }); + it('ignores number format for fieldref of a binned field', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { bin: true, field: 'a', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseAxisAndHeader(); + var headerMarks = model.assembleHeaderMarks(); + var columnHeader = headerMarks.filter(function (d) { + return d.name === "column_header"; + })[0]; + chai_1.assert(columnHeader.title.text.signal, "parent[\"a\"]"); + }); + }); + describe('parseScale', function () { + it('should correctly set scale component for a model', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + row: { field: 'a', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + } + }); + chai_1.assert(model.component.scales['x']); + }); + it('should create independent scales if resolve is set to independent', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + row: { field: 'a', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + }, + resolve: { + scale: { + x: 'independent' + } + } + }); + chai_1.assert(!model.component.scales['x']); + }); + }); + describe('assembleHeaderMarks', function () { + it('should sort headers in ascending order', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative', format: 'd' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseAxisAndHeader(); + var headerMarks = model.assembleHeaderMarks(); + var columnHeader = headerMarks.filter(function (d) { + return d.name === "column_header"; + })[0]; + chai_1.assert.deepEqual(columnHeader.sort, { field: 'datum["a"]', order: 'ascending' }); + }); + }); + describe('assembleGroup', function () { + it('includes a columns fields in the encode block for facet with column that parent is also a facet.', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative' } + }, + spec: { + facet: { + column: { field: 'c', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + } + } + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + }); + model.parseData(); + var group = model.child.assembleGroup([]); + chai_1.assert.deepEqual(group.encode.update.columns, { field: 'distinct_c' }); + }); + }); + describe('assembleLayout', function () { + it('returns a layout with a column signal for facet with column', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + } + }); + var layout = model.assembleLayout(); + chai_1.assert.deepEqual(layout, { + padding: { row: 10, column: 10 }, + offset: 10, + columns: { + signal: "length(data('column_domain'))" + }, + bounds: 'full', + align: 'all' + }); + }); + it('returns a layout without a column signal for facet with column that parent is also a facet.', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative' } + }, + spec: { + facet: { + column: { field: 'c', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + } + } + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + }); + var layout = model.child.assembleLayout(); + chai_1.assert.deepEqual(layout.columns, undefined); + }); + it('returns a layout with header band if child spec is also a facet', function () { + var model = util_1.parseFacetModelWithScale({ + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "data": { "url": "data/cars.json" }, + "facet": { "row": { "field": "Origin", "type": "ordinal" } }, + "spec": { + "facet": { "row": { "field": "Cylinders", "type": "ordinal" } }, + "spec": { + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Acceleration", "type": "quantitative" } + } + } + } + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + }); + model.parseLayoutSize(); + model.parseAxisAndHeader(); + var layout = model.assembleLayout(); + chai_1.assert.deepEqual(layout.headerBand, { row: 0.5 }); + }); + }); + describe('assembleMarks', function () { + it('should add cross and sort if we facet by multiple dimensions', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + row: { field: 'a', type: 'ordinal' }, + column: { field: 'b', type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'c', type: 'quantitative' } + } + } + }); + model.parse(); + var marks = model.assembleMarks(); + chai_1.assert(marks[0].from.facet.aggregate.cross); + chai_1.assert.deepEqual(marks[0].sort, { + field: [ + 'datum["a"]', + 'datum["b"]' + ], + order: [ + 'ascending', + 'ascending' + ] + }); + }); + it('should add calculate cardinality for independent scales', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + row: { field: 'a', type: 'ordinal' } + }, + spec: { + mark: 'rect', + encoding: { + x: { field: 'b', type: 'nominal' }, + y: { field: 'c', type: 'nominal' } + } + }, + resolve: { + scale: { + x: 'independent', + y: 'independent' + } + } + }); + model.parse(); + var marks = model.assembleMarks(); + chai_1.assert.deepEqual(marks[0].from.facet.aggregate, { + fields: ['b', 'c'], + ops: ['distinct', 'distinct'] + }); + }); + it('should add calculate cardinality for child column facet', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative' } + }, + spec: { + facet: { + column: { field: 'c', type: 'quantitative' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + } + } + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + }); + model.parse(); + var marks = model.assembleMarks(); + chai_1.assert.deepEqual(marks[0].from.facet.aggregate, { + fields: ['c'], + ops: ['distinct'] + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvY29tcGlsZS9mYWNldC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsNkNBQTZDO0FBSTdDLHlEQUFxQztBQUNyQyx1Q0FBdUM7QUFFdkMsZ0NBQWtFO0FBRWxFLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFDckIsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUNwQixFQUFFLENBQUMsb0RBQW9ELEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7WUFDNUUsSUFBTSxLQUFLLEdBQUcsc0JBQWUsQ0FBQztnQkFDNUIsS0FBSyxFQUFFLENBQUM7b0JBQ04sS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2lCQUMxQyxDQUF5QjtnQkFDMUIsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSxPQUFPO29CQUNiLFFBQVEsRUFBRSxFQUFFO2lCQUNiO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsYUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLGVBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFSixFQUFFLENBQUMsZ0VBQWdFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7WUFDeEYsSUFBTSxLQUFLLEdBQUcsc0JBQWUsQ0FBQztnQkFDNUIsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUM7aUJBQ3ZC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O1lBRWQsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBRXBDLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO2dCQUM5QyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2IsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ2xCLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge1JPVywgU0hBUEV9IGZyb20gJy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7RmFjZXRNb2RlbH0gZnJvbSAnLi4vLi4vc3JjL2NvbXBpbGUvZmFjZXQnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4uLy4uL3NyYy9mYWNldCc7XG5pbXBvcnQge1Bvc2l0aW9uRmllbGREZWZ9IGZyb20gJy4uLy4uL3NyYy9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge09SRElOQUx9IGZyb20gJy4uLy4uL3NyYy90eXBlJztcbmltcG9ydCB7VmdMYXlvdXR9IGZyb20gJy4uLy4uL3NyYy92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge3BhcnNlRmFjZXRNb2RlbCwgcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi91dGlsJztcblxuZGVzY3JpYmUoJ0ZhY2V0TW9kZWwnLCBmdW5jdGlvbigpIHtcbiAgZGVzY3JpYmUoJ2luaXRGYWNldCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRyb3AgdW5zdXBwb3J0ZWQgY2hhbm5lbCBhbmQgdGhyb3dzIHdhcm5pbmcnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHtcbiAgICAgICAgZmFjZXQ6ICh7XG4gICAgICAgICAgc2hhcGU6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfSkgYXMgRmFjZXRNYXBwaW5nPHN0cmluZz4sIC8vIENhc3QgdG8gYWxsb3cgaW52YWxpZCBmYWNldCB0eXBlIGZvciB0ZXN0XG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7fVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5mYWNldFsnc2hhcGUnXSwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuaW5jb21wYXRpYmxlQ2hhbm5lbChTSEFQRSwgJ2ZhY2V0JykpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgZHJvcCBjaGFubmVsIHdpdGhvdXQgZmllbGQgYW5kIHZhbHVlIGFuZCB0aHJvd3Mgd2FybmluZycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWwoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge3R5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHt9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmZhY2V0LnJvdywgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZW1wdHlGaWVsZERlZih7dHlwZTogT1JESU5BTH0sIFJPVykpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgZHJvcCBjaGFubmVsIHdpdGhvdXQgZmllbGQgYW5kIHZhbHVlIGFuZCB0aHJvd3Mgd2FybmluZycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWwoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFBvc2l0aW9uRmllbGREZWY8c3RyaW5nPj4obW9kZWwuZmFjZXQucm93LCB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9KTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZmFjZXRDaGFubmVsU2hvdWxkQmVEaXNjcmV0ZShST1cpKTtcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUF4aXNBbmRIZWFkZXInLCAoKSA9PiB7XG4gICAgLy8gVE9ETzogYWRkIG1vcmUgdGVzdHNcbiAgICAvLyAtIGNvcnJlY3RseSBqb2luIHRpdGxlIGZvciBuZXN0ZWQgZmFjZXRcbiAgICAvLyAtIGNvcnJlY3RseSBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggcmlnaHQgbGFiZWxzIGFuZCBheGVzXG5cblxuICAgIGl0KCdhcHBsaWVzIHRleHQgZm9ybWF0IHRvIHRoZSBmaWVsZHJlZiBvZiBhIHRlbXBvcmFsIGZpZWxkJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIGNvbHVtbjoge3RpbWVVbml0Oid5ZWFyJywgZmllbGQ6ICdkYXRlJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VBeGlzQW5kSGVhZGVyKCk7XG4gICAgICBjb25zdCBoZWFkZXJNYXJrcyA9IG1vZGVsLmFzc2VtYmxlSGVhZGVyTWFya3MoKTtcbiAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IGhlYWRlck1hcmtzLmZpbHRlcihkID0+IHtcbiAgICAgICAgcmV0dXJuIGQubmFtZSA9PT0gXCJjb2x1bW5faGVhZGVyXCI7XG4gICAgICB9KVswXTtcblxuICAgICAgYXNzZXJ0KGNvbHVtbkhlYWRlci50aXRsZS50ZXh0LnNpZ25hbCwgXCJ0aW1lRm9ybWF0KHBhcmVudFtcXFwieWVhcl9kYXRlXFxcIl0sICclWScpXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FwcGxpZXMgbnVtYmVyIGZvcm1hdCBmb3IgZmllbGRyZWYgb2YgYSBxdWFudGl0YXRpdmUgZmllbGQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlRmFjZXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgY29sdW1uOiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZScsIGZvcm1hdDogJ2QnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VBeGlzQW5kSGVhZGVyKCk7XG4gICAgICBjb25zdCBoZWFkZXJNYXJrcyA9IG1vZGVsLmFzc2VtYmxlSGVhZGVyTWFya3MoKTtcbiAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IGhlYWRlck1hcmtzLmZpbHRlcihkID0+IHtcbiAgICAgICAgcmV0dXJuIGQubmFtZSA9PT0gXCJjb2x1bW5faGVhZGVyXCI7XG4gICAgICB9KVswXTtcblxuICAgICAgYXNzZXJ0KGNvbHVtbkhlYWRlci50aXRsZS50ZXh0LnNpZ25hbCwgXCJmb3JtYXQocGFyZW50W1xcXCJhXFxcIl0sICdkJylcIik7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBudW1iZXIgZm9ybWF0IGZvciBmaWVsZHJlZiBvZiBhIGJpbm5lZCBmaWVsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICBjb2x1bW46IHtiaW46IHRydWUsIGZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VBeGlzQW5kSGVhZGVyKCk7XG4gICAgICBjb25zdCBoZWFkZXJNYXJrcyA9IG1vZGVsLmFzc2VtYmxlSGVhZGVyTWFya3MoKTtcbiAgICAgIGNvbnN0IGNvbHVtbkhlYWRlciA9IGhlYWRlck1hcmtzLmZpbHRlcihkID0+IHtcbiAgICAgICAgcmV0dXJuIGQubmFtZSA9PT0gXCJjb2x1bW5faGVhZGVyXCI7XG4gICAgICB9KVswXTtcblxuICAgICAgYXNzZXJ0KGNvbHVtbkhlYWRlci50aXRsZS50ZXh0LnNpZ25hbCwgXCJwYXJlbnRbXFxcImFcXFwiXVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhcnNlU2NhbGUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0bHkgc2V0IHNjYWxlIGNvbXBvbmVudCBmb3IgYSBtb2RlbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICByb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIGFzc2VydChtb2RlbC5jb21wb25lbnQuc2NhbGVzWyd4J10pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaW5kZXBlbmRlbnQgc2NhbGVzIGlmIHJlc29sdmUgaXMgc2V0IHRvIGluZGVwZW5kZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICB4OiAnaW5kZXBlbmRlbnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0KCFtb2RlbC5jb21wb25lbnQuc2NhbGVzWyd4J10pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYXNzZW1ibGVIZWFkZXJNYXJrcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNvcnQgaGVhZGVycyBpbiBhc2NlbmRpbmcgb3JkZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlRmFjZXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgY29sdW1uOiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZScsIGZvcm1hdDogJ2QnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VBeGlzQW5kSGVhZGVyKCk7XG5cbiAgICAgIGNvbnN0IGhlYWRlck1hcmtzID0gbW9kZWwuYXNzZW1ibGVIZWFkZXJNYXJrcygpO1xuICAgICAgY29uc3QgY29sdW1uSGVhZGVyID0gaGVhZGVyTWFya3MuZmlsdGVyKGQgPT4ge1xuICAgICAgICByZXR1cm4gZC5uYW1lID09PSBcImNvbHVtbl9oZWFkZXJcIjtcbiAgICAgIH0pWzBdO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGNvbHVtbkhlYWRlci5zb3J0LCB7ZmllbGQ6ICdkYXR1bVtcImFcIl0nLCBvcmRlcjogJ2FzY2VuZGluZyd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlR3JvdXAnLCAoKSA9PiB7XG4gICAgaXQoJ2luY2x1ZGVzIGEgY29sdW1ucyBmaWVsZHMgaW4gdGhlIGVuY29kZSBibG9jayBmb3IgZmFjZXQgd2l0aCBjb2x1bW4gdGhhdCBwYXJlbnQgaXMgYWxzbyBhIGZhY2V0LicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICBjb2x1bW46IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICAgIGNvbHVtbjoge2ZpZWxkOiAnYycsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3BlYzoge1xuICAgICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlIFwiYW55XCIgb25jZSB3ZSBzdXBwb3J0IGFsbCBmYWNldCBsaXN0ZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yNzYwXG4gICAgICB9IGFzIGFueSk7XG4gICAgICBtb2RlbC5wYXJzZURhdGEoKTtcbiAgICAgIGNvbnN0IGdyb3VwID0gbW9kZWwuY2hpbGQuYXNzZW1ibGVHcm91cChbXSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGdyb3VwLmVuY29kZS51cGRhdGUuY29sdW1ucywge2ZpZWxkOiAnZGlzdGluY3RfYyd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlTGF5b3V0JywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGEgbGF5b3V0IHdpdGggYSBjb2x1bW4gc2lnbmFsIGZvciBmYWNldCB3aXRoIGNvbHVtbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICBjb2x1bW46IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGF5b3V0ID0gbW9kZWwuYXNzZW1ibGVMYXlvdXQoKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdMYXlvdXQ+KGxheW91dCwge1xuICAgICAgICBwYWRkaW5nOiB7cm93OiAxMCwgY29sdW1uOiAxMH0sXG4gICAgICAgIG9mZnNldDogMTAsXG4gICAgICAgIGNvbHVtbnM6IHtcbiAgICAgICAgICBzaWduYWw6IFwibGVuZ3RoKGRhdGEoJ2NvbHVtbl9kb21haW4nKSlcIlxuICAgICAgICB9LFxuICAgICAgICBib3VuZHM6ICdmdWxsJyxcbiAgICAgICAgYWxpZ246ICdhbGwnXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXR1cm5zIGEgbGF5b3V0IHdpdGhvdXQgYSBjb2x1bW4gc2lnbmFsIGZvciBmYWNldCB3aXRoIGNvbHVtbiB0aGF0IHBhcmVudCBpcyBhbHNvIGEgZmFjZXQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIGNvbHVtbjoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICBmYWNldDoge1xuICAgICAgICAgICAgY29sdW1uOiB7ZmllbGQ6ICdjJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiByZW1vdmUgXCJhbnlcIiBvbmNlIHdlIHN1cHBvcnQgYWxsIGZhY2V0IGxpc3RlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI3NjBcbiAgICAgIH0gYXMgYW55KTtcbiAgICAgIGNvbnN0IGxheW91dCA9IG1vZGVsLmNoaWxkLmFzc2VtYmxlTGF5b3V0KCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxheW91dC5jb2x1bW5zLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JldHVybnMgYSBsYXlvdXQgd2l0aCBoZWFkZXIgYmFuZCBpZiBjaGlsZCBzcGVjIGlzIGFsc28gYSBmYWNldCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgXCIkc2NoZW1hXCI6IFwiaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby9zY2hlbWEvdmVnYS1saXRlL3YyLmpzb25cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgICBcImZhY2V0XCI6IHtcInJvd1wiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn19LFxuICAgICAgICBcInNwZWNcIjoge1xuICAgICAgICAgIFwiZmFjZXRcIjoge1wicm93XCI6IHtcImZpZWxkXCI6IFwiQ3lsaW5kZXJzXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifX0sXG4gICAgICAgICAgXCJzcGVjXCI6IHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiQWNjZWxlcmF0aW9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSBcImFueVwiIG9uY2Ugd2Ugc3VwcG9ydCBhbGwgZmFjZXQgbGlzdGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjc2MFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgbW9kZWwucGFyc2VMYXlvdXRTaXplKCk7XG4gICAgICBtb2RlbC5wYXJzZUF4aXNBbmRIZWFkZXIoKTtcbiAgICAgIGNvbnN0IGxheW91dCA9IG1vZGVsLmFzc2VtYmxlTGF5b3V0KCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxheW91dC5oZWFkZXJCYW5kLCB7cm93OiAwLjV9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2Fzc2VtYmxlTWFya3MnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBhZGQgY3Jvc3MgYW5kIHNvcnQgaWYgd2UgZmFjZXQgYnkgbXVsdGlwbGUgZGltZW5zaW9ucycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsOiBGYWNldE1vZGVsID0gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICByb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9LFxuICAgICAgICAgIGNvbHVtbjoge2ZpZWxkOiAnYicsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2UoKTtcblxuICAgICAgY29uc3QgbWFya3MgPSBtb2RlbC5hc3NlbWJsZU1hcmtzKCk7XG5cbiAgICAgIGFzc2VydChtYXJrc1swXS5mcm9tLmZhY2V0LmFnZ3JlZ2F0ZS5jcm9zcyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1hcmtzWzBdLnNvcnQsIHtcbiAgICAgICAgZmllbGQ6IFtcbiAgICAgICAgICAnZGF0dW1bXCJhXCJdJyxcbiAgICAgICAgICAnZGF0dW1bXCJiXCJdJ1xuICAgICAgICBdLFxuICAgICAgICBvcmRlcjogW1xuICAgICAgICAgICdhc2NlbmRpbmcnLFxuICAgICAgICAgICdhc2NlbmRpbmcnXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgY2FsY3VsYXRlIGNhcmRpbmFsaXR5IGZvciBpbmRlcGVuZGVudCBzY2FsZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogRmFjZXRNb2RlbCA9IHBhcnNlRmFjZXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgcm93OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3JlY3QnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ25vbWluYWwnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAnbm9taW5hbCd9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgIHg6ICdpbmRlcGVuZGVudCcsXG4gICAgICAgICAgICB5OiAnaW5kZXBlbmRlbnQnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG5cbiAgICAgIGNvbnN0IG1hcmtzID0gbW9kZWwuYXNzZW1ibGVNYXJrcygpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1hcmtzWzBdLmZyb20uZmFjZXQuYWdncmVnYXRlLCB7XG4gICAgICAgIGZpZWxkczogWydiJywgJ2MnXSxcbiAgICAgICAgb3BzOiBbJ2Rpc3RpbmN0JywgJ2Rpc3RpbmN0J11cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgY2FsY3VsYXRlIGNhcmRpbmFsaXR5IGZvciBjaGlsZCBjb2x1bW4gZmFjZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbDogRmFjZXRNb2RlbCA9IHBhcnNlRmFjZXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgY29sdW1uOiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgIH0sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgICBjb2x1bW46IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZSBcImFueVwiIG9uY2Ugd2Ugc3VwcG9ydCBhbGwgZmFjZXQgbGlzdGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjc2MFxuICAgICAgfSBhcyBhbnkpO1xuICAgICAgbW9kZWwucGFyc2UoKTtcblxuICAgICAgY29uc3QgbWFya3MgPSBtb2RlbC5hc3NlbWJsZU1hcmtzKCk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobWFya3NbMF0uZnJvbS5mYWNldC5hZ2dyZWdhdGUsIHtcbiAgICAgICAgZmllbGRzOiBbJ2MnXSxcbiAgICAgICAgb3BzOiBbJ2Rpc3RpbmN0J11cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/layer.test.d.ts b/build/test/compile/layer.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/layer.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/layer.test.js b/build/test/compile/layer.test.js new file mode 100644 index 0000000000..e717af6436 --- /dev/null +++ b/build/test/compile/layer.test.js @@ -0,0 +1,97 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var util_1 = require("../util"); +describe('Layer', function () { + describe('parseScale', function () { + it('should merge domains', function () { + var model = util_1.parseLayerModel({ + layer: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }, { + mark: 'point', + encoding: { + x: { field: 'b', type: 'ordinal' } + } + }] + }); + chai_1.assert.equal(model.children.length, 2); + model.parseScale(); + chai_1.assert.deepEqual(model.component.scales['x'].domains, [{ + data: 'layer_0_main', + field: 'a', + sort: true + }, { + data: 'layer_1_main', + field: 'b', + sort: true + }]); + }); + it('should union explicit and referenced domains', function () { + var model = util_1.parseLayerModel({ + layer: [{ + mark: 'point', + encoding: { + x: { scale: { domain: [1, 2, 3] }, field: 'b', type: 'ordinal' } + } + }, { + mark: 'point', + encoding: { + x: { field: 'b', type: 'ordinal' } + } + }] + }); + model.parseScale(); + chai_1.assert.deepEqual(model.component.scales['x'].domains, [ + [1, 2, 3], + { + data: 'layer_1_main', + field: 'b', + sort: true + } + ]); + }); + }); + describe('dual axis chart', function () { + var model = util_1.parseLayerModel({ + layer: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' } + } + }, { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' } + } + }], + resolve: { + scale: { + x: 'independent' + } + } + }); + chai_1.assert.equal(model.children.length, 2); + it('should leave scales in children when set to be independent', function () { + model.parseScale(); + chai_1.assert.equal(model.component.scales['x'], undefined); + chai_1.assert.deepEqual(model.children[0].component.scales['x'].domains, [{ + data: 'layer_0_main', + field: 'a' + }]); + chai_1.assert.deepEqual(model.children[1].component.scales['x'].domains, [{ + data: 'layer_1_main', + field: 'b' + }]); + }); + it('should create second axis on top', function () { + model.parseAxisAndHeader(); + chai_1.assert.equal(model.component.axes['x'].length, 2); + chai_1.assert.equal(model.component.axes['x'][1].implicit.orient, 'top'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvY29tcGlsZS9sYXllci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLGdDQUF3QztBQUV4QyxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ2hCLFFBQVEsQ0FBQyxZQUFZLEVBQUU7UUFDckIsRUFBRSxDQUFDLHNCQUFzQixFQUFFO1lBQ3pCLElBQU0sS0FBSyxHQUFHLHNCQUFlLENBQUM7Z0JBQzVCLEtBQUssRUFBRSxDQUFDO3dCQUNOLElBQUksRUFBRSxPQUFPO3dCQUNiLFFBQVEsRUFBRTs0QkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7eUJBQ2pDO3FCQUNGLEVBQUM7d0JBQ0EsSUFBSSxFQUFFLE9BQU87d0JBQ2IsUUFBUSxFQUFFOzRCQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQzt5QkFDakM7cUJBQ0YsQ0FBQzthQUNILENBQUMsQ0FBQztZQUNILGFBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBRW5CLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ25ELElBQUksRUFBRSxjQUFjO29CQUNwQixLQUFLLEVBQUUsR0FBRztvQkFDVixJQUFJLEVBQUUsSUFBSTtpQkFDWCxFQUFFO29CQUNELElBQUksRUFBRSxjQUFjO29CQUNwQixLQUFLLEVBQUUsR0FBRztvQkFDVixJQUFJLEVBQUUsSUFBSTtpQkFDWCxDQUFDLENBQUMsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFD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LENBQUMsQ0FBQyxDQUFDO1lBQ2xELGFBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge3BhcnNlTGF5ZXJNb2RlbH0gZnJvbSAnLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdMYXllcicsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgncGFyc2VTY2FsZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIG1lcmdlIGRvbWFpbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICAgIGxheWVyOiBbe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9XG4gICAgICAgICAgfVxuICAgICAgICB9LHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICAgIH1cbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNoaWxkcmVuLmxlbmd0aCwgMik7XG4gICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LnNjYWxlc1sneCddLmRvbWFpbnMsIFt7XG4gICAgICAgICAgZGF0YTogJ2xheWVyXzBfbWFpbicsXG4gICAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgICBzb3J0OiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkYXRhOiAnbGF5ZXJfMV9tYWluJyxcbiAgICAgICAgICBmaWVsZDogJ2InLFxuICAgICAgICAgIHNvcnQ6IHRydWVcbiAgICAgICAgfV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB1bmlvbiBleHBsaWNpdCBhbmQgcmVmZXJlbmNlZCBkb21haW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBsYXllcjogW3tcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7c2NhbGU6IHtkb21haW46IFsxLCAyLCAzXX0sIGZpZWxkOiAnYicsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICAgIH1cbiAgICAgICAgfV1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VTY2FsZSgpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5zY2FsZXNbJ3gnXS5kb21haW5zLCBbXG4gICAgICAgIFsxLCAyLCAzXSxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6ICdsYXllcl8xX21haW4nLFxuICAgICAgICAgIGZpZWxkOiAnYicsXG4gICAgICAgICAgc29ydDogdHJ1ZVxuICAgICAgICB9XSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkdWFsIGF4aXMgY2hhcnQnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgbGF5ZXI6IFt7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9XSxcbiAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICB4OiAnaW5kZXBlbmRlbnQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGFzc2VydC5lcXVhbChtb2RlbC5jaGlsZHJlbi5sZW5ndGgsIDIpO1xuXG4gICAgaXQoJ3Nob3VsZCBsZWF2ZSBzY2FsZXMgaW4gY2hpbGRyZW4gd2hlbiBzZXQgdG8gYmUgaW5kZXBlbmRlbnQnLCAoKSA9PiB7XG4gICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5jb21wb25lbnQuc2NhbGVzWyd4J10sIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNoaWxkcmVuWzBdLmNvbXBvbmVudC5zY2FsZXNbJ3gnXS5kb21haW5zLCBbe1xuICAgICAgICBkYXRhOiAnbGF5ZXJfMF9tYWluJyxcbiAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgfV0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jaGlsZHJlblsxXS5jb21wb25lbnQuc2NhbGVzWyd4J10uZG9tYWlucywgW3tcbiAgICAgICAgZGF0YTogJ2xheWVyXzFfbWFpbicsXG4gICAgICAgIGZpZWxkOiAnYidcbiAgICAgIH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIHNlY29uZCBheGlzIG9uIHRvcCcsICgpID0+IHtcbiAgICAgIG1vZGVsLnBhcnNlQXhpc0FuZEhlYWRlcigpO1xuXG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwuY29tcG9uZW50LmF4ZXNbJ3gnXS5sZW5ndGgsIDIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNvbXBvbmVudC5heGVzWyd4J11bMV0uaW1wbGljaXQub3JpZW50LCAndG9wJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/layout/header.test.d.ts b/build/test/compile/layout/header.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/layout/header.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/layout/header.test.js b/build/test/compile/layout/header.test.js new file mode 100644 index 0000000000..a7bf16d2c9 --- /dev/null +++ b/build/test/compile/layout/header.test.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var header_1 = require("../../../src/compile/layout/header"); +var util_1 = require("../../util"); +describe('compile/layout/header', function () { + describe('label aligns correctly according to angle', function () { + chai_1.assert.deepEqual(header_1.labelAlign(23), { align: { value: 'right' } }); + chai_1.assert.deepEqual(header_1.labelAlign(135), { align: { value: 'left' } }); + chai_1.assert.deepEqual(header_1.labelAlign(50), { align: { value: 'right' } }); + }); + describe('label baseline adjusted according to angle', function () { + chai_1.assert.deepEqual(header_1.labelBaseline(10), {}); + chai_1.assert.deepEqual(header_1.labelBaseline(90), { baseline: { value: 'top' } }); + }); + describe('getHeaderGroups', function () { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'ordinal', sort: 'ascending' }, + column: { field: 'a', type: 'ordinal', sort: 'descending' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseScale(); + model.parseLayoutSize(); + model.parseAxisAndHeader(); + var rowHeaderGroups = header_1.getHeaderGroups(model, 'row'); + var columnHeaderGroups = header_1.getHeaderGroups(model, 'column'); + it('should correctly process sort', function () { + chai_1.assert.equal(rowHeaderGroups[0].sort.order, 'ascending'); + chai_1.assert.equal(columnHeaderGroups[0].sort.order, 'descending'); + }); + }); + describe('getTitleGroup', function () { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'ordinal' }, + column: { field: 'a', type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + } + }); + model.parseScale(); + model.parseLayoutSize(); + model.parseAxisAndHeader(); + describe('for column', function () { + var columnLabelGroup = header_1.getTitleGroup(model, 'column'); + var marks = columnLabelGroup.marks, columnTitleGroupTopLevelProps = tslib_1.__rest(columnLabelGroup, ["marks"]); + it('returns a header group mark with correct name, role, type, and from.', function () { + chai_1.assert.deepEqual(columnTitleGroupTopLevelProps, { + name: 'column_title', + type: 'group', + role: 'column-title' + }); + }); + var textMark = marks[0]; + it('contains a correct text mark with the correct role and encode as the only item in marks', function () { + chai_1.assert.equal(marks.length, 1); + chai_1.assert.deepEqual(textMark, { + type: 'text', + role: 'column-title-text', + style: 'guide-title', + encode: { + update: { + text: { value: 'a' }, + align: { value: 'center' } + } + } + }); + }); + }); + describe('for row', function () { + var rowTitleGroup = header_1.getTitleGroup(model, 'row'); + var marks = rowTitleGroup.marks, rowTitleGroupTopLevelProps = tslib_1.__rest(rowTitleGroup, ["marks"]); + it('returns a header group mark with correct name, role, type, from, and encode.', function () { + chai_1.assert.deepEqual(rowTitleGroupTopLevelProps, { + name: 'row_title', + type: 'group', + role: 'row-title' + }); + }); + var textMark = marks[0]; + it('contains a correct text mark with the correct role and encode as the only item in marks', function () { + chai_1.assert.equal(marks.length, 1); + chai_1.assert.deepEqual(textMark, { + type: 'text', + role: 'row-title-text', + style: 'guide-title', + encode: { + update: { + text: { value: 'a' }, + angle: { value: 270 }, + align: { value: 'center' } + } + } + }); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvbGF5b3V0L2hlYWRlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE0QjtBQUM1Qiw2REFBNkc7QUFFN0csbUNBQTJDO0FBRTNDLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtJQUNoQyxRQUFRLENBQUMsMkNBQTJDLEVBQUU7UUFDcEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxtQkFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFDLENBQUMsQ0FBQztRQUM1RCxhQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQzVELGFBQU0sQ0FBQyxTQUFTLENBQUMsbUJBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsNENBQTRDLEVBQUU7UUFDckQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxzQkFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLGFBQU0sQ0FBQyxTQUFTLENBQUMsc0JBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsSUFBTSxLQUFLLEdBQUcsc0JBQWUsQ0FBQztZQUM1QixLQUFLLEVBQUU7Z0JBQ0wsR0FBRyxFQUFFLEVBQUMsS0FBSyxF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QUNGO2lCQUNGLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtnZXRIZWFkZXJHcm91cHMsIGdldFRpdGxlR3JvdXAsIGxhYmVsQWxpZ24sIGxhYmVsQmFzZWxpbmV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2xheW91dC9oZWFkZXInO1xuaW1wb3J0IHtWZ01hcmtHcm91cH0gZnJvbSAnLi4vLi4vLi4vc3JjL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VGYWNldE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvbGF5b3V0L2hlYWRlcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2xhYmVsIGFsaWducyBjb3JyZWN0bHkgYWNjb3JkaW5nIHRvIGFuZ2xlJywgKCkgPT4ge1xuICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxBbGlnbigyMyksIHthbGlnbjoge3ZhbHVlOiAncmlnaHQnfX0pO1xuICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxBbGlnbigxMzUpLCB7YWxpZ246IHt2YWx1ZTogJ2xlZnQnfX0pO1xuICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxBbGlnbig1MCksIHthbGlnbjoge3ZhbHVlOiAncmlnaHQnfX0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbGFiZWwgYmFzZWxpbmUgYWRqdXN0ZWQgYWNjb3JkaW5nIHRvIGFuZ2xlJywgKCkgPT4ge1xuICAgIGFzc2VydC5kZWVwRXF1YWwobGFiZWxCYXNlbGluZSgxMCksIHt9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsQmFzZWxpbmUoOTApLCB7YmFzZWxpbmU6IHt2YWx1ZTogJ3RvcCd9fSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRIZWFkZXJHcm91cHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWwoe1xuICAgICAgZmFjZXQ6IHtcbiAgICAgICAgcm93OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnLCBzb3J0OiAnYXNjZW5kaW5nJ30sXG4gICAgICAgIGNvbHVtbjoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJywgc29ydDogJ2Rlc2NlbmRpbmcnfVxuICAgICAgfSxcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICBtb2RlbC5wYXJzZUxheW91dFNpemUoKTtcbiAgICBtb2RlbC5wYXJzZUF4aXNBbmRIZWFkZXIoKTtcblxuICAgIGNvbnN0IHJvd0hlYWRlckdyb3VwcyA9IGdldEhlYWRlckdyb3Vwcyhtb2RlbCwgJ3JvdycpO1xuICAgIGNvbnN0IGNvbHVtbkhlYWRlckdyb3VwcyA9IGdldEhlYWRlckdyb3Vwcyhtb2RlbCwgJ2NvbHVtbicpO1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IHByb2Nlc3Mgc29ydCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChyb3dIZWFkZXJHcm91cHNbMF0uc29ydC5vcmRlciwgJ2FzY2VuZGluZycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGNvbHVtbkhlYWRlckdyb3Vwc1swXS5zb3J0Lm9yZGVyLCAnZGVzY2VuZGluZycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZ2V0VGl0bGVHcm91cCcsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlRmFjZXRNb2RlbCh7XG4gICAgICBmYWNldDoge1xuICAgICAgICByb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9LFxuICAgICAgICBjb2x1bW46IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9XG4gICAgICB9LFxuICAgICAgc3BlYzoge1xuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYycsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICAgIG1vZGVsLnBhcnNlTGF5b3V0U2l6ZSgpO1xuICAgIG1vZGVsLnBhcnNlQXhpc0FuZEhlYWRlcigpO1xuXG4gICAgZGVzY3JpYmUoJ2ZvciBjb2x1bW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBjb2x1bW5MYWJlbEdyb3VwID0gZ2V0VGl0bGVHcm91cChtb2RlbCwgJ2NvbHVtbicpO1xuICAgICAgY29uc3Qge21hcmtzLCAuLi5jb2x1bW5UaXRsZUdyb3VwVG9wTGV2ZWxQcm9wc30gPSBjb2x1bW5MYWJlbEdyb3VwO1xuICAgICAgaXQoJ3JldHVybnMgYSBoZWFkZXIgZ3JvdXAgbWFyayB3aXRoIGNvcnJlY3QgbmFtZSwgcm9sZSwgdHlwZSwgYW5kIGZyb20uJywgKCkgPT4ge1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoY29sdW1uVGl0bGVHcm91cFRvcExldmVsUHJvcHMsIHtcbiAgICAgICAgICBuYW1lOiAnY29sdW1uX3RpdGxlJyxcbiAgICAgICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgICAgIHJvbGU6ICdjb2x1bW4tdGl0bGUnXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCB0ZXh0TWFyayA9IG1hcmtzWzBdO1xuXG4gICAgICBpdCgnY29udGFpbnMgYSBjb3JyZWN0IHRleHQgbWFyayB3aXRoIHRoZSBjb3JyZWN0IHJvbGUgYW5kIGVuY29kZSBhcyB0aGUgb25seSBpdGVtIGluIG1hcmtzJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwobWFya3MubGVuZ3RoLCAxKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ01hcmtHcm91cD4odGV4dE1hcmssIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgcm9sZTogJ2NvbHVtbi10aXRsZS10ZXh0JyxcbiAgICAgICAgICBzdHlsZTogJ2d1aWRlLXRpdGxlJyxcbiAgICAgICAgICBlbmNvZGU6IHtcbiAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICB0ZXh0OiB7dmFsdWU6ICdhJ30sXG4gICAgICAgICAgICAgIGFsaWduOiB7dmFsdWU6ICdjZW50ZXInfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdmb3Igcm93JywgKCkgPT4ge1xuICAgICAgY29uc3Qgcm93VGl0bGVHcm91cCA9IGdldFRpdGxlR3JvdXAobW9kZWwsICdyb3cnKTtcbiAgICAgIGNvbnN0IHttYXJrcywgLi4ucm93VGl0bGVHcm91cFRvcExldmVsUHJvcHN9ID0gcm93VGl0bGVHcm91cDtcbiAgICAgIGl0KCdyZXR1cm5zIGEgaGVhZGVyIGdyb3VwIG1hcmsgd2l0aCBjb3JyZWN0IG5hbWUsIHJvbGUsIHR5cGUsIGZyb20sIGFuZCBlbmNvZGUuJywgKCkgPT4ge1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwocm93VGl0bGVHcm91cFRvcExldmVsUHJvcHMsIHtcbiAgICAgICAgICBuYW1lOiAncm93X3RpdGxlJyxcbiAgICAgICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgICAgIHJvbGU6ICdyb3ctdGl0bGUnXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBjb25zdCB0ZXh0TWFyayA9IG1hcmtzWzBdO1xuXG4gICAgICBpdCgnY29udGFpbnMgYSBjb3JyZWN0IHRleHQgbWFyayB3aXRoIHRoZSBjb3JyZWN0IHJvbGUgYW5kIGVuY29kZSBhcyB0aGUgb25seSBpdGVtIGluIG1hcmtzJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwobWFya3MubGVuZ3RoLCAxKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ01hcmtHcm91cD4odGV4dE1hcmssIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgcm9sZTogJ3Jvdy10aXRsZS10ZXh0JyxcbiAgICAgICAgICBzdHlsZTogJ2d1aWRlLXRpdGxlJyxcbiAgICAgICAgICBlbmNvZGU6IHtcbiAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICB0ZXh0OiB7dmFsdWU6ICdhJ30sXG4gICAgICAgICAgICAgIGFuZ2xlOiB7dmFsdWU6IDI3MH0sXG4gICAgICAgICAgICAgIGFsaWduOiB7dmFsdWU6ICdjZW50ZXInfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/layoutsize/assemble.test.d.ts b/build/test/compile/layoutsize/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/layoutsize/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/layoutsize/assemble.test.js b/build/test/compile/layoutsize/assemble.test.js new file mode 100644 index 0000000000..22e4b86506 --- /dev/null +++ b/build/test/compile/layoutsize/assemble.test.js @@ -0,0 +1,166 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var util_1 = require("../../util"); +var channel_1 = require("../../../src/channel"); +var assemble_1 = require("../../../src/compile/layoutsize/assemble"); +var log = tslib_1.__importStar(require("../../../src/log")); +describe('compile/layout', function () { + describe('sizeExpr', function () { + it('should return correct formula for ordinal-point scale', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ + name: 'x_step', + value: 21 + }, { + name: 'width', + update: 'bandspace(domain(\'x\').length, 1, 0.5) * x_step' + }]); + }); + it('should return correct formula for ordinal-band scale with custom padding', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'rect', + encoding: { + x: { field: 'a', type: 'ordinal', scale: { padding: 0.3 } }, + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ + name: 'x_step', + value: 21 + }, { + name: 'width', + update: 'bandspace(domain(\'x\').length, 0.3, 0.3) * x_step' + }]); + }); + it('should return correct formula for ordinal-band scale with custom paddingInner', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'rect', + encoding: { + x: { field: 'a', type: 'ordinal', scale: { paddingInner: 0.3 } }, + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ + name: 'x_step', + value: 21 + }, { + name: 'width', + update: 'bandspace(domain(\'x\').length, 0.3, 0.15) * x_step' + }]); + }); + it('should return only step if parent is facet', function () { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'nominal' } + } + }, + resolve: { + scale: { x: 'independent' } + } + }); + model.parseScale(); + model.parseLayoutSize(); + var size = assemble_1.sizeSignals(model.child, 'width'); + chai_1.assert.deepEqual(size, [{ + name: 'child_x_step', + value: 21 + }]); + }); + it('should return static view size for ordinal x-scale with null', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal', scale: { rangeStep: null } } + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 200 }]); + }); + it('should return static view size for ordinal y-scale with null', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + y: { field: 'a', type: 'ordinal', scale: { rangeStep: null } } + } + }); + var size = assemble_1.sizeSignals(model, 'height'); + chai_1.assert.deepEqual(size, [{ name: 'height', value: 200 }]); + }); + it('should return static view size for ordinal scale with top-level width', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + width: 205, + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 205 }]); + }); + it('should return static view size for ordinal scale with top-level width even if there is numeric rangeStep', log.wrap(function (localLogger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + width: 205, + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal', scale: { rangeStep: 21 } } + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 205 }]); + chai_1.assert.equal(localLogger.warns[0], log.message.rangeStepDropped(channel_1.X)); + })); + it('should return static view width for non-ordinal x-scale', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' } + } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 200 }]); + }); + it('should return static view size for non-ordinal y-scale', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + y: { field: 'a', type: 'quantitative' } + } + }); + var size = assemble_1.sizeSignals(model, 'height'); + chai_1.assert.deepEqual(size, [{ name: 'height', value: 200 }]); + }); + it('should return default rangeStep if axis is not mapped', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: {}, + config: { scale: { rangeStep: 17 } } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 17 }]); + }); + it('should return textXRangeStep if axis is not mapped for X of text mark', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'text', + encoding: {}, + config: { scale: { textXRangeStep: 91 } } + }); + var size = assemble_1.sizeSignals(model, 'width'); + chai_1.assert.deepEqual(size, [{ name: 'width', value: 91 }]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9sYXlvdXRzaXplL2Fzc2VtYmxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUM1QixtQ0FBaUY7QUFFakYsZ0RBQXVDO0FBQ3ZDLHFFQUFxRTtBQUNyRSw0REFBd0M7QUFFeEMsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLFFBQVEsQ0FBQyxVQUFVLEVBQUU7UUFDbkIsRUFBRSxDQUFDLHVEQUF1RCxFQUFFO1lBQzFELElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO2dCQUNqRCxJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO2lCQUNqQzthQUNGLENBQUMsQ0FBQztZQUVILElBQU0sSUFBSSxHQUFHLHNCQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3pDLGFBQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RCLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxFQUFFO2lCQUNWLEVBQUM7b0JBQ0EsSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLGtEQUFrRDtpQkFDM0QsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwRUFBMEUsRUFBRTtZQUM3RSxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztnQkFDakQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFDLEVBQUM7aUJB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Q0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge3BhcnNlRmFjZXRNb2RlbCwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplfSBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtYfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQge3NpemVTaWduYWxzfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9sYXlvdXRzaXplL2Fzc2VtYmxlJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi8uLi9zcmMvbG9nJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvbGF5b3V0JywgKCkgPT4ge1xuICBkZXNjcmliZSgnc2l6ZUV4cHInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBmb3JtdWxhIGZvciBvcmRpbmFsLXBvaW50IHNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBtYXJrOiAncG9pbnQnLCAvLyBwb2ludCBtYXJrIHByb2R1Y2Ugb3JkaW5hbC1wb2ludCBzY2FsZSBieSBkZWZhdWx0XG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplU2lnbmFscyhtb2RlbCwgJ3dpZHRoJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNpemUsIFt7XG4gICAgICAgIG5hbWU6ICd4X3N0ZXAnLFxuICAgICAgICB2YWx1ZTogMjFcbiAgICAgIH0se1xuICAgICAgICBuYW1lOiAnd2lkdGgnLFxuICAgICAgICB1cGRhdGU6ICdiYW5kc3BhY2UoZG9tYWluKFxcJ3hcXCcpLmxlbmd0aCwgMSwgMC41KSAqIHhfc3RlcCdcbiAgICAgIH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZm9ybXVsYSBmb3Igb3JkaW5hbC1iYW5kIHNjYWxlIHdpdGggY3VzdG9tIHBhZGRpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIG1hcms6ICdyZWN0JywgLy8gcmVjdCBwcm9kdWNlcyBvcmRpbmFsLWJhbmQgYnkgZGVmYXVsdFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNjYWxlOiB7cGFkZGluZzogMC4zfX0sXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwsICd3aWR0aCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzaXplLCBbe1xuICAgICAgICBuYW1lOiAneF9zdGVwJyxcbiAgICAgICAgdmFsdWU6IDIxXG4gICAgICB9LHtcbiAgICAgICAgbmFtZTogJ3dpZHRoJyxcbiAgICAgICAgdXBkYXRlOiAnYmFuZHNwYWNlKGRvbWFpbihcXCd4XFwnKS5sZW5ndGgsIDAuMywgMC4zKSAqIHhfc3RlcCdcbiAgICAgIH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZm9ybXVsYSBmb3Igb3JkaW5hbC1iYW5kIHNjYWxlIHdpdGggY3VzdG9tIHBhZGRpbmdJbm5lcicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3JlY3QnLCAvLyByZWN0IHByb2R1Y2VzIG9yZGluYWwtYmFuZCBieSBkZWZhdWx0XG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJywgc2NhbGU6IHtwYWRkaW5nSW5uZXI6IDAuM319LFxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2l6ZSA9IHNpemVTaWduYWxzKG1vZGVsLCAnd2lkdGgnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2l6ZSwgW3tcbiAgICAgICAgbmFtZTogJ3hfc3RlcCcsXG4gICAgICAgIHZhbHVlOiAyMVxuICAgICAgfSx7XG4gICAgICAgIG5hbWU6ICd3aWR0aCcsXG4gICAgICAgIHVwZGF0ZTogJ2JhbmRzcGFjZShkb21haW4oXFwneFxcJykubGVuZ3RoLCAwLjMsIDAuMTUpICogeF9zdGVwJ1xuICAgICAgfV0pO1xuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBvbmx5IHN0ZXAgaWYgcGFyZW50IGlzIGZhY2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWwoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAnbm9taW5hbCd9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgc2NhbGU6IHt4OiAnaW5kZXBlbmRlbnQnfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICAgIG1vZGVsLnBhcnNlTGF5b3V0U2l6ZSgpO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwuY2hpbGQsICd3aWR0aCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzaXplLCBbe1xuICAgICAgICBuYW1lOiAnY2hpbGRfeF9zdGVwJyxcbiAgICAgICAgdmFsdWU6IDIxXG4gICAgICB9XSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzdGF0aWMgdmlldyBzaXplIGZvciBvcmRpbmFsIHgtc2NhbGUgd2l0aCBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNjYWxlOiB7cmFuZ2VTdGVwOiBudWxsfX1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplU2lnbmFscyhtb2RlbCwgJ3dpZHRoJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNpemUsIFt7bmFtZTogJ3dpZHRoJywgdmFsdWU6IDIwMH1dKTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3RhdGljIHZpZXcgc2l6ZSBmb3Igb3JkaW5hbCB5LXNjYWxlIHdpdGggbnVsbCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnLCBzY2FsZToge3JhbmdlU3RlcDogbnVsbH19XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwsICdoZWlnaHQnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2l6ZSwgW3tuYW1lOiAnaGVpZ2h0JywgdmFsdWU6IDIwMH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0YXRpYyB2aWV3IHNpemUgZm9yIG9yZGluYWwgc2NhbGUgd2l0aCB0b3AtbGV2ZWwgd2lkdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIHdpZHRoOiAyMDUsXG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplU2lnbmFscyhtb2RlbCwgJ3dpZHRoJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNpemUsIFt7bmFtZTogJ3dpZHRoJywgdmFsdWU6IDIwNX1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0YXRpYyB2aWV3IHNpemUgZm9yIG9yZGluYWwgc2NhbGUgd2l0aCB0b3AtbGV2ZWwgd2lkdGggZXZlbiBpZiB0aGVyZSBpcyBudW1lcmljIHJhbmdlU3RlcCcsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICB3aWR0aDogMjA1LFxuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNjYWxlOiB7cmFuZ2VTdGVwOiAyMX19XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwsICd3aWR0aCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzaXplLCBbe25hbWU6ICd3aWR0aCcsIHZhbHVlOiAyMDV9XSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLnJhbmdlU3RlcERyb3BwZWQoWCkpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHN0YXRpYyB2aWV3IHdpZHRoIGZvciBub24tb3JkaW5hbCB4LXNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNpemUgPSBzaXplU2lnbmFscyhtb2RlbCwgJ3dpZHRoJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNpemUsIFt7bmFtZTogJ3dpZHRoJywgdmFsdWU6IDIwMH1dKTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3RhdGljIHZpZXcgc2l6ZSBmb3Igbm9uLW9yZGluYWwgeS1zY2FsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwsICdoZWlnaHQnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2l6ZSwgW3tuYW1lOiAnaGVpZ2h0JywgdmFsdWU6IDIwMH1dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgcmFuZ2VTdGVwIGlmIGF4aXMgaXMgbm90IG1hcHBlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHt9LFxuICAgICAgICBjb25maWc6IHtzY2FsZToge3JhbmdlU3RlcDogMTd9fVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzaXplID0gc2l6ZVNpZ25hbHMobW9kZWwsICd3aWR0aCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzaXplLCBbe25hbWU6ICd3aWR0aCcsIHZhbHVlOiAxN31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRleHRYUmFuZ2VTdGVwIGlmIGF4aXMgaXMgbm90IG1hcHBlZCBmb3IgWCBvZiB0ZXh0IG1hcmsnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIG1hcms6ICd0ZXh0JyxcbiAgICAgICAgZW5jb2Rpbmc6IHt9LFxuICAgICAgICBjb25maWc6IHtzY2FsZToge3RleHRYUmFuZ2VTdGVwOiA5MX19XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHNpemUgPSBzaXplU2lnbmFscyhtb2RlbCwgJ3dpZHRoJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNpemUsIFt7bmFtZTogJ3dpZHRoJywgdmFsdWU6IDkxfV0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/layoutsize/parse.test.d.ts b/build/test/compile/layoutsize/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/layoutsize/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/layoutsize/parse.test.js b/build/test/compile/layoutsize/parse.test.js new file mode 100644 index 0000000000..695f83dd9b --- /dev/null +++ b/build/test/compile/layoutsize/parse.test.js @@ -0,0 +1,82 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var util_1 = require("../../util"); +describe('compile/layout', function () { + describe('parseUnitLayoutSize', function () { + it('should have width, height = provided top-level width, height', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + width: 123, + height: 456, + mark: 'text', + encoding: {}, + config: { scale: { textXRangeStep: 91 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.explicit.width, 123); + chai_1.assert.deepEqual(model.component.layoutSize.explicit.height, 456); + }); + it('should have width = default textXRangeStep for text mark without x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'text', + encoding: {}, + config: { scale: { textXRangeStep: 91 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.width, 91); + }); + it('should have width/height = config.scale.rangeStep for non-text mark without x,y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: {}, + config: { scale: { rangeStep: 23 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.width, 23); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.height, 23); + }); + it('should have width/height = config.view.width/height for non-ordinal x,y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + y: { field: 'b', type: 'quantitative' } + }, + config: { view: { width: 123, height: 456 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.width, 123); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.height, 456); + }); + it('should have width/height = config.view.width/height for geoshape', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'geoshape', + encoding: {}, + config: { view: { width: 123, height: 456 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.width, 123); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.height, 456); + }); + it('should have width/height = config.view.width/height for non-ordinal x,y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal', scale: { rangeStep: null } }, + y: { field: 'b', type: 'ordinal', scale: { rangeStep: null } } + }, + config: { view: { width: 123, height: 456 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.width, 123); + chai_1.assert.deepEqual(model.component.layoutSize.implicit.height, 456); + }); + it('should have width/height = undefined for non-ordinal x,y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' }, + y: { field: 'b', type: 'ordinal' } + }, + config: { view: { width: 123, height: 456 } } + }); + chai_1.assert.deepEqual(model.component.layoutSize.get('width'), 'range-step'); + chai_1.assert.deepEqual(model.component.layoutSize.get('height'), 'range-step'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9sYXlvdXRzaXplL3BhcnNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsbUNBQWdFO0FBRWhFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtJQUN4QixRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLDhEQUE4RCxFQUFFO1lBQ2pFLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO2dCQUNqRCxLQUFLLEVBQUUsR0FBRztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsRUFBRTtnQkFDWixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxjQUFjLEVBQUUsRUFBRSxFQUFDLEVBQUM7YUFDdEMsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2pFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxvRUFBb0UsRUFBRTtZQUN2RSxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztnQkFDakQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsY0FBYyxFQUFFLEVBQUUsRUFBQyxFQUFDO2FBQ3RDLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssRUFB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VUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3BFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFO1lBQzdELElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO2dCQUNqRCxJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO29CQUNoQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7aUJBQ2pDO2dCQUNELE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBQyxFQUFDO2FBQzFDLENBQUMsQ0FBQztZQUVILGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3hFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvbGF5b3V0JywgKCkgPT4ge1xuICAgZGVzY3JpYmUoJ3BhcnNlVW5pdExheW91dFNpemUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBoYXZlIHdpZHRoLCBoZWlnaHQgPSBwcm92aWRlZCB0b3AtbGV2ZWwgd2lkdGgsIGhlaWdodCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgd2lkdGg6IDEyMyxcbiAgICAgICAgaGVpZ2h0OiA0NTYsXG4gICAgICAgIG1hcms6ICd0ZXh0JyxcbiAgICAgICAgZW5jb2Rpbmc6IHt9LFxuICAgICAgICBjb25maWc6IHtzY2FsZToge3RleHRYUmFuZ2VTdGVwOiA5MX19XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZS5leHBsaWNpdC53aWR0aCwgMTIzKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuZXhwbGljaXQuaGVpZ2h0LCA0NTYpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHdpZHRoID0gZGVmYXVsdCB0ZXh0WFJhbmdlU3RlcCBmb3IgdGV4dCBtYXJrIHdpdGhvdXQgeCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3RleHQnLFxuICAgICAgICBlbmNvZGluZzoge30sXG4gICAgICAgIGNvbmZpZzoge3NjYWxlOiB7dGV4dFhSYW5nZVN0ZXA6IDkxfX1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmltcGxpY2l0LndpZHRoLCA5MSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgd2lkdGgvaGVpZ2h0ID0gY29uZmlnLnNjYWxlLnJhbmdlU3RlcCAgZm9yIG5vbi10ZXh0IG1hcmsgd2l0aG91dCB4LHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7fSxcbiAgICAgICAgY29uZmlnOiB7c2NhbGU6IHtyYW5nZVN0ZXA6IDIzfX1cbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmltcGxpY2l0LndpZHRoLCAyMyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmltcGxpY2l0LmhlaWdodCwgMjMpO1xuICAgIH0pO1xuXG4gICAgIGl0KCdzaG91bGQgaGF2ZSB3aWR0aC9oZWlnaHQgPSBjb25maWcudmlldy53aWR0aC9oZWlnaHQgZm9yIG5vbi1vcmRpbmFsIHgseScsICgpID0+IHtcbiAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgfSxcbiAgICAgICAgIGNvbmZpZzoge3ZpZXc6IHt3aWR0aDogMTIzLCBoZWlnaHQ6IDQ1Nn19XG4gICAgICAgfSk7XG5cbiAgICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmltcGxpY2l0LndpZHRoLCAxMjMpO1xuICAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuaW1wbGljaXQuaGVpZ2h0LCA0NTYpO1xuICAgICB9KTtcblxuICAgICBpdCgnc2hvdWxkIGhhdmUgd2lkdGgvaGVpZ2h0ID0gY29uZmlnLnZpZXcud2lkdGgvaGVpZ2h0IGZvciBnZW9zaGFwZScsICgpID0+IHtcbiAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgICBtYXJrOiAnZ2Vvc2hhcGUnLFxuICAgICAgICAgZW5jb2Rpbmc6IHt9LFxuICAgICAgICAgY29uZmlnOiB7dmlldzoge3dpZHRoOiAxMjMsIGhlaWdodDogNDU2fX1cbiAgICAgICB9KTtcblxuICAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuaW1wbGljaXQud2lkdGgsIDEyMyk7XG4gICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZS5pbXBsaWNpdC5oZWlnaHQsIDQ1Nik7XG4gICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHdpZHRoL2hlaWdodCA9IGNvbmZpZy52aWV3LndpZHRoL2hlaWdodCBmb3Igbm9uLW9yZGluYWwgeCx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNjYWxlOiB7cmFuZ2VTdGVwOiBudWxsfX0sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6ICdvcmRpbmFsJywgc2NhbGU6IHtyYW5nZVN0ZXA6IG51bGx9fVxuICAgICAgICB9LFxuICAgICAgICBjb25maWc6IHt2aWV3OiB7d2lkdGg6IDEyMywgaGVpZ2h0OiA0NTZ9fVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuaW1wbGljaXQud2lkdGgsIDEyMyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmltcGxpY2l0LmhlaWdodCwgNDU2KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB3aWR0aC9oZWlnaHQgPSB1bmRlZmluZWQgZm9yIG5vbi1vcmRpbmFsIHgseScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfSxcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdiJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICB9LFxuICAgICAgICBjb25maWc6IHt2aWV3OiB7d2lkdGg6IDEyMywgaGVpZ2h0OiA0NTZ9fVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LmxheW91dFNpemUuZ2V0KCd3aWR0aCcpLCAncmFuZ2Utc3RlcCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZS5nZXQoJ2hlaWdodCcpLCAncmFuZ2Utc3RlcCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/legend/assemble.test.d.ts b/build/test/compile/legend/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/legend/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/legend/assemble.test.js b/build/test/compile/legend/assemble.test.js new file mode 100644 index 0000000000..e756e6d6a5 --- /dev/null +++ b/build/test/compile/legend/assemble.test.js @@ -0,0 +1,47 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var util_1 = require("../../util"); +describe('legend/assemble', function () { + it('merges legend of the same field with the default type.', function () { + var model = util_1.parseUnitModelWithScale({ + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "description": "A scatterplot showing horsepower and miles per gallons.", + "data": { "url": "data/cars.json" }, + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" }, + "shape": { "field": "Origin", "type": "nominal" } + } + }); + model.parseLegend(); + var legends = model.assembleLegends(); + chai_1.assert.equal(legends.length, 1); + chai_1.assert.equal(legends[0].title, 'Origin'); + chai_1.assert.equal(legends[0].stroke, 'color'); + chai_1.assert.equal(legends[0].shape, 'shape'); + }); + it('merges legend of the same field and favor symbol legend over gradient', function () { + var model = util_1.parseUnitModelWithScale({ + "data": { "values": [{ "a": "A", "b": 28 }, { "a": "B", "b": 55 }] }, + "mark": "bar", + "encoding": { + "x": { "field": "a", "type": "ordinal" }, + "y": { "field": "b", "type": "quantitative" }, + "color": { "field": "b", "type": "quantitative" }, + "size": { "field": "b", "type": "quantitative" } + } + }); + model.parseLegend(); + var legends = model.assembleLegends(); + chai_1.assert.equal(legends.length, 1); + chai_1.assert.equal(legends[0].title, 'b'); + chai_1.assert.equal(legends[0].type, 'symbol'); + chai_1.assert.equal(legends[0].fill, 'color'); + chai_1.assert.equal(legends[0].size, 'size'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9sZWdlbmQvYXNzZW1ibGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOztBQUU5Qiw2QkFBNEI7QUFDNUIsbUNBQW1EO0FBR25ELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtJQUMxQixFQUFFLENBQUMsd0RBQXdELEVBQUU7UUFDM0QsSUFBTSxLQUFLLEdBQUcsOEJBQXVCLENBQUM7WUFDcEMsU0FBUyxFQUFFLGlEQUFpRDtZQUM1RCxhQUFhLEVBQUUseURBQXlEO1lBQ3hFLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztZQUNqQyxNQUFNLEVBQUUsT0FBTztZQUNmLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7Z0JBQ3BELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMxRCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7Z0JBQy9DLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQzthQUNoRDtTQUNGLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQixJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRWhDLGFBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN6QyxhQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsYUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFDLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1FBQzFFLElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO1lBQ3BDLE1BQU0sRUFBRSxFQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFDLEVBQUMsRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUMsQ0FBQyxFQUFDO1lBQzNELE1BQU0sRUFBRSxLQUFLO1lBQ2IsVUFBVSxFQUFFO2dCQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQztnQkFDckMsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMxQyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7Z0JBQzlDLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQzthQUM5QztTQUNGLENBQUMsQ0FBQztRQUVILEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQixJQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLGFBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNwQyxhQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLGFBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5cbmRlc2NyaWJlKCdsZWdlbmQvYXNzZW1ibGUnLCAoKSA9PiB7XG4gIGl0KCdtZXJnZXMgbGVnZW5kIG9mIHRoZSBzYW1lIGZpZWxkIHdpdGggdGhlIGRlZmF1bHQgdHlwZS4nLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICBcIiRzY2hlbWFcIjogXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuanNvblwiLFxuICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgc2NhdHRlcnBsb3Qgc2hvd2luZyBob3JzZXBvd2VyIGFuZCBtaWxlcyBwZXIgZ2FsbG9ucy5cIixcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2NhcnMuanNvblwifSxcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk1pbGVzX3Blcl9HYWxsb25cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwic2hhcGVcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIG1vZGVsLnBhcnNlTGVnZW5kKCk7XG5cbiAgICBjb25zdCBsZWdlbmRzID0gbW9kZWwuYXNzZW1ibGVMZWdlbmRzKCk7XG4gICAgYXNzZXJ0LmVxdWFsKGxlZ2VuZHMubGVuZ3RoLCAxKTtcblxuICAgIGFzc2VydC5lcXVhbChsZWdlbmRzWzBdLnRpdGxlLCAnT3JpZ2luJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGxlZ2VuZHNbMF0uc3Ryb2tlLCAnY29sb3InKTtcbiAgICBhc3NlcnQuZXF1YWwobGVnZW5kc1swXS5zaGFwZSwgJ3NoYXBlJyk7XG4gIH0pO1xuXG4gIGl0KCdtZXJnZXMgbGVnZW5kIG9mIHRoZSBzYW1lIGZpZWxkIGFuZCBmYXZvciBzeW1ib2wgbGVnZW5kIG92ZXIgZ3JhZGllbnQnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICBcImRhdGFcIjoge1widmFsdWVzXCI6IFt7XCJhXCI6IFwiQVwiLFwiYlwiOiAyOH0se1wiYVwiOiBcIkJcIixcImJcIjogNTV9XX0sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYlwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcImJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwic2l6ZVwiOiB7XCJmaWVsZFwiOiBcImJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGVsLnBhcnNlTGVnZW5kKCk7XG5cbiAgICBjb25zdCBsZWdlbmRzID0gbW9kZWwuYXNzZW1ibGVMZWdlbmRzKCk7XG4gICAgYXNzZXJ0LmVxdWFsKGxlZ2VuZHMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwobGVnZW5kc1swXS50aXRsZSwgJ2InKTtcbiAgICBhc3NlcnQuZXF1YWwobGVnZW5kc1swXS50eXBlLCAnc3ltYm9sJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGxlZ2VuZHNbMF0uZmlsbCwgJ2NvbG9yJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGxlZ2VuZHNbMF0uc2l6ZSwgJ3NpemUnKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/legend/encode.test.d.ts b/build/test/compile/legend/encode.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/legend/encode.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/legend/encode.test.js b/build/test/compile/legend/encode.test.js new file mode 100644 index 0000000000..9037936943 --- /dev/null +++ b/build/test/compile/legend/encode.test.js @@ -0,0 +1,98 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var encode = tslib_1.__importStar(require("../../../src/compile/legend/encode")); +var timeunit_1 = require("../../../src/timeunit"); +var type_1 = require("../../../src/type"); +var util_1 = require("../../util"); +describe('compile/legend', function () { + describe('encode.symbols', function () { + it('should not have fill, strokeDash, or strokeDashOffset', function () { + var symbol = encode.symbols({ field: 'a', type: 'nominal' }, {}, util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + color: { field: "a", type: "nominal" } + } + }), channel_1.COLOR, 'symbol'); + chai_1.assert.deepEqual(symbol.fill, { value: 'transparent' }); + chai_1.assert.isUndefined((symbol || {}).strokeDash); + chai_1.assert.isUndefined((symbol || {}).strokeDashOffset); + }); + it('should return specific symbols.shape.value if user has specified', function () { + var symbol = encode.symbols({ field: 'a', type: 'nominal' }, {}, util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + shape: { value: "square" } + } + }), channel_1.COLOR, 'symbol'); + chai_1.assert.deepEqual(symbol.shape['value'], 'square'); + }); + it('should have default opacity', function () { + var symbol = encode.symbols({ field: 'a', type: 'nominal' }, {}, util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" } + } + }), channel_1.COLOR, 'symbol'); + chai_1.assert.deepEqual(symbol.opacity['value'], 0.7); // default opacity is 0.7. + }); + it('should return the maximum value when there is a condition', function () { + var symbol = encode.symbols({ field: 'a', type: 'nominal' }, {}, util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + opacity: { + condition: { selection: "brush", value: 1 }, + value: 0 + } + } + }), channel_1.COLOR, 'symbol'); + chai_1.assert.deepEqual(symbol.opacity['value'], 1); + }); + }); + describe('encode.gradient', function () { + it('should have default opacity', function () { + var gradient = encode.gradient({ field: 'a', type: 'quantitative' }, {}, util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "quantitative" } + } + }), channel_1.COLOR, 'gradient'); + chai_1.assert.deepEqual(gradient.opacity['value'], 0.7); // default opacity is 0.7. + }); + }); + describe('encode.labels', function () { + it('should return correct expression for the timeUnit: TimeUnit.MONTH', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal" }, + color: { field: "a", type: "temporal", timeUnit: "month" } + } + }); + var fieldDef = { field: 'a', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.MONTH }; + var label = encode.labels(fieldDef, {}, model, channel_1.COLOR, 'gradient'); + var expected = "timeFormat(datum.value, '%b')"; + chai_1.assert.deepEqual(label.text.signal, expected); + }); + it('should return correct expression for the timeUnit: TimeUnit.QUARTER', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "temporal" }, + color: { field: "a", type: "temporal", timeUnit: "quarter" } + } + }); + var fieldDef = { field: 'a', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.QUARTER }; + var label = encode.labels(fieldDef, {}, model, channel_1.COLOR, 'gradient'); + var expected = "'Q' + quarter(datum.value)"; + chai_1.assert.deepEqual(label.text.signal, expected); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvbGVnZW5kL2VuY29kZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsZ0RBQTJDO0FBQzNDLGlGQUE2RDtBQUM3RCxrREFBK0M7QUFDL0MsMENBQTJDO0FBQzNDLG1DQUFtRDtBQUVuRCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7SUFDekIsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLEVBQUUsQ0FBQyx1REFBdUQsRUFBRTtZQUUxRCxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDLEVBQUUsRUFBRSxFQUFFLDhCQUF1QixDQUFDO2dCQUNyRixJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO29CQUNoQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7aUJBQ3JDO2FBQ0YsQ0FBQyxFQUFFLGVBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNyQixhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQztZQUN0RCxhQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxJQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVDLGFBQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLElBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxrRUFB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LG1CQUFRLENBQUMsT0FBTyxFQUFDLENBQUM7WUFDMUUsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxlQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDcEUsSUFBTSxRQUFRLEdBQUcsNEJBQTRCLENBQUM7WUFDOUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtDT0xPUn0gZnJvbSAnLi4vLi4vLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0ICogYXMgZW5jb2RlIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2xlZ2VuZC9lbmNvZGUnO1xuaW1wb3J0IHtUaW1lVW5pdH0gZnJvbSAnLi4vLi4vLi4vc3JjL3RpbWV1bml0JztcbmltcG9ydCB7VEVNUE9SQUx9IGZyb20gJy4uLy4uLy4uL3NyYy90eXBlJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9sZWdlbmQnLCBmdW5jdGlvbigpIHtcbiAgZGVzY3JpYmUoJ2VuY29kZS5zeW1ib2xzJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCBub3QgaGF2ZSBmaWxsLCBzdHJva2VEYXNoLCBvciBzdHJva2VEYXNoT2Zmc2V0JywgZnVuY3Rpb24oKSB7XG5cbiAgICAgIGNvbnN0IHN5bWJvbCA9IGVuY29kZS5zeW1ib2xzKHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCB7fSwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgY29sb3I6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICAgIH1cbiAgICAgICAgfSksIENPTE9SLCAnc3ltYm9sJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoc3ltYm9sLmZpbGwsIHt2YWx1ZTogJ3RyYW5zcGFyZW50J30pO1xuICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQoKHN5bWJvbHx8e30pLnN0cm9rZURhc2gpO1xuICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQoKHN5bWJvbHx8e30pLnN0cm9rZURhc2hPZmZzZXQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3BlY2lmaWMgc3ltYm9scy5zaGFwZS52YWx1ZSBpZiB1c2VyIGhhcyBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHtcblxuICAgICAgY29uc3Qgc3ltYm9sID0gZW5jb2RlLnN5bWJvbHMoe2ZpZWxkOiAnYScsIHR5cGU6ICdub21pbmFsJ30sIHt9LCBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6IFwiYVwiLCB0eXBlOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBzaGFwZToge3ZhbHVlOiBcInNxdWFyZVwifX1cbiAgICAgICAgfSksIENPTE9SLCAnc3ltYm9sJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoc3ltYm9sLnNoYXBlWyd2YWx1ZSddLCAnc3F1YXJlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgZGVmYXVsdCBvcGFjaXR5JywgZnVuY3Rpb24oKSB7XG5cbiAgICAgIGNvbnN0IHN5bWJvbCA9IGVuY29kZS5zeW1ib2xzKHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCB7fSwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJub21pbmFsXCJ9fVxuICAgICAgICB9KSwgQ09MT1IsICdzeW1ib2wnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc3ltYm9sLm9wYWNpdHlbJ3ZhbHVlJ10sIDAuNyk7IC8vIGRlZmF1bHQgb3BhY2l0eSBpcyAwLjcuXG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgbWF4aW11bSB2YWx1ZSB3aGVuIHRoZXJlIGlzIGEgY29uZGl0aW9uJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgIGNvbnN0IHN5bWJvbCA9IGVuY29kZS5zeW1ib2xzKHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCB7fSwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgb3BhY2l0eToge1xuICAgICAgICAgICAgICBjb25kaXRpb246IHtzZWxlY3Rpb246IFwiYnJ1c2hcIiwgdmFsdWU6IDF9LFxuICAgICAgICAgICAgICB2YWx1ZTogMFxuICAgICAgICAgICAgfX1cbiAgICAgICAgfSksIENPTE9SLCAnc3ltYm9sJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoc3ltYm9sLm9wYWNpdHlbJ3ZhbHVlJ10sIDEpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZW5jb2RlLmdyYWRpZW50JywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCBoYXZlIGRlZmF1bHQgb3BhY2l0eScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZ3JhZGllbnQgPSBlbmNvZGUuZ3JhZGllbnQoe2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwge30sIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9fVxuICAgICAgICB9KSwgQ09MT1IsICdncmFkaWVudCcpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGdyYWRpZW50Lm9wYWNpdHlbJ3ZhbHVlJ10sIDAuNyk7IC8vIGRlZmF1bHQgb3BhY2l0eSBpcyAwLjcuXG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbmNvZGUubGFiZWxzJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBleHByZXNzaW9uIGZvciB0aGUgdGltZVVuaXQ6IFRpbWVVbml0Lk1PTlRIJywgZnVuY3Rpb24oKSB7XG5cbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICBjb2xvcjoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJ0ZW1wb3JhbFwiLCB0aW1lVW5pdDogXCJtb250aFwifVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmllbGREZWYgPSB7ZmllbGQ6ICdhJywgdHlwZTogVEVNUE9SQUwsIHRpbWVVbml0OiBUaW1lVW5pdC5NT05USH07XG4gICAgICBjb25zdCBsYWJlbCA9IGVuY29kZS5sYWJlbHMoZmllbGREZWYsIHt9LCBtb2RlbCwgQ09MT1IsICdncmFkaWVudCcpO1xuICAgICAgY29uc3QgZXhwZWN0ZWQgPSBgdGltZUZvcm1hdChkYXR1bS52YWx1ZSwgJyViJylgO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChsYWJlbC50ZXh0LnNpZ25hbCwgZXhwZWN0ZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBleHByZXNzaW9uIGZvciB0aGUgdGltZVVuaXQ6IFRpbWVVbml0LlFVQVJURVInLCBmdW5jdGlvbigpIHtcblxuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6IFwiYVwiLCB0eXBlOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6IFwiYVwiLCB0eXBlOiBcInRlbXBvcmFsXCIsIHRpbWVVbml0OiBcInF1YXJ0ZXJcIn19XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZmllbGREZWYgPSB7ZmllbGQ6ICdhJywgdHlwZTogVEVNUE9SQUwsIHRpbWVVbml0OiBUaW1lVW5pdC5RVUFSVEVSfTtcbiAgICAgIGNvbnN0IGxhYmVsID0gZW5jb2RlLmxhYmVscyhmaWVsZERlZiwge30sIG1vZGVsLCBDT0xPUiwgJ2dyYWRpZW50Jyk7XG4gICAgICBjb25zdCBleHBlY3RlZCA9IGAnUScgKyBxdWFydGVyKGRhdHVtLnZhbHVlKWA7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGxhYmVsLnRleHQuc2lnbmFsLCBleHBlY3RlZCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/legend/parse.test.d.ts b/build/test/compile/legend/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/legend/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/legend/parse.test.js b/build/test/compile/legend/parse.test.js new file mode 100644 index 0000000000..a1c61d6c3e --- /dev/null +++ b/build/test/compile/legend/parse.test.js @@ -0,0 +1,176 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var legendParse = tslib_1.__importStar(require("../../../src/compile/legend/parse")); +var parse_1 = require("../../../src/compile/legend/parse"); +var fielddef_1 = require("../../../src/fielddef"); +var type_1 = require("../../../src/type"); +var util_1 = require("../../util"); +describe('compile/legend', function () { + describe('parseUnitLegend()', function () { + it("should not produce a Vega legend object on channel 'shape' with type 'geojson'", function () { + var spec = { + "mark": "geoshape", + "data": { "url": "data/income.json" }, + "transform": [ + { + "lookup": "id", + "from": { + "data": { + "url": "data/us-10m.json", + "format": { "type": "topojson", "feature": "states" } + }, + "key": "id" + }, + "as": "geo" + } + ], + "encoding": { + "shape": { "field": "geo", "type": "geojson" } + } + }; + var unitModel = util_1.parseUnitModelWithScale(spec); + var channelDef = unitModel.encoding[channel_1.SHAPE]; + chai_1.assert.isTrue(fielddef_1.isFieldDef(channelDef)); + if (fielddef_1.isFieldDef(channelDef)) { + chai_1.assert.equal(channelDef.type, type_1.GEOJSON); + } + parse_1.parseLegend(unitModel); + var legendComp = unitModel.component.legends; + chai_1.assert.isUndefined(legendComp[channel_1.SHAPE]); + }); + }); + describe('parseLegendForChannel()', function () { + it('should produce a Vega legend object with correct type and scale for color', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + color: { field: "a", type: "quantitative" } + } + }); + var def = legendParse.parseLegendForChannel(model, channel_1.COLOR).combine(); + chai_1.assert.isObject(def); + chai_1.assert.equal(def.title, 'a'); + chai_1.assert.equal(def.stroke, 'color'); + chai_1.assert.equal(def.type, 'gradient'); + }); + it('should produce no legend title when title is null, "", or false', function () { + for (var _i = 0, _a = [null, '', false]; _i < _a.length; _i++) { + var val = _a[_i]; + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + color: { + field: "a", type: "quantitative", + legend: { title: val } // Need to cast as false is not valid, but we want to fall back gracefully + } + } + }); + var def = legendParse.parseLegendForChannel(model, channel_1.COLOR).combine(); + chai_1.assert.doesNotHaveAnyKeys(def, ['title']); + } + }); + it('should store fieldDef.title as explicit', function () { + var model = util_1.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: "a", type: "nominal" }, + color: { + field: "a", type: "quantitative", + legend: { title: 'foo' } // Need to cast as false is not valid, but we want to fall back gracefully + } + } + }); + var def = legendParse.parseLegendForChannel(model, channel_1.COLOR).combine(); + chai_1.assert.equal(def.title, 'foo'); + }); + [channel_1.SIZE, channel_1.SHAPE, channel_1.OPACITY].forEach(function (channel) { + it("should produce a Vega legend object with correct type and scale for " + channel, function () { + var spec = { + mark: "point", + encoding: { + x: { field: "a", type: "nominal" } + } + }; + spec.encoding[channel] = { field: "a", type: "nominal" }; + var model = util_1.parseUnitModelWithScale(spec); + var def = legendParse.parseLegendForChannel(model, channel).combine(); + var channelDef = model.encoding[channel]; + if (fielddef_1.isFieldDef(channelDef)) { + chai_1.assert.notEqual(channelDef.type, type_1.GEOJSON); + } + if (channel !== channel_1.OPACITY) { + chai_1.assert.equal(def.encode.symbols.update.opacity.value, 0.7); + } + else { + chai_1.assert.isUndefined(def.encode.symbols.update.opacity); + } + chai_1.assert.isObject(def); + chai_1.assert.equal(def.title, "a"); + }); + }); + }); + describe('parseNonUnitLegend()', function () { + it('should correctly merge orient by favoring explicit orient', function () { + var model = util_1.parseLayerModel({ + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "description": "Google's stock price over time.", + "data": { "url": "data/stocks.csv" }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + } + }, { + "mark": { "type": "point", "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal", "legend": { "orient": "left" } } + } + } + ] + }); + model.parseScale(); + model.parseLegend(); + chai_1.assert.equal(model.component.legends.color.explicit.orient, 'left'); + }); + it('should correctly merge legend that exists only on one plot', function () { + var model = util_1.parseLayerModel({ + "$schema": "https://vega.github.io/schema/vega-lite/v2.json", + "description": "Google's stock price over time.", + "data": { "url": "data/stocks.csv" }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, { + "mark": { "type": "point", "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + } + } + ] + }); + model.parseScale(); + model.parseLegend(); + chai_1.assert.isOk(model.component.legends.color); + chai_1.assert.isUndefined(model.children[0].component.legends.color); + chai_1.assert.isUndefined(model.children[1].component.legends.color); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9sZWdlbmQvcGFyc2UudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLGdEQUFpRTtBQUNqRSxxRkFBaUU7QUFDakUsMkRBQThEO0FBQzlELGtEQUFpRDtBQUVqRCwwQ0FBMEM7QUFDMUMsbUNBQW9FO0FBRXBFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtJQUN6QixRQUFRLENBQUMsbUJBQW1CLEVBQUU7UUFDNUIsRUFBRSxDQUFDLGdGQUFnRixFQUFFO1lBQ25GLElBQU0sSUFBSSxHQUF1QjtnQkFDL0IsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBQztnQkFDbkMsV0FBVyxFQUFFO29CQUNYO3dCQUNFLFFBQVEsRUFBRSxJQUFJO3dCQUNkLE1BQU0sRUFBRTs0QkFDTixNQUFNLEVBQUU7Z0NBQ04sS0FBSyxFQUFFLGtCQUFrQjtnQ0FDekIsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDOzZCQUNwRDs0QkFDRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRCxJQUFJLEVBQUUsS0FBSztxQkFDWjtpQkFDRjtnQkFDRCxVQUFVLEVBQUU7b0JBQ1YsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO2lCQUM3QzthQUNGLENBQUM7WUFFRixJQUFNLFNBQVMsR0FBRyw4QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRCxJQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQUssQ0FBQyxDQUFDO1lBQzdDLGFBQU0sQ0FBQyxNQUFNLENBQUMscUJBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3RD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LEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQzt5QkFDaEQ7cUJBQ0Y7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFDSCxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BCLGFBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0MsYUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsYUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7Q09MT1IsIE9QQUNJVFksIFNIQVBFLCBTSVpFfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsZWdlbmRQYXJzZSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9sZWdlbmQvcGFyc2UnO1xuaW1wb3J0IHtwYXJzZUxlZ2VuZH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL3BhcnNlJztcbmltcG9ydCB7aXNGaWVsZERlZn0gZnJvbSAnLi4vLi4vLi4vc3JjL2ZpZWxkZGVmJztcbmltcG9ydCB7Tm9ybWFsaXplZFVuaXRTcGVjfSBmcm9tICcuLi8uLi8uLi9zcmMvc3BlYyc7XG5pbXBvcnQge0dFT0pTT059IGZyb20gJy4uLy4uLy4uL3NyYy90eXBlJztcbmltcG9ydCB7cGFyc2VMYXllck1vZGVsLCBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdjb21waWxlL2xlZ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3BhcnNlVW5pdExlZ2VuZCgpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KGBzaG91bGQgbm90IHByb2R1Y2UgYSBWZWdhIGxlZ2VuZCBvYmplY3Qgb24gY2hhbm5lbCAnc2hhcGUnIHdpdGggdHlwZSAnZ2VvanNvbidgLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzcGVjOiBOb3JtYWxpemVkVW5pdFNwZWMgPSB7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2luY29tZS5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsb29rdXBcIjogXCJpZFwiLFxuICAgICAgICAgICAgXCJmcm9tXCI6IHtcbiAgICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICAgICAgICBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwidG9wb2pzb25cIiwgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwia2V5XCI6IFwiaWRcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiYXNcIjogXCJnZW9cIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJzaGFwZVwiOiB7XCJmaWVsZFwiOiBcImdlb1wiLCBcInR5cGVcIjogXCJnZW9qc29uXCJ9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVuaXRNb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHNwZWMpO1xuICAgICAgY29uc3QgY2hhbm5lbERlZiA9IHVuaXRNb2RlbC5lbmNvZGluZ1tTSEFQRV07XG4gICAgICBhc3NlcnQuaXNUcnVlKGlzRmllbGREZWYoY2hhbm5lbERlZikpO1xuICAgICAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNoYW5uZWxEZWYudHlwZSwgR0VPSlNPTik7XG4gICAgICB9XG4gICAgICBwYXJzZUxlZ2VuZCh1bml0TW9kZWwpO1xuICAgICAgY29uc3QgbGVnZW5kQ29tcCA9IHVuaXRNb2RlbC5jb21wb25lbnQubGVnZW5kcztcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChsZWdlbmRDb21wW1NIQVBFXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUxlZ2VuZEZvckNoYW5uZWwoKScsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBhIFZlZ2EgbGVnZW5kIG9iamVjdCB3aXRoIGNvcnJlY3QgdHlwZSBhbmQgc2NhbGUgZm9yIGNvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwibm9taW5hbFwifSxcbiAgICAgICAgICBjb2xvcjoge2ZpZWxkOiBcImFcIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlZiA9IGxlZ2VuZFBhcnNlLnBhcnNlTGVnZW5kRm9yQ2hhbm5lbChtb2RlbCwgQ09MT1IpLmNvbWJpbmUoKTtcbiAgICAgIGFzc2VydC5pc09iamVjdChkZWYpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZi50aXRsZSwgJ2EnKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWYuc3Ryb2tlLCAnY29sb3InKTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWYudHlwZSwgJ2dyYWRpZW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2Ugbm8gbGVnZW5kIHRpdGxlIHdoZW4gdGl0bGUgaXMgbnVsbCwgXCJcIiwgb3IgZmFsc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbCBvZiBbbnVsbCwgJycsIGZhbHNlXSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwibm9taW5hbFwifSxcbiAgICAgICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgICAgIGZpZWxkOiBcImFcIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgbGVnZW5kOiB7dGl0bGU6IHZhbCBhcyBhbnl9IC8vIE5lZWQgdG8gY2FzdCBhcyBmYWxzZSBpcyBub3QgdmFsaWQsIGJ1dCB3ZSB3YW50IHRvIGZhbGwgYmFjayBncmFjZWZ1bGx5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWYgPSBsZWdlbmRQYXJzZS5wYXJzZUxlZ2VuZEZvckNoYW5uZWwobW9kZWwsIENPTE9SKS5jb21iaW5lKCk7XG4gICAgICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueUtleXMoZGVmLCBbJ3RpdGxlJ10pO1xuICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHN0b3JlIGZpZWxkRGVmLnRpdGxlIGFzIGV4cGxpY2l0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6IFwiYVwiLCB0eXBlOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgIGZpZWxkOiBcImFcIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIGxlZ2VuZDoge3RpdGxlOiAnZm9vJ30gLy8gTmVlZCB0byBjYXN0IGFzIGZhbHNlIGlzIG5vdCB2YWxpZCwgYnV0IHdlIHdhbnQgdG8gZmFsbCBiYWNrIGdyYWNlZnVsbHlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkZWYgPSBsZWdlbmRQYXJzZS5wYXJzZUxlZ2VuZEZvckNoYW5uZWwobW9kZWwsIENPTE9SKS5jb21iaW5lKCk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmLnRpdGxlLCAnZm9vJyk7XG4gICAgfSk7XG5cbiAgICBbU0laRSwgU0hBUEUsIE9QQUNJVFldLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICBpdChgc2hvdWxkIHByb2R1Y2UgYSBWZWdhIGxlZ2VuZCBvYmplY3Qgd2l0aCBjb3JyZWN0IHR5cGUgYW5kIHNjYWxlIGZvciAke2NoYW5uZWx9YCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IHNwZWM6IE5vcm1hbGl6ZWRVbml0U3BlYyA9IHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgc3BlYy5lbmNvZGluZ1tjaGFubmVsXSA9IHtmaWVsZDogXCJhXCIsIHR5cGU6IFwibm9taW5hbFwifTtcblxuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHNwZWMpO1xuXG4gICAgICAgIGNvbnN0IGRlZiA9IGxlZ2VuZFBhcnNlLnBhcnNlTGVnZW5kRm9yQ2hhbm5lbChtb2RlbCwgY2hhbm5lbCkuY29tYmluZSgpO1xuXG4gICAgICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBtb2RlbC5lbmNvZGluZ1tjaGFubmVsXTtcbiAgICAgICAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgICAgICBhc3NlcnQubm90RXF1YWwoY2hhbm5lbERlZi50eXBlLCBHRU9KU09OKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFubmVsICE9PSBPUEFDSVRZKSB7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKGRlZi5lbmNvZGUuc3ltYm9scy51cGRhdGUub3BhY2l0eS52YWx1ZSwgMC43KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQoZGVmLmVuY29kZS5zeW1ib2xzLnVwZGF0ZS5vcGFjaXR5KTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQuaXNPYmplY3QoZGVmKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRlZi50aXRsZSwgXCJhXCIpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZU5vblVuaXRMZWdlbmQoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvcnJlY3RseSBtZXJnZSBvcmllbnQgYnkgZmF2b3JpbmcgZXhwbGljaXQgb3JpZW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBcIiRzY2hlbWFcIjogXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuanNvblwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiR29vZ2xlJ3Mgc3RvY2sgcHJpY2Ugb3ZlciB0aW1lLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCJ9LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LHtcbiAgICAgICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6XCJwb2ludFwiLCBcImZpbGxlZFwiOiB0cnVlfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzeW1ib2xcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLCBcImxlZ2VuZFwiOiB7XCJvcmllbnRcIjogXCJsZWZ0XCJ9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gICAgICBtb2RlbC5wYXJzZUxlZ2VuZCgpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNvbXBvbmVudC5sZWdlbmRzLmNvbG9yLmV4cGxpY2l0Lm9yaWVudCwgJ2xlZnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IG1lcmdlIGxlZ2VuZCB0aGF0IGV4aXN0cyBvbmx5IG9uIG9uZSBwbG90JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBcIiRzY2hlbWFcIjogXCJodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3NjaGVtYS92ZWdhLWxpdGUvdjIuanNvblwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiR29vZ2xlJ3Mgc3RvY2sgcHJpY2Ugb3ZlciB0aW1lLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCJ9LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSx7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOlwicG9pbnRcIiwgXCJmaWxsZWRcIjogdHJ1ZX0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICAgICAgbW9kZWwucGFyc2VMZWdlbmQoKTtcbiAgICAgIGFzc2VydC5pc09rKG1vZGVsLmNvbXBvbmVudC5sZWdlbmRzLmNvbG9yKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChtb2RlbC5jaGlsZHJlblswXS5jb21wb25lbnQubGVnZW5kcy5jb2xvcik7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQobW9kZWwuY2hpbGRyZW5bMV0uY29tcG9uZW50LmxlZ2VuZHMuY29sb3IpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/legend/properties.test.d.ts b/build/test/compile/legend/properties.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/legend/properties.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/legend/properties.test.js b/build/test/compile/legend/properties.test.js new file mode 100644 index 0000000000..7137ab4f0c --- /dev/null +++ b/build/test/compile/legend/properties.test.js @@ -0,0 +1,49 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var properties = tslib_1.__importStar(require("../../../src/compile/legend/properties")); +describe('compile/legend', function () { + describe('values()', function () { + it('should return correct timestamp values for DateTimes', function () { + var values = properties.values({ values: [{ year: 1970 }, { year: 1980 }] }); + chai_1.assert.deepEqual(values, [ + { "signal": "datetime(1970, 0, 1, 0, 0, 0, 0)" }, + { "signal": "datetime(1980, 0, 1, 0, 0, 0, 0)" }, + ]); + }); + it('should simply return values for non-DateTime', function () { + var values = properties.values({ values: [1, 2, 3, 4] }); + chai_1.assert.deepEqual(values, [1, 2, 3, 4]); + }); + }); + describe('type()', function () { + it('should return gradient type for color scale', function () { + var t = properties.type('quantitative', channel_1.COLOR, 'sequential'); + chai_1.assert.equal(t, 'gradient'); + }); + it('should not return gradient type for size scale', function () { + var t = properties.type('quantitative', channel_1.SIZE, 'linear'); + chai_1.assert.equal(t, undefined); + }); + it('should return no type for color scale with bin', function () { + var t = properties.type('quantitative', channel_1.COLOR, 'bin-ordinal'); + chai_1.assert.equal(t, undefined); + }); + it('should return gradient type for color scale with time scale', function () { + var t = properties.type('temporal', channel_1.COLOR, 'time'); + chai_1.assert.equal(t, 'gradient'); + }); + it('should return no type for color scale with ordinal scale and temporal type', function () { + var t = properties.type('temporal', channel_1.COLOR, 'ordinal'); + chai_1.assert.equal(t, undefined); + }); + it('should return no type for color scale with ordinal scale and ordinal type', function () { + var t = properties.type('ordinal', channel_1.COLOR, 'ordinal'); + chai_1.assert.equal(t, undefined); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL2xlZ2VuZC9wcm9wZXJ0aWVzLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUM1QixnREFBaUQ7QUFDakQseUZBQXFFO0FBRXJFLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtJQUN6QixRQUFRLENBQUMsVUFBVSxFQUFFO1FBQ25CLEVBQUUsQ0FBQyxzREFBc0QsRUFBRTtZQUN6RCxJQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUMsTUFBTSxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsRUFBQyxDQUFDLENBQUM7WUFFekUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3ZCLEVBQUMsUUFBUSxFQUFFLGtDQUFrQyxFQUFDO2dCQUM5QyxFQUFDLFFBQVEsRUFBRSxrQ0FBa0MsRUFBQzthQUMvQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxJQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBRXRELGFBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFFBQVEsRUFBRTtRQUNqQixFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsSUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsZUFBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9ELGFBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFO1lBQ25ELElBQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLGNBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMxRCxhQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxJQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxlQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDaEUsYUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNkRBQTZELEVBQUU7WUFDaEUsSUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZUFBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3JELGFBQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzlCLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRFQUE0RSxFQUFFO1lBQy9FLElBQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLGVBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4RCxhQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyRUFBMkUsRUFBRTtZQUM5RSxJQUFNLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdkQsYUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7Q09MT1IsIFNJWkV9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCAqIGFzIHByb3BlcnRpZXMgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL3Byb3BlcnRpZXMnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9sZWdlbmQnLCBmdW5jdGlvbigpIHtcbiAgZGVzY3JpYmUoJ3ZhbHVlcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGltZXN0YW1wIHZhbHVlcyBmb3IgRGF0ZVRpbWVzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWVzID0gcHJvcGVydGllcy52YWx1ZXMoe3ZhbHVlczogW3t5ZWFyOiAxOTcwfSwge3llYXI6IDE5ODB9XX0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcywgW1xuICAgICAgICB7XCJzaWduYWxcIjogXCJkYXRldGltZSgxOTcwLCAwLCAxLCAwLCAwLCAwLCAwKVwifSxcbiAgICAgICAge1wic2lnbmFsXCI6IFwiZGF0ZXRpbWUoMTk4MCwgMCwgMSwgMCwgMCwgMCwgMClcIn0sXG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2ltcGx5IHJldHVybiB2YWx1ZXMgZm9yIG5vbi1EYXRlVGltZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHByb3BlcnRpZXMudmFsdWVzKHt2YWx1ZXM6IFsxLDIsMyw0XX0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZhbHVlcywgWzEsMiwzLDRdKTtcbiAgICB9KTtcblxuICB9KTtcblxuICBkZXNjcmliZSgndHlwZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGdyYWRpZW50IHR5cGUgZm9yIGNvbG9yIHNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgdCA9IHByb3BlcnRpZXMudHlwZSgncXVhbnRpdGF0aXZlJywgQ09MT1IsICdzZXF1ZW50aWFsJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodCwgJ2dyYWRpZW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZXR1cm4gZ3JhZGllbnQgdHlwZSBmb3Igc2l6ZSBzY2FsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBwcm9wZXJ0aWVzLnR5cGUoJ3F1YW50aXRhdGl2ZScsIFNJWkUsICdsaW5lYXInKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbm8gdHlwZSBmb3IgY29sb3Igc2NhbGUgd2l0aCBiaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0ID0gcHJvcGVydGllcy50eXBlKCdxdWFudGl0YXRpdmUnLCBDT0xPUiwgJ2Jpbi1vcmRpbmFsJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodCwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGdyYWRpZW50IHR5cGUgZm9yIGNvbG9yIHNjYWxlIHdpdGggdGltZSBzY2FsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBwcm9wZXJ0aWVzLnR5cGUoJ3RlbXBvcmFsJywgQ09MT1IsICd0aW1lJyk7XG4gICAgICBhc3NlcnQuZXF1YWwodCwgJ2dyYWRpZW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyB0eXBlIGZvciBjb2xvciBzY2FsZSB3aXRoIG9yZGluYWwgc2NhbGUgYW5kIHRlbXBvcmFsIHR5cGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0ID0gcHJvcGVydGllcy50eXBlKCd0ZW1wb3JhbCcsIENPTE9SLCAnb3JkaW5hbCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHQsIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyB0eXBlIGZvciBjb2xvciBzY2FsZSB3aXRoIG9yZGluYWwgc2NhbGUgYW5kIG9yZGluYWwgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHQgPSBwcm9wZXJ0aWVzLnR5cGUoJ29yZGluYWwnLCBDT0xPUiwgJ29yZGluYWwnKTtcbiAgICAgIGFzc2VydC5lcXVhbCh0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/area.test.d.ts b/build/test/compile/mark/area.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/area.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/area.test.js b/build/test/compile/mark/area.test.js new file mode 100644 index 0000000000..d10a76737f --- /dev/null +++ b/build/test/compile/mark/area.test.js @@ -0,0 +1,213 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var area_1 = require("../../../src/compile/mark/area"); +var util_1 = require("../../util"); +describe('Mark: Area', function () { + function verticalArea(moreEncoding) { + if (moreEncoding === void 0) { moreEncoding = {}; } + return { + "mark": "area", + "encoding": tslib_1.__assign({ "x": { "timeUnit": "year", "field": "Year", "type": "temporal" }, "y": { "aggregate": "count", "type": "quantitative" } }, moreEncoding), + "data": { "url": "data/cars.json" } + }; + } + describe('vertical area, with log', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "area", + "encoding": { + "x": { "bin": true, "type": "quantitative", "field": "IMDB_Rating" }, + "y": { "scale": { "type": 'log' }, "type": "quantitative", "field": 'US_Gross', "aggregate": "mean" } + }, + "data": { "url": 'data/movies.json' } + }); + var props = area_1.area.encodeEntry(model); + it('should end on axis', function () { + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + }); + it('should has no height', function () { + chai_1.assert.isUndefined(props.height); + }); + }); + describe('stacked vertical area, with binned dimension', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "area", + "encoding": { + "x": { "bin": true, "type": "quantitative", "field": "IMDB_Rating" }, + "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" }, + "color": { "type": "nominal", "field": 'c' } + }, + "data": { "url": 'data/movies.json' } + }); + var props = area_1.area.encodeEntry(model); + it('should use bin_mid for x', function () { + chai_1.assert.deepEqual(props.x, { field: 'bin_maxbins_10_IMDB_Rating_mid', scale: 'x' }); + }); + }); + describe('vertical area, with zero=false', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "area", + "encoding": { + "x": { "bin": true, "type": "quantitative", "field": "IMDB_Rating" }, + "y": { "scale": { "zero": false }, "type": "quantitative", "field": 'US_Gross', "aggregate": "mean" } + }, + "data": { "url": 'data/movies.json' } + }); + var props = area_1.area.encodeEntry(model); + it('should end on axis', function () { + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + }); + it('should has no height', function () { + chai_1.assert.isUndefined(props.height); + }); + }); + describe('vertical area', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(verticalArea()); + var props = area_1.area.encodeEntry(model); + it('should have scale for x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year_Year' }); + }); + it('should have scale for y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'count_*' }); + }); + it('should have the correct value for y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + }); + }); + describe('vertical area with binned dimension', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(verticalArea()); + var props = area_1.area.encodeEntry(model); + it('should have scale for x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year_Year' }); + }); + it('should have scale for y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'count_*' }); + }); + it('should have the correct value for y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + }); + }); + describe('vertical stacked area with color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(verticalArea({ + "color": { "field": "Origin", "type": "quantitative" } + })); + var props = area_1.area.encodeEntry(model); + it('should have the correct value for y and y2', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'count_*_end' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'count_*_start' }); + }); + it('should have correct orient', function () { + chai_1.assert.deepEqual(props.orient, { value: 'vertical' }); + }); + it('should have scale for color', function () { + chai_1.assert.deepEqual(props.fill, { scale: channel_1.COLOR, field: 'Origin' }); + }); + }); + function horizontalArea(moreEncoding) { + if (moreEncoding === void 0) { moreEncoding = {}; } + return { + "mark": "area", + "encoding": tslib_1.__assign({ "y": { "timeUnit": "year", "field": "Year", "type": "temporal" }, "x": { "aggregate": "count", "type": "quantitative" } }, moreEncoding), + "data": { "url": "data/cars.json" } + }; + } + describe('horizontal area', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(horizontalArea()); + var props = area_1.area.encodeEntry(model); + it('should have scale for y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'year_Year' }); + }); + it('should have scale for x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'count_*' }); + }); + it('should have the correct value for x2', function () { + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + }); + }); + describe('horizontal area, with log', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "area", + "encoding": { + "y": { "bin": true, "type": "quantitative", "field": "IMDB_Rating" }, + "x": { "scale": { "type": 'log' }, "type": "quantitative", "field": 'US_Gross', "aggregate": "mean" } + }, + "data": { "url": 'data/movies.json' } + }); + var props = area_1.area.encodeEntry(model); + it('should end on axis', function () { + chai_1.assert.deepEqual(props.x2, { value: 0 }); + }); + it('should have no width', function () { + chai_1.assert.isUndefined(props.width); + }); + }); + describe('horizontal area, with zero=false', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "area", + "encoding": { + "y": { "bin": true, "type": "quantitative", "field": "IMDB_Rating" }, + "x": { "scale": { "zero": false }, "type": "quantitative", "field": 'US_Gross', "aggregate": "mean" } + }, + "data": { "url": 'data/movies.json' } + }); + var props = area_1.area.encodeEntry(model); + it('should end on axis', function () { + chai_1.assert.deepEqual(props.x2, { value: 0 }); + }); + it('should have no width', function () { + chai_1.assert.isUndefined(props.width); + }); + }); + describe('horizontal stacked area with color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(horizontalArea({ + "color": { "field": "Origin", "type": "nominal" } + })); + var props = area_1.area.encodeEntry(model); + it('should have the correct value for x and x2', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'count_*_end' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'count_*_start' }); + }); + it('should have correct orient', function () { + chai_1.assert.deepEqual(props.orient, { value: 'horizontal' }); + }); + it('should have scale for color', function () { + chai_1.assert.deepEqual(props.fill, { scale: channel_1.COLOR, field: 'Origin' }); + }); + }); + describe('ranged area', function () { + it('vertical area should work with aggregate', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/cars.json" }, + "mark": "area", + "encoding": { + "x": { "timeUnit": "year", "field": "Year", "type": "temporal" }, + "y": { "aggregate": "min", "field": "Weight_in_lbs", "type": "quantitative" }, + "y2": { "aggregate": "max", "field": "Weight_in_lbs", "type": "quantitative" } + } + }); + var props = area_1.area.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'year_Year' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'min_Weight_in_lbs' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'max_Weight_in_lbs' }); + }); + it('horizontal area should work with aggregate', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/cars.json" }, + "mark": "area", + "encoding": { + "y": { "timeUnit": "year", "field": "Year", "type": "temporal" }, + "x": { "aggregate": "min", "field": "Weight_in_lbs", "type": "quantitative" }, + "x2": { "aggregate": "max", "field": "Weight_in_lbs", "type": "quantitative" } + } + }); + var props = area_1.area.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'year_Year' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'min_Weight_in_lbs' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'max_Weight_in_lbs' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJlYS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvYXJlYS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsZ0RBQWlEO0FBQ2pELHVEQUFvRDtBQUdwRCxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixzQkFBc0IsWUFBbUM7UUFBbkMsNkJBQUEsRUFBQSxpQkFBbUM7UUFDdkQsT0FBTztZQUNMLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxxQkFFTixHQUFHLEVBQUUsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQyxFQUM5RCxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsSUFDaEQsWUFBWSxDQUNoQjtZQUNILE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztTQUNsQyxDQUFDO0lBQ0osQ0FBQztJQUVELFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBQztnQkFDbEUsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDO2FBQ2xHO1lBQ0QsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDO1NBQ3BDLENBQUMsQ0FBQztRQUNILElB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QUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7Q09MT1IsIFgsIFl9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7YXJlYX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9hcmVhJztcbmltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4uLy4uLy4uL3NyYy9lbmNvZGluZyc7XG5pbXBvcnQge05vcm1hbGl6ZWRVbml0U3BlY30gZnJvbSAnLi4vLi4vLi4vc3JjL3NwZWMnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyazogQXJlYScsIGZ1bmN0aW9uKCkge1xuICBmdW5jdGlvbiB2ZXJ0aWNhbEFyZWEobW9yZUVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+ID0ge30pOiBOb3JtYWxpemVkVW5pdFNwZWMge1xuICAgIHJldHVybiB7XG4gICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICBcImVuY29kaW5nXCI6XG4gICAgICAgIHtcbiAgICAgICAgICBcInhcIjoge1widGltZVVuaXRcIjogXCJ5ZWFyXCIsIFwiZmllbGRcIjogXCJZZWFyXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgLi4ubW9yZUVuY29kaW5nLFxuICAgICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9XG4gICAgfTtcbiAgfVxuXG4gIGRlc2NyaWJlKCd2ZXJ0aWNhbCBhcmVhLCB3aXRoIGxvZycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYmluXCI6IHRydWUsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiSU1EQl9SYXRpbmdcIn0sXG4gICAgICAgIFwieVwiOiB7XCJzY2FsZVwiOiB7XCJ0eXBlXCI6ICdsb2cnfSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ1VTX0dyb3NzJywgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9tb3ZpZXMuanNvbid9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZW5kIG9uIGF4aXMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtmaWVsZDoge2dyb3VwOiAnaGVpZ2h0J319KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGFzIG5vIGhlaWdodCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFja2VkIHZlcnRpY2FsIGFyZWEsIHdpdGggYmlubmVkIGRpbWVuc2lvbicsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYmluXCI6IHRydWUsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiSU1EQl9SYXRpbmdcIn0sXG4gICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ1VTX0dyb3NzJywgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn0sXG4gICAgICAgIFwiY29sb3JcIjoge1widHlwZVwiOiBcIm5vbWluYWxcIiwgXCJmaWVsZFwiOiAnYyd9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9tb3ZpZXMuanNvbid9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGJpbl9taWQgZm9yIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge2ZpZWxkOiAnYmluX21heGJpbnNfMTBfSU1EQl9SYXRpbmdfbWlkJywgc2NhbGU6ICd4J30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgYXJlYSwgd2l0aCB6ZXJvPWZhbHNlJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwiYXJlYVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJJTURCX1JhdGluZ1wifSxcbiAgICAgICAgXCJ5XCI6IHtcInNjYWxlXCI6IHtcInplcm9cIjogZmFsc2V9LCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLCBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIn1cbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL21vdmllcy5qc29uJ31cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGFyZWEuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmQgb24gYXhpcycsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge2ZpZWxkOiB7Z3JvdXA6ICdoZWlnaHQnfX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXMgbm8gaGVpZ2h0JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIGFyZWEnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh2ZXJ0aWNhbEFyZWEoKSk7XG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgeCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAneWVhcl9ZZWFyJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHNjYWxlIGZvciB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogWSwgZmllbGQ6ICdjb3VudF8qJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB5MicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCB2YWx1ZTogMH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgYXJlYSB3aXRoIGJpbm5lZCBkaW1lbnNpb24nLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh2ZXJ0aWNhbEFyZWEoKSk7XG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgeCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAneWVhcl9ZZWFyJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHNjYWxlIGZvciB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogWSwgZmllbGQ6ICdjb3VudF8qJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB5MicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCB2YWx1ZTogMH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgc3RhY2tlZCBhcmVhIHdpdGggY29sb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUodmVydGljYWxBcmVhKHtcbiAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgeSBhbmQgeTInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ2NvdW50XypfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIGZpZWxkOiAnY291bnRfKl9zdGFydCd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG9yaWVudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMub3JpZW50LCB7dmFsdWU6ICd2ZXJ0aWNhbCd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgY29sb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmZpbGwsIHtzY2FsZTogQ09MT1IsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBmdW5jdGlvbiBob3Jpem9udGFsQXJlYShtb3JlRW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4gPSB7fSk6IE5vcm1hbGl6ZWRVbml0U3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0aW1lVW5pdFwiOiBcInllYXJcIiwgXCJmaWVsZFwiOiBcIlllYXJcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcImNvdW50XCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAuLi5tb3JlRW5jb2RpbmcsXG4gICAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9jYXJzLmpzb25cIn1cbiAgICB9O1xuICB9XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgYXJlYScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKGhvcml6b250YWxBcmVhKCkpO1xuICAgIGNvbnN0IHByb3BzID0gYXJlYS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgZm9yIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ3llYXJfWWVhcid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgeCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAnY291bnRfKid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgeDInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6ICd4JyAsIHZhbHVlOiAwfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdob3Jpem9udGFsIGFyZWEsIHdpdGggbG9nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwiYXJlYVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJJTURCX1JhdGluZ1wifSxcbiAgICAgICAgXCJ4XCI6IHtcInNjYWxlXCI6IHtcInR5cGVcIjogJ2xvZyd9LCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLCBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIn1cbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL21vdmllcy5qc29uJ31cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gYXJlYS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGVuZCBvbiBheGlzJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7dmFsdWU6IDB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBubyB3aWR0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgYXJlYSwgd2l0aCB6ZXJvPWZhbHNlJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwiYXJlYVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJJTURCX1JhdGluZ1wifSxcbiAgICAgICAgXCJ4XCI6IHtcInNjYWxlXCI6IHtcInplcm9cIjogZmFsc2V9LCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLCBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIn1cbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL21vdmllcy5qc29uJ31cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gYXJlYS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGVuZCBvbiBheGlzJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7dmFsdWU6IDB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBubyB3aWR0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgc3RhY2tlZCBhcmVhIHdpdGggY29sb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoaG9yaXpvbnRhbEFyZWEoe1xuICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgfSkpO1xuXG4gICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgeCBhbmQgeDInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2NvdW50XypfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiAneCcsIGZpZWxkOiAnY291bnRfKl9zdGFydCd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IG9yaWVudCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMub3JpZW50LCB7dmFsdWU6ICdob3Jpem9udGFsJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHNjYWxlIGZvciBjb2xvcicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuZmlsbCwge3NjYWxlOiBDT0xPUiwgZmllbGQ6ICdPcmlnaW4nfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyYW5nZWQgYXJlYScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCAoJ3ZlcnRpY2FsIGFyZWEgc2hvdWxkIHdvcmsgd2l0aCBhZ2dyZWdhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ0aW1lVW5pdFwiOiBcInllYXJcIiwgXCJmaWVsZFwiOiBcIlllYXJcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLCBcImZpZWxkXCI6IFwiV2VpZ2h0X2luX2xic1wiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5MlwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtYXhcIiwgXCJmaWVsZFwiOiBcIldlaWdodF9pbl9sYnNcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAneWVhcl9ZZWFyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdtaW5fV2VpZ2h0X2luX2xicyd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCBmaWVsZDogJ21heF9XZWlnaHRfaW5fbGJzJ30pO1xuICAgIH0pO1xuXG4gICAgaXQgKCdob3Jpem9udGFsIGFyZWEgc2hvdWxkIHdvcmsgd2l0aCBhZ2dyZWdhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0aW1lVW5pdFwiOiBcInllYXJcIiwgXCJmaWVsZFwiOiBcIlllYXJcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLCBcImZpZWxkXCI6IFwiV2VpZ2h0X2luX2xic1wiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ4MlwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtYXhcIiwgXCJmaWVsZFwiOiBcIldlaWdodF9pbl9sYnNcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBhcmVhLmVuY29kZUVudHJ5KG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAneWVhcl9ZZWFyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdtaW5fV2VpZ2h0X2luX2xicyd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ21heF9XZWlnaHRfaW5fbGJzJ30pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/bar.test.d.ts b/build/test/compile/mark/bar.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/bar.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/bar.test.js b/build/test/compile/mark/bar.test.js new file mode 100644 index 0000000000..3d7acf8b67 --- /dev/null +++ b/build/test/compile/mark/bar.test.js @@ -0,0 +1,655 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var bar_1 = require("../../../src/compile/mark/bar"); +var log = tslib_1.__importStar(require("../../../src/log")); +var mark_1 = require("../../../src/mark"); +var scale_1 = require("../../../src/scale"); +var util_1 = require("../../util"); +describe('Mark: Bar', function () { + describe('simple vertical', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar, with y from zero to field value and with band value for x/width ', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Origin' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + chai_1.assert.isUndefined(props.height); + }); + }); + it('should draw vertical bar, with y from zero to field value and bar with quantitative x, x2, and y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "bin_start", "type": "quantitative" }, + "x2": { "field": "bin_end", "type": "quantitative" }, + "y": { "type": "quantitative", "field": 'Acceleration' } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_start' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'bin_end' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Acceleration' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + chai_1.assert.isUndefined(props.height); + }); + it('should draw vertical bar, with y from zero to field value and with band value for x/width when domain that includes zero is specified', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean", "scale": { "domain": [-1, 1] } } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Origin' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + chai_1.assert.isUndefined(props.height); + }); + it('should draw vertical bar, with y from "group: height" to field value when domain that excludes zero is specified', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean", "scale": { "domain": [1, 2] } } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + chai_1.assert.isUndefined(props.height); + chai_1.assert.equal(logger.warns[0], log.message.nonZeroScaleUsedWithLengthMark('bar', 'y', { zeroFalse: false })); + })); + it('should draw vertical bar, with y from "group: height" to field value when zero=false for y-scale', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean", "scale": { "zero": false } } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + chai_1.assert.isUndefined(props.height); + chai_1.assert.equal(logger.warns[0], log.message.nonZeroScaleUsedWithLengthMark('bar', 'y', { zeroFalse: true })); + })); + it('should draw vertical bar, with y from "group: height" to field value when y-scale type is log', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean", "scale": { "type": "log" } } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + chai_1.assert.isUndefined(props.height); + chai_1.assert.equal(logger.warns[0], log.message.nonZeroScaleUsedWithLengthMark('bar', 'y', { scaleType: 'log' })); + })); + describe('simple horizontal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar from zero to field value and with band value for x/width', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Origin' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + it('should draw horizontal bar, with y from zero to field value and bar with quantitative x, x2, and y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "bin_start", "type": "quantitative" }, + "y2": { "field": "bin_end", "type": "quantitative" }, + "x": { "type": "quantitative", "field": 'Acceleration' } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_start' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_end' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.height); + }); + describe('simple horizontal with point scale', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal", "scale": { "type": "point" } }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar from zero to field value and y with center position and height = rangeStep - 1', function () { + chai_1.assert.deepEqual(props.yc, { scale: 'y', field: 'Origin' }); + chai_1.assert.deepEqual(props.height, { value: scale_1.defaultScaleConfig.rangeStep - 1 }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('simple horizontal with size value', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" }, + "size": { "value": 5 } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should set height to 5 and center y', function () { + chai_1.assert.deepEqual(props.height, { value: 5 }); + chai_1.assert.deepEqual(props.yc, { scale: 'y', field: 'Origin', band: 0.5 }); + }); + }); + describe('simple horizontal with size value in mark def', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": { "type": "bar", "size": 5 }, + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should set height to 5 and center y', function () { + chai_1.assert.deepEqual(props.height, { value: 5 }); + chai_1.assert.deepEqual(props.yc, { scale: 'y', field: 'Origin', band: 0.5 }); + }); + }); + describe('simple horizontal with size field', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" }, + "size": { "aggregate": "mean", "field": "Horsepower", "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar from zero to field value and with band value for x/width', function () { + chai_1.assert.deepEqual(props.yc, { scale: 'y', field: 'Origin', band: 0.5 }); + chai_1.assert.deepEqual(props.height, { scale: 'size', field: 'mean_Horsepower' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('horizontal binned', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y and y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_end', offset: mark_1.defaultBarConfig.binSpacing }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('horizontal binned, sort descending', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative", "sort": "descending" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y and y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_maxbins_10_Horsepower', offset: mark_1.defaultBarConfig.binSpacing }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('horizontal binned, reverse', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative", "scale": { "reverse": true } }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y and y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_maxbins_10_Horsepower', offset: mark_1.defaultBarConfig.binSpacing }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('vertical binned', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with x and x2', function () { + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'bin_maxbins_10_Horsepower', offset: mark_1.defaultBarConfig.binSpacing }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('vertical binned, sort descending', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "quantitative", "sort": "descending" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with x and x2', function () { + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_maxbins_10_Horsepower_end', offset: mark_1.defaultBarConfig.binSpacing }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('horizontal binned with ordinal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "ordinal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_range' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + }); + }); + describe('vertical binned with ordinal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "ordinal" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_maxbins_10_Horsepower_range' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + }); + }); + describe('horizontal binned with no spacing', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + }, + "config": { "bar": { "binSpacing": 0 } } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y and y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('vertical binned with no spacing', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + }, + "config": { "bar": { "binSpacing": 0 } } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with x and x2', function () { + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('simple horizontal binned with size', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" }, + "size": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with y centered on bin_mid and height = size field', function () { + chai_1.assert.deepEqual(props.yc, { signal: '(scale("y", datum["bin_maxbins_10_Horsepower"]) + scale("y", datum["bin_maxbins_10_Horsepower_end"]))/2' }); + chai_1.assert.deepEqual(props.height, { scale: 'size', field: 'mean_Acceleration' }); + }); + }); + describe('vertical binned with size', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" }, + "size": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should draw bar with x centered on bin_mid and width = size field', function () { + chai_1.assert.deepEqual(props.xc, { signal: '(scale(\"x\", datum[\"bin_maxbins_10_Horsepower\"]) + scale(\"x\", datum[\"bin_maxbins_10_Horsepower_end\"]))/2' }); + chai_1.assert.deepEqual(props.width, { scale: 'size', field: 'mean_Acceleration' }); + }); + }); + describe('vertical, with log', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "scale": { "type": 'log' }, "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should end on axis and has no height', function () { + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('horizontal, with log', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "scale": { "type": 'log' }, "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should end on axis and has no width', function () { + chai_1.assert.deepEqual(props.x2, { value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('vertical, with fit mode', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "width": 120, + "height": 120, + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "aggregate": "mean", "field": "Horsepower", "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should use x and with band true', function () { + chai_1.assert.deepEqual(props.x, { + scale: 'x', + field: 'Origin', + }); + chai_1.assert.deepEqual(props.width, { + scale: 'x', + band: true, + }); + }); + }); + describe('horizontal, with fit mode', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "width": 120, + "height": 120, + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": "Horsepower", "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should use y with band true', function () { + chai_1.assert.deepEqual(props.y, { + scale: 'y', + field: 'Origin', + }); + chai_1.assert.deepEqual(props.height, { + scale: 'y', + band: true, + }); + }); + }); + describe('vertical with zero=false', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "scale": { "zero": false }, "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should end on axis nad have no height', function () { + chai_1.assert.deepEqual(props.y2, { field: { group: 'height' } }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('horizontal with zero=false', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "scale": { "zero": false }, "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should end on axis and have no width', function () { + chai_1.assert.deepEqual(props.x2, { value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('1D vertical', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" } }, + "data": { "url": 'data/movies.json' } + }); + var props = bar_1.bar.encodeEntry(model); + it('should have y end on axis, have no-height and have x-offset', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'sum_US_Gross' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + chai_1.assert.isUndefined(props.height); + chai_1.assert.deepEqual(props.xc, { + mult: 0.5, + signal: 'width' + }); + }); + }); + describe('1D vertical with size value', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" }, + "size": { "value": 5 } + }, + "data": { "url": 'data/movies.json' } + }); + var props = bar_1.bar.encodeEntry(model); + it('should have width = 5', function () { + chai_1.assert.deepEqual(props.width, { value: 5 }); + }); + }); + describe('1D vertical with barSize config', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/movies.json' }, + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": 'US_Gross', "aggregate": "sum" } + }, + "config": { + "bar": { "discreteBandSize": 5 } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should have width = 5', function () { + chai_1.assert.deepEqual(props.width, { value: 5 }); + }); + }); + describe('1D horizontal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { "x": { "type": "quantitative", "field": 'US_Gross', "aggregate": 'sum' } }, + "data": { "url": 'data/movies.json' } + }); + var props = bar_1.bar.encodeEntry(model); + it('should end on axis, have no width, and have y-offset', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'sum_US_Gross' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + chai_1.assert.deepEqual(props.yc, { + mult: 0.5, + signal: 'height' + }); + }); + }); + describe('QxQ horizontal', function () { + // This is generally a terrible idea, but we should still test + // if the output show expected results + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": 'Acceleration', "type": "quantitative" }, + "y": { "field": 'Horsepower', "type": "quantitative" } + }, + "config": { + "mark": { "orient": "horizontal" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should produce horizontal bar using x, x2', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.deepEqual(props.yc, { scale: 'y', field: 'Horsepower' }); + chai_1.assert.deepEqual(props.height, { value: mark_1.defaultBarConfig.continuousBandSize }); + }); + }); + describe('QxQ vertical', function () { + // This is generally a terrible idea, but we should still test + // if the output show expected results + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": 'Acceleration', "type": "quantitative" }, + "y": { "field": 'Horsepower', "type": "quantitative" } + }, + "config": { + "mark": { "orient": "vertical" } + } + }); + var props = bar_1.bar.encodeEntry(model); + it('should produce horizontal bar using x, x2', function () { + chai_1.assert.deepEqual(props.xc, { scale: 'x', field: 'Acceleration' }); + chai_1.assert.deepEqual(props.width, { value: mark_1.defaultBarConfig.continuousBandSize }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Horsepower' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + }); + }); + describe('OxN', function () { + // This is generally a terrible idea, but we should still test + // if the output show expected results + it('should produce vertical bar using x, width', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "bar", + "encoding": { + "x": { "field": 'Origin', "type": "nominal" }, + "y": { "field": 'Cylinders', "type": "ordinal" } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Origin' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Cylinders' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + }); + }); + describe('ranged bar', function () { + // TODO: gantt chart with temporal + // TODO: gantt chart with ordinal + it('vertical bars should work with aggregate', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/population.json" }, + "mark": "bar", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { "field": "people", "aggregate": "q1", "type": "quantitative" }, + "y2": { "field": "people", "aggregate": "q3", "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'age' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'q1_people' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'q3_people' }); + }); + it('horizontal bars should work with aggregate', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/population.json" }, + "mark": "bar", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { "field": "people", "aggregate": "q1", "type": "quantitative" }, + "x2": { "field": "people", "aggregate": "q3", "type": "quantitative" } + } + }); + var props = bar_1.bar.encodeEntry(model); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'age' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'q1_people' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'q3_people' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvbWFyay9iYXIudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLHFEQUFrRDtBQUNsRCw0REFBd0M7QUFDeEMsMENBQW1EO0FBQ25ELDRDQUFzRDtBQUN0RCxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLFdBQVcsRUFBRTtJQUNwQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsSUFBTSxLQUFLLEdBQUcsMkNBQW9DLENBQUM7WUFDakQsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDO1lBQ2pDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsVUFBVSxFQUFFO2dCQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztnQkFDM0MsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUM7YUFDNUU7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFNLEtBQUssR0FBRyxTQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJDLEVBQUUsQ0FBQyxtRkFBbUYsRUFBRTtZQUN0RixhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1lBQ3pELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDeEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdB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LEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQzVELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7YmFyfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL2Jhcic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge2RlZmF1bHRCYXJDb25maWd9IGZyb20gJy4uLy4uLy4uL3NyYy9tYXJrJztcbmltcG9ydCB7ZGVmYXVsdFNjYWxlQ29uZmlnfSBmcm9tICcuLi8uLi8uLi9zcmMvc2NhbGUnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyazogQmFyJywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCdzaW1wbGUgdmVydGljYWwnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwiYWdncmVnYXRlXCI6IFwibWVhblwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIsIHdpdGggeSBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIHdpdGggYmFuZCB2YWx1ZSBmb3IgeC93aWR0aCAnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy53aWR0aCwge3NjYWxlOiAneCcsIGJhbmQ6IHRydWV9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAnbWVhbl9BY2NlbGVyYXRpb24nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgdmFsdWU6IDB9KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy5oZWlnaHQpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRyYXcgdmVydGljYWwgYmFyLCB3aXRoIHkgZnJvbSB6ZXJvIHRvIGZpZWxkIHZhbHVlIGFuZCBiYXIgd2l0aCBxdWFudGl0YXRpdmUgeCwgeDIsIGFuZCB5JywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJiaW5fc3RhcnRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcIngyXCI6IHtcImZpZWxkXCI6IFwiYmluX2VuZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbid9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnYmluX3N0YXJ0J30pO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9lbmQnfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdBY2NlbGVyYXRpb24nfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIHZhbHVlOiAwfSk7XG4gICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZHJhdyB2ZXJ0aWNhbCBiYXIsIHdpdGggeSBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIHdpdGggYmFuZCB2YWx1ZSBmb3IgeC93aWR0aCB3aGVuIGRvbWFpbiB0aGF0IGluY2x1ZGVzIHplcm8gaXMgc3BlY2lmaWVkJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwic2NhbGVcIjoge1wiZG9tYWluXCI6IFstMSwgMV19fVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMud2lkdGgsIHtzY2FsZTogJ3gnLCBiYW5kOiB0cnVlfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgdmFsdWU6IDB9KTtcbiAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBkcmF3IHZlcnRpY2FsIGJhciwgd2l0aCB5IGZyb20gXCJncm91cDogaGVpZ2h0XCIgdG8gZmllbGQgdmFsdWUgd2hlbiBkb21haW4gdGhhdCBleGNsdWRlcyB6ZXJvIGlzIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcInNjYWxlXCI6IHtcImRvbWFpblwiOiBbMSwgMl19fVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAnbWVhbl9BY2NlbGVyYXRpb24nfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge2ZpZWxkOiB7Z3JvdXA6ICdoZWlnaHQnfX0pO1xuICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy5oZWlnaHQpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGxvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2Uubm9uWmVyb1NjYWxlVXNlZFdpdGhMZW5ndGhNYXJrKCdiYXInLCAneScsIHt6ZXJvRmFsc2U6IGZhbHNlfSkpO1xuICB9KSk7XG5cbiAgaXQoJ3Nob3VsZCBkcmF3IHZlcnRpY2FsIGJhciwgd2l0aCB5IGZyb20gXCJncm91cDogaGVpZ2h0XCIgdG8gZmllbGQgdmFsdWUgd2hlbiB6ZXJvPWZhbHNlIGZvciB5LXNjYWxlJywgbG9nLndyYXAoKGxvZ2dlcikgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwic2NhbGVcIjoge1wiemVyb1wiOiBmYWxzZX19XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fSk7XG4gICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG5cbiAgICBhc3NlcnQuZXF1YWwobG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5ub25aZXJvU2NhbGVVc2VkV2l0aExlbmd0aE1hcmsoJ2JhcicsICd5Jywge3plcm9GYWxzZTogdHJ1ZX0pKTtcbiAgfSkpO1xuXG4gIGl0KCdzaG91bGQgZHJhdyB2ZXJ0aWNhbCBiYXIsIHdpdGggeSBmcm9tIFwiZ3JvdXA6IGhlaWdodFwiIHRvIGZpZWxkIHZhbHVlIHdoZW4geS1zY2FsZSB0eXBlIGlzIGxvZycsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcInNjYWxlXCI6IHtcInR5cGVcIjogXCJsb2dcIn19XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fSk7XG4gICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG5cbiAgICBhc3NlcnQuZXF1YWwobG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5ub25aZXJvU2NhbGVVc2VkV2l0aExlbmd0aE1hcmsoJ2JhcicsICd5Jywge3NjYWxlVHlwZTogJ2xvZyd9KSk7XG4gIH0pKTtcblxuICBkZXNjcmliZSgnc2ltcGxlIGhvcml6b250YWwnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIgZnJvbSB6ZXJvIHRvIGZpZWxkIHZhbHVlIGFuZCB3aXRoIGJhbmQgdmFsdWUgZm9yIHgvd2lkdGgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHtzY2FsZTogJ3knLCBiYW5kOiB0cnVlfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ21lYW5fQWNjZWxlcmF0aW9uJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiAneCcsIHZhbHVlOiAwfSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMud2lkdGgpO1xuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRyYXcgaG9yaXpvbnRhbCBiYXIsIHdpdGggeSBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIGJhciB3aXRoIHF1YW50aXRhdGl2ZSB4LCB4MiwgYW5kIHknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJpbl9zdGFydFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieTJcIjoge1wiZmllbGRcIjogXCJiaW5fZW5kXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJ31cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fc3RhcnQnfSk7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIGZpZWxkOiAnYmluX2VuZCd9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ0FjY2VsZXJhdGlvbid9KTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6ICd4JywgdmFsdWU6IDB9KTtcbiAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpbXBsZSBob3Jpem9udGFsIHdpdGggcG9pbnQgc2NhbGUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIiwgXCJzY2FsZVwiOiB7XCJ0eXBlXCI6IFwicG9pbnRcIn19LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIGZyb20gemVybyB0byBmaWVsZCB2YWx1ZSBhbmQgeSB3aXRoIGNlbnRlciBwb3NpdGlvbiBhbmQgaGVpZ2h0ID0gcmFuZ2VTdGVwIC0gMScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Yywge3NjYWxlOiAneScsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHt2YWx1ZTogZGVmYXVsdFNjYWxlQ29uZmlnLnJhbmdlU3RlcCAtIDF9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnbWVhbl9BY2NlbGVyYXRpb24nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6ICd4JywgdmFsdWU6IDB9KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy53aWR0aCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaW1wbGUgaG9yaXpvbnRhbCB3aXRoIHNpemUgdmFsdWUnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGhlaWdodCB0byA1IGFuZCBjZW50ZXIgeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7dmFsdWU6IDV9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogJ3knLCBmaWVsZDogJ09yaWdpbicsIGJhbmQ6IDAuNX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2ltcGxlIGhvcml6b250YWwgd2l0aCBzaXplIHZhbHVlIGluIG1hcmsgZGVmJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImJhclwiLCBcInNpemVcIjogNX0sXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGhlaWdodCB0byA1IGFuZCBjZW50ZXIgeScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7dmFsdWU6IDV9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogJ3knLCBmaWVsZDogJ09yaWdpbicsIGJhbmQ6IDAuNX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2ltcGxlIGhvcml6b250YWwgd2l0aCBzaXplIGZpZWxkJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwic2l6ZVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIHdpdGggYmFuZCB2YWx1ZSBmb3IgeC93aWR0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Yywge3NjYWxlOiAneScsIGZpZWxkOiAnT3JpZ2luJywgYmFuZDogMC41fSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmhlaWdodCwge3NjYWxlOiAnc2l6ZScsIGZpZWxkOiAnbWVhbl9Ib3JzZXBvd2VyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCB2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgYmlubmVkJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiAnSG9yc2Vwb3dlcicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciB3aXRoIHkgYW5kIHkyJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyX2VuZCcsIG9mZnNldDogZGVmYXVsdEJhckNvbmZpZy5iaW5TcGFjaW5nfSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgYmlubmVkLCBzb3J0IGRlc2NlbmRpbmcnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImJpblwiOiB0cnVlLCBcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic29ydFwiOiBcImRlc2NlbmRpbmdcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIgd2l0aCB5IGFuZCB5MicsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIGZpZWxkOiAnYmluX21heGJpbnNfMTBfSG9yc2Vwb3dlcicsIG9mZnNldDogZGVmYXVsdEJhckNvbmZpZy5iaW5TcGFjaW5nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdob3Jpem9udGFsIGJpbm5lZCwgcmV2ZXJzZScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzY2FsZVwiOiB7XCJyZXZlcnNlXCI6IHRydWV9fSxcbiAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciB3aXRoIHkgYW5kIHkyJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyJywgb2Zmc2V0OiBkZWZhdWx0QmFyQ29uZmlnLmJpblNwYWNpbmd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAnYmluX21heGJpbnNfMTBfSG9yc2Vwb3dlcl9lbmQnfSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIGJpbm5lZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIgd2l0aCB4IGFuZCB4MicsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiAneCcsIGZpZWxkOiAnYmluX21heGJpbnNfMTBfSG9yc2Vwb3dlcicsIG9mZnNldDogZGVmYXVsdEJhckNvbmZpZy5iaW5TcGFjaW5nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIGJpbm5lZCwgc29ydCBkZXNjZW5kaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiAnSG9yc2Vwb3dlcicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcInNvcnRcIjogXCJkZXNjZW5kaW5nXCJ9LFxuICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIHdpdGggeCBhbmQgeDInLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfZW5kJywgb2Zmc2V0OiBkZWZhdWx0QmFyQ29uZmlnLmJpblNwYWNpbmd9KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy53aWR0aCk7XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwgYmlubmVkIHdpdGggb3JkaW5hbCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIHdpdGggeScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyX3JhbmdlJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHtzY2FsZTogJ3knLCBiYW5kOiB0cnVlfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJ0aWNhbCBiaW5uZWQgd2l0aCBvcmRpbmFsJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiAnSG9yc2Vwb3dlcicsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIgd2l0aCB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfcmFuZ2UnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLndpZHRoLCB7c2NhbGU6ICd4JywgYmFuZDogdHJ1ZX0pO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGRlc2NyaWJlKCdob3Jpem9udGFsIGJpbm5lZCB3aXRoIG5vIHNwYWNpbmcnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImJpblwiOiB0cnVlLCBcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJiYXJcIjoge1wiYmluU3BhY2luZ1wiOiAwfX1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIHdpdGggeSBhbmQgeTInLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd2ZXJ0aWNhbCBiaW5uZWQgd2l0aCBubyBzcGFjaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiAnSG9yc2Vwb3dlcicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9LFxuICAgICAgXCJjb25maWdcIjoge1wiYmFyXCI6IHtcImJpblNwYWNpbmdcIjogMH19XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciB3aXRoIHggYW5kIHgyJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6ICd4JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyX2VuZCd9KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy53aWR0aCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaW1wbGUgaG9yaXpvbnRhbCBiaW5uZWQgd2l0aCBzaXplJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJmaWVsZFwiOiAnSG9yc2Vwb3dlcicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInNpemVcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIHdpdGggeSBjZW50ZXJlZCBvbiBiaW5fbWlkIGFuZCBoZWlnaHQgPSBzaXplIGZpZWxkJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnljLCB7c2lnbmFsOiAnKHNjYWxlKFwieVwiLCBkYXR1bVtcImJpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJcIl0pICsgc2NhbGUoXCJ5XCIsIGRhdHVtW1wiYmluX21heGJpbnNfMTBfSG9yc2Vwb3dlcl9lbmRcIl0pKS8yJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHtzY2FsZTogJ3NpemUnLCBmaWVsZDogJ21lYW5fQWNjZWxlcmF0aW9uJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgYmlubmVkIHdpdGggc2l6ZScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJzaXplXCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciB3aXRoIHggY2VudGVyZWQgb24gYmluX21pZCBhbmQgd2lkdGggPSBzaXplIGZpZWxkJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnhjLCB7c2lnbmFsOiAnKHNjYWxlKFxcXCJ4XFxcIiwgZGF0dW1bXFxcImJpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJcXFwiXSkgKyBzY2FsZShcXFwieFxcXCIsIGRhdHVtW1xcXCJiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyX2VuZFxcXCJdKSkvMid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMud2lkdGgsIHtzY2FsZTogJ3NpemUnLCBmaWVsZDogJ21lYW5fQWNjZWxlcmF0aW9uJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwsIHdpdGggbG9nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICBcInlcIjoge1wic2NhbGVcIjoge1widHlwZVwiOiAnbG9nJ30sIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGVuZCBvbiBheGlzIGFuZCBoYXMgbm8gaGVpZ2h0JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMuaGVpZ2h0KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwsIHdpdGggbG9nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wic2NhbGVcIjoge1widHlwZVwiOiAnbG9nJ30sIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIn1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZW5kIG9uIGF4aXMgYW5kIGhhcyBubyB3aWR0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3ZhbHVlOiAwfSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMud2lkdGgpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwsIHdpdGggZml0IG1vZGUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIndpZHRoXCI6IDEyMCxcbiAgICAgIFwiaGVpZ2h0XCI6IDEyMCxcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgeCBhbmQgd2l0aCBiYW5kIHRydWUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtcbiAgICAgICAgc2NhbGU6ICd4JyxcbiAgICAgICAgZmllbGQ6ICdPcmlnaW4nLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLndpZHRoLCB7XG4gICAgICAgIHNjYWxlOiAneCcsXG4gICAgICAgIGJhbmQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2hvcml6b250YWwsIHdpdGggZml0IG1vZGUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIndpZHRoXCI6IDEyMCxcbiAgICAgIFwiaGVpZ2h0XCI6IDEyMCxcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2UgeSB3aXRoIGJhbmQgdHJ1ZScsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge1xuICAgICAgICBzY2FsZTogJ3knLFxuICAgICAgICBmaWVsZDogJ09yaWdpbicsXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7XG4gICAgICAgIHNjYWxlOiAneScsXG4gICAgICAgIGJhbmQ6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIHdpdGggemVybz1mYWxzZScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcInNjYWxlXCI6IHtcInplcm9cIjogZmFsc2V9LCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmQgb24gYXhpcyBuYWQgaGF2ZSBubyBoZWlnaHQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtmaWVsZDoge2dyb3VwOiAnaGVpZ2h0J319KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy5oZWlnaHQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaG9yaXpvbnRhbCB3aXRoIHplcm89ZmFsc2UnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJzY2FsZVwiOiB7XCJ6ZXJvXCI6IGZhbHNlfSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwiYWdncmVnYXRlXCI6IFwibWVhblwifVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuICAgIGl0KCdzaG91bGQgZW5kIG9uIGF4aXMgYW5kIGhhdmUgbm8gd2lkdGgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHt2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJzFEIHZlcnRpY2FsJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLCBcImFnZ3JlZ2F0ZVwiOiBcInN1bVwifX0sXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvbW92aWVzLmpzb24nfVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHkgZW5kIG9uIGF4aXMsIGhhdmUgbm8taGVpZ2h0IGFuZCBoYXZlIHgtb2Zmc2V0JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ3N1bV9VU19Hcm9zcyd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCB2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnhjLCB7XG4gICAgICAgIG11bHQ6IDAuNSxcbiAgICAgICAgc2lnbmFsOiAnd2lkdGgnXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJzFEIHZlcnRpY2FsIHdpdGggc2l6ZSB2YWx1ZScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogJ1VTX0dyb3NzJywgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn0sXG4gICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvbW92aWVzLmpzb24nfVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHdpZHRoID0gNScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy53aWR0aCwge3ZhbHVlOiA1fSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCcxRCB2ZXJ0aWNhbCB3aXRoIGJhclNpemUgY29uZmlnJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL21vdmllcy5qc29uJ30sXG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInlcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6ICdVU19Hcm9zcycsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICBcImJhclwiOiB7XCJkaXNjcmV0ZUJhbmRTaXplXCI6IDV9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB3aWR0aCA9IDUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMud2lkdGgsIHt2YWx1ZTogNX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnMUQgaG9yaXpvbnRhbCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnVVNfR3Jvc3MnLCBcImFnZ3JlZ2F0ZVwiOiAnc3VtJ319LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9tb3ZpZXMuanNvbid9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBlbmQgb24gYXhpcywgaGF2ZSBubyB3aWR0aCwgYW5kIGhhdmUgeS1vZmZzZXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnc3VtX1VTX0dyb3NzJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiAneCcsIHZhbHVlOiAwfSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMud2lkdGgpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Yywge1xuICAgICAgICBtdWx0OiAwLjUsXG4gICAgICAgIHNpZ25hbDogJ2hlaWdodCdcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUXhRIGhvcml6b250YWwnLCBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGlzIGlzIGdlbmVyYWxseSBhIHRlcnJpYmxlIGlkZWEsIGJ1dCB3ZSBzaG91bGQgc3RpbGwgdGVzdFxuICAgIC8vIGlmIHRoZSBvdXRwdXQgc2hvdyBleHBlY3RlZCByZXN1bHRzXG5cbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgIFwibWFya1wiOiB7XCJvcmllbnRcIjogXCJob3Jpem9udGFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBob3Jpem9udGFsIGJhciB1c2luZyB4LCB4MicsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdBY2NlbGVyYXRpb24nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6ICd4JywgdmFsdWU6IDB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogJ3knLCBmaWVsZDogJ0hvcnNlcG93ZXInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmhlaWdodCwge3ZhbHVlOiBkZWZhdWx0QmFyQ29uZmlnLmNvbnRpbnVvdXNCYW5kU2l6ZX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUXhRIHZlcnRpY2FsJywgZnVuY3Rpb24oKSB7XG4gICAgLy8gVGhpcyBpcyBnZW5lcmFsbHkgYSB0ZXJyaWJsZSBpZGVhLCBidXQgd2Ugc2hvdWxkIHN0aWxsIHRlc3RcbiAgICAvLyBpZiB0aGUgb3V0cHV0IHNob3cgZXhwZWN0ZWQgcmVzdWx0c1xuXG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICBcIm1hcmtcIjoge1wib3JpZW50XCI6IFwidmVydGljYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGhvcml6b250YWwgYmFyIHVzaW5nIHgsIHgyJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnhjLCB7c2NhbGU6ICd4JywgZmllbGQ6ICdBY2NlbGVyYXRpb24nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLndpZHRoLCB7dmFsdWU6IGRlZmF1bHRCYXJDb25maWcuY29udGludW91c0JhbmRTaXplfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ0hvcnNlcG93ZXInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgdmFsdWU6IDB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ094TicsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRoaXMgaXMgZ2VuZXJhbGx5IGEgdGVycmlibGUgaWRlYSwgYnV0IHdlIHNob3VsZCBzdGlsbCB0ZXN0XG4gICAgLy8gaWYgdGhlIG91dHB1dCBzaG93IGV4cGVjdGVkIHJlc3VsdHNcbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgdmVydGljYWwgYmFyIHVzaW5nIHgsIHdpZHRoJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogJ09yaWdpbicsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6ICdDeWxpbmRlcnMnLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBiYXIuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ09yaWdpbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMud2lkdGgsIHtzY2FsZTogJ3gnLCBiYW5kOiB0cnVlfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ0N5bGluZGVycyd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7c2NhbGU6ICd5JywgYmFuZDogdHJ1ZX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmFuZ2VkIGJhcicsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRPRE86IGdhbnR0IGNoYXJ0IHdpdGggdGVtcG9yYWxcblxuICAgIC8vIFRPRE86IGdhbnR0IGNoYXJ0IHdpdGggb3JkaW5hbFxuXG4gICAgaXQoJ3ZlcnRpY2FsIGJhcnMgc2hvdWxkIHdvcmsgd2l0aCBhZ2dyZWdhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicGVvcGxlXCIsIFwiYWdncmVnYXRlXCI6IFwicTFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieTJcIjoge1wiZmllbGRcIjogXCJwZW9wbGVcIiwgXCJhZ2dyZWdhdGVcIjogXCJxM1wiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3BzID0gYmFyLmVuY29kZUVudHJ5KG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnYWdlJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdxMV9wZW9wbGUnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgZmllbGQ6ICdxM19wZW9wbGUnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaG9yaXpvbnRhbCBiYXJzIHNob3VsZCB3b3JrIHdpdGggYWdncmVnYXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcImFnZ3JlZ2F0ZVwiOiBcInExXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcIngyXCI6IHtcImZpZWxkXCI6IFwicGVvcGxlXCIsIFwiYWdncmVnYXRlXCI6IFwicTNcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wcyA9IGJhci5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ2FnZSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAncTFfcGVvcGxlJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiAneCcsIGZpZWxkOiAncTNfcGVvcGxlJ30pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/geoshape.test.d.ts b/build/test/compile/mark/geoshape.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/geoshape.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/geoshape.test.js b/build/test/compile/mark/geoshape.test.js new file mode 100644 index 0000000000..72e3bb06d2 --- /dev/null +++ b/build/test/compile/mark/geoshape.test.js @@ -0,0 +1,43 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var geoshape_1 = require("../../../src/compile/mark/geoshape"); +var util_1 = require("../../util"); +describe('Mark: Geoshape', function () { + describe('encode', function () { + it('should create no properties', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": { + "color": { + "value": "black" + }, + "opacity": { + "value": 0.8 + } + } + }); + var props = geoshape_1.geoshape.encodeEntry(model); + chai_1.assert.deepEqual({ + "fill": { + "value": "black" + }, + "opacity": { + "value": 0.8 + } + }, props); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2Vvc2hhcGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9tYXJrL2dlb3NoYXBlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7QUFFOUIsNkJBQTRCO0FBQzVCLCtEQUE0RDtBQUM1RCxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLGdCQUFnQixFQUFFO0lBQ3pCLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDakIsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1lBQ2hDLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsVUFBVTtnQkFDbEIsWUFBWSxFQUFFO29CQUNaLE1BQU0sRUFBRSxXQUFXO2lCQUNwQjtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sS0FBSyxFQUFFLGtCQUFrQjtvQkFDekIsUUFBUSxFQUFFO3dCQUNSLE1BQU0sRUFBRSxVQUFVO3dCQUNsQixTQUFTLEVBQUUsUUFBUTtxQkFDcEI7aUJBQ0Y7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLE9BQU8sRUFBRTt3QkFDUCxPQUFPLEVBQUUsT0FBTztxQkFDakI7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULE9BQU8sRUFBRSxHQUFHO3FCQUNiO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsSUFBTSxLQUFLLEdBQUcsbUJBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsYUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDZixNQUFNLEVBQUU7b0JBQ04sT0FBTyxFQUFFLE9BQU87aUJBQ2pCO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxPQUFPLEVBQUUsR0FBRztpQkFDYjthQUNGLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDWixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSBxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtnZW9zaGFwZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9nZW9zaGFwZSc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdNYXJrOiBHZW9zaGFwZScsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnZW5jb2RlJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgY3JlYXRlIG5vIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwicHJvamVjdGlvblwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICBcImZvcm1hdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgICAgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiBcImJsYWNrXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwib3BhY2l0eVwiOiB7XG4gICAgICAgICAgICBcInZhbHVlXCI6IDAuOFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IGdlb3NoYXBlLmVuY29kZUVudHJ5KG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoe1xuICAgICAgICBcImZpbGxcIjoge1xuICAgICAgICAgIFwidmFsdWVcIjogXCJibGFja1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3BhY2l0eVwiOiB7XG4gICAgICAgICAgXCJ2YWx1ZVwiOiAwLjhcbiAgICAgICAgfVxuICAgICAgfSwgcHJvcHMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/init.test.d.ts b/build/test/compile/mark/init.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/init.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/init.test.js b/build/test/compile/mark/init.test.js new file mode 100644 index 0000000000..b2585c800c --- /dev/null +++ b/build/test/compile/mark/init.test.js @@ -0,0 +1,281 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var log = tslib_1.__importStar(require("../../../src/log")); +var chai_1 = require("chai"); +var mark_1 = require("../../../src/mark"); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +describe('compile/mark/init', function () { + describe('defaultOpacity', function () { + it('should return 0.7 by default for unaggregated point, tick, circle, and square', function () { + for (var _i = 0, _a = [mark_1.POINT, mark_1.TICK, mark_1.CIRCLE, mark_1.SQUARE]; _i < _a.length; _i++) { + var mark = _a[_i]; + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + mark: mark, + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "quantitative", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.opacity, 0.7); + } + }); + it('should return undefined by default for aggregated point, tick, circle, and square', function () { + for (var _i = 0, _a = [mark_1.POINT, mark_1.TICK, mark_1.CIRCLE, mark_1.SQUARE]; _i < _a.length; _i++) { + var mark = _a[_i]; + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + mark: mark, + "encoding": { + "y": { "aggregate": "mean", "type": "quantitative", "field": "foo" }, + "x": { "type": "nominal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.opacity, undefined); + } + }); + it('should use specified opacity', function () { + for (var _i = 0, _a = [mark_1.POINT, mark_1.TICK, mark_1.CIRCLE, mark_1.SQUARE]; _i < _a.length; _i++) { + var mark = _a[_i]; + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + mark: { type: mark, opacity: 0.9 }, + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "quantitative", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.opacity, 0.9); + } + }); + it('should return undefined by default for other marks', function () { + var otherMarks = util_1.without(mark_1.PRIMITIVE_MARKS, [mark_1.POINT, mark_1.TICK, mark_1.CIRCLE, mark_1.SQUARE]); + for (var _i = 0, otherMarks_1 = otherMarks; _i < otherMarks_1.length; _i++) { + var mark = otherMarks_1[_i]; + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + mark: mark, + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "nominal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.opacity, undefined); + } + }); + }); + describe('orient', function () { + it('should return correct default for QxQ', log.wrap(function (localLogger) { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "quantitative", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + chai_1.assert.equal(localLogger.warns[0], log.message.unclearOrientContinuous(mark_1.BAR)); + })); + it('should return correct default for empty plot', log.wrap(function (localLogger) { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + encoding: {} + }); + chai_1.assert.equal(model.markDef.orient, undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.unclearOrientDiscreteOrEmpty(mark_1.BAR)); + })); + it('should return correct orient for bar with both axes discrete', log.wrap(function (localLogger) { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { "type": "ordinal", "field": "foo" }, + "y": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.unclearOrientDiscreteOrEmpty(mark_1.BAR)); + })); + it('should return correct orient for vertical bar', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for horizontal bar', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { "type": "quantitative", "field": "foo" }, + "y": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for vertical bar with raw temporal dimension', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "temporal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for horizontal bar with raw temporal dimension', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { "type": "quantitative", "field": "foo" }, + "y": { "type": "temporal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for vertical tick', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "x": { "type": "quantitative", "field": "foo" }, + "y": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for vertical tick with bin', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "x": { "type": "quantitative", "field": "foo" }, + "y": { "type": "quantitative", "field": "bar", "bin": true } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for vertical tick of continuous timeUnit dotplot', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "x": { "type": "temporal", "field": "foo", "timeUnit": "yearmonthdate" }, + "y": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for horizontal tick', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "y": { "type": "quantitative", "field": "foo" }, + "x": { "type": "ordinal", "field": "bar" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for vertical rule', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "value": 0 }, + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for horizontal rule', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "value": 0 }, + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return undefined for line segment rule', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "value": 0 }, + "x": { "value": 0 }, + "y2": { "value": 100 }, + "x2": { "value": 100 }, + }, + }); + chai_1.assert.equal(model.markDef.orient, undefined); + }); + it('should return undefined for line segment rule with only x and y without x2, y2', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "value": 0 }, + "x": { "value": 0 } + }, + }); + chai_1.assert.equal(model.markDef.orient, undefined); + }); + it('should return correct orient for horizontal rules without x2 ', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "b", "type": "quantitative" }, + "y": { "field": "a", "type": "ordinal" }, + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for vertical rules without y2 ', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "field": "b", "type": "quantitative" }, + "x": { "field": "a", "type": "ordinal" }, + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for vertical rule with range', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "type": "ordinal", "field": "foo" }, + "y": { "type": "quantitative", "field": "bar" }, + "y2": { "type": "quantitative", "field": "baz" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + it('should return correct orient for horizontal rule with range', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "type": "ordinal", "field": "foo" }, + "x": { "type": "quantitative", "field": "bar" }, + "x2": { "type": "quantitative", "field": "baz" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for horizontal rule with range and no ordinal', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "type": "quantitative", "field": "bar" }, + "x2": { "type": "quantitative", "field": "baz" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + }); + it('should return correct orient for vertical rule with range and no ordinal', function () { + var model = util_2.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "type": "quantitative", "field": "bar" }, + "y2": { "type": "quantitative", "field": "baz" } + }, + }); + chai_1.assert.equal(model.markDef.orient, 'vertical'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvaW5pdC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw0REFBd0M7QUFFeEMsNkJBQTRCO0FBQzVCLDBDQUFvRjtBQUNwRiwwQ0FBMEM7QUFDMUMsbUNBQWdFO0FBRWhFLFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLCtFQUErRSxFQUFFO1lBQ2xGLEtBQW1CLFVBQTZCLEVBQTdCLE1BQUMsWUFBSyxFQUFFLFdBQUksRUFBRSxhQUFNLEVBQUUsYUFBTSxDQUFDLEVBQTdCLGNBQTZCLEVBQTdCLElBQTZCLEVBQUU7Z0JBQTdDLElBQU0sSUFBSSxTQUFBO2dCQUNiLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO29CQUNqRCxJQUFJLE1BQUE7b0JBQ0osVUFBVSxFQUFFO3dCQUNWLEdBQUcsRUFBRSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQzt3QkFDN0MsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDO3FCQUM5QztpQkFDRixDQUFDLENBQUM7Z0JBQ0gsYUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1GQUFtRixFQUFFO1lBQ3RGLEtBQW1CLFVBQTZCLEVBQTdCLE1BQUMsWUFBSyxFQUFFLFdBQUksRUFBRSxhQUFNLEVBQUUsYUFBTSxDQUFDLEVBQTdCLGNBQTZCLEVBQTdCLElBQTZCLEVBQUU7Z0JBQTdDLElBQU0sSUFBSSxTQUFBO2dCQUNiLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxD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QUFFLE1BQU07Z0JBQ2QsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQztvQkFDN0MsSUFBSSxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDO2lCQUMvQzthQUNGLENBQUMsQ0FBQztZQUNILGFBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMEVBQTBFLEVBQUU7WUFDN0UsSUFBTSxLQUFLLEdBQUcsMkNBQW9DLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxNQUFNO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUM7b0JBQzdDLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQztpQkFDL0M7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7QkFSLCBDSVJDTEUsIFBPSU5ULCBQUklNSVRJVkVfTUFSS1MsIFNRVUFSRSwgVElDS30gZnJvbSAnLi4vLi4vLi4vc3JjL21hcmsnO1xuaW1wb3J0IHt3aXRob3V0fSBmcm9tICcuLi8uLi8uLi9zcmMvdXRpbCc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdjb21waWxlL21hcmsvaW5pdCcsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnZGVmYXVsdE9wYWNpdHknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gMC43IGJ5IGRlZmF1bHQgZm9yIHVuYWdncmVnYXRlZCBwb2ludCwgdGljaywgY2lyY2xlLCBhbmQgc3F1YXJlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBtYXJrIG9mIFtQT0lOVCwgVElDSywgQ0lSQ0xFLCBTUVVBUkVdKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgICBtYXJrLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImZvb1wifSxcbiAgICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJiYXJcIn1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3BhY2l0eSwgMC43KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhZ2dyZWdhdGVkIHBvaW50LCB0aWNrLCBjaXJjbGUsIGFuZCBzcXVhcmUnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1hcmsgb2YgW1BPSU5ULCBUSUNLLCBDSVJDTEUsIFNRVUFSRV0pIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICAgIG1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImZvb1wifSxcbiAgICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwibm9taW5hbFwiLCBcImZpZWxkXCI6IFwiYmFyXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9wYWNpdHksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBzcGVjaWZpZWQgb3BhY2l0eScsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWFyayBvZiBbUE9JTlQsIFRJQ0ssIENJUkNMRSwgU1FVQVJFXSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgICAgbWFyazoge3R5cGU6IG1hcmssIG9wYWNpdHk6IDAuOX0sXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInlcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcGFjaXR5LCAwLjkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGJ5IGRlZmF1bHQgZm9yIG90aGVyIG1hcmtzJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3RoZXJNYXJrcyA9IHdpdGhvdXQoUFJJTUlUSVZFX01BUktTLCBbUE9JTlQsIFRJQ0ssIENJUkNMRSwgU1FVQVJFXSk7XG4gICAgICBmb3IgKGNvbnN0IG1hcmsgb2Ygb3RoZXJNYXJrcykge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgICAgbWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJmb29cIn0sXG4gICAgICAgICAgICBcInhcIjoge1widHlwZVwiOiBcIm5vbWluYWxcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcGFjaXR5LCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnb3JpZW50JywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBkZWZhdWx0IGZvciBReFEnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJmb29cIn0sXG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS51bmNsZWFyT3JpZW50Q29udGludW91cyhCQVIpKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGRlZmF1bHQgZm9yIGVtcHR5IHBsb3QnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIGVuY29kaW5nOiB7fVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLnVuY2xlYXJPcmllbnREaXNjcmV0ZU9yRW1wdHkoQkFSKSk7XG4gICAgfSkpO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIGJhciB3aXRoIGJvdGggYXhlcyBkaXNjcmV0ZScsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJvcmRpbmFsXCIsIFwiZmllbGRcIjogXCJmb29cIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJvcmRpbmFsXCIsIFwiZmllbGRcIjogXCJiYXJcIn1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS51bmNsZWFyT3JpZW50RGlzY3JldGVPckVtcHR5KEJBUikpO1xuICAgIH0pKTtcblxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIHZlcnRpY2FsIGJhcicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImZvb1wifSxcbiAgICAgICAgICBcInhcIjoge1widHlwZVwiOiBcIm9yZGluYWxcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIGhvcml6b250YWwgYmFyJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwib3JkaW5hbFwiLCBcImZpZWxkXCI6IFwiYmFyXCJ9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgJ2hvcml6b250YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb3JpZW50IGZvciB2ZXJ0aWNhbCBiYXIgd2l0aCByYXcgdGVtcG9yYWwgZGltZW5zaW9uJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInlcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwidGVtcG9yYWxcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIGhvcml6b250YWwgYmFyIHdpdGggcmF3IHRlbXBvcmFsIGRpbWVuc2lvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImZvb1wifSxcbiAgICAgICAgICBcInlcIjoge1widHlwZVwiOiBcInRlbXBvcmFsXCIsIFwiZmllbGRcIjogXCJiYXJcIn1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCAnaG9yaXpvbnRhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIHZlcnRpY2FsIHRpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwidGlja1wiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1widHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwib3JkaW5hbFwiLCBcImZpZWxkXCI6IFwiYmFyXCJ9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgJ3ZlcnRpY2FsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IG9yaWVudCBmb3IgdmVydGljYWwgdGljayB3aXRoIGJpbicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJ0aWNrXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJmb29cIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhclwiLCBcImJpblwiOiB0cnVlfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIHZlcnRpY2FsIHRpY2sgb2YgY29udGludW91cyB0aW1lVW5pdCBkb3RwbG90JywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInRpY2tcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJ0ZW1wb3JhbFwiLCBcImZpZWxkXCI6IFwiZm9vXCIsIFwidGltZVVuaXRcIjogXCJ5ZWFybW9udGhkYXRlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwib3JkaW5hbFwiLCBcImZpZWxkXCI6IFwiYmFyXCJ9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgJ3ZlcnRpY2FsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IG9yaWVudCBmb3IgaG9yaXpvbnRhbCB0aWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInRpY2tcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImZvb1wifSxcbiAgICAgICAgICBcInhcIjoge1widHlwZVwiOiBcIm9yZGluYWxcIiwgXCJmaWVsZFwiOiBcImJhclwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICdob3Jpem9udGFsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IG9yaWVudCBmb3IgdmVydGljYWwgcnVsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ2YWx1ZVwiOiAwfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCAndmVydGljYWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb3JpZW50IGZvciBob3Jpem9udGFsIHJ1bGUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcInZhbHVlXCI6IDB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICdob3Jpem9udGFsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmRlZmluZWQgZm9yIGxpbmUgc2VnbWVudCBydWxlJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ2YWx1ZVwiOiAwfSxcbiAgICAgICAgICBcInhcIjoge1widmFsdWVcIjogMH0sXG4gICAgICAgICAgXCJ5MlwiOiB7XCJ2YWx1ZVwiOiAxMDB9LFxuICAgICAgICAgIFwieDJcIjoge1widmFsdWVcIjogMTAwfSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBsaW5lIHNlZ21lbnQgcnVsZSB3aXRoIG9ubHkgeCBhbmQgeSB3aXRob3V0IHgyLCB5MicsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInlcIjoge1widmFsdWVcIjogMH0sXG4gICAgICAgICAgXCJ4XCI6IHtcInZhbHVlXCI6IDB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb3JpZW50IGZvciBob3Jpem9udGFsIHJ1bGVzIHdpdGhvdXQgeDIgJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgJ2hvcml6b250YWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb3JpZW50IGZvciB2ZXJ0aWNhbCBydWxlcyB3aXRob3V0IHkyICcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIHZlcnRpY2FsIHJ1bGUgd2l0aCByYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwib3JkaW5hbFwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJiYXJcIn0sXG4gICAgICAgICAgXCJ5MlwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJiYXpcIn1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCAndmVydGljYWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3Qgb3JpZW50IGZvciBob3Jpem9udGFsIHJ1bGUgd2l0aCByYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieVwiOiB7XCJ0eXBlXCI6IFwib3JkaW5hbFwiLCBcImZpZWxkXCI6IFwiZm9vXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJiYXJcIn0sXG4gICAgICAgICAgXCJ4MlwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJiYXpcIn1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCAnaG9yaXpvbnRhbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBvcmllbnQgZm9yIGhvcml6b250YWwgcnVsZSB3aXRoIHJhbmdlIGFuZCBubyBvcmRpbmFsJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhclwifSxcbiAgICAgICAgICBcIngyXCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhelwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICdob3Jpem9udGFsJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IG9yaWVudCBmb3IgdmVydGljYWwgcnVsZSB3aXRoIHJhbmdlIGFuZCBubyBvcmRpbmFsJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhclwifSxcbiAgICAgICAgICBcInkyXCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcImJhelwifVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwubWFya0RlZi5vcmllbnQsICd2ZXJ0aWNhbCcpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5cbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/mark/line.test.d.ts b/build/test/compile/mark/line.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/line.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/line.test.js b/build/test/compile/mark/line.test.js new file mode 100644 index 0000000000..9dd54b3d58 --- /dev/null +++ b/build/test/compile/mark/line.test.js @@ -0,0 +1,140 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var line_1 = require("../../../src/compile/mark/line"); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../util"); +describe('Mark: Line', function () { + describe('with x, y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "x": { "field": "year", "type": "ordinal" }, + "y": { "field": "yield", "type": "quantitative" } + } + }); + var props = line_1.line.encodeEntry(model); + it('should have scale for x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year' }); + }); + it('should have scale for y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'yield' }); + }); + }); + describe('with x, y, color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "x": { "field": "year", "type": "ordinal" }, + "y": { "field": "yield", "type": "quantitative" }, + "color": { "field": "Acceleration", "type": "quantitative" } + } + }); + var props = line_1.line.encodeEntry(model); + it('should have scale for color', function () { + chai_1.assert.deepEqual(props.stroke, { scale: channel_1.COLOR, field: 'Acceleration' }); + }); + }); + describe('with x, y, size', function () { + it('should have scale for size', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "x": { "field": "year", "type": "ordinal" }, + "y": { "field": "yield", "type": "quantitative", "aggregate": "mean" }, + "size": { "field": "variety", "type": "nominal" } + } + }); + var props = line_1.line.encodeEntry(model); + chai_1.assert.deepEqual(props.strokeWidth, { scale: 'size', field: 'variety' }); + }); + it('should drop aggregate size field', log.wrap(function (localLogger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "x": { "field": "year", "type": "ordinal" }, + "y": { "field": "yield", "type": "quantitative", "aggregate": "mean" }, + "size": { "field": "Acceleration", "type": "quantitative", "aggregate": "mean" } + } + }); + var props = line_1.line.encodeEntry(model); + // If size field is dropped, then strokeWidth only have value + chai_1.assert.isNotOk(props.strokeWidth && props.strokeWidth['scale']); + chai_1.assert.equal(localLogger.warns[0], log.message.LINE_WITH_VARYING_SIZE); + })); + }); + describe('with stacked y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "x": { "field": "year", "type": "ordinal" }, + "y": { "field": "yield", "type": "quantitative", "aggregate": "sum" }, + "color": { "field": "a", "type": "nominal" } + }, + "config": { "stack": "zero" } + }); + var props = line_1.line.encodeEntry(model); + it('should use y_end', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'sum_yield_end' }); + }); + }); + describe('with stacked x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "line", + "encoding": { + "y": { "field": "year", "type": "ordinal" }, + "x": { "field": "yield", "type": "quantitative", "aggregate": "sum" }, + "color": { "field": "a", "type": "nominal" } + }, + "config": { "stack": "zero" } + }); + var props = line_1.line.encodeEntry(model); + it('should use x_end', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'sum_yield_end' }); + }); + }); + describe('with x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "line", + "encoding": { "x": { "field": "year", "type": "ordinal" } }, + "data": { "url": "data/barley.json" } + }); + var props = line_1.line.encodeEntry(model); + it('should be centered on y', function () { + chai_1.assert.deepEqual(props.y, { + mult: 0.5, + signal: 'height' + }); + }); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year' }); + }); + }); + describe('with y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "line", + "encoding": { "y": { "field": "year", "type": "ordinal" } }, + "data": { "url": "data/barley.json" } + }); + var props = line_1.line.encodeEntry(model); + it('should be centered on x', function () { + chai_1.assert.deepEqual(props.x, { + mult: 0.5, + signal: 'width' + }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'year' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvbGluZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFFNUIsZ0RBQWlEO0FBQ2pELHVEQUFvRDtBQUNwRCw0REFBd0M7QUFDeEMsbUNBQWdFO0FBRWhFLFFBQVEsQ0FBQyxZQUFZLEVBQUU7SUFFckIsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUNwQixJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUM7WUFDbkMsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO2dCQUN6QyxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7YUFDaEQ7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtZQUM1QixhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1lBQzVCLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFB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Q0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsUUFBUSxFQUFFO1FBQ2pCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLEVBQUM7WUFDdkQsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDO1NBQ3BDLENBQUMsQ0FBQztRQUVILElBQU0sS0FBSyxHQUFHLFdBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1lBQzVCLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsTUFBTSxFQUFFLE9BQU87YUFDaEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7WUFDdEIsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLFdBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSBxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge0NPTE9SLCBYLCBZfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQge2xpbmV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbGluZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdNYXJrOiBMaW5lJywgZnVuY3Rpb24oKSB7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeCwgeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBsaW5lLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgeCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAneWVhcid9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBzY2FsZSBmb3IgeScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAneWllbGQnfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHgsIHksIGNvbG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiQWNjZWxlcmF0aW9uXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gbGluZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgZm9yIGNvbG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zdHJva2UsIHtzY2FsZTogQ09MT1IsIGZpZWxkOiAnQWNjZWxlcmF0aW9uJ30pO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGRlc2NyaWJlKCd3aXRoIHgsIHksIHNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBoYXZlIHNjYWxlIGZvciBzaXplJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ5ZWFyXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwibWVhblwifSxcbiAgICAgICAgICBcInNpemVcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IGxpbmUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZVdpZHRoLCB7c2NhbGU6ICdzaXplJywgZmllbGQ6ICd2YXJpZXR5J30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkcm9wIGFnZ3JlZ2F0ZSBzaXplIGZpZWxkJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJmaWVsZFwiOiBcIkFjY2VsZXJhdGlvblwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBsaW5lLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgICAgLy8gSWYgc2l6ZSBmaWVsZCBpcyBkcm9wcGVkLCB0aGVuIHN0cm9rZVdpZHRoIG9ubHkgaGF2ZSB2YWx1ZVxuICAgICAgYXNzZXJ0LmlzTm90T2socHJvcHMuc3Ryb2tlV2lkdGggJiYgcHJvcHMuc3Ryb2tlV2lkdGhbJ3NjYWxlJ10pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5MSU5FX1dJVEhfVkFSWUlOR19TSVpFKTtcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHN0YWNrZWQgeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICB9LFxuICAgICAgXCJjb25maWdcIjoge1wic3RhY2tcIjogIFwiemVyb1wifVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gbGluZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB5X2VuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnc3VtX3lpZWxkX2VuZCd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggc3RhY2tlZCB4JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWVhclwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn0sXG4gICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgIH0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJzdGFja1wiOiAgXCJ6ZXJvXCJ9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBsaW5lLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHhfZW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogWCwgZmllbGQ6ICdzdW1feWllbGRfZW5kJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB4JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XCJ4XCI6IHtcImZpZWxkXCI6IFwieWVhclwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9fSxcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IGxpbmUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBjZW50ZXJlZCBvbiB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtcbiAgICAgICAgbXVsdDogMC41LFxuICAgICAgICBzaWduYWw6ICdoZWlnaHQnXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2NhbGUgb24geCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAneWVhcid9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcImxpbmVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1wieVwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifX0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBsaW5lLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgYmUgY2VudGVyZWQgb24geCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7XG4gICAgICAgIG11bHQ6IDAuNSxcbiAgICAgICAgc2lnbmFsOiAnd2lkdGgnXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2NhbGUgb24geScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAneWVhcid9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/mark/mark.test.d.ts b/build/test/compile/mark/mark.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/mark.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/mark.test.js b/build/test/compile/mark/mark.test.js new file mode 100644 index 0000000000..82d0b3c50b --- /dev/null +++ b/build/test/compile/mark/mark.test.js @@ -0,0 +1,288 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var mark_1 = require("../../../src/compile/mark/mark"); +var mark_2 = require("../../../src/mark"); +var util_1 = require("../../util"); +describe('Mark', function () { + describe('parseMarkGroup', function () { + // PATH + describe('Multi-series Line', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": { "type": "line", "style": "trend" }, + "encoding": { + "x": { "field": "date", "type": "temporal", "axis": { "format": "%Y" } }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + } + }); + it('should have a facet directive and a nested mark group that uses the faceted data.', function () { + var markGroup = mark_1.parseMarkGroup(model)[0]; + chai_1.assert.equal(markGroup.name, 'pathgroup'); + chai_1.assert.deepEqual(markGroup.from, { + facet: { + name: 'faceted_path_main', + data: 'main', + groupby: ['symbol'] + } + }); + var submarkGroup = markGroup.marks[0]; + chai_1.assert.equal(submarkGroup.name, 'marks'); + chai_1.assert.equal(submarkGroup.type, 'line'); + chai_1.assert.deepEqual(submarkGroup.style, ['line', 'trend']); + chai_1.assert.equal(submarkGroup.from.data, 'faceted_path_main'); + }); + it('should not have post encoding transform', function () { + var markGroup = mark_1.parseMarkGroup(model)[0]; + chai_1.assert.equal(markGroup.name, 'pathgroup'); + chai_1.assert.deepEqual(markGroup.from, { + facet: { + name: 'faceted_path_main', + data: 'main', + groupby: ['symbol'] + } + }); + var submarkGroup = markGroup.marks[0]; + chai_1.assert.isUndefined(submarkGroup.transform); + }); + }); + describe('Single Line', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal", "axis": { "format": "%Y" } }, + "y": { "field": "price", "type": "quantitative" } + } + }); + it('should have mark group with proper data and key', function () { + var markGroup = mark_1.parseMarkGroup(model)[0]; + chai_1.assert.equal(markGroup.name, 'marks'); + chai_1.assert.equal(markGroup.type, 'line'); + chai_1.assert.equal(markGroup.from.data, 'main'); + }); + it('should not have post encoding transform', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.isUndefined(markGroup[0].transform); + }); + // NON-PATH + }); + describe('Points with key', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { "field": "date", "type": "temporal", "axis": { "format": "%Y" } }, + "y": { "field": "price", "type": "quantitative" }, + "key": { "field": "k", "type": "quantitative" } + } + }); + it('should have mark group with proper data and key', function () { + var markGroup = mark_1.parseMarkGroup(model)[0]; + chai_1.assert.equal(markGroup.type, 'symbol'); + chai_1.assert.equal(markGroup.key.field, 'k'); + chai_1.assert.equal(markGroup.from.data, 'main'); + }); + it('should not have post encoding transform', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.isUndefined(markGroup[0].transform); + }); + }); + it('Geoshape should have post encoding transform', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }); + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.isDefined(markGroup[0].transform); + chai_1.assert.equal(markGroup[0].transform[0].type, mark_2.GEOSHAPE); + }); + describe('Aggregated Bar with a color with binned x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { "type": "quantitative", "field": "Cost__Other", "aggregate": "sum" }, + "y": { "bin": true, "type": "quantitative", "field": "Cost__Total_$" }, + "color": { "type": "ordinal", "field": "Effect__Amount_of_damage" } + } + }); + it('should use main stacked data source', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.equal(markGroup[0].from.data, 'main'); + chai_1.assert.equal(markGroup[0].style, 'bar'); + }); + it('should not have post encoding transform', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.isUndefined(markGroup[0].transform); + }); + }); + describe('Faceted aggregated Bar with a color with binned x', function () { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'nominal' } + }, + spec: { + "mark": "bar", + "encoding": { + "x": { "type": "quantitative", "field": "Cost__Other", "aggregate": "sum" }, + "y": { "bin": true, "type": "quantitative", "field": "Cost__Total_$" }, + "color": { "type": "ordinal", "field": "Effect__Amount_of_damage" } + } + } + }); + it('should use faceted data source', function () { + model.parseScale(); + model.parseLayoutSize(); + var markGroup = mark_1.parseMarkGroup(model.child); + chai_1.assert.equal(markGroup[0].from.data, 'child_main'); + }); + it('should not have post encoding transform', function () { + model.parseScale(); + model.parseLayoutSize(); + var markGroup = mark_1.parseMarkGroup(model.child); + chai_1.assert.isUndefined(markGroup[0].transform); + }); + }); + describe('Aggregated bar', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { "type": "quantitative", "field": "Cost__Other", "aggregate": "sum" }, + "y": { "bin": true, "type": "quantitative", "field": "Cost__Total_$" } + } + }); + it('should use main aggregated data source', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.equal(markGroup[0].from.data, 'main'); + }); + it('should not have post encoding transform', function () { + var markGroup = mark_1.parseMarkGroup(model); + chai_1.assert.isUndefined(markGroup[0].transform); + }); + }); + }); + describe('getSort', function () { + it('should order by order field', function () { + var model = util_1.parseUnitModel({ + "data": { "url": "data/driving.json" }, + "mark": "line", + "encoding": { + "x": { "field": "miles", "type": "quantitative", "scale": { "zero": false } }, + "y": { "field": "gas", "type": "quantitative", "scale": { "zero": false } }, + "order": { "field": "year", "type": "temporal" } + } + }); + chai_1.assert.deepEqual(mark_1.getSort(model), { + field: ['datum[\"year\"]'], + order: ['ascending'] + }); + }); + it('should have no sort if order = {value: null}', function () { + var model = util_1.parseUnitModel({ + "data": { "url": "data/driving.json" }, + "mark": "line", + "encoding": { + "x": { "field": "miles", "type": "quantitative", "scale": { "zero": false } }, + "y": { "field": "gas", "type": "quantitative", "scale": { "zero": false } }, + "order": { "value": null } + } + }); + chai_1.assert.equal(mark_1.getSort(model), undefined); + }); + it('should order by x by default if x is the dimension', function () { + var model = util_1.parseUnitModelWithScale({ + "data": { "url": "data/movies.json" }, + "mark": "line", + "encoding": { + "x": { + "bin": { "maxbins": 10 }, + "field": "IMDB_Rating", + "type": "quantitative" + }, + "color": { + "field": "Source", + "type": "nominal" + }, + "y": { + "aggregate": "count", + "type": "quantitative" + } + } + }); + chai_1.assert.deepEqual(mark_1.getSort(model), { + field: 'datum[\"bin_maxbins_10_IMDB_Rating\"]', + order: 'descending' + }); + }); + it('should not order by a missing dimension', function () { + var model = util_1.parseUnitModelWithScale({ + "data": { "url": "data/movies.json" }, + "mark": "line", + "encoding": { + "color": { + "field": "Source", + "type": "nominal" + }, + "y": { + "aggregate": "count", + "type": "quantitative" + } + } + }); + chai_1.assert.deepEqual(mark_1.getSort(model), undefined); + }); + }); + describe('pathGroupingFields()', function () { + it('should return fields for unaggregate detail, color, size, opacity fieldDefs.', function () { + var _a; + for (var _i = 0, _b = [channel_1.DETAIL, channel_1.COLOR, channel_1.SIZE, channel_1.OPACITY]; _i < _b.length; _i++) { + var channel = _b[_i]; + chai_1.assert.deepEqual(mark_1.pathGroupingFields('line', (_a = {}, _a[channel] = { field: 'a', type: 'nominal' }, _a)), ['a']); + } + }); + it('should not return a field for size of a trail mark.', function () { + chai_1.assert.deepEqual(mark_1.pathGroupingFields('trail', { size: { field: 'a', type: 'nominal' } }), []); + }); + it('should not return fields for aggregate detail, color, size, opacity fieldDefs.', function () { + var _a; + for (var _i = 0, _b = [channel_1.DETAIL, channel_1.COLOR, channel_1.SIZE, channel_1.OPACITY]; _i < _b.length; _i++) { + var channel = _b[_i]; + chai_1.assert.deepEqual(mark_1.pathGroupingFields('line', (_a = {}, _a[channel] = { aggregate: 'mean', field: 'a', type: 'nominal' }, _a)), [], channel); + } + }); + it('should return condition detail fields for color, size, shape', function () { + var _a; + for (var _i = 0, _b = [channel_1.COLOR, channel_1.SIZE, channel_1.OPACITY]; _i < _b.length; _i++) { + var channel = _b[_i]; + chai_1.assert.deepEqual(mark_1.pathGroupingFields('line', (_a = {}, _a[channel] = { + condition: { selection: 'sel', field: 'a', type: 'nominal' } + }, _a)), ['a']); + } + }); + it('should not return errors for all channels', function () { + var _loop_1 = function (channel) { + chai_1.assert.doesNotThrow(function () { + var _a; + mark_1.pathGroupingFields('line', (_a = {}, + _a[channel] = { field: 'a', type: 'nominal' }, + _a)); + }); + }; + for (var _i = 0, UNIT_CHANNELS_1 = channel_1.UNIT_CHANNELS; _i < UNIT_CHANNELS_1.length; _i++) { + var channel = UNIT_CHANNELS_1[_i]; + _loop_1(channel); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvbWFyay50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7O0FBRTlCLDZCQUE0QjtBQUM1QixnREFBaUY7QUFDakYsdURBQTJGO0FBRTNGLDBDQUEyQztBQUMzQyxtQ0FBMEg7QUFFMUgsUUFBUSxDQUFDLE1BQU0sRUFBRTtJQUNmLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixPQUFPO1FBQ1AsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO2dCQUNqRCxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUM7Z0JBQzFDLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxFQUFDO29CQUNwRSxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQy9DLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztpQkFDaEQ7YUFDRixDQUFDLENBQUM7WUFDSCxFQUFFLENBQUMsbUZBQW1GLEVBQUU7Z0JBQ3RGLElBQU0sU0FBUyxHQUFHLHFCQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDMUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO29CQUMvQixLQUFLLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLG1CQUFtQjt3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QUFQLE9BQU87YUFRakI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtDT0xPUiwgREVUQUlMLCBPUEFDSVRZLCBTSVpFLCBVTklUX0NIQU5ORUxTfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQge2dldFNvcnQsIHBhcnNlTWFya0dyb3VwLCBwYXRoR3JvdXBpbmdGaWVsZHN9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbWFyayc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvdW5pdCc7XG5pbXBvcnQge0dFT1NIQVBFfSBmcm9tICcuLi8uLi8uLi9zcmMvbWFyayc7XG5pbXBvcnQge3BhcnNlRmFjZXRNb2RlbCwgcGFyc2VVbml0TW9kZWwsIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlLCBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyaycsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgncGFyc2VNYXJrR3JvdXAnLCBmdW5jdGlvbigpIHtcbiAgICAvLyBQQVRIXG4gICAgZGVzY3JpYmUoJ011bHRpLXNlcmllcyBMaW5lJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImxpbmVcIiwgXCJzdHlsZVwiOiBcInRyZW5kXCJ9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCIsIFwiYXhpc1wiOiB7XCJmb3JtYXRcIjogXCIlWVwifX0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzeW1ib2xcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBhIGZhY2V0IGRpcmVjdGl2ZSBhbmQgYSBuZXN0ZWQgbWFyayBncm91cCB0aGF0IHVzZXMgdGhlIGZhY2V0ZWQgZGF0YS4nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKVswXTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cC5uYW1lLCAncGF0aGdyb3VwJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwobWFya0dyb3VwLmZyb20sIHtcbiAgICAgICAgICBmYWNldDoge1xuICAgICAgICAgICAgbmFtZTogJ2ZhY2V0ZWRfcGF0aF9tYWluJyxcbiAgICAgICAgICAgIGRhdGE6ICdtYWluJyxcbiAgICAgICAgICAgIGdyb3VwYnk6IFsnc3ltYm9sJ11cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdWJtYXJrR3JvdXAgPSBtYXJrR3JvdXAubWFya3NbMF07XG4gICAgICAgIGFzc2VydC5lcXVhbChzdWJtYXJrR3JvdXAubmFtZSwgJ21hcmtzJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChzdWJtYXJrR3JvdXAudHlwZSwgJ2xpbmUnKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzdWJtYXJrR3JvdXAuc3R5bGUsIFsnbGluZScsICd0cmVuZCddKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHN1Ym1hcmtHcm91cC5mcm9tLmRhdGEsICdmYWNldGVkX3BhdGhfbWFpbicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgcG9zdCBlbmNvZGluZyB0cmFuc2Zvcm0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKVswXTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cC5uYW1lLCAncGF0aGdyb3VwJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwobWFya0dyb3VwLmZyb20sIHtcbiAgICAgICAgICBmYWNldDoge1xuICAgICAgICAgICAgbmFtZTogJ2ZhY2V0ZWRfcGF0aF9tYWluJyxcbiAgICAgICAgICAgIGRhdGE6ICdtYWluJyxcbiAgICAgICAgICAgIGdyb3VwYnk6IFsnc3ltYm9sJ11cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzdWJtYXJrR3JvdXAgPSBtYXJrR3JvdXAubWFya3NbMF07XG4gICAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChzdWJtYXJrR3JvdXAudHJhbnNmb3JtKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ1NpbmdsZSBMaW5lJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIiwgXCJheGlzXCI6IHtcImZvcm1hdFwiOiBcIiVZXCJ9fSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIGhhdmUgbWFyayBncm91cCB3aXRoIHByb3BlciBkYXRhIGFuZCBrZXknLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKVswXTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cC5uYW1lLCAnbWFya3MnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cC50eXBlLCAnbGluZScpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobWFya0dyb3VwLmZyb20uZGF0YSwgJ21haW4nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBoYXZlIHBvc3QgZW5jb2RpbmcgdHJhbnNmb3JtJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtYXJrR3JvdXAgPSBwYXJzZU1hcmtHcm91cChtb2RlbCk7XG4gICAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChtYXJrR3JvdXBbMF0udHJhbnNmb3JtKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBOT04tUEFUSFxuICAgIH0pO1xuICAgIGRlc2NyaWJlKCdQb2ludHMgd2l0aCBrZXknLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIiwgXCJheGlzXCI6IHtcImZvcm1hdFwiOiBcIiVZXCJ9fSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJrZXlcIjoge1wiZmllbGRcIjogXCJrXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGl0KCdzaG91bGQgaGF2ZSBtYXJrIGdyb3VwIHdpdGggcHJvcGVyIGRhdGEgYW5kIGtleScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFya0dyb3VwID0gcGFyc2VNYXJrR3JvdXAobW9kZWwpWzBdO1xuICAgICAgICBhc3NlcnQuZXF1YWwobWFya0dyb3VwLnR5cGUsICdzeW1ib2wnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cC5rZXkuZmllbGQsICdrJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChtYXJrR3JvdXAuZnJvbS5kYXRhLCAnbWFpbicpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IGhhdmUgcG9zdCBlbmNvZGluZyB0cmFuc2Zvcm0nLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKTtcbiAgICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG1hcmtHcm91cFswXS50cmFuc2Zvcm0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnR2Vvc2hhcGUgc2hvdWxkIGhhdmUgcG9zdCBlbmNvZGluZyB0cmFuc2Zvcm0nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwicHJvamVjdGlvblwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICBcImZvcm1hdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgICAgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH0pO1xuICAgICAgY29uc3QgbWFya0dyb3VwID0gcGFyc2VNYXJrR3JvdXAobW9kZWwpO1xuICAgICAgYXNzZXJ0LmlzRGVmaW5lZChtYXJrR3JvdXBbMF0udHJhbnNmb3JtKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXJrR3JvdXBbMF0udHJhbnNmb3JtWzBdLnR5cGUsIEdFT1NIQVBFKTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdBZ2dyZWdhdGVkIEJhciB3aXRoIGEgY29sb3Igd2l0aCBiaW5uZWQgeCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJDb3N0X19PdGhlclwiLCBcImFnZ3JlZ2F0ZVwiOiBcInN1bVwifSxcbiAgICAgICAgICBcInlcIjoge1wiYmluXCI6IHRydWUsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZpZWxkXCI6IFwiQ29zdF9fVG90YWxfJFwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInR5cGVcIjogXCJvcmRpbmFsXCIsIFwiZmllbGRcIjogXCJFZmZlY3RfX0Ftb3VudF9vZl9kYW1hZ2VcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpdCgnc2hvdWxkIHVzZSBtYWluIHN0YWNrZWQgZGF0YSBzb3VyY2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cFswXS5mcm9tLmRhdGEsICdtYWluJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChtYXJrR3JvdXBbMF0uc3R5bGUsICdiYXInKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCBub3QgaGF2ZSBwb3N0IGVuY29kaW5nIHRyYW5zZm9ybScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFya0dyb3VwID0gcGFyc2VNYXJrR3JvdXAobW9kZWwpO1xuICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQobWFya0dyb3VwWzBdLnRyYW5zZm9ybSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdGYWNldGVkIGFnZ3JlZ2F0ZWQgQmFyIHdpdGggYSBjb2xvciB3aXRoIGJpbm5lZCB4JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWwoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge2ZpZWxkOiAnYScsIHR5cGU6ICdub21pbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcIkNvc3RfX090aGVyXCIsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImJpblwiOiB0cnVlLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcIkNvc3RfX1RvdGFsXyRcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcInR5cGVcIjogXCJvcmRpbmFsXCIsIFwiZmllbGRcIjogXCJFZmZlY3RfX0Ftb3VudF9vZl9kYW1hZ2VcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXQoJ3Nob3VsZCB1c2UgZmFjZXRlZCBkYXRhIHNvdXJjZScsICgpID0+IHtcbiAgICAgICAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICAgICAgICBtb2RlbC5wYXJzZUxheW91dFNpemUoKTtcblxuICAgICAgICBjb25zdCBtYXJrR3JvdXAgPSBwYXJzZU1hcmtHcm91cChtb2RlbC5jaGlsZCBhcyBVbml0TW9kZWwpO1xuICAgICAgICBhc3NlcnQuZXF1YWwobWFya0dyb3VwWzBdLmZyb20uZGF0YSwgJ2NoaWxkX21haW4nKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIG5vdCBoYXZlIHBvc3QgZW5jb2RpbmcgdHJhbnNmb3JtJywgKCkgPT4ge1xuICAgICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gICAgICAgIG1vZGVsLnBhcnNlTGF5b3V0U2l6ZSgpO1xuXG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsLmNoaWxkIGFzIFVuaXRNb2RlbCk7XG4gICAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChtYXJrR3JvdXBbMF0udHJhbnNmb3JtKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ0FnZ3JlZ2F0ZWQgYmFyJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiBcIkNvc3RfX090aGVyXCIsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJiaW5cIjogdHJ1ZSwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZmllbGRcIjogXCJDb3N0X19Ub3RhbF8kXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBtYWluIGFnZ3JlZ2F0ZWQgZGF0YSBzb3VyY2UnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hcmtHcm91cCA9IHBhcnNlTWFya0dyb3VwKG1vZGVsKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKG1hcmtHcm91cFswXS5mcm9tLmRhdGEsICdtYWluJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgaGF2ZSBwb3N0IGVuY29kaW5nIHRyYW5zZm9ybScsICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFya0dyb3VwID0gcGFyc2VNYXJrR3JvdXAobW9kZWwpO1xuICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQobWFya0dyb3VwWzBdLnRyYW5zZm9ybSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFNvcnQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBvcmRlciBieSBvcmRlciBmaWVsZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9kcml2aW5nLmpzb25cIn0sXG4gICAgICAgIFwibWFya1wiOiBcImxpbmVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwibWlsZXNcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic2NhbGVcIjoge1wiemVyb1wiOiBmYWxzZX19LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImdhc1wiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzY2FsZVwiOiB7XCJ6ZXJvXCI6IGZhbHNlfX0sXG4gICAgICAgICAgXCJvcmRlclwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGdldFNvcnQobW9kZWwpLCB7XG4gICAgICAgIGZpZWxkOiBbJ2RhdHVtW1xcXCJ5ZWFyXFxcIl0nXSxcbiAgICAgICAgb3JkZXI6IFsnYXNjZW5kaW5nJ11cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIG5vIHNvcnQgaWYgb3JkZXIgPSB7dmFsdWU6IG51bGx9JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2RyaXZpbmcuanNvblwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJtaWxlc1wiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzY2FsZVwiOiB7XCJ6ZXJvXCI6IGZhbHNlfX0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiZ2FzXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcInNjYWxlXCI6IHtcInplcm9cIjogZmFsc2V9fSxcbiAgICAgICAgICBcIm9yZGVyXCI6IHtcInZhbHVlXCI6IG51bGx9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGdldFNvcnQobW9kZWwpLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvcmRlciBieSB4IGJ5IGRlZmF1bHQgaWYgeCBpcyB0aGUgZGltZW5zaW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL21vdmllcy5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImJpblwiOiB7XCJtYXhiaW5zXCI6IDEwfSxcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJJTURCX1JhdGluZ1wiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcIlNvdXJjZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibm9taW5hbFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChnZXRTb3J0KG1vZGVsKSwge1xuICAgICAgICBmaWVsZDogJ2RhdHVtW1xcXCJiaW5fbWF4Ymluc18xMF9JTURCX1JhdGluZ1xcXCJdJyxcbiAgICAgICAgb3JkZXI6ICdkZXNjZW5kaW5nJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBvcmRlciBieSBhIG1pc3NpbmcgZGltZW5zaW9uJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL21vdmllcy5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcIlNvdXJjZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwibm9taW5hbFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChnZXRTb3J0KG1vZGVsKSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhdGhHcm91cGluZ0ZpZWxkcygpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZpZWxkcyBmb3IgdW5hZ2dyZWdhdGUgZGV0YWlsLCBjb2xvciwgc2l6ZSwgb3BhY2l0eSBmaWVsZERlZnMuJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFtERVRBSUwsIENPTE9SLCBTSVpFLCBPUEFDSVRZXSkge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHBhdGhHcm91cGluZ0ZpZWxkcygnbGluZScsIHtbY2hhbm5lbF06IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9fSksXG4gICAgICAgICAgWydhJ11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBhIGZpZWxkIGZvciBzaXplIG9mIGEgdHJhaWwgbWFyay4nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICBwYXRoR3JvdXBpbmdGaWVsZHMoJ3RyYWlsJywge3NpemU6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9fSksXG4gICAgICAgIFtdXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIGZpZWxkcyBmb3IgYWdncmVnYXRlIGRldGFpbCwgY29sb3IsIHNpemUsIG9wYWNpdHkgZmllbGREZWZzLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbREVUQUlMLCBDT0xPUiwgU0laRSwgT1BBQ0lUWV0pIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXRoR3JvdXBpbmdGaWVsZHMoJ2xpbmUnLCB7W2NoYW5uZWxdOiB7YWdncmVnYXRlOiAnbWVhbicsIGZpZWxkOiAnYScsIHR5cGU6ICdub21pbmFsJ319KSxcbiAgICAgICAgICBbXSxcbiAgICAgICAgICBjaGFubmVsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb25kaXRpb24gZGV0YWlsIGZpZWxkcyBmb3IgY29sb3IsIHNpemUsIHNoYXBlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFtDT0xPUiwgU0laRSwgT1BBQ0lUWV0pIHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXRoR3JvdXBpbmdGaWVsZHMoJ2xpbmUnLCB7W2NoYW5uZWxdOiB7XG4gICAgICAgICAgICBjb25kaXRpb246IHtzZWxlY3Rpb246ICdzZWwnLCBmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9XG4gICAgICAgICAgfX0pLFxuICAgICAgICAgIFsnYSddXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCByZXR1cm4gZXJyb3JzIGZvciBhbGwgY2hhbm5lbHMnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgVU5JVF9DSEFOTkVMUykge1xuICAgICAgICBhc3NlcnQuZG9lc05vdFRocm93KFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHBhdGhHcm91cGluZ0ZpZWxkcygnbGluZScsIHtcbiAgICAgICAgICAgICAgW2NoYW5uZWxdOiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/mixins.test.d.ts b/build/test/compile/mark/mixins.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/mixins.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/mixins.test.js b/build/test/compile/mark/mixins.test.js new file mode 100644 index 0000000000..480259530a --- /dev/null +++ b/build/test/compile/mark/mixins.test.js @@ -0,0 +1,232 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var mixins_1 = require("../../../src/compile/mark/mixins"); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../util"); +describe('compile/mark/mixins', function () { + describe('color()', function () { + it('color should be mapped to fill for bar', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "bar", + "encoding": { + "x": { + "field": "gender", "type": "nominal", + "scale": { "rangeStep": 6 }, + "axis": null + }, + "color": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + } + }, + "data": { "url": "data/population.json" } + }); + var colorMixins = mixins_1.color(model); + chai_1.assert.deepEqual(colorMixins.fill, { "field": "gender", "scale": "color" }); + }); + it('color should be mapped to stroke for point', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { + "field": "gender", "type": "nominal", + "scale": { "rangeStep": 6 }, + "axis": null + }, + "color": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + } + }, + "data": { "url": "data/population.json" } + }); + var colorMixins = mixins_1.color(model); + chai_1.assert.deepEqual(colorMixins.stroke, { "field": "gender", "scale": "color" }); + chai_1.assert.propertyVal(colorMixins.fill, 'value', "transparent"); + }); + it('add transparent fill when stroke is encoded', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { + "field": "gender", "type": "nominal", + "scale": { "rangeStep": 6 }, + "axis": null + }, + "stroke": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + } + }, + "data": { "url": "data/population.json" } + }); + var colorMixins = mixins_1.color(model); + chai_1.assert.deepEqual(colorMixins.stroke, { "field": "gender", "scale": "stroke" }); + chai_1.assert.propertyVal(colorMixins.fill, 'value', "transparent"); + }); + it('ignores color if fill is specified', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { + "field": "gender", "type": "nominal", + "scale": { "rangeStep": 6 }, + "axis": null + }, + "fill": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + }, + "color": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + } + }, + "data": { "url": "data/population.json" } + }); + var colorMixins = mixins_1.color(model); + chai_1.assert.isUndefined(colorMixins.stroke); + chai_1.assert.deepEqual(colorMixins.fill, { "field": "gender", "scale": "fill" }); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('encoding', { fill: true })); + })); + it('ignores color property if fill is specified', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": { "type": "point", "color": "red" }, + "encoding": { + "x": { + "field": "gender", "type": "nominal", + "scale": { "rangeStep": 6 }, + "axis": null + }, + "fill": { + "field": "gender", "type": "nominal", + "scale": { "range": ["#EA98D2", "#659CCA"] } + } + }, + "data": { "url": "data/population.json" } + }); + var colorMixins = mixins_1.color(model); + chai_1.assert.isUndefined(colorMixins.stroke); + chai_1.assert.deepEqual(colorMixins.fill, { "field": "gender", "scale": "fill" }); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('property', { fill: true })); + })); + it('should apply stroke property over color property', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": { "type": "point", "color": "red", "stroke": "blue" }, + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + } + }); + var props = mixins_1.color(model); + chai_1.assert.deepEqual(props.stroke, { value: "blue" }); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('property', { stroke: true })); + })); + it('should apply ignore color property when fill is specified', log.wrap(function (logger) { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": { "type": "point", "color": "red", "fill": "blue" }, + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + } + }); + var props = mixins_1.color(model); + chai_1.assert.isUndefined(props.stroke); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('property', { fill: true })); + })); + it('should apply color property', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": { "type": "point", "color": "red" }, + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + } + }); + var props = mixins_1.color(model); + chai_1.assert.deepEqual(props.stroke, { value: "red" }); + }); + it('should apply color from mark-specific config over general mark config', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + }, + "config": { "mark": { "color": "blue" }, "point": { "color": "red" } } + }); + var props = mixins_1.color(model); + chai_1.assert.deepEqual(props.stroke, { value: "red" }); + }); + it('should apply stroke mark config over color mark config', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + }, + "config": { "mark": { "color": "red", "stroke": "blue" } } + }); + var props = mixins_1.color(model); + chai_1.assert.deepEqual(props.stroke, { value: "blue" }); + }); + it('should apply stroke mark config over color mark config', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + }, + "config": { "point": { "color": "red", "stroke": "blue" } } + }); + var props = mixins_1.color(model); + chai_1.assert.deepEqual(props.stroke, { value: "blue" }); + }); + }); + describe('tooltip()', function () { + it('generates tooltip object signal for an array of tooltip fields', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "tooltip": [ + { "field": "Horsepower", "type": "quantitative" }, + { "field": "Acceleration", "type": "quantitative" } + ] + } + }); + var props = mixins_1.tooltip(model); + chai_1.assert.deepEqual(props.tooltip, { signal: '{"Horsepower": format(datum["Horsepower"], ""), "Acceleration": format(datum["Acceleration"], "")}' }); + }); + }); + describe('midPoint()', function () { + it('should return correctly for lat/lng', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { + "url": "data/zipcodes.csv", + "format": { + "type": "csv" + } + }, + "mark": "point", + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + }); + [channel_1.X, channel_1.Y].forEach(function (channel) { + var mixins = mixins_1.pointPosition(channel, model, 'zeroOrMin'); + chai_1.assert.equal(mixins[channel].field, model.getName(channel)); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvbWFyay9taXhpbnMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLGdEQUEwQztBQUMxQywyREFBK0U7QUFDL0UsNERBQXdDO0FBQ3hDLG1DQUFnRTtBQUVoRSxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNsQixFQUFFLENBQUMsd0NBQXdDLEVBQUU7WUFDM0MsSUFBTSxLQUFLLEdBQUcsMkNBQW9DLENBQUM7Z0JBQ2pELE1BQU0sRUFBRSxLQUFLO2dCQUNiLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUU7d0JBQ0gsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUzt3QkFDcEMsT0FBTyxFQUFFLEVBQUMsV0FBVyxFQUFFLENBQUMsRUFBQzt3QkFDekIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVM7d0JBQ3BDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBQztxQkFDM0M7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFDO2FBQ3hDLENBQUMsQ0FBQztZQUVILElBQU0sV0FBVyxHQUFHLGNBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxhQUFNLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLElBQU0sS0FBSyxHQUFH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QUM7WUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtYLCBZfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQge2NvbG9yLCBwb2ludFBvc2l0aW9uLCB0b29sdGlwfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL21peGlucyc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdjb21waWxlL21hcmsvbWl4aW5zJywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29sb3IoKScsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdjb2xvciBzaG91bGQgYmUgbWFwcGVkIHRvIGZpbGwgZm9yIGJhcicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJiYXJcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJyYW5nZVN0ZXBcIjogNn0sXG4gICAgICAgICAgICBcImF4aXNcIjogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiZ2VuZGVyXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIixcbiAgICAgICAgICAgIFwic2NhbGVcIjoge1wicmFuZ2VcIjogW1wiI0VBOThEMlwiLCBcIiM2NTlDQ0FcIl19XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBjb2xvck1peGlucyA9IGNvbG9yKG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoY29sb3JNaXhpbnMuZmlsbCwge1wiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJzY2FsZVwiOiBcImNvbG9yXCJ9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb2xvciBzaG91bGQgYmUgbWFwcGVkIHRvIHN0cm9rZSBmb3IgcG9pbnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiZ2VuZGVyXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIixcbiAgICAgICAgICAgIFwic2NhbGVcIjoge1wicmFuZ2VTdGVwXCI6IDZ9LFxuICAgICAgICAgICAgXCJheGlzXCI6IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcImdlbmRlclwiLCBcInR5cGVcIjogXCJub21pbmFsXCIsXG4gICAgICAgICAgICBcInNjYWxlXCI6IHtcInJhbmdlXCI6IFtcIiNFQTk4RDJcIiwgXCIjNjU5Q0NBXCJdfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29sb3JNaXhpbnMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGNvbG9yTWl4aW5zLnN0cm9rZSwge1wiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJzY2FsZVwiOiBcImNvbG9yXCJ9KTtcbiAgICAgIGFzc2VydC5wcm9wZXJ0eVZhbChjb2xvck1peGlucy5maWxsLCAndmFsdWUnLCBcInRyYW5zcGFyZW50XCIpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2FkZCB0cmFuc3BhcmVudCBmaWxsIHdoZW4gc3Ryb2tlIGlzIGVuY29kZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiZ2VuZGVyXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIixcbiAgICAgICAgICAgIFwic2NhbGVcIjoge1wicmFuZ2VTdGVwXCI6IDZ9LFxuICAgICAgICAgICAgXCJheGlzXCI6IG51bGxcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic3Ryb2tlXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJyYW5nZVwiOiBbXCIjRUE5OEQyXCIsIFwiIzY1OUNDQVwiXX1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbG9yTWl4aW5zID0gY29sb3IobW9kZWwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChjb2xvck1peGlucy5zdHJva2UsIHtcImZpZWxkXCI6IFwiZ2VuZGVyXCIsIFwic2NhbGVcIjogXCJzdHJva2VcIn0pO1xuICAgICAgYXNzZXJ0LnByb3BlcnR5VmFsKGNvbG9yTWl4aW5zLmZpbGwsICd2YWx1ZScsIFwidHJhbnNwYXJlbnRcIik7XG4gICAgfSk7XG5cbiAgICBpdCgnaWdub3JlcyBjb2xvciBpZiBmaWxsIGlzIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJyYW5nZVN0ZXBcIjogNn0sXG4gICAgICAgICAgICBcImF4aXNcIjogbnVsbFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJmaWxsXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJyYW5nZVwiOiBbXCIjRUE5OEQyXCIsIFwiIzY1OUNDQVwiXX1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcImdlbmRlclwiLCBcInR5cGVcIjogXCJub21pbmFsXCIsXG4gICAgICAgICAgICBcInNjYWxlXCI6IHtcInJhbmdlXCI6IFtcIiNFQTk4RDJcIiwgXCIjNjU5Q0NBXCJdfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29sb3JNaXhpbnMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQoY29sb3JNaXhpbnMuc3Ryb2tlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoY29sb3JNaXhpbnMuZmlsbCwge1wiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJzY2FsZVwiOiBcImZpbGxcIn0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcignZW5jb2RpbmcnLCB7ZmlsbDogdHJ1ZX0pKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnaWdub3JlcyBjb2xvciBwcm9wZXJ0eSBpZiBmaWxsIGlzIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJwb2ludFwiLCBcImNvbG9yXCI6IFwicmVkXCJ9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcImdlbmRlclwiLCBcInR5cGVcIjogXCJub21pbmFsXCIsXG4gICAgICAgICAgICBcInNjYWxlXCI6IHtcInJhbmdlU3RlcFwiOiA2fSxcbiAgICAgICAgICAgIFwiYXhpc1wiOiBudWxsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImZpbGxcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcImdlbmRlclwiLCBcInR5cGVcIjogXCJub21pbmFsXCIsXG4gICAgICAgICAgICBcInNjYWxlXCI6IHtcInJhbmdlXCI6IFtcIiNFQTk4RDJcIiwgXCIjNjU5Q0NBXCJdfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29sb3JNaXhpbnMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQoY29sb3JNaXhpbnMuc3Ryb2tlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoY29sb3JNaXhpbnMuZmlsbCwge1wiZmllbGRcIjogXCJnZW5kZXJcIiwgXCJzY2FsZVwiOiBcImZpbGxcIn0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcigncHJvcGVydHknLCB7ZmlsbDogdHJ1ZX0pKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IHN0cm9rZSBwcm9wZXJ0eSBvdmVyIGNvbG9yIHByb3BlcnR5JywgbG9nLndyYXAoKGxvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcInBvaW50XCIsIFwiY29sb3JcIjogXCJyZWRcIiwgXCJzdHJva2VcIjogXCJibHVlXCJ9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHByb3BzID0gY29sb3IobW9kZWwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zdHJva2UsIHt2YWx1ZTogXCJibHVlXCJ9KTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmRyb3BwaW5nQ29sb3IoJ3Byb3BlcnR5Jywge3N0cm9rZTogdHJ1ZX0pKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IGlnbm9yZSBjb2xvciBwcm9wZXJ0eSB3aGVuIGZpbGwgaXMgc3BlY2lmaWVkJywgbG9nLndyYXAoKGxvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcInBvaW50XCIsIFwiY29sb3JcIjogXCJyZWRcIiwgXCJmaWxsXCI6IFwiYmx1ZVwifSxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IGNvbG9yKG1vZGVsKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy5zdHJva2UpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcigncHJvcGVydHknLCB7ZmlsbDogdHJ1ZX0pKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IGNvbG9yIHByb3BlcnR5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcInBvaW50XCIsIFwiY29sb3JcIjogXCJyZWRcIn0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk1pbGVzX3Blcl9HYWxsb25cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZSwge3ZhbHVlOiBcInJlZFwifSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IGNvbG9yIGZyb20gbWFyay1zcGVjaWZpYyBjb25maWcgb3ZlciBnZW5lcmFsIG1hcmsgY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9LFxuICAgICAgICBcImNvbmZpZ1wiOiB7XCJtYXJrXCI6IHtcImNvbG9yXCI6IFwiYmx1ZVwifSwgXCJwb2ludFwiOiB7XCJjb2xvclwiOiBcInJlZFwifX1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZSwge3ZhbHVlOiBcInJlZFwifSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGFwcGx5IHN0cm9rZSBtYXJrIGNvbmZpZyBvdmVyIGNvbG9yIG1hcmsgY29uZmlnJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9LFxuICAgICAgICBcImNvbmZpZ1wiOiB7XCJtYXJrXCI6IHtcImNvbG9yXCI6IFwicmVkXCIsIFwic3Ryb2tlXCI6IFwiYmx1ZVwifX1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBjb2xvcihtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZSwge3ZhbHVlOiBcImJsdWVcIn0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhcHBseSBzdHJva2UgbWFyayBjb25maWcgb3ZlciBjb2xvciBtYXJrIGNvbmZpZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1wicG9pbnRcIjoge1wiY29sb3JcIjogXCJyZWRcIiwgXCJzdHJva2VcIjogXCJibHVlXCJ9fVxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IGNvbG9yKG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuc3Ryb2tlLCB7dmFsdWU6IFwiYmx1ZVwifSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0b29sdGlwKCknLCAoKSA9PiB7XG4gICAgaXQoJ2dlbmVyYXRlcyB0b29sdGlwIG9iamVjdCBzaWduYWwgZm9yIGFuIGFycmF5IG9mIHRvb2x0aXAgZmllbGRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInRvb2x0aXBcIjogW1xuICAgICAgICAgICAge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIHtcImZpZWxkXCI6IFwiQWNjZWxlcmF0aW9uXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9wcyA9IHRvb2x0aXAobW9kZWwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy50b29sdGlwLCB7c2lnbmFsOiAne1wiSG9yc2Vwb3dlclwiOiBmb3JtYXQoZGF0dW1bXCJIb3JzZXBvd2VyXCJdLCBcIlwiKSwgXCJBY2NlbGVyYXRpb25cIjogZm9ybWF0KGRhdHVtW1wiQWNjZWxlcmF0aW9uXCJdLCBcIlwiKX0nfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtaWRQb2ludCgpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3RseSBmb3IgbGF0L2xuZycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICBcInVybFwiOiBcImRhdGEvemlwY29kZXMuY3N2XCIsXG4gICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY3N2XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwibG9uZ2l0dWRlXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb25naXR1ZGVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImxhdGl0dWRlXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJsYXRpdHVkZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBbWCwgWV0uZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICBjb25zdCBtaXhpbnMgPSBwb2ludFBvc2l0aW9uKGNoYW5uZWwsIG1vZGVsLCAnemVyb09yTWluJyk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKG1peGluc1tjaGFubmVsXS5maWVsZCwgbW9kZWwuZ2V0TmFtZShjaGFubmVsKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/mark/point.test.d.ts b/build/test/compile/mark/point.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/point.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/point.test.js b/build/test/compile/mark/point.test.js new file mode 100644 index 0000000000..d14e1e7c34 --- /dev/null +++ b/build/test/compile/mark/point.test.js @@ -0,0 +1,275 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var point_1 = require("../../../src/compile/mark/point"); +var mark_1 = require("../../../src/mark"); +var util_1 = require("../../util"); +describe('Mark: Point', function () { + function pointXY(moreEncoding) { + if (moreEncoding === void 0) { moreEncoding = {}; } + return { + "mark": "point", + "encoding": tslib_1.__assign({ "x": { "field": "year", "type": "ordinal" }, "y": { "field": "yield", "type": "quantitative" } }, moreEncoding), + "data": { "url": "data/barley.json" } + }; + } + describe('with x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { "x": { "field": "year", "type": "ordinal" } }, + "data": { "url": "data/barley.json" } + }); + var props = point_1.point.encodeEntry(model); + it('should be centered on y', function () { + chai_1.assert.deepEqual(props.y, { + mult: 0.5, + signal: 'height' + }); + }); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year' }); + }); + }); + describe('with stacked x', function () { + // This is a simplified example for stacked point. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = point_1.point.encodeEntry(model); + it('should use stack_end on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'sum_a_end' }); + }); + }); + describe('with y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { "y": { "field": "year", "type": "ordinal" } }, + "data": { "url": "data/barley.json" } + }); + var props = point_1.point.encodeEntry(model); + it('should be centered on x', function () { + chai_1.assert.deepEqual(props.x, { + mult: 0.5, + signal: 'width' + }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'year' }); + }); + }); + describe('with stacked y', function () { + // This is a simplified example for stacked point. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "y": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = point_1.point.encodeEntry(model); + it('should use stack_end on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'sum_a_end' }); + }); + }); + describe('with x and y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(pointXY()); + var props = point_1.point.encodeEntry(model); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'year' }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'yield' }); + }); + it('should be an unfilled circle', function () { + chai_1.assert.deepEqual(props.fill, { value: 'transparent' }); + chai_1.assert.deepEqual(props.stroke, { value: mark_1.defaultMarkConfig.color }); + }); + }); + describe('with band x and quantitative y', function () { + it('should offset band position by half band', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/barley.json" }, + "mark": "point", + "encoding": { + "x": { "field": "year", "type": "ordinal", "scale": { "type": "band" } }, + "y": { "field": "yield", "type": "quantitative" } + } + }); + var props = point_1.point.encodeEntry(model); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'year', band: 0.5 }); + }); + }); + describe('with x, y, size', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(pointXY({ + "size": { "aggregate": "count", "type": "quantitative" } + })); + var props = point_1.point.encodeEntry(model); + it('should have scale for size', function () { + chai_1.assert.deepEqual(props.size, { scale: channel_1.SIZE, field: 'count_*' }); + }); + }); + describe('with x, y, color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(pointXY({ + "color": { "field": "yield", "type": "quantitative" } + })); + var props = point_1.point.encodeEntry(model); + it('should have scale for color', function () { + chai_1.assert.deepEqual(props.stroke, { scale: channel_1.COLOR, field: 'yield' }); + }); + }); + describe('with x, y, and condition-only color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(tslib_1.__assign({}, pointXY({ + "color": { "condition": { "selection": "test", "field": "yield", "type": "quantitative" } } + }), { selection: { test: { type: 'single' } } })); + model.parseSelection(); + var props = point_1.point.encodeEntry(model); + it('should have one condition for color with scale for "yield"', function () { + chai_1.assert.isArray(props.stroke); + chai_1.assert.equal(props.stroke['length'], 2); + chai_1.assert.equal(props.stroke[0].scale, channel_1.COLOR); + chai_1.assert.equal(props.stroke[0].field, 'yield'); + }); + }); + describe('with x, y, and condition-only color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(tslib_1.__assign({}, pointXY({ + "color": { "condition": { "test": "true", "field": "yield", "type": "quantitative" } } + }))); + model.parseSelection(); + var props = point_1.point.encodeEntry(model); + it('should have one condition for color with scale for "yield"', function () { + chai_1.assert.isArray(props.stroke); + chai_1.assert.equal(props.stroke['length'], 2); + chai_1.assert.equal(props.stroke[0].test, "true"); + chai_1.assert.equal(props.stroke[1].value, "#4c78a8"); + }); + }); + describe('with x, y, shape', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(pointXY({ + "shape": { "field": "site", "type": "nominal" } + })); + var props = point_1.point.encodeEntry(model); + it('should have scale for shape', function () { + chai_1.assert.deepEqual(props.shape, { scale: channel_1.SHAPE, field: 'site' }); + }); + }); + describe('with constant color, shape, and size', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize(pointXY({ + "shape": { "value": "circle" }, + "color": { "value": "red" }, + "size": { "value": 23 } + })); + var props = point_1.point.encodeEntry(model); + it('should correct shape, color and size', function () { + chai_1.assert.deepEqual(props.shape, { value: "circle" }); + chai_1.assert.deepEqual(props.stroke, { value: "red" }); + chai_1.assert.deepEqual(props.size, { value: 23 }); + }); + }); + describe('with tooltip', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "tooltip": { "value": "foo" } + } + }); + var props = point_1.point.encodeEntry(model); + it('should pass tooltip value to encoding', function () { + chai_1.assert.deepEqual(props.tooltip, { value: "foo" }); + }); + }); + describe('with href', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "point", + "encoding": { + "href": { "value": "https://idl.cs.washington.edu/" } + } + }); + var props = point_1.point.encodeEntry(model); + it('should pass href value to encoding', function () { + chai_1.assert.deepEqual(props.href, { value: 'https://idl.cs.washington.edu/' }); + }); + }); +}); +describe('Mark: Square', function () { + it('should have correct shape', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "square", + "encoding": { + "color": { "value": "blue" } + } + }); + var props = point_1.square.encodeEntry(model); + chai_1.assert.propertyVal(props.shape, 'value', 'square'); + }); + it('should be filled by default', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "square", + "encoding": { + "color": { "value": "blue" } + } + }); + var props = point_1.square.encodeEntry(model); + chai_1.assert.propertyVal(props.fill, 'value', 'blue'); + }); + it('with config.mark.filled:false should have transparent fill', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "square", + "encoding": { + "color": { "value": "blue" } + }, + "config": { + "mark": { + "filled": false + } + } + }); + var props = point_1.square.encodeEntry(model); + chai_1.assert.propertyVal(props.stroke, 'value', 'blue'); + chai_1.assert.propertyVal(props.fill, 'value', 'transparent'); + }); +}); +describe('Mark: Circle', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "circle", + "encoding": { + "color": { "value": "blue" } + } + }); + var props = point_1.circle.encodeEntry(model); + it('should have correct shape', function () { + chai_1.assert.propertyVal(props.shape, 'value', 'circle'); + }); + it('should be filled by default', function () { + chai_1.assert.propertyVal(props.fill, 'value', 'blue'); + }); + it('with config.mark.filled:false should have transparent fill', function () { + var filledCircleModel = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "circle", + "encoding": { + "color": { "value": "blue" } + }, + "config": { + "mark": { + "filled": false + } + } + }); + var filledCircleProps = point_1.circle.encodeEntry(filledCircleModel); + chai_1.assert.propertyVal(filledCircleProps.stroke, 'value', 'blue'); + chai_1.assert.propertyVal(filledCircleProps.fill, 'value', 'transparent'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9tYXJrL3BvaW50LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUM1QixnREFBOEQ7QUFDOUQseURBQXNFO0FBRXRFLDBDQUFvRDtBQUVwRCxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUV0QixpQkFBaUIsWUFBbUM7UUFBbkMsNkJBQUEsRUFBQSxpQkFBbUM7UUFDbEQsT0FBTztZQUNMLE1BQU0sRUFBRSxPQUFPO1lBQ2YsVUFBVSxxQkFDTixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsRUFDekMsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDLElBQzVDLFlBQVksQ0FDbEI7WUFDRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUM7U0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsUUFBUSxFQUFFO1FBQ2pCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxPQUFPO1lBQ2YsVUFBVSxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLEVBQUM7WUFDdkQsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGtCQUFrQixFQUFDO1NBQ3BDLENBQUMsQ0FBQztRQUVILElBQU0sS0FBSyxHQUFHLGFBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkMsRUFBRSxDQUFDLHlCQUF5QixFQUFFO1lBQzVCLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxFQUFFLEdBQUc7Z0JBQ1Qs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QWlCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7Q09MT1IsIFNIQVBFLCBTSVpFLCBYLCBZfSBmcm9tICcuLi8uLi8uLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQge2NpcmNsZSwgcG9pbnQsIHNxdWFyZX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9wb2ludCc7XG5pbXBvcnQge0VuY29kaW5nfSBmcm9tICcuLi8uLi8uLi9zcmMvZW5jb2RpbmcnO1xuaW1wb3J0IHtkZWZhdWx0TWFya0NvbmZpZ30gZnJvbSAnLi4vLi4vLi4vc3JjL21hcmsnO1xuaW1wb3J0IHtOb3JtYWxpemVkVW5pdFNwZWN9IGZyb20gJy4uLy4uLy4uL3NyYy9zcGVjJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ01hcms6IFBvaW50JywgZnVuY3Rpb24oKSB7XG5cbiAgZnVuY3Rpb24gcG9pbnRYWShtb3JlRW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4gPSB7fSk6IE5vcm1hbGl6ZWRVbml0U3BlYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ5ZWFyXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIC4uLm1vcmVFbmNvZGluZyxcbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifVxuICAgIH07XG4gIH1cblxuICBkZXNjcmliZSgnd2l0aCB4JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1wieFwiOiB7XCJmaWVsZFwiOiBcInllYXJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifX0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGNlbnRlcmVkIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge1xuICAgICAgICBtdWx0OiAwLjUsXG4gICAgICAgIHNpZ25hbDogJ2hlaWdodCdcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzY2FsZSBvbiB4JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogWCwgZmllbGQ6ICd5ZWFyJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCBzdGFja2VkIHgnLCBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCBleGFtcGxlIGZvciBzdGFja2VkIHBvaW50LlxuICAgIC8vIEluIHJlYWxpdHkgdGhpcyB3aWxsIGJlIHVzZWQgYXMgc3RhY2tlZCdzIG92ZXJsYXllZCBtYXJrZXJcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJzdGFja1wiOiBcInplcm9cIn1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcG9pbnQuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc3RhY2tfZW5kIG9uIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ3N1bV9hX2VuZCd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcInlcIjoge1wiZmllbGRcIjogXCJ5ZWFyXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn19LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcG9pbnQuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBjZW50ZXJlZCBvbiB4JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtcbiAgICAgICAgbXVsdDogMC41LFxuICAgICAgICBzaWduYWw6ICd3aWR0aCdcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzY2FsZSBvbiB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogWSwgZmllbGQ6ICd5ZWFyJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCBzdGFja2VkIHknLCBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCBleGFtcGxlIGZvciBzdGFja2VkIHBvaW50LlxuICAgIC8vIEluIHJlYWxpdHkgdGhpcyB3aWxsIGJlIHVzZWQgYXMgc3RhY2tlZCdzIG92ZXJsYXllZCBtYXJrZXJcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJzdGFja1wiOiBcInplcm9cIn1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcG9pbnQuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc3RhY2tfZW5kIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ3N1bV9hX2VuZCd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeCBhbmQgeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHBvaW50WFkoKSk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ3llYXInfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ3lpZWxkJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBhbiB1bmZpbGxlZCBjaXJjbGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuZmlsbCwge3ZhbHVlOiAndHJhbnNwYXJlbnQnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZSwge3ZhbHVlOiBkZWZhdWx0TWFya0NvbmZpZy5jb2xvcn0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCBiYW5kIHggYW5kIHF1YW50aXRhdGl2ZSB5JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgb2Zmc2V0IGJhbmQgcG9zaXRpb24gYnkgaGFsZiBiYW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOntcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ5ZWFyXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIiwgXCJzY2FsZVwiOiB7XCJ0eXBlXCI6IFwiYmFuZFwifX0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ3llYXInLCBiYW5kOiAwLjV9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeCwgeSwgc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZShwb2ludFhZKHtcbiAgICAgIFwic2l6ZVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICB9KSk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgZm9yIHNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnNpemUsIHtzY2FsZTogU0laRSwgZmllbGQ6ICdjb3VudF8qJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB4LCB5LCBjb2xvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZShwb2ludFhZKHtcbiAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICB9KSk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgZm9yIGNvbG9yJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zdHJva2UsIHtzY2FsZTogQ09MT1IsIGZpZWxkOiAneWllbGQnfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHgsIHksIGFuZCBjb25kaXRpb24tb25seSBjb2xvcicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAuLi5wb2ludFhZKHtcbiAgICAgICAgXCJjb2xvclwiOiB7XCJjb25kaXRpb25cIjoge1wic2VsZWN0aW9uXCI6IFwidGVzdFwiLCBcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9fVxuICAgICAgfSksXG4gICAgICBzZWxlY3Rpb246IHt0ZXN0OiB7dHlwZTogJ3NpbmdsZSd9fVxuICAgIH0pO1xuICAgIG1vZGVsLnBhcnNlU2VsZWN0aW9uKCk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgb25lIGNvbmRpdGlvbiBmb3IgY29sb3Igd2l0aCBzY2FsZSBmb3IgXCJ5aWVsZFwiJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmlzQXJyYXkocHJvcHMuc3Ryb2tlKTtcbiAgICAgIGFzc2VydC5lcXVhbChwcm9wcy5zdHJva2VbJ2xlbmd0aCddLCAyKTtcbiAgICAgIGFzc2VydC5lcXVhbChwcm9wcy5zdHJva2VbMF0uc2NhbGUsIENPTE9SKTtcbiAgICAgIGFzc2VydC5lcXVhbChwcm9wcy5zdHJva2VbMF0uZmllbGQsICd5aWVsZCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB4LCB5LCBhbmQgY29uZGl0aW9uLW9ubHkgY29sb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgLi4ucG9pbnRYWSh7XG4gICAgICAgIFwiY29sb3JcIjoge1wiY29uZGl0aW9uXCI6IHtcInRlc3RcIjogXCJ0cnVlXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn19XG4gICAgICB9KVxuICAgIH0pO1xuICAgIG1vZGVsLnBhcnNlU2VsZWN0aW9uKCk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgb25lIGNvbmRpdGlvbiBmb3IgY29sb3Igd2l0aCBzY2FsZSBmb3IgXCJ5aWVsZFwiJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmlzQXJyYXkocHJvcHMuc3Ryb2tlKTtcbiAgICAgIGFzc2VydC5lcXVhbChwcm9wcy5zdHJva2VbJ2xlbmd0aCddLCAyKTtcbiAgICAgIGFzc2VydC5lcXVhbChwcm9wcy5zdHJva2VbMF0udGVzdCwgXCJ0cnVlXCIpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHByb3BzLnN0cm9rZVsxXS52YWx1ZSwgXCIjNGM3OGE4XCIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB4LCB5LCBzaGFwZScsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZShwb2ludFhZKHtcbiAgICAgIFwic2hhcGVcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICB9KSk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgc2NhbGUgZm9yIHNoYXBlJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zaGFwZSwge3NjYWxlOiBTSEFQRSwgZmllbGQ6ICdzaXRlJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCBjb25zdGFudCBjb2xvciwgc2hhcGUsIGFuZCBzaXplJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUocG9pbnRYWSh7XG4gICAgICBcInNoYXBlXCI6IHtcInZhbHVlXCI6IFwiY2lyY2xlXCJ9LFxuICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiOiBcInJlZFwifSxcbiAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiAyM31cbiAgICB9KSk7XG4gICAgY29uc3QgcHJvcHMgPSBwb2ludC5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgaXQoJ3Nob3VsZCBjb3JyZWN0IHNoYXBlLCBjb2xvciBhbmQgc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuc2hhcGUsIHt2YWx1ZTogXCJjaXJjbGVcIn0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zdHJva2UsIHt2YWx1ZTogXCJyZWRcIn0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zaXplLCB7dmFsdWU6IDIzfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHRvb2x0aXAnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInRvb2x0aXBcIjoge1widmFsdWVcIjogXCJmb29cIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IHBvaW50LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgcGFzcyB0b29sdGlwIHZhbHVlIHRvIGVuY29kaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy50b29sdGlwLCB7dmFsdWU6IFwiZm9vXCJ9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggaHJlZicsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwiaHJlZlwiOiB7XCJ2YWx1ZVwiOiBcImh0dHBzOi8vaWRsLmNzLndhc2hpbmd0b24uZWR1L1wifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gcG9pbnQuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXNzIGhyZWYgdmFsdWUgdG8gZW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmhyZWYsIHt2YWx1ZTogJ2h0dHBzOi8vaWRsLmNzLndhc2hpbmd0b24uZWR1Lyd9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ01hcms6IFNxdWFyZScsIGZ1bmN0aW9uKCkge1xuICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBzaGFwZScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInNxdWFyZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJibHVlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSBzcXVhcmUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgYXNzZXJ0LnByb3BlcnR5VmFsKHByb3BzLnNoYXBlLCAndmFsdWUnLCAnc3F1YXJlJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZmlsbGVkIGJ5IGRlZmF1bHQnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJzcXVhcmVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwiYmx1ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gc3F1YXJlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGFzc2VydC5wcm9wZXJ0eVZhbChwcm9wcy5maWxsLCAndmFsdWUnLCAnYmx1ZScpO1xuICB9KTtcblxuICBpdCgnd2l0aCBjb25maWcubWFyay5maWxsZWQ6ZmFsc2Ugc2hvdWxkIGhhdmUgdHJhbnNwYXJlbnQgZmlsbCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInNxdWFyZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJibHVlXCJ9XG4gICAgICB9LFxuICAgICAgXCJjb25maWdcIiA6IHtcbiAgICAgICAgXCJtYXJrXCIgOiB7XG4gICAgICAgICAgXCJmaWxsZWRcIiA6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gc3F1YXJlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGFzc2VydC5wcm9wZXJ0eVZhbChwcm9wcy5zdHJva2UsICd2YWx1ZScsICdibHVlJyk7XG4gICAgYXNzZXJ0LnByb3BlcnR5VmFsKHByb3BzLmZpbGwsICd2YWx1ZScsICd0cmFuc3BhcmVudCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnTWFyazogQ2lyY2xlJywgZnVuY3Rpb24oKSB7XG4gIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJibHVlXCJ9XG4gICAgfVxuICB9KTtcbiAgY29uc3QgcHJvcHMgPSBjaXJjbGUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IHNoYXBlJywgZnVuY3Rpb24oKSB7XG4gICAgYXNzZXJ0LnByb3BlcnR5VmFsKHByb3BzLnNoYXBlLCAndmFsdWUnLCAnY2lyY2xlJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgZmlsbGVkIGJ5IGRlZmF1bHQnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQucHJvcGVydHlWYWwocHJvcHMuZmlsbCwgJ3ZhbHVlJywgJ2JsdWUnKTtcbiAgfSk7XG5cbiAgaXQoJ3dpdGggY29uZmlnLm1hcmsuZmlsbGVkOmZhbHNlIHNob3VsZCBoYXZlIHRyYW5zcGFyZW50IGZpbGwnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBmaWxsZWRDaXJjbGVNb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwiYmx1ZVwifVxuICAgICAgfSxcbiAgICAgIFwiY29uZmlnXCIgOiB7XG4gICAgICAgIFwibWFya1wiIDoge1xuICAgICAgICAgIFwiZmlsbGVkXCIgOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBmaWxsZWRDaXJjbGVQcm9wcyA9IGNpcmNsZS5lbmNvZGVFbnRyeShmaWxsZWRDaXJjbGVNb2RlbCk7XG5cbiAgICBhc3NlcnQucHJvcGVydHlWYWwoZmlsbGVkQ2lyY2xlUHJvcHMuc3Ryb2tlLCAndmFsdWUnLCAnYmx1ZScpO1xuICAgIGFzc2VydC5wcm9wZXJ0eVZhbChmaWxsZWRDaXJjbGVQcm9wcy5maWxsLCAndmFsdWUnLCAndHJhbnNwYXJlbnQnKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/mark/rect.test.d.ts b/build/test/compile/mark/rect.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/rect.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/rect.test.js b/build/test/compile/mark/rect.test.js new file mode 100644 index 0000000000..a9741cb8e9 --- /dev/null +++ b/build/test/compile/mark/rect.test.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable quotemark */ +var chai_1 = require("chai"); +var rect_1 = require("../../../src/compile/mark/rect"); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../util"); +describe('Mark: Rect', function () { + describe('simple vertical', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "x": { "field": "Origin", "type": "nominal" }, + "y": { "type": "quantitative", "field": 'Acceleration', "aggregate": "mean" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw bar, with y from zero to field value and x band', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Origin' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', value: 0 }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('simple horizontal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw bar from zero to field value and y band', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Origin' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('simple horizontal with size field', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "y": { "field": "Origin", "type": "nominal" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" }, + "size": { "aggregate": "mean", "field": "Horsepower", "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + log.wrap(function (localLogger) { + it('should draw bar from zero to field value and with band value for x/width', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Origin' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'mean_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', value: 0 }); + chai_1.assert.isUndefined(props.width); + }); + it('should throw warning', function () { + chai_1.assert.equal(localLogger.warns[0], log.message.cannotApplySizeToNonOrientedMark('rect')); + }); + }); + }); + describe('horizontal binned', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "y": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "x": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw bar with y and y2', function () { + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.height); + }); + }); + describe('vertical binned', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "x": { "bin": true, "field": 'Horsepower', "type": "quantitative" }, + "y": { "aggregate": "mean", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw bar with x and x2', function () { + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'bin_maxbins_10_Horsepower' }); + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'bin_maxbins_10_Horsepower_end' }); + chai_1.assert.isUndefined(props.width); + }); + }); + describe('simple ranged', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": 'data/cars.json' }, + "mark": "rect", + "encoding": { + "y": { "aggregate": "min", "field": 'Horsepower', "type": "quantitative" }, + "y2": { "aggregate": "max", "field": 'Horsepower', "type": "quantitative" }, + "x": { "aggregate": "min", "field": 'Acceleration', "type": "quantitative" }, + "x2": { "aggregate": "max", "field": 'Acceleration', "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw rectangle with x, x2, y, y2', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'min_Acceleration' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'max_Acceleration' }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'min_Horsepower' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'max_Horsepower' }); + }); + }); + describe('simple heatmap', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { "url": "data/cars.json" }, + "mark": "rect", + "encoding": { + "y": { "field": "Origin", "type": "ordinal" }, + "x": { "field": "Cylinders", "type": "ordinal" }, + "color": { "aggregate": "mean", "field": "Horsepower", "type": "quantitative" } + } + }); + var props = rect_1.rect.encodeEntry(model); + it('should draw rect with x and y bands', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'Cylinders' }); + chai_1.assert.deepEqual(props.width, { scale: 'x', band: true }); + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'Origin' }); + chai_1.assert.deepEqual(props.height, { scale: 'y', band: true }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvcmVjdC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhCQUE4QjtBQUM5Qiw2QkFBNEI7QUFDNUIsdURBQW9EO0FBQ3BELDREQUF3QztBQUN4QyxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLFlBQVksRUFBRTtJQUNyQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7UUFDMUIsSUFBTSxLQUFLLEdBQUcsMkNBQW9DLENBQUM7WUFDakQsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDO1lBQ2pDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFO2dCQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztnQkFDM0MsR0FBRyxFQUFFLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUM7YUFDNUU7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtZQUNoRSxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO1lBQ3pELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDeEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQyxDQUFDO1lBQ3BFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7WUFDbkQsYUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUM7WUFDakMsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO2dCQUMzQyxHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQzthQUM1RTtTQUNGLENBQUMsQ0FBQztRQUNILElBQU0sS0FBSyxHQUFHLFdBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsRUFBRSxDQUFDLHFEQUFxRCxFQUFFO1lBQ3hELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7WUFDekQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztZQUN6RCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBQyxDQUFDLENBQUM7WUFDcEUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztZQUNuRCxhQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLG1DQUFtQyxFQUFFO1FBQzVDLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztZQUNqQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7Z0JBQzNDLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMzRSxNQUFNLEVBQUUsRUFBQyxXQUFXLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQzthQUM3RTtTQUNGLENBQUMsQ0FBQztRQUNILElBQU0sS0FBSyxHQUFHLFdBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7WUFDbkIsRUFBRSxDQUFDLDBFQUEwRSxFQUFFO2dCQUM3RSxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDO2dCQUN6RCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2dCQUN6RCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBQyxDQUFDLENBQUM7Z0JBQ3BFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7Z0JBQ25ELGFBQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLHNCQUFzQixFQUFFO2dCQUN6QixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzNGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtRQUM1QixJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUM7WUFDakMsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7Z0JBQ2pFLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2FBQzVFO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBTSxLQUFLLEdBQUcsV0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxFQUFFLENBQUMsK0JBQStCLEVBQUU7WUFDbEMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsMkJBQTJCLEVBQUMsQ0FBQyxDQUFDO1lBQzdFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLCtCQUErQixFQUFDLENBQUMsQ0FBQztZQUNoRixhQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztZQUNqQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztnQkFDakUsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7YUFDNUU7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQywrQkFBK0IsRUFBRTtZQUNsQyxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBQyxDQUFDLENBQUM7WUFDN0UsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsK0JBQStCLEVBQUMsQ0FBQyxDQUFDO1lBQ2hGLGFBQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFHSCxRQUFRLENBQUMsZUFBZSxFQUFFO1FBQ3hCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztZQUNqQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQztnQkFDeEUsSUFBSSxFQUFFLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7Z0JBQ3pFLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMxRSxJQUFJLEVBQUUsRUFBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBQzthQUM1RTtTQUNGLENBQUMsQ0FBQztRQUNILElBQU0sS0FBSyxHQUFHLFdBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsRUFBRSxDQUFDLHlDQUF5QyxFQUFFO1lBQzVDLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQztZQUNuRSxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUM7WUFDcEUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO1lBQ2pFLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1FBQ3pCLElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztZQUNqQyxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRTtnQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7Z0JBQzNDLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztnQkFDOUMsT0FBTyxFQUFFLEVBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUM7YUFDOUU7U0FDRixDQUFDLENBQUM7UUFDSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRTtZQUN4QyxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO1lBQzVELGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7WUFDeEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztZQUN6RCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtyZWN0fSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3JlY3QnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uLy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyazogUmVjdCcsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnc2ltcGxlIHZlcnRpY2FsJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcInJlY3RcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSByZWN0LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyBiYXIsIHdpdGggeSBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIHggYmFuZCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdPcmlnaW4nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLndpZHRoLCB7c2NhbGU6ICd4JywgYmFuZDogdHJ1ZX0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogJ3knLCB2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLmhlaWdodCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaW1wbGUgaG9yaXpvbnRhbCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJyZWN0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gcmVjdC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIGZyb20gemVybyB0byBmaWVsZCB2YWx1ZSBhbmQgeSBiYW5kJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ09yaWdpbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7c2NhbGU6ICd5JywgYmFuZDogdHJ1ZX0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6ICd4JywgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCB2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3NpbXBsZSBob3Jpem9udGFsIHdpdGggc2l6ZSBmaWVsZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJyZWN0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJzaXplXCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIiwgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSByZWN0LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCBkcmF3IGJhciBmcm9tIHplcm8gdG8gZmllbGQgdmFsdWUgYW5kIHdpdGggYmFuZCB2YWx1ZSBmb3IgeC93aWR0aCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ09yaWdpbid9KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHtzY2FsZTogJ3knLCBiYW5kOiB0cnVlfSk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnbWVhbl9BY2NlbGVyYXRpb24nfSk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCB2YWx1ZTogMH0pO1xuICAgICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMud2lkdGgpO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdGhyb3cgd2FybmluZycsICgpPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmNhbm5vdEFwcGx5U2l6ZVRvTm9uT3JpZW50ZWRNYXJrKCdyZWN0JykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdob3Jpem9udGFsIGJpbm5lZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJyZWN0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImJpblwiOiB0cnVlLCBcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6ICdBY2NlbGVyYXRpb24nLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IHJlY3QuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IGJhciB3aXRoIHkgYW5kIHkyJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6ICd5JywgZmllbGQ6ICdiaW5fbWF4Ymluc18xMF9Ib3JzZXBvd2VyX2VuZCd9KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChwcm9wcy5oZWlnaHQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgYmlubmVkJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICAgIFwibWFya1wiOiBcInJlY3RcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYmluXCI6IHRydWUsIFwiZmllbGRcIjogJ0hvcnNlcG93ZXInLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gcmVjdC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGRyYXcgYmFyIHdpdGggeCBhbmQgeDInLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ2Jpbl9tYXhiaW5zXzEwX0hvcnNlcG93ZXJfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKHByb3BzLndpZHRoKTtcbiAgICB9KTtcbiAgfSk7XG5cblxuICBkZXNjcmliZSgnc2ltcGxlIHJhbmdlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgICBcIm1hcmtcIjogXCJyZWN0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLCBcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInkyXCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1heFwiLCBcImZpZWxkXCI6ICdIb3JzZXBvd2VyJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwibWluXCIsIFwiZmllbGRcIjogJ0FjY2VsZXJhdGlvbicsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4MlwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtYXhcIiwgXCJmaWVsZFwiOiAnQWNjZWxlcmF0aW9uJywgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSByZWN0LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgZHJhdyByZWN0YW5nbGUgd2l0aCB4LCB4MiwgeSwgeTInLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiAneCcsIGZpZWxkOiAnbWluX0FjY2VsZXJhdGlvbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ21heF9BY2NlbGVyYXRpb24nfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ21pbl9Ib3JzZXBvd2VyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIGZpZWxkOiAnbWF4X0hvcnNlcG93ZXInfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzaW1wbGUgaGVhdG1hcCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2NhcnMuanNvblwifSxcbiAgICAgIFwibWFya1wiOiBcInJlY3RcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiQ3lsaW5kZXJzXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwiY29sb3JcIjoge1wiYWdncmVnYXRlXCI6IFwibWVhblwiLCBcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IHJlY3QuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcmF3IHJlY3Qgd2l0aCB4IGFuZCB5IGJhbmRzJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ0N5bGluZGVycyd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMud2lkdGgsIHtzY2FsZTogJ3gnLCBiYW5kOiB0cnVlfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogJ3knLCBmaWVsZDogJ09yaWdpbid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7c2NhbGU6ICd5JywgYmFuZDogdHJ1ZX0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/mark/rule.test.d.ts b/build/test/compile/mark/rule.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/rule.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/rule.test.js b/build/test/compile/mark/rule.test.js new file mode 100644 index 0000000000..60d683e458 --- /dev/null +++ b/build/test/compile/mark/rule.test.js @@ -0,0 +1,215 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var rule_1 = require("../../../src/compile/mark/rule"); +var util_1 = require("../../util"); +describe('Mark: Rule', function () { + describe('without encoding', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": {} + }); + var props = rule_1.rule.encodeEntry(model); + it('should not show anything', function () { + chai_1.assert.isUndefined(props.x); + chai_1.assert.isUndefined(props.y); + }); + }); + describe('with x-only', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { "x": { "field": "a", "type": "quantitative" } } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create vertical rule that fits height', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a' }); + chai_1.assert.deepEqual(props.y, { field: { group: 'height' } }); + chai_1.assert.deepEqual(props.y2, { value: 0 }); + }); + }); + describe('with y-only', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { "y": { "field": "a", "type": "quantitative" } } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create horizontal rule that fits height', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'a' }); + chai_1.assert.deepEqual(props.x, { value: 0 }); + chai_1.assert.deepEqual(props.x2, { field: { group: 'width' } }); + }); + }); + describe('with x and x2 only', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "x2": { "field": "a2", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create horizontal rule on the axis', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a' }); + chai_1.assert.deepEqual(props.x2, { scale: channel_1.X, field: 'a2' }); + chai_1.assert.deepEqual(props.y, { + mult: 0.5, + signal: 'height' + }); + }); + }); + describe('with y and y2 only', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "field": "a", "type": "quantitative" }, + "y2": { "field": "a2", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create horizontal rules on the axis', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'a' }); + chai_1.assert.deepEqual(props.y2, { scale: channel_1.Y, field: 'a2' }); + chai_1.assert.deepEqual(props.x, { + mult: 0.5, + signal: 'width' + }); + }); + }); + describe('with x, x2, and y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "x2": { "field": "a2", "type": "quantitative" }, + "y": { "field": "b", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create horizontal rules', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a' }); + chai_1.assert.deepEqual(props.x2, { scale: channel_1.X, field: 'a2' }); + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'b' }); + }); + }); + describe('with x, x2, y, and y2', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "x2": { "field": "a2", "type": "quantitative" }, + "y": { "field": "b", "type": "quantitative" }, + "y2": { "field": "b2", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create oblique rules', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a' }); + chai_1.assert.deepEqual(props.x2, { scale: channel_1.X, field: 'a2' }); + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'b' }); + chai_1.assert.deepEqual(props.y2, { scale: channel_1.Y, field: 'b2' }); + }); + }); + describe('with x and y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "quantitative" }, + "y": { "field": "b", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create oblique rules', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a' }); + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'b' }); + }); + }); + describe('with y, y2, and x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "field": "a", "type": "quantitative" }, + "y2": { "field": "a2", "type": "quantitative" }, + "x": { "field": "b", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create vertical rules', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'a' }); + chai_1.assert.deepEqual(props.y2, { scale: channel_1.Y, field: 'a2' }); + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'b' }); + }); + }); + describe('with nominal x, quantitative y with no y2', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "ordinal" }, + "y": { "field": "b", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create vertical rule that emulates bar chart', function () { + chai_1.assert.equal(model.markDef.orient, 'vertical'); + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'a', band: 0.5 }); + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'b' }); + chai_1.assert.deepEqual(props.y2, { scale: channel_1.Y, value: 0 }); + }); + }); + describe('with nominal y, quantitative x with no y2', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "field": "a", "type": "ordinal" }, + "x": { "field": "b", "type": "quantitative" } + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should create horizontal rule that emulates bar chart', function () { + chai_1.assert.equal(model.markDef.orient, 'horizontal'); + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'b' }); + chai_1.assert.deepEqual(props.x2, { scale: channel_1.X, value: 0 }); + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'a', band: 0.5 }); + }); + }); + describe('horizontal stacked rule with color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "y": { "field": "a", "type": "ordinal" }, + "x": { "aggregate": "sum", "field": "b", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + }, + "config": { + "stack": "zero" + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should have the correct value for x, x2, and color', function () { + chai_1.assert.deepEqual(props.x, { scale: 'x', field: 'sum_b_end' }); + chai_1.assert.deepEqual(props.x2, { scale: 'x', field: 'sum_b_start' }); + chai_1.assert.deepEqual(props.stroke, { scale: channel_1.COLOR, field: 'Origin' }); + }); + }); + describe('vertical stacked rule with color', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "rule", + "encoding": { + "x": { "field": "a", "type": "ordinal" }, + "y": { "aggregate": "sum", "field": "b", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + }, + "config": { + "stack": "zero" + } + }); + var props = rule_1.rule.encodeEntry(model); + it('should have the correct value for y, y2, and color', function () { + chai_1.assert.deepEqual(props.y, { scale: 'y', field: 'sum_b_end' }); + chai_1.assert.deepEqual(props.y2, { scale: 'y', field: 'sum_b_start' }); + chai_1.assert.deepEqual(props.stroke, { scale: channel_1.COLOR, field: 'Origin' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvcnVsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7O0FBRTlCLDZCQUE0QjtBQUM1QixnREFBaUQ7QUFDakQsdURBQW9EO0FBQ3BELG1DQUFnRTtBQUVoRSxRQUFRLENBQUMsWUFBWSxFQUFFO0lBRXJCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtRQUMzQixJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsTUFBTTtZQUNkLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsSUFBTSxLQUFLLEdBQUcsV0FBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV0QyxFQUFFLENBQUMsMEJBQTBCLEVBQUU7WUFDN0IsYUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsYUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxhQUFhLEVBQUU7UUFDdEIsSUFBTSxLQUFLLEdBQUcsMkNBQW9DLENBQUM7WUFDakQsTUFBTSxFQUFFLE1BQU07WUFDZCxVQUFVLEVBQUUsRUFBQyxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUMsRUFBQztTQUMxRCxDQUFDLENBQUM7UUFFSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBQyxFQUFFLEtBQUss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LGVBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSBxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtDT0xPUiwgWCwgWX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0IHtydWxlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3J1bGUnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyazogUnVsZScsIGZ1bmN0aW9uKCkge1xuXG4gIGRlc2NyaWJlKCd3aXRob3V0IGVuY29kaW5nJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcnVsZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzaG93IGFueXRoaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMueCk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocHJvcHMueSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHgtb25seScsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcInhcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifX1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcnVsZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSB2ZXJ0aWNhbCBydWxlIHRoYXQgZml0cyBoZWlnaHQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ2EnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtmaWVsZDoge2dyb3VwOiAnaGVpZ2h0J319KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHt2YWx1ZTogMH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB5LW9ubHknLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XCJ5XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn19XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHJ1bGUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaG9yaXpvbnRhbCBydWxlIHRoYXQgZml0cyBoZWlnaHQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ2EnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHt2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge2ZpZWxkOiB7Z3JvdXA6ICd3aWR0aCd9fSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHggYW5kIHgyIG9ubHknLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcIngyXCI6IHtcImZpZWxkXCI6IFwiYTJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHJ1bGUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaG9yaXpvbnRhbCBydWxlIG9uIHRoZSBheGlzJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogWCwgZmllbGQ6ICdhJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiBYLCBmaWVsZDogJ2EyJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7XG4gICAgICAgIG11bHQ6IDAuNSxcbiAgICAgICAgc2lnbmFsOiAnaGVpZ2h0J1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHkgYW5kIHkyIG9ubHknLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInkyXCI6IHtcImZpZWxkXCI6IFwiYTJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHJ1bGUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaG9yaXpvbnRhbCBydWxlcyBvbiB0aGUgYXhpcycsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnYSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogWSwgZmllbGQ6ICdhMid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge1xuICAgICAgICBtdWx0OiAwLjUsXG4gICAgICAgIHNpZ25hbDogJ3dpZHRoJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHgsIHgyLCBhbmQgeScsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieDJcIjoge1wiZmllbGRcIjogXCJhMlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHJ1bGUuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgaG9yaXpvbnRhbCBydWxlcycsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ2EnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngyLCB7c2NhbGU6IFgsIGZpZWxkOiAnYTInfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnksIHtzY2FsZTogWSwgZmllbGQ6ICdiJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCB4LCB4MiwgeSwgYW5kIHkyJywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4MlwiOiB7XCJmaWVsZFwiOiBcImEyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieTJcIjoge1wiZmllbGRcIjogXCJiMlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcnVsZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBvYmxpcXVlIHJ1bGVzJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54LCB7c2NhbGU6IFgsIGZpZWxkOiAnYSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogWCwgZmllbGQ6ICdhMid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ2InfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6IFksIGZpZWxkOiAnYjInfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHggYW5kIHknLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBydWxlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIG9ibGlxdWUgcnVsZXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogWCwgZmllbGQ6ICdhJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnYid9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeSwgeTIsIGFuZCB4JywgKCkgPT4ge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5MlwiOiB7XCJmaWVsZFwiOiBcImEyXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcnVsZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSB2ZXJ0aWNhbCBydWxlcycsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnYSd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueTIsIHtzY2FsZTogWSwgZmllbGQ6ICdhMid9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ2InfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIG5vbWluYWwgeCwgcXVhbnRpdGF0aXZlIHkgd2l0aCBubyB5MicsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBydWxlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIHZlcnRpY2FsIHJ1bGUgdGhhdCBlbXVsYXRlcyBiYXIgY2hhcnQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5tYXJrRGVmLm9yaWVudCwgJ3ZlcnRpY2FsJyk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ2EnLCBiYW5kOiAwLjV9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ2InfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnkyLCB7c2NhbGU6IFksIHZhbHVlOiAwfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIG5vbWluYWwgeSwgcXVhbnRpdGF0aXZlIHggd2l0aCBubyB5MicsICgpID0+IHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBydWxlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIGhvcml6b250YWwgcnVsZSB0aGF0IGVtdWxhdGVzIGJhciBjaGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLm1hcmtEZWYub3JpZW50LCAnaG9yaXpvbnRhbCcpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogWCwgZmllbGQ6ICdiJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Miwge3NjYWxlOiBYLCB2YWx1ZTogMH0pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnYScsIGJhbmQ6IDAuNX0pO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGRlc2NyaWJlKCdob3Jpem9udGFsIHN0YWNrZWQgcnVsZSB3aXRoIGNvbG9yJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgIH0sXG4gICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgIFwic3RhY2tcIjogXCJ6ZXJvXCJcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gcnVsZS5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHgsIHgyLCBhbmQgY29sb3InLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ3N1bV9iX2VuZCd9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueDIsIHtzY2FsZTogJ3gnLCBmaWVsZDogJ3N1bV9iX3N0YXJ0J30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5zdHJva2UsIHtzY2FsZTogQ09MT1IsIGZpZWxkOiAnT3JpZ2luJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgc3RhY2tlZCBydWxlIHdpdGggY29sb3InLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgfSxcbiAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgXCJzdGFja1wiOiBcInplcm9cIlxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSBydWxlLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgeSwgeTIsIGFuZCBjb2xvcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiAneScsIGZpZWxkOiAnc3VtX2JfZW5kJ30pO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55Miwge3NjYWxlOiAneScsIGZpZWxkOiAnc3VtX2Jfc3RhcnQnfSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnN0cm9rZSwge3NjYWxlOiBDT0xPUiwgZmllbGQ6ICdPcmlnaW4nfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/mark/text.test.d.ts b/build/test/compile/mark/text.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/text.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/text.test.js b/build/test/compile/mark/text.test.js new file mode 100644 index 0000000000..c6a618b046 --- /dev/null +++ b/build/test/compile/mark/text.test.js @@ -0,0 +1,165 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/* tslint:disable quotemark */ +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var text_1 = require("../../../src/compile/mark/text"); +var util_1 = require("../../util"); +describe('Mark: Text', function () { + describe('with stacked x', function () { + // This is a simplified example for stacked text. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "text", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = text_1.text.encodeEntry(model); + it('should use stack_end on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'sum_a_end' }); + }); + }); + describe('with stacked y', function () { + // This is a simplified example for stacked text. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "text", + "encoding": { + "y": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = text_1.text.encodeEntry(model); + it('should use stack_end on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'sum_a_end' }); + }); + }); + describe('with quantitative and format', function () { + var spec = { + "mark": "text", + "encoding": { + "text": { "field": "foo", "type": "quantitative", "format": "d" } + } + }; + var model = util_1.parseUnitModelWithScaleAndLayoutSize(spec); + var props = text_1.text.encodeEntry(model); + it('should use number template', function () { + chai_1.assert.deepEqual(props.text, { signal: "format(datum[\"foo\"], \"d\")" }); + }); + }); + describe('with binned quantitative', function () { + var spec = { + "mark": "text", + "encoding": { + "text": { "bin": true, "field": "foo", "type": "quantitative", "format": "d" } + } + }; + var model = util_1.parseUnitModelWithScaleAndLayoutSize(spec); + var props = text_1.text.encodeEntry(model); + it('should output correct bin range', function () { + chai_1.assert.deepEqual(props.text, { signal: "datum[\"bin_maxbins_10_foo\"] === null || isNaN(datum[\"bin_maxbins_10_foo\"]) ? \"null\" : format(datum[\"bin_maxbins_10_foo\"], \"d\") + \" - \" + format(datum[\"bin_maxbins_10_foo_end\"], \"d\")" }); + }); + }); + describe('with temporal', function () { + var spec = { + "mark": "text", + "encoding": { + "text": { "field": "foo", "type": "temporal" } + } + }; + var model = util_1.parseUnitModelWithScaleAndLayoutSize(spec); + var props = text_1.text.encodeEntry(model); + it('should use date template', function () { + chai_1.assert.deepEqual(props.text, { signal: "timeFormat(datum[\"foo\"], '')" }); + }); + }); + describe('with x, y, text (ordinal)', function () { + var spec = { + "mark": "text", + "encoding": { + "x": { "field": "Acceleration", "type": "ordinal" }, + "y": { "field": "Displacement", "type": "quantitative" }, + "text": { "field": "Origin", "type": "ordinal" }, + }, + "data": { "url": "data/cars.json" } + }; + var model = util_1.parseUnitModelWithScaleAndLayoutSize(spec); + var props = text_1.text.encodeEntry(model); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.x, { scale: channel_1.X, field: 'Acceleration' }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.y, { scale: channel_1.Y, field: 'Displacement' }); + }); + it('should be centered', function () { + chai_1.assert.deepEqual(props.align, { value: "center" }); + }); + it('should map text without template', function () { + chai_1.assert.deepEqual(props.text, { signal: "''+datum[\"Origin\"]" }); + }); + }); + describe('with size in mark def', function () { + var spec = { + "mark": { type: "text", size: 5 }, + "encoding": { + "text": { "field": "Origin", "type": "ordinal" }, + }, + "data": { "url": "data/cars.json" } + }; + var model = util_1.parseUnitModelWithScaleAndLayoutSize(spec); + var props = text_1.text.encodeEntry(model); + it('should map size to fontSize', function () { + chai_1.assert.deepEqual(props.fontSize, { value: 5 }); + }); + }); + describe('with row, column, text, color, and size', function () { + var spec = { + "mark": "text", + "encoding": { + "row": { "field": "Origin", "type": "ordinal" }, + "column": { "field": "Cylinders", "type": "ordinal" }, + "text": { "field": "Acceleration", "type": "quantitative", "aggregate": "mean" }, + "color": { "field": "Acceleration", "type": "quantitative", "aggregate": "mean" }, + "size": { "field": "Acceleration", "type": "quantitative", "aggregate": "mean" } + }, + "data": { "url": "data/cars.json" } + }; + var model = util_1.parseModelWithScale(spec); + model.parseLayoutSize(); + var childModel = model.children[0]; + var props = text_1.text.encodeEntry(childModel); + it('should fit the view on x', function () { + chai_1.assert.deepEqual(props.x, { signal: 'child_width', mult: 0.5 }); + }); + it('should center on y', function () { + chai_1.assert.deepEqual(props.y, { + mult: 0.5, + signal: 'child_height' + }); + }); + it('should map text to expression', function () { + chai_1.assert.deepEqual(props.text, { + signal: "format(datum[\"mean_Acceleration\"], \"\")" + }); + }); + it('should map color to fill', function () { + chai_1.assert.deepEqual(props.fill, { + scale: 'color', + field: 'mean_Acceleration' + }); + }); + it('should map size to fontSize', function () { + chai_1.assert.deepEqual(props.fontSize, { + scale: 'size', + field: 'mean_Acceleration' + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvdGV4dC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOEJBQThCO0FBQzlCLDZCQUE0QjtBQUU1QixnREFBMEM7QUFDMUMsdURBQW9EO0FBR3BELG1DQUFxRjtBQUdyRixRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixpREFBaUQ7UUFDakQsNkRBQTZEO1FBQzdELElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFO2dCQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMvRCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7YUFDM0M7WUFDRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUM7WUFDbkMsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFHLE1BQU0sRUFBQztTQUM3QixDQUFDLENBQUM7UUFFSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsaURBQWlEO1FBQ2pELDZEQUE2RDtRQUM3RCxJQUFNLEtBQUssR0FBRywyQ0FBb0Ms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QzdCLGFBQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtnQkFDM0IsS0FBSyxFQUFFLE9BQU87Z0JBQ2QsS0FBSyxFQUFFLG1CQUFtQjthQUMzQixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUNoQyxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7Z0JBQy9CLEtBQUssRUFBRSxNQUFNO2dCQUNiLEtBQUssRUFBRSxtQkFBbUI7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCB7WCwgWX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0IHt0ZXh0fSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3RleHQnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3VuaXQnO1xuaW1wb3J0IHtOb3JtYWxpemVkVW5pdFNwZWMsIFRvcExldmVsU3BlY30gZnJvbSAnLi4vLi4vLi4vc3JjL3NwZWMnO1xuaW1wb3J0IHtwYXJzZU1vZGVsV2l0aFNjYWxlLCBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5cbmRlc2NyaWJlKCdNYXJrOiBUZXh0JywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCd3aXRoIHN0YWNrZWQgeCcsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGV4YW1wbGUgZm9yIHN0YWNrZWQgdGV4dC5cbiAgICAvLyBJbiByZWFsaXR5IHRoaXMgd2lsbCBiZSB1c2VkIGFzIHN0YWNrZWQncyBvdmVybGF5ZWQgbWFya2VyXG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwidGV4dFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJzdGFja1wiOiAgXCJ6ZXJvXCJ9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHRleHQuZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc3RhY2tfZW5kIG9uIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ3N1bV9hX2VuZCd9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggc3RhY2tlZCB5JywgZnVuY3Rpb24oKSB7XG4gICAgLy8gVGhpcyBpcyBhIHNpbXBsaWZpZWQgZXhhbXBsZSBmb3Igc3RhY2tlZCB0ZXh0LlxuICAgIC8vIEluIHJlYWxpdHkgdGhpcyB3aWxsIGJlIHVzZWQgYXMgc3RhY2tlZCdzIG92ZXJsYXllZCBtYXJrZXJcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICBcIm1hcmtcIjogXCJ0ZXh0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJiXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgIFwiY29uZmlnXCI6IHtcInN0YWNrXCI6ICBcInplcm9cIn1cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gdGV4dC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSBzdGFja19lbmQgb24geScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7c2NhbGU6IFksIGZpZWxkOiAnc3VtX2FfZW5kJ30pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnd2l0aCBxdWFudGl0YXRpdmUgYW5kIGZvcm1hdCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNwZWM6IE5vcm1hbGl6ZWRVbml0U3BlYyA9IHtcbiAgICAgIFwibWFya1wiOiBcInRleHRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInRleHRcIjoge1wiZmllbGRcIjogXCJmb29cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiZm9ybWF0XCI6IFwiZFwifVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoc3BlYyk7XG4gICAgY29uc3QgcHJvcHMgPSB0ZXh0LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgdXNlIG51bWJlciB0ZW1wbGF0ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy50ZXh0LCB7c2lnbmFsOiBgZm9ybWF0KGRhdHVtW1wiZm9vXCJdLCBcImRcIilgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIGJpbm5lZCBxdWFudGl0YXRpdmUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcGVjOiBOb3JtYWxpemVkVW5pdFNwZWMgPSB7XG4gICAgICBcIm1hcmtcIjogXCJ0ZXh0XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ0ZXh0XCI6IHtcImJpblwiOiB0cnVlLCBcImZpZWxkXCI6IFwiZm9vXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcImZvcm1hdFwiOiBcImRcIn1cbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHNwZWMpO1xuICAgIGNvbnN0IHByb3BzID0gdGV4dC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIG91dHB1dCBjb3JyZWN0IGJpbiByYW5nZScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy50ZXh0LCB7c2lnbmFsOiBgZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9mb29cIl0gPT09IG51bGwgfHwgaXNOYU4oZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9mb29cIl0pID8gXCJudWxsXCIgOiBmb3JtYXQoZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9mb29cIl0sIFwiZFwiKSArIFwiIC0gXCIgKyBmb3JtYXQoZGF0dW1bXCJiaW5fbWF4Ymluc18xMF9mb29fZW5kXCJdLCBcImRcIilgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHRlbXBvcmFsJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjID0ge1xuICAgICAgXCJtYXJrXCI6IFwidGV4dFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwidGV4dFwiOiB7XCJmaWVsZFwiOiBcImZvb1wiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifVxuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoc3BlYyk7XG4gICAgY29uc3QgcHJvcHMgPSB0ZXh0LmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgdXNlIGRhdGUgdGVtcGxhdGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMudGV4dCwge3NpZ25hbDogYHRpbWVGb3JtYXQoZGF0dW1bXCJmb29cIl0sICcnKWB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggeCwgeSwgdGV4dCAob3JkaW5hbCknLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjID0ge1xuICAgICAgXCJtYXJrXCI6IFwidGV4dFwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkFjY2VsZXJhdGlvblwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJEaXNwbGFjZW1lbnRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInRleHRcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9jYXJzLmpzb25cIn1cbiAgICB9O1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHNwZWMpO1xuICAgIGNvbnN0IHByb3BzID0gdGV4dC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueCwge3NjYWxlOiBYLCBmaWVsZDogJ0FjY2VsZXJhdGlvbid9KTtcbiAgICB9KTtcbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueSwge3NjYWxlOiBZLCBmaWVsZDogJ0Rpc3BsYWNlbWVudCd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgY2VudGVyZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuYWxpZ24sIHt2YWx1ZTogXCJjZW50ZXJcIn0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXAgdGV4dCB3aXRob3V0IHRlbXBsYXRlJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnRleHQsIHtzaWduYWw6IGAnJytkYXR1bVtcIk9yaWdpblwiXWB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3dpdGggc2l6ZSBpbiBtYXJrIGRlZicsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBzcGVjOiBOb3JtYWxpemVkVW5pdFNwZWMgPSB7XG4gICAgICBcIm1hcmtcIjoge3R5cGU6IFwidGV4dFwiLCBzaXplOiA1fSxcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInRleHRcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgIH0sXG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9jYXJzLmpzb25cIn1cbiAgICB9O1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHNwZWMpO1xuICAgIGNvbnN0IHByb3BzID0gdGV4dC5lbmNvZGVFbnRyeShtb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIG1hcCBzaXplIHRvIGZvbnRTaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5mb250U2l6ZSwge3ZhbHVlOiA1fSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHJvdywgY29sdW1uLCB0ZXh0LCBjb2xvciwgYW5kIHNpemUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcGVjOiBUb3BMZXZlbFNwZWMgPSB7XG4gICAgICAgIFwibWFya1wiOiBcInRleHRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBcImNvbHVtblwiOiB7XCJmaWVsZFwiOiBcIkN5bGluZGVyc1wiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwidGV4dFwiOiB7XCJmaWVsZFwiOiBcIkFjY2VsZXJhdGlvblwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJBY2NlbGVyYXRpb25cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwibWVhblwifSxcbiAgICAgICAgICBcInNpemVcIjoge1wiZmllbGRcIjogXCJBY2NlbGVyYXRpb25cIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwibWVhblwifVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9jYXJzLmpzb25cIn1cbiAgICAgIH07XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsV2l0aFNjYWxlKHNwZWMpO1xuICAgIG1vZGVsLnBhcnNlTGF5b3V0U2l6ZSgpO1xuXG4gICAgY29uc3QgY2hpbGRNb2RlbCA9IG1vZGVsLmNoaWxkcmVuWzBdIGFzIFVuaXRNb2RlbDtcbiAgICBjb25zdCBwcm9wcyA9IHRleHQuZW5jb2RlRW50cnkoY2hpbGRNb2RlbCk7XG5cbiAgICBpdCgnc2hvdWxkIGZpdCB0aGUgdmlldyBvbiB4JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLngsIHtzaWduYWw6ICdjaGlsZF93aWR0aCcsIG11bHQ6IDAuNX0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjZW50ZXIgb24geScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy55LCB7XG4gICAgICAgIG11bHQ6IDAuNSxcbiAgICAgICAgc2lnbmFsOiAnY2hpbGRfaGVpZ2h0J1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1hcCB0ZXh0IHRvIGV4cHJlc3Npb24nLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMudGV4dCwge1xuICAgICAgICBzaWduYWw6IGBmb3JtYXQoZGF0dW1bXCJtZWFuX0FjY2VsZXJhdGlvblwiXSwgXCJcIilgXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWFwIGNvbG9yIHRvIGZpbGwnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuZmlsbCwge1xuICAgICAgICBzY2FsZTogJ2NvbG9yJyxcbiAgICAgICAgZmllbGQ6ICdtZWFuX0FjY2VsZXJhdGlvbidcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtYXAgc2l6ZSB0byBmb250U2l6ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5mb250U2l6ZSwge1xuICAgICAgICBzY2FsZTogJ3NpemUnLFxuICAgICAgICBmaWVsZDogJ21lYW5fQWNjZWxlcmF0aW9uJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/mark/tick.test.d.ts b/build/test/compile/mark/tick.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/tick.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/tick.test.js b/build/test/compile/mark/tick.test.js new file mode 100644 index 0000000000..44bebd6a02 --- /dev/null +++ b/build/test/compile/mark/tick.test.js @@ -0,0 +1,158 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +// TODO: +// test mark-tick with the following test cases, +// looking at mark-point.test.ts as inspiration +// +// After finishing all test, make sure all lines in mark-tick.ts is tested +// (except the scaffold labels() method) +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var tick_1 = require("../../../src/compile/mark/tick"); +var util_1 = require("../../util"); +describe('Mark: Tick', function () { + describe('with stacked x', function () { + // This is a simplified example for stacked tick. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "x": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = tick_1.tick.encodeEntry(model); + it('should use stack_end on x', function () { + chai_1.assert.deepEqual(props.xc, { scale: channel_1.X, field: 'sum_a_end' }); + }); + }); + describe('with stacked y', function () { + // This is a simplified example for stacked tick. + // In reality this will be used as stacked's overlayed marker + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "tick", + "encoding": { + "y": { "aggregate": "sum", "field": "a", "type": "quantitative" }, + "color": { "field": "b", "type": "ordinal" } + }, + "data": { "url": "data/barley.json" }, + "config": { "stack": "zero" } + }); + var props = tick_1.tick.encodeEntry(model); + it('should use stack_end on y', function () { + chai_1.assert.deepEqual(props.yc, { scale: channel_1.Y, field: 'sum_a_end' }); + }); + }); + describe('with quantitative x', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'tick', + 'encoding': { 'x': { 'field': 'Horsepower', 'type': 'quantitative' } }, + 'data': { 'url': 'data/cars.json' } + }); + var props = tick_1.tick.encodeEntry(model); + it('should be centered on y', function () { + chai_1.assert.deepEqual(props.yc, { + mult: 0.5, + signal: 'height' + }); + }); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.xc, { scale: channel_1.X, field: 'Horsepower' }); + }); + it('width should tick thickness with orient vertical', function () { + chai_1.assert.deepEqual(props.width, { value: 1 }); + }); + }); + describe('with quantitative y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'tick', + 'encoding': { 'y': { 'field': 'Cylinders', 'type': 'quantitative' } }, + 'data': { 'url': 'data/cars.json' } + }); + var props = tick_1.tick.encodeEntry(model); + it('should be centered on x', function () { + chai_1.assert.deepEqual(props.xc, { + mult: 0.5, + signal: 'width' + }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.yc, { scale: channel_1.Y, field: 'Cylinders' }); + }); + it('height should tick thickness with orient horizontal', function () { + chai_1.assert.deepEqual(props.height, { value: 1 }); + }); + }); + describe('with quantitative x and ordinal y', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'tick', + 'encoding': { + 'x': { 'field': 'Horsepower', 'type': 'quantitative' }, + 'y': { 'field': 'Cylinders', 'type': 'ordinal' } + }, + 'data': { 'url': 'data/cars.json' } + }); + var props = tick_1.tick.encodeEntry(model); + it('should scale on x', function () { + chai_1.assert.deepEqual(props.xc, { scale: channel_1.X, field: 'Horsepower' }); + }); + it('should scale on y', function () { + chai_1.assert.deepEqual(props.yc, { scale: channel_1.Y, field: 'Cylinders' }); + }); + it('wiidth should be tick thickness with default orient vertical', function () { + chai_1.assert.deepEqual(props.width, { value: 1 }); + }); + it('height should be matched to field with default orient vertical', function () { + chai_1.assert.deepEqual(props.height, { value: 14 }); + }); + }); + describe('vertical ticks', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'tick', + 'config': { 'mark': { 'orient': 'vertical' } }, + 'encoding': { + 'x': { 'field': 'Horsepower', 'type': 'quantitative' }, + 'y': { 'field': 'Cylinders', 'type': 'ordinal' }, + 'size': { 'field': 'Acceleration', 'type': 'quantitative' } + }, + 'data': { 'url': 'data/cars.json' }, + }); + var props = tick_1.tick.encodeEntry(model); + it('maps size to height', function () { + chai_1.assert.deepEqual(props.height, { 'field': 'Acceleration', 'scale': channel_1.SIZE }); + }); + }); + describe('vertical ticks with size in mark def', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': { 'type': 'tick', 'size': 5 }, + 'encoding': { + 'x': { 'field': 'Horsepower', 'type': 'quantitative' }, + 'y': { 'field': 'Cylinders', 'type': 'ordinal' } + }, + 'data': { 'url': 'data/cars.json' }, + }); + var props = tick_1.tick.encodeEntry(model); + it('maps size to height in Vega', function () { + chai_1.assert.deepEqual(props.height, { value: 5 }); + }); + }); + describe('vertical ticks (implicit)', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'tick', + 'encoding': { + 'x': { 'field': 'Horsepower', 'type': 'quantitative' }, + 'y': { 'field': 'Cylinders', 'type': 'ordinal' }, + 'size': { 'field': 'Acceleration', 'type': 'quantitative' } + }, + 'data': { 'url': 'data/cars.json' }, + }); + var props = tick_1.tick.encodeEntry(model); + it('maps size to height in Vega', function () { + chai_1.assert.deepEqual(props.height, { 'field': 'Acceleration', 'scale': channel_1.SIZE }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGljay50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL21hcmsvdGljay50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7O0FBRzlCLFFBQVE7QUFDUixnREFBZ0Q7QUFDaEQsK0NBQStDO0FBQy9DLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsd0NBQXdDO0FBQ3hDLDZCQUE0QjtBQUM1QixnREFBZ0Q7QUFDaEQsdURBQW9EO0FBQ3BELG1DQUFnRTtBQUVoRSxRQUFRLENBQUMsWUFBWSxFQUFFO0lBQ3JCLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixpREFBaUQ7UUFDakQsNkRBQTZEO1FBQzdELElBQU0sS0FBSyxHQUFHLDJDQUFvQyxDQUFDO1lBQ2pELE1BQU0sRUFBRSxNQUFNO1lBQ2QsVUFBVSxFQUFFO2dCQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO2dCQUMvRCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7YUFDM0M7WUFDRCxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUM7WUFDbkMsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFHLE1BQU0sRUFBQztTQUM3QixDQUFDLENBQUM7UUFFSCxJQUFNLEtBQUssR0FBRyxXQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXRDLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFHSCxRQUFR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QUssQ0FBQyxDQUFDO1FBQ3RDLEVBQUUsQ0FBQyw2QkFBNkIsRUFBRTtZQUNoQyxhQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxjQUFJLEVBQUMsQ0FBQyxDQUFDO1FBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5cbi8vIFRPRE86XG4vLyB0ZXN0IG1hcmstdGljayB3aXRoIHRoZSBmb2xsb3dpbmcgdGVzdCBjYXNlcyxcbi8vIGxvb2tpbmcgYXQgbWFyay1wb2ludC50ZXN0LnRzIGFzIGluc3BpcmF0aW9uXG4vL1xuLy8gQWZ0ZXIgZmluaXNoaW5nIGFsbCB0ZXN0LCBtYWtlIHN1cmUgYWxsIGxpbmVzIGluIG1hcmstdGljay50cyBpcyB0ZXN0ZWRcbi8vIChleGNlcHQgdGhlIHNjYWZmb2xkIGxhYmVscygpIG1ldGhvZClcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7U0laRSwgWCwgWX0gZnJvbSAnLi4vLi4vLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0IHt0aWNrfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3RpY2snO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTWFyazogVGljaycsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnd2l0aCBzdGFja2VkIHgnLCBmdW5jdGlvbigpIHtcbiAgICAvLyBUaGlzIGlzIGEgc2ltcGxpZmllZCBleGFtcGxlIGZvciBzdGFja2VkIHRpY2suXG4gICAgLy8gSW4gcmVhbGl0eSB0aGlzIHdpbGwgYmUgdXNlZCBhcyBzdGFja2VkJ3Mgb3ZlcmxheWVkIG1hcmtlclxuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgIFwibWFya1wiOiBcInRpY2tcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJhXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcImJcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifVxuICAgICAgfSxcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgXCJjb25maWdcIjoge1wic3RhY2tcIjogIFwiemVyb1wifVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvcHMgPSB0aWNrLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgdXNlIHN0YWNrX2VuZCBvbiB4JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnhjLCB7c2NhbGU6IFgsIGZpZWxkOiAnc3VtX2FfZW5kJ30pO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGRlc2NyaWJlKCd3aXRoIHN0YWNrZWQgeScsIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIGV4YW1wbGUgZm9yIHN0YWNrZWQgdGljay5cbiAgICAvLyBJbiByZWFsaXR5IHRoaXMgd2lsbCBiZSB1c2VkIGFzIHN0YWNrZWQncyBvdmVybGF5ZWQgbWFya2VyXG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgXCJtYXJrXCI6IFwidGlja1wiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiYlwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICB9LFxuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICBcImNvbmZpZ1wiOiB7XCJzdGFja1wiOiAgXCJ6ZXJvXCJ9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHRpY2suZW5jb2RlRW50cnkobW9kZWwpO1xuXG4gICAgaXQoJ3Nob3VsZCB1c2Ugc3RhY2tfZW5kIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogWSwgZmllbGQ6ICdzdW1fYV9lbmQnfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHF1YW50aXRhdGl2ZSB4JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgJ21hcmsnOiAndGljaycsXG4gICAgICAnZW5jb2RpbmcnOiB7J3gnOiB7J2ZpZWxkJzogJ0hvcnNlcG93ZXInLCAndHlwZSc6ICdxdWFudGl0YXRpdmUnfX0sXG4gICAgICAnZGF0YSc6IHsndXJsJzogJ2RhdGEvY2Fycy5qc29uJ31cbiAgICB9KTtcblxuICAgIGNvbnN0IHByb3BzID0gdGljay5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgaXQoJ3Nob3VsZCBiZSBjZW50ZXJlZCBvbiB5JywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLnljLCB7XG4gICAgICAgIG11bHQ6IDAuNSxcbiAgICAgICAgc2lnbmFsOiAnaGVpZ2h0J1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueGMsIHtzY2FsZTogWCwgZmllbGQ6ICdIb3JzZXBvd2VyJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3dpZHRoIHNob3VsZCB0aWNrIHRoaWNrbmVzcyB3aXRoIG9yaWVudCB2ZXJ0aWNhbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy53aWR0aCwge3ZhbHVlOiAxfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHF1YW50aXRhdGl2ZSB5JywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgJ21hcmsnOiAndGljaycsXG4gICAgICAnZW5jb2RpbmcnOiB7J3knOiB7J2ZpZWxkJzogJ0N5bGluZGVycycsJ3R5cGUnOiAncXVhbnRpdGF0aXZlJ319LFxuICAgICAgJ2RhdGEnOiB7J3VybCc6ICdkYXRhL2NhcnMuanNvbid9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHRpY2suZW5jb2RlRW50cnkobW9kZWwpO1xuICAgIGl0KCdzaG91bGQgYmUgY2VudGVyZWQgb24geCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Yywge1xuICAgICAgICBtdWx0OiAwLjUsXG4gICAgICAgIHNpZ25hbDogJ3dpZHRoJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogWSwgZmllbGQ6ICdDeWxpbmRlcnMnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGVpZ2h0IHNob3VsZCB0aWNrIHRoaWNrbmVzcyB3aXRoIG9yaWVudCBob3Jpem9udGFsJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmhlaWdodCwge3ZhbHVlOiAxfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd3aXRoIHF1YW50aXRhdGl2ZSB4IGFuZCBvcmRpbmFsIHknLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAnbWFyayc6ICd0aWNrJyxcbiAgICAgICdlbmNvZGluZyc6XG4gICAgICAgIHtcbiAgICAgICAgICAneCc6IHsnZmllbGQnOiAnSG9yc2Vwb3dlcicsICd0eXBlJzogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgICd5JzogeydmaWVsZCc6ICdDeWxpbmRlcnMnLCd0eXBlJzogJ29yZGluYWwnfVxuICAgICAgICB9LFxuICAgICAgJ2RhdGEnOiB7J3VybCc6ICdkYXRhL2NhcnMuanNvbid9XG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSB0aWNrLmVuY29kZUVudHJ5KG1vZGVsKTtcblxuICAgIGl0KCdzaG91bGQgc2NhbGUgb24geCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy54Yywge3NjYWxlOiBYLCBmaWVsZDogJ0hvcnNlcG93ZXInfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNjYWxlIG9uIHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMueWMsIHtzY2FsZTogWSwgZmllbGQ6ICdDeWxpbmRlcnMnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnd2lpZHRoIHNob3VsZCBiZSB0aWNrIHRoaWNrbmVzcyB3aXRoIGRlZmF1bHQgb3JpZW50IHZlcnRpY2FsJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLndpZHRoLCB7dmFsdWU6IDF9KTtcbiAgICB9KTtcblxuICAgIGl0KCdoZWlnaHQgc2hvdWxkIGJlIG1hdGNoZWQgdG8gZmllbGQgd2l0aCBkZWZhdWx0IG9yaWVudCB2ZXJ0aWNhbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHt2YWx1ZTogMTR9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIHRpY2tzJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICdtYXJrJzogJ3RpY2snLFxuICAgICAgJ2NvbmZpZyc6IHsnbWFyayc6IHsnb3JpZW50JzogJ3ZlcnRpY2FsJ319LFxuICAgICAgJ2VuY29kaW5nJzpcbiAgICAgICAge1xuICAgICAgICAgICd4JzogeydmaWVsZCc6ICdIb3JzZXBvd2VyJywgJ3R5cGUnOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgJ3knOiB7J2ZpZWxkJzogJ0N5bGluZGVycycsICd0eXBlJzogJ29yZGluYWwnfSxcbiAgICAgICAgICAnc2l6ZSc6IHsnZmllbGQnOiAnQWNjZWxlcmF0aW9uJywgJ3R5cGUnOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfSxcbiAgICAgICdkYXRhJzogeyd1cmwnOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9wcyA9IHRpY2suZW5jb2RlRW50cnkobW9kZWwpO1xuICAgIGl0KCdtYXBzIHNpemUgdG8gaGVpZ2h0JywgZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwcm9wcy5oZWlnaHQsIHsnZmllbGQnOiAnQWNjZWxlcmF0aW9uJywgJ3NjYWxlJzogU0laRX0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndmVydGljYWwgdGlja3Mgd2l0aCBzaXplIGluIG1hcmsgZGVmJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICdtYXJrJzogeyd0eXBlJzogJ3RpY2snLCAnc2l6ZSc6IDV9LFxuICAgICAgJ2VuY29kaW5nJzpcbiAgICAgICAge1xuICAgICAgICAgICd4JzogeydmaWVsZCc6ICdIb3JzZXBvd2VyJywgJ3R5cGUnOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgJ3knOiB7J2ZpZWxkJzogJ0N5bGluZGVycycsICd0eXBlJzogJ29yZGluYWwnfVxuICAgICAgICB9LFxuICAgICAgJ2RhdGEnOiB7J3VybCc6ICdkYXRhL2NhcnMuanNvbid9LFxuICAgIH0pO1xuICAgIGNvbnN0IHByb3BzID0gdGljay5lbmNvZGVFbnRyeShtb2RlbCk7XG4gICAgaXQoJ21hcHMgc2l6ZSB0byBoZWlnaHQgaW4gVmVnYScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocHJvcHMuaGVpZ2h0LCB7dmFsdWU6IDV9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3ZlcnRpY2FsIHRpY2tzIChpbXBsaWNpdCknLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAnbWFyayc6ICd0aWNrJyxcbiAgICAgICdlbmNvZGluZyc6XG4gICAgICAgIHtcbiAgICAgICAgICAneCc6IHsnZmllbGQnOiAnSG9yc2Vwb3dlcicsICd0eXBlJzogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgICd5JzogeydmaWVsZCc6ICdDeWxpbmRlcnMnLCAndHlwZSc6ICdvcmRpbmFsJ30sXG4gICAgICAgICAgJ3NpemUnOiB7J2ZpZWxkJzogJ0FjY2VsZXJhdGlvbicsICd0eXBlJzogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgIH0sXG4gICAgICAnZGF0YSc6IHsndXJsJzogJ2RhdGEvY2Fycy5qc29uJ30sXG4gICAgfSk7XG4gICAgY29uc3QgcHJvcHMgPSB0aWNrLmVuY29kZUVudHJ5KG1vZGVsKTtcbiAgICBpdCgnbWFwcyBzaXplIHRvIGhlaWdodCBpbiBWZWdhJywgZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHByb3BzLmhlaWdodCwgeydmaWVsZCc6ICdBY2NlbGVyYXRpb24nLCAnc2NhbGUnOiBTSVpFfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/mark/valueref.test.d.ts b/build/test/compile/mark/valueref.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/mark/valueref.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/mark/valueref.test.js b/build/test/compile/mark/valueref.test.js new file mode 100644 index 0000000000..f6e968791c --- /dev/null +++ b/build/test/compile/mark/valueref.test.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var valueref_1 = require("../../../src/compile/mark/valueref"); +describe('compile/mark/valueref', function () { + describe("getOffset", function () { + var markDef = { + "type": "point", + "x2Offset": 100 + }; + it('should correctly get the offset value for the given channel', function () { + chai_1.assert.equal(valueref_1.getOffset('x2', markDef), 100); + }); + it('should return undefined when the offset value for the given channel is not defined', function () { + chai_1.assert.equal(valueref_1.getOffset('x', markDef), undefined); + }); + }); + describe('midPoint()', function () { + it('should return correct value for width', function () { + var ref = valueref_1.midPoint('x', { value: 'width' }, undefined, undefined, undefined, undefined); + chai_1.assert.deepEqual(ref, { field: { group: 'width' } }); + }); + it('should return correct value for height', function () { + var ref = valueref_1.midPoint('y', { value: 'height' }, undefined, undefined, undefined, undefined); + chai_1.assert.deepEqual(ref, { field: { group: 'height' } }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVyZWYudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9tYXJrL3ZhbHVlcmVmLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4QkFBOEI7QUFDOUIsNkJBQTRCO0FBRTVCLCtEQUF1RTtBQUl2RSxRQUFRLENBQUMsdUJBQXVCLEVBQUU7SUFDaEMsUUFBUSxDQUFDLFdBQVcsRUFBRTtRQUNwQixJQUFNLE9BQU8sR0FBWTtZQUN2QixNQUFNLEVBQUUsT0FBTztZQUNmLFVBQVUsRUFBRSxHQUFHO1NBQ2hCLENBQUM7UUFDRixFQUFFLENBQUMsNkRBQTZELEVBQUU7WUFDaEUsYUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyxvRkFBb0YsRUFBRTtZQUN2RixhQUFNLENBQUMsS0FBSyxDQUFDLG9CQUFTLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRW5ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsWUFBWSxFQUFFO1FBQ3JCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxJQUFNLEdBQUcsR0FBRyxtQkFBUSxDQUFDLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN4RixhQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxFQUFFLENBQUMsd0NBQXdDLEVBQUU7WUFDM0MsSUFBTSxHQUFHLEdBQUcsbUJBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDekYsYUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge2dldE9mZnNldCwgbWlkUG9pbnR9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvdmFsdWVyZWYnO1xuaW1wb3J0IHtNYXJrRGVmfSBmcm9tICcuLi8uLi8uLi9zcmMvbWFyayc7XG5cblxuZGVzY3JpYmUoJ2NvbXBpbGUvbWFyay92YWx1ZXJlZicsICgpID0+IHtcbiAgZGVzY3JpYmUoXCJnZXRPZmZzZXRcIiwgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG1hcmtEZWY6IE1hcmtEZWYgPSB7XG4gICAgICBcInR5cGVcIjogXCJwb2ludFwiLFxuICAgICAgXCJ4Mk9mZnNldFwiOiAxMDBcbiAgICB9O1xuICAgIGl0KCdzaG91bGQgY29ycmVjdGx5IGdldCB0aGUgb2Zmc2V0IHZhbHVlIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGFzc2VydC5lcXVhbChnZXRPZmZzZXQoJ3gyJywgbWFya0RlZiksIDEwMCk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIHdoZW4gdGhlIG9mZnNldCB2YWx1ZSBmb3IgdGhlIGdpdmVuIGNoYW5uZWwgaXMgbm90IGRlZmluZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBhc3NlcnQuZXF1YWwoZ2V0T2Zmc2V0KCd4JywgbWFya0RlZiksIHVuZGVmaW5lZCk7XG5cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ21pZFBvaW50KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB2YWx1ZSBmb3Igd2lkdGgnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZWYgPSBtaWRQb2ludCgneCcsIHt2YWx1ZTogJ3dpZHRoJ30sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlZiwge2ZpZWxkOiB7Z3JvdXA6ICd3aWR0aCd9fSk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB2YWx1ZSBmb3IgaGVpZ2h0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVmID0gbWlkUG9pbnQoJ3knLCB7dmFsdWU6ICdoZWlnaHQnfSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwocmVmLCB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/model.test.d.ts b/build/test/compile/model.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/model.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/model.test.js b/build/test/compile/model.test.js new file mode 100644 index 0000000000..65a4b32c1e --- /dev/null +++ b/build/test/compile/model.test.js @@ -0,0 +1,113 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var model_1 = require("../../src/compile/model"); +var util_1 = require("../util"); +describe('Model', function () { + describe('NameMap', function () { + it('should rename correctly', function () { + var map = new model_1.NameMap(); + chai_1.assert.equal(map.get('a'), 'a'); + map.rename('a', 'b'); + chai_1.assert.equal(map.get('a'), 'b'); + chai_1.assert.equal(map.get('b'), 'b'); + map.rename('b', 'c'); + chai_1.assert.equal(map.get('a'), 'c'); + chai_1.assert.equal(map.get('b'), 'c'); + chai_1.assert.equal(map.get('c'), 'c'); + map.rename('z', 'a'); + chai_1.assert.equal(map.get('a'), 'c'); + chai_1.assert.equal(map.get('b'), 'c'); + chai_1.assert.equal(map.get('c'), 'c'); + chai_1.assert.equal(map.get('z'), 'c'); + }); + }); + describe('hasDescendantWithFieldOnChannel', function () { + it('should return true if a child plot has a field on x', function () { + var model = util_1.parseFacetModel({ + facet: { row: { field: 'a', type: 'nominal' } }, + spec: { + mark: 'point', + encoding: { + x: { field: 'x', type: 'quantitative' } + } + } + }); + chai_1.assert(model.hasDescendantWithFieldOnChannel('x')); + }); + it('should return true if a descendant plot has x', function () { + var model = util_1.parseFacetModel({ + facet: { row: { field: 'a', type: 'nominal' } }, + spec: { + layer: [{ + mark: 'point', + encoding: { + x: { field: 'x', type: 'quantitative' } + } + }, { + mark: 'point', + encoding: { + color: { field: 'x', type: 'quantitative' } + } + },] + } + }); + chai_1.assert(model.hasDescendantWithFieldOnChannel('x')); + }); + it('should return false if no descendant plot has a field on x', function () { + var model = util_1.parseFacetModel({ + facet: { row: { field: 'a', type: 'nominal' } }, + spec: { + mark: 'point', + encoding: { + color: { field: 'x', type: 'quantitative' } + } + } + }); + chai_1.assert(!model.hasDescendantWithFieldOnChannel('x')); + }); + it('should return false if no descendant plot has a field on x', function () { + var model = util_1.parseFacetModel({ + facet: { row: { field: 'a', type: 'nominal' } }, + spec: { + layer: [{ + mark: 'point', + encoding: { + color: { field: 'x', type: 'quantitative' } + } + }, { + mark: 'point', + encoding: { + color: { field: 'x', type: 'quantitative' } + } + },] + } + }); + chai_1.assert(!model.hasDescendantWithFieldOnChannel('x')); + }); + }); + describe('getSizeSignalRef', function () { + it('returns formula for step if parent is facet', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + row: { field: 'a', type: 'ordinal' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'nominal', scale: { + padding: 0.345 + } } + } + }, + resolve: { + scale: { x: 'independent' } + } + }); + chai_1.assert.deepEqual(model.child.getSizeSignalRef('width'), { + signal: "bandspace(datum[\"distinct_b\"], 1, 0.345) * child_x_step" + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvY29tcGlsZS9tb2RlbC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLGlEQUFnRDtBQUNoRCxnQ0FBa0U7QUFFbEUsUUFBUSxDQUFDLE9BQU8sRUFBRTtJQUNoQixRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2xCLEVBQUUsQ0FBQyx5QkFBeUIsRUFBRTtZQUM1QixJQUFNLEdBQUcsR0FBRyxJQUFJLGVBQU8sRUFBRSxDQUFDO1lBQzFCLGFBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUVoQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNyQixhQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JCLGFBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoQyxhQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDaEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRWhDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3JC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Q0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7TmFtZU1hcH0gZnJvbSAnLi4vLi4vc3JjL2NvbXBpbGUvbW9kZWwnO1xuaW1wb3J0IHtwYXJzZUZhY2V0TW9kZWwsIHBhcnNlRmFjZXRNb2RlbFdpdGhTY2FsZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdNb2RlbCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ05hbWVNYXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCByZW5hbWUgY29ycmVjdGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgbWFwID0gbmV3IE5hbWVNYXAoKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXAuZ2V0KCdhJyksICdhJyk7XG5cbiAgICAgIG1hcC5yZW5hbWUoJ2EnLCAnYicpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1hcC5nZXQoJ2EnKSwgJ2InKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXAuZ2V0KCdiJyksICdiJyk7XG5cbiAgICAgIG1hcC5yZW5hbWUoJ2InLCAnYycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1hcC5nZXQoJ2EnKSwgJ2MnKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXAuZ2V0KCdiJyksICdjJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobWFwLmdldCgnYycpLCAnYycpO1xuXG4gICAgICBtYXAucmVuYW1lKCd6JywgJ2EnKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXAuZ2V0KCdhJyksICdjJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobWFwLmdldCgnYicpLCAnYycpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1hcC5nZXQoJ2MnKSwgJ2MnKTtcbiAgICAgIGFzc2VydC5lcXVhbChtYXAuZ2V0KCd6JyksICdjJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYXNEZXNjZW5kYW50V2l0aEZpZWxkT25DaGFubmVsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgaWYgYSBjaGlsZCBwbG90IGhhcyBhIGZpZWxkIG9uIHgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlRmFjZXRNb2RlbCh7XG4gICAgICAgIGZhY2V0OiB7cm93OiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnfX0sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICd4JywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChtb2RlbC5oYXNEZXNjZW5kYW50V2l0aEZpZWxkT25DaGFubmVsKCd4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBpZiBhIGRlc2NlbmRhbnQgcGxvdCBoYXMgeCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHtcbiAgICAgICAgZmFjZXQ6IHtyb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9fSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIGxheWVyOiBbe1xuICAgICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICAgIHg6IHtmaWVsZDogJ3gnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LHtcbiAgICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAneCcsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChtb2RlbC5oYXNEZXNjZW5kYW50V2l0aEZpZWxkT25DaGFubmVsKCd4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgaWYgbm8gZGVzY2VuZGFudCBwbG90IGhhcyBhIGZpZWxkIG9uIHgnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlRmFjZXRNb2RlbCh7XG4gICAgICAgIGZhY2V0OiB7cm93OiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnfX0sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAneCcsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoIW1vZGVsLmhhc0Rlc2NlbmRhbnRXaXRoRmllbGRPbkNoYW5uZWwoJ3gnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBpZiBubyBkZXNjZW5kYW50IHBsb3QgaGFzIGEgZmllbGQgb24geCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHtcbiAgICAgICAgZmFjZXQ6IHtyb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9fSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIGxheWVyOiBbe1xuICAgICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6ICd4JywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSx7XG4gICAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgY29sb3I6IHtmaWVsZDogJ3gnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LF1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQoIW1vZGVsLmhhc0Rlc2NlbmRhbnRXaXRoRmllbGRPbkNoYW5uZWwoJ3gnKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdnZXRTaXplU2lnbmFsUmVmJywgKCkgPT4ge1xuICAgIGl0KCdyZXR1cm5zIGZvcm11bGEgZm9yIHN0ZXAgaWYgcGFyZW50IGlzIGZhY2V0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIHJvdzoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAnbm9taW5hbCcsIHNjYWxlOiB7XG4gICAgICAgICAgICAgIHBhZGRpbmc6IDAuMzQ1XG4gICAgICAgICAgICB9fVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgIHNjYWxlOiB7eDogJ2luZGVwZW5kZW50J31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY2hpbGQuZ2V0U2l6ZVNpZ25hbFJlZignd2lkdGgnKSwge1xuICAgICAgICBzaWduYWw6IGBiYW5kc3BhY2UoZGF0dW1bXFxcImRpc3RpbmN0X2JcXFwiXSwgMSwgMC4zNDUpICogY2hpbGRfeF9zdGVwYFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/projection/assemble.test.d.ts b/build/test/compile/projection/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/projection/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/projection/assemble.test.js b/build/test/compile/projection/assemble.test.js new file mode 100644 index 0000000000..8cc10441c7 --- /dev/null +++ b/build/test/compile/projection/assemble.test.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/projection/assemble"); +var vega_schema_1 = require("../../../src/vega.schema"); +var util_1 = require("../../util"); +describe('compile/projection/assemble', function () { + describe('assembleProjectionForModel', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + 'mark': 'geoshape', + 'projection': { + 'type': 'albersUsa' + }, + 'data': { + 'url': 'data/us-10m.json', + 'format': { + 'type': 'topojson', + 'feature': 'states' + } + }, + 'encoding': {} + }); + model.parse(); + it('should not be empty', function () { + chai_1.assert.isNotEmpty(assemble_1.assembleProjectionForModel(model)); + }); + it('should have properties of right type', function () { + var projection = assemble_1.assembleProjectionForModel(model)[0]; + chai_1.assert.isDefined(projection.name); + chai_1.assert.isString(projection.name); + chai_1.assert.isDefined(projection.size); + chai_1.assert.isTrue(vega_schema_1.isVgSignalRef(projection.size)); + chai_1.assert.isDefined(projection.fit); + chai_1.assert.isTrue(vega_schema_1.isVgSignalRef(projection.fit)); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9wcm9qZWN0aW9uL2Fzc2VtYmxlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIscUVBQW9GO0FBQ3BGLHdEQUF1RDtBQUN2RCxtQ0FBZ0U7QUFFaEUsUUFBUSxDQUFDLDZCQUE2QixFQUFFO0lBQ3RDLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRTtRQUNyQyxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztZQUNqRCxNQUFNLEVBQUUsVUFBVTtZQUNsQixZQUFZLEVBQUU7Z0JBQ1osTUFBTSxFQUFFLFdBQVc7YUFDcEI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sS0FBSyxFQUFFLGtCQUFrQjtnQkFDekIsUUFBUSxFQUFFO29CQUNSLE1BQU0sRUFBRSxVQUFVO29CQUNsQixTQUFTLEVBQUUsUUFBUTtpQkFDcEI7YUFDRjtZQUNELFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWQsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hCLGFBQU0sQ0FBQyxVQUFVLENBQUMscUNBQTBCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtZQUN6QyxJQUFNLFVBQVUsR0FBRyxxQ0FBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RCxhQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxhQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxhQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxhQUFNLENBQUMsTUFBTSxDQUFDLDJCQUFhLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDOUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsYUFBTSxDQUFDLE1BQU0sQ0FBQywyQkFBYSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7YXNzZW1ibGVQcm9qZWN0aW9uRm9yTW9kZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3Byb2plY3Rpb24vYXNzZW1ibGUnO1xuaW1wb3J0IHtpc1ZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnY29tcGlsZS9wcm9qZWN0aW9uL2Fzc2VtYmxlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnYXNzZW1ibGVQcm9qZWN0aW9uRm9yTW9kZWwnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgJ21hcmsnOiAnZ2Vvc2hhcGUnLFxuICAgICAgJ3Byb2plY3Rpb24nOiB7XG4gICAgICAgICd0eXBlJzogJ2FsYmVyc1VzYSdcbiAgICAgIH0sXG4gICAgICAnZGF0YSc6IHtcbiAgICAgICAgJ3VybCc6ICdkYXRhL3VzLTEwbS5qc29uJyxcbiAgICAgICAgJ2Zvcm1hdCc6IHtcbiAgICAgICAgICAndHlwZSc6ICd0b3BvanNvbicsXG4gICAgICAgICAgJ2ZlYXR1cmUnOiAnc3RhdGVzJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJ2VuY29kaW5nJzoge31cbiAgICB9KTtcbiAgICBtb2RlbC5wYXJzZSgpO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgYmUgZW1wdHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuaXNOb3RFbXB0eShhc3NlbWJsZVByb2plY3Rpb25Gb3JNb2RlbChtb2RlbCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIHByb3BlcnRpZXMgb2YgcmlnaHQgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHByb2plY3Rpb24gPSBhc3NlbWJsZVByb2plY3Rpb25Gb3JNb2RlbChtb2RlbClbMF07XG4gICAgICBhc3NlcnQuaXNEZWZpbmVkKHByb2plY3Rpb24ubmFtZSk7XG4gICAgICBhc3NlcnQuaXNTdHJpbmcocHJvamVjdGlvbi5uYW1lKTtcbiAgICAgIGFzc2VydC5pc0RlZmluZWQocHJvamVjdGlvbi5zaXplKTtcbiAgICAgIGFzc2VydC5pc1RydWUoaXNWZ1NpZ25hbFJlZihwcm9qZWN0aW9uLnNpemUpKTtcbiAgICAgIGFzc2VydC5pc0RlZmluZWQocHJvamVjdGlvbi5maXQpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShpc1ZnU2lnbmFsUmVmKHByb2plY3Rpb24uZml0KSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/projection/parse.test.d.ts b/build/test/compile/projection/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/projection/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/projection/parse.test.js b/build/test/compile/projection/parse.test.js new file mode 100644 index 0000000000..418690dea9 --- /dev/null +++ b/build/test/compile/projection/parse.test.js @@ -0,0 +1,306 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var util_1 = require("../../util"); +/* tslint:disable:quotemark */ +describe('src/compile/projection/parse', function () { + describe('parseUnitProjection', function () { + it('should create projection from specified projection', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }); + model.parse(); + chai_1.assert.deepEqual(model.component.projection.explicit, { type: 'albersUsa' }); + }); + it('should create projection with no props', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }); + model.parse(); + chai_1.assert.deepEqual(model.component.projection.explicit, {}); + }); + it('should create projection from config', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {}, + "config": { + "projection": { + "type": "albersUsa" + } + } + }); + model.parse(); + chai_1.assert.deepEqual(model.component.projection.explicit, { type: 'albersUsa' }); + }); + it('should add data with signal', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "data": { + "url": "data/airports.csv", + "format": { + "type": "csv" + } + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + }); + model.parse(); + chai_1.assert.isObject(model.component.projection.data[0]); + chai_1.assert.property(model.component.projection.data[0], 'signal'); + }); + it('should add data from main', function () { + var model = util_1.parseUnitModelWithScaleAndLayoutSize({ + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }); + model.parse(); + chai_1.assert.isString(model.component.projection.data[0]); + chai_1.assert.isNotObject(model.component.projection.data[0]); + chai_1.assert.notProperty(model.component.projection.data[0], 'signal'); + }); + }); + describe('parseNonUnitProjection', function () { + it('should merge the same projection', function () { + var model = util_1.parseLayerModel({ + "layer": [ + { + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }, + { + "data": { + "url": "data/airports.csv" + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + } + ] + }); + model.parse(); + chai_1.assert.deepEqual(model.component.projection.explicit, { type: 'albersUsa' }); + }); + it('should merge in empty projection to specified projection', function () { + var emptyFirst = util_1.parseLayerModel({ + "layer": [ + { + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }, + { + "data": { + "url": "data/airports.csv" + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + } + ] + }); + emptyFirst.parse(); + chai_1.assert.deepEqual(emptyFirst.component.projection.explicit, { type: 'albersUsa' }); + var emptyLast = util_1.parseLayerModel({ + "layer": [ + { + "mark": "geoshape", + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }, + { + "data": { + "url": "data/airports.csv" + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + } + ] + }); + emptyLast.parse(); + chai_1.assert.deepEqual(emptyLast.component.projection.explicit, { type: 'albersUsa' }); + }); + it('should merge projections with same size, different data', function () { + var model = util_1.parseLayerModel({ + "layer": [ + { + "mark": "geoshape", + "projection": { + "type": "albersUsa" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }, + { + "data": { + "url": "data/airports.csv" + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + } + ] + }); + model.parse(); + chai_1.assert.deepEqual(model.component.projection.explicit, { type: 'albersUsa' }); + }); + it('should not merge different specified projections', function () { + var model = util_1.parseLayerModel({ + "layer": [ + { + "mark": "geoshape", + "projection": { + "type": "mercator" + }, + "data": { + "url": "data/us-10m.json", + "format": { + "type": "topojson", + "feature": "states" + } + }, + "encoding": {} + }, + { + "data": { + "url": "data/airports.csv" + }, + "mark": "circle", + "projection": { + "type": "albersUsa" + }, + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + } + ] + }); + model.parse(); + chai_1.assert.isUndefined(model.component.projection); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9wcm9qZWN0aW9uL3BhcnNlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsbUNBQWlGO0FBQ2pGLDhCQUE4QjtBQUU5QixRQUFRLENBQUMsOEJBQThCLEVBQUU7SUFDdkMsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1FBQzlCLEVBQUUsQ0FBQyxvREFBb0QsRUFBRTtZQUN2RCxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztnQkFDakQsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLFlBQVksRUFBRTtvQkFDWixNQUFNLEVBQUUsV0FBVztpQkFDcEI7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLEtBQUssRUFBRSxrQkFBa0I7b0JBQ3pCLFFBQVEsRUFBRTt3QkFDUixNQUFNLEVBQUUsVUFBVTt3QkFDbEIsU0FBUyxFQUFFLFFBQVE7cUJBQ3BCO2lCQUNGO2dCQUNELFVBQVUsRUFBRSxFQUFFO2FBQ2YsQ0FBQyxDQUFDO1lBQ0gsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2QsYUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztRQUM3RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxJQUFNLEtBQUssR0FBRywyQ0FBb0MsQ0FBQztnQkFDakQsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRTtvQkFDTixLQUFLLEVBQUUsa0JBQWtCO29CQUN6QixRQUFRLEVBQUU7d0JBQ1IsTUFBTSxFQUFFLFVBQVU7d0JBQ2xCLFNBQVMsRUFBRSxRQUFRO3FCQUNwQjtpQkFDRjtnQkFDRCxVQUFVLEVBQUUsRUFBRTthQUNmLENBQUMsQ0FBQztZQUNILEtB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TGF5ZXJNb2RlbCwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplfSBmcm9tICcuLi8uLi91dGlsJztcbi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5kZXNjcmliZSgnc3JjL2NvbXBpbGUvcHJvamVjdGlvbi9wYXJzZScsIGZ1bmN0aW9uICgpIHtcbiAgZGVzY3JpYmUoJ3BhcnNlVW5pdFByb2plY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjcmVhdGUgcHJvamVjdGlvbiBmcm9tIHNwZWNpZmllZCBwcm9qZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoe1xuICAgICAgICBcIm1hcmtcIjogXCJnZW9zaGFwZVwiLFxuICAgICAgICBcInByb2plY3Rpb25cIjoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImFsYmVyc1VzYVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidG9wb2pzb25cIixcbiAgICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uLmV4cGxpY2l0LCB7dHlwZTogJ2FsYmVyc1VzYSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIHByb2plY3Rpb24gd2l0aCBubyBwcm9wcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGVBbmRMYXlvdXRTaXplKHtcbiAgICAgICAgXCJtYXJrXCI6IFwiZ2Vvc2hhcGVcIixcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICBcImZvcm1hdFwiOiB7XG4gICAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgICAgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2UoKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZXhwbGljaXQsIHt9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY3JlYXRlIHByb2plY3Rpb24gZnJvbSBjb25maWcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidG9wb2pzb25cIixcbiAgICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHt9LFxuICAgICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgICAgXCJwcm9qZWN0aW9uXCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImFsYmVyc1VzYVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uLmV4cGxpY2l0LCB7dHlwZTogJ2FsYmVyc1VzYSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYWRkIGRhdGEgd2l0aCBzaWduYWwnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL2FpcnBvcnRzLmNzdlwiLFxuICAgICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcImNzdlwiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgICAgXCJwcm9qZWN0aW9uXCI6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJhbGJlcnNVc2FcIlxuICAgICAgICB9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcImxvbmdpdHVkZVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwibG9uZ2l0dWRlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJsYXRpdHVkZVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwibGF0aXR1ZGVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG4gICAgICBhc3NlcnQuaXNPYmplY3QobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YVswXSk7XG4gICAgICBhc3NlcnQucHJvcGVydHkobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YVswXSwgJ3NpZ25hbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBhZGQgZGF0YSBmcm9tIG1haW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlQW5kTGF5b3V0U2l6ZSh7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwidG9wb2pzb25cIixcbiAgICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG4gICAgICBhc3NlcnQuaXNTdHJpbmcobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YVswXSk7XG4gICAgICBhc3NlcnQuaXNOb3RPYmplY3QobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YVswXSk7XG4gICAgICBhc3NlcnQubm90UHJvcGVydHkobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YVswXSwgJ3NpZ25hbCcpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VOb25Vbml0UHJvamVjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIG1lcmdlIHRoZSBzYW1lIHByb2plY3Rpb24nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgICAgICBcInByb2plY3Rpb25cIjoge1xuICAgICAgICAgICAgICBcInR5cGVcIjogXCJhbGJlcnNVc2FcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS91cy0xMG0uanNvblwiLFxuICAgICAgICAgICAgICBcImZvcm1hdFwiOiB7XG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwidG9wb2pzb25cIixcbiAgICAgICAgICAgICAgICBcImZlYXR1cmVcIjogXCJzdGF0ZXNcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7fVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL2FpcnBvcnRzLmNzdlwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IFwiY2lyY2xlXCIsXG4gICAgICAgICAgICBcInByb2plY3Rpb25cIjoge1xuICAgICAgICAgICAgICBcInR5cGVcIjogXCJhbGJlcnNVc2FcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcImxvbmdpdHVkZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvbmdpdHVkZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwibGF0aXR1ZGVcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsYXRpdHVkZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgbW9kZWwucGFyc2UoKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LnByb2plY3Rpb24uZXhwbGljaXQsIHt0eXBlOiAnYWxiZXJzVXNhJ30pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZXJnZSBpbiBlbXB0eSBwcm9qZWN0aW9uIHRvIHNwZWNpZmllZCBwcm9qZWN0aW9uJywgKCkgPT4ge1xuICAgICAgY29uc3QgZW1wdHlGaXJzdCA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInRvcG9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9haXJwb3J0cy5jc3ZcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgICAgICAgICAgXCJwcm9qZWN0aW9uXCI6IHtcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJsb25naXR1ZGVcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb25naXR1ZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImxhdGl0dWRlXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibGF0aXR1ZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICAgIGVtcHR5Rmlyc3QucGFyc2UoKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZW1wdHlGaXJzdC5jb21wb25lbnQucHJvamVjdGlvbi5leHBsaWNpdCwge3R5cGU6ICdhbGJlcnNVc2EnfSk7XG4gICAgICBjb25zdCBlbXB0eUxhc3QgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJnZW9zaGFwZVwiLFxuICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvYWlycG9ydHMuY3N2XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImFsYmVyc1VzYVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwibG9uZ2l0dWRlXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG9uZ2l0dWRlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJsYXRpdHVkZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxhdGl0dWRlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBlbXB0eUxhc3QucGFyc2UoKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZW1wdHlMYXN0LmNvbXBvbmVudC5wcm9qZWN0aW9uLmV4cGxpY2l0LCB7dHlwZTogJ2FsYmVyc1VzYSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWVyZ2UgcHJvamVjdGlvbnMgd2l0aCBzYW1lIHNpemUsIGRpZmZlcmVudCBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJnZW9zaGFwZVwiLFxuICAgICAgICAgICAgXCJwcm9qZWN0aW9uXCI6IHtcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInRvcG9qc29uXCIsXG4gICAgICAgICAgICAgICAgXCJmZWF0dXJlXCI6IFwic3RhdGVzXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge31cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICAgIFwidXJsXCI6IFwiZGF0YS9haXJwb3J0cy5jc3ZcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgICAgICAgICAgXCJwcm9qZWN0aW9uXCI6IHtcbiAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJsb25naXR1ZGVcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb25naXR1ZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImxhdGl0dWRlXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibGF0aXR1ZGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICAgIG1vZGVsLnBhcnNlKCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uLmV4cGxpY2l0LCB7dHlwZTogJ2FsYmVyc1VzYSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IG1lcmdlIGRpZmZlcmVudCBzcGVjaWZpZWQgcHJvamVjdGlvbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgICAgICBcInByb2plY3Rpb25cIjoge1xuICAgICAgICAgICAgICBcInR5cGVcIjogXCJtZXJjYXRvclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgXCJ1cmxcIjogXCJkYXRhL3VzLTEwbS5qc29uXCIsXG4gICAgICAgICAgICAgIFwiZm9ybWF0XCI6IHtcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJ0b3BvanNvblwiLFxuICAgICAgICAgICAgICAgIFwiZmVhdHVyZVwiOiBcInN0YXRlc1wiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHt9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImRhdGFcIjoge1xuICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvYWlycG9ydHMuY3N2XCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XG4gICAgICAgICAgICAgIFwidHlwZVwiOiBcImFsYmVyc1VzYVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwibG9uZ2l0dWRlXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG9uZ2l0dWRlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJsYXRpdHVkZVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxhdGl0dWRlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBtb2RlbC5wYXJzZSgpO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/repeat.test.d.ts b/build/test/compile/repeat.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/repeat.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/repeat.test.js b/build/test/compile/repeat.test.js new file mode 100644 index 0000000000..0632e4e5e9 --- /dev/null +++ b/build/test/compile/repeat.test.js @@ -0,0 +1,176 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var repeater_1 = require("../../src/compile/repeater"); +var log = tslib_1.__importStar(require("../../src/log")); +var util_1 = require("../../src/util"); +var util_2 = require("../util"); +describe('Repeat', function () { + describe('resolveRepeat', function () { + it('should resolve repeated fields', function () { + var resolved = repeater_1.replaceRepeaterInEncoding({ + x: { field: { repeat: 'row' }, type: 'quantitative' }, + y: { field: 'bar', type: 'quantitative' } + }, { row: 'foo' }); + chai_1.assert.deepEqual(resolved, { + x: { field: 'foo', type: 'quantitative' }, + y: { field: 'bar', type: 'quantitative' } + }); + }); + it('should show warning if repeat in field def cannot be resolved', log.wrap(function (localLogger) { + var resolved = repeater_1.replaceRepeaterInEncoding({ + x: { field: { repeat: 'row' }, type: 'quantitative' }, + y: { field: 'bar', type: 'quantitative' } + }, { column: 'foo' }); + chai_1.assert.equal(localLogger.warns[0], log.message.noSuchRepeatedValue('row')); + chai_1.assert.deepEqual(resolved, { + y: { field: 'bar', type: 'quantitative' } + }); + })); + it('should support arrays fo field defs', function () { + var resolved = repeater_1.replaceRepeaterInEncoding({ + detail: [ + { field: { repeat: 'row' }, type: 'quantitative' }, + { field: 'bar', type: 'quantitative' } + ] + }, { row: 'foo' }); + chai_1.assert.deepEqual(resolved, { + detail: [{ field: 'foo', type: 'quantitative' }, { field: 'bar', type: 'quantitative' }] + }); + }); + it('should replace fields in sort', function () { + var resolved = repeater_1.replaceRepeaterInEncoding({ + x: { field: 'bar', type: 'quantitative', sort: { field: { repeat: 'row' }, op: 'min' } } + }, { row: 'foo' }); + chai_1.assert.deepEqual(resolved, { + x: { field: 'bar', type: 'quantitative', sort: { field: 'foo', op: 'min' } } + }); + }); + it('should replace fields in conditionals', function () { + var resolved = repeater_1.replaceRepeaterInEncoding({ + color: { + condition: { selection: 'test', field: { repeat: 'row' }, type: 'quantitative' }, + value: 'red' + } + }, { row: 'foo' }); + chai_1.assert.deepEqual(resolved, { + color: { + condition: { selection: 'test', field: 'foo', type: 'quantitative' }, + value: 'red' + } + }); + }); + it('should replace fields in reveresed conditionals', function () { + var resolved = repeater_1.replaceRepeaterInEncoding({ + color: { + condition: { selection: 'test', value: 'red' }, + field: { repeat: 'row' }, type: 'quantitative' + } + }, { row: 'foo' }); + chai_1.assert.deepEqual(resolved, { + color: { + condition: { selection: 'test', value: 'red' }, + field: 'foo', type: 'quantitative' + } + }); + }); + it('should show warning if repeat in conditional cannot be resolved', log.wrap(function (localLogger) { + var resolved = repeater_1.replaceRepeaterInEncoding({ + color: { + condition: { selection: 'test', field: { repeat: 'row' }, type: 'quantitative' }, + value: 'red' + } + }, { column: 'foo' }); + chai_1.assert.equal(localLogger.warns[0], log.message.noSuchRepeatedValue('row')); + chai_1.assert.deepEqual(resolved, { + color: { value: 'red' } + }); + })); + it('should show warning if repeat in a condition field def cannot be resolved', log.wrap(function (localLogger) { + var resolved = repeater_1.replaceRepeaterInEncoding({ + color: { + condition: { selection: 'test', value: 'red' }, + field: { repeat: 'row' }, type: 'quantitative' + } + }, { column: 'foo' }); + chai_1.assert.equal(localLogger.warns[0], log.message.noSuchRepeatedValue('row')); + chai_1.assert.deepEqual(resolved, { + color: { + condition: { selection: 'test', value: 'red' } + } + }); + })); + }); + describe('initialize children', function () { + it('should create a model per repeated value', function () { + var model = util_2.parseRepeatModel({ + repeat: { + row: ['Acceleration', 'Horsepower'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' } + } + } + }); + chai_1.assert.equal(model.children.length, 2); + }); + it('should create n*m models if row and column are specified', function () { + var model = util_2.parseRepeatModel({ + repeat: { + row: ['Acceleration', 'Horsepower', 'Displacement'], + column: ['Origin', 'NumCylinders'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' }, + y: { field: { repeat: 'column' }, type: 'ordinal' } + } + } + }); + chai_1.assert.equal(model.children.length, 6); + }); + it('should union color scales and legends', function () { + var model = util_2.parseRepeatModel({ + repeat: { + row: ['foo', 'bar'], + column: ['foo', 'bar'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' }, + y: { field: { repeat: 'column' }, type: 'ordinal' }, + color: { field: 'baz', type: 'nominal' } + } + } + }); + model.parseScale(); + var colorScale = model.component.scales['color']; + chai_1.assert.deepEqual(colorScale.domains.length, 4); + model.parseLegend(); + chai_1.assert.equal(util_1.keys(model.component.legends).length, 1); + }); + }); + describe('resolve', function () { + it('cannot share axes', log.wrap(function (localLogger) { + util_2.parseRepeatModel({ + repeat: {}, + spec: { + mark: 'point', + encoding: {} + }, + resolve: { + axis: { + x: 'shared' + } + } + }); + chai_1.assert.equal(localLogger.warns[0], log.message.REPEAT_CANNOT_SHARE_AXIS); + })); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L2NvbXBpbGUvcmVwZWF0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTRCO0FBRTVCLHVEQUFxRTtBQUVyRSx5REFBcUM7QUFDckMsdUNBQW9DO0FBQ3BDLGdDQUF5QztBQUV6QyxRQUFRLENBQUMsUUFBUSxFQUFFO0lBQ2pCLFFBQVEsQ0FBQyxlQUFlLEVBQUU7UUFDeEIsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1lBQ25DLElBQU0sUUFBUSxHQUFHLG9DQUF5QixDQUFDO2dCQUN6QyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztnQkFDakQsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2FBQ3hDLEVBQUUsRUFBQyxHQUFHLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztZQUVqQixhQUFNLENBQUMsU0FBUyxDQUFtQixRQUFRLEVBQUU7Z0JBQzNDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztnQkFDdkMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2FBQ3hDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtEQUErRCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQ3ZGLElBQU0sUUFBUSxHQUFHLG9DQUF5QixDQUFDO2dCQUN6QyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztnQkFDakQsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEtB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ICdjaGFpJztcblxuaW1wb3J0IHtyZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nfSBmcm9tICcuLi8uLi9zcmMvY29tcGlsZS9yZXBlYXRlcic7XG5pbXBvcnQge0VuY29kaW5nfSBmcm9tICcuLi8uLi9zcmMvZW5jb2RpbmcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi8uLi9zcmMvdXRpbCc7XG5pbXBvcnQge3BhcnNlUmVwZWF0TW9kZWx9IGZyb20gJy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnUmVwZWF0JywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCdyZXNvbHZlUmVwZWF0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmVzb2x2ZSByZXBlYXRlZCBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlcGxhY2VSZXBlYXRlckluRW5jb2Rpbmcoe1xuICAgICAgICB4OiB7ZmllbGQ6IHtyZXBlYXQ6ICdyb3cnfSwgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICB5OiB7ZmllbGQ6ICdiYXInLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgIH0sIHtyb3c6ICdmb28nfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8RW5jb2Rpbmc8c3RyaW5nPj4ocmVzb2x2ZWQsIHtcbiAgICAgICAgeDoge2ZpZWxkOiAnZm9vJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICB5OiB7ZmllbGQ6ICdiYXInLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaG93IHdhcm5pbmcgaWYgcmVwZWF0IGluIGZpZWxkIGRlZiBjYW5ub3QgYmUgcmVzb2x2ZWQnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVwbGFjZVJlcGVhdGVySW5FbmNvZGluZyh7XG4gICAgICAgIHg6IHtmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgIHk6IHtmaWVsZDogJ2JhcicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgfSwge2NvbHVtbjogJ2Zvbyd9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5ub1N1Y2hSZXBlYXRlZFZhbHVlKCdyb3cnKSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc29sdmVkLCB7XG4gICAgICAgIHk6IHtmaWVsZDogJ2JhcicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGFycmF5cyBmbyBmaWVsZCBkZWZzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKHtcbiAgICAgICAgZGV0YWlsOiBbXG4gICAgICAgICAge2ZpZWxkOiB7cmVwZWF0OiAncm93J30sIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICB7ZmllbGQ6ICdiYXInLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgXVxuICAgICAgfSwge3JvdzogJ2Zvbyd9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxFbmNvZGluZzxzdHJpbmc+PihyZXNvbHZlZCwge1xuICAgICAgICBkZXRhaWw6IFt7ZmllbGQ6ICdmb28nLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sIHtmaWVsZDogJ2JhcicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfV1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXBsYWNlIGZpZWxkcyBpbiBzb3J0JywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKHtcbiAgICAgICAgeDoge2ZpZWxkOiAnYmFyJywgdHlwZTogJ3F1YW50aXRhdGl2ZScsIHNvcnQ6IHtmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCBvcDogJ21pbid9fVxuICAgICAgfSwge3JvdzogJ2Zvbyd9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxFbmNvZGluZzxzdHJpbmc+PihyZXNvbHZlZCwge1xuICAgICAgICB4OiB7ZmllbGQ6ICdiYXInLCB0eXBlOiAncXVhbnRpdGF0aXZlJywgc29ydDoge2ZpZWxkOiAnZm9vJywgb3A6ICdtaW4nfX1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXBsYWNlIGZpZWxkcyBpbiBjb25kaXRpb25hbHMnLCAoKSA9PiB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlcGxhY2VSZXBlYXRlckluRW5jb2Rpbmcoe1xuICAgICAgICBjb2xvcjoge1xuICAgICAgICAgIGNvbmRpdGlvbjoge3NlbGVjdGlvbjogJ3Rlc3QnLCBmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgdmFsdWU6ICdyZWQnXG4gICAgICAgIH1cbiAgICAgIH0sIHtyb3c6ICdmb28nfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8RW5jb2Rpbmc8c3RyaW5nPj4ocmVzb2x2ZWQsIHtcbiAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICBjb25kaXRpb246IHtzZWxlY3Rpb246ICd0ZXN0JywgZmllbGQ6ICdmb28nLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgdmFsdWU6ICdyZWQnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXBsYWNlIGZpZWxkcyBpbiByZXZlcmVzZWQgY29uZGl0aW9uYWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKHtcbiAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICBjb25kaXRpb246IHtzZWxlY3Rpb246ICd0ZXN0JywgdmFsdWU6ICdyZWQnfSxcbiAgICAgICAgICBmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCB0eXBlOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICB9XG4gICAgICB9LCB7cm93OiAnZm9vJ30pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPEVuY29kaW5nPHN0cmluZz4+KHJlc29sdmVkLCB7XG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgY29uZGl0aW9uOiB7c2VsZWN0aW9uOiAndGVzdCcsIHZhbHVlOiAncmVkJ30sXG4gICAgICAgICAgZmllbGQ6ICdmb28nLCB0eXBlOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2hvdyB3YXJuaW5nIGlmIHJlcGVhdCBpbiBjb25kaXRpb25hbCBjYW5ub3QgYmUgcmVzb2x2ZWQnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVwbGFjZVJlcGVhdGVySW5FbmNvZGluZyh7XG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgY29uZGl0aW9uOiB7c2VsZWN0aW9uOiAndGVzdCcsIGZpZWxkOiB7cmVwZWF0OiAncm93J30sIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICB2YWx1ZTogJ3JlZCdcbiAgICAgICAgfVxuICAgICAgfSwge2NvbHVtbjogJ2Zvbyd9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5ub1N1Y2hSZXBlYXRlZFZhbHVlKCdyb3cnKSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc29sdmVkLCB7XG4gICAgICAgIGNvbG9yOiB7dmFsdWU6ICdyZWQnfVxuICAgICAgfSk7XG4gICAgfSkpO1xuXG4gICAgaXQoJ3Nob3VsZCBzaG93IHdhcm5pbmcgaWYgcmVwZWF0IGluIGEgY29uZGl0aW9uIGZpZWxkIGRlZiBjYW5ub3QgYmUgcmVzb2x2ZWQnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcmVwbGFjZVJlcGVhdGVySW5FbmNvZGluZyh7XG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgY29uZGl0aW9uOiB7c2VsZWN0aW9uOiAndGVzdCcsIHZhbHVlOiAncmVkJ30sXG4gICAgICAgICAgZmllbGQ6IHtyZXBlYXQ6ICdyb3cnfSwgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgfVxuICAgICAgfSwge2NvbHVtbjogJ2Zvbyd9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5ub1N1Y2hSZXBlYXRlZFZhbHVlKCdyb3cnKSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHJlc29sdmVkLCB7XG4gICAgICAgIGNvbG9yOiB7XG4gICAgICAgICAgY29uZGl0aW9uOiB7c2VsZWN0aW9uOiAndGVzdCcsIHZhbHVlOiAncmVkJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnaW5pdGlhbGl6ZSBjaGlsZHJlbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBhIG1vZGVsIHBlciByZXBlYXRlZCB2YWx1ZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VSZXBlYXRNb2RlbCh7XG4gICAgICAgIHJlcGVhdDoge1xuICAgICAgICAgIHJvdzogWydBY2NlbGVyYXRpb24nLCAnSG9yc2Vwb3dlciddXG4gICAgICAgIH0sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6IHtyZXBlYXQ6ICdyb3cnfSwgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNoaWxkcmVuLmxlbmd0aCwgMik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNyZWF0ZSBuKm0gbW9kZWxzIGlmIHJvdyBhbmQgY29sdW1uIGFyZSBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlUmVwZWF0TW9kZWwoe1xuICAgICAgICByZXBlYXQ6IHtcbiAgICAgICAgICByb3c6IFsnQWNjZWxlcmF0aW9uJywgJ0hvcnNlcG93ZXInLCAnRGlzcGxhY2VtZW50J10sXG4gICAgICAgICAgY29sdW1uOiBbJ09yaWdpbicsICdOdW1DeWxpbmRlcnMnXVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiB7cmVwZWF0OiAncm93J30sIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDoge3JlcGVhdDogJ2NvbHVtbid9LCB0eXBlOiAnb3JkaW5hbCd9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmNoaWxkcmVuLmxlbmd0aCwgNik7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVuaW9uIGNvbG9yIHNjYWxlcyBhbmQgbGVnZW5kcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VSZXBlYXRNb2RlbCh7XG4gICAgICAgIHJlcGVhdDoge1xuICAgICAgICAgIHJvdzogWydmb28nLCAnYmFyJ10sXG4gICAgICAgICAgY29sdW1uOiBbJ2ZvbycsICdiYXInXVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiB7cmVwZWF0OiAncm93J30sIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDoge3JlcGVhdDogJ2NvbHVtbid9LCB0eXBlOiAnb3JkaW5hbCd9LFxuICAgICAgICAgICAgY29sb3I6IHtmaWVsZDogJ2JheicsIHR5cGU6ICdub21pbmFsJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gICAgICBjb25zdCBjb2xvclNjYWxlID0gbW9kZWwuY29tcG9uZW50LnNjYWxlc1snY29sb3InXTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChjb2xvclNjYWxlLmRvbWFpbnMubGVuZ3RoLCA0KTtcblxuICAgICAgbW9kZWwucGFyc2VMZWdlbmQoKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGtleXMobW9kZWwuY29tcG9uZW50LmxlZ2VuZHMpLmxlbmd0aCwgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdyZXNvbHZlJywgKCkgPT4ge1xuICAgIGl0KCdjYW5ub3Qgc2hhcmUgYXhlcycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgcGFyc2VSZXBlYXRNb2RlbCh7XG4gICAgICAgIHJlcGVhdDoge30sXG4gICAgICAgIHNwZWM6IHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7fVxuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlOiB7XG4gICAgICAgICAgYXhpczoge1xuICAgICAgICAgICAgeDogJ3NoYXJlZCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5SRVBFQVRfQ0FOTk9UX1NIQVJFX0FYSVMpO1xuICAgIH0pKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/resolve.test.d.ts b/build/test/compile/resolve.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/resolve.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/resolve.test.js b/build/test/compile/resolve.test.js new file mode 100644 index 0000000000..5256d7974b --- /dev/null +++ b/build/test/compile/resolve.test.js @@ -0,0 +1,107 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var resolve_1 = require("../../src/compile/resolve"); +var log = tslib_1.__importStar(require("../../src/log")); +var util_1 = require("../util"); +describe('compile/resolve', function () { + describe('defaultScaleResolve', function () { + it('shares scales for layer model by default.', function () { + var model = util_1.parseLayerModel({ + layer: [] + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('x', model), 'shared'); + }); + it('shares scales for facet model by default.', function () { + var model = util_1.parseFacetModel({ + facet: { + row: { field: 'a', type: 'nominal' } + }, + spec: { mark: 'point', encoding: {} } + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('x', model), 'shared'); + }); + it('separates xy scales for concat model by default.', function () { + var model = util_1.parseConcatModel({ + hconcat: [] + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('x', model), 'independent'); + }); + it('shares non-xy scales for concat model by default.', function () { + var model = util_1.parseConcatModel({ + hconcat: [] + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('color', model), 'shared'); + }); + it('separates xy scales for repeat model by default.', function () { + var model = util_1.parseRepeatModel({ + repeat: { + row: ['a', 'b'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' }, + color: { field: 'color', type: 'quantitative' } + } + } + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('x', model), 'independent'); + }); + it('shares non-xy scales for repeat model by default.', function () { + var model = util_1.parseRepeatModel({ + repeat: { + row: ['a', 'b'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' }, + color: { field: 'color', type: 'quantitative' } + } + } + }); + chai_1.assert.equal(resolve_1.defaultScaleResolve('color', model), 'shared'); + }); + }); + describe('parseGuideResolve', function () { + it('shares axis for a shared scale by default', function () { + var axisResolve = resolve_1.parseGuideResolve({ + scale: { x: 'shared' }, + axis: {} + }, 'x'); + chai_1.assert.equal(axisResolve, 'shared'); + }); + it('separates axis for a shared scale if specified', function () { + var axisResolve = resolve_1.parseGuideResolve({ + scale: { x: 'shared' }, + axis: { x: 'independent' } + }, 'x'); + chai_1.assert.equal(axisResolve, 'independent'); + }); + it('separates legend for a shared scale if specified', function () { + var legendResolve = resolve_1.parseGuideResolve({ + scale: { color: 'shared' }, + legend: { color: 'independent' } + }, 'color'); + chai_1.assert.equal(legendResolve, 'independent'); + }); + it('separates axis for an independent scale by default', function () { + var axisResolve = resolve_1.parseGuideResolve({ + scale: { x: 'independent' }, + axis: {} + }, 'x'); + chai_1.assert.equal(axisResolve, 'independent'); + }); + it('separates axis for an independent scale even "shared" is specified and throw warning', log.wrap(function (localLogger) { + var axisResolve = resolve_1.parseGuideResolve({ + scale: { x: 'independent' }, + axis: { x: 'shared' } + }, 'x'); + chai_1.assert.equal(axisResolve, 'independent'); + chai_1.assert.equal(localLogger.warns[0], log.message.independentScaleMeansIndependentGuide('x')); + })); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9jb21waWxlL3Jlc29sdmUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIscURBQWlGO0FBQ2pGLHlEQUFxQztBQUNyQyxnQ0FBNkY7QUFFN0YsUUFBUSxDQUFDLGlCQUFpQixFQUFFO0lBQzFCLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtRQUM5QixFQUFFLENBQUMsMkNBQTJDLEVBQUU7WUFDOUMsSUFBTSxLQUFLLEdBQUcsc0JBQWUsQ0FBQztnQkFDNUIsS0FBSyxFQUFFLEVBQUU7YUFDVixDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsS0FBSyxDQUFDLDZCQUFtQixDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRTtZQUM5QyxJQUFNLEtBQUssR0FBRyxzQkFBZSxDQUFDO2dCQUM1QixLQUFLLEVBQUU7b0JBQ0wsR0FBRyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO2lCQUNuQztnQkFDRCxJQUFJLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUM7YUFDcEMsQ0FBQyxDQUFDO1lBQ0gsYUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBbUIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsa0RBQWtELEVBQUU7WUFDckQsSUFBTSxLQUFLLEdBQUcsdUJBQWdCLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxFQUFFO2FBQ1osQ0FBQyxDQUFDO1lBQ0gsYUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBbUIsQ0FBQyxHQUFHLEVBQUUsS0FB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LE9BQU8sQ0FBQyxDQUFDO1lBQ1osYUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUU7WUFDdkQsSUFBTSxXQUFXLEdBQUcsMkJBQWlCLENBQUM7Z0JBQ3BDLEtBQUssRUFBRSxFQUFDLENBQUMsRUFBRSxhQUFhLEVBQUM7Z0JBQ3pCLElBQUksRUFBRSxFQUFFO2FBQ1QsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNSLGFBQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHNGQUFzRixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQzlHLElBQU0sV0FBVyxHQUFHLDJCQUFpQixDQUFDO2dCQUNwQyxLQUFLLEVBQUUsRUFBQyxDQUFDLEVBQUUsYUFBYSxFQUFDO2dCQUN6QixJQUFJLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDO2FBQ3BCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDUixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN6QyxhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdGLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtkZWZhdWx0U2NhbGVSZXNvbHZlLCBwYXJzZUd1aWRlUmVzb2x2ZX0gZnJvbSAnLi4vLi4vc3JjL2NvbXBpbGUvcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge3BhcnNlQ29uY2F0TW9kZWwsIHBhcnNlRmFjZXRNb2RlbCwgcGFyc2VMYXllck1vZGVsLCBwYXJzZVJlcGVhdE1vZGVsfSBmcm9tICcuLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvcmVzb2x2ZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2RlZmF1bHRTY2FsZVJlc29sdmUnLCAoKSA9PiB7XG4gICAgaXQoJ3NoYXJlcyBzY2FsZXMgZm9yIGxheWVyIG1vZGVsIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUxheWVyTW9kZWwoe1xuICAgICAgICBsYXllcjogW11cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRTY2FsZVJlc29sdmUoJ3gnLCBtb2RlbCksICdzaGFyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaGFyZXMgc2NhbGVzIGZvciBmYWNldCBtb2RlbCBieSBkZWZhdWx0LicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICByb3c6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9XG4gICAgICAgIH0sXG4gICAgICAgIHNwZWM6IHttYXJrOiAncG9pbnQnLCBlbmNvZGluZzoge319XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChkZWZhdWx0U2NhbGVSZXNvbHZlKCd4JywgbW9kZWwpLCAnc2hhcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VwYXJhdGVzIHh5IHNjYWxlcyBmb3IgY29uY2F0IG1vZGVsIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUNvbmNhdE1vZGVsKHtcbiAgICAgICAgaGNvbmNhdDogW11cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRTY2FsZVJlc29sdmUoJ3gnLCBtb2RlbCksICdpbmRlcGVuZGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlcyBub24teHkgc2NhbGVzIGZvciBjb25jYXQgbW9kZWwgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlQ29uY2F0TW9kZWwoe1xuICAgICAgICBoY29uY2F0OiBbXVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdFNjYWxlUmVzb2x2ZSgnY29sb3InLCBtb2RlbCksICdzaGFyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXBhcmF0ZXMgeHkgc2NhbGVzIGZvciByZXBlYXQgbW9kZWwgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlUmVwZWF0TW9kZWwoe1xuICAgICAgICByZXBlYXQ6IHtcbiAgICAgICAgICByb3c6IFsnYScsICdiJ11cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAnY29sb3InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRTY2FsZVJlc29sdmUoJ3gnLCBtb2RlbCksICdpbmRlcGVuZGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NoYXJlcyBub24teHkgc2NhbGVzIGZvciByZXBlYXQgbW9kZWwgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlUmVwZWF0TW9kZWwoe1xuICAgICAgICByZXBlYXQ6IHtcbiAgICAgICAgICByb3c6IFsnYScsICdiJ11cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDoge3JlcGVhdDogJ3Jvdyd9LCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAnY29sb3InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRlZmF1bHRTY2FsZVJlc29sdmUoJ2NvbG9yJywgbW9kZWwpLCAnc2hhcmVkJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZUd1aWRlUmVzb2x2ZScsICgpID0+IHtcbiAgICBpdCgnc2hhcmVzIGF4aXMgZm9yIGEgc2hhcmVkIHNjYWxlIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBheGlzUmVzb2x2ZSA9IHBhcnNlR3VpZGVSZXNvbHZlKHtcbiAgICAgICAgc2NhbGU6IHt4OiAnc2hhcmVkJ30sXG4gICAgICAgIGF4aXM6IHt9XG4gICAgICB9LCAneCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNSZXNvbHZlLCAnc2hhcmVkJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VwYXJhdGVzIGF4aXMgZm9yIGEgc2hhcmVkIHNjYWxlIGlmIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGF4aXNSZXNvbHZlID0gcGFyc2VHdWlkZVJlc29sdmUoe1xuICAgICAgICBzY2FsZToge3g6ICdzaGFyZWQnfSxcbiAgICAgICAgYXhpczoge3g6ICdpbmRlcGVuZGVudCd9XG4gICAgICB9LCAneCcpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGF4aXNSZXNvbHZlLCAnaW5kZXBlbmRlbnQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzZXBhcmF0ZXMgbGVnZW5kIGZvciBhIHNoYXJlZCBzY2FsZSBpZiBzcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBsZWdlbmRSZXNvbHZlID0gcGFyc2VHdWlkZVJlc29sdmUoe1xuICAgICAgICBzY2FsZToge2NvbG9yOiAnc2hhcmVkJ30sXG4gICAgICAgIGxlZ2VuZDoge2NvbG9yOiAnaW5kZXBlbmRlbnQnfVxuICAgICAgfSwgJ2NvbG9yJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobGVnZW5kUmVzb2x2ZSwgJ2luZGVwZW5kZW50Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2VwYXJhdGVzIGF4aXMgZm9yIGFuIGluZGVwZW5kZW50IHNjYWxlIGJ5IGRlZmF1bHQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBheGlzUmVzb2x2ZSA9IHBhcnNlR3VpZGVSZXNvbHZlKHtcbiAgICAgICAgc2NhbGU6IHt4OiAnaW5kZXBlbmRlbnQnfSxcbiAgICAgICAgYXhpczoge31cbiAgICAgIH0sICd4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoYXhpc1Jlc29sdmUsICdpbmRlcGVuZGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NlcGFyYXRlcyBheGlzIGZvciBhbiBpbmRlcGVuZGVudCBzY2FsZSBldmVuIFwic2hhcmVkXCIgaXMgc3BlY2lmaWVkIGFuZCB0aHJvdyB3YXJuaW5nJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBheGlzUmVzb2x2ZSA9IHBhcnNlR3VpZGVSZXNvbHZlKHtcbiAgICAgICAgc2NhbGU6IHt4OiAnaW5kZXBlbmRlbnQnfSxcbiAgICAgICAgYXhpczoge3g6ICdzaGFyZWQnfVxuICAgICAgfSwgJ3gnKTtcbiAgICAgIGFzc2VydC5lcXVhbChheGlzUmVzb2x2ZSwgJ2luZGVwZW5kZW50Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmluZGVwZW5kZW50U2NhbGVNZWFuc0luZGVwZW5kZW50R3VpZGUoJ3gnKSk7XG4gICAgfSkpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/scale/assemble.test.d.ts b/build/test/compile/scale/assemble.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/assemble.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/assemble.test.js b/build/test/compile/scale/assemble.test.js new file mode 100644 index 0000000000..4e4070a31b --- /dev/null +++ b/build/test/compile/scale/assemble.test.js @@ -0,0 +1,123 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/scale/assemble"); +var util_1 = require("../../util"); +describe('compile/scale/assemble', function () { + describe('assembleScales', function () { + it('includes all scales for concat', function () { + var model = util_1.parseConcatModel({ + vconcat: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' } + } + }, { + mark: 'bar', + encoding: { + x: { field: 'b', type: 'ordinal' }, + y: { field: 'c', type: 'quantitative' } + } + }] + }); + model.parseScale(); + var scales = assemble_1.assembleScales(model); + chai_1.assert.equal(scales.length, 3); + }); + it('includes all scales from children for layer, both shared and independent', function () { + var model = util_1.parseLayerModel({ + layer: [{ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + }, { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + }], + resolve: { + scale: { + x: 'independent' + } + } + }); + model.parseScale(); + var scales = assemble_1.assembleScales(model); + chai_1.assert.equal(scales.length, 3); // 2 x, 1 y + }); + it('includes all scales for repeat', function () { + var model = util_1.parseRepeatModel({ + repeat: { + row: ['Acceleration', 'Horsepower'] + }, + spec: { + mark: 'point', + encoding: { + x: { field: { repeat: 'row' }, type: 'quantitative' } + } + } + }); + model.parseScale(); + var scales = assemble_1.assembleScales(model); + chai_1.assert.equal(scales.length, 2); + }); + it('includes shared scales, but not independent scales (as they are nested) for facet.', function () { + var model = util_1.parseFacetModelWithScale({ + facet: { + column: { field: 'a', type: 'quantitative', format: 'd' } + }, + spec: { + mark: 'point', + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' } + } + }, + resolve: { + scale: { x: 'independent' } + } + }); + var scales = assemble_1.assembleScales(model); + chai_1.assert.equal(scales.length, 1); + chai_1.assert.equal(scales[0].name, 'y'); + }); + }); + describe('assembleScaleRange', function () { + it('replaces a range step constant with a signal', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'x', type: 'nominal' } + } + }); + chai_1.assert.deepEqual(assemble_1.assembleScaleRange({ step: 21 }, 'x', model, 'x'), { step: { signal: 'x_step' } }); + }); + it('updates width signal when renamed.', function () { + var model = util_1.parseUnitModelWithScale({ + mark: 'point', + encoding: { + x: { field: 'x', type: 'quantitative' } + } + }); + // mock renaming + model.renameLayoutSize('width', 'new_width'); + chai_1.assert.deepEqual(assemble_1.assembleScaleRange([0, { signal: 'width' }], 'x', model, 'x'), [0, { signal: 'new_width' }]); + }); + it('updates height signal when renamed.', function () { + var model = util_1.parseUnitModelWithScale({ + mark: 'point', + encoding: { + x: { field: 'y', type: 'quantitative' } + } + }); + // mock renaming + model.renameLayoutSize('height', 'new_height'); + chai_1.assert.deepEqual(assemble_1.assembleScaleRange([0, { signal: 'height' }], 'x', model, 'x'), [0, { signal: 'new_height' }]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zY2FsZS9hc3NlbWJsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBQzVCLGdFQUF1RjtBQUN2RixtQ0FBa0o7QUFFbEosUUFBUSxDQUFDLHdCQUF3QixFQUFFO0lBQ2pDLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsZ0NBQWdDLEVBQUU7WUFDbkMsSUFBTSxLQUFLLEdBQUcsdUJBQWdCLENBQUM7Z0JBQzdCLE9BQU8sRUFBRSxDQUFDO3dCQUNSLElBQUksRUFBRSxPQUFPO3dCQUNiLFFBQVEsRUFBRTs0QkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUM7eUJBQ2pDO3FCQUNGLEVBQUM7d0JBQ0EsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsUUFBUSxFQUFFOzRCQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQzs0QkFDaEMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO3lCQUN0QztxQkFDRixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1lBRUgsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25CLElBQU0sTUFBTSxHQUFHLHlCQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsYUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBR0gsRUFBRSxDQUFDLDBFQUEwRSxFQUFFO1lBQzdFLElBQU0sS0FBSyxHQUFHLHNCQUFlLENBQUM7Z0JBQzVCLEtBQUssRUFBRSxDQUFDO3dCQUNOLElBQUksRUFBRSxPQUFPO3dCQUNiLFFBQVEs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Z0I7WUFDaEIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUUvQyxhQUFNLENBQUMsU0FBUyxDQUNkLDZCQUFrQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFDNUQsQ0FBQyxDQUFDLEVBQUUsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FDNUIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7YXNzZW1ibGVTY2FsZVJhbmdlLCBhc3NlbWJsZVNjYWxlc30gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2NhbGUvYXNzZW1ibGUnO1xuaW1wb3J0IHtwYXJzZUNvbmNhdE1vZGVsLCBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGUsIHBhcnNlTGF5ZXJNb2RlbCwgcGFyc2VSZXBlYXRNb2RlbCwgcGFyc2VVbml0TW9kZWwsIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvc2NhbGUvYXNzZW1ibGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdhc3NlbWJsZVNjYWxlcycsICgpID0+IHtcbiAgICBpdCgnaW5jbHVkZXMgYWxsIHNjYWxlcyBmb3IgY29uY2F0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUNvbmNhdE1vZGVsKHtcbiAgICAgICAgdmNvbmNhdDogW3tcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICAgIH1cbiAgICAgICAgfSx7XG4gICAgICAgICAgbWFyazogJ2JhcicsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAnb3JkaW5hbCd9LFxuICAgICAgICAgICAgeToge2ZpZWxkOiAnYycsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfV1cbiAgICAgIH0pO1xuXG4gICAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gICAgICBjb25zdCBzY2FsZXMgPSBhc3NlbWJsZVNjYWxlcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2NhbGVzLmxlbmd0aCwgMyk7XG4gICAgfSk7XG5cblxuICAgIGl0KCdpbmNsdWRlcyBhbGwgc2NhbGVzIGZyb20gY2hpbGRyZW4gZm9yIGxheWVyLCBib3RoIHNoYXJlZCBhbmQgaW5kZXBlbmRlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlTGF5ZXJNb2RlbCh7XG4gICAgICAgIGxheWVyOiBbe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgICB5OiB7ZmllbGQ6ICdjJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgfVxuICAgICAgICB9LHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgICAgeToge2ZpZWxkOiAnYycsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfV0sXG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBzY2FsZToge1xuICAgICAgICAgICAgeDogJ2luZGVwZW5kZW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICAgIGNvbnN0IHNjYWxlcyA9IGFzc2VtYmxlU2NhbGVzKG1vZGVsKTtcbiAgICAgIGFzc2VydC5lcXVhbChzY2FsZXMubGVuZ3RoLCAzKTsgLy8gMiB4LCAxIHlcbiAgICB9KTtcblxuICAgIGl0KCdpbmNsdWRlcyBhbGwgc2NhbGVzIGZvciByZXBlYXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlUmVwZWF0TW9kZWwoe1xuICAgICAgICByZXBlYXQ6IHtcbiAgICAgICAgICByb3c6IFsnQWNjZWxlcmF0aW9uJywgJ0hvcnNlcG93ZXInXVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiB7cmVwZWF0OiAncm93J30sIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICAgIGNvbnN0IHNjYWxlcyA9IGFzc2VtYmxlU2NhbGVzKG1vZGVsKTtcbiAgICAgIGFzc2VydC5lcXVhbChzY2FsZXMubGVuZ3RoLCAyKTtcbiAgICB9KTtcblxuICAgIGl0KCdpbmNsdWRlcyBzaGFyZWQgc2NhbGVzLCBidXQgbm90IGluZGVwZW5kZW50IHNjYWxlcyAoYXMgdGhleSBhcmUgbmVzdGVkKSBmb3IgZmFjZXQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZUZhY2V0TW9kZWxXaXRoU2NhbGVcbiAgICAgICh7XG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgY29sdW1uOiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZScsIGZvcm1hdDogJ2QnfVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBzY2FsZToge3g6ICdpbmRlcGVuZGVudCd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY2FsZXMgPSBhc3NlbWJsZVNjYWxlcyhtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2NhbGVzLmxlbmd0aCwgMSk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2NhbGVzWzBdLm5hbWUsICd5Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhc3NlbWJsZVNjYWxlUmFuZ2UnLCAoKSA9PiB7XG4gICAgaXQoJ3JlcGxhY2VzIGEgcmFuZ2Ugc3RlcCBjb25zdGFudCB3aXRoIGEgc2lnbmFsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAneCcsIHR5cGU6ICdub21pbmFsJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgIGFzc2VtYmxlU2NhbGVSYW5nZSh7c3RlcDogMjF9LCAneCcsIG1vZGVsLCAneCcpLFxuICAgICAgICB7c3RlcDoge3NpZ25hbDogJ3hfc3RlcCd9fVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCd1cGRhdGVzIHdpZHRoIHNpZ25hbCB3aGVuIHJlbmFtZWQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAneCcsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbW9jayByZW5hbWluZ1xuICAgICAgbW9kZWwucmVuYW1lTGF5b3V0U2l6ZSgnd2lkdGgnLCAnbmV3X3dpZHRoJyk7XG5cblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgYXNzZW1ibGVTY2FsZVJhbmdlKFswLCB7c2lnbmFsOiAnd2lkdGgnfV0sICd4JywgbW9kZWwsICd4JyksXG4gICAgICAgIFswLCB7c2lnbmFsOiAnbmV3X3dpZHRoJ31dXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3VwZGF0ZXMgaGVpZ2h0IHNpZ25hbCB3aGVuIHJlbmFtZWQuJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAneScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gbW9jayByZW5hbWluZ1xuICAgICAgbW9kZWwucmVuYW1lTGF5b3V0U2l6ZSgnaGVpZ2h0JywgJ25ld19oZWlnaHQnKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgYXNzZW1ibGVTY2FsZVJhbmdlKFswLCB7c2lnbmFsOiAnaGVpZ2h0J31dLCAneCcsIG1vZGVsLCAneCcpLFxuICAgICAgICBbMCwge3NpZ25hbDogJ25ld19oZWlnaHQnfV1cbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/scale/domain.test.d.ts b/build/test/compile/scale/domain.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/domain.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/domain.test.js b/build/test/compile/scale/domain.test.js new file mode 100644 index 0000000000..0fe5d9812b --- /dev/null +++ b/build/test/compile/scale/domain.test.js @@ -0,0 +1,753 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var domain_1 = require("../../../src/compile/scale/domain"); +var parse_1 = require("../../../src/compile/scale/parse"); +var data_1 = require("../../../src/data"); +var log = tslib_1.__importStar(require("../../../src/log")); +var scale_1 = require("../../../src/scale"); +var util_1 = require("../../util"); +describe('compile/scale', function () { + describe('parseDomainForChannel()', function () { + function testParseDomainForChannel(model, channel) { + // Cannot parseDomain before parseScaleCore + parse_1.parseScaleCore(model); + return domain_1.parseDomainForChannel(model, channel); + } + it('should have correct domain with x and x2 channel', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'quantitative' }, + x2: { field: 'b', type: 'quantitative' }, + y: { field: 'c', type: 'quantitative' }, + y2: { field: 'd', type: 'quantitative' } + } + }); + var xDomain = testParseDomainForChannel(model, 'x'); + chai_1.assert.deepEqual(xDomain, [{ data: 'main', field: 'a' }, { data: 'main', field: 'b' }]); + var yDomain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(yDomain, [{ data: 'main', field: 'c' }, { data: 'main', field: 'd' }]); + }); + it('should have correct domain for color', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + color: { field: 'a', type: 'quantitative' }, + } + }); + var xDomain = testParseDomainForChannel(model, 'color'); + chai_1.assert.deepEqual(xDomain, [{ data: 'main', field: 'a' }]); + }); + it('should have correct domain for color ConditionField', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + color: { + condition: { selection: 'sel', field: 'a', type: 'quantitative' } + } + } + }); + var xDomain = testParseDomainForChannel(model, 'color'); + chai_1.assert.deepEqual(xDomain, [{ data: 'main', field: 'a' }]); + }); + it('should return domain for stack', function () { + var model = util_1.parseUnitModel({ + mark: "bar", + encoding: { + y: { + aggregate: 'sum', + field: 'origin', + type: 'quantitative' + }, + x: { field: 'x', type: "ordinal" }, + color: { field: 'color', type: "ordinal" } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: 'main', + field: 'sum_origin_start' + }, { + data: 'main', + field: 'sum_origin_end' + }]); + }); + it('should return normalize domain for stack if specified', function () { + var model = util_1.parseUnitModel({ + mark: "bar", + encoding: { + y: { + aggregate: 'sum', + field: 'origin', + type: 'quantitative' + }, + x: { field: 'x', type: "ordinal" }, + color: { field: 'color', type: "ordinal" } + }, + config: { + stack: "normalize" + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [[0, 1]]); + }); + describe('for quantitative', function () { + it('should return the right domain for binned Q', log.wrap(function (localLogger) { + var fieldDef = { + bin: { maxbins: 15 }, + field: 'origin', + scale: { domain: 'unaggregated' }, + type: 'quantitative' + }; + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: fieldDef + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: 'main', + field: 'bin_maxbins_15_origin' + }, { + data: 'main', + field: 'bin_maxbins_15_origin_end' + }]); + chai_1.assert.equal(localLogger.warns[0], log.message.unaggregateDomainHasNoEffectForRawField(fieldDef)); + })); + it('should follow the custom bin.extent for binned Q', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'origin', + type: 'quantitative', + bin: { maxbins: 15, extent: [0, 100] } + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [[0, 100]]); + })); + it('should return the unaggregated domain if requested for non-bin, non-sum Q', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + aggregate: 'mean', + field: 'acceleration', + scale: { domain: 'unaggregated' }, + type: "quantitative" + } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: data_1.MAIN, + field: 'min_acceleration' + }, { + data: data_1.MAIN, + field: 'max_acceleration' + }]); + }); + it('should return the aggregated domain for sum Q', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + aggregate: 'sum', + field: 'origin', + scale: { domain: 'unaggregated' }, + type: "quantitative" + } + } + }); + testParseDomainForChannel(model, 'y'); + chai_1.assert.equal(localLogger.warns[0], log.message.unaggregateDomainWithNonSharedDomainOp('sum')); + })); + it('should return the right custom domain', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'horsepower', + type: "quantitative", + scale: { domain: [0, 200] } + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [[0, 200]]); + }); + it('should follow the custom domain despite bin', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'origin', + type: 'quantitative', + scale: { domain: [0, 200] }, + bin: { maxbins: 15 } + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [[0, 200]]); + })); + it('should return the aggregated domain if we do not override it', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + aggregate: 'min', + field: 'origin', + type: "quantitative" + } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [ + { + data: 'main', + field: 'min_origin' + } + ]); + }); + it('should use the aggregated data for domain if specified in config', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + aggregate: 'min', + field: 'acceleration', + type: "quantitative" + } + }, + config: { + scale: { + useUnaggregatedDomain: true + } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: data_1.MAIN, + field: 'min_acceleration' + }, { + data: data_1.MAIN, + field: 'max_acceleration' + }]); + }); + }); + describe('for time', function () { + it('should return the correct domain for month T', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'origin', + type: "temporal", + timeUnit: 'month' + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [{ data: 'main', field: 'month_origin' }]); + }); + it('should return the correct domain for month O', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'origin', + type: "ordinal", + timeUnit: 'month' + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [{ data: 'main', field: 'month_origin', sort: true }]); + }); + it('should return the correct domain for yearmonth T', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'origin', + type: "temporal", + timeUnit: 'yearmonth' + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [{ data: 'main', field: 'yearmonth_origin' }]); + }); + it('should return the correct domain for month O when specify sort', function () { + var sortDef = { op: 'mean', field: 'precipitation', order: 'descending' }; + var model = util_1.parseUnitModel({ + mark: "bar", + encoding: { + x: { + timeUnit: 'month', + field: 'date', + type: 'ordinal', + sort: sortDef + }, + y: { + aggregate: 'mean', + field: 'precipitation', + type: 'quantitative' + } + } + }); + var _domain = testParseDomainForChannel(model, 'x'); + chai_1.assert.deepEqual(_domain, [{ + data: 'raw', + field: 'month_date', + sort: sortDef + }]); + }); + it('should return the right custom domain with DateTime objects', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { + field: 'year', + type: "temporal", + scale: { domain: [{ year: 1970 }, { year: 1980 }] } + } + } + }); + var _domain = testParseDomainForChannel(model, 'y'); + chai_1.assert.deepEqual(_domain, [ + { "signal": "{data: datetime(1970, 0, 1, 0, 0, 0, 0)}" }, + { "signal": "{data: datetime(1980, 0, 1, 0, 0, 0, 0)}" } + ]); + }); + }); + describe('for ordinal', function () { + it('should have correct domain for binned ordinal color', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + color: { field: 'a', bin: true, type: 'ordinal' }, + } + }); + var xDomain = testParseDomainForChannel(model, 'color'); + chai_1.assert.deepEqual(xDomain, [{ data: 'main', field: 'bin_maxbins_6_a_range', sort: { field: 'bin_maxbins_6_a', op: 'min' } }]); + }); + }); + describe('for nominal', function () { + it('should return correct domain with the provided sort property', function () { + var sortDef = { op: 'min', field: 'Acceleration' }; + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { field: 'origin', type: "nominal", sort: sortDef } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: "raw", + field: 'origin', + sort: sortDef + }]); + }); + it('should return correct domain with the provided sort property with order property', function () { + var sortDef = { op: 'min', field: 'Acceleration', order: "descending" }; + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { field: 'origin', type: "nominal", sort: sortDef } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: "raw", + field: 'origin', + sort: sortDef + }]); + }); + it('should return correct domain without sort if sort is not provided', function () { + var model = util_1.parseUnitModel({ + mark: "point", + encoding: { + y: { field: 'origin', type: "nominal" } + } + }); + chai_1.assert.deepEqual(testParseDomainForChannel(model, 'y'), [{ + data: "main", + field: 'origin', + sort: true + }]); + }); + }); + }); + describe('mergeDomains()', function () { + it('should merge the same domains', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean' } + }, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean' } + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean' } + }); + }); + it('should drop field if op is count', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { op: 'count', field: 'b' } + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a', + sort: { op: 'count' } + }); + }); + it('should sort the output domain if one domain is sorted', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean', order: 'descending' } + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean', order: 'descending' } + }); + }); + it('should sort the output domain if one domain is sorted with true', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: true + }, { + data: 'foo', + field: 'b', + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + fields: ['a', 'b'], + sort: true + }); + }); + it('should not sort if no domain is sorted', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'b', + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + fields: ['a', 'b'] + }); + }); + it('should ignore order ascending as it is the default', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean', order: 'ascending' } + }, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean' } + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a', + sort: { field: 'b', op: 'mean' } + }); + }); + it('should merge domains with the same data', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'a' + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a' + }); + }); + it('should merge domains with the same data source', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'b' + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + fields: ['a', 'b'] + }); + }); + it('should merge domains with different data source', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: true + }, { + data: 'bar', + field: 'a', + sort: true + }]); + chai_1.assert.deepEqual(domain, { + fields: [{ + data: 'foo', + field: 'a' + }, { + data: 'bar', + field: 'a' + }], + sort: true + }); + }); + it('should merge domains with different data and sort', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { + op: 'count' + } + }, { + data: 'bar', + field: 'a' + }]); + chai_1.assert.deepEqual(domain, { + fields: [{ + data: 'foo', + field: 'a' + }, { + data: 'bar', + field: 'a' + }], + sort: { + op: 'count' + } + }); + }); + it('should merge domains with the same and different data', function () { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'b' + }, { + data: 'bar', + field: 'a' + }]); + chai_1.assert.deepEqual(domain, { + fields: [{ + data: 'foo', + field: 'a' + }, { + data: 'foo', + field: 'b' + }, { + data: 'bar', + field: 'a' + }] + }); + }); + it('should merge signal domains', function () { + var domain = domain_1.mergeDomains([{ + signal: 'foo' + }, { + data: 'bar', + field: 'a' + }]); + chai_1.assert.deepEqual(domain, { + fields: [{ + signal: 'foo' + }, { + data: 'bar', + field: 'a' + } + ] + }); + }); + it('should warn if sorts conflict', log.wrap(function (localLogger) { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { + op: 'count' + } + }, { + data: 'foo', + field: 'b', + sort: true + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + fields: ['a', 'b'], + sort: true + }); + chai_1.assert.equal(localLogger.warns[0], log.message.MORE_THAN_ONE_SORT); + })); + it('should warn if sorts conflict even if we do not union', log.wrap(function (localLogger) { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { + op: 'count' + } + }, { + data: 'foo', + field: 'a', + sort: true + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + field: 'a', + sort: true + }); + chai_1.assert.equal(localLogger.warns[0], log.message.MORE_THAN_ONE_SORT); + })); + it('should warn if we had to drop complex sort', log.wrap(function (localLogger) { + var domain = domain_1.mergeDomains([{ + data: 'foo', + field: 'a', + sort: { + op: 'mean', + field: 'c' + } + }, { + data: 'foo', + field: 'b' + }]); + chai_1.assert.deepEqual(domain, { + data: 'foo', + fields: ['a', 'b'], + sort: true + }); + chai_1.assert.equal(localLogger.warns[0], log.message.domainSortDropped({ + op: 'mean', + field: 'c' + })); + })); + it('should not sort explicit domains', function () { + var domain = domain_1.mergeDomains([[1, 2, 3, 4], [3, 4, 5, 6]]); + chai_1.assert.deepEqual(domain, { + fields: [[1, 2, 3, 4], [3, 4, 5, 6]] + }); + }); + }); + describe('domainSort()', function () { + it('should return undefined for continuous domain', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.LINEAR); + chai_1.assert.deepEqual(sort, undefined); + }); + it('should return true by default for discrete domain', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' }, + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, true); + }); + it('should return true for ascending', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative', sort: 'ascending' }, + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, true); + }); + it('should return undefined if sort = null', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'quantitative', sort: null }, + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, undefined); + }); + it('should return normal sort spec if specified and aggregration is not count', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'nominal', sort: { op: 'sum', field: 'y' } }, + y: { field: 'b', aggregate: 'sum', type: 'quantitative' } + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, { op: 'sum', field: 'y' }); + }); + it('should return normal sort spec if aggregration is count and field not specified', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'nominal', sort: { op: 'count' } }, + y: { field: 'b', aggregate: 'sum', type: 'quantitative' } + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, { op: 'count' }); + }); + it('should return true if sort is not specified', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'nominal' }, + y: { field: 'b', aggregate: 'sum', type: 'quantitative' } + } + }); + var sort = domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL); + chai_1.assert.deepEqual(sort, true); + }); + it('should return undefined if sort is specified', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'nominal', sort: "descending" }, + y: { field: 'b', aggregate: 'sum', type: 'quantitative' } + } + }); + chai_1.assert.deepEqual(domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL), { op: 'min', field: 'a', order: 'descending' }); + }); + it('should return sort spec using derived sort index', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'ordinal', sort: ['B', 'A', 'C'] }, + y: { field: 'b', type: 'quantitative' } + } + }); + chai_1.assert.deepEqual(domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL), { op: 'min', field: 'x_a_sort_index', order: 'ascending' }); + }); + it('should return sort with flattened field access', function () { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { field: 'a', type: 'ordinal', sort: { field: 'foo.bar', op: 'mean' } }, + } + }); + chai_1.assert.deepEqual(domain_1.domainSort(model, 'x', scale_1.ScaleType.ORDINAL), { op: 'mean', field: 'foo\\.bar' }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2NhbGUvZG9tYWluLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUU1Qiw0REFBa0c7QUFDbEcsMERBQWdFO0FBRWhFLDBDQUF1QztBQUV2Qyw0REFBd0M7QUFDeEMsNENBQTZDO0FBRzdDLG1DQUEwQztBQUUxQyxRQUFRLENBQUMsZUFBZSxFQUFFO0lBQ3hCLFFBQVEsQ0FBQyx5QkFBeUIsRUFBRTtRQUNsQyxtQ0FBbUMsS0FBZ0IsRUFBRSxPQUFxQjtZQUN4RSwyQ0FBMkM7WUFDM0Msc0JBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFPLDhCQUFxQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBRUQsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQ3pCLElBQUksRUFBRSxLQUFLO2dCQUNYLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7b0JBQ3JDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztvQkFDdEMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO29CQUNyQyxFQUFFLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7aUJBQ3ZDO2FBQ0YsQ0FBQyxDQUFDO1lBRUwsSUFBTSxPQUFPLEdBQUcseUJBQXlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELGFBQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBQyxJ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QUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztnQkFDM0IsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUMsRUFBQztpQkFDdkU7YUFDRixDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsU0FBUyxDQUFjLG1CQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxpQkFBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztRQUM3RyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtTY2FsZUNoYW5uZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7ZG9tYWluU29ydCwgbWVyZ2VEb21haW5zLCBwYXJzZURvbWFpbkZvckNoYW5uZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL2RvbWFpbic7XG5pbXBvcnQge3BhcnNlU2NhbGVDb3JlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9wYXJzZSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvdW5pdCc7XG5pbXBvcnQge01BSU59IGZyb20gJy4uLy4uLy4uL3NyYy9kYXRhJztcbmltcG9ydCB7UG9zaXRpb25GaWVsZERlZn0gZnJvbSAnLi4vLi4vLi4vc3JjL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi8uLi9zcmMvbG9nJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi8uLi8uLi9zcmMvc2NhbGUnO1xuaW1wb3J0IHtFbmNvZGluZ1NvcnRGaWVsZH0gZnJvbSAnLi4vLi4vLi4vc3JjL3NvcnQnO1xuaW1wb3J0IHtWZ0RvbWFpbiwgVmdTb3J0RmllbGR9IGZyb20gJy4uLy4uLy4uL3NyYy92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ2NvbXBpbGUvc2NhbGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdwYXJzZURvbWFpbkZvckNoYW5uZWwoKScsICgpID0+IHtcbiAgICBmdW5jdGlvbiB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkge1xuICAgICAgLy8gQ2Fubm90IHBhcnNlRG9tYWluIGJlZm9yZSBwYXJzZVNjYWxlQ29yZVxuICAgICAgcGFyc2VTY2FsZUNvcmUobW9kZWwpO1xuICAgICAgcmV0dXJuIHBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwgY2hhbm5lbCk7XG4gICAgfVxuXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGNvcnJlY3QgZG9tYWluIHdpdGggeCBhbmQgeDIgY2hhbm5lbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogJ2JhcicsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgICB4Mjoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogJ2MnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgICB5Mjoge2ZpZWxkOiAnZCcsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhEb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCAneCcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh4RG9tYWluLCBbe2RhdGE6ICdtYWluJywgZmllbGQ6ICdhJ30sIHtkYXRhOiAnbWFpbicsIGZpZWxkOiAnYid9XSk7XG5cbiAgICAgIGNvbnN0IHlEb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCAneScpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh5RG9tYWluLCBbe2RhdGE6ICdtYWluJywgZmllbGQ6ICdjJ30sIHtkYXRhOiAnbWFpbicsIGZpZWxkOiAnZCd9XSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkb21haW4gZm9yIGNvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgY29sb3I6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgY29uc3QgeERvbWFpbiA9IHRlc3RQYXJzZURvbWFpbkZvckNoYW5uZWwobW9kZWwsICdjb2xvcicpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh4RG9tYWluLCBbe2RhdGE6ICdtYWluJywgZmllbGQ6ICdhJ31dKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaGF2ZSBjb3JyZWN0IGRvbWFpbiBmb3IgY29sb3IgQ29uZGl0aW9uRmllbGQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBjb2xvcjoge1xuICAgICAgICAgICAgICBjb25kaXRpb246IHtzZWxlY3Rpb246ICdzZWwnLCBmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCB4RG9tYWluID0gdGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwgJ2NvbG9yJyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHhEb21haW4sIFt7ZGF0YTogJ21haW4nLCBmaWVsZDogJ2EnfV0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZG9tYWluIGZvciBzdGFjaycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIG1hcms6IFwiYmFyXCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeToge1xuICAgICAgICAgICAgYWdncmVnYXRlOiAnc3VtJyxcbiAgICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICAgIHR5cGU6ICdxdWFudGl0YXRpdmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICB4OiB7ZmllbGQ6ICd4JywgdHlwZTogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6ICdjb2xvcicsIHR5cGU6IFwib3JkaW5hbFwifVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFt7XG4gICAgICAgIGRhdGE6ICdtYWluJyxcbiAgICAgICAgZmllbGQ6ICdzdW1fb3JpZ2luX3N0YXJ0J1xuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnbWFpbicsXG4gICAgICAgIGZpZWxkOiAnc3VtX29yaWdpbl9lbmQnXG4gICAgICB9XSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBub3JtYWxpemUgZG9tYWluIGZvciBzdGFjayBpZiBzcGVjaWZpZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiBcImJhclwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgIGFnZ3JlZ2F0ZTogJ3N1bScsXG4gICAgICAgICAgICBmaWVsZDogJ29yaWdpbicsXG4gICAgICAgICAgICB0eXBlOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeDoge2ZpZWxkOiAneCcsIHR5cGU6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAnY29sb3InLCB0eXBlOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnOiB7XG4gICAgICAgICAgc3RhY2s6IFwibm9ybWFsaXplXCJcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpLCBbWzAsIDFdXSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZm9yIHF1YW50aXRhdGl2ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGRvbWFpbiBmb3IgYmlubmVkIFEnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgY29uc3QgZmllbGREZWY6IFBvc2l0aW9uRmllbGREZWY8c3RyaW5nPiA9IHtcbiAgICAgICAgICBiaW46IHttYXhiaW5zOiAxNX0sXG4gICAgICAgICAgZmllbGQ6ICdvcmlnaW4nLFxuICAgICAgICAgIHNjYWxlOiB7ZG9tYWluOiAndW5hZ2dyZWdhdGVkJ30sXG4gICAgICAgICAgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB5OiBmaWVsZERlZlxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFt7XG4gICAgICAgICAgICBkYXRhOiAnbWFpbicsXG4gICAgICAgICAgICBmaWVsZDogJ2Jpbl9tYXhiaW5zXzE1X29yaWdpbidcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBkYXRhOiAnbWFpbicsXG4gICAgICAgICAgICBmaWVsZDogJ2Jpbl9tYXhiaW5zXzE1X29yaWdpbl9lbmQnXG4gICAgICAgICAgfV0pO1xuXG4gICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UudW5hZ2dyZWdhdGVEb21haW5IYXNOb0VmZmVjdEZvclJhd0ZpZWxkKGZpZWxkRGVmKSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGl0KCdzaG91bGQgZm9sbG93IHRoZSBjdXN0b20gYmluLmV4dGVudCBmb3IgYmlubmVkIFEnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICAgICAgdHlwZTogJ3F1YW50aXRhdGl2ZScsXG4gICAgICAgICAgICAgIGJpbjoge21heGJpbnM6IDE1LCBleHRlbnQ6WzAsIDEwMF19XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgX2RvbWFpbiA9IHRlc3RQYXJzZURvbWFpbkZvckNoYW5uZWwobW9kZWwsJ3knKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKF9kb21haW4sIFtbMCwgMTAwXV0pO1xuICAgICAgfSkpO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgdW5hZ2dyZWdhdGVkIGRvbWFpbiBpZiByZXF1ZXN0ZWQgZm9yIG5vbi1iaW4sIG5vbi1zdW0gUScsXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogJ21lYW4nLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnYWNjZWxlcmF0aW9uJyxcbiAgICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjogJ3VuYWdncmVnYXRlZCd9LFxuICAgICAgICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFt7XG4gICAgICAgICAgICBkYXRhOiBNQUlOLFxuICAgICAgICAgICAgZmllbGQ6ICdtaW5fYWNjZWxlcmF0aW9uJ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGRhdGE6IE1BSU4sXG4gICAgICAgICAgICBmaWVsZDogJ21heF9hY2NlbGVyYXRpb24nXG4gICAgICAgICAgfV0pO1xuICAgICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGFnZ3JlZ2F0ZWQgZG9tYWluIGZvciBzdW0gUScsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgYWdncmVnYXRlOiAnc3VtJyxcbiAgICAgICAgICAgICAgZmllbGQ6ICdvcmlnaW4nLFxuICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjogJ3VuYWdncmVnYXRlZCd9LFxuICAgICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgbG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLnVuYWdncmVnYXRlRG9tYWluV2l0aE5vblNoYXJlZERvbWFpbk9wKCdzdW0nKVxuICAgICAgICApO1xuICAgICAgfSkpO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgcmlnaHQgY3VzdG9tIGRvbWFpbicsICgpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgIGZpZWxkOiAnaG9yc2Vwb3dlcicsXG4gICAgICAgICAgICAgIHR5cGU6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgIHNjYWxlOiB7ZG9tYWluOiBbMCwyMDBdfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IF9kb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5Jyk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChfZG9tYWluLCBbWzAsIDIwMF1dKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGZvbGxvdyB0aGUgY3VzdG9tIGRvbWFpbiBkZXNwaXRlIGJpbicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgZmllbGQ6ICdvcmlnaW4nLFxuICAgICAgICAgICAgICB0eXBlOiAncXVhbnRpdGF0aXZlJyxcbiAgICAgICAgICAgICAgc2NhbGU6IHtkb21haW46IFswLDIwMF19LFxuICAgICAgICAgICAgICBiaW46IHttYXhiaW5zOiAxNX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfZG9tYWluID0gdGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpO1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoX2RvbWFpbiwgW1swLCAyMDBdXSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBhZ2dyZWdhdGVkIGRvbWFpbiBpZiB3ZSBkbyBub3Qgb3ZlcnJpZGUgaXQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgIGFnZ3JlZ2F0ZTogJ21pbicsXG4gICAgICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICAgICAgdHlwZTogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkYXRhOiAnbWFpbicsXG4gICAgICAgICAgICBmaWVsZDogJ21pbl9vcmlnaW4nXG4gICAgICAgICAgfVxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSB0aGUgYWdncmVnYXRlZCBkYXRhIGZvciBkb21haW4gaWYgc3BlY2lmaWVkIGluIGNvbmZpZycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgYWdncmVnYXRlOiAnbWluJyxcbiAgICAgICAgICAgICAgZmllbGQ6ICdhY2NlbGVyYXRpb24nLFxuICAgICAgICAgICAgICB0eXBlOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIHNjYWxlOiB7XG4gICAgICAgICAgICAgIHVzZVVuYWdncmVnYXRlZERvbWFpbjogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFt7XG4gICAgICAgICAgICBkYXRhOiBNQUlOLFxuICAgICAgICAgICAgZmllbGQ6ICdtaW5fYWNjZWxlcmF0aW9uJ1xuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIGRhdGE6IE1BSU4sXG4gICAgICAgICAgICBmaWVsZDogJ21heF9hY2NlbGVyYXRpb24nXG4gICAgICAgICAgfV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZm9yIHRpbWUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0IGRvbWFpbiBmb3IgbW9udGggVCcsXG4gICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICAgICAgICB0eXBlOiBcInRlbXBvcmFsXCIsXG4gICAgICAgICAgICAgICAgdGltZVVuaXQ6ICdtb250aCdcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IF9kb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5Jyk7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChfZG9tYWluLCBbe2RhdGE6ICdtYWluJywgZmllbGQ6ICdtb250aF9vcmlnaW4nfV0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiB0aGUgY29ycmVjdCBkb21haW4gZm9yIG1vbnRoIE8nLFxuICAgICAgICAgIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICB5OiB7XG4gICAgICAgICAgICAgICAgICBmaWVsZDogJ29yaWdpbicsXG4gICAgICAgICAgICAgICAgICB0eXBlOiBcIm9yZGluYWxcIixcbiAgICAgICAgICAgICAgICAgIHRpbWVVbml0OiAnbW9udGgnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IF9kb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5Jyk7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKF9kb21haW4sIFt7ZGF0YTogJ21haW4nLCBmaWVsZDogJ21vbnRoX29yaWdpbicsIHNvcnQ6IHRydWV9XSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgZG9tYWluIGZvciB5ZWFybW9udGggVCcsXG4gICAgICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGVtcG9yYWxcIixcbiAgICAgICAgICAgICAgICAgIHRpbWVVbml0OiAneWVhcm1vbnRoJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBfZG9tYWluID0gdGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpO1xuXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKF9kb21haW4sIFt7ZGF0YTogJ21haW4nLCBmaWVsZDogJ3llYXJtb250aF9vcmlnaW4nfV0pO1xuICAgICAgICAgIH0pO1xuXG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QgZG9tYWluIGZvciBtb250aCBPIHdoZW4gc3BlY2lmeSBzb3J0JyxcbiAgICAgICAgICBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnREZWY6IEVuY29kaW5nU29ydEZpZWxkPHN0cmluZz4gPSB7b3A6ICdtZWFuJywgZmllbGQ6ICdwcmVjaXBpdGF0aW9uJywgb3JkZXI6ICdkZXNjZW5kaW5nJ30gO1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgICAgIG1hcms6IFwiYmFyXCIsXG4gICAgICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgdGltZVVuaXQ6ICdtb250aCcsXG4gICAgICAgICAgICAgICAgICBmaWVsZDogJ2RhdGUnLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGluYWwnLFxuICAgICAgICAgICAgICAgICAgc29ydDogc29ydERlZlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICAgICAgYWdncmVnYXRlOiAnbWVhbicsXG4gICAgICAgICAgICAgICAgICBmaWVsZDogJ3ByZWNpcGl0YXRpb24nLFxuICAgICAgICAgICAgICAgICAgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgX2RvbWFpbiA9IHRlc3RQYXJzZURvbWFpbkZvckNoYW5uZWwobW9kZWwsJ3gnKTtcblxuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChfZG9tYWluLCBbe1xuICAgICAgICAgICAgICBkYXRhOiAncmF3JyxcbiAgICAgICAgICAgICAgZmllbGQ6ICdtb250aF9kYXRlJyxcbiAgICAgICAgICAgICAgc29ydDogc29ydERlZlxuICAgICAgICAgICAgfV0pO1xuICAgICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGhlIHJpZ2h0IGN1c3RvbSBkb21haW4gd2l0aCBEYXRlVGltZSBvYmplY3RzJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgICAgZmllbGQ6ICd5ZWFyJyxcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZW1wb3JhbFwiLFxuICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjogW3t5ZWFyOiAxOTcwfSwge3llYXI6IDE5ODB9XX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBfZG9tYWluID0gdGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpO1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoX2RvbWFpbiwgW1xuICAgICAgICAgIHtcInNpZ25hbFwiOiBcIntkYXRhOiBkYXRldGltZSgxOTcwLCAwLCAxLCAwLCAwLCAwLCAwKX1cIn0sXG4gICAgICAgICAge1wic2lnbmFsXCI6IFwie2RhdGE6IGRhdGV0aW1lKDE5ODAsIDAsIDEsIDAsIDAsIDAsIDApfVwifVxuICAgICAgICBdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2ZvciBvcmRpbmFsJywgZnVuY3Rpb24oKSB7XG4gICAgICBpdCgnc2hvdWxkIGhhdmUgY29ycmVjdCBkb21haW4gZm9yIGJpbm5lZCBvcmRpbmFsIGNvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAnYScsIGJpbjogdHJ1ZSwgdHlwZTogJ29yZGluYWwnfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHhEb21haW4gPSB0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCAnY29sb3InKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh4RG9tYWluLCBbe2RhdGE6ICdtYWluJywgZmllbGQ6ICdiaW5fbWF4Ymluc182X2FfcmFuZ2UnLCBzb3J0OiB7ZmllbGQ6ICdiaW5fbWF4Ymluc182X2EnLCBvcDogJ21pbid9fV0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZm9yIG5vbWluYWwnLCBmdW5jdGlvbigpIHtcbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZG9tYWluIHdpdGggdGhlIHByb3ZpZGVkIHNvcnQgcHJvcGVydHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc29ydERlZjogRW5jb2RpbmdTb3J0RmllbGQ8c3RyaW5nPiA9IHtvcDogJ21pbicgYXMgJ21pbicsIGZpZWxkOidBY2NlbGVyYXRpb24nfTtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICB5OiB7ZmllbGQ6ICdvcmlnaW4nLCB0eXBlOiBcIm5vbWluYWxcIiwgc29ydDogc29ydERlZn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbCh0ZXN0UGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsLCd5JyksIFt7XG4gICAgICAgICAgICBkYXRhOiBcInJhd1wiLFxuICAgICAgICAgICAgZmllbGQ6ICdvcmlnaW4nLFxuICAgICAgICAgICAgc29ydDogc29ydERlZlxuICAgICAgICAgIH1dKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGRvbWFpbiB3aXRoIHRoZSBwcm92aWRlZCBzb3J0IHByb3BlcnR5IHdpdGggb3JkZXIgcHJvcGVydHknLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3Qgc29ydERlZjogRW5jb2RpbmdTb3J0RmllbGQ8c3RyaW5nPiA9IHtvcDogJ21pbicsIGZpZWxkOidBY2NlbGVyYXRpb24nLCBvcmRlcjogXCJkZXNjZW5kaW5nXCJ9IDtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICB5OiB7ZmllbGQ6ICdvcmlnaW4nLCB0eXBlOiBcIm5vbWluYWxcIiwgc29ydDogc29ydERlZn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHRlc3RQYXJzZURvbWFpbkZvckNoYW5uZWwobW9kZWwsJ3knKSwgW3tcbiAgICAgICAgICAgIGRhdGE6IFwicmF3XCIsXG4gICAgICAgICAgICBmaWVsZDogJ29yaWdpbicsXG4gICAgICAgICAgICBzb3J0OiBzb3J0RGVmXG4gICAgICAgIH1dKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGRvbWFpbiB3aXRob3V0IHNvcnQgaWYgc29ydCBpcyBub3QgcHJvdmlkZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB5OiB7ZmllbGQ6ICdvcmlnaW4nLCB0eXBlOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwodGVzdFBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwneScpLCBbe1xuICAgICAgICAgIGRhdGE6IFwibWFpblwiLFxuICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICBzb3J0OiB0cnVlXG4gICAgICAgIH1dKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbWVyZ2VEb21haW5zKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBtZXJnZSB0aGUgc2FtZSBkb21haW5zJywgKCkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnLFxuICAgICAgICBzb3J0OiB7ZmllbGQ6ICdiJywgb3A6ICdtZWFuJ31cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogJ2InLCBvcDogJ21lYW4nfVxuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnRG9tYWluPihkb21haW4sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogJ2InLCBvcDogJ21lYW4nfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRyb3AgZmllbGQgaWYgb3AgaXMgY291bnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtvcDogJ2NvdW50JywgZmllbGQ6ICdiJ31cbiAgICAgIH1dKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ0RvbWFpbj4oZG9tYWluLCB7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnLFxuICAgICAgICBzb3J0OiB7b3A6ICdjb3VudCd9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc29ydCB0aGUgb3V0cHV0IGRvbWFpbiBpZiBvbmUgZG9tYWluIGlzIHNvcnRlZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IG1lcmdlRG9tYWlucyhbe1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgc29ydDoge2ZpZWxkOiAnYicsIG9wOiAnbWVhbicsIG9yZGVyOiAnZGVzY2VuZGluZyd9XG4gICAgICB9XSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdEb21haW4+KGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgc29ydDoge2ZpZWxkOiAnYicsIG9wOiAnbWVhbicsIG9yZGVyOiAnZGVzY2VuZGluZyd9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc29ydCB0aGUgb3V0cHV0IGRvbWFpbiBpZiBvbmUgZG9tYWluIGlzIHNvcnRlZCB3aXRoIHRydWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYicsXG4gICAgICB9XSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZG9tYWluLCB7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZHM6IFsnYScsICdiJ10sXG4gICAgICAgIHNvcnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3Qgc29ydCBpZiBubyBkb21haW4gaXMgc29ydGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2InLFxuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGRzOiBbJ2EnLCAnYiddXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgaWdub3JlIG9yZGVyIGFzY2VuZGluZyBhcyBpdCBpcyB0aGUgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IG1lcmdlRG9tYWlucyhbe1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgc29ydDoge2ZpZWxkOiAnYicsIG9wOiAnbWVhbicsIG9yZGVyOiAnYXNjZW5kaW5nJ31cbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogJ2InLCBvcDogJ21lYW4nfVxuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnRG9tYWluPihkb21haW4sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtmaWVsZDogJ2InLCBvcDogJ21lYW4nfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1lcmdlIGRvbWFpbnMgd2l0aCB0aGUgc2FtZSBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9XSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdEb21haW4+KGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1lcmdlIGRvbWFpbnMgd2l0aCB0aGUgc2FtZSBkYXRhIHNvdXJjZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IG1lcmdlRG9tYWlucyhbe1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdiJ1xuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnRG9tYWluPihkb21haW4sIHtcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkczogWydhJywgJ2InXVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIG1lcmdlIGRvbWFpbnMgd2l0aCBkaWZmZXJlbnQgZGF0YSBzb3VyY2UnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZGF0YTogJ2JhcicsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHRydWVcbiAgICAgIH1dKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChkb21haW4sIHtcbiAgICAgICAgZmllbGRzOiBbe1xuICAgICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICAgIGZpZWxkOiAnYSdcbiAgICAgICAgfSwge1xuICAgICAgICAgIGRhdGE6ICdiYXInLFxuICAgICAgICAgIGZpZWxkOiAnYSdcbiAgICAgICAgfV0sXG4gICAgICAgIHNvcnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZXJnZSBkb21haW5zIHdpdGggZGlmZmVyZW50IGRhdGEgYW5kIHNvcnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICBvcDogJ2NvdW50J1xuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6ICdiYXInLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9XSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdEb21haW4+KGRvbWFpbiwge1xuICAgICAgICBmaWVsZHM6IFt7XG4gICAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgZGF0YTogJ2JhcicsXG4gICAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgICB9XSxcbiAgICAgICAgc29ydDoge1xuICAgICAgICAgIG9wOiAnY291bnQnXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBtZXJnZSBkb21haW5zIHdpdGggdGhlIHNhbWUgYW5kIGRpZmZlcmVudCBkYXRhJywgKCkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2InXG4gICAgICB9LCB7XG4gICAgICAgIGRhdGE6ICdiYXInLFxuICAgICAgICBmaWVsZDogJ2EnXG4gICAgICB9XSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZG9tYWluLCB7XG4gICAgICAgIGZpZWxkczogW3tcbiAgICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgICBmaWVsZDogJ2EnXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgICBmaWVsZDogJ2InXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBkYXRhOiAnYmFyJyxcbiAgICAgICAgICBmaWVsZDogJ2EnXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbWVyZ2Ugc2lnbmFsIGRvbWFpbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgc2lnbmFsOiAnZm9vJ1xuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnYmFyJyxcbiAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRvbWFpbiwge1xuICAgICAgICBmaWVsZHM6IFt7XG4gICAgICAgICAgICBzaWduYWw6ICdmb28nXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgZGF0YTogJ2JhcicsXG4gICAgICAgICAgICBmaWVsZDogJ2EnXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgd2FybiBpZiBzb3J0cyBjb25mbGljdCcsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnLFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgb3A6ICdjb3VudCdcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdiJyxcbiAgICAgICAgc29ydDogdHJ1ZVxuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGRzOiBbJ2EnLCAnYiddLFxuICAgICAgICBzb3J0OiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5NT1JFX1RIQU5fT05FX1NPUlQpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgd2FybiBpZiBzb3J0cyBjb25mbGljdCBldmVuIGlmIHdlIGRvIG5vdCB1bmlvbicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gbWVyZ2VEb21haW5zKFt7XG4gICAgICAgIGRhdGE6ICdmb28nLFxuICAgICAgICBmaWVsZDogJ2EnLFxuICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgb3A6ICdjb3VudCdcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgc29ydDogdHJ1ZVxuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgc29ydDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuTU9SRV9USEFOX09ORV9TT1JUKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIHdhcm4gaWYgd2UgaGFkIHRvIGRyb3AgY29tcGxleCBzb3J0JywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW3tcbiAgICAgICAgZGF0YTogJ2ZvbycsXG4gICAgICAgIGZpZWxkOiAnYScsXG4gICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICBvcDogJ21lYW4nLFxuICAgICAgICAgIGZpZWxkOiAnYydcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGQ6ICdiJ1xuICAgICAgfV0pO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGRvbWFpbiwge1xuICAgICAgICBkYXRhOiAnZm9vJyxcbiAgICAgICAgZmllbGRzOiBbJ2EnLCAnYiddLFxuICAgICAgICBzb3J0OiB0cnVlXG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5kb21haW5Tb3J0RHJvcHBlZCh7XG4gICAgICAgIG9wOiAnbWVhbicsXG4gICAgICAgIGZpZWxkOiAnYydcbiAgICAgIH0pKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIG5vdCBzb3J0IGV4cGxpY2l0IGRvbWFpbnMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSBtZXJnZURvbWFpbnMoW1sxLDIsMyw0XSwgWzMsNCw1LDZdXSk7XG5cbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoZG9tYWluLCB7XG4gICAgICAgIGZpZWxkczogW1sxLDIsMyw0XSwgWzMsNCw1LDZdXVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdkb21haW5Tb3J0KCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGZvciBjb250aW51b3VzIGRvbWFpbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkb21haW5Tb3J0KG1vZGVsLCAneCcsIFNjYWxlVHlwZS5MSU5FQVIpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzb3J0LCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBieSBkZWZhdWx0IGZvciBkaXNjcmV0ZSBkb21haW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfSxcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgY29uc3Qgc29ydCA9IGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzb3J0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIGFzY2VuZGluZycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJywgc29ydDogJ2FzY2VuZGluZyd9LFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICBjb25zdCBzb3J0ID0gZG9tYWluU29ydChtb2RlbCwgJ3gnLCBTY2FsZVR5cGUuT1JESU5BTCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNvcnQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIGlmIHNvcnQgPSBudWxsJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogJ2JhcicsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJywgc29ydDogbnVsbH0sXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IHNvcnQgPSBkb21haW5Tb3J0KG1vZGVsLCAneCcsIFNjYWxlVHlwZS5PUkRJTkFMKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc29ydCwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIG5vcm1hbCBzb3J0IHNwZWMgaWYgc3BlY2lmaWVkIGFuZCBhZ2dyZWdyYXRpb24gaXMgbm90IGNvdW50JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCcsIHNvcnQ6IHtvcDogJ3N1bScsIGZpZWxkOid5J319LFxuICAgICAgICAgIHk6IHtmaWVsZDogJ2InLCBhZ2dyZWdhdGU6ICdzdW0nLCB0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzb3J0ID0gZG9tYWluU29ydChtb2RlbCwgJ3gnLCBTY2FsZVR5cGUuT1JESU5BTCk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFZnU29ydEZpZWxkPihzb3J0LCB7b3A6ICdzdW0nLCBmaWVsZDogJ3knfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBub3JtYWwgc29ydCBzcGVjIGlmIGFnZ3JlZ3JhdGlvbiBpcyBjb3VudCBhbmQgZmllbGQgbm90IHNwZWNpZmllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnLCBzb3J0OiB7b3A6ICdjb3VudCd9fSxcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdiJywgYWdncmVnYXRlOiAnc3VtJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc29ydCA9IGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ1NvcnRGaWVsZD4oc29ydCwge29wOiAnY291bnQnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGlmIHNvcnQgaXMgbm90IHNwZWNpZmllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnfSxcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdiJywgYWdncmVnYXRlOiAnc3VtJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc29ydCA9IGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzb3J0LCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBpZiBzb3J0IGlzIHNwZWNpZmllZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnLCBzb3J0OiBcImRlc2NlbmRpbmdcIn0sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIGFnZ3JlZ2F0ZTogJ3N1bScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdTb3J0RmllbGQ+KGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpLCB7b3A6ICdtaW4nLCBmaWVsZDogJ2EnLCBvcmRlcjogJ2Rlc2NlbmRpbmcnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzb3J0IHNwZWMgdXNpbmcgZGVyaXZlZCBzb3J0IGluZGV4JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCcsIHNvcnQ6IFsnQicsICdBJywgJ0MnXX0sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdTb3J0RmllbGQ+KGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpLCB7b3A6ICdtaW4nLCBmaWVsZDogJ3hfYV9zb3J0X2luZGV4Jywgb3JkZXI6ICdhc2NlbmRpbmcnfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBzb3J0IHdpdGggZmxhdHRlbmVkIGZpZWxkIGFjY2VzcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnLCBzb3J0OiB7ZmllbGQ6ICdmb28uYmFyJywgb3A6ICdtZWFuJ319LFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VmdTb3J0RmllbGQ+KGRvbWFpblNvcnQobW9kZWwsICd4JywgU2NhbGVUeXBlLk9SRElOQUwpLCB7b3A6ICdtZWFuJywgZmllbGQ6ICdmb29cXFxcLmJhcid9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/scale/parse.test.d.ts b/build/test/compile/scale/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/parse.test.js b/build/test/compile/scale/parse.test.js new file mode 100644 index 0000000000..0eece49daa --- /dev/null +++ b/build/test/compile/scale/parse.test.js @@ -0,0 +1,470 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var vega_util_1 = require("vega-util"); +var parse_1 = require("../../../src/compile/scale/parse"); +var selection_1 = require("../../../src/compile/selection/selection"); +var log = tslib_1.__importStar(require("../../../src/log")); +var scale_1 = require("../../../src/scale"); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +describe('src/compile', function () { + it('NON_TYPE_RANGE_SCALE_PROPERTIES should be SCALE_PROPERTIES wihtout type, domain, and range properties', function () { + chai_1.assert.deepEqual(vega_util_1.toSet(scale_1.NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES), vega_util_1.toSet(util_1.without(scale_1.SCALE_PROPERTIES, ['type', 'domain', 'range', 'rangeStep', 'scheme']))); + }); + describe('parseScaleCore', function () { + it('respects explicit scale type', function () { + var model = util_2.parseModel({ + "data": { "url": "data/seattle-weather.csv" }, + "layer": [ + { + "mark": "bar", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative" + } + } + }, + { + "mark": "rule", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative", + "scale": { "type": "log" } + } + } + } + ] + }); + parse_1.parseScaleCore(model); + chai_1.assert.equal(model.getScaleComponent('y').explicit.type, 'log'); + }); + it('respects explicit scale type', function () { + var model = util_2.parseModel({ + "data": { "url": "data/seattle-weather.csv" }, + "layer": [ + { + "mark": "bar", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative", + "scale": { "type": "log" } + } + } + }, + { + "mark": "rule", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative" + } + } + } + ] + }); + parse_1.parseScaleCore(model); + chai_1.assert.equal(model.getScaleComponent('y').explicit.type, 'log'); + }); + // TODO: this actually shouldn't get merged + it('favors the first explicit scale type', log.wrap(function (localLogger) { + var model = util_2.parseModel({ + "data": { "url": "data/seattle-weather.csv" }, + "layer": [ + { + "mark": "bar", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative", + "scale": { "type": "log" } + } + } + }, + { + "mark": "rule", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative", + "scale": { "type": "pow" } + } + } + } + ] + }); + parse_1.parseScaleCore(model); + chai_1.assert.equal(model.getScaleComponent('y').explicit.type, 'log'); + chai_1.assert.equal(localLogger.warns[0], log.message.mergeConflictingProperty('type', 'scale', 'log', 'pow')); + })); + it('favors the band over point', function () { + var model = util_2.parseModel({ + "data": { "url": "data/seattle-weather.csv" }, + "layer": [ + { + "mark": "point", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative" + }, + "x": { "field": "weather", "type": "nominal" } + } + }, { + "mark": "bar", + "encoding": { + "y": { + "aggregate": "mean", + "field": "precipitation", + "type": "quantitative" + }, + "x": { "field": "weather", "type": "nominal" } + } + }, + ] + }); + parse_1.parseScaleCore(model); + chai_1.assert.equal(model.getScaleComponent('x').implicit.type, 'band'); + }); + it('correctly ignores x/y when lon/lat', function () { + var model = util_2.parseModel({ + "data": { + "url": "data/zipcodes.csv", + "format": { + "type": "csv" + } + }, + "mark": "point", + "encoding": { + "longitude": { + "field": "longitude", + "type": "quantitative" + }, + "latitude": { + "field": "latitude", + "type": "quantitative" + } + } + }); + parse_1.parseScaleCore(model); + chai_1.assert.isUndefined(model.getScaleComponent('x')); + chai_1.assert.isUndefined(model.getScaleComponent('y')); + }); + it('correctly ignores shape when geojson', function () { + var model = util_2.parseModel({ + "mark": "geoshape", + "data": { "url": "data/income.json" }, + "transform": [ + { + "lookup": "id", + "from": { + "data": { + "url": "data/us-10m.json", + "format": { "type": "topojson", "feature": "states" } + }, + "key": "id" + }, + "as": "geo" + } + ], + "encoding": { + "shape": { "field": "geo", "type": "geojson" }, + } + }); + parse_1.parseScaleCore(model); + chai_1.assert.isUndefined(model.getScaleComponent('shape')); + }); + }); + describe('parseScale', function () { + it('does not throw warning when two equivalent objects are specified', log.wrap(function (logger) { + var model = util_2.parseModel({ + "data": { "url": "data/seattle-weather.csv" }, + "layer": [ + { + "mark": "circle", + "encoding": { + "y": { + "field": "a", + "type": "nominal", + "scale": { "rangeStep": 17 } + } + } + }, + { + "mark": "point", + "encoding": { + "y": { + "field": "a", + "type": "nominal", + "scale": { "rangeStep": 17 } + } + } + } + ] + }); + parse_1.parseScale(model); + chai_1.assert.deepEqual(model.getScaleComponent('y').explicit.range, { step: 17 }); + chai_1.assert.equal(logger.warns.length, 0); + })); + describe('x ordinal point', function () { + it('should create an x point scale with rangeStep and no range', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + x: { field: 'origin', type: "nominal" } + } + }); + var scale = model.getScaleComponent('x'); + chai_1.assert.equal(scale.implicit.type, 'point'); + chai_1.assert.deepEqual(scale.implicit.range, { step: 21 }); + }); + }); + it('should output only padding without default paddingInner and paddingOuter if padding is specified for a band scale', function () { + var model = util_2.parseUnitModelWithScale({ + mark: 'bar', + encoding: { + x: { field: 'origin', type: "nominal", scale: { type: 'band', padding: 0.6 } } + } + }); + var scale = model.getScaleComponent('x'); + chai_1.assert.equal(scale.explicit.padding, 0.6); + chai_1.assert.isUndefined(scale.get('paddingInner')); + chai_1.assert.isUndefined(scale.get('paddingOuter')); + }); + it('should output default paddingInner and paddingOuter = paddingInner/2 if none of padding properties is specified for a band scale', function () { + var model = util_2.parseUnitModelWithScale({ + mark: 'bar', + encoding: { + x: { field: 'origin', type: "nominal", scale: { type: 'band' } } + }, + config: { + scale: { bandPaddingInner: 0.3 } + } + }); + var scale = model.getScaleComponent('x'); + chai_1.assert.equal(scale.implicit.paddingInner, 0.3); + chai_1.assert.equal(scale.implicit.paddingOuter, 0.15); + chai_1.assert.isUndefined(scale.get('padding')); + }); + describe('nominal with color', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: 'origin', type: "nominal" } + } + }); + var scale = model.getScaleComponent('color'); + it('should create correct color scale', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'ordinal'); + chai_1.assert.deepEqual(scale.domains, [{ + data: 'main', + field: 'origin', + sort: true + }]); + chai_1.assert.equal(scale.implicit.range, 'category'); + }); + }); + describe('ordinal with color', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: 'origin', type: "ordinal" } + } + }); + var scale = model.getScaleComponent('color'); + it('should create sequential color scale', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'ordinal'); + chai_1.assert.deepEqual(scale.domains, [{ + data: 'main', + field: 'origin', + sort: true + }]); + }); + }); + describe('quantitative with color', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: "origin", type: "quantitative" } + } + }); + var scale = model.getScaleComponent('color'); + it('should create linear color scale', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'sequential'); + chai_1.assert.equal(scale.implicit.range, 'ramp'); + chai_1.assert.deepEqual(scale.domains, [{ + data: 'main', + field: 'origin' + }]); + }); + }); + describe('color with bin', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: "origin", type: "quantitative", bin: true } + } + }); + var scale = model.getScaleComponent('color'); + it('should add correct scales', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'bin-ordinal'); + }); + }); + describe('ordinal color with bin', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: "origin", type: "ordinal", bin: true } + } + }); + var scale = model.getScaleComponent('color'); + it('should add correct scales', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'ordinal'); + }); + }); + describe('opacity with bin', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + opacity: { field: "origin", type: "quantitative", bin: true } + } + }); + var scale = model.getScaleComponent('opacity'); + it('should add correct scales', function () { + chai_1.assert.equal(scale.implicit.name, 'opacity'); + chai_1.assert.equal(scale.implicit.type, 'bin-linear'); + }); + }); + describe('size with bin', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + size: { field: "origin", type: "quantitative", bin: true } + } + }); + var scale = model.getScaleComponent('size'); + it('should add correct scales', function () { + chai_1.assert.equal(scale.implicit.name, 'size'); + chai_1.assert.equal(scale.implicit.type, 'bin-linear'); + }); + }); + describe('color with time unit', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "point", + encoding: { + color: { field: 'origin', type: "temporal", timeUnit: "year" } + } + }); + var scale = model.getScaleComponent('color'); + it('should add correct scales', function () { + chai_1.assert.equal(scale.implicit.name, 'color'); + chai_1.assert.equal(scale.implicit.type, 'sequential'); + }); + }); + describe('selection domain', function () { + var model = util_2.parseUnitModelWithScale({ + mark: "area", + encoding: { + x: { + field: "date", type: "temporal", + scale: { domain: { selection: "brush", encoding: "x" } }, + }, + y: { + field: "date", type: "temporal", + scale: { domain: { selection: "foobar", field: "Miles_per_Gallon" } }, + } + } + }); + var xScale = model.getScaleComponent('x'); + var yscale = model.getScaleComponent('y'); + it('should add a raw selection domain', function () { + chai_1.assert.property(xScale.explicit, 'domainRaw'); + chai_1.assert.propertyVal(xScale.explicit.domainRaw, 'signal', selection_1.SELECTION_DOMAIN + '{"encoding":"x","selection":"brush"}'); + chai_1.assert.property(yscale.explicit, 'domainRaw'); + chai_1.assert.propertyVal(yscale.explicit.domainRaw, 'signal', selection_1.SELECTION_DOMAIN + '{"field":"Miles_per_Gallon","selection":"foobar"}'); + }); + }); + }); + describe('parseScaleDomain', function () { + describe('faceted domains', function () { + it('should use cloned subtree', function () { + var model = util_2.parseModelWithScale({ + facet: { + row: { field: "symbol", type: "nominal" } + }, + data: { url: "foo.csv" }, + spec: { + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + } + } + }); + chai_1.assert.deepEqual(model.component.scales.x.domains, [{ + data: 'scale_child_main', + field: 'a' + }]); + }); + it('should not use cloned subtree if the data is not faceted', function () { + var model = util_2.parseModelWithScale({ + facet: { + row: { field: "symbol", type: "nominal" } + }, + data: { url: "foo.csv" }, + spec: { + data: { url: 'foo' }, + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + } + } + }); + chai_1.assert.deepEqual(model.component.scales.x.domains, [{ + data: 'child_main', + field: 'a' + }]); + }); + it('should not use cloned subtree if the scale is independent', function () { + var model = util_2.parseModelWithScale({ + facet: { + row: { field: "symbol", type: "nominal" } + }, + data: { url: "foo.csv" }, + spec: { + mark: 'point', + encoding: { + x: { field: 'a', type: 'quantitative' }, + } + }, + resolve: { + scale: { + x: 'independent' + } + } + }); + chai_1.assert.deepEqual(model.children[0].component.scales.x.domains, [{ + data: 'child_main', + field: 'a' + }]); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zY2FsZS9wYXJzZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsdUNBQWdDO0FBQ2hDLDBEQUE0RTtBQUM1RSxzRUFBMEU7QUFDMUUsNERBQXdDO0FBQ3hDLDRDQUFpRztBQUNqRywwQ0FBMEM7QUFDMUMsbUNBQW9GO0FBRXBGLFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsRUFBRSxDQUFDLHVHQUF1RyxFQUFFO1FBQzFHLGFBQU0sQ0FBQyxTQUFTLENBQ2QsaUJBQUssQ0FBQyxtREFBMkMsQ0FBQyxFQUNsRCxpQkFBSyxDQUFDLGNBQU8sQ0FBQyx3QkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQ3JGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRTtRQUN6QixFQUFFLENBQUMsOEJBQThCLEVBQUU7WUFDakMsSUFBTSxLQUFLLEdBQUcsaUJBQVUsQ0FBQztnQkFDdkIsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLDBCQUEwQixFQUFDO2dCQUMzQyxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsTUFBTSxFQUFFLEtBQUs7d0JBQ2IsVUFBVSxFQUFFOzRCQUNWLEdBQUcsRUFBRTtnQ0FDSCxXQUFXLEVBQUUsTUFBTTtnQ0FDbkIsT0FBTyxFQUFFLGVBQWU7Z0NBQ3hCLE1BQU0sRUFBRSxjQUFjOzZCQUN2Qjt5QkFDRjtxQkFDRjtvQkFDRDt3QkFDRSxNQUFNLEVBQUUsTUFBTTt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsR0FBRyxFQUFFO2dDQUNILFdBQVcsRUFBRSxNQUFNO2dDQUNuQixPQUFPLEVBQUUsZUFBZTtnQ0FDeEIsTUFBTSxFQUFF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TUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDOUQsSUFBSSxFQUFFLFlBQVk7d0JBQ2xCLEtBQUssRUFBRSxHQUFHO3FCQUNYLENBQUMsQ0FBQyxDQUFDO1lBQ04sQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHt0b1NldH0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7cGFyc2VTY2FsZSwgcGFyc2VTY2FsZUNvcmV9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL3BhcnNlJztcbmltcG9ydCB7U0VMRUNUSU9OX0RPTUFJTn0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge05PTl9UWVBFX0RPTUFJTl9SQU5HRV9WRUdBX1NDQUxFX1BST1BFUlRJRVMsIFNDQUxFX1BST1BFUlRJRVN9IGZyb20gJy4uLy4uLy4uL3NyYy9zY2FsZSc7XG5pbXBvcnQge3dpdGhvdXR9IGZyb20gJy4uLy4uLy4uL3NyYy91dGlsJztcbmltcG9ydCB7cGFyc2VNb2RlbCwgcGFyc2VNb2RlbFdpdGhTY2FsZSwgcGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnc3JjL2NvbXBpbGUnLCBmdW5jdGlvbigpIHtcbiAgaXQoJ05PTl9UWVBFX1JBTkdFX1NDQUxFX1BST1BFUlRJRVMgc2hvdWxkIGJlIFNDQUxFX1BST1BFUlRJRVMgd2lodG91dCB0eXBlLCBkb21haW4sIGFuZCByYW5nZSBwcm9wZXJ0aWVzJywgKCkgPT4ge1xuICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICB0b1NldChOT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUSUVTKSxcbiAgICAgIHRvU2V0KHdpdGhvdXQoU0NBTEVfUFJPUEVSVElFUywgWyd0eXBlJywgJ2RvbWFpbicsICdyYW5nZScsICdyYW5nZVN0ZXAnLCAnc2NoZW1lJ10pKVxuICAgICk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZVNjYWxlQ29yZScsICgpID0+IHtcbiAgICBpdCgncmVzcGVjdHMgZXhwbGljaXQgc2NhbGUgdHlwZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbCh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3NlYXR0bGUtd2VhdGhlci5jc3ZcIn0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInByZWNpcGl0YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicHJlY2lwaXRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwic2NhbGVcIjoge1widHlwZVwiOiBcImxvZ1wifVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICAgIHBhcnNlU2NhbGVDb3JlKG1vZGVsKTtcbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgneScpLmV4cGxpY2l0LnR5cGUsICdsb2cnKTtcbiAgICB9KTtcblxuICAgIGl0KCdyZXNwZWN0cyBleHBsaWNpdCBzY2FsZSB0eXBlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc2VhdHRsZS13ZWF0aGVyLmNzdlwifSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicHJlY2lwaXRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwic2NhbGVcIjoge1widHlwZVwiOiBcImxvZ1wifVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicHJlY2lwaXRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcGFyc2VTY2FsZUNvcmUobW9kZWwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd5JykuZXhwbGljaXQudHlwZSwgJ2xvZycpO1xuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogdGhpcyBhY3R1YWxseSBzaG91bGRuJ3QgZ2V0IG1lcmdlZFxuICAgIGl0KCdmYXZvcnMgdGhlIGZpcnN0IGV4cGxpY2l0IHNjYWxlIHR5cGUnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbCh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3NlYXR0bGUtd2VhdGhlci5jc3ZcIn0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImJhclwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInByZWNpcGl0YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcInNjYWxlXCI6IHtcInR5cGVcIjogXCJsb2dcIn1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInByZWNpcGl0YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcInNjYWxlXCI6IHtcInR5cGVcIjogXCJwb3dcIn1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBwYXJzZVNjYWxlQ29yZShtb2RlbCk7XG4gICAgICBhc3NlcnQuZXF1YWwobW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3knKS5leHBsaWNpdC50eXBlLCAnbG9nJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLm1lcmdlQ29uZmxpY3RpbmdQcm9wZXJ0eSgndHlwZScsICdzY2FsZScsICdsb2cnLCAncG93JykpO1xuICAgIH0pKTtcblxuICAgIGl0KCdmYXZvcnMgdGhlIGJhbmQgb3ZlciBwb2ludCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbCh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3NlYXR0bGUtd2VhdGhlci5jc3ZcIn0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicHJlY2lwaXRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIndlYXRoZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0se1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwiYmFyXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicHJlY2lwaXRhdGlvblwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIndlYXRoZXJcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgcGFyc2VTY2FsZUNvcmUobW9kZWwpO1xuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4JykuaW1wbGljaXQudHlwZSwgJ2JhbmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgaWdub3JlcyB4L3kgd2hlbiBsb24vbGF0JywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICBcInVybFwiOiBcImRhdGEvemlwY29kZXMuY3N2XCIsXG4gICAgICAgICAgXCJmb3JtYXRcIjoge1xuICAgICAgICAgICAgXCJ0eXBlXCI6IFwiY3N2XCJcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwibG9uZ2l0dWRlXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb25naXR1ZGVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImxhdGl0dWRlXCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJsYXRpdHVkZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcGFyc2VTY2FsZUNvcmUobW9kZWwpO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4JykpO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd5JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBpZ25vcmVzIHNoYXBlIHdoZW4gZ2VvanNvbicsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbCh7XG4gICAgICAgIFwibWFya1wiOiBcImdlb3NoYXBlXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2luY29tZS5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsb29rdXBcIjogXCJpZFwiLFxuICAgICAgICAgICAgXCJmcm9tXCI6IHtcbiAgICAgICAgICAgICAgXCJkYXRhXCI6IHtcbiAgICAgICAgICAgICAgICBcInVybFwiOiBcImRhdGEvdXMtMTBtLmpzb25cIixcbiAgICAgICAgICAgICAgICBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwidG9wb2pzb25cIixcImZlYXR1cmVcIjogXCJzdGF0ZXNcIn1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJrZXlcIjogXCJpZFwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJhc1wiOiBcImdlb1wiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInNoYXBlXCI6IHtcImZpZWxkXCI6IFwiZ2VvXCIsXCJ0eXBlXCI6IFwiZ2VvanNvblwifSxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBwYXJzZVNjYWxlQ29yZShtb2RlbCk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQobW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3NoYXBlJykpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFyc2VTY2FsZScsICgpID0+IHtcbiAgICBpdCgnZG9lcyBub3QgdGhyb3cgd2FybmluZyB3aGVuIHR3byBlcXVpdmFsZW50IG9iamVjdHMgYXJlIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbCh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3NlYXR0bGUtd2VhdGhlci5jc3ZcIn0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImFcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJub21pbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJzY2FsZVwiOiB7XCJyYW5nZVN0ZXBcIjogMTd9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwiYVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIm5vbWluYWxcIixcbiAgICAgICAgICAgICAgICBcInNjYWxlXCI6IHtcInJhbmdlU3RlcFwiOiAxN31cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBwYXJzZVNjYWxlKG1vZGVsKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3knKS5leHBsaWNpdC5yYW5nZSwge3N0ZXA6IDE3fSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9nZ2VyLndhcm5zLmxlbmd0aCwgMCk7XG4gICAgfSkpO1xuXG4gICAgZGVzY3JpYmUoJ3ggb3JkaW5hbCBwb2ludCcsICgpID0+IHtcbiAgICAgIGl0KCdzaG91bGQgY3JlYXRlIGFuIHggcG9pbnQgc2NhbGUgd2l0aCByYW5nZVN0ZXAgYW5kIG5vIHJhbmdlJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogJ29yaWdpbicsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3gnKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnR5cGUsICdwb2ludCcpO1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHNjYWxlLmltcGxpY2l0LnJhbmdlLCB7c3RlcDogMjF9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBvdXRwdXQgb25seSBwYWRkaW5nIHdpdGhvdXQgZGVmYXVsdCBwYWRkaW5nSW5uZXIgYW5kIHBhZGRpbmdPdXRlciBpZiBwYWRkaW5nIGlzIHNwZWNpZmllZCBmb3IgYSBiYW5kIHNjYWxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ29yaWdpbicsIHR5cGU6IFwibm9taW5hbFwiLCBzY2FsZToge3R5cGU6ICdiYW5kJywgcGFkZGluZzogMC42fX1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuZXhwbGljaXQucGFkZGluZywgMC42KTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChzY2FsZS5nZXQoJ3BhZGRpbmdJbm5lcicpKTtcbiAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChzY2FsZS5nZXQoJ3BhZGRpbmdPdXRlcicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgb3V0cHV0IGRlZmF1bHQgcGFkZGluZ0lubmVyIGFuZCBwYWRkaW5nT3V0ZXIgPSBwYWRkaW5nSW5uZXIvMiBpZiBub25lIG9mIHBhZGRpbmcgcHJvcGVydGllcyBpcyBzcGVjaWZpZWQgZm9yIGEgYmFuZCBzY2FsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdvcmlnaW4nLCB0eXBlOiBcIm5vbWluYWxcIiwgc2NhbGU6IHt0eXBlOiAnYmFuZCd9fVxuICAgICAgICB9LFxuICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICBzY2FsZToge2JhbmRQYWRkaW5nSW5uZXI6IDAuM31cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQucGFkZGluZ0lubmVyLCAwLjMpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnBhZGRpbmdPdXRlciwgMC4xNSk7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQoc2NhbGUuZ2V0KCdwYWRkaW5nJykpO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ25vbWluYWwgd2l0aCBjb2xvcicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBjb2xvcjoge2ZpZWxkOiAnb3JpZ2luJywgdHlwZTogXCJub21pbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCdjb2xvcicpO1xuXG4gICAgICBpdCgnc2hvdWxkIGNyZWF0ZSBjb3JyZWN0IGNvbG9yIHNjYWxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChzY2FsZS5pbXBsaWNpdC5uYW1lLCAnY29sb3InKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnR5cGUsICdvcmRpbmFsJyk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2NhbGUuZG9tYWlucywgW3tcbiAgICAgICAgICBkYXRhOiAnbWFpbicsXG4gICAgICAgICAgZmllbGQ6ICdvcmlnaW4nLFxuICAgICAgICAgIHNvcnQ6IHRydWVcbiAgICAgICAgfV0pO1xuICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQucmFuZ2UsICdjYXRlZ29yeScpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb3JkaW5hbCB3aXRoIGNvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6ICdvcmlnaW4nLCB0eXBlOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ2NvbG9yJyk7XG5cbiAgICAgIGl0KCdzaG91bGQgY3JlYXRlIHNlcXVlbnRpYWwgY29sb3Igc2NhbGUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0Lm5hbWUsICdjb2xvcicpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQudHlwZSwgJ29yZGluYWwnKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHNjYWxlLmRvbWFpbnMsIFt7XG4gICAgICAgICAgZGF0YTogJ21haW4nLFxuICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJyxcbiAgICAgICAgICBzb3J0OiB0cnVlXG4gICAgICAgIH1dKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3F1YW50aXRhdGl2ZSB3aXRoIGNvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6IFwib3JpZ2luXCIsIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgnY29sb3InKTtcblxuICAgICAgaXQoJ3Nob3VsZCBjcmVhdGUgbGluZWFyIGNvbG9yIHNjYWxlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChzY2FsZS5pbXBsaWNpdC5uYW1lLCAnY29sb3InKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnR5cGUsICdzZXF1ZW50aWFsJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChzY2FsZS5pbXBsaWNpdC5yYW5nZSwgJ3JhbXAnKTtcblxuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKHNjYWxlLmRvbWFpbnMsIFt7XG4gICAgICAgICAgZGF0YTogJ21haW4nLFxuICAgICAgICAgIGZpZWxkOiAnb3JpZ2luJ1xuICAgICAgICB9XSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdjb2xvciB3aXRoIGJpbicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgICAgbWFyazogXCJwb2ludFwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBjb2xvcjoge2ZpZWxkOiBcIm9yaWdpblwiLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLCBiaW46IHRydWV9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgnY29sb3InKTtcblxuICAgICAgaXQoJ3Nob3VsZCBhZGQgY29ycmVjdCBzY2FsZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0Lm5hbWUsICdjb2xvcicpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQudHlwZSwgJ2Jpbi1vcmRpbmFsJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvcmRpbmFsIGNvbG9yIHdpdGggYmluJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6IFwib3JpZ2luXCIsIHR5cGU6IFwib3JkaW5hbFwiLCBiaW46IHRydWV9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgnY29sb3InKTtcblxuICAgICAgaXQoJ3Nob3VsZCBhZGQgY29ycmVjdCBzY2FsZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0Lm5hbWUsICdjb2xvcicpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQudHlwZSwgJ29yZGluYWwnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29wYWNpdHkgd2l0aCBiaW4nLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgb3BhY2l0eToge2ZpZWxkOiBcIm9yaWdpblwiLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLCBiaW46IHRydWV9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgnb3BhY2l0eScpO1xuXG4gICAgICBpdCgnc2hvdWxkIGFkZCBjb3JyZWN0IHNjYWxlcycsIGZ1bmN0aW9uKCkge1xuICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGUuaW1wbGljaXQubmFtZSwgJ29wYWNpdHknKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnR5cGUsICdiaW4tbGluZWFyJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzaXplIHdpdGggYmluJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHNpemU6IHtmaWVsZDogXCJvcmlnaW5cIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIiwgYmluOiB0cnVlfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3NpemUnKTtcblxuICAgICAgaXQoJ3Nob3VsZCBhZGQgY29ycmVjdCBzY2FsZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0Lm5hbWUsICdzaXplJyk7XG4gICAgICAgIGFzc2VydC5lcXVhbChzY2FsZS5pbXBsaWNpdC50eXBlLCAnYmluLWxpbmVhcicpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnY29sb3Igd2l0aCB0aW1lIHVuaXQnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgICAgICAgIG1hcms6IFwicG9pbnRcIixcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgY29sb3I6IHtmaWVsZDogJ29yaWdpbicsIHR5cGU6IFwidGVtcG9yYWxcIiwgdGltZVVuaXQ6IFwieWVhclwifVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ2NvbG9yJyk7XG5cbiAgICAgIGl0KCdzaG91bGQgYWRkIGNvcnJlY3Qgc2NhbGVzJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChzY2FsZS5pbXBsaWNpdC5uYW1lLCAnY29sb3InKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHNjYWxlLmltcGxpY2l0LnR5cGUsICdzZXF1ZW50aWFsJyk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdzZWxlY3Rpb24gZG9tYWluJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgbWFyazogXCJhcmVhXCIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge1xuICAgICAgICAgICAgZmllbGQ6IFwiZGF0ZVwiLCB0eXBlOiBcInRlbXBvcmFsXCIsXG4gICAgICAgICAgICBzY2FsZToge2RvbWFpbjoge3NlbGVjdGlvbjogXCJicnVzaFwiLCBlbmNvZGluZzogXCJ4XCJ9fSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHk6IHtcbiAgICAgICAgICAgIGZpZWxkOiBcImRhdGVcIiwgdHlwZTogXCJ0ZW1wb3JhbFwiLFxuICAgICAgICAgICAgc2NhbGU6IHtkb21haW46IHtzZWxlY3Rpb246IFwiZm9vYmFyXCIsIGZpZWxkOiBcIk1pbGVzX3Blcl9HYWxsb25cIn19LFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHhTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4Jyk7XG4gICAgICBjb25zdCB5c2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudCgneScpO1xuXG4gICAgICBpdCgnc2hvdWxkIGFkZCBhIHJhdyBzZWxlY3Rpb24gZG9tYWluJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGFzc2VydC5wcm9wZXJ0eSh4U2NhbGUuZXhwbGljaXQsICdkb21haW5SYXcnKTtcbiAgICAgICAgYXNzZXJ0LnByb3BlcnR5VmFsKHhTY2FsZS5leHBsaWNpdC5kb21haW5SYXcsICdzaWduYWwnLFxuICAgICAgICAgIFNFTEVDVElPTl9ET01BSU4gKyAne1wiZW5jb2RpbmdcIjpcInhcIixcInNlbGVjdGlvblwiOlwiYnJ1c2hcIn0nKTtcblxuICAgICAgICBhc3NlcnQucHJvcGVydHkoeXNjYWxlLmV4cGxpY2l0LCAnZG9tYWluUmF3Jyk7XG4gICAgICAgIGFzc2VydC5wcm9wZXJ0eVZhbCh5c2NhbGUuZXhwbGljaXQuZG9tYWluUmF3LCAnc2lnbmFsJyxcbiAgICAgICAgICBTRUxFQ1RJT05fRE9NQUlOICsgJ3tcImZpZWxkXCI6XCJNaWxlc19wZXJfR2FsbG9uXCIsXCJzZWxlY3Rpb25cIjpcImZvb2JhclwifScpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYXJzZVNjYWxlRG9tYWluJywgZnVuY3Rpb24oKSB7XG4gICAgZGVzY3JpYmUoJ2ZhY2V0ZWQgZG9tYWlucycsIGZ1bmN0aW9uKCkge1xuICAgICAgaXQoJ3Nob3VsZCB1c2UgY2xvbmVkIHN1YnRyZWUnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBmYWNldDoge1xuICAgICAgICAgICAgcm93OiB7ZmllbGQ6IFwic3ltYm9sXCIsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGF0YToge3VybDogXCJmb28uY3N2XCJ9LFxuICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jb21wb25lbnQuc2NhbGVzLnguZG9tYWlucywgW3tcbiAgICAgICAgICBkYXRhOiAnc2NhbGVfY2hpbGRfbWFpbicsXG4gICAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgICB9XSk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBub3QgdXNlIGNsb25lZCBzdWJ0cmVlIGlmIHRoZSBkYXRhIGlzIG5vdCBmYWNldGVkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VNb2RlbFdpdGhTY2FsZSh7XG4gICAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICAgIHJvdzoge2ZpZWxkOiBcInN5bWJvbFwiLCB0eXBlOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhdGE6IHt1cmw6IFwiZm9vLmNzdlwifSxcbiAgICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgICBkYXRhOiB7dXJsOiAnZm9vJ30sXG4gICAgICAgICAgICBtYXJrOiAncG9pbnQnLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwobW9kZWwuY29tcG9uZW50LnNjYWxlcy54LmRvbWFpbnMsIFt7XG4gICAgICAgICAgZGF0YTogJ2NoaWxkX21haW4nLFxuICAgICAgICAgIGZpZWxkOiAnYSdcbiAgICAgICAgfV0pO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgbm90IHVzZSBjbG9uZWQgc3VidHJlZSBpZiB0aGUgc2NhbGUgaXMgaW5kZXBlbmRlbnQnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsV2l0aFNjYWxlKHtcbiAgICAgICAgICBmYWNldDoge1xuICAgICAgICAgICAgcm93OiB7ZmllbGQ6IFwic3ltYm9sXCIsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGF0YToge3VybDogXCJmb28uY3N2XCJ9LFxuICAgICAgICAgIHNwZWM6IHtcbiAgICAgICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVzb2x2ZToge1xuICAgICAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICAgICAgeDogJ2luZGVwZW5kZW50J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChtb2RlbC5jaGlsZHJlblswXS5jb21wb25lbnQuc2NhbGVzLnguZG9tYWlucywgW3tcbiAgICAgICAgICBkYXRhOiAnY2hpbGRfbWFpbicsXG4gICAgICAgICAgZmllbGQ6ICdhJ1xuICAgICAgICB9XSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/scale/properties.test.d.ts b/build/test/compile/scale/properties.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/properties.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/properties.test.js b/build/test/compile/scale/properties.test.js new file mode 100644 index 0000000000..efe1fffd15 --- /dev/null +++ b/build/test/compile/scale/properties.test.js @@ -0,0 +1,138 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var rules = tslib_1.__importStar(require("../../../src/compile/scale/properties")); +var mark_1 = require("../../../src/mark"); +describe('compile/scale', function () { + describe('nice', function () { + it('should return nice for x and y.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.nice('linear', c, { type: 'quantitative' }), true); + } + }); + it('should not return nice for binned x and y.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.nice('linear', c, { type: 'quantitative', bin: true }), undefined); + } + }); + it('should not return nice for temporal x and y.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.nice('time', c, { type: 'temporal' }), undefined); + } + }); + }); + describe('padding', function () { + it('should be pointPadding for point scale if channel is x or y and padding is not specified.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.padding(c, 'point', { pointPadding: 13 }, undefined, undefined, undefined), 13); + } + }); + it('should be continuousBandSize for linear x-scale of vertical bar.', function () { + chai_1.assert.equal(rules.padding('x', 'linear', {}, { field: 'date', type: 'temporal' }, { type: 'bar', orient: 'vertical' }, { continuousBandSize: 13 }), 13); + }); + it('should be undefined for linear x-scale for binned field of vertical bar.', function () { + chai_1.assert.equal(rules.padding('x', 'linear', {}, { bin: true, field: 'date', type: 'temporal' }, { type: 'bar', orient: 'vertical' }, { continuousBandSize: 13 }), undefined); + }); + it('should be continuousBandSize for linear y-scale of horizontal bar.', function () { + chai_1.assert.equal(rules.padding('y', 'linear', {}, { field: 'date', type: 'temporal' }, { type: 'bar', orient: 'horizontal' }, { continuousBandSize: 13 }), 13); + }); + }); + describe('paddingInner', function () { + it('should be undefined if padding is specified.', function () { + chai_1.assert.equal(rules.paddingInner(10, 'x', {}), undefined); + }); + it('should be bandPaddingInner if channel is x or y and padding is not specified.', function () { + chai_1.assert.equal(rules.paddingInner(undefined, 'x', { bandPaddingInner: 15 }), 15); + chai_1.assert.equal(rules.paddingInner(undefined, 'y', { bandPaddingInner: 15 }), 15); + }); + it('should be undefined for non-xy channels.', function () { + for (var _i = 0, NONPOSITION_SCALE_CHANNELS_1 = channel_1.NONPOSITION_SCALE_CHANNELS; _i < NONPOSITION_SCALE_CHANNELS_1.length; _i++) { + var c = NONPOSITION_SCALE_CHANNELS_1[_i]; + chai_1.assert.equal(rules.paddingInner(undefined, c, { bandPaddingInner: 15 }), undefined); + } + }); + }); + describe('paddingOuter', function () { + it('should be undefined if padding is specified.', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.equal(rules.paddingOuter(10, 'x', scaleType, 0, {}), undefined); + } + }); + it('should be config.scale.bandPaddingOuter for band scale if channel is x or y and padding is not specified and config.scale.bandPaddingOuter.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.paddingOuter(undefined, c, 'band', 0, { bandPaddingOuter: 16 }), 16); + } + }); + it('should be paddingInner/2 for band scale if channel is x or y and padding is not specified and config.scale.bandPaddingOuter.', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(rules.paddingOuter(undefined, c, 'band', 10, {}), 5); + } + }); + it('should be undefined for non-xy channels.', function () { + for (var _i = 0, NONPOSITION_SCALE_CHANNELS_2 = channel_1.NONPOSITION_SCALE_CHANNELS; _i < NONPOSITION_SCALE_CHANNELS_2.length; _i++) { + var c = NONPOSITION_SCALE_CHANNELS_2[_i]; + for (var _a = 0, _b = ['point', 'band']; _a < _b.length; _a++) { + var scaleType = _b[_a]; + chai_1.assert.equal(rules.paddingOuter(undefined, c, scaleType, 0, {}), undefined); + } + } + }); + }); + describe('reverse', function () { + it('should return true for a continuous scale with sort = "descending".', function () { + chai_1.assert.isTrue(rules.reverse('linear', 'descending')); + }); + it('should return false for a discrete scale with sort = "descending".', function () { + chai_1.assert.isUndefined(rules.reverse('point', 'descending')); + }); + }); + describe('zero', function () { + it('should return true when mapping a quantitative field to x with scale.domain = "unaggregated"', function () { + chai_1.assert(rules.zero('x', { field: 'a', type: 'quantitative' }, 'unaggregated', { type: 'point' })); + }); + it('should return true when mapping a quantitative field to size', function () { + chai_1.assert(rules.zero('size', { field: 'a', type: 'quantitative' }, undefined, { type: 'point' })); + }); + it('should return false when mapping a ordinal field to size', function () { + chai_1.assert(!rules.zero('size', { field: 'a', type: 'ordinal' }, undefined, { type: 'point' })); + }); + it('should return true when mapping a non-binned quantitative field to x/y of point', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(rules.zero(channel, { field: 'a', type: 'quantitative' }, undefined, { type: 'point' })); + } + }); + it('should return false when mapping a quantitative field to dimension axis of bar, line, and area', function () { + for (var _i = 0, _a = [mark_1.BAR, mark_1.AREA, mark_1.LINE]; _i < _a.length; _i++) { + var mark = _a[_i]; + chai_1.assert.isFalse(rules.zero('x', { field: 'a', type: 'quantitative' }, undefined, { type: mark, orient: 'vertical' })); + chai_1.assert.isFalse(rules.zero('y', { field: 'a', type: 'quantitative' }, undefined, { type: mark, orient: 'horizontal' })); + } + }); + it('should return false when mapping a binned quantitative field to x/y', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(!rules.zero(channel, { bin: true, field: 'a', type: 'quantitative' }, undefined, { type: 'point' })); + } + }); + it('should return false when mapping a non-binned quantitative field with custom domain to x/y', function () { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(!rules.zero(channel, { + bin: true, field: 'a', type: 'quantitative' + }, [3, 5], { type: 'point' })); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL3NjYWxlL3Byb3BlcnRpZXMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBRTVCLGdEQUF5RTtBQUd6RSxtRkFBK0Q7QUFDL0QsMENBQWtEO0FBRWxELFFBQVEsQ0FBQyxlQUFlLEVBQUU7SUFDeEIsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUNmLEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtZQUNwQyxLQUFnQixVQUF1QixFQUF2QixLQUFBLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBYyxFQUF2QixjQUF1QixFQUF2QixJQUF1QixFQUFFO2dCQUFwQyxJQUFNLENBQUMsU0FBQTtnQkFDVixhQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3JFO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsNENBQTRDLEVBQUU7WUFDL0MsS0FBZ0IsVUFBdUIsRUFBdkIsS0FBQSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQWMsRUFBdkIsY0FBdUIsRUFBdkIsSUFBdUIsRUFBRTtnQkFBcEMsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ3JGO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOENBQThDLEVBQUU7WUFDakQsS0FBZ0IsVUFBdUIsRUFBdkIsS0FBQSxDQUFDLEdBQUcsRUFB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QUUsU0FBUyxFQUFFLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQzthQUN6RztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRGQUE0RixFQUFFO1lBQy9GLEtBQXNCLFVBQXVCLEVBQXZCLEtBQUEsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFjLEVBQXZCLGNBQXVCLEVBQXZCLElBQXVCLEVBQUU7Z0JBQTFDLElBQU0sT0FBTyxTQUFBO2dCQUNoQixhQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDMUIsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjO2lCQUM1QyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQzthQUM5QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCB7Q2hhbm5lbCwgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFN9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi8uLi8uLi9zcmMvc2NhbGUnO1xuXG5pbXBvcnQgKiBhcyBydWxlcyBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9wcm9wZXJ0aWVzJztcbmltcG9ydCB7QVJFQSwgQkFSLCBMSU5FfSBmcm9tICcuLi8uLi8uLi9zcmMvbWFyayc7XG5cbmRlc2NyaWJlKCdjb21waWxlL3NjYWxlJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbmljZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBuaWNlIGZvciB4IGFuZCB5LicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMubmljZSgnbGluZWFyJywgYywge3R5cGU6ICdxdWFudGl0YXRpdmUnfSksIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgcmV0dXJuIG5pY2UgZm9yIGJpbm5lZCB4IGFuZCB5LicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMubmljZSgnbGluZWFyJywgYywge3R5cGU6ICdxdWFudGl0YXRpdmUnLCBiaW46IHRydWV9KSwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHJldHVybiBuaWNlIGZvciB0ZW1wb3JhbCB4IGFuZCB5LicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMubmljZSgndGltZScsIGMsIHt0eXBlOiAndGVtcG9yYWwnfSksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdwYWRkaW5nJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYmUgcG9pbnRQYWRkaW5nIGZvciBwb2ludCBzY2FsZSBpZiBjaGFubmVsIGlzIHggb3IgeSBhbmQgcGFkZGluZyBpcyBub3Qgc3BlY2lmaWVkLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMucGFkZGluZyhjLCAncG9pbnQnLCB7cG9pbnRQYWRkaW5nOiAxM30sIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpLCAxMyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGNvbnRpbnVvdXNCYW5kU2l6ZSBmb3IgbGluZWFyIHgtc2NhbGUgb2YgdmVydGljYWwgYmFyLicsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChydWxlcy5wYWRkaW5nKCd4JywgJ2xpbmVhcicsIHt9LCB7ZmllbGQ6ICdkYXRlJywgdHlwZTogJ3RlbXBvcmFsJ30sIHt0eXBlOiAnYmFyJywgb3JpZW50OiAndmVydGljYWwnfSwge2NvbnRpbnVvdXNCYW5kU2l6ZTogMTN9KSwgMTMpO1xuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIGJlIHVuZGVmaW5lZCBmb3IgbGluZWFyIHgtc2NhbGUgZm9yIGJpbm5lZCBmaWVsZCBvZiB2ZXJ0aWNhbCBiYXIuJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJ1bGVzLnBhZGRpbmcoJ3gnLCAnbGluZWFyJywge30sIHtiaW46IHRydWUsIGZpZWxkOiAnZGF0ZScsIHR5cGU6ICd0ZW1wb3JhbCd9LCB7dHlwZTogJ2JhcicsIG9yaWVudDogJ3ZlcnRpY2FsJ30sIHtjb250aW51b3VzQmFuZFNpemU6IDEzfSksIHVuZGVmaW5lZCk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGNvbnRpbnVvdXNCYW5kU2l6ZSBmb3IgbGluZWFyIHktc2NhbGUgb2YgaG9yaXpvbnRhbCBiYXIuJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHJ1bGVzLnBhZGRpbmcoJ3knLCAnbGluZWFyJywge30sIHtmaWVsZDogJ2RhdGUnLCB0eXBlOiAndGVtcG9yYWwnfSwge3R5cGU6ICdiYXInLCBvcmllbnQ6ICdob3Jpem9udGFsJ30sIHtjb250aW51b3VzQmFuZFNpemU6IDEzfSksIDEzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3BhZGRpbmdJbm5lcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIHVuZGVmaW5lZCBpZiBwYWRkaW5nIGlzIHNwZWNpZmllZC4nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwocnVsZXMucGFkZGluZ0lubmVyKDEwLCAneCcsIHt9KSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgYmFuZFBhZGRpbmdJbm5lciBpZiBjaGFubmVsIGlzIHggb3IgeSBhbmQgcGFkZGluZyBpcyBub3Qgc3BlY2lmaWVkLicsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChydWxlcy5wYWRkaW5nSW5uZXIodW5kZWZpbmVkLCAneCcsIHtiYW5kUGFkZGluZ0lubmVyOiAxNX0pLCAxNSk7XG4gICAgICBhc3NlcnQuZXF1YWwocnVsZXMucGFkZGluZ0lubmVyKHVuZGVmaW5lZCwgJ3knLCB7YmFuZFBhZGRpbmdJbm5lcjogMTV9KSwgMTUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSB1bmRlZmluZWQgZm9yIG5vbi14eSBjaGFubmVscy4nLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHJ1bGVzLnBhZGRpbmdJbm5lcih1bmRlZmluZWQsIGMsIHtiYW5kUGFkZGluZ0lubmVyOiAxNX0pLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncGFkZGluZ091dGVyJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgYmUgdW5kZWZpbmVkIGlmIHBhZGRpbmcgaXMgc3BlY2lmaWVkLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIFsncG9pbnQnLCAnYmFuZCddIGFzIFNjYWxlVHlwZVtdKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChydWxlcy5wYWRkaW5nT3V0ZXIoMTAsICd4Jywgc2NhbGVUeXBlLCAwLCB7fSksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGNvbmZpZy5zY2FsZS5iYW5kUGFkZGluZ091dGVyIGZvciBiYW5kIHNjYWxlIGlmIGNoYW5uZWwgaXMgeCBvciB5IGFuZCBwYWRkaW5nIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGNvbmZpZy5zY2FsZS5iYW5kUGFkZGluZ091dGVyLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMucGFkZGluZ091dGVyKHVuZGVmaW5lZCwgYywgJ2JhbmQnLCAwLCB7YmFuZFBhZGRpbmdPdXRlcjogMTZ9KSwgMTYpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgYmUgcGFkZGluZ0lubmVyLzIgZm9yIGJhbmQgc2NhbGUgaWYgY2hhbm5lbCBpcyB4IG9yIHkgYW5kIHBhZGRpbmcgaXMgbm90IHNwZWNpZmllZCBhbmQgY29uZmlnLnNjYWxlLmJhbmRQYWRkaW5nT3V0ZXIuJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjIG9mIFsneCcsICd5J10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChydWxlcy5wYWRkaW5nT3V0ZXIodW5kZWZpbmVkLCBjLCAnYmFuZCcsIDEwLCB7fSksIDUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSB1bmRlZmluZWQgZm9yIG5vbi14eSBjaGFubmVscy4nLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMpIHtcbiAgICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2YgWydwb2ludCcsICdiYW5kJ10gYXMgU2NhbGVUeXBlW10pIHtcbiAgICAgICAgICBhc3NlcnQuZXF1YWwocnVsZXMucGFkZGluZ091dGVyKHVuZGVmaW5lZCwgYywgc2NhbGVUeXBlLCAwLCB7fSksIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JldmVyc2UnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYSBjb250aW51b3VzIHNjYWxlIHdpdGggc29ydCA9IFwiZGVzY2VuZGluZ1wiLicsICgpID0+IHtcbiAgICAgIGFzc2VydC5pc1RydWUocnVsZXMucmV2ZXJzZSgnbGluZWFyJywgJ2Rlc2NlbmRpbmcnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgYSBkaXNjcmV0ZSBzY2FsZSB3aXRoIHNvcnQgPSBcImRlc2NlbmRpbmdcIi4nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQocnVsZXMucmV2ZXJzZSgncG9pbnQnLCAnZGVzY2VuZGluZycpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3plcm8nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIG1hcHBpbmcgYSBxdWFudGl0YXRpdmUgZmllbGQgdG8geCB3aXRoIHNjYWxlLmRvbWFpbiA9IFwidW5hZ2dyZWdhdGVkXCInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQocnVsZXMuemVybygneCcsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sICd1bmFnZ3JlZ2F0ZWQnLCB7dHlwZTogJ3BvaW50J30pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBtYXBwaW5nIGEgcXVhbnRpdGF0aXZlIGZpZWxkIHRvIHNpemUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQocnVsZXMuemVybygnc2l6ZScsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sIHVuZGVmaW5lZCwge3R5cGU6ICdwb2ludCd9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG1hcHBpbmcgYSBvcmRpbmFsIGZpZWxkIHRvIHNpemUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQoIXJ1bGVzLnplcm8oJ3NpemUnLCB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfSwgdW5kZWZpbmVkLCB7dHlwZTogJ3BvaW50J30pKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBtYXBwaW5nIGEgbm9uLWJpbm5lZCBxdWFudGl0YXRpdmUgZmllbGQgdG8geC95IG9mIHBvaW50JywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFsneCcsICd5J10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgIGFzc2VydChydWxlcy56ZXJvKGNoYW5uZWwsIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sIHVuZGVmaW5lZCwge3R5cGU6ICdwb2ludCd9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG1hcHBpbmcgYSBxdWFudGl0YXRpdmUgZmllbGQgdG8gZGltZW5zaW9uIGF4aXMgb2YgYmFyLCBsaW5lLCBhbmQgYXJlYScsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWFyayBvZiBbQkFSLCBBUkVBLCBMSU5FXSkge1xuICAgICAgICBhc3NlcnQuaXNGYWxzZShydWxlcy56ZXJvKCd4Jywge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgdW5kZWZpbmVkLCB7dHlwZTogbWFyaywgb3JpZW50OiAndmVydGljYWwnfSkpO1xuICAgICAgICBhc3NlcnQuaXNGYWxzZShydWxlcy56ZXJvKCd5Jywge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgdW5kZWZpbmVkLCB7dHlwZTogbWFyaywgb3JpZW50OiAnaG9yaXpvbnRhbCd9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSB3aGVuIG1hcHBpbmcgYSBiaW5uZWQgcXVhbnRpdGF0aXZlIGZpZWxkIHRvIHgveScsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQoIXJ1bGVzLnplcm8oY2hhbm5lbCwge2JpbjogdHJ1ZSwgZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LCB1bmRlZmluZWQsIHt0eXBlOiAncG9pbnQnfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2Ugd2hlbiBtYXBwaW5nIGEgbm9uLWJpbm5lZCBxdWFudGl0YXRpdmUgZmllbGQgd2l0aCBjdXN0b20gZG9tYWluIHRvIHgveScsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3gnLCAneSddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQoIXJ1bGVzLnplcm8oY2hhbm5lbCwge1xuICAgICAgICAgIGJpbjogdHJ1ZSwgZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgfSwgWzMsIDVdLCB7dHlwZTogJ3BvaW50J30pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/scale/range.test.d.ts b/build/test/compile/scale/range.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/range.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/range.test.js b/build/test/compile/scale/range.test.js new file mode 100644 index 0000000000..88eaaf253d --- /dev/null +++ b/build/test/compile/scale/range.test.js @@ -0,0 +1,204 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var range_1 = require("../../../src/compile/scale/range"); +var split_1 = require("../../../src/compile/split"); +var config_1 = require("../../../src/config"); +var log = tslib_1.__importStar(require("../../../src/log")); +var scale_1 = require("../../../src/scale"); +var type_1 = require("../../../src/type"); +describe('compile/scale', function () { + describe('parseRange()', function () { + describe('position', function () { + it('should return [0, plot_width] for x-continuous scales by default.', function () { + for (var _i = 0, CONTINUOUS_TO_CONTINUOUS_SCALES_1 = scale_1.CONTINUOUS_TO_CONTINUOUS_SCALES; _i < CONTINUOUS_TO_CONTINUOUS_SCALES_1.length; _i++) { + var scaleType = CONTINUOUS_TO_CONTINUOUS_SCALES_1[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.QUANTITATIVE, {}, config_1.defaultConfig, true, 'point', false, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + } + }); + it('should return [plot_height,0] for y-continuous scales by default.', function () { + for (var _i = 0, CONTINUOUS_TO_CONTINUOUS_SCALES_2 = scale_1.CONTINUOUS_TO_CONTINUOUS_SCALES; _i < CONTINUOUS_TO_CONTINUOUS_SCALES_2.length; _i++) { + var scaleType = CONTINUOUS_TO_CONTINUOUS_SCALES_2[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('y', scaleType, type_1.QUANTITATIVE, {}, config_1.defaultConfig, true, 'point', false, 'plot_height', []), split_1.makeImplicit([{ signal: 'plot_height' }, 0])); + } + }); + it('should return [0, plot_height] for y-discrete scales with height by default.', function () { + for (var _i = 0, DISCRETE_DOMAIN_SCALES_1 = scale_1.DISCRETE_DOMAIN_SCALES; _i < DISCRETE_DOMAIN_SCALES_1.length; _i++) { + var scaleType = DISCRETE_DOMAIN_SCALES_1[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('y', scaleType, type_1.QUANTITATIVE, {}, config_1.defaultConfig, true, 'point', true, 'plot_height', []), split_1.makeImplicit([0, { signal: 'plot_height' }])); + } + }); + it('should support custom range.', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', 'linear', type_1.QUANTITATIVE, { range: [0, 100] }, config_1.defaultConfig, true, 'point', false, 'plot_width', []), split_1.makeExplicit([0, 100])); + chai_1.assert.deepEqual(localLogger.warns.length, 0); + })); + it('should return config.scale.rangeStep for band/point scales by default.', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit({ step: 21 })); + } + }); + it('should return config.scale.textXRangeStep by default for text mark\'s x band/point scales.', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, {}, { scale: { textXRangeStep: 55 } }, undefined, 'text', false, 'plot_width', []), split_1.makeImplicit({ step: 55 })); + } + }); + it('should return specified rangeStep if topLevelSize is undefined for band/point scales', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, { rangeStep: 23 }, config_1.defaultConfig, undefined, 'text', false, 'plot_width', []), split_1.makeExplicit({ step: 23 })); + } + }); + it('should drop rangeStep if topLevelSize is specified for band/point scales', log.wrap(function (localLogger) { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, { rangeStep: 23 }, config_1.defaultConfig, undefined, 'text', true, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + } + chai_1.assert.equal(localLogger.warns[0], log.message.rangeStepDropped('x')); + })); + it('should return default topLevelSize if rangeStep is null for band/point scales', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, { rangeStep: null }, config_1.defaultConfig, undefined, 'text', false, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + } + }); + it('should return default topLevelSize if rangeStep config is null', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, {}, { view: { width: 200 }, scale: { rangeStep: null } }, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + } + }); + it('should return default topLevelSize for text if textXRangeStep config is null', function () { + for (var _i = 0, _a = ['point', 'band']; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.NOMINAL, {}, { view: { width: 200 }, scale: { textXRangeStep: null } }, undefined, 'text', false, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + } + }); + it('should drop rangeStep for continuous scales', function () { + var _loop_1 = function (scaleType) { + log.wrap(function (localLogger) { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('x', scaleType, type_1.QUANTITATIVE, { rangeStep: 23 }, config_1.defaultConfig, undefined, 'text', true, 'plot_width', []), split_1.makeImplicit([0, { signal: 'plot_width' }])); + chai_1.assert.equal(localLogger.warns[0], log.message.scalePropertyNotWorkWithScaleType(scaleType, 'rangeStep', 'x')); + })(); + }; + for (var _i = 0, CONTINUOUS_TO_CONTINUOUS_SCALES_3 = scale_1.CONTINUOUS_TO_CONTINUOUS_SCALES; _i < CONTINUOUS_TO_CONTINUOUS_SCALES_3.length; _i++) { + var scaleType = CONTINUOUS_TO_CONTINUOUS_SCALES_3[_i]; + _loop_1(scaleType); + } + }); + }); + describe('color', function () { + it('should use the specified scheme for a nominal color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.NOMINAL, { scheme: 'warm' }, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeExplicit({ scheme: 'warm' })); + }); + it('should use the specified scheme with extent for a nominal color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.NOMINAL, { scheme: { name: 'warm', extent: [0.2, 1] } }, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeExplicit({ scheme: 'warm', extent: [0.2, 1] })); + }); + it('should use the specified range for a nominal color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.NOMINAL, { range: ['red', 'green', 'blue'] }, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeExplicit(['red', 'green', 'blue'])); + }); + it('should use default category range in Vega for a nominal color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.NOMINAL, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit('category')); + }); + it('should use default ordinal range in Vega for an ordinal color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.ORDINAL, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit('ordinal')); + }); + it('should use default ramp range in Vega for a temporal/quantitative color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'sequential', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit('ramp')); + }); + it('should use the specified scheme with count for a quantitative color field.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('color', 'ordinal', type_1.QUANTITATIVE, { scheme: { name: 'viridis', count: 3 } }, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeExplicit({ scheme: 'viridis', count: 3 })); + }); + }); + describe('opacity', function () { + it('should use default opacityRange as opacity\'s scale range.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('opacity', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit([config_1.defaultConfig.scale.minOpacity, config_1.defaultConfig.scale.maxOpacity])); + }); + }); + describe('size', function () { + describe('bar', function () { + it('should return [minBandSize, maxBandSize] if both are specified', function () { + var config = { + scale: { minBandSize: 2, maxBandSize: 9 } + }; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config, undefined, 'bar', false, 'plot_width', []), split_1.makeImplicit([2, 9])); + }); + it('should return [continuousBandSize, xRangeStep-1] by default since min/maxSize config are not specified', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'bar', false, 'plot_width', []), split_1.makeImplicit([2, config_1.defaultConfig.scale.rangeStep - 1])); + }); + }); + describe('tick', function () { + it('should return [minBandSize, maxBandSize] if both are specified', function () { + var config = { + scale: { minBandSize: 4, maxBandSize: 9 } + }; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config, undefined, 'tick', false, 'plot_width', []), split_1.makeImplicit([4, 9])); + }); + it('should return [(default)minBandSize, rangeStep-1] by default since maxSize config is not specified', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'tick', false, 'plot_width', []), split_1.makeImplicit([config_1.defaultConfig.scale.minBandSize, config_1.defaultConfig.scale.rangeStep - 1])); + }); + }); + describe('text', function () { + it('should return [minFontSize, maxFontSize]', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'text', false, 'plot_width', []), split_1.makeImplicit([config_1.defaultConfig.scale.minFontSize, config_1.defaultConfig.scale.maxFontSize])); + }); + }); + describe('rule', function () { + it('should return [minStrokeWidth, maxStrokeWidth]', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'rule', false, 'plot_width', []), split_1.makeImplicit([config_1.defaultConfig.scale.minStrokeWidth, config_1.defaultConfig.scale.maxStrokeWidth])); + }); + }); + describe('point, square, circle', function () { + it('should return [minSize, maxSize]', function () { + for (var _i = 0, _a = ['point', 'square', 'circle']; _i < _a.length; _i++) { + var m = _a[_i]; + var config = { + scale: { + minSize: 5, + maxSize: 25 + } + }; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config, undefined, m, false, 'plot_width', []), split_1.makeImplicit([5, 25])); + } + }); + it('should return [0, (minBandSize-2)^2] if both x and y are discrete and size is quantitative (thus use zero=true, by default)', function () { + for (var _i = 0, _a = ['point', 'square', 'circle']; _i < _a.length; _i++) { + var m = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, true, m, false, 'plot_width', [11, 13] // xyRangeSteps + ), split_1.makeImplicit([0, 81])); + } + }); + it('should return [9, (minBandSize-2)^2] if both x and y are discrete and size is not quantitative (thus use zero=false, by default)', function () { + for (var _i = 0, _a = ['point', 'square', 'circle']; _i < _a.length; _i++) { + var m = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, false, m, false, 'plot_width', [11, 13] // xyRangeSteps + ), split_1.makeImplicit([9, 81])); + } + }); + it('should return [9, (minBandSize-2)^2] if both x and y are discrete and size is quantitative but use zero=false', function () { + for (var _i = 0, _a = ['point', 'square', 'circle']; _i < _a.length; _i++) { + var m = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, false, m, false, 'plot_width', [11, 13] // xyRangeSteps + ), split_1.makeImplicit([9, 81])); + } + }); + it('should return [0, (xRangeStep-2)^2] if x is discrete and y is continuous and size is quantitative (thus use zero=true, by default)', function () { + for (var _i = 0, _a = ['point', 'square', 'circle']; _i < _a.length; _i++) { + var m = _a[_i]; + chai_1.assert.deepEqual(range_1.parseRangeForChannel('size', 'linear', type_1.QUANTITATIVE, {}, config_1.defaultConfig, true, m, false, 'plot_width', [11] // xyRangeSteps only have one value + ), split_1.makeImplicit([0, 81])); + } + }); + }); + }); + describe('shape', function () { + it('should use default symbol range in Vega as shape\'s scale range.', function () { + chai_1.assert.deepEqual(range_1.parseRangeForChannel('shape', 'ordinal', type_1.QUANTITATIVE, {}, config_1.defaultConfig, undefined, 'point', false, 'plot_width', []), split_1.makeImplicit('symbol')); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zY2FsZS9yYW5nZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFFNUIsMERBQXNFO0FBQ3RFLG9EQUFzRTtBQUN0RSw4Q0FBa0Q7QUFDbEQsNERBQXdDO0FBRXhDLDRDQUFzRztBQUN0RywwQ0FBaUU7QUFFakUsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixRQUFRLENBQUMsY0FBYyxFQUFFO1FBQ3ZCLFFBQVEsQ0FBQyxVQUFVLEVBQUU7WUFDbkIsRUFBRSxDQUFDLG1FQUFtRSxFQUFFO2dCQUN0RSxLQUF3QixVQUErQixFQUEvQixvQ0FBQSx1Q0FBK0IsRUFBL0IsNkNBQStCLEVBQS9CLElBQStCLEVBQUU7b0JBQXBELElBQU0sU0FBUyx3Q0FBQTtvQkFDbEIsYUFBTSxDQUFDLFNBQVMsQ0FDZCw0QkFBb0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFZLEVBQUUsRUFBRSxFQUFFLHNCQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUM3RyxvQkFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztpQkFDSDtZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLG1FQUFtRSxFQUFFO2dCQUN0RSxLQUF3QixVQUErQixFQUEvQixvQ0FBQSx1Q0FBK0IsRUFBL0IsNkNBQStCLEVBQS9CLElBQStCLEVBQUU7b0JBQXBELElBQU0sU0FBUyx3Q0FBQTtvQkFDbEIsYUFBTSxDQUFDLFNBQVMsQ0FDZCw0QkFBb0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFZLEVBQUUsRUFBRSxFQUFFLHNCQUFhLEVBQUUsSUFBSSxFQUFF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QUUsc0JBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQ2xHLENBQUMsRUFBRSxDQUFDLENBQUMsbUNBQW1DO3lCQUN6QyxFQUNELG9CQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDdEIsQ0FBQztxQkFDSDtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ2hCLEVBQUUsQ0FBQyxrRUFBa0UsRUFBRTtnQkFDckUsYUFBTSxDQUFDLFNBQVMsQ0FDZCw0QkFBb0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLG1CQUFZLEVBQUUsRUFBRSxFQUFFLHNCQUFhLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUN0SCxvQkFBWSxDQUFDLFFBQVEsQ0FBQyxDQUN2QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge3BhcnNlUmFuZ2VGb3JDaGFubmVsfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9yYW5nZSc7XG5pbXBvcnQge21ha2VFeHBsaWNpdCwgbWFrZUltcGxpY2l0fSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zcGxpdCc7XG5pbXBvcnQge2RlZmF1bHRDb25maWd9IGZyb20gJy4uLy4uLy4uL3NyYy9jb25maWcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uLy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuLi8uLi8uLi9zcmMvbWFyayc7XG5pbXBvcnQge0NPTlRJTlVPVVNfVE9fQ09OVElOVU9VU19TQ0FMRVMsIERJU0NSRVRFX0RPTUFJTl9TQ0FMRVMsIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vLi4vc3JjL3NjYWxlJztcbmltcG9ydCB7Tk9NSU5BTCwgT1JESU5BTCwgUVVBTlRJVEFUSVZFfSBmcm9tICcuLi8uLi8uLi9zcmMvdHlwZSc7XG5cbmRlc2NyaWJlKCdjb21waWxlL3NjYWxlJywgKCkgPT4ge1xuICBkZXNjcmliZSgncGFyc2VSYW5nZSgpJywgZnVuY3Rpb24oKSB7XG4gICAgZGVzY3JpYmUoJ3Bvc2l0aW9uJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gWzAsIHBsb3Rfd2lkdGhdIGZvciB4LWNvbnRpbnVvdXMgc2NhbGVzIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBDT05USU5VT1VTX1RPX0NPTlRJTlVPVVNfU0NBTEVTKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCB0cnVlLCAncG9pbnQnLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgICBtYWtlSW1wbGljaXQoWzAsIHtzaWduYWw6ICdwbG90X3dpZHRoJ31dKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBbcGxvdF9oZWlnaHQsMF0gZm9yIHktY29udGludW91cyBzY2FsZXMgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIENPTlRJTlVPVVNfVE9fQ09OVElOVU9VU19TQ0FMRVMpIHtcbiAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3knLCBzY2FsZVR5cGUsIFFVQU5USVRBVElWRSwge30sIGRlZmF1bHRDb25maWcsIHRydWUsICdwb2ludCcsIGZhbHNlLCAncGxvdF9oZWlnaHQnLCBbXSksXG4gICAgICAgICAgICBtYWtlSW1wbGljaXQoW3tzaWduYWw6ICdwbG90X2hlaWdodCd9LCAwXSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gWzAsIHBsb3RfaGVpZ2h0XSBmb3IgeS1kaXNjcmV0ZSBzY2FsZXMgd2l0aCBoZWlnaHQgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIERJU0NSRVRFX0RPTUFJTl9TQ0FMRVMpIHtcbiAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3knLCBzY2FsZVR5cGUsIFFVQU5USVRBVElWRSwge30sIGRlZmF1bHRDb25maWcsIHRydWUsICdwb2ludCcsIHRydWUsICdwbG90X2hlaWdodCcsIFtdKSxcbiAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbMCwge3NpZ25hbDogJ3Bsb3RfaGVpZ2h0J31dKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHN1cHBvcnQgY3VzdG9tIHJhbmdlLicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4JywgJ2xpbmVhcicsIFFVQU5USVRBVElWRSwge3JhbmdlOiBbMCwgMTAwXX0sIGRlZmF1bHRDb25maWcsIHRydWUsICdwb2ludCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICBtYWtlRXhwbGljaXQoWzAsIDEwMF0pXG4gICAgICAgICk7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwobG9jYWxMb2dnZXIud2FybnMubGVuZ3RoLCAwKTtcbiAgICAgIH0pKTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY29uZmlnLnNjYWxlLnJhbmdlU3RlcCBmb3IgYmFuZC9wb2ludCBzY2FsZXMgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIFsncG9pbnQnLCAnYmFuZCddIGFzIFNjYWxlVHlwZVtdKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBOT01JTkFMLCB7fSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAncG9pbnQnLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgICBtYWtlSW1wbGljaXQoe3N0ZXA6IDIxfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gY29uZmlnLnNjYWxlLnRleHRYUmFuZ2VTdGVwIGJ5IGRlZmF1bHQgZm9yIHRleHQgbWFya1xcJ3MgeCBiYW5kL3BvaW50IHNjYWxlcy4nLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIFsncG9pbnQnLCAnYmFuZCddIGFzIFNjYWxlVHlwZVtdKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBOT01JTkFMLCB7fSwge3NjYWxlOiB7dGV4dFhSYW5nZVN0ZXA6IDU1fX0sIHVuZGVmaW5lZCwgJ3RleHQnLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgICBtYWtlSW1wbGljaXQoe3N0ZXA6IDU1fSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gc3BlY2lmaWVkIHJhbmdlU3RlcCBpZiB0b3BMZXZlbFNpemUgaXMgdW5kZWZpbmVkIGZvciBiYW5kL3BvaW50IHNjYWxlcycsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2YgWydwb2ludCcsICdiYW5kJ10gYXMgU2NhbGVUeXBlW10pIHtcbiAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3gnLCBzY2FsZVR5cGUsIE5PTUlOQUwsIHtyYW5nZVN0ZXA6IDIzfSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAndGV4dCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICAgIG1ha2VFeHBsaWNpdCh7c3RlcDogMjN9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIGRyb3AgcmFuZ2VTdGVwIGlmIHRvcExldmVsU2l6ZSBpcyBzcGVjaWZpZWQgZm9yIGJhbmQvcG9pbnQgc2NhbGVzJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIFsncG9pbnQnLCAnYmFuZCddIGFzIFNjYWxlVHlwZVtdKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBOT01JTkFMLCB7cmFuZ2VTdGVwOiAyM30sIGRlZmF1bHRDb25maWcsIHVuZGVmaW5lZCwgJ3RleHQnLCB0cnVlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbMCwge3NpZ25hbDogJ3Bsb3Rfd2lkdGgnfV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLnJhbmdlU3RlcERyb3BwZWQoJ3gnKSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgdG9wTGV2ZWxTaXplIGlmIHJhbmdlU3RlcCBpcyBudWxsIGZvciBiYW5kL3BvaW50IHNjYWxlcycsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2YgWydwb2ludCcsICdiYW5kJ10gYXMgU2NhbGVUeXBlW10pIHtcbiAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3gnLCBzY2FsZVR5cGUsIE5PTUlOQUwsIHtyYW5nZVN0ZXA6IG51bGx9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICd0ZXh0JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFswLCB7c2lnbmFsOiAncGxvdF93aWR0aCd9XSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZGVmYXVsdCB0b3BMZXZlbFNpemUgaWYgcmFuZ2VTdGVwIGNvbmZpZyBpcyBudWxsJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBbJ3BvaW50JywgJ2JhbmQnXSBhcyBTY2FsZVR5cGVbXSkge1xuICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgneCcsIHNjYWxlVHlwZSwgTk9NSU5BTCwge30sIHt2aWV3OiB7d2lkdGg6IDIwMH0sIHNjYWxlOiB7cmFuZ2VTdGVwOiBudWxsfX0sIHVuZGVmaW5lZCwgJ3BvaW50JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFswLCB7c2lnbmFsOiAncGxvdF93aWR0aCd9XSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZGVmYXVsdCB0b3BMZXZlbFNpemUgZm9yIHRleHQgaWYgdGV4dFhSYW5nZVN0ZXAgY29uZmlnIGlzIG51bGwnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIFsncG9pbnQnLCAnYmFuZCddIGFzIFNjYWxlVHlwZVtdKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBOT01JTkFMLCB7fSwge3ZpZXc6IHt3aWR0aDogMjAwfSwgc2NhbGU6IHt0ZXh0WFJhbmdlU3RlcDogbnVsbH19LCB1bmRlZmluZWQsICd0ZXh0JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFswLCB7c2lnbmFsOiAncGxvdF93aWR0aCd9XSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCBkcm9wIHJhbmdlU3RlcCBmb3IgY29udGludW91cyBzY2FsZXMnLCAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgc2NhbGVUeXBlIG9mIENPTlRJTlVPVVNfVE9fQ09OVElOVU9VU19TQ0FMRVMpIHtcbiAgICAgICAgICBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCd4Jywgc2NhbGVUeXBlLCBRVUFOVElUQVRJVkUsIHtyYW5nZVN0ZXA6IDIzfSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAndGV4dCcsIHRydWUsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgICBtYWtlSW1wbGljaXQoWzAsIHtzaWduYWw6ICdwbG90X3dpZHRoJ31dKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2Uuc2NhbGVQcm9wZXJ0eU5vdFdvcmtXaXRoU2NhbGVUeXBlKHNjYWxlVHlwZSwgJ3JhbmdlU3RlcCcsICd4JykpO1xuICAgICAgICAgIH0pKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ2NvbG9yJywgZnVuY3Rpb24oKSB7XG4gICAgICBpdCgnc2hvdWxkIHVzZSB0aGUgc3BlY2lmaWVkIHNjaGVtZSBmb3IgYSBub21pbmFsIGNvbG9yIGZpZWxkLicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnY29sb3InLCAnb3JkaW5hbCcsIE5PTUlOQUwsIHtzY2hlbWU6ICd3YXJtJ30sIGRlZmF1bHRDb25maWcsIHVuZGVmaW5lZCwgJ3BvaW50JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgIG1ha2VFeHBsaWNpdCh7c2NoZW1lOiAnd2FybSd9KVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdXNlIHRoZSBzcGVjaWZpZWQgc2NoZW1lIHdpdGggZXh0ZW50IGZvciBhIG5vbWluYWwgY29sb3IgZmllbGQuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdjb2xvcicsICdvcmRpbmFsJywgTk9NSU5BTCwge3NjaGVtZToge25hbWU6ICd3YXJtJywgZXh0ZW50OiBbMC4yLCAxXX19LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICdwb2ludCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICBtYWtlRXhwbGljaXQoe3NjaGVtZTogJ3dhcm0nLCBleHRlbnQ6IFswLjIsIDFdfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSB0aGUgc3BlY2lmaWVkIHJhbmdlIGZvciBhIG5vbWluYWwgY29sb3IgZmllbGQuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdjb2xvcicsICdvcmRpbmFsJywgTk9NSU5BTCwge3JhbmdlOiBbJ3JlZCcsICdncmVlbicsICdibHVlJ119LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICdwb2ludCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICBtYWtlRXhwbGljaXQoWydyZWQnLCAnZ3JlZW4nLCAnYmx1ZSddKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgdXNlIGRlZmF1bHQgY2F0ZWdvcnkgcmFuZ2UgaW4gVmVnYSBmb3IgYSBub21pbmFsIGNvbG9yIGZpZWxkLicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnY29sb3InLCAnb3JkaW5hbCcsIE5PTUlOQUwsIHt9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICdwb2ludCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICBtYWtlSW1wbGljaXQoJ2NhdGVnb3J5JylcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IG9yZGluYWwgcmFuZ2UgaW4gVmVnYSBmb3IgYW4gb3JkaW5hbCBjb2xvciBmaWVsZC4nLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ2NvbG9yJywgJ29yZGluYWwnLCBPUkRJTkFMLCB7fSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAncG9pbnQnLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgbWFrZUltcGxpY2l0KCdvcmRpbmFsJylcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSBkZWZhdWx0IHJhbXAgcmFuZ2UgaW4gVmVnYSBmb3IgYSB0ZW1wb3JhbC9xdWFudGl0YXRpdmUgY29sb3IgZmllbGQuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdjb2xvcicsICdzZXF1ZW50aWFsJywgUVVBTlRJVEFUSVZFLCB7fSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAncG9pbnQnLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgbWFrZUltcGxpY2l0KCdyYW1wJylcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHVzZSB0aGUgc3BlY2lmaWVkIHNjaGVtZSB3aXRoIGNvdW50IGZvciBhIHF1YW50aXRhdGl2ZSBjb2xvciBmaWVsZC4nLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ2NvbG9yJywgJ29yZGluYWwnLCBRVUFOVElUQVRJVkUsIHtzY2hlbWU6IHtuYW1lOiAndmlyaWRpcycsIGNvdW50OiAzfX0sIGRlZmF1bHRDb25maWcsIHVuZGVmaW5lZCwgJ3BvaW50JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgIG1ha2VFeHBsaWNpdCh7c2NoZW1lOiAndmlyaWRpcycsIGNvdW50OiAzfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ29wYWNpdHknLCBmdW5jdGlvbigpIHtcbiAgICAgIGl0KCdzaG91bGQgdXNlIGRlZmF1bHQgb3BhY2l0eVJhbmdlIGFzIG9wYWNpdHlcXCdzIHNjYWxlIHJhbmdlLicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnb3BhY2l0eScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICdwb2ludCcsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICBtYWtlSW1wbGljaXQoW2RlZmF1bHRDb25maWcuc2NhbGUubWluT3BhY2l0eSwgZGVmYXVsdENvbmZpZy5zY2FsZS5tYXhPcGFjaXR5XSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NpemUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGRlc2NyaWJlKCdiYXInLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gW21pbkJhbmRTaXplLCBtYXhCYW5kU2l6ZV0gaWYgYm90aCBhcmUgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIHNjYWxlOiB7bWluQmFuZFNpemU6IDIsIG1heEJhbmRTaXplOiA5fVxuICAgICAgICAgIH07XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdzaXplJywgJ2xpbmVhcicsIFFVQU5USVRBVElWRSwge30sIGNvbmZpZywgdW5kZWZpbmVkLCAnYmFyJywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFsyLCA5XSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBbY29udGludW91c0JhbmRTaXplLCB4UmFuZ2VTdGVwLTFdIGJ5IGRlZmF1bHQgc2luY2UgbWluL21heFNpemUgY29uZmlnIGFyZSBub3Qgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2l6ZScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICdiYXInLCBmYWxzZSwgJ3Bsb3Rfd2lkdGgnLCBbXSksXG4gICAgICAgICAgICBtYWtlSW1wbGljaXQoWzIsIGRlZmF1bHRDb25maWcuc2NhbGUucmFuZ2VTdGVwIC0gMV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3RpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gW21pbkJhbmRTaXplLCBtYXhCYW5kU2l6ZV0gaWYgYm90aCBhcmUgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIHNjYWxlOiB7bWluQmFuZFNpemU6IDQsIG1heEJhbmRTaXplOiA5fVxuICAgICAgICAgIH07XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdzaXplJywgJ2xpbmVhcicsIFFVQU5USVRBVElWRSwge30sIGNvbmZpZywgdW5kZWZpbmVkLCAndGljaycsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbNCwgOV0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gWyhkZWZhdWx0KW1pbkJhbmRTaXplLCByYW5nZVN0ZXAtMV0gYnkgZGVmYXVsdCBzaW5jZSBtYXhTaXplIGNvbmZpZyBpcyBub3Qgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2l6ZScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICd0aWNrJywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFtkZWZhdWx0Q29uZmlnLnNjYWxlLm1pbkJhbmRTaXplLCBkZWZhdWx0Q29uZmlnLnNjYWxlLnJhbmdlU3RlcCAtIDFdKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGRlc2NyaWJlKCd0ZXh0JywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFttaW5Gb250U2l6ZSwgbWF4Rm9udFNpemVdJywgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2l6ZScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCB1bmRlZmluZWQsICd0ZXh0JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgbWFrZUltcGxpY2l0KFtkZWZhdWx0Q29uZmlnLnNjYWxlLm1pbkZvbnRTaXplLCBkZWZhdWx0Q29uZmlnLnNjYWxlLm1heEZvbnRTaXplXSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgncnVsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBbbWluU3Ryb2tlV2lkdGgsIG1heFN0cm9rZVdpZHRoXScsICgpID0+IHtcbiAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3NpemUnLCAnbGluZWFyJywgUVVBTlRJVEFUSVZFLCB7fSwgZGVmYXVsdENvbmZpZywgdW5kZWZpbmVkLCAncnVsZScsIGZhbHNlLCAncGxvdF93aWR0aCcsIFtdKSxcbiAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbZGVmYXVsdENvbmZpZy5zY2FsZS5taW5TdHJva2VXaWR0aCwgZGVmYXVsdENvbmZpZy5zY2FsZS5tYXhTdHJva2VXaWR0aF0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ3BvaW50LCBzcXVhcmUsIGNpcmNsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBbbWluU2l6ZSwgbWF4U2l6ZV0nLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIFsncG9pbnQnLCAnc3F1YXJlJywgJ2NpcmNsZSddIGFzIE1hcmtbXSkge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgICAgICAgICBzY2FsZToge1xuICAgICAgICAgICAgICAgIG1pblNpemU6IDUsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogMjVcblxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2l6ZScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBjb25maWcsIHVuZGVmaW5lZCwgbSwgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgICAgICBtYWtlSW1wbGljaXQoWzUsIDI1XSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBbMCwgKG1pbkJhbmRTaXplLTIpXjJdIGlmIGJvdGggeCBhbmQgeSBhcmUgZGlzY3JldGUgYW5kIHNpemUgaXMgcXVhbnRpdGF0aXZlICh0aHVzIHVzZSB6ZXJvPXRydWUsIGJ5IGRlZmF1bHQpJywgKCkgPT4ge1xuICAgICAgICAgIGZvciAoY29uc3QgbSBvZiBbJ3BvaW50JywgJ3NxdWFyZScsICdjaXJjbGUnXSBhcyBNYXJrW10pIHtcbiAgICAgICAgICAgIGFzc2VydC5kZWVwRXF1YWwoXG4gICAgICAgICAgICAgIHBhcnNlUmFuZ2VGb3JDaGFubmVsKCdzaXplJywgJ2xpbmVhcicsIFFVQU5USVRBVElWRSwge30sIGRlZmF1bHRDb25maWcsIHRydWUsIG0sIGZhbHNlLCAncGxvdF93aWR0aCcsXG4gICAgICAgICAgICAgICAgWzExLCAxM10gLy8geHlSYW5nZVN0ZXBzXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbMCwgODFdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFs5LCAobWluQmFuZFNpemUtMileMl0gaWYgYm90aCB4IGFuZCB5IGFyZSBkaXNjcmV0ZSBhbmQgc2l6ZSBpcyBub3QgcXVhbnRpdGF0aXZlICh0aHVzIHVzZSB6ZXJvPWZhbHNlLCBieSBkZWZhdWx0KScsICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IG0gb2YgWydwb2ludCcsICdzcXVhcmUnLCAnY2lyY2xlJ10gYXMgTWFya1tdKSB7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2l6ZScsICdsaW5lYXInLCBRVUFOVElUQVRJVkUsIHt9LCBkZWZhdWx0Q29uZmlnLCBmYWxzZSwgbSwgZmFsc2UsICdwbG90X3dpZHRoJyxcbiAgICAgICAgICAgICAgICBbMTEsIDEzXSAvLyB4eVJhbmdlU3RlcHNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgbWFrZUltcGxpY2l0KFs5LCA4MV0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gWzksIChtaW5CYW5kU2l6ZS0yKV4yXSBpZiBib3RoIHggYW5kIHkgYXJlIGRpc2NyZXRlIGFuZCBzaXplIGlzIHF1YW50aXRhdGl2ZSBidXQgdXNlIHplcm89ZmFsc2UnLCAoKSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCBtIG9mIFsncG9pbnQnLCAnc3F1YXJlJywgJ2NpcmNsZSddIGFzIE1hcmtbXSkge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3NpemUnLCAnbGluZWFyJywgUVVBTlRJVEFUSVZFLCB7fSwgZGVmYXVsdENvbmZpZywgZmFsc2UsIG0sIGZhbHNlLCAncGxvdF93aWR0aCcsXG4gICAgICAgICAgICAgICAgWzExLCAxM10gLy8geHlSYW5nZVN0ZXBzXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbOSwgODFdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIFswLCAoeFJhbmdlU3RlcC0yKV4yXSBpZiB4IGlzIGRpc2NyZXRlIGFuZCB5IGlzIGNvbnRpbnVvdXMgYW5kIHNpemUgaXMgcXVhbnRpdGF0aXZlICh0aHVzIHVzZSB6ZXJvPXRydWUsIGJ5IGRlZmF1bHQpJywgKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBtIG9mIFsncG9pbnQnLCAnc3F1YXJlJywgJ2NpcmNsZSddIGFzIE1hcmtbXSkge1xuICAgICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgICAgcGFyc2VSYW5nZUZvckNoYW5uZWwoJ3NpemUnLCAnbGluZWFyJywgUVVBTlRJVEFUSVZFLCB7fSwgZGVmYXVsdENvbmZpZywgdHJ1ZSwgbSwgZmFsc2UsICdwbG90X3dpZHRoJyxcbiAgICAgICAgICAgICAgICBbMTFdIC8vIHh5UmFuZ2VTdGVwcyBvbmx5IGhhdmUgb25lIHZhbHVlXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG1ha2VJbXBsaWNpdChbMCwgODFdKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnc2hhcGUnLCBmdW5jdGlvbigpIHtcbiAgICAgIGl0KCdzaG91bGQgdXNlIGRlZmF1bHQgc3ltYm9sIHJhbmdlIGluIFZlZ2EgYXMgc2hhcGVcXCdzIHNjYWxlIHJhbmdlLicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBwYXJzZVJhbmdlRm9yQ2hhbm5lbCgnc2hhcGUnLCAnb3JkaW5hbCcsIFFVQU5USVRBVElWRSwge30sIGRlZmF1bHRDb25maWcsIHVuZGVmaW5lZCwgJ3BvaW50JywgZmFsc2UsICdwbG90X3dpZHRoJywgW10pLFxuICAgICAgICAgIG1ha2VJbXBsaWNpdCgnc3ltYm9sJylcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/scale/type.test.d.ts b/build/test/compile/scale/type.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/scale/type.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/scale/type.test.js b/build/test/compile/scale/type.test.js new file mode 100644 index 0000000000..3c2fd195a8 --- /dev/null +++ b/build/test/compile/scale/type.test.js @@ -0,0 +1,161 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../../src/channel"); +var type_1 = require("../../../src/compile/scale/type"); +var config_1 = require("../../../src/config"); +var log = tslib_1.__importStar(require("../../../src/log")); +var mark_1 = require("../../../src/mark"); +var scale_1 = require("../../../src/scale"); +var timeunit_1 = require("../../../src/timeunit"); +var type_2 = require("../../../src/type"); +var util = tslib_1.__importStar(require("../../../src/util")); +var defaultScaleConfig = config_1.defaultConfig.scale; +describe('compile/scale', function () { + describe('type()', function () { + it('should return null for channel without scale', function () { + chai_1.assert.deepEqual(type_1.scaleType(undefined, 'detail', { type: 'temporal', timeUnit: 'yearmonth' }, 'point', defaultScaleConfig), null); + }); + it('should show warning if users try to override the scale and use bin', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(type_1.scaleType('point', 'color', { type: 'quantitative', bin: true }, 'point', defaultScaleConfig), scale_1.ScaleType.BIN_ORDINAL); + chai_1.assert.equal(localLogger.warns[0], log.message.scaleTypeNotWorkWithFieldDef(scale_1.ScaleType.POINT, scale_1.ScaleType.BIN_ORDINAL)); + })); + describe('nominal/ordinal', function () { + describe('color', function () { + it('should return ordinal scale for nominal data by default.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'color', { type: 'nominal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + }); + it('should return ordinal scale for ordinal data.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'color', { type: 'nominal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + }); + }); + describe('discrete channel (shape)', function () { + it('should return ordinal for nominal field', function () { + chai_1.assert.deepEqual(type_1.scaleType(undefined, 'shape', { type: 'nominal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + }); + it('should return ordinal even if other type is specified', log.wrap(function (localLogger) { + [scale_1.ScaleType.LINEAR, scale_1.ScaleType.BAND, scale_1.ScaleType.POINT].forEach(function (badScaleType) { + chai_1.assert.deepEqual(type_1.scaleType(badScaleType, 'shape', { type: 'nominal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.scaleTypeNotWorkWithChannel('shape', badScaleType, 'ordinal')); + }); + })); + it('should return ordinal for an ordinal field and throw a warning.', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(type_1.scaleType(undefined, 'shape', { type: 'ordinal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + chai_1.assert.equal(localLogger.warns[0], log.message.discreteChannelCannotEncode('shape', 'ordinal')); + })); + }); + describe('continuous', function () { + it('should return point scale for ordinal X,Y for marks others than rect, rule, and bar', function () { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + if (util.contains(['bar', 'rule', 'rect'], mark)) { + return; + } + [type_2.ORDINAL, type_2.NOMINAL].forEach(function (t) { + [channel_1.X, channel_1.Y].forEach(function (channel) { + chai_1.assert.equal(type_1.scaleType(undefined, channel, { type: t }, mark, defaultScaleConfig), scale_1.ScaleType.POINT); + }); + }); + }); + }); + it('should return band scale for ordinal X,Y when mark is rect, rule, bar', function () { + [type_2.ORDINAL, type_2.NOMINAL].forEach(function (t) { + [channel_1.X, channel_1.Y].forEach(function (channel) { + ['bar', 'rule', 'rect'].forEach(function (mark) { + chai_1.assert.equal(type_1.scaleType(undefined, channel, { type: t }, 'rect', defaultScaleConfig), scale_1.ScaleType.BAND); + }); + }); + }); + }); + it('should return point scale for X,Y when mark is point', function () { + [type_2.ORDINAL, type_2.NOMINAL].forEach(function (t) { + [channel_1.X, channel_1.Y].forEach(function (channel) { + chai_1.assert.equal(type_1.scaleType(undefined, channel, { type: t }, 'point', defaultScaleConfig), scale_1.ScaleType.POINT); + }); + }); + }); + it('should return point scale for X,Y when mark is point when ORDINAL SCALE TYPE is specified and throw warning', log.wrap(function (localLogger) { + [type_2.ORDINAL, type_2.NOMINAL].forEach(function (t) { + [channel_1.X, channel_1.Y].forEach(function (channel) { + chai_1.assert.equal(type_1.scaleType('ordinal', channel, { type: t }, 'point', defaultScaleConfig), scale_1.ScaleType.POINT); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.scaleTypeNotWorkWithChannel(channel, 'ordinal', 'point')); + }); + }); + })); + it('should return point scale for ordinal/nominal fields for continuous channels other than x and y.', function () { + var OTHER_CONTINUOUS_CHANNELS = channel_1.SCALE_CHANNELS.filter(function (c) { return channel_1.rangeType(c) === 'continuous' && !util.contains([channel_1.X, channel_1.Y], c); }); + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + [type_2.ORDINAL, type_2.NOMINAL].forEach(function (t) { + OTHER_CONTINUOUS_CHANNELS.forEach(function (channel) { + chai_1.assert.equal(type_1.scaleType(undefined, channel, { type: t }, mark, defaultScaleConfig), scale_1.ScaleType.POINT, channel + ", " + mark + ", " + t + " " + type_1.scaleType(undefined, channel, { type: t }, mark, defaultScaleConfig)); + }); + }); + }); + }); + }); + }); + describe('temporal', function () { + it('should return sequential scale for temporal color field by default.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'color', { type: 'temporal' }, 'point', defaultScaleConfig), scale_1.ScaleType.SEQUENTIAL); + }); + it('should return ordinal for temporal field and throw a warning.', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(type_1.scaleType(undefined, 'shape', { type: 'temporal', timeUnit: 'yearmonth' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + chai_1.assert.equal(localLogger.warns[0], log.message.discreteChannelCannotEncode('shape', 'temporal')); + })); + it('should return time for all time units.', function () { + for (var _i = 0, TIMEUNITS_1 = timeunit_1.TIMEUNITS; _i < TIMEUNITS_1.length; _i++) { + var timeUnit = TIMEUNITS_1[_i]; + chai_1.assert.deepEqual(type_1.scaleType(undefined, channel_1.Y, { type: 'temporal', timeUnit: timeUnit }, 'point', defaultScaleConfig), scale_1.ScaleType.TIME); + } + }); + }); + describe('quantitative', function () { + it('should return sequential scale for quantitative color field by default.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'color', { type: 'quantitative' }, 'point', defaultScaleConfig), scale_1.ScaleType.SEQUENTIAL); + }); + it('should return ordinal bin scale for quantitative color field with binning.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'color', { type: 'quantitative', bin: true }, 'point', defaultScaleConfig), scale_1.ScaleType.BIN_ORDINAL); + }); + it('should return ordinal for encoding quantitative field with a discrete channel and throw a warning.', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(type_1.scaleType(undefined, 'shape', { type: 'quantitative' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + chai_1.assert.equal(localLogger.warns[0], log.message.discreteChannelCannotEncode('shape', 'quantitative')); + })); + it('should return linear scale for quantitative by default.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'x', { type: 'quantitative' }, 'point', defaultScaleConfig), scale_1.ScaleType.LINEAR); + }); + it('should return bin linear scale for quantitative by default.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'opacity', { type: 'quantitative', bin: true }, 'point', defaultScaleConfig), scale_1.ScaleType.BIN_LINEAR); + }); + it('should return linear scale for quantitative x and y.', function () { + chai_1.assert.equal(type_1.scaleType(undefined, 'x', { type: 'quantitative', bin: true }, 'point', defaultScaleConfig), scale_1.ScaleType.LINEAR); + }); + }); + describe('dataTypeMatchScaleType()', function () { + it('should return specified value if datatype is ordinal or nominal and specified scale type is the ordinal or nominal', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.ORDINAL, 'shape', { type: 'ordinal' }, 'point', defaultScaleConfig), scale_1.ScaleType.ORDINAL); + }); + it('should return default scale type if data type is temporal but specified scale type is not time or utc', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.LINEAR, 'x', { type: 'temporal', timeUnit: 'year' }, 'point', defaultScaleConfig), scale_1.ScaleType.TIME); + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.LINEAR, 'color', { type: 'temporal', timeUnit: 'year' }, 'point', defaultScaleConfig), scale_1.ScaleType.SEQUENTIAL); + }); + it('should return time if data type is temporal but specified scale type is discrete', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.POINT, 'x', { type: 'temporal', timeUnit: 'year' }, 'point', defaultScaleConfig), scale_1.ScaleType.TIME); + }); + it('should return default scale type if data type is temporal but specified scale type is time or utc or any discrete type', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.LINEAR, 'x', { type: 'temporal', timeUnit: 'year' }, 'point', defaultScaleConfig), scale_1.ScaleType.TIME); + }); + it('should return default scale type if data type is quantative but scale type do not support quantative', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.TIME, 'color', { type: 'quantitative' }, 'point', defaultScaleConfig), scale_1.ScaleType.SEQUENTIAL); + }); + it('should return default scale type if data type is quantative and scale type supports quantative', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.TIME, 'x', { type: 'quantitative' }, 'point', defaultScaleConfig), scale_1.ScaleType.LINEAR); + }); + it('should return default scale type if data type is quantative and scale type supports quantative', function () { + chai_1.assert.equal(type_1.scaleType(scale_1.ScaleType.TIME, 'x', { type: 'temporal' }, 'point', defaultScaleConfig), scale_1.ScaleType.TIME); + }); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL3NjYWxlL3R5cGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsZ0RBQXFFO0FBQ3JFLHdEQUEwRDtBQUMxRCw4Q0FBa0Q7QUFDbEQsNERBQXdDO0FBQ3hDLDBDQUFrRDtBQUNsRCw0Q0FBNkM7QUFDN0Msa0RBQWdEO0FBQ2hELDBDQUFtRDtBQUNuRCw4REFBMEM7QUFFMUMsSUFBTSxrQkFBa0IsR0FBRyxzQkFBYSxDQUFDLEtBQUssQ0FBQztBQUUvQyxRQUFRLENBQUMsZUFBZSxFQUFFO0lBQ3hCLFFBQVEsQ0FBQyxRQUFRLEVBQUU7UUFDakIsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELGFBQU0sQ0FBQyxTQUFTLENBQ2QsZ0JBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFDLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixDQUFDLEVBQ3RHLElBQUksQ0FDTCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7WUFDNUYsYUFBTSxDQUFDLFNBQVMsQ0FDZCxnQkFBUyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLENBQUMsRUFDM0YsaUJBQVMsQ0FBQyxXQUFXLENBQ3RCLENBQUM7WUFDRixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxpQkFBUyxDQUFDLEtBQUssRUFBRSxpQkFBUyxDQUFD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Q0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxFQUMvRSxpQkFBUyxDQUFDLElBQUksQ0FDZixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge3JhbmdlVHlwZSwgU0NBTEVfQ0hBTk5FTFMsIFgsIFl9IGZyb20gJy4uLy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7c2NhbGVUeXBlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS90eXBlJztcbmltcG9ydCB7ZGVmYXVsdENvbmZpZ30gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge1BSSU1JVElWRV9NQVJLU30gZnJvbSAnLi4vLi4vLi4vc3JjL21hcmsnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uLy4uLy4uL3NyYy9zY2FsZSc7XG5pbXBvcnQge1RJTUVVTklUU30gZnJvbSAnLi4vLi4vLi4vc3JjL3RpbWV1bml0JztcbmltcG9ydCB7Tk9NSU5BTCwgT1JESU5BTH0gZnJvbSAnLi4vLi4vLi4vc3JjL3R5cGUnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi8uLi9zcmMvdXRpbCc7XG5cbmNvbnN0IGRlZmF1bHRTY2FsZUNvbmZpZyA9IGRlZmF1bHRDb25maWcuc2NhbGU7XG5cbmRlc2NyaWJlKCdjb21waWxlL3NjYWxlJywgKCkgPT4ge1xuICBkZXNjcmliZSgndHlwZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIG51bGwgZm9yIGNoYW5uZWwgd2l0aG91dCBzY2FsZScsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgc2NhbGVUeXBlKHVuZGVmaW5lZCwgJ2RldGFpbCcsIHt0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ3llYXJtb250aCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICBudWxsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzaG93IHdhcm5pbmcgaWYgdXNlcnMgdHJ5IHRvIG92ZXJyaWRlIHRoZSBzY2FsZSBhbmQgdXNlIGJpbicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgc2NhbGVUeXBlKCdwb2ludCcsICdjb2xvcicsIHt0eXBlOiAncXVhbnRpdGF0aXZlJywgYmluOiB0cnVlfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgU2NhbGVUeXBlLkJJTl9PUkRJTkFMXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5zY2FsZVR5cGVOb3RXb3JrV2l0aEZpZWxkRGVmKFNjYWxlVHlwZS5QT0lOVCwgU2NhbGVUeXBlLkJJTl9PUkRJTkFMKSk7XG4gICAgfSkpO1xuXG4gICAgZGVzY3JpYmUoJ25vbWluYWwvb3JkaW5hbCcsICgpID0+IHtcbiAgICAgIGRlc2NyaWJlKCdjb2xvcicsICgpID0+IHtcbiAgICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gb3JkaW5hbCBzY2FsZSBmb3Igbm9taW5hbCBkYXRhIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdjb2xvcicsIHt0eXBlOiAnbm9taW5hbCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIHNjYWxlIGZvciBvcmRpbmFsIGRhdGEuJywgKCkgPT4ge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdjb2xvcicsIHt0eXBlOiAnbm9taW5hbCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBkZXNjcmliZSgnZGlzY3JldGUgY2hhbm5lbCAoc2hhcGUpJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIGZvciBub21pbmFsIGZpZWxkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdzaGFwZScsIHt0eXBlOiAnbm9taW5hbCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIGV2ZW4gaWYgb3RoZXIgdHlwZSBpcyBzcGVjaWZpZWQnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgICBbU2NhbGVUeXBlLkxJTkVBUiwgU2NhbGVUeXBlLkJBTkQsIFNjYWxlVHlwZS5QT0lOVF0uZm9yRWFjaCgoYmFkU2NhbGVUeXBlKSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgICAgICBzY2FsZVR5cGUoYmFkU2NhbGVUeXBlLCAnc2hhcGUnLCB7dHlwZTogJ25vbWluYWwnfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB3YXJucyA9IGxvY2FsTG9nZ2VyLndhcm5zO1xuICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKHdhcm5zW3dhcm5zLmxlbmd0aC0xXSwgbG9nLm1lc3NhZ2Uuc2NhbGVUeXBlTm90V29ya1dpdGhDaGFubmVsKCdzaGFwZScsIGJhZFNjYWxlVHlwZSwgJ29yZGluYWwnKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIGZvciBhbiBvcmRpbmFsIGZpZWxkIGFuZCB0aHJvdyBhIHdhcm5pbmcuJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdzaGFwZScsIHt0eXBlOiAnb3JkaW5hbCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKCdzaGFwZScsICdvcmRpbmFsJykpO1xuICAgICAgICB9KSk7XG4gICAgICB9KTtcblxuICAgICAgZGVzY3JpYmUoJ2NvbnRpbnVvdXMnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHBvaW50IHNjYWxlIGZvciBvcmRpbmFsIFgsWSBmb3IgbWFya3Mgb3RoZXJzIHRoYW4gcmVjdCwgcnVsZSwgYW5kIGJhcicsICgpID0+IHtcbiAgICAgICAgICBQUklNSVRJVkVfTUFSS1MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgICAgICAgaWYgKHV0aWwuY29udGFpbnMoWydiYXInLCAncnVsZScsICdyZWN0J10sIG1hcmspKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgW09SRElOQUwsIE5PTUlOQUxdLmZvckVhY2goKHQpID0+IHtcbiAgICAgICAgICAgICAgW1gsIFldLmZvckVhY2goKGNoYW5uZWwpID0+IHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgICAgICAgICBzY2FsZVR5cGUodW5kZWZpbmVkLCBjaGFubmVsLCB7dHlwZTogdH0sIG1hcmssIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgICAgICAgICBTY2FsZVR5cGUuUE9JTlRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBiYW5kIHNjYWxlIGZvciBvcmRpbmFsIFgsWSB3aGVuIG1hcmsgaXMgcmVjdCwgcnVsZSwgYmFyJywgKCkgPT4ge1xuICAgICAgICAgIFtPUkRJTkFMLCBOT01JTkFMXS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICBbWCwgWV0uZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgICBbJ2JhcicsICdydWxlJywgJ3JlY3QnXS5mb3JFYWNoKChtYXJrKSA9PiB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICAgICAgICAgICAgc2NhbGVUeXBlKHVuZGVmaW5lZCwgY2hhbm5lbCwge3R5cGU6IHR9LCAncmVjdCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgICAgICAgICBTY2FsZVR5cGUuQkFORFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHBvaW50IHNjYWxlIGZvciBYLFkgd2hlbiBtYXJrIGlzIHBvaW50JywgKCkgPT4ge1xuICAgICAgICAgIFtPUkRJTkFMLCBOT01JTkFMXS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICBbWCwgWV0uZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGVUeXBlKHVuZGVmaW5lZCwgY2hhbm5lbCwge3R5cGU6IHR9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLCBTY2FsZVR5cGUuUE9JTlQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHBvaW50IHNjYWxlIGZvciBYLFkgd2hlbiBtYXJrIGlzIHBvaW50IHdoZW4gT1JESU5BTCBTQ0FMRSBUWVBFIGlzIHNwZWNpZmllZCBhbmQgdGhyb3cgd2FybmluZycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICAgIFtPUkRJTkFMLCBOT01JTkFMXS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICBbWCwgWV0uZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgICBhc3NlcnQuZXF1YWwoc2NhbGVUeXBlKCdvcmRpbmFsJywgY2hhbm5lbCwge3R5cGU6IHR9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLCBTY2FsZVR5cGUuUE9JTlQpO1xuICAgICAgICAgICAgICBjb25zdCB3YXJucyA9IGxvY2FsTG9nZ2VyLndhcm5zO1xuICAgICAgICAgICAgICBhc3NlcnQuZXF1YWwod2FybnNbd2FybnMubGVuZ3RoLTFdLCBsb2cubWVzc2FnZS5zY2FsZVR5cGVOb3RXb3JrV2l0aENoYW5uZWwoY2hhbm5lbCwgJ29yZGluYWwnLCAncG9pbnQnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHBvaW50IHNjYWxlIGZvciBvcmRpbmFsL25vbWluYWwgZmllbGRzIGZvciBjb250aW51b3VzIGNoYW5uZWxzIG90aGVyIHRoYW4geCBhbmQgeS4nLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgT1RIRVJfQ09OVElOVU9VU19DSEFOTkVMUyA9IFNDQUxFX0NIQU5ORUxTLmZpbHRlcigoYykgPT4gcmFuZ2VUeXBlKGMpID09PSAnY29udGludW91cycgJiYgIXV0aWwuY29udGFpbnMoW1gsIFldLCBjKSk7XG4gICAgICAgICAgUFJJTUlUSVZFX01BUktTLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgICAgIFtPUkRJTkFMLCBOT01JTkFMXS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICAgIE9USEVSX0NPTlRJTlVPVVNfQ0hBTk5FTFMuZm9yRWFjaCgoY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsIGNoYW5uZWwsIHt0eXBlOiB0fSwgbWFyaywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICAgICAgICAgIFNjYWxlVHlwZS5QT0lOVCxcbiAgICAgICAgICAgICAgICAgIGAke2NoYW5uZWx9LCAke21hcmt9LCAke3R9IGAgKyBzY2FsZVR5cGUodW5kZWZpbmVkLCBjaGFubmVsLCB7dHlwZTogdH0sIG1hcmssIGRlZmF1bHRTY2FsZUNvbmZpZylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3RlbXBvcmFsJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gc2VxdWVudGlhbCBzY2FsZSBmb3IgdGVtcG9yYWwgY29sb3IgZmllbGQgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICBzY2FsZVR5cGUodW5kZWZpbmVkLCAnY29sb3InLCB7dHlwZTogJ3RlbXBvcmFsJ30sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLlNFUVVFTlRJQUxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIGZvciB0ZW1wb3JhbCBmaWVsZCBhbmQgdGhyb3cgYSB3YXJuaW5nLicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsKFxuICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdzaGFwZScsIHt0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ3llYXJtb250aCd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgIFNjYWxlVHlwZS5PUkRJTkFMXG4gICAgICAgICk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKCdzaGFwZScsICd0ZW1wb3JhbCcpKTtcbiAgICAgIH0pKTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gdGltZSBmb3IgYWxsIHRpbWUgdW5pdHMuJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAoY29uc3QgdGltZVVuaXQgb2YgVElNRVVOSVRTKSB7XG4gICAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsIFksIHt0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogdGltZVVuaXR9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgICAgU2NhbGVUeXBlLlRJTUVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBkZXNjcmliZSgncXVhbnRpdGF0aXZlJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gc2VxdWVudGlhbCBzY2FsZSBmb3IgcXVhbnRpdGF0aXZlIGNvbG9yIGZpZWxkIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKHVuZGVmaW5lZCwgJ2NvbG9yJywge3R5cGU6ICdxdWFudGl0YXRpdmUnfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuU0VRVUVOVElBTFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIG9yZGluYWwgYmluIHNjYWxlIGZvciBxdWFudGl0YXRpdmUgY29sb3IgZmllbGQgd2l0aCBiaW5uaW5nLicsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICAgIHNjYWxlVHlwZSh1bmRlZmluZWQsICdjb2xvcicsIHt0eXBlOiAncXVhbnRpdGF0aXZlJywgYmluOiB0cnVlfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuQklOX09SRElOQUxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBvcmRpbmFsIGZvciBlbmNvZGluZyBxdWFudGl0YXRpdmUgZmllbGQgd2l0aCBhIGRpc2NyZXRlIGNoYW5uZWwgYW5kIHRocm93IGEgd2FybmluZy4nLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbChcbiAgICAgICAgICBzY2FsZVR5cGUodW5kZWZpbmVkLCAnc2hhcGUnLCB7dHlwZTogJ3F1YW50aXRhdGl2ZSd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgIFNjYWxlVHlwZS5PUkRJTkFMXG4gICAgICAgICk7XG4gICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKCdzaGFwZScsICdxdWFudGl0YXRpdmUnKSk7XG4gICAgICB9KSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGxpbmVhciBzY2FsZSBmb3IgcXVhbnRpdGF0aXZlIGJ5IGRlZmF1bHQuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKHVuZGVmaW5lZCwgJ3gnLCB7dHlwZTogJ3F1YW50aXRhdGl2ZSd9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgIFNjYWxlVHlwZS5MSU5FQVJcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBiaW4gbGluZWFyIHNjYWxlIGZvciBxdWFudGl0YXRpdmUgYnkgZGVmYXVsdC4nLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICBzY2FsZVR5cGUodW5kZWZpbmVkLCAnb3BhY2l0eScsIHt0eXBlOiAncXVhbnRpdGF0aXZlJywgYmluOiB0cnVlfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuQklOX0xJTkVBUlxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGxpbmVhciBzY2FsZSBmb3IgcXVhbnRpdGF0aXZlIHggYW5kIHkuJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKHVuZGVmaW5lZCwgJ3gnLCB7dHlwZTogJ3F1YW50aXRhdGl2ZScsIGJpbjogdHJ1ZX0sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLkxJTkVBUlxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnZGF0YVR5cGVNYXRjaFNjYWxlVHlwZSgpJywgKCkgPT4ge1xuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gc3BlY2lmaWVkIHZhbHVlIGlmIGRhdGF0eXBlIGlzIG9yZGluYWwgb3Igbm9taW5hbCBhbmQgc3BlY2lmaWVkIHNjYWxlIHR5cGUgaXMgdGhlIG9yZGluYWwgb3Igbm9taW5hbCcsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICAgIHNjYWxlVHlwZShTY2FsZVR5cGUuT1JESU5BTCwgJ3NoYXBlJywge3R5cGU6ICdvcmRpbmFsJ30sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLk9SRElOQUxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBkZWZhdWx0IHNjYWxlIHR5cGUgaWYgZGF0YSB0eXBlIGlzIHRlbXBvcmFsIGJ1dCBzcGVjaWZpZWQgc2NhbGUgdHlwZSBpcyBub3QgdGltZSBvciB1dGMnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICBzY2FsZVR5cGUoU2NhbGVUeXBlLkxJTkVBUiwgJ3gnLCB7dHlwZTogJ3RlbXBvcmFsJywgdGltZVVuaXQ6ICd5ZWFyJ30sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLlRJTUVcbiAgICAgICAgKTtcblxuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKFNjYWxlVHlwZS5MSU5FQVIsICdjb2xvcicsIHt0eXBlOiAndGVtcG9yYWwnLCB0aW1lVW5pdDogJ3llYXInfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuU0VRVUVOVElBTFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRpbWUgaWYgZGF0YSB0eXBlIGlzIHRlbXBvcmFsIGJ1dCBzcGVjaWZpZWQgc2NhbGUgdHlwZSBpcyBkaXNjcmV0ZScsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICAgIHNjYWxlVHlwZShTY2FsZVR5cGUuUE9JTlQsICd4Jywge3R5cGU6ICd0ZW1wb3JhbCcsIHRpbWVVbml0OiAneWVhcid9LCAncG9pbnQnLCBkZWZhdWx0U2NhbGVDb25maWcpLFxuICAgICAgICAgIFNjYWxlVHlwZS5USU1FXG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ3Nob3VsZCByZXR1cm4gZGVmYXVsdCBzY2FsZSB0eXBlIGlmIGRhdGEgdHlwZSBpcyB0ZW1wb3JhbCBidXQgc3BlY2lmaWVkIHNjYWxlIHR5cGUgaXMgdGltZSBvciB1dGMgb3IgYW55IGRpc2NyZXRlIHR5cGUnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgICBzY2FsZVR5cGUoU2NhbGVUeXBlLkxJTkVBUiwgJ3gnLCB7dHlwZTogJ3RlbXBvcmFsJywgdGltZVVuaXQ6ICd5ZWFyJ30sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLlRJTUVcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICBpdCgnc2hvdWxkIHJldHVybiBkZWZhdWx0IHNjYWxlIHR5cGUgaWYgZGF0YSB0eXBlIGlzIHF1YW50YXRpdmUgYnV0IHNjYWxlIHR5cGUgZG8gbm90IHN1cHBvcnQgcXVhbnRhdGl2ZScsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICAgIHNjYWxlVHlwZShTY2FsZVR5cGUuVElNRSwgJ2NvbG9yJywge3R5cGU6ICdxdWFudGl0YXRpdmUnfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuU0VRVUVOVElBTFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgc2NhbGUgdHlwZSBpZiBkYXRhIHR5cGUgaXMgcXVhbnRhdGl2ZSBhbmQgc2NhbGUgdHlwZSBzdXBwb3J0cyBxdWFudGF0aXZlJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKFNjYWxlVHlwZS5USU1FLCAneCcsIHt0eXBlOiAncXVhbnRpdGF0aXZlJ30sICdwb2ludCcsIGRlZmF1bHRTY2FsZUNvbmZpZyksXG4gICAgICAgICAgU2NhbGVUeXBlLkxJTkVBUlxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGRlZmF1bHQgc2NhbGUgdHlwZSBpZiBkYXRhIHR5cGUgaXMgcXVhbnRhdGl2ZSBhbmQgc2NhbGUgdHlwZSBzdXBwb3J0cyBxdWFudGF0aXZlJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgICAgc2NhbGVUeXBlKFNjYWxlVHlwZS5USU1FLCAneCcsIHt0eXBlOiAndGVtcG9yYWwnfSwgJ3BvaW50JywgZGVmYXVsdFNjYWxlQ29uZmlnKSxcbiAgICAgICAgICBTY2FsZVR5cGUuVElNRVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/facets.test.d.ts b/build/test/compile/selection/facets.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/facets.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/facets.test.js b/build/test/compile/selection/facets.test.js new file mode 100644 index 0000000000..7b8b9d8832 --- /dev/null +++ b/build/test/compile/selection/facets.test.js @@ -0,0 +1,52 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../util"); +describe('Faceted Selections', function () { + var model = util_1.parseModel({ + "data": { "url": "data/anscombe.json" }, + "facet": { + "column": { "field": "Series", "type": "nominal" }, + "row": { "field": "X", "type": "nominal", "bin": true }, + }, + "spec": { + "layer": [{ + "mark": "rule", + "encoding": { "y": { "value": 10 } } + }, { + "selection": { + "one": { "type": "single" }, + "twp": { "type": "multi" }, + "three": { "type": "interval" } + }, + "mark": "rule", + "encoding": { + "x": { "value": 10 } + } + }] + } + }); + model.parse(); + var unit = model.children[0].children[1]; + it('should assemble a facet signal', function () { + chai_1.assert.includeDeepMembers(selection.assembleUnitSelectionSignals(unit, []), [ + { + "name": "facet", + "value": {}, + "on": [ + { + "events": [{ "source": "scope", "type": "mousemove" }], + "update": "isTuple(facet) ? facet : group(\"cell\").datum" + } + ] + } + ]); + }); + it('should name the unit with the facet keys', function () { + chai_1.assert.equal(selection.unitName(unit), "\"child_layer_1\" + '_' + (facet[\"bin_maxbins_6_X\"]) + '_' + (facet[\"Series\"])"); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL2ZhY2V0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMEZBQXNFO0FBRXRFLG1DQUFzQztBQUV0QyxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsSUFBTSxLQUFLLEdBQUcsaUJBQVUsQ0FBQztRQUN2QixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUM7UUFDckMsT0FBTyxFQUFFO1lBQ1AsUUFBUSxFQUFFLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO1lBQ2hELEtBQUssRUFBRSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1NBQ3REO1FBQ0QsTUFBTSxFQUFFO1lBQ04sT0FBTyxFQUFFLENBQUM7b0JBQ1IsTUFBTSxFQUFFLE1BQU07b0JBQ2QsVUFBVSxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQyxFQUFDO2lCQUNqQyxFQUFFO29CQUNELFdBQVcsRUFBRTt3QkFDWCxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDO3dCQUN6QixLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDO3dCQUN4QixPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDO3FCQUM5QjtvQkFDRCxNQUFNLEVBQUUsTUFBTTtvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBQztxQkFDbkI7aUJBQ0YsQ0FBQztTQUNIO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2QsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFjLENBQUM7SUFFeEQsRUFBRSxDQUFDLGdDQUFnQyxFQUFFO1FBQ25DLGFBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzFFO2dCQUNFLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE9BQU8sRUFBRSxFQUFFO2dCQUNYLElBQUksRUFBRTtvQkFDSjt3QkFDRSxRQUFRLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBQyxDQUFDO3dCQUNuRCxRQUFRLEVBQUUsZ0RBQWdEO3FCQUMzRDtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7UUFDN0MsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUNuQyxvRkFBOEUsQ0FBQyxDQUFDO0lBQ3BGLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSBxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0ICogYXMgc2VsZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3VuaXQnO1xuaW1wb3J0IHtwYXJzZU1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ0ZhY2V0ZWQgU2VsZWN0aW9ucycsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlTW9kZWwoe1xuICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2Fuc2NvbWJlLmpzb25cIn0sXG4gICAgXCJmYWNldFwiOiB7XG4gICAgICBcImNvbHVtblwiOiB7XCJmaWVsZFwiOiBcIlNlcmllc1wiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJYXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIiwgXCJiaW5cIjogdHJ1ZX0sXG4gICAgfSxcbiAgICBcInNwZWNcIjoge1xuICAgICAgXCJsYXllclwiOiBbe1xuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1wieVwiOiB7XCJ2YWx1ZVwiOiAxMH19XG4gICAgICB9LCB7XG4gICAgICAgIFwic2VsZWN0aW9uXCI6IHtcbiAgICAgICAgICBcIm9uZVwiOiB7XCJ0eXBlXCI6IFwic2luZ2xlXCJ9LFxuICAgICAgICAgIFwidHdwXCI6IHtcInR5cGVcIjogXCJtdWx0aVwifSxcbiAgICAgICAgICBcInRocmVlXCI6IHtcInR5cGVcIjogXCJpbnRlcnZhbFwifVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJ2YWx1ZVwiOiAxMH1cbiAgICAgICAgfVxuICAgICAgfV1cbiAgICB9XG4gIH0pO1xuXG4gIG1vZGVsLnBhcnNlKCk7XG4gIGNvbnN0IHVuaXQgPSBtb2RlbC5jaGlsZHJlblswXS5jaGlsZHJlblsxXSBhcyBVbml0TW9kZWw7XG5cbiAgaXQoJ3Nob3VsZCBhc3NlbWJsZSBhIGZhY2V0IHNpZ25hbCcsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHModW5pdCwgW10pLCBbXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcImZhY2V0XCIsXG4gICAgICAgIFwidmFsdWVcIjoge30sXG4gICAgICAgIFwib25cIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IFt7XCJzb3VyY2VcIjogXCJzY29wZVwiLFwidHlwZVwiOiBcIm1vdXNlbW92ZVwifV0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcImlzVHVwbGUoZmFjZXQpID8gZmFjZXQgOiBncm91cChcXFwiY2VsbFxcXCIpLmRhdHVtXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBuYW1lIHRoZSB1bml0IHdpdGggdGhlIGZhY2V0IGtleXMnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuZXF1YWwoc2VsZWN0aW9uLnVuaXROYW1lKHVuaXQpLFxuICAgICAgYFwiY2hpbGRfbGF5ZXJfMVwiICsgJ18nICsgKGZhY2V0W1wiYmluX21heGJpbnNfNl9YXCJdKSArICdfJyArIChmYWNldFtcIlNlcmllc1wiXSlgKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/selection/identifier.test.d.ts b/build/test/compile/selection/identifier.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/identifier.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/identifier.test.js b/build/test/compile/selection/identifier.test.js new file mode 100644 index 0000000000..02507efdd4 --- /dev/null +++ b/build/test/compile/selection/identifier.test.js @@ -0,0 +1,72 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/data/assemble"); +var optimize_1 = require("../../../src/compile/data/optimize"); +var util_1 = require("../../util"); +/* tslint:disable:quotemark */ +function getVgData(selection, x, y, mark, enc, transform) { + var model = util_1.parseModel({ + data: { url: 'data/cars.json' }, + transform: transform, + selection: selection, + mark: mark || 'circle', + encoding: tslib_1.__assign({ x: tslib_1.__assign({ field: 'Horsepower', type: 'quantitative' }, x), y: tslib_1.__assign({ field: 'Miles-per-Gallon', type: 'quantitative' }, y), color: { field: 'Origin', type: 'nominal' } }, enc) + }); + model.parse(); + optimize_1.optimizeDataflow(model.component.data); + return assemble_1.assembleRootData(model.component.data, {}); +} +describe('Identifier transform', function () { + it('is not unnecessarily added', function () { + function test(selDef) { + var data = getVgData(selDef); + for (var _i = 0, data_1 = data; _i < data_1.length; _i++) { + var d = data_1[_i]; + chai_1.assert.isNotTrue(d.transform && d.transform.some(function (t) { return t.type === 'identifier'; })); + } + } + test(); + for (var _i = 0, _a = ['single', 'multi']; _i < _a.length; _i++) { + var type = _a[_i]; + test({ pt: { type: type, encodings: ['x'] } }); + } + }); + it('is added for default point selections', function () { + for (var _i = 0, _a = ['single', 'multi']; _i < _a.length; _i++) { + var type = _a[_i]; + var url = getVgData({ pt: { type: type } }); + chai_1.assert.equal(url[0].transform[0].type, 'identifier'); + } + }); + it('is added immediately after aggregate transforms', function () { + function test(transform) { + var aggr = -1; + transform.some(function (t, i) { return (aggr = i, t.type === 'aggregate'); }); + chai_1.assert.isAtLeast(aggr, 0); + chai_1.assert.equal(transform[aggr + 1].type, 'identifier'); + } + for (var _i = 0, _a = ['single', 'multi']; _i < _a.length; _i++) { + var type = _a[_i]; + var sel = { pt: { type: type } }; + var data = getVgData(sel, { bin: true }, { aggregate: 'count' }); + test(data[0].transform); + data = getVgData(sel, { aggregate: 'sum' }, null, 'bar', { column: { field: 'Cylinders', type: 'ordinal' } }); + test(data[0].transform); + } + }); + it('is added before any user-specified transforms', function () { + var _loop_1 = function (type) { + var data = getVgData({ pt: { type: type } }, null, null, null, null, [{ calculate: 'datum.Horsepower * 2', as: 'foo' }]); + var calc = -1; + data[0].transform.some(function (t, i) { return (calc = i, t.type === 'formula' && t.as === 'foo'); }); + chai_1.assert.equal(data[0].transform[calc - 1].type, 'identifier'); + }; + for (var _i = 0, _a = ['single', 'multi']; _i < _a.length; _i++) { + var type = _a[_i]; + _loop_1(type); + } + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpZmllci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL3NlbGVjdGlvbi9pZGVudGlmaWVyLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTRCO0FBQzVCLCtEQUFvRTtBQUNwRSwrREFBb0U7QUFHcEUsbUNBQXNDO0FBRXRDLDhCQUE4QjtBQUU5QixtQkFBbUIsU0FBYyxFQUFFLENBQU8sRUFBRSxDQUFPLEVBQUUsSUFBVyxFQUFFLEdBQVMsRUFBRSxTQUFlO0lBQzFGLElBQU0sS0FBSyxHQUFHLGlCQUFVLENBQUM7UUFDdkIsSUFBSSxFQUFFLEVBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFDO1FBQzdCLFNBQVMsV0FBQTtRQUNULFNBQVMsV0FBQTtRQUNULElBQUksRUFBRSxJQUFJLElBQUksUUFBUTtRQUN0QixRQUFRLHFCQUNOLENBQUMscUJBQUcsS0FBSyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsY0FBYyxJQUFLLENBQUMsR0FDbkQsQ0FBQyxxQkFBRyxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLGNBQWMsSUFBSyxDQUFDLEdBQ3pELEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxJQUN0QyxHQUFHLENBQ1A7S0FDRixDQUFDLENBQUM7SUFDSCxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZCwyQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sMkJBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtJQUMvQixFQUFFLENBQUMsNEJBQTRCLEVBQUU7UUFDL0IsY0FBYyxNQUFZO1lBQ3hCLElBQU0sSUFBSSxHQUFH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SUFBSTtZQUNiLElBQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxFQUFDLEVBQUUsRUFBRSxFQUFDLElBQUksTUFBQSxFQUFDLEVBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQ3pELENBQUMsRUFBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztZQUNwRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNkLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFBLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFsRCxDQUFrRCxDQUFDLENBQUM7WUFDckYsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQU5ELEtBQW1CLFVBQW1CLEVBQW5CLE1BQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFuQixjQUFtQixFQUFuQixJQUFtQjtZQUFqQyxJQUFNLElBQUksU0FBQTtvQkFBSixJQUFJO1NBTWQ7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHthc3NlbWJsZVJvb3REYXRhfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Fzc2VtYmxlJztcbmltcG9ydCB7b3B0aW1pemVEYXRhZmxvd30gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9vcHRpbWl6ZSc7XG5pbXBvcnQge01hcmt9IGZyb20gJy4uLy4uLy4uL3NyYy9tYXJrJztcbmltcG9ydCB7VmdUcmFuc2Zvcm19IGZyb20gJy4uLy4uLy4uL3NyYy92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge3BhcnNlTW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuZnVuY3Rpb24gZ2V0VmdEYXRhKHNlbGVjdGlvbjogYW55LCB4PzogYW55LCB5PzogYW55LCBtYXJrPzogTWFyaywgZW5jPzogYW55LCB0cmFuc2Zvcm0/OiBhbnkpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsKHtcbiAgICBkYXRhOiB7dXJsOiAnZGF0YS9jYXJzLmpzb24nfSxcbiAgICB0cmFuc2Zvcm0sXG4gICAgc2VsZWN0aW9uLFxuICAgIG1hcms6IG1hcmsgfHwgJ2NpcmNsZScsXG4gICAgZW5jb2Rpbmc6IHtcbiAgICAgIHg6IHtmaWVsZDogJ0hvcnNlcG93ZXInLCB0eXBlOiAncXVhbnRpdGF0aXZlJywgLi4ueH0sXG4gICAgICB5OiB7ZmllbGQ6ICdNaWxlcy1wZXItR2FsbG9uJywgdHlwZTogJ3F1YW50aXRhdGl2ZScsIC4uLnl9LFxuICAgICAgY29sb3I6IHtmaWVsZDogJ09yaWdpbicsIHR5cGU6ICdub21pbmFsJ30sXG4gICAgICAuLi5lbmNcbiAgICB9XG4gIH0pO1xuICBtb2RlbC5wYXJzZSgpO1xuICBvcHRpbWl6ZURhdGFmbG93KG1vZGVsLmNvbXBvbmVudC5kYXRhKTtcbiAgcmV0dXJuIGFzc2VtYmxlUm9vdERhdGEobW9kZWwuY29tcG9uZW50LmRhdGEsIHt9KTtcbn1cblxuZGVzY3JpYmUoJ0lkZW50aWZpZXIgdHJhbnNmb3JtJywgZnVuY3Rpb24oKSB7XG4gIGl0KCdpcyBub3QgdW5uZWNlc3NhcmlseSBhZGRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIHRlc3Qoc2VsRGVmPzogYW55KSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0VmdEYXRhKHNlbERlZik7XG4gICAgICBmb3IgKGNvbnN0IGQgb2YgZGF0YSkge1xuICAgICAgICBhc3NlcnQuaXNOb3RUcnVlKGQudHJhbnNmb3JtICYmIGQudHJhbnNmb3JtLnNvbWUoKHQpID0+IHQudHlwZSA9PT0gJ2lkZW50aWZpZXInKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGVzdCgpO1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbJ3NpbmdsZScsICdtdWx0aSddKSB7XG4gICAgICB0ZXN0KHtwdDoge3R5cGUsIGVuY29kaW5nczogWyd4J119fSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnaXMgYWRkZWQgZm9yIGRlZmF1bHQgcG9pbnQgc2VsZWN0aW9ucycsIGZ1bmN0aW9uKCkge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbJ3NpbmdsZScsICdtdWx0aSddKSB7XG4gICAgICBjb25zdCB1cmwgPSBnZXRWZ0RhdGEoe3B0OiB7dHlwZX19KTtcbiAgICAgIGFzc2VydC5lcXVhbCh1cmxbMF0udHJhbnNmb3JtWzBdLnR5cGUsICdpZGVudGlmaWVyJyk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnaXMgYWRkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgYWdncmVnYXRlIHRyYW5zZm9ybXMnLCBmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiB0ZXN0KHRyYW5zZm9ybTogVmdUcmFuc2Zvcm1bXSkge1xuICAgICAgbGV0IGFnZ3IgPSAtMTtcbiAgICAgIHRyYW5zZm9ybS5zb21lKCh0LCBpKSA9PiAoYWdnciA9IGksIHQudHlwZSA9PT0gJ2FnZ3JlZ2F0ZScpKTtcbiAgICAgIGFzc2VydC5pc0F0TGVhc3QoYWdnciwgMCk7XG4gICAgICBhc3NlcnQuZXF1YWwodHJhbnNmb3JtW2FnZ3IgKyAxXS50eXBlLCAnaWRlbnRpZmllcicpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbJ3NpbmdsZScsICdtdWx0aSddKSB7XG4gICAgICBjb25zdCBzZWwgPSB7cHQ6IHt0eXBlfX07XG4gICAgICBsZXQgZGF0YSA9IGdldFZnRGF0YShzZWwsIHtiaW46IHRydWV9LCB7YWdncmVnYXRlOiAnY291bnQnfSk7XG4gICAgICB0ZXN0KGRhdGFbMF0udHJhbnNmb3JtKTtcblxuICAgICAgZGF0YSA9IGdldFZnRGF0YShzZWwsIHthZ2dyZWdhdGU6ICdzdW0nfSwgbnVsbCwgJ2JhcicsXG4gICAgICAgIHtjb2x1bW46IHtmaWVsZDogJ0N5bGluZGVycycsIHR5cGU6ICdvcmRpbmFsJ319KTtcbiAgICAgIHRlc3QoZGF0YVswXS50cmFuc2Zvcm0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2lzIGFkZGVkIGJlZm9yZSBhbnkgdXNlci1zcGVjaWZpZWQgdHJhbnNmb3JtcycsIGZ1bmN0aW9uKCkge1xuICAgIGZvciAoY29uc3QgdHlwZSBvZiBbJ3NpbmdsZScsICdtdWx0aSddKSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0VmdEYXRhKHtwdDoge3R5cGV9fSwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCxcbiAgICAgICAgW3tjYWxjdWxhdGU6ICdkYXR1bS5Ib3JzZXBvd2VyICogMicsIGFzOiAnZm9vJ31dKTtcbiAgICAgIGxldCBjYWxjID0gLTE7XG4gICAgICBkYXRhWzBdLnRyYW5zZm9ybS5zb21lKCh0LCBpKSA9PiAoY2FsYyA9IGksIHQudHlwZSA9PT0gJ2Zvcm11bGEnICYmIHQuYXMgPT09ICdmb28nKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0YVswXS50cmFuc2Zvcm1bY2FsYyAtIDFdLnR5cGUsICdpZGVudGlmaWVyJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/selection/inputs.test.d.ts b/build/test/compile/selection/inputs.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/inputs.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/inputs.test.js b/build/test/compile/selection/inputs.test.js new file mode 100644 index 0000000000..1500ca301f --- /dev/null +++ b/build/test/compile/selection/inputs.test.js @@ -0,0 +1,150 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var inputs_1 = tslib_1.__importDefault(require("../../../src/compile/selection/transforms/inputs")); +var util_1 = require("../../util"); +describe('Inputs Selection Transform', function () { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + var selCmpts = selection.parseUnitSelection(model, { + "one": { + "type": "single", + "bind": { "input": "range", "min": 0, "max": 10, "step": 1 } + }, + "two": { + "type": "single", + "fields": ["Cylinders", "Horsepower"], + "bind": { "input": "range", "min": 0, "max": 10, "step": 1 } + }, + "three": { + "type": "single", "nearest": true, + "fields": ["Cylinders", "Origin"], + "bind": { + "Horsepower": { "input": "range", "min": 0, "max": 10, "step": 1 }, + "Origin": { "input": "select", "options": ["Japan", "USA", "Europe"] } + } + }, + "four": { + "type": "single", "bind": null + }, + "six": { + "type": "interval", + "bind": "scales" + } + }); + it('identifies transform invocation', function () { + chai_1.assert.isNotFalse(inputs_1.default.has(selCmpts['one'])); + chai_1.assert.isNotFalse(inputs_1.default.has(selCmpts['two'])); + chai_1.assert.isNotFalse(inputs_1.default.has(selCmpts['three'])); + chai_1.assert.isNotTrue(inputs_1.default.has(selCmpts['four'])); + chai_1.assert.isNotTrue(inputs_1.default.has(selCmpts['six'])); + }); + it('adds widget binding for default projection', function () { + model.component.selection = { one: selCmpts['one'] }; + chai_1.assert.includeDeepMembers(selection.assembleUnitSelectionSignals(model, []), [ + { + "name": "one_tuple", + "update": "one__vgsid_ ? {fields: [\"_vgsid_\"], values: [one__vgsid_]} : null" + } + ]); + chai_1.assert.includeDeepMembers(selection.assembleTopLevelSignals(model, []), [ + { + "name": "one__vgsid_", + "value": "", + "on": [ + { + "events": [{ "source": "scope", "type": "click" }], + "update": "datum && item().mark.marktype !== 'group' ? datum[\"_vgsid_\"] : null" + } + ], + "bind": { "input": "range", "min": 0, "max": 10, "step": 1 } + } + ]); + }); + it('adds single widget binding for compound projection', function () { + model.component.selection = { two: selCmpts['two'] }; + chai_1.assert.includeDeepMembers(selection.assembleUnitSelectionSignals(model, []), [ + { + "name": "two_tuple", + "update": "two_Cylinders && two_Horsepower ? {fields: [\"Cylinders\", \"Horsepower\"], values: [two_Cylinders, two_Horsepower]} : null" + } + ]); + chai_1.assert.includeDeepMembers(selection.assembleTopLevelSignals(model, []), [ + { + "name": "two_Horsepower", + "value": "", + "on": [ + { + "events": [{ "source": "scope", "type": "click" }], + "update": "datum && item().mark.marktype !== 'group' ? datum[\"Horsepower\"] : null" + } + ], + "bind": { "input": "range", "min": 0, "max": 10, "step": 1 } + }, + { + "name": "two_Cylinders", + "value": "", + "on": [ + { + "events": [{ "source": "scope", "type": "click" }], + "update": "datum && item().mark.marktype !== 'group' ? datum[\"Cylinders\"] : null" + } + ], + "bind": { "input": "range", "min": 0, "max": 10, "step": 1 } + } + ]); + }); + it('adds projection-specific widget bindings', function () { + model.component.selection = { three: selCmpts['three'] }; + chai_1.assert.includeDeepMembers(selection.assembleUnitSelectionSignals(model, []), [ + { + "name": "three_tuple", + "update": "three_Cylinders && three_Origin ? {fields: [\"Cylinders\", \"Origin\"], values: [three_Cylinders, three_Origin]} : null" + } + ]); + chai_1.assert.includeDeepMembers(selection.assembleTopLevelSignals(model, []), [ + { + "name": "three_Origin", + "value": "", + "on": [ + { + "events": [{ "source": "scope", "type": "click" }], + "update": "datum && item().mark.marktype !== 'group' ? (item().isVoronoi ? datum.datum : datum)[\"Origin\"] : null" + } + ], + "bind": { + "input": "select", + "options": ["Japan", "USA", "Europe"] + } + }, + { + "name": "three_Cylinders", + "value": "", + "on": [ + { + "events": [{ "source": "scope", "type": "click" }], + "update": "datum && item().mark.marktype !== 'group' ? (item().isVoronoi ? datum.datum : datum)[\"Cylinders\"] : null" + } + ], + "bind": { + "Horsepower": { "input": "range", "min": 0, "max": 10, "step": 1 }, + "Origin": { + "input": "select", + "options": ["Japan", "USA", "Europe"] + } + } + } + ]); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL2lucHV0cy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMEZBQXNFO0FBQ3RFLG9HQUFzRTtBQUN0RSxtQ0FBMEM7QUFFMUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFO0lBQ3JDLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7UUFDM0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ25ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ3pELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFO1FBQ25ELEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUM7U0FDM0Q7UUFDRCxLQUFLLEVBQUU7WUFDTCxNQUFNLEVBQUUsUUFBUTtZQUNoQixRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFB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bnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCBpbnB1dHMgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvaW5wdXRzJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnSW5wdXRzIFNlbGVjdGlvbiBUcmFuc2Zvcm0nLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgXCJtYXJrXCI6IFwiY2lyY2xlXCIsXG4gICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgIH1cbiAgfSk7XG5cbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICBjb25zdCBzZWxDbXB0cyA9IHNlbGVjdGlvbi5wYXJzZVVuaXRTZWxlY3Rpb24obW9kZWwsIHtcbiAgICBcIm9uZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzaW5nbGVcIixcbiAgICAgIFwiYmluZFwiOiB7XCJpbnB1dFwiOiBcInJhbmdlXCIsIFwibWluXCI6IDAsIFwibWF4XCI6IDEwLCBcInN0ZXBcIjogMX1cbiAgICB9LFxuICAgIFwidHdvXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInNpbmdsZVwiLFxuICAgICAgXCJmaWVsZHNcIjogW1wiQ3lsaW5kZXJzXCIsIFwiSG9yc2Vwb3dlclwiXSxcbiAgICAgIFwiYmluZFwiOiB7XCJpbnB1dFwiOiBcInJhbmdlXCIsIFwibWluXCI6IDAsIFwibWF4XCI6IDEwLCBcInN0ZXBcIjogMX1cbiAgICB9LFxuICAgIFwidGhyZWVcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwic2luZ2xlXCIsIFwibmVhcmVzdFwiOiB0cnVlLFxuICAgICAgXCJmaWVsZHNcIjogW1wiQ3lsaW5kZXJzXCIsIFwiT3JpZ2luXCJdLFxuICAgICAgXCJiaW5kXCI6IHtcbiAgICAgICAgXCJIb3JzZXBvd2VyXCI6IHtcImlucHV0XCI6IFwicmFuZ2VcIiwgXCJtaW5cIjogMCwgXCJtYXhcIjogMTAsIFwic3RlcFwiOiAxfSxcbiAgICAgICAgXCJPcmlnaW5cIjoge1wiaW5wdXRcIjogXCJzZWxlY3RcIiwgXCJvcHRpb25zXCI6IFtcIkphcGFuXCIsIFwiVVNBXCIsIFwiRXVyb3BlXCJdfVxuICAgICAgfVxuICAgIH0sXG4gICAgXCJmb3VyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInNpbmdsZVwiLCBcImJpbmRcIjogbnVsbFxuICAgIH0sXG4gICAgXCJzaXhcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgIFwiYmluZFwiOiBcInNjYWxlc1wiXG4gICAgfVxuICB9KTtcblxuICBpdCgnaWRlbnRpZmllcyB0cmFuc2Zvcm0gaW52b2NhdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5pc05vdEZhbHNlKGlucHV0cy5oYXMoc2VsQ21wdHNbJ29uZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90RmFsc2UoaW5wdXRzLmhhcyhzZWxDbXB0c1sndHdvJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RGYWxzZShpbnB1dHMuaGFzKHNlbENtcHRzWyd0aHJlZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZShpbnB1dHMuaGFzKHNlbENtcHRzWydmb3VyJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RUcnVlKGlucHV0cy5oYXMoc2VsQ21wdHNbJ3NpeCddKSk7XG4gIH0pO1xuXG4gIGl0KCdhZGRzIHdpZGdldCBiaW5kaW5nIGZvciBkZWZhdWx0IHByb2plY3Rpb24nLCBmdW5jdGlvbigpIHtcbiAgICBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0ge29uZTogc2VsQ21wdHNbJ29uZSddfTtcbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSksIFtcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX3R1cGxlXCIsXG4gICAgICAgIFwidXBkYXRlXCI6IFwib25lX192Z3NpZF8gPyB7ZmllbGRzOiBbXFxcIl92Z3NpZF9cXFwiXSwgdmFsdWVzOiBbb25lX192Z3NpZF9dfSA6IG51bGxcIlxuICAgICAgfVxuICAgIF0pO1xuXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzZWxlY3Rpb24uYXNzZW1ibGVUb3BMZXZlbFNpZ25hbHMobW9kZWwsIFtdKSwgW1xuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJvbmVfX3Znc2lkX1wiLFxuICAgICAgICBcInZhbHVlXCI6IFwiXCIsXG4gICAgICAgIFwib25cIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IFt7XCJzb3VyY2VcIjogXCJzY29wZVwiLFwidHlwZVwiOiBcImNsaWNrXCJ9XSxcbiAgICAgICAgICAgIFwidXBkYXRlXCI6IFwiZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyBkYXR1bVtcXFwiX3Znc2lkX1xcXCJdIDogbnVsbFwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImJpbmRcIjoge1wiaW5wdXRcIjogXCJyYW5nZVwiLFwibWluXCI6IDAsXCJtYXhcIjogMTAsXCJzdGVwXCI6IDF9XG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdhZGRzIHNpbmdsZSB3aWRnZXQgYmluZGluZyBmb3IgY29tcG91bmQgcHJvamVjdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7dHdvOiBzZWxDbXB0c1sndHdvJ119O1xuICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKSwgW1xuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0d29fdHVwbGVcIixcbiAgICAgICAgXCJ1cGRhdGVcIjogXCJ0d29fQ3lsaW5kZXJzICYmIHR3b19Ib3JzZXBvd2VyID8ge2ZpZWxkczogW1xcXCJDeWxpbmRlcnNcXFwiLCBcXFwiSG9yc2Vwb3dlclxcXCJdLCB2YWx1ZXM6IFt0d29fQ3lsaW5kZXJzLCB0d29fSG9yc2Vwb3dlcl19IDogbnVsbFwiXG4gICAgICB9XG4gICAgXSk7XG5cbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNlbGVjdGlvbi5hc3NlbWJsZVRvcExldmVsU2lnbmFscyhtb2RlbCwgW10pLCBbXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19Ib3JzZXBvd2VyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJcIixcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjogW3tcInNvdXJjZVwiOiBcInNjb3BlXCIsXCJ0eXBlXCI6IFwiY2xpY2tcIn1dLFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJkYXR1bSAmJiBpdGVtKCkubWFyay5tYXJrdHlwZSAhPT0gJ2dyb3VwJyA/IGRhdHVtW1xcXCJIb3JzZXBvd2VyXFxcIl0gOiBudWxsXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwiYmluZFwiOiB7XCJpbnB1dFwiOiBcInJhbmdlXCIsXCJtaW5cIjogMCxcIm1heFwiOiAxMCxcInN0ZXBcIjogMX1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19DeWxpbmRlcnNcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIlwiLFxuICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiBbe1wic291cmNlXCI6IFwic2NvcGVcIixcInR5cGVcIjogXCJjbGlja1wifV0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcImRhdHVtICYmIGl0ZW0oKS5tYXJrLm1hcmt0eXBlICE9PSAnZ3JvdXAnID8gZGF0dW1bXFxcIkN5bGluZGVyc1xcXCJdIDogbnVsbFwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImJpbmRcIjoge1wiaW5wdXRcIjogXCJyYW5nZVwiLFwibWluXCI6IDAsXCJtYXhcIjogMTAsXCJzdGVwXCI6IDF9XG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdhZGRzIHByb2plY3Rpb24tc3BlY2lmaWMgd2lkZ2V0IGJpbmRpbmdzJywgZnVuY3Rpb24oKSB7XG4gICAgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHt0aHJlZTogc2VsQ21wdHNbJ3RocmVlJ119O1xuICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKSwgW1xuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0aHJlZV90dXBsZVwiLFxuICAgICAgICBcInVwZGF0ZVwiOiBcInRocmVlX0N5bGluZGVycyAmJiB0aHJlZV9PcmlnaW4gPyB7ZmllbGRzOiBbXFxcIkN5bGluZGVyc1xcXCIsIFxcXCJPcmlnaW5cXFwiXSwgdmFsdWVzOiBbdGhyZWVfQ3lsaW5kZXJzLCB0aHJlZV9PcmlnaW5dfSA6IG51bGxcIlxuICAgICAgfVxuICAgIF0pO1xuXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzZWxlY3Rpb24uYXNzZW1ibGVUb3BMZXZlbFNpZ25hbHMobW9kZWwsIFtdKSwgW1xuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0aHJlZV9PcmlnaW5cIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIlwiLFxuICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiBbe1wic291cmNlXCI6IFwic2NvcGVcIixcInR5cGVcIjogXCJjbGlja1wifV0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcImRhdHVtICYmIGl0ZW0oKS5tYXJrLm1hcmt0eXBlICE9PSAnZ3JvdXAnID8gKGl0ZW0oKS5pc1Zvcm9ub2kgPyBkYXR1bS5kYXR1bSA6IGRhdHVtKVtcXFwiT3JpZ2luXFxcIl0gOiBudWxsXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwiYmluZFwiOiB7XG4gICAgICAgICAgXCJpbnB1dFwiOiBcInNlbGVjdFwiLFxuICAgICAgICAgIFwib3B0aW9uc1wiOiBbXCJKYXBhblwiLFwiVVNBXCIsXCJFdXJvcGVcIl1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwidGhyZWVfQ3lsaW5kZXJzXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJcIixcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjogW3tcInNvdXJjZVwiOiBcInNjb3BlXCIsXCJ0eXBlXCI6IFwiY2xpY2tcIn1dLFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJkYXR1bSAmJiBpdGVtKCkubWFyay5tYXJrdHlwZSAhPT0gJ2dyb3VwJyA/IChpdGVtKCkuaXNWb3Jvbm9pID8gZGF0dW0uZGF0dW0gOiBkYXR1bSlbXFxcIkN5bGluZGVyc1xcXCJdIDogbnVsbFwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImJpbmRcIjoge1xuICAgICAgICAgIFwiSG9yc2Vwb3dlclwiOiB7XCJpbnB1dFwiOiBcInJhbmdlXCIsXCJtaW5cIjogMCxcIm1heFwiOiAxMCxcInN0ZXBcIjogMX0sXG4gICAgICAgICAgXCJPcmlnaW5cIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBcInNlbGVjdFwiLFxuICAgICAgICAgICAgXCJvcHRpb25zXCI6IFtcIkphcGFuXCIsXCJVU0FcIixcIkV1cm9wZVwiXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIF0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/selection/interval.test.d.ts b/build/test/compile/selection/interval.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/interval.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/interval.test.js b/build/test/compile/selection/interval.test.js new file mode 100644 index 0000000000..dd37bea4ff --- /dev/null +++ b/build/test/compile/selection/interval.test.js @@ -0,0 +1,451 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var vega_event_selector_1 = require("vega-event-selector"); +var interval_1 = tslib_1.__importDefault(require("../../../src/compile/selection/interval")); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../util"); +describe('Interval Selections', function () { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles-per-Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + var selCmpts = model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "interval", "encodings": ["x"], "translate": false, "zoom": false }, + "two": { + "type": "interval", + "encodings": ["y"], + "bind": "scales", + "translate": false, + "zoom": false + }, + "thr-ee": { + "type": "interval", + "on": "[mousedown, mouseup] > mousemove, [keydown, keyup] > keypress", + "translate": false, + "zoom": false, + "resolve": "intersect", + "mark": { + "fill": "red", + "fillOpacity": 0.75, + "stroke": "black", + "strokeWidth": 4, + "strokeDash": [10, 5], + "strokeDashOffset": 3, + "strokeOpacity": 0.25 + } + } + }); + describe('Tuple Signals', function () { + it('builds projection signals', function () { + var oneSg = interval_1.default.signals(model, selCmpts['one']); + chai_1.assert.includeDeepMembers(oneSg, [{ + "name": "one_x", + "value": [], + "on": [ + { + "events": vega_event_selector_1.selector('mousedown', 'scope')[0], + "update": "[x(unit), x(unit)]" + }, + { + "events": vega_event_selector_1.selector('[mousedown, window:mouseup] > window:mousemove!', 'scope')[0], + "update": "[one_x[0], clamp(x(unit), 0, width)]" + }, + { + "events": { "signal": "one_scale_trigger" }, + "update": "[scale(\"x\", one_Horsepower[0]), scale(\"x\", one_Horsepower[1])]" + } + ] + }, { + "name": "one_Horsepower", + "on": [{ + "events": { "signal": "one_x" }, + "update": "one_x[0] === one_x[1] ? null : invert(\"x\", one_x)" + }] + }, { + "name": "one_scale_trigger", + "update": "(!isArray(one_Horsepower) || (+invert(\"x\", one_x)[0] === +one_Horsepower[0] && +invert(\"x\", one_x)[1] === +one_Horsepower[1])) ? one_scale_trigger : {}" + }]); + var twoSg = interval_1.default.signals(model, selCmpts['two']); + chai_1.assert.includeDeepMembers(twoSg, [{ + "name": "two_Miles_per_Gallon", + "on": [] + }]); + var threeSg = interval_1.default.signals(model, selCmpts['thr_ee']); + chai_1.assert.includeDeepMembers(threeSg, [ + { + "name": "thr_ee_x", + "value": [], + "on": [ + { + "events": vega_event_selector_1.selector('mousedown', 'scope')[0], + "update": "[x(unit), x(unit)]" + }, + { + "events": vega_event_selector_1.selector('[mousedown, mouseup] > mousemove', 'scope')[0], + "update": "[thr_ee_x[0], clamp(x(unit), 0, width)]" + }, + { + "events": vega_event_selector_1.selector('keydown', 'scope')[0], + "update": "[x(unit), x(unit)]" + }, + { + "events": vega_event_selector_1.selector('[keydown, keyup] > keypress', 'scope')[0], + "update": "[thr_ee_x[0], clamp(x(unit), 0, width)]" + }, + { + "events": { "signal": "thr_ee_scale_trigger" }, + "update": "[scale(\"x\", thr_ee_Horsepower[0]), scale(\"x\", thr_ee_Horsepower[1])]" + } + ] + }, + { + "name": "thr_ee_Horsepower", + "on": [{ + "events": { "signal": "thr_ee_x" }, + "update": "thr_ee_x[0] === thr_ee_x[1] ? null : invert(\"x\", thr_ee_x)" + }] + }, + { + "name": "thr_ee_y", + "value": [], + "on": [ + { + "events": vega_event_selector_1.selector('mousedown', 'scope')[0], + "update": "[y(unit), y(unit)]" + }, + { + "events": vega_event_selector_1.selector('[mousedown, mouseup] > mousemove', 'scope')[0], + "update": "[thr_ee_y[0], clamp(y(unit), 0, height)]" + }, + { + "events": vega_event_selector_1.selector('keydown', 'scope')[0], + "update": "[y(unit), y(unit)]" + }, + { + "events": vega_event_selector_1.selector('[keydown, keyup] > keypress', 'scope')[0], + "update": "[thr_ee_y[0], clamp(y(unit), 0, height)]" + }, + { + "events": { "signal": "thr_ee_scale_trigger" }, + "update": "[scale(\"y\", thr_ee_Miles_per_Gallon[0]), scale(\"y\", thr_ee_Miles_per_Gallon[1])]" + } + ] + }, + { + "name": "thr_ee_Miles_per_Gallon", + "on": [{ + "events": { "signal": "thr_ee_y" }, + "update": "thr_ee_y[0] === thr_ee_y[1] ? null : invert(\"y\", thr_ee_y)" + }] + }, + { + "name": "thr_ee_scale_trigger", + "update": "(!isArray(thr_ee_Horsepower) || (+invert(\"x\", thr_ee_x)[0] === +thr_ee_Horsepower[0] && +invert(\"x\", thr_ee_x)[1] === +thr_ee_Horsepower[1])) && (!isArray(thr_ee_Miles_per_Gallon) || (+invert(\"y\", thr_ee_y)[0] === +thr_ee_Miles_per_Gallon[0] && +invert(\"y\", thr_ee_y)[1] === +thr_ee_Miles_per_Gallon[1])) ? thr_ee_scale_trigger : {}" + } + ]); + }); + it('builds trigger signals', function () { + var oneSg = interval_1.default.signals(model, selCmpts['one']); + chai_1.assert.includeDeepMembers(oneSg, [ + { + "name": "one_tuple", + "on": [{ + "events": [{ "signal": "one_Horsepower" }], + "update": "one_Horsepower ? {unit: \"\", intervals: [{encoding: \"x\", field: \"Horsepower\", extent: one_Horsepower}]} : null" + }] + } + ]); + var twoSg = interval_1.default.signals(model, selCmpts['two']); + chai_1.assert.includeDeepMembers(twoSg, [ + { + "name": "two_tuple", + "on": [{ + "events": [{ "signal": "two_Miles_per_Gallon" }], + "update": "two_Miles_per_Gallon ? {unit: \"\", intervals: [{encoding: \"y\", field: \"Miles-per-Gallon\", extent: two_Miles_per_Gallon}]} : null" + }] + } + ]); + var threeSg = interval_1.default.signals(model, selCmpts['thr_ee']); + chai_1.assert.includeDeepMembers(threeSg, [ + { + "name": "thr_ee_tuple", + "on": [{ + "events": [{ "signal": "thr_ee_Horsepower" }, { "signal": "thr_ee_Miles_per_Gallon" }], + "update": "thr_ee_Horsepower && thr_ee_Miles_per_Gallon ? {unit: \"\", intervals: [{encoding: \"x\", field: \"Horsepower\", extent: thr_ee_Horsepower}, {encoding: \"y\", field: \"Miles-per-Gallon\", extent: thr_ee_Miles_per_Gallon}]} : null" + }] + } + ]); + }); + it('namespaces signals when encoding/fields collide', function () { + var model2 = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "x", "type": "quantitative" }, + "y": { "field": "y", "type": "quantitative" } + } + }); + var selCmpts2 = model2.component.selection = selection.parseUnitSelection(model2, { + "one": { + "type": "interval", + "encodings": ["x"], + "translate": false, "zoom": false + } + }); + var sg = interval_1.default.signals(model, selCmpts2['one']); + chai_1.assert.equal(sg[0].name, 'one_x'); + chai_1.assert.equal(sg[1].name, 'one_x_1'); + }); + }); + it('builds modify signals', function () { + var oneExpr = interval_1.default.modifyExpr(model, selCmpts['one']); + chai_1.assert.equal(oneExpr, 'one_tuple, true'); + var twoExpr = interval_1.default.modifyExpr(model, selCmpts['two']); + chai_1.assert.equal(twoExpr, 'two_tuple, true'); + var threeExpr = interval_1.default.modifyExpr(model, selCmpts['thr_ee']); + chai_1.assert.equal(threeExpr, 'thr_ee_tuple, {unit: \"\"}'); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "one_modify", + "on": [ + { + "events": { "signal": "one_tuple" }, + "update": "modify(\"one_store\", " + oneExpr + ")" + } + ] + }, + { + "name": "two_modify", + "on": [ + { + "events": { "signal": "two_tuple" }, + "update": "modify(\"two_store\", " + twoExpr + ")" + } + ] + }, + { + "name": "thr_ee_modify", + "on": [ + { + "events": { "signal": "thr_ee_tuple" }, + "update": "modify(\"thr_ee_store\", " + threeExpr + ")" + } + ] + } + ]); + }); + it('builds brush mark', function () { + var marks = [{ hello: "world" }]; + chai_1.assert.sameDeepMembers(interval_1.default.marks(model, selCmpts['one'], marks), [ + { + "name": "one_brush_bg", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "#333" }, + "fillOpacity": { "value": 0.125 } + }, + "update": { + "x": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "signal": "one_x[0]" + }, + { + "value": 0 + } + ], + "y": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "value": 0 + }, + { + "value": 0 + } + ], + "x2": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "signal": "one_x[1]" + }, + { + "value": 0 + } + ], + "y2": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "field": { + "group": "height" + } + }, + { + "value": 0 + } + ] + } + } + }, + { "hello": "world" }, + { + "name": "one_brush", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "transparent" } + }, + "update": { + "stroke": [ + { + "test": "one_x[0] !== one_x[1]", + "value": "white" + }, + { + "value": null + } + ], + "x": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "signal": "one_x[0]" + }, + { + "value": 0 + } + ], + "y": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "value": 0 + }, + { + "value": 0 + } + ], + "x2": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "signal": "one_x[1]" + }, + { + "value": 0 + } + ], + "y2": [ + { + "test": "data(\"one_store\").length && data(\"one_store\")[0].unit === \"\"", + "field": { + "group": "height" + } + }, + { + "value": 0 + } + ] + } + } + } + ]); + // Scale-bound interval selections should not add a brush mark. + chai_1.assert.sameDeepMembers(interval_1.default.marks(model, selCmpts['two'], marks), marks); + chai_1.assert.sameDeepMembers(interval_1.default.marks(model, selCmpts['thr_ee'], marks), [ + { + "name": "thr_ee_brush_bg", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "red" }, + "fillOpacity": { "value": 0.75 } + }, + "update": { + "x": { + "signal": "thr_ee_x[0]" + }, + "y": { + "signal": "thr_ee_y[0]" + }, + "x2": { + "signal": "thr_ee_x[1]" + }, + "y2": { + "signal": "thr_ee_y[1]" + } + } + } + }, + { "hello": "world" }, + { + "name": "thr_ee_brush", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "transparent" } + }, + "update": { + "stroke": [ + { + "test": "thr_ee_x[0] !== thr_ee_x[1] && thr_ee_y[0] !== thr_ee_y[1]", + "value": "black" + }, + { "value": null } + ], + "strokeWidth": [ + { + "test": "thr_ee_x[0] !== thr_ee_x[1] && thr_ee_y[0] !== thr_ee_y[1]", + "value": 4 + }, + { "value": null } + ], + "strokeDash": [ + { + "test": "thr_ee_x[0] !== thr_ee_x[1] && thr_ee_y[0] !== thr_ee_y[1]", + "value": [10, 5] + }, + { "value": null } + ], + "strokeDashOffset": [ + { + "test": "thr_ee_x[0] !== thr_ee_x[1] && thr_ee_y[0] !== thr_ee_y[1]", + "value": 3 + }, + { "value": null } + ], + "strokeOpacity": [ + { + "test": "thr_ee_x[0] !== thr_ee_x[1] && thr_ee_y[0] !== thr_ee_y[1]", + "value": 0.25 + }, + { "value": null } + ], + "x": { + "signal": "thr_ee_x[0]" + }, + "y": { + "signal": "thr_ee_y[0]" + }, + "x2": { + "signal": "thr_ee_x[1]" + }, + "y2": { + "signal": "thr_ee_y[1]" + } + } + } + } + ]); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zZWxlY3Rpb24vaW50ZXJ2YWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLDJEQUE4RDtBQUU5RCw2RkFBK0Q7QUFDL0QsMEZBQXNFO0FBQ3RFLG1DQUEwQztBQUUxQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztRQUMzQixNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUU7WUFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7WUFDbkQsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7WUFDekQsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO1NBQ2hEO0tBQ0YsQ0FBQyxDQUFDO0lBQ0gsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRW5CLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7UUFDL0UsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUM7UUFDbEYsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLFVBQVU7WUFDbEIsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQ2xCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLE1BQU0sRUFBRSxLQUFLO1NBQ2Q7UUFDRCxRQUFRLEVBQUU7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TyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0QsYUFBYSxFQUFFOzRCQUNiO2dDQUNFLE1BQU0sRUFBRSw0REFBNEQ7Z0NBQ3BFLE9BQU8sRUFBRSxDQUFDOzZCQUNYOzRCQUNELEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0QsWUFBWSxFQUFFOzRCQUNaO2dDQUNFLE1BQU0sRUFBRSw0REFBNEQ7Z0NBQ3BFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7NkJBQ2pCOzRCQUNELEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0Qsa0JBQWtCLEVBQUU7NEJBQ2xCO2dDQUNFLE1BQU0sRUFBRSw0REFBNEQ7Z0NBQ3BFLE9BQU8sRUFBRSxDQUFDOzZCQUNYOzRCQUNELEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0QsZUFBZSxFQUFFOzRCQUNmO2dDQUNFLE1BQU0sRUFBRSw0REFBNEQ7Z0NBQ3BFLE9BQU8sRUFBRSxJQUFJOzZCQUNkOzRCQUNELEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0QsR0FBRyxFQUFFOzRCQUNILFFBQVEsRUFBRSxhQUFhO3lCQUN4Qjt3QkFDRCxHQUFHLEVBQUU7NEJBQ0gsUUFBUSxFQUFFLGFBQWE7eUJBQ3hCO3dCQUNELElBQUksRUFBRTs0QkFDSixRQUFRLEVBQUUsYUFBYTt5QkFDeEI7d0JBQ0QsSUFBSSxFQUFFOzRCQUNKLFFBQVEsRUFBRSxhQUFhO3lCQUN4QjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge3NlbGVjdG9yIGFzIHBhcnNlU2VsZWN0b3J9IGZyb20gJ3ZlZ2EtZXZlbnQtc2VsZWN0b3InO1xuXG5pbXBvcnQgaW50ZXJ2YWwgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL2ludGVydmFsJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnSW50ZXJ2YWwgU2VsZWN0aW9ucycsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlcy1wZXItR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgfVxuICB9KTtcbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuXG4gIGNvbnN0IHNlbENtcHRzID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wYXJzZVVuaXRTZWxlY3Rpb24obW9kZWwsIHtcbiAgICBcIm9uZVwiOiB7XCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIiwgXCJlbmNvZGluZ3NcIjogW1wieFwiXSwgXCJ0cmFuc2xhdGVcIjogZmFsc2UsIFwiem9vbVwiOiBmYWxzZX0sXG4gICAgXCJ0d29cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgIFwiZW5jb2RpbmdzXCI6IFtcInlcIl0sXG4gICAgICBcImJpbmRcIjogXCJzY2FsZXNcIixcbiAgICAgIFwidHJhbnNsYXRlXCI6IGZhbHNlLFxuICAgICAgXCJ6b29tXCI6IGZhbHNlXG4gICAgfSxcbiAgICBcInRoci1lZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJpbnRlcnZhbFwiLFxuICAgICAgXCJvblwiOiBcIlttb3VzZWRvd24sIG1vdXNldXBdID4gbW91c2Vtb3ZlLCBba2V5ZG93biwga2V5dXBdID4ga2V5cHJlc3NcIixcbiAgICAgIFwidHJhbnNsYXRlXCI6IGZhbHNlLFxuICAgICAgXCJ6b29tXCI6IGZhbHNlLFxuICAgICAgXCJyZXNvbHZlXCI6IFwiaW50ZXJzZWN0XCIsXG4gICAgICBcIm1hcmtcIjoge1xuICAgICAgICBcImZpbGxcIjogXCJyZWRcIixcbiAgICAgICAgXCJmaWxsT3BhY2l0eVwiOiAwLjc1LFxuICAgICAgICBcInN0cm9rZVwiOiBcImJsYWNrXCIsXG4gICAgICAgIFwic3Ryb2tlV2lkdGhcIjogNCxcbiAgICAgICAgXCJzdHJva2VEYXNoXCI6IFsxMCwgNV0sXG4gICAgICAgIFwic3Ryb2tlRGFzaE9mZnNldFwiOiAzLFxuICAgICAgICBcInN0cm9rZU9wYWNpdHlcIjogMC4yNVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1R1cGxlIFNpZ25hbHMnLCBmdW5jdGlvbigpIHtcbiAgICBpdCgnYnVpbGRzIHByb2plY3Rpb24gc2lnbmFscycsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3Qgb25lU2cgPSBpbnRlcnZhbC5zaWduYWxzKG1vZGVsLCBzZWxDbXB0c1snb25lJ10pO1xuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhvbmVTZywgW3tcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX3hcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBbXSxcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignbW91c2Vkb3duJywgJ3Njb3BlJylbMF0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcIlt4KHVuaXQpLCB4KHVuaXQpXVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiBwYXJzZVNlbGVjdG9yKCdbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIScsICdzY29wZScpWzBdLFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbb25lX3hbMF0sIGNsYW1wKHgodW5pdCksIDAsIHdpZHRoKV1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwib25lX3NjYWxlX3RyaWdnZXJcIn0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcIltzY2FsZShcXFwieFxcXCIsIG9uZV9Ib3JzZXBvd2VyWzBdKSwgc2NhbGUoXFxcInhcXFwiLCBvbmVfSG9yc2Vwb3dlclsxXSldXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sIHtcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX0hvcnNlcG93ZXJcIixcbiAgICAgICAgXCJvblwiOiBbe1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcIm9uZV94XCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwib25lX3hbMF0gPT09IG9uZV94WzFdID8gbnVsbCA6IGludmVydChcXFwieFxcXCIsIG9uZV94KVwiXG4gICAgICAgIH1dXG4gICAgICB9LCB7XG4gICAgICAgIFwibmFtZVwiOiBcIm9uZV9zY2FsZV90cmlnZ2VyXCIsXG4gICAgICAgIFwidXBkYXRlXCI6IFwiKCFpc0FycmF5KG9uZV9Ib3JzZXBvd2VyKSB8fCAoK2ludmVydChcXFwieFxcXCIsIG9uZV94KVswXSA9PT0gK29uZV9Ib3JzZXBvd2VyWzBdICYmICtpbnZlcnQoXFxcInhcXFwiLCBvbmVfeClbMV0gPT09ICtvbmVfSG9yc2Vwb3dlclsxXSkpID8gb25lX3NjYWxlX3RyaWdnZXIgOiB7fVwiXG4gICAgICB9XSk7XG5cbiAgICAgIGNvbnN0IHR3b1NnID0gaW50ZXJ2YWwuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ3R3byddKTtcbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnModHdvU2csIFt7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19NaWxlc19wZXJfR2FsbG9uXCIsXG4gICAgICAgIFwib25cIjogW11cbiAgICAgIH1dKTtcblxuICAgICAgY29uc3QgdGhyZWVTZyA9IGludGVydmFsLnNpZ25hbHMobW9kZWwsIHNlbENtcHRzWyd0aHJfZWUnXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHRocmVlU2csIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInRocl9lZV94XCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiBbXSxcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignbW91c2Vkb3duJywgJ3Njb3BlJylbMF0sXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwiW3godW5pdCksIHgodW5pdCldXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ1ttb3VzZWRvd24sIG1vdXNldXBdID4gbW91c2Vtb3ZlJywgJ3Njb3BlJylbMF0sXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwiW3Rocl9lZV94WzBdLCBjbGFtcCh4KHVuaXQpLCAwLCB3aWR0aCldXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ2tleWRvd24nLCAnc2NvcGUnKVswXSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbeCh1bml0KSwgeCh1bml0KV1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignW2tleWRvd24sIGtleXVwXSA+IGtleXByZXNzJywgJ3Njb3BlJylbMF0sXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwiW3Rocl9lZV94WzBdLCBjbGFtcCh4KHVuaXQpLCAwLCB3aWR0aCldXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInRocl9lZV9zY2FsZV90cmlnZ2VyXCJ9LFxuICAgICAgICAgICAgICBcInVwZGF0ZVwiOiBcIltzY2FsZShcXFwieFxcXCIsIHRocl9lZV9Ib3JzZXBvd2VyWzBdKSwgc2NhbGUoXFxcInhcXFwiLCB0aHJfZWVfSG9yc2Vwb3dlclsxXSldXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0aHJfZWVfSG9yc2Vwb3dlclwiLFxuICAgICAgICAgIFwib25cIjogW3tcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInRocl9lZV94XCJ9LFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ0aHJfZWVfeFswXSA9PT0gdGhyX2VlX3hbMV0gPyBudWxsIDogaW52ZXJ0KFxcXCJ4XFxcIiwgdGhyX2VlX3gpXCJcbiAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidGhyX2VlX3lcIixcbiAgICAgICAgICBcInZhbHVlXCI6IFtdLFxuICAgICAgICAgIFwib25cIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImV2ZW50c1wiOiBwYXJzZVNlbGVjdG9yKCdtb3VzZWRvd24nLCAnc2NvcGUnKVswXSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbeSh1bml0KSwgeSh1bml0KV1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignW21vdXNlZG93biwgbW91c2V1cF0gPiBtb3VzZW1vdmUnLCAnc2NvcGUnKVswXSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbdGhyX2VlX3lbMF0sIGNsYW1wKHkodW5pdCksIDAsIGhlaWdodCldXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ2tleWRvd24nLCAnc2NvcGUnKVswXSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbeSh1bml0KSwgeSh1bml0KV1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignW2tleWRvd24sIGtleXVwXSA+IGtleXByZXNzJywgJ3Njb3BlJylbMF0sXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwiW3Rocl9lZV95WzBdLCBjbGFtcCh5KHVuaXQpLCAwLCBoZWlnaHQpXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJ0aHJfZWVfc2NhbGVfdHJpZ2dlclwifSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJbc2NhbGUoXFxcInlcXFwiLCB0aHJfZWVfTWlsZXNfcGVyX0dhbGxvblswXSksIHNjYWxlKFxcXCJ5XFxcIiwgdGhyX2VlX01pbGVzX3Blcl9HYWxsb25bMV0pXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwidGhyX2VlX01pbGVzX3Blcl9HYWxsb25cIixcbiAgICAgICAgICBcIm9uXCI6IFt7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJ0aHJfZWVfeVwifSxcbiAgICAgICAgICAgIFwidXBkYXRlXCI6IFwidGhyX2VlX3lbMF0gPT09IHRocl9lZV95WzFdID8gbnVsbCA6IGludmVydChcXFwieVxcXCIsIHRocl9lZV95KVwiXG4gICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInRocl9lZV9zY2FsZV90cmlnZ2VyXCIsXG4gICAgICAgICAgXCJ1cGRhdGVcIjogXCIoIWlzQXJyYXkodGhyX2VlX0hvcnNlcG93ZXIpIHx8ICgraW52ZXJ0KFxcXCJ4XFxcIiwgdGhyX2VlX3gpWzBdID09PSArdGhyX2VlX0hvcnNlcG93ZXJbMF0gJiYgK2ludmVydChcXFwieFxcXCIsIHRocl9lZV94KVsxXSA9PT0gK3Rocl9lZV9Ib3JzZXBvd2VyWzFdKSkgJiYgKCFpc0FycmF5KHRocl9lZV9NaWxlc19wZXJfR2FsbG9uKSB8fCAoK2ludmVydChcXFwieVxcXCIsIHRocl9lZV95KVswXSA9PT0gK3Rocl9lZV9NaWxlc19wZXJfR2FsbG9uWzBdICYmICtpbnZlcnQoXFxcInlcXFwiLCB0aHJfZWVfeSlbMV0gPT09ICt0aHJfZWVfTWlsZXNfcGVyX0dhbGxvblsxXSkpID8gdGhyX2VlX3NjYWxlX3RyaWdnZXIgOiB7fVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyB0cmlnZ2VyIHNpZ25hbHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IG9uZVNnID0gaW50ZXJ2YWwuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ29uZSddKTtcbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMob25lU2csIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcIm9uZV90dXBsZVwiLFxuICAgICAgICAgIFwib25cIjogW3tcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IFt7XCJzaWduYWxcIjogXCJvbmVfSG9yc2Vwb3dlclwifV0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBcIm9uZV9Ib3JzZXBvd2VyID8ge3VuaXQ6IFxcXCJcXFwiLCBpbnRlcnZhbHM6IFt7ZW5jb2Rpbmc6IFxcXCJ4XFxcIiwgZmllbGQ6IFxcXCJIb3JzZXBvd2VyXFxcIiwgZXh0ZW50OiBvbmVfSG9yc2Vwb3dlcn1dfSA6IG51bGxcIlxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIF0pO1xuXG4gICAgICBjb25zdCB0d29TZyA9IGludGVydmFsLnNpZ25hbHMobW9kZWwsIHNlbENtcHRzWyd0d28nXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHR3b1NnLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJ0d29fdHVwbGVcIixcbiAgICAgICAgICBcIm9uXCI6IFt7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiBbe1wic2lnbmFsXCI6IFwidHdvX01pbGVzX3Blcl9HYWxsb25cIn1dLFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ0d29fTWlsZXNfcGVyX0dhbGxvbiA/IHt1bml0OiBcXFwiXFxcIiwgaW50ZXJ2YWxzOiBbe2VuY29kaW5nOiBcXFwieVxcXCIsIGZpZWxkOiBcXFwiTWlsZXMtcGVyLUdhbGxvblxcXCIsIGV4dGVudDogdHdvX01pbGVzX3Blcl9HYWxsb259XX0gOiBudWxsXCJcbiAgICAgICAgICB9XVxuICAgICAgICB9XG4gICAgICBdKTtcblxuICAgICAgY29uc3QgdGhyZWVTZyA9IGludGVydmFsLnNpZ25hbHMobW9kZWwsIHNlbENtcHRzWyd0aHJfZWUnXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHRocmVlU2csIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInRocl9lZV90dXBsZVwiLFxuICAgICAgICAgIFwib25cIjogW3tcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IFt7XCJzaWduYWxcIjogXCJ0aHJfZWVfSG9yc2Vwb3dlclwifSwge1wic2lnbmFsXCI6IFwidGhyX2VlX01pbGVzX3Blcl9HYWxsb25cIn1dLFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ0aHJfZWVfSG9yc2Vwb3dlciAmJiB0aHJfZWVfTWlsZXNfcGVyX0dhbGxvbiA/IHt1bml0OiBcXFwiXFxcIiwgaW50ZXJ2YWxzOiBbe2VuY29kaW5nOiBcXFwieFxcXCIsIGZpZWxkOiBcXFwiSG9yc2Vwb3dlclxcXCIsIGV4dGVudDogdGhyX2VlX0hvcnNlcG93ZXJ9LCB7ZW5jb2Rpbmc6IFxcXCJ5XFxcIiwgZmllbGQ6IFxcXCJNaWxlcy1wZXItR2FsbG9uXFxcIiwgZXh0ZW50OiB0aHJfZWVfTWlsZXNfcGVyX0dhbGxvbn1dfSA6IG51bGxcIlxuICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ25hbWVzcGFjZXMgc2lnbmFscyB3aGVuIGVuY29kaW5nL2ZpZWxkcyBjb2xsaWRlJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBtb2RlbDIgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ4XCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ5XCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc2VsQ21wdHMyID0gbW9kZWwyLmNvbXBvbmVudC5zZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyc2VVbml0U2VsZWN0aW9uKG1vZGVsMiwge1xuICAgICAgICBcIm9uZVwiOiB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgICAgICBcImVuY29kaW5nc1wiOiBbXCJ4XCJdLFxuICAgICAgICAgIFwidHJhbnNsYXRlXCI6IGZhbHNlLCBcInpvb21cIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHNnID0gaW50ZXJ2YWwuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHMyWydvbmUnXSk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2dbMF0ubmFtZSwgJ29uZV94Jyk7XG4gICAgICBhc3NlcnQuZXF1YWwoc2dbMV0ubmFtZSwgJ29uZV94XzEnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBtb2RpZnkgc2lnbmFscycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG9uZUV4cHIgPSBpbnRlcnZhbC5tb2RpZnlFeHByKG1vZGVsLCBzZWxDbXB0c1snb25lJ10pO1xuICAgIGFzc2VydC5lcXVhbChvbmVFeHByLCAnb25lX3R1cGxlLCB0cnVlJyk7XG5cbiAgICBjb25zdCB0d29FeHByID0gaW50ZXJ2YWwubW9kaWZ5RXhwcihtb2RlbCwgc2VsQ21wdHNbJ3R3byddKTtcbiAgICBhc3NlcnQuZXF1YWwodHdvRXhwciwgJ3R3b190dXBsZSwgdHJ1ZScpO1xuXG4gICAgY29uc3QgdGhyZWVFeHByID0gaW50ZXJ2YWwubW9kaWZ5RXhwcihtb2RlbCwgc2VsQ21wdHNbJ3Rocl9lZSddKTtcbiAgICBhc3NlcnQuZXF1YWwodGhyZWVFeHByLCAndGhyX2VlX3R1cGxlLCB7dW5pdDogXFxcIlxcXCJ9Jyk7XG5cbiAgICBjb25zdCBzaWduYWxzID0gc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX21vZGlmeVwiLFxuICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJvbmVfdHVwbGVcIn0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBgbW9kaWZ5KFxcXCJvbmVfc3RvcmVcXFwiLCAke29uZUV4cHJ9KWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19tb2RpZnlcIixcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwidHdvX3R1cGxlXCJ9LFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogYG1vZGlmeShcXFwidHdvX3N0b3JlXFxcIiwgJHt0d29FeHByfSlgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0aHJfZWVfbW9kaWZ5XCIsXG4gICAgICAgIFwib25cIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInRocl9lZV90dXBsZVwifSxcbiAgICAgICAgICAgIFwidXBkYXRlXCI6IGBtb2RpZnkoXFxcInRocl9lZV9zdG9yZVxcXCIsICR7dGhyZWVFeHByfSlgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgYnJ1c2ggbWFyaycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1hcmtzOiBhbnlbXSA9IFt7aGVsbG86IFwid29ybGRcIn1dO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoaW50ZXJ2YWwubWFya3MobW9kZWwsIHNlbENtcHRzWydvbmUnXSwgbWFya3MpLCBbXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcIm9uZV9icnVzaF9iZ1wiLFxuICAgICAgICBcInR5cGVcIjogXCJyZWN0XCIsXG4gICAgICAgIFwiY2xpcFwiOiB0cnVlLFxuICAgICAgICBcImVuY29kZVwiOiB7XG4gICAgICAgICAgXCJlbnRlclwiOiB7XG4gICAgICAgICAgICBcImZpbGxcIjoge1widmFsdWVcIjogXCIjMzMzXCJ9LFxuICAgICAgICAgICAgXCJmaWxsT3BhY2l0eVwiOiB7XCJ2YWx1ZVwiOiAwLjEyNX1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKS5sZW5ndGggJiYgZGF0YShcXFwib25lX3N0b3JlXFxcIilbMF0udW5pdCA9PT0gXFxcIlxcXCJcIixcbiAgICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcIm9uZV94WzBdXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJ5XCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcIngyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwib25lX3hbMV1cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInkyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjoge1xuICAgICAgICAgICAgICAgICAgXCJncm91cFwiOiBcImhlaWdodFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9LFxuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJvbmVfYnJ1c2hcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwicmVjdFwiLFxuICAgICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgICAgXCJlbmNvZGVcIjoge1xuICAgICAgICAgIFwiZW50ZXJcIjoge1xuICAgICAgICAgICAgXCJmaWxsXCI6IHtcInZhbHVlXCI6IFwidHJhbnNwYXJlbnRcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgIFwic3Ryb2tlXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcIm9uZV94WzBdICE9PSBvbmVfeFsxXVwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogXCJ3aGl0ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IG51bGxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwieFwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKS5sZW5ndGggJiYgZGF0YShcXFwib25lX3N0b3JlXFxcIilbMF0udW5pdCA9PT0gXFxcIlxcXCJcIixcbiAgICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcIm9uZV94WzBdXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJ5XCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcIngyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwib25lX3hbMV1cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInkyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcIm9uZV9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwiXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjoge1xuICAgICAgICAgICAgICAgICAgXCJncm91cFwiOiBcImhlaWdodFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdKTtcblxuICAgIC8vIFNjYWxlLWJvdW5kIGludGVydmFsIHNlbGVjdGlvbnMgc2hvdWxkIG5vdCBhZGQgYSBicnVzaCBtYXJrLlxuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoaW50ZXJ2YWwubWFya3MobW9kZWwsIHNlbENtcHRzWyd0d28nXSwgbWFya3MpLCBtYXJrcyk7XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGludGVydmFsLm1hcmtzKG1vZGVsLCBzZWxDbXB0c1sndGhyX2VlJ10sIG1hcmtzKSwgW1xuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0aHJfZWVfYnJ1c2hfYmdcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwicmVjdFwiLFxuICAgICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgICAgXCJlbmNvZGVcIjoge1xuICAgICAgICAgIFwiZW50ZXJcIjoge1xuICAgICAgICAgICAgXCJmaWxsXCI6IHtcInZhbHVlXCI6IFwicmVkXCJ9LFxuICAgICAgICAgICAgXCJmaWxsT3BhY2l0eVwiOiB7XCJ2YWx1ZVwiOiAwLjc1fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgXCJzaWduYWxcIjogXCJ0aHJfZWVfeFswXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgXCJzaWduYWxcIjogXCJ0aHJfZWVfeVswXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ4MlwiOiB7XG4gICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwidGhyX2VlX3hbMV1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcInRocl9lZV95WzFdXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7XCJoZWxsb1wiOiBcIndvcmxkXCJ9LFxuICAgICAge1xuICAgICAgICBcIm5hbWVcIjogXCJ0aHJfZWVfYnJ1c2hcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwicmVjdFwiLFxuICAgICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgICAgXCJlbmNvZGVcIjoge1xuICAgICAgICAgIFwiZW50ZXJcIjoge1xuICAgICAgICAgICAgXCJmaWxsXCI6IHtcInZhbHVlXCI6IFwidHJhbnNwYXJlbnRcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICAgIFwic3Ryb2tlXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcInRocl9lZV94WzBdICE9PSB0aHJfZWVfeFsxXSAmJiB0aHJfZWVfeVswXSAhPT0gdGhyX2VlX3lbMV1cIixcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IFwiYmxhY2tcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiBudWxsfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwic3Ryb2tlV2lkdGhcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwidGhyX2VlX3hbMF0gIT09IHRocl9lZV94WzFdICYmIHRocl9lZV95WzBdICE9PSB0aHJfZWVfeVsxXVwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogNFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiBudWxsfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwic3Ryb2tlRGFzaFwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJ0aHJfZWVfeFswXSAhPT0gdGhyX2VlX3hbMV0gJiYgdGhyX2VlX3lbMF0gIT09IHRocl9lZV95WzFdXCIsXG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBbMTAsIDVdXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcInZhbHVlXCI6IG51bGx9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJzdHJva2VEYXNoT2Zmc2V0XCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcInRocl9lZV94WzBdICE9PSB0aHJfZWVfeFsxXSAmJiB0aHJfZWVfeVswXSAhPT0gdGhyX2VlX3lbMV1cIixcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IDNcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1widmFsdWVcIjogbnVsbH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInN0cm9rZU9wYWNpdHlcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwidGhyX2VlX3hbMF0gIT09IHRocl9lZV94WzFdICYmIHRocl9lZV95WzBdICE9PSB0aHJfZWVfeVsxXVwiLFxuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMC4yNVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiBudWxsfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwidGhyX2VlX3hbMF1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwidGhyX2VlX3lbMF1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcInRocl9lZV94WzFdXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgXCJzaWduYWxcIjogXCJ0aHJfZWVfeVsxXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/layers.test.d.ts b/build/test/compile/selection/layers.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/layers.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/layers.test.js b/build/test/compile/selection/layers.test.js new file mode 100644 index 0000000000..402d682089 --- /dev/null +++ b/build/test/compile/selection/layers.test.js @@ -0,0 +1,220 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../util"); +describe('Layered Selections', function () { + var layers = util_1.parseLayerModel({ + layer: [{ + "selection": { + "brush": { "type": "interval" } + }, + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }, { + "selection": { + "grid": { "type": "interval", "bind": "scales" } + }, + "mark": "square", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }] + }); + layers.parse(); + it('should appropriately name the unit', function () { + var unit = layers.children[0]; + chai_1.assert.equal(selection.unitName(unit), '"layer_0"'); + }); + // Selections should augment layered marks together, rather than each + // mark individually. This ensures correct interleaving of brush marks + // (i.e., that the brush mark appears above all layers and thus can be + // moved around). + it('should pass through unit mark assembly', function () { + chai_1.assert.sameDeepMembers(layers.children[0].assembleMarks(), [{ + "name": "layer_0_marks", + "type": "symbol", + "style": ["circle"], + "from": { + "data": "layer_0_main" + }, + "clip": true, + "encode": { + "update": { + "x": { + "scale": "x", + "field": "Horsepower" + }, + "y": { + "scale": "y", + "field": "Miles_per_Gallon" + }, + "fill": { + "scale": "color", + "field": "Origin" + }, + "shape": { + "value": "circle" + }, + "opacity": { + "value": 0.7 + } + } + } + }]); + chai_1.assert.sameDeepMembers(layers.children[1].assembleMarks(), [{ + "name": "layer_1_marks", + "type": "symbol", + "style": ["square"], + "from": { + "data": "layer_1_main" + }, + "clip": true, + "encode": { + "update": { + "x": { + "scale": "x", + "field": "Horsepower" + }, + "y": { + "scale": "y", + "field": "Miles_per_Gallon" + }, + "fill": { + "scale": "color", + "field": "Origin" + }, + "shape": { + "value": "square" + }, + "opacity": { + "value": 0.7 + } + } + } + }]); + }); + it('should assemble selection marks across layers', function () { + var child0 = layers.children[0].assembleMarks()[0]; + var child1 = layers.children[1].assembleMarks()[0]; + chai_1.assert.sameDeepMembers(layers.assembleMarks(), [ + // Background brush mark for "brush" selection. + { + "name": "brush_brush_bg", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "#333" }, + "fillOpacity": { "value": 0.125 } + }, + "update": { + "x": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_x[0]" + }, + { + "value": 0 + } + ], + "y": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_y[0]" + }, + { + "value": 0 + } + ], + "x2": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_x[1]" + }, + { + "value": 0 + } + ], + "y2": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_y[1]" + }, + { + "value": 0 + } + ] + } + } + }, + tslib_1.__assign({}, child0, { clip: true }), + tslib_1.__assign({}, child1, { clip: true }), + // Foreground brush mark for "brush" selection. + { + "name": "brush_brush", + "type": "rect", + "clip": true, + "encode": { + "enter": { + "fill": { "value": "transparent" } + }, + "update": { + "stroke": [ + { + "test": "brush_x[0] !== brush_x[1] && brush_y[0] !== brush_y[1]", + "value": "white" + }, + { "value": null } + ], + "x": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_x[0]" + }, + { + "value": 0 + } + ], + "y": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_y[0]" + }, + { + "value": 0 + } + ], + "x2": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_x[1]" + }, + { + "value": 0 + } + ], + "y2": [ + { + "test": "data(\"brush_store\").length && data(\"brush_store\")[0].unit === \"layer_0\"", + "signal": "brush_y[1]" + }, + { + "value": 0 + } + ] + } + } + } + ]); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXJzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL2xheWVycy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMEZBQXNFO0FBRXRFLG1DQUEyQztBQUUzQyxRQUFRLENBQUMsb0JBQW9CLEVBQUU7SUFDN0IsSUFBTSxNQUFNLEdBQUcsc0JBQWUsQ0FBQztRQUM3QixLQUFLLEVBQUUsQ0FBQztnQkFDTixXQUFXLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQztpQkFDOUI7Z0JBQ0QsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ25ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO29CQUN6RCxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7aUJBQ2hEO2FBQ0YsRUFBRTtnQkFDRCxXQUFXLEVBQUU7b0JBQ1gsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDO2lCQUMvQztnQkFDRCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsVUFBVSxFQUFFO29CQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQztvQkFDbkQsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ3pELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztpQkFDaEQ7YUFD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RDtnQ0FDaEUsT0FBTyxFQUFFLE9BQU87NkJBQ2pCOzRCQUNELEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQzt5QkFDaEI7d0JBQ0QsR0FBRyxFQUFFOzRCQUNIO2dDQUNFLE1BQU0sRUFBRSwrRUFBK0U7Z0NBQ3ZGLFFBQVEsRUFBRSxZQUFZOzZCQUN2Qjs0QkFDRDtnQ0FDRSxPQUFPLEVBQUUsQ0FBQzs2QkFDWDt5QkFDRjt3QkFDRCxHQUFHLEVBQUU7NEJBQ0g7Z0NBQ0UsTUFBTSxFQUFFLCtFQUErRTtnQ0FDdkYsUUFBUSxFQUFFLFlBQVk7NkJBQ3ZCOzRCQUNEO2dDQUNFLE9BQU8sRUFBRSxDQUFDOzZCQUNYO3lCQUNGO3dCQUNELElBQUksRUFBRTs0QkFDSjtnQ0FDRSxNQUFNLEVBQUUsK0VBQStFO2dDQUN2RixRQUFRLEVBQUUsWUFBWTs2QkFDdkI7NEJBQ0Q7Z0NBQ0UsT0FBTyxFQUFFLENBQUM7NkJBQ1g7eUJBQ0Y7d0JBQ0QsSUFBSSxFQUFFOzRCQUNKO2dDQUNFLE1BQU0sRUFBRSwrRUFBK0U7Z0NBQ3ZGLFFBQVEsRUFBRSxZQUFZOzZCQUN2Qjs0QkFDRDtnQ0FDRSxPQUFPLEVBQUUsQ0FBQzs2QkFDWDt5QkFDRjtxQkFDRjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQgKiBhcyBzZWxlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvdW5pdCc7XG5pbXBvcnQge3BhcnNlTGF5ZXJNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdMYXllcmVkIFNlbGVjdGlvbnMnLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgbGF5ZXJzID0gcGFyc2VMYXllck1vZGVsKHtcbiAgICBsYXllcjogW3tcbiAgICAgIFwic2VsZWN0aW9uXCI6IHtcbiAgICAgICAgXCJicnVzaFwiOiB7XCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIn1cbiAgICAgIH0sXG4gICAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBcInNlbGVjdGlvblwiOiB7XG4gICAgICAgIFwiZ3JpZFwiOiB7XCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIiwgXCJiaW5kXCI6IFwic2NhbGVzXCJ9XG4gICAgICB9LFxuICAgICAgXCJtYXJrXCI6IFwic3F1YXJlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICB9XG4gICAgfV1cbiAgfSk7XG5cbiAgbGF5ZXJzLnBhcnNlKCk7XG5cbiAgaXQoJ3Nob3VsZCBhcHByb3ByaWF0ZWx5IG5hbWUgdGhlIHVuaXQnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1bml0ID0gbGF5ZXJzLmNoaWxkcmVuWzBdIGFzIFVuaXRNb2RlbDtcbiAgICBhc3NlcnQuZXF1YWwoc2VsZWN0aW9uLnVuaXROYW1lKHVuaXQpLCAnXCJsYXllcl8wXCInKTtcbiAgfSk7XG5cbiAgLy8gU2VsZWN0aW9ucyBzaG91bGQgYXVnbWVudCBsYXllcmVkIG1hcmtzIHRvZ2V0aGVyLCByYXRoZXIgdGhhbiBlYWNoXG4gIC8vIG1hcmsgaW5kaXZpZHVhbGx5LiBUaGlzIGVuc3VyZXMgY29ycmVjdCBpbnRlcmxlYXZpbmcgb2YgYnJ1c2ggbWFya3NcbiAgLy8gKGkuZS4sIHRoYXQgdGhlIGJydXNoIG1hcmsgYXBwZWFycyBhYm92ZSBhbGwgbGF5ZXJzIGFuZCB0aHVzIGNhbiBiZVxuICAvLyBtb3ZlZCBhcm91bmQpLlxuICBpdCgnc2hvdWxkIHBhc3MgdGhyb3VnaCB1bml0IG1hcmsgYXNzZW1ibHknLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGxheWVycy5jaGlsZHJlblswXS5hc3NlbWJsZU1hcmtzKCksIFt7XG4gICAgICBcIm5hbWVcIjogXCJsYXllcl8wX21hcmtzXCIsXG4gICAgICBcInR5cGVcIjogXCJzeW1ib2xcIixcbiAgICAgIFwic3R5bGVcIjogW1wiY2lyY2xlXCJdLFxuICAgICAgXCJmcm9tXCI6IHtcbiAgICAgICAgXCJkYXRhXCI6IFwibGF5ZXJfMF9tYWluXCJcbiAgICAgIH0sXG4gICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgIFwiZW5jb2RlXCI6IHtcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcInNjYWxlXCI6IFwieFwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgIFwic2NhbGVcIjogXCJ5XCIsXG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImZpbGxcIjoge1xuICAgICAgICAgICAgXCJzY2FsZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiT3JpZ2luXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2hhcGVcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiBcImNpcmNsZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIm9wYWNpdHlcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwLjdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGxheWVycy5jaGlsZHJlblsxXS5hc3NlbWJsZU1hcmtzKCksIFt7XG4gICAgICBcIm5hbWVcIjogXCJsYXllcl8xX21hcmtzXCIsXG4gICAgICBcInR5cGVcIjogXCJzeW1ib2xcIixcbiAgICAgIFwic3R5bGVcIjogW1wic3F1YXJlXCJdLFxuICAgICAgXCJmcm9tXCI6IHtcbiAgICAgICAgXCJkYXRhXCI6IFwibGF5ZXJfMV9tYWluXCJcbiAgICAgIH0sXG4gICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgIFwiZW5jb2RlXCI6IHtcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcInNjYWxlXCI6IFwieFwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgIFwic2NhbGVcIjogXCJ5XCIsXG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImZpbGxcIjoge1xuICAgICAgICAgICAgXCJzY2FsZVwiOiBcImNvbG9yXCIsXG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiT3JpZ2luXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2hhcGVcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiBcInNxdWFyZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIm9wYWNpdHlcIjoge1xuICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwLjdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYXNzZW1ibGUgc2VsZWN0aW9uIG1hcmtzIGFjcm9zcyBsYXllcnMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjaGlsZDAgPSBsYXllcnMuY2hpbGRyZW5bMF0uYXNzZW1ibGVNYXJrcygpWzBdO1xuICAgIGNvbnN0IGNoaWxkMSA9IGxheWVycy5jaGlsZHJlblsxXS5hc3NlbWJsZU1hcmtzKClbMF07XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGxheWVycy5hc3NlbWJsZU1hcmtzKCksIFtcbiAgICAgIC8vIEJhY2tncm91bmQgYnJ1c2ggbWFyayBmb3IgXCJicnVzaFwiIHNlbGVjdGlvbi5cbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwiYnJ1c2hfYnJ1c2hfYmdcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwicmVjdFwiLFxuICAgICAgICBcImNsaXBcIjogdHJ1ZSxcbiAgICAgICAgXCJlbmNvZGVcIjoge1xuICAgICAgICAgIFwiZW50ZXJcIjoge1xuICAgICAgICAgICAgXCJmaWxsXCI6IHtcInZhbHVlXCI6IFwiIzMzM1wifSxcbiAgICAgICAgICAgIFwiZmlsbE9wYWNpdHlcIjoge1widmFsdWVcIjogMC4xMjV9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcInhcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwiZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKS5sZW5ndGggJiYgZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwibGF5ZXJfMFxcXCJcIixcbiAgICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcImJydXNoX3hbMF1cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInlcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwiZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKS5sZW5ndGggJiYgZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwibGF5ZXJfMFxcXCJcIixcbiAgICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcImJydXNoX3lbMF1cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcIngyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcImJydXNoX3N0b3JlXFxcIikubGVuZ3RoICYmIGRhdGEoXFxcImJydXNoX3N0b3JlXFxcIilbMF0udW5pdCA9PT0gXFxcImxheWVyXzBcXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJzaWduYWxcIjogXCJicnVzaF94WzFdXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJ5MlwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpWzBdLnVuaXQgPT09IFxcXCJsYXllcl8wXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwiYnJ1c2hfeVsxXVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIExheWVyIG1hcmtzXG4gICAgICB7Li4uY2hpbGQwLCBjbGlwOiB0cnVlfSwgey4uLmNoaWxkMSwgY2xpcDogdHJ1ZX0sXG4gICAgICAvLyBGb3JlZ3JvdW5kIGJydXNoIG1hcmsgZm9yIFwiYnJ1c2hcIiBzZWxlY3Rpb24uXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcImJydXNoX2JydXNoXCIsXG4gICAgICAgIFwidHlwZVwiOiBcInJlY3RcIixcbiAgICAgICAgXCJjbGlwXCI6IHRydWUsXG4gICAgICAgIFwiZW5jb2RlXCI6IHtcbiAgICAgICAgICBcImVudGVyXCI6IHtcbiAgICAgICAgICAgIFwiZmlsbFwiOiB7XCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgICBcInN0cm9rZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJicnVzaF94WzBdICE9PSBicnVzaF94WzFdICYmIGJydXNoX3lbMF0gIT09IGJydXNoX3lbMV1cIixcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IFwid2hpdGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiBudWxsfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwieFwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpWzBdLnVuaXQgPT09IFxcXCJsYXllcl8wXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwiYnJ1c2hfeFswXVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwieVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInRlc3RcIjogXCJkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpLmxlbmd0aCAmJiBkYXRhKFxcXCJicnVzaF9zdG9yZVxcXCIpWzBdLnVuaXQgPT09IFxcXCJsYXllcl8wXFxcIlwiLFxuICAgICAgICAgICAgICAgIFwic2lnbmFsXCI6IFwiYnJ1c2hfeVswXVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInZhbHVlXCI6IDBcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwieDJcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ0ZXN0XCI6IFwiZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKS5sZW5ndGggJiYgZGF0YShcXFwiYnJ1c2hfc3RvcmVcXFwiKVswXS51bml0ID09PSBcXFwibGF5ZXJfMFxcXCJcIixcbiAgICAgICAgICAgICAgICBcInNpZ25hbFwiOiBcImJydXNoX3hbMV1cIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcInkyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidGVzdFwiOiBcImRhdGEoXFxcImJydXNoX3N0b3JlXFxcIikubGVuZ3RoICYmIGRhdGEoXFxcImJydXNoX3N0b3JlXFxcIilbMF0udW5pdCA9PT0gXFxcImxheWVyXzBcXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJzaWduYWxcIjogXCJicnVzaF95WzFdXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwidmFsdWVcIjogMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/multi.test.d.ts b/build/test/compile/selection/multi.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/multi.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/multi.test.js b/build/test/compile/selection/multi.test.js new file mode 100644 index 0000000000..b0e30dfff3 --- /dev/null +++ b/build/test/compile/selection/multi.test.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable quotemark */ +var chai_1 = require("chai"); +var multi_1 = tslib_1.__importDefault(require("../../../src/compile/selection/multi")); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../util"); +describe('Multi Selection', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative", "bin": true }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + var selCmpts = model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "multi" }, + "two": { + "type": "multi", "nearest": true, + "on": "mouseover", "toggle": "event.ctrlKey", "encodings": ["y", "color"] + } + }); + it('builds tuple signals', function () { + var oneSg = multi_1.default.signals(model, selCmpts['one']); + chai_1.assert.sameDeepMembers(oneSg, [{ + name: 'one_tuple', + value: {}, + on: [{ + events: selCmpts['one'].events, + update: "datum && item().mark.marktype !== 'group' ? {unit: \"\", encodings: [], fields: [\"_vgsid_\"], values: [datum[\"_vgsid_\"]]} : null", + force: true + }] + }]); + var twoSg = multi_1.default.signals(model, selCmpts['two']); + chai_1.assert.sameDeepMembers(twoSg, [{ + name: 'two_tuple', + value: {}, + on: [{ + events: selCmpts['two'].events, + update: "datum && item().mark.marktype !== 'group' ? {unit: \"\", encodings: [\"y\", \"color\"], fields: [\"Miles_per_Gallon\", \"Origin\"], values: [[(item().isVoronoi ? datum.datum : datum)[\"bin_maxbins_10_Miles_per_Gallon\"], (item().isVoronoi ? datum.datum : datum)[\"bin_maxbins_10_Miles_per_Gallon_end\"]], (item().isVoronoi ? datum.datum : datum)[\"Origin\"]], \"bin_Miles_per_Gallon\": 1} : null", + force: true + }] + }]); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, oneSg.concat(twoSg)); + }); + it('builds unit datasets', function () { + var data = []; + chai_1.assert.sameDeepMembers(selection.assembleUnitSelectionData(model, data), [ + { name: 'one_store' }, { name: 'two_store' } + ]); + }); + it('leaves marks alone', function () { + var marks = []; + model.component.selection = { one: selCmpts['one'] }; + chai_1.assert.equal(selection.assembleUnitSelectionMarks(model, marks), marks); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGkudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zZWxlY3Rpb24vbXVsdGkudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4QkFBOEI7QUFDOUIsNkJBQTRCO0FBRTVCLHVGQUF5RDtBQUN6RCwwRkFBc0U7QUFDdEUsbUNBQW1EO0FBRW5ELFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtJQUMxQixJQUFNLEtBQUssR0FBRyw4QkFBdUIsQ0FBQztRQUNwQyxNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUU7WUFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7WUFDbkQsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQztZQUN0RSxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7U0FDaEQ7S0FDRixDQUFDLENBQUM7SUFFSCxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFO1FBQy9FLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUM7UUFDeEIsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSTtZQUNoQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztTQUMxRTtLQUNGLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRTtRQUN6QixJQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxhQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QixJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsRUFBRSxFQUFFLENBQUM7d0JBQ0gsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNO3dCQUM5QixNQUFNLEVBQUUscUlBQXFJO3dCQUM3SSxLQUFLLEVBQUUsSUFBSTtxQkFDWixDQUFDO2FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxhQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM3QixJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsRUFBRSxFQUFFLENBQUM7d0JBQ0gsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNO3dCQUM5QixNQUFNLEVBQUUsNllBQTZZO3dCQUNyWixLQUFLLEVBQUUsSUFBSTtxQkFDWixDQUFDO2FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSixJQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsNEJBQTRCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGFBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHNCQUFzQixFQUFFO1FBQ3pCLElBQU0sSUFBSSxHQUFVLEVBQUUsQ0FBQztRQUN2QixhQUFNLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDdkUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDO1NBQ3pDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9CQUFvQixFQUFFO1FBQ3ZCLElBQU0sS0FBSyxHQUFVLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztRQUNuRCxhQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQgbXVsdGkgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL211bHRpJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWxXaXRoU2NhbGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnTXVsdGkgU2VsZWN0aW9uJywgZnVuY3Rpb24oKSB7XG4gIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWxXaXRoU2NhbGUoe1xuICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk1pbGVzX3Blcl9HYWxsb25cIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJiaW5cIjogdHJ1ZX0sXG4gICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHNlbENtcHRzID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wYXJzZVVuaXRTZWxlY3Rpb24obW9kZWwsIHtcbiAgICBcIm9uZVwiOiB7XCJ0eXBlXCI6IFwibXVsdGlcIn0sXG4gICAgXCJ0d29cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibXVsdGlcIiwgXCJuZWFyZXN0XCI6IHRydWUsXG4gICAgICBcIm9uXCI6IFwibW91c2VvdmVyXCIsIFwidG9nZ2xlXCI6IFwiZXZlbnQuY3RybEtleVwiLCBcImVuY29kaW5nc1wiOiBbXCJ5XCIsIFwiY29sb3JcIl1cbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgdHVwbGUgc2lnbmFscycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG9uZVNnID0gbXVsdGkuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ29uZSddKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKG9uZVNnLCBbe1xuICAgICAgbmFtZTogJ29uZV90dXBsZScsXG4gICAgICB2YWx1ZToge30sXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBzZWxDbXB0c1snb25lJ10uZXZlbnRzLFxuICAgICAgICB1cGRhdGU6IFwiZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyB7dW5pdDogXFxcIlxcXCIsIGVuY29kaW5nczogW10sIGZpZWxkczogW1xcXCJfdmdzaWRfXFxcIl0sIHZhbHVlczogW2RhdHVtW1xcXCJfdmdzaWRfXFxcIl1dfSA6IG51bGxcIixcbiAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgIH1dXG4gICAgfV0pO1xuXG4gICAgY29uc3QgdHdvU2cgPSBtdWx0aS5zaWduYWxzKG1vZGVsLCBzZWxDbXB0c1sndHdvJ10pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnModHdvU2csIFt7XG4gICAgICBuYW1lOiAndHdvX3R1cGxlJyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IHNlbENtcHRzWyd0d28nXS5ldmVudHMsXG4gICAgICAgIHVwZGF0ZTogXCJkYXR1bSAmJiBpdGVtKCkubWFyay5tYXJrdHlwZSAhPT0gJ2dyb3VwJyA/IHt1bml0OiBcXFwiXFxcIiwgZW5jb2RpbmdzOiBbXFxcInlcXFwiLCBcXFwiY29sb3JcXFwiXSwgZmllbGRzOiBbXFxcIk1pbGVzX3Blcl9HYWxsb25cXFwiLCBcXFwiT3JpZ2luXFxcIl0sIHZhbHVlczogW1soaXRlbSgpLmlzVm9yb25vaSA/IGRhdHVtLmRhdHVtIDogZGF0dW0pW1xcXCJiaW5fbWF4Ymluc18xMF9NaWxlc19wZXJfR2FsbG9uXFxcIl0sIChpdGVtKCkuaXNWb3Jvbm9pID8gZGF0dW0uZGF0dW0gOiBkYXR1bSlbXFxcImJpbl9tYXhiaW5zXzEwX01pbGVzX3Blcl9HYWxsb25fZW5kXFxcIl1dLCAoaXRlbSgpLmlzVm9yb25vaSA/IGRhdHVtLmRhdHVtIDogZGF0dW0pW1xcXCJPcmlnaW5cXFwiXV0sIFxcXCJiaW5fTWlsZXNfcGVyX0dhbGxvblxcXCI6IDF9IDogbnVsbFwiLFxuICAgICAgICBmb3JjZTogdHJ1ZVxuICAgICAgfV1cbiAgICB9XSk7XG5cbiAgICBjb25zdCBzaWduYWxzID0gc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIG9uZVNnLmNvbmNhdCh0d29TZykpO1xuICB9KTtcblxuICBpdCgnYnVpbGRzIHVuaXQgZGF0YXNldHMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBkYXRhOiBhbnlbXSA9IFtdO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvbkRhdGEobW9kZWwsIGRhdGEpLCBbXG4gICAgICB7bmFtZTogJ29uZV9zdG9yZSd9LCB7bmFtZTogJ3R3b19zdG9yZSd9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgbWFya3MgYWxvbmUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtYXJrczogYW55W10gPSBbXTtcbiAgICBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0ge29uZTogc2VsQ21wdHNbJ29uZSddfTtcbiAgICBhc3NlcnQuZXF1YWwoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvbk1hcmtzKG1vZGVsLCBtYXJrcyksIG1hcmtzKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/selection/nearest.test.d.ts b/build/test/compile/selection/nearest.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/nearest.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/nearest.test.js b/build/test/compile/selection/nearest.test.js new file mode 100644 index 0000000000..7a23bee738 --- /dev/null +++ b/build/test/compile/selection/nearest.test.js @@ -0,0 +1,100 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var nearest_1 = tslib_1.__importDefault(require("../../../src/compile/selection/transforms/nearest")); +var log = tslib_1.__importStar(require("../../../src/log")); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +function getModel(markType) { + var model = util_2.parseUnitModel({ + "mark": markType, + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + model.parseMarkGroup(); + model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "single", "nearest": true }, + "two": { "type": "multi", "nearest": true }, + "three": { "type": "interval" }, + "four": { "type": "single", "nearest": false }, + "five": { "type": "multi" }, + "six": { "type": "multi", "nearest": null }, + "seven": { "type": "single", "nearest": true, "encodings": ["x"] }, + "eight": { "type": "single", "nearest": true, "encodings": ["y"] }, + "nine": { "type": "single", "nearest": true, "encodings": ["color"] } + }); + return model; +} +function voronoiMark(x, y) { + return [ + { hello: "world" }, + { + "name": "voronoi", + "type": "path", + "from": { "data": "marks" }, + "encode": { + "enter": { + "fill": { "value": "transparent" }, + "strokeWidth": { "value": 0.35 }, + "stroke": { "value": "transparent" }, + "isVoronoi": { "value": true } + } + }, + "transform": [ + { + "type": "voronoi", + "x": x || { "expr": "datum.datum.x || 0" }, + "y": y || { "expr": "datum.datum.y || 0" }, + "size": [{ "signal": "width" }, { "signal": "height" }] + } + ] + } + ]; +} +describe('Nearest Selection Transform', function () { + it('identifies transform invocation', function () { + var selCmpts = getModel('circle').component.selection; + chai_1.assert.isNotFalse(nearest_1.default.has(selCmpts['one'])); + chai_1.assert.isNotFalse(nearest_1.default.has(selCmpts['two'])); + chai_1.assert.isNotTrue(nearest_1.default.has(selCmpts['three'])); + chai_1.assert.isNotTrue(nearest_1.default.has(selCmpts['four'])); + chai_1.assert.isNotTrue(nearest_1.default.has(selCmpts['five'])); + chai_1.assert.isNotTrue(nearest_1.default.has(selCmpts['six'])); + }); + it('adds voronoi for non-path marks', function () { + var model = getModel('circle'); + var selCmpts = model.component.selection; + var marks = [{ hello: "world" }]; + chai_1.assert.sameDeepMembers(nearest_1.default.marks(model, selCmpts['one'], marks), voronoiMark()); + }); + it('should warn for path marks', log.wrap(function (localLogger) { + var model = getModel('line'); + var selCmpts = model.component.selection; + var marks = []; + chai_1.assert.equal(nearest_1.default.marks(model, selCmpts['one'], marks), marks); + chai_1.assert.equal(localLogger.warns[1], log.message.nearestNotSupportForContinuous('line')); + })); + it('limits to a single voronoi per unit', function () { + var model = getModel('circle'); + var selCmpts = model.component.selection; + var marks = [{ hello: "world" }]; + var marks2 = nearest_1.default.marks(model, selCmpts['one'], marks); + chai_1.assert.sameDeepMembers(nearest_1.default.marks(model, selCmpts['two'], marks2), voronoiMark()); + }); + it('supports 1D voronoi', function () { + var model = getModel('circle'); + var selCmpts = model.component.selection; + var marks = [{ hello: "world" }]; + chai_1.assert.sameDeepMembers(nearest_1.default.marks(model, selCmpts['seven'], util_1.duplicate(marks)), voronoiMark(null, { "expr": "0" })); + chai_1.assert.sameDeepMembers(nearest_1.default.marks(model, selCmpts['eight'], util_1.duplicate(marks)), voronoiMark({ "expr": "0" })); + chai_1.assert.sameDeepMembers(nearest_1.default.marks(model, selCmpts['nine'], util_1.duplicate(marks)), voronoiMark()); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhcmVzdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL3NlbGVjdGlvbi9uZWFyZXN0LnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUM1QiwwRkFBc0U7QUFDdEUsc0dBQXdFO0FBQ3hFLDREQUF3QztBQUN4QywwQ0FBNEM7QUFDNUMsbUNBQTBDO0FBRTFDLGtCQUFrQixRQUFhO0lBQzdCLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7UUFDM0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ25ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ3pELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUNILEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDdkIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtRQUM5RCxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUM7UUFDMUMsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDO1FBQ3pDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUM7UUFDN0IsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFDO1FBQzVDLE1BQU0sRUFBRSxFQUFD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blxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0ICogYXMgc2VsZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IG5lYXJlc3QgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvbmVhcmVzdCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vLi4vc3JjL3V0aWwnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmZ1bmN0aW9uIGdldE1vZGVsKG1hcmtUeXBlOiBhbnkpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgXCJtYXJrXCI6IG1hcmtUeXBlLFxuICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk1pbGVzX3Blcl9HYWxsb25cIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwiT3JpZ2luXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICB9XG4gIH0pO1xuICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gIG1vZGVsLnBhcnNlTWFya0dyb3VwKCk7XG4gIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyc2VVbml0U2VsZWN0aW9uKG1vZGVsLCB7XG4gICAgXCJvbmVcIjoge1widHlwZVwiOiBcInNpbmdsZVwiLCBcIm5lYXJlc3RcIjogdHJ1ZX0sXG4gICAgXCJ0d29cIjoge1widHlwZVwiOiBcIm11bHRpXCIsIFwibmVhcmVzdFwiOiB0cnVlfSxcbiAgICBcInRocmVlXCI6IHtcInR5cGVcIjogXCJpbnRlcnZhbFwifSxcbiAgICBcImZvdXJcIjoge1widHlwZVwiOiBcInNpbmdsZVwiLCBcIm5lYXJlc3RcIjogZmFsc2V9LFxuICAgIFwiZml2ZVwiOiB7XCJ0eXBlXCI6IFwibXVsdGlcIn0sXG4gICAgXCJzaXhcIjoge1widHlwZVwiOiBcIm11bHRpXCIsIFwibmVhcmVzdFwiOiBudWxsfSxcbiAgICBcInNldmVuXCI6IHtcInR5cGVcIjogXCJzaW5nbGVcIiwgXCJuZWFyZXN0XCI6IHRydWUsIFwiZW5jb2RpbmdzXCI6IFtcInhcIl19LFxuICAgIFwiZWlnaHRcIjoge1widHlwZVwiOiBcInNpbmdsZVwiLCBcIm5lYXJlc3RcIjogdHJ1ZSwgXCJlbmNvZGluZ3NcIjogW1wieVwiXX0sXG4gICAgXCJuaW5lXCI6IHtcInR5cGVcIjogXCJzaW5nbGVcIiwgXCJuZWFyZXN0XCI6IHRydWUsIFwiZW5jb2RpbmdzXCI6IFtcImNvbG9yXCJdfVxuICB9KTtcblxuICByZXR1cm4gbW9kZWw7XG59XG5cbmZ1bmN0aW9uIHZvcm9ub2lNYXJrKHg/OiBzdHJpbmcgfCB7ZXhwcjogc3RyaW5nfSwgeT86IHN0cmluZyB8IHtleHByOiBzdHJpbmd9KSB7XG4gIHJldHVybiBbXG4gICAge2hlbGxvOiBcIndvcmxkXCJ9LFxuICAgIHtcbiAgICAgIFwibmFtZVwiOiBcInZvcm9ub2lcIixcbiAgICAgIFwidHlwZVwiOiBcInBhdGhcIixcbiAgICAgIFwiZnJvbVwiOiB7XCJkYXRhXCI6IFwibWFya3NcIn0sXG4gICAgICBcImVuY29kZVwiOiB7XG4gICAgICAgIFwiZW50ZXJcIjoge1xuICAgICAgICAgIFwiZmlsbFwiOiB7XCJ2YWx1ZVwiOiBcInRyYW5zcGFyZW50XCJ9LFxuICAgICAgICAgIFwic3Ryb2tlV2lkdGhcIjoge1widmFsdWVcIjogMC4zNX0sXG4gICAgICAgICAgXCJzdHJva2VcIjoge1widmFsdWVcIjogXCJ0cmFuc3BhcmVudFwifSxcbiAgICAgICAgICBcImlzVm9yb25vaVwiOiB7XCJ2YWx1ZVwiOiB0cnVlfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ0cmFuc2Zvcm1cIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJ0eXBlXCI6IFwidm9yb25vaVwiLFxuICAgICAgICAgIFwieFwiOiB4IHx8IHtcImV4cHJcIjogXCJkYXR1bS5kYXR1bS54IHx8IDBcIn0sXG4gICAgICAgICAgXCJ5XCI6IHkgfHwge1wiZXhwclwiOiBcImRhdHVtLmRhdHVtLnkgfHwgMFwifSxcbiAgICAgICAgICBcInNpemVcIjogW3tcInNpZ25hbFwiOiBcIndpZHRoXCJ9LHtcInNpZ25hbFwiOiBcImhlaWdodFwifV1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgXTtcbn1cblxuZGVzY3JpYmUoJ05lYXJlc3QgU2VsZWN0aW9uIFRyYW5zZm9ybScsIGZ1bmN0aW9uKCkge1xuICBpdCgnaWRlbnRpZmllcyB0cmFuc2Zvcm0gaW52b2NhdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNlbENtcHRzID0gZ2V0TW9kZWwoJ2NpcmNsZScpLmNvbXBvbmVudC5zZWxlY3Rpb247XG4gICAgYXNzZXJ0LmlzTm90RmFsc2UobmVhcmVzdC5oYXMoc2VsQ21wdHNbJ29uZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90RmFsc2UobmVhcmVzdC5oYXMoc2VsQ21wdHNbJ3R3byddKSk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZShuZWFyZXN0LmhhcyhzZWxDbXB0c1sndGhyZWUnXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUobmVhcmVzdC5oYXMoc2VsQ21wdHNbJ2ZvdXInXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUobmVhcmVzdC5oYXMoc2VsQ21wdHNbJ2ZpdmUnXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUobmVhcmVzdC5oYXMoc2VsQ21wdHNbJ3NpeCddKSk7XG4gIH0pO1xuXG4gIGl0KCdhZGRzIHZvcm9ub2kgZm9yIG5vbi1wYXRoIG1hcmtzJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBnZXRNb2RlbCgnY2lyY2xlJyk7XG4gICAgY29uc3Qgc2VsQ21wdHMgPSBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uO1xuICAgIGNvbnN0IG1hcmtzOiBhbnlbXSA9IFt7aGVsbG86IFwid29ybGRcIn1dO1xuXG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhcbiAgICAgIG5lYXJlc3QubWFya3MobW9kZWwsIHNlbENtcHRzWydvbmUnXSwgbWFya3MpLCB2b3Jvbm9pTWFyaygpKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB3YXJuIGZvciBwYXRoIG1hcmtzJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSBnZXRNb2RlbCgnbGluZScpO1xuICAgIGNvbnN0IHNlbENtcHRzID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgICBjb25zdCBtYXJrczogYW55W10gPSBbXTtcbiAgICBhc3NlcnQuZXF1YWwobmVhcmVzdC5tYXJrcyhtb2RlbCwgc2VsQ21wdHNbJ29uZSddLCBtYXJrcyksIG1hcmtzKTtcbiAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMV0sIGxvZy5tZXNzYWdlLm5lYXJlc3ROb3RTdXBwb3J0Rm9yQ29udGludW91cygnbGluZScpKTtcbiAgfSkpO1xuXG4gIGl0KCdsaW1pdHMgdG8gYSBzaW5nbGUgdm9yb25vaSBwZXIgdW5pdCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWwoJ2NpcmNsZScpO1xuICAgIGNvbnN0IHNlbENtcHRzID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgICBjb25zdCBtYXJrczogYW55W10gPSBbe2hlbGxvOiBcIndvcmxkXCJ9XTtcblxuICAgIGNvbnN0IG1hcmtzMiA9IG5lYXJlc3QubWFya3MobW9kZWwsIHNlbENtcHRzWydvbmUnXSwgbWFya3MpO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoXG4gICAgICBuZWFyZXN0Lm1hcmtzKG1vZGVsLCBzZWxDbXB0c1sndHdvJ10sIG1hcmtzMiksIHZvcm9ub2lNYXJrKCkpO1xuICB9KTtcblxuICBpdCgnc3VwcG9ydHMgMUQgdm9yb25vaScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWwoJ2NpcmNsZScpO1xuICAgIGNvbnN0IHNlbENtcHRzID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgICBjb25zdCBtYXJrczogYW55W10gPSBbe2hlbGxvOiBcIndvcmxkXCJ9XTtcblxuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoXG4gICAgICBuZWFyZXN0Lm1hcmtzKG1vZGVsLCBzZWxDbXB0c1snc2V2ZW4nXSwgZHVwbGljYXRlKG1hcmtzKSksXG4gICAgICB2b3Jvbm9pTWFyayhudWxsLCB7XCJleHByXCI6IFwiMFwifSkpO1xuXG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhcbiAgICAgIG5lYXJlc3QubWFya3MobW9kZWwsIHNlbENtcHRzWydlaWdodCddLCBkdXBsaWNhdGUobWFya3MpKSxcbiAgICAgIHZvcm9ub2lNYXJrKHtcImV4cHJcIjogXCIwXCJ9KSk7XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKFxuICAgICAgbmVhcmVzdC5tYXJrcyhtb2RlbCwgc2VsQ21wdHNbJ25pbmUnXSwgZHVwbGljYXRlKG1hcmtzKSksXG4gICAgICB2b3Jvbm9pTWFyaygpKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/selection/parse.test.d.ts b/build/test/compile/selection/parse.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/parse.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/parse.test.js b/build/test/compile/selection/parse.test.js new file mode 100644 index 0000000000..9b2f5dd7ed --- /dev/null +++ b/build/test/compile/selection/parse.test.js @@ -0,0 +1,108 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var vega_event_selector_1 = require("vega-event-selector"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../../src/util"); +var util_2 = require("../../util"); +describe('Selection', function () { + var model = util_2.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + it('parses default selection definitions', function () { + var component = selection.parseUnitSelection(model, { + "one": { "type": "single" }, + "two": { "type": "multi" }, + "three": { "type": "interval" } + }); + chai_1.assert.sameMembers(util_1.keys(component), ['one', 'two', 'three']); + chai_1.assert.equal(component.one.name, 'one'); + chai_1.assert.equal(component.one.type, 'single'); + chai_1.assert.sameDeepMembers(component['one'].project, [{ field: '_vgsid_', channel: null }]); + chai_1.assert.sameDeepMembers(component['one'].events, vega_event_selector_1.selector('click', 'scope')); + chai_1.assert.equal(component.two.name, 'two'); + chai_1.assert.equal(component.two.type, 'multi'); + chai_1.assert.equal(component.two.toggle, 'event.shiftKey'); + chai_1.assert.sameDeepMembers(component['two'].project, [{ field: '_vgsid_', channel: null }]); + chai_1.assert.sameDeepMembers(component['two'].events, vega_event_selector_1.selector('click', 'scope')); + chai_1.assert.equal(component.three.name, 'three'); + chai_1.assert.equal(component.three.type, 'interval'); + chai_1.assert.equal(component.three.translate, '[mousedown, window:mouseup] > window:mousemove!'); + chai_1.assert.equal(component.three.zoom, 'wheel!'); + chai_1.assert.sameDeepMembers(component['three'].project, [{ field: 'Horsepower', channel: 'x' }, { field: 'Miles_per_Gallon', channel: 'y' }]); + chai_1.assert.sameDeepMembers(component['three'].events, vega_event_selector_1.selector('[mousedown, window:mouseup] > window:mousemove!', 'scope')); + }); + it('supports inline default overrides', function () { + var component = selection.parseUnitSelection(model, { + "one": { + "type": "single", + "on": "dblclick", "fields": ["Cylinders"] + }, + "two": { + "type": "multi", + "on": "mouseover", "toggle": "event.ctrlKey", "encodings": ["color"] + }, + "three": { + "type": "interval", + "on": "[mousedown[!event.shiftKey], mouseup] > mousemove", + "encodings": ["y"], "translate": false, "zoom": "wheel[event.altKey]" + } + }); + chai_1.assert.sameMembers(util_1.keys(component), ['one', 'two', 'three']); + chai_1.assert.equal(component.one.name, 'one'); + chai_1.assert.equal(component.one.type, 'single'); + chai_1.assert.sameDeepMembers(component['one'].project, [{ field: 'Cylinders', channel: null }]); + chai_1.assert.sameDeepMembers(component['one'].events, vega_event_selector_1.selector('dblclick', 'scope')); + chai_1.assert.equal(component.two.name, 'two'); + chai_1.assert.equal(component.two.type, 'multi'); + chai_1.assert.equal(component.two.toggle, 'event.ctrlKey'); + chai_1.assert.sameDeepMembers(component['two'].project, [{ field: 'Origin', channel: 'color' }]); + chai_1.assert.sameDeepMembers(component['two'].events, vega_event_selector_1.selector('mouseover', 'scope')); + chai_1.assert.equal(component.three.name, 'three'); + chai_1.assert.equal(component.three.type, 'interval'); + chai_1.assert.equal(component.three.translate, false); + chai_1.assert.equal(component.three.zoom, 'wheel[event.altKey]'); + chai_1.assert.sameDeepMembers(component['three'].project, [{ field: 'Miles_per_Gallon', channel: 'y' }]); + chai_1.assert.sameDeepMembers(component['three'].events, vega_event_selector_1.selector('[mousedown[!event.shiftKey], mouseup] > mousemove', 'scope')); + }); + it('respects selection configs', function () { + model.config.selection = { + single: { on: 'dblclick', fields: ['Cylinders'] }, + multi: { on: 'mouseover', encodings: ['color'], toggle: 'event.ctrlKey' }, + interval: { + on: '[mousedown[!event.shiftKey], mouseup] > mousemove', + encodings: ['y'], + zoom: 'wheel[event.altKey]' + } + }; + var component = selection.parseUnitSelection(model, { + "one": { "type": "single" }, + "two": { "type": "multi" }, + "three": { "type": "interval" } + }); + chai_1.assert.sameMembers(util_1.keys(component), ['one', 'two', 'three']); + chai_1.assert.equal(component.one.name, 'one'); + chai_1.assert.equal(component.one.type, 'single'); + chai_1.assert.sameDeepMembers(component['one'].project, [{ field: 'Cylinders', channel: null }]); + chai_1.assert.sameDeepMembers(component['one'].events, vega_event_selector_1.selector('dblclick', 'scope')); + chai_1.assert.equal(component.two.name, 'two'); + chai_1.assert.equal(component.two.type, 'multi'); + chai_1.assert.equal(component.two.toggle, 'event.ctrlKey'); + chai_1.assert.sameDeepMembers(component['two'].project, [{ field: 'Origin', channel: 'color' }]); + chai_1.assert.sameDeepMembers(component['two'].events, vega_event_selector_1.selector('mouseover', 'scope')); + chai_1.assert.equal(component.three.name, 'three'); + chai_1.assert.equal(component.three.type, 'interval'); + chai_1.assert(!component.three.translate); + chai_1.assert.equal(component.three.zoom, 'wheel[event.altKey]'); + chai_1.assert.sameDeepMembers(component['three'].project, [{ field: 'Miles_per_Gallon', channel: 'y' }]); + chai_1.assert.sameDeepMembers(component['three'].events, vega_event_selector_1.selector('[mousedown[!event.shiftKey], mouseup] > mousemove', 'scope')); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zZWxlY3Rpb24vcGFyc2UudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLDJEQUE4RDtBQUM5RCwwRkFBc0U7QUFDdEUsMENBQXVDO0FBQ3ZDLG1DQUEwQztBQUUxQyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ3BCLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7UUFDM0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ25ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ3pELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQ0FBc0MsRUFBRTtRQUN6QyxJQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFO1lBQ3BELEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUM7WUFDekIsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQztZQUN4QixPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDO1NBQzlCLENBQUMsQ0FBQztRQUVILGFBQU0sQ0FBQyxXQUFXLENBQUMsV0FBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRTdELGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENB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QyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEgsYUFBTSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLDhCQUFhLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFckYsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxhQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLGFBQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzFELGFBQU0sQ0FBQyxlQUFlLENBQTZCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVILGFBQU0sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSw4QkFBYSxDQUFDLG1EQUFtRCxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakksQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge3NlbGVjdG9yIGFzIHBhcnNlU2VsZWN0b3J9IGZyb20gJ3ZlZ2EtZXZlbnQtc2VsZWN0b3InO1xuaW1wb3J0ICogYXMgc2VsZWN0aW9uIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi8uLi8uLi9zcmMvdXRpbCc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZGVzY3JpYmUoJ1NlbGVjdGlvbicsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgfVxuICB9KTtcblxuICBpdCgncGFyc2VzIGRlZmF1bHQgc2VsZWN0aW9uIGRlZmluaXRpb25zJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY29tcG9uZW50ID0gc2VsZWN0aW9uLnBhcnNlVW5pdFNlbGVjdGlvbihtb2RlbCwge1xuICAgICAgXCJvbmVcIjoge1widHlwZVwiOiBcInNpbmdsZVwifSxcbiAgICAgIFwidHdvXCI6IHtcInR5cGVcIjogXCJtdWx0aVwifSxcbiAgICAgIFwidGhyZWVcIjoge1widHlwZVwiOiBcImludGVydmFsXCJ9XG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc2FtZU1lbWJlcnMoa2V5cyhjb21wb25lbnQpLCBbJ29uZScsICd0d28nLCAndGhyZWUnXSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50Lm9uZS5uYW1lLCAnb25lJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC5vbmUudHlwZSwgJ3NpbmdsZScpO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50WydvbmUnXS5wcm9qZWN0LCBbe2ZpZWxkOiAnX3Znc2lkXycsIGNoYW5uZWw6IG51bGx9XSk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhjb21wb25lbnRbJ29uZSddLmV2ZW50cywgcGFyc2VTZWxlY3RvcignY2xpY2snLCAnc2NvcGUnKSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnR3by5uYW1lLCAndHdvJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC50d28udHlwZSwgJ211bHRpJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC50d28udG9nZ2xlLCAnZXZlbnQuc2hpZnRLZXknKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGNvbXBvbmVudFsndHdvJ10ucHJvamVjdCwgW3tmaWVsZDogJ192Z3NpZF8nLCBjaGFubmVsOiBudWxsfV0pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50Wyd0d28nXS5ldmVudHMsIHBhcnNlU2VsZWN0b3IoJ2NsaWNrJywgJ3Njb3BlJykpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC50aHJlZS5uYW1lLCAndGhyZWUnKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLnR5cGUsICdpbnRlcnZhbCcpO1xuICAgIGFzc2VydC5lcXVhbChjb21wb25lbnQudGhyZWUudHJhbnNsYXRlLCAnW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSEnKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLnpvb20sICd3aGVlbCEnKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzPHNlbGVjdGlvbi5Qcm9qZWN0Q29tcG9uZW50Pihjb21wb25lbnRbJ3RocmVlJ10ucHJvamVjdCwgW3tmaWVsZDogJ0hvcnNlcG93ZXInLCBjaGFubmVsOiAneCd9LCB7ZmllbGQ6ICdNaWxlc19wZXJfR2FsbG9uJywgY2hhbm5lbDogJ3knfV0pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50Wyd0aHJlZSddLmV2ZW50cywgcGFyc2VTZWxlY3RvcignW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSEnLCAnc2NvcGUnKSk7XG4gIH0pO1xuXG4gIGl0KCdzdXBwb3J0cyBpbmxpbmUgZGVmYXVsdCBvdmVycmlkZXMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSBzZWxlY3Rpb24ucGFyc2VVbml0U2VsZWN0aW9uKG1vZGVsLCB7XG4gICAgICBcIm9uZVwiOiB7XG4gICAgICAgIFwidHlwZVwiOiBcInNpbmdsZVwiLFxuICAgICAgICBcIm9uXCI6IFwiZGJsY2xpY2tcIiwgXCJmaWVsZHNcIjogW1wiQ3lsaW5kZXJzXCJdXG4gICAgICB9LFxuICAgICAgXCJ0d29cIjoge1xuICAgICAgICBcInR5cGVcIjogXCJtdWx0aVwiLFxuICAgICAgICBcIm9uXCI6IFwibW91c2VvdmVyXCIsIFwidG9nZ2xlXCI6IFwiZXZlbnQuY3RybEtleVwiLCBcImVuY29kaW5nc1wiOiBbXCJjb2xvclwiXVxuICAgICAgfSxcbiAgICAgIFwidGhyZWVcIjoge1xuICAgICAgICBcInR5cGVcIjogXCJpbnRlcnZhbFwiLFxuICAgICAgICBcIm9uXCI6IFwiW21vdXNlZG93blshZXZlbnQuc2hpZnRLZXldLCBtb3VzZXVwXSA+IG1vdXNlbW92ZVwiLFxuICAgICAgICBcImVuY29kaW5nc1wiOiBbXCJ5XCJdLCBcInRyYW5zbGF0ZVwiOiBmYWxzZSwgXCJ6b29tXCI6IFwid2hlZWxbZXZlbnQuYWx0S2V5XVwiXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc2FtZU1lbWJlcnMoa2V5cyhjb21wb25lbnQpLCBbJ29uZScsICd0d28nLCAndGhyZWUnXSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50Lm9uZS5uYW1lLCAnb25lJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC5vbmUudHlwZSwgJ3NpbmdsZScpO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50WydvbmUnXS5wcm9qZWN0LCBbe2ZpZWxkOiAnQ3lsaW5kZXJzJywgY2hhbm5lbDogbnVsbH1dKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGNvbXBvbmVudFsnb25lJ10uZXZlbnRzLCBwYXJzZVNlbGVjdG9yKCdkYmxjbGljaycsICdzY29wZScpKTtcblxuICAgIGFzc2VydC5lcXVhbChjb21wb25lbnQudHdvLm5hbWUsICd0d28nKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnR3by50eXBlLCAnbXVsdGknKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnR3by50b2dnbGUsICdldmVudC5jdHJsS2V5Jyk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVyczxzZWxlY3Rpb24uUHJvamVjdENvbXBvbmVudD4oY29tcG9uZW50Wyd0d28nXS5wcm9qZWN0LCBbe2ZpZWxkOiAnT3JpZ2luJywgY2hhbm5lbDogJ2NvbG9yJ31dKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGNvbXBvbmVudFsndHdvJ10uZXZlbnRzLCBwYXJzZVNlbGVjdG9yKCdtb3VzZW92ZXInLCAnc2NvcGUnKSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLm5hbWUsICd0aHJlZScpO1xuICAgIGFzc2VydC5lcXVhbChjb21wb25lbnQudGhyZWUudHlwZSwgJ2ludGVydmFsJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC50aHJlZS50cmFuc2xhdGUsIGZhbHNlKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLnpvb20sICd3aGVlbFtldmVudC5hbHRLZXldJyk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVyczxzZWxlY3Rpb24uUHJvamVjdENvbXBvbmVudD4oY29tcG9uZW50Wyd0aHJlZSddLnByb2plY3QsIFt7ZmllbGQ6ICdNaWxlc19wZXJfR2FsbG9uJywgY2hhbm5lbDogJ3knfV0pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50Wyd0aHJlZSddLmV2ZW50cywgcGFyc2VTZWxlY3RvcignW21vdXNlZG93blshZXZlbnQuc2hpZnRLZXldLCBtb3VzZXVwXSA+IG1vdXNlbW92ZScsICdzY29wZScpKTtcbiAgfSk7XG5cbiAgaXQoJ3Jlc3BlY3RzIHNlbGVjdGlvbiBjb25maWdzJywgZnVuY3Rpb24oKSB7XG4gICAgbW9kZWwuY29uZmlnLnNlbGVjdGlvbiA9IHtcbiAgICAgIHNpbmdsZToge29uOiAnZGJsY2xpY2snLCBmaWVsZHM6IFsnQ3lsaW5kZXJzJ119LFxuICAgICAgbXVsdGk6IHtvbjogJ21vdXNlb3ZlcicsIGVuY29kaW5nczogWydjb2xvciddLCB0b2dnbGU6ICdldmVudC5jdHJsS2V5J30sXG4gICAgICBpbnRlcnZhbDoge1xuICAgICAgICBvbjogJ1ttb3VzZWRvd25bIWV2ZW50LnNoaWZ0S2V5XSwgbW91c2V1cF0gPiBtb3VzZW1vdmUnLFxuICAgICAgICBlbmNvZGluZ3M6IFsneSddLFxuICAgICAgICB6b29tOiAnd2hlZWxbZXZlbnQuYWx0S2V5XSdcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gc2VsZWN0aW9uLnBhcnNlVW5pdFNlbGVjdGlvbihtb2RlbCwge1xuICAgICAgXCJvbmVcIjoge1widHlwZVwiOiBcInNpbmdsZVwifSxcbiAgICAgIFwidHdvXCI6IHtcInR5cGVcIjogXCJtdWx0aVwifSxcbiAgICAgIFwidGhyZWVcIjoge1widHlwZVwiOiBcImludGVydmFsXCJ9XG4gICAgfSk7XG5cbiAgICBhc3NlcnQuc2FtZU1lbWJlcnMoa2V5cyhjb21wb25lbnQpLCBbJ29uZScsICd0d28nLCAndGhyZWUnXSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50Lm9uZS5uYW1lLCAnb25lJyk7XG4gICAgYXNzZXJ0LmVxdWFsKGNvbXBvbmVudC5vbmUudHlwZSwgJ3NpbmdsZScpO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50WydvbmUnXS5wcm9qZWN0LCBbe2ZpZWxkOiAnQ3lsaW5kZXJzJywgY2hhbm5lbDogbnVsbH1dKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGNvbXBvbmVudFsnb25lJ10uZXZlbnRzLCBwYXJzZVNlbGVjdG9yKCdkYmxjbGljaycsICdzY29wZScpKTtcblxuICAgIGFzc2VydC5lcXVhbChjb21wb25lbnQudHdvLm5hbWUsICd0d28nKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnR3by50eXBlLCAnbXVsdGknKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnR3by50b2dnbGUsICdldmVudC5jdHJsS2V5Jyk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVyczxzZWxlY3Rpb24uUHJvamVjdENvbXBvbmVudD4oY29tcG9uZW50Wyd0d28nXS5wcm9qZWN0LCBbe2ZpZWxkOiAnT3JpZ2luJywgY2hhbm5lbDogJ2NvbG9yJ31dKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGNvbXBvbmVudFsndHdvJ10uZXZlbnRzLCBwYXJzZVNlbGVjdG9yKCdtb3VzZW92ZXInLCAnc2NvcGUnKSk7XG5cbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLm5hbWUsICd0aHJlZScpO1xuICAgIGFzc2VydC5lcXVhbChjb21wb25lbnQudGhyZWUudHlwZSwgJ2ludGVydmFsJyk7XG4gICAgYXNzZXJ0KCFjb21wb25lbnQudGhyZWUudHJhbnNsYXRlKTtcbiAgICBhc3NlcnQuZXF1YWwoY29tcG9uZW50LnRocmVlLnpvb20sICd3aGVlbFtldmVudC5hbHRLZXldJyk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVyczxzZWxlY3Rpb24uUHJvamVjdENvbXBvbmVudD4oY29tcG9uZW50Wyd0aHJlZSddLnByb2plY3QsIFt7ZmllbGQ6ICdNaWxlc19wZXJfR2FsbG9uJywgY2hhbm5lbDogJ3knfV0pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoY29tcG9uZW50Wyd0aHJlZSddLmV2ZW50cywgcGFyc2VTZWxlY3RvcignW21vdXNlZG93blshZXZlbnQuc2hpZnRLZXldLCBtb3VzZXVwXSA+IG1vdXNlbW92ZScsICdzY29wZScpKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/selection/predicate.test.d.ts b/build/test/compile/selection/predicate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/predicate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/predicate.test.js b/build/test/compile/selection/predicate.test.js new file mode 100644 index 0000000000..e427c215ee --- /dev/null +++ b/build/test/compile/selection/predicate.test.js @@ -0,0 +1,96 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var mixins_1 = require("../../../src/compile/mark/mixins"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var predicate_1 = require("../../../src/predicate"); +var util_1 = require("../../util"); +var predicate = selection.selectionPredicate; +describe('Selection Predicate', function () { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { + "field": "Cylinders", "type": "ordinal", + "condition": { + "selection": "one", + "value": "grey" + } + }, + "opacity": { + "field": "Origin", "type": "nominal", + "condition": { + "selection": { "or": ["one", { "and": ["two", { "not": "thr-ee" }] }] }, + "value": 0.5 + } + } + } + }); + model.parseScale(); + model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "single" }, + "two": { "type": "multi", "resolve": "union" }, + "thr-ee": { "type": "interval", "resolve": "intersect" }, + "four": { "type": "single", "empty": "none" } + }); + it('generates the predicate expression', function () { + chai_1.assert.equal(predicate(model, "one"), '!(length(data("one_store"))) || (vlSingle("one_store", datum))'); + chai_1.assert.equal(predicate(model, "four"), '(vlSingle("four_store", datum))'); + chai_1.assert.equal(predicate(model, { "not": "one" }), '!(length(data("one_store"))) || (!(vlSingle("one_store", datum)))'); + chai_1.assert.equal(predicate(model, { "not": { "and": ["one", "two"] } }), '!(length(data("one_store")) || length(data("two_store"))) || ' + + '(!((vlSingle("one_store", datum)) && ' + + '(vlMulti("two_store", datum, "union"))))'); + chai_1.assert.equal(predicate(model, { "not": { "and": ["one", "four"] } }), '!(length(data("one_store"))) || ' + + '(!((vlSingle("one_store", datum)) && ' + + '(vlSingle("four_store", datum))))'); + chai_1.assert.equal(predicate(model, { "and": ["one", "two", { "not": "thr-ee" }] }), '!(length(data("one_store")) || length(data("two_store")) || length(data("thr_ee_store"))) || ' + + '((vlSingle("one_store", datum)) && ' + + '(vlMulti("two_store", datum, "union")) && ' + + '(!(vlInterval("thr_ee_store", datum, "intersect"))))'); + chai_1.assert.equal(predicate(model, { "or": ["one", { "and": ["two", { "not": "thr-ee" }] }] }), '!(length(data("one_store")) || length(data("two_store")) || length(data("thr_ee_store"))) || ' + + '((vlSingle("one_store", datum)) || ' + + '((vlMulti("two_store", datum, "union")) && ' + + '(!(vlInterval("thr_ee_store", datum, "intersect")))))'); + }); + it('generates Vega production rules', function () { + chai_1.assert.deepEqual(mixins_1.nonPosition('color', model, { vgChannel: 'fill' }), { + fill: [ + { test: '!(length(data("one_store"))) || (vlSingle("one_store", datum))', value: "grey" }, + { scale: "color", field: "Cylinders" } + ] + }); + chai_1.assert.deepEqual(mixins_1.nonPosition('opacity', model), { + opacity: [ + { test: '!(length(data("one_store")) || length(data("two_store")) || length(data("thr_ee_store"))) || ' + + '((vlSingle("one_store", datum)) || ' + + '((vlMulti("two_store", datum, "union")) && ' + + '(!(vlInterval("thr_ee_store", datum, "intersect")))))', + value: 0.5 }, + { scale: "opacity", field: "Origin" } + ] + }); + }); + it('generates a selection filter', function () { + chai_1.assert.equal(predicate_1.expression(model, { "selection": "one" }), '!(length(data("one_store"))) || (vlSingle("one_store", datum))'); + chai_1.assert.equal(predicate_1.expression(model, { "selection": { "not": "one" } }), '!(length(data("one_store"))) || (!(vlSingle("one_store", datum)))'); + chai_1.assert.equal(predicate_1.expression(model, { "selection": { "not": { "and": ["one", "two"] } } }), '!(length(data("one_store")) || length(data("two_store"))) || ' + + '(!((vlSingle("one_store", datum)) && ' + + '(vlMulti("two_store", datum, "union"))))'); + chai_1.assert.equal(predicate_1.expression(model, { "selection": { "and": ["one", "two", { "not": "thr-ee" }] } }), '!(length(data("one_store")) || length(data("two_store")) || length(data("thr_ee_store"))) || ' + + '((vlSingle("one_store", datum)) && ' + + '(vlMulti("two_store", datum, "union")) && ' + + '(!(vlInterval("thr_ee_store", datum, "intersect"))))'); + chai_1.assert.equal(predicate_1.expression(model, { "selection": { "or": ["one", { "and": ["two", { "not": "thr-ee" }] }] } }), '!(length(data("one_store")) || length(data("two_store")) || length(data("thr_ee_store"))) || ' + + '((vlSingle("one_store", datum)) || ' + + '((vlMulti("two_store", datum, "union")) && ' + + '(!(vlInterval("thr_ee_store", datum, "intersect")))))'); + }); + it('throws an error for unknown selections', function () { + chai_1.assert.throws(function () { return predicate(model, 'helloworld'); }, 'Cannot find a selection named "helloworld"'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGljYXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL3ByZWRpY2F0ZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMkRBQTZEO0FBQzdELDBGQUFzRTtBQUN0RSxvREFBa0Q7QUFFbEQsbUNBQTBDO0FBRTFDLElBQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQztBQUUvQyxRQUFRLENBQUMscUJBQXFCLEVBQUU7SUFDOUIsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztRQUMzQixNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUU7WUFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7WUFDbkQsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7WUFDekQsT0FBTyxFQUFFO2dCQUNQLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFNBQVM7Z0JBQ3ZDLFdBQVcsRUFBRTtvQkFDWCxXQUFXLEVBQUUsS0FBSztvQkFDbEIsT0FBTyxFQUFFLE1BQU07aUJBQ2hCO2FBQ0Y7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUztnQkFDcEMsV0FBVyxFQUFFO29CQUNYLFdBQVcsRUFBRSxFQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQztvQkFDakUsT0FBTyxFQUFFLEdBQUc7aUJBQ2I7YUFDRjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBRW5CLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7UUFDOUQsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQztRQUN6QixLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUM7UUFDNUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDO1FBQ3RELE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQztLQUM1QyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7UUFDdkMsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUNsQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBRXBFLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBRTFFLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUMzQyxtRUFBbUUsQ0FBQyxDQUFDO1FBRXZFLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBQyxFQUFDLENBQUMsRUFDN0QsK0RBQStEO1lBQy9ELHVDQUF1QztZQUN2QywwQ0FBMEMsQ0FBQyxDQUFDO1FBRTVDLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBQyxFQUFDLENBQUMsRUFDaEUsa0NBQWtDO1lBQ2xDLHVDQUF1QztZQUN2QyxtQ0FBbUMsQ0FBQyxDQUFDO1FBRXZDLGFBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFBQyxDQUFDLEVBQ3ZFLCtGQUErRjtZQUMvRixxQ0FBcUM7WUFDckMsNENBQTRDO1lBQzVDLHNEQUFzRCxDQUFDLENBQUM7UUFFMUQsYUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFDakYsK0ZBQStGO1lBQy9GLHFDQUFxQztZQUNyQyw2Q0FBNkM7WUFDN0MsdURBQXVELENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRTtRQUNwQyxhQUFNLENBQUMsU0FBUyxDQUFnQixvQkFBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsTUFBTSxFQUFDLENBQUMsRUFBRTtZQUNoRixJQUFJLEVBQUU7Z0JBQ0osRUFBQyxJQUFJLEVBQUUsZ0VBQWdFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQztnQkFDdkYsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUM7YUFDckM7U0FDRixDQUFDLENBQUM7UUFFSCxhQUFNLENBQUMsU0FBUyxDQUFnQixvQkFBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUM3RCxPQUFPLEVBQUU7Z0JBQ1AsRUFBQyxJQUFJLEVBQUUsK0ZBQStGO3dCQUNoRyxxQ0FBcUM7d0JBQ3JDLDZDQUE2Qzt3QkFDN0MsdURBQXVEO29CQUMzRCxLQUFLLEVBQUUsR0FBRyxFQUFDO2dCQUNiLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFDO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUU7UUFDakMsYUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUNsRCxnRUFBZ0UsQ0FBQyxDQUFDO1FBRXBFLGFBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQyxFQUMzRCxtRUFBbUUsQ0FBQyxDQUFDO1FBRXZFLGFBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUMsRUFBQyxFQUFDLENBQUMsRUFDN0UsK0RBQStEO1lBQy9ELHVDQUF1QztZQUN2QywwQ0FBMEMsQ0FBQyxDQUFDO1FBRTlDLGFBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLEVBQ3ZGLCtGQUErRjtZQUMvRixxQ0FBcUM7WUFDckMsNENBQTRDO1lBQzVDLHNEQUFzRCxDQUFDLENBQUM7UUFFMUQsYUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLEtBQUssRUFBRSxFQUFDLFdBQVcsRUFBRSxFQUFDLElBQUksRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUFDLENBQUMsRUFBQyxFQUFDLENBQUMsRUFDakcsK0ZBQStGO1lBQy9GLHFDQUFxQztZQUNyQyw2Q0FBNkM7WUFDN0MsdURBQXVELENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtRQUMzQyxhQUFNLENBQUMsTUFBTSxDQUFDLGNBQU0sT0FBQSxTQUFTLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUE5QixDQUE4QixFQUFFLDRDQUE0QyxDQUFDLENBQUM7SUFDcEcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlIHF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge25vblBvc2l0aW9ufSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL21peGlucyc7XG5pbXBvcnQgKiBhcyBzZWxlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge2V4cHJlc3Npb259IGZyb20gJy4uLy4uLy4uL3NyYy9wcmVkaWNhdGUnO1xuaW1wb3J0IHtWZ0VuY29kZUVudHJ5fSBmcm9tICcuLi8uLi8uLi9zcmMvdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtwYXJzZVVuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmNvbnN0IHByZWRpY2F0ZSA9IHNlbGVjdGlvbi5zZWxlY3Rpb25QcmVkaWNhdGU7XG5cbmRlc2NyaWJlKCdTZWxlY3Rpb24gUHJlZGljYXRlJywgZnVuY3Rpb24oKSB7XG4gIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgIFwibWFya1wiOiBcImNpcmNsZVwiLFxuICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIk1pbGVzX3Blcl9HYWxsb25cIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgXCJmaWVsZFwiOiBcIkN5bGluZGVyc1wiLCBcInR5cGVcIjogXCJvcmRpbmFsXCIsXG4gICAgICAgIFwiY29uZGl0aW9uXCI6IHtcbiAgICAgICAgICBcInNlbGVjdGlvblwiOiBcIm9uZVwiLFxuICAgICAgICAgIFwidmFsdWVcIjogXCJncmV5XCJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwib3BhY2l0eVwiOiB7XG4gICAgICAgIFwiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwiLFxuICAgICAgICBcImNvbmRpdGlvblwiOiB7XG4gICAgICAgICAgXCJzZWxlY3Rpb25cIjoge1wib3JcIjogW1wib25lXCIsIHtcImFuZFwiOiBbXCJ0d29cIiwge1wibm90XCI6IFwidGhyLWVlXCJ9XX1dfSxcbiAgICAgICAgICBcInZhbHVlXCI6IDAuNVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBtb2RlbC5wYXJzZVNjYWxlKCk7XG5cbiAgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHNlbGVjdGlvbi5wYXJzZVVuaXRTZWxlY3Rpb24obW9kZWwsIHtcbiAgICBcIm9uZVwiOiB7XCJ0eXBlXCI6IFwic2luZ2xlXCJ9LFxuICAgIFwidHdvXCI6IHtcInR5cGVcIjogXCJtdWx0aVwiLCBcInJlc29sdmVcIjogXCJ1bmlvblwifSxcbiAgICBcInRoci1lZVwiOiB7XCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIiwgXCJyZXNvbHZlXCI6IFwiaW50ZXJzZWN0XCJ9LFxuICAgIFwiZm91clwiOiB7XCJ0eXBlXCI6IFwic2luZ2xlXCIsIFwiZW1wdHlcIjogXCJub25lXCJ9XG4gIH0pO1xuXG4gIGl0KCdnZW5lcmF0ZXMgdGhlIHByZWRpY2F0ZSBleHByZXNzaW9uJywgZnVuY3Rpb24oKSB7XG4gICAgYXNzZXJ0LmVxdWFsKHByZWRpY2F0ZShtb2RlbCwgXCJvbmVcIiksXG4gICAgICAnIShsZW5ndGgoZGF0YShcIm9uZV9zdG9yZVwiKSkpIHx8ICh2bFNpbmdsZShcIm9uZV9zdG9yZVwiLCBkYXR1bSkpJyk7XG5cbiAgICBhc3NlcnQuZXF1YWwocHJlZGljYXRlKG1vZGVsLCBcImZvdXJcIiksICcodmxTaW5nbGUoXCJmb3VyX3N0b3JlXCIsIGRhdHVtKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChwcmVkaWNhdGUobW9kZWwsIHtcIm5vdFwiOiBcIm9uZVwifSksXG4gICAgICAnIShsZW5ndGgoZGF0YShcIm9uZV9zdG9yZVwiKSkpIHx8ICghKHZsU2luZ2xlKFwib25lX3N0b3JlXCIsIGRhdHVtKSkpJyk7XG5cbiAgICBhc3NlcnQuZXF1YWwocHJlZGljYXRlKG1vZGVsLCB7XCJub3RcIjoge1wiYW5kXCI6IFtcIm9uZVwiLCBcInR3b1wiXX19KSxcbiAgICAgICchKGxlbmd0aChkYXRhKFwib25lX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInR3b19zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgJyghKCh2bFNpbmdsZShcIm9uZV9zdG9yZVwiLCBkYXR1bSkpICYmICcgK1xuICAgICAgJyh2bE11bHRpKFwidHdvX3N0b3JlXCIsIGRhdHVtLCBcInVuaW9uXCIpKSkpJyk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChwcmVkaWNhdGUobW9kZWwsIHtcIm5vdFwiOiB7XCJhbmRcIjogW1wib25lXCIsIFwiZm91clwiXX19KSxcbiAgICAgICchKGxlbmd0aChkYXRhKFwib25lX3N0b3JlXCIpKSkgfHwgJyArXG4gICAgICAnKCEoKHZsU2luZ2xlKFwib25lX3N0b3JlXCIsIGRhdHVtKSkgJiYgJyArXG4gICAgICAnKHZsU2luZ2xlKFwiZm91cl9zdG9yZVwiLCBkYXR1bSkpKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChwcmVkaWNhdGUobW9kZWwsIHtcImFuZFwiOiBbXCJvbmVcIiwgXCJ0d29cIiwge1wibm90XCI6IFwidGhyLWVlXCJ9XX0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInRocl9lZV9zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgJygodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKSAmJiAnICtcbiAgICAgICcodmxNdWx0aShcInR3b19zdG9yZVwiLCBkYXR1bSwgXCJ1bmlvblwiKSkgJiYgJyArXG4gICAgICAnKCEodmxJbnRlcnZhbChcInRocl9lZV9zdG9yZVwiLCBkYXR1bSwgXCJpbnRlcnNlY3RcIikpKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChwcmVkaWNhdGUobW9kZWwsIHtcIm9yXCI6IFtcIm9uZVwiLCB7XCJhbmRcIjogW1widHdvXCIsIHtcIm5vdFwiOiBcInRoci1lZVwifV19XX0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInRocl9lZV9zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgJygodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKSB8fCAnICtcbiAgICAgICcoKHZsTXVsdGkoXCJ0d29fc3RvcmVcIiwgZGF0dW0sIFwidW5pb25cIikpICYmICcgK1xuICAgICAgJyghKHZsSW50ZXJ2YWwoXCJ0aHJfZWVfc3RvcmVcIiwgZGF0dW0sIFwiaW50ZXJzZWN0XCIpKSkpKScpO1xuICB9KTtcblxuICBpdCgnZ2VuZXJhdGVzIFZlZ2EgcHJvZHVjdGlvbiBydWxlcycsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5kZWVwRXF1YWw8VmdFbmNvZGVFbnRyeT4obm9uUG9zaXRpb24oJ2NvbG9yJywgbW9kZWwsIHt2Z0NoYW5uZWw6ICdmaWxsJ30pLCB7XG4gICAgICBmaWxsOiBbXG4gICAgICAgIHt0ZXN0OiAnIShsZW5ndGgoZGF0YShcIm9uZV9zdG9yZVwiKSkpIHx8ICh2bFNpbmdsZShcIm9uZV9zdG9yZVwiLCBkYXR1bSkpJywgdmFsdWU6IFwiZ3JleVwifSxcbiAgICAgICAge3NjYWxlOiBcImNvbG9yXCIsIGZpZWxkOiBcIkN5bGluZGVyc1wifVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxWZ0VuY29kZUVudHJ5Pihub25Qb3NpdGlvbignb3BhY2l0eScsIG1vZGVsKSwge1xuICAgICAgb3BhY2l0eTogW1xuICAgICAgICB7dGVzdDogJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInRocl9lZV9zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgICAgICAgICAnKCh2bFNpbmdsZShcIm9uZV9zdG9yZVwiLCBkYXR1bSkpIHx8ICcgK1xuICAgICAgICAgICAgICAnKCh2bE11bHRpKFwidHdvX3N0b3JlXCIsIGRhdHVtLCBcInVuaW9uXCIpKSAmJiAnICtcbiAgICAgICAgICAgICAgJyghKHZsSW50ZXJ2YWwoXCJ0aHJfZWVfc3RvcmVcIiwgZGF0dW0sIFwiaW50ZXJzZWN0XCIpKSkpKScsXG4gICAgICAgICAgdmFsdWU6IDAuNX0sXG4gICAgICAgIHtzY2FsZTogXCJvcGFjaXR5XCIsIGZpZWxkOiBcIk9yaWdpblwifVxuICAgICAgXVxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnZ2VuZXJhdGVzIGEgc2VsZWN0aW9uIGZpbHRlcicsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uKG1vZGVsLCB7XCJzZWxlY3Rpb25cIjogXCJvbmVcIn0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpKSB8fCAodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKScpO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGV4cHJlc3Npb24obW9kZWwsIHtcInNlbGVjdGlvblwiOiB7XCJub3RcIjogXCJvbmVcIn19KSxcbiAgICAgICchKGxlbmd0aChkYXRhKFwib25lX3N0b3JlXCIpKSkgfHwgKCEodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uKG1vZGVsLCB7XCJzZWxlY3Rpb25cIjoge1wibm90XCI6IHtcImFuZFwiOiBbXCJvbmVcIiwgXCJ0d29cIl19fX0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSkgfHwgJyArXG4gICAgICAnKCEoKHZsU2luZ2xlKFwib25lX3N0b3JlXCIsIGRhdHVtKSkgJiYgJyArXG4gICAgICAnKHZsTXVsdGkoXCJ0d29fc3RvcmVcIiwgZGF0dW0sIFwidW5pb25cIikpKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uKG1vZGVsLCB7XCJzZWxlY3Rpb25cIjoge1wiYW5kXCI6IFtcIm9uZVwiLCBcInR3b1wiLCB7XCJub3RcIjogXCJ0aHItZWVcIn1dfX0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInRocl9lZV9zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgJygodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKSAmJiAnICtcbiAgICAgICcodmxNdWx0aShcInR3b19zdG9yZVwiLCBkYXR1bSwgXCJ1bmlvblwiKSkgJiYgJyArXG4gICAgICAnKCEodmxJbnRlcnZhbChcInRocl9lZV9zdG9yZVwiLCBkYXR1bSwgXCJpbnRlcnNlY3RcIikpKSknKTtcblxuICAgIGFzc2VydC5lcXVhbChleHByZXNzaW9uKG1vZGVsLCB7XCJzZWxlY3Rpb25cIjoge1wib3JcIjogW1wib25lXCIsIHtcImFuZFwiOiBbXCJ0d29cIiwge1wibm90XCI6IFwidGhyLWVlXCJ9XX1dfX0pLFxuICAgICAgJyEobGVuZ3RoKGRhdGEoXCJvbmVfc3RvcmVcIikpIHx8IGxlbmd0aChkYXRhKFwidHdvX3N0b3JlXCIpKSB8fCBsZW5ndGgoZGF0YShcInRocl9lZV9zdG9yZVwiKSkpIHx8ICcgK1xuICAgICAgJygodmxTaW5nbGUoXCJvbmVfc3RvcmVcIiwgZGF0dW0pKSB8fCAnICtcbiAgICAgICcoKHZsTXVsdGkoXCJ0d29fc3RvcmVcIiwgZGF0dW0sIFwidW5pb25cIikpICYmICcgK1xuICAgICAgJyghKHZsSW50ZXJ2YWwoXCJ0aHJfZWVfc3RvcmVcIiwgZGF0dW0sIFwiaW50ZXJzZWN0XCIpKSkpKScpO1xuICB9KTtcblxuICBpdCgndGhyb3dzIGFuIGVycm9yIGZvciB1bmtub3duIHNlbGVjdGlvbnMnLCBmdW5jdGlvbigpIHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHByZWRpY2F0ZShtb2RlbCwgJ2hlbGxvd29ybGQnKSwgJ0Nhbm5vdCBmaW5kIGEgc2VsZWN0aW9uIG5hbWVkIFwiaGVsbG93b3JsZFwiJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/scales.test.d.ts b/build/test/compile/selection/scales.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/scales.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/scales.test.js b/build/test/compile/selection/scales.test.js new file mode 100644 index 0000000000..85dc033e4e --- /dev/null +++ b/build/test/compile/selection/scales.test.js @@ -0,0 +1,143 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/scale/assemble"); +var util_1 = require("../../util"); +describe('Selection + Scales', function () { + it('assembles domainRaw from selection parameter', function () { + var model = util_1.parseConcatModel({ + vconcat: [ + { + mark: "area", + selection: { + brush: { type: "interval", encodings: ["x"] }, + brush2: { type: "multi", fields: ["price"], resolve: "intersect" } + }, + encoding: { + x: { field: "date", type: "temporal" }, + y: { field: "price", type: "quantitative" } + } + }, + { + selection: { + brush3: { type: "interval" } + }, + mark: "area", + encoding: { + x: { + field: "date", type: "temporal", + scale: { domain: { selection: "brush", encoding: "x" } } + }, + y: { + field: "price", type: "quantitative", + scale: { domain: { selection: "brush2", field: "price" } } + }, + color: { + field: "symbol", type: "nominal", + scale: { domain: { selection: "brush2" } } + }, + opacity: { + field: "symbol", type: "nominal", + scale: { domain: { selection: "brush3" } } + } + } + } + ], + resolve: { + scale: { + color: 'independent', + opacity: 'independent' + } + } + }); + model.parseScale(); + model.parseSelection(); + var scales = assemble_1.assembleScalesForModel(model.children[1]); + var xscale = scales[0]; + var yscale = scales[1]; + var cscale = scales[2]; + var oscale = scales[3]; + chai_1.assert.isObject(xscale.domain); + chai_1.assert.property(xscale, 'domainRaw'); + chai_1.assert.propertyVal(xscale.domainRaw, 'signal', "vlIntervalDomain(\"brush_store\", \"x\", null)"); + chai_1.assert.isObject(yscale.domain); + chai_1.assert.property(yscale, 'domainRaw'); + chai_1.assert.deepPropertyVal(yscale.domainRaw, 'signal', "vlMultiDomain(\"brush2_store\", null, \"price\", \"intersect\")"); + chai_1.assert.isObject(cscale.domain); + chai_1.assert.property(cscale, 'domainRaw'); + chai_1.assert.propertyVal(cscale.domainRaw, 'signal', "vlMultiDomain(\"brush2_store\", null, \"price\", \"intersect\")"); + chai_1.assert.isObject(oscale.domain); + chai_1.assert.property(oscale, 'domainRaw'); + chai_1.assert.propertyVal(oscale.domainRaw, 'signal', 'null'); + }); + it('should bind both scales in diagonal repeated views', function () { + var model = util_1.parseRepeatModel({ + repeat: { + row: ["Horsepower", "Acceleration"], + column: ["Miles_per_Gallon", "Acceleration"] + }, + spec: { + data: { url: "data/cars.json" }, + mark: "point", + selection: { + grid: { + type: "interval", + resolve: "global", + bind: "scales" + } + }, + encoding: { + x: { field: { repeat: "column" }, type: "quantitative" }, + y: { field: { repeat: "row" }, type: "quantitative" }, + color: { field: "Origin", type: "nominal" } + } + } + }); + model.parseScale(); + model.parseSelection(); + var scales = assemble_1.assembleScalesForModel(model.children[3]); + chai_1.assert.isTrue(scales.length === 2); + chai_1.assert.property(scales[0], 'domainRaw'); + chai_1.assert.property(scales[1], 'domainRaw'); + chai_1.assert.propertyVal(scales[0].domainRaw, 'signal', 'grid_Acceleration'); + chai_1.assert.propertyVal(scales[1].domainRaw, 'signal', 'grid_Acceleration'); + }); + it('should merge domainRaw for layered views', function () { + var model = util_1.parseConcatModel({ + data: { url: "data/sp500.csv" }, + vconcat: [ + { + layer: [ + { + mark: "point", + encoding: { + x: { + field: "date", type: "temporal", + scale: { domain: { selection: "brush" } } + }, + y: { field: "price", type: "quantitative" } + } + } + ] + }, + { + mark: "area", + selection: { + brush: { type: "interval", encodings: ["x"] } + }, + encoding: { + x: { field: "date", type: "temporal" }, + y: { field: "price", type: "quantitative" } + } + } + ] + }); + model.parseScale(); + model.parseSelection(); + var scales = assemble_1.assembleScalesForModel(model.children[0]); + chai_1.assert.property(scales[0], 'domainRaw'); + chai_1.assert.propertyVal(scales[0].domainRaw, 'signal', 'vlIntervalDomain("brush_store", null, "date")'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGVzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL3NjYWxlcy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7O0FBRTlCLDZCQUE0QjtBQUM1QixnRUFBMkU7QUFFM0UsbUNBQThEO0FBRTlELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixFQUFFLENBQUMsOENBQThDLEVBQUU7UUFDakQsSUFBTSxLQUFLLEdBQUcsdUJBQWdCLENBQUM7WUFDN0IsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLFNBQVMsRUFBRTt3QkFDVCxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFDO3dCQUMzQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUM7cUJBQ2pFO29CQUNELFFBQVEsRUFBRTt3QkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUM7d0JBQ3BDLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztxQkFDMUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsU0FBUyxFQUFFO3dCQUNULE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUM7cUJBQzNCO29CQUNELElBQUksRUFBRSxNQUFNO29CQUNaLFFBQVEsRUFBRTt3QkFDUixDQUFDLEVBQUU7NEJBQ0QsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVTs0QkFDL0IsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxF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QUFDLENBQUM7UUFDeEMsYUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQ3JHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHthc3NlbWJsZVNjYWxlc0Zvck1vZGVsfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9hc3NlbWJsZSc7XG5pbXBvcnQge0RvbWFpbn0gZnJvbSAnLi4vLi4vLi4vc3JjL3NjYWxlJztcbmltcG9ydCB7cGFyc2VDb25jYXRNb2RlbCwgcGFyc2VSZXBlYXRNb2RlbH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlc2NyaWJlKCdTZWxlY3Rpb24gKyBTY2FsZXMnLCBmdW5jdGlvbigpIHtcbiAgaXQoJ2Fzc2VtYmxlcyBkb21haW5SYXcgZnJvbSBzZWxlY3Rpb24gcGFyYW1ldGVyJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZUNvbmNhdE1vZGVsKHtcbiAgICAgIHZjb25jYXQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIG1hcms6IFwiYXJlYVwiLFxuICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgYnJ1c2g6IHt0eXBlOiBcImludGVydmFsXCIsIGVuY29kaW5nczogW1wieFwiXX0sXG4gICAgICAgICAgICBicnVzaDI6IHt0eXBlOiBcIm11bHRpXCIsIGZpZWxkczogW1wicHJpY2VcIl0sIHJlc29sdmU6IFwiaW50ZXJzZWN0XCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgeDoge2ZpZWxkOiBcImRhdGVcIiwgdHlwZTogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgIHk6IHtmaWVsZDogXCJwcmljZVwiLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgYnJ1c2gzOiB7dHlwZTogXCJpbnRlcnZhbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWFyazogXCJhcmVhXCIsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtcbiAgICAgICAgICAgICAgZmllbGQ6IFwiZGF0ZVwiLCB0eXBlOiBcInRlbXBvcmFsXCIsXG4gICAgICAgICAgICAgIHNjYWxlOiB7ZG9tYWluOiB7c2VsZWN0aW9uOiBcImJydXNoXCIsIGVuY29kaW5nOiBcInhcIn19XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeToge1xuICAgICAgICAgICAgICBmaWVsZDogXCJwcmljZVwiLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjoge3NlbGVjdGlvbjogXCJicnVzaDJcIiwgZmllbGQ6IFwicHJpY2VcIn19XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sb3I6IHtcbiAgICAgICAgICAgICAgZmllbGQ6IFwic3ltYm9sXCIsIHR5cGU6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjoge3NlbGVjdGlvbjogXCJicnVzaDJcIn0gYXMgRG9tYWlufVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wYWNpdHk6IHtcbiAgICAgICAgICAgICAgZmllbGQ6IFwic3ltYm9sXCIsIHR5cGU6IFwibm9taW5hbFwiLFxuICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjoge3NlbGVjdGlvbjogXCJicnVzaDNcIn0gYXMgRG9tYWlufVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgc2NhbGU6IHtcbiAgICAgICAgICBjb2xvcjogJ2luZGVwZW5kZW50JyxcbiAgICAgICAgICBvcGFjaXR5OiAnaW5kZXBlbmRlbnQnXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICBtb2RlbC5wYXJzZVNlbGVjdGlvbigpO1xuXG4gICAgY29uc3Qgc2NhbGVzID0gYXNzZW1ibGVTY2FsZXNGb3JNb2RlbChtb2RlbC5jaGlsZHJlblsxXSk7XG4gICAgY29uc3QgeHNjYWxlID0gc2NhbGVzWzBdO1xuICAgIGNvbnN0IHlzY2FsZSA9IHNjYWxlc1sxXTtcbiAgICBjb25zdCBjc2NhbGUgPSBzY2FsZXNbMl07XG4gICAgY29uc3Qgb3NjYWxlID0gc2NhbGVzWzNdO1xuXG4gICAgYXNzZXJ0LmlzT2JqZWN0KHhzY2FsZS5kb21haW4pO1xuICAgIGFzc2VydC5wcm9wZXJ0eSh4c2NhbGUsICdkb21haW5SYXcnKTtcbiAgICBhc3NlcnQucHJvcGVydHlWYWwoeHNjYWxlLmRvbWFpblJhdywgJ3NpZ25hbCcsXG4gICAgICBcInZsSW50ZXJ2YWxEb21haW4oXFxcImJydXNoX3N0b3JlXFxcIiwgXFxcInhcXFwiLCBudWxsKVwiKTtcblxuICAgIGFzc2VydC5pc09iamVjdCh5c2NhbGUuZG9tYWluKTtcbiAgICBhc3NlcnQucHJvcGVydHkoeXNjYWxlLCAnZG9tYWluUmF3Jyk7XG4gICAgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCh5c2NhbGUuZG9tYWluUmF3LCAnc2lnbmFsJyxcbiAgICAgIFwidmxNdWx0aURvbWFpbihcXFwiYnJ1c2gyX3N0b3JlXFxcIiwgbnVsbCwgXFxcInByaWNlXFxcIiwgXFxcImludGVyc2VjdFxcXCIpXCIpO1xuXG4gICAgYXNzZXJ0LmlzT2JqZWN0KGNzY2FsZS5kb21haW4pO1xuICAgIGFzc2VydC5wcm9wZXJ0eShjc2NhbGUsICdkb21haW5SYXcnKTtcbiAgICBhc3NlcnQucHJvcGVydHlWYWwoY3NjYWxlLmRvbWFpblJhdywgJ3NpZ25hbCcsXG4gICAgICBcInZsTXVsdGlEb21haW4oXFxcImJydXNoMl9zdG9yZVxcXCIsIG51bGwsIFxcXCJwcmljZVxcXCIsIFxcXCJpbnRlcnNlY3RcXFwiKVwiKTtcblxuICAgIGFzc2VydC5pc09iamVjdChvc2NhbGUuZG9tYWluKTtcbiAgICBhc3NlcnQucHJvcGVydHkob3NjYWxlLCAnZG9tYWluUmF3Jyk7XG4gICAgYXNzZXJ0LnByb3BlcnR5VmFsKG9zY2FsZS5kb21haW5SYXcsICdzaWduYWwnLCAnbnVsbCcpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGJpbmQgYm90aCBzY2FsZXMgaW4gZGlhZ29uYWwgcmVwZWF0ZWQgdmlld3MnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtb2RlbCA9IHBhcnNlUmVwZWF0TW9kZWwoe1xuICAgICAgcmVwZWF0OiB7XG4gICAgICAgIHJvdzogW1wiSG9yc2Vwb3dlclwiLCBcIkFjY2VsZXJhdGlvblwiXSxcbiAgICAgICAgY29sdW1uOiBbXCJNaWxlc19wZXJfR2FsbG9uXCIsIFwiQWNjZWxlcmF0aW9uXCJdXG4gICAgICB9LFxuICAgICAgc3BlYzoge1xuICAgICAgICBkYXRhOiB7dXJsOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgIGdyaWQ6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZXJ2YWxcIixcbiAgICAgICAgICAgIHJlc29sdmU6IFwiZ2xvYmFsXCIsXG4gICAgICAgICAgICBiaW5kOiBcInNjYWxlc1wiXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDoge3JlcGVhdDogXCJjb2x1bW5cIn0sIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIHk6IHtmaWVsZDoge3JlcGVhdDogXCJyb3dcIn0sIHR5cGU6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIGNvbG9yOiB7ZmllbGQ6IFwiT3JpZ2luXCIsIHR5cGU6IFwibm9taW5hbFwifVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gICAgbW9kZWwucGFyc2VTZWxlY3Rpb24oKTtcblxuICAgIGNvbnN0IHNjYWxlcyA9IGFzc2VtYmxlU2NhbGVzRm9yTW9kZWwobW9kZWwuY2hpbGRyZW5bM10pO1xuICAgIGFzc2VydC5pc1RydWUoc2NhbGVzLmxlbmd0aCA9PT0gMik7XG4gICAgYXNzZXJ0LnByb3BlcnR5KHNjYWxlc1swXSwgJ2RvbWFpblJhdycpO1xuICAgIGFzc2VydC5wcm9wZXJ0eShzY2FsZXNbMV0sICdkb21haW5SYXcnKTtcbiAgICBhc3NlcnQucHJvcGVydHlWYWwoc2NhbGVzWzBdLmRvbWFpblJhdywgJ3NpZ25hbCcsICdncmlkX0FjY2VsZXJhdGlvbicpO1xuICAgIGFzc2VydC5wcm9wZXJ0eVZhbChzY2FsZXNbMV0uZG9tYWluUmF3LCAnc2lnbmFsJywgJ2dyaWRfQWNjZWxlcmF0aW9uJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgbWVyZ2UgZG9tYWluUmF3IGZvciBsYXllcmVkIHZpZXdzJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBwYXJzZUNvbmNhdE1vZGVsKHtcbiAgICAgIGRhdGE6IHt1cmw6IFwiZGF0YS9zcDUwMC5jc3ZcIn0sXG4gICAgICB2Y29uY2F0OiBbXG4gICAgICAgIHtcbiAgICAgICAgICBsYXllcjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtYXJrOiBcInBvaW50XCIsXG4gICAgICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICAgICAgeDoge1xuICAgICAgICAgICAgICAgICAgZmllbGQ6IFwiZGF0ZVwiLCB0eXBlOiBcInRlbXBvcmFsXCIsXG4gICAgICAgICAgICAgICAgICBzY2FsZToge2RvbWFpbjoge3NlbGVjdGlvbjogXCJicnVzaFwifX1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHk6IHtmaWVsZDogXCJwcmljZVwiLCB0eXBlOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbWFyazogXCJhcmVhXCIsXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBicnVzaDoge3R5cGU6IFwiaW50ZXJ2YWxcIiwgZW5jb2RpbmdzOiBbXCJ4XCJdfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHtmaWVsZDogXCJkYXRlXCIsIHR5cGU6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICB5OiB7ZmllbGQ6IFwicHJpY2VcIiwgdHlwZTogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIG1vZGVsLnBhcnNlU2NhbGUoKTtcbiAgICBtb2RlbC5wYXJzZVNlbGVjdGlvbigpO1xuICAgIGNvbnN0IHNjYWxlcyA9IGFzc2VtYmxlU2NhbGVzRm9yTW9kZWwobW9kZWwuY2hpbGRyZW5bMF0pO1xuICAgIGFzc2VydC5wcm9wZXJ0eShzY2FsZXNbMF0sICdkb21haW5SYXcnKTtcbiAgICBhc3NlcnQucHJvcGVydHlWYWwoc2NhbGVzWzBdLmRvbWFpblJhdywgJ3NpZ25hbCcsICd2bEludGVydmFsRG9tYWluKFwiYnJ1c2hfc3RvcmVcIiwgbnVsbCwgXCJkYXRlXCIpJyk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/single.test.d.ts b/build/test/compile/selection/single.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/single.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/single.test.js b/build/test/compile/selection/single.test.js new file mode 100644 index 0000000000..efed0720b5 --- /dev/null +++ b/build/test/compile/selection/single.test.js @@ -0,0 +1,106 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable quotemark */ +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var single_1 = tslib_1.__importDefault(require("../../../src/compile/selection/single")); +var util_1 = require("../../util"); +describe('Single Selection', function () { + var model = util_1.parseUnitModelWithScale({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative", "bin": true }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + var selCmpts = model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "single" }, + "two": { + "type": "single", "nearest": true, + "on": "mouseover", "encodings": ["y", "color"] + } + }); + it('builds tuple signals', function () { + var oneSg = single_1.default.signals(model, selCmpts['one']); + chai_1.assert.sameDeepMembers(oneSg, [{ + name: 'one_tuple', + value: {}, + on: [{ + events: selCmpts['one'].events, + update: "datum && item().mark.marktype !== 'group' ? {unit: \"\", encodings: [], fields: [\"_vgsid_\"], values: [datum[\"_vgsid_\"]]} : null", + force: true + }] + }]); + var twoSg = single_1.default.signals(model, selCmpts['two']); + chai_1.assert.sameDeepMembers(twoSg, [{ + name: 'two_tuple', + value: {}, + on: [{ + events: selCmpts['two'].events, + update: "datum && item().mark.marktype !== 'group' ? {unit: \"\", encodings: [\"y\", \"color\"], fields: [\"Miles_per_Gallon\", \"Origin\"], values: [[(item().isVoronoi ? datum.datum : datum)[\"bin_maxbins_10_Miles_per_Gallon\"], (item().isVoronoi ? datum.datum : datum)[\"bin_maxbins_10_Miles_per_Gallon_end\"]], (item().isVoronoi ? datum.datum : datum)[\"Origin\"]], \"bin_Miles_per_Gallon\": 1} : null", + force: true + }] + }]); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, oneSg.concat(twoSg)); + }); + it('builds modify signals', function () { + var oneExpr = single_1.default.modifyExpr(model, selCmpts['one']); + chai_1.assert.equal(oneExpr, 'one_tuple, true'); + var twoExpr = single_1.default.modifyExpr(model, selCmpts['two']); + chai_1.assert.equal(twoExpr, 'two_tuple, true'); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "one_modify", + "on": [ + { + "events": { "signal": "one_tuple" }, + "update": "modify(\"one_store\", " + oneExpr + ")" + } + ] + }, + { + "name": "two_modify", + "on": [ + { + "events": { "signal": "two_tuple" }, + "update": "modify(\"two_store\", " + twoExpr + ")" + } + ] + } + ]); + }); + it('builds top-level signals', function () { + var oneSg = single_1.default.topLevelSignals(model, selCmpts['one'], []); + chai_1.assert.sameDeepMembers(oneSg, [{ + name: 'one', update: 'data(\"one_store\").length && {_vgsid_: data(\"one_store\")[0].values[0]}' + }]); + var twoSg = single_1.default.topLevelSignals(model, selCmpts['two'], []); + chai_1.assert.sameDeepMembers(twoSg, [{ + name: 'two', update: 'data(\"two_store\").length && {Miles_per_Gallon: data(\"two_store\")[0].values[0], Origin: data(\"two_store\")[0].values[1]}' + }]); + var signals = selection.assembleTopLevelSignals(model, []); + chai_1.assert.deepEqual(signals, [ + { + name: 'unit', + value: {}, + on: [{ events: 'mousemove', update: 'isTuple(group()) ? group() : unit' }] + } + ].concat(oneSg, twoSg)); + }); + it('builds unit datasets', function () { + var data = []; + chai_1.assert.sameDeepMembers(selection.assembleUnitSelectionData(model, data), [ + { name: 'one_store' }, { name: 'two_store' } + ]); + }); + it('leaves marks alone', function () { + var marks = []; + model.component.selection = { one: selCmpts['one'] }; + chai_1.assert.equal(selection.assembleUnitSelectionMarks(model, marks), marks); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL3NpbmdsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDhCQUE4QjtBQUM5Qiw2QkFBNEI7QUFFNUIsMEZBQXNFO0FBQ3RFLHlGQUEyRDtBQUMzRCxtQ0FBbUQ7QUFHbkQsUUFBUSxDQUFDLGtCQUFrQixFQUFFO0lBQzNCLElBQU0sS0FBSyxHQUFHLDhCQUF1QixDQUFDO1FBQ3BDLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFVBQVUsRUFBRTtZQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQztZQUNuRCxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDO1lBQ3RFLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUVILElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7UUFDL0UsS0FBSyxFQUFFLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQztRQUN6QixLQUFLLEVBQUU7WUFDTCxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJO1lBQ2pDLElBQUksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztTQUMvQztLQUNGLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxzQkFBc0IsRUFBRTtRQUN6QixJQUFNLEtBQUssR0FBRyxnQkFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7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bXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCBzaW5nbGUgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NpbmdsZSc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsV2l0aFNjYWxlfSBmcm9tICcuLi8uLi91dGlsJztcblxuXG5kZXNjcmliZSgnU2luZ2xlIFNlbGVjdGlvbicsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHtcbiAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYmluXCI6IHRydWV9LFxuICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBzZWxDbXB0cyA9IG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyc2VVbml0U2VsZWN0aW9uKG1vZGVsLCB7XG4gICAgXCJvbmVcIjoge1widHlwZVwiOiBcInNpbmdsZVwifSxcbiAgICBcInR3b1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJzaW5nbGVcIiwgXCJuZWFyZXN0XCI6IHRydWUsXG4gICAgICBcIm9uXCI6IFwibW91c2VvdmVyXCIsIFwiZW5jb2RpbmdzXCI6IFtcInlcIiwgXCJjb2xvclwiXVxuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyB0dXBsZSBzaWduYWxzJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb25lU2cgPSBzaW5nbGUuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ29uZSddKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKG9uZVNnLCBbe1xuICAgICAgbmFtZTogJ29uZV90dXBsZScsXG4gICAgICB2YWx1ZToge30sXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBzZWxDbXB0c1snb25lJ10uZXZlbnRzLFxuICAgICAgICB1cGRhdGU6IFwiZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyB7dW5pdDogXFxcIlxcXCIsIGVuY29kaW5nczogW10sIGZpZWxkczogW1xcXCJfdmdzaWRfXFxcIl0sIHZhbHVlczogW2RhdHVtW1xcXCJfdmdzaWRfXFxcIl1dfSA6IG51bGxcIixcbiAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgIH1dXG4gICAgfV0pO1xuXG4gICAgY29uc3QgdHdvU2cgPSBzaW5nbGUuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ3R3byddKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKHR3b1NnLCBbe1xuICAgICAgbmFtZTogJ3R3b190dXBsZScsXG4gICAgICB2YWx1ZToge30sXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBzZWxDbXB0c1sndHdvJ10uZXZlbnRzLFxuICAgICAgICB1cGRhdGU6IFwiZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyB7dW5pdDogXFxcIlxcXCIsIGVuY29kaW5nczogW1xcXCJ5XFxcIiwgXFxcImNvbG9yXFxcIl0sIGZpZWxkczogW1xcXCJNaWxlc19wZXJfR2FsbG9uXFxcIiwgXFxcIk9yaWdpblxcXCJdLCB2YWx1ZXM6IFtbKGl0ZW0oKS5pc1Zvcm9ub2kgPyBkYXR1bS5kYXR1bSA6IGRhdHVtKVtcXFwiYmluX21heGJpbnNfMTBfTWlsZXNfcGVyX0dhbGxvblxcXCJdLCAoaXRlbSgpLmlzVm9yb25vaSA/IGRhdHVtLmRhdHVtIDogZGF0dW0pW1xcXCJiaW5fbWF4Ymluc18xMF9NaWxlc19wZXJfR2FsbG9uX2VuZFxcXCJdXSwgKGl0ZW0oKS5pc1Zvcm9ub2kgPyBkYXR1bS5kYXR1bSA6IGRhdHVtKVtcXFwiT3JpZ2luXFxcIl1dLCBcXFwiYmluX01pbGVzX3Blcl9HYWxsb25cXFwiOiAxfSA6IG51bGxcIixcbiAgICAgICAgZm9yY2U6IHRydWVcbiAgICAgIH1dXG4gICAgfV0pO1xuXG4gICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLCBvbmVTZy5jb25jYXQodHdvU2cpKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBtb2RpZnkgc2lnbmFscycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG9uZUV4cHIgPSBzaW5nbGUubW9kaWZ5RXhwcihtb2RlbCwgc2VsQ21wdHNbJ29uZSddKTtcbiAgICBhc3NlcnQuZXF1YWwob25lRXhwciwgJ29uZV90dXBsZSwgdHJ1ZScpO1xuXG4gICAgY29uc3QgdHdvRXhwciA9IHNpbmdsZS5tb2RpZnlFeHByKG1vZGVsLCBzZWxDbXB0c1sndHdvJ10pO1xuICAgIGFzc2VydC5lcXVhbCh0d29FeHByLCAndHdvX3R1cGxlLCB0cnVlJyk7XG5cbiAgICBjb25zdCBzaWduYWxzID0gc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX21vZGlmeVwiLFxuICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJvbmVfdHVwbGVcIn0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBgbW9kaWZ5KFxcXCJvbmVfc3RvcmVcXFwiLCAke29uZUV4cHJ9KWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19tb2RpZnlcIixcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwidHdvX3R1cGxlXCJ9LFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogYG1vZGlmeShcXFwidHdvX3N0b3JlXFxcIiwgJHt0d29FeHByfSlgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdidWlsZHMgdG9wLWxldmVsIHNpZ25hbHMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBvbmVTZyA9IHNpbmdsZS50b3BMZXZlbFNpZ25hbHMobW9kZWwsIHNlbENtcHRzWydvbmUnXSwgW10pO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMob25lU2csIFt7XG4gICAgICBuYW1lOiAnb25lJywgdXBkYXRlOiAnZGF0YShcXFwib25lX3N0b3JlXFxcIikubGVuZ3RoICYmIHtfdmdzaWRfOiBkYXRhKFxcXCJvbmVfc3RvcmVcXFwiKVswXS52YWx1ZXNbMF19J1xuICAgIH1dKTtcblxuICAgIGNvbnN0IHR3b1NnID0gc2luZ2xlLnRvcExldmVsU2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ3R3byddLCBbXSk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyh0d29TZywgW3tcbiAgICAgIG5hbWU6ICd0d28nLCB1cGRhdGU6ICdkYXRhKFxcXCJ0d29fc3RvcmVcXFwiKS5sZW5ndGggJiYge01pbGVzX3Blcl9HYWxsb246IGRhdGEoXFxcInR3b19zdG9yZVxcXCIpWzBdLnZhbHVlc1swXSwgT3JpZ2luOiBkYXRhKFxcXCJ0d29fc3RvcmVcXFwiKVswXS52YWx1ZXNbMV19J1xuICAgIH1dKTtcblxuICAgIGNvbnN0IHNpZ25hbHMgPSBzZWxlY3Rpb24uYXNzZW1ibGVUb3BMZXZlbFNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHNpZ25hbHMsIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ3VuaXQnLFxuICAgICAgICB2YWx1ZToge30sXG4gICAgICAgIG9uOiBbe2V2ZW50czogJ21vdXNlbW92ZScsIHVwZGF0ZTogJ2lzVHVwbGUoZ3JvdXAoKSkgPyBncm91cCgpIDogdW5pdCd9XVxuICAgICAgfVxuICAgIF0uY29uY2F0KG9uZVNnLCB0d29TZykpO1xuICB9KTtcblxuICBpdCgnYnVpbGRzIHVuaXQgZGF0YXNldHMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBkYXRhOiBhbnlbXSA9IFtdO1xuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnMoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvbkRhdGEobW9kZWwsIGRhdGEpLCBbXG4gICAgICB7bmFtZTogJ29uZV9zdG9yZSd9LCB7bmFtZTogJ3R3b19zdG9yZSd9XG4gICAgXSk7XG4gIH0pO1xuXG4gIGl0KCdsZWF2ZXMgbWFya3MgYWxvbmUnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBtYXJrczogYW55W10gPSBbXTtcbiAgICBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0ge29uZTogc2VsQ21wdHNbJ29uZSddfTtcbiAgICBhc3NlcnQuZXF1YWwoc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvbk1hcmtzKG1vZGVsLCBtYXJrcyksIG1hcmtzKTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/selection/timeunit.test.d.ts b/build/test/compile/selection/timeunit.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/timeunit.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/timeunit.test.js b/build/test/compile/selection/timeunit.test.js new file mode 100644 index 0000000000..89fe0ffbe3 --- /dev/null +++ b/build/test/compile/selection/timeunit.test.js @@ -0,0 +1,124 @@ +"use strict"; +/* tslint:disable:quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var assemble_1 = require("../../../src/compile/data/assemble"); +var optimize_1 = require("../../../src/compile/data/optimize"); +var timeunit_1 = require("../../../src/compile/data/timeunit"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var util_1 = require("../../util"); +function getData(model) { + optimize_1.optimizeDataflow(model.component.data); + return assemble_1.assembleRootData(model.component.data, {}); +} +function getModel(unit2) { + var model = util_1.parseModel({ + "data": { "values": [ + { "date": "Sun, 01 Jan 2012 23:00:01", "price": 150 }, + { "date": "Sun, 02 Jan 2012 00:10:02", "price": 100 }, + { "date": "Sun, 02 Jan 2012 01:20:03", "price": 170 }, + { "date": "Sun, 02 Jan 2012 02:30:04", "price": 165 }, + { "date": "Sun, 02 Jan 2012 03:40:05", "price": 200 } + ] }, + "hconcat": [{ + "mark": "point", + "selection": { + "two": { "type": "single", "encodings": ["x", "y"] } + }, + "encoding": { + "x": { + "field": "date", + "type": "temporal", + "timeUnit": "seconds" + }, + "y": { "field": "price", "type": "quantitative" } + } + }, unit2] + }); + model.parse(); + return model; +} +describe('Selection time unit', function () { + it('dataflow nodes are constructed', function () { + var model = util_1.parseUnitModel({ + "mark": "point", + "encoding": { + "x": { "field": "date", "type": "temporal", "timeUnit": "seconds" }, + "y": { "field": "date", "type": "temporal", "timeUnit": "minutes" } + } + }); + var selCmpts = model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "single" }, + "two": { "type": "single", "encodings": ["x", "y"] } + }); + chai_1.assert.isUndefined(selCmpts['one'].timeUnit); + chai_1.assert.instanceOf(selCmpts['two'].timeUnit, timeunit_1.TimeUnitNode); + var as = selCmpts['two'].timeUnit.assemble().map(function (tx) { return tx.as; }); + chai_1.assert.sameDeepMembers(as, ['seconds_date', 'minutes_date']); + }); + it('is added with conditional encodings', function () { + var model = getModel({ + "mark": "point", + "encoding": { + "x": { + "field": "date", + "type": "temporal", + "timeUnit": "minutes" + }, + "y": { "field": "price", "type": "quantitative" }, + "color": { + "condition": { "selection": "two", "value": "goldenrod" }, + "value": "steelblue" + } + } + }); + var data2 = getData(model).filter(function (d) { return d.name === 'data_2'; })[0].transform; + chai_1.assert.equal(data2.filter(function (tx) { return tx.type === 'formula' && tx.as === 'seconds_date'; }).length, 1); + }); + it('is added before selection filters', function () { + var model = getModel({ + "transform": [{ "filter": { "selection": "two" } }], + "mark": "point", + "encoding": { + "x": { + "field": "date", + "type": "temporal", + "timeUnit": "minutes" + }, + "y": { "field": "price", "type": "quantitative" } + } + }); + var data2 = getData(model).filter(function (d) { return d.name === 'data_2'; })[0].transform; + var tuIdx = -1; + var selIdx = -1; + data2.forEach(function (tx, idx) { + if (tx.type === 'formula' && tx.as === 'seconds_date') { + tuIdx = idx; + } + else if (tx.type === 'filter' && tx.expr.indexOf('vlSingle') >= 0) { + selIdx = idx; + } + }); + chai_1.assert.notEqual(tuIdx, -1); + chai_1.assert.notEqual(selIdx, -1); + chai_1.assert.isAbove(selIdx, tuIdx); + }); + it('removes duplicate time unit formulae', function () { + var model = getModel({ + "transform": [{ "filter": { "selection": "two" } }], + "mark": "point", + "encoding": { + "x": { + "field": "date", + "type": "temporal", + "timeUnit": "seconds" + }, + "y": { "field": "price", "type": "quantitative" } + } + }); + var data2 = getData(model).filter(function (d) { return d.name === 'data_2'; })[0].transform; + chai_1.assert.equal(data2.filter(function (tx) { return tx.type === 'formula' && tx.as === 'seconds_date'; }).length, 1); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvY29tcGlsZS9zZWxlY3Rpb24vdGltZXVuaXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsOEJBQThCOzs7QUFFOUIsNkJBQTRCO0FBQzVCLCtEQUFvRTtBQUNwRSwrREFBb0U7QUFDcEUsK0RBQWdFO0FBRWhFLDBGQUFzRTtBQUV0RSxtQ0FBc0Q7QUFFdEQsaUJBQWlCLEtBQVk7SUFDM0IsMkJBQWdCLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxPQUFPLDJCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxrQkFBa0IsS0FBeUI7SUFDekMsSUFBTSxLQUFLLEdBQUcsaUJBQVUsQ0FBQztRQUN2QixNQUFNLEVBQUUsRUFBQyxRQUFRLEVBQUU7Z0JBQ2pCLEVBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUM7Z0JBQ2xELEVBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUM7Z0JBQ2xELEVBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUM7Z0JBQ2xELEVBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUM7Z0JBQ2xELEVBQUMsTUFBTSxFQUFFLDJCQUEyQixFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUM7YUFDbkQsRUFBQztRQUNGLFNBQVMsRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLFdBQVcsRUFBRTtvQkFDWCxLQUFLLEVBQUUsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBQztpQkFDbkQ7Z0JBQ0Qs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IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge2Fzc2VtYmxlUm9vdERhdGF9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvYXNzZW1ibGUnO1xuaW1wb3J0IHtvcHRpbWl6ZURhdGFmbG93fSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL29wdGltaXplJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3RpbWV1bml0JztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL21vZGVsJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7Tm9ybWFsaXplZFVuaXRTcGVjfSBmcm9tICcuLi8uLi8uLi9zcmMvc3BlYyc7XG5pbXBvcnQge3BhcnNlTW9kZWwsIHBhcnNlVW5pdE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZnVuY3Rpb24gZ2V0RGF0YShtb2RlbDogTW9kZWwpIHtcbiAgb3B0aW1pemVEYXRhZmxvdyhtb2RlbC5jb21wb25lbnQuZGF0YSk7XG4gIHJldHVybiBhc3NlbWJsZVJvb3REYXRhKG1vZGVsLmNvbXBvbmVudC5kYXRhLCB7fSk7XG59XG5cbmZ1bmN0aW9uIGdldE1vZGVsKHVuaXQyOiBOb3JtYWxpemVkVW5pdFNwZWMpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZU1vZGVsKHtcbiAgICBcImRhdGFcIjoge1widmFsdWVzXCI6IFtcbiAgICAgIHtcImRhdGVcIjogXCJTdW4sIDAxIEphbiAyMDEyIDIzOjAwOjAxXCIsXCJwcmljZVwiOiAxNTB9LFxuICAgICAge1wiZGF0ZVwiOiBcIlN1biwgMDIgSmFuIDIwMTIgMDA6MTA6MDJcIixcInByaWNlXCI6IDEwMH0sXG4gICAgICB7XCJkYXRlXCI6IFwiU3VuLCAwMiBKYW4gMjAxMiAwMToyMDowM1wiLFwicHJpY2VcIjogMTcwfSxcbiAgICAgIHtcImRhdGVcIjogXCJTdW4sIDAyIEphbiAyMDEyIDAyOjMwOjA0XCIsXCJwcmljZVwiOiAxNjV9LFxuICAgICAge1wiZGF0ZVwiOiBcIlN1biwgMDIgSmFuIDIwMTIgMDM6NDA6MDVcIixcInByaWNlXCI6IDIwMH1cbiAgICBdfSxcbiAgICBcImhjb25jYXRcIjogW3tcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcInNlbGVjdGlvblwiOiB7XG4gICAgICAgIFwidHdvXCI6IHtcInR5cGVcIjogXCJzaW5nbGVcIiwgXCJlbmNvZGluZ3NcIjogW1wieFwiLCBcInlcIl19XG4gICAgICB9LFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgXCJmaWVsZFwiOiBcImRhdGVcIixcbiAgICAgICAgICBcInR5cGVcIjogXCJ0ZW1wb3JhbFwiLFxuICAgICAgICAgIFwidGltZVVuaXRcIjogXCJzZWNvbmRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9LCB1bml0Ml1cbiAgfSk7XG4gIG1vZGVsLnBhcnNlKCk7XG4gIHJldHVybiBtb2RlbDtcbn1cblxuZGVzY3JpYmUoJ1NlbGVjdGlvbiB0aW1lIHVuaXQnLCBmdW5jdGlvbigpIHtcbiAgaXQoJ2RhdGFmbG93IG5vZGVzIGFyZSBjb25zdHJ1Y3RlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCIsIFwidGltZVVuaXRcIjogXCJzZWNvbmRzXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCIsIFwidGltZVVuaXRcIjogXCJtaW51dGVzXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3Qgc2VsQ21wdHMgPSBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0gc2VsZWN0aW9uLnBhcnNlVW5pdFNlbGVjdGlvbihtb2RlbCwge1xuICAgICAgXCJvbmVcIjoge1widHlwZVwiOiBcInNpbmdsZVwifSxcbiAgICAgIFwidHdvXCI6IHtcInR5cGVcIjogXCJzaW5nbGVcIiwgXCJlbmNvZGluZ3NcIjogW1wieFwiLCBcInlcIl19XG4gICAgfSk7XG5cbiAgICBhc3NlcnQuaXNVbmRlZmluZWQoc2VsQ21wdHNbJ29uZSddLnRpbWVVbml0KTtcbiAgICBhc3NlcnQuaW5zdGFuY2VPZihzZWxDbXB0c1sndHdvJ10udGltZVVuaXQsIFRpbWVVbml0Tm9kZSk7XG5cbiAgICBjb25zdCBhcyA9IHNlbENtcHRzWyd0d28nXS50aW1lVW5pdC5hc3NlbWJsZSgpLm1hcCgodHgpID0+IHR4LmFzKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKGFzLCBbJ3NlY29uZHNfZGF0ZScsICdtaW51dGVzX2RhdGUnXSk7XG4gIH0pO1xuXG4gIGl0KCdpcyBhZGRlZCB3aXRoIGNvbmRpdGlvbmFsIGVuY29kaW5ncycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWwoe1xuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1xuICAgICAgICAgIFwiZmllbGRcIjogXCJkYXRlXCIsXG4gICAgICAgICAgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIixcbiAgICAgICAgICBcInRpbWVVbml0XCI6IFwibWludXRlc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICBcImNvbmRpdGlvblwiOiB7XCJzZWxlY3Rpb25cIjogXCJ0d29cIiwgXCJ2YWx1ZVwiOiBcImdvbGRlbnJvZFwifSxcbiAgICAgICAgICBcInZhbHVlXCI6IFwic3RlZWxibHVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YTIgPSBnZXREYXRhKG1vZGVsKS5maWx0ZXIoKGQpID0+IGQubmFtZSA9PT0gJ2RhdGFfMicpWzBdLnRyYW5zZm9ybTtcbiAgICBhc3NlcnQuZXF1YWwoZGF0YTIuZmlsdGVyKCh0eCkgPT4gdHgudHlwZSA9PT0gJ2Zvcm11bGEnICYmIHR4LmFzID09PSAnc2Vjb25kc19kYXRlJykubGVuZ3RoLCAxKTtcbiAgfSk7XG5cbiAgaXQoJ2lzIGFkZGVkIGJlZm9yZSBzZWxlY3Rpb24gZmlsdGVycycsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG1vZGVsID0gZ2V0TW9kZWwoe1xuICAgICAgXCJ0cmFuc2Zvcm1cIjogW3tcImZpbHRlclwiOiB7XCJzZWxlY3Rpb25cIjogXCJ0d29cIn19XSxcbiAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICBcImZpZWxkXCI6IFwiZGF0ZVwiLFxuICAgICAgICAgIFwidHlwZVwiOiBcInRlbXBvcmFsXCIsXG4gICAgICAgICAgXCJ0aW1lVW5pdFwiOiBcIm1pbnV0ZXNcIlxuICAgICAgICB9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgZGF0YTIgPSBnZXREYXRhKG1vZGVsKS5maWx0ZXIoKGQpID0+IGQubmFtZSA9PT0gJ2RhdGFfMicpWzBdLnRyYW5zZm9ybTtcbiAgICBsZXQgdHVJZHggPSAtMTtcbiAgICBsZXQgc2VsSWR4ID0gLTE7XG5cbiAgICBkYXRhMi5mb3JFYWNoKCh0eCwgaWR4KSA9PiB7XG4gICAgICBpZiAodHgudHlwZSA9PT0gJ2Zvcm11bGEnICYmIHR4LmFzID09PSAnc2Vjb25kc19kYXRlJykge1xuICAgICAgICB0dUlkeCA9IGlkeDtcbiAgICAgIH0gZWxzZSBpZiAodHgudHlwZSA9PT0gJ2ZpbHRlcicgJiYgdHguZXhwci5pbmRleE9mKCd2bFNpbmdsZScpID49IDApIHtcbiAgICAgICAgc2VsSWR4ID0gaWR4O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXNzZXJ0Lm5vdEVxdWFsKHR1SWR4LCAtMSk7XG4gICAgYXNzZXJ0Lm5vdEVxdWFsKHNlbElkeCwgLTEpO1xuICAgIGFzc2VydC5pc0Fib3ZlKHNlbElkeCwgdHVJZHgpO1xuICB9KTtcblxuICBpdCgncmVtb3ZlcyBkdXBsaWNhdGUgdGltZSB1bml0IGZvcm11bGFlJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbW9kZWwgPSBnZXRNb2RlbCh7XG4gICAgICBcInRyYW5zZm9ybVwiOiBbe1wiZmlsdGVyXCI6IHtcInNlbGVjdGlvblwiOiBcInR3b1wifX1dLFxuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1xuICAgICAgICAgIFwiZmllbGRcIjogXCJkYXRlXCIsXG4gICAgICAgICAgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIixcbiAgICAgICAgICBcInRpbWVVbml0XCI6IFwic2Vjb25kc1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBkYXRhMiA9IGdldERhdGEobW9kZWwpLmZpbHRlcigoZCkgPT4gZC5uYW1lID09PSAnZGF0YV8yJylbMF0udHJhbnNmb3JtO1xuICAgIGFzc2VydC5lcXVhbChkYXRhMi5maWx0ZXIoKHR4KSA9PiB0eC50eXBlID09PSAnZm9ybXVsYScgJiYgdHguYXMgPT09ICdzZWNvbmRzX2RhdGUnKS5sZW5ndGgsIDEpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/selection/toggle.test.d.ts b/build/test/compile/selection/toggle.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/toggle.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/toggle.test.js b/build/test/compile/selection/toggle.test.js new file mode 100644 index 0000000000..2949cfcc82 --- /dev/null +++ b/build/test/compile/selection/toggle.test.js @@ -0,0 +1,88 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var toggle_1 = tslib_1.__importDefault(require("../../../src/compile/selection/transforms/toggle")); +var util_1 = require("../../util"); +describe('Toggle Selection Transform', function () { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + var selCmpts = model.component.selection = selection.parseUnitSelection(model, { + "one": { "type": "multi" }, + "two": { + "type": "multi", "resolve": "union", + "on": "mouseover", "toggle": "event.ctrlKey", "encodings": ["y", "color"] + }, + "three": { "type": "multi", "toggle": false }, + "four": { "type": "multi", "toggle": null }, + "five": { "type": "single" }, + "six": { "type": "interval" } + }); + it('identifies transform invocation', function () { + chai_1.assert.isNotFalse(toggle_1.default.has(selCmpts['one'])); + chai_1.assert.isNotFalse(toggle_1.default.has(selCmpts['two'])); + chai_1.assert.isNotTrue(toggle_1.default.has(selCmpts['three'])); + chai_1.assert.isNotTrue(toggle_1.default.has(selCmpts['four'])); + chai_1.assert.isNotTrue(toggle_1.default.has(selCmpts['five'])); + chai_1.assert.isNotTrue(toggle_1.default.has(selCmpts['six'])); + }); + it('builds toggle signals', function () { + var oneSg = toggle_1.default.signals(model, selCmpts['one'], []); + chai_1.assert.sameDeepMembers(oneSg, [{ + name: 'one_toggle', + value: false, + on: [{ + events: selCmpts['one'].events, + update: 'event.shiftKey' + }] + }]); + var twoSg = toggle_1.default.signals(model, selCmpts['two'], []); + chai_1.assert.sameDeepMembers(twoSg, [{ + name: 'two_toggle', + value: false, + on: [{ + events: selCmpts['two'].events, + update: 'event.ctrlKey' + }] + }]); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, oneSg.concat(twoSg)); + }); + it('builds modify expr', function () { + var oneExpr = toggle_1.default.modifyExpr(model, selCmpts['one'], ''); + chai_1.assert.equal(oneExpr, 'one_toggle ? null : one_tuple, one_toggle ? null : true, one_toggle ? one_tuple : null'); + var twoExpr = toggle_1.default.modifyExpr(model, selCmpts['two'], ''); + chai_1.assert.equal(twoExpr, 'two_toggle ? null : two_tuple, two_toggle ? null : {unit: \"\"}, two_toggle ? two_tuple : null'); + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "one_modify", + "on": [ + { + "events": { "signal": "one_tuple" }, + "update": "modify(\"one_store\", " + oneExpr + ")" + } + ] + }, + { + "name": "two_modify", + "on": [ + { + "events": { "signal": "two_tuple" }, + "update": "modify(\"two_store\", " + twoExpr + ")" + } + ] + } + ]); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL3RvZ2dsZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMEZBQXNFO0FBQ3RFLG9HQUFzRTtBQUN0RSxtQ0FBMEM7QUFFMUMsUUFBUSxDQUFDLDRCQUE0QixFQUFFO0lBQ3JDLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7UUFDM0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ25ELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFDO1lBQ3pELE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFO1FBQy9FLEtBQUssRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUM7UUFDeEIsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTztZQUNuQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQztTQUMxRTtRQUNELE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQztRQUMzQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsT0FB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QUMsNEJBQTRCLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGFBQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUU7WUFDakM7Z0JBQ0UsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLElBQUksRUFBRTtvQkFDSjt3QkFDRSxRQUFRLEVBQUUsRUFBQyxRQUFRLEVBQUUsV0FBVyxFQUFDO3dCQUNqQyxRQUFRLEVBQUUsMkJBQXlCLE9BQU8sTUFBRztxQkFDOUM7aUJBQ0Y7YUFDRjtZQUNEO2dCQUNFLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsUUFBUSxFQUFFLEVBQUMsUUFBUSxFQUFFLFdBQVcsRUFBQzt3QkFDakMsUUFBUSxFQUFFLDJCQUF5QixPQUFPLE1BQUc7cUJBQzlDO2lCQUNGO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB0b2dnbGUgZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvdG9nZ2xlJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnVG9nZ2xlIFNlbGVjdGlvbiBUcmFuc2Zvcm0nLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgXCJtYXJrXCI6IFwiY2lyY2xlXCIsXG4gICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgIH1cbiAgfSk7XG5cbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICBjb25zdCBzZWxDbXB0cyA9IG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyc2VVbml0U2VsZWN0aW9uKG1vZGVsLCB7XG4gICAgXCJvbmVcIjoge1widHlwZVwiOiBcIm11bHRpXCJ9LFxuICAgIFwidHdvXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcIm11bHRpXCIsIFwicmVzb2x2ZVwiOiBcInVuaW9uXCIsXG4gICAgICBcIm9uXCI6IFwibW91c2VvdmVyXCIsIFwidG9nZ2xlXCI6IFwiZXZlbnQuY3RybEtleVwiLCBcImVuY29kaW5nc1wiOiBbXCJ5XCIsIFwiY29sb3JcIl1cbiAgICB9LFxuICAgIFwidGhyZWVcIjoge1widHlwZVwiOiBcIm11bHRpXCIsIFwidG9nZ2xlXCI6IGZhbHNlfSxcbiAgICBcImZvdXJcIjoge1widHlwZVwiOiBcIm11bHRpXCIsIFwidG9nZ2xlXCI6IG51bGx9LFxuICAgIFwiZml2ZVwiOiB7XCJ0eXBlXCI6IFwic2luZ2xlXCJ9LFxuICAgIFwic2l4XCI6IHtcInR5cGVcIjogXCJpbnRlcnZhbFwifVxuICB9KTtcblxuICBpdCgnaWRlbnRpZmllcyB0cmFuc2Zvcm0gaW52b2NhdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgIGFzc2VydC5pc05vdEZhbHNlKHRvZ2dsZS5oYXMoc2VsQ21wdHNbJ29uZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90RmFsc2UodG9nZ2xlLmhhcyhzZWxDbXB0c1sndHdvJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RUcnVlKHRvZ2dsZS5oYXMoc2VsQ21wdHNbJ3RocmVlJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RUcnVlKHRvZ2dsZS5oYXMoc2VsQ21wdHNbJ2ZvdXInXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUodG9nZ2xlLmhhcyhzZWxDbXB0c1snZml2ZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZSh0b2dnbGUuaGFzKHNlbENtcHRzWydzaXgnXSkpO1xuICB9KTtcblxuICBpdCgnYnVpbGRzIHRvZ2dsZSBzaWduYWxzJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgb25lU2cgPSB0b2dnbGUuc2lnbmFscyhtb2RlbCwgc2VsQ21wdHNbJ29uZSddLCBbXSk7XG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVycyhvbmVTZywgW3tcbiAgICAgIG5hbWU6ICdvbmVfdG9nZ2xlJyxcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IHNlbENtcHRzWydvbmUnXS5ldmVudHMsXG4gICAgICAgIHVwZGF0ZTogJ2V2ZW50LnNoaWZ0S2V5J1xuICAgICAgfV1cbiAgICB9XSk7XG5cbiAgICBjb25zdCB0d29TZyA9IHRvZ2dsZS5zaWduYWxzKG1vZGVsLCBzZWxDbXB0c1sndHdvJ10sIFtdKTtcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzKHR3b1NnLCBbe1xuICAgICAgbmFtZTogJ3R3b190b2dnbGUnLFxuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czogc2VsQ21wdHNbJ3R3byddLmV2ZW50cyxcbiAgICAgICAgdXBkYXRlOiAnZXZlbnQuY3RybEtleSdcbiAgICAgIH1dXG4gICAgfV0pO1xuXG4gICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLCBvbmVTZy5jb25jYXQodHdvU2cpKTtcbiAgfSk7XG5cbiAgaXQoJ2J1aWxkcyBtb2RpZnkgZXhwcicsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IG9uZUV4cHIgPSB0b2dnbGUubW9kaWZ5RXhwcihtb2RlbCwgc2VsQ21wdHNbJ29uZSddLCAnJyk7XG4gICAgYXNzZXJ0LmVxdWFsKG9uZUV4cHIsICdvbmVfdG9nZ2xlID8gbnVsbCA6IG9uZV90dXBsZSwgb25lX3RvZ2dsZSA/IG51bGwgOiB0cnVlLCBvbmVfdG9nZ2xlID8gb25lX3R1cGxlIDogbnVsbCcpO1xuXG4gICAgY29uc3QgdHdvRXhwciA9IHRvZ2dsZS5tb2RpZnlFeHByKG1vZGVsLCBzZWxDbXB0c1sndHdvJ10sICcnKTtcbiAgICBhc3NlcnQuZXF1YWwodHdvRXhwciwgJ3R3b190b2dnbGUgPyBudWxsIDogdHdvX3R1cGxlLCB0d29fdG9nZ2xlID8gbnVsbCA6IHt1bml0OiBcXFwiXFxcIn0sIHR3b190b2dnbGUgPyB0d29fdHVwbGUgOiBudWxsJyk7XG5cbiAgICBjb25zdCBzaWduYWxzID0gc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgIHtcbiAgICAgICAgXCJuYW1lXCI6IFwib25lX21vZGlmeVwiLFxuICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJvbmVfdHVwbGVcIn0sXG4gICAgICAgICAgICBcInVwZGF0ZVwiOiBgbW9kaWZ5KFxcXCJvbmVfc3RvcmVcXFwiLCAke29uZUV4cHJ9KWBcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwibmFtZVwiOiBcInR3b19tb2RpZnlcIixcbiAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwidHdvX3R1cGxlXCJ9LFxuICAgICAgICAgICAgXCJ1cGRhdGVcIjogYG1vZGlmeShcXFwidHdvX3N0b3JlXFxcIiwgJHt0d29FeHByfSlgXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/compile/selection/translate.test.d.ts b/build/test/compile/selection/translate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/translate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/translate.test.js b/build/test/compile/selection/translate.test.js new file mode 100644 index 0000000000..1278b4721b --- /dev/null +++ b/build/test/compile/selection/translate.test.js @@ -0,0 +1,210 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var vega_event_selector_1 = require("vega-event-selector"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var translate_1 = tslib_1.__importDefault(require("../../../src/compile/selection/transforms/translate")); +var util_1 = require("../../util"); +function getModel(xscale, yscale) { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative", "scale": { "type": xscale || "linear" } }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative", "scale": { "type": yscale || "linear" } }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + var selCmpts = selection.parseUnitSelection(model, { + "one": { + "type": "single" + }, + "two": { + "type": "multi" + }, + "three": { + "type": "interval", + "translate": false + }, + "four": { + "type": "interval" + }, + "five": { + "type": "interval", + "translate": "[mousedown, mouseup] > mousemove, [keydown, keyup] > touchmove" + }, + "six": { + "type": "interval", + "bind": "scales" + }, + "seven": { + "type": "interval", + "translate": null + } + }); + return { model: model, selCmpts: selCmpts }; +} +describe('Translate Selection Transform', function () { + it('identifies transform invocation', function () { + var _a = getModel(), _model = _a.model, selCmpts = _a.selCmpts; + chai_1.assert.isNotTrue(translate_1.default.has(selCmpts['one'])); + chai_1.assert.isNotTrue(translate_1.default.has(selCmpts['two'])); + chai_1.assert.isNotTrue(translate_1.default.has(selCmpts['three'])); + chai_1.assert.isNotFalse(translate_1.default.has(selCmpts['four'])); + chai_1.assert.isNotFalse(translate_1.default.has(selCmpts['five'])); + chai_1.assert.isNotFalse(translate_1.default.has(selCmpts['six'])); + chai_1.assert.isNotTrue(translate_1.default.has(selCmpts['seven'])); + }); + describe('Anchor/Delta signals', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + it('builds them for default invocation', function () { + model.component.selection = { four: selCmpts['four'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "four_translate_anchor", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('@four_brush:mousedown', 'scope'), + "update": "{x: x(unit), y: y(unit), extent_x: slice(four_x), extent_y: slice(four_y)}" + } + ] + }, + { + "name": "four_translate_delta", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('[@four_brush:mousedown, window:mouseup] > window:mousemove!', 'scope'), + "update": "{x: four_translate_anchor.x - x(unit), y: four_translate_anchor.y - y(unit)}" + } + ] + } + ]); + }); + it('builds them for custom events', function () { + model.component.selection = { five: selCmpts['five'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "five_translate_anchor", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('@five_brush:mousedown, @five_brush:keydown', 'scope'), + "update": "{x: x(unit), y: y(unit), extent_x: slice(five_x), extent_y: slice(five_y)}" + } + ] + }, + { + "name": "five_translate_delta", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('[@five_brush:mousedown, mouseup] > mousemove, [@five_brush:keydown, keyup] > touchmove', 'scope'), + "update": "{x: five_translate_anchor.x - x(unit), y: five_translate_anchor.y - y(unit)}" + } + ] + } + ]); + }); + it('builds them for scale-bound intervals', function () { + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "six_translate_anchor", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('mousedown', 'scope'), + "update": "{x: x(unit), y: y(unit), extent_x: domain(\"x\"), extent_y: domain(\"y\")}" + } + ] + }, + { + "name": "six_translate_delta", + "value": {}, + "on": [ + { + "events": vega_event_selector_1.selector('[mousedown, window:mouseup] > window:mousemove!', 'scope'), + "update": "{x: six_translate_anchor.x - x(unit), y: six_translate_anchor.y - y(unit)}" + } + ] + } + ]); + }); + }); + describe('Translate Signal', function () { + it('always builds panLinear exprs for brushes', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { four: selCmpts['four'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_x'; })[0].on, [ + { + "events": { "signal": "four_translate_delta" }, + "update": "clampRange(panLinear(four_translate_anchor.extent_x, four_translate_delta.x / span(four_translate_anchor.extent_x)), 0, width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_y'; })[0].on, [ + { + "events": { "signal": "four_translate_delta" }, + "update": "clampRange(panLinear(four_translate_anchor.extent_y, four_translate_delta.y / span(four_translate_anchor.extent_y)), 0, height)" + } + ]); + var model2 = getModel('log', 'pow').model; + model2.component.selection = { four: selCmpts['four'] }; + signals = selection.assembleUnitSelectionSignals(model2, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_x'; })[0].on, [ + { + "events": { "signal": "four_translate_delta" }, + "update": "clampRange(panLinear(four_translate_anchor.extent_x, four_translate_delta.x / span(four_translate_anchor.extent_x)), 0, width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_y'; })[0].on, [ + { + "events": { "signal": "four_translate_delta" }, + "update": "clampRange(panLinear(four_translate_anchor.extent_y, four_translate_delta.y / span(four_translate_anchor.extent_y)), 0, height)" + } + ]); + }); + it('builds panLinear exprs for scale-bound intervals', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Horsepower'; })[0].on, [ + { + "events": { "signal": "six_translate_delta" }, + "update": "panLinear(six_translate_anchor.extent_x, -six_translate_delta.x / width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Miles_per_Gallon'; })[0].on, [ + { + "events": { "signal": "six_translate_delta" }, + "update": "panLinear(six_translate_anchor.extent_y, six_translate_delta.y / height)" + } + ]); + }); + it('builds panLog/panPow exprs for scale-bound intervals', function () { + var _a = getModel('log', 'pow'), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Horsepower'; })[0].on, [ + { + "events": { "signal": "six_translate_delta" }, + "update": "panLog(six_translate_anchor.extent_x, -six_translate_delta.x / width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Miles_per_Gallon'; })[0].on, [ + { + "events": { "signal": "six_translate_delta" }, + "update": "panPow(six_translate_anchor.extent_y, six_translate_delta.y / height, 1)" + } + ]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zbGF0ZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4QkFBOEI7OztBQUU5Qiw2QkFBNEI7QUFDNUIsMkRBQThEO0FBQzlELDBGQUFzRTtBQUN0RSwwR0FBNEU7QUFFNUUsbUNBQTBDO0FBRTFDLGtCQUFrQixNQUFrQixFQUFFLE1BQWtCO0lBQ3RELElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7UUFDM0IsTUFBTSxFQUFFLFFBQVE7UUFDaEIsVUFBVSxFQUFFO1lBQ1YsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksUUFBUSxFQUFDLEVBQUM7WUFDMUYsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGtCQUFrQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUMsRUFBQztZQUNoRyxPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7U0FDaEQ7S0FDRixDQUFDLENBQUM7SUFFSCxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkIsSUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRTtRQUNuRCxLQUFLLEVBQUU7WUFDTCxNQUFNLEVBQUUsUUFBUTtTQUNqQjtRQUNELEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxPQUFPO1NBQ2hCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsTUFBTSxFQUFFLFVBQVU7WUFDbEIsV0FBVyxFQUFFLEtBQUs7U0FDbkI7UUFDRCxNQUFNLEVBQUU7WUFDTixNQUFNLEVBQUUsVUFBVTtTQUNuQjtR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LGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLHNCQUFzQixFQUFqQyxDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUN4RjtvQkFDRSxRQUFRLEVBQUUsRUFBQyxRQUFRLEVBQUUscUJBQXFCLEVBQUM7b0JBQzNDLFFBQVEsRUFBRSwwRUFBMEU7aUJBQ3JGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgcXVvdGVtYXJrICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7c2VsZWN0b3IgYXMgcGFyc2VTZWxlY3Rvcn0gZnJvbSAndmVnYS1ldmVudC1zZWxlY3Rvcic7XG5pbXBvcnQgKiBhcyBzZWxlY3Rpb24gZnJvbSAnLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQgdHJhbnNsYXRlIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3RyYW5zbGF0ZSc7XG5pbXBvcnQge1NjYWxlVHlwZX0gZnJvbSAnLi4vLi4vLi4vc3JjL3NjYWxlJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5mdW5jdGlvbiBnZXRNb2RlbCh4c2NhbGU/OiBTY2FsZVR5cGUsIHlzY2FsZT86IFNjYWxlVHlwZSkge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICBcIm1hcmtcIjogXCJjaXJjbGVcIixcbiAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIkhvcnNlcG93ZXJcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzY2FsZVwiOiB7XCJ0eXBlXCI6IHhzY2FsZSB8fCBcImxpbmVhclwifX0sXG4gICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic2NhbGVcIjoge1widHlwZVwiOiB5c2NhbGUgfHwgXCJsaW5lYXJcIn19LFxuICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcIk9yaWdpblwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgfVxuICB9KTtcblxuICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gIGNvbnN0IHNlbENtcHRzID0gc2VsZWN0aW9uLnBhcnNlVW5pdFNlbGVjdGlvbihtb2RlbCwge1xuICAgIFwib25lXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcInNpbmdsZVwiXG4gICAgfSxcbiAgICBcInR3b1wiOiB7XG4gICAgICBcInR5cGVcIjogXCJtdWx0aVwiXG4gICAgfSxcbiAgICBcInRocmVlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImludGVydmFsXCIsXG4gICAgICBcInRyYW5zbGF0ZVwiOiBmYWxzZVxuICAgIH0sXG4gICAgXCJmb3VyXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImludGVydmFsXCJcbiAgICB9LFxuICAgIFwiZml2ZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJpbnRlcnZhbFwiLFxuICAgICAgXCJ0cmFuc2xhdGVcIjogXCJbbW91c2Vkb3duLCBtb3VzZXVwXSA+IG1vdXNlbW92ZSwgW2tleWRvd24sIGtleXVwXSA+IHRvdWNobW92ZVwiXG4gICAgfSxcbiAgICBcInNpeFwiOiB7XG4gICAgICBcInR5cGVcIjogXCJpbnRlcnZhbFwiLFxuICAgICAgXCJiaW5kXCI6IFwic2NhbGVzXCJcbiAgICB9LFxuICAgIFwic2V2ZW5cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgIFwidHJhbnNsYXRlXCI6IG51bGxcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7bW9kZWwsIHNlbENtcHRzfTtcbn1cblxuZGVzY3JpYmUoJ1RyYW5zbGF0ZSBTZWxlY3Rpb24gVHJhbnNmb3JtJywgZnVuY3Rpb24oKSB7XG4gIGl0KCdpZGVudGlmaWVzIHRyYW5zZm9ybSBpbnZvY2F0aW9uJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qge21vZGVsOiBfbW9kZWwsIHNlbENtcHRzfSA9IGdldE1vZGVsKCk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZSh0cmFuc2xhdGUuaGFzKHNlbENtcHRzWydvbmUnXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUodHJhbnNsYXRlLmhhcyhzZWxDbXB0c1sndHdvJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RUcnVlKHRyYW5zbGF0ZS5oYXMoc2VsQ21wdHNbJ3RocmVlJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RGYWxzZSh0cmFuc2xhdGUuaGFzKHNlbENtcHRzWydmb3VyJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RGYWxzZSh0cmFuc2xhdGUuaGFzKHNlbENtcHRzWydmaXZlJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RGYWxzZSh0cmFuc2xhdGUuaGFzKHNlbENtcHRzWydzaXgnXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUodHJhbnNsYXRlLmhhcyhzZWxDbXB0c1snc2V2ZW4nXSkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQW5jaG9yL0RlbHRhIHNpZ25hbHMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB7bW9kZWwsIHNlbENtcHRzfSA9IGdldE1vZGVsKCk7XG5cbiAgICBpdCgnYnVpbGRzIHRoZW0gZm9yIGRlZmF1bHQgaW52b2NhdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHtmb3VyOiBzZWxDbXB0c1snZm91ciddfTtcbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBzZWxlY3Rpb24uYXNzZW1ibGVVbml0U2VsZWN0aW9uU2lnbmFscyhtb2RlbCwgW10pO1xuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmb3VyX3RyYW5zbGF0ZV9hbmNob3JcIixcbiAgICAgICAgICBcInZhbHVlXCI6IHt9LFxuICAgICAgICAgIFwib25cIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImV2ZW50c1wiOiBwYXJzZVNlbGVjdG9yKCdAZm91cl9icnVzaDptb3VzZWRvd24nLCAnc2NvcGUnKSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ7eDogeCh1bml0KSwgeTogeSh1bml0KSwgZXh0ZW50X3g6IHNsaWNlKGZvdXJfeCksIGV4dGVudF95OiBzbGljZShmb3VyX3kpfVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZm91cl90cmFuc2xhdGVfZGVsdGFcIixcbiAgICAgICAgICBcInZhbHVlXCI6IHt9LFxuICAgICAgICAgIFwib25cIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImV2ZW50c1wiOiBwYXJzZVNlbGVjdG9yKCdbQGZvdXJfYnJ1c2g6bW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIScsICdzY29wZScpLFxuICAgICAgICAgICAgICBcInVwZGF0ZVwiOiBcInt4OiBmb3VyX3RyYW5zbGF0ZV9hbmNob3IueCAtIHgodW5pdCksIHk6IGZvdXJfdHJhbnNsYXRlX2FuY2hvci55IC0geSh1bml0KX1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRzIHRoZW0gZm9yIGN1c3RvbSBldmVudHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7Zml2ZTogc2VsQ21wdHNbJ2ZpdmUnXX07XG4gICAgICBjb25zdCBzaWduYWxzID0gc2VsZWN0aW9uLmFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWwsIFtdKTtcbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscywgW1xuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZml2ZV90cmFuc2xhdGVfYW5jaG9yXCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7fSxcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignQGZpdmVfYnJ1c2g6bW91c2Vkb3duLCBAZml2ZV9icnVzaDprZXlkb3duJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwie3g6IHgodW5pdCksIHk6IHkodW5pdCksIGV4dGVudF94OiBzbGljZShmaXZlX3gpLCBleHRlbnRfeTogc2xpY2UoZml2ZV95KX1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZpdmVfdHJhbnNsYXRlX2RlbHRhXCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7fSxcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignW0BmaXZlX2JydXNoOm1vdXNlZG93biwgbW91c2V1cF0gPiBtb3VzZW1vdmUsIFtAZml2ZV9icnVzaDprZXlkb3duLCBrZXl1cF0gPiB0b3VjaG1vdmUnLCAnc2NvcGUnKSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ7eDogZml2ZV90cmFuc2xhdGVfYW5jaG9yLnggLSB4KHVuaXQpLCB5OiBmaXZlX3RyYW5zbGF0ZV9hbmNob3IueSAtIHkodW5pdCl9XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyB0aGVtIGZvciBzY2FsZS1ib3VuZCBpbnRlcnZhbHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNpeF90cmFuc2xhdGVfYW5jaG9yXCIsXG4gICAgICAgICAgXCJ2YWx1ZVwiOiB7fSxcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignbW91c2Vkb3duJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwie3g6IHgodW5pdCksIHk6IHkodW5pdCksIGV4dGVudF94OiBkb21haW4oXFxcInhcXFwiKSwgZXh0ZW50X3k6IGRvbWFpbihcXFwieVxcXCIpfVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2l4X3RyYW5zbGF0ZV9kZWx0YVwiLFxuICAgICAgICAgIFwidmFsdWVcIjoge30sXG4gICAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ1ttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwie3g6IHNpeF90cmFuc2xhdGVfYW5jaG9yLnggLSB4KHVuaXQpLCB5OiBzaXhfdHJhbnNsYXRlX2FuY2hvci55IC0geSh1bml0KX1cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdUcmFuc2xhdGUgU2lnbmFsJywgZnVuY3Rpb24oKSB7XG4gICAgaXQoJ2Fsd2F5cyBidWlsZHMgcGFuTGluZWFyIGV4cHJzIGZvciBicnVzaGVzJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCB7bW9kZWwsIHNlbENtcHRzfSA9IGdldE1vZGVsKCk7XG4gICAgICBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0ge2ZvdXI6IHNlbENtcHRzWydmb3VyJ119O1xuICAgICAgbGV0IHNpZ25hbHMgPSBzZWxlY3Rpb24uYXNzZW1ibGVVbml0U2VsZWN0aW9uU2lnbmFscyhtb2RlbCwgW10pO1xuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLmZpbHRlcigocykgPT4gcy5uYW1lID09PSAnZm91cl94JylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcImZvdXJfdHJhbnNsYXRlX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiY2xhbXBSYW5nZShwYW5MaW5lYXIoZm91cl90cmFuc2xhdGVfYW5jaG9yLmV4dGVudF94LCBmb3VyX3RyYW5zbGF0ZV9kZWx0YS54IC8gc3Bhbihmb3VyX3RyYW5zbGF0ZV9hbmNob3IuZXh0ZW50X3gpKSwgMCwgd2lkdGgpXCJcbiAgICAgICAgfVxuICAgICAgXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ2ZvdXJfeScpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJmb3VyX3RyYW5zbGF0ZV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcImNsYW1wUmFuZ2UocGFuTGluZWFyKGZvdXJfdHJhbnNsYXRlX2FuY2hvci5leHRlbnRfeSwgZm91cl90cmFuc2xhdGVfZGVsdGEueSAvIHNwYW4oZm91cl90cmFuc2xhdGVfYW5jaG9yLmV4dGVudF95KSksIDAsIGhlaWdodClcIlxuICAgICAgICB9XG4gICAgICBdKTtcblxuICAgICAgY29uc3QgbW9kZWwyID0gZ2V0TW9kZWwoJ2xvZycsICdwb3cnKS5tb2RlbDtcbiAgICAgIG1vZGVsMi5jb21wb25lbnQuc2VsZWN0aW9uID0ge2ZvdXI6IHNlbENtcHRzWydmb3VyJ119O1xuICAgICAgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsMiwgW10pO1xuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLmZpbHRlcigocykgPT4gcy5uYW1lID09PSAnZm91cl94JylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcImZvdXJfdHJhbnNsYXRlX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiY2xhbXBSYW5nZShwYW5MaW5lYXIoZm91cl90cmFuc2xhdGVfYW5jaG9yLmV4dGVudF94LCBmb3VyX3RyYW5zbGF0ZV9kZWx0YS54IC8gc3Bhbihmb3VyX3RyYW5zbGF0ZV9hbmNob3IuZXh0ZW50X3gpKSwgMCwgd2lkdGgpXCJcbiAgICAgICAgfVxuICAgICAgXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ2ZvdXJfeScpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJmb3VyX3RyYW5zbGF0ZV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcImNsYW1wUmFuZ2UocGFuTGluZWFyKGZvdXJfdHJhbnNsYXRlX2FuY2hvci5leHRlbnRfeSwgZm91cl90cmFuc2xhdGVfZGVsdGEueSAvIHNwYW4oZm91cl90cmFuc2xhdGVfYW5jaG9yLmV4dGVudF95KSksIDAsIGhlaWdodClcIlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZHMgcGFuTGluZWFyIGV4cHJzIGZvciBzY2FsZS1ib3VuZCBpbnRlcnZhbHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3NpeF9Ib3JzZXBvd2VyJylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInNpeF90cmFuc2xhdGVfZGVsdGFcIn0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjogXCJwYW5MaW5lYXIoc2l4X3RyYW5zbGF0ZV9hbmNob3IuZXh0ZW50X3gsIC1zaXhfdHJhbnNsYXRlX2RlbHRhLnggLyB3aWR0aClcIlxuICAgICAgICB9XG4gICAgICBdKTtcblxuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLmZpbHRlcigocykgPT4gcy5uYW1lID09PSAnc2l4X01pbGVzX3Blcl9HYWxsb24nKVswXS5vbiwgW1xuICAgICAgICB7XG4gICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwic2l4X3RyYW5zbGF0ZV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcInBhbkxpbmVhcihzaXhfdHJhbnNsYXRlX2FuY2hvci5leHRlbnRfeSwgc2l4X3RyYW5zbGF0ZV9kZWx0YS55IC8gaGVpZ2h0KVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyBwYW5Mb2cvcGFuUG93IGV4cHJzIGZvciBzY2FsZS1ib3VuZCBpbnRlcnZhbHMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoJ2xvZycsICdwb3cnKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3NpeF9Ib3JzZXBvd2VyJylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInNpeF90cmFuc2xhdGVfZGVsdGFcIn0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjogXCJwYW5Mb2coc2l4X3RyYW5zbGF0ZV9hbmNob3IuZXh0ZW50X3gsIC1zaXhfdHJhbnNsYXRlX2RlbHRhLnggLyB3aWR0aClcIlxuICAgICAgICB9XG4gICAgICBdKTtcblxuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLmZpbHRlcigocykgPT4gcy5uYW1lID09PSAnc2l4X01pbGVzX3Blcl9HYWxsb24nKVswXS5vbiwgW1xuICAgICAgICB7XG4gICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwic2l4X3RyYW5zbGF0ZV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcInBhblBvdyhzaXhfdHJhbnNsYXRlX2FuY2hvci5leHRlbnRfeSwgc2l4X3RyYW5zbGF0ZV9kZWx0YS55IC8gaGVpZ2h0LCAxKVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compile/selection/zoom.test.d.ts b/build/test/compile/selection/zoom.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/selection/zoom.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/selection/zoom.test.js b/build/test/compile/selection/zoom.test.js new file mode 100644 index 0000000000..3715988d32 --- /dev/null +++ b/build/test/compile/selection/zoom.test.js @@ -0,0 +1,209 @@ +"use strict"; +/* tslint:disable quotemark */ +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var vega_event_selector_1 = require("vega-event-selector"); +var selection = tslib_1.__importStar(require("../../../src/compile/selection/selection")); +var zoom_1 = tslib_1.__importDefault(require("../../../src/compile/selection/transforms/zoom")); +var util_1 = require("../../util"); +function getModel(xscale, yscale) { + var model = util_1.parseUnitModel({ + "mark": "circle", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative", "scale": { "type": xscale || "linear" } }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative", "scale": { "type": yscale || "linear" } }, + "color": { "field": "Origin", "type": "nominal" } + } + }); + model.parseScale(); + var selCmpts = selection.parseUnitSelection(model, { + "one": { + "type": "single" + }, + "two": { + "type": "multi" + }, + "three": { + "type": "interval", + "zoom": false + }, + "four": { + "type": "interval" + }, + "five": { + "type": "interval", + "zoom": "wheel, pinch" + }, + "six": { + "type": "interval", + "bind": "scales" + }, + "seven": { + "type": "interval", + "zoom": null + } + }); + return { model: model, selCmpts: selCmpts }; +} +describe('Zoom Selection Transform', function () { + it('identifies transform invocation', function () { + var _a = getModel(), _model = _a.model, selCmpts = _a.selCmpts; + chai_1.assert.isNotTrue(zoom_1.default.has(selCmpts['one'])); + chai_1.assert.isNotTrue(zoom_1.default.has(selCmpts['two'])); + chai_1.assert.isNotTrue(zoom_1.default.has(selCmpts['three'])); + chai_1.assert.isNotFalse(zoom_1.default.has(selCmpts['four'])); + chai_1.assert.isNotFalse(zoom_1.default.has(selCmpts['five'])); + chai_1.assert.isNotFalse(zoom_1.default.has(selCmpts['six'])); + chai_1.assert.isNotTrue(zoom_1.default.has(selCmpts['seven'])); + }); + describe('Anchor/Delta signals', function () { + it('builds then for default invocation', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { four: selCmpts['four'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "four_zoom_anchor", + "on": [ + { + "events": vega_event_selector_1.selector('@four_brush:wheel!', 'scope'), + "update": "{x: x(unit), y: y(unit)}" + } + ] + }, + { + "name": "four_zoom_delta", + "on": [ + { + "events": vega_event_selector_1.selector('@four_brush:wheel!', 'scope'), + "force": true, + "update": "pow(1.001, event.deltaY * pow(16, event.deltaMode))" + } + ] + } + ]); + }); + it('builds them for custom events', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { five: selCmpts['five'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "five_zoom_anchor", + "on": [ + { + "events": vega_event_selector_1.selector('@five_brush:wheel, @five_brush:pinch', 'scope'), + "update": "{x: x(unit), y: y(unit)}" + } + ] + }, + { + "name": "five_zoom_delta", + "on": [ + { + "events": vega_event_selector_1.selector('@five_brush:wheel, @five_brush:pinch', 'scope'), + "force": true, + "update": "pow(1.001, event.deltaY * pow(16, event.deltaMode))" + } + ] + } + ]); + }); + it('builds them for scale-bound zoom', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals, [ + { + "name": "six_zoom_anchor", + "on": [ + { + "events": vega_event_selector_1.selector('wheel!', 'scope'), + "update": "{x: invert(\"x\", x(unit)), y: invert(\"y\", y(unit))}" + } + ] + }, + { + "name": "six_zoom_delta", + "on": [ + { + "events": vega_event_selector_1.selector('wheel!', 'scope'), + "force": true, + "update": "pow(1.001, event.deltaY * pow(16, event.deltaMode))" + } + ] + } + ]); + }); + }); + describe('Zoom Signal', function () { + it('always builds zoomLinear exprs for brushes', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { four: selCmpts['four'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_x'; })[0].on, [ + { + "events": { "signal": "four_zoom_delta" }, + "update": "clampRange(zoomLinear(four_x, four_zoom_anchor.x, four_zoom_delta), 0, width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_y'; })[0].on, [ + { + "events": { "signal": "four_zoom_delta" }, + "update": "clampRange(zoomLinear(four_y, four_zoom_anchor.y, four_zoom_delta), 0, height)" + } + ]); + var model2 = getModel('log', 'pow').model; + model2.component.selection = { four: selCmpts['four'] }; + signals = selection.assembleUnitSelectionSignals(model2, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_x'; })[0].on, [ + { + "events": { "signal": "four_zoom_delta" }, + "update": "clampRange(zoomLinear(four_x, four_zoom_anchor.x, four_zoom_delta), 0, width)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'four_y'; })[0].on, [ + { + "events": { "signal": "four_zoom_delta" }, + "update": "clampRange(zoomLinear(four_y, four_zoom_anchor.y, four_zoom_delta), 0, height)" + } + ]); + }); + it('builds zoomLinear exprs for scale-bound zoom', function () { + var _a = getModel(), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Horsepower'; })[0].on, [ + { + "events": { "signal": "six_zoom_delta" }, + "update": "zoomLinear(domain(\"x\"), six_zoom_anchor.x, six_zoom_delta)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Miles_per_Gallon'; })[0].on, [ + { + "events": { "signal": "six_zoom_delta" }, + "update": "zoomLinear(domain(\"y\"), six_zoom_anchor.y, six_zoom_delta)" + } + ]); + }); + it('builds zoomLog/Pow exprs for scale-bound zoom', function () { + var _a = getModel('log', 'pow'), model = _a.model, selCmpts = _a.selCmpts; + model.component.selection = { six: selCmpts['six'] }; + var signals = selection.assembleUnitSelectionSignals(model, []); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Horsepower'; })[0].on, [ + { + "events": { "signal": "six_zoom_delta" }, + "update": "zoomLog(domain(\"x\"), six_zoom_anchor.x, six_zoom_delta)" + } + ]); + chai_1.assert.includeDeepMembers(signals.filter(function (s) { return s.name === 'six_Miles_per_Gallon'; })[0].on, [ + { + "events": { "signal": "six_zoom_delta" }, + "update": "zoomPow(domain(\"y\"), six_zoom_anchor.y, six_zoom_delta, 1)" + } + ]); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9jb21waWxlL3NlbGVjdGlvbi96b29tLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDhCQUE4Qjs7O0FBRTlCLDZCQUE0QjtBQUM1QiwyREFBOEQ7QUFDOUQsMEZBQXNFO0FBQ3RFLGdHQUFrRTtBQUVsRSxtQ0FBMEM7QUFFMUMsa0JBQWtCLE1BQWtCLEVBQUUsTUFBa0I7SUFDdEQsSUFBTSxLQUFLLEdBQUcscUJBQWMsQ0FBQztRQUMzQixNQUFNLEVBQUUsUUFBUTtRQUNoQixVQUFVLEVBQUU7WUFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxRQUFRLEVBQUMsRUFBQztZQUMxRixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBQyxFQUFDO1lBQ2hHLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztTQUNoRDtLQUNGLENBQUMsQ0FBQztJQUVILEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixJQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFO1FBQ25ELEtBQUssRUFBRTtZQUNMLE1BQU0sRUFBRSxRQUFRO1NBQ2pCO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsTUFBTSxFQUFFLE9BQU87U0FDaEI7UUFDRCxPQUFPLEVBQUU7WUFDUCxNQUFNLEVBQUUsVUFBVTtZQUNsQixNQUFNLEVBQUUsS0FBSztTQUNkO1FBQ0QsTUFBTSxFQUFFO1lBQ04sTUFBTSxFQUFFLFVBQVU7U0FDbkI7UUFDRCxNQUFNLEVB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QUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQWpDLENBQWlDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3hGO29CQUNFLFFBQVEsRUFBRSxFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQztvQkFDdEMsUUFBUSxFQUFFLDhEQUE4RDtpQkFDekU7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZSBxdW90ZW1hcmsgKi9cblxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtzZWxlY3RvciBhcyBwYXJzZVNlbGVjdG9yfSBmcm9tICd2ZWdhLWV2ZW50LXNlbGVjdG9yJztcbmltcG9ydCAqIGFzIHNlbGVjdGlvbiBmcm9tICcuLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB6b29tIGZyb20gJy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3pvb20nO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uLy4uLy4uL3NyYy9zY2FsZSc7XG5pbXBvcnQge3BhcnNlVW5pdE1vZGVsfSBmcm9tICcuLi8uLi91dGlsJztcblxuZnVuY3Rpb24gZ2V0TW9kZWwoeHNjYWxlPzogU2NhbGVUeXBlLCB5c2NhbGU/OiBTY2FsZVR5cGUpIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgXCJtYXJrXCI6IFwiY2lyY2xlXCIsXG4gICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic2NhbGVcIjoge1widHlwZVwiOiB4c2NhbGUgfHwgXCJsaW5lYXJcIn19LFxuICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcInNjYWxlXCI6IHtcInR5cGVcIjogeXNjYWxlIHx8IFwibGluZWFyXCJ9fSxcbiAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJPcmlnaW5cIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgIH1cbiAgfSk7XG5cbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICBjb25zdCBzZWxDbXB0cyA9IHNlbGVjdGlvbi5wYXJzZVVuaXRTZWxlY3Rpb24obW9kZWwsIHtcbiAgICBcIm9uZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJzaW5nbGVcIlxuICAgIH0sXG4gICAgXCJ0d29cIjoge1xuICAgICAgXCJ0eXBlXCI6IFwibXVsdGlcIlxuICAgIH0sXG4gICAgXCJ0aHJlZVwiOiB7XG4gICAgICBcInR5cGVcIjogXCJpbnRlcnZhbFwiLFxuICAgICAgXCJ6b29tXCI6IGZhbHNlXG4gICAgfSxcbiAgICBcImZvdXJcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIlxuICAgIH0sXG4gICAgXCJmaXZlXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImludGVydmFsXCIsXG4gICAgICBcInpvb21cIjogXCJ3aGVlbCwgcGluY2hcIlxuICAgIH0sXG4gICAgXCJzaXhcIjoge1xuICAgICAgXCJ0eXBlXCI6IFwiaW50ZXJ2YWxcIixcbiAgICAgIFwiYmluZFwiOiBcInNjYWxlc1wiXG4gICAgfSxcbiAgICBcInNldmVuXCI6IHtcbiAgICAgIFwidHlwZVwiOiBcImludGVydmFsXCIsXG4gICAgICBcInpvb21cIjogbnVsbFxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHttb2RlbCwgc2VsQ21wdHN9O1xufVxuXG5kZXNjcmliZSgnWm9vbSBTZWxlY3Rpb24gVHJhbnNmb3JtJywgZnVuY3Rpb24oKSB7XG5cbiAgaXQoJ2lkZW50aWZpZXMgdHJhbnNmb3JtIGludm9jYXRpb24nLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB7bW9kZWw6IF9tb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoKTtcbiAgICBhc3NlcnQuaXNOb3RUcnVlKHpvb20uaGFzKHNlbENtcHRzWydvbmUnXSkpO1xuICAgIGFzc2VydC5pc05vdFRydWUoem9vbS5oYXMoc2VsQ21wdHNbJ3R3byddKSk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZSh6b29tLmhhcyhzZWxDbXB0c1sndGhyZWUnXSkpO1xuICAgIGFzc2VydC5pc05vdEZhbHNlKHpvb20uaGFzKHNlbENtcHRzWydmb3VyJ10pKTtcbiAgICBhc3NlcnQuaXNOb3RGYWxzZSh6b29tLmhhcyhzZWxDbXB0c1snZml2ZSddKSk7XG4gICAgYXNzZXJ0LmlzTm90RmFsc2Uoem9vbS5oYXMoc2VsQ21wdHNbJ3NpeCddKSk7XG4gICAgYXNzZXJ0LmlzTm90VHJ1ZSh6b29tLmhhcyhzZWxDbXB0c1snc2V2ZW4nXSkpO1xuICB9KTtcblxuICBkZXNjcmliZSgnQW5jaG9yL0RlbHRhIHNpZ25hbHMnLCBmdW5jdGlvbigpIHtcbiAgICBpdCgnYnVpbGRzIHRoZW4gZm9yIGRlZmF1bHQgaW52b2NhdGlvbicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3Qge21vZGVsLCBzZWxDbXB0c30gPSBnZXRNb2RlbCgpO1xuICAgICAgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbiA9IHtmb3VyOiBzZWxDbXB0c1snZm91ciddfTtcbiAgICAgIGNvbnN0IHNpZ25hbHMgPSBzZWxlY3Rpb24uYXNzZW1ibGVVbml0U2VsZWN0aW9uU2lnbmFscyhtb2RlbCwgW10pO1xuICAgICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyhzaWduYWxzLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmb3VyX3pvb21fYW5jaG9yXCIsXG4gICAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ0Bmb3VyX2JydXNoOndoZWVsIScsICdzY29wZScpLFxuICAgICAgICAgICAgICBcInVwZGF0ZVwiOiBcInt4OiB4KHVuaXQpLCB5OiB5KHVuaXQpfVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwiZm91cl96b29tX2RlbHRhXCIsXG4gICAgICAgICAgXCJvblwiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwiZXZlbnRzXCI6IHBhcnNlU2VsZWN0b3IoJ0Bmb3VyX2JydXNoOndoZWVsIScsICdzY29wZScpLFxuICAgICAgICAgICAgICBcImZvcmNlXCI6IHRydWUsXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwicG93KDEuMDAxLCBldmVudC5kZWx0YVkgKiBwb3coMTYsIGV2ZW50LmRlbHRhTW9kZSkpXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIF0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2J1aWxkcyB0aGVtIGZvciBjdXN0b20gZXZlbnRzJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCB7bW9kZWwsIHNlbENtcHRzfSA9IGdldE1vZGVsKCk7XG4gICAgICBtb2RlbC5jb21wb25lbnQuc2VsZWN0aW9uID0ge2ZpdmU6IHNlbENtcHRzWydmaXZlJ119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcImZpdmVfem9vbV9hbmNob3JcIixcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignQGZpdmVfYnJ1c2g6d2hlZWwsIEBmaXZlX2JydXNoOnBpbmNoJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwidXBkYXRlXCI6IFwie3g6IHgodW5pdCksIHk6IHkodW5pdCl9XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcIm5hbWVcIjogXCJmaXZlX3pvb21fZGVsdGFcIixcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3RvcignQGZpdmVfYnJ1c2g6d2hlZWwsIEBmaXZlX2JydXNoOnBpbmNoJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwiZm9yY2VcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJwb3coMS4wMDEsIGV2ZW50LmRlbHRhWSAqIHBvdygxNiwgZXZlbnQuZGVsdGFNb2RlKSlcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRzIHRoZW0gZm9yIHNjYWxlLWJvdW5kIHpvb20nLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMsIFtcbiAgICAgICAge1xuICAgICAgICAgIFwibmFtZVwiOiBcInNpeF96b29tX2FuY2hvclwiLFxuICAgICAgICAgIFwib25cIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImV2ZW50c1wiOiBwYXJzZVNlbGVjdG9yKCd3aGVlbCEnLCAnc2NvcGUnKSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJ7eDogaW52ZXJ0KFxcXCJ4XFxcIiwgeCh1bml0KSksIHk6IGludmVydChcXFwieVxcXCIsIHkodW5pdCkpfVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJuYW1lXCI6IFwic2l4X3pvb21fZGVsdGFcIixcbiAgICAgICAgICBcIm9uXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJldmVudHNcIjogcGFyc2VTZWxlY3Rvcignd2hlZWwhJywgJ3Njb3BlJyksXG4gICAgICAgICAgICAgIFwiZm9yY2VcIjogdHJ1ZSxcbiAgICAgICAgICAgICAgXCJ1cGRhdGVcIjogXCJwb3coMS4wMDEsIGV2ZW50LmRlbHRhWSAqIHBvdygxNiwgZXZlbnQuZGVsdGFNb2RlKSlcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdab29tIFNpZ25hbCcsIGZ1bmN0aW9uKCkge1xuICAgIGl0KCdhbHdheXMgYnVpbGRzIHpvb21MaW5lYXIgZXhwcnMgZm9yIGJydXNoZXMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7Zm91cjogc2VsQ21wdHNbJ2ZvdXInXX07XG4gICAgICBsZXQgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ2ZvdXJfeCcpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJmb3VyX3pvb21fZGVsdGFcIn0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjogXCJjbGFtcFJhbmdlKHpvb21MaW5lYXIoZm91cl94LCBmb3VyX3pvb21fYW5jaG9yLngsIGZvdXJfem9vbV9kZWx0YSksIDAsIHdpZHRoKVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuXG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09ICdmb3VyX3knKVswXS5vbiwgW1xuICAgICAgICB7XG4gICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwiZm91cl96b29tX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiY2xhbXBSYW5nZSh6b29tTGluZWFyKGZvdXJfeSwgZm91cl96b29tX2FuY2hvci55LCBmb3VyX3pvb21fZGVsdGEpLCAwLCBoZWlnaHQpXCJcbiAgICAgICAgfVxuICAgICAgXSk7XG5cbiAgICAgIGNvbnN0IG1vZGVsMiA9IGdldE1vZGVsKCdsb2cnLCAncG93JykubW9kZWw7XG4gICAgICBtb2RlbDIuY29tcG9uZW50LnNlbGVjdGlvbiA9IHtmb3VyOiBzZWxDbXB0c1snZm91ciddfTtcbiAgICAgIHNpZ25hbHMgPSBzZWxlY3Rpb24uYXNzZW1ibGVVbml0U2VsZWN0aW9uU2lnbmFscyhtb2RlbDIsIFtdKTtcbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ2ZvdXJfeCcpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJmb3VyX3pvb21fZGVsdGFcIn0sXG4gICAgICAgICAgXCJ1cGRhdGVcIjogXCJjbGFtcFJhbmdlKHpvb21MaW5lYXIoZm91cl94LCBmb3VyX3pvb21fYW5jaG9yLngsIGZvdXJfem9vbV9kZWx0YSksIDAsIHdpZHRoKVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuXG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09ICdmb3VyX3knKVswXS5vbiwgW1xuICAgICAgICB7XG4gICAgICAgICAgXCJldmVudHNcIjoge1wic2lnbmFsXCI6IFwiZm91cl96b29tX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiY2xhbXBSYW5nZSh6b29tTGluZWFyKGZvdXJfeSwgZm91cl96b29tX2FuY2hvci55LCBmb3VyX3pvb21fZGVsdGEpLCAwLCBoZWlnaHQpXCJcbiAgICAgICAgfVxuICAgICAgXSk7XG4gICAgfSk7XG5cbiAgICBpdCgnYnVpbGRzIHpvb21MaW5lYXIgZXhwcnMgZm9yIHNjYWxlLWJvdW5kIHpvb20nLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3NpeF9Ib3JzZXBvd2VyJylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInNpeF96b29tX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiem9vbUxpbmVhcihkb21haW4oXFxcInhcXFwiKSwgc2l4X3pvb21fYW5jaG9yLngsIHNpeF96b29tX2RlbHRhKVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuXG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09ICdzaXhfTWlsZXNfcGVyX0dhbGxvbicpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJzaXhfem9vbV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcInpvb21MaW5lYXIoZG9tYWluKFxcXCJ5XFxcIiksIHNpeF96b29tX2FuY2hvci55LCBzaXhfem9vbV9kZWx0YSlcIlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgICB9KTtcblxuICAgIGl0KCdidWlsZHMgem9vbUxvZy9Qb3cgZXhwcnMgZm9yIHNjYWxlLWJvdW5kIHpvb20nLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHttb2RlbCwgc2VsQ21wdHN9ID0gZ2V0TW9kZWwoJ2xvZycsICdwb3cnKTtcbiAgICAgIG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gPSB7c2l4OiBzZWxDbXB0c1snc2l4J119O1xuICAgICAgY29uc3Qgc2lnbmFscyA9IHNlbGVjdGlvbi5hc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKG1vZGVsLCBbXSk7XG5cbiAgICAgIGFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMoc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3NpeF9Ib3JzZXBvd2VyJylbMF0ub24sIFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZXZlbnRzXCI6IHtcInNpZ25hbFwiOiBcInNpeF96b29tX2RlbHRhXCJ9LFxuICAgICAgICAgIFwidXBkYXRlXCI6IFwiem9vbUxvZyhkb21haW4oXFxcInhcXFwiKSwgc2l4X3pvb21fYW5jaG9yLngsIHNpeF96b29tX2RlbHRhKVwiXG4gICAgICAgIH1cbiAgICAgIF0pO1xuXG4gICAgICBhc3NlcnQuaW5jbHVkZURlZXBNZW1iZXJzKHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09ICdzaXhfTWlsZXNfcGVyX0dhbGxvbicpWzBdLm9uLCBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImV2ZW50c1wiOiB7XCJzaWduYWxcIjogXCJzaXhfem9vbV9kZWx0YVwifSxcbiAgICAgICAgICBcInVwZGF0ZVwiOiBcInpvb21Qb3coZG9tYWluKFxcXCJ5XFxcIiksIHNpeF96b29tX2FuY2hvci55LCBzaXhfem9vbV9kZWx0YSwgMSlcIlxuICAgICAgICB9XG4gICAgICBdKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compile/unit.test.d.ts b/build/test/compile/unit.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compile/unit.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compile/unit.test.js b/build/test/compile/unit.test.js new file mode 100644 index 0000000000..20cf0df18d --- /dev/null +++ b/build/test/compile/unit.test.js @@ -0,0 +1,81 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../../src/channel"); +var log = tslib_1.__importStar(require("../../src/log")); +var mark_1 = require("../../src/mark"); +var type_1 = require("../../src/type"); +var util_1 = require("../util"); +describe('UnitModel', function () { + describe('initEncoding', function () { + it('should drop unsupported channel and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + shape: { field: 'a', type: 'quantitative' } + } + }); + chai_1.assert.equal(model.encoding.shape, undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.incompatibleChannel(channel_1.SHAPE, mark_1.BAR)); + })); + it('should drop invalid channel and throws warning', log.wrap(function (localLogger) { + var _model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + _y: { type: 'quantitative' } + } + }); // To make parseUnitModel accept the model with invalid encoding channel + chai_1.assert.equal(localLogger.warns[0], log.message.invalidEncodingChannel('_y')); + })); + it('should drop channel without field and value and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + x: { type: 'quantitative' } + } + }); + chai_1.assert.equal(model.encoding.x, undefined); + chai_1.assert.equal(localLogger.warns[0], log.message.emptyFieldDef({ type: type_1.QUANTITATIVE }, channel_1.X)); + })); + it('should drop a fieldDef without field and value from the channel def list and throws warning', log.wrap(function (localLogger) { + var model = util_1.parseUnitModel({ + mark: 'bar', + encoding: { + detail: [ + { field: 'a', type: 'ordinal' }, + { type: 'quantitative' } + ] + } + }); + chai_1.assert.deepEqual(model.encoding.detail, [ + { field: 'a', type: 'ordinal' } + ]); + chai_1.assert.equal(localLogger.warns[0], log.message.emptyFieldDef({ type: type_1.QUANTITATIVE }, channel_1.DETAIL)); + })); + }); + describe('initAxes', function () { + it('should not include properties of non-VlOnlyAxisConfig in config.axis', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal' }, + y: { field: 'b', type: 'ordinal' } + }, + config: { axis: { domainWidth: 123 } } + }); + chai_1.assert.equal(model.axis(channel_1.X)['domainWidth'], undefined); + }); + it('it should have axis.offset = encode.x.axis.offset', function () { + var model = util_1.parseUnitModel({ + mark: 'point', + encoding: { + x: { field: 'a', type: 'ordinal', axis: { offset: 345 } }, + y: { field: 'b', type: 'ordinal' } + } + }); + chai_1.assert.equal(model.axis(channel_1.X).offset, 345); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9jb21waWxlL3VuaXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsNkNBQW1EO0FBRW5ELHlEQUFxQztBQUNyQyx1Q0FBbUM7QUFDbkMsdUNBQTRDO0FBQzVDLGdDQUF1QztBQUV2QyxRQUFRLENBQUMsV0FBVyxFQUFFO0lBQ3BCLFFBQVEsQ0FBQyxjQUFjLEVBQUU7UUFDdkIsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQzFFLElBQU0sS0FBSyxHQUFHLHFCQUFjLENBQUM7Z0JBQzNCLElBQUksRUFBRSxLQUFLO2dCQUNYLFFBQVEsRUFBRTtvQkFDUixLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7aUJBQzFDO2FBQ0YsQ0FBQyxDQUFDO1lBQ0gsYUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5QyxhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFLLEVBQUUsVUFBRyxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRU4sRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQ3RFLElBQU0sTUFBTSxHQUFHLHFCQUFjLENBQUM7Z0JBQzVCLElBQUksRUFBRSxLQUFLO2dCQUNYLFFBQVEsRUFBRTtvQkFDUixFQUFFLEVBQUUsRUFBQyxJQUFJLEVBQUUsY0FBYyxFQUFDO2lCQUMzQjthQUNLLENBQUMsQ0FBQyxDQUFDLHdFQUF3RTtZQUNuRixhQUFNLENB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LElBQUksRUFBRSxTQUFTLEVBQUM7aUJBQ2pDO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsYUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge0RFVEFJTCwgU0hBUEUsIFh9IGZyb20gJy4uLy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4uLy4uL3NyYy9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vc3JjL2xvZyc7XG5pbXBvcnQge0JBUn0gZnJvbSAnLi4vLi4vc3JjL21hcmsnO1xuaW1wb3J0IHtRVUFOVElUQVRJVkV9IGZyb20gJy4uLy4uL3NyYy90eXBlJztcbmltcG9ydCB7cGFyc2VVbml0TW9kZWx9IGZyb20gJy4uL3V0aWwnO1xuXG5kZXNjcmliZSgnVW5pdE1vZGVsJywgZnVuY3Rpb24oKSB7XG4gIGRlc2NyaWJlKCdpbml0RW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkcm9wIHVuc3VwcG9ydGVkIGNoYW5uZWwgYW5kIHRocm93cyB3YXJuaW5nJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gcGFyc2VVbml0TW9kZWwoe1xuICAgICAgICAgIG1hcms6ICdiYXInLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBzaGFwZToge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5lbmNvZGluZy5zaGFwZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5pbmNvbXBhdGlibGVDaGFubmVsKFNIQVBFLCBCQVIpKTtcbiAgICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgZHJvcCBpbnZhbGlkIGNoYW5uZWwgYW5kIHRocm93cyB3YXJuaW5nJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICAgIGNvbnN0IF9tb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgX3k6IHt0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgYW55KTsgLy8gVG8gbWFrZSBwYXJzZVVuaXRNb2RlbCBhY2NlcHQgdGhlIG1vZGVsIHdpdGggaW52YWxpZCBlbmNvZGluZyBjaGFubmVsXG4gICAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UuaW52YWxpZEVuY29kaW5nQ2hhbm5lbCgnX3knKSk7XG4gICAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIGRyb3AgY2hhbm5lbCB3aXRob3V0IGZpZWxkIGFuZCB2YWx1ZSBhbmQgdGhyb3dzIHdhcm5pbmcnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgICAgbWFyazogJ2JhcicsXG4gICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgIHg6IHt0eXBlOiAncXVhbnRpdGF0aXZlJ31cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhc3NlcnQuZXF1YWwobW9kZWwuZW5jb2RpbmcueCwgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5lbXB0eUZpZWxkRGVmKHt0eXBlOiBRVUFOVElUQVRJVkV9LCBYKSk7XG4gICAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIGRyb3AgYSBmaWVsZERlZiB3aXRob3V0IGZpZWxkIGFuZCB2YWx1ZSBmcm9tIHRoZSBjaGFubmVsIGRlZiBsaXN0IGFuZCB0aHJvd3Mgd2FybmluZycsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgICBtYXJrOiAnYmFyJyxcbiAgICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgICAgZGV0YWlsOiBbXG4gICAgICAgICAgICAgIHtmaWVsZDogJ2EnLCB0eXBlOiAnb3JkaW5hbCd9LFxuICAgICAgICAgICAgICB7dHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxGaWVsZERlZjxzdHJpbmc+IHwgRmllbGREZWY8c3RyaW5nPltdPihtb2RlbC5lbmNvZGluZy5kZXRhaWwsIFtcbiAgICAgICAgICB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICBdKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5lbXB0eUZpZWxkRGVmKHt0eXBlOiBRVUFOVElUQVRJVkV9LCBERVRBSUwpKTtcbiAgICAgIH0pKTtcblxuICB9KTtcblxuICBkZXNjcmliZSgnaW5pdEF4ZXMnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBub3QgaW5jbHVkZSBwcm9wZXJ0aWVzIG9mIG5vbi1WbE9ubHlBeGlzQ29uZmlnIGluIGNvbmZpZy5heGlzJywgKCkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbCh7XG4gICAgICAgIG1hcms6ICdwb2ludCcsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ30sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6ICdvcmRpbmFsJ31cbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlnOiB7YXhpczoge2RvbWFpbldpZHRoOiAxMjN9fVxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5lcXVhbChtb2RlbC5heGlzKFgpWydkb21haW5XaWR0aCddLCB1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2l0IHNob3VsZCBoYXZlIGF4aXMub2Zmc2V0ID0gZW5jb2RlLnguYXhpcy5vZmZzZXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsKHtcbiAgICAgICAgbWFyazogJ3BvaW50JyxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB4OiB7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnLCBheGlzOiB7b2Zmc2V0OiAzNDV9fSxcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdiJywgdHlwZTogJ29yZGluYWwnfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKG1vZGVsLmF4aXMoWCkub2Zmc2V0LCAzNDUpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/compositemark/boxplot.test.d.ts b/build/test/compositemark/boxplot.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compositemark/boxplot.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compositemark/boxplot.test.js b/build/test/compositemark/boxplot.test.js new file mode 100644 index 0000000000..bd8f5cfecc --- /dev/null +++ b/build/test/compositemark/boxplot.test.js @@ -0,0 +1,1811 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var log = tslib_1.__importStar(require("../../src/log")); +var spec_1 = require("../../src/spec"); +var config_1 = require(".././../src/config"); +describe("normalizeBoxMinMax", function () { + it("should produce an error if both axes have aggregate boxplot", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "aggregate": "box-plot", "field": "people", "type": "quantitative" }, + "y": { + "aggregate": "box-plot", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + }, Error, 'Both x and y cannot have aggregate'); + }); + it("should produce correct layered specs for vertical boxplot with two quantitative axes and use default orientation", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce an error if neither the x axis or y axis is specified", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + }, Error, 'Need a valid continuous axis for boxplots'); + }); + it("should produce a warning if continuous axis has aggregate property", log.wrap(function (localLogger) { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + chai_1.assert.equal(localLogger.warns[0], 'Continuous axis should not have customized aggregation function min'); + })); + it("should produce an error if build 1D boxplot with a discrete axis", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: "box-plot", + encoding: { + "x": { "field": "age", "type": "ordinal" } + } + }, config_1.defaultConfig); + }, Error, 'Need a valid continuous axis for boxplots'); + }); + it("should produce an error if both axes are discrete", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "age", + "type": "ordinal", + "axis": { "title": "age" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + }, Error, 'Need a valid continuous axis for boxplots'); + }); + it("should produce an error if in 2D boxplot both axes are not valid field definitions", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "type": "ordinal", + "axis": { "title": "age" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + }, Error, 'Need a valid continuous axis for boxplots'); + }); + it("should produce an error if 1D boxplot only axis is discrete", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: "box-plot", + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig); + }, Error, 'Need a valid continuous axis for boxplots'); + }); + it("should produce correct layered specs for vertical boxplot with two quantitative axes and specify orientation with orient", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + orient: "vertical", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce correct layered specs for horizontal boxplot with two quantitative axes and specify orientation with orient", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + orient: "horizontal", + extent: "min-max" + }, + encoding: { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "upper_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "lower_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 }, + } + } + ] + }); + }); + it("should produce correct layered specs for vertical boxplot with two quantitative axes and specify orientation with aggregate", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "aggregate": "box-plot", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce correct layered specs for horizontal boxplot with two quantitative axes and specify orientation with aggregate", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "people", + "type": "quantitative", + "aggregate": "box-plot", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "upper_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "lower_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "y": { "field": "age", "type": "quantitative" }, + "x": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 }, + } + } + ] + }); + }); + it("should produce correct layered specs for vertical boxplot with min and max", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce correct layered specs for horizontal boxplot with min and max", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "upper_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "lower_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 }, + } + } + ] + }); + }); + it("should produce correct layered specs for horizontal with no nonpositional encoding properties boxplot with min and max", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": ["age"] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "upper_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "lower_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 14 } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 14 } + } + } + ] + }); + }); + it("should produce correct layered specs for 1D boxplot with only x", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "x": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": [] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { + "field": "upper_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { + "field": "lower_box_people", + "type": "quantitative" + }, + "x2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 14 } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 14 } + } + } + ] + }); + }); + it("should produce correct layered specs for 1D boxplot with only y", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + type: "box-plot", + extent: "min-max" + }, + encoding: { + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "lower_whisker_people" + }, + { + "op": "max", + "field": "people", + "as": "upper_whisker_people" + } + ], + "groupby": [] + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 14 } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 14 } + } + } + ] + }); + }); +}); +describe("normalizeBoxIQR", function () { + it("should produce correct layered specs for vertical boxplot with two quantitative axes and use default orientation for a 1.5 * IQR whiskers with boxplot mark type", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: "box-plot", + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "min_people" + }, + { + "op": "max", + "field": "people", + "as": "max_people" + } + ], + "groupby": ["age"] + }, + { + calculate: 'datum.upper_box_people - datum.lower_box_people', + as: 'iqr_people' + }, + { + "calculate": "min(datum.upper_box_people + datum.iqr_people * " + config_1.defaultConfig.box.extent + ", datum.max_people)", + "as": "upper_whisker_people" + }, + { + "calculate": "max(datum.lower_box_people - datum.iqr_people * " + config_1.defaultConfig.box.extent + ", datum.min_people)", + "as": "lower_whisker_people" + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce correct layered specs for vertical boxplot with two quantitative axes and use default orientation for a 1.5 * IQR whiskers", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + "type": "box-plot", + "extent": 1.5 + }, + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "min_people" + }, + { + "op": "max", + "field": "people", + "as": "max_people" + } + ], + "groupby": ["age"] + }, + { + calculate: 'datum.upper_box_people - datum.lower_box_people', + as: 'iqr_people' + }, + { + "calculate": "min(datum.upper_box_people + datum.iqr_people * 1.5, datum.max_people)", + "as": "upper_whisker_people" + }, + { + "calculate": "max(datum.lower_box_people - datum.iqr_people * 1.5, datum.min_people)", + "as": "lower_whisker_people" + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { "value": "skyblue" } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should produce correct layered specs for vertical IQR boxplot where color encodes the mean of the people field", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + mark: { + "type": "box-plot", + "extent": 1.5 + }, + encoding: { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 }, + "color": { + "aggregate": "mean", + "field": "people", + "type": "quantitative" + } + } + }, config_1.defaultConfig), { + "description": "A box plot showing median, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [ + { + "aggregate": [ + { + "op": "q1", + "field": "people", + "as": "lower_box_people" + }, + { + "op": "q3", + "field": "people", + "as": "upper_box_people" + }, + { + "op": "median", + "field": "people", + "as": "mid_box_people" + }, + { + "op": "min", + "field": "people", + "as": "min_people" + }, + { + "op": "max", + "field": "people", + "as": "max_people" + }, + { + "op": "mean", + "field": "people", + "as": "mean_people" + } + ], + "groupby": ["age"] + }, + { + calculate: 'datum.upper_box_people - datum.lower_box_people', + as: 'iqr_people' + }, + { + "calculate": "min(datum.upper_box_people + datum.iqr_people * 1.5, datum.max_people)", + "as": "upper_whisker_people" + }, + { + "calculate": "max(datum.lower_box_people - datum.iqr_people * 1.5, datum.min_people)", + "as": "lower_whisker_people" + } + ], + "layer": [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_whisker_people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "field": "lower_box_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "upper_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_whisker_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'bar', + style: 'box' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "lower_box_people", + "type": "quantitative" + }, + "y2": { + "field": "upper_box_people", + "type": "quantitative" + }, + "size": { "value": 5 }, + "color": { + "field": "mean_people", + "type": "quantitative" + } + } + }, + { + mark: { + type: 'tick', + style: 'boxMid' + }, + "encoding": { + "x": { "field": "age", "type": "quantitative" }, + "y": { + "field": "mid_box_people", + "type": "quantitative" + }, + "color": { "value": "white" }, + "size": { "value": 5 } + } + } + ] + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94cGxvdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdGVzdC9jb21wb3NpdGVtYXJrL2JveHBsb3QudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4QkFBOEI7QUFDOUIsNkJBQTRCO0FBRTVCLHlEQUFxQztBQUNyQyx1Q0FBeUM7QUFDekMsNkNBQWlEO0FBR2pELFFBQVEsQ0FBQyxvQkFBb0IsRUFBRTtJQUM3QixFQUFFLENBQUMsNkRBQTZELEVBQUU7UUFDaEUsYUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNaLGdCQUFTLENBQUM7Z0JBQ1IsYUFBYSxFQUFFLGtHQUFrRztnQkFDakgsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFDO2dCQUN2QyxJQUFJLEVBQUU7b0JBQ0osSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLE1BQU0sRUFBRSxTQUFTO2lCQUNsQjtnQkFDRCxRQUFRLEVBQUU7b0JBQ1IsR0FBRyxFQUFFLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ3hFLEdBQUcsRUFBRTt3QkFDSCxXQUFXLEVBQUUsVUFBVTt3QkFDdkIsT0FBTyxFQUFFLFFBQVE7d0JBQ2pCLE1BQU0sRUFBRSxjQUFjO3dCQUN0QixNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDO3FCQUNoQztvQkFDRCxNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDO29CQUNwQixPQUFPLEVBQUUsRUFBQyxPQUFPLEVBQUcsU0FBUyxFQUFDO2lCQUMvQjthQUNGLEVBQUUsc0JBQWEsQ0FBQyxDQUFDO1FBQ3BCLENBQUMsRUFBRSxLQUFLLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FBQztJQUVMLEVBQUUsQ0FBQyxrSEFBa0gsRUFBRTtRQUNsSCxhQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFT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QUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGU6cXVvdGVtYXJrICovXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9zcmMvbG9nJztcbmltcG9ydCB7bm9ybWFsaXplfSBmcm9tICcuLi8uLi9zcmMvc3BlYyc7XG5pbXBvcnQge2RlZmF1bHRDb25maWd9IGZyb20gJy4uLy4vLi4vc3JjL2NvbmZpZyc7XG5cblxuZGVzY3JpYmUoXCJub3JtYWxpemVCb3hNaW5NYXhcIiwgKCkgPT4ge1xuICBpdChcInNob3VsZCBwcm9kdWNlIGFuIGVycm9yIGlmIGJvdGggYXhlcyBoYXZlIGFnZ3JlZ2F0ZSBib3hwbG90XCIsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIGV4dGVudDogXCJtaW4tbWF4XCJcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwiYm94LXBsb3RcIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJib3gtcGxvdFwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpO1xuICAgIH0sIEVycm9yLCAnQm90aCB4IGFuZCB5IGNhbm5vdCBoYXZlIGFnZ3JlZ2F0ZScpO1xuICB9KTtcblxuaXQoXCJzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIHZlcnRpY2FsIGJveHBsb3Qgd2l0aCB0d28gcXVhbnRpdGF0aXZlIGF4ZXMgYW5kIHVzZSBkZWZhdWx0IG9yaWVudGF0aW9uXCIsICgpID0+IHtcbiAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJtaWRfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJ3aGl0ZVwifSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBhbiBlcnJvciBpZiBuZWl0aGVyIHRoZSB4IGF4aXMgb3IgeSBheGlzIGlzIHNwZWNpZmllZFwiLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICBub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIiA6IFwic2t5Ymx1ZVwifVxuICAgICAgICB9XG4gICAgICB9LCBkZWZhdWx0Q29uZmlnKTtcbiAgICB9LCBFcnJvciwgJ05lZWQgYSB2YWxpZCBjb250aW51b3VzIGF4aXMgZm9yIGJveHBsb3RzJyk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHByb2R1Y2UgYSB3YXJuaW5nIGlmIGNvbnRpbnVvdXMgYXhpcyBoYXMgYWdncmVnYXRlIHByb3BlcnR5XCIsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIGV4dGVudDogXCJtaW4tbWF4XCJcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgIH1cbiAgICB9LCBkZWZhdWx0Q29uZmlnKTtcblxuICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgJ0NvbnRpbnVvdXMgYXhpcyBzaG91bGQgbm90IGhhdmUgY3VzdG9taXplZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBtaW4nKTtcbiAgfSkpO1xuXG4gIGl0KFwic2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgaWYgYnVpbGQgMUQgYm94cGxvdCB3aXRoIGEgZGlzY3JldGUgYXhpc1wiLCAoKSA9PiB7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICBub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazogXCJib3gtcGxvdFwiLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpO1xuICAgIH0sIEVycm9yLCAnTmVlZCBhIHZhbGlkIGNvbnRpbnVvdXMgYXhpcyBmb3IgYm94cGxvdHMnKTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBhbiBlcnJvciBpZiBib3RoIGF4ZXMgYXJlIGRpc2NyZXRlXCIsICgpID0+IHtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgIG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIGV4dGVudDogXCJtaW4tbWF4XCJcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwiYWdlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJvcmRpbmFsXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJhZ2VcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyk7XG4gICAgfSwgRXJyb3IsICdOZWVkIGEgdmFsaWQgY29udGludW91cyBheGlzIGZvciBib3hwbG90cycpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGFuIGVycm9yIGlmIGluIDJEIGJveHBsb3QgYm90aCBheGVzIGFyZSBub3QgdmFsaWQgZmllbGQgZGVmaW5pdGlvbnNcIiwgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgbm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgZXh0ZW50OiBcIm1pbi1tYXhcIlxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgIFwidHlwZVwiOiBcIm9yZGluYWxcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcImFnZVwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIiA6IFwic2t5Ymx1ZVwifVxuICAgICAgICB9XG4gICAgICB9LCBkZWZhdWx0Q29uZmlnKTtcbiAgICB9LCBFcnJvciwgJ05lZWQgYSB2YWxpZCBjb250aW51b3VzIGF4aXMgZm9yIGJveHBsb3RzJyk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgaWYgMUQgYm94cGxvdCBvbmx5IGF4aXMgaXMgZGlzY3JldGVcIiwgKCkgPT4ge1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgbm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IFwiYm94LXBsb3RcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyk7XG4gICAgfSwgRXJyb3IsICdOZWVkIGEgdmFsaWQgY29udGludW91cyBheGlzIGZvciBib3hwbG90cycpO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgdmVydGljYWwgYm94cGxvdCB3aXRoIHR3byBxdWFudGl0YXRpdmUgYXhlcyBhbmQgc3BlY2lmeSBvcmllbnRhdGlvbiB3aXRoIG9yaWVudFwiLCAoKSA9PiB7XG4gICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBvcmllbnQ6IFwidmVydGljYWxcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJtaWRfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJ3aGl0ZVwifSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIGhvcml6b250YWwgYm94cGxvdCB3aXRoIHR3byBxdWFudGl0YXRpdmUgYXhlcyBhbmQgc3BlY2lmeSBvcmllbnRhdGlvbiB3aXRoIG9yaWVudFwiLCAoKSA9PiB7XG4gICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgb3JpZW50OiBcImhvcml6b250YWxcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ4MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJtaWRfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJ3aGl0ZVwifSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHByb2R1Y2UgY29ycmVjdCBsYXllcmVkIHNwZWNzIGZvciB2ZXJ0aWNhbCBib3hwbG90IHdpdGggdHdvIHF1YW50aXRhdGl2ZSBheGVzIGFuZCBzcGVjaWZ5IG9yaWVudGF0aW9uIHdpdGggYWdncmVnYXRlXCIsICgpID0+IHtcbiAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJtaWRfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJ3aGl0ZVwifSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIGhvcml6b250YWwgYm94cGxvdCB3aXRoIHR3byBxdWFudGl0YXRpdmUgYXhlcyBhbmQgc3BlY2lmeSBvcmllbnRhdGlvbiB3aXRoIGFnZ3JlZ2F0ZVwiLCAoKSA9PiB7XG4gICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgZXh0ZW50OiBcIm1pbi1tYXhcIlxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImdyb3VwYnlcIjogW1wiYWdlXCJdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0aWNrJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibWlkX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwid2hpdGVcIn0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgdmVydGljYWwgYm94cGxvdCB3aXRoIG1pbiBhbmQgbWF4XCIsICgpID0+IHtcbiAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImdyb3VwYnlcIjogW1wiYWdlXCJdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0aWNrJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcIm1pZF9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiOiBcIndoaXRlXCJ9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgaG9yaXpvbnRhbCBib3hwbG90IHdpdGggbWluIGFuZCBtYXhcIiwgKCkgPT4ge1xuICAgICBhc3NlcnQuZGVlcEVxdWFsKG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIGV4dGVudDogXCJtaW4tbWF4XCJcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibWlkX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwid2hpdGVcIn0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgaG9yaXpvbnRhbCB3aXRoIG5vIG5vbnBvc2l0aW9uYWwgZW5jb2RpbmcgcHJvcGVydGllcyBib3hwbG90IHdpdGggbWluIGFuZCBtYXhcIiwgKCkgPT4ge1xuICAgICBhc3NlcnQuZGVlcEVxdWFsKG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIGV4dGVudDogXCJtaW4tbWF4XCJcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImdyb3VwYnlcIjogW1wiYWdlXCJdXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ4MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ4MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiAxNH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3RpY2snLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveE1pZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibWlkX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwid2hpdGVcIn0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiAxNH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgMUQgYm94cGxvdCB3aXRoIG9ubHkgeFwiLCAoKSA9PiB7XG4gICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgZXh0ZW50OiBcIm1pbi1tYXhcIlxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImdyb3VwYnlcIjogW11cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieDJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDE0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAndGljaycsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94TWlkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJtaWRfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIjogXCJ3aGl0ZVwifSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDE0fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gIH0pO1xuXG4gIGl0KFwic2hvdWxkIHByb2R1Y2UgY29ycmVjdCBsYXllcmVkIHNwZWNzIGZvciAxRCBib3hwbG90IHdpdGggb25seSB5XCIsICgpID0+IHtcbiAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6IFwiYm94LXBsb3RcIixcbiAgICAgICAgICBleHRlbnQ6IFwibWluLW1heFwiXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwidHJhbnNmb3JtXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInEzXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtZWRpYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogMTR9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0aWNrJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcIm1pZF9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiOiBcIndoaXRlXCJ9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogMTR9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgfSk7XG59KTtcblxuXG5kZXNjcmliZShcIm5vcm1hbGl6ZUJveElRUlwiLCAoKSA9PiB7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIHZlcnRpY2FsIGJveHBsb3Qgd2l0aCB0d28gcXVhbnRpdGF0aXZlIGF4ZXMgYW5kIHVzZSBkZWZhdWx0IG9yaWVudGF0aW9uIGZvciBhIDEuNSAqIElRUiB3aGlza2VycyB3aXRoIGJveHBsb3QgbWFyayB0eXBlXCIsICgpID0+IHtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKG5vcm1hbGl6ZSh7XG4gICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICBtYXJrOiBcImJveC1wbG90XCIsXG4gICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgIH0sXG4gICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCIgOiBcInNreWJsdWVcIn1cbiAgICAgICB9XG4gICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICB7XG4gICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFtcbiAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICBcIm9wXCI6IFwicTFcIixcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX2JveF9wZW9wbGVcIlxuICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgXCJvcFwiOiBcIm1lZGlhblwiLFxuICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1pZF9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFwib3BcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaW5fcGVvcGxlXCJcbiAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgIFwiYXNcIjogXCJtYXhfcGVvcGxlXCJcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIF0sXG4gICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgIH0sXG4gICAgICAgICB7XG4gICAgICAgICAgIGNhbGN1bGF0ZTogJ2RhdHVtLnVwcGVyX2JveF9wZW9wbGUgLSBkYXR1bS5sb3dlcl9ib3hfcGVvcGxlJyxcbiAgICAgICAgICAgYXM6ICdpcXJfcGVvcGxlJ1xuICAgICAgICAgfSxcbiAgICAgICAgIHtcbiAgICAgICAgICAgXCJjYWxjdWxhdGVcIjogYG1pbihkYXR1bS51cHBlcl9ib3hfcGVvcGxlICsgZGF0dW0uaXFyX3Blb3BsZSAqICR7ZGVmYXVsdENvbmZpZy5ib3guZXh0ZW50fSwgZGF0dW0ubWF4X3Blb3BsZSlgLFxuICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfd2hpc2tlcl9wZW9wbGVcIlxuICAgICAgICAgfSxcbiAgICAgICAgIHtcbiAgICAgICAgICAgXCJjYWxjdWxhdGVcIjogYG1heChkYXR1bS5sb3dlcl9ib3hfcGVvcGxlIC0gZGF0dW0uaXFyX3Blb3BsZSAqICR7ZGVmYXVsdENvbmZpZy5ib3guZXh0ZW50fSwgZGF0dW0ubWluX3Blb3BsZSlgLFxuICAgICAgICAgICBcImFzXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIlxuICAgICAgICAgfVxuICAgICAgIF0sXG4gICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICB7XG4gICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICB9LFxuICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICAgfSxcbiAgICAgICAgIHtcbiAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgIH0sXG4gICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cbiAgICAgICAgIH0sXG4gICAgICAgICB7XG4gICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICBzdHlsZTogJ2JveCdcbiAgICAgICAgICAgfSxcbiAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgICAgIH1cbiAgICAgICAgIH0sXG4gICAgICAgICB7XG4gICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICB0eXBlOiAndGljaycsXG4gICAgICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgICAgIH0sXG4gICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcIm1pZF9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiOiBcIndoaXRlXCJ9LFxuICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgXVxuICAgICB9KTtcbiAgfSk7XG5cbiAgaXQoXCJzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIHZlcnRpY2FsIGJveHBsb3Qgd2l0aCB0d28gcXVhbnRpdGF0aXZlIGF4ZXMgYW5kIHVzZSBkZWZhdWx0IG9yaWVudGF0aW9uIGZvciBhIDEuNSAqIElRUiB3aGlza2Vyc1wiLCAoKSA9PiB7XG4gICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgYm94IHBsb3Qgc2hvd2luZyBtZWRpYW4sIG1pbiwgYW5kIG1heCBpbiB0aGUgVVMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgYWdlIGdyb3VwcyBpbiAyMDAwLlwiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICBcInR5cGVcIjogXCJib3gtcGxvdFwiLFxuICAgICAgICAgIFwiZXh0ZW50XCI6IDEuNVxuICAgICAgICB9LFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiIDogXCJza3libHVlXCJ9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaW5fcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1heF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJncm91cGJ5XCI6IFtcImFnZVwiXVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FsY3VsYXRlOiAnZGF0dW0udXBwZXJfYm94X3Blb3BsZSAtIGRhdHVtLmxvd2VyX2JveF9wZW9wbGUnLFxuICAgICAgICAgICAgYXM6ICdpcXJfcGVvcGxlJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJjYWxjdWxhdGVcIjogXCJtaW4oZGF0dW0udXBwZXJfYm94X3Blb3BsZSArIGRhdHVtLmlxcl9wZW9wbGUgKiAxLjUsIGRhdHVtLm1heF9wZW9wbGUpXCIsXG4gICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfd2hpc2tlcl9wZW9wbGVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJjYWxjdWxhdGVcIjogXCJtYXgoZGF0dW0ubG93ZXJfYm94X3Blb3BsZSAtIGRhdHVtLmlxcl9wZW9wbGUgKiAxLjUsIGRhdHVtLm1pbl9wZW9wbGUpXCIsXG4gICAgICAgICAgICBcImFzXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl93aGlza2VyX3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImxvd2VyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hXaGlza2VyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwidXBwZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICdiYXInLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1widmFsdWVcIiA6IFwic2t5Ymx1ZVwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAndGljaycsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94TWlkJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcIm1pZF9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJ2YWx1ZVwiOiBcIndoaXRlXCJ9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICB9KTtcblxuICBpdChcInNob3VsZCBwcm9kdWNlIGNvcnJlY3QgbGF5ZXJlZCBzcGVjcyBmb3IgdmVydGljYWwgSVFSIGJveHBsb3Qgd2hlcmUgY29sb3IgZW5jb2RlcyB0aGUgbWVhbiBvZiB0aGUgcGVvcGxlIGZpZWxkXCIsICgpID0+IHtcbiAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiQSBib3ggcGxvdCBzaG93aW5nIG1lZGlhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIFwidHlwZVwiOiBcImJveC1wbG90XCIsXG4gICAgICAgICAgXCJleHRlbnRcIjogMS41XG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGJveCBwbG90IHNob3dpbmcgbWVkaWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcInExXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJxM1wiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcImFzXCI6IFwidXBwZXJfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWVkaWFuXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaWRfYm94X3Blb3BsZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcIm9wXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwiYXNcIjogXCJtaW5fcGVvcGxlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwib3BcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1heF9wZW9wbGVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJvcFwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJhc1wiOiBcIm1lYW5fcGVvcGxlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZ3JvdXBieVwiOiBbXCJhZ2VcIl1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbGN1bGF0ZTogJ2RhdHVtLnVwcGVyX2JveF9wZW9wbGUgLSBkYXR1bS5sb3dlcl9ib3hfcGVvcGxlJyxcbiAgICAgICAgICAgIGFzOiAnaXFyX3Blb3BsZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiY2FsY3VsYXRlXCI6IFwibWluKGRhdHVtLnVwcGVyX2JveF9wZW9wbGUgKyBkYXR1bS5pcXJfcGVvcGxlICogMS41LCBkYXR1bS5tYXhfcGVvcGxlKVwiLFxuICAgICAgICAgICAgXCJhc1wiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwiY2FsY3VsYXRlXCI6IFwibWF4KGRhdHVtLmxvd2VyX2JveF9wZW9wbGUgLSBkYXR1bS5pcXJfcGVvcGxlICogMS41LCBkYXR1bS5taW5fcGVvcGxlKVwiLFxuICAgICAgICAgICAgXCJhc1wiOiBcImxvd2VyX3doaXNrZXJfcGVvcGxlXCJcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6IHtcbiAgICAgICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfd2hpc2tlcl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJsb3dlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAncnVsZScsXG4gICAgICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJ5MlwiOiB7XG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInVwcGVyX3doaXNrZXJfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWFyazoge1xuICAgICAgICAgICAgICB0eXBlOiAnYmFyJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibG93ZXJfYm94X3Blb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJ1cHBlcl9ib3hfcGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibWVhbl9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgICAgIHR5cGU6ICd0aWNrJyxcbiAgICAgICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwibWlkX2JveF9wZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcInZhbHVlXCI6IFwid2hpdGVcIn0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gIH0pO1xuXG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/compositemark/errorbar.test.d.ts b/build/test/compositemark/errorbar.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/compositemark/errorbar.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/compositemark/errorbar.test.js b/build/test/compositemark/errorbar.test.js new file mode 100644 index 0000000000..08844029a1 --- /dev/null +++ b/build/test/compositemark/errorbar.test.js @@ -0,0 +1,94 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var spec_1 = require("../../src/spec"); +var config_1 = require(".././../src/config"); +describe("normalizeErrorBar", function () { + it("should produce correct layered specs for horizontal error bar", function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "data": { "url": "data/population.json" }, + mark: "error-bar", + encoding: { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + }, + "size": { "value": 5 } + } + }, config_1.defaultConfig), { + "data": { "url": "data/population.json" }, + "layer": [ + { + "mark": "rule", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "x2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + } + } + }, + { + "mark": "tick", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 } + } + }, + { + "mark": "tick", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "aggregate": "max", + "field": "people", + "type": "quantitative", + }, + "size": { "value": 5 } + } + } + ] + }); + }); + it("should throw error when missing x2 and y2", function () { + chai_1.assert.throws(function () { + spec_1.normalize({ + "data": { "url": "data/population.json" }, + mark: "error-bar", + encoding: { + "y": { "field": "age", "type": "ordinal" }, + "x": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 } + } + }, config_1.defaultConfig); + }, Error, 'Neither x2 or y2 provided'); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JiYXIudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3QvY29tcG9zaXRlbWFyay9lcnJvcmJhci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsOEJBQThCO0FBQzlCLDZCQUE0QjtBQUU1Qix1Q0FBeUM7QUFDekMsNkNBQWlEO0FBR2pELFFBQVEsQ0FBQyxtQkFBbUIsRUFBRTtJQUUxQixFQUFFLENBQUMsK0RBQStELEVBQUU7UUFDbEUsYUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBUyxDQUFDO1lBQ3pCLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxzQkFBc0IsRUFBQztZQUN2QyxJQUFJLEVBQUUsV0FBVztZQUNqQixRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFDO2dCQUN2QyxHQUFHLEVBQUU7b0JBQ0gsV0FBVyxFQUFFLEtBQUs7b0JBQ2xCLE9BQU8sRUFBRSxRQUFRO29CQUNqQixNQUFNLEVBQUUsY0FBYztvQkFDdEIsTUFBTSxFQUFFLEVBQUMsT0FBTyxFQUFFLFlBQVksRUFBQztpQkFDaEM7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLFdBQVcsRUFBRSxLQUFLO29CQUNsQixPQUFPLEVBQUUsUUFBUTtvQkFDakIsTUFBTSxFQUFFLGNBQWM7aUJBQ3ZCO2dCQUNELE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUM7YUFDckI7U0FDRixFQUFFLHNCQUFhLENBQUMsRUFBRTtZQUNqQixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsc0JBQXNCLEVBQUM7WUFDdkMsT0FBTyxFQUFFO2dCQUNQO29CQUNFLE1BQU0sRUFBRSxNQUFNO29CQUNkLFVBQVUsRUFBRTt3QkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUM7d0JBQ3ZDLEdBQUcsRUFBRTs0QkFDSCxXQUFXLEVBQUUsS0FBSzs0QkFDbEIsT0FBTyxFQUFFLFFBQVE7NEJBQ2pCLE1BQU0sRUFBRSxjQUFjOzRCQUN0QixNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsWUFBWSxFQUFDO3lCQUNoQzt3QkFDRCxJQUFJLEVBQUU7NEJBQ0osV0FBVyxFQUFFLEtBQUs7NEJBQ2xCLE9BQU8sRUFBRSxRQUFROzRCQUNqQixNQUFNLEVBQUUsY0FBYzt5QkFDdkI7cUJBQ0Y7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsTUFBTSxFQUFFLE1BQU07b0JBQ2QsVUFBVSxFQUFFO3dCQUNWLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQzt3QkFDdkMsR0FBRyxFQUFFOzRCQUNILFdBQVcsRUFBRSxLQUFLOzRCQUNsQixPQUFPLEVBQUUsUUFBUTs0QkFDakIsTUFBTSxFQUFFLGNBQWM7NEJBQ3RCLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUM7eUJBQ2hDO3dCQUNELE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUM7cUJBQ3JCO2lCQUNGO2dCQUNEO29CQUNFLE1BQU0sRUFBRSxNQUFNO29CQUNkLFVBQVUsRUFBRTt3QkFDVixHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUM7d0JBQ3ZDLEdBQUcsRUFBRTs0QkFDSCxXQUFXLEVBQUUsS0FBSzs0QkFDbEIsT0FBTyxFQUFFLFFBQVE7NEJBQ2pCLE1BQU0sRUFBRSxjQUFjO3lCQUV2Qjt3QkFDRCxNQUFNLEVBQUUsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDO3FCQUNyQjtpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSixFQUFFLENBQUMsMkNBQTJDLEVBQUU7UUFDN0MsYUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNaLGdCQUFTLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLHNCQUFzQixFQUFDO2dCQUN2QyxJQUFJLEVBQUUsV0FBVztnQkFDakIsUUFBUSxFQUFFO29CQUNSLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQztvQkFDdkMsR0FBRyxFQUFFO3dCQUNILFdBQVcsRUFBRSxLQUFLO3dCQUNsQixPQUFPLEVBQUUsUUFBUTt3QkFDakIsTUFBTSxFQUFFLGNBQWM7d0JBQ3RCLE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUM7cUJBQ2hDO29CQUNELE1BQU0sRUFBRSxFQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUM7aUJBQ3JCO2FBQ0YsRUFBRSxzQkFBYSxDQUFDLENBQUM7UUFDcEIsQ0FBQyxFQUFFLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiB0c2xpbnQ6ZGlzYWJsZTpxdW90ZW1hcmsgKi9cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcblxuaW1wb3J0IHtub3JtYWxpemV9IGZyb20gJy4uLy4uL3NyYy9zcGVjJztcbmltcG9ydCB7ZGVmYXVsdENvbmZpZ30gZnJvbSAnLi4vLi8uLi9zcmMvY29uZmlnJztcblxuXG5kZXNjcmliZShcIm5vcm1hbGl6ZUVycm9yQmFyXCIsICgpID0+IHtcblxuICAgIGl0KFwic2hvdWxkIHByb2R1Y2UgY29ycmVjdCBsYXllcmVkIHNwZWNzIGZvciBob3Jpem9udGFsIGVycm9yIGJhclwiLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5vcm1hbGl6ZSh7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgbWFyazogXCJlcnJvci1iYXJcIixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWF4XCIsXG4gICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcIngyXCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1heFwiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJ0aWNrXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwidGlja1wiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgIFwieFwiOiB7XG4gICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgLy8gXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICBpdChcInNob3VsZCB0aHJvdyBlcnJvciB3aGVuIG1pc3NpbmcgeDIgYW5kIHkyXCIsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4ge1xuICAgICAgICBub3JtYWxpemUoe1xuICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgICBtYXJrOiBcImVycm9yLWJhclwiLFxuICAgICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgXCJ4XCI6IHtcbiAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgZGVmYXVsdENvbmZpZyk7XG4gICAgICB9LCBFcnJvciwgJ05laXRoZXIgeDIgb3IgeTIgcHJvdmlkZWQnKTtcbiAgICB9KTtcbiB9KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/config.test.d.ts b/build/test/config.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/config.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/config.test.js b/build/test/config.test.js new file mode 100644 index 0000000000..0a57ac637e --- /dev/null +++ b/build/test/config.test.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var config_1 = require("../src/config"); +var mark_1 = require("../src/mark"); +var util_1 = require("../src/util"); +describe('config', function () { + describe('stripAndRedirectConfig', function () { + var config = tslib_1.__assign({}, config_1.defaultConfig, { mark: tslib_1.__assign({}, config_1.defaultConfig.mark, { opacity: 0.3 }), bar: tslib_1.__assign({ opacity: 0.5 }, config_1.defaultConfig.bar), view: { + fill: '#eee' + }, title: { + color: 'red', + fontWeight: 'bold' + } }); + var copy = util_1.duplicate(config); + var output = config_1.stripAndRedirectConfig(config); + it('should not cause side-effect to the input', function () { + chai_1.assert.deepEqual(config, copy); + }); + it('should remove VL only mark config but keep Vega mark config', function () { + chai_1.assert.isUndefined(output.mark.color); + chai_1.assert.equal(output.mark.opacity, 0.3); + }); + it('should redirect mark config to style and remove VL only mark-specific config', function () { + for (var _i = 0, PRIMITIVE_MARKS_1 = mark_1.PRIMITIVE_MARKS; _i < PRIMITIVE_MARKS_1.length; _i++) { + var mark = PRIMITIVE_MARKS_1[_i]; + chai_1.assert.isUndefined(output[mark], mark + " config should be redirected"); + } + chai_1.assert.isUndefined(output.style.bar['binSpacing'], "VL only Bar config should be removed"); + chai_1.assert.isUndefined(output.style.cell['width'], "VL only cell config should be removed"); + chai_1.assert.isUndefined(output.style.cell['height'], "VL only cell config should be removed"); + chai_1.assert.equal(output.style.cell['fill'], '#eee', "config.view should be redirect to config.style.cell"); + chai_1.assert.deepEqual(output.style.bar.opacity, 0.5, 'Bar config should be redirected to config.style.bar'); + }); + it('should redirect config.title to config.style.group-title and rename color to fill', function () { + chai_1.assert.deepEqual(output.title, undefined); + chai_1.assert.deepEqual(output.style['group-title'].fontWeight, 'bold'); + chai_1.assert.deepEqual(output.style['group-title'].fill, 'red'); + }); + it('should remove empty config object', function () { + chai_1.assert.isUndefined(output.axisTop); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L2NvbmZpZy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDZCQUE0QjtBQUM1Qix3Q0FBNEU7QUFDNUUsb0NBQTRDO0FBQzVDLG9DQUFzQztBQUV0QyxRQUFRLENBQUMsUUFBUSxFQUFFO0lBQ2pCLFFBQVEsQ0FBQyx3QkFBd0IsRUFBRTtRQUNqQyxJQUFNLE1BQU0sd0JBQ1Asc0JBQWEsSUFDaEIsSUFBSSx1QkFDQyxzQkFBYSxDQUFDLElBQUksSUFDckIsT0FBTyxFQUFFLEdBQUcsS0FFZCxHQUFHLHFCQUNELE9BQU8sRUFBRSxHQUFHLElBQ1Qsc0JBQWEsQ0FBQyxHQUFHLEdBRXRCLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsTUFBTTthQUNiLEVBQ0QsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxLQUFLO2dCQUNaLFVBQVUsRUFBRSxNQUFNO2FBQ25CLEdBQ0YsQ0FBQztRQUNGLElBQU0sSUFBSSxHQUFHLGdCQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0IsSUFBTSxNQUFNLEdBQUcsK0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUMsRUFBRSxDQUFDLDJDQUEyQyxFQUFFO1lBQzlDLGFBQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZEQUE2RCxFQUFFO1lBQ2hFLGFBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxhQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhFQUE4RSxFQUFFO1lBQ2pGLEtBQW1CLFVBQWUsRUFBZixvQkFBQSxzQkFBZSxFQUFmLDZCQUFlLEVBQWYsSUFBZSxFQUFFO2dCQUEvQixJQUFNLElBQUksd0JBQUE7Z0JBQ2IsYUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUssSUFBSSxpQ0FBOEIsQ0FBQyxDQUFDO2FBQ3pFO1lBQ0QsYUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO1lBQzNGLGFBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztZQUN4RixhQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLHVDQUF1QyxDQUFDLENBQUM7WUFDekYsYUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUV2RyxhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUN6RyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxtRkFBbUYsRUFBRTtZQUN0RixhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRSxhQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLGFBQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtDb25maWcsIGRlZmF1bHRDb25maWcsIHN0cmlwQW5kUmVkaXJlY3RDb25maWd9IGZyb20gJy4uL3NyYy9jb25maWcnO1xuaW1wb3J0IHtQUklNSVRJVkVfTUFSS1N9IGZyb20gJy4uL3NyYy9tYXJrJztcbmltcG9ydCB7ZHVwbGljYXRlfSBmcm9tICcuLi9zcmMvdXRpbCc7XG5cbmRlc2NyaWJlKCdjb25maWcnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzdHJpcEFuZFJlZGlyZWN0Q29uZmlnJywgKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZzogQ29uZmlnID0ge1xuICAgICAgLi4uZGVmYXVsdENvbmZpZyxcbiAgICAgIG1hcms6IHtcbiAgICAgICAgLi4uZGVmYXVsdENvbmZpZy5tYXJrLFxuICAgICAgICBvcGFjaXR5OiAwLjMsXG4gICAgICB9LFxuICAgICAgYmFyOiB7XG4gICAgICAgIG9wYWNpdHk6IDAuNSxcbiAgICAgICAgLi4uZGVmYXVsdENvbmZpZy5iYXJcbiAgICAgIH0sXG4gICAgICB2aWV3OiB7XG4gICAgICAgIGZpbGw6ICcjZWVlJ1xuICAgICAgfSxcbiAgICAgIHRpdGxlOiB7XG4gICAgICAgIGNvbG9yOiAncmVkJyxcbiAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBjb3B5ID0gZHVwbGljYXRlKGNvbmZpZyk7XG4gICAgY29uc3Qgb3V0cHV0ID0gc3RyaXBBbmRSZWRpcmVjdENvbmZpZyhjb25maWcpO1xuXG4gICAgaXQoJ3Nob3VsZCBub3QgY2F1c2Ugc2lkZS1lZmZlY3QgdG8gdGhlIGlucHV0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChjb25maWcsIGNvcHkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgVkwgb25seSBtYXJrIGNvbmZpZyBidXQga2VlcCBWZWdhIG1hcmsgY29uZmlnJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG91dHB1dC5tYXJrLmNvbG9yKTtcbiAgICAgIGFzc2VydC5lcXVhbChvdXRwdXQubWFyay5vcGFjaXR5LCAwLjMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWRpcmVjdCBtYXJrIGNvbmZpZyB0byBzdHlsZSBhbmQgcmVtb3ZlIFZMIG9ubHkgbWFyay1zcGVjaWZpYyBjb25maWcnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IG1hcmsgb2YgUFJJTUlUSVZFX01BUktTKSB7XG4gICAgICAgIGFzc2VydC5pc1VuZGVmaW5lZChvdXRwdXRbbWFya10sIGAke21hcmt9IGNvbmZpZyBzaG91bGQgYmUgcmVkaXJlY3RlZGApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG91dHB1dC5zdHlsZS5iYXJbJ2JpblNwYWNpbmcnXSwgYFZMIG9ubHkgQmFyIGNvbmZpZyBzaG91bGQgYmUgcmVtb3ZlZGApO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG91dHB1dC5zdHlsZS5jZWxsWyd3aWR0aCddLCBgVkwgb25seSBjZWxsIGNvbmZpZyBzaG91bGQgYmUgcmVtb3ZlZGApO1xuICAgICAgYXNzZXJ0LmlzVW5kZWZpbmVkKG91dHB1dC5zdHlsZS5jZWxsWydoZWlnaHQnXSwgYFZMIG9ubHkgY2VsbCBjb25maWcgc2hvdWxkIGJlIHJlbW92ZWRgKTtcbiAgICAgIGFzc2VydC5lcXVhbChvdXRwdXQuc3R5bGUuY2VsbFsnZmlsbCddLCAnI2VlZScsIGBjb25maWcudmlldyBzaG91bGQgYmUgcmVkaXJlY3QgdG8gY29uZmlnLnN0eWxlLmNlbGxgKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChvdXRwdXQuc3R5bGUuYmFyLm9wYWNpdHksIDAuNSwgJ0JhciBjb25maWcgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gY29uZmlnLnN0eWxlLmJhcicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWRpcmVjdCBjb25maWcudGl0bGUgdG8gY29uZmlnLnN0eWxlLmdyb3VwLXRpdGxlIGFuZCByZW5hbWUgY29sb3IgdG8gZmlsbCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwob3V0cHV0LnRpdGxlLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChvdXRwdXQuc3R5bGVbJ2dyb3VwLXRpdGxlJ10uZm9udFdlaWdodCwgJ2JvbGQnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwob3V0cHV0LnN0eWxlWydncm91cC10aXRsZSddLmZpbGwsICdyZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVtb3ZlIGVtcHR5IGNvbmZpZyBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuaXNVbmRlZmluZWQob3V0cHV0LmF4aXNUb3ApO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/datetime.test.d.ts b/build/test/datetime.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/datetime.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/datetime.test.js b/build/test/datetime.test.js new file mode 100644 index 0000000000..d9a796c2ec --- /dev/null +++ b/build/test/datetime.test.js @@ -0,0 +1,99 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var datetime_1 = require("../src/datetime"); +var log = tslib_1.__importStar(require("../src/log")); +describe('datetime', function () { + describe('dateTimeExpr', function () { + it('should drop day if day is combined with year/month/date', log.wrap(function (localLogger) { + var d = { + year: 2007, + day: 'monday' + }; + var expr = datetime_1.dateTimeExpr(d, true); + chai_1.assert.equal(expr, 'datetime(2007, 0, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(localLogger.warns[0], log.message.droppedDay(d)); + })); + it('should normalize numeric quarter correctly', function () { + var expr = datetime_1.dateTimeExpr({ + quarter: 2 + }, true); + chai_1.assert.equal(expr, 'datetime(0, 1*3, 1, 0, 0, 0, 0)'); + }); + it('should log warning for quarter > 4', log.wrap(function (localLogger) { + chai_1.assert.equal(datetime_1.dateTimeExpr({ + quarter: 5 + }, true), 'datetime(0, 4*3, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(localLogger.warns[0], log.message.invalidTimeUnit('quarter', 5)); + })); + it('should throw error for invalid quarter', function () { + chai_1.assert.throws(function () { + datetime_1.dateTimeExpr({ quarter: 'Q' }, true); + }, Error, log.message.invalidTimeUnit('quarter', 'Q')); + }); + it('should normalize numeric month correctly', function () { + var expr = datetime_1.dateTimeExpr({ + month: 1 + }, true); + chai_1.assert.equal(expr, 'datetime(0, 0, 1, 0, 0, 0, 0)'); + }); + it('should normalize month name correctly', function () { + chai_1.assert.equal(datetime_1.dateTimeExpr({ + month: 'January' + }, true), 'datetime(0, 0, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + month: 'january' + }, true), 'datetime(0, 0, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + month: 'Jan' + }, true), 'datetime(0, 0, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + month: 'jan' + }, true), 'datetime(0, 0, 1, 0, 0, 0, 0)'); + }); + it('should throw error for invalid month', function () { + chai_1.assert.throws(function () { + datetime_1.dateTimeExpr({ month: 'J' }, true); + }, Error, log.message.invalidTimeUnit('month', 'J')); + }); + it('should normalize numeric day (of week) correctly', function () { + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 0 + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 7 + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + }); + it('should normalize day name correctly and use year 2006 to ensure correct', function () { + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 'Sunday' + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 'sunday' + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 'Sun' + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + chai_1.assert.equal(datetime_1.dateTimeExpr({ + day: 'sun' + }, true), 'datetime(2006, 0, 0+1, 0, 0, 0, 0)'); + }); + it('should throw error for invalid day', function () { + chai_1.assert.throws(function () { + datetime_1.dateTimeExpr({ day: 'S' }, true); + }, Error, log.message.invalidTimeUnit('day', 'S')); + }); + it('should use utc expression if utc is specified', function () { + var d = { + year: 2007, + day: 'monday', + utc: true + }; + var expr = datetime_1.dateTimeExpr(d, true); + chai_1.assert.equal(expr, 'utc(2007, 0, 1, 0, 0, 0, 0)'); + }); + // Note: Other part of coverage handled by timeUnit.fieldExpr's test + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZGF0ZXRpbWUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsNENBQTZDO0FBQzdDLHNEQUFrQztBQUVsQyxRQUFRLENBQUMsVUFBVSxFQUFFO0lBQ25CLFFBQVEsQ0FBQyxjQUFjLEVBQUU7UUFDdkIsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQ2pGLElBQU0sQ0FBQyxHQUFHO2dCQUNSLElBQUksRUFBRSxJQUFJO2dCQUNWLEdBQUcsRUFBRSxRQUFRO2FBQ2QsQ0FBQztZQUNGLElBQU0sSUFBSSxHQUFHLHVCQUFZLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLGtDQUFrQyxDQUFDLENBQUM7WUFDdkQsYUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVKLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRTtZQUMvQyxJQUFNLElBQUksR0FBRyx1QkFBWSxDQUFDO2dCQUN4QixPQUFPLEVBQUUsQ0FBQzthQUNYLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDVCxhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9DQUFvQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxXQUFXO1lBQzVELGFBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQVksQ0FBQztnQkFDeEIsT0FBTyxFQUFFLENBQUM7YUFDWCxFQUFFLElBQUks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QUFJLENBQUMsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO1lBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsdUJBQVksQ0FBQztnQkFDeEIsR0FBRyxFQUFFLEtBQUs7YUFDWCxFQUFFLElBQUksQ0FBQyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0NBQW9DLEVBQUU7WUFDdkMsYUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDWix1QkFBWSxDQUFDLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pDLENBQUMsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0NBQStDLEVBQUU7WUFDbEQsSUFBTSxDQUFDLEdBQUc7Z0JBQ1IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsR0FBRyxFQUFFLElBQUk7YUFDVixDQUFDO1lBQ0YsSUFBTSxJQUFJLEdBQUcsdUJBQVksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkMsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILG9FQUFvRTtJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtkYXRlVGltZUV4cHJ9IGZyb20gJy4uL3NyYy9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vc3JjL2xvZyc7XG5cbmRlc2NyaWJlKCdkYXRldGltZScsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2RhdGVUaW1lRXhwcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGRyb3AgZGF5IGlmIGRheSBpcyBjb21iaW5lZCB3aXRoIHllYXIvbW9udGgvZGF0ZScsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgICAgY29uc3QgZCA9IHtcbiAgICAgICAgeWVhcjogMjAwNyxcbiAgICAgICAgZGF5OiAnbW9uZGF5J1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGV4cHIgPSBkYXRlVGltZUV4cHIoZCwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwciwgJ2RhdGV0aW1lKDIwMDcsIDAsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmRyb3BwZWREYXkoZCkpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgbm9ybWFsaXplIG51bWVyaWMgcXVhcnRlciBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZGF0ZVRpbWVFeHByKHtcbiAgICAgICAgcXVhcnRlcjogMlxuICAgICAgfSwgdHJ1ZSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwciwgJ2RhdGV0aW1lKDAsIDEqMywgMSwgMCwgMCwgMCwgMCknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbG9nIHdhcm5pbmcgZm9yIHF1YXJ0ZXIgPiA0JywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZVRpbWVFeHByKHtcbiAgICAgICAgcXVhcnRlcjogNVxuICAgICAgfSwgdHJ1ZSksICdkYXRldGltZSgwLCA0KjMsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmludmFsaWRUaW1lVW5pdCgncXVhcnRlcicsIDUpKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIHF1YXJ0ZXInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGF0ZVRpbWVFeHByKHtxdWFydGVyOiAnUSd9LCB0cnVlKTtcbiAgICAgIH0sIEVycm9yLCBsb2cubWVzc2FnZS5pbnZhbGlkVGltZVVuaXQoJ3F1YXJ0ZXInLCAnUScpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm9ybWFsaXplIG51bWVyaWMgbW9udGggY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGRhdGVUaW1lRXhwcih7XG4gICAgICAgIG1vbnRoOiAxXG4gICAgICB9LCB0cnVlKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0ZXRpbWUoMCwgMCwgMSwgMCwgMCwgMCwgMCknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm9ybWFsaXplIG1vbnRoIG5hbWUgY29ycmVjdGx5JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGVUaW1lRXhwcih7XG4gICAgICAgIG1vbnRoOiAnSmFudWFyeSdcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMCwgMCwgMSwgMCwgMCwgMCwgMCknKTtcbiAgICAgIGFzc2VydC5lcXVhbChkYXRlVGltZUV4cHIoe1xuICAgICAgICBtb250aDogJ2phbnVhcnknXG4gICAgICB9LCB0cnVlKSwgJ2RhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZVRpbWVFeHByKHtcbiAgICAgICAgbW9udGg6ICdKYW4nXG4gICAgICB9LCB0cnVlKSwgJ2RhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZVRpbWVFeHByKHtcbiAgICAgICAgbW9udGg6ICdqYW4nXG4gICAgICB9LCB0cnVlKSwgJ2RhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGVycm9yIGZvciBpbnZhbGlkIG1vbnRoJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cygoKSA9PiB7XG4gICAgICAgIGRhdGVUaW1lRXhwcih7bW9udGg6ICdKJ30sIHRydWUpO1xuICAgICAgfSwgRXJyb3IsIGxvZy5tZXNzYWdlLmludmFsaWRUaW1lVW5pdCgnbW9udGgnLCAnSicpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm9ybWFsaXplIG51bWVyaWMgZGF5IChvZiB3ZWVrKSBjb3JyZWN0bHknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZVRpbWVFeHByKHtcbiAgICAgICAgZGF5OiAwXG4gICAgICB9LCB0cnVlKSwgJ2RhdGV0aW1lKDIwMDYsIDAsIDArMSwgMCwgMCwgMCwgMCknKTtcbiAgICAgIGFzc2VydC5lcXVhbChkYXRlVGltZUV4cHIoe1xuICAgICAgICBkYXk6IDdcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMjAwNiwgMCwgMCsxLCAwLCAwLCAwLCAwKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBub3JtYWxpemUgZGF5IG5hbWUgY29ycmVjdGx5IGFuZCB1c2UgeWVhciAyMDA2IHRvIGVuc3VyZSBjb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGVUaW1lRXhwcih7XG4gICAgICAgIGRheTogJ1N1bmRheSdcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMjAwNiwgMCwgMCsxLCAwLCAwLCAwLCAwKScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGVUaW1lRXhwcih7XG4gICAgICAgIGRheTogJ3N1bmRheSdcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMjAwNiwgMCwgMCsxLCAwLCAwLCAwLCAwKScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGVUaW1lRXhwcih7XG4gICAgICAgIGRheTogJ1N1bidcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMjAwNiwgMCwgMCsxLCAwLCAwLCAwLCAwKScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGVUaW1lRXhwcih7XG4gICAgICAgIGRheTogJ3N1bidcbiAgICAgIH0sIHRydWUpLCAnZGF0ZXRpbWUoMjAwNiwgMCwgMCsxLCAwLCAwLCAwLCAwKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBmb3IgaW52YWxpZCBkYXknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgZGF0ZVRpbWVFeHByKHtkYXk6ICdTJ30sIHRydWUpO1xuICAgICAgfSwgRXJyb3IsIGxvZy5tZXNzYWdlLmludmFsaWRUaW1lVW5pdCgnZGF5JywgJ1MnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHVzZSB1dGMgZXhwcmVzc2lvbiBpZiB1dGMgaXMgc3BlY2lmaWVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZCA9IHtcbiAgICAgICAgeWVhcjogMjAwNyxcbiAgICAgICAgZGF5OiAnbW9uZGF5JyxcbiAgICAgICAgdXRjOiB0cnVlXG4gICAgICB9O1xuICAgICAgY29uc3QgZXhwciA9IGRhdGVUaW1lRXhwcihkLCB0cnVlKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAndXRjKDIwMDcsIDAsIDEsIDAsIDAsIDAsIDApJyk7XG4gICAgfSk7XG5cbiAgICAvLyBOb3RlOiBPdGhlciBwYXJ0IG9mIGNvdmVyYWdlIGhhbmRsZWQgYnkgdGltZVVuaXQuZmllbGRFeHByJ3MgdGVzdFxuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/encoding.test.d.ts b/build/test/encoding.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/encoding.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/encoding.test.js b/build/test/encoding.test.js new file mode 100644 index 0000000000..080f7ff97e --- /dev/null +++ b/build/test/encoding.test.js @@ -0,0 +1,45 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var encoding_1 = require("../src/encoding"); +var log = tslib_1.__importStar(require("../src/log")); +describe('axis', function () { + describe('normalizeEncoding', function () { + it('should convert lat and long type to channels', function () { + var encoding = encoding_1.normalizeEncoding({ + x: { field: 'a', type: 'longitude' }, + y: { field: 'b', type: 'latitude' }, + x2: { field: 'a2', type: 'longitude' }, + y2: { field: 'b2', type: 'latitude' } + }, 'rule'); + chai_1.assert.deepEqual(encoding, { + longitude: { field: 'a', type: 'quantitative' }, + latitude: { field: 'b', type: 'quantitative' }, + longitude2: { field: 'a2', type: 'quantitative' }, + latitude2: { field: 'b2', type: 'quantitative' } + }); + }); + it('should drop color channel if fill is specified', log.wrap(function (logger) { + var encoding = encoding_1.normalizeEncoding({ + color: { field: 'a', type: 'quantitative' }, + fill: { field: 'b', type: 'quantitative' } + }, 'rule'); + chai_1.assert.deepEqual(encoding, { + fill: { field: 'b', type: 'quantitative' } + }); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('encoding', { fill: true })); + })); + it('should drop color channel if stroke is specified', log.wrap(function (logger) { + var encoding = encoding_1.normalizeEncoding({ + color: { field: 'a', type: 'quantitative' }, + stroke: { field: 'b', type: 'quantitative' } + }, 'rule'); + chai_1.assert.deepEqual(encoding, { + stroke: { field: 'b', type: 'quantitative' } + }); + chai_1.assert.equal(logger.warns[0], log.message.droppingColor('encoding', { stroke: true })); + })); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZW5jb2RpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsNENBQWtEO0FBQ2xELHNEQUFrQztBQUVsQyxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsUUFBUSxDQUFDLG1CQUFtQixFQUFFO1FBQzVCLEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxJQUFNLFFBQVEsR0FBRyw0QkFBaUIsQ0FBQztnQkFDakMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFDO2dCQUNsQyxDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUM7Z0JBQ2pDLEVBQUUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBQztnQkFDcEMsRUFBRSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDO2FBQ3BDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFWCxhQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtnQkFDekIsU0FBUyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2dCQUM3QyxRQUFRLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7Z0JBQzVDLFVBQVUsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztnQkFDL0MsU0FBUyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2FBQy9DLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFNO1lBQ25FLElBQU0sUUFBUSxHQUFHLDRCQUFpQixDQUFDO2dCQUNqQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7Z0JBQ3pDLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQzthQUN6QyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRVgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pCLElBQUksRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQzthQUN6QyxDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQztRQUNyRixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUosRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBQyxNQUFNO1lBQ3JFLElBQU0sUUFBUSxHQUFHLDRCQUFpQixDQUFDO2dCQUNqQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUM7Z0JBQ3pDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQzthQUMzQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRVgsYUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3pCLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQzthQUMzQyxDQUFDLENBQUM7WUFDSCxhQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsQ0FBQztRQUN2RixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7bm9ybWFsaXplRW5jb2Rpbmd9IGZyb20gJy4uL3NyYy9lbmNvZGluZyc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vc3JjL2xvZyc7XG5cbmRlc2NyaWJlKCdheGlzJywgKCkgPT4ge1xuICBkZXNjcmliZSgnbm9ybWFsaXplRW5jb2RpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IGxhdCBhbmQgbG9uZyB0eXBlIHRvIGNoYW5uZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyh7XG4gICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAnbG9uZ2l0dWRlJ30sXG4gICAgICAgIHk6IHtmaWVsZDogJ2InLCB0eXBlOiAnbGF0aXR1ZGUnfSxcbiAgICAgICAgeDI6IHtmaWVsZDogJ2EyJywgdHlwZTogJ2xvbmdpdHVkZSd9LFxuICAgICAgICB5Mjoge2ZpZWxkOiAnYjInLCB0eXBlOiAnbGF0aXR1ZGUnfVxuICAgICAgfSwgJ3J1bGUnKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChlbmNvZGluZywge1xuICAgICAgICBsb25naXR1ZGU6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgIGxhdGl0dWRlOiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LFxuICAgICAgICBsb25naXR1ZGUyOiB7ZmllbGQ6ICdhMicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgbGF0aXR1ZGUyOiB7ZmllbGQ6ICdiMicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGRyb3AgY29sb3IgY2hhbm5lbCBpZiBmaWxsIGlzIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gbm9ybWFsaXplRW5jb2Rpbmcoe1xuICAgICAgICBjb2xvcjoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgZmlsbDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgfSwgJ3J1bGUnKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChlbmNvZGluZywge1xuICAgICAgICBmaWxsOiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmRyb3BwaW5nQ29sb3IoJ2VuY29kaW5nJywge2ZpbGw6IHRydWV9KSk7XG4gICAgfSkpO1xuXG4gICAgaXQoJ3Nob3VsZCBkcm9wIGNvbG9yIGNoYW5uZWwgaWYgc3Ryb2tlIGlzIHNwZWNpZmllZCcsIGxvZy53cmFwKChsb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gbm9ybWFsaXplRW5jb2Rpbmcoe1xuICAgICAgICBjb2xvcjoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSxcbiAgICAgICAgc3Ryb2tlOiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9XG4gICAgICB9LCAncnVsZScpO1xuXG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKGVuY29kaW5nLCB7XG4gICAgICAgIHN0cm9rZToge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5kcm9wcGluZ0NvbG9yKCdlbmNvZGluZycsIHtzdHJva2U6IHRydWV9KSk7XG4gICAgfSkpO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/fielddef.test.d.ts b/build/test/fielddef.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/fielddef.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/fielddef.test.js b/build/test/fielddef.test.js new file mode 100644 index 0000000000..3ba322892c --- /dev/null +++ b/build/test/fielddef.test.js @@ -0,0 +1,185 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var aggregate_1 = require("../src/aggregate"); +var fielddef_1 = require("../src/fielddef"); +var log = tslib_1.__importStar(require("../src/log")); +var timeunit_1 = require("../src/timeunit"); +var type_1 = require("../src/type"); +describe('fieldDef', function () { + describe('vgField()', function () { + it('should access flattened fields', function () { + chai_1.assert.deepEqual(fielddef_1.vgField({ field: 'foo.bar\\.baz' }), 'foo\\.bar\\.baz'); + }); + it('should access flattened fields in expression', function () { + chai_1.assert.deepEqual(fielddef_1.vgField({ field: 'foo.bar\\.baz' }, { expr: 'datum' }), 'datum["foo.bar.baz"]'); + }); + }); + describe('defaultType()', function () { + it('should return temporal if there is timeUnit', function () { + chai_1.assert.equal(fielddef_1.defaultType({ timeUnit: 'month', field: 'a' }, 'x'), 'temporal'); + }); + it('should return quantitative if there is bin', function () { + chai_1.assert.equal(fielddef_1.defaultType({ bin: true, field: 'a' }, 'x'), 'quantitative'); + }); + it('should return quantitative for a channel that supports measure', function () { + for (var _i = 0, _a = ['x', 'y', 'size', 'opacity', 'order']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(fielddef_1.defaultType({ field: 'a' }, c), 'quantitative', c); + } + }); + it('should return nominal for a channel that does not support measure', function () { + for (var _i = 0, _a = ['color', 'shape', 'row', 'column']; _i < _a.length; _i++) { + var c = _a[_i]; + chai_1.assert.equal(fielddef_1.defaultType({ field: 'a' }, c), 'nominal', c); + } + }); + }); + describe('normalize()', function () { + it('should convert primitive type to value def', log.wrap(function (localLogger) { + chai_1.assert.deepEqual(fielddef_1.normalize(5, 'x'), { value: 5 }); + chai_1.assert.equal(localLogger.warns.length, 1); + })); + it('should return fieldDef with full type name.', function () { + var fieldDef = { field: 'a', type: 'q' }; + chai_1.assert.deepEqual(fielddef_1.normalize(fieldDef, 'x'), { field: 'a', type: 'quantitative' }); + }); + it('normalizes yearmonthday to become yearmonthdate.', log.wrap(function (localLogger) { + var fieldDef = { + timeUnit: 'yearmonthday', + field: 'a', + type: 'temporal' + }; + chai_1.assert.deepEqual(fielddef_1.normalize(fieldDef, 'x'), { timeUnit: 'yearmonthdate', field: 'a', type: 'temporal' }); + chai_1.assert.equal(localLogger.warns[0], log.message.dayReplacedWithDate('yearmonthday')); + })); + it('should replace other type with quantitative for a field with counting aggregate.', log.wrap(function (localLogger) { + for (var _i = 0, COUNTING_OPS_1 = aggregate_1.COUNTING_OPS; _i < COUNTING_OPS_1.length; _i++) { + var aggregate = COUNTING_OPS_1[_i]; + var fieldDef = { aggregate: aggregate, field: 'a', type: 'nominal' }; + chai_1.assert.deepEqual(fielddef_1.normalize(fieldDef, 'x'), { aggregate: aggregate, field: 'a', type: 'quantitative' }); + } + chai_1.assert.equal(localLogger.warns.length, 4); + })); + it('should return fieldDef with default type and throw warning if type is missing.', log.wrap(function (localLogger) { + var fieldDef = { field: 'a' }; + chai_1.assert.deepEqual(fielddef_1.normalize(fieldDef, 'x'), { field: 'a', type: 'quantitative' }); + chai_1.assert.equal(localLogger.warns[0], log.message.emptyOrInvalidFieldType(undefined, 'x', 'quantitative')); + })); + it('should drop invalid aggregate ops and throw warning.', log.wrap(function (localLogger) { + var fieldDef = { aggregate: 'box-plot', field: 'a', type: 'quantitative' }; + chai_1.assert.deepEqual(fielddef_1.normalize(fieldDef, 'x'), { field: 'a', type: 'quantitative' }); + chai_1.assert.equal(localLogger.warns[0], log.message.invalidAggregate('box-plot')); + })); + }); + describe('channelCompatability', function () { + describe('row/column', function () { + it('is incompatible with continuous field', function () { + for (var _i = 0, _a = ['row', 'column']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(!fielddef_1.channelCompatibility({ field: 'a', type: 'quantitative' }, channel).compatible); + } + }); + it('is compatible with discrete field', function () { + for (var _i = 0, _a = ['row', 'column']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'nominal' }, channel).compatible); + } + }); + }); + describe('x/y/color/text/detail', function () { + it('is compatible with continuous field', function () { + for (var _i = 0, _a = ['x', 'y', 'color', 'text', 'detail']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'quantitative' }, channel).compatible); + } + }); + it('is compatible with discrete field', function () { + for (var _i = 0, _a = ['x', 'y', 'color', 'text', 'detail']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'nominal' }, channel).compatible); + } + }); + }); + describe('opacity/size/x2/y2', function () { + it('is compatible with continuous field', function () { + for (var _i = 0, _a = ['opacity', 'size', 'x2', 'y2']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'quantitative' }, channel).compatible); + } + }); + it('is compatible with binned field', function () { + for (var _i = 0, _a = ['opacity', 'size', 'x2', 'y2']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(fielddef_1.channelCompatibility({ bin: true, field: 'a', type: 'quantitative' }, channel).compatible); + } + }); + it('is incompatible with nominal field', function () { + for (var _i = 0, _a = ['opacity', 'size', 'x2', 'y2']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(!fielddef_1.channelCompatibility({ field: 'a', type: 'nominal' }, channel).compatible); + } + }); + }); + describe('shape', function () { + it('is compatible with nominal field', function () { + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'nominal' }, 'shape').compatible); + }); + it('is incompatible with ordinal field', function () { + chai_1.assert(!fielddef_1.channelCompatibility({ field: 'a', type: 'ordinal' }, 'shape').compatible); + }); + it('is incompatible with quantitative field', function () { + chai_1.assert(!fielddef_1.channelCompatibility({ field: 'a', type: 'quantitative' }, 'shape').compatible); + }); + }); + describe('order', function () { + it('is incompatible with nominal field', function () { + chai_1.assert(!fielddef_1.channelCompatibility({ field: 'a', type: 'nominal' }, 'order').compatible); + }); + it('is compatible with ordinal field', function () { + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'ordinal' }, 'order').compatible); + }); + it('is compatible with quantitative field', function () { + chai_1.assert(fielddef_1.channelCompatibility({ field: 'a', type: 'quantitative' }, 'order').compatible); + }); + }); + }); + describe('title()', function () { + it('should return correct title for aggregate', function () { + chai_1.assert.equal(fielddef_1.title({ field: 'f', aggregate: 'mean' }, {}), 'Mean of f'); + }); + it('should return correct title for count', function () { + chai_1.assert.equal(fielddef_1.title({ aggregate: 'count' }, { countTitle: 'baz!' }), 'baz!'); + }); + it('should return correct title for bin', function () { + var fieldDef = { field: 'f', type: type_1.QUANTITATIVE, bin: true }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f (binned)'); + }); + it('should return correct title for bin', function () { + var fieldDef = { field: 'f', type: type_1.QUANTITATIVE, bin: true }; + chai_1.assert.equal(fielddef_1.title(fieldDef, { fieldTitle: 'functional' }), 'BIN(f)'); + }); + it('should return correct title for timeUnit', function () { + var fieldDef = { field: 'f', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.MONTH }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f (month)'); + }); + it('should return correct title for timeUnit', function () { + var fieldDef = { field: 'f', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.YEARMONTHDATE }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f (year-month-date)'); + }); + it('should return correct title for timeUnit', function () { + var fieldDef = { field: 'f', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.DAY }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f (day)'); + }); + it('should return correct title for timeUnit', function () { + var fieldDef = { field: 'f', type: type_1.TEMPORAL, timeUnit: timeunit_1.TimeUnit.YEARQUARTER }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f (year-quarter)'); + }); + it('should return correct title for raw field', function () { + var fieldDef = { field: 'f', type: type_1.TEMPORAL }; + chai_1.assert.equal(fielddef_1.title(fieldDef, {}), 'f'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRkZWYudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvZmllbGRkZWYudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFFNUIsOENBQThDO0FBRTlDLDRDQUFtSDtBQUNuSCxzREFBa0M7QUFDbEMsNENBQXlDO0FBQ3pDLG9DQUFtRDtBQUVuRCxRQUFRLENBQUMsVUFBVSxFQUFFO0lBQ25CLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDcEIsRUFBRSxDQUFFLGdDQUFnQyxFQUFFO1lBQ3BDLGFBQU0sQ0FBQyxTQUFTLENBQUMsa0JBQU8sQ0FBQyxFQUFDLEtBQUssRUFBRSxlQUFlLEVBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUUsOENBQThDLEVBQUU7WUFDbEQsYUFBTSxDQUFDLFNBQVMsQ0FBQyxrQkFBTyxDQUFDLEVBQUMsS0FBSyxFQUFFLGVBQWUsRUFBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUMvRixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGVBQWUsRUFBRTtRQUN4QixFQUFFLENBQUMsNkNBQTZDLEVBQUU7WUFDaEQsYUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBVyxDQUFDLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFxQixFQUFFLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDRDQUE0QyxFQUFFO1lBQy9DLGFBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQVcsQ0FBQyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBcUIsRUFBRSxHQUFHLENBQUMsRUFBRSxj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Q29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5cbmltcG9ydCB7Q09VTlRJTkdfT1BTfSBmcm9tICcuLi9zcmMvYWdncmVnYXRlJztcbmltcG9ydCB7Q2hhbm5lbH0gZnJvbSAnLi4vc3JjL2NoYW5uZWwnO1xuaW1wb3J0IHtjaGFubmVsQ29tcGF0aWJpbGl0eSwgQ2hhbm5lbERlZiwgZGVmYXVsdFR5cGUsIEZpZWxkRGVmLCBub3JtYWxpemUsIHRpdGxlLCB2Z0ZpZWxkfSBmcm9tICcuLi9zcmMvZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtUaW1lVW5pdH0gZnJvbSAnLi4vc3JjL3RpbWV1bml0JztcbmltcG9ydCB7UVVBTlRJVEFUSVZFLCBURU1QT1JBTH0gZnJvbSAnLi4vc3JjL3R5cGUnO1xuXG5kZXNjcmliZSgnZmllbGREZWYnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCd2Z0ZpZWxkKCknLCAoKSA9PiB7XG4gICAgaXQgKCdzaG91bGQgYWNjZXNzIGZsYXR0ZW5lZCBmaWVsZHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHZnRmllbGQoe2ZpZWxkOiAnZm9vLmJhclxcXFwuYmF6J30pLCAnZm9vXFxcXC5iYXJcXFxcLmJheicpO1xuICAgIH0pO1xuXG4gICAgaXQgKCdzaG91bGQgYWNjZXNzIGZsYXR0ZW5lZCBmaWVsZHMgaW4gZXhwcmVzc2lvbicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwodmdGaWVsZCh7ZmllbGQ6ICdmb28uYmFyXFxcXC5iYXonfSwge2V4cHI6ICdkYXR1bSd9KSwgJ2RhdHVtW1wiZm9vLmJhci5iYXpcIl0nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2RlZmF1bHRUeXBlKCknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdGVtcG9yYWwgaWYgdGhlcmUgaXMgdGltZVVuaXQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdFR5cGUoe3RpbWVVbml0OiAnbW9udGgnLCBmaWVsZDogJ2EnfSBhcyBGaWVsZERlZjxzdHJpbmc+LCAneCcpLCAndGVtcG9yYWwnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHF1YW50aXRhdGl2ZSBpZiB0aGVyZSBpcyBiaW4nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdFR5cGUoe2JpbjogdHJ1ZSwgZmllbGQ6ICdhJ30gYXMgRmllbGREZWY8c3RyaW5nPiwgJ3gnKSwgJ3F1YW50aXRhdGl2ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gcXVhbnRpdGF0aXZlIGZvciBhIGNoYW5uZWwgdGhhdCBzdXBwb3J0cyBtZWFzdXJlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjIG9mIFsneCcsICd5JywgJ3NpemUnLCAnb3BhY2l0eScsICdvcmRlciddIGFzIENoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZGVmYXVsdFR5cGUoe2ZpZWxkOiAnYSd9IGFzIEZpZWxkRGVmPHN0cmluZz4sIGMpLCAncXVhbnRpdGF0aXZlJywgYyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBub21pbmFsIGZvciBhIGNoYW5uZWwgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IG1lYXN1cmUnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgWydjb2xvcicsICdzaGFwZScsICdyb3cnLCAnY29sdW1uJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChkZWZhdWx0VHlwZSh7ZmllbGQ6ICdhJ30gYXMgRmllbGREZWY8c3RyaW5nPiwgYyksICdub21pbmFsJywgYyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdub3JtYWxpemUoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgcHJpbWl0aXZlIHR5cGUgdG8gdmFsdWUgZGVmJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPENoYW5uZWxEZWY8c3RyaW5nPj4obm9ybWFsaXplKDUgYXMgYW55LCAneCcpLCB7dmFsdWU6IDV9KTtcbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJucy5sZW5ndGgsIDEpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZpZWxkRGVmIHdpdGggZnVsbCB0eXBlIG5hbWUuJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4gPSB7ZmllbGQ6ICdhJywgdHlwZTogJ3EnIGFzIGFueX07XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPENoYW5uZWxEZWY8c3RyaW5nPj4obm9ybWFsaXplKGZpZWxkRGVmLCAneCcpLCB7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9KTtcbiAgICB9KTtcblxuICAgIGl0KCdub3JtYWxpemVzIHllYXJtb250aGRheSB0byBiZWNvbWUgeWVhcm1vbnRoZGF0ZS4nLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+ID0ge1xuICAgICAgICB0aW1lVW5pdDogJ3llYXJtb250aGRheScgYXMgVGltZVVuaXQsICAvLyBOZWVkIHRvIGNhc3QgaGVyZSBhcyB0aGlzIGlzIGludGVudGlvbmFsbHkgd3JvbmdcbiAgICAgICAgZmllbGQ6ICdhJyxcbiAgICAgICAgdHlwZTogJ3RlbXBvcmFsJ1xuICAgICAgfTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8Q2hhbm5lbERlZjxzdHJpbmc+Pihub3JtYWxpemUoZmllbGREZWYsICd4JyksIHt0aW1lVW5pdDogJ3llYXJtb250aGRhdGUnLCBmaWVsZDogJ2EnLCB0eXBlOiAndGVtcG9yYWwnfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmRheVJlcGxhY2VkV2l0aERhdGUoJ3llYXJtb250aGRheScpKTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlcGxhY2Ugb3RoZXIgdHlwZSB3aXRoIHF1YW50aXRhdGl2ZSBmb3IgYSBmaWVsZCB3aXRoIGNvdW50aW5nIGFnZ3JlZ2F0ZS4nLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYWdncmVnYXRlIG9mIENPVU5USU5HX09QUykge1xuICAgICAgICBjb25zdCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiA9IHthZ2dyZWdhdGUsIGZpZWxkOiAnYScsIHR5cGU6ICdub21pbmFsJ307XG4gICAgICAgIGFzc2VydC5kZWVwRXF1YWw8Q2hhbm5lbERlZjxzdHJpbmc+Pihub3JtYWxpemUoZmllbGREZWYsICd4JyksIHthZ2dyZWdhdGUsIGZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSk7XG4gICAgICB9XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnMubGVuZ3RoLCA0KTtcbiAgICB9KSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmaWVsZERlZiB3aXRoIGRlZmF1bHQgdHlwZSBhbmQgdGhyb3cgd2FybmluZyBpZiB0eXBlIGlzIG1pc3NpbmcuJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHtmaWVsZDogJ2EnfSBhcyBGaWVsZERlZjxzdHJpbmc+O1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxDaGFubmVsRGVmPHN0cmluZz4+KG5vcm1hbGl6ZShmaWVsZERlZiwgJ3gnKSwge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSk7XG4gICAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmVtcHR5T3JJbnZhbGlkRmllbGRUeXBlKHVuZGVmaW5lZCwgJ3gnLCAncXVhbnRpdGF0aXZlJykpO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgZHJvcCBpbnZhbGlkIGFnZ3JlZ2F0ZSBvcHMgYW5kIHRocm93IHdhcm5pbmcuJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiA9IHthZ2dyZWdhdGU6ICdib3gtcGxvdCcsIGZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8Q2hhbm5lbERlZjxzdHJpbmc+Pihub3JtYWxpemUoZmllbGREZWYsICd4JyksIHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzBdLCBsb2cubWVzc2FnZS5pbnZhbGlkQWdncmVnYXRlKCdib3gtcGxvdCcpKTtcbiAgICB9KSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdjaGFubmVsQ29tcGF0YWJpbGl0eScsICgpID0+IHtcbiAgICBkZXNjcmliZSgncm93L2NvbHVtbicsICgpID0+IHtcbiAgICAgIGl0KCdpcyBpbmNvbXBhdGlibGUgd2l0aCBjb250aW51b3VzIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWydyb3cnLCAnY29sdW1uJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgICAgYXNzZXJ0KCFjaGFubmVsQ29tcGF0aWJpbGl0eSh7ZmllbGQ6ICdhJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9LCBjaGFubmVsKS5jb21wYXRpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpdCgnaXMgY29tcGF0aWJsZSB3aXRoIGRpc2NyZXRlIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWydyb3cnLCAnY29sdW1uJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgICAgYXNzZXJ0KGNoYW5uZWxDb21wYXRpYmlsaXR5KHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCBjaGFubmVsKS5jb21wYXRpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgneC95L2NvbG9yL3RleHQvZGV0YWlsJywgKCkgPT4ge1xuICAgICAgaXQoJ2lzIGNvbXBhdGlibGUgd2l0aCBjb250aW51b3VzIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWyd4JywgJ3knLCAnY29sb3InLCAndGV4dCcsICdkZXRhaWwnXSBhcyBDaGFubmVsW10pIHtcbiAgICAgICAgICBhc3NlcnQoY2hhbm5lbENvbXBhdGliaWxpdHkoe2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgY2hhbm5lbCkuY29tcGF0aWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaXQoJ2lzIGNvbXBhdGlibGUgd2l0aCBkaXNjcmV0ZSBmaWVsZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFsneCcsICd5JywgJ2NvbG9yJywgJ3RleHQnLCAnZGV0YWlsJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgICAgYXNzZXJ0KGNoYW5uZWxDb21wYXRpYmlsaXR5KHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCBjaGFubmVsKS5jb21wYXRpYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBkZXNjcmliZSgnb3BhY2l0eS9zaXplL3gyL3kyJywgKCkgPT4ge1xuICAgICAgaXQoJ2lzIGNvbXBhdGlibGUgd2l0aCBjb250aW51b3VzIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWydvcGFjaXR5JywgJ3NpemUnLCAneDInLCAneTInXSBhcyBDaGFubmVsW10pIHtcbiAgICAgICAgICBhc3NlcnQoY2hhbm5lbENvbXBhdGliaWxpdHkoe2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgY2hhbm5lbCkuY29tcGF0aWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaXMgY29tcGF0aWJsZSB3aXRoIGJpbm5lZCBmaWVsZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFsnb3BhY2l0eScsICdzaXplJywgJ3gyJywgJ3kyJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgICAgYXNzZXJ0KGNoYW5uZWxDb21wYXRpYmlsaXR5KHtiaW46IHRydWUsIGZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgY2hhbm5lbCkuY29tcGF0aWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpdCgnaXMgaW5jb21wYXRpYmxlIHdpdGggbm9taW5hbCBmaWVsZCcsICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFsnb3BhY2l0eScsICdzaXplJywgJ3gyJywgJ3kyJ10gYXMgQ2hhbm5lbFtdKSB7XG4gICAgICAgICAgYXNzZXJ0KCFjaGFubmVsQ29tcGF0aWJpbGl0eSh7ZmllbGQ6ICdhJywgdHlwZTogJ25vbWluYWwnfSwgY2hhbm5lbCkuY29tcGF0aWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZGVzY3JpYmUoJ3NoYXBlJywgKCkgPT4ge1xuICAgICAgaXQoJ2lzIGNvbXBhdGlibGUgd2l0aCBub21pbmFsIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQoY2hhbm5lbENvbXBhdGliaWxpdHkoe2ZpZWxkOiAnYScsIHR5cGU6ICdub21pbmFsJ30sICdzaGFwZScpLmNvbXBhdGlibGUpO1xuICAgICAgfSk7XG4gICAgICBpdCgnaXMgaW5jb21wYXRpYmxlIHdpdGggb3JkaW5hbCBmaWVsZCcsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0KCFjaGFubmVsQ29tcGF0aWJpbGl0eSh7ZmllbGQ6ICdhJywgdHlwZTogJ29yZGluYWwnfSwgJ3NoYXBlJykuY29tcGF0aWJsZSk7XG4gICAgICB9KTtcbiAgICAgIGl0KCdpcyBpbmNvbXBhdGlibGUgd2l0aCBxdWFudGl0YXRpdmUgZmllbGQnLCAoKSA9PiB7XG4gICAgICAgIGFzc2VydCghY2hhbm5lbENvbXBhdGliaWxpdHkoe2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSwgJ3NoYXBlJykuY29tcGF0aWJsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdvcmRlcicsICgpID0+IHtcbiAgICAgIGl0KCdpcyBpbmNvbXBhdGlibGUgd2l0aCBub21pbmFsIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQoIWNoYW5uZWxDb21wYXRpYmlsaXR5KHtmaWVsZDogJ2EnLCB0eXBlOiAnbm9taW5hbCd9LCAnb3JkZXInKS5jb21wYXRpYmxlKTtcbiAgICAgIH0pO1xuICAgICAgaXQoJ2lzIGNvbXBhdGlibGUgd2l0aCBvcmRpbmFsIGZpZWxkJywgKCkgPT4ge1xuICAgICAgICBhc3NlcnQoY2hhbm5lbENvbXBhdGliaWxpdHkoe2ZpZWxkOiAnYScsIHR5cGU6ICdvcmRpbmFsJ30sICdvcmRlcicpLmNvbXBhdGlibGUpO1xuICAgICAgfSk7XG4gICAgICBpdCgnaXMgY29tcGF0aWJsZSB3aXRoIHF1YW50aXRhdGl2ZSBmaWVsZCcsICgpID0+IHtcbiAgICAgICAgYXNzZXJ0KGNoYW5uZWxDb21wYXRpYmlsaXR5KHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sICdvcmRlcicpLmNvbXBhdGlibGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCd0aXRsZSgpJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGl0bGUgZm9yIGFnZ3JlZ2F0ZScsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbCh0aXRsZSh7ZmllbGQ6ICdmJywgYWdncmVnYXRlOiAnbWVhbid9LCB7fSksICdNZWFuIG9mIGYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGl0bGUgZm9yIGNvdW50JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHRpdGxlKHthZ2dyZWdhdGU6ICdjb3VudCd9LCB7Y291bnRUaXRsZTogJ2JheiEnfSksICdiYXohJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRpdGxlIGZvciBiaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHtmaWVsZDogJ2YnLCB0eXBlOiBRVUFOVElUQVRJVkUsIGJpbjogdHJ1ZX07XG4gICAgICBhc3NlcnQuZXF1YWwodGl0bGUoZmllbGREZWYse30pLCAnZiAoYmlubmVkKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB0aXRsZSBmb3IgYmluJywgKCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSB7ZmllbGQ6ICdmJywgdHlwZTogUVVBTlRJVEFUSVZFLCBiaW46IHRydWV9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHRpdGxlKGZpZWxkRGVmLHtmaWVsZFRpdGxlOiAnZnVuY3Rpb25hbCd9KSwgJ0JJTihmKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB0aXRsZSBmb3IgdGltZVVuaXQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IHtmaWVsZDogJ2YnLCB0eXBlOiBURU1QT1JBTCwgdGltZVVuaXQ6IFRpbWVVbml0Lk1PTlRIfTtcbiAgICAgIGFzc2VydC5lcXVhbCh0aXRsZShmaWVsZERlZix7fSksICdmIChtb250aCknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGl0bGUgZm9yIHRpbWVVbml0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSB7ZmllbGQ6ICdmJywgdHlwZTogVEVNUE9SQUwsIHRpbWVVbml0OiBUaW1lVW5pdC5ZRUFSTU9OVEhEQVRFfTtcbiAgICAgIGFzc2VydC5lcXVhbCh0aXRsZShmaWVsZERlZix7fSksICdmICh5ZWFyLW1vbnRoLWRhdGUpJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRpdGxlIGZvciB0aW1lVW5pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0ge2ZpZWxkOiAnZicsIHR5cGU6IFRFTVBPUkFMLCB0aW1lVW5pdDogVGltZVVuaXQuREFZfTtcbiAgICAgIGFzc2VydC5lcXVhbCh0aXRsZShmaWVsZERlZix7fSksICdmIChkYXkpJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRpdGxlIGZvciB0aW1lVW5pdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0ge2ZpZWxkOiAnZicsIHR5cGU6IFRFTVBPUkFMLCB0aW1lVW5pdDogVGltZVVuaXQuWUVBUlFVQVJURVJ9O1xuICAgICAgYXNzZXJ0LmVxdWFsKHRpdGxlKGZpZWxkRGVmLHt9KSwgJ2YgKHllYXItcXVhcnRlciknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGl0bGUgZm9yIHJhdyBmaWVsZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0ge2ZpZWxkOiAnZicsIHR5cGU6IFRFTVBPUkFMfTtcbiAgICAgIGFzc2VydC5lcXVhbCh0aXRsZShmaWVsZERlZix7fSksICdmJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/predicate.test.d.ts b/build/test/predicate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/predicate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/predicate.test.js b/build/test/predicate.test.js new file mode 100644 index 0000000000..2f749b96d1 --- /dev/null +++ b/build/test/predicate.test.js @@ -0,0 +1,178 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var predicate_1 = require("../src/predicate"); +var timeunit_1 = require("../src/timeunit"); +describe('filter', function () { + var equalFilter = { field: 'color', equal: 'red' }; + var oneOfFilter = { field: 'color', oneOf: ['red', 'yellow'] }; + var rangeFilter = { field: 'x', range: [0, 5] }; + var exprFilter = 'datum["x"]===5'; + var lessThanEqualsFilter = { field: 'x', lte: 'z' }; + describe('isEqualFilter', function () { + it('should return true for an equal filter', function () { + chai_1.assert.isTrue(predicate_1.isFieldEqualPredicate(equalFilter)); + }); + it('should return false for other filters', function () { + [oneOfFilter, rangeFilter, exprFilter].forEach(function (filter) { + chai_1.assert.isFalse(predicate_1.isFieldEqualPredicate(filter)); + }); + }); + }); + describe('islessThanEqualsFilter', function () { + it('should return true for less than equals to filter', function () { + chai_1.assert.isTrue(predicate_1.isFieldLTEPredicate(lessThanEqualsFilter)); + }); + it('should return false for other filters', function () { + [equalFilter, oneOfFilter, rangeFilter, exprFilter].forEach(function (filter) { + chai_1.assert.isFalse(predicate_1.isFieldLTEPredicate(filter)); + }); + }); + }); + describe('isOneOfFilter', function () { + it('should return true for an in filter', function () { + chai_1.assert.isTrue(predicate_1.isFieldOneOfPredicate(oneOfFilter)); + }); + it('should return false for other filters', function () { + [equalFilter, rangeFilter, exprFilter].forEach(function (filter) { + chai_1.assert.isFalse(predicate_1.isFieldOneOfPredicate(filter)); + }); + }); + }); + describe('isRangeFilter', function () { + it('should return true for a range filter', function () { + chai_1.assert.isTrue(predicate_1.isFieldRangePredicate(rangeFilter)); + }); + it('should return false for other filters', function () { + [oneOfFilter, equalFilter, exprFilter].forEach(function (filter) { + chai_1.assert.isFalse(predicate_1.isFieldRangePredicate(filter)); + }); + }); + }); + describe('expression', function () { + it('should return a correct expression for an EqualFilter', function () { + var expr = predicate_1.expression(null, { field: 'color', equal: 'red' }); + chai_1.assert.equal(expr, 'datum["color"]==="red"'); + }); + it('should return correct expression for lessThan', function () { + var expr = predicate_1.expression(null, { field: 'x', lt: 1 }); + chai_1.assert.equal(expr, 'datum["x"]<1'); + }); + it('should return correct expression for greaterThan', function () { + var expr = predicate_1.expression(null, { field: 'x', gt: 'aardvark' }); + chai_1.assert.equal(expr, 'datum["x"]>"aardvark"'); + }); + it('should return correct expression for lessThanEquals', function () { + var expr = predicate_1.expression(null, { field: 'x', lte: 'zyzzyva' }); + chai_1.assert.equal(expr, 'datum["x"]<="zyzzyva"'); + }); + it('should return correct expression for greaterThanEquals', function () { + var expr = predicate_1.expression(null, { field: 'x', gte: 1 }); + chai_1.assert.equal(expr, 'datum["x"]>=1'); + }); + it('should return a correct expression for an EqualFilter with datetime object', function () { + var expr = predicate_1.expression(null, { + field: 'date', + equal: { + month: 'January' + } + }); + chai_1.assert.equal(expr, 'datum["date"]===time(datetime(0, 0, 1, 0, 0, 0, 0))'); + }); + it('should return a correct expression for an EqualFilter with time unit and datetime object', function () { + var expr = predicate_1.expression(null, { + timeUnit: timeunit_1.TimeUnit.MONTH, + field: 'date', + equal: { + month: 'January' + } + }); + chai_1.assert.equal(expr, 'time(datetime(0, month(datum["date"]), 1, 0, 0, 0, 0))===time(datetime(0, 0, 1, 0, 0, 0, 0))'); + }); + it('should return a correct expression for an EqualFilter with datetime object', function () { + var expr = predicate_1.expression(null, { + timeUnit: timeunit_1.TimeUnit.MONTH, + field: 'date', + equal: 'January' + }); + chai_1.assert.equal(expr, 'time(datetime(0, month(datum["date"]), 1, 0, 0, 0, 0))===time(datetime(0, 0, 1, 0, 0, 0, 0))'); + }); + it('should return a correct expression for an lessThanFilter with datetime object', function () { + var expr = predicate_1.expression(null, { + field: 'date', + lt: { + month: 'February' + } + }); + chai_1.assert.equal(expr, 'datum["date"]time(datetime(0, 0, 1, 0, 0, 0, 0))'); + }); + it('should return a correct expression for an greaterThanEqualsFilter with datetime object', function () { + var expr = predicate_1.expression(null, { + timeUnit: timeunit_1.TimeUnit.MONTH, + field: 'date', + gte: 'January' + }); + chai_1.assert.equal(expr, 'time(datetime(0, month(datum["date"]), 1, 0, 0, 0, 0))>=time(datetime(0, 0, 1, 0, 0, 0, 0))'); + }); + it('should return a correct expression for an InFilter', function () { + var expr = predicate_1.expression(null, { field: 'color', oneOf: ['red', 'yellow'] }); + chai_1.assert.equal(expr, 'indexof(["red","yellow"], datum["color"]) !== -1'); + }); + it('should return a correct expression for a RangeFilter', function () { + var expr = predicate_1.expression(null, { field: 'x', range: [0, 5] }); + chai_1.assert.equal(expr, 'inrange(datum["x"], [0, 5])'); + }); + it('should return a correct expression for a RangeFilter with no lower bound', function () { + var expr = predicate_1.expression(null, { field: 'x', range: [null, 5] }); + chai_1.assert.equal(expr, 'datum["x"] <= 5'); + }); + it('should return a correct expression for a RangeFilter with no upper bound', function () { + var expr = predicate_1.expression(null, { field: 'x', range: [0, null] }); + chai_1.assert.equal(expr, 'datum["x"] >= 0'); + }); + it('should return true for a RangeFilter with no bound', function () { + var expr = predicate_1.expression(null, { field: 'x', range: [null, null] }); + chai_1.assert.equal(expr, 'true'); + }); + it('should return a correct expression for an expression filter', function () { + var expr = predicate_1.expression(null, 'datum["x"]===5'); + chai_1.assert.equal(expr, 'datum["x"]===5'); + }); + }); + it('generates expressions for composed filters', function () { + var expr = predicate_1.expression(null, { not: { field: 'color', equal: 'red' } }); + chai_1.assert.equal(expr, '!(datum["color"]==="red")'); + expr = predicate_1.expression(null, { and: [ + { field: 'color', equal: 'red' }, + { field: 'x', range: [0, 5] } + ] }); + chai_1.assert.equal(expr, '(datum["color"]==="red") && (inrange(datum["x"], [0, 5]))'); + expr = predicate_1.expression(null, { and: [ + { field: 'color', oneOf: ['red', 'yellow'] }, + { or: [ + { field: 'x', range: [0, null] }, + 'datum.price > 10', + { not: 'datum["x"]===5' } + ] } + ] }); + chai_1.assert.equal(expr, '(indexof(["red","yellow"], datum["color"]) !== -1) && ' + + '((datum["x"] >= 0) || (datum.price > 10) || (!(datum["x"]===5)))'); + }); + describe('fieldFilterExpression', function () { + it('generates a range predicate using inequalities when useInRange=false', function () { + var expr = predicate_1.fieldFilterExpression({ field: 'x', range: [0, 5] }, false); + chai_1.assert.equal(expr, 'datum["x"] >= 0 && datum["x"] <= 5'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGljYXRlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L3ByZWRpY2F0ZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNkJBQTRCO0FBRTVCLDhDQUE2SjtBQUM3Siw0Q0FBeUM7QUFFekMsUUFBUSxDQUFDLFFBQVEsRUFBRTtJQUNqQixJQUFNLFdBQVcsR0FBRyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDO0lBQ25ELElBQU0sV0FBVyxHQUFHLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUMsQ0FBQztJQUMvRCxJQUFNLFdBQVcsR0FBRyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDaEQsSUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7SUFDcEMsSUFBTSxvQkFBb0IsR0FBRyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBRXBELFFBQVEsQ0FBQyxlQUFlLEVBQUU7UUFDeEIsRUFBRSxDQUFDLHdDQUF3QyxFQUFFO1lBQzNDLGFBQU0sQ0FBQyxNQUFNLENBQUMsaUNBQXFCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsTUFBTTtnQkFDcEQsYUFBTSxDQUFDLE9BQU8sQ0FBQyxpQ0FBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFB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Q0FBQyxFQUFDO3dCQUM5QixrQkFBa0I7d0JBQ2xCLEVBQUMsR0FBRyxFQUFFLGdCQUFnQixFQUFDO3FCQUN4QixFQUFDO2FBQ0gsRUFBQyxDQUFDLENBQUM7UUFFSixhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSx3REFBd0Q7WUFDekUsa0VBQWtFLENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztJQUdILFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtRQUNoQyxFQUFFLENBQUMsc0VBQXNFLEVBQUU7WUFDekUsSUFBTSxJQUFJLEdBQUcsaUNBQXFCLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLG9DQUFvQyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge2V4cHJlc3Npb24sIGZpZWxkRmlsdGVyRXhwcmVzc2lvbiwgaXNGaWVsZEVxdWFsUHJlZGljYXRlLCBpc0ZpZWxkTFRFUHJlZGljYXRlLCBpc0ZpZWxkT25lT2ZQcmVkaWNhdGUsIGlzRmllbGRSYW5nZVByZWRpY2F0ZX0gZnJvbSAnLi4vc3JjL3ByZWRpY2F0ZSc7XG5pbXBvcnQge1RpbWVVbml0fSBmcm9tICcuLi9zcmMvdGltZXVuaXQnO1xuXG5kZXNjcmliZSgnZmlsdGVyJywgKCkgPT4ge1xuICBjb25zdCBlcXVhbEZpbHRlciA9IHtmaWVsZDogJ2NvbG9yJywgZXF1YWw6ICdyZWQnfTtcbiAgY29uc3Qgb25lT2ZGaWx0ZXIgPSB7ZmllbGQ6ICdjb2xvcicsIG9uZU9mOiBbJ3JlZCcsICd5ZWxsb3cnXX07XG4gIGNvbnN0IHJhbmdlRmlsdGVyID0ge2ZpZWxkOiAneCcsIHJhbmdlOiBbMCwgNV19O1xuICBjb25zdCBleHByRmlsdGVyID0gJ2RhdHVtW1wieFwiXT09PTUnO1xuICBjb25zdCBsZXNzVGhhbkVxdWFsc0ZpbHRlciA9IHtmaWVsZDogJ3gnLCBsdGU6ICd6J307XG5cbiAgZGVzY3JpYmUoJ2lzRXF1YWxGaWx0ZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gZXF1YWwgZmlsdGVyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShpc0ZpZWxkRXF1YWxQcmVkaWNhdGUoZXF1YWxGaWx0ZXIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvdGhlciBmaWx0ZXJzJywgKCkgPT4ge1xuICAgICAgW29uZU9mRmlsdGVyLCByYW5nZUZpbHRlciwgZXhwckZpbHRlcl0uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGFzc2VydC5pc0ZhbHNlKGlzRmllbGRFcXVhbFByZWRpY2F0ZShmaWx0ZXIpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNsZXNzVGhhbkVxdWFsc0ZpbHRlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBsZXNzIHRoYW4gZXF1YWxzIHRvIGZpbHRlcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5pc1RydWUoaXNGaWVsZExURVByZWRpY2F0ZShsZXNzVGhhbkVxdWFsc0ZpbHRlcikpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIG90aGVyIGZpbHRlcnMnLCAoKSA9PiB7XG4gICAgICBbZXF1YWxGaWx0ZXIsIG9uZU9mRmlsdGVyLCByYW5nZUZpbHRlciwgZXhwckZpbHRlcl0uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGFzc2VydC5pc0ZhbHNlKGlzRmllbGRMVEVQcmVkaWNhdGUoZmlsdGVyKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2lzT25lT2ZGaWx0ZXInLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgYW4gaW4gZmlsdGVyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShpc0ZpZWxkT25lT2ZQcmVkaWNhdGUob25lT2ZGaWx0ZXIpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvdGhlciBmaWx0ZXJzJywgKCkgPT4ge1xuICAgICAgW2VxdWFsRmlsdGVyLCByYW5nZUZpbHRlciwgZXhwckZpbHRlcl0uZm9yRWFjaCgoZmlsdGVyKSA9PiB7XG4gICAgICAgIGFzc2VydC5pc0ZhbHNlKGlzRmllbGRPbmVPZlByZWRpY2F0ZShmaWx0ZXIpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnaXNSYW5nZUZpbHRlcicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIHJhbmdlIGZpbHRlcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5pc1RydWUoaXNGaWVsZFJhbmdlUHJlZGljYXRlKHJhbmdlRmlsdGVyKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgZmlsdGVycycsICgpID0+IHtcbiAgICAgIFtvbmVPZkZpbHRlciwgZXF1YWxGaWx0ZXIsIGV4cHJGaWx0ZXJdLmZvckVhY2goKGZpbHRlcikgPT4ge1xuICAgICAgICBhc3NlcnQuaXNGYWxzZShpc0ZpZWxkUmFuZ2VQcmVkaWNhdGUoZmlsdGVyKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2V4cHJlc3Npb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb3JyZWN0IGV4cHJlc3Npb24gZm9yIGFuIEVxdWFsRmlsdGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge2ZpZWxkOiAnY29sb3InLCBlcXVhbDogJ3JlZCd9KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0dW1bXCJjb2xvclwiXT09PVwicmVkXCInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgbGVzc1RoYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7ZmllbGQ6ICd4JywgbHQ6IDF9KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0dW1bXCJ4XCJdPDEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgZ3JlYXRlclRoYW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7ZmllbGQ6ICd4JywgZ3Q6ICdhYXJkdmFyayd9KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0dW1bXCJ4XCJdPlwiYWFyZHZhcmtcIicpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBleHByZXNzaW9uIGZvciBsZXNzVGhhbkVxdWFscycsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHtmaWVsZDogJ3gnLCBsdGU6ICd6eXp6eXZhJ30pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcInhcIl08PVwienl6enl2YVwiJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGV4cHJlc3Npb24gZm9yIGdyZWF0ZXJUaGFuRXF1YWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge2ZpZWxkOiAneCcsIGd0ZTogMX0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcInhcIl0+PTEnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBleHByZXNzaW9uIGZvciBhbiBFcXVhbEZpbHRlciB3aXRoIGRhdGV0aW1lIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHtcbiAgICAgICAgZmllbGQ6ICdkYXRlJyxcbiAgICAgICAgZXF1YWw6IHtcbiAgICAgICAgICBtb250aDogJ0phbnVhcnknXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcImRhdGVcIl09PT10aW1lKGRhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIDApKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb3JyZWN0IGV4cHJlc3Npb24gZm9yIGFuIEVxdWFsRmlsdGVyIHdpdGggdGltZSB1bml0IGFuZCBkYXRldGltZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7XG4gICAgICAgIHRpbWVVbml0OiBUaW1lVW5pdC5NT05USCxcbiAgICAgICAgZmllbGQ6ICdkYXRlJyxcbiAgICAgICAgZXF1YWw6IHtcbiAgICAgICAgICBtb250aDogJ0phbnVhcnknXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICd0aW1lKGRhdGV0aW1lKDAsIG1vbnRoKGRhdHVtW1wiZGF0ZVwiXSksIDEsIDAsIDAsIDAsIDApKT09PXRpbWUoZGF0ZXRpbWUoMCwgMCwgMSwgMCwgMCwgMCwgMCkpJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgYW4gRXF1YWxGaWx0ZXIgd2l0aCBkYXRldGltZSBvYmplY3QnLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7XG4gICAgICAgIHRpbWVVbml0OiBUaW1lVW5pdC5NT05USCxcbiAgICAgICAgZmllbGQ6ICdkYXRlJyxcbiAgICAgICAgZXF1YWw6ICdKYW51YXJ5J1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwciwgJ3RpbWUoZGF0ZXRpbWUoMCwgbW9udGgoZGF0dW1bXCJkYXRlXCJdKSwgMSwgMCwgMCwgMCwgMCkpPT09dGltZShkYXRldGltZSgwLCAwLCAxLCAwLCAwLCAwLCAwKSknKTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb3JyZWN0IGV4cHJlc3Npb24gZm9yIGFuIGxlc3NUaGFuRmlsdGVyIHdpdGggZGF0ZXRpbWUgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge1xuICAgICAgICBmaWVsZDogJ2RhdGUnLFxuICAgICAgICBsdDoge1xuICAgICAgICAgIG1vbnRoOiAnRmVicnVhcnknXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcImRhdGVcIl08dGltZShkYXRldGltZSgwLCAxLCAxLCAwLCAwLCAwLCAwKSknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBleHByZXNzaW9uIGZvciBhbiBncmVhdGVyVGhhbkZpbHRlciB3aXRoIHRpbWUgdW5pdCBhbmQgZGF0ZXRpbWUgb2JqZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge1xuICAgICAgICB0aW1lVW5pdDogVGltZVVuaXQuTU9OVEgsXG4gICAgICAgIGZpZWxkOiAnZGF0ZScsXG4gICAgICAgIGd0OiB7XG4gICAgICAgICAgbW9udGg6ICdKYW51YXJ5J1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAndGltZShkYXRldGltZSgwLCBtb250aChkYXR1bVtcImRhdGVcIl0pLCAxLCAwLCAwLCAwLCAwKSk+dGltZShkYXRldGltZSgwLCAwLCAxLCAwLCAwLCAwLCAwKSknKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBleHByZXNzaW9uIGZvciBhbiBncmVhdGVyVGhhbkVxdWFsc0ZpbHRlciB3aXRoIGRhdGV0aW1lIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHtcbiAgICAgICAgdGltZVVuaXQ6IFRpbWVVbml0Lk1PTlRILFxuICAgICAgICBmaWVsZDogJ2RhdGUnLFxuICAgICAgICBndGU6ICdKYW51YXJ5J1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwciwgJ3RpbWUoZGF0ZXRpbWUoMCwgbW9udGgoZGF0dW1bXCJkYXRlXCJdKSwgMSwgMCwgMCwgMCwgMCkpPj10aW1lKGRhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIDApKScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gYSBjb3JyZWN0IGV4cHJlc3Npb24gZm9yIGFuIEluRmlsdGVyJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge2ZpZWxkOiAnY29sb3InLCBvbmVPZjogWydyZWQnLCAneWVsbG93J119KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnaW5kZXhvZihbXCJyZWRcIixcInllbGxvd1wiXSwgZGF0dW1bXCJjb2xvclwiXSkgIT09IC0xJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgYSBSYW5nZUZpbHRlcicsICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHtmaWVsZDogJ3gnLCByYW5nZTogWzAsIDVdfSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZXhwciwgJ2lucmFuZ2UoZGF0dW1bXCJ4XCJdLCBbMCwgNV0pJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgYSBSYW5nZUZpbHRlciB3aXRoIG5vIGxvd2VyIGJvdW5kJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24obnVsbCwge2ZpZWxkOiAneCcsIHJhbmdlOiBbbnVsbCwgNV19KTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0dW1bXCJ4XCJdIDw9IDUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGEgY29ycmVjdCBleHByZXNzaW9uIGZvciBhIFJhbmdlRmlsdGVyIHdpdGggbm8gdXBwZXIgYm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7ZmllbGQ6ICd4JywgcmFuZ2U6IFswLCBudWxsXX0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcInhcIl0gPj0gMCcpO1xuICAgIH0pO1xuXG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBhIFJhbmdlRmlsdGVyIHdpdGggbm8gYm91bmQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCB7ZmllbGQ6ICd4JywgcmFuZ2U6IFtudWxsLCBudWxsXX0pO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICd0cnVlJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBhIGNvcnJlY3QgZXhwcmVzc2lvbiBmb3IgYW4gZXhwcmVzc2lvbiBmaWx0ZXInLCAoKSA9PiB7XG4gICAgICBjb25zdCBleHByID0gZXhwcmVzc2lvbihudWxsLCAnZGF0dW1bXCJ4XCJdPT09NScpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGV4cHIsICdkYXR1bVtcInhcIl09PT01Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdnZW5lcmF0ZXMgZXhwcmVzc2lvbnMgZm9yIGNvbXBvc2VkIGZpbHRlcnMnLCAoKSA9PiB7XG4gICAgbGV0IGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHtub3Q6IHtmaWVsZDogJ2NvbG9yJywgZXF1YWw6ICdyZWQnfX0pO1xuICAgIGFzc2VydC5lcXVhbChleHByLCAnIShkYXR1bVtcImNvbG9yXCJdPT09XCJyZWRcIiknKTtcblxuICAgIGV4cHIgPSBleHByZXNzaW9uKG51bGwsIHthbmQ6IFtcbiAgICAgIHtmaWVsZDogJ2NvbG9yJywgZXF1YWw6ICdyZWQnfSxcbiAgICAgIHtmaWVsZDogJ3gnLCByYW5nZTogWzAsIDVdfVxuICAgIF19KTtcblxuICAgIGFzc2VydC5lcXVhbChleHByLCAnKGRhdHVtW1wiY29sb3JcIl09PT1cInJlZFwiKSAmJiAoaW5yYW5nZShkYXR1bVtcInhcIl0sIFswLCA1XSkpJyk7XG5cbiAgICBleHByID0gZXhwcmVzc2lvbihudWxsLCB7YW5kOiBbXG4gICAgICB7ZmllbGQ6ICdjb2xvcicsIG9uZU9mOiBbJ3JlZCcsICd5ZWxsb3cnXX0sXG4gICAgICB7b3I6IFtcbiAgICAgICAge2ZpZWxkOiAneCcsIHJhbmdlOiBbMCwgbnVsbF19LFxuICAgICAgICAnZGF0dW0ucHJpY2UgPiAxMCcsXG4gICAgICAgIHtub3Q6ICdkYXR1bVtcInhcIl09PT01J31cbiAgICAgIF19XG4gICAgXX0pO1xuXG4gICAgYXNzZXJ0LmVxdWFsKGV4cHIsICcoaW5kZXhvZihbXCJyZWRcIixcInllbGxvd1wiXSwgZGF0dW1bXCJjb2xvclwiXSkgIT09IC0xKSAmJiAnICtcbiAgICAgICcoKGRhdHVtW1wieFwiXSA+PSAwKSB8fCAoZGF0dW0ucHJpY2UgPiAxMCkgfHwgKCEoZGF0dW1bXCJ4XCJdPT09NSkpKScpO1xuICB9KTtcblxuXG4gIGRlc2NyaWJlKCdmaWVsZEZpbHRlckV4cHJlc3Npb24nLCAoKSA9PiB7XG4gICAgaXQoJ2dlbmVyYXRlcyBhIHJhbmdlIHByZWRpY2F0ZSB1c2luZyBpbmVxdWFsaXRpZXMgd2hlbiB1c2VJblJhbmdlPWZhbHNlJywgKCkgPT4ge1xuICAgICAgY29uc3QgZXhwciA9IGZpZWxkRmlsdGVyRXhwcmVzc2lvbih7ZmllbGQ6ICd4JywgcmFuZ2U6IFswLCA1XX0sIGZhbHNlKTtcbiAgICAgIGFzc2VydC5lcXVhbChleHByLCAnZGF0dW1bXCJ4XCJdID49IDAgJiYgZGF0dW1bXCJ4XCJdIDw9IDUnKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/scale.test.d.ts b/build/test/scale.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/scale.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/scale.test.js b/build/test/scale.test.js new file mode 100644 index 0000000000..c85e827c2d --- /dev/null +++ b/build/test/scale.test.js @@ -0,0 +1,127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var channel_1 = require("../src/channel"); +var scale = tslib_1.__importStar(require("../src/scale")); +var scale_1 = require("../src/scale"); +var type_1 = require("../src/type"); +var util_1 = require("../src/util"); +describe('scale', function () { + describe('scaleTypeSupportProperty', function () { + // Make sure we always edit this when we add new channel + it('should have at least one supported scale types for all scale properties', function () { + var _loop_1 = function (prop) { + chai_1.assert(util_1.some(scale.SCALE_TYPES, function (scaleType) { + return scale.scaleTypeSupportProperty(scaleType, prop); + })); + }; + for (var _i = 0, _a = scale.SCALE_PROPERTIES; _i < _a.length; _i++) { + var prop = _a[_i]; + _loop_1(prop); + } + }); + // TODO: write more test blindly (Don't look at our code, just look at D3 code.) + chai_1.assert.isFalse(scale.scaleTypeSupportProperty('bin-linear', 'zero')); + }); + describe('scaleTypes', function () { + it('should either hasContinuousDomain or hasDiscreteDomain', function () { + for (var _i = 0, _a = scale.SCALE_TYPES; _i < _a.length; _i++) { + var scaleType = _a[_i]; + chai_1.assert(scale.hasContinuousDomain(scaleType) !== scale.hasDiscreteDomain(scaleType)); + } + }); + }); + describe('channelSupportScaleType', function () { + // Make sure we always edit this when we add new channel + it('should have at least one supported scale types for all channels with scale', function () { + var _loop_2 = function (channel) { + chai_1.assert(util_1.some(scale_1.SCALE_TYPES, function (scaleType) { + return scale_1.channelSupportScaleType(channel, scaleType); + })); + }; + for (var _i = 0, SCALE_CHANNELS_1 = channel_1.SCALE_CHANNELS; _i < SCALE_CHANNELS_1.length; _i++) { + var channel = SCALE_CHANNELS_1[_i]; + _loop_2(channel); + } + }); + // Make sure we always edit this when we add new scale type + it('should have at least one supported channel for all scale types', function () { + var _loop_3 = function (scaleType) { + chai_1.assert(util_1.some(channel_1.SCALE_CHANNELS, function (channel) { + return scale_1.channelSupportScaleType(channel, scaleType); + })); + }; + for (var _i = 0, SCALE_TYPES_1 = scale_1.SCALE_TYPES; _i < SCALE_TYPES_1.length; _i++) { + var scaleType = SCALE_TYPES_1[_i]; + _loop_3(scaleType); + } + }); + it('shape should support only ordinal', function () { + chai_1.assert(scale_1.channelSupportScaleType('shape', 'ordinal')); + var nonOrdinal = util_1.without(scale_1.SCALE_TYPES, ['ordinal']); + for (var _i = 0, nonOrdinal_1 = nonOrdinal; _i < nonOrdinal_1.length; _i++) { + var scaleType = nonOrdinal_1[_i]; + chai_1.assert(!scale_1.channelSupportScaleType('shape', scaleType)); + } + }); + it('color should support all scale types except band', function () { + for (var _i = 0, SCALE_TYPES_2 = scale_1.SCALE_TYPES; _i < SCALE_TYPES_2.length; _i++) { + var scaleType = SCALE_TYPES_2[_i]; + chai_1.assert.equal(scale_1.channelSupportScaleType('color', scaleType), scaleType !== 'band'); + } + }); + it('x, y, size, opacity should support all continuous scale type as well as band and point', function () { + // x,y should use either band or point for ordinal input + var scaleTypes = scale_1.CONTINUOUS_TO_CONTINUOUS_SCALES.concat([scale_1.ScaleType.BAND, scale_1.ScaleType.POINT]); + for (var _i = 0, _a = ['x', 'y', 'size', 'opacity']; _i < _a.length; _i++) { + var channel = _a[_i]; + chai_1.assert(!scale_1.channelSupportScaleType(channel, 'ordinal')); + chai_1.assert(!scale_1.channelSupportScaleType(channel, 'sequential')); + for (var _b = 0, scaleTypes_1 = scaleTypes; _b < scaleTypes_1.length; _b++) { + var scaleType = scaleTypes_1[_b]; + chai_1.assert(scale_1.channelSupportScaleType(channel, scaleType), "Error: " + channel + ", " + scaleType); + } + } + }); + }); + describe('getSupportedScaleType', function () { + it('should return correct scale types for quantitative positional channels', function () { + var type = type_1.Type.QUANTITATIVE; + var positionalScaleTypes = [scale_1.ScaleType.LINEAR, scale_1.ScaleType.LOG, scale_1.ScaleType.POW, scale_1.ScaleType.SQRT]; + // x channel + var scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.X, type); + chai_1.assert.deepEqual(positionalScaleTypes, scaleTypes); + // y channel + scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.Y, type_1.Type.QUANTITATIVE); + chai_1.assert.deepEqual(scaleTypes, positionalScaleTypes); + }); + it('should return correct scale types for quantitative positional channels with bin', function () { + var type = type_1.Type.QUANTITATIVE; + var positionalScaleTypesBinned = [scale_1.ScaleType.LINEAR, scale_1.ScaleType.BIN_LINEAR]; + // x channel + var scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.X, type, true); + chai_1.assert.deepEqual(scaleTypes, positionalScaleTypesBinned); + // y channel + scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.Y, type, true); + chai_1.assert.deepEqual(scaleTypes, positionalScaleTypesBinned); + }); + it('should return correct scale types for nominal positional channels', function () { + var type = type_1.Type.NOMINAL; + var nominalPositionalScaleTypes = [scale_1.ScaleType.POINT, scale_1.ScaleType.BAND]; + var scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.X, type); + chai_1.assert.deepEqual(scaleTypes, nominalPositionalScaleTypes); + scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.Y, type); + chai_1.assert.deepEqual(scaleTypes, nominalPositionalScaleTypes); + }); + it('should return correct scale types for temporal positional channels', function () { + var type = type_1.Type.TEMPORAL; + var temporalPositionalScaleTypes = [scale_1.ScaleType.TIME, scale_1.ScaleType.UTC]; + var scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.X, type); + chai_1.assert.deepEqual(scaleTypes, temporalPositionalScaleTypes); + scaleTypes = scale_1.getSupportedScaleType(channel_1.Channel.Y, type); + chai_1.assert.deepEqual(scaleTypes, temporalPositionalScaleTypes); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3Qvc2NhbGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNEI7QUFDNUIsMENBQXFFO0FBQ3JFLDBEQUFzQztBQUN0QyxzQ0FLc0I7QUFDdEIsb0NBQWlDO0FBQ2pDLG9DQUEwQztBQUUxQyxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ2hCLFFBQVEsQ0FBQywwQkFBMEIsRUFBRTtRQUNuQyx3REFBd0Q7UUFDeEQsRUFBRSxDQUFDLHlFQUF5RSxFQUFFO29DQUNqRSxJQUFJO2dCQUNiLGFBQU0sQ0FBQyxXQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxVQUFDLFNBQVM7b0JBQ3ZDLE9BQU8sS0FBSyxDQUFDLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDekQsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNOLENBQUM7WUFKRCxLQUFtQixVQUFzQixFQUF0QixLQUFBLEtBQUssQ0FBQyxnQkFBZ0IsRUFBdEIsY0FBc0IsRUFBdEIsSUFBc0I7Z0JBQXBDLElBQU0sSUFBSSxTQUFBO3dCQUFKLElBQUk7YUFJZDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0ZBQWdGO1FBRWhGLGFBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFlBQVksRUFBRTtRQUNyQixFQUFFLENBQUMsd0RBQXdELEVBQUU7WUFDM0QsS0FBd0IsVUFBaUIsRUFBakIsS0FBQSxLQUFLLENBQUMsV0FBVyxFQUFqQixjQUFpQixFQUFqQixJQUFpQixFQUFFO2dCQUF0QyxJQUFNLFNBQVMsU0FBQTtnQkFDbEIsYUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLENB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QUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge0NoYW5uZWwsIFNDQUxFX0NIQU5ORUxTLCBTY2FsZUNoYW5uZWx9IGZyb20gJy4uL3NyYy9jaGFubmVsJztcbmltcG9ydCAqIGFzIHNjYWxlIGZyb20gJy4uL3NyYy9zY2FsZSc7XG5pbXBvcnQge1xuICBjaGFubmVsU3VwcG9ydFNjYWxlVHlwZSxcbiAgQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUywgZ2V0U3VwcG9ydGVkU2NhbGVUeXBlLFxuICBTQ0FMRV9UWVBFUyxcbiAgU2NhbGVUeXBlXG59IGZyb20gJy4uL3NyYy9zY2FsZSc7XG5pbXBvcnQge1R5cGV9IGZyb20gJy4uL3NyYy90eXBlJztcbmltcG9ydCB7c29tZSwgd2l0aG91dH0gZnJvbSAnLi4vc3JjL3V0aWwnO1xuXG5kZXNjcmliZSgnc2NhbGUnLCAoKSA9PiB7XG4gIGRlc2NyaWJlKCdzY2FsZVR5cGVTdXBwb3J0UHJvcGVydHknLCAoKSA9PiB7XG4gICAgLy8gTWFrZSBzdXJlIHdlIGFsd2F5cyBlZGl0IHRoaXMgd2hlbiB3ZSBhZGQgbmV3IGNoYW5uZWxcbiAgICBpdCgnc2hvdWxkIGhhdmUgYXQgbGVhc3Qgb25lIHN1cHBvcnRlZCBzY2FsZSB0eXBlcyBmb3IgYWxsIHNjYWxlIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Ygc2NhbGUuU0NBTEVfUFJPUEVSVElFUykge1xuICAgICAgICBhc3NlcnQoc29tZShzY2FsZS5TQ0FMRV9UWVBFUywgKHNjYWxlVHlwZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBzY2FsZS5zY2FsZVR5cGVTdXBwb3J0UHJvcGVydHkoc2NhbGVUeXBlLCBwcm9wKTtcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVE9ETzogd3JpdGUgbW9yZSB0ZXN0IGJsaW5kbHkgKERvbid0IGxvb2sgYXQgb3VyIGNvZGUsIGp1c3QgbG9vayBhdCBEMyBjb2RlLilcblxuICAgIGFzc2VydC5pc0ZhbHNlKHNjYWxlLnNjYWxlVHlwZVN1cHBvcnRQcm9wZXJ0eSgnYmluLWxpbmVhcicsICd6ZXJvJykpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2NhbGVUeXBlcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGVpdGhlciBoYXNDb250aW51b3VzRG9tYWluIG9yIGhhc0Rpc2NyZXRlRG9tYWluJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2Ygc2NhbGUuU0NBTEVfVFlQRVMpIHtcbiAgICAgICAgYXNzZXJ0KHNjYWxlLmhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSAhPT0gc2NhbGUuaGFzRGlzY3JldGVEb21haW4oc2NhbGVUeXBlKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG5cbiAgZGVzY3JpYmUoJ2NoYW5uZWxTdXBwb3J0U2NhbGVUeXBlJywgKCkgPT4ge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSBhbHdheXMgZWRpdCB0aGlzIHdoZW4gd2UgYWRkIG5ldyBjaGFubmVsXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgc2NhbGUgdHlwZXMgZm9yIGFsbCBjaGFubmVscyB3aXRoIHNjYWxlJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFNDQUxFX0NIQU5ORUxTKSB7XG4gICAgICAgIGFzc2VydChzb21lKFNDQUxFX1RZUEVTLCAoc2NhbGVUeXBlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNjYWxlVHlwZSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBhbHdheXMgZWRpdCB0aGlzIHdoZW4gd2UgYWRkIG5ldyBzY2FsZSB0eXBlXG4gICAgaXQoJ3Nob3VsZCBoYXZlIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgY2hhbm5lbCBmb3IgYWxsIHNjYWxlIHR5cGVzJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2YgU0NBTEVfVFlQRVMpIHtcbiAgICAgICAgYXNzZXJ0KHNvbWUoU0NBTEVfQ0hBTk5FTFMsIChjaGFubmVsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNjYWxlVHlwZSk7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaGFwZSBzaG91bGQgc3VwcG9ydCBvbmx5IG9yZGluYWwnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQoY2hhbm5lbFN1cHBvcnRTY2FsZVR5cGUoJ3NoYXBlJywgJ29yZGluYWwnKSk7XG4gICAgICBjb25zdCBub25PcmRpbmFsID0gd2l0aG91dDxTY2FsZVR5cGU+KFNDQUxFX1RZUEVTLCBbJ29yZGluYWwnXSk7XG4gICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBub25PcmRpbmFsKSB7XG4gICAgICAgIGFzc2VydCghY2hhbm5lbFN1cHBvcnRTY2FsZVR5cGUoJ3NoYXBlJywgc2NhbGVUeXBlKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnY29sb3Igc2hvdWxkIHN1cHBvcnQgYWxsIHNjYWxlIHR5cGVzIGV4Y2VwdCBiYW5kJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzY2FsZVR5cGUgb2YgU0NBTEVfVFlQRVMpIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKCdjb2xvcicsIHNjYWxlVHlwZSksIHNjYWxlVHlwZSAhPT0gJ2JhbmQnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgaXQoJ3gsIHksIHNpemUsIG9wYWNpdHkgc2hvdWxkIHN1cHBvcnQgYWxsIGNvbnRpbnVvdXMgc2NhbGUgdHlwZSBhcyB3ZWxsIGFzIGJhbmQgYW5kIHBvaW50JywgKCkgPT4ge1xuICAgICAgLy8geCx5IHNob3VsZCB1c2UgZWl0aGVyIGJhbmQgb3IgcG9pbnQgZm9yIG9yZGluYWwgaW5wdXRcbiAgICAgIGNvbnN0IHNjYWxlVHlwZXMgPSBbLi4uQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUywgU2NhbGVUeXBlLkJBTkQsIFNjYWxlVHlwZS5QT0lOVF07XG5cbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3gnLCAneScsICdzaXplJywgJ29wYWNpdHknXSBhcyBTY2FsZUNoYW5uZWxbXSkge1xuICAgICAgICBhc3NlcnQoIWNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsICdvcmRpbmFsJykpO1xuICAgICAgICBhc3NlcnQoIWNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsICdzZXF1ZW50aWFsJykpO1xuICAgICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBzY2FsZVR5cGVzKSB7XG4gICAgICAgICAgYXNzZXJ0KGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNjYWxlVHlwZSksIGBFcnJvcjogJHtjaGFubmVsfSwgJHtzY2FsZVR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFN1cHBvcnRlZFNjYWxlVHlwZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHNjYWxlIHR5cGVzIGZvciBxdWFudGl0YXRpdmUgcG9zaXRpb25hbCBjaGFubmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBUeXBlLlFVQU5USVRBVElWRTtcbiAgICAgIGNvbnN0IHBvc2l0aW9uYWxTY2FsZVR5cGVzID0gW1NjYWxlVHlwZS5MSU5FQVIsIFNjYWxlVHlwZS5MT0csIFNjYWxlVHlwZS5QT1csIFNjYWxlVHlwZS5TUVJUXTtcblxuICAgICAgLy8geCBjaGFubmVsXG4gICAgICBsZXQgc2NhbGVUeXBlcyA9IGdldFN1cHBvcnRlZFNjYWxlVHlwZShDaGFubmVsLlgsIHR5cGUpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChwb3NpdGlvbmFsU2NhbGVUeXBlcywgc2NhbGVUeXBlcyk7XG5cbiAgICAgIC8vIHkgY2hhbm5lbFxuICAgICAgc2NhbGVUeXBlcyA9IGdldFN1cHBvcnRlZFNjYWxlVHlwZShDaGFubmVsLlksIFR5cGUuUVVBTlRJVEFUSVZFKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2NhbGVUeXBlcywgcG9zaXRpb25hbFNjYWxlVHlwZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBzY2FsZSB0eXBlcyBmb3IgcXVhbnRpdGF0aXZlIHBvc2l0aW9uYWwgY2hhbm5lbHMgd2l0aCBiaW4nLCAoKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gVHlwZS5RVUFOVElUQVRJVkU7XG4gICAgICBjb25zdCBwb3NpdGlvbmFsU2NhbGVUeXBlc0Jpbm5lZCA9IFtTY2FsZVR5cGUuTElORUFSLCBTY2FsZVR5cGUuQklOX0xJTkVBUl07XG5cbiAgICAgIC8vIHggY2hhbm5lbFxuICAgICAgbGV0IHNjYWxlVHlwZXMgPSBnZXRTdXBwb3J0ZWRTY2FsZVR5cGUoQ2hhbm5lbC5YLCB0eXBlLCB0cnVlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2NhbGVUeXBlcywgcG9zaXRpb25hbFNjYWxlVHlwZXNCaW5uZWQpO1xuXG4gICAgICAvLyB5IGNoYW5uZWxcbiAgICAgIHNjYWxlVHlwZXMgPSBnZXRTdXBwb3J0ZWRTY2FsZVR5cGUoQ2hhbm5lbC5ZLCB0eXBlLCB0cnVlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2NhbGVUeXBlcywgcG9zaXRpb25hbFNjYWxlVHlwZXNCaW5uZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBzY2FsZSB0eXBlcyBmb3Igbm9taW5hbCBwb3NpdGlvbmFsIGNoYW5uZWxzJywgKCkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IFR5cGUuTk9NSU5BTDtcbiAgICAgIGNvbnN0IG5vbWluYWxQb3NpdGlvbmFsU2NhbGVUeXBlcyA9IFtTY2FsZVR5cGUuUE9JTlQsIFNjYWxlVHlwZS5CQU5EXTtcblxuICAgICAgbGV0IHNjYWxlVHlwZXMgPSBnZXRTdXBwb3J0ZWRTY2FsZVR5cGUoQ2hhbm5lbC5YLCB0eXBlKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwoc2NhbGVUeXBlcywgbm9taW5hbFBvc2l0aW9uYWxTY2FsZVR5cGVzKTtcblxuICAgICAgc2NhbGVUeXBlcyA9IGdldFN1cHBvcnRlZFNjYWxlVHlwZShDaGFubmVsLlksIHR5cGUpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChzY2FsZVR5cGVzLCBub21pbmFsUG9zaXRpb25hbFNjYWxlVHlwZXMpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBzY2FsZSB0eXBlcyBmb3IgdGVtcG9yYWwgcG9zaXRpb25hbCBjaGFubmVscycsICgpID0+IHtcbiAgICAgIGNvbnN0IHR5cGUgPSBUeXBlLlRFTVBPUkFMO1xuICAgICAgY29uc3QgdGVtcG9yYWxQb3NpdGlvbmFsU2NhbGVUeXBlcyA9IFtTY2FsZVR5cGUuVElNRSwgU2NhbGVUeXBlLlVUQ107XG5cbiAgICAgIGxldCBzY2FsZVR5cGVzID0gZ2V0U3VwcG9ydGVkU2NhbGVUeXBlKENoYW5uZWwuWCwgdHlwZSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNjYWxlVHlwZXMsIHRlbXBvcmFsUG9zaXRpb25hbFNjYWxlVHlwZXMpO1xuXG4gICAgICBzY2FsZVR5cGVzID0gZ2V0U3VwcG9ydGVkU2NhbGVUeXBlKENoYW5uZWwuWSwgdHlwZSk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKHNjYWxlVHlwZXMsIHRlbXBvcmFsUG9zaXRpb25hbFNjYWxlVHlwZXMpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/spec.test.d.ts b/build/test/spec.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/spec.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/spec.test.js b/build/test/spec.test.js new file mode 100644 index 0000000000..b6d5826524 --- /dev/null +++ b/build/test/spec.test.js @@ -0,0 +1,862 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var log = tslib_1.__importStar(require("../src/log")); +var spec_1 = require("../src/spec"); +var config_1 = require("./../src/config"); +// describe('isStacked()') -- tested as part of stackOffset in stack.test.ts +describe('normalize()', function () { + describe('normalizeFacetedUnit', function () { + it('should convert single extended spec with column into a composite spec', function () { + var spec = { + "name": "faceted", + "width": 123, + "height": 234, + "description": "faceted spec", + "data": { "url": "data/movies.json" }, + "mark": "point", + "encoding": { + "column": { "field": "MPAA_Rating", "type": "ordinal" }, + "x": { "field": "Worldwide_Gross", "type": "quantitative" }, + "y": { "field": "US_DVD_Sales", "type": "quantitative" } + } + }; + var config = config_1.initConfig(spec.config); + chai_1.assert.deepEqual(spec_1.normalize(spec, config), { + "name": "faceted", + "description": "faceted spec", + "data": { "url": "data/movies.json" }, + "facet": { + "column": { "field": "MPAA_Rating", "type": "ordinal" } + }, + "spec": { + "mark": "point", + "width": 123, + "height": 234, + "encoding": { + "x": { "field": "Worldwide_Gross", "type": "quantitative" }, + "y": { "field": "US_DVD_Sales", "type": "quantitative" } + } + } + }); + }); + it('should convert single extended spec with row into a composite spec', function () { + var spec = { + "data": { "url": "data/movies.json" }, + "mark": "point", + "encoding": { + "row": { "field": "MPAA_Rating", "type": "ordinal" }, + "x": { "field": "Worldwide_Gross", "type": "quantitative" }, + "y": { "field": "US_DVD_Sales", "type": "quantitative" } + } + }; + var config = config_1.initConfig(spec.config); + chai_1.assert.deepEqual(spec_1.normalize(spec, config), { + "data": { "url": "data/movies.json" }, + "facet": { + "row": { "field": "MPAA_Rating", "type": "ordinal" } + }, + "spec": { + "mark": "point", + "encoding": { + "x": { "field": "Worldwide_Gross", "type": "quantitative" }, + "y": { "field": "US_DVD_Sales", "type": "quantitative" } + } + } + }); + }); + }); + describe('normalizeFacet', function () { + it('should produce correct layered specs for mean point and vertical error bar', function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "description": "A error bar plot showing mean, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [{ "filter": "datum.year == 2000" }], + facet: { + "row": { "field": "MPAA_Rating", "type": "ordinal" } + }, + spec: { + layer: [ + { + "mark": "point", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "mean", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 2 } + } + }, + { + mark: 'error-bar', + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + }, + "size": { "value": 5 } + } + } + ] + } + }, config_1.defaultConfig), { + "description": "A error bar plot showing mean, min, and max in the US population distribution of age groups in 2000.", + "data": { "url": "data/population.json" }, + "transform": [{ "filter": "datum.year == 2000" }], + facet: { + "row": { "field": "MPAA_Rating", "type": "ordinal" } + }, + spec: { + layer: [ + { + "mark": "point", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "mean", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 2 } + } + }, + { + "layer": [ + { + "mark": "rule", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + } + } + }, + { + "mark": "tick", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 } + } + }, + { + "mark": "tick", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "max", + "field": "people", + "type": "quantitative", + }, + "size": { "value": 5 } + } + } + ] + } + ] + } + }); + }); + }); + describe('normalizeLayer', function () { + it('correctly passes shared projection and encoding to children of layer', function () { + var output = spec_1.normalize({ + "data": { "url": "data/population.json" }, + "projection": { "type": "mercator" }, + "encoding": { + "x": { "field": "age", "type": "ordinal" } + }, + "layer": [ + { "mark": "point" }, + { + "layer": [ + { "mark": "rule" }, + { + "mark": "text", + "encoding": { + "text": { "field": "a", "type": "nominal" } + } + } + ] + } + ] + }, config_1.defaultConfig); + chai_1.assert.deepEqual(output, { + "data": { "url": "data/population.json" }, + layer: [ + { + "projection": { "type": "mercator" }, + "mark": "point", + "encoding": { + "x": { "field": "age", "type": "ordinal" } + } + }, + { + "layer": [ + { + "projection": { "type": "mercator" }, + "mark": "rule", + "encoding": { + "x": { "field": "age", "type": "ordinal" } + } + }, + { + "projection": { "type": "mercator" }, + "mark": "text", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "text": { "field": "a", "type": "nominal" } + } + } + ] + } + ] + }); + }); + it('correctly overrides shared projection and encoding and throws warnings', log.wrap(function (localLogger) { + var output = spec_1.normalize({ + "data": { "url": "data/population.json" }, + "projection": { "type": "mercator" }, + "encoding": { + "x": { "field": "age", "type": "ordinal" } + }, + "layer": [ + { + "projection": { "type": "albersUsa" }, + "mark": "rule" + }, + { + "mark": "text", + "encoding": { + "x": { "field": "a", "type": "nominal" } + } + } + ] + }, config_1.defaultConfig); + chai_1.assert.equal(localLogger.warns.length, 2); + chai_1.assert.equal(localLogger.warns[0], log.message.projectionOverridden({ + parentProjection: { "type": "mercator" }, + projection: { "type": "albersUsa" } + })); + chai_1.assert.equal(localLogger.warns[1], log.message.encodingOverridden(['x'])); + chai_1.assert.deepEqual(output, { + "data": { "url": "data/population.json" }, + layer: [ + { + "projection": { "type": "albersUsa" }, + "mark": "rule", + "encoding": { + "x": { "field": "age", "type": "ordinal" } + } + }, + { + "projection": { "type": "mercator" }, + "mark": "text", + "encoding": { + "x": { "field": "a", "type": "nominal" }, + } + } + ] + }); + })); + it('should produce correct layered specs for mean point and vertical error bar', function () { + chai_1.assert.deepEqual(spec_1.normalize({ + "data": { "url": "data/population.json" }, + layer: [ + { + "mark": "point", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "mean", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 2 } + } + }, + { + mark: 'error-bar', + encoding: { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + }, + "size": { "value": 5 } + } + } + ] + }, config_1.defaultConfig), { + "data": { "url": "data/population.json" }, + layer: [ + { + "mark": "point", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "mean", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 2 } + } + }, + { + "layer": [ + { + "mark": "rule", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "y2": { + "aggregate": "max", + "field": "people", + "type": "quantitative" + } + } + }, + { + "mark": "tick", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "min", + "field": "people", + "type": "quantitative", + "axis": { "title": "population" } + }, + "size": { "value": 5 } + } + }, + { + "mark": "tick", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { + "aggregate": "max", + "field": "people", + "type": "quantitative", + }, + "size": { "value": 5 } + } + } + ] + } + ] + }); + }); + }); + describe('normalizePathOverlay', function () { + it('correctly normalizes line with overlayed point.', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { "line": { "point": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "point", "opacity": 1, "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ], + "config": { "line": { "point": {} } } + }); + }); + it('correctly normalizes line with transparent point overlayed.', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": { "type": "line", "point": "transparent" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "point", "opacity": 0, "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ] + }); + }); + it('correctly normalizes line with point overlayed via mark definition.', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": { "type": "line", "point": { "color": "red" } }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "point", "opacity": 1, "filled": true, "color": "red" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ] + }); + }); + it('correctly normalizes faceted line plots with overlayed point.', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "line", + "encoding": { + "row": { "field": "symbol", "type": "nominal" }, + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { "line": { "point": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "facet": { + "row": { "field": "symbol", "type": "nominal" }, + }, + "spec": { + "layer": [ + { + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "point", "opacity": 1, "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ], + }, + "config": { "line": { "point": {} } } + }); + }); + it('correctly normalizes area with overlay line and point', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "area", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { "area": { "line": {}, "point": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": { "type": "area", "opacity": 0.7 }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "line" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "point", "opacity": 1, "filled": true }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ], + "config": { "area": { "line": {}, "point": {} } } + }); + }); + it('correctly normalizes interpolated area with overlay line', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": { "type": "area", "interpolate": "monotone" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { "area": { "line": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": { "type": "area", "opacity": 0.7, "interpolate": "monotone" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "mark": { "type": "line", "interpolate": "monotone" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + } + ], + "config": { "area": { "line": {} } } + }); + }); + it('correctly normalizes area with disabled overlay point and line.', function () { + for (var _i = 0, _a = [null, false]; _i < _a.length; _i++) { + var overlay = _a[_i]; + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": { "type": "area", "point": overlay, "line": overlay }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "area", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }); + } + }); + it('correctly normalizes area with overlay point and line disabled in config.', function () { + for (var _i = 0, _a = [null, false]; _i < _a.length; _i++) { + var overlay = _a[_i]; + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": { "type": "area" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { + "area": { "point": overlay, "line": overlay } + } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "area", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + }, + "config": { + "area": { "point": overlay, "line": overlay } + } + }); + } + }); + it('correctly normalizes stacked area with overlay line', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "area", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + }, + "config": { "area": { "line": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": { "type": "area", "opacity": 0.7 }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + } + }, + { + "mark": { "type": "line" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative", "stack": "zero" }, + "color": { "field": "symbol", "type": "nominal" } + } + } + ], + "config": { "area": { "line": {} } } + }); + }); + it('correctly normalizes streamgraph with overlay line', function () { + var spec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "mark": "area", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative", "stack": "center" }, + "color": { "field": "symbol", "type": "nominal" } + }, + "config": { "area": { "line": {} } } + }; + var normalizedSpec = spec_1.normalize(spec, spec.config); + chai_1.assert.deepEqual(normalizedSpec, { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "mark": { "type": "area", "opacity": 0.7 }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative", "stack": "center" }, + "color": { "field": "symbol", "type": "nominal" } + } + }, + { + "mark": { "type": "line" }, + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "aggregate": "sum", "field": "price", "type": "quantitative", "stack": "center" }, + "color": { "field": "symbol", "type": "nominal" } + } + } + ], + "config": { "area": { "line": {} } } + }); + }); + }); +}); +describe('normalizeRangedUnitSpec', function () { + it('should convert y2 -> y if there is no y in the encoding', function () { + var spec = { + "data": { "url": "data/population.json" }, + "mark": "rule", + "encoding": { + "y2": { "field": "age", "type": "ordinal" }, + "x": { "aggregate": "min", "field": "people", "type": "quantitative" }, + "x2": { "aggregate": "max", "field": "people", "type": "quantitative" } + } + }; + chai_1.assert.deepEqual(spec_1.normalize(spec, config_1.defaultConfig), { + "data": { "url": "data/population.json" }, + "mark": "rule", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { "aggregate": "min", "field": "people", "type": "quantitative" }, + "x2": { "aggregate": "max", "field": "people", "type": "quantitative" } + } + }); + }); + it('should do nothing if there is no missing x or y', function () { + var spec = { + "data": { "url": "data/population.json" }, + "mark": "rule", + "encoding": { + "y": { "field": "age", "type": "ordinal" }, + "x": { "aggregate": "min", "field": "people", "type": "quantitative" }, + "x2": { "aggregate": "max", "field": "people", "type": "quantitative" } + } + }; + chai_1.assert.deepEqual(spec_1.normalize(spec, config_1.defaultConfig), spec); + }); + it('should convert x2 -> x if there is no x in the encoding', function () { + var spec = { + "data": { "url": "data/population.json" }, + "mark": "rule", + "encoding": { + "x2": { "field": "age", "type": "ordinal" }, + "y": { "aggregate": "min", "field": "people", "type": "quantitative" }, + "y2": { "aggregate": "max", "field": "people", "type": "quantitative" } + } + }; + chai_1.assert.deepEqual(spec_1.normalize(spec, config_1.defaultConfig), { + "data": { "url": "data/population.json" }, + "mark": "rule", + "encoding": { + "x": { "field": "age", "type": "ordinal" }, + "y": { "aggregate": "min", "field": "people", "type": "quantitative" }, + "y2": { "aggregate": "max", "field": "people", "type": "quantitative" } + } + }); + }); +}); +describe('fieldDefs()', function () { + it('should get all non-duplicate fieldDefs from an encoding', function () { + var spec = { + "data": { "url": "data/cars.json" }, + "mark": "point", + "encoding": { + "x": { "field": "Horsepower", "type": "quantitative" }, + "y": { "field": "Miles_per_Gallon", "type": "quantitative" } + } + }; + chai_1.assert.sameDeepMembers(spec_1.fieldDefs(spec), [ + { "field": "Horsepower", "type": "quantitative" }, + { "field": "Miles_per_Gallon", "type": "quantitative" } + ]); + }); + it('should get all non-duplicate fieldDefs from all layer in a LayerSpec', function () { + var layerSpec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "description": "Google's stock price over time.", + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "description": "Google's stock price over time.", + "mark": "point", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "symbol", "type": "nominal" } + }, + "config": { "mark": { "filled": true } } + } + ] + }; + chai_1.assert.sameDeepMembers(spec_1.fieldDefs(layerSpec), [ + { "field": "date", "type": "temporal" }, + { "field": "price", "type": "quantitative" }, + { "field": "symbol", "type": "nominal" } + ]); + }); + it('should get all non-duplicate fieldDefs from all layer in a LayerSpec (merging duplicate fields with different scale types)', function () { + var layerSpec = { + "data": { "url": "data/stocks.csv", "format": { "type": "csv" } }, + "layer": [ + { + "description": "Google's stock price over time.", + "mark": "line", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" } + } + }, + { + "description": "Google's stock price over time.", + "mark": "point", + "encoding": { + "x": { "field": "date", "type": "temporal" }, + "y": { "field": "price", "type": "quantitative" }, + "color": { "field": "date", "type": "temporal", "scale": { "type": "pow" } } + }, + "config": { "mark": { "filled": true } } + } + ] + }; + chai_1.assert.sameDeepMembers(spec_1.fieldDefs(layerSpec), [ + { "field": "date", "type": "temporal" }, + { "field": "price", "type": "quantitative" } + ]); + }); + it('should get all non-duplicate fieldDefs from facet and layer in a FacetSpec', function () { + var facetSpec = { + "data": { "url": "data/movies.json" }, + "facet": { "row": { "field": "MPAA_Rating", "type": "ordinal" } }, + "spec": { + "mark": "point", + "encoding": { + "x": { "field": "Worldwide_Gross", "type": "quantitative" }, + "y": { "field": "US_DVD_Sales", "type": "quantitative" } + } + } + }; + chai_1.assert.sameDeepMembers(spec_1.fieldDefs(facetSpec), [ + { "field": "MPAA_Rating", "type": "ordinal" }, + { "field": "Worldwide_Gross", "type": "quantitative" }, + { "field": "US_DVD_Sales", "type": "quantitative" } + ]); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlYy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC9zcGVjLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsOEJBQThCO0FBQzlCLDZCQUE0QjtBQUk1QixzREFBa0M7QUFDbEMsb0NBQXlGO0FBQ3pGLDBDQUEwRDtBQUUxRCw0RUFBNEU7QUFFNUUsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixRQUFRLENBQUMsc0JBQXNCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLHVFQUF1RSxFQUFFO1lBQzFFLElBQU0sSUFBSSxHQUFRO2dCQUNoQixNQUFNLEVBQUUsU0FBUztnQkFDakIsT0FBTyxFQUFFLEdBQUc7Z0JBQ1osUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsYUFBYSxFQUFFLGNBQWM7Z0JBQzdCLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBQztnQkFDbkMsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsVUFBVSxFQUFFO29CQUNWLFFBQVEsRUFBRSxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQztvQkFDcEQsR0FBRyxFQUFFLEVBQUMsT0FBTyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUM7b0JBQ3hELEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUMsTUFBTSxFQUFFLGNBQWMsRUFBQztpQkFDdEQ7YUFDRixDQUFDO1lBQ0YsSUFBTSxNQUFNLEdBQUcsbUJBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxnQkFBUyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLGFBQWEsRUFBRSxjQUFjO2dCQUM3QixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsa0JBQWtCLEVBQUM7Z0JBQ25DLE9BQU8sRUFBRTtvQkFDUCxRQUFR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b3RlbWFyayAqL1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuXG5pbXBvcnQge0ZpZWxkLCBGaWVsZERlZn0gZnJvbSAnLi4vc3JjL2ZpZWxkZGVmJztcbmltcG9ydCB7TG9jYWxMb2dnZXJ9IGZyb20gJy4uL3NyYy9sb2cnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL3NyYy9sb2cnO1xuaW1wb3J0IHtmaWVsZERlZnMsIG5vcm1hbGl6ZSwgTm9ybWFsaXplZFNwZWMsIFRvcExldmVsLCBUb3BMZXZlbFNwZWN9IGZyb20gJy4uL3NyYy9zcGVjJztcbmltcG9ydCB7ZGVmYXVsdENvbmZpZywgaW5pdENvbmZpZ30gZnJvbSAnLi8uLi9zcmMvY29uZmlnJztcblxuLy8gZGVzY3JpYmUoJ2lzU3RhY2tlZCgpJykgLS0gdGVzdGVkIGFzIHBhcnQgb2Ygc3RhY2tPZmZzZXQgaW4gc3RhY2sudGVzdC50c1xuXG5kZXNjcmliZSgnbm9ybWFsaXplKCknLCBmdW5jdGlvbiAoKSB7XG4gIGRlc2NyaWJlKCdub3JtYWxpemVGYWNldGVkVW5pdCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc2luZ2xlIGV4dGVuZGVkIHNwZWMgd2l0aCBjb2x1bW4gaW50byBhIGNvbXBvc2l0ZSBzcGVjJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBzcGVjOiBhbnkgPSB7XG4gICAgICAgIFwibmFtZVwiOiBcImZhY2V0ZWRcIixcbiAgICAgICAgXCJ3aWR0aFwiOiAxMjMsXG4gICAgICAgIFwiaGVpZ2h0XCI6IDIzNCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZhY2V0ZWQgc3BlY1wiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9tb3ZpZXMuanNvblwifSxcbiAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJjb2x1bW5cIjoge1wiZmllbGRcIjogXCJNUEFBX1JhdGluZ1wiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiV29ybGR3aWRlX0dyb3NzXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIlVTX0RWRF9TYWxlc1wiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY29uc3QgY29uZmlnID0gaW5pdENvbmZpZyhzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsKG5vcm1hbGl6ZShzcGVjLCBjb25maWcpLCB7XG4gICAgICAgIFwibmFtZVwiOiBcImZhY2V0ZWRcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcImZhY2V0ZWQgc3BlY1wiLFxuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9tb3ZpZXMuanNvblwifSxcbiAgICAgICAgXCJmYWNldFwiOiB7XG4gICAgICAgICAgXCJjb2x1bW5cIjoge1wiZmllbGRcIjogXCJNUEFBX1JhdGluZ1wiLFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGVjXCI6IHtcbiAgICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICAgIFwid2lkdGhcIjogMTIzLFxuICAgICAgICAgIFwiaGVpZ2h0XCI6IDIzNCxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIldvcmxkd2lkZV9Hcm9zc1wiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcIlVTX0RWRF9TYWxlc1wiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGNvbnZlcnQgc2luZ2xlIGV4dGVuZGVkIHNwZWMgd2l0aCByb3cgaW50byBhIGNvbXBvc2l0ZSBzcGVjJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBzcGVjOiBhbnkgPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL21vdmllcy5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInJvd1wiOiB7XCJmaWVsZFwiOiBcIk1QQUFfUmF0aW5nXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJXb3JsZHdpZGVfR3Jvc3NcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiVVNfRFZEX1NhbGVzXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNvbmZpZyA9IGluaXRDb25maWcoc3BlYy5jb25maWcpO1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChub3JtYWxpemUoc3BlYywgY29uZmlnKSwge1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9tb3ZpZXMuanNvblwifSxcbiAgICAgICAgXCJmYWNldFwiOiB7XG4gICAgICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJNUEFBX1JhdGluZ1wiLFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGVjXCI6IHtcbiAgICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiV29ybGR3aWRlX0dyb3NzXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwiVVNfRFZEX1NhbGVzXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ25vcm1hbGl6ZUZhY2V0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIG1lYW4gcG9pbnQgYW5kIHZlcnRpY2FsIGVycm9yIGJhcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkEgZXJyb3IgYmFyIHBsb3Qgc2hvd2luZyBtZWFuLCBtaW4sIGFuZCBtYXggaW4gdGhlIFVTIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIG9mIGFnZSBncm91cHMgaW4gMjAwMC5cIixcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInRyYW5zZm9ybVwiOiBbe1wiZmlsdGVyXCI6IFwiZGF0dW0ueWVhciA9PSAyMDAwXCJ9XSxcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICBcInJvd1wiOiB7XCJmaWVsZFwiOiBcIk1QQUFfUmF0aW5nXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifVxuICAgICAgICB9LFxuICAgICAgICBzcGVjOiB7XG4gICAgICAgICAgbGF5ZXI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtZWFuXCIsXG4gICAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiAyfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtYXJrOiAnZXJyb3ItYmFyJyxcbiAgICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0sIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJBIGVycm9yIGJhciBwbG90IHNob3dpbmcgbWVhbiwgbWluLCBhbmQgbWF4IGluIHRoZSBVUyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhZ2UgZ3JvdXBzIGluIDIwMDAuXCIsXG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgICAgXCJ0cmFuc2Zvcm1cIjogW3tcImZpbHRlclwiOiBcImRhdHVtLnllYXIgPT0gMjAwMFwifV0sXG4gICAgICAgIGZhY2V0OiB7XG4gICAgICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJNUEFBX1JhdGluZ1wiLFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgc3BlYzoge1xuICAgICAgICAgIGxheWVyOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWVhblwiLFxuICAgICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogMn1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtaW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1heFwiLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBcIm1hcmtcIjogXCJ0aWNrXCIsXG4gICAgICAgICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwidGlja1wiLFxuICAgICAgICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgLy8gXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplTGF5ZXInLCAoKSA9PiB7XG4gICAgaXQoJ2NvcnJlY3RseSBwYXNzZXMgc2hhcmVkIHByb2plY3Rpb24gYW5kIGVuY29kaW5nIHRvIGNoaWxkcmVuIG9mIGxheWVyJywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbm9ybWFsaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBcInByb2plY3Rpb25cIjoge1widHlwZVwiOiBcIm1lcmNhdG9yXCJ9LFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJhZ2VcIiwgXCJ0eXBlXCI6IFwib3JkaW5hbFwifVxuICAgICAgICB9LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XCJtYXJrXCI6IFwicG9pbnRcIn0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAgICAgIHtcIm1hcmtcIjogXCJydWxlXCJ9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LCBkZWZhdWx0Q29uZmlnKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChvdXRwdXQsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBsYXllcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XCJ0eXBlXCI6IFwibWVyY2F0b3JcIn0sXG4gICAgICAgICAgICBcIm1hcmtcIjogXCJwb2ludFwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XCJ0eXBlXCI6IFwibWVyY2F0b3JcIn0sXG4gICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsIFwidHlwZVwiOiBcIm9yZGluYWxcIn1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBcInByb2plY3Rpb25cIjoge1widHlwZVwiOiBcIm1lcmNhdG9yXCJ9LFxuICAgICAgICAgICAgICAgIFwibWFya1wiOiBcInRleHRcIixcbiAgICAgICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAgICAgICAgICAgICAgXCJ0ZXh0XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ2NvcnJlY3RseSBvdmVycmlkZXMgc2hhcmVkIHByb2plY3Rpb24gYW5kIGVuY29kaW5nIGFuZCB0aHJvd3Mgd2FybmluZ3MnLCBsb2cud3JhcCgobG9jYWxMb2dnZXI6IExvY2FsTG9nZ2VyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBub3JtYWxpemUoe1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICAgIFwicHJvamVjdGlvblwiOiB7XCJ0eXBlXCI6IFwibWVyY2F0b3JcIn0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJ0ZXh0XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LCBkZWZhdWx0Q29uZmlnKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zLmxlbmd0aCwgMik7XG5cbiAgICAgIGFzc2VydC5lcXVhbChsb2NhbExvZ2dlci53YXJuc1swXSwgbG9nLm1lc3NhZ2UucHJvamVjdGlvbk92ZXJyaWRkZW4oe1xuICAgICAgICBwYXJlbnRQcm9qZWN0aW9uOiB7XCJ0eXBlXCI6IFwibWVyY2F0b3JcIn0sXG4gICAgICAgIHByb2plY3Rpb246IHtcInR5cGVcIjogXCJhbGJlcnNVc2FcIn1cbiAgICAgIH0pKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKGxvY2FsTG9nZ2VyLndhcm5zWzFdLCBsb2cubWVzc2FnZS5lbmNvZGluZ092ZXJyaWRkZW4oWyd4J10pKTtcblxuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChvdXRwdXQsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBsYXllcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwicHJvamVjdGlvblwiOiB7XCJ0eXBlXCI6IFwiYWxiZXJzVXNhXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLCBcInR5cGVcIjogXCJvcmRpbmFsXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcInByb2plY3Rpb25cIjoge1widHlwZVwiOiBcIm1lcmNhdG9yXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IFwidGV4dFwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pKTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBjb3JyZWN0IGxheWVyZWQgc3BlY3MgZm9yIG1lYW4gcG9pbnQgYW5kIHZlcnRpY2FsIGVycm9yIGJhcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBsYXllcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogMn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcms6ICdlcnJvci1iYXInLFxuICAgICAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIixcbiAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwieTJcIjoge1xuICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIFwic2l6ZVwiOiB7XCJ2YWx1ZVwiOiA1fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSwgZGVmYXVsdENvbmZpZyksIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgICBsYXllcjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcbiAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1lYW5cIixcbiAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgXCJheGlzXCI6IHtcInRpdGxlXCI6IFwicG9wdWxhdGlvblwifVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogMn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWluXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBcInkyXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJhZ2dyZWdhdGVcIjogXCJtYXhcIixcbiAgICAgICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcInBlb3BsZVwiLFxuICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFwibWFya1wiOiBcInRpY2tcIixcbiAgICAgICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgICAgICAgICAgICBcInlcIjoge1xuICAgICAgICAgICAgICAgICAgICBcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLFxuICAgICAgICAgICAgICAgICAgICBcImZpZWxkXCI6IFwicGVvcGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLFxuICAgICAgICAgICAgICAgICAgICBcImF4aXNcIjoge1widGl0bGVcIjogXCJwb3B1bGF0aW9uXCJ9XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgXCJzaXplXCI6IHtcInZhbHVlXCI6IDV9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgXCJtYXJrXCI6IFwidGlja1wiLFxuICAgICAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgICAgICAgICAgIFwieVwiOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiYWdncmVnYXRlXCI6IFwibWF4XCIsXG4gICAgICAgICAgICAgICAgICAgIFwiZmllbGRcIjogXCJwZW9wbGVcIixcbiAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vIFwiYXhpc1wiOiB7XCJ0aXRsZVwiOiBcInBvcHVsYXRpb25cIn1cbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBcInNpemVcIjoge1widmFsdWVcIjogNX1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnbm9ybWFsaXplUGF0aE92ZXJsYXknLCAoKSA9PiB7XG4gICAgaXQoJ2NvcnJlY3RseSBub3JtYWxpemVzIGxpbmUgd2l0aCBvdmVybGF5ZWQgcG9pbnQuJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWxTcGVjID0ge1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsIFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcImxpbmVcIjoge1wicG9pbnRcIjoge319fVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTcGVjID0gbm9ybWFsaXplKHNwZWMsIHNwZWMuY29uZmlnKTtcbiAgICAgIGFzc2VydC5kZWVwRXF1YWw8VG9wTGV2ZWw8Tm9ybWFsaXplZFNwZWM+Pihub3JtYWxpemVkU3BlYywge1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsIFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcInBvaW50XCIsIFwib3BhY2l0eVwiOiAxLCBcImZpbGxlZFwiOiB0cnVlfSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcImxpbmVcIjoge1wicG9pbnRcIjoge319fVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29ycmVjdGx5IG5vcm1hbGl6ZXMgbGluZSB3aXRoIHRyYW5zcGFyZW50IHBvaW50IG92ZXJsYXllZC4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbFNwZWMgPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIiwgXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6IFwibGluZVwiLCBcInBvaW50XCI6IFwidHJhbnNwYXJlbnRcIn0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJwb2ludFwiLCBcIm9wYWNpdHlcIjogMCwgXCJmaWxsZWRcIjogdHJ1ZX0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgbm9ybWFsaXplcyBsaW5lIHdpdGggcG9pbnQgb3ZlcmxheWVkIHZpYSBtYXJrIGRlZmluaXRpb24uJywgKCkgPT4ge1xuICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWxTcGVjID0ge1xuICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsIFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImxpbmVcIiwgXCJwb2ludFwiOiB7XCJjb2xvclwiOiBcInJlZFwifX0sXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgXCJsYXllclwiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJwb2ludFwiLCBcIm9wYWNpdHlcIjogMSwgXCJmaWxsZWRcIjogdHJ1ZSwgXCJjb2xvclwiOiBcInJlZFwifSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBub3JtYWxpemVzIGZhY2V0ZWQgbGluZSBwbG90cyB3aXRoIG92ZXJsYXllZCBwb2ludC4nLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbFNwZWMgPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIiwgXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICAgIFwibWFya1wiOiBcImxpbmVcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJzeW1ib2xcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICB9LFxuICAgICAgICBcImNvbmZpZ1wiOiB7XCJsaW5lXCI6IHtcInBvaW50XCI6IHt9fX1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgXCJmYWNldFwiOiB7XG4gICAgICAgICAgXCJyb3dcIjoge1wiZmllbGRcIjogXCJzeW1ib2xcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGVjXCI6IHtcbiAgICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcInBvaW50XCIsIFwib3BhY2l0eVwiOiAxLCBcImZpbGxlZFwiOiB0cnVlfSxcbiAgICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcImxpbmVcIjoge1wicG9pbnRcIjoge319fVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29ycmVjdGx5IG5vcm1hbGl6ZXMgYXJlYSB3aXRoIG92ZXJsYXkgbGluZSBhbmQgcG9pbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbFNwZWMgPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIiwgXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9LCBcInBvaW50XCI6IHt9fX1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImFyZWFcIiwgXCJvcGFjaXR5XCI6IDAuN30sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJsaW5lXCJ9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIixcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6IFwicG9pbnRcIiwgXCJvcGFjaXR5XCI6IDEsIFwiZmlsbGVkXCI6IHRydWV9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIixcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFwiY29uZmlnXCI6IHtcImFyZWFcIjoge1wibGluZVwiOiB7fSwgXCJwb2ludFwiOiB7fX19XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgbm9ybWFsaXplcyBpbnRlcnBvbGF0ZWQgYXJlYSB3aXRoIG92ZXJsYXkgbGluZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsU3BlYyA9IHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJhcmVhXCIsIFwiaW50ZXJwb2xhdGVcIjogXCJtb25vdG9uZVwifSxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9fX1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImFyZWFcIiwgXCJvcGFjaXR5XCI6IDAuNywgXCJpbnRlcnBvbGF0ZVwiOiBcIm1vbm90b25lXCJ9LFxuICAgICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIixcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6IFwibGluZVwiLCBcImludGVycG9sYXRlXCI6IFwibW9ub3RvbmVcIn0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9fX1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBub3JtYWxpemVzIGFyZWEgd2l0aCBkaXNhYmxlZCBvdmVybGF5IHBvaW50IGFuZCBsaW5lLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgb3ZlcmxheSBvZiBbbnVsbCwgZmFsc2VdKSB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsU3BlYyA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsIFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6IFwiYXJlYVwiLCBcInBvaW50XCI6IG92ZXJsYXksIFwibGluZVwiOiBvdmVybGF5fSxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTcGVjID0gbm9ybWFsaXplKHNwZWMsIHNwZWMuY29uZmlnKTtcbiAgICAgICAgYXNzZXJ0LmRlZXBFcXVhbDxUb3BMZXZlbDxOb3JtYWxpemVkU3BlYz4+KG5vcm1hbGl6ZWRTcGVjLCB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgICBcIm1hcmtcIjogXCJhcmVhXCIsXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdjb3JyZWN0bHkgbm9ybWFsaXplcyBhcmVhIHdpdGggb3ZlcmxheSBwb2ludCBhbmQgbGluZSBkaXNhYmxlZCBpbiBjb25maWcuJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBvdmVybGF5IG9mIFtudWxsLCBmYWxzZV0pIHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWxTcGVjID0ge1xuICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIiwgXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICAgICAgXCJtYXJrXCI6IHtcInR5cGVcIjogXCJhcmVhXCJ9LFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgICAgXCJhcmVhXCI6IHtcInBvaW50XCI6IG92ZXJsYXksIFwibGluZVwiOiBvdmVybGF5fVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNwZWMgPSBub3JtYWxpemUoc3BlYywgc3BlYy5jb25maWcpO1xuICAgICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsIFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIiwgXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwiYXJlYVwiOiB7XCJwb2ludFwiOiBvdmVybGF5LCBcImxpbmVcIjogb3ZlcmxheX1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ2NvcnJlY3RseSBub3JtYWxpemVzIHN0YWNrZWQgYXJlYSB3aXRoIG92ZXJsYXkgbGluZScsICgpID0+IHtcbiAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsU3BlYyA9IHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLCBcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgICAgXCJtYXJrXCI6IFwiYXJlYVwiLFxuICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsIFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInByaWNlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9fX1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImFyZWFcIiwgXCJvcGFjaXR5XCI6IDAuN30sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInN5bWJvbFwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImxpbmVcIn0sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcInN0YWNrXCI6IFwiemVyb1wifSxcbiAgICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInN5bWJvbFwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcImNvbmZpZ1wiOiB7XCJhcmVhXCI6IHtcImxpbmVcIjoge319fVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnY29ycmVjdGx5IG5vcm1hbGl6ZXMgc3RyZWFtZ3JhcGggd2l0aCBvdmVybGF5IGxpbmUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbFNwZWMgPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIiwgXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICAgIFwibWFya1wiOiBcImFyZWFcIixcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLCBcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJwcmljZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzdGFja1wiOiBcImNlbnRlclwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9fX1cbiAgICAgIH07XG4gICAgICBjb25zdCBub3JtYWxpemVkU3BlYyA9IG5vcm1hbGl6ZShzcGVjLCBzcGVjLmNvbmZpZyk7XG4gICAgICBhc3NlcnQuZGVlcEVxdWFsPFRvcExldmVsPE5vcm1hbGl6ZWRTcGVjPj4obm9ybWFsaXplZFNwZWMsIHtcbiAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvc3RvY2tzLmNzdlwiLFwiZm9ybWF0XCI6IHtcInR5cGVcIjogXCJjc3ZcIn19LFxuICAgICAgICBcImxheWVyXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcIm1hcmtcIjoge1widHlwZVwiOiBcImFyZWFcIiwgXCJvcGFjaXR5XCI6IDAuN30sXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwiLCBcInN0YWNrXCI6IFwiY2VudGVyXCJ9LFxuICAgICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibWFya1wiOiB7XCJ0eXBlXCI6IFwibGluZVwifSxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInByaWNlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic3RhY2tcIjogXCJjZW50ZXJcIn0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzeW1ib2xcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJjb25maWdcIjoge1wiYXJlYVwiOiB7XCJsaW5lXCI6IHt9fX1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbm9ybWFsaXplUmFuZ2VkVW5pdFNwZWMnLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgY29udmVydCB5MiAtPiB5IGlmIHRoZXJlIGlzIG5vIHkgaW4gdGhlIGVuY29kaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3BlYzogTm9ybWFsaXplZFNwZWMgPSB7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ5MlwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtaW5cIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieDJcIjoge1wiYWdncmVnYXRlXCI6IFwibWF4XCIsIFwiZmllbGRcIjogXCJwZW9wbGVcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFzc2VydC5kZWVwRXF1YWw8Tm9ybWFsaXplZFNwZWM+KG5vcm1hbGl6ZShzcGVjLCBkZWZhdWx0Q29uZmlnKSwge1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtaW5cIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieDJcIjoge1wiYWdncmVnYXRlXCI6IFwibWF4XCIsIFwiZmllbGRcIjogXCJwZW9wbGVcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgZG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBtaXNzaW5nIHggb3IgeScsIGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHNwZWM6IE5vcm1hbGl6ZWRTcGVjID0ge1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvcG9wdWxhdGlvbi5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwicnVsZVwiLFxuICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFnZVwiLFwidHlwZVwiOiBcIm9yZGluYWxcIn0sXG4gICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtaW5cIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgIFwieDJcIjoge1wiYWdncmVnYXRlXCI6IFwibWF4XCIsIFwiZmllbGRcIjogXCJwZW9wbGVcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplKHNwZWMsIGRlZmF1bHRDb25maWcpLCBzcGVjKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBjb252ZXJ0IHgyIC0+IHggaWYgdGhlcmUgaXMgbm8geCBpbiB0aGUgZW5jb2RpbmcnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzcGVjOiBOb3JtYWxpemVkU3BlYyA9IHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3BvcHVsYXRpb24uanNvblwifSxcbiAgICAgIFwibWFya1wiOiBcInJ1bGVcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcIngyXCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLCBcImZpZWxkXCI6IFwicGVvcGxlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5MlwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtYXhcIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYXNzZXJ0LmRlZXBFcXVhbDxOb3JtYWxpemVkU3BlYz4obm9ybWFsaXplKHNwZWMsIGRlZmF1bHRDb25maWcpLCB7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9wb3B1bGF0aW9uLmpzb25cIn0sXG4gICAgICBcIm1hcmtcIjogXCJydWxlXCIsXG4gICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYWdlXCIsXCJ0eXBlXCI6IFwib3JkaW5hbFwifSxcbiAgICAgICAgXCJ5XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcIm1pblwiLCBcImZpZWxkXCI6IFwicGVvcGxlXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgXCJ5MlwiOiB7XCJhZ2dyZWdhdGVcIjogXCJtYXhcIiwgXCJmaWVsZFwiOiBcInBlb3BsZVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2ZpZWxkRGVmcygpJywgZnVuY3Rpb24oKSB7XG4gIGl0KCdzaG91bGQgZ2V0IGFsbCBub24tZHVwbGljYXRlIGZpZWxkRGVmcyBmcm9tIGFuIGVuY29kaW5nJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgc3BlYzogYW55ID0ge1xuICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvY2Fycy5qc29uXCJ9LFxuICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJIb3JzZXBvd2VyXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJNaWxlc19wZXJfR2FsbG9uXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9XG4gICAgICB9XG4gICAgfTtcblxuICAgIGFzc2VydC5zYW1lRGVlcE1lbWJlcnM8RmllbGREZWY8RmllbGQ+PihmaWVsZERlZnMoc3BlYyksIFtcbiAgICAgIHtcImZpZWxkXCI6IFwiSG9yc2Vwb3dlclwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIHtcImZpZWxkXCI6IFwiTWlsZXNfcGVyX0dhbGxvblwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgIF0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdldCBhbGwgbm9uLWR1cGxpY2F0ZSBmaWVsZERlZnMgZnJvbSBhbGwgbGF5ZXIgaW4gYSBMYXllclNwZWMnLCBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBsYXllclNwZWM6IGFueSA9IHtcbiAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL3N0b2Nrcy5jc3ZcIixcImZvcm1hdFwiOiB7XCJ0eXBlXCI6IFwiY3N2XCJ9fSxcbiAgICAgIFwibGF5ZXJcIjogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIkdvb2dsZSdzIHN0b2NrIHByaWNlIG92ZXIgdGltZS5cIixcbiAgICAgICAgICBcIm1hcmtcIjogXCJsaW5lXCIsXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJHb29nbGUncyBzdG9jayBwcmljZSBvdmVyIHRpbWUuXCIsXG4gICAgICAgICAgXCJtYXJrXCI6IFwicG9pbnRcIixcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcImRhdGVcIixcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInByaWNlXCIsXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInN5bWJvbFwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImNvbmZpZ1wiOiB7XCJtYXJrXCI6IHtcImZpbGxlZFwiOiB0cnVlfX1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzPEZpZWxkRGVmPEZpZWxkPj4oZmllbGREZWZzKGxheWVyU3BlYyksIFtcbiAgICAgIHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgIHtcImZpZWxkXCI6IFwic3ltYm9sXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZXQgYWxsIG5vbi1kdXBsaWNhdGUgZmllbGREZWZzIGZyb20gYWxsIGxheWVyIGluIGEgTGF5ZXJTcGVjIChtZXJnaW5nIGR1cGxpY2F0ZSBmaWVsZHMgd2l0aCBkaWZmZXJlbnQgc2NhbGUgdHlwZXMpJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgbGF5ZXJTcGVjOiBhbnkgPSB7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9zdG9ja3MuY3N2XCIsXCJmb3JtYXRcIjoge1widHlwZVwiOiBcImNzdlwifX0sXG4gICAgICBcImxheWVyXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJHb29nbGUncyBzdG9jayBwcmljZSBvdmVyIHRpbWUuXCIsXG4gICAgICAgICAgXCJtYXJrXCI6IFwibGluZVwiLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiZGF0ZVwiLFwidHlwZVwiOiBcInRlbXBvcmFsXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiR29vZ2xlJ3Mgc3RvY2sgcHJpY2Ugb3ZlciB0aW1lLlwiLFxuICAgICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsXCJ0eXBlXCI6IFwidGVtcG9yYWxcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJwcmljZVwiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJkYXRlXCIsXCJ0eXBlXCI6IFwidGVtcG9yYWxcIiwgXCJzY2FsZVwiOiB7XCJ0eXBlXCI6IFwicG93XCJ9fVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1wibWFya1wiOiB7XCJmaWxsZWRcIjogdHJ1ZX19XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9O1xuXG4gICAgYXNzZXJ0LnNhbWVEZWVwTWVtYmVyczxGaWVsZERlZjxGaWVsZD4+KGZpZWxkRGVmcyhsYXllclNwZWMpLCBbXG4gICAgICB7XCJmaWVsZFwiOiBcImRhdGVcIixcInR5cGVcIjogXCJ0ZW1wb3JhbFwifSxcbiAgICAgIHtcImZpZWxkXCI6IFwicHJpY2VcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBnZXQgYWxsIG5vbi1kdXBsaWNhdGUgZmllbGREZWZzIGZyb20gZmFjZXQgYW5kIGxheWVyIGluIGEgRmFjZXRTcGVjJywgZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgZmFjZXRTcGVjOiBhbnkgPSB7XG4gICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9tb3ZpZXMuanNvblwifSxcbiAgICAgIFwiZmFjZXRcIjoge1wicm93XCI6IHtcImZpZWxkXCI6IFwiTVBBQV9SYXRpbmdcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9fSxcbiAgICAgIFwic3BlY1wiOiB7XG4gICAgICAgIFwibWFya1wiOiBcInBvaW50XCIsXG4gICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgIFwieFwiOiB7XCJmaWVsZFwiOiBcIldvcmxkd2lkZV9Hcm9zc1wiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJVU19EVkRfU2FsZXNcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzPEZpZWxkRGVmPEZpZWxkPj4oZmllbGREZWZzKGZhY2V0U3BlYyksIFtcbiAgICAgIHtcImZpZWxkXCI6IFwiTVBBQV9SYXRpbmdcIixcInR5cGVcIjogXCJvcmRpbmFsXCJ9LFxuICAgICAge1wiZmllbGRcIjogXCJXb3JsZHdpZGVfR3Jvc3NcIixcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICB7XCJmaWVsZFwiOiBcIlVTX0RWRF9TYWxlc1wiLFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifVxuICAgIF0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/stack.test.d.ts b/build/test/stack.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/stack.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/stack.test.js b/build/test/stack.test.js new file mode 100644 index 0000000000..445972a08f --- /dev/null +++ b/build/test/stack.test.js @@ -0,0 +1,470 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +/* tslint:disable:quotemark */ +var chai_1 = require("chai"); +var channel_1 = require("../src/channel"); +var log = tslib_1.__importStar(require("../src/log")); +var mark_1 = require("../src/mark"); +var scale_1 = require("../src/scale"); +var spec_1 = require("../src/spec"); +var stack_1 = require("../src/stack"); +var util_1 = require("../src/util"); +describe('stack', function () { + var NON_STACKABLE_MARKS = [mark_1.RECT]; + it('should be disabled for non-stackable marks with at least of of the stack channel', function () { + var _loop_1 = function (stacked) { + NON_STACKABLE_MARKS.forEach(function (nonStackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": nonStackableMark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_1(stacked); + } + }); + it('should be allowed for raw plot', function () { + stack_1.STACKABLE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "field": "yield", "type": "quantitative", "stack": "zero" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var stackProps = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(stackProps.fieldChannel, 'x'); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should prioritize axis with stack', function () { + stack_1.STACKABLE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "field": "yield", "type": "quantitative", "stack": "zero" }, + "y": { "field": "variety", "type": "quantitative" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var stackProps = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(stackProps.fieldChannel, 'x'); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should always be disabled if there is no stackby channel', function () { + var _loop_2 = function (stacked) { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_2(stacked); + } + }); + it('should always be disabled if the stackby channel is aggregated', function () { + var _loop_3 = function (stacked) { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "aggregate": "count", "type": "quantitative" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_3(stacked); + } + }); + it('should always be disabled if the stackby channel is identical to y', function () { + var _loop_4 = function (stacked) { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "variety", "type": "nominal" }, + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_4(stacked); + } + }); + it('can enabled if one of the stackby channels is not aggregated', function () { + var _loop_5 = function (stacked) { + var marks = stacked === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "aggregate": "count", "type": "quantitative" }, + "detail": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, spec.config.stack); + chai_1.assert.isOk(_stack); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + chai_1.assert.equal(_stack.stackBy[0].channel, channel_1.DETAIL); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_5(stacked); + } + }); + it('can enabled if one of the stackby channels is not aggregated', function () { + var _loop_6 = function (stacked) { + var marks = stacked === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative", "stack": stacked }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "aggregate": "count", "type": "quantitative" }, + "detail": { "field": "site", "type": "nominal" } + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.isOk(_stack); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + chai_1.assert.equal(_stack.stackBy[0].channel, channel_1.DETAIL); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_6(stacked); + } + }); + it('should always be disabled if both x and y are aggregate', function () { + var _loop_7 = function (stacked) { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "aggregate": "count", "type": "quantitative" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_7(stacked); + } + }); + it('should always be disabled if neither x nor y is aggregate or stack', function () { + var _loop_8 = function (stacked) { + mark_1.PRIMITIVE_MARKS.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "field": "variety", "type": "nominal" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize', null, 'none']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_8(stacked); + } + }); + it('should always be disabled if there is both x and x2', log.wrap(function (localLogger) { + var _loop_9 = function (stacked) { + var marks = stacked === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "mark": mark, + "encoding": { + "x": { "field": "a", "type": "quantitative", "aggregate": "sum" }, + "x2": { "field": "a", "type": "quantitative", "aggregate": "sum" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.cannotStackRangedMark(channel_1.X), util_1.stringify({ stacked: stacked, mark: mark })); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_9(stacked); + } + })); + it('should always be disabled if there is both y and y2', log.wrap(function (localLogger) { + var _loop_10 = function (stacked) { + var marks = stacked === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "mark": mark, + "encoding": { + "y": { "field": "a", "type": "quantitative", "aggregate": "sum" }, + "y2": { "field": "a", "type": "quantitative", "aggregate": "sum" }, + "x": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isFalse(spec_1.isStacked(spec)); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.cannotStackRangedMark(channel_1.Y), util_1.stringify({ stacked: stacked, mark: mark })); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_10(stacked); + } + })); + it('should always be warned if the aggregated axis has non-linear scale', log.wrap(function (localLogger) { + var _loop_11 = function (stacked) { + [scale_1.ScaleType.LOG, scale_1.ScaleType.POW, scale_1.ScaleType.SQRT].forEach(function (scaleType) { + var marks = stacked === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { "field": "a", "type": "quantitative", "aggregate": "sum", "scale": { "type": scaleType } }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.isNotNull(stack_1.stack(spec.mark, spec.encoding, spec.config.stack)); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.cannotStackNonLinearScale(scaleType)); + }); + }); + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_11(stacked); + } + })); + it('should throws warning if the aggregated axis has a non-summative aggregate', log.wrap(function (localLogger) { + var _loop_12 = function (stackOffset) { + var _loop_13 = function (aggregate) { + var marks = stackOffset === undefined ? stack_1.STACK_BY_DEFAULT_MARKS : stack_1.STACKABLE_MARKS; + marks.forEach(function (mark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": mark, + "encoding": { + "x": { + aggregate: aggregate, + stack: stackOffset, + "field": "a", + "type": "quantitative" + }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + } + }; + chai_1.assert.isTrue(spec_1.isStacked(spec)); + var warns = localLogger.warns; + chai_1.assert.equal(warns[warns.length - 1], log.message.stackNonSummativeAggregate(aggregate)); + }); + }; + for (var _i = 0, _a = ['average', 'variance', 'q3']; _i < _a.length; _i++) { + var aggregate = _a[_i]; + _loop_13(aggregate); + } + }; + for (var _i = 0, _a = [undefined, 'center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stackOffset = _a[_i]; + _loop_12(stackOffset); + } + })); + describe('stack().groupbyChannel, .fieldChannel', function () { + it('should be correct for horizontal', function () { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(_stack.fieldChannel, channel_1.X); + chai_1.assert.equal(_stack.groupbyChannel, channel_1.Y); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should be correct for horizontal (single)', function () { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(_stack.fieldChannel, channel_1.X); + chai_1.assert.equal(_stack.groupbyChannel, null); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should be correct for vertical', function () { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "y": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "x": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(_stack.fieldChannel, channel_1.Y); + chai_1.assert.equal(_stack.groupbyChannel, channel_1.X); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should be correct for vertical (single)', function () { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "y": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "color": { "field": "site", "type": "nominal" } + } + }; + var _stack = stack_1.stack(spec.mark, spec.encoding, undefined); + chai_1.assert.equal(_stack.fieldChannel, channel_1.Y); + chai_1.assert.equal(_stack.groupbyChannel, null); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + }); + describe('stack().offset', function () { + it('should be zero for stackable marks with at least of of the stack channel if stacked is unspecified', function () { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + } + }; + chai_1.assert.equal(stack_1.stack(spec.mark, spec.encoding, undefined).offset, 'zero'); + chai_1.assert.isTrue(spec_1.isStacked(spec)); + }); + }); + it('should be the specified stacked for stackable marks with at least one of the stack channel', function () { + var _loop_14 = function (stacked) { + [mark_1.BAR, mark_1.AREA].forEach(function (stackableMark) { + var spec = { + "data": { "url": "data/barley.json" }, + "mark": stackableMark, + "encoding": { + "x": { "aggregate": "sum", "field": "yield", "type": "quantitative" }, + "y": { "field": "variety", "type": "nominal" }, + "color": { "field": "site", "type": "nominal" } + }, + "config": { + "stack": stacked + } + }; + chai_1.assert.equal(stack_1.stack(spec.mark, spec.encoding, spec.config.stack).offset, stacked); + chai_1.assert.equal(spec_1.isStacked(spec), true); + }); + }; + for (var _i = 0, _a = ['center', 'zero', 'normalize']; _i < _a.length; _i++) { + var stacked = _a[_i]; + _loop_14(stacked); + } + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2sudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3Qvc3RhY2sudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw4QkFBOEI7QUFDOUIsNkJBQTRCO0FBRzVCLDBDQUE0QztBQUM1QyxzREFBa0M7QUFDbEMsb0NBQTZEO0FBQzdELHNDQUF1QztBQUN2QyxvQ0FBb0U7QUFDcEUsc0NBQXlGO0FBQ3pGLG9DQUFzQztBQUd0QyxRQUFRLENBQUMsT0FBTyxFQUFFO0lBQ2hCLElBQU0sbUJBQW1CLEdBQUcsQ0FBQyxXQUFJLENBQUMsQ0FBQztJQUVuQyxFQUFFLENBQUMsa0ZBQWtGLEVBQUU7Z0NBQzFFLE9BQU87WUFDaEIsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFVBQUMsZ0JBQWdCO2dCQUMzQyxJQUFNLElBQUksR0FBaUM7b0JBQ3pDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxrQkFBa0IsRUFBQztvQkFDbkMsTUFBTSxFQUFFLGdCQUFnQjtvQkFDeEIsVUFBVSxFQUFFO3dCQUNWLEdBQUcsRUFBRSxFQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFDO3dCQUNuRSxHQUFHLEVBQUUsRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUM7d0JBQzVDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQztxQkFDOUM7b0JBQ0QsUUFBUSxFQUFFO3dCQUNSLE9BQU8sRUFBRSxPQUFPO3FCQUNqQjtpQkFDRixDQUFDO2dCQUNGLGFBQU0sQ0FBQyxNQUFNLENBQUMsYUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLGFBQU0sQ0FBQyxPQUFPLENBQUMs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NEJBQ25FLEdBQUcsRUFBRSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQzs0QkFDNUMsT0FBTyxFQUFFLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDO3lCQUM5Qzt3QkFDRCxRQUFRLEVBQUU7NEJBQ1IsT0FBTyxFQUFFLE9BQU87eUJBQ2pCO3FCQUNGLENBQUM7b0JBQ0YsYUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNqRixhQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQWpCRCxLQUFzQixVQUFnRCxFQUFoRCxLQUFBLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQWtCLEVBQWhELGNBQWdELEVBQWhELElBQWdEO2dCQUFqRSxJQUFNLE9BQU8sU0FBQTt5QkFBUCxPQUFPO2FBaUJqQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlOnF1b3RlbWFyayAqL1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5cbmltcG9ydCB7REVUQUlMLCBYLCBZfSBmcm9tICcuLi9zcmMvY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vc3JjL2xvZyc7XG5pbXBvcnQge0FSRUEsIEJBUiwgUFJJTUlUSVZFX01BUktTLCBSRUNUfSBmcm9tICcuLi9zcmMvbWFyayc7XG5pbXBvcnQge1NjYWxlVHlwZX0gZnJvbSAnLi4vc3JjL3NjYWxlJztcbmltcG9ydCB7aXNTdGFja2VkLCBOb3JtYWxpemVkVW5pdFNwZWMsIFRvcExldmVsfSBmcm9tICcuLi9zcmMvc3BlYyc7XG5pbXBvcnQge3N0YWNrLCBTVEFDS19CWV9ERUZBVUxUX01BUktTLCBTVEFDS0FCTEVfTUFSS1MsIFN0YWNrT2Zmc2V0fSBmcm9tICcuLi9zcmMvc3RhY2snO1xuaW1wb3J0IHtzdHJpbmdpZnl9IGZyb20gJy4uL3NyYy91dGlsJztcblxuXG5kZXNjcmliZSgnc3RhY2snLCAoKSA9PiB7XG4gIGNvbnN0IE5PTl9TVEFDS0FCTEVfTUFSS1MgPSBbUkVDVF07XG5cbiAgaXQoJ3Nob3VsZCBiZSBkaXNhYmxlZCBmb3Igbm9uLXN0YWNrYWJsZSBtYXJrcyB3aXRoIGF0IGxlYXN0IG9mIG9mIHRoZSBzdGFjayBjaGFubmVsJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhY2tlZCBvZiBbdW5kZWZpbmVkLCAnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJywgbnVsbCwgJ25vbmUnXSBhcyBTdGFja09mZnNldFtdKSB7XG4gICAgICBOT05fU1RBQ0tBQkxFX01BUktTLmZvckVhY2goKG5vblN0YWNrYWJsZU1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgICBcIm1hcmtcIjogbm9uU3RhY2thYmxlTWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInlpZWxkXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwic3RhY2tcIjogc3RhY2tlZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0LmlzTnVsbChzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHNwZWMuY29uZmlnLnN0YWNrKSk7XG4gICAgICAgIGFzc2VydC5pc0ZhbHNlKGlzU3RhY2tlZChzcGVjKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYmUgYWxsb3dlZCBmb3IgcmF3IHBsb3QnLCAoKSA9PiB7XG4gICAgU1RBQ0tBQkxFX01BUktTLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic3RhY2tcIjogXCJ6ZXJvXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjb25zdCBzdGFja1Byb3BzID0gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCB1bmRlZmluZWQpO1xuICAgICAgYXNzZXJ0LmVxdWFsKHN0YWNrUHJvcHMuZmllbGRDaGFubmVsLCAneCcpO1xuICAgICAgYXNzZXJ0LmlzVHJ1ZShpc1N0YWNrZWQoc3BlYykpO1xuICAgIH0pO1xuICB9KTtcblxuXG4gIGl0KCdzaG91bGQgcHJpb3JpdGl6ZSBheGlzIHdpdGggc3RhY2snLCAoKSA9PiB7XG4gICAgU1RBQ0tBQkxFX01BUktTLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwic3RhY2tcIjogXCJ6ZXJvXCJ9LFxuICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHN0YWNrUHJvcHMgPSBzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHVuZGVmaW5lZCk7XG4gICAgICBhc3NlcnQuZXF1YWwoc3RhY2tQcm9wcy5maWVsZENoYW5uZWwsICd4Jyk7XG4gICAgICBhc3NlcnQuaXNUcnVlKGlzU3RhY2tlZChzcGVjKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWx3YXlzIGJlIGRpc2FibGVkIGlmIHRoZXJlIGlzIG5vIHN0YWNrYnkgY2hhbm5lbCcsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IHN0YWNrZWQgb2YgW3VuZGVmaW5lZCwgJ2NlbnRlcicsICd6ZXJvJywgJ25vcm1hbGl6ZScsIG51bGwsICdub25lJ10gYXMgU3RhY2tPZmZzZXRbXSkge1xuICAgICAgUFJJTUlUSVZFX01BUktTLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInlpZWxkXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgICAgXCJzdGFja1wiOiBzdGFja2VkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuaXNOdWxsKHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgc3BlYy5jb25maWcuc3RhY2spKTtcbiAgICAgICAgYXNzZXJ0LmlzRmFsc2UoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbHdheXMgYmUgZGlzYWJsZWQgaWYgdGhlIHN0YWNrYnkgY2hhbm5lbCBpcyBhZ2dyZWdhdGVkJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhY2tlZCBvZiBbdW5kZWZpbmVkLCAnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJywgbnVsbCwgJ25vbmUnXSBhcyBTdGFja09mZnNldFtdKSB7XG4gICAgICBQUklNSVRJVkVfTUFSS1MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+ID0ge1xuICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICAgIFwibWFya1wiOiBtYXJrLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwidmFyaWV0eVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwic3RhY2tcIjogc3RhY2tlZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXNzZXJ0LmlzTnVsbChzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHNwZWMuY29uZmlnLnN0YWNrKSk7XG4gICAgICAgIGFzc2VydC5pc0ZhbHNlKGlzU3RhY2tlZChzcGVjKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYWx3YXlzIGJlIGRpc2FibGVkIGlmIHRoZSBzdGFja2J5IGNoYW5uZWwgaXMgaWRlbnRpY2FsIHRvIHknLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzdGFja2VkIG9mIFt1bmRlZmluZWQsICdjZW50ZXInLCAnemVybycsICdub3JtYWxpemUnLCBudWxsLCAnbm9uZSddIGFzIFN0YWNrT2Zmc2V0W10pIHtcbiAgICAgIFBSSU1JVElWRV9NQVJLUy5mb3JFYWNoKChtYXJrKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgXCJtYXJrXCI6IG1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwidmFyaWV0eVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgICAgXCJzdGFja1wiOiBzdGFja2VkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuaXNOdWxsKHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgc3BlYy5jb25maWcuc3RhY2spKTtcbiAgICAgICAgYXNzZXJ0LmlzRmFsc2UoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ2NhbiBlbmFibGVkIGlmIG9uZSBvZiB0aGUgc3RhY2tieSBjaGFubmVscyBpcyBub3QgYWdncmVnYXRlZCcsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IHN0YWNrZWQgb2YgW3VuZGVmaW5lZCwgJ2NlbnRlcicsICd6ZXJvJywgJ25vcm1hbGl6ZSddIGFzIFN0YWNrT2Zmc2V0W10pIHtcbiAgICAgIGNvbnN0IG1hcmtzID0gc3RhY2tlZCA9PT0gdW5kZWZpbmVkID8gU1RBQ0tfQllfREVGQVVMVF9NQVJLUyA6IFNUQUNLQUJMRV9NQVJLUztcbiAgICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInlpZWxkXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1wiYWdncmVnYXRlXCI6IFwiY291bnRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJkZXRhaWxcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiY29uZmlnXCI6IHtcbiAgICAgICAgICAgIFwic3RhY2tcIjogc3RhY2tlZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgX3N0YWNrID0gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCBzcGVjLmNvbmZpZy5zdGFjayk7XG4gICAgICAgIGFzc2VydC5pc09rKF9zdGFjayk7XG4gICAgICAgIGFzc2VydC5pc1RydWUoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKF9zdGFjay5zdGFja0J5WzBdLmNoYW5uZWwsIERFVEFJTCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGl0KCdjYW4gZW5hYmxlZCBpZiBvbmUgb2YgdGhlIHN0YWNrYnkgY2hhbm5lbHMgaXMgbm90IGFnZ3JlZ2F0ZWQnLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCBzdGFja2VkIG9mIFt1bmRlZmluZWQsICdjZW50ZXInLCAnemVybycsICdub3JtYWxpemUnXSBhcyBTdGFja09mZnNldFtdKSB7XG4gICAgICBjb25zdCBtYXJrcyA9IHN0YWNrZWQgPT09IHVuZGVmaW5lZCA/IFNUQUNLX0JZX0RFRkFVTFRfTUFSS1MgOiBTVEFDS0FCTEVfTUFSS1M7XG4gICAgICBtYXJrcy5mb3JFYWNoKChtYXJrKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgXCJtYXJrXCI6IG1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJzdGFja1wiOiBzdGFja2VkfSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcInZhcmlldHlcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1wiYWdncmVnYXRlXCI6IFwiY291bnRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJkZXRhaWxcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgX3N0YWNrID0gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCB1bmRlZmluZWQpO1xuICAgICAgICBhc3NlcnQuaXNPayhfc3RhY2spO1xuICAgICAgICBhc3NlcnQuaXNUcnVlKGlzU3RhY2tlZChzcGVjKSk7XG4gICAgICAgIGFzc2VydC5lcXVhbChfc3RhY2suc3RhY2tCeVswXS5jaGFubmVsLCBERVRBSUwpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsd2F5cyBiZSBkaXNhYmxlZCBpZiBib3RoIHggYW5kIHkgYXJlIGFnZ3JlZ2F0ZScsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IHN0YWNrZWQgb2YgW3VuZGVmaW5lZCwgJ2NlbnRlcicsICd6ZXJvJywgJ25vcm1hbGl6ZScsIG51bGwsICdub25lJ10gYXMgU3RhY2tPZmZzZXRbXSkge1xuICAgICAgUFJJTUlUSVZFX01BUktTLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieFwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInlpZWxkXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJjb3VudFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgICAgICBcInN0YWNrXCI6IHN0YWNrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydC5pc051bGwoc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCBzcGVjLmNvbmZpZy5zdGFjaykpO1xuICAgICAgICBhc3NlcnQuaXNGYWxzZShpc1N0YWNrZWQoc3BlYykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBpdCgnc2hvdWxkIGFsd2F5cyBiZSBkaXNhYmxlZCBpZiBuZWl0aGVyIHggbm9yIHkgaXMgYWdncmVnYXRlIG9yIHN0YWNrJywgKCkgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhY2tlZCBvZiBbdW5kZWZpbmVkLCAnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJywgbnVsbCwgJ25vbmUnXSBhcyBTdGFja09mZnNldFtdKSB7XG4gICAgICBQUklNSVRJVkVfTUFSS1MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+ID0ge1xuICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICAgIFwibWFya1wiOiBtYXJrLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwidmFyaWV0eVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgXCJ5XCI6IHtcImZpZWxkXCI6IFwidmFyaWV0eVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInNpdGVcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgICAgXCJzdGFja1wiOiBzdGFja2VkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuaXNOdWxsKHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgc3BlYy5jb25maWcuc3RhY2spKTtcbiAgICAgICAgYXNzZXJ0LmlzRmFsc2UoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBhbHdheXMgYmUgZGlzYWJsZWQgaWYgdGhlcmUgaXMgYm90aCB4IGFuZCB4MicsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhY2tlZCBvZiBbdW5kZWZpbmVkLCAnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJ10gYXMgU3RhY2tPZmZzZXRbXSkge1xuICAgICAgY29uc3QgbWFya3MgPSBzdGFja2VkID09PSB1bmRlZmluZWQgPyBTVEFDS19CWV9ERUZBVUxUX01BUktTIDogU1RBQ0tBQkxFX01BUktTO1xuICAgICAgbWFya3MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+ID0ge1xuICAgICAgICAgIFwibWFya1wiOiBtYXJrLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn0sXG4gICAgICAgICAgICBcIngyXCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgICAgICBcInN0YWNrXCI6IHN0YWNrZWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGFzc2VydC5pc051bGwoc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCBzcGVjLmNvbmZpZy5zdGFjaykpO1xuICAgICAgICBhc3NlcnQuaXNGYWxzZShpc1N0YWNrZWQoc3BlYykpO1xuICAgICAgICBjb25zdCB3YXJucyA9IGxvY2FsTG9nZ2VyLndhcm5zO1xuICAgICAgICBhc3NlcnQuZXF1YWwod2FybnNbd2FybnMubGVuZ3RoLTFdLCBsb2cubWVzc2FnZS5jYW5ub3RTdGFja1JhbmdlZE1hcmsoWCksXG4gICAgICAgICAgc3RyaW5naWZ5KHtzdGFja2VkOiBzdGFja2VkLCBtYXJrOiBtYXJrfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSkpO1xuXG4gIGl0KCdzaG91bGQgYWx3YXlzIGJlIGRpc2FibGVkIGlmIHRoZXJlIGlzIGJvdGggeSBhbmQgeTInLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICBmb3IgKGNvbnN0IHN0YWNrZWQgb2YgW3VuZGVmaW5lZCwgJ2NlbnRlcicsICd6ZXJvJywgJ25vcm1hbGl6ZSddIGFzIFN0YWNrT2Zmc2V0W10pIHtcbiAgICAgIGNvbnN0IG1hcmtzID0gc3RhY2tlZCA9PT0gdW5kZWZpbmVkID8gU1RBQ0tfQllfREVGQVVMVF9NQVJLUyA6IFNUQUNLQUJMRV9NQVJLUztcbiAgICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieVwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9LFxuICAgICAgICAgICAgXCJ5MlwiOiB7XCJmaWVsZFwiOiBcImFcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCIsIFwiYWdncmVnYXRlXCI6IFwic3VtXCJ9LFxuICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwidmFyaWV0eVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInNpdGVcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJjb25maWdcIjoge1xuICAgICAgICAgICAgXCJzdGFja1wiOiBzdGFja2VkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuaXNOdWxsKHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgc3BlYy5jb25maWcuc3RhY2spKTtcbiAgICAgICAgYXNzZXJ0LmlzRmFsc2UoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgICAgY29uc3Qgd2FybnMgPSBsb2NhbExvZ2dlci53YXJucztcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHdhcm5zW3dhcm5zLmxlbmd0aC0xXSwgbG9nLm1lc3NhZ2UuY2Fubm90U3RhY2tSYW5nZWRNYXJrKFkpLFxuICAgICAgICAgIHN0cmluZ2lmeSh7c3RhY2tlZDogc3RhY2tlZCwgbWFyazogbWFya30pXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKTtcblxuICBpdCgnc2hvdWxkIGFsd2F5cyBiZSB3YXJuZWQgaWYgdGhlIGFnZ3JlZ2F0ZWQgYXhpcyBoYXMgbm9uLWxpbmVhciBzY2FsZScsIGxvZy53cmFwKChsb2NhbExvZ2dlcikgPT4ge1xuICAgIGZvciAoY29uc3Qgc3RhY2tlZCBvZiBbdW5kZWZpbmVkLCAnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJ10gYXMgU3RhY2tPZmZzZXRbXSkge1xuICAgICAgW1NjYWxlVHlwZS5MT0csIFNjYWxlVHlwZS5QT1csIFNjYWxlVHlwZS5TUVJUXS5mb3JFYWNoKChzY2FsZVR5cGUpID0+IHtcbiAgICAgICAgY29uc3QgbWFya3MgPSBzdGFja2VkID09PSB1bmRlZmluZWQgPyBTVEFDS19CWV9ERUZBVUxUX01BUktTIDogU1RBQ0tBQkxFX01BUktTO1xuICAgICAgICBtYXJrcy5mb3JFYWNoKChtYXJrKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IG1hcmssXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImZpZWxkXCI6IFwiYVwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIiwgXCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJzY2FsZVwiOiB7XCJ0eXBlXCI6IHNjYWxlVHlwZX19LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgICAgICAgIFwic3RhY2tcIjogc3RhY2tlZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgYXNzZXJ0LmlzTm90TnVsbChzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHNwZWMuY29uZmlnLnN0YWNrKSk7XG4gICAgICAgICAgYXNzZXJ0LmlzVHJ1ZShpc1N0YWNrZWQoc3BlYykpO1xuICAgICAgICAgIGNvbnN0IHdhcm5zID0gbG9jYWxMb2dnZXIud2FybnM7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKHdhcm5zW3dhcm5zLmxlbmd0aC0xXSwgbG9nLm1lc3NhZ2UuY2Fubm90U3RhY2tOb25MaW5lYXJTY2FsZShzY2FsZVR5cGUpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pKTtcblxuICBpdCgnc2hvdWxkIHRocm93cyB3YXJuaW5nIGlmIHRoZSBhZ2dyZWdhdGVkIGF4aXMgaGFzIGEgbm9uLXN1bW1hdGl2ZSBhZ2dyZWdhdGUnLCBsb2cud3JhcCgobG9jYWxMb2dnZXIpID0+IHtcbiAgICBmb3IgKGNvbnN0IHN0YWNrT2Zmc2V0IG9mIFt1bmRlZmluZWQsICdjZW50ZXInLCAnemVybycsICdub3JtYWxpemUnXSBhcyBTdGFja09mZnNldFtdKSB7XG4gICAgICBmb3IgKGNvbnN0IGFnZ3JlZ2F0ZSBvZiBbJ2F2ZXJhZ2UnLCAndmFyaWFuY2UnLCAncTMnXSBhcyBBZ2dyZWdhdGVPcFtdKSB7XG4gICAgICAgIGNvbnN0IG1hcmtzID0gc3RhY2tPZmZzZXQgPT09IHVuZGVmaW5lZCA/IFNUQUNLX0JZX0RFRkFVTFRfTUFSS1MgOiBTVEFDS0FCTEVfTUFSS1M7XG4gICAgICAgIG1hcmtzLmZvckVhY2goKG1hcmspID0+IHtcbiAgICAgICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+ID0ge1xuICAgICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgICBcIm1hcmtcIjogbWFyayxcbiAgICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgICBcInhcIjoge1xuICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZSxcbiAgICAgICAgICAgICAgICBzdGFjazogc3RhY2tPZmZzZXQsXG4gICAgICAgICAgICAgICAgXCJmaWVsZFwiOiBcImFcIixcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGFzc2VydC5pc1RydWUoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgICAgICBjb25zdCB3YXJucyA9IGxvY2FsTG9nZ2VyLndhcm5zO1xuICAgICAgICAgIGFzc2VydC5lcXVhbCh3YXJuc1t3YXJucy5sZW5ndGgtMV0sIGxvZy5tZXNzYWdlLnN0YWNrTm9uU3VtbWF0aXZlQWdncmVnYXRlKGFnZ3JlZ2F0ZSkpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pKTtcblxuICBkZXNjcmliZSgnc3RhY2soKS5ncm91cGJ5Q2hhbm5lbCwgLmZpZWxkQ2hhbm5lbCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIGNvcnJlY3QgZm9yIGhvcml6b250YWwnLCAoKSA9PiB7XG4gICAgICBbQkFSLCBBUkVBXS5mb3JFYWNoKChzdGFja2FibGVNYXJrKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgXCJtYXJrXCI6IHN0YWNrYWJsZU1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBfc3RhY2sgPSBzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHVuZGVmaW5lZCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChfc3RhY2suZmllbGRDaGFubmVsLCBYKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKF9zdGFjay5ncm91cGJ5Q2hhbm5lbCwgWSk7XG4gICAgICAgIGFzc2VydC5pc1RydWUoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBjb3JyZWN0IGZvciBob3Jpem9udGFsIChzaW5nbGUpJywgKCkgPT4ge1xuICAgICAgW0JBUiwgQVJFQV0uZm9yRWFjaCgoc3RhY2thYmxlTWFyaykgPT4ge1xuICAgICAgICBjb25zdCBzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+ID0ge1xuICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICAgIFwibWFya1wiOiBzdGFja2FibGVNYXJrLFxuICAgICAgICAgIFwiZW5jb2RpbmdcIjoge1xuICAgICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgXCJjb2xvclwiOiB7XCJmaWVsZFwiOiBcInNpdGVcIiwgXCJ0eXBlXCI6IFwibm9taW5hbFwifVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgX3N0YWNrID0gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCB1bmRlZmluZWQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoX3N0YWNrLmZpZWxkQ2hhbm5lbCwgWCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChfc3RhY2suZ3JvdXBieUNoYW5uZWwsIG51bGwpO1xuICAgICAgICBhc3NlcnQuaXNUcnVlKGlzU3RhY2tlZChzcGVjKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgYmUgY29ycmVjdCBmb3IgdmVydGljYWwnLCAoKSA9PiB7XG4gICAgICBbQkFSLCBBUkVBXS5mb3JFYWNoKChzdGFja2FibGVNYXJrKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgXCJtYXJrXCI6IHN0YWNrYWJsZU1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInlcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICBcInhcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBfc3RhY2sgPSBzdGFjayhzcGVjLm1hcmssIHNwZWMuZW5jb2RpbmcsIHVuZGVmaW5lZCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChfc3RhY2suZmllbGRDaGFubmVsLCBZKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKF9zdGFjay5ncm91cGJ5Q2hhbm5lbCwgWCk7XG4gICAgICAgIGFzc2VydC5pc1RydWUoaXNTdGFja2VkKHNwZWMpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBiZSBjb3JyZWN0IGZvciB2ZXJ0aWNhbCAoc2luZ2xlKScsICgpID0+IHtcbiAgICAgIFtCQVIsIEFSRUFdLmZvckVhY2goKHN0YWNrYWJsZU1hcmspID0+IHtcbiAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICBcImRhdGFcIjoge1widXJsXCI6IFwiZGF0YS9iYXJsZXkuanNvblwifSxcbiAgICAgICAgICBcIm1hcmtcIjogc3RhY2thYmxlTWFyayxcbiAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgIFwieVwiOiB7XCJhZ2dyZWdhdGVcIjogXCJzdW1cIiwgXCJmaWVsZFwiOiBcInlpZWxkXCIsIFwidHlwZVwiOiBcInF1YW50aXRhdGl2ZVwifSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IF9zdGFjayA9IHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgdW5kZWZpbmVkKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKF9zdGFjay5maWVsZENoYW5uZWwsIFkpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoX3N0YWNrLmdyb3VwYnlDaGFubmVsLCBudWxsKTtcbiAgICAgICAgYXNzZXJ0LmlzVHJ1ZShpc1N0YWNrZWQoc3BlYykpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdGFjaygpLm9mZnNldCcsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIGJlIHplcm8gZm9yIHN0YWNrYWJsZSBtYXJrcyB3aXRoIGF0IGxlYXN0IG9mIG9mIHRoZSBzdGFjayBjaGFubmVsIGlmIHN0YWNrZWQgaXMgdW5zcGVjaWZpZWQnLCAoKSA9PiB7XG4gICAgICBbQkFSLCBBUkVBXS5mb3JFYWNoKChzdGFja2FibGVNYXJrKSA9PiB7XG4gICAgICAgIGNvbnN0IHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4gPSB7XG4gICAgICAgICAgXCJkYXRhXCI6IHtcInVybFwiOiBcImRhdGEvYmFybGV5Lmpzb25cIn0sXG4gICAgICAgICAgXCJtYXJrXCI6IHN0YWNrYWJsZU1hcmssXG4gICAgICAgICAgXCJlbmNvZGluZ1wiOiB7XG4gICAgICAgICAgICBcInhcIjoge1wiYWdncmVnYXRlXCI6IFwic3VtXCIsIFwiZmllbGRcIjogXCJ5aWVsZFwiLCBcInR5cGVcIjogXCJxdWFudGl0YXRpdmVcIn0sXG4gICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICBcImNvbG9yXCI6IHtcImZpZWxkXCI6IFwic2l0ZVwiLCBcInR5cGVcIjogXCJub21pbmFsXCJ9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBhc3NlcnQuZXF1YWwoc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLCB1bmRlZmluZWQpLm9mZnNldCwgJ3plcm8nKTtcbiAgICAgICAgYXNzZXJ0LmlzVHJ1ZShpc1N0YWNrZWQoc3BlYykpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIHRoZSBzcGVjaWZpZWQgc3RhY2tlZCBmb3Igc3RhY2thYmxlIG1hcmtzIHdpdGggYXQgbGVhc3Qgb25lIG9mIHRoZSBzdGFjayBjaGFubmVsJywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBzdGFja2VkIG9mIFsnY2VudGVyJywgJ3plcm8nLCAnbm9ybWFsaXplJ10gYXMgU3RhY2tPZmZzZXRbXSkge1xuICAgICAgICBbQkFSLCBBUkVBXS5mb3JFYWNoKChzdGFja2FibGVNYXJrKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPiA9IHtcbiAgICAgICAgICAgIFwiZGF0YVwiOiB7XCJ1cmxcIjogXCJkYXRhL2JhcmxleS5qc29uXCJ9LFxuICAgICAgICAgICAgXCJtYXJrXCI6IHN0YWNrYWJsZU1hcmssXG4gICAgICAgICAgICBcImVuY29kaW5nXCI6IHtcbiAgICAgICAgICAgICAgXCJ4XCI6IHtcImFnZ3JlZ2F0ZVwiOiBcInN1bVwiLCBcImZpZWxkXCI6IFwieWllbGRcIiwgXCJ0eXBlXCI6IFwicXVhbnRpdGF0aXZlXCJ9LFxuICAgICAgICAgICAgICBcInlcIjoge1wiZmllbGRcIjogXCJ2YXJpZXR5XCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn0sXG4gICAgICAgICAgICAgIFwiY29sb3JcIjoge1wiZmllbGRcIjogXCJzaXRlXCIsIFwidHlwZVwiOiBcIm5vbWluYWxcIn1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNvbmZpZ1wiOiB7XG4gICAgICAgICAgICAgIFwic3RhY2tcIjogc3RhY2tlZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKHN0YWNrKHNwZWMubWFyaywgc3BlYy5lbmNvZGluZywgc3BlYy5jb25maWcuc3RhY2spLm9mZnNldCwgc3RhY2tlZCk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKGlzU3RhY2tlZChzcGVjKSwgdHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/timeunit.test.d.ts b/build/test/timeunit.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/timeunit.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/timeunit.test.js b/build/test/timeunit.test.js new file mode 100644 index 0000000000..3a324bec83 --- /dev/null +++ b/build/test/timeunit.test.js @@ -0,0 +1,153 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var timeunit_1 = require("../src/timeunit"); +describe('timeUnit', function () { + describe('containsTimeUnit', function () { + it('should return true for quarter given quarter', function () { + var fullTimeUnit = timeunit_1.TimeUnit.QUARTER; + var timeUnit = timeunit_1.TimeUnit.QUARTER; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), true); + }); + it('should return true for yearquarter given quarter', function () { + var fullTimeUnit = timeunit_1.TimeUnit.YEARQUARTER; + var timeUnit = timeunit_1.TimeUnit.QUARTER; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), true); + }); + it('should return true for SECONDS and MILLISECONDS given SECONDSMILLISECONDS', function () { + var fullTimeUnit = timeunit_1.TimeUnit.SECONDSMILLISECONDS; + var timeUnit = timeunit_1.TimeUnit.SECONDS; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), true); + }); + it('should return true for MILLISECONDS given SECONDSMILLISECONDS', function () { + var fullTimeUnit = timeunit_1.TimeUnit.SECONDSMILLISECONDS; + var timeUnit = timeunit_1.TimeUnit.MILLISECONDS; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), true); + }); + it('should return false for quarter given year', function () { + var fullTimeUnit = timeunit_1.TimeUnit.YEAR; + var timeUnit = timeunit_1.TimeUnit.QUARTER; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), false); + }); + it('should return false for SECONDS given MILLISECONDS', function () { + var fullTimeUnit = timeunit_1.TimeUnit.MILLISECONDS; + var timeUnit = timeunit_1.TimeUnit.SECONDS; + chai_1.assert.equal(timeunit_1.containsTimeUnit(fullTimeUnit, timeUnit), false); + }); + }); + describe('fieldExpr', function () { + it('should return correct field expression for YEARMONTHDATEHOURSMINUTESSECONDS', function () { + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS, 'x'), 'datetime(year(datum["x"]), month(datum["x"]), date(datum["x"]), hours(datum["x"]), minutes(datum["x"]), seconds(datum["x"]), 0)'); + }); + it('should return correct field expression for QUARTER', function () { + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.QUARTER, 'x'), 'datetime(0, (quarter(datum["x"])-1)*3, 1, 0, 0, 0, 0)'); + }); + it('should return correct field expression for DAY', function () { + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.DAY, 'x'), 'datetime(2006, 0, day(datum["x"])+1, 0, 0, 0, 0)'); + }); + it('should return correct field expression for MILLISECONDS', function () { + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.MILLISECONDS, 'x'), 'datetime(0, 0, 1, 0, 0, 0, milliseconds(datum["x"]))'); + }); + it('should return correct field expression with utc for MILLISECONDS', function () { + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.UTCQUARTER, 'x'), 'datetime(0, (utcquarter(datum["x"])-1)*3, 1, 0, 0, 0, 0)'); + chai_1.assert.equal(timeunit_1.fieldExpr(timeunit_1.TimeUnit.UTCMILLISECONDS, 'x'), 'datetime(0, 0, 1, 0, 0, 0, utcmilliseconds(datum["x"]))'); + }); + }); + describe('convert', function () { + it('should throw an error for the DAY timeunit', function () { + chai_1.assert.throws(function () { + timeunit_1.convert(timeunit_1.TimeUnit.DAY, new Date(2000, 11, 2, 23, 59, 59, 999)); + }, Error, 'Cannot convert to TimeUnits containing \'day\''); + }); + it('should return expected result for YEARQUARTER', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARQUARTER, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 9, 1, 0, 0, 0, 0).getTime()); + }); + it('should return expected result for UTCYEARQUARTER', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.UTCYEARQUARTER, new Date(Date.UTC(2000, 11, 2, 23, 59, 59, 999))); + chai_1.assert.equal(date.getTime(), new Date(Date.UTC(2000, 9, 1, 0, 0, 0, 0)).getTime()); + }); + it('should return expected result for YEARQUARTERMONTH', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARQUARTERMONTH, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 1, 0, 0, 0, 0).getTime()); + }); + it('should return expected result for YEARMONTH', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARMONTH, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 1, 0, 0, 0, 0).getTime()); + }); + it('should return expected result for UTCYEARMONTH', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.UTCYEARMONTH, new Date(Date.UTC(2000, 11, 2, 23, 59, 59, 999))); + chai_1.assert.equal(date.getTime(), new Date(Date.UTC(2000, 11, 1, 0, 0, 0, 0)).getTime()); + }); + it('should return expected result for UTCYEARMONTH', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.UTCYEAR, new Date(Date.UTC(2000, 11, 2, 23, 59, 59, 999))); + chai_1.assert.equal(date.getTime(), new Date(Date.UTC(2000, 0, 1, 0, 0, 0, 0)).getTime()); + }); + it('should return expected result for YEARMONTHDATE', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARMONTHDATE, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 2, 0, 0, 0, 0).getTime()); + }); + it('should return expected result for YEARMONTHDATEHOURS', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARMONTHDATEHOURS, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 2, 23, 0, 0, 0).getTime()); + }); + it('should return expected result for YEARMONTHDATEHOURSMINUTES', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARMONTHDATEHOURSMINUTES, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 2, 23, 59, 0, 0).getTime()); + }); + it('should return expected result for YEARMONTHDATEHOURSMINUTESSECONDS', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(2000, 11, 2, 23, 59, 59, 0).getTime()); + }); + it('should return expected result for QUARTERMONTH', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.QUARTERMONTH, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(1900, 11, 1, 0, 0, 0, 0).getTime()); + }); + it('should return expected result for HOURSMINUTES', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.HOURSMINUTES, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(1900, 0, 1, 23, 59, 0, 0).getTime()); + }); + it('should return expected result for HOURSMINUTESSECONDS', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.HOURSMINUTESSECONDS, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(1900, 0, 1, 23, 59, 59, 0).getTime()); + }); + it('should return expected result for MINUTESSECONDS', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.MINUTESSECONDS, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(1900, 0, 1, 0, 59, 59, 0).getTime()); + }); + it('should return expected result for SECONDSMILLISECONDS', function () { + var date = timeunit_1.convert(timeunit_1.TimeUnit.SECONDSMILLISECONDS, new Date(2000, 11, 2, 23, 59, 59, 999)); + chai_1.assert.equal(date.getTime(), new Date(1900, 0, 1, 0, 0, 59, 999).getTime()); + }); + }); + describe('template', function () { + it('should return correct template for YEARMONTHDATEHOURSMINUTESSECONDS', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS, 'datum.x', undefined, false), "timeFormat(datum.x, '%b %d, %Y %H:%M:%S')"); + }); + it('should return correct template for YEARMONTH (No comma)', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.YEARMONTH, 'datum.x', undefined, false), "timeFormat(datum.x, '%b %Y')"); + }); + it('should return correct template for DAY', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.DAY, 'datum.x', undefined, false), "timeFormat(datum.x, '%A')"); + }); + it('should return correct template for DAY (shortened)', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.DAY, 'datum.x', true, false), "timeFormat(datum.x, '%a')"); + }); + it('should return correct template for QUARTER', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.QUARTER, 'datum.x', undefined, false), "'Q' + quarter(datum.x)"); + }); + it('should return correct template for YEARQUARTER', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.YEARQUARTER, 'datum.x', undefined, false), "'Q' + quarter(datum.x) + ' ' + timeFormat(datum.x, '%Y')"); + }); + it('should return correct template for milliseconds', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.MILLISECONDS, 'datum.x', undefined, false), "timeFormat(datum.x, '%L')"); + }); + it('should return correct template for no timeUnit', function () { + chai_1.assert.equal(timeunit_1.formatExpression(undefined, 'datum.x', undefined, false), undefined); + }); + it('should return correct template for YEARMONTH (No comma) with utc scale', function () { + chai_1.assert.equal(timeunit_1.formatExpression(timeunit_1.TimeUnit.YEARMONTH, 'datum.x', undefined, true), "utcFormat(datum.x, '%b %Y')"); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdGltZXVuaXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE0QjtBQUM1Qiw0Q0FBaUc7QUFHakcsUUFBUSxDQUFDLFVBQVUsRUFBRTtJQUNuQixRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsRUFBRSxDQUFDLDhDQUE4QyxFQUFFO1lBQ2pELElBQU0sWUFBWSxHQUFHLG1CQUFRLENBQUMsT0FBTyxDQUFDO1lBQ3RDLElBQU0sUUFBUSxHQUFHLG1CQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2xDLGFBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQWdCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGtEQUFrRCxFQUFFO1lBQ3JELElBQU0sWUFBWSxHQUFHLG1CQUFRLENBQUMsV0FBVyxDQUFDO1lBQzFDLElBQU0sUUFBUSxHQUFHLG1CQUFRLENBQUMsT0FBTyxDQUFDO1lBQ2xDLGFBQU0sQ0FBQyxLQUFLLENBQUMsMkJBQWdCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDJFQUEyRSxFQUFFO1lBQzlFLElBQU0sWUFBWSxHQUFHLG1CQUFRLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsSUFBTSxRQUFRLEdBQUcsbUJBQVEsQ0FBQyxPQUFPLENBQUM7WUFDbEMsYUFBTSxDQUFDLEtBQUssQ0FBQywyQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsK0RBQStELEVBQUU7WUFDbEUsSUFBTSxZQUFZLEdBQUcsbUJBQVEsQ0FBQyxtQkFBbUIs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QUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBTSxJQUFJLEdBQVMsa0JBQU8sQ0FBQyxtQkFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUU7WUFDbkQsSUFBTSxJQUFJLEdBQVMsa0JBQU8sQ0FBQyxtQkFBUSxDQUFDLFlBQVksRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzFGLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0UsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdURBQXVELEVBQUU7WUFDMUQsSUFBTSxJQUFJLEdBQVMsa0JBQU8sQ0FBQyxtQkFBUSxDQUFDLG1CQUFtQixFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcs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QUFDLEtBQUssQ0FDViwyQkFBZ0IsQ0FBQyxtQkFBUSxDQUFDLFdBQVcsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUNsRSwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELGFBQU0sQ0FBQyxLQUFLLENBQ1YsMkJBQWdCLENBQUMsbUJBQVEsQ0FBQyxZQUFZLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFDbkUsMkJBQTJCLENBQzVCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnREFBZ0QsRUFBRTtZQUNuRCxhQUFNLENBQUMsS0FBSyxDQUNWLDJCQUFnQixDQUFDLFNBQVMsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUN2RCxTQUFTLENBQ1YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHdFQUF3RSxFQUFFO1lBQzNFLGFBQU0sQ0FBQyxLQUFLLENBQ1YsMkJBQWdCLENBQUMsbUJBQVEsQ0FBQyxTQUFTLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFDL0QsNkJBQTZCLENBQzlCLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2Fzc2VydH0gZnJvbSAnY2hhaSc7XG5pbXBvcnQge2NvbnRhaW5zVGltZVVuaXQsIGNvbnZlcnQsIGZpZWxkRXhwciwgZm9ybWF0RXhwcmVzc2lvbiwgVGltZVVuaXR9IGZyb20gJy4uL3NyYy90aW1ldW5pdCc7XG5cblxuZGVzY3JpYmUoJ3RpbWVVbml0JywgKCkgPT4ge1xuICBkZXNjcmliZSgnY29udGFpbnNUaW1lVW5pdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciBxdWFydGVyIGdpdmVuIHF1YXJ0ZXInLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZ1bGxUaW1lVW5pdCA9IFRpbWVVbml0LlFVQVJURVI7XG4gICAgICBjb25zdCB0aW1lVW5pdCA9IFRpbWVVbml0LlFVQVJURVI7XG4gICAgICBhc3NlcnQuZXF1YWwoY29udGFpbnNUaW1lVW5pdChmdWxsVGltZVVuaXQsIHRpbWVVbml0KSwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiB0cnVlIGZvciB5ZWFycXVhcnRlciBnaXZlbiBxdWFydGVyJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBmdWxsVGltZVVuaXQgPSBUaW1lVW5pdC5ZRUFSUVVBUlRFUjtcbiAgICAgIGNvbnN0IHRpbWVVbml0ID0gVGltZVVuaXQuUVVBUlRFUjtcbiAgICAgIGFzc2VydC5lcXVhbChjb250YWluc1RpbWVVbml0KGZ1bGxUaW1lVW5pdCwgdGltZVVuaXQpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIFNFQ09ORFMgYW5kIE1JTExJU0VDT05EUyBnaXZlbiBTRUNPTkRTTUlMTElTRUNPTkRTJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBmdWxsVGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTTUlMTElTRUNPTkRTO1xuICAgICAgY29uc3QgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTO1xuICAgICAgYXNzZXJ0LmVxdWFsKGNvbnRhaW5zVGltZVVuaXQoZnVsbFRpbWVVbml0LCB0aW1lVW5pdCksIHRydWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdHJ1ZSBmb3IgTUlMTElTRUNPTkRTIGdpdmVuIFNFQ09ORFNNSUxMSVNFQ09ORFMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZ1bGxUaW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFNNSUxMSVNFQ09ORFM7XG4gICAgICBjb25zdCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUztcbiAgICAgIGFzc2VydC5lcXVhbChjb250YWluc1RpbWVVbml0KGZ1bGxUaW1lVW5pdCwgdGltZVVuaXQpLCB0cnVlKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBxdWFydGVyIGdpdmVuIHllYXInLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGZ1bGxUaW1lVW5pdCA9IFRpbWVVbml0LllFQVI7XG4gICAgICBjb25zdCB0aW1lVW5pdCA9IFRpbWVVbml0LlFVQVJURVI7XG4gICAgICBhc3NlcnQuZXF1YWwoY29udGFpbnNUaW1lVW5pdChmdWxsVGltZVVuaXQsIHRpbWVVbml0KSwgZmFsc2UpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZmFsc2UgZm9yIFNFQ09ORFMgZ2l2ZW4gTUlMTElTRUNPTkRTJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBmdWxsVGltZVVuaXQgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFM7XG4gICAgICBjb25zdCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFM7XG4gICAgICBhc3NlcnQuZXF1YWwoY29udGFpbnNUaW1lVW5pdChmdWxsVGltZVVuaXQsIHRpbWVVbml0KSwgZmFsc2UpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmllbGRFeHByJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgZmllbGQgZXhwcmVzc2lvbiBmb3IgWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU1NFQ09ORFMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGZpZWxkRXhwcihUaW1lVW5pdC5ZRUFSTU9OVEhEQVRFSE9VUlNNSU5VVEVTU0VDT05EUywgJ3gnKSxcbiAgICAgICAgJ2RhdGV0aW1lKHllYXIoZGF0dW1bXCJ4XCJdKSwgbW9udGgoZGF0dW1bXCJ4XCJdKSwgZGF0ZShkYXR1bVtcInhcIl0pLCBob3VycyhkYXR1bVtcInhcIl0pLCBtaW51dGVzKGRhdHVtW1wieFwiXSksIHNlY29uZHMoZGF0dW1bXCJ4XCJdKSwgMCknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBmaWVsZCBleHByZXNzaW9uIGZvciBRVUFSVEVSJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBmaWVsZEV4cHIoVGltZVVuaXQuUVVBUlRFUiwgJ3gnKSxcbiAgICAgICAgJ2RhdGV0aW1lKDAsIChxdWFydGVyKGRhdHVtW1wieFwiXSktMSkqMywgMSwgMCwgMCwgMCwgMCknXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBmaWVsZCBleHByZXNzaW9uIGZvciBEQVknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGZpZWxkRXhwcihUaW1lVW5pdC5EQVksICd4JyksXG4gICAgICAgICdkYXRldGltZSgyMDA2LCAwLCBkYXkoZGF0dW1bXCJ4XCJdKSsxLCAwLCAwLCAwLCAwKSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGZpZWxkIGV4cHJlc3Npb24gZm9yIE1JTExJU0VDT05EUycsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZmllbGRFeHByKFRpbWVVbml0Lk1JTExJU0VDT05EUywgJ3gnKSxcbiAgICAgICAgJ2RhdGV0aW1lKDAsIDAsIDEsIDAsIDAsIDAsIG1pbGxpc2Vjb25kcyhkYXR1bVtcInhcIl0pKSdcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGZpZWxkIGV4cHJlc3Npb24gd2l0aCB1dGMgZm9yIE1JTExJU0VDT05EUycsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZmllbGRFeHByKFRpbWVVbml0LlVUQ1FVQVJURVIsICd4JyksXG4gICAgICAgICdkYXRldGltZSgwLCAodXRjcXVhcnRlcihkYXR1bVtcInhcIl0pLTEpKjMsIDEsIDAsIDAsIDAsIDApJ1xuICAgICAgKTtcblxuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBmaWVsZEV4cHIoVGltZVVuaXQuVVRDTUlMTElTRUNPTkRTLCAneCcpLFxuICAgICAgICAnZGF0ZXRpbWUoMCwgMCwgMSwgMCwgMCwgMCwgdXRjbWlsbGlzZWNvbmRzKGRhdHVtW1wieFwiXSkpJ1xuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2NvbnZlcnQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciBmb3IgdGhlIERBWSB0aW1ldW5pdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LnRocm93cyhmdW5jdGlvbigpIHtcbiAgICAgICAgY29udmVydChUaW1lVW5pdC5EQVksIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKTtcbiAgICAgIH0sIEVycm9yLCAnQ2Fubm90IGNvbnZlcnQgdG8gVGltZVVuaXRzIGNvbnRhaW5pbmcgXFwnZGF5XFwnJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBlY3RlZCByZXN1bHQgZm9yIFlFQVJRVUFSVEVSJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5ZRUFSUVVBUlRFUiwgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgNTksIDk5OSkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGUuZ2V0VGltZSgpLCBuZXcgRGF0ZSgyMDAwLCA5LCAxLCAwLCAwLCAwLCAwKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBVVENZRUFSUVVBUlRFUicsIGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZGF0ZTogRGF0ZSA9IGNvbnZlcnQoVGltZVVuaXQuVVRDWUVBUlFVQVJURVIsIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDksIDEsIDAsIDAsIDAsIDApKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBZRUFSUVVBUlRFUk1PTlRIJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5ZRUFSUVVBUlRFUk1PTlRILCBuZXcgRGF0ZSgyMDAwLCAxMSwgMiwgMjMsIDU5LCA1OSwgOTk5KSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKDIwMDAsIDExLCAxLCAwLCAwLCAwLCAwKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBZRUFSTU9OVEgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LllFQVJNT05USCwgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgNTksIDk5OSkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGUuZ2V0VGltZSgpLCBuZXcgRGF0ZSgyMDAwLCAxMSwgMSwgMCwgMCwgMCwgMCkuZ2V0VGltZSgpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGVjdGVkIHJlc3VsdCBmb3IgVVRDWUVBUk1PTlRIJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5VVENZRUFSTU9OVEgsIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDExLCAxLCAwLCAwLCAwLCAwKSkuZ2V0VGltZSgpKTtcbiAgICB9KTtcblxuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBVVENZRUFSTU9OVEgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LlVUQ1lFQVIsIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKERhdGUuVVRDKDIwMDAsIDAsIDEsIDAsIDAsIDAsIDApKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBZRUFSTU9OVEhEQVRFJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5ZRUFSTU9OVEhEQVRFLCBuZXcgRGF0ZSgyMDAwLCAxMSwgMiwgMjMsIDU5LCA1OSwgOTk5KSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAwLCAwLCAwLCAwKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBZRUFSTU9OVEhEQVRFSE9VUlMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSUywgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgNTksIDk5OSkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGUuZ2V0VGltZSgpLCBuZXcgRGF0ZSgyMDAwLCAxMSwgMiwgMjMsIDAsIDAsIDApLmdldFRpbWUoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBlY3RlZCByZXN1bHQgZm9yIFlFQVJNT05USERBVEVIT1VSU01JTlVURVMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSU01JTlVURVMsIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKTtcbiAgICAgIGFzc2VydC5lcXVhbChkYXRlLmdldFRpbWUoKSwgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgMCwgMCkuZ2V0VGltZSgpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGVjdGVkIHJlc3VsdCBmb3IgWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU1NFQ09ORFMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTLCBuZXcgRGF0ZSgyMDAwLCAxMSwgMiwgMjMsIDU5LCA1OSwgOTk5KSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCAwKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBRVUFSVEVSTU9OVEgnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LlFVQVJURVJNT05USCwgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgNTksIDk5OSkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGUuZ2V0VGltZSgpLCBuZXcgRGF0ZSgxOTAwLCAxMSwgMSwgMCwgMCwgMCwgMCkuZ2V0VGltZSgpKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGV4cGVjdGVkIHJlc3VsdCBmb3IgSE9VUlNNSU5VVEVTJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5IT1VSU01JTlVURVMsIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKTtcbiAgICAgIGFzc2VydC5lcXVhbChkYXRlLmdldFRpbWUoKSwgbmV3IERhdGUoMTkwMCwgMCwgMSwgMjMsIDU5LCAwLCAwKS5nZXRUaW1lKCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gZXhwZWN0ZWQgcmVzdWx0IGZvciBIT1VSU01JTlVURVNTRUNPTkRTJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5IT1VSU01JTlVURVNTRUNPTkRTLCBuZXcgRGF0ZSgyMDAwLCAxMSwgMiwgMjMsIDU5LCA1OSwgOTk5KSk7XG4gICAgICBhc3NlcnQuZXF1YWwoZGF0ZS5nZXRUaW1lKCksIG5ldyBEYXRlKDE5MDAsIDAsIDEsIDIzLCA1OSwgNTksIDApLmdldFRpbWUoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBlY3RlZCByZXN1bHQgZm9yIE1JTlVURVNTRUNPTkRTJywgZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gY29udmVydChUaW1lVW5pdC5NSU5VVEVTU0VDT05EUywgbmV3IERhdGUoMjAwMCwgMTEsIDIsIDIzLCA1OSwgNTksIDk5OSkpO1xuICAgICAgYXNzZXJ0LmVxdWFsKGRhdGUuZ2V0VGltZSgpLCBuZXcgRGF0ZSgxOTAwLCAwLCAxLCAwLCA1OSwgNTksIDApLmdldFRpbWUoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBleHBlY3RlZCByZXN1bHQgZm9yIFNFQ09ORFNNSUxMSVNFQ09ORFMnLCBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBjb252ZXJ0KFRpbWVVbml0LlNFQ09ORFNNSUxMSVNFQ09ORFMsIG5ldyBEYXRlKDIwMDAsIDExLCAyLCAyMywgNTksIDU5LCA5OTkpKTtcbiAgICAgIGFzc2VydC5lcXVhbChkYXRlLmdldFRpbWUoKSwgbmV3IERhdGUoMTkwMCwgMCwgMSwgMCwgMCwgNTksIDk5OSkuZ2V0VGltZSgpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3RlbXBsYXRlJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIFlFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBmb3JtYXRFeHByZXNzaW9uKFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTLCdkYXR1bS54JywgdW5kZWZpbmVkLCBmYWxzZSksXG4gICAgICAgIFwidGltZUZvcm1hdChkYXR1bS54LCAnJWIgJWQsICVZICVIOiVNOiVTJylcIlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIFlFQVJNT05USCAoTm8gY29tbWEpJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBmb3JtYXRFeHByZXNzaW9uKFRpbWVVbml0LllFQVJNT05USCwnZGF0dW0ueCcsIHVuZGVmaW5lZCwgZmFsc2UpLFxuICAgICAgICBcInRpbWVGb3JtYXQoZGF0dW0ueCwgJyViICVZJylcIlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIERBWScsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZm9ybWF0RXhwcmVzc2lvbihUaW1lVW5pdC5EQVksJ2RhdHVtLngnLCB1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgICAgXCJ0aW1lRm9ybWF0KGRhdHVtLngsICclQScpXCJcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRlbXBsYXRlIGZvciBEQVkgKHNob3J0ZW5lZCknLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGZvcm1hdEV4cHJlc3Npb24oVGltZVVuaXQuREFZLCdkYXR1bS54JywgdHJ1ZSwgZmFsc2UpLFxuICAgICAgICBcInRpbWVGb3JtYXQoZGF0dW0ueCwgJyVhJylcIlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIFFVQVJURVInLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGZvcm1hdEV4cHJlc3Npb24oVGltZVVuaXQuUVVBUlRFUiwnZGF0dW0ueCcsIHVuZGVmaW5lZCwgZmFsc2UpLFxuICAgICAgICBcIidRJyArIHF1YXJ0ZXIoZGF0dW0ueClcIlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIFlFQVJRVUFSVEVSJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgICBmb3JtYXRFeHByZXNzaW9uKFRpbWVVbml0LllFQVJRVUFSVEVSLCdkYXR1bS54JywgdW5kZWZpbmVkLCBmYWxzZSksXG4gICAgICAgIFwiJ1EnICsgcXVhcnRlcihkYXR1bS54KSArICcgJyArIHRpbWVGb3JtYXQoZGF0dW0ueCwgJyVZJylcIlxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgdGVtcGxhdGUgZm9yIG1pbGxpc2Vjb25kcycsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZm9ybWF0RXhwcmVzc2lvbihUaW1lVW5pdC5NSUxMSVNFQ09ORFMsJ2RhdHVtLngnLCB1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgICAgXCJ0aW1lRm9ybWF0KGRhdHVtLngsICclTCcpXCJcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IHRlbXBsYXRlIGZvciBubyB0aW1lVW5pdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChcbiAgICAgICAgZm9ybWF0RXhwcmVzc2lvbih1bmRlZmluZWQsJ2RhdHVtLngnLCB1bmRlZmluZWQsIGZhbHNlKSxcbiAgICAgICAgdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB0ZW1wbGF0ZSBmb3IgWUVBUk1PTlRIIChObyBjb21tYSkgd2l0aCB1dGMgc2NhbGUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIGZvcm1hdEV4cHJlc3Npb24oVGltZVVuaXQuWUVBUk1PTlRILCdkYXR1bS54JywgdW5kZWZpbmVkLCB0cnVlKSxcbiAgICAgICAgXCJ1dGNGb3JtYXQoZGF0dW0ueCwgJyViICVZJylcIlxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/transform.test.d.ts b/build/test/transform.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/transform.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/transform.test.js b/build/test/transform.test.js new file mode 100644 index 0000000000..ff5509b434 --- /dev/null +++ b/build/test/transform.test.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var log = tslib_1.__importStar(require("../src/log")); +var transform_1 = require("../src/transform"); +describe('normalizeTransform()', function () { + it('replaces filter with timeUnit=yearmonthday with yearmonthdate and throws the right warning', log.wrap(function (localLogger) { + var filter = { + and: [ + { not: { timeUnit: 'yearmonthday', field: 'd', equal: { year: 2008 } } }, + { or: [{ field: 'a', equal: 5 }] } + ] + }; + var transform = [ + { filter: filter } + ]; + chai_1.assert.deepEqual(transform_1.normalizeTransform(transform), [{ + filter: { + and: [ + { not: { timeUnit: 'yearmonthdate', field: 'd', equal: { year: 2008 } } }, + { or: [{ field: 'a', equal: 5 }] } + ] + } + }]); + chai_1.assert.equal(localLogger.warns[0], log.message.dayReplacedWithDate('yearmonthday')); + })); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0L3RyYW5zZm9ybS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZCQUE0QjtBQUM1QixzREFBa0M7QUFJbEMsOENBQStEO0FBRS9ELFFBQVEsQ0FBQyxzQkFBc0IsRUFBRTtJQUMvQixFQUFFLENBQUMsNEZBQTRGLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQVc7UUFDcEgsSUFBTSxNQUFNLEdBQThCO1lBQ3hDLEdBQUcsRUFBRTtnQkFDSCxFQUFDLEdBQUcsRUFBRSxFQUFDLFFBQVEsRUFBRSxjQUEwQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxFQUFDLEVBQUM7Z0JBQzlFLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUMsQ0FBQyxFQUFDO2FBQy9CO1NBQ0YsQ0FBQztRQUNGLElBQU0sU0FBUyxHQUFnQjtZQUM3QixFQUFDLE1BQU0sUUFBQSxFQUFDO1NBQ1QsQ0FBQztRQUNGLGFBQU0sQ0FBQyxTQUFTLENBQUMsOEJBQWtCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDL0MsTUFBTSxFQUFFO29CQUNOLEdBQUcsRUFBRTt3QkFDSCxFQUFDLEdBQUcsRUFBRSxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUMsRUFBQzt3QkFDbkUsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUM7cUJBQy9CO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDLENBQUM7UUFDSixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3RGLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9zcmMvbG9nJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4uL3NyYy9sb2dpY2FsJztcbmltcG9ydCB7UHJlZGljYXRlfSBmcm9tICcuLi9zcmMvcHJlZGljYXRlJztcbmltcG9ydCB7VGltZVVuaXR9IGZyb20gJy4uL3NyYy90aW1ldW5pdCc7XG5pbXBvcnQge25vcm1hbGl6ZVRyYW5zZm9ybSwgVHJhbnNmb3JtfSBmcm9tICcuLi9zcmMvdHJhbnNmb3JtJztcblxuZGVzY3JpYmUoJ25vcm1hbGl6ZVRyYW5zZm9ybSgpJywgKCkgPT4ge1xuICBpdCgncmVwbGFjZXMgZmlsdGVyIHdpdGggdGltZVVuaXQ9eWVhcm1vbnRoZGF5IHdpdGggeWVhcm1vbnRoZGF0ZSBhbmQgdGhyb3dzIHRoZSByaWdodCB3YXJuaW5nJywgbG9nLndyYXAoKGxvY2FsTG9nZ2VyKSA9PiB7XG4gICAgY29uc3QgZmlsdGVyOiBMb2dpY2FsT3BlcmFuZDxQcmVkaWNhdGU+ID0ge1xuICAgICAgYW5kOiBbXG4gICAgICAgIHtub3Q6IHt0aW1lVW5pdDogJ3llYXJtb250aGRheScgYXMgVGltZVVuaXQsIGZpZWxkOiAnZCcsIGVxdWFsOiB7eWVhcjogMjAwOH19fSxcbiAgICAgICAge29yOiBbe2ZpZWxkOiAnYScsIGVxdWFsOiA1fV19XG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCB0cmFuc2Zvcm06IFRyYW5zZm9ybVtdID0gW1xuICAgICAge2ZpbHRlcn1cbiAgICBdO1xuICAgIGFzc2VydC5kZWVwRXF1YWwobm9ybWFsaXplVHJhbnNmb3JtKHRyYW5zZm9ybSksIFt7XG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgYW5kOiBbXG4gICAgICAgICAge25vdDoge3RpbWVVbml0OiAneWVhcm1vbnRoZGF0ZScsIGZpZWxkOiAnZCcsIGVxdWFsOiB7eWVhcjogMjAwOH19fSxcbiAgICAgICAgICB7b3I6IFt7ZmllbGQ6ICdhJywgZXF1YWw6IDV9XX1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH1dKTtcbiAgICBhc3NlcnQuZXF1YWwobG9jYWxMb2dnZXIud2FybnNbMF0sIGxvZy5tZXNzYWdlLmRheVJlcGxhY2VkV2l0aERhdGUoJ3llYXJtb250aGRheScpKTtcbiAgfSkpO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/test/type.test.d.ts b/build/test/type.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/type.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/type.test.js b/build/test/type.test.js new file mode 100644 index 0000000000..ad3edab16e --- /dev/null +++ b/build/test/type.test.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var chai_1 = require("chai"); +var type = tslib_1.__importStar(require("../src/type")); +describe('type', function () { + describe('getFullName()', function () { + it('should return correct lowercase, full type names.', function () { + for (var _i = 0, _a = ['q', 'Q', 'quantitative', 'QUANTITATIVE']; _i < _a.length; _i++) { + var t = _a[_i]; + chai_1.assert.equal(type.getFullName(t), 'quantitative'); + } + for (var _b = 0, _c = ['t', 'T', 'temporal', 'TEMPORAL']; _b < _c.length; _b++) { + var t = _c[_b]; + chai_1.assert.equal(type.getFullName(t), 'temporal'); + } + for (var _d = 0, _e = ['o', 'O', 'ordinal', 'ORDINAL']; _d < _e.length; _d++) { + var t = _e[_d]; + chai_1.assert.equal(type.getFullName(t), 'ordinal'); + } + for (var _f = 0, _g = ['n', 'N', 'nominal', 'NOMINAL']; _f < _g.length; _f++) { + var t = _g[_f]; + chai_1.assert.equal(type.getFullName(t), 'nominal'); + } + for (var _h = 0, _j = ['latitude', 'LATITUDE']; _h < _j.length; _h++) { + var t = _j[_h]; + chai_1.assert.equal(type.getFullName(t), 'latitude'); + } + for (var _k = 0, _l = ['longitude', 'LONGITUDE']; _k < _l.length; _k++) { + var t = _l[_k]; + chai_1.assert.equal(type.getFullName(t), 'longitude'); + } + for (var _m = 0, _o = ['geojson', 'GEOJSON']; _m < _o.length; _m++) { + var t = _o[_m]; + chai_1.assert.equal(type.getFullName(t), 'geojson'); + } + }); + it('should return undefined for invalid type', function () { + chai_1.assert.equal(type.getFullName('haha'), undefined); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC90eXBlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTRCO0FBRTVCLHdEQUFvQztBQUVwQyxRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsUUFBUSxDQUFDLGVBQWUsRUFBRTtRQUN4QixFQUFFLENBQUMsbURBQW1ELEVBQUU7WUFDdEQsS0FBZ0IsVUFBMEMsRUFBMUMsTUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxjQUFjLENBQUMsRUFBMUMsY0FBMEMsRUFBMUMsSUFBMEMsRUFBRTtnQkFBdkQsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ25EO1lBQ0QsS0FBZ0IsVUFBa0MsRUFBbEMsTUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBbEMsY0FBa0MsRUFBbEMsSUFBa0MsRUFBRTtnQkFBL0MsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsS0FBZ0IsVUFBZ0MsRUFBaEMsTUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBaEMsY0FBZ0MsRUFBaEMsSUFBZ0MsRUFBRTtnQkFBN0MsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsS0FBZ0IsVUFBZ0MsRUFBaEMsTUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBaEMsY0FBZ0MsRUFBaEMsSUFBZ0MsRUFBRTtnQkFBN0MsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzlDO1lBQ0QsS0FBZ0IsVUFBd0IsRUFBeEIsTUFBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEVBQXhCLGNBQXdCLEVBQXhCLElBQXdCLEVBQUU7Z0JBQXJDLElBQU0sQ0FBQyxTQUFBO2dCQUNWLGFBQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMvQztZQUNELEtBQWdCLFVBQTBCLEVBQTFCLE1BQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUExQixjQUEwQixFQUExQixJQUEwQixFQUFFO2dCQUF2QyxJQUFNLENBQUMsU0FBQTtnQkFDVixhQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDaEQ7WUFDRCxLQUFnQixVQUFzQixFQUF0QixNQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsRUFBdEIsY0FBc0IsRUFBdEIsSUFBc0IsRUFBRTtnQkFBbkMsSUFBTSxDQUFDLFNBQUE7Z0JBQ1YsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQzlDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMENBQTBDLEVBQUU7WUFDN0MsYUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcblxuaW1wb3J0ICogYXMgdHlwZSBmcm9tICcuLi9zcmMvdHlwZSc7XG5cbmRlc2NyaWJlKCd0eXBlJywgZnVuY3Rpb24gKCkge1xuICBkZXNjcmliZSgnZ2V0RnVsbE5hbWUoKScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBjb3JyZWN0IGxvd2VyY2FzZSwgZnVsbCB0eXBlIG5hbWVzLicsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdCBvZiBbJ3EnLCAnUScsICdxdWFudGl0YXRpdmUnLCAnUVVBTlRJVEFUSVZFJ10pIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGUuZ2V0RnVsbE5hbWUodCksICdxdWFudGl0YXRpdmUnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdCBvZiBbJ3QnLCAnVCcsICd0ZW1wb3JhbCcsICdURU1QT1JBTCddKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0eXBlLmdldEZ1bGxOYW1lKHQpLCAndGVtcG9yYWwnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdCBvZiBbJ28nLCAnTycsICdvcmRpbmFsJywgJ09SRElOQUwnXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwodHlwZS5nZXRGdWxsTmFtZSh0KSwgJ29yZGluYWwnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdCBvZiBbJ24nLCAnTicsICdub21pbmFsJywgJ05PTUlOQUwnXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwodHlwZS5nZXRGdWxsTmFtZSh0KSwgJ25vbWluYWwnKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgdCBvZiBbJ2xhdGl0dWRlJywgJ0xBVElUVURFJ10pIHtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKHR5cGUuZ2V0RnVsbE5hbWUodCksICdsYXRpdHVkZScpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB0IG9mIFsnbG9uZ2l0dWRlJywgJ0xPTkdJVFVERSddKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbCh0eXBlLmdldEZ1bGxOYW1lKHQpLCAnbG9uZ2l0dWRlJyk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHQgb2YgWydnZW9qc29uJywgJ0dFT0pTT04nXSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwodHlwZS5nZXRGdWxsTmFtZSh0KSwgJ2dlb2pzb24nKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgaW52YWxpZCB0eXBlJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHR5cGUuZ2V0RnVsbE5hbWUoJ2hhaGEnKSwgdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdfQ== \ No newline at end of file diff --git a/build/test/util.d.ts b/build/test/util.d.ts new file mode 100644 index 0000000000..986279f4fd --- /dev/null +++ b/build/test/util.d.ts @@ -0,0 +1,17 @@ +import { ConcatModel } from '../src/compile/concat'; +import { FacetModel } from '../src/compile/facet'; +import { LayerModel } from '../src/compile/layer'; +import { Model } from '../src/compile/model'; +import { RepeatModel } from '../src/compile/repeat'; +import { UnitModel } from '../src/compile/unit'; +import { NormalizedConcatSpec, NormalizedFacetSpec, NormalizedLayerSpec, NormalizedRepeatSpec, NormalizedUnitSpec, TopLevel, TopLevelSpec } from '../src/spec'; +export declare function parseModel(inputSpec: TopLevelSpec): Model; +export declare function parseModelWithScale(inputSpec: TopLevelSpec): Model; +export declare function parseUnitModel(spec: TopLevel): UnitModel; +export declare function parseUnitModelWithScale(spec: TopLevel): UnitModel; +export declare function parseUnitModelWithScaleAndLayoutSize(spec: TopLevel): UnitModel; +export declare function parseLayerModel(spec: TopLevel): LayerModel; +export declare function parseFacetModel(spec: TopLevel): FacetModel; +export declare function parseFacetModelWithScale(spec: TopLevel): FacetModel; +export declare function parseRepeatModel(spec: TopLevel): RepeatModel; +export declare function parseConcatModel(spec: TopLevel): ConcatModel; diff --git a/build/test/util.js b/build/test/util.js new file mode 100644 index 0000000000..5343ddd5c4 --- /dev/null +++ b/build/test/util.js @@ -0,0 +1,64 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var buildmodel_1 = require("../src/compile/buildmodel"); +var concat_1 = require("../src/compile/concat"); +var facet_1 = require("../src/compile/facet"); +var layer_1 = require("../src/compile/layer"); +var repeat_1 = require("../src/compile/repeat"); +var unit_1 = require("../src/compile/unit"); +var config_1 = require("../src/config"); +var spec_1 = require("../src/spec"); +var spec_2 = require("../src/spec"); +var toplevelprops_1 = require("../src/toplevelprops"); +function parseModel(inputSpec) { + var config = config_1.initConfig(inputSpec.config); + var spec = spec_1.normalize(inputSpec, config); + var autosize = toplevelprops_1.normalizeAutoSize(inputSpec.autosize, config.autosize, spec_2.isLayerSpec(spec) || spec_2.isUnitSpec(spec)); + return buildmodel_1.buildModel(spec, null, '', undefined, undefined, config, autosize.type === 'fit'); +} +exports.parseModel = parseModel; +function parseModelWithScale(inputSpec) { + var model = parseModel(inputSpec); + model.parseScale(); + return model; +} +exports.parseModelWithScale = parseModelWithScale; +function parseUnitModel(spec) { + return new unit_1.UnitModel(spec, null, '', undefined, undefined, config_1.initConfig(spec.config), toplevelprops_1.normalizeAutoSize(spec.autosize, spec.config ? spec.config.autosize : undefined, true).type === 'fit'); +} +exports.parseUnitModel = parseUnitModel; +function parseUnitModelWithScale(spec) { + var model = parseUnitModel(spec); + model.parseScale(); + return model; +} +exports.parseUnitModelWithScale = parseUnitModelWithScale; +function parseUnitModelWithScaleAndLayoutSize(spec) { + var model = parseUnitModelWithScale(spec); + model.parseLayoutSize(); + return model; +} +exports.parseUnitModelWithScaleAndLayoutSize = parseUnitModelWithScaleAndLayoutSize; +function parseLayerModel(spec) { + return new layer_1.LayerModel(spec, null, '', undefined, undefined, config_1.initConfig(spec.config), toplevelprops_1.normalizeAutoSize(spec.autosize, spec.config ? spec.config.autosize : undefined, true).type === 'fit'); +} +exports.parseLayerModel = parseLayerModel; +function parseFacetModel(spec) { + return new facet_1.FacetModel(spec, null, '', undefined, config_1.initConfig(spec.config)); +} +exports.parseFacetModel = parseFacetModel; +function parseFacetModelWithScale(spec) { + var model = parseFacetModel(spec); + model.parseScale(); + return model; +} +exports.parseFacetModelWithScale = parseFacetModelWithScale; +function parseRepeatModel(spec) { + return new repeat_1.RepeatModel(spec, null, '', undefined, config_1.initConfig(spec.config)); +} +exports.parseRepeatModel = parseRepeatModel; +function parseConcatModel(spec) { + return new concat_1.ConcatModel(spec, null, '', undefined, config_1.initConfig(spec.config)); +} +exports.parseConcatModel = parseConcatModel; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHdEQUFxRDtBQUNyRCxnREFBa0Q7QUFDbEQsOENBQWdEO0FBQ2hELDhDQUFnRDtBQUVoRCxnREFBa0Q7QUFDbEQsNENBQThDO0FBQzlDLHdDQUF5QztBQUN6QyxvQ0FTcUI7QUFDckIsb0NBQW9EO0FBQ3BELHNEQUF1RDtBQUV2RCxvQkFBMkIsU0FBdUI7SUFDaEQsSUFBTSxNQUFNLEdBQUcsbUJBQVUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBTSxJQUFJLEdBQUcsZ0JBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDMUMsSUFBTSxRQUFRLEdBQUcsaUNBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLGtCQUFXLENBQUMsSUFBSSxDQUFDLElBQUksaUJBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9HLE9BQU8sdUJBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQzNGLENBQUM7QUFMRCxnQ0FLQztBQUVELDZCQUFvQyxTQUF1QjtJQUN6RCxJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ25CLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUpELGtEQUlDO0FBRUQsd0JBQStCLElBQWtDO0lBQy9ELE9BQU8sSUFBSSxnQkFBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsaUNBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztBQUM3TCxDQUFDO0FBRkQsd0NBRUM7QUFFRCxpQ0FBd0MsSUFBa0M7SUFDeEUsSUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCwwREFJQztBQUVELDhDQUFxRCxJQUFrQztJQUNyRixJQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDeEIsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBSkQsb0ZBSUM7QUFHRCx5QkFBZ0MsSUFBbUM7SUFDakUsT0FBTyxJQUFJLGtCQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxpQ0FBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDO0FBQzlMLENBQUM7QUFGRCwwQ0FFQztBQUVELHlCQUFnQyxJQUFtQztJQUNqRSxPQUFPLElBQUksa0JBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsbUJBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRkQsMENBRUM7QUFFRCxrQ0FBeUMsSUFBbUM7SUFDMUUsSUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNuQixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFKRCw0REFJQztBQUVELDBCQUFpQyxJQUFvQztJQUNuRSxPQUFPLElBQUksb0JBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsbUJBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRkQsNENBRUM7QUFFRCwwQkFBaUMsSUFBb0M7SUFDbkUsT0FBTyxJQUFJLG9CQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLG1CQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUZELDRDQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtidWlsZE1vZGVsfSBmcm9tICcuLi9zcmMvY29tcGlsZS9idWlsZG1vZGVsJztcbmltcG9ydCB7Q29uY2F0TW9kZWx9IGZyb20gJy4uL3NyYy9jb21waWxlL2NvbmNhdCc7XG5pbXBvcnQge0ZhY2V0TW9kZWx9IGZyb20gJy4uL3NyYy9jb21waWxlL2ZhY2V0JztcbmltcG9ydCB7TGF5ZXJNb2RlbH0gZnJvbSAnLi4vc3JjL2NvbXBpbGUvbGF5ZXInO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi4vc3JjL2NvbXBpbGUvbW9kZWwnO1xuaW1wb3J0IHtSZXBlYXRNb2RlbH0gZnJvbSAnLi4vc3JjL2NvbXBpbGUvcmVwZWF0JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi9zcmMvY29tcGlsZS91bml0JztcbmltcG9ydCB7aW5pdENvbmZpZ30gZnJvbSAnLi4vc3JjL2NvbmZpZyc7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIE5vcm1hbGl6ZWRDb25jYXRTcGVjLFxuICBOb3JtYWxpemVkRmFjZXRTcGVjLFxuICBOb3JtYWxpemVkTGF5ZXJTcGVjLFxuICBOb3JtYWxpemVkUmVwZWF0U3BlYyxcbiAgTm9ybWFsaXplZFVuaXRTcGVjLFxuICBUb3BMZXZlbCxcbiAgVG9wTGV2ZWxTcGVjLFxufSBmcm9tICcuLi9zcmMvc3BlYyc7XG5pbXBvcnQge2lzTGF5ZXJTcGVjLCBpc1VuaXRTcGVjfSBmcm9tICcuLi9zcmMvc3BlYyc7XG5pbXBvcnQge25vcm1hbGl6ZUF1dG9TaXplfSBmcm9tICcuLi9zcmMvdG9wbGV2ZWxwcm9wcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsKGlucHV0U3BlYzogVG9wTGV2ZWxTcGVjKTogTW9kZWwge1xuICBjb25zdCBjb25maWcgPSBpbml0Q29uZmlnKGlucHV0U3BlYy5jb25maWcpO1xuICBjb25zdCBzcGVjID0gbm9ybWFsaXplKGlucHV0U3BlYywgY29uZmlnKTtcbiAgY29uc3QgYXV0b3NpemUgPSBub3JtYWxpemVBdXRvU2l6ZShpbnB1dFNwZWMuYXV0b3NpemUsIGNvbmZpZy5hdXRvc2l6ZSwgaXNMYXllclNwZWMoc3BlYykgfHwgaXNVbml0U3BlYyhzcGVjKSk7XG4gIHJldHVybiBidWlsZE1vZGVsKHNwZWMsIG51bGwsICcnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29uZmlnLCBhdXRvc2l6ZS50eXBlID09PSAnZml0Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU1vZGVsV2l0aFNjYWxlKGlucHV0U3BlYzogVG9wTGV2ZWxTcGVjKTogTW9kZWwge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlTW9kZWwoaW5wdXRTcGVjKTtcbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRNb2RlbChzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkVW5pdFNwZWM+KSB7XG4gIHJldHVybiBuZXcgVW5pdE1vZGVsKHNwZWMsIG51bGwsICcnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5pdENvbmZpZyhzcGVjLmNvbmZpZyksIG5vcm1hbGl6ZUF1dG9TaXplKHNwZWMuYXV0b3NpemUsIHNwZWMuY29uZmlnID8gc3BlYy5jb25maWcuYXV0b3NpemUgOiB1bmRlZmluZWQsIHRydWUpLnR5cGUgPT09ICdmaXQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRVbml0U3BlYz4pIHtcbiAgY29uc3QgbW9kZWwgPSBwYXJzZVVuaXRNb2RlbChzcGVjKTtcbiAgbW9kZWwucGFyc2VTY2FsZSgpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRNb2RlbFdpdGhTY2FsZUFuZExheW91dFNpemUoc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFVuaXRTcGVjPikge1xuICBjb25zdCBtb2RlbCA9IHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKHNwZWMpO1xuICBtb2RlbC5wYXJzZUxheW91dFNpemUoKTtcbiAgcmV0dXJuIG1vZGVsO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVyTW9kZWwoc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZExheWVyU3BlYz4pIHtcbiAgcmV0dXJuIG5ldyBMYXllck1vZGVsKHNwZWMsIG51bGwsICcnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5pdENvbmZpZyhzcGVjLmNvbmZpZyksIG5vcm1hbGl6ZUF1dG9TaXplKHNwZWMuYXV0b3NpemUsIHNwZWMuY29uZmlnID8gc3BlYy5jb25maWcuYXV0b3NpemUgOiB1bmRlZmluZWQsIHRydWUpLnR5cGUgPT09ICdmaXQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmFjZXRNb2RlbChzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkRmFjZXRTcGVjPikge1xuICByZXR1cm4gbmV3IEZhY2V0TW9kZWwoc3BlYywgbnVsbCwgJycsIHVuZGVmaW5lZCwgaW5pdENvbmZpZyhzcGVjLmNvbmZpZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGYWNldE1vZGVsV2l0aFNjYWxlKHNwZWM6IFRvcExldmVsPE5vcm1hbGl6ZWRGYWNldFNwZWM+KSB7XG4gIGNvbnN0IG1vZGVsID0gcGFyc2VGYWNldE1vZGVsKHNwZWMpO1xuICBtb2RlbC5wYXJzZVNjYWxlKCk7XG4gIHJldHVybiBtb2RlbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmVwZWF0TW9kZWwoc3BlYzogVG9wTGV2ZWw8Tm9ybWFsaXplZFJlcGVhdFNwZWM+KSB7XG4gIHJldHVybiBuZXcgUmVwZWF0TW9kZWwoc3BlYywgbnVsbCwgJycsIHVuZGVmaW5lZCwgaW5pdENvbmZpZyhzcGVjLmNvbmZpZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb25jYXRNb2RlbChzcGVjOiBUb3BMZXZlbDxOb3JtYWxpemVkQ29uY2F0U3BlYz4pIHtcbiAgcmV0dXJuIG5ldyBDb25jYXRNb2RlbChzcGVjLCBudWxsLCAnJywgdW5kZWZpbmVkLCBpbml0Q29uZmlnKHNwZWMuY29uZmlnKSk7XG59XG4iXX0= \ No newline at end of file diff --git a/build/test/util.test.d.ts b/build/test/util.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/util.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/util.test.js b/build/test/util.test.js new file mode 100644 index 0000000000..08ae58e0ef --- /dev/null +++ b/build/test/util.test.js @@ -0,0 +1,127 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var util_1 = require("../src/util"); +var util_2 = require("../src/util"); +describe('util', function () { + describe('varName', function () { + it('replaces all non-alphanumeric characters with _', function () { + chai_1.assert.equal(util_2.varName('bin-mpg$!@#%_+1'), 'bin_mpg_______1'); + }); + it('prepends _ if the string starts with number', function () { + chai_1.assert.equal(util_2.varName('1a'), '_1a'); + }); + }); + describe('stringify', function () { + it('stringifies numbers', function () { + chai_1.assert.equal(util_2.stringify(12), '12'); + }); + it('stringifies booleans', function () { + chai_1.assert.equal(util_2.stringify(true), 'true'); + }); + it('stringifies strings', function () { + chai_1.assert.equal(util_2.stringify('foo'), '"foo"'); + }); + it('stringifies objects', function () { + chai_1.assert.equal(util_2.stringify({ foo: 42 }), '{"foo":42}'); + }); + }); + describe('hash', function () { + it('hashes numbers as numbers', function () { + chai_1.assert.equal(util_2.hash(12), 12); + }); + it('hashes booleans as strings so that they can be used as keys', function () { + chai_1.assert.equal(util_2.hash(true), 'true'); + }); + it('hashes strings as strings', function () { + chai_1.assert.equal(util_2.hash('foo'), 'foo'); + }); + it('hashes objects', function () { + chai_1.assert.equal(util_2.hash({ foo: 42 }), '{"foo":42}'); + }); + }); + describe('deleteNestedProperty', function () { + it('removes a property from an object', function () { + var originalObject = { + property1: { property1: 'value1' }, + property2: { property5: 'value2' }, + property3: { property6: 'value3', property7: 'value4' } + }; + var newObject = { + property2: { property5: 'value2' }, + property3: { property6: 'value3', property7: 'value4' } + }; + util_2.deleteNestedProperty(originalObject, ['property1']); + chai_1.assert.equal(util_2.stringify(originalObject), util_2.stringify(newObject)); + }); + it('removes nested properties', function () { + var originalObject = { + property1: { property4: 'value1' }, + property2: { property5: 'value2' }, + property3: { property6: 'value3', property7: 'value4' } + }; + var newObject = { + property2: { property5: 'value2' }, + property3: { property6: 'value3', property7: 'value4' } + }; + util_2.deleteNestedProperty(originalObject, ['property1', 'property4']); + chai_1.assert.equal(util_2.stringify(originalObject), util_2.stringify(newObject)); + }); + it('stops when it does not empty the last element', function () { + var originalObject = { + property1: { property4: 'value1' }, + property2: { property5: 'value2' }, + property3: { property6: 'value3', property7: 'value4' } + }; + var newObject = { + property1: { property4: 'value1' }, + property2: { property5: 'value2' }, + property3: { property6: 'value3' } + }; + util_2.deleteNestedProperty(originalObject, ['property3', 'property7']); + chai_1.assert.equal(util_2.stringify(originalObject), util_2.stringify(newObject)); + }); + }); + describe('accessPathWithDatum', function () { + it('should parse foo', function () { + chai_1.assert.equal(util_2.accessPathWithDatum('foo'), 'datum["foo"]'); + }); + it('should parse foo.bar', function () { + chai_1.assert.equal(util_2.accessPathWithDatum('foo.bar'), 'datum["foo"] && datum["foo"]["bar"]'); + }); + it('should support cusotom datum', function () { + chai_1.assert.equal(util_2.accessPathWithDatum('foo', 'parent'), 'parent["foo"]'); + }); + }); + describe('flatAccessWithDatum', function () { + it('should parse foo.bar', function () { + chai_1.assert.equal(util_1.flatAccessWithDatum('foo.bar'), 'datum["foo.bar"]'); + }); + it('should return string value of field name', function () { + chai_1.assert.equal(util_1.flatAccessWithDatum('foo["bar"].baz'), 'datum["foo.bar.baz"]'); + }); + it('should support cusotom datum', function () { + chai_1.assert.equal(util_1.flatAccessWithDatum('foo', 'parent'), 'parent["foo"]'); + }); + }); + describe('accessPathDepth', function () { + it('should return 1 if the field is not nested', function () { + chai_1.assert.equal(util_2.accessPathDepth('foo'), 1); + }); + it('should return 1 if . is escaped', function () { + chai_1.assert.equal(util_2.accessPathDepth('foo\\.bar'), 1); + }); + it('should return 2 for foo.bar', function () { + chai_1.assert.equal(util_2.accessPathDepth('foo.bar'), 2); + }); + }); + describe('removePathFromField', function () { + it('should convert nested accesses to \\.', function () { + chai_1.assert.equal(util_2.replacePathInField('foo["bar"].baz'), 'foo\\.bar\\.baz'); + }); + it('should keep \\.', function () { + chai_1.assert.equal(util_2.replacePathInField('foo\\.bar'), 'foo\\.bar'); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdC91dGlsLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw2QkFBNEI7QUFDNUIsb0NBQWdEO0FBRWhELG9DQVFxQjtBQUVyQixRQUFRLENBQUMsTUFBTSxFQUFFO0lBQ2YsUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNsQixFQUFFLENBQUMsaURBQWlELEVBQUU7WUFDcEQsYUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELGFBQU0sQ0FBQyxLQUFLLENBQUMsY0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsV0FBVyxFQUFFO1FBQ3BCLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixhQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0JBQXNCLEVBQUU7WUFDekIsYUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBUyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFCQUFxQixFQUFFO1lBQ3hCLGFBQU0sQ0FBQyxLQUFLLENBQUMsZ0JBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxQkFBcUIsRUFBRTtZQUN4QixhQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFTLENBQUMsRUFBQyxHQUFHLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLE1BQU0sRUFBRTtRQUNmLEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtZQUNoRSxhQUFNLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQixhQUFNLENBQUMsS0FBSyxDQUFDLFdBQUksQ0FBQyxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSCxRQUFRLENBQUMsc0JBQXNCLEVBQUU7UUFDL0IsRUFBRSxDQUFDLG1DQUFtQyxFQUFFO1lBQ3RDLElBQU0sY0FBYyxHQUFHO2dCQUNyQixTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7YUFDdEQsQ0FBQztZQUNGLElBQU0sU0FBUyxHQUFHO2dCQUNoQixTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7YUFDdEQsQ0FBQztZQUNGLDJCQUFvQixDQUFDLGNBQWMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDcEQsYUFBTSxDQUFDLEtBQUssQ0FBQyxnQkFBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGdCQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywyQkFBMkIsRUFBRTtZQUM5QixJQUFNLGNBQWMsR0FBRztnQkFDckIsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQztnQkFDaEMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQztnQkFDaEMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDO2FBQ3RELENBQUM7WUFDRixJQUFNLFNBQVMsR0FBRztnQkFDaEIsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQztnQkFDaEMsU0FBUyxFQUFFLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFDO2FBQ3RELENBQUM7WUFDRiwyQkFBb0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqRSxhQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsZ0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLCtDQUErQyxFQUFFO1lBQ2xELElBQU0sY0FBYyxHQUFHO2dCQUNyQixTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUM7YUFDdEQsQ0FBQztZQUNGLElBQU0sU0FBUyxHQUFHO2dCQUNoQixTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2dCQUNoQyxTQUFTLEVBQUUsRUFBQyxTQUFTLEVBQUUsUUFBUSxFQUFDO2FBQ2pDLENBQUM7WUFDRiwyQkFBb0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNqRSxhQUFNLENBQUMsS0FBSyxDQUFDLGdCQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsZ0JBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLGtCQUFrQixFQUFFO1lBQ3JCLGFBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsc0JBQXNCLEVBQUU7WUFDekIsYUFBTSxDQUFDLEtBQUssQ0FBQywwQkFBbUIsQ0FBQyxTQUFTLENBQUMsRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDhCQUE4QixFQUFFO1lBQ2pDLGFBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQW1CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUU7UUFDOUIsRUFBRSxDQUFDLHNCQUFzQixFQUFFO1lBQ3pCLGFBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQW1CLENBQUMsU0FBUyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRTtZQUM3QyxhQUFNLENBQUMsS0FBSyxDQUFDLDBCQUFtQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtZQUNqQyxhQUFNLENBQUMsS0FBSyxDQUFDLDBCQUFtQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLGlCQUFpQixFQUFFO1FBQzFCLEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRTtZQUMvQyxhQUFNLENBQUMsS0FBSyxDQUFDLHNCQUFlLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsaUNBQWlDLEVBQUU7WUFDcEMsYUFBTSxDQUFDLEtBQUssQ0FBQyxzQkFBZSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZCQUE2QixFQUFFO1lBQ2hDLGFBQU0sQ0FBQyxLQUFLLENBQUMsc0JBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHFCQUFxQixFQUFFO1FBQzlCLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRTtZQUMxQyxhQUFNLENBQUMsS0FBSyxDQUFDLHlCQUFrQixDQUFDLGdCQUFnQixDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQixhQUFNLENBQUMsS0FBSyxDQUFDLHlCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXNzZXJ0fSBmcm9tICdjaGFpJztcbmltcG9ydCB7ZmxhdEFjY2Vzc1dpdGhEYXR1bX0gZnJvbSAnLi4vc3JjL3V0aWwnO1xuXG5pbXBvcnQge1xuICBhY2Nlc3NQYXRoRGVwdGgsXG4gIGFjY2Vzc1BhdGhXaXRoRGF0dW0sXG4gIGRlbGV0ZU5lc3RlZFByb3BlcnR5LFxuICBoYXNoLFxuICByZXBsYWNlUGF0aEluRmllbGQsXG4gIHN0cmluZ2lmeSxcbiAgdmFyTmFtZSxcbn0gZnJvbSAnLi4vc3JjL3V0aWwnO1xuXG5kZXNjcmliZSgndXRpbCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3Zhck5hbWUnLCAoKSA9PiB7XG4gICAgaXQoJ3JlcGxhY2VzIGFsbCBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgd2l0aCBfJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHZhck5hbWUoJ2Jpbi1tcGckIUAjJV8rMScpLCAnYmluX21wZ19fX19fX18xJyk7XG4gICAgfSk7XG5cbiAgICBpdCgncHJlcGVuZHMgXyBpZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIG51bWJlcicsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbCh2YXJOYW1lKCcxYScpLCAnXzFhJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdzdHJpbmdpZnknLCAoKSA9PiB7XG4gICAgaXQoJ3N0cmluZ2lmaWVzIG51bWJlcnMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoc3RyaW5naWZ5KDEyKSwgJzEyJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RyaW5naWZpZXMgYm9vbGVhbnMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoc3RyaW5naWZ5KHRydWUpLCAndHJ1ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3N0cmluZ2lmaWVzIHN0cmluZ3MnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoc3RyaW5naWZ5KCdmb28nKSwgJ1wiZm9vXCInKTtcbiAgICB9KTtcblxuICAgIGl0KCdzdHJpbmdpZmllcyBvYmplY3RzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKHN0cmluZ2lmeSh7Zm9vOiA0Mn0pLCAne1wiZm9vXCI6NDJ9Jyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdoYXNoJywgKCkgPT4ge1xuICAgIGl0KCdoYXNoZXMgbnVtYmVycyBhcyBudW1iZXJzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGhhc2goMTIpLCAxMik7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzaGVzIGJvb2xlYW5zIGFzIHN0cmluZ3Mgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFzIGtleXMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoaGFzaCh0cnVlKSwgJ3RydWUnKTtcbiAgICB9KTtcblxuICAgIGl0KCdoYXNoZXMgc3RyaW5ncyBhcyBzdHJpbmdzJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGhhc2goJ2ZvbycpLCAnZm9vJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnaGFzaGVzIG9iamVjdHMnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoaGFzaCh7Zm9vOiA0Mn0pLCAne1wiZm9vXCI6NDJ9Jyk7XG4gICAgfSk7XG4gIH0pO1xuICBkZXNjcmliZSgnZGVsZXRlTmVzdGVkUHJvcGVydHknLCAoKSA9PiB7XG4gICAgaXQoJ3JlbW92ZXMgYSBwcm9wZXJ0eSBmcm9tIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsT2JqZWN0ID0ge1xuICAgICAgICBwcm9wZXJ0eTE6IHtwcm9wZXJ0eTE6ICd2YWx1ZTEnfSxcbiAgICAgICAgcHJvcGVydHkyOiB7cHJvcGVydHk1OiAndmFsdWUyJ30sXG4gICAgICAgIHByb3BlcnR5Mzoge3Byb3BlcnR5NjogJ3ZhbHVlMycsIHByb3BlcnR5NzogJ3ZhbHVlNCd9XG4gICAgICB9O1xuICAgICAgY29uc3QgbmV3T2JqZWN0ID0ge1xuICAgICAgICBwcm9wZXJ0eTI6IHtwcm9wZXJ0eTU6ICd2YWx1ZTInfSxcbiAgICAgICAgcHJvcGVydHkzOiB7cHJvcGVydHk2OiAndmFsdWUzJywgcHJvcGVydHk3OiAndmFsdWU0J31cbiAgICAgIH07XG4gICAgICBkZWxldGVOZXN0ZWRQcm9wZXJ0eShvcmlnaW5hbE9iamVjdCwgWydwcm9wZXJ0eTEnXSk7XG4gICAgICBhc3NlcnQuZXF1YWwoc3RyaW5naWZ5KG9yaWdpbmFsT2JqZWN0KSwgc3RyaW5naWZ5KG5ld09iamVjdCkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3JlbW92ZXMgbmVzdGVkIHByb3BlcnRpZXMnLCAoKSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW5hbE9iamVjdCA9IHtcbiAgICAgICAgcHJvcGVydHkxOiB7cHJvcGVydHk0OiAndmFsdWUxJ30sXG4gICAgICAgIHByb3BlcnR5Mjoge3Byb3BlcnR5NTogJ3ZhbHVlMid9LFxuICAgICAgICBwcm9wZXJ0eTM6IHtwcm9wZXJ0eTY6ICd2YWx1ZTMnLCBwcm9wZXJ0eTc6ICd2YWx1ZTQnfVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG5ld09iamVjdCA9IHtcbiAgICAgICAgcHJvcGVydHkyOiB7cHJvcGVydHk1OiAndmFsdWUyJ30sXG4gICAgICAgIHByb3BlcnR5Mzoge3Byb3BlcnR5NjogJ3ZhbHVlMycsIHByb3BlcnR5NzogJ3ZhbHVlNCd9XG4gICAgICB9O1xuICAgICAgZGVsZXRlTmVzdGVkUHJvcGVydHkob3JpZ2luYWxPYmplY3QsIFsncHJvcGVydHkxJywgJ3Byb3BlcnR5NCddKTtcbiAgICAgIGFzc2VydC5lcXVhbChzdHJpbmdpZnkob3JpZ2luYWxPYmplY3QpLCBzdHJpbmdpZnkobmV3T2JqZWN0KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc3RvcHMgd2hlbiBpdCBkb2VzIG5vdCBlbXB0eSB0aGUgbGFzdCBlbGVtZW50JywgKCkgPT4ge1xuICAgICAgY29uc3Qgb3JpZ2luYWxPYmplY3QgPSB7XG4gICAgICAgIHByb3BlcnR5MToge3Byb3BlcnR5NDogJ3ZhbHVlMSd9LFxuICAgICAgICBwcm9wZXJ0eTI6IHtwcm9wZXJ0eTU6ICd2YWx1ZTInfSxcbiAgICAgICAgcHJvcGVydHkzOiB7cHJvcGVydHk2OiAndmFsdWUzJywgcHJvcGVydHk3OiAndmFsdWU0J31cbiAgICAgIH07XG4gICAgICBjb25zdCBuZXdPYmplY3QgPSB7XG4gICAgICAgIHByb3BlcnR5MToge3Byb3BlcnR5NDogJ3ZhbHVlMSd9LFxuICAgICAgICBwcm9wZXJ0eTI6IHtwcm9wZXJ0eTU6ICd2YWx1ZTInfSxcbiAgICAgICAgcHJvcGVydHkzOiB7cHJvcGVydHk2OiAndmFsdWUzJ31cbiAgICAgIH07XG4gICAgICBkZWxldGVOZXN0ZWRQcm9wZXJ0eShvcmlnaW5hbE9iamVjdCwgWydwcm9wZXJ0eTMnLCAncHJvcGVydHk3J10pO1xuICAgICAgYXNzZXJ0LmVxdWFsKHN0cmluZ2lmeShvcmlnaW5hbE9iamVjdCksIHN0cmluZ2lmeShuZXdPYmplY3QpKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2FjY2Vzc1BhdGhXaXRoRGF0dW0nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBmb28nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoYWNjZXNzUGF0aFdpdGhEYXR1bSgnZm9vJyksICdkYXR1bVtcImZvb1wiXScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBmb28uYmFyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGFjY2Vzc1BhdGhXaXRoRGF0dW0oJ2Zvby5iYXInKSwgJ2RhdHVtW1wiZm9vXCJdICYmIGRhdHVtW1wiZm9vXCJdW1wiYmFyXCJdJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHN1cHBvcnQgY3Vzb3RvbSBkYXR1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChhY2Nlc3NQYXRoV2l0aERhdHVtKCdmb28nLCAncGFyZW50JyksICdwYXJlbnRbXCJmb29cIl0nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2ZsYXRBY2Nlc3NXaXRoRGF0dW0nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSBmb28uYmFyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGZsYXRBY2Nlc3NXaXRoRGF0dW0oJ2Zvby5iYXInKSwgJ2RhdHVtW1wiZm9vLmJhclwiXScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc3RyaW5nIHZhbHVlIG9mIGZpZWxkIG5hbWUnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZmxhdEFjY2Vzc1dpdGhEYXR1bSgnZm9vW1wiYmFyXCJdLmJheicpLCAnZGF0dW1bXCJmb28uYmFyLmJhelwiXScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzdXBwb3J0IGN1c290b20gZGF0dW0nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwoZmxhdEFjY2Vzc1dpdGhEYXR1bSgnZm9vJywgJ3BhcmVudCcpLCAncGFyZW50W1wiZm9vXCJdJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdhY2Nlc3NQYXRoRGVwdGgnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gMSBpZiB0aGUgZmllbGQgaXMgbm90IG5lc3RlZCcsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChhY2Nlc3NQYXRoRGVwdGgoJ2ZvbycpLCAxKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmV0dXJuIDEgaWYgLiBpcyBlc2NhcGVkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGFjY2Vzc1BhdGhEZXB0aCgnZm9vXFxcXC5iYXInKSwgMSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiAyIGZvciBmb28uYmFyJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGFjY2Vzc1BhdGhEZXB0aCgnZm9vLmJhcicpLCAyKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3JlbW92ZVBhdGhGcm9tRmllbGQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBjb252ZXJ0IG5lc3RlZCBhY2Nlc3NlcyB0byBcXFxcLicsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChyZXBsYWNlUGF0aEluRmllbGQoJ2Zvb1tcImJhclwiXS5iYXonKSwgJ2Zvb1xcXFwuYmFyXFxcXC5iYXonKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQga2VlcCBcXFxcLicsICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChyZXBsYWNlUGF0aEluRmllbGQoJ2Zvb1xcXFwuYmFyJyksICdmb29cXFxcLmJhcicpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19 \ No newline at end of file diff --git a/build/test/validate.test.d.ts b/build/test/validate.test.d.ts new file mode 100644 index 0000000000..cb0ff5c3b5 --- /dev/null +++ b/build/test/validate.test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/build/test/validate.test.js b/build/test/validate.test.js new file mode 100644 index 0000000000..6483327b1a --- /dev/null +++ b/build/test/validate.test.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var chai_1 = require("chai"); +var mark_1 = require("../src/mark"); +var validate_1 = require("../src/validate"); +describe('vl.validate', function () { + describe('getEncodingMappingError()', function () { + it('should return no error for valid specs', function () { + chai_1.assert.isNull(validate_1.getEncodingMappingError({ + mark: mark_1.BAR, + encoding: { + x: { field: 'a', type: 'quantitative' } + } + })); + chai_1.assert.isNull(validate_1.getEncodingMappingError({ + mark: mark_1.LINE, + encoding: { + x: { field: 'b', type: 'quantitative' }, + y: { field: 'a', type: 'quantitative' } + } + })); + chai_1.assert.isNull(validate_1.getEncodingMappingError({ + mark: mark_1.AREA, + encoding: { + x: { field: 'a', type: 'quantitative' }, + y: { field: 'b', type: 'quantitative' } + } + })); + }); + it('should return error for invalid specs', function () { + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.LINE, + encoding: { + x: { field: 'b', type: 'quantitative' } // missing y + } + })); + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.AREA, + encoding: { + y: { field: 'b', type: 'quantitative' } // missing x + } + })); + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.TEXT, + encoding: { + y: { field: 'b', type: 'quantitative' } // missing text + } + })); + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.LINE, + encoding: { + shape: { field: 'b', type: 'quantitative' } // using shape with line + } + })); + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.AREA, + encoding: { + shape: { field: 'b', type: 'quantitative' } // using shape with area + } + })); + chai_1.assert.isNotNull(validate_1.getEncodingMappingError({ + mark: mark_1.BAR, + encoding: { + shape: { field: 'b', type: 'quantitative' } // using shape with bar + } + })); + }); + }); +}); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3Rlc3QvdmFsaWRhdGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE0QjtBQUM1QixvQ0FBa0Q7QUFDbEQsNENBQXdEO0FBRXhELFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLDJCQUEyQixFQUFFO1FBQ3BDLEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRTtZQUMzQyxhQUFNLENBQUMsTUFBTSxDQUFDLGtDQUF1QixDQUFDO2dCQUNwQyxJQUFJLEVBQUUsVUFBRztnQkFDVCxRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2lCQUN0QzthQUNGLENBQUMsQ0FBQyxDQUFDO1lBRUosYUFBTSxDQUFDLE1BQU0sQ0FBQyxrQ0FBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLFdBQUk7Z0JBQ1YsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztvQkFDckMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2lCQUN0QzthQUNGLENBQUMsQ0FBQyxDQUFDO1lBRUosYUFBTSxDQUFDLE1BQU0sQ0FBQyxrQ0FBdUIsQ0FBQztnQkFDcEMsSUFBSSxFQUFFLFdBQUk7Z0JBQ1YsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQztvQkFDckMsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDO2lCQUN0QzthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsdUNBQXVDLEVBQUU7WUFDMUMsYUFBTSxDQUFDLFNBQVMsQ0FBQyxrQ0FBdUIsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLFdBQUk7Z0JBQ1YsUUFBUSxFQUFFO29CQUNSLENBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLFlBQVk7aUJBQ25EO2FBQ0YsQ0FBQyxDQUFDLENBQUM7WUFFSixhQUFNLENBQUMsU0FBUyxDQUFDLGtDQUF1QixDQUFDO2dCQUN2QyxJQUFJLEVBQUUsV0FBSTtnQkFDVixRQUFRLEVBQUU7b0JBQ1IsQ0FBQyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsWUFBWTtpQkFDbkQ7YUFDRixDQUFDLENBQUMsQ0FBQztZQUVKLGFBQU0sQ0FBQyxTQUFTLENBQUMsa0NBQXVCLENBQUM7Z0JBQ3ZDLElBQUksRUFBRSxXQUFJO2dCQUNWLFFBQVEsRUFBRTtvQkFDUixDQUFDLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxlQUFlO2lCQUN0RDthQUNGLENBQUMsQ0FBQyxDQUFDO1lBRUosYUFBTSxDQUFDLFNBQVMsQ0FBQyxrQ0FBdUIsQ0FBQztnQkFDdkMsSUFBSSxFQUFFLFdBQUk7Z0JBQ1YsUUFBUSxFQUFFO29CQUNSLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBQyxDQUFDLHdCQUF3QjtpQkFDbkU7YUFDRixDQUFDLENBQUMsQ0FBQztZQUVKLGFBQU0sQ0FBQyxTQUFTLENBQUMsa0NBQXVCLENBQUM7Z0JBQ3ZDLElBQUksRUFBRSxXQUFJO2dCQUNWLFFBQVEsRUFBRTtvQkFDUixLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyx3QkFBd0I7aUJBQ25FO2FBQ0YsQ0FBQyxDQUFDLENBQUM7WUFFSixhQUFNLENBQUMsU0FBUyxDQUFDLGtDQUF1QixDQUFDO2dCQUN2QyxJQUFJLEVBQUUsVUFBRztnQkFDVCxRQUFRLEVBQUU7b0JBQ1IsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUMsdUJBQXVCO2lCQUNsRTthQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHthc3NlcnR9IGZyb20gJ2NoYWknO1xuaW1wb3J0IHtBUkVBLCBCQVIsIExJTkUsIFRFWFR9IGZyb20gJy4uL3NyYy9tYXJrJztcbmltcG9ydCB7Z2V0RW5jb2RpbmdNYXBwaW5nRXJyb3J9IGZyb20gJy4uL3NyYy92YWxpZGF0ZSc7XG5cbmRlc2NyaWJlKCd2bC52YWxpZGF0ZScsIGZ1bmN0aW9uKCkge1xuICBkZXNjcmliZSgnZ2V0RW5jb2RpbmdNYXBwaW5nRXJyb3IoKScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiBubyBlcnJvciBmb3IgdmFsaWQgc3BlY3MnLCBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydC5pc051bGwoZ2V0RW5jb2RpbmdNYXBwaW5nRXJyb3Ioe1xuICAgICAgICBtYXJrOiBCQVIsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGFzc2VydC5pc051bGwoZ2V0RW5jb2RpbmdNYXBwaW5nRXJyb3Ioe1xuICAgICAgICBtYXJrOiBMSU5FLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYScsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGFzc2VydC5pc051bGwoZ2V0RW5jb2RpbmdNYXBwaW5nRXJyb3Ioe1xuICAgICAgICBtYXJrOiBBUkVBLFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHg6IHtmaWVsZDogJ2EnLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30sXG4gICAgICAgICAgeToge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfVxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBlcnJvciBmb3IgaW52YWxpZCBzcGVjcycsIGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0LmlzTm90TnVsbChnZXRFbmNvZGluZ01hcHBpbmdFcnJvcih7XG4gICAgICAgIG1hcms6IExJTkUsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgeDoge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSAvLyBtaXNzaW5nIHlcbiAgICAgICAgfVxuICAgICAgfSkpO1xuXG4gICAgICBhc3NlcnQuaXNOb3ROdWxsKGdldEVuY29kaW5nTWFwcGluZ0Vycm9yKHtcbiAgICAgICAgbWFyazogQVJFQSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICB5OiB7ZmllbGQ6ICdiJywgdHlwZTogJ3F1YW50aXRhdGl2ZSd9IC8vIG1pc3NpbmcgeFxuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICAgIGFzc2VydC5pc05vdE51bGwoZ2V0RW5jb2RpbmdNYXBwaW5nRXJyb3Ioe1xuICAgICAgICBtYXJrOiBURVhULFxuICAgICAgICBlbmNvZGluZzoge1xuICAgICAgICAgIHk6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30gLy8gbWlzc2luZyB0ZXh0XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgYXNzZXJ0LmlzTm90TnVsbChnZXRFbmNvZGluZ01hcHBpbmdFcnJvcih7XG4gICAgICAgIG1hcms6IExJTkUsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgc2hhcGU6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30gLy8gdXNpbmcgc2hhcGUgd2l0aCBsaW5lXG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgYXNzZXJ0LmlzTm90TnVsbChnZXRFbmNvZGluZ01hcHBpbmdFcnJvcih7XG4gICAgICAgIG1hcms6IEFSRUEsXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgc2hhcGU6IHtmaWVsZDogJ2InLCB0eXBlOiAncXVhbnRpdGF0aXZlJ30gLy8gdXNpbmcgc2hhcGUgd2l0aCBhcmVhXG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgICAgYXNzZXJ0LmlzTm90TnVsbChnZXRFbmNvZGluZ01hcHBpbmdFcnJvcih7XG4gICAgICAgIG1hcms6IEJBUixcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBzaGFwZToge2ZpZWxkOiAnYicsIHR5cGU6ICdxdWFudGl0YXRpdmUnfSAvLyB1c2luZyBzaGFwZSB3aXRoIGJhclxuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0= \ No newline at end of file diff --git a/build/vega-lite.js b/build/vega-lite.js new file mode 100644 index 0000000000..bedf264182 --- /dev/null +++ b/build/vega-lite.js @@ -0,0 +1,12823 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.vl = {}))); +}(this, (function (exports) { 'use strict'; + + function accessor(fn, fields, name) { + fn.fields = fields || []; + fn.fname = name; + return fn; + } + + function error(message) { + throw Error(message); + } + + function splitAccessPath(p) { + var path = [], + q = null, + b = 0, + n = p.length, + s = '', + i, j, c; + + p = p + ''; + + function push() { + path.push(s + p.substring(i, j)); + s = ''; + i = j + 1; + } + + for (i=j=0; j i) { + push(); + } else { + i = j + 1; + } + } else if (c === '[') { + if (j > i) push(); + b = i = j + 1; + } else if (c === ']') { + if (!b) error('Access path missing open bracket: ' + p); + if (b > 0) push(); + b = 0; + i = j + 1; + } + } + + if (b) error('Access path missing closing bracket: ' + p); + if (q) error('Access path missing closing quote: ' + p); + + if (j > i) { + j++; + push(); + } + + return path; + } + + var isArray = Array.isArray; + + function isObject(_) { + return _ === Object(_); + } + + function isString(_) { + return typeof _ === 'string'; + } + + function $(x) { + return isArray(x) ? '[' + x.map($) + ']' + : isObject(x) || isString(x) ? + // Output valid JSON and JS source strings. + // See http://timelessrepo.com/json-isnt-a-javascript-subset + JSON.stringify(x).replace('\u2028','\\u2028').replace('\u2029', '\\u2029') + : x; + } + + function field(field, name) { + var path = splitAccessPath(field), + code = 'return _[' + path.map($).join('][') + '];'; + + return accessor( + Function('_', code), + [(field = path.length===1 ? path[0] : field)], + name || field + ); + } + + var empty = []; + + var id = field('id'); + + var identity = accessor(function(_) { return _; }, empty, 'identity'); + + var zero = accessor(function() { return 0; }, empty, 'zero'); + + var one = accessor(function() { return 1; }, empty, 'one'); + + var truthy = accessor(function() { return true; }, empty, 'true'); + + var falsy = accessor(function() { return false; }, empty, 'false'); + + function log(method, level, input) { + var args = [level].concat([].slice.call(input)); + console[method].apply(console, args); // eslint-disable-line no-console + } + + var None = 0; + var Error$1 = 1; + var Warn = 2; + var Info = 3; + var Debug = 4; + + function logger(_) { + var level = _ || None; + return { + level: function(_) { + if (arguments.length) { + level = +_; + return this; + } else { + return level; + } + }, + error: function() { + if (level >= Error$1) log('error', 'ERROR', arguments); + return this; + }, + warn: function() { + if (level >= Warn) log('warn', 'WARN', arguments); + return this; + }, + info: function() { + if (level >= Info) log('log', 'INFO', arguments); + return this; + }, + debug: function() { + if (level >= Debug) log('log', 'DEBUG', arguments); + return this; + } + } + } + + function isBoolean(_) { + return typeof _ === 'boolean'; + } + + function isNumber(_) { + return typeof _ === 'number'; + } + + function toSet(_) { + for (var s={}, i=0, n=_.length; i= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (!isFinite(number)) { + error$1("Bad number"); + } else { + return number; + } + }, + + string = function () { + // Parse a string value. + var hex, + i, + string = '', + uffff; + + // When parsing for string values, we must look for " and \ characters. + if (ch === '"') { + while (next()) { + if (ch === '"') { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else { + string += ch; + } + } + } + error$1("Bad string"); + }, + + white = function () { + + // Skip whitespace. + + while (ch && ch <= ' ') { + next(); + } + }, + + word = function () { + + // true, false, or null. + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error$1("Unexpected '" + ch + "'"); + }, + + value, // Place holder for the value function. + + array$1 = function () { + + // Parse an array value. + + var array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error$1("Bad array"); + }, + + object = function () { + + // Parse an object value. + + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if (Object.hasOwnProperty.call(object, key)) { + error$1('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error$1("Bad object"); + }; + + value = function () { + + // Parse a JSON value. It could be an object, an array, a string, a number, + // or a word. + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array$1(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + + // Return the json_parse function. It will have access to all of the above + // functions and variables. + + var parse = function (source, reviver) { + var result; + + text = source; + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error$1("Syntax error"); + } + + // If there is a reviver function, we recursively walk the new structure, + // passing each name/value pair to the reviver function for possible + // transformation, starting with a temporary root object that holds the result + // in an empty key. If there is not a reviver function, we simply return the + // result. + + return typeof reviver === 'function' ? (function walk(holder, key) { + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({'': result}, '')) : result; + }; + + var escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + function quote(string) { + // If the string contains no control characters, no quote characters, and no + // backslash characters, then we can safely slap some quotes around it. + // Otherwise we must also replace the offending characters with safe escape + // sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + function str(key, holder) { + // Produce a string from holder[key]. + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + + // If the value has a toJSON method, call it to obtain a replacement value. + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + + // If we were called with a replacer function, then call the replacer to + // obtain a replacement value. + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + + // What happens next depends on the value's type. + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + // JSON numbers must be finite. Encode non-finite numbers as null. + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + // If the value is a boolean or null, convert it to a string. Note: + // typeof null does not produce 'null'. The case is included here in + // the remote chance that this gets fixed someday. + return String(value); + + case 'object': + if (!value) return 'null'; + gap += indent; + partial = []; + + // Array.isArray + if (Object.prototype.toString.apply(value) === '[object Array]') { + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + + // Join all of the elements together, separated with commas, and + // wrap them in brackets. + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + + // If the replacer is an array, use it to select the members to be + // stringified. + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + else { + // Otherwise, iterate through all of the keys in the object. + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + + // Join all of the member texts together, separated with commas, + // and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + + var stringify = function (value, replacer, space) { + var i; + gap = ''; + indent = ''; + + // If the space parameter is a number, make an indent string containing that + // many spaces. + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + } + // If the space parameter is a string, it will be used as the indent string. + else if (typeof space === 'string') { + indent = space; + } + + // If there is a replacer, it must be a function or an array. + // Otherwise, throw an error. + rep = replacer; + if (replacer && typeof replacer !== 'function' + && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + + // Make a fake root object containing our value under the key of ''. + // Return the result of stringifying the value. + return str('', {'': value}); + }; + + var parse$1 = parse; + var stringify$1 = stringify; + + var jsonify = { + parse: parse$1, + stringify: stringify$1 + }; + + var json = typeof JSON !== 'undefined' ? JSON : jsonify; + + var jsonStableStringify = function (obj, opts) { + if (!opts) opts = {}; + if (typeof opts === 'function') opts = { cmp: opts }; + var space = opts.space || ''; + if (typeof space === 'number') space = Array(space+1).join(' '); + var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false; + var replacer = opts.replacer || function(key, value) { return value; }; + + var cmp = opts.cmp && (function (f) { + return function (node) { + return function (a, b) { + var aobj = { key: a, value: node[a] }; + var bobj = { key: b, value: node[b] }; + return f(aobj, bobj); + }; + }; + })(opts.cmp); + + var seen = []; + return (function stringify (parent, key, node, level) { + var indent = space ? ('\n' + new Array(level + 1).join(space)) : ''; + var colonSeparator = space ? ': ' : ':'; + + if (node && node.toJSON && typeof node.toJSON === 'function') { + node = node.toJSON(); + } + + node = replacer.call(parent, key, node); + + if (node === undefined) { + return; + } + if (typeof node !== 'object' || node === null) { + return json.stringify(node); + } + if (isArray$1(node)) { + var out = []; + for (var i = 0; i < node.length; i++) { + var item = stringify(node, i, node[i], level+1) || json.stringify(null); + out.push(indent + space + item); + } + return '[' + out.join(',') + indent + ']'; + } + else { + if (seen.indexOf(node) !== -1) { + if (cycles) return json.stringify('__cycle__'); + throw new TypeError('Converting circular structure to JSON'); + } + else seen.push(node); + + var keys = objectKeys(node).sort(cmp && cmp(node)); + var out = []; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + var value = stringify(node, key, node[key], level+1); + + if(!value) continue; + + var keyValue = json.stringify(key) + + colonSeparator + + value; + out.push(indent + space + keyValue); + } + seen.splice(seen.indexOf(node), 1); + return '{' + out.join(',') + indent + '}'; + } + })({ '': obj }, '', obj, 0); + }; + + var isArray$1 = Array.isArray || function (x) { + return {}.toString.call(x) === '[object Array]'; + }; + + var objectKeys = Object.keys || function (obj) { + var has = Object.prototype.hasOwnProperty || function () { return true }; + var keys = []; + for (var key in obj) { + if (has.call(obj, key)) keys.push(key); + } + return keys; + }; + + function isLogicalOr(op) { + return !!op.or; + } + function isLogicalAnd(op) { + return !!op.and; + } + function isLogicalNot(op) { + return !!op.not; + } + function forEachLeaf(op, fn) { + if (isLogicalNot(op)) { + forEachLeaf(op.not, fn); + } + else if (isLogicalAnd(op)) { + for (var _i = 0, _a = op.and; _i < _a.length; _i++) { + var subop = _a[_i]; + forEachLeaf(subop, fn); + } + } + else if (isLogicalOr(op)) { + for (var _b = 0, _c = op.or; _b < _c.length; _b++) { + var subop = _c[_b]; + forEachLeaf(subop, fn); + } + } + else { + fn(op); + } + } + function normalizeLogicalOperand(op, normalizer) { + if (isLogicalNot(op)) { + return { not: normalizeLogicalOperand(op.not, normalizer) }; + } + else if (isLogicalAnd(op)) { + return { and: op.and.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) }; + } + else if (isLogicalOr(op)) { + return { or: op.or.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) }; + } + else { + return normalizer(op); + } + } + + /** + * Creates an object composed of the picked object properties. + * + * Example: (from lodash) + * + * var object = {'a': 1, 'b': '2', 'c': 3}; + * pick(object, ['a', 'c']); + * // → {'a': 1, 'c': 3} + * + */ + function pick(obj, props) { + var copy = {}; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + if (obj.hasOwnProperty(prop)) { + copy[prop] = obj[prop]; + } + } + return copy; + } + /** + * The opposite of _.pick; this method creates an object composed of the own + * and inherited enumerable string keyed properties of object that are not omitted. + */ + function omit(obj, props) { + var copy = __assign({}, obj); + for (var _i = 0, props_2 = props; _i < props_2.length; _i++) { + var prop = props_2[_i]; + delete copy[prop]; + } + return copy; + } + /** + * Converts any object into a string representation that can be consumed by humans. + */ + var stringify$2 = jsonStableStringify; + /** + * Converts any object into a string of limited size, or a number. + */ + function hash(a) { + if (isNumber(a)) { + return a; + } + var str = isString(a) ? a : jsonStableStringify(a); + // short strings can be used as hash directly, longer strings are hashed to reduce memory usage + if (str.length < 100) { + return str; + } + // from http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ + var h = 0; + for (var i = 0; i < str.length; i++) { + var char = str.charCodeAt(i); + h = ((h << 5) - h) + char; + h = h & h; // Convert to 32bit integer + } + return h; + } + function contains(array$$1, item) { + return array$$1.indexOf(item) > -1; + } + /** Returns the array without the elements in item */ + function without(array$$1, excludedItems) { + return array$$1.filter(function (item) { return !contains(excludedItems, item); }); + } + function union(array$$1, other) { + return array$$1.concat(without(other, array$$1)); + } + /** + * Returns true if any item returns true. + */ + function some(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (f(arr[k], k, i++)) { + return true; + } + } + return false; + } + /** + * Returns true if all items return true. + */ + function every(arr, f) { + var i = 0; + for (var k = 0; k < arr.length; k++) { + if (!f(arr[k], k, i++)) { + return false; + } + } + return true; + } + function flatten(arrays) { + return [].concat.apply([], arrays); + } + /** + * recursively merges src into dest + */ + function mergeDeep(dest) { + var src = []; + for (var _i = 1; _i < arguments.length; _i++) { + src[_i - 1] = arguments[_i]; + } + for (var _a = 0, src_1 = src; _a < src_1.length; _a++) { + var s = src_1[_a]; + dest = deepMerge_(dest, s); + } + return dest; + } + // recursively merges src into dest + function deepMerge_(dest, src) { + if (typeof src !== 'object' || src === null) { + return dest; + } + for (var p in src) { + if (!src.hasOwnProperty(p)) { + continue; + } + if (src[p] === undefined) { + continue; + } + if (typeof src[p] !== 'object' || isArray(src[p]) || src[p] === null) { + dest[p] = src[p]; + } + else if (typeof dest[p] !== 'object' || dest[p] === null) { + dest[p] = mergeDeep(isArray(src[p].constructor) ? [] : {}, src[p]); + } + else { + mergeDeep(dest[p], src[p]); + } + } + return dest; + } + function unique(values, f) { + var results = []; + var u = {}; + var v; + for (var _i = 0, values_1 = values; _i < values_1.length; _i++) { + var val = values_1[_i]; + v = f(val); + if (v in u) { + continue; + } + u[v] = 1; + results.push(val); + } + return results; + } + /** + * Returns true if the two dictionaries disagree. Applies only to defined values. + */ + function differ(dict, other) { + for (var key$$1 in dict) { + if (dict.hasOwnProperty(key$$1)) { + if (other[key$$1] && dict[key$$1] && other[key$$1] !== dict[key$$1]) { + return true; + } + } + } + return false; + } + function hasIntersection(a, b) { + for (var key$$1 in a) { + if (key$$1 in b) { + return true; + } + } + return false; + } + function isNumeric(num) { + return !isNaN(num); + } + function differArray(array$$1, other) { + if (array$$1.length !== other.length) { + return true; + } + array$$1.sort(); + other.sort(); + for (var i = 0; i < array$$1.length; i++) { + if (other[i] !== array$$1[i]) { + return true; + } + } + return false; + } + // This is a stricter version of Object.keys but with better types. See https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208 + var keys = Object.keys; + function vals(x) { + var _vals = []; + for (var k in x) { + if (x.hasOwnProperty(k)) { + _vals.push(x[k]); + } + } + return _vals; + } + function flagKeys(f) { + return keys(f); + } + function duplicate(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isBoolean$1(b) { + return b === true || b === false; + } + /** + * Convert a string into a valid variable name + */ + function varName(s) { + // Replace non-alphanumeric characters (anything besides a-zA-Z0-9_) with _ + var alphanumericS = s.replace(/\W/g, '_'); + // Add _ if the string has leading numbers. + return (s.match(/^\d+/) ? '_' : '') + alphanumericS; + } + function logicalExpr(op, cb) { + if (isLogicalNot(op)) { + return '!(' + logicalExpr(op.not, cb) + ')'; + } + else if (isLogicalAnd(op)) { + return '(' + op.and.map(function (and) { return logicalExpr(and, cb); }).join(') && (') + ')'; + } + else if (isLogicalOr(op)) { + return '(' + op.or.map(function (or) { return logicalExpr(or, cb); }).join(') || (') + ')'; + } + else { + return cb(op); + } + } + /** + * Delete nested property of an object, and delete the ancestors of the property if they become empty. + */ + function deleteNestedProperty(obj, orderedProps) { + if (orderedProps.length === 0) { + return true; + } + var prop = orderedProps.shift(); + if (deleteNestedProperty(obj[prop], orderedProps)) { + delete obj[prop]; + } + return Object.keys(obj).length === 0; + } + function titlecase(s) { + return s.charAt(0).toUpperCase() + s.substr(1); + } + /** + * Converts a path to an access path with datum. + * @param path The field name. + * @param datum The string to use for `datum`. + */ + function accessPathWithDatum(path, datum) { + if (datum === void 0) { datum = 'datum'; } + var pieces = splitAccessPath(path); + var prefixes = []; + for (var i = 1; i <= pieces.length; i++) { + var prefix = "[" + pieces.slice(0, i).map($).join('][') + "]"; + prefixes.push("" + datum + prefix); + } + return prefixes.join(' && '); + } + /** + * Return access with datum to the falttened field. + * @param path The field name. + * @param datum The string to use for `datum`. + */ + function flatAccessWithDatum(path, datum) { + if (datum === void 0) { datum = 'datum'; } + return datum + "[" + $(splitAccessPath(path).join('.')) + "]"; + } + /** + * Replaces path accesses with access to non-nested field. + * For example, `foo["bar"].baz` becomes `foo\\.bar\\.baz`. + */ + function replacePathInField(path) { + return "" + splitAccessPath(path).map(function (p) { return p.replace('.', '\\.'); }).join('\\.'); + } + /** + * Remove path accesses with access from field. + * For example, `foo["bar"].baz` becomes `foo.bar.baz`. + */ + function removePathFromField(path) { + return "" + splitAccessPath(path).join('.'); + } + /** + * Count the depth of the path. Returns 1 for fields that are not nested. + */ + function accessPathDepth(path) { + if (!path) { + return 0; + } + return splitAccessPath(path).length; + } + + var util = /*#__PURE__*/Object.freeze({ + pick: pick, + omit: omit, + stringify: stringify$2, + hash: hash, + contains: contains, + without: without, + union: union, + some: some, + every: every, + flatten: flatten, + mergeDeep: mergeDeep, + unique: unique, + differ: differ, + hasIntersection: hasIntersection, + isNumeric: isNumeric, + differArray: differArray, + keys: keys, + vals: vals, + flagKeys: flagKeys, + duplicate: duplicate, + isBoolean: isBoolean$1, + varName: varName, + logicalExpr: logicalExpr, + deleteNestedProperty: deleteNestedProperty, + titlecase: titlecase, + accessPathWithDatum: accessPathWithDatum, + flatAccessWithDatum: flatAccessWithDatum, + replacePathInField: replacePathInField, + removePathFromField: removePathFromField, + accessPathDepth: accessPathDepth + }); + + var AGGREGATE_OP_INDEX = { + argmax: 1, + argmin: 1, + average: 1, + count: 1, + distinct: 1, + max: 1, + mean: 1, + median: 1, + min: 1, + missing: 1, + q1: 1, + q3: 1, + ci0: 1, + ci1: 1, + stderr: 1, + stdev: 1, + stdevp: 1, + sum: 1, + valid: 1, + values: 1, + variance: 1, + variancep: 1, + }; + var AGGREGATE_OPS = flagKeys(AGGREGATE_OP_INDEX); + function isAggregateOp(a) { + return !!AGGREGATE_OP_INDEX[a]; + } + var COUNTING_OPS = ['count', 'valid', 'missing', 'distinct']; + function isCountingAggregateOp(aggregate) { + return aggregate && contains(COUNTING_OPS, aggregate); + } + /** Additive-based aggregation operations. These can be applied to stack. */ + var SUM_OPS = [ + 'count', + 'sum', + 'distinct', + 'valid', + 'missing' + ]; + /** + * Aggregation operators that always produce values within the range [domainMin, domainMax]. + */ + var SHARED_DOMAIN_OPS = [ + 'mean', + 'average', + 'median', + 'q1', + 'q3', + 'min', + 'max', + ]; + var SHARED_DOMAIN_OP_INDEX = toSet(SHARED_DOMAIN_OPS); + + var aggregate = /*#__PURE__*/Object.freeze({ + AGGREGATE_OPS: AGGREGATE_OPS, + isAggregateOp: isAggregateOp, + COUNTING_OPS: COUNTING_OPS, + isCountingAggregateOp: isCountingAggregateOp, + SUM_OPS: SUM_OPS, + SHARED_DOMAIN_OPS: SHARED_DOMAIN_OPS, + SHARED_DOMAIN_OP_INDEX: SHARED_DOMAIN_OP_INDEX + }); + + var AXIS_PARTS = ['domain', 'grid', 'labels', 'ticks', 'title']; + /** + * A dictionary listing whether a certain axis property is applicable for only main axes or only grid axes. + * (Properties not listed are applicable for both) + */ + var AXIS_PROPERTY_TYPE = { + grid: 'grid', + gridScale: 'grid', + domain: 'main', + labels: 'main', + labelFlush: 'main', + labelOverlap: 'main', + minExtent: 'main', + maxExtent: 'main', + offset: 'main', + ticks: 'main', + title: 'main', + values: 'both', + scale: 'both', + zindex: 'both' // this is actually set afterward, so it doesn't matter + }; + var COMMON_AXIS_PROPERTIES_INDEX = { + orient: 1, + domain: 1, + format: 1, + grid: 1, + labelBound: 1, + labelFlush: 1, + labelPadding: 1, + labels: 1, + labelOverlap: 1, + maxExtent: 1, + minExtent: 1, + offset: 1, + position: 1, + tickCount: 1, + ticks: 1, + tickSize: 1, + title: 1, + titlePadding: 1, + values: 1, + zindex: 1, + }; + var AXIS_PROPERTIES_INDEX = __assign({}, COMMON_AXIS_PROPERTIES_INDEX, { encoding: 1, labelAngle: 1, titleMaxLength: 1 }); + var VG_AXIS_PROPERTIES_INDEX = __assign({ scale: 1 }, COMMON_AXIS_PROPERTIES_INDEX, { gridScale: 1, encode: 1 }); + function isAxisProperty(prop) { + return !!AXIS_PROPERTIES_INDEX[prop]; + } + var VG_AXIS_PROPERTIES = flagKeys(VG_AXIS_PROPERTIES_INDEX); + // Export for dependent projects + var AXIS_PROPERTIES = flagKeys(AXIS_PROPERTIES_INDEX); + + var axis = /*#__PURE__*/Object.freeze({ + AXIS_PARTS: AXIS_PARTS, + AXIS_PROPERTY_TYPE: AXIS_PROPERTY_TYPE, + isAxisProperty: isAxisProperty, + VG_AXIS_PROPERTIES: VG_AXIS_PROPERTIES, + AXIS_PROPERTIES: AXIS_PROPERTIES + }); + + /* + * Constants and utilities for encoding channels (Visual variables) + * such as 'x', 'y', 'color'. + */ + var Channel; + (function (Channel) { + // Facet + Channel.ROW = 'row'; + Channel.COLUMN = 'column'; + // Position + Channel.X = 'x'; + Channel.Y = 'y'; + Channel.X2 = 'x2'; + Channel.Y2 = 'y2'; + // Geo Position + Channel.LATITUDE = 'latitude'; + Channel.LONGITUDE = 'longitude'; + Channel.LATITUDE2 = 'latitude2'; + Channel.LONGITUDE2 = 'longitude2'; + // Mark property with scale + Channel.COLOR = 'color'; + Channel.FILL = 'fill'; + Channel.STROKE = 'stroke'; + Channel.SHAPE = 'shape'; + Channel.SIZE = 'size'; + Channel.OPACITY = 'opacity'; + // Non-scale channel + Channel.TEXT = 'text'; + Channel.ORDER = 'order'; + Channel.DETAIL = 'detail'; + Channel.KEY = 'key'; + Channel.TOOLTIP = 'tooltip'; + Channel.HREF = 'href'; + })(Channel || (Channel = {})); + var X = Channel.X; + var Y = Channel.Y; + var X2 = Channel.X2; + var Y2 = Channel.Y2; + var LATITUDE = Channel.LATITUDE; + var LATITUDE2 = Channel.LATITUDE2; + var LONGITUDE = Channel.LONGITUDE; + var LONGITUDE2 = Channel.LONGITUDE2; + var ROW = Channel.ROW; + var COLUMN = Channel.COLUMN; + var SHAPE = Channel.SHAPE; + var SIZE = Channel.SIZE; + var COLOR = Channel.COLOR; + var FILL = Channel.FILL; + var STROKE = Channel.STROKE; + var TEXT = Channel.TEXT; + var DETAIL = Channel.DETAIL; + var KEY = Channel.KEY; + var ORDER = Channel.ORDER; + var OPACITY = Channel.OPACITY; + var TOOLTIP = Channel.TOOLTIP; + var HREF = Channel.HREF; + var GEOPOSITION_CHANNEL_INDEX = { + longitude: 1, + longitude2: 1, + latitude: 1, + latitude2: 1, + }; + var GEOPOSITION_CHANNELS = flagKeys(GEOPOSITION_CHANNEL_INDEX); + var UNIT_CHANNEL_INDEX = __assign({ + // position + x: 1, y: 1, x2: 1, y2: 1 }, GEOPOSITION_CHANNEL_INDEX, { + // color + color: 1, fill: 1, stroke: 1, + // other non-position with scale + opacity: 1, size: 1, shape: 1, + // channels without scales + order: 1, text: 1, detail: 1, key: 1, tooltip: 1, href: 1 }); + function isColorChannel(channel) { + return channel === 'color' || channel === 'fill' || channel === 'stroke'; + } + var FACET_CHANNEL_INDEX = { + row: 1, + column: 1 + }; + var CHANNEL_INDEX = __assign({}, UNIT_CHANNEL_INDEX, FACET_CHANNEL_INDEX); + var CHANNELS = flagKeys(CHANNEL_INDEX); + var _o = CHANNEL_INDEX.order, _d = CHANNEL_INDEX.detail, SINGLE_DEF_CHANNEL_INDEX = __rest(CHANNEL_INDEX, ["order", "detail"]); + /** + * Channels that cannot have an array of channelDef. + * model.fieldDef, getFieldDef only work for these channels. + * + * (The only two channels that can have an array of channelDefs are "detail" and "order". + * Since there can be multiple fieldDefs for detail and order, getFieldDef/model.fieldDef + * are not applicable for them. Similarly, selection projection won't work with "detail" and "order".) + */ + var SINGLE_DEF_CHANNELS = flagKeys(SINGLE_DEF_CHANNEL_INDEX); + function isChannel(str) { + return !!CHANNEL_INDEX[str]; + } + // CHANNELS without COLUMN, ROW + var UNIT_CHANNELS = flagKeys(UNIT_CHANNEL_INDEX); + // NONPOSITION_CHANNELS = UNIT_CHANNELS without X, Y, X2, Y2; + var _x = UNIT_CHANNEL_INDEX.x, _y = UNIT_CHANNEL_INDEX.y, + // x2 and y2 share the same scale as x and y + _x2 = UNIT_CHANNEL_INDEX.x2, _y2 = UNIT_CHANNEL_INDEX.y2, _latitude = UNIT_CHANNEL_INDEX.latitude, _longitude = UNIT_CHANNEL_INDEX.longitude, _latitude2 = UNIT_CHANNEL_INDEX.latitude2, _longitude2 = UNIT_CHANNEL_INDEX.longitude2, + // The rest of unit channels then have scale + NONPOSITION_CHANNEL_INDEX = __rest(UNIT_CHANNEL_INDEX, ["x", "y", "x2", "y2", "latitude", "longitude", "latitude2", "longitude2"]); + var NONPOSITION_CHANNELS = flagKeys(NONPOSITION_CHANNEL_INDEX); + // POSITION_SCALE_CHANNELS = X and Y; + var POSITION_SCALE_CHANNEL_INDEX = { x: 1, y: 1 }; + var POSITION_SCALE_CHANNELS = flagKeys(POSITION_SCALE_CHANNEL_INDEX); + // NON_POSITION_SCALE_CHANNEL = SCALE_CHANNELS without X, Y + var + NONPOSITION_SCALE_CHANNEL_INDEX = __rest(NONPOSITION_CHANNEL_INDEX, ["text", "tooltip", "href", "detail", "key", "order"]); + var NONPOSITION_SCALE_CHANNELS = flagKeys(NONPOSITION_SCALE_CHANNEL_INDEX); + // Declare SCALE_CHANNEL_INDEX + var SCALE_CHANNEL_INDEX = __assign({}, POSITION_SCALE_CHANNEL_INDEX, NONPOSITION_SCALE_CHANNEL_INDEX); + /** List of channels with scales */ + var SCALE_CHANNELS = flagKeys(SCALE_CHANNEL_INDEX); + function isScaleChannel(channel) { + return !!SCALE_CHANNEL_INDEX[channel]; + } + /** + * Return whether a channel supports a particular mark type. + * @param channel channel name + * @param mark the mark type + * @return whether the mark supports the channel + */ + function supportMark(channel, mark) { + return mark in getSupportedMark(channel); + } + /** + * Return a dictionary showing whether a channel supports mark type. + * @param channel + * @return A dictionary mapping mark types to boolean values. + */ + function getSupportedMark(channel) { + switch (channel) { + case COLOR: + case FILL: + case STROKE: + case DETAIL: + case KEY: + case TOOLTIP: + case HREF: + case ORDER: // TODO: revise (order might not support rect, which is not stackable?) + case OPACITY: + case ROW: + case COLUMN: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, rect: true, line: true, trail: true, area: true, text: true, geoshape: true + }; + case X: + case Y: + case LATITUDE: + case LONGITUDE: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, rect: true, line: true, trail: true, area: true, text: true + }; + case X2: + case Y2: + case LATITUDE2: + case LONGITUDE2: + return { + rule: true, bar: true, rect: true, area: true + }; + case SIZE: + return { + point: true, tick: true, rule: true, circle: true, square: true, + bar: true, text: true, line: true, trail: true + }; + case SHAPE: + return { point: true, geoshape: true }; + case TEXT: + return { text: true }; + } + } + function rangeType(channel) { + switch (channel) { + case X: + case Y: + case SIZE: + case OPACITY: + // X2 and Y2 use X and Y scales, so they similarly have continuous range. + case X2: + case Y2: + return 'continuous'; + case ROW: + case COLUMN: + case SHAPE: + // TEXT, TOOLTIP, and HREF have no scale but have discrete output + case TEXT: + case TOOLTIP: + case HREF: + return 'discrete'; + // Color can be either continuous or discrete, depending on scale type. + case COLOR: + case FILL: + case STROKE: + return 'flexible'; + // No scale, no range type. + case LATITUDE: + case LONGITUDE: + case LATITUDE2: + case LONGITUDE2: + case DETAIL: + case KEY: + case ORDER: + return undefined; + } + /* istanbul ignore next: should never reach here. */ + throw new Error('rangeType not implemented for ' + channel); + } + + var channel = /*#__PURE__*/Object.freeze({ + get Channel () { return Channel; }, + X: X, + Y: Y, + X2: X2, + Y2: Y2, + LATITUDE: LATITUDE, + LATITUDE2: LATITUDE2, + LONGITUDE: LONGITUDE, + LONGITUDE2: LONGITUDE2, + ROW: ROW, + COLUMN: COLUMN, + SHAPE: SHAPE, + SIZE: SIZE, + COLOR: COLOR, + FILL: FILL, + STROKE: STROKE, + TEXT: TEXT, + DETAIL: DETAIL, + KEY: KEY, + ORDER: ORDER, + OPACITY: OPACITY, + TOOLTIP: TOOLTIP, + HREF: HREF, + GEOPOSITION_CHANNEL_INDEX: GEOPOSITION_CHANNEL_INDEX, + GEOPOSITION_CHANNELS: GEOPOSITION_CHANNELS, + isColorChannel: isColorChannel, + CHANNELS: CHANNELS, + SINGLE_DEF_CHANNELS: SINGLE_DEF_CHANNELS, + isChannel: isChannel, + UNIT_CHANNELS: UNIT_CHANNELS, + NONPOSITION_CHANNELS: NONPOSITION_CHANNELS, + POSITION_SCALE_CHANNELS: POSITION_SCALE_CHANNELS, + NONPOSITION_SCALE_CHANNELS: NONPOSITION_SCALE_CHANNELS, + SCALE_CHANNELS: SCALE_CHANNELS, + isScaleChannel: isScaleChannel, + supportMark: supportMark, + getSupportedMark: getSupportedMark, + rangeType: rangeType + }); + + function binToString(bin) { + if (isBoolean(bin)) { + return 'bin'; + } + return 'bin' + keys(bin).map(function (p) { return varName("_" + p + "_" + bin[p]); }).join(''); + } + function isBinParams(bin) { + return bin && !isBoolean(bin); + } + function autoMaxBins(channel) { + switch (channel) { + case ROW: + case COLUMN: + case SIZE: + case COLOR: + case FILL: + case STROKE: + case OPACITY: + // Facets and Size shouldn't have too many bins + // We choose 6 like shape to simplify the rule + case SHAPE: + return 6; // Vega's "shape" has 6 distinct values + default: + return 10; + } + } + + var bin = /*#__PURE__*/Object.freeze({ + binToString: binToString, + isBinParams: isBinParams, + autoMaxBins: autoMaxBins + }); + + var Mark; + (function (Mark) { + Mark.AREA = 'area'; + Mark.BAR = 'bar'; + Mark.LINE = 'line'; + Mark.POINT = 'point'; + Mark.RECT = 'rect'; + Mark.RULE = 'rule'; + Mark.TEXT = 'text'; + Mark.TICK = 'tick'; + Mark.TRAIL = 'trail'; + Mark.CIRCLE = 'circle'; + Mark.SQUARE = 'square'; + Mark.GEOSHAPE = 'geoshape'; + })(Mark || (Mark = {})); + var AREA = Mark.AREA; + var BAR = Mark.BAR; + var LINE = Mark.LINE; + var POINT = Mark.POINT; + var TEXT$1 = Mark.TEXT; + var TICK = Mark.TICK; + var TRAIL = Mark.TRAIL; + var RECT = Mark.RECT; + var RULE = Mark.RULE; + var GEOSHAPE = Mark.GEOSHAPE; + var CIRCLE = Mark.CIRCLE; + var SQUARE = Mark.SQUARE; + // Using mapped type to declare index, ensuring we always have all marks when we add more. + var MARK_INDEX = { + area: 1, + bar: 1, + line: 1, + point: 1, + text: 1, + tick: 1, + trail: 1, + rect: 1, + geoshape: 1, + rule: 1, + circle: 1, + square: 1 + }; + function isMark(m) { + return !!MARK_INDEX[m]; + } + function isPathMark(m) { + return contains(['line', 'area', 'trail'], m); + } + var PRIMITIVE_MARKS = flagKeys(MARK_INDEX); + function isMarkDef(mark) { + return mark['type']; + } + var PRIMITIVE_MARK_INDEX = toSet(PRIMITIVE_MARKS); + function isPrimitiveMark(mark) { + var markType = isMarkDef(mark) ? mark.type : mark; + return markType in PRIMITIVE_MARK_INDEX; + } + var STROKE_CONFIG = ['stroke', 'strokeWidth', + 'strokeDash', 'strokeDashOffset', 'strokeOpacity']; + var FILL_CONFIG = ['fill', 'fillOpacity']; + var FILL_STROKE_CONFIG = [].concat(STROKE_CONFIG, FILL_CONFIG); + var VL_ONLY_MARK_CONFIG_PROPERTIES = ['filled', 'color']; + var VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = { + area: ['line', 'point'], + bar: ['binSpacing', 'continuousBandSize', 'discreteBandSize'], + line: ['point'], + text: ['shortTimeLabels'], + tick: ['bandSize', 'thickness'] + }; + var defaultMarkConfig = { + color: '#4c78a8', + }; + var defaultBarConfig = { + binSpacing: 1, + continuousBandSize: 5 + }; + var defaultTickConfig = { + thickness: 1 + }; + + var mark = /*#__PURE__*/Object.freeze({ + get Mark () { return Mark; }, + AREA: AREA, + BAR: BAR, + LINE: LINE, + POINT: POINT, + TEXT: TEXT$1, + TICK: TICK, + TRAIL: TRAIL, + RECT: RECT, + RULE: RULE, + GEOSHAPE: GEOSHAPE, + CIRCLE: CIRCLE, + SQUARE: SQUARE, + isMark: isMark, + isPathMark: isPathMark, + PRIMITIVE_MARKS: PRIMITIVE_MARKS, + isMarkDef: isMarkDef, + isPrimitiveMark: isPrimitiveMark, + STROKE_CONFIG: STROKE_CONFIG, + FILL_CONFIG: FILL_CONFIG, + FILL_STROKE_CONFIG: FILL_STROKE_CONFIG, + VL_ONLY_MARK_CONFIG_PROPERTIES: VL_ONLY_MARK_CONFIG_PROPERTIES, + VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX: VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX, + defaultMarkConfig: defaultMarkConfig, + defaultBarConfig: defaultBarConfig, + defaultTickConfig: defaultTickConfig + }); + + /** + * Vega-Lite's singleton logger utility. + */ + /** + * Main (default) Vega Logger instance for Vega-Lite + */ + var main = logger(Warn); + var current = main; + /** + * Set the singleton logger to be a custom logger + */ + function set(newLogger) { + current = newLogger; + return current; + } + /** + * Reset the main logger to use the default Vega Logger + */ + function reset() { + current = main; + return current; + } + function warn() { + var _ = []; + for (var _i = 0; _i < arguments.length; _i++) { + _[_i] = arguments[_i]; + } + current.warn.apply(current, arguments); + } + function debug() { + var _ = []; + for (var _i = 0; _i < arguments.length; _i++) { + _[_i] = arguments[_i]; + } + current.debug.apply(current, arguments); + } + /** + * Collection of all Vega-Lite Error Messages + */ + var message; + (function (message) { + message.INVALID_SPEC = 'Invalid spec'; + // FIT + message.FIT_NON_SINGLE = 'Autosize "fit" only works for single views and layered views.'; + message.CANNOT_FIX_RANGE_STEP_WITH_FIT = 'Cannot use a fixed value of "rangeStep" when "autosize" is "fit".'; + // SELECTION + function cannotProjectOnChannelWithoutField(channel) { + return "Cannot project a selection on encoding channel \"" + channel + "\", which has no field."; + } + message.cannotProjectOnChannelWithoutField = cannotProjectOnChannelWithoutField; + function nearestNotSupportForContinuous(mark) { + return "The \"nearest\" transform is not supported for " + mark + " marks."; + } + message.nearestNotSupportForContinuous = nearestNotSupportForContinuous; + function selectionNotFound(name) { + return "Cannot find a selection named \"" + name + "\""; + } + message.selectionNotFound = selectionNotFound; + message.SCALE_BINDINGS_CONTINUOUS = 'Scale bindings are currently only supported for scales with unbinned, continuous domains.'; + // REPEAT + function noSuchRepeatedValue(field$$1) { + return "Unknown repeated value \"" + field$$1 + "\"."; + } + message.noSuchRepeatedValue = noSuchRepeatedValue; + // CONCAT + message.CONCAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in concatenated views.'; + // REPEAT + message.REPEAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in repeated views.'; + // TITLE + function cannotSetTitleAnchor(type) { + return "Cannot set title \"anchor\" for a " + type + " spec"; + } + message.cannotSetTitleAnchor = cannotSetTitleAnchor; + // DATA + function unrecognizedParse(p) { + return "Unrecognized parse \"" + p + "\"."; + } + message.unrecognizedParse = unrecognizedParse; + function differentParse(field$$1, local, ancestor) { + return "An ancestor parsed field \"" + field$$1 + "\" as " + ancestor + " but a child wants to parse the field as " + local + "."; + } + message.differentParse = differentParse; + // TRANSFORMS + function invalidTransformIgnored(transform) { + return "Ignoring an invalid transform: " + stringify$2(transform) + "."; + } + message.invalidTransformIgnored = invalidTransformIgnored; + message.NO_FIELDS_NEEDS_AS = 'If "from.fields" is not specified, "as" has to be a string that specifies the key to be used for the data from the secondary source.'; + // ENCODING & FACET + function encodingOverridden(channels) { + return "Layer's shared " + channels.join(',') + " channel " + (channels.length === 1 ? 'is' : 'are') + " overriden"; + } + message.encodingOverridden = encodingOverridden; + function projectionOverridden(opt) { + var parentProjection = opt.parentProjection, projection = opt.projection; + return "Layer's shared projection " + stringify$2(parentProjection) + " is overridden by a child projection " + stringify$2(projection) + "."; + } + message.projectionOverridden = projectionOverridden; + function primitiveChannelDef(channel, type, value) { + return "Channel " + channel + " is a " + type + ". Converted to {value: " + stringify$2(value) + "}."; + } + message.primitiveChannelDef = primitiveChannelDef; + function invalidFieldType(type) { + return "Invalid field type \"" + type + "\""; + } + message.invalidFieldType = invalidFieldType; + function nonZeroScaleUsedWithLengthMark(mark, channel, opt) { + var scaleText = opt.scaleType ? opt.scaleType + " scale" : + opt.zeroFalse ? 'scale with zero=false' : + 'scale with custom domain that excludes zero'; + return "A " + scaleText + " is used with " + mark + " mark. This can be misleading as the " + (channel === 'x' ? 'width' : 'height') + " of the " + mark + " can be arbitrary based on the scale domain. You may want to use point mark instead."; + } + message.nonZeroScaleUsedWithLengthMark = nonZeroScaleUsedWithLengthMark; + function invalidFieldTypeForCountAggregate(type, aggregate) { + return "Invalid field type \"" + type + "\" for aggregate: \"" + aggregate + "\", using \"quantitative\" instead."; + } + message.invalidFieldTypeForCountAggregate = invalidFieldTypeForCountAggregate; + function invalidAggregate(aggregate) { + return "Invalid aggregation operator \"" + aggregate + "\""; + } + message.invalidAggregate = invalidAggregate; + function emptyOrInvalidFieldType(type, channel, newType) { + return "Invalid field type \"" + type + "\" for channel \"" + channel + "\", using \"" + newType + "\" instead."; + } + message.emptyOrInvalidFieldType = emptyOrInvalidFieldType; + function droppingColor(type, opt) { + var fill = opt.fill, stroke = opt.stroke; + return "Dropping color " + type + " as the plot also has " + (fill && stroke ? 'fill and stroke' : fill ? 'fill' : 'stroke'); + } + message.droppingColor = droppingColor; + function emptyFieldDef(fieldDef, channel) { + return "Dropping " + stringify$2(fieldDef) + " from channel \"" + channel + "\" since it does not contain data field or value."; + } + message.emptyFieldDef = emptyFieldDef; + function latLongDeprecated(channel, type, newChannel) { + return channel + "-encoding with type " + type + " is deprecated. Replacing with " + newChannel + "-encoding."; + } + message.latLongDeprecated = latLongDeprecated; + message.LINE_WITH_VARYING_SIZE = 'Line marks cannot encode size with a non-groupby field. You may want to use trail marks instead.'; + function incompatibleChannel(channel, markOrFacet, when) { + return channel + " dropped as it is incompatible with \"" + markOrFacet + "\"" + (when ? " when " + when : '') + "."; + } + message.incompatibleChannel = incompatibleChannel; + function invalidEncodingChannel(channel) { + return channel + "-encoding is dropped as " + channel + " is not a valid encoding channel."; + } + message.invalidEncodingChannel = invalidEncodingChannel; + function facetChannelShouldBeDiscrete(channel) { + return channel + " encoding should be discrete (ordinal / nominal / binned)."; + } + message.facetChannelShouldBeDiscrete = facetChannelShouldBeDiscrete; + function discreteChannelCannotEncode(channel, type) { + return "Using discrete channel \"" + channel + "\" to encode \"" + type + "\" field can be misleading as it does not encode " + (type === 'ordinal' ? 'order' : 'magnitude') + "."; + } + message.discreteChannelCannotEncode = discreteChannelCannotEncode; + // Mark + message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL = 'Bar mark should not be used with point scale when rangeStep is null. Please use band scale instead.'; + function lineWithRange(hasX2, hasY2) { + var channels = hasX2 && hasY2 ? 'x2 and y2' : hasX2 ? 'x2' : 'y2'; + return "Line mark is for continuous lines and thus cannot be used with " + channels + ". We will use the rule mark (line segments) instead."; + } + message.lineWithRange = lineWithRange; + function unclearOrientContinuous(mark) { + return "Cannot clearly determine orientation for \"" + mark + "\" since both x and y channel encode continuous fields. In this case, we use vertical by default"; + } + message.unclearOrientContinuous = unclearOrientContinuous; + function unclearOrientDiscreteOrEmpty(mark) { + return "Cannot clearly determine orientation for \"" + mark + "\" since both x and y channel encode discrete or empty fields."; + } + message.unclearOrientDiscreteOrEmpty = unclearOrientDiscreteOrEmpty; + function orientOverridden(original, actual) { + return "Specified orient \"" + original + "\" overridden with \"" + actual + "\""; + } + message.orientOverridden = orientOverridden; + // SCALE + message.CANNOT_UNION_CUSTOM_DOMAIN_WITH_FIELD_DOMAIN = 'custom domain scale cannot be unioned with default field-based domain'; + function cannotUseScalePropertyWithNonColor(prop) { + return "Cannot use the scale property \"" + prop + "\" with non-color channel."; + } + message.cannotUseScalePropertyWithNonColor = cannotUseScalePropertyWithNonColor; + function unaggregateDomainHasNoEffectForRawField(fieldDef) { + return "Using unaggregated domain with raw field has no effect (" + stringify$2(fieldDef) + ")."; + } + message.unaggregateDomainHasNoEffectForRawField = unaggregateDomainHasNoEffectForRawField; + function unaggregateDomainWithNonSharedDomainOp(aggregate) { + return "Unaggregated domain not applicable for \"" + aggregate + "\" since it produces values outside the origin domain of the source data."; + } + message.unaggregateDomainWithNonSharedDomainOp = unaggregateDomainWithNonSharedDomainOp; + function unaggregatedDomainWithLogScale(fieldDef) { + return "Unaggregated domain is currently unsupported for log scale (" + stringify$2(fieldDef) + ")."; + } + message.unaggregatedDomainWithLogScale = unaggregatedDomainWithLogScale; + function cannotApplySizeToNonOrientedMark(mark) { + return "Cannot apply size to non-oriented mark \"" + mark + "\"."; + } + message.cannotApplySizeToNonOrientedMark = cannotApplySizeToNonOrientedMark; + function rangeStepDropped(channel) { + return "rangeStep for \"" + channel + "\" is dropped as top-level " + (channel === 'x' ? 'width' : 'height') + " is provided."; + } + message.rangeStepDropped = rangeStepDropped; + function scaleTypeNotWorkWithChannel(channel, scaleType, defaultScaleType) { + return "Channel \"" + channel + "\" does not work with \"" + scaleType + "\" scale. We are using \"" + defaultScaleType + "\" scale instead."; + } + message.scaleTypeNotWorkWithChannel = scaleTypeNotWorkWithChannel; + function scaleTypeNotWorkWithFieldDef(scaleType, defaultScaleType) { + return "FieldDef does not work with \"" + scaleType + "\" scale. We are using \"" + defaultScaleType + "\" scale instead."; + } + message.scaleTypeNotWorkWithFieldDef = scaleTypeNotWorkWithFieldDef; + function scalePropertyNotWorkWithScaleType(scaleType, propName, channel) { + return channel + "-scale's \"" + propName + "\" is dropped as it does not work with " + scaleType + " scale."; + } + message.scalePropertyNotWorkWithScaleType = scalePropertyNotWorkWithScaleType; + function scaleTypeNotWorkWithMark(mark, scaleType) { + return "Scale type \"" + scaleType + "\" does not work with mark \"" + mark + "\"."; + } + message.scaleTypeNotWorkWithMark = scaleTypeNotWorkWithMark; + function mergeConflictingProperty(property, propertyOf, v1, v2) { + return "Conflicting " + propertyOf.toString() + " property \"" + property.toString() + "\" (" + stringify$2(v1) + " and " + stringify$2(v2) + "). Using " + stringify$2(v1) + "."; + } + message.mergeConflictingProperty = mergeConflictingProperty; + function independentScaleMeansIndependentGuide(channel) { + return "Setting the scale to be independent for \"" + channel + "\" means we also have to set the guide (axis or legend) to be independent."; + } + message.independentScaleMeansIndependentGuide = independentScaleMeansIndependentGuide; + function domainSortDropped(sort) { + return "Dropping sort property " + stringify$2(sort) + " as unioned domains only support boolean or op 'count'."; + } + message.domainSortDropped = domainSortDropped; + message.UNABLE_TO_MERGE_DOMAINS = 'Unable to merge domains'; + message.MORE_THAN_ONE_SORT = 'Domains that should be unioned has conflicting sort properties. Sort will be set to true.'; + // AXIS + message.INVALID_CHANNEL_FOR_AXIS = 'Invalid channel for axis.'; + // STACK + function cannotStackRangedMark(channel) { + return "Cannot stack \"" + channel + "\" if there is already \"" + channel + "2\""; + } + message.cannotStackRangedMark = cannotStackRangedMark; + function cannotStackNonLinearScale(scaleType) { + return "Cannot stack non-linear scale (" + scaleType + ")"; + } + message.cannotStackNonLinearScale = cannotStackNonLinearScale; + function stackNonSummativeAggregate(aggregate) { + return "Stacking is applied even though the aggregate function is non-summative (\"" + aggregate + "\")"; + } + message.stackNonSummativeAggregate = stackNonSummativeAggregate; + // TIMEUNIT + function invalidTimeUnit(unitName, value) { + return "Invalid " + unitName + ": " + stringify$2(value); + } + message.invalidTimeUnit = invalidTimeUnit; + function dayReplacedWithDate(fullTimeUnit) { + return "Time unit \"" + fullTimeUnit + "\" is not supported. We are replacing it with " + fullTimeUnit.replace('day', 'date') + "."; + } + message.dayReplacedWithDate = dayReplacedWithDate; + function droppedDay(d) { + return "Dropping day from datetime " + stringify$2(d) + " as day cannot be combined with other units."; + } + message.droppedDay = droppedDay; + })(message || (message = {})); + + // DateTime definition object + /* + * A designated year that starts on Sunday. + */ + var SUNDAY_YEAR = 2006; + function isDateTime(o) { + return !!o && (!!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day || + !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds); + } + var MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']; + var SHORT_MONTHS = MONTHS.map(function (m) { return m.substr(0, 3); }); + var DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; + var SHORT_DAYS = DAYS.map(function (d) { return d.substr(0, 3); }); + function normalizeQuarter(q) { + if (isNumber(q)) { + if (q > 4) { + warn(message.invalidTimeUnit('quarter', q)); + } + // We accept 1-based quarter, so need to readjust to 0-based quarter + return (q - 1) + ''; + } + else { + // Invalid quarter + throw new Error(message.invalidTimeUnit('quarter', q)); + } + } + function normalizeMonth(m) { + if (isNumber(m)) { + // We accept 1-based month, so need to readjust to 0-based month + return (m - 1) + ''; + } + else { + var lowerM = m.toLowerCase(); + var monthIndex = MONTHS.indexOf(lowerM); + if (monthIndex !== -1) { + return monthIndex + ''; // 0 for january, ... + } + var shortM = lowerM.substr(0, 3); + var shortMonthIndex = SHORT_MONTHS.indexOf(shortM); + if (shortMonthIndex !== -1) { + return shortMonthIndex + ''; + } + // Invalid month + throw new Error(message.invalidTimeUnit('month', m)); + } + } + function normalizeDay(d) { + if (isNumber(d)) { + // mod so that this can be both 0-based where 0 = sunday + // and 1-based where 7=sunday + return (d % 7) + ''; + } + else { + var lowerD = d.toLowerCase(); + var dayIndex = DAYS.indexOf(lowerD); + if (dayIndex !== -1) { + return dayIndex + ''; // 0 for january, ... + } + var shortD = lowerD.substr(0, 3); + var shortDayIndex = SHORT_DAYS.indexOf(shortD); + if (shortDayIndex !== -1) { + return shortDayIndex + ''; + } + // Invalid day + throw new Error(message.invalidTimeUnit('day', d)); + } + } + /** + * Return Vega Expression for a particular date time. + * @param d + * @param normalize whether to normalize quarter, month, day. + */ + function dateTimeExpr(d, normalize) { + if (normalize === void 0) { normalize = false; } + var units = []; + if (normalize && d.day !== undefined) { + if (keys(d).length > 1) { + warn(message.droppedDay(d)); + d = duplicate(d); + delete d.day; + } + } + if (d.year !== undefined) { + units.push(d.year); + } + else if (d.day !== undefined) { + // Set year to 2006 for working with day since January 1 2006 is a Sunday + units.push(SUNDAY_YEAR); + } + else { + units.push(0); + } + if (d.month !== undefined) { + var month = normalize ? normalizeMonth(d.month) : d.month; + units.push(month); + } + else if (d.quarter !== undefined) { + var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter; + units.push(quarter + '*3'); + } + else { + units.push(0); // months start at zero in JS + } + if (d.date !== undefined) { + units.push(d.date); + } + else if (d.day !== undefined) { + // HACK: Day only works as a standalone unit + // This is only correct because we always set year to 2006 for day + var day = normalize ? normalizeDay(d.day) : d.day; + units.push(day + '+1'); + } + else { + units.push(1); // Date starts at 1 in JS + } + // Note: can't use TimeUnit enum here as importing it will create + // circular dependency problem! + for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) { + var timeUnit = _a[_i]; + if (d[timeUnit] !== undefined) { + units.push(d[timeUnit]); + } + else { + units.push(0); + } + } + if (d.utc) { + return "utc(" + units.join(', ') + ")"; + } + else { + return "datetime(" + units.join(', ') + ")"; + } + } + + var datetime = /*#__PURE__*/Object.freeze({ + isDateTime: isDateTime, + MONTHS: MONTHS, + SHORT_MONTHS: SHORT_MONTHS, + DAYS: DAYS, + SHORT_DAYS: SHORT_DAYS, + dateTimeExpr: dateTimeExpr + }); + + var TimeUnit; + (function (TimeUnit) { + TimeUnit.YEAR = 'year'; + TimeUnit.MONTH = 'month'; + TimeUnit.DAY = 'day'; + TimeUnit.DATE = 'date'; + TimeUnit.HOURS = 'hours'; + TimeUnit.MINUTES = 'minutes'; + TimeUnit.SECONDS = 'seconds'; + TimeUnit.MILLISECONDS = 'milliseconds'; + TimeUnit.YEARMONTH = 'yearmonth'; + TimeUnit.YEARMONTHDATE = 'yearmonthdate'; + TimeUnit.YEARMONTHDATEHOURS = 'yearmonthdatehours'; + TimeUnit.YEARMONTHDATEHOURSMINUTES = 'yearmonthdatehoursminutes'; + TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS = 'yearmonthdatehoursminutesseconds'; + // MONTHDATE always include 29 February since we use year 0th (which is a leap year); + TimeUnit.MONTHDATE = 'monthdate'; + TimeUnit.HOURSMINUTES = 'hoursminutes'; + TimeUnit.HOURSMINUTESSECONDS = 'hoursminutesseconds'; + TimeUnit.MINUTESSECONDS = 'minutesseconds'; + TimeUnit.SECONDSMILLISECONDS = 'secondsmilliseconds'; + TimeUnit.QUARTER = 'quarter'; + TimeUnit.YEARQUARTER = 'yearquarter'; + TimeUnit.QUARTERMONTH = 'quartermonth'; + TimeUnit.YEARQUARTERMONTH = 'yearquartermonth'; + TimeUnit.UTCYEAR = 'utcyear'; + TimeUnit.UTCMONTH = 'utcmonth'; + TimeUnit.UTCDAY = 'utcday'; + TimeUnit.UTCDATE = 'utcdate'; + TimeUnit.UTCHOURS = 'utchours'; + TimeUnit.UTCMINUTES = 'utcminutes'; + TimeUnit.UTCSECONDS = 'utcseconds'; + TimeUnit.UTCMILLISECONDS = 'utcmilliseconds'; + TimeUnit.UTCYEARMONTH = 'utcyearmonth'; + TimeUnit.UTCYEARMONTHDATE = 'utcyearmonthdate'; + TimeUnit.UTCYEARMONTHDATEHOURS = 'utcyearmonthdatehours'; + TimeUnit.UTCYEARMONTHDATEHOURSMINUTES = 'utcyearmonthdatehoursminutes'; + TimeUnit.UTCYEARMONTHDATEHOURSMINUTESSECONDS = 'utcyearmonthdatehoursminutesseconds'; + // MONTHDATE always include 29 February since we use year 0th (which is a leap year); + TimeUnit.UTCMONTHDATE = 'utcmonthdate'; + TimeUnit.UTCHOURSMINUTES = 'utchoursminutes'; + TimeUnit.UTCHOURSMINUTESSECONDS = 'utchoursminutesseconds'; + TimeUnit.UTCMINUTESSECONDS = 'utcminutesseconds'; + TimeUnit.UTCSECONDSMILLISECONDS = 'utcsecondsmilliseconds'; + TimeUnit.UTCQUARTER = 'utcquarter'; + TimeUnit.UTCYEARQUARTER = 'utcyearquarter'; + TimeUnit.UTCQUARTERMONTH = 'utcquartermonth'; + TimeUnit.UTCYEARQUARTERMONTH = 'utcyearquartermonth'; + })(TimeUnit || (TimeUnit = {})); + /** Time Unit that only corresponds to only one part of Date objects. */ + var LOCAL_SINGLE_TIMEUNIT_INDEX = { + year: 1, + quarter: 1, + month: 1, + day: 1, + date: 1, + hours: 1, + minutes: 1, + seconds: 1, + milliseconds: 1 + }; + var TIMEUNIT_PARTS = flagKeys(LOCAL_SINGLE_TIMEUNIT_INDEX); + function isLocalSingleTimeUnit(timeUnit) { + return !!LOCAL_SINGLE_TIMEUNIT_INDEX[timeUnit]; + } + var UTC_SINGLE_TIMEUNIT_INDEX = { + utcyear: 1, + utcquarter: 1, + utcmonth: 1, + utcday: 1, + utcdate: 1, + utchours: 1, + utcminutes: 1, + utcseconds: 1, + utcmilliseconds: 1 + }; + function isUtcSingleTimeUnit(timeUnit) { + return !!UTC_SINGLE_TIMEUNIT_INDEX[timeUnit]; + } + var LOCAL_MULTI_TIMEUNIT_INDEX = { + yearquarter: 1, + yearquartermonth: 1, + yearmonth: 1, + yearmonthdate: 1, + yearmonthdatehours: 1, + yearmonthdatehoursminutes: 1, + yearmonthdatehoursminutesseconds: 1, + quartermonth: 1, + monthdate: 1, + hoursminutes: 1, + hoursminutesseconds: 1, + minutesseconds: 1, + secondsmilliseconds: 1 + }; + var UTC_MULTI_TIMEUNIT_INDEX = { + utcyearquarter: 1, + utcyearquartermonth: 1, + utcyearmonth: 1, + utcyearmonthdate: 1, + utcyearmonthdatehours: 1, + utcyearmonthdatehoursminutes: 1, + utcyearmonthdatehoursminutesseconds: 1, + utcquartermonth: 1, + utcmonthdate: 1, + utchoursminutes: 1, + utchoursminutesseconds: 1, + utcminutesseconds: 1, + utcsecondsmilliseconds: 1 + }; + var UTC_TIMEUNIT_INDEX = __assign({}, UTC_SINGLE_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX); + function isUTCTimeUnit(t) { + return !!UTC_TIMEUNIT_INDEX[t]; + } + function getLocalTimeUnit(t) { + return t.substr(3); + } + var TIMEUNIT_INDEX = __assign({}, LOCAL_SINGLE_TIMEUNIT_INDEX, UTC_SINGLE_TIMEUNIT_INDEX, LOCAL_MULTI_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX); + var TIMEUNITS = flagKeys(TIMEUNIT_INDEX); + function isTimeUnit(t) { + return !!TIMEUNIT_INDEX[t]; + } + var SET_DATE_METHOD = { + year: 'setFullYear', + month: 'setMonth', + date: 'setDate', + hours: 'setHours', + minutes: 'setMinutes', + seconds: 'setSeconds', + milliseconds: 'setMilliseconds', + // Day and quarter have their own special cases + quarter: null, + day: null, + }; + /** + * Converts a date to only have the measurements relevant to the specified unit + * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00' + * Note: the base date is Jan 01 1900 00:00:00 + */ + function convert(unit, date) { + var isUTC = isUTCTimeUnit(unit); + var result = isUTC ? + // start with uniform date + new Date(Date.UTC(0, 0, 1, 0, 0, 0, 0)) : + new Date(0, 0, 1, 0, 0, 0, 0); + for (var _i = 0, TIMEUNIT_PARTS_1 = TIMEUNIT_PARTS; _i < TIMEUNIT_PARTS_1.length; _i++) { + var timeUnitPart = TIMEUNIT_PARTS_1[_i]; + if (containsTimeUnit(unit, timeUnitPart)) { + switch (timeUnitPart) { + case TimeUnit.DAY: + throw new Error('Cannot convert to TimeUnits containing \'day\''); + case TimeUnit.QUARTER: { + var _a = dateMethods('month', isUTC), getDateMethod_1 = _a.getDateMethod, setDateMethod_1 = _a.setDateMethod; + // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3) + result[setDateMethod_1]((Math.floor(date[getDateMethod_1]() / 3)) * 3); + break; + } + default: + var _b = dateMethods(timeUnitPart, isUTC), getDateMethod = _b.getDateMethod, setDateMethod = _b.setDateMethod; + result[setDateMethod](date[getDateMethod]()); + } + } + } + return result; + } + function dateMethods(singleUnit, isUtc) { + var rawSetDateMethod = SET_DATE_METHOD[singleUnit]; + var setDateMethod = isUtc ? 'setUTC' + rawSetDateMethod.substr(3) : rawSetDateMethod; + var getDateMethod = 'get' + (isUtc ? 'UTC' : '') + rawSetDateMethod.substr(3); + return { setDateMethod: setDateMethod, getDateMethod: getDateMethod }; + } + function getTimeUnitParts(timeUnit) { + return TIMEUNIT_PARTS.reduce(function (parts, part) { + if (containsTimeUnit(timeUnit, part)) { + return parts.concat(part); + } + return parts; + }, []); + } + /** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */ + function containsTimeUnit(fullTimeUnit, timeUnit) { + var index = fullTimeUnit.indexOf(timeUnit); + return index > -1 && + (timeUnit !== TimeUnit.SECONDS || + index === 0 || + fullTimeUnit.charAt(index - 1) !== 'i' // exclude milliseconds + ); + } + /** + * Returns Vega expresssion for a given timeUnit and fieldRef + */ + function fieldExpr(fullTimeUnit, field) { + var fieldRef = accessPathWithDatum(field); + var utc = isUTCTimeUnit(fullTimeUnit) ? 'utc' : ''; + function func(timeUnit) { + if (timeUnit === TimeUnit.QUARTER) { + // quarter starting at 0 (0,3,6,9). + return "(" + utc + "quarter(" + fieldRef + ")-1)"; + } + else { + return "" + utc + timeUnit + "(" + fieldRef + ")"; + } + } + var d = TIMEUNIT_PARTS.reduce(function (dateExpr, tu) { + if (containsTimeUnit(fullTimeUnit, tu)) { + dateExpr[tu] = func(tu); + } + return dateExpr; + }, {}); + return dateTimeExpr(d); + } + /** + * returns the signal expression used for axis labels for a time unit + */ + function formatExpression(timeUnit, field, shortTimeLabels, isUTCScale) { + if (!timeUnit) { + return undefined; + } + var dateComponents = []; + var expression = ''; + var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR); + if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) { + // special expression for quarter as prefix + expression = "'Q' + quarter(" + field + ")"; + } + if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) { + // By default use short month name + dateComponents.push(shortTimeLabels !== false ? '%b' : '%B'); + } + if (containsTimeUnit(timeUnit, TimeUnit.DAY)) { + dateComponents.push(shortTimeLabels ? '%a' : '%A'); + } + else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) { + dateComponents.push('%d' + (hasYear ? ',' : '')); // add comma if there is year + } + if (hasYear) { + dateComponents.push(shortTimeLabels ? '%y' : '%Y'); + } + var timeComponents = []; + if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) { + timeComponents.push('%H'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) { + timeComponents.push('%M'); + } + if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) { + timeComponents.push('%S'); + } + if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) { + timeComponents.push('%L'); + } + var dateTimeComponents = []; + if (dateComponents.length > 0) { + dateTimeComponents.push(dateComponents.join(' ')); + } + if (timeComponents.length > 0) { + dateTimeComponents.push(timeComponents.join(':')); + } + if (dateTimeComponents.length > 0) { + if (expression) { + // Add space between quarter and main time format + expression += " + ' ' + "; + } + // We only use utcFormat for utc scale + // For utc time units, the data is already converted as a part of timeUnit transform. + // Thus, utc time units should use timeFormat to avoid shifting the time twice. + if (isUTCScale) { + expression += "utcFormat(" + field + ", '" + dateTimeComponents.join(' ') + "')"; + } + else { + expression += "timeFormat(" + field + ", '" + dateTimeComponents.join(' ') + "')"; + } + } + // If expression is still an empty string, return undefined instead. + return expression || undefined; + } + function normalizeTimeUnit(timeUnit) { + if (timeUnit !== 'day' && timeUnit.indexOf('day') >= 0) { + warn(message.dayReplacedWithDate(timeUnit)); + return timeUnit.replace('day', 'date'); + } + return timeUnit; + } + + var timeunit = /*#__PURE__*/Object.freeze({ + get TimeUnit () { return TimeUnit; }, + TIMEUNIT_PARTS: TIMEUNIT_PARTS, + isLocalSingleTimeUnit: isLocalSingleTimeUnit, + isUtcSingleTimeUnit: isUtcSingleTimeUnit, + isUTCTimeUnit: isUTCTimeUnit, + getLocalTimeUnit: getLocalTimeUnit, + TIMEUNITS: TIMEUNITS, + isTimeUnit: isTimeUnit, + convert: convert, + getTimeUnitParts: getTimeUnitParts, + containsTimeUnit: containsTimeUnit, + fieldExpr: fieldExpr, + formatExpression: formatExpression, + normalizeTimeUnit: normalizeTimeUnit + }); + + /** Constants and utilities for data type */ + /** Data type based on level of measurement */ + var Type; + (function (Type) { + Type.QUANTITATIVE = 'quantitative'; + Type.ORDINAL = 'ordinal'; + Type.TEMPORAL = 'temporal'; + Type.NOMINAL = 'nominal'; + Type.LATITUDE = 'latitude'; + Type.LONGITUDE = 'longitude'; + Type.GEOJSON = 'geojson'; + })(Type || (Type = {})); + var TYPE_INDEX = { + quantitative: 1, + ordinal: 1, + temporal: 1, + nominal: 1, + latitude: 1, + longitude: 1, + geojson: 1 + }; + function isType(t) { + return !!TYPE_INDEX[t]; + } + var QUANTITATIVE = Type.QUANTITATIVE; + var ORDINAL = Type.ORDINAL; + var TEMPORAL = Type.TEMPORAL; + var NOMINAL = Type.NOMINAL; + var GEOJSON = Type.GEOJSON; + /** + * Get full, lowercase type name for a given type. + * @param type + * @return Full type name. + */ + function getFullName(type) { + if (type) { + type = type.toLowerCase(); + switch (type) { + case 'q': + case QUANTITATIVE: + return 'quantitative'; + case 't': + case TEMPORAL: + return 'temporal'; + case 'o': + case ORDINAL: + return 'ordinal'; + case 'n': + case NOMINAL: + return 'nominal'; + case Type.LATITUDE: + return 'latitude'; + case Type.LONGITUDE: + return 'longitude'; + case GEOJSON: + return 'geojson'; + } + } + // If we get invalid input, return undefined type. + return undefined; + } + + var type = /*#__PURE__*/Object.freeze({ + get Type () { return Type; }, + TYPE_INDEX: TYPE_INDEX, + isType: isType, + QUANTITATIVE: QUANTITATIVE, + ORDINAL: ORDINAL, + TEMPORAL: TEMPORAL, + NOMINAL: NOMINAL, + GEOJSON: GEOJSON, + getFullName: getFullName + }); + + function isConditionalSelection(c) { + return c['selection']; + } + function isRepeatRef(field$$1) { + return field$$1 && !isString(field$$1) && 'repeat' in field$$1; + } + function toFieldDefBase(fieldDef) { + var field$$1 = fieldDef.field, timeUnit = fieldDef.timeUnit, bin = fieldDef.bin, aggregate = fieldDef.aggregate; + return __assign({}, (timeUnit ? { timeUnit: timeUnit } : {}), (bin ? { bin: bin } : {}), (aggregate ? { aggregate: aggregate } : {}), { field: field$$1 }); + } + function isConditionalDef(channelDef) { + return !!channelDef && !!channelDef.condition; + } + /** + * Return if a channelDef is a ConditionalValueDef with ConditionFieldDef + */ + function hasConditionalFieldDef(channelDef) { + return !!channelDef && !!channelDef.condition && !isArray(channelDef.condition) && isFieldDef(channelDef.condition); + } + function hasConditionalValueDef(channelDef) { + return !!channelDef && !!channelDef.condition && (isArray(channelDef.condition) || isValueDef(channelDef.condition)); + } + function isFieldDef(channelDef) { + return !!channelDef && (!!channelDef['field'] || channelDef['aggregate'] === 'count'); + } + function isStringFieldDef(fieldDef) { + return isFieldDef(fieldDef) && isString(fieldDef.field); + } + function isValueDef(channelDef) { + return channelDef && 'value' in channelDef && channelDef['value'] !== undefined; + } + function isScaleFieldDef(channelDef) { + return !!channelDef && (!!channelDef['scale'] || !!channelDef['sort']); + } + function isOpFieldDef(fieldDef) { + return !!fieldDef['op']; + } + function vgField(fieldDef, opt) { + if (opt === void 0) { opt = {}; } + var field$$1 = fieldDef.field; + var prefix = opt.prefix; + var suffix = opt.suffix; + if (isCount(fieldDef)) { + field$$1 = 'count_*'; + } + else { + var fn = undefined; + if (!opt.nofn) { + if (isOpFieldDef(fieldDef)) { + fn = fieldDef.op; + } + else if (fieldDef.bin) { + fn = binToString(fieldDef.bin); + suffix = opt.binSuffix || ''; + } + else if (fieldDef.aggregate) { + fn = String(fieldDef.aggregate); + } + else if (fieldDef.timeUnit) { + fn = String(fieldDef.timeUnit); + } + } + if (fn) { + field$$1 = field$$1 ? fn + "_" + field$$1 : fn; + } + } + if (suffix) { + field$$1 = field$$1 + "_" + suffix; + } + if (prefix) { + field$$1 = prefix + "_" + field$$1; + } + if (opt.expr) { + // Expression to access flattened field. No need to escape dots. + return flatAccessWithDatum(field$$1, opt.expr); + } + else { + // We flattened all fields so paths should have become dot. + return replacePathInField(field$$1); + } + } + function isDiscrete(fieldDef) { + switch (fieldDef.type) { + case 'nominal': + case 'ordinal': + case 'geojson': + return true; + case 'quantitative': + return !!fieldDef.bin; + case 'latitude': + case 'longitude': + case 'temporal': + return false; + } + throw new Error(message.invalidFieldType(fieldDef.type)); + } + function isContinuous(fieldDef) { + return !isDiscrete(fieldDef); + } + function isCount(fieldDef) { + return fieldDef.aggregate === 'count'; + } + function verbalTitleFormatter(fieldDef, config) { + var field$$1 = fieldDef.field, bin = fieldDef.bin, timeUnit = fieldDef.timeUnit, aggregate = fieldDef.aggregate; + if (aggregate === 'count') { + return config.countTitle; + } + else if (bin) { + return field$$1 + " (binned)"; + } + else if (timeUnit) { + var units = getTimeUnitParts(timeUnit).join('-'); + return field$$1 + " (" + units + ")"; + } + else if (aggregate) { + return titlecase(aggregate) + " of " + field$$1; + } + return field$$1; + } + function functionalTitleFormatter(fieldDef, config) { + var fn = fieldDef.aggregate || fieldDef.timeUnit || (fieldDef.bin && 'bin'); + if (fn) { + return fn.toUpperCase() + '(' + fieldDef.field + ')'; + } + else { + return fieldDef.field; + } + } + var defaultTitleFormatter = function (fieldDef, config) { + switch (config.fieldTitle) { + case 'plain': + return fieldDef.field; + case 'functional': + return functionalTitleFormatter(fieldDef, config); + default: + return verbalTitleFormatter(fieldDef, config); + } + }; + var titleFormatter = defaultTitleFormatter; + function setTitleFormatter(formatter) { + titleFormatter = formatter; + } + function resetTitleFormatter() { + setTitleFormatter(defaultTitleFormatter); + } + function title(fieldDef, config) { + return titleFormatter(fieldDef, config); + } + function defaultType(fieldDef, channel) { + if (fieldDef.timeUnit) { + return 'temporal'; + } + if (fieldDef.bin) { + return 'quantitative'; + } + switch (rangeType(channel)) { + case 'continuous': + return 'quantitative'; + case 'discrete': + return 'nominal'; + case 'flexible': // color + return 'nominal'; + default: + return 'quantitative'; + } + } + /** + * Returns the fieldDef -- either from the outer channelDef or from the condition of channelDef. + * @param channelDef + */ + function getFieldDef(channelDef) { + if (isFieldDef(channelDef)) { + return channelDef; + } + else if (hasConditionalFieldDef(channelDef)) { + return channelDef.condition; + } + return undefined; + } + /** + * Convert type to full, lowercase type, or augment the fieldDef with a default type if missing. + */ + function normalize(channelDef, channel) { + if (isString(channelDef) || isNumber(channelDef) || isBoolean(channelDef)) { + var primitiveType = isString(channelDef) ? 'string' : + isNumber(channelDef) ? 'number' : 'boolean'; + warn(message.primitiveChannelDef(channel, primitiveType, channelDef)); + return { value: channelDef }; + } + // If a fieldDef contains a field, we need type. + if (isFieldDef(channelDef)) { + return normalizeFieldDef(channelDef, channel); + } + else if (hasConditionalFieldDef(channelDef)) { + return __assign({}, channelDef, { + // Need to cast as normalizeFieldDef normally return FieldDef, but here we know that it is definitely Condition + condition: normalizeFieldDef(channelDef.condition, channel) }); + } + return channelDef; + } + function normalizeFieldDef(fieldDef, channel) { + // Drop invalid aggregate + if (fieldDef.aggregate && !isAggregateOp(fieldDef.aggregate)) { + var aggregate = fieldDef.aggregate, fieldDefWithoutAggregate = __rest(fieldDef, ["aggregate"]); + warn(message.invalidAggregate(fieldDef.aggregate)); + fieldDef = fieldDefWithoutAggregate; + } + // Normalize Time Unit + if (fieldDef.timeUnit) { + fieldDef = __assign({}, fieldDef, { timeUnit: normalizeTimeUnit(fieldDef.timeUnit) }); + } + // Normalize bin + if (fieldDef.bin) { + fieldDef = __assign({}, fieldDef, { bin: normalizeBin(fieldDef.bin, channel) }); + } + // Normalize Type + if (fieldDef.type) { + var fullType = getFullName(fieldDef.type); + if (fieldDef.type !== fullType) { + // convert short type to full type + fieldDef = __assign({}, fieldDef, { type: fullType }); + } + if (fieldDef.type !== 'quantitative') { + if (isCountingAggregateOp(fieldDef.aggregate)) { + warn(message.invalidFieldTypeForCountAggregate(fieldDef.type, fieldDef.aggregate)); + fieldDef = __assign({}, fieldDef, { type: 'quantitative' }); + } + } + } + else { + // If type is empty / invalid, then augment with default type + var newType = defaultType(fieldDef, channel); + warn(message.emptyOrInvalidFieldType(fieldDef.type, channel, newType)); + fieldDef = __assign({}, fieldDef, { type: newType }); + } + var _a = channelCompatibility(fieldDef, channel), compatible = _a.compatible, warning = _a.warning; + if (!compatible) { + warn(warning); + } + return fieldDef; + } + function normalizeBin(bin, channel) { + if (isBoolean(bin)) { + return { maxbins: autoMaxBins(channel) }; + } + else if (!bin.maxbins && !bin.step) { + return __assign({}, bin, { maxbins: autoMaxBins(channel) }); + } + else { + return bin; + } + } + var COMPATIBLE = { compatible: true }; + function channelCompatibility(fieldDef, channel) { + var type = fieldDef.type; + switch (channel) { + case 'row': + case 'column': + if (isContinuous(fieldDef)) { + return { + compatible: false, + warning: message.facetChannelShouldBeDiscrete(channel) + }; + } + return COMPATIBLE; + case 'x': + case 'y': + case 'color': + case 'fill': + case 'stroke': + case 'text': + case 'detail': + case 'key': + case 'tooltip': + case 'href': + return COMPATIBLE; + case 'longitude': + case 'longitude2': + case 'latitude': + case 'latitude2': + if (type !== QUANTITATIVE) { + return { + compatible: false, + warning: "Channel " + channel + " should be used with a quantitative field only, not " + fieldDef.type + " field." + }; + } + return COMPATIBLE; + case 'opacity': + case 'size': + case 'x2': + case 'y2': + if ((type === 'nominal' && !fieldDef['sort']) || type === 'geojson') { + return { + compatible: false, + warning: "Channel " + channel + " should not be used with an unsorted discrete field." + }; + } + return COMPATIBLE; + case 'shape': + if (fieldDef.type !== 'nominal' && fieldDef.type !== 'geojson') { + return { + compatible: false, + warning: 'Shape channel should be used with only either nominal or geojson data' + }; + } + return COMPATIBLE; + case 'order': + if (fieldDef.type === 'nominal') { + return { + compatible: false, + warning: "Channel order is inappropriate for nominal field, which has no inherent order." + }; + } + return COMPATIBLE; + } + throw new Error('channelCompatability not implemented for channel ' + channel); + } + function isNumberFieldDef(fieldDef) { + return fieldDef.type === 'quantitative' || !!fieldDef.bin; + } + function isTimeFieldDef(fieldDef) { + return fieldDef.type === 'temporal' || !!fieldDef.timeUnit; + } + + var fielddef = /*#__PURE__*/Object.freeze({ + isConditionalSelection: isConditionalSelection, + isRepeatRef: isRepeatRef, + toFieldDefBase: toFieldDefBase, + isConditionalDef: isConditionalDef, + hasConditionalFieldDef: hasConditionalFieldDef, + hasConditionalValueDef: hasConditionalValueDef, + isFieldDef: isFieldDef, + isStringFieldDef: isStringFieldDef, + isValueDef: isValueDef, + isScaleFieldDef: isScaleFieldDef, + vgField: vgField, + isDiscrete: isDiscrete, + isContinuous: isContinuous, + isCount: isCount, + verbalTitleFormatter: verbalTitleFormatter, + functionalTitleFormatter: functionalTitleFormatter, + defaultTitleFormatter: defaultTitleFormatter, + setTitleFormatter: setTitleFormatter, + resetTitleFormatter: resetTitleFormatter, + title: title, + defaultType: defaultType, + getFieldDef: getFieldDef, + normalize: normalize, + normalizeFieldDef: normalizeFieldDef, + normalizeBin: normalizeBin, + channelCompatibility: channelCompatibility, + isNumberFieldDef: isNumberFieldDef, + isTimeFieldDef: isTimeFieldDef + }); + + function channelHasField(encoding, channel) { + var channelDef = encoding && encoding[channel]; + if (channelDef) { + if (isArray(channelDef)) { + return some(channelDef, function (fieldDef) { return !!fieldDef.field; }); + } + else { + return isFieldDef(channelDef) || hasConditionalFieldDef(channelDef); + } + } + return false; + } + function isAggregate(encoding) { + return some(CHANNELS, function (channel) { + if (channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + if (isArray(channelDef)) { + return some(channelDef, function (fieldDef) { return !!fieldDef.aggregate; }); + } + else { + var fieldDef = getFieldDef(channelDef); + return fieldDef && !!fieldDef.aggregate; + } + } + return false; + }); + } + function normalizeEncoding(encoding, mark) { + return keys(encoding).reduce(function (normalizedEncoding, channel) { + var _a; + if (!isChannel(channel)) { + // Drop invalid channel + warn(message.invalidEncodingChannel(channel)); + return normalizedEncoding; + } + if (!supportMark(channel, mark)) { + // Drop unsupported channel + warn(message.incompatibleChannel(channel, mark)); + return normalizedEncoding; + } + // Drop line's size if the field is aggregated. + if (channel === 'size' && mark === 'line') { + var fieldDef = getFieldDef(encoding[channel]); + if (fieldDef && fieldDef.aggregate) { + warn(message.LINE_WITH_VARYING_SIZE); + return normalizedEncoding; + } + } + // Drop color if either fill or stroke is specified + if (channel === 'color' && ('fill' in encoding || 'stroke' in encoding)) { + warn(message.droppingColor('encoding', { fill: 'fill' in encoding, stroke: 'stroke' in encoding })); + return normalizedEncoding; + } + var channelDef = encoding[channel]; + if (channel === 'detail' || + (channel === 'order' && !isArray(channelDef) && !isValueDef(channelDef)) || + (channel === 'tooltip' && isArray(channelDef))) { + if (channelDef) { + // Array of fieldDefs for detail channel (or production rule) + normalizedEncoding[channel] = (isArray(channelDef) ? channelDef : [channelDef]) + .reduce(function (defs, fieldDef) { + if (!isFieldDef(fieldDef)) { + warn(message.emptyFieldDef(fieldDef, channel)); + } + else { + defs.push(normalizeFieldDef(fieldDef, channel)); + } + return defs; + }, []); + } + } + else { + var fieldDef = getFieldDef(encoding[channel]); + if (fieldDef && contains([Type.LATITUDE, Type.LONGITUDE], fieldDef.type)) { + var _b = channel, _ = normalizedEncoding[_b], newEncoding = __rest(normalizedEncoding, [typeof _b === "symbol" ? _b : _b + ""]); + var newChannel = channel === 'x' ? 'longitude' : + channel === 'y' ? 'latitude' : + channel === 'x2' ? 'longitude2' : + channel === 'y2' ? 'latitude2' : undefined; + warn(message.latLongDeprecated(channel, fieldDef.type, newChannel)); + return __assign({}, newEncoding, (_a = {}, _a[newChannel] = __assign({}, normalize(fieldDef, channel), { type: 'quantitative' }), _a)); + } + if (!isFieldDef(channelDef) && !isValueDef(channelDef) && !isConditionalDef(channelDef)) { + warn(message.emptyFieldDef(channelDef, channel)); + return normalizedEncoding; + } + normalizedEncoding[channel] = normalize(channelDef, channel); + } + return normalizedEncoding; + }, {}); + } + function isRanged(encoding) { + return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2)); + } + function fieldDefs(encoding) { + var arr = []; + CHANNELS.forEach(function (channel) { + if (channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (def) { + if (isFieldDef(def)) { + arr.push(def); + } + else if (hasConditionalFieldDef(def)) { + arr.push(def.condition); + } + }); + } + }); + return arr; + } + function forEach(mapping, f, thisArg) { + if (!mapping) { + return; + } + var _loop_1 = function (channel) { + if (isArray(mapping[channel])) { + mapping[channel].forEach(function (channelDef) { + f.call(thisArg, channelDef, channel); + }); + } + else { + f.call(thisArg, mapping[channel], channel); + } + }; + for (var _i = 0, _a = keys(mapping); _i < _a.length; _i++) { + var channel = _a[_i]; + _loop_1(channel); + } + } + function reduce(mapping, f, init, thisArg) { + if (!mapping) { + return init; + } + return keys(mapping).reduce(function (r, channel) { + var map = mapping[channel]; + if (isArray(map)) { + return map.reduce(function (r1, channelDef) { + return f.call(thisArg, r1, channelDef, channel); + }, r); + } + else { + return f.call(thisArg, r, map, channel); + } + }, init); + } + + var encoding = /*#__PURE__*/Object.freeze({ + channelHasField: channelHasField, + isAggregate: isAggregate, + normalizeEncoding: normalizeEncoding, + isRanged: isRanged, + fieldDefs: fieldDefs, + forEach: forEach, + reduce: reduce + }); + + function getMarkSpecificConfigMixins(markSpecificConfig, channel) { + var _a; + var value = markSpecificConfig[channel]; + return value !== undefined ? (_a = {}, _a[channel] = { value: value }, _a) : {}; + } + + var BOXPLOT = 'box-plot'; + function isBoxPlotDef(mark) { + return !!mark['type']; + } + var BOXPLOT_STYLES = ['boxWhisker', 'box', 'boxMid']; + var VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX = { + box: ['size', 'color', 'extent'], + boxWhisker: ['color'], + boxMid: ['color'] + }; + var supportedChannels = ['x', 'y', 'color', 'detail', 'opacity', 'size']; + function filterUnsupportedChannels(spec) { + return __assign({}, spec, { encoding: reduce(spec.encoding, function (newEncoding, fieldDef, channel) { + if (supportedChannels.indexOf(channel) > -1) { + newEncoding[channel] = fieldDef; + } + else { + warn(message.incompatibleChannel(channel, BOXPLOT)); + } + return newEncoding; + }, {}) }); + } + function normalizeBoxPlot(spec, config) { + var _a, _b, _c, _d; + spec = filterUnsupportedChannels(spec); + // TODO: use selection + var mark = spec.mark, encoding = spec.encoding, selection = spec.selection, _p = spec.projection, outerSpec = __rest(spec, ["mark", "encoding", "selection", "projection"]); + var kIQRScalar = undefined; + if (isNumber(config.box.extent)) { + kIQRScalar = config.box.extent; + } + if (isBoxPlotDef(mark)) { + if (mark.extent) { + if (mark.extent === 'min-max') { + kIQRScalar = undefined; + } + } + } + var orient = boxOrient(spec); + var _e = boxParams(spec, orient, kIQRScalar), transform = _e.transform, continuousAxisChannelDef = _e.continuousAxisChannelDef, continuousAxis = _e.continuousAxis, encodingWithoutContinuousAxis = _e.encodingWithoutContinuousAxis; + var size = encodingWithoutContinuousAxis.size, encodingWithoutSizeColorAndContinuousAxis = __rest(encodingWithoutContinuousAxis, ["color", "size"]); + // Size encoding or the default config.box.size is applied to box and boxMid + var sizeMixins = size ? { size: size } : getMarkSpecificConfigMixins(config.box, 'size'); + var continuousAxisScaleAndAxis = {}; + if (continuousAxisChannelDef.scale) { + continuousAxisScaleAndAxis['scale'] = continuousAxisChannelDef.scale; + } + if (continuousAxisChannelDef.axis) { + continuousAxisScaleAndAxis['axis'] = continuousAxisChannelDef.axis; + } + return __assign({}, outerSpec, { transform: transform, layer: [ + { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + encoding: __assign((_a = {}, _a[continuousAxis] = __assign({ field: 'lower_whisker_' + continuousAxisChannelDef.field, type: continuousAxisChannelDef.type }, continuousAxisScaleAndAxis), _a[continuousAxis + '2'] = { + field: 'lower_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _a), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxWhisker, 'color')) + }, { + mark: { + type: 'rule', + style: 'boxWhisker' + }, + encoding: __assign((_b = {}, _b[continuousAxis] = { + field: 'upper_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _b[continuousAxis + '2'] = { + field: 'upper_whisker_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _b), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxWhisker, 'color')) + }, + __assign({}, (selection ? { selection: selection } : {}), { mark: { + type: 'bar', + style: 'box' + }, encoding: __assign((_c = {}, _c[continuousAxis] = { + field: 'lower_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _c[continuousAxis + '2'] = { + field: 'upper_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _c), encodingWithoutContinuousAxis, (encodingWithoutContinuousAxis.color ? {} : getMarkSpecificConfigMixins(config.box, 'color')), sizeMixins) }), + { + mark: { + type: 'tick', + style: 'boxMid' + }, + encoding: __assign((_d = {}, _d[continuousAxis] = { + field: 'mid_box_' + continuousAxisChannelDef.field, + type: continuousAxisChannelDef.type + }, _d), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxMid, 'color'), sizeMixins) + } + ] }); + } + function boxOrient(spec) { + var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = __rest(spec, ["mark", "encoding", "projection"]); + if (isFieldDef(encoding.x) && isContinuous(encoding.x)) { + // x is continuous + if (isFieldDef(encoding.y) && isContinuous(encoding.y)) { + // both x and y are continuous + if (encoding.x.aggregate === undefined && encoding.y.aggregate === BOXPLOT) { + return 'vertical'; + } + else if (encoding.y.aggregate === undefined && encoding.x.aggregate === BOXPLOT) { + return 'horizontal'; + } + else if (encoding.x.aggregate === BOXPLOT && encoding.y.aggregate === BOXPLOT) { + throw new Error('Both x and y cannot have aggregate'); + } + else { + if (isBoxPlotDef(mark) && mark.orient) { + return mark.orient; + } + // default orientation = vertical + return 'vertical'; + } + } + // x is continuous but y is not + return 'horizontal'; + } + else if (isFieldDef(encoding.y) && isContinuous(encoding.y)) { + // y is continuous but x is not + return 'vertical'; + } + else { + // Neither x nor y is continuous. + throw new Error('Need a valid continuous axis for boxplots'); + } + } + function boxContinousAxis(spec, orient) { + var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = __rest(spec, ["mark", "encoding", "projection"]); + var continuousAxisChannelDef; + var continuousAxis; + if (orient === 'vertical') { + continuousAxis = 'y'; + continuousAxisChannelDef = encoding.y; // Safe to cast because if y is not continuous fielddef, the orient would not be vertical. + } + else { + continuousAxis = 'x'; + continuousAxisChannelDef = encoding.x; // Safe to cast because if x is not continuous fielddef, the orient would not be horizontal. + } + if (continuousAxisChannelDef && continuousAxisChannelDef.aggregate) { + var aggregate = continuousAxisChannelDef.aggregate, continuousAxisWithoutAggregate = __rest(continuousAxisChannelDef, ["aggregate"]); + if (aggregate !== BOXPLOT) { + warn("Continuous axis should not have customized aggregation function " + aggregate); + } + continuousAxisChannelDef = continuousAxisWithoutAggregate; + } + return { + continuousAxisChannelDef: continuousAxisChannelDef, + continuousAxis: continuousAxis + }; + } + function boxParams(spec, orient, kIQRScalar) { + var _a = boxContinousAxis(spec, orient), continuousAxisChannelDef = _a.continuousAxisChannelDef, continuousAxis = _a.continuousAxis; + var encoding = spec.encoding; + var isMinMax = kIQRScalar === undefined; + var aggregate = [ + { + op: 'q1', + field: continuousAxisChannelDef.field, + as: 'lower_box_' + continuousAxisChannelDef.field + }, + { + op: 'q3', + field: continuousAxisChannelDef.field, + as: 'upper_box_' + continuousAxisChannelDef.field + }, + { + op: 'median', + field: continuousAxisChannelDef.field, + as: 'mid_box_' + continuousAxisChannelDef.field + } + ]; + var postAggregateCalculates = []; + aggregate.push({ + op: 'min', + field: continuousAxisChannelDef.field, + as: (isMinMax ? 'lower_whisker_' : 'min_') + continuousAxisChannelDef.field + }); + aggregate.push({ + op: 'max', + field: continuousAxisChannelDef.field, + as: (isMinMax ? 'upper_whisker_' : 'max_') + continuousAxisChannelDef.field + }); + if (!isMinMax) { + postAggregateCalculates = [ + { + calculate: "datum.upper_box_" + continuousAxisChannelDef.field + " - datum.lower_box_" + continuousAxisChannelDef.field, + as: 'iqr_' + continuousAxisChannelDef.field + }, + { + calculate: "min(datum.upper_box_" + continuousAxisChannelDef.field + " + datum.iqr_" + continuousAxisChannelDef.field + " * " + kIQRScalar + ", datum.max_" + continuousAxisChannelDef.field + ")", + as: 'upper_whisker_' + continuousAxisChannelDef.field + }, + { + calculate: "max(datum.lower_box_" + continuousAxisChannelDef.field + " - datum.iqr_" + continuousAxisChannelDef.field + " * " + kIQRScalar + ", datum.min_" + continuousAxisChannelDef.field + ")", + as: 'lower_whisker_' + continuousAxisChannelDef.field + } + ]; + } + var groupby = []; + var bins = []; + var timeUnits = []; + var encodingWithoutContinuousAxis = {}; + forEach(encoding, function (channelDef, channel) { + if (channel === continuousAxis) { + // Skip continuous axis as we already handle it separately + return; + } + if (isFieldDef(channelDef)) { + if (channelDef.aggregate && channelDef.aggregate !== BOXPLOT) { + aggregate.push({ + op: channelDef.aggregate, + field: channelDef.field, + as: vgField(channelDef) + }); + } + else if (channelDef.aggregate === undefined) { + var transformedField = vgField(channelDef); + // Add bin or timeUnit transform if applicable + var bin = channelDef.bin; + if (bin) { + var field$$1 = channelDef.field; + bins.push({ bin: bin, field: field$$1, as: transformedField }); + } + else if (channelDef.timeUnit) { + var timeUnit = channelDef.timeUnit, field$$1 = channelDef.field; + timeUnits.push({ timeUnit: timeUnit, field: field$$1, as: transformedField }); + } + groupby.push(transformedField); + } + // now the field should refer to post-transformed field instead + encodingWithoutContinuousAxis[channel] = { + field: vgField(channelDef), + type: channelDef.type + }; + } + else { + // For value def, just copy + encodingWithoutContinuousAxis[channel] = encoding[channel]; + } + }); + return { + transform: [].concat(bins, timeUnits, [{ aggregate: aggregate, groupby: groupby }], postAggregateCalculates), + continuousAxisChannelDef: continuousAxisChannelDef, + continuousAxis: continuousAxis, + encodingWithoutContinuousAxis: encodingWithoutContinuousAxis + }; + } + + var ERRORBAR = 'error-bar'; + function normalizeErrorBar(spec) { + // TODO: use selection + var _m = spec.mark, _sel = spec.selection, _p = spec.projection, encoding = spec.encoding, outerSpec = __rest(spec, ["mark", "selection", "projection", "encoding"]); + var _s = encoding.size, encodingWithoutSize = __rest(encoding, ["size"]); + var _x2 = encoding.x2, _y2 = encoding.y2, encodingWithoutX2Y2 = __rest(encoding, ["x2", "y2"]); + var encodingWithoutX_X2_Y_Y2 = __rest(encodingWithoutX2Y2, ["x", "y"]); + if (!encoding.x2 && !encoding.y2) { + throw new Error('Neither x2 or y2 provided'); + } + return __assign({}, outerSpec, { layer: [ + { + mark: 'rule', + encoding: encodingWithoutSize + }, { + mark: 'tick', + encoding: encodingWithoutX2Y2 + }, { + mark: 'tick', + encoding: encoding.x2 ? __assign({ x: encoding.x2, y: encoding.y }, encodingWithoutX_X2_Y_Y2) : __assign({ x: encoding.x, y: encoding.y2 }, encodingWithoutX_X2_Y_Y2) + } + ] }); + } + + /** + * Registry index for all composite mark's normalizer + */ + var normalizerRegistry = {}; + function add(mark, normalizer) { + normalizerRegistry[mark] = normalizer; + } + function remove(mark) { + delete normalizerRegistry[mark]; + } + var COMPOSITE_MARK_STYLES = BOXPLOT_STYLES; + var VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = __assign({}, VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX); + add(BOXPLOT, normalizeBoxPlot); + add(ERRORBAR, normalizeErrorBar); + /** + * Transform a unit spec with composite mark into a normal layer spec. + */ + function normalize$1( + // This GenericUnitSpec has any as Encoding because unit specs with composite mark can have additional encoding channels. + spec, config) { + var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var normalizer = normalizerRegistry[mark]; + if (normalizer) { + return normalizer(spec, config); + } + throw new Error("Invalid mark type \"" + mark + "\""); + } + + var index = /*#__PURE__*/Object.freeze({ + add: add, + remove: remove, + COMPOSITE_MARK_STYLES: COMPOSITE_MARK_STYLES, + VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX: VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX, + normalize: normalize$1 + }); + + var VL_ONLY_GUIDE_CONFIG = ['shortTimeLabels']; + + var defaultLegendConfig = {}; + var COMMON_LEGEND_PROPERTY_INDEX = { + entryPadding: 1, + format: 1, + offset: 1, + orient: 1, + padding: 1, + tickCount: 1, + title: 1, + type: 1, + values: 1, + zindex: 1 + }; + var VG_LEGEND_PROPERTY_INDEX = __assign({}, COMMON_LEGEND_PROPERTY_INDEX, { + // channel scales + opacity: 1, shape: 1, stroke: 1, fill: 1, size: 1, + // encode + encode: 1 }); + var LEGEND_PROPERTIES = flagKeys(COMMON_LEGEND_PROPERTY_INDEX); + var VG_LEGEND_PROPERTIES = flagKeys(VG_LEGEND_PROPERTY_INDEX); + + var legend = /*#__PURE__*/Object.freeze({ + defaultLegendConfig: defaultLegendConfig, + LEGEND_PROPERTIES: LEGEND_PROPERTIES, + VG_LEGEND_PROPERTIES: VG_LEGEND_PROPERTIES + }); + + var ScaleType; + (function (ScaleType) { + // Continuous - Quantitative + ScaleType.LINEAR = 'linear'; + ScaleType.BIN_LINEAR = 'bin-linear'; + ScaleType.LOG = 'log'; + ScaleType.POW = 'pow'; + ScaleType.SQRT = 'sqrt'; + // Continuous - Time + ScaleType.TIME = 'time'; + ScaleType.UTC = 'utc'; + // sequential + ScaleType.SEQUENTIAL = 'sequential'; + // Quantile, Quantize, threshold + ScaleType.QUANTILE = 'quantile'; + ScaleType.QUANTIZE = 'quantize'; + ScaleType.THRESHOLD = 'threshold'; + ScaleType.ORDINAL = 'ordinal'; + ScaleType.BIN_ORDINAL = 'bin-ordinal'; + ScaleType.POINT = 'point'; + ScaleType.BAND = 'band'; + })(ScaleType || (ScaleType = {})); + /** + * Index for scale categories -- only scale of the same categories can be merged together. + * Current implementation is trying to be conservative and avoid merging scale type that might not work together + */ + var SCALE_CATEGORY_INDEX = { + linear: 'numeric', + log: 'numeric', + pow: 'numeric', + sqrt: 'numeric', + 'bin-linear': 'bin-linear', + time: 'time', + utc: 'time', + sequential: 'sequential', + ordinal: 'ordinal', + 'bin-ordinal': 'bin-ordinal', + point: 'ordinal-position', + band: 'ordinal-position' + }; + var SCALE_TYPES = keys(SCALE_CATEGORY_INDEX); + /** + * Whether the two given scale types can be merged together. + */ + function scaleCompatible(scaleType1, scaleType2) { + var scaleCategory1 = SCALE_CATEGORY_INDEX[scaleType1]; + var scaleCategory2 = SCALE_CATEGORY_INDEX[scaleType2]; + return scaleCategory1 === scaleCategory2 || + (scaleCategory1 === 'ordinal-position' && scaleCategory2 === 'time') || + (scaleCategory2 === 'ordinal-position' && scaleCategory1 === 'time'); + } + /** + * Index for scale precedence -- high score = higher priority for merging. + */ + var SCALE_PRECEDENCE_INDEX = { + // numeric + linear: 0, + log: 1, + pow: 1, + sqrt: 1, + // time + time: 0, + utc: 0, + // ordinal-position -- these have higher precedence than continuous scales as they support more types of data + point: 10, + band: 11, + // non grouped types + 'bin-linear': 0, + sequential: 0, + ordinal: 0, + 'bin-ordinal': 0, + }; + /** + * Return scale categories -- only scale of the same categories can be merged together. + */ + function scaleTypePrecedence(scaleType) { + return SCALE_PRECEDENCE_INDEX[scaleType]; + } + var CONTINUOUS_TO_CONTINUOUS_SCALES = ['linear', 'bin-linear', 'log', 'pow', 'sqrt', 'time', 'utc']; + var CONTINUOUS_TO_CONTINUOUS_INDEX = toSet(CONTINUOUS_TO_CONTINUOUS_SCALES); + var CONTINUOUS_DOMAIN_SCALES = CONTINUOUS_TO_CONTINUOUS_SCALES.concat(['sequential' /* TODO add 'quantile', 'quantize', 'threshold'*/]); + var CONTINUOUS_DOMAIN_INDEX = toSet(CONTINUOUS_DOMAIN_SCALES); + var DISCRETE_DOMAIN_SCALES = ['ordinal', 'bin-ordinal', 'point', 'band']; + var DISCRETE_DOMAIN_INDEX = toSet(DISCRETE_DOMAIN_SCALES); + var BIN_SCALES_INDEX = toSet(['bin-linear', 'bin-ordinal']); + var TIME_SCALE_TYPES = ['time', 'utc']; + function hasDiscreteDomain(type) { + return type in DISCRETE_DOMAIN_INDEX; + } + function isBinScale(type) { + return type in BIN_SCALES_INDEX; + } + function hasContinuousDomain(type) { + return type in CONTINUOUS_DOMAIN_INDEX; + } + function isContinuousToContinuous(type) { + return type in CONTINUOUS_TO_CONTINUOUS_INDEX; + } + var defaultScaleConfig = { + textXRangeStep: 90, + rangeStep: 21, + pointPadding: 0.5, + bandPaddingInner: 0.1, + facetSpacing: 16, + minBandSize: 2, + minFontSize: 8, + maxFontSize: 40, + minOpacity: 0.3, + maxOpacity: 0.8, + // FIXME: revise if these *can* become ratios of rangeStep + minSize: 9, + minStrokeWidth: 1, + maxStrokeWidth: 4 + }; + function isExtendedScheme(scheme) { + return scheme && !!scheme['name']; + } + function isSelectionDomain(domain) { + return domain && domain['selection']; + } + var SCALE_PROPERTY_INDEX = { + type: 1, + domain: 1, + range: 1, + rangeStep: 1, + scheme: 1, + // Other properties + reverse: 1, + round: 1, + // quantitative / time + clamp: 1, + nice: 1, + // quantitative + base: 1, + exponent: 1, + interpolate: 1, + zero: 1, + // band/point + padding: 1, + paddingInner: 1, + paddingOuter: 1 + }; + var SCALE_PROPERTIES = flagKeys(SCALE_PROPERTY_INDEX); + var NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX = __rest(SCALE_PROPERTY_INDEX, ["type", "domain", "range", "rangeStep", "scheme"]); + var NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES = flagKeys(NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX); + var SCALE_TYPE_INDEX = generateScaleTypeIndex(); + function scaleTypeSupportProperty(scaleType, propName) { + switch (propName) { + case 'type': + case 'domain': + case 'reverse': + case 'range': + return true; + case 'scheme': + return contains(['sequential', 'ordinal', 'bin-ordinal', 'quantile', 'quantize'], scaleType); + case 'interpolate': + // FIXME(https://github.com/vega/vega-lite/issues/2902) how about ordinal? + return contains(['linear', 'bin-linear', 'pow', 'log', 'sqrt', 'utc', 'time'], scaleType); + case 'round': + return isContinuousToContinuous(scaleType) || scaleType === 'band' || scaleType === 'point'; + case 'padding': + return isContinuousToContinuous(scaleType) || contains(['point', 'band'], scaleType); + case 'paddingOuter': + case 'rangeStep': + return contains(['point', 'band'], scaleType); + case 'paddingInner': + return scaleType === 'band'; + case 'clamp': + return isContinuousToContinuous(scaleType) || scaleType === 'sequential'; + case 'nice': + return isContinuousToContinuous(scaleType) || scaleType === 'sequential' || scaleType === 'quantize'; + case 'exponent': + return scaleType === 'pow'; + case 'base': + return scaleType === 'log'; + case 'zero': + return hasContinuousDomain(scaleType) && !contains([ + 'log', + 'time', 'utc', + 'bin-linear', + 'threshold', + 'quantile' // quantile depends on distribution so zero does not matter + ], scaleType); + } + /* istanbul ignore next: should never reach here*/ + throw new Error("Invalid scale property " + propName + "."); + } + /** + * Returns undefined if the input channel supports the input scale property name + */ + function channelScalePropertyIncompatability(channel, propName) { + switch (propName) { + case 'interpolate': + case 'scheme': + if (!isColorChannel(channel)) { + return message.cannotUseScalePropertyWithNonColor(channel); + } + return undefined; + case 'type': + case 'domain': + case 'range': + case 'base': + case 'exponent': + case 'nice': + case 'padding': + case 'paddingInner': + case 'paddingOuter': + case 'rangeStep': + case 'reverse': + case 'round': + case 'clamp': + case 'zero': + return undefined; // GOOD! + } + /* istanbul ignore next: it should never reach here */ + throw new Error("Invalid scale property \"" + propName + "\"."); + } + function scaleTypeSupportDataType(specifiedType, fieldDefType, bin) { + if (contains([Type.ORDINAL, Type.NOMINAL], fieldDefType)) { + return specifiedType === undefined || hasDiscreteDomain(specifiedType); + } + else if (fieldDefType === Type.TEMPORAL) { + return contains([ScaleType.TIME, ScaleType.UTC, ScaleType.SEQUENTIAL, undefined], specifiedType); + } + else if (fieldDefType === Type.QUANTITATIVE) { + if (bin) { + return contains([ScaleType.BIN_LINEAR, ScaleType.BIN_ORDINAL, ScaleType.LINEAR], specifiedType); + } + return contains([ScaleType.LOG, ScaleType.POW, ScaleType.SQRT, ScaleType.QUANTILE, ScaleType.QUANTIZE, ScaleType.LINEAR, ScaleType.SEQUENTIAL, undefined], specifiedType); + } + return true; + } + function channelSupportScaleType(channel, scaleType) { + switch (channel) { + case Channel.X: + case Channel.Y: + case Channel.SIZE: // TODO: size and opacity can support ordinal with more modification + case Channel.OPACITY: + // Although it generally doesn't make sense to use band with size and opacity, + // it can also work since we use band: 0.5 to get midpoint. + return isContinuousToContinuous(scaleType) || contains(['band', 'point'], scaleType); + case Channel.COLOR: + case Channel.FILL: + case Channel.STROKE: + return scaleType !== 'band'; // band does not make sense with color + case Channel.SHAPE: + return scaleType === 'ordinal'; // shape = lookup only + } + /* istanbul ignore next: it should never reach here */ + return false; + } + function getSupportedScaleType(channel, fieldDefType, bin) { + return SCALE_TYPE_INDEX[generateScaleTypeIndexKey(channel, fieldDefType, bin)]; + } + // generates ScaleTypeIndex where keys are encoding channels and values are list of valid ScaleTypes + function generateScaleTypeIndex() { + var index = {}; + for (var _i = 0, CHANNELS_1 = CHANNELS; _i < CHANNELS_1.length; _i++) { + var channel = CHANNELS_1[_i]; + for (var _a = 0, _b = keys(TYPE_INDEX); _a < _b.length; _a++) { + var fieldDefType = _b[_a]; + for (var _c = 0, SCALE_TYPES_1 = SCALE_TYPES; _c < SCALE_TYPES_1.length; _c++) { + var scaleType = SCALE_TYPES_1[_c]; + for (var _d = 0, _e = [false, true]; _d < _e.length; _d++) { + var bin = _e[_d]; + var key$$1 = generateScaleTypeIndexKey(channel, fieldDefType, bin); + if (channelSupportScaleType(channel, scaleType) && scaleTypeSupportDataType(scaleType, fieldDefType, bin)) { + index[key$$1] = index[key$$1] || []; + index[key$$1].push(scaleType); + } + } + } + } + } + return index; + } + function generateScaleTypeIndexKey(channel, fieldDefType, bin) { + var key$$1 = channel + '_' + fieldDefType; + return bin ? key$$1 + '_bin' : key$$1; + } + + var scale = /*#__PURE__*/Object.freeze({ + get ScaleType () { return ScaleType; }, + SCALE_TYPES: SCALE_TYPES, + scaleCompatible: scaleCompatible, + scaleTypePrecedence: scaleTypePrecedence, + CONTINUOUS_TO_CONTINUOUS_SCALES: CONTINUOUS_TO_CONTINUOUS_SCALES, + CONTINUOUS_DOMAIN_SCALES: CONTINUOUS_DOMAIN_SCALES, + DISCRETE_DOMAIN_SCALES: DISCRETE_DOMAIN_SCALES, + TIME_SCALE_TYPES: TIME_SCALE_TYPES, + hasDiscreteDomain: hasDiscreteDomain, + isBinScale: isBinScale, + hasContinuousDomain: hasContinuousDomain, + isContinuousToContinuous: isContinuousToContinuous, + defaultScaleConfig: defaultScaleConfig, + isExtendedScheme: isExtendedScheme, + isSelectionDomain: isSelectionDomain, + SCALE_PROPERTIES: SCALE_PROPERTIES, + NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES: NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES, + SCALE_TYPE_INDEX: SCALE_TYPE_INDEX, + scaleTypeSupportProperty: scaleTypeSupportProperty, + channelScalePropertyIncompatability: channelScalePropertyIncompatability, + scaleTypeSupportDataType: scaleTypeSupportDataType, + channelSupportScaleType: channelSupportScaleType, + getSupportedScaleType: getSupportedScaleType + }); + + var SELECTION_ID = '_vgsid_'; + var defaultConfig = { + single: { + on: 'click', + fields: [SELECTION_ID], + resolve: 'global', + empty: 'all' + }, + multi: { + on: 'click', + fields: [SELECTION_ID], + toggle: 'event.shiftKey', + resolve: 'global', + empty: 'all' + }, + interval: { + on: '[mousedown, window:mouseup] > window:mousemove!', + encodings: ['x', 'y'], + translate: '[mousedown, window:mouseup] > window:mousemove!', + zoom: 'wheel!', + mark: { fill: '#333', fillOpacity: 0.125, stroke: 'white' }, + resolve: 'global' + } + }; + + function extractTitleConfig(titleConfig) { + var + // These are non-mark title config that need to be hardcoded + anchor = titleConfig.anchor, offset = titleConfig.offset, orient = titleConfig.orient, + // color needs to be redirect to fill + color = titleConfig.color, + // The rest are mark config. + titleMarkConfig = __rest(titleConfig, ["anchor", "offset", "orient", "color"]); + var mark = __assign({}, titleMarkConfig, color ? { fill: color } : {}); + var nonMark = __assign({}, anchor ? { anchor: anchor } : {}, offset ? { offset: offset } : {}, orient ? { orient: orient } : {}); + return { mark: mark, nonMark: nonMark }; + } + + var defaultViewConfig = { + width: 200, + height: 200 + }; + var defaultConfig$1 = { + padding: 5, + timeFormat: '', + countTitle: 'Number of Records', + invalidValues: 'filter', + view: defaultViewConfig, + mark: defaultMarkConfig, + area: {}, + bar: defaultBarConfig, + circle: {}, + geoshape: {}, + line: {}, + point: {}, + rect: {}, + rule: { color: 'black' }, + square: {}, + text: { color: 'black' }, + tick: defaultTickConfig, + trail: {}, + box: { size: 14, extent: 1.5 }, + boxWhisker: {}, + boxMid: { color: 'white' }, + scale: defaultScaleConfig, + projection: {}, + axis: {}, + axisX: {}, + axisY: { minExtent: 30 }, + axisLeft: {}, + axisRight: {}, + axisTop: {}, + axisBottom: {}, + axisBand: {}, + legend: defaultLegendConfig, + selection: defaultConfig, + style: {}, + title: {}, + }; + function initConfig(config) { + return mergeDeep(duplicate(defaultConfig$1), config); + } + var MARK_STYLES = ['view'].concat(PRIMITIVE_MARKS, COMPOSITE_MARK_STYLES); + var VL_ONLY_CONFIG_PROPERTIES = [ + 'padding', 'numberFormat', 'timeFormat', 'countTitle', + 'stack', 'scale', 'selection', 'invalidValues', + 'overlay' // FIXME: Redesign and unhide this + ]; + var VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = __assign({ view: ['width', 'height'] }, VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX, VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX); + function stripAndRedirectConfig(config) { + config = duplicate(config); + for (var _i = 0, VL_ONLY_CONFIG_PROPERTIES_1 = VL_ONLY_CONFIG_PROPERTIES; _i < VL_ONLY_CONFIG_PROPERTIES_1.length; _i++) { + var prop = VL_ONLY_CONFIG_PROPERTIES_1[_i]; + delete config[prop]; + } + // Remove Vega-Lite only axis/legend config + if (config.axis) { + for (var _a = 0, VL_ONLY_GUIDE_CONFIG_1 = VL_ONLY_GUIDE_CONFIG; _a < VL_ONLY_GUIDE_CONFIG_1.length; _a++) { + var prop = VL_ONLY_GUIDE_CONFIG_1[_a]; + delete config.axis[prop]; + } + } + if (config.legend) { + for (var _b = 0, VL_ONLY_GUIDE_CONFIG_2 = VL_ONLY_GUIDE_CONFIG; _b < VL_ONLY_GUIDE_CONFIG_2.length; _b++) { + var prop = VL_ONLY_GUIDE_CONFIG_2[_b]; + delete config.legend[prop]; + } + } + // Remove Vega-Lite only generic mark config + if (config.mark) { + for (var _c = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_1 = VL_ONLY_MARK_CONFIG_PROPERTIES; _c < VL_ONLY_MARK_CONFIG_PROPERTIES_1.length; _c++) { + var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_1[_c]; + delete config.mark[prop]; + } + } + for (var _d = 0, MARK_STYLES_1 = MARK_STYLES; _d < MARK_STYLES_1.length; _d++) { + var markType = MARK_STYLES_1[_d]; + // Remove Vega-Lite-only mark config + for (var _e = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_2 = VL_ONLY_MARK_CONFIG_PROPERTIES; _e < VL_ONLY_MARK_CONFIG_PROPERTIES_2.length; _e++) { + var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_2[_e]; + delete config[markType][prop]; + } + // Remove Vega-Lite only mark-specific config + var vlOnlyMarkSpecificConfigs = VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX[markType]; + if (vlOnlyMarkSpecificConfigs) { + for (var _f = 0, vlOnlyMarkSpecificConfigs_1 = vlOnlyMarkSpecificConfigs; _f < vlOnlyMarkSpecificConfigs_1.length; _f++) { + var prop = vlOnlyMarkSpecificConfigs_1[_f]; + delete config[markType][prop]; + } + } + // Redirect mark config to config.style so that mark config only affect its own mark type + // without affecting other marks that share the same underlying Vega marks. + // For example, config.rect should not affect bar marks. + redirectConfig(config, markType); + } + // Redirect config.title -- so that title config do not + // affect header labels, which also uses `title` directive to implement. + redirectConfig(config, 'title', 'group-title'); + // Remove empty config objects + for (var prop in config) { + if (isObject(config[prop]) && keys(config[prop]).length === 0) { + delete config[prop]; + } + } + return keys(config).length > 0 ? config : undefined; + } + function redirectConfig(config, prop, toProp) { + var propConfig = prop === 'title' ? extractTitleConfig(config.title).mark : config[prop]; + if (prop === 'view') { + toProp = 'cell'; // View's default style is "cell" + } + var style = __assign({}, propConfig, config.style[prop]); + // set config.style if it is not an empty object + if (keys(style).length > 0) { + config.style[toProp || prop] = style; + } + delete config[prop]; + } + + var config = /*#__PURE__*/Object.freeze({ + defaultViewConfig: defaultViewConfig, + defaultConfig: defaultConfig$1, + initConfig: initConfig, + stripAndRedirectConfig: stripAndRedirectConfig + }); + + var STACK_OFFSET_INDEX = { + zero: 1, + center: 1, + normalize: 1 + }; + function isStackOffset(s) { + return !!STACK_OFFSET_INDEX[s]; + } + var STACKABLE_MARKS = [BAR, AREA, RULE, POINT, CIRCLE, SQUARE, LINE, TEXT$1, TICK]; + var STACK_BY_DEFAULT_MARKS = [BAR, AREA]; + function potentialStackedChannel(encoding) { + var xDef = encoding.x; + var yDef = encoding.y; + if (isFieldDef(xDef) && isFieldDef(yDef)) { + if (xDef.type === 'quantitative' && yDef.type === 'quantitative') { + if (xDef.stack) { + return 'x'; + } + else if (yDef.stack) { + return 'y'; + } + // if there is no explicit stacking, only apply stack if there is only one aggregate for x or y + if ((!!xDef.aggregate) !== (!!yDef.aggregate)) { + return xDef.aggregate ? 'x' : 'y'; + } + } + else if (xDef.type === 'quantitative') { + return 'x'; + } + else if (yDef.type === 'quantitative') { + return 'y'; + } + } + else if (isFieldDef(xDef) && xDef.type === 'quantitative') { + return 'x'; + } + else if (isFieldDef(yDef) && yDef.type === 'quantitative') { + return 'y'; + } + return undefined; + } + // Note: CompassQL uses this method and only pass in required properties of each argument object. + // If required properties change, make sure to update CompassQL. + function stack(m, encoding, stackConfig) { + var mark = isMarkDef(m) ? m.type : m; + // Should have stackable mark + if (!contains(STACKABLE_MARKS, mark)) { + return null; + } + var fieldChannel = potentialStackedChannel(encoding); + if (!fieldChannel) { + return null; + } + var stackedFieldDef = encoding[fieldChannel]; + var stackedField = isStringFieldDef(stackedFieldDef) ? vgField(stackedFieldDef, {}) : undefined; + var dimensionChannel = fieldChannel === 'x' ? 'y' : 'x'; + var dimensionDef = encoding[dimensionChannel]; + var dimensionField = isStringFieldDef(dimensionDef) ? vgField(dimensionDef, {}) : undefined; + // Should have grouping level of detail that is different from the dimension field + var stackBy = NONPOSITION_CHANNELS.reduce(function (sc, channel) { + if (channelHasField(encoding, channel)) { + var channelDef = encoding[channel]; + (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (cDef) { + var fieldDef = getFieldDef(cDef); + if (fieldDef.aggregate) { + return; + } + // Check whether the channel's field is identical to x/y's field or if the channel is a repeat + var f = isStringFieldDef(fieldDef) ? vgField(fieldDef, {}) : undefined; + if ( + // if fielddef is a repeat, just include it in the stack by + !f || + // otherwise, the field must be different from x and y fields. + (f !== dimensionField && f !== stackedField)) { + sc.push({ channel: channel, fieldDef: fieldDef }); + } + }); + } + return sc; + }, []); + if (stackBy.length === 0) { + return null; + } + // Automatically determine offset + var offset = undefined; + if (stackedFieldDef.stack !== undefined) { + offset = stackedFieldDef.stack; + } + else if (contains(STACK_BY_DEFAULT_MARKS, mark)) { + // Bar and Area with sum ops are automatically stacked by default + offset = stackConfig === undefined ? 'zero' : stackConfig; + } + else { + offset = stackConfig; + } + if (!offset || !isStackOffset(offset)) { + return null; + } + // warn when stacking non-linear + if (stackedFieldDef.scale && stackedFieldDef.scale.type && stackedFieldDef.scale.type !== ScaleType.LINEAR) { + warn(message.cannotStackNonLinearScale(stackedFieldDef.scale.type)); + } + // Check if it is a ranged mark + if (channelHasField(encoding, fieldChannel === X ? X2 : Y2)) { + warn(message.cannotStackRangedMark(fieldChannel)); + return null; + } + // Warn if stacking summative aggregate + if (stackedFieldDef.aggregate && !contains(SUM_OPS, stackedFieldDef.aggregate)) { + warn(message.stackNonSummativeAggregate(stackedFieldDef.aggregate)); + } + return { + groupbyChannel: dimensionDef ? dimensionChannel : undefined, + fieldChannel: fieldChannel, + impute: isPathMark(mark), + stackBy: stackBy, + offset: offset + }; + } + + var stack$1 = /*#__PURE__*/Object.freeze({ + isStackOffset: isStackOffset, + STACKABLE_MARKS: STACKABLE_MARKS, + STACK_BY_DEFAULT_MARKS: STACK_BY_DEFAULT_MARKS, + stack: stack + }); + + /* Custom type guards */ + function isFacetSpec(spec) { + return spec['facet'] !== undefined; + } + function isUnitSpec(spec) { + return !!spec['mark']; + } + function isLayerSpec(spec) { + return spec['layer'] !== undefined; + } + function isRepeatSpec(spec) { + return spec['repeat'] !== undefined; + } + function isConcatSpec(spec) { + return isVConcatSpec(spec) || isHConcatSpec(spec); + } + function isVConcatSpec(spec) { + return spec['vconcat'] !== undefined; + } + function isHConcatSpec(spec) { + return spec['hconcat'] !== undefined; + } + /** + * Decompose extended unit specs into composition of pure unit specs. + */ + // TODO: consider moving this to another file. Maybe vl.spec.normalize or vl.normalize + function normalize$2(spec, config) { + if (isFacetSpec(spec)) { + return normalizeFacet(spec, config); + } + if (isLayerSpec(spec)) { + return normalizeLayer(spec, config); + } + if (isRepeatSpec(spec)) { + return normalizeRepeat(spec, config); + } + if (isVConcatSpec(spec)) { + return normalizeVConcat(spec, config); + } + if (isHConcatSpec(spec)) { + return normalizeHConcat(spec, config); + } + if (isUnitSpec(spec)) { + var hasRow = channelHasField(spec.encoding, ROW); + var hasColumn = channelHasField(spec.encoding, COLUMN); + if (hasRow || hasColumn) { + return normalizeFacetedUnit(spec, config); + } + return normalizeNonFacetUnit(spec, config); + } + throw new Error(message.INVALID_SPEC); + } + function normalizeFacet(spec, config) { + var subspec = spec.spec, rest = __rest(spec, ["spec"]); + return __assign({}, rest, { + // TODO: remove "any" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760 + spec: normalize$2(subspec, config) }); + } + function mergeEncoding(opt) { + var parentEncoding = opt.parentEncoding, encoding = opt.encoding; + if (parentEncoding && encoding) { + var overriden = keys(parentEncoding).reduce(function (o, key$$1) { + if (encoding[key$$1]) { + o.push(key$$1); + } + return o; + }, []); + if (overriden.length > 0) { + warn(message.encodingOverridden(overriden)); + } + } + var merged = __assign({}, (parentEncoding || {}), (encoding || {})); + return keys(merged).length > 0 ? merged : undefined; + } + function mergeProjection(opt) { + var parentProjection = opt.parentProjection, projection = opt.projection; + if (parentProjection && projection) { + warn(message.projectionOverridden({ parentProjection: parentProjection, projection: projection })); + } + return projection || parentProjection; + } + function normalizeLayer(spec, config, parentEncoding, parentProjection) { + var layer = spec.layer, encoding = spec.encoding, projection = spec.projection, rest = __rest(spec, ["layer", "encoding", "projection"]); + var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding }); + var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection }); + return __assign({}, rest, { layer: layer.map(function (subspec) { + if (isLayerSpec(subspec)) { + return normalizeLayer(subspec, config, mergedEncoding, mergedProjection); + } + return normalizeNonFacetUnit(subspec, config, mergedEncoding, mergedProjection); + }) }); + } + function normalizeRepeat(spec, config) { + var subspec = spec.spec, rest = __rest(spec, ["spec"]); + return __assign({}, rest, { spec: normalize$2(subspec, config) }); + } + function normalizeVConcat(spec, config) { + var vconcat = spec.vconcat, rest = __rest(spec, ["vconcat"]); + return __assign({}, rest, { vconcat: vconcat.map(function (subspec) { return normalize$2(subspec, config); }) }); + } + function normalizeHConcat(spec, config) { + var hconcat = spec.hconcat, rest = __rest(spec, ["hconcat"]); + return __assign({}, rest, { hconcat: hconcat.map(function (subspec) { return normalize$2(subspec, config); }) }); + } + function normalizeFacetedUnit(spec, config) { + // New encoding in the inside spec should not contain row / column + // as row/column should be moved to facet + var _a = spec.encoding, row = _a.row, column = _a.column, encoding = __rest(_a, ["row", "column"]); + // Mark and encoding should be moved into the inner spec + var mark = spec.mark, width = spec.width, projection = spec.projection, height = spec.height, selection = spec.selection, _ = spec.encoding, outerSpec = __rest(spec, ["mark", "width", "projection", "height", "selection", "encoding"]); + return __assign({}, outerSpec, { facet: __assign({}, (row ? { row: row } : {}), (column ? { column: column } : {})), spec: normalizeNonFacetUnit(__assign({}, (projection ? { projection: projection } : {}), { mark: mark }, (width ? { width: width } : {}), (height ? { height: height } : {}), { encoding: encoding }, (selection ? { selection: selection } : {})), config) }); + } + function isNonFacetUnitSpecWithPrimitiveMark(spec) { + return isPrimitiveMark(spec.mark); + } + function getPointOverlay(markDef, markConfig, encoding) { + if (markDef.point === 'transparent') { + return { opacity: 0 }; + } + else if (markDef.point) { // truthy : true or object + return isObject(markDef.point) ? markDef.point : {}; + } + else if (markDef.point !== undefined) { // false or null + return null; + } + else { // undefined (not disabled) + if (markConfig.point || encoding.shape) { + // enable point overlay if config[mark].point is truthy or if encoding.shape is provided + return isObject(markConfig.point) ? markConfig.point : {}; + } + // markDef.point is defined as falsy + return null; + } + } + function getLineOverlay(markDef, markConfig) { + if (markDef.line) { // true or object + return markDef.line === true ? {} : markDef.line; + } + else if (markDef.line !== undefined) { // false or null + return null; + } + else { // undefined (not disabled) + if (markConfig.line) { + // enable line overlay if config[mark].line is truthy + return markConfig.line === true ? {} : markConfig.line; + } + // markDef.point is defined as falsy + return null; + } + } + function normalizeNonFacetUnit(spec, config, parentEncoding, parentProjection) { + var encoding = spec.encoding, projection = spec.projection; + var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + // merge parent encoding / projection first + if (parentEncoding || parentProjection) { + var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection }); + var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding }); + return normalizeNonFacetUnit(__assign({}, spec, (mergedProjection ? { projection: mergedProjection } : {}), (mergedEncoding ? { encoding: mergedEncoding } : {})), config); + } + if (isNonFacetUnitSpecWithPrimitiveMark(spec)) { + // TODO: thoroughly test + if (isRanged(encoding)) { + return normalizeRangedUnit(spec); + } + if (mark === 'line' && (encoding.x2 || encoding.y2)) { + warn(message.lineWithRange(!!encoding.x2, !!encoding.y2)); + return normalizeNonFacetUnit(__assign({ mark: 'rule' }, spec), config, parentEncoding, parentProjection); + } + if (isPathMark(mark)) { + return normalizePathOverlay(spec, config); + } + return spec; // Nothing to normalize + } + else { + return normalize$1(spec, config); + } + } + function normalizeRangedUnit(spec) { + var hasX = channelHasField(spec.encoding, X); + var hasY = channelHasField(spec.encoding, Y); + var hasX2 = channelHasField(spec.encoding, X2); + var hasY2 = channelHasField(spec.encoding, Y2); + if ((hasX2 && !hasX) || (hasY2 && !hasY)) { + var normalizedSpec = duplicate(spec); + if (hasX2 && !hasX) { + normalizedSpec.encoding.x = normalizedSpec.encoding.x2; + delete normalizedSpec.encoding.x2; + } + if (hasY2 && !hasY) { + normalizedSpec.encoding.y = normalizedSpec.encoding.y2; + delete normalizedSpec.encoding.y2; + } + return normalizedSpec; + } + return spec; + } + function dropLineAndPoint(markDef) { + var _point = markDef.point, _line = markDef.line, mark = __rest(markDef, ["point", "line"]); + return keys(mark).length > 1 ? mark : mark.type; + } + function normalizePathOverlay(spec, config) { + var _a; + if (config === void 0) { config = {}; } + // _ is used to denote a dropped property of the unit spec + // which should not be carried over to the layer spec + var selection = spec.selection, projection = spec.projection, encoding = spec.encoding, mark = spec.mark, outerSpec = __rest(spec, ["selection", "projection", "encoding", "mark"]); + var markDef = isMarkDef(mark) ? mark : { type: mark }; + var pointOverlay = getPointOverlay(markDef, config[markDef.type], encoding); + var lineOverlay = markDef.type === 'area' && getLineOverlay(markDef, config[markDef.type]); + if (!pointOverlay && !lineOverlay) { + return __assign({}, spec, { + // Do not include point / line overlay in the normalize spec + mark: dropLineAndPoint(markDef) }); + } + var layer = [__assign({}, (selection ? { selection: selection } : {}), { + // Do not include point / line overlay in the normalize spec + mark: dropLineAndPoint(__assign({}, markDef, (markDef.type === 'area' ? { opacity: 0.7 } : {}))), + // drop shape from encoding as this might be used to trigger point overlay + encoding: omit(encoding, ['shape']) })]; + // FIXME: disable tooltip for the line layer if tooltip is not group-by field. + // FIXME: determine rules for applying selections. + // Need to copy stack config to overlayed layer + var stackProps = stack(markDef, encoding, config ? config.stack : undefined); + var overlayEncoding = encoding; + if (stackProps) { + var stackFieldChannel = stackProps.fieldChannel, offset = stackProps.offset; + overlayEncoding = __assign({}, encoding, (_a = {}, _a[stackFieldChannel] = __assign({}, encoding[stackFieldChannel], (offset ? { stack: offset } : {})), _a)); + } + if (lineOverlay) { + var interpolate = markDef.interpolate; + layer.push(__assign({}, (projection ? { projection: projection } : {}), { mark: __assign({ type: 'line' }, lineOverlay, (interpolate ? { interpolate: interpolate } : {})), encoding: overlayEncoding })); + } + if (pointOverlay) { + layer.push(__assign({}, (projection ? { projection: projection } : {}), { mark: __assign({ type: 'point', opacity: 1, filled: true }, pointOverlay), encoding: overlayEncoding })); + } + return __assign({}, outerSpec, { layer: layer }); + } + // TODO: add vl.spec.validate & move stuff from vl.validate to here + /* Accumulate non-duplicate fieldDefs in a dictionary */ + function accumulate(dict, defs) { + defs.forEach(function (fieldDef) { + // Consider only pure fieldDef properties (ignoring scale, axis, legend) + var pureFieldDef = ['field', 'type', 'value', 'timeUnit', 'bin', 'aggregate'].reduce(function (f, key$$1) { + if (fieldDef[key$$1] !== undefined) { + f[key$$1] = fieldDef[key$$1]; + } + return f; + }, {}); + var key$$1 = hash(pureFieldDef); + dict[key$$1] = dict[key$$1] || fieldDef; + }); + return dict; + } + /* Recursively get fieldDefs from a spec, returns a dictionary of fieldDefs */ + function fieldDefIndex(spec, dict) { + if (dict === void 0) { dict = {}; } + // FIXME(https://github.com/vega/vega-lite/issues/2207): Support fieldDefIndex for repeat + if (isLayerSpec(spec)) { + spec.layer.forEach(function (layer) { + if (isUnitSpec(layer)) { + accumulate(dict, fieldDefs(layer.encoding)); + } + else { + fieldDefIndex(layer, dict); + } + }); + } + else if (isFacetSpec(spec)) { + accumulate(dict, fieldDefs(spec.facet)); + fieldDefIndex(spec.spec, dict); + } + else if (isRepeatSpec(spec)) { + fieldDefIndex(spec.spec, dict); + } + else if (isConcatSpec(spec)) { + var childSpec = isVConcatSpec(spec) ? spec.vconcat : spec.hconcat; + childSpec.forEach(function (child) { return fieldDefIndex(child, dict); }); + } + else { // Unit Spec + accumulate(dict, fieldDefs(spec.encoding)); + } + return dict; + } + /* Returns all non-duplicate fieldDefs in a spec in a flat array */ + function fieldDefs$1(spec) { + return vals(fieldDefIndex(spec)); + } + function isStacked(spec, config) { + config = config || spec.config; + if (isPrimitiveMark(spec.mark)) { + return stack(spec.mark, spec.encoding, config ? config.stack : undefined) !== null; + } + return false; + } + + var spec = /*#__PURE__*/Object.freeze({ + isFacetSpec: isFacetSpec, + isUnitSpec: isUnitSpec, + isLayerSpec: isLayerSpec, + isRepeatSpec: isRepeatSpec, + isConcatSpec: isConcatSpec, + isVConcatSpec: isVConcatSpec, + isHConcatSpec: isHConcatSpec, + normalize: normalize$2, + fieldDefs: fieldDefs$1, + isStacked: isStacked + }); + + function _normalizeAutoSize(autosize) { + return isString(autosize) ? { type: autosize } : autosize || {}; + } + function normalizeAutoSize(topLevelAutosize, configAutosize, isUnitOrLayer) { + if (isUnitOrLayer === void 0) { isUnitOrLayer = true; } + var autosize = __assign({ type: 'pad' }, _normalizeAutoSize(configAutosize), _normalizeAutoSize(topLevelAutosize)); + if (autosize.type === 'fit') { + if (!isUnitOrLayer) { + warn(message.FIT_NON_SINGLE); + autosize.type = 'pad'; + } + } + return autosize; + } + var TOP_LEVEL_PROPERTIES = [ + 'background', 'padding', 'datasets' + // We do not include "autosize" here as it is supported by only unit and layer specs and thus need to be normalized + ]; + function extractTopLevelProperties(t) { + return TOP_LEVEL_PROPERTIES.reduce(function (o, p) { + if (t && t[p] !== undefined) { + o[p] = t[p]; + } + return o; + }, {}); + } + + function isUrlData(data) { + return !!data['url']; + } + function isInlineData(data) { + return !!data['values']; + } + function isNamedData(data) { + return !!data['name'] && !isUrlData(data) && !isInlineData(data); + } + var MAIN = 'main'; + var RAW = 'raw'; + + var data = /*#__PURE__*/Object.freeze({ + isUrlData: isUrlData, + isInlineData: isInlineData, + isNamedData: isNamedData, + MAIN: MAIN, + RAW: RAW + }); + + /** + * Parse an event selector string. + * Returns an array of event stream definitions. + */ + function parseSelector(selector, source, marks) { + DEFAULT_SOURCE = source || VIEW; + MARKS = marks || DEFAULT_MARKS; + return parseMerge(selector.trim()).map(parseSelector$1); + } + + var VIEW = 'view', + LBRACK = '[', + RBRACK = ']', + LBRACE = '{', + RBRACE = '}', + COLON = ':', + COMMA = ',', + NAME = '@', + GT = '>', + ILLEGAL = /[[\]{}]/, + DEFAULT_SOURCE, + MARKS, + DEFAULT_MARKS = { + '*': 1, + arc: 1, + area: 1, + group: 1, + image: 1, + line: 1, + path: 1, + rect: 1, + rule: 1, + shape: 1, + symbol: 1, + text: 1, + trail: 1 + }; + + function isMarkType(type) { + return MARKS.hasOwnProperty(type); + } + + function find(s, i, endChar, pushChar, popChar) { + var count = 0, + n = s.length, + c; + for (; i= 0) --count; + else if (pushChar && pushChar.indexOf(c) >= 0) ++count; + } + return i; + } + + function parseMerge(s) { + var output = [], + start = 0, + n = s.length, + i = 0; + + while (i < n) { + i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE); + output.push(s.substring(start, i).trim()); + start = ++i; + } + + if (output.length === 0) { + throw 'Empty event selector: ' + s; + } + return output; + } + + function parseSelector$1(s) { + return s[0] === '[' + ? parseBetween(s) + : parseStream(s); + } + + function parseBetween(s) { + var n = s.length, + i = 1, + b, stream; + + i = find(s, i, RBRACK, LBRACK, RBRACK); + if (i === n) { + throw 'Empty between selector: ' + s; + } + + b = parseMerge(s.substring(1, i)); + if (b.length !== 2) { + throw 'Between selector must have two elements: ' + s; + } + + s = s.slice(i + 1).trim(); + if (s[0] !== GT) { + throw 'Expected \'>\' after between selector: ' + s; + } + + b = b.map(parseSelector$1); + + stream = parseSelector$1(s.slice(1).trim()); + if (stream.between) { + return { + between: b, + stream: stream + }; + } else { + stream.between = b; + } + + return stream; + } + + function parseStream(s) { + var stream = {source: DEFAULT_SOURCE}, + source = [], + throttle = [0, 0], + markname = 0, + start = 0, + n = s.length, + i = 0, j, + filter; + + // extract throttle from end + if (s[n-1] === RBRACE) { + i = s.lastIndexOf(LBRACE); + if (i >= 0) { + try { + throttle = parseThrottle(s.substring(i+1, n-1)); + } catch (e) { + throw 'Invalid throttle specification: ' + s; + } + s = s.slice(0, i).trim(); + n = s.length; + } else throw 'Unmatched right brace: ' + s; + i = 0; + } + + if (!n) throw s; + + // set name flag based on first char + if (s[0] === NAME) markname = ++i; + + // extract first part of multi-part stream selector + j = find(s, i, COLON); + if (j < n) { + source.push(s.substring(start, j).trim()); + start = i = ++j; + } + + // extract remaining part of stream selector + i = find(s, i, LBRACK); + if (i === n) { + source.push(s.substring(start, n).trim()); + } else { + source.push(s.substring(start, i).trim()); + filter = []; + start = ++i; + if (start === n) throw 'Unmatched left bracket: ' + s; + } + + // extract filters + while (i < n) { + i = find(s, i, RBRACK); + if (i === n) throw 'Unmatched left bracket: ' + s; + filter.push(s.substring(start, i).trim()); + if (i < n-1 && s[++i] !== LBRACK) throw 'Expected left bracket: ' + s; + start = ++i; + } + + // marshall event stream specification + if (!(n = source.length) || ILLEGAL.test(source[n-1])) { + throw 'Invalid event selector: ' + s; + } + + if (n > 1) { + stream.type = source[1]; + if (markname) { + stream.markname = source[0].slice(1); + } else if (isMarkType(source[0])) { + stream.marktype = source[0]; + } else { + stream.source = source[0]; + } + } else { + stream.type = source[0]; + } + if (stream.type.slice(-1) === '!') { + stream.consume = true; + stream.type = stream.type.slice(0, -1); + } + if (filter != null) stream.filter = filter; + if (throttle[0]) stream.throttle = throttle[0]; + if (throttle[1]) stream.debounce = throttle[1]; + + return stream; + } + + function parseThrottle(s) { + var a = s.split(COMMA); + if (!s.length || a.length > 2) throw s; + return a.map(function(_) { + var x = +_; + if (x !== x) throw s; + return x; + }); + } + + function isVgSignalRef(o) { + return !!o['signal']; + } + function isVgRangeStep(range) { + return !!range['step']; + } + function isDataRefUnionedDomain(domain) { + if (!isArray(domain)) { + return 'fields' in domain && !('data' in domain); + } + return false; + } + function isFieldRefUnionDomain(domain) { + if (!isArray(domain)) { + return 'fields' in domain && 'data' in domain; + } + return false; + } + function isDataRefDomain(domain) { + if (!isArray(domain)) { + return 'field' in domain && 'data' in domain; + } + return false; + } + var VG_MARK_CONFIG_INDEX = { + opacity: 1, + fill: 1, + fillOpacity: 1, + stroke: 1, + strokeCap: 1, + strokeWidth: 1, + strokeOpacity: 1, + strokeDash: 1, + strokeDashOffset: 1, + size: 1, + shape: 1, + interpolate: 1, + tension: 1, + orient: 1, + align: 1, + baseline: 1, + text: 1, + limit: 1, + dx: 1, + dy: 1, + radius: 1, + theta: 1, + angle: 1, + font: 1, + fontSize: 1, + fontWeight: 1, + fontStyle: 1, + cursor: 1, + href: 1, + }; + var VG_MARK_CONFIGS = flagKeys(VG_MARK_CONFIG_INDEX); + + function assembleTitle(title$$1, config) { + if (isArray(title$$1)) { + return title$$1.map(function (fieldDef) { return title(fieldDef, config); }).join(', '); + } + return title$$1; + } + function assembleAxis(axisCmpt, kind, config, opt) { + if (opt === void 0) { opt = { header: false }; } + var _a = axisCmpt.combine(), orient = _a.orient, scale = _a.scale, title$$1 = _a.title, zindex = _a.zindex, axis = __rest(_a, ["orient", "scale", "title", "zindex"]); + // Remove properties that are not valid for this kind of axis + keys(axis).forEach(function (key$$1) { + var propType = AXIS_PROPERTY_TYPE[key$$1]; + if (propType && propType !== kind && propType !== 'both') { + delete axis[key$$1]; + } + }); + if (kind === 'grid') { + if (!axis.grid) { + return undefined; + } + // Remove unnecessary encode block + if (axis.encode) { + // Only need to keep encode block for grid + var grid = axis.encode.grid; + axis.encode = __assign({}, (grid ? { grid: grid } : {})); + if (keys(axis.encode).length === 0) { + delete axis.encode; + } + } + return __assign({ scale: scale, + orient: orient }, axis, { domain: false, labels: false, + // Always set min/maxExtent to 0 to ensure that `config.axis*.minExtent` and `config.axis*.maxExtent` + // would not affect gridAxis + maxExtent: 0, minExtent: 0, ticks: false, zindex: zindex !== undefined ? zindex : 0 // put grid behind marks by default + }); + } + else { // kind === 'main' + if (!opt.header && axisCmpt.mainExtracted) { + // if mainExtracted has been extracted to a separate facet + return undefined; + } + // Remove unnecessary encode block + if (axis.encode) { + for (var _i = 0, AXIS_PARTS_1 = AXIS_PARTS; _i < AXIS_PARTS_1.length; _i++) { + var part = AXIS_PARTS_1[_i]; + if (!axisCmpt.hasAxisPart(part)) { + delete axis.encode[part]; + } + } + if (keys(axis.encode).length === 0) { + delete axis.encode; + } + } + var titleString = assembleTitle(title$$1, config); + return __assign({ scale: scale, + orient: orient, grid: false }, (titleString ? { title: titleString } : {}), axis, { zindex: zindex !== undefined ? zindex : 1 // put axis line above marks by default + }); + } + } + function assembleAxes(axisComponents, config) { + var _a = axisComponents.x, x = _a === void 0 ? [] : _a, _b = axisComponents.y, y = _b === void 0 ? [] : _b; + return x.map(function (a) { return assembleAxis(a, 'main', config); }).concat(x.map(function (a) { return assembleAxis(a, 'grid', config); }), y.map(function (a) { return assembleAxis(a, 'main', config); }), y.map(function (a) { return assembleAxis(a, 'grid', config); })).filter(function (a) { return a; }); // filter undefined + } + + // TODO: we need to find a way to refactor these so that scaleName is a part of scale + // but that's complicated. For now, this is a huge step moving forward. + /** + * @return Vega ValueRef for stackable x or y + */ + function stackable(channel, channelDef, scaleName, scale, stack, defaultRef) { + if (isFieldDef(channelDef) && stack && channel === stack.fieldChannel) { + // x or y use stack_end so that stacked line's point mark use stack_end too. + return fieldRef(channelDef, scaleName, { suffix: 'end' }); + } + return midPoint(channel, channelDef, scaleName, scale, stack, defaultRef); + } + /** + * @return Vega ValueRef for stackable x2 or y2 + */ + function stackable2(channel, aFieldDef, a2fieldDef, scaleName, scale, stack, defaultRef) { + if (isFieldDef(aFieldDef) && stack && + // If fieldChannel is X and channel is X2 (or Y and Y2) + channel.charAt(0) === stack.fieldChannel.charAt(0)) { + return fieldRef(aFieldDef, scaleName, { suffix: 'start' }); + } + return midPoint(channel, a2fieldDef, scaleName, scale, stack, defaultRef); + } + function getOffset(channel, markDef) { + var offsetChannel = channel + 'Offset'; + // TODO: in the future read from encoding channel too + var markDefOffsetValue = markDef[offsetChannel]; + if (markDefOffsetValue) { + return markDefOffsetValue; + } + return undefined; + } + /** + * Value Ref for binned fields + */ + function bin$1(fieldDef, scaleName, side, offset) { + var binSuffix = side === 'start' ? undefined : 'end'; + return fieldRef(fieldDef, scaleName, { binSuffix: binSuffix }, offset ? { offset: offset } : {}); + } + function fieldRef(fieldDef, scaleName, opt, mixins) { + var ref = __assign({}, (scaleName ? { scale: scaleName } : {}), { field: vgField(fieldDef, opt) }); + if (mixins) { + return __assign({}, ref, mixins); + } + return ref; + } + function bandRef(scaleName, band) { + if (band === void 0) { band = true; } + return { + scale: scaleName, + band: band + }; + } + /** + * Signal that returns the middle of a bin. Should only be used with x and y. + */ + function binMidSignal(fieldDef, scaleName) { + return { + signal: "(" + + ("scale(\"" + scaleName + "\", " + vgField(fieldDef, { expr: 'datum' }) + ")") + + " + " + + ("scale(\"" + scaleName + "\", " + vgField(fieldDef, { binSuffix: 'end', expr: 'datum' }) + ")") + + ")/2" + }; + } + /** + * @returns {VgValueRef} Value Ref for xc / yc or mid point for other channels. + */ + function midPoint(channel, channelDef, scaleName, scale, stack, defaultRef) { + // TODO: datum support + if (channelDef) { + /* istanbul ignore else */ + if (isFieldDef(channelDef)) { + if (channelDef.bin) { + // Use middle only for x an y to place marks in the center between start and end of the bin range. + // We do not use the mid point for other channels (e.g. size) so that properties of legends and marks match. + if (contains([X, Y], channel) && channelDef.type === QUANTITATIVE) { + if (stack && stack.impute) { + // For stack, we computed bin_mid so we can impute. + return fieldRef(channelDef, scaleName, { binSuffix: 'mid' }); + } + // For non-stack, we can just calculate bin mid on the fly using signal. + return binMidSignal(channelDef, scaleName); + } + return fieldRef(channelDef, scaleName, binRequiresRange(channelDef, channel) ? { binSuffix: 'range' } : {}); + } + if (scale) { + var scaleType = scale.get('type'); + if (hasDiscreteDomain(scaleType)) { + if (scaleType === 'band') { + // For band, to get mid point, need to offset by half of the band + return fieldRef(channelDef, scaleName, { binSuffix: 'range' }, { band: 0.5 }); + } + return fieldRef(channelDef, scaleName, { binSuffix: 'range' }); + } + } + return fieldRef(channelDef, scaleName, {}); // no need for bin suffix + } + else if (isValueDef(channelDef)) { + var value = channelDef.value; + if (contains(['x', 'x2'], channel) && value === 'width') { + return { field: { group: 'width' } }; + } + else if (contains(['y', 'y2'], channel) && value === 'height') { + return { field: { group: 'height' } }; + } + return { value: value }; + } + // If channelDef is neither field def or value def, it's a condition-only def. + // In such case, we will use default ref. + } + return defaultRef; + } + function text$1(textDef, config) { + // text + if (textDef) { + if (isFieldDef(textDef)) { + return formatSignalRef(textDef, textDef.format, 'datum', config); + } + else if (isValueDef(textDef)) { + return { value: textDef.value }; + } + } + return undefined; + } + function mid(sizeRef) { + return __assign({}, sizeRef, { mult: 0.5 }); + } + /** + * Whether the scale definitely includes zero in the domain + */ + function domainDefinitelyIncludeZero(scale) { + if (scale.get('zero') !== false) { + return true; + } + var domains = scale.domains; + if (isArray(domains)) { + return some(domains, function (d) { return isArray(d) && d.length === 2 && d[0] <= 0 && d[1] >= 0; }); + } + return false; + } + function getDefaultRef(defaultRef, channel, scaleName, scale, mark) { + if (isString(defaultRef)) { + if (scaleName) { + var scaleType = scale.get('type'); + if (contains([ScaleType.LOG, ScaleType.TIME, ScaleType.UTC], scaleType)) { + // Log scales cannot have zero. + // Zero in time scale is arbitrary, and does not affect ratio. + // (Time is an interval level of measurement, not ratio). + // See https://en.wikipedia.org/wiki/Level_of_measurement for more info. + if (mark === 'bar' || mark === 'area') { + warn(message.nonZeroScaleUsedWithLengthMark(mark, channel, { scaleType: scaleType })); + } + } + else { + if (domainDefinitelyIncludeZero(scale)) { + return { + scale: scaleName, + value: 0 + }; + } + if (mark === 'bar' || mark === 'area') { + warn(message.nonZeroScaleUsedWithLengthMark(mark, channel, { zeroFalse: scale.explicit.zero === false })); + } + } + } + if (defaultRef === 'zeroOrMin') { + return channel === 'x' ? { value: 0 } : { field: { group: 'height' } }; + } + else { // zeroOrMax + return channel === 'x' ? { field: { group: 'width' } } : { value: 0 }; + } + } + return defaultRef; + } + + function color(model, opt) { + var _a, _b; + if (opt === void 0) { opt = { valueOnly: false }; } + var markDef = model.markDef, encoding = model.encoding, config = model.config; + var filled = markDef.filled, markType = markDef.type; + var configValue = { + fill: getMarkConfig('fill', markDef, config), + stroke: getMarkConfig('stroke', markDef, config), + color: getMarkConfig('color', markDef, config) + }; + var transparentIfNeeded = contains(['bar', 'point', 'circle', 'square', 'geoshape'], markType) ? 'transparent' : undefined; + var defaultValue = { + fill: markDef.fill || configValue.fill || + // If there is no fill, always fill symbols, bar, geoshape + // with transparent fills https://github.com/vega/vega-lite/issues/1316 + transparentIfNeeded, + stroke: markDef.stroke || configValue.stroke + }; + var colorVgChannel = filled ? 'fill' : 'stroke'; + var fillStrokeMarkDefAndConfig = __assign({}, (defaultValue.fill ? { + fill: { value: defaultValue.fill } + } : {}), (defaultValue.stroke ? { + stroke: { value: defaultValue.stroke } + } : {})); + if (encoding.fill || encoding.stroke) { + // ignore encoding.color, markDef.color, config.color + if (markDef.color) { + // warn for markDef.color (no need to warn encoding.color as it will be dropped in normalized already) + warn(message.droppingColor('property', { fill: 'fill' in encoding, stroke: 'stroke' in encoding })); + } + return __assign({}, nonPosition('fill', model, { defaultValue: defaultValue.fill || transparentIfNeeded }), nonPosition('stroke', model, { defaultValue: defaultValue.stroke })); + } + else if (encoding.color) { + return __assign({}, fillStrokeMarkDefAndConfig, nonPosition('color', model, { + vgChannel: colorVgChannel, + // apply default fill/stroke first, then color config, then transparent if needed. + defaultValue: markDef[colorVgChannel] || markDef.color || configValue[colorVgChannel] || configValue.color || (filled ? transparentIfNeeded : undefined) + })); + } + else if (markDef.fill || markDef.stroke) { + // Ignore markDef.color, config.color + if (markDef.color) { + warn(message.droppingColor('property', { fill: 'fill' in markDef, stroke: 'stroke' in markDef })); + } + return fillStrokeMarkDefAndConfig; + } + else if (markDef.color) { + return __assign({}, fillStrokeMarkDefAndConfig, (_a = {}, _a[colorVgChannel] = { value: markDef.color }, _a)); + } + else if (configValue.fill || configValue.stroke) { + // ignore config.color + return fillStrokeMarkDefAndConfig; + } + else if (configValue.color) { + return __assign({}, (transparentIfNeeded ? { fill: { value: 'transparent' } } : {}), (_b = {}, _b[colorVgChannel] = { value: configValue.color }, _b)); + } + return {}; + } + function baseEncodeEntry(model, ignore) { + return __assign({}, markDefProperties(model.markDef, ignore), color(model), nonPosition('opacity', model), tooltip(model), text$2(model, 'href')); + } + function markDefProperties(mark, ignore) { + return VG_MARK_CONFIGS.reduce(function (m, prop) { + if (mark[prop] !== undefined && ignore[prop] !== 'ignore') { + m[prop] = { value: mark[prop] }; + } + return m; + }, {}); + } + function valueIfDefined(prop, value) { + var _a; + if (value !== undefined) { + return _a = {}, _a[prop] = { value: value }, _a; + } + return undefined; + } + function validPredicate(vgRef) { + return vgRef + " !== null && !isNaN(" + vgRef + ")"; + } + function defined(model) { + if (model.config.invalidValues === 'filter') { + var fields = ['x', 'y'].map(function (channel) { + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + // Discrete domain scales can handle invalid values, but continuous scales can't. + if (hasContinuousDomain(scaleType)) { + return model.vgField(channel, { expr: 'datum' }); + } + } + return undefined; + }) + .filter(function (field$$1) { return !!field$$1; }) + .map(validPredicate); + if (fields.length > 0) { + return { + defined: { signal: fields.join(' && ') } + }; + } + } + return {}; + } + /** + * Return mixins for non-positional channels with scales. (Text doesn't have scale.) + */ + function nonPosition(channel, model, opt) { + if (opt === void 0) { opt = {}; } + var defaultValue = opt.defaultValue, vgChannel = opt.vgChannel; + var defaultRef = opt.defaultRef || (defaultValue !== undefined ? { value: defaultValue } : undefined); + var channelDef = model.encoding[channel]; + return wrapCondition(model, channelDef, vgChannel || channel, function (cDef) { + return midPoint(channel, cDef, model.scaleName(channel), model.getScaleComponent(channel), null, // No need to provide stack for non-position as it does not affect mid point + defaultRef); + }); + } + /** + * Return a mixin that include a Vega production rule for a Vega-Lite conditional channel definition. + * or a simple mixin if channel def has no condition. + */ + function wrapCondition(model, channelDef, vgChannel, refFn) { + var _a, _b; + var condition = channelDef && channelDef.condition; + var valueRef = refFn(channelDef); + if (condition) { + var conditions = isArray(condition) ? condition : [condition]; + var vgConditions = conditions.map(function (c) { + var conditionValueRef = refFn(c); + var test = isConditionalSelection(c) ? selectionPredicate(model, c.selection) : expression(model, c.test); + return __assign({ test: test }, conditionValueRef); + }); + return _a = {}, + _a[vgChannel] = vgConditions.concat((valueRef !== undefined ? [valueRef] : [])), + _a; + } + else { + return valueRef !== undefined ? (_b = {}, _b[vgChannel] = valueRef, _b) : {}; + } + } + function tooltip(model) { + var channel = 'tooltip'; + var channelDef = model.encoding[channel]; + if (isArray(channelDef)) { + var keyValues = channelDef.map(function (fieldDef) { + var key$$1 = fieldDef.title !== undefined ? fieldDef.title : vgField(fieldDef, { binSuffix: 'range' }); + var value = text$1(fieldDef, model.config).signal; + return "\"" + key$$1 + "\": " + value; + }); + return { tooltip: { signal: "{" + keyValues.join(', ') + "}" } }; + } + else { + // if not an array, behave just like text + return textCommon(model, channel, channelDef); + } + } + function text$2(model, channel) { + if (channel === void 0) { channel = 'text'; } + var channelDef = model.encoding[channel]; + return textCommon(model, channel, channelDef); + } + function textCommon(model, channel, channelDef) { + return wrapCondition(model, channelDef, channel, function (cDef) { return text$1(cDef, model.config); }); + } + function bandPosition(fieldDef, channel, model) { + var _a, _b, _c; + var scaleName = model.scaleName(channel); + var sizeChannel = channel === 'x' ? 'width' : 'height'; + if (model.encoding.size || model.markDef.size !== undefined) { + var orient = model.markDef.orient; + if (orient) { + var centeredBandPositionMixins = (_a = {}, + // Use xc/yc and place the mark at the middle of the band + // This way we never have to deal with size's condition for x/y position. + _a[channel + 'c'] = fieldRef(fieldDef, scaleName, {}, { band: 0.5 }), + _a); + if (getFieldDef(model.encoding.size)) { + return __assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel })); + } + else if (isValueDef(model.encoding.size)) { + return __assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel })); + } + else if (model.markDef.size !== undefined) { + return __assign({}, centeredBandPositionMixins, (_b = {}, _b[sizeChannel] = { value: model.markDef.size }, _b)); + } + } + else { + warn(message.cannotApplySizeToNonOrientedMark(model.markDef.type)); + } + } + return _c = {}, + _c[channel] = fieldRef(fieldDef, scaleName, { binSuffix: 'range' }), + _c[sizeChannel] = bandRef(scaleName), + _c; + } + function centeredBandPosition(channel, model, defaultPosRef, defaultSizeRef) { + var centerChannel = channel === 'x' ? 'xc' : 'yc'; + var sizeChannel = channel === 'x' ? 'width' : 'height'; + return __assign({}, pointPosition(channel, model, defaultPosRef, centerChannel), nonPosition('size', model, { defaultRef: defaultSizeRef, vgChannel: sizeChannel })); + } + function binnedPosition(fieldDef, channel, scaleName, spacing, reverse) { + if (channel === 'x') { + return { + x2: bin$1(fieldDef, scaleName, 'start', reverse ? 0 : spacing), + x: bin$1(fieldDef, scaleName, 'end', reverse ? spacing : 0) + }; + } + else { + return { + y2: bin$1(fieldDef, scaleName, 'start', reverse ? spacing : 0), + y: bin$1(fieldDef, scaleName, 'end', reverse ? 0 : spacing) + }; + } + } + /** + * Return mixins for point (non-band) position channels. + */ + function pointPosition(channel, model, defaultRef, vgChannel) { + // TODO: refactor how refer to scale as discussed in https://github.com/vega/vega-lite/pull/1613 + var _a; + var encoding = model.encoding, mark = model.mark, stack = model.stack; + var channelDef = encoding[channel]; + var scaleName = model.scaleName(channel); + var scale = model.getScaleComponent(channel); + var offset = getOffset(channel, model.markDef); + var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ? + // use geopoint output if there are lat/long and there is no point position overriding lat/long. + { field: model.getName(channel) } : __assign({}, stackable(channel, encoding[channel], scaleName, scale, stack, getDefaultRef(defaultRef, channel, scaleName, scale, mark)), (offset ? { offset: offset } : {})); + return _a = {}, + _a[vgChannel || channel] = valueRef, + _a; + } + /** + * Return mixins for x2, y2. + * If channel is not specified, return one channel based on orientation. + */ + function pointPosition2(model, defaultRef, channel) { + var _a; + var encoding = model.encoding, mark = model.mark, stack = model.stack; + var baseChannel = channel === 'x2' ? 'x' : 'y'; + var channelDef = encoding[baseChannel]; + var scaleName = model.scaleName(baseChannel); + var scale = model.getScaleComponent(baseChannel); + var offset = getOffset(channel, model.markDef); + var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ? + // use geopoint output if there are lat2/long2 and there is no point position2 overriding lat2/long2. + { field: model.getName(channel) } : __assign({}, stackable2(channel, channelDef, encoding[channel], scaleName, scale, stack, getDefaultRef(defaultRef, baseChannel, scaleName, scale, mark)), (offset ? { offset: offset } : {})); + return _a = {}, _a[channel] = valueRef, _a; + } + + function applyMarkConfig(e, model, propsList) { + for (var _i = 0, propsList_2 = propsList; _i < propsList_2.length; _i++) { + var property = propsList_2[_i]; + var value = getMarkConfig(property, model.markDef, model.config); + if (value !== undefined) { + e[property] = { value: value }; + } + } + return e; + } + function getStyles(mark) { + return [].concat(mark.type, mark.style || []); + } + /** + * Return property value from style or mark specific config property if exists. + * Otherwise, return general mark specific config. + */ + function getMarkConfig(prop, mark, config) { + // By default, read from mark config first! + var value = config.mark[prop]; + // Then read mark specific config, which has higher precedence + var markSpecificConfig = config[mark.type]; + if (markSpecificConfig[prop] !== undefined) { + value = markSpecificConfig[prop]; + } + // Then read style config, which has even higher precedence. + var styles = getStyles(mark); + for (var _i = 0, styles_1 = styles; _i < styles_1.length; _i++) { + var style = styles_1[_i]; + var styleConfig = config.style[style]; + // MarkConfig extends VgMarkConfig so a prop may not be a valid property for style + // However here we also check if it is defined, so it is okay to cast here + var p = prop; + if (styleConfig && styleConfig[p] !== undefined) { + value = styleConfig[p]; + } + } + return value; + } + function formatSignalRef(fieldDef, specifiedFormat, expr, config) { + var format = numberFormat(fieldDef, specifiedFormat, config); + if (fieldDef.bin) { + var startField = vgField(fieldDef, { expr: expr }); + var endField = vgField(fieldDef, { expr: expr, binSuffix: 'end' }); + return { + signal: binFormatExpression(startField, endField, format, config) + }; + } + else if (fieldDef.type === 'quantitative') { + return { + signal: "" + formatExpr(vgField(fieldDef, { expr: expr, binSuffix: 'range' }), format) + }; + } + else if (isTimeFieldDef(fieldDef)) { + var isUTCScale = isScaleFieldDef(fieldDef) && fieldDef['scale'] && fieldDef['scale'].type === ScaleType.UTC; + return { + signal: timeFormatExpression(vgField(fieldDef, { expr: expr }), fieldDef.timeUnit, specifiedFormat, config.text.shortTimeLabels, config.timeFormat, isUTCScale, true) + }; + } + else { + return { + signal: "''+" + vgField(fieldDef, { expr: expr }) + }; + } + } + function getSpecifiedOrDefaultValue(specifiedValue, defaultValue) { + if (specifiedValue !== undefined) { + return specifiedValue; + } + return defaultValue; + } + /** + * Returns number format for a fieldDef + * + * @param format explicitly specified format + */ + function numberFormat(fieldDef, specifiedFormat, config) { + if (fieldDef.type === QUANTITATIVE) { + // add number format for quantitative type only + // Specified format in axis/legend has higher precedence than fieldDef.format + if (specifiedFormat) { + return specifiedFormat; + } + // TODO: need to make this work correctly for numeric ordinal / nominal type + return config.numberFormat; + } + return undefined; + } + function formatExpr(field$$1, format) { + return "format(" + field$$1 + ", \"" + (format || '') + "\")"; + } + function numberFormatExpr(field$$1, specifiedFormat, config) { + return formatExpr(field$$1, specifiedFormat || config.numberFormat); + } + function binFormatExpression(startField, endField, format, config) { + return startField + " === null || isNaN(" + startField + ") ? \"null\" : " + numberFormatExpr(startField, format, config) + " + \" - \" + " + numberFormatExpr(endField, format, config); + } + /** + * Returns the time expression used for axis/legend labels or text mark for a temporal field + */ + function timeFormatExpression(field$$1, timeUnit, format, shortTimeLabels, timeFormatConfig, isUTCScale, alwaysReturn) { + if (alwaysReturn === void 0) { alwaysReturn = false; } + if (!timeUnit || format) { + // If there is not time unit, or if user explicitly specify format for axis/legend/text. + format = format || timeFormatConfig; // only use config.timeFormat if there is no timeUnit. + if (format || alwaysReturn) { + return (isUTCScale ? 'utc' : 'time') + "Format(" + field$$1 + ", '" + format + "')"; + } + else { + return undefined; + } + } + else { + return formatExpression(timeUnit, field$$1, shortTimeLabels, isUTCScale); + } + } + /** + * Return Vega sort parameters (tuple of field and order). + */ + function sortParams(orderDef, fieldRefOption) { + return (isArray(orderDef) ? orderDef : [orderDef]).reduce(function (s, orderChannelDef) { + s.field.push(vgField(orderChannelDef, fieldRefOption)); + s.order.push(orderChannelDef.sort || 'ascending'); + return s; + }, { field: [], order: [] }); + } + function mergeTitleFieldDefs(f1, f2) { + var merged = f1.slice(); + f2.forEach(function (fdToMerge) { + for (var _i = 0, merged_1 = merged; _i < merged_1.length; _i++) { + var fieldDef1 = merged_1[_i]; + // If already exists, no need to append to merged array + if (stringify$2(fieldDef1) === stringify$2(fdToMerge)) { + return; + } + } + merged.push(fdToMerge); + }); + return merged; + } + function mergeTitle(title1, title2) { + return title1 === title2 ? + title1 : // if title is the same just use one of them + title1 + ', ' + title2; // join title with comma if different + } + function mergeTitleComponent(v1, v2) { + if (isArray(v1.value) && isArray(v2.value)) { + return { + explicit: v1.explicit, + value: mergeTitleFieldDefs(v1.value, v2.value) + }; + } + else if (!isArray(v1.value) && !isArray(v2.value)) { + return { + explicit: v1.explicit, + value: mergeTitle(v1.value, v2.value) + }; + } + /* istanbul ignore next: Condition should not happen -- only for warning in development. */ + throw new Error('It should never reach here'); + } + /** + * Checks whether a fieldDef for a particular channel requires a computed bin range. + */ + function binRequiresRange(fieldDef, channel) { + if (!fieldDef.bin) { + console.warn('Only use this method with binned field defs'); + return false; + } + // We need the range only when the user explicitly forces a binned field to be use discrete scale. In this case, bin range is used in axis and legend labels. + // We could check whether the axis or legend exists (not disabled) but that seems overkill. + return isScaleChannel(channel) && contains(['ordinal', 'nominal'], fieldDef.type); + } + function guideEncodeEntry(encoding, model) { + return keys(encoding).reduce(function (encode, channel) { + var valueDef = encoding[channel]; + return __assign({}, encode, wrapCondition(model, valueDef, channel, function (x) { return ({ value: x.value }); })); + }, {}); + } + + var HEADER_CHANNELS = ['row', 'column']; + var HEADER_TYPES = ['header', 'footer']; + function getHeaderType(orient) { + if (orient === 'top' || orient === 'left') { + return 'header'; + } + return 'footer'; + } + function getTitleGroup(model, channel) { + var title$$1 = model.component.layoutHeaders[channel].title; + var textOrient = channel === 'row' ? 'vertical' : undefined; + var update = __assign({ align: { value: 'center' }, text: { value: title$$1 } }, (textOrient === 'vertical' ? { angle: { value: 270 } } : {})); + return { + name: model.getName(channel + "_title"), + role: channel + "-title", + type: 'group', + marks: [__assign({ type: 'text', role: channel + "-title-text", style: 'guide-title' }, (keys(update).length > 0 ? { encode: { update: update } } : {}))] + }; + } + function getHeaderGroups(model, channel) { + var layoutHeader = model.component.layoutHeaders[channel]; + var groups = []; + for (var _i = 0, HEADER_TYPES_1 = HEADER_TYPES; _i < HEADER_TYPES_1.length; _i++) { + var headerType = HEADER_TYPES_1[_i]; + if (layoutHeader[headerType]) { + for (var _a = 0, _b = layoutHeader[headerType]; _a < _b.length; _a++) { + var headerCmpt = _b[_a]; + groups.push(getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt)); + } + } + } + return groups; + } + // 0, (0,90), 90, (90, 180), 180, (180, 270), 270, (270, 0) + function labelAlign(angle) { + // to keep angle in [0, 360) + angle = ((angle % 360) + 360) % 360; + if ((angle + 90) % 180 === 0) { // for 90 and 270 + return {}; // default center + } + else if (angle < 90 || 270 < angle) { + return { align: { value: 'right' } }; + } + else if (135 <= angle && angle < 225) { + return { align: { value: 'left' } }; + } + return {}; + } + function labelBaseline(angle) { + // to keep angle in [0, 360) + angle = ((angle % 360) + 360) % 360; + if (45 <= angle && angle <= 135) { + return { baseline: { value: 'top' } }; + } + return {}; + } + function getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt) { + var _a; + if (headerCmpt) { + var title$$1 = null; + var facetFieldDef = layoutHeader.facetFieldDef; + if (facetFieldDef && headerCmpt.labels) { + var _b = facetFieldDef.header, header = _b === void 0 ? {} : _b; + var format = header.format, labelAngle = header.labelAngle; + var update = __assign({}, (labelAngle !== undefined ? { angle: { value: labelAngle } } : {}), labelAlign(labelAngle), labelBaseline(labelAngle)); + title$$1 = __assign({ text: formatSignalRef(facetFieldDef, format, 'parent', model.config), offset: 10, orient: channel === 'row' ? 'left' : 'top', style: 'guide-label' }, (keys(update).length > 0 ? { encode: { update: update } } : {})); + } + var axes = headerCmpt.axes; + var hasAxes = axes && axes.length > 0; + if (title$$1 || hasAxes) { + var sizeChannel = channel === 'row' ? 'height' : 'width'; + return __assign({ name: model.getName(channel + "_" + headerType), type: 'group', role: channel + "-" + headerType }, (layoutHeader.facetFieldDef ? { + from: { data: model.getName(channel + '_domain') }, + sort: { + field: vgField(facetFieldDef, { expr: 'datum' }), + order: facetFieldDef.sort || 'ascending' + } + } : {}), (title$$1 ? { title: title$$1 } : {}), (headerCmpt.sizeSignal ? { + encode: { + update: (_a = {}, + _a[sizeChannel] = headerCmpt.sizeSignal, + _a) + } + } : {}), (hasAxes ? { axes: axes } : {})); + } + } + return null; + } + + function assembleLayoutSignals(model) { + return [].concat(sizeSignals(model, 'width'), sizeSignals(model, 'height')); + } + function sizeSignals(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var size = model.component.layoutSize.get(sizeType); + if (!size || size === 'merged') { + return []; + } + // Read size signal name from name map, just in case it is the top-level size signal that got renamed. + var name = model.getSizeSignalRef(sizeType).signal; + if (size === 'range-step') { + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var type = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (hasDiscreteDomain(type) && isVgRangeStep(range)) { + var scaleName = model.scaleName(channel); + if (isFacetModel(model.parent)) { + // If parent is facet and this is an independent scale, return only signal signal + // as the width/height will be calculated using the cardinality from + // facet's aggregate rather than reading from scale domain + var parentResolve = model.parent.component.resolve; + if (parentResolve.scale[channel] === 'independent') { + return [stepSignal(scaleName, range)]; + } + } + return [ + stepSignal(scaleName, range), + { + name: name, + update: sizeExpr(scaleName, scaleComponent, "domain('" + scaleName + "').length") + } + ]; + } + } + /* istanbul ignore next: Condition should not happen -- only for warning in development. */ + throw new Error('layout size is range step although there is no rangeStep.'); + } + else { + return [{ + name: name, + value: size + }]; + } + } + function stepSignal(scaleName, range) { + return { + name: scaleName + '_step', + value: range.step, + }; + } + function sizeExpr(scaleName, scaleComponent, cardinality) { + var type = scaleComponent.get('type'); + var padding = scaleComponent.get('padding'); + var paddingOuter = scaleComponent.get('paddingOuter'); + paddingOuter = paddingOuter !== undefined ? paddingOuter : padding; + var paddingInner = scaleComponent.get('paddingInner'); + paddingInner = type === 'band' ? + // only band has real paddingInner + (paddingInner !== undefined ? paddingInner : padding) : + // For point, as calculated in https://github.com/vega/vega-scale/blob/master/src/band.js#L128, + // it's equivalent to have paddingInner = 1 since there is only n-1 steps between n points. + 1; + return "bandspace(" + cardinality + ", " + paddingInner + ", " + paddingOuter + ") * " + scaleName + "_step"; + } + + function defaultScaleResolve(channel, model) { + if (isLayerModel(model) || isFacetModel(model)) { + return 'shared'; + } + else if (isConcatModel(model) || isRepeatModel(model)) { + return contains(POSITION_SCALE_CHANNELS, channel) ? 'independent' : 'shared'; + } + /* istanbul ignore next: should never reach here. */ + throw new Error('invalid model type for resolve'); + } + function parseGuideResolve(resolve, channel) { + var channelScaleResolve = resolve.scale[channel]; + var guide = contains(POSITION_SCALE_CHANNELS, channel) ? 'axis' : 'legend'; + if (channelScaleResolve === 'independent') { + if (resolve[guide][channel] === 'shared') { + warn(message.independentScaleMeansIndependentGuide(channel)); + } + return 'independent'; + } + return resolve[guide][channel] || 'shared'; + } + + /** + * Generic class for storing properties that are explicitly specified + * and implicitly determined by the compiler. + * This is important for scale/axis/legend merging as + * we want to prioritize properties that users explicitly specified. + */ + var Split = /** @class */ (function () { + function Split(explicit, implicit) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + this.explicit = explicit; + this.implicit = implicit; + } + Split.prototype.clone = function () { + return new Split(duplicate(this.explicit), duplicate(this.implicit)); + }; + Split.prototype.combine = function () { + // FIXME remove "as any". + // Add "as any" to avoid an error "Spread types may only be created from object types". + return __assign({}, this.explicit, this.implicit); + }; + Split.prototype.get = function (key) { + // Explicit has higher precedence + return this.explicit[key] !== undefined ? this.explicit[key] : this.implicit[key]; + }; + Split.prototype.getWithExplicit = function (key) { + // Explicit has higher precedence + if (this.explicit[key] !== undefined) { + return { explicit: true, value: this.explicit[key] }; + } + else if (this.implicit[key] !== undefined) { + return { explicit: false, value: this.implicit[key] }; + } + return { explicit: false, value: undefined }; + }; + Split.prototype.setWithExplicit = function (key, value) { + if (value.value !== undefined) { + this.set(key, value.value, value.explicit); + } + }; + Split.prototype.set = function (key, value, explicit) { + delete this[explicit ? 'implicit' : 'explicit'][key]; + this[explicit ? 'explicit' : 'implicit'][key] = value; + return this; + }; + Split.prototype.copyKeyFromSplit = function (key, s) { + // Explicit has higher precedence + if (s.explicit[key] !== undefined) { + this.set(key, s.explicit[key], true); + } + else if (s.implicit[key] !== undefined) { + this.set(key, s.implicit[key], false); + } + }; + Split.prototype.copyKeyFromObject = function (key, s) { + // Explicit has higher precedence + if (s[key] !== undefined) { + this.set(key, s[key], true); + } + }; + /** + * Merge split object into this split object. Properties from the other split + * overwrite properties from this split. + */ + Split.prototype.copyAll = function (other) { + for (var _i = 0, _a = keys(other.combine()); _i < _a.length; _i++) { + var key = _a[_i]; + var val = other.getWithExplicit(key); + this.setWithExplicit(key, val); + } + }; + return Split; + }()); + function makeExplicit(value) { + return { + explicit: true, + value: value + }; + } + function makeImplicit(value) { + return { + explicit: false, + value: value + }; + } + function tieBreakByComparing(compare) { + return function (v1, v2, property, propertyOf) { + var diff = compare(v1.value, v2.value); + if (diff > 0) { + return v1; + } + else if (diff < 0) { + return v2; + } + return defaultTieBreaker(v1, v2, property, propertyOf); + }; + } + function defaultTieBreaker(v1, v2, property, propertyOf) { + if (v1.explicit && v2.explicit) { + warn(message.mergeConflictingProperty(property, propertyOf, v1.value, v2.value)); + } + // If equal score, prefer v1. + return v1; + } + function mergeValuesWithExplicit(v1, v2, property, propertyOf, tieBreaker) { + if (tieBreaker === void 0) { tieBreaker = defaultTieBreaker; } + if (v1 === undefined || v1.value === undefined) { + // For first run + return v2; + } + if (v1.explicit && !v2.explicit) { + return v1; + } + else if (v2.explicit && !v1.explicit) { + return v2; + } + else if (stringify$2(v1.value) === stringify$2(v2.value)) { + return v1; + } + else { + return tieBreaker(v1, v2, property, propertyOf); + } + } + + var LegendComponent = /** @class */ (function (_super) { + __extends(LegendComponent, _super); + function LegendComponent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return LegendComponent; + }(Split)); + + function symbols(fieldDef, symbolsSpec, model, channel, type) { + if (type === 'gradient') { + return undefined; + } + var out = __assign({}, applyMarkConfig({}, model, FILL_STROKE_CONFIG), color(model)); + switch (model.mark) { + case BAR: + case TICK: + case TEXT$1: + out.shape = { value: 'square' }; + break; + case CIRCLE: + case SQUARE: + out.shape = { value: model.mark }; + break; + case POINT: + case LINE: + case GEOSHAPE: + case AREA: + // use default circle + break; + } + var markDef = model.markDef, encoding = model.encoding; + var filled = markDef.filled; + if (out.fill) { + // for fill legend, we don't want any fill in symbol + if (channel === 'fill' || (filled && channel === COLOR)) { + delete out.fill; + } + else { + if (out.fill['field']) { + // For others, remove fill field + delete out.fill; + } + else if (isArray(out.fill)) { + var fill = getFirstConditionValue(encoding.fill || encoding.color) || markDef.fill || (filled && markDef.color); + if (fill) { + out.fill = { value: fill }; + } + } + } + } + if (out.stroke) { + if (channel === 'stroke' || (!filled && channel === COLOR)) { + delete out.stroke; + } + else { + if (out.stroke['field']) { + // For others, remove stroke field + delete out.stroke; + } + else if (isArray(out.stroke)) { + var stroke = getFirstConditionValue(encoding.stroke || encoding.color) || markDef.stroke || (!filled && markDef.color); + if (stroke) { + out.stroke = { value: stroke }; + } + } + } + } + if (out.fill && out.fill['value'] !== 'transparent' && !out.stroke) { + // for non color channel's legend, we need to override symbol stroke config from Vega config + out.stroke = { value: 'transparent' }; + } + if (channel !== SHAPE) { + var shape = getFirstConditionValue(encoding.shape) || markDef.shape; + if (shape) { + out.shape = { value: shape }; + } + } + if (channel !== OPACITY) { + var opacity = getMaxValue(encoding.opacity) || markDef.opacity; + if (opacity) { // only apply opacity if it is neither zero or undefined + out.opacity = { value: opacity }; + } + } + out = __assign({}, out, symbolsSpec); + return keys(out).length > 0 ? out : undefined; + } + function gradient(fieldDef, gradientSpec, model, channel, type) { + var out = {}; + if (type === 'gradient') { + var opacity = getMaxValue(model.encoding.opacity) || model.markDef.opacity; + if (opacity) { // only apply opacity if it is neither zero or undefined + out.opacity = { value: opacity }; + } + } + out = __assign({}, out, gradientSpec); + return keys(out).length > 0 ? out : undefined; + } + function labels(fieldDef, labelsSpec, model, channel, type) { + var legend = model.legend(channel); + var config = model.config; + var out = {}; + if (isTimeFieldDef(fieldDef)) { + var isUTCScale = model.getScaleComponent(channel).get('type') === ScaleType.UTC; + var expr = timeFormatExpression('datum.value', fieldDef.timeUnit, legend.format, config.legend.shortTimeLabels, config.timeFormat, isUTCScale); + labelsSpec = __assign({}, (expr ? { text: { signal: expr } } : {}), labelsSpec); + } + out = __assign({}, out, labelsSpec); + return keys(out).length > 0 ? out : undefined; + } + function getMaxValue(channelDef) { + return getConditionValue(channelDef, function (v, conditionalDef) { return Math.max(v, conditionalDef.value); }); + } + function getFirstConditionValue(channelDef) { + return getConditionValue(channelDef, function (v, conditionalDef) { return v !== undefined ? v : conditionalDef.value; }); + } + function getConditionValue(channelDef, reducer) { + if (hasConditionalValueDef(channelDef)) { + return (isArray(channelDef.condition) ? channelDef.condition : [channelDef.condition]) + .reduce(reducer, channelDef.value); + } + else if (isValueDef(channelDef)) { + return channelDef.value; + } + return undefined; + } + + var encode = /*#__PURE__*/Object.freeze({ + symbols: symbols, + gradient: gradient, + labels: labels + }); + + function values(legend) { + var vals$$1 = legend.values; + if (vals$$1 && isDateTime(vals$$1[0])) { + return vals$$1.map(function (dt) { + // normalize = true as end user won't put 0 = January + return { signal: dateTimeExpr(dt, true) }; + }); + } + return vals$$1; + } + function type$2(t, channel, scaleType) { + if (isColorChannel(channel) && ((t === 'quantitative' && !isBinScale(scaleType)) || + (t === 'temporal' && contains(['time', 'utc'], scaleType)))) { + return 'gradient'; + } + return undefined; + } + + function parseLegend(model) { + if (isUnitModel(model)) { + model.component.legends = parseUnitLegend(model); + } + else { + model.component.legends = parseNonUnitLegend(model); + } + } + function parseUnitLegend(model) { + var encoding = model.encoding; + return [COLOR, FILL, STROKE, SIZE, SHAPE, OPACITY].reduce(function (legendComponent, channel) { + var def = encoding[channel]; + if (model.legend(channel) && model.getScaleComponent(channel) && !(isFieldDef(def) && (channel === SHAPE && def.type === GEOJSON))) { + legendComponent[channel] = parseLegendForChannel(model, channel); + } + return legendComponent; + }, {}); + } + function getLegendDefWithScale(model, channel) { + var _a; + // For binned field with continuous scale, use a special scale so we can overrride the mark props and labels + switch (channel) { + case COLOR: + var scale = model.scaleName(COLOR); + return model.markDef.filled ? { fill: scale } : { stroke: scale }; + case FILL: + case STROKE: + case SIZE: + case SHAPE: + case OPACITY: + return _a = {}, _a[channel] = model.scaleName(channel), _a; + } + } + function parseLegendForChannel(model, channel) { + var fieldDef = model.fieldDef(channel); + var legend = model.legend(channel); + var legendCmpt = new LegendComponent({}, getLegendDefWithScale(model, channel)); + LEGEND_PROPERTIES.forEach(function (property) { + var value = getProperty(property, legend, channel, model); + if (value !== undefined) { + var explicit = + // specified legend.values is already respected, but may get transformed. + property === 'values' ? !!legend.values : + // title can be explicit if fieldDef.title is set + property === 'title' && value === model.fieldDef(channel).title ? true : + // Otherwise, things are explicit if the returned value matches the specified property + value === legend[property]; + if (explicit || model.config.legend[property] === undefined) { + legendCmpt.set(property, value, explicit); + } + } + }); + // 2) Add mark property definition groups + var legendEncoding = legend.encoding || {}; + var legendEncode = ['labels', 'legend', 'title', 'symbols', 'gradient'].reduce(function (e, part) { + var legendEncodingPart = guideEncodeEntry(legendEncoding[part] || {}, model); + var value = encode[part] ? + // TODO: replace legendCmpt with type is sufficient + encode[part](fieldDef, legendEncodingPart, model, channel, legendCmpt.get('type')) : // apply rule + legendEncodingPart; // no rule -- just default values + if (value !== undefined && keys(value).length > 0) { + e[part] = { update: value }; + } + return e; + }, {}); + if (keys(legendEncode).length > 0) { + legendCmpt.set('encode', legendEncode, !!legend.encoding); + } + return legendCmpt; + } + function getProperty(property, specifiedLegend, channel, model) { + var fieldDef = model.fieldDef(channel); + switch (property) { + case 'format': + // We don't include temporal field here as we apply format in encode block + return numberFormat(fieldDef, specifiedLegend.format, model.config); + case 'title': + // For falsy value, keep undefined so we use default, + // but use null for '', null, and false to hide the title + var specifiedTitle = fieldDef.title !== undefined ? fieldDef.title : + specifiedLegend.title || (specifiedLegend.title === undefined ? undefined : null); + return getSpecifiedOrDefaultValue(specifiedTitle, title(fieldDef, model.config)) || undefined; // make falsy value undefined so output Vega spec is shorter + case 'values': + return values(specifiedLegend); + case 'type': + return getSpecifiedOrDefaultValue(specifiedLegend.type, type$2(fieldDef.type, channel, model.getScaleComponent(channel).get('type'))); + } + // Otherwise, return specified property. + return specifiedLegend[property]; + } + function parseNonUnitLegend(model) { + var _a = model.component, legends = _a.legends, resolve = _a.resolve; + var _loop_1 = function (child) { + parseLegend(child); + keys(child.component.legends).forEach(function (channel) { + resolve.legend[channel] = parseGuideResolve(model.component.resolve, channel); + if (resolve.legend[channel] === 'shared') { + // If the resolve says shared (and has not been overridden) + // We will try to merge and see if there is a conflict + legends[channel] = mergeLegendComponent(legends[channel], child.component.legends[channel]); + if (!legends[channel]) { + // If merge returns nothing, there is a conflict so we cannot make the legend shared. + // Thus, mark legend as independent and remove the legend component. + resolve.legend[channel] = 'independent'; + delete legends[channel]; + } + } + }); + }; + for (var _i = 0, _b = model.children; _i < _b.length; _i++) { + var child = _b[_i]; + _loop_1(child); + } + keys(legends).forEach(function (channel) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (!child.component.legends[channel]) { + // skip if the child does not have a particular legend + continue; + } + if (resolve.legend[channel] === 'shared') { + // After merging shared legend, make sure to remove legend from child + delete child.component.legends[channel]; + } + } + }); + return legends; + } + function mergeLegendComponent(mergedLegend, childLegend) { + if (!mergedLegend) { + return childLegend.clone(); + } + var mergedOrient = mergedLegend.getWithExplicit('orient'); + var childOrient = childLegend.getWithExplicit('orient'); + if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) { + // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.) + // Cannot merge due to inconsistent orient + return undefined; + } + var typeMerged = false; + var _loop_2 = function (prop) { + var mergedValueWithExplicit = mergeValuesWithExplicit(mergedLegend.getWithExplicit(prop), childLegend.getWithExplicit(prop), prop, 'legend', + // Tie breaker function + function (v1, v2) { + switch (prop) { + case 'title': + return mergeTitleComponent(v1, v2); + case 'type': + // There are only two types. If we have different types, then prefer symbol over gradient. + typeMerged = true; + return makeImplicit('symbol'); + } + return defaultTieBreaker(v1, v2, prop, 'legend'); + }); + mergedLegend.setWithExplicit(prop, mergedValueWithExplicit); + }; + // Otherwise, let's merge + for (var _i = 0, VG_LEGEND_PROPERTIES_1 = VG_LEGEND_PROPERTIES; _i < VG_LEGEND_PROPERTIES_1.length; _i++) { + var prop = VG_LEGEND_PROPERTIES_1[_i]; + _loop_2(prop); + } + if (typeMerged) { + if (((mergedLegend.implicit || {}).encode || {}).gradient) { + deleteNestedProperty(mergedLegend.implicit, ['encode', 'gradient']); + } + if (((mergedLegend.explicit || {}).encode || {}).gradient) { + deleteNestedProperty(mergedLegend.explicit, ['encode', 'gradient']); + } + } + return mergedLegend; + } + + function assembleLegends(model) { + var legendComponentIndex = model.component.legends; + var legendByDomain = {}; + for (var _i = 0, _a = keys(legendComponentIndex); _i < _a.length; _i++) { + var channel = _a[_i]; + var scaleComponent = model.getScaleComponent(channel); + var domainHash = stringify$2(scaleComponent.domains); + if (legendByDomain[domainHash]) { + for (var _b = 0, _c = legendByDomain[domainHash]; _b < _c.length; _b++) { + var mergedLegendComponent = _c[_b]; + var merged = mergeLegendComponent(mergedLegendComponent, legendComponentIndex[channel]); + if (!merged) { + // If cannot merge, need to add this legend separately + legendByDomain[domainHash].push(legendComponentIndex[channel]); + } + } + } + else { + legendByDomain[domainHash] = [legendComponentIndex[channel].clone()]; + } + } + return flatten(vals(legendByDomain)).map(function (legendCmpt) { return legendCmpt.combine(); }); + } + + function assembleProjections(model) { + if (isLayerModel(model) || isConcatModel(model) || isRepeatModel(model)) { + return assembleProjectionsForModelAndChildren(model); + } + else { + return assembleProjectionForModel(model); + } + } + function assembleProjectionsForModelAndChildren(model) { + return model.children.reduce(function (projections, child) { + return projections.concat(child.assembleProjections()); + }, assembleProjectionForModel(model)); + } + function assembleProjectionForModel(model) { + var component = model.component.projection; + if (!component || component.merged) { + return []; + } + var projection = component.combine(); + var name = projection.name, rest = __rest(projection, ["name"]); // we need to extract name so that it is always present in the output and pass TS type validation + var size = { + signal: "[" + component.size.map(function (ref) { return ref.signal; }).join(', ') + "]" + }; + var fit = component.data.reduce(function (sources, data) { + var source = isVgSignalRef(data) ? data.signal : "data('" + model.lookupDataSource(data) + "')"; + if (!contains(sources, source)) { + // build a unique list of sources + sources.push(source); + } + return sources; + }, []); + if (fit.length <= 0) { + throw new Error("Projection's fit didn't find any data sources"); + } + return [__assign({ name: name, + size: size, fit: { + signal: fit.length > 1 ? "[" + fit.join(', ') + "]" : fit[0] + } }, rest)]; + } + + var PROJECTION_PROPERTIES = [ + 'type', + 'clipAngle', + 'clipExtent', + 'center', + 'rotate', + 'precision', + 'coefficient', + 'distance', + 'fraction', + 'lobes', + 'parallel', + 'radius', + 'ratio', + 'spacing', + 'tilt' + ]; + + var ProjectionComponent = /** @class */ (function (_super) { + __extends(ProjectionComponent, _super); + function ProjectionComponent(name, specifiedProjection, size, data) { + var _this = _super.call(this, __assign({}, specifiedProjection), // all explicit properties of projection + { name: name } // name as initial implicit property + ) || this; + _this.specifiedProjection = specifiedProjection; + _this.size = size; + _this.data = data; + _this.merged = false; + return _this; + } + return ProjectionComponent; + }(Split)); + + function parseProjection(model) { + if (isUnitModel(model)) { + model.component.projection = parseUnitProjection(model); + } + else { + // because parse happens from leaves up (unit specs before layer spec), + // we can be sure that the above if statement has already occurred + // and therefore we have access to child.component.projection + // for each of model's children + model.component.projection = parseNonUnitProjections(model); + } + } + function parseUnitProjection(model) { + var specifiedProjection = model.specifiedProjection, config = model.config, hasProjection = model.hasProjection; + if (hasProjection) { + var data_1 = []; + [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (posssiblePair) { + if (model.channelHasField(posssiblePair[0]) || model.channelHasField(posssiblePair[1])) { + data_1.push({ + signal: model.getName("geojson_" + data_1.length) + }); + } + }); + if (model.channelHasField(SHAPE) && model.fieldDef(SHAPE).type === GEOJSON) { + data_1.push({ + signal: model.getName("geojson_" + data_1.length) + }); + } + if (data_1.length === 0) { + // main source is geojson, so we can just use that + data_1.push(model.requestDataName(MAIN)); + } + return new ProjectionComponent(model.projectionName(true), __assign({}, (config.projection || {}), (specifiedProjection || {})), [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')], data_1); + } + return undefined; + } + function mergeIfNoConflict(first, second) { + var allPropertiesShared = every(PROJECTION_PROPERTIES, function (prop) { + // neither has the poperty + if (!first.explicit.hasOwnProperty(prop) && + !second.explicit.hasOwnProperty(prop)) { + return true; + } + // both have property and an equal value for property + if (first.explicit.hasOwnProperty(prop) && + second.explicit.hasOwnProperty(prop) && + // some properties might be signals or objects and require hashing for comparison + stringify$2(first.get(prop)) === stringify$2(second.get(prop))) { + return true; + } + return false; + }); + var size = stringify$2(first.size) === stringify$2(second.size); + if (size) { + if (allPropertiesShared) { + return first; + } + else if (stringify$2(first.explicit) === stringify$2({})) { + return second; + } + else if (stringify$2(second.explicit) === stringify$2({})) { + return first; + } + } + // if all properties don't match, let each unit spec have its own projection + return null; + } + function parseNonUnitProjections(model) { + if (model.children.length === 0) { + return undefined; + } + var nonUnitProjection; + var mergable = every(model.children, function (child) { + parseProjection(child); + var projection = child.component.projection; + if (!projection) { + // child layer does not use a projection + return true; + } + else if (!nonUnitProjection) { + // cached 'projection' is null, cache this one + nonUnitProjection = projection; + return true; + } + else { + var merge = mergeIfNoConflict(nonUnitProjection, projection); + if (merge) { + nonUnitProjection = merge; + } + return !!merge; + } + }); + // it cached one and all other children share the same projection, + if (nonUnitProjection && mergable) { + // so we can elevate it to the layer level + var name_1 = model.projectionName(true); + var modelProjection_1 = new ProjectionComponent(name_1, nonUnitProjection.specifiedProjection, nonUnitProjection.size, duplicate(nonUnitProjection.data)); + // rename and assign all others as merged + model.children.forEach(function (child) { + if (child.component.projection) { + modelProjection_1.data = modelProjection_1.data.concat(child.component.projection.data); + child.renameProjection(child.component.projection.get('name'), name_1); + child.component.projection.merged = true; + } + }); + return modelProjection_1; + } + return undefined; + } + + function isSortField(sort) { + return !!sort && (sort['op'] === 'count' || !!sort['field']) && !!sort['op']; + } + function isSortArray(sort) { + return !!sort && isArray(sort) && sort.every(function (s) { return isString(s); }); + } + + var sort = /*#__PURE__*/Object.freeze({ + isSortField: isSortField, + isSortArray: isSortArray + }); + + /** + * A node in the dataflow tree. + */ + var DataFlowNode = /** @class */ (function () { + function DataFlowNode(parent, debugName) { + this.debugName = debugName; + this._children = []; + this._parent = null; + if (parent) { + this.parent = parent; + } + } + /** + * Clone this node with a deep copy but don't clone links to children or parents. + */ + DataFlowNode.prototype.clone = function () { + throw new Error('Cannot clone node'); + }; + /** + * Set of fields that are being created by this node. + */ + DataFlowNode.prototype.producedFields = function () { + return {}; + }; + DataFlowNode.prototype.dependentFields = function () { + return {}; + }; + Object.defineProperty(DataFlowNode.prototype, "parent", { + get: function () { + return this._parent; + }, + /** + * Set the parent of the node and also add this not to the parent's children. + */ + set: function (parent) { + this._parent = parent; + parent.addChild(this); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DataFlowNode.prototype, "children", { + get: function () { + return this._children; + }, + enumerable: true, + configurable: true + }); + DataFlowNode.prototype.numChildren = function () { + return this._children.length; + }; + DataFlowNode.prototype.addChild = function (child) { + this._children.push(child); + }; + DataFlowNode.prototype.removeChild = function (oldChild) { + this._children.splice(this._children.indexOf(oldChild), 1); + }; + /** + * Remove node from the dataflow. + */ + DataFlowNode.prototype.remove = function () { + for (var _i = 0, _a = this._children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parent = this._parent; + } + this._parent.removeChild(this); + }; + /** + * Insert another node as a parent of this node. + */ + DataFlowNode.prototype.insertAsParentOf = function (other) { + var parent = other.parent; + parent.removeChild(this); + this.parent = parent; + other.parent = this; + }; + DataFlowNode.prototype.swapWithParent = function () { + var parent = this._parent; + var newParent = parent.parent; + // reconnect the children + for (var _i = 0, _a = this._children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parent = parent; + } + // remove old links + this._children = []; // equivalent to removing every child link one by one + parent.removeChild(this); + parent.parent.removeChild(parent); + // swap two nodes + this.parent = newParent; + parent.parent = this; + }; + return DataFlowNode; + }()); + var OutputNode = /** @class */ (function (_super) { + __extends(OutputNode, _super); + /** + * @param source The name of the source. Will change in assemble. + * @param type The type of the output node. + * @param refCounts A global ref counter map. + */ + function OutputNode(parent, source, type, refCounts) { + var _this = _super.call(this, parent, source) || this; + _this.type = type; + _this.refCounts = refCounts; + _this._source = _this._name = source; + if (_this.refCounts && !(_this._name in _this.refCounts)) { + _this.refCounts[_this._name] = 0; + } + return _this; + } + OutputNode.prototype.clone = function () { + var cloneObj = new this.constructor; + cloneObj.debugName = 'clone_' + this.debugName; + cloneObj._source = this._source; + cloneObj._name = 'clone_' + this._name; + cloneObj.type = this.type; + cloneObj.refCounts = this.refCounts; + cloneObj.refCounts[cloneObj._name] = 0; + return cloneObj; + }; + /** + * Request the datasource name and increase the ref counter. + * + * During the parsing phase, this will return the simple name such as 'main' or 'raw'. + * It is crucial to request the name from an output node to mark it as a required node. + * If nobody ever requests the name, this datasource will not be instantiated in the assemble phase. + * + * In the assemble phase, this will return the correct name. + */ + OutputNode.prototype.getSource = function () { + this.refCounts[this._name]++; + return this._source; + }; + OutputNode.prototype.isRequired = function () { + return !!this.refCounts[this._name]; + }; + OutputNode.prototype.setSource = function (source) { + this._source = source; + }; + return OutputNode; + }(DataFlowNode)); + + /** + * We don't know what a calculate node depends on so we should never move it beyond anything that produces fields. + */ + var CalculateNode = /** @class */ (function (_super) { + __extends(CalculateNode, _super); + function CalculateNode(parent, transform) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + return _this; + } + CalculateNode.prototype.clone = function () { + return new CalculateNode(null, duplicate(this.transform)); + }; + CalculateNode.parseAllForSortIndex = function (parent, model) { + // get all the encoding with sort fields from model + model.forEachFieldDef(function (fieldDef, channel) { + if (isScaleFieldDef(fieldDef) && isSortArray(fieldDef.sort)) { + var transform = { + calculate: CalculateNode.calculateExpressionFromSortField(fieldDef.field, fieldDef.sort), + as: sortArrayIndexField(model, channel) + }; + parent = new CalculateNode(parent, transform); + } + }); + return parent; + }; + CalculateNode.calculateExpressionFromSortField = function (field, sortFields) { + var expression = ''; + var i; + for (i = 0; i < sortFields.length; i++) { + expression += "datum." + field + " === '" + sortFields[i] + "' ? " + i + " : "; + } + expression += i; + return expression; + }; + CalculateNode.prototype.producedFields = function () { + var out = {}; + out[this.transform.as] = true; + return out; + }; + CalculateNode.prototype.assemble = function () { + return { + type: 'formula', + expr: this.transform.calculate, + as: this.transform.as + }; + }; + return CalculateNode; + }(DataFlowNode)); + function sortArrayIndexField(model, channel) { + var fieldDef = model.fieldDef(channel); + return channel + "_" + vgField(fieldDef) + "_sort_index"; + } + + function addDimension(dims, channel, fieldDef) { + if (fieldDef.bin) { + dims[vgField(fieldDef, {})] = true; + dims[vgField(fieldDef, { binSuffix: 'end' })] = true; + if (binRequiresRange(fieldDef, channel)) { + dims[vgField(fieldDef, { binSuffix: 'range' })] = true; + } + } + else { + dims[vgField(fieldDef)] = true; + } + return dims; + } + function mergeMeasures(parentMeasures, childMeasures) { + for (var f in childMeasures) { + if (childMeasures.hasOwnProperty(f)) { + // when we merge a measure, we either have to add an aggregation operator or even a new field + var ops = childMeasures[f]; + for (var op in ops) { + if (ops.hasOwnProperty(op)) { + if (f in parentMeasures) { + // add operator to existing measure field + parentMeasures[f][op] = ops[op]; + } + else { + parentMeasures[f] = { op: ops[op] }; + } + } + } + } + } + } + var AggregateNode = /** @class */ (function (_super) { + __extends(AggregateNode, _super); + /** + * @param dimensions string set for dimensions + * @param measures dictionary mapping field name => dict of aggregation functions and names to use + */ + function AggregateNode(parent, dimensions, measures) { + var _this = _super.call(this, parent) || this; + _this.dimensions = dimensions; + _this.measures = measures; + return _this; + } + AggregateNode.prototype.clone = function () { + return new AggregateNode(null, __assign({}, this.dimensions), duplicate(this.measures)); + }; + AggregateNode.makeFromEncoding = function (parent, model) { + var isAggregate = false; + model.forEachFieldDef(function (fd) { + if (fd.aggregate) { + isAggregate = true; + } + }); + var meas = {}; + var dims = {}; + if (!isAggregate) { + // no need to create this node if the model has no aggregation + return null; + } + model.forEachFieldDef(function (fieldDef, channel) { + var aggregate = fieldDef.aggregate, field = fieldDef.field; + if (aggregate) { + if (aggregate === 'count') { + meas['*'] = meas['*'] || {}; + meas['*']['count'] = vgField(fieldDef); + } + else { + meas[field] = meas[field] || {}; + meas[field][aggregate] = vgField(fieldDef); + // For scale channel with domain === 'unaggregated', add min/max so we can use their union as unaggregated domain + if (isScaleChannel(channel) && model.scaleDomain(channel) === 'unaggregated') { + meas[field]['min'] = vgField({ field: field, aggregate: 'min' }); + meas[field]['max'] = vgField({ field: field, aggregate: 'max' }); + } + } + } + else { + addDimension(dims, channel, fieldDef); + } + }); + if ((keys(dims).length + keys(meas).length) === 0) { + return null; + } + return new AggregateNode(parent, dims, meas); + }; + AggregateNode.makeFromTransform = function (parent, t) { + var dims = {}; + var meas = {}; + for (var _i = 0, _a = t.aggregate; _i < _a.length; _i++) { + var s = _a[_i]; + var op = s.op, field = s.field, as = s.as; + if (op) { + if (op === 'count') { + meas['*'] = meas['*'] || {}; + meas['*']['count'] = as || vgField(s); + } + else { + meas[field] = meas[field] || {}; + meas[field][op] = as || vgField(s); + } + } + } + for (var _b = 0, _c = t.groupby || []; _b < _c.length; _b++) { + var s = _c[_b]; + dims[s] = true; + } + if ((keys(dims).length + keys(meas).length) === 0) { + return null; + } + return new AggregateNode(parent, dims, meas); + }; + AggregateNode.prototype.merge = function (other) { + if (!differ(this.dimensions, other.dimensions)) { + mergeMeasures(this.measures, other.measures); + other.remove(); + } + else { + debug('different dimensions, cannot merge'); + } + }; + AggregateNode.prototype.addDimensions = function (fields) { + var _this = this; + fields.forEach(function (f) { return _this.dimensions[f] = true; }); + }; + AggregateNode.prototype.dependentFields = function () { + var out = {}; + keys(this.dimensions).forEach(function (f) { return out[f] = true; }); + keys(this.measures).forEach(function (m) { return out[m] = true; }); + return out; + }; + AggregateNode.prototype.producedFields = function () { + var _this = this; + var out = {}; + keys(this.measures).forEach(function (field) { + keys(_this.measures[field]).forEach(function (op) { + out[op + "_" + field] = true; + }); + }); + return out; + }; + AggregateNode.prototype.assemble = function () { + var ops = []; + var fields = []; + var as = []; + for (var _i = 0, _a = keys(this.measures); _i < _a.length; _i++) { + var field = _a[_i]; + for (var _b = 0, _c = keys(this.measures[field]); _b < _c.length; _b++) { + var op = _c[_b]; + as.push(this.measures[field][op]); + ops.push(op); + fields.push(field); + } + } + var result = { + type: 'aggregate', + groupby: keys(this.dimensions), + ops: ops, + fields: fields, + as: as + }; + return result; + }; + return AggregateNode; + }(DataFlowNode)); + + /** + * A node that helps us track what fields we are faceting by. + */ + var FacetNode = /** @class */ (function (_super) { + __extends(FacetNode, _super); + /** + * @param model The facet model. + * @param name The name that this facet source will have. + * @param data The source data for this facet data. + */ + function FacetNode(parent, model, name, data) { + var _this = _super.call(this, parent) || this; + _this.model = model; + _this.name = name; + _this.data = data; + if (model.facet.column) { + _this.columnFields = [model.vgField(COLUMN)]; + _this.columnName = model.getName('column_domain'); + if (model.fieldDef(COLUMN).bin) { + _this.columnFields.push(model.vgField(COLUMN, { binSuffix: 'end' })); + } + } + if (model.facet.row) { + _this.rowFields = [model.vgField(ROW)]; + _this.rowName = model.getName('row_domain'); + if (model.fieldDef(ROW).bin) { + _this.rowFields.push(model.vgField(ROW, { binSuffix: 'end' })); + } + } + _this.childModel = model.child; + return _this; + } + Object.defineProperty(FacetNode.prototype, "fields", { + get: function () { + var fields = []; + if (this.columnFields) { + fields = fields.concat(this.columnFields); + } + if (this.rowFields) { + fields = fields.concat(this.rowFields); + } + return fields; + }, + enumerable: true, + configurable: true + }); + /** + * The name to reference this source is its name. + */ + FacetNode.prototype.getSource = function () { + return this.name; + }; + FacetNode.prototype.getChildIndependentFieldsWithStep = function () { + var childIndependentFieldsWithStep = {}; + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + var childScaleComponent = this.childModel.component.scales[channel]; + if (childScaleComponent && !childScaleComponent.merged) { + var type = childScaleComponent.get('type'); + var range = childScaleComponent.get('range'); + if (hasDiscreteDomain(type) && isVgRangeStep(range)) { + var domain = assembleDomain(this.childModel, channel); + var field = getFieldFromDomain(domain); + if (field) { + childIndependentFieldsWithStep[channel] = field; + } + else { + warn('Unknown field for ${channel}. Cannot calculate view size.'); + } + } + } + } + return childIndependentFieldsWithStep; + }; + FacetNode.prototype.assembleRowColumnData = function (channel, crossedDataName, childIndependentFieldsWithStep) { + var aggregateChildField = {}; + var childChannel = channel === 'row' ? 'y' : 'x'; + if (childIndependentFieldsWithStep[childChannel]) { + if (crossedDataName) { + aggregateChildField = { + // If there is a crossed data, calculate max + fields: ["distinct_" + childIndependentFieldsWithStep[childChannel]], + ops: ['max'], + // Although it is technically a max, just name it distinct so it's easier to refer to it + as: ["distinct_" + childIndependentFieldsWithStep[childChannel]] + }; + } + else { + aggregateChildField = { + // If there is no crossed data, just calculate distinct + fields: [childIndependentFieldsWithStep[childChannel]], + ops: ['distinct'] + }; + } + } + return { + name: channel === 'row' ? this.rowName : this.columnName, + // Use data from the crossed one if it exist + source: crossedDataName || this.data, + transform: [__assign({ type: 'aggregate', groupby: channel === 'row' ? this.rowFields : this.columnFields }, aggregateChildField)] + }; + }; + FacetNode.prototype.assemble = function () { + var data = []; + var crossedDataName = null; + var childIndependentFieldsWithStep = this.getChildIndependentFieldsWithStep(); + if (this.columnName && this.rowName && (childIndependentFieldsWithStep.x || childIndependentFieldsWithStep.y)) { + // Need to create a cross dataset to correctly calculate cardinality + crossedDataName = "cross_" + this.columnName + "_" + this.rowName; + var fields = [].concat(childIndependentFieldsWithStep.x ? [childIndependentFieldsWithStep.x] : [], childIndependentFieldsWithStep.y ? [childIndependentFieldsWithStep.y] : []); + var ops = fields.map(function () { return 'distinct'; }); + data.push({ + name: crossedDataName, + source: this.data, + transform: [{ + type: 'aggregate', + groupby: this.columnFields.concat(this.rowFields), + fields: fields, + ops: ops + }] + }); + } + if (this.columnName) { + data.push(this.assembleRowColumnData('column', crossedDataName, childIndependentFieldsWithStep)); + } + if (this.rowName) { + data.push(this.assembleRowColumnData('row', crossedDataName, childIndependentFieldsWithStep)); + } + return data; + }; + return FacetNode; + }(DataFlowNode)); + + var FilterInvalidNode = /** @class */ (function (_super) { + __extends(FilterInvalidNode, _super); + function FilterInvalidNode(parent, fieldDefs) { + var _this = _super.call(this, parent) || this; + _this.fieldDefs = fieldDefs; + return _this; + } + FilterInvalidNode.prototype.clone = function () { + return new FilterInvalidNode(null, __assign({}, this.fieldDefs)); + }; + FilterInvalidNode.make = function (parent, model) { + var config = model.config, mark = model.mark; + if (config.invalidValues !== 'filter') { + return null; + } + var filter = model.reduceFieldDef(function (aggregator, fieldDef, channel) { + var scaleComponent = isScaleChannel(channel) && model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + // While discrete domain scales can handle invalid values, continuous scales can't. + // Thus, for non-path marks, we have to filter null for scales with continuous domains. + // (For path marks, we will use "defined" property and skip these values instead.) + if (hasContinuousDomain(scaleType) && !fieldDef.aggregate && !isPathMark(mark)) { + aggregator[fieldDef.field] = fieldDef; + } + } + return aggregator; + }, {}); + if (!keys(filter).length) { + return null; + } + return new FilterInvalidNode(parent, filter); + }; + Object.defineProperty(FilterInvalidNode.prototype, "filter", { + get: function () { + return this.fieldDefs; + }, + enumerable: true, + configurable: true + }); + // create the VgTransforms for each of the filtered fields + FilterInvalidNode.prototype.assemble = function () { + var _this = this; + var filters = keys(this.filter).reduce(function (vegaFilters, field) { + var fieldDef = _this.fieldDefs[field]; + var ref = vgField(fieldDef, { expr: 'datum' }); + if (fieldDef !== null) { + vegaFilters.push(ref + " !== null"); + vegaFilters.push("!isNaN(" + ref + ")"); + } + return vegaFilters; + }, []); + return filters.length > 0 ? + { + type: 'filter', + expr: filters.join(' && ') + } : null; + }; + return FilterInvalidNode; + }(DataFlowNode)); + + /** + * @param field The field. + * @param parse What to parse the field as. + */ + function parseExpression(field$$1, parse) { + var f = accessPathWithDatum(field$$1); + if (parse === 'number') { + return "toNumber(" + f + ")"; + } + else if (parse === 'boolean') { + return "toBoolean(" + f + ")"; + } + else if (parse === 'string') { + return "toString(" + f + ")"; + } + else if (parse === 'date') { + return "toDate(" + f + ")"; + } + else if (parse === 'flatten') { + return f; + } + else if (parse.indexOf('date:') === 0) { + var specifier = parse.slice(5, parse.length); + return "timeParse(" + f + "," + specifier + ")"; + } + else if (parse.indexOf('utc:') === 0) { + var specifier = parse.slice(4, parse.length); + return "utcParse(" + f + "," + specifier + ")"; + } + else { + warn(message.unrecognizedParse(parse)); + return null; + } + } + var ParseNode = /** @class */ (function (_super) { + __extends(ParseNode, _super); + function ParseNode(parent, parse) { + var _this = _super.call(this, parent) || this; + _this._parse = parse; + return _this; + } + ParseNode.prototype.clone = function () { + return new ParseNode(null, duplicate(this._parse)); + }; + /** + * Creates a parse node from a data.format.parse and updates ancestorParse. + */ + ParseNode.makeExplicit = function (parent, model, ancestorParse) { + // Custom parse + var explicit = {}; + var data = model.data; + if (data && data.format && data.format.parse) { + explicit = data.format.parse; + } + return this.makeWithAncestors(parent, explicit, {}, ancestorParse); + }; + ParseNode.makeImplicitFromFilterTransform = function (parent, transform, ancestorParse) { + var parse = {}; + forEachLeaf(transform.filter, function (filter) { + if (isFieldPredicate(filter)) { + // Automatically add a parse node for filters with filter objects + var val = null; + // For EqualFilter, just use the equal property. + // For RangeFilter and OneOfFilter, all array members should have + // the same type, so we only use the first one. + if (isFieldEqualPredicate(filter)) { + val = filter.equal; + } + else if (isFieldRangePredicate(filter)) { + val = filter.range[0]; + } + else if (isFieldOneOfPredicate(filter)) { + val = (filter.oneOf || filter['in'])[0]; + } // else -- for filter expression, we can't infer anything + if (val) { + if (isDateTime(val)) { + parse[filter.field] = 'date'; + } + else if (isNumber(val)) { + parse[filter.field] = 'number'; + } + else if (isString(val)) { + parse[filter.field] = 'string'; + } + } + if (filter.timeUnit) { + parse[filter.field] = 'date'; + } + } + }); + if (keys(parse).length === 0) { + return null; + } + return this.makeWithAncestors(parent, {}, parse, ancestorParse); + }; + /** + * Creates a parse node for implicit parsing from a model and updates ancestorParse. + */ + ParseNode.makeImplicitFromEncoding = function (parent, model, ancestorParse) { + var implicit = {}; + if (isUnitModel(model) || isFacetModel(model)) { + // Parse encoded fields + model.forEachFieldDef(function (fieldDef) { + if (isTimeFieldDef(fieldDef)) { + implicit[fieldDef.field] = 'date'; + } + else if (isNumberFieldDef(fieldDef)) { + if (!isCountingAggregateOp(fieldDef.aggregate)) { + implicit[fieldDef.field] = 'number'; + } + } + else if (accessPathDepth(fieldDef.field) > 1) { + // For non-date/non-number (strings and booleans), derive a flattened field for a referenced nested field. + // (Parsing numbers / dates already flattens numeric and temporal fields.) + if (!(fieldDef.field in implicit)) { + implicit[fieldDef.field] = 'flatten'; + } + } + else if (isScaleFieldDef(fieldDef) && isSortField(fieldDef.sort) && accessPathDepth(fieldDef.sort.field) > 1) { + // Flatten fields that we sort by but that are not otherwise flattened. + if (!(fieldDef.sort.field in implicit)) { + implicit[fieldDef.sort.field] = 'flatten'; + } + } + }); + } + return this.makeWithAncestors(parent, {}, implicit, ancestorParse); + }; + /** + * Creates a parse node from "explicit" parse and "implicit" parse and updates ancestorParse. + */ + ParseNode.makeWithAncestors = function (parent, explicit, implicit, ancestorParse) { + // We should not parse what has already been parsed in a parent (explicitly or implicitly) or what has been derived (maked as "derived"). We also don't need to flatten a field that has already been parsed. + for (var _i = 0, _a = keys(implicit); _i < _a.length; _i++) { + var field$$1 = _a[_i]; + var parsedAs = ancestorParse.getWithExplicit(field$$1); + if (parsedAs.value !== undefined) { + // We always ignore derived fields even if they are implicitly defined because we expect users to create the right types. + if (parsedAs.explicit || parsedAs.value === implicit[field$$1] || parsedAs.value === 'derived' || implicit[field$$1] === 'flatten') { + delete implicit[field$$1]; + } + else { + warn(message.differentParse(field$$1, implicit[field$$1], parsedAs.value)); + } + } + } + for (var _b = 0, _c = keys(explicit); _b < _c.length; _b++) { + var field$$1 = _c[_b]; + var parsedAs = ancestorParse.get(field$$1); + if (parsedAs !== undefined) { + // Don't parse a field again if it has been parsed with the same type already. + if (parsedAs === explicit[field$$1]) { + delete explicit[field$$1]; + } + else { + warn(message.differentParse(field$$1, explicit[field$$1], parsedAs)); + } + } + } + var parse = new Split(explicit, implicit); + // add the format parse from this model so that children don't parse the same field again + ancestorParse.copyAll(parse); + // copy only non-null parses + var p = {}; + for (var _d = 0, _e = keys(parse.combine()); _d < _e.length; _d++) { + var key$$1 = _e[_d]; + var val = parse.get(key$$1); + if (val !== null) { + p[key$$1] = val; + } + } + if (keys(p).length === 0 || ancestorParse.parseNothing) { + return null; + } + return new ParseNode(parent, p); + }; + Object.defineProperty(ParseNode.prototype, "parse", { + get: function () { + return this._parse; + }, + enumerable: true, + configurable: true + }); + ParseNode.prototype.merge = function (other) { + this._parse = __assign({}, this._parse, other.parse); + other.remove(); + }; + /** + * Assemble an object for Vega's format.parse property. + */ + ParseNode.prototype.assembleFormatParse = function () { + var formatParse = {}; + for (var _i = 0, _a = keys(this._parse); _i < _a.length; _i++) { + var field$$1 = _a[_i]; + var p = this._parse[field$$1]; + if (accessPathDepth(field$$1) === 1) { + formatParse[field$$1] = p; + } + } + return formatParse; + }; + // format parse depends and produces all fields in its parse + ParseNode.prototype.producedFields = function () { + return toSet(keys(this._parse)); + }; + ParseNode.prototype.dependentFields = function () { + return toSet(keys(this._parse)); + }; + ParseNode.prototype.assembleTransforms = function (onlyNested) { + var _this = this; + if (onlyNested === void 0) { onlyNested = false; } + return keys(this._parse) + .filter(function (field$$1) { return onlyNested ? accessPathDepth(field$$1) > 1 : true; }) + .map(function (field$$1) { + var expr = parseExpression(field$$1, _this._parse[field$$1]); + if (!expr) { + return null; + } + var formula = { + type: 'formula', + expr: expr, + as: removePathFromField(field$$1) // Vega output is always flattened + }; + return formula; + }).filter(function (t) { return t !== null; }); + }; + return ParseNode; + }(DataFlowNode)); + + var SourceNode = /** @class */ (function (_super) { + __extends(SourceNode, _super); + function SourceNode(data) { + var _this = _super.call(this, null) || this; + data = data || { name: 'source' }; + if (isInlineData(data)) { + _this._data = { values: data.values }; + } + else if (isUrlData(data)) { + _this._data = { url: data.url }; + if (!data.format) { + data.format = {}; + } + if (!data.format || !data.format.type) { + // Extract extension from URL using snippet from + // http://stackoverflow.com/questions/680929/how-to-extract-extension-from-filename-string-in-javascript + var defaultExtension = /(?:\.([^.]+))?$/.exec(data.url)[1]; + if (!contains(['json', 'csv', 'tsv', 'dsv', 'topojson'], defaultExtension)) { + defaultExtension = 'json'; + } + // defaultExtension has type string but we ensure that it is DataFormatType above + data.format.type = defaultExtension; + } + } + else if (isNamedData(data)) { + _this._data = {}; + } + // any dataset can be named + if (data.name) { + _this._name = data.name; + } + if (data.format) { + var _a = data.format, _b = _a.parse, format = __rest(_a, ["parse"]); + _this._data.format = format; + } + return _this; + } + Object.defineProperty(SourceNode.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + SourceNode.prototype.hasName = function () { + return !!this._name; + }; + Object.defineProperty(SourceNode.prototype, "dataName", { + get: function () { + return this._name; + }, + set: function (name) { + this._name = name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(SourceNode.prototype, "parent", { + set: function (parent) { + throw new Error('Source nodes have to be roots.'); + }, + enumerable: true, + configurable: true + }); + SourceNode.prototype.remove = function () { + throw new Error('Source nodes are roots and cannot be removed.'); + }; + /** + * Return a unique identifier for this data source. + */ + SourceNode.prototype.hash = function () { + if (isInlineData(this._data)) { + if (!this._hash) { + // Hashing can be expensive for large inline datasets. + this._hash = hash(this._data); + } + return this._hash; + } + else if (isUrlData(this._data)) { + return hash([this._data.url, this._data.format]); + } + else { + return this._name; + } + }; + SourceNode.prototype.assemble = function () { + return __assign({ name: this._name }, this._data, { transform: [] }); + }; + return SourceNode; + }(DataFlowNode)); + + var TimeUnitNode = /** @class */ (function (_super) { + __extends(TimeUnitNode, _super); + function TimeUnitNode(parent, formula) { + var _this = _super.call(this, parent) || this; + _this.formula = formula; + return _this; + } + TimeUnitNode.prototype.clone = function () { + return new TimeUnitNode(null, duplicate(this.formula)); + }; + TimeUnitNode.makeFromEncoding = function (parent, model) { + var formula = model.reduceFieldDef(function (timeUnitComponent, fieldDef) { + if (fieldDef.timeUnit) { + var f = vgField(fieldDef); + timeUnitComponent[f] = { + as: f, + timeUnit: fieldDef.timeUnit, + field: fieldDef.field + }; + } + return timeUnitComponent; + }, {}); + if (keys(formula).length === 0) { + return null; + } + return new TimeUnitNode(parent, formula); + }; + TimeUnitNode.makeFromTransform = function (parent, t) { + var _a; + return new TimeUnitNode(parent, (_a = {}, + _a[t.field] = { + as: t.as, + timeUnit: t.timeUnit, + field: t.field + }, + _a)); + }; + TimeUnitNode.prototype.merge = function (other) { + this.formula = __assign({}, this.formula, other.formula); + other.remove(); + }; + TimeUnitNode.prototype.producedFields = function () { + var out = {}; + vals(this.formula).forEach(function (f) { + out[f.as] = true; + }); + return out; + }; + TimeUnitNode.prototype.dependentFields = function () { + var out = {}; + vals(this.formula).forEach(function (f) { + out[f.field] = true; + }); + return out; + }; + TimeUnitNode.prototype.assemble = function () { + return vals(this.formula).map(function (c) { + return { + type: 'formula', + as: c.as, + expr: fieldExpr(c.timeUnit, c.field) + }; + }); + }; + return TimeUnitNode; + }(DataFlowNode)); + + /** + * Start optimization path at the leaves. Useful for merging up or removing things. + * + * If the callback returns true, the recursion continues. + */ + function iterateFromLeaves(f) { + function optimizeNextFromLeaves(node) { + if (node instanceof SourceNode) { + return; + } + var next = node.parent; + if (f(node)) { + optimizeNextFromLeaves(next); + } + } + return optimizeNextFromLeaves; + } + /** + * Move parse nodes up to forks. + */ + function moveParseUp(node) { + var parent = node.parent; + // move parse up by merging or swapping + if (node instanceof ParseNode) { + if (parent instanceof SourceNode) { + return false; + } + if (parent.numChildren() > 1) { + // don't move parse further up but continue with parent. + return true; + } + if (parent instanceof ParseNode) { + parent.merge(node); + } + else { + // don't swap with nodes that produce something that the parse node depends on (e.g. lookup) + if (hasIntersection(parent.producedFields(), node.dependentFields())) { + return true; + } + node.swapWithParent(); + } + } + return true; + } + /** + * Repeatedly remove leaf nodes that are not output or facet nodes. + * The reason is that we don't need subtrees that don't have any output nodes. + * Facet nodes are needed for the row or column domains. + */ + function removeUnusedSubtrees(node) { + if (node instanceof OutputNode || node.numChildren() > 0 || node instanceof FacetNode) { + // no need to continue with parent because it is output node or will have children (there was a fork) + return false; + } + else { + node.remove(); + } + return true; + } + /** + * Removes duplicate time unit nodes (as determined by the name of the + * output field) that may be generated due to selections projected over + * time units. + */ + function removeDuplicateTimeUnits(leaf) { + var fields = {}; + return iterateFromLeaves(function (node) { + if (node instanceof TimeUnitNode) { + var pfields = node.producedFields(); + var dupe = keys(pfields).every(function (k) { return !!fields[k]; }); + if (dupe) { + node.remove(); + } + else { + fields = __assign({}, fields, pfields); + } + } + return true; + })(leaf); + } + + function getStackByFields(model) { + return model.stack.stackBy.reduce(function (fields, by) { + var fieldDef = by.fieldDef; + var _field = vgField(fieldDef); + if (_field) { + fields.push(_field); + } + return fields; + }, []); + } + function isValidAsArray(as) { + return isArray(as) && as.every(function (s) { return isString(s); }) && as.length > 1; + } + var StackNode = /** @class */ (function (_super) { + __extends(StackNode, _super); + function StackNode(parent, stack) { + var _this = _super.call(this, parent) || this; + _this._stack = stack; + return _this; + } + StackNode.prototype.clone = function () { + return new StackNode(null, duplicate(this._stack)); + }; + StackNode.makeFromTransform = function (parent, stackTransform) { + var stack = stackTransform.stack, groupby = stackTransform.groupby, as = stackTransform.as, _a = stackTransform.offset, offset = _a === void 0 ? 'zero' : _a; + var sortFields = []; + var sortOrder = []; + if (stackTransform.sort !== undefined) { + for (var _i = 0, _b = stackTransform.sort; _i < _b.length; _i++) { + var sortField = _b[_i]; + sortFields.push(sortField.field); + sortOrder.push(sortField.order === undefined ? 'ascending' : sortField.order); + } + } + var sort = { + field: sortFields, + order: sortOrder, + }; + var normalizedAs; + if (isValidAsArray(as)) { + normalizedAs = as; + } + else if (isString(as)) { + normalizedAs = [as, as + '_end']; + } + else { + normalizedAs = [stackTransform.stack + '_start', stackTransform.stack + '_end']; + } + return new StackNode(parent, { + stackField: stack, + groupby: groupby, + offset: offset, + sort: sort, + facetby: [], + as: normalizedAs + }); + }; + StackNode.makeFromEncoding = function (parent, model) { + var stackProperties = model.stack; + if (!stackProperties) { + return null; + } + var dimensionFieldDef; + if (stackProperties.groupbyChannel) { + dimensionFieldDef = model.fieldDef(stackProperties.groupbyChannel); + } + var stackby = getStackByFields(model); + var orderDef = model.encoding.order; + var sort; + if (isArray(orderDef) || isFieldDef(orderDef)) { + sort = sortParams(orderDef); + } + else { + // default = descending by stackFields + // FIXME is the default here correct for binned fields? + sort = stackby.reduce(function (s, field$$1) { + s.field.push(field$$1); + s.order.push('descending'); + return s; + }, { field: [], order: [] }); + } + // Refactored to add "as" in the make phase so that we can get producedFields + // from the as property + var field$$1 = model.vgField(stackProperties.fieldChannel); + return new StackNode(parent, { + dimensionFieldDef: dimensionFieldDef, + stackField: field$$1, + facetby: [], + stackby: stackby, + sort: sort, + offset: stackProperties.offset, + impute: stackProperties.impute, + as: [field$$1 + '_start', field$$1 + '_end'] + }); + }; + Object.defineProperty(StackNode.prototype, "stack", { + get: function () { + return this._stack; + }, + enumerable: true, + configurable: true + }); + StackNode.prototype.addDimensions = function (fields) { + this._stack.facetby = this._stack.facetby.concat(fields); + }; + StackNode.prototype.dependentFields = function () { + var out = {}; + out[this._stack.stackField] = true; + this.getGroupbyFields().forEach(function (f) { return out[f] = true; }); + this._stack.facetby.forEach(function (f) { return out[f] = true; }); + var field$$1 = this._stack.sort.field; + isArray(field$$1) ? field$$1.forEach(function (f) { return out[f] = true; }) : out[field$$1] = true; + return out; + }; + StackNode.prototype.producedFields = function () { + return this._stack.as.reduce(function (result, item) { + result[item] = true; + return result; + }, {}); + }; + StackNode.prototype.getGroupbyFields = function () { + var _a = this._stack, dimensionFieldDef = _a.dimensionFieldDef, impute = _a.impute, groupby = _a.groupby; + if (dimensionFieldDef) { + if (dimensionFieldDef.bin) { + if (impute) { + // For binned group by field with impute, we calculate bin_mid + // as we cannot impute two fields simultaneously + return [vgField(dimensionFieldDef, { binSuffix: 'mid' })]; + } + return [ + // For binned group by field without impute, we need both bin (start) and bin_end + vgField(dimensionFieldDef, {}), + vgField(dimensionFieldDef, { binSuffix: 'end' }) + ]; + } + return [vgField(dimensionFieldDef)]; + } + return groupby || []; + }; + StackNode.prototype.assemble = function () { + var transform = []; + var _a = this._stack, facetby = _a.facetby, dimensionFieldDef = _a.dimensionFieldDef, field$$1 = _a.stackField, stackby = _a.stackby, sort = _a.sort, offset = _a.offset, impute = _a.impute, as = _a.as; + // Impute + if (impute && dimensionFieldDef) { + var dimensionField = dimensionFieldDef ? vgField(dimensionFieldDef, { binSuffix: 'mid' }) : undefined; + if (dimensionFieldDef.bin) { + // As we can only impute one field at a time, we need to calculate + // mid point for a binned field + transform.push({ + type: 'formula', + expr: '(' + + vgField(dimensionFieldDef, { expr: 'datum' }) + + '+' + + vgField(dimensionFieldDef, { expr: 'datum', binSuffix: 'end' }) + + ')/2', + as: dimensionField + }); + } + transform.push({ + type: 'impute', + field: field$$1, + groupby: stackby, + key: dimensionField, + method: 'value', + value: 0 + }); + } + // Stack + transform.push({ + type: 'stack', + groupby: this.getGroupbyFields().concat(facetby), + field: field$$1, + sort: sort, + as: as, + offset: offset + }); + return transform; + }; + return StackNode; + }(DataFlowNode)); + + var FACET_SCALE_PREFIX = 'scale_'; + /** + * Clones the subtree and ignores output nodes except for the leafs, which are renamed. + */ + function cloneSubtree(facet) { + function clone(node) { + if (!(node instanceof FacetNode)) { + var copy_1 = node.clone(); + if (copy_1 instanceof OutputNode) { + var newName = FACET_SCALE_PREFIX + copy_1.getSource(); + copy_1.setSource(newName); + facet.model.component.data.outputNodes[newName] = copy_1; + } + else if (copy_1 instanceof AggregateNode || copy_1 instanceof StackNode) { + copy_1.addDimensions(facet.fields); + } + flatten(node.children.map(clone)).forEach(function (n) { return n.parent = copy_1; }); + return [copy_1]; + } + return flatten(node.children.map(clone)); + } + return clone; + } + /** + * Move facet nodes down to the next fork or output node. Also pull the main output with the facet node. + * After moving down the facet node, make a copy of the subtree and make it a child of the main output. + */ + function moveFacetDown(node) { + if (node instanceof FacetNode) { + if (node.numChildren() === 1 && !(node.children[0] instanceof OutputNode)) { + // move down until we hit a fork or output node + var child = node.children[0]; + if (child instanceof AggregateNode || child instanceof StackNode) { + child.addDimensions(node.fields); + } + child.swapWithParent(); + moveFacetDown(node); + } + else { + // move main to facet + moveMainDownToFacet(node.model.component.data.main); + // replicate the subtree and place it before the facet's main node + var copy = flatten(node.children.map(cloneSubtree(node))); + copy.forEach(function (c) { return c.parent = node.model.component.data.main; }); + } + } + else { + node.children.forEach(moveFacetDown); + } + } + function moveMainDownToFacet(node) { + if (node instanceof OutputNode && node.type === MAIN) { + if (node.numChildren() === 1) { + var child = node.children[0]; + if (!(child instanceof FacetNode)) { + child.swapWithParent(); + moveMainDownToFacet(node); + } + } + } + } + /** + * Remove nodes that are not required starting from a root. + */ + function removeUnnecessaryNodes(node) { + // remove empty null filter nodes + if (node instanceof FilterInvalidNode && every(vals(node.filter), function (f) { return f === null; })) { + node.remove(); + } + // remove output nodes that are not required + if (node instanceof OutputNode && !node.isRequired()) { + node.remove(); + } + node.children.forEach(removeUnnecessaryNodes); + } + /** + * Return all leaf nodes. + */ + function getLeaves(roots) { + var leaves = []; + function append(node) { + if (node.numChildren() === 0) { + leaves.push(node); + } + else { + node.children.forEach(append); + } + } + roots.forEach(append); + return leaves; + } + /** + * Optimizes the dataflow of the passed in data component. + */ + function optimizeDataflow(dataComponent) { + var roots = vals(dataComponent.sources); + roots.forEach(removeUnnecessaryNodes); + // remove source nodes that don't have any children because they also don't have output nodes + roots = roots.filter(function (r) { return r.numChildren() > 0; }); + getLeaves(roots).forEach(iterateFromLeaves(removeUnusedSubtrees)); + roots = roots.filter(function (r) { return r.numChildren() > 0; }); + getLeaves(roots).forEach(iterateFromLeaves(moveParseUp)); + getLeaves(roots).forEach(removeDuplicateTimeUnits); + roots.forEach(moveFacetDown); + keys(dataComponent.sources).forEach(function (s) { + if (dataComponent.sources[s].numChildren() === 0) { + delete dataComponent.sources[s]; + } + }); + } + + function parseScaleDomain(model) { + if (isUnitModel(model)) { + parseUnitScaleDomain(model); + } + else { + parseNonUnitScaleDomain(model); + } + } + function parseUnitScaleDomain(model) { + var scales = model.specifiedScales; + var localScaleComponents = model.component.scales; + keys(localScaleComponents).forEach(function (channel) { + var specifiedScale = scales[channel]; + var specifiedDomain = specifiedScale ? specifiedScale.domain : undefined; + var domains = parseDomainForChannel(model, channel); + var localScaleCmpt = localScaleComponents[channel]; + localScaleCmpt.domains = domains; + if (isSelectionDomain(specifiedDomain)) { + // As scale parsing occurs before selection parsing, we use a temporary + // signal here and append the scale.domain definition. This is replaced + // with the correct domainRaw signal during scale assembly. + // For more information, see isRawSelectionDomain in selection.ts. + // FIXME: replace this with a special property in the scaleComponent + localScaleCmpt.set('domainRaw', { + signal: SELECTION_DOMAIN + hash(specifiedDomain) + }, true); + } + if (model.component.data.isFaceted) { + // get resolve from closest facet parent as this decides whether we need to refer to cloned subtree or not + var facetParent = model; + while (!isFacetModel(facetParent) && facetParent.parent) { + facetParent = facetParent.parent; + } + var resolve = facetParent.component.resolve.scale[channel]; + if (resolve === 'shared') { + for (var _i = 0, domains_1 = domains; _i < domains_1.length; _i++) { + var domain = domains_1[_i]; + // Replace the scale domain with data output from a cloned subtree after the facet. + if (isDataRefDomain(domain)) { + // use data from cloned subtree (which is the same as data but with a prefix added once) + domain.data = FACET_SCALE_PREFIX + domain.data.replace(FACET_SCALE_PREFIX, ''); + } + } + } + } + }); + } + function parseNonUnitScaleDomain(model) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + parseScaleDomain(child); + } + var localScaleComponents = model.component.scales; + keys(localScaleComponents).forEach(function (channel) { + var domains; + var domainRaw = null; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childComponent = child.component.scales[channel]; + if (childComponent) { + if (domains === undefined) { + domains = childComponent.domains; + } + else { + domains = domains.concat(childComponent.domains); + } + var dr = childComponent.get('domainRaw'); + if (domainRaw && dr && domainRaw.signal !== dr.signal) { + warn('The same selection must be used to override scale domains in a layered view.'); + } + domainRaw = dr; + } + } + localScaleComponents[channel].domains = domains; + if (domainRaw) { + localScaleComponents[channel].set('domainRaw', domainRaw, true); + } + }); + } + /** + * Remove unaggregated domain if it is not applicable + * Add unaggregated domain if domain is not specified and config.scale.useUnaggregatedDomain is true. + */ + function normalizeUnaggregatedDomain(domain, fieldDef, scaleType, scaleConfig) { + if (domain === 'unaggregated') { + var _a = canUseUnaggregatedDomain(fieldDef, scaleType), valid = _a.valid, reason = _a.reason; + if (!valid) { + warn(reason); + return undefined; + } + } + else if (domain === undefined && scaleConfig.useUnaggregatedDomain) { + // Apply config if domain is not specified. + var valid = canUseUnaggregatedDomain(fieldDef, scaleType).valid; + if (valid) { + return 'unaggregated'; + } + } + return domain; + } + function parseDomainForChannel(model, channel) { + var scaleType = model.getScaleComponent(channel).get('type'); + var domain = normalizeUnaggregatedDomain(model.scaleDomain(channel), model.fieldDef(channel), scaleType, model.config.scale); + if (domain !== model.scaleDomain(channel)) { + model.specifiedScales[channel] = __assign({}, model.specifiedScales[channel], { domain: domain }); + } + // If channel is either X or Y then union them with X2 & Y2 if they exist + if (channel === 'x' && model.channelHasField('x2')) { + if (model.channelHasField('x')) { + return parseSingleChannelDomain(scaleType, domain, model, 'x').concat(parseSingleChannelDomain(scaleType, domain, model, 'x2')); + } + else { + return parseSingleChannelDomain(scaleType, domain, model, 'x2'); + } + } + else if (channel === 'y' && model.channelHasField('y2')) { + if (model.channelHasField('y')) { + return parseSingleChannelDomain(scaleType, domain, model, 'y').concat(parseSingleChannelDomain(scaleType, domain, model, 'y2')); + } + else { + return parseSingleChannelDomain(scaleType, domain, model, 'y2'); + } + } + return parseSingleChannelDomain(scaleType, domain, model, channel); + } + function parseSingleChannelDomain(scaleType, domain, model, channel) { + var fieldDef = model.fieldDef(channel); + if (domain && domain !== 'unaggregated' && !isSelectionDomain(domain)) { // explicit value + if (isDateTime(domain[0])) { + return domain.map(function (dt) { + return { signal: "{data: " + dateTimeExpr(dt, true) + "}" }; + }); + } + return [domain]; + } + var stack = model.stack; + if (stack && channel === stack.fieldChannel) { + if (stack.offset === 'normalize') { + return [[0, 1]]; + } + var data = model.requestDataName(MAIN); + return [{ + data: data, + field: model.vgField(channel, { suffix: 'start' }) + }, { + data: data, + field: model.vgField(channel, { suffix: 'end' }) + }]; + } + var sort = isScaleChannel(channel) ? domainSort(model, channel, scaleType) : undefined; + if (domain === 'unaggregated') { + var data = model.requestDataName(MAIN); + var field$$1 = fieldDef.field; + return [{ + data: data, + field: vgField({ field: field$$1, aggregate: 'min' }) + }, { + data: data, + field: vgField({ field: field$$1, aggregate: 'max' }) + }]; + } + else if (fieldDef.bin) { // bin + if (isBinScale(scaleType)) { + var signal = model.getName(binToString(fieldDef.bin) + "_" + fieldDef.field + "_bins"); + return [{ signal: "sequence(" + signal + ".start, " + signal + ".stop + " + signal + ".step, " + signal + ".step)" }]; + } + if (hasDiscreteDomain(scaleType)) { + // ordinal bin scale takes domain from bin_range, ordered by bin start + // This is useful for both axis-based scale (x/y) and legend-based scale (other channels). + return [{ + // If sort by aggregation of a specified sort field, we need to use RAW table, + // so we can aggregate values for the scale independently from the main aggregation. + data: isBoolean$1(sort) ? model.requestDataName(MAIN) : model.requestDataName(RAW), + // Use range if we added it and the scale does not support computing a range as a signal. + field: model.vgField(channel, binRequiresRange(fieldDef, channel) ? { binSuffix: 'range' } : {}), + // we have to use a sort object if sort = true to make the sort correct by bin start + sort: sort === true || !isSortField(sort) ? { + field: model.vgField(channel, {}), + op: 'min' // min or max doesn't matter since we sort by the start of the bin range + } : sort + }]; + } + else { // continuous scales + if (channel === 'x' || channel === 'y') { + if (isBinParams(fieldDef.bin) && fieldDef.bin.extent) { + return [fieldDef.bin.extent]; + } + // X/Y position have to include start and end for non-ordinal scale + var data = model.requestDataName(MAIN); + return [{ + data: data, + field: model.vgField(channel, {}) + }, { + data: data, + field: model.vgField(channel, { binSuffix: 'end' }) + }]; + } + else { + // TODO: use bin_mid + return [{ + data: model.requestDataName(MAIN), + field: model.vgField(channel, {}) + }]; + } + } + } + else if (sort) { + return [{ + // If sort by aggregation of a specified sort field, we need to use RAW table, + // so we can aggregate values for the scale independently from the main aggregation. + data: isBoolean$1(sort) ? model.requestDataName(MAIN) : model.requestDataName(RAW), + field: model.vgField(channel), + sort: sort + }]; + } + else { + return [{ + data: model.requestDataName(MAIN), + field: model.vgField(channel) + }]; + } + } + function domainSort(model, channel, scaleType) { + if (!hasDiscreteDomain(scaleType)) { + return undefined; + } + var fieldDef = model.fieldDef(channel); + var sort = fieldDef.sort; + // if the sort is specified with array, use the derived sort index field + if (isSortArray(sort)) { + return { + op: 'min', + field: sortArrayIndexField(model, channel), + order: 'ascending' + }; + } + // Sorted based on an aggregate calculation over a specified sort field (only for ordinal scale) + if (isSortField(sort)) { + // flatten nested fields + return __assign({}, sort, (sort.field ? { field: replacePathInField(sort.field) } : {})); + } + if (sort === 'descending') { + return { + op: 'min', + field: model.vgField(channel), + order: 'descending' + }; + } + if (contains(['ascending', undefined /* default =ascending*/], sort)) { + return true; + } + // sort == null + return undefined; + } + /** + * Determine if a scale can use unaggregated domain. + * @return {Boolean} Returns true if all of the following conditons applies: + * 1. `scale.domain` is `unaggregated` + * 2. Aggregation function is not `count` or `sum` + * 3. The scale is quantitative or time scale. + */ + function canUseUnaggregatedDomain(fieldDef, scaleType) { + if (!fieldDef.aggregate) { + return { + valid: false, + reason: message.unaggregateDomainHasNoEffectForRawField(fieldDef) + }; + } + if (!SHARED_DOMAIN_OP_INDEX[fieldDef.aggregate]) { + return { + valid: false, + reason: message.unaggregateDomainWithNonSharedDomainOp(fieldDef.aggregate) + }; + } + if (fieldDef.type === 'quantitative') { + if (scaleType === 'log') { + return { + valid: false, + reason: message.unaggregatedDomainWithLogScale(fieldDef) + }; + } + } + return { valid: true }; + } + /** + * Converts an array of domains to a single Vega scale domain. + */ + function mergeDomains(domains) { + var uniqueDomains = unique(domains.map(function (domain) { + // ignore sort property when computing the unique domains + if (isDataRefDomain(domain)) { + var _s = domain.sort, domainWithoutSort = __rest(domain, ["sort"]); + return domainWithoutSort; + } + return domain; + }), hash); + var sorts = unique(domains.map(function (d) { + if (isDataRefDomain(d)) { + var s = d.sort; + if (s !== undefined && !isBoolean$1(s)) { + if (s.op === 'count') { + // let's make sure that if op is count, we don't use a field + delete s.field; + } + if (s.order === 'ascending') { + // drop order: ascending as it is the default + delete s.order; + } + } + return s; + } + return undefined; + }).filter(function (s) { return s !== undefined; }), hash); + if (uniqueDomains.length === 1) { + var domain = domains[0]; + if (isDataRefDomain(domain) && sorts.length > 0) { + var sort_1 = sorts[0]; + if (sorts.length > 1) { + warn(message.MORE_THAN_ONE_SORT); + sort_1 = true; + } + return __assign({}, domain, { sort: sort_1 }); + } + return domain; + } + // only keep simple sort properties that work with unioned domains + var simpleSorts = unique(sorts.map(function (s) { + if (s === true) { + return s; + } + if (s.op === 'count') { + return s; + } + warn(message.domainSortDropped(s)); + return true; + }), hash); + var sort = undefined; + if (simpleSorts.length === 1) { + sort = simpleSorts[0]; + } + else if (simpleSorts.length > 1) { + warn(message.MORE_THAN_ONE_SORT); + sort = true; + } + var allData = unique(domains.map(function (d) { + if (isDataRefDomain(d)) { + return d.data; + } + return null; + }), function (x) { return x; }); + if (allData.length === 1 && allData[0] !== null) { + // create a union domain of different fields with a single data source + var domain = __assign({ data: allData[0], fields: uniqueDomains.map(function (d) { return d.field; }) }, (sort ? { sort: sort } : {})); + return domain; + } + return __assign({ fields: uniqueDomains }, (sort ? { sort: sort } : {})); + } + /** + * Return a field if a scale single field. + * Return `undefined` otherwise. + * + */ + function getFieldFromDomain(domain) { + if (isDataRefDomain(domain) && isString(domain.field)) { + return domain.field; + } + else if (isDataRefUnionedDomain(domain)) { + var field$$1 = void 0; + for (var _i = 0, _a = domain.fields; _i < _a.length; _i++) { + var nonUnionDomain = _a[_i]; + if (isDataRefDomain(nonUnionDomain) && isString(nonUnionDomain.field)) { + if (!field$$1) { + field$$1 = nonUnionDomain.field; + } + else if (field$$1 !== nonUnionDomain.field) { + warn('Detected faceted independent scales that union domain of multiple fields from different data sources. We will use the first field. The result view size may be incorrect.'); + return field$$1; + } + } + } + warn('Detected faceted independent scales that union domain of identical fields from different source detected. We will assume that this is the same field from a different fork of the same data source. However, if this is not case, the result view size maybe incorrect.'); + return field$$1; + } + else if (isFieldRefUnionDomain(domain)) { + warn('Detected faceted independent scales that union domain of multiple fields from the same data source. We will use the first field. The result view size may be incorrect.'); + var field$$1 = domain.fields[0]; + return isString(field$$1) ? field$$1 : undefined; + } + return undefined; + } + function assembleDomain(model, channel) { + var scaleComponent = model.component.scales[channel]; + var domains = scaleComponent.domains.map(function (domain) { + // Correct references to data as the original domain's data was determined + // in parseScale, which happens before parseData. Thus the original data + // reference can be incorrect. + if (isDataRefDomain(domain)) { + domain.data = model.lookupDataSource(domain.data); + } + return domain; + }); + // domains is an array that has to be merged into a single vega domain + return mergeDomains(domains); + } + + function assembleScales(model) { + if (isLayerModel(model) || isConcatModel(model) || isRepeatModel(model)) { + // For concat / layer / repeat, include scales of children too + return model.children.reduce(function (scales, child) { + return scales.concat(assembleScales(child)); + }, assembleScalesForModel(model)); + } + else { + // For facet, child scales would not be included in the parent's scope. + // For unit, there is no child. + return assembleScalesForModel(model); + } + } + function assembleScalesForModel(model) { + return keys(model.component.scales).reduce(function (scales, channel) { + var scaleComponent = model.component.scales[channel]; + if (scaleComponent.merged) { + // Skipped merged scales + return scales; + } + var scale = scaleComponent.combine(); + // need to separate const and non const object destruction + var domainRaw = scale.domainRaw, range = scale.range; + var name = scale.name, type = scale.type, _d = scale.domainRaw, _r = scale.range, otherScaleProps = __rest(scale, ["name", "type", "domainRaw", "range"]); + range = assembleScaleRange(range, name, model, channel); + // As scale parsing occurs before selection parsing, a temporary signal + // is used for domainRaw. Here, we detect if this temporary signal + // is set, and replace it with the correct domainRaw signal. + // For more information, see isRawSelectionDomain in selection.ts. + if (domainRaw && isRawSelectionDomain(domainRaw)) { + domainRaw = selectionScaleDomain(model, domainRaw); + } + scales.push(__assign({ name: name, + type: type, domain: assembleDomain(model, channel) }, (domainRaw ? { domainRaw: domainRaw } : {}), { range: range }, otherScaleProps)); + return scales; + }, []); + } + function assembleScaleRange(scaleRange, scaleName, model, channel) { + // add signals to x/y range + if (channel === 'x' || channel === 'y') { + if (isVgRangeStep(scaleRange)) { + // For x/y range step, use a signal created in layout assemble instead of a constant range step. + return { + step: { signal: scaleName + '_step' } + }; + } + else if (isArray(scaleRange) && scaleRange.length === 2) { + var r0 = scaleRange[0]; + var r1 = scaleRange[1]; + if (r0 === 0 && isVgSignalRef(r1)) { + // Replace width signal just in case it is renamed. + return [0, { signal: model.getSizeName(r1.signal) }]; + } + else if (isVgSignalRef(r0) && r1 === 0) { + // Replace height signal just in case it is renamed. + return [{ signal: model.getSizeName(r0.signal) }, 0]; + } + } + } + return scaleRange; + } + + var ScaleComponent = /** @class */ (function (_super) { + __extends(ScaleComponent, _super); + function ScaleComponent(name, typeWithExplicit) { + var _this = _super.call(this, {}, // no initial explicit property + { name: name } // name as initial implicit property + ) || this; + _this.merged = false; + _this.domains = []; + _this.setWithExplicit('type', typeWithExplicit); + return _this; + } + return ScaleComponent; + }(Split)); + + var RANGE_PROPERTIES = ['range', 'rangeStep', 'scheme']; + function parseScaleRange(model) { + if (isUnitModel(model)) { + parseUnitScaleRange(model); + } + else { + parseNonUnitScaleProperty(model, 'range'); + } + } + function parseUnitScaleRange(model) { + var localScaleComponents = model.component.scales; + // use SCALE_CHANNELS instead of scales[channel] to ensure that x, y come first! + SCALE_CHANNELS.forEach(function (channel) { + var localScaleCmpt = localScaleComponents[channel]; + if (!localScaleCmpt) { + return; + } + var mergedScaleCmpt = model.getScaleComponent(channel); + var specifiedScale = model.specifiedScales[channel]; + var fieldDef = model.fieldDef(channel); + // Read if there is a specified width/height + var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined; + var sizeSpecified = sizeType ? !!model.component.layoutSize.get(sizeType) : undefined; + var scaleType = mergedScaleCmpt.get('type'); + // if autosize is fit, size cannot be data driven + var rangeStep = contains(['point', 'band'], scaleType) || !!specifiedScale.rangeStep; + if (sizeType && model.fit && !sizeSpecified && rangeStep) { + warn(message.CANNOT_FIX_RANGE_STEP_WITH_FIT); + sizeSpecified = true; + } + var xyRangeSteps = getXYRangeStep(model); + var rangeWithExplicit = parseRangeForChannel(channel, scaleType, fieldDef.type, specifiedScale, model.config, localScaleCmpt.get('zero'), model.mark, sizeSpecified, model.getName(sizeType), xyRangeSteps); + localScaleCmpt.setWithExplicit('range', rangeWithExplicit); + }); + } + function getXYRangeStep(model) { + var xyRangeSteps = []; + var xScale = model.getScaleComponent('x'); + var xRange = xScale && xScale.get('range'); + if (xRange && isVgRangeStep(xRange) && isNumber(xRange.step)) { + xyRangeSteps.push(xRange.step); + } + var yScale = model.getScaleComponent('y'); + var yRange = yScale && yScale.get('range'); + if (yRange && isVgRangeStep(yRange) && isNumber(yRange.step)) { + xyRangeSteps.push(yRange.step); + } + return xyRangeSteps; + } + /** + * Return mixins that includes one of the range properties (range, rangeStep, scheme). + */ + function parseRangeForChannel(channel, scaleType, type, specifiedScale, config, zero$$1, mark, sizeSpecified, sizeSignal, xyRangeSteps) { + var noRangeStep = sizeSpecified || specifiedScale.rangeStep === null; + // Check if any of the range properties is specified. + // If so, check if it is compatible and make sure that we only output one of the properties + for (var _i = 0, RANGE_PROPERTIES_1 = RANGE_PROPERTIES; _i < RANGE_PROPERTIES_1.length; _i++) { + var property = RANGE_PROPERTIES_1[_i]; + if (specifiedScale[property] !== undefined) { + var supportedByScaleType = scaleTypeSupportProperty(scaleType, property); + var channelIncompatability = channelScalePropertyIncompatability(channel, property); + if (!supportedByScaleType) { + warn(message.scalePropertyNotWorkWithScaleType(scaleType, property, channel)); + } + else if (channelIncompatability) { // channel + warn(channelIncompatability); + } + else { + switch (property) { + case 'range': + return makeExplicit(specifiedScale[property]); + case 'scheme': + return makeExplicit(parseScheme(specifiedScale[property])); + case 'rangeStep': + var rangeStep = specifiedScale[property]; + if (rangeStep !== null) { + if (!sizeSpecified) { + return makeExplicit({ step: rangeStep }); + } + else { + // If top-level size is specified, we ignore specified rangeStep. + warn(message.rangeStepDropped(channel)); + } + } + } + } + } + } + return makeImplicit(defaultRange(channel, scaleType, type, config, zero$$1, mark, sizeSignal, xyRangeSteps, noRangeStep)); + } + function parseScheme(scheme) { + if (isExtendedScheme(scheme)) { + var r = { scheme: scheme.name }; + if (scheme.count) { + r.count = scheme.count; + } + if (scheme.extent) { + r.extent = scheme.extent; + } + return r; + } + return { scheme: scheme }; + } + function defaultRange(channel, scaleType, type, config, zero$$1, mark, sizeSignal, xyRangeSteps, noRangeStep) { + switch (channel) { + case X: + case Y: + if (contains(['point', 'band'], scaleType) && !noRangeStep) { + if (channel === X && mark === 'text') { + if (config.scale.textXRangeStep) { + return { step: config.scale.textXRangeStep }; + } + } + else { + if (config.scale.rangeStep) { + return { step: config.scale.rangeStep }; + } + } + } + // If range step is null, use zero to width or height. + // Note that these range signals are temporary + // as they can be merged and renamed. + // (We do not have the right size signal here since parseLayoutSize() happens after parseScale().) + // We will later replace these temporary names with + // the final name in assembleScaleRange() + if (channel === Y && hasContinuousDomain(scaleType)) { + // For y continuous scale, we have to start from the height as the bottom part has the max value. + return [{ signal: sizeSignal }, 0]; + } + else { + return [0, { signal: sizeSignal }]; + } + case SIZE: + // TODO: support custom rangeMin, rangeMax + var rangeMin = sizeRangeMin(mark, zero$$1, config); + var rangeMax = sizeRangeMax(mark, xyRangeSteps, config); + return [rangeMin, rangeMax]; + case SHAPE: + return 'symbol'; + case COLOR: + case FILL: + case STROKE: + if (scaleType === 'ordinal') { + // Only nominal data uses ordinal scale by default + return type === 'nominal' ? 'category' : 'ordinal'; + } + return mark === 'rect' || mark === 'geoshape' ? 'heatmap' : 'ramp'; + case OPACITY: + // TODO: support custom rangeMin, rangeMax + return [config.scale.minOpacity, config.scale.maxOpacity]; + } + /* istanbul ignore next: should never reach here */ + throw new Error("Scale range undefined for channel " + channel); + } + function sizeRangeMin(mark, zero$$1, config) { + if (zero$$1) { + return 0; + } + switch (mark) { + case 'bar': + case 'tick': + return config.scale.minBandSize; + case 'line': + case 'trail': + case 'rule': + return config.scale.minStrokeWidth; + case 'text': + return config.scale.minFontSize; + case 'point': + case 'square': + case 'circle': + return config.scale.minSize; + } + /* istanbul ignore next: should never reach here */ + // sizeRangeMin not implemented for the mark + throw new Error(message.incompatibleChannel('size', mark)); + } + function sizeRangeMax(mark, xyRangeSteps, config) { + var scaleConfig = config.scale; + switch (mark) { + case 'bar': + case 'tick': + if (config.scale.maxBandSize !== undefined) { + return config.scale.maxBandSize; + } + return minXYRangeStep(xyRangeSteps, config.scale) - 1; + case 'line': + case 'trail': + case 'rule': + return config.scale.maxStrokeWidth; + case 'text': + return config.scale.maxFontSize; + case 'point': + case 'square': + case 'circle': + if (config.scale.maxSize) { + return config.scale.maxSize; + } + // FIXME this case totally should be refactored + var pointStep = minXYRangeStep(xyRangeSteps, scaleConfig); + return (pointStep - 2) * (pointStep - 2); + } + /* istanbul ignore next: should never reach here */ + // sizeRangeMax not implemented for the mark + throw new Error(message.incompatibleChannel('size', mark)); + } + /** + * @returns {number} Range step of x or y or minimum between the two if both are ordinal scale. + */ + function minXYRangeStep(xyRangeSteps, scaleConfig) { + if (xyRangeSteps.length > 0) { + return Math.min.apply(null, xyRangeSteps); + } + if (scaleConfig.rangeStep) { + return scaleConfig.rangeStep; + } + return 21; // FIXME: re-evaluate the default value here. + } + + function parseScaleProperty(model, property) { + if (isUnitModel(model)) { + parseUnitScaleProperty(model, property); + } + else { + parseNonUnitScaleProperty(model, property); + } + } + function parseUnitScaleProperty(model, property) { + var localScaleComponents = model.component.scales; + keys(localScaleComponents).forEach(function (channel) { + var specifiedScale = model.specifiedScales[channel]; + var localScaleCmpt = localScaleComponents[channel]; + var mergedScaleCmpt = model.getScaleComponent(channel); + var fieldDef = model.fieldDef(channel); + var config = model.config; + var specifiedValue = specifiedScale[property]; + var sType = mergedScaleCmpt.get('type'); + var supportedByScaleType = scaleTypeSupportProperty(sType, property); + var channelIncompatability = channelScalePropertyIncompatability(channel, property); + if (specifiedValue !== undefined) { + // If there is a specified value, check if it is compatible with scale type and channel + if (!supportedByScaleType) { + warn(message.scalePropertyNotWorkWithScaleType(sType, property, channel)); + } + else if (channelIncompatability) { // channel + warn(channelIncompatability); + } + } + if (supportedByScaleType && channelIncompatability === undefined) { + if (specifiedValue !== undefined) { + // copyKeyFromObject ensure type safety + localScaleCmpt.copyKeyFromObject(property, specifiedScale); + } + else { + var value = getDefaultValue(property, channel, fieldDef, mergedScaleCmpt.get('type'), mergedScaleCmpt.get('padding'), mergedScaleCmpt.get('paddingInner'), specifiedScale.domain, model.markDef, config); + if (value !== undefined) { + localScaleCmpt.set(property, value, false); + } + } + } + }); + } + // Note: This method is used in Voyager. + function getDefaultValue(property, channel, fieldDef, scaleType, scalePadding, scalePaddingInner, specifiedDomain, markDef, config) { + var scaleConfig = config.scale; + // If we have default rule-base, determine default value first + switch (property) { + case 'nice': + return nice(scaleType, channel, fieldDef); + case 'padding': + return padding(channel, scaleType, scaleConfig, fieldDef, markDef, config.bar); + case 'paddingInner': + return paddingInner(scalePadding, channel, scaleConfig); + case 'paddingOuter': + return paddingOuter(scalePadding, channel, scaleType, scalePaddingInner, scaleConfig); + case 'reverse': + return reverse(scaleType, fieldDef.sort); + case 'zero': + return zero$1(channel, fieldDef, specifiedDomain, markDef); + } + // Otherwise, use scale config + return scaleConfig[property]; + } + function parseNonUnitScaleProperty(model, property) { + var localScaleComponents = model.component.scales; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (property === 'range') { + parseScaleRange(child); + } + else { + parseScaleProperty(child, property); + } + } + keys(localScaleComponents).forEach(function (channel) { + var valueWithExplicit; + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childComponent = child.component.scales[channel]; + if (childComponent) { + var childValueWithExplicit = childComponent.getWithExplicit(property); + valueWithExplicit = mergeValuesWithExplicit(valueWithExplicit, childValueWithExplicit, property, 'scale', tieBreakByComparing(function (v1, v2) { + switch (property) { + case 'range': + // For range step, prefer larger step + if (v1.step && v2.step) { + return v1.step - v2.step; + } + return 0; + // TODO: precedence rule for other properties + } + return 0; + })); + } + } + localScaleComponents[channel].setWithExplicit(property, valueWithExplicit); + }); + } + function nice(scaleType, channel, fieldDef) { + if (fieldDef.bin || contains([ScaleType.TIME, ScaleType.UTC], scaleType)) { + return undefined; + } + return contains([X, Y], channel); // return true for quantitative X/Y unless binned + } + function padding(channel, scaleType, scaleConfig, fieldDef, markDef, barConfig) { + if (contains([X, Y], channel)) { + if (isContinuousToContinuous(scaleType)) { + if (scaleConfig.continuousPadding !== undefined) { + return scaleConfig.continuousPadding; + } + var type = markDef.type, orient = markDef.orient; + if (type === 'bar' && !fieldDef.bin) { + if ((orient === 'vertical' && channel === 'x') || + (orient === 'horizontal' && channel === 'y')) { + return barConfig.continuousBandSize; + } + } + } + if (scaleType === ScaleType.POINT) { + return scaleConfig.pointPadding; + } + } + return undefined; + } + function paddingInner(paddingValue, channel, scaleConfig) { + if (paddingValue !== undefined) { + // If user has already manually specified "padding", no need to add default paddingInner. + return undefined; + } + if (contains([X, Y], channel)) { + // Padding is only set for X and Y by default. + // Basically it doesn't make sense to add padding for color and size. + // paddingOuter would only be called if it's a band scale, just return the default for bandScale. + return scaleConfig.bandPaddingInner; + } + return undefined; + } + function paddingOuter(paddingValue, channel, scaleType, paddingInnerValue, scaleConfig) { + if (paddingValue !== undefined) { + // If user has already manually specified "padding", no need to add default paddingOuter. + return undefined; + } + if (contains([X, Y], channel)) { + // Padding is only set for X and Y by default. + // Basically it doesn't make sense to add padding for color and size. + if (scaleType === ScaleType.BAND) { + if (scaleConfig.bandPaddingOuter !== undefined) { + return scaleConfig.bandPaddingOuter; + } + /* By default, paddingOuter is paddingInner / 2. The reason is that + size (width/height) = step * (cardinality - paddingInner + 2 * paddingOuter). + and we want the width/height to be integer by default. + Note that step (by default) and cardinality are integers.) */ + return paddingInnerValue / 2; + } + } + return undefined; + } + function reverse(scaleType, sort) { + if (hasContinuousDomain(scaleType) && sort === 'descending') { + // For continuous domain scales, Vega does not support domain sort. + // Thus, we reverse range instead if sort is descending + return true; + } + return undefined; + } + function zero$1(channel, fieldDef, specifiedScale, markDef) { + // If users explicitly provide a domain range, we should not augment zero as that will be unexpected. + var hasCustomDomain = !!specifiedScale && specifiedScale !== 'unaggregated'; + if (hasCustomDomain) { + return false; + } + // If there is no custom domain, return true only for the following cases: + // 1) using quantitative field with size + // While this can be either ratio or interval fields, our assumption is that + // ratio are more common. + if (channel === 'size' && fieldDef.type === 'quantitative') { + return true; + } + // 2) non-binned, quantitative x-scale or y-scale + // (For binning, we should not include zero by default because binning are calculated without zero.) + if (!fieldDef.bin && contains([X, Y], channel)) { + var orient = markDef.orient, type = markDef.type; + if (contains(['bar', 'area', 'line', 'trail'], type)) { + if ((orient === 'horizontal' && channel === 'y') || + (orient === 'vertical' && channel === 'x')) { + return false; + } + } + return true; + } + return false; + } + + /** + * Determine if there is a specified scale type and if it is appropriate, + * or determine default type if type is unspecified or inappropriate. + */ + // NOTE: CompassQL uses this method. + function scaleType(specifiedType, channel, fieldDef, mark, scaleConfig) { + var defaultScaleType = defaultType$1(channel, fieldDef, mark, scaleConfig); + if (!isScaleChannel(channel)) { + // There is no scale for these channels + return null; + } + if (specifiedType !== undefined) { + // Check if explicitly specified scale type is supported by the channel + if (!channelSupportScaleType(channel, specifiedType)) { + warn(message.scaleTypeNotWorkWithChannel(channel, specifiedType, defaultScaleType)); + return defaultScaleType; + } + // Check if explicitly specified scale type is supported by the data type + if (!scaleTypeSupportDataType(specifiedType, fieldDef.type, fieldDef.bin)) { + warn(message.scaleTypeNotWorkWithFieldDef(specifiedType, defaultScaleType)); + return defaultScaleType; + } + return specifiedType; + } + return defaultScaleType; + } + /** + * Determine appropriate default scale type. + */ + // NOTE: Voyager uses this method. + function defaultType$1(channel, fieldDef, mark, scaleConfig) { + switch (fieldDef.type) { + case 'nominal': + case 'ordinal': + if (isColorChannel(channel) || rangeType(channel) === 'discrete') { + if (channel === 'shape' && fieldDef.type === 'ordinal') { + warn(message.discreteChannelCannotEncode(channel, 'ordinal')); + } + return 'ordinal'; + } + if (contains(['x', 'y'], channel)) { + if (contains(['rect', 'bar', 'rule'], mark)) { + // The rect/bar mark should fit into a band. + // For rule, using band scale to make rule align with axis ticks better https://github.com/vega/vega-lite/issues/3429 + return 'band'; + } + if (mark === 'bar') { + return 'band'; + } + } + // Otherwise, use ordinal point scale so we can easily get center positions of the marks. + return 'point'; + case 'temporal': + if (isColorChannel(channel)) { + return 'sequential'; + } + else if (rangeType(channel) === 'discrete') { + warn(message.discreteChannelCannotEncode(channel, 'temporal')); + // TODO: consider using quantize (equivalent to binning) once we have it + return 'ordinal'; + } + return 'time'; + case 'quantitative': + if (isColorChannel(channel)) { + if (fieldDef.bin) { + return 'bin-ordinal'; + } + // Use `sequential` as the default color scale for continuous data + // since it supports both array range and scheme range. + return 'sequential'; + } + else if (rangeType(channel) === 'discrete') { + warn(message.discreteChannelCannotEncode(channel, 'quantitative')); + // TODO: consider using quantize (equivalent to binning) once we have it + return 'ordinal'; + } + // x and y use a linear scale because selections don't work with bin scales. + // Binned scales apply discretization but pan/zoom apply transformations to a [min, max] extent domain. + if (fieldDef.bin && channel !== 'x' && channel !== 'y') { + return 'bin-linear'; + } + return 'linear'; + case 'latitude': + case 'longitude': + case 'geojson': + return undefined; + } + /* istanbul ignore next: should never reach this */ + throw new Error(message.invalidFieldType(fieldDef.type)); + } + + function parseScale(model) { + parseScaleCore(model); + parseScaleDomain(model); + for (var _i = 0, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1 = NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES; _i < NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1.length; _i++) { + var prop = NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1[_i]; + parseScaleProperty(model, prop); + } + // range depends on zero + parseScaleRange(model); + } + function parseScaleCore(model) { + if (isUnitModel(model)) { + model.component.scales = parseUnitScaleCore(model); + } + else { + model.component.scales = parseNonUnitScaleCore(model); + } + } + /** + * Parse scales for all channels of a model. + */ + function parseUnitScaleCore(model) { + var encoding = model.encoding, config = model.config, mark = model.mark; + return SCALE_CHANNELS.reduce(function (scaleComponents, channel) { + var fieldDef; + var specifiedScale = undefined; + var channelDef = encoding[channel]; + // Don't generate scale for shape of geoshape + if (isFieldDef(channelDef) && mark === GEOSHAPE && + channel === SHAPE && channelDef.type === GEOJSON) { + return scaleComponents; + } + if (isFieldDef(channelDef)) { + fieldDef = channelDef; + specifiedScale = channelDef.scale; + } + else if (hasConditionalFieldDef(channelDef)) { + fieldDef = channelDef.condition; + specifiedScale = channelDef.condition['scale']; // We use ['scale'] since we know that channel here has scale for sure + } + else if (channel === X) { + fieldDef = getFieldDef(encoding.x2); + } + else if (channel === Y) { + fieldDef = getFieldDef(encoding.y2); + } + if (fieldDef && specifiedScale !== null && specifiedScale !== false) { + specifiedScale = specifiedScale || {}; + var specifiedScaleType = specifiedScale.type; + var sType = scaleType(specifiedScale.type, channel, fieldDef, mark, config.scale); + scaleComponents[channel] = new ScaleComponent(model.scaleName(channel + '', true), { value: sType, explicit: specifiedScaleType === sType }); + } + return scaleComponents; + }, {}); + } + var scaleTypeTieBreaker = tieBreakByComparing(function (st1, st2) { return (scaleTypePrecedence(st1) - scaleTypePrecedence(st2)); }); + function parseNonUnitScaleCore(model) { + var scaleComponents = model.component.scales = {}; + var scaleTypeWithExplicitIndex = {}; + var resolve = model.component.resolve; + var _loop_1 = function (child) { + parseScaleCore(child); + // Instead of always merging right away -- check if it is compatible to merge first! + keys(child.component.scales).forEach(function (channel) { + // if resolve is undefined, set default first + resolve.scale[channel] = resolve.scale[channel] || defaultScaleResolve(channel, model); + if (resolve.scale[channel] === 'shared') { + var explicitScaleType = scaleTypeWithExplicitIndex[channel]; + var childScaleType = child.component.scales[channel].getWithExplicit('type'); + if (explicitScaleType) { + if (scaleCompatible(explicitScaleType.value, childScaleType.value)) { + // merge scale component if type are compatible + scaleTypeWithExplicitIndex[channel] = mergeValuesWithExplicit(explicitScaleType, childScaleType, 'type', 'scale', scaleTypeTieBreaker); + } + else { + // Otherwise, update conflicting channel to be independent + resolve.scale[channel] = 'independent'; + // Remove from the index so they don't get merged + delete scaleTypeWithExplicitIndex[channel]; + } + } + else { + scaleTypeWithExplicitIndex[channel] = childScaleType; + } + } + }); + }; + // Parse each child scale and determine if a particular channel can be merged. + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + // Merge each channel listed in the index + keys(scaleTypeWithExplicitIndex).forEach(function (channel) { + // Create new merged scale component + var name = model.scaleName(channel, true); + var typeWithExplicit = scaleTypeWithExplicitIndex[channel]; + scaleComponents[channel] = new ScaleComponent(name, typeWithExplicit); + // rename each child and mark them as merged + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childScale = child.component.scales[channel]; + if (childScale) { + child.renameScale(childScale.get('name'), name); + childScale.merged = true; + } + } + }); + return scaleComponents; + } + + var NameMap = /** @class */ (function () { + function NameMap() { + this.nameMap = {}; + } + NameMap.prototype.rename = function (oldName, newName) { + this.nameMap[oldName] = newName; + }; + NameMap.prototype.has = function (name) { + return this.nameMap[name] !== undefined; + }; + NameMap.prototype.get = function (name) { + // If the name appears in the _nameMap, we need to read its new name. + // We have to loop over the dict just in case the new name also gets renamed. + while (this.nameMap[name] && name !== this.nameMap[name]) { + name = this.nameMap[name]; + } + return name; + }; + return NameMap; + }()); + /* + We use type guards instead of `instanceof` as `instanceof` makes + different parts of the compiler depend on the actual implementation of + the model classes, which in turn depend on different parts of the compiler. + Thus, `instanceof` leads to circular dependency problems. + + On the other hand, type guards only make different parts of the compiler + depend on the type of the model classes, but not the actual implementation. + */ + function isUnitModel(model) { + return model && model.type === 'unit'; + } + function isFacetModel(model) { + return model && model.type === 'facet'; + } + function isRepeatModel(model) { + return model && model.type === 'repeat'; + } + function isConcatModel(model) { + return model && model.type === 'concat'; + } + function isLayerModel(model) { + return model && model.type === 'layer'; + } + var Model = /** @class */ (function () { + function Model(spec, parent, parentGivenName, config, repeater, resolve) { + var _this = this; + this.children = []; + /** + * Corrects the data references in marks after assemble. + */ + this.correctDataNames = function (mark) { + // TODO: make this correct + // for normal data references + if (mark.from && mark.from.data) { + mark.from.data = _this.lookupDataSource(mark.from.data); + } + // for access to facet data + if (mark.from && mark.from.facet && mark.from.facet.data) { + mark.from.facet.data = _this.lookupDataSource(mark.from.facet.data); + } + return mark; + }; + this.parent = parent; + this.config = config; + this.repeater = repeater; + // If name is not provided, always use parent's givenName to avoid name conflicts. + this.name = spec.name || parentGivenName; + this.title = isString(spec.title) ? { text: spec.title } : spec.title; + // Shared name maps + this.scaleNameMap = parent ? parent.scaleNameMap : new NameMap(); + this.projectionNameMap = parent ? parent.projectionNameMap : new NameMap(); + this.layoutSizeNameMap = parent ? parent.layoutSizeNameMap : new NameMap(); + this.data = spec.data; + this.description = spec.description; + this.transforms = normalizeTransform(spec.transform || []); + this.component = { + data: { + sources: parent ? parent.component.data.sources : {}, + outputNodes: parent ? parent.component.data.outputNodes : {}, + outputNodeRefCounts: parent ? parent.component.data.outputNodeRefCounts : {}, + // data is faceted if the spec is a facet spec or the parent has faceted data and no data is defined + isFaceted: isFacetSpec(spec) || (parent && parent.component.data.isFaceted && !spec.data) + }, + layoutSize: new Split(), + layoutHeaders: { row: {}, column: {} }, + mark: null, + resolve: __assign({ scale: {}, axis: {}, legend: {} }, (resolve || {})), + selection: null, + scales: null, + projection: null, + axes: {}, + legends: {}, + }; + } + Object.defineProperty(Model.prototype, "width", { + get: function () { + return this.getSizeSignalRef('width'); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Model.prototype, "height", { + get: function () { + return this.getSizeSignalRef('height'); + }, + enumerable: true, + configurable: true + }); + Model.prototype.initSize = function (size) { + var width = size.width, height = size.height; + if (width) { + this.component.layoutSize.set('width', width, true); + } + if (height) { + this.component.layoutSize.set('height', height, true); + } + }; + Model.prototype.parse = function () { + this.parseScale(); + this.parseLayoutSize(); // depends on scale + this.renameTopLevelLayoutSize(); + this.parseSelection(); + this.parseProjection(); + this.parseData(); // (pathorder) depends on markDef; selection filters depend on parsed selections; depends on projection because some transforms require the finalized projection name. + this.parseAxisAndHeader(); // depends on scale and layout size + this.parseLegend(); // depends on scale, markDef + this.parseMarkGroup(); // depends on data name, scale, layout size, axisGroup, and children's scale, axis, legend and mark. + }; + Model.prototype.parseScale = function () { + parseScale(this); + }; + Model.prototype.parseProjection = function () { + parseProjection(this); + }; + /** + * Rename top-level spec's size to be just width / height, ignoring model name. + * This essentially merges the top-level spec's width/height signals with the width/height signals + * to help us reduce redundant signals declaration. + */ + Model.prototype.renameTopLevelLayoutSize = function () { + if (this.getName('width') !== 'width') { + this.renameLayoutSize(this.getName('width'), 'width'); + } + if (this.getName('height') !== 'height') { + this.renameLayoutSize(this.getName('height'), 'height'); + } + }; + Model.prototype.parseLegend = function () { + parseLegend(this); + }; + Model.prototype.assembleGroupStyle = function () { + if (this.type === 'unit' || this.type === 'layer') { + return 'cell'; + } + return undefined; + }; + Model.prototype.assembleLayoutSize = function () { + if (this.type === 'unit' || this.type === 'layer') { + return { + width: this.getSizeSignalRef('width'), + height: this.getSizeSignalRef('height') + }; + } + return undefined; + }; + Model.prototype.assembleHeaderMarks = function () { + var layoutHeaders = this.component.layoutHeaders; + var headerMarks = []; + for (var _i = 0, HEADER_CHANNELS_1 = HEADER_CHANNELS; _i < HEADER_CHANNELS_1.length; _i++) { + var channel = HEADER_CHANNELS_1[_i]; + if (layoutHeaders[channel].title) { + headerMarks.push(getTitleGroup(this, channel)); + } + } + for (var _a = 0, HEADER_CHANNELS_2 = HEADER_CHANNELS; _a < HEADER_CHANNELS_2.length; _a++) { + var channel = HEADER_CHANNELS_2[_a]; + headerMarks = headerMarks.concat(getHeaderGroups(this, channel)); + } + return headerMarks; + }; + Model.prototype.assembleAxes = function () { + return assembleAxes(this.component.axes, this.config); + }; + Model.prototype.assembleLegends = function () { + return assembleLegends(this); + }; + Model.prototype.assembleProjections = function () { + return assembleProjections(this); + }; + Model.prototype.assembleTitle = function () { + var title$$1 = __assign({}, extractTitleConfig(this.config.title).nonMark, this.title); + if (title$$1.text) { + if (!contains(['unit', 'layer'], this.type)) { + // As described in https://github.com/vega/vega-lite/issues/2875: + // Due to vega/vega#960 (comment), we only support title's anchor for unit and layered spec for now. + if (title$$1.anchor && title$$1.anchor !== 'start') { + warn(message.cannotSetTitleAnchor(this.type)); + } + title$$1.anchor = 'start'; + } + return keys(title$$1).length > 0 ? title$$1 : undefined; + } + return undefined; + }; + /** + * Assemble the mark group for this model. We accept optional `signals` so that we can include concat top-level signals with the top-level model's local signals. + */ + Model.prototype.assembleGroup = function (signals) { + if (signals === void 0) { signals = []; } + var group = {}; + signals = signals.concat(this.assembleSelectionSignals()); + if (signals.length > 0) { + group.signals = signals; + } + var layout = this.assembleLayout(); + if (layout) { + group.layout = layout; + } + group.marks = [].concat(this.assembleHeaderMarks(), this.assembleMarks()); + // Only include scales if this spec is top-level or if parent is facet. + // (Otherwise, it will be merged with upper-level's scope.) + var scales = (!this.parent || isFacetModel(this.parent)) ? assembleScales(this) : []; + if (scales.length > 0) { + group.scales = scales; + } + var axes = this.assembleAxes(); + if (axes.length > 0) { + group.axes = axes; + } + var legends = this.assembleLegends(); + if (legends.length > 0) { + group.legends = legends; + } + return group; + }; + Model.prototype.hasDescendantWithFieldOnChannel = function (channel) { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + if (isUnitModel(child)) { + if (child.channelHasField(channel)) { + return true; + } + } + else { + if (child.hasDescendantWithFieldOnChannel(channel)) { + return true; + } + } + } + return false; + }; + Model.prototype.getName = function (text) { + return varName((this.name ? this.name + '_' : '') + text); + }; + /** + * Request a data source name for the given data source type and mark that data source as required. This method should be called in parse, so that all used data source can be correctly instantiated in assembleData(). + */ + Model.prototype.requestDataName = function (name) { + var fullName = this.getName(name); + // Increase ref count. This is critical because otherwise we won't create a data source. + // We also increase the ref counts on OutputNode.getSource() calls. + var refCounts = this.component.data.outputNodeRefCounts; + refCounts[fullName] = (refCounts[fullName] || 0) + 1; + return fullName; + }; + Model.prototype.getSizeSignalRef = function (sizeType) { + if (isFacetModel(this.parent)) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var scaleComponent = this.component.scales[channel]; + if (scaleComponent && !scaleComponent.merged) { // independent scale + var type = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (hasDiscreteDomain(type) && isVgRangeStep(range)) { + var scaleName = scaleComponent.get('name'); + var domain = assembleDomain(this, channel); + var field$$1 = getFieldFromDomain(domain); + if (field$$1) { + var fieldRef = vgField({ aggregate: 'distinct', field: field$$1 }, { expr: 'datum' }); + return { + signal: sizeExpr(scaleName, scaleComponent, fieldRef) + }; + } + else { + warn('Unknown field for ${channel}. Cannot calculate view size.'); + return null; + } + } + } + } + return { + signal: this.layoutSizeNameMap.get(this.getName(sizeType)) + }; + }; + /** + * Lookup the name of the datasource for an output node. You probably want to call this in assemble. + */ + Model.prototype.lookupDataSource = function (name) { + var node = this.component.data.outputNodes[name]; + if (!node) { + // Name not found in map so let's just return what we got. + // This can happen if we already have the correct name. + return name; + } + return node.getSource(); + }; + Model.prototype.getSizeName = function (oldSizeName) { + return this.layoutSizeNameMap.get(oldSizeName); + }; + Model.prototype.renameLayoutSize = function (oldName, newName) { + this.layoutSizeNameMap.rename(oldName, newName); + }; + Model.prototype.renameScale = function (oldName, newName) { + this.scaleNameMap.rename(oldName, newName); + }; + Model.prototype.renameProjection = function (oldName, newName) { + this.projectionNameMap.rename(oldName, newName); + }; + /** + * @return scale name for a given channel after the scale has been parsed and named. + */ + Model.prototype.scaleName = function (originalScaleName, parse) { + if (parse) { + // During the parse phase always return a value + // No need to refer to rename map because a scale can't be renamed + // before it has the original name. + return this.getName(originalScaleName); + } + // If there is a scale for the channel, it should either + // be in the scale component or exist in the name map + if ( + // If there is a scale for the channel, there should be a local scale component for it + (isChannel(originalScaleName) && isScaleChannel(originalScaleName) && this.component.scales[originalScaleName]) || + // in the scale name map (the scale get merged by its parent) + this.scaleNameMap.has(this.getName(originalScaleName))) { + return this.scaleNameMap.get(this.getName(originalScaleName)); + } + return undefined; + }; + /** + * @return projection name after the projection has been parsed and named. + */ + Model.prototype.projectionName = function (parse) { + if (parse) { + // During the parse phase always return a value + // No need to refer to rename map because a projection can't be renamed + // before it has the original name. + return this.getName('projection'); + } + if ((this.component.projection && !this.component.projection.merged) || this.projectionNameMap.has(this.getName('projection'))) { + return this.projectionNameMap.get(this.getName('projection')); + } + return undefined; + }; + /** + * Traverse a model's hierarchy to get the scale component for a particular channel. + */ + Model.prototype.getScaleComponent = function (channel) { + /* istanbul ignore next: This is warning for debugging test */ + if (!this.component.scales) { + throw new Error('getScaleComponent cannot be called before parseScale(). Make sure you have called parseScale or use parseUnitModelWithScale().'); + } + var localScaleComponent = this.component.scales[channel]; + if (localScaleComponent && !localScaleComponent.merged) { + return localScaleComponent; + } + return (this.parent ? this.parent.getScaleComponent(channel) : undefined); + }; + /** + * Traverse a model's hierarchy to get a particular selection component. + */ + Model.prototype.getSelectionComponent = function (variableName, origName) { + var sel = this.component.selection[variableName]; + if (!sel && this.parent) { + sel = this.parent.getSelectionComponent(variableName, origName); + } + if (!sel) { + throw new Error(message.selectionNotFound(origName)); + } + return sel; + }; + return Model; + }()); + /** Abstract class for UnitModel and FacetModel. Both of which can contain fieldDefs as a part of its own specification. */ + var ModelWithField = /** @class */ (function (_super) { + __extends(ModelWithField, _super); + function ModelWithField() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** Get "field" reference for vega */ + ModelWithField.prototype.vgField = function (channel, opt) { + if (opt === void 0) { opt = {}; } + var fieldDef = this.fieldDef(channel); + if (!fieldDef) { + return undefined; + } + return vgField(fieldDef, opt); + }; + ModelWithField.prototype.reduceFieldDef = function (f, init, t) { + return reduce(this.getMapping(), function (acc, cd, c) { + var fieldDef = getFieldDef(cd); + if (fieldDef) { + return f(acc, fieldDef, c); + } + return acc; + }, init, t); + }; + ModelWithField.prototype.forEachFieldDef = function (f, t) { + forEach(this.getMapping(), function (cd, c) { + var fieldDef = getFieldDef(cd); + if (fieldDef) { + f(fieldDef, c); + } + }, t); + }; + return ModelWithField; + }(Model)); + + var scaleBindings = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.resolve === 'global' && + selCmpt.bind && selCmpt.bind === 'scales'; + }, + parse: function (model, selDef, selCmpt) { + var bound = selCmpt.scales = []; + selCmpt.project.forEach(function (p) { + var channel = p.channel; + var scale = model.getScaleComponent(channel); + var scaleType = scale ? scale.get('type') : undefined; + if (!scale || !hasContinuousDomain(scaleType) || isBinScale(scaleType)) { + warn(message.SCALE_BINDINGS_CONTINUOUS); + return; + } + scale.set('domainRaw', { signal: channelSignalName(selCmpt, channel, 'data') }, true); + bound.push(channel); + // Bind both x/y for diag plot of repeated views. + if (model.repeater && model.repeater.row === model.repeater.column) { + var scale2 = model.getScaleComponent(channel === X ? Y : X); + scale2.set('domainRaw', { signal: channelSignalName(selCmpt, channel, 'data') }, true); + } + }); + }, + topLevelSignals: function (model, selCmpt, signals) { + // Top-level signals are only needed when coordinating composed views. + if (!model.parent) { + return signals; + } + var channels = selCmpt.scales.filter(function (channel) { + return !(signals.filter(function (s) { return s.name === channelSignalName(selCmpt, channel, 'data'); }).length); + }); + return signals.concat(channels.map(function (channel) { + return { name: channelSignalName(selCmpt, channel, 'data') }; + })); + }, + signals: function (model, selCmpt, signals) { + // Nested signals need only push to top-level signals when within composed views. + if (model.parent) { + selCmpt.scales.forEach(function (channel) { + var signal = signals.filter(function (s) { return s.name === channelSignalName(selCmpt, channel, 'data'); })[0]; + signal.push = 'outer'; + delete signal.value; + delete signal.update; + }); + } + return signals; + } + }; + function domain$1(model, channel) { + var scale = $(model.scaleName(channel)); + return "domain(" + scale + ")"; + } + + var BRUSH = '_brush'; + var SCALE_TRIGGER = '_scale_trigger'; + var interval = { + predicate: 'vlInterval', + scaleDomain: 'vlIntervalDomain', + signals: function (model, selCmpt) { + var name = selCmpt.name; + var hasScales = scaleBindings.has(selCmpt); + var signals = []; + var intervals = []; + var tupleTriggers = []; + var scaleTriggers = []; + if (selCmpt.translate && !hasScales) { + var filterExpr_1 = "!event.item || event.item.mark.name !== " + $(name + BRUSH); + events(selCmpt, function (_, evt) { + var filters = evt.between[0].filter || (evt.between[0].filter = []); + if (filters.indexOf(filterExpr_1) < 0) { + filters.push(filterExpr_1); + } + }); + } + selCmpt.project.forEach(function (p) { + var channel = p.channel; + if (channel !== X && channel !== Y) { + warn('Interval selections only support x and y encoding channels.'); + return; + } + var cs = channelSignals(model, selCmpt, channel); + var dname = channelSignalName(selCmpt, channel, 'data'); + var vname = channelSignalName(selCmpt, channel, 'visual'); + var scaleStr = $(model.scaleName(channel)); + var scaleType = model.getScaleComponent(channel).get('type'); + var toNum = hasContinuousDomain(scaleType) ? '+' : ''; + signals.push.apply(signals, cs); + tupleTriggers.push(dname); + intervals.push("{encoding: " + $(channel) + ", " + + ("field: " + $(p.field) + ", extent: " + dname + "}")); + scaleTriggers.push({ + scaleName: model.scaleName(channel), + expr: "(!isArray(" + dname + ") || " + + ("(" + toNum + "invert(" + scaleStr + ", " + vname + ")[0] === " + toNum + dname + "[0] && ") + + (toNum + "invert(" + scaleStr + ", " + vname + ")[1] === " + toNum + dname + "[1]))") + }); + }); + // Proxy scale reactions to ensure that an infinite loop doesn't occur + // when an interval selection filter touches the scale. + if (!hasScales) { + signals.push({ + name: name + SCALE_TRIGGER, + update: scaleTriggers.map(function (t) { return t.expr; }).join(' && ') + + (" ? " + (name + SCALE_TRIGGER) + " : {}") + }); + } + // Only add an interval to the store if it has valid data extents. Data extents + // are set to null if pixel extents are equal to account for intervals over + // ordinal/nominal domains which, when inverted, will still produce a valid datum. + return signals.concat({ + name: name + TUPLE, + on: [{ + events: tupleTriggers.map(function (t) { return ({ signal: t }); }), + update: tupleTriggers.join(' && ') + + (" ? {unit: " + unitName(model) + ", intervals: [" + intervals.join(', ') + "]} : null") + }] + }); + }, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'true' : "{unit: " + unitName(model) + "}"); + }, + marks: function (model, selCmpt, marks) { + var name = selCmpt.name; + var _a = positionalProjections(selCmpt), xi = _a.xi, yi = _a.yi; + var store = "data(" + $(selCmpt.name + STORE) + ")"; + // Do not add a brush if we're binding to scales. + if (scaleBindings.has(selCmpt)) { + return marks; + } + var update = { + x: xi !== null ? { signal: name + "_x[0]" } : { value: 0 }, + y: yi !== null ? { signal: name + "_y[0]" } : { value: 0 }, + x2: xi !== null ? { signal: name + "_x[1]" } : { field: { group: 'width' } }, + y2: yi !== null ? { signal: name + "_y[1]" } : { field: { group: 'height' } } + }; + // If the selection is resolved to global, only a single interval is in + // the store. Wrap brush mark's encodings with a production rule to test + // this based on the `unit` property. Hide the brush mark if it corresponds + // to a unit different from the one in the store. + if (selCmpt.resolve === 'global') { + for (var _i = 0, _b = keys(update); _i < _b.length; _i++) { + var key$$1 = _b[_i]; + update[key$$1] = [__assign({ test: store + ".length && " + store + "[0].unit === " + unitName(model) }, update[key$$1]), { value: 0 }]; + } + } + // Two brush marks ensure that fill colors and other aesthetic choices do + // not interefere with the core marks, but that the brushed region can still + // be interacted with (e.g., dragging it around). + var _c = selCmpt.mark, fill = _c.fill, fillOpacity = _c.fillOpacity, stroke = __rest(_c, ["fill", "fillOpacity"]); + var vgStroke = keys(stroke).reduce(function (def, k) { + def[k] = [{ + test: [ + xi !== null && name + "_x[0] !== " + name + "_x[1]", + yi != null && name + "_y[0] !== " + name + "_y[1]", + ].filter(function (x) { return x; }).join(' && '), + value: stroke[k] + }, { value: null }]; + return def; + }, {}); + return [{ + name: name + BRUSH + '_bg', + type: 'rect', + clip: true, + encode: { + enter: { + fill: { value: fill }, + fillOpacity: { value: fillOpacity } + }, + update: update + } + }].concat(marks, { + name: name + BRUSH, + type: 'rect', + clip: true, + encode: { + enter: { + fill: { value: 'transparent' } + }, + update: __assign({}, update, vgStroke) + } + }); + } + }; + /** + * Returns the visual and data signals for an interval selection. + */ + function channelSignals(model, selCmpt, channel) { + var vname = channelSignalName(selCmpt, channel, 'visual'); + var dname = channelSignalName(selCmpt, channel, 'data'); + var hasScales = scaleBindings.has(selCmpt); + var scaleName = model.scaleName(channel); + var scaleStr = $(scaleName); + var scale = model.getScaleComponent(channel); + var scaleType = scale ? scale.get('type') : undefined; + var size = model.getSizeSignalRef(channel === X ? 'width' : 'height').signal; + var coord = channel + "(unit)"; + var on = events(selCmpt, function (def, evt) { + return def.concat({ events: evt.between[0], update: "[" + coord + ", " + coord + "]" }, // Brush Start + { events: evt, update: "[" + vname + "[0], clamp(" + coord + ", 0, " + size + ")]" } // Brush End + ); + }); + // React to pan/zooms of continuous scales. Non-continuous scales + // (bin-linear, band, point) cannot be pan/zoomed and any other changes + // to their domains (e.g., filtering) should clear the brushes. + on.push({ + events: { signal: selCmpt.name + SCALE_TRIGGER }, + update: hasContinuousDomain(scaleType) && !isBinScale(scaleType) ? + "[scale(" + scaleStr + ", " + dname + "[0]), scale(" + scaleStr + ", " + dname + "[1])]" : "[0, 0]" + }); + return hasScales ? [{ name: dname, on: [] }] : [{ + name: vname, value: [], on: on + }, { + name: dname, + on: [{ events: { signal: vname }, update: vname + "[0] === " + vname + "[1] ? null : invert(" + scaleStr + ", " + vname + ")" }] + }]; + } + function events(selCmpt, cb) { + return selCmpt.events.reduce(function (on, evt) { + if (!evt.between) { + warn(evt + " is not an ordered event stream for interval selections"); + return on; + } + return cb(on, evt); + }, []); + } + + var VORONOI = 'voronoi'; + var nearest = { + has: function (selCmpt) { + return selCmpt.type !== 'interval' && selCmpt.nearest; + }, + marks: function (model, selCmpt, marks) { + var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y; + var markType = model.mark; + if (isPathMark(markType)) { + warn(message.nearestNotSupportForContinuous(markType)); + return marks; + } + var cellDef = { + name: model.getName(VORONOI), + type: 'path', + from: { data: model.getName('marks') }, + encode: { + enter: { + fill: { value: 'transparent' }, + strokeWidth: { value: 0.35 }, + stroke: { value: 'transparent' }, + isVoronoi: { value: true } + } + }, + transform: [{ + type: 'voronoi', + x: { expr: (x || (!x && !y)) ? 'datum.datum.x || 0' : '0' }, + y: { expr: (y || (!x && !y)) ? 'datum.datum.y || 0' : '0' }, + size: [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')] + }] + }; + var index = 0; + var exists = false; + marks.forEach(function (mark, i) { + var name = mark.name || ''; + if (name === model.component.mark[0].name) { + index = i; + } + else if (name.indexOf(VORONOI) >= 0) { + exists = true; + } + }); + if (!exists) { + marks.splice(index + 1, 0, cellDef); + } + return marks; + } + }; + + function signals(model, selCmpt) { + var proj = selCmpt.project; + var datum = nearest.has(selCmpt) ? + '(item().isVoronoi ? datum.datum : datum)' : 'datum'; + var bins = []; + var encodings = proj.map(function (p) { return $(p.channel); }).filter(function (e) { return e; }).join(', '); + var fields = proj.map(function (p) { return $(p.field); }).join(', '); + var values = proj.map(function (p) { + var channel = p.channel; + var fieldDef = model.fieldDef(channel); + // Binned fields should capture extents, for a range test against the raw field. + return (fieldDef && fieldDef.bin) ? (bins.push(p.field), + "[" + accessPathWithDatum(model.vgField(channel, {}), datum) + ", " + + (accessPathWithDatum(model.vgField(channel, { binSuffix: 'end' }), datum) + "]")) : + "" + accessPathWithDatum(p.field, datum); + }).join(', '); + // Only add a discrete selection to the store if a datum is present _and_ + // the interaction isn't occurring on a group mark. This guards against + // polluting interactive state with invalid values in faceted displays + // as the group marks are also data-driven. We force the update to account + // for constant null states but varying toggles (e.g., shift-click in + // whitespace followed by a click in whitespace; the store should only + // be cleared on the second click). + return [{ + name: selCmpt.name + TUPLE, + value: {}, + on: [{ + events: selCmpt.events, + update: "datum && item().mark.marktype !== 'group' ? " + + ("{unit: " + unitName(model) + ", encodings: [" + encodings + "], ") + + ("fields: [" + fields + "], values: [" + values + "]") + + (bins.length ? ', ' + bins.map(function (b) { return $('bin_' + b) + ": 1"; }).join(', ') : '') + + '} : null', + force: true + }] + }]; + } + var multi = { + predicate: 'vlMulti', + scaleDomain: 'vlMultiDomain', + signals: signals, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'null' : "{unit: " + unitName(model) + "}"); + } + }; + + var single = { + predicate: 'vlSingle', + scaleDomain: 'vlSingleDomain', + signals: signals, + topLevelSignals: function (model, selCmpt, signals$$1) { + var hasSignal = signals$$1.filter(function (s) { return s.name === selCmpt.name; }); + var data = "data(" + $(selCmpt.name + STORE) + ")"; + var values = data + "[0].values"; + return hasSignal.length ? signals$$1 : signals$$1.concat({ + name: selCmpt.name, + update: data + ".length && {" + + selCmpt.project.map(function (p, i) { return p.field + ": " + values + "[" + i + "]"; }).join(', ') + '}' + }); + }, + modifyExpr: function (model, selCmpt) { + var tpl = selCmpt.name + TUPLE; + return tpl + ', ' + + (selCmpt.resolve === 'global' ? 'true' : "{unit: " + unitName(model) + "}"); + } + }; + + var inputBindings = { + has: function (selCmpt) { + return selCmpt.type === 'single' && selCmpt.resolve === 'global' && + selCmpt.bind && selCmpt.bind !== 'scales'; + }, + topLevelSignals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var proj = selCmpt.project; + var bind = selCmpt.bind; + var datum = nearest.has(selCmpt) ? + '(item().isVoronoi ? datum.datum : datum)' : 'datum'; + proj.forEach(function (p) { + var sgname = varName(name + "_" + p.field); + var hasSignal = signals.filter(function (s) { return s.name === sgname; }); + if (!hasSignal.length) { + signals.unshift({ + name: sgname, + value: '', + on: [{ + events: selCmpt.events, + update: "datum && item().mark.marktype !== 'group' ? " + accessPathWithDatum(p.field, datum) + " : null" + }], + bind: bind[p.field] || bind[p.channel] || bind + }); + } + }); + return signals; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var proj = selCmpt.project; + var signal = signals.filter(function (s) { return s.name === name + TUPLE; })[0]; + var fields = proj.map(function (p) { return $(p.field); }).join(', '); + var values = proj.map(function (p) { return varName(name + "_" + p.field); }); + if (values.length) { + signal.update = values.join(' && ') + " ? {fields: [" + fields + "], values: [" + values.join(', ') + "]} : null"; + } + delete signal.value; + delete signal.on; + return signals; + } + }; + + var project = { + has: function (selDef) { + var def = selDef; + return def.fields !== undefined || def.encodings !== undefined; + }, + parse: function (model, selDef, selCmpt) { + var channels = {}; + var timeUnits = {}; + // TODO: find a possible channel mapping for these fields. + (selDef.fields || []).forEach(function (field) { return channels[field] = null; }); + (selDef.encodings || []).forEach(function (channel) { + var fieldDef = model.fieldDef(channel); + if (fieldDef) { + if (fieldDef.timeUnit) { + var tuField = model.vgField(channel); + channels[tuField] = channel; + // Construct TimeUnitComponents which will be combined into a + // TimeUnitNode. This node may need to be inserted into the + // dataflow if the selection is used across views that do not + // have these time units defined. + timeUnits[tuField] = { + as: tuField, + field: fieldDef.field, + timeUnit: fieldDef.timeUnit + }; + } + else { + channels[fieldDef.field] = channel; + } + } + else { + warn(message.cannotProjectOnChannelWithoutField(channel)); + } + }); + var projection = selCmpt.project || (selCmpt.project = []); + for (var field in channels) { + if (channels.hasOwnProperty(field)) { + projection.push({ field: field, channel: channels[field] }); + } + } + var fields = selCmpt.fields || (selCmpt.fields = {}); + projection.filter(function (p) { return p.channel; }).forEach(function (p) { return fields[p.channel] = p.field; }); + if (keys(timeUnits).length) { + selCmpt.timeUnit = new TimeUnitNode(null, timeUnits); + } + } + }; + + var TOGGLE = '_toggle'; + var toggle = { + has: function (selCmpt) { + return selCmpt.type === 'multi' && selCmpt.toggle; + }, + signals: function (model, selCmpt, signals) { + return signals.concat({ + name: selCmpt.name + TOGGLE, + value: false, + on: [{ events: selCmpt.events, update: selCmpt.toggle }] + }); + }, + modifyExpr: function (model, selCmpt, expr) { + var tpl = selCmpt.name + TUPLE; + var signal = selCmpt.name + TOGGLE; + return signal + " ? null : " + tpl + ", " + + (selCmpt.resolve === 'global' ? + signal + " ? null : true, " : + signal + " ? null : {unit: " + unitName(model) + "}, ") + + (signal + " ? " + tpl + " : null"); + } + }; + + var ANCHOR = '_translate_anchor'; + var DELTA = '_translate_delta'; + var translate = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.translate; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var hasScales = scaleBindings.has(selCmpt); + var anchor = name + ANCHOR; + var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y; + var events = parseSelector(selCmpt.translate, 'scope'); + if (!hasScales) { + events = events.map(function (e) { return (e.between[0].markname = name + BRUSH, e); }); + } + signals.push({ + name: anchor, + value: {}, + on: [{ + events: events.map(function (e) { return e.between[0]; }), + update: '{x: x(unit), y: y(unit)' + + (x !== null ? ', extent_x: ' + (hasScales ? domain$1(model, X) : + "slice(" + channelSignalName(selCmpt, 'x', 'visual') + ")") : '') + + (y !== null ? ', extent_y: ' + (hasScales ? domain$1(model, Y) : + "slice(" + channelSignalName(selCmpt, 'y', 'visual') + ")") : '') + '}' + }] + }, { + name: name + DELTA, + value: {}, + on: [{ + events: events, + update: "{x: " + anchor + ".x - x(unit), y: " + anchor + ".y - y(unit)}" + }] + }); + if (x !== null) { + onDelta(model, selCmpt, X, 'width', signals); + } + if (y !== null) { + onDelta(model, selCmpt, Y, 'height', signals); + } + return signals; + } + }; + function onDelta(model, selCmpt, channel, size, signals) { + var name = selCmpt.name; + var hasScales = scaleBindings.has(selCmpt); + var signal = signals.filter(function (s) { + return s.name === channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual'); + })[0]; + var anchor = name + ANCHOR; + var delta = name + DELTA; + var sizeSg = model.getSizeSignalRef(size).signal; + var scaleCmpt = model.getScaleComponent(channel); + var scaleType = scaleCmpt.get('type'); + var sign = hasScales && channel === X ? '-' : ''; // Invert delta when panning x-scales. + var extent = anchor + ".extent_" + channel; + var offset = "" + sign + delta + "." + channel + " / " + (hasScales ? "" + sizeSg : "span(" + extent + ")"); + var panFn = !hasScales ? 'panLinear' : + scaleType === 'log' ? 'panLog' : + scaleType === 'pow' ? 'panPow' : 'panLinear'; + var update = panFn + "(" + extent + ", " + offset + + (hasScales && scaleType === 'pow' ? ", " + (scaleCmpt.get('exponent') || 1) : '') + ')'; + signal.on.push({ + events: { signal: delta }, + update: hasScales ? update : "clampRange(" + update + ", 0, " + sizeSg + ")" + }); + } + + var ANCHOR$1 = '_zoom_anchor'; + var DELTA$1 = '_zoom_delta'; + var zoom$1 = { + has: function (selCmpt) { + return selCmpt.type === 'interval' && selCmpt.zoom; + }, + signals: function (model, selCmpt, signals) { + var name = selCmpt.name; + var hasScales = scaleBindings.has(selCmpt); + var delta = name + DELTA$1; + var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y; + var sx = $(model.scaleName(X)); + var sy = $(model.scaleName(Y)); + var events = parseSelector(selCmpt.zoom, 'scope'); + if (!hasScales) { + events = events.map(function (e) { return (e.markname = name + BRUSH, e); }); + } + signals.push({ + name: name + ANCHOR$1, + on: [{ + events: events, + update: !hasScales ? "{x: x(unit), y: y(unit)}" : + '{' + [ + (sx ? "x: invert(" + sx + ", x(unit))" : ''), + (sy ? "y: invert(" + sy + ", y(unit))" : '') + ].filter(function (expr) { return !!expr; }).join(', ') + '}' + }] + }, { + name: delta, + on: [{ + events: events, + force: true, + update: 'pow(1.001, event.deltaY * pow(16, event.deltaMode))' + }] + }); + if (x !== null) { + onDelta$1(model, selCmpt, 'x', 'width', signals); + } + if (y !== null) { + onDelta$1(model, selCmpt, 'y', 'height', signals); + } + return signals; + } + }; + function onDelta$1(model, selCmpt, channel, size, signals) { + var name = selCmpt.name; + var hasScales = scaleBindings.has(selCmpt); + var signal = signals.filter(function (s) { + return s.name === channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual'); + })[0]; + var sizeSg = model.getSizeSignalRef(size).signal; + var scaleCmpt = model.getScaleComponent(channel); + var scaleType = scaleCmpt.get('type'); + var base = hasScales ? domain$1(model, channel) : signal.name; + var delta = name + DELTA$1; + var anchor = "" + name + ANCHOR$1 + "." + channel; + var zoomFn = !hasScales ? 'zoomLinear' : + scaleType === 'log' ? 'zoomLog' : + scaleType === 'pow' ? 'zoomPow' : 'zoomLinear'; + var update = zoomFn + "(" + base + ", " + anchor + ", " + delta + + (hasScales && scaleType === 'pow' ? ", " + (scaleCmpt.get('exponent') || 1) : '') + ')'; + signal.on.push({ + events: { signal: delta }, + update: hasScales ? update : "clampRange(" + update + ", 0, " + sizeSg + ")" + }); + } + + var compilers = { project: project, toggle: toggle, scales: scaleBindings, + translate: translate, zoom: zoom$1, inputs: inputBindings, nearest: nearest }; + function forEachTransform(selCmpt, cb) { + for (var t in compilers) { + if (compilers[t].has(selCmpt)) { + cb(compilers[t]); + } + } + } + + var STORE = '_store'; + var TUPLE = '_tuple'; + var MODIFY = '_modify'; + var SELECTION_DOMAIN = '_selection_domain_'; + function parseUnitSelection(model, selDefs) { + var selCmpts = {}; + var selectionConfig = model.config.selection; + var _loop_1 = function (name_1) { + if (!selDefs.hasOwnProperty(name_1)) { + return "continue"; + } + var selDef = selDefs[name_1]; + var cfg = selectionConfig[selDef.type]; + // Set default values from config if a property hasn't been specified, + // or if it is true. E.g., "translate": true should use the default + // event handlers for translate. However, true may be a valid value for + // a property (e.g., "nearest": true). + for (var key$$1 in cfg) { + // A selection should contain either `encodings` or `fields`, only use + // default values for these two values if neither of them is specified. + if ((key$$1 === 'encodings' && selDef.fields) || (key$$1 === 'fields' && selDef.encodings)) { + continue; + } + if (key$$1 === 'mark') { + selDef[key$$1] = __assign({}, cfg[key$$1], selDef[key$$1]); + } + if (selDef[key$$1] === undefined || selDef[key$$1] === true) { + selDef[key$$1] = cfg[key$$1] || selDef[key$$1]; + } + } + name_1 = varName(name_1); + var selCmpt = selCmpts[name_1] = __assign({}, selDef, { name: name_1, events: isString(selDef.on) ? parseSelector(selDef.on, 'scope') : selDef.on }); + forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.parse) { + txCompiler.parse(model, selDef, selCmpt); + } + }); + }; + for (var name_1 in selDefs) { + _loop_1(name_1); + } + return selCmpts; + } + function assembleUnitSelectionSignals(model, signals$$1) { + forEachSelection(model, function (selCmpt, selCompiler) { + var name = selCmpt.name; + var modifyExpr = selCompiler.modifyExpr(model, selCmpt); + signals$$1.push.apply(signals$$1, selCompiler.signals(model, selCmpt)); + forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.signals) { + signals$$1 = txCompiler.signals(model, selCmpt, signals$$1); + } + if (txCompiler.modifyExpr) { + modifyExpr = txCompiler.modifyExpr(model, selCmpt, modifyExpr); + } + }); + signals$$1.push({ + name: name + MODIFY, + on: [{ + events: { signal: name + TUPLE }, + update: "modify(" + $(selCmpt.name + STORE) + ", " + modifyExpr + ")" + }] + }); + }); + var facetModel = getFacetModel(model); + if (signals$$1.length && facetModel) { + var name_2 = $(facetModel.getName('cell')); + signals$$1.unshift({ + name: 'facet', + value: {}, + on: [{ + events: parseSelector('mousemove', 'scope'), + update: "isTuple(facet) ? facet : group(" + name_2 + ").datum" + }] + }); + } + return signals$$1; + } + function assembleTopLevelSignals(model, signals$$1) { + var needsUnit = false; + forEachSelection(model, function (selCmpt, selCompiler) { + if (selCompiler.topLevelSignals) { + signals$$1 = selCompiler.topLevelSignals(model, selCmpt, signals$$1); + } + forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.topLevelSignals) { + signals$$1 = txCompiler.topLevelSignals(model, selCmpt, signals$$1); + } + }); + needsUnit = true; + }); + if (needsUnit) { + var hasUnit = signals$$1.filter(function (s) { return s.name === 'unit'; }); + if (!(hasUnit.length)) { + signals$$1.unshift({ + name: 'unit', + value: {}, + on: [{ events: 'mousemove', update: 'isTuple(group()) ? group() : unit' }] + }); + } + } + return signals$$1; + } + function assembleUnitSelectionData(model, data) { + forEachSelection(model, function (selCmpt) { + var contains$$1 = data.filter(function (d) { return d.name === selCmpt.name + STORE; }); + if (!contains$$1.length) { + data.push({ name: selCmpt.name + STORE }); + } + }); + return data; + } + function assembleUnitSelectionMarks(model, marks) { + forEachSelection(model, function (selCmpt, selCompiler) { + marks = selCompiler.marks ? selCompiler.marks(model, selCmpt, marks) : marks; + forEachTransform(selCmpt, function (txCompiler) { + if (txCompiler.marks) { + marks = txCompiler.marks(model, selCmpt, marks); + } + }); + }); + return marks; + } + function assembleLayerSelectionMarks(model, marks) { + model.children.forEach(function (child) { + if (isUnitModel(child)) { + marks = assembleUnitSelectionMarks(child, marks); + } + }); + return marks; + } + function selectionPredicate(model, selections, dfnode) { + var stores = []; + function expr(name) { + var vname = varName(name); + var selCmpt = model.getSelectionComponent(vname, name); + var store = $(vname + STORE); + if (selCmpt.timeUnit) { + var child = dfnode || model.component.data.raw; + var tunode = selCmpt.timeUnit.clone(); + if (child.parent) { + tunode.insertAsParentOf(child); + } + else { + child.parent = tunode; + } + } + if (selCmpt.empty !== 'none') { + stores.push(store); + } + return compiler(selCmpt.type).predicate + ("(" + store + ", datum") + + (selCmpt.resolve === 'global' ? ')' : ", " + $(selCmpt.resolve) + ")"); + } + var predicateStr = logicalExpr(selections, expr); + return (stores.length + ? '!(' + stores.map(function (s) { return "length(data(" + s + "))"; }).join(' || ') + ') || ' + : '') + ("(" + predicateStr + ")"); + } + // Selections are parsed _after_ scales. If a scale domain is set to + // use a selection, the SELECTION_DOMAIN constant is used as the + // domainRaw.signal during scale.parse and then replaced with the necessary + // selection expression function during scale.assemble. To not pollute the + // type signatures to account for this setup, the selection domain definition + // is coerced to a string and appended to SELECTION_DOMAIN. + function isRawSelectionDomain(domainRaw) { + return domainRaw.signal.indexOf(SELECTION_DOMAIN) >= 0; + } + function selectionScaleDomain(model, domainRaw) { + var selDomain = JSON.parse(domainRaw.signal.replace(SELECTION_DOMAIN, '')); + var name = varName(selDomain.selection); + var selCmpt = model.component.selection && model.component.selection[name]; + if (selCmpt) { + warn('Use "bind": "scales" to setup a binding for scales and selections within the same view.'); + } + else { + selCmpt = model.getSelectionComponent(name, selDomain.selection); + if (!selDomain.encoding && !selDomain.field) { + selDomain.field = selCmpt.project[0].field; + if (selCmpt.project.length > 1) { + warn('A "field" or "encoding" must be specified when using a selection as a scale domain. ' + + ("Using \"field\": " + $(selDomain.field) + ".")); + } + } + return { + signal: compiler(selCmpt.type).scaleDomain + + ("(" + $(name + STORE) + ", " + $(selDomain.encoding || null) + ", ") + + $(selDomain.field || null) + + (selCmpt.resolve === 'global' ? ')' : ", " + $(selCmpt.resolve) + ")") + }; + } + return { signal: 'null' }; + } + // Utility functions + function forEachSelection(model, cb) { + var selections = model.component.selection; + for (var name_3 in selections) { + if (selections.hasOwnProperty(name_3)) { + var sel = selections[name_3]; + cb(sel, compiler(sel.type)); + } + } + } + function compiler(type) { + switch (type) { + case 'single': + return single; + case 'multi': + return multi; + case 'interval': + return interval; + } + return null; + } + function getFacetModel(model) { + var parent = model.parent; + while (parent) { + if (isFacetModel(parent)) { + break; + } + parent = parent.parent; + } + return parent; + } + function unitName(model) { + var name = $(model.name); + var facet = getFacetModel(model); + if (facet) { + name += (facet.facet.row ? " + '_' + (" + accessPathWithDatum(facet.vgField('row'), 'facet') + ")" : '') + + (facet.facet.column ? " + '_' + (" + accessPathWithDatum(facet.vgField('column'), 'facet') + ")" : ''); + } + return name; + } + function requiresSelectionId(model) { + var identifier = false; + forEachSelection(model, function (selCmpt) { + identifier = identifier || selCmpt.project.some(function (proj) { return proj.field === SELECTION_ID; }); + }); + return identifier; + } + function channelSignalName(selCmpt, channel, range) { + var sgNames = selCmpt._signalNames || (selCmpt._signalNames = {}); + if (sgNames[channel] && sgNames[channel][range]) { + return sgNames[channel][range]; + } + sgNames[channel] = sgNames[channel] || {}; + var basename = varName(selCmpt.name + '_' + (range === 'visual' ? channel : selCmpt.fields[channel])); + var name = basename; + var counter = 1; + while (sgNames[name]) { + name = basename + "_" + counter++; + } + return (sgNames[name] = sgNames[channel][range] = name); + } + function positionalProjections(selCmpt) { + var x = null; + var xi = null; + var y = null; + var yi = null; + selCmpt.project.forEach(function (p, i) { + if (p.channel === X) { + x = p; + xi = i; + } + else if (p.channel === Y) { + y = p; + yi = i; + } + }); + return { x: x, xi: xi, y: y, yi: yi }; + } + + function isSelectionPredicate(predicate) { + return predicate && predicate['selection']; + } + function isFieldEqualPredicate(predicate) { + return predicate && !!predicate.field && predicate.equal !== undefined; + } + function isFieldLTPredicate(predicate) { + return predicate && !!predicate.field && predicate.lt !== undefined; + } + function isFieldLTEPredicate(predicate) { + return predicate && !!predicate.field && predicate.lte !== undefined; + } + function isFieldGTPredicate(predicate) { + return predicate && !!predicate.field && predicate.gt !== undefined; + } + function isFieldGTEPredicate(predicate) { + return predicate && !!predicate.field && predicate.gte !== undefined; + } + function isFieldRangePredicate(predicate) { + if (predicate && predicate.field) { + if (isArray(predicate.range) && predicate.range.length === 2) { + return true; + } + } + return false; + } + function isFieldOneOfPredicate(predicate) { + return predicate && !!predicate.field && (isArray(predicate.oneOf) || + isArray(predicate.in) // backward compatibility + ); + } + function isFieldPredicate(predicate) { + return isFieldOneOfPredicate(predicate) || isFieldEqualPredicate(predicate) || isFieldRangePredicate(predicate) || isFieldLTPredicate(predicate) || isFieldGTPredicate(predicate) || isFieldLTEPredicate(predicate) || isFieldGTEPredicate(predicate); + } + /** + * Converts a predicate into an expression. + */ + // model is only used for selection filters. + function expression(model, filterOp, node) { + return logicalExpr(filterOp, function (predicate) { + if (isString(predicate)) { + return predicate; + } + else if (isSelectionPredicate(predicate)) { + return selectionPredicate(model, predicate.selection, node); + } + else { // Filter Object + return fieldFilterExpression(predicate); + } + }); + } + // This method is used by Voyager. Do not change its behavior without changing Voyager. + function fieldFilterExpression(predicate, useInRange) { + if (useInRange === void 0) { useInRange = true; } + var fieldExpr$$1 = predicate.timeUnit ? + // For timeUnit, cast into integer with time() so we can use ===, inrange, indexOf to compare values directly. + // TODO: We calculate timeUnit on the fly here. Consider if we would like to consolidate this with timeUnit pipeline + // TODO: support utc + ('time(' + fieldExpr(predicate.timeUnit, predicate.field) + ')') : + vgField(predicate, { expr: 'datum' }); + if (isFieldEqualPredicate(predicate)) { + return fieldExpr$$1 + '===' + valueExpr(predicate.equal, predicate.timeUnit); + } + else if (isFieldLTPredicate(predicate)) { + var upper = predicate.lt; + return fieldExpr$$1 + "<" + valueExpr(upper, predicate.timeUnit); + } + else if (isFieldGTPredicate(predicate)) { + var lower = predicate.gt; + return fieldExpr$$1 + ">" + valueExpr(lower, predicate.timeUnit); + } + else if (isFieldLTEPredicate(predicate)) { + var upper = predicate.lte; + return fieldExpr$$1 + "<=" + valueExpr(upper, predicate.timeUnit); + } + else if (isFieldGTEPredicate(predicate)) { + var lower = predicate.gte; + return fieldExpr$$1 + ">=" + valueExpr(lower, predicate.timeUnit); + } + else if (isFieldOneOfPredicate(predicate)) { + // "oneOf" was formerly "in" -- so we need to add backward compatibility + var oneOf = predicate.oneOf || predicate['in']; + return 'indexof([' + + oneOf.map(function (v) { return valueExpr(v, predicate.timeUnit); }).join(',') + + '], ' + fieldExpr$$1 + ') !== -1'; + } + else if (isFieldRangePredicate(predicate)) { + var lower = predicate.range[0]; + var upper = predicate.range[1]; + if (lower !== null && upper !== null && useInRange) { + return 'inrange(' + fieldExpr$$1 + ', [' + + valueExpr(lower, predicate.timeUnit) + ', ' + + valueExpr(upper, predicate.timeUnit) + '])'; + } + var exprs = []; + if (lower !== null) { + exprs.push(fieldExpr$$1 + " >= " + valueExpr(lower, predicate.timeUnit)); + } + if (upper !== null) { + exprs.push(fieldExpr$$1 + " <= " + valueExpr(upper, predicate.timeUnit)); + } + return exprs.length > 0 ? exprs.join(' && ') : 'true'; + } + /* istanbul ignore next: it should never reach here */ + throw new Error("Invalid field predicate: " + JSON.stringify(predicate)); + } + function valueExpr(v, timeUnit) { + if (isDateTime(v)) { + var expr = dateTimeExpr(v, true); + return 'time(' + expr + ')'; + } + if (isLocalSingleTimeUnit(timeUnit)) { + var datetime = {}; + datetime[timeUnit] = v; + var expr = dateTimeExpr(datetime, true); + return 'time(' + expr + ')'; + } + else if (isUtcSingleTimeUnit(timeUnit)) { + return valueExpr(v, getLocalTimeUnit(timeUnit)); + } + return JSON.stringify(v); + } + function normalizePredicate(f) { + if (isFieldPredicate(f) && f.timeUnit) { + return __assign({}, f, { timeUnit: normalizeTimeUnit(f.timeUnit) }); + } + return f; + } + + function isFilter(t) { + return t['filter'] !== undefined; + } + function isLookup(t) { + return t['lookup'] !== undefined; + } + function isWindow(t) { + return t['window'] !== undefined; + } + function isCalculate(t) { + return t['calculate'] !== undefined; + } + function isBin(t) { + return !!t['bin']; + } + function isTimeUnit$1(t) { + return t['timeUnit'] !== undefined; + } + function isAggregate$1(t) { + return t['aggregate'] !== undefined; + } + function isStack(t) { + return t['stack'] !== undefined; + } + function normalizeTransform(transform) { + return transform.map(function (t) { + if (isFilter(t)) { + return { + filter: normalizeLogicalOperand(t.filter, normalizePredicate) + }; + } + return t; + }); + } + + var transform = /*#__PURE__*/Object.freeze({ + isFilter: isFilter, + isLookup: isLookup, + isWindow: isWindow, + isCalculate: isCalculate, + isBin: isBin, + isTimeUnit: isTimeUnit$1, + isAggregate: isAggregate$1, + isStack: isStack, + normalizeTransform: normalizeTransform + }); + + function rangeFormula(model, fieldDef, channel, config) { + if (binRequiresRange(fieldDef, channel)) { + // read format from axis or legend, if there is no format then use config.numberFormat + var guide = isUnitModel(model) ? (model.axis(channel) || model.legend(channel) || {}) : {}; + var startField = vgField(fieldDef, { expr: 'datum', }); + var endField = vgField(fieldDef, { expr: 'datum', binSuffix: 'end' }); + return { + formulaAs: vgField(fieldDef, { binSuffix: 'range' }), + formula: binFormatExpression(startField, endField, guide.format, config) + }; + } + return {}; + } + function binKey(bin, field) { + return binToString(bin) + "_" + field; + } + function getSignalsFromModel(model, key) { + return { + signal: model.getName(key + "_bins"), + extentSignal: model.getName(key + "_extent") + }; + } + function isBinTransform(t) { + return 'as' in t; + } + function createBinComponent(t, model) { + var as; + if (isBinTransform(t)) { + as = [t.as, t.as + "_end"]; + } + else { + as = [vgField(t, {}), vgField(t, { binSuffix: 'end' })]; + } + var bin = normalizeBin(t.bin, undefined) || {}; + var key = binKey(bin, t.field); + var _a = getSignalsFromModel(model, key), signal = _a.signal, extentSignal = _a.extentSignal; + var binComponent = __assign({ bin: bin, field: t.field, as: as }, signal ? { signal: signal } : {}, extentSignal ? { extentSignal: extentSignal } : {}); + return { key: key, binComponent: binComponent }; + } + var BinNode = /** @class */ (function (_super) { + __extends(BinNode, _super); + function BinNode(parent, bins) { + var _this = _super.call(this, parent) || this; + _this.bins = bins; + return _this; + } + BinNode.prototype.clone = function () { + return new BinNode(null, duplicate(this.bins)); + }; + BinNode.makeFromEncoding = function (parent, model) { + var bins = model.reduceFieldDef(function (binComponentIndex, fieldDef, channel) { + if (fieldDef.bin) { + var _a = createBinComponent(fieldDef, model), key = _a.key, binComponent = _a.binComponent; + binComponentIndex[key] = __assign({}, binComponent, binComponentIndex[key], rangeFormula(model, fieldDef, channel, model.config)); + } + return binComponentIndex; + }, {}); + if (keys(bins).length === 0) { + return null; + } + return new BinNode(parent, bins); + }; + /** + * Creates a bin node from BinTransform. + * The optional parameter should provide + */ + BinNode.makeFromTransform = function (parent, t, model) { + var _a; + var _b = createBinComponent(t, model), key = _b.key, binComponent = _b.binComponent; + return new BinNode(parent, (_a = {}, + _a[key] = binComponent, + _a)); + }; + BinNode.prototype.merge = function (other) { + this.bins = __assign({}, this.bins, other.bins); + other.remove(); + }; + BinNode.prototype.producedFields = function () { + var out = {}; + vals(this.bins).forEach(function (c) { + c.as.forEach(function (f) { return out[f] = true; }); + }); + return out; + }; + BinNode.prototype.dependentFields = function () { + var out = {}; + vals(this.bins).forEach(function (c) { + out[c.field] = true; + }); + return out; + }; + BinNode.prototype.assemble = function () { + return flatten(vals(this.bins).map(function (bin) { + var transform = []; + var binTrans = __assign({ type: 'bin', field: bin.field, as: bin.as, signal: bin.signal }, bin.bin); + if (!bin.bin.extent && bin.extentSignal) { + transform.push({ + type: 'extent', + field: bin.field, + signal: bin.extentSignal + }); + binTrans.extent = { signal: bin.extentSignal }; + } + transform.push(binTrans); + if (bin.formula) { + transform.push({ + type: 'formula', + expr: bin.formula, + as: bin.formulaAs + }); + } + return transform; + })); + }; + return BinNode; + }(DataFlowNode)); + + var FilterNode = /** @class */ (function (_super) { + __extends(FilterNode, _super); + function FilterNode(parent, model, filter) { + var _this = _super.call(this, parent) || this; + _this.model = model; + _this.filter = filter; + _this.expr = expression(_this.model, _this.filter, _this); + return _this; + } + FilterNode.prototype.clone = function () { + return new FilterNode(null, this.model, duplicate(this.filter)); + }; + FilterNode.prototype.assemble = function () { + return { + type: 'filter', + expr: this.expr + }; + }; + return FilterNode; + }(DataFlowNode)); + + var GeoJSONNode = /** @class */ (function (_super) { + __extends(GeoJSONNode, _super); + function GeoJSONNode(parent, fields, geojson, signal) { + var _this = _super.call(this, parent) || this; + _this.fields = fields; + _this.geojson = geojson; + _this.signal = signal; + return _this; + } + GeoJSONNode.prototype.clone = function () { + return new GeoJSONNode(null, duplicate(this.fields), this.geojson, this.signal); + }; + GeoJSONNode.parseAll = function (parent, model) { + var geoJsonCounter = 0; + [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (coordinates) { + var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; }); + if (pair[0] || pair[1]) { + parent = new GeoJSONNode(parent, pair, null, model.getName("geojson_" + geoJsonCounter++)); + } + }); + if (model.channelHasField(SHAPE)) { + var fieldDef = model.fieldDef(SHAPE); + if (fieldDef.type === GEOJSON) { + parent = new GeoJSONNode(parent, null, fieldDef.field, model.getName("geojson_" + geoJsonCounter++)); + } + } + return parent; + }; + GeoJSONNode.prototype.assemble = function () { + return __assign({ type: 'geojson' }, (this.fields ? { fields: this.fields } : {}), (this.geojson ? { geojson: this.geojson } : {}), { signal: this.signal }); + }; + return GeoJSONNode; + }(DataFlowNode)); + + var GeoPointNode = /** @class */ (function (_super) { + __extends(GeoPointNode, _super); + function GeoPointNode(parent, projection, fields, as) { + var _this = _super.call(this, parent) || this; + _this.projection = projection; + _this.fields = fields; + _this.as = as; + return _this; + } + GeoPointNode.prototype.clone = function () { + return new GeoPointNode(null, this.projection, duplicate(this.fields), duplicate(this.as)); + }; + GeoPointNode.parseAll = function (parent, model) { + if (!model.projectionName()) { + return parent; + } + [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (coordinates) { + var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; }); + var suffix = coordinates[0] === LONGITUDE2 ? '2' : ''; + if (pair[0] || pair[1]) { + parent = new GeoPointNode(parent, model.projectionName(), pair, [model.getName('x' + suffix), model.getName('y' + suffix)]); + } + }); + return parent; + }; + GeoPointNode.prototype.assemble = function () { + return { + type: 'geopoint', + projection: this.projection, + fields: this.fields, + as: this.as + }; + }; + return GeoPointNode; + }(DataFlowNode)); + + var IdentifierNode = /** @class */ (function (_super) { + __extends(IdentifierNode, _super); + function IdentifierNode(parent) { + return _super.call(this, parent) || this; + } + IdentifierNode.prototype.clone = function () { + return new IdentifierNode(null); + }; + IdentifierNode.prototype.producedFields = function () { + var _a; + return _a = {}, _a[SELECTION_ID] = true, _a; + }; + IdentifierNode.prototype.assemble = function () { + return { type: 'identifier', as: SELECTION_ID }; + }; + return IdentifierNode; + }(DataFlowNode)); + + /** + * Class to track interesting properties (see https://15721.courses.cs.cmu.edu/spring2016/papers/graefe-ieee1995.pdf) + * about how fields have been parsed or whether they have been derived in a transforms. We use this to not parse the + * same field again (or differently). + */ + var AncestorParse = /** @class */ (function (_super) { + __extends(AncestorParse, _super); + function AncestorParse(explicit, implicit, parseNothing) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + if (parseNothing === void 0) { parseNothing = false; } + var _this = _super.call(this, explicit, implicit) || this; + _this.explicit = explicit; + _this.implicit = implicit; + _this.parseNothing = parseNothing; + return _this; + } + AncestorParse.prototype.clone = function () { + var clone = _super.prototype.clone.call(this); + clone.parseNothing = this.parseNothing; + return clone; + }; + return AncestorParse; + }(Split)); + + var LookupNode = /** @class */ (function (_super) { + __extends(LookupNode, _super); + function LookupNode(parent, transform, secondary) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + _this.secondary = secondary; + return _this; + } + LookupNode.make = function (parent, model, transform, counter) { + var sources = model.component.data.sources; + var s = new SourceNode(transform.from.data); + var fromSource = sources[s.hash()]; + if (!fromSource) { + sources[s.hash()] = s; + fromSource = s; + } + var fromOutputName = model.getName("lookup_" + counter); + var fromOutputNode = new OutputNode(fromSource, fromOutputName, 'lookup', model.component.data.outputNodeRefCounts); + model.component.data.outputNodes[fromOutputName] = fromOutputNode; + return new LookupNode(parent, transform, fromOutputNode.getSource()); + }; + LookupNode.prototype.producedFields = function () { + return toSet(this.transform.from.fields || ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as])); + }; + LookupNode.prototype.assemble = function () { + var foreign; + if (this.transform.from.fields) { + // lookup a few fields and add create a flat output + foreign = __assign({ values: this.transform.from.fields }, this.transform.as ? { as: ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as]) } : {}); + } + else { + // lookup full record and nest it + var asName = this.transform.as; + if (!isString(asName)) { + warn(message.NO_FIELDS_NEEDS_AS); + asName = '_lookup'; + } + foreign = { + as: [asName] + }; + } + return __assign({ type: 'lookup', from: this.secondary, key: this.transform.from.key, fields: [this.transform.lookup] }, foreign, (this.transform.default ? { default: this.transform.default } : {})); + }; + return LookupNode; + }(DataFlowNode)); + + /** + * A class for the window transform nodes + */ + var WindowTransformNode = /** @class */ (function (_super) { + __extends(WindowTransformNode, _super); + function WindowTransformNode(parent, transform) { + var _this = _super.call(this, parent) || this; + _this.transform = transform; + return _this; + } + WindowTransformNode.prototype.clone = function () { + return new WindowTransformNode(this.parent, duplicate(this.transform)); + }; + WindowTransformNode.prototype.producedFields = function () { + var _this = this; + var out = {}; + this.transform.window.forEach(function (windowFieldDef) { + out[_this.getDefaultName(windowFieldDef)] = true; + }); + return out; + }; + WindowTransformNode.prototype.getDefaultName = function (windowFieldDef) { + return windowFieldDef.as || vgField(windowFieldDef); + }; + WindowTransformNode.prototype.assemble = function () { + var fields = []; + var ops = []; + var as = []; + var params = []; + for (var _i = 0, _a = this.transform.window; _i < _a.length; _i++) { + var window_1 = _a[_i]; + ops.push(window_1.op); + as.push(this.getDefaultName(window_1)); + params.push(window_1.param === undefined ? null : window_1.param); + fields.push(window_1.field === undefined ? null : window_1.field); + } + var frame = this.transform.frame; + var groupby = this.transform.groupby; + var sortFields = []; + var sortOrder = []; + if (this.transform.sort !== undefined) { + for (var _b = 0, _c = this.transform.sort; _b < _c.length; _b++) { + var sortField = _c[_b]; + sortFields.push(sortField.field); + sortOrder.push(sortField.order === undefined ? null : sortField.order); + } + } + var sort = { + field: sortFields, + order: sortOrder, + }; + var ignorePeers = this.transform.ignorePeers; + var result = { + type: 'window', + params: params, + as: as, + ops: ops, + fields: fields, + sort: sort, + }; + if (ignorePeers !== undefined) { + result.ignorePeers = ignorePeers; + } + if (groupby !== undefined) { + result.groupby = groupby; + } + if (frame !== undefined) { + result.frame = frame; + } + return result; + }; + return WindowTransformNode; + }(DataFlowNode)); + + function parseRoot(model, sources) { + if (model.data || !model.parent) { + // if the model defines a data source or is the root, create a source node + var source = new SourceNode(model.data); + var hash$$1 = source.hash(); + if (hash$$1 in sources) { + // use a reference if we already have a source + return sources[hash$$1]; + } + else { + // otherwise add a new one + sources[hash$$1] = source; + return source; + } + } + else { + // If we don't have a source defined (overriding parent's data), use the parent's facet root or main. + return model.parent.component.data.facetRoot ? model.parent.component.data.facetRoot : model.parent.component.data.main; + } + } + /** + * Parses a transforms array into a chain of connected dataflow nodes. + */ + function parseTransformArray(head, model, ancestorParse) { + var lookupCounter = 0; + model.transforms.forEach(function (t) { + if (isCalculate(t)) { + head = new CalculateNode(head, t); + ancestorParse.set(t.as, 'derived', false); + } + else if (isFilter(t)) { + head = ParseNode.makeImplicitFromFilterTransform(head, t, ancestorParse) || head; + head = new FilterNode(head, model, t.filter); + } + else if (isBin(t)) { + head = BinNode.makeFromTransform(head, t, model); + ancestorParse.set(t.as, 'number', false); + } + else if (isTimeUnit$1(t)) { + head = TimeUnitNode.makeFromTransform(head, t); + ancestorParse.set(t.as, 'date', false); + } + else if (isAggregate$1(t)) { + var agg = head = AggregateNode.makeFromTransform(head, t); + if (requiresSelectionId(model)) { + head = new IdentifierNode(head); + } + for (var _i = 0, _a = keys(agg.producedFields()); _i < _a.length; _i++) { + var field = _a[_i]; + ancestorParse.set(field, 'derived', false); + } + } + else if (isLookup(t)) { + var lookup = head = LookupNode.make(head, model, t, lookupCounter++); + for (var _b = 0, _c = keys(lookup.producedFields()); _b < _c.length; _b++) { + var field = _c[_b]; + ancestorParse.set(field, 'derived', false); + } + } + else if (isWindow(t)) { + var window_1 = head = new WindowTransformNode(head, t); + for (var _d = 0, _e = keys(window_1.producedFields()); _d < _e.length; _d++) { + var field = _e[_d]; + ancestorParse.set(field, 'derived', false); + } + } + else if (isStack(t)) { + var stack = head = StackNode.makeFromTransform(head, t); + for (var _f = 0, _g = keys(stack.producedFields()); _f < _g.length; _f++) { + var field = _g[_f]; + ancestorParse.set(field, 'derived', false); + } + } + else { + warn(message.invalidTransformIgnored(t)); + return; + } + }); + return head; + } + /* + Description of the dataflow (http://asciiflow.com/): + +--------+ + | Source | + +---+----+ + | + v + FormatParse + (explicit) + | + v + Transforms + (Filter, Calculate, Binning, TimeUnit, Aggregate, Window, ...) + | + v + FormatParse + (implicit) + | + v + Binning (in `encoding`) + | + v + Timeunit (in `encoding`) + | + v + Formula From Sort Array + | + v + +--+--+ + | Raw | + +-----+ + | + v + Aggregate (in `encoding`) + | + v + Stack (in `encoding`) + | + v + Invalid Filter + | + v + +----------+ + | Main | + +----------+ + | + v + +-------+ + | Facet |----> "column", "column-layout", and "row" + +-------+ + | + v + ...Child data... + */ + function parseData(model) { + var head = parseRoot(model, model.component.data.sources); + var _a = model.component.data, outputNodes = _a.outputNodes, outputNodeRefCounts = _a.outputNodeRefCounts; + var ancestorParse = model.parent ? model.parent.component.data.ancestorParse.clone() : new AncestorParse(); + // format.parse: null means disable parsing + if (model.data && model.data.format && model.data.format.parse === null) { + ancestorParse.parseNothing = true; + } + head = ParseNode.makeExplicit(head, model, ancestorParse) || head; + // Default discrete selections require an identifier transform to + // uniquely identify data points as the _id field is volatile. Add + // this transform at the head of our pipeline such that the identifier + // field is available for all subsequent datasets. Additional identifier + // transforms will be necessary when new tuples are constructed + // (e.g., post-aggregation). + if (requiresSelectionId(model) && (isUnitModel(model) || isLayerModel(model))) { + head = new IdentifierNode(head); + } + // HACK: This is equivalent for merging bin extent for union scale. + // FIXME(https://github.com/vega/vega-lite/issues/2270): Correctly merge extent / bin node for shared bin scale + var parentIsLayer = model.parent && isLayerModel(model.parent); + if (isUnitModel(model) || isFacetModel(model)) { + if (parentIsLayer) { + head = BinNode.makeFromEncoding(head, model) || head; + } + } + if (model.transforms.length > 0) { + head = parseTransformArray(head, model, ancestorParse); + } + head = ParseNode.makeImplicitFromEncoding(head, model, ancestorParse) || head; + if (isUnitModel(model)) { + head = GeoJSONNode.parseAll(head, model); + head = GeoPointNode.parseAll(head, model); + } + if (isUnitModel(model) || isFacetModel(model)) { + if (!parentIsLayer) { + head = BinNode.makeFromEncoding(head, model) || head; + } + head = TimeUnitNode.makeFromEncoding(head, model) || head; + head = CalculateNode.parseAllForSortIndex(head, model); + } + // add an output node pre aggregation + var rawName = model.getName(RAW); + var raw = new OutputNode(head, rawName, RAW, outputNodeRefCounts); + outputNodes[rawName] = raw; + head = raw; + if (isUnitModel(model)) { + var agg = AggregateNode.makeFromEncoding(head, model); + if (agg) { + head = agg; + if (requiresSelectionId(model)) { + head = new IdentifierNode(head); + } + } + head = StackNode.makeFromEncoding(head, model) || head; + } + if (isUnitModel(model)) { + head = FilterInvalidNode.make(head, model) || head; + } + // output node for marks + var mainName = model.getName(MAIN); + var main = new OutputNode(head, mainName, MAIN, outputNodeRefCounts); + outputNodes[mainName] = main; + head = main; + // add facet marker + var facetRoot = null; + if (isFacetModel(model)) { + var facetName = model.getName('facet'); + facetRoot = new FacetNode(head, model, facetName, main.getSource()); + outputNodes[facetName] = facetRoot; + head = facetRoot; + } + return __assign({}, model.component.data, { outputNodes: outputNodes, + outputNodeRefCounts: outputNodeRefCounts, + raw: raw, + main: main, + facetRoot: facetRoot, + ancestorParse: ancestorParse }); + } + + var BaseConcatModel = /** @class */ (function (_super) { + __extends(BaseConcatModel, _super); + function BaseConcatModel(spec, parent, parentGivenName, config, repeater, resolve) { + return _super.call(this, spec, parent, parentGivenName, config, repeater, resolve) || this; + } + BaseConcatModel.prototype.parseData = function () { + this.component.data = parseData(this); + this.children.forEach(function (child) { + child.parseData(); + }); + }; + BaseConcatModel.prototype.parseSelection = function () { + var _this = this; + // Merge selections up the hierarchy so that they may be referenced + // across unit specs. Persist their definitions within each child + // to assemble signals which remain within output Vega unit groups. + this.component.selection = {}; + var _loop_1 = function (child) { + child.parseSelection(); + keys(child.component.selection).forEach(function (key) { + _this.component.selection[key] = child.component.selection[key]; + }); + }; + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + }; + BaseConcatModel.prototype.parseMarkGroup = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseMarkGroup(); + } + }; + BaseConcatModel.prototype.parseAxisAndHeader = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseAxisAndHeader(); + } + // TODO(#2415): support shared axes + }; + BaseConcatModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals); + }; + BaseConcatModel.prototype.assembleSelectionSignals = function () { + this.children.forEach(function (child) { return child.assembleSelectionSignals(); }); + return []; + }; + BaseConcatModel.prototype.assembleLayoutSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleLayoutSignals()); + }, assembleLayoutSignals(this)); + }; + BaseConcatModel.prototype.assembleSelectionData = function (data) { + return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data); + }; + BaseConcatModel.prototype.assembleMarks = function () { + // only children have marks + return this.children.map(function (child) { + var title = child.assembleTitle(); + var style = child.assembleGroupStyle(); + var layoutSizeEncodeEntry = child.assembleLayoutSize(); + return __assign({ type: 'group', name: child.getName('group') }, (title ? { title: title } : {}), (style ? { style: style } : {}), (layoutSizeEncodeEntry ? { + encode: { + update: layoutSizeEncodeEntry + } + } : {}), child.assembleGroup()); + }); + }; + return BaseConcatModel; + }(Model)); + + function parseLayerLayoutSize(model) { + parseChildrenLayoutSize(model); + var layoutSizeCmpt = model.component.layoutSize; + layoutSizeCmpt.setWithExplicit('width', parseNonUnitLayoutSizeForChannel(model, 'width')); + layoutSizeCmpt.setWithExplicit('height', parseNonUnitLayoutSizeForChannel(model, 'height')); + } + var parseRepeatLayoutSize = parseLayerLayoutSize; + function parseConcatLayoutSize(model) { + parseChildrenLayoutSize(model); + var layoutSizeCmpt = model.component.layoutSize; + var sizeTypeToMerge = model.isVConcat ? 'width' : 'height'; + layoutSizeCmpt.setWithExplicit(sizeTypeToMerge, parseNonUnitLayoutSizeForChannel(model, sizeTypeToMerge)); + } + function parseChildrenLayoutSize(model) { + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseLayoutSize(); + } + } + function parseNonUnitLayoutSizeForChannel(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var resolve = model.component.resolve; + var mergedSize; + // Try to merge layout size + for (var _i = 0, _a = model.children; _i < _a.length; _i++) { + var child = _a[_i]; + var childSize = child.component.layoutSize.getWithExplicit(sizeType); + var scaleResolve = resolve.scale[channel]; + if (scaleResolve === 'independent' && childSize.value === 'range-step') { + // Do not merge independent scales with range-step as their size depends + // on the scale domains, which can be different between scales. + mergedSize = undefined; + break; + } + if (mergedSize) { + if (scaleResolve === 'independent' && mergedSize.value !== childSize.value) { + // For independent scale, only merge if all the sizes are the same. + // If the values are different, abandon the merge! + mergedSize = undefined; + break; + } + mergedSize = mergeValuesWithExplicit(mergedSize, childSize, sizeType, ''); + } + else { + mergedSize = childSize; + } + } + if (mergedSize) { + // If merged, rename size and set size of all children. + for (var _b = 0, _c = model.children; _b < _c.length; _b++) { + var child = _c[_b]; + model.renameLayoutSize(child.getName(sizeType), model.getName(sizeType)); + child.component.layoutSize.set(sizeType, 'merged', false); + } + return mergedSize; + } + else { + // Otherwise, there is no merged size. + return { + explicit: false, + value: undefined + }; + } + } + function parseUnitLayoutSize(model) { + var layoutSizeComponent = model.component.layoutSize; + if (!layoutSizeComponent.explicit.width) { + var width = defaultUnitSize(model, 'width'); + layoutSizeComponent.set('width', width, false); + } + if (!layoutSizeComponent.explicit.height) { + var height = defaultUnitSize(model, 'height'); + layoutSizeComponent.set('height', height, false); + } + } + function defaultUnitSize(model, sizeType) { + var channel = sizeType === 'width' ? 'x' : 'y'; + var config = model.config; + var scaleComponent = model.getScaleComponent(channel); + if (scaleComponent) { + var scaleType = scaleComponent.get('type'); + var range = scaleComponent.get('range'); + if (hasDiscreteDomain(scaleType) && isVgRangeStep(range)) { + // For discrete domain with range.step, use dynamic width/height + return 'range-step'; + } + else { + return config.view[sizeType]; + } + } + else if (model.hasProjection) { + return config.view[sizeType]; + } + else { + // No scale - set default size + if (sizeType === 'width' && model.mark === 'text') { + // width for text mark without x-field is a bit wider than typical range step + return config.scale.textXRangeStep; + } + // Set width/height equal to rangeStep config or if rangeStep is null, use value from default scale config. + return config.scale.rangeStep || defaultScaleConfig.rangeStep; + } + } + + var ConcatModel = /** @class */ (function (_super) { + __extends(ConcatModel, _super); + function ConcatModel(spec, parent, parentGivenName, repeater, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'concat'; + if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) { + warn(message.CONCAT_CANNOT_SHARE_AXIS); + } + _this.isVConcat = isVConcatSpec(spec); + _this.children = (isVConcatSpec(spec) ? spec.vconcat : spec.hconcat).map(function (child, i) { + return buildModel(child, _this, _this.getName('concat_' + i), undefined, repeater, config, false); + }); + return _this; + } + ConcatModel.prototype.parseLayoutSize = function () { + parseConcatLayoutSize(this); + }; + ConcatModel.prototype.parseAxisGroup = function () { + return null; + }; + ConcatModel.prototype.assembleLayout = function () { + // TODO: allow customization + return __assign({ padding: { row: 10, column: 10 }, offset: 10 }, (this.isVConcat ? { columns: 1 } : {}), { bounds: 'full', + // Use align each so it can work with multiple plots with different size + align: 'each' }); + }; + return ConcatModel; + }(BaseConcatModel)); + + function makeWalkTree(data) { + // to name datasources + var datasetIndex = 0; + /** + * Recursively walk down the tree. + */ + function walkTree(node, dataSource) { + if (node instanceof SourceNode) { + // If the source is a named data source or a data source with values, we need + // to put it in a different data source. Otherwise, Vega may override the data. + if (!isUrlData(node.data)) { + data.push(dataSource); + var newData = { + name: null, + source: dataSource.name, + transform: [] + }; + dataSource = newData; + } + } + if (node instanceof ParseNode) { + if (node.parent instanceof SourceNode && !dataSource.source) { + // If node's parent is a root source and the data source does not refer to another data source, use normal format parse + dataSource.format = __assign({}, dataSource.format || {}, { parse: node.assembleFormatParse() }); + // add calculates for all nested fields + dataSource.transform = dataSource.transform.concat(node.assembleTransforms(true)); + } + else { + // Otherwise use Vega expression to parse + dataSource.transform = dataSource.transform.concat(node.assembleTransforms()); + } + } + if (node instanceof FacetNode) { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + if (!dataSource.source || dataSource.transform.length > 0) { + data.push(dataSource); + node.data = dataSource.name; + } + else { + node.data = dataSource.source; + } + node.assemble().forEach(function (d) { return data.push(d); }); + // break here because the rest of the tree has to be taken care of by the facet. + return; + } + if (node instanceof FilterNode || + node instanceof CalculateNode || + node instanceof GeoPointNode || + node instanceof GeoJSONNode || + node instanceof AggregateNode || + node instanceof LookupNode || + node instanceof WindowTransformNode || + node instanceof IdentifierNode) { + dataSource.transform.push(node.assemble()); + } + if (node instanceof FilterInvalidNode || + node instanceof BinNode || + node instanceof TimeUnitNode || + node instanceof StackNode) { + dataSource.transform = dataSource.transform.concat(node.assemble()); + } + if (node instanceof AggregateNode) { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + } + if (node instanceof OutputNode) { + if (dataSource.source && dataSource.transform.length === 0) { + node.setSource(dataSource.source); + } + else if (node.parent instanceof OutputNode) { + // Note that an output node may be required but we still do not assemble a + // separate data source for it. + node.setSource(dataSource.name); + } + else { + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + // Here we set the name of the datasource we generated. From now on + // other assemblers can use it. + node.setSource(dataSource.name); + // if this node has more than one child, we will add a datasource automatically + if (node.numChildren() === 1) { + data.push(dataSource); + var newData = { + name: null, + source: dataSource.name, + transform: [] + }; + dataSource = newData; + } + } + } + switch (node.numChildren()) { + case 0: + // done + if (node instanceof OutputNode && (!dataSource.source || dataSource.transform.length > 0)) { + // do not push empty datasources that are simply references + data.push(dataSource); + } + break; + case 1: + walkTree(node.children[0], dataSource); + break; + default: + if (!dataSource.name) { + dataSource.name = "data_" + datasetIndex++; + } + var source_1 = dataSource.name; + if (!dataSource.source || dataSource.transform.length > 0) { + data.push(dataSource); + } + else { + source_1 = dataSource.source; + } + node.children.forEach(function (child) { + var newData = { + name: null, + source: source_1, + transform: [] + }; + walkTree(child, newData); + }); + break; + } + } + return walkTree; + } + /** + * Assemble data sources that are derived from faceted data. + */ + function assembleFacetData(root) { + var data = []; + var walkTree = makeWalkTree(data); + root.children.forEach(function (child) { return walkTree(child, { + source: root.name, + name: null, + transform: [] + }); }); + return data; + } + /** + * Create Vega Data array from a given compiled model and append all of them to the given array + * + * @param model + * @param data array + * @return modified data array + */ + function assembleRootData(dataComponent, datasets) { + var roots = vals(dataComponent.sources); + var data = []; + // roots.forEach(debug); + var walkTree = makeWalkTree(data); + var sourceIndex = 0; + roots.forEach(function (root) { + // assign a name if the source does not have a name yet + if (!root.hasName()) { + root.dataName = "source_" + sourceIndex++; + } + var newData = root.assemble(); + walkTree(root, newData); + }); + // remove empty transform arrays for cleaner output + data.forEach(function (d) { + if (d.transform.length === 0) { + delete d.transform; + } + }); + // move sources without transforms (the ones that are potentially used in lookups) to the beginning + var whereTo = 0; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if ((d.transform || []).length === 0 && !d.source) { + data.splice(whereTo++, 0, data.splice(i, 1)[0]); + } + } + // now fix the from references in lookup transforms + for (var _i = 0, data_1 = data; _i < data_1.length; _i++) { + var d = data_1[_i]; + for (var _a = 0, _b = d.transform || []; _a < _b.length; _a++) { + var t = _b[_a]; + if (t.type === 'lookup') { + t.from = dataComponent.outputNodes[t.from].getSource(); + } + } + } + // inline values for datasets that are in the datastore + for (var _c = 0, data_2 = data; _c < data_2.length; _c++) { + var d = data_2[_c]; + if (d.name in datasets) { + d.values = datasets[d.name]; + } + } + return data; + } + + function replaceRepeaterInFacet(facet, repeater) { + return replaceRepeater(facet, repeater); + } + function replaceRepeaterInEncoding(encoding, repeater) { + return replaceRepeater(encoding, repeater); + } + /** + * Replaces repeated value and returns if the repeated value is valid. + */ + function replaceRepeat(o, repeater) { + if (isRepeatRef(o.field)) { + if (o.field.repeat in repeater) { + // any needed to calm down ts compiler + return __assign({}, o, { field: repeater[o.field.repeat] }); + } + else { + warn(message.noSuchRepeatedValue(o.field.repeat)); + return undefined; + } + } + return o; + } + /** + * Replace repeater values in a field def with the concrete field name. + */ + function replaceRepeaterInFieldDef(fieldDef, repeater) { + fieldDef = replaceRepeat(fieldDef, repeater); + if (fieldDef === undefined) { + // the field def should be ignored + return undefined; + } + if (fieldDef.sort && isSortField(fieldDef.sort)) { + var sort = replaceRepeat(fieldDef.sort, repeater); + fieldDef = __assign({}, fieldDef, (sort ? { sort: sort } : {})); + } + return fieldDef; + } + function replaceRepeaterInChannelDef(channelDef, repeater) { + if (isFieldDef(channelDef)) { + var fd = replaceRepeaterInFieldDef(channelDef, repeater); + if (fd) { + return fd; + } + else if (isConditionalDef(channelDef)) { + return { condition: channelDef.condition }; + } + } + else { + if (hasConditionalFieldDef(channelDef)) { + var fd = replaceRepeaterInFieldDef(channelDef.condition, repeater); + if (fd) { + return __assign({}, channelDef, { condition: fd }); + } + else { + var condition = channelDef.condition, channelDefWithoutCondition = __rest(channelDef, ["condition"]); + return channelDefWithoutCondition; + } + } + return channelDef; + } + return undefined; + } + function replaceRepeater(mapping, repeater) { + var out = {}; + for (var channel in mapping) { + if (mapping.hasOwnProperty(channel)) { + var channelDef = mapping[channel]; + if (isArray(channelDef)) { + // array cannot have condition + out[channel] = channelDef.map(function (cd) { return replaceRepeaterInChannelDef(cd, repeater); }) + .filter(function (cd) { return cd; }); + } + else { + var cd = replaceRepeaterInChannelDef(channelDef, repeater); + if (cd) { + out[channel] = cd; + } + } + } + } + return out; + } + + var FacetModel = /** @class */ (function (_super) { + __extends(FacetModel, _super); + function FacetModel(spec, parent, parentGivenName, repeater, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'facet'; + _this.child = buildModel(spec.spec, _this, _this.getName('child'), undefined, repeater, config, false); + _this.children = [_this.child]; + var facet = replaceRepeaterInFacet(spec.facet, repeater); + _this.facet = _this.initFacet(facet); + return _this; + } + FacetModel.prototype.initFacet = function (facet) { + // clone to prevent side effect to the original spec + return reduce(facet, function (normalizedFacet, fieldDef, channel) { + if (!contains([ROW, COLUMN], channel)) { + // Drop unsupported channel + warn(message.incompatibleChannel(channel, 'facet')); + return normalizedFacet; + } + if (fieldDef.field === undefined) { + warn(message.emptyFieldDef(fieldDef, channel)); + return normalizedFacet; + } + // Convert type to full, lowercase type, or augment the fieldDef with a default type if missing. + normalizedFacet[channel] = normalize(fieldDef, channel); + return normalizedFacet; + }, {}); + }; + FacetModel.prototype.channelHasField = function (channel) { + return !!this.facet[channel]; + }; + FacetModel.prototype.fieldDef = function (channel) { + return this.facet[channel]; + }; + FacetModel.prototype.parseData = function () { + this.component.data = parseData(this); + this.child.parseData(); + }; + FacetModel.prototype.parseLayoutSize = function () { + parseChildrenLayoutSize(this); + }; + FacetModel.prototype.parseSelection = function () { + // As a facet has a single child, the selection components are the same. + // The child maintains its selections to assemble signals, which remain + // within its unit. + this.child.parseSelection(); + this.component.selection = this.child.component.selection; + }; + FacetModel.prototype.parseMarkGroup = function () { + this.child.parseMarkGroup(); + }; + FacetModel.prototype.parseAxisAndHeader = function () { + this.child.parseAxisAndHeader(); + this.parseHeader('column'); + this.parseHeader('row'); + this.mergeChildAxis('x'); + this.mergeChildAxis('y'); + }; + FacetModel.prototype.parseHeader = function (channel) { + if (this.channelHasField(channel)) { + var fieldDef = this.facet[channel]; + var header = fieldDef.header || {}; + var title$$1 = fieldDef.title !== undefined ? fieldDef.title : + header.title !== undefined ? header.title : title(fieldDef, this.config); + if (this.child.component.layoutHeaders[channel].title) { + // merge title with child to produce "Title / Subtitle / Sub-subtitle" + title$$1 += ' / ' + this.child.component.layoutHeaders[channel].title; + this.child.component.layoutHeaders[channel].title = null; + } + this.component.layoutHeaders[channel] = { + title: title$$1, + facetFieldDef: fieldDef, + // TODO: support adding label to footer as well + header: [this.makeHeaderComponent(channel, true)] + }; + } + }; + FacetModel.prototype.makeHeaderComponent = function (channel, labels) { + var sizeType = channel === 'row' ? 'height' : 'width'; + return { + labels: labels, + sizeSignal: this.child.component.layoutSize.get(sizeType) ? this.child.getSizeSignalRef(sizeType) : undefined, + axes: [] + }; + }; + FacetModel.prototype.mergeChildAxis = function (channel) { + var child = this.child; + if (child.component.axes[channel]) { + var _a = this.component, layoutHeaders = _a.layoutHeaders, resolve = _a.resolve; + resolve.axis[channel] = parseGuideResolve(resolve, channel); + if (resolve.axis[channel] === 'shared') { + // For shared axis, move the axes to facet's header or footer + var headerChannel = channel === 'x' ? 'column' : 'row'; + var layoutHeader = layoutHeaders[headerChannel]; + for (var _i = 0, _b = child.component.axes[channel]; _i < _b.length; _i++) { + var axisComponent = _b[_i]; + var headerType = getHeaderType(axisComponent.get('orient')); + layoutHeader[headerType] = layoutHeader[headerType] || + [this.makeHeaderComponent(headerChannel, false)]; + var mainAxis = assembleAxis(axisComponent, 'main', this.config, { header: true }); + // LayoutHeader no longer keep track of property precedence, thus let's combine. + layoutHeader[headerType][0].axes.push(mainAxis); + axisComponent.mainExtracted = true; + } + } + } + }; + FacetModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.child.assembleSelectionTopLevelSignals(signals); + }; + FacetModel.prototype.assembleSelectionSignals = function () { + this.child.assembleSelectionSignals(); + return []; + }; + FacetModel.prototype.assembleSelectionData = function (data) { + return this.child.assembleSelectionData(data); + }; + FacetModel.prototype.getLayoutBandMixins = function (headerType) { + var bandMixins = {}; + var bandType = headerType === 'header' ? 'headerBand' : 'footerBand'; + for (var _i = 0, _a = ['row', 'column']; _i < _a.length; _i++) { + var channel = _a[_i]; + var layoutHeaderComponent = this.component.layoutHeaders[channel]; + var headerComponent = layoutHeaderComponent[headerType]; + if (headerComponent && headerComponent[0]) { + var sizeType = channel === 'row' ? 'height' : 'width'; + if (!this.child.component.layoutSize.get(sizeType)) { + // If facet child does not have size signal, then apply headerBand + bandMixins[bandType] = bandMixins[bandType] || {}; + bandMixins[bandType][channel] = 0.5; + } + } + } + return bandMixins; + }; + FacetModel.prototype.assembleLayout = function () { + var columns = this.channelHasField('column') ? this.columnDistinctSignal() : 1; + // TODO: determine default align based on shared / independent scales + return __assign({ padding: { row: 10, column: 10 } }, this.getLayoutBandMixins('header'), this.getLayoutBandMixins('footer'), { + // TODO: support offset for rowHeader/rowFooter/rowTitle/columnHeader/columnFooter/columnTitle + offset: 10, columns: columns, bounds: 'full', align: 'all' }); + }; + FacetModel.prototype.assembleLayoutSignals = function () { + // FIXME(https://github.com/vega/vega-lite/issues/1193): this can be incorrect if we have independent scales. + return this.child.assembleLayoutSignals(); + }; + FacetModel.prototype.columnDistinctSignal = function () { + if (this.parent && (this.parent instanceof FacetModel)) { + // For nested facet, we will add columns to group mark instead + // See discussion in https://github.com/vega/vega/issues/952 + // and https://github.com/vega/vega-view/releases/tag/v1.2.6 + return undefined; + } + else { + // In facetNode.assemble(), the name is always this.getName('column') + '_layout'. + var facetLayoutDataName = this.getName('column_domain'); + return { signal: "length(data('" + facetLayoutDataName + "'))" }; + } + }; + FacetModel.prototype.assembleGroup = function (signals) { + if (this.parent && (this.parent instanceof FacetModel)) { + // Provide number of columns for layout. + // See discussion in https://github.com/vega/vega/issues/952 + // and https://github.com/vega/vega-view/releases/tag/v1.2.6 + return __assign({}, (this.channelHasField('column') ? { + encode: { + update: { + // TODO(https://github.com/vega/vega-lite/issues/2759): + // Correct the signal for facet of concat of facet_column + columns: { field: vgField(this.facet.column, { prefix: 'distinct' }) } + } + } + } : {}), _super.prototype.assembleGroup.call(this, signals)); + } + return _super.prototype.assembleGroup.call(this, signals); + }; + /** + * Aggregate cardinality for calculating size + */ + FacetModel.prototype.getCardinalityAggregateForChild = function () { + var fields = []; + var ops = []; + if (this.child instanceof FacetModel) { + if (this.child.channelHasField('column')) { + fields.push(vgField(this.child.facet.column)); + ops.push('distinct'); + } + } + else { + for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) { + var channel = _a[_i]; + var childScaleComponent = this.child.component.scales[channel]; + if (childScaleComponent && !childScaleComponent.merged) { + var type = childScaleComponent.get('type'); + var range = childScaleComponent.get('range'); + if (hasDiscreteDomain(type) && isVgRangeStep(range)) { + var domain = assembleDomain(this.child, channel); + var field = getFieldFromDomain(domain); + if (field) { + fields.push(field); + ops.push('distinct'); + } + else { + warn('Unknown field for ${channel}. Cannot calculate view size.'); + } + } + } + } + } + return fields.length ? { fields: fields, ops: ops } : undefined; + }; + FacetModel.prototype.assembleMarks = function () { + var _a = this, child = _a.child, facet = _a.facet; + var facetRoot = this.component.data.facetRoot; + var data = assembleFacetData(facetRoot); + // If we facet by two dimensions, we need to add a cross operator to the aggregation + // so that we create all groups + var hasRow = this.channelHasField(ROW); + var hasColumn = this.channelHasField(COLUMN); + var layoutSizeEncodeEntry = child.assembleLayoutSize(); + var aggregateMixins = {}; + if (hasRow && hasColumn) { + aggregateMixins.aggregate = { cross: true }; + } + var cardinalityAggregateForChild = this.getCardinalityAggregateForChild(); + if (cardinalityAggregateForChild) { + aggregateMixins.aggregate = __assign({}, aggregateMixins.aggregate, cardinalityAggregateForChild); + } + var title$$1 = child.assembleTitle(); + var style = child.assembleGroupStyle(); + var markGroup = __assign({ name: this.getName('cell'), type: 'group' }, (title$$1 ? { title: title$$1 } : {}), (style ? { style: style } : {}), { from: { + facet: __assign({ name: facetRoot.name, data: facetRoot.data, groupby: [].concat(hasRow ? [this.vgField(ROW)] : [], hasColumn ? [this.vgField(COLUMN)] : []) }, aggregateMixins) + }, sort: { + field: [].concat(hasRow ? [this.vgField(ROW, { expr: 'datum', })] : [], hasColumn ? [this.vgField(COLUMN, { expr: 'datum' })] : []), + order: [].concat(hasRow ? [(facet.row.sort) || 'ascending'] : [], hasColumn ? [(facet.column.sort) || 'ascending'] : []) + } }, (data.length > 0 ? { data: data } : {}), (layoutSizeEncodeEntry ? { encode: { update: layoutSizeEncodeEntry } } : {}), child.assembleGroup()); + return [markGroup]; + }; + FacetModel.prototype.getMapping = function () { + return this.facet; + }; + return FacetModel; + }(ModelWithField)); + + function isFalseOrNull(v) { + return v === false || v === null; + } + var AxisComponent = /** @class */ (function (_super) { + __extends(AxisComponent, _super); + function AxisComponent(explicit, implicit, mainExtracted) { + if (explicit === void 0) { explicit = {}; } + if (implicit === void 0) { implicit = {}; } + if (mainExtracted === void 0) { mainExtracted = false; } + var _this = _super.call(this) || this; + _this.explicit = explicit; + _this.implicit = implicit; + _this.mainExtracted = mainExtracted; + return _this; + } + AxisComponent.prototype.clone = function () { + return new AxisComponent(duplicate(this.explicit), duplicate(this.implicit), this.mainExtracted); + }; + AxisComponent.prototype.hasAxisPart = function (part) { + // FIXME(https://github.com/vega/vega-lite/issues/2552) this method can be wrong if users use a Vega theme. + if (part === 'axis') { // always has the axis container part + return true; + } + if (part === 'grid' || part === 'title') { + return !!this.get(part); + } + // Other parts are enabled by default, so they should not be false or null. + return !isFalseOrNull(this.get(part)); + }; + return AxisComponent; + }(Split)); + + function getAxisConfig(property, config, channel, orient, scaleType) { + if (orient === void 0) { orient = ''; } + // configTypes to loop, starting from higher precedence + var configTypes = (scaleType === 'band' ? ['axisBand'] : []).concat([ + channel === 'x' ? 'axisX' : 'axisY', + 'axis' + orient.substr(0, 1).toUpperCase() + orient.substr(1), + 'axis' + ]); + for (var _i = 0, configTypes_1 = configTypes; _i < configTypes_1.length; _i++) { + var configType = configTypes_1[_i]; + if (config[configType] && config[configType][property] !== undefined) { + return config[configType][property]; + } + } + return undefined; + } + + function labels$1(model, channel, specifiedLabelsSpec, orient) { + var fieldDef = model.fieldDef(channel) || + (channel === 'x' ? model.fieldDef('x2') : + channel === 'y' ? model.fieldDef('y2') : + undefined); + var axis = model.axis(channel); + var config = model.config; + var labelsSpec = {}; + // Text + if (isTimeFieldDef(fieldDef)) { + var isUTCScale = model.getScaleComponent(channel).get('type') === ScaleType.UTC; + var expr = timeFormatExpression('datum.value', fieldDef.timeUnit, axis.format, config.axis.shortTimeLabels, config.timeFormat, isUTCScale); + if (expr) { + labelsSpec.text = { signal: expr }; + } + } + // Label Angle + var angle = getAxisConfig('labelAngle', model.config, channel, orient, model.getScaleComponent(channel).get('type')); + if (angle === undefined) { + angle = labelAngle(axis, channel, fieldDef); + if (angle) { + labelsSpec.angle = { value: angle }; + } + } + if (angle !== undefined) { + var align = labelAlign$1(angle, orient); + if (align) { + labelsSpec.align = { value: align }; + } + labelsSpec.baseline = labelBaseline$1(angle, orient); + } + labelsSpec = __assign({}, labelsSpec, specifiedLabelsSpec); + return keys(labelsSpec).length === 0 ? undefined : labelsSpec; + } + function labelBaseline$1(angle, orient) { + if (orient === 'top' || orient === 'bottom') { + if (angle <= 45 || 315 <= angle) { + return { value: orient === 'top' ? 'bottom' : 'top' }; + } + else if (135 <= angle && angle <= 225) { + return { value: orient === 'top' ? 'top' : 'bottom' }; + } + else { + return { value: 'middle' }; + } + } + else { + if ((angle <= 45 || 315 <= angle) || (135 <= angle && angle <= 225)) { + return { value: 'middle' }; + } + else if (45 <= angle && angle <= 135) { + return { value: orient === 'left' ? 'top' : 'bottom' }; + } + else { + return { value: orient === 'left' ? 'bottom' : 'top' }; + } + } + } + function labelAngle(axis, channel, fieldDef) { + if (axis.labelAngle !== undefined) { + // Make angle within [0,360) + return ((axis.labelAngle % 360) + 360) % 360; + } + else { + if (channel === X && contains([NOMINAL, ORDINAL], fieldDef.type)) { + return 270; + } + } + return undefined; + } + function labelAlign$1(angle, orient) { + angle = ((angle % 360) + 360) % 360; + if (orient === 'top' || orient === 'bottom') { + if (angle % 180 === 0) { + return 'center'; + } + else if (0 < angle && angle < 180) { + return orient === 'top' ? 'right' : 'left'; + } + else { + return orient === 'top' ? 'left' : 'right'; + } + } + else { + if ((angle + 90) % 180 === 0) { + return 'center'; + } + else if (90 <= angle && angle < 270) { + return orient === 'left' ? 'left' : 'right'; + } + else { + return orient === 'left' ? 'right' : 'left'; + } + } + } + + // TODO: we need to refactor this method after we take care of config refactoring + /** + * Default rules for whether to show a grid should be shown for a channel. + * If `grid` is unspecified, the default value is `true` for ordinal scales that are not binned + */ + function grid(scaleType, fieldDef) { + return !hasDiscreteDomain(scaleType) && !fieldDef.bin; + } + function gridScale(model, channel) { + var gridChannel = channel === 'x' ? 'y' : 'x'; + if (model.getScaleComponent(gridChannel)) { + return model.scaleName(gridChannel); + } + return undefined; + } + function labelFlush(fieldDef, channel, specifiedAxis) { + if (specifiedAxis.labelFlush !== undefined) { + return specifiedAxis.labelFlush; + } + if (channel === 'x' && contains(['quantitative', 'temporal'], fieldDef.type)) { + return true; + } + return undefined; + } + function labelOverlap(fieldDef, specifiedAxis, channel, scaleType) { + if (specifiedAxis.labelOverlap !== undefined) { + return specifiedAxis.labelOverlap; + } + // do not prevent overlap for nominal data because there is no way to infer what the missing labels are + if (fieldDef.type !== 'nominal') { + if (scaleType === 'log') { + return 'greedy'; + } + return true; + } + return undefined; + } + function orient(channel) { + switch (channel) { + case X: + return 'bottom'; + case Y: + return 'left'; + } + /* istanbul ignore next: This should never happen. */ + throw new Error(message.INVALID_CHANNEL_FOR_AXIS); + } + function tickCount(channel, fieldDef, scaleType, size) { + if (!hasDiscreteDomain(scaleType) && scaleType !== 'log' && !contains(['month', 'hours', 'day', 'quarter'], fieldDef.timeUnit)) { + if (fieldDef.bin) { + // for binned data, we don't want more ticks than maxbins + return { signal: "ceil(" + size.signal + "/20)" }; + } + return { signal: "ceil(" + size.signal + "/40)" }; + } + return undefined; + } + function values$1(specifiedAxis, model, fieldDef, channel) { + var vals$$1 = specifiedAxis.values; + if (specifiedAxis.values && isDateTime(vals$$1[0])) { + return vals$$1.map(function (dt) { + // normalize = true as end user won't put 0 = January + return { signal: dateTimeExpr(dt, true) }; + }); + } + if (!vals$$1 && fieldDef.bin && fieldDef.type === QUANTITATIVE) { + var domain = model.scaleDomain(channel); + if (domain && domain !== 'unaggregated' && !isSelectionDomain(domain)) { // explicit value + return vals$$1; + } + var signal = model.getName(binToString(fieldDef.bin) + "_" + fieldDef.field + "_bins"); + return { signal: "sequence(" + signal + ".start, " + signal + ".stop + " + signal + ".step, " + signal + ".step)" }; + } + return vals$$1; + } + + function parseUnitAxis(model) { + return POSITION_SCALE_CHANNELS.reduce(function (axis, channel) { + if (model.component.scales[channel] && model.axis(channel)) { + axis[channel] = [parseAxis(channel, model)]; + } + return axis; + }, {}); + } + var OPPOSITE_ORIENT = { + bottom: 'top', + top: 'bottom', + left: 'right', + right: 'left' + }; + function parseLayerAxis(model) { + var _a = model.component, axes = _a.axes, resolve = _a.resolve; + var axisCount = { top: 0, bottom: 0, right: 0, left: 0 }; + for (var _i = 0, _b = model.children; _i < _b.length; _i++) { + var child = _b[_i]; + child.parseAxisAndHeader(); + for (var _c = 0, _d = keys(child.component.axes); _c < _d.length; _c++) { + var channel = _d[_c]; + resolve.axis[channel] = parseGuideResolve(model.component.resolve, channel); + if (resolve.axis[channel] === 'shared') { + // If the resolve says shared (and has not been overridden) + // We will try to merge and see if there is a conflict + axes[channel] = mergeAxisComponents(axes[channel], child.component.axes[channel]); + if (!axes[channel]) { + // If merge returns nothing, there is a conflict so we cannot make the axis shared. + // Thus, mark axis as independent and remove the axis component. + resolve.axis[channel] = 'independent'; + delete axes[channel]; + } + } + } + } + // Move axes to layer's axis component and merge shared axes + for (var _e = 0, _f = [X, Y]; _e < _f.length; _e++) { + var channel = _f[_e]; + for (var _g = 0, _h = model.children; _g < _h.length; _g++) { + var child = _h[_g]; + if (!child.component.axes[channel]) { + // skip if the child does not have a particular axis + continue; + } + if (resolve.axis[channel] === 'independent') { + // If axes are independent, concat the axisComponent array. + axes[channel] = (axes[channel] || []).concat(child.component.axes[channel]); + // Automatically adjust orient + for (var _j = 0, _k = child.component.axes[channel]; _j < _k.length; _j++) { + var axisComponent = _k[_j]; + var _l = axisComponent.getWithExplicit('orient'), orient$$1 = _l.value, explicit = _l.explicit; + if (axisCount[orient$$1] > 0 && !explicit) { + // Change axis orient if the number do not match + var oppositeOrient = OPPOSITE_ORIENT[orient$$1]; + if (axisCount[orient$$1] > axisCount[oppositeOrient]) { + axisComponent.set('orient', oppositeOrient, false); + } + } + axisCount[orient$$1]++; + // TODO(https://github.com/vega/vega-lite/issues/2634): automaticaly add extra offset? + } + } + // After merging, make sure to remove axes from child + delete child.component.axes[channel]; + } + } + } + function mergeAxisComponents(mergedAxisCmpts, childAxisCmpts) { + if (mergedAxisCmpts) { + // FIXME: this is a bit wrong once we support multiple axes + if (mergedAxisCmpts.length !== childAxisCmpts.length) { + return undefined; // Cannot merge axis component with different number of axes. + } + var length_1 = mergedAxisCmpts.length; + for (var i = 0; i < length_1; i++) { + var merged = mergedAxisCmpts[i]; + var child = childAxisCmpts[i]; + if ((!!merged) !== (!!child)) { + return undefined; + } + else if (merged && child) { + var mergedOrient = merged.getWithExplicit('orient'); + var childOrient = child.getWithExplicit('orient'); + if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) { + // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.) + // Cannot merge due to inconsistent orient + return undefined; + } + else { + mergedAxisCmpts[i] = mergeAxisComponent(merged, child); + } + } + } + } + else { + // For first one, return a copy of the child + return childAxisCmpts.map(function (axisComponent) { return axisComponent.clone(); }); + } + return mergedAxisCmpts; + } + function mergeAxisComponent(merged, child) { + var _loop_1 = function (prop) { + var mergedValueWithExplicit = mergeValuesWithExplicit(merged.getWithExplicit(prop), child.getWithExplicit(prop), prop, 'axis', + // Tie breaker function + function (v1, v2) { + switch (prop) { + case 'title': + return mergeTitleComponent(v1, v2); + case 'gridScale': + return { + explicit: v1.explicit, + value: v1.value || v2.value + }; + } + return defaultTieBreaker(v1, v2, prop, 'axis'); + }); + merged.setWithExplicit(prop, mergedValueWithExplicit); + }; + for (var _i = 0, VG_AXIS_PROPERTIES_1 = VG_AXIS_PROPERTIES; _i < VG_AXIS_PROPERTIES_1.length; _i++) { + var prop = VG_AXIS_PROPERTIES_1[_i]; + _loop_1(prop); + } + return merged; + } + function getFieldDefTitle(model, channel) { + var channel2 = channel === 'x' ? 'x2' : 'y2'; + var fieldDef = model.fieldDef(channel); + var fieldDef2 = model.fieldDef(channel2); + var title1 = fieldDef ? fieldDef.title : undefined; + var title2 = fieldDef2 ? fieldDef2.title : undefined; + if (title1 && title2) { + return mergeTitle(title1, title2); + } + else if (title1) { + return title1; + } + else if (title2) { + return title2; + } + else if (title1 !== undefined) { // falsy value to disable config + return title1; + } + else if (title2 !== undefined) { // falsy value to disable config + return title2; + } + return undefined; + } + function parseAxis(channel, model) { + var axis = model.axis(channel); + var axisComponent = new AxisComponent(); + // 1.2. Add properties + VG_AXIS_PROPERTIES.forEach(function (property) { + var value = getProperty$1(property, axis, channel, model); + if (value !== undefined) { + var explicit = + // specified axis.values is already respected, but may get transformed. + property === 'values' ? !!axis.values : + // both VL axis.encoding and axis.labelAngle affect VG axis.encode + property === 'encode' ? !!axis.encoding || !!axis.labelAngle : + // title can be explicit if fieldDef.title is set + property === 'title' && value === getFieldDefTitle(model, channel) ? true : + // Otherwise, things are explicit if the returned value matches the specified property + value === axis[property]; + var configValue = getAxisConfig(property, model.config, channel, axisComponent.get('orient'), model.getScaleComponent(channel).get('type')); + // only set property if it is explicitly set or has no config value (otherwise we will accidentally override config) + if (explicit || configValue === undefined) { + // Do not apply implicit rule if there is a config value + axisComponent.set(property, value, explicit); + } + else if (property === 'grid' && configValue) { + // Grid is an exception because we need to set grid = true to generate another grid axis + axisComponent.set(property, configValue, false); + } + } + }); + // 2) Add guide encode definition groups + var axisEncoding = axis.encoding || {}; + var axisEncode = AXIS_PARTS.reduce(function (e, part) { + if (!axisComponent.hasAxisPart(part)) { + // No need to create encode for a disabled part. + return e; + } + var axisEncodingPart = guideEncodeEntry(axisEncoding[part] || {}, model); + var value = part === 'labels' ? + labels$1(model, channel, axisEncodingPart, axisComponent.get('orient')) : + axisEncodingPart; + if (value !== undefined && keys(value).length > 0) { + e[part] = { update: value }; + } + return e; + }, {}); + // FIXME: By having encode as one property, we won't have fine grained encode merging. + if (keys(axisEncode).length > 0) { + axisComponent.set('encode', axisEncode, !!axis.encoding || axis.labelAngle !== undefined); + } + return axisComponent; + } + function getProperty$1(property, specifiedAxis, channel, model) { + var fieldDef = model.fieldDef(channel); + switch (property) { + case 'scale': + return model.scaleName(channel); + case 'gridScale': + return gridScale(model, channel); + case 'format': + // We don't include temporal field here as we apply format in encode block + return numberFormat(fieldDef, specifiedAxis.format, model.config); + case 'grid': { + var scaleType = model.getScaleComponent(channel).get('type'); + return getSpecifiedOrDefaultValue(specifiedAxis.grid, grid(scaleType, fieldDef)); + } + case 'labelFlush': + return labelFlush(fieldDef, channel, specifiedAxis); + case 'labelOverlap': { + var scaleType = model.getScaleComponent(channel).get('type'); + return labelOverlap(fieldDef, specifiedAxis, channel, scaleType); + } + case 'orient': + return getSpecifiedOrDefaultValue(specifiedAxis.orient, orient(channel)); + case 'tickCount': { + var scaleType = model.getScaleComponent(channel).get('type'); + var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined; + var size = sizeType ? model.getSizeSignalRef(sizeType) + : undefined; + return getSpecifiedOrDefaultValue(specifiedAxis.tickCount, tickCount(channel, fieldDef, scaleType, size)); + } + case 'title': + var channel2 = channel === 'x' ? 'x2' : 'y2'; + var fieldDef2 = model.fieldDef(channel2); + // Keep undefined so we use default if title is unspecified. + // For other falsy value, keep them so we will hide the title. + var fieldDefTitle = getFieldDefTitle(model, channel); + var specifiedTitle = fieldDefTitle !== undefined ? fieldDefTitle : + specifiedAxis.title === undefined ? undefined : specifiedAxis.title; + return getSpecifiedOrDefaultValue(specifiedTitle, + // If title not specified, store base parts of fieldDef (and fieldDef2 if exists) + mergeTitleFieldDefs([toFieldDefBase(fieldDef)], fieldDef2 ? [toFieldDefBase(fieldDef2)] : [])); + case 'values': + return values$1(specifiedAxis, model, fieldDef, channel); + } + // Otherwise, return specified property. + return isAxisProperty(property) ? specifiedAxis[property] : undefined; + } + + function normalizeMarkDef(mark, encoding, config) { + var markDef = isMarkDef(mark) ? __assign({}, mark) : { type: mark }; + // set orient, which can be overridden by rules as sometimes the specified orient is invalid. + var specifiedOrient = markDef.orient || getMarkConfig('orient', markDef, config); + markDef.orient = orient$1(markDef.type, encoding, specifiedOrient); + if (specifiedOrient !== undefined && specifiedOrient !== markDef.orient) { + warn(message.orientOverridden(markDef.orient, specifiedOrient)); + } + // set opacity and filled if not specified in mark config + var specifiedOpacity = markDef.opacity !== undefined ? markDef.opacity : getMarkConfig('opacity', markDef, config); + if (specifiedOpacity === undefined) { + markDef.opacity = defaultOpacity(markDef.type, encoding); + } + var specifiedFilled = markDef.filled; + if (specifiedFilled === undefined) { + markDef.filled = filled(markDef, config); + } + return markDef; + } + function defaultOpacity(mark, encoding) { + if (contains([POINT, TICK, CIRCLE, SQUARE], mark)) { + // point-based marks + if (!isAggregate(encoding)) { + return 0.7; + } + } + return undefined; + } + function filled(markDef, config) { + var filledConfig = getMarkConfig('filled', markDef, config); + var mark = markDef.type; + return filledConfig !== undefined ? filledConfig : mark !== POINT && mark !== LINE && mark !== RULE; + } + function orient$1(mark, encoding, specifiedOrient) { + switch (mark) { + case POINT: + case CIRCLE: + case SQUARE: + case TEXT$1: + case RECT: + // orient is meaningless for these marks. + return undefined; + } + var yIsRange = encoding.y2; + var xIsRange = encoding.x2; + switch (mark) { + case BAR: + if (yIsRange || xIsRange) { + // Ranged bar does not always have clear orientation, so we allow overriding + if (specifiedOrient) { + return specifiedOrient; + } + // If y is range and x is non-range, non-bin Q, y is likely a prebinned field + var xDef = encoding.x; + if (!xIsRange && isFieldDef(xDef) && xDef.type === QUANTITATIVE && !xDef.bin) { + return 'horizontal'; + } + // If x is range and y is non-range, non-bin Q, x is likely a prebinned field + var yDef = encoding.y; + if (!yIsRange && isFieldDef(yDef) && yDef.type === QUANTITATIVE && !yDef.bin) { + return 'vertical'; + } + } + /* tslint:disable */ + case RULE: // intentionally fall through + // return undefined for line segment rule and bar with both axis ranged + if (xIsRange && yIsRange) { + return undefined; + } + case AREA: // intentionally fall through + // If there are range for both x and y, y (vertical) has higher precedence. + if (yIsRange) { + return 'vertical'; + } + else if (xIsRange) { + return 'horizontal'; + } + else if (mark === RULE) { + if (encoding.x && !encoding.y) { + return 'vertical'; + } + else if (encoding.y && !encoding.x) { + return 'horizontal'; + } + } + case LINE: // intentional fall through + case TICK: // Tick is opposite to bar, line, area and never have ranged mark. + /* tslint:enable */ + var xIsContinuous = isFieldDef(encoding.x) && isContinuous(encoding.x); + var yIsContinuous = isFieldDef(encoding.y) && isContinuous(encoding.y); + if (xIsContinuous && !yIsContinuous) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + else if (!xIsContinuous && yIsContinuous) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (xIsContinuous && yIsContinuous) { + var xDef = encoding.x; // we can cast here since they are surely fieldDef + var yDef = encoding.y; + var xIsTemporal = xDef.type === TEMPORAL; + var yIsTemporal = yDef.type === TEMPORAL; + // temporal without timeUnit is considered continuous, but better serves as dimension + if (xIsTemporal && !yIsTemporal) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (!xIsTemporal && yIsTemporal) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + if (!xDef.aggregate && yDef.aggregate) { + return mark !== 'tick' ? 'vertical' : 'horizontal'; + } + else if (xDef.aggregate && !yDef.aggregate) { + return mark !== 'tick' ? 'horizontal' : 'vertical'; + } + if (specifiedOrient) { + // When ambiguous, use user specified one. + return specifiedOrient; + } + if (!(mark === LINE && encoding.order)) { + // Except for connected scatterplot, we should log warning for unclear orientation of QxQ plots. + warn(message.unclearOrientContinuous(mark)); + } + return 'vertical'; + } + else { + // For Discrete x Discrete case, return undefined. + warn(message.unclearOrientDiscreteOrEmpty(mark)); + return undefined; + } + } + return 'vertical'; + } + + var area = { + vgMark: 'area', + encodeEntry: function (model) { + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'include' }), pointPosition('x', model, 'zeroOrMin'), pointPosition('y', model, 'zeroOrMin'), pointPosition2(model, 'zeroOrMin', model.markDef.orient === 'horizontal' ? 'x2' : 'y2'), defined(model)); + } + }; + + var bar = { + vgMark: 'rect', + encodeEntry: function (model) { + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x(model), y(model)); + } + }; + function x(model) { + var config = model.config, encoding = model.encoding, markDef = model.markDef, width = model.width; + var orient = markDef.orient; + var sizeDef = encoding.size; + var xDef = encoding.x; + var x2Def = encoding.x2; + var xScaleName = model.scaleName(X); + var xScale = model.getScaleComponent(X); + // x, x2, and width -- we must specify two of these in all conditions + if (orient === 'horizontal' || x2Def) { + return __assign({}, pointPosition('x', model, 'zeroOrMin'), pointPosition2(model, 'zeroOrMin', 'x2')); + } + else { // vertical + if (isFieldDef(xDef)) { + var xScaleType = xScale.get('type'); + if (xDef.bin && !sizeDef && !hasDiscreteDomain(xScaleType)) { + return binnedPosition(xDef, 'x', model.scaleName('x'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, xScale.get('reverse')); + } + else { + if (xScaleType === ScaleType.BAND) { + return bandPosition(xDef, 'x', model); + } + } + } + // sized bin, normal point-ordinal axis, quantitative x-axis, or no x + return centeredBandPosition('x', model, __assign({}, mid(width)), defaultSizeRef(markDef, xScaleName, xScale, config)); + } + } + function y(model) { + var config = model.config, encoding = model.encoding, height = model.height, markDef = model.markDef; + var orient = markDef.orient; + var sizeDef = encoding.size; + var yDef = encoding.y; + var y2Def = encoding.y2; + var yScaleName = model.scaleName(Y); + var yScale = model.getScaleComponent(Y); + // y, y2 & height -- we must specify two of these in all conditions + if (orient === 'vertical' || y2Def) { + return __assign({}, pointPosition('y', model, 'zeroOrMin'), pointPosition2(model, 'zeroOrMin', 'y2')); + } + else { + if (isFieldDef(yDef)) { + var yScaleType = yScale.get('type'); + if (yDef.bin && !sizeDef && !hasDiscreteDomain(yScaleType)) { + return binnedPosition(yDef, 'y', model.scaleName('y'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, yScale.get('reverse')); + } + else if (yScaleType === ScaleType.BAND) { + return bandPosition(yDef, 'y', model); + } + } + return centeredBandPosition('y', model, mid(height), defaultSizeRef(markDef, yScaleName, yScale, config)); + } + } + function defaultSizeRef(markDef, scaleName, scale, config) { + if (markDef.size !== undefined) { + return { value: markDef.size }; + } + else if (config.bar.discreteBandSize) { + return { value: config.bar.discreteBandSize }; + } + else if (scale) { + var scaleType = scale.get('type'); + if (scaleType === ScaleType.POINT) { + var scaleRange = scale.get('range'); + if (isVgRangeStep(scaleRange) && isNumber(scaleRange.step)) { + return { value: scaleRange.step - 1 }; + } + warn(message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL); + } + else if (scaleType === ScaleType.BAND) { + return bandRef(scaleName); + } + else { // non-ordinal scale + return { value: config.bar.continuousBandSize }; + } + } + else if (config.scale.rangeStep && config.scale.rangeStep !== null) { + return { value: config.scale.rangeStep - 1 }; + } + return { value: 20 }; + } + + var geoshape = { + vgMark: 'shape', + encodeEntry: function (model) { + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' })); + }, + postEncodingTransform: function (model) { + var encoding = model.encoding; + var shapeDef = encoding.shape; + var transform = __assign({ type: 'geoshape', projection: model.projectionName() }, (shapeDef && isFieldDef(shapeDef) && shapeDef.type === GEOJSON ? { field: vgField(shapeDef, { expr: 'datum' }) } : {})); + return [transform]; + } + }; + + var line = { + vgMark: 'line', + encodeEntry: function (model) { + var width = model.width, height = model.height; + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), pointPosition('x', model, mid(width)), pointPosition('y', model, mid(height)), nonPosition('size', model, { + vgChannel: 'strokeWidth' // VL's line size is strokeWidth + }), defined(model)); + } + }; + var trail = { + vgMark: 'trail', + encodeEntry: function (model) { + var width = model.width, height = model.height; + return __assign({}, baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), pointPosition('x', model, mid(width)), pointPosition('y', model, mid(height)), nonPosition('size', model), defined(model)); + } + }; + + function encodeEntry(model, fixedShape) { + var config = model.config, width = model.width, height = model.height; + return __assign({}, baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), pointPosition('x', model, mid(width)), pointPosition('y', model, mid(height)), nonPosition('size', model), shapeMixins(model, config, fixedShape)); + } + function shapeMixins(model, config, fixedShape) { + if (fixedShape) { + return { shape: { value: fixedShape } }; + } + return nonPosition('shape', model, { defaultValue: getMarkConfig('shape', model.markDef, config) }); + } + var point = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model); + } + }; + var circle = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model, 'circle'); + } + }; + var square = { + vgMark: 'symbol', + encodeEntry: function (model) { + return encodeEntry(model, 'square'); + } + }; + + var rect = { + vgMark: 'rect', + encodeEntry: function (model) { + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x$1(model), y$1(model)); + } + }; + function x$1(model) { + var xDef = model.encoding.x; + var x2Def = model.encoding.x2; + var xScale = model.getScaleComponent(X); + var xScaleType = xScale ? xScale.get('type') : undefined; + if (isFieldDef(xDef) && xDef.bin && !x2Def) { + return binnedPosition(xDef, 'x', model.scaleName('x'), 0, xScale.get('reverse')); + } + else if (isFieldDef(xDef) && xScale && hasDiscreteDomain(xScaleType)) { + /* istanbul ignore else */ + if (xScaleType === ScaleType.BAND) { + return bandPosition(xDef, 'x', model); + } + else { + // We don't support rect mark with point/ordinal scale + throw new Error(message.scaleTypeNotWorkWithMark(RECT, xScaleType)); + } + } + else { // continuous scale or no scale + return __assign({}, pointPosition('x', model, 'zeroOrMax'), pointPosition2(model, 'zeroOrMin', 'x2')); + } + } + function y$1(model) { + var yDef = model.encoding.y; + var y2Def = model.encoding.y2; + var yScale = model.getScaleComponent(Y); + var yScaleType = yScale ? yScale.get('type') : undefined; + if (isFieldDef(yDef) && yDef.bin && !y2Def) { + return binnedPosition(yDef, 'y', model.scaleName('y'), 0, yScale.get('reverse')); + } + else if (isFieldDef(yDef) && yScale && hasDiscreteDomain(yScaleType)) { + /* istanbul ignore else */ + if (yScaleType === ScaleType.BAND) { + return bandPosition(yDef, 'y', model); + } + else { + // We don't support rect mark with point/ordinal scale + throw new Error(message.scaleTypeNotWorkWithMark(RECT, yScaleType)); + } + } + else { // continuous scale or no scale + return __assign({}, pointPosition('y', model, 'zeroOrMax'), pointPosition2(model, 'zeroOrMin', 'y2')); + } + } + + var rule = { + vgMark: 'rule', + encodeEntry: function (model) { + var _config = model.config, markDef = model.markDef, width = model.width, height = model.height; + var orient = markDef.orient; + if (!model.encoding.x && !model.encoding.y && !model.encoding.latitude && !model.encoding.longitude) { + // Show nothing if we have none of x, y, lat, and long. + return {}; + } + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), pointPosition('x', model, orient === 'horizontal' ? 'zeroOrMin' : mid(width)), pointPosition('y', model, orient === 'vertical' ? 'zeroOrMin' : mid(height)), (orient !== 'vertical' ? pointPosition2(model, 'zeroOrMax', 'x2') : {}), (orient !== 'horizontal' ? pointPosition2(model, 'zeroOrMax', 'y2') : {}), nonPosition('size', model, { + vgChannel: 'strokeWidth', + defaultValue: markDef.size + })); + } + }; + + var text$3 = { + vgMark: 'text', + encodeEntry: function (model) { + var config = model.config, encoding = model.encoding, width = model.width, height = model.height, markDef = model.markDef; + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), pointPosition('x', model, mid(width)), pointPosition('y', model, mid(height)), text$2(model), nonPosition('size', model, __assign({}, (markDef.size ? { defaultValue: markDef.size } : {}), { vgChannel: 'fontSize' // VL's text size is fontSize + })), valueIfDefined('align', align(model.markDef, encoding, config))); + } + }; + function align(markDef, encoding, config) { + var a = markDef.align || getMarkConfig('align', markDef, config); + if (a === undefined) { + return 'center'; + } + // If there is a config, Vega-parser will process this already. + return undefined; + } + + var tick = { + vgMark: 'rect', + encodeEntry: function (model) { + var _a; + var config = model.config, markDef = model.markDef, width = model.width, height = model.height; + var orient = markDef.orient; + var vgSizeChannel = orient === 'horizontal' ? 'width' : 'height'; + var vgThicknessChannel = orient === 'horizontal' ? 'height' : 'width'; + return __assign({}, baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), pointPosition('x', model, mid(width), 'xc'), pointPosition('y', model, mid(height), 'yc'), nonPosition('size', model, { + defaultValue: defaultSize(model), + vgChannel: vgSizeChannel + }), (_a = {}, _a[vgThicknessChannel] = { value: markDef.thickness || config.tick.thickness }, _a)); + } + }; + function defaultSize(model) { + var config = model.config, markDef = model.markDef; + var orient = markDef.orient; + var scale = model.getScaleComponent(orient === 'horizontal' ? 'x' : 'y'); + if (markDef.size !== undefined) { + return markDef.size; + } + else if (config.tick.bandSize !== undefined) { + return config.tick.bandSize; + } + else { + var scaleRange = scale ? scale.get('range') : undefined; + var rangeStep = scaleRange && isVgRangeStep(scaleRange) ? + scaleRange.step : + config.scale.rangeStep; + if (typeof rangeStep !== 'number') { + // FIXME consolidate this log + throw new Error('Function does not handle non-numeric rangeStep'); + } + return rangeStep / 1.5; + } + } + + var markCompiler = { + area: area, + bar: bar, + circle: circle, + geoshape: geoshape, + line: line, + point: point, + rect: rect, + rule: rule, + square: square, + text: text$3, + tick: tick, + trail: trail + }; + function parseMarkGroup(model) { + if (contains([LINE, AREA, TRAIL], model.mark)) { + return parsePathMark(model); + } + else { + return getMarkGroups(model); + } + } + var FACETED_PATH_PREFIX = 'faceted_path_'; + function parsePathMark(model) { + var details = pathGroupingFields(model.mark, model.encoding); + var pathMarks = getMarkGroups(model, { + // If has subfacet for line/area group, need to use faceted data from below. + fromPrefix: (details.length > 0 ? FACETED_PATH_PREFIX : '') + }); + if (details.length > 0) { // have level of details - need to facet line into subgroups + // TODO: for non-stacked plot, map order to zindex. (Maybe rename order for layer to zindex?) + return [{ + name: model.getName('pathgroup'), + type: 'group', + from: { + facet: { + name: FACETED_PATH_PREFIX + model.requestDataName(MAIN), + data: model.requestDataName(MAIN), + groupby: details, + } + }, + encode: { + update: { + width: { field: { group: 'width' } }, + height: { field: { group: 'height' } } + } + }, + marks: pathMarks + }]; + } + else { + return pathMarks; + } + } + function getSort(model) { + var encoding = model.encoding, stack = model.stack, mark = model.mark, markDef = model.markDef; + var order = encoding.order; + if (!isArray(order) && isValueDef(order)) { + return undefined; + } + else if ((isArray(order) || isFieldDef(order)) && !stack) { + // Sort by the order field if it is specified and the field is not stacked. (For stacked field, order specify stack order.) + return sortParams(order, { expr: 'datum' }); + } + else if (isPathMark(mark)) { + // For both line and area, we sort values based on dimension by default + var dimensionChannelDef = encoding[markDef.orient === 'horizontal' ? 'y' : 'x']; + if (isFieldDef(dimensionChannelDef)) { + var s = dimensionChannelDef.sort; + var sortField = isSortField(s) ? + vgField({ + // FIXME: this op might not already exist? + // FIXME: what if dimensionChannel (x or y) contains custom domain? + aggregate: isAggregate(model.encoding) ? s.op : undefined, + field: s.field + }, { expr: 'datum' }) : + vgField(dimensionChannelDef, { + // For stack with imputation, we only have bin_mid + binSuffix: model.stack && model.stack.impute ? 'mid' : undefined, + expr: 'datum' + }); + return { + field: sortField, + order: 'descending' + }; + } + return undefined; + } + return undefined; + } + function getMarkGroups(model, opt) { + if (opt === void 0) { opt = { fromPrefix: '' }; } + var mark = model.mark; + var clip = model.markDef.clip !== undefined ? + !!model.markDef.clip : scaleClip(model); + var style = getStyles(model.markDef); + var key$$1 = model.encoding.key; + var sort = getSort(model); + var postEncodingTransform = markCompiler[mark].postEncodingTransform ? markCompiler[mark].postEncodingTransform(model) : null; + return [__assign({ name: model.getName('marks'), type: markCompiler[mark].vgMark }, (clip ? { clip: true } : {}), (style ? { style: style } : {}), (key$$1 ? { key: { field: key$$1.field } } : {}), (sort ? { sort: sort } : {}), { from: { data: opt.fromPrefix + model.requestDataName(MAIN) }, encode: { + update: markCompiler[mark].encodeEntry(model) + } }, (postEncodingTransform ? { + transform: postEncodingTransform + } : {}))]; + } + /** + * Returns list of path grouping fields + * that the model's spec contains. + */ + function pathGroupingFields(mark, encoding) { + return keys(encoding).reduce(function (details, channel) { + switch (channel) { + // x, y, x2, y2, lat, long, lat1, long2, order, tooltip, href, cursor should not cause lines to group + case 'x': + case 'y': + case 'order': + case 'tooltip': + case 'href': + case 'x2': + case 'y2': + case 'latitude': + case 'longitude': + case 'latitude2': + case 'longitude2': + // TODO: case 'cursor': + // text, shape, shouldn't be a part of line/trail/area + case 'text': + case 'shape': + return details; + case 'detail': + case 'key': + var channelDef = encoding[channel]; + if (channelDef) { + (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (fieldDef) { + if (!fieldDef.aggregate) { + details.push(vgField(fieldDef, {})); + } + }); + } + return details; + case 'size': + if (mark === 'trail') { + // For trail, size should not group trail lines. + return details; + } + // For line, it should group lines. + /* tslint:disable */ + // intentional fall through + case 'color': + case 'fill': + case 'stroke': + case 'opacity': + // TODO strokeDashOffset: + /* tslint:enable */ + var fieldDef = getFieldDef(encoding[channel]); + if (fieldDef && !fieldDef.aggregate) { + details.push(vgField(fieldDef, {})); + } + return details; + default: + throw new Error("Bug: Channel " + channel + " unimplemented for line mark"); + } + }, []); + } + /** + * If scales are bound to interval selections, we want to automatically clip + * marks to account for panning/zooming interactions. We identify bound scales + * by the domainRaw property, which gets added during scale parsing. + */ + function scaleClip(model) { + var xScale = model.getScaleComponent('x'); + var yScale = model.getScaleComponent('y'); + return (xScale && xScale.get('domainRaw')) || + (yScale && yScale.get('domainRaw')) ? true : false; + } + + /** + * Internal model of Vega-Lite specification for the compiler. + */ + var UnitModel = /** @class */ (function (_super) { + __extends(UnitModel, _super); + function UnitModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) { + if (parentGivenSize === void 0) { parentGivenSize = {}; } + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, undefined) || this; + _this.fit = fit; + _this.type = 'unit'; + _this.specifiedScales = {}; + _this.specifiedAxes = {}; + _this.specifiedLegends = {}; + _this.specifiedProjection = {}; + _this.selection = {}; + _this.children = []; + _this.initSize(__assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {}))); + var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var encoding = _this.encoding = normalizeEncoding(replaceRepeaterInEncoding(spec.encoding || {}, repeater), mark); + _this.markDef = normalizeMarkDef(spec.mark, encoding, config); + // calculate stack properties + _this.stack = stack(mark, encoding, _this.config.stack); + _this.specifiedScales = _this.initScales(mark, encoding); + _this.specifiedAxes = _this.initAxes(encoding); + _this.specifiedLegends = _this.initLegend(encoding); + _this.specifiedProjection = spec.projection; + // Selections will be initialized upon parse. + _this.selection = spec.selection; + return _this; + } + Object.defineProperty(UnitModel.prototype, "hasProjection", { + get: function () { + var encoding = this.encoding; + var isGeoShapeMark = this.mark === GEOSHAPE; + var hasGeoPosition = encoding && GEOPOSITION_CHANNELS.some(function (channel) { return isFieldDef(encoding[channel]); }); + return isGeoShapeMark || hasGeoPosition; + }, + enumerable: true, + configurable: true + }); + /** + * Return specified Vega-lite scale domain for a particular channel + * @param channel + */ + UnitModel.prototype.scaleDomain = function (channel) { + var scale = this.specifiedScales[channel]; + return scale ? scale.domain : undefined; + }; + UnitModel.prototype.axis = function (channel) { + return this.specifiedAxes[channel]; + }; + UnitModel.prototype.legend = function (channel) { + return this.specifiedLegends[channel]; + }; + UnitModel.prototype.initScales = function (mark, encoding) { + return SCALE_CHANNELS.reduce(function (scales, channel) { + var fieldDef; + var specifiedScale; + var channelDef = encoding[channel]; + if (isFieldDef(channelDef)) { + fieldDef = channelDef; + specifiedScale = channelDef.scale; + } + else if (hasConditionalFieldDef(channelDef)) { + fieldDef = channelDef.condition; + specifiedScale = channelDef.condition['scale']; + } + else if (channel === 'x') { + fieldDef = getFieldDef(encoding.x2); + } + else if (channel === 'y') { + fieldDef = getFieldDef(encoding.y2); + } + if (fieldDef) { + scales[channel] = specifiedScale || {}; + } + return scales; + }, {}); + }; + UnitModel.prototype.initAxes = function (encoding) { + return [X, Y].reduce(function (_axis, channel) { + // Position Axis + // TODO: handle ConditionFieldDef + var channelDef = encoding[channel]; + if (isFieldDef(channelDef) || + (channel === X && isFieldDef(encoding.x2)) || + (channel === Y && isFieldDef(encoding.y2))) { + var axisSpec = isFieldDef(channelDef) ? channelDef.axis : null; + // We no longer support false in the schema, but we keep false here for backward compatibility. + if (axisSpec !== null && axisSpec !== false) { + _axis[channel] = __assign({}, axisSpec); + } + } + return _axis; + }, {}); + }; + UnitModel.prototype.initLegend = function (encoding) { + return NONPOSITION_SCALE_CHANNELS.reduce(function (_legend, channel) { + var channelDef = encoding[channel]; + if (channelDef) { + var legend = isFieldDef(channelDef) ? channelDef.legend : + (hasConditionalFieldDef(channelDef)) ? channelDef.condition['legend'] : null; + if (legend !== null && legend !== false) { + _legend[channel] = __assign({}, legend); + } + } + return _legend; + }, {}); + }; + UnitModel.prototype.parseData = function () { + this.component.data = parseData(this); + }; + UnitModel.prototype.parseLayoutSize = function () { + parseUnitLayoutSize(this); + }; + UnitModel.prototype.parseSelection = function () { + this.component.selection = parseUnitSelection(this, this.selection); + }; + UnitModel.prototype.parseMarkGroup = function () { + this.component.mark = parseMarkGroup(this); + }; + UnitModel.prototype.parseAxisAndHeader = function () { + this.component.axes = parseUnitAxis(this); + }; + UnitModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return assembleTopLevelSignals(this, signals); + }; + UnitModel.prototype.assembleSelectionSignals = function () { + return assembleUnitSelectionSignals(this, []); + }; + UnitModel.prototype.assembleSelectionData = function (data) { + return assembleUnitSelectionData(this, data); + }; + UnitModel.prototype.assembleLayout = function () { + return null; + }; + UnitModel.prototype.assembleLayoutSignals = function () { + return assembleLayoutSignals(this); + }; + UnitModel.prototype.assembleMarks = function () { + var marks = this.component.mark || []; + // If this unit is part of a layer, selections should augment + // all in concert rather than each unit individually. This + // ensures correct interleaving of clipping and brushed marks. + if (!this.parent || !isLayerModel(this.parent)) { + marks = assembleUnitSelectionMarks(this, marks); + } + return marks.map(this.correctDataNames); + }; + UnitModel.prototype.assembleLayoutSize = function () { + return { + width: this.getSizeSignalRef('width'), + height: this.getSizeSignalRef('height') + }; + }; + UnitModel.prototype.getMapping = function () { + return this.encoding; + }; + UnitModel.prototype.toSpec = function (excludeConfig, excludeData) { + var encoding = duplicate(this.encoding); + var spec; + spec = { + mark: this.markDef, + encoding: encoding + }; + if (!excludeConfig) { + spec.config = duplicate(this.config); + } + if (!excludeData) { + spec.data = duplicate(this.data); + } + // remove defaults + return spec; + }; + Object.defineProperty(UnitModel.prototype, "mark", { + get: function () { + return this.markDef.type; + }, + enumerable: true, + configurable: true + }); + UnitModel.prototype.channelHasField = function (channel) { + return channelHasField(this.encoding, channel); + }; + UnitModel.prototype.fieldDef = function (channel) { + var channelDef = this.encoding[channel]; + return getFieldDef(channelDef); + }; + return UnitModel; + }(ModelWithField)); + + var LayerModel = /** @class */ (function (_super) { + __extends(LayerModel, _super); + function LayerModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this; + _this.type = 'layer'; + var layoutSize = __assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {})); + _this.initSize(layoutSize); + _this.children = spec.layer.map(function (layer, i) { + if (isLayerSpec(layer)) { + return new LayerModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit); + } + if (isUnitSpec(layer)) { + return new UnitModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit); + } + throw new Error(message.INVALID_SPEC); + }); + return _this; + } + LayerModel.prototype.parseData = function () { + this.component.data = parseData(this); + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseData(); + } + }; + LayerModel.prototype.parseLayoutSize = function () { + parseLayerLayoutSize(this); + }; + LayerModel.prototype.parseSelection = function () { + var _this = this; + // Merge selections up the hierarchy so that they may be referenced + // across unit specs. Persist their definitions within each child + // to assemble signals which remain within output Vega unit groups. + this.component.selection = {}; + var _loop_1 = function (child) { + child.parseSelection(); + keys(child.component.selection).forEach(function (key) { + _this.component.selection[key] = child.component.selection[key]; + }); + }; + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + _loop_1(child); + } + }; + LayerModel.prototype.parseMarkGroup = function () { + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + child.parseMarkGroup(); + } + }; + LayerModel.prototype.parseAxisAndHeader = function () { + parseLayerAxis(this); + }; + LayerModel.prototype.assembleSelectionTopLevelSignals = function (signals) { + return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals); + }; + // TODO: Support same named selections across children. + LayerModel.prototype.assembleSelectionSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleSelectionSignals()); + }, []); + }; + LayerModel.prototype.assembleLayoutSignals = function () { + return this.children.reduce(function (signals, child) { + return signals.concat(child.assembleLayoutSignals()); + }, assembleLayoutSignals(this)); + }; + LayerModel.prototype.assembleSelectionData = function (data) { + return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data); + }; + LayerModel.prototype.assembleTitle = function () { + var title = _super.prototype.assembleTitle.call(this); + if (title) { + return title; + } + // If title does not provide layer, look into children + for (var _i = 0, _a = this.children; _i < _a.length; _i++) { + var child = _a[_i]; + title = child.assembleTitle(); + if (title) { + return title; + } + } + return undefined; + }; + LayerModel.prototype.assembleLayout = function () { + return null; + }; + LayerModel.prototype.assembleMarks = function () { + return assembleLayerSelectionMarks(this, flatten(this.children.map(function (child) { + return child.assembleMarks(); + }))); + }; + LayerModel.prototype.assembleLegends = function () { + return this.children.reduce(function (legends, child) { + return legends.concat(child.assembleLegends()); + }, assembleLegends(this)); + }; + return LayerModel; + }(Model)); + + var RepeatModel = /** @class */ (function (_super) { + __extends(RepeatModel, _super); + function RepeatModel(spec, parent, parentGivenName, repeatValues, config) { + var _this = _super.call(this, spec, parent, parentGivenName, config, repeatValues, spec.resolve) || this; + _this.type = 'repeat'; + if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) { + warn(message.REPEAT_CANNOT_SHARE_AXIS); + } + _this.repeat = spec.repeat; + _this.children = _this._initChildren(spec, _this.repeat, repeatValues, config); + return _this; + } + RepeatModel.prototype._initChildren = function (spec, repeat, repeater, config) { + var children = []; + var row = repeat.row || [repeater ? repeater.row : null]; + var column = repeat.column || [repeater ? repeater.column : null]; + // cross product + for (var _i = 0, row_1 = row; _i < row_1.length; _i++) { + var rowField = row_1[_i]; + for (var _a = 0, column_1 = column; _a < column_1.length; _a++) { + var columnField = column_1[_a]; + var name_1 = (rowField ? '_' + rowField : '') + (columnField ? '_' + columnField : ''); + var childRepeat = { + row: rowField, + column: columnField + }; + children.push(buildModel(spec.spec, this, this.getName('child' + name_1), undefined, childRepeat, config, false)); + } + } + return children; + }; + RepeatModel.prototype.parseLayoutSize = function () { + parseRepeatLayoutSize(this); + }; + RepeatModel.prototype.assembleLayout = function () { + // TODO: allow customization + return { + padding: { row: 10, column: 10 }, + offset: 10, + columns: this.repeat && this.repeat.column ? this.repeat.column.length : 1, + bounds: 'full', + align: 'all' + }; + }; + return RepeatModel; + }(BaseConcatModel)); + + function buildModel(spec, parent, parentGivenName, unitSize, repeater, config, fit) { + if (isFacetSpec(spec)) { + return new FacetModel(spec, parent, parentGivenName, repeater, config); + } + if (isLayerSpec(spec)) { + return new LayerModel(spec, parent, parentGivenName, unitSize, repeater, config, fit); + } + if (isUnitSpec(spec)) { + return new UnitModel(spec, parent, parentGivenName, unitSize, repeater, config, fit); + } + if (isRepeatSpec(spec)) { + return new RepeatModel(spec, parent, parentGivenName, repeater, config); + } + if (isConcatSpec(spec)) { + return new ConcatModel(spec, parent, parentGivenName, repeater, config); + } + throw new Error(message.INVALID_SPEC); + } + + /** + * Vega-Lite's main function, for compiling Vega-lite spec into Vega spec. + * + * At a high-level, we make the following transformations in different phases: + * + * Input spec + * | + * | (Normalization) + * v + * Normalized Spec (Row/Column channels in single-view specs becomes faceted specs, composite marks becomes layered specs.) + * | + * | (Build Model) + * v + * A model tree of the spec + * | + * | (Parse) + * v + * A model tree with parsed components (intermediate structure of visualization primitives in a format that can be easily merged) + * | + * | (Optimize) + * v + * A model tree with parsed components with the data component optimized + * | + * | (Assemble) + * v + * Vega spec + */ + function compile(inputSpec, opt) { + if (opt === void 0) { opt = {}; } + // 0. Augment opt with default opts + if (opt.logger) { + // set the singleton logger to the provided logger + set(opt.logger); + } + if (opt.fieldTitle) { + // set the singleton field title formatter + setTitleFormatter(opt.fieldTitle); + } + try { + // 1. Initialize config by deep merging default config with the config provided via option and the input spec. + var config = initConfig(mergeDeep({}, opt.config, inputSpec.config)); + // 2. Normalize: Convert input spec -> normalized spec + // - Decompose all extended unit specs into composition of unit spec. For example, a box plot get expanded into multiple layers of bars, ticks, and rules. The shorthand row/column channel is also expanded to a facet spec. + var spec = normalize$2(inputSpec, config); + // - Normalize autosize to be a autosize properties object. + var autosize = normalizeAutoSize(inputSpec.autosize, config.autosize, isLayerSpec(spec) || isUnitSpec(spec)); + // 3. Build Model: normalized spec -> Model (a tree structure) + // This phases instantiates the models with default config by doing a top-down traversal. This allows us to pass properties that child models derive from their parents via their constructors. + // See the abstract `Model` class and its children (UnitModel, LayerModel, FacetModel, RepeatModel, ConcatModel) for different types of models. + var model = buildModel(spec, null, '', undefined, undefined, config, autosize.type === 'fit'); + // 4 Parse: Model --> Model with components + // Note that components = intermediate representations that are equivalent to Vega specs. + // We need these intermediate representation because we need to merge many visualizaiton "components" like projections, scales, axes, and legends. + // We will later convert these components into actual Vega specs in the assemble phase. + // In this phase, we do a bottom-up traversal over the whole tree to + // parse for each type of components once (e.g., data, layout, mark, scale). + // By doing bottom-up traversal, we start parsing components of unit specs and + // then merge child components of parent composite specs. + // + // Please see inside model.parse() for order of different components parsed. + model.parse(); + // 5. Optimize the dataflow. This will modify the data component of the model. + optimizeDataflow(model.component.data); + // 6. Assemble: convert model components --> Vega Spec. + return assembleTopLevelModel(model, getTopLevelProperties(inputSpec, config, autosize)); + } + finally { + // Reset the singleton logger if a logger is provided + if (opt.logger) { + reset(); + } + // Reset the singleton field title formatter if provided + if (opt.fieldTitle) { + resetTitleFormatter(); + } + } + } + function getTopLevelProperties(topLevelSpec, config, autosize) { + return __assign({ autosize: keys(autosize).length === 1 && autosize.type ? autosize.type : autosize }, extractTopLevelProperties(config), extractTopLevelProperties(topLevelSpec)); + } + /* + * Assemble the top-level model. + * + * Note: this couldn't be `model.assemble()` since the top-level model + * needs some special treatment to generate top-level properties. + */ + function assembleTopLevelModel(model, topLevelProperties) { + // TODO: change type to become VgSpec + // Config with Vega-Lite only config removed. + var vgConfig = model.config ? stripAndRedirectConfig(model.config) : undefined; + var data = [].concat(model.assembleSelectionData([]), + // only assemble data in the root + assembleRootData(model.component.data, topLevelProperties.datasets || {})); + delete topLevelProperties.datasets; + var projections = model.assembleProjections(); + var title$$1 = model.assembleTitle(); + var style = model.assembleGroupStyle(); + var layoutSignals = model.assembleLayoutSignals(); + // move width and height signals with values to top level + layoutSignals = layoutSignals.filter(function (signal) { + if ((signal.name === 'width' || signal.name === 'height') && signal.value !== undefined) { + topLevelProperties[signal.name] = +signal.value; + return false; + } + return true; + }); + var output = __assign({ $schema: 'https://vega.github.io/schema/vega/v3.json' }, (model.description ? { description: model.description } : {}), topLevelProperties, (title$$1 ? { title: title$$1 } : {}), (style ? { style: style } : {}), { data: data }, (projections.length > 0 ? { projections: projections } : {}), model.assembleGroup(layoutSignals.concat(model.assembleSelectionTopLevelSignals([]))), (vgConfig ? { config: vgConfig } : {})); + return { + spec: output + // TODO: add warning / errors here + }; + } + + + + var facet = /*#__PURE__*/Object.freeze({ + + }); + + /** + * Required Encoding Channels for each mark type + */ + var DEFAULT_REQUIRED_CHANNEL_MAP = { + text: ['text'], + line: ['x', 'y'], + trail: ['x', 'y'], + area: ['x', 'y'] + }; + /** + * Supported Encoding Channel for each mark type + */ + var DEFAULT_SUPPORTED_CHANNEL_TYPE = { + bar: toSet(['row', 'column', 'x', 'y', 'size', 'color', 'fill', 'stroke', 'detail']), + line: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail']), + trail: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail', 'size']), + area: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']), + tick: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']), + circle: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']), + square: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']), + point: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail', 'shape']), + geoshape: toSet(['row', 'column', 'color', 'fill', 'stroke', 'detail', 'shape']), + text: toSet(['row', 'column', 'size', 'color', 'fill', 'stroke', 'text']) // TODO(#724) revise + }; + // TODO: consider if we should add validate method and + // requires ZSchema in the main vega-lite repo + /** + * Further check if encoding mapping of a spec is invalid and + * return error if it is invalid. + * + * This checks if + * (1) all the required encoding channels for the mark type are specified + * (2) all the specified encoding channels are supported by the mark type + * @param {[type]} spec [description] + * @param {RequiredChannelMap = DefaultRequiredChannelMap} requiredChannelMap + * @param {SupportedChannelMap = DefaultSupportedChannelMap} supportedChannelMap + * @return {String} Return one reason why the encoding is invalid, + * or null if the encoding is valid. + */ + function getEncodingMappingError(spec, requiredChannelMap, supportedChannelMap) { + if (requiredChannelMap === void 0) { requiredChannelMap = DEFAULT_REQUIRED_CHANNEL_MAP; } + if (supportedChannelMap === void 0) { supportedChannelMap = DEFAULT_SUPPORTED_CHANNEL_TYPE; } + var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark; + var encoding = spec.encoding; + var requiredChannels = requiredChannelMap[mark]; + var supportedChannels = supportedChannelMap[mark]; + for (var i in requiredChannels) { // all required channels are in encoding` + if (!(requiredChannels[i] in encoding)) { + return 'Missing encoding channel \"' + requiredChannels[i] + + '\" for mark \"' + mark + '\"'; + } + } + for (var channel in encoding) { // all channels in encoding are supported + if (!supportedChannels[channel]) { + return 'Encoding channel \"' + channel + + '\" is not supported by mark type \"' + mark + '\"'; + } + } + if (mark === BAR && !encoding.x && !encoding.y) { + return 'Missing both x and y for bar'; + } + return null; + } + + var validate = /*#__PURE__*/Object.freeze({ + DEFAULT_REQUIRED_CHANNEL_MAP: DEFAULT_REQUIRED_CHANNEL_MAP, + DEFAULT_SUPPORTED_CHANNEL_TYPE: DEFAULT_SUPPORTED_CHANNEL_TYPE, + getEncodingMappingError: getEncodingMappingError + }); + + var version = "2.5.1"; + + exports.aggregate = aggregate; + exports.axis = axis; + exports.bin = bin; + exports.channel = channel; + exports.compositeMark = index; + exports.config = config; + exports.data = data; + exports.datetime = datetime; + exports.encoding = encoding; + exports.facet = facet; + exports.fieldDef = fielddef; + exports.legend = legend; + exports.mark = mark; + exports.scale = scale; + exports.sort = sort; + exports.spec = spec; + exports.stack = stack$1; + exports.timeUnit = timeunit; + exports.transform = transform; + exports.type = type; + exports.util = util; + exports.validate = validate; + exports.compile = compile; + exports.version = version; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=vega-lite.js.map diff --git a/build/vega-lite.js.map b/build/vega-lite.js.map new file mode 100644 index 0000000000..437d2e3332 --- /dev/null +++ b/build/vega-lite.js.map @@ -0,0 +1 @@ +{"version":3,"file":"vega-lite.js","sources":["../node_modules/vega-util/src/accessor.js","../node_modules/vega-util/src/error.js","../node_modules/vega-util/src/splitAccessPath.js","../node_modules/vega-util/src/isArray.js","../node_modules/vega-util/src/isObject.js","../node_modules/vega-util/src/isString.js","../node_modules/vega-util/src/stringValue.js","../node_modules/vega-util/src/field.js","../node_modules/vega-util/src/accessors.js","../node_modules/vega-util/src/logger.js","../node_modules/vega-util/src/isBoolean.js","../node_modules/vega-util/src/isNumber.js","../node_modules/vega-util/src/toSet.js","../node_modules/tslib/tslib.es6.js","../node_modules/jsonify/lib/parse.js","../node_modules/jsonify/lib/stringify.js","../node_modules/jsonify/index.js","../node_modules/json-stable-stringify/index.js","src/logical.js","src/util.js","src/aggregate.js","src/axis.js","src/channel.js","src/bin.js","src/mark.js","src/log.js","src/datetime.js","src/timeunit.js","src/type.js","src/fielddef.js","src/encoding.js","src/compositemark/common.js","src/compositemark/boxplot.js","src/compositemark/errorbar.js","src/compositemark/index.js","src/guide.js","src/legend.js","src/scale.js","src/selection.js","src/title.js","src/config.js","src/stack.js","src/spec.js","src/toplevelprops.js","src/data.js","../node_modules/vega-event-selector/src/event-selector.js","src/vega.schema.js","src/compile/axis/assemble.js","src/compile/mark/valueref.js","src/compile/mark/mixins.js","src/compile/common.js","src/compile/layout/header.js","src/compile/layoutsize/assemble.js","src/compile/resolve.js","src/compile/split.js","src/compile/legend/component.js","src/compile/legend/encode.js","src/compile/legend/properties.js","src/compile/legend/parse.js","src/compile/legend/assemble.js","src/compile/projection/assemble.js","src/projection.js","src/compile/projection/component.js","src/compile/projection/parse.js","src/sort.js","src/compile/data/dataflow.js","src/compile/data/calculate.js","src/compile/data/aggregate.js","src/compile/data/facet.js","src/compile/data/filterinvalid.js","src/compile/data/formatparse.js","src/compile/data/source.js","src/compile/data/timeunit.js","src/compile/data/optimizers.js","src/compile/data/stack.js","src/compile/data/optimize.js","src/compile/scale/domain.js","src/compile/scale/assemble.js","src/compile/scale/component.js","src/compile/scale/range.js","src/compile/scale/properties.js","src/compile/scale/type.js","src/compile/scale/parse.js","src/compile/model.js","src/compile/selection/transforms/scales.js","src/compile/selection/interval.js","src/compile/selection/transforms/nearest.js","src/compile/selection/multi.js","src/compile/selection/single.js","src/compile/selection/transforms/inputs.js","src/compile/selection/transforms/project.js","src/compile/selection/transforms/toggle.js","src/compile/selection/transforms/translate.js","src/compile/selection/transforms/zoom.js","src/compile/selection/transforms/transforms.js","src/compile/selection/selection.js","src/predicate.js","src/transform.js","src/compile/data/bin.js","src/compile/data/filter.js","src/compile/data/geojson.js","src/compile/data/geopoint.js","src/compile/data/indentifier.js","src/compile/data/index.js","src/compile/data/lookup.js","src/compile/data/window.js","src/compile/data/parse.js","src/compile/baseconcat.js","src/compile/layoutsize/parse.js","src/compile/concat.js","src/compile/data/assemble.js","src/compile/repeater.js","src/compile/facet.js","src/compile/axis/component.js","src/compile/axis/config.js","src/compile/axis/encode.js","src/compile/axis/properties.js","src/compile/axis/parse.js","src/compile/mark/init.js","src/compile/mark/area.js","src/compile/mark/bar.js","src/compile/mark/geoshape.js","src/compile/mark/line.js","src/compile/mark/point.js","src/compile/mark/rect.js","src/compile/mark/rule.js","src/compile/mark/text.js","src/compile/mark/tick.js","src/compile/mark/mark.js","src/compile/unit.js","src/compile/layer.js","src/compile/repeat.js","src/compile/buildmodel.js","src/compile/compile.js","src/validate.js"],"sourcesContent":["export default function(fn, fields, name) {\n fn.fields = fields || [];\n fn.fname = name;\n return fn;\n}\n\nexport function accessorName(fn) {\n return fn == null ? null : fn.fname;\n}\n\nexport function accessorFields(fn) {\n return fn == null ? null : fn.fields;\n}\n","export default function(message) {\n throw Error(message);\n}\n","import error from './error';\n\nexport default function(p) {\n var path = [],\n q = null,\n b = 0,\n n = p.length,\n s = '',\n i, j, c;\n\n p = p + '';\n\n function push() {\n path.push(s + p.substring(i, j));\n s = '';\n i = j + 1;\n }\n\n for (i=j=0; j i) {\n push();\n } else {\n i = j + 1;\n }\n } else if (c === '[') {\n if (j > i) push();\n b = i = j + 1;\n } else if (c === ']') {\n if (!b) error('Access path missing open bracket: ' + p);\n if (b > 0) push();\n b = 0;\n i = j + 1;\n }\n }\n\n if (b) error('Access path missing closing bracket: ' + p);\n if (q) error('Access path missing closing quote: ' + p);\n\n if (j > i) {\n j++;\n push();\n }\n\n return path;\n}\n","export default Array.isArray;\n","export default function(_) {\n return _ === Object(_);\n}\n","export default function(_) {\n return typeof _ === 'string';\n}\n","import isArray from './isArray';\nimport isObject from './isObject';\nimport isString from './isString';\n\nexport default function $(x) {\n return isArray(x) ? '[' + x.map($) + ']'\n : isObject(x) || isString(x) ?\n // Output valid JSON and JS source strings.\n // See http://timelessrepo.com/json-isnt-a-javascript-subset\n JSON.stringify(x).replace('\\u2028','\\\\u2028').replace('\\u2029', '\\\\u2029')\n : x;\n}\n","import accessor from './accessor';\nimport splitAccessPath from './splitAccessPath';\nimport stringValue from './stringValue';\n\nexport default function(field, name) {\n var path = splitAccessPath(field),\n code = 'return _[' + path.map(stringValue).join('][') + '];';\n\n return accessor(\n Function('_', code),\n [(field = path.length===1 ? path[0] : field)],\n name || field\n );\n}\n","import accessor from './accessor';\nimport field from './field';\n\nvar empty = [];\n\nexport var id = field('id');\n\nexport var identity = accessor(function(_) { return _; }, empty, 'identity');\n\nexport var zero = accessor(function() { return 0; }, empty, 'zero');\n\nexport var one = accessor(function() { return 1; }, empty, 'one');\n\nexport var truthy = accessor(function() { return true; }, empty, 'true');\n\nexport var falsy = accessor(function() { return false; }, empty, 'false');\n","function log(method, level, input) {\n var args = [level].concat([].slice.call(input));\n console[method].apply(console, args); // eslint-disable-line no-console\n}\n\nexport var None = 0;\nexport var Error = 1;\nexport var Warn = 2;\nexport var Info = 3;\nexport var Debug = 4;\n\nexport default function(_) {\n var level = _ || None;\n return {\n level: function(_) {\n if (arguments.length) {\n level = +_;\n return this;\n } else {\n return level;\n }\n },\n error: function() {\n if (level >= Error) log('error', 'ERROR', arguments);\n return this;\n },\n warn: function() {\n if (level >= Warn) log('warn', 'WARN', arguments);\n return this;\n },\n info: function() {\n if (level >= Info) log('log', 'INFO', arguments);\n return this;\n },\n debug: function() {\n if (level >= Debug) log('log', 'DEBUG', arguments);\n return this;\n }\n }\n}\n","export default function(_) {\n return typeof _ === 'boolean';\n}\n","export default function(_) {\n return typeof _ === 'number';\n}\n","export default function(_) {\n for (var s={}, i=0, n=_.length; i= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","var at, // The index of the current character\n ch, // The current character\n escapee = {\n '\"': '\"',\n '\\\\': '\\\\',\n '/': '/',\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t'\n },\n text,\n\n error = function (m) {\n // Call error when something is wrong.\n throw {\n name: 'SyntaxError',\n message: m,\n at: at,\n text: text\n };\n },\n \n next = function (c) {\n // If a c parameter is provided, verify that it matches the current character.\n if (c && c !== ch) {\n error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n }\n \n // Get the next character. When there are no more characters,\n // return the empty string.\n \n ch = text.charAt(at);\n at += 1;\n return ch;\n },\n \n number = function () {\n // Parse a number value.\n var number,\n string = '';\n \n if (ch === '-') {\n string = '-';\n next('-');\n }\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n if (ch === '.') {\n string += '.';\n while (next() && ch >= '0' && ch <= '9') {\n string += ch;\n }\n }\n if (ch === 'e' || ch === 'E') {\n string += ch;\n next();\n if (ch === '-' || ch === '+') {\n string += ch;\n next();\n }\n while (ch >= '0' && ch <= '9') {\n string += ch;\n next();\n }\n }\n number = +string;\n if (!isFinite(number)) {\n error(\"Bad number\");\n } else {\n return number;\n }\n },\n \n string = function () {\n // Parse a string value.\n var hex,\n i,\n string = '',\n uffff;\n \n // When parsing for string values, we must look for \" and \\ characters.\n if (ch === '\"') {\n while (next()) {\n if (ch === '\"') {\n next();\n return string;\n } else if (ch === '\\\\') {\n next();\n if (ch === 'u') {\n uffff = 0;\n for (i = 0; i < 4; i += 1) {\n hex = parseInt(next(), 16);\n if (!isFinite(hex)) {\n break;\n }\n uffff = uffff * 16 + hex;\n }\n string += String.fromCharCode(uffff);\n } else if (typeof escapee[ch] === 'string') {\n string += escapee[ch];\n } else {\n break;\n }\n } else {\n string += ch;\n }\n }\n }\n error(\"Bad string\");\n },\n\n white = function () {\n\n// Skip whitespace.\n\n while (ch && ch <= ' ') {\n next();\n }\n },\n\n word = function () {\n\n// true, false, or null.\n\n switch (ch) {\n case 't':\n next('t');\n next('r');\n next('u');\n next('e');\n return true;\n case 'f':\n next('f');\n next('a');\n next('l');\n next('s');\n next('e');\n return false;\n case 'n':\n next('n');\n next('u');\n next('l');\n next('l');\n return null;\n }\n error(\"Unexpected '\" + ch + \"'\");\n },\n\n value, // Place holder for the value function.\n\n array = function () {\n\n// Parse an array value.\n\n var array = [];\n\n if (ch === '[') {\n next('[');\n white();\n if (ch === ']') {\n next(']');\n return array; // empty array\n }\n while (ch) {\n array.push(value());\n white();\n if (ch === ']') {\n next(']');\n return array;\n }\n next(',');\n white();\n }\n }\n error(\"Bad array\");\n },\n\n object = function () {\n\n// Parse an object value.\n\n var key,\n object = {};\n\n if (ch === '{') {\n next('{');\n white();\n if (ch === '}') {\n next('}');\n return object; // empty object\n }\n while (ch) {\n key = string();\n white();\n next(':');\n if (Object.hasOwnProperty.call(object, key)) {\n error('Duplicate key \"' + key + '\"');\n }\n object[key] = value();\n white();\n if (ch === '}') {\n next('}');\n return object;\n }\n next(',');\n white();\n }\n }\n error(\"Bad object\");\n };\n\nvalue = function () {\n\n// Parse a JSON value. It could be an object, an array, a string, a number,\n// or a word.\n\n white();\n switch (ch) {\n case '{':\n return object();\n case '[':\n return array();\n case '\"':\n return string();\n case '-':\n return number();\n default:\n return ch >= '0' && ch <= '9' ? number() : word();\n }\n};\n\n// Return the json_parse function. It will have access to all of the above\n// functions and variables.\n\nmodule.exports = function (source, reviver) {\n var result;\n \n text = source;\n at = 0;\n ch = ' ';\n result = value();\n white();\n if (ch) {\n error(\"Syntax error\");\n }\n\n // If there is a reviver function, we recursively walk the new structure,\n // passing each name/value pair to the reviver function for possible\n // transformation, starting with a temporary root object that holds the result\n // in an empty key. If there is not a reviver function, we simply return the\n // result.\n\n return typeof reviver === 'function' ? (function walk(holder, key) {\n var k, v, value = holder[key];\n if (value && typeof value === 'object') {\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = walk(value, k);\n if (v !== undefined) {\n value[k] = v;\n } else {\n delete value[k];\n }\n }\n }\n }\n return reviver.call(holder, key, value);\n }({'': result}, '')) : result;\n};\n","var cx = /[\\u0000\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = { // table of character substitutions\n '\\b': '\\\\b',\n '\\t': '\\\\t',\n '\\n': '\\\\n',\n '\\f': '\\\\f',\n '\\r': '\\\\r',\n '\"' : '\\\\\"',\n '\\\\': '\\\\\\\\'\n },\n rep;\n\nfunction quote(string) {\n // If the string contains no control characters, no quote characters, and no\n // backslash characters, then we can safely slap some quotes around it.\n // Otherwise we must also replace the offending characters with safe escape\n // sequences.\n \n escapable.lastIndex = 0;\n return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n var c = meta[a];\n return typeof c === 'string' ? c :\n '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n }) + '\"' : '\"' + string + '\"';\n}\n\nfunction str(key, holder) {\n // Produce a string from holder[key].\n var i, // The loop counter.\n k, // The member key.\n v, // The member value.\n length,\n mind = gap,\n partial,\n value = holder[key];\n \n // If the value has a toJSON method, call it to obtain a replacement value.\n if (value && typeof value === 'object' &&\n typeof value.toJSON === 'function') {\n value = value.toJSON(key);\n }\n \n // If we were called with a replacer function, then call the replacer to\n // obtain a replacement value.\n if (typeof rep === 'function') {\n value = rep.call(holder, key, value);\n }\n \n // What happens next depends on the value's type.\n switch (typeof value) {\n case 'string':\n return quote(value);\n \n case 'number':\n // JSON numbers must be finite. Encode non-finite numbers as null.\n return isFinite(value) ? String(value) : 'null';\n \n case 'boolean':\n case 'null':\n // If the value is a boolean or null, convert it to a string. Note:\n // typeof null does not produce 'null'. The case is included here in\n // the remote chance that this gets fixed someday.\n return String(value);\n \n case 'object':\n if (!value) return 'null';\n gap += indent;\n partial = [];\n \n // Array.isArray\n if (Object.prototype.toString.apply(value) === '[object Array]') {\n length = value.length;\n for (i = 0; i < length; i += 1) {\n partial[i] = str(i, value) || 'null';\n }\n \n // Join all of the elements together, separated with commas, and\n // wrap them in brackets.\n v = partial.length === 0 ? '[]' : gap ?\n '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' :\n '[' + partial.join(',') + ']';\n gap = mind;\n return v;\n }\n \n // If the replacer is an array, use it to select the members to be\n // stringified.\n if (rep && typeof rep === 'object') {\n length = rep.length;\n for (i = 0; i < length; i += 1) {\n k = rep[i];\n if (typeof k === 'string') {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n else {\n // Otherwise, iterate through all of the keys in the object.\n for (k in value) {\n if (Object.prototype.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? ': ' : ':') + v);\n }\n }\n }\n }\n \n // Join all of the member texts together, separated with commas,\n // and wrap them in braces.\n\n v = partial.length === 0 ? '{}' : gap ?\n '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' :\n '{' + partial.join(',') + '}';\n gap = mind;\n return v;\n }\n}\n\nmodule.exports = function (value, replacer, space) {\n var i;\n gap = '';\n indent = '';\n \n // If the space parameter is a number, make an indent string containing that\n // many spaces.\n if (typeof space === 'number') {\n for (i = 0; i < space; i += 1) {\n indent += ' ';\n }\n }\n // If the space parameter is a string, it will be used as the indent string.\n else if (typeof space === 'string') {\n indent = space;\n }\n\n // If there is a replacer, it must be a function or an array.\n // Otherwise, throw an error.\n rep = replacer;\n if (replacer && typeof replacer !== 'function'\n && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) {\n throw new Error('JSON.stringify');\n }\n \n // Make a fake root object containing our value under the key of ''.\n // Return the result of stringifying the value.\n return str('', {'': value});\n};\n","exports.parse = require('./lib/parse');\nexports.stringify = require('./lib/stringify');\n","var json = typeof JSON !== 'undefined' ? JSON : require('jsonify');\n\nmodule.exports = function (obj, opts) {\n if (!opts) opts = {};\n if (typeof opts === 'function') opts = { cmp: opts };\n var space = opts.space || '';\n if (typeof space === 'number') space = Array(space+1).join(' ');\n var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;\n var replacer = opts.replacer || function(key, value) { return value; };\n\n var cmp = opts.cmp && (function (f) {\n return function (node) {\n return function (a, b) {\n var aobj = { key: a, value: node[a] };\n var bobj = { key: b, value: node[b] };\n return f(aobj, bobj);\n };\n };\n })(opts.cmp);\n\n var seen = [];\n return (function stringify (parent, key, node, level) {\n var indent = space ? ('\\n' + new Array(level + 1).join(space)) : '';\n var colonSeparator = space ? ': ' : ':';\n\n if (node && node.toJSON && typeof node.toJSON === 'function') {\n node = node.toJSON();\n }\n\n node = replacer.call(parent, key, node);\n\n if (node === undefined) {\n return;\n }\n if (typeof node !== 'object' || node === null) {\n return json.stringify(node);\n }\n if (isArray(node)) {\n var out = [];\n for (var i = 0; i < node.length; i++) {\n var item = stringify(node, i, node[i], level+1) || json.stringify(null);\n out.push(indent + space + item);\n }\n return '[' + out.join(',') + indent + ']';\n }\n else {\n if (seen.indexOf(node) !== -1) {\n if (cycles) return json.stringify('__cycle__');\n throw new TypeError('Converting circular structure to JSON');\n }\n else seen.push(node);\n\n var keys = objectKeys(node).sort(cmp && cmp(node));\n var out = [];\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = stringify(node, key, node[key], level+1);\n\n if(!value) continue;\n\n var keyValue = json.stringify(key)\n + colonSeparator\n + value;\n ;\n out.push(indent + space + keyValue);\n }\n seen.splice(seen.indexOf(node), 1);\n return '{' + out.join(',') + indent + '}';\n }\n })({ '': obj }, '', obj, 0);\n};\n\nvar isArray = Array.isArray || function (x) {\n return {}.toString.call(x) === '[object Array]';\n};\n\nvar objectKeys = Object.keys || function (obj) {\n var has = Object.prototype.hasOwnProperty || function () { return true };\n var keys = [];\n for (var key in obj) {\n if (has.call(obj, key)) keys.push(key);\n }\n return keys;\n};\n","export function isLogicalOr(op) {\n return !!op.or;\n}\nexport function isLogicalAnd(op) {\n return !!op.and;\n}\nexport function isLogicalNot(op) {\n return !!op.not;\n}\nexport function forEachLeaf(op, fn) {\n if (isLogicalNot(op)) {\n forEachLeaf(op.not, fn);\n }\n else if (isLogicalAnd(op)) {\n for (var _i = 0, _a = op.and; _i < _a.length; _i++) {\n var subop = _a[_i];\n forEachLeaf(subop, fn);\n }\n }\n else if (isLogicalOr(op)) {\n for (var _b = 0, _c = op.or; _b < _c.length; _b++) {\n var subop = _c[_b];\n forEachLeaf(subop, fn);\n }\n }\n else {\n fn(op);\n }\n}\nexport function normalizeLogicalOperand(op, normalizer) {\n if (isLogicalNot(op)) {\n return { not: normalizeLogicalOperand(op.not, normalizer) };\n }\n else if (isLogicalAnd(op)) {\n return { and: op.and.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) };\n }\n else if (isLogicalOr(op)) {\n return { or: op.or.map(function (o) { return normalizeLogicalOperand(o, normalizer); }) };\n }\n else {\n return normalizer(op);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sb2dpY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWNBLE1BQU0sc0JBQXNCLEVBQXVCO0lBQ2pELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQUVELE1BQU0sdUJBQXVCLEVBQXVCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sdUJBQXVCLEVBQXVCO0lBQ2xELE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sc0JBQXlCLEVBQXFCLEVBQUUsRUFBbUI7SUFDdkUsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDcEIsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDekI7U0FBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMzQixLQUFvQixVQUFNLEVBQU4sS0FBQSxFQUFFLENBQUMsR0FBRyxFQUFOLGNBQU0sRUFBTixJQUFNLEVBQUU7WUFBdkIsSUFBTSxLQUFLLFNBQUE7WUFDZCxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7U0FBTSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMxQixLQUFvQixVQUFLLEVBQUwsS0FBQSxFQUFFLENBQUMsRUFBRSxFQUFMLGNBQUssRUFBTCxJQUFLLEVBQUU7WUFBdEIsSUFBTSxLQUFLLFNBQUE7WUFDZCxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7U0FBTTtRQUNMLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNSO0FBQ0gsQ0FBQztBQUVELE1BQU0sa0NBQXFDLEVBQXFCLEVBQUUsVUFBdUI7SUFDdkYsSUFBSSxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDcEIsT0FBTyxFQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFDLENBQUM7S0FDM0Q7U0FBTSxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsdUJBQXVCLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUF0QyxDQUFzQyxDQUFDLEVBQUMsQ0FBQztLQUN2RTtTQUFNLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzFCLE9BQU8sRUFBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSx1QkFBdUIsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQXRDLENBQXNDLENBQUMsRUFBQyxDQUFDO0tBQ3JFO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBMb2dpY2FsT3BlcmFuZDxUPiA9IExvZ2ljYWxOb3Q8VD4gfCBMb2dpY2FsQW5kPFQ+IHwgTG9naWNhbE9yPFQ+IHwgVDtcblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY2FsT3I8VD4ge1xuICBvcjogTG9naWNhbE9wZXJhbmQ8VD5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb2dpY2FsQW5kPFQ+IHtcbiAgYW5kOiBMb2dpY2FsT3BlcmFuZDxUPltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2ljYWxOb3Q8VD4ge1xuICBub3Q6IExvZ2ljYWxPcGVyYW5kPFQ+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2dpY2FsT3Iob3A6IExvZ2ljYWxPcGVyYW5kPGFueT4pOiBvcCBpcyBMb2dpY2FsT3I8YW55PiB7XG4gIHJldHVybiAhIW9wLm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2dpY2FsQW5kKG9wOiBMb2dpY2FsT3BlcmFuZDxhbnk+KTogb3AgaXMgTG9naWNhbEFuZDxhbnk+IHtcbiAgcmV0dXJuICEhb3AuYW5kO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMb2dpY2FsTm90KG9wOiBMb2dpY2FsT3BlcmFuZDxhbnk+KTogb3AgaXMgTG9naWNhbE5vdDxhbnk+IHtcbiAgcmV0dXJuICEhb3Aubm90O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaExlYWY8VD4ob3A6IExvZ2ljYWxPcGVyYW5kPFQ+LCBmbjogKG9wOiBUKSA9PiB2b2lkKSB7XG4gIGlmIChpc0xvZ2ljYWxOb3Qob3ApKSB7XG4gICAgZm9yRWFjaExlYWYob3Aubm90LCBmbik7XG4gIH0gZWxzZSBpZiAoaXNMb2dpY2FsQW5kKG9wKSkge1xuICAgIGZvciAoY29uc3Qgc3Vib3Agb2Ygb3AuYW5kKSB7XG4gICAgICBmb3JFYWNoTGVhZihzdWJvcCwgZm4pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0xvZ2ljYWxPcihvcCkpIHtcbiAgICBmb3IgKGNvbnN0IHN1Ym9wIG9mIG9wLm9yKSB7XG4gICAgICBmb3JFYWNoTGVhZihzdWJvcCwgZm4pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmbihvcCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kPFQ+KG9wOiBMb2dpY2FsT3BlcmFuZDxUPiwgbm9ybWFsaXplcjogKG86IFQpID0+IFQpOiBMb2dpY2FsT3BlcmFuZDxUPiB7XG4gIGlmIChpc0xvZ2ljYWxOb3Qob3ApKSB7XG4gICAgcmV0dXJuIHtub3Q6IG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kKG9wLm5vdCwgbm9ybWFsaXplcil9O1xuICB9IGVsc2UgaWYgKGlzTG9naWNhbEFuZChvcCkpIHtcbiAgICByZXR1cm4ge2FuZDogb3AuYW5kLm1hcChvID0+IG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kKG8sIG5vcm1hbGl6ZXIpKX07XG4gIH0gZWxzZSBpZiAoaXNMb2dpY2FsT3Iob3ApKSB7XG4gICAgcmV0dXJuIHtvcjogb3Aub3IubWFwKG8gPT4gbm9ybWFsaXplTG9naWNhbE9wZXJhbmQobywgbm9ybWFsaXplcikpfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbm9ybWFsaXplcihvcCk7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport stableStringify from 'json-stable-stringify';\nimport { isArray, isNumber, isString, splitAccessPath, stringValue } from 'vega-util';\nimport { isLogicalAnd, isLogicalNot, isLogicalOr } from './logical';\n/**\n * Creates an object composed of the picked object properties.\n *\n * Example: (from lodash)\n *\n * var object = {'a': 1, 'b': '2', 'c': 3};\n * pick(object, ['a', 'c']);\n * // → {'a': 1, 'c': 3}\n *\n */\nexport function pick(obj, props) {\n var copy = {};\n for (var _i = 0, props_1 = props; _i < props_1.length; _i++) {\n var prop = props_1[_i];\n if (obj.hasOwnProperty(prop)) {\n copy[prop] = obj[prop];\n }\n }\n return copy;\n}\n/**\n * The opposite of _.pick; this method creates an object composed of the own\n * and inherited enumerable string keyed properties of object that are not omitted.\n */\nexport function omit(obj, props) {\n var copy = tslib_1.__assign({}, obj);\n for (var _i = 0, props_2 = props; _i < props_2.length; _i++) {\n var prop = props_2[_i];\n delete copy[prop];\n }\n return copy;\n}\n/**\n * Converts any object into a string representation that can be consumed by humans.\n */\nexport var stringify = stableStringify;\n/**\n * Converts any object into a string of limited size, or a number.\n */\nexport function hash(a) {\n if (isNumber(a)) {\n return a;\n }\n var str = isString(a) ? a : stableStringify(a);\n // short strings can be used as hash directly, longer strings are hashed to reduce memory usage\n if (str.length < 100) {\n return str;\n }\n // from http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/\n var h = 0;\n for (var i = 0; i < str.length; i++) {\n var char = str.charCodeAt(i);\n h = ((h << 5) - h) + char;\n h = h & h; // Convert to 32bit integer\n }\n return h;\n}\nexport function contains(array, item) {\n return array.indexOf(item) > -1;\n}\n/** Returns the array without the elements in item */\nexport function without(array, excludedItems) {\n return array.filter(function (item) { return !contains(excludedItems, item); });\n}\nexport function union(array, other) {\n return array.concat(without(other, array));\n}\n/**\n * Returns true if any item returns true.\n */\nexport function some(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (f(arr[k], k, i++)) {\n return true;\n }\n }\n return false;\n}\n/**\n * Returns true if all items return true.\n */\nexport function every(arr, f) {\n var i = 0;\n for (var k = 0; k < arr.length; k++) {\n if (!f(arr[k], k, i++)) {\n return false;\n }\n }\n return true;\n}\nexport function flatten(arrays) {\n return [].concat.apply([], arrays);\n}\n/**\n * recursively merges src into dest\n */\nexport function mergeDeep(dest) {\n var src = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n src[_i - 1] = arguments[_i];\n }\n for (var _a = 0, src_1 = src; _a < src_1.length; _a++) {\n var s = src_1[_a];\n dest = deepMerge_(dest, s);\n }\n return dest;\n}\n// recursively merges src into dest\nfunction deepMerge_(dest, src) {\n if (typeof src !== 'object' || src === null) {\n return dest;\n }\n for (var p in src) {\n if (!src.hasOwnProperty(p)) {\n continue;\n }\n if (src[p] === undefined) {\n continue;\n }\n if (typeof src[p] !== 'object' || isArray(src[p]) || src[p] === null) {\n dest[p] = src[p];\n }\n else if (typeof dest[p] !== 'object' || dest[p] === null) {\n dest[p] = mergeDeep(isArray(src[p].constructor) ? [] : {}, src[p]);\n }\n else {\n mergeDeep(dest[p], src[p]);\n }\n }\n return dest;\n}\nexport function unique(values, f) {\n var results = [];\n var u = {};\n var v;\n for (var _i = 0, values_1 = values; _i < values_1.length; _i++) {\n var val = values_1[_i];\n v = f(val);\n if (v in u) {\n continue;\n }\n u[v] = 1;\n results.push(val);\n }\n return results;\n}\n/**\n * Returns true if the two dictionaries disagree. Applies only to defined values.\n */\nexport function differ(dict, other) {\n for (var key in dict) {\n if (dict.hasOwnProperty(key)) {\n if (other[key] && dict[key] && other[key] !== dict[key]) {\n return true;\n }\n }\n }\n return false;\n}\nexport function hasIntersection(a, b) {\n for (var key in a) {\n if (key in b) {\n return true;\n }\n }\n return false;\n}\nexport function isNumeric(num) {\n return !isNaN(num);\n}\nexport function differArray(array, other) {\n if (array.length !== other.length) {\n return true;\n }\n array.sort();\n other.sort();\n for (var i = 0; i < array.length; i++) {\n if (other[i] !== array[i]) {\n return true;\n }\n }\n return false;\n}\n// This is a stricter version of Object.keys but with better types. See https://github.com/Microsoft/TypeScript/pull/12253#issuecomment-263132208\nexport var keys = Object.keys;\nexport function vals(x) {\n var _vals = [];\n for (var k in x) {\n if (x.hasOwnProperty(k)) {\n _vals.push(x[k]);\n }\n }\n return _vals;\n}\nexport function flagKeys(f) {\n return keys(f);\n}\nexport function duplicate(obj) {\n return JSON.parse(JSON.stringify(obj));\n}\nexport function isBoolean(b) {\n return b === true || b === false;\n}\n/**\n * Convert a string into a valid variable name\n */\nexport function varName(s) {\n // Replace non-alphanumeric characters (anything besides a-zA-Z0-9_) with _\n var alphanumericS = s.replace(/\\W/g, '_');\n // Add _ if the string has leading numbers.\n return (s.match(/^\\d+/) ? '_' : '') + alphanumericS;\n}\nexport function logicalExpr(op, cb) {\n if (isLogicalNot(op)) {\n return '!(' + logicalExpr(op.not, cb) + ')';\n }\n else if (isLogicalAnd(op)) {\n return '(' + op.and.map(function (and) { return logicalExpr(and, cb); }).join(') && (') + ')';\n }\n else if (isLogicalOr(op)) {\n return '(' + op.or.map(function (or) { return logicalExpr(or, cb); }).join(') || (') + ')';\n }\n else {\n return cb(op);\n }\n}\n/**\n * Delete nested property of an object, and delete the ancestors of the property if they become empty.\n */\nexport function deleteNestedProperty(obj, orderedProps) {\n if (orderedProps.length === 0) {\n return true;\n }\n var prop = orderedProps.shift();\n if (deleteNestedProperty(obj[prop], orderedProps)) {\n delete obj[prop];\n }\n return Object.keys(obj).length === 0;\n}\nexport function titlecase(s) {\n return s.charAt(0).toUpperCase() + s.substr(1);\n}\n/**\n * Converts a path to an access path with datum.\n * @param path The field name.\n * @param datum The string to use for `datum`.\n */\nexport function accessPathWithDatum(path, datum) {\n if (datum === void 0) { datum = 'datum'; }\n var pieces = splitAccessPath(path);\n var prefixes = [];\n for (var i = 1; i <= pieces.length; i++) {\n var prefix = \"[\" + pieces.slice(0, i).map(stringValue).join('][') + \"]\";\n prefixes.push(\"\" + datum + prefix);\n }\n return prefixes.join(' && ');\n}\n/**\n * Return access with datum to the falttened field.\n * @param path The field name.\n * @param datum The string to use for `datum`.\n */\nexport function flatAccessWithDatum(path, datum) {\n if (datum === void 0) { datum = 'datum'; }\n return datum + \"[\" + stringValue(splitAccessPath(path).join('.')) + \"]\";\n}\n/**\n * Replaces path accesses with access to non-nested field.\n * For example, `foo[\"bar\"].baz` becomes `foo\\\\.bar\\\\.baz`.\n */\nexport function replacePathInField(path) {\n return \"\" + splitAccessPath(path).map(function (p) { return p.replace('.', '\\\\.'); }).join('\\\\.');\n}\n/**\n * Remove path accesses with access from field.\n * For example, `foo[\"bar\"].baz` becomes `foo.bar.baz`.\n */\nexport function removePathFromField(path) {\n return \"\" + splitAccessPath(path).join('.');\n}\n/**\n * Count the depth of the path. Returns 1 for fields that are not nested.\n */\nexport function accessPathDepth(path) {\n if (!path) {\n return 0;\n }\n return splitAccessPath(path).length;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLGVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNwRixPQUFPLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQWlCLE1BQU0sV0FBVyxDQUFDO0FBRWxGOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sZUFBZSxHQUFXLEVBQUUsS0FBZTtJQUMvQyxJQUFNLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBbUIsVUFBSyxFQUFMLGVBQUssRUFBTCxtQkFBSyxFQUFMLElBQUssRUFBRTtRQUFyQixJQUFNLElBQUksY0FBQTtRQUNiLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBVyxFQUFFLEtBQWU7SUFDL0MsSUFBTSxJQUFJLHdCQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ3RCLEtBQW1CLFVBQUssRUFBTCxlQUFLLEVBQUwsbUJBQUssRUFBTCxJQUFLLEVBQUU7UUFBckIsSUFBTSxJQUFJLGNBQUE7UUFDYixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNuQjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLElBQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQztBQUV6Qzs7R0FFRztBQUNILE1BQU0sZUFBZSxDQUFNO0lBQ3pCLElBQUksUUFBUSxDQUFD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S0FDcEM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLDhCQUE4QixJQUFZLEVBQUUsS0FBYTtJQUFiLHNCQUFBLEVBQUEsZUFBYTtJQUM3RCxPQUFVLEtBQUssU0FBSSxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFHLENBQUM7QUFDckUsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sNkJBQTZCLElBQVk7SUFDN0MsT0FBTyxLQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUcsQ0FBQztBQUNoRixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSw4QkFBOEIsSUFBWTtJQUM5QyxPQUFPLEtBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUcsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLDBCQUEwQixJQUFZO0lBQzFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDVCxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3RhYmxlU3RyaW5naWZ5IGZyb20gJ2pzb24tc3RhYmxlLXN0cmluZ2lmeSc7XG5pbXBvcnQge2lzQXJyYXksIGlzTnVtYmVyLCBpc1N0cmluZywgc3BsaXRBY2Nlc3NQYXRoLCBzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7aXNMb2dpY2FsQW5kLCBpc0xvZ2ljYWxOb3QsIGlzTG9naWNhbE9yLCBMb2dpY2FsT3BlcmFuZH0gZnJvbSAnLi9sb2dpY2FsJztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgcGlja2VkIG9iamVjdCBwcm9wZXJ0aWVzLlxuICpcbiAqIEV4YW1wbGU6ICAoZnJvbSBsb2Rhc2gpXG4gKlxuICogdmFyIG9iamVjdCA9IHsnYSc6IDEsICdiJzogJzInLCAnYyc6IDN9O1xuICogcGljayhvYmplY3QsIFsnYScsICdjJ10pO1xuICogLy8g4oaSIHsnYSc6IDEsICdjJzogM31cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaWNrKG9iajogb2JqZWN0LCBwcm9wczogc3RyaW5nW10pIHtcbiAgY29uc3QgY29weSA9IHt9O1xuICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcHMpIHtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICBjb3B5W3Byb3BdID0gb2JqW3Byb3BdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29weTtcbn1cblxuLyoqXG4gKiBUaGUgb3Bwb3NpdGUgb2YgXy5waWNrOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiB0aGUgb3duXG4gKiBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygb2JqZWN0IHRoYXQgYXJlIG5vdCBvbWl0dGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb21pdChvYmo6IG9iamVjdCwgcHJvcHM6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IGNvcHkgPSB7Li4ub2JqfTtcbiAgZm9yIChjb25zdCBwcm9wIG9mIHByb3BzKSB7XG4gICAgZGVsZXRlIGNvcHlbcHJvcF07XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW55IG9iamVjdCBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRoYXQgY2FuIGJlIGNvbnN1bWVkIGJ5IGh1bWFucy5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmluZ2lmeSA9IHN0YWJsZVN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbnkgb2JqZWN0IGludG8gYSBzdHJpbmcgb2YgbGltaXRlZCBzaXplLCBvciBhIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2goYTogYW55KSB7XG4gIGlmIChpc051bWJlcihhKSkge1xuICAgIHJldHVybiBhO1xuICB9XG5cbiAgY29uc3Qgc3RyID0gaXNTdHJpbmcoYSkgPyBhIDogc3RhYmxlU3RyaW5naWZ5KGEpO1xuXG4gIC8vIHNob3J0IHN0cmluZ3MgY2FuIGJlIHVzZWQgYXMgaGFzaCBkaXJlY3RseSwgbG9uZ2VyIHN0cmluZ3MgYXJlIGhhc2hlZCB0byByZWR1Y2UgbWVtb3J5IHVzYWdlXG4gIGlmIChzdHIubGVuZ3RoIDwgMTAwKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIC8vIGZyb20gaHR0cDovL3dlcnhsdGQuY29tL3dwLzIwMTAvMDUvMTMvamF2YXNjcmlwdC1pbXBsZW1lbnRhdGlvbi1vZi1qYXZhcy1zdHJpbmctaGFzaGNvZGUtbWV0aG9kL1xuICBsZXQgaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGggPSAoKGg8PDUpLWgpK2NoYXI7XG4gICAgaCA9IGggJiBoOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zPFQ+KGFycmF5OiBUW10sIGl0ZW06IFQpIHtcbiAgcmV0dXJuIGFycmF5LmluZGV4T2YoaXRlbSkgPiAtMTtcbn1cblxuLyoqIFJldHVybnMgdGhlIGFycmF5IHdpdGhvdXQgdGhlIGVsZW1lbnRzIGluIGl0ZW0gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0PFQ+KGFycmF5OiBUW10sIGV4Y2x1ZGVkSXRlbXM6IFRbXSkge1xuICByZXR1cm4gYXJyYXkuZmlsdGVyKGl0ZW0gPT4gIWNvbnRhaW5zKGV4Y2x1ZGVkSXRlbXMsIGl0ZW0pKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uPFQ+KGFycmF5OiBUW10sIG90aGVyOiBUW10pIHtcbiAgcmV0dXJuIGFycmF5LmNvbmNhdCh3aXRob3V0KG90aGVyLCBhcnJheSkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiBhbnkgaXRlbSByZXR1cm5zIHRydWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb21lPFQ+KGFycjogVFtdLCBmOiAoZDogVCwgaz86IGFueSwgaT86IGFueSkgPT4gYm9vbGVhbikge1xuICBsZXQgaSA9IDA7XG4gIGZvciAobGV0IGsgPSAwOyBrPGFyci5sZW5ndGg7IGsrKykge1xuICAgIGlmIChmKGFycltrXSwgaywgaSsrKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgYWxsIGl0ZW1zIHJldHVybiB0cnVlLlxuICovXG4gZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5PFQ+KGFycjogVFtdLCBmOiAoZDogVCwgaz86IGFueSwgaT86IGFueSkgPT4gYm9vbGVhbikge1xuICBsZXQgaSA9IDA7XG4gIGZvciAobGV0IGsgPSAwOyBrPGFyci5sZW5ndGg7IGsrKykge1xuICAgIGlmICghZihhcnJba10sIGssIGkrKykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKGFycmF5czogYW55W10pIHtcbiAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgYXJyYXlzKTtcbn1cblxuLyoqXG4gKiByZWN1cnNpdmVseSBtZXJnZXMgc3JjIGludG8gZGVzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VEZWVwPFQ+KGRlc3Q6IFQsIC4uLnNyYzogUGFydGlhbDxUPltdKTogVCB7XG4gIGZvciAoY29uc3QgcyBvZiBzcmMpIHtcbiAgICBkZXN0ID0gZGVlcE1lcmdlXyhkZXN0LCBzKTtcbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuLy8gcmVjdXJzaXZlbHkgbWVyZ2VzIHNyYyBpbnRvIGRlc3RcbmZ1bmN0aW9uIGRlZXBNZXJnZV8oZGVzdDogYW55LCBzcmM6IGFueSkge1xuICBpZiAodHlwZW9mIHNyYyAhPT0gJ29iamVjdCcgfHwgc3JjID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRlc3Q7XG4gIH1cblxuICBmb3IgKGNvbnN0IHAgaW4gc3JjKSB7XG4gICAgaWYgKCFzcmMuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc3JjW3BdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNyY1twXSAhPT0gJ29iamVjdCcgfHwgaXNBcnJheShzcmNbcF0pIHx8IHNyY1twXSA9PT0gbnVsbCkge1xuICAgICAgZGVzdFtwXSA9IHNyY1twXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZXN0W3BdICE9PSAnb2JqZWN0JyB8fCBkZXN0W3BdID09PSBudWxsKSB7XG4gICAgICBkZXN0W3BdID0gbWVyZ2VEZWVwKGlzQXJyYXkoc3JjW3BdLmNvbnN0cnVjdG9yKSA/IFtdIDoge30sIHNyY1twXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlRGVlcChkZXN0W3BdLCBzcmNbcF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVzdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZTxUPih2YWx1ZXM6IFRbXSwgZjogKGl0ZW06IFQpID0+IHN0cmluZyB8IG51bWJlcik6IFRbXSB7XG4gIGNvbnN0IHJlc3VsdHM6IGFueVtdID0gW107XG4gIGNvbnN0IHUgPSB7fTtcbiAgbGV0IHY6IHN0cmluZyB8IG51bWJlcjtcbiAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKSB7XG4gICAgdiA9IGYodmFsKTtcbiAgICBpZiAodiBpbiB1KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdVt2XSA9IDE7XG4gICAgcmVzdWx0cy5wdXNoKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGljdDxUPiB7XG4gIFtrZXk6IHN0cmluZ106IFQ7XG59XG5cbmV4cG9ydCB0eXBlIFN0cmluZ1NldCA9IERpY3Q8dHJ1ZT47XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gZGljdGlvbmFyaWVzIGRpc2FncmVlLiBBcHBsaWVzIG9ubHkgdG8gZGVmaW5lZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXI8VD4oZGljdDogRGljdDxUPiwgb3RoZXI6IERpY3Q8VD4pIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gZGljdCkge1xuICAgIGlmIChkaWN0Lmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIGlmIChvdGhlcltrZXldICYmIGRpY3Rba2V5XSAmJiBvdGhlcltrZXldICE9PSBkaWN0W2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0ludGVyc2VjdGlvbihhOiBTdHJpbmdTZXQsIGI6IFN0cmluZ1NldCkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBhKSB7XG4gICAgaWYgKGtleSBpbiBiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOdW1lcmljKG51bTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIHJldHVybiAhaXNOYU4obnVtIGFzIGFueSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXJBcnJheTxUPihhcnJheTogVFtdLCBvdGhlcjogVFtdKSB7XG4gIGlmIChhcnJheS5sZW5ndGggIT09IG90aGVyLmxlbmd0aCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXJyYXkuc29ydCgpO1xuICBvdGhlci5zb3J0KCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChvdGhlcltpXSAhPT0gYXJyYXlbaV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gVGhpcyBpcyBhIHN0cmljdGVyIHZlcnNpb24gb2YgT2JqZWN0LmtleXMgYnV0IHdpdGggYmV0dGVyIHR5cGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L3B1bGwvMTIyNTMjaXNzdWVjb21tZW50LTI2MzEzMjIwOFxuZXhwb3J0IGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyBhcyA8VD4obzogVCkgPT4gKEV4dHJhY3Q8a2V5b2YgVCwgc3RyaW5nPilbXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHM8VD4oeDoge1trZXk6IHN0cmluZ106IFR9KTogVFtdIHtcbiAgY29uc3QgX3ZhbHM6IFRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGsgaW4geCkge1xuICAgIGlmICh4Lmhhc093blByb3BlcnR5KGspKSB7XG4gICAgICBfdmFscy5wdXNoKHhba10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gX3ZhbHM7XG59XG5cbi8vIFVzaW5nIG1hcHBlZCB0eXBlIHRvIGRlY2xhcmUgYSBjb2xsZWN0IG9mIGZsYWdzIGZvciBhIHN0cmluZyBsaXRlcmFsIHR5cGUgU1xuLy8gaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXNcbmV4cG9ydCB0eXBlIEZsYWc8UyBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtLIGluIFNdOiAxXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhZ0tleXM8UyBleHRlbmRzIHN0cmluZz4oZjogRmxhZzxTPik6IFNbXSB7XG4gIHJldHVybiBrZXlzKGYpIGFzIFNbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGR1cGxpY2F0ZTxUPihvYmo6IFQpOiBUIHtcbiAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jvb2xlYW4oYjogYW55KTogYiBpcyBib29sZWFuIHtcbiAgcmV0dXJuIGIgPT09IHRydWUgfHwgYiA9PT0gZmFsc2U7XG59XG5cbi8qKlxuICogQ29udmVydCBhIHN0cmluZyBpbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyTmFtZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyAoYW55dGhpbmcgYmVzaWRlcyBhLXpBLVowLTlfKSB3aXRoIF9cbiAgY29uc3QgYWxwaGFudW1lcmljUyA9IHMucmVwbGFjZSgvXFxXL2csICdfJyk7XG5cbiAgLy8gQWRkIF8gaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBudW1iZXJzLlxuICByZXR1cm4gKHMubWF0Y2goL15cXGQrLykgPyAnXycgOiAnJykgKyBhbHBoYW51bWVyaWNTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9naWNhbEV4cHI8VD4ob3A6IExvZ2ljYWxPcGVyYW5kPFQ+LCBjYjogRnVuY3Rpb24pOiBzdHJpbmcge1xuICBpZiAoaXNMb2dpY2FsTm90KG9wKSkge1xuICAgIHJldHVybiAnISgnICsgbG9naWNhbEV4cHIob3Aubm90LCBjYikgKyAnKSc7XG4gIH0gZWxzZSBpZiAoaXNMb2dpY2FsQW5kKG9wKSkge1xuICAgIHJldHVybiAnKCcgKyBvcC5hbmQubWFwKChhbmQ6IExvZ2ljYWxPcGVyYW5kPFQ+KSA9PiBsb2dpY2FsRXhwcihhbmQsIGNiKSkuam9pbignKSAmJiAoJykgKyAnKSc7XG4gIH0gZWxzZSBpZiAoaXNMb2dpY2FsT3Iob3ApKSB7XG4gICAgcmV0dXJuICcoJyArIG9wLm9yLm1hcCgob3I6IExvZ2ljYWxPcGVyYW5kPFQ+KSA9PiBsb2dpY2FsRXhwcihvciwgY2IpKS5qb2luKCcpIHx8ICgnKSArICcpJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2Iob3ApO1xuICB9XG59XG5cbi8vIE9taXQgZnJvbSBodHRwOi8vaWRlYXNpbnRvc29mdHdhcmUuY29tL3R5cGVzY3JpcHQtYWR2YW5jZWQtdHJpY2tzL1xuZXhwb3J0IHR5cGUgRGlmZjxUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBVIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPiA9ICh7W1AgaW4gVF06IFAgfSAmIHtbUCBpbiBVXTogbmV2ZXIgfSAmIHsgW3g6IHN0cmluZ106IG5ldmVyIH0pW1RdO1xuZXhwb3J0IHR5cGUgT21pdDxULCBLIGV4dGVuZHMga2V5b2YgVD4gPSB7W1AgaW4gRGlmZjxrZXlvZiBULCBLPl06IFRbUF19O1xuXG4vKipcbiAqIERlbGV0ZSBuZXN0ZWQgcHJvcGVydHkgb2YgYW4gb2JqZWN0LCBhbmQgZGVsZXRlIHRoZSBhbmNlc3RvcnMgb2YgdGhlIHByb3BlcnR5IGlmIHRoZXkgYmVjb21lIGVtcHR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlTmVzdGVkUHJvcGVydHkob2JqOiBhbnksIG9yZGVyZWRQcm9wczogc3RyaW5nW10pIHtcbiAgaWYgKG9yZGVyZWRQcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBwcm9wID0gb3JkZXJlZFByb3BzLnNoaWZ0KCk7XG4gIGlmIChkZWxldGVOZXN0ZWRQcm9wZXJ0eShvYmpbcHJvcF0sIG9yZGVyZWRQcm9wcykpIHtcbiAgICBkZWxldGUgb2JqW3Byb3BdO1xuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmopLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpdGxlY2FzZShzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzLnN1YnN0cigxKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHBhdGggdG8gYW4gYWNjZXNzIHBhdGggd2l0aCBkYXR1bS5cbiAqIEBwYXJhbSBwYXRoIFRoZSBmaWVsZCBuYW1lLlxuICogQHBhcmFtIGRhdHVtIFRoZSBzdHJpbmcgdG8gdXNlIGZvciBgZGF0dW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWNjZXNzUGF0aFdpdGhEYXR1bShwYXRoOiBzdHJpbmcsIGRhdHVtPSdkYXR1bScpIHtcbiAgY29uc3QgcGllY2VzID0gc3BsaXRBY2Nlc3NQYXRoKHBhdGgpO1xuICBjb25zdCBwcmVmaXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSBwaWVjZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwcmVmaXggPSBgWyR7cGllY2VzLnNsaWNlKDAsaSkubWFwKHN0cmluZ1ZhbHVlKS5qb2luKCddWycpfV1gO1xuICAgIHByZWZpeGVzLnB1c2goYCR7ZGF0dW19JHtwcmVmaXh9YCk7XG4gIH1cbiAgcmV0dXJuIHByZWZpeGVzLmpvaW4oJyAmJiAnKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYWNjZXNzIHdpdGggZGF0dW0gdG8gdGhlIGZhbHR0ZW5lZCBmaWVsZC5cbiAqIEBwYXJhbSBwYXRoIFRoZSBmaWVsZCBuYW1lLlxuICogQHBhcmFtIGRhdHVtIFRoZSBzdHJpbmcgdG8gdXNlIGZvciBgZGF0dW1gLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmxhdEFjY2Vzc1dpdGhEYXR1bShwYXRoOiBzdHJpbmcsIGRhdHVtPSdkYXR1bScpIHtcbiAgcmV0dXJuIGAke2RhdHVtfVske3N0cmluZ1ZhbHVlKHNwbGl0QWNjZXNzUGF0aChwYXRoKS5qb2luKCcuJykpfV1gO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHBhdGggYWNjZXNzZXMgd2l0aCBhY2Nlc3MgdG8gbm9uLW5lc3RlZCBmaWVsZC5cbiAqIEZvciBleGFtcGxlLCBgZm9vW1wiYmFyXCJdLmJhemAgYmVjb21lcyBgZm9vXFxcXC5iYXJcXFxcLmJhemAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUGF0aEluRmllbGQocGF0aDogc3RyaW5nKSB7XG4gIHJldHVybiBgJHtzcGxpdEFjY2Vzc1BhdGgocGF0aCkubWFwKHAgPT4gcC5yZXBsYWNlKCcuJywgJ1xcXFwuJykpLmpvaW4oJ1xcXFwuJyl9YDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgcGF0aCBhY2Nlc3NlcyB3aXRoIGFjY2VzcyBmcm9tIGZpZWxkLlxuICogRm9yIGV4YW1wbGUsIGBmb29bXCJiYXJcIl0uYmF6YCBiZWNvbWVzIGBmb28uYmFyLmJhemAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXRoRnJvbUZpZWxkKHBhdGg6IHN0cmluZykge1xuICByZXR1cm4gYCR7c3BsaXRBY2Nlc3NQYXRoKHBhdGgpLmpvaW4oJy4nKX1gO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBkZXB0aCBvZiB0aGUgcGF0aC4gUmV0dXJucyAxIGZvciBmaWVsZHMgdGhhdCBhcmUgbm90IG5lc3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFjY2Vzc1BhdGhEZXB0aChwYXRoOiBzdHJpbmcpIHtcbiAgaWYgKCFwYXRoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIHNwbGl0QWNjZXNzUGF0aChwYXRoKS5sZW5ndGg7XG59XG4iXX0=","import { toSet } from 'vega-util';\nimport { contains, flagKeys } from './util';\nvar AGGREGATE_OP_INDEX = {\n argmax: 1,\n argmin: 1,\n average: 1,\n count: 1,\n distinct: 1,\n max: 1,\n mean: 1,\n median: 1,\n min: 1,\n missing: 1,\n q1: 1,\n q3: 1,\n ci0: 1,\n ci1: 1,\n stderr: 1,\n stdev: 1,\n stdevp: 1,\n sum: 1,\n valid: 1,\n values: 1,\n variance: 1,\n variancep: 1,\n};\nexport var AGGREGATE_OPS = flagKeys(AGGREGATE_OP_INDEX);\nexport function isAggregateOp(a) {\n return !!AGGREGATE_OP_INDEX[a];\n}\nexport var COUNTING_OPS = ['count', 'valid', 'missing', 'distinct'];\nexport function isCountingAggregateOp(aggregate) {\n return aggregate && contains(COUNTING_OPS, aggregate);\n}\n/** Additive-based aggregation operations. These can be applied to stack. */\nexport var SUM_OPS = [\n 'count',\n 'sum',\n 'distinct',\n 'valid',\n 'missing'\n];\n/**\n * Aggregation operators that always produce values within the range [domainMin, domainMax].\n */\nexport var SHARED_DOMAIN_OPS = [\n 'mean',\n 'average',\n 'median',\n 'q1',\n 'q3',\n 'min',\n 'max',\n];\nexport var SHARED_DOMAIN_OP_INDEX = toSet(SHARED_DOMAIN_OPS);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZ3JlZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxRQUFRLEVBQVEsUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRWhELElBQU0sa0JBQWtCLEdBQXNCO0lBQzVDLE1BQU0sRUFBRSxDQUFDO0lBQ1QsTUFBTSxFQUFFLENBQUM7SUFDVCxPQUFPLEVBQUUsQ0FBQztJQUNWLEtBQUssRUFBRSxDQUFDO0lBQ1IsUUFBUSxFQUFFLENBQUM7SUFDWCxHQUFHLEVBQUUsQ0FBQztJQUNOLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxHQUFHLEVBQUUsQ0FBQztJQUNOLE9BQU8sRUFBRSxDQUFDO0lBQ1YsRUFBRSxFQUFFLENBQUM7SUFDTCxFQUFFLEVBQUUsQ0FBQztJQUNMLEdBQUcsRUFBRSxDQUFDO0lBQ04sR0FBRyxFQUFFLENBQUM7SUFDTixNQUFNLEVBQUUsQ0FBQztJQUNULEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxHQUFHLEVBQUUsQ0FBQztJQUNOLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxRQUFRLEVBQUUsQ0FBQztJQUNYLFNBQVMsRUFBRSxDQUFDO0NBQ2IsQ0FBQztBQUVGLE1BQU0sQ0FBQyxJQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUUxRCxNQUFNLHdCQUF3QixDQUFTO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLENBQUMsSUFBTSxZQUFZLEdBQWtCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFFckYsTUFBTSxnQ0FBZ0MsU0FBaUI7SUFDckQsT0FBTyxTQUFTLElBQUksUUFBUSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxJQUFNLE9BQU8sR0FBa0I7SUFDbEMsT0FBTztJQUNQLEtBQUs7SUFDTCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7Q0FDWixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLENBQUMsSUFBTSxpQkFBaUIsR0FBa0I7SUFDNUMsTUFBTTtJQUNOLFNBQVM7SUFDVCxRQUFRO0lBQ1IsSUFBSTtJQUNKLElBQUk7SUFDSixLQUFLO0lBQ0wsS0FBSztDQUNSLENBQUM7QUFFRixNQUFNLENBQUMsSUFBTSxzQkFBc0IsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHt0b1NldH0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Y29udGFpbnMsIEZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBBR0dSRUdBVEVfT1BfSU5ERVg6IEZsYWc8QWdncmVnYXRlT3A+ID0ge1xuICBhcmdtYXg6IDEsXG4gIGFyZ21pbjogMSxcbiAgYXZlcmFnZTogMSxcbiAgY291bnQ6IDEsXG4gIGRpc3RpbmN0OiAxLFxuICBtYXg6IDEsXG4gIG1lYW46IDEsXG4gIG1lZGlhbjogMSxcbiAgbWluOiAxLFxuICBtaXNzaW5nOiAxLFxuICBxMTogMSxcbiAgcTM6IDEsXG4gIGNpMDogMSxcbiAgY2kxOiAxLFxuICBzdGRlcnI6IDEsXG4gIHN0ZGV2OiAxLFxuICBzdGRldnA6IDEsXG4gIHN1bTogMSxcbiAgdmFsaWQ6IDEsXG4gIHZhbHVlczogMSxcbiAgdmFyaWFuY2U6IDEsXG4gIHZhcmlhbmNlcDogMSxcbn07XG5cbmV4cG9ydCBjb25zdCBBR0dSRUdBVEVfT1BTID0gZmxhZ0tleXMoQUdHUkVHQVRFX09QX0lOREVYKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWdncmVnYXRlT3AoYTogc3RyaW5nKTogYSBpcyBBZ2dyZWdhdGVPcCB7XG4gIHJldHVybiAhIUFHR1JFR0FURV9PUF9JTkRFWFthXTtcbn1cblxuZXhwb3J0IGNvbnN0IENPVU5USU5HX09QUzogQWdncmVnYXRlT3BbXSA9IFsnY291bnQnLCAndmFsaWQnLCAnbWlzc2luZycsICdkaXN0aW5jdCddO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudGluZ0FnZ3JlZ2F0ZU9wKGFnZ3JlZ2F0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBhZ2dyZWdhdGUgJiYgY29udGFpbnMoQ09VTlRJTkdfT1BTLCBhZ2dyZWdhdGUpO1xufVxuXG4vKiogQWRkaXRpdmUtYmFzZWQgYWdncmVnYXRpb24gb3BlcmF0aW9ucy4gIFRoZXNlIGNhbiBiZSBhcHBsaWVkIHRvIHN0YWNrLiAqL1xuZXhwb3J0IGNvbnN0IFNVTV9PUFM6IEFnZ3JlZ2F0ZU9wW10gPSBbXG4gICAgJ2NvdW50JyxcbiAgICAnc3VtJyxcbiAgICAnZGlzdGluY3QnLFxuICAgICd2YWxpZCcsXG4gICAgJ21pc3NpbmcnXG5dO1xuXG4vKipcbiAqIEFnZ3JlZ2F0aW9uIG9wZXJhdG9ycyB0aGF0IGFsd2F5cyBwcm9kdWNlIHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtkb21haW5NaW4sIGRvbWFpbk1heF0uXG4gKi9cbmV4cG9ydCBjb25zdCBTSEFSRURfRE9NQUlOX09QUzogQWdncmVnYXRlT3BbXSA9IFtcbiAgICAnbWVhbicsXG4gICAgJ2F2ZXJhZ2UnLFxuICAgICdtZWRpYW4nLFxuICAgICdxMScsXG4gICAgJ3EzJyxcbiAgICAnbWluJyxcbiAgICAnbWF4Jyxcbl07XG5cbmV4cG9ydCBjb25zdCBTSEFSRURfRE9NQUlOX09QX0lOREVYID0gdG9TZXQoU0hBUkVEX0RPTUFJTl9PUFMpO1xuIl19","import * as tslib_1 from \"tslib\";\nimport { flagKeys } from './util';\nexport var AXIS_PARTS = ['domain', 'grid', 'labels', 'ticks', 'title'];\n/**\n * A dictionary listing whether a certain axis property is applicable for only main axes or only grid axes.\n * (Properties not listed are applicable for both)\n */\nexport var AXIS_PROPERTY_TYPE = {\n grid: 'grid',\n gridScale: 'grid',\n domain: 'main',\n labels: 'main',\n labelFlush: 'main',\n labelOverlap: 'main',\n minExtent: 'main',\n maxExtent: 'main',\n offset: 'main',\n ticks: 'main',\n title: 'main',\n values: 'both',\n scale: 'both',\n zindex: 'both' // this is actually set afterward, so it doesn't matter\n};\nvar COMMON_AXIS_PROPERTIES_INDEX = {\n orient: 1,\n domain: 1,\n format: 1,\n grid: 1,\n labelBound: 1,\n labelFlush: 1,\n labelPadding: 1,\n labels: 1,\n labelOverlap: 1,\n maxExtent: 1,\n minExtent: 1,\n offset: 1,\n position: 1,\n tickCount: 1,\n ticks: 1,\n tickSize: 1,\n title: 1,\n titlePadding: 1,\n values: 1,\n zindex: 1,\n};\nvar AXIS_PROPERTIES_INDEX = tslib_1.__assign({}, COMMON_AXIS_PROPERTIES_INDEX, { encoding: 1, labelAngle: 1, titleMaxLength: 1 });\nvar VG_AXIS_PROPERTIES_INDEX = tslib_1.__assign({ scale: 1 }, COMMON_AXIS_PROPERTIES_INDEX, { gridScale: 1, encode: 1 });\nexport function isAxisProperty(prop) {\n return !!AXIS_PROPERTIES_INDEX[prop];\n}\nexport var VG_AXIS_PROPERTIES = flagKeys(VG_AXIS_PROPERTIES_INDEX);\n// Export for dependent projects\nexport var AXIS_PROPERTIES = flagKeys(AXIS_PROPERTIES_INDEX);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9heGlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQU8sUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBMkV0QyxNQUFNLENBQUMsSUFBTSxVQUFVLEdBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFJckY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLElBQU0sa0JBQWtCLEdBRzNCO0lBQ0YsSUFBSSxFQUFFLE1BQU07SUFDWixTQUFTLEVBQUUsTUFBTTtJQUVqQixNQUFNLEVBQUUsTUFBTTtJQUNkLE1BQU0sRUFBRSxNQUFNO0lBQ2QsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLE1BQU07SUFDcEIsU0FBUyxFQUFFLE1BQU07SUFDakIsU0FBUyxFQUFFLE1BQU07SUFDakIsTUFBTSxFQUFFLE1BQU07SUFDZCxLQUFLLEVBQUUsTUFBTTtJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsTUFBTSxFQUFFLE1BQU07SUFFZCxLQUFLLEVBQUUsTUFBTTtJQUNiLE1BQU0sRUFBRSxNQUFNLENBQUMsdURBQXVEO0NBQ3ZFLENBQUM7QUFrQ0YsSUFBTSw0QkFBNEIsR0FBZ0M7SUFDaEUsTUFBTSxFQUFFLENBQUM7SUFFVCxNQUFNLEVBQUUsQ0FBQztJQUNULE1BQU0sRUFBRSxDQUFDO0lBQ1QsSUFBSSxFQUFFLENBQUM7SUFDUCxVQUFVLEVBQUUsQ0FBQztJQUNiLFVBQVUsRUFBRSxDQUFDO0lBQ2IsWUFBWSxFQUFFLENBQUM7SUFDZixNQUFNLEVBQUUsQ0FBQztJQUNULFlBQVksRUFBRSxDQUFDO0lBQ2YsU0FBUyxFQUFFLENBQUM7SUFDWixTQUFTLEVBQUUsQ0FBQztJQUNaLE1BQU0sRUFBRSxDQUFDO0lBQ1QsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztJQUNaLEtBQUssRUFBRSxDQUFDO0lBQ1IsUUFBUSxFQUFFLENBQUM7SUFDWCxLQUFLLEVBQUUsQ0FBQztJQUNSLFlBQVksRUFBRSxDQUFDO0lBQ2YsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7QUFFRixJQUFNLHFCQUFxQix3QkFDdEIsNEJBQTRCLElBQy9CLFFBQVEsRUFBRSxDQUFDLEVBQ1gsVUFBVSxFQUFFLENBQUMsRUFDYixjQUFjLEVBQUUsQ0FBQyxHQUNsQixDQUFDO0FBRUYsSUFBTSx3QkFBd0Isc0JBQzVCLEtBQUssRUFBRSxDQUFDLElBQ0wsNEJBQTRCLElBQy9CLFNBQVMsRUFBRSxDQUFDLEVBQ1osTUFBTSxFQUFFLENBQUMsR0FDVixDQUFDO0FBRUYsTUFBTSx5QkFBeUIsSUFBWTtJQUN6QyxPQUFPLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sa0JBQWtCLEdBQUcsUUFBUSxDQUFDLHdCQUF3QixDQUFDLENBQUM7QUFFckUsZ0NBQWdDO0FBQ2hDLE1BQU0sQ0FBQyxJQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVRpbWV9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtHdWlkZSwgR3VpZGVFbmNvZGluZ0VudHJ5LCBWbE9ubHlHdWlkZUNvbmZpZ30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge0ZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtBeGlzT3JpZW50LCBWZ0F4aXMsIFZnQXhpc0Jhc2UsIFZnQXhpc0NvbmZpZ30gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIEF4aXNDb25maWcgZXh0ZW5kcyBWZ0F4aXNDb25maWcsIFZsT25seUd1aWRlQ29uZmlnIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXhpcyBleHRlbmRzIFZnQXhpc0Jhc2UsIEd1aWRlIHtcbiAgLyoqXG4gICAqIFRoZSBvcmllbnRhdGlvbiBvZiB0aGUgYXhpcy4gT25lIG9mIGBcInRvcFwiYCwgYFwiYm90dG9tXCJgLCBgXCJsZWZ0XCJgIG9yIGBcInJpZ2h0XCJgLiBUaGUgb3JpZW50YXRpb24gY2FuIGJlIHVzZWQgdG8gZnVydGhlciBzcGVjaWFsaXplIHRoZSBheGlzIHR5cGUgKGUuZy4sIGEgeSBheGlzIG9yaWVudGVkIGZvciB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgY2hhcnQpLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwiYm90dG9tXCJgIGZvciB4LWF4ZXMgYW5kIGBcImxlZnRcImAgZm9yIHktYXhlcy5cbiAgICovXG4gIG9yaWVudD86IEF4aXNPcmllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQsIGluIHBpeGVscywgYnkgd2hpY2ggdG8gZGlzcGxhY2UgdGhlIGF4aXMgZnJvbSB0aGUgZWRnZSBvZiB0aGUgZW5jbG9zaW5nIGdyb3VwIG9yIGRhdGEgcmVjdGFuZ2xlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gZGVyaXZlZCBmcm9tIHRoZSBbYXhpcyBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwjZmFjZXQtc2NhbGUtY29uZmlnKSdzIGBvZmZzZXRgIChgMGAgYnkgZGVmYXVsdClcbiAgICovXG4gIG9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGFuY2hvciBwb3NpdGlvbiBvZiB0aGUgYXhpcyBpbiBwaXhlbHMuIEZvciB4LWF4aXMgd2l0aCB0b3Agb3IgYm90dG9tIG9yaWVudGF0aW9uLCB0aGlzIHNldHMgdGhlIGF4aXMgZ3JvdXAgeCBjb29yZGluYXRlLiBGb3IgeS1heGlzIHdpdGggbGVmdCBvciByaWdodCBvcmllbnRhdGlvbiwgdGhpcyBzZXRzIHRoZSBheGlzIGdyb3VwIHkgY29vcmRpbmF0ZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGAwYFxuICAgKi9cbiAgcG9zaXRpb24/OiBudW1iZXI7XG5cblxuICAvKipcbiAgICogVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSBheGlzIGxhYmVscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAtOTBgIGZvciBub21pbmFsIGFuZCBvcmRpbmFsIGZpZWxkczsgYDBgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQG1pbmltdW0gLTM2MFxuICAgKiBAbWF4aW11bSAzNjBcbiAgICovXG4gIGxhYmVsQW5nbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgZGVzaXJlZCBudW1iZXIgb2YgdGlja3MsIGZvciBheGVzIHZpc3VhbGl6aW5nIHF1YW50aXRhdGl2ZSBzY2FsZXMuIFRoZSByZXN1bHRpbmcgbnVtYmVyIG1heSBiZSBkaWZmZXJlbnQgc28gdGhhdCB2YWx1ZXMgYXJlIFwibmljZVwiIChtdWx0aXBsZXMgb2YgMiwgNSwgMTApIGFuZCBsaWUgd2l0aGluIHRoZSB1bmRlcmx5aW5nIHNjYWxlJ3MgcmFuZ2UuXG4gICAqIEBtaW5pbXVtIDBcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IERldGVybWluZSB1c2luZyBhIGZvcm11bGEgYGNlaWwod2lkdGgvNDApYCBmb3IgeCBhbmQgYGNlaWwoaGVpZ2h0LzQwKWAgZm9yIHkuXG4gICAqL1xuICB0aWNrQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEV4cGxpY2l0bHkgc2V0IHRoZSB2aXNpYmxlIGF4aXMgdGljayB2YWx1ZXMuXG4gICAqL1xuICB2YWx1ZXM/OiBudW1iZXJbXSB8IERhdGVUaW1lW107XG5cbiAgLyoqXG4gICAqIEEgbm9uLXBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB6LWluZGV4IG9mIHRoZSBheGlzLlxuICAgKiBJZiB6aW5kZXggaXMgMCwgYXhlcyBzaG91bGQgYmUgZHJhd24gYmVoaW5kIGFsbCBjaGFydCBlbGVtZW50cy5cbiAgICogVG8gcHV0IHRoZW0gaW4gZnJvbnQsIHVzZSBgXCJ6aW5kZXggPSAxXCJgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgIChpbiBmcm9udCBvZiB0aGUgbWFya3MpIGZvciBhY3R1YWwgYXhpcyBhbmQgYDBgIChiZWhpbmQgdGhlIG1hcmtzKSBmb3IgZ3JpZHMuXG4gICAqXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHppbmRleD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWFyayBkZWZpbml0aW9ucyBmb3IgY3VzdG9tIGF4aXMgZW5jb2RpbmcuXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICBlbmNvZGluZz86IEF4aXNFbmNvZGluZztcbn1cblxuXG5leHBvcnQgdHlwZSBBeGlzUGFydCA9IGtleW9mIEF4aXNFbmNvZGluZztcbmV4cG9ydCBjb25zdCBBWElTX1BBUlRTOiBBeGlzUGFydFtdID0gWydkb21haW4nLCAnZ3JpZCcsICdsYWJlbHMnLCAndGlja3MnLCAndGl0bGUnXTtcblxuXG5cbi8qKlxuICogQSBkaWN0aW9uYXJ5IGxpc3Rpbmcgd2hldGhlciBhIGNlcnRhaW4gYXhpcyBwcm9wZXJ0eSBpcyBhcHBsaWNhYmxlIGZvciBvbmx5IG1haW4gYXhlcyBvciBvbmx5IGdyaWQgYXhlcy5cbiAqIChQcm9wZXJ0aWVzIG5vdCBsaXN0ZWQgYXJlIGFwcGxpY2FibGUgZm9yIGJvdGgpXG4gKi9cbmV4cG9ydCBjb25zdCBBWElTX1BST1BFUlRZX1RZUEU6IHtcbiAgLy8gVXNpbmcgTWFwcGVkIFR5cGUgdG8gZGVjbGFyZSB0eXBlIChodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlcylcbiAgW2sgaW4ga2V5b2YgVmdBeGlzXTogJ21haW4nIHwgJ2dyaWQnIHwgJ2JvdGgnXG59ID0ge1xuICBncmlkOiAnZ3JpZCcsXG4gIGdyaWRTY2FsZTogJ2dyaWQnLFxuXG4gIGRvbWFpbjogJ21haW4nLFxuICBsYWJlbHM6ICdtYWluJyxcbiAgbGFiZWxGbHVzaDogJ21haW4nLFxuICBsYWJlbE92ZXJsYXA6ICdtYWluJyxcbiAgbWluRXh0ZW50OiAnbWFpbicsXG4gIG1heEV4dGVudDogJ21haW4nLFxuICBvZmZzZXQ6ICdtYWluJyxcbiAgdGlja3M6ICdtYWluJyxcbiAgdGl0bGU6ICdtYWluJyxcbiAgdmFsdWVzOiAnYm90aCcsXG5cbiAgc2NhbGU6ICdib3RoJyxcbiAgemluZGV4OiAnYm90aCcgLy8gdGhpcyBpcyBhY3R1YWxseSBzZXQgYWZ0ZXJ3YXJkLCBzbyBpdCBkb2Vzbid0IG1hdHRlclxufTtcblxuZXhwb3J0IGludGVyZmFjZSBBeGlzRW5jb2Rpbmcge1xuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciB0aGUgYXhpcyBjb250YWluZXIuXG4gICAqL1xuICBheGlzPzogR3VpZGVFbmNvZGluZ0VudHJ5O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gZW5jb2RpbmcgZm9yIHRoZSBheGlzIGRvbWFpbiBydWxlIG1hcmsuXG4gICAqL1xuICBkb21haW4/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgYXhpcyBncmlkbGluZSBydWxlIG1hcmtzLlxuICAgKi9cbiAgZ3JpZD86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciBheGlzIGxhYmVsIHRleHQgbWFya3MuXG4gICAqL1xuICBsYWJlbHM/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgYXhpcyB0aWNrIHJ1bGUgbWFya3MuXG4gICAqL1xuICB0aWNrcz86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciB0aGUgYXhpcyB0aXRsZSB0ZXh0IG1hcmsuXG4gICAqL1xuICB0aXRsZT86IEd1aWRlRW5jb2RpbmdFbnRyeTtcbn1cblxuY29uc3QgQ09NTU9OX0FYSVNfUFJPUEVSVElFU19JTkRFWDogRmxhZzxrZXlvZiAoVmdBeGlzIHwgQXhpcyk+ID0ge1xuICBvcmllbnQ6IDEsIC8vIG90aGVyIHRoaW5ncyBjYW4gZGVwZW5kIG9uIG9yaWVudFxuXG4gIGRvbWFpbjogMSxcbiAgZm9ybWF0OiAxLFxuICBncmlkOiAxLFxuICBsYWJlbEJvdW5kOiAxLFxuICBsYWJlbEZsdXNoOiAxLFxuICBsYWJlbFBhZGRpbmc6IDEsXG4gIGxhYmVsczogMSxcbiAgbGFiZWxPdmVybGFwOiAxLFxuICBtYXhFeHRlbnQ6IDEsXG4gIG1pbkV4dGVudDogMSxcbiAgb2Zmc2V0OiAxLFxuICBwb3NpdGlvbjogMSxcbiAgdGlja0NvdW50OiAxLFxuICB0aWNrczogMSxcbiAgdGlja1NpemU6IDEsXG4gIHRpdGxlOiAxLFxuICB0aXRsZVBhZGRpbmc6IDEsXG4gIHZhbHVlczogMSxcbiAgemluZGV4OiAxLFxufTtcblxuY29uc3QgQVhJU19QUk9QRVJUSUVTX0lOREVYOiBGbGFnPGtleW9mIEF4aXM+ID0ge1xuICAuLi5DT01NT05fQVhJU19QUk9QRVJUSUVTX0lOREVYLFxuICBlbmNvZGluZzogMSxcbiAgbGFiZWxBbmdsZTogMSxcbiAgdGl0bGVNYXhMZW5ndGg6IDFcbn07XG5cbmNvbnN0IFZHX0FYSVNfUFJPUEVSVElFU19JTkRFWDogRmxhZzxrZXlvZiBWZ0F4aXM+ID0ge1xuICBzY2FsZTogMSxcbiAgLi4uQ09NTU9OX0FYSVNfUFJPUEVSVElFU19JTkRFWCxcbiAgZ3JpZFNjYWxlOiAxLFxuICBlbmNvZGU6IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0F4aXNQcm9wZXJ0eShwcm9wOiBzdHJpbmcpOiBwcm9wIGlzIGtleW9mIEF4aXMge1xuICByZXR1cm4gISFBWElTX1BST1BFUlRJRVNfSU5ERVhbcHJvcF07XG59XG5cbmV4cG9ydCBjb25zdCBWR19BWElTX1BST1BFUlRJRVMgPSBmbGFnS2V5cyhWR19BWElTX1BST1BFUlRJRVNfSU5ERVgpO1xuXG4vLyBFeHBvcnQgZm9yIGRlcGVuZGVudCBwcm9qZWN0c1xuZXhwb3J0IGNvbnN0IEFYSVNfUFJPUEVSVElFUyA9IGZsYWdLZXlzKEFYSVNfUFJPUEVSVElFU19JTkRFWCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXhpc0NvbmZpZ01peGlucyB7XG4gIC8qKlxuICAgKiBBeGlzIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGRldGVybWluZXMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhbGwgYHhgIGFuZCBgeWAgW2F4ZXNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYXhpcy5odG1sKS4gRm9yIGEgZnVsbCBsaXN0IG9mIGF4aXMgY29uZmlndXJhdGlvbiBvcHRpb25zLCBwbGVhc2Ugc2VlIHRoZSBbY29ycmVzcG9uZGluZyBzZWN0aW9uIG9mIHRoZSBheGlzIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYXhpcy5odG1sI2NvbmZpZykuXG4gICAqL1xuICBheGlzPzogQXhpc0NvbmZpZztcblxuICAvKipcbiAgICogWC1heGlzIHNwZWNpZmljIGNvbmZpZy5cbiAgICovXG4gIGF4aXNYPzogVmdBeGlzQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBZLWF4aXMgc3BlY2lmaWMgY29uZmlnLlxuICAgKi9cbiAgYXhpc1k/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB5LWF4aXMgYWxvbmcgdGhlIGxlZnQgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBheGlzTGVmdD86IFZnQXhpc0NvbmZpZztcblxuICAvKipcbiAgICogU3BlY2lmaWMgYXhpcyBjb25maWcgZm9yIHktYXhpcyBhbG9uZyB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBheGlzUmlnaHQ/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB4LWF4aXMgYWxvbmcgdGhlIHRvcCBlZGdlIG9mIHRoZSBjaGFydC5cbiAgICovXG4gIGF4aXNUb3A/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciB4LWF4aXMgYWxvbmcgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBjaGFydC5cbiAgICovXG4gIGF4aXNCb3R0b20/OiBWZ0F4aXNDb25maWc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljIGF4aXMgY29uZmlnIGZvciBheGVzIHdpdGggXCJiYW5kXCIgc2NhbGVzLlxuICAgKi9cbiAgYXhpc0JhbmQ/OiBWZ0F4aXNDb25maWc7XG59XG4iXX0=","/*\n * Constants and utilities for encoding channels (Visual variables)\n * such as 'x', 'y', 'color'.\n */\nimport * as tslib_1 from \"tslib\";\nimport { flagKeys } from './util';\nexport var Channel;\n(function (Channel) {\n // Facet\n Channel.ROW = 'row';\n Channel.COLUMN = 'column';\n // Position\n Channel.X = 'x';\n Channel.Y = 'y';\n Channel.X2 = 'x2';\n Channel.Y2 = 'y2';\n // Geo Position\n Channel.LATITUDE = 'latitude';\n Channel.LONGITUDE = 'longitude';\n Channel.LATITUDE2 = 'latitude2';\n Channel.LONGITUDE2 = 'longitude2';\n // Mark property with scale\n Channel.COLOR = 'color';\n Channel.FILL = 'fill';\n Channel.STROKE = 'stroke';\n Channel.SHAPE = 'shape';\n Channel.SIZE = 'size';\n Channel.OPACITY = 'opacity';\n // Non-scale channel\n Channel.TEXT = 'text';\n Channel.ORDER = 'order';\n Channel.DETAIL = 'detail';\n Channel.KEY = 'key';\n Channel.TOOLTIP = 'tooltip';\n Channel.HREF = 'href';\n})(Channel || (Channel = {}));\nexport var X = Channel.X;\nexport var Y = Channel.Y;\nexport var X2 = Channel.X2;\nexport var Y2 = Channel.Y2;\nexport var LATITUDE = Channel.LATITUDE;\nexport var LATITUDE2 = Channel.LATITUDE2;\nexport var LONGITUDE = Channel.LONGITUDE;\nexport var LONGITUDE2 = Channel.LONGITUDE2;\nexport var ROW = Channel.ROW;\nexport var COLUMN = Channel.COLUMN;\nexport var SHAPE = Channel.SHAPE;\nexport var SIZE = Channel.SIZE;\nexport var COLOR = Channel.COLOR;\nexport var FILL = Channel.FILL;\nexport var STROKE = Channel.STROKE;\nexport var TEXT = Channel.TEXT;\nexport var DETAIL = Channel.DETAIL;\nexport var KEY = Channel.KEY;\nexport var ORDER = Channel.ORDER;\nexport var OPACITY = Channel.OPACITY;\nexport var TOOLTIP = Channel.TOOLTIP;\nexport var HREF = Channel.HREF;\nexport var GEOPOSITION_CHANNEL_INDEX = {\n longitude: 1,\n longitude2: 1,\n latitude: 1,\n latitude2: 1,\n};\nexport var GEOPOSITION_CHANNELS = flagKeys(GEOPOSITION_CHANNEL_INDEX);\nvar UNIT_CHANNEL_INDEX = tslib_1.__assign({ \n // position\n x: 1, y: 1, x2: 1, y2: 1 }, GEOPOSITION_CHANNEL_INDEX, { \n // color\n color: 1, fill: 1, stroke: 1, \n // other non-position with scale\n opacity: 1, size: 1, shape: 1, \n // channels without scales\n order: 1, text: 1, detail: 1, key: 1, tooltip: 1, href: 1 });\nexport function isColorChannel(channel) {\n return channel === 'color' || channel === 'fill' || channel === 'stroke';\n}\nvar FACET_CHANNEL_INDEX = {\n row: 1,\n column: 1\n};\nvar CHANNEL_INDEX = tslib_1.__assign({}, UNIT_CHANNEL_INDEX, FACET_CHANNEL_INDEX);\nexport var CHANNELS = flagKeys(CHANNEL_INDEX);\nvar _o = CHANNEL_INDEX.order, _d = CHANNEL_INDEX.detail, SINGLE_DEF_CHANNEL_INDEX = tslib_1.__rest(CHANNEL_INDEX, [\"order\", \"detail\"]);\n/**\n * Channels that cannot have an array of channelDef.\n * model.fieldDef, getFieldDef only work for these channels.\n *\n * (The only two channels that can have an array of channelDefs are \"detail\" and \"order\".\n * Since there can be multiple fieldDefs for detail and order, getFieldDef/model.fieldDef\n * are not applicable for them. Similarly, selection projection won't work with \"detail\" and \"order\".)\n */\nexport var SINGLE_DEF_CHANNELS = flagKeys(SINGLE_DEF_CHANNEL_INDEX);\nexport function isChannel(str) {\n return !!CHANNEL_INDEX[str];\n}\n// CHANNELS without COLUMN, ROW\nexport var UNIT_CHANNELS = flagKeys(UNIT_CHANNEL_INDEX);\n// NONPOSITION_CHANNELS = UNIT_CHANNELS without X, Y, X2, Y2;\nvar _x = UNIT_CHANNEL_INDEX.x, _y = UNIT_CHANNEL_INDEX.y, \n// x2 and y2 share the same scale as x and y\n_x2 = UNIT_CHANNEL_INDEX.x2, _y2 = UNIT_CHANNEL_INDEX.y2, _latitude = UNIT_CHANNEL_INDEX.latitude, _longitude = UNIT_CHANNEL_INDEX.longitude, _latitude2 = UNIT_CHANNEL_INDEX.latitude2, _longitude2 = UNIT_CHANNEL_INDEX.longitude2, \n// The rest of unit channels then have scale\nNONPOSITION_CHANNEL_INDEX = tslib_1.__rest(UNIT_CHANNEL_INDEX, [\"x\", \"y\", \"x2\", \"y2\", \"latitude\", \"longitude\", \"latitude2\", \"longitude2\"]);\nexport var NONPOSITION_CHANNELS = flagKeys(NONPOSITION_CHANNEL_INDEX);\n// POSITION_SCALE_CHANNELS = X and Y;\nvar POSITION_SCALE_CHANNEL_INDEX = { x: 1, y: 1 };\nexport var POSITION_SCALE_CHANNELS = flagKeys(POSITION_SCALE_CHANNEL_INDEX);\n// NON_POSITION_SCALE_CHANNEL = SCALE_CHANNELS without X, Y\nvar \n// x2 and y2 share the same scale as x and y\n// text and tooltip have format instead of scale,\n// href has neither format, nor scale\n_t = NONPOSITION_CHANNEL_INDEX.text, _tt = NONPOSITION_CHANNEL_INDEX.tooltip, _hr = NONPOSITION_CHANNEL_INDEX.href, \n// detail and order have no scale\n_dd = NONPOSITION_CHANNEL_INDEX.detail, _k = NONPOSITION_CHANNEL_INDEX.key, _oo = NONPOSITION_CHANNEL_INDEX.order, NONPOSITION_SCALE_CHANNEL_INDEX = tslib_1.__rest(NONPOSITION_CHANNEL_INDEX, [\"text\", \"tooltip\", \"href\", \"detail\", \"key\", \"order\"]);\nexport var NONPOSITION_SCALE_CHANNELS = flagKeys(NONPOSITION_SCALE_CHANNEL_INDEX);\n// Declare SCALE_CHANNEL_INDEX\nvar SCALE_CHANNEL_INDEX = tslib_1.__assign({}, POSITION_SCALE_CHANNEL_INDEX, NONPOSITION_SCALE_CHANNEL_INDEX);\n/** List of channels with scales */\nexport var SCALE_CHANNELS = flagKeys(SCALE_CHANNEL_INDEX);\nexport function isScaleChannel(channel) {\n return !!SCALE_CHANNEL_INDEX[channel];\n}\n/**\n * Return whether a channel supports a particular mark type.\n * @param channel channel name\n * @param mark the mark type\n * @return whether the mark supports the channel\n */\nexport function supportMark(channel, mark) {\n return mark in getSupportedMark(channel);\n}\n/**\n * Return a dictionary showing whether a channel supports mark type.\n * @param channel\n * @return A dictionary mapping mark types to boolean values.\n */\nexport function getSupportedMark(channel) {\n switch (channel) {\n case COLOR:\n case FILL:\n case STROKE:\n case DETAIL:\n case KEY:\n case TOOLTIP:\n case HREF:\n case ORDER: // TODO: revise (order might not support rect, which is not stackable?)\n case OPACITY:\n case ROW:\n case COLUMN:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, rect: true, line: true, trail: true, area: true, text: true, geoshape: true\n };\n case X:\n case Y:\n case LATITUDE:\n case LONGITUDE:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, rect: true, line: true, trail: true, area: true, text: true\n };\n case X2:\n case Y2:\n case LATITUDE2:\n case LONGITUDE2:\n return {\n rule: true, bar: true, rect: true, area: true\n };\n case SIZE:\n return {\n point: true, tick: true, rule: true, circle: true, square: true,\n bar: true, text: true, line: true, trail: true\n };\n case SHAPE:\n return { point: true, geoshape: true };\n case TEXT:\n return { text: true };\n }\n}\nexport function rangeType(channel) {\n switch (channel) {\n case X:\n case Y:\n case SIZE:\n case OPACITY:\n // X2 and Y2 use X and Y scales, so they similarly have continuous range.\n case X2:\n case Y2:\n return 'continuous';\n case ROW:\n case COLUMN:\n case SHAPE:\n // TEXT, TOOLTIP, and HREF have no scale but have discrete output\n case TEXT:\n case TOOLTIP:\n case HREF:\n return 'discrete';\n // Color can be either continuous or discrete, depending on scale type.\n case COLOR:\n case FILL:\n case STROKE:\n return 'flexible';\n // No scale, no range type.\n case LATITUDE:\n case LONGITUDE:\n case LATITUDE2:\n case LONGITUDE2:\n case DETAIL:\n case KEY:\n case ORDER:\n return undefined;\n }\n /* istanbul ignore next: should never reach here. */\n throw new Error('rangeType not implemented for ' + channel);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jaGFubmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRzs7QUFNSCxPQUFPLEVBQU8sUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXRDLE1BQU0sS0FBVyxPQUFPLENBb0N2QjtBQXBDRCxXQUFpQixPQUFPO0lBQ3RCLFFBQVE7SUFDSyxXQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGNBQU0sR0FBYSxRQUFRLENBQUM7SUFFekMsV0FBVztJQUNFLFNBQUMsR0FBUSxHQUFHLENBQUM7SUFDYixTQUFDLEdBQVEsR0FBRyxDQUFDO0lBQ2IsVUFBRSxHQUFTLElBQUksQ0FBQztJQUNoQixVQUFFLEdBQVMsSUFBSSxDQUFDO0lBRTdCLGVBQWU7SUFDRixnQkFBUSxHQUFlLFVBQVUsQ0FBQztJQUNsQyxpQkFBUyxHQUFnQixXQUFXLENBQUM7SUFDckMsaUJBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLGtCQUFVLEdBQWlCLFlBQVksQ0FBQztJQUVyRCwyQkFBMkI7SUFDZCxhQUFLLEdBQVksT0FBTyxDQUFDO0lBRXpCLFlBQUksR0FBVyxNQUFNLENBQUM7SUFFdEIsY0FBTSxHQUFhLFFBQVEsQ0FBQztJQUU1QixhQUFLLEdBQVksT0FBTyxDQUFDO0lBQ3pCLFlBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsZUFBTyxHQUFjLFNBQVMsQ0FBQztJQUU1QyxvQkFBb0I7SUFDUCxZQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLGFBQUssR0FBWSxPQUFPLENBQUM7SUFDekIsY0FBTSxHQUFhLFFBQVEsQ0FBQztJQUM1QixXQUFHLEdBQVUsS0FBSyxDQUFDO0lBRW5CLGVBQU8sR0FBYyxTQUFTLENBQUM7SUFDL0IsWUFBSSxHQUFXLE1BQU0sQ0FBQztBQUNyQyxDQUFDLEVBcENnQixPQUFPLEtBQVAsT0FBTyxRQW9DdkI7QUFJRCxNQUFNLENBQUMsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUMzQixNQUFNLENBQUMsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUM3QixNQUFNLENBQUMsSUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUU3QixNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztBQUN6QyxNQUFNLENBQUMsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxNQUFNLENBQUMsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztBQUMzQyxNQUFNLENBQUMsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUU3QyxNQUFNLENBQUMsSUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUMvQixNQUFNLENBQUMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNyQyxNQUFNLENBQUMsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUNuQyxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNqQyxNQUFNLENBQUMsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUVuQyxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNqQyxNQUFNLENBQUMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNyQyxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNqQyxNQUFNLENBQUMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUNyQyxNQUFNLENBQUMsSUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUMvQixN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S0FBSyxJQUFJO1lBQ1AsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztLQUN2QjtBQUNILENBQUM7QUFFRCxNQUFNLG9CQUFvQixPQUFnQjtJQUN4QyxRQUFRLE9BQU8sRUFBRTtRQUNmLEtBQUssQ0FBQyxDQUFDO1FBQ1AsS0FBSyxDQUFDLENBQUM7UUFDUCxLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssT0FBTyxDQUFDO1FBQ2IseUVBQXlFO1FBQ3pFLEtBQUssRUFBRSxDQUFDO1FBQ1IsS0FBSyxFQUFFO1lBQ0wsT0FBTyxZQUFZLENBQUM7UUFFdEIsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSyxDQUFDO1FBQ1gsaUVBQWlFO1FBQ2pFLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLElBQUk7WUFDUCxPQUFPLFVBQVUsQ0FBQztRQUVwQix1RUFBdUU7UUFDdkUsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssTUFBTTtZQUNULE9BQU8sVUFBVSxDQUFDO1FBRXBCLDJCQUEyQjtRQUUzQixLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssR0FBRyxDQUFDO1FBQ1QsS0FBSyxLQUFLO1lBQ1IsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFDRCxvREFBb0Q7SUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBRyxPQUFPLENBQUMsQ0FBQztBQUM5RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvbnN0YW50cyBhbmQgdXRpbGl0aWVzIGZvciBlbmNvZGluZyBjaGFubmVscyAoVmlzdWFsIHZhcmlhYmxlcylcbiAqIHN1Y2ggYXMgJ3gnLCAneScsICdjb2xvcicuXG4gKi9cblxuaW1wb3J0IHtSYW5nZVR5cGV9IGZyb20gJy4vY29tcGlsZS9zY2FsZS90eXBlJztcbmltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtGbGFnLCBmbGFnS2V5c30gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IG5hbWVzcGFjZSBDaGFubmVsIHtcbiAgLy8gRmFjZXRcbiAgZXhwb3J0IGNvbnN0IFJPVzogJ3JvdycgPSAncm93JztcbiAgZXhwb3J0IGNvbnN0IENPTFVNTjogJ2NvbHVtbicgPSAnY29sdW1uJztcblxuICAvLyBQb3NpdGlvblxuICBleHBvcnQgY29uc3QgWDogJ3gnID0gJ3gnO1xuICBleHBvcnQgY29uc3QgWTogJ3knID0gJ3knO1xuICBleHBvcnQgY29uc3QgWDI6ICd4MicgPSAneDInO1xuICBleHBvcnQgY29uc3QgWTI6ICd5MicgPSAneTInO1xuXG4gIC8vIEdlbyBQb3NpdGlvblxuICBleHBvcnQgY29uc3QgTEFUSVRVREU6ICdsYXRpdHVkZScgPSAnbGF0aXR1ZGUnO1xuICBleHBvcnQgY29uc3QgTE9OR0lUVURFOiAnbG9uZ2l0dWRlJyA9ICdsb25naXR1ZGUnO1xuICBleHBvcnQgY29uc3QgTEFUSVRVREUyOiAnbGF0aXR1ZGUyJyA9ICdsYXRpdHVkZTInO1xuICBleHBvcnQgY29uc3QgTE9OR0lUVURFMjogJ2xvbmdpdHVkZTInID0gJ2xvbmdpdHVkZTInO1xuXG4gIC8vIE1hcmsgcHJvcGVydHkgd2l0aCBzY2FsZVxuICBleHBvcnQgY29uc3QgQ09MT1I6ICdjb2xvcicgPSAnY29sb3InO1xuXG4gIGV4cG9ydCBjb25zdCBGSUxMOiAnZmlsbCcgPSAnZmlsbCc7XG5cbiAgZXhwb3J0IGNvbnN0IFNUUk9LRTogJ3N0cm9rZScgPSAnc3Ryb2tlJztcblxuICBleHBvcnQgY29uc3QgU0hBUEU6ICdzaGFwZScgPSAnc2hhcGUnO1xuICBleHBvcnQgY29uc3QgU0laRTogJ3NpemUnID0gJ3NpemUnO1xuICBleHBvcnQgY29uc3QgT1BBQ0lUWTogJ29wYWNpdHknID0gJ29wYWNpdHknO1xuXG4gIC8vIE5vbi1zY2FsZSBjaGFubmVsXG4gIGV4cG9ydCBjb25zdCBURVhUOiAndGV4dCcgPSAndGV4dCc7XG4gIGV4cG9ydCBjb25zdCBPUkRFUjogJ29yZGVyJyA9ICdvcmRlcic7XG4gIGV4cG9ydCBjb25zdCBERVRBSUw6ICdkZXRhaWwnID0gJ2RldGFpbCc7XG4gIGV4cG9ydCBjb25zdCBLRVk6ICdrZXknID0gJ2tleSc7XG5cbiAgZXhwb3J0IGNvbnN0IFRPT0xUSVA6ICd0b29sdGlwJyA9ICd0b29sdGlwJztcbiAgZXhwb3J0IGNvbnN0IEhSRUY6ICdocmVmJyA9ICdocmVmJztcbn1cblxuZXhwb3J0IHR5cGUgQ2hhbm5lbCA9IGtleW9mIEVuY29kaW5nPGFueT4gfCBrZXlvZiBGYWNldE1hcHBpbmc8YW55PjtcblxuZXhwb3J0IGNvbnN0IFggPSBDaGFubmVsLlg7XG5leHBvcnQgY29uc3QgWSA9IENoYW5uZWwuWTtcbmV4cG9ydCBjb25zdCBYMiA9IENoYW5uZWwuWDI7XG5leHBvcnQgY29uc3QgWTIgPSBDaGFubmVsLlkyO1xuXG5leHBvcnQgY29uc3QgTEFUSVRVREUgPSBDaGFubmVsLkxBVElUVURFO1xuZXhwb3J0IGNvbnN0IExBVElUVURFMiA9IENoYW5uZWwuTEFUSVRVREUyO1xuZXhwb3J0IGNvbnN0IExPTkdJVFVERSA9IENoYW5uZWwuTE9OR0lUVURFO1xuZXhwb3J0IGNvbnN0IExPTkdJVFVERTIgPSBDaGFubmVsLkxPTkdJVFVERTI7XG5cbmV4cG9ydCBjb25zdCBST1cgPSBDaGFubmVsLlJPVztcbmV4cG9ydCBjb25zdCBDT0xVTU4gPSBDaGFubmVsLkNPTFVNTjtcbmV4cG9ydCBjb25zdCBTSEFQRSA9IENoYW5uZWwuU0hBUEU7XG5leHBvcnQgY29uc3QgU0laRSA9IENoYW5uZWwuU0laRTtcbmV4cG9ydCBjb25zdCBDT0xPUiA9IENoYW5uZWwuQ09MT1I7XG5cbmV4cG9ydCBjb25zdCBGSUxMID0gQ2hhbm5lbC5GSUxMO1xuZXhwb3J0IGNvbnN0IFNUUk9LRSA9IENoYW5uZWwuU1RST0tFO1xuZXhwb3J0IGNvbnN0IFRFWFQgPSBDaGFubmVsLlRFWFQ7XG5leHBvcnQgY29uc3QgREVUQUlMID0gQ2hhbm5lbC5ERVRBSUw7XG5leHBvcnQgY29uc3QgS0VZID0gQ2hhbm5lbC5LRVk7XG5leHBvcnQgY29uc3QgT1JERVIgPSBDaGFubmVsLk9SREVSO1xuZXhwb3J0IGNvbnN0IE9QQUNJVFkgPSBDaGFubmVsLk9QQUNJVFk7XG5leHBvcnQgY29uc3QgVE9PTFRJUCA9IENoYW5uZWwuVE9PTFRJUDtcbmV4cG9ydCBjb25zdCBIUkVGID0gQ2hhbm5lbC5IUkVGO1xuXG5leHBvcnQgdHlwZSBHZW9Qb3NpdGlvbkNoYW5uZWwgPSAnbG9uZ2l0dWRlJyB8ICdsYXRpdHVkZScgfCAnbG9uZ2l0dWRlMicgfCAnbGF0aXR1ZGUyJztcblxuZXhwb3J0IGNvbnN0IEdFT1BPU0lUSU9OX0NIQU5ORUxfSU5ERVg6IEZsYWc8R2VvUG9zaXRpb25DaGFubmVsPiA9IHtcbiAgbG9uZ2l0dWRlOiAxLFxuICBsb25naXR1ZGUyOiAxLFxuICBsYXRpdHVkZTogMSxcbiAgbGF0aXR1ZGUyOiAxLFxufTtcblxuZXhwb3J0IGNvbnN0IEdFT1BPU0lUSU9OX0NIQU5ORUxTID0gZmxhZ0tleXMoR0VPUE9TSVRJT05fQ0hBTk5FTF9JTkRFWCk7XG5cbmNvbnN0IFVOSVRfQ0hBTk5FTF9JTkRFWDogRmxhZzxrZXlvZiBFbmNvZGluZzxhbnk+PiA9IHtcbiAgLy8gcG9zaXRpb25cbiAgeDogMSxcbiAgeTogMSxcbiAgeDI6IDEsXG4gIHkyOiAxLFxuXG4gIC4uLkdFT1BPU0lUSU9OX0NIQU5ORUxfSU5ERVgsXG5cbiAgLy8gY29sb3JcbiAgY29sb3I6IDEsXG4gIGZpbGw6IDEsXG4gIHN0cm9rZTogMSxcblxuICAvLyBvdGhlciBub24tcG9zaXRpb24gd2l0aCBzY2FsZVxuICBvcGFjaXR5OiAxLFxuICBzaXplOiAxLFxuICBzaGFwZTogMSxcblxuICAvLyBjaGFubmVscyB3aXRob3V0IHNjYWxlc1xuICBvcmRlcjogMSxcbiAgdGV4dDogMSxcbiAgZGV0YWlsOiAxLFxuICBrZXk6IDEsXG4gIHRvb2x0aXA6IDEsXG4gIGhyZWY6IDEsXG59O1xuXG5leHBvcnQgdHlwZSBDb2xvckNoYW5uZWwgPSAnY29sb3InIHwgJ2ZpbGwnIHwgJ3N0cm9rZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbG9yQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsKTogY2hhbm5lbCBpcyBDb2xvckNoYW5uZWwge1xuICByZXR1cm4gY2hhbm5lbCA9PT0gJ2NvbG9yJyB8fCBjaGFubmVsID09PSAnZmlsbCcgfHwgY2hhbm5lbCA9PT0gJ3N0cm9rZSc7XG59XG5cbmNvbnN0IEZBQ0VUX0NIQU5ORUxfSU5ERVg6IEZsYWc8a2V5b2YgRmFjZXRNYXBwaW5nPGFueT4+ID0ge1xuICByb3c6IDEsXG4gIGNvbHVtbjogMVxufTtcblxuY29uc3QgQ0hBTk5FTF9JTkRFWCA9IHtcbiAgLi4uVU5JVF9DSEFOTkVMX0lOREVYLFxuICAuLi5GQUNFVF9DSEFOTkVMX0lOREVYXG59O1xuXG5leHBvcnQgY29uc3QgQ0hBTk5FTFMgPSBmbGFnS2V5cyhDSEFOTkVMX0lOREVYKTtcblxuY29uc3Qge29yZGVyOiBfbywgZGV0YWlsOiBfZCwgLi4uU0lOR0xFX0RFRl9DSEFOTkVMX0lOREVYfSA9IENIQU5ORUxfSU5ERVg7XG4vKipcbiAqIENoYW5uZWxzIHRoYXQgY2Fubm90IGhhdmUgYW4gYXJyYXkgb2YgY2hhbm5lbERlZi5cbiAqIG1vZGVsLmZpZWxkRGVmLCBnZXRGaWVsZERlZiBvbmx5IHdvcmsgZm9yIHRoZXNlIGNoYW5uZWxzLlxuICpcbiAqIChUaGUgb25seSB0d28gY2hhbm5lbHMgdGhhdCBjYW4gaGF2ZSBhbiBhcnJheSBvZiBjaGFubmVsRGVmcyBhcmUgXCJkZXRhaWxcIiBhbmQgXCJvcmRlclwiLlxuICogU2luY2UgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGZpZWxkRGVmcyBmb3IgZGV0YWlsIGFuZCBvcmRlciwgZ2V0RmllbGREZWYvbW9kZWwuZmllbGREZWZcbiAqIGFyZSBub3QgYXBwbGljYWJsZSBmb3IgdGhlbS4gIFNpbWlsYXJseSwgc2VsZWN0aW9uIHByb2plY3Rpb24gd29uJ3Qgd29yayB3aXRoIFwiZGV0YWlsXCIgYW5kIFwib3JkZXJcIi4pXG4gKi9cblxuZXhwb3J0IGNvbnN0IFNJTkdMRV9ERUZfQ0hBTk5FTFM6IFNpbmdsZURlZkNoYW5uZWxbXSA9IGZsYWdLZXlzKFNJTkdMRV9ERUZfQ0hBTk5FTF9JTkRFWCk7XG5cbi8vIFVzaW5nIHRoZSBmb2xsb3dpbmcgbGluZSBsZWFkcyB0byBUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdlbGVtZW50VHlwZXMnIG9mIHVuZGVmaW5lZFxuLy8gd2hlbiBydW5uaW5nIHRoZSBzY2hlbWEgZ2VuZXJhdG9yXG4vLyBleHBvcnQgdHlwZSBTaW5nbGVEZWZDaGFubmVsID0gdHlwZW9mIFNJTkdMRV9ERUZfQ0hBTk5FTFNbMF07XG5leHBvcnQgdHlwZSBTaW5nbGVEZWZDaGFubmVsID0gJ3gnIHwgJ3knIHwgJ3gyJyB8ICd5MicgfFxuICAnbG9uZ2l0dWRlJyB8ICdsYXRpdHVkZScgfCAnbG9uZ2l0dWRlMicgfCAnbGF0aXR1ZGUyJyB8XG4gICdyb3cnIHwgJ2NvbHVtbicgfFxuICAnY29sb3InIHwgJ2ZpbGwnIHwgJ3N0cm9rZScgfFxuICAnc2l6ZScgfCAnc2hhcGUnIHwgJ29wYWNpdHknIHxcbiAgJ3RleHQnIHwgJ3Rvb2x0aXAnIHwgJ2hyZWYnIHwgJ2tleSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NoYW5uZWwoc3RyOiBzdHJpbmcpOiBzdHIgaXMgQ2hhbm5lbCB7XG4gIHJldHVybiAhIUNIQU5ORUxfSU5ERVhbc3RyXTtcbn1cblxuLy8gQ0hBTk5FTFMgd2l0aG91dCBDT0xVTU4sIFJPV1xuZXhwb3J0IGNvbnN0IFVOSVRfQ0hBTk5FTFMgPSBmbGFnS2V5cyhVTklUX0NIQU5ORUxfSU5ERVgpO1xuXG5cbi8vIE5PTlBPU0lUSU9OX0NIQU5ORUxTID0gVU5JVF9DSEFOTkVMUyB3aXRob3V0IFgsIFksIFgyLCBZMjtcbmNvbnN0IHtcbiAgeDogX3gsIHk6IF95LFxuICAvLyB4MiBhbmQgeTIgc2hhcmUgdGhlIHNhbWUgc2NhbGUgYXMgeCBhbmQgeVxuICB4MjogX3gyLCB5MjogX3kyLFxuICBsYXRpdHVkZTogX2xhdGl0dWRlLCBsb25naXR1ZGU6IF9sb25naXR1ZGUsXG4gIGxhdGl0dWRlMjogX2xhdGl0dWRlMiwgbG9uZ2l0dWRlMjogX2xvbmdpdHVkZTIsXG4gIC8vIFRoZSByZXN0IG9mIHVuaXQgY2hhbm5lbHMgdGhlbiBoYXZlIHNjYWxlXG4gIC4uLk5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVhcbn0gPSBVTklUX0NIQU5ORUxfSU5ERVg7XG5cbmV4cG9ydCBjb25zdCBOT05QT1NJVElPTl9DSEFOTkVMUyA9IGZsYWdLZXlzKE5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVgpO1xuZXhwb3J0IHR5cGUgTm9uUG9zaXRpb25DaGFubmVsID0gdHlwZW9mIE5PTlBPU0lUSU9OX0NIQU5ORUxTWzBdO1xuXG4vLyBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUyA9IFggYW5kIFk7XG5jb25zdCBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMX0lOREVYOiB7eDoxLCB5OjF9ID0ge3g6MSwgeToxfTtcbmV4cG9ydCBjb25zdCBQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUyA9IGZsYWdLZXlzKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVgpO1xuZXhwb3J0IHR5cGUgUG9zaXRpb25TY2FsZUNoYW5uZWwgPSB0eXBlb2YgUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFNbMF07XG5cbi8vIE5PTl9QT1NJVElPTl9TQ0FMRV9DSEFOTkVMID0gU0NBTEVfQ0hBTk5FTFMgd2l0aG91dCBYLCBZXG5jb25zdCB7XG4gIC8vIHgyIGFuZCB5MiBzaGFyZSB0aGUgc2FtZSBzY2FsZSBhcyB4IGFuZCB5XG4gIC8vIHRleHQgYW5kIHRvb2x0aXAgaGF2ZSBmb3JtYXQgaW5zdGVhZCBvZiBzY2FsZSxcbiAgLy8gaHJlZiBoYXMgbmVpdGhlciBmb3JtYXQsIG5vciBzY2FsZVxuICB0ZXh0OiBfdCwgdG9vbHRpcDogX3R0LCBocmVmOiBfaHIsXG4gIC8vIGRldGFpbCBhbmQgb3JkZXIgaGF2ZSBubyBzY2FsZVxuICBkZXRhaWw6IF9kZCwga2V5OiBfaywgb3JkZXI6IF9vbyxcbiAgLi4uTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTF9JTkRFWFxufSA9IE5PTlBPU0lUSU9OX0NIQU5ORUxfSU5ERVg7XG5leHBvcnQgY29uc3QgTk9OUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMgPSBmbGFnS2V5cyhOT05QT1NJVElPTl9TQ0FMRV9DSEFOTkVMX0lOREVYKTtcbmV4cG9ydCB0eXBlIE5vblBvc2l0aW9uU2NhbGVDaGFubmVsID0gdHlwZW9mIE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTWzBdO1xuXG4vLyBEZWNsYXJlIFNDQUxFX0NIQU5ORUxfSU5ERVhcbmNvbnN0IFNDQUxFX0NIQU5ORUxfSU5ERVggPSB7XG4gIC4uLlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVgsXG4gIC4uLk5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxfSU5ERVhcbn07XG5cbi8qKiBMaXN0IG9mIGNoYW5uZWxzIHdpdGggc2NhbGVzICovXG5leHBvcnQgY29uc3QgU0NBTEVfQ0hBTk5FTFMgPSBmbGFnS2V5cyhTQ0FMRV9DSEFOTkVMX0lOREVYKTtcbmV4cG9ydCB0eXBlIFNjYWxlQ2hhbm5lbCA9IHR5cGVvZiBTQ0FMRV9DSEFOTkVMU1swXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpOiBjaGFubmVsIGlzIFNjYWxlQ2hhbm5lbCB7XG4gIHJldHVybiAhIVNDQUxFX0NIQU5ORUxfSU5ERVhbY2hhbm5lbF07XG59XG5cbmV4cG9ydCB0eXBlIFN1cHBvcnRlZE1hcmsgPSB7XG4gIFttYXJrIGluIE1hcmtdPzogYm9vbGVhblxufTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIGNoYW5uZWwgc3VwcG9ydHMgYSBwYXJ0aWN1bGFyIG1hcmsgdHlwZS5cbiAqIEBwYXJhbSBjaGFubmVsICBjaGFubmVsIG5hbWVcbiAqIEBwYXJhbSBtYXJrIHRoZSBtYXJrIHR5cGVcbiAqIEByZXR1cm4gd2hldGhlciB0aGUgbWFyayBzdXBwb3J0cyB0aGUgY2hhbm5lbFxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydE1hcmsoY2hhbm5lbDogQ2hhbm5lbCwgbWFyazogTWFyaykge1xuICByZXR1cm4gbWFyayBpbiBnZXRTdXBwb3J0ZWRNYXJrKGNoYW5uZWwpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIGRpY3Rpb25hcnkgc2hvd2luZyB3aGV0aGVyIGEgY2hhbm5lbCBzdXBwb3J0cyBtYXJrIHR5cGUuXG4gKiBAcGFyYW0gY2hhbm5lbFxuICogQHJldHVybiBBIGRpY3Rpb25hcnkgbWFwcGluZyBtYXJrIHR5cGVzIHRvIGJvb2xlYW4gdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkTWFyayhjaGFubmVsOiBDaGFubmVsKTogU3VwcG9ydGVkTWFyayB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgQ09MT1I6XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuXG4gICAgY2FzZSBERVRBSUw6XG4gICAgY2FzZSBLRVk6XG4gICAgY2FzZSBUT09MVElQOlxuICAgIGNhc2UgSFJFRjpcbiAgICBjYXNlIE9SREVSOiAgICAvLyBUT0RPOiByZXZpc2UgKG9yZGVyIG1pZ2h0IG5vdCBzdXBwb3J0IHJlY3QsIHdoaWNoIGlzIG5vdCBzdGFja2FibGU/KVxuICAgIGNhc2UgT1BBQ0lUWTpcbiAgICBjYXNlIFJPVzpcbiAgICBjYXNlIENPTFVNTjpcbiAgICAgIHJldHVybiB7IC8vIGFsbCBtYXJrc1xuICAgICAgICBwb2ludDogdHJ1ZSwgdGljazogdHJ1ZSwgcnVsZTogdHJ1ZSwgY2lyY2xlOiB0cnVlLCBzcXVhcmU6IHRydWUsXG4gICAgICAgIGJhcjogdHJ1ZSwgcmVjdDogdHJ1ZSwgbGluZTogdHJ1ZSwgdHJhaWw6IHRydWUsIGFyZWE6IHRydWUsIHRleHQ6IHRydWUsIGdlb3NoYXBlOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgWDpcbiAgICBjYXNlIFk6XG4gICAgY2FzZSBMQVRJVFVERTpcbiAgICBjYXNlIExPTkdJVFVERTpcbiAgICAgIHJldHVybiB7IC8vIGFsbCBtYXJrcyBleGNlcHQgZ2Vvc2hhcGUuIGdlb3NoYXBlIGRvZXMgbm90IHVzZSBYLCBZIC0tIGl0IHVzZXMgYSBwcm9qZWN0aW9uXG4gICAgICAgIHBvaW50OiB0cnVlLCB0aWNrOiB0cnVlLCBydWxlOiB0cnVlLCBjaXJjbGU6IHRydWUsIHNxdWFyZTogdHJ1ZSxcbiAgICAgICAgYmFyOiB0cnVlLCByZWN0OiB0cnVlLCBsaW5lOiB0cnVlLCB0cmFpbDogdHJ1ZSwgYXJlYTogdHJ1ZSwgdGV4dDogdHJ1ZVxuICAgICAgfTtcbiAgICBjYXNlIFgyOlxuICAgIGNhc2UgWTI6XG4gICAgY2FzZSBMQVRJVFVERTI6XG4gICAgY2FzZSBMT05HSVRVREUyOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcnVsZTogdHJ1ZSwgYmFyOiB0cnVlLCByZWN0OiB0cnVlLCBhcmVhOiB0cnVlXG4gICAgICB9O1xuICAgIGNhc2UgU0laRTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiB0cnVlLCB0aWNrOiB0cnVlLCBydWxlOiB0cnVlLCBjaXJjbGU6IHRydWUsIHNxdWFyZTogdHJ1ZSxcbiAgICAgICAgYmFyOiB0cnVlLCB0ZXh0OiB0cnVlLCBsaW5lOiB0cnVlLCB0cmFpbDogdHJ1ZVxuICAgICAgfTtcbiAgICBjYXNlIFNIQVBFOlxuICAgICAgcmV0dXJuIHtwb2ludDogdHJ1ZSwgZ2Vvc2hhcGU6IHRydWV9O1xuICAgIGNhc2UgVEVYVDpcbiAgICAgIHJldHVybiB7dGV4dDogdHJ1ZX07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlVHlwZShjaGFubmVsOiBDaGFubmVsKTogUmFuZ2VUeXBlIHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSBYOlxuICAgIGNhc2UgWTpcbiAgICBjYXNlIFNJWkU6XG4gICAgY2FzZSBPUEFDSVRZOlxuICAgIC8vIFgyIGFuZCBZMiB1c2UgWCBhbmQgWSBzY2FsZXMsIHNvIHRoZXkgc2ltaWxhcmx5IGhhdmUgY29udGludW91cyByYW5nZS5cbiAgICBjYXNlIFgyOlxuICAgIGNhc2UgWTI6XG4gICAgICByZXR1cm4gJ2NvbnRpbnVvdXMnO1xuXG4gICAgY2FzZSBST1c6XG4gICAgY2FzZSBDT0xVTU46XG4gICAgY2FzZSBTSEFQRTpcbiAgICAvLyBURVhULCBUT09MVElQLCBhbmQgSFJFRiBoYXZlIG5vIHNjYWxlIGJ1dCBoYXZlIGRpc2NyZXRlIG91dHB1dFxuICAgIGNhc2UgVEVYVDpcbiAgICBjYXNlIFRPT0xUSVA6XG4gICAgY2FzZSBIUkVGOlxuICAgICAgcmV0dXJuICdkaXNjcmV0ZSc7XG5cbiAgICAvLyBDb2xvciBjYW4gYmUgZWl0aGVyIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUsIGRlcGVuZGluZyBvbiBzY2FsZSB0eXBlLlxuICAgIGNhc2UgQ09MT1I6XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuICAgICAgcmV0dXJuICdmbGV4aWJsZSc7XG5cbiAgICAvLyBObyBzY2FsZSwgbm8gcmFuZ2UgdHlwZS5cblxuICAgIGNhc2UgTEFUSVRVREU6XG4gICAgY2FzZSBMT05HSVRVREU6XG4gICAgY2FzZSBMQVRJVFVERTI6XG4gICAgY2FzZSBMT05HSVRVREUyOlxuICAgIGNhc2UgREVUQUlMOlxuICAgIGNhc2UgS0VZOlxuICAgIGNhc2UgT1JERVI6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4gKi9cbiAgdGhyb3cgbmV3IEVycm9yKCdyYW5nZVR5cGUgbm90IGltcGxlbWVudGVkIGZvciAnICsgY2hhbm5lbCk7XG59XG4iXX0=","import { isBoolean } from 'vega-util';\nimport { COLOR, COLUMN, FILL, OPACITY, ROW, SHAPE, SIZE, STROKE } from './channel';\nimport { keys, varName } from './util';\nexport function binToString(bin) {\n if (isBoolean(bin)) {\n return 'bin';\n }\n return 'bin' + keys(bin).map(function (p) { return varName(\"_\" + p + \"_\" + bin[p]); }).join('');\n}\nexport function isBinParams(bin) {\n return bin && !isBoolean(bin);\n}\nexport function autoMaxBins(channel) {\n switch (channel) {\n case ROW:\n case COLUMN:\n case SIZE:\n case COLOR:\n case FILL:\n case STROKE:\n case OPACITY:\n // Facets and Size shouldn't have too many bins\n // We choose 6 like shape to simplify the rule\n case SHAPE:\n return 6; // Vega's \"shape\" has 6 distinct values\n default:\n return 10;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBVSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFGLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBNkRyQyxNQUFNLHNCQUFzQixHQUF3QjtJQUNsRCxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNsQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBQ0QsT0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLE9BQU8sQ0FBQyxNQUFJLENBQUMsU0FBSSxHQUFHLENBQUMsQ0FBQyxDQUFHLENBQUMsRUFBMUIsQ0FBMEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxzQkFBc0IsR0FBd0I7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sc0JBQXNCLE9BQWdCO0lBQzFDLFFBQVEsT0FBTyxFQUFFO1FBQ2YsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssSUFBSSxDQUFDO1FBQ1YsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLElBQUksQ0FBQztRQUNWLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxPQUFPLENBQUM7UUFDWCwrQ0FBK0M7UUFDL0MsOENBQThDO1FBQ2hELEtBQUssS0FBSztZQUNSLE9BQU8sQ0FBQyxDQUFDLENBQUMsdUNBQXVDO1FBQ25EO1lBQ0UsT0FBTyxFQUFFLENBQUM7S0FDYjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQm9vbGVhbn0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgQ09MT1IsIENPTFVNTiwgRklMTCwgT1BBQ0lUWSwgUk9XLCBTSEFQRSwgU0laRSwgU1RST0tFfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtrZXlzLCB2YXJOYW1lfSBmcm9tICcuL3V0aWwnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUJpbiB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlIGZvciBhdXRvbWF0aWMgYmluIGRldGVybWluYXRpb24gKGRlZmF1bHQgaXMgYmFzZSAxMCkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMTBgXG4gICAqXG4gICAqL1xuICBiYXNlPzogbnVtYmVyO1xuICAvKipcbiAgICogQW4gZXhhY3Qgc3RlcCBzaXplIHRvIHVzZSBiZXR3ZWVuIGJpbnMuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBJZiBwcm92aWRlZCwgb3B0aW9ucyBzdWNoIGFzIG1heGJpbnMgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGFsbG93YWJsZSBzdGVwIHNpemVzIHRvIGNob29zZSBmcm9tLlxuICAgKiBAbWluSXRlbXMgMVxuICAgKi9cbiAgc3RlcHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIEEgbWluaW11bSBhbGxvd2FibGUgc3RlcCBzaXplIChwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBpbnRlZ2VyIHZhbHVlcykuXG4gICAqL1xuICBtaW5zdGVwPzogbnVtYmVyO1xuICAvKipcbiAgICogU2NhbGUgZmFjdG9ycyBpbmRpY2F0aW5nIGFsbG93YWJsZSBzdWJkaXZpc2lvbnMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFs1LCAyXSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgZm9yIGJhc2UgMTAgbnVtYmVycyAodGhlIGRlZmF1bHQgYmFzZSksIHRoZSBtZXRob2QgbWF5IGNvbnNpZGVyIGRpdmlkaW5nIGJpbiBzaXplcyBieSA1IGFuZC9vciAyLiBGb3IgZXhhbXBsZSwgZm9yIGFuIGluaXRpYWwgc3RlcCBzaXplIG9mIDEwLCB0aGUgbWV0aG9kIGNhbiBjaGVjayBpZiBiaW4gc2l6ZXMgb2YgMiAoPSAxMC81KSwgNSAoPSAxMC8yKSwgb3IgMSAoPSAxMC8oNSoyKSkgbWlnaHQgYWxzbyBzYXRpc2Z5IHRoZSBnaXZlbiBjb25zdHJhaW50cy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBbNSwgMl1gXG4gICAqXG4gICAqIEBtaW5JdGVtcyAxXG4gICAqL1xuICBkaXZpZGU/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGJpbnMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgNmAgZm9yIGByb3dgLCBgY29sdW1uYCBhbmQgYHNoYXBlYCBjaGFubmVsczsgYDEwYCBmb3Igb3RoZXIgY2hhbm5lbHNcbiAgICpcbiAgICogQG1pbmltdW0gMlxuICAgKi9cbiAgbWF4Ymlucz86IG51bWJlcjtcbiAgLyoqXG4gICAqIElmIHRydWUgKHRoZSBkZWZhdWx0KSwgYXR0ZW1wdHMgdG8gbWFrZSB0aGUgYmluIGJvdW5kYXJpZXMgdXNlIGh1bWFuLWZyaWVuZGx5IGJvdW5kYXJpZXMsIHN1Y2ggYXMgbXVsdGlwbGVzIG9mIHRlbi5cbiAgICovXG4gIG5pY2U/OiBib29sZWFuO1xufVxuXG5cbi8qKlxuICogQmlubmluZyBwcm9wZXJ0aWVzIG9yIGJvb2xlYW4gZmxhZyBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0byBiaW4gZGF0YSBvciBub3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmluUGFyYW1zIGV4dGVuZHMgQmFzZUJpbiB7XG4gIC8qKlxuICAgKiBBIHR3by1lbGVtZW50IChgW21pbiwgbWF4XWApIGFycmF5IGluZGljYXRpbmcgdGhlIHJhbmdlIG9mIGRlc2lyZWQgYmluIHZhbHVlcy5cbiAgICogQG1pbkl0ZW1zIDJcbiAgICogQG1heEl0ZW1zIDJcbiAgICovXG4gIGV4dGVudD86IG51bWJlcltdOyAgLy8gVmdCaW5UcmFuc2Zvcm0gdXNlcyBhIGRpZmZlcmVudCBleHRlbnQgc28gd2UgbmVlZCB0byBwdWxsIHRoaXMgb3V0LlxufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluVG9TdHJpbmcoYmluOiBCaW5QYXJhbXMgfCBib29sZWFuKSB7XG4gIGlmIChpc0Jvb2xlYW4oYmluKSkge1xuICAgIHJldHVybiAnYmluJztcbiAgfVxuICByZXR1cm4gJ2JpbicgKyBrZXlzKGJpbikubWFwKHAgPT4gdmFyTmFtZShgXyR7cH1fJHtiaW5bcF19YCkpLmpvaW4oJycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCaW5QYXJhbXMoYmluOiBCaW5QYXJhbXMgfCBib29sZWFuKTogYmluIGlzIEJpblBhcmFtcyB7XG4gIHJldHVybiBiaW4gJiYgIWlzQm9vbGVhbihiaW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0b01heEJpbnMoY2hhbm5lbDogQ2hhbm5lbCk6IG51bWJlciB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgUk9XOlxuICAgIGNhc2UgQ09MVU1OOlxuICAgIGNhc2UgU0laRTpcbiAgICBjYXNlIENPTE9SOlxuICAgIGNhc2UgRklMTDpcbiAgICBjYXNlIFNUUk9LRTpcbiAgICBjYXNlIE9QQUNJVFk6XG4gICAgICAvLyBGYWNldHMgYW5kIFNpemUgc2hvdWxkbid0IGhhdmUgdG9vIG1hbnkgYmluc1xuICAgICAgLy8gV2UgY2hvb3NlIDYgbGlrZSBzaGFwZSB0byBzaW1wbGlmeSB0aGUgcnVsZVxuICAgIGNhc2UgU0hBUEU6XG4gICAgICByZXR1cm4gNjsgLy8gVmVnYSdzIFwic2hhcGVcIiBoYXMgNiBkaXN0aW5jdCB2YWx1ZXNcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDEwO1xuICB9XG59XG4iXX0=","import { toSet } from 'vega-util';\nimport { contains, flagKeys } from './util';\nexport var Mark;\n(function (Mark) {\n Mark.AREA = 'area';\n Mark.BAR = 'bar';\n Mark.LINE = 'line';\n Mark.POINT = 'point';\n Mark.RECT = 'rect';\n Mark.RULE = 'rule';\n Mark.TEXT = 'text';\n Mark.TICK = 'tick';\n Mark.TRAIL = 'trail';\n Mark.CIRCLE = 'circle';\n Mark.SQUARE = 'square';\n Mark.GEOSHAPE = 'geoshape';\n})(Mark || (Mark = {}));\nexport var AREA = Mark.AREA;\nexport var BAR = Mark.BAR;\nexport var LINE = Mark.LINE;\nexport var POINT = Mark.POINT;\nexport var TEXT = Mark.TEXT;\nexport var TICK = Mark.TICK;\nexport var TRAIL = Mark.TRAIL;\nexport var RECT = Mark.RECT;\nexport var RULE = Mark.RULE;\nexport var GEOSHAPE = Mark.GEOSHAPE;\nexport var CIRCLE = Mark.CIRCLE;\nexport var SQUARE = Mark.SQUARE;\n// Using mapped type to declare index, ensuring we always have all marks when we add more.\nvar MARK_INDEX = {\n area: 1,\n bar: 1,\n line: 1,\n point: 1,\n text: 1,\n tick: 1,\n trail: 1,\n rect: 1,\n geoshape: 1,\n rule: 1,\n circle: 1,\n square: 1\n};\nexport function isMark(m) {\n return !!MARK_INDEX[m];\n}\nexport function isPathMark(m) {\n return contains(['line', 'area', 'trail'], m);\n}\nexport var PRIMITIVE_MARKS = flagKeys(MARK_INDEX);\nexport function isMarkDef(mark) {\n return mark['type'];\n}\nvar PRIMITIVE_MARK_INDEX = toSet(PRIMITIVE_MARKS);\nexport function isPrimitiveMark(mark) {\n var markType = isMarkDef(mark) ? mark.type : mark;\n return markType in PRIMITIVE_MARK_INDEX;\n}\nexport var STROKE_CONFIG = ['stroke', 'strokeWidth',\n 'strokeDash', 'strokeDashOffset', 'strokeOpacity'];\nexport var FILL_CONFIG = ['fill', 'fillOpacity'];\nexport var FILL_STROKE_CONFIG = [].concat(STROKE_CONFIG, FILL_CONFIG);\nexport var VL_ONLY_MARK_CONFIG_PROPERTIES = ['filled', 'color'];\nexport var VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = {\n area: ['line', 'point'],\n bar: ['binSpacing', 'continuousBandSize', 'discreteBandSize'],\n line: ['point'],\n text: ['shortTimeLabels'],\n tick: ['bandSize', 'thickness']\n};\nexport var defaultMarkConfig = {\n color: '#4c78a8',\n};\nexport var defaultBarConfig = {\n binSpacing: 1,\n continuousBandSize: 5\n};\nexport var defaultTickConfig = {\n thickness: 1\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFaEMsT0FBTyxFQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFHMUMsTUFBTSxLQUFXLElBQUksQ0FhcEI7QUFiRCxXQUFpQixJQUFJO0lBQ04sU0FBSSxHQUFXLE1BQU0sQ0FBQztJQUN0QixRQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLFNBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsVUFBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixTQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLFNBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsU0FBSSxHQUFXLE1BQU0sQ0FBQztJQUN0QixTQUFJLEdBQVcsTUFBTSxDQUFDO0lBQ3RCLFVBQUssR0FBWSxPQUFPLENBQUM7SUFDekIsV0FBTSxHQUFhLFFBQVEsQ0FBQztJQUM1QixXQUFNLEdBQWEsUUFBUSxDQUFDO0lBQzVCLGFBQVEsR0FBZSxVQUFVLENBQUM7QUFDakQsQ0FBQyxFQWJnQixJQUFJLEtBQUosSUFBSSxRQWFwQjtBQVFELE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzVCLE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ2hDLE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQzlCLE1BQU0s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bUJGLE1BQU0sQ0FBQyxJQUFNLGlCQUFpQixHQUFlO0lBQzNDLFNBQVMsRUFBRSxDQUFDO0NBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dG9TZXR9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NvbXBvc2l0ZU1hcmssIENvbXBvc2l0ZU1hcmtEZWZ9IGZyb20gJy4vY29tcG9zaXRlbWFyay9pbmRleCc7XG5pbXBvcnQge2NvbnRhaW5zLCBmbGFnS2V5c30gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7VmdNYXJrQ29uZmlnfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IG5hbWVzcGFjZSBNYXJrIHtcbiAgZXhwb3J0IGNvbnN0IEFSRUE6ICdhcmVhJyA9ICdhcmVhJztcbiAgZXhwb3J0IGNvbnN0IEJBUjogJ2JhcicgPSAnYmFyJztcbiAgZXhwb3J0IGNvbnN0IExJTkU6ICdsaW5lJyA9ICdsaW5lJztcbiAgZXhwb3J0IGNvbnN0IFBPSU5UOiAncG9pbnQnID0gJ3BvaW50JztcbiAgZXhwb3J0IGNvbnN0IFJFQ1Q6ICdyZWN0JyA9ICdyZWN0JztcbiAgZXhwb3J0IGNvbnN0IFJVTEU6ICdydWxlJyA9ICdydWxlJztcbiAgZXhwb3J0IGNvbnN0IFRFWFQ6ICd0ZXh0JyA9ICd0ZXh0JztcbiAgZXhwb3J0IGNvbnN0IFRJQ0s6ICd0aWNrJyA9ICd0aWNrJztcbiAgZXhwb3J0IGNvbnN0IFRSQUlMOiAndHJhaWwnID0gJ3RyYWlsJztcbiAgZXhwb3J0IGNvbnN0IENJUkNMRTogJ2NpcmNsZScgPSAnY2lyY2xlJztcbiAgZXhwb3J0IGNvbnN0IFNRVUFSRTogJ3NxdWFyZScgPSAnc3F1YXJlJztcbiAgZXhwb3J0IGNvbnN0IEdFT1NIQVBFOiAnZ2Vvc2hhcGUnID0gJ2dlb3NoYXBlJztcbn1cblxuLyoqXG4gKiBBbGwgdHlwZXMgb2YgcHJpbWl0aXZlIG1hcmtzLlxuICovXG5leHBvcnQgdHlwZSBNYXJrID0gdHlwZW9mIE1hcmsuQVJFQSB8IHR5cGVvZiBNYXJrLkJBUiB8IHR5cGVvZiBNYXJrLkxJTkUgfCB0eXBlb2YgTWFyay5UUkFJTCB8IHR5cGVvZiBNYXJrLlBPSU5UIHwgdHlwZW9mIE1hcmsuVEVYVCB8IHR5cGVvZiBNYXJrLlRJQ0sgfCB0eXBlb2YgTWFyay5SRUNUIHwgdHlwZW9mIE1hcmsuUlVMRSB8IHR5cGVvZiBNYXJrLkNJUkNMRSB8IHR5cGVvZiBNYXJrLlNRVUFSRSB8IHR5cGVvZiBNYXJrLkdFT1NIQVBFO1xuXG5cbmV4cG9ydCBjb25zdCBBUkVBID0gTWFyay5BUkVBO1xuZXhwb3J0IGNvbnN0IEJBUiA9IE1hcmsuQkFSO1xuZXhwb3J0IGNvbnN0IExJTkUgPSBNYXJrLkxJTkU7XG5leHBvcnQgY29uc3QgUE9JTlQgPSBNYXJrLlBPSU5UO1xuZXhwb3J0IGNvbnN0IFRFWFQgPSBNYXJrLlRFWFQ7XG5leHBvcnQgY29uc3QgVElDSyA9IE1hcmsuVElDSztcbmV4cG9ydCBjb25zdCBUUkFJTCA9IE1hcmsuVFJBSUw7XG5leHBvcnQgY29uc3QgUkVDVCA9IE1hcmsuUkVDVDtcbmV4cG9ydCBjb25zdCBSVUxFID0gTWFyay5SVUxFO1xuZXhwb3J0IGNvbnN0IEdFT1NIQVBFID0gTWFyay5HRU9TSEFQRTtcblxuZXhwb3J0IGNvbnN0IENJUkNMRSA9IE1hcmsuQ0lSQ0xFO1xuZXhwb3J0IGNvbnN0IFNRVUFSRSA9IE1hcmsuU1FVQVJFO1xuXG4vLyBVc2luZyBtYXBwZWQgdHlwZSB0byBkZWNsYXJlIGluZGV4LCBlbnN1cmluZyB3ZSBhbHdheXMgaGF2ZSBhbGwgbWFya3Mgd2hlbiB3ZSBhZGQgbW9yZS5cbmNvbnN0IE1BUktfSU5ERVg6IHtbTSBpbiBNYXJrXTogMX0gPSB7XG4gIGFyZWE6IDEsXG4gIGJhcjogMSxcbiAgbGluZTogMSxcbiAgcG9pbnQ6IDEsXG4gIHRleHQ6IDEsXG4gIHRpY2s6IDEsXG4gIHRyYWlsOiAxLFxuICByZWN0OiAxLFxuICBnZW9zaGFwZTogMSxcbiAgcnVsZTogMSxcbiAgY2lyY2xlOiAxLFxuICBzcXVhcmU6IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01hcmsobTogc3RyaW5nKTogbSBpcyBNYXJrIHtcbiAgcmV0dXJuICEhTUFSS19JTkRFWFttXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUGF0aE1hcmsobTogTWFyayB8IENvbXBvc2l0ZU1hcmspOiBtIGlzICdsaW5lJyB8ICdhcmVhJyB8ICd0cmFpbCcge1xuICByZXR1cm4gY29udGFpbnMoWydsaW5lJywgJ2FyZWEnLCAndHJhaWwnXSwgbSk7XG59XG5cbmV4cG9ydCBjb25zdCBQUklNSVRJVkVfTUFSS1MgPSBmbGFnS2V5cyhNQVJLX0lOREVYKTtcblxuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtDb25maWcgZXh0ZW5kcyBWZ01hcmtDb25maWcge1xuICAvLyAtLS0tLS0tLS0tIENvbG9yIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hcmsncyBjb2xvciBzaG91bGQgYmUgdXNlZCBhcyBmaWxsIGNvbG9yIGluc3RlYWQgb2Ygc3Ryb2tlIGNvbG9yLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgIGZvciBhbGwgbWFya3MgZXhjZXB0IGBwb2ludGAgYW5kIGBmYWxzZWAgZm9yIGBwb2ludGAuXG4gICAqXG4gICAqIF9fQXBwbGljYWJsZSBmb3I6X18gYGJhcmAsIGBwb2ludGAsIGBjaXJjbGVgLCBgc3F1YXJlYCwgYW5kIGBhcmVhYCBtYXJrcy5cbiAgICpcbiAgICogX19Ob3RlOl9fIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHVzZWQgaW4gYSBbc3R5bGUgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL21hcmsuaHRtbCNzdHlsZS1jb25maWcpLlxuICAgKlxuICAgKi9cbiAgZmlsbGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVmYXVsdCBjb2xvci4gIE5vdGUgdGhhdCBgZmlsbGAgYW5kIGBzdHJva2VgIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgY29sb3JgIGFuZCB3aWxsIG92ZXJyaWRlIGBjb2xvcmAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNDY4MmI0O1wiPiYjOTYzMjs8L3NwYW4+IGBcIiM0NjgyYjRcImBcbiAgICpcbiAgICogX19Ob3RlOl9fIFRoaXMgcHJvcGVydHkgY2Fubm90IGJlIHVzZWQgaW4gYSBbc3R5bGUgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL21hcmsuaHRtbCNzdHlsZS1jb25maWcpLlxuICAgKi9cbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFyQmluU3BhY2luZ01peGlucyB7XG4gIC8qKlxuICAgKiBPZmZzZXQgYmV0d2VlbiBiYXJzIGZvciBiaW5uZWQgZmllbGQuICBJZGVhbCB2YWx1ZSBmb3IgdGhpcyBpcyBlaXRoZXIgMCAoUHJlZmVycmVkIGJ5IHN0YXRpc3RpY2lhbnMpIG9yIDEgKFZlZ2EtTGl0ZSBEZWZhdWx0LCBEMyBleGFtcGxlIHN0eWxlKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAxYFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBiaW5TcGFjaW5nPzogbnVtYmVyO1xufVxuXG5cbi8qKiBAaGlkZSAqL1xuZXhwb3J0IHR5cGUgSGlkZGVuQ29tcG9zaXRlID0gQ29tcG9zaXRlTWFyayB8IENvbXBvc2l0ZU1hcmtEZWY7XG5cbmV4cG9ydCB0eXBlIEFueU1hcmsgPVxuICBIaWRkZW5Db21wb3NpdGUgfFxuICBNYXJrIHxcbiAgTWFya0RlZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTWFya0RlZihtYXJrOiBBbnlNYXJrKTogbWFyayBpcyAoTWFya0RlZiB8IENvbXBvc2l0ZU1hcmtEZWYpIHtcbiAgcmV0dXJuIG1hcmtbJ3R5cGUnXTtcbn1cblxuY29uc3QgUFJJTUlUSVZFX01BUktfSU5ERVggPSB0b1NldChQUklNSVRJVkVfTUFSS1MpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmVNYXJrKG1hcms6IENvbXBvc2l0ZU1hcmsgfCBDb21wb3NpdGVNYXJrRGVmIHwgTWFyayB8IE1hcmtEZWYpOiBtYXJrIGlzIE1hcmsge1xuICBjb25zdCBtYXJrVHlwZSA9IGlzTWFya0RlZihtYXJrKSA/IG1hcmsudHlwZSA6IG1hcms7XG4gIHJldHVybiBtYXJrVHlwZSBpbiBQUklNSVRJVkVfTUFSS19JTkRFWDtcbn1cblxuZXhwb3J0IGNvbnN0IFNUUk9LRV9DT05GSUcgPSBbJ3N0cm9rZScsICdzdHJva2VXaWR0aCcsXG4gICdzdHJva2VEYXNoJywgJ3N0cm9rZURhc2hPZmZzZXQnLCAnc3Ryb2tlT3BhY2l0eSddO1xuXG5leHBvcnQgY29uc3QgRklMTF9DT05GSUcgPSBbJ2ZpbGwnLCAnZmlsbE9wYWNpdHknXTtcblxuZXhwb3J0IGNvbnN0IEZJTExfU1RST0tFX0NPTkZJRyA9IFtdLmNvbmNhdChTVFJPS0VfQ09ORklHLCBGSUxMX0NPTkZJRyk7XG5cbmV4cG9ydCBjb25zdCBWTF9PTkxZX01BUktfQ09ORklHX1BST1BFUlRJRVM6IChrZXlvZiBNYXJrQ29uZmlnKVtdID0gWydmaWxsZWQnLCAnY29sb3InXTtcblxuZXhwb3J0IGNvbnN0IFZMX09OTFlfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVg6IHtcbiAgW2sgaW4gKHR5cGVvZiBQUklNSVRJVkVfTUFSS1NbMF0pXT86IChrZXlvZiBNYXJrQ29uZmlnTWl4aW5zW2tdKVtdXG59ID0ge1xuICBhcmVhOiBbJ2xpbmUnLCAncG9pbnQnXSxcbiAgYmFyOiBbJ2JpblNwYWNpbmcnLCAnY29udGludW91c0JhbmRTaXplJywgJ2Rpc2NyZXRlQmFuZFNpemUnXSxcbiAgbGluZTogWydwb2ludCddLFxuICB0ZXh0OiBbJ3Nob3J0VGltZUxhYmVscyddLFxuICB0aWNrOiBbJ2JhbmRTaXplJywgJ3RoaWNrbmVzcyddXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcmtDb25maWc6IE1hcmtDb25maWcgPSB7XG4gIGNvbG9yOiAnIzRjNzhhOCcsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtDb25maWdNaXhpbnMge1xuICAvKiogTWFyayBDb25maWcgKi9cbiAgbWFyaz86IE1hcmtDb25maWc7XG5cbiAgLy8gTUFSSy1TUEVDSUZJQyBDT05GSUdTXG4gIC8qKiBBcmVhLVNwZWNpZmljIENvbmZpZyAqL1xuICBhcmVhPzogQXJlYUNvbmZpZztcblxuICAvKiogQmFyLVNwZWNpZmljIENvbmZpZyAqL1xuICBiYXI/OiBCYXJDb25maWc7XG5cbiAgLyoqIENpcmNsZS1TcGVjaWZpYyBDb25maWcgKi9cbiAgY2lyY2xlPzogTWFya0NvbmZpZztcblxuICAvKiogTGluZS1TcGVjaWZpYyBDb25maWcgKi9cbiAgbGluZT86IExpbmVDb25maWc7XG5cbiAgLyoqIFBvaW50LVNwZWNpZmljIENvbmZpZyAqL1xuICBwb2ludD86IE1hcmtDb25maWc7XG5cbiAgLyoqIFJlY3QtU3BlY2lmaWMgQ29uZmlnICovXG4gIHJlY3Q/OiBNYXJrQ29uZmlnO1xuXG4gIC8qKiBSdWxlLVNwZWNpZmljIENvbmZpZyAqL1xuICBydWxlPzogTWFya0NvbmZpZztcblxuICAvKiogU3F1YXJlLVNwZWNpZmljIENvbmZpZyAqL1xuICBzcXVhcmU/OiBNYXJrQ29uZmlnO1xuXG4gIC8qKiBUZXh0LVNwZWNpZmljIENvbmZpZyAqL1xuICB0ZXh0PzogVGV4dENvbmZpZztcblxuICAvKiogVGljay1TcGVjaWZpYyBDb25maWcgKi9cbiAgdGljaz86IFRpY2tDb25maWc7XG5cbiAgLyoqIFRyYWlsLVNwZWNpZmljIENvbmZpZyAqL1xuICB0cmFpbD86IExpbmVDb25maWc7XG5cbiAgLyoqIEdlb3NoYXBlLVNwZWNpZmljIENvbmZpZyAqL1xuICBnZW9zaGFwZT86IE1hcmtDb25maWc7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBCYXJDb25maWcgZXh0ZW5kcyBCYXJCaW5TcGFjaW5nTWl4aW5zLCBNYXJrQ29uZmlnIHtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgc2l6ZSBvZiB0aGUgYmFycyBvbiBjb250aW51b3VzIHNjYWxlcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA1YFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBjb250aW51b3VzQmFuZFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIG9mIHRoZSBiYXJzLiAgSWYgdW5zcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNpemUgaXMgIGBiYW5kU2l6ZS0xYCxcbiAgICogd2hpY2ggcHJvdmlkZXMgMSBwaXhlbCBvZmZzZXQgYmV0d2VlbiBiYXJzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBkaXNjcmV0ZUJhbmRTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50T3ZlcmxheU1peGlucyB7XG4gIC8qKlxuICAgKiBBIGZsYWcgZm9yIG92ZXJsYXlpbmcgcG9pbnRzIG9uIHRvcCBvZiBsaW5lIG9yIGFyZWEgbWFya3MsIG9yIGFuIG9iamVjdCBkZWZpbmluZyB0aGUgcHJvcGVydGllcyBvZiB0aGUgb3ZlcmxheWVkIHBvaW50cy5cbiAgICpcbiAgICogLSBJZiB0aGlzIHByb3BlcnR5IGlzIGBcInRyYW5zcGFyZW50XCJgLCB0cmFuc3BhcmVudCBwb2ludHMgd2lsbCBiZSB1c2VkIChmb3IgZW5oYW5jaW5nIHRvb2x0aXBzIGFuZCBzZWxlY3Rpb25zKS5cbiAgICpcbiAgICogLSBJZiB0aGlzIHByb3BlcnR5IGlzIGFuIGVtcHR5IG9iamVjdCAoYHt9YCkgb3IgYHRydWVgLCBmaWxsZWQgcG9pbnRzIHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogLSBJZiB0aGlzIHByb3BlcnR5IGlzIGBmYWxzZWAsIG5vIHBvaW50cyB3b3VsZCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGxpbmUgb3IgYXJlYSBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqL1xuICBwb2ludD86IGJvb2xlYW4gfCBNYXJrQ29uZmlnIHwgJ3RyYW5zcGFyZW50Jztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5lQ29uZmlnIGV4dGVuZHMgTWFya0NvbmZpZywgUG9pbnRPdmVybGF5TWl4aW5zIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGluZU92ZXJsYXlNaXhpbnMge1xuICAvKipcbiAgICogQSBmbGFnIGZvciBvdmVybGF5aW5nIGxpbmUgb24gdG9wIG9mIGFyZWEgbWFya3MsIG9yIGFuIG9iamVjdCBkZWZpbmluZyB0aGUgcHJvcGVydGllcyBvZiB0aGUgb3ZlcmxheWVkIGxpbmVzLlxuICAgKlxuICAgKiAtIElmIHRoaXMgdmFsdWUgaXMgYW4gZW1wdHkgb2JqZWN0IChge31gKSBvciBgdHJ1ZWAsIGxpbmVzIHdpdGggZGVmYXVsdCBwcm9wZXJ0aWVzIHdpbGwgYmUgdXNlZC5cbiAgICpcbiAgICogLSBJZiB0aGlzIHZhbHVlIGlzIGBmYWxzZWAsIG5vIGxpbmVzIHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYXJlYSBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqL1xuICBsaW5lPzogYm9vbGVhbiB8IE1hcmtDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJlYUNvbmZpZyBleHRlbmRzIE1hcmtDb25maWcsIFBvaW50T3ZlcmxheU1peGlucywgTGluZU92ZXJsYXlNaXhpbnMge31cblxuZXhwb3J0IGludGVyZmFjZSBUaWNrVGhpY2tuZXNzTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoaWNrbmVzcyBvZiB0aGUgdGljayBtYXJrLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGAxYFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICB0aGlja25lc3M/OiBudW1iZXI7XG59XG5cbi8vIFBvaW50L0xpbmUgT3ZlcmxheU1peGlucyBhcmUgb25seSBmb3IgYXJlYSwgbGluZSwgYW5kIHRyYWlsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGRlY2xhcmUgbXVsdGlwbGUgdHlwZXMgb2YgTWFya0RlZlxuZXhwb3J0IGludGVyZmFjZSBNYXJrRGVmIGV4dGVuZHMgQmFyQmluU3BhY2luZ01peGlucywgTWFya0NvbmZpZywgUG9pbnRPdmVybGF5TWl4aW5zLCBMaW5lT3ZlcmxheU1peGlucywgVGlja1RoaWNrbmVzc01peGlucyB7XG4gIC8qKlxuICAgKiBUaGUgbWFyayB0eXBlLlxuICAgKiBPbmUgb2YgYFwiYmFyXCJgLCBgXCJjaXJjbGVcImAsIGBcInNxdWFyZVwiYCwgYFwidGlja1wiYCwgYFwibGluZVwiYCxcbiAgICogYFwiYXJlYVwiYCwgYFwicG9pbnRcImAsIGBcImdlb3NoYXBlXCJgLCBgXCJydWxlXCJgLCBhbmQgYFwidGV4dFwiYC5cbiAgICovXG4gIHR5cGU6IE1hcms7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MgaW5kaWNhdGluZyB0aGUgbmFtZSBvZiBjdXN0b20gc3R5bGVzIHRvIGFwcGx5IHRvIHRoZSBtYXJrLiBBIHN0eWxlIGlzIGEgbmFtZWQgY29sbGVjdGlvbiBvZiBtYXJrIHByb3BlcnR5IGRlZmF1bHRzIGRlZmluZWQgd2l0aGluIHRoZSBbc3R5bGUgY29uZmlndXJhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9tYXJrLmh0bWwjc3R5bGUtY29uZmlnKS4gSWYgc3R5bGUgaXMgYW4gYXJyYXksIGxhdGVyIHN0eWxlcyB3aWxsIG92ZXJyaWRlIGVhcmxpZXIgc3R5bGVzLiBBbnkgW21hcmsgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9lbmNvZGluZy5odG1sI21hcmstcHJvcCkgZXhwbGljaXRseSBkZWZpbmVkIHdpdGhpbiB0aGUgYGVuY29kaW5nYCB3aWxsIG92ZXJyaWRlIGEgc3R5bGUgZGVmYXVsdC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIFRoZSBtYXJrJ3MgbmFtZS4gIEZvciBleGFtcGxlLCBhIGJhciBtYXJrIHdpbGwgaGF2ZSBzdHlsZSBgXCJiYXJcImAgYnkgZGVmYXVsdC5cbiAgICogX19Ob3RlOl9fIEFueSBzcGVjaWZpZWQgc3R5bGUgd2lsbCBhdWdtZW50IHRoZSBkZWZhdWx0IHN0eWxlLiBGb3IgZXhhbXBsZSwgYSBiYXIgbWFyayB3aXRoIGBcInN0eWxlXCI6IFwiZm9vXCJgIHdpbGwgcmVjZWl2ZSBmcm9tIGBjb25maWcuc3R5bGUuYmFyYCBhbmQgYGNvbmZpZy5zdHlsZS5mb29gICh0aGUgc3BlY2lmaWVkIHN0eWxlIGBcImZvb1wiYCBoYXMgaGlnaGVyIHByZWNlZGVuY2UpLlxuICAgKi9cbiAgc3R5bGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciBhIG1hcmsgYmUgY2xpcHBlZCB0byB0aGUgZW5jbG9zaW5nIGdyb3Vw4oCZcyB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgKi9cbiAgY2xpcD86IGJvb2xlYW47XG5cbiAgLy8gT2Zmc2V0IHByb3BlcnRpZXMgc2hvdWxkIG5vdCBiZSBhIHBhcnQgb2YgY29uZmlnXG5cbiAgLyoqXG4gICAqIE9mZnNldCBmb3IgeC1wb3NpdGlvbi5cbiAgICovXG4gIHhPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9mZnNldCBmb3IgeS1wb3NpdGlvbi5cbiAgICovXG4gIHlPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9mZnNldCBmb3IgeDItcG9zaXRpb24uXG4gICAqL1xuICB4Mk9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogT2Zmc2V0IGZvciB5Mi1wb3NpdGlvbi5cbiAgICovXG4gIHkyT2Zmc2V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEJhckNvbmZpZzogQmFyQ29uZmlnID0ge1xuICBiaW5TcGFjaW5nOiAxLFxuICBjb250aW51b3VzQmFuZFNpemU6IDVcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dENvbmZpZyBleHRlbmRzIE1hcmtDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciBtb250aCBuYW1lcyBhbmQgd2Vla2RheSBuYW1lcyBzaG91bGQgYmUgYWJicmV2aWF0ZWQuXG4gICAqL1xuICBzaG9ydFRpbWVMYWJlbHM/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpY2tDb25maWcgZXh0ZW5kcyBNYXJrQ29uZmlnLCBUaWNrVGhpY2tuZXNzTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgdGlja3MuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgMi8zIG9mIHJhbmdlU3RlcC5cbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgYmFuZFNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0VGlja0NvbmZpZzogVGlja0NvbmZpZyA9IHtcbiAgdGhpY2tuZXNzOiAxXG59O1xuIl19","/**\n * Vega-Lite's singleton logger utility.\n */\nimport { logger, Warn } from 'vega-util';\nimport { stringify } from './util';\n/**\n * Main (default) Vega Logger instance for Vega-Lite\n */\nvar main = logger(Warn);\nvar current = main;\n/**\n * Logger tool for checking if the code throws correct warning\n */\nvar LocalLogger = /** @class */ (function () {\n function LocalLogger() {\n this.warns = [];\n this.infos = [];\n this.debugs = [];\n }\n LocalLogger.prototype.level = function () {\n return this;\n };\n LocalLogger.prototype.warn = function () {\n var _a;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.warns).push.apply(_a, args);\n return this;\n };\n LocalLogger.prototype.info = function () {\n var _a;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.infos).push.apply(_a, args);\n return this;\n };\n LocalLogger.prototype.debug = function () {\n var _a;\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n (_a = this.debugs).push.apply(_a, args);\n return this;\n };\n return LocalLogger;\n}());\nexport { LocalLogger };\nexport function wrap(f) {\n return function () {\n current = new LocalLogger();\n f(current);\n reset();\n };\n}\n/**\n * Set the singleton logger to be a custom logger\n */\nexport function set(newLogger) {\n current = newLogger;\n return current;\n}\n/**\n * Reset the main logger to use the default Vega Logger\n */\nexport function reset() {\n current = main;\n return current;\n}\nexport function warn() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.warn.apply(current, arguments);\n}\nexport function info() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.info.apply(current, arguments);\n}\nexport function debug() {\n var _ = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n _[_i] = arguments[_i];\n }\n current.debug.apply(current, arguments);\n}\n/**\n * Collection of all Vega-Lite Error Messages\n */\nexport var message;\n(function (message) {\n message.INVALID_SPEC = 'Invalid spec';\n // FIT\n message.FIT_NON_SINGLE = 'Autosize \"fit\" only works for single views and layered views.';\n message.CANNOT_FIX_RANGE_STEP_WITH_FIT = 'Cannot use a fixed value of \"rangeStep\" when \"autosize\" is \"fit\".';\n // SELECTION\n function cannotProjectOnChannelWithoutField(channel) {\n return \"Cannot project a selection on encoding channel \\\"\" + channel + \"\\\", which has no field.\";\n }\n message.cannotProjectOnChannelWithoutField = cannotProjectOnChannelWithoutField;\n function nearestNotSupportForContinuous(mark) {\n return \"The \\\"nearest\\\" transform is not supported for \" + mark + \" marks.\";\n }\n message.nearestNotSupportForContinuous = nearestNotSupportForContinuous;\n function selectionNotFound(name) {\n return \"Cannot find a selection named \\\"\" + name + \"\\\"\";\n }\n message.selectionNotFound = selectionNotFound;\n message.SCALE_BINDINGS_CONTINUOUS = 'Scale bindings are currently only supported for scales with unbinned, continuous domains.';\n // REPEAT\n function noSuchRepeatedValue(field) {\n return \"Unknown repeated value \\\"\" + field + \"\\\".\";\n }\n message.noSuchRepeatedValue = noSuchRepeatedValue;\n // CONCAT\n message.CONCAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in concatenated views.';\n // REPEAT\n message.REPEAT_CANNOT_SHARE_AXIS = 'Axes cannot be shared in repeated views.';\n // TITLE\n function cannotSetTitleAnchor(type) {\n return \"Cannot set title \\\"anchor\\\" for a \" + type + \" spec\";\n }\n message.cannotSetTitleAnchor = cannotSetTitleAnchor;\n // DATA\n function unrecognizedParse(p) {\n return \"Unrecognized parse \\\"\" + p + \"\\\".\";\n }\n message.unrecognizedParse = unrecognizedParse;\n function differentParse(field, local, ancestor) {\n return \"An ancestor parsed field \\\"\" + field + \"\\\" as \" + ancestor + \" but a child wants to parse the field as \" + local + \".\";\n }\n message.differentParse = differentParse;\n // TRANSFORMS\n function invalidTransformIgnored(transform) {\n return \"Ignoring an invalid transform: \" + stringify(transform) + \".\";\n }\n message.invalidTransformIgnored = invalidTransformIgnored;\n message.NO_FIELDS_NEEDS_AS = 'If \"from.fields\" is not specified, \"as\" has to be a string that specifies the key to be used for the data from the secondary source.';\n // ENCODING & FACET\n function encodingOverridden(channels) {\n return \"Layer's shared \" + channels.join(',') + \" channel \" + (channels.length === 1 ? 'is' : 'are') + \" overriden\";\n }\n message.encodingOverridden = encodingOverridden;\n function projectionOverridden(opt) {\n var parentProjection = opt.parentProjection, projection = opt.projection;\n return \"Layer's shared projection \" + stringify(parentProjection) + \" is overridden by a child projection \" + stringify(projection) + \".\";\n }\n message.projectionOverridden = projectionOverridden;\n function primitiveChannelDef(channel, type, value) {\n return \"Channel \" + channel + \" is a \" + type + \". Converted to {value: \" + stringify(value) + \"}.\";\n }\n message.primitiveChannelDef = primitiveChannelDef;\n function invalidFieldType(type) {\n return \"Invalid field type \\\"\" + type + \"\\\"\";\n }\n message.invalidFieldType = invalidFieldType;\n function nonZeroScaleUsedWithLengthMark(mark, channel, opt) {\n var scaleText = opt.scaleType ? opt.scaleType + \" scale\" :\n opt.zeroFalse ? 'scale with zero=false' :\n 'scale with custom domain that excludes zero';\n return \"A \" + scaleText + \" is used with \" + mark + \" mark. This can be misleading as the \" + (channel === 'x' ? 'width' : 'height') + \" of the \" + mark + \" can be arbitrary based on the scale domain. You may want to use point mark instead.\";\n }\n message.nonZeroScaleUsedWithLengthMark = nonZeroScaleUsedWithLengthMark;\n function invalidFieldTypeForCountAggregate(type, aggregate) {\n return \"Invalid field type \\\"\" + type + \"\\\" for aggregate: \\\"\" + aggregate + \"\\\", using \\\"quantitative\\\" instead.\";\n }\n message.invalidFieldTypeForCountAggregate = invalidFieldTypeForCountAggregate;\n function invalidAggregate(aggregate) {\n return \"Invalid aggregation operator \\\"\" + aggregate + \"\\\"\";\n }\n message.invalidAggregate = invalidAggregate;\n function emptyOrInvalidFieldType(type, channel, newType) {\n return \"Invalid field type \\\"\" + type + \"\\\" for channel \\\"\" + channel + \"\\\", using \\\"\" + newType + \"\\\" instead.\";\n }\n message.emptyOrInvalidFieldType = emptyOrInvalidFieldType;\n function droppingColor(type, opt) {\n var fill = opt.fill, stroke = opt.stroke;\n return \"Dropping color \" + type + \" as the plot also has \" + (fill && stroke ? 'fill and stroke' : fill ? 'fill' : 'stroke');\n }\n message.droppingColor = droppingColor;\n function emptyFieldDef(fieldDef, channel) {\n return \"Dropping \" + stringify(fieldDef) + \" from channel \\\"\" + channel + \"\\\" since it does not contain data field or value.\";\n }\n message.emptyFieldDef = emptyFieldDef;\n function latLongDeprecated(channel, type, newChannel) {\n return channel + \"-encoding with type \" + type + \" is deprecated. Replacing with \" + newChannel + \"-encoding.\";\n }\n message.latLongDeprecated = latLongDeprecated;\n message.LINE_WITH_VARYING_SIZE = 'Line marks cannot encode size with a non-groupby field. You may want to use trail marks instead.';\n function incompatibleChannel(channel, markOrFacet, when) {\n return channel + \" dropped as it is incompatible with \\\"\" + markOrFacet + \"\\\"\" + (when ? \" when \" + when : '') + \".\";\n }\n message.incompatibleChannel = incompatibleChannel;\n function invalidEncodingChannel(channel) {\n return channel + \"-encoding is dropped as \" + channel + \" is not a valid encoding channel.\";\n }\n message.invalidEncodingChannel = invalidEncodingChannel;\n function facetChannelShouldBeDiscrete(channel) {\n return channel + \" encoding should be discrete (ordinal / nominal / binned).\";\n }\n message.facetChannelShouldBeDiscrete = facetChannelShouldBeDiscrete;\n function discreteChannelCannotEncode(channel, type) {\n return \"Using discrete channel \\\"\" + channel + \"\\\" to encode \\\"\" + type + \"\\\" field can be misleading as it does not encode \" + (type === 'ordinal' ? 'order' : 'magnitude') + \".\";\n }\n message.discreteChannelCannotEncode = discreteChannelCannotEncode;\n // Mark\n message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL = 'Bar mark should not be used with point scale when rangeStep is null. Please use band scale instead.';\n function lineWithRange(hasX2, hasY2) {\n var channels = hasX2 && hasY2 ? 'x2 and y2' : hasX2 ? 'x2' : 'y2';\n return \"Line mark is for continuous lines and thus cannot be used with \" + channels + \". We will use the rule mark (line segments) instead.\";\n }\n message.lineWithRange = lineWithRange;\n function unclearOrientContinuous(mark) {\n return \"Cannot clearly determine orientation for \\\"\" + mark + \"\\\" since both x and y channel encode continuous fields. In this case, we use vertical by default\";\n }\n message.unclearOrientContinuous = unclearOrientContinuous;\n function unclearOrientDiscreteOrEmpty(mark) {\n return \"Cannot clearly determine orientation for \\\"\" + mark + \"\\\" since both x and y channel encode discrete or empty fields.\";\n }\n message.unclearOrientDiscreteOrEmpty = unclearOrientDiscreteOrEmpty;\n function orientOverridden(original, actual) {\n return \"Specified orient \\\"\" + original + \"\\\" overridden with \\\"\" + actual + \"\\\"\";\n }\n message.orientOverridden = orientOverridden;\n // SCALE\n message.CANNOT_UNION_CUSTOM_DOMAIN_WITH_FIELD_DOMAIN = 'custom domain scale cannot be unioned with default field-based domain';\n function cannotUseScalePropertyWithNonColor(prop) {\n return \"Cannot use the scale property \\\"\" + prop + \"\\\" with non-color channel.\";\n }\n message.cannotUseScalePropertyWithNonColor = cannotUseScalePropertyWithNonColor;\n function unaggregateDomainHasNoEffectForRawField(fieldDef) {\n return \"Using unaggregated domain with raw field has no effect (\" + stringify(fieldDef) + \").\";\n }\n message.unaggregateDomainHasNoEffectForRawField = unaggregateDomainHasNoEffectForRawField;\n function unaggregateDomainWithNonSharedDomainOp(aggregate) {\n return \"Unaggregated domain not applicable for \\\"\" + aggregate + \"\\\" since it produces values outside the origin domain of the source data.\";\n }\n message.unaggregateDomainWithNonSharedDomainOp = unaggregateDomainWithNonSharedDomainOp;\n function unaggregatedDomainWithLogScale(fieldDef) {\n return \"Unaggregated domain is currently unsupported for log scale (\" + stringify(fieldDef) + \").\";\n }\n message.unaggregatedDomainWithLogScale = unaggregatedDomainWithLogScale;\n function cannotApplySizeToNonOrientedMark(mark) {\n return \"Cannot apply size to non-oriented mark \\\"\" + mark + \"\\\".\";\n }\n message.cannotApplySizeToNonOrientedMark = cannotApplySizeToNonOrientedMark;\n function rangeStepDropped(channel) {\n return \"rangeStep for \\\"\" + channel + \"\\\" is dropped as top-level \" + (channel === 'x' ? 'width' : 'height') + \" is provided.\";\n }\n message.rangeStepDropped = rangeStepDropped;\n function scaleTypeNotWorkWithChannel(channel, scaleType, defaultScaleType) {\n return \"Channel \\\"\" + channel + \"\\\" does not work with \\\"\" + scaleType + \"\\\" scale. We are using \\\"\" + defaultScaleType + \"\\\" scale instead.\";\n }\n message.scaleTypeNotWorkWithChannel = scaleTypeNotWorkWithChannel;\n function scaleTypeNotWorkWithFieldDef(scaleType, defaultScaleType) {\n return \"FieldDef does not work with \\\"\" + scaleType + \"\\\" scale. We are using \\\"\" + defaultScaleType + \"\\\" scale instead.\";\n }\n message.scaleTypeNotWorkWithFieldDef = scaleTypeNotWorkWithFieldDef;\n function scalePropertyNotWorkWithScaleType(scaleType, propName, channel) {\n return channel + \"-scale's \\\"\" + propName + \"\\\" is dropped as it does not work with \" + scaleType + \" scale.\";\n }\n message.scalePropertyNotWorkWithScaleType = scalePropertyNotWorkWithScaleType;\n function scaleTypeNotWorkWithMark(mark, scaleType) {\n return \"Scale type \\\"\" + scaleType + \"\\\" does not work with mark \\\"\" + mark + \"\\\".\";\n }\n message.scaleTypeNotWorkWithMark = scaleTypeNotWorkWithMark;\n function mergeConflictingProperty(property, propertyOf, v1, v2) {\n return \"Conflicting \" + propertyOf.toString() + \" property \\\"\" + property.toString() + \"\\\" (\" + stringify(v1) + \" and \" + stringify(v2) + \"). Using \" + stringify(v1) + \".\";\n }\n message.mergeConflictingProperty = mergeConflictingProperty;\n function independentScaleMeansIndependentGuide(channel) {\n return \"Setting the scale to be independent for \\\"\" + channel + \"\\\" means we also have to set the guide (axis or legend) to be independent.\";\n }\n message.independentScaleMeansIndependentGuide = independentScaleMeansIndependentGuide;\n function domainSortDropped(sort) {\n return \"Dropping sort property \" + stringify(sort) + \" as unioned domains only support boolean or op 'count'.\";\n }\n message.domainSortDropped = domainSortDropped;\n message.UNABLE_TO_MERGE_DOMAINS = 'Unable to merge domains';\n message.MORE_THAN_ONE_SORT = 'Domains that should be unioned has conflicting sort properties. Sort will be set to true.';\n // AXIS\n message.INVALID_CHANNEL_FOR_AXIS = 'Invalid channel for axis.';\n // STACK\n function cannotStackRangedMark(channel) {\n return \"Cannot stack \\\"\" + channel + \"\\\" if there is already \\\"\" + channel + \"2\\\"\";\n }\n message.cannotStackRangedMark = cannotStackRangedMark;\n function cannotStackNonLinearScale(scaleType) {\n return \"Cannot stack non-linear scale (\" + scaleType + \")\";\n }\n message.cannotStackNonLinearScale = cannotStackNonLinearScale;\n function stackNonSummativeAggregate(aggregate) {\n return \"Stacking is applied even though the aggregate function is non-summative (\\\"\" + aggregate + \"\\\")\";\n }\n message.stackNonSummativeAggregate = stackNonSummativeAggregate;\n // TIMEUNIT\n function invalidTimeUnit(unitName, value) {\n return \"Invalid \" + unitName + \": \" + stringify(value);\n }\n message.invalidTimeUnit = invalidTimeUnit;\n function dayReplacedWithDate(fullTimeUnit) {\n return \"Time unit \\\"\" + fullTimeUnit + \"\\\" is not supported. We are replacing it with \" + fullTimeUnit.replace('day', 'date') + \".\";\n }\n message.dayReplacedWithDate = dayReplacedWithDate;\n function droppedDay(d) {\n return \"Dropping day from datetime \" + stringify(d) + \" as day cannot be combined with other units.\";\n }\n message.droppedDay = droppedDay;\n})(message || (message = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUdILE9BQU8sRUFBQyxNQUFNLEVBQW1CLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQVN4RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBTWpDOztHQUVHO0FBQ0gsSUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLElBQUksT0FBTyxHQUFvQixJQUFJLENBQUM7QUFFcEM7O0dBRUc7QUFDSDtJQUFBO1FBQ1MsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUNsQixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLFdBQU0sR0FBVSxFQUFFLENBQUM7SUFvQjVCLENBQUM7SUFsQlEsMkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDBCQUFJLEdBQVg7O1FBQVksY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDeEIsQ0FBQSxLQUFBLElBQUksQ0FBQyxLQUFLLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDBCQUFJLEdBQVg7O1FBQVksY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDeEIsQ0FBQSxLQUFBLElBQUksQ0FBQyxLQUFLLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxFQUFFO1FBQ3pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLDJCQUFLLEdBQVo7O1FBQWEsY0FBYzthQUFkLFVBQWMsRUFBZCxxQkFBYyxFQUFkLElBQWM7WUFBZCx5QkFBYzs7UUFDekIsQ0FBQSxLQUFBLElBQUksQ0FBQyxNQUFNLENBQUEsQ0FBQyxJQUFJLFdBQUksSUFBSSxF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RkFBMkYsQ0FBQztJQUU5SCxPQUFPO0lBQ00sZ0NBQXdCLEdBQUcsMkJBQTJCLENBQUM7SUFFcEUsUUFBUTtJQUNSLCtCQUFzQyxPQUFnQjtRQUNwRCxPQUFPLG9CQUFpQixPQUFPLGlDQUEwQixPQUFPLFFBQUksQ0FBQztJQUN2RSxDQUFDO0lBRmUsNkJBQXFCLHdCQUVwQyxDQUFBO0lBRUQsbUNBQTBDLFNBQW9CO1FBQzVELE9BQU8sb0NBQWtDLFNBQVMsTUFBRyxDQUFDO0lBQ3hELENBQUM7SUFGZSxpQ0FBeUIsNEJBRXhDLENBQUE7SUFFRCxvQ0FBMkMsU0FBaUI7UUFDMUQsT0FBTyxnRkFBNkUsU0FBUyxRQUFJLENBQUM7SUFDcEcsQ0FBQztJQUZlLGtDQUEwQiw2QkFFekMsQ0FBQTtJQUVELFdBQVc7SUFDWCx5QkFBZ0MsUUFBZ0IsRUFBRSxLQUFzQjtRQUN0RSxPQUFPLGFBQVcsUUFBUSxVQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUcsQ0FBQztJQUNwRCxDQUFDO0lBRmUsdUJBQWUsa0JBRTlCLENBQUE7SUFFRCw2QkFBb0MsWUFBb0I7UUFDdEQsT0FBTyxpQkFBYyxZQUFZLHNEQUMvQixZQUFZLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBRyxDQUFDO0lBQzNDLENBQUM7SUFIZSwyQkFBbUIsc0JBR2xDLENBQUE7SUFFRCxvQkFBMkIsQ0FBMEI7UUFDbkQsT0FBTyxnQ0FBOEIsU0FBUyxDQUFDLENBQUMsQ0FBQyxpREFBOEMsQ0FBQztJQUNsRyxDQUFDO0lBRmUsa0JBQVUsYUFFekIsQ0FBQTtBQUNILENBQUMsRUE1T2dCLE9BQU8sS0FBUCxPQUFPLFFBNE92QiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVmVnYS1MaXRlJ3Mgc2luZ2xldG9uIGxvZ2dlciB1dGlsaXR5LlxuICovXG5cbmltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtsb2dnZXIsIExvZ2dlckludGVyZmFjZSwgV2Fybn0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgR2VvUG9zaXRpb25DaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtDb21wb3NpdGVNYXJrfSBmcm9tICcuL2NvbXBvc2l0ZW1hcmsnO1xuaW1wb3J0IHtEYXRlVGltZSwgRGF0ZVRpbWVFeHByfSBmcm9tICcuL2RhdGV0aW1lJztcbmltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtQcm9qZWN0aW9ufSBmcm9tICcuL3Byb2plY3Rpb24nO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4vc2NhbGUnO1xuaW1wb3J0IHtUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtzdHJpbmdpZnl9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge1ZnU29ydEZpZWxkfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQge0xvZ2dlckludGVyZmFjZX0gZnJvbSAndmVnYS11dGlsJztcblxuLyoqXG4gKiBNYWluIChkZWZhdWx0KSBWZWdhIExvZ2dlciBpbnN0YW5jZSBmb3IgVmVnYS1MaXRlXG4gKi9cbmNvbnN0IG1haW4gPSBsb2dnZXIoV2Fybik7XG5sZXQgY3VycmVudDogTG9nZ2VySW50ZXJmYWNlID0gbWFpbjtcblxuLyoqXG4gKiBMb2dnZXIgdG9vbCBmb3IgY2hlY2tpbmcgaWYgdGhlIGNvZGUgdGhyb3dzIGNvcnJlY3Qgd2FybmluZ1xuICovXG5leHBvcnQgY2xhc3MgTG9jYWxMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXJJbnRlcmZhY2Uge1xuICBwdWJsaWMgd2FybnM6IGFueVtdID0gW107XG4gIHB1YmxpYyBpbmZvczogYW55W10gPSBbXTtcbiAgcHVibGljIGRlYnVnczogYW55W10gPSBbXTtcblxuICBwdWJsaWMgbGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwdWJsaWMgd2FybiguLi5hcmdzOiBhbnlbXSkge1xuICAgIHRoaXMud2FybnMucHVzaCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBpbmZvKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5pbmZvcy5wdXNoKC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGRlYnVnKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgdGhpcy5kZWJ1Z3MucHVzaCguLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gd3JhcChmOiAobG9nZ2VyOiBMb2NhbExvZ2dlcikgPT4gdm9pZCkge1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGN1cnJlbnQgPSBuZXcgTG9jYWxMb2dnZXIoKTtcbiAgICBmKGN1cnJlbnQgYXMgTG9jYWxMb2dnZXIpO1xuICAgIHJlc2V0KCk7XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHRoZSBzaW5nbGV0b24gbG9nZ2VyIHRvIGJlIGEgY3VzdG9tIGxvZ2dlclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0KG5ld0xvZ2dlcjogTG9nZ2VySW50ZXJmYWNlKSB7XG4gIGN1cnJlbnQgPSBuZXdMb2dnZXI7XG4gIHJldHVybiBjdXJyZW50O1xufVxuXG4vKipcbiAqIFJlc2V0IHRoZSBtYWluIGxvZ2dlciB0byB1c2UgdGhlIGRlZmF1bHQgVmVnYSBMb2dnZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0KCkge1xuICBjdXJyZW50ID0gbWFpbjtcbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKC4uLl86IGFueVtdKSB7XG4gIGN1cnJlbnQud2Fybi5hcHBseShjdXJyZW50LCBhcmd1bWVudHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5mbyguLi5fOiBhbnlbXSkge1xuICBjdXJyZW50LmluZm8uYXBwbHkoY3VycmVudCwgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlYnVnKC4uLl86IGFueVtdKSB7XG4gIGN1cnJlbnQuZGVidWcuYXBwbHkoY3VycmVudCwgYXJndW1lbnRzKTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIGFsbCBWZWdhLUxpdGUgRXJyb3IgTWVzc2FnZXNcbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBtZXNzYWdlIHtcbiAgZXhwb3J0IGNvbnN0IElOVkFMSURfU1BFQyA9ICdJbnZhbGlkIHNwZWMnO1xuXG4gIC8vIEZJVFxuICBleHBvcnQgY29uc3QgRklUX05PTl9TSU5HTEUgPSAnQXV0b3NpemUgXCJmaXRcIiBvbmx5IHdvcmtzIGZvciBzaW5nbGUgdmlld3MgYW5kIGxheWVyZWQgdmlld3MuJztcblxuICBleHBvcnQgY29uc3QgQ0FOTk9UX0ZJWF9SQU5HRV9TVEVQX1dJVEhfRklUID0gJ0Nhbm5vdCB1c2UgYSBmaXhlZCB2YWx1ZSBvZiBcInJhbmdlU3RlcFwiIHdoZW4gXCJhdXRvc2l6ZVwiIGlzIFwiZml0XCIuJztcblxuICAvLyBTRUxFQ1RJT05cbiAgZXhwb3J0IGZ1bmN0aW9uIGNhbm5vdFByb2plY3RPbkNoYW5uZWxXaXRob3V0RmllbGQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgQ2Fubm90IHByb2plY3QgYSBzZWxlY3Rpb24gb24gZW5jb2RpbmcgY2hhbm5lbCBcIiR7Y2hhbm5lbH1cIiwgd2hpY2ggaGFzIG5vIGZpZWxkLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbmVhcmVzdE5vdFN1cHBvcnRGb3JDb250aW51b3VzKG1hcms6IHN0cmluZykge1xuICAgIHJldHVybiBgVGhlIFwibmVhcmVzdFwiIHRyYW5zZm9ybSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke21hcmt9IG1hcmtzLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uTm90Rm91bmQobmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBDYW5ub3QgZmluZCBhIHNlbGVjdGlvbiBuYW1lZCBcIiR7bmFtZX1cImA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgU0NBTEVfQklORElOR1NfQ09OVElOVU9VUyA9ICdTY2FsZSBiaW5kaW5ncyBhcmUgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIGZvciBzY2FsZXMgd2l0aCB1bmJpbm5lZCwgY29udGludW91cyBkb21haW5zLic7XG5cbiAgLy8gUkVQRUFUXG4gIGV4cG9ydCBmdW5jdGlvbiBub1N1Y2hSZXBlYXRlZFZhbHVlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFVua25vd24gcmVwZWF0ZWQgdmFsdWUgXCIke2ZpZWxkfVwiLmA7XG4gIH1cblxuICAvLyBDT05DQVRcbiAgZXhwb3J0IGNvbnN0IENPTkNBVF9DQU5OT1RfU0hBUkVfQVhJUyA9ICdBeGVzIGNhbm5vdCBiZSBzaGFyZWQgaW4gY29uY2F0ZW5hdGVkIHZpZXdzLic7XG5cbiAgLy8gUkVQRUFUXG4gIGV4cG9ydCBjb25zdCBSRVBFQVRfQ0FOTk9UX1NIQVJFX0FYSVMgPSAnQXhlcyBjYW5ub3QgYmUgc2hhcmVkIGluIHJlcGVhdGVkIHZpZXdzLic7XG5cbiAgLy8gVElUTEVcbiAgZXhwb3J0IGZ1bmN0aW9uIGNhbm5vdFNldFRpdGxlQW5jaG9yKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiBgQ2Fubm90IHNldCB0aXRsZSBcImFuY2hvclwiIGZvciBhICR7dHlwZX0gc3BlY2A7XG4gIH1cblxuICAvLyBEQVRBXG4gIGV4cG9ydCBmdW5jdGlvbiB1bnJlY29nbml6ZWRQYXJzZShwOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFVucmVjb2duaXplZCBwYXJzZSBcIiR7cH1cIi5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVudFBhcnNlKGZpZWxkOiBzdHJpbmcsIGxvY2FsOiBzdHJpbmcsIGFuY2VzdG9yOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEFuIGFuY2VzdG9yIHBhcnNlZCBmaWVsZCBcIiR7ZmllbGR9XCIgYXMgJHthbmNlc3Rvcn0gYnV0IGEgY2hpbGQgd2FudHMgdG8gcGFyc2UgdGhlIGZpZWxkIGFzICR7bG9jYWx9LmA7XG4gIH1cblxuICAvLyBUUkFOU0ZPUk1TXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkVHJhbnNmb3JtSWdub3JlZCh0cmFuc2Zvcm06IGFueSkge1xuICAgIHJldHVybiBgSWdub3JpbmcgYW4gaW52YWxpZCB0cmFuc2Zvcm06ICR7c3RyaW5naWZ5KHRyYW5zZm9ybSl9LmA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgTk9fRklFTERTX05FRURTX0FTID0gJ0lmIFwiZnJvbS5maWVsZHNcIiBpcyBub3Qgc3BlY2lmaWVkLCBcImFzXCIgaGFzIHRvIGJlIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBrZXkgdG8gYmUgdXNlZCBmb3IgdGhlIGRhdGEgZnJvbSB0aGUgc2Vjb25kYXJ5IHNvdXJjZS4nO1xuXG4gIC8vIEVOQ09ESU5HICYgRkFDRVRcblxuICBleHBvcnQgZnVuY3Rpb24gZW5jb2RpbmdPdmVycmlkZGVuKGNoYW5uZWxzOiBDaGFubmVsW10pIHtcbiAgICByZXR1cm4gYExheWVyJ3Mgc2hhcmVkICR7Y2hhbm5lbHMuam9pbignLCcpfSBjaGFubmVsICR7Y2hhbm5lbHMubGVuZ3RoID09PSAxID8gJ2lzJyA6ICdhcmUnfSBvdmVycmlkZW5gO1xuICB9XG4gIGV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0aW9uT3ZlcnJpZGRlbihvcHQ6IHtwYXJlbnRQcm9qZWN0aW9uOiBQcm9qZWN0aW9uLCBwcm9qZWN0aW9uOiBQcm9qZWN0aW9ufSkge1xuICAgIGNvbnN0IHtwYXJlbnRQcm9qZWN0aW9uLCBwcm9qZWN0aW9ufSA9IG9wdDtcbiAgICByZXR1cm4gYExheWVyJ3Mgc2hhcmVkIHByb2plY3Rpb24gJHtzdHJpbmdpZnkocGFyZW50UHJvamVjdGlvbil9IGlzIG92ZXJyaWRkZW4gYnkgYSBjaGlsZCBwcm9qZWN0aW9uICR7c3RyaW5naWZ5KHByb2plY3Rpb24pfS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHByaW1pdGl2ZUNoYW5uZWxEZWYoY2hhbm5lbDogQ2hhbm5lbCwgdHlwZTogJ3N0cmluZycgfCAnbnVtYmVyJyB8ICdib29sZWFuJywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gYENoYW5uZWwgJHtjaGFubmVsfSBpcyBhICR7dHlwZX0uIENvbnZlcnRlZCB0byB7dmFsdWU6ICR7c3RyaW5naWZ5KHZhbHVlKX19LmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gaW52YWxpZEZpZWxkVHlwZSh0eXBlOiBUeXBlKSB7XG4gICAgcmV0dXJuIGBJbnZhbGlkIGZpZWxkIHR5cGUgXCIke3R5cGV9XCJgO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG5vblplcm9TY2FsZVVzZWRXaXRoTGVuZ3RoTWFyayhcbiAgICBtYXJrOiAnYmFyJyB8ICdhcmVhJywgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBvcHQ6IHtzY2FsZVR5cGU/OiBTY2FsZVR5cGUsIHplcm9GYWxzZT86IGJvb2xlYW59XG4gICkge1xuICAgIGNvbnN0IHNjYWxlVGV4dCA9IG9wdC5zY2FsZVR5cGUgPyBgJHtvcHQuc2NhbGVUeXBlfSBzY2FsZWAgOlxuICAgICAgb3B0Lnplcm9GYWxzZSA/ICdzY2FsZSB3aXRoIHplcm89ZmFsc2UnIDpcbiAgICAgICdzY2FsZSB3aXRoIGN1c3RvbSBkb21haW4gdGhhdCBleGNsdWRlcyB6ZXJvJztcblxuICAgIHJldHVybiBgQSAke3NjYWxlVGV4dH0gaXMgdXNlZCB3aXRoICR7bWFya30gbWFyay4gVGhpcyBjYW4gYmUgbWlzbGVhZGluZyBhcyB0aGUgJHtjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogJ2hlaWdodCd9IG9mIHRoZSAke21hcmt9IGNhbiBiZSBhcmJpdHJhcnkgYmFzZWQgb24gdGhlIHNjYWxlIGRvbWFpbi4gWW91IG1heSB3YW50IHRvIHVzZSBwb2ludCBtYXJrIGluc3RlYWQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkRmllbGRUeXBlRm9yQ291bnRBZ2dyZWdhdGUodHlwZTogVHlwZSwgYWdncmVnYXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEludmFsaWQgZmllbGQgdHlwZSBcIiR7dHlwZX1cIiBmb3IgYWdncmVnYXRlOiBcIiR7YWdncmVnYXRlfVwiLCB1c2luZyBcInF1YW50aXRhdGl2ZVwiIGluc3RlYWQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkQWdncmVnYXRlKGFnZ3JlZ2F0ZTogQWdncmVnYXRlT3AgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gYEludmFsaWQgYWdncmVnYXRpb24gb3BlcmF0b3IgXCIke2FnZ3JlZ2F0ZX1cImA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1wdHlPckludmFsaWRGaWVsZFR5cGUodHlwZTogVHlwZSB8IHN0cmluZywgY2hhbm5lbDogQ2hhbm5lbCwgbmV3VHlwZTogVHlwZSkge1xuICAgIHJldHVybiBgSW52YWxpZCBmaWVsZCB0eXBlIFwiJHt0eXBlfVwiIGZvciBjaGFubmVsIFwiJHtjaGFubmVsfVwiLCB1c2luZyBcIiR7bmV3VHlwZX1cIiBpbnN0ZWFkLmA7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGRyb3BwaW5nQ29sb3IodHlwZTogJ2VuY29kaW5nJyB8ICdwcm9wZXJ0eScsIG9wdDoge2ZpbGw/OiBib29sZWFuLCBzdHJva2U/OiBib29sZWFufSkge1xuICAgIGNvbnN0IHtmaWxsLCBzdHJva2V9ID0gb3B0O1xuICAgIHJldHVybiBgRHJvcHBpbmcgY29sb3IgJHt0eXBlfSBhcyB0aGUgcGxvdCBhbHNvIGhhcyBgICsgKFxuICAgICAgZmlsbCAmJiBzdHJva2UgPyAnZmlsbCBhbmQgc3Ryb2tlJyA6IGZpbGwgPyAnZmlsbCcgOiAnc3Ryb2tlJ1xuICAgICk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZW1wdHlGaWVsZERlZihmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgRHJvcHBpbmcgJHtzdHJpbmdpZnkoZmllbGREZWYpfSBmcm9tIGNoYW5uZWwgXCIke2NoYW5uZWx9XCIgc2luY2UgaXQgZG9lcyBub3QgY29udGFpbiBkYXRhIGZpZWxkIG9yIHZhbHVlLmA7XG4gIH1cbiAgZXhwb3J0IGZ1bmN0aW9uIGxhdExvbmdEZXByZWNhdGVkKGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IFR5cGUsIG5ld0NoYW5uZWw6IEdlb1Bvc2l0aW9uQ2hhbm5lbCkge1xuICAgIHJldHVybiBgJHtjaGFubmVsfS1lbmNvZGluZyB3aXRoIHR5cGUgJHt0eXBlfSBpcyBkZXByZWNhdGVkLiBSZXBsYWNpbmcgd2l0aCAke25ld0NoYW5uZWx9LWVuY29kaW5nLmA7XG4gIH1cblxuICBleHBvcnQgY29uc3QgTElORV9XSVRIX1ZBUllJTkdfU0laRSA9ICdMaW5lIG1hcmtzIGNhbm5vdCBlbmNvZGUgc2l6ZSB3aXRoIGEgbm9uLWdyb3VwYnkgZmllbGQuIFlvdSBtYXkgd2FudCB0byB1c2UgdHJhaWwgbWFya3MgaW5zdGVhZC4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbmNvbXBhdGlibGVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwsIG1hcmtPckZhY2V0OiBNYXJrIHwgJ2ZhY2V0JyB8IENvbXBvc2l0ZU1hcmssIHdoZW4/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7Y2hhbm5lbH0gZHJvcHBlZCBhcyBpdCBpcyBpbmNvbXBhdGlibGUgd2l0aCBcIiR7bWFya09yRmFjZXR9XCIke3doZW4gPyBgIHdoZW4gJHt3aGVufWAgOiAnJ30uYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkRW5jb2RpbmdDaGFubmVsKGNoYW5uZWw6IHN0cmluZykge1xuICAgIHJldHVybiBgJHtjaGFubmVsfS1lbmNvZGluZyBpcyBkcm9wcGVkIGFzICR7Y2hhbm5lbH0gaXMgbm90IGEgdmFsaWQgZW5jb2RpbmcgY2hhbm5lbC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGZhY2V0Q2hhbm5lbFNob3VsZEJlRGlzY3JldGUoY2hhbm5lbDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGAke2NoYW5uZWx9IGVuY29kaW5nIHNob3VsZCBiZSBkaXNjcmV0ZSAob3JkaW5hbCAvIG5vbWluYWwgLyBiaW5uZWQpLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IFR5cGUpIHtcbiAgICByZXR1cm4gYFVzaW5nIGRpc2NyZXRlIGNoYW5uZWwgXCIke2NoYW5uZWx9XCIgdG8gZW5jb2RlIFwiJHt0eXBlfVwiIGZpZWxkIGNhbiBiZSBtaXNsZWFkaW5nIGFzIGl0IGRvZXMgbm90IGVuY29kZSAke3R5cGUgPT09ICdvcmRpbmFsJyA/ICdvcmRlcicgOiAnbWFnbml0dWRlJ30uYDtcbiAgfVxuXG4gIC8vIE1hcmtcbiAgZXhwb3J0IGNvbnN0IEJBUl9XSVRIX1BPSU5UX1NDQUxFX0FORF9SQU5HRVNURVBfTlVMTCA9ICdCYXIgbWFyayBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBwb2ludCBzY2FsZSB3aGVuIHJhbmdlU3RlcCBpcyBudWxsLiBQbGVhc2UgdXNlIGJhbmQgc2NhbGUgaW5zdGVhZC4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBsaW5lV2l0aFJhbmdlKGhhc1gyOiBib29sZWFuLCBoYXNZMjogYm9vbGVhbikge1xuICAgIGNvbnN0IGNoYW5uZWxzID0gaGFzWDIgJiYgaGFzWTIgPyAneDIgYW5kIHkyJyA6IGhhc1gyID8gJ3gyJyA6ICd5Mic7XG4gICAgcmV0dXJuIGBMaW5lIG1hcmsgaXMgZm9yIGNvbnRpbnVvdXMgbGluZXMgYW5kIHRodXMgY2Fubm90IGJlIHVzZWQgd2l0aCAke2NoYW5uZWxzfS4gV2Ugd2lsbCB1c2UgdGhlIHJ1bGUgbWFyayAobGluZSBzZWdtZW50cykgaW5zdGVhZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuY2xlYXJPcmllbnRDb250aW51b3VzKG1hcms6IE1hcmspIHtcbiAgICByZXR1cm4gYENhbm5vdCBjbGVhcmx5IGRldGVybWluZSBvcmllbnRhdGlvbiBmb3IgXCIke21hcmt9XCIgc2luY2UgYm90aCB4IGFuZCB5IGNoYW5uZWwgZW5jb2RlIGNvbnRpbnVvdXMgZmllbGRzLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB2ZXJ0aWNhbCBieSBkZWZhdWx0YDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiB1bmNsZWFyT3JpZW50RGlzY3JldGVPckVtcHR5KG1hcms6IE1hcmspIHtcbiAgICByZXR1cm4gYENhbm5vdCBjbGVhcmx5IGRldGVybWluZSBvcmllbnRhdGlvbiBmb3IgXCIke21hcmt9XCIgc2luY2UgYm90aCB4IGFuZCB5IGNoYW5uZWwgZW5jb2RlIGRpc2NyZXRlIG9yIGVtcHR5IGZpZWxkcy5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIG9yaWVudE92ZXJyaWRkZW4ob3JpZ2luYWw6IHN0cmluZywgYWN0dWFsOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFNwZWNpZmllZCBvcmllbnQgXCIke29yaWdpbmFsfVwiIG92ZXJyaWRkZW4gd2l0aCBcIiR7YWN0dWFsfVwiYDtcbiAgfVxuXG4gIC8vIFNDQUxFXG4gIGV4cG9ydCBjb25zdCBDQU5OT1RfVU5JT05fQ1VTVE9NX0RPTUFJTl9XSVRIX0ZJRUxEX0RPTUFJTiA9ICdjdXN0b20gZG9tYWluIHNjYWxlIGNhbm5vdCBiZSB1bmlvbmVkIHdpdGggZGVmYXVsdCBmaWVsZC1iYXNlZCBkb21haW4nO1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RVc2VTY2FsZVByb3BlcnR5V2l0aE5vbkNvbG9yKHByb3A6IHN0cmluZykge1xuICAgIHJldHVybiBgQ2Fubm90IHVzZSB0aGUgc2NhbGUgcHJvcGVydHkgXCIke3Byb3B9XCIgd2l0aCBub24tY29sb3IgY2hhbm5lbC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlRG9tYWluSGFzTm9FZmZlY3RGb3JSYXdGaWVsZChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPikge1xuICAgIHJldHVybiBgVXNpbmcgdW5hZ2dyZWdhdGVkIGRvbWFpbiB3aXRoIHJhdyBmaWVsZCBoYXMgbm8gZWZmZWN0ICgke3N0cmluZ2lmeShmaWVsZERlZil9KS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlRG9tYWluV2l0aE5vblNoYXJlZERvbWFpbk9wKGFnZ3JlZ2F0ZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBVbmFnZ3JlZ2F0ZWQgZG9tYWluIG5vdCBhcHBsaWNhYmxlIGZvciBcIiR7YWdncmVnYXRlfVwiIHNpbmNlIGl0IHByb2R1Y2VzIHZhbHVlcyBvdXRzaWRlIHRoZSBvcmlnaW4gZG9tYWluIG9mIHRoZSBzb3VyY2UgZGF0YS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHVuYWdncmVnYXRlZERvbWFpbldpdGhMb2dTY2FsZShmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPikge1xuICAgIHJldHVybiBgVW5hZ2dyZWdhdGVkIGRvbWFpbiBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZm9yIGxvZyBzY2FsZSAoJHtzdHJpbmdpZnkoZmllbGREZWYpfSkuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RBcHBseVNpemVUb05vbk9yaWVudGVkTWFyayhtYXJrOiBNYXJrKSB7XG4gICAgcmV0dXJuIGBDYW5ub3QgYXBwbHkgc2l6ZSB0byBub24tb3JpZW50ZWQgbWFyayBcIiR7bWFya31cIi5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHJhbmdlU3RlcERyb3BwZWQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgcmFuZ2VTdGVwIGZvciBcIiR7Y2hhbm5lbH1cIiBpcyBkcm9wcGVkIGFzIHRvcC1sZXZlbCAke1xuICAgICAgY2hhbm5lbCA9PT0gJ3gnID8gJ3dpZHRoJyA6ICdoZWlnaHQnfSBpcyBwcm92aWRlZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoQ2hhbm5lbChjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgZGVmYXVsdFNjYWxlVHlwZTogU2NhbGVUeXBlKSB7XG4gICAgcmV0dXJuIGBDaGFubmVsIFwiJHtjaGFubmVsfVwiIGRvZXMgbm90IHdvcmsgd2l0aCBcIiR7c2NhbGVUeXBlfVwiIHNjYWxlLiBXZSBhcmUgdXNpbmcgXCIke2RlZmF1bHRTY2FsZVR5cGV9XCIgc2NhbGUgaW5zdGVhZC5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoRmllbGREZWYoc2NhbGVUeXBlOiBTY2FsZVR5cGUsIGRlZmF1bHRTY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICAgIHJldHVybiBgRmllbGREZWYgZG9lcyBub3Qgd29yayB3aXRoIFwiJHtzY2FsZVR5cGV9XCIgc2NhbGUuIFdlIGFyZSB1c2luZyBcIiR7ZGVmYXVsdFNjYWxlVHlwZX1cIiBzY2FsZSBpbnN0ZWFkLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc2NhbGVQcm9wZXJ0eU5vdFdvcmtXaXRoU2NhbGVUeXBlKHNjYWxlVHlwZTogU2NhbGVUeXBlLCBwcm9wTmFtZTogc3RyaW5nLCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgcmV0dXJuIGAke2NoYW5uZWx9LXNjYWxlJ3MgXCIke3Byb3BOYW1lfVwiIGlzIGRyb3BwZWQgYXMgaXQgZG9lcyBub3Qgd29yayB3aXRoICR7c2NhbGVUeXBlfSBzY2FsZS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhtYXJrOiBNYXJrLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICAgIHJldHVybiBgU2NhbGUgdHlwZSBcIiR7c2NhbGVUeXBlfVwiIGRvZXMgbm90IHdvcmsgd2l0aCBtYXJrIFwiJHttYXJrfVwiLmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25mbGljdGluZ1Byb3BlcnR5PFQ+KHByb3BlcnR5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHByb3BlcnR5T2Y6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdjE6IFQsIHYyOiBUKSB7XG4gICAgcmV0dXJuIGBDb25mbGljdGluZyAke3Byb3BlcnR5T2YudG9TdHJpbmcoKX0gcHJvcGVydHkgXCIke3Byb3BlcnR5LnRvU3RyaW5nKCl9XCIgKCR7c3RyaW5naWZ5KHYxKX0gYW5kICR7c3RyaW5naWZ5KHYyKX0pLiAgVXNpbmcgJHtzdHJpbmdpZnkodjEpfS5gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGluZGVwZW5kZW50U2NhbGVNZWFuc0luZGVwZW5kZW50R3VpZGUoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgU2V0dGluZyB0aGUgc2NhbGUgdG8gYmUgaW5kZXBlbmRlbnQgZm9yIFwiJHtjaGFubmVsfVwiIG1lYW5zIHdlIGFsc28gaGF2ZSB0byBzZXQgdGhlIGd1aWRlIChheGlzIG9yIGxlZ2VuZCkgdG8gYmUgaW5kZXBlbmRlbnQuYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBkb21haW5Tb3J0RHJvcHBlZChzb3J0OiBWZ1NvcnRGaWVsZCkge1xuICAgIHJldHVybiBgRHJvcHBpbmcgc29ydCBwcm9wZXJ0eSAke3N0cmluZ2lmeShzb3J0KX0gYXMgdW5pb25lZCBkb21haW5zIG9ubHkgc3VwcG9ydCBib29sZWFuIG9yIG9wICdjb3VudCcuYDtcbiAgfVxuXG4gIGV4cG9ydCBjb25zdCBVTkFCTEVfVE9fTUVSR0VfRE9NQUlOUyA9ICdVbmFibGUgdG8gbWVyZ2UgZG9tYWlucyc7XG5cbiAgZXhwb3J0IGNvbnN0IE1PUkVfVEhBTl9PTkVfU09SVCA9ICdEb21haW5zIHRoYXQgc2hvdWxkIGJlIHVuaW9uZWQgaGFzIGNvbmZsaWN0aW5nIHNvcnQgcHJvcGVydGllcy4gU29ydCB3aWxsIGJlIHNldCB0byB0cnVlLic7XG5cbiAgLy8gQVhJU1xuICBleHBvcnQgY29uc3QgSU5WQUxJRF9DSEFOTkVMX0ZPUl9BWElTID0gJ0ludmFsaWQgY2hhbm5lbCBmb3IgYXhpcy4nO1xuXG4gIC8vIFNUQUNLXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RTdGFja1JhbmdlZE1hcmsoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiBgQ2Fubm90IHN0YWNrIFwiJHtjaGFubmVsfVwiIGlmIHRoZXJlIGlzIGFscmVhZHkgXCIke2NoYW5uZWx9MlwiYDtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjYW5ub3RTdGFja05vbkxpbmVhclNjYWxlKHNjYWxlVHlwZTogU2NhbGVUeXBlKSB7XG4gICAgcmV0dXJuIGBDYW5ub3Qgc3RhY2sgbm9uLWxpbmVhciBzY2FsZSAoJHtzY2FsZVR5cGV9KWA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gc3RhY2tOb25TdW1tYXRpdmVBZ2dyZWdhdGUoYWdncmVnYXRlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFN0YWNraW5nIGlzIGFwcGxpZWQgZXZlbiB0aG91Z2ggdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBpcyBub24tc3VtbWF0aXZlIChcIiR7YWdncmVnYXRlfVwiKWA7XG4gIH1cblxuICAvLyBUSU1FVU5JVFxuICBleHBvcnQgZnVuY3Rpb24gaW52YWxpZFRpbWVVbml0KHVuaXROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICByZXR1cm4gYEludmFsaWQgJHt1bml0TmFtZX06ICR7c3RyaW5naWZ5KHZhbHVlKX1gO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGRheVJlcGxhY2VkV2l0aERhdGUoZnVsbFRpbWVVbml0OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYFRpbWUgdW5pdCBcIiR7ZnVsbFRpbWVVbml0fVwiIGlzIG5vdCBzdXBwb3J0ZWQuIFdlIGFyZSByZXBsYWNpbmcgaXQgd2l0aCAke1xuICAgICAgZnVsbFRpbWVVbml0LnJlcGxhY2UoJ2RheScsICdkYXRlJyl9LmA7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gZHJvcHBlZERheShkOiBEYXRlVGltZSB8IERhdGVUaW1lRXhwcikge1xuICAgIHJldHVybiBgRHJvcHBpbmcgZGF5IGZyb20gZGF0ZXRpbWUgJHtzdHJpbmdpZnkoZCl9IGFzIGRheSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB1bml0cy5gO1xuICB9XG59XG5cbiJdfQ==","// DateTime definition object\nimport { isNumber } from 'vega-util';\nimport * as log from './log';\nimport { duplicate, keys } from './util';\n/*\n * A designated year that starts on Sunday.\n */\nvar SUNDAY_YEAR = 2006;\nexport function isDateTime(o) {\n return !!o && (!!o.year || !!o.quarter || !!o.month || !!o.date || !!o.day ||\n !!o.hours || !!o.minutes || !!o.seconds || !!o.milliseconds);\n}\nexport var MONTHS = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\nexport var SHORT_MONTHS = MONTHS.map(function (m) { return m.substr(0, 3); });\nexport var DAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\nexport var SHORT_DAYS = DAYS.map(function (d) { return d.substr(0, 3); });\nfunction normalizeQuarter(q) {\n if (isNumber(q)) {\n if (q > 4) {\n log.warn(log.message.invalidTimeUnit('quarter', q));\n }\n // We accept 1-based quarter, so need to readjust to 0-based quarter\n return (q - 1) + '';\n }\n else {\n // Invalid quarter\n throw new Error(log.message.invalidTimeUnit('quarter', q));\n }\n}\nfunction normalizeMonth(m) {\n if (isNumber(m)) {\n // We accept 1-based month, so need to readjust to 0-based month\n return (m - 1) + '';\n }\n else {\n var lowerM = m.toLowerCase();\n var monthIndex = MONTHS.indexOf(lowerM);\n if (monthIndex !== -1) {\n return monthIndex + ''; // 0 for january, ...\n }\n var shortM = lowerM.substr(0, 3);\n var shortMonthIndex = SHORT_MONTHS.indexOf(shortM);\n if (shortMonthIndex !== -1) {\n return shortMonthIndex + '';\n }\n // Invalid month\n throw new Error(log.message.invalidTimeUnit('month', m));\n }\n}\nfunction normalizeDay(d) {\n if (isNumber(d)) {\n // mod so that this can be both 0-based where 0 = sunday\n // and 1-based where 7=sunday\n return (d % 7) + '';\n }\n else {\n var lowerD = d.toLowerCase();\n var dayIndex = DAYS.indexOf(lowerD);\n if (dayIndex !== -1) {\n return dayIndex + ''; // 0 for january, ...\n }\n var shortD = lowerD.substr(0, 3);\n var shortDayIndex = SHORT_DAYS.indexOf(shortD);\n if (shortDayIndex !== -1) {\n return shortDayIndex + '';\n }\n // Invalid day\n throw new Error(log.message.invalidTimeUnit('day', d));\n }\n}\n/**\n * Return Vega Expression for a particular date time.\n * @param d\n * @param normalize whether to normalize quarter, month, day.\n */\nexport function dateTimeExpr(d, normalize) {\n if (normalize === void 0) { normalize = false; }\n var units = [];\n if (normalize && d.day !== undefined) {\n if (keys(d).length > 1) {\n log.warn(log.message.droppedDay(d));\n d = duplicate(d);\n delete d.day;\n }\n }\n if (d.year !== undefined) {\n units.push(d.year);\n }\n else if (d.day !== undefined) {\n // Set year to 2006 for working with day since January 1 2006 is a Sunday\n units.push(SUNDAY_YEAR);\n }\n else {\n units.push(0);\n }\n if (d.month !== undefined) {\n var month = normalize ? normalizeMonth(d.month) : d.month;\n units.push(month);\n }\n else if (d.quarter !== undefined) {\n var quarter = normalize ? normalizeQuarter(d.quarter) : d.quarter;\n units.push(quarter + '*3');\n }\n else {\n units.push(0); // months start at zero in JS\n }\n if (d.date !== undefined) {\n units.push(d.date);\n }\n else if (d.day !== undefined) {\n // HACK: Day only works as a standalone unit\n // This is only correct because we always set year to 2006 for day\n var day = normalize ? normalizeDay(d.day) : d.day;\n units.push(day + '+1');\n }\n else {\n units.push(1); // Date starts at 1 in JS\n }\n // Note: can't use TimeUnit enum here as importing it will create\n // circular dependency problem!\n for (var _i = 0, _a = ['hours', 'minutes', 'seconds', 'milliseconds']; _i < _a.length; _i++) {\n var timeUnit = _a[_i];\n if (d[timeUnit] !== undefined) {\n units.push(d[timeUnit]);\n }\n else {\n units.push(0);\n }\n }\n if (d.utc) {\n return \"utc(\" + units.join(', ') + \")\";\n }\n else {\n return \"datetime(\" + units.join(', ') + \")\";\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0ZXRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsNkJBQTZCO0FBRTdCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFDN0IsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFHdkM7O0dBRUc7QUFDSCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7QUE4R3pCLE1BQU0scUJBQXFCLENBQU07SUFDL0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO1FBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxJQUFNLE1BQU0sR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDakosTUFBTSxDQUFDLElBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxD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U0FDekI7YUFBTTtZQUNMLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDZjtLQUNGO0lBRUQsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQ1QsT0FBTyxTQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUcsQ0FBQztLQUNuQztTQUFNO1FBQ0wsT0FBTyxjQUFZLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUcsQ0FBQztLQUN4QztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEYXRlVGltZSBkZWZpbml0aW9uIG9iamVjdFxuXG5pbXBvcnQge2lzTnVtYmVyfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7ZHVwbGljYXRlLCBrZXlzfSBmcm9tICcuL3V0aWwnO1xuXG5cbi8qXG4gKiBBIGRlc2lnbmF0ZWQgeWVhciB0aGF0IHN0YXJ0cyBvbiBTdW5kYXkuXG4gKi9cbmNvbnN0IFNVTkRBWV9ZRUFSID0gMjAwNjtcblxuLyoqXG4gKiBAbWluaW11bSAxXG4gKiBAbWF4aW11bSAxMlxuICogQFRKUy10eXBlIGludGVnZXJcbiAqL1xuZXhwb3J0IHR5cGUgTW9udGggPSBudW1iZXI7XG5cbi8qKlxuICogQG1pbmltdW0gMVxuICogQG1heGltdW0gN1xuICovXG5leHBvcnQgdHlwZSBEYXkgPSBudW1iZXI7XG5cbi8qKlxuICogT2JqZWN0IGZvciBkZWZpbmluZyBkYXRldGltZSBpbiBWZWdhLUxpdGUgRmlsdGVyLlxuICogSWYgYm90aCBtb250aCBhbmQgcXVhcnRlciBhcmUgcHJvdmlkZWQsIG1vbnRoIGhhcyBoaWdoZXIgcHJlY2VkZW5jZS5cbiAqIGBkYXlgIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIGRhdGUuXG4gKiBXZSBhY2NlcHQgc3RyaW5nIGZvciBtb250aCBhbmQgZGF5IG5hbWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lIHtcbiAgLyoqXG4gICAqIEludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSB5ZWFyLlxuICAgKiBAVEpTLXR5cGUgaW50ZWdlclxuICAgKi9cbiAgeWVhcj86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIHF1YXJ0ZXIgb2YgdGhlIHllYXIgKGZyb20gMS00KS5cbiAgICogQG1pbmltdW0gMVxuICAgKiBAbWF4aW11bSA0XG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBxdWFydGVyPzogbnVtYmVyO1xuXG4gIC8qKiBPbmUgb2Y6ICgxKSBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbW9udGggZnJvbSBgMWAtYDEyYC4gYDFgIHJlcHJlc2VudHMgSmFudWFyeTsgICgyKSBjYXNlLWluc2Vuc2l0aXZlIG1vbnRoIG5hbWUgKGUuZy4sIGBcIkphbnVhcnlcImApOyAgKDMpIGNhc2UtaW5zZW5zaXRpdmUsIDMtY2hhcmFjdGVyIHNob3J0IG1vbnRoIG5hbWUgKGUuZy4sIGBcIkphblwiYCkuICovXG4gIG1vbnRoPzogTW9udGggfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEludGVnZXIgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGZyb20gMS0zMS5cbiAgICogQG1pbmltdW0gMVxuICAgKiBAbWF4aW11bSAzMVxuICAgKiBAVEpTLXR5cGUgaW50ZWdlclxuICAgKi9cbiAgZGF0ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVmFsdWUgcmVwcmVzZW50aW5nIHRoZSBkYXkgb2YgYSB3ZWVrLiAgVGhpcyBjYW4gYmUgb25lIG9mOiAoMSkgaW50ZWdlciB2YWx1ZSAtLSBgMWAgcmVwcmVzZW50cyBNb25kYXk7ICgyKSBjYXNlLWluc2Vuc2l0aXZlIGRheSBuYW1lIChlLmcuLCBgXCJNb25kYXlcImApOyAgKDMpIGNhc2UtaW5zZW5zaXRpdmUsIDMtY2hhcmFjdGVyIHNob3J0IGRheSBuYW1lIChlLmcuLCBgXCJNb25cImApLiAgIDxici8+ICoqV2FybmluZzoqKiBBIERhdGVUaW1lIGRlZmluaXRpb24gb2JqZWN0IHdpdGggYGRheWAqKiBzaG91bGQgbm90IGJlIGNvbWJpbmVkIHdpdGggYHllYXJgLCBgcXVhcnRlcmAsIGBtb250aGAsIG9yIGBkYXRlYC5cbiAgICovXG4gIGRheT86IERheSB8IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGhvdXIgb2YgYSBkYXkgZnJvbSAwLTIzLlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDIzXG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBob3Vycz86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIG1pbnV0ZSBzZWdtZW50IG9mIHRpbWUgZnJvbSAwLTU5LlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDU5XG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBtaW51dGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgc2Vjb25kIHNlZ21lbnQgKDAtNTkpIG9mIGEgdGltZSB2YWx1ZVxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDU5XG4gICAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gICAqL1xuICBzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbWlsbGlzZWNvbmQgc2VnbWVudCBvZiB0aW1lLlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDk5OVxuICAgKiBAVEpTLXR5cGUgaW50ZWdlclxuICAgKi9cbiAgbWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIGRhdGUgdGltZSBpcyBpbiB1dGMgdGltZS4gSWYgZmFsc2UsIHRoZSBkYXRlIHRpbWUgaXMgaW4gbG9jYWwgdGltZVxuICAgKi9cbiAgdXRjPzogYm9vbGVhbjtcbn1cblxuXG4vKipcbiAqIEludGVybmFsIE9iamVjdCBmb3IgZGVmaW5pbmcgZGF0ZXRpbWUgZXhwcmVzc2lvbnMuXG4gKiBUaGlzIGlzIGFuIGV4cHJlc3Npb24gdmVyc2lvbiBvZiBEYXRlVGltZS5cbiAqIElmIGJvdGggbW9udGggYW5kIHF1YXJ0ZXIgYXJlIHByb3ZpZGVkLCBtb250aCBoYXMgaGlnaGVyIHByZWNlZGVuY2UuXG4gKiBgZGF5YCBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciBkYXRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGVUaW1lRXhwciB7XG4gIHllYXI/OiBzdHJpbmc7XG4gIHF1YXJ0ZXI/OiBzdHJpbmc7XG4gIG1vbnRoPzogc3RyaW5nO1xuICBkYXRlPzogc3RyaW5nO1xuICBkYXk/OiBzdHJpbmc7XG4gIGhvdXJzPzogc3RyaW5nO1xuICBtaW51dGVzPzogc3RyaW5nO1xuICBzZWNvbmRzPzogc3RyaW5nO1xuICBtaWxsaXNlY29uZHM/OiBzdHJpbmc7XG4gIHV0Yz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGVUaW1lKG86IGFueSk6IG8gaXMgRGF0ZVRpbWUge1xuICByZXR1cm4gISFvICYmICghIW8ueWVhciB8fCAhIW8ucXVhcnRlciB8fCAhIW8ubW9udGggfHwgISFvLmRhdGUgfHwgISFvLmRheSB8fFxuICAgICEhby5ob3VycyB8fCAhIW8ubWludXRlcyB8fCAhIW8uc2Vjb25kcyB8fCAhIW8ubWlsbGlzZWNvbmRzKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1PTlRIUyA9IFsnamFudWFyeScsICdmZWJydWFyeScsICdtYXJjaCcsICdhcHJpbCcsICdtYXknLCAnanVuZScsICdqdWx5JywgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2N0b2JlcicsICdub3ZlbWJlcicsICdkZWNlbWJlciddO1xuZXhwb3J0IGNvbnN0IFNIT1JUX01PTlRIUyA9IE1PTlRIUy5tYXAoKG0pID0+IG0uc3Vic3RyKDAsIDMpKTtcblxuZXhwb3J0IGNvbnN0IERBWVMgPSBbJ3N1bmRheScsICdtb25kYXknLCAndHVlc2RheScsICd3ZWRuZXNkYXknLCAndGh1cnNkYXknLCAnZnJpZGF5JywgJ3NhdHVyZGF5J107XG5leHBvcnQgY29uc3QgU0hPUlRfREFZUyA9IERBWVMubWFwKChkKSA9PiBkLnN1YnN0cigwLDMpKTtcblxuZnVuY3Rpb24gbm9ybWFsaXplUXVhcnRlcihxOiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgaWYgKGlzTnVtYmVyKHEpKSB7XG4gICAgaWYgKHEgPiA0KSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5pbnZhbGlkVGltZVVuaXQoJ3F1YXJ0ZXInLCBxKSk7XG4gICAgfVxuICAgIC8vIFdlIGFjY2VwdCAxLWJhc2VkIHF1YXJ0ZXIsIHNvIG5lZWQgdG8gcmVhZGp1c3QgdG8gMC1iYXNlZCBxdWFydGVyXG4gICAgcmV0dXJuIChxIC0gMSkgKyAnJztcbiAgfSBlbHNlIHtcbiAgICAvLyBJbnZhbGlkIHF1YXJ0ZXJcbiAgICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW52YWxpZFRpbWVVbml0KCdxdWFydGVyJywgcSkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZU1vbnRoKG06IHN0cmluZyB8IG51bWJlcikge1xuICBpZiAoaXNOdW1iZXIobSkpIHtcbiAgICAvLyBXZSBhY2NlcHQgMS1iYXNlZCBtb250aCwgc28gbmVlZCB0byByZWFkanVzdCB0byAwLWJhc2VkIG1vbnRoXG4gICAgcmV0dXJuIChtIC0gMSkgKyAnJztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsb3dlck0gPSBtLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbW9udGhJbmRleCA9IE1PTlRIUy5pbmRleE9mKGxvd2VyTSk7XG4gICAgaWYgKG1vbnRoSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gbW9udGhJbmRleCArICcnOyAvLyAwIGZvciBqYW51YXJ5LCAuLi5cbiAgICB9XG4gICAgY29uc3Qgc2hvcnRNID0gbG93ZXJNLnN1YnN0cigwLCAzKTtcbiAgICBjb25zdCBzaG9ydE1vbnRoSW5kZXggPSBTSE9SVF9NT05USFMuaW5kZXhPZihzaG9ydE0pO1xuICAgIGlmIChzaG9ydE1vbnRoSW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gc2hvcnRNb250aEluZGV4ICsgJyc7XG4gICAgfVxuICAgIC8vIEludmFsaWQgbW9udGhcbiAgICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW52YWxpZFRpbWVVbml0KCdtb250aCcsIG0pKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVEYXkoZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmIChpc051bWJlcihkKSkge1xuICAgIC8vIG1vZCBzbyB0aGF0IHRoaXMgY2FuIGJlIGJvdGggMC1iYXNlZCB3aGVyZSAwID0gc3VuZGF5XG4gICAgLy8gYW5kIDEtYmFzZWQgd2hlcmUgNz1zdW5kYXlcbiAgICByZXR1cm4gKGQgJSA3KSArICcnO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvd2VyRCA9IGQudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBkYXlJbmRleCA9IERBWVMuaW5kZXhPZihsb3dlckQpO1xuICAgIGlmIChkYXlJbmRleCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBkYXlJbmRleCArICcnOyAvLyAwIGZvciBqYW51YXJ5LCAuLi5cbiAgICB9XG4gICAgY29uc3Qgc2hvcnREID0gbG93ZXJELnN1YnN0cigwLCAzKTtcbiAgICBjb25zdCBzaG9ydERheUluZGV4ID0gU0hPUlRfREFZUy5pbmRleE9mKHNob3J0RCk7XG4gICAgaWYgKHNob3J0RGF5SW5kZXggIT09IC0xKSB7XG4gICAgICByZXR1cm4gc2hvcnREYXlJbmRleCArICcnO1xuICAgIH1cbiAgICAvLyBJbnZhbGlkIGRheVxuICAgIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5pbnZhbGlkVGltZVVuaXQoJ2RheScsIGQpKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiBWZWdhIEV4cHJlc3Npb24gZm9yIGEgcGFydGljdWxhciBkYXRlIHRpbWUuXG4gKiBAcGFyYW0gZFxuICogQHBhcmFtIG5vcm1hbGl6ZSB3aGV0aGVyIHRvIG5vcm1hbGl6ZSBxdWFydGVyLCBtb250aCwgZGF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVRpbWVFeHByKGQ6IERhdGVUaW1lIHwgRGF0ZVRpbWVFeHByLCBub3JtYWxpemUgPSBmYWxzZSkge1xuICBjb25zdCB1bml0czogKHN0cmluZyB8IG51bWJlcilbXSA9IFtdO1xuXG4gIGlmIChub3JtYWxpemUgJiYgZC5kYXkgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChrZXlzKGQpLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRyb3BwZWREYXkoZCkpO1xuICAgICAgZCA9IGR1cGxpY2F0ZShkKTtcbiAgICAgIGRlbGV0ZSBkLmRheTtcbiAgICB9XG4gIH1cblxuICBpZiAoZC55ZWFyICE9PSB1bmRlZmluZWQpIHtcbiAgICB1bml0cy5wdXNoKGQueWVhcik7XG4gIH0gZWxzZSBpZiAoZC5kYXkgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIFNldCB5ZWFyIHRvIDIwMDYgZm9yIHdvcmtpbmcgd2l0aCBkYXkgc2luY2UgSmFudWFyeSAxIDIwMDYgaXMgYSBTdW5kYXlcbiAgICB1bml0cy5wdXNoKFNVTkRBWV9ZRUFSKTtcbiAgfSBlbHNlIHtcbiAgICB1bml0cy5wdXNoKDApO1xuICB9XG5cbiAgaWYgKGQubW9udGggIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1vbnRoID0gbm9ybWFsaXplID8gbm9ybWFsaXplTW9udGgoZC5tb250aCkgOiBkLm1vbnRoO1xuICAgIHVuaXRzLnB1c2gobW9udGgpO1xuICB9IGVsc2UgaWYgKGQucXVhcnRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IG5vcm1hbGl6ZSA/IG5vcm1hbGl6ZVF1YXJ0ZXIoZC5xdWFydGVyKSA6IGQucXVhcnRlcjtcbiAgICB1bml0cy5wdXNoKHF1YXJ0ZXIgKyAnKjMnKTtcbiAgfSBlbHNlIHtcbiAgICB1bml0cy5wdXNoKDApOyAvLyBtb250aHMgc3RhcnQgYXQgemVybyBpbiBKU1xuICB9XG5cbiAgaWYgKGQuZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdW5pdHMucHVzaChkLmRhdGUpO1xuICB9IGVsc2UgaWYgKGQuZGF5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBIQUNLOiBEYXkgb25seSB3b3JrcyBhcyBhIHN0YW5kYWxvbmUgdW5pdFxuICAgIC8vIFRoaXMgaXMgb25seSBjb3JyZWN0IGJlY2F1c2Ugd2UgYWx3YXlzIHNldCB5ZWFyIHRvIDIwMDYgZm9yIGRheVxuICAgIGNvbnN0IGRheSA9IG5vcm1hbGl6ZSA/IG5vcm1hbGl6ZURheShkLmRheSkgOiBkLmRheTtcbiAgICB1bml0cy5wdXNoKGRheSArICcrMScpO1xuICB9IGVsc2Uge1xuICAgIHVuaXRzLnB1c2goMSk7IC8vIERhdGUgc3RhcnRzIGF0IDEgaW4gSlNcbiAgfVxuXG4gIC8vIE5vdGU6IGNhbid0IHVzZSBUaW1lVW5pdCBlbnVtIGhlcmUgYXMgaW1wb3J0aW5nIGl0IHdpbGwgY3JlYXRlXG4gIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgcHJvYmxlbSFcbiAgZm9yIChjb25zdCB0aW1lVW5pdCBvZiBbJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsICdtaWxsaXNlY29uZHMnXSkge1xuICAgIGlmIChkW3RpbWVVbml0XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB1bml0cy5wdXNoKGRbdGltZVVuaXRdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pdHMucHVzaCgwKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZC51dGMpIHtcbiAgICByZXR1cm4gYHV0Yygke3VuaXRzLmpvaW4oJywgJyl9KWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBkYXRldGltZSgke3VuaXRzLmpvaW4oJywgJyl9KWA7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { dateTimeExpr } from './datetime';\nimport * as log from './log';\nimport { accessPathWithDatum, flagKeys } from './util';\nexport var TimeUnit;\n(function (TimeUnit) {\n TimeUnit.YEAR = 'year';\n TimeUnit.MONTH = 'month';\n TimeUnit.DAY = 'day';\n TimeUnit.DATE = 'date';\n TimeUnit.HOURS = 'hours';\n TimeUnit.MINUTES = 'minutes';\n TimeUnit.SECONDS = 'seconds';\n TimeUnit.MILLISECONDS = 'milliseconds';\n TimeUnit.YEARMONTH = 'yearmonth';\n TimeUnit.YEARMONTHDATE = 'yearmonthdate';\n TimeUnit.YEARMONTHDATEHOURS = 'yearmonthdatehours';\n TimeUnit.YEARMONTHDATEHOURSMINUTES = 'yearmonthdatehoursminutes';\n TimeUnit.YEARMONTHDATEHOURSMINUTESSECONDS = 'yearmonthdatehoursminutesseconds';\n // MONTHDATE always include 29 February since we use year 0th (which is a leap year);\n TimeUnit.MONTHDATE = 'monthdate';\n TimeUnit.HOURSMINUTES = 'hoursminutes';\n TimeUnit.HOURSMINUTESSECONDS = 'hoursminutesseconds';\n TimeUnit.MINUTESSECONDS = 'minutesseconds';\n TimeUnit.SECONDSMILLISECONDS = 'secondsmilliseconds';\n TimeUnit.QUARTER = 'quarter';\n TimeUnit.YEARQUARTER = 'yearquarter';\n TimeUnit.QUARTERMONTH = 'quartermonth';\n TimeUnit.YEARQUARTERMONTH = 'yearquartermonth';\n TimeUnit.UTCYEAR = 'utcyear';\n TimeUnit.UTCMONTH = 'utcmonth';\n TimeUnit.UTCDAY = 'utcday';\n TimeUnit.UTCDATE = 'utcdate';\n TimeUnit.UTCHOURS = 'utchours';\n TimeUnit.UTCMINUTES = 'utcminutes';\n TimeUnit.UTCSECONDS = 'utcseconds';\n TimeUnit.UTCMILLISECONDS = 'utcmilliseconds';\n TimeUnit.UTCYEARMONTH = 'utcyearmonth';\n TimeUnit.UTCYEARMONTHDATE = 'utcyearmonthdate';\n TimeUnit.UTCYEARMONTHDATEHOURS = 'utcyearmonthdatehours';\n TimeUnit.UTCYEARMONTHDATEHOURSMINUTES = 'utcyearmonthdatehoursminutes';\n TimeUnit.UTCYEARMONTHDATEHOURSMINUTESSECONDS = 'utcyearmonthdatehoursminutesseconds';\n // MONTHDATE always include 29 February since we use year 0th (which is a leap year);\n TimeUnit.UTCMONTHDATE = 'utcmonthdate';\n TimeUnit.UTCHOURSMINUTES = 'utchoursminutes';\n TimeUnit.UTCHOURSMINUTESSECONDS = 'utchoursminutesseconds';\n TimeUnit.UTCMINUTESSECONDS = 'utcminutesseconds';\n TimeUnit.UTCSECONDSMILLISECONDS = 'utcsecondsmilliseconds';\n TimeUnit.UTCQUARTER = 'utcquarter';\n TimeUnit.UTCYEARQUARTER = 'utcyearquarter';\n TimeUnit.UTCQUARTERMONTH = 'utcquartermonth';\n TimeUnit.UTCYEARQUARTERMONTH = 'utcyearquartermonth';\n})(TimeUnit || (TimeUnit = {}));\n/** Time Unit that only corresponds to only one part of Date objects. */\nvar LOCAL_SINGLE_TIMEUNIT_INDEX = {\n year: 1,\n quarter: 1,\n month: 1,\n day: 1,\n date: 1,\n hours: 1,\n minutes: 1,\n seconds: 1,\n milliseconds: 1\n};\nexport var TIMEUNIT_PARTS = flagKeys(LOCAL_SINGLE_TIMEUNIT_INDEX);\nexport function isLocalSingleTimeUnit(timeUnit) {\n return !!LOCAL_SINGLE_TIMEUNIT_INDEX[timeUnit];\n}\nvar UTC_SINGLE_TIMEUNIT_INDEX = {\n utcyear: 1,\n utcquarter: 1,\n utcmonth: 1,\n utcday: 1,\n utcdate: 1,\n utchours: 1,\n utcminutes: 1,\n utcseconds: 1,\n utcmilliseconds: 1\n};\nexport function isUtcSingleTimeUnit(timeUnit) {\n return !!UTC_SINGLE_TIMEUNIT_INDEX[timeUnit];\n}\nvar LOCAL_MULTI_TIMEUNIT_INDEX = {\n yearquarter: 1,\n yearquartermonth: 1,\n yearmonth: 1,\n yearmonthdate: 1,\n yearmonthdatehours: 1,\n yearmonthdatehoursminutes: 1,\n yearmonthdatehoursminutesseconds: 1,\n quartermonth: 1,\n monthdate: 1,\n hoursminutes: 1,\n hoursminutesseconds: 1,\n minutesseconds: 1,\n secondsmilliseconds: 1\n};\nvar UTC_MULTI_TIMEUNIT_INDEX = {\n utcyearquarter: 1,\n utcyearquartermonth: 1,\n utcyearmonth: 1,\n utcyearmonthdate: 1,\n utcyearmonthdatehours: 1,\n utcyearmonthdatehoursminutes: 1,\n utcyearmonthdatehoursminutesseconds: 1,\n utcquartermonth: 1,\n utcmonthdate: 1,\n utchoursminutes: 1,\n utchoursminutesseconds: 1,\n utcminutesseconds: 1,\n utcsecondsmilliseconds: 1\n};\nvar UTC_TIMEUNIT_INDEX = tslib_1.__assign({}, UTC_SINGLE_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX);\nexport function isUTCTimeUnit(t) {\n return !!UTC_TIMEUNIT_INDEX[t];\n}\nexport function getLocalTimeUnit(t) {\n return t.substr(3);\n}\nvar TIMEUNIT_INDEX = tslib_1.__assign({}, LOCAL_SINGLE_TIMEUNIT_INDEX, UTC_SINGLE_TIMEUNIT_INDEX, LOCAL_MULTI_TIMEUNIT_INDEX, UTC_MULTI_TIMEUNIT_INDEX);\nexport var TIMEUNITS = flagKeys(TIMEUNIT_INDEX);\nexport function isTimeUnit(t) {\n return !!TIMEUNIT_INDEX[t];\n}\nvar SET_DATE_METHOD = {\n year: 'setFullYear',\n month: 'setMonth',\n date: 'setDate',\n hours: 'setHours',\n minutes: 'setMinutes',\n seconds: 'setSeconds',\n milliseconds: 'setMilliseconds',\n // Day and quarter have their own special cases\n quarter: null,\n day: null,\n};\n/**\n * Converts a date to only have the measurements relevant to the specified unit\n * i.e. ('yearmonth', '2000-12-04 07:58:14') -> '2000-12-01 00:00:00'\n * Note: the base date is Jan 01 1900 00:00:00\n */\nexport function convert(unit, date) {\n var isUTC = isUTCTimeUnit(unit);\n var result = isUTC ?\n // start with uniform date\n new Date(Date.UTC(0, 0, 1, 0, 0, 0, 0)) :\n new Date(0, 0, 1, 0, 0, 0, 0);\n for (var _i = 0, TIMEUNIT_PARTS_1 = TIMEUNIT_PARTS; _i < TIMEUNIT_PARTS_1.length; _i++) {\n var timeUnitPart = TIMEUNIT_PARTS_1[_i];\n if (containsTimeUnit(unit, timeUnitPart)) {\n switch (timeUnitPart) {\n case TimeUnit.DAY:\n throw new Error('Cannot convert to TimeUnits containing \\'day\\'');\n case TimeUnit.QUARTER: {\n var _a = dateMethods('month', isUTC), getDateMethod_1 = _a.getDateMethod, setDateMethod_1 = _a.setDateMethod;\n // indicate quarter by setting month to be the first of the quarter i.e. may (4) -> april (3)\n result[setDateMethod_1]((Math.floor(date[getDateMethod_1]() / 3)) * 3);\n break;\n }\n default:\n var _b = dateMethods(timeUnitPart, isUTC), getDateMethod = _b.getDateMethod, setDateMethod = _b.setDateMethod;\n result[setDateMethod](date[getDateMethod]());\n }\n }\n }\n return result;\n}\nfunction dateMethods(singleUnit, isUtc) {\n var rawSetDateMethod = SET_DATE_METHOD[singleUnit];\n var setDateMethod = isUtc ? 'setUTC' + rawSetDateMethod.substr(3) : rawSetDateMethod;\n var getDateMethod = 'get' + (isUtc ? 'UTC' : '') + rawSetDateMethod.substr(3);\n return { setDateMethod: setDateMethod, getDateMethod: getDateMethod };\n}\nexport function getTimeUnitParts(timeUnit) {\n return TIMEUNIT_PARTS.reduce(function (parts, part) {\n if (containsTimeUnit(timeUnit, part)) {\n return parts.concat(part);\n }\n return parts;\n }, []);\n}\n/** Returns true if fullTimeUnit contains the timeUnit, false otherwise. */\nexport function containsTimeUnit(fullTimeUnit, timeUnit) {\n var index = fullTimeUnit.indexOf(timeUnit);\n return index > -1 &&\n (timeUnit !== TimeUnit.SECONDS ||\n index === 0 ||\n fullTimeUnit.charAt(index - 1) !== 'i' // exclude milliseconds\n );\n}\n/**\n * Returns Vega expresssion for a given timeUnit and fieldRef\n */\nexport function fieldExpr(fullTimeUnit, field) {\n var fieldRef = accessPathWithDatum(field);\n var utc = isUTCTimeUnit(fullTimeUnit) ? 'utc' : '';\n function func(timeUnit) {\n if (timeUnit === TimeUnit.QUARTER) {\n // quarter starting at 0 (0,3,6,9).\n return \"(\" + utc + \"quarter(\" + fieldRef + \")-1)\";\n }\n else {\n return \"\" + utc + timeUnit + \"(\" + fieldRef + \")\";\n }\n }\n var d = TIMEUNIT_PARTS.reduce(function (dateExpr, tu) {\n if (containsTimeUnit(fullTimeUnit, tu)) {\n dateExpr[tu] = func(tu);\n }\n return dateExpr;\n }, {});\n return dateTimeExpr(d);\n}\n/**\n * returns the signal expression used for axis labels for a time unit\n */\nexport function formatExpression(timeUnit, field, shortTimeLabels, isUTCScale) {\n if (!timeUnit) {\n return undefined;\n }\n var dateComponents = [];\n var expression = '';\n var hasYear = containsTimeUnit(timeUnit, TimeUnit.YEAR);\n if (containsTimeUnit(timeUnit, TimeUnit.QUARTER)) {\n // special expression for quarter as prefix\n expression = \"'Q' + quarter(\" + field + \")\";\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MONTH)) {\n // By default use short month name\n dateComponents.push(shortTimeLabels !== false ? '%b' : '%B');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.DAY)) {\n dateComponents.push(shortTimeLabels ? '%a' : '%A');\n }\n else if (containsTimeUnit(timeUnit, TimeUnit.DATE)) {\n dateComponents.push('%d' + (hasYear ? ',' : '')); // add comma if there is year\n }\n if (hasYear) {\n dateComponents.push(shortTimeLabels ? '%y' : '%Y');\n }\n var timeComponents = [];\n if (containsTimeUnit(timeUnit, TimeUnit.HOURS)) {\n timeComponents.push('%H');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MINUTES)) {\n timeComponents.push('%M');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.SECONDS)) {\n timeComponents.push('%S');\n }\n if (containsTimeUnit(timeUnit, TimeUnit.MILLISECONDS)) {\n timeComponents.push('%L');\n }\n var dateTimeComponents = [];\n if (dateComponents.length > 0) {\n dateTimeComponents.push(dateComponents.join(' '));\n }\n if (timeComponents.length > 0) {\n dateTimeComponents.push(timeComponents.join(':'));\n }\n if (dateTimeComponents.length > 0) {\n if (expression) {\n // Add space between quarter and main time format\n expression += \" + ' ' + \";\n }\n // We only use utcFormat for utc scale\n // For utc time units, the data is already converted as a part of timeUnit transform.\n // Thus, utc time units should use timeFormat to avoid shifting the time twice.\n if (isUTCScale) {\n expression += \"utcFormat(\" + field + \", '\" + dateTimeComponents.join(' ') + \"')\";\n }\n else {\n expression += \"timeFormat(\" + field + \", '\" + dateTimeComponents.join(' ') + \"')\";\n }\n }\n // If expression is still an empty string, return undefined instead.\n return expression || undefined;\n}\nexport function normalizeTimeUnit(timeUnit) {\n if (timeUnit !== 'day' && timeUnit.indexOf('day') >= 0) {\n log.warn(log.message.dayReplacedWithDate(timeUnit));\n return timeUnit.replace('day', 'date');\n }\n return timeUnit;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGltZXVuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBZSxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFDN0IsT0FBTyxFQUFDLG1CQUFtQixFQUFRLFFBQVEsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzRCxNQUFNLEtBQVcsUUFBUSxDQWlEeEI7QUFqREQsV0FBaUIsUUFBUTtJQUNWLGFBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsY0FBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixZQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGFBQUksR0FBVyxNQUFNLENBQUM7SUFDdEIsY0FBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixnQkFBTyxHQUFjLFNBQVMsQ0FBQztJQUMvQixnQkFBTyxHQUFjLFNBQVMsQ0FBQztJQUMvQixxQkFBWSxHQUFtQixjQUFjLENBQUM7SUFDOUMsa0JBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLHNCQUFhLEdBQW9CLGVBQWUsQ0FBQztJQUNqRCwyQkFBa0IsR0FBeUIsb0JBQW9CLENBQUM7SUFDaEUsa0NBQXlCLEdBQWdDLDJCQUEyQixDQUFDO0lBQ3JGLHlDQUFnQyxHQUF1QyxrQ0FBa0MsQ0FBQztJQUV2SCxxRkFBcUY7SUFDeEUsa0JBQVMsR0FBZ0IsV0FBVyxDQUFDO0lBQ3JDLHFCQUFZLEdBQW1CLGNBQWMsQ0FBQztJQUM5Qyw0QkFBbUIsR0FBMEIscUJBQXFCLENBQUM7SUFDbkUsdUJBQWMsR0FBcUIsZ0JBQWdCLENBQUM7SUFDcEQsNEJBQW1CLEdBQTBCLHFCQUFxQixDQUFDO0lBQ25FLGdCQUFPLEdBQWMsU0FBUyxDQUFDO0lBQy9CLG9CQUFXLEdBQWtCLGFBQWEsQ0FBQztJQUMzQyxxQkFBWSxHQUFtQixjQUFjLENBQUM7SUFDOUMseUJBQWdC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QU8sVUFBVSxJQUFJLFNBQVMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSw0QkFBNEIsUUFBa0I7SUFDbEQsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3RELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFhLENBQUM7S0FDcEQ7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEYXRlVGltZUV4cHIsIGRhdGVUaW1lRXhwcn0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHthY2Nlc3NQYXRoV2l0aERhdHVtLCBGbGFnLCBmbGFnS2V5c30gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IG5hbWVzcGFjZSBUaW1lVW5pdCB7XG4gIGV4cG9ydCBjb25zdCBZRUFSOiAneWVhcicgPSAneWVhcic7XG4gIGV4cG9ydCBjb25zdCBNT05USDogJ21vbnRoJyA9ICdtb250aCc7XG4gIGV4cG9ydCBjb25zdCBEQVk6ICdkYXknID0gJ2RheSc7XG4gIGV4cG9ydCBjb25zdCBEQVRFOiAnZGF0ZScgPSAnZGF0ZSc7XG4gIGV4cG9ydCBjb25zdCBIT1VSUzogJ2hvdXJzJyA9ICdob3Vycyc7XG4gIGV4cG9ydCBjb25zdCBNSU5VVEVTOiAnbWludXRlcycgPSAnbWludXRlcyc7XG4gIGV4cG9ydCBjb25zdCBTRUNPTkRTOiAnc2Vjb25kcycgPSAnc2Vjb25kcyc7XG4gIGV4cG9ydCBjb25zdCBNSUxMSVNFQ09ORFM6ICdtaWxsaXNlY29uZHMnID0gJ21pbGxpc2Vjb25kcyc7XG4gIGV4cG9ydCBjb25zdCBZRUFSTU9OVEg6ICd5ZWFybW9udGgnID0gJ3llYXJtb250aCc7XG4gIGV4cG9ydCBjb25zdCBZRUFSTU9OVEhEQVRFOiAneWVhcm1vbnRoZGF0ZScgPSAneWVhcm1vbnRoZGF0ZSc7XG4gIGV4cG9ydCBjb25zdCBZRUFSTU9OVEhEQVRFSE9VUlM6ICd5ZWFybW9udGhkYXRlaG91cnMnID0gJ3llYXJtb250aGRhdGVob3Vycyc7XG4gIGV4cG9ydCBjb25zdCBZRUFSTU9OVEhEQVRFSE9VUlNNSU5VVEVTOiAneWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlcycgPSAneWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlcyc7XG4gIGV4cG9ydCBjb25zdCBZRUFSTU9OVEhEQVRFSE9VUlNNSU5VVEVTU0VDT05EUzogJ3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXNzZWNvbmRzJyA9ICd5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzc2Vjb25kcyc7XG5cbiAgLy8gTU9OVEhEQVRFIGFsd2F5cyBpbmNsdWRlIDI5IEZlYnJ1YXJ5IHNpbmNlIHdlIHVzZSB5ZWFyIDB0aCAod2hpY2ggaXMgYSBsZWFwIHllYXIpO1xuICBleHBvcnQgY29uc3QgTU9OVEhEQVRFOiAnbW9udGhkYXRlJyA9ICdtb250aGRhdGUnO1xuICBleHBvcnQgY29uc3QgSE9VUlNNSU5VVEVTOiAnaG91cnNtaW51dGVzJyA9ICdob3Vyc21pbnV0ZXMnO1xuICBleHBvcnQgY29uc3QgSE9VUlNNSU5VVEVTU0VDT05EUzogJ2hvdXJzbWludXRlc3NlY29uZHMnID0gJ2hvdXJzbWludXRlc3NlY29uZHMnO1xuICBleHBvcnQgY29uc3QgTUlOVVRFU1NFQ09ORFM6ICdtaW51dGVzc2Vjb25kcycgPSAnbWludXRlc3NlY29uZHMnO1xuICBleHBvcnQgY29uc3QgU0VDT05EU01JTExJU0VDT05EUzogJ3NlY29uZHNtaWxsaXNlY29uZHMnID0gJ3NlY29uZHNtaWxsaXNlY29uZHMnO1xuICBleHBvcnQgY29uc3QgUVVBUlRFUjogJ3F1YXJ0ZXInID0gJ3F1YXJ0ZXInO1xuICBleHBvcnQgY29uc3QgWUVBUlFVQVJURVI6ICd5ZWFycXVhcnRlcicgPSAneWVhcnF1YXJ0ZXInO1xuICBleHBvcnQgY29uc3QgUVVBUlRFUk1PTlRIOiAncXVhcnRlcm1vbnRoJyA9ICdxdWFydGVybW9udGgnO1xuICBleHBvcnQgY29uc3QgWUVBUlFVQVJURVJNT05USDogJ3llYXJxdWFydGVybW9udGgnID0gJ3llYXJxdWFydGVybW9udGgnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUjogJ3V0Y3llYXInID0gJ3V0Y3llYXInO1xuICBleHBvcnQgY29uc3QgVVRDTU9OVEg6ICd1dGNtb250aCcgPSAndXRjbW9udGgnO1xuICBleHBvcnQgY29uc3QgVVRDREFZOiAndXRjZGF5JyA9ICd1dGNkYXknO1xuICBleHBvcnQgY29uc3QgVVRDREFURTogJ3V0Y2RhdGUnID0gJ3V0Y2RhdGUnO1xuICBleHBvcnQgY29uc3QgVVRDSE9VUlM6ICd1dGNob3VycycgPSAndXRjaG91cnMnO1xuICBleHBvcnQgY29uc3QgVVRDTUlOVVRFUzogJ3V0Y21pbnV0ZXMnID0gJ3V0Y21pbnV0ZXMnO1xuICBleHBvcnQgY29uc3QgVVRDU0VDT05EUzogJ3V0Y3NlY29uZHMnID0gJ3V0Y3NlY29uZHMnO1xuICBleHBvcnQgY29uc3QgVVRDTUlMTElTRUNPTkRTOiAndXRjbWlsbGlzZWNvbmRzJyA9ICd1dGNtaWxsaXNlY29uZHMnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUk1PTlRIOiAndXRjeWVhcm1vbnRoJyA9ICd1dGN5ZWFybW9udGgnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUk1PTlRIREFURTogJ3V0Y3llYXJtb250aGRhdGUnID0gJ3V0Y3llYXJtb250aGRhdGUnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUk1PTlRIREFURUhPVVJTOiAndXRjeWVhcm1vbnRoZGF0ZWhvdXJzJyA9ICd1dGN5ZWFybW9udGhkYXRlaG91cnMnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFUzogJ3V0Y3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXMnID0gJ3V0Y3llYXJtb250aGRhdGVob3Vyc21pbnV0ZXMnO1xuICBleHBvcnQgY29uc3QgVVRDWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU1NFQ09ORFM6ICd1dGN5ZWFybW9udGhkYXRlaG91cnNtaW51dGVzc2Vjb25kcycgPSAndXRjeWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlc3NlY29uZHMnO1xuXG4gIC8vIE1PTlRIREFURSBhbHdheXMgaW5jbHVkZSAyOSBGZWJydWFyeSBzaW5jZSB3ZSB1c2UgeWVhciAwdGggKHdoaWNoIGlzIGEgbGVhcCB5ZWFyKTtcbiAgZXhwb3J0IGNvbnN0IFVUQ01PTlRIREFURTogJ3V0Y21vbnRoZGF0ZScgPSAndXRjbW9udGhkYXRlJztcbiAgZXhwb3J0IGNvbnN0IFVUQ0hPVVJTTUlOVVRFUzogJ3V0Y2hvdXJzbWludXRlcycgPSAndXRjaG91cnNtaW51dGVzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ0hPVVJTTUlOVVRFU1NFQ09ORFM6ICd1dGNob3Vyc21pbnV0ZXNzZWNvbmRzJyA9ICd1dGNob3Vyc21pbnV0ZXNzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ01JTlVURVNTRUNPTkRTOiAndXRjbWludXRlc3NlY29uZHMnID0gJ3V0Y21pbnV0ZXNzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1NFQ09ORFNNSUxMSVNFQ09ORFM6ICd1dGNzZWNvbmRzbWlsbGlzZWNvbmRzJyA9ICd1dGNzZWNvbmRzbWlsbGlzZWNvbmRzJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1FVQVJURVI6ICd1dGNxdWFydGVyJyA9ICd1dGNxdWFydGVyJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJRVUFSVEVSOiAndXRjeWVhcnF1YXJ0ZXInID0gJ3V0Y3llYXJxdWFydGVyJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1FVQVJURVJNT05USDogJ3V0Y3F1YXJ0ZXJtb250aCcgPSAndXRjcXVhcnRlcm1vbnRoJztcbiAgZXhwb3J0IGNvbnN0IFVUQ1lFQVJRVUFSVEVSTU9OVEg6ICd1dGN5ZWFycXVhcnRlcm1vbnRoJyA9ICd1dGN5ZWFycXVhcnRlcm1vbnRoJztcbn1cblxuZXhwb3J0IHR5cGUgTG9jYWxTaW5nbGVUaW1lVW5pdCA9XG4gIHR5cGVvZiBUaW1lVW5pdC5ZRUFSIHxcbiAgdHlwZW9mIFRpbWVVbml0LlFVQVJURVIgfFxuICB0eXBlb2YgVGltZVVuaXQuTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuREFZIHxcbiAgdHlwZW9mIFRpbWVVbml0LkRBVEUgfFxuICB0eXBlb2YgVGltZVVuaXQuSE9VUlMgfFxuICB0eXBlb2YgVGltZVVuaXQuTUlOVVRFUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5TRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0Lk1JTExJU0VDT05EUztcblxuLyoqIFRpbWUgVW5pdCB0aGF0IG9ubHkgY29ycmVzcG9uZHMgdG8gb25seSBvbmUgcGFydCBvZiBEYXRlIG9iamVjdHMuICovXG5jb25zdCBMT0NBTF9TSU5HTEVfVElNRVVOSVRfSU5ERVg6IEZsYWc8TG9jYWxTaW5nbGVUaW1lVW5pdD4gPSB7XG4gIHllYXI6IDEsXG4gIHF1YXJ0ZXI6IDEsXG4gIG1vbnRoOiAxLFxuICBkYXk6IDEsXG4gIGRhdGU6IDEsXG4gIGhvdXJzOiAxLFxuICBtaW51dGVzOiAxLFxuICBzZWNvbmRzOiAxLFxuICBtaWxsaXNlY29uZHM6IDFcbn07XG5cbmV4cG9ydCBjb25zdCBUSU1FVU5JVF9QQVJUUyA9IGZsYWdLZXlzKExPQ0FMX1NJTkdMRV9USU1FVU5JVF9JTkRFWCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvY2FsU2luZ2xlVGltZVVuaXQodGltZVVuaXQ6IHN0cmluZyk6IHRpbWVVbml0IGlzIExvY2FsU2luZ2xlVGltZVVuaXQge1xuICByZXR1cm4gISFMT0NBTF9TSU5HTEVfVElNRVVOSVRfSU5ERVhbdGltZVVuaXRdO1xufVxuXG5leHBvcnQgdHlwZSBVdGNTaW5nbGVUaW1lVW5pdCA9XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENZRUFSIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ1FVQVJURVIgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDTU9OVEggfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDREFZIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ0RBVEUgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDSE9VUlMgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDTUlOVVRFUyB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ01JTExJU0VDT05EUztcblxuY29uc3QgVVRDX1NJTkdMRV9USU1FVU5JVF9JTkRFWDogRmxhZzxVdGNTaW5nbGVUaW1lVW5pdD4gPSB7XG4gIHV0Y3llYXI6IDEsXG4gIHV0Y3F1YXJ0ZXI6IDEsXG4gIHV0Y21vbnRoOiAxLFxuICB1dGNkYXk6IDEsXG4gIHV0Y2RhdGU6IDEsXG4gIHV0Y2hvdXJzOiAxLFxuICB1dGNtaW51dGVzOiAxLFxuICB1dGNzZWNvbmRzOiAxLFxuICB1dGNtaWxsaXNlY29uZHM6IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1V0Y1NpbmdsZVRpbWVVbml0KHRpbWVVbml0OiBzdHJpbmcpOiB0aW1lVW5pdCBpcyBVdGNTaW5nbGVUaW1lVW5pdCB7XG4gIHJldHVybiAhIVVUQ19TSU5HTEVfVElNRVVOSVRfSU5ERVhbdGltZVVuaXRdO1xufVxuXG5leHBvcnQgdHlwZSBTaW5nbGVUaW1lVW5pdCA9IExvY2FsU2luZ2xlVGltZVVuaXQgfCBVdGNTaW5nbGVUaW1lVW5pdDtcblxuZXhwb3J0IHR5cGUgTG9jYWxNdWx0aVRpbWVVbml0ID1cbiAgLy8gTG9jYWwgVGltZVxuICB0eXBlb2YgVGltZVVuaXQuWUVBUlFVQVJURVIgfCB0eXBlb2YgVGltZVVuaXQuWUVBUlFVQVJURVJNT05USCB8XG4gIHR5cGVvZiBUaW1lVW5pdC5ZRUFSTU9OVEggfCB0eXBlb2YgVGltZVVuaXQuWUVBUk1PTlRIREFURSB8IHR5cGVvZiBUaW1lVW5pdC5ZRUFSTU9OVEhEQVRFSE9VUlMgfCB0eXBlb2YgVGltZVVuaXQuWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU3wgdHlwZW9mIFRpbWVVbml0LllFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlFVQVJURVJNT05USCB8XG4gIHR5cGVvZiBUaW1lVW5pdC5NT05USERBVEUgfFxuICB0eXBlb2YgVGltZVVuaXQuSE9VUlNNSU5VVEVTIHwgdHlwZW9mIFRpbWVVbml0LkhPVVJTTUlOVVRFU1NFQ09ORFMgfFxuICB0eXBlb2YgVGltZVVuaXQuTUlOVVRFU1NFQ09ORFMgfFxuICB0eXBlb2YgVGltZVVuaXQuU0VDT05EU01JTExJU0VDT05EUztcblxuY29uc3QgTE9DQUxfTVVMVElfVElNRVVOSVRfSU5ERVg6IEZsYWc8TG9jYWxNdWx0aVRpbWVVbml0PiA9IHtcbiAgeWVhcnF1YXJ0ZXI6IDEsXG4gIHllYXJxdWFydGVybW9udGg6IDEsXG5cbiAgeWVhcm1vbnRoOiAxLFxuICB5ZWFybW9udGhkYXRlOiAxLFxuICB5ZWFybW9udGhkYXRlaG91cnM6IDEsXG4gIHllYXJtb250aGRhdGVob3Vyc21pbnV0ZXM6IDEsXG4gIHllYXJtb250aGRhdGVob3Vyc21pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIHF1YXJ0ZXJtb250aDogMSxcblxuICBtb250aGRhdGU6IDEsXG5cbiAgaG91cnNtaW51dGVzOiAxLFxuICBob3Vyc21pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIG1pbnV0ZXNzZWNvbmRzOiAxLFxuXG4gIHNlY29uZHNtaWxsaXNlY29uZHM6IDFcbn07XG5cbmV4cG9ydCB0eXBlIFV0Y011bHRpVGltZVVuaXQgPVxuICB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUlFVQVJURVIgfCB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUlFVQVJURVJNT05USCB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENZRUFSTU9OVEggfCB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUk1PTlRIREFURSB8IHR5cGVvZiBUaW1lVW5pdC5VVENZRUFSTU9OVEhEQVRFSE9VUlMgfCB0eXBlb2YgVGltZVVuaXQuVVRDWUVBUk1PTlRIREFURUhPVVJTTUlOVVRFU3wgdHlwZW9mIFRpbWVVbml0LlVUQ1lFQVJNT05USERBVEVIT1VSU01JTlVURVNTRUNPTkRTIHxcbiAgdHlwZW9mIFRpbWVVbml0LlVUQ1FVQVJURVJNT05USCB8XG4gIHR5cGVvZiBUaW1lVW5pdC5VVENNT05USERBVEUgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDSE9VUlNNSU5VVEVTIHwgdHlwZW9mIFRpbWVVbml0LlVUQ0hPVVJTTUlOVVRFU1NFQ09ORFMgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDTUlOVVRFU1NFQ09ORFMgfFxuICB0eXBlb2YgVGltZVVuaXQuVVRDU0VDT05EU01JTExJU0VDT05EUztcblxuY29uc3QgVVRDX01VTFRJX1RJTUVVTklUX0lOREVYOiBGbGFnPFV0Y011bHRpVGltZVVuaXQ+ID0ge1xuICB1dGN5ZWFycXVhcnRlcjogMSxcbiAgdXRjeWVhcnF1YXJ0ZXJtb250aDogMSxcblxuICB1dGN5ZWFybW9udGg6IDEsXG4gIHV0Y3llYXJtb250aGRhdGU6IDEsXG4gIHV0Y3llYXJtb250aGRhdGVob3VyczogMSxcbiAgdXRjeWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlczogMSxcbiAgdXRjeWVhcm1vbnRoZGF0ZWhvdXJzbWludXRlc3NlY29uZHM6IDEsXG5cbiAgdXRjcXVhcnRlcm1vbnRoOiAxLFxuXG4gIHV0Y21vbnRoZGF0ZTogMSxcblxuICB1dGNob3Vyc21pbnV0ZXM6IDEsXG4gIHV0Y2hvdXJzbWludXRlc3NlY29uZHM6IDEsXG5cbiAgdXRjbWludXRlc3NlY29uZHM6IDEsXG5cbiAgdXRjc2Vjb25kc21pbGxpc2Vjb25kczogMVxufTtcblxuZXhwb3J0IHR5cGUgTXVsdGlUaW1lVW5pdCA9IExvY2FsTXVsdGlUaW1lVW5pdCB8IFV0Y011bHRpVGltZVVuaXQ7XG5cblxuZXhwb3J0IHR5cGUgTG9jYWxUaW1lVW5pdCA9IExvY2FsU2luZ2xlVGltZVVuaXQgfCBMb2NhbE11bHRpVGltZVVuaXQ7XG5leHBvcnQgdHlwZSBVdGNUaW1lVW5pdCA9IFV0Y1NpbmdsZVRpbWVVbml0IHwgVXRjTXVsdGlUaW1lVW5pdDtcblxuY29uc3QgVVRDX1RJTUVVTklUX0lOREVYOiBGbGFnPFV0Y1RpbWVVbml0PiA9IHtcbiAgLi4uVVRDX1NJTkdMRV9USU1FVU5JVF9JTkRFWCxcbiAgLi4uVVRDX01VTFRJX1RJTUVVTklUX0lOREVYXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNVVENUaW1lVW5pdCh0OiBzdHJpbmcpOiB0IGlzIFV0Y1RpbWVVbml0IHtcbiAgcmV0dXJuICEhVVRDX1RJTUVVTklUX0lOREVYW3RdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYWxUaW1lVW5pdCh0OiBVdGNUaW1lVW5pdCk6IExvY2FsVGltZVVuaXQge1xuICByZXR1cm4gdC5zdWJzdHIoMykgYXMgTG9jYWxUaW1lVW5pdDtcbn1cblxuZXhwb3J0IHR5cGUgVGltZVVuaXQgPSBTaW5nbGVUaW1lVW5pdCB8IE11bHRpVGltZVVuaXQ7XG5cbmNvbnN0IFRJTUVVTklUX0lOREVYOiBGbGFnPFRpbWVVbml0PiA9IHtcbiAgLi4uTE9DQUxfU0lOR0xFX1RJTUVVTklUX0lOREVYLFxuICAuLi5VVENfU0lOR0xFX1RJTUVVTklUX0lOREVYLFxuICAuLi5MT0NBTF9NVUxUSV9USU1FVU5JVF9JTkRFWCxcbiAgLi4uVVRDX01VTFRJX1RJTUVVTklUX0lOREVYXG59O1xuXG5leHBvcnQgY29uc3QgVElNRVVOSVRTID0gZmxhZ0tleXMoVElNRVVOSVRfSU5ERVgpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVW5pdCh0OiBzdHJpbmcpOiB0IGlzIFRpbWVVbml0IHtcbiAgcmV0dXJuICEhVElNRVVOSVRfSU5ERVhbdF07XG59XG5cbnR5cGUgRGF0ZU1ldGhvZE5hbWUgPSBrZXlvZiBEYXRlO1xuXG5jb25zdCBTRVRfREFURV9NRVRIT0Q6IFJlY29yZDxMb2NhbFNpbmdsZVRpbWVVbml0LCBEYXRlTWV0aG9kTmFtZT4gPSB7XG4gIHllYXI6ICdzZXRGdWxsWWVhcicsXG4gIG1vbnRoOiAnc2V0TW9udGgnLFxuICBkYXRlOiAnc2V0RGF0ZScsXG4gIGhvdXJzOiAnc2V0SG91cnMnLFxuICBtaW51dGVzOiAnc2V0TWludXRlcycsXG4gIHNlY29uZHM6ICdzZXRTZWNvbmRzJyxcbiAgbWlsbGlzZWNvbmRzOiAnc2V0TWlsbGlzZWNvbmRzJyxcbiAgLy8gRGF5IGFuZCBxdWFydGVyIGhhdmUgdGhlaXIgb3duIHNwZWNpYWwgY2FzZXNcbiAgcXVhcnRlcjogbnVsbCxcbiAgZGF5OiBudWxsLFxufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhIGRhdGUgdG8gb25seSBoYXZlIHRoZSBtZWFzdXJlbWVudHMgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCB1bml0XG4gKiBpLmUuICgneWVhcm1vbnRoJywgJzIwMDAtMTItMDQgMDc6NTg6MTQnKSAtPiAnMjAwMC0xMi0wMSAwMDowMDowMCdcbiAqIE5vdGU6IHRoZSBiYXNlIGRhdGUgaXMgSmFuIDAxIDE5MDAgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnQodW5pdDogVGltZVVuaXQsIGRhdGU6IERhdGUpOiBEYXRlIHtcbiAgY29uc3QgaXNVVEMgPSBpc1VUQ1RpbWVVbml0KHVuaXQpO1xuICBjb25zdCByZXN1bHQ6IERhdGUgPSBpc1VUQyA/XG4gICAgLy8gc3RhcnQgd2l0aCB1bmlmb3JtIGRhdGVcbiAgICBuZXcgRGF0ZShEYXRlLlVUQygwLCAwLCAxLCAwLCAwLCAwLCAwKSkgOlxuICAgIG5ldyBEYXRlKDAsIDAsIDEsIDAsIDAsIDAsIDApO1xuICAgIGZvciAoY29uc3QgdGltZVVuaXRQYXJ0IG9mIFRJTUVVTklUX1BBUlRTKSB7XG4gICAgaWYgKGNvbnRhaW5zVGltZVVuaXQodW5pdCwgdGltZVVuaXRQYXJ0KSkge1xuICAgICAgc3dpdGNoICh0aW1lVW5pdFBhcnQpIHtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5EQVk6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCB0byBUaW1lVW5pdHMgY29udGFpbmluZyBcXCdkYXlcXCcnKTtcbiAgICAgICAgY2FzZSBUaW1lVW5pdC5RVUFSVEVSOiB7XG4gICAgICAgICAgY29uc3Qge2dldERhdGVNZXRob2QsIHNldERhdGVNZXRob2R9ID0gZGF0ZU1ldGhvZHMoJ21vbnRoJywgaXNVVEMpO1xuICAgICAgICAgIC8vIGluZGljYXRlIHF1YXJ0ZXIgYnkgc2V0dGluZyBtb250aCB0byBiZSB0aGUgZmlyc3Qgb2YgdGhlIHF1YXJ0ZXIgaS5lLiBtYXkgKDQpIC0+IGFwcmlsICgzKVxuICAgICAgICAgIHJlc3VsdFtzZXREYXRlTWV0aG9kXSgoTWF0aC5mbG9vcihkYXRlW2dldERhdGVNZXRob2RdKCkgLyAzKSkgKiAzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnN0IHtnZXREYXRlTWV0aG9kLCBzZXREYXRlTWV0aG9kfSA9IGRhdGVNZXRob2RzKHRpbWVVbml0UGFydCwgaXNVVEMpO1xuICAgICAgICAgIHJlc3VsdFtzZXREYXRlTWV0aG9kXShkYXRlW2dldERhdGVNZXRob2RdKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBkYXRlTWV0aG9kcyhzaW5nbGVVbml0OiBTaW5nbGVUaW1lVW5pdCwgaXNVdGM6IGJvb2xlYW4pIHtcbiAgY29uc3QgcmF3U2V0RGF0ZU1ldGhvZCA9IFNFVF9EQVRFX01FVEhPRFtzaW5nbGVVbml0XTtcbiAgY29uc3Qgc2V0RGF0ZU1ldGhvZCA9IGlzVXRjID8gJ3NldFVUQycgKyByYXdTZXREYXRlTWV0aG9kLnN1YnN0cigzKSA6IHJhd1NldERhdGVNZXRob2Q7XG4gIGNvbnN0IGdldERhdGVNZXRob2QgPSAnZ2V0JyArIChpc1V0YyA/ICdVVEMnIDogJycpICsgcmF3U2V0RGF0ZU1ldGhvZC5zdWJzdHIoMyk7XG4gIHJldHVybiB7c2V0RGF0ZU1ldGhvZCwgZ2V0RGF0ZU1ldGhvZH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUaW1lVW5pdFBhcnRzKHRpbWVVbml0OiBUaW1lVW5pdCkge1xuICByZXR1cm4gVElNRVVOSVRfUEFSVFMucmVkdWNlKChwYXJ0cywgcGFydCkgPT4ge1xuICAgIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBwYXJ0KSkge1xuICAgICAgcmV0dXJuIHBhcnRzLmNvbmNhdChwYXJ0KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzO1xuICB9LCBbXSk7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgZnVsbFRpbWVVbml0IGNvbnRhaW5zIHRoZSB0aW1lVW5pdCwgZmFsc2Ugb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zVGltZVVuaXQoZnVsbFRpbWVVbml0OiBUaW1lVW5pdCwgdGltZVVuaXQ6IFRpbWVVbml0KSB7XG4gIGNvbnN0IGluZGV4ID0gZnVsbFRpbWVVbml0LmluZGV4T2YodGltZVVuaXQpO1xuICByZXR1cm4gaW5kZXggPiAtMSAmJlxuICAgIChcbiAgICAgIHRpbWVVbml0ICE9PSBUaW1lVW5pdC5TRUNPTkRTIHx8XG4gICAgICBpbmRleCA9PT0gMCB8fFxuICAgICAgZnVsbFRpbWVVbml0LmNoYXJBdChpbmRleC0xKSAhPT0gJ2knIC8vIGV4Y2x1ZGUgbWlsbGlzZWNvbmRzXG4gICAgKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIFZlZ2EgZXhwcmVzc3Npb24gZm9yIGEgZ2l2ZW4gdGltZVVuaXQgYW5kIGZpZWxkUmVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZEV4cHIoZnVsbFRpbWVVbml0OiBUaW1lVW5pdCwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGZpZWxkUmVmID0gYWNjZXNzUGF0aFdpdGhEYXR1bShmaWVsZCk7XG5cbiAgY29uc3QgdXRjID0gaXNVVENUaW1lVW5pdChmdWxsVGltZVVuaXQpID8gJ3V0YycgOiAnJztcbiAgZnVuY3Rpb24gZnVuYyh0aW1lVW5pdDogVGltZVVuaXQpIHtcbiAgICBpZiAodGltZVVuaXQgPT09IFRpbWVVbml0LlFVQVJURVIpIHtcbiAgICAgIC8vIHF1YXJ0ZXIgc3RhcnRpbmcgYXQgMCAoMCwzLDYsOSkuXG4gICAgICByZXR1cm4gYCgke3V0Y31xdWFydGVyKCR7ZmllbGRSZWZ9KS0xKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt1dGN9JHt0aW1lVW5pdH0oJHtmaWVsZFJlZn0pYDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBkID0gVElNRVVOSVRfUEFSVFMucmVkdWNlKChkYXRlRXhwcjogRGF0ZVRpbWVFeHByLCB0dTogVGltZVVuaXQpID0+IHtcbiAgICBpZiAoY29udGFpbnNUaW1lVW5pdChmdWxsVGltZVVuaXQsIHR1KSkge1xuICAgICAgZGF0ZUV4cHJbdHVdID0gZnVuYyh0dSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRlRXhwcjtcbiAgfSwge30gYXMge1trZXkgaW4gU2luZ2xlVGltZVVuaXRdOiBzdHJpbmd9KTtcblxuICByZXR1cm4gZGF0ZVRpbWVFeHByKGQpO1xufVxuXG4vKipcbiAqIHJldHVybnMgdGhlIHNpZ25hbCBleHByZXNzaW9uIHVzZWQgZm9yIGF4aXMgbGFiZWxzIGZvciBhIHRpbWUgdW5pdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXhwcmVzc2lvbih0aW1lVW5pdDogVGltZVVuaXQsIGZpZWxkOiBzdHJpbmcsIHNob3J0VGltZUxhYmVsczogYm9vbGVhbiwgaXNVVENTY2FsZTogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICghdGltZVVuaXQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZGF0ZUNvbXBvbmVudHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBleHByZXNzaW9uID0gJyc7XG4gIGNvbnN0IGhhc1llYXIgPSBjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5ZRUFSKTtcblxuICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuUVVBUlRFUikpIHtcbiAgIC8vIHNwZWNpYWwgZXhwcmVzc2lvbiBmb3IgcXVhcnRlciBhcyBwcmVmaXhcbiAgICBleHByZXNzaW9uID0gYCdRJyArIHF1YXJ0ZXIoJHtmaWVsZH0pYDtcbiAgfVxuXG4gIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5NT05USCkpIHtcbiAgICAvLyBCeSBkZWZhdWx0IHVzZSBzaG9ydCBtb250aCBuYW1lXG4gICAgZGF0ZUNvbXBvbmVudHMucHVzaChzaG9ydFRpbWVMYWJlbHMgIT09IGZhbHNlID8gJyViJyA6ICclQicpO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5zVGltZVVuaXQodGltZVVuaXQsIFRpbWVVbml0LkRBWSkpIHtcbiAgICBkYXRlQ29tcG9uZW50cy5wdXNoKHNob3J0VGltZUxhYmVscyA/ICclYScgOiAnJUEnKTtcbiAgfSBlbHNlIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5EQVRFKSkge1xuICAgIGRhdGVDb21wb25lbnRzLnB1c2goJyVkJyArIChoYXNZZWFyID8gJywnIDogJycpKTsgLy8gYWRkIGNvbW1hIGlmIHRoZXJlIGlzIHllYXJcbiAgfVxuXG4gIGlmIChoYXNZZWFyKSB7XG4gICAgZGF0ZUNvbXBvbmVudHMucHVzaChzaG9ydFRpbWVMYWJlbHMgPyAnJXknIDogJyVZJyk7XG4gIH1cblxuICBjb25zdCB0aW1lQ29tcG9uZW50czogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuSE9VUlMpKSB7XG4gICAgdGltZUNvbXBvbmVudHMucHVzaCgnJUgnKTtcbiAgfVxuICBpZiAoY29udGFpbnNUaW1lVW5pdCh0aW1lVW5pdCwgVGltZVVuaXQuTUlOVVRFUykpIHtcbiAgICB0aW1lQ29tcG9uZW50cy5wdXNoKCclTScpO1xuICB9XG4gIGlmIChjb250YWluc1RpbWVVbml0KHRpbWVVbml0LCBUaW1lVW5pdC5TRUNPTkRTKSkge1xuICAgIHRpbWVDb21wb25lbnRzLnB1c2goJyVTJyk7XG4gIH1cbiAgaWYgKGNvbnRhaW5zVGltZVVuaXQodGltZVVuaXQsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpIHtcbiAgICB0aW1lQ29tcG9uZW50cy5wdXNoKCclTCcpO1xuICB9XG5cbiAgY29uc3QgZGF0ZVRpbWVDb21wb25lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZGF0ZUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xuICAgIGRhdGVUaW1lQ29tcG9uZW50cy5wdXNoKGRhdGVDb21wb25lbnRzLmpvaW4oJyAnKSk7XG4gIH1cbiAgaWYgKHRpbWVDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICBkYXRlVGltZUNvbXBvbmVudHMucHVzaCh0aW1lQ29tcG9uZW50cy5qb2luKCc6JykpO1xuICB9XG5cbiAgaWYgKGRhdGVUaW1lQ29tcG9uZW50cy5sZW5ndGggPiAwKSB7XG4gICAgaWYgKGV4cHJlc3Npb24pIHtcbiAgICAgIC8vIEFkZCBzcGFjZSBiZXR3ZWVuIHF1YXJ0ZXIgYW5kIG1haW4gdGltZSBmb3JtYXRcbiAgICAgIGV4cHJlc3Npb24gKz0gYCArICcgJyArIGA7XG4gICAgfVxuXG4gICAgLy8gV2Ugb25seSB1c2UgdXRjRm9ybWF0IGZvciB1dGMgc2NhbGVcbiAgICAvLyBGb3IgdXRjIHRpbWUgdW5pdHMsIHRoZSBkYXRhIGlzIGFscmVhZHkgY29udmVydGVkIGFzIGEgcGFydCBvZiB0aW1lVW5pdCB0cmFuc2Zvcm0uXG4gICAgLy8gVGh1cywgdXRjIHRpbWUgdW5pdHMgc2hvdWxkIHVzZSB0aW1lRm9ybWF0IHRvIGF2b2lkIHNoaWZ0aW5nIHRoZSB0aW1lIHR3aWNlLlxuICAgIGlmIChpc1VUQ1NjYWxlKSB7XG4gICAgICBleHByZXNzaW9uICs9IGB1dGNGb3JtYXQoJHtmaWVsZH0sICcke2RhdGVUaW1lQ29tcG9uZW50cy5qb2luKCcgJyl9JylgO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByZXNzaW9uICs9IGB0aW1lRm9ybWF0KCR7ZmllbGR9LCAnJHtkYXRlVGltZUNvbXBvbmVudHMuam9pbignICcpfScpYDtcbiAgICB9XG4gIH1cblxuICAvLyBJZiBleHByZXNzaW9uIGlzIHN0aWxsIGFuIGVtcHR5IHN0cmluZywgcmV0dXJuIHVuZGVmaW5lZCBpbnN0ZWFkLlxuICByZXR1cm4gZXhwcmVzc2lvbiB8fCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUaW1lVW5pdCh0aW1lVW5pdDogVGltZVVuaXQpOiBUaW1lVW5pdCB7XG4gIGlmICh0aW1lVW5pdCAhPT0gJ2RheScgJiYgdGltZVVuaXQuaW5kZXhPZignZGF5JykgPj0gMCkge1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRheVJlcGxhY2VkV2l0aERhdGUodGltZVVuaXQpKTtcbiAgICByZXR1cm4gdGltZVVuaXQucmVwbGFjZSgnZGF5JywgJ2RhdGUnKSBhcyBUaW1lVW5pdDtcbiAgfVxuICByZXR1cm4gdGltZVVuaXQ7XG59XG4iXX0=","/** Constants and utilities for data type */\n/** Data type based on level of measurement */\nexport var Type;\n(function (Type) {\n Type.QUANTITATIVE = 'quantitative';\n Type.ORDINAL = 'ordinal';\n Type.TEMPORAL = 'temporal';\n Type.NOMINAL = 'nominal';\n Type.LATITUDE = 'latitude';\n Type.LONGITUDE = 'longitude';\n Type.GEOJSON = 'geojson';\n})(Type || (Type = {}));\nexport var TYPE_INDEX = {\n quantitative: 1,\n ordinal: 1,\n temporal: 1,\n nominal: 1,\n latitude: 1,\n longitude: 1,\n geojson: 1\n};\nexport function isType(t) {\n return !!TYPE_INDEX[t];\n}\nexport var QUANTITATIVE = Type.QUANTITATIVE;\nexport var ORDINAL = Type.ORDINAL;\nexport var TEMPORAL = Type.TEMPORAL;\nexport var NOMINAL = Type.NOMINAL;\nexport var GEOJSON = Type.GEOJSON;\n/**\n * Get full, lowercase type name for a given type.\n * @param type\n * @return Full type name.\n */\nexport function getFullName(type) {\n if (type) {\n type = type.toLowerCase();\n switch (type) {\n case 'q':\n case QUANTITATIVE:\n return 'quantitative';\n case 't':\n case TEMPORAL:\n return 'temporal';\n case 'o':\n case ORDINAL:\n return 'ordinal';\n case 'n':\n case NOMINAL:\n return 'nominal';\n case Type.LATITUDE:\n return 'latitude';\n case Type.LONGITUDE:\n return 'longitude';\n case GEOJSON:\n return 'geojson';\n }\n }\n // If we get invalid input, return undefined type.\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLDRDQUE0QztBQUM1Qyw4Q0FBOEM7QUFFOUMsTUFBTSxLQUFXLElBQUksQ0FTcEI7QUFURCxXQUFpQixJQUFJO0lBQ04saUJBQVksR0FBbUIsY0FBYyxDQUFDO0lBQzlDLFlBQU8sR0FBYyxTQUFTLENBQUM7SUFDL0IsYUFBUSxHQUFlLFVBQVUsQ0FBQztJQUNsQyxZQUFPLEdBQWMsU0FBUyxDQUFDO0lBRS9CLGFBQVEsR0FBZSxVQUFVLENBQUM7SUFDbEMsY0FBUyxHQUFnQixXQUFXLENBQUM7SUFDckMsWUFBTyxHQUFjLFNBQVMsQ0FBQztBQUM5QyxDQUFDLEVBVGdCLElBQUksS0FBSixJQUFJLFFBU3BCO0FBTUQsTUFBTSxDQUFDLElBQU0sVUFBVSxHQUFlO0lBQ3BDLFlBQVksRUFBRSxDQUFDO0lBQ2YsT0FBTyxFQUFFLENBQUM7SUFDVixRQUFRLEVBQUUsQ0FBQztJQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1YsUUFBUSxFQUFFLENBQUM7SUFDWCxTQUFTLEVBQUUsQ0FBQztJQUNaLE9BQU8sRUFBRSxDQUFDO0NBQ1gsQ0FBQztBQUVGLE1BQU0saUJBQWlCLENBQU07SUFDM0IsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztBQUM5QyxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNwQyxNQUFNLENBQUMsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUN0QyxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVwQyxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUVwQzs7OztHQUlHO0FBQ0gsTUFBTSxzQkFBc0IsSUFBaUI7SUFDM0MsSUFBSSxJQUFJLEVBQUU7UUFDUixJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQzFCLFFBQVEsSUFBSSxFQUFFO1lBQ1osS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxjQUFjLENBQUM7WUFDeEIsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxHQUFHLENBQUM7WUFDVCxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxTQUFTLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsUUFBUTtnQkFDaEIsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxJQUFJLENBQUMsU0FBUztnQkFDakIsT0FBTyxXQUFXLENBQUM7WUFDckIsS0FBSyxPQUFPO2dCQUNWLE9BQU8sU0FBUyxDQUFDO1NBQ3BCO0tBQ0Y7SUFDRCxrREFBa0Q7SUFDbEQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmxhZ30gZnJvbSAnLi91dGlsJztcbi8qKiBDb25zdGFudHMgYW5kIHV0aWxpdGllcyBmb3IgZGF0YSB0eXBlICovXG4vKiogRGF0YSB0eXBlIGJhc2VkIG9uIGxldmVsIG9mIG1lYXN1cmVtZW50ICovXG5cbmV4cG9ydCBuYW1lc3BhY2UgVHlwZSB7XG4gIGV4cG9ydCBjb25zdCBRVUFOVElUQVRJVkU6ICdxdWFudGl0YXRpdmUnID0gJ3F1YW50aXRhdGl2ZSc7XG4gIGV4cG9ydCBjb25zdCBPUkRJTkFMOiAnb3JkaW5hbCcgPSAnb3JkaW5hbCc7XG4gIGV4cG9ydCBjb25zdCBURU1QT1JBTDogJ3RlbXBvcmFsJyA9ICd0ZW1wb3JhbCc7XG4gIGV4cG9ydCBjb25zdCBOT01JTkFMOiAnbm9taW5hbCcgPSAnbm9taW5hbCc7XG5cbiAgZXhwb3J0IGNvbnN0IExBVElUVURFOiAnbGF0aXR1ZGUnID0gJ2xhdGl0dWRlJztcbiAgZXhwb3J0IGNvbnN0IExPTkdJVFVERTogJ2xvbmdpdHVkZScgPSAnbG9uZ2l0dWRlJztcbiAgZXhwb3J0IGNvbnN0IEdFT0pTT046ICdnZW9qc29uJyA9ICdnZW9qc29uJztcbn1cbmV4cG9ydCB0eXBlIEJhc2ljVHlwZSA9IHR5cGVvZiBUeXBlLlFVQU5USVRBVElWRSB8IHR5cGVvZiBUeXBlLk9SRElOQUwgfCB0eXBlb2YgVHlwZS5URU1QT1JBTCB8IHR5cGVvZiBUeXBlLk5PTUlOQUw7XG5leHBvcnQgdHlwZSBHZW9UeXBlID0gdHlwZW9mIFR5cGUuTEFUSVRVREUgfCB0eXBlb2YgVHlwZS5MT05HSVRVREUgfCB0eXBlb2YgVHlwZS5HRU9KU09OO1xuXG5leHBvcnQgdHlwZSBUeXBlID0gQmFzaWNUeXBlIHwgR2VvVHlwZTtcblxuZXhwb3J0IGNvbnN0IFRZUEVfSU5ERVg6IEZsYWc8VHlwZT4gPSB7XG4gIHF1YW50aXRhdGl2ZTogMSxcbiAgb3JkaW5hbDogMSxcbiAgdGVtcG9yYWw6IDEsXG4gIG5vbWluYWw6IDEsXG4gIGxhdGl0dWRlOiAxLFxuICBsb25naXR1ZGU6IDEsXG4gIGdlb2pzb246IDFcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGUodDogYW55KTogdCBpcyBUeXBlIHtcbiAgcmV0dXJuICEhVFlQRV9JTkRFWFt0XTtcbn1cblxuZXhwb3J0IGNvbnN0IFFVQU5USVRBVElWRSA9IFR5cGUuUVVBTlRJVEFUSVZFO1xuZXhwb3J0IGNvbnN0IE9SRElOQUwgPSBUeXBlLk9SRElOQUw7XG5leHBvcnQgY29uc3QgVEVNUE9SQUwgPSBUeXBlLlRFTVBPUkFMO1xuZXhwb3J0IGNvbnN0IE5PTUlOQUwgPSBUeXBlLk5PTUlOQUw7XG5cbmV4cG9ydCBjb25zdCBHRU9KU09OID0gVHlwZS5HRU9KU09OO1xuXG4vKipcbiAqIEdldCBmdWxsLCBsb3dlcmNhc2UgdHlwZSBuYW1lIGZvciBhIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0gIHR5cGVcbiAqIEByZXR1cm4gRnVsbCB0eXBlIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsTmFtZSh0eXBlOiBUeXBlfHN0cmluZyk6IFR5cGUge1xuICBpZiAodHlwZSkge1xuICAgIHR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdxJzpcbiAgICAgIGNhc2UgUVVBTlRJVEFUSVZFOlxuICAgICAgICByZXR1cm4gJ3F1YW50aXRhdGl2ZSc7XG4gICAgICBjYXNlICd0JzpcbiAgICAgIGNhc2UgVEVNUE9SQUw6XG4gICAgICAgIHJldHVybiAndGVtcG9yYWwnO1xuICAgICAgY2FzZSAnbyc6XG4gICAgICBjYXNlIE9SRElOQUw6XG4gICAgICAgIHJldHVybiAnb3JkaW5hbCc7XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgTk9NSU5BTDpcbiAgICAgICAgcmV0dXJuICdub21pbmFsJztcbiAgICAgIGNhc2UgVHlwZS5MQVRJVFVERTpcbiAgICAgICAgcmV0dXJuICdsYXRpdHVkZSc7XG4gICAgICBjYXNlIFR5cGUuTE9OR0lUVURFOlxuICAgICAgICByZXR1cm4gJ2xvbmdpdHVkZSc7XG4gICAgICBjYXNlIEdFT0pTT046XG4gICAgICAgIHJldHVybiAnZ2VvanNvbic7XG4gICAgfVxuICB9XG4gIC8vIElmIHdlIGdldCBpbnZhbGlkIGlucHV0LCByZXR1cm4gdW5kZWZpbmVkIHR5cGUuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isArray, isBoolean, isNumber, isString } from 'vega-util';\nimport { isAggregateOp, isCountingAggregateOp } from './aggregate';\nimport { autoMaxBins, binToString } from './bin';\nimport { rangeType } from './channel';\nimport * as log from './log';\nimport { getTimeUnitParts, normalizeTimeUnit } from './timeunit';\nimport { getFullName, QUANTITATIVE } from './type';\nimport { flatAccessWithDatum, replacePathInField, titlecase } from './util';\nexport function isConditionalSelection(c) {\n return c['selection'];\n}\nexport function isRepeatRef(field) {\n return field && !isString(field) && 'repeat' in field;\n}\nexport function toFieldDefBase(fieldDef) {\n var field = fieldDef.field, timeUnit = fieldDef.timeUnit, bin = fieldDef.bin, aggregate = fieldDef.aggregate;\n return tslib_1.__assign({}, (timeUnit ? { timeUnit: timeUnit } : {}), (bin ? { bin: bin } : {}), (aggregate ? { aggregate: aggregate } : {}), { field: field });\n}\nexport function isConditionalDef(channelDef) {\n return !!channelDef && !!channelDef.condition;\n}\n/**\n * Return if a channelDef is a ConditionalValueDef with ConditionFieldDef\n */\nexport function hasConditionalFieldDef(channelDef) {\n return !!channelDef && !!channelDef.condition && !isArray(channelDef.condition) && isFieldDef(channelDef.condition);\n}\nexport function hasConditionalValueDef(channelDef) {\n return !!channelDef && !!channelDef.condition && (isArray(channelDef.condition) || isValueDef(channelDef.condition));\n}\nexport function isFieldDef(channelDef) {\n return !!channelDef && (!!channelDef['field'] || channelDef['aggregate'] === 'count');\n}\nexport function isStringFieldDef(fieldDef) {\n return isFieldDef(fieldDef) && isString(fieldDef.field);\n}\nexport function isValueDef(channelDef) {\n return channelDef && 'value' in channelDef && channelDef['value'] !== undefined;\n}\nexport function isScaleFieldDef(channelDef) {\n return !!channelDef && (!!channelDef['scale'] || !!channelDef['sort']);\n}\nfunction isOpFieldDef(fieldDef) {\n return !!fieldDef['op'];\n}\nexport function vgField(fieldDef, opt) {\n if (opt === void 0) { opt = {}; }\n var field = fieldDef.field;\n var prefix = opt.prefix;\n var suffix = opt.suffix;\n if (isCount(fieldDef)) {\n field = 'count_*';\n }\n else {\n var fn = undefined;\n if (!opt.nofn) {\n if (isOpFieldDef(fieldDef)) {\n fn = fieldDef.op;\n }\n else if (fieldDef.bin) {\n fn = binToString(fieldDef.bin);\n suffix = opt.binSuffix || '';\n }\n else if (fieldDef.aggregate) {\n fn = String(fieldDef.aggregate);\n }\n else if (fieldDef.timeUnit) {\n fn = String(fieldDef.timeUnit);\n }\n }\n if (fn) {\n field = field ? fn + \"_\" + field : fn;\n }\n }\n if (suffix) {\n field = field + \"_\" + suffix;\n }\n if (prefix) {\n field = prefix + \"_\" + field;\n }\n if (opt.expr) {\n // Expression to access flattened field. No need to escape dots.\n return flatAccessWithDatum(field, opt.expr);\n }\n else {\n // We flattened all fields so paths should have become dot.\n return replacePathInField(field);\n }\n}\nexport function isDiscrete(fieldDef) {\n switch (fieldDef.type) {\n case 'nominal':\n case 'ordinal':\n case 'geojson':\n return true;\n case 'quantitative':\n return !!fieldDef.bin;\n case 'latitude':\n case 'longitude':\n case 'temporal':\n return false;\n }\n throw new Error(log.message.invalidFieldType(fieldDef.type));\n}\nexport function isContinuous(fieldDef) {\n return !isDiscrete(fieldDef);\n}\nexport function isCount(fieldDef) {\n return fieldDef.aggregate === 'count';\n}\nexport function verbalTitleFormatter(fieldDef, config) {\n var field = fieldDef.field, bin = fieldDef.bin, timeUnit = fieldDef.timeUnit, aggregate = fieldDef.aggregate;\n if (aggregate === 'count') {\n return config.countTitle;\n }\n else if (bin) {\n return field + \" (binned)\";\n }\n else if (timeUnit) {\n var units = getTimeUnitParts(timeUnit).join('-');\n return field + \" (\" + units + \")\";\n }\n else if (aggregate) {\n return titlecase(aggregate) + \" of \" + field;\n }\n return field;\n}\nexport function functionalTitleFormatter(fieldDef, config) {\n var fn = fieldDef.aggregate || fieldDef.timeUnit || (fieldDef.bin && 'bin');\n if (fn) {\n return fn.toUpperCase() + '(' + fieldDef.field + ')';\n }\n else {\n return fieldDef.field;\n }\n}\nexport var defaultTitleFormatter = function (fieldDef, config) {\n switch (config.fieldTitle) {\n case 'plain':\n return fieldDef.field;\n case 'functional':\n return functionalTitleFormatter(fieldDef, config);\n default:\n return verbalTitleFormatter(fieldDef, config);\n }\n};\nvar titleFormatter = defaultTitleFormatter;\nexport function setTitleFormatter(formatter) {\n titleFormatter = formatter;\n}\nexport function resetTitleFormatter() {\n setTitleFormatter(defaultTitleFormatter);\n}\nexport function title(fieldDef, config) {\n return titleFormatter(fieldDef, config);\n}\nexport function defaultType(fieldDef, channel) {\n if (fieldDef.timeUnit) {\n return 'temporal';\n }\n if (fieldDef.bin) {\n return 'quantitative';\n }\n switch (rangeType(channel)) {\n case 'continuous':\n return 'quantitative';\n case 'discrete':\n return 'nominal';\n case 'flexible': // color\n return 'nominal';\n default:\n return 'quantitative';\n }\n}\n/**\n * Returns the fieldDef -- either from the outer channelDef or from the condition of channelDef.\n * @param channelDef\n */\nexport function getFieldDef(channelDef) {\n if (isFieldDef(channelDef)) {\n return channelDef;\n }\n else if (hasConditionalFieldDef(channelDef)) {\n return channelDef.condition;\n }\n return undefined;\n}\n/**\n * Convert type to full, lowercase type, or augment the fieldDef with a default type if missing.\n */\nexport function normalize(channelDef, channel) {\n if (isString(channelDef) || isNumber(channelDef) || isBoolean(channelDef)) {\n var primitiveType = isString(channelDef) ? 'string' :\n isNumber(channelDef) ? 'number' : 'boolean';\n log.warn(log.message.primitiveChannelDef(channel, primitiveType, channelDef));\n return { value: channelDef };\n }\n // If a fieldDef contains a field, we need type.\n if (isFieldDef(channelDef)) {\n return normalizeFieldDef(channelDef, channel);\n }\n else if (hasConditionalFieldDef(channelDef)) {\n return tslib_1.__assign({}, channelDef, { \n // Need to cast as normalizeFieldDef normally return FieldDef, but here we know that it is definitely Condition\n condition: normalizeFieldDef(channelDef.condition, channel) });\n }\n return channelDef;\n}\nexport function normalizeFieldDef(fieldDef, channel) {\n // Drop invalid aggregate\n if (fieldDef.aggregate && !isAggregateOp(fieldDef.aggregate)) {\n var aggregate = fieldDef.aggregate, fieldDefWithoutAggregate = tslib_1.__rest(fieldDef, [\"aggregate\"]);\n log.warn(log.message.invalidAggregate(fieldDef.aggregate));\n fieldDef = fieldDefWithoutAggregate;\n }\n // Normalize Time Unit\n if (fieldDef.timeUnit) {\n fieldDef = tslib_1.__assign({}, fieldDef, { timeUnit: normalizeTimeUnit(fieldDef.timeUnit) });\n }\n // Normalize bin\n if (fieldDef.bin) {\n fieldDef = tslib_1.__assign({}, fieldDef, { bin: normalizeBin(fieldDef.bin, channel) });\n }\n // Normalize Type\n if (fieldDef.type) {\n var fullType = getFullName(fieldDef.type);\n if (fieldDef.type !== fullType) {\n // convert short type to full type\n fieldDef = tslib_1.__assign({}, fieldDef, { type: fullType });\n }\n if (fieldDef.type !== 'quantitative') {\n if (isCountingAggregateOp(fieldDef.aggregate)) {\n log.warn(log.message.invalidFieldTypeForCountAggregate(fieldDef.type, fieldDef.aggregate));\n fieldDef = tslib_1.__assign({}, fieldDef, { type: 'quantitative' });\n }\n }\n }\n else {\n // If type is empty / invalid, then augment with default type\n var newType = defaultType(fieldDef, channel);\n log.warn(log.message.emptyOrInvalidFieldType(fieldDef.type, channel, newType));\n fieldDef = tslib_1.__assign({}, fieldDef, { type: newType });\n }\n var _a = channelCompatibility(fieldDef, channel), compatible = _a.compatible, warning = _a.warning;\n if (!compatible) {\n log.warn(warning);\n }\n return fieldDef;\n}\nexport function normalizeBin(bin, channel) {\n if (isBoolean(bin)) {\n return { maxbins: autoMaxBins(channel) };\n }\n else if (!bin.maxbins && !bin.step) {\n return tslib_1.__assign({}, bin, { maxbins: autoMaxBins(channel) });\n }\n else {\n return bin;\n }\n}\nvar COMPATIBLE = { compatible: true };\nexport function channelCompatibility(fieldDef, channel) {\n var type = fieldDef.type;\n switch (channel) {\n case 'row':\n case 'column':\n if (isContinuous(fieldDef)) {\n return {\n compatible: false,\n warning: log.message.facetChannelShouldBeDiscrete(channel)\n };\n }\n return COMPATIBLE;\n case 'x':\n case 'y':\n case 'color':\n case 'fill':\n case 'stroke':\n case 'text':\n case 'detail':\n case 'key':\n case 'tooltip':\n case 'href':\n return COMPATIBLE;\n case 'longitude':\n case 'longitude2':\n case 'latitude':\n case 'latitude2':\n if (type !== QUANTITATIVE) {\n return {\n compatible: false,\n warning: \"Channel \" + channel + \" should be used with a quantitative field only, not \" + fieldDef.type + \" field.\"\n };\n }\n return COMPATIBLE;\n case 'opacity':\n case 'size':\n case 'x2':\n case 'y2':\n if ((type === 'nominal' && !fieldDef['sort']) || type === 'geojson') {\n return {\n compatible: false,\n warning: \"Channel \" + channel + \" should not be used with an unsorted discrete field.\"\n };\n }\n return COMPATIBLE;\n case 'shape':\n if (fieldDef.type !== 'nominal' && fieldDef.type !== 'geojson') {\n return {\n compatible: false,\n warning: 'Shape channel should be used with only either nominal or geojson data'\n };\n }\n return COMPATIBLE;\n case 'order':\n if (fieldDef.type === 'nominal') {\n return {\n compatible: false,\n warning: \"Channel order is inappropriate for nominal field, which has no inherent order.\"\n };\n }\n return COMPATIBLE;\n }\n throw new Error('channelCompatability not implemented for channel ' + channel);\n}\nexport function isNumberFieldDef(fieldDef) {\n return fieldDef.type === 'quantitative' || !!fieldDef.bin;\n}\nexport function isTimeFieldDef(fieldDef) {\n return fieldDef.type === 'temporal' || !!fieldDef.timeUnit;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRkZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmllbGRkZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakUsT0FBTyxFQUFDLGFBQWEsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVqRSxPQUFPLEVBQUMsV0FBVyxFQUFhLFdBQVcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxRCxPQUFPLEVBQVUsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSzdDLE9BQU8sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBTTdCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBVyxNQUFNLFlBQVksQ0FBQztBQUV6RSxPQUFPLEVBQUMsV0FBVyxFQUFFLFlBQVksRUFBTyxNQUFNLFFBQVEsQ0FBQztBQUN2RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBZ0MxRSxNQUFNLGlDQUFvQyxDQUFpQjtJQUN6RCxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN4QixDQUFDO0FBbURELE1BQU0sc0JBQXNCLEtBQVk7SUFDdEMsT0FBTyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUSxJQUFJLEtBQUssQ0FBQztBQUN4RCxDQUFDO0FBZ0RELE1BQU0seUJBQXlCLFFBQTBCO0lBQ2hELElBQUEsc0JBQUssRUFBRSw0QkFBUSxFQUFFLGtCQUFHLEVBQUUsOEJBQVMsQ0FBYTtJQUNuRCw0QkFDSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxRQUFRLFVBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDNUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFD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QUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDOUQsT0FBTztvQkFDTCxVQUFVLEVBQUUsS0FBSztvQkFDakIsT0FBTyxFQUFFLHVFQUF1RTtpQkFDakYsQ0FBQzthQUNIO1lBQ0QsT0FBTyxVQUFVLENBQUM7UUFFcEIsS0FBSyxPQUFPO1lBQ1YsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDL0IsT0FBTztvQkFDTCxVQUFVLEVBQUUsS0FBSztvQkFDakIsT0FBTyxFQUFFLGdGQUFnRjtpQkFDMUYsQ0FBQzthQUNIO1lBQ0QsT0FBTyxVQUFVLENBQUM7S0FDckI7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQ2pGLENBQUM7QUFFRCxNQUFNLDJCQUEyQixRQUF1QjtJQUN0RCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLHlCQUF5QixRQUF1QjtJQUNwRCxPQUFPLFFBQVEsQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBEZWNsYXJhdGlvbiBhbmQgdXRpbGl0eSBmb3IgdmFyaWFudHMgb2YgYSBmaWVsZCBkZWZpbml0aW9uIG9iamVjdFxuaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5pbXBvcnQge2lzQXJyYXksIGlzQm9vbGVhbiwgaXNOdW1iZXIsIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtpc0FnZ3JlZ2F0ZU9wLCBpc0NvdW50aW5nQWdncmVnYXRlT3B9IGZyb20gJy4vYWdncmVnYXRlJztcbmltcG9ydCB7QXhpc30gZnJvbSAnLi9heGlzJztcbmltcG9ydCB7YXV0b01heEJpbnMsIEJpblBhcmFtcywgYmluVG9TdHJpbmd9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2hhbm5lbCwgcmFuZ2VUeXBlfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtDb21wb3NpdGVBZ2dyZWdhdGV9IGZyb20gJy4vY29tcG9zaXRlbWFyayc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtUaXRsZU1peGluc30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge0xlZ2VuZH0gZnJvbSAnLi9sZWdlbmQnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4vbG9naWNhbCc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtTY2FsZX0gZnJvbSAnLi9zY2FsZSc7XG5pbXBvcnQge0VuY29kaW5nU29ydEZpZWxkLCBTb3J0T3JkZXJ9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7Z2V0VGltZVVuaXRQYXJ0cywgbm9ybWFsaXplVGltZVVuaXQsIFRpbWVVbml0fSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7QWdncmVnYXRlZEZpZWxkRGVmLCBXaW5kb3dGaWVsZERlZn0gZnJvbSAnLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtnZXRGdWxsTmFtZSwgUVVBTlRJVEFUSVZFLCBUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtmbGF0QWNjZXNzV2l0aERhdHVtLCByZXBsYWNlUGF0aEluRmllbGQsIHRpdGxlY2FzZX0gZnJvbSAnLi91dGlsJztcblxuXG4vKipcbiAqIERlZmluaXRpb24gb2JqZWN0IGZvciBhIGNvbnN0YW50IHZhbHVlIG9mIGFuIGVuY29kaW5nIGNoYW5uZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdWVEZWYge1xuICAvKipcbiAgICogQSBjb25zdGFudCB2YWx1ZSBpbiB2aXN1YWwgZG9tYWluIChlLmcuLCBgXCJyZWRcImAgLyBcIiMwMDk5ZmZcIiBmb3IgY29sb3IsIHZhbHVlcyBiZXR3ZWVuIGAwYCB0byBgMWAgZm9yIG9wYWNpdHkpLlxuICAgKi9cbiAgdmFsdWU6IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2VuZXJpYyB0eXBlIGZvciBjb25kaXRpb25hbCBjaGFubmVsRGVmLlxuICogRiBkZWZpbmVzIHRoZSB1bmRlcmx5aW5nIEZpZWxkRGVmIHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5uZWxEZWZXaXRoQ29uZGl0aW9uPEYgZXh0ZW5kcyBGaWVsZERlZjxhbnk+PiA9IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxGPiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxGPjtcblxuZXhwb3J0IHR5cGUgQ29uZGl0aW9uYWw8VD4gPSBDb25kaXRpb25hbFByZWRpY2F0ZTxUPiB8IENvbmRpdGlvbmFsU2VsZWN0aW9uPFQ+O1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFByZWRpY2F0ZTxUPiA9IHtcbiAgdGVzdDogTG9naWNhbE9wZXJhbmQ8UHJlZGljYXRlPjtcbn0gJiBUO1xuXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbFNlbGVjdGlvbjxUPiA9IHtcbiAgLyoqXG4gICAqIEEgW3NlbGVjdGlvbiBuYW1lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sKSwgb3IgYSBzZXJpZXMgb2YgW2NvbXBvc2VkIHNlbGVjdGlvbnNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2VsZWN0aW9uLmh0bWwjY29tcG9zZSkuXG4gICAqL1xuICBzZWxlY3Rpb246IExvZ2ljYWxPcGVyYW5kPHN0cmluZz47XG59ICYgVDtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29uZGl0aW9uYWxTZWxlY3Rpb248VD4oYzogQ29uZGl0aW9uYWw8VD4pOiBjIGlzIENvbmRpdGlvbmFsU2VsZWN0aW9uPFQ+IHtcbiAgcmV0dXJuIGNbJ3NlbGVjdGlvbiddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmRpdGlvblZhbHVlRGVmTWl4aW5zIHtcbiAgLyoqXG4gICAqIE9uZSBvciBtb3JlIHZhbHVlIGRlZmluaXRpb24ocykgd2l0aCBhIHNlbGVjdGlvbiBwcmVkaWNhdGUuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBBIGZpZWxkIGRlZmluaXRpb24ncyBgY29uZGl0aW9uYCBwcm9wZXJ0eSBjYW4gb25seSBjb250YWluIFt2YWx1ZSBkZWZpbml0aW9uc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9lbmNvZGluZy5odG1sI3ZhbHVlLWRlZilcbiAgICogc2luY2UgVmVnYS1MaXRlIG9ubHkgYWxsb3dzIGF0IG1vc3Qgb25lIGVuY29kZWQgZmllbGQgcGVyIGVuY29kaW5nIGNoYW5uZWwuXG4gICAqL1xuICBjb25kaXRpb24/OiBDb25kaXRpb25hbDxWYWx1ZURlZj4gfCBDb25kaXRpb25hbDxWYWx1ZURlZj5bXTtcbn1cblxuLyoqXG4gKiBBIEZpZWxkRGVmIHdpdGggQ29uZGl0aW9uPFZhbHVlRGVmPlxuICoge1xuICogICBjb25kaXRpb246IHt2YWx1ZTogLi4ufSxcbiAqICAgZmllbGQ6IC4uLixcbiAqICAgLi4uXG4gKiB9XG4gKi9cblxuZXhwb3J0IHR5cGUgRmllbGREZWZXaXRoQ29uZGl0aW9uPEYgZXh0ZW5kcyBGaWVsZERlZjxhbnk+PiA9IEYgJiBDb25kaXRpb25WYWx1ZURlZk1peGlucztcblxuLyoqXG4gKiBBIFZhbHVlRGVmIHdpdGggQ29uZGl0aW9uPFZhbHVlRGVmIHwgRmllbGREZWY+XG4gKiB7XG4gKiAgIGNvbmRpdGlvbjoge2ZpZWxkOiAuLi59IHwge3ZhbHVlOiAuLi59LFxuICogICB2YWx1ZTogLi4uLFxuICogfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbHVlRGVmV2l0aENvbmRpdGlvbjxGIGV4dGVuZHMgRmllbGREZWY8YW55Pj4ge1xuICAvKipcbiAgICogQSBmaWVsZCBkZWZpbml0aW9uIG9yIG9uZSBvciBtb3JlIHZhbHVlIGRlZmluaXRpb24ocykgd2l0aCBhIHNlbGVjdGlvbiBwcmVkaWNhdGUuXG4gICAqL1xuICBjb25kaXRpb24/OiBDb25kaXRpb25hbDxGPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPltdO1xuXG4gIC8qKlxuICAgKiBBIGNvbnN0YW50IHZhbHVlIGluIHZpc3VhbCBkb21haW4uXG4gICAqL1xuICB2YWx1ZT86IG51bWJlciB8IHN0cmluZyB8IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVmZXJlbmNlIHRvIGEgcmVwZWF0ZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcGVhdFJlZiA9IHtcbiAgcmVwZWF0OiAncm93JyB8ICdjb2x1bW4nXG59O1xuXG5leHBvcnQgdHlwZSBGaWVsZCA9IHN0cmluZyB8IFJlcGVhdFJlZjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwZWF0UmVmKGZpZWxkOiBGaWVsZCk6IGZpZWxkIGlzIFJlcGVhdFJlZiB7XG4gIHJldHVybiBmaWVsZCAmJiAhaXNTdHJpbmcoZmllbGQpICYmICdyZXBlYXQnIGluIGZpZWxkO1xufVxuXG4vKiogQGhpZGUgKi9cbmV4cG9ydCB0eXBlIEhpZGRlbkNvbXBvc2l0ZUFnZ3JlZ2F0ZSA9IENvbXBvc2l0ZUFnZ3JlZ2F0ZTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRlID0gQWdncmVnYXRlT3AgfCBIaWRkZW5Db21wb3NpdGVBZ2dyZWdhdGU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGREZWZCYXNlPEY+IHtcblxuICAvKipcbiAgICogX19SZXF1aXJlZC5fXyBBIHN0cmluZyBkZWZpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgZnJvbSB3aGljaCB0byBwdWxsIGEgZGF0YSB2YWx1ZVxuICAgKiBvciBhbiBvYmplY3QgZGVmaW5pbmcgaXRlcmF0ZWQgdmFsdWVzIGZyb20gdGhlIFtgcmVwZWF0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9yZXBlYXQuaHRtbCkgb3BlcmF0b3IuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBEb3RzIChgLmApIGFuZCBicmFja2V0cyAoYFtgIGFuZCBgXWApIGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBuZXN0ZWQgb2JqZWN0cyAoZS5nLiwgYFwiZmllbGRcIjogXCJmb28uYmFyXCJgIGFuZCBgXCJmaWVsZFwiOiBcImZvb1snYmFyJ11cImApLlxuICAgKiBJZiBmaWVsZCBuYW1lcyBjb250YWluIGRvdHMgb3IgYnJhY2tldHMgYnV0IGFyZSBub3QgbmVzdGVkLCB5b3UgY2FuIHVzZSBgXFxcXGAgdG8gZXNjYXBlIGRvdHMgYW5kIGJyYWNrZXRzIChlLmcuLCBgXCJhXFxcXC5iXCJgIGFuZCBgXCJhXFxcXFswXFxcXF1cImApLlxuICAgKiBTZWUgbW9yZSBkZXRhaWxzIGFib3V0IGVzY2FwaW5nIGluIHRoZSBbZmllbGQgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9maWVsZC5odG1sKS5cbiAgICpcbiAgICogX19Ob3RlOl9fIGBmaWVsZGAgaXMgbm90IHJlcXVpcmVkIGlmIGBhZ2dyZWdhdGVgIGlzIGBjb3VudGAuXG4gICAqL1xuICBmaWVsZD86IEY7XG5cbiAgLy8gZnVuY3Rpb25cblxuICAvKipcbiAgICogVGltZSB1bml0IChlLmcuLCBgeWVhcmAsIGB5ZWFybW9udGhgLCBgbW9udGhgLCBgaG91cnNgKSBmb3IgYSB0ZW1wb3JhbCBmaWVsZC5cbiAgICogb3IgW2EgdGVtcG9yYWwgZmllbGQgdGhhdCBnZXRzIGNhc3RlZCBhcyBvcmRpbmFsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGUuaHRtbCNjYXN0KS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB1bmRlZmluZWRgIChOb25lKVxuICAgKi9cbiAgdGltZVVuaXQ/OiBUaW1lVW5pdDtcblxuICAvKipcbiAgICogQSBmbGFnIGZvciBiaW5uaW5nIGEgYHF1YW50aXRhdGl2ZWAgZmllbGQsIG9yIFthbiBvYmplY3QgZGVmaW5pbmcgYmlubmluZyBwYXJhbWV0ZXJzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2Jpbi5odG1sI3BhcmFtcykuXG4gICAqIElmIGB0cnVlYCwgZGVmYXVsdCBbYmlubmluZyBwYXJhbWV0ZXJzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2Jpbi5odG1sKSB3aWxsIGJlIGFwcGxpZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgZmFsc2VgXG4gICAqL1xuICBiaW4/OiBib29sZWFuIHwgQmluUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGZpZWxkXG4gICAqIChlLmcuLCBgbWVhbmAsIGBzdW1gLCBgbWVkaWFuYCwgYG1pbmAsIGBtYXhgLCBgY291bnRgKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB1bmRlZmluZWRgIChOb25lKVxuICAgKi9cbiAgYWdncmVnYXRlPzogQWdncmVnYXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9GaWVsZERlZkJhc2UoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pOiBGaWVsZERlZkJhc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtmaWVsZCwgdGltZVVuaXQsIGJpbiwgYWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICByZXR1cm4ge1xuICAgIC4uLih0aW1lVW5pdCA/IHt0aW1lVW5pdH0gOiB7fSksXG4gICAgLi4uKGJpbiA/IHtiaW59IDoge30pLFxuICAgIC4uLihhZ2dyZWdhdGUgPyB7YWdncmVnYXRlfSA6IHt9KSxcbiAgICBmaWVsZFxuICB9O1xufVxuXG4vKipcbiAqICBEZWZpbml0aW9uIG9iamVjdCBmb3IgYSBkYXRhIGZpZWxkLCBpdHMgdHlwZSBhbmQgdHJhbnNmb3JtYXRpb24gb2YgYW4gZW5jb2RpbmcgY2hhbm5lbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZERlZjxGPiBleHRlbmRzIEZpZWxkRGVmQmFzZTxGPiwgVGl0bGVNaXhpbnMge1xuICAvKipcbiAgICogVGhlIGVuY29kZWQgZmllbGQncyB0eXBlIG9mIG1lYXN1cmVtZW50IChgXCJxdWFudGl0YXRpdmVcImAsIGBcInRlbXBvcmFsXCJgLCBgXCJvcmRpbmFsXCJgLCBvciBgXCJub21pbmFsXCJgKS5cbiAgICogSXQgY2FuIGFsc28gYmUgYSBgXCJnZW9qc29uXCJgIHR5cGUgZm9yIGVuY29kaW5nIFsnZ2Vvc2hhcGUnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2dlb3NoYXBlLmh0bWwpLlxuICAgKi9cbiAgLy8gKiBvciBhbiBpbml0aWFsIGNoYXJhY3RlciBvZiB0aGUgdHlwZSBuYW1lIChgXCJRXCJgLCBgXCJUXCJgLCBgXCJPXCJgLCBgXCJOXCJgKS5cbiAgLy8gKiBUaGlzIHByb3BlcnR5IGlzIGNhc2UtaW5zZW5zaXRpdmUuXG4gIHR5cGU6IFR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGVGaWVsZERlZjxGPiBleHRlbmRzIEZpZWxkRGVmPEY+IHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFubmVsJ3Mgc2NhbGUsIHdoaWNoIGlzIHRoZSBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdmFsdWVzIGluIHRoZSBkYXRhIGRvbWFpbiAobnVtYmVycywgZGF0ZXMsIHN0cmluZ3MsIGV0YykgdG8gdmlzdWFsIHZhbHVlcyAocGl4ZWxzLCBjb2xvcnMsIHNpemVzKSBvZiB0aGUgZW5jb2RpbmcgY2hhbm5lbHMuXG4gICAqXG4gICAqIElmIGBudWxsYCwgdGhlIHNjYWxlIHdpbGwgYmUgW2Rpc2FibGVkIGFuZCB0aGUgZGF0YSB2YWx1ZSB3aWxsIGJlIGRpcmVjdGx5IGVuY29kZWRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNhYmxlKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgZGVmYXVsdCBbc2NhbGUgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sKSBhcmUgYXBwbGllZC5cbiAgICovXG4gIHNjYWxlPzogU2NhbGUgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBTb3J0IG9yZGVyIGZvciB0aGUgZW5jb2RlZCBmaWVsZC5cbiAgICogU3VwcG9ydGVkIGBzb3J0YCB2YWx1ZXMgaW5jbHVkZSBgXCJhc2NlbmRpbmdcImAsIGBcImRlc2NlbmRpbmdcImAsIGBudWxsYCAobm8gc29ydGluZyksIG9yIGFuIGFycmF5IHNwZWNpZnlpbmcgdGhlIHByZWZlcnJlZCBvcmRlciBvZiB2YWx1ZXMuXG4gICAqIEZvciBmaWVsZHMgd2l0aCBkaXNjcmV0ZSBkb21haW5zLCBgc29ydGAgY2FuIGFsc28gYmUgYSBbc29ydCBmaWVsZCBkZWZpbml0aW9uIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zb3J0Lmh0bWwjc29ydC1maWVsZCkuXG4gICAqIEZvciBgc29ydGAgYXMgYW4gW2FycmF5IHNwZWNpZnlpbmcgdGhlIHByZWZlcnJlZCBvcmRlciBvZiB2YWx1ZXNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc29ydC5odG1sI3NvcnQtYXJyYXkpLCB0aGUgc29ydCBvcmRlciB3aWxsIG9iZXkgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXksIGZvbGxvd2VkIGJ5IGFueSB1bnNwZWNpZmllZCB2YWx1ZXMgaW4gdGhlaXIgb3JpZ2luYWwgb3JkZXIuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJhc2NlbmRpbmdcImBcbiAgICovXG4gIHNvcnQ/OiBzdHJpbmdbXSB8IFNvcnRPcmRlciB8IEVuY29kaW5nU29ydEZpZWxkPEY+IHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb3NpdGlvbkZpZWxkRGVmPEY+IGV4dGVuZHMgU2NhbGVGaWVsZERlZjxGPiB7XG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiBheGlzJ3MgZ3JpZGxpbmVzLCB0aWNrcyBhbmQgbGFiZWxzLlxuICAgKiBJZiBgbnVsbGAsIHRoZSBheGlzIGZvciB0aGUgZW5jb2RpbmcgY2hhbm5lbCB3aWxsIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIGRlZmF1bHQgW2F4aXMgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9heGlzLmh0bWwpIGFyZSBhcHBsaWVkLlxuICAgKi9cbiAgYXhpcz86IEF4aXMgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBUeXBlIG9mIHN0YWNraW5nIG9mZnNldCBpZiB0aGUgZmllbGQgc2hvdWxkIGJlIHN0YWNrZWQuXG4gICAqIGBzdGFja2AgaXMgb25seSBhcHBsaWNhYmxlIGZvciBgeGAgYW5kIGB5YCBjaGFubmVscyB3aXRoIGNvbnRpbnVvdXMgZG9tYWlucy5cbiAgICogRm9yIGV4YW1wbGUsIGBzdGFja2Agb2YgYHlgIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBzdGFja2luZyBmb3IgYSB2ZXJ0aWNhbCBiYXIgY2hhcnQuXG4gICAqXG4gICAqIGBzdGFja2AgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczpcbiAgICogLSBgXCJ6ZXJvXCJgOiBzdGFja2luZyB3aXRoIGJhc2VsaW5lIG9mZnNldCBhdCB6ZXJvIHZhbHVlIG9mIHRoZSBzY2FsZSAoZm9yIGNyZWF0aW5nIHR5cGljYWwgc3RhY2tlZCBbYmFyXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3N0YWNrLmh0bWwjYmFyKSBhbmQgW2FyZWFdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNhcmVhKSBjaGFydCkuXG4gICAqIC0gYFwibm9ybWFsaXplXCJgIC0gc3RhY2tpbmcgd2l0aCBub3JtYWxpemVkIGRvbWFpbiAoZm9yIGNyZWF0aW5nIFtub3JtYWxpemVkIHN0YWNrZWQgYmFyIGFuZCBhcmVhIGNoYXJ0c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zdGFjay5odG1sI25vcm1hbGl6ZWQpLiA8YnIvPlxuICAgKiAtYFwiY2VudGVyXCJgIC0gc3RhY2tpbmcgd2l0aCBjZW50ZXIgYmFzZWxpbmUgKGZvciBbc3RyZWFtZ3JhcGhdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNzdHJlYW1ncmFwaCkpLlxuICAgKiAtIGBudWxsYCAtIE5vLXN0YWNraW5nLiBUaGlzIHdpbGwgcHJvZHVjZSBsYXllcmVkIFtiYXJdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3RhY2suaHRtbCNsYXllcmVkLWJhci1jaGFydCkgYW5kIGFyZWEgY2hhcnQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgemVyb2AgZm9yIHBsb3RzIHdpdGggYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICogKDEpIHRoZSBtYXJrIGlzIGBiYXJgIG9yIGBhcmVhYDtcbiAgICogKDIpIHRoZSBzdGFja2VkIG1lYXN1cmUgY2hhbm5lbCAoeCBvciB5KSBoYXMgYSBsaW5lYXIgc2NhbGU7XG4gICAqICgzKSBBdCBsZWFzdCBvbmUgb2Ygbm9uLXBvc2l0aW9uIGNoYW5uZWxzIG1hcHBlZCB0byBhbiB1bmFnZ3JlZ2F0ZWQgZmllbGQgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB4IGFuZCB5LiAgT3RoZXJ3aXNlLCBgbnVsbGAgYnkgZGVmYXVsdC5cbiAgICovXG4gIHN0YWNrPzogU3RhY2tPZmZzZXQgfCBudWxsO1xufVxuXG4vKipcbiAqIEZpZWxkIGRlZmluaXRpb24gb2YgYSBtYXJrIHByb3BlcnR5LCB3aGljaCBjYW4gY29udGFpbiBhIGxlZ2VuZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrUHJvcEZpZWxkRGVmPEY+IGV4dGVuZHMgU2NhbGVGaWVsZERlZjxGPiB7XG4gICAvKipcbiAgICAqIEFuIG9iamVjdCBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIHRoZSBsZWdlbmQuXG4gICAgKiBJZiBgbnVsbGAsIHRoZSBsZWdlbmQgZm9yIHRoZSBlbmNvZGluZyBjaGFubmVsIHdpbGwgYmUgcmVtb3ZlZC5cbiAgICAqXG4gICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gSWYgdW5kZWZpbmVkLCBkZWZhdWx0IFtsZWdlbmQgcHJvcGVydGllc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sZWdlbmQuaHRtbCkgYXJlIGFwcGxpZWQuXG4gICAgKi9cbiAgbGVnZW5kPzogTGVnZW5kIHwgbnVsbDtcbn1cblxuLy8gRGV0YWlsXG5cbi8vIE9yZGVyIFBhdGggaGF2ZSBubyBzY2FsZVxuXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVyRmllbGREZWY8Rj4gZXh0ZW5kcyBGaWVsZERlZjxGPiB7XG4gIC8qKlxuICAgKiBUaGUgc29ydCBvcmRlci4gT25lIG9mIGBcImFzY2VuZGluZ1wiYCAoZGVmYXVsdCkgb3IgYFwiZGVzY2VuZGluZ1wiYC5cbiAgICovXG4gIHNvcnQ/OiBTb3J0T3JkZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dEZpZWxkRGVmPEY+IGV4dGVuZHMgRmllbGREZWY8Rj4ge1xuICAvKipcbiAgICogVGhlIFtmb3JtYXR0aW5nIHBhdHRlcm5dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZm9ybWF0Lmh0bWwpIGZvciBhIHRleHQgZmllbGQuIElmIG5vdCBkZWZpbmVkLCB0aGlzIHdpbGwgYmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgZm9ybWF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDaGFubmVsRGVmPEY+ID0gQ2hhbm5lbERlZldpdGhDb25kaXRpb248RmllbGREZWY8Rj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25kaXRpb25hbERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyBDaGFubmVsRGVmV2l0aENvbmRpdGlvbjxGaWVsZERlZjxGPj4ge1xuICByZXR1cm4gISFjaGFubmVsRGVmICYmICEhY2hhbm5lbERlZi5jb25kaXRpb247XG59XG5cbi8qKlxuICogUmV0dXJuIGlmIGEgY2hhbm5lbERlZiBpcyBhIENvbmRpdGlvbmFsVmFsdWVEZWYgd2l0aCBDb25kaXRpb25GaWVsZERlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ29uZGl0aW9uYWxGaWVsZERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyAoVmFsdWVEZWYgJiB7Y29uZGl0aW9uOiBDb25kaXRpb25hbDxGaWVsZERlZjxGPj59KSB7XG4gIHJldHVybiAhIWNoYW5uZWxEZWYgJiYgISFjaGFubmVsRGVmLmNvbmRpdGlvbiAmJiAhaXNBcnJheShjaGFubmVsRGVmLmNvbmRpdGlvbikgJiYgaXNGaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNDb25kaXRpb25hbFZhbHVlRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIChWYWx1ZURlZiAmIHtjb25kaXRpb246IENvbmRpdGlvbmFsPFZhbHVlRGVmPiB8IENvbmRpdGlvbmFsPFZhbHVlRGVmPltdfSkge1xuICByZXR1cm4gISFjaGFubmVsRGVmICYmICEhY2hhbm5lbERlZi5jb25kaXRpb24gJiYgKFxuICAgIGlzQXJyYXkoY2hhbm5lbERlZi5jb25kaXRpb24pIHx8IGlzVmFsdWVEZWYoY2hhbm5lbERlZi5jb25kaXRpb24pXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIEZpZWxkRGVmPEY+IHwgUG9zaXRpb25GaWVsZERlZjxGPiB8IFNjYWxlRmllbGREZWY8Rj4gfCBNYXJrUHJvcEZpZWxkRGVmPEY+IHwgT3JkZXJGaWVsZERlZjxGPiB8IFRleHRGaWVsZERlZjxGPiB7XG4gIHJldHVybiAhIWNoYW5uZWxEZWYgJiYgKCEhY2hhbm5lbERlZlsnZmllbGQnXSB8fCBjaGFubmVsRGVmWydhZ2dyZWdhdGUnXSA9PT0gJ2NvdW50Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZ0ZpZWxkRGVmKGZpZWxkRGVmOiBDaGFubmVsRGVmPHN0cmluZ3xSZXBlYXRSZWY+KTogZmllbGREZWYgaXMgRmllbGREZWY8c3RyaW5nPiB7XG4gIHJldHVybiBpc0ZpZWxkRGVmKGZpZWxkRGVmKSAmJiBpc1N0cmluZyhmaWVsZERlZi5maWVsZCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbHVlRGVmPEY+KGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8Rj4pOiBjaGFubmVsRGVmIGlzIFZhbHVlRGVmIHtcbiAgcmV0dXJuIGNoYW5uZWxEZWYgJiYgJ3ZhbHVlJyBpbiBjaGFubmVsRGVmICYmIGNoYW5uZWxEZWZbJ3ZhbHVlJ10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NhbGVGaWVsZERlZjxGPihjaGFubmVsRGVmOiBDaGFubmVsRGVmPEY+KTogY2hhbm5lbERlZiBpcyBTY2FsZUZpZWxkRGVmPEY+IHtcbiAgcmV0dXJuICEhY2hhbm5lbERlZiAmJiAoISFjaGFubmVsRGVmWydzY2FsZSddIHx8ICEhY2hhbm5lbERlZlsnc29ydCddKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZFJlZk9wdGlvbiB7XG4gIC8qKiBleGNsdWRlIGJpbiwgYWdncmVnYXRlLCB0aW1lVW5pdCAqL1xuICBub2ZuPzogYm9vbGVhbjtcbiAgLyoqIFdyYXAgdGhlIGZpZWxkIHdpdGggZGF0dW0gb3IgcGFyZW50IChlLmcuLCBkYXR1bVsnLi4uJ10gZm9yIFZlZ2EgRXhwcmVzc2lvbiAqL1xuICBleHByPzogJ2RhdHVtJyB8ICdwYXJlbnQnO1xuICAvKiogcHJlcGVuZCBmbiB3aXRoIGN1c3RvbSBmdW5jdGlvbiBwcmVmaXggKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogYXBwZW5kIHN1ZmZpeCB0byB0aGUgZmllbGQgcmVmIGZvciBiaW4gKGRlZmF1bHQ9J3N0YXJ0JykgKi9cbiAgYmluU3VmZml4PzogJ2VuZCcgfCAncmFuZ2UnIHwgJ21pZCc7XG4gIC8qKiBhcHBlbmQgc3VmZml4IHRvIHRoZSBmaWVsZCByZWYgKGdlbmVyYWwpICovXG4gIHN1ZmZpeD86IHN0cmluZztcbn1cblxuZnVuY3Rpb24gaXNPcEZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiB8IFdpbmRvd0ZpZWxkRGVmIHwgQWdncmVnYXRlZEZpZWxkRGVmKTogZmllbGREZWYgaXMgV2luZG93RmllbGREZWYgfCBBZ2dyZWdhdGVkRmllbGREZWYge1xuICByZXR1cm4gISFmaWVsZERlZlsnb3AnXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZnRmllbGQoZmllbGREZWY6IEZpZWxkRGVmQmFzZTxzdHJpbmc+IHwgV2luZG93RmllbGREZWYgfCBBZ2dyZWdhdGVkRmllbGREZWYsIG9wdDogRmllbGRSZWZPcHRpb24gPSB7fSk6IHN0cmluZyB7XG4gIGxldCBmaWVsZCA9IGZpZWxkRGVmLmZpZWxkO1xuICBjb25zdCBwcmVmaXggPSBvcHQucHJlZml4O1xuICBsZXQgc3VmZml4ID0gb3B0LnN1ZmZpeDtcblxuICBpZiAoaXNDb3VudChmaWVsZERlZikpIHtcbiAgICBmaWVsZCA9ICdjb3VudF8qJztcbiAgfSBlbHNlIHtcbiAgICBsZXQgZm46IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICAgIGlmICghb3B0Lm5vZm4pIHtcbiAgICAgIGlmIChpc09wRmllbGREZWYoZmllbGREZWYpKSB7XG4gICAgICAgIGZuID0gZmllbGREZWYub3A7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgICAgICBmbiA9IGJpblRvU3RyaW5nKGZpZWxkRGVmLmJpbik7XG4gICAgICAgIHN1ZmZpeCA9IG9wdC5iaW5TdWZmaXggfHwgJyc7XG4gICAgICB9IGVsc2UgaWYgKGZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICBmbiA9IFN0cmluZyhmaWVsZERlZi5hZ2dyZWdhdGUpO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZERlZi50aW1lVW5pdCkge1xuICAgICAgICBmbiA9IFN0cmluZyhmaWVsZERlZi50aW1lVW5pdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGZuKSB7XG4gICAgICBmaWVsZCA9IGZpZWxkID8gYCR7Zm59XyR7ZmllbGR9YCA6IGZuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdWZmaXgpIHtcbiAgICBmaWVsZCA9IGAke2ZpZWxkfV8ke3N1ZmZpeH1gO1xuICB9XG5cbiAgaWYgKHByZWZpeCkge1xuICAgIGZpZWxkID0gYCR7cHJlZml4fV8ke2ZpZWxkfWA7XG4gIH1cblxuICBpZiAob3B0LmV4cHIpIHtcbiAgICAvLyBFeHByZXNzaW9uIHRvIGFjY2VzcyBmbGF0dGVuZWQgZmllbGQuIE5vIG5lZWQgdG8gZXNjYXBlIGRvdHMuXG4gICAgcmV0dXJuIGZsYXRBY2Nlc3NXaXRoRGF0dW0oZmllbGQsIG9wdC5leHByKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBXZSBmbGF0dGVuZWQgYWxsIGZpZWxkcyBzbyBwYXRocyBzaG91bGQgaGF2ZSBiZWNvbWUgZG90LlxuICAgIHJldHVybiByZXBsYWNlUGF0aEluRmllbGQoZmllbGQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc2NyZXRlKGZpZWxkRGVmOiBGaWVsZERlZjxGaWVsZD4pIHtcbiAgc3dpdGNoIChmaWVsZERlZi50eXBlKSB7XG4gICAgY2FzZSAnbm9taW5hbCc6XG4gICAgY2FzZSAnb3JkaW5hbCc6XG4gICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdxdWFudGl0YXRpdmUnOlxuICAgICAgcmV0dXJuICEhZmllbGREZWYuYmluO1xuICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICBjYXNlICdsb25naXR1ZGUnOlxuICAgIGNhc2UgJ3RlbXBvcmFsJzpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuaW52YWxpZEZpZWxkVHlwZShmaWVsZERlZi50eXBlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVvdXMoZmllbGREZWY6IEZpZWxkRGVmPEZpZWxkPikge1xuICByZXR1cm4gIWlzRGlzY3JldGUoZmllbGREZWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb3VudChmaWVsZERlZjogRmllbGREZWZCYXNlPEZpZWxkPikge1xuICByZXR1cm4gZmllbGREZWYuYWdncmVnYXRlID09PSAnY291bnQnO1xufVxuXG5leHBvcnQgdHlwZSBGaWVsZFRpdGxlRm9ybWF0dGVyID0gKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpID0+IHN0cmluZztcblxuZXhwb3J0IGZ1bmN0aW9uIHZlcmJhbFRpdGxlRm9ybWF0dGVyKGZpZWxkRGVmOiBGaWVsZERlZkJhc2U8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3Qge2ZpZWxkOiBmaWVsZCwgYmluLCB0aW1lVW5pdCwgYWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICBpZiAoYWdncmVnYXRlID09PSAnY291bnQnKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5jb3VudFRpdGxlO1xuICB9IGVsc2UgaWYgKGJpbikge1xuICAgIHJldHVybiBgJHtmaWVsZH0gKGJpbm5lZClgO1xuICB9IGVsc2UgaWYgKHRpbWVVbml0KSB7XG4gICAgY29uc3QgdW5pdHMgPSBnZXRUaW1lVW5pdFBhcnRzKHRpbWVVbml0KS5qb2luKCctJyk7XG4gICAgcmV0dXJuIGAke2ZpZWxkfSAoJHt1bml0c30pYDtcbiAgfSBlbHNlIGlmIChhZ2dyZWdhdGUpIHtcbiAgICByZXR1cm4gYCR7dGl0bGVjYXNlKGFnZ3JlZ2F0ZSl9IG9mICR7ZmllbGR9YDtcbiAgfVxuICByZXR1cm4gZmllbGQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmdW5jdGlvbmFsVGl0bGVGb3JtYXR0ZXIoZmllbGREZWY6IEZpZWxkRGVmQmFzZTxzdHJpbmc+LCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBmbiA9IGZpZWxkRGVmLmFnZ3JlZ2F0ZSB8fCBmaWVsZERlZi50aW1lVW5pdCB8fCAoZmllbGREZWYuYmluICYmICdiaW4nKTtcbiAgaWYgKGZuKSB7XG4gICAgcmV0dXJuIGZuLnRvVXBwZXJDYXNlKCkgKyAnKCcgKyBmaWVsZERlZi5maWVsZCArICcpJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmllbGREZWYuZmllbGQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRUaXRsZUZvcm1hdHRlcjogRmllbGRUaXRsZUZvcm1hdHRlciA9IChmaWVsZERlZjogRmllbGREZWZCYXNlPHN0cmluZz4sIGNvbmZpZzogQ29uZmlnKSA9PiB7XG4gIHN3aXRjaCAoY29uZmlnLmZpZWxkVGl0bGUpIHtcbiAgICBjYXNlICdwbGFpbic6XG4gICAgICByZXR1cm4gZmllbGREZWYuZmllbGQ7XG4gICAgY2FzZSAnZnVuY3Rpb25hbCc6XG4gICAgICByZXR1cm4gZnVuY3Rpb25hbFRpdGxlRm9ybWF0dGVyKGZpZWxkRGVmLCBjb25maWcpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdmVyYmFsVGl0bGVGb3JtYXR0ZXIoZmllbGREZWYsIGNvbmZpZyk7XG4gIH1cbn07XG5cbmxldCB0aXRsZUZvcm1hdHRlciA9IGRlZmF1bHRUaXRsZUZvcm1hdHRlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIHNldFRpdGxlRm9ybWF0dGVyKGZvcm1hdHRlcjogRmllbGRUaXRsZUZvcm1hdHRlcikge1xuICB0aXRsZUZvcm1hdHRlciA9IGZvcm1hdHRlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0VGl0bGVGb3JtYXR0ZXIoKSB7XG4gIHNldFRpdGxlRm9ybWF0dGVyKGRlZmF1bHRUaXRsZUZvcm1hdHRlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0aXRsZShmaWVsZERlZjogRmllbGREZWZCYXNlPHN0cmluZz4sIGNvbmZpZzogQ29uZmlnKSB7XG4gIHJldHVybiB0aXRsZUZvcm1hdHRlcihmaWVsZERlZiwgY29uZmlnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRUeXBlKGZpZWxkRGVmOiBGaWVsZERlZjxGaWVsZD4sIGNoYW5uZWw6IENoYW5uZWwpOiBUeXBlIHtcbiAgaWYgKGZpZWxkRGVmLnRpbWVVbml0KSB7XG4gICAgcmV0dXJuICd0ZW1wb3JhbCc7XG4gIH1cbiAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgIHJldHVybiAncXVhbnRpdGF0aXZlJztcbiAgfVxuICBzd2l0Y2ggKHJhbmdlVHlwZShjaGFubmVsKSkge1xuICAgIGNhc2UgJ2NvbnRpbnVvdXMnOlxuICAgICAgcmV0dXJuICdxdWFudGl0YXRpdmUnO1xuICAgIGNhc2UgJ2Rpc2NyZXRlJzpcbiAgICAgIHJldHVybiAnbm9taW5hbCc7XG4gICAgY2FzZSAnZmxleGlibGUnOiAvLyBjb2xvclxuICAgICAgcmV0dXJuICdub21pbmFsJztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICdxdWFudGl0YXRpdmUnO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmllbGREZWYgLS0gZWl0aGVyIGZyb20gdGhlIG91dGVyIGNoYW5uZWxEZWYgb3IgZnJvbSB0aGUgY29uZGl0aW9uIG9mIGNoYW5uZWxEZWYuXG4gKiBAcGFyYW0gY2hhbm5lbERlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGREZWY8Rj4oY2hhbm5lbERlZjogQ2hhbm5lbERlZjxGPik6IEZpZWxkRGVmPEY+IHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gY2hhbm5lbERlZjtcbiAgfSBlbHNlIGlmIChoYXNDb25kaXRpb25hbEZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgcmV0dXJuIGNoYW5uZWxEZWYuY29uZGl0aW9uO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udmVydCB0eXBlIHRvIGZ1bGwsIGxvd2VyY2FzZSB0eXBlLCBvciBhdWdtZW50IHRoZSBmaWVsZERlZiB3aXRoIGEgZGVmYXVsdCB0eXBlIGlmIG1pc3NpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsKTogQ2hhbm5lbERlZjxhbnk+IHtcbiAgaWYgKGlzU3RyaW5nKGNoYW5uZWxEZWYpIHx8IGlzTnVtYmVyKGNoYW5uZWxEZWYpIHx8IGlzQm9vbGVhbihjaGFubmVsRGVmKSkge1xuICAgIGNvbnN0IHByaW1pdGl2ZVR5cGUgPSBpc1N0cmluZyhjaGFubmVsRGVmKSA/ICdzdHJpbmcnIDpcbiAgICAgIGlzTnVtYmVyKGNoYW5uZWxEZWYpID8gJ251bWJlcicgOiAnYm9vbGVhbic7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UucHJpbWl0aXZlQ2hhbm5lbERlZihjaGFubmVsLCBwcmltaXRpdmVUeXBlLCBjaGFubmVsRGVmKSk7XG4gICAgcmV0dXJuIHt2YWx1ZTogY2hhbm5lbERlZn07XG4gIH1cblxuICAvLyBJZiBhIGZpZWxkRGVmIGNvbnRhaW5zIGEgZmllbGQsIHdlIG5lZWQgdHlwZS5cbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRmllbGREZWYoY2hhbm5lbERlZiwgY2hhbm5lbCk7XG4gIH0gZWxzZSBpZiAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jaGFubmVsRGVmLFxuICAgICAgLy8gTmVlZCB0byBjYXN0IGFzIG5vcm1hbGl6ZUZpZWxkRGVmIG5vcm1hbGx5IHJldHVybiBGaWVsZERlZiwgYnV0IGhlcmUgd2Uga25vdyB0aGF0IGl0IGlzIGRlZmluaXRlbHkgQ29uZGl0aW9uPEZpZWxkRGVmPlxuICAgICAgY29uZGl0aW9uOiBub3JtYWxpemVGaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbiwgY2hhbm5lbCkgYXMgQ29uZGl0aW9uYWw8RmllbGREZWY8c3RyaW5nPj5cbiAgICB9O1xuICB9XG4gIHJldHVybiBjaGFubmVsRGVmO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gIC8vIERyb3AgaW52YWxpZCBhZ2dyZWdhdGVcbiAgaWYgKGZpZWxkRGVmLmFnZ3JlZ2F0ZSAmJiAhaXNBZ2dyZWdhdGVPcChmaWVsZERlZi5hZ2dyZWdhdGUpKSB7XG4gICAgY29uc3Qge2FnZ3JlZ2F0ZSwgLi4uZmllbGREZWZXaXRob3V0QWdncmVnYXRlfSA9IGZpZWxkRGVmO1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRBZ2dyZWdhdGUoZmllbGREZWYuYWdncmVnYXRlKSk7XG4gICAgZmllbGREZWYgPSBmaWVsZERlZldpdGhvdXRBZ2dyZWdhdGU7XG4gIH1cblxuICAvLyBOb3JtYWxpemUgVGltZSBVbml0XG4gIGlmIChmaWVsZERlZi50aW1lVW5pdCkge1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICB0aW1lVW5pdDogbm9ybWFsaXplVGltZVVuaXQoZmllbGREZWYudGltZVVuaXQpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBiaW5cbiAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICBiaW46IG5vcm1hbGl6ZUJpbihmaWVsZERlZi5iaW4sIGNoYW5uZWwpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBUeXBlXG4gIGlmIChmaWVsZERlZi50eXBlKSB7XG4gICAgY29uc3QgZnVsbFR5cGUgPSBnZXRGdWxsTmFtZShmaWVsZERlZi50eXBlKTtcbiAgICBpZiAoZmllbGREZWYudHlwZSAhPT0gZnVsbFR5cGUpIHtcbiAgICAgIC8vIGNvbnZlcnQgc2hvcnQgdHlwZSB0byBmdWxsIHR5cGVcbiAgICAgIGZpZWxkRGVmID0ge1xuICAgICAgICAuLi5maWVsZERlZixcbiAgICAgICAgdHlwZTogZnVsbFR5cGVcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChmaWVsZERlZi50eXBlICE9PSAncXVhbnRpdGF0aXZlJykge1xuICAgICAgaWYgKGlzQ291bnRpbmdBZ2dyZWdhdGVPcChmaWVsZERlZi5hZ2dyZWdhdGUpKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRGaWVsZFR5cGVGb3JDb3VudEFnZ3JlZ2F0ZShmaWVsZERlZi50eXBlLCBmaWVsZERlZi5hZ2dyZWdhdGUpKTtcbiAgICAgICAgZmllbGREZWYgPSB7XG4gICAgICAgICAgLi4uZmllbGREZWYsXG4gICAgICAgICAgdHlwZTogJ3F1YW50aXRhdGl2ZSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgdHlwZSBpcyBlbXB0eSAvIGludmFsaWQsIHRoZW4gYXVnbWVudCB3aXRoIGRlZmF1bHQgdHlwZVxuICAgIGNvbnN0IG5ld1R5cGUgPSBkZWZhdWx0VHlwZShmaWVsZERlZiwgY2hhbm5lbCk7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW1wdHlPckludmFsaWRGaWVsZFR5cGUoZmllbGREZWYudHlwZSwgY2hhbm5lbCwgbmV3VHlwZSkpO1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgICAuLi5maWVsZERlZixcbiAgICAgIHR5cGU6IG5ld1R5cGVcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qge2NvbXBhdGlibGUsIHdhcm5pbmd9ID0gY2hhbm5lbENvbXBhdGliaWxpdHkoZmllbGREZWYsIGNoYW5uZWwpO1xuICBpZiAoIWNvbXBhdGlibGUpIHtcbiAgICBsb2cud2Fybih3YXJuaW5nKTtcbiAgfVxuICByZXR1cm4gZmllbGREZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCaW4oYmluOiBCaW5QYXJhbXN8Ym9vbGVhbiwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICBpZiAoaXNCb29sZWFuKGJpbikpIHtcbiAgICByZXR1cm4ge21heGJpbnM6IGF1dG9NYXhCaW5zKGNoYW5uZWwpfTtcbiAgfSBlbHNlIGlmICghYmluLm1heGJpbnMgJiYgIWJpbi5zdGVwKSB7XG4gICAgcmV0dXJuIHsuLi5iaW4sIG1heGJpbnM6IGF1dG9NYXhCaW5zKGNoYW5uZWwpfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmluO1xuICB9XG59XG5cbmNvbnN0IENPTVBBVElCTEUgPSB7Y29tcGF0aWJsZTogdHJ1ZX07XG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbENvbXBhdGliaWxpdHkoZmllbGREZWY6IEZpZWxkRGVmPEZpZWxkPiwgY2hhbm5lbDogQ2hhbm5lbCk6IHtjb21wYXRpYmxlOiBib29sZWFuOyB3YXJuaW5nPzogc3RyaW5nO30ge1xuICBjb25zdCB0eXBlID0gZmllbGREZWYudHlwZTtcblxuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlICdyb3cnOlxuICAgIGNhc2UgJ2NvbHVtbic6XG4gICAgICBpZiAoaXNDb250aW51b3VzKGZpZWxkRGVmKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGxvZy5tZXNzYWdlLmZhY2V0Q2hhbm5lbFNob3VsZEJlRGlzY3JldGUoY2hhbm5lbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDT01QQVRJQkxFO1xuXG4gICAgY2FzZSAneCc6XG4gICAgY2FzZSAneSc6XG4gICAgY2FzZSAnY29sb3InOlxuICAgIGNhc2UgJ2ZpbGwnOlxuICAgIGNhc2UgJ3N0cm9rZSc6XG4gICAgY2FzZSAndGV4dCc6XG4gICAgY2FzZSAnZGV0YWlsJzpcbiAgICBjYXNlICdrZXknOlxuICAgIGNhc2UgJ3Rvb2x0aXAnOlxuICAgIGNhc2UgJ2hyZWYnOlxuICAgICAgcmV0dXJuIENPTVBBVElCTEU7XG5cbiAgICBjYXNlICdsb25naXR1ZGUnOlxuICAgIGNhc2UgJ2xvbmdpdHVkZTInOlxuICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICBjYXNlICdsYXRpdHVkZTInOlxuICAgICAgaWYgKHR5cGUgIT09IFFVQU5USVRBVElWRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGBDaGFubmVsICR7Y2hhbm5lbH0gc2hvdWxkIGJlIHVzZWQgd2l0aCBhIHF1YW50aXRhdGl2ZSBmaWVsZCBvbmx5LCBub3QgJHtmaWVsZERlZi50eXBlfSBmaWVsZC5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcblxuICAgIGNhc2UgJ29wYWNpdHknOlxuICAgIGNhc2UgJ3NpemUnOlxuICAgIGNhc2UgJ3gyJzpcbiAgICBjYXNlICd5Mic6XG4gICAgICBpZiAoKHR5cGUgPT09ICdub21pbmFsJyAmJiAhZmllbGREZWZbJ3NvcnQnXSkgfHwgdHlwZSA9PT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgICAgICAgd2FybmluZzogYENoYW5uZWwgJHtjaGFubmVsfSBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCBhbiB1bnNvcnRlZCBkaXNjcmV0ZSBmaWVsZC5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcblxuICAgIGNhc2UgJ3NoYXBlJzpcbiAgICAgIGlmIChmaWVsZERlZi50eXBlICE9PSAnbm9taW5hbCcgJiYgZmllbGREZWYudHlwZSAhPT0gJ2dlb2pzb24nKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGF0aWJsZTogZmFsc2UsXG4gICAgICAgICAgd2FybmluZzogJ1NoYXBlIGNoYW5uZWwgc2hvdWxkIGJlIHVzZWQgd2l0aCBvbmx5IGVpdGhlciBub21pbmFsIG9yIGdlb2pzb24gZGF0YSdcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBDT01QQVRJQkxFO1xuXG4gICAgY2FzZSAnb3JkZXInOlxuICAgICAgaWYgKGZpZWxkRGVmLnR5cGUgPT09ICdub21pbmFsJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhdGlibGU6IGZhbHNlLFxuICAgICAgICAgIHdhcm5pbmc6IGBDaGFubmVsIG9yZGVyIGlzIGluYXBwcm9wcmlhdGUgZm9yIG5vbWluYWwgZmllbGQsIHdoaWNoIGhhcyBubyBpbmhlcmVudCBvcmRlci5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gQ09NUEFUSUJMRTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWxDb21wYXRhYmlsaXR5IG5vdCBpbXBsZW1lbnRlZCBmb3IgY2hhbm5lbCAnICsgY2hhbm5lbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlckZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxhbnk+KSB7XG4gIHJldHVybiBmaWVsZERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJyB8fCAhIWZpZWxkRGVmLmJpbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZUZpZWxkRGVmKGZpZWxkRGVmOiBGaWVsZERlZjxhbnk+KSB7XG4gIHJldHVybiBmaWVsZERlZi50eXBlID09PSAndGVtcG9yYWwnIHx8ICEhZmllbGREZWYudGltZVVuaXQ7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { CHANNELS, isChannel, supportMark } from './channel';\nimport { getFieldDef, hasConditionalFieldDef, isConditionalDef, isFieldDef, isValueDef, normalize, normalizeFieldDef } from './fielddef';\nimport * as log from './log';\nimport { Type } from './type';\nimport { contains, keys, some } from './util';\nexport function channelHasField(encoding, channel) {\n var channelDef = encoding && encoding[channel];\n if (channelDef) {\n if (isArray(channelDef)) {\n return some(channelDef, function (fieldDef) { return !!fieldDef.field; });\n }\n else {\n return isFieldDef(channelDef) || hasConditionalFieldDef(channelDef);\n }\n }\n return false;\n}\nexport function isAggregate(encoding) {\n return some(CHANNELS, function (channel) {\n if (channelHasField(encoding, channel)) {\n var channelDef = encoding[channel];\n if (isArray(channelDef)) {\n return some(channelDef, function (fieldDef) { return !!fieldDef.aggregate; });\n }\n else {\n var fieldDef = getFieldDef(channelDef);\n return fieldDef && !!fieldDef.aggregate;\n }\n }\n return false;\n });\n}\nexport function normalizeEncoding(encoding, mark) {\n return keys(encoding).reduce(function (normalizedEncoding, channel) {\n var _a;\n if (!isChannel(channel)) {\n // Drop invalid channel\n log.warn(log.message.invalidEncodingChannel(channel));\n return normalizedEncoding;\n }\n if (!supportMark(channel, mark)) {\n // Drop unsupported channel\n log.warn(log.message.incompatibleChannel(channel, mark));\n return normalizedEncoding;\n }\n // Drop line's size if the field is aggregated.\n if (channel === 'size' && mark === 'line') {\n var fieldDef = getFieldDef(encoding[channel]);\n if (fieldDef && fieldDef.aggregate) {\n log.warn(log.message.LINE_WITH_VARYING_SIZE);\n return normalizedEncoding;\n }\n }\n // Drop color if either fill or stroke is specified\n if (channel === 'color' && ('fill' in encoding || 'stroke' in encoding)) {\n log.warn(log.message.droppingColor('encoding', { fill: 'fill' in encoding, stroke: 'stroke' in encoding }));\n return normalizedEncoding;\n }\n var channelDef = encoding[channel];\n if (channel === 'detail' ||\n (channel === 'order' && !isArray(channelDef) && !isValueDef(channelDef)) ||\n (channel === 'tooltip' && isArray(channelDef))) {\n if (channelDef) {\n // Array of fieldDefs for detail channel (or production rule)\n normalizedEncoding[channel] = (isArray(channelDef) ? channelDef : [channelDef])\n .reduce(function (defs, fieldDef) {\n if (!isFieldDef(fieldDef)) {\n log.warn(log.message.emptyFieldDef(fieldDef, channel));\n }\n else {\n defs.push(normalizeFieldDef(fieldDef, channel));\n }\n return defs;\n }, []);\n }\n }\n else {\n var fieldDef = getFieldDef(encoding[channel]);\n if (fieldDef && contains([Type.LATITUDE, Type.LONGITUDE], fieldDef.type)) {\n var _b = channel, _ = normalizedEncoding[_b], newEncoding = tslib_1.__rest(normalizedEncoding, [typeof _b === \"symbol\" ? _b : _b + \"\"]);\n var newChannel = channel === 'x' ? 'longitude' :\n channel === 'y' ? 'latitude' :\n channel === 'x2' ? 'longitude2' :\n channel === 'y2' ? 'latitude2' : undefined;\n log.warn(log.message.latLongDeprecated(channel, fieldDef.type, newChannel));\n return tslib_1.__assign({}, newEncoding, (_a = {}, _a[newChannel] = tslib_1.__assign({}, normalize(fieldDef, channel), { type: 'quantitative' }), _a));\n }\n if (!isFieldDef(channelDef) && !isValueDef(channelDef) && !isConditionalDef(channelDef)) {\n log.warn(log.message.emptyFieldDef(channelDef, channel));\n return normalizedEncoding;\n }\n normalizedEncoding[channel] = normalize(channelDef, channel);\n }\n return normalizedEncoding;\n }, {});\n}\nexport function isRanged(encoding) {\n return encoding && ((!!encoding.x && !!encoding.x2) || (!!encoding.y && !!encoding.y2));\n}\nexport function fieldDefs(encoding) {\n var arr = [];\n CHANNELS.forEach(function (channel) {\n if (channelHasField(encoding, channel)) {\n var channelDef = encoding[channel];\n (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (def) {\n if (isFieldDef(def)) {\n arr.push(def);\n }\n else if (hasConditionalFieldDef(def)) {\n arr.push(def.condition);\n }\n });\n }\n });\n return arr;\n}\nexport function forEach(mapping, f, thisArg) {\n if (!mapping) {\n return;\n }\n var _loop_1 = function (channel) {\n if (isArray(mapping[channel])) {\n mapping[channel].forEach(function (channelDef) {\n f.call(thisArg, channelDef, channel);\n });\n }\n else {\n f.call(thisArg, mapping[channel], channel);\n }\n };\n for (var _i = 0, _a = keys(mapping); _i < _a.length; _i++) {\n var channel = _a[_i];\n _loop_1(channel);\n }\n}\nexport function reduce(mapping, f, init, thisArg) {\n if (!mapping) {\n return init;\n }\n return keys(mapping).reduce(function (r, channel) {\n var map = mapping[channel];\n if (isArray(map)) {\n return map.reduce(function (r1, channelDef) {\n return f.call(thisArg, r1, channelDef, channel);\n }, r);\n }\n else {\n return f.call(thisArg, r, map, channel);\n }\n }, init);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5jb2RpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFVLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXBFLE9BQU8sRUFLTCxXQUFXLEVBQ1gsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsVUFBVSxFQUVWLFNBQVMsRUFDVCxpQkFBaUIsRUFNbEIsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFN0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUE4STVDLE1BQU0sMEJBQTBCLFFBQWtDLEVBQUUsT0FBZ0I7SUFDbEYsSUFBTSxVQUFVLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqRCxJQUFJLFVBQVUsRUFBRTtRQUNkLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFDLFFBQVEsSUFBSyxPQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFoQixDQUFnQixDQUFDLENBQUM7U0FDekQ7YUFBTTtZQUNMLE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3JFO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFHRCxNQUFNLHNCQUFzQixRQUFrQztJQUM1RCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBQyxPQUFPO1FBQzVCLElBQUksZUFBZSxD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LEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFDLEVBQUssRUFBRSxVQUE4QjtnQkFDdEQsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNQO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWwsIENIQU5ORUxTLCBpc0NoYW5uZWwsIHN1cHBvcnRNYXJrfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtcbiAgQ2hhbm5lbERlZixcbiAgRmllbGQsXG4gIEZpZWxkRGVmLFxuICBGaWVsZERlZldpdGhDb25kaXRpb24sXG4gIGdldEZpZWxkRGVmLFxuICBoYXNDb25kaXRpb25hbEZpZWxkRGVmLFxuICBpc0NvbmRpdGlvbmFsRGVmLFxuICBpc0ZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBNYXJrUHJvcEZpZWxkRGVmLFxuICBub3JtYWxpemUsXG4gIG5vcm1hbGl6ZUZpZWxkRGVmLFxuICBPcmRlckZpZWxkRGVmLFxuICBQb3NpdGlvbkZpZWxkRGVmLFxuICBUZXh0RmllbGREZWYsXG4gIFZhbHVlRGVmLFxuICBWYWx1ZURlZldpdGhDb25kaXRpb25cbn0gZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtUeXBlfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtjb250YWlucywga2V5cywgc29tZX0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZzxGPiB7XG4gIC8qKlxuICAgKiBYIGNvb3JkaW5hdGVzIG9mIHRoZSBtYXJrcywgb3Igd2lkdGggb2YgaG9yaXpvbnRhbCBgXCJiYXJcImAgYW5kIGBcImFyZWFcImAuXG4gICAqL1xuICB4PzogUG9zaXRpb25GaWVsZERlZjxGPiB8IFZhbHVlRGVmO1xuXG4gIC8qKlxuICAgKiBZIGNvb3JkaW5hdGVzIG9mIHRoZSBtYXJrcywgb3IgaGVpZ2h0IG9mIHZlcnRpY2FsIGBcImJhclwiYCBhbmQgYFwiYXJlYVwiYC5cbiAgICovXG4gIHk/OiBQb3NpdGlvbkZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cbiAgLyoqXG4gICAqIFgyIGNvb3JkaW5hdGVzIGZvciByYW5nZWQgYFwiYXJlYVwiYCwgYFwiYmFyXCJgLCBgXCJyZWN0XCJgLCBhbmQgIGBcInJ1bGVcImAuXG4gICAqL1xuICAvLyBUT0RPOiBIYW0gbmVlZCB0byBhZGQgZGVmYXVsdCBiZWhhdmlvclxuICB4Mj86IEZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cbiAgLyoqXG4gICAqIFkyIGNvb3JkaW5hdGVzIGZvciByYW5nZWQgYFwiYXJlYVwiYCwgYFwiYmFyXCJgLCBgXCJyZWN0XCJgLCBhbmQgIGBcInJ1bGVcImAuXG4gICAqL1xuICAvLyBUT0RPOiBIYW0gbmVlZCB0byBhZGQgZGVmYXVsdCBiZWhhdmlvclxuICB5Mj86IEZpZWxkRGVmPEY+IHwgVmFsdWVEZWY7XG5cblxuICAvKipcbiAgICogTG9uZ2l0dWRlIHBvc2l0aW9uIG9mIGdlb2dyYXBoaWNhbGx5IHByb2plY3RlZCBtYXJrcy5cbiAgICovXG4gIGxvbmdpdHVkZT86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBMYXRpdHVkZSBwb3NpdGlvbiBvZiBnZW9ncmFwaGljYWxseSBwcm9qZWN0ZWQgbWFya3MuXG4gICAqL1xuICBsYXRpdHVkZT86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBMb25naXR1ZGUtMiBwb3NpdGlvbiBmb3IgZ2VvZ3JhcGhpY2FsbHkgcHJvamVjdGVkIHJhbmdlZCBgXCJhcmVhXCJgLCBgXCJiYXJcImAsIGBcInJlY3RcImAsIGFuZCAgYFwicnVsZVwiYC5cbiAgICovXG4gIGxvbmdpdHVkZTI/OiBGaWVsZERlZjxGPjtcblxuICAvKipcbiAgICogTGF0aXR1ZGUtMiBwb3NpdGlvbiBmb3IgZ2VvZ3JhcGhpY2FsbHkgcHJvamVjdGVkIHJhbmdlZCBgXCJhcmVhXCJgLCBgXCJiYXJcImAsIGBcInJlY3RcImAsIGFuZCAgYFwicnVsZVwiYC5cbiAgICovXG4gIGxhdGl0dWRlMj86IEZpZWxkRGVmPEY+O1xuXG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgbWFya3Mg4oCTIGVpdGhlciBmaWxsIG9yIHN0cm9rZSBjb2xvciBiYXNlZCBvbiAgdGhlIGBmaWxsZWRgIHByb3BlcnR5IG9mIG1hcmsgZGVmaW5pdGlvbi5cbiAgICogQnkgZGVmYXVsdCwgYGNvbG9yYCByZXByZXNlbnRzIGZpbGwgY29sb3IgZm9yIGBcImFyZWFcImAsIGBcImJhclwiYCwgYFwidGlja1wiYCxcbiAgICogYFwidGV4dFwiYCwgYFwidHJhaWxcImAsIGBcImNpcmNsZVwiYCwgYW5kIGBcInNxdWFyZVwiYCAvIHN0cm9rZSBjb2xvciBmb3IgYFwibGluZVwiYCBhbmQgYFwicG9pbnRcImAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IGNvbG9yIGRlcGVuZHMgb24gW21hcmsgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI21hcmspJ3MgYGNvbG9yYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogX05vdGU6X1xuICAgKiAxKSBGb3IgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBib3RoIGZpbGwgYW5kIHN0cm9rZSBjb2xvcnMgb2YgdGhlIG1hcmtzLCBwbGVhc2UgdXNlIHRoZSBgZmlsbGAgYW5kIGBzdHJva2VgIGNoYW5uZWxzLiAgSWYgZWl0aGVyIGBmaWxsYCBvciBgc3Ryb2tlYCBjaGFubmVsIGlzIHNwZWNpZmllZCwgYGNvbG9yYCBjaGFubmVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICogMikgU2VlIHRoZSBzY2FsZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbWl6aW5nIFtjb2xvciBzY2hlbWVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzY2hlbWUpLlxuICAgKi9cbiAgY29sb3I/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIEZpbGwgY29sb3Igb2YgdGhlIG1hcmtzLlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gSWYgdW5kZWZpbmVkLCB0aGUgZGVmYXVsdCBjb2xvciBkZXBlbmRzIG9uIFttYXJrIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNtYXJrKSdzIGBjb2xvcmAgcHJvcGVydHkuXG4gICAqXG4gICAqIF9Ob3RlOl8gV2hlbiB1c2luZyBgZmlsbGAgY2hhbm5lbCwgYGNvbG9yIGAgY2hhbm5lbCB3aWxsIGJlIGlnbm9yZWQuIFRvIGN1c3RvbWl6ZSBib3RoIGZpbGwgYW5kIHN0cm9rZSwgcGxlYXNlIHVzZSBgZmlsbGAgYW5kIGBzdHJva2VgIGNoYW5uZWxzIChub3QgYGZpbGxgIGFuZCBgY29sb3JgKS5cbiAgICovXG4gIGZpbGw/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cblxuICAvKipcbiAgICogU3Ryb2tlIGNvbG9yIG9mIHRoZSBtYXJrcy5cbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgdGhlIGRlZmF1bHQgY29sb3IgZGVwZW5kcyBvbiBbbWFyayBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwjbWFyaykncyBgY29sb3JgIHByb3BlcnR5LlxuICAgKlxuICAgKiBfTm90ZTpfIFdoZW4gdXNpbmcgYHN0cm9rZWAgY2hhbm5lbCwgYGNvbG9yIGAgY2hhbm5lbCB3aWxsIGJlIGlnbm9yZWQuIFRvIGN1c3RvbWl6ZSBib3RoIHN0cm9rZSBhbmQgZmlsbCwgcGxlYXNlIHVzZSBgc3Ryb2tlYCBhbmQgYGZpbGxgIGNoYW5uZWxzIChub3QgYHN0cm9rZWAgYW5kIGBjb2xvcmApLlxuICAgKi9cbiAgc3Ryb2tlPzogRmllbGREZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8Rj4+O1xuXG5cbiAgLyoqXG4gICAqIE9wYWNpdHkgb2YgdGhlIG1hcmtzIOKAkyBlaXRoZXIgY2FuIGJlIGEgdmFsdWUgb3IgYSByYW5nZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIElmIHVuZGVmaW5lZCwgdGhlIGRlZmF1bHQgb3BhY2l0eSBkZXBlbmRzIG9uIFttYXJrIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNtYXJrKSdzIGBvcGFjaXR5YCBwcm9wZXJ0eS5cbiAgICovXG4gIG9wYWNpdHk/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgdGhlIG1hcmsuXG4gICAqIC0gRm9yIGBcInBvaW50XCJgLCBgXCJzcXVhcmVcImAgYW5kIGBcImNpcmNsZVwiYCwg4oCTIHRoZSBzeW1ib2wgc2l6ZSwgb3IgcGl4ZWwgYXJlYSBvZiB0aGUgbWFyay5cbiAgICogLSBGb3IgYFwiYmFyXCJgIGFuZCBgXCJ0aWNrXCJgIOKAkyB0aGUgYmFyIGFuZCB0aWNrJ3Mgc2l6ZS5cbiAgICogLSBGb3IgYFwidGV4dFwiYCDigJMgdGhlIHRleHQncyBmb250IHNpemUuXG4gICAqIC0gU2l6ZSBpcyB1bnN1cHBvcnRlZCBmb3IgYFwibGluZVwiYCwgYFwiYXJlYVwiYCwgYW5kIGBcInJlY3RcImAuIChVc2UgYFwidHJhaWxcImAgaW5zdGVhZCBvZiBsaW5lIHdpdGggdmFyeWluZyBzaXplKVxuICAgKi9cbiAgc2l6ZT86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPEY+PiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPEY+PjtcblxuICAvKipcbiAgICogRm9yIGBwb2ludGAgbWFya3MgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlXG4gICAqIGBcImNpcmNsZVwiYCAoZGVmYXVsdCksIGBcInNxdWFyZVwiYCwgYFwiY3Jvc3NcImAsIGBcImRpYW1vbmRcImAsIGBcInRyaWFuZ2xlLXVwXCJgLFxuICAgKiBvciBgXCJ0cmlhbmdsZS1kb3duXCJgLCBvciBlbHNlIGEgY3VzdG9tIFNWRyBwYXRoIHN0cmluZy5cbiAgICogRm9yIGBnZW9zaGFwZWAgbWFya3MgaXQgc2hvdWxkIGJlIGEgZmllbGQgZGVmaW5pdGlvbiBvZiB0aGUgZ2VvanNvbiBkYXRhXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bmRlZmluZWQsIHRoZSBkZWZhdWx0IHNoYXBlIGRlcGVuZHMgb24gW21hcmsgY29uZmlnXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI3BvaW50LWNvbmZpZykncyBgc2hhcGVgIHByb3BlcnR5LlxuICAgKi9cbiAgc2hhcGU/OiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxGPj47IC8vIFRPRE86IG1heWJlIGRpc3Rpbmd1aXNoIG9yZGluYWwtb25seVxuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGxldmVscyBvZiBkZXRhaWwgZm9yIGdyb3VwaW5nIGRhdGEgaW4gYWdncmVnYXRlIHZpZXdzIGFuZFxuICAgKiBpbiBsaW5lLCB0cmFpbCwgYW5kIGFyZWEgbWFya3Mgd2l0aG91dCBtYXBwaW5nIGRhdGEgdG8gYSBzcGVjaWZpYyB2aXN1YWwgY2hhbm5lbC5cbiAgICovXG4gIGRldGFpbD86IEZpZWxkRGVmPEY+IHwgRmllbGREZWY8Rj5bXTtcblxuICAvKipcbiAgICogQSBkYXRhIGZpZWxkIHRvIHVzZSBhcyBhIHVuaXF1ZSBrZXkgZm9yIGRhdGEgYmluZGluZy4gV2hlbiBhIHZpc3VhbGl6YXRpb27igJlzIGRhdGEgaXMgdXBkYXRlZCwgdGhlIGtleSB2YWx1ZSB3aWxsIGJlIHVzZWQgdG8gbWF0Y2ggZGF0YSBlbGVtZW50cyB0byBleGlzdGluZyBtYXJrIGluc3RhbmNlcy4gVXNlIGEga2V5IGNoYW5uZWwgdG8gZW5hYmxlIG9iamVjdCBjb25zdGFuY3kgZm9yIHRyYW5zaXRpb25zIG92ZXIgZHluYW1pYyBkYXRhLlxuICAgKi9cbiAga2V5PzogRmllbGREZWY8Rj47XG5cbiAgLyoqXG4gICAqIFRleHQgb2YgdGhlIGB0ZXh0YCBtYXJrLlxuICAgKi9cbiAgdGV4dD86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxUZXh0RmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPFRleHRGaWVsZERlZjxGPj47XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sdGlwIHRleHQgdG8gc2hvdyB1cG9uIG1vdXNlIGhvdmVyLlxuICAgKi9cbiAgdG9vbHRpcD86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxUZXh0RmllbGREZWY8Rj4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPFRleHRGaWVsZERlZjxGPj4gfCBUZXh0RmllbGREZWY8Rj5bXTtcblxuICAvKipcbiAgICogQSBVUkwgdG8gbG9hZCB1cG9uIG1vdXNlIGNsaWNrLlxuICAgKi9cbiAgaHJlZj86IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxGaWVsZERlZjxGPj4gfCBWYWx1ZURlZldpdGhDb25kaXRpb248RmllbGREZWY8Rj4+O1xuXG4gIC8qKlxuICAgKiBPcmRlciBvZiB0aGUgbWFya3MuXG4gICAqIC0gRm9yIHN0YWNrZWQgbWFya3MsIHRoaXMgYG9yZGVyYCBjaGFubmVsIGVuY29kZXMgW3N0YWNrIG9yZGVyXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3N0YWNrLmh0bWwjb3JkZXIpLlxuICAgKiAtIEZvciBsaW5lIGFuZCB0cmFpbCBtYXJrcywgdGhpcyBgb3JkZXJgIGNoYW5uZWwgZW5jb2RlcyBvcmRlciBvZiBkYXRhIHBvaW50cyBpbiB0aGUgbGluZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgW2EgY29ubmVjdGVkIHNjYXR0ZXJwbG90XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9leGFtcGxlcy9jb25uZWN0ZWRfc2NhdHRlcnBsb3QuaHRtbCkuICBTZXR0aW5nIGBvcmRlcmAgdG8gYHtcInZhbHVlXCI6IG51bGx9YCBtYWtlcyB0aGUgbGluZSBtYXJrcyB1c2UgdGhlIG9yaWdpbmFsIG9yZGVyIGluIHRoZSBkYXRhIHNvdXJjZXMuXG4gICAqIC0gT3RoZXJ3aXNlLCB0aGlzIGBvcmRlcmAgY2hhbm5lbCBlbmNvZGVzIGxheWVyIG9yZGVyIG9mIHRoZSBtYXJrcy5cbiAgICpcbiAgICogX19Ob3RlX186IEluIGFnZ3JlZ2F0ZSBwbG90cywgYG9yZGVyYCBmaWVsZCBzaG91bGQgYmUgYGFnZ3JlZ2F0ZWBkIHRvIGF2b2lkIGNyZWF0aW5nIGFkZGl0aW9uYWwgYWdncmVnYXRpb24gZ3JvdXBpbmcuXG4gICAqL1xuICBvcmRlcj86IE9yZGVyRmllbGREZWY8Rj4gfCBPcmRlckZpZWxkRGVmPEY+W10gfCBWYWx1ZURlZjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZ1dpdGhGYWNldDxGPiBleHRlbmRzIEVuY29kaW5nPEY+LCBGYWNldE1hcHBpbmc8Rj4ge31cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5uZWxIYXNGaWVsZChlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8RmllbGQ+LCBjaGFubmVsOiBDaGFubmVsKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZyAmJiBlbmNvZGluZ1tjaGFubmVsXTtcbiAgaWYgKGNoYW5uZWxEZWYpIHtcbiAgICBpZiAoaXNBcnJheShjaGFubmVsRGVmKSkge1xuICAgICAgcmV0dXJuIHNvbWUoY2hhbm5lbERlZiwgKGZpZWxkRGVmKSA9PiAhIWZpZWxkRGVmLmZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzRmllbGREZWYoY2hhbm5lbERlZikgfHwgaGFzQ29uZGl0aW9uYWxGaWVsZERlZihjaGFubmVsRGVmKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0FnZ3JlZ2F0ZShlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8RmllbGQ+KSB7XG4gIHJldHVybiBzb21lKENIQU5ORUxTLCAoY2hhbm5lbCkgPT4ge1xuICAgIGlmIChjaGFubmVsSGFzRmllbGQoZW5jb2RpbmcsIGNoYW5uZWwpKSB7XG4gICAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG4gICAgICBpZiAoaXNBcnJheShjaGFubmVsRGVmKSkge1xuICAgICAgICByZXR1cm4gc29tZShjaGFubmVsRGVmLCAoZmllbGREZWYpID0+ICEhZmllbGREZWYuYWdncmVnYXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWYoY2hhbm5lbERlZik7XG4gICAgICAgIHJldHVybiBmaWVsZERlZiAmJiAhIWZpZWxkRGVmLmFnZ3JlZ2F0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVuY29kaW5nKGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+LCBtYXJrOiBNYXJrKTogRW5jb2Rpbmc8c3RyaW5nPiB7XG4gICByZXR1cm4ga2V5cyhlbmNvZGluZykucmVkdWNlKChub3JtYWxpemVkRW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4sIGNoYW5uZWw6IENoYW5uZWwgfCBzdHJpbmcpID0+IHtcbiAgICBpZiAoIWlzQ2hhbm5lbChjaGFubmVsKSkge1xuICAgICAgLy8gRHJvcCBpbnZhbGlkIGNoYW5uZWxcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRFbmNvZGluZ0NoYW5uZWwoY2hhbm5lbCkpO1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgICB9XG5cbiAgICBpZiAoIXN1cHBvcnRNYXJrKGNoYW5uZWwsIG1hcmspKSB7XG4gICAgICAvLyBEcm9wIHVuc3VwcG9ydGVkIGNoYW5uZWxcblxuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuaW5jb21wYXRpYmxlQ2hhbm5lbChjaGFubmVsLCBtYXJrKSk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgIH1cblxuICAgIC8vIERyb3AgbGluZSdzIHNpemUgaWYgdGhlIGZpZWxkIGlzIGFnZ3JlZ2F0ZWQuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdzaXplJyAmJiBtYXJrID09PSAnbGluZScpIHtcbiAgICAgIGNvbnN0IGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmdbY2hhbm5lbF0pO1xuICAgICAgaWYgKGZpZWxkRGVmICYmIGZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5MSU5FX1dJVEhfVkFSWUlOR19TSVpFKTtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcm9wIGNvbG9yIGlmIGVpdGhlciBmaWxsIG9yIHN0cm9rZSBpcyBzcGVjaWZpZWRcbiAgICAgaWYgKGNoYW5uZWwgPT09ICdjb2xvcicgJiYgKCdmaWxsJyBpbiBlbmNvZGluZyB8fCAnc3Ryb2tlJyBpbiBlbmNvZGluZykgKSB7XG4gICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcignZW5jb2RpbmcnLCB7ZmlsbDogJ2ZpbGwnIGluIGVuY29kaW5nLCBzdHJva2U6ICdzdHJva2UnIGluIGVuY29kaW5nfSkpO1xuICAgICAgIHJldHVybiBub3JtYWxpemVkRW5jb2Rpbmc7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgIGlmIChcbiAgICAgIGNoYW5uZWwgPT09ICdkZXRhaWwnIHx8XG4gICAgICAoY2hhbm5lbCA9PT0gJ29yZGVyJyAmJiAhaXNBcnJheShjaGFubmVsRGVmKSAmJiAhaXNWYWx1ZURlZihjaGFubmVsRGVmKSkgfHxcbiAgICAgIChjaGFubmVsID09PSAndG9vbHRpcCcgJiYgaXNBcnJheShjaGFubmVsRGVmKSlcbiAgICApIHtcbiAgICAgIGlmIChjaGFubmVsRGVmKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIGZpZWxkRGVmcyBmb3IgZGV0YWlsIGNoYW5uZWwgKG9yIHByb2R1Y3Rpb24gcnVsZSlcbiAgICAgICAgbm9ybWFsaXplZEVuY29kaW5nW2NoYW5uZWxdID0gKGlzQXJyYXkoY2hhbm5lbERlZikgPyBjaGFubmVsRGVmIDogW2NoYW5uZWxEZWZdKVxuICAgICAgICAgIC5yZWR1Y2UoKGRlZnM6IEZpZWxkRGVmPHN0cmluZz5bXSwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICAgICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW1wdHlGaWVsZERlZihmaWVsZERlZiwgY2hhbm5lbCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZGVmcy5wdXNoKG5vcm1hbGl6ZUZpZWxkRGVmKGZpZWxkRGVmLCBjaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVmcztcbiAgICAgICAgICB9LCBbXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcblxuICAgICAgY29uc3QgZmllbGREZWYgPSBnZXRGaWVsZERlZihlbmNvZGluZ1tjaGFubmVsXSk7XG4gICAgICBpZiAoZmllbGREZWYgJiYgY29udGFpbnMoW1R5cGUuTEFUSVRVREUsIFR5cGUuTE9OR0lUVURFXSwgZmllbGREZWYudHlwZSkpIHtcbiAgICAgICAgY29uc3Qge1tjaGFubmVsXTogXywgLi4ubmV3RW5jb2Rpbmd9ID0gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgICAgICBjb25zdCBuZXdDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3gnID8gJ2xvbmdpdHVkZScgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd5JyA/ICdsYXRpdHVkZScgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd4MicgPyAnbG9uZ2l0dWRlMicgOlxuICAgICAgICAgIGNoYW5uZWwgPT09ICd5MicgPyAnbGF0aXR1ZGUyJyA6IHVuZGVmaW5lZDtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UubGF0TG9uZ0RlcHJlY2F0ZWQoY2hhbm5lbCwgZmllbGREZWYudHlwZSwgbmV3Q2hhbm5lbCkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLm5ld0VuY29kaW5nLFxuICAgICAgICAgIFtuZXdDaGFubmVsXToge1xuICAgICAgICAgICAgLi4ubm9ybWFsaXplKGZpZWxkRGVmIGFzIGFueSwgY2hhbm5lbCksXG4gICAgICAgICAgICB0eXBlOiAncXVhbnRpdGF0aXZlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpICYmICFpc1ZhbHVlRGVmKGNoYW5uZWxEZWYpICYmICFpc0NvbmRpdGlvbmFsRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmVtcHR5RmllbGREZWYoY2hhbm5lbERlZiwgY2hhbm5lbCkpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEVuY29kaW5nO1xuICAgICAgfVxuICAgICAgbm9ybWFsaXplZEVuY29kaW5nW2NoYW5uZWxdID0gbm9ybWFsaXplKGNoYW5uZWxEZWYgYXMgQ2hhbm5lbERlZjxzdHJpbmc+LCBjaGFubmVsKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vcm1hbGl6ZWRFbmNvZGluZztcbiAgfSwge30pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JhbmdlZChlbmNvZGluZzogRW5jb2RpbmdXaXRoRmFjZXQ8YW55Pikge1xuICByZXR1cm4gZW5jb2RpbmcgJiYgKCghIWVuY29kaW5nLnggJiYgISFlbmNvZGluZy54MikgfHwgKCEhZW5jb2RpbmcueSAmJiAhIWVuY29kaW5nLnkyKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWVsZERlZnMoZW5jb2Rpbmc6IEVuY29kaW5nV2l0aEZhY2V0PEZpZWxkPik6IEZpZWxkRGVmPEZpZWxkPltdIHtcbiAgY29uc3QgYXJyOiBGaWVsZERlZjxGaWVsZD5bXSA9IFtdO1xuICBDSEFOTkVMUy5mb3JFYWNoKGZ1bmN0aW9uKGNoYW5uZWwpIHtcbiAgICBpZiAoY2hhbm5lbEhhc0ZpZWxkKGVuY29kaW5nLCBjaGFubmVsKSkge1xuICAgICAgY29uc3QgY2hhbm5lbERlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgICAgKGlzQXJyYXkoY2hhbm5lbERlZikgPyBjaGFubmVsRGVmIDogW2NoYW5uZWxEZWZdKS5mb3JFYWNoKChkZWYpID0+IHtcbiAgICAgICAgaWYgKGlzRmllbGREZWYoZGVmKSkge1xuICAgICAgICAgIGFyci5wdXNoKGRlZik7XG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQ29uZGl0aW9uYWxGaWVsZERlZihkZWYpKSB7XG4gICAgICAgICAgYXJyLnB1c2goZGVmLmNvbmRpdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JFYWNoKG1hcHBpbmc6IGFueSxcbiAgICBmOiAoZmQ6IEZpZWxkRGVmPHN0cmluZz4sIGM6IENoYW5uZWwpID0+IHZvaWQsXG4gICAgdGhpc0FyZz86IGFueSkge1xuICBpZiAoIW1hcHBpbmcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYW5uZWwgb2Yga2V5cyhtYXBwaW5nKSkge1xuICAgIGlmIChpc0FycmF5KG1hcHBpbmdbY2hhbm5lbF0pKSB7XG4gICAgICBtYXBwaW5nW2NoYW5uZWxdLmZvckVhY2goZnVuY3Rpb24oY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+KSB7XG4gICAgICAgIGYuY2FsbCh0aGlzQXJnLCBjaGFubmVsRGVmLCBjaGFubmVsKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmLmNhbGwodGhpc0FyZywgbWFwcGluZ1tjaGFubmVsXSwgY2hhbm5lbCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWR1Y2U8VCwgVSBleHRlbmRzIHtbayBpbiBDaGFubmVsXT86IGFueX0+KG1hcHBpbmc6IFUsXG4gICAgZjogKGFjYzogYW55LCBmZDogRmllbGREZWY8c3RyaW5nPiwgYzogQ2hhbm5lbCkgPT4gVSxcbiAgICBpbml0OiBULCB0aGlzQXJnPzogYW55KSB7XG4gIGlmICghbWFwcGluZykge1xuICAgIHJldHVybiBpbml0O1xuICB9XG5cbiAgcmV0dXJuIGtleXMobWFwcGluZykucmVkdWNlKChyLCBjaGFubmVsKSA9PiB7XG4gICAgY29uc3QgbWFwID0gbWFwcGluZ1tjaGFubmVsXTtcbiAgICBpZiAoaXNBcnJheShtYXApKSB7XG4gICAgICByZXR1cm4gbWFwLnJlZHVjZSgocjE6IFQsIGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8c3RyaW5nPikgPT4ge1xuICAgICAgICByZXR1cm4gZi5jYWxsKHRoaXNBcmcsIHIxLCBjaGFubmVsRGVmLCBjaGFubmVsKTtcbiAgICAgIH0sIHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZi5jYWxsKHRoaXNBcmcsIHIsIG1hcCwgY2hhbm5lbCk7XG4gICAgfVxuICB9LCBpbml0KTtcbn1cbiJdfQ==","export function getMarkSpecificConfigMixins(markSpecificConfig, channel) {\n var _a;\n var value = markSpecificConfig[channel];\n return value !== undefined ? (_a = {}, _a[channel] = { value: value }, _a) : {};\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvc2l0ZW1hcmsvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sc0NBQXNDLGtCQUE4QixFQUFFLE9BQTJCOztJQUNyRyxJQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMxQyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxXQUFFLEdBQUMsT0FBTyxJQUFHLEVBQUMsS0FBSyxPQUFBLEVBQUMsTUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05vblBvc2l0aW9uQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge01hcmtDb25maWd9IGZyb20gJy4uL21hcmsnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zKG1hcmtTcGVjaWZpY0NvbmZpZzogTWFya0NvbmZpZywgY2hhbm5lbDogTm9uUG9zaXRpb25DaGFubmVsKSB7XG4gIGNvbnN0IHZhbHVlID0gbWFya1NwZWNpZmljQ29uZmlnW2NoYW5uZWxdO1xuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHtbY2hhbm5lbF06IHt2YWx1ZX19IDoge307XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isNumber } from 'vega-util';\nimport { reduce } from '../encoding';\nimport { forEach } from './../encoding';\nimport { isContinuous, isFieldDef, vgField } from './../fielddef';\nimport * as log from './../log';\nimport { getMarkSpecificConfigMixins } from './common';\nexport var BOXPLOT = 'box-plot';\nexport function isBoxPlotDef(mark) {\n return !!mark['type'];\n}\nexport var BOXPLOT_STYLES = ['boxWhisker', 'box', 'boxMid'];\nexport var VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX = {\n box: ['size', 'color', 'extent'],\n boxWhisker: ['color'],\n boxMid: ['color']\n};\nvar supportedChannels = ['x', 'y', 'color', 'detail', 'opacity', 'size'];\nexport function filterUnsupportedChannels(spec) {\n return tslib_1.__assign({}, spec, { encoding: reduce(spec.encoding, function (newEncoding, fieldDef, channel) {\n if (supportedChannels.indexOf(channel) > -1) {\n newEncoding[channel] = fieldDef;\n }\n else {\n log.warn(log.message.incompatibleChannel(channel, BOXPLOT));\n }\n return newEncoding;\n }, {}) });\n}\nexport function normalizeBoxPlot(spec, config) {\n var _a, _b, _c, _d;\n spec = filterUnsupportedChannels(spec);\n // TODO: use selection\n var mark = spec.mark, encoding = spec.encoding, selection = spec.selection, _p = spec.projection, outerSpec = tslib_1.__rest(spec, [\"mark\", \"encoding\", \"selection\", \"projection\"]);\n var kIQRScalar = undefined;\n if (isNumber(config.box.extent)) {\n kIQRScalar = config.box.extent;\n }\n if (isBoxPlotDef(mark)) {\n if (mark.extent) {\n if (mark.extent === 'min-max') {\n kIQRScalar = undefined;\n }\n }\n }\n var orient = boxOrient(spec);\n var _e = boxParams(spec, orient, kIQRScalar), transform = _e.transform, continuousAxisChannelDef = _e.continuousAxisChannelDef, continuousAxis = _e.continuousAxis, encodingWithoutContinuousAxis = _e.encodingWithoutContinuousAxis;\n var color = encodingWithoutContinuousAxis.color, size = encodingWithoutContinuousAxis.size, encodingWithoutSizeColorAndContinuousAxis = tslib_1.__rest(encodingWithoutContinuousAxis, [\"color\", \"size\"]);\n // Size encoding or the default config.box.size is applied to box and boxMid\n var sizeMixins = size ? { size: size } : getMarkSpecificConfigMixins(config.box, 'size');\n var continuousAxisScaleAndAxis = {};\n if (continuousAxisChannelDef.scale) {\n continuousAxisScaleAndAxis['scale'] = continuousAxisChannelDef.scale;\n }\n if (continuousAxisChannelDef.axis) {\n continuousAxisScaleAndAxis['axis'] = continuousAxisChannelDef.axis;\n }\n return tslib_1.__assign({}, outerSpec, { transform: transform, layer: [\n {\n mark: {\n type: 'rule',\n style: 'boxWhisker'\n },\n encoding: tslib_1.__assign((_a = {}, _a[continuousAxis] = tslib_1.__assign({ field: 'lower_whisker_' + continuousAxisChannelDef.field, type: continuousAxisChannelDef.type }, continuousAxisScaleAndAxis), _a[continuousAxis + '2'] = {\n field: 'lower_box_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _a), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxWhisker, 'color'))\n }, {\n mark: {\n type: 'rule',\n style: 'boxWhisker'\n },\n encoding: tslib_1.__assign((_b = {}, _b[continuousAxis] = {\n field: 'upper_box_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _b[continuousAxis + '2'] = {\n field: 'upper_whisker_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _b), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxWhisker, 'color'))\n },\n tslib_1.__assign({}, (selection ? { selection: selection } : {}), { mark: {\n type: 'bar',\n style: 'box'\n }, encoding: tslib_1.__assign((_c = {}, _c[continuousAxis] = {\n field: 'lower_box_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _c[continuousAxis + '2'] = {\n field: 'upper_box_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _c), encodingWithoutContinuousAxis, (encodingWithoutContinuousAxis.color ? {} : getMarkSpecificConfigMixins(config.box, 'color')), sizeMixins) }),\n {\n mark: {\n type: 'tick',\n style: 'boxMid'\n },\n encoding: tslib_1.__assign((_d = {}, _d[continuousAxis] = {\n field: 'mid_box_' + continuousAxisChannelDef.field,\n type: continuousAxisChannelDef.type\n }, _d), encodingWithoutSizeColorAndContinuousAxis, getMarkSpecificConfigMixins(config.boxMid, 'color'), sizeMixins)\n }\n ] });\n}\nfunction boxOrient(spec) {\n var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = tslib_1.__rest(spec, [\"mark\", \"encoding\", \"projection\"]);\n if (isFieldDef(encoding.x) && isContinuous(encoding.x)) {\n // x is continuous\n if (isFieldDef(encoding.y) && isContinuous(encoding.y)) {\n // both x and y are continuous\n if (encoding.x.aggregate === undefined && encoding.y.aggregate === BOXPLOT) {\n return 'vertical';\n }\n else if (encoding.y.aggregate === undefined && encoding.x.aggregate === BOXPLOT) {\n return 'horizontal';\n }\n else if (encoding.x.aggregate === BOXPLOT && encoding.y.aggregate === BOXPLOT) {\n throw new Error('Both x and y cannot have aggregate');\n }\n else {\n if (isBoxPlotDef(mark) && mark.orient) {\n return mark.orient;\n }\n // default orientation = vertical\n return 'vertical';\n }\n }\n // x is continuous but y is not\n return 'horizontal';\n }\n else if (isFieldDef(encoding.y) && isContinuous(encoding.y)) {\n // y is continuous but x is not\n return 'vertical';\n }\n else {\n // Neither x nor y is continuous.\n throw new Error('Need a valid continuous axis for boxplots');\n }\n}\nfunction boxContinousAxis(spec, orient) {\n var mark = spec.mark, encoding = spec.encoding, _p = spec.projection, _outerSpec = tslib_1.__rest(spec, [\"mark\", \"encoding\", \"projection\"]);\n var continuousAxisChannelDef;\n var continuousAxis;\n if (orient === 'vertical') {\n continuousAxis = 'y';\n continuousAxisChannelDef = encoding.y; // Safe to cast because if y is not continuous fielddef, the orient would not be vertical.\n }\n else {\n continuousAxis = 'x';\n continuousAxisChannelDef = encoding.x; // Safe to cast because if x is not continuous fielddef, the orient would not be horizontal.\n }\n if (continuousAxisChannelDef && continuousAxisChannelDef.aggregate) {\n var aggregate = continuousAxisChannelDef.aggregate, continuousAxisWithoutAggregate = tslib_1.__rest(continuousAxisChannelDef, [\"aggregate\"]);\n if (aggregate !== BOXPLOT) {\n log.warn(\"Continuous axis should not have customized aggregation function \" + aggregate);\n }\n continuousAxisChannelDef = continuousAxisWithoutAggregate;\n }\n return {\n continuousAxisChannelDef: continuousAxisChannelDef,\n continuousAxis: continuousAxis\n };\n}\nfunction boxParams(spec, orient, kIQRScalar) {\n var _a = boxContinousAxis(spec, orient), continuousAxisChannelDef = _a.continuousAxisChannelDef, continuousAxis = _a.continuousAxis;\n var encoding = spec.encoding;\n var isMinMax = kIQRScalar === undefined;\n var aggregate = [\n {\n op: 'q1',\n field: continuousAxisChannelDef.field,\n as: 'lower_box_' + continuousAxisChannelDef.field\n },\n {\n op: 'q3',\n field: continuousAxisChannelDef.field,\n as: 'upper_box_' + continuousAxisChannelDef.field\n },\n {\n op: 'median',\n field: continuousAxisChannelDef.field,\n as: 'mid_box_' + continuousAxisChannelDef.field\n }\n ];\n var postAggregateCalculates = [];\n aggregate.push({\n op: 'min',\n field: continuousAxisChannelDef.field,\n as: (isMinMax ? 'lower_whisker_' : 'min_') + continuousAxisChannelDef.field\n });\n aggregate.push({\n op: 'max',\n field: continuousAxisChannelDef.field,\n as: (isMinMax ? 'upper_whisker_' : 'max_') + continuousAxisChannelDef.field\n });\n if (!isMinMax) {\n postAggregateCalculates = [\n {\n calculate: \"datum.upper_box_\" + continuousAxisChannelDef.field + \" - datum.lower_box_\" + continuousAxisChannelDef.field,\n as: 'iqr_' + continuousAxisChannelDef.field\n },\n {\n calculate: \"min(datum.upper_box_\" + continuousAxisChannelDef.field + \" + datum.iqr_\" + continuousAxisChannelDef.field + \" * \" + kIQRScalar + \", datum.max_\" + continuousAxisChannelDef.field + \")\",\n as: 'upper_whisker_' + continuousAxisChannelDef.field\n },\n {\n calculate: \"max(datum.lower_box_\" + continuousAxisChannelDef.field + \" - datum.iqr_\" + continuousAxisChannelDef.field + \" * \" + kIQRScalar + \", datum.min_\" + continuousAxisChannelDef.field + \")\",\n as: 'lower_whisker_' + continuousAxisChannelDef.field\n }\n ];\n }\n var groupby = [];\n var bins = [];\n var timeUnits = [];\n var encodingWithoutContinuousAxis = {};\n forEach(encoding, function (channelDef, channel) {\n if (channel === continuousAxis) {\n // Skip continuous axis as we already handle it separately\n return;\n }\n if (isFieldDef(channelDef)) {\n if (channelDef.aggregate && channelDef.aggregate !== BOXPLOT) {\n aggregate.push({\n op: channelDef.aggregate,\n field: channelDef.field,\n as: vgField(channelDef)\n });\n }\n else if (channelDef.aggregate === undefined) {\n var transformedField = vgField(channelDef);\n // Add bin or timeUnit transform if applicable\n var bin = channelDef.bin;\n if (bin) {\n var field = channelDef.field;\n bins.push({ bin: bin, field: field, as: transformedField });\n }\n else if (channelDef.timeUnit) {\n var timeUnit = channelDef.timeUnit, field = channelDef.field;\n timeUnits.push({ timeUnit: timeUnit, field: field, as: transformedField });\n }\n groupby.push(transformedField);\n }\n // now the field should refer to post-transformed field instead\n encodingWithoutContinuousAxis[channel] = {\n field: vgField(channelDef),\n type: channelDef.type\n };\n }\n else {\n // For value def, just copy\n encodingWithoutContinuousAxis[channel] = encoding[channel];\n }\n });\n return {\n transform: [].concat(bins, timeUnits, [{ aggregate: aggregate, groupby: groupby }], postAggregateCalculates),\n continuousAxisChannelDef: continuousAxisChannelDef,\n continuousAxis: continuousAxis,\n encodingWithoutContinuousAxis: encodingWithoutContinuousAxis\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm94cGxvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb3NpdGVtYXJrL2JveHBsb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVuQyxPQUFPLEVBQVcsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBa0IsWUFBWSxFQUFFLFVBQVUsRUFBb0IsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sS0FBSyxHQUFHLE1BQU0sVUFBVSxDQUFDO0FBSWhDLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUdyRCxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQWUsVUFBVSxDQUFDO0FBMEI5QyxNQUFNLHVCQUF1QixJQUEwQjtJQUNyRCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxJQUFNLGNBQWMsR0FBbUIsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBOEI5RSxNQUFNLENBQUMsSUFBTSxxQ0FBcUMsR0FFOUM7SUFDRixHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztJQUNoQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDckIsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDO0NBQ2xCLENBQUM7QUFFRixJQUFNLGlCQUFpQixHQUFjLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN0RixNQUFNLG9DQUFvQyxJQUE2RDtJQUNyRyw0QkFDSyxJQUFJLElBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQUMsV0FBVyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQzdELElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUMzQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxDQUFDO2FBQ2pDO2lCQUFNO2dCQUNMLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUM3RDtZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsRUFBRSxFQUFFLENBQUMsSUFDTjtBQUNKLENBQUM7QUFFRCxNQUFNLDJCQUEyQixJQUE2RCxFQUFFLE1BQWM7O0lBQzVHLElBQUksR0FBRyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxzQkFBc0I7SUFDZixJQUFBLGdCQUFJLEVBQUUsd0JBQVEsRUFBRSwwQkFBUyxFQUFFLG9CQUFjLEVBQUUsaUZBQVksQ0FBUztJQUV2RSxJQUFJLFVBQVUsR0FBVyxTQUFTLENBQUM7SUFDbkMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMvQixVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7S0FDaEM7SUFFRCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUN0QixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFHLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUM1QixVQUFVLEdBQUcsU0FBUyxDQUFDO2FBQ3hCO1NBQ0Y7S0FDRjtJQUVELElBQU0sTUFBTSxHQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxJQUFBLHdDQUEwSCxFQUF6SCx3QkFBUyxFQUFFLHNEQUF3QixFQUFFLGtDQUFjLEVBQUUsZ0VBQTZCLENBQXdDO0lBRTFILElBQUEsMkNBQUssRUFBRSx5Q0FBSSxFQUFFLDRHQUE0QyxDQUFrQztJQUVsRyw0RUFBNEU7SUFDNUUsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksTUFBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFbkYsSUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7SUFDdEMsSUFBSSx3QkFBd0IsQ0FBQyxLQUFLLEVBQUU7UUFDbEMsMEJBQTBCLENBQUMsT0FBTyxDQUFDLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDO0tBQ3RFO0lBQ0QsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUU7UUFDakMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsSUFBSSxDQUFDO0tBQ3BFO0lBRUQsNEJBQ0ssU0FBUyxJQUNaLFNBQVMsV0FBQSxFQUNULEtBQUssRUFBRTtZQUNMO2dCQUNFLElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsTUFBTTtvQkFDWixLQUFLLEVBQUUsWUFBWTtpQkFDcEI7Z0JBQ0QsUUFBUSxnQ0FDTCxjQUFjLHVCQUNiLEtBQUssRUFBRSxnQkFBZ0IsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLEVBQ3hELElBQUksRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLElBQ2hDLDBCQUEwQixNQUU5QixjQUFjLEdBQUcsR0FBRyxJQUFHO29CQUN0QixLQUFLLEVBQUUsWUFBWSxHQUFHLHdCQUF3QixDQUFDLEtBQUs7b0JBQ3BELElBQUksRUFBRSx3QkFBd0IsQ0FBQyxJQUFJO2lCQUNwQyxPQUNFLHlDQUF5QyxFQUN6QywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUMzRDthQUNGLEVBQUU7Z0JBQ0QsSUFBSSxFQUFFO29CQUNKLElBQUksRUFBRSxNQUFNO29CQUNaLEtBQUssRUFBRSxZQUFZO2lCQUNwQjtnQkFDRCxRQUFRLGdDQUNMLGNBQWMsSUFBRztvQkFDaEIsS0FBSyxFQUFFLFlBQVksR0FBRyx3QkFBd0IsQ0FBQyxLQUFLO29CQUNwRCxJQUFJLEVBQUUsd0JBQXdCLENBQUMsSUFBSTtpQkFDcEMsS0FDQSxjQUFjLEdBQUcsR0FBRyxJQUFHO29CQUN0QixLQUFLLEVBQUUsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsS0FBSztvQkFDeEQsSUFBSSxFQUFFLHdCQUF3QixDQUFDLElBQUk7aUJBQ3BDLE9BQ0UseUNBQXlDLEVBQ3pDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQzNEO2FBQ0Y7aUNBQ0ksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsU0FBUyxXQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQ2pDLElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsS0FBSztvQkFDWCxLQUFLLEVBQUUsS0FBSztpQkFDYixFQUNELFFBQVEsZ0NBQ0wsY0FBYyxJQUFHO29CQUNoQixLQUFLLEVBQUUsWUFBWSxHQUFHLHdCQUF3QixDQUFDLEtBQUs7b0JBQ3BELElBQUksRUFBRSx3QkFBd0IsQ0FBQyxJQUFJO2lCQUNwQyxLQUNBLGNBQWMsR0FBRyxHQUFHLElBQUc7b0JBQ3RCLEtBQUssRUFBRSxZQUFZLEdBQUcsd0JBQXdCLENBQUMsS0FBSztvQkFDcEQsSUFBSSxFQUFFLHdCQUF3QixDQUFDLElBQUk7aUJBQ3BDLE9BQ0UsNkJBQTZCLEVBQzdCLENBQUMsNkJBQTZCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFDN0YsVUFBVTtZQUVkO2dCQUNELElBQUksRUFBRTtvQkFDSixJQUFJLEVBQUUsTUFBTTtvQkFDWixLQUFLLEVBQUUsUUFBUTtpQkFDaEI7Z0JBQ0QsUUFBUSxnQ0FDTCxjQUFjLElBQUc7b0JBQ2hCLEtBQUssRUFBRSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsS0FBSztvQkFDbEQsSUFBSSxFQUFFLHdCQUF3QixDQUFDLElBQUk7aUJBQ3BDLE9BQ0UseUNBQXlDLEVBQ3pDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQ25ELFVBQVUsQ0FDZDthQUNGO1NBQ0YsSUFDRDtBQUNKLENBQUM7QUFFRCxtQkFBbUIsSUFBNEQ7SUFDdEUsSUFBQSxnQkFBVSxFQUFFLHdCQUFrQixFQUFFLG9CQUFjLEVBQUUscUVBQWEsQ0FBUztJQUU3RSxJQUFJLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN0RCxrQkFBa0I7UUFDbEIsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdEQsOEJBQThCO1lBQzlCLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU8sRUFBRTtnQkFDMUUsT0FBTyxVQUFVLENBQUM7YUFDbkI7aUJBQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFO2dCQUNqRixPQUFPLFlBQVksQ0FBQzthQUNyQjtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLE9BQU8sSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUU7Z0JBQy9FLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQzthQUN2RDtpQkFBTTtnQkFDTCxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNyQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7aUJBQ3BCO2dCQUVELGlDQUFpQztnQkFDakMsT0FBTyxVQUFVLENBQUM7YUFDbkI7U0FDRjtRQUVELCtCQUErQjtRQUMvQixPQUFPLFlBQVksQ0FBQztLQUNyQjtTQUFNLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzdELCtCQUErQjtRQUMvQixPQUFPLFVBQVUsQ0FBQztLQUNuQjtTQUFNO1FBQ0wsaUNBQWlDO1FBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUM7QUFHRCwwQkFBMEIsSUFBNkQsRUFBRSxNQUFjO0lBQzlGLElBQUEsZ0JBQVUsRUFBRSx3QkFBa0IsRUFBRSxvQkFBYyxFQUFFLHFFQUFhLENBQVM7SUFFN0UsSUFBSSx3QkFBa0QsQ0FBQztJQUN2RCxJQUFJLGNBQXlCLENBQUM7SUFFOUIsSUFBSSxNQUFNLEtBQUssVUFBVSxFQUFFO1FBQ3pCLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLENBQXFCLENBQUMsQ0FBQywwRkFBMEY7S0FDdEo7U0FBTTtRQUNMLGNBQWMsR0FBRyxHQUFHLENBQUM7UUFDckIsd0JBQXdCLEdBQUcsUUFBUSxDQUFDLENBQXFCLENBQUMsQ0FBQyw0RkFBNEY7S0FDeEo7SUFFRCxJQUFJLHdCQUF3QixJQUFJLHdCQUF3QixDQUFDLFNBQVMsRUFBRTtRQUMzRCxJQUFBLDhDQUFTLEVBQUUsd0ZBQWlDLENBQTZCO1FBQ2hGLElBQUksU0FBUyxLQUFLLE9BQU8sRUFBRTtZQUN6QixHQUFHLENBQUMsSUFBSSxDQUFDLHFFQUFtRSxTQUFXLENBQUMsQ0FBQztTQUMxRjtRQUNELHdCQUF3QixHQUFHLDhCQUE4QixDQUFDO0tBQzNEO0lBRUQsT0FBTztRQUNMLHdCQUF3QiwwQkFBQTtRQUN4QixjQUFjLGdCQUFBO0tBQ2YsQ0FBQztBQUNKLENBQUM7QUFFRCxtQkFBbUIsSUFBNkQsRUFBRSxNQUFjLEVBQUUsVUFBOEI7SUFFeEgsSUFBQSxtQ0FBMkUsRUFBMUUsc0RBQXdCLEVBQUUsa0NBQWMsQ0FBbUM7SUFDbEYsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUUvQixJQUFNLFFBQVEsR0FBRyxVQUFVLEtBQUssU0FBUyxDQUFDO0lBQzFDLElBQU0sU0FBUyxHQUF5QjtRQUN0QztZQUNFLEVBQUUsRUFBRSxJQUFJO1lBQ1IsS0FBSyxFQUFFLHdCQUF3QixDQUFDLEtBQUs7WUFDckMsRUFBRSxFQUFFLFlBQVksR0FBRyx3QkFBd0IsQ0FBQyxLQUFLO1NBQ2xEO1FBQ0Q7WUFDRSxFQUFFLEVBQUUsSUFBSTtZQUNSLEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxLQUFLO1lBQ3JDLEVBQUUsRUFBRSxZQUFZLEdBQUcsd0JBQXdCLENBQUMsS0FBSztTQUNsRDtRQUNEO1lBQ0UsRUFBRSxFQUFFLFFBQVE7WUFDWixLQUFLLEVBQUUsd0JBQXdCLENBQUMsS0FBSztZQUNyQyxFQUFFLEVBQUUsVUFBVSxHQUFHLHdCQUF3QixDQUFDLEtBQUs7U0FDaEQ7S0FDRixDQUFDO0lBQ0YsSUFBSSx1QkFBdUIsR0FBeUIsRUFBRSxDQUFDO0lBRXZELFNBQVMsQ0FBQyxJQUFJLENBQUM7UUFDYixFQUFFLEVBQUUsS0FBSztRQUNULEtBQUssRUFBRSx3QkFBd0IsQ0FBQyxLQUFLO1FBQ3JDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLHdCQUF3QixDQUFDLEtBQUs7S0FDNUUsQ0FBQyxDQUFDO0lBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNiLEVBQUUsRUFBRSxLQUFLO1FBQ1QsS0FBSyxFQUFFLHdCQUF3QixDQUFDLEtBQUs7UUFDckMsRUFBRSxFQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsS0FBSztLQUM3RSxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ2IsdUJBQXVCLEdBQUc7WUFDeEI7Z0JBQ0UsU0FBUyxFQUFFLHFCQUFtQix3QkFBd0IsQ0FBQyxLQUFLLDJCQUFzQix3QkFBd0IsQ0FBQyxLQUFPO2dCQUNsSCxFQUFFLEVBQUUsTUFBTSxHQUFHLHdCQUF3QixDQUFDLEtBQUs7YUFDNUM7WUFDRDtnQkFDRSxTQUFTLEVBQUUseUJBQXVCLHdCQUF3QixDQUFDLEtBQUsscUJBQWdCLHdCQUF3QixDQUFDLEtBQUssV0FBTSxVQUFVLG9CQUFlLHdCQUF3QixDQUFDLEtBQUssTUFBRztnQkFDOUssRUFBRSxFQUFFLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDLEtBQUs7YUFDdEQ7WUFDRDtnQkFDRSxTQUFTLEVBQUUseUJBQXVCLHdCQUF3QixDQUFDLEtBQUsscUJBQWdCLHdCQUF3QixDQUFDLEtBQUssV0FBTSxVQUFVLG9CQUFlLHdCQUF3QixDQUFDLEtBQUssTUFBRztnQkFDOUssRUFBRSxFQUFFLGdCQUFnQixHQUFHLHdCQUF3QixDQUFDLEtBQUs7YUFDdEQ7U0FDRixDQUFDO0tBQ0g7SUFFRCxJQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsSUFBTSxJQUFJLEdBQW1CLEVBQUUsQ0FBQztJQUNoQyxJQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO0lBRTFDLElBQU0sNkJBQTZCLEdBQXFCLEVBQUUsQ0FBQztJQUMzRCxPQUFPLENBQUMsUUFBUSxFQUFFLFVBQUMsVUFBVSxFQUFFLE9BQU87UUFDcEMsSUFBSSxPQUFPLEtBQUssY0FBYyxFQUFFO1lBQzlCLDBEQUEwRDtZQUMxRCxPQUFPO1NBQ1I7UUFDRCxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQixJQUFJLFVBQVUsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUU7Z0JBQzVELFNBQVMsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsRUFBRSxFQUFFLFVBQVUsQ0FBQyxTQUFTO29CQUN4QixLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7b0JBQ3ZCLEVBQUUsRUFBRSxPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUN4QixDQUFDLENBQUM7YUFDSjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFO2dCQUM3QyxJQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFN0MsOENBQThDO2dCQUM5QyxJQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUMzQixJQUFJLEdBQUcsRUFBRTtvQkFDQSxJQUFBLHdCQUFLLENBQWU7b0JBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBQyxHQUFHLEtBQUEsRUFBRSxLQUFLLE9BQUEsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO2lCQUMvQztxQkFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEVBQUU7b0JBQ3ZCLElBQUEsOEJBQVEsRUFBRSx3QkFBSyxDQUFlO29CQUNyQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsUUFBUSxVQUFBLEVBQUUsS0FBSyxPQUFBLEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQztpQkFDekQ7Z0JBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsK0RBQStEO1lBQy9ELDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxHQUFHO2dCQUN2QyxLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO2FBQ3RCLENBQUM7U0FDSDthQUFNO1lBQ0wsMkJBQTJCO1lBQzNCLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztRQUNMLFNBQVMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUNsQixJQUFJLEVBQ0osU0FBUyxFQUNULENBQUMsRUFBQyxTQUFTLFdBQUEsRUFBRSxPQUFPLFNBQUEsRUFBQyxDQUFDLEVBQ3RCLHVCQUF1QixDQUN4QjtRQUNELHdCQUF3QiwwQkFBQTtRQUN4QixjQUFjLGdCQUFBO1FBQ2QsNkJBQTZCLCtCQUFBO0tBQzlCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc051bWJlcn0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQge0FnZ3JlZ2F0ZWRGaWVsZERlZiwgQmluVHJhbnNmb3JtLCBDYWxjdWxhdGVUcmFuc2Zvcm0sIFRpbWVVbml0VHJhbnNmb3JtfSBmcm9tICcuLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtFbmNvZGluZywgZm9yRWFjaH0gZnJvbSAnLi8uLi9lbmNvZGluZyc7XG5pbXBvcnQge0ZpZWxkLCBGaWVsZERlZiwgaXNDb250aW51b3VzLCBpc0ZpZWxkRGVmLCBQb3NpdGlvbkZpZWxkRGVmLCB2Z0ZpZWxkfSBmcm9tICcuLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLy4uL2xvZyc7XG5pbXBvcnQge01hcmtDb25maWd9IGZyb20gJy4vLi4vbWFyayc7XG5pbXBvcnQge0dlbmVyaWNVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi8uLi9zcGVjJztcbmltcG9ydCB7T3JpZW50fSBmcm9tICcuLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7Z2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zfSBmcm9tICcuL2NvbW1vbic7XG5cblxuZXhwb3J0IGNvbnN0IEJPWFBMT1Q6ICdib3gtcGxvdCcgPSAnYm94LXBsb3QnO1xuZXhwb3J0IHR5cGUgQk9YUExPVCA9IHR5cGVvZiBCT1hQTE9UO1xuZXhwb3J0IHR5cGUgQm94UGxvdFN0eWxlID0gJ2JveFdoaXNrZXInIHwgJ2JveCcgfCAnYm94TWlkJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIEJveFBsb3REZWYge1xuICAvKipcbiAgICogVHlwZSBvZiB0aGUgbWFyay4gIEZvciBib3ggcGxvdHMsIHRoaXMgc2hvdWxkIGFsd2F5cyBiZSBgXCJib3gtcGxvdFwiYC5cbiAgICogW2JveHBsb3RdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29tcG9zaXRlbWFyay5odG1sI2JveHBsb3QpXG4gICAqL1xuICB0eXBlOiBCT1hQTE9UO1xuXG4gIC8qKlxuICAgKiBPcmllbnRhdGlvbiBvZiB0aGUgYm94IHBsb3QuICBUaGlzIGlzIG5vcm1hbGx5IGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCwgYnV0IGNhbiBiZSBzcGVjaWZpZWQgd2hlbiB0aGUgb3JpZW50YXRpb24gaXMgYW1iaWd1b3VzIGFuZCBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkLlxuICAgKi9cbiAgb3JpZW50PzogT3JpZW50O1xuXG4gIC8qKlxuICAgKiBFeHRlbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIHdoaXNrZXJzIGV4dGVuZCB0by4gVGhlIG9wdGlvbnMgYXJlXG4gICAqIC0gYFwibWluLW1heFwiOiBtaW4gYW5kIG1heCBhcmUgdGhlIGxvd2VyIGFuZCB1cHBlciB3aGlza2VycyByZXNwZWN0aXZlbHkuXG4gICAqIC0gIEEgc2NhbGFyIChpbnRlZ2VyIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcikgdGhhdCB3aWxsIGJlIG11bHRpcGxpZWQgYnkgdGhlIElRUiBhbmQgdGhlIHByb2R1Y3Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhpcmQgcXVhcnRpbGUgdG8gZ2V0IHRoZSB1cHBlciB3aGlza2VyIGFuZCBzdWJ0cmFjdGVkIGZyb20gdGhlIGZpcnN0IHF1YXJ0aWxlIHRvIGdldCB0aGUgbG93ZXIgd2hpc2tlci5cbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcIjEuNVwiYC5cbiAgICovXG4gIGV4dGVudD86ICdtaW4tbWF4JyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQm94UGxvdERlZihtYXJrOiBCT1hQTE9UIHwgQm94UGxvdERlZik6IG1hcmsgaXMgQm94UGxvdERlZiB7XG4gIHJldHVybiAhIW1hcmtbJ3R5cGUnXTtcbn1cblxuZXhwb3J0IGNvbnN0IEJPWFBMT1RfU1RZTEVTOiBCb3hQbG90U3R5bGVbXSA9IFsnYm94V2hpc2tlcicsICdib3gnLCAnYm94TWlkJ107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94UGxvdENvbmZpZyBleHRlbmRzIE1hcmtDb25maWcge1xuICAvKiogU2l6ZSBvZiB0aGUgYm94IGFuZCBtaWQgdGljayBvZiBhIGJveCBwbG90ICovXG4gIHNpemU/OiBudW1iZXI7XG4gIC8qKiBUaGUgZGVmYXVsdCBleHRlbnQsIHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSB3aGlza2VycyBleHRlbmQgdG8uIFRoZSBvcHRpb25zIGFyZVxuICAgKiAtIGBcIm1pbi1tYXhcIjogbWluIGFuZCBtYXggYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIgd2hpc2tlcnMgcmVzcGVjdGl2ZWx5LlxuICAgKiAtIGBcIm51bWJlclwiOiBBIHNjYWxhciAoaW50ZWdlciBvciBmbG9hdGluZyBwb2ludCBudW1iZXIpIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIGJ5IHRoZSBJUVIgYW5kIHRoZSBwcm9kdWN0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRoaXJkIHF1YXJ0aWxlIHRvIGdldCB0aGUgdXBwZXIgd2hpc2tlciBhbmQgc3VidHJhY3RlZCBmcm9tIHRoZSBmaXJzdCBxdWFydGlsZSB0byBnZXQgdGhlIGxvd2VyIHdoaXNrZXIuXG4gICAqL1xuICBleHRlbnQ/OiAnbWluLW1heCcgfCBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94UGxvdENvbmZpZ01peGlucyB7XG4gIC8qKlxuICAgKiBCb3ggQ29uZmlnXG4gICAqIEBoaWRlXG4gICAqL1xuICBib3g/OiBCb3hQbG90Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBAaGlkZVxuICAgKi9cbiAgYm94V2hpc2tlcj86IE1hcmtDb25maWc7XG5cbiAgLyoqXG4gICAqIEBoaWRlXG4gICAqL1xuICBib3hNaWQ/OiBNYXJrQ29uZmlnO1xufVxuXG5leHBvcnQgY29uc3QgVkxfT05MWV9CT1hQTE9UX0NPTkZJR19QUk9QRVJUWV9JTkRFWDoge1xuICBbayBpbiBrZXlvZiBCb3hQbG90Q29uZmlnTWl4aW5zXT86IChrZXlvZiBCb3hQbG90Q29uZmlnTWl4aW5zW2tdKVtdXG59ID0ge1xuICBib3g6IFsnc2l6ZScsICdjb2xvcicsICdleHRlbnQnXSxcbiAgYm94V2hpc2tlcjogWydjb2xvciddLFxuICBib3hNaWQ6IFsnY29sb3InXVxufTtcblxuY29uc3Qgc3VwcG9ydGVkQ2hhbm5lbHM6IENoYW5uZWxbXSA9IFsneCcsICd5JywgJ2NvbG9yJywgJ2RldGFpbCcsICdvcGFjaXR5JywgJ3NpemUnXTtcbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJVbnN1cHBvcnRlZENoYW5uZWxzKHNwZWM6IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZzxzdHJpbmc+LCBCT1hQTE9UIHwgQm94UGxvdERlZj4pOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nPiwgQk9YUExPVCB8IEJveFBsb3REZWY+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zcGVjLFxuICAgIGVuY29kaW5nOiByZWR1Y2Uoc3BlYy5lbmNvZGluZywgKG5ld0VuY29kaW5nLCBmaWVsZERlZiwgY2hhbm5lbCkgPT4ge1xuICAgICAgaWYgKHN1cHBvcnRlZENoYW5uZWxzLmluZGV4T2YoY2hhbm5lbCkgPiAtMSkge1xuICAgICAgICBuZXdFbmNvZGluZ1tjaGFubmVsXSA9IGZpZWxkRGVmO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuaW5jb21wYXRpYmxlQ2hhbm5lbChjaGFubmVsLCBCT1hQTE9UKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3RW5jb2Rpbmc7XG4gICAgfSwge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQm94UGxvdChzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nPiwgQk9YUExPVCB8IEJveFBsb3REZWY+LCBjb25maWc6IENvbmZpZyk6IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuICBzcGVjID0gZmlsdGVyVW5zdXBwb3J0ZWRDaGFubmVscyhzcGVjKTtcbiAgLy8gVE9ETzogdXNlIHNlbGVjdGlvblxuICBjb25zdCB7bWFyaywgZW5jb2RpbmcsIHNlbGVjdGlvbiwgcHJvamVjdGlvbjogX3AsIC4uLm91dGVyU3BlY30gPSBzcGVjO1xuXG4gIGxldCBrSVFSU2NhbGFyOiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIGlmIChpc051bWJlcihjb25maWcuYm94LmV4dGVudCkpIHtcbiAgICBrSVFSU2NhbGFyID0gY29uZmlnLmJveC5leHRlbnQ7XG4gIH1cblxuICBpZiAoaXNCb3hQbG90RGVmKG1hcmspKSB7XG4gICAgaWYgKG1hcmsuZXh0ZW50KSB7XG4gICAgICBpZihtYXJrLmV4dGVudCA9PT0gJ21pbi1tYXgnKSB7XG4gICAgICAgIGtJUVJTY2FsYXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgb3JpZW50OiBPcmllbnQgPSBib3hPcmllbnQoc3BlYyk7XG4gIGNvbnN0IHt0cmFuc2Zvcm0sIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZiwgY29udGludW91c0F4aXMsIGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzfSA9IGJveFBhcmFtcyhzcGVjLCBvcmllbnQsIGtJUVJTY2FsYXIpO1xuXG4gIGNvbnN0IHtjb2xvciwgc2l6ZSwgLi4uZW5jb2RpbmdXaXRob3V0U2l6ZUNvbG9yQW5kQ29udGludW91c0F4aXN9ID0gZW5jb2RpbmdXaXRob3V0Q29udGludW91c0F4aXM7XG5cbiAgLy8gU2l6ZSBlbmNvZGluZyBvciB0aGUgZGVmYXVsdCBjb25maWcuYm94LnNpemUgaXMgYXBwbGllZCB0byBib3ggYW5kIGJveE1pZFxuICBjb25zdCBzaXplTWl4aW5zID0gc2l6ZSA/IHtzaXplfSA6IGdldE1hcmtTcGVjaWZpY0NvbmZpZ01peGlucyhjb25maWcuYm94LCAnc2l6ZScpO1xuXG4gIGNvbnN0IGNvbnRpbnVvdXNBeGlzU2NhbGVBbmRBeGlzID0ge307XG4gIGlmIChjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuc2NhbGUpIHtcbiAgICBjb250aW51b3VzQXhpc1NjYWxlQW5kQXhpc1snc2NhbGUnXSA9IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5zY2FsZTtcbiAgfVxuICBpZiAoY29udGludW91c0F4aXNDaGFubmVsRGVmLmF4aXMpIHtcbiAgICBjb250aW51b3VzQXhpc1NjYWxlQW5kQXhpc1snYXhpcyddID0gY29udGludW91c0F4aXNDaGFubmVsRGVmLmF4aXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm91dGVyU3BlYyxcbiAgICB0cmFuc2Zvcm0sXG4gICAgbGF5ZXI6IFtcbiAgICAgIHsgLy8gbG93ZXIgd2hpc2tlclxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogJ3J1bGUnLFxuICAgICAgICAgIHN0eWxlOiAnYm94V2hpc2tlcidcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2Rpbmc6IHtcbiAgICAgICAgICBbY29udGludW91c0F4aXNdOiB7XG4gICAgICAgICAgICBmaWVsZDogJ2xvd2VyX3doaXNrZXJfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICAgIHR5cGU6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi50eXBlLFxuICAgICAgICAgICAgLi4uY29udGludW91c0F4aXNTY2FsZUFuZEF4aXNcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtjb250aW51b3VzQXhpcyArICcyJ106IHtcbiAgICAgICAgICAgIGZpZWxkOiAnbG93ZXJfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uZW5jb2RpbmdXaXRob3V0U2l6ZUNvbG9yQW5kQ29udGludW91c0F4aXMsXG4gICAgICAgICAgLi4uZ2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zKGNvbmZpZy5ib3hXaGlza2VyLCAnY29sb3InKVxuICAgICAgICB9XG4gICAgICB9LCB7IC8vIHVwcGVyIHdoaXNrZXJcbiAgICAgICAgbWFyazoge1xuICAgICAgICAgIHR5cGU6ICdydWxlJyxcbiAgICAgICAgICBzdHlsZTogJ2JveFdoaXNrZXInXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzXToge1xuICAgICAgICAgICAgZmllbGQ6ICd1cHBlcl9ib3hfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICAgIHR5cGU6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi50eXBlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbY29udGludW91c0F4aXMgKyAnMiddOiB7XG4gICAgICAgICAgICBmaWVsZDogJ3VwcGVyX3doaXNrZXJfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICAgIHR5cGU6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi50eXBlXG4gICAgICAgICAgfSxcbiAgICAgICAgICAuLi5lbmNvZGluZ1dpdGhvdXRTaXplQ29sb3JBbmRDb250aW51b3VzQXhpcyxcbiAgICAgICAgICAuLi5nZXRNYXJrU3BlY2lmaWNDb25maWdNaXhpbnMoY29uZmlnLmJveFdoaXNrZXIsICdjb2xvcicpXG4gICAgICAgIH1cbiAgICAgIH0sIHsgLy8gYm94IChxMSB0byBxMylcbiAgICAgICAgLi4uKHNlbGVjdGlvbiA/IHtzZWxlY3Rpb259IDoge30pLFxuICAgICAgICBtYXJrOiB7XG4gICAgICAgICAgdHlwZTogJ2JhcicsXG4gICAgICAgICAgc3R5bGU6ICdib3gnXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzXToge1xuICAgICAgICAgICAgZmllbGQ6ICdsb3dlcl9ib3hfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICAgIHR5cGU6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi50eXBlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbY29udGludW91c0F4aXMgKyAnMiddOiB7XG4gICAgICAgICAgICBmaWVsZDogJ3VwcGVyX2JveF8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkLFxuICAgICAgICAgICAgdHlwZTogY29udGludW91c0F4aXNDaGFubmVsRGVmLnR5cGVcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzLFxuICAgICAgICAgIC4uLihlbmNvZGluZ1dpdGhvdXRDb250aW51b3VzQXhpcy5jb2xvciA/IHt9IDogZ2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zKGNvbmZpZy5ib3gsICdjb2xvcicpKSxcbiAgICAgICAgICAuLi5zaXplTWl4aW5zLFxuICAgICAgICB9XG4gICAgICB9LCB7IC8vIG1pZCB0aWNrXG4gICAgICAgIG1hcms6IHtcbiAgICAgICAgICB0eXBlOiAndGljaycsXG4gICAgICAgICAgc3R5bGU6ICdib3hNaWQnXG4gICAgICAgIH0sXG4gICAgICAgIGVuY29kaW5nOiB7XG4gICAgICAgICAgW2NvbnRpbnVvdXNBeGlzXToge1xuICAgICAgICAgICAgZmllbGQ6ICdtaWRfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICAgICAgICB0eXBlOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYudHlwZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uZW5jb2RpbmdXaXRob3V0U2l6ZUNvbG9yQW5kQ29udGludW91c0F4aXMsXG4gICAgICAgICAgLi4uZ2V0TWFya1NwZWNpZmljQ29uZmlnTWl4aW5zKGNvbmZpZy5ib3hNaWQsICdjb2xvcicpLFxuICAgICAgICAgIC4uLnNpemVNaXhpbnMsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJveE9yaWVudChzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8RmllbGQ+LCBCT1hQTE9UIHwgQm94UGxvdERlZj4pOiBPcmllbnQge1xuICBjb25zdCB7bWFyazogbWFyaywgZW5jb2Rpbmc6IGVuY29kaW5nLCBwcm9qZWN0aW9uOiBfcCwgLi4uX291dGVyU3BlY30gPSBzcGVjO1xuXG4gIGlmIChpc0ZpZWxkRGVmKGVuY29kaW5nLngpICYmIGlzQ29udGludW91cyhlbmNvZGluZy54KSkge1xuICAgIC8vIHggaXMgY29udGludW91c1xuICAgIGlmIChpc0ZpZWxkRGVmKGVuY29kaW5nLnkpICYmIGlzQ29udGludW91cyhlbmNvZGluZy55KSkge1xuICAgICAgLy8gYm90aCB4IGFuZCB5IGFyZSBjb250aW51b3VzXG4gICAgICBpZiAoZW5jb2RpbmcueC5hZ2dyZWdhdGUgPT09IHVuZGVmaW5lZCAmJiBlbmNvZGluZy55LmFnZ3JlZ2F0ZSA9PT0gQk9YUExPVCkge1xuICAgICAgICByZXR1cm4gJ3ZlcnRpY2FsJztcbiAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcueS5hZ2dyZWdhdGUgPT09IHVuZGVmaW5lZCAmJiBlbmNvZGluZy54LmFnZ3JlZ2F0ZSA9PT0gQk9YUExPVCkge1xuICAgICAgICByZXR1cm4gJ2hvcml6b250YWwnO1xuICAgICAgfSBlbHNlIGlmIChlbmNvZGluZy54LmFnZ3JlZ2F0ZSA9PT0gQk9YUExPVCAmJiBlbmNvZGluZy55LmFnZ3JlZ2F0ZSA9PT0gQk9YUExPVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JvdGggeCBhbmQgeSBjYW5ub3QgaGF2ZSBhZ2dyZWdhdGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0JveFBsb3REZWYobWFyaykgJiYgbWFyay5vcmllbnQpIHtcbiAgICAgICAgICByZXR1cm4gbWFyay5vcmllbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZWZhdWx0IG9yaWVudGF0aW9uID0gdmVydGljYWxcbiAgICAgICAgcmV0dXJuICd2ZXJ0aWNhbCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8geCBpcyBjb250aW51b3VzIGJ1dCB5IGlzIG5vdFxuICAgIHJldHVybiAnaG9yaXpvbnRhbCc7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZihlbmNvZGluZy55KSAmJiBpc0NvbnRpbnVvdXMoZW5jb2RpbmcueSkpIHtcbiAgICAvLyB5IGlzIGNvbnRpbnVvdXMgYnV0IHggaXMgbm90XG4gICAgcmV0dXJuICd2ZXJ0aWNhbCc7XG4gIH0gZWxzZSB7XG4gICAgLy8gTmVpdGhlciB4IG5vciB5IGlzIGNvbnRpbnVvdXMuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdOZWVkIGEgdmFsaWQgY29udGludW91cyBheGlzIGZvciBib3hwbG90cycpO1xuICB9XG59XG5cblxuZnVuY3Rpb24gYm94Q29udGlub3VzQXhpcyhzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nPiwgQk9YUExPVCB8IEJveFBsb3REZWY+LCBvcmllbnQ6IE9yaWVudCkge1xuICBjb25zdCB7bWFyazogbWFyaywgZW5jb2Rpbmc6IGVuY29kaW5nLCBwcm9qZWN0aW9uOiBfcCwgLi4uX291dGVyU3BlY30gPSBzcGVjO1xuXG4gIGxldCBjb250aW51b3VzQXhpc0NoYW5uZWxEZWY6IFBvc2l0aW9uRmllbGREZWY8c3RyaW5nPjtcbiAgbGV0IGNvbnRpbnVvdXNBeGlzOiAneCcgfCAneSc7XG5cbiAgaWYgKG9yaWVudCA9PT0gJ3ZlcnRpY2FsJykge1xuICAgIGNvbnRpbnVvdXNBeGlzID0gJ3knO1xuICAgIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZiA9IGVuY29kaW5nLnkgYXMgRmllbGREZWY8c3RyaW5nPjsgLy8gU2FmZSB0byBjYXN0IGJlY2F1c2UgaWYgeSBpcyBub3QgY29udGludW91cyBmaWVsZGRlZiwgdGhlIG9yaWVudCB3b3VsZCBub3QgYmUgdmVydGljYWwuXG4gIH0gZWxzZSB7XG4gICAgY29udGludW91c0F4aXMgPSAneCc7XG4gICAgY29udGludW91c0F4aXNDaGFubmVsRGVmID0gZW5jb2RpbmcueCBhcyBGaWVsZERlZjxzdHJpbmc+OyAvLyBTYWZlIHRvIGNhc3QgYmVjYXVzZSBpZiB4IGlzIG5vdCBjb250aW51b3VzIGZpZWxkZGVmLCB0aGUgb3JpZW50IHdvdWxkIG5vdCBiZSBob3Jpem9udGFsLlxuICB9XG5cbiAgaWYgKGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZiAmJiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuYWdncmVnYXRlKSB7XG4gICAgY29uc3Qge2FnZ3JlZ2F0ZSwgLi4uY29udGludW91c0F4aXNXaXRob3V0QWdncmVnYXRlfSA9IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZjtcbiAgICBpZiAoYWdncmVnYXRlICE9PSBCT1hQTE9UKSB7XG4gICAgICBsb2cud2FybihgQ29udGludW91cyBheGlzIHNob3VsZCBub3QgaGF2ZSBjdXN0b21pemVkIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9uICR7YWdncmVnYXRlfWApO1xuICAgIH1cbiAgICBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYgPSBjb250aW51b3VzQXhpc1dpdGhvdXRBZ2dyZWdhdGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZixcbiAgICBjb250aW51b3VzQXhpc1xuICB9O1xufVxuXG5mdW5jdGlvbiBib3hQYXJhbXMoc3BlYzogR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZz4sIEJPWFBMT1QgfCBCb3hQbG90RGVmPiwgb3JpZW50OiBPcmllbnQsIGtJUVJTY2FsYXI6ICdtaW4tbWF4JyB8IG51bWJlcikge1xuXG4gIGNvbnN0IHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYsIGNvbnRpbnVvdXNBeGlzfSA9IGJveENvbnRpbm91c0F4aXMoc3BlYywgb3JpZW50KTtcbiAgY29uc3QgZW5jb2RpbmcgPSBzcGVjLmVuY29kaW5nO1xuXG4gIGNvbnN0IGlzTWluTWF4ID0ga0lRUlNjYWxhciA9PT0gdW5kZWZpbmVkO1xuICBjb25zdCBhZ2dyZWdhdGU6IEFnZ3JlZ2F0ZWRGaWVsZERlZltdID0gW1xuICAgIHtcbiAgICAgIG9wOiAncTEnLFxuICAgICAgZmllbGQ6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgIGFzOiAnbG93ZXJfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGRcbiAgICB9LFxuICAgIHtcbiAgICAgIG9wOiAncTMnLFxuICAgICAgZmllbGQ6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICAgIGFzOiAndXBwZXJfYm94XycgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGRcbiAgICB9LFxuICAgIHtcbiAgICAgIG9wOiAnbWVkaWFuJyxcbiAgICAgIGZpZWxkOiBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGQsXG4gICAgICBhczogJ21pZF9ib3hfJyArIGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZFxuICAgIH1cbiAgXTtcbiAgbGV0IHBvc3RBZ2dyZWdhdGVDYWxjdWxhdGVzOiBDYWxjdWxhdGVUcmFuc2Zvcm1bXSA9IFtdO1xuXG4gIGFnZ3JlZ2F0ZS5wdXNoKHtcbiAgICBvcDogJ21pbicsXG4gICAgZmllbGQ6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICBhczogKGlzTWluTWF4ID8gJ2xvd2VyX3doaXNrZXJfJyA6ICdtaW5fJykgKyBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGRcbiAgfSk7XG4gIGFnZ3JlZ2F0ZS5wdXNoKHtcbiAgICBvcDogJ21heCcsXG4gICAgZmllbGQ6IGNvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZCxcbiAgICBhczogIChpc01pbk1heCA/ICd1cHBlcl93aGlza2VyXycgOiAnbWF4XycpICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gIH0pO1xuXG4gIGlmICghaXNNaW5NYXgpIHtcbiAgICBwb3N0QWdncmVnYXRlQ2FsY3VsYXRlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgY2FsY3VsYXRlOiBgZGF0dW0udXBwZXJfYm94XyR7Y29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkfSAtIGRhdHVtLmxvd2VyX2JveF8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH1gLFxuICAgICAgICBhczogJ2lxcl8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYWxjdWxhdGU6IGBtaW4oZGF0dW0udXBwZXJfYm94XyR7Y29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkfSArIGRhdHVtLmlxcl8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH0gKiAke2tJUVJTY2FsYXJ9LCBkYXR1bS5tYXhfJHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGR9KWAsXG4gICAgICAgIGFzOiAndXBwZXJfd2hpc2tlcl8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBjYWxjdWxhdGU6IGBtYXgoZGF0dW0ubG93ZXJfYm94XyR7Y29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkfSAtIGRhdHVtLmlxcl8ke2NvbnRpbnVvdXNBeGlzQ2hhbm5lbERlZi5maWVsZH0gKiAke2tJUVJTY2FsYXJ9LCBkYXR1bS5taW5fJHtjb250aW51b3VzQXhpc0NoYW5uZWxEZWYuZmllbGR9KWAsXG4gICAgICAgIGFzOiAnbG93ZXJfd2hpc2tlcl8nICsgY29udGludW91c0F4aXNDaGFubmVsRGVmLmZpZWxkXG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IGdyb3VwYnk6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGJpbnM6IEJpblRyYW5zZm9ybVtdID0gW107XG4gIGNvbnN0IHRpbWVVbml0czogVGltZVVuaXRUcmFuc2Zvcm1bXSA9IFtdO1xuXG4gIGNvbnN0IGVuY29kaW5nV2l0aG91dENvbnRpbnVvdXNBeGlzOiBFbmNvZGluZzxzdHJpbmc+ID0ge307XG4gIGZvckVhY2goZW5jb2RpbmcsIChjaGFubmVsRGVmLCBjaGFubmVsKSA9PiB7XG4gICAgaWYgKGNoYW5uZWwgPT09IGNvbnRpbnVvdXNBeGlzKSB7XG4gICAgICAvLyBTa2lwIGNvbnRpbnVvdXMgYXhpcyBhcyB3ZSBhbHJlYWR5IGhhbmRsZSBpdCBzZXBhcmF0ZWx5XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICBpZiAoY2hhbm5lbERlZi5hZ2dyZWdhdGUgJiYgY2hhbm5lbERlZi5hZ2dyZWdhdGUgIT09IEJPWFBMT1QpIHtcbiAgICAgICAgYWdncmVnYXRlLnB1c2goe1xuICAgICAgICAgIG9wOiBjaGFubmVsRGVmLmFnZ3JlZ2F0ZSxcbiAgICAgICAgICBmaWVsZDogY2hhbm5lbERlZi5maWVsZCxcbiAgICAgICAgICBhczogdmdGaWVsZChjaGFubmVsRGVmKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbERlZi5hZ2dyZWdhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEZpZWxkID0gdmdGaWVsZChjaGFubmVsRGVmKTtcblxuICAgICAgICAvLyBBZGQgYmluIG9yIHRpbWVVbml0IHRyYW5zZm9ybSBpZiBhcHBsaWNhYmxlXG4gICAgICAgIGNvbnN0IGJpbiA9IGNoYW5uZWxEZWYuYmluO1xuICAgICAgICBpZiAoYmluKSB7XG4gICAgICAgICAgY29uc3Qge2ZpZWxkfSA9IGNoYW5uZWxEZWY7XG4gICAgICAgICAgYmlucy5wdXNoKHtiaW4sIGZpZWxkLCBhczogdHJhbnNmb3JtZWRGaWVsZH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5uZWxEZWYudGltZVVuaXQpIHtcbiAgICAgICAgICBjb25zdCB7dGltZVVuaXQsIGZpZWxkfSA9IGNoYW5uZWxEZWY7XG4gICAgICAgICAgdGltZVVuaXRzLnB1c2goe3RpbWVVbml0LCBmaWVsZCwgYXM6IHRyYW5zZm9ybWVkRmllbGR9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdyb3VwYnkucHVzaCh0cmFuc2Zvcm1lZEZpZWxkKTtcbiAgICAgIH1cbiAgICAgIC8vIG5vdyB0aGUgZmllbGQgc2hvdWxkIHJlZmVyIHRvIHBvc3QtdHJhbnNmb3JtZWQgZmllbGQgaW5zdGVhZFxuICAgICAgZW5jb2RpbmdXaXRob3V0Q29udGludW91c0F4aXNbY2hhbm5lbF0gPSB7XG4gICAgICAgIGZpZWxkOiB2Z0ZpZWxkKGNoYW5uZWxEZWYpLFxuICAgICAgICB0eXBlOiBjaGFubmVsRGVmLnR5cGVcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZvciB2YWx1ZSBkZWYsIGp1c3QgY29weVxuICAgICAgZW5jb2RpbmdXaXRob3V0Q29udGludW91c0F4aXNbY2hhbm5lbF0gPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNmb3JtOiBbXS5jb25jYXQoXG4gICAgICBiaW5zLFxuICAgICAgdGltZVVuaXRzLFxuICAgICAgW3thZ2dyZWdhdGUsIGdyb3VwYnl9XSxcbiAgICAgIHBvc3RBZ2dyZWdhdGVDYWxjdWxhdGVzXG4gICAgKSxcbiAgICBjb250aW51b3VzQXhpc0NoYW5uZWxEZWYsXG4gICAgY29udGludW91c0F4aXMsXG4gICAgZW5jb2RpbmdXaXRob3V0Q29udGludW91c0F4aXNcbiAgfTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nexport var ERRORBAR = 'error-bar';\nexport function normalizeErrorBar(spec) {\n // TODO: use selection\n var _m = spec.mark, _sel = spec.selection, _p = spec.projection, encoding = spec.encoding, outerSpec = tslib_1.__rest(spec, [\"mark\", \"selection\", \"projection\", \"encoding\"]);\n var _s = encoding.size, encodingWithoutSize = tslib_1.__rest(encoding, [\"size\"]);\n var _x2 = encoding.x2, _y2 = encoding.y2, encodingWithoutX2Y2 = tslib_1.__rest(encoding, [\"x2\", \"y2\"]);\n var _x = encodingWithoutX2Y2.x, _y = encodingWithoutX2Y2.y, encodingWithoutX_X2_Y_Y2 = tslib_1.__rest(encodingWithoutX2Y2, [\"x\", \"y\"]);\n if (!encoding.x2 && !encoding.y2) {\n throw new Error('Neither x2 or y2 provided');\n }\n return tslib_1.__assign({}, outerSpec, { layer: [\n {\n mark: 'rule',\n encoding: encodingWithoutSize\n }, {\n mark: 'tick',\n encoding: encodingWithoutX2Y2\n }, {\n mark: 'tick',\n encoding: encoding.x2 ? tslib_1.__assign({ x: encoding.x2, y: encoding.y }, encodingWithoutX_X2_Y_Y2) : tslib_1.__assign({ x: encoding.x, y: encoding.y2 }, encodingWithoutX_X2_Y_Y2)\n }\n ] });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JiYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9zaXRlbWFyay9lcnJvcmJhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBS0EsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFnQixXQUFXLENBQUM7QUFHakQsTUFBTSw0QkFBNEIsSUFBZ0Q7SUFDaEYsc0JBQXNCO0lBQ2YsSUFBQSxjQUFRLEVBQUUscUJBQWUsRUFBRSxvQkFBYyxFQUFFLHdCQUFRLEVBQUUsaUZBQVksQ0FBUztJQUMxRSxJQUFBLGtCQUFRLEVBQUUsd0RBQXNCLENBQWE7SUFDN0MsSUFBQSxpQkFBTyxFQUFFLGlCQUFPLEVBQUUsNERBQXNCLENBQWE7SUFDckQsSUFBQSwwQkFBSyxFQUFFLDBCQUFLLEVBQUUsMEVBQTJCLENBQXdCO0lBRXhFLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7S0FDOUM7SUFFRCw0QkFDSyxTQUFTLElBQ1osS0FBSyxFQUFFO1lBQ0w7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLG1CQUFtQjthQUM5QixFQUFDO2dCQUNBLElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxtQkFBbUI7YUFDOUIsRUFBRTtnQkFDRCxJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLG9CQUNyQixDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFDZCxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFDVix3QkFBd0IsRUFDM0IsQ0FBQyxvQkFDRCxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFDYixDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsSUFDWCx3QkFBd0IsQ0FDNUI7YUFDRjtTQUNGLElBQ0Q7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtGaWVsZH0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi8uLi9lbmNvZGluZyc7XG5pbXBvcnQge0dlbmVyaWNVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi8uLi9zcGVjJztcblxuXG5leHBvcnQgY29uc3QgRVJST1JCQVI6ICdlcnJvci1iYXInID0gJ2Vycm9yLWJhcic7XG5leHBvcnQgdHlwZSBFUlJPUkJBUiA9IHR5cGVvZiBFUlJPUkJBUjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUVycm9yQmFyKHNwZWM6IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZzxGaWVsZD4sIEVSUk9SQkFSPik6IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuICAvLyBUT0RPOiB1c2Ugc2VsZWN0aW9uXG4gIGNvbnN0IHttYXJrOiBfbSwgc2VsZWN0aW9uOiBfc2VsLCBwcm9qZWN0aW9uOiBfcCwgZW5jb2RpbmcsIC4uLm91dGVyU3BlY30gPSBzcGVjO1xuICBjb25zdCB7c2l6ZTogX3MsIC4uLmVuY29kaW5nV2l0aG91dFNpemV9ID0gZW5jb2Rpbmc7XG4gIGNvbnN0IHt4MjogX3gyLCB5MjogX3kyLCAuLi5lbmNvZGluZ1dpdGhvdXRYMlkyfSA9IGVuY29kaW5nO1xuICBjb25zdCB7eDogX3gsIHk6IF95LCAuLi5lbmNvZGluZ1dpdGhvdXRYX1gyX1lfWTJ9ID0gZW5jb2RpbmdXaXRob3V0WDJZMjtcblxuICBpZiAoIWVuY29kaW5nLngyICYmICFlbmNvZGluZy55Mikge1xuICAgIHRocm93IG5ldyBFcnJvcignTmVpdGhlciB4MiBvciB5MiBwcm92aWRlZCcpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vdXRlclNwZWMsXG4gICAgbGF5ZXI6IFtcbiAgICAgIHtcbiAgICAgICAgbWFyazogJ3J1bGUnLFxuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdXaXRob3V0U2l6ZVxuICAgICAgfSx7IC8vIExvd2VyIHRpY2tcbiAgICAgICAgbWFyazogJ3RpY2snLFxuICAgICAgICBlbmNvZGluZzogZW5jb2RpbmdXaXRob3V0WDJZMlxuICAgICAgfSwgeyAvLyBVcHBlciB0aWNrXG4gICAgICAgIG1hcms6ICd0aWNrJyxcbiAgICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nLngyID8ge1xuICAgICAgICAgIHg6IGVuY29kaW5nLngyLFxuICAgICAgICAgIHk6IGVuY29kaW5nLnksXG4gICAgICAgICAgLi4uZW5jb2RpbmdXaXRob3V0WF9YMl9ZX1kyXG4gICAgICAgIH0gOiB7XG4gICAgICAgICAgeDogZW5jb2RpbmcueCxcbiAgICAgICAgICB5OiBlbmNvZGluZy55MixcbiAgICAgICAgICAuLi5lbmNvZGluZ1dpdGhvdXRYX1gyX1lfWTJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIF1cbiAgfTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isMarkDef } from './../mark';\nimport { BOXPLOT, BOXPLOT_STYLES, normalizeBoxPlot, VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX } from './boxplot';\nimport { ERRORBAR, normalizeErrorBar } from './errorbar';\n/**\n * Registry index for all composite mark's normalizer\n */\nvar normalizerRegistry = {};\nexport function add(mark, normalizer) {\n normalizerRegistry[mark] = normalizer;\n}\nexport function remove(mark) {\n delete normalizerRegistry[mark];\n}\nexport var COMPOSITE_MARK_STYLES = BOXPLOT_STYLES;\nexport var VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = tslib_1.__assign({}, VL_ONLY_BOXPLOT_CONFIG_PROPERTY_INDEX);\nadd(BOXPLOT, normalizeBoxPlot);\nadd(ERRORBAR, normalizeErrorBar);\n/**\n * Transform a unit spec with composite mark into a normal layer spec.\n */\nexport function normalize(\n// This GenericUnitSpec has any as Encoding because unit specs with composite mark can have additional encoding channels.\nspec, config) {\n var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark;\n var normalizer = normalizerRegistry[mark];\n if (normalizer) {\n return normalizer(spec, config);\n }\n throw new Error(\"Invalid mark type \\\"\" + mark + \"\\\"\");\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9zaXRlbWFyay9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFVLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUU3QyxPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBbUMsZ0JBQWdCLEVBQUUscUNBQXFDLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDNUksT0FBTyxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQU12RDs7R0FFRztBQUNILElBQU0sa0JBQWtCLEdBQXFDLEVBQUUsQ0FBQztBQUVoRSxNQUFNLGNBQWMsSUFBWSxFQUFFLFVBQTBCO0lBQzFELGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxpQkFBaUIsSUFBWTtJQUNqQyxPQUFPLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFRRCxNQUFNLENBQUMsSUFBTSxxQkFBcUIsR0FBRyxjQUFjLENBQUM7QUFLcEQsTUFBTSxDQUFDLElBQU0scURBQXFELHdCQUM3RCxxQ0FBcUMsQ0FDekMsQ0FBQztBQUVGLEdBQUcsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUMvQixHQUFHLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFFakM7O0dBRUc7QUFDSCxNQUFNO0FBQ0YseUhBQXlIO0FBQ3pILElBQW1DLEVBQ25DLE1BQWM7SUFHaEIsSUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDL0QsSUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsSUFBSSxVQUFVLEVBQUU7UUFDZCxPQUFPLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDakM7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUFzQixJQUFJLE9BQUcsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi8uLi9jb25maWcnO1xuaW1wb3J0IHtBbnlNYXJrLCBpc01hcmtEZWZ9IGZyb20gJy4vLi4vbWFyayc7XG5pbXBvcnQge0dlbmVyaWNVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi8uLi9zcGVjJztcbmltcG9ydCB7Qk9YUExPVCwgQk9YUExPVF9TVFlMRVMsIEJveFBsb3RDb25maWdNaXhpbnMsIEJveFBsb3REZWYsIG5vcm1hbGl6ZUJveFBsb3QsIFZMX09OTFlfQk9YUExPVF9DT05GSUdfUFJPUEVSVFlfSU5ERVh9IGZyb20gJy4vYm94cGxvdCc7XG5pbXBvcnQge0VSUk9SQkFSLCBub3JtYWxpemVFcnJvckJhcn0gZnJvbSAnLi9lcnJvcmJhcic7XG5cblxuZXhwb3J0IHtCb3hQbG90Q29uZmlnfSBmcm9tICcuL2JveHBsb3QnO1xuZXhwb3J0IHR5cGUgVW5pdE5vcm1hbGl6ZXIgPSAoc3BlYzogR2VuZXJpY1VuaXRTcGVjPGFueSwgYW55PiwgY29uZmlnOiBDb25maWcpPT4gTm9ybWFsaXplZExheWVyU3BlYztcblxuLyoqXG4gKiBSZWdpc3RyeSBpbmRleCBmb3IgYWxsIGNvbXBvc2l0ZSBtYXJrJ3Mgbm9ybWFsaXplclxuICovXG5jb25zdCBub3JtYWxpemVyUmVnaXN0cnk6IHtbbWFyazogc3RyaW5nXTogVW5pdE5vcm1hbGl6ZXJ9ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQobWFyazogc3RyaW5nLCBub3JtYWxpemVyOiBVbml0Tm9ybWFsaXplcikge1xuICBub3JtYWxpemVyUmVnaXN0cnlbbWFya10gPSBub3JtYWxpemVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlKG1hcms6IHN0cmluZykge1xuICBkZWxldGUgbm9ybWFsaXplclJlZ2lzdHJ5W21hcmtdO1xufVxuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVNYXJrID0gQk9YUExPVCB8IEVSUk9SQkFSO1xuXG5leHBvcnQgdHlwZSBDb21wb3NpdGVNYXJrRGVmID0gQm94UGxvdERlZjtcblxuZXhwb3J0IHR5cGUgQ29tcG9zaXRlQWdncmVnYXRlID0gQk9YUExPVDtcblxuZXhwb3J0IGNvbnN0IENPTVBPU0lURV9NQVJLX1NUWUxFUyA9IEJPWFBMT1RfU1RZTEVTO1xuZXhwb3J0IHR5cGUgQ29tcG9zaXRlTWFya1N0eWxlID0gdHlwZW9mIENPTVBPU0lURV9NQVJLX1NUWUxFU1swXTtcblxuZXhwb3J0IGludGVyZmFjZSBDb21wb3NpdGVNYXJrQ29uZmlnTWl4aW5zIGV4dGVuZHMgQm94UGxvdENvbmZpZ01peGlucyB7fVxuXG5leHBvcnQgY29uc3QgVkxfT05MWV9DT01QT1NJVEVfTUFSS19TUEVDSUZJQ19DT05GSUdfUFJPUEVSVFlfSU5ERVggPSB7XG4gIC4uLlZMX09OTFlfQk9YUExPVF9DT05GSUdfUFJPUEVSVFlfSU5ERVhcbn07XG5cbmFkZChCT1hQTE9ULCBub3JtYWxpemVCb3hQbG90KTtcbmFkZChFUlJPUkJBUiwgbm9ybWFsaXplRXJyb3JCYXIpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhIHVuaXQgc3BlYyB3aXRoIGNvbXBvc2l0ZSBtYXJrIGludG8gYSBub3JtYWwgbGF5ZXIgc3BlYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShcbiAgICAvLyBUaGlzIEdlbmVyaWNVbml0U3BlYyBoYXMgYW55IGFzIEVuY29kaW5nIGJlY2F1c2UgdW5pdCBzcGVjcyB3aXRoIGNvbXBvc2l0ZSBtYXJrIGNhbiBoYXZlIGFkZGl0aW9uYWwgZW5jb2RpbmcgY2hhbm5lbHMuXG4gICAgc3BlYzogR2VuZXJpY1VuaXRTcGVjPGFueSwgQW55TWFyaz4sXG4gICAgY29uZmlnOiBDb25maWdcbiAgKTogTm9ybWFsaXplZExheWVyU3BlYyB7XG5cbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG4gIGNvbnN0IG5vcm1hbGl6ZXIgPSBub3JtYWxpemVyUmVnaXN0cnlbbWFya107XG4gIGlmIChub3JtYWxpemVyKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZXIoc3BlYywgY29uZmlnKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBtYXJrIHR5cGUgXCIke21hcmt9XCJgKTtcbn1cbiJdfQ==","export var VL_ONLY_GUIDE_CONFIG = ['shortTimeLabels'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ3VpZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkNBLE1BQU0sQ0FBQyxJQUFNLG9CQUFvQixHQUFnQyxDQUFDLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmRpdGlvblZhbHVlRGVmTWl4aW5zLCBWYWx1ZURlZn0gZnJvbSAnLi9maWVsZGRlZic7XG5pbXBvcnQge1ZnRW5jb2RlQ2hhbm5lbH0gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGl0bGVNaXhpbnMge1xuICAvKipcbiAgICogQSB0aXRsZSBmb3IgdGhlIGZpZWxkLiBJZiBgbnVsbGAsIHRoZSB0aXRsZSB3aWxsIGJlIHJlbW92ZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgZGVyaXZlZCBmcm9tIHRoZSBmaWVsZCdzIG5hbWUgYW5kIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIChgYWdncmVnYXRlYCwgYGJpbmAgYW5kIGB0aW1lVW5pdGApLiAgSWYgdGhlIGZpZWxkIGhhcyBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24sIHRoZSBmdW5jdGlvbiBpcyBkaXNwbGF5ZWQgYXMgcGFydCBvZiB0aGUgdGl0bGUgKGUuZy4sIGBcIlN1bSBvZiBQcm9maXRcImApLiBJZiB0aGUgZmllbGQgaXMgYmlubmVkIG9yIGhhcyBhIHRpbWUgdW5pdCBhcHBsaWVkLCB0aGUgYXBwbGllZCBmdW5jdGlvbiBpcyBzaG93biBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgYFwiUHJvZml0IChiaW5uZWQpXCJgLCBgXCJUcmFuc2FjdGlvbiBEYXRlICh5ZWFyLW1vbnRoKVwiYCkuICBPdGhlcndpc2UsIHRoZSB0aXRsZSBpcyBzaW1wbHkgdGhlIGZpZWxkIG5hbWUuXG4gICAqXG4gICAqIF9fTm90ZXNfXzpcbiAgICpcbiAgICogMSkgWW91IGNhbiBjdXN0b21pemUgdGhlIGRlZmF1bHQgZmllbGQgdGl0bGUgZm9ybWF0IGJ5IHByb3ZpZGluZyB0aGUgW2BmaWVsZFRpdGxlYCBwcm9wZXJ0eSBpbiB0aGUgW2NvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCkgb3IgW2BmaWVsZFRpdGxlYCBmdW5jdGlvbiB2aWEgdGhlIGBjb21waWxlYCBmdW5jdGlvbidzIG9wdGlvbnNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29tcGlsZS5odG1sI2ZpZWxkLXRpdGxlKS5cbiAgICpcbiAgICogMikgSWYgYm90aCBmaWVsZCBkZWZpbml0aW9uJ3MgYHRpdGxlYCBhbmQgYXhpcywgaGVhZGVyLCBvciBsZWdlbmQgYHRpdGxlYCBhcmUgZGVmaW5lZCwgYXhpcy9oZWFkZXIvbGVnZW5kIHRpdGxlIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHRpdGxlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHdWlkZSBleHRlbmRzIFRpdGxlTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtYXR0aW5nIHBhdHRlcm4gZm9yIGxhYmVscy4gVGhpcyBpcyBEMydzIFtudW1iZXIgZm9ybWF0IHBhdHRlcm5dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1mb3JtYXQjbG9jYWxlX2Zvcm1hdCkgZm9yIHF1YW50aXRhdGl2ZSBmaWVsZHMgYW5kIEQzJ3MgW3RpbWUgZm9ybWF0IHBhdHRlcm5dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy10aW1lLWZvcm1hdCNsb2NhbGVfZm9ybWF0KSBmb3IgdGltZSBmaWVsZC5cbiAgICpcbiAgICogU2VlIHRoZSBbZm9ybWF0IGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZm9ybWF0Lmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGRlcml2ZWQgZnJvbSBbbnVtYmVyRm9ybWF0XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI2Zvcm1hdCkgY29uZmlnIGZvciBxdWFudGl0YXRpdmUgZmllbGRzIGFuZCBmcm9tIFt0aW1lRm9ybWF0XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2NvbmZpZy5odG1sI2Zvcm1hdCkgY29uZmlnIGZvciB0ZW1wb3JhbCBmaWVsZHMuXG4gICAqL1xuICBmb3JtYXQ/OiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIFZsT25seUd1aWRlQ29uZmlnIHtcblxuICAvKipcbiAgICogV2hldGhlciBtb250aCBuYW1lcyBhbmQgd2Vla2RheSBuYW1lcyBzaG91bGQgYmUgYWJicmV2aWF0ZWQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgYGZhbHNlYFxuICAgKi9cbiAgc2hvcnRUaW1lTGFiZWxzPzogYm9vbGVhbjtcbn1cblxuXG5leHBvcnQgdHlwZSBHdWlkZUVuY29kaW5nRW50cnkgPSB7XG4gIFtrIGluIFZnRW5jb2RlQ2hhbm5lbF0/OiBWYWx1ZURlZiAmIENvbmRpdGlvblZhbHVlRGVmTWl4aW5zO1xufTtcblxuZXhwb3J0IGNvbnN0IFZMX09OTFlfR1VJREVfQ09ORklHOiAoa2V5b2YgVmxPbmx5R3VpZGVDb25maWcpW10gPSBbJ3Nob3J0VGltZUxhYmVscyddO1xuIl19","import * as tslib_1 from \"tslib\";\nimport { flagKeys } from './util';\nexport var defaultLegendConfig = {};\nvar COMMON_LEGEND_PROPERTY_INDEX = {\n entryPadding: 1,\n format: 1,\n offset: 1,\n orient: 1,\n padding: 1,\n tickCount: 1,\n title: 1,\n type: 1,\n values: 1,\n zindex: 1\n};\nvar VG_LEGEND_PROPERTY_INDEX = tslib_1.__assign({}, COMMON_LEGEND_PROPERTY_INDEX, { \n // channel scales\n opacity: 1, shape: 1, stroke: 1, fill: 1, size: 1, \n // encode\n encode: 1 });\nexport var LEGEND_PROPERTIES = flagKeys(COMMON_LEGEND_PROPERTY_INDEX);\nexport var VG_LEGEND_PROPERTIES = flagKeys(VG_LEGEND_PROPERTY_INDEX);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xlZ2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFPLFFBQVEsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQXdFdEMsTUFBTSxDQUFDLElBQU0sbUJBQW1CLEdBQWlCLEVBQUUsQ0FBQztBQUVwRCxJQUFNLDRCQUE0QixHQUFvQztJQUNwRSxZQUFZLEVBQUUsQ0FBQztJQUNmLE1BQU0sRUFBRSxDQUFDO0lBQ1QsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztJQUNULE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLENBQUM7SUFDWixLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxNQUFNLEVBQUUsQ0FBQztDQUNWLENBQUM7QUFFRixJQUFNLHdCQUF3Qix3QkFDekIsNEJBQTRCO0lBQy9CLGlCQUFpQjtJQUNqQixPQUFPLEVBQUUsQ0FBQyxFQUNWLEtBQUssRUFBRSxDQUFDLEVBQ1IsTUFBTSxFQUFFLENBQUMsRUFDVCxJQUFJLEVBQUUsQ0FBQyxFQUNQLElBQUksRUFBRSxDQUFDO0lBQ1AsU0FBUztJQUNULE1BQU0sRUFBRSxDQUFDLEdBQ1YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxJQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxJQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQge0d1aWRlLCBHdWlkZUVuY29kaW5nRW50cnksIFZsT25seUd1aWRlQ29uZmlnfSBmcm9tICcuL2d1aWRlJztcbmltcG9ydCB7RmxhZywgZmxhZ0tleXN9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge1ZnTGVnZW5kLCBWZ0xlZ2VuZEJhc2UsIFZnTGVnZW5kQ29uZmlnfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIExlZ2VuZENvbmZpZyBleHRlbmRzIFZnTGVnZW5kQ29uZmlnLCBWbE9ubHlHdWlkZUNvbmZpZyB7fVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBsZWdlbmQgb3IgYm9vbGVhbiBmbGFnIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHNob3cgaXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGVnZW5kIGV4dGVuZHMgVmdMZWdlbmRCYXNlLCBHdWlkZSB7XG4gIC8qKlxuICAgKiBNYXJrIGRlZmluaXRpb25zIGZvciBjdXN0b20gbGVnZW5kIGVuY29kaW5nLlxuICAgKlxuICAgKiBAaGlkZVxuICAgKi9cbiAgZW5jb2Rpbmc/OiBMZWdlbmRFbmNvZGluZztcblxuICAvKipcbiAgICogVGhlIGRlc2lyZWQgbnVtYmVyIG9mIHRpY2sgdmFsdWVzIGZvciBxdWFudGl0YXRpdmUgbGVnZW5kcy5cbiAgICovXG4gIHRpY2tDb3VudD86IG51bWJlcjtcblxuICAvKipcbiAgICogRXhwbGljaXRseSBzZXQgdGhlIHZpc2libGUgbGVnZW5kIHZhbHVlcy5cbiAgICovXG4gIHZhbHVlcz86IG51bWJlcltdIHwgc3RyaW5nW10gfCBEYXRlVGltZVtdO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgbGVnZW5kLiBVc2UgYFwic3ltYm9sXCJgIHRvIGNyZWF0ZSBhIGRpc2NyZXRlIGxlZ2VuZCBhbmQgYFwiZ3JhZGllbnRcImAgZm9yIGEgY29udGludW91cyBjb2xvciBncmFkaWVudC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcImdyYWRpZW50XCJgIGZvciBub24tYmlubmVkIHF1YW50aXRhdGl2ZSBmaWVsZHMgYW5kIHRlbXBvcmFsIGZpZWxkczsgYFwic3ltYm9sXCJgIG90aGVyd2lzZS5cbiAgICovXG4gIHR5cGU/OiAnc3ltYm9sJyB8ICdncmFkaWVudCc7XG5cbiAgLyoqXG4gICAqIEEgbm9uLXBvc2l0aXZlIGludGVnZXIgaW5kaWNhdGluZyB6LWluZGV4IG9mIHRoZSBsZWdlbmQuXG4gICAqIElmIHppbmRleCBpcyAwLCBsZWdlbmQgc2hvdWxkIGJlIGRyYXduIGJlaGluZCBhbGwgY2hhcnQgZWxlbWVudHMuXG4gICAqIFRvIHB1dCB0aGVtIGluIGZyb250LCB1c2UgemluZGV4ID0gMS5cbiAgICogQFRKUy10eXBlIGludGVnZXJcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgemluZGV4PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBMZWdlbmRFbmNvZGluZyA9IHtcbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgdGhlIGxlZ2VuZCBjb250YWluZXIuXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgbGVnZW5kIHdpdGggY3VzdG9tIHgsIHkgcG9zaXRpb24uXG4gICAqL1xuICBsZWdlbmQ/OiBHdWlkZUVuY29kaW5nRW50cnk7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlbmNvZGluZyBmb3IgdGhlIGxlZ2VuZCB0aXRsZSB0ZXh0IG1hcmsuXG4gICAqL1xuICB0aXRsZT86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciBsZWdlbmQgbGFiZWwgdGV4dCBtYXJrcy5cbiAgICovXG4gIGxhYmVscz86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciBsZWdlbmQgc3ltYm9sIG1hcmtzLlxuICAgKi9cbiAgc3ltYm9scz86IEd1aWRlRW5jb2RpbmdFbnRyeTtcblxuICAvKipcbiAgICogQ3VzdG9tIGVuY29kaW5nIGZvciBsZWdlbmQgZ3JhZGllbnQgZmlsbGVkIHJlY3QgbWFya3MuXG4gICAqL1xuICBncmFkaWVudD86IEd1aWRlRW5jb2RpbmdFbnRyeTtcbn07XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TGVnZW5kQ29uZmlnOiBMZWdlbmRDb25maWcgPSB7fTtcblxuY29uc3QgQ09NTU9OX0xFR0VORF9QUk9QRVJUWV9JTkRFWDogRmxhZzxrZXlvZiAoVmdMZWdlbmQgfCBMZWdlbmQpPiA9IHtcbiAgZW50cnlQYWRkaW5nOiAxLFxuICBmb3JtYXQ6IDEsXG4gIG9mZnNldDogMSxcbiAgb3JpZW50OiAxLFxuICBwYWRkaW5nOiAxLFxuICB0aWNrQ291bnQ6IDEsXG4gIHRpdGxlOiAxLFxuICB0eXBlOiAxLFxuICB2YWx1ZXM6IDEsXG4gIHppbmRleDogMVxufTtcblxuY29uc3QgVkdfTEVHRU5EX1BST1BFUlRZX0lOREVYOiBGbGFnPGtleW9mIFZnTGVnZW5kPiA9IHtcbiAgLi4uQ09NTU9OX0xFR0VORF9QUk9QRVJUWV9JTkRFWCxcbiAgLy8gY2hhbm5lbCBzY2FsZXNcbiAgb3BhY2l0eTogMSxcbiAgc2hhcGU6IDEsXG4gIHN0cm9rZTogMSxcbiAgZmlsbDogMSxcbiAgc2l6ZTogMSxcbiAgLy8gZW5jb2RlXG4gIGVuY29kZTogMVxufTtcblxuZXhwb3J0IGNvbnN0IExFR0VORF9QUk9QRVJUSUVTID0gZmxhZ0tleXMoQ09NTU9OX0xFR0VORF9QUk9QRVJUWV9JTkRFWCk7XG5cbmV4cG9ydCBjb25zdCBWR19MRUdFTkRfUFJPUEVSVElFUyA9IGZsYWdLZXlzKFZHX0xFR0VORF9QUk9QRVJUWV9JTkRFWCk7XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { toSet } from 'vega-util';\nimport { Channel, CHANNELS, isColorChannel } from './channel';\nimport * as log from './log';\nimport { Type, TYPE_INDEX } from './type';\nimport { contains, flagKeys, keys } from './util';\nexport var ScaleType;\n(function (ScaleType) {\n // Continuous - Quantitative\n ScaleType.LINEAR = 'linear';\n ScaleType.BIN_LINEAR = 'bin-linear';\n ScaleType.LOG = 'log';\n ScaleType.POW = 'pow';\n ScaleType.SQRT = 'sqrt';\n // Continuous - Time\n ScaleType.TIME = 'time';\n ScaleType.UTC = 'utc';\n // sequential\n ScaleType.SEQUENTIAL = 'sequential';\n // Quantile, Quantize, threshold\n ScaleType.QUANTILE = 'quantile';\n ScaleType.QUANTIZE = 'quantize';\n ScaleType.THRESHOLD = 'threshold';\n ScaleType.ORDINAL = 'ordinal';\n ScaleType.BIN_ORDINAL = 'bin-ordinal';\n ScaleType.POINT = 'point';\n ScaleType.BAND = 'band';\n})(ScaleType || (ScaleType = {}));\n/**\n * Index for scale categories -- only scale of the same categories can be merged together.\n * Current implementation is trying to be conservative and avoid merging scale type that might not work together\n */\nvar SCALE_CATEGORY_INDEX = {\n linear: 'numeric',\n log: 'numeric',\n pow: 'numeric',\n sqrt: 'numeric',\n 'bin-linear': 'bin-linear',\n time: 'time',\n utc: 'time',\n sequential: 'sequential',\n ordinal: 'ordinal',\n 'bin-ordinal': 'bin-ordinal',\n point: 'ordinal-position',\n band: 'ordinal-position'\n};\nexport var SCALE_TYPES = keys(SCALE_CATEGORY_INDEX);\n/**\n * Whether the two given scale types can be merged together.\n */\nexport function scaleCompatible(scaleType1, scaleType2) {\n var scaleCategory1 = SCALE_CATEGORY_INDEX[scaleType1];\n var scaleCategory2 = SCALE_CATEGORY_INDEX[scaleType2];\n return scaleCategory1 === scaleCategory2 ||\n (scaleCategory1 === 'ordinal-position' && scaleCategory2 === 'time') ||\n (scaleCategory2 === 'ordinal-position' && scaleCategory1 === 'time');\n}\n/**\n * Index for scale precedence -- high score = higher priority for merging.\n */\nvar SCALE_PRECEDENCE_INDEX = {\n // numeric\n linear: 0,\n log: 1,\n pow: 1,\n sqrt: 1,\n // time\n time: 0,\n utc: 0,\n // ordinal-position -- these have higher precedence than continuous scales as they support more types of data\n point: 10,\n band: 11,\n // non grouped types\n 'bin-linear': 0,\n sequential: 0,\n ordinal: 0,\n 'bin-ordinal': 0,\n};\n/**\n * Return scale categories -- only scale of the same categories can be merged together.\n */\nexport function scaleTypePrecedence(scaleType) {\n return SCALE_PRECEDENCE_INDEX[scaleType];\n}\nexport var CONTINUOUS_TO_CONTINUOUS_SCALES = ['linear', 'bin-linear', 'log', 'pow', 'sqrt', 'time', 'utc'];\nvar CONTINUOUS_TO_CONTINUOUS_INDEX = toSet(CONTINUOUS_TO_CONTINUOUS_SCALES);\nexport var CONTINUOUS_DOMAIN_SCALES = CONTINUOUS_TO_CONTINUOUS_SCALES.concat(['sequential' /* TODO add 'quantile', 'quantize', 'threshold'*/]);\nvar CONTINUOUS_DOMAIN_INDEX = toSet(CONTINUOUS_DOMAIN_SCALES);\nexport var DISCRETE_DOMAIN_SCALES = ['ordinal', 'bin-ordinal', 'point', 'band'];\nvar DISCRETE_DOMAIN_INDEX = toSet(DISCRETE_DOMAIN_SCALES);\nvar BIN_SCALES_INDEX = toSet(['bin-linear', 'bin-ordinal']);\nexport var TIME_SCALE_TYPES = ['time', 'utc'];\nexport function hasDiscreteDomain(type) {\n return type in DISCRETE_DOMAIN_INDEX;\n}\nexport function isBinScale(type) {\n return type in BIN_SCALES_INDEX;\n}\nexport function hasContinuousDomain(type) {\n return type in CONTINUOUS_DOMAIN_INDEX;\n}\nexport function isContinuousToContinuous(type) {\n return type in CONTINUOUS_TO_CONTINUOUS_INDEX;\n}\nexport var defaultScaleConfig = {\n textXRangeStep: 90,\n rangeStep: 21,\n pointPadding: 0.5,\n bandPaddingInner: 0.1,\n facetSpacing: 16,\n minBandSize: 2,\n minFontSize: 8,\n maxFontSize: 40,\n minOpacity: 0.3,\n maxOpacity: 0.8,\n // FIXME: revise if these *can* become ratios of rangeStep\n minSize: 9,\n minStrokeWidth: 1,\n maxStrokeWidth: 4\n};\nexport function isExtendedScheme(scheme) {\n return scheme && !!scheme['name'];\n}\nexport function isSelectionDomain(domain) {\n return domain && domain['selection'];\n}\nvar SCALE_PROPERTY_INDEX = {\n type: 1,\n domain: 1,\n range: 1,\n rangeStep: 1,\n scheme: 1,\n // Other properties\n reverse: 1,\n round: 1,\n // quantitative / time\n clamp: 1,\n nice: 1,\n // quantitative\n base: 1,\n exponent: 1,\n interpolate: 1,\n zero: 1,\n // band/point\n padding: 1,\n paddingInner: 1,\n paddingOuter: 1\n};\nexport var SCALE_PROPERTIES = flagKeys(SCALE_PROPERTY_INDEX);\nvar type = SCALE_PROPERTY_INDEX.type, domain = SCALE_PROPERTY_INDEX.domain, range = SCALE_PROPERTY_INDEX.range, rangeStep = SCALE_PROPERTY_INDEX.rangeStep, scheme = SCALE_PROPERTY_INDEX.scheme, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX = tslib_1.__rest(SCALE_PROPERTY_INDEX, [\"type\", \"domain\", \"range\", \"rangeStep\", \"scheme\"]);\nexport var NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES = flagKeys(NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTY_INDEX);\nexport var SCALE_TYPE_INDEX = generateScaleTypeIndex();\nexport function scaleTypeSupportProperty(scaleType, propName) {\n switch (propName) {\n case 'type':\n case 'domain':\n case 'reverse':\n case 'range':\n return true;\n case 'scheme':\n return contains(['sequential', 'ordinal', 'bin-ordinal', 'quantile', 'quantize'], scaleType);\n case 'interpolate':\n // FIXME(https://github.com/vega/vega-lite/issues/2902) how about ordinal?\n return contains(['linear', 'bin-linear', 'pow', 'log', 'sqrt', 'utc', 'time'], scaleType);\n case 'round':\n return isContinuousToContinuous(scaleType) || scaleType === 'band' || scaleType === 'point';\n case 'padding':\n return isContinuousToContinuous(scaleType) || contains(['point', 'band'], scaleType);\n case 'paddingOuter':\n case 'rangeStep':\n return contains(['point', 'band'], scaleType);\n case 'paddingInner':\n return scaleType === 'band';\n case 'clamp':\n return isContinuousToContinuous(scaleType) || scaleType === 'sequential';\n case 'nice':\n return isContinuousToContinuous(scaleType) || scaleType === 'sequential' || scaleType === 'quantize';\n case 'exponent':\n return scaleType === 'pow';\n case 'base':\n return scaleType === 'log';\n case 'zero':\n return hasContinuousDomain(scaleType) && !contains([\n 'log',\n 'time', 'utc',\n 'bin-linear',\n 'threshold',\n 'quantile' // quantile depends on distribution so zero does not matter\n ], scaleType);\n }\n /* istanbul ignore next: should never reach here*/\n throw new Error(\"Invalid scale property \" + propName + \".\");\n}\n/**\n * Returns undefined if the input channel supports the input scale property name\n */\nexport function channelScalePropertyIncompatability(channel, propName) {\n switch (propName) {\n case 'interpolate':\n case 'scheme':\n if (!isColorChannel(channel)) {\n return log.message.cannotUseScalePropertyWithNonColor(channel);\n }\n return undefined;\n case 'type':\n case 'domain':\n case 'range':\n case 'base':\n case 'exponent':\n case 'nice':\n case 'padding':\n case 'paddingInner':\n case 'paddingOuter':\n case 'rangeStep':\n case 'reverse':\n case 'round':\n case 'clamp':\n case 'zero':\n return undefined; // GOOD!\n }\n /* istanbul ignore next: it should never reach here */\n throw new Error(\"Invalid scale property \\\"\" + propName + \"\\\".\");\n}\nexport function scaleTypeSupportDataType(specifiedType, fieldDefType, bin) {\n if (contains([Type.ORDINAL, Type.NOMINAL], fieldDefType)) {\n return specifiedType === undefined || hasDiscreteDomain(specifiedType);\n }\n else if (fieldDefType === Type.TEMPORAL) {\n return contains([ScaleType.TIME, ScaleType.UTC, ScaleType.SEQUENTIAL, undefined], specifiedType);\n }\n else if (fieldDefType === Type.QUANTITATIVE) {\n if (bin) {\n return contains([ScaleType.BIN_LINEAR, ScaleType.BIN_ORDINAL, ScaleType.LINEAR], specifiedType);\n }\n return contains([ScaleType.LOG, ScaleType.POW, ScaleType.SQRT, ScaleType.QUANTILE, ScaleType.QUANTIZE, ScaleType.LINEAR, ScaleType.SEQUENTIAL, undefined], specifiedType);\n }\n return true;\n}\nexport function channelSupportScaleType(channel, scaleType) {\n switch (channel) {\n case Channel.X:\n case Channel.Y:\n case Channel.SIZE: // TODO: size and opacity can support ordinal with more modification\n case Channel.OPACITY:\n // Although it generally doesn't make sense to use band with size and opacity,\n // it can also work since we use band: 0.5 to get midpoint.\n return isContinuousToContinuous(scaleType) || contains(['band', 'point'], scaleType);\n case Channel.COLOR:\n case Channel.FILL:\n case Channel.STROKE:\n return scaleType !== 'band'; // band does not make sense with color\n case Channel.SHAPE:\n return scaleType === 'ordinal'; // shape = lookup only\n }\n /* istanbul ignore next: it should never reach here */\n return false;\n}\nexport function getSupportedScaleType(channel, fieldDefType, bin) {\n return SCALE_TYPE_INDEX[generateScaleTypeIndexKey(channel, fieldDefType, bin)];\n}\n// generates ScaleTypeIndex where keys are encoding channels and values are list of valid ScaleTypes\nfunction generateScaleTypeIndex() {\n var index = {};\n for (var _i = 0, CHANNELS_1 = CHANNELS; _i < CHANNELS_1.length; _i++) {\n var channel = CHANNELS_1[_i];\n for (var _a = 0, _b = keys(TYPE_INDEX); _a < _b.length; _a++) {\n var fieldDefType = _b[_a];\n for (var _c = 0, SCALE_TYPES_1 = SCALE_TYPES; _c < SCALE_TYPES_1.length; _c++) {\n var scaleType = SCALE_TYPES_1[_c];\n for (var _d = 0, _e = [false, true]; _d < _e.length; _d++) {\n var bin = _e[_d];\n var key = generateScaleTypeIndexKey(channel, fieldDefType, bin);\n if (channelSupportScaleType(channel, scaleType) && scaleTypeSupportDataType(scaleType, fieldDefType, bin)) {\n index[key] = index[key] || [];\n index[key].push(scaleType);\n }\n }\n }\n }\n }\n return index;\n}\nfunction generateScaleTypeIndexKey(channel, fieldDefType, bin) {\n var key = channel + '_' + fieldDefType;\n return bin ? key + '_bin' : key;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NhbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFaEMsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTVELE9BQU8sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQVEsUUFBUSxFQUFFLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUd0RCxNQUFNLEtBQVcsU0FBUyxDQXNCekI7QUF0QkQsV0FBaUIsU0FBUztJQUN4Qiw0QkFBNEI7SUFDZixnQkFBTSxHQUFhLFFBQVEsQ0FBQztJQUM1QixvQkFBVSxHQUFpQixZQUFZLENBQUM7SUFDeEMsYUFBRyxHQUFVLEtBQUssQ0FBQztJQUNuQixhQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ25CLGNBQUksR0FBVyxNQUFNLENBQUM7SUFDbkMsb0JBQW9CO0lBQ1AsY0FBSSxHQUFXLE1BQU0sQ0FBQztJQUN0QixhQUFHLEdBQVUsS0FBSyxDQUFDO0lBQ2hDLGFBQWE7SUFDQSxvQkFBVSxHQUFpQixZQUFZLENBQUM7SUFFckQsZ0NBQWdDO0lBQ25CLGtCQUFRLEdBQWUsVUFBVSxDQUFDO0lBQ2xDLGtCQUFRLEdBQWUsVUFBVSxDQUFDO0lBQ2xDLG1CQUFTLEdBQWdCLFdBQVcsQ0FBQztJQUVyQyxpQkFBTyxHQUFjLFNBQVMsQ0FBQztJQUMvQixxQkFBVyxHQUFrQixhQUFhLENBQUM7SUFDM0MsZUFBSyxHQUFZLE9BQU8sQ0FBQztJQUN6QixjQUFJLEdBQVcsTUFBTSxDQUFDO0FBQ3JDLENBQUMsRUF0QmdCLFNBQVMsS0FBVCxTQUFTLFFBc0J6QjtBQVVEOzs7R0FHRztBQUNILElBQU0sb0JBQW9CLEdBR3RCO0lBQ0YsTUFBTSxFQUFFLFNBQVM7SUFDakIsR0FBRyxFQUFFLFNBQVM7SUFDZCxHQUFHLEVBQUUsU0FBUztJQUNkLElBQUksRUFBRSxTQUFTO0lBQ2YsWUFBWSxFQUFFLFlBQVk7SUFDMUIsSUFBSSxFQUFFLE1BQU07SUFDWixHQUFHLEVBQUUsTUFBTTtJQUNYLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLGFBQWEsRUFBRSxhQUFhO0lBQzVCLEtBQUssRUFBRSxrQkFBa0I7SUFDekIsSUFBSSxFQUFFLGtCQUFrQjtDQUN6QixDQUFDO0FBRUYsTUFBTSxDQUFDLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBZ0IsQ0FBQztBQUVyRTs7R0FFRztBQUNILE1BQU0sMEJBQTBCLFVBQXFCLEVBQUUsVUFBcUI7SUFDMUUsSUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsSUFBTSxjQUFjLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDeEQsT0FBTyxjQUFjLEtBQUssY0FBYztRQUN0QyxDQUFDLGNBQWMsS0FBSyxrQkFBa0IsSUFBSSxjQUFjLEtBQUssTUFBTSxDQUFDO1FBQ3BFLENBQUMsY0FBYyxLQUFLLGtCQUFrQixJQUFJLGNBQWMsS0FBSyxNQUFNLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxJQUFNLHNCQUFzQixHQUd4QjtJQUNGLFVBQVU7SUFDVixNQUFNLEVBQUUsQ0FBQztJQUNULEdBQUcsRUFBRSxDQUFDO0lBQ04sR0FBRyxFQUFFLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU87SUFDUCxJQUFJLEVBQUUsQ0FBQztJQUNQLEdBQUcsRUFBRSxDQUFDO0lBQ04sNkdBQTZHO0lBQzdHLEtBQUssRUFBRSxFQUFFO0lBQ1QsSUFBSSxFQUFFLEVBQUU7SUFDUixvQkFBb0I7SUFDcEIsWUFBWSxFQUFFLENBQUM7SUFDZixVQUFVLEVBQUUsQ0FBQztJQUNiLE9BQU8sRUFBRSxDQUFDO0lBQ1YsYUFBYSxFQUFFLENBQUM7Q0FDakIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSw4QkFBOEIsU0FBb0I7SUFDdEQsT0FBTyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sK0JBQStCLEdBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUgsSUFBTSw4QkFBOEIsR0FBRyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztBQUU5RSxNQUFNLENBQUMsSUFBTSx3QkFBd0IsR0FBZ0IsK0JBQStCLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLGlEQUFpRCxDQUFDLENBQUMsQ0FBQztBQUM5SixJQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBRWhFLE1BQU0sQ0FBQyxJQUFNLHNCQUFzQixHQUFnQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9GLElBQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFNUQsSUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsSUFBTSxnQkFBZ0IsR0FBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFN0QsTUFBTSw0QkFBNEIsSUFBZTtJQUMvQyxPQUFPLElBQUksSUFBSSxxQkFBcUIsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxxQkFBcUIsSUFBZTtJQUN4QyxPQUFPLElBQUksSUFBSSxnQkFBZ0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSw4QkFBOEIsSUFBZTtJQUdqRCxPQUFPLElBQUksSUFBSSx1QkFBdUIsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxtQ0FBbUMsSUFBZTtJQUN0RCxPQUFPLElBQUksSUFBSSw4QkFBOEIsQ0FBQztBQUNoRCxDQUFDO0FBa0xELE1BQU0sQ0FBQyxJQUFNLGtCQUFrQixHQUFHO0lBQ2hDLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLFNBQVMsRUFBRSxFQUFFO0lBQ2IsWUFBWSxFQUFFLEdBQUc7SUFDakIsZ0JBQWdCLEVBQUUsR0FBRztJQUNyQixZQUFZLEVBQUUsRUFBRTtJQUVoQixXQUFXLEVBQUUsQ0FBQztJQUVkLFdBQVcsRUFBRSxDQUFDO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFFZixVQUFVLEVBQUUsR0FBRztJQUNmLFVBQVUsRUFBRSxHQUFHO0lBRWYsMERBQTBEO0lBQzFELE9BQU8sRUFBRSxDQUFDO0lBRVYsY0FBYyxFQUFFLENBQUM7SUFDakIsY0FBYyxFQUFFLENBQUM7Q0FDbEIsQ0FBQztBQWtERixNQUFNLDJCQUEyQixNQUE2QjtJQUM1RCxPQUFPLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLDRCQUE0QixNQUFjO0lBQzlDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBMktELElBQU0sb0JBQW9CLEdBQXNCO0lBQzlDLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxLQUFLLEVBQUUsQ0FBQztJQUNSLFNBQVMsRUFBRSxDQUFDO0lBQ1osTUFBTSxFQUFFLENBQUM7SUFDVCxtQkFBbUI7SUFDbkIsT0FBTyxFQUFFLENBQUM7SUFDVixLQUFLLEVBQUUsQ0FBQztJQUNSLHNCQUFzQjtJQUN0QixLQUFLLEVBQUUsQ0FBQztJQUNSLElBQUksRUFBRSxDQUFDO0lBQ1AsZUFBZTtJQUNmLElBQUksRUFBRSxDQUFDO0lBQ1AsUUFBUSxFQUFFLENBQUM7SUFDWCxXQUFXLEVBQUUsQ0FBQztJQUNkLElBQUksRUFBRSxDQUFDO0lBQ1AsYUFBYTtJQUNiLE9BQU8sRUFBRSxDQUFDO0lBQ1YsWUFBWSxFQUFFLENBQUM7SUFDZixZQUFZLEVBQUUsQ0FBQztDQUNoQixDQUFDO0FBRUYsTUFBTSxDQUFDLElBQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFeEQsSUFBQSxnQ0FBSSxFQUFFLG9DQUFNLEVBQUUsa0NBQUssRUFBRSwwQ0FBUyxFQUFFLG9DQUFNLEVBQUUsMElBQWtELENBQXlCO0FBRTFILE1BQU0sQ0FBQyxJQUFNLDJDQUEyQyxHQUFHLFFBQVEsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0FBRXJILE1BQU0sQ0FBQyxJQUFNLGdCQUFnQixHQUFHLHNCQUFzQixFQUFFLENBQUM7QUFFekQsTUFBTSxtQ0FBbUMsU0FBb0IsRUFBRSxRQUFxQjtJQUNsRixRQUFRLFFBQVEsRUFBRTtRQUNoQixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssUUFBUSxDQUFDO1FBQ2QsS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLE9BQU87WUFDVixPQUFPLElBQUksQ0FBQztRQUNkLEtBQUssUUFBUTtZQUNYLE9BQU8sUUFBUSxDQUFDLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9GLEtBQUssYUFBYTtZQUNoQiwwRUFBMEU7WUFDMUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM1RixLQUFLLE9BQU87WUFDVixPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxNQUFNLElBQUksU0FBUyxLQUFLLE9BQU8sQ0FBQztRQUM5RixLQUFLLFNBQVM7WUFDWixPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN2RixLQUFLLGNBQWMsQ0FBQztRQUNwQixLQUFLLFdBQVc7WUFDZCxPQUFPLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRCxLQUFLLGNBQWM7WUFDakIsT0FBTyxTQUFTLEtBQUssTUFBTSxDQUFDO1FBQzlCLEtBQUssT0FBTztZQUNWLE9BQU8sd0JBQXdCLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxLQUFLLFlBQVksQ0FBQztRQUMzRSxLQUFLLE1BQU07WUFDVCxPQUFPLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxZQUFZLElBQUksU0FBZ0IsS0FBSyxVQUFVLENBQUM7UUFDOUcsS0FBSyxVQUFVO1lBQ2IsT0FBTyxTQUFTLEtBQUssS0FBSyxDQUFDO1FBQzdCLEtBQUssTUFBTTtZQUNULE9BQU8sU0FBUyxLQUFLLEtBQUssQ0FBQztRQUM3QixLQUFLLE1BQU07WUFDVCxPQUFPLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNqRCxLQUFLO2dCQUNMLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFlBQVk7Z0JBQ1osV0FBVztnQkFDWCxVQUFVLENBQUMsMkRBQTJEO2FBQ3ZFLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDakI7SUFDRCxrREFBa0Q7SUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBMEIsUUFBUSxNQUFHLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLDhDQUE4QyxPQUFnQixFQUFFLFFBQXFCO0lBQ3pGLFFBQVEsUUFBUSxFQUFFO1FBQ2hCLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssUUFBUTtZQUNYLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQzVCLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNoRTtZQUNELE9BQU8sU0FBUyxDQUFDO1FBQ25CLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssY0FBYyxDQUFDO1FBQ3BCLEtBQUssY0FBYyxDQUFDO1FBQ3BCLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssTUFBTTtZQUNULE9BQU8sU0FBUyxDQUFDLENBQUMsUUFBUTtLQUM3QjtJQUNELHNEQUFzRDtJQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUEyQixRQUFRLFFBQUksQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLG1DQUFtQyxhQUF3QixFQUFFLFlBQWtCLEVBQUUsR0FBc0I7SUFDM0csSUFBSSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRTtRQUN4RCxPQUFPLGFBQWEsS0FBSyxTQUFTLElBQUksaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDeEU7U0FBTSxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ3pDLE9BQU8sUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7S0FDbEc7U0FBTSxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQzdDLElBQUksR0FBRyxFQUFFO1lBQ1AsT0FBTyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ2pHO1FBQ0QsT0FBTyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0tBQzNLO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsTUFBTSxrQ0FBa0MsT0FBZ0IsRUFBRSxTQUFvQjtJQUM1RSxRQUFRLE9BQU8sRUFBRTtRQUNmLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNmLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNmLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLG9FQUFvRTtRQUN2RixLQUFLLE9BQU8sQ0FBQyxPQUFPO1lBQ2xCLDhFQUE4RTtZQUM5RSwyREFBMkQ7WUFDM0QsT0FBTyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFdkYsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ25CLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQztRQUNsQixLQUFLLE9BQU8sQ0FBQyxNQUFNO1lBQ2pCLE9BQU8sU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFJLHNDQUFzQztRQUV4RSxLQUFLLE9BQU8sQ0FBQyxLQUFLO1lBQ2hCLE9BQU8sU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDLHNCQUFzQjtLQUN6RDtJQUNELHNEQUFzRDtJQUN0RCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLGdDQUFnQyxPQUFnQixFQUFFLFlBQWtCLEVBQUUsR0FBYTtJQUN2RixPQUFPLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNqRixDQUFDO0FBTUQsb0dBQW9HO0FBQ3BHO0lBQ0UsSUFBTSxLQUFLLEdBQW1CLEVBQUUsQ0FBQztJQUNqQyxLQUFzQixVQUFRLEVBQVIscUJBQVEsRUFBUixzQkFBUSxFQUFSLElBQVEsRUFBRTtRQUEzQixJQUFNLE9BQU8saUJBQUE7UUFDaEIsS0FBMkIsVUFBZ0IsRUFBaEIsS0FBQSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQWhCLGNBQWdCLEVBQWhCLElBQWdCLEVBQUU7WUFBeEMsSUFBTSxZQUFZLFNBQUE7WUFDckIsS0FBd0IsVUFBVyxFQUFYLDJCQUFXLEVBQVgseUJBQVcsRUFBWCxJQUFXLEVBQUU7Z0JBQWhDLElBQU0sU0FBUyxvQkFBQTtnQkFDbEIsS0FBa0IsVUFBYSxFQUFiLE1BQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFiLGNBQWEsRUFBYixJQUFhLEVBQUU7b0JBQTVCLElBQU0sR0FBRyxTQUFBO29CQUNaLElBQU0sR0FBRyxHQUFHLHlCQUF5QixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ2xFLElBQUksdUJBQXVCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxJQUFJLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxDQUFDLEVBQUU7d0JBQ3pHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM5QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUM1QjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELG1DQUFtQyxPQUFnQixFQUFFLFlBQWtCLEVBQUUsR0FBWTtJQUNuRixJQUFNLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLFlBQVksQ0FBQztJQUN6QyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2xDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3RvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtCaW5QYXJhbXN9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2hhbm5lbCwgQ0hBTk5FTFMsIGlzQ29sb3JDaGFubmVsfSBmcm9tICcuL2NoYW5uZWwnO1xuaW1wb3J0IHtEYXRlVGltZX0gZnJvbSAnLi9kYXRldGltZSc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHtUeXBlLCBUWVBFX0lOREVYfSBmcm9tICcuL3R5cGUnO1xuaW1wb3J0IHtjb250YWlucywgRmxhZywgZmxhZ0tleXMsIGtleXN9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge1NjYWxlSW50ZXJwb2xhdGUsIFNjYWxlSW50ZXJwb2xhdGVQYXJhbXN9IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFNjYWxlVHlwZSB7XG4gIC8vIENvbnRpbnVvdXMgLSBRdWFudGl0YXRpdmVcbiAgZXhwb3J0IGNvbnN0IExJTkVBUjogJ2xpbmVhcicgPSAnbGluZWFyJztcbiAgZXhwb3J0IGNvbnN0IEJJTl9MSU5FQVI6ICdiaW4tbGluZWFyJyA9ICdiaW4tbGluZWFyJztcbiAgZXhwb3J0IGNvbnN0IExPRzogJ2xvZycgPSAnbG9nJztcbiAgZXhwb3J0IGNvbnN0IFBPVzogJ3BvdycgPSAncG93JztcbiAgZXhwb3J0IGNvbnN0IFNRUlQ6ICdzcXJ0JyA9ICdzcXJ0JztcbiAgLy8gQ29udGludW91cyAtIFRpbWVcbiAgZXhwb3J0IGNvbnN0IFRJTUU6ICd0aW1lJyA9ICd0aW1lJztcbiAgZXhwb3J0IGNvbnN0IFVUQzogJ3V0YycgPSAndXRjJztcbiAgLy8gc2VxdWVudGlhbFxuICBleHBvcnQgY29uc3QgU0VRVUVOVElBTDogJ3NlcXVlbnRpYWwnID0gJ3NlcXVlbnRpYWwnO1xuXG4gIC8vIFF1YW50aWxlLCBRdWFudGl6ZSwgdGhyZXNob2xkXG4gIGV4cG9ydCBjb25zdCBRVUFOVElMRTogJ3F1YW50aWxlJyA9ICdxdWFudGlsZSc7XG4gIGV4cG9ydCBjb25zdCBRVUFOVElaRTogJ3F1YW50aXplJyA9ICdxdWFudGl6ZSc7XG4gIGV4cG9ydCBjb25zdCBUSFJFU0hPTEQ6ICd0aHJlc2hvbGQnID0gJ3RocmVzaG9sZCc7XG5cbiAgZXhwb3J0IGNvbnN0IE9SRElOQUw6ICdvcmRpbmFsJyA9ICdvcmRpbmFsJztcbiAgZXhwb3J0IGNvbnN0IEJJTl9PUkRJTkFMOiAnYmluLW9yZGluYWwnID0gJ2Jpbi1vcmRpbmFsJztcbiAgZXhwb3J0IGNvbnN0IFBPSU5UOiAncG9pbnQnID0gJ3BvaW50JztcbiAgZXhwb3J0IGNvbnN0IEJBTkQ6ICdiYW5kJyA9ICdiYW5kJztcbn1cblxuZXhwb3J0IHR5cGUgU2NhbGVUeXBlID0gdHlwZW9mIFNjYWxlVHlwZS5MSU5FQVIgfCB0eXBlb2YgU2NhbGVUeXBlLkJJTl9MSU5FQVIgfFxuICB0eXBlb2YgU2NhbGVUeXBlLkxPRyB8IHR5cGVvZiBTY2FsZVR5cGUuUE9XIHwgdHlwZW9mIFNjYWxlVHlwZS5TUVJUIHxcbiAgdHlwZW9mIFNjYWxlVHlwZS5USU1FIHwgdHlwZW9mIFNjYWxlVHlwZS5VVEMgfFxuICAvLyBUT0RPOiBhZGQgJ3F1YW50aXplJywgJ3F1YW50aWxlJywgJ3RocmVzaG9sZCcgYmFjayB3aGVuIHdlIHJlYWxseSBzdXBwb3J0IHRoZW1cbiAgdHlwZW9mIFNjYWxlVHlwZS5TRVFVRU5USUFMIHwgLy8gdHlwZW9mIFNjYWxlVHlwZS5RVUFOVElMRSB8IHR5cGVvZiBTY2FsZVR5cGUuUVVBTlRJWkUgfCB0eXBlb2YgU2NhbGVUeXBlLlRIUkVTSE9MRCB8XG4gIHR5cGVvZiBTY2FsZVR5cGUuT1JESU5BTCB8IHR5cGVvZiBTY2FsZVR5cGUuQklOX09SRElOQUwgfCB0eXBlb2YgU2NhbGVUeXBlLlBPSU5UIHwgdHlwZW9mIFNjYWxlVHlwZS5CQU5EO1xuXG5cbi8qKlxuICogSW5kZXggZm9yIHNjYWxlIGNhdGVnb3JpZXMgLS0gb25seSBzY2FsZSBvZiB0aGUgc2FtZSBjYXRlZ29yaWVzIGNhbiBiZSBtZXJnZWQgdG9nZXRoZXIuXG4gKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIHRyeWluZyB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIGF2b2lkIG1lcmdpbmcgc2NhbGUgdHlwZSB0aGF0IG1pZ2h0IG5vdCB3b3JrIHRvZ2V0aGVyXG4gKi9cbmNvbnN0IFNDQUxFX0NBVEVHT1JZX0lOREVYOiB7XG4gIC8vIFVzaW5nIE1hcHBlZCBUeXBlIHRvIGRlY2xhcmUgdHlwZSAoaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXMpXG4gIFtrIGluIFNjYWxlVHlwZV06IFNjYWxlVHlwZSB8ICdudW1lcmljJyB8ICdvcmRpbmFsLXBvc2l0aW9uJ1xufSA9IHtcbiAgbGluZWFyOiAnbnVtZXJpYycsXG4gIGxvZzogJ251bWVyaWMnLFxuICBwb3c6ICdudW1lcmljJyxcbiAgc3FydDogJ251bWVyaWMnLFxuICAnYmluLWxpbmVhcic6ICdiaW4tbGluZWFyJywgLy8gVE9ETzogc2hvdWxkIGJpbi1saW5lYXIgc3VwcG9ydCBtZXJnaW5nIHdpdGggb3RoZXJcbiAgdGltZTogJ3RpbWUnLFxuICB1dGM6ICd0aW1lJyxcbiAgc2VxdWVudGlhbDogJ3NlcXVlbnRpYWwnLFxuICBvcmRpbmFsOiAnb3JkaW5hbCcsXG4gICdiaW4tb3JkaW5hbCc6ICdiaW4tb3JkaW5hbCcsIC8vIFRPRE86IHNob3VsZCBiaW4tb3JkaW5hbCBzdXBwb3J0IG1lcmdpbmcgd2l0aCBvdGhlclxuICBwb2ludDogJ29yZGluYWwtcG9zaXRpb24nLFxuICBiYW5kOiAnb3JkaW5hbC1wb3NpdGlvbidcbn07XG5cbmV4cG9ydCBjb25zdCBTQ0FMRV9UWVBFUyA9IGtleXMoU0NBTEVfQ0FURUdPUllfSU5ERVgpIGFzIFNjYWxlVHlwZVtdO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIHR3byBnaXZlbiBzY2FsZSB0eXBlcyBjYW4gYmUgbWVyZ2VkIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVDb21wYXRpYmxlKHNjYWxlVHlwZTE6IFNjYWxlVHlwZSwgc2NhbGVUeXBlMjogU2NhbGVUeXBlKSB7XG4gIGNvbnN0IHNjYWxlQ2F0ZWdvcnkxID0gU0NBTEVfQ0FURUdPUllfSU5ERVhbc2NhbGVUeXBlMV07XG4gIGNvbnN0IHNjYWxlQ2F0ZWdvcnkyID0gU0NBTEVfQ0FURUdPUllfSU5ERVhbc2NhbGVUeXBlMl07XG4gIHJldHVybiBzY2FsZUNhdGVnb3J5MSA9PT0gc2NhbGVDYXRlZ29yeTIgfHxcbiAgICAoc2NhbGVDYXRlZ29yeTEgPT09ICdvcmRpbmFsLXBvc2l0aW9uJyAmJiBzY2FsZUNhdGVnb3J5MiA9PT0gJ3RpbWUnKSB8fFxuICAgIChzY2FsZUNhdGVnb3J5MiA9PT0gJ29yZGluYWwtcG9zaXRpb24nICYmIHNjYWxlQ2F0ZWdvcnkxID09PSAndGltZScpO1xufVxuXG4vKipcbiAqIEluZGV4IGZvciBzY2FsZSBwcmVjZWRlbmNlIC0tIGhpZ2ggc2NvcmUgPSBoaWdoZXIgcHJpb3JpdHkgZm9yIG1lcmdpbmcuXG4gKi9cbmNvbnN0IFNDQUxFX1BSRUNFREVOQ0VfSU5ERVg6IHtcbiAgLy8gVXNpbmcgTWFwcGVkIFR5cGUgdG8gZGVjbGFyZSB0eXBlIChodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlcylcbiAgW2sgaW4gU2NhbGVUeXBlXTogbnVtYmVyXG59ID0ge1xuICAvLyBudW1lcmljXG4gIGxpbmVhcjogMCxcbiAgbG9nOiAxLFxuICBwb3c6IDEsXG4gIHNxcnQ6IDEsXG4gIC8vIHRpbWVcbiAgdGltZTogMCxcbiAgdXRjOiAwLFxuICAvLyBvcmRpbmFsLXBvc2l0aW9uIC0tIHRoZXNlIGhhdmUgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBjb250aW51b3VzIHNjYWxlcyBhcyB0aGV5IHN1cHBvcnQgbW9yZSB0eXBlcyBvZiBkYXRhXG4gIHBvaW50OiAxMCxcbiAgYmFuZDogMTEsIC8vIGJhbmQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIGFzIGl0IGlzIGJldHRlciBmb3IgaW50ZXJhY3Rpb25cbiAgLy8gbm9uIGdyb3VwZWQgdHlwZXNcbiAgJ2Jpbi1saW5lYXInOiAwLFxuICBzZXF1ZW50aWFsOiAwLFxuICBvcmRpbmFsOiAwLFxuICAnYmluLW9yZGluYWwnOiAwLFxufTtcblxuLyoqXG4gKiBSZXR1cm4gc2NhbGUgY2F0ZWdvcmllcyAtLSBvbmx5IHNjYWxlIG9mIHRoZSBzYW1lIGNhdGVnb3JpZXMgY2FuIGJlIG1lcmdlZCB0b2dldGhlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZVByZWNlZGVuY2Uoc2NhbGVUeXBlOiBTY2FsZVR5cGUpOiBudW1iZXIge1xuICByZXR1cm4gU0NBTEVfUFJFQ0VERU5DRV9JTkRFWFtzY2FsZVR5cGVdO1xufVxuXG5leHBvcnQgY29uc3QgQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUzogU2NhbGVUeXBlW10gPSBbJ2xpbmVhcicsICdiaW4tbGluZWFyJywgJ2xvZycsICdwb3cnLCAnc3FydCcsICd0aW1lJywgJ3V0YyddO1xuY29uc3QgQ09OVElOVU9VU19UT19DT05USU5VT1VTX0lOREVYID0gdG9TZXQoQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUyk7XG5cbmV4cG9ydCBjb25zdCBDT05USU5VT1VTX0RPTUFJTl9TQ0FMRVM6IFNjYWxlVHlwZVtdID0gQ09OVElOVU9VU19UT19DT05USU5VT1VTX1NDQUxFUy5jb25jYXQoWydzZXF1ZW50aWFsJyAvKiBUT0RPIGFkZCAncXVhbnRpbGUnLCAncXVhbnRpemUnLCAndGhyZXNob2xkJyovXSk7XG5jb25zdCBDT05USU5VT1VTX0RPTUFJTl9JTkRFWCA9IHRvU2V0KENPTlRJTlVPVVNfRE9NQUlOX1NDQUxFUyk7XG5cbmV4cG9ydCBjb25zdCBESVNDUkVURV9ET01BSU5fU0NBTEVTOiBTY2FsZVR5cGVbXSA9IFsnb3JkaW5hbCcsICdiaW4tb3JkaW5hbCcsICdwb2ludCcsICdiYW5kJ107XG5jb25zdCBESVNDUkVURV9ET01BSU5fSU5ERVggPSB0b1NldChESVNDUkVURV9ET01BSU5fU0NBTEVTKTtcblxuY29uc3QgQklOX1NDQUxFU19JTkRFWCA9IHRvU2V0KFsnYmluLWxpbmVhcicsICdiaW4tb3JkaW5hbCddKTtcblxuZXhwb3J0IGNvbnN0IFRJTUVfU0NBTEVfVFlQRVM6IFNjYWxlVHlwZVtdID0gWyd0aW1lJywgJ3V0YyddO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzRGlzY3JldGVEb21haW4odHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnb3JkaW5hbCcgfCAnYmluLW9yZGluYWwnIHwgJ3BvaW50JyB8ICdiYW5kJyB7XG4gIHJldHVybiB0eXBlIGluIERJU0NSRVRFX0RPTUFJTl9JTkRFWDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQmluU2NhbGUodHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnYmluLWxpbmVhcicgfCAnYmluLW9yZGluYWwnIHtcbiAgcmV0dXJuIHR5cGUgaW4gQklOX1NDQUxFU19JTkRFWDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhhc0NvbnRpbnVvdXNEb21haW4odHlwZTogU2NhbGVUeXBlKTpcbiAgdHlwZSBpcyAnbGluZWFyJyB8ICdsb2cnIHwgJ3BvdycgfCAnc3FydCcgfCAndGltZScgfCAndXRjJ3xcbiAgICAgICAgICAnc2VxdWVudGlhbCcgLyogVE9ETyBhZGQgfCAncXVhbnRpbGUnIHwgJ3F1YW50aXplJyB8ICd0aHJlc2hvbGQnICovIHtcbiAgcmV0dXJuIHR5cGUgaW4gQ09OVElOVU9VU19ET01BSU5fSU5ERVg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXModHlwZTogU2NhbGVUeXBlKTogdHlwZSBpcyAnbGluZWFyJyB8ICdiaW4tbGluZWFyJyB8ICdsb2cnIHwgJ3BvdycgfCAnc3FydCcgfCAndGltZScgfCAndXRjJyB7XG4gIHJldHVybiB0eXBlIGluIENPTlRJTlVPVVNfVE9fQ09OVElOVU9VU19JTkRFWDtcbn1cblxuZXhwb3J0IHR5cGUgTmljZVRpbWUgPSAnc2Vjb25kJyB8ICdtaW51dGUnIHwgJ2hvdXInIHwgJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxlQ29uZmlnIHtcbiAgLyoqXG4gICAqIElmIHRydWUsIHJvdW5kcyBudW1lcmljIG91dHB1dCB2YWx1ZXMgdG8gaW50ZWdlcnMuXG4gICAqIFRoaXMgY2FuIGJlIGhlbHBmdWwgZm9yIHNuYXBwaW5nIHRvIHRoZSBwaXhlbCBncmlkLlxuICAgKiAoT25seSBhdmFpbGFibGUgZm9yIGB4YCwgYHlgLCBhbmQgYHNpemVgIHNjYWxlcy4pXG4gICAqL1xuICByb3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZGF0YSBkb21haW4gYXJlIGNsYW1wZWQgdG8gZWl0aGVyIHRoZSBtaW5pbXVtIG9yIG1heGltdW0gcmFuZ2UgdmFsdWVcbiAgICovXG4gIGNsYW1wPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqICBEZWZhdWx0IHJhbmdlIHN0ZXAgZm9yIGB4YCBiYW5kIGFuZCBwb2ludCBzY2FsZXMgb2YgdGV4dCBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA5MGBcbiAgICpcbiAgICogIEBtaW5pbXVtIDBcbiAgICovXG4gIHRleHRYUmFuZ2VTdGVwPzogbnVtYmVyOyAvLyBGSVhNRTogY29uc2lkZXIgaWYgd2Ugd2lsbCByZW5hbWUgdGhpcyBcInRhYmxlQ29sdW1uV2lkdGhcIlxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIHN0ZXAgZm9yIGJhbmQgYW5kIHBvaW50IHNjYWxlcyBvZiAoMSkgdGhlIGB5YCBjaGFubmVsXG4gICAqIGFuZCAoMikgdGhlIGB4YCBjaGFubmVsIHdoZW4gdGhlIG1hcmsgaXMgbm90IGB0ZXh0YC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAyMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgcmFuZ2VTdGVwPzogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogRGVmYXVsdCBpbm5lciBwYWRkaW5nIGZvciBgeGAgYW5kIGB5YCBiYW5kLW9yZGluYWwgc2NhbGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBiYW5kUGFkZGluZ0lubmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG91dGVyIHBhZGRpbmcgZm9yIGB4YCBhbmQgYHlgIGJhbmQtb3JkaW5hbCBzY2FsZXMuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGJ5IGRlZmF1bHQsIGJhbmQgc2NhbGUncyBwYWRkaW5nT3V0ZXIgaXMgcGFkZGluZ0lubmVyLzIuXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgYmFuZFBhZGRpbmdPdXRlcj86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBwYWRkaW5nIGZvciBjb250aW51b3VzIHNjYWxlcy5cbiAgICpcbiAgICogX19EZWZhdWx0Ol9fIGA1YCBmb3IgY29udGludW91cyB4LXNjYWxlIG9mIGEgdmVydGljYWwgYmFyIGFuZCBjb250aW51b3VzIHktc2NhbGUgb2YgYSBob3Jpem9udGFsIGJhci47IGAwYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGNvbnRpbnVvdXNQYWRkaW5nPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG91dGVyIHBhZGRpbmcgZm9yIGB4YCBhbmQgYHlgIHBvaW50LW9yZGluYWwgc2NhbGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuNWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBwb2ludFBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc291cmNlIGRhdGEgcmFuZ2UgYmVmb3JlIGFnZ3JlZ2F0aW9uIGFzIHNjYWxlIGRvbWFpbiBpbnN0ZWFkIG9mIGFnZ3JlZ2F0ZWQgZGF0YSBmb3IgYWdncmVnYXRlIGF4aXMuXG4gICAqXG4gICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGBkb21haW5gIHRvIGBcInVuYWdncmVnYXRlXCJgIGZvciBhZ2dyZWdhdGVkIF9xdWFudGl0YXRpdmVfIGZpZWxkcyBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgd29ya3Mgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zIHRoYXQgcHJvZHVjZSB2YWx1ZXMgd2l0aGluIHRoZSByYXcgZGF0YSBkb21haW4gKGBcIm1lYW5cImAsIGBcImF2ZXJhZ2VcImAsIGBcIm1lZGlhblwiYCwgYFwicTFcImAsIGBcInEzXCJgLCBgXCJtaW5cImAsIGBcIm1heFwiYCkuIEZvciBvdGhlciBhZ2dyZWdhdGlvbnMgdGhhdCBwcm9kdWNlIHZhbHVlcyBvdXRzaWRlIG9mIHRoZSByYXcgZGF0YSBkb21haW4gKGUuZy4gYFwiY291bnRcImAsIGBcInN1bVwiYCksIHRoaXMgcHJvcGVydHkgaXMgaWdub3JlZC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWBcbiAgICovXG4gIHVzZVVuYWdncmVnYXRlZERvbWFpbj86IGJvb2xlYW47XG5cbiAgLy8gbmljZSBzaG91bGQgZGVwZW5kcyBvbiB0eXBlIChxdWFudGl0YXRpdmUgb3IgdGVtcG9yYWwpLCBzb1xuICAvLyBsZXQncyBub3QgbWFrZSBhIGNvbmZpZy5cblxuICAvLyBDb25maWdzIGZvciBSYW5nZVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtYXggdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byBiYXIncyBzaXplL2JhbmRTaXplLlxuICAgKlxuICAgKiBJZiB1bmRlZmluZWQgKGRlZmF1bHQpLCB3ZSB3aWxsIHVzZSB0aGUgc2NhbGUncyBgcmFuZ2VTdGVwYCAtIDEuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1heEJhbmRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtaW4gdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byBiYXIgYW5kIHRpY2sncyBzaXplL2JhbmRTaXplIHNjYWxlIHdpdGggemVybz1mYWxzZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAyYFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtaW5CYW5kU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgbWF4IHZhbHVlIGZvciBtYXBwaW5nIHF1YW50aXRhdGl2ZSBmaWVsZHMgdG8gdGV4dCdzIHNpemUvZm9udFNpemUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgNDBgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1heEZvbnRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBtaW4gdmFsdWUgZm9yIG1hcHBpbmcgcXVhbnRpdGF0aXZlIGZpZWxkcyB0byB0aWNrJ3Mgc2l6ZS9mb250U2l6ZSBzY2FsZSB3aXRoIHplcm89ZmFsc2VcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA4YFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtaW5Gb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRGVmYXVsdCBtaW5pbXVtIG9wYWNpdHkgZm9yIG1hcHBpbmcgYSBmaWVsZCB0byBvcGFjaXR5LlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuM2BcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBtaW5PcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBvcGFjaXR5IGZvciBtYXBwaW5nIGEgZmllbGQgdG8gb3BhY2l0eS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAwLjhgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgbWF4T3BhY2l0eT86IG51bWJlcjtcblxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1pbmltdW0gdmFsdWUgZm9yIHBvaW50IHNpemUgc2NhbGUgd2l0aCB6ZXJvPWZhbHNlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDlgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1pblNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4IHZhbHVlIGZvciBwb2ludCBzaXplIHNjYWxlLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtYXhTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1pbmltdW0gc3Ryb2tlV2lkdGggZm9yIHRoZSBzY2FsZSBvZiBzdHJva2VXaWR0aCBmb3IgcnVsZSBhbmQgbGluZSBtYXJrcyBhbmQgb2Ygc2l6ZSBmb3IgdHJhaWwgbWFya3Mgd2l0aCB6ZXJvPWZhbHNlLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIG1pblN0cm9rZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heCBzdHJva2VXaWR0aCBmb3IgdGhlIHNjYWxlIG9mIHN0cm9rZVdpZHRoIGZvciBydWxlIGFuZCBsaW5lIG1hcmtzIGFuZCBvZiBzaXplIGZvciB0cmFpbCBtYXJrcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGA0YFxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBtYXhTdHJva2VXaWR0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRTY2FsZUNvbmZpZyA9IHtcbiAgdGV4dFhSYW5nZVN0ZXA6IDkwLFxuICByYW5nZVN0ZXA6IDIxLFxuICBwb2ludFBhZGRpbmc6IDAuNSxcbiAgYmFuZFBhZGRpbmdJbm5lcjogMC4xLFxuICBmYWNldFNwYWNpbmc6IDE2LFxuXG4gIG1pbkJhbmRTaXplOiAyLFxuXG4gIG1pbkZvbnRTaXplOiA4LFxuICBtYXhGb250U2l6ZTogNDAsXG5cbiAgbWluT3BhY2l0eTogMC4zLFxuICBtYXhPcGFjaXR5OiAwLjgsXG5cbiAgLy8gRklYTUU6IHJldmlzZSBpZiB0aGVzZSAqY2FuKiBiZWNvbWUgcmF0aW9zIG9mIHJhbmdlU3RlcFxuICBtaW5TaXplOiA5LCAvLyBQb2ludCBzaXplIGlzIGFyZWEuIEZvciBzcXVhcmUgcG9pbnQsIDkgPSAzIHBpeGVsIF4gMiwgbm90IHRvbyBzbWFsbCFcblxuICBtaW5TdHJva2VXaWR0aDogMSxcbiAgbWF4U3Ryb2tlV2lkdGg6IDRcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1lUGFyYW1zIHtcbiAgLyoqXG4gICAqIEEgY29sb3Igc2NoZW1lIG5hbWUgZm9yIHNlcXVlbnRpYWwvb3JkaW5hbCBzY2FsZXMgKGUuZy4sIGBcImNhdGVnb3J5MTBcImAgb3IgYFwidmlyaWRpc1wiYCkuXG4gICAqXG4gICAqIEZvciB0aGUgZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCBzY2hlbWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtWZWdhIFNjaGVtZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhL2RvY3Mvc2NoZW1lcy8jcmVmZXJlbmNlKSByZWZlcmVuY2UuXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZvciBzZXF1ZW50aWFsIGFuZCBkaXZlcmdpbmcgc2NoZW1lcyBvbmx5LCBkZXRlcm1pbmVzIHRoZSBleHRlbnQgb2YgdGhlIGNvbG9yIHJhbmdlIHRvIHVzZS4gRm9yIGV4YW1wbGUgYFswLjIsIDFdYCB3aWxsIHJlc2NhbGUgdGhlIGNvbG9yIHNjaGVtZSBzdWNoIHRoYXQgY29sb3IgdmFsdWVzIGluIHRoZSByYW5nZSBfWzAsIDAuMilfIGFyZSBleGNsdWRlZCBmcm9tIHRoZSBzY2hlbWUuXG4gICAqL1xuICBleHRlbnQ/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2xvcnMgdG8gdXNlIGluIHRoZSBzY2hlbWUuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc2NhbGUgdHlwZXMgc3VjaCBhcyBgXCJxdWFudGl6ZVwiYCwgd2hpY2ggdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNjYWxlIHJhbmdlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGRpc2NyZXRlIGJpbnMgZm9yIHRoZSBzY2FsZSBkb21haW4uXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICBjb3VudD86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0aW9uRG9tYWluID0ge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgYSBzZWxlY3Rpb24uXG4gICAqL1xuICBzZWxlY3Rpb246IHN0cmluZyxcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCBuYW1lIHRvIGV4dHJhY3Qgc2VsZWN0ZWQgdmFsdWVzIGZvciwgd2hlbiBhIHNlbGVjdGlvbiBpcyBbcHJvamVjdGVkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3Byb2plY3QuaHRtbClcbiAgICogb3ZlciBtdWx0aXBsZSBmaWVsZHMgb3IgZW5jb2RpbmdzLlxuICAgKi9cbiAgZmllbGQ/OiBzdHJpbmdcbn0gfCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhIHNlbGVjdGlvbi5cbiAgICovXG4gIHNlbGVjdGlvbjogc3RyaW5nLFxuICAvKipcbiAgICogVGhlIGVuY29kaW5nIGNoYW5uZWwgdG8gZXh0cmFjdCBzZWxlY3RlZCB2YWx1ZXMgZm9yLCB3aGVuIGEgc2VsZWN0aW9uIGlzIFtwcm9qZWN0ZWRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvcHJvamVjdC5odG1sKVxuICAgKiBvdmVyIG11bHRpcGxlIGZpZWxkcyBvciBlbmNvZGluZ3MuXG4gICAqL1xuICBlbmNvZGluZz86IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgRG9tYWluID0gbnVtYmVyW10gfCBzdHJpbmdbXSB8IGJvb2xlYW5bXSB8IERhdGVUaW1lW10gfCAndW5hZ2dyZWdhdGVkJyB8IFNlbGVjdGlvbkRvbWFpbjtcbmV4cG9ydCB0eXBlIFNjaGVtZSA9IHN0cmluZyB8IFNjaGVtZVBhcmFtcztcblxuZXhwb3J0IHR5cGUgUmFuZ2UgPSBudW1iZXJbXSB8IHN0cmluZ1tdIHwgc3RyaW5nO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNFeHRlbmRlZFNjaGVtZShzY2hlbWU6IHN0cmluZyB8IFNjaGVtZVBhcmFtcyk6IHNjaGVtZSBpcyBTY2hlbWVQYXJhbXMge1xuICByZXR1cm4gc2NoZW1lICYmICEhc2NoZW1lWyduYW1lJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGVjdGlvbkRvbWFpbihkb21haW46IERvbWFpbik6IGRvbWFpbiBpcyBTZWxlY3Rpb25Eb21haW4ge1xuICByZXR1cm4gZG9tYWluICYmIGRvbWFpblsnc2VsZWN0aW9uJ107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGUge1xuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2NhbGUuICBWZWdhLUxpdGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjYXRlZ29yaWVzIG9mIHNjYWxlIHR5cGVzOlxuICAgKlxuICAgKiAxKSBbKipDb250aW51b3VzIFNjYWxlcyoqXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjY29udGludW91cykgLS0gbWFwcGluZyBjb250aW51b3VzIGRvbWFpbnMgdG8gY29udGludW91cyBvdXRwdXQgcmFuZ2VzIChbYFwibGluZWFyXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjbGluZWFyKSwgW2BcInBvd1wiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3BvdyksIFtgXCJzcXJ0XCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjc3FydCksIFtgXCJsb2dcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNsb2cpLCBbYFwidGltZVwiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3RpbWUpLCBbYFwidXRjXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjdXRjKSwgW2BcInNlcXVlbnRpYWxcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzZXF1ZW50aWFsKSkuXG4gICAqXG4gICAqIDIpIFsqKkRpc2NyZXRlIFNjYWxlcyoqXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIC0tIG1hcHBpbmcgZGlzY3JldGUgZG9tYWlucyB0byBkaXNjcmV0ZSAoW2BcIm9yZGluYWxcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNvcmRpbmFsKSkgb3IgY29udGludW91cyAoW2BcImJhbmRcImBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBhbmQgW2BcInBvaW50XCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpKSBvdXRwdXQgcmFuZ2VzLlxuICAgKlxuICAgKiAzKSBbKipEaXNjcmV0aXppbmcgU2NhbGVzKipdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNjcmV0aXppbmcpIC0tIG1hcHBpbmcgY29udGludW91cyBkb21haW5zIHRvIGRpc2NyZXRlIG91dHB1dCByYW5nZXMgKFtgXCJiaW4tbGluZWFyXCJgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmluLWxpbmVhcikgYW5kIFtgXCJiaW4tb3JkaW5hbFwiYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2Jpbi1vcmRpbmFsKSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBwbGVhc2Ugc2VlIHRoZSBbc2NhbGUgdHlwZSB0YWJsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3R5cGUpLlxuICAgKi9cbiAgdHlwZT86IFNjYWxlVHlwZTtcblxuICAvKipcbiAgICogQ3VzdG9taXplZCBkb21haW4gdmFsdWVzLlxuICAgKlxuICAgKiBGb3IgX3F1YW50aXRhdGl2ZV8gZmllbGRzLCBgZG9tYWluYCBjYW4gdGFrZSB0aGUgZm9ybSBvZiBhIHR3by1lbGVtZW50IGFycmF5IHdpdGggbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMuICBbUGllY2V3aXNlIHNjYWxlc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3BpZWNld2lzZSkgY2FuIGJlIGNyZWF0ZWQgYnkgcHJvdmlkaW5nIGEgYGRvbWFpbmAgd2l0aCBtb3JlIHRoYW4gdHdvIGVudHJpZXMuXG4gICAqIElmIHRoZSBpbnB1dCBmaWVsZCBpcyBhZ2dyZWdhdGVkLCBgZG9tYWluYCBjYW4gYWxzbyBiZSBhIHN0cmluZyB2YWx1ZSBgXCJ1bmFnZ3JlZ2F0ZWRcImAsIGluZGljYXRpbmcgdGhhdCB0aGUgZG9tYWluIHNob3VsZCBpbmNsdWRlIHRoZSByYXcgZGF0YSB2YWx1ZXMgcHJpb3IgdG8gdGhlIGFnZ3JlZ2F0aW9uLlxuICAgKlxuICAgKiBGb3IgX3RlbXBvcmFsXyBmaWVsZHMsIGBkb21haW5gIGNhbiBiZSBhIHR3by1lbGVtZW50IGFycmF5IG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzLCBpbiB0aGUgZm9ybSBvZiBlaXRoZXIgdGltZXN0YW1wcyBvciB0aGUgW0RhdGVUaW1lIGRlZmluaXRpb24gb2JqZWN0c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy90eXBlcy5odG1sI2RhdGV0aW1lKS5cbiAgICpcbiAgICogRm9yIF9vcmRpbmFsXyBhbmQgX25vbWluYWxfIGZpZWxkcywgYGRvbWFpbmAgY2FuIGJlIGFuIGFycmF5IHRoYXQgbGlzdHMgdmFsaWQgaW5wdXQgdmFsdWVzLlxuICAgKlxuICAgKiBUaGUgYHNlbGVjdGlvbmAgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gW2ludGVyYWN0aXZlbHkgZGV0ZXJtaW5lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sI3NjYWxlLWRvbWFpbnMpIHRoZSBzY2FsZSBkb21haW4uXG4gICAqL1xuICBkb21haW4/OiBudW1iZXJbXSB8IHN0cmluZ1tdIHwgYm9vbGVhbltdIHwgRGF0ZVRpbWVbXSB8ICd1bmFnZ3JlZ2F0ZWQnIHwgU2VsZWN0aW9uRG9tYWluO1xuXG5cbiAgLy8gSGlkZSBiZWNhdXNlIHdlIG1pZ2h0IG5vdCByZWFsbHkgbmVlZCB0aGlzLlxuICAvKipcbiAgICogSWYgdHJ1ZSwgcmV2ZXJzZXMgdGhlIG9yZGVyIG9mIHRoZSBzY2FsZSByYW5nZS5cbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqXG4gICAqIEBoaWRlXG4gICAqL1xuICByZXZlcnNlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJhbmdlIG9mIHRoZSBzY2FsZS4gT25lIG9mOlxuICAgKlxuICAgKiAtIEEgc3RyaW5nIGluZGljYXRpbmcgYSBbcHJlLWRlZmluZWQgbmFtZWQgc2NhbGUgcmFuZ2VdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNyYW5nZS1jb25maWcpIChlLmcuLCBleGFtcGxlLCBgXCJzeW1ib2xcImAsIG9yIGBcImRpdmVyZ2luZ1wiYCkuXG4gICAqXG4gICAqIC0gRm9yIFtjb250aW51b3VzIHNjYWxlc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0d28tZWxlbWVudCBhcnJheSBpbmRpY2F0aW5nICBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgb3IgYW4gYXJyYXkgd2l0aCBtb3JlIHRoYW4gdHdvIGVudHJpZXMgZm9yIHNwZWNpZnlpbmcgYSBbcGllY2V3aXNlIHNjYWxlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcGllY2V3aXNlKS5cbiAgICpcbiAgICogLSBGb3IgW2Rpc2NyZXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIGFuZCBbZGlzY3JldGl6aW5nXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGl6aW5nKSBzY2FsZXMsIGFuIGFycmF5IG9mIGRlc2lyZWQgb3V0cHV0IHZhbHVlcy5cbiAgICpcbiAgICogX19Ob3RlczpfX1xuICAgKlxuICAgKiAxKSBGb3IgW3NlcXVlbnRpYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNzZXF1ZW50aWFsKSwgW29yZGluYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNvcmRpbmFsKSwgYW5kIGRpc2NyZXRpemluZyBjb2xvciBzY2FsZXMsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgY29sb3IgW2BzY2hlbWVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjc2NoZW1lKSBpbnN0ZWFkIG9mIGByYW5nZWAuXG4gICAqXG4gICAqIDIpIEFueSBkaXJlY3RseSBzcGVjaWZpZWQgYHJhbmdlYCBmb3IgYHhgIGFuZCBgeWAgY2hhbm5lbHMgd2lsbCBiZSBpZ25vcmVkLiBSYW5nZSBjYW4gYmUgY3VzdG9taXplZCB2aWEgdGhlIHZpZXcncyBjb3JyZXNwb25kaW5nIFtzaXplXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCkgKGB3aWR0aGAgYW5kIGBoZWlnaHRgKSBvciB2aWEgW3JhbmdlIHN0ZXBzIGFuZCBwYWRkaW5ncyBwcm9wZXJ0aWVzXSgjcmFuZ2Utc3RlcCkgZm9yIFtiYW5kXSgjYmFuZCkgYW5kIFtwb2ludF0oI3BvaW50KSBzY2FsZXMuXG4gICAqL1xuICByYW5nZT86IG51bWJlcltdIHwgc3RyaW5nW10gfCBzdHJpbmc7XG5cbiAgLy8gb3JkaW5hbFxuICAvKipcbiAgICogVGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0cyBvZiBhZGphY2VudCBiYW5kcyBvciBwb2ludHMgaW4gW2JhbmRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBhbmQgW3BvaW50XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpIHNjYWxlcy5cbiAgICpcbiAgICogSWYgYHJhbmdlU3RlcGAgaXMgYG51bGxgIG9yIGlmIHRoZSB2aWV3IGNvbnRhaW5zIHRoZSBzY2FsZSdzIGNvcnJlc3BvbmRpbmcgW3NpemVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sKSAoYHdpZHRoYCBmb3IgYHhgIHNjYWxlcyBhbmQgYGhlaWdodGAgZm9yIGB5YCBzY2FsZXMpLCBgcmFuZ2VTdGVwYCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCB0byBmaXQgdGhlIHNpemUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgZGVyaXZlZCB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNzY2FsZS1jb25maWcpJ3MgYHRleHRYUmFuZ2VTdGVwYCAoYDkwYCBieSBkZWZhdWx0KSBmb3IgeC1zY2FsZXMgb2YgYHRleHRgIG1hcmtzIGFuZCBgcmFuZ2VTdGVwYCAoYDIxYCBieSBkZWZhdWx0KSBmb3IgeC1zY2FsZXMgb2Ygb3RoZXIgbWFya3MgYW5kIHktc2NhbGVzLlxuICAgKlxuICAgKiBfX1dhcm5pbmdfXzogSWYgYHJhbmdlU3RlcGAgaXMgYG51bGxgIGFuZCB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHNjYWxlJ3MgZG9tYWluIGlzIGhpZ2hlciB0aGFuIGB3aWR0aGAgb3IgYGhlaWdodGAsIHRoZSByYW5nZVN0ZXAgbWlnaHQgYmVjb21lIGxlc3MgdGhhbiBvbmUgcGl4ZWwgYW5kIHRoZSBtYXJrIG1pZ2h0IG5vdCBhcHBlYXIgY29ycmVjdGx5LlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICByYW5nZVN0ZXA/OiBudW1iZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIGEgY29sb3IgW3NjaGVtZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3NjaGVtZSkgbmFtZSAoZS5nLiwgYFwiY2F0ZWdvcnkxMFwiYCBvciBgXCJ2aXJpZGlzXCJgKSBvciBhIFtzY2hlbWUgcGFyYW1ldGVyIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI3NjaGVtZS1wYXJhbXMpLlxuICAgKlxuICAgKiBEaXNjcmV0ZSBjb2xvciBzY2hlbWVzIG1heSBiZSB1c2VkIHdpdGggW2Rpc2NyZXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjZGlzY3JldGUpIG9yIFtkaXNjcmV0aXppbmddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNkaXNjcmV0aXppbmcpIHNjYWxlcy4gQ29udGludW91cyBjb2xvciBzY2hlbWVzIGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggW3NlcXVlbnRpYWxdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGVzLmh0bWwjc2VxdWVudGlhbCkgc2NhbGVzLlxuICAgKlxuICAgKiBGb3IgdGhlIGZ1bGwgbGlzdCBvZiBzdXBwb3J0ZWQgc2NoZW1lcywgcGxlYXNlIHJlZmVyIHRvIHRoZSBbVmVnYSBTY2hlbWVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL3NjaGVtZXMvI3JlZmVyZW5jZSkgcmVmZXJlbmNlLlxuICAgKi9cbiAgc2NoZW1lPzogc3RyaW5nIHwgU2NoZW1lUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHJvdW5kcyBudW1lcmljIG91dHB1dCB2YWx1ZXMgdG8gaW50ZWdlcnMuIFRoaXMgY2FuIGJlIGhlbHBmdWwgZm9yIHNuYXBwaW5nIHRvIHRoZSBwaXhlbCBncmlkLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYC5cbiAgICovXG4gIHJvdW5kPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9yIF9bY29udGludW91c10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpXyBzY2FsZXMsIGV4cGFuZHMgdGhlIHNjYWxlIGRvbWFpbiB0byBhY2NvbW1vZGF0ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwaXhlbHMgb24gZWFjaCBvZiB0aGUgc2NhbGUgcmFuZ2UuIFRoZSBzY2FsZSByYW5nZSBtdXN0IHJlcHJlc2VudCBwaXhlbHMgZm9yIHRoaXMgcGFyYW1ldGVyIHRvIGZ1bmN0aW9uIGFzIGludGVuZGVkLiBQYWRkaW5nIGFkanVzdG1lbnQgaXMgcGVyZm9ybWVkwqBwcmlvcsKgdG8gYWxsIG90aGVyIGFkanVzdG1lbnRzLCBpbmNsdWRpbmcgdGhlIGVmZmVjdHMgb2YgdGhlwqB6ZXJvLMKgbmljZSzCoGRvbWFpbk1pbiwgYW5kwqBkb21haW5NYXjCoHByb3BlcnRpZXMuXG4gICAqXG4gICAqIEZvciBfW2JhbmRdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKV8gc2NhbGVzLCBzaG9ydGN1dCBmb3Igc2V0dGluZyBgcGFkZGluZ0lubmVyYCBhbmQgYHBhZGRpbmdPdXRlcmAgdG8gdGhlIHNhbWUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBfW3BvaW50XShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjcG9pbnQpXyBzY2FsZXMsIGFsaWFzIGZvciBgcGFkZGluZ091dGVyYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIEZvciBfY29udGludW91c18gc2NhbGVzLCBkZXJpdmVkIGZyb20gdGhlIFtzY2FsZSBjb25maWddKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNjb25maWcpJ3MgYGNvbnRpbnVvdXNQYWRkaW5nYC5cbiAgICogRm9yIF9iYW5kIGFuZCBwb2ludF8gc2NhbGVzLCBzZWUgYHBhZGRpbmdJbm5lcmAgYW5kIGBwYWRkaW5nT3V0ZXJgLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5uZXIgcGFkZGluZyAoc3BhY2luZykgd2l0aGluIGVhY2ggYmFuZCBzdGVwIG9mIGJhbmQgc2NhbGVzLCBhcyBhIGZyYWN0aW9uIG9mIHRoZSBzdGVwIHNpemUuIFRoaXMgdmFsdWUgbXVzdCBsaWUgaW4gdGhlIHJhbmdlIFswLDFdLlxuICAgKlxuICAgKiBGb3IgcG9pbnQgc2NhbGUsIHRoaXMgcHJvcGVydHkgaXMgaW52YWxpZCBhcyBwb2ludCBzY2FsZXMgZG8gbm90IGhhdmUgaW50ZXJuYWwgYmFuZCB3aWR0aHMgKG9ubHkgc3RlcCBzaXplcyBiZXR3ZWVuIGJhbmRzKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykncyBgYmFuZFBhZGRpbmdJbm5lcmAuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgcGFkZGluZ0lubmVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3V0ZXIgcGFkZGluZyAoc3BhY2luZykgYXQgdGhlIGVuZHMgb2YgdGhlIHJhbmdlIG9mIGJhbmQgYW5kIHBvaW50IHNjYWxlcyxcbiAgICogYXMgYSBmcmFjdGlvbiBvZiB0aGUgc3RlcCBzaXplLiBUaGlzIHZhbHVlIG11c3QgbGllIGluIHRoZSByYW5nZSBbMCwxXS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykncyBgYmFuZFBhZGRpbmdPdXRlcmAgZm9yIGJhbmQgc2NhbGVzIGFuZCBgcG9pbnRQYWRkaW5nYCBmb3IgcG9pbnQgc2NhbGVzLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDFcbiAgICovXG4gIHBhZGRpbmdPdXRlcj86IG51bWJlcjtcblxuICAvLyB0eXBpY2FsXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZGF0YSBkb21haW4gYXJlIGNsYW1wZWQgdG8gZWl0aGVyIHRoZSBtaW5pbXVtIG9yIG1heGltdW0gcmFuZ2UgdmFsdWVcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGRlcml2ZWQgZnJvbSB0aGUgW3NjYWxlIGNvbmZpZ10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9jb25maWcuaHRtbCNzY2FsZS1jb25maWcpJ3MgYGNsYW1wYCAoYHRydWVgIGJ5IGRlZmF1bHQpLlxuICAgKi9cbiAgY2xhbXA/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHRlbmRpbmcgdGhlIGRvbWFpbiBzbyB0aGF0IGl0IHN0YXJ0cyBhbmQgZW5kcyBvbiBuaWNlIHJvdW5kIHZhbHVlcy4gVGhpcyBtZXRob2QgdHlwaWNhbGx5IG1vZGlmaWVzIHRoZSBzY2FsZeKAmXMgZG9tYWluLCBhbmQgbWF5IG9ubHkgZXh0ZW5kIHRoZSBib3VuZHMgdG8gdGhlIG5lYXJlc3Qgcm91bmQgdmFsdWUuIE5pY2luZyBpcyB1c2VmdWwgaWYgdGhlIGRvbWFpbiBpcyBjb21wdXRlZCBmcm9tIGRhdGEgYW5kIG1heSBiZSBpcnJlZ3VsYXIuIEZvciBleGFtcGxlLCBmb3IgYSBkb21haW4gb2YgX1swLjIwMTQ3OeKApiwgMC45OTY2NznigKZdXywgYSBuaWNlIGRvbWFpbiBtaWdodCBiZSBfWzAuMiwgMS4wXV8uXG4gICAqXG4gICAqIEZvciBxdWFudGl0YXRpdmUgc2NhbGVzIHN1Y2ggYXMgbGluZWFyLCBgbmljZWAgY2FuIGJlIGVpdGhlciBhIGJvb2xlYW4gZmxhZyBvciBhIG51bWJlci4gSWYgYG5pY2VgIGlzIGEgbnVtYmVyLCBpdCB3aWxsIHJlcHJlc2VudCBhIGRlc2lyZWQgdGljayBjb3VudC4gVGhpcyBhbGxvd3MgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIHN0ZXAgc2l6ZSB1c2VkIHRvIGV4dGVuZCB0aGUgYm91bmRzLCBndWFyYW50ZWVpbmcgdGhhdCB0aGUgcmV0dXJuZWQgdGlja3Mgd2lsbCBleGFjdGx5IGNvdmVyIHRoZSBkb21haW4uXG4gICAqXG4gICAqIEZvciB0ZW1wb3JhbCBmaWVsZHMgd2l0aCB0aW1lIGFuZCB1dGMgc2NhbGVzLCB0aGUgYG5pY2VgIHZhbHVlIGNhbiBiZSBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBkZXNpcmVkIHRpbWUgaW50ZXJ2YWwuIExlZ2FsIHZhbHVlcyBhcmUgYFwibWlsbGlzZWNvbmRcImAsIGBcInNlY29uZFwiYCwgYFwibWludXRlXCJgLCBgXCJob3VyXCJgLCBgXCJkYXlcImAsIGBcIndlZWtcImAsIGBcIm1vbnRoXCJgLCBhbmQgYFwieWVhclwiYC4gQWx0ZXJuYXRpdmVseSwgYHRpbWVgIGFuZCBgdXRjYCBzY2FsZXMgY2FuIGFjY2VwdCBhbiBvYmplY3QtdmFsdWVkIGludGVydmFsIHNwZWNpZmllciBvZiB0aGUgZm9ybSBge1wiaW50ZXJ2YWxcIjogXCJtb250aFwiLCBcInN0ZXBcIjogM31gLCB3aGljaCBpbmNsdWRlcyBhIGRlc2lyZWQgbnVtYmVyIG9mIGludGVydmFsIHN0ZXBzLiBIZXJlLCB0aGUgZG9tYWluIHdvdWxkIHNuYXAgdG8gcXVhcnRlciAoSmFuLCBBcHIsIEp1bCwgT2N0KSBib3VuZGFyaWVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgIGZvciB1bmJpbm5lZCBfcXVhbnRpdGF0aXZlXyBmaWVsZHM7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKlxuICAgKi9cbiAgbmljZT86IGJvb2xlYW4gfCBudW1iZXIgfCBOaWNlVGltZSB8IHtpbnRlcnZhbDogc3RyaW5nLCBzdGVwOiBudW1iZXJ9O1xuXG4gIC8qKlxuICAgKiBUaGUgbG9nYXJpdGhtIGJhc2Ugb2YgdGhlIGBsb2dgIHNjYWxlIChkZWZhdWx0IGAxMGApLlxuICAgKi9cbiAgYmFzZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGV4cG9uZW50IG9mIHRoZSBgcG93YCBzY2FsZS5cbiAgICovXG4gIGV4cG9uZW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGVuc3VyZXMgdGhhdCBhIHplcm8gYmFzZWxpbmUgdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIHNjYWxlIGRvbWFpbi5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCBmb3IgeCBhbmQgeSBjaGFubmVscyBpZiB0aGUgcXVhbnRpdGF0aXZlIGZpZWxkIGlzIG5vdCBiaW5uZWQgYW5kIG5vIGN1c3RvbSBgZG9tYWluYCBpcyBwcm92aWRlZDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBMb2csIHRpbWUsIGFuZCB1dGMgc2NhbGVzIGRvIG5vdCBzdXBwb3J0IGB6ZXJvYC5cbiAgICovXG4gIHplcm8/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW50ZXJwb2xhdGlvbiBtZXRob2QgZm9yIHJhbmdlIHZhbHVlcy4gQnkgZGVmYXVsdCwgYSBnZW5lcmFsIGludGVycG9sYXRvciBmb3IgbnVtYmVycywgZGF0ZXMsIHN0cmluZ3MgYW5kIGNvbG9ycyAoaW4gUkdCIHNwYWNlKSBpcyB1c2VkLiBGb3IgY29sb3IgcmFuZ2VzLCB0aGlzIHByb3BlcnR5IGFsbG93cyBpbnRlcnBvbGF0aW9uIGluIGFsdGVybmF0aXZlIGNvbG9yIHNwYWNlcy4gTGVnYWwgdmFsdWVzIGluY2x1ZGUgYHJnYmAsIGBoc2xgLCBgaHNsLWxvbmdgLCBgbGFiYCwgYGhjbGAsIGBoY2wtbG9uZ2AsIGBjdWJlaGVsaXhgIGFuZCBgY3ViZWhlbGl4LWxvbmdgICgnLWxvbmcnIHZhcmlhbnRzIHVzZSBsb25nZXIgcGF0aHMgaW4gcG9sYXIgY29vcmRpbmF0ZSBzcGFjZXMpLiBJZiBvYmplY3QtdmFsdWVkLCB0aGlzIHByb3BlcnR5IGFjY2VwdHMgYW4gb2JqZWN0IHdpdGggYSBzdHJpbmctdmFsdWVkIF90eXBlXyBwcm9wZXJ0eSBhbmQgYW4gb3B0aW9uYWwgbnVtZXJpYyBfZ2FtbWFfIHByb3BlcnR5IGFwcGxpY2FibGUgdG8gcmdiIGFuZCBjdWJlaGVsaXggaW50ZXJwb2xhdG9ycy4gRm9yIG1vcmUsIHNlZSB0aGUgW2QzLWludGVycG9sYXRlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1pbnRlcnBvbGF0ZSkuXG4gICAqXG4gICAqIF9fTm90ZTpfXyBTZXF1ZW50aWFsIHNjYWxlcyBkbyBub3Qgc3VwcG9ydCBgaW50ZXJwb2xhdGVgIGFzIHRoZXkgaGF2ZSBhIGZpeGVkIGludGVycG9sYXRvci4gIFNpbmNlIFZlZ2EtTGl0ZSB1c2VzIHNlcXVlbnRpYWwgc2NhbGVzIGZvciBxdWFudGl0YXRpdmUgZmllbGRzIGJ5IGRlZmF1bHQsIHlvdSBoYXZlIHRvIHNldCB0aGUgc2NhbGUgYHR5cGVgIHRvIG90aGVyIHF1YW50aXRhdGl2ZSBzY2FsZSB0eXBlIHN1Y2ggYXMgYFwibGluZWFyXCJgIHRvIGN1c3RvbWl6ZSBgaW50ZXJwb2xhdGVgLlxuICAgKi9cbiAgaW50ZXJwb2xhdGU/OiBTY2FsZUludGVycG9sYXRlIHwgU2NhbGVJbnRlcnBvbGF0ZVBhcmFtcztcbn1cblxuY29uc3QgU0NBTEVfUFJPUEVSVFlfSU5ERVg6IEZsYWc8a2V5b2YgU2NhbGU+ID0ge1xuICB0eXBlOiAxLFxuICBkb21haW46IDEsXG4gIHJhbmdlOiAxLFxuICByYW5nZVN0ZXA6IDEsXG4gIHNjaGVtZTogMSxcbiAgLy8gT3RoZXIgcHJvcGVydGllc1xuICByZXZlcnNlOiAxLFxuICByb3VuZDogMSxcbiAgLy8gcXVhbnRpdGF0aXZlIC8gdGltZVxuICBjbGFtcDogMSxcbiAgbmljZTogMSxcbiAgLy8gcXVhbnRpdGF0aXZlXG4gIGJhc2U6IDEsXG4gIGV4cG9uZW50OiAxLFxuICBpbnRlcnBvbGF0ZTogMSxcbiAgemVybzogMSwgLy8gemVybyBkZXBlbmRzIG9uIGRvbWFpblxuICAvLyBiYW5kL3BvaW50XG4gIHBhZGRpbmc6IDEsXG4gIHBhZGRpbmdJbm5lcjogMSxcbiAgcGFkZGluZ091dGVyOiAxXG59O1xuXG5leHBvcnQgY29uc3QgU0NBTEVfUFJPUEVSVElFUyA9IGZsYWdLZXlzKFNDQUxFX1BST1BFUlRZX0lOREVYKTtcblxuY29uc3Qge3R5cGUsIGRvbWFpbiwgcmFuZ2UsIHJhbmdlU3RlcCwgc2NoZW1lLCAuLi5OT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUWV9JTkRFWH0gPSBTQ0FMRV9QUk9QRVJUWV9JTkRFWDtcblxuZXhwb3J0IGNvbnN0IE5PTl9UWVBFX0RPTUFJTl9SQU5HRV9WRUdBX1NDQUxFX1BST1BFUlRJRVMgPSBmbGFnS2V5cyhOT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUWV9JTkRFWCk7XG5cbmV4cG9ydCBjb25zdCBTQ0FMRV9UWVBFX0lOREVYID0gZ2VuZXJhdGVTY2FsZVR5cGVJbmRleCgpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5KHNjYWxlVHlwZTogU2NhbGVUeXBlLCBwcm9wTmFtZToga2V5b2YgU2NhbGUpIHtcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ3R5cGUnOlxuICAgIGNhc2UgJ2RvbWFpbic6XG4gICAgY2FzZSAncmV2ZXJzZSc6XG4gICAgY2FzZSAncmFuZ2UnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnc2NoZW1lJzpcbiAgICAgIHJldHVybiBjb250YWlucyhbJ3NlcXVlbnRpYWwnLCAnb3JkaW5hbCcsICdiaW4tb3JkaW5hbCcsICdxdWFudGlsZScsICdxdWFudGl6ZSddLCBzY2FsZVR5cGUpO1xuICAgIGNhc2UgJ2ludGVycG9sYXRlJzpcbiAgICAgIC8vIEZJWE1FKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjkwMikgaG93IGFib3V0IG9yZGluYWw/XG4gICAgICByZXR1cm4gY29udGFpbnMoWydsaW5lYXInLCAnYmluLWxpbmVhcicsICdwb3cnLCAnbG9nJywgJ3NxcnQnLCAndXRjJywgJ3RpbWUnXSwgc2NhbGVUeXBlKTtcbiAgICBjYXNlICdyb3VuZCc6XG4gICAgICByZXR1cm4gaXNDb250aW51b3VzVG9Db250aW51b3VzKHNjYWxlVHlwZSkgfHwgc2NhbGVUeXBlID09PSAnYmFuZCcgfHwgc2NhbGVUeXBlID09PSAncG9pbnQnO1xuICAgIGNhc2UgJ3BhZGRpbmcnOlxuICAgICAgcmV0dXJuIGlzQ29udGludW91c1RvQ29udGludW91cyhzY2FsZVR5cGUpIHx8IGNvbnRhaW5zKFsncG9pbnQnLCAnYmFuZCddLCBzY2FsZVR5cGUpO1xuICAgIGNhc2UgJ3BhZGRpbmdPdXRlcic6XG4gICAgY2FzZSAncmFuZ2VTdGVwJzpcbiAgICAgIHJldHVybiBjb250YWlucyhbJ3BvaW50JywgJ2JhbmQnXSwgc2NhbGVUeXBlKTtcbiAgICBjYXNlICdwYWRkaW5nSW5uZXInOlxuICAgICAgcmV0dXJuIHNjYWxlVHlwZSA9PT0gJ2JhbmQnO1xuICAgIGNhc2UgJ2NsYW1wJzpcbiAgICAgIHJldHVybiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXMoc2NhbGVUeXBlKSB8fCBzY2FsZVR5cGUgPT09ICdzZXF1ZW50aWFsJztcbiAgICBjYXNlICduaWNlJzpcbiAgICAgIHJldHVybiBpc0NvbnRpbnVvdXNUb0NvbnRpbnVvdXMoc2NhbGVUeXBlKSB8fCBzY2FsZVR5cGUgPT09ICdzZXF1ZW50aWFsJyB8fCBzY2FsZVR5cGUgYXMgYW55ID09PSAncXVhbnRpemUnO1xuICAgIGNhc2UgJ2V4cG9uZW50JzpcbiAgICAgIHJldHVybiBzY2FsZVR5cGUgPT09ICdwb3cnO1xuICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgcmV0dXJuIHNjYWxlVHlwZSA9PT0gJ2xvZyc7XG4gICAgY2FzZSAnemVybyc6XG4gICAgICByZXR1cm4gaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpICYmICFjb250YWlucyhbXG4gICAgICAgICdsb2cnLCAgLy8gbG9nIHNjYWxlIGNhbm5vdCBoYXZlIHplcm8gdmFsdWVcbiAgICAgICAgJ3RpbWUnLCAndXRjJywgLy8gemVybyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGltZVxuICAgICAgICAnYmluLWxpbmVhcicsIC8vIGJpbm5pbmcgc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IGFkZCB6ZXJvXG4gICAgICAgICd0aHJlc2hvbGQnLCAvLyB0aHJlc2hvbGQgcmVxdWlyZXMgY3VzdG9tIGRvbWFpbiBzbyB6ZXJvIGRvZXMgbm90IG1hdHRlclxuICAgICAgICAncXVhbnRpbGUnIC8vIHF1YW50aWxlIGRlcGVuZHMgb24gZGlzdHJpYnV0aW9uIHNvIHplcm8gZG9lcyBub3QgbWF0dGVyXG4gICAgICBdLCBzY2FsZVR5cGUpO1xuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSovXG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzY2FsZSBwcm9wZXJ0eSAke3Byb3BOYW1lfS5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgaW5wdXQgY2hhbm5lbCBzdXBwb3J0cyB0aGUgaW5wdXQgc2NhbGUgcHJvcGVydHkgbmFtZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHkoY2hhbm5lbDogQ2hhbm5lbCwgcHJvcE5hbWU6IGtleW9mIFNjYWxlKTogc3RyaW5nIHtcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ2ludGVycG9sYXRlJzpcbiAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgaWYgKCFpc0NvbG9yQ2hhbm5lbChjaGFubmVsKSkge1xuICAgICAgICByZXR1cm4gbG9nLm1lc3NhZ2UuY2Fubm90VXNlU2NhbGVQcm9wZXJ0eVdpdGhOb25Db2xvcihjaGFubmVsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgY2FzZSAnZG9tYWluJzpcbiAgICBjYXNlICdyYW5nZSc6XG4gICAgY2FzZSAnYmFzZSc6XG4gICAgY2FzZSAnZXhwb25lbnQnOlxuICAgIGNhc2UgJ25pY2UnOlxuICAgIGNhc2UgJ3BhZGRpbmcnOlxuICAgIGNhc2UgJ3BhZGRpbmdJbm5lcic6XG4gICAgY2FzZSAncGFkZGluZ091dGVyJzpcbiAgICBjYXNlICdyYW5nZVN0ZXAnOlxuICAgIGNhc2UgJ3JldmVyc2UnOlxuICAgIGNhc2UgJ3JvdW5kJzpcbiAgICBjYXNlICdjbGFtcCc6XG4gICAgY2FzZSAnemVybyc6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBHT09EIVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpdCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSAqL1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2NhbGUgcHJvcGVydHkgXCIke3Byb3BOYW1lfVwiLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2NhbGVUeXBlU3VwcG9ydERhdGFUeXBlKHNwZWNpZmllZFR5cGU6IFNjYWxlVHlwZSwgZmllbGREZWZUeXBlOiBUeXBlLCBiaW46IGJvb2xlYW58QmluUGFyYW1zKTpib29sZWFuIHtcbiAgaWYgKGNvbnRhaW5zKFtUeXBlLk9SRElOQUwsIFR5cGUuTk9NSU5BTF0sIGZpZWxkRGVmVHlwZSkpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVkVHlwZSA9PT0gdW5kZWZpbmVkIHx8IGhhc0Rpc2NyZXRlRG9tYWluKHNwZWNpZmllZFR5cGUpO1xuICB9IGVsc2UgaWYgKGZpZWxkRGVmVHlwZSA9PT0gVHlwZS5URU1QT1JBTCkge1xuICAgIHJldHVybiBjb250YWlucyhbU2NhbGVUeXBlLlRJTUUsIFNjYWxlVHlwZS5VVEMsIFNjYWxlVHlwZS5TRVFVRU5USUFMLCB1bmRlZmluZWRdLCBzcGVjaWZpZWRUeXBlKTtcbiAgfSBlbHNlIGlmIChmaWVsZERlZlR5cGUgPT09IFR5cGUuUVVBTlRJVEFUSVZFKSB7XG4gICAgaWYgKGJpbikge1xuICAgICAgcmV0dXJuIGNvbnRhaW5zKFtTY2FsZVR5cGUuQklOX0xJTkVBUiwgU2NhbGVUeXBlLkJJTl9PUkRJTkFMLCBTY2FsZVR5cGUuTElORUFSXSwgc3BlY2lmaWVkVHlwZSk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWlucyhbU2NhbGVUeXBlLkxPRywgU2NhbGVUeXBlLlBPVywgU2NhbGVUeXBlLlNRUlQsIFNjYWxlVHlwZS5RVUFOVElMRSwgU2NhbGVUeXBlLlFVQU5USVpFLCBTY2FsZVR5cGUuTElORUFSLCBTY2FsZVR5cGUuU0VRVUVOVElBTCwgdW5kZWZpbmVkXSwgc3BlY2lmaWVkVHlwZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWw6IENoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlKTogYm9vbGVhbiB7XG4gIHN3aXRjaCAoY2hhbm5lbCkge1xuICAgIGNhc2UgQ2hhbm5lbC5YOlxuICAgIGNhc2UgQ2hhbm5lbC5ZOlxuICAgIGNhc2UgQ2hhbm5lbC5TSVpFOiAvLyBUT0RPOiBzaXplIGFuZCBvcGFjaXR5IGNhbiBzdXBwb3J0IG9yZGluYWwgd2l0aCBtb3JlIG1vZGlmaWNhdGlvblxuICAgIGNhc2UgQ2hhbm5lbC5PUEFDSVRZOlxuICAgICAgLy8gQWx0aG91Z2ggaXQgZ2VuZXJhbGx5IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byB1c2UgYmFuZCB3aXRoIHNpemUgYW5kIG9wYWNpdHksXG4gICAgICAvLyBpdCBjYW4gYWxzbyB3b3JrIHNpbmNlIHdlIHVzZSBiYW5kOiAwLjUgdG8gZ2V0IG1pZHBvaW50LlxuICAgICAgcmV0dXJuIGlzQ29udGludW91c1RvQ29udGludW91cyhzY2FsZVR5cGUpIHx8IGNvbnRhaW5zKFsnYmFuZCcsICdwb2ludCddLCBzY2FsZVR5cGUpO1xuXG4gICAgY2FzZSBDaGFubmVsLkNPTE9SOlxuICAgIGNhc2UgQ2hhbm5lbC5GSUxMOlxuICAgIGNhc2UgQ2hhbm5lbC5TVFJPS0U6XG4gICAgICByZXR1cm4gc2NhbGVUeXBlICE9PSAnYmFuZCc7ICAgIC8vIGJhbmQgZG9lcyBub3QgbWFrZSBzZW5zZSB3aXRoIGNvbG9yXG5cbiAgICBjYXNlIENoYW5uZWwuU0hBUEU6XG4gICAgICByZXR1cm4gc2NhbGVUeXBlID09PSAnb3JkaW5hbCc7IC8vIHNoYXBlID0gbG9va3VwIG9ubHlcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogaXQgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkU2NhbGVUeXBlKGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmVHlwZTogVHlwZSwgYmluPzogYm9vbGVhbikge1xuICByZXR1cm4gU0NBTEVfVFlQRV9JTkRFWFtnZW5lcmF0ZVNjYWxlVHlwZUluZGV4S2V5KGNoYW5uZWwsIGZpZWxkRGVmVHlwZSwgYmluKV07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhbGVUeXBlSW5kZXgge1xuICBbY2hhbm5lbDogc3RyaW5nXTogU2NhbGVUeXBlW107XG59XG5cbi8vIGdlbmVyYXRlcyBTY2FsZVR5cGVJbmRleCB3aGVyZSBrZXlzIGFyZSBlbmNvZGluZyBjaGFubmVscyBhbmQgdmFsdWVzIGFyZSBsaXN0IG9mIHZhbGlkIFNjYWxlVHlwZXNcbmZ1bmN0aW9uIGdlbmVyYXRlU2NhbGVUeXBlSW5kZXgoKSB7XG4gIGNvbnN0IGluZGV4OiBTY2FsZVR5cGVJbmRleCA9IHt9O1xuICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgQ0hBTk5FTFMpIHtcbiAgICBmb3IgKGNvbnN0IGZpZWxkRGVmVHlwZSBvZiBrZXlzKFRZUEVfSU5ERVgpKSB7XG4gICAgICBmb3IgKGNvbnN0IHNjYWxlVHlwZSBvZiBTQ0FMRV9UWVBFUykge1xuICAgICAgICBmb3IgKGNvbnN0IGJpbiBvZiBbZmFsc2UsIHRydWVdKSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gZ2VuZXJhdGVTY2FsZVR5cGVJbmRleEtleShjaGFubmVsLCBmaWVsZERlZlR5cGUsIGJpbik7XG4gICAgICAgICAgaWYgKGNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNjYWxlVHlwZSkgJiYgc2NhbGVUeXBlU3VwcG9ydERhdGFUeXBlKHNjYWxlVHlwZSwgZmllbGREZWZUeXBlLCBiaW4pKSB7XG4gICAgICAgICAgICBpbmRleFtrZXldID0gaW5kZXhba2V5XSB8fCBbXTtcbiAgICAgICAgICAgIGluZGV4W2tleV0ucHVzaChzY2FsZVR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlU2NhbGVUeXBlSW5kZXhLZXkoY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWZUeXBlOiBUeXBlLCBiaW46IGJvb2xlYW4pIHtcbiAgY29uc3Qga2V5ID0gY2hhbm5lbCArICdfJyArIGZpZWxkRGVmVHlwZTtcbiAgcmV0dXJuIGJpbiA/IGtleSArICdfYmluJyA6IGtleTtcbn1cbiJdfQ==","export var SELECTION_ID = '_vgsid_';\nexport var defaultConfig = {\n single: {\n on: 'click',\n fields: [SELECTION_ID],\n resolve: 'global',\n empty: 'all'\n },\n multi: {\n on: 'click',\n fields: [SELECTION_ID],\n toggle: 'event.shiftKey',\n resolve: 'global',\n empty: 'all'\n },\n interval: {\n on: '[mousedown, window:mouseup] > window:mousemove!',\n encodings: ['x', 'y'],\n translate: '[mousedown, window:mouseup] > window:mousemove!',\n zoom: 'wheel!',\n mark: { fill: '#333', fillOpacity: 0.125, stroke: 'white' },\n resolve: 'global'\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLENBQUMsSUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDO0FBMk10QyxNQUFNLENBQUMsSUFBTSxhQUFhLEdBQW1CO0lBQzNDLE1BQU0sRUFBRTtRQUNOLEVBQUUsRUFBRSxPQUFPO1FBQ1gsTUFBTSxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3RCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLEtBQUssRUFBRSxLQUFLO0tBQ2I7SUFDRCxLQUFLLEVBQUU7UUFDTCxFQUFFLEVBQUUsT0FBTztRQUNYLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQztRQUN0QixNQUFNLEVBQUUsZ0JBQWdCO1FBQ3hCLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLEtBQUssRUFBRSxLQUFLO0tBQ2I7SUFDRCxRQUFRLEVBQUU7UUFDUixFQUFFLEVBQUUsaURBQWlEO1FBQ3JELFNBQVMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7UUFDckIsU0FBUyxFQUFFLGlEQUFpRDtRQUM1RCxJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDO1FBQ3pELE9BQU8sRUFBRSxRQUFRO0tBQ2xCO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2luZ2xlRGVmQ2hhbm5lbH0gZnJvbSAnLi9jaGFubmVsJztcbmltcG9ydCB7VmdCaW5kaW5nLCBWZ0V2ZW50U3RyZWFtfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IGNvbnN0IFNFTEVDVElPTl9JRCA9ICdfdmdzaWRfJztcbmV4cG9ydCB0eXBlIFNlbGVjdGlvblR5cGUgPSAnc2luZ2xlJyB8ICdtdWx0aScgfCAnaW50ZXJ2YWwnO1xuZXhwb3J0IHR5cGUgU2VsZWN0aW9uUmVzb2x1dGlvbiA9ICdnbG9iYWwnIHwgJ3VuaW9uJyB8ICdpbnRlcnNlY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VTZWxlY3Rpb25EZWYge1xuICAvKipcbiAgICogQSBbVmVnYSBldmVudCBzdHJlYW1dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS9kb2NzL2V2ZW50LXN0cmVhbXMvKSAob2JqZWN0IG9yIHNlbGVjdG9yKSB0aGF0IHRyaWdnZXJzIHRoZSBzZWxlY3Rpb24uXG4gICAqIEZvciBpbnRlcnZhbCBzZWxlY3Rpb25zLCB0aGUgZXZlbnQgc3RyZWFtIG11c3Qgc3BlY2lmeSBhIFtzdGFydCBhbmQgZW5kXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EvZG9jcy9ldmVudC1zdHJlYW1zLyNiZXR3ZWVuLWZpbHRlcnMpLlxuICAgKi9cbiAgb24/OiBWZ0V2ZW50U3RyZWFtO1xuICAvKipcbiAgICogV2l0aCBsYXllcmVkIGFuZCBtdWx0aS12aWV3IGRpc3BsYXlzLCBhIHN0cmF0ZWd5IHRoYXQgZGV0ZXJtaW5lcyBob3dcbiAgICogc2VsZWN0aW9ucycgZGF0YSBxdWVyaWVzIGFyZSByZXNvbHZlZCB3aGVuIGFwcGxpZWQgaW4gYSBmaWx0ZXIgdHJhbnNmb3JtLFxuICAgKiBjb25kaXRpb25hbCBlbmNvZGluZyBydWxlLCBvciBzY2FsZSBkb21haW4uXG4gICAqXG4gICAqL1xuICByZXNvbHZlPzogU2VsZWN0aW9uUmVzb2x1dGlvbjtcblxuICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjU5NikuXG4gIC8vIHByZWRpY2F0ZT86IHN0cmluZztcbiAgLy8gZG9tYWluPzogU2VsZWN0aW9uRG9tYWluO1xuXG4gIC8vIFRyYW5zZm9ybXNcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgZW5jb2RpbmcgY2hhbm5lbHMuIFRoZSBjb3JyZXNwb25kaW5nIGRhdGEgZmllbGQgdmFsdWVzXG4gICAqIG11c3QgbWF0Y2ggZm9yIGEgZGF0YSB0dXBsZSB0byBmYWxsIHdpdGhpbiB0aGUgc2VsZWN0aW9uLlxuICAgKi9cbiAgZW5jb2RpbmdzPzogU2luZ2xlRGVmQ2hhbm5lbFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBmaWVsZCBuYW1lcyB3aG9zZSB2YWx1ZXMgbXVzdCBtYXRjaCBmb3IgYSBkYXRhIHR1cGxlIHRvXG4gICAqIGZhbGwgd2l0aGluIHRoZSBzZWxlY3Rpb24uXG4gICAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQnkgZGVmYXVsdCwgYWxsIGRhdGEgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRvIGxpZSB3aXRoaW4gYW4gZW1wdHkgc2VsZWN0aW9uLlxuICAgKiBXaGVuIHNldCB0byBgbm9uZWAsIGVtcHR5IHNlbGVjdGlvbnMgY29udGFpbiBubyBkYXRhIHZhbHVlcy5cbiAgICovXG4gIGVtcHR5PzogJ2FsbCcgfCAnbm9uZSc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlU2VsZWN0aW9uQ29uZmlnIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkRlZiB7XG4gIC8qKlxuICAgKiBFc3RhYmxpc2ggYSB0d28td2F5IGJpbmRpbmcgYmV0d2VlbiBhIHNpbmdsZSBzZWxlY3Rpb24gYW5kIGlucHV0IGVsZW1lbnRzXG4gICAqIChhbHNvIGtub3duIGFzIGR5bmFtaWMgcXVlcnkgd2lkZ2V0cykuIEEgYmluZGluZyB0YWtlcyB0aGUgZm9ybSBvZlxuICAgKiBWZWdhJ3MgW2lucHV0IGVsZW1lbnQgYmluZGluZyBkZWZpbml0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EvZG9jcy9zaWduYWxzLyNiaW5kKVxuICAgKiBvciBjYW4gYmUgYSBtYXBwaW5nIGJldHdlZW4gcHJvamVjdGVkIGZpZWxkL2VuY29kaW5ncyBhbmQgYmluZGluZyBkZWZpbml0aW9ucy5cbiAgICpcbiAgICogU2VlIHRoZSBbYmluZCB0cmFuc2Zvcm1dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYmluZC5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgYmluZD86IFZnQmluZGluZyB8IHtba2V5OiBzdHJpbmddOiBWZ0JpbmRpbmd9O1xuXG4gIC8qKlxuICAgKiBXaGVuIHRydWUsIGFuIGludmlzaWJsZSB2b3Jvbm9pIGRpYWdyYW0gaXMgY29tcHV0ZWQgdG8gYWNjZWxlcmF0ZSBkaXNjcmV0ZVxuICAgKiBzZWxlY3Rpb24uIFRoZSBkYXRhIHZhbHVlIF9uZWFyZXN0XyB0aGUgbW91c2UgY3Vyc29yIGlzIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFNlZSB0aGUgW25lYXJlc3QgdHJhbnNmb3JtXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL25lYXJlc3QuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIG5lYXJlc3Q/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0aW9uQ29uZmlnIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkRlZiB7XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIGRhdGEgdmFsdWVzIHNob3VsZCBiZSB0b2dnbGVkIG9yIG9ubHkgZXZlciBpbnNlcnRlZCBpbnRvXG4gICAqIG11bHRpIHNlbGVjdGlvbnMuIENhbiBiZSBgdHJ1ZWAsIGBmYWxzZWAgKGZvciBpbnNlcnRpb24gb25seSksIG9yIGFcbiAgICogW1ZlZ2EgZXhwcmVzc2lvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhL2RvY3MvZXhwcmVzc2lvbnMvKS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gYGV2ZW50LnNoaWZ0S2V5YCAoaS5lLixcbiAgICogZGF0YSB2YWx1ZXMgYXJlIHRvZ2dsZWQgd2hlbiBhIHVzZXIgaW50ZXJhY3RzIHdpdGggdGhlIHNoaWZ0LWtleSBwcmVzc2VkKS5cbiAgICpcbiAgICogU2VlIHRoZSBbdG9nZ2xlIHRyYW5zZm9ybV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy90b2dnbGUuaHRtbCkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHRvZ2dsZT86IHN0cmluZyB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSwgYW4gaW52aXNpYmxlIHZvcm9ub2kgZGlhZ3JhbSBpcyBjb21wdXRlZCB0byBhY2NlbGVyYXRlIGRpc2NyZXRlXG4gICAqIHNlbGVjdGlvbi4gVGhlIGRhdGEgdmFsdWUgX25lYXJlc3RfIHRoZSBtb3VzZSBjdXJzb3IgaXMgYWRkZWQgdG8gdGhlIHNlbGVjdGlvbi5cbiAgICpcbiAgICogU2VlIHRoZSBbbmVhcmVzdCB0cmFuc2Zvcm1dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbmVhcmVzdC5odG1sKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgbmVhcmVzdD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJ1c2hDb25maWcge1xuICAvKipcbiAgICogVGhlIGZpbGwgY29sb3Igb2YgdGhlIGludGVydmFsIG1hcmsuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgIzMzMzMzM2BcbiAgICpcbiAgICovXG4gIGZpbGw/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZmlsbCBvcGFjaXR5IG9mIHRoZSBpbnRlcnZhbCBtYXJrIChhIHZhbHVlIGJldHdlZW4gMCBhbmQgMSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMC4xMjVgXG4gICAqL1xuICBmaWxsT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzdHJva2UgY29sb3Igb2YgdGhlIGludGVydmFsIG1hcmsuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgI2ZmZmZmZmBcbiAgICovXG4gIHN0cm9rZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSBvZiB0aGUgaW50ZXJ2YWwgbWFyayAoYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEpLlxuICAgKi9cbiAgc3Ryb2tlT3BhY2l0eT86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugd2lkdGggb2YgdGhlIGludGVydmFsIG1hcmsuXG4gICAqL1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIGFsdGVybmF0aW5nIHN0cm9rZSBhbmQgc3BhY2UgbGVuZ3RocyxcbiAgICogZm9yIGNyZWF0aW5nIGRhc2hlZCBvciBkb3R0ZWQgbGluZXMuXG4gICAqL1xuICBzdHJva2VEYXNoPzogbnVtYmVyW107XG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IChpbiBwaXhlbHMpIHdpdGggd2hpY2ggdG8gYmVnaW4gZHJhd2luZyB0aGUgc3Ryb2tlIGRhc2ggYXJyYXkuXG4gICAqL1xuICBzdHJva2VEYXNoT2Zmc2V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVydmFsU2VsZWN0aW9uQ29uZmlnIGV4dGVuZHMgQmFzZVNlbGVjdGlvbkRlZiB7XG4gIC8qKlxuICAgKiBXaGVuIHRydXRoeSwgYWxsb3dzIGEgdXNlciB0byBpbnRlcmFjdGl2ZWx5IG1vdmUgYW4gaW50ZXJ2YWwgc2VsZWN0aW9uXG4gICAqIGJhY2stYW5kLWZvcnRoLiBDYW4gYmUgYHRydWVgLCBgZmFsc2VgICh0byBkaXNhYmxlIHBhbm5pbmcpLCBvciBhXG4gICAqIFtWZWdhIGV2ZW50IHN0cmVhbSBkZWZpbml0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EvZG9jcy9ldmVudC1zdHJlYW1zLylcbiAgICogd2hpY2ggbXVzdCBpbmNsdWRlIGEgc3RhcnQgYW5kIGVuZCBldmVudCB0byB0cmlnZ2VyIGNvbnRpbnVvdXMgcGFubmluZy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCwgd2hpY2ggY29ycmVzcG9uZHMgdG9cbiAgICogYFttb3VzZWRvd24sIHdpbmRvdzptb3VzZXVwXSA+IHdpbmRvdzptb3VzZW1vdmUhYCB3aGljaCBjb3JyZXNwb25kcyB0b1xuICAgKiBjbGlja3MgYW5kIGRyYWdnaW5nIHdpdGhpbiBhbiBpbnRlcnZhbCBzZWxlY3Rpb24gdG8gcmVwb3NpdGlvbiBpdC5cbiAgICovXG4gIHRyYW5zbGF0ZT86IHN0cmluZyB8IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gdHJ1dGh5LCBhbGxvd3MgYSB1c2VyIHRvIGludGVyYWN0aXZlbHkgcmVzaXplIGFuIGludGVydmFsIHNlbGVjdGlvbi5cbiAgICogQ2FuIGJlIGB0cnVlYCwgYGZhbHNlYCAodG8gZGlzYWJsZSB6b29taW5nKSwgb3IgYSBbVmVnYSBldmVudCBzdHJlYW1cbiAgICogZGVmaW5pdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhL2RvY3MvZXZlbnQtc3RyZWFtcy8pLiBDdXJyZW50bHksXG4gICAqIG9ubHkgYHdoZWVsYCBldmVudHMgYXJlIHN1cHBvcnRlZC5cbiAgICpcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gYHdoZWVsIWAuXG4gICAqL1xuICB6b29tPzogc3RyaW5nIHwgYm9vbGVhbjtcblxuICAvKipcbiAgICogRXN0YWJsaXNoZXMgYSB0d28td2F5IGJpbmRpbmcgYmV0d2VlbiB0aGUgaW50ZXJ2YWwgc2VsZWN0aW9uIGFuZCB0aGUgc2NhbGVzXG4gICAqIHVzZWQgd2l0aGluIHRoZSBzYW1lIHZpZXcuIFRoaXMgYWxsb3dzIGEgdXNlciB0byBpbnRlcmFjdGl2ZWx5IHBhbiBhbmRcbiAgICogem9vbSB0aGUgdmlldy5cbiAgICovXG4gIGJpbmQ/OiAnc2NhbGVzJztcblxuICAvKipcbiAgICogQW4gaW50ZXJ2YWwgc2VsZWN0aW9uIGFsc28gYWRkcyBhIHJlY3RhbmdsZSBtYXJrIHRvIGRlcGljdCB0aGVcbiAgICogZXh0ZW50cyBvZiB0aGUgaW50ZXJ2YWwuIFRoZSBgbWFya2AgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZVxuICAgKiBhcHBlYXJhbmNlIG9mIHRoZSBtYXJrLlxuICAgKi9cbiAgbWFyaz86IEJydXNoQ29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZVNlbGVjdGlvbiBleHRlbmRzIFNpbmdsZVNlbGVjdGlvbkNvbmZpZyB7XG4gIHR5cGU6ICdzaW5nbGUnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpU2VsZWN0aW9uIGV4dGVuZHMgTXVsdGlTZWxlY3Rpb25Db25maWcge1xuICB0eXBlOiAnbXVsdGknO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVydmFsU2VsZWN0aW9uIGV4dGVuZHMgSW50ZXJ2YWxTZWxlY3Rpb25Db25maWcge1xuICB0eXBlOiAnaW50ZXJ2YWwnO1xufVxuXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25EZWYgPSBTaW5nbGVTZWxlY3Rpb24gfCBNdWx0aVNlbGVjdGlvbiB8IEludGVydmFsU2VsZWN0aW9uO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvbkNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBhIFtgc2luZ2xlYF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zZWxlY3Rpb24uaHRtbCN0eXBlKSBzZWxlY3Rpb24uIEFsbCBwcm9wZXJ0aWVzIGFuZCB0cmFuc2Zvcm1hdGlvbnNcbiAgICogIGZvciBhIHNpbmdsZSBzZWxlY3Rpb24gZGVmaW5pdGlvbiAoZXhjZXB0IGB0eXBlYCkgbWF5IGJlIHNwZWNpZmllZCBoZXJlLlxuICAgKlxuICAgKiBGb3IgaW5zdGFuY2UsIHNldHRpbmcgYHNpbmdsZWAgdG8gYHtcIm9uXCI6IFwiZGJsY2xpY2tcIn1gIHBvcHVsYXRlcyBzaW5nbGUgc2VsZWN0aW9ucyBvbiBkb3VibGUtY2xpY2sgYnkgZGVmYXVsdC5cbiAgICovXG4gIHNpbmdsZT86IFNpbmdsZVNlbGVjdGlvbkNvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIGEgW2BtdWx0aWBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2VsZWN0aW9uLmh0bWwjdHlwZSkgc2VsZWN0aW9uLiBBbGwgcHJvcGVydGllcyBhbmQgdHJhbnNmb3JtYXRpb25zXG4gICAqIGZvciBhIG11bHRpIHNlbGVjdGlvbiBkZWZpbml0aW9uIChleGNlcHQgYHR5cGVgKSBtYXkgYmUgc3BlY2lmaWVkIGhlcmUuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgc2V0dGluZyBgbXVsdGlgIHRvIGB7XCJ0b2dnbGVcIjogXCJldmVudC5hbHRLZXlcIn1gIGFkZHMgYWRkaXRpb25hbCB2YWx1ZXMgdG9cbiAgICogbXVsdGkgc2VsZWN0aW9ucyB3aGVuIGNsaWNraW5nIHdpdGggdGhlIGFsdC1rZXkgcHJlc3NlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgbXVsdGk/OiBNdWx0aVNlbGVjdGlvbkNvbmZpZztcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIGFuIFtgaW50ZXJ2YWxgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NlbGVjdGlvbi5odG1sI3R5cGUpIHNlbGVjdGlvbi4gQWxsIHByb3BlcnRpZXMgYW5kIHRyYW5zZm9ybWF0aW9uc1xuICAgKiBmb3IgYW4gaW50ZXJ2YWwgc2VsZWN0aW9uIGRlZmluaXRpb24gKGV4Y2VwdCBgdHlwZWApIG1heSBiZSBzcGVjaWZpZWQgaGVyZS5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCBzZXR0aW5nIGBpbnRlcnZhbGAgdG8gYHtcInRyYW5zbGF0ZVwiOiBmYWxzZX1gIGRpc2FibGVzIHRoZSBhYmlsaXR5IHRvIG1vdmVcbiAgICogaW50ZXJ2YWwgc2VsZWN0aW9ucyBieSBkZWZhdWx0LlxuICAgKi9cbiAgaW50ZXJ2YWw/OiBJbnRlcnZhbFNlbGVjdGlvbkNvbmZpZztcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb25maWc6U2VsZWN0aW9uQ29uZmlnID0ge1xuICBzaW5nbGU6IHtcbiAgICBvbjogJ2NsaWNrJyxcbiAgICBmaWVsZHM6IFtTRUxFQ1RJT05fSURdLFxuICAgIHJlc29sdmU6ICdnbG9iYWwnLFxuICAgIGVtcHR5OiAnYWxsJ1xuICB9LFxuICBtdWx0aToge1xuICAgIG9uOiAnY2xpY2snLFxuICAgIGZpZWxkczogW1NFTEVDVElPTl9JRF0sXG4gICAgdG9nZ2xlOiAnZXZlbnQuc2hpZnRLZXknLFxuICAgIHJlc29sdmU6ICdnbG9iYWwnLFxuICAgIGVtcHR5OiAnYWxsJ1xuICB9LFxuICBpbnRlcnZhbDoge1xuICAgIG9uOiAnW21vdXNlZG93biwgd2luZG93Om1vdXNldXBdID4gd2luZG93Om1vdXNlbW92ZSEnLFxuICAgIGVuY29kaW5nczogWyd4JywgJ3knXSxcbiAgICB0cmFuc2xhdGU6ICdbbW91c2Vkb3duLCB3aW5kb3c6bW91c2V1cF0gPiB3aW5kb3c6bW91c2Vtb3ZlIScsXG4gICAgem9vbTogJ3doZWVsIScsXG4gICAgbWFyazoge2ZpbGw6ICcjMzMzJywgZmlsbE9wYWNpdHk6IDAuMTI1LCBzdHJva2U6ICd3aGl0ZSd9LFxuICAgIHJlc29sdmU6ICdnbG9iYWwnXG4gIH1cbn07XG4iXX0=","import * as tslib_1 from \"tslib\";\nexport function extractTitleConfig(titleConfig) {\n var \n // These are non-mark title config that need to be hardcoded\n anchor = titleConfig.anchor, offset = titleConfig.offset, orient = titleConfig.orient, \n // color needs to be redirect to fill\n color = titleConfig.color, \n // The rest are mark config.\n titleMarkConfig = tslib_1.__rest(titleConfig, [\"anchor\", \"offset\", \"orient\", \"color\"]);\n var mark = tslib_1.__assign({}, titleMarkConfig, color ? { fill: color } : {});\n var nonMark = tslib_1.__assign({}, anchor ? { anchor: anchor } : {}, offset ? { offset: offset } : {}, orient ? { orient: orient } : {});\n return { mark: mark, nonMark: nonMark };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGl0bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGl0bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQXdDQSxNQUFNLDZCQUE2QixXQUEwQjtJQU16RDtJQURBLDREQUE0RDtJQUM1RCwyQkFBTSxFQUFFLDJCQUFNLEVBQUUsMkJBQU07SUFDdEIscUNBQXFDO0lBQ3JDLHlCQUFLO0lBQ0wsNEJBQTRCO0lBQzVCLHNGQUFrQixDQUNKO0lBRWhCLElBQU0sSUFBSSx3QkFDTCxlQUFlLEVBQ2YsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUM5QixDQUFDO0lBRUYsSUFBTSxPQUFPLHdCQUNSLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzFCLENBQUM7SUFFRixPQUFPLEVBQUMsSUFBSSxNQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBbmNob3IsIFRpdGxlT3JpZW50LCBWZ01hcmtDb25maWcsIFZnVGl0bGVDb25maWd9IGZyb20gJy4vdmVnYS5zY2hlbWEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpdGxlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIHRpdGxlIHJlbGF0aXZlIHRvIHRoZSBjaGFydC4gT25lIG9mIGBcInRvcFwiYCAodGhlIGRlZmF1bHQpLCBgXCJib3R0b21cImAsIGBcImxlZnRcImAsIG9yIGBcInJpZ2h0XCJgLlxuICAgKi9cbiAgb3JpZW50PzogVGl0bGVPcmllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgcG9zaXRpb24gZm9yIHBsYWNpbmcgdGhlIHRpdGxlLiBPbmUgb2YgYFwic3RhcnRcImAsIGBcIm1pZGRsZVwiYCwgb3IgYFwiZW5kXCJgLiBGb3IgZXhhbXBsZSwgd2l0aCBhbiBvcmllbnRhdGlvbiBvZiB0b3AgdGhlc2UgYW5jaG9yIHBvc2l0aW9ucyBtYXAgdG8gYSBsZWZ0LSwgY2VudGVyLSwgb3IgcmlnaHQtYWxpZ25lZCB0aXRsZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcIm1pZGRsZVwiYCBmb3IgW3NpbmdsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwpIGFuZCBbbGF5ZXJlZF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sYXllci5odG1sKSB2aWV3cy5cbiAgICogYFwic3RhcnRcImAgZm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cy5cbiAgICpcbiAgICogX19Ob3RlOl9fIFtGb3Igbm93XShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI4NzUpLCBgYW5jaG9yYCBpcyBvbmx5IGN1c3RvbWl6YWJsZSBvbmx5IGZvciBbc2luZ2xlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NwZWMuaHRtbCkgYW5kIFtsYXllcmVkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2xheWVyLmh0bWwpIHZpZXdzLiAgRm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cywgYGFuY2hvcmAgaXMgYWx3YXlzIGBcInN0YXJ0XCJgLlxuICAgKi9cbiAgYW5jaG9yPzogQW5jaG9yO1xuXG4gIC8qKlxuICAgKiBUaGUgb3J0aG9nb25hbCBvZmZzZXQgaW4gcGl4ZWxzIGJ5IHdoaWNoIHRvIGRpc3BsYWNlIHRoZSB0aXRsZSBmcm9tIGl0cyBwb3NpdGlvbiBhbG9uZyB0aGUgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBvZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgW21hcmsgc3R5bGUgcHJvcGVydHldKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvY29uZmlnLmh0bWwjc3R5bGUpIHRvIGFwcGx5IHRvIHRoZSB0aXRsZSB0ZXh0IG1hcmsuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJncm91cC10aXRsZVwiYC5cbiAgICovXG4gIHN0eWxlPzogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgLy8gVE9ETzogbmFtZSwgZW5jb2RlLCBpbnRlcmFjdGl2ZSwgemluZGV4XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGl0bGVQYXJhbXMgZXh0ZW5kcyBUaXRsZUJhc2Uge1xuICAvKipcbiAgICogVGhlIHRpdGxlIHRleHQuXG4gICAqL1xuICB0ZXh0OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VGl0bGVDb25maWcodGl0bGVDb25maWc6IFZnVGl0bGVDb25maWcpOiB7XG4gIG1hcms6IFZnTWFya0NvbmZpZyxcbiAgbm9uTWFyazogVGl0bGVCYXNlXG59IHtcbiAgY29uc3Qge1xuICAgIC8vIFRoZXNlIGFyZSBub24tbWFyayB0aXRsZSBjb25maWcgdGhhdCBuZWVkIHRvIGJlIGhhcmRjb2RlZFxuICAgIGFuY2hvciwgb2Zmc2V0LCBvcmllbnQsXG4gICAgLy8gY29sb3IgbmVlZHMgdG8gYmUgcmVkaXJlY3QgdG8gZmlsbFxuICAgIGNvbG9yLFxuICAgIC8vIFRoZSByZXN0IGFyZSBtYXJrIGNvbmZpZy5cbiAgICAuLi50aXRsZU1hcmtDb25maWdcbiAgfSA9IHRpdGxlQ29uZmlnO1xuXG4gIGNvbnN0IG1hcms6IFZnTWFya0NvbmZpZyA9IHtcbiAgICAuLi50aXRsZU1hcmtDb25maWcsXG4gICAgLi4uY29sb3IgPyB7ZmlsbDogY29sb3J9IDoge31cbiAgfTtcblxuICBjb25zdCBub25NYXJrOiBUaXRsZUJhc2UgPSB7XG4gICAgLi4uYW5jaG9yID8ge2FuY2hvcn0gOiB7fSxcbiAgICAuLi5vZmZzZXQgPyB7b2Zmc2V0fSA6IHt9LFxuICAgIC4uLm9yaWVudCA/IHtvcmllbnR9IDoge31cbiAgfTtcblxuICByZXR1cm4ge21hcmssIG5vbk1hcmt9O1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isObject } from 'vega-util';\nimport { COMPOSITE_MARK_STYLES } from './compositemark';\nimport { VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX } from './compositemark/index';\nimport { VL_ONLY_GUIDE_CONFIG } from './guide';\nimport { defaultLegendConfig } from './legend';\nimport { PRIMITIVE_MARKS, VL_ONLY_MARK_CONFIG_PROPERTIES, VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX } from './mark';\nimport * as mark from './mark';\nimport { defaultScaleConfig } from './scale';\nimport { defaultConfig as defaultSelectionConfig } from './selection';\nimport { extractTitleConfig } from './title';\nimport { duplicate, keys, mergeDeep } from './util';\nexport var defaultViewConfig = {\n width: 200,\n height: 200\n};\nexport var defaultConfig = {\n padding: 5,\n timeFormat: '',\n countTitle: 'Number of Records',\n invalidValues: 'filter',\n view: defaultViewConfig,\n mark: mark.defaultMarkConfig,\n area: {},\n bar: mark.defaultBarConfig,\n circle: {},\n geoshape: {},\n line: {},\n point: {},\n rect: {},\n rule: { color: 'black' },\n square: {},\n text: { color: 'black' },\n tick: mark.defaultTickConfig,\n trail: {},\n box: { size: 14, extent: 1.5 },\n boxWhisker: {},\n boxMid: { color: 'white' },\n scale: defaultScaleConfig,\n projection: {},\n axis: {},\n axisX: {},\n axisY: { minExtent: 30 },\n axisLeft: {},\n axisRight: {},\n axisTop: {},\n axisBottom: {},\n axisBand: {},\n legend: defaultLegendConfig,\n selection: defaultSelectionConfig,\n style: {},\n title: {},\n};\nexport function initConfig(config) {\n return mergeDeep(duplicate(defaultConfig), config);\n}\nvar MARK_STYLES = ['view'].concat(PRIMITIVE_MARKS, COMPOSITE_MARK_STYLES);\nvar VL_ONLY_CONFIG_PROPERTIES = [\n 'padding', 'numberFormat', 'timeFormat', 'countTitle',\n 'stack', 'scale', 'selection', 'invalidValues',\n 'overlay' // FIXME: Redesign and unhide this\n];\nvar VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX = tslib_1.__assign({ view: ['width', 'height'] }, VL_ONLY_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX, VL_ONLY_COMPOSITE_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX);\nexport function stripAndRedirectConfig(config) {\n config = duplicate(config);\n for (var _i = 0, VL_ONLY_CONFIG_PROPERTIES_1 = VL_ONLY_CONFIG_PROPERTIES; _i < VL_ONLY_CONFIG_PROPERTIES_1.length; _i++) {\n var prop = VL_ONLY_CONFIG_PROPERTIES_1[_i];\n delete config[prop];\n }\n // Remove Vega-Lite only axis/legend config\n if (config.axis) {\n for (var _a = 0, VL_ONLY_GUIDE_CONFIG_1 = VL_ONLY_GUIDE_CONFIG; _a < VL_ONLY_GUIDE_CONFIG_1.length; _a++) {\n var prop = VL_ONLY_GUIDE_CONFIG_1[_a];\n delete config.axis[prop];\n }\n }\n if (config.legend) {\n for (var _b = 0, VL_ONLY_GUIDE_CONFIG_2 = VL_ONLY_GUIDE_CONFIG; _b < VL_ONLY_GUIDE_CONFIG_2.length; _b++) {\n var prop = VL_ONLY_GUIDE_CONFIG_2[_b];\n delete config.legend[prop];\n }\n }\n // Remove Vega-Lite only generic mark config\n if (config.mark) {\n for (var _c = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_1 = VL_ONLY_MARK_CONFIG_PROPERTIES; _c < VL_ONLY_MARK_CONFIG_PROPERTIES_1.length; _c++) {\n var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_1[_c];\n delete config.mark[prop];\n }\n }\n for (var _d = 0, MARK_STYLES_1 = MARK_STYLES; _d < MARK_STYLES_1.length; _d++) {\n var markType = MARK_STYLES_1[_d];\n // Remove Vega-Lite-only mark config\n for (var _e = 0, VL_ONLY_MARK_CONFIG_PROPERTIES_2 = VL_ONLY_MARK_CONFIG_PROPERTIES; _e < VL_ONLY_MARK_CONFIG_PROPERTIES_2.length; _e++) {\n var prop = VL_ONLY_MARK_CONFIG_PROPERTIES_2[_e];\n delete config[markType][prop];\n }\n // Remove Vega-Lite only mark-specific config\n var vlOnlyMarkSpecificConfigs = VL_ONLY_ALL_MARK_SPECIFIC_CONFIG_PROPERTY_INDEX[markType];\n if (vlOnlyMarkSpecificConfigs) {\n for (var _f = 0, vlOnlyMarkSpecificConfigs_1 = vlOnlyMarkSpecificConfigs; _f < vlOnlyMarkSpecificConfigs_1.length; _f++) {\n var prop = vlOnlyMarkSpecificConfigs_1[_f];\n delete config[markType][prop];\n }\n }\n // Redirect mark config to config.style so that mark config only affect its own mark type\n // without affecting other marks that share the same underlying Vega marks.\n // For example, config.rect should not affect bar marks.\n redirectConfig(config, markType);\n }\n // Redirect config.title -- so that title config do not\n // affect header labels, which also uses `title` directive to implement.\n redirectConfig(config, 'title', 'group-title');\n // Remove empty config objects\n for (var prop in config) {\n if (isObject(config[prop]) && keys(config[prop]).length === 0) {\n delete config[prop];\n }\n }\n return keys(config).length > 0 ? config : undefined;\n}\nfunction redirectConfig(config, prop, toProp) {\n var propConfig = prop === 'title' ? extractTitleConfig(config.title).mark : config[prop];\n if (prop === 'view') {\n toProp = 'cell'; // View's default style is \"cell\"\n }\n var style = tslib_1.__assign({}, propConfig, config.style[prop]);\n // set config.style if it is not an empty object\n if (keys(style).length > 0) {\n config.style[toProp || prop] = style;\n }\n delete config[prop];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVuQyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQWdELHFEQUFxRCxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0ksT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxtQkFBbUIsRUFBZSxNQUFNLFVBQVUsQ0FBQztBQUMzRCxPQUFPLEVBQXlCLGVBQWUsRUFBRSw4QkFBOEIsRUFBRSwyQ0FBMkMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1SSxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUUvQixPQUFPLEVBQUMsa0JBQWtCLEVBQWMsTUFBTSxTQUFTLENBQUM7QUFDeEQsT0FBTyxFQUFDLGFBQWEsSUFBSSxzQkFBc0IsRUFBa0IsTUFBTSxhQUFhLENBQUM7QUFFckYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTNDLE9BQU8sRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQW9GbEQsTUFBTSxDQUFDLElBQU0saUJBQWlCLEdBQWU7SUFDM0MsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsR0FBRztDQUNaLENBQUM7QUE0SEYsTUFBTSxDQUFDLElBQU0sYUFBYSxHQUFXO0lBQ25DLE9BQU8sRUFBRSxDQUFDO0lBQ1YsVUFBVSxFQUFFLEVBQUU7SUFDZCxVQUFVLEVBQUUsbUJBQW1CO0lBRS9CLGFBQWEsRUFBRSxRQUFRO0lBRXZCLElBQUksRUFBRSxpQkFBaUI7SUFFdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUI7SUFDNUIsSUFBSSxFQUFFLEVB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LENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEQsQ0FBQztBQUVELHdCQUF3QixNQUFjLEVBQUUsSUFBa0QsRUFBRSxNQUFlO0lBQ3pHLElBQU0sVUFBVSxHQUFpQixJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekcsSUFBSSxJQUFJLEtBQUssTUFBTSxFQUFFO1FBQ25CLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxpQ0FBaUM7S0FDbkQ7SUFFRCxJQUFNLEtBQUssd0JBQ04sVUFBVSxFQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQ3RCLENBQUM7SUFDRixnREFBZ0Q7SUFDaEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7S0FDdEM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc09iamVjdH0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7QXhpc0NvbmZpZ01peGluc30gZnJvbSAnLi9heGlzJztcbmltcG9ydCB7Q09NUE9TSVRFX01BUktfU1RZTEVTfSBmcm9tICcuL2NvbXBvc2l0ZW1hcmsnO1xuaW1wb3J0IHtDb21wb3NpdGVNYXJrQ29uZmlnTWl4aW5zLCBDb21wb3NpdGVNYXJrU3R5bGUsIFZMX09OTFlfQ09NUE9TSVRFX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYfSBmcm9tICcuL2NvbXBvc2l0ZW1hcmsvaW5kZXgnO1xuaW1wb3J0IHtWTF9PTkxZX0dVSURFX0NPTkZJR30gZnJvbSAnLi9ndWlkZSc7XG5pbXBvcnQge2RlZmF1bHRMZWdlbmRDb25maWcsIExlZ2VuZENvbmZpZ30gZnJvbSAnLi9sZWdlbmQnO1xuaW1wb3J0IHtNYXJrLCBNYXJrQ29uZmlnTWl4aW5zLCBQUklNSVRJVkVfTUFSS1MsIFZMX09OTFlfTUFSS19DT05GSUdfUFJPUEVSVElFUywgVkxfT05MWV9NQVJLX1NQRUNJRklDX0NPTkZJR19QUk9QRVJUWV9JTkRFWH0gZnJvbSAnLi9tYXJrJztcbmltcG9ydCAqIGFzIG1hcmsgZnJvbSAnLi9tYXJrJztcbmltcG9ydCB7UHJvamVjdGlvbkNvbmZpZ30gZnJvbSAnLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7ZGVmYXVsdFNjYWxlQ29uZmlnLCBTY2FsZUNvbmZpZ30gZnJvbSAnLi9zY2FsZSc7XG5pbXBvcnQge2RlZmF1bHRDb25maWcgYXMgZGVmYXVsdFNlbGVjdGlvbkNvbmZpZywgU2VsZWN0aW9uQ29uZmlnfSBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7ZXh0cmFjdFRpdGxlQ29uZmlnfSBmcm9tICcuL3RpdGxlJztcbmltcG9ydCB7VG9wTGV2ZWxQcm9wZXJ0aWVzfSBmcm9tICcuL3RvcGxldmVscHJvcHMnO1xuaW1wb3J0IHtkdXBsaWNhdGUsIGtleXMsIG1lcmdlRGVlcH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7VmdNYXJrQ29uZmlnLCBWZ1NjaGVtZSwgVmdUaXRsZUNvbmZpZ30gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBWaWV3Q29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSBzaW5nbGUgcGxvdCBvciBlYWNoIHBsb3QgaW4gYSB0cmVsbGlzIHBsb3Qgd2hlbiB0aGUgdmlzdWFsaXphdGlvbiBoYXMgYSBjb250aW51b3VzIChub24tb3JkaW5hbCkgeC1zY2FsZSBvciBvcmRpbmFsIHgtc2NhbGUgd2l0aCBgcmFuZ2VTdGVwYCA9IGBudWxsYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAyMDBgXG4gICAqXG4gICAqL1xuICB3aWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaGVpZ2h0IG9mIHRoZSBzaW5nbGUgcGxvdCBvciBlYWNoIHBsb3QgaW4gYSB0cmVsbGlzIHBsb3Qgd2hlbiB0aGUgdmlzdWFsaXphdGlvbiBoYXMgYSBjb250aW51b3VzIChub24tb3JkaW5hbCkgeS1zY2FsZSB3aXRoIGByYW5nZVN0ZXBgID0gYG51bGxgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDIwMGBcbiAgICpcbiAgICovXG4gIGhlaWdodD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgdmlldyBzaG91bGQgYmUgY2xpcHBlZC5cbiAgICovXG4gIGNsaXA/OiBib29sZWFuO1xuXG4gIC8vIEZJTExfU1RST0tFX0NPTkZJR1xuICAvKipcbiAgICogVGhlIGZpbGwgY29sb3IuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIGZpbGw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmaWxsIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKG5vbmUpXG4gICAqXG4gICAqL1xuICBmaWxsT3BhY2l0eT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0cm9rZSBjb2xvci5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIChub25lKVxuICAgKlxuICAgKi9cbiAgc3Ryb2tlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3Ryb2tlIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKG5vbmUpXG4gICAqXG4gICAqL1xuICBzdHJva2VPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc3Ryb2tlIHdpZHRoLCBpbiBwaXhlbHMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIHN0cm9rZVdpZHRoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBhbHRlcm5hdGluZyBzdHJva2UsIHNwYWNlIGxlbmd0aHMgZm9yIGNyZWF0aW5nIGRhc2hlZCBvciBkb3R0ZWQgbGluZXMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIHN0cm9rZURhc2g/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCAoaW4gcGl4ZWxzKSBpbnRvIHdoaWNoIHRvIGJlZ2luIGRyYXdpbmcgd2l0aCB0aGUgc3Ryb2tlIGRhc2ggYXJyYXkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAobm9uZSlcbiAgICpcbiAgICovXG4gIHN0cm9rZURhc2hPZmZzZXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Vmlld0NvbmZpZzogVmlld0NvbmZpZyA9IHtcbiAgd2lkdGg6IDIwMCxcbiAgaGVpZ2h0OiAyMDBcbn07XG5cbmV4cG9ydCB0eXBlIFJhbmdlQ29uZmlnVmFsdWUgPSAobnVtYmVyfHN0cmluZylbXSB8IFZnU2NoZW1lIHwge3N0ZXA6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIFJhbmdlQ29uZmlnID0gUmFuZ2VDb25maWdQcm9wcyAmIHtbbmFtZTogc3RyaW5nXTogUmFuZ2VDb25maWdWYWx1ZX07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZ2VDb25maWdQcm9wcyB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIGZvciBfbm9taW5hbF8gKGNhdGVnb3JpY2FsKSBmaWVsZHMuXG4gICAqL1xuICBjYXRlZ29yeT86IHN0cmluZ1tdIHwgVmdTY2hlbWU7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgZm9yIGRpdmVyZ2luZyBfcXVhbnRpdGF0aXZlXyBmaWVsZHMuXG4gICAqL1xuICBkaXZlcmdpbmc/OiBzdHJpbmdbXSB8IFZnU2NoZW1lO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIGZvciBfcXVhbnRpdGF0aXZlXyBoZWF0bWFwcy5cbiAgICovXG4gIGhlYXRtYXA/OiBzdHJpbmdbXSB8IFZnU2NoZW1lO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIGZvciBfb3JkaW5hbF8gZmllbGRzLlxuICAgKi9cbiAgb3JkaW5hbD86IHN0cmluZ1tdIHwgVmdTY2hlbWU7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgcmFuZ2UgZm9yIF9xdWFudGl0YXRpdmVfIGFuZCBfdGVtcG9yYWxfIGZpZWxkcy5cbiAgICovXG4gIHJhbXA/OiBzdHJpbmdbXSB8IFZnU2NoZW1lO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHJhbmdlIHBhbGV0dGUgZm9yIHRoZSBgc2hhcGVgIGNoYW5uZWwuXG4gICAqL1xuICBzeW1ib2w/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWTE9ubHlDb25maWcge1xuICAvKipcbiAgICogRGVmYXVsdCBheGlzIGFuZCBsZWdlbmQgdGl0bGUgZm9yIGNvdW50IGZpZWxkcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAnTnVtYmVyIG9mIFJlY29yZHMnYC5cbiAgICpcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICovXG4gIGNvdW50VGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmluZXMgaG93IFZlZ2EtTGl0ZSBzaG91bGQgaGFuZGxlIGludmFsaWQgdmFsdWVzIChgbnVsbGAgYW5kIGBOYU5gKS5cbiAgICogLSBJZiBzZXQgdG8gYFwiZmlsdGVyXCJgIChkZWZhdWx0KSwgYWxsIGRhdGEgaXRlbXMgd2l0aCBudWxsIHZhbHVlcyB3aWxsIGJlIHNraXBwZWQgKGZvciBsaW5lLCB0cmFpbCwgYW5kIGFyZWEgbWFya3MpIG9yIGZpbHRlcmVkIChmb3Igb3RoZXIgbWFya3MpLlxuICAgKiAtIElmIGBudWxsYCwgYWxsIGRhdGEgaXRlbXMgYXJlIGluY2x1ZGVkLiBJbiB0aGlzIGNhc2UsIGludmFsaWQgdmFsdWVzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgemVyb2VzLlxuICAgKi9cbiAgaW52YWxpZFZhbHVlcz86ICdmaWx0ZXInIHwgbnVsbDtcblxuICAvKipcbiAgICogRGVmaW5lcyBob3cgVmVnYS1MaXRlIGdlbmVyYXRlcyB0aXRsZSBmb3IgZmllbGRzLiAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHN0eWxlczpcbiAgICogLSBgXCJ2ZXJiYWxcImAgKERlZmF1bHQpIC0gZGlzcGxheXMgZnVuY3Rpb24gaW4gYSB2ZXJiYWwgc3R5bGUgKGUuZy4sIFwiU3VtIG9mIGZpZWxkXCIsIFwiWWVhci1tb250aCBvZiBkYXRlXCIsIFwiZmllbGQgKGJpbm5lZClcIikuXG4gICAqIC0gYFwiZnVuY3Rpb25cImAgLSBkaXNwbGF5cyBmdW5jdGlvbiB1c2luZyBwYXJlbnRoZXNlcyBhbmQgY2FwaXRhbGl6ZWQgdGV4dHMgKGUuZy4sIFwiU1VNKGZpZWxkKVwiLCBcIllFQVJNT05USChkYXRlKVwiLCBcIkJJTihmaWVsZClcIikuXG4gICAqIC0gYFwicGxhaW5cImAgLSBkaXNwbGF5cyBvbmx5IHRoZSBmaWVsZCBuYW1lIHdpdGhvdXQgZnVuY3Rpb25zIChlLmcuLCBcImZpZWxkXCIsIFwiZGF0ZVwiLCBcImZpZWxkXCIpLlxuICAgKi9cbiAgZmllbGRUaXRsZT86ICd2ZXJiYWwnIHwgJ2Z1bmN0aW9uYWwnIHwgJ3BsYWluJztcblxuICAvKipcbiAgICogRDMgTnVtYmVyIGZvcm1hdCBmb3IgYXhpcyBsYWJlbHMgYW5kIHRleHQgdGFibGVzLiBGb3IgZXhhbXBsZSBcInNcIiBmb3IgU0kgdW5pdHMuIFVzZSBbRDMncyBudW1iZXIgZm9ybWF0IHBhdHRlcm5dKGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1mb3JtYXQjbG9jYWxlX2Zvcm1hdCkuXG4gICAqL1xuICBudW1iZXJGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgZGF0ZXRpbWUgZm9ybWF0IGZvciBheGlzIGFuZCBsZWdlbmQgbGFiZWxzLiBUaGUgZm9ybWF0IGNhbiBiZSBzZXQgZGlyZWN0bHkgb24gZWFjaCBheGlzIGFuZCBsZWdlbmQuIFVzZSBbRDMncyB0aW1lIGZvcm1hdCBwYXR0ZXJuXShodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtdGltZS1mb3JtYXQjbG9jYWxlX2Zvcm1hdCkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgJydgIChUaGUgZm9ybWF0IHdpbGwgYmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkKS5cbiAgICpcbiAgICovXG4gIHRpbWVGb3JtYXQ/OiBzdHJpbmc7XG5cblxuICAvKiogRGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBbc2luZ2xlIHZpZXcgcGxvdHNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI3NpbmdsZSkuICovXG4gIHZpZXc/OiBWaWV3Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBTY2FsZSBjb25maWd1cmF0aW9uIGRldGVybWluZXMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhbGwgW3NjYWxlc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sKS4gRm9yIGEgZnVsbCBsaXN0IG9mIHNjYWxlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgcGxlYXNlIHNlZSB0aGUgW2NvcnJlc3BvbmRpbmcgc2VjdGlvbiBvZiB0aGUgc2NhbGUgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbmZpZykuXG4gICAqL1xuICBzY2FsZT86IFNjYWxlQ29uZmlnO1xuXG4gIC8qKiBBbiBvYmplY3QgaGFzaCBmb3IgZGVmaW5pbmcgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBlYWNoIHR5cGUgb2Ygc2VsZWN0aW9ucy4gKi9cbiAgc2VsZWN0aW9uPzogU2VsZWN0aW9uQ29uZmlnO1xuXG4gIC8qKiBEZWZhdWx0IHN0YWNrIG9mZnNldCBmb3Igc3RhY2thYmxlIG1hcmsuICovXG4gIHN0YWNrPzogU3RhY2tPZmZzZXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3R5bGVDb25maWdJbmRleCB7XG4gIFtzdHlsZTogc3RyaW5nXTogVmdNYXJrQ29uZmlnO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnIGV4dGVuZHMgVG9wTGV2ZWxQcm9wZXJ0aWVzLCBWTE9ubHlDb25maWcsIE1hcmtDb25maWdNaXhpbnMsIENvbXBvc2l0ZU1hcmtDb25maWdNaXhpbnMsIEF4aXNDb25maWdNaXhpbnMge1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgaGFzaCB0aGF0IGRlZmluZXMgZGVmYXVsdCByYW5nZSBhcnJheXMgb3Igc2NoZW1lcyBmb3IgdXNpbmcgd2l0aCBzY2FsZXMuXG4gICAqIEZvciBhIGZ1bGwgbGlzdCBvZiBzY2FsZSByYW5nZSBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHBsZWFzZSBzZWUgdGhlIFtjb3JyZXNwb25kaW5nIHNlY3Rpb24gb2YgdGhlIHNjYWxlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNjb25maWcpLlxuICAgKi9cbiAgcmFuZ2U/OiBSYW5nZUNvbmZpZztcblxuICAvKipcbiAgICogTGVnZW5kIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGRldGVybWluZXMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBhbGwgW2xlZ2VuZHNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbGVnZW5kLmh0bWwpLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnZW5kIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgcGxlYXNlIHNlZSB0aGUgW2NvcnJlc3BvbmRpbmcgc2VjdGlvbiBvZiBpbiB0aGUgbGVnZW5kIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbGVnZW5kLmh0bWwjY29uZmlnKS5cbiAgICovXG4gIGxlZ2VuZD86IExlZ2VuZENvbmZpZztcblxuICAvKipcbiAgICogVGl0bGUgY29uZmlndXJhdGlvbiwgd2hpY2ggZGV0ZXJtaW5lcyBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIGFsbCBbdGl0bGVzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RpdGxlLmh0bWwpLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdGl0bGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBwbGVhc2Ugc2VlIHRoZSBbY29ycmVzcG9uZGluZyBzZWN0aW9uIG9mIHRoZSB0aXRsZSBkb2N1bWVudGF0aW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RpdGxlLmh0bWwjY29uZmlnKS5cbiAgICovXG4gIHRpdGxlPzogVmdUaXRsZUNvbmZpZztcblxuICAvKipcbiAgICogUHJvamVjdGlvbiBjb25maWd1cmF0aW9uLCB3aGljaCBkZXRlcm1pbmVzIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgYWxsIFtwcm9qZWN0aW9uc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9wcm9qZWN0aW9uLmh0bWwpLiBGb3IgYSBmdWxsIGxpc3Qgb2YgcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHBsZWFzZSBzZWUgdGhlIFtjb3JyZXNwb25kaW5nIHNlY3Rpb24gb2YgdGhlIHByb2plY3Rpb24gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9wcm9qZWN0aW9uLmh0bWwjY29uZmlnKS5cbiAgICovXG4gIHByb2plY3Rpb24/OiBQcm9qZWN0aW9uQ29uZmlnO1xuXG4gIC8qKiBBbiBvYmplY3QgaGFzaCB0aGF0IGRlZmluZXMga2V5LXZhbHVlIG1hcHBpbmdzIHRvIGRldGVybWluZSBkZWZhdWx0IHByb3BlcnRpZXMgZm9yIG1hcmtzIHdpdGggYSBnaXZlbiBbc3R5bGVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbWFyay5odG1sI21hcmstZGVmKS4gIFRoZSBrZXlzIHJlcHJlc2VudCBzdHlsZXMgbmFtZXM7IHRoZSB2YWx1ZXMgaGF2ZSB0byBiZSB2YWxpZCBbbWFyayBjb25maWd1cmF0aW9uIG9iamVjdHNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvbWFyay5odG1sI2NvbmZpZykuICAqL1xuICBzdHlsZT86IFN0eWxlQ29uZmlnSW5kZXg7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnOiBDb25maWcgPSB7XG4gIHBhZGRpbmc6IDUsXG4gIHRpbWVGb3JtYXQ6ICcnLFxuICBjb3VudFRpdGxlOiAnTnVtYmVyIG9mIFJlY29yZHMnLFxuXG4gIGludmFsaWRWYWx1ZXM6ICdmaWx0ZXInLFxuXG4gIHZpZXc6IGRlZmF1bHRWaWV3Q29uZmlnLFxuXG4gIG1hcms6IG1hcmsuZGVmYXVsdE1hcmtDb25maWcsXG4gIGFyZWE6IHt9LFxuICBiYXI6IG1hcmsuZGVmYXVsdEJhckNvbmZpZyxcbiAgY2lyY2xlOiB7fSxcbiAgZ2Vvc2hhcGU6IHt9LFxuICBsaW5lOiB7fSxcbiAgcG9pbnQ6IHt9LFxuICByZWN0OiB7fSxcbiAgcnVsZToge2NvbG9yOiAnYmxhY2snfSwgLy8gTmVlZCB0aGlzIHRvIG92ZXJyaWRlIGRlZmF1bHQgY29sb3IgaW4gbWFyayBjb25maWdcbiAgc3F1YXJlOiB7fSxcbiAgdGV4dDoge2NvbG9yOiAnYmxhY2snfSwgLy8gTmVlZCB0aGlzIHRvIG92ZXJyaWRlIGRlZmF1bHQgY29sb3IgaW4gbWFyayBjb25maWdcbiAgdGljazogbWFyay5kZWZhdWx0VGlja0NvbmZpZyxcbiAgdHJhaWw6IHt9LFxuXG4gIGJveDoge3NpemU6IDE0LCBleHRlbnQ6IDEuNX0sXG4gIGJveFdoaXNrZXI6IHt9LFxuICBib3hNaWQ6IHtjb2xvcjogJ3doaXRlJ30sXG5cbiAgc2NhbGU6IGRlZmF1bHRTY2FsZUNvbmZpZyxcbiAgcHJvamVjdGlvbjoge30sXG4gIGF4aXM6IHt9LFxuICBheGlzWDoge30sXG4gIGF4aXNZOiB7bWluRXh0ZW50OiAzMH0sXG4gIGF4aXNMZWZ0OiB7fSxcbiAgYXhpc1JpZ2h0OiB7fSxcbiAgYXhpc1RvcDoge30sXG4gIGF4aXNCb3R0b206IHt9LFxuICBheGlzQmFuZDoge30sXG4gIGxlZ2VuZDogZGVmYXVsdExlZ2VuZENvbmZpZyxcblxuICBzZWxlY3Rpb246IGRlZmF1bHRTZWxlY3Rpb25Db25maWcsXG4gIHN0eWxlOiB7fSxcblxuICB0aXRsZToge30sXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5pdENvbmZpZyhjb25maWc6IENvbmZpZykge1xuICByZXR1cm4gbWVyZ2VEZWVwKGR1cGxpY2F0ZShkZWZhdWx0Q29uZmlnKSwgY29uZmlnKTtcbn1cblxuY29uc3QgTUFSS19TVFlMRVMgPSBbJ3ZpZXcnXS5jb25jYXQoUFJJTUlUSVZFX01BUktTLCBDT01QT1NJVEVfTUFSS19TVFlMRVMpIGFzICgndmlldycgfCBNYXJrIHwgQ29tcG9zaXRlTWFya1N0eWxlKVtdO1xuXG5cbmNvbnN0IFZMX09OTFlfQ09ORklHX1BST1BFUlRJRVM6IChrZXlvZiBDb25maWcpW10gPSBbXG4gICdwYWRkaW5nJywgJ251bWJlckZvcm1hdCcsICd0aW1lRm9ybWF0JywgJ2NvdW50VGl0bGUnLFxuICAnc3RhY2snLCAnc2NhbGUnLCAnc2VsZWN0aW9uJywgJ2ludmFsaWRWYWx1ZXMnLFxuICAnb3ZlcmxheScgYXMga2V5b2YgQ29uZmlnIC8vIEZJWE1FOiBSZWRlc2lnbiBhbmQgdW5oaWRlIHRoaXNcbl07XG5cbmNvbnN0IFZMX09OTFlfQUxMX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYID0ge1xuICB2aWV3OiBbJ3dpZHRoJywgJ2hlaWdodCddLFxuICAuLi5WTF9PTkxZX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYLFxuICAuLi5WTF9PTkxZX0NPTVBPU0lURV9NQVJLX1NQRUNJRklDX0NPTkZJR19QUk9QRVJUWV9JTkRFWFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQW5kUmVkaXJlY3RDb25maWcoY29uZmlnOiBDb25maWcpIHtcbiAgY29uZmlnID0gZHVwbGljYXRlKGNvbmZpZyk7XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIFZMX09OTFlfQ09ORklHX1BST1BFUlRJRVMpIHtcbiAgICBkZWxldGUgY29uZmlnW3Byb3BdO1xuICB9XG5cbiAgLy8gUmVtb3ZlIFZlZ2EtTGl0ZSBvbmx5IGF4aXMvbGVnZW5kIGNvbmZpZ1xuICBpZiAoY29uZmlnLmF4aXMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgVkxfT05MWV9HVUlERV9DT05GSUcpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuYXhpc1twcm9wXTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbmZpZy5sZWdlbmQpIHtcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgVkxfT05MWV9HVUlERV9DT05GSUcpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcubGVnZW5kW3Byb3BdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSBWZWdhLUxpdGUgb25seSBnZW5lcmljIG1hcmsgY29uZmlnXG4gIGlmIChjb25maWcubWFyaykge1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBWTF9PTkxZX01BUktfQ09ORklHX1BST1BFUlRJRVMpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcubWFya1twcm9wXTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IG1hcmtUeXBlIG9mIE1BUktfU1RZTEVTKSB7XG4gICAgLy8gUmVtb3ZlIFZlZ2EtTGl0ZS1vbmx5IG1hcmsgY29uZmlnXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIFZMX09OTFlfTUFSS19DT05GSUdfUFJPUEVSVElFUykge1xuICAgICAgZGVsZXRlIGNvbmZpZ1ttYXJrVHlwZV1bcHJvcF07XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIFZlZ2EtTGl0ZSBvbmx5IG1hcmstc3BlY2lmaWMgY29uZmlnXG4gICAgY29uc3QgdmxPbmx5TWFya1NwZWNpZmljQ29uZmlncyA9IFZMX09OTFlfQUxMX01BUktfU1BFQ0lGSUNfQ09ORklHX1BST1BFUlRZX0lOREVYW21hcmtUeXBlXTtcbiAgICBpZiAodmxPbmx5TWFya1NwZWNpZmljQ29uZmlncykge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHZsT25seU1hcmtTcGVjaWZpY0NvbmZpZ3MpIHtcbiAgICAgICAgZGVsZXRlIGNvbmZpZ1ttYXJrVHlwZV1bcHJvcF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVkaXJlY3QgbWFyayBjb25maWcgdG8gY29uZmlnLnN0eWxlIHNvIHRoYXQgbWFyayBjb25maWcgb25seSBhZmZlY3QgaXRzIG93biBtYXJrIHR5cGVcbiAgICAvLyB3aXRob3V0IGFmZmVjdGluZyBvdGhlciBtYXJrcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHVuZGVybHlpbmcgVmVnYSBtYXJrcy5cbiAgICAvLyBGb3IgZXhhbXBsZSwgY29uZmlnLnJlY3Qgc2hvdWxkIG5vdCBhZmZlY3QgYmFyIG1hcmtzLlxuICAgIHJlZGlyZWN0Q29uZmlnKGNvbmZpZywgbWFya1R5cGUpO1xuICB9XG5cbiAgLy8gUmVkaXJlY3QgY29uZmlnLnRpdGxlIC0tIHNvIHRoYXQgdGl0bGUgY29uZmlnIGRvIG5vdFxuICAvLyBhZmZlY3QgaGVhZGVyIGxhYmVscywgd2hpY2ggYWxzbyB1c2VzIGB0aXRsZWAgZGlyZWN0aXZlIHRvIGltcGxlbWVudC5cbiAgcmVkaXJlY3RDb25maWcoY29uZmlnLCAndGl0bGUnLCAnZ3JvdXAtdGl0bGUnKTtcblxuICAvLyBSZW1vdmUgZW1wdHkgY29uZmlnIG9iamVjdHNcbiAgZm9yIChjb25zdCBwcm9wIGluIGNvbmZpZykge1xuICAgIGlmIChpc09iamVjdChjb25maWdbcHJvcF0pICYmIGtleXMoY29uZmlnW3Byb3BdKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGRlbGV0ZSBjb25maWdbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtleXMoY29uZmlnKS5sZW5ndGggPiAwID8gY29uZmlnIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWRpcmVjdENvbmZpZyhjb25maWc6IENvbmZpZywgcHJvcDogTWFyayB8IENvbXBvc2l0ZU1hcmtTdHlsZSB8ICd0aXRsZScgfCAndmlldycsIHRvUHJvcD86IHN0cmluZykge1xuICBjb25zdCBwcm9wQ29uZmlnOiBWZ01hcmtDb25maWcgPSBwcm9wID09PSAndGl0bGUnID8gZXh0cmFjdFRpdGxlQ29uZmlnKGNvbmZpZy50aXRsZSkubWFyayA6IGNvbmZpZ1twcm9wXTtcblxuICBpZiAocHJvcCA9PT0gJ3ZpZXcnKSB7XG4gICAgdG9Qcm9wID0gJ2NlbGwnOyAvLyBWaWV3J3MgZGVmYXVsdCBzdHlsZSBpcyBcImNlbGxcIlxuICB9XG5cbiAgY29uc3Qgc3R5bGU6IFZnTWFya0NvbmZpZyA9IHtcbiAgICAuLi5wcm9wQ29uZmlnLFxuICAgIC4uLmNvbmZpZy5zdHlsZVtwcm9wXVxuICB9O1xuICAvLyBzZXQgY29uZmlnLnN0eWxlIGlmIGl0IGlzIG5vdCBhbiBlbXB0eSBvYmplY3RcbiAgaWYgKGtleXMoc3R5bGUpLmxlbmd0aCA+IDApIHtcbiAgICBjb25maWcuc3R5bGVbdG9Qcm9wIHx8IHByb3BdID0gc3R5bGU7XG4gIH1cbiAgZGVsZXRlIGNvbmZpZ1twcm9wXTtcbn1cbiJdfQ==","import { isArray } from 'vega-util';\nimport { SUM_OPS } from './aggregate';\nimport { NONPOSITION_CHANNELS, X, X2, Y2 } from './channel';\nimport { channelHasField } from './encoding';\nimport { getFieldDef, isFieldDef, isStringFieldDef, vgField } from './fielddef';\nimport * as log from './log';\nimport { AREA, BAR, CIRCLE, isMarkDef, isPathMark, LINE, POINT, RULE, SQUARE, TEXT, TICK } from './mark';\nimport { ScaleType } from './scale';\nimport { contains } from './util';\nvar STACK_OFFSET_INDEX = {\n zero: 1,\n center: 1,\n normalize: 1\n};\nexport function isStackOffset(s) {\n return !!STACK_OFFSET_INDEX[s];\n}\nexport var STACKABLE_MARKS = [BAR, AREA, RULE, POINT, CIRCLE, SQUARE, LINE, TEXT, TICK];\nexport var STACK_BY_DEFAULT_MARKS = [BAR, AREA];\nfunction potentialStackedChannel(encoding) {\n var xDef = encoding.x;\n var yDef = encoding.y;\n if (isFieldDef(xDef) && isFieldDef(yDef)) {\n if (xDef.type === 'quantitative' && yDef.type === 'quantitative') {\n if (xDef.stack) {\n return 'x';\n }\n else if (yDef.stack) {\n return 'y';\n }\n // if there is no explicit stacking, only apply stack if there is only one aggregate for x or y\n if ((!!xDef.aggregate) !== (!!yDef.aggregate)) {\n return xDef.aggregate ? 'x' : 'y';\n }\n }\n else if (xDef.type === 'quantitative') {\n return 'x';\n }\n else if (yDef.type === 'quantitative') {\n return 'y';\n }\n }\n else if (isFieldDef(xDef) && xDef.type === 'quantitative') {\n return 'x';\n }\n else if (isFieldDef(yDef) && yDef.type === 'quantitative') {\n return 'y';\n }\n return undefined;\n}\n// Note: CompassQL uses this method and only pass in required properties of each argument object.\n// If required properties change, make sure to update CompassQL.\nexport function stack(m, encoding, stackConfig) {\n var mark = isMarkDef(m) ? m.type : m;\n // Should have stackable mark\n if (!contains(STACKABLE_MARKS, mark)) {\n return null;\n }\n var fieldChannel = potentialStackedChannel(encoding);\n if (!fieldChannel) {\n return null;\n }\n var stackedFieldDef = encoding[fieldChannel];\n var stackedField = isStringFieldDef(stackedFieldDef) ? vgField(stackedFieldDef, {}) : undefined;\n var dimensionChannel = fieldChannel === 'x' ? 'y' : 'x';\n var dimensionDef = encoding[dimensionChannel];\n var dimensionField = isStringFieldDef(dimensionDef) ? vgField(dimensionDef, {}) : undefined;\n // Should have grouping level of detail that is different from the dimension field\n var stackBy = NONPOSITION_CHANNELS.reduce(function (sc, channel) {\n if (channelHasField(encoding, channel)) {\n var channelDef = encoding[channel];\n (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (cDef) {\n var fieldDef = getFieldDef(cDef);\n if (fieldDef.aggregate) {\n return;\n }\n // Check whether the channel's field is identical to x/y's field or if the channel is a repeat\n var f = isStringFieldDef(fieldDef) ? vgField(fieldDef, {}) : undefined;\n if (\n // if fielddef is a repeat, just include it in the stack by\n !f ||\n // otherwise, the field must be different from x and y fields.\n (f !== dimensionField && f !== stackedField)) {\n sc.push({ channel: channel, fieldDef: fieldDef });\n }\n });\n }\n return sc;\n }, []);\n if (stackBy.length === 0) {\n return null;\n }\n // Automatically determine offset\n var offset = undefined;\n if (stackedFieldDef.stack !== undefined) {\n offset = stackedFieldDef.stack;\n }\n else if (contains(STACK_BY_DEFAULT_MARKS, mark)) {\n // Bar and Area with sum ops are automatically stacked by default\n offset = stackConfig === undefined ? 'zero' : stackConfig;\n }\n else {\n offset = stackConfig;\n }\n if (!offset || !isStackOffset(offset)) {\n return null;\n }\n // warn when stacking non-linear\n if (stackedFieldDef.scale && stackedFieldDef.scale.type && stackedFieldDef.scale.type !== ScaleType.LINEAR) {\n log.warn(log.message.cannotStackNonLinearScale(stackedFieldDef.scale.type));\n }\n // Check if it is a ranged mark\n if (channelHasField(encoding, fieldChannel === X ? X2 : Y2)) {\n log.warn(log.message.cannotStackRangedMark(fieldChannel));\n return null;\n }\n // Warn if stacking summative aggregate\n if (stackedFieldDef.aggregate && !contains(SUM_OPS, stackedFieldDef.aggregate)) {\n log.warn(log.message.stackNonSummativeAggregate(stackedFieldDef.aggregate));\n }\n return {\n groupbyChannel: dimensionDef ? dimensionChannel : undefined,\n fieldChannel: fieldChannel,\n impute: isPathMark(mark),\n stackBy: stackBy,\n offset: offset\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBc0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDOUUsT0FBTyxFQUFDLGVBQWUsRUFBVyxNQUFNLFlBQVksQ0FBQztBQUNyRCxPQUFPLEVBQWtCLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQW9CLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNqSCxPQUFPLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQWlCLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDdEgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUMsUUFBUSxFQUFPLE1BQU0sUUFBUSxDQUFDO0FBS3RDLElBQU0sa0JBQWtCLEdBQXNCO0lBQzVDLElBQUksRUFBRSxDQUFDO0lBQ1AsTUFBTSxFQUFFLENBQUM7SUFDVCxTQUFTLEVBQUUsQ0FBQztDQUNiLENBQUM7QUFFRixNQUFNLHdCQUF3QixDQUFTO0lBQ3JDLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUEwQkQsTUFBTSxDQUFDLElBQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFN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QUNMLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzNELFlBQVksY0FBQTtRQUNaLE1BQU0sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDO1FBQ3hCLE9BQU8sU0FBQTtRQUNQLE1BQU0sUUFBQTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtTVU1fT1BTfSBmcm9tICcuL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge05PTlBPU0lUSU9OX0NIQU5ORUxTLCBOb25Qb3NpdGlvbkNoYW5uZWwsIFgsIFgyLCBZMn0gZnJvbSAnLi9jaGFubmVsJztcbmltcG9ydCB7Y2hhbm5lbEhhc0ZpZWxkLCBFbmNvZGluZ30gZnJvbSAnLi9lbmNvZGluZyc7XG5pbXBvcnQge0ZpZWxkLCBGaWVsZERlZiwgZ2V0RmllbGREZWYsIGlzRmllbGREZWYsIGlzU3RyaW5nRmllbGREZWYsIFBvc2l0aW9uRmllbGREZWYsIHZnRmllbGR9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7QVJFQSwgQkFSLCBDSVJDTEUsIGlzTWFya0RlZiwgaXNQYXRoTWFyaywgTElORSwgTWFyaywgTWFya0RlZiwgUE9JTlQsIFJVTEUsIFNRVUFSRSwgVEVYVCwgVElDS30gZnJvbSAnLi9tYXJrJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuL3NjYWxlJztcbmltcG9ydCB7Y29udGFpbnMsIEZsYWd9IGZyb20gJy4vdXRpbCc7XG5cblxuZXhwb3J0IHR5cGUgU3RhY2tPZmZzZXQgPSAnemVybycgfCAnY2VudGVyJyB8ICdub3JtYWxpemUnO1xuXG5jb25zdCBTVEFDS19PRkZTRVRfSU5ERVg6IEZsYWc8U3RhY2tPZmZzZXQ+ID0ge1xuICB6ZXJvOiAxLFxuICBjZW50ZXI6IDEsXG4gIG5vcm1hbGl6ZTogMVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhY2tPZmZzZXQoczogc3RyaW5nKTogcyBpcyBTdGFja09mZnNldCB7XG4gIHJldHVybiAhIVNUQUNLX09GRlNFVF9JTkRFWFtzXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja1Byb3BlcnRpZXMge1xuICAvKiogRGltZW5zaW9uIGF4aXMgb2YgdGhlIHN0YWNrLiAqL1xuICBncm91cGJ5Q2hhbm5lbDogJ3gnIHwgJ3knO1xuXG4gIC8qKiBNZWFzdXJlIGF4aXMgb2YgdGhlIHN0YWNrLiAqL1xuICBmaWVsZENoYW5uZWw6ICd4JyB8ICd5JztcblxuICAvKiogU3RhY2stYnkgZmllbGRzIGUuZy4sIGNvbG9yLCBkZXRhaWwgKi9cbiAgc3RhY2tCeToge1xuICAgIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LFxuICAgIGNoYW5uZWw6IE5vblBvc2l0aW9uQ2hhbm5lbFxuICB9W107XG5cbiAgLyoqXG4gICAqIFNlZSBgXCJzdGFja1wiYCBwcm9wZXJ0eSBvZiBQb3NpdGlvbiBGaWVsZCBEZWYuXG4gICAqL1xuICBvZmZzZXQ6IFN0YWNrT2Zmc2V0O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgc3RhY2sgd2lsbCBwcm9kdWNlIGltcHV0ZSB0cmFuc2Zvcm1cbiAgICovXG4gIGltcHV0ZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFNUQUNLQUJMRV9NQVJLUyA9IFtCQVIsIEFSRUEsIFJVTEUsIFBPSU5ULCBDSVJDTEUsIFNRVUFSRSwgTElORSwgVEVYVCwgVElDS107XG5leHBvcnQgY29uc3QgU1RBQ0tfQllfREVGQVVMVF9NQVJLUyA9IFtCQVIsIEFSRUFdO1xuXG5cbmZ1bmN0aW9uIHBvdGVudGlhbFN0YWNrZWRDaGFubmVsKGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4pOiAneCcgfCAneScgfCB1bmRlZmluZWQge1xuICBjb25zdCB4RGVmID0gZW5jb2RpbmcueDtcbiAgY29uc3QgeURlZiA9IGVuY29kaW5nLnk7XG5cbiAgaWYgKGlzRmllbGREZWYoeERlZikgJiYgaXNGaWVsZERlZih5RGVmKSkge1xuICAgIGlmICh4RGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnICYmIHlEZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICAgIGlmICh4RGVmLnN0YWNrKSB7XG4gICAgICAgIHJldHVybiAneCc7XG4gICAgICB9IGVsc2UgaWYgKHlEZWYuc3RhY2spIHtcbiAgICAgICAgcmV0dXJuICd5JztcbiAgICAgIH1cbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGV4cGxpY2l0IHN0YWNraW5nLCBvbmx5IGFwcGx5IHN0YWNrIGlmIHRoZXJlIGlzIG9ubHkgb25lIGFnZ3JlZ2F0ZSBmb3IgeCBvciB5XG4gICAgICBpZiAoKCEheERlZi5hZ2dyZWdhdGUpICE9PSAoISF5RGVmLmFnZ3JlZ2F0ZSkpIHtcbiAgICAgICAgcmV0dXJuIHhEZWYuYWdncmVnYXRlID8gJ3gnIDogJ3knO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoeERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgICAgcmV0dXJuICd4JztcbiAgICB9IGVsc2UgaWYgKHlEZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICAgIHJldHVybiAneSc7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzRmllbGREZWYoeERlZikgJiYgeERlZi50eXBlID09PSAncXVhbnRpdGF0aXZlJykge1xuICAgIHJldHVybiAneCc7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih5RGVmKSAmJiB5RGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnKSB7XG4gICAgcmV0dXJuICd5JztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vLyBOb3RlOiBDb21wYXNzUUwgdXNlcyB0aGlzIG1ldGhvZCBhbmQgb25seSBwYXNzIGluIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgZWFjaCBhcmd1bWVudCBvYmplY3QuXG4vLyBJZiByZXF1aXJlZCBwcm9wZXJ0aWVzIGNoYW5nZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBDb21wYXNzUUwuXG5leHBvcnQgZnVuY3Rpb24gc3RhY2sobTogTWFyayB8IE1hcmtEZWYsIGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4sIHN0YWNrQ29uZmlnOiBTdGFja09mZnNldCk6IFN0YWNrUHJvcGVydGllcyB7XG4gIGNvbnN0IG1hcmsgPSBpc01hcmtEZWYobSkgPyBtLnR5cGUgOiBtO1xuICAvLyBTaG91bGQgaGF2ZSBzdGFja2FibGUgbWFya1xuICBpZiAoIWNvbnRhaW5zKFNUQUNLQUJMRV9NQVJLUywgbWFyaykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkQ2hhbm5lbCA9IHBvdGVudGlhbFN0YWNrZWRDaGFubmVsKGVuY29kaW5nKTtcbiAgaWYgKCFmaWVsZENoYW5uZWwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrZWRGaWVsZERlZiA9IGVuY29kaW5nW2ZpZWxkQ2hhbm5lbF0gYXMgUG9zaXRpb25GaWVsZERlZjxzdHJpbmc+O1xuICBjb25zdCBzdGFja2VkRmllbGQgPSBpc1N0cmluZ0ZpZWxkRGVmKHN0YWNrZWRGaWVsZERlZikgPyB2Z0ZpZWxkKHN0YWNrZWRGaWVsZERlZiwge30pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRpbWVuc2lvbkNoYW5uZWwgPSBmaWVsZENoYW5uZWwgPT09ICd4JyA/ICd5JyA6ICd4JztcbiAgY29uc3QgZGltZW5zaW9uRGVmID0gZW5jb2RpbmdbZGltZW5zaW9uQ2hhbm5lbF07XG4gIGNvbnN0IGRpbWVuc2lvbkZpZWxkID0gaXNTdHJpbmdGaWVsZERlZihkaW1lbnNpb25EZWYpID8gdmdGaWVsZChkaW1lbnNpb25EZWYsIHt9KSA6IHVuZGVmaW5lZDtcblxuICAvLyBTaG91bGQgaGF2ZSBncm91cGluZyBsZXZlbCBvZiBkZXRhaWwgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZGltZW5zaW9uIGZpZWxkXG4gIGNvbnN0IHN0YWNrQnkgPSBOT05QT1NJVElPTl9DSEFOTkVMUy5yZWR1Y2UoKHNjLCBjaGFubmVsKSA9PiB7XG4gICAgaWYgKGNoYW5uZWxIYXNGaWVsZChlbmNvZGluZywgY2hhbm5lbCkpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgICAgIChpc0FycmF5KGNoYW5uZWxEZWYpID8gY2hhbm5lbERlZiA6IFtjaGFubmVsRGVmXSkuZm9yRWFjaCgoY0RlZikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZERlZiA9IGdldEZpZWxkRGVmKGNEZWYpO1xuICAgICAgICBpZiAoZmllbGREZWYuYWdncmVnYXRlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY2hhbm5lbCdzIGZpZWxkIGlzIGlkZW50aWNhbCB0byB4L3kncyBmaWVsZCBvciBpZiB0aGUgY2hhbm5lbCBpcyBhIHJlcGVhdFxuICAgICAgICBjb25zdCBmID0gaXNTdHJpbmdGaWVsZERlZihmaWVsZERlZikgPyB2Z0ZpZWxkKGZpZWxkRGVmLCB7fSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAvLyBpZiBmaWVsZGRlZiBpcyBhIHJlcGVhdCwganVzdCBpbmNsdWRlIGl0IGluIHRoZSBzdGFjayBieVxuICAgICAgICAgICFmIHx8XG4gICAgICAgICAgLy8gb3RoZXJ3aXNlLCB0aGUgZmllbGQgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSB4IGFuZCB5IGZpZWxkcy5cbiAgICAgICAgICAoZiAhPT0gZGltZW5zaW9uRmllbGQgJiYgZiAhPT0gc3RhY2tlZEZpZWxkKVxuICAgICAgICApIHtcbiAgICAgICAgICBzYy5wdXNoKHtjaGFubmVsLCBmaWVsZERlZn0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHNjO1xuICB9LCBbXSk7XG5cbiAgaWYgKHN0YWNrQnkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBdXRvbWF0aWNhbGx5IGRldGVybWluZSBvZmZzZXRcbiAgbGV0IG9mZnNldDogU3RhY2tPZmZzZXQgPSB1bmRlZmluZWQ7XG4gIGlmIChzdGFja2VkRmllbGREZWYuc3RhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgIG9mZnNldCA9IHN0YWNrZWRGaWVsZERlZi5zdGFjaztcbiAgfSBlbHNlIGlmIChjb250YWlucyhTVEFDS19CWV9ERUZBVUxUX01BUktTLCBtYXJrKSkge1xuICAgIC8vIEJhciBhbmQgQXJlYSB3aXRoIHN1bSBvcHMgYXJlIGF1dG9tYXRpY2FsbHkgc3RhY2tlZCBieSBkZWZhdWx0XG4gICAgb2Zmc2V0ID0gc3RhY2tDb25maWcgPT09IHVuZGVmaW5lZCA/ICd6ZXJvJyA6IHN0YWNrQ29uZmlnO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldCA9IHN0YWNrQ29uZmlnO1xuICB9XG5cbiAgaWYgKCFvZmZzZXQgfHwgIWlzU3RhY2tPZmZzZXQob2Zmc2V0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gd2FybiB3aGVuIHN0YWNraW5nIG5vbi1saW5lYXJcbiAgaWYgKHN0YWNrZWRGaWVsZERlZi5zY2FsZSAmJiBzdGFja2VkRmllbGREZWYuc2NhbGUudHlwZSAmJiBzdGFja2VkRmllbGREZWYuc2NhbGUudHlwZSAhPT0gU2NhbGVUeXBlLkxJTkVBUikge1xuICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmNhbm5vdFN0YWNrTm9uTGluZWFyU2NhbGUoc3RhY2tlZEZpZWxkRGVmLnNjYWxlLnR5cGUpKTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGl0IGlzIGEgcmFuZ2VkIG1hcmtcbiAgaWYgKGNoYW5uZWxIYXNGaWVsZChlbmNvZGluZywgZmllbGRDaGFubmVsID09PSBYID8gWDIgOiBZMikpIHtcbiAgICBsb2cud2Fybihsb2cubWVzc2FnZS5jYW5ub3RTdGFja1JhbmdlZE1hcmsoZmllbGRDaGFubmVsKSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBXYXJuIGlmIHN0YWNraW5nIHN1bW1hdGl2ZSBhZ2dyZWdhdGVcbiAgaWYgKHN0YWNrZWRGaWVsZERlZi5hZ2dyZWdhdGUgJiYgIWNvbnRhaW5zKFNVTV9PUFMsIHN0YWNrZWRGaWVsZERlZi5hZ2dyZWdhdGUpKSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uuc3RhY2tOb25TdW1tYXRpdmVBZ2dyZWdhdGUoc3RhY2tlZEZpZWxkRGVmLmFnZ3JlZ2F0ZSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBncm91cGJ5Q2hhbm5lbDogZGltZW5zaW9uRGVmID8gZGltZW5zaW9uQ2hhbm5lbCA6IHVuZGVmaW5lZCxcbiAgICBmaWVsZENoYW5uZWwsXG4gICAgaW1wdXRlOiBpc1BhdGhNYXJrKG1hcmspLFxuICAgIHN0YWNrQnksXG4gICAgb2Zmc2V0XG4gIH07XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isObject } from 'vega-util';\nimport { COLUMN, ROW, X, X2, Y, Y2 } from './channel';\nimport * as compositeMark from './compositemark';\nimport { channelHasField, isRanged } from './encoding';\nimport * as vlEncoding from './encoding';\nimport * as log from './log';\nimport { isMarkDef, isPathMark, isPrimitiveMark } from './mark';\nimport { stack } from './stack';\nimport { duplicate, hash, keys, omit, vals } from './util';\n/* Custom type guards */\nexport function isFacetSpec(spec) {\n return spec['facet'] !== undefined;\n}\nexport function isUnitSpec(spec) {\n return !!spec['mark'];\n}\nexport function isLayerSpec(spec) {\n return spec['layer'] !== undefined;\n}\nexport function isRepeatSpec(spec) {\n return spec['repeat'] !== undefined;\n}\nexport function isConcatSpec(spec) {\n return isVConcatSpec(spec) || isHConcatSpec(spec);\n}\nexport function isVConcatSpec(spec) {\n return spec['vconcat'] !== undefined;\n}\nexport function isHConcatSpec(spec) {\n return spec['hconcat'] !== undefined;\n}\n/**\n * Decompose extended unit specs into composition of pure unit specs.\n */\n// TODO: consider moving this to another file. Maybe vl.spec.normalize or vl.normalize\nexport function normalize(spec, config) {\n if (isFacetSpec(spec)) {\n return normalizeFacet(spec, config);\n }\n if (isLayerSpec(spec)) {\n return normalizeLayer(spec, config);\n }\n if (isRepeatSpec(spec)) {\n return normalizeRepeat(spec, config);\n }\n if (isVConcatSpec(spec)) {\n return normalizeVConcat(spec, config);\n }\n if (isHConcatSpec(spec)) {\n return normalizeHConcat(spec, config);\n }\n if (isUnitSpec(spec)) {\n var hasRow = channelHasField(spec.encoding, ROW);\n var hasColumn = channelHasField(spec.encoding, COLUMN);\n if (hasRow || hasColumn) {\n return normalizeFacetedUnit(spec, config);\n }\n return normalizeNonFacetUnit(spec, config);\n }\n throw new Error(log.message.INVALID_SPEC);\n}\nfunction normalizeFacet(spec, config) {\n var subspec = spec.spec, rest = tslib_1.__rest(spec, [\"spec\"]);\n return tslib_1.__assign({}, rest, { \n // TODO: remove \"any\" once we support all facet listed in https://github.com/vega/vega-lite/issues/2760\n spec: normalize(subspec, config) });\n}\nfunction mergeEncoding(opt) {\n var parentEncoding = opt.parentEncoding, encoding = opt.encoding;\n if (parentEncoding && encoding) {\n var overriden = keys(parentEncoding).reduce(function (o, key) {\n if (encoding[key]) {\n o.push(key);\n }\n return o;\n }, []);\n if (overriden.length > 0) {\n log.warn(log.message.encodingOverridden(overriden));\n }\n }\n var merged = tslib_1.__assign({}, (parentEncoding || {}), (encoding || {}));\n return keys(merged).length > 0 ? merged : undefined;\n}\nfunction mergeProjection(opt) {\n var parentProjection = opt.parentProjection, projection = opt.projection;\n if (parentProjection && projection) {\n log.warn(log.message.projectionOverridden({ parentProjection: parentProjection, projection: projection }));\n }\n return projection || parentProjection;\n}\nfunction normalizeLayer(spec, config, parentEncoding, parentProjection) {\n var layer = spec.layer, encoding = spec.encoding, projection = spec.projection, rest = tslib_1.__rest(spec, [\"layer\", \"encoding\", \"projection\"]);\n var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding });\n var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection });\n return tslib_1.__assign({}, rest, { layer: layer.map(function (subspec) {\n if (isLayerSpec(subspec)) {\n return normalizeLayer(subspec, config, mergedEncoding, mergedProjection);\n }\n return normalizeNonFacetUnit(subspec, config, mergedEncoding, mergedProjection);\n }) });\n}\nfunction normalizeRepeat(spec, config) {\n var subspec = spec.spec, rest = tslib_1.__rest(spec, [\"spec\"]);\n return tslib_1.__assign({}, rest, { spec: normalize(subspec, config) });\n}\nfunction normalizeVConcat(spec, config) {\n var vconcat = spec.vconcat, rest = tslib_1.__rest(spec, [\"vconcat\"]);\n return tslib_1.__assign({}, rest, { vconcat: vconcat.map(function (subspec) { return normalize(subspec, config); }) });\n}\nfunction normalizeHConcat(spec, config) {\n var hconcat = spec.hconcat, rest = tslib_1.__rest(spec, [\"hconcat\"]);\n return tslib_1.__assign({}, rest, { hconcat: hconcat.map(function (subspec) { return normalize(subspec, config); }) });\n}\nfunction normalizeFacetedUnit(spec, config) {\n // New encoding in the inside spec should not contain row / column\n // as row/column should be moved to facet\n var _a = spec.encoding, row = _a.row, column = _a.column, encoding = tslib_1.__rest(_a, [\"row\", \"column\"]);\n // Mark and encoding should be moved into the inner spec\n var mark = spec.mark, width = spec.width, projection = spec.projection, height = spec.height, selection = spec.selection, _ = spec.encoding, outerSpec = tslib_1.__rest(spec, [\"mark\", \"width\", \"projection\", \"height\", \"selection\", \"encoding\"]);\n return tslib_1.__assign({}, outerSpec, { facet: tslib_1.__assign({}, (row ? { row: row } : {}), (column ? { column: column } : {})), spec: normalizeNonFacetUnit(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: mark }, (width ? { width: width } : {}), (height ? { height: height } : {}), { encoding: encoding }, (selection ? { selection: selection } : {})), config) });\n}\nfunction isNonFacetUnitSpecWithPrimitiveMark(spec) {\n return isPrimitiveMark(spec.mark);\n}\nfunction getPointOverlay(markDef, markConfig, encoding) {\n if (markDef.point === 'transparent') {\n return { opacity: 0 };\n }\n else if (markDef.point) { // truthy : true or object\n return isObject(markDef.point) ? markDef.point : {};\n }\n else if (markDef.point !== undefined) { // false or null\n return null;\n }\n else { // undefined (not disabled)\n if (markConfig.point || encoding.shape) {\n // enable point overlay if config[mark].point is truthy or if encoding.shape is provided\n return isObject(markConfig.point) ? markConfig.point : {};\n }\n // markDef.point is defined as falsy\n return null;\n }\n}\nfunction getLineOverlay(markDef, markConfig) {\n if (markDef.line) { // true or object\n return markDef.line === true ? {} : markDef.line;\n }\n else if (markDef.line !== undefined) { // false or null\n return null;\n }\n else { // undefined (not disabled)\n if (markConfig.line) {\n // enable line overlay if config[mark].line is truthy\n return markConfig.line === true ? {} : markConfig.line;\n }\n // markDef.point is defined as falsy\n return null;\n }\n}\nfunction normalizeNonFacetUnit(spec, config, parentEncoding, parentProjection) {\n var encoding = spec.encoding, projection = spec.projection;\n var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark;\n // merge parent encoding / projection first\n if (parentEncoding || parentProjection) {\n var mergedProjection = mergeProjection({ parentProjection: parentProjection, projection: projection });\n var mergedEncoding = mergeEncoding({ parentEncoding: parentEncoding, encoding: encoding });\n return normalizeNonFacetUnit(tslib_1.__assign({}, spec, (mergedProjection ? { projection: mergedProjection } : {}), (mergedEncoding ? { encoding: mergedEncoding } : {})), config);\n }\n if (isNonFacetUnitSpecWithPrimitiveMark(spec)) {\n // TODO: thoroughly test\n if (isRanged(encoding)) {\n return normalizeRangedUnit(spec);\n }\n if (mark === 'line' && (encoding.x2 || encoding.y2)) {\n log.warn(log.message.lineWithRange(!!encoding.x2, !!encoding.y2));\n return normalizeNonFacetUnit(tslib_1.__assign({ mark: 'rule' }, spec), config, parentEncoding, parentProjection);\n }\n if (isPathMark(mark)) {\n return normalizePathOverlay(spec, config);\n }\n return spec; // Nothing to normalize\n }\n else {\n return compositeMark.normalize(spec, config);\n }\n}\nfunction normalizeRangedUnit(spec) {\n var hasX = channelHasField(spec.encoding, X);\n var hasY = channelHasField(spec.encoding, Y);\n var hasX2 = channelHasField(spec.encoding, X2);\n var hasY2 = channelHasField(spec.encoding, Y2);\n if ((hasX2 && !hasX) || (hasY2 && !hasY)) {\n var normalizedSpec = duplicate(spec);\n if (hasX2 && !hasX) {\n normalizedSpec.encoding.x = normalizedSpec.encoding.x2;\n delete normalizedSpec.encoding.x2;\n }\n if (hasY2 && !hasY) {\n normalizedSpec.encoding.y = normalizedSpec.encoding.y2;\n delete normalizedSpec.encoding.y2;\n }\n return normalizedSpec;\n }\n return spec;\n}\nfunction dropLineAndPoint(markDef) {\n var _point = markDef.point, _line = markDef.line, mark = tslib_1.__rest(markDef, [\"point\", \"line\"]);\n return keys(mark).length > 1 ? mark : mark.type;\n}\nfunction normalizePathOverlay(spec, config) {\n var _a;\n if (config === void 0) { config = {}; }\n // _ is used to denote a dropped property of the unit spec\n // which should not be carried over to the layer spec\n var selection = spec.selection, projection = spec.projection, encoding = spec.encoding, mark = spec.mark, outerSpec = tslib_1.__rest(spec, [\"selection\", \"projection\", \"encoding\", \"mark\"]);\n var markDef = isMarkDef(mark) ? mark : { type: mark };\n var pointOverlay = getPointOverlay(markDef, config[markDef.type], encoding);\n var lineOverlay = markDef.type === 'area' && getLineOverlay(markDef, config[markDef.type]);\n if (!pointOverlay && !lineOverlay) {\n return tslib_1.__assign({}, spec, { \n // Do not include point / line overlay in the normalize spec\n mark: dropLineAndPoint(markDef) });\n }\n var layer = [tslib_1.__assign({}, (selection ? { selection: selection } : {}), { \n // Do not include point / line overlay in the normalize spec\n mark: dropLineAndPoint(tslib_1.__assign({}, markDef, (markDef.type === 'area' ? { opacity: 0.7 } : {}))), \n // drop shape from encoding as this might be used to trigger point overlay\n encoding: omit(encoding, ['shape']) })];\n // FIXME: disable tooltip for the line layer if tooltip is not group-by field.\n // FIXME: determine rules for applying selections.\n // Need to copy stack config to overlayed layer\n var stackProps = stack(markDef, encoding, config ? config.stack : undefined);\n var overlayEncoding = encoding;\n if (stackProps) {\n var stackFieldChannel = stackProps.fieldChannel, offset = stackProps.offset;\n overlayEncoding = tslib_1.__assign({}, encoding, (_a = {}, _a[stackFieldChannel] = tslib_1.__assign({}, encoding[stackFieldChannel], (offset ? { stack: offset } : {})), _a));\n }\n if (lineOverlay) {\n var interpolate = markDef.interpolate;\n layer.push(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: tslib_1.__assign({ type: 'line' }, lineOverlay, (interpolate ? { interpolate: interpolate } : {})), encoding: overlayEncoding }));\n }\n if (pointOverlay) {\n layer.push(tslib_1.__assign({}, (projection ? { projection: projection } : {}), { mark: tslib_1.__assign({ type: 'point', opacity: 1, filled: true }, pointOverlay), encoding: overlayEncoding }));\n }\n return tslib_1.__assign({}, outerSpec, { layer: layer });\n}\n// TODO: add vl.spec.validate & move stuff from vl.validate to here\n/* Accumulate non-duplicate fieldDefs in a dictionary */\nfunction accumulate(dict, defs) {\n defs.forEach(function (fieldDef) {\n // Consider only pure fieldDef properties (ignoring scale, axis, legend)\n var pureFieldDef = ['field', 'type', 'value', 'timeUnit', 'bin', 'aggregate'].reduce(function (f, key) {\n if (fieldDef[key] !== undefined) {\n f[key] = fieldDef[key];\n }\n return f;\n }, {});\n var key = hash(pureFieldDef);\n dict[key] = dict[key] || fieldDef;\n });\n return dict;\n}\n/* Recursively get fieldDefs from a spec, returns a dictionary of fieldDefs */\nfunction fieldDefIndex(spec, dict) {\n if (dict === void 0) { dict = {}; }\n // FIXME(https://github.com/vega/vega-lite/issues/2207): Support fieldDefIndex for repeat\n if (isLayerSpec(spec)) {\n spec.layer.forEach(function (layer) {\n if (isUnitSpec(layer)) {\n accumulate(dict, vlEncoding.fieldDefs(layer.encoding));\n }\n else {\n fieldDefIndex(layer, dict);\n }\n });\n }\n else if (isFacetSpec(spec)) {\n accumulate(dict, vlEncoding.fieldDefs(spec.facet));\n fieldDefIndex(spec.spec, dict);\n }\n else if (isRepeatSpec(spec)) {\n fieldDefIndex(spec.spec, dict);\n }\n else if (isConcatSpec(spec)) {\n var childSpec = isVConcatSpec(spec) ? spec.vconcat : spec.hconcat;\n childSpec.forEach(function (child) { return fieldDefIndex(child, dict); });\n }\n else { // Unit Spec\n accumulate(dict, vlEncoding.fieldDefs(spec.encoding));\n }\n return dict;\n}\n/* Returns all non-duplicate fieldDefs in a spec in a flat array */\nexport function fieldDefs(spec) {\n return vals(fieldDefIndex(spec));\n}\nexport function isStacked(spec, config) {\n config = config || spec.config;\n if (isPrimitiveMark(spec.mark)) {\n return stack(spec.mark, spec.encoding, config ? config.stack : undefined) !== null;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNwRCxPQUFPLEtBQUssYUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBR2pELE9BQU8sRUFBQyxlQUFlLEVBQStCLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsRixPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQztBQUd6QyxPQUFPLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQXNCLFNBQVMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUF3QyxNQUFNLFFBQVEsQ0FBQztBQUsxSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBSTlCLE9BQU8sRUFBTyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBbVAvRCx3QkFBd0I7QUFHeEIsTUFBTSxzQkFBc0IsSUFBYztJQUN4QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0scUJBQXFCLElBQWM7SUFDdkMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLHNCQUFzQixJQUFjO0lBQ3hDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNyQyxDQUFDO0FBRUQsTUFBTSx1QkFBdUIsSUFBYztJQUN6QyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUM7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LENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLG9CQUFvQixJQUF3QyxFQUFFLE1BQWU7SUFDakYsTUFBTSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQy9CLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM5QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQzdCLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUNsQyxLQUFLLElBQUksQ0FBQztLQUNsQjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNPYmplY3R9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NPTFVNTiwgUk9XLCBYLCBYMiwgWSwgWTJ9IGZyb20gJy4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBjb21wb3NpdGVNYXJrIGZyb20gJy4vY29tcG9zaXRlbWFyayc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtEYXRhfSBmcm9tICcuL2RhdGEnO1xuaW1wb3J0IHtjaGFubmVsSGFzRmllbGQsIEVuY29kaW5nLCBFbmNvZGluZ1dpdGhGYWNldCwgaXNSYW5nZWR9IGZyb20gJy4vZW5jb2RpbmcnO1xuaW1wb3J0ICogYXMgdmxFbmNvZGluZyBmcm9tICcuL2VuY29kaW5nJztcbmltcG9ydCB7RmFjZXRNYXBwaW5nfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7RmllbGQsIEZpZWxkRGVmLCBSZXBlYXRSZWZ9IGZyb20gJy4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7QW55TWFyaywgQXJlYUNvbmZpZywgaXNNYXJrRGVmLCBpc1BhdGhNYXJrLCBpc1ByaW1pdGl2ZU1hcmssIExpbmVDb25maWcsIE1hcmssIE1hcmtDb25maWcsIE1hcmtEZWZ9IGZyb20gJy4vbWFyayc7XG5pbXBvcnQge1Byb2plY3Rpb259IGZyb20gJy4vcHJvamVjdGlvbic7XG5pbXBvcnQge1JlcGVhdH0gZnJvbSAnLi9yZXBlYXQnO1xuaW1wb3J0IHtSZXNvbHZlfSBmcm9tICcuL3Jlc29sdmUnO1xuaW1wb3J0IHtTZWxlY3Rpb25EZWZ9IGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCB7c3RhY2t9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtUaXRsZVBhcmFtc30gZnJvbSAnLi90aXRsZSc7XG5pbXBvcnQge1RvcExldmVsUHJvcGVydGllc30gZnJvbSAnLi90b3BsZXZlbHByb3BzJztcbmltcG9ydCB7VHJhbnNmb3JtfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5pbXBvcnQge0RpY3QsIGR1cGxpY2F0ZSwgaGFzaCwga2V5cywgb21pdCwgdmFsc30gZnJvbSAnLi91dGlsJztcblxuXG5leHBvcnQgdHlwZSBUb3BMZXZlbDxTIGV4dGVuZHMgQmFzZVNwZWM+ID0gUyAmIFRvcExldmVsUHJvcGVydGllcyAmIHtcbiAgLyoqXG4gICAqIFVSTCB0byBbSlNPTiBzY2hlbWFdKGh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvKSBmb3IgYSBWZWdhLUxpdGUgc3BlY2lmaWNhdGlvbi4gVW5sZXNzIHlvdSBoYXZlIGEgcmVhc29uIHRvIGNoYW5nZSB0aGlzLCB1c2UgYGh0dHBzOi8vdmVnYS5naXRodWIuaW8vc2NoZW1hL3ZlZ2EtbGl0ZS92Mi5qc29uYC4gU2V0dGluZyB0aGUgYCRzY2hlbWFgIHByb3BlcnR5IGFsbG93cyBhdXRvbWF0aWMgdmFsaWRhdGlvbiBhbmQgYXV0b2NvbXBsZXRlIGluIGVkaXRvcnMgdGhhdCBzdXBwb3J0IEpTT04gc2NoZW1hLlxuICAgKiBAZm9ybWF0IHVyaVxuICAgKi9cbiAgJHNjaGVtYT86IHN0cmluZztcblxuICAvKipcbiAgICogVmVnYS1MaXRlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LiAgVGhpcyBwcm9wZXJ0eSBjYW4gb25seSBiZSBkZWZpbmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgYSBzcGVjaWZpY2F0aW9uLlxuICAgKi9cbiAgY29uZmlnPzogQ29uZmlnO1xufTtcblxuZXhwb3J0IHR5cGUgQmFzZVNwZWMgPSBQYXJ0aWFsPERhdGFNaXhpbnM+ICYge1xuICAvKipcbiAgICogVGl0bGUgZm9yIHRoZSBwbG90LlxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmcgfCBUaXRsZVBhcmFtcztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdmlzdWFsaXphdGlvbiBmb3IgbGF0ZXIgcmVmZXJlbmNlLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gb2YgdGhpcyBtYXJrIGZvciBjb21tZW50aW5nIHB1cnBvc2UuXG4gICAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGRhdGEgc291cmNlXG4gICAqL1xuICBkYXRhPzogRGF0YTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgZGF0YSB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyBmaWx0ZXIgYW5kIG5ldyBmaWVsZCBjYWxjdWxhdGlvbi5cbiAgICovXG4gIHRyYW5zZm9ybT86IFRyYW5zZm9ybVtdO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YU1peGlucyA9IHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCBkZXNjcmliaW5nIHRoZSBkYXRhIHNvdXJjZVxuICAgKi9cbiAgZGF0YTogRGF0YTtcbn07XG5cblxuLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI1MDMpOiBNYWtlIHRoaXMgZ2VuZXJpYyBzbyB3ZSBjYW4gc3VwcG9ydCBzb21lIGZvcm0gb2YgdG9wLWRvd24gc2l6aW5nLlxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRTaXplTWl4aW5zIHtcbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiBhIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBUaGlzIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHJ1bGVzOlxuICAgKlxuICAgKiAtIElmIGEgdmlldydzIFtgYXV0b3NpemVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCNhdXRvc2l6ZSkgdHlwZSBpcyBgXCJmaXRcImAgb3IgaXRzIHgtY2hhbm5lbCBoYXMgYSBbY29udGludW91cyBzY2FsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0aGUgd2lkdGggd2lsbCBiZSB0aGUgdmFsdWUgb2YgW2Bjb25maWcudmlldy53aWR0aGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gRm9yIHgtYXhpcyB3aXRoIGEgYmFuZCBvciBwb2ludCBzY2FsZTogaWYgW2ByYW5nZVN0ZXBgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkgaXMgYSBudW1lcmljIHZhbHVlIG9yIHVuc3BlY2lmaWVkLCB0aGUgd2lkdGggaXMgW2RldGVybWluZWQgYnkgdGhlIHJhbmdlIHN0ZXAsIHBhZGRpbmdzLCBhbmQgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBmaWVsZCBtYXBwZWQgdG8geC1jaGFubmVsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkuICAgT3RoZXJ3aXNlLCBpZiB0aGUgYHJhbmdlU3RlcGAgaXMgYG51bGxgLCB0aGUgd2lkdGggd2lsbCBiZSB0aGUgdmFsdWUgb2YgW2Bjb25maWcudmlldy53aWR0aGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gSWYgbm8gZmllbGQgaXMgbWFwcGVkIHRvIGB4YCBjaGFubmVsLCB0aGUgYHdpZHRoYCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBbYGNvbmZpZy5zY2FsZS50ZXh0WFJhbmdlU3RlcGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sI2RlZmF1bHQtd2lkdGgtYW5kLWhlaWdodCkgZm9yIGB0ZXh0YCBtYXJrIGFuZCB0aGUgdmFsdWUgb2YgYHJhbmdlU3RlcGAgZm9yIG90aGVyIG1hcmtzLlxuICAgKlxuICAgKiBfX05vdGU6X18gRm9yIHBsb3RzIHdpdGggW2Byb3dgIGFuZCBgY29sdW1uYCBjaGFubmVsc10oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9lbmNvZGluZy5odG1sI2ZhY2V0KSwgdGhpcyByZXByZXNlbnRzIHRoZSB3aWR0aCBvZiBhIHNpbmdsZSB2aWV3LlxuICAgKlxuICAgKiBfX1NlZSBhbHNvOl9fIFRoZSBkb2N1bWVudGF0aW9uIGZvciBbd2lkdGggYW5kIGhlaWdodF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zaXplLmh0bWwpIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMuXG4gICAqL1xuICB3aWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiBhIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfX1xuICAgKiAtIElmIGEgdmlldydzIFtgYXV0b3NpemVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NpemUuaHRtbCNhdXRvc2l6ZSkgdHlwZSBpcyBgXCJmaXRcImAgb3IgaXRzIHktY2hhbm5lbCBoYXMgYSBbY29udGludW91cyBzY2FsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zY2FsZS5odG1sI2NvbnRpbnVvdXMpLCB0aGUgaGVpZ2h0IHdpbGwgYmUgdGhlIHZhbHVlIG9mIFtgY29uZmlnLnZpZXcuaGVpZ2h0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwjY29uZmlnKS5cbiAgICogLSBGb3IgeS1heGlzIHdpdGggYSBiYW5kIG9yIHBvaW50IHNjYWxlOiBpZiBbYHJhbmdlU3RlcGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2NhbGUuaHRtbCNiYW5kKSBpcyBhIG51bWVyaWMgdmFsdWUgb3IgdW5zcGVjaWZpZWQsIHRoZSBoZWlnaHQgaXMgW2RldGVybWluZWQgYnkgdGhlIHJhbmdlIHN0ZXAsIHBhZGRpbmdzLCBhbmQgdGhlIGNhcmRpbmFsaXR5IG9mIHRoZSBmaWVsZCBtYXBwZWQgdG8geS1jaGFubmVsXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjYmFuZCkuIE90aGVyd2lzZSwgaWYgdGhlIGByYW5nZVN0ZXBgIGlzIGBudWxsYCwgdGhlIGhlaWdodCB3aWxsIGJlIHRoZSB2YWx1ZSBvZiBbYGNvbmZpZy52aWV3LmhlaWdodGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc3BlYy5odG1sI2NvbmZpZykuXG4gICAqIC0gSWYgbm8gZmllbGQgaXMgbWFwcGVkIHRvIGB5YCBjaGFubmVsLCB0aGUgYGhlaWdodGAgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHJhbmdlU3RlcGAuXG4gICAqXG4gICAqIF9fTm90ZV9fOiBGb3IgcGxvdHMgd2l0aCBbYHJvd2AgYW5kIGBjb2x1bW5gIGNoYW5uZWxzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2VuY29kaW5nLmh0bWwjZmFjZXQpLCB0aGlzIHJlcHJlc2VudHMgdGhlIGhlaWdodCBvZiBhIHNpbmdsZSB2aWV3LlxuICAgKlxuICAgKiBfX1NlZSBhbHNvOl9fIFRoZSBkb2N1bWVudGF0aW9uIGZvciBbd2lkdGggYW5kIGhlaWdodF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zaXplLmh0bWwpIGNvbnRhaW5zIG1vcmUgZXhhbXBsZXMuXG4gICAqL1xuICBoZWlnaHQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1VuaXRTcGVjPEUgZXh0ZW5kcyBFbmNvZGluZzxhbnk+LCBNPiBleHRlbmRzIEJhc2VTcGVjLCBMYXlvdXRTaXplTWl4aW5zIHtcblxuICAvKipcbiAgICogQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbWFyayB0eXBlIChvbmUgb2YgYFwiYmFyXCJgLCBgXCJjaXJjbGVcImAsIGBcInNxdWFyZVwiYCwgYFwidGlja1wiYCwgYFwibGluZVwiYCxcbiAgICogYFwiYXJlYVwiYCwgYFwicG9pbnRcImAsIGBcInJ1bGVcImAsIGBcImdlb3NoYXBlXCJgLCBhbmQgYFwidGV4dFwiYCkgb3IgYSBbbWFyayBkZWZpbml0aW9uIG9iamVjdF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9tYXJrLmh0bWwjbWFyay1kZWYpLlxuICAgKi9cbiAgbWFyazogTTtcblxuICAvKipcbiAgICogQSBrZXktdmFsdWUgbWFwcGluZyBiZXR3ZWVuIGVuY29kaW5nIGNoYW5uZWxzIGFuZCBkZWZpbml0aW9uIG9mIGZpZWxkcy5cbiAgICovXG4gIGVuY29kaW5nPzogRTtcblxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiBnZW9ncmFwaGljIHByb2plY3Rpb24sIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byBgc2hhcGVgIHBhdGggZm9yIGBcImdlb3NoYXBlXCJgIG1hcmtzXG4gICAqIGFuZCB0byBgbGF0aXR1ZGVgIGFuZCBgXCJsb25naXR1ZGVcImAgY2hhbm5lbHMgZm9yIG90aGVyIG1hcmtzLlxuICAgKi9cbiAgcHJvamVjdGlvbj86IFByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIEEga2V5LXZhbHVlIG1hcHBpbmcgYmV0d2VlbiBzZWxlY3Rpb24gbmFtZXMgYW5kIGRlZmluaXRpb25zLlxuICAgKi9cbiAgc2VsZWN0aW9uPzoge1tuYW1lOiBzdHJpbmddOiBTZWxlY3Rpb25EZWZ9O1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkVW5pdFNwZWMgPSBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPiwgTWFyayB8IE1hcmtEZWY+O1xuXG4vKipcbiAqIFVuaXQgc3BlYyB0aGF0IGNhbiBoYXZlIGEgY29tcG9zaXRlIG1hcmsuXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBvc2l0ZVVuaXRTcGVjID0gR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPHN0cmluZyB8IFJlcGVhdFJlZj4sIEFueU1hcms+O1xuXG4vKipcbiAqIFVuaXQgc3BlYyB0aGF0IGNhbiBoYXZlIGEgY29tcG9zaXRlIG1hcmsgYW5kIHJvdyBvciBjb2x1bW4gY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCB0eXBlIEZhY2V0ZWRDb21wb3NpdGVVbml0U3BlYyA9IEdlbmVyaWNVbml0U3BlYzxFbmNvZGluZ1dpdGhGYWNldDxzdHJpbmcgfCBSZXBlYXRSZWY+LCBBbnlNYXJrPjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljTGF5ZXJTcGVjPFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+PiBleHRlbmRzIEJhc2VTcGVjLCBMYXlvdXRTaXplTWl4aW5zIHtcbiAgLyoqXG4gICAqIExheWVyIG9yIHNpbmdsZSB2aWV3IHNwZWNpZmljYXRpb25zIHRvIGJlIGxheWVyZWQuXG4gICAqXG4gICAqIF9fTm90ZV9fOiBTcGVjaWZpY2F0aW9ucyBpbnNpZGUgYGxheWVyYCBjYW5ub3QgdXNlIGByb3dgIGFuZCBgY29sdW1uYCBjaGFubmVscyBhcyBsYXllcmluZyBmYWNldCBzcGVjaWZpY2F0aW9ucyBpcyBub3QgYWxsb3dlZC5cbiAgICovXG4gIGxheWVyOiAoR2VuZXJpY0xheWVyU3BlYzxVPiB8IFUpW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciBsYXllcnMuXG4gICAqL1xuICByZXNvbHZlPzogUmVzb2x2ZTtcbn1cblxuLyoqXG4gKiBMYXllciBTcGVjIHdpdGggZW5jb2RpbmcgYW5kIHByb2plY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZExheWVyU3BlYyBleHRlbmRzIEdlbmVyaWNMYXllclNwZWM8Q29tcG9zaXRlVW5pdFNwZWM+IHtcbiAgLyoqXG4gICAqIEEgc2hhcmVkIGtleS12YWx1ZSBtYXBwaW5nIGJldHdlZW4gZW5jb2RpbmcgY2hhbm5lbHMgYW5kIGRlZmluaXRpb24gb2YgZmllbGRzIGluIHRoZSB1bmRlcmx5aW5nIGxheWVycy5cbiAgICovXG4gIGVuY29kaW5nPzogRW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPjtcblxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgZGVmaW5pbmcgcHJvcGVydGllcyBvZiB0aGUgZ2VvZ3JhcGhpYyBwcm9qZWN0aW9uIHNoYXJlZCBieSB1bmRlcmx5aW5nIGxheWVycy5cbiAgICovXG4gIHByb2plY3Rpb24/OiBQcm9qZWN0aW9uO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkTGF5ZXJTcGVjID0gR2VuZXJpY0xheWVyU3BlYzxOb3JtYWxpemVkVW5pdFNwZWM+O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY0ZhY2V0U3BlYzxcbiAgVSBleHRlbmRzIEdlbmVyaWNVbml0U3BlYzxhbnksIGFueT4sXG4gIEwgZXh0ZW5kcyBHZW5lcmljTGF5ZXJTcGVjPGFueT5cbiAgPiBleHRlbmRzIEJhc2VTcGVjIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0aGF0IGRlc2NyaWJlcyBtYXBwaW5ncyBiZXR3ZWVuIGByb3dgIGFuZCBgY29sdW1uYCBjaGFubmVscyBhbmQgdGhlaXIgZmllbGQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBmYWNldDogRmFjZXRNYXBwaW5nPHN0cmluZyB8IFJlcGVhdFJlZj47XG5cbiAgLyoqXG4gICAqIEEgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdmlldyB0aGF0IGdldHMgZmFjZXRlZC5cbiAgICovXG4gIHNwZWM6IEwgfCBVO1xuICAvLyBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBHZW5lcmljU3BlYzxVPiBvbmNlIHdlIHN1cHBvcnQgYWxsIGNhc2VzO1xuXG4gIC8qKlxuICAgKiBTY2FsZSwgYXhpcywgYW5kIGxlZ2VuZCByZXNvbHV0aW9ucyBmb3IgZmFjZXRzLlxuICAgKi9cbiAgcmVzb2x2ZT86IFJlc29sdmU7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRGYWNldFNwZWMgPSBHZW5lcmljRmFjZXRTcGVjPE5vcm1hbGl6ZWRVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlYz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJpY1JlcGVhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHdoYXQgZmllbGRzIHNob3VsZCBiZSByZXBlYXRlZCBpbnRvIHZpZXdzIHRoYXQgYXJlIGxhaWQgb3V0IGFzIGEgYHJvd2Agb3IgYGNvbHVtbmAuXG4gICAqL1xuICByZXBlYXQ6IFJlcGVhdDtcblxuICBzcGVjOiBHZW5lcmljU3BlYzxVLCBMPjtcblxuICAvKipcbiAgICogU2NhbGUgYW5kIGxlZ2VuZCByZXNvbHV0aW9ucyBmb3IgcmVwZWF0ZWQgY2hhcnRzLlxuICAgKi9cbiAgcmVzb2x2ZT86IFJlc29sdmU7XG59XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRSZXBlYXRTcGVjID0gR2VuZXJpY1JlcGVhdFNwZWM8Tm9ybWFsaXplZFVuaXRTcGVjLCBOb3JtYWxpemVkTGF5ZXJTcGVjPjtcblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljVkNvbmNhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZpZXdzIHRoYXQgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBhbmQgcHV0IGludG8gYSBjb2x1bW4uXG4gICAqL1xuICB2Y29uY2F0OiAoR2VuZXJpY1NwZWM8VSwgTD4pW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciB2ZXJ0aWNhbGx5IGNvbmNhdGVuYXRlZCBjaGFydHMuXG4gICAqL1xuICByZXNvbHZlPzogUmVzb2x2ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljSENvbmNhdFNwZWM8XG4gIFUgZXh0ZW5kcyBHZW5lcmljVW5pdFNwZWM8YW55LCBhbnk+LFxuICBMIGV4dGVuZHMgR2VuZXJpY0xheWVyU3BlYzxhbnk+XG4+IGV4dGVuZHMgQmFzZVNwZWMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIHZpZXdzIHRoYXQgc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBhbmQgcHV0IGludG8gYSByb3cuXG4gICAqL1xuICBoY29uY2F0OiAoR2VuZXJpY1NwZWM8VSwgTD4pW107XG5cbiAgLyoqXG4gICAqIFNjYWxlLCBheGlzLCBhbmQgbGVnZW5kIHJlc29sdXRpb25zIGZvciBob3Jpem9udGFsbHkgY29uY2F0ZW5hdGVkIGNoYXJ0cy5cbiAgICovXG4gIHJlc29sdmU/OiBSZXNvbHZlO1xufVxuXG5leHBvcnQgdHlwZSBOb3JtYWxpemVkQ29uY2F0U3BlYyA9XG4gIEdlbmVyaWNWQ29uY2F0U3BlYzxOb3JtYWxpemVkVW5pdFNwZWMsIE5vcm1hbGl6ZWRMYXllclNwZWM+IHwgR2VuZXJpY0hDb25jYXRTcGVjPE5vcm1hbGl6ZWRVbml0U3BlYywgTm9ybWFsaXplZExheWVyU3BlYz47XG5cbmV4cG9ydCB0eXBlIEdlbmVyaWNTcGVjPFxuICBVIGV4dGVuZHMgR2VuZXJpY1VuaXRTcGVjPGFueSwgYW55PixcbiAgTCBleHRlbmRzIEdlbmVyaWNMYXllclNwZWM8YW55PlxuPiA9IFUgfCBMIHwgR2VuZXJpY0ZhY2V0U3BlYzxVLCBMPiB8IEdlbmVyaWNSZXBlYXRTcGVjPFUsIEw+IHxcbiAgR2VuZXJpY1ZDb25jYXRTcGVjPFUsIEw+IHxHZW5lcmljSENvbmNhdFNwZWM8VSwgTD47XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRTcGVjID0gR2VuZXJpY1NwZWM8Tm9ybWFsaXplZFVuaXRTcGVjLCBOb3JtYWxpemVkTGF5ZXJTcGVjPjtcblxuZXhwb3J0IHR5cGUgVG9wTGV2ZWxGYWNldGVkVW5pdFNwZWMgPSBUb3BMZXZlbDxGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWM+ICYgRGF0YU1peGlucztcbmV4cG9ydCB0eXBlIFRvcExldmVsRmFjZXRTcGVjID0gVG9wTGV2ZWw8R2VuZXJpY0ZhY2V0U3BlYzxDb21wb3NpdGVVbml0U3BlYywgRXh0ZW5kZWRMYXllclNwZWM+PiAmIERhdGFNaXhpbnM7XG5cbmV4cG9ydCB0eXBlIFRvcExldmVsU3BlYyA9IFRvcExldmVsRmFjZXRlZFVuaXRTcGVjIHwgVG9wTGV2ZWxGYWNldFNwZWMgfCBUb3BMZXZlbDxFeHRlbmRlZExheWVyU3BlYz4gfFxuVG9wTGV2ZWw8R2VuZXJpY1JlcGVhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj4gfCBUb3BMZXZlbDxHZW5lcmljVkNvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj4gfCBUb3BMZXZlbDxHZW5lcmljSENvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPj47XG5cbi8qIEN1c3RvbSB0eXBlIGd1YXJkcyAqL1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZhY2V0U3BlYyhzcGVjOiBCYXNlU3BlYyk6IHNwZWMgaXMgR2VuZXJpY0ZhY2V0U3BlYzxhbnksIGFueT4ge1xuICByZXR1cm4gc3BlY1snZmFjZXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNVbml0U3BlYyhzcGVjOiBCYXNlU3BlYyk6IHNwZWMgaXMgRmFjZXRlZENvbXBvc2l0ZVVuaXRTcGVjIHwgTm9ybWFsaXplZFVuaXRTcGVjIHtcbiAgcmV0dXJuICEhc3BlY1snbWFyayddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllclNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNMYXllclNwZWM8YW55PiB7XG4gIHJldHVybiBzcGVjWydsYXllciddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlcGVhdFNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNSZXBlYXRTcGVjPGFueSwgYW55PiB7XG4gIHJldHVybiBzcGVjWydyZXBlYXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb25jYXRTcGVjKHNwZWM6IEJhc2VTcGVjKTpcbiAgc3BlYyBpcyBHZW5lcmljVkNvbmNhdFNwZWM8YW55LCBhbnk+IHxcbiAgICBHZW5lcmljSENvbmNhdFNwZWM8YW55LCBhbnk+IHtcbiAgcmV0dXJuIGlzVkNvbmNhdFNwZWMoc3BlYykgfHwgaXNIQ29uY2F0U3BlYyhzcGVjKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVkNvbmNhdFNwZWMoc3BlYzogQmFzZVNwZWMpOiBzcGVjIGlzIEdlbmVyaWNWQ29uY2F0U3BlYzxhbnksIGFueT4ge1xuICByZXR1cm4gc3BlY1sndmNvbmNhdCddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hDb25jYXRTcGVjKHNwZWM6IEJhc2VTcGVjKTogc3BlYyBpcyBHZW5lcmljSENvbmNhdFNwZWM8YW55LCBhbnk+IHtcbiAgcmV0dXJuIHNwZWNbJ2hjb25jYXQnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIERlY29tcG9zZSBleHRlbmRlZCB1bml0IHNwZWNzIGludG8gY29tcG9zaXRpb24gb2YgcHVyZSB1bml0IHNwZWNzLlxuICovXG4vLyBUT0RPOiBjb25zaWRlciBtb3ZpbmcgdGhpcyB0byBhbm90aGVyIGZpbGUuICBNYXliZSB2bC5zcGVjLm5vcm1hbGl6ZSBvciB2bC5ub3JtYWxpemVcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoc3BlYzogVG9wTGV2ZWxTcGVjIHwgR2VuZXJpY1NwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiB8IEZhY2V0ZWRDb21wb3NpdGVVbml0U3BlYywgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkU3BlYyB7XG4gIGlmIChpc0ZhY2V0U3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBub3JtYWxpemVGYWNldChzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc0xheWVyU3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBub3JtYWxpemVMYXllcihzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc1JlcGVhdFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplUmVwZWF0KHNwZWMsIGNvbmZpZyk7XG4gIH1cbiAgaWYgKGlzVkNvbmNhdFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplVkNvbmNhdChzcGVjLCBjb25maWcpO1xuICB9XG4gIGlmIChpc0hDb25jYXRTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZUhDb25jYXQoc3BlYywgY29uZmlnKTtcbiAgfVxuICBpZiAoaXNVbml0U3BlYyhzcGVjKSkge1xuICAgIGNvbnN0IGhhc1JvdyA9IGNoYW5uZWxIYXNGaWVsZChzcGVjLmVuY29kaW5nLCBST1cpO1xuICAgIGNvbnN0IGhhc0NvbHVtbiA9IGNoYW5uZWxIYXNGaWVsZChzcGVjLmVuY29kaW5nLCBDT0xVTU4pO1xuXG4gICAgaWYgKGhhc1JvdyB8fCBoYXNDb2x1bW4pIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVGYWNldGVkVW5pdChzcGVjLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplTm9uRmFjZXRVbml0KHNwZWMsIGNvbmZpZyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLklOVkFMSURfU1BFQyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZhY2V0KHNwZWM6IEdlbmVyaWNGYWNldFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiwgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkRmFjZXRTcGVjIHtcbiAgY29uc3Qge3NwZWM6IHN1YnNwZWMsIC4uLnJlc3R9ID0gc3BlYztcbiAgcmV0dXJuIHtcbiAgICAuLi5yZXN0LFxuICAgIC8vIFRPRE86IHJlbW92ZSBcImFueVwiIG9uY2Ugd2Ugc3VwcG9ydCBhbGwgZmFjZXQgbGlzdGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjc2MFxuICAgIHNwZWM6IG5vcm1hbGl6ZShzdWJzcGVjLCBjb25maWcpIGFzIGFueVxuICB9O1xufVxuXG5mdW5jdGlvbiBtZXJnZUVuY29kaW5nKG9wdDoge3BhcmVudEVuY29kaW5nOiBFbmNvZGluZzxhbnk+LCBlbmNvZGluZzogRW5jb2Rpbmc8YW55Pn0pOiBFbmNvZGluZzxhbnk+IHtcbiAgY29uc3Qge3BhcmVudEVuY29kaW5nLCBlbmNvZGluZ30gPSBvcHQ7XG4gIGlmIChwYXJlbnRFbmNvZGluZyAmJiBlbmNvZGluZykge1xuICAgIGNvbnN0IG92ZXJyaWRlbiA9IGtleXMocGFyZW50RW5jb2RpbmcpLnJlZHVjZSgobywga2V5KSA9PiB7XG4gICAgICBpZiAoZW5jb2Rpbmdba2V5XSkge1xuICAgICAgICBvLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvO1xuICAgIH0sIFtdKTtcblxuICAgIGlmIChvdmVycmlkZW4ubGVuZ3RoID4gMCkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZW5jb2RpbmdPdmVycmlkZGVuKG92ZXJyaWRlbikpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG1lcmdlZCA9IHtcbiAgICAuLi4ocGFyZW50RW5jb2RpbmcgfHwge30pLFxuICAgIC4uLihlbmNvZGluZyB8fCB7fSlcbiAgfTtcbiAgcmV0dXJuIGtleXMobWVyZ2VkKS5sZW5ndGggPiAwID8gbWVyZ2VkIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb2plY3Rpb24ob3B0OiB7cGFyZW50UHJvamVjdGlvbjogUHJvamVjdGlvbiwgcHJvamVjdGlvbjogUHJvamVjdGlvbn0pIHtcbiAgY29uc3Qge3BhcmVudFByb2plY3Rpb24sIHByb2plY3Rpb259ID0gb3B0O1xuICBpZiAocGFyZW50UHJvamVjdGlvbiAmJiBwcm9qZWN0aW9uKSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UucHJvamVjdGlvbk92ZXJyaWRkZW4oe3BhcmVudFByb2plY3Rpb24sIHByb2plY3Rpb259KSk7XG4gIH1cbiAgcmV0dXJuIHByb2plY3Rpb24gfHwgcGFyZW50UHJvamVjdGlvbjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGF5ZXIoXG4gIHNwZWM6IEV4dGVuZGVkTGF5ZXJTcGVjLFxuICBjb25maWc6IENvbmZpZyxcbiAgcGFyZW50RW5jb2Rpbmc/OiBFbmNvZGluZzxzdHJpbmcgfCBSZXBlYXRSZWY+LFxuICBwYXJlbnRQcm9qZWN0aW9uPzogUHJvamVjdGlvblxuKTogTm9ybWFsaXplZExheWVyU3BlYyB7XG4gIGNvbnN0IHtsYXllciwgZW5jb2RpbmcsIHByb2plY3Rpb24sIC4uLnJlc3R9ID0gc3BlYztcbiAgY29uc3QgbWVyZ2VkRW5jb2RpbmcgPSBtZXJnZUVuY29kaW5nKHtwYXJlbnRFbmNvZGluZywgZW5jb2Rpbmd9KTtcbiAgY29uc3QgbWVyZ2VkUHJvamVjdGlvbiA9IG1lcmdlUHJvamVjdGlvbih7cGFyZW50UHJvamVjdGlvbiwgcHJvamVjdGlvbn0pO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgbGF5ZXI6IGxheWVyLm1hcCgoc3Vic3BlYykgPT4ge1xuICAgICAgaWYgKGlzTGF5ZXJTcGVjKHN1YnNwZWMpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVMYXllcihzdWJzcGVjLCBjb25maWcsIG1lcmdlZEVuY29kaW5nLCBtZXJnZWRQcm9qZWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub3JtYWxpemVOb25GYWNldFVuaXQoc3Vic3BlYywgY29uZmlnLCBtZXJnZWRFbmNvZGluZywgbWVyZ2VkUHJvamVjdGlvbik7XG4gICAgfSlcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVwZWF0KHNwZWM6IEdlbmVyaWNSZXBlYXRTcGVjPENvbXBvc2l0ZVVuaXRTcGVjLCBFeHRlbmRlZExheWVyU3BlYz4sIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZFJlcGVhdFNwZWMge1xuICBjb25zdCB7c3BlYzogc3Vic3BlYywgLi4ucmVzdH0gPSBzcGVjO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgc3BlYzogbm9ybWFsaXplKHN1YnNwZWMsIGNvbmZpZylcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVkNvbmNhdChzcGVjOiBHZW5lcmljVkNvbmNhdFNwZWM8Q29tcG9zaXRlVW5pdFNwZWMsIEV4dGVuZGVkTGF5ZXJTcGVjPiwgY29uZmlnOiBDb25maWcpOiBOb3JtYWxpemVkQ29uY2F0U3BlYyB7XG4gIGNvbnN0IHt2Y29uY2F0OiB2Y29uY2F0LCAuLi5yZXN0fSA9IHNwZWM7XG4gIHJldHVybiB7XG4gICAgLi4ucmVzdCxcbiAgICB2Y29uY2F0OiB2Y29uY2F0Lm1hcCgoc3Vic3BlYykgPT4gbm9ybWFsaXplKHN1YnNwZWMsIGNvbmZpZykpXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUhDb25jYXQoc3BlYzogR2VuZXJpY0hDb25jYXRTcGVjPENvbXBvc2l0ZVVuaXRTcGVjLCBFeHRlbmRlZExheWVyU3BlYz4sIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZENvbmNhdFNwZWMge1xuICBjb25zdCB7aGNvbmNhdDogaGNvbmNhdCwgLi4ucmVzdH0gPSBzcGVjO1xuICByZXR1cm4ge1xuICAgIC4uLnJlc3QsXG4gICAgaGNvbmNhdDogaGNvbmNhdC5tYXAoKHN1YnNwZWMpID0+IG5vcm1hbGl6ZShzdWJzcGVjLCBjb25maWcpKVxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGYWNldGVkVW5pdChzcGVjOiBGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWMsIGNvbmZpZzogQ29uZmlnKTogTm9ybWFsaXplZEZhY2V0U3BlYyB7XG4gIC8vIE5ldyBlbmNvZGluZyBpbiB0aGUgaW5zaWRlIHNwZWMgc2hvdWxkIG5vdCBjb250YWluIHJvdyAvIGNvbHVtblxuICAvLyBhcyByb3cvY29sdW1uIHNob3VsZCBiZSBtb3ZlZCB0byBmYWNldFxuICBjb25zdCB7cm93OiByb3csIGNvbHVtbjogY29sdW1uLCAuLi5lbmNvZGluZ30gPSBzcGVjLmVuY29kaW5nO1xuXG4gIC8vIE1hcmsgYW5kIGVuY29kaW5nIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZSBpbm5lciBzcGVjXG4gIGNvbnN0IHttYXJrLCB3aWR0aCwgcHJvamVjdGlvbiwgaGVpZ2h0LCBzZWxlY3Rpb24sIGVuY29kaW5nOiBfLCAuLi5vdXRlclNwZWN9ID0gc3BlYztcblxuICByZXR1cm4ge1xuICAgIC4uLm91dGVyU3BlYyxcbiAgICBmYWNldDoge1xuICAgICAgLi4uKHJvdyA/IHtyb3d9IDoge30pLFxuICAgICAgLi4uKGNvbHVtbiA/IHtjb2x1bW59OiB7fSksXG4gICAgfSxcbiAgICBzcGVjOiBub3JtYWxpemVOb25GYWNldFVuaXQoe1xuICAgICAgLi4uKHByb2plY3Rpb24gPyB7cHJvamVjdGlvbn0gOiB7fSksXG4gICAgICBtYXJrLFxuICAgICAgLi4uKHdpZHRoID8ge3dpZHRofSA6IHt9KSxcbiAgICAgIC4uLihoZWlnaHQgPyB7aGVpZ2h0fSA6IHt9KSxcbiAgICAgIGVuY29kaW5nLFxuICAgICAgLi4uKHNlbGVjdGlvbiA/IHtzZWxlY3Rpb259IDoge30pXG4gICAgfSwgY29uZmlnKVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc05vbkZhY2V0VW5pdFNwZWNXaXRoUHJpbWl0aXZlTWFyayhzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8RmllbGQ+LCBBbnlNYXJrPik6XG4gIHNwZWMgaXMgR2VuZXJpY1VuaXRTcGVjPEVuY29kaW5nPEZpZWxkPiwgTWFyaz4ge1xuICAgIHJldHVybiBpc1ByaW1pdGl2ZU1hcmsoc3BlYy5tYXJrKTtcbn1cblxuZnVuY3Rpb24gZ2V0UG9pbnRPdmVybGF5KG1hcmtEZWY6IE1hcmtEZWYsIG1hcmtDb25maWc6IExpbmVDb25maWcsIGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4pOiBNYXJrQ29uZmlnIHtcbiAgaWYgKG1hcmtEZWYucG9pbnQgPT09ICd0cmFuc3BhcmVudCcpIHtcbiAgICByZXR1cm4ge29wYWNpdHk6IDB9O1xuICB9IGVsc2UgaWYgKG1hcmtEZWYucG9pbnQpIHsgLy8gdHJ1dGh5IDogdHJ1ZSBvciBvYmplY3RcbiAgICByZXR1cm4gaXNPYmplY3QobWFya0RlZi5wb2ludCkgPyBtYXJrRGVmLnBvaW50IDoge307XG4gIH0gZWxzZSBpZiAobWFya0RlZi5wb2ludCAhPT0gdW5kZWZpbmVkKSB7IC8vIGZhbHNlIG9yIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHsgLy8gdW5kZWZpbmVkIChub3QgZGlzYWJsZWQpXG4gICAgaWYgKG1hcmtDb25maWcucG9pbnQgfHwgZW5jb2Rpbmcuc2hhcGUpIHtcbiAgICAgIC8vIGVuYWJsZSBwb2ludCBvdmVybGF5IGlmIGNvbmZpZ1ttYXJrXS5wb2ludCBpcyB0cnV0aHkgb3IgaWYgZW5jb2Rpbmcuc2hhcGUgaXMgcHJvdmlkZWRcbiAgICAgIHJldHVybiBpc09iamVjdChtYXJrQ29uZmlnLnBvaW50KSA/IG1hcmtDb25maWcucG9pbnQgOiB7fTtcbiAgICB9XG4gICAgLy8gbWFya0RlZi5wb2ludCBpcyBkZWZpbmVkIGFzIGZhbHN5XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0TGluZU92ZXJsYXkobWFya0RlZjogTWFya0RlZiwgbWFya0NvbmZpZzogQXJlYUNvbmZpZyk6IE1hcmtDb25maWcge1xuICBpZiAobWFya0RlZi5saW5lKSB7IC8vIHRydWUgb3Igb2JqZWN0XG4gICAgcmV0dXJuIG1hcmtEZWYubGluZSA9PT0gdHJ1ZSA/IHt9IDogbWFya0RlZi5saW5lO1xuICB9IGVsc2UgaWYgKG1hcmtEZWYubGluZSAhPT0gdW5kZWZpbmVkKSB7IC8vIGZhbHNlIG9yIG51bGxcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHsgLy8gdW5kZWZpbmVkIChub3QgZGlzYWJsZWQpXG4gICAgaWYgKG1hcmtDb25maWcubGluZSkge1xuICAgICAgLy8gZW5hYmxlIGxpbmUgb3ZlcmxheSBpZiBjb25maWdbbWFya10ubGluZSBpcyB0cnV0aHlcbiAgICAgIHJldHVybiBtYXJrQ29uZmlnLmxpbmUgPT09IHRydWUgPyB7fSA6IG1hcmtDb25maWcubGluZTtcbiAgICB9XG4gICAgLy8gbWFya0RlZi5wb2ludCBpcyBkZWZpbmVkIGFzIGZhbHN5XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTm9uRmFjZXRVbml0KFxuICBzcGVjOiBHZW5lcmljVW5pdFNwZWM8RW5jb2Rpbmc8RmllbGQ+LCBBbnlNYXJrPiwgY29uZmlnOiBDb25maWcsXG4gIHBhcmVudEVuY29kaW5nPzogRW5jb2Rpbmc8c3RyaW5nIHwgUmVwZWF0UmVmPiwgcGFyZW50UHJvamVjdGlvbj86IFByb2plY3Rpb25cbik6IE5vcm1hbGl6ZWRVbml0U3BlYyB8IE5vcm1hbGl6ZWRMYXllclNwZWMge1xuICBjb25zdCB7ZW5jb2RpbmcsIHByb2plY3Rpb259ID0gc3BlYztcbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG5cblxuICAvLyBtZXJnZSBwYXJlbnQgZW5jb2RpbmcgLyBwcm9qZWN0aW9uIGZpcnN0XG4gIGlmIChwYXJlbnRFbmNvZGluZyB8fCBwYXJlbnRQcm9qZWN0aW9uKSB7XG4gICAgY29uc3QgbWVyZ2VkUHJvamVjdGlvbiA9IG1lcmdlUHJvamVjdGlvbih7cGFyZW50UHJvamVjdGlvbiwgcHJvamVjdGlvbn0pO1xuICAgIGNvbnN0IG1lcmdlZEVuY29kaW5nID0gbWVyZ2VFbmNvZGluZyh7cGFyZW50RW5jb2RpbmcsIGVuY29kaW5nfSk7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU5vbkZhY2V0VW5pdCh7XG4gICAgICAuLi5zcGVjLFxuICAgICAgLi4uKG1lcmdlZFByb2plY3Rpb24gPyB7cHJvamVjdGlvbjogbWVyZ2VkUHJvamVjdGlvbn0gOiB7fSksXG4gICAgICAuLi4obWVyZ2VkRW5jb2RpbmcgPyB7ZW5jb2Rpbmc6IG1lcmdlZEVuY29kaW5nfSA6IHt9KSxcbiAgICB9LCBjb25maWcpO1xuICB9XG5cbiAgaWYgKGlzTm9uRmFjZXRVbml0U3BlY1dpdGhQcmltaXRpdmVNYXJrKHNwZWMpKSB7XG4gICAgLy8gVE9ETzogdGhvcm91Z2hseSB0ZXN0XG4gICAgaWYgKGlzUmFuZ2VkKGVuY29kaW5nKSkge1xuICAgICAgcmV0dXJuIG5vcm1hbGl6ZVJhbmdlZFVuaXQoc3BlYyk7XG4gICAgfVxuXG4gICAgaWYgKG1hcmsgPT09ICdsaW5lJyAmJiAoZW5jb2RpbmcueDIgfHwgZW5jb2RpbmcueTIpKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5saW5lV2l0aFJhbmdlKCEhZW5jb2RpbmcueDIsICEhZW5jb2RpbmcueTIpKTtcblxuICAgICAgcmV0dXJuIG5vcm1hbGl6ZU5vbkZhY2V0VW5pdCh7XG4gICAgICAgIG1hcms6ICdydWxlJyxcbiAgICAgICAgLi4uc3BlY1xuICAgICAgfSwgY29uZmlnLCBwYXJlbnRFbmNvZGluZywgcGFyZW50UHJvamVjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGlzUGF0aE1hcmsobWFyaykpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVQYXRoT3ZlcmxheShzcGVjLCBjb25maWcpO1xuICAgIH1cblxuICAgIHJldHVybiBzcGVjOyAvLyBOb3RoaW5nIHRvIG5vcm1hbGl6ZVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb21wb3NpdGVNYXJrLm5vcm1hbGl6ZShzcGVjLCBjb25maWcpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmdlZFVuaXQoc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjKSB7XG4gIGNvbnN0IGhhc1ggPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWCk7XG4gIGNvbnN0IGhhc1kgPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWSk7XG4gIGNvbnN0IGhhc1gyID0gY2hhbm5lbEhhc0ZpZWxkKHNwZWMuZW5jb2RpbmcsIFgyKTtcbiAgY29uc3QgaGFzWTIgPSBjaGFubmVsSGFzRmllbGQoc3BlYy5lbmNvZGluZywgWTIpO1xuICBpZiAoKGhhc1gyICYmICFoYXNYKSB8fCAoaGFzWTIgJiYgIWhhc1kpKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNwZWMgPSBkdXBsaWNhdGUoc3BlYyk7XG4gICAgaWYgKGhhc1gyICYmICFoYXNYKSB7XG4gICAgICBub3JtYWxpemVkU3BlYy5lbmNvZGluZy54ID0gbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueDI7XG4gICAgICBkZWxldGUgbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueDI7XG4gICAgfVxuICAgIGlmIChoYXNZMiAmJiAhaGFzWSkge1xuICAgICAgbm9ybWFsaXplZFNwZWMuZW5jb2RpbmcueSA9IG5vcm1hbGl6ZWRTcGVjLmVuY29kaW5nLnkyO1xuICAgICAgZGVsZXRlIG5vcm1hbGl6ZWRTcGVjLmVuY29kaW5nLnkyO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkU3BlYztcbiAgfVxuICByZXR1cm4gc3BlYztcbn1cblxuZnVuY3Rpb24gZHJvcExpbmVBbmRQb2ludChtYXJrRGVmOiBNYXJrRGVmKTogTWFya0RlZiB8IE1hcmsge1xuICBjb25zdCB7cG9pbnQ6IF9wb2ludCwgbGluZTogX2xpbmUsIC4uLm1hcmt9ID0gbWFya0RlZjtcblxuICByZXR1cm4ga2V5cyhtYXJrKS5sZW5ndGggPiAxID8gbWFyayA6IG1hcmsudHlwZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUGF0aE92ZXJsYXkoc3BlYzogTm9ybWFsaXplZFVuaXRTcGVjLCBjb25maWc6IENvbmZpZyA9IHt9KTogTm9ybWFsaXplZExheWVyU3BlYyB8IE5vcm1hbGl6ZWRVbml0U3BlYyB7XG5cbiAgLy8gXyBpcyB1c2VkIHRvIGRlbm90ZSBhIGRyb3BwZWQgcHJvcGVydHkgb2YgdGhlIHVuaXQgc3BlY1xuICAvLyB3aGljaCBzaG91bGQgbm90IGJlIGNhcnJpZWQgb3ZlciB0byB0aGUgbGF5ZXIgc3BlY1xuICBjb25zdCB7c2VsZWN0aW9uLCBwcm9qZWN0aW9uLCBlbmNvZGluZywgbWFyaywgLi4ub3V0ZXJTcGVjfSA9IHNwZWM7XG4gIGNvbnN0IG1hcmtEZWYgPSBpc01hcmtEZWYobWFyaykgPyBtYXJrIDoge3R5cGU6IG1hcmt9O1xuXG4gIGNvbnN0IHBvaW50T3ZlcmxheSA9IGdldFBvaW50T3ZlcmxheShtYXJrRGVmLCBjb25maWdbbWFya0RlZi50eXBlXSwgZW5jb2RpbmcpO1xuICBjb25zdCBsaW5lT3ZlcmxheSA9IG1hcmtEZWYudHlwZSA9PT0gJ2FyZWEnICYmIGdldExpbmVPdmVybGF5KG1hcmtEZWYsIGNvbmZpZ1ttYXJrRGVmLnR5cGVdKTtcblxuICBpZiAoIXBvaW50T3ZlcmxheSAmJiAhbGluZU92ZXJsYXkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3BlYyxcbiAgICAgIC8vIERvIG5vdCBpbmNsdWRlIHBvaW50IC8gbGluZSBvdmVybGF5IGluIHRoZSBub3JtYWxpemUgc3BlY1xuICAgICAgbWFyazogZHJvcExpbmVBbmRQb2ludChtYXJrRGVmKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBsYXllcjogTm9ybWFsaXplZFVuaXRTcGVjW10gPSBbe1xuICAgIC4uLihzZWxlY3Rpb24gPyB7c2VsZWN0aW9ufSA6IHt9KSxcbiAgICAvLyBEbyBub3QgaW5jbHVkZSBwb2ludCAvIGxpbmUgb3ZlcmxheSBpbiB0aGUgbm9ybWFsaXplIHNwZWNcbiAgICBtYXJrOiBkcm9wTGluZUFuZFBvaW50KHtcbiAgICAgIC4uLm1hcmtEZWYsXG4gICAgICAvLyBtYWtlIGFyZWEgbWFyayB0cmFuc2x1Y2VudCBieSBkZWZhdWx0XG4gICAgICAvLyBUT0RPOiBleHRyYWN0IHRoaXMgMC43IHRvIGJlIHNoYXJlZCB3aXRoIGRlZmF1bHQgb3BhY2l0eSBmb3IgcG9pbnQvdGljay8uLi5cbiAgICAgIC4uLihtYXJrRGVmLnR5cGUgPT09ICdhcmVhJyA/IHtvcGFjaXR5OiAwLjd9IDoge30pLFxuICAgIH0pLFxuICAgIC8vIGRyb3Agc2hhcGUgZnJvbSBlbmNvZGluZyBhcyB0aGlzIG1pZ2h0IGJlIHVzZWQgdG8gdHJpZ2dlciBwb2ludCBvdmVybGF5XG4gICAgZW5jb2Rpbmc6IG9taXQoZW5jb2RpbmcsIFsnc2hhcGUnXSlcbiAgfV07XG5cbiAgLy8gRklYTUU6IGRpc2FibGUgdG9vbHRpcCBmb3IgdGhlIGxpbmUgbGF5ZXIgaWYgdG9vbHRpcCBpcyBub3QgZ3JvdXAtYnkgZmllbGQuXG4gIC8vIEZJWE1FOiBkZXRlcm1pbmUgcnVsZXMgZm9yIGFwcGx5aW5nIHNlbGVjdGlvbnMuXG5cbiAgLy8gTmVlZCB0byBjb3B5IHN0YWNrIGNvbmZpZyB0byBvdmVybGF5ZWQgbGF5ZXJcbiAgY29uc3Qgc3RhY2tQcm9wcyA9IHN0YWNrKG1hcmtEZWYsIGVuY29kaW5nLCBjb25maWcgPyBjb25maWcuc3RhY2sgOiB1bmRlZmluZWQpO1xuXG4gIGxldCBvdmVybGF5RW5jb2RpbmcgPSBlbmNvZGluZztcbiAgaWYgKHN0YWNrUHJvcHMpIHtcbiAgICBjb25zdCB7ZmllbGRDaGFubmVsOiBzdGFja0ZpZWxkQ2hhbm5lbCwgb2Zmc2V0fSA9IHN0YWNrUHJvcHM7XG4gICAgb3ZlcmxheUVuY29kaW5nID0ge1xuICAgICAgLi4uZW5jb2RpbmcsXG4gICAgICBbc3RhY2tGaWVsZENoYW5uZWxdOiB7XG4gICAgICAgIC4uLmVuY29kaW5nW3N0YWNrRmllbGRDaGFubmVsXSxcbiAgICAgICAgLi4uKG9mZnNldCA/IHtzdGFjazogb2Zmc2V0fSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBpZiAobGluZU92ZXJsYXkpIHtcbiAgICBjb25zdCB7aW50ZXJwb2xhdGV9ID0gbWFya0RlZjtcbiAgICBsYXllci5wdXNoKHtcbiAgICAgIC4uLihwcm9qZWN0aW9uID8ge3Byb2plY3Rpb259IDoge30pLFxuICAgICAgbWFyazoge1xuICAgICAgICB0eXBlOiAnbGluZScsXG4gICAgICAgIC4uLmxpbmVPdmVybGF5LFxuICAgICAgICAuLi4oaW50ZXJwb2xhdGUgPyB7aW50ZXJwb2xhdGV9IDoge30pXG4gICAgICB9LFxuICAgICAgZW5jb2Rpbmc6IG92ZXJsYXlFbmNvZGluZ1xuICAgIH0pO1xuICB9XG4gIGlmIChwb2ludE92ZXJsYXkpIHtcbiAgICBsYXllci5wdXNoKHtcbiAgICAgIC4uLihwcm9qZWN0aW9uID8ge3Byb2plY3Rpb259IDoge30pLFxuICAgICAgbWFyazoge1xuICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICBvcGFjaXR5OiAxLFxuICAgICAgICBmaWxsZWQ6IHRydWUsXG4gICAgICAgIC4uLnBvaW50T3ZlcmxheVxuICAgICAgfSxcbiAgICAgIGVuY29kaW5nOiBvdmVybGF5RW5jb2RpbmdcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub3V0ZXJTcGVjLFxuICAgIGxheWVyXG4gIH07XG59XG5cbi8vIFRPRE86IGFkZCB2bC5zcGVjLnZhbGlkYXRlICYgbW92ZSBzdHVmZiBmcm9tIHZsLnZhbGlkYXRlIHRvIGhlcmVcblxuLyogQWNjdW11bGF0ZSBub24tZHVwbGljYXRlIGZpZWxkRGVmcyBpbiBhIGRpY3Rpb25hcnkgKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGUoZGljdDogYW55LCBkZWZzOiBGaWVsZERlZjxGaWVsZD5bXSk6IGFueSB7XG4gIGRlZnMuZm9yRWFjaChmdW5jdGlvbihmaWVsZERlZikge1xuICAgIC8vIENvbnNpZGVyIG9ubHkgcHVyZSBmaWVsZERlZiBwcm9wZXJ0aWVzIChpZ25vcmluZyBzY2FsZSwgYXhpcywgbGVnZW5kKVxuICAgIGNvbnN0IHB1cmVGaWVsZERlZiA9IFsnZmllbGQnLCAndHlwZScsICd2YWx1ZScsICd0aW1lVW5pdCcsICdiaW4nLCAnYWdncmVnYXRlJ10ucmVkdWNlKChmLCBrZXkpID0+IHtcbiAgICAgIGlmIChmaWVsZERlZltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZltrZXldID0gZmllbGREZWZba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmO1xuICAgIH0sIHt9KTtcbiAgICBjb25zdCBrZXkgPSBoYXNoKHB1cmVGaWVsZERlZik7XG4gICAgZGljdFtrZXldID0gZGljdFtrZXldIHx8IGZpZWxkRGVmO1xuICB9KTtcbiAgcmV0dXJuIGRpY3Q7XG59XG5cbi8qIFJlY3Vyc2l2ZWx5IGdldCBmaWVsZERlZnMgZnJvbSBhIHNwZWMsIHJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIGZpZWxkRGVmcyAqL1xuZnVuY3Rpb24gZmllbGREZWZJbmRleDxUPihzcGVjOiBHZW5lcmljU3BlYzxhbnksIGFueT4sIGRpY3Q6IERpY3Q8RmllbGREZWY8VD4+ID0ge30pOiBEaWN0PEZpZWxkRGVmPFQ+PiB7XG4gIC8vIEZJWE1FKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjIwNyk6IFN1cHBvcnQgZmllbGREZWZJbmRleCBmb3IgcmVwZWF0XG4gIGlmIChpc0xheWVyU3BlYyhzcGVjKSkge1xuICAgIHNwZWMubGF5ZXIuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICBpZiAoaXNVbml0U3BlYyhsYXllcikpIHtcbiAgICAgICAgYWNjdW11bGF0ZShkaWN0LCB2bEVuY29kaW5nLmZpZWxkRGVmcyhsYXllci5lbmNvZGluZykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmllbGREZWZJbmRleChsYXllciwgZGljdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNGYWNldFNwZWMoc3BlYykpIHtcbiAgICBhY2N1bXVsYXRlKGRpY3QsIHZsRW5jb2RpbmcuZmllbGREZWZzKHNwZWMuZmFjZXQpKTtcbiAgICBmaWVsZERlZkluZGV4KHNwZWMuc3BlYywgZGljdCk7XG4gIH0gZWxzZSBpZiAoaXNSZXBlYXRTcGVjKHNwZWMpKSB7XG4gICAgZmllbGREZWZJbmRleChzcGVjLnNwZWMsIGRpY3QpO1xuICB9IGVsc2UgaWYgKGlzQ29uY2F0U3BlYyhzcGVjKSkge1xuICAgIGNvbnN0IGNoaWxkU3BlYyA9IGlzVkNvbmNhdFNwZWMoc3BlYykgPyBzcGVjLnZjb25jYXQgOiBzcGVjLmhjb25jYXQ7XG4gICAgY2hpbGRTcGVjLmZvckVhY2goY2hpbGQgPT4gZmllbGREZWZJbmRleChjaGlsZCwgZGljdCkpO1xuICB9IGVsc2UgeyAvLyBVbml0IFNwZWNcbiAgICBhY2N1bXVsYXRlKGRpY3QsIHZsRW5jb2RpbmcuZmllbGREZWZzKHNwZWMuZW5jb2RpbmcpKTtcbiAgfVxuICByZXR1cm4gZGljdDtcbn1cblxuLyogUmV0dXJucyBhbGwgbm9uLWR1cGxpY2F0ZSBmaWVsZERlZnMgaW4gYSBzcGVjIGluIGEgZmxhdCBhcnJheSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkRGVmcyhzcGVjOiBHZW5lcmljU3BlYzxhbnksIGFueT4pOiBGaWVsZERlZjxhbnk+W10ge1xuICByZXR1cm4gdmFscyhmaWVsZERlZkluZGV4KHNwZWMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RhY2tlZChzcGVjOiBUb3BMZXZlbDxGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWM+LCBjb25maWc/OiBDb25maWcpOiBib29sZWFuIHtcbiAgY29uZmlnID0gY29uZmlnIHx8IHNwZWMuY29uZmlnO1xuICBpZiAoaXNQcmltaXRpdmVNYXJrKHNwZWMubWFyaykpIHtcbiAgICByZXR1cm4gc3RhY2soc3BlYy5tYXJrLCBzcGVjLmVuY29kaW5nLFxuICAgICAgICAgICAgY29uZmlnID8gY29uZmlnLnN0YWNrIDogdW5kZWZpbmVkXG4gICAgICAgICAgKSAhPT0gbnVsbDtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isString } from 'vega-util';\nimport * as log from './log';\nfunction _normalizeAutoSize(autosize) {\n return isString(autosize) ? { type: autosize } : autosize || {};\n}\nexport function normalizeAutoSize(topLevelAutosize, configAutosize, isUnitOrLayer) {\n if (isUnitOrLayer === void 0) { isUnitOrLayer = true; }\n var autosize = tslib_1.__assign({ type: 'pad' }, _normalizeAutoSize(configAutosize), _normalizeAutoSize(topLevelAutosize));\n if (autosize.type === 'fit') {\n if (!isUnitOrLayer) {\n log.warn(log.message.FIT_NON_SINGLE);\n autosize.type = 'pad';\n }\n }\n return autosize;\n}\nvar TOP_LEVEL_PROPERTIES = [\n 'background', 'padding', 'datasets'\n // We do not include \"autosize\" here as it is supported by only unit and layer specs and thus need to be normalized\n];\nexport function extractTopLevelProperties(t) {\n return TOP_LEVEL_PROPERTIES.reduce(function (o, p) {\n if (t && t[p] !== undefined) {\n o[p] = t[p];\n }\n return o;\n }, {});\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wbGV2ZWxwcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90b3BsZXZlbHByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR25DLE9BQU8sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBbUU3Qiw0QkFBNEIsUUFBdUM7SUFDakUsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLDRCQUE0QixnQkFBK0MsRUFBRSxjQUE2QyxFQUFFLGFBQTZCO0lBQTdCLDhCQUFBLEVBQUEsb0JBQTZCO0lBQzdKLElBQU0sUUFBUSxzQkFDWixJQUFJLEVBQUUsS0FBSyxJQUNSLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxFQUNsQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN4QyxDQUFDO0lBRUYsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRTtRQUMzQixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxRQUFRLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUN2QjtLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELElBQU0sb0JBQW9CLEdBQWlDO0lBQ3pELFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVTtJQUNuQyxtSEFBbUg7Q0FDcEgsQ0FBQztBQUVGLE1BQU0sb0NBQWtFLENBQUk7SUFDMUUsT0FBTyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDYjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7SW5saW5lRGF0YXNldH0gZnJvbSAnLi9kYXRhJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge0RpY3R9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQG1pbmltdW0gMFxuICovXG5leHBvcnQgdHlwZSBQYWRkaW5nID0gbnVtYmVyIHwge3RvcD86IG51bWJlciwgYm90dG9tPzogbnVtYmVyLCBsZWZ0PzogbnVtYmVyLCByaWdodD86IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIERhdGFzZXRzID0gRGljdDxJbmxpbmVEYXRhc2V0PjtcblxuZXhwb3J0IGludGVyZmFjZSBUb3BMZXZlbFByb3BlcnRpZXMge1xuICAvKipcbiAgICogQ1NTIGNvbG9yIHByb3BlcnR5IHRvIHVzZSBhcyB0aGUgYmFja2dyb3VuZCBvZiB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gbm9uZSAodHJhbnNwYXJlbnQpXG4gICAqL1xuICBiYWNrZ3JvdW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCB2aXN1YWxpemF0aW9uIHBhZGRpbmcsIGluIHBpeGVscywgZnJvbSB0aGUgZWRnZSBvZiB0aGUgdmlzdWFsaXphdGlvbiBjYW52YXMgdG8gdGhlIGRhdGEgcmVjdGFuZ2xlLiAgSWYgYSBudW1iZXIsIHNwZWNpZmllcyBwYWRkaW5nIGZvciBhbGwgc2lkZXMuXG4gICAqIElmIGFuIG9iamVjdCwgdGhlIHZhbHVlIHNob3VsZCBoYXZlIHRoZSBmb3JtYXQgYHtcImxlZnRcIjogNSwgXCJ0b3BcIjogNSwgXCJyaWdodFwiOiA1LCBcImJvdHRvbVwiOiA1fWAgdG8gc3BlY2lmeSBwYWRkaW5nIGZvciBlYWNoIHNpZGUgb2YgdGhlIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgNWBcbiAgICovXG4gIHBhZGRpbmc/OiBQYWRkaW5nO1xuXG4gIC8qKlxuICAgKiBTZXRzIGhvdyB0aGUgdmlzdWFsaXphdGlvbiBzaXplIHNob3VsZCBiZSBkZXRlcm1pbmVkLiBJZiBhIHN0cmluZywgc2hvdWxkIGJlIG9uZSBvZiBgXCJwYWRcImAsIGBcImZpdFwiYCBvciBgXCJub25lXCJgLlxuICAgKiBPYmplY3QgdmFsdWVzIGNhbiBhZGRpdGlvbmFsbHkgc3BlY2lmeSBwYXJhbWV0ZXJzIGZvciBjb250ZW50IHNpemluZyBhbmQgYXV0b21hdGljIHJlc2l6aW5nLlxuICAgKiBgXCJmaXRcImAgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHNpbmdsZSBhbmQgbGF5ZXJlZCB2aWV3cyB0aGF0IGRvbid0IHVzZSBgcmFuZ2VTdGVwYC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGBwYWRgXG4gICAqL1xuICBhdXRvc2l6ZT86IEF1dG9zaXplVHlwZSB8IEF1dG9TaXplUGFyYW1zO1xuXG4gIC8qKlxuICAgKiBBIGdsb2JhbCBkYXRhIHN0b3JlIGZvciBuYW1lZCBkYXRhc2V0cy4gVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBpbmxpbmUgZGF0YXNldHMuXG4gICAqIFRoaXMgY2FuIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgcHJpbWl0aXZlIHZhbHVlcyBvciBhIHN0cmluZy4gQXJyYXlzIG9mIHByaW1pdGl2ZSB2YWx1ZXMgYXJlIGluZ2VzdGVkIGFzIG9iamVjdHMgd2l0aCBhIGBkYXRhYCBwcm9wZXJ0eS5cbiAgICovXG4gIGRhdGFzZXRzPzogRGF0YXNldHM7XG59XG5cbmV4cG9ydCB0eXBlIEF1dG9zaXplVHlwZSA9ICdwYWQnIHwgJ2ZpdCcgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHNpemluZyBmb3JtYXQgdHlwZS4gT25lIG9mIGBcInBhZFwiYCwgYFwiZml0XCJgIG9yIGBcIm5vbmVcImAuIFNlZSB0aGUgW2F1dG9zaXplIHR5cGVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvc2l6ZS5odG1sI2F1dG9zaXplKSBkb2N1bWVudGF0aW9uIGZvciBkZXNjcmlwdGlvbnMgb2YgZWFjaC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlX186IGBcInBhZFwiYFxuICAgKi9cbiAgdHlwZT86IEF1dG9zaXplVHlwZTtcblxuICAvKipcbiAgICogQSBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBhdXRvc2l6ZSBsYXlvdXQgc2hvdWxkIGJlIHJlLWNhbGN1bGF0ZWQgb24gZXZlcnkgdmlldyB1cGRhdGUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgZmFsc2VgXG4gICAqL1xuICByZXNpemU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGhvdyBzaXplIGNhbGN1bGF0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQsIG9uZSBvZiBgXCJjb250ZW50XCJgIG9yIGBcInBhZGRpbmdcImAuIFRoZSBkZWZhdWx0IHNldHRpbmcgKGBcImNvbnRlbnRcImApIGludGVycHJldHMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgc2V0dGluZ3MgYXMgdGhlIGRhdGEgcmVjdGFuZ2xlIChwbG90dGluZykgZGltZW5zaW9ucywgdG8gd2hpY2ggcGFkZGluZyBpcyB0aGVuIGFkZGVkLiBJbiBjb250cmFzdCwgdGhlIGBcInBhZGRpbmdcImAgc2V0dGluZyBpbmNsdWRlcyB0aGUgcGFkZGluZyB3aXRoaW4gdGhlIHZpZXcgc2l6ZSBjYWxjdWxhdGlvbnMsIHN1Y2ggdGhhdCB0aGUgd2lkdGggYW5kIGhlaWdodCBzZXR0aW5ncyBpbmRpY2F0ZSB0aGUgKip0b3RhbCoqIGludGVuZGVkIHNpemUgb2YgdGhlIHZpZXcuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZV9fOiBgXCJjb250ZW50XCJgXG4gICAqL1xuICBjb250YWlucz86ICdjb250ZW50JyB8ICdwYWRkaW5nJztcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZUF1dG9TaXplKGF1dG9zaXplOiBBdXRvc2l6ZVR5cGUgfCBBdXRvU2l6ZVBhcmFtcykge1xuICByZXR1cm4gaXNTdHJpbmcoYXV0b3NpemUpID8ge3R5cGU6IGF1dG9zaXplfSA6IGF1dG9zaXplIHx8IHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQXV0b1NpemUodG9wTGV2ZWxBdXRvc2l6ZTogQXV0b3NpemVUeXBlIHwgQXV0b1NpemVQYXJhbXMsIGNvbmZpZ0F1dG9zaXplOiBBdXRvc2l6ZVR5cGUgfCBBdXRvU2l6ZVBhcmFtcywgaXNVbml0T3JMYXllcjogYm9vbGVhbiA9IHRydWUpOiBBdXRvU2l6ZVBhcmFtcyB7XG4gIGNvbnN0IGF1dG9zaXplOiBBdXRvU2l6ZVBhcmFtcyA9IHtcbiAgICB0eXBlOiAncGFkJyxcbiAgICAuLi5fbm9ybWFsaXplQXV0b1NpemUoY29uZmlnQXV0b3NpemUpLFxuICAgIC4uLl9ub3JtYWxpemVBdXRvU2l6ZSh0b3BMZXZlbEF1dG9zaXplKVxuICB9O1xuXG4gIGlmIChhdXRvc2l6ZS50eXBlID09PSAnZml0Jykge1xuICAgIGlmICghaXNVbml0T3JMYXllcikge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuRklUX05PTl9TSU5HTEUpO1xuICAgICAgYXV0b3NpemUudHlwZSA9ICdwYWQnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhdXRvc2l6ZTtcbn1cblxuY29uc3QgVE9QX0xFVkVMX1BST1BFUlRJRVM6IChrZXlvZiBUb3BMZXZlbFByb3BlcnRpZXMpW10gPSBbXG4gICdiYWNrZ3JvdW5kJywgJ3BhZGRpbmcnLCAnZGF0YXNldHMnXG4gIC8vIFdlIGRvIG5vdCBpbmNsdWRlIFwiYXV0b3NpemVcIiBoZXJlIGFzIGl0IGlzIHN1cHBvcnRlZCBieSBvbmx5IHVuaXQgYW5kIGxheWVyIHNwZWNzIGFuZCB0aHVzIG5lZWQgdG8gYmUgbm9ybWFsaXplZFxuXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUb3BMZXZlbFByb3BlcnRpZXM8VCBleHRlbmRzIFRvcExldmVsUHJvcGVydGllcz4odDogVCkge1xuICByZXR1cm4gVE9QX0xFVkVMX1BST1BFUlRJRVMucmVkdWNlKChvLCBwKSA9PiB7XG4gICAgaWYgKHQgJiYgdFtwXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvW3BdID0gdFtwXTtcbiAgICB9XG4gICAgcmV0dXJuIG87XG4gIH0sIHt9KTtcbn1cbiJdfQ==","export function isUrlData(data) {\n return !!data['url'];\n}\nexport function isInlineData(data) {\n return !!data['values'];\n}\nexport function isNamedData(data) {\n return !!data['name'] && !isUrlData(data) && !isInlineData(data);\n}\nexport var MAIN = 'main';\nexport var RAW = 'raw';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWdJQSxNQUFNLG9CQUFvQixJQUFxQztJQUM3RCxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELE1BQU0sdUJBQXVCLElBQXFDO0lBQ2hFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQsTUFBTSxzQkFBc0IsSUFBbUI7SUFDN0MsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFJRCxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxJQUFNLEdBQUcsR0FBVSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29uc3RhbnRzIGFuZCB1dGlsaXRpZXMgZm9yIGRhdGEuXG4gKi9cbmltcG9ydCB7VmdEYXRhfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZSB7XG4gIFtmaWVsZDogc3RyaW5nXTogbnVsbCB8IHN0cmluZyB8ICdzdHJpbmcnIHwgJ2Jvb2xlYW4nIHwgJ2RhdGUnIHwgJ251bWJlcic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdEJhc2Uge1xuICAvKipcbiAgICogSWYgc2V0IHRvIGBcImF1dG9cImAgKHRoZSBkZWZhdWx0KSwgcGVyZm9ybSBhdXRvbWF0aWMgdHlwZSBpbmZlcmVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBkZXNpcmVkIGRhdGEgdHlwZXMuXG4gICAqIElmIHNldCB0byBgbnVsbGAsIGRpc2FibGUgdHlwZSBpbmZlcmVuY2UgYmFzZWQgb24gdGhlIHNwZWMgYW5kIG9ubHkgdXNlIHR5cGUgaW5mZXJlbmNlIGJhc2VkIG9uIHRoZSBkYXRhLlxuICAgKiBBbHRlcm5hdGl2ZWx5LCBhIHBhcnNpbmcgZGlyZWN0aXZlIG9iamVjdCBjYW4gYmUgcHJvdmlkZWQgZm9yIGV4cGxpY2l0IGRhdGEgdHlwZXMuIEVhY2ggcHJvcGVydHkgb2YgdGhlIG9iamVjdCBjb3JyZXNwb25kcyB0byBhIGZpZWxkIG5hbWUsIGFuZCB0aGUgdmFsdWUgdG8gdGhlIGRlc2lyZWQgZGF0YSB0eXBlIChvbmUgb2YgYFwibnVtYmVyXCJgLCBgXCJib29sZWFuXCJgLCBgXCJkYXRlXCJgLCBvciBudWxsIChkbyBub3QgcGFyc2UgdGhlIGZpZWxkKSkuXG4gICAqIEZvciBleGFtcGxlLCBgXCJwYXJzZVwiOiB7XCJtb2RpZmllZF9vblwiOiBcImRhdGVcIn1gIHBhcnNlcyB0aGUgYG1vZGlmaWVkX29uYCBmaWVsZCBpbiBlYWNoIGlucHV0IHJlY29yZCBhIERhdGUgdmFsdWUuXG4gICAqXG4gICAqIEZvciBgXCJkYXRlXCJgLCB3ZSBwYXJzZSBkYXRhIGJhc2VkIHVzaW5nIEphdmFzY3JpcHQncyBbYERhdGUucGFyc2UoKWBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2UpLlxuICAgKiBGb3IgU3BlY2lmaWMgZGF0ZSBmb3JtYXRzIGNhbiBiZSBwcm92aWRlZCAoZS5nLiwgYHtmb286ICdkYXRlOlwiJW0lZCVZXCInfWApLCB1c2luZyB0aGUgW2QzLXRpbWUtZm9ybWF0IHN5bnRheF0oaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXRpbWUtZm9ybWF0I2xvY2FsZV9mb3JtYXQpLiBVVEMgZGF0ZSBmb3JtYXQgcGFyc2luZyBpcyBzdXBwb3J0ZWQgc2ltaWxhcmx5IChlLmcuLCBge2ZvbzogJ3V0YzpcIiVtJWQlWVwiJ31gKS4gU2VlIG1vcmUgYWJvdXQgW1VUQyB0aW1lXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RpbWV1bml0Lmh0bWwjdXRjKVxuICAgKi9cbiAgcGFyc2U/OiAnYXV0bycgfCBQYXJzZSB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3N2RGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdjc3YnIHwgJ3Rzdic7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHN2RGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdkc3YnO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVsaW1pdGVyIGJldHdlZW4gcmVjb3Jkcy4gVGhlIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciAoaS5lLiwgYSBzaW5nbGUgMTYtYml0IGNvZGUgdW5pdCk7IHNvLCBBU0NJSSBkZWxpbWl0ZXJzIGFyZSBmaW5lLCBidXQgZW1vamkgZGVsaW1pdGVycyBhcmUgbm90LlxuICAgKlxuICAgKiBAbWluTGVuZ3RoIDFcbiAgICogQG1heExlbmd0aCAxXG4gICAqL1xuICBkZWxpbWl0ZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKc29uRGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICdqc29uJztcbiAgLyoqXG4gICAqIFRoZSBKU09OIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgZGF0YS5cbiAgICogVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgbG9hZGVkIEpTT04gZmlsZSBtYXkgaGF2ZSBzdXJyb3VuZGluZyBzdHJ1Y3R1cmUgb3IgbWV0YS1kYXRhLlxuICAgKiBGb3IgZXhhbXBsZSBgXCJwcm9wZXJ0eVwiOiBcInZhbHVlcy5mZWF0dXJlc1wiYCBpcyBlcXVpdmFsZW50IHRvIHJldHJpZXZpbmcgYGpzb24udmFsdWVzLmZlYXR1cmVzYFxuICAgKiBmcm9tIHRoZSBsb2FkZWQgSlNPTiBvYmplY3QuXG4gICAqL1xuICBwcm9wZXJ0eT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb3BvRGF0YUZvcm1hdCBleHRlbmRzIERhdGFGb3JtYXRCYXNlIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgaW5wdXQgZGF0YTogYFwianNvblwiYCwgYFwiY3N2XCJgLCBgXCJ0c3ZcImAsIGBcImRzdlwiYC5cbiAgICogVGhlIGRlZmF1bHQgZm9ybWF0IHR5cGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZXh0ZW5zaW9uIG9mIHRoZSBmaWxlIFVSTC5cbiAgICogSWYgbm8gZXh0ZW5zaW9uIGlzIGRldGVjdGVkLCBgXCJqc29uXCJgIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0LlxuICAgKi9cbiAgdHlwZT86ICd0b3BvanNvbic7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgVG9wb0pTT04gb2JqZWN0IHNldCB0byBjb252ZXJ0IHRvIGEgR2VvSlNPTiBmZWF0dXJlIGNvbGxlY3Rpb24uXG4gICAqIEZvciBleGFtcGxlLCBpbiBhIG1hcCBvZiB0aGUgd29ybGQsIHRoZXJlIG1heSBiZSBhbiBvYmplY3Qgc2V0IG5hbWVkIGBcImNvdW50cmllc1wiYC5cbiAgICogVXNpbmcgdGhlIGZlYXR1cmUgcHJvcGVydHksIHdlIGNhbiBleHRyYWN0IHRoaXMgc2V0IGFuZCBnZW5lcmF0ZSBhIEdlb0pTT04gZmVhdHVyZSBvYmplY3QgZm9yIGVhY2ggY291bnRyeS5cbiAgICovXG4gIGZlYXR1cmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgVG9wb0pTT04gb2JqZWN0IHNldCB0byBjb252ZXJ0IHRvIG1lc2guXG4gICAqIFNpbWlsYXIgdG8gdGhlIGBmZWF0dXJlYCBvcHRpb24sIGBtZXNoYCBleHRyYWN0cyBhIG5hbWVkIFRvcG9KU09OIG9iamVjdCBzZXQuXG4gICAqICBVbmxpa2UgdGhlIGBmZWF0dXJlYCBvcHRpb24sIHRoZSBjb3JyZXNwb25kaW5nIGdlbyBkYXRhIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlLCB1bmlmaWVkIG1lc2ggaW5zdGFuY2UsIG5vdCBhcyBpbmRpdmlkdWFsIEdlb0pTT04gZmVhdHVyZXMuXG4gICAqIEV4dHJhY3RpbmcgYSBtZXNoIGlzIHVzZWZ1bCBmb3IgbW9yZSBlZmZpY2llbnRseSBkcmF3aW5nIGJvcmRlcnMgb3Igb3RoZXIgZ2VvZ3JhcGhpYyBlbGVtZW50cyB0aGF0IHlvdSBkbyBub3QgbmVlZCB0byBhc3NvY2lhdGUgd2l0aCBzcGVjaWZpYyByZWdpb25zIHN1Y2ggYXMgaW5kaXZpZHVhbCBjb3VudHJpZXMsIHN0YXRlcyBvciBjb3VudGllcy5cbiAgICovXG4gIG1lc2g/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSBDc3ZEYXRhRm9ybWF0IHwgRHN2RGF0YUZvcm1hdCB8IEpzb25EYXRhRm9ybWF0IHwgVG9wb0RhdGFGb3JtYXQ7XG5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXRUeXBlID0gJ2pzb24nIHwgJ2NzdicgfCAndHN2JyB8ICdkc3YnIHwgJ3RvcG9qc29uJztcblxuZXhwb3J0IHR5cGUgRGF0YSA9IFVybERhdGEgfCBJbmxpbmVEYXRhIHwgTmFtZWREYXRhO1xuXG5leHBvcnQgdHlwZSBJbmxpbmVEYXRhc2V0ID0gbnVtYmVyW10gfCBzdHJpbmdbXSB8IGJvb2xlYW5bXSB8IG9iamVjdFtdIHwgc3RyaW5nIHwgb2JqZWN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIEFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgZm9ybWF0IGZvciBwYXJzaW5nIHRoZSBkYXRhLlxuICAgKi9cbiAgZm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBwbGFjZWhvbGRlciBuYW1lIGFuZCBiaW5kIGRhdGEgYXQgcnVudGltZS5cbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIEFuIFVSTCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIGRhdGEgc2V0LiBVc2UgdGhlIGBmb3JtYXQudHlwZWAgcHJvcGVydHlcbiAgICogdG8gZW5zdXJlIHRoZSBsb2FkZWQgZGF0YSBpcyBjb3JyZWN0bHkgcGFyc2VkLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5saW5lRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBmdWxsIGRhdGEgc2V0LCBpbmNsdWRlZCBpbmxpbmUuIFRoaXMgY2FuIGJlIGFuIGFycmF5IG9mIG9iamVjdHMgb3IgcHJpbWl0aXZlIHZhbHVlcywgYW4gb2JqZWN0LCBvciBhIHN0cmluZy5cbiAgICogQXJyYXlzIG9mIHByaW1pdGl2ZSB2YWx1ZXMgYXJlIGluZ2VzdGVkIGFzIG9iamVjdHMgd2l0aCBhIGBkYXRhYCBwcm9wZXJ0eS4gU3RyaW5ncyBhcmUgcGFyc2VkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCB0eXBlLlxuICAgKi9cbiAgdmFsdWVzOiBJbmxpbmVEYXRhc2V0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkRGF0YSBleHRlbmRzIERhdGFCYXNlIHtcbiAgLyoqXG4gICAqIFByb3ZpZGUgYSBwbGFjZWhvbGRlciBuYW1lIGFuZCBiaW5kIGRhdGEgYXQgcnVudGltZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJsRGF0YShkYXRhOiBQYXJ0aWFsPERhdGE+IHwgUGFydGlhbDxWZ0RhdGE+KTogZGF0YSBpcyBVcmxEYXRhIHtcbiAgcmV0dXJuICEhZGF0YVsndXJsJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lubGluZURhdGEoZGF0YTogUGFydGlhbDxEYXRhPiB8IFBhcnRpYWw8VmdEYXRhPik6IGRhdGEgaXMgSW5saW5lRGF0YSB7XG4gIHJldHVybiAhIWRhdGFbJ3ZhbHVlcyddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOYW1lZERhdGEoZGF0YTogUGFydGlhbDxEYXRhPik6IGRhdGEgaXMgTmFtZWREYXRhIHtcbiAgcmV0dXJuICEhZGF0YVsnbmFtZSddICYmICFpc1VybERhdGEoZGF0YSkgJiYgIWlzSW5saW5lRGF0YShkYXRhKTtcbn1cblxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZVR5cGUgPSAncmF3JyB8ICdtYWluJyB8ICdyb3cnIHwgJ2NvbHVtbicgfCAnbG9va3VwJztcblxuZXhwb3J0IGNvbnN0IE1BSU46ICdtYWluJyA9ICdtYWluJztcbmV4cG9ydCBjb25zdCBSQVc6ICdyYXcnID0gJ3Jhdyc7XG4iXX0=","/**\n * Parse an event selector string.\n * Returns an array of event stream definitions.\n */\nexport default function(selector, source, marks) {\n DEFAULT_SOURCE = source || VIEW;\n MARKS = marks || DEFAULT_MARKS;\n return parseMerge(selector.trim()).map(parseSelector);\n}\n\nvar VIEW = 'view',\n LBRACK = '[',\n RBRACK = ']',\n LBRACE = '{',\n RBRACE = '}',\n COLON = ':',\n COMMA = ',',\n NAME = '@',\n GT = '>',\n ILLEGAL = /[[\\]{}]/,\n DEFAULT_SOURCE,\n MARKS,\n DEFAULT_MARKS = {\n '*': 1,\n arc: 1,\n area: 1,\n group: 1,\n image: 1,\n line: 1,\n path: 1,\n rect: 1,\n rule: 1,\n shape: 1,\n symbol: 1,\n text: 1,\n trail: 1\n };\n\nfunction isMarkType(type) {\n return MARKS.hasOwnProperty(type);\n}\n\nfunction find(s, i, endChar, pushChar, popChar) {\n var count = 0,\n n = s.length,\n c;\n for (; i= 0) --count;\n else if (pushChar && pushChar.indexOf(c) >= 0) ++count;\n }\n return i;\n}\n\nfunction parseMerge(s) {\n var output = [],\n start = 0,\n n = s.length,\n i = 0;\n\n while (i < n) {\n i = find(s, i, COMMA, LBRACK + LBRACE, RBRACK + RBRACE);\n output.push(s.substring(start, i).trim());\n start = ++i;\n }\n\n if (output.length === 0) {\n throw 'Empty event selector: ' + s;\n }\n return output;\n}\n\nfunction parseSelector(s) {\n return s[0] === '['\n ? parseBetween(s)\n : parseStream(s);\n}\n\nfunction parseBetween(s) {\n var n = s.length,\n i = 1,\n b, stream;\n\n i = find(s, i, RBRACK, LBRACK, RBRACK);\n if (i === n) {\n throw 'Empty between selector: ' + s;\n }\n\n b = parseMerge(s.substring(1, i));\n if (b.length !== 2) {\n throw 'Between selector must have two elements: ' + s;\n }\n\n s = s.slice(i + 1).trim();\n if (s[0] !== GT) {\n throw 'Expected \\'>\\' after between selector: ' + s;\n }\n\n b = b.map(parseSelector);\n\n stream = parseSelector(s.slice(1).trim());\n if (stream.between) {\n return {\n between: b,\n stream: stream\n };\n } else {\n stream.between = b;\n }\n\n return stream;\n}\n\nfunction parseStream(s) {\n var stream = {source: DEFAULT_SOURCE},\n source = [],\n throttle = [0, 0],\n markname = 0,\n start = 0,\n n = s.length,\n i = 0, j,\n filter;\n\n // extract throttle from end\n if (s[n-1] === RBRACE) {\n i = s.lastIndexOf(LBRACE);\n if (i >= 0) {\n try {\n throttle = parseThrottle(s.substring(i+1, n-1));\n } catch (e) {\n throw 'Invalid throttle specification: ' + s;\n }\n s = s.slice(0, i).trim();\n n = s.length;\n } else throw 'Unmatched right brace: ' + s;\n i = 0;\n }\n\n if (!n) throw s;\n\n // set name flag based on first char\n if (s[0] === NAME) markname = ++i;\n\n // extract first part of multi-part stream selector\n j = find(s, i, COLON);\n if (j < n) {\n source.push(s.substring(start, j).trim());\n start = i = ++j;\n }\n\n // extract remaining part of stream selector\n i = find(s, i, LBRACK);\n if (i === n) {\n source.push(s.substring(start, n).trim());\n } else {\n source.push(s.substring(start, i).trim());\n filter = [];\n start = ++i;\n if (start === n) throw 'Unmatched left bracket: ' + s;\n }\n\n // extract filters\n while (i < n) {\n i = find(s, i, RBRACK);\n if (i === n) throw 'Unmatched left bracket: ' + s;\n filter.push(s.substring(start, i).trim());\n if (i < n-1 && s[++i] !== LBRACK) throw 'Expected left bracket: ' + s;\n start = ++i;\n }\n\n // marshall event stream specification\n if (!(n = source.length) || ILLEGAL.test(source[n-1])) {\n throw 'Invalid event selector: ' + s;\n }\n\n if (n > 1) {\n stream.type = source[1];\n if (markname) {\n stream.markname = source[0].slice(1);\n } else if (isMarkType(source[0])) {\n stream.marktype = source[0];\n } else {\n stream.source = source[0];\n }\n } else {\n stream.type = source[0];\n }\n if (stream.type.slice(-1) === '!') {\n stream.consume = true;\n stream.type = stream.type.slice(0, -1)\n }\n if (filter != null) stream.filter = filter;\n if (throttle[0]) stream.throttle = throttle[0];\n if (throttle[1]) stream.debounce = throttle[1];\n\n return stream;\n}\n\nfunction parseThrottle(s) {\n var a = s.split(COMMA);\n if (!s.length || a.length > 2) throw s;\n return a.map(function(_) {\n var x = +_;\n if (x !== x) throw s;\n return x;\n });\n}\n","import { isArray } from 'vega-util';\nimport { flagKeys } from './util';\nexport function isVgSignalRef(o) {\n return !!o['signal'];\n}\nexport function isVgRangeStep(range) {\n return !!range['step'];\n}\nexport function isDataRefUnionedDomain(domain) {\n if (!isArray(domain)) {\n return 'fields' in domain && !('data' in domain);\n }\n return false;\n}\nexport function isFieldRefUnionDomain(domain) {\n if (!isArray(domain)) {\n return 'fields' in domain && 'data' in domain;\n }\n return false;\n}\nexport function isDataRefDomain(domain) {\n if (!isArray(domain)) {\n return 'field' in domain && 'data' in domain;\n }\n return false;\n}\nexport function isSignalRefDomain(domain) {\n if (!isArray(domain)) {\n return 'signal' in domain;\n }\n return false;\n}\nvar VG_MARK_CONFIG_INDEX = {\n opacity: 1,\n fill: 1,\n fillOpacity: 1,\n stroke: 1,\n strokeCap: 1,\n strokeWidth: 1,\n strokeOpacity: 1,\n strokeDash: 1,\n strokeDashOffset: 1,\n size: 1,\n shape: 1,\n interpolate: 1,\n tension: 1,\n orient: 1,\n align: 1,\n baseline: 1,\n text: 1,\n limit: 1,\n dx: 1,\n dy: 1,\n radius: 1,\n theta: 1,\n angle: 1,\n font: 1,\n fontSize: 1,\n fontWeight: 1,\n fontStyle: 1,\n cursor: 1,\n href: 1,\n};\nexport var VG_MARK_CONFIGS = flagKeys(VG_MARK_CONFIG_INDEX);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVnYS5zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVnYS5zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQU1sQyxPQUFPLEVBQU8sUUFBUSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBZ0R0QyxNQUFNLHdCQUF3QixDQUFNO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBbUNELE1BQU0sd0JBQXdCLEtBQWM7SUFDMUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUErSEQsTUFBTSxpQ0FBaUMsTUFBZ0I7SUFDckQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNwQixPQUFPLFFBQVEsSUFBSSxNQUFNLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQztLQUNsRDtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sZ0NBQWdDLE1BQWdCO0lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDcEIsT0FBTyxRQUFRLElBQUksTUFBTSxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUM7S0FDL0M7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLDBCQUEwQixNQUFnQjtJQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ25CLE9BQU8sT0FBTyxJQUFJLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSw0QkFBNEIsTUFBZ0I7SUFDaEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNwQixPQUFPLFFBQVEsSUFBSSxNQUFNLENBQUM7S0FDM0I7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFzNkJELElBQU0sb0JBQW9CLEdBQTZCO0lBQ3JELE9BQU8sRUFBRSxDQUFDO0lBQ1YsSUFBSSxFQUFFLENBQUM7SUFDUCxXQUFXLEVBQUUsQ0FBQztJQUNkLE1BQU0sRUFBRSxDQUFDO0lBQ1QsU0FBUyxFQUFFLENBQUM7SUFDWixXQUFXLEVBQUUsQ0FBQztJQUNkLGFBQWEsRUFBRSxDQUFDO0lBQ2hCLFVBQVUsRUFBRSxDQUFDO0lBQ2IsZ0JBQWdCLEVBQUUsQ0FBQztJQUNuQixJQUFJLEVBQUUsQ0FBQztJQUNQLEtBQUssRUFBRSxDQUFDO0lBQ1IsV0FBVyxFQUFFLENBQUM7SUFDZCxPQUFPLEVBQUUsQ0FBQztJQUNWLE1BQU0sRUFBRSxDQUFDO0lBQ1QsS0FBSyxFQUFFLENBQUM7SUFDUixRQUFRLEVBQUUsQ0FBQztJQUNYLElBQUksRUFBRSxDQUFDO0lBQ1AsS0FBSyxFQUFFLENBQUM7SUFDUixFQUFFLEVBQUUsQ0FBQztJQUNMLEVBQUUsRUFBRSxDQUFDO0lBQ0wsTUFBTSxFQUFFLENBQUM7SUFDVCxLQUFLLEVBQUUsQ0FBQztJQUNSLEtBQUssRUFBRSxDQUFDO0lBQ1IsSUFBSSxFQUFFLENBQUM7SUFDUCxRQUFRLEVBQUUsQ0FBQztJQUNYLFVBQVUsRUFBRSxDQUFDO0lBQ2IsU0FBUyxFQUFFLENBQUM7SUFDWixNQUFNLEVBQUUsQ0FBQztJQUNULElBQUksRUFBRSxDQUFDO0NBWVIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxJQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtCYXNlQmlufSBmcm9tICcuL2Jpbic7XG5pbXBvcnQge05pY2VUaW1lLCBTY2FsZVR5cGV9IGZyb20gJy4vc2NhbGUnO1xuaW1wb3J0IHtTb3J0T3JkZXJ9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7V2luZG93T25seU9wfSBmcm9tICcuL3RyYW5zZm9ybSc7XG5pbXBvcnQge0ZsYWcsIGZsYWdLZXlzfSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnRGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgc291cmNlPzogc3RyaW5nO1xuICB2YWx1ZXM/OiBhbnk7XG4gIGZvcm1hdD86IHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIHBhcnNlPzogc3RyaW5nIHwgb2JqZWN0O1xuICAgIHByb3BlcnR5Pzogc3RyaW5nO1xuICAgIGZlYXR1cmU/OiBzdHJpbmc7XG4gICAgbWVzaD86IHN0cmluZztcbiAgfTtcbiAgdXJsPzogc3RyaW5nO1xuICB0cmFuc2Zvcm0/OiBWZ1RyYW5zZm9ybVtdO1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdQYXJlbnRSZWYge1xuICBwYXJlbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVmdGaWVsZFJlZiA9IHN0cmluZyB8IFZnUGFyZW50UmVmIHwgVmdQYXJlbnRSZWZbXTtcblxuZXhwb3J0IHR5cGUgVmdTb3J0RmllbGQgPSB0cnVlIHwge1xuICBmaWVsZD86IFZnRmllbGRSZWYsXG4gIG9wOiBBZ2dyZWdhdGVPcCxcbiAgb3JkZXI/OiBTb3J0T3JkZXJcbn07XG5cbi8qKlxuICogVW5pb25lZCBkb21haW5zIGNhbiBvbmx5IGJlIHNvcnRlZCBieSBjb3VudCBhZ2dyZWdhdGUuXG4gKi9cbmV4cG9ydCB0eXBlIFZnVW5pb25Tb3J0RmllbGQgPSB0cnVlIHwge1xuICBvcDogJ2NvdW50J1xuICBvcmRlcj86IFNvcnRPcmRlclxufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ0RhdGFSZWYge1xuICBkYXRhOiBzdHJpbmc7XG4gIGZpZWxkOiBWZ0ZpZWxkUmVmO1xuICBzb3J0PzogVmdTb3J0RmllbGQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdTaWduYWxSZWYge1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmdTaWduYWxSZWYobzogYW55KTogbyBpcyBWZ1NpZ25hbFJlZiB7XG4gIHJldHVybiAhIW9bJ3NpZ25hbCddO1xufVxuXG5leHBvcnQgdHlwZSBWZ0V2ZW50U3RyZWFtID0gYW55O1xuXG4vLyBUT0RPOiBhZGQgdHlwZSBvZiB2YWx1ZSAoTWFrZSBpdCBWZ1ZhbHVlUmVmPFQ+IHt2YWx1ZT86VCAuLi59KVxuZXhwb3J0IGludGVyZmFjZSBWZ1ZhbHVlUmVmIHtcbiAgdmFsdWU/OiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuO1xuICBmaWVsZD86IHN0cmluZyB8IHtcbiAgICBkYXR1bT86IHN0cmluZyxcbiAgICBncm91cD86IHN0cmluZyxcbiAgICBwYXJlbnQ/OiBzdHJpbmdcbiAgfTtcbiAgc2lnbmFsPzogc3RyaW5nO1xuICBzY2FsZT86IHN0cmluZzsgLy8gVE9ETzogb2JqZWN0XG4gIG11bHQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlciB8IFZnVmFsdWVSZWY7XG4gIGJhbmQ/OiBib29sZWFuIHwgbnVtYmVyIHwgVmdWYWx1ZVJlZjtcbn1cblxuLy8gVE9ETzogYWRkIHZnIHByZWZpeFxuZXhwb3J0IGludGVyZmFjZSBEYXRhUmVmVW5pb25Eb21haW4ge1xuICBmaWVsZHM6IChhbnlbXSB8IFZnRGF0YVJlZiB8IFZnU2lnbmFsUmVmKVtdO1xuICBzb3J0PzogVmdVbmlvblNvcnRGaWVsZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0ZpZWxkUmVmVW5pb25Eb21haW4ge1xuICBkYXRhOiBzdHJpbmc7XG4gIGZpZWxkczogVmdGaWVsZFJlZltdO1xuICBzb3J0PzogVmdVbmlvblNvcnRGaWVsZDtcbn1cblxuZXhwb3J0IHR5cGUgVmdTY2hlbWUgPSB7c2NoZW1lOiBzdHJpbmcsIGV4dGVudD86IG51bWJlcltdLCBjb3VudD86IG51bWJlcn07XG5leHBvcnQgdHlwZSBWZ1JhbmdlID0gc3RyaW5nIHwgVmdEYXRhUmVmIHwgKG51bWJlcnxzdHJpbmd8VmdEYXRhUmVmfFZnU2lnbmFsUmVmKVtdIHwgVmdTY2hlbWUgfCBWZ1JhbmdlU3RlcDtcblxuZXhwb3J0IHR5cGUgVmdSYW5nZVN0ZXAgPSB7c3RlcDogbnVtYmVyIHwgVmdTaWduYWxSZWZ9O1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmdSYW5nZVN0ZXAocmFuZ2U6IFZnUmFuZ2UpOiByYW5nZSBpcyBWZ1JhbmdlU3RlcCB7XG4gIHJldHVybiAhIXJhbmdlWydzdGVwJ107XG59XG5cbi8vIERvbWFpbnMgdGhhdCBhcmUgbm90IGEgdW5pb24gb2YgZG9tYWluc1xuZXhwb3J0IHR5cGUgVmdOb25VbmlvbkRvbWFpbiA9IGFueVtdIHwgVmdEYXRhUmVmIHwgVmdTaWduYWxSZWY7XG5leHBvcnQgdHlwZSBWZ0RvbWFpbiA9IFZnTm9uVW5pb25Eb21haW4gfCBEYXRhUmVmVW5pb25Eb21haW4gfCBWZ0ZpZWxkUmVmVW5pb25Eb21haW47XG5cbmV4cG9ydCB0eXBlIFZnTWFya0dyb3VwID0gYW55O1xuXG5leHBvcnQgdHlwZSBWZ1Byb2plY3Rpb25UeXBlID0gJ2FsYmVycycgfCAnYWxiZXJzVXNhJyB8ICdhemltdXRoYWxFcXVhbEFyZWEnIHwgJ2F6aW11dGhhbEVxdWlkaXN0YW50JyB8ICdjb25pY0NvbmZvcm1hbCcgfCAnY29uaWNFcXVhbEFyZWEnIHwgJ2NvbmljRXF1aWRpc3RhbnQnIHwgJ2VxdWlyZWN0YW5ndWxhcicgfCAnZ25vbW9uaWMnIHwgJ21lcmNhdG9yJyB8ICdvcnRob2dyYXBoaWMnIHwgJ3N0ZXJlb2dyYXBoaWMnIHwgJ3RyYW5zdmVyc2VNZXJjYXRvcic7XG5cblxuZXhwb3J0IHR5cGUgVmdQcm9qZWN0aW9uID0ge1xuICAvKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdGlvbi5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLypcbiAgICogVGhlIHR5cGUgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICB0eXBlPzogVmdQcm9qZWN0aW9uVHlwZTtcbiAgLypcbiAgICogVGhlIGNsaXAgYW5nbGUgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBjbGlwQW5nbGU/OiBudW1iZXI7XG4gIC8qXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHZpZXdwb3J0IGNsaXAgZXh0ZW50IHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzIGluIHBpeGVsc1xuICAgKi9cbiAgY2xpcEV4dGVudD86IG51bWJlcltdW107XG4gIC8qXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHNjYWxlIGZhY3RvciB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gICAqL1xuICBzY2FsZT86IG51bWJlcjtcbiAgLypcbiAgICogVGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBwcm9qZWN0aW9uLlxuICAgKi9cbiAgdHJhbnNsYXRlPzogbnVtYmVyW107XG4gIC8qXG4gICAqIFRoZSBjZW50ZXIgb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBjZW50ZXI/OiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBvZiB0aGUgcHJvamVjdGlvbi5cbiAgICovXG4gIHJvdGF0ZT86IG51bWJlcltdO1xuICAvKlxuICAgKiBUaGUgZGVzaXJlZCBwcmVjaXNpb24gb2YgdGhlIHByb2plY3Rpb24uXG4gICAqL1xuICBwcmVjaXNpb24/OiBTdHJpbmc7XG4gIC8qXG4gICAqIEdlb0pTT04gZGF0YSB0byB3aGljaCB0aGUgcHJvamVjdGlvbiBzaG91bGQgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IGZpdCB0aGUgdHJhbnNsYXRlIGFuZCBzY2FsZSBwYXJhbWV0ZXJzLi5cbiAgICovXG4gIGZpdD86IFZnU2lnbmFsUmVmIHwgT2JqZWN0IHwgYW55W107XG4gIC8qXG4gICAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBmaXQsIHByb3ZpZGVzIHRoZSBwaXhlbCBhcmVhIHRvIHdoaWNoIHRoZSBwcm9qZWN0aW9uIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGZpdC5cbiAgICovXG4gIGV4dGVudD86IFZnU2lnbmFsUmVmIHwgbnVtYmVyW11bXTtcbiAgLypcbiAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGZpdCwgcHJvdmlkZXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzIG9mIHRoZSBhcmVhIHRvIHdoaWNoIHRoZSBwcm9qZWN0aW9uIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGZpdC5cbiAgICovXG4gIHNpemU/OiBWZ1NpZ25hbFJlZiB8IChudW1iZXIgfCBWZ1NpZ25hbFJlZilbXTtcblxuICAvKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIGFsbCBzdXBwb3J0ZWQgZm9yIHNwZWNpZmljIHR5cGVzIG9mIHByb2plY3Rpb25zLiBDb25zdWx0IHRoZSBkMy1nZW8tcHJvamVjdGlvbiBsaWJyYXJ5IGZvciBtb3JlIGluZm9ybWF0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZ2VvLXByb2plY3Rpb24gKi9cbiAgY29lZmZpY2llbnQ/OiBudW1iZXI7XG4gIGRpc3RhbmNlPzogbnVtYmVyO1xuICBmcmFjdGlvbj86IG51bWJlcjtcbiAgbG9iZXM/OiBudW1iZXI7XG4gIHBhcmFsbGVsPzogbnVtYmVyO1xuICByYWRpdXM/OiBudW1iZXI7XG4gIHJhdGlvPzogbnVtYmVyO1xuICBzcGFjaW5nPzogbnVtYmVyO1xuICB0aWx0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ1NjYWxlIHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBTY2FsZVR5cGU7XG4gIGRvbWFpbjogVmdEb21haW47XG4gIGRvbWFpblJhdz86IFZnU2lnbmFsUmVmO1xuICByYW5nZTogVmdSYW5nZTtcblxuICBjbGFtcD86IGJvb2xlYW47XG4gIGJhc2U/OiBudW1iZXI7XG4gIGV4cG9uZW50PzogbnVtYmVyO1xuICBpbnRlcnBvbGF0ZT86IFNjYWxlSW50ZXJwb2xhdGUgfCBTY2FsZUludGVycG9sYXRlUGFyYW1zO1xuICBuaWNlPzogYm9vbGVhbiB8IG51bWJlciB8IE5pY2VUaW1lIHwge2ludGVydmFsOiBzdHJpbmcsIHN0ZXA6IG51bWJlcn07XG4gIHBhZGRpbmc/OiBudW1iZXI7XG4gIHBhZGRpbmdJbm5lcj86IG51bWJlcjtcbiAgcGFkZGluZ091dGVyPzogbnVtYmVyO1xuICByZXZlcnNlPzogYm9vbGVhbjtcbiAgcm91bmQ/OiBib29sZWFuO1xuICB6ZXJvPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgU2NhbGVJbnRlcnBvbGF0ZSA9ICdyZ2InfCAnbGFiJyB8ICdoY2wnIHwgJ2hzbCcgfCAnaHNsLWxvbmcnIHwgJ2hjbC1sb25nJyB8ICdjdWJlaGVsaXgnIHwgJ2N1YmVoZWxpeC1sb25nJztcblxuZXhwb3J0IGludGVyZmFjZSBTY2FsZUludGVycG9sYXRlUGFyYW1zIHtcbiAgdHlwZTogJ3JnYicgfCAnY3ViZWhlbGl4JyB8ICdjdWJlaGVsaXgtbG9uZyc7XG4gIGdhbW1hPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBWZ0xheW91dEFsaWduID0gJ25vbmUnIHwgJ2VhY2gnIHwgJ2FsbCc7XG5cbmV4cG9ydCB0eXBlIFJvd0NvbDxUPiA9IHtcbiAgcm93PzogVCxcbiAgY29sdW1uPzogVFxufTtcblxuZXhwb3J0IGludGVyZmFjZSBWZ0xheW91dCB7XG4gIHBhZGRpbmc6IG51bWJlciB8IFJvd0NvbDxudW1iZXI+O1xuICBoZWFkZXJCYW5kPzogbnVtYmVyIHwgUm93Q29sPG51bWJlcj47XG4gIGZvb3RlckJhbmQ/OiBudW1iZXIgfCBSb3dDb2w8bnVtYmVyPjtcbiAgb2Zmc2V0OiBudW1iZXIgfCB7XG4gICAgcm93SGVhZGVyOiBudW1iZXIsXG4gICAgcm93Rm9vdGVyOiBudW1iZXIsXG4gICAgcm93VGl0bGU6IG51bWJlcixcbiAgICBjb2x1bW5IZWFkZXI6IG51bWJlcixcbiAgICBjb2x1bW5Gb290ZXI6IG51bWJlcixcbiAgICBjb2x1bW5UaXRsZTogbnVtYmVyXG4gIH07XG4gIGJvdW5kczogJ2Z1bGwnIHwgJ2ZsdXNoJztcbiAgY29sdW1ucz86IG51bWJlciB8IHtzaWduYWw6IHN0cmluZ307XG4gIGFsaWduPzogVmdMYXlvdXRBbGlnbiB8IHtcbiAgICByb3c6IFZnTGF5b3V0QWxpZ24sXG4gICAgY29sdW1uOiBWZ0xheW91dEFsaWduXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFSZWZVbmlvbmVkRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgRGF0YVJlZlVuaW9uRG9tYWluIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICByZXR1cm4gJ2ZpZWxkcycgaW4gZG9tYWluICYmICEoJ2RhdGEnIGluIGRvbWFpbik7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFJlZlVuaW9uRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgVmdGaWVsZFJlZlVuaW9uRG9tYWluIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICByZXR1cm4gJ2ZpZWxkcycgaW4gZG9tYWluICYmICdkYXRhJyBpbiBkb21haW47XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhUmVmRG9tYWluKGRvbWFpbjogVmdEb21haW4pOiBkb21haW4gaXMgVmdEYXRhUmVmIHtcbiAgaWYgKCFpc0FycmF5KGRvbWFpbikpIHtcbiAgICAgcmV0dXJuICdmaWVsZCcgaW4gZG9tYWluICYmICdkYXRhJyBpbiBkb21haW47XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTaWduYWxSZWZEb21haW4oZG9tYWluOiBWZ0RvbWFpbik6IGRvbWFpbiBpcyBWZ1NpZ25hbFJlZiB7XG4gIGlmICghaXNBcnJheShkb21haW4pKSB7XG4gICAgcmV0dXJuICdzaWduYWwnIGluIGRvbWFpbjtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdFdmVudEhhbmRsZXIge1xuICBldmVudHM6IHN0cmluZ1tdIHwgVmdTaWduYWxSZWY7XG4gIHVwZGF0ZT86IHN0cmluZztcbiAgZW5jb2RlPzogc3RyaW5nO1xuICBmb3JjZT86IGJvb2xlYW47XG4gIGJldHdlZW4/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ1NpZ25hbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgYmluZD86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uPzogVmdFdmVudEhhbmRsZXJbXTtcbiAgdXBkYXRlPzogc3RyaW5nO1xuICByZWFjdD86IGJvb2xlYW47XG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHt9IHwgVmdTaWduYWxSZWY7XG4gIC8vIG9ubHkgZm9yIG5lc3RlZCBzaWduYWxzXG4gIHB1c2g/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIFZnRW5jb2RlQ2hhbm5lbCA9ICd4J3wneDInfCd4Yyd8J3dpZHRoJ3wneSd8J3kyJ3wneWMnfCdoZWlnaHQnfCdvcGFjaXR5J3wnZmlsbCd8J2ZpbGxPcGFjaXR5J3wnc3Ryb2tlJ3wnc3Ryb2tlV2lkdGgnfCdzdHJva2VDYXAnfCdzdHJva2VPcGFjaXR5J3wnc3Ryb2tlRGFzaCd8J3N0cm9rZURhc2hPZmZzZXQnfCdjdXJzb3InfCdjbGlwJ3wnc2l6ZSd8J3NoYXBlJ3wncGF0aCd8J2lubmVyUmFkaXVzJ3wnb3V0ZXJSYWRpdXMnfCdzdGFydEFuZ2xlJ3wnZW5kQW5nbGUnfCdpbnRlcnBvbGF0ZSd8J3RlbnNpb24nfCdvcmllbnQnfCd1cmwnfCdhbGlnbid8J2Jhc2VsaW5lJ3wndGV4dCd8J2Rpcid8J2VsbGlwc2lzJ3wnbGltaXQnfCdkeCd8J2R5J3wncmFkaXVzJ3wndGhldGEnfCdhbmdsZSd8J2ZvbnQnfCdmb250U2l6ZSd8J2ZvbnRXZWlnaHQnfCdmb250U3R5bGUnfCd0b29sdGlwJ3wnaHJlZid8J2N1cnNvcid8J2RlZmluZWQnO1xuZXhwb3J0IHR5cGUgVmdFbmNvZGVFbnRyeSA9IHtcbiAgW2sgaW4gVmdFbmNvZGVDaGFubmVsXT86IFZnVmFsdWVSZWYgfCAoVmdWYWx1ZVJlZiAmIHt0ZXN0Pzogc3RyaW5nfSlbXTtcbn07XG5cblxuLy8gVE9ETzogbWFrZSBleHBvcnQgaW50ZXJmYWNlIFZnRW5jb2RlRW50cnkge1xuLy8gICB4PzogVmdWYWx1ZVJlZjxudW1iZXI+XG4vLyAgIHk/OiBWZ1ZhbHVlUmVmPG51bWJlcj5cbi8vICAuLi5cbi8vICAgY29sb3I/OiBWZ1ZhbHVlUmVmPHN0cmluZz5cbi8vICAuLi5cbi8vIH1cblxuZXhwb3J0IHR5cGUgQXhpc09yaWVudCA9ICd0b3AnIHwgJ3JpZ2h0JyB8ICdsZWZ0JyB8ICdib3R0b20nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnQXhpcyB7XG4gIHNjYWxlOiBzdHJpbmc7XG4gIGRvbWFpbj86IGJvb2xlYW47XG4gIGZvcm1hdD86IHN0cmluZztcbiAgZ3JpZD86IGJvb2xlYW47XG4gIGdyaWRTY2FsZT86IHN0cmluZztcblxuICBsYWJlbHM/OiBib29sZWFuO1xuXG4gIGxhYmVsQm91bmQ/OiBib29sZWFuIHwgbnVtYmVyO1xuICBsYWJlbEZsdXNoPzogYm9vbGVhbiB8IG51bWJlcjtcbiAgbGFiZWxQYWRkaW5nPzogbnVtYmVyO1xuICBsYWJlbE92ZXJsYXA/OiBib29sZWFuIHwgJ3Bhcml0eScgfCAnZ3JlZWR5JztcbiAgbWF4RXh0ZW50PzogbnVtYmVyO1xuICBtaW5FeHRlbnQ/OiBudW1iZXI7XG4gIG9mZnNldD86IG51bWJlcjtcbiAgb3JpZW50PzogQXhpc09yaWVudDtcbiAgcG9zaXRpb24/OiBudW1iZXI7XG5cbiAgdGlja3M/OiBib29sZWFuO1xuICB0aWNrQ291bnQ/OiBudW1iZXI7XG4gIHRpY2tTaXplPzogbnVtYmVyO1xuXG4gIHRpdGxlPzogc3RyaW5nO1xuICB0aXRsZVBhZGRpbmc/OiBudW1iZXI7XG5cbiAgdmFsdWVzPzogYW55W10gfCBWZ1NpZ25hbFJlZjtcbiAgemluZGV4PzogbnVtYmVyO1xuXG4gIGVuY29kZT86IFZnQXhpc0VuY29kZTtcbn1cblxuZXhwb3J0IHR5cGUgTGVnZW5kVHlwZSA9ICdzeW1ib2wnIHwgJ2dyYWRpZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBWZ0xlZ2VuZCB7XG4gIGZpbGw/OiBzdHJpbmc7XG4gIHN0cm9rZT86IHN0cmluZztcbiAgc2l6ZT86IHN0cmluZztcbiAgc2hhcGU/OiBzdHJpbmc7XG4gIG9wYWNpdHk/OiBzdHJpbmc7XG5cbiAgZW50cnlQYWRkaW5nPzogbnVtYmVyO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICBvcmllbnQ/OiBMZWdlbmRPcmllbnQ7XG4gIHBhZGRpbmc/OiBudW1iZXI7XG5cbiAgdGlja0NvdW50PzogbnVtYmVyO1xuICB0aXRsZT86IHN0cmluZztcbiAgdHlwZT86IExlZ2VuZFR5cGU7XG4gIHZhbHVlcz86IGFueVtdIHwgVmdTaWduYWxSZWY7XG4gIHppbmRleD86IG51bWJlcjtcblxuICBlbmNvZGU/OiBWZ0xlZ2VuZEVuY29kZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0JpblRyYW5zZm9ybSBleHRlbmRzIEJhc2VCaW4ge1xuICB0eXBlOiAnYmluJztcbiAgZXh0ZW50PzogbnVtYmVyW10gfCB7c2lnbmFsOiBzdHJpbmd9O1xuICBmaWVsZDogc3RyaW5nO1xuICBhczogc3RyaW5nW107XG4gIHNpZ25hbD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0V4dGVudFRyYW5zZm9ybSB7XG4gIHR5cGU6ICdleHRlbnQnO1xuICBmaWVsZDogc3RyaW5nO1xuICBzaWduYWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0Zvcm11bGFUcmFuc2Zvcm0ge1xuICB0eXBlOiAnZm9ybXVsYSc7XG4gIGFzOiBzdHJpbmc7XG4gIGV4cHI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0ZpbHRlclRyYW5zZm9ybSB7XG4gIHR5cGU6ICdmaWx0ZXInO1xuICBleHByOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBZ2dyZWdhdGVUcmFuc2Zvcm0ge1xuICB0eXBlOiAnYWdncmVnYXRlJztcbiAgZ3JvdXBieT86IFZnRmllbGRSZWZbXTtcbiAgZmllbGRzPzogVmdGaWVsZFJlZltdO1xuICBvcHM/OiBBZ2dyZWdhdGVPcFtdO1xuICBhcz86IHN0cmluZ1tdO1xuICBjcm9zcz86IGJvb2xlYW47XG4gIGRyb3A/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnQ29sbGVjdFRyYW5zZm9ybSB7XG4gIHR5cGU6ICdjb2xsZWN0JztcbiAgc29ydDogVmdTb3J0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnTG9va3VwVHJhbnNmb3JtIHtcbiAgdHlwZTogJ2xvb2t1cCc7XG4gIGZyb206IHN0cmluZztcbiAga2V5OiBzdHJpbmc7XG4gIGZpZWxkczogc3RyaW5nW107XG4gIHZhbHVlcz86IHN0cmluZ1tdO1xuICBhcz86IHN0cmluZ1tdO1xuICBkZWZhdWx0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnU3RhY2tUcmFuc2Zvcm0ge1xuICB0eXBlOiAnc3RhY2snO1xuICBvZmZzZXQ/OiBTdGFja09mZnNldDtcbiAgZ3JvdXBieTogc3RyaW5nW107XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHNvcnQ6IFZnU29ydDtcbiAgYXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnSWRlbnRpZmllclRyYW5zZm9ybSB7XG4gIHR5cGU6ICdpZGVudGlmaWVyJztcbiAgYXM6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgVmdUcmFuc2Zvcm0gPSBWZ0JpblRyYW5zZm9ybSB8IFZnRXh0ZW50VHJhbnNmb3JtIHwgVmdGb3JtdWxhVHJhbnNmb3JtIHwgVmdBZ2dyZWdhdGVUcmFuc2Zvcm0gfCBWZ0ZpbHRlclRyYW5zZm9ybSB8IFZnSW1wdXRlVHJhbnNmb3JtIHwgVmdTdGFja1RyYW5zZm9ybSB8IFZnQ29sbGVjdFRyYW5zZm9ybSB8IFZnTG9va3VwVHJhbnNmb3JtIHwgVmdJZGVudGlmaWVyVHJhbnNmb3JtIHwgVmdHZW9Qb2ludFRyYW5zZm9ybSB8IFZnR2VvSlNPTlRyYW5zZm9ybSB8IFZnR2VvSlNPTlRyYW5zZm9ybSB8IFZnV2luZG93VHJhbnNmb3JtO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnR2VvUG9pbnRUcmFuc2Zvcm0ge1xuICB0eXBlOiAnZ2VvcG9pbnQnO1xuICBwcm9qZWN0aW9uOiBzdHJpbmc7IC8vIHByb2plY3Rpb24gbmFtZVxuICBmaWVsZHM6IFZnRmllbGRSZWZbXTtcbiAgYXM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0dlb1NoYXBlVHJhbnNmb3JtIHtcbiAgdHlwZTogJ2dlb3NoYXBlJztcbiAgcHJvamVjdGlvbjogc3RyaW5nOyAvLyBwcm9qZWN0aW9uIG5hbWVcbiAgZmllbGQ/OiBWZ0ZpZWxkUmVmO1xuICBhcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0dlb0pTT05UcmFuc2Zvcm0ge1xuICB0eXBlOiAnZ2VvanNvbic7XG4gIGZpZWxkcz86IFZnRmllbGRSZWZbXTtcbiAgZ2VvanNvbj86IFZnRmllbGRSZWY7XG4gIHNpZ25hbDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBWZ1Bvc3RFbmNvZGluZ1RyYW5zZm9ybSA9IFZnR2VvU2hhcGVUcmFuc2Zvcm07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBeGlzRW5jb2RlIHtcbiAgdGlja3M/OiBWZ0d1aWRlRW5jb2RlO1xuICBsYWJlbHM/OiBWZ0d1aWRlRW5jb2RlO1xuICB0aXRsZT86IFZnR3VpZGVFbmNvZGU7XG4gIGdyaWQ/OiBWZ0d1aWRlRW5jb2RlO1xuICBkb21haW4/OiBWZ0d1aWRlRW5jb2RlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnTGVnZW5kRW5jb2RlIHtcbiAgdGl0bGU/OiBWZ0d1aWRlRW5jb2RlO1xuICBsYWJlbHM/OiBWZ0d1aWRlRW5jb2RlO1xuICBsZWdlbmQ/OiBWZ0d1aWRlRW5jb2RlO1xuICBzeW1ib2xzPzogVmdHdWlkZUVuY29kZTtcbiAgZ3JhZGllbnQ/OiBWZ0d1aWRlRW5jb2RlO1xufVxuXG5leHBvcnQgdHlwZSBWZ0d1aWRlRW5jb2RlID0gYW55OyAvLyBUT0RPOiByZXBsYWNlIHRoaXMgKFNlZSBndWlkZUVuY29kZSBpbiBWZWdhIFNjaGVtYSlcblxuZXhwb3J0IHR5cGUgVmdTb3J0ID0ge1xuICBmaWVsZDogc3RyaW5nO1xuICBvcmRlcj86IFZnQ29tcGFyYXRvck9yZGVyO1xufSB8IHtcbiAgZmllbGQ6IHN0cmluZ1tdO1xuICBvcmRlcj86IChWZ0NvbXBhcmF0b3JPcmRlcilbXTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdJbXB1dGVUcmFuc2Zvcm0ge1xuICB0eXBlOiAnaW1wdXRlJztcbiAgZ3JvdXBieT86IHN0cmluZ1tdO1xuICBmaWVsZDogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAga2V5dmFscz86IHN0cmluZ1tdO1xuICBtZXRob2Q/OiAndmFsdWUnIHwgJ21lZGlhbicgfCAnbWF4JyB8ICdtaW4nIHwgJ21lYW4nO1xuICB2YWx1ZT86IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgVmdDaGVja2JveEJpbmRpbmcgPSB7XG4gIGlucHV0OiAnY2hlY2tib3gnO1xuICBlbGVtZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVmdSYWRpb0JpbmRpbmcgPSB7XG4gIGlucHV0OiAncmFkaW8nO1xuICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgZWxlbWVudD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZnU2VsZWN0QmluZGluZyA9IHtcbiAgaW5wdXQ6ICdzZWxlY3QnO1xuICBvcHRpb25zOiBzdHJpbmdbXTtcbiAgZWxlbWVudD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFZnUmFuZ2VCaW5kaW5nID0ge1xuICBpbnB1dDogJ3JhbmdlJztcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHN0ZXA/OiBudW1iZXI7XG4gIGVsZW1lbnQ/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBWZ0dlbmVyaWNCaW5kaW5nID0ge1xuICBpbnB1dDogc3RyaW5nO1xuICBlbGVtZW50Pzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgVmdCaW5kaW5nID0gVmdDaGVja2JveEJpbmRpbmcgfCBWZ1JhZGlvQmluZGluZyB8XG4gIFZnU2VsZWN0QmluZGluZyB8IFZnUmFuZ2VCaW5kaW5nIHwgVmdHZW5lcmljQmluZGluZztcblxuXG4vKipcbiAqIEJhc2Ugb2JqZWN0IGZvciBWZWdhJ3MgQXhpcyBhbmQgQXhpcyBDb25maWcuXG4gKiBBbGwgb2YgdGhlc2UgcHJvcGVydGllcyBhcmUgYm90aCBwcm9wZXJ0aWVzIG9mIFZlZ2EncyBBeGlzIGFuZCBBeGlzIENvbmZpZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZ0F4aXNCYXNlIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGhlIGRvbWFpbiAodGhlIGF4aXMgYmFzZWxpbmUpIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBheGlzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgXG4gICAqL1xuICBkb21haW4/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmIGdyaWQgbGluZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGF4aXNcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGB0cnVlYCBmb3IgW2NvbnRpbnVvdXMgc2NhbGVzXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NjYWxlLmh0bWwjY29udGludW91cykgdGhhdCBhcmUgbm90IGJpbm5lZDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICAgKi9cbiAgZ3JpZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgbGFiZWxzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBheGlzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gIGB0cnVlYC5cbiAgICovXG4gIGxhYmVscz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBsYWJlbHMgc2hvdWxkIGJlIGhpZGRlbiBpZiB0aGV5IGV4Y2VlZCB0aGUgYXhpcyByYW5nZS4gSWbCoGBmYWxzZcKgYCh0aGUgZGVmYXVsdCkgbm8gYm91bmRzIG92ZXJsYXAgYW5hbHlzaXMgaXMgcGVyZm9ybWVkLiBJZsKgYHRydWVgLCBsYWJlbHMgd2lsbCBiZSBoaWRkZW4gaWYgdGhleSBleGNlZWQgdGhlIGF4aXMgcmFuZ2UgYnkgbW9yZSB0aGFuIDEgcGl4ZWwuIElmIHRoaXMgcHJvcGVydHkgaXMgYSBudW1iZXIsIGl0IHNwZWNpZmllcyB0aGUgcGl4ZWwgdG9sZXJhbmNlOiB0aGUgbWF4aW11bSBhbW91bnQgYnkgd2hpY2ggYSBsYWJlbCBib3VuZGluZyBib3ggbWF5IGV4Y2VlZCB0aGUgYXhpcyByYW5nZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBmYWxzZWAuXG4gICAqL1xuICBsYWJlbEJvdW5kPzogYm9vbGVhbiB8IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaXJzdCBhbmQgbGFzdCBheGlzIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBmbHVzaCB3aXRoIHRoZSBzY2FsZSByYW5nZS4gRmx1c2ggYWxpZ25tZW50IGZvciBhIGhvcml6b250YWwgYXhpcyB3aWxsIGxlZnQtYWxpZ24gdGhlIGZpcnN0IGxhYmVsIGFuZCByaWdodC1hbGlnbiB0aGUgbGFzdCBsYWJlbC4gRm9yIHZlcnRpY2FsIGF4ZXMsIGJvdHRvbSBhbmQgdG9wIHRleHQgYmFzZWxpbmVzIGFyZSBhcHBsaWVkIGluc3RlYWQuIElmIHRoaXMgcHJvcGVydHkgaXMgYSBudW1iZXIsIGl0IGFsc28gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGJ5IHdoaWNoIHRvIG9mZnNldCB0aGUgZmlyc3QgYW5kIGxhc3QgbGFiZWxzOyBmb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIHdpbGwgZmx1c2gtYWxpZ24gdGhlIGZpcnN0IGFuZCBsYXN0IGxhYmVscyBhbmQgYWxzbyBwdXNoIHRoZW0gMiBwaXhlbHMgb3V0d2FyZCBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIGF4aXMuIFRoZSBhZGRpdGlvbmFsIGFkanVzdG1lbnQgY2FuIHNvbWV0aW1lcyBoZWxwIHRoZSBsYWJlbHMgYmV0dGVyIHZpc3VhbGx5IGdyb3VwIHdpdGggY29ycmVzcG9uZGluZyBheGlzIHRpY2tzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHRydWVgIGZvciBheGlzIG9mIGEgY29udGludW91cyB4LXNjYWxlLiBPdGhlcndpc2UsIGBmYWxzZWAuXG4gICAqL1xuICBsYWJlbEZsdXNoPzogYm9vbGVhbiB8IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHN0cmF0ZWd5IHRvIHVzZSBmb3IgcmVzb2x2aW5nIG92ZXJsYXAgb2YgYXhpcyBsYWJlbHMuIElmIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSwgbm8gb3ZlcmxhcCByZWR1Y3Rpb24gaXMgYXR0ZW1wdGVkLiBJZiBzZXQgdG8gYHRydWVgIG9yIGBcInBhcml0eVwiYCwgYSBzdHJhdGVneSBvZiByZW1vdmluZyBldmVyeSBvdGhlciBsYWJlbCBpcyB1c2VkICh0aGlzIHdvcmtzIHdlbGwgZm9yIHN0YW5kYXJkIGxpbmVhciBheGVzKS4gSWYgc2V0IHRvIGBcImdyZWVkeVwiYCwgYSBsaW5lYXIgc2NhbiBvZiB0aGUgbGFiZWxzIGlzIHBlcmZvcm1lZCwgcmVtb3ZpbmcgYW55IGxhYmVscyB0aGF0IG92ZXJsYXBzIHdpdGggdGhlIGxhc3QgdmlzaWJsZSBsYWJlbCAodGhpcyBvZnRlbiB3b3JrcyBiZXR0ZXIgZm9yIGxvZy1zY2FsZWQgYXhlcykuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgdHJ1ZWAgZm9yIG5vbi1ub21pbmFsIGZpZWxkcyB3aXRoIG5vbi1sb2cgc2NhbGVzOyBgXCJncmVlZHlcImAgZm9yIGxvZyBzY2FsZXM7IG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgbGFiZWxPdmVybGFwPzogYm9vbGVhbiB8ICdwYXJpdHknIHwgJ2dyZWVkeSc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWRkaW5nLCBpbiBwaXhlbHMsIGJldHdlZW4gYXhpcyBhbmQgdGV4dCBsYWJlbHMuXG4gICAqL1xuICBsYWJlbFBhZGRpbmc/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEJvb2xlYW4gdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGF4aXMgc2hvdWxkIGluY2x1ZGUgdGlja3MuXG4gICAqL1xuICB0aWNrcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBzaXplIGluIHBpeGVscyBvZiBheGlzIHRpY2tzLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICB0aWNrU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4IGxlbmd0aCBmb3IgYXhpcyB0aXRsZSBpZiB0aGUgdGl0bGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgZmllbGQncyBkZXNjcmlwdGlvbi5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHVuZGVmaW5lZGAuXG4gICAqL1xuICB0aXRsZU1heExlbmd0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aXRsZSBhbmQgYXhpcy5cbiAgICovXG4gIHRpdGxlUGFkZGluZz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gZXh0ZW50IGluIHBpeGVscyB0aGF0IGF4aXMgdGlja3MgYW5kIGxhYmVscyBzaG91bGQgdXNlLiBUaGlzIGRldGVybWluZXMgYSBtaW5pbXVtIG9mZnNldCB2YWx1ZSBmb3IgYXhpcyB0aXRsZXMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMzBgIGZvciB5LWF4aXM7IGB1bmRlZmluZWRgIGZvciB4LWF4aXMuXG4gICAqL1xuICBtaW5FeHRlbnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGV4dGVudCBpbiBwaXhlbHMgdGhhdCBheGlzIHRpY2tzIGFuZCBsYWJlbHMgc2hvdWxkIHVzZS4gVGhpcyBkZXRlcm1pbmVzIGEgbWF4aW11bSBvZmZzZXQgdmFsdWUgZm9yIGF4aXMgdGl0bGVzLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYHVuZGVmaW5lZGAuXG4gICAqL1xuICBtYXhFeHRlbnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdBeGlzQ29uZmlnIGV4dGVuZHMgVmdBeGlzQmFzZSB7XG4gIC8qKlxuICAgKiBBbiBpbnRlcnBvbGF0aW9uIGZyYWN0aW9uIGluZGljYXRpbmcgd2hlcmUsIGZvciBgYmFuZGAgc2NhbGVzLCBheGlzIHRpY2tzIHNob3VsZCBiZSBwb3NpdGlvbmVkLiBBIHZhbHVlIG9mIGAwYCBwbGFjZXMgdGlja3MgYXQgdGhlIGxlZnQgZWRnZSBvZiB0aGVpciBiYW5kcy4gQSB2YWx1ZSBvZiBgMC41YCBwbGFjZXMgdGlja3MgaW4gdGhlIG1pZGRsZSBvZiB0aGVpciBiYW5kcy5cbiAgICovXG4gIGJhbmRQb3NpdGlvbj86IG51bWJlcjtcbiAgLyoqXG4gICAqIFN0cm9rZSB3aWR0aCBvZiBheGlzIGRvbWFpbiBsaW5lXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAgKG5vbmUsIHVzaW5nIFZlZ2EgZGVmYXVsdCkuXG4gICAqL1xuICBkb21haW5XaWR0aD86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29sb3Igb2YgYXhpcyBkb21haW4gbGluZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICAobm9uZSwgdXNpbmcgVmVnYSBkZWZhdWx0KS5cbiAgICovXG4gIGRvbWFpbkNvbG9yPzogc3RyaW5nO1xuXG4gIC8vIC0tLS0tLS0tLS0gR3JpZCAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBDb2xvciBvZiBncmlkbGluZXMuXG4gICAqL1xuICBncmlkQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvZmZzZXQgKGluIHBpeGVscykgaW50byB3aGljaCB0byBiZWdpbiBkcmF3aW5nIHdpdGggdGhlIGdyaWQgZGFzaCBhcnJheS5cbiAgICovXG4gIGdyaWREYXNoPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSBvZiBncmlkICh2YWx1ZSBiZXR3ZWVuIFswLDFdKVxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKGAxYCBieSBkZWZhdWx0KVxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDFcbiAgICovXG4gIGdyaWRPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZ3JpZCB3aWR0aCwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBncmlkV2lkdGg/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBUaWNrcyAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGF4aXMncyB0aWNrLlxuICAgKi9cbiAgdGlja0NvbG9yPzogc3RyaW5nO1xuXG5cbiAgLyoqXG4gICAqIFRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgYXhpcyBsYWJlbHMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgLTkwYCBmb3Igbm9taW5hbCBhbmQgb3JkaW5hbCBmaWVsZHM7IGAwYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBtaW5pbXVtIC0zNjBcbiAgICogQG1heGltdW0gMzYwXG4gICAqL1xuICBsYWJlbEFuZ2xlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIHRpY2sgbGFiZWwsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICBsYWJlbENvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBvZiB0aGUgdGljayBsYWJlbC5cbiAgICovXG4gIGxhYmVsRm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnQgc2l6ZSBvZiB0aGUgbGFiZWwsIGluIHBpeGVscy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgbGFiZWxGb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGljayBsYWJlbHMuXG4gICAqL1xuICBsYWJlbExpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiBwaXhlbCBwb3NpdGlvbiB2YWx1ZXMgc2hvdWxkIGJlIHJvdW5kZWQgdG8gdGhlIG5lYXJlc3QgaW50ZWdlci5cbiAgICovXG4gIHRpY2tSb3VuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCwgaW4gcGl4ZWxzLCBvZiB0aWNrcy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgdGlja1dpZHRoPzogbnVtYmVyO1xuXG4gIC8vIC0tLS0tLS0tLS0gVGl0bGUgLS0tLS0tLS0tLVxuXG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIHRleHQgYWxpZ25tZW50IG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVBbGlnbj86IHN0cmluZztcblxuICAvKipcbiAgICogQW5nbGUgaW4gZGVncmVlcyBvZiBheGlzIHRpdGxlcy5cbiAgICovXG4gIHRpdGxlQW5nbGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBWZXJ0aWNhbCB0ZXh0IGJhc2VsaW5lIGZvciBheGlzIHRpdGxlcy5cbiAgICovXG4gIHRpdGxlQmFzZWxpbmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb2xvciBvZiB0aGUgdGl0bGUsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICB0aXRsZUNvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb250IG9mIHRoZSB0aXRsZS4gKGUuZy4sIGBcIkhlbHZldGljYSBOZXVlXCJgKS5cbiAgICovXG4gIHRpdGxlRm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogRm9udCBzaXplIG9mIHRoZSB0aXRsZS5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgdGl0bGVGb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9udCB3ZWlnaHQgb2YgdGhlIHRpdGxlLlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgKGUuZyBgXCJib2xkXCJgLCBgXCJub3JtYWxcImApIG9yIGEgbnVtYmVyIChgMTAwYCwgYDIwMGAsIGAzMDBgLCAuLi4sIGA5MDBgIHdoZXJlIGBcIm5vcm1hbFwiYCA9IGA0MDBgIGFuZCBgXCJib2xkXCJgID0gYDcwMGApLlxuICAgKi9cbiAgdGl0bGVGb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogWC1jb29yZGluYXRlIG9mIHRoZSBheGlzIHRpdGxlIHJlbGF0aXZlIHRvIHRoZSBheGlzIGdyb3VwLlxuICAgKi9cbiAgdGl0bGVYPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBZLWNvb3JkaW5hdGUgb2YgdGhlIGF4aXMgdGl0bGUgcmVsYXRpdmUgdG8gdGhlIGF4aXMgZ3JvdXAuXG4gICAqL1xuICB0aXRsZVk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIExlZ2VuZE9yaWVudCA9ICdsZWZ0JyB8ICdyaWdodCcgfCAndG9wLWxlZnQnIHwgJ3RvcC1yaWdodCcgfCAnYm90dG9tLWxlZnQnIHwgJ2JvdHRvbS1yaWdodCcgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmdMZWdlbmRCYXNlIHtcbiAgLyoqXG4gICAqIFBhZGRpbmcgKGluIHBpeGVscykgYmV0d2VlbiBsZWdlbmQgZW50cmllcyBpbiBhIHN5bWJvbCBsZWdlbmQuXG4gICAqL1xuICBlbnRyeVBhZGRpbmc/OiBudW1iZXI7XG5cblxuICAvKipcbiAgICogVGhlIG9yaWVudGF0aW9uIG9mIHRoZSBsZWdlbmQsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBsZWdlbmQgaXMgcG9zaXRpb25lZCB3aXRoaW4gdGhlIHNjZW5lLiBPbmUgb2YgXCJsZWZ0XCIsIFwicmlnaHRcIiwgXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsIFwiYm90dG9tLXJpZ2h0XCIsIFwibm9uZVwiLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwicmlnaHRcImBcbiAgICovXG4gIG9yaWVudD86IExlZ2VuZE9yaWVudDtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCwgaW4gcGl4ZWxzLCBieSB3aGljaCB0byBkaXNwbGFjZSB0aGUgbGVnZW5kIGZyb20gdGhlIGVkZ2Ugb2YgdGhlIGVuY2xvc2luZyBncm91cCBvciBkYXRhIHJlY3RhbmdsZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fICBgMGBcbiAgICovXG4gIG9mZnNldD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aGUgbGVnZW5kIGFuZCBheGlzLlxuICAgKi9cbiAgcGFkZGluZz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZ0xlZ2VuZENvbmZpZyBleHRlbmRzIFZnTGVnZW5kQmFzZSB7XG5cbiAgLyoqXG4gICAqIENvcm5lciByYWRpdXMgZm9yIHRoZSBmdWxsIGxlZ2VuZC5cbiAgICovXG4gIGNvcm5lclJhZGl1cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQmFja2dyb3VuZCBmaWxsIGNvbG9yIGZvciB0aGUgZnVsbCBsZWdlbmQuXG4gICAqL1xuICBmaWxsQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEJvcmRlciBzdHJva2UgY29sb3IgZm9yIHRoZSBmdWxsIGxlZ2VuZC5cbiAgICovXG4gIHN0cm9rZUNvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBCb3JkZXIgc3Ryb2tlIGRhc2ggcGF0dGVybiBmb3IgdGhlIGZ1bGwgbGVnZW5kLlxuICAgKi9cbiAgc3Ryb2tlRGFzaD86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBCb3JkZXIgc3Ryb2tlIHdpZHRoIGZvciB0aGUgZnVsbCBsZWdlbmQuXG4gICAqL1xuICBzdHJva2VXaWR0aD86IG51bWJlcjtcbiAgLy8gLS0tLS0tLS0tLSBHcmFkaWVudCAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGdyYWRpZW50IHN0cm9rZSwgY2FuIGJlIGluIGhleCBjb2xvciBjb2RlIG9yIHJlZ3VsYXIgY29sb3IgbmFtZS5cbiAgICovXG4gIGdyYWRpZW50U3Ryb2tlQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZ3JhZGllbnQgc3Ryb2tlLCBpbiBwaXhlbHMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGdyYWRpZW50U3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBoZWlnaHQgb2YgdGhlIGdyYWRpZW50LCBpbiBwaXhlbHMuXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGdyYWRpZW50SGVpZ2h0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUZXh0IGJhc2VsaW5lIGZvciBjb2xvciByYW1wIGdyYWRpZW50IGxhYmVscy5cbiAgICovXG4gIGdyYWRpZW50TGFiZWxCYXNlbGluZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggaW4gcGl4ZWxzIG9mIGNvbG9yIHJhbXAgZ3JhZGllbnQgbGFiZWxzLlxuICAgKi9cbiAgZ3JhZGllbnRMYWJlbExpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBWZXJ0aWNhbCBvZmZzZXQgaW4gcGl4ZWxzIGZvciBjb2xvciByYW1wIGdyYWRpZW50IGxhYmVscy5cbiAgICovXG4gIGdyYWRpZW50TGFiZWxPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB3aWR0aCBvZiB0aGUgZ3JhZGllbnQsIGluIHBpeGVscy5cbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgZ3JhZGllbnRXaWR0aD86IG51bWJlcjtcblxuICAvLyAtLS0tLS0tLS0tIExhYmVsIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGxlZ2VuZCBsYWJlbCwgY2FuIGJlIGxlZnQsIG1pZGRsZSBvciByaWdodC5cbiAgICovXG4gIGxhYmVsQWxpZ24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgYmFzZWxpbmUgb2YgbGVnZW5kIGxhYmVsLCBjYW4gYmUgdG9wLCBtaWRkbGUgb3IgYm90dG9tLlxuICAgKi9cbiAgbGFiZWxCYXNlbGluZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBsZWdlbmQgbGFiZWwsIGNhbiBiZSBpbiBoZXggY29sb3IgY29kZSBvciByZWd1bGFyIGNvbG9yIG5hbWUuXG4gICAqL1xuICBsYWJlbENvbG9yPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBvZiB0aGUgbGVnZW5kIGxhYmVsLlxuICAgKi9cbiAgbGFiZWxGb250Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZm9udCBzaXplIG9mIGxlZ2VuZCBsYWJlbC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGAxMGAuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGxhYmVsRm9udFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gYWxsb3dlZCBwaXhlbCB3aWR0aCBvZiBheGlzIHRpY2sgbGFiZWxzLlxuICAgKi9cbiAgbGFiZWxMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG9mZnNldCBvZiB0aGUgbGVnZW5kIGxhYmVsLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBsYWJlbE9mZnNldD86IG51bWJlcjtcblxuICAvLyAtLS0tLS0tLS0tIFN5bWJvbHMgLS0tLS0tLS0tLVxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBsZWdlbmQgc3ltYm9sLFxuICAgKi9cbiAgc3ltYm9sQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgc2hhcGUgdHlwZSAoc3VjaCBhcyBcImNpcmNsZVwiKSBmb3IgbGVnZW5kIHN5bWJvbHMuXG4gICAqL1xuICBzeW1ib2xUeXBlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgbGVnZW5kIHN5bWJvbCwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBzeW1ib2xTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgd2lkdGggb2YgdGhlIHN5bWJvbCdzIHN0cm9rZS5cbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgc3ltYm9sU3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBUaXRsZSAtLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBIb3Jpem9udGFsIHRleHQgYWxpZ25tZW50IGZvciBsZWdlbmQgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVBbGlnbj86IHN0cmluZztcblxuICAgLyoqXG4gICAgKiBWZXJ0aWNhbCB0ZXh0IGJhc2VsaW5lIGZvciBsZWdlbmQgdGl0bGVzLlxuICAgICovXG4gIHRpdGxlQmFzZWxpbmU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY29sb3Igb2YgdGhlIGxlZ2VuZCB0aXRsZSwgY2FuIGJlIGluIGhleCBjb2xvciBjb2RlIG9yIHJlZ3VsYXIgY29sb3IgbmFtZS5cbiAgICovXG4gIHRpdGxlQ29sb3I/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IG9mIHRoZSBsZWdlbmQgdGl0bGUuXG4gICAqL1xuICB0aXRsZUZvbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IHNpemUgb2YgdGhlIGxlZ2VuZCB0aXRsZS5cbiAgICovXG4gIHRpdGxlRm9udFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBmb250IHdlaWdodCBvZiB0aGUgbGVnZW5kIHRpdGxlLlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgKGUuZyBgXCJib2xkXCJgLCBgXCJub3JtYWxcImApIG9yIGEgbnVtYmVyIChgMTAwYCwgYDIwMGAsIGAzMDBgLCAuLi4sIGA5MDBgIHdoZXJlIGBcIm5vcm1hbFwiYCA9IGA0MDBgIGFuZCBgXCJib2xkXCJgID0gYDcwMGApLlxuICAgKi9cbiAgdGl0bGVGb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogTWF4aW11bSBhbGxvd2VkIHBpeGVsIHdpZHRoIG9mIGF4aXMgdGl0bGVzLlxuICAgKi9cbiAgdGl0bGVMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHBhZGRpbmcsIGluIHBpeGVscywgYmV0d2VlbiB0aXRsZSBhbmQgbGVnZW5kLlxuICAgKi9cbiAgdGl0bGVQYWRkaW5nPzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBGb250U3R5bGUgPSAnbm9ybWFsJyB8ICdpdGFsaWMnO1xuXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0U3RyaW5nID0gJ25vcm1hbCcgfCAnYm9sZCc7XG4vKipcbiAqIEBUSlMtdHlwZSBpbnRlZ2VyXG4gKiBAbWluaW11bSAxMDBcbiAqIEBtYXhpbXVtIDkwMFxuICovXG5leHBvcnQgdHlwZSBGb250V2VpZ2h0TnVtYmVyID0gbnVtYmVyO1xuZXhwb3J0IHR5cGUgRm9udFdlaWdodCA9IEZvbnRXZWlnaHRTdHJpbmcgfCBGb250V2VpZ2h0TnVtYmVyO1xuZXhwb3J0IHR5cGUgSG9yaXpvbnRhbEFsaWduID0gJ2xlZnQnIHwgJ3JpZ2h0JyB8ICdjZW50ZXInO1xuZXhwb3J0IHR5cGUgSW50ZXJwb2xhdGUgPSAnbGluZWFyJyB8ICdsaW5lYXItY2xvc2VkJyB8XG4gICdzdGVwJyB8ICdzdGVwLWJlZm9yZScgfCAnc3RlcC1hZnRlcicgfFxuICAnYmFzaXMnIHwgJ2Jhc2lzLW9wZW4nIHwgJ2Jhc2lzLWNsb3NlZCcgfFxuICAnY2FyZGluYWwnIHwgJ2NhcmRpbmFsLW9wZW4nIHwgJ2NhcmRpbmFsLWNsb3NlZCcgfFxuICAnYnVuZGxlJyB8ICdtb25vdG9uZSc7XG5leHBvcnQgdHlwZSBPcmllbnQgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuZXhwb3J0IHR5cGUgVmVydGljYWxBbGlnbiA9ICd0b3AnIHwgJ21pZGRsZScgfCAnYm90dG9tJztcblxuZXhwb3J0IGludGVyZmFjZSBWZ01hcmtDb25maWcge1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IEZpbGwgQ29sb3IuICBUaGlzIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGBjb25maWcuY29sb3JgXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyAoTm9uZSlcbiAgICpcbiAgICovXG4gIGZpbGw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgU3Ryb2tlIENvbG9yLiAgVGhpcyBoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgY29uZmlnLmNvbG9yYFxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gKE5vbmUpXG4gICAqXG4gICAqL1xuICBzdHJva2U/OiBzdHJpbmc7XG5cbiAgLy8gLS0tLS0tLS0tLSBPcGFjaXR5IC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBvdmVyYWxsIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDAuN2AgZm9yIG5vbi1hZ2dyZWdhdGUgcGxvdHMgd2l0aCBgcG9pbnRgLCBgdGlja2AsIGBjaXJjbGVgLCBvciBgc3F1YXJlYCBtYXJrcyBvciBsYXllcmVkIGBiYXJgIGNoYXJ0cyBhbmQgYDFgIG90aGVyd2lzZS5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBvcGFjaXR5PzogbnVtYmVyO1xuXG5cbiAgLyoqXG4gICAqIFRoZSBmaWxsIG9wYWNpdHkgKHZhbHVlIGJldHdlZW4gWzAsMV0pLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYDFgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICogQG1heGltdW0gMVxuICAgKi9cbiAgZmlsbE9wYWNpdHk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugb3BhY2l0eSAodmFsdWUgYmV0d2VlbiBbMCwxXSkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMWBcbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICBzdHJva2VPcGFjaXR5PzogbnVtYmVyO1xuXG4gIC8vIC0tLS0tLS0tLS0gU3Ryb2tlIFN0eWxlIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBzdHJva2Ugd2lkdGgsIGluIHBpeGVscy5cbiAgICpcbiAgICogQG1pbmltdW0gMFxuICAgKi9cbiAgc3Ryb2tlV2lkdGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJva2UgY2FwIGZvciBsaW5lIGVuZGluZyBzdHlsZS4gT25lIG9mIGBcImJ1dHRcImAsIGBcInJvdW5kXCJgLCBvciBgXCJzcXVhcmVcImAuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJzcXVhcmVcImBcbiAgICovXG4gIHN0cm9rZUNhcD86ICdidXR0JyB8ICdyb3VuZCcgfCAnc3F1YXJlJztcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgYWx0ZXJuYXRpbmcgc3Ryb2tlLCBzcGFjZSBsZW5ndGhzIGZvciBjcmVhdGluZyBkYXNoZWQgb3IgZG90dGVkIGxpbmVzLlxuICAgKi9cbiAgc3Ryb2tlRGFzaD86IG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgb2Zmc2V0IChpbiBwaXhlbHMpIGludG8gd2hpY2ggdG8gYmVnaW4gZHJhd2luZyB3aXRoIHRoZSBzdHJva2UgZGFzaCBhcnJheS5cbiAgICovXG4gIHN0cm9rZURhc2hPZmZzZXQ/OiBudW1iZXI7XG5cbiAgLy8gLS0tLS0tLS0tLSBPcmllbnRhdGlvbjogQmFyLCBUaWNrLCBMaW5lLCBBcmVhIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBvcmllbnRhdGlvbiBvZiBhIG5vbi1zdGFja2VkIGJhciwgdGljaywgYXJlYSwgYW5kIGxpbmUgY2hhcnRzLlxuICAgKiBUaGUgdmFsdWUgaXMgZWl0aGVyIGhvcml6b250YWwgKGRlZmF1bHQpIG9yIHZlcnRpY2FsLlxuICAgKiAtIEZvciBiYXIsIHJ1bGUgYW5kIHRpY2ssIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzaXplIG9mIHRoZSBiYXIgYW5kIHRpY2tcbiAgICogc2hvdWxkIGJlIGFwcGxpZWQgdG8geCBvciB5IGRpbWVuc2lvbi5cbiAgICogLSBGb3IgYXJlYSwgdGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBvcmllbnQgcHJvcGVydHkgb2YgdGhlIFZlZ2Egb3V0cHV0LlxuICAgKiAtIEZvciBsaW5lIGFuZCB0cmFpbCBtYXJrcywgdGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBwb2ludHMgaW4gdGhlIGxpbmVcbiAgICogaWYgYGNvbmZpZy5zb3J0TGluZUJ5YCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgKiBGb3Igc3RhY2tlZCBjaGFydHMsIHRoaXMgaXMgYWx3YXlzIGRldGVybWluZWQgYnkgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBzdGFjaztcbiAgICogdGhlcmVmb3JlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHZhbHVlIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIG9yaWVudD86IE9yaWVudDtcblxuICAvLyAtLS0tLS0tLS0tIEludGVycG9sYXRpb246IExpbmUgLyBhcmVhIC0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFRoZSBsaW5lIGludGVycG9sYXRpb24gbWV0aG9kIHRvIHVzZSBmb3IgbGluZSBhbmQgYXJlYSBtYXJrcy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqIC0gYFwibGluZWFyXCJgOiBwaWVjZXdpc2UgbGluZWFyIHNlZ21lbnRzLCBhcyBpbiBhIHBvbHlsaW5lLlxuICAgKiAtIGBcImxpbmVhci1jbG9zZWRcImA6IGNsb3NlIHRoZSBsaW5lYXIgc2VnbWVudHMgdG8gZm9ybSBhIHBvbHlnb24uXG4gICAqIC0gYFwic3RlcFwiYDogYWx0ZXJuYXRlIGJldHdlZW4gaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc2VnbWVudHMsIGFzIGluIGEgc3RlcCBmdW5jdGlvbi5cbiAgICogLSBgXCJzdGVwLWJlZm9yZVwiYDogYWx0ZXJuYXRlIGJldHdlZW4gdmVydGljYWwgYW5kIGhvcml6b250YWwgc2VnbWVudHMsIGFzIGluIGEgc3RlcCBmdW5jdGlvbi5cbiAgICogLSBgXCJzdGVwLWFmdGVyXCJgOiBhbHRlcm5hdGUgYmV0d2VlbiBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBzZWdtZW50cywgYXMgaW4gYSBzdGVwIGZ1bmN0aW9uLlxuICAgKiAtIGBcImJhc2lzXCJgOiBhIEItc3BsaW5lLCB3aXRoIGNvbnRyb2wgcG9pbnQgZHVwbGljYXRpb24gb24gdGhlIGVuZHMuXG4gICAqIC0gYFwiYmFzaXMtb3BlblwiYDogYW4gb3BlbiBCLXNwbGluZTsgbWF5IG5vdCBpbnRlcnNlY3QgdGhlIHN0YXJ0IG9yIGVuZC5cbiAgICogLSBgXCJiYXNpcy1jbG9zZWRcImA6IGEgY2xvc2VkIEItc3BsaW5lLCBhcyBpbiBhIGxvb3AuXG4gICAqIC0gYFwiY2FyZGluYWxcImA6IGEgQ2FyZGluYWwgc3BsaW5lLCB3aXRoIGNvbnRyb2wgcG9pbnQgZHVwbGljYXRpb24gb24gdGhlIGVuZHMuXG4gICAqIC0gYFwiY2FyZGluYWwtb3BlblwiYDogYW4gb3BlbiBDYXJkaW5hbCBzcGxpbmU7IG1heSBub3QgaW50ZXJzZWN0IHRoZSBzdGFydCBvciBlbmQsIGJ1dCB3aWxsIGludGVyc2VjdCBvdGhlciBjb250cm9sIHBvaW50cy5cbiAgICogLSBgXCJjYXJkaW5hbC1jbG9zZWRcImA6IGEgY2xvc2VkIENhcmRpbmFsIHNwbGluZSwgYXMgaW4gYSBsb29wLlxuICAgKiAtIGBcImJ1bmRsZVwiYDogZXF1aXZhbGVudCB0byBiYXNpcywgZXhjZXB0IHRoZSB0ZW5zaW9uIHBhcmFtZXRlciBpcyB1c2VkIHRvIHN0cmFpZ2h0ZW4gdGhlIHNwbGluZS5cbiAgICogLSBgXCJtb25vdG9uZVwiYDogY3ViaWMgaW50ZXJwb2xhdGlvbiB0aGF0IHByZXNlcnZlcyBtb25vdG9uaWNpdHkgaW4geS5cbiAgICovXG4gIGludGVycG9sYXRlPzogSW50ZXJwb2xhdGU7XG4gIC8qKlxuICAgKiBEZXBlbmRpbmcgb24gdGhlIGludGVycG9sYXRpb24gdHlwZSwgc2V0cyB0aGUgdGVuc2lvbiBwYXJhbWV0ZXIgKGZvciBsaW5lIGFuZCBhcmVhIG1hcmtzKS5cbiAgICogQG1pbmltdW0gMFxuICAgKiBAbWF4aW11bSAxXG4gICAqL1xuICB0ZW5zaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBzeW1ib2wgc2hhcGUgdG8gdXNlLiBPbmUgb2Y6IGBcImNpcmNsZVwiYCAoZGVmYXVsdCksIGBcInNxdWFyZVwiYCwgYFwiY3Jvc3NcImAsIGBcImRpYW1vbmRcImAsIGBcInRyaWFuZ2xlLXVwXCJgLCBvciBgXCJ0cmlhbmdsZS1kb3duXCJgLCBvciBhIGN1c3RvbSBTVkcgcGF0aC5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcImNpcmNsZVwiYFxuICAgKlxuICAgKi9cbiAgc2hhcGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwaXhlbCBhcmVhIGVhY2ggdGhlIHBvaW50L2NpcmNsZS9zcXVhcmUuXG4gICAqIEZvciBleGFtcGxlOiBpbiB0aGUgY2FzZSBvZiBjaXJjbGVzLCB0aGUgcmFkaXVzIGlzIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgc3F1YXJlIHJvb3Qgb2YgdGhlIHNpemUgdmFsdWUuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMzBgXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIHNpemU/OiBudW1iZXI7XG5cbiAgLy8gVGV4dCAvIExhYmVsIE1hcmsgQ29uZmlnXG5cbiAgLyoqXG4gICAqIFRoZSBob3Jpem9udGFsIGFsaWdubWVudCBvZiB0aGUgdGV4dC4gT25lIG9mIGBcImxlZnRcImAsIGBcInJpZ2h0XCJgLCBgXCJjZW50ZXJcImAuXG4gICAqL1xuICBhbGlnbj86IEhvcml6b250YWxBbGlnbjtcblxuICAvKipcbiAgICogVGhlIHJvdGF0aW9uIGFuZ2xlIG9mIHRoZSB0ZXh0LCBpbiBkZWdyZWVzLlxuICAgKiBAbWluaW11bSAwXG4gICAqIEBtYXhpbXVtIDM2MFxuICAgKi9cbiAgYW5nbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIHRleHQuIE9uZSBvZiBgXCJ0b3BcImAsIGBcIm1pZGRsZVwiYCwgYFwiYm90dG9tXCJgLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYFwibWlkZGxlXCJgXG4gICAqXG4gICAqL1xuICBiYXNlbGluZT86IFZlcnRpY2FsQWxpZ247XG5cbiAgLyoqXG4gICAqIFRoZSBob3Jpem9udGFsIG9mZnNldCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSB0ZXh0IGxhYmVsIGFuZCBpdHMgYW5jaG9yIHBvaW50LiBUaGUgb2Zmc2V0IGlzIGFwcGxpZWQgYWZ0ZXIgcm90YXRpb24gYnkgdGhlIF9hbmdsZV8gcHJvcGVydHkuXG4gICAqL1xuICBkeD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZlcnRpY2FsIG9mZnNldCwgaW4gcGl4ZWxzLCBiZXR3ZWVuIHRoZSB0ZXh0IGxhYmVsIGFuZCBpdHMgYW5jaG9yIHBvaW50LiBUaGUgb2Zmc2V0IGlzIGFwcGxpZWQgYWZ0ZXIgcm90YXRpb24gYnkgdGhlIF9hbmdsZV8gcHJvcGVydHkuXG4gICAqL1xuICBkeT86IG51bWJlcjtcblxuICAvKipcbiAgICogUG9sYXIgY29vcmRpbmF0ZSByYWRpYWwgb2Zmc2V0LCBpbiBwaXhlbHMsIG9mIHRoZSB0ZXh0IGxhYmVsIGZyb20gdGhlIG9yaWdpbiBkZXRlcm1pbmVkIGJ5IHRoZSBgeGAgYW5kIGB5YCBwcm9wZXJ0aWVzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICByYWRpdXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBtYXJrIGluIHBpeGVscyAoZGVmYXVsdCAwLCBpbmRpY2F0aW5nIG5vIGxpbWl0KS4gVGhlIHRleHQgdmFsdWUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHRydW5jYXRlZCBpZiB0aGUgcmVuZGVyZWQgc2l6ZSBleGNlZWRzIHRoZSBsaW1pdC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb2xhciBjb29yZGluYXRlIGFuZ2xlLCBpbiByYWRpYW5zLCBvZiB0aGUgdGV4dCBsYWJlbCBmcm9tIHRoZSBvcmlnaW4gZGV0ZXJtaW5lZCBieSB0aGUgYHhgIGFuZCBgeWAgcHJvcGVydGllcy4gVmFsdWVzIGZvciBgdGhldGFgIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIG9mIGBhcmNgIG1hcmsgYHN0YXJ0QW5nbGVgIGFuZCBgZW5kQW5nbGVgIHByb3BlcnRpZXM6IGFuZ2xlcyBhcmUgbWVhc3VyZWQgaW4gcmFkaWFucywgd2l0aCBgMGAgaW5kaWNhdGluZyBcIm5vcnRoXCIuXG4gICAqL1xuICB0aGV0YT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHR5cGVmYWNlIHRvIHNldCB0aGUgdGV4dCBpbiAoZS5nLiwgYFwiSGVsdmV0aWNhIE5ldWVcImApLlxuICAgKi9cbiAgZm9udD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZvbnQgc2l6ZSwgaW4gcGl4ZWxzLlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBmb250U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZvbnQgc3R5bGUgKGUuZy4sIGBcIml0YWxpY1wiYCkuXG4gICAqL1xuICBmb250U3R5bGU/OiBGb250U3R5bGU7XG4gIC8qKlxuICAgKiBUaGUgZm9udCB3ZWlnaHQuXG4gICAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHN0cmluZyAoZS5nIGBcImJvbGRcImAsIGBcIm5vcm1hbFwiYCkgb3IgYSBudW1iZXIgKGAxMDBgLCBgMjAwYCwgYDMwMGAsIC4uLiwgYDkwMGAgd2hlcmUgYFwibm9ybWFsXCJgID0gYDQwMGAgYW5kIGBcImJvbGRcImAgPSBgNzAwYCkuXG4gICAqL1xuICBmb250V2VpZ2h0PzogRm9udFdlaWdodDtcblxuICAvKipcbiAgICogUGxhY2Vob2xkZXIgdGV4dCBpZiB0aGUgYHRleHRgIGNoYW5uZWwgaXMgbm90IHNwZWNpZmllZFxuICAgKi9cbiAgdGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBVUkwgdG8gbG9hZCB1cG9uIG1vdXNlIGNsaWNrLiBJZiBkZWZpbmVkLCB0aGUgbWFyayBhY3RzIGFzIGEgaHlwZXJsaW5rLlxuICAgKlxuICAgKiBAZm9ybWF0IHVyaVxuICAgKi9cbiAgaHJlZj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vdXNlIGN1cnNvciB1c2VkIG92ZXIgdGhlIG1hcmsuIEFueSB2YWxpZCBbQ1NTIGN1cnNvciB0eXBlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvY3Vyc29yI1ZhbHVlcykgY2FuIGJlIHVzZWQuXG4gICAqL1xuICBjdXJzb3I/OiAnYXV0bycgfCAnZGVmYXVsdCcgfCAnbm9uZScgfCAnY29udGV4dC1tZW51JyB8ICdoZWxwJyB8ICdwb2ludGVyJyB8ICdwcm9ncmVzcycgfCAnd2FpdCcgfCAnY2VsbCcgfCAnY3Jvc3NoYWlyJyB8ICd0ZXh0JyB8ICd2ZXJ0aWNhbC10ZXh0JyB8ICdhbGlhcycgfCAnY29weScgfCAnbW92ZScgfCAnbm8tZHJvcCcgfCAnbm90LWFsbG93ZWQnIHwgJ2UtcmVzaXplJyB8ICduLXJlc2l6ZScgfCAnbmUtcmVzaXplJyB8ICdudy1yZXNpemUnIHwgJ3MtcmVzaXplJyB8ICdzZS1yZXNpemUnIHwgJ3N3LXJlc2l6ZScgfCAndy1yZXNpemUnIHwgJ2V3LXJlc2l6ZScgfCAnbnMtcmVzaXplJyB8ICduZXN3LXJlc2l6ZScgfCAnbndzZS1yZXNpemUnIHwgJ2NvbC1yZXNpemUnIHwgJ3Jvdy1yZXNpemUnIHwgJ2FsbC1zY3JvbGwnIHwgJ3pvb20taW4nIHwgJ3pvb20tb3V0JyB8ICdncmFiJyB8ICdncmFiYmluZyc7XG59XG5cbmNvbnN0IFZHX01BUktfQ09ORklHX0lOREVYOiBGbGFnPGtleW9mIFZnTWFya0NvbmZpZz4gPSB7XG4gIG9wYWNpdHk6IDEsXG4gIGZpbGw6IDEsXG4gIGZpbGxPcGFjaXR5OiAxLFxuICBzdHJva2U6IDEsXG4gIHN0cm9rZUNhcDogMSxcbiAgc3Ryb2tlV2lkdGg6IDEsXG4gIHN0cm9rZU9wYWNpdHk6IDEsXG4gIHN0cm9rZURhc2g6IDEsXG4gIHN0cm9rZURhc2hPZmZzZXQ6IDEsXG4gIHNpemU6IDEsXG4gIHNoYXBlOiAxLFxuICBpbnRlcnBvbGF0ZTogMSxcbiAgdGVuc2lvbjogMSxcbiAgb3JpZW50OiAxLFxuICBhbGlnbjogMSxcbiAgYmFzZWxpbmU6IDEsXG4gIHRleHQ6IDEsXG4gIGxpbWl0OiAxLFxuICBkeDogMSxcbiAgZHk6IDEsXG4gIHJhZGl1czogMSxcbiAgdGhldGE6IDEsXG4gIGFuZ2xlOiAxLFxuICBmb250OiAxLFxuICBmb250U2l6ZTogMSxcbiAgZm9udFdlaWdodDogMSxcbiAgZm9udFN0eWxlOiAxLFxuICBjdXJzb3I6IDEsXG4gIGhyZWY6IDEsXG4gIC8vIGNvbW1lbnRlZCBiZWxvdyBhcmUgdmcgY2hhbm5lbCB0aGF0IGRvIG5vdCBoYXZlIG1hcmsgY29uZmlnLlxuICAvLyAneCd8J3gyJ3wneGMnfCd3aWR0aCd8J3knfCd5Mid8J3ljJ3wnaGVpZ2h0J1xuICAvLyBjbGlwOiAxLFxuICAvLyBkaXI6IDEsXG4gIC8vIGVsbGlwc2lzOiAxLFxuICAvLyBlbmRBbmdsZTogMSxcbiAgLy8gaW5uZXJSYWRpdXM6IDEsXG4gIC8vIG91dGVyUmFkaXVzOiAxLFxuICAvLyBwYXRoOiAxLFxuICAvLyBzdGFydEFuZ2xlOiAxLFxuICAvLyB1cmw6IDEsXG59O1xuXG5leHBvcnQgY29uc3QgVkdfTUFSS19DT05GSUdTID0gZmxhZ0tleXMoVkdfTUFSS19DT05GSUdfSU5ERVgpO1xuXG5leHBvcnQgdHlwZSBBbmNob3IgPSAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJztcblxuZXhwb3J0IGludGVyZmFjZSBWZ1RpdGxlIHtcbiAgLyoqXG4gICAqIFRoZSB0aXRsZSB0ZXh0LlxuICAgKi9cbiAgdGV4dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZW50YXRpb24gb2YgdGhlIHRpdGxlIHJlbGF0aXZlIHRvIHRoZSBjaGFydC4gT25lIG9mIGBcInRvcFwiYCAodGhlIGRlZmF1bHQpLCBgXCJib3R0b21cImAsIGBcImxlZnRcImAsIG9yIGBcInJpZ2h0XCJgLlxuICAgKi9cbiAgb3JpZW50PzogVGl0bGVPcmllbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgcG9zaXRpb24gZm9yIHBsYWNpbmcgdGhlIHRpdGxlLiBPbmUgb2YgYFwic3RhcnRcImAsIGBcIm1pZGRsZVwiYCAodGhlIGRlZmF1bHQpLCBvciBgXCJlbmRcImAuIEZvciBleGFtcGxlLCB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIHRvcCB0aGVzZSBhbmNob3IgcG9zaXRpb25zIG1hcCB0byBhIGxlZnQtLCBjZW50ZXItLCBvciByaWdodC1hbGlnbmVkIHRpdGxlLlxuICAgKi9cbiAgYW5jaG9yPzogQW5jaG9yO1xuXG4gIC8qKlxuICAgKiBUaGUgb3J0aG9nb25hbCBvZmZzZXQgaW4gcGl4ZWxzIGJ5IHdoaWNoIHRvIGRpc3BsYWNlIHRoZSB0aXRsZSBmcm9tIGl0cyBwb3NpdGlvbiBhbG9uZyB0aGUgZWRnZSBvZiB0aGUgY2hhcnQuXG4gICAqL1xuICBvZmZzZXQ/OiBudW1iZXI7XG5cbiAgc3R5bGU/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvLyBUT0RPOiBuYW1lLCBlbmNvZGUsIGludGVyYWN0aXZlLCB6aW5kZXhcbn1cblxuZXhwb3J0IHR5cGUgVGl0bGVPcmllbnQgPSAndG9wJyB8ICdib3R0b20nIHwgJ2xlZnQnIHwgJ3JpZ2h0JztcblxuZXhwb3J0IGludGVyZmFjZSBWZ1RpdGxlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBhbmNob3IgcG9zaXRpb24gZm9yIHBsYWNpbmcgdGhlIHRpdGxlLiBPbmUgb2YgYFwic3RhcnRcImAsIGBcIm1pZGRsZVwiYCwgb3IgYFwiZW5kXCJgLiBGb3IgZXhhbXBsZSwgd2l0aCBhbiBvcmllbnRhdGlvbiBvZiB0b3AgdGhlc2UgYW5jaG9yIHBvc2l0aW9ucyBtYXAgdG8gYSBsZWZ0LSwgY2VudGVyLSwgb3IgcmlnaHQtYWxpZ25lZCB0aXRsZS5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBcIm1pZGRsZVwiYCBmb3IgW3NpbmdsZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9zcGVjLmh0bWwpIGFuZCBbbGF5ZXJlZF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9sYXllci5odG1sKSB2aWV3cy5cbiAgICogYFwic3RhcnRcImAgZm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cy5cbiAgICpcbiAgICogX19Ob3RlOl9fIFtGb3Igbm93XShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI4NzUpLCBgYW5jaG9yYCBpcyBvbmx5IGN1c3RvbWl6YWJsZSBvbmx5IGZvciBbc2luZ2xlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3NwZWMuaHRtbCkgYW5kIFtsYXllcmVkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2xheWVyLmh0bWwpIHZpZXdzLiAgRm9yIG90aGVyIGNvbXBvc2l0ZSB2aWV3cywgYGFuY2hvcmAgaXMgYWx3YXlzIGBcInN0YXJ0XCJgLlxuICAgKi9cbiAgYW5jaG9yPzogQW5jaG9yO1xuICAvKipcbiAgICogQW5nbGUgaW4gZGVncmVlcyBvZiB0aXRsZSB0ZXh0LlxuICAgKi9cbiAgYW5nbGU/Olx0bnVtYmVyO1xuICAvKipcbiAgICogVmVydGljYWwgdGV4dCBiYXNlbGluZSBmb3IgdGl0bGUgdGV4dC5cbiAgICovXG4gIGJhc2VsaW5lPzogVmVydGljYWxBbGlnbjtcbiAgLyoqXG4gICAqIFRleHQgY29sb3IgZm9yIHRpdGxlIHRleHQuXG4gICAqL1xuICBjb2xvcj86XHRzdHJpbmc7XG4gIC8qKlxuICAgKiBGb250IG5hbWUgZm9yIHRpdGxlIHRleHQuXG4gICAqL1xuICBmb250PzpcdHN0cmluZztcbiAgLyoqXG4gICAqIEZvbnQgc2l6ZSBpbiBwaXhlbHMgZm9yIHRpdGxlIHRleHQuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgMTBgLlxuICAgKlxuICAgKiBAbWluaW11bSAwXG4gICAqL1xuICBmb250U2l6ZT86XHRudW1iZXI7XG4gIC8qKlxuICAgKiBGb250IHdlaWdodCBmb3IgdGl0bGUgdGV4dC5cbiAgICogVGhpcyBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIChlLmcgYFwiYm9sZFwiYCwgYFwibm9ybWFsXCJgKSBvciBhIG51bWJlciAoYDEwMGAsIGAyMDBgLCBgMzAwYCwgLi4uLCBgOTAwYCB3aGVyZSBgXCJub3JtYWxcImAgPSBgNDAwYCBhbmQgYFwiYm9sZFwiYCA9IGA3MDBgKS5cbiAgICovXG4gIGZvbnRXZWlnaHQ/OiBGb250V2VpZ2h0O1xuICAvKipcbiAgICogVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggaW4gcGl4ZWxzIG9mIGxlZ2VuZCBsYWJlbHMuXG4gICAqXG4gICAqIEBtaW5pbXVtIDBcbiAgICovXG4gIGxpbWl0PzpcdG51bWJlcjtcbiAgLyoqXG4gICAqIE9mZnNldCBpbiBwaXhlbHMgb2YgdGhlIHRpdGxlIGZyb20gdGhlIGNoYXJ0IGJvZHkgYW5kIGF4ZXMuXG4gICAqL1xuICBvZmZzZXQ/Olx0bnVtYmVyO1xuICAvKipcbiAgICogRGVmYXVsdCB0aXRsZSBvcmllbnRhdGlvbiAoXCJ0b3BcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIsIG9yIFwicmlnaHRcIilcbiAgICovXG4gIG9yaWVudD86IFRpdGxlT3JpZW50O1xufVxuXG5leHBvcnQgdHlwZSBWZ0NvbXBhcmF0b3JPcmRlciA9ICdhc2NlbmRpbmcnIHwgJ2Rlc2NlbmRpbmcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFZnQ29tcGFyYXRvciB7XG4gIGZpZWxkPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIG9yZGVyPzogVmdDb21wYXJhdG9yT3JkZXIgfCBWZ0NvbXBhcmF0b3JPcmRlcltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZnV2luZG93VHJhbnNmb3JtIHtcbiAgdHlwZTogJ3dpbmRvdyc7XG4gIHBhcmFtcz86IE51bWJlcltdO1xuICBhcz86IHN0cmluZ1tdO1xuICBvcHM/OiAoQWdncmVnYXRlT3AgfCBXaW5kb3dPbmx5T3ApW107XG4gIGZpZWxkcz86IHN0cmluZ1tdO1xuICBmcmFtZT86IE51bWJlcltdO1xuICBpZ25vcmVQZWVycz86IEJvb2xlYW47XG4gIGdyb3VwYnk/OiBzdHJpbmdbXTtcbiAgc29ydD86IFZnQ29tcGFyYXRvcjtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { AXIS_PARTS, AXIS_PROPERTY_TYPE } from '../../axis';\nimport { title as fieldDefTitle } from '../../fielddef';\nimport { keys } from '../../util';\nfunction assembleTitle(title, config) {\n if (isArray(title)) {\n return title.map(function (fieldDef) { return fieldDefTitle(fieldDef, config); }).join(', ');\n }\n return title;\n}\nexport function assembleAxis(axisCmpt, kind, config, opt) {\n if (opt === void 0) { opt = { header: false }; }\n var _a = axisCmpt.combine(), orient = _a.orient, scale = _a.scale, title = _a.title, zindex = _a.zindex, axis = tslib_1.__rest(_a, [\"orient\", \"scale\", \"title\", \"zindex\"]);\n // Remove properties that are not valid for this kind of axis\n keys(axis).forEach(function (key) {\n var propType = AXIS_PROPERTY_TYPE[key];\n if (propType && propType !== kind && propType !== 'both') {\n delete axis[key];\n }\n });\n if (kind === 'grid') {\n if (!axis.grid) {\n return undefined;\n }\n // Remove unnecessary encode block\n if (axis.encode) {\n // Only need to keep encode block for grid\n var grid = axis.encode.grid;\n axis.encode = tslib_1.__assign({}, (grid ? { grid: grid } : {}));\n if (keys(axis.encode).length === 0) {\n delete axis.encode;\n }\n }\n return tslib_1.__assign({ scale: scale,\n orient: orient }, axis, { domain: false, labels: false, \n // Always set min/maxExtent to 0 to ensure that `config.axis*.minExtent` and `config.axis*.maxExtent`\n // would not affect gridAxis\n maxExtent: 0, minExtent: 0, ticks: false, zindex: zindex !== undefined ? zindex : 0 // put grid behind marks by default\n });\n }\n else { // kind === 'main'\n if (!opt.header && axisCmpt.mainExtracted) {\n // if mainExtracted has been extracted to a separate facet\n return undefined;\n }\n // Remove unnecessary encode block\n if (axis.encode) {\n for (var _i = 0, AXIS_PARTS_1 = AXIS_PARTS; _i < AXIS_PARTS_1.length; _i++) {\n var part = AXIS_PARTS_1[_i];\n if (!axisCmpt.hasAxisPart(part)) {\n delete axis.encode[part];\n }\n }\n if (keys(axis.encode).length === 0) {\n delete axis.encode;\n }\n }\n var titleString = assembleTitle(title, config);\n return tslib_1.__assign({ scale: scale,\n orient: orient, grid: false }, (titleString ? { title: titleString } : {}), axis, { zindex: zindex !== undefined ? zindex : 1 // put axis line above marks by default\n });\n }\n}\nexport function assembleAxes(axisComponents, config) {\n var _a = axisComponents.x, x = _a === void 0 ? [] : _a, _b = axisComponents.y, y = _b === void 0 ? [] : _b;\n return x.map(function (a) { return assembleAxis(a, 'main', config); }).concat(x.map(function (a) { return assembleAxis(a, 'grid', config); }), y.map(function (a) { return assembleAxis(a, 'main', config); }), y.map(function (a) { return assembleAxis(a, 'grid', config); })).filter(function (a) { return a; }); // filter undefined\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBQyxVQUFVLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFMUQsT0FBTyxFQUFlLEtBQUssSUFBSSxhQUFhLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBSWhDLHVCQUF1QixLQUFzQyxFQUFFLE1BQWM7SUFDM0UsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUEsUUFBUSxJQUFJLE9BQUEsYUFBYSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxRTtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sdUJBQ0osUUFBdUIsRUFDdkIsSUFBcUIsRUFDckIsTUFBYyxFQUNkLEdBRW1CO0lBRm5CLG9CQUFBLEVBQUEsUUFFSyxNQUFNLEVBQUUsS0FBSyxFQUFDO0lBRW5CLElBQU0sdUJBQTRELEVBQTNELGtCQUFNLEVBQUUsZ0JBQUssRUFBRSxnQkFBSyxFQUFFLGtCQUFNLEVBQUUsaUVBQTZCLENBQUM7SUFFbkUsNkRBQTZEO0lBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO1FBQ3JCLElBQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pDLElBQUksUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUN4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LElBQUksT0FBQSxZQUFZLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBL0IsQ0FBK0IsQ0FBQyxFQUMzQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQS9CLENBQStCLENBQUMsRUFDOUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxFQUFELENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7QVhJU19QQVJUUywgQVhJU19QUk9QRVJUWV9UWVBFfSBmcm9tICcuLi8uLi9heGlzJztcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi8uLi9jb25maWcnO1xuaW1wb3J0IHtGaWVsZERlZkJhc2UsIHRpdGxlIGFzIGZpZWxkRGVmVGl0bGV9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnQXhpc30gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtBeGlzQ29tcG9uZW50LCBBeGlzQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcblxuZnVuY3Rpb24gYXNzZW1ibGVUaXRsZSh0aXRsZTogc3RyaW5nIHwgRmllbGREZWZCYXNlPHN0cmluZz5bXSwgY29uZmlnOiBDb25maWcpIHtcbiAgaWYgKGlzQXJyYXkodGl0bGUpKSB7XG4gICAgcmV0dXJuIHRpdGxlLm1hcChmaWVsZERlZiA9PiBmaWVsZERlZlRpdGxlKGZpZWxkRGVmLCBjb25maWcpKS5qb2luKCcsICcpO1xuICB9XG4gIHJldHVybiB0aXRsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlQXhpcyhcbiAgYXhpc0NtcHQ6IEF4aXNDb21wb25lbnQsXG4gIGtpbmQ6ICdtYWluJyB8ICdncmlkJyxcbiAgY29uZmlnOiBDb25maWcsXG4gIG9wdDoge1xuICAgIGhlYWRlcjogYm9vbGVhbiAvLyB3aGV0aGVyIHRoaXMgaXMgY2FsbGVkIHZpYSBhIGhlYWRlclxuICB9ID0ge2hlYWRlcjogZmFsc2V9XG4pOiBWZ0F4aXMge1xuICBjb25zdCB7b3JpZW50LCBzY2FsZSwgdGl0bGUsIHppbmRleCwgLi4uYXhpc30gPSBheGlzQ21wdC5jb21iaW5lKCk7XG5cbiAgLy8gUmVtb3ZlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHZhbGlkIGZvciB0aGlzIGtpbmQgb2YgYXhpc1xuICBrZXlzKGF4aXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGNvbnN0IHByb3BUeXBlID0gQVhJU19QUk9QRVJUWV9UWVBFW2tleV07XG4gICAgaWYgKHByb3BUeXBlICYmIHByb3BUeXBlICE9PSBraW5kICYmIHByb3BUeXBlICE9PSAnYm90aCcpIHtcbiAgICAgIGRlbGV0ZSBheGlzW2tleV07XG4gICAgfVxuICB9KTtcblxuICBpZiAoa2luZCA9PT0gJ2dyaWQnKSB7XG4gICAgaWYgKCFheGlzLmdyaWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHVubmVjZXNzYXJ5IGVuY29kZSBibG9ja1xuICAgIGlmIChheGlzLmVuY29kZSkge1xuICAgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgZW5jb2RlIGJsb2NrIGZvciBncmlkXG4gICAgICBjb25zdCB7Z3JpZH0gPSBheGlzLmVuY29kZTtcbiAgICAgIGF4aXMuZW5jb2RlID0ge1xuICAgICAgICAuLi4oZ3JpZCA/IHtncmlkfSA6IHt9KVxuICAgICAgfTtcblxuICAgICAgaWYgKGtleXMoYXhpcy5lbmNvZGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZWxldGUgYXhpcy5lbmNvZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlLFxuICAgICAgb3JpZW50LFxuICAgICAgLi4uYXhpcyxcbiAgICAgIGRvbWFpbjogZmFsc2UsXG4gICAgICBsYWJlbHM6IGZhbHNlLFxuXG4gICAgICAvLyBBbHdheXMgc2V0IG1pbi9tYXhFeHRlbnQgdG8gMCB0byBlbnN1cmUgdGhhdCBgY29uZmlnLmF4aXMqLm1pbkV4dGVudGAgYW5kIGBjb25maWcuYXhpcyoubWF4RXh0ZW50YFxuICAgICAgLy8gd291bGQgbm90IGFmZmVjdCBncmlkQXhpc1xuICAgICAgbWF4RXh0ZW50OiAwLFxuICAgICAgbWluRXh0ZW50OiAwLFxuICAgICAgdGlja3M6IGZhbHNlLFxuICAgICAgemluZGV4OiB6aW5kZXggIT09IHVuZGVmaW5lZCA/IHppbmRleCA6IDAgLy8gcHV0IGdyaWQgYmVoaW5kIG1hcmtzIGJ5IGRlZmF1bHRcbiAgICB9O1xuICB9IGVsc2UgeyAvLyBraW5kID09PSAnbWFpbidcblxuICAgIGlmICghb3B0LmhlYWRlciAmJiBheGlzQ21wdC5tYWluRXh0cmFjdGVkKSB7XG4gICAgICAvLyBpZiBtYWluRXh0cmFjdGVkIGhhcyBiZWVuIGV4dHJhY3RlZCB0byBhIHNlcGFyYXRlIGZhY2V0XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB1bm5lY2Vzc2FyeSBlbmNvZGUgYmxvY2tcbiAgICBpZiAoYXhpcy5lbmNvZGUpIHtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBBWElTX1BBUlRTKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhYXhpc0NtcHQuaGFzQXhpc1BhcnQocGFydClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZGVsZXRlIGF4aXMuZW5jb2RlW3BhcnRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoa2V5cyhheGlzLmVuY29kZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSBheGlzLmVuY29kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0aXRsZVN0cmluZyA9IGFzc2VtYmxlVGl0bGUodGl0bGUsIGNvbmZpZyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGUsXG4gICAgICBvcmllbnQsXG4gICAgICBncmlkOiBmYWxzZSxcbiAgICAgIC4uLih0aXRsZVN0cmluZyA/IHt0aXRsZTogdGl0bGVTdHJpbmd9IDoge30pLFxuICAgICAgLi4uYXhpcyxcbiAgICAgIHppbmRleDogemluZGV4ICE9PSB1bmRlZmluZWQgPyB6aW5kZXggOiAxIC8vIHB1dCBheGlzIGxpbmUgYWJvdmUgbWFya3MgYnkgZGVmYXVsdFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlQXhlcyhheGlzQ29tcG9uZW50czogQXhpc0NvbXBvbmVudEluZGV4LCBjb25maWc6IENvbmZpZyk6IFZnQXhpc1tdIHtcbiAgY29uc3Qge3g9W10sIHk9W119ID0gYXhpc0NvbXBvbmVudHM7XG4gIHJldHVybiBbXG4gICAgLi4ueC5tYXAoYSA9PiBhc3NlbWJsZUF4aXMoYSwgJ21haW4nLCBjb25maWcpKSxcbiAgICAuLi54Lm1hcChhID0+IGFzc2VtYmxlQXhpcyhhLCAnZ3JpZCcsIGNvbmZpZykpLFxuICAgIC4uLnkubWFwKGEgPT4gYXNzZW1ibGVBeGlzKGEsICdtYWluJywgY29uZmlnKSksXG4gICAgLi4ueS5tYXAoYSA9PiBhc3NlbWJsZUF4aXMoYSwgJ2dyaWQnLCBjb25maWcpKVxuICBdLmZpbHRlcihhID0+IGEpOyAvLyBmaWx0ZXIgdW5kZWZpbmVkXG59XG4iXX0=","import * as tslib_1 from \"tslib\";\n/**\n * Utility files for producing Vega ValueRef for marks\n */\nimport { isArray, isString } from 'vega-util';\nimport { X, Y } from '../../channel';\nimport { isFieldDef, isValueDef, vgField, } from '../../fielddef';\nimport * as log from '../../log';\nimport { hasDiscreteDomain, ScaleType } from '../../scale';\nimport { QUANTITATIVE } from '../../type';\nimport { contains, some } from '../../util';\nimport { binRequiresRange, formatSignalRef } from '../common';\n// TODO: we need to find a way to refactor these so that scaleName is a part of scale\n// but that's complicated. For now, this is a huge step moving forward.\n/**\n * @return Vega ValueRef for stackable x or y\n */\nexport function stackable(channel, channelDef, scaleName, scale, stack, defaultRef) {\n if (isFieldDef(channelDef) && stack && channel === stack.fieldChannel) {\n // x or y use stack_end so that stacked line's point mark use stack_end too.\n return fieldRef(channelDef, scaleName, { suffix: 'end' });\n }\n return midPoint(channel, channelDef, scaleName, scale, stack, defaultRef);\n}\n/**\n * @return Vega ValueRef for stackable x2 or y2\n */\nexport function stackable2(channel, aFieldDef, a2fieldDef, scaleName, scale, stack, defaultRef) {\n if (isFieldDef(aFieldDef) && stack &&\n // If fieldChannel is X and channel is X2 (or Y and Y2)\n channel.charAt(0) === stack.fieldChannel.charAt(0)) {\n return fieldRef(aFieldDef, scaleName, { suffix: 'start' });\n }\n return midPoint(channel, a2fieldDef, scaleName, scale, stack, defaultRef);\n}\nexport function getOffset(channel, markDef) {\n var offsetChannel = channel + 'Offset';\n // TODO: in the future read from encoding channel too\n var markDefOffsetValue = markDef[offsetChannel];\n if (markDefOffsetValue) {\n return markDefOffsetValue;\n }\n return undefined;\n}\n/**\n * Value Ref for binned fields\n */\nexport function bin(fieldDef, scaleName, side, offset) {\n var binSuffix = side === 'start' ? undefined : 'end';\n return fieldRef(fieldDef, scaleName, { binSuffix: binSuffix }, offset ? { offset: offset } : {});\n}\nexport function fieldRef(fieldDef, scaleName, opt, mixins) {\n var ref = tslib_1.__assign({}, (scaleName ? { scale: scaleName } : {}), { field: vgField(fieldDef, opt) });\n if (mixins) {\n return tslib_1.__assign({}, ref, mixins);\n }\n return ref;\n}\nexport function bandRef(scaleName, band) {\n if (band === void 0) { band = true; }\n return {\n scale: scaleName,\n band: band\n };\n}\n/**\n * Signal that returns the middle of a bin. Should only be used with x and y.\n */\nfunction binMidSignal(fieldDef, scaleName) {\n return {\n signal: \"(\" +\n (\"scale(\\\"\" + scaleName + \"\\\", \" + vgField(fieldDef, { expr: 'datum' }) + \")\") +\n \" + \" +\n (\"scale(\\\"\" + scaleName + \"\\\", \" + vgField(fieldDef, { binSuffix: 'end', expr: 'datum' }) + \")\") +\n \")/2\"\n };\n}\n/**\n * @returns {VgValueRef} Value Ref for xc / yc or mid point for other channels.\n */\nexport function midPoint(channel, channelDef, scaleName, scale, stack, defaultRef) {\n // TODO: datum support\n if (channelDef) {\n /* istanbul ignore else */\n if (isFieldDef(channelDef)) {\n if (channelDef.bin) {\n // Use middle only for x an y to place marks in the center between start and end of the bin range.\n // We do not use the mid point for other channels (e.g. size) so that properties of legends and marks match.\n if (contains([X, Y], channel) && channelDef.type === QUANTITATIVE) {\n if (stack && stack.impute) {\n // For stack, we computed bin_mid so we can impute.\n return fieldRef(channelDef, scaleName, { binSuffix: 'mid' });\n }\n // For non-stack, we can just calculate bin mid on the fly using signal.\n return binMidSignal(channelDef, scaleName);\n }\n return fieldRef(channelDef, scaleName, binRequiresRange(channelDef, channel) ? { binSuffix: 'range' } : {});\n }\n if (scale) {\n var scaleType = scale.get('type');\n if (hasDiscreteDomain(scaleType)) {\n if (scaleType === 'band') {\n // For band, to get mid point, need to offset by half of the band\n return fieldRef(channelDef, scaleName, { binSuffix: 'range' }, { band: 0.5 });\n }\n return fieldRef(channelDef, scaleName, { binSuffix: 'range' });\n }\n }\n return fieldRef(channelDef, scaleName, {}); // no need for bin suffix\n }\n else if (isValueDef(channelDef)) {\n var value = channelDef.value;\n if (contains(['x', 'x2'], channel) && value === 'width') {\n return { field: { group: 'width' } };\n }\n else if (contains(['y', 'y2'], channel) && value === 'height') {\n return { field: { group: 'height' } };\n }\n return { value: value };\n }\n // If channelDef is neither field def or value def, it's a condition-only def.\n // In such case, we will use default ref.\n }\n return defaultRef;\n}\nexport function text(textDef, config) {\n // text\n if (textDef) {\n if (isFieldDef(textDef)) {\n return formatSignalRef(textDef, textDef.format, 'datum', config);\n }\n else if (isValueDef(textDef)) {\n return { value: textDef.value };\n }\n }\n return undefined;\n}\nexport function mid(sizeRef) {\n return tslib_1.__assign({}, sizeRef, { mult: 0.5 });\n}\n/**\n * Whether the scale definitely includes zero in the domain\n */\nfunction domainDefinitelyIncludeZero(scale) {\n if (scale.get('zero') !== false) {\n return true;\n }\n var domains = scale.domains;\n if (isArray(domains)) {\n return some(domains, function (d) { return isArray(d) && d.length === 2 && d[0] <= 0 && d[1] >= 0; });\n }\n return false;\n}\nexport function getDefaultRef(defaultRef, channel, scaleName, scale, mark) {\n if (isString(defaultRef)) {\n if (scaleName) {\n var scaleType = scale.get('type');\n if (contains([ScaleType.LOG, ScaleType.TIME, ScaleType.UTC], scaleType)) {\n // Log scales cannot have zero.\n // Zero in time scale is arbitrary, and does not affect ratio.\n // (Time is an interval level of measurement, not ratio).\n // See https://en.wikipedia.org/wiki/Level_of_measurement for more info.\n if (mark === 'bar' || mark === 'area') {\n log.warn(log.message.nonZeroScaleUsedWithLengthMark(mark, channel, { scaleType: scaleType }));\n }\n }\n else {\n if (domainDefinitelyIncludeZero(scale)) {\n return {\n scale: scaleName,\n value: 0\n };\n }\n if (mark === 'bar' || mark === 'area') {\n log.warn(log.message.nonZeroScaleUsedWithLengthMark(mark, channel, { zeroFalse: scale.explicit.zero === false }));\n }\n }\n }\n if (defaultRef === 'zeroOrMin') {\n return channel === 'x' ? { value: 0 } : { field: { group: 'height' } };\n }\n else { // zeroOrMax\n return channel === 'x' ? { field: { group: 'width' } } : { value: 0 };\n }\n }\n return defaultRef;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWVyZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3ZhbHVlcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTVDLE9BQU8sRUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE9BQU8sRUFLTCxVQUFVLEVBQ1YsVUFBVSxFQUVWLE9BQU8sR0FDUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFekQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUUxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSTVELHFGQUFxRjtBQUNyRix3RUFBd0U7QUFFeEU7O0dBRUc7QUFDSCxNQUFNLG9CQUFvQixPQUFrQixFQUFFLFVBQThCLEVBQUUsU0FBaUIsRUFBRSxLQUFxQixFQUNsSCxLQUFzQixFQUFFLFVBQXNCO0lBQ2hELElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxDQUFDLFlBQVksRUFBRTtRQUNyRSw0RUFBNEU7UUFDNUUsT0FBTyxRQUFRLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsT0FBTyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFV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QyxPQUFPLENBQUMsOEJBQThCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFDLFNBQVMsV0FBQSxFQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNsRjthQUNGO2lCQUFNO2dCQUNMLElBQUksMkJBQTJCLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3RDLE9BQU87d0JBQ0wsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLEtBQUssRUFBRSxDQUFDO3FCQUNULENBQUM7aUJBQ0g7Z0JBQ0QsSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUU7b0JBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FDakQsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUMsQ0FDMUQsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRjtRQUVELElBQUksVUFBVSxLQUFLLFdBQVcsRUFBRTtZQUM5QixPQUFPLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDO1NBQ2xFO2FBQU0sRUFBRSxZQUFZO1lBQ25CLE9BQU8sT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUM7U0FDakU7S0FDRjtJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgZmlsZXMgZm9yIHByb2R1Y2luZyBWZWdhIFZhbHVlUmVmIGZvciBtYXJrc1xuICovXG5pbXBvcnQge2lzQXJyYXksIGlzU3RyaW5nfSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0NoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge1xuICBDaGFubmVsRGVmLFxuICBDaGFubmVsRGVmV2l0aENvbmRpdGlvbixcbiAgRmllbGREZWYsXG4gIEZpZWxkUmVmT3B0aW9uLFxuICBpc0ZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBUZXh0RmllbGREZWYsXG4gIHZnRmllbGQsXG59IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrLCBNYXJrRGVmfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW4sIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtTdGFja1Byb3BlcnRpZXN9IGZyb20gJy4uLy4uL3N0YWNrJztcbmltcG9ydCB7UVVBTlRJVEFUSVZFfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7Y29udGFpbnMsIHNvbWV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ1NpZ25hbFJlZiwgVmdWYWx1ZVJlZn0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtiaW5SZXF1aXJlc1JhbmdlLCBmb3JtYXRTaWduYWxSZWZ9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50fSBmcm9tICcuLi9zY2FsZS9jb21wb25lbnQnO1xuXG5cbi8vIFRPRE86IHdlIG5lZWQgdG8gZmluZCBhIHdheSB0byByZWZhY3RvciB0aGVzZSBzbyB0aGF0IHNjYWxlTmFtZSBpcyBhIHBhcnQgb2Ygc2NhbGVcbi8vIGJ1dCB0aGF0J3MgY29tcGxpY2F0ZWQuICBGb3Igbm93LCB0aGlzIGlzIGEgaHVnZSBzdGVwIG1vdmluZyBmb3J3YXJkLlxuXG4vKipcbiAqIEByZXR1cm4gVmVnYSBWYWx1ZVJlZiBmb3Igc3RhY2thYmxlIHggb3IgeVxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2thYmxlKGNoYW5uZWw6ICd4JyB8ICd5JywgY2hhbm5lbERlZjogQ2hhbm5lbERlZjxzdHJpbmc+LCBzY2FsZU5hbWU6IHN0cmluZywgc2NhbGU6IFNjYWxlQ29tcG9uZW50LFxuICAgIHN0YWNrOiBTdGFja1Byb3BlcnRpZXMsIGRlZmF1bHRSZWY6IFZnVmFsdWVSZWYpOiBWZ1ZhbHVlUmVmIHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikgJiYgc3RhY2sgJiYgY2hhbm5lbCA9PT0gc3RhY2suZmllbGRDaGFubmVsKSB7XG4gICAgLy8geCBvciB5IHVzZSBzdGFja19lbmQgc28gdGhhdCBzdGFja2VkIGxpbmUncyBwb2ludCBtYXJrIHVzZSBzdGFja19lbmQgdG9vLlxuICAgIHJldHVybiBmaWVsZFJlZihjaGFubmVsRGVmLCBzY2FsZU5hbWUsIHtzdWZmaXg6ICdlbmQnfSk7XG4gIH1cbiAgcmV0dXJuIG1pZFBvaW50KGNoYW5uZWwsIGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwgc2NhbGUsIHN0YWNrLCBkZWZhdWx0UmVmKTtcbn1cblxuLyoqXG4gKiBAcmV0dXJuIFZlZ2EgVmFsdWVSZWYgZm9yIHN0YWNrYWJsZSB4MiBvciB5MlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhY2thYmxlMihjaGFubmVsOiAneDInIHwgJ3kyJywgYUZpZWxkRGVmOiBDaGFubmVsRGVmPHN0cmluZz4sIGEyZmllbGREZWY6IENoYW5uZWxEZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcsIHNjYWxlOiBTY2FsZUNvbXBvbmVudCxcbiAgICBzdGFjazogU3RhY2tQcm9wZXJ0aWVzLCBkZWZhdWx0UmVmOiBWZ1ZhbHVlUmVmKTogVmdWYWx1ZVJlZiB7XG4gIGlmIChpc0ZpZWxkRGVmKGFGaWVsZERlZikgJiYgc3RhY2sgJiZcbiAgICAgIC8vIElmIGZpZWxkQ2hhbm5lbCBpcyBYIGFuZCBjaGFubmVsIGlzIFgyIChvciBZIGFuZCBZMilcbiAgICAgIGNoYW5uZWwuY2hhckF0KDApID09PSBzdGFjay5maWVsZENoYW5uZWwuY2hhckF0KDApXG4gICAgICApIHtcbiAgICByZXR1cm4gZmllbGRSZWYoYUZpZWxkRGVmLCBzY2FsZU5hbWUsIHtzdWZmaXg6ICdzdGFydCd9KTtcbiAgfVxuICByZXR1cm4gbWlkUG9pbnQoY2hhbm5lbCwgYTJmaWVsZERlZiwgc2NhbGVOYW1lLCBzY2FsZSwgc3RhY2ssIGRlZmF1bHRSZWYpO1xufVxuXG5cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE9mZnNldChjaGFubmVsOiAneCcgfCAneScgfCAneDInIHwgJ3kyJywgbWFya0RlZjogTWFya0RlZikge1xuICBjb25zdCBvZmZzZXRDaGFubmVsID0gY2hhbm5lbCArICdPZmZzZXQnO1xuICAvLyBUT0RPOiBpbiB0aGUgZnV0dXJlIHJlYWQgZnJvbSBlbmNvZGluZyBjaGFubmVsIHRvb1xuXG4gIGNvbnN0IG1hcmtEZWZPZmZzZXRWYWx1ZSA9IG1hcmtEZWZbb2Zmc2V0Q2hhbm5lbF07XG4gIGlmIChtYXJrRGVmT2Zmc2V0VmFsdWUpIHtcbiAgICByZXR1cm4gbWFya0RlZk9mZnNldFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBWYWx1ZSBSZWYgZm9yIGJpbm5lZCBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbihmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcsIHNpZGU6ICdzdGFydCcgfCAnZW5kJywgb2Zmc2V0PzogbnVtYmVyKSB7XG4gIGNvbnN0IGJpblN1ZmZpeCA9IHNpZGUgPT09ICdzdGFydCcgPyB1bmRlZmluZWQgOiAnZW5kJztcbiAgcmV0dXJuIGZpZWxkUmVmKGZpZWxkRGVmLCBzY2FsZU5hbWUsIHtiaW5TdWZmaXh9LCBvZmZzZXQgPyB7b2Zmc2V0fSA6IHt9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkUmVmKFxuICAgIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzY2FsZU5hbWU6IHN0cmluZywgb3B0OiBGaWVsZFJlZk9wdGlvbixcbiAgICBtaXhpbnM/OiB7b2Zmc2V0PzogbnVtYmVyIHwgVmdWYWx1ZVJlZiwgYmFuZD86IG51bWJlcnxib29sZWFufVxuICApOiBWZ1ZhbHVlUmVmIHtcblxuICBjb25zdCByZWY6IFZnVmFsdWVSZWYgPSB7XG4gICAgLi4uKHNjYWxlTmFtZSA/IHtzY2FsZTogc2NhbGVOYW1lfSA6IHt9KSxcbiAgICBmaWVsZDogdmdGaWVsZChmaWVsZERlZiwgb3B0KSxcbiAgfTtcblxuICBpZiAobWl4aW5zKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlZixcbiAgICAgIC4uLm1peGluc1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhbmRSZWYoc2NhbGVOYW1lOiBzdHJpbmcsIGJhbmQ6IG51bWJlcnxib29sZWFuID0gdHJ1ZSk6IFZnVmFsdWVSZWYge1xuICByZXR1cm4ge1xuICAgIHNjYWxlOiBzY2FsZU5hbWUsXG4gICAgYmFuZDogYmFuZFxuICB9O1xufVxuXG4vKipcbiAqIFNpZ25hbCB0aGF0IHJldHVybnMgdGhlIG1pZGRsZSBvZiBhIGJpbi4gU2hvdWxkIG9ubHkgYmUgdXNlZCB3aXRoIHggYW5kIHkuXG4gKi9cbmZ1bmN0aW9uIGJpbk1pZFNpZ25hbChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVOYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBzaWduYWw6IGAoYCArXG4gICAgICBgc2NhbGUoXCIke3NjYWxlTmFtZX1cIiwgJHt2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pfSlgICtcbiAgICAgIGAgKyBgICtcbiAgICAgIGBzY2FsZShcIiR7c2NhbGVOYW1lfVwiLCAke3ZnRmllbGQoZmllbGREZWYsIHtiaW5TdWZmaXg6ICdlbmQnLCBleHByOiAnZGF0dW0nfSl9KWArXG4gICAgYCkvMmBcbiAgfTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7VmdWYWx1ZVJlZn0gVmFsdWUgUmVmIGZvciB4YyAvIHljIG9yIG1pZCBwb2ludCBmb3Igb3RoZXIgY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaWRQb2ludChjaGFubmVsOiBDaGFubmVsLCBjaGFubmVsRGVmOiBDaGFubmVsRGVmPHN0cmluZz4sIHNjYWxlTmFtZTogc3RyaW5nLCBzY2FsZTogU2NhbGVDb21wb25lbnQsIHN0YWNrOiBTdGFja1Byb3BlcnRpZXMsIGRlZmF1bHRSZWY6IFZnVmFsdWVSZWYpOiBWZ1ZhbHVlUmVmIHtcbiAgLy8gVE9ETzogZGF0dW0gc3VwcG9ydFxuXG4gIGlmIChjaGFubmVsRGVmKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgICBpZiAoY2hhbm5lbERlZi5iaW4pIHtcbiAgICAgICAgLy8gVXNlIG1pZGRsZSBvbmx5IGZvciB4IGFuIHkgdG8gcGxhY2UgbWFya3MgaW4gdGhlIGNlbnRlciBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGJpbiByYW5nZS5cbiAgICAgICAgLy8gV2UgZG8gbm90IHVzZSB0aGUgbWlkIHBvaW50IGZvciBvdGhlciBjaGFubmVscyAoZS5nLiBzaXplKSBzbyB0aGF0IHByb3BlcnRpZXMgb2YgbGVnZW5kcyBhbmQgbWFya3MgbWF0Y2guXG4gICAgICAgIGlmIChjb250YWlucyhbWCwgWV0sIGNoYW5uZWwpICYmIGNoYW5uZWxEZWYudHlwZSA9PT0gUVVBTlRJVEFUSVZFKSB7XG4gICAgICAgICAgaWYgKHN0YWNrICYmIHN0YWNrLmltcHV0ZSkge1xuICAgICAgICAgICAgLy8gRm9yIHN0YWNrLCB3ZSBjb21wdXRlZCBiaW5fbWlkIHNvIHdlIGNhbiBpbXB1dGUuXG4gICAgICAgICAgICByZXR1cm4gZmllbGRSZWYoY2hhbm5lbERlZiwgc2NhbGVOYW1lLCB7YmluU3VmZml4OiAnbWlkJ30pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGb3Igbm9uLXN0YWNrLCB3ZSBjYW4ganVzdCBjYWxjdWxhdGUgYmluIG1pZCBvbiB0aGUgZmx5IHVzaW5nIHNpZ25hbC5cbiAgICAgICAgICByZXR1cm4gYmluTWlkU2lnbmFsKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwgYmluUmVxdWlyZXNSYW5nZShjaGFubmVsRGVmLCBjaGFubmVsKSA/IHtiaW5TdWZmaXg6ICdyYW5nZSd9IDoge30pO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NhbGUpIHtcbiAgICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgICAgICAgaWYgKHNjYWxlVHlwZSA9PT0gJ2JhbmQnKSB7XG4gICAgICAgICAgICAvLyBGb3IgYmFuZCwgdG8gZ2V0IG1pZCBwb2ludCwgbmVlZCB0byBvZmZzZXQgYnkgaGFsZiBvZiB0aGUgYmFuZFxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwge2JpblN1ZmZpeDogJ3JhbmdlJ30sIHtiYW5kOiAwLjV9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpZWxkUmVmKGNoYW5uZWxEZWYsIHNjYWxlTmFtZSwge2JpblN1ZmZpeDogJ3JhbmdlJ30pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmllbGRSZWYoY2hhbm5lbERlZiwgc2NhbGVOYW1lLCB7fSk7IC8vIG5vIG5lZWQgZm9yIGJpbiBzdWZmaXhcbiAgICB9IGVsc2UgaWYgKGlzVmFsdWVEZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gY2hhbm5lbERlZi52YWx1ZTtcblxuICAgICAgaWYgKGNvbnRhaW5zKFsneCcsICd4MiddLCBjaGFubmVsKSAmJiB2YWx1ZSA9PT0gJ3dpZHRoJykge1xuICAgICAgICByZXR1cm4ge2ZpZWxkOiB7Z3JvdXA6ICd3aWR0aCd9fTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbnMoWyd5JywgJ3kyJ10sIGNoYW5uZWwpICYmIHZhbHVlID09PSAnaGVpZ2h0Jykge1xuICAgICAgICByZXR1cm4ge2ZpZWxkOiB7Z3JvdXA6ICdoZWlnaHQnfX07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7dmFsdWV9O1xuICAgIH1cblxuICAgIC8vIElmIGNoYW5uZWxEZWYgaXMgbmVpdGhlciBmaWVsZCBkZWYgb3IgdmFsdWUgZGVmLCBpdCdzIGEgY29uZGl0aW9uLW9ubHkgZGVmLlxuICAgIC8vIEluIHN1Y2ggY2FzZSwgd2Ugd2lsbCB1c2UgZGVmYXVsdCByZWYuXG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFJlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRleHQodGV4dERlZjogQ2hhbm5lbERlZldpdGhDb25kaXRpb248VGV4dEZpZWxkRGVmPHN0cmluZz4+LCBjb25maWc6IENvbmZpZyk6IFZnVmFsdWVSZWYge1xuICAvLyB0ZXh0XG4gIGlmICh0ZXh0RGVmKSB7XG4gICAgaWYgKGlzRmllbGREZWYodGV4dERlZikpIHtcbiAgICAgIHJldHVybiBmb3JtYXRTaWduYWxSZWYodGV4dERlZiwgdGV4dERlZi5mb3JtYXQsICdkYXR1bScsIGNvbmZpZyk7XG4gICAgfSBlbHNlIGlmIChpc1ZhbHVlRGVmKHRleHREZWYpKSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiB0ZXh0RGVmLnZhbHVlfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pZChzaXplUmVmOiBWZ1NpZ25hbFJlZik6IFZnVmFsdWVSZWYge1xuICByZXR1cm4gey4uLnNpemVSZWYsIG11bHQ6IDAuNX07XG59XG5cbi8qKlxuICogV2hldGhlciB0aGUgc2NhbGUgZGVmaW5pdGVseSBpbmNsdWRlcyB6ZXJvIGluIHRoZSBkb21haW5cbiAqL1xuZnVuY3Rpb24gZG9tYWluRGVmaW5pdGVseUluY2x1ZGVaZXJvKHNjYWxlOiBTY2FsZUNvbXBvbmVudCkge1xuICBpZiAoc2NhbGUuZ2V0KCd6ZXJvJykgIT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgZG9tYWlucyA9IHNjYWxlLmRvbWFpbnM7XG4gIGlmIChpc0FycmF5KGRvbWFpbnMpKSB7XG4gICAgcmV0dXJuIHNvbWUoZG9tYWlucywgKGQpID0+IGlzQXJyYXkoZCkgJiYgZC5sZW5ndGggPT09IDIgJiYgZFswXSA8PTAgJiYgZFsxXSA+PSAwKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0UmVmKFxuICBkZWZhdWx0UmVmOiBWZ1ZhbHVlUmVmIHwgJ3plcm9Pck1pbicgfCAnemVyb09yTWF4JyxcbiAgY2hhbm5lbDogJ3gnIHwgJ3knLCBzY2FsZU5hbWU6IHN0cmluZywgc2NhbGU6IFNjYWxlQ29tcG9uZW50LCBtYXJrOiBNYXJrXG4pIHtcbiAgaWYgKGlzU3RyaW5nKGRlZmF1bHRSZWYpKSB7XG4gICAgaWYgKHNjYWxlTmFtZSkge1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICBpZiAoY29udGFpbnMoW1NjYWxlVHlwZS5MT0csIFNjYWxlVHlwZS5USU1FLCBTY2FsZVR5cGUuVVRDXSwgc2NhbGVUeXBlKSkge1xuICAgICAgICAvLyBMb2cgc2NhbGVzIGNhbm5vdCBoYXZlIHplcm8uXG4gICAgICAgIC8vIFplcm8gaW4gdGltZSBzY2FsZSBpcyBhcmJpdHJhcnksIGFuZCBkb2VzIG5vdCBhZmZlY3QgcmF0aW8uXG4gICAgICAgIC8vIChUaW1lIGlzIGFuIGludGVydmFsIGxldmVsIG9mIG1lYXN1cmVtZW50LCBub3QgcmF0aW8pLlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV2ZWxfb2ZfbWVhc3VyZW1lbnQgZm9yIG1vcmUgaW5mby5cbiAgICAgICAgaWYgKG1hcmsgPT09ICdiYXInIHx8IG1hcmsgPT09ICdhcmVhJykge1xuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLm5vblplcm9TY2FsZVVzZWRXaXRoTGVuZ3RoTWFyayhtYXJrLCBjaGFubmVsLCB7c2NhbGVUeXBlfSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZG9tYWluRGVmaW5pdGVseUluY2x1ZGVaZXJvKHNjYWxlKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzY2FsZTogc2NhbGVOYW1lLFxuICAgICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrID09PSAnYmFyJyB8fCBtYXJrID09PSAnYXJlYScpIHtcbiAgICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5ub25aZXJvU2NhbGVVc2VkV2l0aExlbmd0aE1hcmsoXG4gICAgICAgICAgICBtYXJrLCBjaGFubmVsLCB7emVyb0ZhbHNlOiBzY2FsZS5leHBsaWNpdC56ZXJvID09PSBmYWxzZX1cbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkZWZhdWx0UmVmID09PSAnemVyb09yTWluJykge1xuICAgICAgcmV0dXJuIGNoYW5uZWwgPT09ICd4JyA/IHt2YWx1ZTogMH0gOiB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fTtcbiAgICB9IGVsc2UgeyAvLyB6ZXJvT3JNYXhcbiAgICAgIHJldHVybiBjaGFubmVsID09PSAneCcgPyB7ZmllbGQ6IHtncm91cDogJ3dpZHRoJ319IDoge3ZhbHVlOiAwfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRSZWY7XG59XG5cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { getFieldDef, isConditionalSelection, isValueDef, vgField, } from '../../fielddef';\nimport * as log from '../../log';\nimport { expression } from '../../predicate';\nimport { hasContinuousDomain } from '../../scale';\nimport { contains } from '../../util';\nimport { VG_MARK_CONFIGS } from '../../vega.schema';\nimport { getMarkConfig } from '../common';\nimport { selectionPredicate } from '../selection/selection';\nimport * as ref from './valueref';\nexport function color(model, opt) {\n var _a, _b;\n if (opt === void 0) { opt = { valueOnly: false }; }\n var markDef = model.markDef, encoding = model.encoding, config = model.config;\n var filled = markDef.filled, markType = markDef.type;\n var configValue = {\n fill: getMarkConfig('fill', markDef, config),\n stroke: getMarkConfig('stroke', markDef, config),\n color: getMarkConfig('color', markDef, config)\n };\n var transparentIfNeeded = contains(['bar', 'point', 'circle', 'square', 'geoshape'], markType) ? 'transparent' : undefined;\n var defaultValue = {\n fill: markDef.fill || configValue.fill ||\n // If there is no fill, always fill symbols, bar, geoshape\n // with transparent fills https://github.com/vega/vega-lite/issues/1316\n transparentIfNeeded,\n stroke: markDef.stroke || configValue.stroke\n };\n var colorVgChannel = filled ? 'fill' : 'stroke';\n var fillStrokeMarkDefAndConfig = tslib_1.__assign({}, (defaultValue.fill ? {\n fill: { value: defaultValue.fill }\n } : {}), (defaultValue.stroke ? {\n stroke: { value: defaultValue.stroke }\n } : {}));\n if (encoding.fill || encoding.stroke) {\n // ignore encoding.color, markDef.color, config.color\n if (markDef.color) {\n // warn for markDef.color (no need to warn encoding.color as it will be dropped in normalized already)\n log.warn(log.message.droppingColor('property', { fill: 'fill' in encoding, stroke: 'stroke' in encoding }));\n }\n return tslib_1.__assign({}, nonPosition('fill', model, { defaultValue: defaultValue.fill || transparentIfNeeded }), nonPosition('stroke', model, { defaultValue: defaultValue.stroke }));\n }\n else if (encoding.color) {\n return tslib_1.__assign({}, fillStrokeMarkDefAndConfig, nonPosition('color', model, {\n vgChannel: colorVgChannel,\n // apply default fill/stroke first, then color config, then transparent if needed.\n defaultValue: markDef[colorVgChannel] || markDef.color || configValue[colorVgChannel] || configValue.color || (filled ? transparentIfNeeded : undefined)\n }));\n }\n else if (markDef.fill || markDef.stroke) {\n // Ignore markDef.color, config.color\n if (markDef.color) {\n log.warn(log.message.droppingColor('property', { fill: 'fill' in markDef, stroke: 'stroke' in markDef }));\n }\n return fillStrokeMarkDefAndConfig;\n }\n else if (markDef.color) {\n return tslib_1.__assign({}, fillStrokeMarkDefAndConfig, (_a = {}, _a[colorVgChannel] = { value: markDef.color }, _a));\n }\n else if (configValue.fill || configValue.stroke) {\n // ignore config.color\n return fillStrokeMarkDefAndConfig;\n }\n else if (configValue.color) {\n return tslib_1.__assign({}, (transparentIfNeeded ? { fill: { value: 'transparent' } } : {}), (_b = {}, _b[colorVgChannel] = { value: configValue.color }, _b));\n }\n return {};\n}\nexport function baseEncodeEntry(model, ignore) {\n return tslib_1.__assign({}, markDefProperties(model.markDef, ignore), color(model), nonPosition('opacity', model), tooltip(model), text(model, 'href'));\n}\nfunction markDefProperties(mark, ignore) {\n return VG_MARK_CONFIGS.reduce(function (m, prop) {\n if (mark[prop] !== undefined && ignore[prop] !== 'ignore') {\n m[prop] = { value: mark[prop] };\n }\n return m;\n }, {});\n}\nexport function valueIfDefined(prop, value) {\n var _a;\n if (value !== undefined) {\n return _a = {}, _a[prop] = { value: value }, _a;\n }\n return undefined;\n}\nfunction validPredicate(vgRef) {\n return vgRef + \" !== null && !isNaN(\" + vgRef + \")\";\n}\nexport function defined(model) {\n if (model.config.invalidValues === 'filter') {\n var fields = ['x', 'y'].map(function (channel) {\n var scaleComponent = model.getScaleComponent(channel);\n if (scaleComponent) {\n var scaleType = scaleComponent.get('type');\n // Discrete domain scales can handle invalid values, but continuous scales can't.\n if (hasContinuousDomain(scaleType)) {\n return model.vgField(channel, { expr: 'datum' });\n }\n }\n return undefined;\n })\n .filter(function (field) { return !!field; })\n .map(validPredicate);\n if (fields.length > 0) {\n return {\n defined: { signal: fields.join(' && ') }\n };\n }\n }\n return {};\n}\n/**\n * Return mixins for non-positional channels with scales. (Text doesn't have scale.)\n */\nexport function nonPosition(channel, model, opt) {\n if (opt === void 0) { opt = {}; }\n var defaultValue = opt.defaultValue, vgChannel = opt.vgChannel;\n var defaultRef = opt.defaultRef || (defaultValue !== undefined ? { value: defaultValue } : undefined);\n var channelDef = model.encoding[channel];\n return wrapCondition(model, channelDef, vgChannel || channel, function (cDef) {\n return ref.midPoint(channel, cDef, model.scaleName(channel), model.getScaleComponent(channel), null, // No need to provide stack for non-position as it does not affect mid point\n defaultRef);\n });\n}\n/**\n * Return a mixin that include a Vega production rule for a Vega-Lite conditional channel definition.\n * or a simple mixin if channel def has no condition.\n */\nexport function wrapCondition(model, channelDef, vgChannel, refFn) {\n var _a, _b;\n var condition = channelDef && channelDef.condition;\n var valueRef = refFn(channelDef);\n if (condition) {\n var conditions = isArray(condition) ? condition : [condition];\n var vgConditions = conditions.map(function (c) {\n var conditionValueRef = refFn(c);\n var test = isConditionalSelection(c) ? selectionPredicate(model, c.selection) : expression(model, c.test);\n return tslib_1.__assign({ test: test }, conditionValueRef);\n });\n return _a = {},\n _a[vgChannel] = vgConditions.concat((valueRef !== undefined ? [valueRef] : [])),\n _a;\n }\n else {\n return valueRef !== undefined ? (_b = {}, _b[vgChannel] = valueRef, _b) : {};\n }\n}\nexport function tooltip(model) {\n var channel = 'tooltip';\n var channelDef = model.encoding[channel];\n if (isArray(channelDef)) {\n var keyValues = channelDef.map(function (fieldDef) {\n var key = fieldDef.title !== undefined ? fieldDef.title : vgField(fieldDef, { binSuffix: 'range' });\n var value = ref.text(fieldDef, model.config).signal;\n return \"\\\"\" + key + \"\\\": \" + value;\n });\n return { tooltip: { signal: \"{\" + keyValues.join(', ') + \"}\" } };\n }\n else {\n // if not an array, behave just like text\n return textCommon(model, channel, channelDef);\n }\n}\nexport function text(model, channel) {\n if (channel === void 0) { channel = 'text'; }\n var channelDef = model.encoding[channel];\n return textCommon(model, channel, channelDef);\n}\nfunction textCommon(model, channel, channelDef) {\n return wrapCondition(model, channelDef, channel, function (cDef) { return ref.text(cDef, model.config); });\n}\nexport function bandPosition(fieldDef, channel, model) {\n var _a, _b, _c;\n var scaleName = model.scaleName(channel);\n var sizeChannel = channel === 'x' ? 'width' : 'height';\n if (model.encoding.size || model.markDef.size !== undefined) {\n var orient = model.markDef.orient;\n if (orient) {\n var centeredBandPositionMixins = (_a = {},\n // Use xc/yc and place the mark at the middle of the band\n // This way we never have to deal with size's condition for x/y position.\n _a[channel + 'c'] = ref.fieldRef(fieldDef, scaleName, {}, { band: 0.5 }),\n _a);\n if (getFieldDef(model.encoding.size)) {\n return tslib_1.__assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel }));\n }\n else if (isValueDef(model.encoding.size)) {\n return tslib_1.__assign({}, centeredBandPositionMixins, nonPosition('size', model, { vgChannel: sizeChannel }));\n }\n else if (model.markDef.size !== undefined) {\n return tslib_1.__assign({}, centeredBandPositionMixins, (_b = {}, _b[sizeChannel] = { value: model.markDef.size }, _b));\n }\n }\n else {\n log.warn(log.message.cannotApplySizeToNonOrientedMark(model.markDef.type));\n }\n }\n return _c = {},\n _c[channel] = ref.fieldRef(fieldDef, scaleName, { binSuffix: 'range' }),\n _c[sizeChannel] = ref.bandRef(scaleName),\n _c;\n}\nexport function centeredBandPosition(channel, model, defaultPosRef, defaultSizeRef) {\n var centerChannel = channel === 'x' ? 'xc' : 'yc';\n var sizeChannel = channel === 'x' ? 'width' : 'height';\n return tslib_1.__assign({}, pointPosition(channel, model, defaultPosRef, centerChannel), nonPosition('size', model, { defaultRef: defaultSizeRef, vgChannel: sizeChannel }));\n}\nexport function binnedPosition(fieldDef, channel, scaleName, spacing, reverse) {\n if (channel === 'x') {\n return {\n x2: ref.bin(fieldDef, scaleName, 'start', reverse ? 0 : spacing),\n x: ref.bin(fieldDef, scaleName, 'end', reverse ? spacing : 0)\n };\n }\n else {\n return {\n y2: ref.bin(fieldDef, scaleName, 'start', reverse ? spacing : 0),\n y: ref.bin(fieldDef, scaleName, 'end', reverse ? 0 : spacing)\n };\n }\n}\n/**\n * Return mixins for point (non-band) position channels.\n */\nexport function pointPosition(channel, model, defaultRef, vgChannel) {\n // TODO: refactor how refer to scale as discussed in https://github.com/vega/vega-lite/pull/1613\n var _a;\n var encoding = model.encoding, mark = model.mark, stack = model.stack;\n var channelDef = encoding[channel];\n var scaleName = model.scaleName(channel);\n var scale = model.getScaleComponent(channel);\n var offset = ref.getOffset(channel, model.markDef);\n var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ?\n // use geopoint output if there are lat/long and there is no point position overriding lat/long.\n { field: model.getName(channel) } : tslib_1.__assign({}, ref.stackable(channel, encoding[channel], scaleName, scale, stack, ref.getDefaultRef(defaultRef, channel, scaleName, scale, mark)), (offset ? { offset: offset } : {}));\n return _a = {},\n _a[vgChannel || channel] = valueRef,\n _a;\n}\n/**\n * Return mixins for x2, y2.\n * If channel is not specified, return one channel based on orientation.\n */\nexport function pointPosition2(model, defaultRef, channel) {\n var _a;\n var encoding = model.encoding, mark = model.mark, stack = model.stack;\n var baseChannel = channel === 'x2' ? 'x' : 'y';\n var channelDef = encoding[baseChannel];\n var scaleName = model.scaleName(baseChannel);\n var scale = model.getScaleComponent(baseChannel);\n var offset = ref.getOffset(channel, model.markDef);\n var valueRef = !channelDef && (encoding.latitude || encoding.longitude) ?\n // use geopoint output if there are lat2/long2 and there is no point position2 overriding lat2/long2.\n { field: model.getName(channel) } : tslib_1.__assign({}, ref.stackable2(channel, channelDef, encoding[channel], scaleName, scale, stack, ref.getDefaultRef(defaultRef, baseChannel, scaleName, scale, mark)), (offset ? { offset: offset } : {}));\n return _a = {}, _a[channel] = valueRef, _a;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4aW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9taXhpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHbEMsT0FBTyxFQUlMLFdBQVcsRUFDWCxzQkFBc0IsRUFDdEIsVUFBVSxFQUdWLE9BQU8sR0FDUixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsZUFBZSxFQUE0QixNQUFNLG1CQUFtQixDQUFDO0FBQzdFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDeEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsT0FBTyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFFbEMsTUFBTSxnQkFBZ0IsS0FBZ0IsRUFBRSxHQUE4Qzs7SUFBOUMsb0JBQUEsRUFBQSxRQUE2QixTQUFTLEVBQUUsS0FBSyxFQUFDO0lBQzdFLElBQUEsdUJBQU8sRUFBRSx5QkFBUSxFQUFFLHFCQUFNLENBQVU7SUFDbkMsSUFBQSx1QkFBTSxFQUFFLHVCQUFjLENBQVk7SUFFekMsSUFBTSxXQUFXLEdBQUc7UUFDbEIsSUFBSSxFQUFFLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztRQUM1QyxNQUFNLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO1FBQ2hELEtBQUssRUFBRSxhQUFhLENBQUMsT0FBTyxFQUFFLE9BQU8s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QUFJLENBQUMsQ0FDbkUsRUFDRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDNUIsQ0FBQztJQUVKLGdCQUFRLEdBQUMsT0FBTyxJQUFHLFFBQVEsS0FBRTtBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge05PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBQb3NpdGlvblNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge1xuICBDaGFubmVsRGVmLFxuICBGaWVsZERlZixcbiAgRmllbGREZWZXaXRoQ29uZGl0aW9uLFxuICBnZXRGaWVsZERlZixcbiAgaXNDb25kaXRpb25hbFNlbGVjdGlvbixcbiAgaXNWYWx1ZURlZixcbiAgVGV4dEZpZWxkRGVmLFxuICBWYWx1ZURlZldpdGhDb25kaXRpb24sXG4gIHZnRmllbGQsXG59IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrRGVmfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7ZXhwcmVzc2lvbn0gZnJvbSAnLi4vLi4vcHJlZGljYXRlJztcbmltcG9ydCB7aGFzQ29udGludW91c0RvbWFpbn0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZHX01BUktfQ09ORklHUywgVmdFbmNvZGVFbnRyeSwgVmdWYWx1ZVJlZn0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtnZXRNYXJrQ29uZmlnfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtzZWxlY3Rpb25QcmVkaWNhdGV9IGZyb20gJy4uL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0ICogYXMgcmVmIGZyb20gJy4vdmFsdWVyZWYnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29sb3IobW9kZWw6IFVuaXRNb2RlbCwgb3B0OiB7dmFsdWVPbmx5OiBib29sZWFufSA9IHt2YWx1ZU9ubHk6IGZhbHNlfSk6IFZnRW5jb2RlRW50cnkge1xuICBjb25zdCB7bWFya0RlZiwgZW5jb2RpbmcsIGNvbmZpZ30gPSBtb2RlbDtcbiAgY29uc3Qge2ZpbGxlZCwgdHlwZTogbWFya1R5cGV9ID0gbWFya0RlZjtcblxuICBjb25zdCBjb25maWdWYWx1ZSA9IHtcbiAgICBmaWxsOiBnZXRNYXJrQ29uZmlnKCdmaWxsJywgbWFya0RlZiwgY29uZmlnKSxcbiAgICBzdHJva2U6IGdldE1hcmtDb25maWcoJ3N0cm9rZScsIG1hcmtEZWYsIGNvbmZpZyksXG4gICAgY29sb3I6IGdldE1hcmtDb25maWcoJ2NvbG9yJywgbWFya0RlZiwgY29uZmlnKVxuICB9O1xuXG4gIGNvbnN0IHRyYW5zcGFyZW50SWZOZWVkZWQgPSBjb250YWlucyhbJ2JhcicsICdwb2ludCcsICdjaXJjbGUnLCAnc3F1YXJlJywgJ2dlb3NoYXBlJ10sIG1hcmtUeXBlKSA/ICd0cmFuc3BhcmVudCcgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgZGVmYXVsdFZhbHVlID0ge1xuICAgIGZpbGw6IG1hcmtEZWYuZmlsbCB8fCBjb25maWdWYWx1ZS5maWxsIHx8XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZmlsbCwgYWx3YXlzIGZpbGwgc3ltYm9scywgYmFyLCBnZW9zaGFwZVxuICAgIC8vIHdpdGggdHJhbnNwYXJlbnQgZmlsbHMgaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8xMzE2XG4gICAgICB0cmFuc3BhcmVudElmTmVlZGVkLFxuICAgIHN0cm9rZTogbWFya0RlZi5zdHJva2UgfHwgY29uZmlnVmFsdWUuc3Ryb2tlXG4gIH07XG5cbiAgY29uc3QgY29sb3JWZ0NoYW5uZWwgPSBmaWxsZWQgPyAnZmlsbCcgOiAnc3Ryb2tlJztcblxuICBjb25zdCBmaWxsU3Ryb2tlTWFya0RlZkFuZENvbmZpZzogVmdFbmNvZGVFbnRyeSA9IHtcbiAgICAuLi4oZGVmYXVsdFZhbHVlLmZpbGwgPyB7XG4gICAgICBmaWxsOiB7dmFsdWU6IGRlZmF1bHRWYWx1ZS5maWxsfVxuICAgIH0gOiB7fSksXG4gICAgLi4uKGRlZmF1bHRWYWx1ZS5zdHJva2UgPyB7XG4gICAgICBzdHJva2U6IHt2YWx1ZTogZGVmYXVsdFZhbHVlLnN0cm9rZX1cbiAgICB9IDoge30pLFxuICB9O1xuXG4gIGlmIChlbmNvZGluZy5maWxsIHx8IGVuY29kaW5nLnN0cm9rZSkge1xuICAgIC8vIGlnbm9yZSBlbmNvZGluZy5jb2xvciwgbWFya0RlZi5jb2xvciwgY29uZmlnLmNvbG9yXG4gICAgaWYgKG1hcmtEZWYuY29sb3IpIHtcbiAgICAgIC8vIHdhcm4gZm9yIG1hcmtEZWYuY29sb3IgIChubyBuZWVkIHRvIHdhcm4gZW5jb2RpbmcuY29sb3IgYXMgaXQgd2lsbCBiZSBkcm9wcGVkIGluIG5vcm1hbGl6ZWQgYWxyZWFkeSlcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRyb3BwaW5nQ29sb3IoJ3Byb3BlcnR5Jywge2ZpbGw6ICdmaWxsJyBpbiBlbmNvZGluZywgc3Ryb2tlOiAnc3Ryb2tlJyBpbiBlbmNvZGluZ30pKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubm9uUG9zaXRpb24oJ2ZpbGwnLCBtb2RlbCwge2RlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLmZpbGwgfHwgdHJhbnNwYXJlbnRJZk5lZWRlZH0pLFxuICAgICAgLi4ubm9uUG9zaXRpb24oJ3N0cm9rZScsIG1vZGVsLCB7ZGVmYXVsdFZhbHVlOiBkZWZhdWx0VmFsdWUuc3Ryb2tlfSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKGVuY29kaW5nLmNvbG9yKSB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmlsbFN0cm9rZU1hcmtEZWZBbmRDb25maWcsXG4gICAgICAvLyBvdmVycmlkZSB0aGVtIHdpdGggZW5jb2RlZCBjb2xvciBmaWVsZFxuICAgICAgLi4ubm9uUG9zaXRpb24oJ2NvbG9yJywgbW9kZWwsIHtcbiAgICAgICAgdmdDaGFubmVsOiBjb2xvclZnQ2hhbm5lbCxcbiAgICAgICAgLy8gYXBwbHkgZGVmYXVsdCBmaWxsL3N0cm9rZSBmaXJzdCwgdGhlbiBjb2xvciBjb25maWcsIHRoZW4gdHJhbnNwYXJlbnQgaWYgbmVlZGVkLlxuICAgICAgICBkZWZhdWx0VmFsdWU6IG1hcmtEZWZbY29sb3JWZ0NoYW5uZWxdIHx8IG1hcmtEZWYuY29sb3IgfHwgY29uZmlnVmFsdWVbY29sb3JWZ0NoYW5uZWxdIHx8IGNvbmZpZ1ZhbHVlLmNvbG9yIHx8IChmaWxsZWQgPyB0cmFuc3BhcmVudElmTmVlZGVkIDogdW5kZWZpbmVkKVxuICAgICAgfSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKG1hcmtEZWYuZmlsbCB8fCBtYXJrRGVmLnN0cm9rZSkge1xuICAgIC8vIElnbm9yZSBtYXJrRGVmLmNvbG9yLCBjb25maWcuY29sb3JcbiAgICBpZiAobWFya0RlZi5jb2xvcikge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZHJvcHBpbmdDb2xvcigncHJvcGVydHknLCB7ZmlsbDogJ2ZpbGwnIGluIG1hcmtEZWYsIHN0cm9rZTogJ3N0cm9rZScgaW4gbWFya0RlZn0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGxTdHJva2VNYXJrRGVmQW5kQ29uZmlnO1xuICB9IGVsc2UgaWYgKG1hcmtEZWYuY29sb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZmlsbFN0cm9rZU1hcmtEZWZBbmRDb25maWcsIC8vIGluIHRoaXMgY2FzZSwgZmlsbFN0cm9rZU1hcmtEZWZBbmRDb25maWcgb25seSBpbmNsdWRlIGNvbmZpZ1xuXG4gICAgICAvLyBvdmVycmlkZSBjb25maWcgd2l0aCBtYXJrRGVmLmNvbG9yXG4gICAgICBbY29sb3JWZ0NoYW5uZWxdOiB7dmFsdWU6IG1hcmtEZWYuY29sb3J9XG4gICAgfTtcbiAgfSBlbHNlIGlmIChjb25maWdWYWx1ZS5maWxsIHx8IGNvbmZpZ1ZhbHVlLnN0cm9rZSkge1xuICAgIC8vIGlnbm9yZSBjb25maWcuY29sb3JcbiAgICByZXR1cm4gZmlsbFN0cm9rZU1hcmtEZWZBbmRDb25maWc7XG4gIH0gZWxzZSBpZiAoY29uZmlnVmFsdWUuY29sb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uKHRyYW5zcGFyZW50SWZOZWVkZWQgPyB7ZmlsbDoge3ZhbHVlOiAndHJhbnNwYXJlbnQnfX0gOiB7fSksXG4gICAgICBbY29sb3JWZ0NoYW5uZWxdOiB7dmFsdWU6IGNvbmZpZ1ZhbHVlLmNvbG9yfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgdHlwZSBJZ25vcmUgPSBSZWNvcmQ8J3NpemUnIHwgJ29yaWVudCcsICdpZ25vcmUnIHwgJ2luY2x1ZGUnPjtcblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2VFbmNvZGVFbnRyeShtb2RlbDogVW5pdE1vZGVsLCBpZ25vcmU6IElnbm9yZSkge1xuICByZXR1cm4ge1xuICAgIC4uLm1hcmtEZWZQcm9wZXJ0aWVzKG1vZGVsLm1hcmtEZWYsIGlnbm9yZSksXG4gICAgLi4uY29sb3IobW9kZWwpLFxuICAgIC4uLm5vblBvc2l0aW9uKCdvcGFjaXR5JywgbW9kZWwpLFxuICAgIC4uLnRvb2x0aXAobW9kZWwpLFxuICAgIC4uLnRleHQobW9kZWwsICdocmVmJylcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWFya0RlZlByb3BlcnRpZXMobWFyazogTWFya0RlZiwgaWdub3JlOiBJZ25vcmUpIHtcbiAgcmV0dXJuIFZHX01BUktfQ09ORklHUy5yZWR1Y2UoKG0sIHByb3ApID0+IHtcbiAgICBpZiAobWFya1twcm9wXSAhPT0gdW5kZWZpbmVkICYmIGlnbm9yZVtwcm9wXSAhPT0gJ2lnbm9yZScpIHtcbiAgICAgIG1bcHJvcF0gPSB7dmFsdWU6IG1hcmtbcHJvcF19O1xuICAgIH1cbiAgICByZXR1cm4gbTtcbiAgfSwge30pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVJZkRlZmluZWQocHJvcDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbik6IFZnRW5jb2RlRW50cnkge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB7W3Byb3BdOiB7dmFsdWU6IHZhbHVlfX07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gdmFsaWRQcmVkaWNhdGUodmdSZWY6IHN0cmluZykge1xuICByZXR1cm4gYCR7dmdSZWZ9ICE9PSBudWxsICYmICFpc05hTigke3ZnUmVmfSlgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lZChtb2RlbDogVW5pdE1vZGVsKTogVmdFbmNvZGVFbnRyeSB7XG4gIGlmIChtb2RlbC5jb25maWcuaW52YWxpZFZhbHVlcyA9PT0gJ2ZpbHRlcicpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneSddLm1hcCgoY2hhbm5lbDogUG9zaXRpb25TY2FsZUNoYW5uZWwpID0+IHtcbiAgICAgICAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgICAgICAgaWYgKHNjYWxlQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGVDb21wb25lbnQuZ2V0KCd0eXBlJyk7XG5cbiAgICAgICAgICAvLyBEaXNjcmV0ZSBkb21haW4gc2NhbGVzIGNhbiBoYW5kbGUgaW52YWxpZCB2YWx1ZXMsIGJ1dCBjb250aW51b3VzIHNjYWxlcyBjYW4ndC5cbiAgICAgICAgICBpZiAoaGFzQ29udGludW91c0RvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZWwudmdGaWVsZChjaGFubmVsLCB7ZXhwcjogJ2RhdHVtJ30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoZmllbGQgPT4gISFmaWVsZClcbiAgICAgIC5tYXAodmFsaWRQcmVkaWNhdGUpO1xuXG4gICAgaWYgKGZpZWxkcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkZWZpbmVkOiB7c2lnbmFsOiBmaWVsZHMuam9pbignICYmICcpfVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmV0dXJuIG1peGlucyBmb3Igbm9uLXBvc2l0aW9uYWwgY2hhbm5lbHMgd2l0aCBzY2FsZXMuICAoVGV4dCBkb2Vzbid0IGhhdmUgc2NhbGUuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9uUG9zaXRpb24oY2hhbm5lbDogdHlwZW9mIE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTWzBdLCBtb2RlbDogVW5pdE1vZGVsLCBvcHQ6IHtkZWZhdWx0VmFsdWU/OiBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuLCB2Z0NoYW5uZWw/OiBzdHJpbmcsIGRlZmF1bHRSZWY/OiBWZ1ZhbHVlUmVmfSA9IHt9KTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHtkZWZhdWx0VmFsdWUsIHZnQ2hhbm5lbH0gPSBvcHQ7XG4gIGNvbnN0IGRlZmF1bHRSZWYgPSBvcHQuZGVmYXVsdFJlZiB8fCAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgPyB7dmFsdWU6IGRlZmF1bHRWYWx1ZX0gOiB1bmRlZmluZWQpO1xuXG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBtb2RlbC5lbmNvZGluZ1tjaGFubmVsXTtcblxuICByZXR1cm4gd3JhcENvbmRpdGlvbihtb2RlbCwgY2hhbm5lbERlZiwgdmdDaGFubmVsIHx8IGNoYW5uZWwsIChjRGVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZi5taWRQb2ludChcbiAgICAgIGNoYW5uZWwsIGNEZWYsIG1vZGVsLnNjYWxlTmFtZShjaGFubmVsKSxcbiAgICAgIG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLFxuICAgICAgbnVsbCwgLy8gTm8gbmVlZCB0byBwcm92aWRlIHN0YWNrIGZvciBub24tcG9zaXRpb24gYXMgaXQgZG9lcyBub3QgYWZmZWN0IG1pZCBwb2ludFxuICAgICAgZGVmYXVsdFJlZlxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiBhIG1peGluIHRoYXQgaW5jbHVkZSBhIFZlZ2EgcHJvZHVjdGlvbiBydWxlIGZvciBhIFZlZ2EtTGl0ZSBjb25kaXRpb25hbCBjaGFubmVsIGRlZmluaXRpb24uXG4gKiBvciBhIHNpbXBsZSBtaXhpbiBpZiBjaGFubmVsIGRlZiBoYXMgbm8gY29uZGl0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JhcENvbmRpdGlvbihcbiAgICBtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsRGVmOiBDaGFubmVsRGVmPHN0cmluZz4sIHZnQ2hhbm5lbDogc3RyaW5nLFxuICAgIHJlZkZuOiAoY0RlZjogQ2hhbm5lbERlZjxzdHJpbmc+KSA9PiBWZ1ZhbHVlUmVmXG4gICk6IFZnRW5jb2RlRW50cnkge1xuICBjb25zdCBjb25kaXRpb24gPSBjaGFubmVsRGVmICYmIGNoYW5uZWxEZWYuY29uZGl0aW9uO1xuICBjb25zdCB2YWx1ZVJlZiA9IHJlZkZuKGNoYW5uZWxEZWYpO1xuICBpZiAoY29uZGl0aW9uKSB7XG4gICAgY29uc3QgY29uZGl0aW9ucyA9IGlzQXJyYXkoY29uZGl0aW9uKSA/IGNvbmRpdGlvbiA6IFtjb25kaXRpb25dO1xuICAgIGNvbnN0IHZnQ29uZGl0aW9ucyA9IGNvbmRpdGlvbnMubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBjb25kaXRpb25WYWx1ZVJlZiA9IHJlZkZuKGMpO1xuICAgICAgY29uc3QgdGVzdCA9IGlzQ29uZGl0aW9uYWxTZWxlY3Rpb24oYykgPyBzZWxlY3Rpb25QcmVkaWNhdGUobW9kZWwsIGMuc2VsZWN0aW9uKSA6IGV4cHJlc3Npb24obW9kZWwsIGMudGVzdCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXN0LFxuICAgICAgICAuLi5jb25kaXRpb25WYWx1ZVJlZlxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgW3ZnQ2hhbm5lbF06IFtcbiAgICAgICAgLi4udmdDb25kaXRpb25zLFxuICAgICAgICAuLi4odmFsdWVSZWYgIT09IHVuZGVmaW5lZCA/IFt2YWx1ZVJlZl0gOiBbXSlcbiAgICAgIF1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWx1ZVJlZiAhPT0gdW5kZWZpbmVkID8ge1t2Z0NoYW5uZWxdOiB2YWx1ZVJlZn0gOiB7fTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9vbHRpcChtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IGNoYW5uZWwgPSAndG9vbHRpcCc7XG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBtb2RlbC5lbmNvZGluZ1tjaGFubmVsXTtcbiAgaWYgKGlzQXJyYXkoY2hhbm5lbERlZikpIHtcbiAgICBjb25zdCBrZXlWYWx1ZXMgPSBjaGFubmVsRGVmLm1hcCgoZmllbGREZWYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGZpZWxkRGVmLnRpdGxlICE9PSB1bmRlZmluZWQgPyBmaWVsZERlZi50aXRsZSA6IHZnRmllbGQoZmllbGREZWYsIHtiaW5TdWZmaXg6ICdyYW5nZSd9KTtcbiAgICAgIGNvbnN0IHZhbHVlID0gcmVmLnRleHQoZmllbGREZWYsIG1vZGVsLmNvbmZpZykuc2lnbmFsO1xuICAgICAgcmV0dXJuIGBcIiR7a2V5fVwiOiAke3ZhbHVlfWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHt0b29sdGlwOiB7c2lnbmFsOiBgeyR7a2V5VmFsdWVzLmpvaW4oJywgJyl9fWB9fTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBub3QgYW4gYXJyYXksIGJlaGF2ZSBqdXN0IGxpa2UgdGV4dFxuICAgIHJldHVybiB0ZXh0Q29tbW9uKG1vZGVsLCBjaGFubmVsLCBjaGFubmVsRGVmKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdGV4dChtb2RlbDogVW5pdE1vZGVsLCBjaGFubmVsOiAndGV4dCcgfCAnaHJlZicgPSAndGV4dCcpIHtcbiAgY29uc3QgY2hhbm5lbERlZiA9IG1vZGVsLmVuY29kaW5nW2NoYW5uZWxdO1xuICByZXR1cm4gdGV4dENvbW1vbihtb2RlbCwgY2hhbm5lbCwgY2hhbm5lbERlZik7XG59XG5cbmZ1bmN0aW9uIHRleHRDb21tb24obW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogJ3RleHQnIHwgJ2hyZWYnIHwgJ3Rvb2x0aXAnLCBjaGFubmVsRGVmOiBGaWVsZERlZldpdGhDb25kaXRpb248VGV4dEZpZWxkRGVmPHN0cmluZz4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPFRleHRGaWVsZERlZjxzdHJpbmc+Pikge1xuICByZXR1cm4gd3JhcENvbmRpdGlvbihtb2RlbCwgY2hhbm5lbERlZiwgY2hhbm5lbCwgKGNEZWYpID0+IHJlZi50ZXh0KGNEZWYsIG1vZGVsLmNvbmZpZykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmFuZFBvc2l0aW9uKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiAneCd8J3knLCBtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHNjYWxlTmFtZSA9IG1vZGVsLnNjYWxlTmFtZShjaGFubmVsKTtcbiAgY29uc3Qgc2l6ZUNoYW5uZWwgPSBjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG5cbiAgaWYgKG1vZGVsLmVuY29kaW5nLnNpemUgfHwgbW9kZWwubWFya0RlZi5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvcmllbnQgPSBtb2RlbC5tYXJrRGVmLm9yaWVudDtcbiAgICBpZiAob3JpZW50KSB7XG4gICAgICBjb25zdCBjZW50ZXJlZEJhbmRQb3NpdGlvbk1peGlucyA9IHtcbiAgICAgICAgLy8gVXNlIHhjL3ljIGFuZCBwbGFjZSB0aGUgbWFyayBhdCB0aGUgbWlkZGxlIG9mIHRoZSBiYW5kXG4gICAgICAgIC8vIFRoaXMgd2F5IHdlIG5ldmVyIGhhdmUgdG8gZGVhbCB3aXRoIHNpemUncyBjb25kaXRpb24gZm9yIHgveSBwb3NpdGlvbi5cbiAgICAgICAgW2NoYW5uZWwrJ2MnXTogcmVmLmZpZWxkUmVmKGZpZWxkRGVmLCBzY2FsZU5hbWUsIHt9LCB7YmFuZDogMC41fSlcbiAgICAgIH07XG5cbiAgICAgIGlmIChnZXRGaWVsZERlZihtb2RlbC5lbmNvZGluZy5zaXplKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNlbnRlcmVkQmFuZFBvc2l0aW9uTWl4aW5zLFxuICAgICAgICAgIC4uLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwsIHt2Z0NoYW5uZWw6IHNpemVDaGFubmVsfSlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoaXNWYWx1ZURlZihtb2RlbC5lbmNvZGluZy5zaXplKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmNlbnRlcmVkQmFuZFBvc2l0aW9uTWl4aW5zLFxuICAgICAgICAgIC4uLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwsIHt2Z0NoYW5uZWw6IHNpemVDaGFubmVsfSlcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAobW9kZWwubWFya0RlZi5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jZW50ZXJlZEJhbmRQb3NpdGlvbk1peGlucyxcbiAgICAgICAgICBbc2l6ZUNoYW5uZWxdOiB7dmFsdWU6IG1vZGVsLm1hcmtEZWYuc2l6ZX1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuY2Fubm90QXBwbHlTaXplVG9Ob25PcmllbnRlZE1hcmsobW9kZWwubWFya0RlZi50eXBlKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgW2NoYW5uZWxdOiByZWYuZmllbGRSZWYoZmllbGREZWYsIHNjYWxlTmFtZSwge2JpblN1ZmZpeDogJ3JhbmdlJ30pLFxuICAgIFtzaXplQ2hhbm5lbF06IHJlZi5iYW5kUmVmKHNjYWxlTmFtZSlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNlbnRlcmVkQmFuZFBvc2l0aW9uKGNoYW5uZWw6ICd4JyB8ICd5JywgbW9kZWw6IFVuaXRNb2RlbCwgZGVmYXVsdFBvc1JlZjogVmdWYWx1ZVJlZiwgZGVmYXVsdFNpemVSZWY6IFZnVmFsdWVSZWYpIHtcbiAgY29uc3QgY2VudGVyQ2hhbm5lbDogJ3hjJyB8ICd5YycgPSBjaGFubmVsID09PSAneCcgPyAneGMnIDogJ3ljJztcbiAgY29uc3Qgc2l6ZUNoYW5uZWwgPSBjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogJ2hlaWdodCc7XG4gIHJldHVybiB7XG4gICAgLi4ucG9pbnRQb3NpdGlvbihjaGFubmVsLCBtb2RlbCwgZGVmYXVsdFBvc1JlZiwgY2VudGVyQ2hhbm5lbCksXG4gICAgLi4ubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge2RlZmF1bHRSZWY6IGRlZmF1bHRTaXplUmVmLCB2Z0NoYW5uZWw6IHNpemVDaGFubmVsfSlcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbm5lZFBvc2l0aW9uKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiAneCd8J3knLCBzY2FsZU5hbWU6IHN0cmluZywgc3BhY2luZzogbnVtYmVyLCByZXZlcnNlOiBib29sZWFuKSB7XG4gIGlmIChjaGFubmVsID09PSAneCcpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDI6IHJlZi5iaW4oZmllbGREZWYsIHNjYWxlTmFtZSwgJ3N0YXJ0JywgcmV2ZXJzZSA/IDAgOiBzcGFjaW5nKSxcbiAgICAgIHg6IHJlZi5iaW4oZmllbGREZWYsIHNjYWxlTmFtZSwgJ2VuZCcsIHJldmVyc2UgPyBzcGFjaW5nIDogMClcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICB5MjogcmVmLmJpbihmaWVsZERlZiwgc2NhbGVOYW1lLCAnc3RhcnQnLCByZXZlcnNlID8gc3BhY2luZyA6IDApLFxuICAgICAgeTogcmVmLmJpbihmaWVsZERlZiwgc2NhbGVOYW1lLCAnZW5kJywgcmV2ZXJzZSA/IDAgOiBzcGFjaW5nKVxuICAgIH07XG4gIH1cbn1cblxuXG4vKipcbiAqIFJldHVybiBtaXhpbnMgZm9yIHBvaW50IChub24tYmFuZCkgcG9zaXRpb24gY2hhbm5lbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb2ludFBvc2l0aW9uKGNoYW5uZWw6ICd4J3wneScsIG1vZGVsOiBVbml0TW9kZWwsIGRlZmF1bHRSZWY6IFZnVmFsdWVSZWYgfCAnemVyb09yTWluJyB8ICd6ZXJvT3JNYXgnLCB2Z0NoYW5uZWw/OiAneCd8J3knfCd4Yyd8J3ljJykge1xuICAvLyBUT0RPOiByZWZhY3RvciBob3cgcmVmZXIgdG8gc2NhbGUgYXMgZGlzY3Vzc2VkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9wdWxsLzE2MTNcblxuICBjb25zdCB7ZW5jb2RpbmcsIG1hcmssIHN0YWNrfSA9IG1vZGVsO1xuXG4gIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgY29uc3Qgc2NhbGVOYW1lID0gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpO1xuXG5cbiAgY29uc3Qgb2Zmc2V0ID0gcmVmLmdldE9mZnNldChjaGFubmVsLCBtb2RlbC5tYXJrRGVmKTtcblxuXG4gIGNvbnN0IHZhbHVlUmVmID0gIWNoYW5uZWxEZWYgJiYgKGVuY29kaW5nLmxhdGl0dWRlIHx8IGVuY29kaW5nLmxvbmdpdHVkZSkgP1xuICAgIC8vIHVzZSBnZW9wb2ludCBvdXRwdXQgaWYgdGhlcmUgYXJlIGxhdC9sb25nIGFuZCB0aGVyZSBpcyBubyBwb2ludCBwb3NpdGlvbiBvdmVycmlkaW5nIGxhdC9sb25nLlxuICAgIHtmaWVsZDogbW9kZWwuZ2V0TmFtZShjaGFubmVsKX0gOlxuICAgIHtcbiAgICAgIC4uLnJlZi5zdGFja2FibGUoY2hhbm5lbCwgZW5jb2RpbmdbY2hhbm5lbF0sIHNjYWxlTmFtZSwgc2NhbGUsIHN0YWNrLFxuICAgICAgICByZWYuZ2V0RGVmYXVsdFJlZihkZWZhdWx0UmVmLCBjaGFubmVsLCBzY2FsZU5hbWUsIHNjYWxlLCBtYXJrKVxuICAgICAgKSxcbiAgICAgLi4uKG9mZnNldCA/IHtvZmZzZXR9OiB7fSlcbiAgICB9O1xuXG4gIHJldHVybiB7XG4gICAgW3ZnQ2hhbm5lbCB8fCBjaGFubmVsXTogdmFsdWVSZWZcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gbWl4aW5zIGZvciB4MiwgeTIuXG4gKiBJZiBjaGFubmVsIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybiBvbmUgY2hhbm5lbCBiYXNlZCBvbiBvcmllbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50UG9zaXRpb24yKG1vZGVsOiBVbml0TW9kZWwsIGRlZmF1bHRSZWY6ICd6ZXJvT3JNaW4nIHwgJ3plcm9Pck1heCcsIGNoYW5uZWw6ICd4MicgfCAneTInKSB7XG4gIGNvbnN0IHtlbmNvZGluZywgbWFyaywgc3RhY2t9ID0gbW9kZWw7XG5cbiAgY29uc3QgYmFzZUNoYW5uZWwgPSBjaGFubmVsID09PSAneDInID8gJ3gnIDogJ3knO1xuICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbYmFzZUNoYW5uZWxdO1xuICBjb25zdCBzY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoYmFzZUNoYW5uZWwpO1xuICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGJhc2VDaGFubmVsKTtcblxuICBjb25zdCBvZmZzZXQgPSByZWYuZ2V0T2Zmc2V0KGNoYW5uZWwsIG1vZGVsLm1hcmtEZWYpO1xuXG4gIGNvbnN0IHZhbHVlUmVmID0gIWNoYW5uZWxEZWYgJiYgKGVuY29kaW5nLmxhdGl0dWRlIHx8IGVuY29kaW5nLmxvbmdpdHVkZSkgP1xuICAgIC8vIHVzZSBnZW9wb2ludCBvdXRwdXQgaWYgdGhlcmUgYXJlIGxhdDIvbG9uZzIgYW5kIHRoZXJlIGlzIG5vIHBvaW50IHBvc2l0aW9uMiBvdmVycmlkaW5nIGxhdDIvbG9uZzIuXG4gICAge2ZpZWxkOiBtb2RlbC5nZXROYW1lKGNoYW5uZWwpfTpcbiAgICB7XG4gICAgICAuLi5yZWYuc3RhY2thYmxlMihjaGFubmVsLCBjaGFubmVsRGVmLCBlbmNvZGluZ1tjaGFubmVsXSwgc2NhbGVOYW1lLCBzY2FsZSwgc3RhY2ssXG4gICAgICAgIHJlZi5nZXREZWZhdWx0UmVmKGRlZmF1bHRSZWYsIGJhc2VDaGFubmVsLCBzY2FsZU5hbWUsIHNjYWxlLCBtYXJrKVxuICAgICAgKSxcbiAgICAgIC4uLihvZmZzZXQgPyB7b2Zmc2V0fSA6IHt9KVxuICAgIH07XG5cbiAgcmV0dXJuIHtbY2hhbm5lbF06IHZhbHVlUmVmfTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { isScaleChannel } from '../channel';\nimport { isScaleFieldDef, isTimeFieldDef, vgField } from '../fielddef';\nimport { ScaleType } from '../scale';\nimport { formatExpression } from '../timeunit';\nimport { QUANTITATIVE } from '../type';\nimport { contains, keys, stringify } from '../util';\nimport { wrapCondition } from './mark/mixins';\nexport function applyConfig(e, config, // TODO(#1842): consolidate MarkConfig | TextConfig?\npropsList) {\n for (var _i = 0, propsList_1 = propsList; _i < propsList_1.length; _i++) {\n var property = propsList_1[_i];\n var value = config[property];\n if (value !== undefined) {\n e[property] = { value: value };\n }\n }\n return e;\n}\nexport function applyMarkConfig(e, model, propsList) {\n for (var _i = 0, propsList_2 = propsList; _i < propsList_2.length; _i++) {\n var property = propsList_2[_i];\n var value = getMarkConfig(property, model.markDef, model.config);\n if (value !== undefined) {\n e[property] = { value: value };\n }\n }\n return e;\n}\nexport function getStyles(mark) {\n return [].concat(mark.type, mark.style || []);\n}\n/**\n * Return property value from style or mark specific config property if exists.\n * Otherwise, return general mark specific config.\n */\nexport function getMarkConfig(prop, mark, config) {\n // By default, read from mark config first!\n var value = config.mark[prop];\n // Then read mark specific config, which has higher precedence\n var markSpecificConfig = config[mark.type];\n if (markSpecificConfig[prop] !== undefined) {\n value = markSpecificConfig[prop];\n }\n // Then read style config, which has even higher precedence.\n var styles = getStyles(mark);\n for (var _i = 0, styles_1 = styles; _i < styles_1.length; _i++) {\n var style = styles_1[_i];\n var styleConfig = config.style[style];\n // MarkConfig extends VgMarkConfig so a prop may not be a valid property for style\n // However here we also check if it is defined, so it is okay to cast here\n var p = prop;\n if (styleConfig && styleConfig[p] !== undefined) {\n value = styleConfig[p];\n }\n }\n return value;\n}\nexport function formatSignalRef(fieldDef, specifiedFormat, expr, config) {\n var format = numberFormat(fieldDef, specifiedFormat, config);\n if (fieldDef.bin) {\n var startField = vgField(fieldDef, { expr: expr });\n var endField = vgField(fieldDef, { expr: expr, binSuffix: 'end' });\n return {\n signal: binFormatExpression(startField, endField, format, config)\n };\n }\n else if (fieldDef.type === 'quantitative') {\n return {\n signal: \"\" + formatExpr(vgField(fieldDef, { expr: expr, binSuffix: 'range' }), format)\n };\n }\n else if (isTimeFieldDef(fieldDef)) {\n var isUTCScale = isScaleFieldDef(fieldDef) && fieldDef['scale'] && fieldDef['scale'].type === ScaleType.UTC;\n return {\n signal: timeFormatExpression(vgField(fieldDef, { expr: expr }), fieldDef.timeUnit, specifiedFormat, config.text.shortTimeLabels, config.timeFormat, isUTCScale, true)\n };\n }\n else {\n return {\n signal: \"''+\" + vgField(fieldDef, { expr: expr })\n };\n }\n}\nexport function getSpecifiedOrDefaultValue(specifiedValue, defaultValue) {\n if (specifiedValue !== undefined) {\n return specifiedValue;\n }\n return defaultValue;\n}\n/**\n * Returns number format for a fieldDef\n *\n * @param format explicitly specified format\n */\nexport function numberFormat(fieldDef, specifiedFormat, config) {\n if (fieldDef.type === QUANTITATIVE) {\n // add number format for quantitative type only\n // Specified format in axis/legend has higher precedence than fieldDef.format\n if (specifiedFormat) {\n return specifiedFormat;\n }\n // TODO: need to make this work correctly for numeric ordinal / nominal type\n return config.numberFormat;\n }\n return undefined;\n}\nfunction formatExpr(field, format) {\n return \"format(\" + field + \", \\\"\" + (format || '') + \"\\\")\";\n}\nexport function numberFormatExpr(field, specifiedFormat, config) {\n return formatExpr(field, specifiedFormat || config.numberFormat);\n}\nexport function binFormatExpression(startField, endField, format, config) {\n return startField + \" === null || isNaN(\" + startField + \") ? \\\"null\\\" : \" + numberFormatExpr(startField, format, config) + \" + \\\" - \\\" + \" + numberFormatExpr(endField, format, config);\n}\n/**\n * Returns the time expression used for axis/legend labels or text mark for a temporal field\n */\nexport function timeFormatExpression(field, timeUnit, format, shortTimeLabels, timeFormatConfig, isUTCScale, alwaysReturn) {\n if (alwaysReturn === void 0) { alwaysReturn = false; }\n if (!timeUnit || format) {\n // If there is not time unit, or if user explicitly specify format for axis/legend/text.\n format = format || timeFormatConfig; // only use config.timeFormat if there is no timeUnit.\n if (format || alwaysReturn) {\n return (isUTCScale ? 'utc' : 'time') + \"Format(\" + field + \", '\" + format + \"')\";\n }\n else {\n return undefined;\n }\n }\n else {\n return formatExpression(timeUnit, field, shortTimeLabels, isUTCScale);\n }\n}\n/**\n * Return Vega sort parameters (tuple of field and order).\n */\nexport function sortParams(orderDef, fieldRefOption) {\n return (isArray(orderDef) ? orderDef : [orderDef]).reduce(function (s, orderChannelDef) {\n s.field.push(vgField(orderChannelDef, fieldRefOption));\n s.order.push(orderChannelDef.sort || 'ascending');\n return s;\n }, { field: [], order: [] });\n}\nexport function mergeTitleFieldDefs(f1, f2) {\n var merged = f1.slice();\n f2.forEach(function (fdToMerge) {\n for (var _i = 0, merged_1 = merged; _i < merged_1.length; _i++) {\n var fieldDef1 = merged_1[_i];\n // If already exists, no need to append to merged array\n if (stringify(fieldDef1) === stringify(fdToMerge)) {\n return;\n }\n }\n merged.push(fdToMerge);\n });\n return merged;\n}\nexport function mergeTitle(title1, title2) {\n return title1 === title2 ?\n title1 : // if title is the same just use one of them\n title1 + ', ' + title2; // join title with comma if different\n}\nexport function mergeTitleComponent(v1, v2) {\n if (isArray(v1.value) && isArray(v2.value)) {\n return {\n explicit: v1.explicit,\n value: mergeTitleFieldDefs(v1.value, v2.value)\n };\n }\n else if (!isArray(v1.value) && !isArray(v2.value)) {\n return {\n explicit: v1.explicit,\n value: mergeTitle(v1.value, v2.value)\n };\n }\n /* istanbul ignore next: Condition should not happen -- only for warning in development. */\n throw new Error('It should never reach here');\n}\n/**\n * Checks whether a fieldDef for a particular channel requires a computed bin range.\n */\nexport function binRequiresRange(fieldDef, channel) {\n if (!fieldDef.bin) {\n console.warn('Only use this method with binned field defs');\n return false;\n }\n // We need the range only when the user explicitly forces a binned field to be use discrete scale. In this case, bin range is used in axis and legend labels.\n // We could check whether the axis or legend exists (not disabled) but that seems overkill.\n return isScaleChannel(channel) && contains(['ordinal', 'nominal'], fieldDef.type);\n}\nexport function guideEncodeEntry(encoding, model) {\n return keys(encoding).reduce(function (encode, channel) {\n var valueDef = encoding[channel];\n return tslib_1.__assign({}, encode, wrapCondition(model, valueDef, channel, function (x) { return ({ value: x.value }); }));\n }, {});\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBVSxjQUFjLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkQsT0FBTyxFQUF5QyxlQUFlLEVBQUUsY0FBYyxFQUEyQixPQUFPLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHdEksT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQVcsTUFBTSxhQUFhLENBQUM7QUFDdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFHbEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUs1QyxNQUFNLHNCQUFzQixDQUFnQixFQUN4QyxNQUE0QyxFQUFFLG9EQUFvRDtBQUNsRyxTQUFtQjtJQUNyQixLQUF1QixVQUFTLEVBQVQsdUJBQVMsRUFBVCx1QkFBUyxFQUFULElBQVMsRUFBRTtRQUE3QixJQUFNLFFBQVEsa0JBQUE7UUFDakIsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7U0FDOUI7S0FDRjtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELE1BQU0sMEJBQTBCLENBQWdCLEVBQUUsS0FBZ0IsRUFBRSxTQUErQjtJQUNqRyxLQUF1QixVQUFTLEVBQVQsdUJBQVMsRUFBVCx1QkFBUyxFQUFULElBQVMsRUFB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Q0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNBcnJheX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgaXNTY2FsZUNoYW5uZWx9IGZyb20gJy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWcsIFZpZXdDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0ZpZWxkRGVmLCBGaWVsZERlZkJhc2UsIEZpZWxkUmVmT3B0aW9uLCBpc1NjYWxlRmllbGREZWYsIGlzVGltZUZpZWxkRGVmLCBPcmRlckZpZWxkRGVmLCBWYWx1ZURlZiwgdmdGaWVsZH0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtHdWlkZUVuY29kaW5nRW50cnl9IGZyb20gJy4uL2d1aWRlJztcbmltcG9ydCB7TWFya0NvbmZpZywgTWFya0RlZiwgVGV4dENvbmZpZ30gZnJvbSAnLi4vbWFyayc7XG5pbXBvcnQge1NjYWxlVHlwZX0gZnJvbSAnLi4vc2NhbGUnO1xuaW1wb3J0IHtmb3JtYXRFeHByZXNzaW9uLCBUaW1lVW5pdH0gZnJvbSAnLi4vdGltZXVuaXQnO1xuaW1wb3J0IHtRVUFOVElUQVRJVkV9IGZyb20gJy4uL3R5cGUnO1xuaW1wb3J0IHtjb250YWlucywga2V5cywgc3RyaW5naWZ5fSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7VmdFbmNvZGVDaGFubmVsLCBWZ0VuY29kZUVudHJ5LCBWZ01hcmtDb25maWcsIFZnU29ydH0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtBeGlzQ29tcG9uZW50UHJvcHN9IGZyb20gJy4vYXhpcy9jb21wb25lbnQnO1xuaW1wb3J0IHt3cmFwQ29uZGl0aW9ufSBmcm9tICcuL21hcmsvbWl4aW5zJztcbmltcG9ydCB7RXhwbGljaXR9IGZyb20gJy4vc3BsaXQnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vdW5pdCc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5Q29uZmlnKGU6IFZnRW5jb2RlRW50cnksXG4gICAgY29uZmlnOiBWaWV3Q29uZmlnIHwgTWFya0NvbmZpZyB8IFRleHRDb25maWcsIC8vIFRPRE8oIzE4NDIpOiBjb25zb2xpZGF0ZSBNYXJrQ29uZmlnIHwgVGV4dENvbmZpZz9cbiAgICBwcm9wc0xpc3Q6IHN0cmluZ1tdKSB7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcHNMaXN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlW3Byb3BlcnR5XSA9IHt2YWx1ZTogdmFsdWV9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFya0NvbmZpZyhlOiBWZ0VuY29kZUVudHJ5LCBtb2RlbDogVW5pdE1vZGVsLCBwcm9wc0xpc3Q6IChrZXlvZiBNYXJrQ29uZmlnKVtdKSB7XG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcHNMaXN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRNYXJrQ29uZmlnKHByb3BlcnR5LCBtb2RlbC5tYXJrRGVmLCBtb2RlbC5jb25maWcpO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlW3Byb3BlcnR5XSA9IHt2YWx1ZTogdmFsdWV9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0eWxlcyhtYXJrOiBNYXJrRGVmKTogc3RyaW5nW10ge1xuICByZXR1cm4gW10uY29uY2F0KG1hcmsudHlwZSwgbWFyay5zdHlsZSB8fCBbXSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHByb3BlcnR5IHZhbHVlIGZyb20gc3R5bGUgb3IgbWFyayBzcGVjaWZpYyBjb25maWcgcHJvcGVydHkgaWYgZXhpc3RzLlxuICogT3RoZXJ3aXNlLCByZXR1cm4gZ2VuZXJhbCBtYXJrIHNwZWNpZmljIGNvbmZpZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtDb25maWc8UCBleHRlbmRzIGtleW9mIE1hcmtDb25maWc+KHByb3A6IFAsIG1hcms6IE1hcmtEZWYsIGNvbmZpZzogQ29uZmlnKTogTWFya0NvbmZpZ1tQXSB7XG4gIC8vIEJ5IGRlZmF1bHQsIHJlYWQgZnJvbSBtYXJrIGNvbmZpZyBmaXJzdCFcbiAgbGV0IHZhbHVlID0gY29uZmlnLm1hcmtbcHJvcF07XG5cbiAgLy8gVGhlbiByZWFkIG1hcmsgc3BlY2lmaWMgY29uZmlnLCB3aGljaCBoYXMgaGlnaGVyIHByZWNlZGVuY2VcbiAgY29uc3QgbWFya1NwZWNpZmljQ29uZmlnID0gY29uZmlnW21hcmsudHlwZV07XG4gIGlmIChtYXJrU3BlY2lmaWNDb25maWdbcHJvcF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHZhbHVlID0gbWFya1NwZWNpZmljQ29uZmlnW3Byb3BdO1xuICB9XG5cbiAgLy8gVGhlbiByZWFkIHN0eWxlIGNvbmZpZywgd2hpY2ggaGFzIGV2ZW4gaGlnaGVyIHByZWNlZGVuY2UuXG4gIGNvbnN0IHN0eWxlcyA9IGdldFN0eWxlcyhtYXJrKTtcbiAgZm9yIChjb25zdCBzdHlsZSBvZiBzdHlsZXMpIHtcbiAgICBjb25zdCBzdHlsZUNvbmZpZyA9IGNvbmZpZy5zdHlsZVtzdHlsZV07XG5cbiAgICAvLyBNYXJrQ29uZmlnIGV4dGVuZHMgVmdNYXJrQ29uZmlnIHNvIGEgcHJvcCBtYXkgbm90IGJlIGEgdmFsaWQgcHJvcGVydHkgZm9yIHN0eWxlXG4gICAgLy8gSG93ZXZlciBoZXJlIHdlIGFsc28gY2hlY2sgaWYgaXQgaXMgZGVmaW5lZCwgc28gaXQgaXMgb2theSB0byBjYXN0IGhlcmVcbiAgICBjb25zdCBwID0gcHJvcCBhcyBrZXlvZiBWZ01hcmtDb25maWc7XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHN0eWxlQ29uZmlnW3BdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gc3R5bGVDb25maWdbcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U2lnbmFsUmVmKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzcGVjaWZpZWRGb3JtYXQ6IHN0cmluZywgZXhwcjogJ2RhdHVtJyB8ICdwYXJlbnQnLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBmb3JtYXQgPSBudW1iZXJGb3JtYXQoZmllbGREZWYsIHNwZWNpZmllZEZvcm1hdCwgY29uZmlnKTtcbiAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgIGNvbnN0IHN0YXJ0RmllbGQgPSB2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcn0pO1xuICAgIGNvbnN0IGVuZEZpZWxkID0gdmdGaWVsZChmaWVsZERlZiwge2V4cHIsIGJpblN1ZmZpeDogJ2VuZCd9KTtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiBiaW5Gb3JtYXRFeHByZXNzaW9uKHN0YXJ0RmllbGQsIGVuZEZpZWxkLCBmb3JtYXQsIGNvbmZpZylcbiAgICB9O1xuICB9IGVsc2UgaWYgKGZpZWxkRGVmLnR5cGUgPT09ICdxdWFudGl0YXRpdmUnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpZ25hbDogYCR7Zm9ybWF0RXhwcih2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwciwgYmluU3VmZml4OiAncmFuZ2UnfSksIGZvcm1hdCl9YFxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNUaW1lRmllbGREZWYoZmllbGREZWYpKSB7XG4gICAgY29uc3QgaXNVVENTY2FsZSA9IGlzU2NhbGVGaWVsZERlZihmaWVsZERlZikgJiYgZmllbGREZWZbJ3NjYWxlJ10gJiYgZmllbGREZWZbJ3NjYWxlJ10udHlwZSA9PT0gU2NhbGVUeXBlLlVUQztcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiB0aW1lRm9ybWF0RXhwcmVzc2lvbih2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcn0pLCBmaWVsZERlZi50aW1lVW5pdCwgc3BlY2lmaWVkRm9ybWF0LCBjb25maWcudGV4dC5zaG9ydFRpbWVMYWJlbHMsIGNvbmZpZy50aW1lRm9ybWF0LCBpc1VUQ1NjYWxlLCB0cnVlKVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpZ25hbDogYCcnKyR7dmdGaWVsZChmaWVsZERlZiwge2V4cHJ9KX1gXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWU8VD4oc3BlY2lmaWVkVmFsdWU6IFQsIGRlZmF1bHRWYWx1ZTogVCB8IHtzaWduYWw6IHN0cmluZ30pIHtcbiAgaWYgKHNwZWNpZmllZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVkVmFsdWU7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIG51bWJlciBmb3JtYXQgZm9yIGEgZmllbGREZWZcbiAqXG4gKiBAcGFyYW0gZm9ybWF0IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyRm9ybWF0KGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzcGVjaWZpZWRGb3JtYXQ6IHN0cmluZywgY29uZmlnOiBDb25maWcpIHtcbiAgaWYgKGZpZWxkRGVmLnR5cGUgPT09IFFVQU5USVRBVElWRSkge1xuICAgIC8vIGFkZCBudW1iZXIgZm9ybWF0IGZvciBxdWFudGl0YXRpdmUgdHlwZSBvbmx5XG5cbiAgICAvLyBTcGVjaWZpZWQgZm9ybWF0IGluIGF4aXMvbGVnZW5kIGhhcyBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGZpZWxkRGVmLmZvcm1hdFxuICAgIGlmIChzcGVjaWZpZWRGb3JtYXQpIHtcbiAgICAgIHJldHVybiBzcGVjaWZpZWRGb3JtYXQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogbmVlZCB0byBtYWtlIHRoaXMgd29yayBjb3JyZWN0bHkgZm9yIG51bWVyaWMgb3JkaW5hbCAvIG5vbWluYWwgdHlwZVxuICAgIHJldHVybiBjb25maWcubnVtYmVyRm9ybWF0O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEV4cHIoZmllbGQ6IHN0cmluZywgZm9ybWF0OiBzdHJpbmcpIHtcbiAgcmV0dXJuIGBmb3JtYXQoJHtmaWVsZH0sIFwiJHtmb3JtYXQgfHwgJyd9XCIpYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZvcm1hdEV4cHIoZmllbGQ6IHN0cmluZywgc3BlY2lmaWVkRm9ybWF0OiBzdHJpbmcsIGNvbmZpZzogQ29uZmlnKSB7XG4gIHJldHVybiBmb3JtYXRFeHByKGZpZWxkLCBzcGVjaWZpZWRGb3JtYXQgfHwgY29uZmlnLm51bWJlckZvcm1hdCk7XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbkZvcm1hdEV4cHJlc3Npb24oc3RhcnRGaWVsZDogc3RyaW5nLCBlbmRGaWVsZDogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZywgY29uZmlnOiBDb25maWcpIHtcbiAgcmV0dXJuIGAke3N0YXJ0RmllbGR9ID09PSBudWxsIHx8IGlzTmFOKCR7c3RhcnRGaWVsZH0pID8gXCJudWxsXCIgOiAke251bWJlckZvcm1hdEV4cHIoc3RhcnRGaWVsZCwgZm9ybWF0LCBjb25maWcpfSArIFwiIC0gXCIgKyAke251bWJlckZvcm1hdEV4cHIoZW5kRmllbGQsIGZvcm1hdCwgY29uZmlnKX1gO1xufVxuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgdGltZSBleHByZXNzaW9uIHVzZWQgZm9yIGF4aXMvbGVnZW5kIGxhYmVscyBvciB0ZXh0IG1hcmsgZm9yIGEgdGVtcG9yYWwgZmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbWVGb3JtYXRFeHByZXNzaW9uKGZpZWxkOiBzdHJpbmcsIHRpbWVVbml0OiBUaW1lVW5pdCwgZm9ybWF0OiBzdHJpbmcsIHNob3J0VGltZUxhYmVsczogYm9vbGVhbiwgdGltZUZvcm1hdENvbmZpZzogc3RyaW5nLCBpc1VUQ1NjYWxlOiBib29sZWFuLCBhbHdheXNSZXR1cm46IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmICghdGltZVVuaXQgfHwgZm9ybWF0KSB7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm90IHRpbWUgdW5pdCwgb3IgaWYgdXNlciBleHBsaWNpdGx5IHNwZWNpZnkgZm9ybWF0IGZvciBheGlzL2xlZ2VuZC90ZXh0LlxuICAgIGZvcm1hdCA9IGZvcm1hdCB8fCB0aW1lRm9ybWF0Q29uZmlnOyAvLyBvbmx5IHVzZSBjb25maWcudGltZUZvcm1hdCBpZiB0aGVyZSBpcyBubyB0aW1lVW5pdC5cblxuICAgIGlmIChmb3JtYXQgfHwgYWx3YXlzUmV0dXJuKSB7XG4gICAgICByZXR1cm4gYCR7aXNVVENTY2FsZSA/ICd1dGMnIDogJ3RpbWUnfUZvcm1hdCgke2ZpZWxkfSwgJyR7Zm9ybWF0fScpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZvcm1hdEV4cHJlc3Npb24odGltZVVuaXQsIGZpZWxkLCBzaG9ydFRpbWVMYWJlbHMsIGlzVVRDU2NhbGUpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIFZlZ2Egc29ydCBwYXJhbWV0ZXJzICh0dXBsZSBvZiBmaWVsZCBhbmQgb3JkZXIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29ydFBhcmFtcyhvcmRlckRlZjogT3JkZXJGaWVsZERlZjxzdHJpbmc+IHwgT3JkZXJGaWVsZERlZjxzdHJpbmc+W10sIGZpZWxkUmVmT3B0aW9uPzogRmllbGRSZWZPcHRpb24pOiBWZ1NvcnQge1xuICByZXR1cm4gKGlzQXJyYXkob3JkZXJEZWYpID8gb3JkZXJEZWYgOiBbb3JkZXJEZWZdKS5yZWR1Y2UoKHMsIG9yZGVyQ2hhbm5lbERlZikgPT4ge1xuICAgIHMuZmllbGQucHVzaCh2Z0ZpZWxkKG9yZGVyQ2hhbm5lbERlZiwgZmllbGRSZWZPcHRpb24pKTtcbiAgICBzLm9yZGVyLnB1c2gob3JkZXJDaGFubmVsRGVmLnNvcnQgfHwgJ2FzY2VuZGluZycpO1xuICAgIHJldHVybiBzO1xuICB9LCB7ZmllbGQ6W10sIG9yZGVyOiBbXX0pO1xufVxuXG5leHBvcnQgdHlwZSBBeGlzVGl0bGVDb21wb25lbnQgPSBBeGlzQ29tcG9uZW50UHJvcHNbJ3RpdGxlJ107XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRpdGxlRmllbGREZWZzKGYxOiBGaWVsZERlZkJhc2U8c3RyaW5nPltdLCBmMjogRmllbGREZWZCYXNlPHN0cmluZz5bXSkge1xuICBjb25zdCBtZXJnZWQgPSBbLi4uZjFdO1xuXG4gIGYyLmZvckVhY2goKGZkVG9NZXJnZSkgPT4ge1xuICAgIGZvciAoY29uc3QgZmllbGREZWYxIG9mIG1lcmdlZCkge1xuICAgICAgLy8gSWYgYWxyZWFkeSBleGlzdHMsIG5vIG5lZWQgdG8gYXBwZW5kIHRvIG1lcmdlZCBhcnJheVxuICAgICAgaWYgKHN0cmluZ2lmeShmaWVsZERlZjEpID09PSBzdHJpbmdpZnkoZmRUb01lcmdlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIG1lcmdlZC5wdXNoKGZkVG9NZXJnZSk7XG4gIH0pO1xuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUaXRsZSh0aXRsZTE6IHN0cmluZywgdGl0bGUyOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHRpdGxlMSA9PT0gdGl0bGUyID9cbiAgICB0aXRsZTEgOiAvLyBpZiB0aXRsZSBpcyB0aGUgc2FtZSBqdXN0IHVzZSBvbmUgb2YgdGhlbVxuICAgIHRpdGxlMSArICcsICcgKyB0aXRsZTI7IC8vIGpvaW4gdGl0bGUgd2l0aCBjb21tYSBpZiBkaWZmZXJlbnRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlVGl0bGVDb21wb25lbnQoXG4gIHYxOiBFeHBsaWNpdDxBeGlzVGl0bGVDb21wb25lbnQ+LCB2MjogRXhwbGljaXQ8QXhpc1RpdGxlQ29tcG9uZW50PlxuKSB7XG4gIGlmIChpc0FycmF5KHYxLnZhbHVlKSAmJiBpc0FycmF5KHYyLnZhbHVlKSkge1xuICAgIHJldHVybiB7XG4gICAgICBleHBsaWNpdDogdjEuZXhwbGljaXQsXG4gICAgICB2YWx1ZTogbWVyZ2VUaXRsZUZpZWxkRGVmcyh2MS52YWx1ZSwgdjIudmFsdWUpXG4gICAgfTtcbiAgfSBlbHNlIGlmICghaXNBcnJheSh2MS52YWx1ZSkgJiYgIWlzQXJyYXkodjIudmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV4cGxpY2l0OiB2MS5leHBsaWNpdCwgLy8ga2VlcCB0aGUgb2xkIGV4cGxpY2l0XG4gICAgICB2YWx1ZTogbWVyZ2VUaXRsZSh2MS52YWx1ZSwgdjIudmFsdWUpXG4gICAgfTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogQ29uZGl0aW9uIHNob3VsZCBub3QgaGFwcGVuIC0tIG9ubHkgZm9yIHdhcm5pbmcgaW4gZGV2ZWxvcG1lbnQuICovXG4gIHRocm93IG5ldyBFcnJvcignSXQgc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUnKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGZpZWxkRGVmIGZvciBhIHBhcnRpY3VsYXIgY2hhbm5lbCByZXF1aXJlcyBhIGNvbXB1dGVkIGJpbiByYW5nZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpblJlcXVpcmVzUmFuZ2UoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgaWYgKCFmaWVsZERlZi5iaW4pIHtcbiAgICBjb25zb2xlLndhcm4oJ09ubHkgdXNlIHRoaXMgbWV0aG9kIHdpdGggYmlubmVkIGZpZWxkIGRlZnMnKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBXZSBuZWVkIHRoZSByYW5nZSBvbmx5IHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSBmb3JjZXMgYSBiaW5uZWQgZmllbGQgdG8gYmUgdXNlIGRpc2NyZXRlIHNjYWxlLiBJbiB0aGlzIGNhc2UsIGJpbiByYW5nZSBpcyB1c2VkIGluIGF4aXMgYW5kIGxlZ2VuZCBsYWJlbHMuXG4gIC8vIFdlIGNvdWxkIGNoZWNrIHdoZXRoZXIgdGhlIGF4aXMgb3IgbGVnZW5kIGV4aXN0cyAobm90IGRpc2FibGVkKSBidXQgdGhhdCBzZWVtcyBvdmVya2lsbC5cbiAgcmV0dXJuIGlzU2NhbGVDaGFubmVsKGNoYW5uZWwpICYmIGNvbnRhaW5zKFsnb3JkaW5hbCcsICdub21pbmFsJ10sIGZpZWxkRGVmLnR5cGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3VpZGVFbmNvZGVFbnRyeShlbmNvZGluZzogR3VpZGVFbmNvZGluZ0VudHJ5LCBtb2RlbDogVW5pdE1vZGVsKSB7XG4gIHJldHVybiBrZXlzKGVuY29kaW5nKS5yZWR1Y2UoKGVuY29kZSwgY2hhbm5lbDogVmdFbmNvZGVDaGFubmVsKSA9PiB7XG4gICAgY29uc3QgdmFsdWVEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZW5jb2RlLFxuICAgICAgLi4ud3JhcENvbmRpdGlvbihtb2RlbCwgdmFsdWVEZWYsIGNoYW5uZWwsICh4OiBWYWx1ZURlZikgPT4gKHt2YWx1ZTogeC52YWx1ZX0pKVxuICAgIH07XG4gIH0sIHt9KTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { vgField } from '../../fielddef';\nimport { keys } from '../../util';\nimport { formatSignalRef } from '../common';\nexport var HEADER_CHANNELS = ['row', 'column'];\nexport var HEADER_TYPES = ['header', 'footer'];\nexport function getHeaderType(orient) {\n if (orient === 'top' || orient === 'left') {\n return 'header';\n }\n return 'footer';\n}\nexport function getTitleGroup(model, channel) {\n var title = model.component.layoutHeaders[channel].title;\n var textOrient = channel === 'row' ? 'vertical' : undefined;\n var update = tslib_1.__assign({ align: { value: 'center' }, text: { value: title } }, (textOrient === 'vertical' ? { angle: { value: 270 } } : {}));\n return {\n name: model.getName(channel + \"_title\"),\n role: channel + \"-title\",\n type: 'group',\n marks: [tslib_1.__assign({ type: 'text', role: channel + \"-title-text\", style: 'guide-title' }, (keys(update).length > 0 ? { encode: { update: update } } : {}))]\n };\n}\nexport function getHeaderGroups(model, channel) {\n var layoutHeader = model.component.layoutHeaders[channel];\n var groups = [];\n for (var _i = 0, HEADER_TYPES_1 = HEADER_TYPES; _i < HEADER_TYPES_1.length; _i++) {\n var headerType = HEADER_TYPES_1[_i];\n if (layoutHeader[headerType]) {\n for (var _a = 0, _b = layoutHeader[headerType]; _a < _b.length; _a++) {\n var headerCmpt = _b[_a];\n groups.push(getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt));\n }\n }\n }\n return groups;\n}\n// 0, (0,90), 90, (90, 180), 180, (180, 270), 270, (270, 0)\nexport function labelAlign(angle) {\n // to keep angle in [0, 360)\n angle = ((angle % 360) + 360) % 360;\n if ((angle + 90) % 180 === 0) { // for 90 and 270\n return {}; // default center\n }\n else if (angle < 90 || 270 < angle) {\n return { align: { value: 'right' } };\n }\n else if (135 <= angle && angle < 225) {\n return { align: { value: 'left' } };\n }\n return {};\n}\nexport function labelBaseline(angle) {\n // to keep angle in [0, 360)\n angle = ((angle % 360) + 360) % 360;\n if (45 <= angle && angle <= 135) {\n return { baseline: { value: 'top' } };\n }\n return {};\n}\nfunction getHeaderGroup(model, channel, headerType, layoutHeader, headerCmpt) {\n var _a;\n if (headerCmpt) {\n var title = null;\n var facetFieldDef = layoutHeader.facetFieldDef;\n if (facetFieldDef && headerCmpt.labels) {\n var _b = facetFieldDef.header, header = _b === void 0 ? {} : _b;\n var format = header.format, labelAngle = header.labelAngle;\n var update = tslib_1.__assign({}, (labelAngle !== undefined ? { angle: { value: labelAngle } } : {}), labelAlign(labelAngle), labelBaseline(labelAngle));\n title = tslib_1.__assign({ text: formatSignalRef(facetFieldDef, format, 'parent', model.config), offset: 10, orient: channel === 'row' ? 'left' : 'top', style: 'guide-label' }, (keys(update).length > 0 ? { encode: { update: update } } : {}));\n }\n var axes = headerCmpt.axes;\n var hasAxes = axes && axes.length > 0;\n if (title || hasAxes) {\n var sizeChannel = channel === 'row' ? 'height' : 'width';\n return tslib_1.__assign({ name: model.getName(channel + \"_\" + headerType), type: 'group', role: channel + \"-\" + headerType }, (layoutHeader.facetFieldDef ? {\n from: { data: model.getName(channel + '_domain') },\n sort: {\n field: vgField(facetFieldDef, { expr: 'datum' }),\n order: facetFieldDef.sort || 'ascending'\n }\n } : {}), (title ? { title: title } : {}), (headerCmpt.sizeSignal ? {\n encode: {\n update: (_a = {},\n _a[sizeChannel] = headerCmpt.sizeSignal,\n _a)\n }\n } : {}), (hasAxes ? { axes: axes } : {}));\n }\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGF5b3V0L2hlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBSUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUkxQyxNQUFNLENBQUMsSUFBTSxlQUFlLEdBQW9CLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBR2xFLE1BQU0sQ0FBQyxJQUFNLFlBQVksR0FBaUIsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUF3Qy9ELE1BQU0sd0JBQXdCLE1BQWtCO0lBQzlDLElBQUksTUFBTSxLQUFLLEtBQUssSUFBSSxNQUFNLEtBQUssTUFBTSxFQUFFO1FBQ3pDLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sd0JBQXdCLEtBQVksRUFBRSxPQUFzQjtJQUNoRSxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDM0QsSUFBTSxVQUFVLEdBQUcsT0FBTyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFOUQsSUFBTSxNQUFNLHNCQUNWLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFDeEIsSUFBSSxFQUFFLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxJQUNqQixDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxFQUFDLENBQUEsQ0FBQyxDQUFDLEVB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T0FBTyxTQUFJLFVBQVksSUFDN0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxFQUFDO2dCQUNoRCxJQUFJLEVBQUU7b0JBQ0osS0FBSyxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUM7b0JBQzlDLEtBQUssRUFBRSxhQUFhLENBQUMsSUFBSSxJQUFJLFdBQVc7aUJBQ3pDO2FBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxPQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3RCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sRUFBRTtvQkFDTixNQUFNO3dCQUNKLEdBQUMsV0FBVyxJQUFHLFVBQVUsQ0FBQyxVQUFVOzJCQUNyQztpQkFDRjthQUNGLENBQUEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNILENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLElBQUksTUFBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUMxQjtTQUNIO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdHkgZm9yIGdlbmVyYXRpbmcgcm93IC8gY29sdW1uIGhlYWRlcnNcbiAqL1xuaW1wb3J0IHtGYWNldEZpZWxkRGVmfSBmcm9tICcuLi8uLi9mYWNldCc7XG5pbXBvcnQge3ZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge0F4aXNPcmllbnQsIFZnQXhpcywgVmdNYXJrR3JvdXB9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7Zm9ybWF0U2lnbmFsUmVmfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuXG5leHBvcnQgdHlwZSBIZWFkZXJDaGFubmVsID0gJ3JvdycgfCAnY29sdW1uJztcbmV4cG9ydCBjb25zdCBIRUFERVJfQ0hBTk5FTFM6IEhlYWRlckNoYW5uZWxbXSA9IFsncm93JywgJ2NvbHVtbiddO1xuXG5leHBvcnQgdHlwZSBIZWFkZXJUeXBlID0gJ2hlYWRlcicgfCAnZm9vdGVyJztcbmV4cG9ydCBjb25zdCBIRUFERVJfVFlQRVM6IEhlYWRlclR5cGVbXSA9IFsnaGVhZGVyJywgJ2Zvb3RlciddO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50cyBhbGwgaGVhZGVyLCBmb290ZXJzIGFuZCB0aXRsZSBvZiBhIFZlZ2EgZ3JvdXAgd2l0aCBsYXlvdXQgZGlyZWN0aXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEhlYWRlckNvbXBvbmVudCB7XG4gIHRpdGxlPzogc3RyaW5nO1xuXG4gIC8vIFRPRE86IHJlcGVhdCBhbmQgY29uY2F0IGNhbiBoYXZlIG11bHRpcGxlIGhlYWRlciAvIGZvb3Rlci5cbiAgLy8gTmVlZCB0byByZWRlc2lnbiB0aGlzIHBhcnQgYSBiaXQuXG5cbiAgZmFjZXRGaWVsZERlZj86IEZhY2V0RmllbGREZWY8c3RyaW5nPjtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgaGVhZGVyIGNvbXBvbmVudHMgZm9yIGhlYWRlcnMuXG4gICAqIEZvciBmYWNldCwgdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGhlYWRlciBjb21wb25lbnQsIHdoaWNoIGlzIGRhdGEtZHJpdmVuLlxuICAgKiBGb3IgcmVwZWF0IGFuZCBjb25jYXQsIHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBoZWFkZXIgY29tcG9uZW50cyB0aGF0IGV4cGxpY2l0bHkgbGlzdCBkaWZmZXJlbnQgYXhlcy5cbiAgICovXG4gIGhlYWRlcj86IEhlYWRlckNvbXBvbmVudFtdO1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBoZWFkZXIgY29tcG9uZW50cyBmb3IgZm9vdGVycy5cbiAgICogRm9yIGZhY2V0LCB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgaGVhZGVyIGNvbXBvbmVudCwgd2hpY2ggaXMgZGF0YS1kcml2ZW4uXG4gICAqIEZvciByZXBlYXQgYW5kIGNvbmNhdCwgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGhlYWRlciBjb21wb25lbnRzIHRoYXQgZXhwbGljaXRseSBsaXN0IGRpZmZlcmVudCBheGVzLlxuICAgKi9cbiAgZm9vdGVyPzogSGVhZGVyQ29tcG9uZW50W107XG59XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCByZXByZXNlbnRzIG9uZSBncm91cCBvZiByb3cvY29sdW1uLWhlYWRlci9mb290ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhZGVyQ29tcG9uZW50IHtcblxuICBsYWJlbHM6IGJvb2xlYW47XG5cbiAgc2l6ZVNpZ25hbDoge3NpZ25hbDogc3RyaW5nfTtcblxuICBheGVzOiBWZ0F4aXNbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEhlYWRlclR5cGUob3JpZW50OiBBeGlzT3JpZW50KSB7XG4gIGlmIChvcmllbnQgPT09ICd0b3AnIHx8IG9yaWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgcmV0dXJuICdoZWFkZXInO1xuICB9XG4gIHJldHVybiAnZm9vdGVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRpdGxlR3JvdXAobW9kZWw6IE1vZGVsLCBjaGFubmVsOiBIZWFkZXJDaGFubmVsKSB7XG4gIGNvbnN0IHRpdGxlID0gbW9kZWwuY29tcG9uZW50LmxheW91dEhlYWRlcnNbY2hhbm5lbF0udGl0bGU7XG4gIGNvbnN0IHRleHRPcmllbnQgPSBjaGFubmVsID09PSAncm93JyA/ICd2ZXJ0aWNhbCcgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdXBkYXRlID0ge1xuICAgIGFsaWduOiB7dmFsdWU6ICdjZW50ZXInfSxcbiAgICB0ZXh0OiB7dmFsdWU6IHRpdGxlfSxcbiAgICAuLi4odGV4dE9yaWVudCA9PT0gJ3ZlcnRpY2FsJyA/IHthbmdsZToge3ZhbHVlOiAyNzB9fToge30pLFxuICAgIC8vIFRPRE8qaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yNDQ2KTogYWRkIHRpdGxlKiBwcm9wZXJ0aWVzIChlLmcuLCB0aXRsZUFsaWduKVxuICAgIC8vIGFsc28gbWFrZSBzdXJlIHRoYXQgZ3VpZGUtdGl0bGUgY29uZmlnIG92ZXJyaWRlIHRoZXNlIFZlZ2EtbGl0ZSBkZWZhdWx0XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAgbW9kZWwuZ2V0TmFtZShgJHtjaGFubmVsfV90aXRsZWApLFxuICAgIHJvbGU6IGAke2NoYW5uZWx9LXRpdGxlYCxcbiAgICB0eXBlOiAnZ3JvdXAnLFxuICAgIG1hcmtzOiBbe1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgcm9sZTogYCR7Y2hhbm5lbH0tdGl0bGUtdGV4dGAsXG4gICAgICBzdHlsZTogJ2d1aWRlLXRpdGxlJyxcbiAgICAgIC4uLihrZXlzKHVwZGF0ZSkubGVuZ3RoID4gMCA/IHtlbmNvZGU6IHt1cGRhdGV9fSA6IHt9KVxuICAgIH1dXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJHcm91cHMobW9kZWw6IE1vZGVsLCBjaGFubmVsOiBIZWFkZXJDaGFubmVsKTogVmdNYXJrR3JvdXBbXSB7XG4gIGNvbnN0IGxheW91dEhlYWRlciA9IG1vZGVsLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdO1xuICBjb25zdCBncm91cHMgPSBbXTtcbiAgZm9yIChjb25zdCBoZWFkZXJUeXBlIG9mIEhFQURFUl9UWVBFUykge1xuICAgIGlmIChsYXlvdXRIZWFkZXJbaGVhZGVyVHlwZV0pIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyQ21wdCBvZiBsYXlvdXRIZWFkZXJbaGVhZGVyVHlwZV0pIHtcbiAgICAgICAgZ3JvdXBzLnB1c2goZ2V0SGVhZGVyR3JvdXAobW9kZWwsIGNoYW5uZWwsIGhlYWRlclR5cGUsIGxheW91dEhlYWRlciwgaGVhZGVyQ21wdCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG4vLyAwLCAoMCw5MCksIDkwLCAoOTAsIDE4MCksIDE4MCwgKDE4MCwgMjcwKSwgMjcwLCAoMjcwLCAwKVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxBbGlnbihhbmdsZTogbnVtYmVyKSB7XG4gIC8vIHRvIGtlZXAgYW5nbGUgaW4gWzAsIDM2MClcbiAgYW5nbGUgPSAoKGFuZ2xlICUgMzYwKSArIDM2MCkgJSAzNjA7XG4gIGlmICgoYW5nbGUgKyA5MCkgJSAxODAgPT09IDApIHsgIC8vIGZvciA5MCBhbmQgMjcwXG4gICAgcmV0dXJuIHt9OyAvLyBkZWZhdWx0IGNlbnRlclxuICB9IGVsc2UgaWYgKGFuZ2xlIDwgOTAgfHwgMjcwIDwgYW5nbGUpIHtcbiAgICByZXR1cm4ge2FsaWduOiB7dmFsdWU6ICdyaWdodCd9fTtcbiAgfSBlbHNlIGlmICgxMzUgPD0gYW5nbGUgJiYgYW5nbGUgPCAyMjUpIHtcbiAgICByZXR1cm4ge2FsaWduOiB7dmFsdWU6ICdsZWZ0J319O1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsQmFzZWxpbmUoYW5nbGU6IG51bWJlcikge1xuICAvLyB0byBrZWVwIGFuZ2xlIGluIFswLCAzNjApXG4gIGFuZ2xlID0gKChhbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICBpZiAoNDUgPD0gYW5nbGUgJiYgYW5nbGUgPD0gMTM1KSB7XG4gICAgcmV0dXJuIHtiYXNlbGluZToge3ZhbHVlOiAndG9wJ319O1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuZnVuY3Rpb24gZ2V0SGVhZGVyR3JvdXAobW9kZWw6IE1vZGVsLCBjaGFubmVsOiBIZWFkZXJDaGFubmVsLCBoZWFkZXJUeXBlOiBIZWFkZXJUeXBlLCBsYXlvdXRIZWFkZXI6IExheW91dEhlYWRlckNvbXBvbmVudCwgaGVhZGVyQ21wdDogSGVhZGVyQ29tcG9uZW50KSB7XG4gIGlmIChoZWFkZXJDbXB0KSB7XG4gICAgbGV0IHRpdGxlID0gbnVsbDtcbiAgICBjb25zdCB7ZmFjZXRGaWVsZERlZn0gPSBsYXlvdXRIZWFkZXI7XG4gICAgaWYgKGZhY2V0RmllbGREZWYgJiYgaGVhZGVyQ21wdC5sYWJlbHMpIHtcbiAgICAgIGNvbnN0IHtoZWFkZXIgPSB7fX0gPSBmYWNldEZpZWxkRGVmO1xuICAgICAgY29uc3Qge2Zvcm1hdCwgbGFiZWxBbmdsZX0gPSBoZWFkZXI7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHtcbiAgICAgICAgLi4uKFxuICAgICAgICAgIGxhYmVsQW5nbGUgIT09IHVuZGVmaW5lZCA/IHthbmdsZToge3ZhbHVlOiBsYWJlbEFuZ2xlfX0gOiB7fVxuICAgICAgICApLFxuICAgICAgICAuLi5sYWJlbEFsaWduKGxhYmVsQW5nbGUpLFxuICAgICAgICAuLi5sYWJlbEJhc2VsaW5lKGxhYmVsQW5nbGUpXG5cbiAgICAgIH07XG5cbiAgICAgIHRpdGxlID0ge1xuICAgICAgICB0ZXh0OiBmb3JtYXRTaWduYWxSZWYoZmFjZXRGaWVsZERlZiwgZm9ybWF0LCAncGFyZW50JywgbW9kZWwuY29uZmlnKSxcbiAgICAgICAgb2Zmc2V0OiAxMCxcbiAgICAgICAgb3JpZW50OiBjaGFubmVsID09PSAncm93JyA/ICdsZWZ0JyA6ICd0b3AnLFxuICAgICAgICBzdHlsZTogJ2d1aWRlLWxhYmVsJyxcbiAgICAgICAgLi4uKGtleXModXBkYXRlKS5sZW5ndGggPiAwID8ge2VuY29kZToge3VwZGF0ZX19IDoge30pXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGF4ZXMgPSBoZWFkZXJDbXB0LmF4ZXM7XG5cbiAgICBjb25zdCBoYXNBeGVzID0gYXhlcyAmJiBheGVzLmxlbmd0aCA+IDA7XG4gICAgaWYgKHRpdGxlIHx8IGhhc0F4ZXMpIHtcbiAgICAgIGNvbnN0IHNpemVDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3JvdycgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG1vZGVsLmdldE5hbWUoYCR7Y2hhbm5lbH1fJHtoZWFkZXJUeXBlfWApLFxuICAgICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgICByb2xlOiBgJHtjaGFubmVsfS0ke2hlYWRlclR5cGV9YCxcbiAgICAgICAgLi4uKGxheW91dEhlYWRlci5mYWNldEZpZWxkRGVmID8ge1xuICAgICAgICAgIGZyb206IHtkYXRhOiBtb2RlbC5nZXROYW1lKGNoYW5uZWwgKyAnX2RvbWFpbicpfSxcbiAgICAgICAgICBzb3J0OiB7XG4gICAgICAgICAgICBmaWVsZDogdmdGaWVsZChmYWNldEZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJ30pLFxuICAgICAgICAgICAgb3JkZXI6IGZhY2V0RmllbGREZWYuc29ydCB8fCAnYXNjZW5kaW5nJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSA6IHt9KSxcbiAgICAgICAgLi4uKHRpdGxlID8ge3RpdGxlfSA6IHt9KSxcbiAgICAgICAgLi4uKGhlYWRlckNtcHQuc2l6ZVNpZ25hbCA/IHtcbiAgICAgICAgICBlbmNvZGU6IHtcbiAgICAgICAgICAgIHVwZGF0ZToge1xuICAgICAgICAgICAgICBbc2l6ZUNoYW5uZWxdOiBoZWFkZXJDbXB0LnNpemVTaWduYWxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH06IHt9KSxcbiAgICAgICAgLi4uKGhhc0F4ZXMgPyB7YXhlc30gOiB7fSlcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl19","import { hasDiscreteDomain } from '../../scale';\nimport { isVgRangeStep } from '../../vega.schema';\nimport { isFacetModel } from '../model';\nexport function assembleLayoutSignals(model) {\n return [].concat(sizeSignals(model, 'width'), sizeSignals(model, 'height'));\n}\nexport function sizeSignals(model, sizeType) {\n var channel = sizeType === 'width' ? 'x' : 'y';\n var size = model.component.layoutSize.get(sizeType);\n if (!size || size === 'merged') {\n return [];\n }\n // Read size signal name from name map, just in case it is the top-level size signal that got renamed.\n var name = model.getSizeSignalRef(sizeType).signal;\n if (size === 'range-step') {\n var scaleComponent = model.getScaleComponent(channel);\n if (scaleComponent) {\n var type = scaleComponent.get('type');\n var range = scaleComponent.get('range');\n if (hasDiscreteDomain(type) && isVgRangeStep(range)) {\n var scaleName = model.scaleName(channel);\n if (isFacetModel(model.parent)) {\n // If parent is facet and this is an independent scale, return only signal signal\n // as the width/height will be calculated using the cardinality from\n // facet's aggregate rather than reading from scale domain\n var parentResolve = model.parent.component.resolve;\n if (parentResolve.scale[channel] === 'independent') {\n return [stepSignal(scaleName, range)];\n }\n }\n return [\n stepSignal(scaleName, range),\n {\n name: name,\n update: sizeExpr(scaleName, scaleComponent, \"domain('\" + scaleName + \"').length\")\n }\n ];\n }\n }\n /* istanbul ignore next: Condition should not happen -- only for warning in development. */\n throw new Error('layout size is range step although there is no rangeStep.');\n }\n else {\n return [{\n name: name,\n value: size\n }];\n }\n}\nfunction stepSignal(scaleName, range) {\n return {\n name: scaleName + '_step',\n value: range.step,\n };\n}\nexport function sizeExpr(scaleName, scaleComponent, cardinality) {\n var type = scaleComponent.get('type');\n var padding = scaleComponent.get('padding');\n var paddingOuter = scaleComponent.get('paddingOuter');\n paddingOuter = paddingOuter !== undefined ? paddingOuter : padding;\n var paddingInner = scaleComponent.get('paddingInner');\n paddingInner = type === 'band' ?\n // only band has real paddingInner\n (paddingInner !== undefined ? paddingInner : padding) :\n // For point, as calculated in https://github.com/vega/vega-scale/blob/master/src/band.js#L128,\n // it's equivalent to have paddingInner = 1 since there is only n-1 steps between n points.\n 1;\n return \"bandspace(\" + cardinality + \", \" + paddingInner + \", \" + paddingOuter + \") * \" + scaleName + \"_step\";\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sYXlvdXRzaXplL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQUMsYUFBYSxFQUF3QixNQUFNLG1CQUFtQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQVEsTUFBTSxVQUFVLENBQUM7QUFHN0MsTUFBTSxnQ0FBZ0MsS0FBWTtJQUNoRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQ2QsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsRUFDM0IsV0FBVyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FDN0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLHNCQUFzQixLQUFZLEVBQUUsUUFBNEI7SUFDcEUsSUFBTSxPQUFPLEdBQUcsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakQsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RELElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM5QixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsc0dBQXNHO0lBQ3RHLElBQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFckQsSUFBSSxJQUFJLEtBQUssWUFBWSxFQUFFO1FBQ3pCLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV4RCxJQUFJLGNBQWMsRUFBRTtZQUNsQixJQUFNLElBQUksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLElBQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFMUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25ELElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTNDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDOUIsaUZBQWlGO29CQUNqRixvRUFBb0U7b0JBQ3BFLDBEQUEwRDtvQkFDMUQsSUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO29CQUNyRCxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssYUFBYSxFQUFFO3dCQUNsRCxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO3FCQUN2QztpQkFDRjtnQkFFRCxPQUFPO29CQUNMLFVBQVUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDO29CQUM1Qjt3QkFDRSxJQUFJLE1BQUE7d0JBQ0osTUFBTSxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLGFBQVcsU0FBUyxjQUFXLENBQUM7cUJBQzdFO2lCQUNGLENBQUM7YUFDSDtTQUNGO1FBQ0QsMkZBQTJGO1FBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztLQUM5RTtTQUFNO1FBQ0wsT0FBTyxDQUFDO2dCQUNOLElBQUksTUFBQTtnQkFDSixLQUFLLEVBQUUsSUFBSTthQUNaLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQUVELG9CQUFvQixTQUFpQixFQUFFLEtBQWtCO0lBQ3ZELE9BQU87UUFDTCxJQUFJLEVBQUUsU0FBUyxHQUFHLE9BQU87UUFDekIsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO0tBQ2xCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxtQkFBbUIsU0FBaUIsRUFBRSxjQUE4QixFQUFFLFdBQW1CO0lBQzdGLElBQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsSUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELFlBQVksR0FBRyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUVuRSxJQUFJLFlBQVksR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELFlBQVksR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDOUIsa0NBQWtDO1FBQ2xDLENBQUMsWUFBWSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELCtGQUErRjtRQUMvRiwyRkFBMkY7UUFDM0YsQ0FBQyxDQUFDO0lBQ0osT0FBTyxlQUFhLFdBQVcsVUFBSyxZQUFZLFVBQUssWUFBWSxZQUFPLFNBQVMsVUFBTyxDQUFDO0FBQzNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW59IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7aXNWZ1JhbmdlU3RlcCwgVmdSYW5nZVN0ZXAsIFZnU2lnbmFsfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzRmFjZXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7U2NhbGVDb21wb25lbnR9IGZyb20gJy4uL3NjYWxlL2NvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUxheW91dFNpZ25hbHMobW9kZWw6IE1vZGVsKTogVmdTaWduYWxbXSB7XG4gIHJldHVybiBbXS5jb25jYXQoXG4gICAgc2l6ZVNpZ25hbHMobW9kZWwsICd3aWR0aCcpLFxuICAgIHNpemVTaWduYWxzKG1vZGVsLCAnaGVpZ2h0JylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNpemVTaWduYWxzKG1vZGVsOiBNb2RlbCwgc2l6ZVR5cGU6ICd3aWR0aCcgfCAnaGVpZ2h0Jyk6IFZnU2lnbmFsW10ge1xuICBjb25zdCBjaGFubmVsID0gc2l6ZVR5cGUgPT09ICd3aWR0aCcgPyAneCcgOiAneSc7XG4gIGNvbnN0IHNpemUgPSBtb2RlbC5jb21wb25lbnQubGF5b3V0U2l6ZS5nZXQoc2l6ZVR5cGUpO1xuICBpZiAoIXNpemUgfHwgc2l6ZSA9PT0gJ21lcmdlZCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBSZWFkIHNpemUgc2lnbmFsIG5hbWUgZnJvbSBuYW1lIG1hcCwganVzdCBpbiBjYXNlIGl0IGlzIHRoZSB0b3AtbGV2ZWwgc2l6ZSBzaWduYWwgdGhhdCBnb3QgcmVuYW1lZC5cbiAgY29uc3QgbmFtZSA9IG1vZGVsLmdldFNpemVTaWduYWxSZWYoc2l6ZVR5cGUpLnNpZ25hbDtcblxuICBpZiAoc2l6ZSA9PT0gJ3JhbmdlLXN0ZXAnKSB7XG4gICAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcblxuICAgIGlmIChzY2FsZUNvbXBvbmVudCkge1xuICAgICAgY29uc3QgdHlwZSA9IHNjYWxlQ29tcG9uZW50LmdldCgndHlwZScpO1xuICAgICAgY29uc3QgcmFuZ2UgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3JhbmdlJyk7XG5cbiAgICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbih0eXBlKSAmJiBpc1ZnUmFuZ2VTdGVwKHJhbmdlKSkge1xuICAgICAgICBjb25zdCBzY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCk7XG5cbiAgICAgICAgaWYgKGlzRmFjZXRNb2RlbChtb2RlbC5wYXJlbnQpKSB7XG4gICAgICAgICAgLy8gSWYgcGFyZW50IGlzIGZhY2V0IGFuZCB0aGlzIGlzIGFuIGluZGVwZW5kZW50IHNjYWxlLCByZXR1cm4gb25seSBzaWduYWwgc2lnbmFsXG4gICAgICAgICAgLy8gYXMgdGhlIHdpZHRoL2hlaWdodCB3aWxsIGJlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGNhcmRpbmFsaXR5IGZyb21cbiAgICAgICAgICAvLyBmYWNldCdzIGFnZ3JlZ2F0ZSByYXRoZXIgdGhhbiByZWFkaW5nIGZyb20gc2NhbGUgZG9tYWluXG4gICAgICAgICAgY29uc3QgcGFyZW50UmVzb2x2ZSA9IG1vZGVsLnBhcmVudC5jb21wb25lbnQucmVzb2x2ZTtcbiAgICAgICAgICBpZiAocGFyZW50UmVzb2x2ZS5zY2FsZVtjaGFubmVsXSA9PT0gJ2luZGVwZW5kZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuIFtzdGVwU2lnbmFsKHNjYWxlTmFtZSwgcmFuZ2UpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHN0ZXBTaWduYWwoc2NhbGVOYW1lLCByYW5nZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHVwZGF0ZTogc2l6ZUV4cHIoc2NhbGVOYW1lLCBzY2FsZUNvbXBvbmVudCwgYGRvbWFpbignJHtzY2FsZU5hbWV9JykubGVuZ3RoYClcbiAgICAgICAgICB9XG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBDb25kaXRpb24gc2hvdWxkIG5vdCBoYXBwZW4gLS0gb25seSBmb3Igd2FybmluZyBpbiBkZXZlbG9wbWVudC4gKi9cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2xheW91dCBzaXplIGlzIHJhbmdlIHN0ZXAgYWx0aG91Z2ggdGhlcmUgaXMgbm8gcmFuZ2VTdGVwLicpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbe1xuICAgICAgbmFtZSxcbiAgICAgIHZhbHVlOiBzaXplXG4gICAgfV07XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RlcFNpZ25hbChzY2FsZU5hbWU6IHN0cmluZywgcmFuZ2U6IFZnUmFuZ2VTdGVwKTogVmdTaWduYWwge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IHNjYWxlTmFtZSArICdfc3RlcCcsXG4gICAgdmFsdWU6IHJhbmdlLnN0ZXAsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplRXhwcihzY2FsZU5hbWU6IHN0cmluZywgc2NhbGVDb21wb25lbnQ6IFNjYWxlQ29tcG9uZW50LCBjYXJkaW5hbGl0eTogc3RyaW5nKSB7XG4gIGNvbnN0IHR5cGUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcbiAgY29uc3QgcGFkZGluZyA9IHNjYWxlQ29tcG9uZW50LmdldCgncGFkZGluZycpO1xuICBsZXQgcGFkZGluZ091dGVyID0gc2NhbGVDb21wb25lbnQuZ2V0KCdwYWRkaW5nT3V0ZXInKTtcbiAgcGFkZGluZ091dGVyID0gcGFkZGluZ091dGVyICE9PSB1bmRlZmluZWQgPyBwYWRkaW5nT3V0ZXIgOiBwYWRkaW5nO1xuXG4gIGxldCBwYWRkaW5nSW5uZXIgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3BhZGRpbmdJbm5lcicpO1xuICBwYWRkaW5nSW5uZXIgPSB0eXBlID09PSAnYmFuZCcgP1xuICAgIC8vIG9ubHkgYmFuZCBoYXMgcmVhbCBwYWRkaW5nSW5uZXJcbiAgICAocGFkZGluZ0lubmVyICE9PSB1bmRlZmluZWQgPyBwYWRkaW5nSW5uZXIgOiBwYWRkaW5nKSA6XG4gICAgLy8gRm9yIHBvaW50LCBhcyBjYWxjdWxhdGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2Etc2NhbGUvYmxvYi9tYXN0ZXIvc3JjL2JhbmQuanMjTDEyOCxcbiAgICAvLyBpdCdzIGVxdWl2YWxlbnQgdG8gaGF2ZSBwYWRkaW5nSW5uZXIgPSAxIHNpbmNlIHRoZXJlIGlzIG9ubHkgbi0xIHN0ZXBzIGJldHdlZW4gbiBwb2ludHMuXG4gICAgMTtcbiAgcmV0dXJuIGBiYW5kc3BhY2UoJHtjYXJkaW5hbGl0eX0sICR7cGFkZGluZ0lubmVyfSwgJHtwYWRkaW5nT3V0ZXJ9KSAqICR7c2NhbGVOYW1lfV9zdGVwYDtcbn1cblxuXG4iXX0=","import { POSITION_SCALE_CHANNELS } from '../channel';\nimport * as log from '../log';\nimport { contains } from '../util';\nimport { isConcatModel, isFacetModel, isLayerModel, isRepeatModel } from './model';\nexport function defaultScaleResolve(channel, model) {\n if (isLayerModel(model) || isFacetModel(model)) {\n return 'shared';\n }\n else if (isConcatModel(model) || isRepeatModel(model)) {\n return contains(POSITION_SCALE_CHANNELS, channel) ? 'independent' : 'shared';\n }\n /* istanbul ignore next: should never reach here. */\n throw new Error('invalid model type for resolve');\n}\nexport function parseGuideResolve(resolve, channel) {\n var channelScaleResolve = resolve.scale[channel];\n var guide = contains(POSITION_SCALE_CHANNELS, channel) ? 'axis' : 'legend';\n if (channelScaleResolve === 'independent') {\n if (resolve[guide][channel] === 'shared') {\n log.warn(log.message.independentScaleMeansIndependentGuide(channel));\n }\n return 'independent';\n }\n return resolve[guide][channel] || 'shared';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb2x2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL3Jlc29sdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFlLE1BQU0sWUFBWSxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBUSxNQUFNLFNBQVMsQ0FBQztBQUV4RixNQUFNLDhCQUE4QixPQUFxQixFQUFFLEtBQVk7SUFDckUsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzlDLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO1NBQU0sSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3ZELE9BQU8sUUFBUSxDQUFDLHVCQUF1QixFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztLQUM5RTtJQUNELG9EQUFvRDtJQUNwRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sNEJBQTRCLE9BQWdCLEVBQUUsT0FBcUI7SUFDdkUsSUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFFN0UsSUFBSSxtQkFBbUIsS0FBSyxhQUFhLEVBQUU7UUFDekMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ3hDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxhQUFhLENBQUM7S0FDdEI7SUFFRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxRQUFRLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMsIFNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7UmVzb2x2ZSwgUmVzb2x2ZU1vZGV9IGZyb20gJy4uL3Jlc29sdmUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2lzQ29uY2F0TW9kZWwsIGlzRmFjZXRNb2RlbCwgaXNMYXllck1vZGVsLCBpc1JlcGVhdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U2NhbGVSZXNvbHZlKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCwgbW9kZWw6IE1vZGVsKTogUmVzb2x2ZU1vZGUge1xuICBpZiAoaXNMYXllck1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgcmV0dXJuICdzaGFyZWQnO1xuICB9IGVsc2UgaWYgKGlzQ29uY2F0TW9kZWwobW9kZWwpIHx8IGlzUmVwZWF0TW9kZWwobW9kZWwpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBjaGFubmVsKSA/ICdpbmRlcGVuZGVudCcgOiAnc2hhcmVkJztcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUuICovXG4gIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBtb2RlbCB0eXBlIGZvciByZXNvbHZlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUd1aWRlUmVzb2x2ZShyZXNvbHZlOiBSZXNvbHZlLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwpOiBSZXNvbHZlTW9kZSB7XG4gIGNvbnN0IGNoYW5uZWxTY2FsZVJlc29sdmUgPSByZXNvbHZlLnNjYWxlW2NoYW5uZWxdO1xuICBjb25zdCBndWlkZSA9IGNvbnRhaW5zKFBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLCBjaGFubmVsKSA/ICdheGlzJyA6ICdsZWdlbmQnO1xuXG4gIGlmIChjaGFubmVsU2NhbGVSZXNvbHZlID09PSAnaW5kZXBlbmRlbnQnKSB7XG4gICAgaWYgKHJlc29sdmVbZ3VpZGVdW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuaW5kZXBlbmRlbnRTY2FsZU1lYW5zSW5kZXBlbmRlbnRHdWlkZShjaGFubmVsKSk7XG4gICAgfVxuICAgIHJldHVybiAnaW5kZXBlbmRlbnQnO1xuICB9XG5cbiAgcmV0dXJuIHJlc29sdmVbZ3VpZGVdW2NoYW5uZWxdIHx8ICdzaGFyZWQnO1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport * as log from '../log';\nimport { duplicate, keys, stringify } from '../util';\n/**\n * Generic class for storing properties that are explicitly specified\n * and implicitly determined by the compiler.\n * This is important for scale/axis/legend merging as\n * we want to prioritize properties that users explicitly specified.\n */\nvar Split = /** @class */ (function () {\n function Split(explicit, implicit) {\n if (explicit === void 0) { explicit = {}; }\n if (implicit === void 0) { implicit = {}; }\n this.explicit = explicit;\n this.implicit = implicit;\n }\n Split.prototype.clone = function () {\n return new Split(duplicate(this.explicit), duplicate(this.implicit));\n };\n Split.prototype.combine = function () {\n // FIXME remove \"as any\".\n // Add \"as any\" to avoid an error \"Spread types may only be created from object types\".\n return tslib_1.__assign({}, this.explicit, this.implicit);\n };\n Split.prototype.get = function (key) {\n // Explicit has higher precedence\n return this.explicit[key] !== undefined ? this.explicit[key] : this.implicit[key];\n };\n Split.prototype.getWithExplicit = function (key) {\n // Explicit has higher precedence\n if (this.explicit[key] !== undefined) {\n return { explicit: true, value: this.explicit[key] };\n }\n else if (this.implicit[key] !== undefined) {\n return { explicit: false, value: this.implicit[key] };\n }\n return { explicit: false, value: undefined };\n };\n Split.prototype.setWithExplicit = function (key, value) {\n if (value.value !== undefined) {\n this.set(key, value.value, value.explicit);\n }\n };\n Split.prototype.set = function (key, value, explicit) {\n delete this[explicit ? 'implicit' : 'explicit'][key];\n this[explicit ? 'explicit' : 'implicit'][key] = value;\n return this;\n };\n Split.prototype.copyKeyFromSplit = function (key, s) {\n // Explicit has higher precedence\n if (s.explicit[key] !== undefined) {\n this.set(key, s.explicit[key], true);\n }\n else if (s.implicit[key] !== undefined) {\n this.set(key, s.implicit[key], false);\n }\n };\n Split.prototype.copyKeyFromObject = function (key, s) {\n // Explicit has higher precedence\n if (s[key] !== undefined) {\n this.set(key, s[key], true);\n }\n };\n /**\n * Merge split object into this split object. Properties from the other split\n * overwrite properties from this split.\n */\n Split.prototype.copyAll = function (other) {\n for (var _i = 0, _a = keys(other.combine()); _i < _a.length; _i++) {\n var key = _a[_i];\n var val = other.getWithExplicit(key);\n this.setWithExplicit(key, val);\n }\n };\n return Split;\n}());\nexport { Split };\nexport function makeExplicit(value) {\n return {\n explicit: true,\n value: value\n };\n}\nexport function makeImplicit(value) {\n return {\n explicit: false,\n value: value\n };\n}\nexport function tieBreakByComparing(compare) {\n return function (v1, v2, property, propertyOf) {\n var diff = compare(v1.value, v2.value);\n if (diff > 0) {\n return v1;\n }\n else if (diff < 0) {\n return v2;\n }\n return defaultTieBreaker(v1, v2, property, propertyOf);\n };\n}\nexport function defaultTieBreaker(v1, v2, property, propertyOf) {\n if (v1.explicit && v2.explicit) {\n log.warn(log.message.mergeConflictingProperty(property, propertyOf, v1.value, v2.value));\n }\n // If equal score, prefer v1.\n return v1;\n}\nexport function mergeValuesWithExplicit(v1, v2, property, propertyOf, tieBreaker) {\n if (tieBreaker === void 0) { tieBreaker = defaultTieBreaker; }\n if (v1 === undefined || v1.value === undefined) {\n // For first run\n return v2;\n }\n if (v1.explicit && !v2.explicit) {\n return v1;\n }\n else if (v2.explicit && !v1.explicit) {\n return v2;\n }\n else if (stringify(v1.value) === stringify(v2.value)) {\n return v1;\n }\n else {\n return tieBreaker(v1, v2, property, propertyOf);\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBR25EOzs7OztHQUtHO0FBQ0g7SUFDRSxlQUNrQixRQUF5QixFQUN6QixRQUF5QjtRQUR6Qix5QkFBQSxFQUFBLGFBQXlCO1FBQ3pCLHlCQUFBLEVBQUEsYUFBeUI7UUFEekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7SUFDeEMsQ0FBQztJQUVHLHFCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFTSx1QkFBTyxHQUFkO1FBQ0UseUJBQXlCO1FBQ3pCLHVGQUF1RjtRQUN2Riw0QkFDSyxJQUFJLENBQUMsUUFBZSxFQUNwQixJQUFJLENBQUMsUUFBZSxFQUN2QjtJQUNKLENBQUM7SUFFTSxtQkFBRyxHQUFWLFVBQThCLEdBQU07UUFDbEMsaUNBQWlDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVNLCtCQUFlLEdBQXRCLFVBQTBDLEdBQU07UUFDOUMsaUNBQWlDO1FBQ2pDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFD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LEVBQUUsQ0FBQyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ3RDLE9BQU8sRUFBRSxDQUFDO0tBQ1g7U0FBTSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0RCxPQUFPLEVBQUUsQ0FBQztLQUNYO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUNqRDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7ZHVwbGljYXRlLCBrZXlzLCBzdHJpbmdpZnl9IGZyb20gJy4uL3V0aWwnO1xuXG5cbi8qKlxuICogR2VuZXJpYyBjbGFzcyBmb3Igc3RvcmluZyBwcm9wZXJ0aWVzIHRoYXQgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkXG4gKiBhbmQgaW1wbGljaXRseSBkZXRlcm1pbmVkIGJ5IHRoZSBjb21waWxlci5cbiAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzY2FsZS9heGlzL2xlZ2VuZCBtZXJnaW5nIGFzXG4gKiB3ZSB3YW50IHRvIHByaW9yaXRpemUgcHJvcGVydGllcyB0aGF0IHVzZXJzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLlxuICovXG5leHBvcnQgY2xhc3MgU3BsaXQ8VCBleHRlbmRzIG9iamVjdD4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZXhwbGljaXQ6IFBhcnRpYWw8VD4gPSB7fSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW1wbGljaXQ6IFBhcnRpYWw8VD4gPSB7fVxuICApIHt9XG5cbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgU3BsaXQoZHVwbGljYXRlKHRoaXMuZXhwbGljaXQpLCBkdXBsaWNhdGUodGhpcy5pbXBsaWNpdCkpO1xuICB9XG5cbiAgcHVibGljIGNvbWJpbmUoKTogUGFydGlhbDxUPiB7XG4gICAgLy8gRklYTUUgcmVtb3ZlIFwiYXMgYW55XCIuXG4gICAgLy8gQWRkIFwiYXMgYW55XCIgdG8gYXZvaWQgYW4gZXJyb3IgXCJTcHJlYWQgdHlwZXMgbWF5IG9ubHkgYmUgY3JlYXRlZCBmcm9tIG9iamVjdCB0eXBlc1wiLlxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmV4cGxpY2l0IGFzIGFueSwgLy8gRXhwbGljaXQgcHJvcGVydGllcyBjb21lcyBmaXJzdFxuICAgICAgLi4udGhpcy5pbXBsaWNpdCBhcyBhbnlcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldDxLIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBLKTogVFtLXSB7XG4gICAgLy8gRXhwbGljaXQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlXG4gICAgcmV0dXJuIHRoaXMuZXhwbGljaXRba2V5XSAhPT0gdW5kZWZpbmVkID8gdGhpcy5leHBsaWNpdFtrZXldIDogdGhpcy5pbXBsaWNpdFtrZXldO1xuICB9XG5cbiAgcHVibGljIGdldFdpdGhFeHBsaWNpdDxLIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBLKTogRXhwbGljaXQ8VFtLXT4ge1xuICAgIC8vIEV4cGxpY2l0IGhhcyBoaWdoZXIgcHJlY2VkZW5jZVxuICAgIGlmICh0aGlzLmV4cGxpY2l0W2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtleHBsaWNpdDogdHJ1ZSwgdmFsdWU6IHRoaXMuZXhwbGljaXRba2V5XX07XG4gICAgfSBlbHNlIGlmICh0aGlzLmltcGxpY2l0W2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHtleHBsaWNpdDogZmFsc2UsIHZhbHVlOiB0aGlzLmltcGxpY2l0W2tleV19O1xuICAgIH1cbiAgICByZXR1cm4ge2V4cGxpY2l0OiBmYWxzZSwgdmFsdWU6IHVuZGVmaW5lZH07XG4gIH1cblxuICBwdWJsaWMgc2V0V2l0aEV4cGxpY2l0PEsgZXh0ZW5kcyBrZXlvZiBUPihrZXk6IEssIHZhbHVlOiBFeHBsaWNpdDxUW0tdPikge1xuICAgIGlmICh2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldChrZXksIHZhbHVlLnZhbHVlLCB2YWx1ZS5leHBsaWNpdCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldDxLIGV4dGVuZHMga2V5b2YgVD4oa2V5OiBLLCB2YWx1ZTogVFtLXSwgZXhwbGljaXQ6IGJvb2xlYW4pIHtcbiAgICBkZWxldGUgdGhpc1tleHBsaWNpdCA/ICdpbXBsaWNpdCcgOiAnZXhwbGljaXQnXVtrZXldO1xuICAgIHRoaXNbZXhwbGljaXQgPyAnZXhwbGljaXQnIDogJ2ltcGxpY2l0J11ba2V5XSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHVibGljIGNvcHlLZXlGcm9tU3BsaXQ8UyBleHRlbmRzIFQ+KGtleToga2V5b2YgVCwgczogU3BsaXQ8Uz4pIHtcbiAgICAvLyBFeHBsaWNpdCBoYXMgaGlnaGVyIHByZWNlZGVuY2VcbiAgICBpZiAocy5leHBsaWNpdFtrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgcy5leHBsaWNpdFtrZXldLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHMuaW1wbGljaXRba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldChrZXksIHMuaW1wbGljaXRba2V5XSwgZmFsc2UpO1xuICAgIH1cbiAgfVxuICBwdWJsaWMgY29weUtleUZyb21PYmplY3Q8UyBleHRlbmRzIFBhcnRpYWw8VD4+KGtleToga2V5b2YgVCwgczogUykge1xuICAgIC8vIEV4cGxpY2l0IGhhcyBoaWdoZXIgcHJlY2VkZW5jZVxuICAgIGlmIChzW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZXQoa2V5LCBzW2tleV0sIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBzcGxpdCBvYmplY3QgaW50byB0aGlzIHNwbGl0IG9iamVjdC4gUHJvcGVydGllcyBmcm9tIHRoZSBvdGhlciBzcGxpdFxuICAgKiBvdmVyd3JpdGUgcHJvcGVydGllcyBmcm9tIHRoaXMgc3BsaXQuXG4gICAqL1xuICBwdWJsaWMgY29weUFsbChvdGhlcjogU3BsaXQ8VD4pIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKG90aGVyLmNvbWJpbmUoKSkpIHtcbiAgICAgIGNvbnN0IHZhbCA9IG90aGVyLmdldFdpdGhFeHBsaWNpdChrZXkpO1xuICAgICAgdGhpcy5zZXRXaXRoRXhwbGljaXQoa2V5LCB2YWwpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxpY2l0PFQ+IHtcbiAgZXhwbGljaXQ6IGJvb2xlYW47XG4gIHZhbHVlOiBUO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRXhwbGljaXQ8VD4odmFsdWU6IFQpOiBFeHBsaWNpdDxUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwbGljaXQ6IHRydWUsXG4gICAgdmFsdWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VJbXBsaWNpdDxUPih2YWx1ZTogVCk6IEV4cGxpY2l0PFQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBsaWNpdDogZmFsc2UsXG4gICAgdmFsdWVcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpZUJyZWFrQnlDb21wYXJpbmc8UywgVD4oY29tcGFyZTogKHYxOiBULCB2MjogVCkgPT4gbnVtYmVyKSB7XG4gIHJldHVybiAodjE6IEV4cGxpY2l0PFQ+LCB2MjogRXhwbGljaXQ8VD4sIHByb3BlcnR5OiBrZXlvZiBTIHwgbmV2ZXIsIHByb3BlcnR5T2Y6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCk6IEV4cGxpY2l0PFQ+ID0+IHtcbiAgICBjb25zdCBkaWZmID0gY29tcGFyZSh2MS52YWx1ZSwgdjIudmFsdWUpO1xuICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgcmV0dXJuIHYxO1xuICAgIH0gZWxzZSBpZiAoZGlmZiA8IDApIHtcbiAgICAgIHJldHVybiB2MjtcbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRUaWVCcmVha2VyPFMsIFQ+KHYxLCB2MiwgcHJvcGVydHksIHByb3BlcnR5T2YpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdFRpZUJyZWFrZXI8UywgVD4odjE6IEV4cGxpY2l0PFQ+LCB2MjogRXhwbGljaXQ8VD4sIHByb3BlcnR5OiBrZXlvZiBTLCBwcm9wZXJ0eU9mOiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wpIHtcbiAgaWYgKHYxLmV4cGxpY2l0ICYmIHYyLmV4cGxpY2l0KSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UubWVyZ2VDb25mbGljdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBwcm9wZXJ0eU9mLCB2MS52YWx1ZSwgdjIudmFsdWUpKTtcbiAgfVxuICAvLyBJZiBlcXVhbCBzY29yZSwgcHJlZmVyIHYxLlxuICByZXR1cm4gdjE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxTLCBUPihcbiAgICB2MTogRXhwbGljaXQ8VD4sIHYyOiBFeHBsaWNpdDxUPixcbiAgICBwcm9wZXJ0eToga2V5b2YgUyxcbiAgICBwcm9wZXJ0eU9mOiAnc2NhbGUnIHwgJ2F4aXMnIHwgJ2xlZ2VuZCcgfCAnJyxcbiAgICB0aWVCcmVha2VyOiAodjE6IEV4cGxpY2l0PFQ+LCB2MjogRXhwbGljaXQ8VD4sIHByb3BlcnR5OiBrZXlvZiBTLCBwcm9wZXJ0eU9mOiBzdHJpbmcpID0+IEV4cGxpY2l0PFQ+ID0gZGVmYXVsdFRpZUJyZWFrZXJcbiAgKSB7XG4gIGlmICh2MSA9PT0gdW5kZWZpbmVkIHx8IHYxLnZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBGb3IgZmlyc3QgcnVuXG4gICAgcmV0dXJuIHYyO1xuICB9XG5cbiAgaWYgKHYxLmV4cGxpY2l0ICYmICF2Mi5leHBsaWNpdCkge1xuICAgIHJldHVybiB2MTtcbiAgfSBlbHNlIGlmICh2Mi5leHBsaWNpdCAmJiAhdjEuZXhwbGljaXQpIHtcbiAgICByZXR1cm4gdjI7XG4gIH0gZWxzZSBpZiAoc3RyaW5naWZ5KHYxLnZhbHVlKSA9PT0gc3RyaW5naWZ5KHYyLnZhbHVlKSkge1xuICAgIHJldHVybiB2MTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGllQnJlYWtlcih2MSwgdjIsIHByb3BlcnR5LCBwcm9wZXJ0eU9mKTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { Split } from '../split';\nvar LegendComponent = /** @class */ (function (_super) {\n tslib_1.__extends(LegendComponent, _super);\n function LegendComponent() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n return LegendComponent;\n}(Split));\nexport { LegendComponent };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUcvQjtJQUFxQywyQ0FBZTtJQUFwRDs7SUFBc0QsQ0FBQztJQUFELHNCQUFDO0FBQUQsQ0FBQyxBQUF2RCxDQUFxQyxLQUFLLEdBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xlZ2VuZH0gZnJvbSAnLi4vLi4vL2xlZ2VuZCc7XG5pbXBvcnQge05vblBvc2l0aW9uU2NhbGVDaGFubmVsfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7VmdMZWdlbmR9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7U3BsaXR9IGZyb20gJy4uL3NwbGl0JztcblxuXG5leHBvcnQgY2xhc3MgTGVnZW5kQ29tcG9uZW50IGV4dGVuZHMgU3BsaXQ8VmdMZWdlbmQ+IHt9XG5cbi8vIFVzaW5nIE1hcHBlZCBUeXBlIHRvIGRlY2xhcmUgdHlwZSAoaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXMpXG5leHBvcnQgdHlwZSBMZWdlbmRDb21wb25lbnRJbmRleCA9IHtbUCBpbiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbF0/OiBMZWdlbmRDb21wb25lbnR9O1xuXG5leHBvcnQgdHlwZSBMZWdlbmRJbmRleCA9IHtbUCBpbiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbF0/OiBMZWdlbmR9O1xuIl19","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { COLOR, OPACITY, SHAPE } from '../../channel';\nimport { hasConditionalValueDef, isTimeFieldDef, isValueDef, } from '../../fielddef';\nimport { AREA, BAR, CIRCLE, FILL_STROKE_CONFIG, GEOSHAPE, LINE, POINT, SQUARE, TEXT, TICK } from '../../mark';\nimport { ScaleType } from '../../scale';\nimport { keys } from '../../util';\nimport { applyMarkConfig, timeFormatExpression } from '../common';\nimport * as mixins from '../mark/mixins';\nexport function symbols(fieldDef, symbolsSpec, model, channel, type) {\n if (type === 'gradient') {\n return undefined;\n }\n var out = tslib_1.__assign({}, applyMarkConfig({}, model, FILL_STROKE_CONFIG), mixins.color(model));\n switch (model.mark) {\n case BAR:\n case TICK:\n case TEXT:\n out.shape = { value: 'square' };\n break;\n case CIRCLE:\n case SQUARE:\n out.shape = { value: model.mark };\n break;\n case POINT:\n case LINE:\n case GEOSHAPE:\n case AREA:\n // use default circle\n break;\n }\n var markDef = model.markDef, encoding = model.encoding;\n var filled = markDef.filled;\n if (out.fill) {\n // for fill legend, we don't want any fill in symbol\n if (channel === 'fill' || (filled && channel === COLOR)) {\n delete out.fill;\n }\n else {\n if (out.fill['field']) {\n // For others, remove fill field\n delete out.fill;\n }\n else if (isArray(out.fill)) {\n var fill = getFirstConditionValue(encoding.fill || encoding.color) || markDef.fill || (filled && markDef.color);\n if (fill) {\n out.fill = { value: fill };\n }\n }\n }\n }\n if (out.stroke) {\n if (channel === 'stroke' || (!filled && channel === COLOR)) {\n delete out.stroke;\n }\n else {\n if (out.stroke['field']) {\n // For others, remove stroke field\n delete out.stroke;\n }\n else if (isArray(out.stroke)) {\n var stroke = getFirstConditionValue(encoding.stroke || encoding.color) || markDef.stroke || (!filled && markDef.color);\n if (stroke) {\n out.stroke = { value: stroke };\n }\n }\n }\n }\n if (out.fill && out.fill['value'] !== 'transparent' && !out.stroke) {\n // for non color channel's legend, we need to override symbol stroke config from Vega config\n out.stroke = { value: 'transparent' };\n }\n if (channel !== SHAPE) {\n var shape = getFirstConditionValue(encoding.shape) || markDef.shape;\n if (shape) {\n out.shape = { value: shape };\n }\n }\n if (channel !== OPACITY) {\n var opacity = getMaxValue(encoding.opacity) || markDef.opacity;\n if (opacity) { // only apply opacity if it is neither zero or undefined\n out.opacity = { value: opacity };\n }\n }\n out = tslib_1.__assign({}, out, symbolsSpec);\n return keys(out).length > 0 ? out : undefined;\n}\nexport function gradient(fieldDef, gradientSpec, model, channel, type) {\n var out = {};\n if (type === 'gradient') {\n var opacity = getMaxValue(model.encoding.opacity) || model.markDef.opacity;\n if (opacity) { // only apply opacity if it is neither zero or undefined\n out.opacity = { value: opacity };\n }\n }\n out = tslib_1.__assign({}, out, gradientSpec);\n return keys(out).length > 0 ? out : undefined;\n}\nexport function labels(fieldDef, labelsSpec, model, channel, type) {\n var legend = model.legend(channel);\n var config = model.config;\n var out = {};\n if (isTimeFieldDef(fieldDef)) {\n var isUTCScale = model.getScaleComponent(channel).get('type') === ScaleType.UTC;\n var expr = timeFormatExpression('datum.value', fieldDef.timeUnit, legend.format, config.legend.shortTimeLabels, config.timeFormat, isUTCScale);\n labelsSpec = tslib_1.__assign({}, (expr ? { text: { signal: expr } } : {}), labelsSpec);\n }\n out = tslib_1.__assign({}, out, labelsSpec);\n return keys(out).length > 0 ? out : undefined;\n}\nfunction getMaxValue(channelDef) {\n return getConditionValue(channelDef, function (v, conditionalDef) { return Math.max(v, conditionalDef.value); });\n}\nfunction getFirstConditionValue(channelDef) {\n return getConditionValue(channelDef, function (v, conditionalDef) { return v !== undefined ? v : conditionalDef.value; });\n}\nfunction getConditionValue(channelDef, reducer) {\n if (hasConditionalValueDef(channelDef)) {\n return (isArray(channelDef.condition) ? channelDef.condition : [channelDef.condition])\n .reduce(reducer, channelDef.value);\n }\n else if (isValueDef(channelDef)) {\n return channelDef.value;\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbGVnZW5kL2VuY29kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxPQUFPLEVBQVUsS0FBSyxFQUEyQixPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RGLE9BQU8sRUFJTCxzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLFVBQVUsR0FJWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM1RyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoRSxPQUFPLEtBQUssTUFBTSxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE1BQU0sa0JBQWtCLFFBQTBCLEVBQUUsV0FBZ0IsRUFBRSxLQUFnQixFQUFFLE9BQWdCLEVBQUUsSUFBZ0I7SUFDeEgsSUFBSSxJQUFJLEtBQUssVUFBVSxFQUFFO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsSUFBSSxHQUFHLHdCQUNGLGVBQWUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEVBQzlDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQ3ZCLENBQUM7SUFFRixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDbEIsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLElB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LE9BQU8saUJBQWlCLENBQUMsVUFBVSxFQUNqQyxVQUFDLENBQVMsRUFBRSxjQUFjLElBQUssT0FBQSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQTFDLENBQTBDLENBQzFFLENBQUM7QUFDSixDQUFDO0FBRUQsMkJBQ0UsVUFBNkcsRUFDN0csT0FBNkQ7SUFHN0QsSUFBSSxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbkYsTUFBTSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBWSxDQUFDLENBQUM7S0FDN0M7U0FBTSxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUNqQyxPQUFPLFVBQVUsQ0FBQyxLQUFZLENBQUM7S0FDaEM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuXG5pbXBvcnQge0NoYW5uZWwsIENPTE9SLCBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCwgT1BBQ0lUWSwgU0hBUEV9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtcbiAgQ29uZGl0aW9uYWwsXG4gIEZpZWxkRGVmLFxuICBGaWVsZERlZldpdGhDb25kaXRpb24sXG4gIGhhc0NvbmRpdGlvbmFsVmFsdWVEZWYsXG4gIGlzVGltZUZpZWxkRGVmLFxuICBpc1ZhbHVlRGVmLFxuICBNYXJrUHJvcEZpZWxkRGVmLFxuICBWYWx1ZURlZixcbiAgVmFsdWVEZWZXaXRoQ29uZGl0aW9uLFxufSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0FSRUEsIEJBUiwgQ0lSQ0xFLCBGSUxMX1NUUk9LRV9DT05GSUcsIEdFT1NIQVBFLCBMSU5FLCBQT0lOVCwgU1FVQVJFLCBURVhULCBUSUNLfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtMZWdlbmRUeXBlLCBWZ0VuY29kZUVudHJ5fSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2FwcGx5TWFya0NvbmZpZywgdGltZUZvcm1hdEV4cHJlc3Npb259IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi4vbWFyay9taXhpbnMnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3ltYm9scyhmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc3ltYm9sc1NwZWM6IGFueSwgbW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogQ2hhbm5lbCwgdHlwZTogTGVnZW5kVHlwZSk6IFZnRW5jb2RlRW50cnkge1xuICBpZiAodHlwZSA9PT0gJ2dyYWRpZW50Jykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBsZXQgb3V0ID0ge1xuICAgIC4uLmFwcGx5TWFya0NvbmZpZyh7fSwgbW9kZWwsIEZJTExfU1RST0tFX0NPTkZJRyksXG4gICAgLi4ubWl4aW5zLmNvbG9yKG1vZGVsKVxuICB9O1xuXG4gIHN3aXRjaCAobW9kZWwubWFyaykge1xuICAgIGNhc2UgQkFSOlxuICAgIGNhc2UgVElDSzpcbiAgICBjYXNlIFRFWFQ6XG4gICAgICBvdXQuc2hhcGUgPSB7dmFsdWU6ICdzcXVhcmUnfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ0lSQ0xFOlxuICAgIGNhc2UgU1FVQVJFOlxuICAgICAgb3V0LnNoYXBlID0ge3ZhbHVlOiBtb2RlbC5tYXJrfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgUE9JTlQ6XG4gICAgY2FzZSBMSU5FOlxuICAgIGNhc2UgR0VPU0hBUEU6XG4gICAgY2FzZSBBUkVBOlxuICAgICAgLy8gdXNlIGRlZmF1bHQgY2lyY2xlXG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IHttYXJrRGVmLCBlbmNvZGluZ30gPSBtb2RlbDtcbiAgY29uc3QgZmlsbGVkID0gbWFya0RlZi5maWxsZWQ7XG5cbiAgaWYgKG91dC5maWxsKSB7XG4gICAgLy8gZm9yIGZpbGwgbGVnZW5kLCB3ZSBkb24ndCB3YW50IGFueSBmaWxsIGluIHN5bWJvbFxuICAgIGlmIChjaGFubmVsID09PSAnZmlsbCcgfHwgKGZpbGxlZCAmJiBjaGFubmVsID09PSBDT0xPUikpIHtcbiAgICAgIGRlbGV0ZSBvdXQuZmlsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG91dC5maWxsWydmaWVsZCddKSB7XG4gICAgICAgIC8vIEZvciBvdGhlcnMsIHJlbW92ZSBmaWxsIGZpZWxkXG4gICAgICAgIGRlbGV0ZSBvdXQuZmlsbDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvdXQuZmlsbCkpIHtcbiAgICAgICAgY29uc3QgZmlsbCA9IGdldEZpcnN0Q29uZGl0aW9uVmFsdWUoZW5jb2RpbmcuZmlsbCB8fCBlbmNvZGluZy5jb2xvcikgfHwgbWFya0RlZi5maWxsIHx8IChmaWxsZWQgJiYgbWFya0RlZi5jb2xvcik7XG4gICAgICAgIGlmIChmaWxsKSB7XG4gICAgICAgICAgb3V0LmZpbGwgPSB7dmFsdWU6IGZpbGx9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dC5zdHJva2UpIHtcbiAgICBpZiAoY2hhbm5lbCA9PT0gJ3N0cm9rZScgfHwgKCFmaWxsZWQgJiYgY2hhbm5lbCA9PT0gQ09MT1IpKSB7XG4gICAgICBkZWxldGUgb3V0LnN0cm9rZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG91dC5zdHJva2VbJ2ZpZWxkJ10pIHtcbiAgICAgICAgLy8gRm9yIG90aGVycywgcmVtb3ZlIHN0cm9rZSBmaWVsZFxuICAgICAgICBkZWxldGUgb3V0LnN0cm9rZTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShvdXQuc3Ryb2tlKSkge1xuICAgICAgICBjb25zdCBzdHJva2UgPSBnZXRGaXJzdENvbmRpdGlvblZhbHVlKGVuY29kaW5nLnN0cm9rZSB8fCBlbmNvZGluZy5jb2xvcikgfHwgbWFya0RlZi5zdHJva2UgfHwgKCFmaWxsZWQgJiYgbWFya0RlZi5jb2xvcik7XG4gICAgICAgIGlmIChzdHJva2UpIHtcbiAgICAgICAgICBvdXQuc3Ryb2tlID0ge3ZhbHVlOiBzdHJva2V9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKG91dC5maWxsICYmIG91dC5maWxsWyd2YWx1ZSddICE9PSAndHJhbnNwYXJlbnQnICYmICFvdXQuc3Ryb2tlKSB7XG4gICAgLy8gZm9yIG5vbiBjb2xvciBjaGFubmVsJ3MgbGVnZW5kLCB3ZSBuZWVkIHRvIG92ZXJyaWRlIHN5bWJvbCBzdHJva2UgY29uZmlnIGZyb20gVmVnYSBjb25maWdcbiAgICBvdXQuc3Ryb2tlID0ge3ZhbHVlOiAndHJhbnNwYXJlbnQnfTtcbiAgfVxuXG4gIGlmIChjaGFubmVsICE9PSBTSEFQRSkge1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0Rmlyc3RDb25kaXRpb25WYWx1ZShlbmNvZGluZy5zaGFwZSkgfHwgbWFya0RlZi5zaGFwZTtcbiAgICBpZiAoc2hhcGUpIHtcbiAgICAgIG91dC5zaGFwZSA9IHt2YWx1ZTogc2hhcGV9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChjaGFubmVsICE9PSBPUEFDSVRZKSB7XG4gICAgY29uc3Qgb3BhY2l0eSA9IGdldE1heFZhbHVlKGVuY29kaW5nLm9wYWNpdHkpIHx8IG1hcmtEZWYub3BhY2l0eTtcbiAgICBpZiAob3BhY2l0eSkgeyAvLyBvbmx5IGFwcGx5IG9wYWNpdHkgaWYgaXQgaXMgbmVpdGhlciB6ZXJvIG9yIHVuZGVmaW5lZFxuICAgICAgb3V0Lm9wYWNpdHkgPSB7dmFsdWU6IG9wYWNpdHl9O1xuICAgIH1cbiAgfVxuXG4gIG91dCA9IHsuLi5vdXQsIC4uLnN5bWJvbHNTcGVjfTtcblxuICByZXR1cm4ga2V5cyhvdXQpLmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmFkaWVudChmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgZ3JhZGllbnRTcGVjOiBhbnksIG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IENoYW5uZWwsIHR5cGU6IExlZ2VuZFR5cGUpIHtcbiAgbGV0IG91dDogYW55ID0ge307XG5cbiAgaWYgKHR5cGUgPT09ICdncmFkaWVudCcpIHtcbiAgICBjb25zdCBvcGFjaXR5ID0gZ2V0TWF4VmFsdWUobW9kZWwuZW5jb2Rpbmcub3BhY2l0eSkgfHwgbW9kZWwubWFya0RlZi5vcGFjaXR5O1xuICAgIGlmIChvcGFjaXR5KSB7IC8vIG9ubHkgYXBwbHkgb3BhY2l0eSBpZiBpdCBpcyBuZWl0aGVyIHplcm8gb3IgdW5kZWZpbmVkXG4gICAgICBvdXQub3BhY2l0eSA9IHt2YWx1ZTogb3BhY2l0eX07XG4gICAgfVxuICB9XG5cbiAgb3V0ID0gey4uLm91dCwgLi4uZ3JhZGllbnRTcGVjfTtcbiAgcmV0dXJuIGtleXMob3V0KS5sZW5ndGggPiAwID8gb3V0IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxzKGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBsYWJlbHNTcGVjOiBhbnksIG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsLCB0eXBlOiBMZWdlbmRUeXBlKSB7XG4gIGNvbnN0IGxlZ2VuZCA9IG1vZGVsLmxlZ2VuZChjaGFubmVsKTtcbiAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnO1xuXG4gIGxldCBvdXQ6IGFueSA9IHt9O1xuXG4gIGlmIChpc1RpbWVGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICBjb25zdCBpc1VUQ1NjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJykgPT09IFNjYWxlVHlwZS5VVEM7XG4gICAgY29uc3QgZXhwciA9IHRpbWVGb3JtYXRFeHByZXNzaW9uKCdkYXR1bS52YWx1ZScsIGZpZWxkRGVmLnRpbWVVbml0LCBsZWdlbmQuZm9ybWF0LCBjb25maWcubGVnZW5kLnNob3J0VGltZUxhYmVscywgY29uZmlnLnRpbWVGb3JtYXQsIGlzVVRDU2NhbGUpO1xuICAgIGxhYmVsc1NwZWMgPSB7XG4gICAgICAuLi4oZXhwciA/IHt0ZXh0OiB7c2lnbmFsOiBleHByfX0gOiB7fSksXG4gICAgICAuLi5sYWJlbHNTcGVjLFxuICAgIH07XG4gIH1cblxuICBvdXQgPSB7Li4ub3V0LCAuLi5sYWJlbHNTcGVjfTtcblxuICByZXR1cm4ga2V5cyhvdXQpLmxlbmd0aCA+IDAgPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldE1heFZhbHVlKGNoYW5uZWxEZWY6IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8c3RyaW5nPj4pIHtcbiAgcmV0dXJuIGdldENvbmRpdGlvblZhbHVlKGNoYW5uZWxEZWYsXG4gICAgKHY6IG51bWJlciwgY29uZGl0aW9uYWxEZWYpID0+IE1hdGgubWF4KHYsIGNvbmRpdGlvbmFsRGVmLnZhbHVlIGFzIGFueSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Rmlyc3RDb25kaXRpb25WYWx1ZShjaGFubmVsRGVmOiBGaWVsZERlZldpdGhDb25kaXRpb248TWFya1Byb3BGaWVsZERlZjxzdHJpbmc+PiB8IFZhbHVlRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+KSB7XG4gIHJldHVybiBnZXRDb25kaXRpb25WYWx1ZShjaGFubmVsRGVmLFxuICAgICh2OiBudW1iZXIsIGNvbmRpdGlvbmFsRGVmKSA9PiB2ICE9PSB1bmRlZmluZWQgPyB2IDogY29uZGl0aW9uYWxEZWYudmFsdWVcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q29uZGl0aW9uVmFsdWU8VD4oXG4gIGNoYW5uZWxEZWY6IEZpZWxkRGVmV2l0aENvbmRpdGlvbjxNYXJrUHJvcEZpZWxkRGVmPHN0cmluZz4+IHwgVmFsdWVEZWZXaXRoQ29uZGl0aW9uPE1hcmtQcm9wRmllbGREZWY8c3RyaW5nPj4sXG4gIHJlZHVjZXI6ICh2YWw6IFQsIGNvbmRpdGlvbmFsRGVmOiBDb25kaXRpb25hbDxWYWx1ZURlZj4pID0+IFRcbik6IFQge1xuXG4gIGlmIChoYXNDb25kaXRpb25hbFZhbHVlRGVmKGNoYW5uZWxEZWYpKSB7XG4gICAgcmV0dXJuIChpc0FycmF5KGNoYW5uZWxEZWYuY29uZGl0aW9uKSA/IGNoYW5uZWxEZWYuY29uZGl0aW9uIDogW2NoYW5uZWxEZWYuY29uZGl0aW9uXSlcbiAgICAgIC5yZWR1Y2UocmVkdWNlciwgY2hhbm5lbERlZi52YWx1ZSBhcyBhbnkpO1xuICB9IGVsc2UgaWYgKGlzVmFsdWVEZWYoY2hhbm5lbERlZikpIHtcbiAgICByZXR1cm4gY2hhbm5lbERlZi52YWx1ZSBhcyBhbnk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==","import { isColorChannel } from '../../channel';\nimport { dateTimeExpr, isDateTime } from '../../datetime';\nimport { isBinScale } from '../../scale';\nimport { contains } from '../../util';\nexport function values(legend) {\n var vals = legend.values;\n if (vals && isDateTime(vals[0])) {\n return vals.map(function (dt) {\n // normalize = true as end user won't put 0 = January\n return { signal: dateTimeExpr(dt, true) };\n });\n }\n return vals;\n}\nexport function type(t, channel, scaleType) {\n if (isColorChannel(channel) && ((t === 'quantitative' && !isBinScale(scaleType)) ||\n (t === 'temporal' && contains(['time', 'utc'], scaleType)))) {\n return 'gradient';\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2xlZ2VuZC9wcm9wZXJ0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFXLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUMsVUFBVSxFQUFZLE1BQU0sYUFBYSxDQUFDO0FBRWxELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxpQkFBaUIsTUFBYztJQUNuQyxJQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMvQixPQUFRLElBQW1CLENBQUMsR0FBRyxDQUFDLFVBQUMsRUFBRTtZQUNqQyxxREFBcUQ7WUFDckQsT0FBTyxFQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sZUFBZSxDQUFPLEVBQUUsT0FBZ0IsRUFBRSxTQUFvQjtJQUNsRSxJQUNJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUN6QixDQUFDLENBQUMsS0FBSyxjQUFjLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUN0RSxFQUNEO1FBQ0YsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFubmVsLCBpc0NvbG9yQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4uLy4uL2RhdGV0aW1lJztcbmltcG9ydCB7TGVnZW5kfSBmcm9tICcuLi8uLi9sZWdlbmQnO1xuaW1wb3J0IHtpc0JpblNjYWxlLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zfSBmcm9tICcuLi8uLi91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHZhbHVlcyhsZWdlbmQ6IExlZ2VuZCkge1xuICBjb25zdCB2YWxzID0gbGVnZW5kLnZhbHVlcztcbiAgaWYgKHZhbHMgJiYgaXNEYXRlVGltZSh2YWxzWzBdKSkge1xuICAgIHJldHVybiAodmFscyBhcyBEYXRlVGltZVtdKS5tYXAoKGR0KSA9PiB7XG4gICAgICAvLyBub3JtYWxpemUgPSB0cnVlIGFzIGVuZCB1c2VyIHdvbid0IHB1dCAwID0gSmFudWFyeVxuICAgICAgcmV0dXJuIHtzaWduYWw6IGRhdGVUaW1lRXhwcihkdCwgdHJ1ZSl9O1xuICAgIH0pO1xuICB9XG4gIHJldHVybiB2YWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdHlwZSh0OiBUeXBlLCBjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSk6ICdncmFkaWVudCcge1xuICBpZiAoXG4gICAgICBpc0NvbG9yQ2hhbm5lbChjaGFubmVsKSAmJiAoXG4gICAgICAgICh0ID09PSAncXVhbnRpdGF0aXZlJyAmJiAhaXNCaW5TY2FsZShzY2FsZVR5cGUpKSB8fFxuICAgICAgICAodCA9PT0gJ3RlbXBvcmFsJyAmJiBjb250YWluczxTY2FsZVR5cGU+KFsndGltZScsICd1dGMnXSwgc2NhbGVUeXBlKSlcbiAgICAgIClcbiAgICApIHtcbiAgICByZXR1cm4gJ2dyYWRpZW50JztcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19","import { COLOR, FILL, OPACITY, SHAPE, SIZE, STROKE } from '../../channel';\nimport { isFieldDef, title as fieldDefTitle } from '../../fielddef';\nimport { LEGEND_PROPERTIES, VG_LEGEND_PROPERTIES } from '../../legend';\nimport { GEOJSON } from '../../type';\nimport { deleteNestedProperty, keys } from '../../util';\nimport { getSpecifiedOrDefaultValue, guideEncodeEntry, mergeTitleComponent, numberFormat } from '../common';\nimport { isUnitModel } from '../model';\nimport { parseGuideResolve } from '../resolve';\nimport { defaultTieBreaker, makeImplicit, mergeValuesWithExplicit } from '../split';\nimport { LegendComponent } from './component';\nimport * as encode from './encode';\nimport * as properties from './properties';\nexport function parseLegend(model) {\n if (isUnitModel(model)) {\n model.component.legends = parseUnitLegend(model);\n }\n else {\n model.component.legends = parseNonUnitLegend(model);\n }\n}\nfunction parseUnitLegend(model) {\n var encoding = model.encoding;\n return [COLOR, FILL, STROKE, SIZE, SHAPE, OPACITY].reduce(function (legendComponent, channel) {\n var def = encoding[channel];\n if (model.legend(channel) && model.getScaleComponent(channel) && !(isFieldDef(def) && (channel === SHAPE && def.type === GEOJSON))) {\n legendComponent[channel] = parseLegendForChannel(model, channel);\n }\n return legendComponent;\n }, {});\n}\nfunction getLegendDefWithScale(model, channel) {\n var _a;\n // For binned field with continuous scale, use a special scale so we can overrride the mark props and labels\n switch (channel) {\n case COLOR:\n var scale = model.scaleName(COLOR);\n return model.markDef.filled ? { fill: scale } : { stroke: scale };\n case FILL:\n case STROKE:\n case SIZE:\n case SHAPE:\n case OPACITY:\n return _a = {}, _a[channel] = model.scaleName(channel), _a;\n }\n}\nexport function parseLegendForChannel(model, channel) {\n var fieldDef = model.fieldDef(channel);\n var legend = model.legend(channel);\n var legendCmpt = new LegendComponent({}, getLegendDefWithScale(model, channel));\n LEGEND_PROPERTIES.forEach(function (property) {\n var value = getProperty(property, legend, channel, model);\n if (value !== undefined) {\n var explicit = \n // specified legend.values is already respected, but may get transformed.\n property === 'values' ? !!legend.values :\n // title can be explicit if fieldDef.title is set\n property === 'title' && value === model.fieldDef(channel).title ? true :\n // Otherwise, things are explicit if the returned value matches the specified property\n value === legend[property];\n if (explicit || model.config.legend[property] === undefined) {\n legendCmpt.set(property, value, explicit);\n }\n }\n });\n // 2) Add mark property definition groups\n var legendEncoding = legend.encoding || {};\n var legendEncode = ['labels', 'legend', 'title', 'symbols', 'gradient'].reduce(function (e, part) {\n var legendEncodingPart = guideEncodeEntry(legendEncoding[part] || {}, model);\n var value = encode[part] ?\n // TODO: replace legendCmpt with type is sufficient\n encode[part](fieldDef, legendEncodingPart, model, channel, legendCmpt.get('type')) : // apply rule\n legendEncodingPart; // no rule -- just default values\n if (value !== undefined && keys(value).length > 0) {\n e[part] = { update: value };\n }\n return e;\n }, {});\n if (keys(legendEncode).length > 0) {\n legendCmpt.set('encode', legendEncode, !!legend.encoding);\n }\n return legendCmpt;\n}\nfunction getProperty(property, specifiedLegend, channel, model) {\n var fieldDef = model.fieldDef(channel);\n switch (property) {\n case 'format':\n // We don't include temporal field here as we apply format in encode block\n return numberFormat(fieldDef, specifiedLegend.format, model.config);\n case 'title':\n // For falsy value, keep undefined so we use default,\n // but use null for '', null, and false to hide the title\n var specifiedTitle = fieldDef.title !== undefined ? fieldDef.title :\n specifiedLegend.title || (specifiedLegend.title === undefined ? undefined : null);\n return getSpecifiedOrDefaultValue(specifiedTitle, fieldDefTitle(fieldDef, model.config)) || undefined; // make falsy value undefined so output Vega spec is shorter\n case 'values':\n return properties.values(specifiedLegend);\n case 'type':\n return getSpecifiedOrDefaultValue(specifiedLegend.type, properties.type(fieldDef.type, channel, model.getScaleComponent(channel).get('type')));\n }\n // Otherwise, return specified property.\n return specifiedLegend[property];\n}\nfunction parseNonUnitLegend(model) {\n var _a = model.component, legends = _a.legends, resolve = _a.resolve;\n var _loop_1 = function (child) {\n parseLegend(child);\n keys(child.component.legends).forEach(function (channel) {\n resolve.legend[channel] = parseGuideResolve(model.component.resolve, channel);\n if (resolve.legend[channel] === 'shared') {\n // If the resolve says shared (and has not been overridden)\n // We will try to merge and see if there is a conflict\n legends[channel] = mergeLegendComponent(legends[channel], child.component.legends[channel]);\n if (!legends[channel]) {\n // If merge returns nothing, there is a conflict so we cannot make the legend shared.\n // Thus, mark legend as independent and remove the legend component.\n resolve.legend[channel] = 'independent';\n delete legends[channel];\n }\n }\n });\n };\n for (var _i = 0, _b = model.children; _i < _b.length; _i++) {\n var child = _b[_i];\n _loop_1(child);\n }\n keys(legends).forEach(function (channel) {\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n if (!child.component.legends[channel]) {\n // skip if the child does not have a particular legend\n continue;\n }\n if (resolve.legend[channel] === 'shared') {\n // After merging shared legend, make sure to remove legend from child\n delete child.component.legends[channel];\n }\n }\n });\n return legends;\n}\nexport function mergeLegendComponent(mergedLegend, childLegend) {\n if (!mergedLegend) {\n return childLegend.clone();\n }\n var mergedOrient = mergedLegend.getWithExplicit('orient');\n var childOrient = childLegend.getWithExplicit('orient');\n if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) {\n // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.)\n // Cannot merge due to inconsistent orient\n return undefined;\n }\n var typeMerged = false;\n var _loop_2 = function (prop) {\n var mergedValueWithExplicit = mergeValuesWithExplicit(mergedLegend.getWithExplicit(prop), childLegend.getWithExplicit(prop), prop, 'legend', \n // Tie breaker function\n function (v1, v2) {\n switch (prop) {\n case 'title':\n return mergeTitleComponent(v1, v2);\n case 'type':\n // There are only two types. If we have different types, then prefer symbol over gradient.\n typeMerged = true;\n return makeImplicit('symbol');\n }\n return defaultTieBreaker(v1, v2, prop, 'legend');\n });\n mergedLegend.setWithExplicit(prop, mergedValueWithExplicit);\n };\n // Otherwise, let's merge\n for (var _i = 0, VG_LEGEND_PROPERTIES_1 = VG_LEGEND_PROPERTIES; _i < VG_LEGEND_PROPERTIES_1.length; _i++) {\n var prop = VG_LEGEND_PROPERTIES_1[_i];\n _loop_2(prop);\n }\n if (typeMerged) {\n if (((mergedLegend.implicit || {}).encode || {}).gradient) {\n deleteNestedProperty(mergedLegend.implicit, ['encode', 'gradient']);\n }\n if (((mergedLegend.explicit || {}).encode || {}).gradient) {\n deleteNestedProperty(mergedLegend.explicit, ['encode', 'gradient']);\n }\n }\n return mergedLegend;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sZWdlbmQvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQTJCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUMsVUFBVSxFQUFFLEtBQUssSUFBSSxhQUFhLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQVMsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXRELE9BQU8sRUFBQywwQkFBMEIsRUFBRSxnQkFBZ0IsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUcsT0FBTyxFQUFDLFdBQVcsRUFBUSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFZLFlBQVksRUFBRSx1QkFBdUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU1RixPQUFPLEVBQUMsZUFBZSxFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUczQyxNQUFNLHNCQUFzQixLQUFZO0lBQ3RDLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNsRDtTQUFNO1FB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RUFBRSxDQUFDLENBQUM7Z0JBQ3JDLEtBQUssTUFBTTtvQkFDVCwwRkFBMEY7b0JBQzFGLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ2xCLE9BQU8sWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pDO1lBQ0QsT0FBTyxpQkFBaUIsQ0FBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUNGLENBQUM7UUFDRixZQUFZLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFyQkQseUJBQXlCO0lBQ3pCLEtBQW1CLFVBQW9CLEVBQXBCLDZDQUFvQixFQUFwQixrQ0FBb0IsRUFBcEIsSUFBb0I7UUFBbEMsSUFBTSxJQUFJLDZCQUFBO2dCQUFKLElBQUk7S0FvQmQ7SUFDRCxJQUFJLFVBQVUsRUFBRTtRQUNkLElBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUN4RCxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7U0FDckU7UUFDRCxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDekQsb0JBQW9CLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3JFO0tBQ0Y7SUFHRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDT0xPUiwgRklMTCwgTm9uUG9zaXRpb25TY2FsZUNoYW5uZWwsIE9QQUNJVFksIFNIQVBFLCBTSVpFLCBTVFJPS0V9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtpc0ZpZWxkRGVmLCB0aXRsZSBhcyBmaWVsZERlZlRpdGxlfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0xlZ2VuZCwgTEVHRU5EX1BST1BFUlRJRVMsIFZHX0xFR0VORF9QUk9QRVJUSUVTfSBmcm9tICcuLi8uLi9sZWdlbmQnO1xuaW1wb3J0IHtHRU9KU09OfSBmcm9tICcuLi8uLi90eXBlJztcbmltcG9ydCB7ZGVsZXRlTmVzdGVkUHJvcGVydHksIGtleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0xlZ2VuZCwgVmdMZWdlbmRFbmNvZGV9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7Z2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWUsIGd1aWRlRW5jb2RlRW50cnksIG1lcmdlVGl0bGVDb21wb25lbnQsIG51bWJlckZvcm1hdH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7aXNVbml0TW9kZWwsIE1vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3BhcnNlR3VpZGVSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7ZGVmYXVsdFRpZUJyZWFrZXIsIEV4cGxpY2l0LCBtYWtlSW1wbGljaXQsIG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0fSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0xlZ2VuZENvbXBvbmVudCwgTGVnZW5kQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCAqIGFzIGVuY29kZSBmcm9tICcuL2VuY29kZSc7XG5pbXBvcnQgKiBhcyBwcm9wZXJ0aWVzIGZyb20gJy4vcHJvcGVydGllcyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTGVnZW5kKG1vZGVsOiBNb2RlbCkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgbW9kZWwuY29tcG9uZW50LmxlZ2VuZHMgPSBwYXJzZVVuaXRMZWdlbmQobW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIG1vZGVsLmNvbXBvbmVudC5sZWdlbmRzID0gcGFyc2VOb25Vbml0TGVnZW5kKG1vZGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRMZWdlbmQobW9kZWw6IFVuaXRNb2RlbCk6IExlZ2VuZENvbXBvbmVudEluZGV4IHtcbiAgY29uc3Qge2VuY29kaW5nfSA9IG1vZGVsO1xuICByZXR1cm4gW0NPTE9SLCBGSUxMLCBTVFJPS0UsIFNJWkUsIFNIQVBFLCBPUEFDSVRZXS5yZWR1Y2UoZnVuY3Rpb24gKGxlZ2VuZENvbXBvbmVudCwgY2hhbm5lbCkge1xuICAgIGNvbnN0IGRlZiA9IGVuY29kaW5nW2NoYW5uZWxdO1xuICAgIGlmIChtb2RlbC5sZWdlbmQoY2hhbm5lbCkgJiYgbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkgJiYgIShpc0ZpZWxkRGVmKGRlZikgJiYgKGNoYW5uZWwgPT09IFNIQVBFICYmIGRlZi50eXBlID09PSBHRU9KU09OKSkpIHtcbiAgICAgIGxlZ2VuZENvbXBvbmVudFtjaGFubmVsXSA9IHBhcnNlTGVnZW5kRm9yQ2hhbm5lbChtb2RlbCwgY2hhbm5lbCk7XG4gICAgfVxuICAgIHJldHVybiBsZWdlbmRDb21wb25lbnQ7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TGVnZW5kRGVmV2l0aFNjYWxlKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsKTogVmdMZWdlbmQge1xuICAvLyBGb3IgYmlubmVkIGZpZWxkIHdpdGggY29udGludW91cyBzY2FsZSwgdXNlIGEgc3BlY2lhbCBzY2FsZSBzbyB3ZSBjYW4gb3ZlcnJyaWRlIHRoZSBtYXJrIHByb3BzIGFuZCBsYWJlbHNcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSBDT0xPUjpcbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuc2NhbGVOYW1lKENPTE9SKTtcbiAgICAgIHJldHVybiBtb2RlbC5tYXJrRGVmLmZpbGxlZCA/IHtmaWxsOiBzY2FsZX0gOiB7c3Ryb2tlOiBzY2FsZX07XG4gICAgY2FzZSBGSUxMOlxuICAgIGNhc2UgU1RST0tFOlxuICAgIGNhc2UgU0laRTpcbiAgICBjYXNlIFNIQVBFOlxuICAgIGNhc2UgT1BBQ0lUWTpcbiAgICAgIHJldHVybiB7W2NoYW5uZWxdOiBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCl9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxlZ2VuZEZvckNoYW5uZWwobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogTm9uUG9zaXRpb25TY2FsZUNoYW5uZWwpOiBMZWdlbmRDb21wb25lbnQge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICBjb25zdCBsZWdlbmQgPSBtb2RlbC5sZWdlbmQoY2hhbm5lbCk7XG5cbiAgY29uc3QgbGVnZW5kQ21wdCA9IG5ldyBMZWdlbmRDb21wb25lbnQoe30sIGdldExlZ2VuZERlZldpdGhTY2FsZShtb2RlbCwgY2hhbm5lbCkpO1xuXG4gIExFR0VORF9QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5LCBsZWdlbmQsIGNoYW5uZWwsIG1vZGVsKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgZXhwbGljaXQgPVxuICAgICAgICAvLyBzcGVjaWZpZWQgbGVnZW5kLnZhbHVlcyBpcyBhbHJlYWR5IHJlc3BlY3RlZCwgYnV0IG1heSBnZXQgdHJhbnNmb3JtZWQuXG4gICAgICAgIHByb3BlcnR5ID09PSAndmFsdWVzJyA/ICEhbGVnZW5kLnZhbHVlcyA6XG4gICAgICAgIC8vIHRpdGxlIGNhbiBiZSBleHBsaWNpdCBpZiBmaWVsZERlZi50aXRsZSBpcyBzZXRcbiAgICAgICAgcHJvcGVydHkgPT09ICd0aXRsZScgJiYgdmFsdWUgPT09IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpLnRpdGxlID8gdHJ1ZSA6XG4gICAgICAgIC8vIE90aGVyd2lzZSwgdGhpbmdzIGFyZSBleHBsaWNpdCBpZiB0aGUgcmV0dXJuZWQgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHByb3BlcnR5XG4gICAgICAgIHZhbHVlID09PSBsZWdlbmRbcHJvcGVydHldO1xuICAgICAgaWYgKGV4cGxpY2l0IHx8IG1vZGVsLmNvbmZpZy5sZWdlbmRbcHJvcGVydHldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVnZW5kQ21wdC5zZXQocHJvcGVydHksIHZhbHVlLCBleHBsaWNpdCk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyAyKSBBZGQgbWFyayBwcm9wZXJ0eSBkZWZpbml0aW9uIGdyb3Vwc1xuICBjb25zdCBsZWdlbmRFbmNvZGluZyA9IGxlZ2VuZC5lbmNvZGluZyB8fCB7fTtcbiAgY29uc3QgbGVnZW5kRW5jb2RlID0gWydsYWJlbHMnLCAnbGVnZW5kJywgJ3RpdGxlJywgJ3N5bWJvbHMnLCAnZ3JhZGllbnQnXS5yZWR1Y2UoKGU6IFZnTGVnZW5kRW5jb2RlLCBwYXJ0KSA9PiB7XG4gICAgY29uc3QgbGVnZW5kRW5jb2RpbmdQYXJ0ID0gZ3VpZGVFbmNvZGVFbnRyeShsZWdlbmRFbmNvZGluZ1twYXJ0XSB8fCB7fSwgbW9kZWwpO1xuICAgIGNvbnN0IHZhbHVlID0gZW5jb2RlW3BhcnRdID9cbiAgICAgIC8vIFRPRE86IHJlcGxhY2UgbGVnZW5kQ21wdCB3aXRoIHR5cGUgaXMgc3VmZmljaWVudFxuICAgICAgZW5jb2RlW3BhcnRdKGZpZWxkRGVmLCBsZWdlbmRFbmNvZGluZ1BhcnQsIG1vZGVsLCBjaGFubmVsLCBsZWdlbmRDbXB0LmdldCgndHlwZScpKSA6IC8vIGFwcGx5IHJ1bGVcbiAgICAgIGxlZ2VuZEVuY29kaW5nUGFydDsgLy8gbm8gcnVsZSAtLSBqdXN0IGRlZmF1bHQgdmFsdWVzXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZVtwYXJ0XSA9IHt1cGRhdGU6IHZhbHVlfTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH0sIHt9IGFzIFZnTGVnZW5kRW5jb2RlKTtcblxuICBpZiAoa2V5cyhsZWdlbmRFbmNvZGUpLmxlbmd0aCA+IDApIHtcbiAgICBsZWdlbmRDbXB0LnNldCgnZW5jb2RlJywgbGVnZW5kRW5jb2RlLCAhIWxlZ2VuZC5lbmNvZGluZyk7XG4gIH1cblxuICByZXR1cm4gbGVnZW5kQ21wdDtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvcGVydHkocHJvcGVydHk6IGtleW9mIChMZWdlbmQgfCBWZ0xlZ2VuZCksIHNwZWNpZmllZExlZ2VuZDogTGVnZW5kLCBjaGFubmVsOiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCwgbW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuXG4gIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICdmb3JtYXQnOlxuICAgICAgLy8gV2UgZG9uJ3QgaW5jbHVkZSB0ZW1wb3JhbCBmaWVsZCBoZXJlIGFzIHdlIGFwcGx5IGZvcm1hdCBpbiBlbmNvZGUgYmxvY2tcbiAgICAgIHJldHVybiBudW1iZXJGb3JtYXQoZmllbGREZWYsIHNwZWNpZmllZExlZ2VuZC5mb3JtYXQsIG1vZGVsLmNvbmZpZyk7XG4gICAgY2FzZSAndGl0bGUnOlxuICAgICAgLy8gRm9yIGZhbHN5IHZhbHVlLCBrZWVwIHVuZGVmaW5lZCBzbyB3ZSB1c2UgZGVmYXVsdCxcbiAgICAgIC8vIGJ1dCB1c2UgbnVsbCBmb3IgJycsIG51bGwsIGFuZCBmYWxzZSB0byBoaWRlIHRoZSB0aXRsZVxuICAgICAgY29uc3Qgc3BlY2lmaWVkVGl0bGUgPSBmaWVsZERlZi50aXRsZSAhPT0gdW5kZWZpbmVkID8gZmllbGREZWYudGl0bGUgOlxuICAgICAgICBzcGVjaWZpZWRMZWdlbmQudGl0bGUgfHwgKHNwZWNpZmllZExlZ2VuZC50aXRsZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbnVsbCk7XG5cbiAgICAgIHJldHVybiBnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZShcbiAgICAgICAgc3BlY2lmaWVkVGl0bGUsXG4gICAgICAgIGZpZWxkRGVmVGl0bGUoZmllbGREZWYsIG1vZGVsLmNvbmZpZylcbiAgICAgICkgfHwgdW5kZWZpbmVkOyAvLyBtYWtlIGZhbHN5IHZhbHVlIHVuZGVmaW5lZCBzbyBvdXRwdXQgVmVnYSBzcGVjIGlzIHNob3J0ZXJcbiAgICBjYXNlICd2YWx1ZXMnOlxuICAgICAgcmV0dXJuIHByb3BlcnRpZXMudmFsdWVzKHNwZWNpZmllZExlZ2VuZCk7XG4gICAgY2FzZSAndHlwZSc6XG4gICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWUoc3BlY2lmaWVkTGVnZW5kLnR5cGUsIHByb3BlcnRpZXMudHlwZShmaWVsZERlZi50eXBlLCBjaGFubmVsLCBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKSkpO1xuICB9XG5cbiAgLy8gT3RoZXJ3aXNlLCByZXR1cm4gc3BlY2lmaWVkIHByb3BlcnR5LlxuICByZXR1cm4gc3BlY2lmaWVkTGVnZW5kW3Byb3BlcnR5XTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0TGVnZW5kKG1vZGVsOiBNb2RlbCkge1xuICBjb25zdCB7bGVnZW5kcywgcmVzb2x2ZX0gPSBtb2RlbC5jb21wb25lbnQ7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIHBhcnNlTGVnZW5kKGNoaWxkKTtcblxuICAgIGtleXMoY2hpbGQuY29tcG9uZW50LmxlZ2VuZHMpLmZvckVhY2goKGNoYW5uZWw6IE5vblBvc2l0aW9uU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgICByZXNvbHZlLmxlZ2VuZFtjaGFubmVsXSA9IHBhcnNlR3VpZGVSZXNvbHZlKG1vZGVsLmNvbXBvbmVudC5yZXNvbHZlLCBjaGFubmVsKTtcblxuICAgICAgaWYgKHJlc29sdmUubGVnZW5kW2NoYW5uZWxdID09PSAnc2hhcmVkJykge1xuICAgICAgICAvLyBJZiB0aGUgcmVzb2x2ZSBzYXlzIHNoYXJlZCAoYW5kIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuKVxuICAgICAgICAvLyBXZSB3aWxsIHRyeSB0byBtZXJnZSBhbmQgc2VlIGlmIHRoZXJlIGlzIGEgY29uZmxpY3RcblxuICAgICAgICBsZWdlbmRzW2NoYW5uZWxdID0gbWVyZ2VMZWdlbmRDb21wb25lbnQobGVnZW5kc1tjaGFubmVsXSwgY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF0pO1xuXG4gICAgICAgIGlmICghbGVnZW5kc1tjaGFubmVsXSkge1xuICAgICAgICAgIC8vIElmIG1lcmdlIHJldHVybnMgbm90aGluZywgdGhlcmUgaXMgYSBjb25mbGljdCBzbyB3ZSBjYW5ub3QgbWFrZSB0aGUgbGVnZW5kIHNoYXJlZC5cbiAgICAgICAgICAvLyBUaHVzLCBtYXJrIGxlZ2VuZCBhcyBpbmRlcGVuZGVudCBhbmQgcmVtb3ZlIHRoZSBsZWdlbmQgY29tcG9uZW50LlxuICAgICAgICAgIHJlc29sdmUubGVnZW5kW2NoYW5uZWxdID0gJ2luZGVwZW5kZW50JztcbiAgICAgICAgICBkZWxldGUgbGVnZW5kc1tjaGFubmVsXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAga2V5cyhsZWdlbmRzKS5mb3JFYWNoKChjaGFubmVsOiBOb25Qb3NpdGlvblNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF0pIHtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgY2hpbGQgZG9lcyBub3QgaGF2ZSBhIHBhcnRpY3VsYXIgbGVnZW5kXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzb2x2ZS5sZWdlbmRbY2hhbm5lbF0gPT09ICdzaGFyZWQnKSB7XG4gICAgICAgIC8vIEFmdGVyIG1lcmdpbmcgc2hhcmVkIGxlZ2VuZCwgbWFrZSBzdXJlIHRvIHJlbW92ZSBsZWdlbmQgZnJvbSBjaGlsZFxuICAgICAgICBkZWxldGUgY2hpbGQuY29tcG9uZW50LmxlZ2VuZHNbY2hhbm5lbF07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxlZ2VuZHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxlZ2VuZENvbXBvbmVudChtZXJnZWRMZWdlbmQ6IExlZ2VuZENvbXBvbmVudCwgY2hpbGRMZWdlbmQ6IExlZ2VuZENvbXBvbmVudCk6IExlZ2VuZENvbXBvbmVudCB7XG4gIGlmICghbWVyZ2VkTGVnZW5kKSB7XG4gICAgcmV0dXJuIGNoaWxkTGVnZW5kLmNsb25lKCk7XG4gIH1cbiAgY29uc3QgbWVyZ2VkT3JpZW50ID0gbWVyZ2VkTGVnZW5kLmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG4gIGNvbnN0IGNoaWxkT3JpZW50ID0gY2hpbGRMZWdlbmQuZ2V0V2l0aEV4cGxpY2l0KCdvcmllbnQnKTtcblxuXG4gIGlmIChtZXJnZWRPcmllbnQuZXhwbGljaXQgJiYgY2hpbGRPcmllbnQuZXhwbGljaXQgJiYgbWVyZ2VkT3JpZW50LnZhbHVlICE9PSBjaGlsZE9yaWVudC52YWx1ZSkge1xuICAgIC8vIFRPRE86IHRocm93IHdhcm5pbmcgaWYgcmVzb2x2ZSBpcyBleHBsaWNpdCAoV2UgZG9uJ3QgaGF2ZSBpbmZvIGFib3V0IGV4cGxpY2l0L2ltcGxpY2l0IHJlc29sdmUgeWV0LilcbiAgICAvLyBDYW5ub3QgbWVyZ2UgZHVlIHRvIGluY29uc2lzdGVudCBvcmllbnRcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCB0eXBlTWVyZ2VkID0gZmFsc2U7XG4gIC8vIE90aGVyd2lzZSwgbGV0J3MgbWVyZ2VcbiAgZm9yIChjb25zdCBwcm9wIG9mIFZHX0xFR0VORF9QUk9QRVJUSUVTKSB7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQgPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ0xlZ2VuZCwgYW55PihcbiAgICAgIG1lcmdlZExlZ2VuZC5nZXRXaXRoRXhwbGljaXQocHJvcCksXG4gICAgICBjaGlsZExlZ2VuZC5nZXRXaXRoRXhwbGljaXQocHJvcCksXG4gICAgICBwcm9wLCAnbGVnZW5kJyxcblxuICAgICAgLy8gVGllIGJyZWFrZXIgZnVuY3Rpb25cbiAgICAgICh2MTogRXhwbGljaXQ8YW55PiwgdjI6IEV4cGxpY2l0PGFueT4pOiBhbnkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VUaXRsZUNvbXBvbmVudCh2MSwgdjIpO1xuICAgICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgdHdvIHR5cGVzLiBJZiB3ZSBoYXZlIGRpZmZlcmVudCB0eXBlcywgdGhlbiBwcmVmZXIgc3ltYm9sIG92ZXIgZ3JhZGllbnQuXG4gICAgICAgICAgICB0eXBlTWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSW1wbGljaXQoJ3N5bWJvbCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZhdWx0VGllQnJlYWtlcjxWZ0xlZ2VuZCwgYW55Pih2MSwgdjIsIHByb3AsICdsZWdlbmQnKTtcbiAgICAgIH1cbiAgICApO1xuICAgIG1lcmdlZExlZ2VuZC5zZXRXaXRoRXhwbGljaXQocHJvcCwgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQpO1xuICB9XG4gIGlmICh0eXBlTWVyZ2VkKSB7XG4gICAgaWYoKChtZXJnZWRMZWdlbmQuaW1wbGljaXQgfHwge30pLmVuY29kZSB8fCB7fSkuZ3JhZGllbnQpIHtcbiAgICAgIGRlbGV0ZU5lc3RlZFByb3BlcnR5KG1lcmdlZExlZ2VuZC5pbXBsaWNpdCwgWydlbmNvZGUnLCAnZ3JhZGllbnQnXSk7XG4gICAgfVxuICAgIGlmICgoKG1lcmdlZExlZ2VuZC5leHBsaWNpdCB8fCB7fSkuZW5jb2RlIHx8IHt9KS5ncmFkaWVudCkge1xuICAgICAgZGVsZXRlTmVzdGVkUHJvcGVydHkobWVyZ2VkTGVnZW5kLmV4cGxpY2l0LCBbJ2VuY29kZScsICdncmFkaWVudCddKTtcbiAgICB9XG4gIH1cblxuXG4gIHJldHVybiBtZXJnZWRMZWdlbmQ7XG59XG5cbiJdfQ==","import { flatten, keys, stringify, vals } from '../../util';\nimport { mergeLegendComponent } from './parse';\nexport function assembleLegends(model) {\n var legendComponentIndex = model.component.legends;\n var legendByDomain = {};\n for (var _i = 0, _a = keys(legendComponentIndex); _i < _a.length; _i++) {\n var channel = _a[_i];\n var scaleComponent = model.getScaleComponent(channel);\n var domainHash = stringify(scaleComponent.domains);\n if (legendByDomain[domainHash]) {\n for (var _b = 0, _c = legendByDomain[domainHash]; _b < _c.length; _b++) {\n var mergedLegendComponent = _c[_b];\n var merged = mergeLegendComponent(mergedLegendComponent, legendComponentIndex[channel]);\n if (!merged) {\n // If cannot merge, need to add this legend separately\n legendByDomain[domainHash].push(legendComponentIndex[channel]);\n }\n }\n }\n else {\n legendByDomain[domainHash] = [legendComponentIndex[channel].clone()];\n }\n }\n return flatten(vals(legendByDomain)).map(function (legendCmpt) { return legendCmpt.combine(); });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sZWdlbmQvYXNzZW1ibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUkxRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFN0MsTUFBTSwwQkFBMEIsS0FBWTtJQUMxQyxJQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO0lBQ3JELElBQU0sY0FBYyxHQUE4QyxFQUFFLENBQUM7SUFFckUsS0FBc0IsVUFBMEIsRUFBMUIsS0FBQSxJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBMUIsY0FBMEIsRUFBMUIsSUFBMEIsRUFBRTtRQUE3QyxJQUFNLE9BQU8sU0FBQTtRQUNoQixJQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM5QixLQUFvQyxVQUEwQixFQUExQixLQUFBLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBMUIsY0FBMEIsRUFBMUIsSUFBMEIsRUFBRTtnQkFBM0QsSUFBTSxxQkFBcUIsU0FBQTtnQkFDOUIsSUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMscUJBQXFCLEVBQUUsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRTtvQkFDWCxzREFBc0Q7b0JBQ3RELGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztpQkFDaEU7YUFDRjtTQUVGO2FBQU07WUFDTCxjQUFjLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3RFO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxVQUEyQixJQUFLLE9BQUEsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFwQixDQUFvQixDQUFDLENBQUM7QUFDbEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZmxhdHRlbiwga2V5cywgc3RyaW5naWZ5LCB2YWxzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdMZWdlbmR9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7TGVnZW5kQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge21lcmdlTGVnZW5kQ29tcG9uZW50fSBmcm9tICcuL3BhcnNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlTGVnZW5kcyhtb2RlbDogTW9kZWwpOiBWZ0xlZ2VuZFtdIHtcbiAgY29uc3QgbGVnZW5kQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQubGVnZW5kcztcbiAgY29uc3QgbGVnZW5kQnlEb21haW46IHtbZG9tYWluSGFzaDogc3RyaW5nXTogTGVnZW5kQ29tcG9uZW50W119ID0ge307XG5cbiAgZm9yIChjb25zdCBjaGFubmVsIG9mIGtleXMobGVnZW5kQ29tcG9uZW50SW5kZXgpKSB7XG4gICAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgICBjb25zdCBkb21haW5IYXNoID0gc3RyaW5naWZ5KHNjYWxlQ29tcG9uZW50LmRvbWFpbnMpO1xuICAgIGlmIChsZWdlbmRCeURvbWFpbltkb21haW5IYXNoXSkge1xuICAgICAgZm9yIChjb25zdCBtZXJnZWRMZWdlbmRDb21wb25lbnQgb2YgbGVnZW5kQnlEb21haW5bZG9tYWluSGFzaF0pIHtcbiAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VMZWdlbmRDb21wb25lbnQobWVyZ2VkTGVnZW5kQ29tcG9uZW50LCBsZWdlbmRDb21wb25lbnRJbmRleFtjaGFubmVsXSk7XG4gICAgICAgIGlmICghbWVyZ2VkKSB7XG4gICAgICAgICAgLy8gSWYgY2Fubm90IG1lcmdlLCBuZWVkIHRvIGFkZCB0aGlzIGxlZ2VuZCBzZXBhcmF0ZWx5XG4gICAgICAgICAgbGVnZW5kQnlEb21haW5bZG9tYWluSGFzaF0ucHVzaChsZWdlbmRDb21wb25lbnRJbmRleFtjaGFubmVsXSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBsZWdlbmRCeURvbWFpbltkb21haW5IYXNoXSA9IFtsZWdlbmRDb21wb25lbnRJbmRleFtjaGFubmVsXS5jbG9uZSgpXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmxhdHRlbih2YWxzKGxlZ2VuZEJ5RG9tYWluKSkubWFwKChsZWdlbmRDbXB0OiBMZWdlbmRDb21wb25lbnQpID0+IGxlZ2VuZENtcHQuY29tYmluZSgpKTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { contains } from '../../util';\nimport { isVgSignalRef } from '../../vega.schema';\nimport { isConcatModel, isLayerModel, isRepeatModel } from '../model';\nexport function assembleProjections(model) {\n if (isLayerModel(model) || isConcatModel(model) || isRepeatModel(model)) {\n return assembleProjectionsForModelAndChildren(model);\n }\n else {\n return assembleProjectionForModel(model);\n }\n}\nexport function assembleProjectionsForModelAndChildren(model) {\n return model.children.reduce(function (projections, child) {\n return projections.concat(child.assembleProjections());\n }, assembleProjectionForModel(model));\n}\nexport function assembleProjectionForModel(model) {\n var component = model.component.projection;\n if (!component || component.merged) {\n return [];\n }\n var projection = component.combine();\n var name = projection.name, rest = tslib_1.__rest(projection, [\"name\"]); // we need to extract name so that it is always present in the output and pass TS type validation\n var size = {\n signal: \"[\" + component.size.map(function (ref) { return ref.signal; }).join(', ') + \"]\"\n };\n var fit = component.data.reduce(function (sources, data) {\n var source = isVgSignalRef(data) ? data.signal : \"data('\" + model.lookupDataSource(data) + \"')\";\n if (!contains(sources, source)) {\n // build a unique list of sources\n sources.push(source);\n }\n return sources;\n }, []);\n if (fit.length <= 0) {\n throw new Error(\"Projection's fit didn't find any data sources\");\n }\n return [tslib_1.__assign({ name: name,\n size: size, fit: {\n signal: fit.length > 1 ? \"[\" + fit.join(', ') + \"]\" : fit[0]\n } }, rest)];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9wcm9qZWN0aW9uL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxhQUFhLEVBQTRCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0UsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFRLE1BQU0sVUFBVSxDQUFDO0FBRTNFLE1BQU0sOEJBQThCLEtBQVk7SUFDOUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2RSxPQUFPLHNDQUFzQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3REO1NBQU07UUFDTCxPQUFPLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzFDO0FBQ0gsQ0FBQztBQUVELE1BQU0saURBQWlELEtBQVk7SUFDakUsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLFdBQVcsRUFBRSxLQUFLO1FBQzlDLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLHFDQUFxQyxLQUFZO0lBQ3JELElBQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBQzdDLElBQUksQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtRQUNsQyxPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsSUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2hDLElBQUEsc0JBQUksRUFBRSwyQ0FBTyxDQUFlLENBQUUsaUdBQWlHO0lBRXRJLElBQU0sSUFBSSxHQUFnQjtRQUN4QixNQUFNLEVBQUUsTUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxNQUFNLEVBQVYsQ0FBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFHO0tBQ2xFLENBQUM7SUFFRixJQUFNLEdBQUcsR0FBYSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFDLE9BQU8sRUFBRSxJQUFJO1FBQ3hELElBQU0sTUFBTSxHQUFXLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBUyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQUksQ0FBQztRQUNyRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTtZQUM5QixpQ0FBaUM7WUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsT0FBTyxvQkFDTCxJQUFJLE1BQUE7WUFDSixJQUFJLE1BQUEsRUFDSixHQUFHLEVBQUU7Z0JBQ0gsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN4RCxJQUNFLElBQUksRUFDUCxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y29udGFpbnN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtpc1ZnU2lnbmFsUmVmLCBWZ1Byb2plY3Rpb24sIFZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzQ29uY2F0TW9kZWwsIGlzTGF5ZXJNb2RlbCwgaXNSZXBlYXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlUHJvamVjdGlvbnMobW9kZWw6IE1vZGVsKTogVmdQcm9qZWN0aW9uW10ge1xuICBpZiAoaXNMYXllck1vZGVsKG1vZGVsKSB8fCBpc0NvbmNhdE1vZGVsKG1vZGVsKSB8fCBpc1JlcGVhdE1vZGVsKG1vZGVsKSkge1xuICAgIHJldHVybiBhc3NlbWJsZVByb2plY3Rpb25zRm9yTW9kZWxBbmRDaGlsZHJlbihtb2RlbCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlUHJvamVjdGlvbkZvck1vZGVsKG1vZGVsKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVQcm9qZWN0aW9uc0Zvck1vZGVsQW5kQ2hpbGRyZW4obW9kZWw6IE1vZGVsKTogVmdQcm9qZWN0aW9uW10ge1xuICByZXR1cm4gbW9kZWwuY2hpbGRyZW4ucmVkdWNlKChwcm9qZWN0aW9ucywgY2hpbGQpID0+IHtcbiAgICByZXR1cm4gcHJvamVjdGlvbnMuY29uY2F0KGNoaWxkLmFzc2VtYmxlUHJvamVjdGlvbnMoKSk7XG4gIH0sIGFzc2VtYmxlUHJvamVjdGlvbkZvck1vZGVsKG1vZGVsKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVByb2plY3Rpb25Gb3JNb2RlbChtb2RlbDogTW9kZWwpOiBWZ1Byb2plY3Rpb25bXSB7XG4gIGNvbnN0IGNvbXBvbmVudCA9IG1vZGVsLmNvbXBvbmVudC5wcm9qZWN0aW9uO1xuICBpZiAoIWNvbXBvbmVudCB8fCBjb21wb25lbnQubWVyZ2VkKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgcHJvamVjdGlvbiA9IGNvbXBvbmVudC5jb21iaW5lKCk7XG4gIGNvbnN0IHtuYW1lLCAuLi5yZXN0fSA9IHByb2plY3Rpb247ICAvLyB3ZSBuZWVkIHRvIGV4dHJhY3QgbmFtZSBzbyB0aGF0IGl0IGlzIGFsd2F5cyBwcmVzZW50IGluIHRoZSBvdXRwdXQgYW5kIHBhc3MgVFMgdHlwZSB2YWxpZGF0aW9uXG5cbiAgY29uc3Qgc2l6ZTogVmdTaWduYWxSZWYgPSB7XG4gICAgc2lnbmFsOiBgWyR7Y29tcG9uZW50LnNpemUubWFwKChyZWYpID0+IHJlZi5zaWduYWwpLmpvaW4oJywgJyl9XWBcbiAgfTtcblxuICBjb25zdCBmaXQ6IHN0cmluZ1tdID0gY29tcG9uZW50LmRhdGEucmVkdWNlKChzb3VyY2VzLCBkYXRhKSA9PiB7XG4gICAgY29uc3Qgc291cmNlOiBzdHJpbmcgPSBpc1ZnU2lnbmFsUmVmKGRhdGEpID8gZGF0YS5zaWduYWwgOiBgZGF0YSgnJHttb2RlbC5sb29rdXBEYXRhU291cmNlKGRhdGEpfScpYDtcbiAgICBpZiAoIWNvbnRhaW5zKHNvdXJjZXMsIHNvdXJjZSkpIHtcbiAgICAgIC8vIGJ1aWxkIGEgdW5pcXVlIGxpc3Qgb2Ygc291cmNlc1xuICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XG4gICAgfVxuICAgIHJldHVybiBzb3VyY2VzO1xuICB9LCBbXSk7XG5cbiAgaWYgKGZpdC5sZW5ndGggPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlByb2plY3Rpb24ncyBmaXQgZGlkbid0IGZpbmQgYW55IGRhdGEgc291cmNlc1wiKTtcbiAgfVxuXG4gIHJldHVybiBbe1xuICAgIG5hbWUsXG4gICAgc2l6ZSxcbiAgICBmaXQ6IHtcbiAgICAgIHNpZ25hbDogZml0Lmxlbmd0aCA+IDEgPyBgWyR7Zml0LmpvaW4oJywgJyl9XWAgOiBmaXRbMF1cbiAgICB9LFxuICAgIC4uLnJlc3RcbiAgfV07XG59XG4iXX0=","export var PROJECTION_PROPERTIES = [\n 'type',\n 'clipAngle',\n 'clipExtent',\n 'center',\n 'rotate',\n 'precision',\n 'coefficient',\n 'distance',\n 'fraction',\n 'lobes',\n 'parallel',\n 'radius',\n 'ratio',\n 'spacing',\n 'tilt'\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQTJEQSxNQUFNLENBQUMsSUFBTSxxQkFBcUIsR0FBeUI7SUFDekQsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsYUFBYTtJQUNiLFVBQVU7SUFDVixVQUFVO0lBQ1YsT0FBTztJQUNQLFVBQVU7SUFDVixRQUFRO0lBQ1IsT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0NBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHtWZ1Byb2plY3Rpb25UeXBlfSBmcm9tICcuL3ZlZ2Euc2NoZW1hJztcblxuZXhwb3J0IHR5cGUgUHJvamVjdGlvblR5cGUgPSBWZ1Byb2plY3Rpb25UeXBlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3Rpb24ge1xuICAvKipcbiAgICogVGhlIGNhcnRvZ3JhcGhpYyBwcm9qZWN0aW9uIHRvIHVzZS4gVGhpcyB2YWx1ZSBpcyBjYXNlLWluc2Vuc2l0aXZlLCBmb3IgZXhhbXBsZSBgXCJhbGJlcnNcImAgYW5kIGBcIkFsYmVyc1wiYCBpbmRpY2F0ZSB0aGUgc2FtZSBwcm9qZWN0aW9uIHR5cGUuIFlvdSBjYW4gZmluZCBhbGwgdmFsaWQgcHJvamVjdGlvbiB0eXBlcyBbaW4gdGhlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvcHJvamVjdGlvbi5odG1sI3Byb2plY3Rpb24tdHlwZXMpLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYG1lcmNhdG9yYFxuICAgKi9cbiAgdHlwZT86IFByb2plY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwcm9qZWN0aW9u4oCZcyBjbGlwcGluZyBjaXJjbGUgcmFkaXVzIHRvIHRoZSBzcGVjaWZpZWQgYW5nbGUgaW4gZGVncmVlcy4gSWYgYG51bGxgLCBzd2l0Y2hlcyB0byBbYW50aW1lcmlkaWFuXShodHRwOi8vYmwub2Nrcy5vcmcvbWJvc3RvY2svMzc4ODk5OSkgY3V0dGluZyByYXRoZXIgdGhhbiBzbWFsbC1jaXJjbGUgY2xpcHBpbmcuXG4gICAqL1xuICBjbGlwQW5nbGU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHZpZXdwb3J0IGNsaXAgZXh0ZW50IHRvIHRoZSBzcGVjaWZpZWQgYm91bmRzIGluIHBpeGVscy4gVGhlIGV4dGVudCBib3VuZHMgYXJlIHNwZWNpZmllZCBhcyBhbiBhcnJheSBgW1t4MCwgeTBdLCBbeDEsIHkxXV1gLCB3aGVyZSBgeDBgIGlzIHRoZSBsZWZ0LXNpZGUgb2YgdGhlIHZpZXdwb3J0LCBgeTBgIGlzIHRoZSB0b3AsIGB4MWAgaXMgdGhlIHJpZ2h0IGFuZCBgeTFgIGlzIHRoZSBib3R0b20uIElmIGBudWxsYCwgbm8gdmlld3BvcnQgY2xpcHBpbmcgaXMgcGVyZm9ybWVkLlxuICAgKi9cbiAgY2xpcEV4dGVudD86IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIGNlbnRlciB0byB0aGUgc3BlY2lmaWVkIGNlbnRlciwgYSB0d28tZWxlbWVudCBhcnJheSBvZiBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIGluIGRlZ3JlZXMuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgWzAsIDBdYFxuICAgKi9cbiAgY2VudGVyPzogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHByb2plY3Rpb27igJlzIHRocmVlLWF4aXMgcm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBhbmdsZXMsIHdoaWNoIG11c3QgYmUgYSB0d28tIG9yIHRocmVlLWVsZW1lbnQgYXJyYXkgb2YgbnVtYmVycyBbYGxhbWJkYWAsIGBwaGlgLCBgZ2FtbWFgXSBzcGVjaWZ5aW5nIHRoZSByb3RhdGlvbiBhbmdsZXMgaW4gZGVncmVlcyBhYm91dCBlYWNoIHNwaGVyaWNhbCBheGlzLiAoVGhlc2UgY29ycmVzcG9uZCB0byB5YXcsIHBpdGNoIGFuZCByb2xsLilcbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBbMCwgMCwgMF1gXG4gICAqL1xuICByb3RhdGU/OiBudW1iZXJbXTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgdGhyZXNob2xkIGZvciB0aGUgcHJvamVjdGlvbuKAmXMgW2FkYXB0aXZlIHJlc2FtcGxpbmddKGh0dHA6Ly9ibC5vY2tzLm9yZy9tYm9zdG9jay8zNzk1NTQ0KSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGluIHBpeGVscy4gVGhpcyB2YWx1ZSBjb3JyZXNwb25kcyB0byB0aGUgW0RvdWdsYXPigJNQZXVja2VyIGRpc3RhbmNlXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JhbWVyJUUyJTgwJTkzRG91Z2xhcyVFMiU4MCU5M1BldWNrZXJfYWxnb3JpdGhtKS4gSWYgcHJlY2lzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIHByb2plY3Rpb27igJlzIGN1cnJlbnQgcmVzYW1wbGluZyBwcmVjaXNpb24gd2hpY2ggZGVmYXVsdHMgdG8gYOKImjAuNSDiiYUgMC43MDcxMOKApmAuXG4gICAqL1xuICBwcmVjaXNpb24/OiBTdHJpbmc7XG5cbiAgLyogVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBhbGwgc3VwcG9ydGVkIGZvciBzcGVjaWZpYyB0eXBlcyBvZiBwcm9qZWN0aW9ucy4gQ29uc3VsdCB0aGUgZDMtZ2VvLXByb2plY3Rpb24gbGlicmFyeSBmb3IgbW9yZSBpbmZvcm1hdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLWdlby1wcm9qZWN0aW9uICovXG4gIGNvZWZmaWNpZW50PzogbnVtYmVyO1xuICBkaXN0YW5jZT86IG51bWJlcjtcbiAgZnJhY3Rpb24/OiBudW1iZXI7XG4gIGxvYmVzPzogbnVtYmVyO1xuICBwYXJhbGxlbD86IG51bWJlcjtcbiAgcmFkaXVzPzogbnVtYmVyO1xuICByYXRpbz86IG51bWJlcjtcbiAgc3BhY2luZz86IG51bWJlcjtcbiAgdGlsdD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBbnkgcHJvcGVydHkgb2YgUHJvamVjdGlvbiBjYW4gYmUgaW4gY29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdGlvbkNvbmZpZyBleHRlbmRzIFByb2plY3Rpb24geyB9XG5cbmV4cG9ydCBjb25zdCBQUk9KRUNUSU9OX1BST1BFUlRJRVM6IChrZXlvZiBQcm9qZWN0aW9uKVtdID0gW1xuICAndHlwZScsXG4gICdjbGlwQW5nbGUnLFxuICAnY2xpcEV4dGVudCcsXG4gICdjZW50ZXInLFxuICAncm90YXRlJyxcbiAgJ3ByZWNpc2lvbicsXG4gICdjb2VmZmljaWVudCcsXG4gICdkaXN0YW5jZScsXG4gICdmcmFjdGlvbicsXG4gICdsb2JlcycsXG4gICdwYXJhbGxlbCcsXG4gICdyYWRpdXMnLFxuICAncmF0aW8nLFxuICAnc3BhY2luZycsXG4gICd0aWx0J1xuXTtcbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { Split } from '../split';\nvar ProjectionComponent = /** @class */ (function (_super) {\n tslib_1.__extends(ProjectionComponent, _super);\n function ProjectionComponent(name, specifiedProjection, size, data) {\n var _this = _super.call(this, tslib_1.__assign({}, specifiedProjection), // all explicit properties of projection\n { name: name } // name as initial implicit property\n ) || this;\n _this.specifiedProjection = specifiedProjection;\n _this.size = size;\n _this.data = data;\n _this.merged = false;\n return _this;\n }\n return ProjectionComponent;\n}(Split));\nexport { ProjectionComponent };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvcHJvamVjdGlvbi9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0I7SUFBeUMsK0NBQW1CO0lBRzFELDZCQUFZLElBQVksRUFBUyxtQkFBK0IsRUFBUyxJQUFtQixFQUFTLElBQThCO1FBQW5JLFlBQ0UsdUNBQ00sbUJBQW1CLEdBQUksd0NBQXdDO1FBQ25FLEVBQUMsSUFBSSxNQUFBLEVBQUMsQ0FBRSxvQ0FBb0M7U0FDN0MsU0FDRjtRQUxnQyx5QkFBbUIsR0FBbkIsbUJBQW1CLENBQVk7UUFBUyxVQUFJLEdBQUosSUFBSSxDQUFlO1FBQVMsVUFBSSxHQUFKLElBQUksQ0FBMEI7UUFGNUgsWUFBTSxHQUFHLEtBQUssQ0FBQzs7SUFPdEIsQ0FBQztJQUNILDBCQUFDO0FBQUQsQ0FBQyxBQVRELENBQXlDLEtBQUssR0FTN0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb2plY3Rpb259IGZyb20gJy4uLy4uL3Byb2plY3Rpb24nO1xuaW1wb3J0IHtWZ1Byb2plY3Rpb24sIFZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1NwbGl0fSBmcm9tICcuLi9zcGxpdCc7XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0aW9uQ29tcG9uZW50IGV4dGVuZHMgU3BsaXQ8VmdQcm9qZWN0aW9uPiB7XG4gIHB1YmxpYyBtZXJnZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIHB1YmxpYyBzcGVjaWZpZWRQcm9qZWN0aW9uOiBQcm9qZWN0aW9uLCBwdWJsaWMgc2l6ZTogVmdTaWduYWxSZWZbXSwgcHVibGljIGRhdGE6IChzdHJpbmcgfCBWZ1NpZ25hbFJlZilbXSkge1xuICAgIHN1cGVyKFxuICAgICAgey4uLnNwZWNpZmllZFByb2plY3Rpb259LCAgLy8gYWxsIGV4cGxpY2l0IHByb3BlcnRpZXMgb2YgcHJvamVjdGlvblxuICAgICAge25hbWV9ICAvLyBuYW1lIGFzIGluaXRpYWwgaW1wbGljaXQgcHJvcGVydHlcbiAgICApO1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { LATITUDE, LATITUDE2, LONGITUDE, LONGITUDE2, SHAPE } from '../../channel';\nimport { MAIN } from '../../data';\nimport { PROJECTION_PROPERTIES } from '../../projection';\nimport { GEOJSON } from '../../type';\nimport { duplicate, every, stringify } from '../../util';\nimport { isUnitModel } from '../model';\nimport { ProjectionComponent } from './component';\nexport function parseProjection(model) {\n if (isUnitModel(model)) {\n model.component.projection = parseUnitProjection(model);\n }\n else {\n // because parse happens from leaves up (unit specs before layer spec),\n // we can be sure that the above if statement has already occurred\n // and therefore we have access to child.component.projection\n // for each of model's children\n model.component.projection = parseNonUnitProjections(model);\n }\n}\nfunction parseUnitProjection(model) {\n var specifiedProjection = model.specifiedProjection, config = model.config, hasProjection = model.hasProjection;\n if (hasProjection) {\n var data_1 = [];\n [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (posssiblePair) {\n if (model.channelHasField(posssiblePair[0]) || model.channelHasField(posssiblePair[1])) {\n data_1.push({\n signal: model.getName(\"geojson_\" + data_1.length)\n });\n }\n });\n if (model.channelHasField(SHAPE) && model.fieldDef(SHAPE).type === GEOJSON) {\n data_1.push({\n signal: model.getName(\"geojson_\" + data_1.length)\n });\n }\n if (data_1.length === 0) {\n // main source is geojson, so we can just use that\n data_1.push(model.requestDataName(MAIN));\n }\n return new ProjectionComponent(model.projectionName(true), tslib_1.__assign({}, (config.projection || {}), (specifiedProjection || {})), [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')], data_1);\n }\n return undefined;\n}\nfunction mergeIfNoConflict(first, second) {\n var allPropertiesShared = every(PROJECTION_PROPERTIES, function (prop) {\n // neither has the poperty\n if (!first.explicit.hasOwnProperty(prop) &&\n !second.explicit.hasOwnProperty(prop)) {\n return true;\n }\n // both have property and an equal value for property\n if (first.explicit.hasOwnProperty(prop) &&\n second.explicit.hasOwnProperty(prop) &&\n // some properties might be signals or objects and require hashing for comparison\n stringify(first.get(prop)) === stringify(second.get(prop))) {\n return true;\n }\n return false;\n });\n var size = stringify(first.size) === stringify(second.size);\n if (size) {\n if (allPropertiesShared) {\n return first;\n }\n else if (stringify(first.explicit) === stringify({})) {\n return second;\n }\n else if (stringify(second.explicit) === stringify({})) {\n return first;\n }\n }\n // if all properties don't match, let each unit spec have its own projection\n return null;\n}\nfunction parseNonUnitProjections(model) {\n if (model.children.length === 0) {\n return undefined;\n }\n var nonUnitProjection;\n var mergable = every(model.children, function (child) {\n parseProjection(child);\n var projection = child.component.projection;\n if (!projection) {\n // child layer does not use a projection\n return true;\n }\n else if (!nonUnitProjection) {\n // cached 'projection' is null, cache this one\n nonUnitProjection = projection;\n return true;\n }\n else {\n var merge = mergeIfNoConflict(nonUnitProjection, projection);\n if (merge) {\n nonUnitProjection = merge;\n }\n return !!merge;\n }\n });\n // it cached one and all other children share the same projection,\n if (nonUnitProjection && mergable) {\n // so we can elevate it to the layer level\n var name_1 = model.projectionName(true);\n var modelProjection_1 = new ProjectionComponent(name_1, nonUnitProjection.specifiedProjection, nonUnitProjection.size, duplicate(nonUnitProjection.data));\n // rename and assign all others as merged\n model.children.forEach(function (child) {\n if (child.component.projection) {\n modelProjection_1.data = modelProjection_1.data.concat(child.component.projection.data);\n child.renameProjection(child.component.projection.get('name'), name_1);\n child.component.projection.merged = true;\n }\n });\n return modelProjection_1;\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9wcm9qZWN0aW9uL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXZELE9BQU8sRUFBQyxXQUFXLEVBQVEsTUFBTSxVQUFVLENBQUM7QUFFNUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRWhELE1BQU0sMEJBQTBCLEtBQVk7SUFDMUMsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDekQ7U0FBTTtRQUNMLHVFQUF1RTtRQUN2RSxrRUFBa0U7UUFDbEUsNkRBQTZEO1FBQzdELCtCQUErQjtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3RDtBQUNILENBQUM7QUFFRCw2QkFBNkIsS0FBZ0I7SUFDcEMsSUFBQSwrQ0FBbUIsRUFBRSxxQkFBTSxFQUFFLG1DQUFhLENBQVU7SUFFM0QsSUFBSSxhQUFhLEVBQUU7UUFDakIsSUFBTSxNQUFJLEdBQTZCLEVBQUUsQ0FBQztRQUUxQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFF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QUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSztZQUMzQixJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO2dCQUM5QixpQkFBZSxDQUFDLElBQUksR0FBRyxpQkFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BGLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBSSxDQUFDLENBQUM7Z0JBQ3JFLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7YUFDMUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8saUJBQWUsQ0FBQztLQUN4QjtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xBVElUVURFLCBMQVRJVFVERTIsIExPTkdJVFVERSwgTE9OR0lUVURFMiwgU0hBUEV9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtNQUlOfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7UFJPSkVDVElPTl9QUk9QRVJUSUVTfSBmcm9tICcuLi8uLi9wcm9qZWN0aW9uJztcbmltcG9ydCB7R0VPSlNPTn0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2R1cGxpY2F0ZSwgZXZlcnksIHN0cmluZ2lmeX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtQcm9qZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuL2NvbXBvbmVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVByb2plY3Rpb24obW9kZWw6IE1vZGVsKSB7XG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBtb2RlbC5jb21wb25lbnQucHJvamVjdGlvbiA9IHBhcnNlVW5pdFByb2plY3Rpb24obW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJlY2F1c2UgcGFyc2UgaGFwcGVucyBmcm9tIGxlYXZlcyB1cCAodW5pdCBzcGVjcyBiZWZvcmUgbGF5ZXIgc3BlYyksXG4gICAgLy8gd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgYWJvdmUgaWYgc3RhdGVtZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkXG4gICAgLy8gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIGFjY2VzcyB0byBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvblxuICAgIC8vIGZvciBlYWNoIG9mIG1vZGVsJ3MgY2hpbGRyZW5cbiAgICBtb2RlbC5jb21wb25lbnQucHJvamVjdGlvbiA9IHBhcnNlTm9uVW5pdFByb2plY3Rpb25zKG1vZGVsKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaXRQcm9qZWN0aW9uKG1vZGVsOiBVbml0TW9kZWwpOiBQcm9qZWN0aW9uQ29tcG9uZW50IHtcbiAgY29uc3Qge3NwZWNpZmllZFByb2plY3Rpb24sIGNvbmZpZywgaGFzUHJvamVjdGlvbn0gPSBtb2RlbDtcblxuICBpZiAoaGFzUHJvamVjdGlvbikge1xuICAgIGNvbnN0IGRhdGE6IChWZ1NpZ25hbFJlZiB8IHN0cmluZylbXSA9IFtdO1xuXG4gICAgW1tMT05HSVRVREUsIExBVElUVURFXSwgW0xPTkdJVFVERTIsIExBVElUVURFMl1dLmZvckVhY2goKHBvc3NzaWJsZVBhaXIpID0+IHtcbiAgICAgIGlmIChtb2RlbC5jaGFubmVsSGFzRmllbGQocG9zc3NpYmxlUGFpclswXSkgfHwgbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKHBvc3NzaWJsZVBhaXJbMV0pKSB7XG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7ZGF0YS5sZW5ndGh9YClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwuY2hhbm5lbEhhc0ZpZWxkKFNIQVBFKSAmJiBtb2RlbC5maWVsZERlZihTSEFQRSkudHlwZSA9PT0gR0VPSlNPTikge1xuICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7ZGF0YS5sZW5ndGh9YClcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gbWFpbiBzb3VyY2UgaXMgZ2VvanNvbiwgc28gd2UgY2FuIGp1c3QgdXNlIHRoYXRcbiAgICAgIGRhdGEucHVzaChtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTikpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvamVjdGlvbkNvbXBvbmVudChtb2RlbC5wcm9qZWN0aW9uTmFtZSh0cnVlKSwge1xuICAgICAgLi4uKGNvbmZpZy5wcm9qZWN0aW9uIHx8IHt9KSxcbiAgICAgIC4uLihzcGVjaWZpZWRQcm9qZWN0aW9uIHx8IHt9KSxcbiAgICB9LCBbbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZignd2lkdGgnKSwgbW9kZWwuZ2V0U2l6ZVNpZ25hbFJlZignaGVpZ2h0JyldLCBkYXRhKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cblxuZnVuY3Rpb24gbWVyZ2VJZk5vQ29uZmxpY3QoZmlyc3Q6IFByb2plY3Rpb25Db21wb25lbnQsIHNlY29uZDogUHJvamVjdGlvbkNvbXBvbmVudCk6IFByb2plY3Rpb25Db21wb25lbnQge1xuICBjb25zdCBhbGxQcm9wZXJ0aWVzU2hhcmVkID0gZXZlcnkoUFJPSkVDVElPTl9QUk9QRVJUSUVTLCAocHJvcCkgPT4ge1xuICAgIC8vIG5laXRoZXIgaGFzIHRoZSBwb3BlcnR5XG4gICAgaWYgKCFmaXJzdC5leHBsaWNpdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJlxuICAgICAgIXNlY29uZC5leHBsaWNpdC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIGJvdGggaGF2ZSBwcm9wZXJ0eSBhbmQgYW4gZXF1YWwgdmFsdWUgZm9yIHByb3BlcnR5XG4gICAgaWYgKGZpcnN0LmV4cGxpY2l0Lmhhc093blByb3BlcnR5KHByb3ApICYmXG4gICAgICBzZWNvbmQuZXhwbGljaXQuaGFzT3duUHJvcGVydHkocHJvcCkgJiZcbiAgICAgIC8vIHNvbWUgcHJvcGVydGllcyBtaWdodCBiZSBzaWduYWxzIG9yIG9iamVjdHMgYW5kIHJlcXVpcmUgaGFzaGluZyBmb3IgY29tcGFyaXNvblxuICAgICAgc3RyaW5naWZ5KGZpcnN0LmdldChwcm9wKSkgPT09IHN0cmluZ2lmeShzZWNvbmQuZ2V0KHByb3ApKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG5cbiAgY29uc3Qgc2l6ZSA9IHN0cmluZ2lmeShmaXJzdC5zaXplKSA9PT0gc3RyaW5naWZ5KHNlY29uZC5zaXplKTtcbiAgaWYgKHNpemUpIHtcbiAgICBpZiAoYWxsUHJvcGVydGllc1NoYXJlZCkge1xuICAgICAgcmV0dXJuIGZpcnN0O1xuICAgIH0gZWxzZSBpZiAoc3RyaW5naWZ5KGZpcnN0LmV4cGxpY2l0KSA9PT0gc3RyaW5naWZ5KHt9KSkge1xuICAgICAgcmV0dXJuIHNlY29uZDtcbiAgICB9IGVsc2UgaWYgKHN0cmluZ2lmeShzZWNvbmQuZXhwbGljaXQpID09PSBzdHJpbmdpZnkoe30pKSB7XG4gICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgYWxsIHByb3BlcnRpZXMgZG9uJ3QgbWF0Y2gsIGxldCBlYWNoIHVuaXQgc3BlYyBoYXZlIGl0cyBvd24gcHJvamVjdGlvblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0UHJvamVjdGlvbnMobW9kZWw6IE1vZGVsKTogUHJvamVjdGlvbkNvbXBvbmVudCB7XG4gIGlmIChtb2RlbC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IG5vblVuaXRQcm9qZWN0aW9uOiBQcm9qZWN0aW9uQ29tcG9uZW50O1xuICBjb25zdCBtZXJnYWJsZSA9IGV2ZXJ5KG1vZGVsLmNoaWxkcmVuLCAoY2hpbGQpID0+IHtcbiAgICBwYXJzZVByb2plY3Rpb24oY2hpbGQpO1xuICAgIGNvbnN0IHByb2plY3Rpb24gPSBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvbjtcbiAgICBpZiAoIXByb2plY3Rpb24pIHtcbiAgICAgIC8vIGNoaWxkIGxheWVyIGRvZXMgbm90IHVzZSBhIHByb2plY3Rpb25cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIW5vblVuaXRQcm9qZWN0aW9uKSB7XG4gICAgICAvLyBjYWNoZWQgJ3Byb2plY3Rpb24nIGlzIG51bGwsIGNhY2hlIHRoaXMgb25lXG4gICAgICBub25Vbml0UHJvamVjdGlvbiA9IHByb2plY3Rpb247XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVyZ2UgPSBtZXJnZUlmTm9Db25mbGljdChub25Vbml0UHJvamVjdGlvbiwgcHJvamVjdGlvbik7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgbm9uVW5pdFByb2plY3Rpb24gPSBtZXJnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhIW1lcmdlO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXQgY2FjaGVkIG9uZSBhbmQgYWxsIG90aGVyIGNoaWxkcmVuIHNoYXJlIHRoZSBzYW1lIHByb2plY3Rpb24sXG4gIGlmIChub25Vbml0UHJvamVjdGlvbiAmJiBtZXJnYWJsZSkge1xuICAgIC8vIHNvIHdlIGNhbiBlbGV2YXRlIGl0IHRvIHRoZSBsYXllciBsZXZlbFxuICAgIGNvbnN0IG5hbWUgPSBtb2RlbC5wcm9qZWN0aW9uTmFtZSh0cnVlKTtcbiAgICBjb25zdCBtb2RlbFByb2plY3Rpb24gPSBuZXcgUHJvamVjdGlvbkNvbXBvbmVudChcbiAgICAgIG5hbWUsXG4gICAgICBub25Vbml0UHJvamVjdGlvbi5zcGVjaWZpZWRQcm9qZWN0aW9uLFxuICAgICAgbm9uVW5pdFByb2plY3Rpb24uc2l6ZSxcbiAgICAgIGR1cGxpY2F0ZShub25Vbml0UHJvamVjdGlvbi5kYXRhKVxuICAgICk7XG5cbiAgICAvLyByZW5hbWUgYW5kIGFzc2lnbiBhbGwgb3RoZXJzIGFzIG1lcmdlZFxuICAgIG1vZGVsLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XG4gICAgICBpZiAoY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24pIHtcbiAgICAgICAgbW9kZWxQcm9qZWN0aW9uLmRhdGEgPSBtb2RlbFByb2plY3Rpb24uZGF0YS5jb25jYXQoY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24uZGF0YSk7XG4gICAgICAgIGNoaWxkLnJlbmFtZVByb2plY3Rpb24oY2hpbGQuY29tcG9uZW50LnByb2plY3Rpb24uZ2V0KCduYW1lJyksIG5hbWUpO1xuICAgICAgICBjaGlsZC5jb21wb25lbnQucHJvamVjdGlvbi5tZXJnZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1vZGVsUHJvamVjdGlvbjtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=","import { isArray, isString } from 'vega-util';\nexport function isSortField(sort) {\n return !!sort && (sort['op'] === 'count' || !!sort['field']) && !!sort['op'];\n}\nexport function isSortArray(sort) {\n return !!sort && isArray(sort) && sort.every(function (s) { return isString(s); });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBa0Q1QyxNQUFNLHNCQUF5QixJQUFpRDtJQUM5RSxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCxNQUFNLHNCQUF5QixJQUFpRDtJQUM5RSxPQUFPLENBQUMsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQVgsQ0FBVyxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtpc0FycmF5LCBpc1N0cmluZ30gZnJvbSAndmVnYS11dGlsJztcblxuaW1wb3J0IHtWZ0NvbXBhcmF0b3JPcmRlcn0gZnJvbSAnLi92ZWdhLnNjaGVtYSc7XG5cblxuZXhwb3J0IHR5cGUgU29ydE9yZGVyID0gVmdDb21wYXJhdG9yT3JkZXIgfCBudWxsO1xuXG5cbi8qKlxuICogQSBzb3J0IGRlZmluaXRpb24gZm9yIHRyYW5zZm9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRGaWVsZCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gc29ydC5cbiAgICovXG4gIGZpZWxkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc29ydCB0aGUgZmllbGQgaW4gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgb3JkZXIuXG4gICAqL1xuICBvcmRlcj86IFZnQ29tcGFyYXRvck9yZGVyO1xufVxuXG5cbi8qKlxuICogQSBzb3J0IGRlZmluaXRpb24gZm9yIHNvcnRpbmcgYSBkaXNjcmV0ZSBzY2FsZSBpbiBhbiBlbmNvZGluZyBmaWVsZCBkZWZpbml0aW9uLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2RpbmdTb3J0RmllbGQ8Rj4ge1xuICAvKipcbiAgICogVGhlIGRhdGEgW2ZpZWxkXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpZWxkLmh0bWwpIHRvIHNvcnQgYnkuXG4gICAqXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBJZiB1bnNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIGZpZWxkIHNwZWNpZmllZCBpbiB0aGUgb3V0ZXIgZGF0YSByZWZlcmVuY2UuXG4gICAqL1xuICBmaWVsZD86IEY7XG4gIC8qKlxuICAgKiBBbiBbYWdncmVnYXRlIG9wZXJhdGlvbl0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9hZ2dyZWdhdGUuaHRtbCNvcHMpIHRvIHBlcmZvcm0gb24gdGhlIGZpZWxkIHByaW9yIHRvIHNvcnRpbmcgKGUuZy4sIGBcImNvdW50XCJgLCBgXCJtZWFuXCJgIGFuZCBgXCJtZWRpYW5cImApLlxuICAgKiBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGluIGNhc2VzIHdoZXJlIHRoZSBzb3J0IGZpZWxkIGFuZCB0aGUgZGF0YSByZWZlcmVuY2UgZmllbGQgZG8gbm90IG1hdGNoLlxuICAgKiBUaGUgaW5wdXQgZGF0YSBvYmplY3RzIHdpbGwgYmUgYWdncmVnYXRlZCwgZ3JvdXBlZCBieSB0aGUgZW5jb2RlZCBkYXRhIGZpZWxkLlxuICAgKlxuICAgKiBGb3IgYSBmdWxsIGxpc3Qgb2Ygb3BlcmF0aW9ucywgcGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgW2FnZ3JlZ2F0ZV0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9hZ2dyZWdhdGUuaHRtbCNvcHMpLlxuICAgKi9cbiAgb3A6IEFnZ3JlZ2F0ZU9wO1xuXG4gIC8qKlxuICAgKiBUaGUgc29ydCBvcmRlci4gT25lIG9mIGBcImFzY2VuZGluZ1wiYCAoZGVmYXVsdCksIGBcImRlc2NlbmRpbmdcImAsIG9yIGBudWxsYCAobm8gbm90IHNvcnQpLlxuICAgKi9cbiAgb3JkZXI/OiBTb3J0T3JkZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NvcnRGaWVsZDxGPihzb3J0OiBzdHJpbmdbXSB8IFNvcnRPcmRlciB8IEVuY29kaW5nU29ydEZpZWxkPEY+KTogc29ydCBpcyBFbmNvZGluZ1NvcnRGaWVsZDxGPiB7XG4gIHJldHVybiAhIXNvcnQgJiYgKHNvcnRbJ29wJ10gPT09ICdjb3VudCcgfHwgISFzb3J0WydmaWVsZCddKSAmJiAhIXNvcnRbJ29wJ107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NvcnRBcnJheTxGPihzb3J0OiBzdHJpbmdbXSB8IFNvcnRPcmRlciB8IEVuY29kaW5nU29ydEZpZWxkPEY+KTogc29ydCBpcyBzdHJpbmdbXSB7XG4gIHJldHVybiAhIXNvcnQgJiYgaXNBcnJheShzb3J0KSAmJiBzb3J0LmV2ZXJ5KHMgPT4gaXNTdHJpbmcocykpO1xufVxuIl19","import * as tslib_1 from \"tslib\";\n/**\n * A node in the dataflow tree.\n */\nvar DataFlowNode = /** @class */ (function () {\n function DataFlowNode(parent, debugName) {\n this.debugName = debugName;\n this._children = [];\n this._parent = null;\n if (parent) {\n this.parent = parent;\n }\n }\n /**\n * Clone this node with a deep copy but don't clone links to children or parents.\n */\n DataFlowNode.prototype.clone = function () {\n throw new Error('Cannot clone node');\n };\n /**\n * Set of fields that are being created by this node.\n */\n DataFlowNode.prototype.producedFields = function () {\n return {};\n };\n DataFlowNode.prototype.dependentFields = function () {\n return {};\n };\n Object.defineProperty(DataFlowNode.prototype, \"parent\", {\n get: function () {\n return this._parent;\n },\n /**\n * Set the parent of the node and also add this not to the parent's children.\n */\n set: function (parent) {\n this._parent = parent;\n parent.addChild(this);\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(DataFlowNode.prototype, \"children\", {\n get: function () {\n return this._children;\n },\n enumerable: true,\n configurable: true\n });\n DataFlowNode.prototype.numChildren = function () {\n return this._children.length;\n };\n DataFlowNode.prototype.addChild = function (child) {\n this._children.push(child);\n };\n DataFlowNode.prototype.removeChild = function (oldChild) {\n this._children.splice(this._children.indexOf(oldChild), 1);\n };\n /**\n * Remove node from the dataflow.\n */\n DataFlowNode.prototype.remove = function () {\n for (var _i = 0, _a = this._children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parent = this._parent;\n }\n this._parent.removeChild(this);\n };\n /**\n * Insert another node as a parent of this node.\n */\n DataFlowNode.prototype.insertAsParentOf = function (other) {\n var parent = other.parent;\n parent.removeChild(this);\n this.parent = parent;\n other.parent = this;\n };\n DataFlowNode.prototype.swapWithParent = function () {\n var parent = this._parent;\n var newParent = parent.parent;\n // reconnect the children\n for (var _i = 0, _a = this._children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parent = parent;\n }\n // remove old links\n this._children = []; // equivalent to removing every child link one by one\n parent.removeChild(this);\n parent.parent.removeChild(parent);\n // swap two nodes\n this.parent = newParent;\n parent.parent = this;\n };\n return DataFlowNode;\n}());\nexport { DataFlowNode };\nvar OutputNode = /** @class */ (function (_super) {\n tslib_1.__extends(OutputNode, _super);\n /**\n * @param source The name of the source. Will change in assemble.\n * @param type The type of the output node.\n * @param refCounts A global ref counter map.\n */\n function OutputNode(parent, source, type, refCounts) {\n var _this = _super.call(this, parent, source) || this;\n _this.type = type;\n _this.refCounts = refCounts;\n _this._source = _this._name = source;\n if (_this.refCounts && !(_this._name in _this.refCounts)) {\n _this.refCounts[_this._name] = 0;\n }\n return _this;\n }\n OutputNode.prototype.clone = function () {\n var cloneObj = new this.constructor;\n cloneObj.debugName = 'clone_' + this.debugName;\n cloneObj._source = this._source;\n cloneObj._name = 'clone_' + this._name;\n cloneObj.type = this.type;\n cloneObj.refCounts = this.refCounts;\n cloneObj.refCounts[cloneObj._name] = 0;\n return cloneObj;\n };\n /**\n * Request the datasource name and increase the ref counter.\n *\n * During the parsing phase, this will return the simple name such as 'main' or 'raw'.\n * It is crucial to request the name from an output node to mark it as a required node.\n * If nobody ever requests the name, this datasource will not be instantiated in the assemble phase.\n *\n * In the assemble phase, this will return the correct name.\n */\n OutputNode.prototype.getSource = function () {\n this.refCounts[this._name]++;\n return this._source;\n };\n OutputNode.prototype.isRequired = function () {\n return !!this.refCounts[this._name];\n };\n OutputNode.prototype.setSource = function (source) {\n this._source = source;\n };\n return OutputNode;\n}(DataFlowNode));\nexport { OutputNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2RhdGFmbG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFLQTs7R0FFRztBQUNIO0lBS0Usc0JBQVksTUFBb0IsRUFBa0IsU0FBa0I7UUFBbEIsY0FBUyxHQUFULFNBQVMsQ0FBUztRQUo1RCxjQUFTLEdBQW1CLEVBQUUsQ0FBQztRQUUvQixZQUFPLEdBQWlCLElBQUksQ0FBQztRQUduQyxJQUFJLE1BQU0sRUFBRTtZQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksNEJBQUssR0FBWjtRQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxxQ0FBYyxHQUFyQjtRQUNFLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLHNDQUFlLEdBQXRCO1FBQ0UsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsc0JBQUksZ0NBQU07YUFBVjtZQUNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN0QixDQUFDO1FBRUQ7O1dBRUc7YUFDSCxVQUFXLE1BQW9CO1lBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsQ0FBQzs7O09BUkE7SUFVRCxzQkFBSSxrQ0FBUTthQUFaO1lBQ0UsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3hCLENBQUM7OztPQUFBO0lBRU0sa0NBQVcsR0FBbEI7UUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBQy9CLENBQUM7SUFFTSwrQkFBUSxHQUFmLFVBQWdCLEtBQW1CO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtB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R0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QyxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBaUJEOzs7Ozs7OztPQVFHO0lBQ0ksOEJBQVMsR0FBaEI7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU0sK0JBQVUsR0FBakI7UUFDRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sOEJBQVMsR0FBaEIsVUFBaUIsTUFBYztRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztJQUN4QixDQUFDO0lBQ0gsaUJBQUM7QUFBRCxDQUFDLEFBcERELENBQWdDLFlBQVksR0FvRDNDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge0RhdGFTb3VyY2VUeXBlfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7RGljdCwgU3RyaW5nU2V0fSBmcm9tICcuLi8uLi91dGlsJztcblxuXG4vKipcbiAqIEEgbm9kZSBpbiB0aGUgZGF0YWZsb3cgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFGbG93Tm9kZSB7XG4gIHByaXZhdGUgX2NoaWxkcmVuOiBEYXRhRmxvd05vZGVbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3BhcmVudDogRGF0YUZsb3dOb2RlID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHVibGljIHJlYWRvbmx5IGRlYnVnTmFtZT86IHN0cmluZykge1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9uZSB0aGlzIG5vZGUgd2l0aCBhIGRlZXAgY29weSBidXQgZG9uJ3QgY2xvbmUgbGlua3MgdG8gY2hpbGRyZW4gb3IgcGFyZW50cy5cbiAgICovXG4gIHB1YmxpYyBjbG9uZSgpOiBEYXRhRmxvd05vZGUge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNsb25lIG5vZGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb2YgZmllbGRzIHRoYXQgYXJlIGJlaW5nIGNyZWF0ZWQgYnkgdGhpcyBub2RlLlxuICAgKi9cbiAgcHVibGljIHByb2R1Y2VkRmllbGRzKCk6IFN0cmluZ1NldCB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIGRlcGVuZGVudEZpZWxkcygpOiBTdHJpbmdTZXQge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldCBwYXJlbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHBhcmVudCBvZiB0aGUgbm9kZSBhbmQgYWxzbyBhZGQgdGhpcyBub3QgdG8gdGhlIHBhcmVudCdzIGNoaWxkcmVuLlxuICAgKi9cbiAgc2V0IHBhcmVudChwYXJlbnQ6IERhdGFGbG93Tm9kZSkge1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgICBwYXJlbnQuYWRkQ2hpbGQodGhpcyk7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgcHVibGljIG51bUNoaWxkcmVuKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgYWRkQ2hpbGQoY2hpbGQ6IERhdGFGbG93Tm9kZSkge1xuICAgIHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNoaWxkKG9sZENoaWxkOiBEYXRhRmxvd05vZGUpIHtcbiAgICB0aGlzLl9jaGlsZHJlbi5zcGxpY2UodGhpcy5fY2hpbGRyZW4uaW5kZXhPZihvbGRDaGlsZCksIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBub2RlIGZyb20gdGhlIGRhdGFmbG93LlxuICAgKi9cbiAgcHVibGljIHJlbW92ZSgpIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuX2NoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuX3BhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgYW5vdGhlciBub2RlIGFzIGEgcGFyZW50IG9mIHRoaXMgbm9kZS5cbiAgICovXG4gIHB1YmxpYyBpbnNlcnRBc1BhcmVudE9mKG90aGVyOiBEYXRhRmxvd05vZGUpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBvdGhlci5wYXJlbnQ7XG4gICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIG90aGVyLnBhcmVudCA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgc3dhcFdpdGhQYXJlbnQoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50O1xuICAgIGNvbnN0IG5ld1BhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG5cbiAgICAvLyByZWNvbm5lY3QgdGhlIGNoaWxkcmVuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLl9jaGlsZHJlbikge1xuICAgICAgY2hpbGQucGFyZW50ID0gcGFyZW50O1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBvbGQgbGlua3NcbiAgICB0aGlzLl9jaGlsZHJlbiA9IFtdOyAgLy8gZXF1aXZhbGVudCB0byByZW1vdmluZyBldmVyeSBjaGlsZCBsaW5rIG9uZSBieSBvbmVcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgcGFyZW50LnBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQpO1xuXG5cbiAgICAvLyBzd2FwIHR3byBub2Rlc1xuICAgIHRoaXMucGFyZW50ID0gbmV3UGFyZW50O1xuICAgIHBhcmVudC5wYXJlbnQgPSB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPdXRwdXROb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjbG9uZSgpOiB0aGlzIHtcbiAgICBjb25zdCBjbG9uZU9iaiA9IG5ldyAoPGFueT50aGlzLmNvbnN0cnVjdG9yKTtcbiAgICBjbG9uZU9iai5kZWJ1Z05hbWUgPSAnY2xvbmVfJyArIHRoaXMuZGVidWdOYW1lO1xuICAgIGNsb25lT2JqLl9zb3VyY2UgPSB0aGlzLl9zb3VyY2U7XG4gICAgY2xvbmVPYmouX25hbWUgPSAnY2xvbmVfJyArIHRoaXMuX25hbWU7XG4gICAgY2xvbmVPYmoudHlwZSA9IHRoaXMudHlwZTtcbiAgICBjbG9uZU9iai5yZWZDb3VudHMgPSB0aGlzLnJlZkNvdW50cztcbiAgICBjbG9uZU9iai5yZWZDb3VudHNbY2xvbmVPYmouX25hbWVdID0gMDtcbiAgICByZXR1cm4gY2xvbmVPYmo7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgbmFtZSBvZiB0aGUgc291cmNlLiBXaWxsIGNoYW5nZSBpbiBhc3NlbWJsZS5cbiAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIG91dHB1dCBub2RlLlxuICAgKiBAcGFyYW0gcmVmQ291bnRzIEEgZ2xvYmFsIHJlZiBjb3VudGVyIG1hcC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBzb3VyY2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IHR5cGU6IERhdGFTb3VyY2VUeXBlLCBwcml2YXRlIHJlYWRvbmx5IHJlZkNvdW50czogRGljdDxudW1iZXI+KSB7XG4gICAgc3VwZXIocGFyZW50LCBzb3VyY2UpO1xuXG4gICAgdGhpcy5fc291cmNlID0gdGhpcy5fbmFtZSA9IHNvdXJjZTtcblxuICAgIGlmICh0aGlzLnJlZkNvdW50cyAmJiAhKHRoaXMuX25hbWUgaW4gdGhpcy5yZWZDb3VudHMpKSB7XG4gICAgICB0aGlzLnJlZkNvdW50c1t0aGlzLl9uYW1lXSA9IDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIGRhdGFzb3VyY2UgbmFtZSBhbmQgaW5jcmVhc2UgdGhlIHJlZiBjb3VudGVyLlxuICAgKlxuICAgKiBEdXJpbmcgdGhlIHBhcnNpbmcgcGhhc2UsIHRoaXMgd2lsbCByZXR1cm4gdGhlIHNpbXBsZSBuYW1lIHN1Y2ggYXMgJ21haW4nIG9yICdyYXcnLlxuICAgKiBJdCBpcyBjcnVjaWFsIHRvIHJlcXVlc3QgdGhlIG5hbWUgZnJvbSBhbiBvdXRwdXQgbm9kZSB0byBtYXJrIGl0IGFzIGEgcmVxdWlyZWQgbm9kZS5cbiAgICogSWYgbm9ib2R5IGV2ZXIgcmVxdWVzdHMgdGhlIG5hbWUsIHRoaXMgZGF0YXNvdXJjZSB3aWxsIG5vdCBiZSBpbnN0YW50aWF0ZWQgaW4gdGhlIGFzc2VtYmxlIHBoYXNlLlxuICAgKlxuICAgKiBJbiB0aGUgYXNzZW1ibGUgcGhhc2UsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGNvcnJlY3QgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTb3VyY2UoKSB7XG4gICAgdGhpcy5yZWZDb3VudHNbdGhpcy5fbmFtZV0rKztcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgcHVibGljIGlzUmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yZWZDb3VudHNbdGhpcy5fbmFtZV07XG4gIH1cblxuICBwdWJsaWMgc2V0U291cmNlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isScaleFieldDef, vgField } from '../../fielddef';\nimport { isSortArray } from '../../sort';\nimport { duplicate } from '../../util';\nimport { DataFlowNode } from './dataflow';\n/**\n * We don't know what a calculate node depends on so we should never move it beyond anything that produces fields.\n */\nvar CalculateNode = /** @class */ (function (_super) {\n tslib_1.__extends(CalculateNode, _super);\n function CalculateNode(parent, transform) {\n var _this = _super.call(this, parent) || this;\n _this.transform = transform;\n return _this;\n }\n CalculateNode.prototype.clone = function () {\n return new CalculateNode(null, duplicate(this.transform));\n };\n CalculateNode.parseAllForSortIndex = function (parent, model) {\n // get all the encoding with sort fields from model\n model.forEachFieldDef(function (fieldDef, channel) {\n if (isScaleFieldDef(fieldDef) && isSortArray(fieldDef.sort)) {\n var transform = {\n calculate: CalculateNode.calculateExpressionFromSortField(fieldDef.field, fieldDef.sort),\n as: sortArrayIndexField(model, channel)\n };\n parent = new CalculateNode(parent, transform);\n }\n });\n return parent;\n };\n CalculateNode.calculateExpressionFromSortField = function (field, sortFields) {\n var expression = '';\n var i;\n for (i = 0; i < sortFields.length; i++) {\n expression += \"datum.\" + field + \" === '\" + sortFields[i] + \"' ? \" + i + \" : \";\n }\n expression += i;\n return expression;\n };\n CalculateNode.prototype.producedFields = function () {\n var out = {};\n out[this.transform.as] = true;\n return out;\n };\n CalculateNode.prototype.assemble = function () {\n return {\n type: 'formula',\n expr: this.transform.calculate,\n as: this.transform.as\n };\n };\n return CalculateNode;\n}(DataFlowNode));\nexport { CalculateNode };\nexport function sortArrayIndexField(model, channel) {\n var fieldDef = model.fieldDef(channel);\n return channel + \"_\" + vgField(fieldDef) + \"_sort_index\";\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9jYWxjdWxhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQWlCLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUtyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDOztHQUVHO0FBQ0g7SUFBbUMseUNBQVk7SUFLN0MsdUJBQVksTUFBb0IsRUFBVSxTQUE2QjtRQUF2RSxZQUNFLGtCQUFNLE1BQU0sQ0FBQyxTQUNkO1FBRnlDLGVBQVMsR0FBVCxTQUFTLENBQW9COztJQUV2RSxDQUFDO0lBTk0sNkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBTWEsa0NBQW9CLEdBQWxDLFVBQW1DLE1BQW9CLEVBQUUsS0FBcUI7UUFDNUUsbURBQW1EO1FBQ25ELEtBQUssQ0FBQyxlQUFlLENBQUMsVUFBQyxRQUErQixFQUFFLE9BQXlCO1lBQy9FLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzNELElBQU0sU0FBUyxHQUF1QjtvQkFDcEMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUM7b0JBQ3hGLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2lCQUN4QyxDQUFDO2dCQUNGLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7YUFDL0M7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFYSw4Q0FBZ0MsR0FBOUMsVUFBK0MsS0FBYSxFQUFFLFVBQW9CO1FBQ2hGLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQVMsQ0FBQztRQUNkLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxVQUFVLElBQUksV0FBUyxLQUFLLGNBQVMsVUFBVSxDQUFDLENBQUMsQ0FBQyxZQUFPLENBQUMsUUFBSyxDQUFDO1NBQ2pFO1FBQ0QsVUFBVSxJQUFJLENBQUMsQ0FBQztRQUNoQixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sc0NBQWMsR0FBckI7UUFDRSxJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDOUIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sZ0NBQVEsR0FBZjtRQUNFLE9BQU87WUFDTCxJQUFJLEVBQUUsU0FBUztZQUNmLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFDOUIsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRTtTQUN0QixDQUFDO0lBQ0osQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTlDRCxDQUFtQyxZQUFZLEdBOEM5Qzs7QUFFRCxNQUFNLDhCQUE4QixLQUFxQixFQUFFLE9BQXlCO0lBQ2xGLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsT0FBVSxPQUFPLFNBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBYSxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzU2NhbGVGaWVsZERlZiwgU2NhbGVGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtpc1NvcnRBcnJheX0gZnJvbSAnLi4vLi4vc29ydCc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRm9ybXVsYVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtTaW5nbGVEZWZDaGFubmVsfSBmcm9tICcuLy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDYWxjdWxhdGVUcmFuc2Zvcm19IGZyb20gJy4vLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuLyoqXG4gKiBXZSBkb24ndCBrbm93IHdoYXQgYSBjYWxjdWxhdGUgbm9kZSBkZXBlbmRzIG9uIHNvIHdlIHNob3VsZCBuZXZlciBtb3ZlIGl0IGJleW9uZCBhbnl0aGluZyB0aGF0IHByb2R1Y2VzIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENhbGN1bGF0ZU5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBDYWxjdWxhdGVOb2RlKG51bGwsIGR1cGxpY2F0ZSh0aGlzLnRyYW5zZm9ybSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHByaXZhdGUgdHJhbnNmb3JtOiBDYWxjdWxhdGVUcmFuc2Zvcm0pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBwYXJzZUFsbEZvclNvcnRJbmRleChwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IE1vZGVsV2l0aEZpZWxkKSB7XG4gICAgLy8gZ2V0IGFsbCB0aGUgZW5jb2Rpbmcgd2l0aCBzb3J0IGZpZWxkcyBmcm9tIG1vZGVsXG4gICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKChmaWVsZERlZjogU2NhbGVGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBTaW5nbGVEZWZDaGFubmVsKSA9PiB7XG4gICAgICBpZiAoaXNTY2FsZUZpZWxkRGVmKGZpZWxkRGVmKSAmJiBpc1NvcnRBcnJheShmaWVsZERlZi5zb3J0KSkge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm06IENhbGN1bGF0ZVRyYW5zZm9ybSA9IHtcbiAgICAgICAgICBjYWxjdWxhdGU6IENhbGN1bGF0ZU5vZGUuY2FsY3VsYXRlRXhwcmVzc2lvbkZyb21Tb3J0RmllbGQoZmllbGREZWYuZmllbGQsIGZpZWxkRGVmLnNvcnQpLFxuICAgICAgICAgIGFzOiBzb3J0QXJyYXlJbmRleEZpZWxkKG1vZGVsLCBjaGFubmVsKVxuICAgICAgICB9O1xuICAgICAgICBwYXJlbnQgPSBuZXcgQ2FsY3VsYXRlTm9kZShwYXJlbnQsIHRyYW5zZm9ybSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY2FsY3VsYXRlRXhwcmVzc2lvbkZyb21Tb3J0RmllbGQoZmllbGQ6IHN0cmluZywgc29ydEZpZWxkczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGxldCBleHByZXNzaW9uID0gJyc7XG4gICAgbGV0IGk6IG51bWJlcjtcbiAgICBmb3IgKGkgPSAwOyBpIDwgc29ydEZpZWxkcy5sZW5ndGg7IGkrKykge1xuICAgICAgZXhwcmVzc2lvbiArPSBgZGF0dW0uJHtmaWVsZH0gPT09ICcke3NvcnRGaWVsZHNbaV19JyA/ICR7aX0gOiBgO1xuICAgIH1cbiAgICBleHByZXNzaW9uICs9IGk7XG4gICAgcmV0dXJuIGV4cHJlc3Npb247XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG4gICAgb3V0W3RoaXMudHJhbnNmb3JtLmFzXSA9IHRydWU7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0Zvcm11bGFUcmFuc2Zvcm0ge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICBleHByOiB0aGlzLnRyYW5zZm9ybS5jYWxjdWxhdGUsXG4gICAgICBhczogdGhpcy50cmFuc2Zvcm0uYXNcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0QXJyYXlJbmRleEZpZWxkKG1vZGVsOiBNb2RlbFdpdGhGaWVsZCwgY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCkge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICByZXR1cm4gYCR7Y2hhbm5lbH1fJHt2Z0ZpZWxkKGZpZWxkRGVmKX1fc29ydF9pbmRleGA7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isScaleChannel } from '../../channel';\nimport { vgField } from '../../fielddef';\nimport * as log from '../../log';\nimport { differ, duplicate, keys } from '../../util';\nimport { binRequiresRange } from '../common';\nimport { DataFlowNode } from './dataflow';\nfunction addDimension(dims, channel, fieldDef) {\n if (fieldDef.bin) {\n dims[vgField(fieldDef, {})] = true;\n dims[vgField(fieldDef, { binSuffix: 'end' })] = true;\n if (binRequiresRange(fieldDef, channel)) {\n dims[vgField(fieldDef, { binSuffix: 'range' })] = true;\n }\n }\n else {\n dims[vgField(fieldDef)] = true;\n }\n return dims;\n}\nfunction mergeMeasures(parentMeasures, childMeasures) {\n for (var f in childMeasures) {\n if (childMeasures.hasOwnProperty(f)) {\n // when we merge a measure, we either have to add an aggregation operator or even a new field\n var ops = childMeasures[f];\n for (var op in ops) {\n if (ops.hasOwnProperty(op)) {\n if (f in parentMeasures) {\n // add operator to existing measure field\n parentMeasures[f][op] = ops[op];\n }\n else {\n parentMeasures[f] = { op: ops[op] };\n }\n }\n }\n }\n }\n}\nvar AggregateNode = /** @class */ (function (_super) {\n tslib_1.__extends(AggregateNode, _super);\n /**\n * @param dimensions string set for dimensions\n * @param measures dictionary mapping field name => dict of aggregation functions and names to use\n */\n function AggregateNode(parent, dimensions, measures) {\n var _this = _super.call(this, parent) || this;\n _this.dimensions = dimensions;\n _this.measures = measures;\n return _this;\n }\n AggregateNode.prototype.clone = function () {\n return new AggregateNode(null, tslib_1.__assign({}, this.dimensions), duplicate(this.measures));\n };\n AggregateNode.makeFromEncoding = function (parent, model) {\n var isAggregate = false;\n model.forEachFieldDef(function (fd) {\n if (fd.aggregate) {\n isAggregate = true;\n }\n });\n var meas = {};\n var dims = {};\n if (!isAggregate) {\n // no need to create this node if the model has no aggregation\n return null;\n }\n model.forEachFieldDef(function (fieldDef, channel) {\n var aggregate = fieldDef.aggregate, field = fieldDef.field;\n if (aggregate) {\n if (aggregate === 'count') {\n meas['*'] = meas['*'] || {};\n meas['*']['count'] = vgField(fieldDef);\n }\n else {\n meas[field] = meas[field] || {};\n meas[field][aggregate] = vgField(fieldDef);\n // For scale channel with domain === 'unaggregated', add min/max so we can use their union as unaggregated domain\n if (isScaleChannel(channel) && model.scaleDomain(channel) === 'unaggregated') {\n meas[field]['min'] = vgField({ field: field, aggregate: 'min' });\n meas[field]['max'] = vgField({ field: field, aggregate: 'max' });\n }\n }\n }\n else {\n addDimension(dims, channel, fieldDef);\n }\n });\n if ((keys(dims).length + keys(meas).length) === 0) {\n return null;\n }\n return new AggregateNode(parent, dims, meas);\n };\n AggregateNode.makeFromTransform = function (parent, t) {\n var dims = {};\n var meas = {};\n for (var _i = 0, _a = t.aggregate; _i < _a.length; _i++) {\n var s = _a[_i];\n var op = s.op, field = s.field, as = s.as;\n if (op) {\n if (op === 'count') {\n meas['*'] = meas['*'] || {};\n meas['*']['count'] = as || vgField(s);\n }\n else {\n meas[field] = meas[field] || {};\n meas[field][op] = as || vgField(s);\n }\n }\n }\n for (var _b = 0, _c = t.groupby || []; _b < _c.length; _b++) {\n var s = _c[_b];\n dims[s] = true;\n }\n if ((keys(dims).length + keys(meas).length) === 0) {\n return null;\n }\n return new AggregateNode(parent, dims, meas);\n };\n AggregateNode.prototype.merge = function (other) {\n if (!differ(this.dimensions, other.dimensions)) {\n mergeMeasures(this.measures, other.measures);\n other.remove();\n }\n else {\n log.debug('different dimensions, cannot merge');\n }\n };\n AggregateNode.prototype.addDimensions = function (fields) {\n var _this = this;\n fields.forEach(function (f) { return _this.dimensions[f] = true; });\n };\n AggregateNode.prototype.dependentFields = function () {\n var out = {};\n keys(this.dimensions).forEach(function (f) { return out[f] = true; });\n keys(this.measures).forEach(function (m) { return out[m] = true; });\n return out;\n };\n AggregateNode.prototype.producedFields = function () {\n var _this = this;\n var out = {};\n keys(this.measures).forEach(function (field) {\n keys(_this.measures[field]).forEach(function (op) {\n out[op + \"_\" + field] = true;\n });\n });\n return out;\n };\n AggregateNode.prototype.assemble = function () {\n var ops = [];\n var fields = [];\n var as = [];\n for (var _i = 0, _a = keys(this.measures); _i < _a.length; _i++) {\n var field = _a[_i];\n for (var _b = 0, _c = keys(this.measures[field]); _b < _c.length; _b++) {\n var op = _c[_b];\n as.push(this.measures[field][op]);\n ops.push(op);\n fields.push(field);\n }\n }\n var result = {\n type: 'aggregate',\n groupby: keys(this.dimensions),\n ops: ops,\n fields: fields,\n as: as\n };\n return result;\n };\n return AggregateNode;\n}(DataFlowNode));\nexport { AggregateNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdncmVnYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9hZ2dyZWdhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBVSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFXLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBTyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBWSxNQUFNLFlBQVksQ0FBQztBQUVwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV4QyxzQkFBc0IsSUFBZ0MsRUFBRSxPQUFnQixFQUFFLFFBQTBCO0lBQ2xHLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBRW5ELElBQUksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDdEQ7S0FDRjtTQUFNO1FBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUNoQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELHVCQUF1QixjQUFrQyxFQUFFLGFBQWlDO0lBQzFGLEtBQUss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RUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDYixNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO1NBQ0Y7UUFFRCxJQUFNLE1BQU0sR0FBeUI7WUFDbkMsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQzlCLEdBQUcsS0FBQTtZQUNILE1BQU0sUUFBQTtZQUNOLEVBQUUsSUFBQTtTQUNILENBQUM7UUFFRixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBQ0gsb0JBQUM7QUFBRCxDQUFDLEFBOUlELENBQW1DLFlBQVksR0E4STlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBZ2dyZWdhdGVPcH0gZnJvbSAndmVnYSc7XG5cbmltcG9ydCB7Q2hhbm5lbCwgaXNTY2FsZUNoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge0FnZ3JlZ2F0ZVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RGljdCwgZGlmZmVyLCBkdXBsaWNhdGUsIGtleXMsIFN0cmluZ1NldH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnQWdncmVnYXRlVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2JpblJlcXVpcmVzUmFuZ2V9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi8uLi91bml0JztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuZnVuY3Rpb24gYWRkRGltZW5zaW9uKGRpbXM6IHtbZmllbGQ6IHN0cmluZ106IGJvb2xlYW59LCBjaGFubmVsOiBDaGFubmVsLCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPikge1xuICBpZiAoZmllbGREZWYuYmluKSB7XG4gICAgZGltc1t2Z0ZpZWxkKGZpZWxkRGVmLCB7fSldID0gdHJ1ZTtcbiAgICBkaW1zW3ZnRmllbGQoZmllbGREZWYsIHtiaW5TdWZmaXg6ICdlbmQnfSldID0gdHJ1ZTtcblxuICAgIGlmIChiaW5SZXF1aXJlc1JhbmdlKGZpZWxkRGVmLCBjaGFubmVsKSkge1xuICAgICAgZGltc1t2Z0ZpZWxkKGZpZWxkRGVmLCB7YmluU3VmZml4OiAncmFuZ2UnfSldID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZGltc1t2Z0ZpZWxkKGZpZWxkRGVmKV0gPSB0cnVlO1xuICB9XG4gIHJldHVybiBkaW1zO1xufVxuXG5mdW5jdGlvbiBtZXJnZU1lYXN1cmVzKHBhcmVudE1lYXN1cmVzOiBEaWN0PERpY3Q8c3RyaW5nPj4sIGNoaWxkTWVhc3VyZXM6IERpY3Q8RGljdDxzdHJpbmc+Pikge1xuICBmb3IgKGNvbnN0IGYgaW4gY2hpbGRNZWFzdXJlcykge1xuICAgIGlmIChjaGlsZE1lYXN1cmVzLmhhc093blByb3BlcnR5KGYpKSB7XG4gICAgICAvLyB3aGVuIHdlIG1lcmdlIGEgbWVhc3VyZSwgd2UgZWl0aGVyIGhhdmUgdG8gYWRkIGFuIGFnZ3JlZ2F0aW9uIG9wZXJhdG9yIG9yIGV2ZW4gYSBuZXcgZmllbGRcbiAgICAgIGNvbnN0IG9wcyA9IGNoaWxkTWVhc3VyZXNbZl07XG4gICAgICBmb3IgKGNvbnN0IG9wIGluIG9wcykge1xuICAgICAgICBpZiAob3BzLmhhc093blByb3BlcnR5KG9wKSkge1xuICAgICAgICAgIGlmIChmIGluIHBhcmVudE1lYXN1cmVzKSB7XG4gICAgICAgICAgICAvLyBhZGQgb3BlcmF0b3IgdG8gZXhpc3RpbmcgbWVhc3VyZSBmaWVsZFxuICAgICAgICAgICAgcGFyZW50TWVhc3VyZXNbZl1bb3BdID0gb3BzW29wXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50TWVhc3VyZXNbZl0gPSB7b3A6IG9wc1tvcF19O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQWdncmVnYXRlTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZU5vZGUobnVsbCwgey4uLnRoaXMuZGltZW5zaW9uc30sIGR1cGxpY2F0ZSh0aGlzLm1lYXN1cmVzKSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIGRpbWVuc2lvbnMgc3RyaW5nIHNldCBmb3IgZGltZW5zaW9uc1xuICAgKiBAcGFyYW0gbWVhc3VyZXMgZGljdGlvbmFyeSBtYXBwaW5nIGZpZWxkIG5hbWUgPT4gZGljdCBvZiBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgYW5kIG5hbWVzIHRvIHVzZVxuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHByaXZhdGUgZGltZW5zaW9uczogU3RyaW5nU2V0LCBwcml2YXRlIG1lYXN1cmVzOiBEaWN0PHtba2V5IGluIEFnZ3JlZ2F0ZU9wXT86IHN0cmluZ30+KSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21FbmNvZGluZyhwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IFVuaXRNb2RlbCk6IEFnZ3JlZ2F0ZU5vZGUge1xuICAgIGxldCBpc0FnZ3JlZ2F0ZSA9IGZhbHNlO1xuICAgIG1vZGVsLmZvckVhY2hGaWVsZERlZihmZCA9PiB7XG4gICAgICBpZiAoZmQuYWdncmVnYXRlKSB7XG4gICAgICAgIGlzQWdncmVnYXRlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IG1lYXMgPSB7fTtcbiAgICBjb25zdCBkaW1zID0ge307XG5cbiAgICBpZiAoIWlzQWdncmVnYXRlKSB7XG4gICAgICAvLyBubyBuZWVkIHRvIGNyZWF0ZSB0aGlzIG5vZGUgaWYgdGhlIG1vZGVsIGhhcyBubyBhZ2dyZWdhdGlvblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKChmaWVsZERlZiwgY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3Qge2FnZ3JlZ2F0ZSwgZmllbGR9ID0gZmllbGREZWY7XG4gICAgICBpZiAoYWdncmVnYXRlKSB7XG4gICAgICAgIGlmIChhZ2dyZWdhdGUgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICBtZWFzWycqJ10gPSBtZWFzWycqJ10gfHwge307XG4gICAgICAgICAgbWVhc1snKiddWydjb3VudCddID0gdmdGaWVsZChmaWVsZERlZik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVhc1tmaWVsZF0gPSBtZWFzW2ZpZWxkXSB8fCB7fTtcbiAgICAgICAgICBtZWFzW2ZpZWxkXVthZ2dyZWdhdGVdID0gdmdGaWVsZChmaWVsZERlZik7XG5cbiAgICAgICAgICAvLyBGb3Igc2NhbGUgY2hhbm5lbCB3aXRoIGRvbWFpbiA9PT0gJ3VuYWdncmVnYXRlZCcsIGFkZCBtaW4vbWF4IHNvIHdlIGNhbiB1c2UgdGhlaXIgdW5pb24gYXMgdW5hZ2dyZWdhdGVkIGRvbWFpblxuICAgICAgICAgIGlmIChpc1NjYWxlQ2hhbm5lbChjaGFubmVsKSAmJiBtb2RlbC5zY2FsZURvbWFpbihjaGFubmVsKSA9PT0gJ3VuYWdncmVnYXRlZCcpIHtcbiAgICAgICAgICAgIG1lYXNbZmllbGRdWydtaW4nXSA9IHZnRmllbGQoe2ZpZWxkLCBhZ2dyZWdhdGU6ICdtaW4nfSk7XG4gICAgICAgICAgICBtZWFzW2ZpZWxkXVsnbWF4J10gPSB2Z0ZpZWxkKHtmaWVsZCwgYWdncmVnYXRlOiAnbWF4J30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWRkRGltZW5zaW9uKGRpbXMsIGNoYW5uZWwsIGZpZWxkRGVmKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICgoa2V5cyhkaW1zKS5sZW5ndGggKyBrZXlzKG1lYXMpLmxlbmd0aCkgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQWdncmVnYXRlTm9kZShwYXJlbnQsIGRpbXMsIG1lYXMpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbVRyYW5zZm9ybShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgdDogQWdncmVnYXRlVHJhbnNmb3JtKTogQWdncmVnYXRlTm9kZSB7XG4gICAgY29uc3QgZGltcyA9IHt9O1xuICAgIGNvbnN0IG1lYXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgcyBvZiB0LmFnZ3JlZ2F0ZSkge1xuICAgICAgY29uc3Qge29wLCBmaWVsZCwgYXN9ID0gcztcbiAgICAgIGlmIChvcCkge1xuICAgICAgICBpZiAob3AgPT09ICdjb3VudCcpIHtcbiAgICAgICAgICBtZWFzWycqJ10gPSBtZWFzWycqJ10gfHwge307XG4gICAgICAgICAgbWVhc1snKiddWydjb3VudCddID0gYXMgfHwgdmdGaWVsZChzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZWFzW2ZpZWxkXSA9IG1lYXNbZmllbGRdIHx8IHt9O1xuICAgICAgICAgIG1lYXNbZmllbGRdW29wXSA9IGFzIHx8IHZnRmllbGQocyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHMgb2YgdC5ncm91cGJ5IHx8IFtdKSB7XG4gICAgICBkaW1zW3NdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKGtleXMoZGltcykubGVuZ3RoICsga2V5cyhtZWFzKS5sZW5ndGgpID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZU5vZGUocGFyZW50LCBkaW1zLCBtZWFzKTtcbiAgfVxuXG4gIHB1YmxpYyBtZXJnZShvdGhlcjogQWdncmVnYXRlTm9kZSkge1xuICAgIGlmICghZGlmZmVyKHRoaXMuZGltZW5zaW9ucywgb3RoZXIuZGltZW5zaW9ucykpIHtcbiAgICAgIG1lcmdlTWVhc3VyZXModGhpcy5tZWFzdXJlcywgb3RoZXIubWVhc3VyZXMpO1xuICAgICAgb3RoZXIucmVtb3ZlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5kZWJ1ZygnZGlmZmVyZW50IGRpbWVuc2lvbnMsIGNhbm5vdCBtZXJnZScpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhZGREaW1lbnNpb25zKGZpZWxkczogc3RyaW5nW10pIHtcbiAgICBmaWVsZHMuZm9yRWFjaChmID0+IHRoaXMuZGltZW5zaW9uc1tmXSA9IHRydWUpO1xuICB9XG5cbiAgcHVibGljIGRlcGVuZGVudEZpZWxkcygpIHtcbiAgICBjb25zdCBvdXQgPSB7fTtcblxuICAgIGtleXModGhpcy5kaW1lbnNpb25zKS5mb3JFYWNoKGYgPT4gb3V0W2ZdID0gdHJ1ZSk7XG4gICAga2V5cyh0aGlzLm1lYXN1cmVzKS5mb3JFYWNoKG0gPT4gb3V0W21dID0gdHJ1ZSk7XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHVibGljIHByb2R1Y2VkRmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAga2V5cyh0aGlzLm1lYXN1cmVzKS5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgIGtleXModGhpcy5tZWFzdXJlc1tmaWVsZF0pLmZvckVhY2gob3AgPT4ge1xuICAgICAgICBvdXRbYCR7b3B9XyR7ZmllbGR9YF0gPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnQWdncmVnYXRlVHJhbnNmb3JtIHtcbiAgICBjb25zdCBvcHM6IEFnZ3JlZ2F0ZU9wW10gPSBbXTtcbiAgICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgYXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXModGhpcy5tZWFzdXJlcykpIHtcbiAgICAgIGZvciAoY29uc3Qgb3Agb2Yga2V5cyh0aGlzLm1lYXN1cmVzW2ZpZWxkXSkpIHtcbiAgICAgICAgYXMucHVzaCh0aGlzLm1lYXN1cmVzW2ZpZWxkXVtvcF0pO1xuICAgICAgICBvcHMucHVzaChvcCk7XG4gICAgICAgIGZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQ6IFZnQWdncmVnYXRlVHJhbnNmb3JtID0ge1xuICAgICAgdHlwZTogJ2FnZ3JlZ2F0ZScsXG4gICAgICBncm91cGJ5OiBrZXlzKHRoaXMuZGltZW5zaW9ucyksXG4gICAgICBvcHMsXG4gICAgICBmaWVsZHMsXG4gICAgICBhc1xuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { COLUMN, ROW } from '../../channel';\nimport * as log from '../../log';\nimport { hasDiscreteDomain } from '../../scale';\nimport { isVgRangeStep } from '../../vega.schema';\nimport { assembleDomain, getFieldFromDomain } from '../scale/domain';\nimport { DataFlowNode } from './dataflow';\n/**\n * A node that helps us track what fields we are faceting by.\n */\nvar FacetNode = /** @class */ (function (_super) {\n tslib_1.__extends(FacetNode, _super);\n /**\n * @param model The facet model.\n * @param name The name that this facet source will have.\n * @param data The source data for this facet data.\n */\n function FacetNode(parent, model, name, data) {\n var _this = _super.call(this, parent) || this;\n _this.model = model;\n _this.name = name;\n _this.data = data;\n if (model.facet.column) {\n _this.columnFields = [model.vgField(COLUMN)];\n _this.columnName = model.getName('column_domain');\n if (model.fieldDef(COLUMN).bin) {\n _this.columnFields.push(model.vgField(COLUMN, { binSuffix: 'end' }));\n }\n }\n if (model.facet.row) {\n _this.rowFields = [model.vgField(ROW)];\n _this.rowName = model.getName('row_domain');\n if (model.fieldDef(ROW).bin) {\n _this.rowFields.push(model.vgField(ROW, { binSuffix: 'end' }));\n }\n }\n _this.childModel = model.child;\n return _this;\n }\n Object.defineProperty(FacetNode.prototype, \"fields\", {\n get: function () {\n var fields = [];\n if (this.columnFields) {\n fields = fields.concat(this.columnFields);\n }\n if (this.rowFields) {\n fields = fields.concat(this.rowFields);\n }\n return fields;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * The name to reference this source is its name.\n */\n FacetNode.prototype.getSource = function () {\n return this.name;\n };\n FacetNode.prototype.getChildIndependentFieldsWithStep = function () {\n var childIndependentFieldsWithStep = {};\n for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) {\n var channel = _a[_i];\n var childScaleComponent = this.childModel.component.scales[channel];\n if (childScaleComponent && !childScaleComponent.merged) {\n var type = childScaleComponent.get('type');\n var range = childScaleComponent.get('range');\n if (hasDiscreteDomain(type) && isVgRangeStep(range)) {\n var domain = assembleDomain(this.childModel, channel);\n var field = getFieldFromDomain(domain);\n if (field) {\n childIndependentFieldsWithStep[channel] = field;\n }\n else {\n log.warn('Unknown field for ${channel}. Cannot calculate view size.');\n }\n }\n }\n }\n return childIndependentFieldsWithStep;\n };\n FacetNode.prototype.assembleRowColumnData = function (channel, crossedDataName, childIndependentFieldsWithStep) {\n var aggregateChildField = {};\n var childChannel = channel === 'row' ? 'y' : 'x';\n if (childIndependentFieldsWithStep[childChannel]) {\n if (crossedDataName) {\n aggregateChildField = {\n // If there is a crossed data, calculate max\n fields: [\"distinct_\" + childIndependentFieldsWithStep[childChannel]],\n ops: ['max'],\n // Although it is technically a max, just name it distinct so it's easier to refer to it\n as: [\"distinct_\" + childIndependentFieldsWithStep[childChannel]]\n };\n }\n else {\n aggregateChildField = {\n // If there is no crossed data, just calculate distinct\n fields: [childIndependentFieldsWithStep[childChannel]],\n ops: ['distinct']\n };\n }\n }\n return {\n name: channel === 'row' ? this.rowName : this.columnName,\n // Use data from the crossed one if it exist\n source: crossedDataName || this.data,\n transform: [tslib_1.__assign({ type: 'aggregate', groupby: channel === 'row' ? this.rowFields : this.columnFields }, aggregateChildField)]\n };\n };\n FacetNode.prototype.assemble = function () {\n var data = [];\n var crossedDataName = null;\n var childIndependentFieldsWithStep = this.getChildIndependentFieldsWithStep();\n if (this.columnName && this.rowName && (childIndependentFieldsWithStep.x || childIndependentFieldsWithStep.y)) {\n // Need to create a cross dataset to correctly calculate cardinality\n crossedDataName = \"cross_\" + this.columnName + \"_\" + this.rowName;\n var fields = [].concat(childIndependentFieldsWithStep.x ? [childIndependentFieldsWithStep.x] : [], childIndependentFieldsWithStep.y ? [childIndependentFieldsWithStep.y] : []);\n var ops = fields.map(function () { return 'distinct'; });\n data.push({\n name: crossedDataName,\n source: this.data,\n transform: [{\n type: 'aggregate',\n groupby: this.columnFields.concat(this.rowFields),\n fields: fields,\n ops: ops\n }]\n });\n }\n if (this.columnName) {\n data.push(this.assembleRowColumnData('column', crossedDataName, childIndependentFieldsWithStep));\n }\n if (this.rowName) {\n data.push(this.assembleRowColumnData('row', crossedDataName, childIndependentFieldsWithStep));\n }\n return data;\n };\n return FacetNode;\n}(DataFlowNode));\nexport { FacetNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2ZhY2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDOUMsT0FBTyxFQUFDLGFBQWEsRUFBK0IsTUFBTSxtQkFBbUIsQ0FBQztBQUc5RSxPQUFPLEVBQUMsY0FBYyxFQUFFLGtCQUFrQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQU94Qzs7R0FFRztBQUNIO0lBQStCLHFDQUFZO0lBU3pDOzs7O09BSUc7SUFDSCxtQkFBbUIsTUFBb0IsRUFBa0IsS0FBaUIsRUFBa0IsSUFBWSxFQUFTLElBQVk7UUFBN0gsWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FtQmQ7UUFwQndELFdBQUssR0FBTCxLQUFLLENBQVk7UUFBa0IsVUFBSSxHQUFKLElBQUksQ0FBUTtRQUFTLFVBQUksR0FBSixJQUFJLENBQVE7UUFHM0gsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUN0QixLQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzVDLEtBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUNqRCxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFO2dCQUM5QixLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFDLFNB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QUFDO0FBQUQsQ0FBQyxBQXJKRCxDQUErQixZQUFZLEdBcUoxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWdncmVnYXRlT3B9IGZyb20gJ3ZlZ2EnO1xuaW1wb3J0IHtDT0xVTU4sIFJPVywgU2NhbGVDaGFubmVsfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtoYXNEaXNjcmV0ZURvbWFpbn0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwLCBWZ0FnZ3JlZ2F0ZVRyYW5zZm9ybSwgVmdEYXRhfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0ZhY2V0TW9kZWx9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7YXNzZW1ibGVEb21haW4sIGdldEZpZWxkRnJvbURvbWFpbn0gZnJvbSAnLi4vc2NhbGUvZG9tYWluJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxudHlwZSBDaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAgPSB7XG4gIHg/OiBzdHJpbmcsXG4gIHk/OiBzdHJpbmdcbn07XG5cbi8qKlxuICogQSBub2RlIHRoYXQgaGVscHMgdXMgdHJhY2sgd2hhdCBmaWVsZHMgd2UgYXJlIGZhY2V0aW5nIGJ5LlxuICovXG5leHBvcnQgY2xhc3MgRmFjZXROb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb2x1bW5GaWVsZHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbHVtbk5hbWU6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IHJvd0ZpZWxkczogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgcm93TmFtZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRNb2RlbDogTW9kZWw7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBtb2RlbCBUaGUgZmFjZXQgbW9kZWwuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRoYXQgdGhpcyBmYWNldCBzb3VyY2Ugd2lsbCBoYXZlLlxuICAgKiBAcGFyYW0gZGF0YSBUaGUgc291cmNlIGRhdGEgZm9yIHRoaXMgZmFjZXQgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHVibGljIHJlYWRvbmx5IG1vZGVsOiBGYWNldE1vZGVsLCBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLCBwdWJsaWMgZGF0YTogc3RyaW5nKSB7XG4gICAgc3VwZXIocGFyZW50KTtcblxuICAgIGlmIChtb2RlbC5mYWNldC5jb2x1bW4pIHtcbiAgICAgIHRoaXMuY29sdW1uRmllbGRzID0gW21vZGVsLnZnRmllbGQoQ09MVU1OKV07XG4gICAgICB0aGlzLmNvbHVtbk5hbWUgPSBtb2RlbC5nZXROYW1lKCdjb2x1bW5fZG9tYWluJyk7XG4gICAgICBpZiAobW9kZWwuZmllbGREZWYoQ09MVU1OKS5iaW4pIHtcbiAgICAgICAgdGhpcy5jb2x1bW5GaWVsZHMucHVzaChtb2RlbC52Z0ZpZWxkKENPTFVNTiwge2JpblN1ZmZpeDogJ2VuZCd9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsLmZhY2V0LnJvdykge1xuICAgICAgdGhpcy5yb3dGaWVsZHMgPSBbbW9kZWwudmdGaWVsZChST1cpXTtcbiAgICAgIHRoaXMucm93TmFtZSA9IG1vZGVsLmdldE5hbWUoJ3Jvd19kb21haW4nKTtcbiAgICAgIGlmIChtb2RlbC5maWVsZERlZihST1cpLmJpbikge1xuICAgICAgICB0aGlzLnJvd0ZpZWxkcy5wdXNoKG1vZGVsLnZnRmllbGQoUk9XLCB7YmluU3VmZml4OiAnZW5kJ30pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNoaWxkTW9kZWwgPSBtb2RlbC5jaGlsZDtcbiAgfVxuXG4gIGdldCBmaWVsZHMoKSB7XG4gICAgbGV0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb2x1bW5GaWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IGZpZWxkcy5jb25jYXQodGhpcy5jb2x1bW5GaWVsZHMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yb3dGaWVsZHMpIHtcbiAgICAgIGZpZWxkcyA9IGZpZWxkcy5jb25jYXQodGhpcy5yb3dGaWVsZHMpO1xuICAgIH1cbiAgICByZXR1cm4gZmllbGRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIHRvIHJlZmVyZW5jZSB0aGlzIHNvdXJjZSBpcyBpdHMgbmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXRTb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwKCkge1xuICAgIGNvbnN0IGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcDogQ2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgWyd4JywgJ3knXSBhcyBTY2FsZUNoYW5uZWxbXSkge1xuICAgICAgY29uc3QgY2hpbGRTY2FsZUNvbXBvbmVudCA9IHRoaXMuY2hpbGRNb2RlbC5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdO1xuICAgICAgaWYgKGNoaWxkU2NhbGVDb21wb25lbnQgJiYgIWNoaWxkU2NhbGVDb21wb25lbnQubWVyZ2VkKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBjaGlsZFNjYWxlQ29tcG9uZW50LmdldCgndHlwZScpO1xuICAgICAgICBjb25zdCByYW5nZSA9IGNoaWxkU2NhbGVDb21wb25lbnQuZ2V0KCdyYW5nZScpO1xuXG4gICAgICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbih0eXBlKSAmJiBpc1ZnUmFuZ2VTdGVwKHJhbmdlKSkge1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFzc2VtYmxlRG9tYWluKHRoaXMuY2hpbGRNb2RlbCwgY2hhbm5lbCk7XG4gICAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGaWVsZEZyb21Eb21haW4oZG9tYWluKTtcbiAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcFtjaGFubmVsXSA9IGZpZWxkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2cud2FybignVW5rbm93biBmaWVsZCBmb3IgJHtjaGFubmVsfS4gIENhbm5vdCBjYWxjdWxhdGUgdmlldyBzaXplLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXA7XG4gIH1cblxuICBwcml2YXRlIGFzc2VtYmxlUm93Q29sdW1uRGF0YShjaGFubmVsOiAncm93JyB8ICdjb2x1bW4nLCBjcm9zc2VkRGF0YU5hbWU6IHN0cmluZywgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwOiBDaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXApOiBWZ0RhdGEge1xuICAgIGxldCBhZ2dyZWdhdGVDaGlsZEZpZWxkOiBQYXJ0aWFsPFZnQWdncmVnYXRlVHJhbnNmb3JtPiA9IHt9O1xuICAgIGNvbnN0IGNoaWxkQ2hhbm5lbCA9IGNoYW5uZWwgPT09ICdyb3cnID8gJ3knIDogJ3gnO1xuXG4gICAgaWYgKGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcFtjaGlsZENoYW5uZWxdKSB7XG4gICAgICBpZiAoY3Jvc3NlZERhdGFOYW1lKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZUNoaWxkRmllbGQgPSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjcm9zc2VkIGRhdGEsIGNhbGN1bGF0ZSBtYXhcbiAgICAgICAgICBmaWVsZHM6IFtgZGlzdGluY3RfJHtjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXBbY2hpbGRDaGFubmVsXX1gXSxcbiAgICAgICAgICBvcHM6IFsnbWF4J10sXG4gICAgICAgICAgLy8gQWx0aG91Z2ggaXQgaXMgdGVjaG5pY2FsbHkgYSBtYXgsIGp1c3QgbmFtZSBpdCBkaXN0aW5jdCBzbyBpdCdzIGVhc2llciB0byByZWZlciB0byBpdFxuICAgICAgICAgIGFzOiBbYGRpc3RpbmN0XyR7Y2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwW2NoaWxkQ2hhbm5lbF19YF1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFnZ3JlZ2F0ZUNoaWxkRmllbGQgPSB7XG4gICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gY3Jvc3NlZCBkYXRhLCBqdXN0IGNhbGN1bGF0ZSBkaXN0aW5jdFxuICAgICAgICAgIGZpZWxkczogW2NoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcFtjaGlsZENoYW5uZWxdXSxcbiAgICAgICAgICBvcHM6IFsnZGlzdGluY3QnXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBjaGFubmVsID09PSAncm93JyA/IHRoaXMucm93TmFtZSA6IHRoaXMuY29sdW1uTmFtZSxcbiAgICAgIC8vIFVzZSBkYXRhIGZyb20gdGhlIGNyb3NzZWQgb25lIGlmIGl0IGV4aXN0XG4gICAgICBzb3VyY2U6IGNyb3NzZWREYXRhTmFtZSB8fCB0aGlzLmRhdGEsXG4gICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICBncm91cGJ5OiBjaGFubmVsID09PSAncm93JyA/IHRoaXMucm93RmllbGRzIDogdGhpcy5jb2x1bW5GaWVsZHMsXG4gICAgICAgIC4uLmFnZ3JlZ2F0ZUNoaWxkRmllbGRcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpIHtcbiAgICBjb25zdCBkYXRhOiBWZ0RhdGFbXSA9IFtdO1xuICAgIGxldCBjcm9zc2VkRGF0YU5hbWUgPSBudWxsO1xuICAgIGNvbnN0IGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcCA9IHRoaXMuZ2V0Q2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwKCk7XG5cbiAgICBpZiAodGhpcy5jb2x1bW5OYW1lICYmIHRoaXMucm93TmFtZSAmJiAoY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwLnggfHwgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwLnkpKSB7XG4gICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIGNyb3NzIGRhdGFzZXQgdG8gY29ycmVjdGx5IGNhbGN1bGF0ZSBjYXJkaW5hbGl0eVxuICAgICAgY3Jvc3NlZERhdGFOYW1lID0gYGNyb3NzXyR7dGhpcy5jb2x1bW5OYW1lfV8ke3RoaXMucm93TmFtZX1gO1xuXG4gICAgICBjb25zdCBmaWVsZHMgPSBbXS5jb25jYXQoXG4gICAgICAgIGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcC54ID8gW2NoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcC54XSA6IFtdLFxuICAgICAgICBjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAueSA/IFtjaGlsZEluZGVwZW5kZW50RmllbGRzV2l0aFN0ZXAueV0gOiBbXSxcbiAgICAgICk7XG4gICAgICBjb25zdCBvcHMgPSBmaWVsZHMubWFwKCgpOiBBZ2dyZWdhdGVPcCA9PiAnZGlzdGluY3QnKTtcblxuICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgbmFtZTogY3Jvc3NlZERhdGFOYW1lLFxuICAgICAgICBzb3VyY2U6IHRoaXMuZGF0YSxcbiAgICAgICAgdHJhbnNmb3JtOiBbe1xuICAgICAgICAgIHR5cGU6ICdhZ2dyZWdhdGUnLFxuICAgICAgICAgIGdyb3VwYnk6IHRoaXMuY29sdW1uRmllbGRzLmNvbmNhdCh0aGlzLnJvd0ZpZWxkcyksXG4gICAgICAgICAgZmllbGRzOiBmaWVsZHMsXG4gICAgICAgICAgb3BzXG4gICAgICAgIH1dXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb2x1bW5OYW1lKSB7XG4gICAgICBkYXRhLnB1c2godGhpcy5hc3NlbWJsZVJvd0NvbHVtbkRhdGEoJ2NvbHVtbicsIGNyb3NzZWREYXRhTmFtZSwgY2hpbGRJbmRlcGVuZGVudEZpZWxkc1dpdGhTdGVwKSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucm93TmFtZSkge1xuICAgICAgZGF0YS5wdXNoKHRoaXMuYXNzZW1ibGVSb3dDb2x1bW5EYXRhKCdyb3cnLCBjcm9zc2VkRGF0YU5hbWUsIGNoaWxkSW5kZXBlbmRlbnRGaWVsZHNXaXRoU3RlcCkpO1xuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isScaleChannel } from '../../channel';\nimport { vgField as fieldRef } from '../../fielddef';\nimport { isPathMark } from '../../mark';\nimport { hasContinuousDomain } from '../../scale';\nimport { keys } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar FilterInvalidNode = /** @class */ (function (_super) {\n tslib_1.__extends(FilterInvalidNode, _super);\n function FilterInvalidNode(parent, fieldDefs) {\n var _this = _super.call(this, parent) || this;\n _this.fieldDefs = fieldDefs;\n return _this;\n }\n FilterInvalidNode.prototype.clone = function () {\n return new FilterInvalidNode(null, tslib_1.__assign({}, this.fieldDefs));\n };\n FilterInvalidNode.make = function (parent, model) {\n var config = model.config, mark = model.mark;\n if (config.invalidValues !== 'filter') {\n return null;\n }\n var filter = model.reduceFieldDef(function (aggregator, fieldDef, channel) {\n var scaleComponent = isScaleChannel(channel) && model.getScaleComponent(channel);\n if (scaleComponent) {\n var scaleType = scaleComponent.get('type');\n // While discrete domain scales can handle invalid values, continuous scales can't.\n // Thus, for non-path marks, we have to filter null for scales with continuous domains.\n // (For path marks, we will use \"defined\" property and skip these values instead.)\n if (hasContinuousDomain(scaleType) && !fieldDef.aggregate && !isPathMark(mark)) {\n aggregator[fieldDef.field] = fieldDef;\n }\n }\n return aggregator;\n }, {});\n if (!keys(filter).length) {\n return null;\n }\n return new FilterInvalidNode(parent, filter);\n };\n Object.defineProperty(FilterInvalidNode.prototype, \"filter\", {\n get: function () {\n return this.fieldDefs;\n },\n enumerable: true,\n configurable: true\n });\n // create the VgTransforms for each of the filtered fields\n FilterInvalidNode.prototype.assemble = function () {\n var _this = this;\n var filters = keys(this.filter).reduce(function (vegaFilters, field) {\n var fieldDef = _this.fieldDefs[field];\n var ref = fieldRef(fieldDef, { expr: 'datum' });\n if (fieldDef !== null) {\n vegaFilters.push(ref + \" !== null\");\n vegaFilters.push(\"!isNaN(\" + ref + \")\");\n }\n return vegaFilters;\n }, []);\n return filters.length > 0 ?\n {\n type: 'filter',\n expr: filters.join(' && ')\n } : null;\n };\n return FilterInvalidNode;\n}(DataFlowNode));\nexport { FilterInvalidNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyaW52YWxpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZmlsdGVyaW52YWxpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQVcsT0FBTyxJQUFJLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzdELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFDLG1CQUFtQixFQUFZLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBTyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHdEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV4QztJQUF1Qyw2Q0FBWTtJQUtqRCwyQkFBWSxNQUFvQixFQUFVLFNBQWlDO1FBQTNFLFlBQ0Msa0JBQU0sTUFBTSxDQUFDLFNBQ2I7UUFGeUMsZUFBUyxHQUFULFNBQVMsQ0FBd0I7O0lBRTNFLENBQUM7SUFOTSxpQ0FBSyxHQUFaO1FBQ0UsT0FBTyxJQUFJLGlCQUFpQixDQUFDLElBQUksdUJBQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzFELENBQUM7SUFNYSxzQkFBSSxHQUFsQixVQUFtQixNQUFvQixFQUFFLEtBQWdCO1FBQ2hELElBQUEscUJBQU0sRUFBRSxpQkFBSSxDQUFVO1FBQzdCLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxRQUFRLEVBQUc7WUFDdEMsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBQyxVQUFrQyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQ3hGLElBQU0sY0FBYyxHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkYsSUFBSSxjQUFjLEVBQUU7Z0JBQ2xCLElBQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBRzdDLG1GQUFtRjtnQkFDbkYsdUZBQXVGO2dCQUN2RixrRkFBa0Y7Z0JBQ2xGLElBQUksbUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUM5RSxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLFFBQVEsQ0FBQztpQkFDdkM7YUFDRjtZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxFQUE0QixDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDeEIsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELHNCQUFJLHFDQUFNO2FBQVY7WUFDRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQzs7O09BQUE7SUFFRCwwREFBMEQ7SUFDbkQsb0NBQVEsR0FBZjtRQUFBLGlCQWlCQztRQWhCQyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFDLFdBQVcsRUFBRSxLQUFLO1lBQzFELElBQU0sUUFBUSxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsSUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1lBRWhELElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtnQkFDckIsV0FBVyxDQUFDLElBQUksQ0FBSSxHQUFHLGNBQVcsQ0FBQyxDQUFDO2dCQUNwQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVUsR0FBRyxNQUFHLENBQUMsQ0FBQzthQUNwQztZQUNELE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQjtnQkFDSSxJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDN0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ1gsQ0FBQztJQUNILHdCQUFDO0FBQUQsQ0FBQyxBQTdERCxDQUF1QyxZQUFZLEdBNkRsRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTY2FsZUNoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtGaWVsZERlZiwgdmdGaWVsZCBhcyBmaWVsZFJlZn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtpc1BhdGhNYXJrfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7aGFzQ29udGludW91c0RvbWFpbiwgU2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge0RpY3QsIGtleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0ZpbHRlclRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVySW52YWxpZE5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBGaWx0ZXJJbnZhbGlkTm9kZShudWxsLCB7Li4udGhpcy5maWVsZERlZnN9KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwcml2YXRlIGZpZWxkRGVmczogRGljdDxGaWVsZERlZjxzdHJpbmc+Pikge1xuICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IFVuaXRNb2RlbCk6IEZpbHRlckludmFsaWROb2RlIHtcbiAgICBjb25zdCB7Y29uZmlnLCBtYXJrfSA9IG1vZGVsO1xuICAgIGlmIChjb25maWcuaW52YWxpZFZhbHVlcyAhPT0gJ2ZpbHRlcicgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXIgPSBtb2RlbC5yZWR1Y2VGaWVsZERlZigoYWdncmVnYXRvcjogRGljdDxGaWVsZERlZjxzdHJpbmc+PiwgZmllbGREZWYsIGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gaXNTY2FsZUNoYW5uZWwoY2hhbm5lbCkgJiYgbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gICAgICBpZiAoc2NhbGVDb21wb25lbnQpIHtcbiAgICAgICAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGVDb21wb25lbnQuZ2V0KCd0eXBlJyk7XG5cblxuICAgICAgICAvLyBXaGlsZSBkaXNjcmV0ZSBkb21haW4gc2NhbGVzIGNhbiBoYW5kbGUgaW52YWxpZCB2YWx1ZXMsIGNvbnRpbnVvdXMgc2NhbGVzIGNhbid0LlxuICAgICAgICAvLyBUaHVzLCBmb3Igbm9uLXBhdGggbWFya3MsIHdlIGhhdmUgdG8gZmlsdGVyIG51bGwgZm9yIHNjYWxlcyB3aXRoIGNvbnRpbnVvdXMgZG9tYWlucy5cbiAgICAgICAgLy8gKEZvciBwYXRoIG1hcmtzLCB3ZSB3aWxsIHVzZSBcImRlZmluZWRcIiBwcm9wZXJ0eSBhbmQgc2tpcCB0aGVzZSB2YWx1ZXMgaW5zdGVhZC4pXG4gICAgICAgIGlmIChoYXNDb250aW51b3VzRG9tYWluKHNjYWxlVHlwZSkgJiYgIWZpZWxkRGVmLmFnZ3JlZ2F0ZSAmJiAhaXNQYXRoTWFyayhtYXJrKSkge1xuICAgICAgICAgIGFnZ3JlZ2F0b3JbZmllbGREZWYuZmllbGRdID0gZmllbGREZWY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhZ2dyZWdhdG9yO1xuICAgIH0sIHt9IGFzIERpY3Q8RmllbGREZWY8c3RyaW5nPj4pO1xuXG4gICAgaWYgKCFrZXlzKGZpbHRlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZpbHRlckludmFsaWROb2RlKHBhcmVudCwgZmlsdGVyKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmllbGREZWZzO1xuICB9XG5cbiAgLy8gY3JlYXRlIHRoZSBWZ1RyYW5zZm9ybXMgZm9yIGVhY2ggb2YgdGhlIGZpbHRlcmVkIGZpZWxkc1xuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdGaWx0ZXJUcmFuc2Zvcm0ge1xuICAgIGNvbnN0IGZpbHRlcnMgPSBrZXlzKHRoaXMuZmlsdGVyKS5yZWR1Y2UoKHZlZ2FGaWx0ZXJzLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgZmllbGREZWYgPSB0aGlzLmZpZWxkRGVmc1tmaWVsZF07XG4gICAgICBjb25zdCByZWYgPSBmaWVsZFJlZihmaWVsZERlZiwge2V4cHI6ICdkYXR1bSd9KTtcblxuICAgICAgaWYgKGZpZWxkRGVmICE9PSBudWxsKSB7XG4gICAgICAgIHZlZ2FGaWx0ZXJzLnB1c2goYCR7cmVmfSAhPT0gbnVsbGApO1xuICAgICAgICB2ZWdhRmlsdGVycy5wdXNoKGAhaXNOYU4oJHtyZWZ9KWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZlZ2FGaWx0ZXJzO1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBmaWx0ZXJzLmxlbmd0aCA+IDAgP1xuICAgIHtcbiAgICAgICAgdHlwZTogJ2ZpbHRlcicsXG4gICAgICAgIGV4cHI6IGZpbHRlcnMuam9pbignICYmICcpXG4gICAgfSA6IG51bGw7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isNumber, isString, toSet } from 'vega-util';\nimport { isCountingAggregateOp } from '../../aggregate';\nimport { isDateTime } from '../../datetime';\nimport { isNumberFieldDef, isScaleFieldDef, isTimeFieldDef } from '../../fielddef';\nimport * as log from '../../log';\nimport { forEachLeaf } from '../../logical';\nimport { isFieldEqualPredicate, isFieldOneOfPredicate, isFieldPredicate, isFieldRangePredicate } from '../../predicate';\nimport { isSortField } from '../../sort';\nimport { accessPathDepth, accessPathWithDatum, duplicate, keys, removePathFromField } from '../../util';\nimport { isFacetModel, isUnitModel } from '../model';\nimport { Split } from '../split';\nimport { DataFlowNode } from './dataflow';\n/**\n * @param field The field.\n * @param parse What to parse the field as.\n */\nfunction parseExpression(field, parse) {\n var f = accessPathWithDatum(field);\n if (parse === 'number') {\n return \"toNumber(\" + f + \")\";\n }\n else if (parse === 'boolean') {\n return \"toBoolean(\" + f + \")\";\n }\n else if (parse === 'string') {\n return \"toString(\" + f + \")\";\n }\n else if (parse === 'date') {\n return \"toDate(\" + f + \")\";\n }\n else if (parse === 'flatten') {\n return f;\n }\n else if (parse.indexOf('date:') === 0) {\n var specifier = parse.slice(5, parse.length);\n return \"timeParse(\" + f + \",\" + specifier + \")\";\n }\n else if (parse.indexOf('utc:') === 0) {\n var specifier = parse.slice(4, parse.length);\n return \"utcParse(\" + f + \",\" + specifier + \")\";\n }\n else {\n log.warn(log.message.unrecognizedParse(parse));\n return null;\n }\n}\nvar ParseNode = /** @class */ (function (_super) {\n tslib_1.__extends(ParseNode, _super);\n function ParseNode(parent, parse) {\n var _this = _super.call(this, parent) || this;\n _this._parse = parse;\n return _this;\n }\n ParseNode.prototype.clone = function () {\n return new ParseNode(null, duplicate(this._parse));\n };\n /**\n * Creates a parse node from a data.format.parse and updates ancestorParse.\n */\n ParseNode.makeExplicit = function (parent, model, ancestorParse) {\n // Custom parse\n var explicit = {};\n var data = model.data;\n if (data && data.format && data.format.parse) {\n explicit = data.format.parse;\n }\n return this.makeWithAncestors(parent, explicit, {}, ancestorParse);\n };\n ParseNode.makeImplicitFromFilterTransform = function (parent, transform, ancestorParse) {\n var parse = {};\n forEachLeaf(transform.filter, function (filter) {\n if (isFieldPredicate(filter)) {\n // Automatically add a parse node for filters with filter objects\n var val = null;\n // For EqualFilter, just use the equal property.\n // For RangeFilter and OneOfFilter, all array members should have\n // the same type, so we only use the first one.\n if (isFieldEqualPredicate(filter)) {\n val = filter.equal;\n }\n else if (isFieldRangePredicate(filter)) {\n val = filter.range[0];\n }\n else if (isFieldOneOfPredicate(filter)) {\n val = (filter.oneOf || filter['in'])[0];\n } // else -- for filter expression, we can't infer anything\n if (val) {\n if (isDateTime(val)) {\n parse[filter.field] = 'date';\n }\n else if (isNumber(val)) {\n parse[filter.field] = 'number';\n }\n else if (isString(val)) {\n parse[filter.field] = 'string';\n }\n }\n if (filter.timeUnit) {\n parse[filter.field] = 'date';\n }\n }\n });\n if (keys(parse).length === 0) {\n return null;\n }\n return this.makeWithAncestors(parent, {}, parse, ancestorParse);\n };\n /**\n * Creates a parse node for implicit parsing from a model and updates ancestorParse.\n */\n ParseNode.makeImplicitFromEncoding = function (parent, model, ancestorParse) {\n var implicit = {};\n if (isUnitModel(model) || isFacetModel(model)) {\n // Parse encoded fields\n model.forEachFieldDef(function (fieldDef) {\n if (isTimeFieldDef(fieldDef)) {\n implicit[fieldDef.field] = 'date';\n }\n else if (isNumberFieldDef(fieldDef)) {\n if (!isCountingAggregateOp(fieldDef.aggregate)) {\n implicit[fieldDef.field] = 'number';\n }\n }\n else if (accessPathDepth(fieldDef.field) > 1) {\n // For non-date/non-number (strings and booleans), derive a flattened field for a referenced nested field.\n // (Parsing numbers / dates already flattens numeric and temporal fields.)\n if (!(fieldDef.field in implicit)) {\n implicit[fieldDef.field] = 'flatten';\n }\n }\n else if (isScaleFieldDef(fieldDef) && isSortField(fieldDef.sort) && accessPathDepth(fieldDef.sort.field) > 1) {\n // Flatten fields that we sort by but that are not otherwise flattened.\n if (!(fieldDef.sort.field in implicit)) {\n implicit[fieldDef.sort.field] = 'flatten';\n }\n }\n });\n }\n return this.makeWithAncestors(parent, {}, implicit, ancestorParse);\n };\n /**\n * Creates a parse node from \"explicit\" parse and \"implicit\" parse and updates ancestorParse.\n */\n ParseNode.makeWithAncestors = function (parent, explicit, implicit, ancestorParse) {\n // We should not parse what has already been parsed in a parent (explicitly or implicitly) or what has been derived (maked as \"derived\"). We also don't need to flatten a field that has already been parsed.\n for (var _i = 0, _a = keys(implicit); _i < _a.length; _i++) {\n var field = _a[_i];\n var parsedAs = ancestorParse.getWithExplicit(field);\n if (parsedAs.value !== undefined) {\n // We always ignore derived fields even if they are implicitly defined because we expect users to create the right types.\n if (parsedAs.explicit || parsedAs.value === implicit[field] || parsedAs.value === 'derived' || implicit[field] === 'flatten') {\n delete implicit[field];\n }\n else {\n log.warn(log.message.differentParse(field, implicit[field], parsedAs.value));\n }\n }\n }\n for (var _b = 0, _c = keys(explicit); _b < _c.length; _b++) {\n var field = _c[_b];\n var parsedAs = ancestorParse.get(field);\n if (parsedAs !== undefined) {\n // Don't parse a field again if it has been parsed with the same type already.\n if (parsedAs === explicit[field]) {\n delete explicit[field];\n }\n else {\n log.warn(log.message.differentParse(field, explicit[field], parsedAs));\n }\n }\n }\n var parse = new Split(explicit, implicit);\n // add the format parse from this model so that children don't parse the same field again\n ancestorParse.copyAll(parse);\n // copy only non-null parses\n var p = {};\n for (var _d = 0, _e = keys(parse.combine()); _d < _e.length; _d++) {\n var key = _e[_d];\n var val = parse.get(key);\n if (val !== null) {\n p[key] = val;\n }\n }\n if (keys(p).length === 0 || ancestorParse.parseNothing) {\n return null;\n }\n return new ParseNode(parent, p);\n };\n Object.defineProperty(ParseNode.prototype, \"parse\", {\n get: function () {\n return this._parse;\n },\n enumerable: true,\n configurable: true\n });\n ParseNode.prototype.merge = function (other) {\n this._parse = tslib_1.__assign({}, this._parse, other.parse);\n other.remove();\n };\n /**\n * Assemble an object for Vega's format.parse property.\n */\n ParseNode.prototype.assembleFormatParse = function () {\n var formatParse = {};\n for (var _i = 0, _a = keys(this._parse); _i < _a.length; _i++) {\n var field = _a[_i];\n var p = this._parse[field];\n if (accessPathDepth(field) === 1) {\n formatParse[field] = p;\n }\n }\n return formatParse;\n };\n // format parse depends and produces all fields in its parse\n ParseNode.prototype.producedFields = function () {\n return toSet(keys(this._parse));\n };\n ParseNode.prototype.dependentFields = function () {\n return toSet(keys(this._parse));\n };\n ParseNode.prototype.assembleTransforms = function (onlyNested) {\n var _this = this;\n if (onlyNested === void 0) { onlyNested = false; }\n return keys(this._parse)\n .filter(function (field) { return onlyNested ? accessPathDepth(field) > 1 : true; })\n .map(function (field) {\n var expr = parseExpression(field, _this._parse[field]);\n if (!expr) {\n return null;\n }\n var formula = {\n type: 'formula',\n expr: expr,\n as: removePathFromField(field) // Vega output is always flattened\n };\n return formula;\n }).filter(function (t) { return t !== null; });\n };\n return ParseNode;\n}(DataFlowNode));\nexport { ParseNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0cGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Zvcm1hdHBhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFcEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFXLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUMscUJBQXFCLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0SCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE9BQU8sRUFBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQVEsU0FBUyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBWSxNQUFNLFlBQVksQ0FBQztBQUV2SCxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBUSxNQUFNLFVBQVUsQ0FBQztBQUMxRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHeEM7OztHQUdHO0FBQ0gseUJBQXlCLEtBQWEsRUFBRSxLQUFhO0lBQ25ELElBQU0sQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUN0QixPQUFPLGNBQVks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QUFPLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBTSxPQUFPLEdBQXVCO2dCQUNsQyxJQUFJLEVBQUUsU0FBUztnQkFDZixJQUFJLE1BQUE7Z0JBQ0osRUFBRSxFQUFFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFFLGtDQUFrQzthQUNuRSxDQUFDO1lBQ0YsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxLQUFLLElBQUksRUFBVixDQUFVLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0gsZ0JBQUM7QUFBRCxDQUFDLEFBdk1ELENBQStCLFlBQVksR0F1TTFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc051bWJlciwgaXNTdHJpbmcsIHRvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtBbmNlc3RvclBhcnNlfSBmcm9tICcuJztcbmltcG9ydCB7aXNDb3VudGluZ0FnZ3JlZ2F0ZU9wfSBmcm9tICcuLi8uLi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtEYXRlVGltZSwgaXNEYXRlVGltZX0gZnJvbSAnLi4vLi4vZGF0ZXRpbWUnO1xuaW1wb3J0IHtpc051bWJlckZpZWxkRGVmLCBpc1NjYWxlRmllbGREZWYsIGlzVGltZUZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7Zm9yRWFjaExlYWZ9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtpc0ZpZWxkRXF1YWxQcmVkaWNhdGUsIGlzRmllbGRPbmVPZlByZWRpY2F0ZSwgaXNGaWVsZFByZWRpY2F0ZSwgaXNGaWVsZFJhbmdlUHJlZGljYXRlfSBmcm9tICcuLi8uLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtpc1NvcnRGaWVsZH0gZnJvbSAnLi4vLi4vc29ydCc7XG5pbXBvcnQge0ZpbHRlclRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7YWNjZXNzUGF0aERlcHRoLCBhY2Nlc3NQYXRoV2l0aERhdHVtLCBEaWN0LCBkdXBsaWNhdGUsIGtleXMsIHJlbW92ZVBhdGhGcm9tRmllbGQsIFN0cmluZ1NldH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRm9ybXVsYVRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5cbi8qKlxuICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZC5cbiAqIEBwYXJhbSBwYXJzZSBXaGF0IHRvIHBhcnNlIHRoZSBmaWVsZCBhcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VFeHByZXNzaW9uKGZpZWxkOiBzdHJpbmcsIHBhcnNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBmID0gYWNjZXNzUGF0aFdpdGhEYXR1bShmaWVsZCk7XG4gIGlmIChwYXJzZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gYHRvTnVtYmVyKCR7Zn0pYDtcbiAgfSBlbHNlIGlmIChwYXJzZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgcmV0dXJuIGB0b0Jvb2xlYW4oJHtmfSlgO1xuICB9IGVsc2UgaWYgKHBhcnNlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgdG9TdHJpbmcoJHtmfSlgO1xuICB9IGVsc2UgaWYgKHBhcnNlID09PSAnZGF0ZScpIHtcbiAgICByZXR1cm4gYHRvRGF0ZSgke2Z9KWA7XG4gIH0gZWxzZSBpZiAocGFyc2UgPT09ICdmbGF0dGVuJykge1xuICAgIHJldHVybiBmO1xuICB9IGVsc2UgaWYgKHBhcnNlLmluZGV4T2YoJ2RhdGU6JykgPT09IDApIHtcbiAgICBjb25zdCBzcGVjaWZpZXIgPSBwYXJzZS5zbGljZSg1LCBwYXJzZS5sZW5ndGgpO1xuICAgIHJldHVybiBgdGltZVBhcnNlKCR7Zn0sJHtzcGVjaWZpZXJ9KWA7XG4gIH0gZWxzZSBpZiAocGFyc2UuaW5kZXhPZigndXRjOicpID09PSAwKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVyID0gcGFyc2Uuc2xpY2UoNCwgcGFyc2UubGVuZ3RoKTtcbiAgICByZXR1cm4gYHV0Y1BhcnNlKCR7Zn0sJHtzcGVjaWZpZXJ9KWA7XG4gIH0gZWxzZSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UudW5yZWNvZ25pemVkUGFyc2UocGFyc2UpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBfcGFyc2U6IERpY3Q8c3RyaW5nPjtcblxuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBQYXJzZU5vZGUobnVsbCwgZHVwbGljYXRlKHRoaXMuX3BhcnNlKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcGFyc2U6IERpY3Q8c3RyaW5nPikge1xuICAgIHN1cGVyKHBhcmVudCk7XG5cbiAgICB0aGlzLl9wYXJzZSA9IHBhcnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYXJzZSBub2RlIGZyb20gYSBkYXRhLmZvcm1hdC5wYXJzZSBhbmQgdXBkYXRlcyBhbmNlc3RvclBhcnNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBtYWtlRXhwbGljaXQocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbCwgYW5jZXN0b3JQYXJzZTogQW5jZXN0b3JQYXJzZSkge1xuICAgIC8vIEN1c3RvbSBwYXJzZVxuICAgIGxldCBleHBsaWNpdCA9IHt9O1xuICAgIGNvbnN0IGRhdGEgPSBtb2RlbC5kYXRhO1xuICAgIGlmIChkYXRhICYmIGRhdGEuZm9ybWF0ICYmIGRhdGEuZm9ybWF0LnBhcnNlKSB7XG4gICAgICBleHBsaWNpdCA9IGRhdGEuZm9ybWF0LnBhcnNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwgZXhwbGljaXQsIHt9LCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUltcGxpY2l0RnJvbUZpbHRlclRyYW5zZm9ybShwYXJlbnQ6IERhdGFGbG93Tm9kZSwgdHJhbnNmb3JtOiBGaWx0ZXJUcmFuc2Zvcm0sIGFuY2VzdG9yUGFyc2U6IEFuY2VzdG9yUGFyc2UpIHtcbiAgICBjb25zdCBwYXJzZSA9IHt9O1xuICAgIGZvckVhY2hMZWFmKHRyYW5zZm9ybS5maWx0ZXIsIGZpbHRlciA9PiB7XG4gICAgICBpZiAoaXNGaWVsZFByZWRpY2F0ZShmaWx0ZXIpKSB7XG4gICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgYWRkIGEgcGFyc2Ugbm9kZSBmb3IgZmlsdGVycyB3aXRoIGZpbHRlciBvYmplY3RzXG4gICAgICAgIGxldCB2YWw6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlVGltZSA9IG51bGw7XG5cbiAgICAgICAgLy8gRm9yIEVxdWFsRmlsdGVyLCBqdXN0IHVzZSB0aGUgZXF1YWwgcHJvcGVydHkuXG4gICAgICAgIC8vIEZvciBSYW5nZUZpbHRlciBhbmQgT25lT2ZGaWx0ZXIsIGFsbCBhcnJheSBtZW1iZXJzIHNob3VsZCBoYXZlXG4gICAgICAgIC8vIHRoZSBzYW1lIHR5cGUsIHNvIHdlIG9ubHkgdXNlIHRoZSBmaXJzdCBvbmUuXG4gICAgICAgIGlmIChpc0ZpZWxkRXF1YWxQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IGZpbHRlci5lcXVhbDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpZWxkUmFuZ2VQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IGZpbHRlci5yYW5nZVswXTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpZWxkT25lT2ZQcmVkaWNhdGUoZmlsdGVyKSkge1xuICAgICAgICAgIHZhbCA9IChmaWx0ZXIub25lT2YgfHwgZmlsdGVyWydpbiddKVswXTtcbiAgICAgICAgfSAvLyBlbHNlIC0tIGZvciBmaWx0ZXIgZXhwcmVzc2lvbiwgd2UgY2FuJ3QgaW5mZXIgYW55dGhpbmdcbiAgICAgICAgaWYgKHZhbCkge1xuICAgICAgICAgIGlmIChpc0RhdGVUaW1lKHZhbCkpIHtcbiAgICAgICAgICAgIHBhcnNlW2ZpbHRlci5maWVsZF0gPSAnZGF0ZSc7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgICBwYXJzZVtmaWx0ZXIuZmllbGRdID0gJ251bWJlcic7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyh2YWwpKSB7XG4gICAgICAgICAgICBwYXJzZVtmaWx0ZXIuZmllbGRdID0gJ3N0cmluZyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZpbHRlci50aW1lVW5pdCkge1xuICAgICAgICAgIHBhcnNlW2ZpbHRlci5maWVsZF0gPSAnZGF0ZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChrZXlzKHBhcnNlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwge30sIHBhcnNlLCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyc2Ugbm9kZSBmb3IgaW1wbGljaXQgcGFyc2luZyBmcm9tIGEgbW9kZWwgYW5kIHVwZGF0ZXMgYW5jZXN0b3JQYXJzZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogTW9kZWwsIGFuY2VzdG9yUGFyc2U6IEFuY2VzdG9yUGFyc2UpIHtcbiAgICBjb25zdCBpbXBsaWNpdCA9IHt9O1xuXG4gICAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgICAvLyBQYXJzZSBlbmNvZGVkIGZpZWxkc1xuICAgICAgbW9kZWwuZm9yRWFjaEZpZWxkRGVmKGZpZWxkRGVmID0+IHtcbiAgICAgICAgaWYgKGlzVGltZUZpZWxkRGVmKGZpZWxkRGVmKSkge1xuICAgICAgICAgIGltcGxpY2l0W2ZpZWxkRGVmLmZpZWxkXSA9ICdkYXRlJztcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlckZpZWxkRGVmKGZpZWxkRGVmKSkge1xuICAgICAgICAgIGlmICghaXNDb3VudGluZ0FnZ3JlZ2F0ZU9wKGZpZWxkRGVmLmFnZ3JlZ2F0ZSkpIHtcbiAgICAgICAgICAgIGltcGxpY2l0W2ZpZWxkRGVmLmZpZWxkXSA9ICdudW1iZXInO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChhY2Nlc3NQYXRoRGVwdGgoZmllbGREZWYuZmllbGQpID4gMSkge1xuICAgICAgICAgIC8vIEZvciBub24tZGF0ZS9ub24tbnVtYmVyIChzdHJpbmdzIGFuZCBib29sZWFucyksIGRlcml2ZSBhIGZsYXR0ZW5lZCBmaWVsZCBmb3IgYSByZWZlcmVuY2VkIG5lc3RlZCBmaWVsZC5cbiAgICAgICAgICAvLyAoUGFyc2luZyBudW1iZXJzIC8gZGF0ZXMgYWxyZWFkeSBmbGF0dGVucyBudW1lcmljIGFuZCB0ZW1wb3JhbCBmaWVsZHMuKVxuICAgICAgICAgIGlmICghKGZpZWxkRGVmLmZpZWxkIGluIGltcGxpY2l0KSkge1xuICAgICAgICAgICAgaW1wbGljaXRbZmllbGREZWYuZmllbGRdID0gJ2ZsYXR0ZW4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1NjYWxlRmllbGREZWYoZmllbGREZWYpICYmIGlzU29ydEZpZWxkKGZpZWxkRGVmLnNvcnQpICYmIGFjY2Vzc1BhdGhEZXB0aChmaWVsZERlZi5zb3J0LmZpZWxkKSA+IDEpIHtcbiAgICAgICAgICAvLyBGbGF0dGVuIGZpZWxkcyB0aGF0IHdlIHNvcnQgYnkgYnV0IHRoYXQgYXJlIG5vdCBvdGhlcndpc2UgZmxhdHRlbmVkLlxuICAgICAgICAgIGlmICghKGZpZWxkRGVmLnNvcnQuZmllbGQgaW4gaW1wbGljaXQpKSB7XG4gICAgICAgICAgICBpbXBsaWNpdFtmaWVsZERlZi5zb3J0LmZpZWxkXSA9ICdmbGF0dGVuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1ha2VXaXRoQW5jZXN0b3JzKHBhcmVudCwge30sIGltcGxpY2l0LCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcGFyc2Ugbm9kZSBmcm9tIFwiZXhwbGljaXRcIiBwYXJzZSBhbmQgXCJpbXBsaWNpdFwiIHBhcnNlIGFuZCB1cGRhdGVzIGFuY2VzdG9yUGFyc2UuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBtYWtlV2l0aEFuY2VzdG9ycyhwYXJlbnQ6IERhdGFGbG93Tm9kZSwgZXhwbGljaXQ6IERpY3Q8c3RyaW5nPiwgaW1wbGljaXQ6IERpY3Q8c3RyaW5nPiwgYW5jZXN0b3JQYXJzZTogQW5jZXN0b3JQYXJzZSkge1xuICAgIC8vIFdlIHNob3VsZCBub3QgcGFyc2Ugd2hhdCBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZCBpbiBhIHBhcmVudCAoZXhwbGljaXRseSBvciBpbXBsaWNpdGx5KSBvciB3aGF0IGhhcyBiZWVuIGRlcml2ZWQgKG1ha2VkIGFzIFwiZGVyaXZlZFwiKS4gV2UgYWxzbyBkb24ndCBuZWVkIHRvIGZsYXR0ZW4gYSBmaWVsZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLlxuICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyhpbXBsaWNpdCkpIHtcbiAgICAgIGNvbnN0IHBhcnNlZEFzID0gYW5jZXN0b3JQYXJzZS5nZXRXaXRoRXhwbGljaXQoZmllbGQpO1xuICAgICAgaWYgKHBhcnNlZEFzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gV2UgYWx3YXlzIGlnbm9yZSBkZXJpdmVkIGZpZWxkcyBldmVuIGlmIHRoZXkgYXJlIGltcGxpY2l0bHkgZGVmaW5lZCBiZWNhdXNlIHdlIGV4cGVjdCB1c2VycyB0byBjcmVhdGUgdGhlIHJpZ2h0IHR5cGVzLlxuICAgICAgICBpZiAocGFyc2VkQXMuZXhwbGljaXQgfHwgcGFyc2VkQXMudmFsdWUgPT09IGltcGxpY2l0W2ZpZWxkXSB8fCBwYXJzZWRBcy52YWx1ZSA9PT0gJ2Rlcml2ZWQnIHx8IGltcGxpY2l0W2ZpZWxkXSA9PT0gJ2ZsYXR0ZW4nKSB7XG4gICAgICAgICAgZGVsZXRlIGltcGxpY2l0W2ZpZWxkXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kaWZmZXJlbnRQYXJzZShmaWVsZCwgaW1wbGljaXRbZmllbGRdLCBwYXJzZWRBcy52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBrZXlzKGV4cGxpY2l0KSkge1xuICAgICAgY29uc3QgcGFyc2VkQXMgPSBhbmNlc3RvclBhcnNlLmdldChmaWVsZCk7XG4gICAgICBpZiAocGFyc2VkQXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBEb24ndCBwYXJzZSBhIGZpZWxkIGFnYWluIGlmIGl0IGhhcyBiZWVuIHBhcnNlZCB3aXRoIHRoZSBzYW1lIHR5cGUgYWxyZWFkeS5cbiAgICAgICAgaWYgKHBhcnNlZEFzID09PSBleHBsaWNpdFtmaWVsZF0pIHtcbiAgICAgICAgICBkZWxldGUgZXhwbGljaXRbZmllbGRdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRpZmZlcmVudFBhcnNlKGZpZWxkLCBleHBsaWNpdFtmaWVsZF0sIHBhcnNlZEFzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZSA9IG5ldyBTcGxpdChleHBsaWNpdCwgaW1wbGljaXQpO1xuXG4gICAgLy8gYWRkIHRoZSBmb3JtYXQgcGFyc2UgZnJvbSB0aGlzIG1vZGVsIHNvIHRoYXQgY2hpbGRyZW4gZG9uJ3QgcGFyc2UgdGhlIHNhbWUgZmllbGQgYWdhaW5cbiAgICBhbmNlc3RvclBhcnNlLmNvcHlBbGwocGFyc2UpO1xuXG4gICAgLy8gY29weSBvbmx5IG5vbi1udWxsIHBhcnNlc1xuICAgIGNvbnN0IHAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKHBhcnNlLmNvbWJpbmUoKSkpIHtcbiAgICAgIGNvbnN0IHZhbCA9IHBhcnNlLmdldChrZXkpO1xuICAgICAgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgICBwW2tleV0gPSB2YWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGtleXMocCkubGVuZ3RoID09PSAwIHx8IGFuY2VzdG9yUGFyc2UucGFyc2VOb3RoaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnNlTm9kZShwYXJlbnQsIHApO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyc2U7XG4gIH1cblxuICBwdWJsaWMgbWVyZ2Uob3RoZXI6IFBhcnNlTm9kZSkge1xuICAgIHRoaXMuX3BhcnNlID0gey4uLnRoaXMuX3BhcnNlLCAuLi5vdGhlci5wYXJzZX07XG4gICAgb3RoZXIucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUgYW4gb2JqZWN0IGZvciBWZWdhJ3MgZm9ybWF0LnBhcnNlIHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGFzc2VtYmxlRm9ybWF0UGFyc2UoKSB7XG4gICAgY29uc3QgZm9ybWF0UGFyc2UgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGtleXModGhpcy5fcGFyc2UpKSB7XG4gICAgICBjb25zdCBwID0gdGhpcy5fcGFyc2VbZmllbGRdO1xuICAgICAgaWYgKGFjY2Vzc1BhdGhEZXB0aChmaWVsZCkgPT09IDEpIHtcbiAgICAgICAgZm9ybWF0UGFyc2VbZmllbGRdID0gcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1hdFBhcnNlO1xuICB9XG5cbiAgLy8gZm9ybWF0IHBhcnNlIGRlcGVuZHMgYW5kIHByb2R1Y2VzIGFsbCBmaWVsZHMgaW4gaXRzIHBhcnNlXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpOiBTdHJpbmdTZXQge1xuICAgIHJldHVybiB0b1NldChrZXlzKHRoaXMuX3BhcnNlKSk7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kZW50RmllbGRzKCk6IFN0cmluZ1NldCB7XG4gICAgcmV0dXJuIHRvU2V0KGtleXModGhpcy5fcGFyc2UpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVRyYW5zZm9ybXMob25seU5lc3RlZCA9IGZhbHNlKTogVmdGb3JtdWxhVHJhbnNmb3JtW10ge1xuICAgIHJldHVybiBrZXlzKHRoaXMuX3BhcnNlKVxuICAgICAgLmZpbHRlcihmaWVsZCA9PiBvbmx5TmVzdGVkID8gYWNjZXNzUGF0aERlcHRoKGZpZWxkKSA+IDEgOiB0cnVlKVxuICAgICAgLm1hcChmaWVsZCA9PiB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oZmllbGQsIHRoaXMuX3BhcnNlW2ZpZWxkXSk7XG4gICAgICAgIGlmICghZXhwcikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybXVsYTogVmdGb3JtdWxhVHJhbnNmb3JtID0ge1xuICAgICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgICBleHByLFxuICAgICAgICAgIGFzOiByZW1vdmVQYXRoRnJvbUZpZWxkKGZpZWxkKSAgLy8gVmVnYSBvdXRwdXQgaXMgYWx3YXlzIGZsYXR0ZW5lZFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gZm9ybXVsYTtcbiAgICAgIH0pLmZpbHRlcih0ID0+IHQgIT09IG51bGwpO1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isInlineData, isNamedData, isUrlData } from '../../data';\nimport { contains, hash } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar SourceNode = /** @class */ (function (_super) {\n tslib_1.__extends(SourceNode, _super);\n function SourceNode(data) {\n var _this = _super.call(this, null) || this;\n data = data || { name: 'source' };\n if (isInlineData(data)) {\n _this._data = { values: data.values };\n }\n else if (isUrlData(data)) {\n _this._data = { url: data.url };\n if (!data.format) {\n data.format = {};\n }\n if (!data.format || !data.format.type) {\n // Extract extension from URL using snippet from\n // http://stackoverflow.com/questions/680929/how-to-extract-extension-from-filename-string-in-javascript\n var defaultExtension = /(?:\\.([^.]+))?$/.exec(data.url)[1];\n if (!contains(['json', 'csv', 'tsv', 'dsv', 'topojson'], defaultExtension)) {\n defaultExtension = 'json';\n }\n // defaultExtension has type string but we ensure that it is DataFormatType above\n data.format.type = defaultExtension;\n }\n }\n else if (isNamedData(data)) {\n _this._data = {};\n }\n // any dataset can be named\n if (data.name) {\n _this._name = data.name;\n }\n if (data.format) {\n var _a = data.format, _b = _a.parse, parse = _b === void 0 ? null : _b, format = tslib_1.__rest(_a, [\"parse\"]);\n _this._data.format = format;\n }\n return _this;\n }\n Object.defineProperty(SourceNode.prototype, \"data\", {\n get: function () {\n return this._data;\n },\n enumerable: true,\n configurable: true\n });\n SourceNode.prototype.hasName = function () {\n return !!this._name;\n };\n Object.defineProperty(SourceNode.prototype, \"dataName\", {\n get: function () {\n return this._name;\n },\n set: function (name) {\n this._name = name;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(SourceNode.prototype, \"parent\", {\n set: function (parent) {\n throw new Error('Source nodes have to be roots.');\n },\n enumerable: true,\n configurable: true\n });\n SourceNode.prototype.remove = function () {\n throw new Error('Source nodes are roots and cannot be removed.');\n };\n /**\n * Return a unique identifier for this data source.\n */\n SourceNode.prototype.hash = function () {\n if (isInlineData(this._data)) {\n if (!this._hash) {\n // Hashing can be expensive for large inline datasets.\n this._hash = hash(this._data);\n }\n return this._hash;\n }\n else if (isUrlData(this._data)) {\n return hash([this._data.url, this._data.format]);\n }\n else {\n return this._name;\n }\n };\n SourceNode.prototype.assemble = function () {\n return tslib_1.__assign({ name: this._name }, this._data, { transform: [] });\n };\n return SourceNode;\n}(DataFlowNode));\nexport { SourceNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBdUIsWUFBWSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEYsT0FBTyxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFMUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV4QztJQUFnQyxzQ0FBWTtJQU8xQyxvQkFBWSxJQUFVO1FBQXRCLFlBQ0Usa0JBQU0sSUFBSSxDQUFDLFNBcUNaO1FBbkNDLElBQUksR0FBRyxJQUFJLElBQUksRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUM7UUFFaEMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEIsS0FBSSxDQUFDLEtBQUssR0FBRyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUM7U0FDcEM7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixLQUFJLENBQUMsS0FBSyxHQUFHLEVBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUMsQ0FBQztZQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7YUFDbEI7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO2dCQUNyQyxnREFBZ0Q7Z0JBQ2hELHdHQUF3RztnQkFDeEcsSUFBSSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLEVBQUU7b0JBQzFFLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztpQkFDM0I7Z0JBRUQsaUZBQWlGO2dCQUNqRixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxnQkFBa0MsQ0FBQzthQUN2RDtTQUNGO2FBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDNUIsS0FBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDakI7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2IsS0FBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBTSxnQkFBdUMsRUFBdEMsYUFBWSxFQUFaLGlDQUFZLEVBQUUsc0NBQXdCLENBQUM7WUFDOUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1NBQzVCOztJQUNILENBQUM7SUFFRCxzQkFBSSw0QkFBSTthQUFSO1lBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3BCLENBQUM7OztPQUFBO0lBRU0sNEJBQU8sR0FBZDtRQUNFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELHNCQUFJLGdDQUFRO2FBQVo7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzthQUVELFVBQWEsSUFBWTtZQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDOzs7T0FKQTtJQU1ELHNCQUFJLDhCQUFNO2FBQVYsVUFBVyxNQUFvQjtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQzs7O09BQUE7SUFFTSwyQkFBTSxHQUFiO1FBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7T0FFRztJQUNJLHlCQUFJLEdBQVg7UUFDRSxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2Ysc0RBQXNEO2dCQUN0RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbkI7YUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7U0FDbEQ7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFTSw2QkFBUSxHQUFmO1FBQ0UsMEJBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLElBQ2IsSUFBSSxDQUFDLEtBQUssSUFDYixTQUFTLEVBQUUsRUFBRSxJQUNiO0lBQ0osQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQS9GRCxDQUFnQyxZQUFZLEdBK0YzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0YSwgRGF0YUZvcm1hdFR5cGUsIGlzSW5saW5lRGF0YSwgaXNOYW1lZERhdGEsIGlzVXJsRGF0YX0gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQge2NvbnRhaW5zLCBoYXNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdEYXRhfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbmV4cG9ydCBjbGFzcyBTb3VyY2VOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBfZGF0YTogUGFydGlhbDxWZ0RhdGE+O1xuXG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICBwcml2YXRlIF9oYXNoOiBzdHJpbmcgfCBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRGF0YSkge1xuICAgIHN1cGVyKG51bGwpOyAgLy8gc291cmNlIGNhbm5vdCBoYXZlIHBhcmVudFxuXG4gICAgZGF0YSA9IGRhdGEgfHwge25hbWU6ICdzb3VyY2UnfTtcblxuICAgIGlmIChpc0lubGluZURhdGEoZGF0YSkpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB7dmFsdWVzOiBkYXRhLnZhbHVlc307XG4gICAgfSBlbHNlIGlmIChpc1VybERhdGEoZGF0YSkpIHtcbiAgICAgIHRoaXMuX2RhdGEgPSB7dXJsOiBkYXRhLnVybH07XG5cbiAgICAgIGlmICghZGF0YS5mb3JtYXQpIHtcbiAgICAgICAgZGF0YS5mb3JtYXQgPSB7fTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFkYXRhLmZvcm1hdCB8fCAhZGF0YS5mb3JtYXQudHlwZSkge1xuICAgICAgICAvLyBFeHRyYWN0IGV4dGVuc2lvbiBmcm9tIFVSTCB1c2luZyBzbmlwcGV0IGZyb21cbiAgICAgICAgLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82ODA5MjkvaG93LXRvLWV4dHJhY3QtZXh0ZW5zaW9uLWZyb20tZmlsZW5hbWUtc3RyaW5nLWluLWphdmFzY3JpcHRcbiAgICAgICAgbGV0IGRlZmF1bHRFeHRlbnNpb24gPSAvKD86XFwuKFteLl0rKSk/JC8uZXhlYyhkYXRhLnVybClbMV07XG4gICAgICAgIGlmICghY29udGFpbnMoWydqc29uJywgJ2NzdicsICd0c3YnLCAnZHN2JywgJ3RvcG9qc29uJ10sIGRlZmF1bHRFeHRlbnNpb24pKSB7XG4gICAgICAgICAgZGVmYXVsdEV4dGVuc2lvbiA9ICdqc29uJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGRlZmF1bHRFeHRlbnNpb24gaGFzIHR5cGUgc3RyaW5nIGJ1dCB3ZSBlbnN1cmUgdGhhdCBpdCBpcyBEYXRhRm9ybWF0VHlwZSBhYm92ZVxuICAgICAgICBkYXRhLmZvcm1hdC50eXBlID0gZGVmYXVsdEV4dGVuc2lvbiBhcyBEYXRhRm9ybWF0VHlwZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTmFtZWREYXRhKGRhdGEpKSB7XG4gICAgICB0aGlzLl9kYXRhID0ge307XG4gICAgfVxuXG4gICAgLy8gYW55IGRhdGFzZXQgY2FuIGJlIG5hbWVkXG4gICAgaWYgKGRhdGEubmFtZSkge1xuICAgICAgdGhpcy5fbmFtZSA9IGRhdGEubmFtZTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5mb3JtYXQpIHtcbiAgICAgIGNvbnN0IHtwYXJzZSA9IG51bGwsIC4uLmZvcm1hdH0gPSBkYXRhLmZvcm1hdDtcbiAgICAgIHRoaXMuX2RhdGEuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cbiAgfVxuXG4gIGdldCBkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHVibGljIGhhc05hbWUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fbmFtZTtcbiAgfVxuXG4gIGdldCBkYXRhTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHNldCBkYXRhTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgfVxuXG4gIHNldCBwYXJlbnQocGFyZW50OiBEYXRhRmxvd05vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBub2RlcyBoYXZlIHRvIGJlIHJvb3RzLicpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSBub2RlcyBhcmUgcm9vdHMgYW5kIGNhbm5vdCBiZSByZW1vdmVkLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGRhdGEgc291cmNlLlxuICAgKi9cbiAgcHVibGljIGhhc2goKSB7XG4gICAgaWYgKGlzSW5saW5lRGF0YSh0aGlzLl9kYXRhKSkge1xuICAgICAgaWYgKCF0aGlzLl9oYXNoKSB7XG4gICAgICAgIC8vIEhhc2hpbmcgY2FuIGJlIGV4cGVuc2l2ZSBmb3IgbGFyZ2UgaW5saW5lIGRhdGFzZXRzLlxuICAgICAgICB0aGlzLl9oYXNoID0gaGFzaCh0aGlzLl9kYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9oYXNoO1xuICAgIH0gZWxzZSBpZiAoaXNVcmxEYXRhKHRoaXMuX2RhdGEpKSB7XG4gICAgICByZXR1cm4gaGFzaChbdGhpcy5fZGF0YS51cmwsIHRoaXMuX2RhdGEuZm9ybWF0XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0RhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLl9uYW1lLFxuICAgICAgLi4udGhpcy5fZGF0YSxcbiAgICAgIHRyYW5zZm9ybTogW11cbiAgICB9O1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { vgField } from '../../fielddef';\nimport { fieldExpr } from '../../timeunit';\nimport { duplicate, keys, vals } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar TimeUnitNode = /** @class */ (function (_super) {\n tslib_1.__extends(TimeUnitNode, _super);\n function TimeUnitNode(parent, formula) {\n var _this = _super.call(this, parent) || this;\n _this.formula = formula;\n return _this;\n }\n TimeUnitNode.prototype.clone = function () {\n return new TimeUnitNode(null, duplicate(this.formula));\n };\n TimeUnitNode.makeFromEncoding = function (parent, model) {\n var formula = model.reduceFieldDef(function (timeUnitComponent, fieldDef) {\n if (fieldDef.timeUnit) {\n var f = vgField(fieldDef);\n timeUnitComponent[f] = {\n as: f,\n timeUnit: fieldDef.timeUnit,\n field: fieldDef.field\n };\n }\n return timeUnitComponent;\n }, {});\n if (keys(formula).length === 0) {\n return null;\n }\n return new TimeUnitNode(parent, formula);\n };\n TimeUnitNode.makeFromTransform = function (parent, t) {\n var _a;\n return new TimeUnitNode(parent, (_a = {},\n _a[t.field] = {\n as: t.as,\n timeUnit: t.timeUnit,\n field: t.field\n },\n _a));\n };\n TimeUnitNode.prototype.merge = function (other) {\n this.formula = tslib_1.__assign({}, this.formula, other.formula);\n other.remove();\n };\n TimeUnitNode.prototype.producedFields = function () {\n var out = {};\n vals(this.formula).forEach(function (f) {\n out[f.as] = true;\n });\n return out;\n };\n TimeUnitNode.prototype.dependentFields = function () {\n var out = {};\n vals(this.formula).forEach(function (f) {\n out[f.field] = true;\n });\n return out;\n };\n TimeUnitNode.prototype.assemble = function () {\n return vals(this.formula).map(function (c) {\n return {\n type: 'formula',\n as: c.as,\n expr: fieldExpr(c.timeUnit, c.field)\n };\n });\n };\n return TimeUnitNode;\n}(DataFlowNode));\nexport { TimeUnitNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXVuaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3RpbWV1bml0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBVyxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBTyxTQUFTLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUd2RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBU3hDO0lBQWtDLHdDQUFZO0lBSzVDLHNCQUFZLE1BQW9CLEVBQVUsT0FBZ0M7UUFBMUUsWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FDZDtRQUZ5QyxhQUFPLEdBQVAsT0FBTyxDQUF5Qjs7SUFFMUUsQ0FBQztJQU5NLDRCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQU1hLDZCQUFnQixHQUE5QixVQUErQixNQUFvQixFQUFFLEtBQXFCO1FBQ3hFLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsVUFBQyxpQkFBb0MsRUFBRSxRQUFRO1lBQ2xGLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtnQkFDckIsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM1QixpQkFBaUIsQ0FBQyxDQUFDLENBQUMsR0FBRztvQkFDckIsRUFBRSxFQUFFLENBQUM7b0JBQ0wsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRO29CQUMzQixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7aUJBQ3RCLENBQUM7YUFDSDtZQUNELE9BQU8saUJBQWlCLENBQUM7UUFDM0IsQ0FBQyxFQUFFLEVBQTZCLENBQUMsQ0FBQztRQUVsQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRWEsOEJBQWlCLEdBQS9CLFVBQWdDLE1BQW9CLEVBQUUsQ0FBb0I7O1FBQ3hFLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTTtZQUM1QixHQUFDLENBQUMsQ0FBQyxLQUFLLElBQUc7Z0JBQ1QsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLFFBQVEsRUFBRSxDQUFDLENBQUMsUUFBUTtnQkFDcEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2FBQ2Y7Z0JBQ0QsQ0FBQztJQUNMLENBQUM7SUFFTSw0QkFBSyxHQUFaLFVBQWEsS0FBbUI7UUFDOUIsSUFBSSxDQUFDLE9BQU8sd0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBSyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxxQ0FBYyxHQUFyQjtRQUNFLElBQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUVmLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztZQUMxQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNuQixDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLHNDQUFlLEdBQXRCO1FBQ0UsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBRWYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sK0JBQVEsR0FBZjtRQUNFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxDQUFDO1lBQzdCLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNSLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQ2YsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUF6RUQsQ0FBa0MsWUFBWSxHQXlFN0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3ZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7ZmllbGRFeHByLCBUaW1lVW5pdH0gZnJvbSAnLi4vLi4vdGltZXVuaXQnO1xuaW1wb3J0IHtUaW1lVW5pdFRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7RGljdCwgZHVwbGljYXRlLCBrZXlzLCB2YWxzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdGb3JtdWxhVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01vZGVsV2l0aEZpZWxkfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cblxuZXhwb3J0IGludGVyZmFjZSBUaW1lVW5pdENvbXBvbmVudCB7XG4gIGFzOiBzdHJpbmc7XG4gIHRpbWVVbml0OiBUaW1lVW5pdDtcbiAgZmllbGQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFRpbWVVbml0Tm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IFRpbWVVbml0Tm9kZShudWxsLCBkdXBsaWNhdGUodGhpcy5mb3JtdWxhKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBmb3JtdWxhOiBEaWN0PFRpbWVVbml0Q29tcG9uZW50Pikge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1ha2VGcm9tRW5jb2RpbmcocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbFdpdGhGaWVsZCkge1xuICAgIGNvbnN0IGZvcm11bGEgPSBtb2RlbC5yZWR1Y2VGaWVsZERlZigodGltZVVuaXRDb21wb25lbnQ6IFRpbWVVbml0Q29tcG9uZW50LCBmaWVsZERlZikgPT4ge1xuICAgICAgaWYgKGZpZWxkRGVmLnRpbWVVbml0KSB7XG4gICAgICAgIGNvbnN0IGYgPSB2Z0ZpZWxkKGZpZWxkRGVmKTtcbiAgICAgICAgdGltZVVuaXRDb21wb25lbnRbZl0gPSB7XG4gICAgICAgICAgYXM6IGYsXG4gICAgICAgICAgdGltZVVuaXQ6IGZpZWxkRGVmLnRpbWVVbml0LFxuICAgICAgICAgIGZpZWxkOiBmaWVsZERlZi5maWVsZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRpbWVVbml0Q29tcG9uZW50O1xuICAgIH0sIHt9IGFzIERpY3Q8VGltZVVuaXRDb21wb25lbnQ+KTtcblxuICAgIGlmIChrZXlzKGZvcm11bGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBUaW1lVW5pdE5vZGUocGFyZW50LCBmb3JtdWxhKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21UcmFuc2Zvcm0ocGFyZW50OiBEYXRhRmxvd05vZGUsIHQ6IFRpbWVVbml0VHJhbnNmb3JtKSB7XG4gICAgcmV0dXJuIG5ldyBUaW1lVW5pdE5vZGUocGFyZW50LCB7XG4gICAgICBbdC5maWVsZF06IHtcbiAgICAgICAgYXM6IHQuYXMsXG4gICAgICAgIHRpbWVVbml0OiB0LnRpbWVVbml0LFxuICAgICAgICBmaWVsZDogdC5maWVsZFxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlKG90aGVyOiBUaW1lVW5pdE5vZGUpIHtcbiAgICB0aGlzLmZvcm11bGEgPSB7Li4udGhpcy5mb3JtdWxhLCAuLi5vdGhlci5mb3JtdWxhfTtcbiAgICBvdGhlci5yZW1vdmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpIHtcbiAgICBjb25zdCBvdXQgPSB7fTtcblxuICAgIHZhbHModGhpcy5mb3JtdWxhKS5mb3JFYWNoKGYgPT4ge1xuICAgICAgb3V0W2YuYXNdID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBwdWJsaWMgZGVwZW5kZW50RmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuXG4gICAgdmFscyh0aGlzLmZvcm11bGEpLmZvckVhY2goZiA9PiB7XG4gICAgICBvdXRbZi5maWVsZF0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpIHtcbiAgICByZXR1cm4gdmFscyh0aGlzLmZvcm11bGEpLm1hcChjID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgYXM6IGMuYXMsXG4gICAgICAgIGV4cHI6IGZpZWxkRXhwcihjLnRpbWVVbml0LCBjLmZpZWxkKVxuICAgICAgfSBhcyBWZ0Zvcm11bGFUcmFuc2Zvcm07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { hasIntersection, keys } from '../../util';\nimport { OutputNode } from './dataflow';\nimport { FacetNode } from './facet';\nimport { ParseNode } from './formatparse';\nimport { SourceNode } from './source';\nimport { TimeUnitNode } from './timeunit';\n/**\n * Start optimization path at the leaves. Useful for merging up or removing things.\n *\n * If the callback returns true, the recursion continues.\n */\nexport function iterateFromLeaves(f) {\n function optimizeNextFromLeaves(node) {\n if (node instanceof SourceNode) {\n return;\n }\n var next = node.parent;\n if (f(node)) {\n optimizeNextFromLeaves(next);\n }\n }\n return optimizeNextFromLeaves;\n}\n/**\n * Move parse nodes up to forks.\n */\nexport function moveParseUp(node) {\n var parent = node.parent;\n // move parse up by merging or swapping\n if (node instanceof ParseNode) {\n if (parent instanceof SourceNode) {\n return false;\n }\n if (parent.numChildren() > 1) {\n // don't move parse further up but continue with parent.\n return true;\n }\n if (parent instanceof ParseNode) {\n parent.merge(node);\n }\n else {\n // don't swap with nodes that produce something that the parse node depends on (e.g. lookup)\n if (hasIntersection(parent.producedFields(), node.dependentFields())) {\n return true;\n }\n node.swapWithParent();\n }\n }\n return true;\n}\n/**\n * Repeatedly remove leaf nodes that are not output or facet nodes.\n * The reason is that we don't need subtrees that don't have any output nodes.\n * Facet nodes are needed for the row or column domains.\n */\nexport function removeUnusedSubtrees(node) {\n if (node instanceof OutputNode || node.numChildren() > 0 || node instanceof FacetNode) {\n // no need to continue with parent because it is output node or will have children (there was a fork)\n return false;\n }\n else {\n node.remove();\n }\n return true;\n}\n/**\n * Removes duplicate time unit nodes (as determined by the name of the\n * output field) that may be generated due to selections projected over\n * time units.\n */\nexport function removeDuplicateTimeUnits(leaf) {\n var fields = {};\n return iterateFromLeaves(function (node) {\n if (node instanceof TimeUnitNode) {\n var pfields = node.producedFields();\n var dupe = keys(pfields).every(function (k) { return !!fields[k]; });\n if (dupe) {\n node.remove();\n }\n else {\n fields = tslib_1.__assign({}, fields, pfields);\n }\n }\n return true;\n })(leaf);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvb3B0aW1pemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDakQsT0FBTyxFQUFlLFVBQVUsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR3hDOzs7O0dBSUc7QUFDSCxNQUFNLDRCQUE0QixDQUFrQztJQUNsRSxnQ0FBZ0MsSUFBa0I7UUFDaEQsSUFBSSxJQUFJLFlBQVksVUFBVSxFQUFFO1lBQzlCLE9BQU87U0FDUjtRQUVELElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDekIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDWCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCxPQUFPLHNCQUFzQixDQUFDO0FBQ2hDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sc0JBQXNCLElBQWtCO0lBQzVDLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFFM0IsdUNBQXVDO0lBQ3ZDLElBQUksSUFBSSxZQUFZLFNBQVMsRUFBRTtRQUM3QixJQUFJLE1BQU0sWUFBWSxVQUFVLEVBQUU7WUFDaEMsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUM1Qix3REFBd0Q7WUFDeEQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksTUFBTSxZQUFZLFNBQVMsRUFBRTtZQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCO2FBQU07WUFDTCw0RkFBNEY7WUFDNUYsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxFQUFFO2dCQUNwRSxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSwrQkFBK0IsSUFBa0I7SUFDckQsSUFBSSxJQUFJLFlBQVksVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxZQUFZLFNBQVMsRUFBRTtRQUNyRixxR0FBcUc7UUFDckcsT0FBTyxLQUFLLENBQUM7S0FDZDtTQUFNO1FBQ0wsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxtQ0FBbUMsSUFBa0I7SUFDekQsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLE9BQU8saUJBQWlCLENBQUMsVUFBQyxJQUFrQjtRQUMxQyxJQUFJLElBQUksWUFBWSxZQUFZLEVBQUU7WUFDaEMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFYLENBQVcsQ0FBQyxDQUFDO1lBRXJELElBQUksSUFBSSxFQUFFO2dCQUNSLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzthQUNmO2lCQUFNO2dCQUNMLE1BQU0sd0JBQU8sTUFBTSxFQUFLLE9BQU8sQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aGFzSW50ZXJzZWN0aW9uLCBrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlLCBPdXRwdXROb2RlfSBmcm9tICcuL2RhdGFmbG93JztcbmltcG9ydCB7RmFjZXROb2RlfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7UGFyc2VOb2RlfSBmcm9tICcuL2Zvcm1hdHBhcnNlJztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHtUaW1lVW5pdE5vZGV9IGZyb20gJy4vdGltZXVuaXQnO1xuXG5cbi8qKlxuICogU3RhcnQgb3B0aW1pemF0aW9uIHBhdGggYXQgdGhlIGxlYXZlcy4gVXNlZnVsIGZvciBtZXJnaW5nIHVwIG9yIHJlbW92aW5nIHRoaW5ncy5cbiAqXG4gKiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyB0cnVlLCB0aGUgcmVjdXJzaW9uIGNvbnRpbnVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdGVGcm9tTGVhdmVzKGY6IChub2RlOiBEYXRhRmxvd05vZGUpID0+IGJvb2xlYW4pIHtcbiAgZnVuY3Rpb24gb3B0aW1pemVOZXh0RnJvbUxlYXZlcyhub2RlOiBEYXRhRmxvd05vZGUpIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gbm9kZS5wYXJlbnQ7XG4gICAgaWYgKGYobm9kZSkpIHtcbiAgICAgIG9wdGltaXplTmV4dEZyb21MZWF2ZXMobmV4dCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9wdGltaXplTmV4dEZyb21MZWF2ZXM7XG59XG5cbi8qKlxuICogTW92ZSBwYXJzZSBub2RlcyB1cCB0byBmb3Jrcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vdmVQYXJzZVVwKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcblxuICAvLyBtb3ZlIHBhcnNlIHVwIGJ5IG1lcmdpbmcgb3Igc3dhcHBpbmdcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJzZU5vZGUpIHtcbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgU291cmNlTm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnQubnVtQ2hpbGRyZW4oKSA+IDEpIHtcbiAgICAgIC8vIGRvbid0IG1vdmUgcGFyc2UgZnVydGhlciB1cCBidXQgY29udGludWUgd2l0aCBwYXJlbnQuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocGFyZW50IGluc3RhbmNlb2YgUGFyc2VOb2RlKSB7XG4gICAgICBwYXJlbnQubWVyZ2Uobm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvbid0IHN3YXAgd2l0aCBub2RlcyB0aGF0IHByb2R1Y2Ugc29tZXRoaW5nIHRoYXQgdGhlIHBhcnNlIG5vZGUgZGVwZW5kcyBvbiAoZS5nLiBsb29rdXApXG4gICAgICBpZiAoaGFzSW50ZXJzZWN0aW9uKHBhcmVudC5wcm9kdWNlZEZpZWxkcygpLCBub2RlLmRlcGVuZGVudEZpZWxkcygpKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5zd2FwV2l0aFBhcmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFJlcGVhdGVkbHkgcmVtb3ZlIGxlYWYgbm9kZXMgdGhhdCBhcmUgbm90IG91dHB1dCBvciBmYWNldCBub2Rlcy5cbiAqIFRoZSByZWFzb24gaXMgdGhhdCB3ZSBkb24ndCBuZWVkIHN1YnRyZWVzIHRoYXQgZG9uJ3QgaGF2ZSBhbnkgb3V0cHV0IG5vZGVzLlxuICogRmFjZXQgbm9kZXMgYXJlIG5lZWRlZCBmb3IgdGhlIHJvdyBvciBjb2x1bW4gZG9tYWlucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVVudXNlZFN1YnRyZWVzKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICBpZiAobm9kZSBpbnN0YW5jZW9mIE91dHB1dE5vZGUgfHwgbm9kZS5udW1DaGlsZHJlbigpID4gMCB8fCBub2RlIGluc3RhbmNlb2YgRmFjZXROb2RlKSB7XG4gICAgLy8gbm8gbmVlZCB0byBjb250aW51ZSB3aXRoIHBhcmVudCBiZWNhdXNlIGl0IGlzIG91dHB1dCBub2RlIG9yIHdpbGwgaGF2ZSBjaGlsZHJlbiAodGhlcmUgd2FzIGEgZm9yaylcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5yZW1vdmUoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGR1cGxpY2F0ZSB0aW1lIHVuaXQgbm9kZXMgKGFzIGRldGVybWluZWQgYnkgdGhlIG5hbWUgb2YgdGhlXG4gKiBvdXRwdXQgZmllbGQpIHRoYXQgbWF5IGJlIGdlbmVyYXRlZCBkdWUgdG8gc2VsZWN0aW9ucyBwcm9qZWN0ZWQgb3ZlclxuICogdGltZSB1bml0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZVRpbWVVbml0cyhsZWFmOiBEYXRhRmxvd05vZGUpIHtcbiAgbGV0IGZpZWxkcyA9IHt9O1xuICByZXR1cm4gaXRlcmF0ZUZyb21MZWF2ZXMoKG5vZGU6IERhdGFGbG93Tm9kZSkgPT4ge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGltZVVuaXROb2RlKSB7XG4gICAgICBjb25zdCBwZmllbGRzID0gbm9kZS5wcm9kdWNlZEZpZWxkcygpO1xuICAgICAgY29uc3QgZHVwZSA9IGtleXMocGZpZWxkcykuZXZlcnkoKGspID0+ICEhZmllbGRzW2tdKTtcblxuICAgICAgaWYgKGR1cGUpIHtcbiAgICAgICAgbm9kZS5yZW1vdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpZWxkcyA9IHsuLi5maWVsZHMsIC4uLnBmaWVsZHN9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KShsZWFmKTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isArray, isString } from 'vega-util';\nimport { isFieldDef, vgField } from '../../fielddef';\nimport { duplicate } from '../../util';\nimport { sortParams } from '../common';\nimport { DataFlowNode } from './dataflow';\nfunction getStackByFields(model) {\n return model.stack.stackBy.reduce(function (fields, by) {\n var fieldDef = by.fieldDef;\n var _field = vgField(fieldDef);\n if (_field) {\n fields.push(_field);\n }\n return fields;\n }, []);\n}\nfunction isValidAsArray(as) {\n return isArray(as) && as.every(function (s) { return isString(s); }) && as.length > 1;\n}\nvar StackNode = /** @class */ (function (_super) {\n tslib_1.__extends(StackNode, _super);\n function StackNode(parent, stack) {\n var _this = _super.call(this, parent) || this;\n _this._stack = stack;\n return _this;\n }\n StackNode.prototype.clone = function () {\n return new StackNode(null, duplicate(this._stack));\n };\n StackNode.makeFromTransform = function (parent, stackTransform) {\n var stack = stackTransform.stack, groupby = stackTransform.groupby, as = stackTransform.as, _a = stackTransform.offset, offset = _a === void 0 ? 'zero' : _a;\n var sortFields = [];\n var sortOrder = [];\n if (stackTransform.sort !== undefined) {\n for (var _i = 0, _b = stackTransform.sort; _i < _b.length; _i++) {\n var sortField = _b[_i];\n sortFields.push(sortField.field);\n sortOrder.push(sortField.order === undefined ? 'ascending' : sortField.order);\n }\n }\n var sort = {\n field: sortFields,\n order: sortOrder,\n };\n var normalizedAs;\n if (isValidAsArray(as)) {\n normalizedAs = as;\n }\n else if (isString(as)) {\n normalizedAs = [as, as + '_end'];\n }\n else {\n normalizedAs = [stackTransform.stack + '_start', stackTransform.stack + '_end'];\n }\n return new StackNode(parent, {\n stackField: stack,\n groupby: groupby,\n offset: offset,\n sort: sort,\n facetby: [],\n as: normalizedAs\n });\n };\n StackNode.makeFromEncoding = function (parent, model) {\n var stackProperties = model.stack;\n if (!stackProperties) {\n return null;\n }\n var dimensionFieldDef;\n if (stackProperties.groupbyChannel) {\n dimensionFieldDef = model.fieldDef(stackProperties.groupbyChannel);\n }\n var stackby = getStackByFields(model);\n var orderDef = model.encoding.order;\n var sort;\n if (isArray(orderDef) || isFieldDef(orderDef)) {\n sort = sortParams(orderDef);\n }\n else {\n // default = descending by stackFields\n // FIXME is the default here correct for binned fields?\n sort = stackby.reduce(function (s, field) {\n s.field.push(field);\n s.order.push('descending');\n return s;\n }, { field: [], order: [] });\n }\n // Refactored to add \"as\" in the make phase so that we can get producedFields\n // from the as property\n var field = model.vgField(stackProperties.fieldChannel);\n return new StackNode(parent, {\n dimensionFieldDef: dimensionFieldDef,\n stackField: field,\n facetby: [],\n stackby: stackby,\n sort: sort,\n offset: stackProperties.offset,\n impute: stackProperties.impute,\n as: [field + '_start', field + '_end']\n });\n };\n Object.defineProperty(StackNode.prototype, \"stack\", {\n get: function () {\n return this._stack;\n },\n enumerable: true,\n configurable: true\n });\n StackNode.prototype.addDimensions = function (fields) {\n this._stack.facetby = this._stack.facetby.concat(fields);\n };\n StackNode.prototype.dependentFields = function () {\n var out = {};\n out[this._stack.stackField] = true;\n this.getGroupbyFields().forEach(function (f) { return out[f] = true; });\n this._stack.facetby.forEach(function (f) { return out[f] = true; });\n var field = this._stack.sort.field;\n isArray(field) ? field.forEach(function (f) { return out[f] = true; }) : out[field] = true;\n return out;\n };\n StackNode.prototype.producedFields = function () {\n return this._stack.as.reduce(function (result, item) {\n result[item] = true;\n return result;\n }, {});\n };\n StackNode.prototype.getGroupbyFields = function () {\n var _a = this._stack, dimensionFieldDef = _a.dimensionFieldDef, impute = _a.impute, groupby = _a.groupby;\n if (dimensionFieldDef) {\n if (dimensionFieldDef.bin) {\n if (impute) {\n // For binned group by field with impute, we calculate bin_mid\n // as we cannot impute two fields simultaneously\n return [vgField(dimensionFieldDef, { binSuffix: 'mid' })];\n }\n return [\n // For binned group by field without impute, we need both bin (start) and bin_end\n vgField(dimensionFieldDef, {}),\n vgField(dimensionFieldDef, { binSuffix: 'end' })\n ];\n }\n return [vgField(dimensionFieldDef)];\n }\n return groupby || [];\n };\n StackNode.prototype.assemble = function () {\n var transform = [];\n var _a = this._stack, facetby = _a.facetby, dimensionFieldDef = _a.dimensionFieldDef, field = _a.stackField, stackby = _a.stackby, sort = _a.sort, offset = _a.offset, impute = _a.impute, as = _a.as;\n // Impute\n if (impute && dimensionFieldDef) {\n var dimensionField = dimensionFieldDef ? vgField(dimensionFieldDef, { binSuffix: 'mid' }) : undefined;\n if (dimensionFieldDef.bin) {\n // As we can only impute one field at a time, we need to calculate\n // mid point for a binned field\n transform.push({\n type: 'formula',\n expr: '(' +\n vgField(dimensionFieldDef, { expr: 'datum' }) +\n '+' +\n vgField(dimensionFieldDef, { expr: 'datum', binSuffix: 'end' }) +\n ')/2',\n as: dimensionField\n });\n }\n transform.push({\n type: 'impute',\n field: field,\n groupby: stackby,\n key: dimensionField,\n method: 'value',\n value: 0\n });\n }\n // Stack\n transform.push({\n type: 'stack',\n groupby: this.getGroupbyFields().concat(facetby),\n field: field,\n sort: sort,\n as: as,\n offset: offset\n });\n return transform;\n };\n return StackNode;\n}(DataFlowNode));\nexport { StackNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQVcsVUFBVSxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzdELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDLDBCQUEwQixLQUFnQjtJQUN4QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQU0sRUFBRSxFQUFFO1FBQzNDLElBQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUM7UUFFN0IsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pDLElBQUksTUFBTSxFQUFFO1lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMsRUFBRSxFQUFjLENBQUMsQ0FBQztBQUNyQixDQUFDO0FBZ0RELHdCQUF3QixFQUFxQjtJQUMzQyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFYLENBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUUsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRDtJQUErQixxQ0FBWTtJQU96QyxtQkFBWSxNQUFvQixFQUFFLEtBQXFCO1FBQXZELFlBQ0Usa0JBQU0sTUFBTSxD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QUNkLEtBQUssT0FBQTtnQkFDTCxPQUFPLEVBQUUsT0FBTztnQkFDaEIsR0FBRyxFQUFFLGNBQWM7Z0JBQ25CLE1BQU0sRUFBRSxPQUFPO2dCQUNmLEtBQUssRUFBRSxDQUFDO2FBQ1QsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxRQUFRO1FBQ1IsU0FBUyxDQUFDLElBQUksQ0FBQztZQUNiLElBQUksRUFBRSxPQUFPO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7WUFDaEQsS0FBSyxPQUFBO1lBQ0wsSUFBSSxNQUFBO1lBQ0osRUFBRSxJQUFBO1lBQ0YsTUFBTSxRQUFBO1NBQ1AsQ0FBQyxDQUFDO1FBRUgsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXhMRCxDQUErQixZQUFZLEdBd0wxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNBcnJheSwgaXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCBpc0ZpZWxkRGVmLCB2Z0ZpZWxkfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge1N0YWNrT2Zmc2V0fSBmcm9tICcuLi8uLi9zdGFjayc7XG5pbXBvcnQge1N0YWNrVHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtkdXBsaWNhdGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0NvbXBhcmF0b3JPcmRlciwgVmdTb3J0LCBWZ1RyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtzb3J0UGFyYW1zfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vLi4vdW5pdCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbmZ1bmN0aW9uIGdldFN0YWNrQnlGaWVsZHMobW9kZWw6IFVuaXRNb2RlbCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIG1vZGVsLnN0YWNrLnN0YWNrQnkucmVkdWNlKChmaWVsZHMsIGJ5KSA9PiB7XG4gICAgY29uc3QgZmllbGREZWYgPSBieS5maWVsZERlZjtcblxuICAgIGNvbnN0IF9maWVsZCA9IHZnRmllbGQoZmllbGREZWYpO1xuICAgIGlmIChfZmllbGQpIHtcbiAgICAgIGZpZWxkcy5wdXNoKF9maWVsZCk7XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG4gIH0sIFtdIGFzIHN0cmluZ1tdKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFja0NvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIEZhY2V0ZWQgZmllbGQuXG4gICAqL1xuICBmYWNldGJ5OiBzdHJpbmdbXTtcblxuICBkaW1lbnNpb25GaWVsZERlZj86IEZpZWxkRGVmPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFN0YWNrIG1lYXN1cmUncyBmaWVsZC4gVXNlZCBpbiBtYWtlRnJvbUVuY29kaW5nLlxuICAgKi9cbiAgc3RhY2tGaWVsZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMZXZlbCBvZiBkZXRhaWwgZmllbGRzIGZvciBlYWNoIGxldmVsIGluIHRoZSBzdGFja2VkIGNoYXJ0cyBzdWNoIGFzIGNvbG9yIG9yIGRldGFpbC5cbiAgICogVXNlZCBpbiBtYWtlRnJvbUVuY29kaW5nLlxuICAgKi9cbiAgc3RhY2tieT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBGaWVsZCB0aGF0IGRldGVybWluZXMgb3JkZXIgb2YgbGV2ZWxzIGluIHRoZSBzdGFja2VkIGNoYXJ0cy5cbiAgICogVXNlZCBpbiBib3RoIGJ1dCBvcHRpb25hbCBpbiB0cmFuc2Zvcm0uXG4gICAqL1xuICBzb3J0OiBWZ1NvcnQ7XG5cbiAgLyoqIE1vZGUgZm9yIHN0YWNraW5nIG1hcmtzLlxuICAgKi9cbiAgb2Zmc2V0OiBTdGFja09mZnNldDtcblxuICAvKipcbiAgICogV2hldGhlciB0byBpbXB1dGUgdGhlIGRhdGEgYmVmb3JlIHN0YWNraW5nLiBVc2VkIG9ubHkgaW4gbWFrZUZyb21FbmNvZGluZy5cbiAgICovXG4gIGltcHV0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkcyB0byBncm91cCBieS5cbiAgICovXG4gIGdyb3VwYnk/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIE91dHB1dCBmaWVsZCBuYW1lcyBvZiBlYWNoIHN0YWNrIGZpZWxkLlxuICAgKi9cbiAgYXM6IHN0cmluZ1tdO1xuXG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRBc0FycmF5KGFzOiBzdHJpbmdbXSB8IHN0cmluZyk6IGFzIGlzIHN0cmluZ1tdIHtcbiAgcmV0dXJuIGlzQXJyYXkoYXMpICYmIGFzLmV2ZXJ5KHMgPT4gaXNTdHJpbmcocykpICYmIGFzLmxlbmd0aCA+MTtcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWNrTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHByaXZhdGUgX3N0YWNrOiBTdGFja0NvbXBvbmVudDtcblxuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBTdGFja05vZGUobnVsbCwgZHVwbGljYXRlKHRoaXMuX3N0YWNrKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgc3RhY2s6IFN0YWNrQ29tcG9uZW50KSB7XG4gICAgc3VwZXIocGFyZW50KTtcblxuICAgIHRoaXMuX3N0YWNrID0gc3RhY2s7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1ha2VGcm9tVHJhbnNmb3JtKHBhcmVudDogRGF0YUZsb3dOb2RlLCBzdGFja1RyYW5zZm9ybTogU3RhY2tUcmFuc2Zvcm0pIHtcblxuICAgIGNvbnN0IHtzdGFjaywgZ3JvdXBieSwgYXMsIG9mZnNldD0nemVybyd9ID0gc3RhY2tUcmFuc2Zvcm07XG5cbiAgICBjb25zdCBzb3J0RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNvcnRPcmRlcjogVmdDb21wYXJhdG9yT3JkZXJbXSA9IFtdO1xuICAgIGlmIChzdGFja1RyYW5zZm9ybS5zb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3Qgc29ydEZpZWxkIG9mIHN0YWNrVHJhbnNmb3JtLnNvcnQpIHtcbiAgICAgICAgc29ydEZpZWxkcy5wdXNoKHNvcnRGaWVsZC5maWVsZCk7XG4gICAgICAgIHNvcnRPcmRlci5wdXNoKHNvcnRGaWVsZC5vcmRlciA9PT0gdW5kZWZpbmVkID8gJ2FzY2VuZGluZycgOiBzb3J0RmllbGQub3JkZXIgYXMgVmdDb21wYXJhdG9yT3JkZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBzb3J0OiBWZ1NvcnQgPSB7XG4gICAgICBmaWVsZDogc29ydEZpZWxkcyxcbiAgICAgIG9yZGVyOiBzb3J0T3JkZXIsXG4gICAgfTtcbiAgICBsZXQgbm9ybWFsaXplZEFzOiBBcnJheTxzdHJpbmc+O1xuICAgIGlmIChpc1ZhbGlkQXNBcnJheShhcykpIHtcbiAgICAgIG5vcm1hbGl6ZWRBcyA9IGFzO1xuICAgIH0gZWxzZSBpZihpc1N0cmluZyhhcykpIHtcbiAgICAgIG5vcm1hbGl6ZWRBcyA9IFthcywgYXMgKyAnX2VuZCddO1xuICAgIH0gZWxzZSB7XG4gICAgICBub3JtYWxpemVkQXMgPSBbc3RhY2tUcmFuc2Zvcm0uc3RhY2sgKyAnX3N0YXJ0Jywgc3RhY2tUcmFuc2Zvcm0uc3RhY2sgKyAnX2VuZCddO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3RhY2tOb2RlIChwYXJlbnQsIHtcbiAgICAgIHN0YWNrRmllbGQ6IHN0YWNrLFxuICAgICAgZ3JvdXBieSxcbiAgICAgIG9mZnNldCxcbiAgICAgIHNvcnQsXG4gICAgICBmYWNldGJ5OiBbXSxcbiAgICAgIGFzOiBub3JtYWxpemVkQXNcbiAgICB9KTtcblxuICB9XG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21FbmNvZGluZyhwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IFVuaXRNb2RlbCkge1xuXG4gICAgY29uc3Qgc3RhY2tQcm9wZXJ0aWVzID0gbW9kZWwuc3RhY2s7XG5cbiAgICBpZiAoIXN0YWNrUHJvcGVydGllcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgbGV0IGRpbWVuc2lvbkZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+O1xuICAgIGlmIChzdGFja1Byb3BlcnRpZXMuZ3JvdXBieUNoYW5uZWwpIHtcbiAgICAgIGRpbWVuc2lvbkZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoc3RhY2tQcm9wZXJ0aWVzLmdyb3VwYnlDaGFubmVsKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja2J5ID0gZ2V0U3RhY2tCeUZpZWxkcyhtb2RlbCk7XG4gICAgY29uc3Qgb3JkZXJEZWYgPSBtb2RlbC5lbmNvZGluZy5vcmRlcjtcblxuICAgIGxldCBzb3J0OiBWZ1NvcnQ7XG4gICAgaWYgKGlzQXJyYXkob3JkZXJEZWYpIHx8IGlzRmllbGREZWYob3JkZXJEZWYpKSB7XG4gICAgICBzb3J0ID0gc29ydFBhcmFtcyhvcmRlckRlZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRlZmF1bHQgPSBkZXNjZW5kaW5nIGJ5IHN0YWNrRmllbGRzXG4gICAgICAvLyBGSVhNRSBpcyB0aGUgZGVmYXVsdCBoZXJlIGNvcnJlY3QgZm9yIGJpbm5lZCBmaWVsZHM/XG4gICAgICBzb3J0ID0gc3RhY2tieS5yZWR1Y2UoKHMsIGZpZWxkKSA9PiB7XG4gICAgICAgIHMuZmllbGQucHVzaChmaWVsZCk7XG4gICAgICAgIHMub3JkZXIucHVzaCgnZGVzY2VuZGluZycpO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH0sIHtmaWVsZDpbXSwgb3JkZXI6IFtdfSk7XG4gICAgfVxuICAgIC8vIFJlZmFjdG9yZWQgdG8gYWRkIFwiYXNcIiBpbiB0aGUgbWFrZSBwaGFzZSBzbyB0aGF0IHdlIGNhbiBnZXQgcHJvZHVjZWRGaWVsZHNcbiAgICAvLyBmcm9tIHRoZSBhcyBwcm9wZXJ0eVxuICAgIGNvbnN0IGZpZWxkID0gbW9kZWwudmdGaWVsZChzdGFja1Byb3BlcnRpZXMuZmllbGRDaGFubmVsKTtcblxuICAgIHJldHVybiBuZXcgU3RhY2tOb2RlKHBhcmVudCwge1xuICAgICAgZGltZW5zaW9uRmllbGREZWYsXG4gICAgICBzdGFja0ZpZWxkOmZpZWxkLFxuICAgICAgZmFjZXRieTogW10sXG4gICAgICBzdGFja2J5LFxuICAgICAgc29ydCxcbiAgICAgIG9mZnNldDogc3RhY2tQcm9wZXJ0aWVzLm9mZnNldCxcbiAgICAgIGltcHV0ZTogc3RhY2tQcm9wZXJ0aWVzLmltcHV0ZSxcbiAgICAgIGFzOiBbZmllbGQgKyAnX3N0YXJ0JywgZmllbGQgKyAnX2VuZCddXG4gICAgfSk7XG4gIH1cblxuICBnZXQgc3RhY2soKTogU3RhY2tDb21wb25lbnQge1xuICAgIHJldHVybiB0aGlzLl9zdGFjaztcbiAgfVxuXG4gIHB1YmxpYyBhZGREaW1lbnNpb25zKGZpZWxkczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9zdGFjay5mYWNldGJ5ID0gdGhpcy5fc3RhY2suZmFjZXRieS5jb25jYXQoZmllbGRzKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRlbnRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICBvdXRbdGhpcy5fc3RhY2suc3RhY2tGaWVsZF0gPSB0cnVlO1xuXG4gICAgdGhpcy5nZXRHcm91cGJ5RmllbGRzKCkuZm9yRWFjaChmID0+IG91dFtmXSA9IHRydWUpO1xuICAgIHRoaXMuX3N0YWNrLmZhY2V0YnkuZm9yRWFjaChmID0+IG91dFtmXSA9IHRydWUpO1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fc3RhY2suc29ydC5maWVsZDtcbiAgICBpc0FycmF5KGZpZWxkKSA/IGZpZWxkLmZvckVhY2goZiA9PiBvdXRbZl0gPSB0cnVlKSA6IG91dFtmaWVsZF0gPSB0cnVlO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2suYXMucmVkdWNlKChyZXN1bHQsIGl0ZW0pID0+IHtcbiAgICAgIHJlc3VsdFtpdGVtXSA9IHRydWU7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0R3JvdXBieUZpZWxkcygpIHtcbiAgICBjb25zdCB7ZGltZW5zaW9uRmllbGREZWYsIGltcHV0ZSwgZ3JvdXBieX0gPSB0aGlzLl9zdGFjaztcbiAgICBpZiAoZGltZW5zaW9uRmllbGREZWYpIHtcbiAgICAgIGlmIChkaW1lbnNpb25GaWVsZERlZi5iaW4pIHtcbiAgICAgICAgaWYgKGltcHV0ZSkge1xuICAgICAgICAgIC8vIEZvciBiaW5uZWQgZ3JvdXAgYnkgZmllbGQgd2l0aCBpbXB1dGUsIHdlIGNhbGN1bGF0ZSBiaW5fbWlkXG4gICAgICAgICAgLy8gYXMgd2UgY2Fubm90IGltcHV0ZSB0d28gZmllbGRzIHNpbXVsdGFuZW91c2x5XG4gICAgICAgICAgcmV0dXJuIFt2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmLCB7YmluU3VmZml4OiAnbWlkJ30pXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC8vIEZvciBiaW5uZWQgZ3JvdXAgYnkgZmllbGQgd2l0aG91dCBpbXB1dGUsIHdlIG5lZWQgYm90aCBiaW4gKHN0YXJ0KSBhbmQgYmluX2VuZFxuICAgICAgICAgIHZnRmllbGQoZGltZW5zaW9uRmllbGREZWYsIHt9KSxcbiAgICAgICAgICB2Z0ZpZWxkKGRpbWVuc2lvbkZpZWxkRGVmLCB7YmluU3VmZml4OiAnZW5kJ30pXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gW3ZnRmllbGQoZGltZW5zaW9uRmllbGREZWYpXTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwYnkgfHwgW107XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdUcmFuc2Zvcm1bXSB7XG4gICAgY29uc3QgdHJhbnNmb3JtOiBWZ1RyYW5zZm9ybVtdID0gW107XG4gICAgY29uc3Qge2ZhY2V0YnksIGRpbWVuc2lvbkZpZWxkRGVmLCBzdGFja0ZpZWxkOiBmaWVsZCwgc3RhY2tieSwgc29ydCwgb2Zmc2V0LCBpbXB1dGUsIGFzfSA9IHRoaXMuX3N0YWNrO1xuXG4gICAgICAvLyBJbXB1dGVcbiAgICBpZiAoaW1wdXRlICYmIGRpbWVuc2lvbkZpZWxkRGVmKSB7XG4gICAgICBjb25zdCBkaW1lbnNpb25GaWVsZCA9IGRpbWVuc2lvbkZpZWxkRGVmID8gdmdGaWVsZChkaW1lbnNpb25GaWVsZERlZiwge2JpblN1ZmZpeDogJ21pZCd9KTogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoZGltZW5zaW9uRmllbGREZWYuYmluKSB7XG4gICAgICAgIC8vIEFzIHdlIGNhbiBvbmx5IGltcHV0ZSBvbmUgZmllbGQgYXQgYSB0aW1lLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgICAvLyBtaWQgcG9pbnQgZm9yIGEgYmlubmVkIGZpZWxkXG4gICAgICAgIHRyYW5zZm9ybS5wdXNoKHtcbiAgICAgICAgICB0eXBlOiAnZm9ybXVsYScsXG4gICAgICAgICAgZXhwcjogJygnICtcbiAgICAgICAgICAgIHZnRmllbGQoZGltZW5zaW9uRmllbGREZWYsIHtleHByOiAnZGF0dW0nfSkgK1xuICAgICAgICAgICAgJysnICtcbiAgICAgICAgICAgIHZnRmllbGQoZGltZW5zaW9uRmllbGREZWYsIHtleHByOiAnZGF0dW0nLCBiaW5TdWZmaXg6ICdlbmQnfSkgK1xuICAgICAgICAgICAgJykvMicsXG4gICAgICAgICAgYXM6IGRpbWVuc2lvbkZpZWxkXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm0ucHVzaCh7XG4gICAgICAgIHR5cGU6ICdpbXB1dGUnLFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgZ3JvdXBieTogc3RhY2tieSxcbiAgICAgICAga2V5OiBkaW1lbnNpb25GaWVsZCxcbiAgICAgICAgbWV0aG9kOiAndmFsdWUnLFxuICAgICAgICB2YWx1ZTogMFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3RhY2tcbiAgICB0cmFuc2Zvcm0ucHVzaCh7XG4gICAgICB0eXBlOiAnc3RhY2snLFxuICAgICAgZ3JvdXBieTogdGhpcy5nZXRHcm91cGJ5RmllbGRzKCkuY29uY2F0KGZhY2V0YnkpLFxuICAgICAgZmllbGQsXG4gICAgICBzb3J0LFxuICAgICAgYXMsXG4gICAgICBvZmZzZXRcbiAgICB9KTtcblxuICAgIHJldHVybiB0cmFuc2Zvcm07XG4gIH1cbn1cbiJdfQ==","import { MAIN } from '../../data';\nimport { every, flatten, keys, vals } from '../../util';\nimport { AggregateNode } from './aggregate';\nimport { OutputNode } from './dataflow';\nimport { FacetNode } from './facet';\nimport { FilterInvalidNode } from './filterinvalid';\nimport * as optimizers from './optimizers';\nimport { StackNode } from './stack';\nexport var FACET_SCALE_PREFIX = 'scale_';\n/**\n * Clones the subtree and ignores output nodes except for the leafs, which are renamed.\n */\nfunction cloneSubtree(facet) {\n function clone(node) {\n if (!(node instanceof FacetNode)) {\n var copy_1 = node.clone();\n if (copy_1 instanceof OutputNode) {\n var newName = FACET_SCALE_PREFIX + copy_1.getSource();\n copy_1.setSource(newName);\n facet.model.component.data.outputNodes[newName] = copy_1;\n }\n else if (copy_1 instanceof AggregateNode || copy_1 instanceof StackNode) {\n copy_1.addDimensions(facet.fields);\n }\n flatten(node.children.map(clone)).forEach(function (n) { return n.parent = copy_1; });\n return [copy_1];\n }\n return flatten(node.children.map(clone));\n }\n return clone;\n}\n/**\n * Move facet nodes down to the next fork or output node. Also pull the main output with the facet node.\n * After moving down the facet node, make a copy of the subtree and make it a child of the main output.\n */\nfunction moveFacetDown(node) {\n if (node instanceof FacetNode) {\n if (node.numChildren() === 1 && !(node.children[0] instanceof OutputNode)) {\n // move down until we hit a fork or output node\n var child = node.children[0];\n if (child instanceof AggregateNode || child instanceof StackNode) {\n child.addDimensions(node.fields);\n }\n child.swapWithParent();\n moveFacetDown(node);\n }\n else {\n // move main to facet\n moveMainDownToFacet(node.model.component.data.main);\n // replicate the subtree and place it before the facet's main node\n var copy = flatten(node.children.map(cloneSubtree(node)));\n copy.forEach(function (c) { return c.parent = node.model.component.data.main; });\n }\n }\n else {\n node.children.forEach(moveFacetDown);\n }\n}\nfunction moveMainDownToFacet(node) {\n if (node instanceof OutputNode && node.type === MAIN) {\n if (node.numChildren() === 1) {\n var child = node.children[0];\n if (!(child instanceof FacetNode)) {\n child.swapWithParent();\n moveMainDownToFacet(node);\n }\n }\n }\n}\n/**\n * Remove nodes that are not required starting from a root.\n */\nfunction removeUnnecessaryNodes(node) {\n // remove empty null filter nodes\n if (node instanceof FilterInvalidNode && every(vals(node.filter), function (f) { return f === null; })) {\n node.remove();\n }\n // remove output nodes that are not required\n if (node instanceof OutputNode && !node.isRequired()) {\n node.remove();\n }\n node.children.forEach(removeUnnecessaryNodes);\n}\n/**\n * Return all leaf nodes.\n */\nfunction getLeaves(roots) {\n var leaves = [];\n function append(node) {\n if (node.numChildren() === 0) {\n leaves.push(node);\n }\n else {\n node.children.forEach(append);\n }\n }\n roots.forEach(append);\n return leaves;\n}\n/**\n * Optimizes the dataflow of the passed in data component.\n */\nexport function optimizeDataflow(dataComponent) {\n var roots = vals(dataComponent.sources);\n roots.forEach(removeUnnecessaryNodes);\n // remove source nodes that don't have any children because they also don't have output nodes\n roots = roots.filter(function (r) { return r.numChildren() > 0; });\n getLeaves(roots).forEach(optimizers.iterateFromLeaves(optimizers.removeUnusedSubtrees));\n roots = roots.filter(function (r) { return r.numChildren() > 0; });\n getLeaves(roots).forEach(optimizers.iterateFromLeaves(optimizers.moveParseUp));\n getLeaves(roots).forEach(optimizers.removeDuplicateTimeUnits);\n roots.forEach(moveFacetDown);\n keys(dataComponent.sources).forEach(function (s) {\n if (dataComponent.sources[s].numChildren() === 0) {\n delete dataComponent.sources[s];\n }\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL29wdGltaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRCxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUUzQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxJQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztBQUUzQzs7R0FFRztBQUNILHNCQUFzQixLQUFnQjtJQUNwQyxlQUFlLElBQWtCO1FBQy9CLElBQUksQ0FBQyxDQUFDLElBQUksWUFBWSxTQUFTLENBQUMsRUFBRTtZQUNoQyxJQUFNLE1BQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFMUIsSUFBSSxNQUFJLFlBQVksVUFBVSxFQUFFO2dCQUM5QixJQUFNLE9BQU8sR0FBRyxrQkFBa0IsR0FBRyxNQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RELE1BQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRXhCLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBSSxDQUFDO2FBQ3hEO2lCQUFNLElBQUksTUFB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LEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0UsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUU5RCxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTdCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsQ0FBQztRQUNuQyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ2hELE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TUFJTn0gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQge2V2ZXJ5LCBmbGF0dGVuLCBrZXlzLCB2YWxzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7QWdncmVnYXRlTm9kZX0gZnJvbSAnLi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGUsIE91dHB1dE5vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuaW1wb3J0IHtGYWNldE5vZGV9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtGaWx0ZXJJbnZhbGlkTm9kZX0gZnJvbSAnLi9maWx0ZXJpbnZhbGlkJztcbmltcG9ydCB7RGF0YUNvbXBvbmVudH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgKiBhcyBvcHRpbWl6ZXJzIGZyb20gJy4vb3B0aW1pemVycyc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7U3RhY2tOb2RlfSBmcm9tICcuL3N0YWNrJztcblxuZXhwb3J0IGNvbnN0IEZBQ0VUX1NDQUxFX1BSRUZJWCA9ICdzY2FsZV8nO1xuXG4vKipcbiAqIENsb25lcyB0aGUgc3VidHJlZSBhbmQgaWdub3JlcyBvdXRwdXQgbm9kZXMgZXhjZXB0IGZvciB0aGUgbGVhZnMsIHdoaWNoIGFyZSByZW5hbWVkLlxuICovXG5mdW5jdGlvbiBjbG9uZVN1YnRyZWUoZmFjZXQ6IEZhY2V0Tm9kZSkge1xuICBmdW5jdGlvbiBjbG9uZShub2RlOiBEYXRhRmxvd05vZGUpOiBEYXRhRmxvd05vZGVbXSB7XG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIEZhY2V0Tm9kZSkpIHtcbiAgICAgIGNvbnN0IGNvcHkgPSBub2RlLmNsb25lKCk7XG5cbiAgICAgIGlmIChjb3B5IGluc3RhbmNlb2YgT3V0cHV0Tm9kZSkge1xuICAgICAgICBjb25zdCBuZXdOYW1lID0gRkFDRVRfU0NBTEVfUFJFRklYICsgY29weS5nZXRTb3VyY2UoKTtcbiAgICAgICAgY29weS5zZXRTb3VyY2UobmV3TmFtZSk7XG5cbiAgICAgICAgZmFjZXQubW9kZWwuY29tcG9uZW50LmRhdGEub3V0cHV0Tm9kZXNbbmV3TmFtZV0gPSBjb3B5O1xuICAgICAgfSBlbHNlIGlmIChjb3B5IGluc3RhbmNlb2YgQWdncmVnYXRlTm9kZSB8fCBjb3B5IGluc3RhbmNlb2YgU3RhY2tOb2RlKSB7XG4gICAgICAgIGNvcHkuYWRkRGltZW5zaW9ucyhmYWNldC5maWVsZHMpO1xuICAgICAgfVxuICAgICAgZmxhdHRlbihub2RlLmNoaWxkcmVuLm1hcChjbG9uZSkpLmZvckVhY2goKG46IERhdGFGbG93Tm9kZSkgPT4gbi5wYXJlbnQgPSBjb3B5KTtcblxuICAgICAgcmV0dXJuIFtjb3B5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdHRlbihub2RlLmNoaWxkcmVuLm1hcChjbG9uZSkpO1xuICB9XG4gIHJldHVybiBjbG9uZTtcbn1cblxuLyoqXG4gKiBNb3ZlIGZhY2V0IG5vZGVzIGRvd24gdG8gdGhlIG5leHQgZm9yayBvciBvdXRwdXQgbm9kZS4gQWxzbyBwdWxsIHRoZSBtYWluIG91dHB1dCB3aXRoIHRoZSBmYWNldCBub2RlLlxuICogQWZ0ZXIgbW92aW5nIGRvd24gdGhlIGZhY2V0IG5vZGUsIG1ha2UgYSBjb3B5IG9mIHRoZSBzdWJ0cmVlIGFuZCBtYWtlIGl0IGEgY2hpbGQgb2YgdGhlIG1haW4gb3V0cHV0LlxuICovXG5mdW5jdGlvbiBtb3ZlRmFjZXREb3duKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICBpZiAobm9kZSBpbnN0YW5jZW9mIEZhY2V0Tm9kZSkge1xuICAgIGlmIChub2RlLm51bUNoaWxkcmVuKCkgPT09IDEgJiYgIShub2RlLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgT3V0cHV0Tm9kZSkpIHtcbiAgICAgIC8vIG1vdmUgZG93biB1bnRpbCB3ZSBoaXQgYSBmb3JrIG9yIG91dHB1dCBub2RlXG5cbiAgICAgIGNvbnN0IGNoaWxkID0gbm9kZS5jaGlsZHJlblswXTtcblxuICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQWdncmVnYXRlTm9kZSB8fCBjaGlsZCBpbnN0YW5jZW9mIFN0YWNrTm9kZSkge1xuICAgICAgICBjaGlsZC5hZGREaW1lbnNpb25zKG5vZGUuZmllbGRzKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGQuc3dhcFdpdGhQYXJlbnQoKTtcbiAgICAgIG1vdmVGYWNldERvd24obm9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG1vdmUgbWFpbiB0byBmYWNldFxuICAgICAgbW92ZU1haW5Eb3duVG9GYWNldChub2RlLm1vZGVsLmNvbXBvbmVudC5kYXRhLm1haW4pO1xuXG4gICAgICAvLyByZXBsaWNhdGUgdGhlIHN1YnRyZWUgYW5kIHBsYWNlIGl0IGJlZm9yZSB0aGUgZmFjZXQncyBtYWluIG5vZGVcbiAgICAgIGNvbnN0IGNvcHk6IERhdGFGbG93Tm9kZVtdID0gZmxhdHRlbihub2RlLmNoaWxkcmVuLm1hcChjbG9uZVN1YnRyZWUobm9kZSkpKTtcbiAgICAgIGNvcHkuZm9yRWFjaChjID0+IGMucGFyZW50ID0gbm9kZS5tb2RlbC5jb21wb25lbnQuZGF0YS5tYWluKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKG1vdmVGYWNldERvd24pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1vdmVNYWluRG93blRvRmFjZXQobm9kZTogRGF0YUZsb3dOb2RlKSB7XG4gIGlmIChub2RlIGluc3RhbmNlb2YgT3V0cHV0Tm9kZSAmJiBub2RlLnR5cGUgPT09IE1BSU4pIHtcbiAgICBpZiAobm9kZS5udW1DaGlsZHJlbigpID09PSAxKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IG5vZGUuY2hpbGRyZW5bMF07XG5cbiAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgRmFjZXROb2RlKSkge1xuICAgICAgICBjaGlsZC5zd2FwV2l0aFBhcmVudCgpO1xuICAgICAgICBtb3ZlTWFpbkRvd25Ub0ZhY2V0KG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlbW92ZSBub2RlcyB0aGF0IGFyZSBub3QgcmVxdWlyZWQgc3RhcnRpbmcgZnJvbSBhIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVVubmVjZXNzYXJ5Tm9kZXMobm9kZTogRGF0YUZsb3dOb2RlKSB7XG5cbiAgLy8gcmVtb3ZlIGVtcHR5IG51bGwgZmlsdGVyIG5vZGVzXG4gIGlmIChub2RlIGluc3RhbmNlb2YgRmlsdGVySW52YWxpZE5vZGUgJiYgZXZlcnkodmFscyhub2RlLmZpbHRlciksIGYgPT4gZiA9PT0gbnVsbCkpIHtcbiAgICBub2RlLnJlbW92ZSgpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIG91dHB1dCBub2RlcyB0aGF0IGFyZSBub3QgcmVxdWlyZWRcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPdXRwdXROb2RlICYmICFub2RlLmlzUmVxdWlyZWQoKSkge1xuICAgIG5vZGUucmVtb3ZlKCk7XG4gIH1cblxuICBub2RlLmNoaWxkcmVuLmZvckVhY2gocmVtb3ZlVW5uZWNlc3NhcnlOb2Rlcyk7XG59XG5cbi8qKlxuICogUmV0dXJuIGFsbCBsZWFmIG5vZGVzLlxuICovXG5mdW5jdGlvbiBnZXRMZWF2ZXMocm9vdHM6IERhdGFGbG93Tm9kZVtdKSB7XG4gIGNvbnN0IGxlYXZlczogRGF0YUZsb3dOb2RlW10gPSBbXTtcbiAgZnVuY3Rpb24gYXBwZW5kKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICAgIGlmIChub2RlLm51bUNoaWxkcmVuKCkgPT09IDApIHtcbiAgICAgIGxlYXZlcy5wdXNoKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goYXBwZW5kKTtcbiAgICB9XG4gIH1cblxuICByb290cy5mb3JFYWNoKGFwcGVuZCk7XG4gIHJldHVybiBsZWF2ZXM7XG59XG5cbi8qKlxuICogT3B0aW1pemVzIHRoZSBkYXRhZmxvdyBvZiB0aGUgcGFzc2VkIGluIGRhdGEgY29tcG9uZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW1pemVEYXRhZmxvdyhkYXRhQ29tcG9uZW50OiBEYXRhQ29tcG9uZW50KSB7XG4gIGxldCByb290czogU291cmNlTm9kZVtdID0gdmFscyhkYXRhQ29tcG9uZW50LnNvdXJjZXMpO1xuXG4gIHJvb3RzLmZvckVhY2gocmVtb3ZlVW5uZWNlc3NhcnlOb2Rlcyk7XG5cbiAgLy8gcmVtb3ZlIHNvdXJjZSBub2RlcyB0aGF0IGRvbid0IGhhdmUgYW55IGNoaWxkcmVuIGJlY2F1c2UgdGhleSBhbHNvIGRvbid0IGhhdmUgb3V0cHV0IG5vZGVzXG4gIHJvb3RzID0gcm9vdHMuZmlsdGVyKHIgPT4gci5udW1DaGlsZHJlbigpID4gMCk7XG4gIGdldExlYXZlcyhyb290cykuZm9yRWFjaChvcHRpbWl6ZXJzLml0ZXJhdGVGcm9tTGVhdmVzKG9wdGltaXplcnMucmVtb3ZlVW51c2VkU3VidHJlZXMpKTtcbiAgcm9vdHMgPSByb290cy5maWx0ZXIociA9PiByLm51bUNoaWxkcmVuKCkgPiAwKTtcblxuICBnZXRMZWF2ZXMocm9vdHMpLmZvckVhY2gob3B0aW1pemVycy5pdGVyYXRlRnJvbUxlYXZlcyhvcHRpbWl6ZXJzLm1vdmVQYXJzZVVwKSk7XG4gIGdldExlYXZlcyhyb290cykuZm9yRWFjaChvcHRpbWl6ZXJzLnJlbW92ZUR1cGxpY2F0ZVRpbWVVbml0cyk7XG5cbiAgcm9vdHMuZm9yRWFjaChtb3ZlRmFjZXREb3duKTtcblxuICBrZXlzKGRhdGFDb21wb25lbnQuc291cmNlcykuZm9yRWFjaChzID0+IHtcbiAgICBpZiAoZGF0YUNvbXBvbmVudC5zb3VyY2VzW3NdLm51bUNoaWxkcmVuKCkgPT09IDApIHtcbiAgICAgIGRlbGV0ZSBkYXRhQ29tcG9uZW50LnNvdXJjZXNbc107XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isString } from 'vega-util';\nimport { SHARED_DOMAIN_OP_INDEX } from '../../aggregate';\nimport { binToString, isBinParams } from '../../bin';\nimport { isScaleChannel } from '../../channel';\nimport { MAIN, RAW } from '../../data';\nimport { dateTimeExpr, isDateTime } from '../../datetime';\nimport { vgField } from '../../fielddef';\nimport * as log from '../../log';\nimport { hasDiscreteDomain, isBinScale, isSelectionDomain } from '../../scale';\nimport { isSortArray, isSortField } from '../../sort';\nimport * as util from '../../util';\nimport { isDataRefDomain, isDataRefUnionedDomain, isFieldRefUnionDomain } from '../../vega.schema';\nimport { binRequiresRange } from '../common';\nimport { sortArrayIndexField } from '../data/calculate';\nimport { FACET_SCALE_PREFIX } from '../data/optimize';\nimport { isFacetModel, isUnitModel } from '../model';\nimport { SELECTION_DOMAIN } from '../selection/selection';\nexport function parseScaleDomain(model) {\n if (isUnitModel(model)) {\n parseUnitScaleDomain(model);\n }\n else {\n parseNonUnitScaleDomain(model);\n }\n}\nfunction parseUnitScaleDomain(model) {\n var scales = model.specifiedScales;\n var localScaleComponents = model.component.scales;\n util.keys(localScaleComponents).forEach(function (channel) {\n var specifiedScale = scales[channel];\n var specifiedDomain = specifiedScale ? specifiedScale.domain : undefined;\n var domains = parseDomainForChannel(model, channel);\n var localScaleCmpt = localScaleComponents[channel];\n localScaleCmpt.domains = domains;\n if (isSelectionDomain(specifiedDomain)) {\n // As scale parsing occurs before selection parsing, we use a temporary\n // signal here and append the scale.domain definition. This is replaced\n // with the correct domainRaw signal during scale assembly.\n // For more information, see isRawSelectionDomain in selection.ts.\n // FIXME: replace this with a special property in the scaleComponent\n localScaleCmpt.set('domainRaw', {\n signal: SELECTION_DOMAIN + util.hash(specifiedDomain)\n }, true);\n }\n if (model.component.data.isFaceted) {\n // get resolve from closest facet parent as this decides whether we need to refer to cloned subtree or not\n var facetParent = model;\n while (!isFacetModel(facetParent) && facetParent.parent) {\n facetParent = facetParent.parent;\n }\n var resolve = facetParent.component.resolve.scale[channel];\n if (resolve === 'shared') {\n for (var _i = 0, domains_1 = domains; _i < domains_1.length; _i++) {\n var domain = domains_1[_i];\n // Replace the scale domain with data output from a cloned subtree after the facet.\n if (isDataRefDomain(domain)) {\n // use data from cloned subtree (which is the same as data but with a prefix added once)\n domain.data = FACET_SCALE_PREFIX + domain.data.replace(FACET_SCALE_PREFIX, '');\n }\n }\n }\n }\n });\n}\nfunction parseNonUnitScaleDomain(model) {\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n parseScaleDomain(child);\n }\n var localScaleComponents = model.component.scales;\n util.keys(localScaleComponents).forEach(function (channel) {\n var domains;\n var domainRaw = null;\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n var childComponent = child.component.scales[channel];\n if (childComponent) {\n if (domains === undefined) {\n domains = childComponent.domains;\n }\n else {\n domains = domains.concat(childComponent.domains);\n }\n var dr = childComponent.get('domainRaw');\n if (domainRaw && dr && domainRaw.signal !== dr.signal) {\n log.warn('The same selection must be used to override scale domains in a layered view.');\n }\n domainRaw = dr;\n }\n }\n localScaleComponents[channel].domains = domains;\n if (domainRaw) {\n localScaleComponents[channel].set('domainRaw', domainRaw, true);\n }\n });\n}\n/**\n * Remove unaggregated domain if it is not applicable\n * Add unaggregated domain if domain is not specified and config.scale.useUnaggregatedDomain is true.\n */\nfunction normalizeUnaggregatedDomain(domain, fieldDef, scaleType, scaleConfig) {\n if (domain === 'unaggregated') {\n var _a = canUseUnaggregatedDomain(fieldDef, scaleType), valid = _a.valid, reason = _a.reason;\n if (!valid) {\n log.warn(reason);\n return undefined;\n }\n }\n else if (domain === undefined && scaleConfig.useUnaggregatedDomain) {\n // Apply config if domain is not specified.\n var valid = canUseUnaggregatedDomain(fieldDef, scaleType).valid;\n if (valid) {\n return 'unaggregated';\n }\n }\n return domain;\n}\nexport function parseDomainForChannel(model, channel) {\n var scaleType = model.getScaleComponent(channel).get('type');\n var domain = normalizeUnaggregatedDomain(model.scaleDomain(channel), model.fieldDef(channel), scaleType, model.config.scale);\n if (domain !== model.scaleDomain(channel)) {\n model.specifiedScales[channel] = tslib_1.__assign({}, model.specifiedScales[channel], { domain: domain });\n }\n // If channel is either X or Y then union them with X2 & Y2 if they exist\n if (channel === 'x' && model.channelHasField('x2')) {\n if (model.channelHasField('x')) {\n return parseSingleChannelDomain(scaleType, domain, model, 'x').concat(parseSingleChannelDomain(scaleType, domain, model, 'x2'));\n }\n else {\n return parseSingleChannelDomain(scaleType, domain, model, 'x2');\n }\n }\n else if (channel === 'y' && model.channelHasField('y2')) {\n if (model.channelHasField('y')) {\n return parseSingleChannelDomain(scaleType, domain, model, 'y').concat(parseSingleChannelDomain(scaleType, domain, model, 'y2'));\n }\n else {\n return parseSingleChannelDomain(scaleType, domain, model, 'y2');\n }\n }\n return parseSingleChannelDomain(scaleType, domain, model, channel);\n}\nfunction parseSingleChannelDomain(scaleType, domain, model, channel) {\n var fieldDef = model.fieldDef(channel);\n if (domain && domain !== 'unaggregated' && !isSelectionDomain(domain)) { // explicit value\n if (isDateTime(domain[0])) {\n return domain.map(function (dt) {\n return { signal: \"{data: \" + dateTimeExpr(dt, true) + \"}\" };\n });\n }\n return [domain];\n }\n var stack = model.stack;\n if (stack && channel === stack.fieldChannel) {\n if (stack.offset === 'normalize') {\n return [[0, 1]];\n }\n var data = model.requestDataName(MAIN);\n return [{\n data: data,\n field: model.vgField(channel, { suffix: 'start' })\n }, {\n data: data,\n field: model.vgField(channel, { suffix: 'end' })\n }];\n }\n var sort = isScaleChannel(channel) ? domainSort(model, channel, scaleType) : undefined;\n if (domain === 'unaggregated') {\n var data = model.requestDataName(MAIN);\n var field = fieldDef.field;\n return [{\n data: data,\n field: vgField({ field: field, aggregate: 'min' })\n }, {\n data: data,\n field: vgField({ field: field, aggregate: 'max' })\n }];\n }\n else if (fieldDef.bin) { // bin\n if (isBinScale(scaleType)) {\n var signal = model.getName(binToString(fieldDef.bin) + \"_\" + fieldDef.field + \"_bins\");\n return [{ signal: \"sequence(\" + signal + \".start, \" + signal + \".stop + \" + signal + \".step, \" + signal + \".step)\" }];\n }\n if (hasDiscreteDomain(scaleType)) {\n // ordinal bin scale takes domain from bin_range, ordered by bin start\n // This is useful for both axis-based scale (x/y) and legend-based scale (other channels).\n return [{\n // If sort by aggregation of a specified sort field, we need to use RAW table,\n // so we can aggregate values for the scale independently from the main aggregation.\n data: util.isBoolean(sort) ? model.requestDataName(MAIN) : model.requestDataName(RAW),\n // Use range if we added it and the scale does not support computing a range as a signal.\n field: model.vgField(channel, binRequiresRange(fieldDef, channel) ? { binSuffix: 'range' } : {}),\n // we have to use a sort object if sort = true to make the sort correct by bin start\n sort: sort === true || !isSortField(sort) ? {\n field: model.vgField(channel, {}),\n op: 'min' // min or max doesn't matter since we sort by the start of the bin range\n } : sort\n }];\n }\n else { // continuous scales\n if (channel === 'x' || channel === 'y') {\n if (isBinParams(fieldDef.bin) && fieldDef.bin.extent) {\n return [fieldDef.bin.extent];\n }\n // X/Y position have to include start and end for non-ordinal scale\n var data = model.requestDataName(MAIN);\n return [{\n data: data,\n field: model.vgField(channel, {})\n }, {\n data: data,\n field: model.vgField(channel, { binSuffix: 'end' })\n }];\n }\n else {\n // TODO: use bin_mid\n return [{\n data: model.requestDataName(MAIN),\n field: model.vgField(channel, {})\n }];\n }\n }\n }\n else if (sort) {\n return [{\n // If sort by aggregation of a specified sort field, we need to use RAW table,\n // so we can aggregate values for the scale independently from the main aggregation.\n data: util.isBoolean(sort) ? model.requestDataName(MAIN) : model.requestDataName(RAW),\n field: model.vgField(channel),\n sort: sort\n }];\n }\n else {\n return [{\n data: model.requestDataName(MAIN),\n field: model.vgField(channel)\n }];\n }\n}\nexport function domainSort(model, channel, scaleType) {\n if (!hasDiscreteDomain(scaleType)) {\n return undefined;\n }\n var fieldDef = model.fieldDef(channel);\n var sort = fieldDef.sort;\n // if the sort is specified with array, use the derived sort index field\n if (isSortArray(sort)) {\n return {\n op: 'min',\n field: sortArrayIndexField(model, channel),\n order: 'ascending'\n };\n }\n // Sorted based on an aggregate calculation over a specified sort field (only for ordinal scale)\n if (isSortField(sort)) {\n // flatten nested fields\n return tslib_1.__assign({}, sort, (sort.field ? { field: util.replacePathInField(sort.field) } : {}));\n }\n if (sort === 'descending') {\n return {\n op: 'min',\n field: model.vgField(channel),\n order: 'descending'\n };\n }\n if (util.contains(['ascending', undefined /* default =ascending*/], sort)) {\n return true;\n }\n // sort == null\n return undefined;\n}\n/**\n * Determine if a scale can use unaggregated domain.\n * @return {Boolean} Returns true if all of the following conditons applies:\n * 1. `scale.domain` is `unaggregated`\n * 2. Aggregation function is not `count` or `sum`\n * 3. The scale is quantitative or time scale.\n */\nexport function canUseUnaggregatedDomain(fieldDef, scaleType) {\n if (!fieldDef.aggregate) {\n return {\n valid: false,\n reason: log.message.unaggregateDomainHasNoEffectForRawField(fieldDef)\n };\n }\n if (!SHARED_DOMAIN_OP_INDEX[fieldDef.aggregate]) {\n return {\n valid: false,\n reason: log.message.unaggregateDomainWithNonSharedDomainOp(fieldDef.aggregate)\n };\n }\n if (fieldDef.type === 'quantitative') {\n if (scaleType === 'log') {\n return {\n valid: false,\n reason: log.message.unaggregatedDomainWithLogScale(fieldDef)\n };\n }\n }\n return { valid: true };\n}\n/**\n * Converts an array of domains to a single Vega scale domain.\n */\nexport function mergeDomains(domains) {\n var uniqueDomains = util.unique(domains.map(function (domain) {\n // ignore sort property when computing the unique domains\n if (isDataRefDomain(domain)) {\n var _s = domain.sort, domainWithoutSort = tslib_1.__rest(domain, [\"sort\"]);\n return domainWithoutSort;\n }\n return domain;\n }), util.hash);\n var sorts = util.unique(domains.map(function (d) {\n if (isDataRefDomain(d)) {\n var s = d.sort;\n if (s !== undefined && !util.isBoolean(s)) {\n if (s.op === 'count') {\n // let's make sure that if op is count, we don't use a field\n delete s.field;\n }\n if (s.order === 'ascending') {\n // drop order: ascending as it is the default\n delete s.order;\n }\n }\n return s;\n }\n return undefined;\n }).filter(function (s) { return s !== undefined; }), util.hash);\n if (uniqueDomains.length === 1) {\n var domain = domains[0];\n if (isDataRefDomain(domain) && sorts.length > 0) {\n var sort_1 = sorts[0];\n if (sorts.length > 1) {\n log.warn(log.message.MORE_THAN_ONE_SORT);\n sort_1 = true;\n }\n return tslib_1.__assign({}, domain, { sort: sort_1 });\n }\n return domain;\n }\n // only keep simple sort properties that work with unioned domains\n var simpleSorts = util.unique(sorts.map(function (s) {\n if (s === true) {\n return s;\n }\n if (s.op === 'count') {\n return s;\n }\n log.warn(log.message.domainSortDropped(s));\n return true;\n }), util.hash);\n var sort = undefined;\n if (simpleSorts.length === 1) {\n sort = simpleSorts[0];\n }\n else if (simpleSorts.length > 1) {\n log.warn(log.message.MORE_THAN_ONE_SORT);\n sort = true;\n }\n var allData = util.unique(domains.map(function (d) {\n if (isDataRefDomain(d)) {\n return d.data;\n }\n return null;\n }), function (x) { return x; });\n if (allData.length === 1 && allData[0] !== null) {\n // create a union domain of different fields with a single data source\n var domain = tslib_1.__assign({ data: allData[0], fields: uniqueDomains.map(function (d) { return d.field; }) }, (sort ? { sort: sort } : {}));\n return domain;\n }\n return tslib_1.__assign({ fields: uniqueDomains }, (sort ? { sort: sort } : {}));\n}\n/**\n * Return a field if a scale single field.\n * Return `undefined` otherwise.\n *\n */\nexport function getFieldFromDomain(domain) {\n if (isDataRefDomain(domain) && isString(domain.field)) {\n return domain.field;\n }\n else if (isDataRefUnionedDomain(domain)) {\n var field = void 0;\n for (var _i = 0, _a = domain.fields; _i < _a.length; _i++) {\n var nonUnionDomain = _a[_i];\n if (isDataRefDomain(nonUnionDomain) && isString(nonUnionDomain.field)) {\n if (!field) {\n field = nonUnionDomain.field;\n }\n else if (field !== nonUnionDomain.field) {\n log.warn('Detected faceted independent scales that union domain of multiple fields from different data sources. We will use the first field. The result view size may be incorrect.');\n return field;\n }\n }\n }\n log.warn('Detected faceted independent scales that union domain of identical fields from different source detected. We will assume that this is the same field from a different fork of the same data source. However, if this is not case, the result view size maybe incorrect.');\n return field;\n }\n else if (isFieldRefUnionDomain(domain)) {\n log.warn('Detected faceted independent scales that union domain of multiple fields from the same data source. We will use the first field. The result view size may be incorrect.');\n var field = domain.fields[0];\n return isString(field) ? field : undefined;\n }\n return undefined;\n}\nexport function assembleDomain(model, channel) {\n var scaleComponent = model.component.scales[channel];\n var domains = scaleComponent.domains.map(function (domain) {\n // Correct references to data as the original domain's data was determined\n // in parseScale, which happens before parseData. Thus the original data\n // reference can be incorrect.\n if (isDataRefDomain(domain)) {\n domain.data = model.lookupDataSource(domain.data);\n }\n return domain;\n });\n // domains is an array that has to be merged into a single vega domain\n return mergeDomains(domains);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2NhbGUvZG9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxXQUFXLEVBQUUsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBQyxjQUFjLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFXLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQTBCLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBUyxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQXlCLE1BQU0sYUFBYSxDQUFDO0FBQzdHLE9BQU8sRUFBb0IsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN2RSxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUE4RixNQUFNLG1CQUFtQixDQUFDO0FBQzlMLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBUSxNQUFNLFVBQVUsQ0FBQztBQUMxRCxP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LElBQUksR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxzRUFBc0U7SUFDdEUsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge1NIQVJFRF9ET01BSU5fT1BfSU5ERVh9IGZyb20gJy4uLy4uL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge2JpblRvU3RyaW5nLCBpc0JpblBhcmFtc30gZnJvbSAnLi4vLi4vYmluJztcbmltcG9ydCB7aXNTY2FsZUNoYW5uZWwsIFNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge01BSU4sIFJBV30gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4uLy4uL2RhdGV0aW1lJztcbmltcG9ydCB7RmllbGREZWYsIFNjYWxlRmllbGREZWYsIHZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtEb21haW4sIGhhc0Rpc2NyZXRlRG9tYWluLCBpc0JpblNjYWxlLCBpc1NlbGVjdGlvbkRvbWFpbiwgU2NhbGVDb25maWcsIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtFbmNvZGluZ1NvcnRGaWVsZCwgaXNTb3J0QXJyYXksIGlzU29ydEZpZWxkfSBmcm9tICcuLi8uLi9zb3J0JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2lzRGF0YVJlZkRvbWFpbiwgaXNEYXRhUmVmVW5pb25lZERvbWFpbiwgaXNGaWVsZFJlZlVuaW9uRG9tYWluLCBWZ0RhdGFSZWYsIFZnRG9tYWluLCBWZ0ZpZWxkUmVmVW5pb25Eb21haW4sIFZnTm9uVW5pb25Eb21haW4sIFZnU29ydEZpZWxkLCBWZ1VuaW9uU29ydEZpZWxkfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2JpblJlcXVpcmVzUmFuZ2V9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge3NvcnRBcnJheUluZGV4RmllbGR9IGZyb20gJy4uL2RhdGEvY2FsY3VsYXRlJztcbmltcG9ydCB7RkFDRVRfU0NBTEVfUFJFRklYfSBmcm9tICcuLi9kYXRhL29wdGltaXplJztcbmltcG9ydCB7aXNGYWNldE1vZGVsLCBpc1VuaXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7U0VMRUNUSU9OX0RPTUFJTn0gZnJvbSAnLi4vc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTY2FsZURvbWFpbihtb2RlbDogTW9kZWwpIHtcbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSkge1xuICAgIHBhcnNlVW5pdFNjYWxlRG9tYWluKG1vZGVsKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJzZU5vblVuaXRTY2FsZURvbWFpbihtb2RlbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VVbml0U2NhbGVEb21haW4obW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCBzY2FsZXMgPSBtb2RlbC5zcGVjaWZpZWRTY2FsZXM7XG4gIGNvbnN0IGxvY2FsU2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlcztcblxuICB1dGlsLmtleXMobG9jYWxTY2FsZUNvbXBvbmVudHMpLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGNvbnN0IHNwZWNpZmllZFNjYWxlID0gc2NhbGVzW2NoYW5uZWxdO1xuICAgIGNvbnN0IHNwZWNpZmllZERvbWFpbiA9IHNwZWNpZmllZFNjYWxlID8gc3BlY2lmaWVkU2NhbGUuZG9tYWluIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZG9tYWlucyA9IHBhcnNlRG9tYWluRm9yQ2hhbm5lbChtb2RlbCwgY2hhbm5lbCk7XG4gICAgY29uc3QgbG9jYWxTY2FsZUNtcHQgPSBsb2NhbFNjYWxlQ29tcG9uZW50c1tjaGFubmVsXTtcbiAgICBsb2NhbFNjYWxlQ21wdC5kb21haW5zID0gZG9tYWlucztcblxuICAgIGlmIChpc1NlbGVjdGlvbkRvbWFpbihzcGVjaWZpZWREb21haW4pKSB7XG4gICAgICAvLyBBcyBzY2FsZSBwYXJzaW5nIG9jY3VycyBiZWZvcmUgc2VsZWN0aW9uIHBhcnNpbmcsIHdlIHVzZSBhIHRlbXBvcmFyeVxuICAgICAgLy8gc2lnbmFsIGhlcmUgYW5kIGFwcGVuZCB0aGUgc2NhbGUuZG9tYWluIGRlZmluaXRpb24uIFRoaXMgaXMgcmVwbGFjZWRcbiAgICAgIC8vIHdpdGggdGhlIGNvcnJlY3QgZG9tYWluUmF3IHNpZ25hbCBkdXJpbmcgc2NhbGUgYXNzZW1ibHkuXG4gICAgICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGlzUmF3U2VsZWN0aW9uRG9tYWluIGluIHNlbGVjdGlvbi50cy5cblxuICAgICAgLy8gRklYTUU6IHJlcGxhY2UgdGhpcyB3aXRoIGEgc3BlY2lhbCBwcm9wZXJ0eSBpbiB0aGUgc2NhbGVDb21wb25lbnRcbiAgICAgIGxvY2FsU2NhbGVDbXB0LnNldCgnZG9tYWluUmF3Jywge1xuICAgICAgICBzaWduYWw6IFNFTEVDVElPTl9ET01BSU4gKyB1dGlsLmhhc2goc3BlY2lmaWVkRG9tYWluKVxuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKG1vZGVsLmNvbXBvbmVudC5kYXRhLmlzRmFjZXRlZCkge1xuICAgICAgLy8gZ2V0IHJlc29sdmUgZnJvbSBjbG9zZXN0IGZhY2V0IHBhcmVudCBhcyB0aGlzIGRlY2lkZXMgd2hldGhlciB3ZSBuZWVkIHRvIHJlZmVyIHRvIGNsb25lZCBzdWJ0cmVlIG9yIG5vdFxuICAgICAgbGV0IGZhY2V0UGFyZW50OiBNb2RlbCA9IG1vZGVsO1xuICAgICAgd2hpbGUgKCFpc0ZhY2V0TW9kZWwoZmFjZXRQYXJlbnQpICYmIGZhY2V0UGFyZW50LnBhcmVudCkge1xuICAgICAgICBmYWNldFBhcmVudCA9IGZhY2V0UGFyZW50LnBhcmVudDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzb2x2ZSA9IGZhY2V0UGFyZW50LmNvbXBvbmVudC5yZXNvbHZlLnNjYWxlW2NoYW5uZWxdO1xuXG4gICAgICBpZiAocmVzb2x2ZSA9PT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb21haW4gb2YgZG9tYWlucykge1xuICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIHNjYWxlIGRvbWFpbiB3aXRoIGRhdGEgb3V0cHV0IGZyb20gYSBjbG9uZWQgc3VidHJlZSBhZnRlciB0aGUgZmFjZXQuXG4gICAgICAgICAgaWYgKGlzRGF0YVJlZkRvbWFpbihkb21haW4pKSB7XG4gICAgICAgICAgICAvLyB1c2UgZGF0YSBmcm9tIGNsb25lZCBzdWJ0cmVlICh3aGljaCBpcyB0aGUgc2FtZSBhcyBkYXRhIGJ1dCB3aXRoIGEgcHJlZml4IGFkZGVkIG9uY2UpXG4gICAgICAgICAgICBkb21haW4uZGF0YSA9IEZBQ0VUX1NDQUxFX1BSRUZJWCArIGRvbWFpbi5kYXRhLnJlcGxhY2UoRkFDRVRfU0NBTEVfUFJFRklYLCAnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb25Vbml0U2NhbGVEb21haW4obW9kZWw6IE1vZGVsKSB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICBwYXJzZVNjYWxlRG9tYWluKGNoaWxkKTtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsU2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlcztcblxuICB1dGlsLmtleXMobG9jYWxTY2FsZUNvbXBvbmVudHMpLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGxldCBkb21haW5zOiBWZ05vblVuaW9uRG9tYWluW107XG4gICAgbGV0IGRvbWFpblJhdyA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZENvbXBvbmVudCA9IGNoaWxkLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICBpZiAoY2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgaWYgKGRvbWFpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvbWFpbnMgPSBjaGlsZENvbXBvbmVudC5kb21haW5zO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbWFpbnMgPSBkb21haW5zLmNvbmNhdChjaGlsZENvbXBvbmVudC5kb21haW5zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRyID0gY2hpbGRDb21wb25lbnQuZ2V0KCdkb21haW5SYXcnKTtcbiAgICAgICAgaWYgKGRvbWFpblJhdyAmJiBkciAmJiBkb21haW5SYXcuc2lnbmFsICE9PSBkci5zaWduYWwpIHtcbiAgICAgICAgICBsb2cud2FybignVGhlIHNhbWUgc2VsZWN0aW9uIG11c3QgYmUgdXNlZCB0byBvdmVycmlkZSBzY2FsZSBkb21haW5zIGluIGEgbGF5ZXJlZCB2aWV3LicpO1xuICAgICAgICB9XG4gICAgICAgIGRvbWFpblJhdyA9IGRyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvY2FsU2NhbGVDb21wb25lbnRzW2NoYW5uZWxdLmRvbWFpbnMgPSBkb21haW5zO1xuXG4gICAgaWYgKGRvbWFpblJhdykge1xuICAgICAgbG9jYWxTY2FsZUNvbXBvbmVudHNbY2hhbm5lbF0uc2V0KCdkb21haW5SYXcnLCBkb21haW5SYXcsIHRydWUpO1xuICAgIH1cbiAgfSk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmUgdW5hZ2dyZWdhdGVkIGRvbWFpbiBpZiBpdCBpcyBub3QgYXBwbGljYWJsZVxuICogQWRkIHVuYWdncmVnYXRlZCBkb21haW4gaWYgZG9tYWluIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGNvbmZpZy5zY2FsZS51c2VVbmFnZ3JlZ2F0ZWREb21haW4gaXMgdHJ1ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplVW5hZ2dyZWdhdGVkRG9tYWluKGRvbWFpbjogRG9tYWluLCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPiwgc2NhbGVUeXBlOiBTY2FsZVR5cGUsIHNjYWxlQ29uZmlnOiBTY2FsZUNvbmZpZykge1xuICBpZiAoZG9tYWluID09PSAndW5hZ2dyZWdhdGVkJykge1xuICAgIGNvbnN0IHt2YWxpZCwgcmVhc29ufSA9IGNhblVzZVVuYWdncmVnYXRlZERvbWFpbihmaWVsZERlZiwgc2NhbGVUeXBlKTtcbiAgICBpZighdmFsaWQpIHtcbiAgICAgIGxvZy53YXJuKHJlYXNvbik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkb21haW4gPT09IHVuZGVmaW5lZCAmJiBzY2FsZUNvbmZpZy51c2VVbmFnZ3JlZ2F0ZWREb21haW4pIHtcbiAgICAvLyBBcHBseSBjb25maWcgaWYgZG9tYWluIGlzIG5vdCBzcGVjaWZpZWQuXG4gICAgY29uc3Qge3ZhbGlkfSA9IGNhblVzZVVuYWdncmVnYXRlZERvbWFpbihmaWVsZERlZiwgc2NhbGVUeXBlKTtcbiAgICBpZiAodmFsaWQpIHtcbiAgICAgIHJldHVybiAndW5hZ2dyZWdhdGVkJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZG9tYWluO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEb21haW5Gb3JDaGFubmVsKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCk6IFZnTm9uVW5pb25Eb21haW5bXSB7XG4gIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuXG4gIGNvbnN0IGRvbWFpbiA9IG5vcm1hbGl6ZVVuYWdncmVnYXRlZERvbWFpbihtb2RlbC5zY2FsZURvbWFpbihjaGFubmVsKSwgbW9kZWwuZmllbGREZWYoY2hhbm5lbCksIHNjYWxlVHlwZSwgbW9kZWwuY29uZmlnLnNjYWxlKTtcbiAgaWYgKGRvbWFpbiAhPT0gbW9kZWwuc2NhbGVEb21haW4oY2hhbm5lbCkpIHtcbiAgICBtb2RlbC5zcGVjaWZpZWRTY2FsZXNbY2hhbm5lbF0gPSB7XG4gICAgICAuLi5tb2RlbC5zcGVjaWZpZWRTY2FsZXNbY2hhbm5lbF0sXG4gICAgICBkb21haW5cbiAgICB9O1xuICB9XG5cbiAgLy8gSWYgY2hhbm5lbCBpcyBlaXRoZXIgWCBvciBZIHRoZW4gdW5pb24gdGhlbSB3aXRoIFgyICYgWTIgaWYgdGhleSBleGlzdFxuICBpZiAoY2hhbm5lbCA9PT0gJ3gnICYmIG1vZGVsLmNoYW5uZWxIYXNGaWVsZCgneDInKSkge1xuICAgIGlmIChtb2RlbC5jaGFubmVsSGFzRmllbGQoJ3gnKSkge1xuICAgICAgcmV0dXJuIHBhcnNlU2luZ2xlQ2hhbm5lbERvbWFpbihzY2FsZVR5cGUsIGRvbWFpbiwgbW9kZWwsICd4JykuY29uY2F0KHBhcnNlU2luZ2xlQ2hhbm5lbERvbWFpbihzY2FsZVR5cGUsIGRvbWFpbiwgbW9kZWwsICd4MicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnNlU2luZ2xlQ2hhbm5lbERvbWFpbihzY2FsZVR5cGUsIGRvbWFpbiwgbW9kZWwsICd4MicpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjaGFubmVsID09PSAneScgJiYgbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKCd5MicpKSB7XG4gICAgaWYgKG1vZGVsLmNoYW5uZWxIYXNGaWVsZCgneScpKSB7XG4gICAgICByZXR1cm4gcGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3knKS5jb25jYXQocGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3kyJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZSwgZG9tYWluLCBtb2RlbCwgJ3kyJyk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJzZVNpbmdsZUNoYW5uZWxEb21haW4oc2NhbGVUeXBlLCBkb21haW4sIG1vZGVsLCBjaGFubmVsKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VTaW5nbGVDaGFubmVsRG9tYWluKHNjYWxlVHlwZTogU2NhbGVUeXBlLCBkb21haW46IERvbWFpbiwgbW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogU2NhbGVDaGFubmVsIHwgJ3gyJyB8ICd5MicpOiBWZ05vblVuaW9uRG9tYWluW10ge1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuXG4gIGlmIChkb21haW4gJiYgZG9tYWluICE9PSAndW5hZ2dyZWdhdGVkJyAmJiAhaXNTZWxlY3Rpb25Eb21haW4oZG9tYWluKSkgeyAvLyBleHBsaWNpdCB2YWx1ZVxuICAgIGlmIChpc0RhdGVUaW1lKGRvbWFpblswXSkpIHtcbiAgICAgIHJldHVybiAoZG9tYWluIGFzIERhdGVUaW1lW10pLm1hcCgoZHQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtzaWduYWw6IGB7ZGF0YTogJHtkYXRlVGltZUV4cHIoZHQsIHRydWUpfX1gfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gW2RvbWFpbl07XG4gIH1cblxuICBjb25zdCBzdGFjayA9IG1vZGVsLnN0YWNrO1xuICBpZiAoc3RhY2sgJiYgY2hhbm5lbCA9PT0gc3RhY2suZmllbGRDaGFubmVsKSB7XG4gICAgaWYoc3RhY2sub2Zmc2V0ID09PSAnbm9ybWFsaXplJykge1xuICAgICAgcmV0dXJuIFtbMCwgMV1dO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTik7XG4gICAgcmV0dXJuIFt7XG4gICAgICBkYXRhLFxuICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCwge3N1ZmZpeDogJ3N0YXJ0J30pXG4gICAgfSwge1xuICAgICAgZGF0YSxcbiAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIHtzdWZmaXg6ICdlbmQnfSlcbiAgICB9XTtcbiAgfVxuXG4gIGNvbnN0IHNvcnQgPSBpc1NjYWxlQ2hhbm5lbChjaGFubmVsKSA/IGRvbWFpblNvcnQobW9kZWwsIGNoYW5uZWwsIHNjYWxlVHlwZSkgOiB1bmRlZmluZWQ7XG5cbiAgaWYgKGRvbWFpbiA9PT0gJ3VuYWdncmVnYXRlZCcpIHtcbiAgICBjb25zdCBkYXRhID0gbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pO1xuICAgIGNvbnN0IHtmaWVsZH0gPSBmaWVsZERlZjtcbiAgICByZXR1cm4gW3tcbiAgICAgIGRhdGEsXG4gICAgICBmaWVsZDogdmdGaWVsZCh7ZmllbGQsIGFnZ3JlZ2F0ZTogJ21pbid9KVxuICAgIH0sIHtcbiAgICAgIGRhdGEsXG4gICAgICBmaWVsZDogdmdGaWVsZCh7ZmllbGQsIGFnZ3JlZ2F0ZTogJ21heCd9KVxuICAgIH1dO1xuICB9IGVsc2UgaWYgKGZpZWxkRGVmLmJpbikgeyAvLyBiaW5cbiAgICBpZiAoaXNCaW5TY2FsZShzY2FsZVR5cGUpKSB7XG4gICAgICBjb25zdCBzaWduYWwgPSBtb2RlbC5nZXROYW1lKGAke2JpblRvU3RyaW5nKGZpZWxkRGVmLmJpbil9XyR7ZmllbGREZWYuZmllbGR9X2JpbnNgKTtcbiAgICAgIHJldHVybiBbe3NpZ25hbDogYHNlcXVlbmNlKCR7c2lnbmFsfS5zdGFydCwgJHtzaWduYWx9LnN0b3AgKyAke3NpZ25hbH0uc3RlcCwgJHtzaWduYWx9LnN0ZXApYH1dO1xuICAgIH1cblxuICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgICAvLyBvcmRpbmFsIGJpbiBzY2FsZSB0YWtlcyBkb21haW4gZnJvbSBiaW5fcmFuZ2UsIG9yZGVyZWQgYnkgYmluIHN0YXJ0XG4gICAgICAvLyBUaGlzIGlzIHVzZWZ1bCBmb3IgYm90aCBheGlzLWJhc2VkIHNjYWxlICh4L3kpIGFuZCBsZWdlbmQtYmFzZWQgc2NhbGUgKG90aGVyIGNoYW5uZWxzKS5cbiAgICAgIHJldHVybiBbe1xuICAgICAgICAvLyBJZiBzb3J0IGJ5IGFnZ3JlZ2F0aW9uIG9mIGEgc3BlY2lmaWVkIHNvcnQgZmllbGQsIHdlIG5lZWQgdG8gdXNlIFJBVyB0YWJsZSxcbiAgICAgICAgLy8gc28gd2UgY2FuIGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIHRoZSBzY2FsZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIG1haW4gYWdncmVnYXRpb24uXG4gICAgICAgIGRhdGE6IHV0aWwuaXNCb29sZWFuKHNvcnQpID8gbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pIDogbW9kZWwucmVxdWVzdERhdGFOYW1lKFJBVyksXG4gICAgICAgIC8vIFVzZSByYW5nZSBpZiB3ZSBhZGRlZCBpdCBhbmQgdGhlIHNjYWxlIGRvZXMgbm90IHN1cHBvcnQgY29tcHV0aW5nIGEgcmFuZ2UgYXMgYSBzaWduYWwuXG4gICAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwsIGJpblJlcXVpcmVzUmFuZ2UoZmllbGREZWYsIGNoYW5uZWwpID8ge2JpblN1ZmZpeDogJ3JhbmdlJ30gOiB7fSksXG4gICAgICAgIC8vIHdlIGhhdmUgdG8gdXNlIGEgc29ydCBvYmplY3QgaWYgc29ydCA9IHRydWUgdG8gbWFrZSB0aGUgc29ydCBjb3JyZWN0IGJ5IGJpbiBzdGFydFxuICAgICAgICBzb3J0OiBzb3J0ID09PSB0cnVlIHx8ICFpc1NvcnRGaWVsZChzb3J0KSA/IHtcbiAgICAgICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsLCB7fSksXG4gICAgICAgICAgb3A6ICdtaW4nIC8vIG1pbiBvciBtYXggZG9lc24ndCBtYXR0ZXIgc2luY2Ugd2Ugc29ydCBieSB0aGUgc3RhcnQgb2YgdGhlIGJpbiByYW5nZVxuICAgICAgICB9IDogc29ydFxuICAgICAgfV07XG4gICAgfSBlbHNlIHsgLy8gY29udGludW91cyBzY2FsZXNcbiAgICAgIGlmIChjaGFubmVsID09PSAneCcgfHwgY2hhbm5lbCA9PT0gJ3knKSB7XG4gICAgICAgIGlmIChpc0JpblBhcmFtcyhmaWVsZERlZi5iaW4pICYmIGZpZWxkRGVmLmJpbi5leHRlbnQpIHtcbiAgICAgICAgICByZXR1cm4gW2ZpZWxkRGVmLmJpbi5leHRlbnRdO1xuICAgICAgICB9XG4gICAgICAgIC8vIFgvWSBwb3NpdGlvbiBoYXZlIHRvIGluY2x1ZGUgc3RhcnQgYW5kIGVuZCBmb3Igbm9uLW9yZGluYWwgc2NhbGVcbiAgICAgICAgY29uc3QgZGF0YSA9IG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKTtcbiAgICAgICAgcmV0dXJuIFt7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsLCB7fSlcbiAgICAgICAgfSwge1xuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCwge2JpblN1ZmZpeDogJ2VuZCd9KVxuICAgICAgICB9XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IHVzZSBiaW5fbWlkXG4gICAgICAgIHJldHVybiBbe1xuICAgICAgICAgIGRhdGE6IG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKSxcbiAgICAgICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsLCB7fSlcbiAgICAgICAgfV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHNvcnQpIHtcbiAgICByZXR1cm4gW3tcbiAgICAgIC8vIElmIHNvcnQgYnkgYWdncmVnYXRpb24gb2YgYSBzcGVjaWZpZWQgc29ydCBmaWVsZCwgd2UgbmVlZCB0byB1c2UgUkFXIHRhYmxlLFxuICAgICAgLy8gc28gd2UgY2FuIGFnZ3JlZ2F0ZSB2YWx1ZXMgZm9yIHRoZSBzY2FsZSBpbmRlcGVuZGVudGx5IGZyb20gdGhlIG1haW4gYWdncmVnYXRpb24uXG4gICAgICBkYXRhOiB1dGlsLmlzQm9vbGVhbihzb3J0KSA/IG1vZGVsLnJlcXVlc3REYXRhTmFtZShNQUlOKSA6IG1vZGVsLnJlcXVlc3REYXRhTmFtZShSQVcpLFxuICAgICAgZmllbGQ6IG1vZGVsLnZnRmllbGQoY2hhbm5lbCksXG4gICAgICBzb3J0OiBzb3J0XG4gICAgfV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFt7XG4gICAgICBkYXRhOiBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTiksXG4gICAgICBmaWVsZDogbW9kZWwudmdGaWVsZChjaGFubmVsKVxuICAgIH1dO1xuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGRvbWFpblNvcnQobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogU2NhbGVDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSk6IHRydWUgfCBFbmNvZGluZ1NvcnRGaWVsZDxzdHJpbmc+IHtcbiAgaWYgKCFoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGZpZWxkRGVmOiBTY2FsZUZpZWxkRGVmPHN0cmluZz4gPSBtb2RlbC5maWVsZERlZihjaGFubmVsKTtcbiAgY29uc3Qgc29ydCA9IGZpZWxkRGVmLnNvcnQ7XG5cbiAgLy8gaWYgdGhlIHNvcnQgaXMgc3BlY2lmaWVkIHdpdGggYXJyYXksIHVzZSB0aGUgZGVyaXZlZCBzb3J0IGluZGV4IGZpZWxkXG4gIGlmIChpc1NvcnRBcnJheShzb3J0KSkge1xuICAgIHJldHVybiB7XG4gICAgICBvcDogJ21pbicsXG4gICAgICBmaWVsZDogc29ydEFycmF5SW5kZXhGaWVsZChtb2RlbCwgY2hhbm5lbCksXG4gICAgICBvcmRlcjogJ2FzY2VuZGluZydcbiAgICB9O1xuICB9XG5cbiAgLy8gU29ydGVkIGJhc2VkIG9uIGFuIGFnZ3JlZ2F0ZSBjYWxjdWxhdGlvbiBvdmVyIGEgc3BlY2lmaWVkIHNvcnQgZmllbGQgKG9ubHkgZm9yIG9yZGluYWwgc2NhbGUpXG4gIGlmIChpc1NvcnRGaWVsZChzb3J0KSkge1xuICAgIC8vIGZsYXR0ZW4gbmVzdGVkIGZpZWxkc1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zb3J0LFxuICAgICAgLi4uKHNvcnQuZmllbGQgPyB7ZmllbGQ6IHV0aWwucmVwbGFjZVBhdGhJbkZpZWxkKHNvcnQuZmllbGQpfSA6IHt9KVxuICAgIH07XG4gIH1cblxuICBpZiAoc29ydCA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wOiAnbWluJyxcbiAgICAgIGZpZWxkOiBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwpLFxuICAgICAgb3JkZXI6ICdkZXNjZW5kaW5nJ1xuICAgIH07XG4gIH1cblxuICBpZiAodXRpbC5jb250YWlucyhbJ2FzY2VuZGluZycsIHVuZGVmaW5lZCAvKiBkZWZhdWx0ID1hc2NlbmRpbmcqL10sIHNvcnQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBzb3J0ID09IG51bGxcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuXG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgc2NhbGUgY2FuIHVzZSB1bmFnZ3JlZ2F0ZWQgZG9tYWluLlxuICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdG9ucyBhcHBsaWVzOlxuICogMS4gYHNjYWxlLmRvbWFpbmAgaXMgYHVuYWdncmVnYXRlZGBcbiAqIDIuIEFnZ3JlZ2F0aW9uIGZ1bmN0aW9uIGlzIG5vdCBgY291bnRgIG9yIGBzdW1gXG4gKiAzLiBUaGUgc2NhbGUgaXMgcXVhbnRpdGF0aXZlIG9yIHRpbWUgc2NhbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYW5Vc2VVbmFnZ3JlZ2F0ZWREb21haW4oZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNjYWxlVHlwZTogU2NhbGVUeXBlKToge3ZhbGlkOiBib29sZWFuLCByZWFzb24/OiBzdHJpbmd9IHtcbiAgaWYgKCFmaWVsZERlZi5hZ2dyZWdhdGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgcmVhc29uOiBsb2cubWVzc2FnZS51bmFnZ3JlZ2F0ZURvbWFpbkhhc05vRWZmZWN0Rm9yUmF3RmllbGQoZmllbGREZWYpXG4gICAgfTtcbiAgfVxuXG4gIGlmICghU0hBUkVEX0RPTUFJTl9PUF9JTkRFWFtmaWVsZERlZi5hZ2dyZWdhdGVdKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBmYWxzZSxcbiAgICAgIHJlYXNvbjogbG9nLm1lc3NhZ2UudW5hZ2dyZWdhdGVEb21haW5XaXRoTm9uU2hhcmVkRG9tYWluT3AoZmllbGREZWYuYWdncmVnYXRlKVxuICAgIH07XG4gIH1cblxuICBpZiAoZmllbGREZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICBpZiAoc2NhbGVUeXBlID09PSAnbG9nJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsaWQ6IGZhbHNlLFxuICAgICAgICByZWFzb246IGxvZy5tZXNzYWdlLnVuYWdncmVnYXRlZERvbWFpbldpdGhMb2dTY2FsZShmaWVsZERlZilcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt2YWxpZDogdHJ1ZX07XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgZG9tYWlucyB0byBhIHNpbmdsZSBWZWdhIHNjYWxlIGRvbWFpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRG9tYWlucyhkb21haW5zOiBWZ05vblVuaW9uRG9tYWluW10pOiBWZ0RvbWFpbiB7XG4gIGNvbnN0IHVuaXF1ZURvbWFpbnMgPSB1dGlsLnVuaXF1ZShkb21haW5zLm1hcChkb21haW4gPT4ge1xuICAgIC8vIGlnbm9yZSBzb3J0IHByb3BlcnR5IHdoZW4gY29tcHV0aW5nIHRoZSB1bmlxdWUgZG9tYWluc1xuICAgIGlmIChpc0RhdGFSZWZEb21haW4oZG9tYWluKSkge1xuICAgICAgY29uc3Qge3NvcnQ6IF9zLCAuLi5kb21haW5XaXRob3V0U29ydH0gPSBkb21haW47XG4gICAgICByZXR1cm4gZG9tYWluV2l0aG91dFNvcnQ7XG4gICAgfVxuICAgIHJldHVybiBkb21haW47XG4gIH0pLCB1dGlsLmhhc2gpO1xuXG4gIGNvbnN0IHNvcnRzOiBWZ1NvcnRGaWVsZFtdID0gdXRpbC51bmlxdWUoZG9tYWlucy5tYXAoZCA9PiB7XG4gICAgaWYgKGlzRGF0YVJlZkRvbWFpbihkKSkge1xuICAgICAgY29uc3QgcyA9IGQuc29ydDtcbiAgICAgIGlmIChzICE9PSB1bmRlZmluZWQgJiYgIXV0aWwuaXNCb29sZWFuKHMpKSB7XG4gICAgICAgIGlmIChzLm9wID09PSAnY291bnQnKSB7XG4gICAgICAgICAgLy8gbGV0J3MgbWFrZSBzdXJlIHRoYXQgaWYgb3AgaXMgY291bnQsIHdlIGRvbid0IHVzZSBhIGZpZWxkXG4gICAgICAgICAgZGVsZXRlIHMuZmllbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMub3JkZXIgPT09ICdhc2NlbmRpbmcnKSB7XG4gICAgICAgICAgLy8gZHJvcCBvcmRlcjogYXNjZW5kaW5nIGFzIGl0IGlzIHRoZSBkZWZhdWx0XG4gICAgICAgICAgZGVsZXRlIHMub3JkZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9KS5maWx0ZXIocyA9PiBzICE9PSB1bmRlZmluZWQpLCB1dGlsLmhhc2gpO1xuXG4gIGlmICh1bmlxdWVEb21haW5zLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpbnNbMF07XG4gICAgaWYgKGlzRGF0YVJlZkRvbWFpbihkb21haW4pICYmIHNvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBzb3J0ID0gc29ydHNbMF07XG4gICAgICBpZiAoc29ydHMubGVuZ3RoID4gMSkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5NT1JFX1RIQU5fT05FX1NPUlQpO1xuICAgICAgICBzb3J0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRvbWFpbixcbiAgICAgICAgc29ydFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfVxuXG4gIC8vIG9ubHkga2VlcCBzaW1wbGUgc29ydCBwcm9wZXJ0aWVzIHRoYXQgd29yayB3aXRoIHVuaW9uZWQgZG9tYWluc1xuICBjb25zdCBzaW1wbGVTb3J0cyA9IHV0aWwudW5pcXVlKHNvcnRzLm1hcChzID0+IHtcbiAgICBpZiAocyA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHM7XG4gICAgfVxuICAgIGlmIChzLm9wID09PSAnY291bnQnKSB7XG4gICAgICByZXR1cm4gcztcbiAgICB9XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZG9tYWluU29ydERyb3BwZWQocykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9KSwgdXRpbC5oYXNoKSBhcyBWZ1VuaW9uU29ydEZpZWxkW107XG5cbiAgbGV0IHNvcnQ6IFZnVW5pb25Tb3J0RmllbGQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKHNpbXBsZVNvcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHNvcnQgPSBzaW1wbGVTb3J0c1swXTtcbiAgfSBlbHNlIGlmIChzaW1wbGVTb3J0cy5sZW5ndGggPiAxKSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuTU9SRV9USEFOX09ORV9TT1JUKTtcbiAgICBzb3J0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGFsbERhdGEgPSB1dGlsLnVuaXF1ZShkb21haW5zLm1hcChkID0+IHtcbiAgICBpZiAoaXNEYXRhUmVmRG9tYWluKGQpKSB7XG4gICAgICByZXR1cm4gZC5kYXRhO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSksIHggPT4geCk7XG5cbiAgaWYgKGFsbERhdGEubGVuZ3RoID09PSAxICYmIGFsbERhdGFbMF0gIT09IG51bGwpIHtcbiAgICAvLyBjcmVhdGUgYSB1bmlvbiBkb21haW4gb2YgZGlmZmVyZW50IGZpZWxkcyB3aXRoIGEgc2luZ2xlIGRhdGEgc291cmNlXG4gICAgY29uc3QgZG9tYWluOiBWZ0ZpZWxkUmVmVW5pb25Eb21haW4gPSB7XG4gICAgICBkYXRhOiBhbGxEYXRhWzBdLFxuICAgICAgZmllbGRzOiB1bmlxdWVEb21haW5zLm1hcChkID0+IChkIGFzIFZnRGF0YVJlZikuZmllbGQpLFxuICAgICAgLi4uKHNvcnQgPyB7c29ydH0gOiB7fSlcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfVxuXG4gIHJldHVybiB7ZmllbGRzOiB1bmlxdWVEb21haW5zLCAuLi4oc29ydCA/IHtzb3J0fSA6IHt9KX07XG59XG5cbi8qKlxuICogUmV0dXJuIGEgZmllbGQgaWYgYSBzY2FsZSBzaW5nbGUgZmllbGQuXG4gKiBSZXR1cm4gYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkRnJvbURvbWFpbihkb21haW46IFZnRG9tYWluKTogc3RyaW5nIHtcbiAgaWYgKGlzRGF0YVJlZkRvbWFpbihkb21haW4pICYmIGlzU3RyaW5nKGRvbWFpbi5maWVsZCkpIHtcbiAgICByZXR1cm4gZG9tYWluLmZpZWxkO1xuICB9IGVsc2UgaWYgKGlzRGF0YVJlZlVuaW9uZWREb21haW4oZG9tYWluKSkge1xuICAgIGxldCBmaWVsZDtcbiAgICBmb3IgKGNvbnN0IG5vblVuaW9uRG9tYWluIG9mIGRvbWFpbi5maWVsZHMpIHtcbiAgICAgIGlmIChpc0RhdGFSZWZEb21haW4obm9uVW5pb25Eb21haW4pICYmIGlzU3RyaW5nKG5vblVuaW9uRG9tYWluLmZpZWxkKSkge1xuICAgICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgICAgZmllbGQgPSBub25VbmlvbkRvbWFpbi5maWVsZDtcbiAgICAgICAgfSBlbHNlIGlmIChmaWVsZCAhPT0gbm9uVW5pb25Eb21haW4uZmllbGQpIHtcbiAgICAgICAgICBsb2cud2FybignRGV0ZWN0ZWQgZmFjZXRlZCBpbmRlcGVuZGVudCBzY2FsZXMgdGhhdCB1bmlvbiBkb21haW4gb2YgbXVsdGlwbGUgZmllbGRzIGZyb20gZGlmZmVyZW50IGRhdGEgc291cmNlcy4gIFdlIHdpbGwgdXNlIHRoZSBmaXJzdCBmaWVsZC4gIFRoZSByZXN1bHQgdmlldyBzaXplIG1heSBiZSBpbmNvcnJlY3QuJyk7XG4gICAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxvZy53YXJuKCdEZXRlY3RlZCBmYWNldGVkIGluZGVwZW5kZW50IHNjYWxlcyB0aGF0IHVuaW9uIGRvbWFpbiBvZiBpZGVudGljYWwgZmllbGRzIGZyb20gZGlmZmVyZW50IHNvdXJjZSBkZXRlY3RlZC4gIFdlIHdpbGwgYXNzdW1lIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSBmaWVsZCBmcm9tIGEgZGlmZmVyZW50IGZvcmsgb2YgdGhlIHNhbWUgZGF0YSBzb3VyY2UuICBIb3dldmVyLCBpZiB0aGlzIGlzIG5vdCBjYXNlLCB0aGUgcmVzdWx0IHZpZXcgc2l6ZSBtYXliZSBpbmNvcnJlY3QuJyk7XG4gICAgcmV0dXJuIGZpZWxkO1xuICB9IGVsc2UgaWYgKGlzRmllbGRSZWZVbmlvbkRvbWFpbihkb21haW4pKSB7XG4gICAgbG9nLndhcm4oJ0RldGVjdGVkIGZhY2V0ZWQgaW5kZXBlbmRlbnQgc2NhbGVzIHRoYXQgdW5pb24gZG9tYWluIG9mIG11bHRpcGxlIGZpZWxkcyBmcm9tIHRoZSBzYW1lIGRhdGEgc291cmNlLiAgV2Ugd2lsbCB1c2UgdGhlIGZpcnN0IGZpZWxkLiAgVGhlIHJlc3VsdCB2aWV3IHNpemUgbWF5IGJlIGluY29ycmVjdC4nKTtcbiAgICBjb25zdCBmaWVsZCA9IGRvbWFpbi5maWVsZHNbMF07XG4gICAgcmV0dXJuIGlzU3RyaW5nKGZpZWxkKSA/IGZpZWxkIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlRG9tYWluKG1vZGVsOiBNb2RlbCwgY2hhbm5lbDogU2NhbGVDaGFubmVsKSB7XG4gIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcbiAgY29uc3QgZG9tYWlucyA9IHNjYWxlQ29tcG9uZW50LmRvbWFpbnMubWFwKGRvbWFpbiA9PiB7XG4gICAgLy8gQ29ycmVjdCByZWZlcmVuY2VzIHRvIGRhdGEgYXMgdGhlIG9yaWdpbmFsIGRvbWFpbidzIGRhdGEgd2FzIGRldGVybWluZWRcbiAgICAvLyBpbiBwYXJzZVNjYWxlLCB3aGljaCBoYXBwZW5zIGJlZm9yZSBwYXJzZURhdGEuIFRodXMgdGhlIG9yaWdpbmFsIGRhdGFcbiAgICAvLyByZWZlcmVuY2UgY2FuIGJlIGluY29ycmVjdC5cblxuICAgIGlmIChpc0RhdGFSZWZEb21haW4oZG9tYWluKSkge1xuICAgICAgZG9tYWluLmRhdGEgPSBtb2RlbC5sb29rdXBEYXRhU291cmNlKGRvbWFpbi5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfSk7XG5cbiAgLy8gZG9tYWlucyBpcyBhbiBhcnJheSB0aGF0IGhhcyB0byBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSB2ZWdhIGRvbWFpblxuICByZXR1cm4gbWVyZ2VEb21haW5zKGRvbWFpbnMpO1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { keys } from '../../util';\nimport { isVgRangeStep, isVgSignalRef } from '../../vega.schema';\nimport { isConcatModel, isLayerModel, isRepeatModel } from '../model';\nimport { isRawSelectionDomain, selectionScaleDomain } from '../selection/selection';\nimport { assembleDomain } from './domain';\nexport function assembleScales(model) {\n if (isLayerModel(model) || isConcatModel(model) || isRepeatModel(model)) {\n // For concat / layer / repeat, include scales of children too\n return model.children.reduce(function (scales, child) {\n return scales.concat(assembleScales(child));\n }, assembleScalesForModel(model));\n }\n else {\n // For facet, child scales would not be included in the parent's scope.\n // For unit, there is no child.\n return assembleScalesForModel(model);\n }\n}\nexport function assembleScalesForModel(model) {\n return keys(model.component.scales).reduce(function (scales, channel) {\n var scaleComponent = model.component.scales[channel];\n if (scaleComponent.merged) {\n // Skipped merged scales\n return scales;\n }\n var scale = scaleComponent.combine();\n // need to separate const and non const object destruction\n var domainRaw = scale.domainRaw, range = scale.range;\n var name = scale.name, type = scale.type, _d = scale.domainRaw, _r = scale.range, otherScaleProps = tslib_1.__rest(scale, [\"name\", \"type\", \"domainRaw\", \"range\"]);\n range = assembleScaleRange(range, name, model, channel);\n // As scale parsing occurs before selection parsing, a temporary signal\n // is used for domainRaw. Here, we detect if this temporary signal\n // is set, and replace it with the correct domainRaw signal.\n // For more information, see isRawSelectionDomain in selection.ts.\n if (domainRaw && isRawSelectionDomain(domainRaw)) {\n domainRaw = selectionScaleDomain(model, domainRaw);\n }\n scales.push(tslib_1.__assign({ name: name,\n type: type, domain: assembleDomain(model, channel) }, (domainRaw ? { domainRaw: domainRaw } : {}), { range: range }, otherScaleProps));\n return scales;\n }, []);\n}\nexport function assembleScaleRange(scaleRange, scaleName, model, channel) {\n // add signals to x/y range\n if (channel === 'x' || channel === 'y') {\n if (isVgRangeStep(scaleRange)) {\n // For x/y range step, use a signal created in layout assemble instead of a constant range step.\n return {\n step: { signal: scaleName + '_step' }\n };\n }\n else if (isArray(scaleRange) && scaleRange.length === 2) {\n var r0 = scaleRange[0];\n var r1 = scaleRange[1];\n if (r0 === 0 && isVgSignalRef(r1)) {\n // Replace width signal just in case it is renamed.\n return [0, { signal: model.getSizeName(r1.signal) }];\n }\n else if (isVgSignalRef(r0) && r1 === 0) {\n // Replace height signal just in case it is renamed.\n return [{ signal: model.getSizeName(r0.signal) }, 0];\n }\n }\n }\n return scaleRange;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9hc3NlbWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFtQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pGLE9BQU8sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBUSxNQUFNLFVBQVUsQ0FBQztBQUMzRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXhDLE1BQU0seUJBQXlCLEtBQVk7SUFDekMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2RSw4REFBOEQ7UUFDOUQsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLE1BQU0sRUFBRSxLQUFLO1lBQ3pDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUM5QyxDQUFDLEVBQUUsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNuQztTQUFNO1FBQ0wsdUVBQXVFO1FBQ3ZFLCtCQUErQjtRQUMvQixPQUFPLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVELE1BQU0saUNBQWlDLEtBQVk7SUFDL0MsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxNQUFpQixFQUFFLE9BQXFCO1FBQ2xGLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUN6Qix3QkFBd0I7WUFDeEIsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUVELElBQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUV2QywwREFBMEQ7UUFDckQsSUFBQSwyQkFBUyxFQUFFLG1CQUFLLENBQVU7UUFDeEIsSUFBQSxpQkFBSSxFQUFFLGlCQUFJLEVBQUUsb0JBQWEsRUFBRSxnQkFBUyxFQUFFLCtFQUFrQixDQUFVO1FBRXpFLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV4RCx1RUFBdUU7UUFDdkUsa0VBQWtFO1FBQ2xFLDREQUE0RDtRQUM1RCxrRUFBa0U7UUFDbEUsSUFBSSxTQUFTLElBQUksb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEQsU0FBUyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNwRDtRQUdELE1BQU0sQ0FBQyxJQUFJLG9CQUNULElBQUksTUFBQTtZQUNKLElBQUksTUFBQSxFQUNKLE1BQU0sRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUNuQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxTQUFTLFdBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFDakMsS0FBSyxFQUFFLEtBQUssSUFDVCxlQUFlLEVBQ2xCLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLEVBQUUsRUFBZSxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sNkJBQTZCLFVBQW1CLEVBQUUsU0FBaUIsRUFBRSxLQUFZLEVBQUUsT0FBZ0I7SUFDdkcsMkJBQTJCO0lBQzNCLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxPQUFPLEtBQUssR0FBRyxFQUFFO1FBQ3RDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzdCLGdHQUFnRztZQUNoRyxPQUFPO2dCQUNMLElBQUksRUFBRSxFQUFDLE1BQU0sRUFBRSxTQUFTLEdBQUcsT0FBTyxFQUFDO2FBQ3BDLENBQUM7U0FDSDthQUFNLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3pELElBQU0sRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixJQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDakMsbURBQW1EO2dCQUNuRCxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUNwRDtpQkFBTSxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUN4QyxvREFBb0Q7Z0JBQ3BELE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO1NBQ0Y7S0FDRjtJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzQXJyYXl9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWwsIFNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwLCBpc1ZnU2lnbmFsUmVmLCBWZ1JhbmdlLCBWZ1NjYWxlfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzQ29uY2F0TW9kZWwsIGlzTGF5ZXJNb2RlbCwgaXNSZXBlYXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7aXNSYXdTZWxlY3Rpb25Eb21haW4sIHNlbGVjdGlvblNjYWxlRG9tYWlufSBmcm9tICcuLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7YXNzZW1ibGVEb21haW59IGZyb20gJy4vZG9tYWluJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlU2NhbGVzKG1vZGVsOiBNb2RlbCk6IFZnU2NhbGVbXSB7XG4gIGlmIChpc0xheWVyTW9kZWwobW9kZWwpIHx8IGlzQ29uY2F0TW9kZWwobW9kZWwpIHx8IGlzUmVwZWF0TW9kZWwobW9kZWwpKSB7XG4gICAgLy8gRm9yIGNvbmNhdCAvIGxheWVyIC8gcmVwZWF0LCBpbmNsdWRlIHNjYWxlcyBvZiBjaGlsZHJlbiB0b29cbiAgICByZXR1cm4gbW9kZWwuY2hpbGRyZW4ucmVkdWNlKChzY2FsZXMsIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc2NhbGVzLmNvbmNhdChhc3NlbWJsZVNjYWxlcyhjaGlsZCkpO1xuICAgIH0sIGFzc2VtYmxlU2NhbGVzRm9yTW9kZWwobW9kZWwpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGb3IgZmFjZXQsIGNoaWxkIHNjYWxlcyB3b3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHBhcmVudCdzIHNjb3BlLlxuICAgIC8vIEZvciB1bml0LCB0aGVyZSBpcyBubyBjaGlsZC5cbiAgICByZXR1cm4gYXNzZW1ibGVTY2FsZXNGb3JNb2RlbChtb2RlbCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlU2NhbGVzRm9yTW9kZWwobW9kZWw6IE1vZGVsKTogVmdTY2FsZVtdIHtcbiAgICByZXR1cm4ga2V5cyhtb2RlbC5jb21wb25lbnQuc2NhbGVzKS5yZWR1Y2UoKHNjYWxlczogVmdTY2FsZVtdLCBjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcbiAgICAgIGlmIChzY2FsZUNvbXBvbmVudC5tZXJnZWQpIHtcbiAgICAgICAgLy8gU2tpcHBlZCBtZXJnZWQgc2NhbGVzXG4gICAgICAgIHJldHVybiBzY2FsZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGVDb21wb25lbnQuY29tYmluZSgpO1xuXG4gICAgICAvLyBuZWVkIHRvIHNlcGFyYXRlIGNvbnN0IGFuZCBub24gY29uc3Qgb2JqZWN0IGRlc3RydWN0aW9uXG4gICAgICBsZXQge2RvbWFpblJhdywgcmFuZ2V9ID0gc2NhbGU7XG4gICAgICBjb25zdCB7bmFtZSwgdHlwZSwgZG9tYWluUmF3OiBfZCwgcmFuZ2U6IF9yLCAuLi5vdGhlclNjYWxlUHJvcHN9ID0gc2NhbGU7XG5cbiAgICAgIHJhbmdlID0gYXNzZW1ibGVTY2FsZVJhbmdlKHJhbmdlLCBuYW1lLCBtb2RlbCwgY2hhbm5lbCk7XG5cbiAgICAgIC8vIEFzIHNjYWxlIHBhcnNpbmcgb2NjdXJzIGJlZm9yZSBzZWxlY3Rpb24gcGFyc2luZywgYSB0ZW1wb3Jhcnkgc2lnbmFsXG4gICAgICAvLyBpcyB1c2VkIGZvciBkb21haW5SYXcuIEhlcmUsIHdlIGRldGVjdCBpZiB0aGlzIHRlbXBvcmFyeSBzaWduYWxcbiAgICAgIC8vIGlzIHNldCwgYW5kIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVjdCBkb21haW5SYXcgc2lnbmFsLlxuICAgICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBpc1Jhd1NlbGVjdGlvbkRvbWFpbiBpbiBzZWxlY3Rpb24udHMuXG4gICAgICBpZiAoZG9tYWluUmF3ICYmIGlzUmF3U2VsZWN0aW9uRG9tYWluKGRvbWFpblJhdykpIHtcbiAgICAgICAgZG9tYWluUmF3ID0gc2VsZWN0aW9uU2NhbGVEb21haW4obW9kZWwsIGRvbWFpblJhdyk7XG4gICAgICB9XG5cblxuICAgICAgc2NhbGVzLnB1c2goe1xuICAgICAgICBuYW1lLFxuICAgICAgICB0eXBlLFxuICAgICAgICBkb21haW46IGFzc2VtYmxlRG9tYWluKG1vZGVsLCBjaGFubmVsKSxcbiAgICAgICAgLi4uKGRvbWFpblJhdyA/IHtkb21haW5SYXd9IDoge30pLFxuICAgICAgICByYW5nZTogcmFuZ2UsXG4gICAgICAgIC4uLm90aGVyU2NhbGVQcm9wc1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzY2FsZXM7XG4gICAgfSwgW10gYXMgVmdTY2FsZVtdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlU2NhbGVSYW5nZShzY2FsZVJhbmdlOiBWZ1JhbmdlLCBzY2FsZU5hbWU6IHN0cmluZywgbW9kZWw6IE1vZGVsLCBjaGFubmVsOiBDaGFubmVsKSB7XG4gIC8vIGFkZCBzaWduYWxzIHRvIHgveSByYW5nZVxuICBpZiAoY2hhbm5lbCA9PT0gJ3gnIHx8IGNoYW5uZWwgPT09ICd5Jykge1xuICAgIGlmIChpc1ZnUmFuZ2VTdGVwKHNjYWxlUmFuZ2UpKSB7XG4gICAgICAvLyBGb3IgeC95IHJhbmdlIHN0ZXAsIHVzZSBhIHNpZ25hbCBjcmVhdGVkIGluIGxheW91dCBhc3NlbWJsZSBpbnN0ZWFkIG9mIGEgY29uc3RhbnQgcmFuZ2Ugc3RlcC5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZXA6IHtzaWduYWw6IHNjYWxlTmFtZSArICdfc3RlcCd9XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShzY2FsZVJhbmdlKSAmJiBzY2FsZVJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgY29uc3QgcjAgPSBzY2FsZVJhbmdlWzBdO1xuICAgICAgY29uc3QgcjEgPSBzY2FsZVJhbmdlWzFdO1xuICAgICAgaWYgKHIwID09PSAwICYmIGlzVmdTaWduYWxSZWYocjEpKSB7XG4gICAgICAgIC8vIFJlcGxhY2Ugd2lkdGggc2lnbmFsIGp1c3QgaW4gY2FzZSBpdCBpcyByZW5hbWVkLlxuICAgICAgICByZXR1cm4gWzAsIHtzaWduYWw6IG1vZGVsLmdldFNpemVOYW1lKHIxLnNpZ25hbCl9XTtcbiAgICAgIH0gZWxzZSBpZiAoaXNWZ1NpZ25hbFJlZihyMCkgJiYgcjEgPT09IDApIHtcbiAgICAgICAgLy8gUmVwbGFjZSBoZWlnaHQgc2lnbmFsIGp1c3QgaW4gY2FzZSBpdCBpcyByZW5hbWVkLlxuICAgICAgICByZXR1cm4gW3tzaWduYWw6IG1vZGVsLmdldFNpemVOYW1lKHIwLnNpZ25hbCl9LCAwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjYWxlUmFuZ2U7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { Split } from '../split';\nvar ScaleComponent = /** @class */ (function (_super) {\n tslib_1.__extends(ScaleComponent, _super);\n function ScaleComponent(name, typeWithExplicit) {\n var _this = _super.call(this, {}, // no initial explicit property\n { name: name } // name as initial implicit property\n ) || this;\n _this.merged = false;\n _this.domains = [];\n _this.setWithExplicit('type', typeWithExplicit);\n return _this;\n }\n return ScaleComponent;\n}(Split));\nexport { ScaleComponent };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2NhbGUvY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFJQSxPQUFPLEVBQVcsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBU3pDO0lBQW9DLDBDQUEwQjtJQUs1RCx3QkFBWSxJQUFZLEVBQUUsZ0JBQXFDO1FBQS9ELFlBQ0Usa0JBQ0UsRUFBRSxFQUFNLCtCQUErQjtRQUN2QyxFQUFDLElBQUksTUFBQSxFQUFDLENBQUUsb0NBQW9DO1NBQzdDLFNBRUY7UUFWTSxZQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsYUFBTyxHQUF1QixFQUFFLENBQUM7UUFPdEMsS0FBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzs7SUFDakQsQ0FBQztJQUNILHFCQUFDO0FBQUQsQ0FBQyxBQVpELENBQW9DLEtBQUssR0FZeEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge1NjYWxlLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7T21pdH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnTm9uVW5pb25Eb21haW4sIFZnU2NhbGV9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RXhwbGljaXQsIFNwbGl0fSBmcm9tICcuLi9zcGxpdCc7XG5cbi8qKlxuICogQWxsIFZnRG9tYWluIHByb3BlcnR5IGV4Y2VwdCBkb21haW4uXG4gKiAoV2UgZXhjbHVkZSBkb21haW4gYXMgd2UgaGF2ZSBhIHNwZWNpYWwgXCJkb21haW5zXCIgYXJyYXkgdGhhdCBhbGxvdyB1cyBtZXJnZSB0aGVtIGFsbCBhdCBvbmNlIGluIGFzc2VtYmxlLilcbiAqL1xuLy8gVE9ETzogYWxzbyBleGNsdWRlIGRvbWFpblJhdyBhbmQgcHJvcGVydHkgaW1wbGVtZW50IHRoZSByaWdodCBzY2FsZUNvbXBvbmVudCBmb3Igc2VsZWN0aW9uIGRvbWFpblxuZXhwb3J0IHR5cGUgU2NhbGVDb21wb25lbnRQcm9wcyA9IE9taXQ8VmdTY2FsZSwgJ2RvbWFpbic+O1xuXG5leHBvcnQgY2xhc3MgU2NhbGVDb21wb25lbnQgZXh0ZW5kcyBTcGxpdDxTY2FsZUNvbXBvbmVudFByb3BzPiB7XG4gIHB1YmxpYyBtZXJnZWQgPSBmYWxzZTtcblxuICBwdWJsaWMgZG9tYWluczogVmdOb25VbmlvbkRvbWFpbltdID0gW107XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCB0eXBlV2l0aEV4cGxpY2l0OiBFeHBsaWNpdDxTY2FsZVR5cGU+KSB7XG4gICAgc3VwZXIoXG4gICAgICB7fSwgICAgIC8vIG5vIGluaXRpYWwgZXhwbGljaXQgcHJvcGVydHlcbiAgICAgIHtuYW1lfSAgLy8gbmFtZSBhcyBpbml0aWFsIGltcGxpY2l0IHByb3BlcnR5XG4gICAgKTtcbiAgICB0aGlzLnNldFdpdGhFeHBsaWNpdCgndHlwZScsIHR5cGVXaXRoRXhwbGljaXQpO1xuICB9XG59XG5cbi8vIFVzaW5nIE1hcHBlZCBUeXBlIHRvIGRlY2xhcmUgdHlwZSAoaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYWR2YW5jZWQtdHlwZXMuaHRtbCNtYXBwZWQtdHlwZXMpXG5leHBvcnQgdHlwZSBTY2FsZUNvbXBvbmVudEluZGV4ID0ge1tQIGluIFNjYWxlQ2hhbm5lbF0/OiBTY2FsZUNvbXBvbmVudH07XG5cbmV4cG9ydCB0eXBlIFNjYWxlSW5kZXggPSB7W1AgaW4gU2NhbGVDaGFubmVsXT86IFNjYWxlfTtcbiJdfQ==","import { isNumber } from 'vega-util';\nimport { COLOR, FILL, OPACITY, SCALE_CHANNELS, SHAPE, SIZE, STROKE, X, Y } from '../../channel';\nimport * as log from '../../log';\nimport { channelScalePropertyIncompatability, isExtendedScheme, scaleTypeSupportProperty, } from '../../scale';\nimport { hasContinuousDomain } from '../../scale';\nimport * as util from '../../util';\nimport { isVgRangeStep } from '../../vega.schema';\nimport { isUnitModel } from '../model';\nimport { makeExplicit, makeImplicit } from '../split';\nimport { parseNonUnitScaleProperty } from './properties';\nexport var RANGE_PROPERTIES = ['range', 'rangeStep', 'scheme'];\nexport function parseScaleRange(model) {\n if (isUnitModel(model)) {\n parseUnitScaleRange(model);\n }\n else {\n parseNonUnitScaleProperty(model, 'range');\n }\n}\nfunction parseUnitScaleRange(model) {\n var localScaleComponents = model.component.scales;\n // use SCALE_CHANNELS instead of scales[channel] to ensure that x, y come first!\n SCALE_CHANNELS.forEach(function (channel) {\n var localScaleCmpt = localScaleComponents[channel];\n if (!localScaleCmpt) {\n return;\n }\n var mergedScaleCmpt = model.getScaleComponent(channel);\n var specifiedScale = model.specifiedScales[channel];\n var fieldDef = model.fieldDef(channel);\n // Read if there is a specified width/height\n var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined;\n var sizeSpecified = sizeType ? !!model.component.layoutSize.get(sizeType) : undefined;\n var scaleType = mergedScaleCmpt.get('type');\n // if autosize is fit, size cannot be data driven\n var rangeStep = util.contains(['point', 'band'], scaleType) || !!specifiedScale.rangeStep;\n if (sizeType && model.fit && !sizeSpecified && rangeStep) {\n log.warn(log.message.CANNOT_FIX_RANGE_STEP_WITH_FIT);\n sizeSpecified = true;\n }\n var xyRangeSteps = getXYRangeStep(model);\n var rangeWithExplicit = parseRangeForChannel(channel, scaleType, fieldDef.type, specifiedScale, model.config, localScaleCmpt.get('zero'), model.mark, sizeSpecified, model.getName(sizeType), xyRangeSteps);\n localScaleCmpt.setWithExplicit('range', rangeWithExplicit);\n });\n}\nfunction getXYRangeStep(model) {\n var xyRangeSteps = [];\n var xScale = model.getScaleComponent('x');\n var xRange = xScale && xScale.get('range');\n if (xRange && isVgRangeStep(xRange) && isNumber(xRange.step)) {\n xyRangeSteps.push(xRange.step);\n }\n var yScale = model.getScaleComponent('y');\n var yRange = yScale && yScale.get('range');\n if (yRange && isVgRangeStep(yRange) && isNumber(yRange.step)) {\n xyRangeSteps.push(yRange.step);\n }\n return xyRangeSteps;\n}\n/**\n * Return mixins that includes one of the range properties (range, rangeStep, scheme).\n */\nexport function parseRangeForChannel(channel, scaleType, type, specifiedScale, config, zero, mark, sizeSpecified, sizeSignal, xyRangeSteps) {\n var noRangeStep = sizeSpecified || specifiedScale.rangeStep === null;\n // Check if any of the range properties is specified.\n // If so, check if it is compatible and make sure that we only output one of the properties\n for (var _i = 0, RANGE_PROPERTIES_1 = RANGE_PROPERTIES; _i < RANGE_PROPERTIES_1.length; _i++) {\n var property = RANGE_PROPERTIES_1[_i];\n if (specifiedScale[property] !== undefined) {\n var supportedByScaleType = scaleTypeSupportProperty(scaleType, property);\n var channelIncompatability = channelScalePropertyIncompatability(channel, property);\n if (!supportedByScaleType) {\n log.warn(log.message.scalePropertyNotWorkWithScaleType(scaleType, property, channel));\n }\n else if (channelIncompatability) { // channel\n log.warn(channelIncompatability);\n }\n else {\n switch (property) {\n case 'range':\n return makeExplicit(specifiedScale[property]);\n case 'scheme':\n return makeExplicit(parseScheme(specifiedScale[property]));\n case 'rangeStep':\n var rangeStep = specifiedScale[property];\n if (rangeStep !== null) {\n if (!sizeSpecified) {\n return makeExplicit({ step: rangeStep });\n }\n else {\n // If top-level size is specified, we ignore specified rangeStep.\n log.warn(log.message.rangeStepDropped(channel));\n }\n }\n }\n }\n }\n }\n return makeImplicit(defaultRange(channel, scaleType, type, config, zero, mark, sizeSignal, xyRangeSteps, noRangeStep));\n}\nfunction parseScheme(scheme) {\n if (isExtendedScheme(scheme)) {\n var r = { scheme: scheme.name };\n if (scheme.count) {\n r.count = scheme.count;\n }\n if (scheme.extent) {\n r.extent = scheme.extent;\n }\n return r;\n }\n return { scheme: scheme };\n}\nexport function defaultRange(channel, scaleType, type, config, zero, mark, sizeSignal, xyRangeSteps, noRangeStep) {\n switch (channel) {\n case X:\n case Y:\n if (util.contains(['point', 'band'], scaleType) && !noRangeStep) {\n if (channel === X && mark === 'text') {\n if (config.scale.textXRangeStep) {\n return { step: config.scale.textXRangeStep };\n }\n }\n else {\n if (config.scale.rangeStep) {\n return { step: config.scale.rangeStep };\n }\n }\n }\n // If range step is null, use zero to width or height.\n // Note that these range signals are temporary\n // as they can be merged and renamed.\n // (We do not have the right size signal here since parseLayoutSize() happens after parseScale().)\n // We will later replace these temporary names with\n // the final name in assembleScaleRange()\n if (channel === Y && hasContinuousDomain(scaleType)) {\n // For y continuous scale, we have to start from the height as the bottom part has the max value.\n return [{ signal: sizeSignal }, 0];\n }\n else {\n return [0, { signal: sizeSignal }];\n }\n case SIZE:\n // TODO: support custom rangeMin, rangeMax\n var rangeMin = sizeRangeMin(mark, zero, config);\n var rangeMax = sizeRangeMax(mark, xyRangeSteps, config);\n return [rangeMin, rangeMax];\n case SHAPE:\n return 'symbol';\n case COLOR:\n case FILL:\n case STROKE:\n if (scaleType === 'ordinal') {\n // Only nominal data uses ordinal scale by default\n return type === 'nominal' ? 'category' : 'ordinal';\n }\n return mark === 'rect' || mark === 'geoshape' ? 'heatmap' : 'ramp';\n case OPACITY:\n // TODO: support custom rangeMin, rangeMax\n return [config.scale.minOpacity, config.scale.maxOpacity];\n }\n /* istanbul ignore next: should never reach here */\n throw new Error(\"Scale range undefined for channel \" + channel);\n}\nfunction sizeRangeMin(mark, zero, config) {\n if (zero) {\n return 0;\n }\n switch (mark) {\n case 'bar':\n case 'tick':\n return config.scale.minBandSize;\n case 'line':\n case 'trail':\n case 'rule':\n return config.scale.minStrokeWidth;\n case 'text':\n return config.scale.minFontSize;\n case 'point':\n case 'square':\n case 'circle':\n return config.scale.minSize;\n }\n /* istanbul ignore next: should never reach here */\n // sizeRangeMin not implemented for the mark\n throw new Error(log.message.incompatibleChannel('size', mark));\n}\nfunction sizeRangeMax(mark, xyRangeSteps, config) {\n var scaleConfig = config.scale;\n switch (mark) {\n case 'bar':\n case 'tick':\n if (config.scale.maxBandSize !== undefined) {\n return config.scale.maxBandSize;\n }\n return minXYRangeStep(xyRangeSteps, config.scale) - 1;\n case 'line':\n case 'trail':\n case 'rule':\n return config.scale.maxStrokeWidth;\n case 'text':\n return config.scale.maxFontSize;\n case 'point':\n case 'square':\n case 'circle':\n if (config.scale.maxSize) {\n return config.scale.maxSize;\n }\n // FIXME this case totally should be refactored\n var pointStep = minXYRangeStep(xyRangeSteps, scaleConfig);\n return (pointStep - 2) * (pointStep - 2);\n }\n /* istanbul ignore next: should never reach here */\n // sizeRangeMax not implemented for the mark\n throw new Error(log.message.incompatibleChannel('size', mark));\n}\n/**\n * @returns {number} Range step of x or y or minimum between the two if both are ordinal scale.\n */\nfunction minXYRangeStep(xyRangeSteps, scaleConfig) {\n if (xyRangeSteps.length > 0) {\n return Math.min.apply(null, xyRangeSteps);\n }\n if (scaleConfig.rangeStep) {\n return scaleConfig.rangeStep;\n }\n return 21; // FIXME: re-evaluate the default value here.\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRW5DLE9BQU8sRUFBVSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQWdCLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFckgsT0FBTyxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUNMLG1DQUFtQyxFQUNuQyxnQkFBZ0IsRUFLaEIsd0JBQXdCLEdBRXpCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVoRCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsYUFBYSxFQUFvQixNQUFNLG1CQUFtQixDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQVEsTUFBTSxVQUFVLENBQUM7QUFDNUMsT0FBTyxFQUFXLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFHOUQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBS3ZELE1BQU0sQ0FBQyxJQUFNLGdCQUFnQixHQUFvQixDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFHbEYsTUFBTSwwQkFBMEIsS0FBWTtJQUMxQyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN0QixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtTQUFNO1FBQ0wseUJBQXlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQztBQUVELDZCQUE2QixLQUFn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K0M7WUFDL0MsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM1RCxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzVDO0lBQ0QsbURBQW1EO0lBQ25ELDRDQUE0QztJQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsd0JBQXdCLFlBQXNCLEVBQUUsV0FBd0I7SUFDdEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUMzQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztLQUMzQztJQUNELElBQUksV0FBVyxDQUFDLFNBQVMsRUFBRTtRQUN6QixPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUM7S0FDOUI7SUFDRCxPQUFPLEVBQUUsQ0FBQyxDQUFDLDZDQUE2QztBQUMxRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc051bWJlcn0gZnJvbSAndmVnYS11dGlsJztcblxuaW1wb3J0IHtDaGFubmVsLCBDT0xPUiwgRklMTCwgT1BBQ0lUWSwgU0NBTEVfQ0hBTk5FTFMsIFNjYWxlQ2hhbm5lbCwgU0hBUEUsIFNJWkUsIFNUUk9LRSwgWCwgWX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7XG4gIGNoYW5uZWxTY2FsZVByb3BlcnR5SW5jb21wYXRhYmlsaXR5LFxuICBpc0V4dGVuZGVkU2NoZW1lLFxuICBSYW5nZSxcbiAgU2NhbGUsXG4gIFNjYWxlQ29uZmlnLFxuICBTY2FsZVR5cGUsXG4gIHNjYWxlVHlwZVN1cHBvcnRQcm9wZXJ0eSxcbiAgU2NoZW1lLFxufSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2hhc0NvbnRpbnVvdXNEb21haW59IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtpc1ZnUmFuZ2VTdGVwLCBWZ1JhbmdlLCBWZ1NjaGVtZX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc1VuaXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RXhwbGljaXQsIG1ha2VFeHBsaWNpdCwgbWFrZUltcGxpY2l0fSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCB7cGFyc2VOb25Vbml0U2NhbGVQcm9wZXJ0eX0gZnJvbSAnLi9wcm9wZXJ0aWVzJztcblxuXG5leHBvcnQgdHlwZSBSYW5nZU1peGlucyA9IHtyYW5nZTogUmFuZ2V9IHwge3JhbmdlU3RlcDogbnVtYmVyfSB8IHtzY2hlbWU6IFNjaGVtZX07XG5cbmV4cG9ydCBjb25zdCBSQU5HRV9QUk9QRVJUSUVTOiAoa2V5b2YgU2NhbGUpW10gPSBbJ3JhbmdlJywgJ3JhbmdlU3RlcCcsICdzY2hlbWUnXTtcblxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTY2FsZVJhbmdlKG1vZGVsOiBNb2RlbCkge1xuICBpZiAoaXNVbml0TW9kZWwobW9kZWwpKSB7XG4gICAgcGFyc2VVbml0U2NhbGVSYW5nZShtb2RlbCk7XG4gIH0gZWxzZSB7XG4gICAgcGFyc2VOb25Vbml0U2NhbGVQcm9wZXJ0eShtb2RlbCwgJ3JhbmdlJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VVbml0U2NhbGVSYW5nZShtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IGxvY2FsU2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlcztcblxuICAvLyB1c2UgU0NBTEVfQ0hBTk5FTFMgaW5zdGVhZCBvZiBzY2FsZXNbY2hhbm5lbF0gdG8gZW5zdXJlIHRoYXQgeCwgeSBjb21lIGZpcnN0IVxuICBTQ0FMRV9DSEFOTkVMUy5mb3JFYWNoKChjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICBjb25zdCBsb2NhbFNjYWxlQ21wdCA9IGxvY2FsU2NhbGVDb21wb25lbnRzW2NoYW5uZWxdO1xuICAgIGlmICghbG9jYWxTY2FsZUNtcHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWVyZ2VkU2NhbGVDbXB0ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG5cblxuICAgIGNvbnN0IHNwZWNpZmllZFNjYWxlID0gbW9kZWwuc3BlY2lmaWVkU2NhbGVzW2NoYW5uZWxdO1xuICAgIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCk7XG5cbiAgICAvLyBSZWFkIGlmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIHdpZHRoL2hlaWdodFxuICAgIGNvbnN0IHNpemVUeXBlID0gY2hhbm5lbCA9PT0gJ3gnID8gJ3dpZHRoJyA6IGNoYW5uZWwgPT09ICd5JyA/ICdoZWlnaHQnIDogdW5kZWZpbmVkO1xuICAgIGxldCBzaXplU3BlY2lmaWVkID0gc2l6ZVR5cGUgPyAhIW1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplLmdldChzaXplVHlwZSkgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBzY2FsZVR5cGUgPSBtZXJnZWRTY2FsZUNtcHQuZ2V0KCd0eXBlJyk7XG5cbiAgICAvLyBpZiBhdXRvc2l6ZSBpcyBmaXQsIHNpemUgY2Fubm90IGJlIGRhdGEgZHJpdmVuXG4gICAgY29uc3QgcmFuZ2VTdGVwID0gdXRpbC5jb250YWlucyhbJ3BvaW50JywgJ2JhbmQnXSwgc2NhbGVUeXBlKSB8fCAhIXNwZWNpZmllZFNjYWxlLnJhbmdlU3RlcDtcbiAgICBpZiAoc2l6ZVR5cGUgJiYgbW9kZWwuZml0ICYmICFzaXplU3BlY2lmaWVkICYmIHJhbmdlU3RlcCkge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuQ0FOTk9UX0ZJWF9SQU5HRV9TVEVQX1dJVEhfRklUKTtcbiAgICAgIHNpemVTcGVjaWZpZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHh5UmFuZ2VTdGVwcyA9IGdldFhZUmFuZ2VTdGVwKG1vZGVsKTtcblxuICAgIGNvbnN0IHJhbmdlV2l0aEV4cGxpY2l0ID0gcGFyc2VSYW5nZUZvckNoYW5uZWwoXG4gICAgICBjaGFubmVsLCBzY2FsZVR5cGUsIGZpZWxkRGVmLnR5cGUsIHNwZWNpZmllZFNjYWxlLCBtb2RlbC5jb25maWcsXG4gICAgICBsb2NhbFNjYWxlQ21wdC5nZXQoJ3plcm8nKSwgbW9kZWwubWFyaywgc2l6ZVNwZWNpZmllZCwgbW9kZWwuZ2V0TmFtZShzaXplVHlwZSksIHh5UmFuZ2VTdGVwc1xuICAgICk7XG5cbiAgICBsb2NhbFNjYWxlQ21wdC5zZXRXaXRoRXhwbGljaXQoJ3JhbmdlJywgcmFuZ2VXaXRoRXhwbGljaXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0WFlSYW5nZVN0ZXAobW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCB4eVJhbmdlU3RlcHM6IG51bWJlcltdID0gW107XG5cbiAgY29uc3QgeFNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoJ3gnKTtcbiAgY29uc3QgeFJhbmdlID0geFNjYWxlICYmIHhTY2FsZS5nZXQoJ3JhbmdlJyk7XG4gIGlmICh4UmFuZ2UgJiYgaXNWZ1JhbmdlU3RlcCh4UmFuZ2UpICYmIGlzTnVtYmVyKHhSYW5nZS5zdGVwKSkge1xuICAgIHh5UmFuZ2VTdGVwcy5wdXNoKHhSYW5nZS5zdGVwKTtcbiAgfVxuXG4gIGNvbnN0IHlTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd5Jyk7XG4gIGNvbnN0IHlSYW5nZSA9IHlTY2FsZSAmJiB5U2NhbGUuZ2V0KCdyYW5nZScpO1xuICBpZiAoeVJhbmdlICYmIGlzVmdSYW5nZVN0ZXAoeVJhbmdlKSAmJiBpc051bWJlcih5UmFuZ2Uuc3RlcCkpIHtcbiAgICB4eVJhbmdlU3RlcHMucHVzaCh5UmFuZ2Uuc3RlcCk7XG4gIH1cblxuICByZXR1cm4geHlSYW5nZVN0ZXBzO1xufVxuXG4vKipcbiAqIFJldHVybiBtaXhpbnMgdGhhdCBpbmNsdWRlcyBvbmUgb2YgdGhlIHJhbmdlIHByb3BlcnRpZXMgKHJhbmdlLCByYW5nZVN0ZXAsIHNjaGVtZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJhbmdlRm9yQ2hhbm5lbChcbiAgICBjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgdHlwZTogVHlwZSwgc3BlY2lmaWVkU2NhbGU6IFNjYWxlLCBjb25maWc6IENvbmZpZyxcbiAgICB6ZXJvOiBib29sZWFuLCBtYXJrOiBNYXJrLCBzaXplU3BlY2lmaWVkOiBib29sZWFuLCBzaXplU2lnbmFsOiBzdHJpbmcsIHh5UmFuZ2VTdGVwczogbnVtYmVyW11cbiAgKTogRXhwbGljaXQ8VmdSYW5nZT4ge1xuXG4gIGNvbnN0IG5vUmFuZ2VTdGVwID0gc2l6ZVNwZWNpZmllZCB8fCBzcGVjaWZpZWRTY2FsZS5yYW5nZVN0ZXAgPT09IG51bGw7XG5cbiAgLy8gQ2hlY2sgaWYgYW55IG9mIHRoZSByYW5nZSBwcm9wZXJ0aWVzIGlzIHNwZWNpZmllZC5cbiAgLy8gSWYgc28sIGNoZWNrIGlmIGl0IGlzIGNvbXBhdGlibGUgYW5kIG1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgb3V0cHV0IG9uZSBvZiB0aGUgcHJvcGVydGllc1xuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIFJBTkdFX1BST1BFUlRJRVMpIHtcbiAgICBpZiAoc3BlY2lmaWVkU2NhbGVbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZEJ5U2NhbGVUeXBlID0gc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5KHNjYWxlVHlwZSwgcHJvcGVydHkpO1xuICAgICAgY29uc3QgY2hhbm5lbEluY29tcGF0YWJpbGl0eSA9IGNoYW5uZWxTY2FsZVByb3BlcnR5SW5jb21wYXRhYmlsaXR5KGNoYW5uZWwsIHByb3BlcnR5KTtcbiAgICAgIGlmICghc3VwcG9ydGVkQnlTY2FsZVR5cGUpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uuc2NhbGVQcm9wZXJ0eU5vdFdvcmtXaXRoU2NhbGVUeXBlKHNjYWxlVHlwZSwgcHJvcGVydHksIGNoYW5uZWwpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbEluY29tcGF0YWJpbGl0eSkgeyAvLyBjaGFubmVsXG4gICAgICAgIGxvZy53YXJuKGNoYW5uZWxJbmNvbXBhdGFiaWxpdHkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgIHJldHVybiBtYWtlRXhwbGljaXQoc3BlY2lmaWVkU2NhbGVbcHJvcGVydHldKTtcbiAgICAgICAgICBjYXNlICdzY2hlbWUnOlxuICAgICAgICAgICAgcmV0dXJuIG1ha2VFeHBsaWNpdChwYXJzZVNjaGVtZShzcGVjaWZpZWRTY2FsZVtwcm9wZXJ0eV0pKTtcbiAgICAgICAgICBjYXNlICdyYW5nZVN0ZXAnOlxuICAgICAgICAgICAgY29uc3QgcmFuZ2VTdGVwID0gc3BlY2lmaWVkU2NhbGVbcHJvcGVydHldO1xuICAgICAgICAgICAgaWYgKHJhbmdlU3RlcCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICBpZiAoIXNpemVTcGVjaWZpZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWFrZUV4cGxpY2l0KHtzdGVwOiByYW5nZVN0ZXB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0b3AtbGV2ZWwgc2l6ZSBpcyBzcGVjaWZpZWQsIHdlIGlnbm9yZSBzcGVjaWZpZWQgcmFuZ2VTdGVwLlxuICAgICAgICAgICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLnJhbmdlU3RlcERyb3BwZWQoY2hhbm5lbCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1ha2VJbXBsaWNpdChcbiAgICBkZWZhdWx0UmFuZ2UoXG4gICAgICBjaGFubmVsLCBzY2FsZVR5cGUsIHR5cGUsIGNvbmZpZyxcbiAgICAgIHplcm8sIG1hcmssIHNpemVTaWduYWwsIHh5UmFuZ2VTdGVwcywgbm9SYW5nZVN0ZXBcbiAgICApXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU2NoZW1lKHNjaGVtZTogU2NoZW1lKSB7XG4gIGlmIChpc0V4dGVuZGVkU2NoZW1lKHNjaGVtZSkpIHtcbiAgICBjb25zdCByOiBWZ1NjaGVtZSA9IHtzY2hlbWU6IHNjaGVtZS5uYW1lfTtcbiAgICBpZiAoc2NoZW1lLmNvdW50KSB7XG4gICAgICByLmNvdW50ID0gc2NoZW1lLmNvdW50O1xuICAgIH1cbiAgICBpZiAoc2NoZW1lLmV4dGVudCkge1xuICAgICAgci5leHRlbnQgPSBzY2hlbWUuZXh0ZW50O1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICByZXR1cm4ge3NjaGVtZTogc2NoZW1lfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRSYW5nZShcbiAgY2hhbm5lbDogQ2hhbm5lbCwgc2NhbGVUeXBlOiBTY2FsZVR5cGUsIHR5cGU6IFR5cGUsIGNvbmZpZzogQ29uZmlnLCB6ZXJvOiBib29sZWFuLCBtYXJrOiBNYXJrLFxuICBzaXplU2lnbmFsOiBzdHJpbmcsIHh5UmFuZ2VTdGVwczogbnVtYmVyW10sIG5vUmFuZ2VTdGVwOiBib29sZWFuXG4pOiBWZ1JhbmdlIHtcbiAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgY2FzZSBYOlxuICAgIGNhc2UgWTpcbiAgICAgIGlmICh1dGlsLmNvbnRhaW5zKFsncG9pbnQnLCAnYmFuZCddLCBzY2FsZVR5cGUpICYmICFub1JhbmdlU3RlcCkge1xuICAgICAgICBpZiAoY2hhbm5lbCA9PT0gWCAmJiBtYXJrID09PSAndGV4dCcpIHtcbiAgICAgICAgICBpZiAoY29uZmlnLnNjYWxlLnRleHRYUmFuZ2VTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4ge3N0ZXA6IGNvbmZpZy5zY2FsZS50ZXh0WFJhbmdlU3RlcH07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChjb25maWcuc2NhbGUucmFuZ2VTdGVwKSB7XG4gICAgICAgICAgICByZXR1cm4ge3N0ZXA6IGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiByYW5nZSBzdGVwIGlzIG51bGwsIHVzZSB6ZXJvIHRvIHdpZHRoIG9yIGhlaWdodC5cbiAgICAgIC8vIE5vdGUgdGhhdCB0aGVzZSByYW5nZSBzaWduYWxzIGFyZSB0ZW1wb3JhcnlcbiAgICAgIC8vIGFzIHRoZXkgY2FuIGJlIG1lcmdlZCBhbmQgcmVuYW1lZC5cbiAgICAgIC8vIChXZSBkbyBub3QgaGF2ZSB0aGUgcmlnaHQgc2l6ZSBzaWduYWwgaGVyZSBzaW5jZSBwYXJzZUxheW91dFNpemUoKSBoYXBwZW5zIGFmdGVyIHBhcnNlU2NhbGUoKS4pXG4gICAgICAvLyBXZSB3aWxsIGxhdGVyIHJlcGxhY2UgdGhlc2UgdGVtcG9yYXJ5IG5hbWVzIHdpdGhcbiAgICAgIC8vIHRoZSBmaW5hbCBuYW1lIGluIGFzc2VtYmxlU2NhbGVSYW5nZSgpXG5cbiAgICAgIGlmIChjaGFubmVsID09PSBZICYmIGhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSkge1xuICAgICAgICAvLyBGb3IgeSBjb250aW51b3VzIHNjYWxlLCB3ZSBoYXZlIHRvIHN0YXJ0IGZyb20gdGhlIGhlaWdodCBhcyB0aGUgYm90dG9tIHBhcnQgaGFzIHRoZSBtYXggdmFsdWUuXG4gICAgICAgIHJldHVybiBbe3NpZ25hbDogc2l6ZVNpZ25hbH0sIDBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFswLCB7c2lnbmFsOiBzaXplU2lnbmFsfV07XG4gICAgICB9XG4gICAgY2FzZSBTSVpFOlxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBjdXN0b20gcmFuZ2VNaW4sIHJhbmdlTWF4XG4gICAgICBjb25zdCByYW5nZU1pbiA9IHNpemVSYW5nZU1pbihtYXJrLCB6ZXJvLCBjb25maWcpO1xuICAgICAgY29uc3QgcmFuZ2VNYXggPSBzaXplUmFuZ2VNYXgobWFyaywgeHlSYW5nZVN0ZXBzLCBjb25maWcpO1xuICAgICAgcmV0dXJuIFtyYW5nZU1pbiwgcmFuZ2VNYXhdO1xuICAgIGNhc2UgU0hBUEU6XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgY2FzZSBDT0xPUjpcbiAgICBjYXNlIEZJTEw6XG4gICAgY2FzZSBTVFJPS0U6XG4gICAgICBpZiAoc2NhbGVUeXBlID09PSAnb3JkaW5hbCcpIHtcbiAgICAgICAgLy8gT25seSBub21pbmFsIGRhdGEgdXNlcyBvcmRpbmFsIHNjYWxlIGJ5IGRlZmF1bHRcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdub21pbmFsJyA/ICdjYXRlZ29yeScgOiAnb3JkaW5hbCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFyayA9PT0gJ3JlY3QnIHx8IG1hcmsgPT09ICdnZW9zaGFwZScgPyAnaGVhdG1hcCcgOiAncmFtcCc7XG4gICAgY2FzZSBPUEFDSVRZOlxuICAgICAgLy8gVE9ETzogc3VwcG9ydCBjdXN0b20gcmFuZ2VNaW4sIHJhbmdlTWF4XG4gICAgICByZXR1cm4gW2NvbmZpZy5zY2FsZS5taW5PcGFjaXR5LCBjb25maWcuc2NhbGUubWF4T3BhY2l0eV07XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHNob3VsZCBuZXZlciByZWFjaCBoZXJlICovXG4gIHRocm93IG5ldyBFcnJvcihgU2NhbGUgcmFuZ2UgdW5kZWZpbmVkIGZvciBjaGFubmVsICR7Y2hhbm5lbH1gKTtcbn1cblxuZnVuY3Rpb24gc2l6ZVJhbmdlTWluKG1hcms6IE1hcmssIHplcm86IGJvb2xlYW4sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGlmICh6ZXJvKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgc3dpdGNoIChtYXJrKSB7XG4gICAgY2FzZSAnYmFyJzpcbiAgICBjYXNlICd0aWNrJzpcbiAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWluQmFuZFNpemU7XG4gICAgY2FzZSAnbGluZSc6XG4gICAgY2FzZSAndHJhaWwnOlxuICAgIGNhc2UgJ3J1bGUnOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5taW5TdHJva2VXaWR0aDtcbiAgICBjYXNlICd0ZXh0JzpcbiAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWluRm9udFNpemU7XG4gICAgY2FzZSAncG9pbnQnOlxuICAgIGNhc2UgJ3NxdWFyZSc6XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWluU2l6ZTtcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgKi9cbiAgLy8gc2l6ZVJhbmdlTWluIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhlIG1hcmtcbiAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLmluY29tcGF0aWJsZUNoYW5uZWwoJ3NpemUnLCBtYXJrKSk7XG59XG5cbmZ1bmN0aW9uIHNpemVSYW5nZU1heChtYXJrOiBNYXJrLCB4eVJhbmdlU3RlcHM6IG51bWJlcltdLCBjb25maWc6IENvbmZpZykge1xuICBjb25zdCBzY2FsZUNvbmZpZyA9IGNvbmZpZy5zY2FsZTtcbiAgc3dpdGNoIChtYXJrKSB7XG4gICAgY2FzZSAnYmFyJzpcbiAgICBjYXNlICd0aWNrJzpcbiAgICAgIGlmIChjb25maWcuc2NhbGUubWF4QmFuZFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY29uZmlnLnNjYWxlLm1heEJhbmRTaXplO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1pblhZUmFuZ2VTdGVwKHh5UmFuZ2VTdGVwcywgY29uZmlnLnNjYWxlKSAtIDE7XG4gICAgY2FzZSAnbGluZSc6XG4gICAgY2FzZSAndHJhaWwnOlxuICAgIGNhc2UgJ3J1bGUnOlxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS5tYXhTdHJva2VXaWR0aDtcbiAgICBjYXNlICd0ZXh0JzpcbiAgICAgIHJldHVybiBjb25maWcuc2NhbGUubWF4Rm9udFNpemU7XG4gICAgY2FzZSAncG9pbnQnOlxuICAgIGNhc2UgJ3NxdWFyZSc6XG4gICAgY2FzZSAnY2lyY2xlJzpcbiAgICAgIGlmIChjb25maWcuc2NhbGUubWF4U2l6ZSkge1xuICAgICAgICByZXR1cm4gY29uZmlnLnNjYWxlLm1heFNpemU7XG4gICAgICB9XG5cbiAgICAgIC8vIEZJWE1FIHRoaXMgY2FzZSB0b3RhbGx5IHNob3VsZCBiZSByZWZhY3RvcmVkXG4gICAgICBjb25zdCBwb2ludFN0ZXAgPSBtaW5YWVJhbmdlU3RlcCh4eVJhbmdlU3RlcHMsIHNjYWxlQ29uZmlnKTtcbiAgICAgIHJldHVybiAocG9pbnRTdGVwIC0gMikgKiAocG9pbnRTdGVwIC0gMik7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHNob3VsZCBuZXZlciByZWFjaCBoZXJlICovXG4gIC8vIHNpemVSYW5nZU1heCBub3QgaW1wbGVtZW50ZWQgZm9yIHRoZSBtYXJrXG4gIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5pbmNvbXBhdGlibGVDaGFubmVsKCdzaXplJywgbWFyaykpO1xufVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJhbmdlIHN0ZXAgb2YgeCBvciB5IG9yIG1pbmltdW0gYmV0d2VlbiB0aGUgdHdvIGlmIGJvdGggYXJlIG9yZGluYWwgc2NhbGUuXG4gKi9cbmZ1bmN0aW9uIG1pblhZUmFuZ2VTdGVwKHh5UmFuZ2VTdGVwczogbnVtYmVyW10sIHNjYWxlQ29uZmlnOiBTY2FsZUNvbmZpZyk6IG51bWJlciB7XG4gIGlmICh4eVJhbmdlU3RlcHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBNYXRoLm1pbi5hcHBseShudWxsLCB4eVJhbmdlU3RlcHMpO1xuICB9XG4gIGlmIChzY2FsZUNvbmZpZy5yYW5nZVN0ZXApIHtcbiAgICByZXR1cm4gc2NhbGVDb25maWcucmFuZ2VTdGVwO1xuICB9XG4gIHJldHVybiAyMTsgLy8gRklYTUU6IHJlLWV2YWx1YXRlIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUuXG59XG4iXX0=","import { X, Y } from '../../channel';\nimport * as log from '../../log';\nimport { channelScalePropertyIncompatability, hasContinuousDomain, isContinuousToContinuous, ScaleType, scaleTypeSupportProperty } from '../../scale';\nimport { contains, keys } from '../../util';\nimport * as util from '../../util';\nimport { isUnitModel } from '../model';\nimport { mergeValuesWithExplicit, tieBreakByComparing } from '../split';\nimport { parseScaleRange } from './range';\nexport function parseScaleProperty(model, property) {\n if (isUnitModel(model)) {\n parseUnitScaleProperty(model, property);\n }\n else {\n parseNonUnitScaleProperty(model, property);\n }\n}\nfunction parseUnitScaleProperty(model, property) {\n var localScaleComponents = model.component.scales;\n keys(localScaleComponents).forEach(function (channel) {\n var specifiedScale = model.specifiedScales[channel];\n var localScaleCmpt = localScaleComponents[channel];\n var mergedScaleCmpt = model.getScaleComponent(channel);\n var fieldDef = model.fieldDef(channel);\n var config = model.config;\n var specifiedValue = specifiedScale[property];\n var sType = mergedScaleCmpt.get('type');\n var supportedByScaleType = scaleTypeSupportProperty(sType, property);\n var channelIncompatability = channelScalePropertyIncompatability(channel, property);\n if (specifiedValue !== undefined) {\n // If there is a specified value, check if it is compatible with scale type and channel\n if (!supportedByScaleType) {\n log.warn(log.message.scalePropertyNotWorkWithScaleType(sType, property, channel));\n }\n else if (channelIncompatability) { // channel\n log.warn(channelIncompatability);\n }\n }\n if (supportedByScaleType && channelIncompatability === undefined) {\n if (specifiedValue !== undefined) {\n // copyKeyFromObject ensure type safety\n localScaleCmpt.copyKeyFromObject(property, specifiedScale);\n }\n else {\n var value = getDefaultValue(property, channel, fieldDef, mergedScaleCmpt.get('type'), mergedScaleCmpt.get('padding'), mergedScaleCmpt.get('paddingInner'), specifiedScale.domain, model.markDef, config);\n if (value !== undefined) {\n localScaleCmpt.set(property, value, false);\n }\n }\n }\n });\n}\n// Note: This method is used in Voyager.\nexport function getDefaultValue(property, channel, fieldDef, scaleType, scalePadding, scalePaddingInner, specifiedDomain, markDef, config) {\n var scaleConfig = config.scale;\n // If we have default rule-base, determine default value first\n switch (property) {\n case 'nice':\n return nice(scaleType, channel, fieldDef);\n case 'padding':\n return padding(channel, scaleType, scaleConfig, fieldDef, markDef, config.bar);\n case 'paddingInner':\n return paddingInner(scalePadding, channel, scaleConfig);\n case 'paddingOuter':\n return paddingOuter(scalePadding, channel, scaleType, scalePaddingInner, scaleConfig);\n case 'reverse':\n return reverse(scaleType, fieldDef.sort);\n case 'zero':\n return zero(channel, fieldDef, specifiedDomain, markDef);\n }\n // Otherwise, use scale config\n return scaleConfig[property];\n}\nexport function parseNonUnitScaleProperty(model, property) {\n var localScaleComponents = model.component.scales;\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n if (property === 'range') {\n parseScaleRange(child);\n }\n else {\n parseScaleProperty(child, property);\n }\n }\n keys(localScaleComponents).forEach(function (channel) {\n var valueWithExplicit;\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n var childComponent = child.component.scales[channel];\n if (childComponent) {\n var childValueWithExplicit = childComponent.getWithExplicit(property);\n valueWithExplicit = mergeValuesWithExplicit(valueWithExplicit, childValueWithExplicit, property, 'scale', tieBreakByComparing(function (v1, v2) {\n switch (property) {\n case 'range':\n // For range step, prefer larger step\n if (v1.step && v2.step) {\n return v1.step - v2.step;\n }\n return 0;\n // TODO: precedence rule for other properties\n }\n return 0;\n }));\n }\n }\n localScaleComponents[channel].setWithExplicit(property, valueWithExplicit);\n });\n}\nexport function nice(scaleType, channel, fieldDef) {\n if (fieldDef.bin || util.contains([ScaleType.TIME, ScaleType.UTC], scaleType)) {\n return undefined;\n }\n return util.contains([X, Y], channel); // return true for quantitative X/Y unless binned\n}\nexport function padding(channel, scaleType, scaleConfig, fieldDef, markDef, barConfig) {\n if (util.contains([X, Y], channel)) {\n if (isContinuousToContinuous(scaleType)) {\n if (scaleConfig.continuousPadding !== undefined) {\n return scaleConfig.continuousPadding;\n }\n var type = markDef.type, orient = markDef.orient;\n if (type === 'bar' && !fieldDef.bin) {\n if ((orient === 'vertical' && channel === 'x') ||\n (orient === 'horizontal' && channel === 'y')) {\n return barConfig.continuousBandSize;\n }\n }\n }\n if (scaleType === ScaleType.POINT) {\n return scaleConfig.pointPadding;\n }\n }\n return undefined;\n}\nexport function paddingInner(paddingValue, channel, scaleConfig) {\n if (paddingValue !== undefined) {\n // If user has already manually specified \"padding\", no need to add default paddingInner.\n return undefined;\n }\n if (util.contains([X, Y], channel)) {\n // Padding is only set for X and Y by default.\n // Basically it doesn't make sense to add padding for color and size.\n // paddingOuter would only be called if it's a band scale, just return the default for bandScale.\n return scaleConfig.bandPaddingInner;\n }\n return undefined;\n}\nexport function paddingOuter(paddingValue, channel, scaleType, paddingInnerValue, scaleConfig) {\n if (paddingValue !== undefined) {\n // If user has already manually specified \"padding\", no need to add default paddingOuter.\n return undefined;\n }\n if (util.contains([X, Y], channel)) {\n // Padding is only set for X and Y by default.\n // Basically it doesn't make sense to add padding for color and size.\n if (scaleType === ScaleType.BAND) {\n if (scaleConfig.bandPaddingOuter !== undefined) {\n return scaleConfig.bandPaddingOuter;\n }\n /* By default, paddingOuter is paddingInner / 2. The reason is that\n size (width/height) = step * (cardinality - paddingInner + 2 * paddingOuter).\n and we want the width/height to be integer by default.\n Note that step (by default) and cardinality are integers.) */\n return paddingInnerValue / 2;\n }\n }\n return undefined;\n}\nexport function reverse(scaleType, sort) {\n if (hasContinuousDomain(scaleType) && sort === 'descending') {\n // For continuous domain scales, Vega does not support domain sort.\n // Thus, we reverse range instead if sort is descending\n return true;\n }\n return undefined;\n}\nexport function zero(channel, fieldDef, specifiedScale, markDef) {\n // If users explicitly provide a domain range, we should not augment zero as that will be unexpected.\n var hasCustomDomain = !!specifiedScale && specifiedScale !== 'unaggregated';\n if (hasCustomDomain) {\n return false;\n }\n // If there is no custom domain, return true only for the following cases:\n // 1) using quantitative field with size\n // While this can be either ratio or interval fields, our assumption is that\n // ratio are more common.\n if (channel === 'size' && fieldDef.type === 'quantitative') {\n return true;\n }\n // 2) non-binned, quantitative x-scale or y-scale\n // (For binning, we should not include zero by default because binning are calculated without zero.)\n if (!fieldDef.bin && util.contains([X, Y], channel)) {\n var orient = markDef.orient, type = markDef.type;\n if (contains(['bar', 'area', 'line', 'trail'], type)) {\n if ((orient === 'horizontal' && channel === 'y') ||\n (orient === 'vertical' && channel === 'x')) {\n return false;\n }\n }\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL3Byb3BlcnRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixDQUFDLEVBQUUsQ0FBQyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRzFELE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBQyxtQ0FBbUMsRUFBVSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFBZ0MsU0FBUyxFQUFFLHdCQUF3QixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFMLE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxXQUFXLEVBQVEsTUFBTSxVQUFVLENBQUM7QUFDNUMsT0FBTyxFQUFXLHVCQUF1QixFQUFFLG1CQUFtQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBR2hGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFeEMsTUFBTSw2QkFBNkIsS0FBWSxFQUFFLFFBQTZDO0lBQzVGLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLHNCQUFzQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztLQUN6QztTQUFNO1FBQ0wseUJBQXlCLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQzVDO0FBQ0gsQ0FBQztBQUVELGdDQUFnQyxLQUFnQixFQUFFLFFBQTZDO0lBQzdGLElBQU0sb0JBQW9CLEdBQXdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO0lBRXpFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLE9BQXFCO1FBQ3ZELElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxD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SSxRQUFRLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNwRCxJQUNFLENBQUMsTUFBTSxLQUFLLFlBQVksSUFBSSxPQUFPLEtBQUssR0FBRyxDQUFDO2dCQUM1QyxDQUFDLE1BQU0sS0FBSyxVQUFVLElBQUksT0FBTyxLQUFLLEdBQUcsQ0FBQyxFQUMxQztnQkFDQSxPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFFRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFubmVsLCBTY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0ZpZWxkRGVmLCBTY2FsZUZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7QmFyQ29uZmlnLCBNYXJrRGVmfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7Y2hhbm5lbFNjYWxlUHJvcGVydHlJbmNvbXBhdGFiaWxpdHksIERvbWFpbiwgaGFzQ29udGludW91c0RvbWFpbiwgaXNDb250aW51b3VzVG9Db250aW51b3VzLCBOaWNlVGltZSwgU2NhbGUsIFNjYWxlQ29uZmlnLCBTY2FsZVR5cGUsIHNjYWxlVHlwZVN1cHBvcnRQcm9wZXJ0eX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtFbmNvZGluZ1NvcnRGaWVsZCwgU29ydE9yZGVyfSBmcm9tICcuLi8uLi9zb3J0JztcbmltcG9ydCB7Y29udGFpbnMsIGtleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdTY2FsZX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtpc1VuaXRNb2RlbCwgTW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RXhwbGljaXQsIG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0LCB0aWVCcmVha0J5Q29tcGFyaW5nfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50LCBTY2FsZUNvbXBvbmVudEluZGV4LCBTY2FsZUNvbXBvbmVudFByb3BzfSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge3BhcnNlU2NhbGVSYW5nZX0gZnJvbSAnLi9yYW5nZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYWxlUHJvcGVydHkobW9kZWw6IE1vZGVsLCBwcm9wZXJ0eToga2V5b2YgKFNjYWxlIHwgU2NhbGVDb21wb25lbnRQcm9wcykpIHtcbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSkge1xuICAgIHBhcnNlVW5pdFNjYWxlUHJvcGVydHkobW9kZWwsIHByb3BlcnR5KTtcbiAgfSBlbHNlIHtcbiAgICBwYXJzZU5vblVuaXRTY2FsZVByb3BlcnR5KG1vZGVsLCBwcm9wZXJ0eSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VVbml0U2NhbGVQcm9wZXJ0eShtb2RlbDogVW5pdE1vZGVsLCBwcm9wZXJ0eToga2V5b2YgKFNjYWxlIHwgU2NhbGVDb21wb25lbnRQcm9wcykpIHtcbiAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudHM6IFNjYWxlQ29tcG9uZW50SW5kZXggPSBtb2RlbC5jb21wb25lbnQuc2NhbGVzO1xuXG4gIGtleXMobG9jYWxTY2FsZUNvbXBvbmVudHMpLmZvckVhY2goKGNoYW5uZWw6IFNjYWxlQ2hhbm5lbCkgPT4ge1xuICAgIGNvbnN0IHNwZWNpZmllZFNjYWxlID0gbW9kZWwuc3BlY2lmaWVkU2NhbGVzW2NoYW5uZWxdO1xuICAgIGNvbnN0IGxvY2FsU2NhbGVDbXB0ID0gbG9jYWxTY2FsZUNvbXBvbmVudHNbY2hhbm5lbF07XG4gICAgY29uc3QgbWVyZ2VkU2NhbGVDbXB0ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gICAgY29uc3QgZmllbGREZWYgPSBtb2RlbC5maWVsZERlZihjaGFubmVsKTtcbiAgICBjb25zdCBjb25maWcgPSBtb2RlbC5jb25maWc7XG5cbiAgICBjb25zdCBzcGVjaWZpZWRWYWx1ZSA9IHNwZWNpZmllZFNjYWxlW3Byb3BlcnR5XTtcbiAgICBjb25zdCBzVHlwZSA9IG1lcmdlZFNjYWxlQ21wdC5nZXQoJ3R5cGUnKTtcblxuICAgIGNvbnN0IHN1cHBvcnRlZEJ5U2NhbGVUeXBlID0gc2NhbGVUeXBlU3VwcG9ydFByb3BlcnR5KHNUeXBlLCBwcm9wZXJ0eSk7XG4gICAgY29uc3QgY2hhbm5lbEluY29tcGF0YWJpbGl0eSA9IGNoYW5uZWxTY2FsZVByb3BlcnR5SW5jb21wYXRhYmlsaXR5KGNoYW5uZWwsIHByb3BlcnR5KTtcblxuICAgIGlmIChzcGVjaWZpZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB2YWx1ZSwgY2hlY2sgaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHNjYWxlIHR5cGUgYW5kIGNoYW5uZWxcbiAgICAgIGlmICghc3VwcG9ydGVkQnlTY2FsZVR5cGUpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uuc2NhbGVQcm9wZXJ0eU5vdFdvcmtXaXRoU2NhbGVUeXBlKHNUeXBlLCBwcm9wZXJ0eSwgY2hhbm5lbCkpO1xuICAgICAgfSBlbHNlIGlmIChjaGFubmVsSW5jb21wYXRhYmlsaXR5KSB7IC8vIGNoYW5uZWxcbiAgICAgICAgbG9nLndhcm4oY2hhbm5lbEluY29tcGF0YWJpbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdXBwb3J0ZWRCeVNjYWxlVHlwZSAmJiBjaGFubmVsSW5jb21wYXRhYmlsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChzcGVjaWZpZWRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIGNvcHlLZXlGcm9tT2JqZWN0IGVuc3VyZSB0eXBlIHNhZmV0eVxuICAgICAgICBsb2NhbFNjYWxlQ21wdC5jb3B5S2V5RnJvbU9iamVjdChwcm9wZXJ0eSwgc3BlY2lmaWVkU2NhbGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXREZWZhdWx0VmFsdWUoXG4gICAgICAgICAgcHJvcGVydHksIGNoYW5uZWwsIGZpZWxkRGVmLFxuICAgICAgICAgIG1lcmdlZFNjYWxlQ21wdC5nZXQoJ3R5cGUnKSxcbiAgICAgICAgICBtZXJnZWRTY2FsZUNtcHQuZ2V0KCdwYWRkaW5nJyksXG4gICAgICAgICAgbWVyZ2VkU2NhbGVDbXB0LmdldCgncGFkZGluZ0lubmVyJyksXG4gICAgICAgICAgc3BlY2lmaWVkU2NhbGUuZG9tYWluLFxuICAgICAgICAgIG1vZGVsLm1hcmtEZWYsIGNvbmZpZ1xuICAgICAgICApO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxvY2FsU2NhbGVDbXB0LnNldChwcm9wZXJ0eSwgdmFsdWUsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gVm95YWdlci5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0VmFsdWUoXG4gIHByb3BlcnR5OiBrZXlvZiBTY2FsZSwgY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IFNjYWxlRmllbGREZWY8c3RyaW5nPixcbiAgc2NhbGVUeXBlOiBTY2FsZVR5cGUsIHNjYWxlUGFkZGluZzogbnVtYmVyLCBzY2FsZVBhZGRpbmdJbm5lcjogbnVtYmVyLFxuICBzcGVjaWZpZWREb21haW46IFNjYWxlWydkb21haW4nXSwgbWFya0RlZjogTWFya0RlZiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3Qgc2NhbGVDb25maWcgPSBjb25maWcuc2NhbGU7XG5cbiAgLy8gSWYgd2UgaGF2ZSBkZWZhdWx0IHJ1bGUtYmFzZSwgZGV0ZXJtaW5lIGRlZmF1bHQgdmFsdWUgZmlyc3RcbiAgc3dpdGNoIChwcm9wZXJ0eSkge1xuICAgIGNhc2UgJ25pY2UnOlxuICAgICAgcmV0dXJuIG5pY2Uoc2NhbGVUeXBlLCBjaGFubmVsLCBmaWVsZERlZik7XG4gICAgY2FzZSAncGFkZGluZyc6XG4gICAgICByZXR1cm4gcGFkZGluZyhjaGFubmVsLCBzY2FsZVR5cGUsIHNjYWxlQ29uZmlnLCBmaWVsZERlZiwgbWFya0RlZiwgY29uZmlnLmJhcik7XG4gICAgY2FzZSAncGFkZGluZ0lubmVyJzpcbiAgICAgIHJldHVybiBwYWRkaW5nSW5uZXIoc2NhbGVQYWRkaW5nLCBjaGFubmVsLCBzY2FsZUNvbmZpZyk7XG4gICAgY2FzZSAncGFkZGluZ091dGVyJzpcbiAgICAgIHJldHVybiBwYWRkaW5nT3V0ZXIoc2NhbGVQYWRkaW5nLCBjaGFubmVsLCBzY2FsZVR5cGUsIHNjYWxlUGFkZGluZ0lubmVyLCBzY2FsZUNvbmZpZyk7XG4gICAgY2FzZSAncmV2ZXJzZSc6XG4gICAgICByZXR1cm4gcmV2ZXJzZShzY2FsZVR5cGUsIGZpZWxkRGVmLnNvcnQpO1xuICAgIGNhc2UgJ3plcm8nOlxuICAgICAgcmV0dXJuIHplcm8oY2hhbm5lbCwgZmllbGREZWYsIHNwZWNpZmllZERvbWFpbiwgbWFya0RlZik7XG4gIH1cbiAgLy8gT3RoZXJ3aXNlLCB1c2Ugc2NhbGUgY29uZmlnXG4gIHJldHVybiBzY2FsZUNvbmZpZ1twcm9wZXJ0eV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZU5vblVuaXRTY2FsZVByb3BlcnR5KG1vZGVsOiBNb2RlbCwgcHJvcGVydHk6IGtleW9mIChTY2FsZSB8IFNjYWxlQ29tcG9uZW50UHJvcHMpKSB7XG4gIGNvbnN0IGxvY2FsU2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlcztcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgaWYgKHByb3BlcnR5ID09PSAncmFuZ2UnKSB7XG4gICAgICBwYXJzZVNjYWxlUmFuZ2UoY2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJzZVNjYWxlUHJvcGVydHkoY2hpbGQsIHByb3BlcnR5KTtcbiAgICB9XG4gIH1cblxuICBrZXlzKGxvY2FsU2NhbGVDb21wb25lbnRzKS5mb3JFYWNoKChjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICBsZXQgdmFsdWVXaXRoRXhwbGljaXQ6IEV4cGxpY2l0PGFueT47XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG1vZGVsLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBjaGlsZENvbXBvbmVudCA9IGNoaWxkLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICBpZiAoY2hpbGRDb21wb25lbnQpIHtcbiAgICAgICAgY29uc3QgY2hpbGRWYWx1ZVdpdGhFeHBsaWNpdCA9IGNoaWxkQ29tcG9uZW50LmdldFdpdGhFeHBsaWNpdChwcm9wZXJ0eSk7XG4gICAgICAgIHZhbHVlV2l0aEV4cGxpY2l0ID0gbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQ8VmdTY2FsZSwgYW55PihcbiAgICAgICAgICB2YWx1ZVdpdGhFeHBsaWNpdCwgY2hpbGRWYWx1ZVdpdGhFeHBsaWNpdCxcbiAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAnc2NhbGUnLFxuICAgICAgICAgIHRpZUJyZWFrQnlDb21wYXJpbmc8VmdTY2FsZSwgYW55PigodjEsIHYyKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHByb3BlcnR5KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAvLyBGb3IgcmFuZ2Ugc3RlcCwgcHJlZmVyIGxhcmdlciBzdGVwXG4gICAgICAgICAgICAgICAgaWYgKHYxLnN0ZXAgJiYgdjIuc3RlcCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHYxLnN0ZXAgLSB2Mi5zdGVwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgLy8gVE9ETzogcHJlY2VkZW5jZSBydWxlIGZvciBvdGhlciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2NhbFNjYWxlQ29tcG9uZW50c1tjaGFubmVsXS5zZXRXaXRoRXhwbGljaXQocHJvcGVydHksIHZhbHVlV2l0aEV4cGxpY2l0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuaWNlKHNjYWxlVHlwZTogU2NhbGVUeXBlLCBjaGFubmVsOiBDaGFubmVsLCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPik6IGJvb2xlYW4gfCBOaWNlVGltZSB7XG4gIGlmIChmaWVsZERlZi5iaW4gfHwgdXRpbC5jb250YWlucyhbU2NhbGVUeXBlLlRJTUUsIFNjYWxlVHlwZS5VVENdLCBzY2FsZVR5cGUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gdXRpbC5jb250YWlucyhbWCwgWV0sIGNoYW5uZWwpOyAvLyByZXR1cm4gdHJ1ZSBmb3IgcXVhbnRpdGF0aXZlIFgvWSB1bmxlc3MgYmlubmVkXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWRkaW5nKGNoYW5uZWw6IENoYW5uZWwsIHNjYWxlVHlwZTogU2NhbGVUeXBlLCBzY2FsZUNvbmZpZzogU2NhbGVDb25maWcsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBtYXJrRGVmOiBNYXJrRGVmLCBiYXJDb25maWc6IEJhckNvbmZpZykge1xuICBpZiAodXRpbC5jb250YWlucyhbWCwgWV0sIGNoYW5uZWwpKSB7XG4gICAgaWYgKGlzQ29udGludW91c1RvQ29udGludW91cyhzY2FsZVR5cGUpKSB7XG4gICAgICBpZiAoc2NhbGVDb25maWcuY29udGludW91c1BhZGRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc2NhbGVDb25maWcuY29udGludW91c1BhZGRpbmc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHt0eXBlLCBvcmllbnR9ID0gbWFya0RlZjtcbiAgICAgIGlmICh0eXBlID09PSAnYmFyJyAmJiAhZmllbGREZWYuYmluKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAob3JpZW50ID09PSAndmVydGljYWwnICYmIGNoYW5uZWwgPT09ICd4JykgfHxcbiAgICAgICAgICAob3JpZW50ID09PSAnaG9yaXpvbnRhbCcgJiYgY2hhbm5lbCA9PT0gJ3knKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gYmFyQ29uZmlnLmNvbnRpbnVvdXNCYW5kU2l6ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzY2FsZVR5cGUgPT09IFNjYWxlVHlwZS5QT0lOVCkge1xuICAgICAgcmV0dXJuIHNjYWxlQ29uZmlnLnBvaW50UGFkZGluZztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhZGRpbmdJbm5lcihwYWRkaW5nVmFsdWU6IG51bWJlciwgY2hhbm5lbDogQ2hhbm5lbCwgc2NhbGVDb25maWc6IFNjYWxlQ29uZmlnKSB7XG4gIGlmIChwYWRkaW5nVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIElmIHVzZXIgaGFzIGFscmVhZHkgbWFudWFsbHkgc3BlY2lmaWVkIFwicGFkZGluZ1wiLCBubyBuZWVkIHRvIGFkZCBkZWZhdWx0IHBhZGRpbmdJbm5lci5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHV0aWwuY29udGFpbnMoW1gsIFldLCBjaGFubmVsKSkge1xuICAgIC8vIFBhZGRpbmcgaXMgb25seSBzZXQgZm9yIFggYW5kIFkgYnkgZGVmYXVsdC5cbiAgICAvLyBCYXNpY2FsbHkgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGFkZCBwYWRkaW5nIGZvciBjb2xvciBhbmQgc2l6ZS5cblxuICAgIC8vIHBhZGRpbmdPdXRlciB3b3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBpdCdzIGEgYmFuZCBzY2FsZSwganVzdCByZXR1cm4gdGhlIGRlZmF1bHQgZm9yIGJhbmRTY2FsZS5cbiAgICByZXR1cm4gc2NhbGVDb25maWcuYmFuZFBhZGRpbmdJbm5lcjtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFkZGluZ091dGVyKHBhZGRpbmdWYWx1ZTogbnVtYmVyLCBjaGFubmVsOiBDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSwgcGFkZGluZ0lubmVyVmFsdWU6IG51bWJlciwgc2NhbGVDb25maWc6IFNjYWxlQ29uZmlnKSB7XG4gIGlmIChwYWRkaW5nVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIElmIHVzZXIgaGFzIGFscmVhZHkgbWFudWFsbHkgc3BlY2lmaWVkIFwicGFkZGluZ1wiLCBubyBuZWVkIHRvIGFkZCBkZWZhdWx0IHBhZGRpbmdPdXRlci5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHV0aWwuY29udGFpbnMoW1gsIFldLCBjaGFubmVsKSkge1xuICAgIC8vIFBhZGRpbmcgaXMgb25seSBzZXQgZm9yIFggYW5kIFkgYnkgZGVmYXVsdC5cbiAgICAvLyBCYXNpY2FsbHkgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIGFkZCBwYWRkaW5nIGZvciBjb2xvciBhbmQgc2l6ZS5cbiAgICBpZiAoc2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgaWYgKHNjYWxlQ29uZmlnLmJhbmRQYWRkaW5nT3V0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc2NhbGVDb25maWcuYmFuZFBhZGRpbmdPdXRlcjtcbiAgICAgIH1cbiAgICAgIC8qIEJ5IGRlZmF1bHQsIHBhZGRpbmdPdXRlciBpcyBwYWRkaW5nSW5uZXIgLyAyLiBUaGUgcmVhc29uIGlzIHRoYXRcbiAgICAgICAgICBzaXplICh3aWR0aC9oZWlnaHQpID0gc3RlcCAqIChjYXJkaW5hbGl0eSAtIHBhZGRpbmdJbm5lciArIDIgKiBwYWRkaW5nT3V0ZXIpLlxuICAgICAgICAgIGFuZCB3ZSB3YW50IHRoZSB3aWR0aC9oZWlnaHQgdG8gYmUgaW50ZWdlciBieSBkZWZhdWx0LlxuICAgICAgICAgIE5vdGUgdGhhdCBzdGVwIChieSBkZWZhdWx0KSBhbmQgY2FyZGluYWxpdHkgYXJlIGludGVnZXJzLikgKi9cbiAgICAgIHJldHVybiBwYWRkaW5nSW5uZXJWYWx1ZSAvIDI7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKHNjYWxlVHlwZTogU2NhbGVUeXBlLCBzb3J0OiBTb3J0T3JkZXIgfCBFbmNvZGluZ1NvcnRGaWVsZDxzdHJpbmc+IHwgc3RyaW5nW10pIHtcbiAgaWYgKGhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSAmJiBzb3J0ID09PSAnZGVzY2VuZGluZycpIHtcbiAgICAvLyBGb3IgY29udGludW91cyBkb21haW4gc2NhbGVzLCBWZWdhIGRvZXMgbm90IHN1cHBvcnQgZG9tYWluIHNvcnQuXG4gICAgLy8gVGh1cywgd2UgcmV2ZXJzZSByYW5nZSBpbnN0ZWFkIGlmIHNvcnQgaXMgZGVzY2VuZGluZ1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvKGNoYW5uZWw6IENoYW5uZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBzcGVjaWZpZWRTY2FsZTogRG9tYWluLCBtYXJrRGVmOiBNYXJrRGVmKSB7XG5cbiAgLy8gSWYgdXNlcnMgZXhwbGljaXRseSBwcm92aWRlIGEgZG9tYWluIHJhbmdlLCB3ZSBzaG91bGQgbm90IGF1Z21lbnQgemVybyBhcyB0aGF0IHdpbGwgYmUgdW5leHBlY3RlZC5cbiAgY29uc3QgaGFzQ3VzdG9tRG9tYWluID0gISFzcGVjaWZpZWRTY2FsZSAmJiBzcGVjaWZpZWRTY2FsZSAhPT0gJ3VuYWdncmVnYXRlZCc7XG4gIGlmIChoYXNDdXN0b21Eb21haW4pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiB0aGVyZSBpcyBubyBjdXN0b20gZG9tYWluLCByZXR1cm4gdHJ1ZSBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXG4gIC8vIDEpIHVzaW5nIHF1YW50aXRhdGl2ZSBmaWVsZCB3aXRoIHNpemVcbiAgLy8gV2hpbGUgdGhpcyBjYW4gYmUgZWl0aGVyIHJhdGlvIG9yIGludGVydmFsIGZpZWxkcywgb3VyIGFzc3VtcHRpb24gaXMgdGhhdFxuICAvLyByYXRpbyBhcmUgbW9yZSBjb21tb24uXG4gIGlmIChjaGFubmVsID09PSAnc2l6ZScgJiYgZmllbGREZWYudHlwZSA9PT0gJ3F1YW50aXRhdGl2ZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIDIpIG5vbi1iaW5uZWQsIHF1YW50aXRhdGl2ZSB4LXNjYWxlIG9yIHktc2NhbGVcbiAgLy8gKEZvciBiaW5uaW5nLCB3ZSBzaG91bGQgbm90IGluY2x1ZGUgemVybyBieSBkZWZhdWx0IGJlY2F1c2UgYmlubmluZyBhcmUgY2FsY3VsYXRlZCB3aXRob3V0IHplcm8uKVxuICBpZiAoIWZpZWxkRGVmLmJpbiAmJiB1dGlsLmNvbnRhaW5zKFtYLCBZXSwgY2hhbm5lbCkpIHtcbiAgICBjb25zdCB7b3JpZW50LCB0eXBlfSA9IG1hcmtEZWY7XG4gICAgaWYgKGNvbnRhaW5zKFsnYmFyJywgJ2FyZWEnLCAnbGluZScsICd0cmFpbCddLCB0eXBlKSkge1xuICAgICAgaWYgKFxuICAgICAgICAob3JpZW50ID09PSAnaG9yaXpvbnRhbCcgJiYgY2hhbm5lbCA9PT0gJ3knKSB8fFxuICAgICAgICAob3JpZW50ID09PSAndmVydGljYWwnICYmIGNoYW5uZWwgPT09ICd4JylcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19","import { isColorChannel, isScaleChannel, rangeType } from '../../channel';\nimport * as log from '../../log';\nimport { channelSupportScaleType, scaleTypeSupportDataType } from '../../scale';\nimport * as util from '../../util';\n/**\n * Determine if there is a specified scale type and if it is appropriate,\n * or determine default type if type is unspecified or inappropriate.\n */\n// NOTE: CompassQL uses this method.\nexport function scaleType(specifiedType, channel, fieldDef, mark, scaleConfig) {\n var defaultScaleType = defaultType(channel, fieldDef, mark, scaleConfig);\n if (!isScaleChannel(channel)) {\n // There is no scale for these channels\n return null;\n }\n if (specifiedType !== undefined) {\n // Check if explicitly specified scale type is supported by the channel\n if (!channelSupportScaleType(channel, specifiedType)) {\n log.warn(log.message.scaleTypeNotWorkWithChannel(channel, specifiedType, defaultScaleType));\n return defaultScaleType;\n }\n // Check if explicitly specified scale type is supported by the data type\n if (!scaleTypeSupportDataType(specifiedType, fieldDef.type, fieldDef.bin)) {\n log.warn(log.message.scaleTypeNotWorkWithFieldDef(specifiedType, defaultScaleType));\n return defaultScaleType;\n }\n return specifiedType;\n }\n return defaultScaleType;\n}\n/**\n * Determine appropriate default scale type.\n */\n// NOTE: Voyager uses this method.\nfunction defaultType(channel, fieldDef, mark, scaleConfig) {\n switch (fieldDef.type) {\n case 'nominal':\n case 'ordinal':\n if (isColorChannel(channel) || rangeType(channel) === 'discrete') {\n if (channel === 'shape' && fieldDef.type === 'ordinal') {\n log.warn(log.message.discreteChannelCannotEncode(channel, 'ordinal'));\n }\n return 'ordinal';\n }\n if (util.contains(['x', 'y'], channel)) {\n if (util.contains(['rect', 'bar', 'rule'], mark)) {\n // The rect/bar mark should fit into a band.\n // For rule, using band scale to make rule align with axis ticks better https://github.com/vega/vega-lite/issues/3429\n return 'band';\n }\n if (mark === 'bar') {\n return 'band';\n }\n }\n // Otherwise, use ordinal point scale so we can easily get center positions of the marks.\n return 'point';\n case 'temporal':\n if (isColorChannel(channel)) {\n return 'sequential';\n }\n else if (rangeType(channel) === 'discrete') {\n log.warn(log.message.discreteChannelCannotEncode(channel, 'temporal'));\n // TODO: consider using quantize (equivalent to binning) once we have it\n return 'ordinal';\n }\n return 'time';\n case 'quantitative':\n if (isColorChannel(channel)) {\n if (fieldDef.bin) {\n return 'bin-ordinal';\n }\n // Use `sequential` as the default color scale for continuous data\n // since it supports both array range and scheme range.\n return 'sequential';\n }\n else if (rangeType(channel) === 'discrete') {\n log.warn(log.message.discreteChannelCannotEncode(channel, 'quantitative'));\n // TODO: consider using quantize (equivalent to binning) once we have it\n return 'ordinal';\n }\n // x and y use a linear scale because selections don't work with bin scales.\n // Binned scales apply discretization but pan/zoom apply transformations to a [min, max] extent domain.\n if (fieldDef.bin && channel !== 'x' && channel !== 'y') {\n return 'bin-linear';\n }\n return 'linear';\n case 'latitude':\n case 'longitude':\n case 'geojson':\n return undefined;\n }\n /* istanbul ignore next: should never reach this */\n throw new Error(log.message.invalidFieldType(fieldDef.type));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NjYWxlL3R5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFVLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpGLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBQyx1QkFBdUIsRUFBMEIsd0JBQXdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEcsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFJbkM7OztHQUdHO0FBQ0gsb0NBQW9DO0FBQ3BDLE1BQU0sb0JBQ0osYUFBd0IsRUFBRSxPQUFnQixFQUFFLFFBQTBCLEVBQ3RFLElBQVUsRUFBRSxXQUF3QjtJQUdwQyxJQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUUzRSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzVCLHVDQUF1QztRQUN2QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBQ0QsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFO1FBQy9CLHVFQUF1RTtRQUN2RSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQ3BELEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUM1RixPQUFPLGdCQUFnQixDQUFDO1NBQ3pCO1FBRUQseUVBQXlFO1FBQ3pFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekUsR0FBRyxDQUFDLElBQUks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LENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5uZWwsIGlzQ29sb3JDaGFubmVsLCBpc1NjYWxlQ2hhbm5lbCwgcmFuZ2VUeXBlfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7RmllbGREZWZ9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtNYXJrfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7Y2hhbm5lbFN1cHBvcnRTY2FsZVR5cGUsIFNjYWxlQ29uZmlnLCBTY2FsZVR5cGUsIHNjYWxlVHlwZVN1cHBvcnREYXRhVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuZXhwb3J0IHR5cGUgUmFuZ2VUeXBlID0gJ2NvbnRpbnVvdXMnIHwgJ2Rpc2NyZXRlJyB8ICdmbGV4aWJsZScgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIHNjYWxlIHR5cGUgYW5kIGlmIGl0IGlzIGFwcHJvcHJpYXRlLFxuICogb3IgZGV0ZXJtaW5lIGRlZmF1bHQgdHlwZSBpZiB0eXBlIGlzIHVuc3BlY2lmaWVkIG9yIGluYXBwcm9wcmlhdGUuXG4gKi9cbi8vIE5PVEU6IENvbXBhc3NRTCB1c2VzIHRoaXMgbWV0aG9kLlxuZXhwb3J0IGZ1bmN0aW9uIHNjYWxlVHlwZShcbiAgc3BlY2lmaWVkVHlwZTogU2NhbGVUeXBlLCBjaGFubmVsOiBDaGFubmVsLCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPixcbiAgbWFyazogTWFyaywgc2NhbGVDb25maWc6IFNjYWxlQ29uZmlnXG4pOiBTY2FsZVR5cGUge1xuXG4gIGNvbnN0IGRlZmF1bHRTY2FsZVR5cGUgPSBkZWZhdWx0VHlwZShjaGFubmVsLCBmaWVsZERlZiwgbWFyaywgc2NhbGVDb25maWcpO1xuXG4gIGlmICghaXNTY2FsZUNoYW5uZWwoY2hhbm5lbCkpIHtcbiAgICAvLyBUaGVyZSBpcyBubyBzY2FsZSBmb3IgdGhlc2UgY2hhbm5lbHNcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoc3BlY2lmaWVkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gQ2hlY2sgaWYgZXhwbGljaXRseSBzcGVjaWZpZWQgc2NhbGUgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoYW5uZWxcbiAgICBpZiAoIWNoYW5uZWxTdXBwb3J0U2NhbGVUeXBlKGNoYW5uZWwsIHNwZWNpZmllZFR5cGUpKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5zY2FsZVR5cGVOb3RXb3JrV2l0aENoYW5uZWwoY2hhbm5lbCwgc3BlY2lmaWVkVHlwZSwgZGVmYXVsdFNjYWxlVHlwZSkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRTY2FsZVR5cGU7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgZXhwbGljaXRseSBzcGVjaWZpZWQgc2NhbGUgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGRhdGEgdHlwZVxuICAgIGlmICghc2NhbGVUeXBlU3VwcG9ydERhdGFUeXBlKHNwZWNpZmllZFR5cGUsIGZpZWxkRGVmLnR5cGUsIGZpZWxkRGVmLmJpbikpIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLnNjYWxlVHlwZU5vdFdvcmtXaXRoRmllbGREZWYoc3BlY2lmaWVkVHlwZSwgZGVmYXVsdFNjYWxlVHlwZSkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRTY2FsZVR5cGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwZWNpZmllZFR5cGU7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFNjYWxlVHlwZTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgZGVmYXVsdCBzY2FsZSB0eXBlLlxuICovXG4vLyBOT1RFOiBWb3lhZ2VyIHVzZXMgdGhpcyBtZXRob2QuXG5mdW5jdGlvbiBkZWZhdWx0VHlwZShcbiAgY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIG1hcms6IE1hcmssIHNjYWxlQ29uZmlnOiBTY2FsZUNvbmZpZ1xuKTogU2NhbGVUeXBlIHtcbiAgc3dpdGNoIChmaWVsZERlZi50eXBlKSB7XG4gICAgY2FzZSAnbm9taW5hbCc6XG4gICAgY2FzZSAnb3JkaW5hbCc6XG4gICAgICBpZiAoaXNDb2xvckNoYW5uZWwoY2hhbm5lbCl8fCByYW5nZVR5cGUoY2hhbm5lbCkgPT09ICdkaXNjcmV0ZScpIHtcbiAgICAgICAgaWYgKGNoYW5uZWwgPT09ICdzaGFwZScgJiYgZmllbGREZWYudHlwZSA9PT0gJ29yZGluYWwnKSB7XG4gICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuZGlzY3JldGVDaGFubmVsQ2Fubm90RW5jb2RlKGNoYW5uZWwsICdvcmRpbmFsJykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnb3JkaW5hbCc7XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlsLmNvbnRhaW5zKFsneCcsICd5J10sIGNoYW5uZWwpKSB7XG4gICAgICAgIGlmICh1dGlsLmNvbnRhaW5zKFsncmVjdCcsICdiYXInLCAncnVsZSddLCBtYXJrKSkge1xuICAgICAgICAgIC8vIFRoZSByZWN0L2JhciBtYXJrIHNob3VsZCBmaXQgaW50byBhIGJhbmQuXG4gICAgICAgICAgLy8gRm9yIHJ1bGUsIHVzaW5nIGJhbmQgc2NhbGUgdG8gbWFrZSBydWxlIGFsaWduIHdpdGggYXhpcyB0aWNrcyBiZXR0ZXIgaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8zNDI5XG4gICAgICAgICAgcmV0dXJuICdiYW5kJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobWFyayA9PT0gJ2JhcicpIHtcbiAgICAgICAgICByZXR1cm4gJ2JhbmQnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIHVzZSBvcmRpbmFsIHBvaW50IHNjYWxlIHNvIHdlIGNhbiBlYXNpbHkgZ2V0IGNlbnRlciBwb3NpdGlvbnMgb2YgdGhlIG1hcmtzLlxuICAgICAgcmV0dXJuICdwb2ludCc7XG5cbiAgICBjYXNlICd0ZW1wb3JhbCc6XG4gICAgICBpZiAoaXNDb2xvckNoYW5uZWwoY2hhbm5lbCkpIHtcbiAgICAgICAgcmV0dXJuICdzZXF1ZW50aWFsJztcbiAgICAgIH0gZWxzZSBpZiAocmFuZ2VUeXBlKGNoYW5uZWwpID09PSAnZGlzY3JldGUnKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmRpc2NyZXRlQ2hhbm5lbENhbm5vdEVuY29kZShjaGFubmVsLCAndGVtcG9yYWwnKSk7XG4gICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHF1YW50aXplIChlcXVpdmFsZW50IHRvIGJpbm5pbmcpIG9uY2Ugd2UgaGF2ZSBpdFxuICAgICAgICByZXR1cm4gJ29yZGluYWwnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICd0aW1lJztcblxuICAgIGNhc2UgJ3F1YW50aXRhdGl2ZSc6XG4gICAgICBpZiAoaXNDb2xvckNoYW5uZWwoY2hhbm5lbCkpIHtcbiAgICAgICAgaWYgKGZpZWxkRGVmLmJpbikge1xuICAgICAgICAgIHJldHVybiAnYmluLW9yZGluYWwnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZSBgc2VxdWVudGlhbGAgYXMgdGhlIGRlZmF1bHQgY29sb3Igc2NhbGUgZm9yIGNvbnRpbnVvdXMgZGF0YVxuICAgICAgICAvLyBzaW5jZSBpdCBzdXBwb3J0cyBib3RoIGFycmF5IHJhbmdlIGFuZCBzY2hlbWUgcmFuZ2UuXG4gICAgICAgIHJldHVybiAnc2VxdWVudGlhbCc7XG4gICAgICB9IGVsc2UgaWYgKHJhbmdlVHlwZShjaGFubmVsKSA9PT0gJ2Rpc2NyZXRlJykge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5kaXNjcmV0ZUNoYW5uZWxDYW5ub3RFbmNvZGUoY2hhbm5lbCwgJ3F1YW50aXRhdGl2ZScpKTtcbiAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgcXVhbnRpemUgKGVxdWl2YWxlbnQgdG8gYmlubmluZykgb25jZSB3ZSBoYXZlIGl0XG4gICAgICAgIHJldHVybiAnb3JkaW5hbCc7XG4gICAgICB9XG5cbiAgICAgIC8vIHggYW5kIHkgdXNlIGEgbGluZWFyIHNjYWxlIGJlY2F1c2Ugc2VsZWN0aW9ucyBkb24ndCB3b3JrIHdpdGggYmluIHNjYWxlcy5cbiAgICAgIC8vIEJpbm5lZCBzY2FsZXMgYXBwbHkgZGlzY3JldGl6YXRpb24gYnV0IHBhbi96b29tIGFwcGx5IHRyYW5zZm9ybWF0aW9ucyB0byBhIFttaW4sIG1heF0gZXh0ZW50IGRvbWFpbi5cbiAgICAgIGlmIChmaWVsZERlZi5iaW4gJiYgY2hhbm5lbCAhPT0gJ3gnICYmIGNoYW5uZWwgIT09ICd5Jykge1xuICAgICAgICByZXR1cm4gJ2Jpbi1saW5lYXInO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdsaW5lYXInO1xuXG4gICAgY2FzZSAnbGF0aXR1ZGUnOlxuICAgIGNhc2UgJ2xvbmdpdHVkZSc6XG4gICAgY2FzZSAnZ2VvanNvbic6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IHNob3VsZCBuZXZlciByZWFjaCB0aGlzICovXG4gIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5pbnZhbGlkRmllbGRUeXBlKGZpZWxkRGVmLnR5cGUpKTtcbn1cbiJdfQ==","import { SCALE_CHANNELS, SHAPE, X, Y } from '../../channel';\nimport { getFieldDef, hasConditionalFieldDef, isFieldDef } from '../../fielddef';\nimport { GEOSHAPE } from '../../mark';\nimport { NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES, scaleCompatible, scaleTypePrecedence, } from '../../scale';\nimport { GEOJSON } from '../../type';\nimport { keys } from '../../util';\nimport { isUnitModel } from '../model';\nimport { defaultScaleResolve } from '../resolve';\nimport { mergeValuesWithExplicit, tieBreakByComparing } from '../split';\nimport { ScaleComponent } from './component';\nimport { parseScaleDomain } from './domain';\nimport { parseScaleProperty } from './properties';\nimport { parseScaleRange } from './range';\nimport { scaleType } from './type';\nexport function parseScale(model) {\n parseScaleCore(model);\n parseScaleDomain(model);\n for (var _i = 0, NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1 = NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES; _i < NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1.length; _i++) {\n var prop = NON_TYPE_DOMAIN_RANGE_VEGA_SCALE_PROPERTIES_1[_i];\n parseScaleProperty(model, prop);\n }\n // range depends on zero\n parseScaleRange(model);\n}\nexport function parseScaleCore(model) {\n if (isUnitModel(model)) {\n model.component.scales = parseUnitScaleCore(model);\n }\n else {\n model.component.scales = parseNonUnitScaleCore(model);\n }\n}\n/**\n * Parse scales for all channels of a model.\n */\nfunction parseUnitScaleCore(model) {\n var encoding = model.encoding, config = model.config, mark = model.mark;\n return SCALE_CHANNELS.reduce(function (scaleComponents, channel) {\n var fieldDef;\n var specifiedScale = undefined;\n var channelDef = encoding[channel];\n // Don't generate scale for shape of geoshape\n if (isFieldDef(channelDef) && mark === GEOSHAPE &&\n channel === SHAPE && channelDef.type === GEOJSON) {\n return scaleComponents;\n }\n if (isFieldDef(channelDef)) {\n fieldDef = channelDef;\n specifiedScale = channelDef.scale;\n }\n else if (hasConditionalFieldDef(channelDef)) {\n fieldDef = channelDef.condition;\n specifiedScale = channelDef.condition['scale']; // We use ['scale'] since we know that channel here has scale for sure\n }\n else if (channel === X) {\n fieldDef = getFieldDef(encoding.x2);\n }\n else if (channel === Y) {\n fieldDef = getFieldDef(encoding.y2);\n }\n if (fieldDef && specifiedScale !== null && specifiedScale !== false) {\n specifiedScale = specifiedScale || {};\n var specifiedScaleType = specifiedScale.type;\n var sType = scaleType(specifiedScale.type, channel, fieldDef, mark, config.scale);\n scaleComponents[channel] = new ScaleComponent(model.scaleName(channel + '', true), { value: sType, explicit: specifiedScaleType === sType });\n }\n return scaleComponents;\n }, {});\n}\nvar scaleTypeTieBreaker = tieBreakByComparing(function (st1, st2) { return (scaleTypePrecedence(st1) - scaleTypePrecedence(st2)); });\nfunction parseNonUnitScaleCore(model) {\n var scaleComponents = model.component.scales = {};\n var scaleTypeWithExplicitIndex = {};\n var resolve = model.component.resolve;\n var _loop_1 = function (child) {\n parseScaleCore(child);\n // Instead of always merging right away -- check if it is compatible to merge first!\n keys(child.component.scales).forEach(function (channel) {\n // if resolve is undefined, set default first\n resolve.scale[channel] = resolve.scale[channel] || defaultScaleResolve(channel, model);\n if (resolve.scale[channel] === 'shared') {\n var explicitScaleType = scaleTypeWithExplicitIndex[channel];\n var childScaleType = child.component.scales[channel].getWithExplicit('type');\n if (explicitScaleType) {\n if (scaleCompatible(explicitScaleType.value, childScaleType.value)) {\n // merge scale component if type are compatible\n scaleTypeWithExplicitIndex[channel] = mergeValuesWithExplicit(explicitScaleType, childScaleType, 'type', 'scale', scaleTypeTieBreaker);\n }\n else {\n // Otherwise, update conflicting channel to be independent\n resolve.scale[channel] = 'independent';\n // Remove from the index so they don't get merged\n delete scaleTypeWithExplicitIndex[channel];\n }\n }\n else {\n scaleTypeWithExplicitIndex[channel] = childScaleType;\n }\n }\n });\n };\n // Parse each child scale and determine if a particular channel can be merged.\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n _loop_1(child);\n }\n // Merge each channel listed in the index\n keys(scaleTypeWithExplicitIndex).forEach(function (channel) {\n // Create new merged scale component\n var name = model.scaleName(channel, true);\n var typeWithExplicit = scaleTypeWithExplicitIndex[channel];\n scaleComponents[channel] = new ScaleComponent(name, typeWithExplicit);\n // rename each child and mark them as merged\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n var childScale = child.component.scales[channel];\n if (childScale) {\n child.renameScale(childScale.get('name'), name);\n childScale.merged = true;\n }\n }\n });\n return scaleComponents;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zY2FsZS9wYXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsY0FBYyxFQUFnQixLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQVcsV0FBVyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUNMLDJDQUEyQyxFQUUzQyxlQUFlLEVBRWYsbUJBQW1CLEdBQ3BCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVoQyxPQUFPLEVBQUMsV0FBVyxFQUFRLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBQVcsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEYsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxhQUFhLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFakMsTUFBTSxxQkFBcUIsS0FBWTtJQUNyQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsS0FBbUIsVUFB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QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTQ0FMRV9DSEFOTkVMUywgU2NhbGVDaGFubmVsLCBTSEFQRSwgWCwgWX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCBnZXRGaWVsZERlZiwgaGFzQ29uZGl0aW9uYWxGaWVsZERlZiwgaXNGaWVsZERlZn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtHRU9TSEFQRX0gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge1xuICBOT05fVFlQRV9ET01BSU5fUkFOR0VfVkVHQV9TQ0FMRV9QUk9QRVJUSUVTLFxuICBTY2FsZSxcbiAgc2NhbGVDb21wYXRpYmxlLFxuICBTY2FsZVR5cGUsXG4gIHNjYWxlVHlwZVByZWNlZGVuY2UsXG59IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7R0VPSlNPTn0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ1NjYWxlfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge2lzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtkZWZhdWx0U2NhbGVSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7RXhwbGljaXQsIG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0LCB0aWVCcmVha0J5Q29tcGFyaW5nfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge1NjYWxlQ29tcG9uZW50LCBTY2FsZUNvbXBvbmVudEluZGV4fSBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQge3BhcnNlU2NhbGVEb21haW59IGZyb20gJy4vZG9tYWluJztcbmltcG9ydCB7cGFyc2VTY2FsZVByb3BlcnR5fSBmcm9tICcuL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHtwYXJzZVNjYWxlUmFuZ2V9IGZyb20gJy4vcmFuZ2UnO1xuaW1wb3J0IHtzY2FsZVR5cGV9IGZyb20gJy4vdHlwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYWxlKG1vZGVsOiBNb2RlbCkge1xuICBwYXJzZVNjYWxlQ29yZShtb2RlbCk7XG4gIHBhcnNlU2NhbGVEb21haW4obW9kZWwpO1xuICBmb3IgKGNvbnN0IHByb3Agb2YgTk9OX1RZUEVfRE9NQUlOX1JBTkdFX1ZFR0FfU0NBTEVfUFJPUEVSVElFUykge1xuICAgIHBhcnNlU2NhbGVQcm9wZXJ0eShtb2RlbCwgcHJvcCk7XG4gIH1cbiAgLy8gcmFuZ2UgZGVwZW5kcyBvbiB6ZXJvXG4gIHBhcnNlU2NhbGVSYW5nZShtb2RlbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNjYWxlQ29yZShtb2RlbDogTW9kZWwpIHtcbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSkge1xuICAgIG1vZGVsLmNvbXBvbmVudC5zY2FsZXMgPSBwYXJzZVVuaXRTY2FsZUNvcmUobW9kZWwpO1xuICB9IGVsc2Uge1xuICAgIG1vZGVsLmNvbXBvbmVudC5zY2FsZXMgPSBwYXJzZU5vblVuaXRTY2FsZUNvcmUobW9kZWwpO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2Ugc2NhbGVzIGZvciBhbGwgY2hhbm5lbHMgb2YgYSBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VVbml0U2NhbGVDb3JlKG1vZGVsOiBVbml0TW9kZWwpOiBTY2FsZUNvbXBvbmVudEluZGV4IHtcbiAgY29uc3Qge2VuY29kaW5nLCBjb25maWcsIG1hcmt9ID0gbW9kZWw7XG5cbiAgcmV0dXJuIFNDQUxFX0NIQU5ORUxTLnJlZHVjZSgoc2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4LCBjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICBsZXQgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz47XG4gICAgbGV0IHNwZWNpZmllZFNjYWxlOiBTY2FsZSB8IG51bGwgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG5cbiAgICAvLyBEb24ndCBnZW5lcmF0ZSBzY2FsZSBmb3Igc2hhcGUgb2YgZ2Vvc2hhcGVcbiAgICBpZiAoXG4gICAgICBpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpICYmIG1hcmsgPT09IEdFT1NIQVBFICYmXG4gICAgICBjaGFubmVsID09PSBTSEFQRSAmJiBjaGFubmVsRGVmLnR5cGUgPT09IEdFT0pTT05cbiAgICApIHtcbiAgICAgIHJldHVybiBzY2FsZUNvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGZpZWxkRGVmID0gY2hhbm5lbERlZjtcbiAgICAgIHNwZWNpZmllZFNjYWxlID0gY2hhbm5lbERlZi5zY2FsZTtcbiAgICB9IGVsc2UgaWYgKGhhc0NvbmRpdGlvbmFsRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGZpZWxkRGVmID0gY2hhbm5lbERlZi5jb25kaXRpb247XG4gICAgICBzcGVjaWZpZWRTY2FsZSA9IGNoYW5uZWxEZWYuY29uZGl0aW9uWydzY2FsZSddOyAvLyBXZSB1c2UgWydzY2FsZSddIHNpbmNlIHdlIGtub3cgdGhhdCBjaGFubmVsIGhlcmUgaGFzIHNjYWxlIGZvciBzdXJlXG4gICAgfSBlbHNlIGlmIChjaGFubmVsID09PSBYKSB7XG4gICAgICBmaWVsZERlZiA9IGdldEZpZWxkRGVmKGVuY29kaW5nLngyKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWwgPT09IFkpIHtcbiAgICAgIGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmcueTIpO1xuICAgIH1cblxuICAgIGlmIChmaWVsZERlZiAmJiBzcGVjaWZpZWRTY2FsZSAhPT0gbnVsbCAmJiBzcGVjaWZpZWRTY2FsZSAhPT0gZmFsc2UpIHtcbiAgICAgIHNwZWNpZmllZFNjYWxlID0gc3BlY2lmaWVkU2NhbGUgfHwge307XG4gICAgICBjb25zdCBzcGVjaWZpZWRTY2FsZVR5cGUgPSBzcGVjaWZpZWRTY2FsZS50eXBlO1xuICAgICAgY29uc3Qgc1R5cGUgPSBzY2FsZVR5cGUoc3BlY2lmaWVkU2NhbGUudHlwZSwgY2hhbm5lbCwgZmllbGREZWYsIG1hcmssIGNvbmZpZy5zY2FsZSk7XG4gICAgICBzY2FsZUNvbXBvbmVudHNbY2hhbm5lbF0gPSBuZXcgU2NhbGVDb21wb25lbnQoXG4gICAgICAgIG1vZGVsLnNjYWxlTmFtZShjaGFubmVsICsgJycsIHRydWUpLFxuICAgICAgICB7dmFsdWU6IHNUeXBlLCBleHBsaWNpdDogc3BlY2lmaWVkU2NhbGVUeXBlID09PSBzVHlwZX1cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzY2FsZUNvbXBvbmVudHM7XG4gIH0sIHt9KTtcbn1cblxuY29uc3Qgc2NhbGVUeXBlVGllQnJlYWtlciA9IHRpZUJyZWFrQnlDb21wYXJpbmcoXG4gIChzdDE6IFNjYWxlVHlwZSwgc3QyOiBTY2FsZVR5cGUpID0+IChzY2FsZVR5cGVQcmVjZWRlbmNlKHN0MSkgLSBzY2FsZVR5cGVQcmVjZWRlbmNlKHN0MikpXG4pO1xuXG5cbmZ1bmN0aW9uIHBhcnNlTm9uVW5pdFNjYWxlQ29yZShtb2RlbDogTW9kZWwpIHtcbiAgY29uc3Qgc2NhbGVDb21wb25lbnRzOiBTY2FsZUNvbXBvbmVudEluZGV4ID0gbW9kZWwuY29tcG9uZW50LnNjYWxlcyA9IHt9O1xuXG4gIGNvbnN0IHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4OiB7XG4gICAgLy8gVXNpbmcgTWFwcGVkIFR5cGUgdG8gZGVjbGFyZSB0eXBlIChodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9hZHZhbmNlZC10eXBlcy5odG1sI21hcHBlZC10eXBlcylcbiAgICBbayBpbiBTY2FsZUNoYW5uZWxdPzogRXhwbGljaXQ8U2NhbGVUeXBlPlxuICB9ID0ge307XG4gIGNvbnN0IHJlc29sdmUgPSBtb2RlbC5jb21wb25lbnQucmVzb2x2ZTtcblxuICAvLyBQYXJzZSBlYWNoIGNoaWxkIHNjYWxlIGFuZCBkZXRlcm1pbmUgaWYgYSBwYXJ0aWN1bGFyIGNoYW5uZWwgY2FuIGJlIG1lcmdlZC5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIHBhcnNlU2NhbGVDb3JlKGNoaWxkKTtcblxuICAgIC8vIEluc3RlYWQgb2YgYWx3YXlzIG1lcmdpbmcgcmlnaHQgYXdheSAtLSBjaGVjayBpZiBpdCBpcyBjb21wYXRpYmxlIHRvIG1lcmdlIGZpcnN0IVxuICAgIGtleXMoY2hpbGQuY29tcG9uZW50LnNjYWxlcykuZm9yRWFjaCgoY2hhbm5lbDogU2NhbGVDaGFubmVsKSA9PiB7XG4gICAgICAvLyBpZiByZXNvbHZlIGlzIHVuZGVmaW5lZCwgc2V0IGRlZmF1bHQgZmlyc3RcbiAgICAgIHJlc29sdmUuc2NhbGVbY2hhbm5lbF0gPSByZXNvbHZlLnNjYWxlW2NoYW5uZWxdIHx8IGRlZmF1bHRTY2FsZVJlc29sdmUoY2hhbm5lbCwgbW9kZWwpO1xuXG4gICAgICBpZiAocmVzb2x2ZS5zY2FsZVtjaGFubmVsXSA9PT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgY29uc3QgZXhwbGljaXRTY2FsZVR5cGUgPSBzY2FsZVR5cGVXaXRoRXhwbGljaXRJbmRleFtjaGFubmVsXTtcbiAgICAgICAgY29uc3QgY2hpbGRTY2FsZVR5cGUgPSBjaGlsZC5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdLmdldFdpdGhFeHBsaWNpdCgndHlwZScpO1xuXG4gICAgICAgIGlmIChleHBsaWNpdFNjYWxlVHlwZSkge1xuICAgICAgICAgIGlmIChzY2FsZUNvbXBhdGlibGUoZXhwbGljaXRTY2FsZVR5cGUudmFsdWUsIGNoaWxkU2NhbGVUeXBlLnZhbHVlKSkge1xuICAgICAgICAgICAgLy8gbWVyZ2Ugc2NhbGUgY29tcG9uZW50IGlmIHR5cGUgYXJlIGNvbXBhdGlibGVcbiAgICAgICAgICAgIHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4W2NoYW5uZWxdID0gbWVyZ2VWYWx1ZXNXaXRoRXhwbGljaXQ8VmdTY2FsZSwgU2NhbGVUeXBlPihcbiAgICAgICAgICAgICAgZXhwbGljaXRTY2FsZVR5cGUsIGNoaWxkU2NhbGVUeXBlLCAndHlwZScsICdzY2FsZScsIHNjYWxlVHlwZVRpZUJyZWFrZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdXBkYXRlIGNvbmZsaWN0aW5nIGNoYW5uZWwgdG8gYmUgaW5kZXBlbmRlbnRcbiAgICAgICAgICAgIHJlc29sdmUuc2NhbGVbY2hhbm5lbF0gPSAnaW5kZXBlbmRlbnQnO1xuICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gdGhlIGluZGV4IHNvIHRoZXkgZG9uJ3QgZ2V0IG1lcmdlZFxuICAgICAgICAgICAgZGVsZXRlIHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4W2NoYW5uZWxdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzY2FsZVR5cGVXaXRoRXhwbGljaXRJbmRleFtjaGFubmVsXSA9IGNoaWxkU2NhbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBNZXJnZSBlYWNoIGNoYW5uZWwgbGlzdGVkIGluIHRoZSBpbmRleFxuICBrZXlzKHNjYWxlVHlwZVdpdGhFeHBsaWNpdEluZGV4KS5mb3JFYWNoKChjaGFubmVsOiBTY2FsZUNoYW5uZWwpID0+IHtcbiAgICAvLyBDcmVhdGUgbmV3IG1lcmdlZCBzY2FsZSBjb21wb25lbnRcbiAgICBjb25zdCBuYW1lID0gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwsIHRydWUpO1xuICAgIGNvbnN0IHR5cGVXaXRoRXhwbGljaXQgPSBzY2FsZVR5cGVXaXRoRXhwbGljaXRJbmRleFtjaGFubmVsXTtcbiAgICBzY2FsZUNvbXBvbmVudHNbY2hhbm5lbF0gPSBuZXcgU2NhbGVDb21wb25lbnQobmFtZSwgdHlwZVdpdGhFeHBsaWNpdCk7XG5cbiAgICAvLyByZW5hbWUgZWFjaCBjaGlsZCBhbmQgbWFyayB0aGVtIGFzIG1lcmdlZFxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkU2NhbGUgPSBjaGlsZC5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdO1xuICAgICAgaWYgKGNoaWxkU2NhbGUpIHtcbiAgICAgICAgY2hpbGQucmVuYW1lU2NhbGUoY2hpbGRTY2FsZS5nZXQoJ25hbWUnKSwgbmFtZSk7XG4gICAgICAgIGNoaWxkU2NhbGUubWVyZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBzY2FsZUNvbXBvbmVudHM7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { isString } from 'vega-util';\nimport { isChannel, isScaleChannel } from '../channel';\nimport { forEach, reduce } from '../encoding';\nimport { getFieldDef, vgField } from '../fielddef';\nimport * as log from '../log';\nimport { hasDiscreteDomain } from '../scale';\nimport { isFacetSpec } from '../spec';\nimport { extractTitleConfig } from '../title';\nimport { normalizeTransform } from '../transform';\nimport { contains, keys, varName } from '../util';\nimport { isVgRangeStep } from '../vega.schema';\nimport { assembleAxes } from './axis/assemble';\nimport { getHeaderGroups, getTitleGroup, HEADER_CHANNELS } from './layout/header';\nimport { sizeExpr } from './layoutsize/assemble';\nimport { assembleLegends } from './legend/assemble';\nimport { parseLegend } from './legend/parse';\nimport { assembleProjections } from './projection/assemble';\nimport { parseProjection } from './projection/parse';\nimport { assembleScales } from './scale/assemble';\nimport { assembleDomain, getFieldFromDomain } from './scale/domain';\nimport { parseScale } from './scale/parse';\nimport { Split } from './split';\nvar NameMap = /** @class */ (function () {\n function NameMap() {\n this.nameMap = {};\n }\n NameMap.prototype.rename = function (oldName, newName) {\n this.nameMap[oldName] = newName;\n };\n NameMap.prototype.has = function (name) {\n return this.nameMap[name] !== undefined;\n };\n NameMap.prototype.get = function (name) {\n // If the name appears in the _nameMap, we need to read its new name.\n // We have to loop over the dict just in case the new name also gets renamed.\n while (this.nameMap[name] && name !== this.nameMap[name]) {\n name = this.nameMap[name];\n }\n return name;\n };\n return NameMap;\n}());\nexport { NameMap };\n/*\n We use type guards instead of `instanceof` as `instanceof` makes\n different parts of the compiler depend on the actual implementation of\n the model classes, which in turn depend on different parts of the compiler.\n Thus, `instanceof` leads to circular dependency problems.\n\n On the other hand, type guards only make different parts of the compiler\n depend on the type of the model classes, but not the actual implementation.\n*/\nexport function isUnitModel(model) {\n return model && model.type === 'unit';\n}\nexport function isFacetModel(model) {\n return model && model.type === 'facet';\n}\nexport function isRepeatModel(model) {\n return model && model.type === 'repeat';\n}\nexport function isConcatModel(model) {\n return model && model.type === 'concat';\n}\nexport function isLayerModel(model) {\n return model && model.type === 'layer';\n}\nvar Model = /** @class */ (function () {\n function Model(spec, parent, parentGivenName, config, repeater, resolve) {\n var _this = this;\n this.children = [];\n /**\n * Corrects the data references in marks after assemble.\n */\n this.correctDataNames = function (mark) {\n // TODO: make this correct\n // for normal data references\n if (mark.from && mark.from.data) {\n mark.from.data = _this.lookupDataSource(mark.from.data);\n }\n // for access to facet data\n if (mark.from && mark.from.facet && mark.from.facet.data) {\n mark.from.facet.data = _this.lookupDataSource(mark.from.facet.data);\n }\n return mark;\n };\n this.parent = parent;\n this.config = config;\n this.repeater = repeater;\n // If name is not provided, always use parent's givenName to avoid name conflicts.\n this.name = spec.name || parentGivenName;\n this.title = isString(spec.title) ? { text: spec.title } : spec.title;\n // Shared name maps\n this.scaleNameMap = parent ? parent.scaleNameMap : new NameMap();\n this.projectionNameMap = parent ? parent.projectionNameMap : new NameMap();\n this.layoutSizeNameMap = parent ? parent.layoutSizeNameMap : new NameMap();\n this.data = spec.data;\n this.description = spec.description;\n this.transforms = normalizeTransform(spec.transform || []);\n this.component = {\n data: {\n sources: parent ? parent.component.data.sources : {},\n outputNodes: parent ? parent.component.data.outputNodes : {},\n outputNodeRefCounts: parent ? parent.component.data.outputNodeRefCounts : {},\n // data is faceted if the spec is a facet spec or the parent has faceted data and no data is defined\n isFaceted: isFacetSpec(spec) || (parent && parent.component.data.isFaceted && !spec.data)\n },\n layoutSize: new Split(),\n layoutHeaders: { row: {}, column: {} },\n mark: null,\n resolve: tslib_1.__assign({ scale: {}, axis: {}, legend: {} }, (resolve || {})),\n selection: null,\n scales: null,\n projection: null,\n axes: {},\n legends: {},\n };\n }\n Object.defineProperty(Model.prototype, \"width\", {\n get: function () {\n return this.getSizeSignalRef('width');\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Model.prototype, \"height\", {\n get: function () {\n return this.getSizeSignalRef('height');\n },\n enumerable: true,\n configurable: true\n });\n Model.prototype.initSize = function (size) {\n var width = size.width, height = size.height;\n if (width) {\n this.component.layoutSize.set('width', width, true);\n }\n if (height) {\n this.component.layoutSize.set('height', height, true);\n }\n };\n Model.prototype.parse = function () {\n this.parseScale();\n this.parseLayoutSize(); // depends on scale\n this.renameTopLevelLayoutSize();\n this.parseSelection();\n this.parseProjection();\n this.parseData(); // (pathorder) depends on markDef; selection filters depend on parsed selections; depends on projection because some transforms require the finalized projection name.\n this.parseAxisAndHeader(); // depends on scale and layout size\n this.parseLegend(); // depends on scale, markDef\n this.parseMarkGroup(); // depends on data name, scale, layout size, axisGroup, and children's scale, axis, legend and mark.\n };\n Model.prototype.parseScale = function () {\n parseScale(this);\n };\n Model.prototype.parseProjection = function () {\n parseProjection(this);\n };\n /**\n * Rename top-level spec's size to be just width / height, ignoring model name.\n * This essentially merges the top-level spec's width/height signals with the width/height signals\n * to help us reduce redundant signals declaration.\n */\n Model.prototype.renameTopLevelLayoutSize = function () {\n if (this.getName('width') !== 'width') {\n this.renameLayoutSize(this.getName('width'), 'width');\n }\n if (this.getName('height') !== 'height') {\n this.renameLayoutSize(this.getName('height'), 'height');\n }\n };\n Model.prototype.parseLegend = function () {\n parseLegend(this);\n };\n Model.prototype.assembleGroupStyle = function () {\n if (this.type === 'unit' || this.type === 'layer') {\n return 'cell';\n }\n return undefined;\n };\n Model.prototype.assembleLayoutSize = function () {\n if (this.type === 'unit' || this.type === 'layer') {\n return {\n width: this.getSizeSignalRef('width'),\n height: this.getSizeSignalRef('height')\n };\n }\n return undefined;\n };\n Model.prototype.assembleHeaderMarks = function () {\n var layoutHeaders = this.component.layoutHeaders;\n var headerMarks = [];\n for (var _i = 0, HEADER_CHANNELS_1 = HEADER_CHANNELS; _i < HEADER_CHANNELS_1.length; _i++) {\n var channel = HEADER_CHANNELS_1[_i];\n if (layoutHeaders[channel].title) {\n headerMarks.push(getTitleGroup(this, channel));\n }\n }\n for (var _a = 0, HEADER_CHANNELS_2 = HEADER_CHANNELS; _a < HEADER_CHANNELS_2.length; _a++) {\n var channel = HEADER_CHANNELS_2[_a];\n headerMarks = headerMarks.concat(getHeaderGroups(this, channel));\n }\n return headerMarks;\n };\n Model.prototype.assembleAxes = function () {\n return assembleAxes(this.component.axes, this.config);\n };\n Model.prototype.assembleLegends = function () {\n return assembleLegends(this);\n };\n Model.prototype.assembleProjections = function () {\n return assembleProjections(this);\n };\n Model.prototype.assembleTitle = function () {\n var title = tslib_1.__assign({}, extractTitleConfig(this.config.title).nonMark, this.title);\n if (title.text) {\n if (!contains(['unit', 'layer'], this.type)) {\n // As described in https://github.com/vega/vega-lite/issues/2875:\n // Due to vega/vega#960 (comment), we only support title's anchor for unit and layered spec for now.\n if (title.anchor && title.anchor !== 'start') {\n log.warn(log.message.cannotSetTitleAnchor(this.type));\n }\n title.anchor = 'start';\n }\n return keys(title).length > 0 ? title : undefined;\n }\n return undefined;\n };\n /**\n * Assemble the mark group for this model. We accept optional `signals` so that we can include concat top-level signals with the top-level model's local signals.\n */\n Model.prototype.assembleGroup = function (signals) {\n if (signals === void 0) { signals = []; }\n var group = {};\n signals = signals.concat(this.assembleSelectionSignals());\n if (signals.length > 0) {\n group.signals = signals;\n }\n var layout = this.assembleLayout();\n if (layout) {\n group.layout = layout;\n }\n group.marks = [].concat(this.assembleHeaderMarks(), this.assembleMarks());\n // Only include scales if this spec is top-level or if parent is facet.\n // (Otherwise, it will be merged with upper-level's scope.)\n var scales = (!this.parent || isFacetModel(this.parent)) ? assembleScales(this) : [];\n if (scales.length > 0) {\n group.scales = scales;\n }\n var axes = this.assembleAxes();\n if (axes.length > 0) {\n group.axes = axes;\n }\n var legends = this.assembleLegends();\n if (legends.length > 0) {\n group.legends = legends;\n }\n return group;\n };\n Model.prototype.hasDescendantWithFieldOnChannel = function (channel) {\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n if (isUnitModel(child)) {\n if (child.channelHasField(channel)) {\n return true;\n }\n }\n else {\n if (child.hasDescendantWithFieldOnChannel(channel)) {\n return true;\n }\n }\n }\n return false;\n };\n Model.prototype.getName = function (text) {\n return varName((this.name ? this.name + '_' : '') + text);\n };\n /**\n * Request a data source name for the given data source type and mark that data source as required. This method should be called in parse, so that all used data source can be correctly instantiated in assembleData().\n */\n Model.prototype.requestDataName = function (name) {\n var fullName = this.getName(name);\n // Increase ref count. This is critical because otherwise we won't create a data source.\n // We also increase the ref counts on OutputNode.getSource() calls.\n var refCounts = this.component.data.outputNodeRefCounts;\n refCounts[fullName] = (refCounts[fullName] || 0) + 1;\n return fullName;\n };\n Model.prototype.getSizeSignalRef = function (sizeType) {\n if (isFacetModel(this.parent)) {\n var channel = sizeType === 'width' ? 'x' : 'y';\n var scaleComponent = this.component.scales[channel];\n if (scaleComponent && !scaleComponent.merged) { // independent scale\n var type = scaleComponent.get('type');\n var range = scaleComponent.get('range');\n if (hasDiscreteDomain(type) && isVgRangeStep(range)) {\n var scaleName = scaleComponent.get('name');\n var domain = assembleDomain(this, channel);\n var field = getFieldFromDomain(domain);\n if (field) {\n var fieldRef = vgField({ aggregate: 'distinct', field: field }, { expr: 'datum' });\n return {\n signal: sizeExpr(scaleName, scaleComponent, fieldRef)\n };\n }\n else {\n log.warn('Unknown field for ${channel}. Cannot calculate view size.');\n return null;\n }\n }\n }\n }\n return {\n signal: this.layoutSizeNameMap.get(this.getName(sizeType))\n };\n };\n /**\n * Lookup the name of the datasource for an output node. You probably want to call this in assemble.\n */\n Model.prototype.lookupDataSource = function (name) {\n var node = this.component.data.outputNodes[name];\n if (!node) {\n // Name not found in map so let's just return what we got.\n // This can happen if we already have the correct name.\n return name;\n }\n return node.getSource();\n };\n Model.prototype.getSizeName = function (oldSizeName) {\n return this.layoutSizeNameMap.get(oldSizeName);\n };\n Model.prototype.renameLayoutSize = function (oldName, newName) {\n this.layoutSizeNameMap.rename(oldName, newName);\n };\n Model.prototype.renameScale = function (oldName, newName) {\n this.scaleNameMap.rename(oldName, newName);\n };\n Model.prototype.renameProjection = function (oldName, newName) {\n this.projectionNameMap.rename(oldName, newName);\n };\n /**\n * @return scale name for a given channel after the scale has been parsed and named.\n */\n Model.prototype.scaleName = function (originalScaleName, parse) {\n if (parse) {\n // During the parse phase always return a value\n // No need to refer to rename map because a scale can't be renamed\n // before it has the original name.\n return this.getName(originalScaleName);\n }\n // If there is a scale for the channel, it should either\n // be in the scale component or exist in the name map\n if (\n // If there is a scale for the channel, there should be a local scale component for it\n (isChannel(originalScaleName) && isScaleChannel(originalScaleName) && this.component.scales[originalScaleName]) ||\n // in the scale name map (the scale get merged by its parent)\n this.scaleNameMap.has(this.getName(originalScaleName))) {\n return this.scaleNameMap.get(this.getName(originalScaleName));\n }\n return undefined;\n };\n /**\n * @return projection name after the projection has been parsed and named.\n */\n Model.prototype.projectionName = function (parse) {\n if (parse) {\n // During the parse phase always return a value\n // No need to refer to rename map because a projection can't be renamed\n // before it has the original name.\n return this.getName('projection');\n }\n if ((this.component.projection && !this.component.projection.merged) || this.projectionNameMap.has(this.getName('projection'))) {\n return this.projectionNameMap.get(this.getName('projection'));\n }\n return undefined;\n };\n /**\n * Traverse a model's hierarchy to get the scale component for a particular channel.\n */\n Model.prototype.getScaleComponent = function (channel) {\n /* istanbul ignore next: This is warning for debugging test */\n if (!this.component.scales) {\n throw new Error('getScaleComponent cannot be called before parseScale(). Make sure you have called parseScale or use parseUnitModelWithScale().');\n }\n var localScaleComponent = this.component.scales[channel];\n if (localScaleComponent && !localScaleComponent.merged) {\n return localScaleComponent;\n }\n return (this.parent ? this.parent.getScaleComponent(channel) : undefined);\n };\n /**\n * Traverse a model's hierarchy to get a particular selection component.\n */\n Model.prototype.getSelectionComponent = function (variableName, origName) {\n var sel = this.component.selection[variableName];\n if (!sel && this.parent) {\n sel = this.parent.getSelectionComponent(variableName, origName);\n }\n if (!sel) {\n throw new Error(log.message.selectionNotFound(origName));\n }\n return sel;\n };\n return Model;\n}());\nexport { Model };\n/** Abstract class for UnitModel and FacetModel. Both of which can contain fieldDefs as a part of its own specification. */\nvar ModelWithField = /** @class */ (function (_super) {\n tslib_1.__extends(ModelWithField, _super);\n function ModelWithField() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /** Get \"field\" reference for vega */\n ModelWithField.prototype.vgField = function (channel, opt) {\n if (opt === void 0) { opt = {}; }\n var fieldDef = this.fieldDef(channel);\n if (!fieldDef) {\n return undefined;\n }\n return vgField(fieldDef, opt);\n };\n ModelWithField.prototype.reduceFieldDef = function (f, init, t) {\n return reduce(this.getMapping(), function (acc, cd, c) {\n var fieldDef = getFieldDef(cd);\n if (fieldDef) {\n return f(acc, fieldDef, c);\n }\n return acc;\n }, init, t);\n };\n ModelWithField.prototype.forEachFieldDef = function (f, t) {\n forEach(this.getMapping(), function (cd, c) {\n var fieldDef = getFieldDef(cd);\n if (fieldDef) {\n f(fieldDef, c);\n }\n }, t);\n };\n return ModelWithField;\n}(Model));\nexport { ModelWithField };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQVUsU0FBUyxFQUFFLGNBQWMsRUFBaUMsTUFBTSxZQUFZLENBQUM7QUFHOUYsT0FBTyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUF1QyxXQUFXLEVBQUUsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3ZGLE9BQU8sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMzQyxPQUFPLEVBQVcsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxrQkFBa0IsRUFBYyxNQUFNLFVBQVUsQ0FBQztBQUN6RCxPQUFPLEVBQUMsa0JBQWtCLEVBQVksTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBUSxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ3RELE9BQU8sRUFBQyxhQUFhLEVBQStHLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0osT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBTTdDLE9BQU8sRUFBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBd0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx1QkFBdUIsQ0FB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Q0FBQyxBQW5DRCxDQUE2QyxLQUFLLEdBbUNqRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0NoYW5uZWwsIGlzQ2hhbm5lbCwgaXNTY2FsZUNoYW5uZWwsIFNjYWxlQ2hhbm5lbCwgU2luZ2xlRGVmQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7RGF0YSwgRGF0YVNvdXJjZVR5cGV9IGZyb20gJy4uL2RhdGEnO1xuaW1wb3J0IHtmb3JFYWNoLCByZWR1Y2V9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7Q2hhbm5lbERlZiwgRmllbGREZWYsIEZpZWxkUmVmT3B0aW9uLCBnZXRGaWVsZERlZiwgdmdGaWVsZH0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge1Jlc29sdmV9IGZyb20gJy4uL3Jlc29sdmUnO1xuaW1wb3J0IHtoYXNEaXNjcmV0ZURvbWFpbn0gZnJvbSAnLi4vc2NhbGUnO1xuaW1wb3J0IHtCYXNlU3BlYywgaXNGYWNldFNwZWN9IGZyb20gJy4uL3NwZWMnO1xuaW1wb3J0IHtleHRyYWN0VGl0bGVDb25maWcsIFRpdGxlUGFyYW1zfSBmcm9tICcuLi90aXRsZSc7XG5pbXBvcnQge25vcm1hbGl6ZVRyYW5zZm9ybSwgVHJhbnNmb3JtfSBmcm9tICcuLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtjb250YWlucywgRGljdCwga2V5cywgdmFyTmFtZX0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFZnQXhpcywgVmdEYXRhLCBWZ0VuY29kZUVudHJ5LCBWZ0xheW91dCwgVmdMZWdlbmQsIFZnTWFya0dyb3VwLCBWZ1Byb2plY3Rpb24sIFZnU2lnbmFsLCBWZ1NpZ25hbFJlZiwgVmdUaXRsZX0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHthc3NlbWJsZUF4ZXN9IGZyb20gJy4vYXhpcy9hc3NlbWJsZSc7XG5pbXBvcnQge0F4aXNDb21wb25lbnRJbmRleH0gZnJvbSAnLi9heGlzL2NvbXBvbmVudCc7XG5pbXBvcnQge0NvbmNhdE1vZGVsfSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQge0RhdGFDb21wb25lbnR9IGZyb20gJy4vZGF0YSc7XG5pbXBvcnQge0ZhY2V0TW9kZWx9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtMYXllck1vZGVsfSBmcm9tICcuL2xheWVyJztcbmltcG9ydCB7Z2V0SGVhZGVyR3JvdXBzLCBnZXRUaXRsZUdyb3VwLCBIRUFERVJfQ0hBTk5FTFMsIExheW91dEhlYWRlckNvbXBvbmVudH0gZnJvbSAnLi9sYXlvdXQvaGVhZGVyJztcbmltcG9ydCB7c2l6ZUV4cHJ9IGZyb20gJy4vbGF5b3V0c2l6ZS9hc3NlbWJsZSc7XG5pbXBvcnQge0xheW91dFNpemVDb21wb25lbnQsIExheW91dFNpemVJbmRleH0gZnJvbSAnLi9sYXlvdXRzaXplL2NvbXBvbmVudCc7XG5pbXBvcnQge2Fzc2VtYmxlTGVnZW5kc30gZnJvbSAnLi9sZWdlbmQvYXNzZW1ibGUnO1xuaW1wb3J0IHtMZWdlbmRDb21wb25lbnRJbmRleH0gZnJvbSAnLi9sZWdlbmQvY29tcG9uZW50JztcbmltcG9ydCB7cGFyc2VMZWdlbmR9IGZyb20gJy4vbGVnZW5kL3BhcnNlJztcbmltcG9ydCB7YXNzZW1ibGVQcm9qZWN0aW9uc30gZnJvbSAnLi9wcm9qZWN0aW9uL2Fzc2VtYmxlJztcbmltcG9ydCB7UHJvamVjdGlvbkNvbXBvbmVudH0gZnJvbSAnLi9wcm9qZWN0aW9uL2NvbXBvbmVudCc7XG5pbXBvcnQge3BhcnNlUHJvamVjdGlvbn0gZnJvbSAnLi9wcm9qZWN0aW9uL3BhcnNlJztcbmltcG9ydCB7UmVwZWF0TW9kZWx9IGZyb20gJy4vcmVwZWF0JztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5pbXBvcnQge2Fzc2VtYmxlU2NhbGVzfSBmcm9tICcuL3NjYWxlL2Fzc2VtYmxlJztcbmltcG9ydCB7U2NhbGVDb21wb25lbnQsIFNjYWxlQ29tcG9uZW50SW5kZXh9IGZyb20gJy4vc2NhbGUvY29tcG9uZW50JztcbmltcG9ydCB7YXNzZW1ibGVEb21haW4sIGdldEZpZWxkRnJvbURvbWFpbn0gZnJvbSAnLi9zY2FsZS9kb21haW4nO1xuaW1wb3J0IHtwYXJzZVNjYWxlfSBmcm9tICcuL3NjYWxlL3BhcnNlJztcbmltcG9ydCB7U2VsZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuL3NlbGVjdGlvbi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtTcGxpdH0gZnJvbSAnLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi91bml0JztcblxuLyoqXG4gKiBDb21wb3NhYmxlIENvbXBvbmVudHMgdGhhdCBhcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgb2YgdGhlIHBhcnNpbmcgcGhhc2Ugb2YgdGhlXG4gKiBjb21waWxhdGlvbnMuICBUaGUgY29tcG9uZW50cyByZXByZXNlbnRzIHBhcnRzIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGluIGEgZm9ybSB0aGF0XG4gKiBjYW4gYmUgZWFzaWx5IG1lcmdlZCAoZHVyaW5nIHBhcnNpbmcgZm9yIGNvbXBvc2l0ZSBzcGVjcykuXG4gKiBJbiBhZGRpdGlvbiwgdGhlc2UgY29tcG9uZW50cyBhcmUgZWFzaWx5IHRyYW5zZm9ybWVkIGludG8gVmVnYSBzcGVjaWZpY2F0aW9uc1xuICogZHVyaW5nIHRoZSBcImFzc2VtYmxlXCIgcGhhc2UsIHdoaWNoIGlzIHRoZSBsYXN0IHBoYXNlIG9mIHRoZSBjb21waWxhdGlvbiBzdGVwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudCB7XG4gIGRhdGE6IERhdGFDb21wb25lbnQ7XG5cbiAgbGF5b3V0U2l6ZTogTGF5b3V0U2l6ZUNvbXBvbmVudDtcblxuICBsYXlvdXRIZWFkZXJzOiB7XG4gICAgcm93PzogTGF5b3V0SGVhZGVyQ29tcG9uZW50LFxuICAgIGNvbHVtbj86IExheW91dEhlYWRlckNvbXBvbmVudFxuICB9O1xuXG4gIG1hcms6IFZnTWFya0dyb3VwW107XG4gIHNjYWxlczogU2NhbGVDb21wb25lbnRJbmRleDtcbiAgcHJvamVjdGlvbjogUHJvamVjdGlvbkNvbXBvbmVudDtcbiAgc2VsZWN0aW9uOiBEaWN0PFNlbGVjdGlvbkNvbXBvbmVudD47XG5cbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBjaGFubmVsIHRvIFZnQXhpcyBkZWZpbml0aW9uICovXG4gIGF4ZXM6IEF4aXNDb21wb25lbnRJbmRleDtcblxuICAvKiogRGljdGlvbmFyeSBtYXBwaW5nIGNoYW5uZWwgdG8gVmdMZWdlbmQgZGVmaW5pdGlvbiAqL1xuICBsZWdlbmRzOiBMZWdlbmRDb21wb25lbnRJbmRleDtcblxuICByZXNvbHZlOiBSZXNvbHZlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVNYXBJbnRlcmZhY2Uge1xuICByZW5hbWUob2xkbmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiB2b2lkO1xuICBoYXMobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5hbWVNYXAgaW1wbGVtZW50cyBOYW1lTWFwSW50ZXJmYWNlIHtcbiAgcHJpdmF0ZSBuYW1lTWFwOiBEaWN0PHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5uYW1lTWFwID0ge307XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lTWFwW29sZE5hbWVdID0gbmV3TmFtZTtcbiAgfVxuXG5cbiAgcHVibGljIGhhcyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lTWFwW25hbWVdICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gSWYgdGhlIG5hbWUgYXBwZWFycyBpbiB0aGUgX25hbWVNYXAsIHdlIG5lZWQgdG8gcmVhZCBpdHMgbmV3IG5hbWUuXG4gICAgLy8gV2UgaGF2ZSB0byBsb29wIG92ZXIgdGhlIGRpY3QganVzdCBpbiBjYXNlIHRoZSBuZXcgbmFtZSBhbHNvIGdldHMgcmVuYW1lZC5cbiAgICB3aGlsZSAodGhpcy5uYW1lTWFwW25hbWVdICYmIG5hbWUgIT09IHRoaXMubmFtZU1hcFtuYW1lXSkge1xuICAgICAgbmFtZSA9IHRoaXMubmFtZU1hcFtuYW1lXTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxufVxuXG4vKlxuICBXZSB1c2UgdHlwZSBndWFyZHMgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAgYXMgYGluc3RhbmNlb2ZgIG1ha2VzXG4gIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY29tcGlsZXIgZGVwZW5kIG9uIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2ZcbiAgdGhlIG1vZGVsIGNsYXNzZXMsIHdoaWNoIGluIHR1cm4gZGVwZW5kIG9uIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuXG4gIFRodXMsIGBpbnN0YW5jZW9mYCBsZWFkcyB0byBjaXJjdWxhciBkZXBlbmRlbmN5IHByb2JsZW1zLlxuXG4gIE9uIHRoZSBvdGhlciBoYW5kLCB0eXBlIGd1YXJkcyBvbmx5IG1ha2UgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBjb21waWxlclxuICBkZXBlbmQgb24gdGhlIHR5cGUgb2YgdGhlIG1vZGVsIGNsYXNzZXMsIGJ1dCBub3QgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi5cbiovXG5cbmV4cG9ydCBmdW5jdGlvbiBpc1VuaXRNb2RlbChtb2RlbDogTW9kZWwpOiBtb2RlbCBpcyBVbml0TW9kZWwge1xuICByZXR1cm4gbW9kZWwgJiYgbW9kZWwudHlwZSA9PT0gJ3VuaXQnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGYWNldE1vZGVsKG1vZGVsOiBNb2RlbCk6IG1vZGVsIGlzIEZhY2V0TW9kZWwge1xuICByZXR1cm4gbW9kZWwgJiYgbW9kZWwudHlwZSA9PT0gJ2ZhY2V0Jztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwZWF0TW9kZWwobW9kZWw6IE1vZGVsKTogbW9kZWwgaXMgUmVwZWF0TW9kZWwge1xuICByZXR1cm4gbW9kZWwgJiYgbW9kZWwudHlwZSA9PT0gJ3JlcGVhdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbmNhdE1vZGVsKG1vZGVsOiBNb2RlbCk6IG1vZGVsIGlzIENvbmNhdE1vZGVsIHtcbiAgcmV0dXJuIG1vZGVsICYmIG1vZGVsLnR5cGUgPT09ICdjb25jYXQnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMYXllck1vZGVsKG1vZGVsOiBNb2RlbCk6IG1vZGVsIGlzIExheWVyTW9kZWwge1xuICByZXR1cm4gbW9kZWwgJiYgbW9kZWwudHlwZSA9PT0gJ2xheWVyJztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsIHtcblxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdHlwZTogJ3VuaXQnIHwgJ2ZhY2V0JyB8ICdsYXllcicgfCAnY29uY2F0JyB8ICdyZXBlYXQnO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50OiBNb2RlbDtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IFRpdGxlUGFyYW1zO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICBwdWJsaWMgcmVhZG9ubHkgZGF0YTogRGF0YTtcbiAgcHVibGljIHJlYWRvbmx5IHRyYW5zZm9ybXM6IFRyYW5zZm9ybVtdO1xuXG4gIC8qKiBOYW1lIG1hcCBmb3Igc2NhbGVzLCB3aGljaCBjYW4gYmUgcmVuYW1lZCBieSBhIG1vZGVsJ3MgcGFyZW50LiAqL1xuICBwcm90ZWN0ZWQgc2NhbGVOYW1lTWFwOiBOYW1lTWFwSW50ZXJmYWNlO1xuXG4gIC8qKiBOYW1lIG1hcCBmb3IgcHJvamVjdGlvbnMsIHdoaWNoIGNhbiBiZSByZW5hbWVkIGJ5IGEgbW9kZWwncyBwYXJlbnQuICovXG4gIHByb3RlY3RlZCBwcm9qZWN0aW9uTmFtZU1hcDogTmFtZU1hcEludGVyZmFjZTtcblxuICAvKiogTmFtZSBtYXAgZm9yIHNpemUsIHdoaWNoIGNhbiBiZSByZW5hbWVkIGJ5IGEgbW9kZWwncyBwYXJlbnQuICovXG4gIHByb3RlY3RlZCBsYXlvdXRTaXplTmFtZU1hcDogTmFtZU1hcEludGVyZmFjZTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWU7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnO1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQ6IENvbXBvbmVudDtcblxuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY2hpbGRyZW46IE1vZGVsW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzcGVjOiBCYXNlU3BlYywgcGFyZW50OiBNb2RlbCwgcGFyZW50R2l2ZW5OYW1lOiBzdHJpbmcsIGNvbmZpZzogQ29uZmlnLCByZXBlYXRlcjogUmVwZWF0ZXJWYWx1ZSwgcmVzb2x2ZTogUmVzb2x2ZSkge1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMucmVwZWF0ZXIgPSByZXBlYXRlcjtcblxuICAgIC8vIElmIG5hbWUgaXMgbm90IHByb3ZpZGVkLCBhbHdheXMgdXNlIHBhcmVudCdzIGdpdmVuTmFtZSB0byBhdm9pZCBuYW1lIGNvbmZsaWN0cy5cbiAgICB0aGlzLm5hbWUgPSBzcGVjLm5hbWUgfHwgcGFyZW50R2l2ZW5OYW1lO1xuICAgIHRoaXMudGl0bGUgPSBpc1N0cmluZyhzcGVjLnRpdGxlKSA/IHt0ZXh0OiBzcGVjLnRpdGxlfSA6IHNwZWMudGl0bGU7XG5cbiAgICAvLyBTaGFyZWQgbmFtZSBtYXBzXG4gICAgdGhpcy5zY2FsZU5hbWVNYXAgPSBwYXJlbnQgPyBwYXJlbnQuc2NhbGVOYW1lTWFwIDogbmV3IE5hbWVNYXAoKTtcbiAgICB0aGlzLnByb2plY3Rpb25OYW1lTWFwID0gcGFyZW50ID8gcGFyZW50LnByb2plY3Rpb25OYW1lTWFwIDogbmV3IE5hbWVNYXAoKTtcbiAgICB0aGlzLmxheW91dFNpemVOYW1lTWFwID0gcGFyZW50ID8gcGFyZW50LmxheW91dFNpemVOYW1lTWFwIDogbmV3IE5hbWVNYXAoKTtcblxuICAgIHRoaXMuZGF0YSA9IHNwZWMuZGF0YTtcblxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBzcGVjLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMudHJhbnNmb3JtcyA9IG5vcm1hbGl6ZVRyYW5zZm9ybShzcGVjLnRyYW5zZm9ybSB8fCBbXSk7XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgc291cmNlczogcGFyZW50ID8gcGFyZW50LmNvbXBvbmVudC5kYXRhLnNvdXJjZXMgOiB7fSxcbiAgICAgICAgb3V0cHV0Tm9kZXM6IHBhcmVudCA/IHBhcmVudC5jb21wb25lbnQuZGF0YS5vdXRwdXROb2RlcyA6IHt9LFxuICAgICAgICBvdXRwdXROb2RlUmVmQ291bnRzOiBwYXJlbnQgPyBwYXJlbnQuY29tcG9uZW50LmRhdGEub3V0cHV0Tm9kZVJlZkNvdW50cyA6IHt9LFxuICAgICAgICAvLyBkYXRhIGlzIGZhY2V0ZWQgaWYgdGhlIHNwZWMgaXMgYSBmYWNldCBzcGVjIG9yIHRoZSBwYXJlbnQgaGFzIGZhY2V0ZWQgZGF0YSBhbmQgbm8gZGF0YSBpcyBkZWZpbmVkXG4gICAgICAgIGlzRmFjZXRlZDogaXNGYWNldFNwZWMoc3BlYykgfHwgKHBhcmVudCAmJiBwYXJlbnQuY29tcG9uZW50LmRhdGEuaXNGYWNldGVkICYmICFzcGVjLmRhdGEpXG4gICAgICB9LFxuICAgICAgbGF5b3V0U2l6ZTogbmV3IFNwbGl0PExheW91dFNpemVJbmRleD4oKSxcbiAgICAgIGxheW91dEhlYWRlcnM6e3Jvdzoge30sIGNvbHVtbjoge319LFxuICAgICAgbWFyazogbnVsbCxcbiAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgc2NhbGU6IHt9LCBheGlzOiB7fSwgbGVnZW5kOiB7fSxcbiAgICAgICAgLi4uKHJlc29sdmUgfHwge30pXG4gICAgICB9LFxuICAgICAgc2VsZWN0aW9uOiBudWxsLFxuICAgICAgc2NhbGVzOiBudWxsLFxuICAgICAgcHJvamVjdGlvbjogbnVsbCxcbiAgICAgIGF4ZXM6IHt9LFxuICAgICAgbGVnZW5kczoge30sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd2lkdGgoKTogVmdTaWduYWxSZWYge1xuICAgIHJldHVybiB0aGlzLmdldFNpemVTaWduYWxSZWYoJ3dpZHRoJyk7XG4gIH1cblxuXG4gIHB1YmxpYyBnZXQgaGVpZ2h0KCk6IFZnU2lnbmFsUmVmIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTaXplU2lnbmFsUmVmKCdoZWlnaHQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0U2l6ZShzaXplOiBMYXlvdXRTaXplSW5kZXgpIHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBzaXplO1xuICAgIGlmICh3aWR0aCkge1xuICAgICAgdGhpcy5jb21wb25lbnQubGF5b3V0U2l6ZS5zZXQoJ3dpZHRoJywgd2lkdGgsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50LmxheW91dFNpemUuc2V0KCdoZWlnaHQnLCBoZWlnaHQsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZSgpIHtcbiAgICB0aGlzLnBhcnNlU2NhbGUoKTtcblxuICAgIHRoaXMucGFyc2VMYXlvdXRTaXplKCk7IC8vIGRlcGVuZHMgb24gc2NhbGVcbiAgICB0aGlzLnJlbmFtZVRvcExldmVsTGF5b3V0U2l6ZSgpO1xuXG4gICAgdGhpcy5wYXJzZVNlbGVjdGlvbigpO1xuICAgIHRoaXMucGFyc2VQcm9qZWN0aW9uKCk7XG4gICAgdGhpcy5wYXJzZURhdGEoKTsgLy8gKHBhdGhvcmRlcikgZGVwZW5kcyBvbiBtYXJrRGVmOyBzZWxlY3Rpb24gZmlsdGVycyBkZXBlbmQgb24gcGFyc2VkIHNlbGVjdGlvbnM7IGRlcGVuZHMgb24gcHJvamVjdGlvbiBiZWNhdXNlIHNvbWUgdHJhbnNmb3JtcyByZXF1aXJlIHRoZSBmaW5hbGl6ZWQgcHJvamVjdGlvbiBuYW1lLlxuICAgIHRoaXMucGFyc2VBeGlzQW5kSGVhZGVyKCk7IC8vIGRlcGVuZHMgb24gc2NhbGUgYW5kIGxheW91dCBzaXplXG4gICAgdGhpcy5wYXJzZUxlZ2VuZCgpOyAvLyBkZXBlbmRzIG9uIHNjYWxlLCBtYXJrRGVmXG4gICAgdGhpcy5wYXJzZU1hcmtHcm91cCgpOyAvLyBkZXBlbmRzIG9uIGRhdGEgbmFtZSwgc2NhbGUsIGxheW91dCBzaXplLCBheGlzR3JvdXAsIGFuZCBjaGlsZHJlbidzIHNjYWxlLCBheGlzLCBsZWdlbmQgYW5kIG1hcmsuXG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcGFyc2VEYXRhKCk6IHZvaWQ7XG5cbiAgcHVibGljIGFic3RyYWN0IHBhcnNlU2VsZWN0aW9uKCk6IHZvaWQ7XG5cblxuICBwdWJsaWMgcGFyc2VTY2FsZSgpIHtcbiAgICBwYXJzZVNjYWxlKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlUHJvamVjdGlvbigpIHtcbiAgICBwYXJzZVByb2plY3Rpb24odGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgcGFyc2VMYXlvdXRTaXplKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbmFtZSB0b3AtbGV2ZWwgc3BlYydzIHNpemUgdG8gYmUganVzdCB3aWR0aCAvIGhlaWdodCwgaWdub3JpbmcgbW9kZWwgbmFtZS5cbiAgICogVGhpcyBlc3NlbnRpYWxseSBtZXJnZXMgdGhlIHRvcC1sZXZlbCBzcGVjJ3Mgd2lkdGgvaGVpZ2h0IHNpZ25hbHMgd2l0aCB0aGUgd2lkdGgvaGVpZ2h0IHNpZ25hbHNcbiAgICogdG8gaGVscCB1cyByZWR1Y2UgcmVkdW5kYW50IHNpZ25hbHMgZGVjbGFyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHJlbmFtZVRvcExldmVsTGF5b3V0U2l6ZSgpIHtcbiAgICBpZiAodGhpcy5nZXROYW1lKCd3aWR0aCcpICE9PSAnd2lkdGgnKSB7XG4gICAgICB0aGlzLnJlbmFtZUxheW91dFNpemUodGhpcy5nZXROYW1lKCd3aWR0aCcpLCAnd2lkdGgnKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ2V0TmFtZSgnaGVpZ2h0JykgIT09ICdoZWlnaHQnKSB7XG4gICAgICB0aGlzLnJlbmFtZUxheW91dFNpemUodGhpcy5nZXROYW1lKCdoZWlnaHQnKSwgJ2hlaWdodCcpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBwYXJzZU1hcmtHcm91cCgpOiB2b2lkO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBwYXJzZUF4aXNBbmRIZWFkZXIoKTogdm9pZDtcblxuICBwdWJsaWMgcGFyc2VMZWdlbmQoKSB7XG4gICAgcGFyc2VMZWdlbmQodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBhbnlbXTtcbiAgcHVibGljIGFic3RyYWN0IGFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpOiBhbnlbXTtcblxuICBwdWJsaWMgYWJzdHJhY3QgYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGE6IFZnRGF0YVtdKTogVmdEYXRhW107XG5cbiAgcHVibGljIGFzc2VtYmxlR3JvdXBTdHlsZSgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bml0JyB8fCB0aGlzLnR5cGUgPT09ICdsYXllcicpIHtcbiAgICAgIHJldHVybiAnY2VsbCc7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXRTaXplKCk6IFZnRW5jb2RlRW50cnkge1xuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1bml0JyB8fCB0aGlzLnR5cGUgPT09ICdsYXllcicpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmdldFNpemVTaWduYWxSZWYoJ3dpZHRoJyksXG4gICAgICAgIGhlaWdodDogdGhpcy5nZXRTaXplU2lnbmFsUmVmKCdoZWlnaHQnKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhc3NlbWJsZUxheW91dCgpOiBWZ0xheW91dDtcblxuICBwdWJsaWMgYWJzdHJhY3QgYXNzZW1ibGVMYXlvdXRTaWduYWxzKCk6IFZnU2lnbmFsW107XG5cbiAgcHVibGljIGFzc2VtYmxlSGVhZGVyTWFya3MoKTogVmdNYXJrR3JvdXBbXSB7XG4gICAgY29uc3Qge2xheW91dEhlYWRlcnN9ID0gdGhpcy5jb21wb25lbnQ7XG4gICAgbGV0IGhlYWRlck1hcmtzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGNoYW5uZWwgb2YgSEVBREVSX0NIQU5ORUxTKSB7XG4gICAgICBpZiAobGF5b3V0SGVhZGVyc1tjaGFubmVsXS50aXRsZSkge1xuICAgICAgICBoZWFkZXJNYXJrcy5wdXNoKGdldFRpdGxlR3JvdXAodGhpcywgY2hhbm5lbCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBIRUFERVJfQ0hBTk5FTFMpIHtcbiAgICAgIGhlYWRlck1hcmtzID0gaGVhZGVyTWFya3MuY29uY2F0KGdldEhlYWRlckdyb3Vwcyh0aGlzLCBjaGFubmVsKSk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJNYXJrcztcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCBhc3NlbWJsZU1hcmtzKCk6IFZnTWFya0dyb3VwW107IC8vIFRPRE86IFZnTWFya0dyb3VwW11cblxuICBwdWJsaWMgYXNzZW1ibGVBeGVzKCk6IFZnQXhpc1tdIHtcbiAgICByZXR1cm4gYXNzZW1ibGVBeGVzKHRoaXMuY29tcG9uZW50LmF4ZXMsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxlZ2VuZHMoKTogVmdMZWdlbmRbXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlTGVnZW5kcyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVByb2plY3Rpb25zKCk6IFZnUHJvamVjdGlvbltdIHtcbiAgICByZXR1cm4gYXNzZW1ibGVQcm9qZWN0aW9ucyh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVRpdGxlKCk6IFZnVGl0bGUge1xuICAgIGNvbnN0IHRpdGxlOiBWZ1RpdGxlID0ge1xuICAgICAgLi4uZXh0cmFjdFRpdGxlQ29uZmlnKHRoaXMuY29uZmlnLnRpdGxlKS5ub25NYXJrLFxuICAgICAgLi4udGhpcy50aXRsZVxuICAgIH07XG5cbiAgICBpZiAodGl0bGUudGV4dCkge1xuICAgICAgaWYgKCFjb250YWlucyhbJ3VuaXQnLCAnbGF5ZXInXSwgdGhpcy50eXBlKSkge1xuICAgICAgICAvLyBBcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS1saXRlL2lzc3Vlcy8yODc1OlxuICAgICAgICAvLyBEdWUgdG8gdmVnYS92ZWdhIzk2MCAoY29tbWVudCksIHdlIG9ubHkgc3VwcG9ydCB0aXRsZSdzIGFuY2hvciBmb3IgdW5pdCBhbmQgbGF5ZXJlZCBzcGVjIGZvciBub3cuXG5cbiAgICAgICAgaWYgKHRpdGxlLmFuY2hvciAmJiB0aXRsZS5hbmNob3IgIT09ICdzdGFydCcpIHtcbiAgICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5jYW5ub3RTZXRUaXRsZUFuY2hvcih0aGlzLnR5cGUpKTtcbiAgICAgICAgfVxuICAgICAgICB0aXRsZS5hbmNob3IgPSAnc3RhcnQnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ga2V5cyh0aXRsZSkubGVuZ3RoID4gMCA/IHRpdGxlIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2VtYmxlIHRoZSBtYXJrIGdyb3VwIGZvciB0aGlzIG1vZGVsLiAgV2UgYWNjZXB0IG9wdGlvbmFsIGBzaWduYWxzYCBzbyB0aGF0IHdlIGNhbiBpbmNsdWRlIGNvbmNhdCB0b3AtbGV2ZWwgc2lnbmFscyB3aXRoIHRoZSB0b3AtbGV2ZWwgbW9kZWwncyBsb2NhbCBzaWduYWxzLlxuICAgKi9cbiAgcHVibGljIGFzc2VtYmxlR3JvdXAoc2lnbmFsczogVmdTaWduYWxbXSA9IFtdKSB7XG4gICAgY29uc3QgZ3JvdXA6IFZnTWFya0dyb3VwID0ge307XG5cbiAgICBzaWduYWxzID0gc2lnbmFscy5jb25jYXQodGhpcy5hc3NlbWJsZVNlbGVjdGlvblNpZ25hbHMoKSk7XG5cbiAgICBpZiAoc2lnbmFscy5sZW5ndGggPiAwKSB7XG4gICAgICBncm91cC5zaWduYWxzID0gc2lnbmFscztcbiAgICB9XG5cbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmFzc2VtYmxlTGF5b3V0KCk7XG4gICAgaWYgKGxheW91dCkge1xuICAgICAgZ3JvdXAubGF5b3V0ID0gbGF5b3V0O1xuICAgIH1cblxuICAgIGdyb3VwLm1hcmtzID0gW10uY29uY2F0KFxuICAgICAgdGhpcy5hc3NlbWJsZUhlYWRlck1hcmtzKCksXG4gICAgICB0aGlzLmFzc2VtYmxlTWFya3MoKVxuICAgICk7XG5cbiAgICAvLyBPbmx5IGluY2x1ZGUgc2NhbGVzIGlmIHRoaXMgc3BlYyBpcyB0b3AtbGV2ZWwgb3IgaWYgcGFyZW50IGlzIGZhY2V0LlxuICAgIC8vIChPdGhlcndpc2UsIGl0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdXBwZXItbGV2ZWwncyBzY29wZS4pXG4gICAgY29uc3Qgc2NhbGVzID0gKCF0aGlzLnBhcmVudCB8fCBpc0ZhY2V0TW9kZWwodGhpcy5wYXJlbnQpKSA/IGFzc2VtYmxlU2NhbGVzKHRoaXMpIDogW107XG4gICAgaWYgKHNjYWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICBncm91cC5zY2FsZXMgPSBzY2FsZXM7XG4gICAgfVxuXG4gICAgY29uc3QgYXhlcyA9IHRoaXMuYXNzZW1ibGVBeGVzKCk7XG4gICAgaWYgKGF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXAuYXhlcyA9IGF4ZXM7XG4gICAgfVxuXG4gICAgY29uc3QgbGVnZW5kcyA9IHRoaXMuYXNzZW1ibGVMZWdlbmRzKCk7XG4gICAgaWYgKGxlZ2VuZHMubGVuZ3RoID4gMCkge1xuICAgICAgZ3JvdXAubGVnZW5kcyA9IGxlZ2VuZHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwO1xuICB9XG5cbiAgcHVibGljIGhhc0Rlc2NlbmRhbnRXaXRoRmllbGRPbkNoYW5uZWwoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgaWYgKGlzVW5pdE1vZGVsKGNoaWxkKSkge1xuICAgICAgICBpZiAoY2hpbGQuY2hhbm5lbEhhc0ZpZWxkKGNoYW5uZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChjaGlsZC5oYXNEZXNjZW5kYW50V2l0aEZpZWxkT25DaGFubmVsKGNoYW5uZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE5hbWUodGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHZhck5hbWUoKHRoaXMubmFtZSA/IHRoaXMubmFtZSArICdfJyA6ICcnKSArIHRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBkYXRhIHNvdXJjZSBuYW1lIGZvciB0aGUgZ2l2ZW4gZGF0YSBzb3VyY2UgdHlwZSBhbmQgbWFyayB0aGF0IGRhdGEgc291cmNlIGFzIHJlcXVpcmVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHBhcnNlLCBzbyB0aGF0IGFsbCB1c2VkIGRhdGEgc291cmNlIGNhbiBiZSBjb3JyZWN0bHkgaW5zdGFudGlhdGVkIGluIGFzc2VtYmxlRGF0YSgpLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3REYXRhTmFtZShuYW1lOiBEYXRhU291cmNlVHlwZSkge1xuICAgIGNvbnN0IGZ1bGxOYW1lID0gdGhpcy5nZXROYW1lKG5hbWUpO1xuXG4gICAgLy8gSW5jcmVhc2UgcmVmIGNvdW50LiBUaGlzIGlzIGNyaXRpY2FsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvbid0IGNyZWF0ZSBhIGRhdGEgc291cmNlLlxuICAgIC8vIFdlIGFsc28gaW5jcmVhc2UgdGhlIHJlZiBjb3VudHMgb24gT3V0cHV0Tm9kZS5nZXRTb3VyY2UoKSBjYWxscy5cbiAgICBjb25zdCByZWZDb3VudHMgPSB0aGlzLmNvbXBvbmVudC5kYXRhLm91dHB1dE5vZGVSZWZDb3VudHM7XG4gICAgcmVmQ291bnRzW2Z1bGxOYW1lXSA9IChyZWZDb3VudHNbZnVsbE5hbWVdIHx8IDApICsgMTtcblxuICAgIHJldHVybiBmdWxsTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTaXplU2lnbmFsUmVmKHNpemVUeXBlOiAnd2lkdGgnIHwgJ2hlaWdodCcpOiBWZ1NpZ25hbFJlZiB7XG4gICAgaWYgKGlzRmFjZXRNb2RlbCh0aGlzLnBhcmVudCkpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBzaXplVHlwZSA9PT0gJ3dpZHRoJyA/ICd4JyA6ICd5JztcbiAgICAgIGNvbnN0IHNjYWxlQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQuc2NhbGVzW2NoYW5uZWxdO1xuXG4gICAgICBpZiAoc2NhbGVDb21wb25lbnQgJiYgIXNjYWxlQ29tcG9uZW50Lm1lcmdlZCkgeyAvLyBpbmRlcGVuZGVudCBzY2FsZVxuICAgICAgICBjb25zdCB0eXBlID0gc2NhbGVDb21wb25lbnQuZ2V0KCd0eXBlJyk7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gc2NhbGVDb21wb25lbnQuZ2V0KCdyYW5nZScpO1xuXG4gICAgICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbih0eXBlKSAmJiBpc1ZnUmFuZ2VTdGVwKHJhbmdlKSkge1xuICAgICAgICAgIGNvbnN0IHNjYWxlTmFtZSA9IHNjYWxlQ29tcG9uZW50LmdldCgnbmFtZScpO1xuICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFzc2VtYmxlRG9tYWluKHRoaXMsIGNoYW5uZWwpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0RmllbGRGcm9tRG9tYWluKGRvbWFpbik7XG4gICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IHZnRmllbGQoe2FnZ3JlZ2F0ZTogJ2Rpc3RpbmN0JywgZmllbGR9LCB7ZXhwcjogJ2RhdHVtJ30pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc2lnbmFsOiBzaXplRXhwcihzY2FsZU5hbWUsIHNjYWxlQ29tcG9uZW50LCBmaWVsZFJlZilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZy53YXJuKCdVbmtub3duIGZpZWxkIGZvciAke2NoYW5uZWx9LiAgQ2Fubm90IGNhbGN1bGF0ZSB2aWV3IHNpemUuJyk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzaWduYWw6IHRoaXMubGF5b3V0U2l6ZU5hbWVNYXAuZ2V0KHRoaXMuZ2V0TmFtZShzaXplVHlwZSkpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rdXAgdGhlIG5hbWUgb2YgdGhlIGRhdGFzb3VyY2UgZm9yIGFuIG91dHB1dCBub2RlLiBZb3UgcHJvYmFibHkgd2FudCB0byBjYWxsIHRoaXMgaW4gYXNzZW1ibGUuXG4gICAqL1xuICBwdWJsaWMgbG9va3VwRGF0YVNvdXJjZShuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBub2RlID0gdGhpcy5jb21wb25lbnQuZGF0YS5vdXRwdXROb2Rlc1tuYW1lXTtcblxuICAgIGlmICghbm9kZSkge1xuICAgICAgLy8gTmFtZSBub3QgZm91bmQgaW4gbWFwIHNvIGxldCdzIGp1c3QgcmV0dXJuIHdoYXQgd2UgZ290LlxuICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHdlIGFscmVhZHkgaGF2ZSB0aGUgY29ycmVjdCBuYW1lLlxuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vZGUuZ2V0U291cmNlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2l6ZU5hbWUob2xkU2l6ZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgIHJldHVybiB0aGlzLmxheW91dFNpemVOYW1lTWFwLmdldChvbGRTaXplTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgcmVuYW1lTGF5b3V0U2l6ZShvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZykge1xuICAgIHRoaXMubGF5b3V0U2l6ZU5hbWVNYXAucmVuYW1lKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZVNjYWxlKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5zY2FsZU5hbWVNYXAucmVuYW1lKG9sZE5hbWUsIG5ld05hbWUpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZVByb2plY3Rpb24ob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb2plY3Rpb25OYW1lTWFwLnJlbmFtZShvbGROYW1lLCBuZXdOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHNjYWxlIG5hbWUgZm9yIGEgZ2l2ZW4gY2hhbm5lbCBhZnRlciB0aGUgc2NhbGUgaGFzIGJlZW4gcGFyc2VkIGFuZCBuYW1lZC5cbiAgICovXG4gIHB1YmxpYyBzY2FsZU5hbWUob3JpZ2luYWxTY2FsZU5hbWU6IENoYW5uZWwgfCBzdHJpbmcsIHBhcnNlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKHBhcnNlKSB7XG4gICAgICAvLyBEdXJpbmcgdGhlIHBhcnNlIHBoYXNlIGFsd2F5cyByZXR1cm4gYSB2YWx1ZVxuICAgICAgLy8gTm8gbmVlZCB0byByZWZlciB0byByZW5hbWUgbWFwIGJlY2F1c2UgYSBzY2FsZSBjYW4ndCBiZSByZW5hbWVkXG4gICAgICAvLyBiZWZvcmUgaXQgaGFzIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZShvcmlnaW5hbFNjYWxlTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBzY2FsZSBmb3IgdGhlIGNoYW5uZWwsIGl0IHNob3VsZCBlaXRoZXJcbiAgICAvLyBiZSBpbiB0aGUgc2NhbGUgY29tcG9uZW50IG9yIGV4aXN0IGluIHRoZSBuYW1lIG1hcFxuICAgIGlmIChcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBzY2FsZSBmb3IgdGhlIGNoYW5uZWwsIHRoZXJlIHNob3VsZCBiZSBhIGxvY2FsIHNjYWxlIGNvbXBvbmVudCBmb3IgaXRcbiAgICAgICAgKGlzQ2hhbm5lbChvcmlnaW5hbFNjYWxlTmFtZSkgJiYgaXNTY2FsZUNoYW5uZWwob3JpZ2luYWxTY2FsZU5hbWUpICYmIHRoaXMuY29tcG9uZW50LnNjYWxlc1tvcmlnaW5hbFNjYWxlTmFtZV0pIHx8XG4gICAgICAgIC8vIGluIHRoZSBzY2FsZSBuYW1lIG1hcCAodGhlIHNjYWxlIGdldCBtZXJnZWQgYnkgaXRzIHBhcmVudClcbiAgICAgICAgdGhpcy5zY2FsZU5hbWVNYXAuaGFzKHRoaXMuZ2V0TmFtZShvcmlnaW5hbFNjYWxlTmFtZSkpXG4gICAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnNjYWxlTmFtZU1hcC5nZXQodGhpcy5nZXROYW1lKG9yaWdpbmFsU2NhbGVOYW1lKSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBwcm9qZWN0aW9uIG5hbWUgYWZ0ZXIgdGhlIHByb2plY3Rpb24gaGFzIGJlZW4gcGFyc2VkIGFuZCBuYW1lZC5cbiAgICovXG4gIHB1YmxpYyBwcm9qZWN0aW9uTmFtZShwYXJzZT86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChwYXJzZSkge1xuICAgICAgLy8gRHVyaW5nIHRoZSBwYXJzZSBwaGFzZSBhbHdheXMgcmV0dXJuIGEgdmFsdWVcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVmZXIgdG8gcmVuYW1lIG1hcCBiZWNhdXNlIGEgcHJvamVjdGlvbiBjYW4ndCBiZSByZW5hbWVkXG4gICAgICAvLyBiZWZvcmUgaXQgaGFzIHRoZSBvcmlnaW5hbCBuYW1lLlxuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmFtZSgncHJvamVjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICgodGhpcy5jb21wb25lbnQucHJvamVjdGlvbiAmJiAhdGhpcy5jb21wb25lbnQucHJvamVjdGlvbi5tZXJnZWQpIHx8IHRoaXMucHJvamVjdGlvbk5hbWVNYXAuaGFzKHRoaXMuZ2V0TmFtZSgncHJvamVjdGlvbicpKSkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvamVjdGlvbk5hbWVNYXAuZ2V0KHRoaXMuZ2V0TmFtZSgncHJvamVjdGlvbicpKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JyZWN0cyB0aGUgZGF0YSByZWZlcmVuY2VzIGluIG1hcmtzIGFmdGVyIGFzc2VtYmxlLlxuICAgKi9cbiAgcHVibGljIGNvcnJlY3REYXRhTmFtZXMgPSAobWFyazogVmdNYXJrR3JvdXApID0+IHtcbiAgICAvLyBUT0RPOiBtYWtlIHRoaXMgY29ycmVjdFxuXG4gICAgLy8gZm9yIG5vcm1hbCBkYXRhIHJlZmVyZW5jZXNcbiAgICBpZiAobWFyay5mcm9tICYmIG1hcmsuZnJvbS5kYXRhKSB7XG4gICAgICBtYXJrLmZyb20uZGF0YSA9IHRoaXMubG9va3VwRGF0YVNvdXJjZShtYXJrLmZyb20uZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gZm9yIGFjY2VzcyB0byBmYWNldCBkYXRhXG4gICAgaWYgKG1hcmsuZnJvbSAmJiBtYXJrLmZyb20uZmFjZXQgJiYgbWFyay5mcm9tLmZhY2V0LmRhdGEpIHtcbiAgICAgIG1hcmsuZnJvbS5mYWNldC5kYXRhID0gdGhpcy5sb29rdXBEYXRhU291cmNlKG1hcmsuZnJvbS5mYWNldC5kYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFyaztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZSBhIG1vZGVsJ3MgaGllcmFyY2h5IHRvIGdldCB0aGUgc2NhbGUgY29tcG9uZW50IGZvciBhIHBhcnRpY3VsYXIgY2hhbm5lbC5cbiAgICovXG4gIHB1YmxpYyBnZXRTY2FsZUNvbXBvbmVudChjaGFubmVsOiBTY2FsZUNoYW5uZWwpOiBTY2FsZUNvbXBvbmVudCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IFRoaXMgaXMgd2FybmluZyBmb3IgZGVidWdnaW5nIHRlc3QgKi9cbiAgICBpZiAoIXRoaXMuY29tcG9uZW50LnNjYWxlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRTY2FsZUNvbXBvbmVudCBjYW5ub3QgYmUgY2FsbGVkIGJlZm9yZSBwYXJzZVNjYWxlKCkuICBNYWtlIHN1cmUgeW91IGhhdmUgY2FsbGVkIHBhcnNlU2NhbGUgb3IgdXNlIHBhcnNlVW5pdE1vZGVsV2l0aFNjYWxlKCkuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxTY2FsZUNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXTtcbiAgICBpZiAobG9jYWxTY2FsZUNvbXBvbmVudCAmJiAhbG9jYWxTY2FsZUNvbXBvbmVudC5tZXJnZWQpIHtcbiAgICAgIHJldHVybiBsb2NhbFNjYWxlQ29tcG9uZW50O1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkgOiB1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYXZlcnNlIGEgbW9kZWwncyBoaWVyYXJjaHkgdG8gZ2V0IGEgcGFydGljdWxhciBzZWxlY3Rpb24gY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGdldFNlbGVjdGlvbkNvbXBvbmVudCh2YXJpYWJsZU5hbWU6IHN0cmluZywgb3JpZ05hbWU6IHN0cmluZyk6IFNlbGVjdGlvbkNvbXBvbmVudCB7XG4gICAgbGV0IHNlbCA9IHRoaXMuY29tcG9uZW50LnNlbGVjdGlvblt2YXJpYWJsZU5hbWVdO1xuICAgIGlmICghc2VsICYmIHRoaXMucGFyZW50KSB7XG4gICAgICBzZWwgPSB0aGlzLnBhcmVudC5nZXRTZWxlY3Rpb25Db21wb25lbnQodmFyaWFibGVOYW1lLCBvcmlnTmFtZSk7XG4gICAgfVxuICAgIGlmICghc2VsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2Uuc2VsZWN0aW9uTm90Rm91bmQob3JpZ05hbWUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbDtcbiAgfVxufVxuXG4vKiogQWJzdHJhY3QgY2xhc3MgZm9yIFVuaXRNb2RlbCBhbmQgRmFjZXRNb2RlbC4gIEJvdGggb2Ygd2hpY2ggY2FuIGNvbnRhaW4gZmllbGREZWZzIGFzIGEgcGFydCBvZiBpdHMgb3duIHNwZWNpZmljYXRpb24uICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9kZWxXaXRoRmllbGQgZXh0ZW5kcyBNb2RlbCB7XG4gIHB1YmxpYyBhYnN0cmFjdCBmaWVsZERlZihjaGFubmVsOiBTaW5nbGVEZWZDaGFubmVsKTogRmllbGREZWY8c3RyaW5nPjtcblxuICAvKiogR2V0IFwiZmllbGRcIiByZWZlcmVuY2UgZm9yIHZlZ2EgKi9cbiAgcHVibGljIHZnRmllbGQoY2hhbm5lbDogU2luZ2xlRGVmQ2hhbm5lbCwgb3B0OiBGaWVsZFJlZk9wdGlvbiA9IHt9KSB7XG4gICAgY29uc3QgZmllbGREZWYgPSB0aGlzLmZpZWxkRGVmKGNoYW5uZWwpO1xuXG4gICAgaWYgKCFmaWVsZERlZikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdmdGaWVsZChmaWVsZERlZiwgb3B0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRNYXBwaW5nKCk6IHtba2V5IGluIENoYW5uZWxdPzogYW55fTtcblxuICBwdWJsaWMgcmVkdWNlRmllbGREZWY8VCwgVT4oZjogKGFjYzogVSwgZmQ6IEZpZWxkRGVmPHN0cmluZz4sIGM6IENoYW5uZWwpID0+IFUsIGluaXQ6IFQsIHQ/OiBhbnkpIHtcbiAgICByZXR1cm4gcmVkdWNlKHRoaXMuZ2V0TWFwcGluZygpLCAoYWNjOlUgLCBjZDogQ2hhbm5lbERlZjxzdHJpbmc+LCBjOiBDaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IGdldEZpZWxkRGVmKGNkKTtcbiAgICAgIGlmIChmaWVsZERlZikge1xuICAgICAgICByZXR1cm4gZihhY2MsIGZpZWxkRGVmLCBjKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgaW5pdCwgdCk7XG4gIH1cblxuICBwdWJsaWMgZm9yRWFjaEZpZWxkRGVmKGY6IChmZDogRmllbGREZWY8c3RyaW5nPiwgYzogQ2hhbm5lbCkgPT4gdm9pZCwgdD86IGFueSkge1xuICAgIGZvckVhY2godGhpcy5nZXRNYXBwaW5nKCksIChjZDogQ2hhbm5lbERlZjxzdHJpbmc+LCBjOiBDaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IGdldEZpZWxkRGVmKGNkKTtcbiAgICAgIGlmIChmaWVsZERlZikge1xuICAgICAgICBmKGZpZWxkRGVmLCBjKTtcbiAgICAgIH1cbiAgICB9LCB0KTtcbiAgfVxuICBwdWJsaWMgYWJzdHJhY3QgY2hhbm5lbEhhc0ZpZWxkKGNoYW5uZWw6IENoYW5uZWwpOiBib29sZWFuO1xufVxuIl19","import { stringValue } from 'vega-util';\nimport { X, Y } from '../../../channel';\nimport * as log from '../../../log';\nimport { hasContinuousDomain, isBinScale } from '../../../scale';\nimport { channelSignalName } from '../selection';\nvar scaleBindings = {\n has: function (selCmpt) {\n return selCmpt.type === 'interval' && selCmpt.resolve === 'global' &&\n selCmpt.bind && selCmpt.bind === 'scales';\n },\n parse: function (model, selDef, selCmpt) {\n var bound = selCmpt.scales = [];\n selCmpt.project.forEach(function (p) {\n var channel = p.channel;\n var scale = model.getScaleComponent(channel);\n var scaleType = scale ? scale.get('type') : undefined;\n if (!scale || !hasContinuousDomain(scaleType) || isBinScale(scaleType)) {\n log.warn(log.message.SCALE_BINDINGS_CONTINUOUS);\n return;\n }\n scale.set('domainRaw', { signal: channelSignalName(selCmpt, channel, 'data') }, true);\n bound.push(channel);\n // Bind both x/y for diag plot of repeated views.\n if (model.repeater && model.repeater.row === model.repeater.column) {\n var scale2 = model.getScaleComponent(channel === X ? Y : X);\n scale2.set('domainRaw', { signal: channelSignalName(selCmpt, channel, 'data') }, true);\n }\n });\n },\n topLevelSignals: function (model, selCmpt, signals) {\n // Top-level signals are only needed when coordinating composed views.\n if (!model.parent) {\n return signals;\n }\n var channels = selCmpt.scales.filter(function (channel) {\n return !(signals.filter(function (s) { return s.name === channelSignalName(selCmpt, channel, 'data'); }).length);\n });\n return signals.concat(channels.map(function (channel) {\n return { name: channelSignalName(selCmpt, channel, 'data') };\n }));\n },\n signals: function (model, selCmpt, signals) {\n // Nested signals need only push to top-level signals when within composed views.\n if (model.parent) {\n selCmpt.scales.forEach(function (channel) {\n var signal = signals.filter(function (s) { return s.name === channelSignalName(selCmpt, channel, 'data'); })[0];\n signal.push = 'outer';\n delete signal.value;\n delete signal.update;\n });\n }\n return signals;\n }\n};\nexport default scaleBindings;\nexport function domain(model, channel) {\n var scale = stringValue(model.scaleName(channel));\n return \"domain(\" + scale + \")\";\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvc2NhbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFVLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBSS9DLElBQU0sYUFBYSxHQUFxQjtJQUN0QyxHQUFHLEVBQUUsVUFBUyxPQUFPO1FBQ25CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxRQUFRO1lBQ2hFLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7SUFDOUMsQ0FBQztJQUVELEtBQUssRUFBRSxVQUFTLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTztRQUNwQyxJQUFNLEtBQUssR0FBYyxPQUFPLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUU3QyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFTLENBQUM7WUFDaEMsSUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUMxQixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFFeEQsSUFBSSxD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QUFDO0lBQ3BELE9BQU8sWUFBVSxLQUFLLE1BQUcsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgWCwgWX0gZnJvbSAnLi4vLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vbG9nJztcbmltcG9ydCB7aGFzQ29udGludW91c0RvbWFpbiwgaXNCaW5TY2FsZX0gZnJvbSAnLi4vLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uLy4uL3VuaXQnO1xuaW1wb3J0IHtjaGFubmVsU2lnbmFsTmFtZX0gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7VHJhbnNmb3JtQ29tcGlsZXJ9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5cblxuY29uc3Qgc2NhbGVCaW5kaW5nczpUcmFuc2Zvcm1Db21waWxlciA9IHtcbiAgaGFzOiBmdW5jdGlvbihzZWxDbXB0KSB7XG4gICAgcmV0dXJuIHNlbENtcHQudHlwZSA9PT0gJ2ludGVydmFsJyAmJiBzZWxDbXB0LnJlc29sdmUgPT09ICdnbG9iYWwnICYmXG4gICAgICBzZWxDbXB0LmJpbmQgJiYgc2VsQ21wdC5iaW5kID09PSAnc2NhbGVzJztcbiAgfSxcblxuICBwYXJzZTogZnVuY3Rpb24obW9kZWwsIHNlbERlZiwgc2VsQ21wdCkge1xuICAgIGNvbnN0IGJvdW5kOiBDaGFubmVsW10gPSBzZWxDbXB0LnNjYWxlcyA9IFtdO1xuXG4gICAgc2VsQ21wdC5wcm9qZWN0LmZvckVhY2goZnVuY3Rpb24ocCkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHAuY2hhbm5lbDtcbiAgICAgIGNvbnN0IHNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZSA/IHNjYWxlLmdldCgndHlwZScpIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIXNjYWxlIHx8ICFoYXNDb250aW51b3VzRG9tYWluKHNjYWxlVHlwZSkgfHwgaXNCaW5TY2FsZShzY2FsZVR5cGUpKSB7XG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLlNDQUxFX0JJTkRJTkdTX0NPTlRJTlVPVVMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNjYWxlLnNldCgnZG9tYWluUmF3Jywge3NpZ25hbDogY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKX0sIHRydWUpO1xuICAgICAgYm91bmQucHVzaChjaGFubmVsKTtcblxuICAgICAgLy8gQmluZCBib3RoIHgveSBmb3IgZGlhZyBwbG90IG9mIHJlcGVhdGVkIHZpZXdzLlxuICAgICAgaWYgKG1vZGVsLnJlcGVhdGVyICYmIG1vZGVsLnJlcGVhdGVyLnJvdyA9PT0gbW9kZWwucmVwZWF0ZXIuY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IHNjYWxlMiA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwgPT09IFggPyBZIDogWCk7XG4gICAgICAgIHNjYWxlMi5zZXQoJ2RvbWFpblJhdycsIHtzaWduYWw6IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICdkYXRhJyl9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcblxuICB0b3BMZXZlbFNpZ25hbHM6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKSB7XG4gICAgLy8gVG9wLWxldmVsIHNpZ25hbHMgYXJlIG9ubHkgbmVlZGVkIHdoZW4gY29vcmRpbmF0aW5nIGNvbXBvc2VkIHZpZXdzLlxuICAgIGlmICghbW9kZWwucGFyZW50KSB7XG4gICAgICByZXR1cm4gc2lnbmFscztcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVscyA9IHNlbENtcHQuc2NhbGVzLmZpbHRlcigoY2hhbm5lbCkgPT4ge1xuICAgICAgcmV0dXJuICEoc2lnbmFscy5maWx0ZXIocyA9PiBzLm5hbWUgPT09IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICdkYXRhJykpLmxlbmd0aCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoY2hhbm5lbHMubWFwKChjaGFubmVsKSA9PiB7XG4gICAgICByZXR1cm4ge25hbWU6IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICdkYXRhJyl9O1xuICAgIH0pKTtcbiAgfSxcblxuICBzaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIC8vIE5lc3RlZCBzaWduYWxzIG5lZWQgb25seSBwdXNoIHRvIHRvcC1sZXZlbCBzaWduYWxzIHdoZW4gd2l0aGluIGNvbXBvc2VkIHZpZXdzLlxuICAgIGlmIChtb2RlbC5wYXJlbnQpIHtcbiAgICAgIHNlbENtcHQuc2NhbGVzLmZvckVhY2goY2hhbm5lbCA9PiB7XG4gICAgICAgIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZmlsdGVyKHMgPT4gcy5uYW1lID09PSBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCAnZGF0YScpKVswXTtcblxuICAgICAgICBzaWduYWwucHVzaCA9ICdvdXRlcic7XG4gICAgICAgIGRlbGV0ZSBzaWduYWwudmFsdWU7XG4gICAgICAgIGRlbGV0ZSBzaWduYWwudXBkYXRlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNpZ25hbHM7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHNjYWxlQmluZGluZ3M7XG5cbmV4cG9ydCBmdW5jdGlvbiBkb21haW4obW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICBjb25zdCBzY2FsZSA9IHN0cmluZ1ZhbHVlKG1vZGVsLnNjYWxlTmFtZShjaGFubmVsKSk7XG4gIHJldHVybiBgZG9tYWluKCR7c2NhbGV9KWA7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { stringValue } from 'vega-util';\nimport { X, Y } from '../../channel';\nimport { warn } from '../../log';\nimport { hasContinuousDomain, isBinScale } from '../../scale';\nimport { keys } from '../../util';\nimport { channelSignalName, positionalProjections, STORE, TUPLE, unitName, } from './selection';\nimport scales from './transforms/scales';\nexport var BRUSH = '_brush';\nexport var SCALE_TRIGGER = '_scale_trigger';\nvar interval = {\n predicate: 'vlInterval',\n scaleDomain: 'vlIntervalDomain',\n signals: function (model, selCmpt) {\n var name = selCmpt.name;\n var hasScales = scales.has(selCmpt);\n var signals = [];\n var intervals = [];\n var tupleTriggers = [];\n var scaleTriggers = [];\n if (selCmpt.translate && !hasScales) {\n var filterExpr_1 = \"!event.item || event.item.mark.name !== \" + stringValue(name + BRUSH);\n events(selCmpt, function (_, evt) {\n var filters = evt.between[0].filter || (evt.between[0].filter = []);\n if (filters.indexOf(filterExpr_1) < 0) {\n filters.push(filterExpr_1);\n }\n });\n }\n selCmpt.project.forEach(function (p) {\n var channel = p.channel;\n if (channel !== X && channel !== Y) {\n warn('Interval selections only support x and y encoding channels.');\n return;\n }\n var cs = channelSignals(model, selCmpt, channel);\n var dname = channelSignalName(selCmpt, channel, 'data');\n var vname = channelSignalName(selCmpt, channel, 'visual');\n var scaleStr = stringValue(model.scaleName(channel));\n var scaleType = model.getScaleComponent(channel).get('type');\n var toNum = hasContinuousDomain(scaleType) ? '+' : '';\n signals.push.apply(signals, cs);\n tupleTriggers.push(dname);\n intervals.push(\"{encoding: \" + stringValue(channel) + \", \" +\n (\"field: \" + stringValue(p.field) + \", extent: \" + dname + \"}\"));\n scaleTriggers.push({\n scaleName: model.scaleName(channel),\n expr: \"(!isArray(\" + dname + \") || \" +\n (\"(\" + toNum + \"invert(\" + scaleStr + \", \" + vname + \")[0] === \" + toNum + dname + \"[0] && \") +\n (toNum + \"invert(\" + scaleStr + \", \" + vname + \")[1] === \" + toNum + dname + \"[1]))\")\n });\n });\n // Proxy scale reactions to ensure that an infinite loop doesn't occur\n // when an interval selection filter touches the scale.\n if (!hasScales) {\n signals.push({\n name: name + SCALE_TRIGGER,\n update: scaleTriggers.map(function (t) { return t.expr; }).join(' && ') +\n (\" ? \" + (name + SCALE_TRIGGER) + \" : {}\")\n });\n }\n // Only add an interval to the store if it has valid data extents. Data extents\n // are set to null if pixel extents are equal to account for intervals over\n // ordinal/nominal domains which, when inverted, will still produce a valid datum.\n return signals.concat({\n name: name + TUPLE,\n on: [{\n events: tupleTriggers.map(function (t) { return ({ signal: t }); }),\n update: tupleTriggers.join(' && ') +\n (\" ? {unit: \" + unitName(model) + \", intervals: [\" + intervals.join(', ') + \"]} : null\")\n }]\n });\n },\n modifyExpr: function (model, selCmpt) {\n var tpl = selCmpt.name + TUPLE;\n return tpl + ', ' +\n (selCmpt.resolve === 'global' ? 'true' : \"{unit: \" + unitName(model) + \"}\");\n },\n marks: function (model, selCmpt, marks) {\n var name = selCmpt.name;\n var _a = positionalProjections(selCmpt), xi = _a.xi, yi = _a.yi;\n var store = \"data(\" + stringValue(selCmpt.name + STORE) + \")\";\n // Do not add a brush if we're binding to scales.\n if (scales.has(selCmpt)) {\n return marks;\n }\n var update = {\n x: xi !== null ? { signal: name + \"_x[0]\" } : { value: 0 },\n y: yi !== null ? { signal: name + \"_y[0]\" } : { value: 0 },\n x2: xi !== null ? { signal: name + \"_x[1]\" } : { field: { group: 'width' } },\n y2: yi !== null ? { signal: name + \"_y[1]\" } : { field: { group: 'height' } }\n };\n // If the selection is resolved to global, only a single interval is in\n // the store. Wrap brush mark's encodings with a production rule to test\n // this based on the `unit` property. Hide the brush mark if it corresponds\n // to a unit different from the one in the store.\n if (selCmpt.resolve === 'global') {\n for (var _i = 0, _b = keys(update); _i < _b.length; _i++) {\n var key = _b[_i];\n update[key] = [tslib_1.__assign({ test: store + \".length && \" + store + \"[0].unit === \" + unitName(model) }, update[key]), { value: 0 }];\n }\n }\n // Two brush marks ensure that fill colors and other aesthetic choices do\n // not interefere with the core marks, but that the brushed region can still\n // be interacted with (e.g., dragging it around).\n var _c = selCmpt.mark, fill = _c.fill, fillOpacity = _c.fillOpacity, stroke = tslib_1.__rest(_c, [\"fill\", \"fillOpacity\"]);\n var vgStroke = keys(stroke).reduce(function (def, k) {\n def[k] = [{\n test: [\n xi !== null && name + \"_x[0] !== \" + name + \"_x[1]\",\n yi != null && name + \"_y[0] !== \" + name + \"_y[1]\",\n ].filter(function (x) { return x; }).join(' && '),\n value: stroke[k]\n }, { value: null }];\n return def;\n }, {});\n return [{\n name: name + BRUSH + '_bg',\n type: 'rect',\n clip: true,\n encode: {\n enter: {\n fill: { value: fill },\n fillOpacity: { value: fillOpacity }\n },\n update: update\n }\n }].concat(marks, {\n name: name + BRUSH,\n type: 'rect',\n clip: true,\n encode: {\n enter: {\n fill: { value: 'transparent' }\n },\n update: tslib_1.__assign({}, update, vgStroke)\n }\n });\n }\n};\nexport default interval;\n/**\n * Returns the visual and data signals for an interval selection.\n */\nfunction channelSignals(model, selCmpt, channel) {\n var vname = channelSignalName(selCmpt, channel, 'visual');\n var dname = channelSignalName(selCmpt, channel, 'data');\n var hasScales = scales.has(selCmpt);\n var scaleName = model.scaleName(channel);\n var scaleStr = stringValue(scaleName);\n var scale = model.getScaleComponent(channel);\n var scaleType = scale ? scale.get('type') : undefined;\n var size = model.getSizeSignalRef(channel === X ? 'width' : 'height').signal;\n var coord = channel + \"(unit)\";\n var on = events(selCmpt, function (def, evt) {\n return def.concat({ events: evt.between[0], update: \"[\" + coord + \", \" + coord + \"]\" }, // Brush Start\n { events: evt, update: \"[\" + vname + \"[0], clamp(\" + coord + \", 0, \" + size + \")]\" } // Brush End\n );\n });\n // React to pan/zooms of continuous scales. Non-continuous scales\n // (bin-linear, band, point) cannot be pan/zoomed and any other changes\n // to their domains (e.g., filtering) should clear the brushes.\n on.push({\n events: { signal: selCmpt.name + SCALE_TRIGGER },\n update: hasContinuousDomain(scaleType) && !isBinScale(scaleType) ?\n \"[scale(\" + scaleStr + \", \" + dname + \"[0]), scale(\" + scaleStr + \", \" + dname + \"[1])]\" : \"[0, 0]\"\n });\n return hasScales ? [{ name: dname, on: [] }] : [{\n name: vname, value: [], on: on\n }, {\n name: dname,\n on: [{ events: { signal: vname }, update: vname + \"[0] === \" + vname + \"[1] ? null : invert(\" + scaleStr + \", \" + vname + \")\" }]\n }];\n}\nfunction events(selCmpt, cb) {\n return selCmpt.events.reduce(function (on, evt) {\n if (!evt.between) {\n warn(evt + \" is not an ordered event stream for interval selections\");\n return on;\n }\n return cb(on, evt);\n }, []);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vaW50ZXJ2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMvQixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHaEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFHckIsS0FBSyxFQUNMLEtBQUssRUFDTCxRQUFRLEdBQ1QsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxNQUFNLE1BQU0scUJBQXFCLENBQUM7QUFFekMsTUFBTSxDQUFDLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUM5QixNQUFNLENBQUMsSUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFFOUMsSUFBTSxRQUFRLEdBQXFCO0lBQ2pDLFNBQVMsRUFBRSxZQUFZO0lBQ3ZCLFdBQVcsRUFBRSxrQkFBa0I7SUFFL0IsT0FBTyxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU87UUFDOUIsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLElBQU0sT0FBTyxHQUFVLEVBQUUsQ0FBQztRQUMxQixJQUFNLFNBQVMsR0FBVSxFQUFFLENBQUM7UUFDNUIsSUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO1FBQ25DLElBQU0sYUFBYSxHQUFVLEVBQUUsQ0FBQztRQUVoQyxJQUFJLE9B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QUFDO0FBRUQsZ0JBQWdCLE9BQTJCLEVBQUUsRUFBWTtJQUN2RCxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVMsRUFBUyxFQUFFLEdBQWtCO1FBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBSSxHQUFHLDREQUF5RCxDQUFDLENBQUM7WUFDdEUsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDVCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7WCwgWX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge3dhcm59IGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge2hhc0NvbnRpbnVvdXNEb21haW4sIGlzQmluU2NhbGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRXZlbnRTdHJlYW19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7XG4gIGNoYW5uZWxTaWduYWxOYW1lLFxuICBwb3NpdGlvbmFsUHJvamVjdGlvbnMsXG4gIFNlbGVjdGlvbkNvbXBpbGVyLFxuICBTZWxlY3Rpb25Db21wb25lbnQsXG4gIFNUT1JFLFxuICBUVVBMRSxcbiAgdW5pdE5hbWUsXG59IGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBzY2FsZXMgZnJvbSAnLi90cmFuc2Zvcm1zL3NjYWxlcyc7XG5cbmV4cG9ydCBjb25zdCBCUlVTSCA9ICdfYnJ1c2gnO1xuZXhwb3J0IGNvbnN0IFNDQUxFX1RSSUdHRVIgPSAnX3NjYWxlX3RyaWdnZXInO1xuXG5jb25zdCBpbnRlcnZhbDpTZWxlY3Rpb25Db21waWxlciA9IHtcbiAgcHJlZGljYXRlOiAndmxJbnRlcnZhbCcsXG4gIHNjYWxlRG9tYWluOiAndmxJbnRlcnZhbERvbWFpbicsXG5cbiAgc2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IGhhc1NjYWxlcyA9IHNjYWxlcy5oYXMoc2VsQ21wdCk7XG4gICAgY29uc3Qgc2lnbmFsczogYW55W10gPSBbXTtcbiAgICBjb25zdCBpbnRlcnZhbHM6IGFueVtdID0gW107XG4gICAgY29uc3QgdHVwbGVUcmlnZ2Vyczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzY2FsZVRyaWdnZXJzOiBhbnlbXSA9IFtdO1xuXG4gICAgaWYgKHNlbENtcHQudHJhbnNsYXRlICYmICFoYXNTY2FsZXMpIHtcbiAgICAgIGNvbnN0IGZpbHRlckV4cHIgPSBgIWV2ZW50Lml0ZW0gfHwgZXZlbnQuaXRlbS5tYXJrLm5hbWUgIT09ICR7c3RyaW5nVmFsdWUobmFtZSArIEJSVVNIKX1gO1xuICAgICAgZXZlbnRzKHNlbENtcHQsIGZ1bmN0aW9uKF86IGFueVtdLCBldnQ6IFZnRXZlbnRTdHJlYW0pIHtcbiAgICAgICAgY29uc3QgZmlsdGVycyA9IGV2dC5iZXR3ZWVuWzBdLmZpbHRlciB8fCAoZXZ0LmJldHdlZW5bMF0uZmlsdGVyID0gW10pO1xuICAgICAgICBpZiAoZmlsdGVycy5pbmRleE9mKGZpbHRlckV4cHIpIDwgMCkge1xuICAgICAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXJFeHByKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VsQ21wdC5wcm9qZWN0LmZvckVhY2goZnVuY3Rpb24ocCkge1xuICAgICAgY29uc3QgY2hhbm5lbCA9IHAuY2hhbm5lbDtcbiAgICAgIGlmIChjaGFubmVsICE9PSBYICYmIGNoYW5uZWwgIT09IFkpIHtcbiAgICAgICAgd2FybignSW50ZXJ2YWwgc2VsZWN0aW9ucyBvbmx5IHN1cHBvcnQgeCBhbmQgeSBlbmNvZGluZyBjaGFubmVscy4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjcyA9IGNoYW5uZWxTaWduYWxzKG1vZGVsLCBzZWxDbXB0LCBjaGFubmVsKTtcbiAgICAgIGNvbnN0IGRuYW1lID0gY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ2RhdGEnKTtcbiAgICAgIGNvbnN0IHZuYW1lID0gY2hhbm5lbFNpZ25hbE5hbWUoc2VsQ21wdCwgY2hhbm5lbCwgJ3Zpc3VhbCcpO1xuICAgICAgY29uc3Qgc2NhbGVTdHIgPSBzdHJpbmdWYWx1ZShtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCkpO1xuICAgICAgY29uc3Qgc2NhbGVUeXBlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJyk7XG4gICAgICBjb25zdCB0b051bSA9IGhhc0NvbnRpbnVvdXNEb21haW4oc2NhbGVUeXBlKSA/ICcrJyA6ICcnO1xuXG4gICAgICBzaWduYWxzLnB1c2guYXBwbHkoc2lnbmFscywgY3MpO1xuICAgICAgdHVwbGVUcmlnZ2Vycy5wdXNoKGRuYW1lKTtcbiAgICAgIGludGVydmFscy5wdXNoKGB7ZW5jb2Rpbmc6ICR7c3RyaW5nVmFsdWUoY2hhbm5lbCl9LCBgICtcbiAgICAgICAgYGZpZWxkOiAke3N0cmluZ1ZhbHVlKHAuZmllbGQpfSwgZXh0ZW50OiAke2RuYW1lfX1gKTtcblxuICAgICAgc2NhbGVUcmlnZ2Vycy5wdXNoKHtcbiAgICAgICAgc2NhbGVOYW1lOiBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCksXG4gICAgICAgIGV4cHI6IGAoIWlzQXJyYXkoJHtkbmFtZX0pIHx8IGAgK1xuICAgICAgICAgIGAoJHt0b051bX1pbnZlcnQoJHtzY2FsZVN0cn0sICR7dm5hbWV9KVswXSA9PT0gJHt0b051bX0ke2RuYW1lfVswXSAmJiBgICtcbiAgICAgICAgICAgIGAke3RvTnVtfWludmVydCgke3NjYWxlU3RyfSwgJHt2bmFtZX0pWzFdID09PSAke3RvTnVtfSR7ZG5hbWV9WzFdKSlgXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIFByb3h5IHNjYWxlIHJlYWN0aW9ucyB0byBlbnN1cmUgdGhhdCBhbiBpbmZpbml0ZSBsb29wIGRvZXNuJ3Qgb2NjdXJcbiAgICAvLyB3aGVuIGFuIGludGVydmFsIHNlbGVjdGlvbiBmaWx0ZXIgdG91Y2hlcyB0aGUgc2NhbGUuXG4gICAgaWYgKCFoYXNTY2FsZXMpIHtcbiAgICAgIHNpZ25hbHMucHVzaCh7XG4gICAgICAgIG5hbWU6IG5hbWUgKyBTQ0FMRV9UUklHR0VSLFxuICAgICAgICB1cGRhdGU6IHNjYWxlVHJpZ2dlcnMubWFwKCh0KSA9PiB0LmV4cHIpLmpvaW4oJyAmJiAnKSArXG4gICAgICAgICAgYCA/ICR7bmFtZSArIFNDQUxFX1RSSUdHRVJ9IDoge31gXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGFkZCBhbiBpbnRlcnZhbCB0byB0aGUgc3RvcmUgaWYgaXQgaGFzIHZhbGlkIGRhdGEgZXh0ZW50cy4gRGF0YSBleHRlbnRzXG4gICAgLy8gYXJlIHNldCB0byBudWxsIGlmIHBpeGVsIGV4dGVudHMgYXJlIGVxdWFsIHRvIGFjY291bnQgZm9yIGludGVydmFscyBvdmVyXG4gICAgLy8gb3JkaW5hbC9ub21pbmFsIGRvbWFpbnMgd2hpY2gsIHdoZW4gaW52ZXJ0ZWQsIHdpbGwgc3RpbGwgcHJvZHVjZSBhIHZhbGlkIGRhdHVtLlxuICAgIHJldHVybiBzaWduYWxzLmNvbmNhdCh7XG4gICAgICBuYW1lOiBuYW1lICsgVFVQTEUsXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiB0dXBsZVRyaWdnZXJzLm1hcCgodCkgPT4gKHtzaWduYWw6IHR9KSksXG4gICAgICAgIHVwZGF0ZTogdHVwbGVUcmlnZ2Vycy5qb2luKCcgJiYgJykgK1xuICAgICAgICAgIGAgPyB7dW5pdDogJHt1bml0TmFtZShtb2RlbCl9LCBpbnRlcnZhbHM6IFske2ludGVydmFscy5qb2luKCcsICcpfV19IDogbnVsbGBcbiAgICAgIH1dXG4gICAgfSk7XG4gIH0sXG5cbiAgbW9kaWZ5RXhwcjogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQpIHtcbiAgICBjb25zdCB0cGwgPSBzZWxDbXB0Lm5hbWUgKyBUVVBMRTtcbiAgICByZXR1cm4gdHBsICsgJywgJyArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/ICd0cnVlJyA6IGB7dW5pdDogJHt1bml0TmFtZShtb2RlbCl9fWApO1xuICB9LFxuXG4gIG1hcmtzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgbWFya3MpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IHt4aSwgeWl9ID0gcG9zaXRpb25hbFByb2plY3Rpb25zKHNlbENtcHQpO1xuICAgIGNvbnN0IHN0b3JlID0gYGRhdGEoJHtzdHJpbmdWYWx1ZShzZWxDbXB0Lm5hbWUgKyBTVE9SRSl9KWA7XG5cbiAgICAvLyBEbyBub3QgYWRkIGEgYnJ1c2ggaWYgd2UncmUgYmluZGluZyB0byBzY2FsZXMuXG4gICAgaWYgKHNjYWxlcy5oYXMoc2VsQ21wdCkpIHtcbiAgICAgIHJldHVybiBtYXJrcztcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgIHg6IHhpICE9PSBudWxsID8ge3NpZ25hbDogYCR7bmFtZX1feFswXWB9IDoge3ZhbHVlOiAwfSxcbiAgICAgIHk6IHlpICE9PSBudWxsID8ge3NpZ25hbDogYCR7bmFtZX1feVswXWB9IDoge3ZhbHVlOiAwfSxcbiAgICAgIHgyOiB4aSAhPT0gbnVsbCA/IHtzaWduYWw6IGAke25hbWV9X3hbMV1gfSA6IHtmaWVsZDoge2dyb3VwOiAnd2lkdGgnfX0sXG4gICAgICB5MjogeWkgIT09IG51bGwgPyB7c2lnbmFsOiBgJHtuYW1lfV95WzFdYH0gOiB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fVxuICAgIH07XG5cbiAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGlzIHJlc29sdmVkIHRvIGdsb2JhbCwgb25seSBhIHNpbmdsZSBpbnRlcnZhbCBpcyBpblxuICAgIC8vIHRoZSBzdG9yZS4gV3JhcCBicnVzaCBtYXJrJ3MgZW5jb2RpbmdzIHdpdGggYSBwcm9kdWN0aW9uIHJ1bGUgdG8gdGVzdFxuICAgIC8vIHRoaXMgYmFzZWQgb24gdGhlIGB1bml0YCBwcm9wZXJ0eS4gSGlkZSB0aGUgYnJ1c2ggbWFyayBpZiBpdCBjb3JyZXNwb25kc1xuICAgIC8vIHRvIGEgdW5pdCBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIHRoZSBzdG9yZS5cbiAgICBpZiAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJykge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyh1cGRhdGUpKSB7XG4gICAgICAgIHVwZGF0ZVtrZXldID0gW3tcbiAgICAgICAgICB0ZXN0OiBgJHtzdG9yZX0ubGVuZ3RoICYmICR7c3RvcmV9WzBdLnVuaXQgPT09ICR7dW5pdE5hbWUobW9kZWwpfWAsXG4gICAgICAgICAgLi4udXBkYXRlW2tleV1cbiAgICAgICAgfSwge3ZhbHVlOiAwfV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVHdvIGJydXNoIG1hcmtzIGVuc3VyZSB0aGF0IGZpbGwgY29sb3JzIGFuZCBvdGhlciBhZXN0aGV0aWMgY2hvaWNlcyBkb1xuICAgIC8vIG5vdCBpbnRlcmVmZXJlIHdpdGggdGhlIGNvcmUgbWFya3MsIGJ1dCB0aGF0IHRoZSBicnVzaGVkIHJlZ2lvbiBjYW4gc3RpbGxcbiAgICAvLyBiZSBpbnRlcmFjdGVkIHdpdGggKGUuZy4sIGRyYWdnaW5nIGl0IGFyb3VuZCkuXG4gICAgY29uc3Qge2ZpbGwsIGZpbGxPcGFjaXR5LCAuLi5zdHJva2V9ID0gc2VsQ21wdC5tYXJrO1xuICAgIGNvbnN0IHZnU3Ryb2tlID0ga2V5cyhzdHJva2UpLnJlZHVjZSgoZGVmLCBrKSA9PiB7XG4gICAgICBkZWZba10gPSBbe1xuICAgICAgICB0ZXN0OiBbXG4gICAgICAgICAgeGkgIT09IG51bGwgJiYgYCR7bmFtZX1feFswXSAhPT0gJHtuYW1lfV94WzFdYCxcbiAgICAgICAgICB5aSAhPSBudWxsICYmIGAke25hbWV9X3lbMF0gIT09ICR7bmFtZX1feVsxXWAsXG4gICAgICAgIF0uZmlsdGVyKHggPT4geCkuam9pbignICYmICcpLFxuICAgICAgICB2YWx1ZTogc3Ryb2tlW2tdXG4gICAgICB9LCB7dmFsdWU6IG51bGx9XTtcbiAgICAgIHJldHVybiBkZWY7XG4gICAgfSwge30pO1xuXG4gICAgcmV0dXJuIFt7XG4gICAgICBuYW1lOiBuYW1lICsgQlJVU0ggKyAnX2JnJyxcbiAgICAgIHR5cGU6ICdyZWN0JyxcbiAgICAgIGNsaXA6IHRydWUsXG4gICAgICBlbmNvZGU6IHtcbiAgICAgICAgZW50ZXI6IHtcbiAgICAgICAgICBmaWxsOiB7dmFsdWU6IGZpbGx9LFxuICAgICAgICAgIGZpbGxPcGFjaXR5OiB7dmFsdWU6IGZpbGxPcGFjaXR5fVxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGU6IHVwZGF0ZVxuICAgICAgfVxuICAgIH0gYXMgYW55XS5jb25jYXQobWFya3MsIHtcbiAgICAgIG5hbWU6IG5hbWUgKyBCUlVTSCxcbiAgICAgIHR5cGU6ICdyZWN0JyxcbiAgICAgIGNsaXA6IHRydWUsXG4gICAgICBlbmNvZGU6IHtcbiAgICAgICAgZW50ZXI6IHtcbiAgICAgICAgICBmaWxsOiB7dmFsdWU6ICd0cmFuc3BhcmVudCd9XG4gICAgICAgIH0sXG4gICAgICAgIHVwZGF0ZTogey4uLnVwZGF0ZSwgLi4udmdTdHJva2V9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn07XG5leHBvcnQgZGVmYXVsdCBpbnRlcnZhbDtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2aXN1YWwgYW5kIGRhdGEgc2lnbmFscyBmb3IgYW4gaW50ZXJ2YWwgc2VsZWN0aW9uLlxuICovXG5mdW5jdGlvbiBjaGFubmVsU2lnbmFscyhtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIGNoYW5uZWw6ICd4J3wneScpOiBhbnkge1xuICBjb25zdCB2bmFtZSA9IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsICd2aXN1YWwnKTtcbiAgY29uc3QgZG5hbWUgPSBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCAnZGF0YScpO1xuICBjb25zdCBoYXNTY2FsZXMgPSBzY2FsZXMuaGFzKHNlbENtcHQpO1xuICBjb25zdCBzY2FsZU5hbWUgPSBtb2RlbC5zY2FsZU5hbWUoY2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlU3RyID0gc3RyaW5nVmFsdWUoc2NhbGVOYW1lKTtcbiAgY29uc3Qgc2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcbiAgY29uc3Qgc2NhbGVUeXBlID0gc2NhbGUgPyBzY2FsZS5nZXQoJ3R5cGUnKSA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2l6ZSA9IG1vZGVsLmdldFNpemVTaWduYWxSZWYoY2hhbm5lbCA9PT0gWCA/ICd3aWR0aCcgOiAnaGVpZ2h0Jykuc2lnbmFsO1xuICBjb25zdCBjb29yZCA9IGAke2NoYW5uZWx9KHVuaXQpYDtcblxuICBjb25zdCBvbiA9IGV2ZW50cyhzZWxDbXB0LCBmdW5jdGlvbihkZWY6IGFueVtdLCBldnQ6IFZnRXZlbnRTdHJlYW0pIHtcbiAgICByZXR1cm4gZGVmLmNvbmNhdChcbiAgICAgIHtldmVudHM6IGV2dC5iZXR3ZWVuWzBdLCB1cGRhdGU6IGBbJHtjb29yZH0sICR7Y29vcmR9XWB9LCAgICAgICAgICAgLy8gQnJ1c2ggU3RhcnRcbiAgICAgIHtldmVudHM6IGV2dCwgdXBkYXRlOiBgWyR7dm5hbWV9WzBdLCBjbGFtcCgke2Nvb3JkfSwgMCwgJHtzaXplfSldYH0gLy8gQnJ1c2ggRW5kXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gUmVhY3QgdG8gcGFuL3pvb21zIG9mIGNvbnRpbnVvdXMgc2NhbGVzLiBOb24tY29udGludW91cyBzY2FsZXNcbiAgLy8gKGJpbi1saW5lYXIsIGJhbmQsIHBvaW50KSBjYW5ub3QgYmUgcGFuL3pvb21lZCBhbmQgYW55IG90aGVyIGNoYW5nZXNcbiAgLy8gdG8gdGhlaXIgZG9tYWlucyAoZS5nLiwgZmlsdGVyaW5nKSBzaG91bGQgY2xlYXIgdGhlIGJydXNoZXMuXG4gIG9uLnB1c2goe1xuICAgIGV2ZW50czoge3NpZ25hbDogc2VsQ21wdC5uYW1lICsgU0NBTEVfVFJJR0dFUn0sXG4gICAgdXBkYXRlOiBoYXNDb250aW51b3VzRG9tYWluKHNjYWxlVHlwZSkgJiYgIWlzQmluU2NhbGUoc2NhbGVUeXBlKSA/XG4gICAgICBgW3NjYWxlKCR7c2NhbGVTdHJ9LCAke2RuYW1lfVswXSksIHNjYWxlKCR7c2NhbGVTdHJ9LCAke2RuYW1lfVsxXSldYCA6IGBbMCwgMF1gXG4gIH0pO1xuXG4gIHJldHVybiBoYXNTY2FsZXMgPyBbe25hbWU6IGRuYW1lLCBvbjogW119XSA6IFt7XG4gICAgbmFtZTogdm5hbWUsIHZhbHVlOiBbXSwgb246IG9uXG4gIH0sIHtcbiAgICBuYW1lOiBkbmFtZSxcbiAgICBvbjogW3tldmVudHM6IHtzaWduYWw6IHZuYW1lfSwgdXBkYXRlOiBgJHt2bmFtZX1bMF0gPT09ICR7dm5hbWV9WzFdID8gbnVsbCA6IGludmVydCgke3NjYWxlU3RyfSwgJHt2bmFtZX0pYH1dXG4gIH1dO1xufVxuXG5mdW5jdGlvbiBldmVudHMoc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBjYjogRnVuY3Rpb24pIHtcbiAgcmV0dXJuIHNlbENtcHQuZXZlbnRzLnJlZHVjZShmdW5jdGlvbihvbjogYW55W10sIGV2dDogVmdFdmVudFN0cmVhbSkge1xuICAgIGlmICghZXZ0LmJldHdlZW4pIHtcbiAgICAgIHdhcm4oYCR7ZXZ0fSBpcyBub3QgYW4gb3JkZXJlZCBldmVudCBzdHJlYW0gZm9yIGludGVydmFsIHNlbGVjdGlvbnNgKTtcbiAgICAgIHJldHVybiBvbjtcbiAgICB9XG4gICAgcmV0dXJuIGNiKG9uLCBldnQpO1xuICB9LCBbXSk7XG59XG4iXX0=","import * as log from '../../../log';\nimport { isPathMark } from '../../../mark';\nimport { positionalProjections } from '../selection';\nvar VORONOI = 'voronoi';\nvar nearest = {\n has: function (selCmpt) {\n return selCmpt.type !== 'interval' && selCmpt.nearest;\n },\n marks: function (model, selCmpt, marks) {\n var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y;\n var markType = model.mark;\n if (isPathMark(markType)) {\n log.warn(log.message.nearestNotSupportForContinuous(markType));\n return marks;\n }\n var cellDef = {\n name: model.getName(VORONOI),\n type: 'path',\n from: { data: model.getName('marks') },\n encode: {\n enter: {\n fill: { value: 'transparent' },\n strokeWidth: { value: 0.35 },\n stroke: { value: 'transparent' },\n isVoronoi: { value: true }\n }\n },\n transform: [{\n type: 'voronoi',\n x: { expr: (x || (!x && !y)) ? 'datum.datum.x || 0' : '0' },\n y: { expr: (y || (!x && !y)) ? 'datum.datum.y || 0' : '0' },\n size: [model.getSizeSignalRef('width'), model.getSizeSignalRef('height')]\n }]\n };\n var index = 0;\n var exists = false;\n marks.forEach(function (mark, i) {\n var name = mark.name || '';\n if (name === model.component.mark[0].name) {\n index = i;\n }\n else if (name.indexOf(VORONOI) >= 0) {\n exists = true;\n }\n });\n if (!exists) {\n marks.splice(index + 1, 0, cellDef);\n }\n return marks;\n }\n};\nexport default nearest;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVhcmVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL25lYXJlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkQsSUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBRTFCLElBQU0sT0FBTyxHQUFxQjtJQUNoQyxHQUFHLEVBQUUsVUFBUyxPQUFPO1FBQ25CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUN4RCxDQUFDO0lBRUQsS0FBSyxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLO1FBQzdCLElBQUEsbUNBQXVDLEVBQXRDLFFBQUMsRUFBRSxRQUFDLENBQW1DO1FBQzlDLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDL0QsT0FBTyxLQUFLLENBQUM7U0FDZDtRQUVELElBQU0sT0FBTyxHQUFHO1lBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzVCLElBQUksRUFBRSxNQUFNO1lBQ1osSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUM7WUFDcEMsTUFBTSxFQUFFO2dCQUNOLEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDO29CQUM1QixXQUFXLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDO29CQUMxQixNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDO29CQUM5QixTQUFTLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDO2lCQUN6QjthQUNGO1lBQ0QsU0FBUyxFQUFFLENBQUM7b0JBQ1YsSUFBSSxFQUFFLFNBQVM7b0JBQ2YsQ0FBQyxFQUFFLEVBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFDO29CQUN6RCxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUM7b0JBQ3pELElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQzFFLENBQUM7U0FDSCxDQUFDO1FBRUYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ25CLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFJLEVBQUUsQ0FBQztZQUNwQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksS0FBSyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3pDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDWDtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLEdBQUcsSUFBSSxDQUFDO2FBQ2Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0NBQ0YsQ0FBQztBQUVGLGVBQWUsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uLy4uL2xvZyc7XG5pbXBvcnQge2lzUGF0aE1hcmt9IGZyb20gJy4uLy4uLy4uL21hcmsnO1xuaW1wb3J0IHtwb3NpdGlvbmFsUHJvamVjdGlvbnN9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge1RyYW5zZm9ybUNvbXBpbGVyfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuXG5jb25zdCBWT1JPTk9JID0gJ3Zvcm9ub2knO1xuXG5jb25zdCBuZWFyZXN0OlRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbENtcHQpIHtcbiAgICByZXR1cm4gc2VsQ21wdC50eXBlICE9PSAnaW50ZXJ2YWwnICYmIHNlbENtcHQubmVhcmVzdDtcbiAgfSxcblxuICBtYXJrczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIG1hcmtzKSB7XG4gICAgY29uc3Qge3gsIHl9ID0gcG9zaXRpb25hbFByb2plY3Rpb25zKHNlbENtcHQpO1xuICAgIGNvbnN0IG1hcmtUeXBlID0gbW9kZWwubWFyaztcbiAgICBpZiAoaXNQYXRoTWFyayhtYXJrVHlwZSkpIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLm5lYXJlc3ROb3RTdXBwb3J0Rm9yQ29udGludW91cyhtYXJrVHlwZSkpO1xuICAgICAgcmV0dXJuIG1hcmtzO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbGxEZWYgPSB7XG4gICAgICBuYW1lOiBtb2RlbC5nZXROYW1lKFZPUk9OT0kpLFxuICAgICAgdHlwZTogJ3BhdGgnLFxuICAgICAgZnJvbToge2RhdGE6IG1vZGVsLmdldE5hbWUoJ21hcmtzJyl9LFxuICAgICAgZW5jb2RlOiB7XG4gICAgICAgIGVudGVyOiB7XG4gICAgICAgICAgZmlsbDoge3ZhbHVlOiAndHJhbnNwYXJlbnQnfSxcbiAgICAgICAgICBzdHJva2VXaWR0aDoge3ZhbHVlOiAwLjM1fSxcbiAgICAgICAgICBzdHJva2U6IHt2YWx1ZTogJ3RyYW5zcGFyZW50J30sXG4gICAgICAgICAgaXNWb3Jvbm9pOiB7dmFsdWU6IHRydWV9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IFt7XG4gICAgICAgIHR5cGU6ICd2b3Jvbm9pJyxcbiAgICAgICAgeDoge2V4cHI6ICh4IHx8ICgheCAmJiAheSkpID8gJ2RhdHVtLmRhdHVtLnggfHwgMCcgOiAnMCd9LFxuICAgICAgICB5OiB7ZXhwcjogKHkgfHwgKCF4ICYmICF5KSkgPyAnZGF0dW0uZGF0dW0ueSB8fCAwJyA6ICcwJ30sXG4gICAgICAgIHNpemU6IFttb2RlbC5nZXRTaXplU2lnbmFsUmVmKCd3aWR0aCcpLCBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKCdoZWlnaHQnKV1cbiAgICAgIH1dXG4gICAgfTtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgbGV0IGV4aXN0cyA9IGZhbHNlO1xuICAgIG1hcmtzLmZvckVhY2goKG1hcmssIGkpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSBtYXJrLm5hbWUgfHwgJyc7XG4gICAgICBpZiAobmFtZSA9PT0gbW9kZWwuY29tcG9uZW50Lm1hcmtbMF0ubmFtZSkge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICB9IGVsc2UgaWYgKG5hbWUuaW5kZXhPZihWT1JPTk9JKSA+PSAwKSB7XG4gICAgICAgIGV4aXN0cyA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgbWFya3Muc3BsaWNlKGluZGV4ICsgMSwgMCwgY2VsbERlZik7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmtzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZWFyZXN0O1xuIl19","import { stringValue } from 'vega-util';\nimport { accessPathWithDatum } from '../../util';\nimport { TUPLE, unitName } from './selection';\nimport nearest from './transforms/nearest';\nexport function signals(model, selCmpt) {\n var proj = selCmpt.project;\n var datum = nearest.has(selCmpt) ?\n '(item().isVoronoi ? datum.datum : datum)' : 'datum';\n var bins = [];\n var encodings = proj.map(function (p) { return stringValue(p.channel); }).filter(function (e) { return e; }).join(', ');\n var fields = proj.map(function (p) { return stringValue(p.field); }).join(', ');\n var values = proj.map(function (p) {\n var channel = p.channel;\n var fieldDef = model.fieldDef(channel);\n // Binned fields should capture extents, for a range test against the raw field.\n return (fieldDef && fieldDef.bin) ? (bins.push(p.field),\n \"[\" + accessPathWithDatum(model.vgField(channel, {}), datum) + \", \" +\n (accessPathWithDatum(model.vgField(channel, { binSuffix: 'end' }), datum) + \"]\")) :\n \"\" + accessPathWithDatum(p.field, datum);\n }).join(', ');\n // Only add a discrete selection to the store if a datum is present _and_\n // the interaction isn't occurring on a group mark. This guards against\n // polluting interactive state with invalid values in faceted displays\n // as the group marks are also data-driven. We force the update to account\n // for constant null states but varying toggles (e.g., shift-click in\n // whitespace followed by a click in whitespace; the store should only\n // be cleared on the second click).\n return [{\n name: selCmpt.name + TUPLE,\n value: {},\n on: [{\n events: selCmpt.events,\n update: \"datum && item().mark.marktype !== 'group' ? \" +\n (\"{unit: \" + unitName(model) + \", encodings: [\" + encodings + \"], \") +\n (\"fields: [\" + fields + \"], values: [\" + values + \"]\") +\n (bins.length ? ', ' + bins.map(function (b) { return stringValue('bin_' + b) + \": 1\"; }).join(', ') : '') +\n '} : null',\n force: true\n }]\n }];\n}\nvar multi = {\n predicate: 'vlMulti',\n scaleDomain: 'vlMultiDomain',\n signals: signals,\n modifyExpr: function (model, selCmpt) {\n var tpl = selCmpt.name + TUPLE;\n return tpl + ', ' +\n (selCmpt.resolve === 'global' ? 'null' : \"{unit: \" + unitName(model) + \"}\");\n }\n};\nexport default multi;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9zZWxlY3Rpb24vbXVsdGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUV0QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFL0MsT0FBTyxFQUF3QyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ25GLE9BQU8sT0FBTyxNQUFNLHNCQUFzQixDQUFDO0FBRTNDLE1BQU0sa0JBQWtCLEtBQWdCLEVBQUUsT0FBMkI7SUFDbkUsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUM3QixJQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbEMsMENBQTBDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUN2RCxJQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQXRCLENBQXNCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLEVBQUQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RGLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDO1FBQ3hCLElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxnRkFBZ0Y7UUFDaEYsT0FBTyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3JELE1BQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLE9BQUk7aUJBQ3ZELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQUcsQ0FBQSxDQUFDLENBQUMsQ0FBQztZQUNuRixLQUFHLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFHLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRWQseUVBQXlFO0lBQ3pFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsMEVBQTBFO0lBQzFFLHFFQUFxRTtJQUNyRSxzRUFBc0U7SUFDdEUsbUNBQW1DO0lBQ25DLE9BQU8sQ0FBQztZQUNOLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUs7WUFDMUIsS0FBSyxFQUFFLEVBQUU7WUFDVCxFQUFFLEVBQUUsQ0FBQztvQkFDSCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLE1BQU0sRUFBRSw4Q0FBOEM7eUJBQ3BELFlBQVUsUUFBUSxDQUFDLEtBQUssQ0FBQyxzQkFBaUIsU0FBUyxRQUFLLENBQUE7eUJBQ3hELGNBQVksTUFBTSxvQkFBZSxNQUFNLE1BQUcsQ0FBQTt3QkFDMUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFHLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQUssRUFBL0IsQ0FBK0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUN2RixVQUFVO29CQUNaLEtBQUssRUFBRSxJQUFJO2lCQUNaLENBQUM7U0FDSCxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsSUFBTSxLQUFLLEdBQXFCO0lBQzlCLFNBQVMsRUFBRSxTQUFTO0lBQ3BCLFdBQVcsRUFBRSxlQUFlO0lBRTVCLE9BQU8sRUFBRSxPQUFPO0lBRWhCLFVBQVUsRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPO1FBQ2pDLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxHQUFHLElBQUk7WUFDZixDQUFDLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFlBQVUsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFHLENBQUMsQ0FBQztJQUMzRSxDQUFDO0NBQ0YsQ0FBQztBQUVGLGVBQWUsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcblxuaW1wb3J0IHthY2Nlc3NQYXRoV2l0aERhdHVtfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7U2VsZWN0aW9uQ29tcGlsZXIsIFNlbGVjdGlvbkNvbXBvbmVudCwgVFVQTEUsIHVuaXROYW1lfSBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgbmVhcmVzdCBmcm9tICcuL3RyYW5zZm9ybXMvbmVhcmVzdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaWduYWxzKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCkge1xuICBjb25zdCBwcm9qID0gc2VsQ21wdC5wcm9qZWN0O1xuICBjb25zdCBkYXR1bSA9IG5lYXJlc3QuaGFzKHNlbENtcHQpID9cbiAgICAnKGl0ZW0oKS5pc1Zvcm9ub2kgPyBkYXR1bS5kYXR1bSA6IGRhdHVtKScgOiAnZGF0dW0nO1xuICBjb25zdCBiaW5zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBlbmNvZGluZ3MgPSBwcm9qLm1hcCgocCkgPT4gc3RyaW5nVmFsdWUocC5jaGFubmVsKSkuZmlsdGVyKChlKSA9PiBlKS5qb2luKCcsICcpO1xuICBjb25zdCBmaWVsZHMgPSBwcm9qLm1hcCgocCkgPT4gc3RyaW5nVmFsdWUocC5maWVsZCkpLmpvaW4oJywgJyk7XG4gIGNvbnN0IHZhbHVlcyA9IHByb2oubWFwKChwKSA9PiB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHAuY2hhbm5lbDtcbiAgICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICAgIC8vIEJpbm5lZCBmaWVsZHMgc2hvdWxkIGNhcHR1cmUgZXh0ZW50cywgZm9yIGEgcmFuZ2UgdGVzdCBhZ2FpbnN0IHRoZSByYXcgZmllbGQuXG4gICAgcmV0dXJuIChmaWVsZERlZiAmJiBmaWVsZERlZi5iaW4pID8gKGJpbnMucHVzaChwLmZpZWxkKSxcbiAgICAgIGBbJHthY2Nlc3NQYXRoV2l0aERhdHVtKG1vZGVsLnZnRmllbGQoY2hhbm5lbCwge30pLCBkYXR1bSl9LCBgICtcbiAgICAgICAgICBgJHthY2Nlc3NQYXRoV2l0aERhdHVtKG1vZGVsLnZnRmllbGQoY2hhbm5lbCwge2JpblN1ZmZpeDogJ2VuZCd9KSwgZGF0dW0pfV1gKSA6XG4gICAgICBgJHthY2Nlc3NQYXRoV2l0aERhdHVtKHAuZmllbGQsIGRhdHVtKX1gO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIC8vIE9ubHkgYWRkIGEgZGlzY3JldGUgc2VsZWN0aW9uIHRvIHRoZSBzdG9yZSBpZiBhIGRhdHVtIGlzIHByZXNlbnQgX2FuZF9cbiAgLy8gdGhlIGludGVyYWN0aW9uIGlzbid0IG9jY3VycmluZyBvbiBhIGdyb3VwIG1hcmsuIFRoaXMgZ3VhcmRzIGFnYWluc3RcbiAgLy8gcG9sbHV0aW5nIGludGVyYWN0aXZlIHN0YXRlIHdpdGggaW52YWxpZCB2YWx1ZXMgaW4gZmFjZXRlZCBkaXNwbGF5c1xuICAvLyBhcyB0aGUgZ3JvdXAgbWFya3MgYXJlIGFsc28gZGF0YS1kcml2ZW4uIFdlIGZvcmNlIHRoZSB1cGRhdGUgdG8gYWNjb3VudFxuICAvLyBmb3IgY29uc3RhbnQgbnVsbCBzdGF0ZXMgYnV0IHZhcnlpbmcgdG9nZ2xlcyAoZS5nLiwgc2hpZnQtY2xpY2sgaW5cbiAgLy8gd2hpdGVzcGFjZSBmb2xsb3dlZCBieSBhIGNsaWNrIGluIHdoaXRlc3BhY2U7IHRoZSBzdG9yZSBzaG91bGQgb25seVxuICAvLyBiZSBjbGVhcmVkIG9uIHRoZSBzZWNvbmQgY2xpY2spLlxuICByZXR1cm4gW3tcbiAgICBuYW1lOiBzZWxDbXB0Lm5hbWUgKyBUVVBMRSxcbiAgICB2YWx1ZToge30sXG4gICAgb246IFt7XG4gICAgICBldmVudHM6IHNlbENtcHQuZXZlbnRzLFxuICAgICAgdXBkYXRlOiBgZGF0dW0gJiYgaXRlbSgpLm1hcmsubWFya3R5cGUgIT09ICdncm91cCcgPyBgICtcbiAgICAgICAgYHt1bml0OiAke3VuaXROYW1lKG1vZGVsKX0sIGVuY29kaW5nczogWyR7ZW5jb2RpbmdzfV0sIGAgK1xuICAgICAgICBgZmllbGRzOiBbJHtmaWVsZHN9XSwgdmFsdWVzOiBbJHt2YWx1ZXN9XWAgK1xuICAgICAgICAoYmlucy5sZW5ndGggPyAnLCAnICsgYmlucy5tYXAoKGIpID0+IGAke3N0cmluZ1ZhbHVlKCdiaW5fJyArIGIpfTogMWApLmpvaW4oJywgJykgOiAnJykgK1xuICAgICAgICAnfSA6IG51bGwnLFxuICAgICAgZm9yY2U6IHRydWVcbiAgICB9XVxuICB9XTtcbn1cblxuY29uc3QgbXVsdGk6U2VsZWN0aW9uQ29tcGlsZXIgPSB7XG4gIHByZWRpY2F0ZTogJ3ZsTXVsdGknLFxuICBzY2FsZURvbWFpbjogJ3ZsTXVsdGlEb21haW4nLFxuXG4gIHNpZ25hbHM6IHNpZ25hbHMsXG5cbiAgbW9kaWZ5RXhwcjogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQpIHtcbiAgICBjb25zdCB0cGwgPSBzZWxDbXB0Lm5hbWUgKyBUVVBMRTtcbiAgICByZXR1cm4gdHBsICsgJywgJyArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/ICdudWxsJyA6IGB7dW5pdDogJHt1bml0TmFtZShtb2RlbCl9fWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtdWx0aTtcbiJdfQ==","import { stringValue } from 'vega-util';\nimport { signals as multiSignals } from './multi';\nimport { STORE, TUPLE, unitName } from './selection';\nvar single = {\n predicate: 'vlSingle',\n scaleDomain: 'vlSingleDomain',\n signals: multiSignals,\n topLevelSignals: function (model, selCmpt, signals) {\n var hasSignal = signals.filter(function (s) { return s.name === selCmpt.name; });\n var data = \"data(\" + stringValue(selCmpt.name + STORE) + \")\";\n var values = data + \"[0].values\";\n return hasSignal.length ? signals : signals.concat({\n name: selCmpt.name,\n update: data + \".length && {\" +\n selCmpt.project.map(function (p, i) { return p.field + \": \" + values + \"[\" + i + \"]\"; }).join(', ') + '}'\n });\n },\n modifyExpr: function (model, selCmpt) {\n var tpl = selCmpt.name + TUPLE;\n return tpl + ', ' +\n (selCmpt.resolve === 'global' ? 'true' : \"{unit: \" + unitName(model) + \"}\");\n }\n};\nexport default single;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NpbmdsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBQyxPQUFPLElBQUksWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ2hELE9BQU8sRUFBb0IsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHdEUsSUFBTSxNQUFNLEdBQXFCO0lBQy9CLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFdBQVcsRUFBRSxnQkFBZ0I7SUFFN0IsT0FBTyxFQUFFLFlBQVk7SUFFckIsZUFBZSxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPO1FBQy9DLElBQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEVBQXZCLENBQXVCLENBQUMsQ0FBQztRQUNqRSxJQUFNLElBQUksR0FBRyxVQUFRLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFHLENBQUM7UUFDMUQsSUFBTSxNQUFNLEdBQU0sSUFBSSxlQUFZLENBQUM7UUFDbkMsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE1BQU0sRUFBSyxJQUFJLGlCQUFjO2dCQUMzQixPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDLElBQUssT0FBRyxDQUFDLENBQUMsS0FBSyxVQUFLLE1BQU0sU0FBSSxDQUFDLE1BQUcsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHO1NBQ2hGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTztRQUNqQyxJQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNqQyxPQUFPLEdBQUcsR0FBRyxJQUFJO1lBQ2YsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFVLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGLENBQUM7QUFFRixlQUFlLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c3RyaW5nVmFsdWV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5cbmltcG9ydCB7c2lnbmFscyBhcyBtdWx0aVNpZ25hbHN9IGZyb20gJy4vbXVsdGknO1xuaW1wb3J0IHtTZWxlY3Rpb25Db21waWxlciwgU1RPUkUsIFRVUExFLCB1bml0TmFtZX0gZnJvbSAnLi9zZWxlY3Rpb24nO1xuXG5cbmNvbnN0IHNpbmdsZTpTZWxlY3Rpb25Db21waWxlciA9IHtcbiAgcHJlZGljYXRlOiAndmxTaW5nbGUnLFxuICBzY2FsZURvbWFpbjogJ3ZsU2luZ2xlRG9tYWluJyxcblxuICBzaWduYWxzOiBtdWx0aVNpZ25hbHMsXG5cbiAgdG9wTGV2ZWxTaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIGNvbnN0IGhhc1NpZ25hbCA9IHNpZ25hbHMuZmlsdGVyKChzKSA9PiBzLm5hbWUgPT09IHNlbENtcHQubmFtZSk7XG4gICAgY29uc3QgZGF0YSA9IGBkYXRhKCR7c3RyaW5nVmFsdWUoc2VsQ21wdC5uYW1lICsgU1RPUkUpfSlgO1xuICAgIGNvbnN0IHZhbHVlcyA9IGAke2RhdGF9WzBdLnZhbHVlc2A7XG4gICAgcmV0dXJuIGhhc1NpZ25hbC5sZW5ndGggPyBzaWduYWxzIDogc2lnbmFscy5jb25jYXQoe1xuICAgICAgbmFtZTogc2VsQ21wdC5uYW1lLFxuICAgICAgdXBkYXRlOiBgJHtkYXRhfS5sZW5ndGggJiYge2AgK1xuICAgICAgICBzZWxDbXB0LnByb2plY3QubWFwKChwLCBpKSA9PiBgJHtwLmZpZWxkfTogJHt2YWx1ZXN9WyR7aX1dYCkuam9pbignLCAnKSArICd9J1xuICAgIH0pO1xuICB9LFxuXG4gIG1vZGlmeUV4cHI6IGZ1bmN0aW9uKG1vZGVsLCBzZWxDbXB0KSB7XG4gICAgY29uc3QgdHBsID0gc2VsQ21wdC5uYW1lICsgVFVQTEU7XG4gICAgcmV0dXJuIHRwbCArICcsICcgK1xuICAgICAgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgPyAndHJ1ZScgOiBge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfX1gKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2luZ2xlO1xuIl19","import { stringValue } from 'vega-util';\nimport { accessPathWithDatum, varName } from '../../../util';\nimport { TUPLE } from '../selection';\nimport nearest from './nearest';\nvar inputBindings = {\n has: function (selCmpt) {\n return selCmpt.type === 'single' && selCmpt.resolve === 'global' &&\n selCmpt.bind && selCmpt.bind !== 'scales';\n },\n topLevelSignals: function (model, selCmpt, signals) {\n var name = selCmpt.name;\n var proj = selCmpt.project;\n var bind = selCmpt.bind;\n var datum = nearest.has(selCmpt) ?\n '(item().isVoronoi ? datum.datum : datum)' : 'datum';\n proj.forEach(function (p) {\n var sgname = varName(name + \"_\" + p.field);\n var hasSignal = signals.filter(function (s) { return s.name === sgname; });\n if (!hasSignal.length) {\n signals.unshift({\n name: sgname,\n value: '',\n on: [{\n events: selCmpt.events,\n update: \"datum && item().mark.marktype !== 'group' ? \" + accessPathWithDatum(p.field, datum) + \" : null\"\n }],\n bind: bind[p.field] || bind[p.channel] || bind\n });\n }\n });\n return signals;\n },\n signals: function (model, selCmpt, signals) {\n var name = selCmpt.name;\n var proj = selCmpt.project;\n var signal = signals.filter(function (s) { return s.name === name + TUPLE; })[0];\n var fields = proj.map(function (p) { return stringValue(p.field); }).join(', ');\n var values = proj.map(function (p) { return varName(name + \"_\" + p.field); });\n if (values.length) {\n signal.update = values.join(' && ') + \" ? {fields: [\" + fields + \"], values: [\" + values.join(', ') + \"]} : null\";\n }\n delete signal.value;\n delete signal.on;\n return signals;\n }\n};\nexport default inputBindings;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvaW5wdXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUloQyxJQUFNLGFBQWEsR0FBcUI7SUFDdEMsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxPQUFPLEtBQUssUUFBUTtZQUM5RCxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFRCxlQUFlLEVBQUUsVUFBUyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU87UUFDL0MsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMxQixJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLDBDQUEwQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFFdkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFTLENBQUM7WUFDckIsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFJLElBQUksU0FBSSxDQUFDLENBQUMsS0FBTyxDQUFDLENBQUM7WUFDN0MsSUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFqQixDQUFpQixDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUM7b0JBQ2QsSUFBSSxFQUFFLE1BQU07b0JBQ1osS0FBSyxFQUFFLEVBQUU7b0JBQ1QsRUFBRSxFQUFFLENBQUM7NEJBQ0gsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNOzRCQUN0QixNQUFNLEVBQUUsaURBQStDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLFlBQVM7eUJBQ3BHLENBQUM7b0JBQ0YsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJO2lCQUMvQyxDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxHQUFHLEtBQUssRUFBdkIsQ0FBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFwQixDQUFvQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hFLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUksSUFBSSxTQUFJLENBQUMsQ0FBQyxLQUFPLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDO1FBRTlELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUNqQixNQUFNLENBQUMsTUFBTSxHQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFnQixNQUFNLG9CQUFlLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQVcsQ0FBQztTQUN6RztRQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQztRQUNwQixPQUFPLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFFakIsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGLENBQUM7QUFFRixlQUFlLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c3RyaW5nVmFsdWV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge2FjY2Vzc1BhdGhXaXRoRGF0dW0sIHZhck5hbWV9IGZyb20gJy4uLy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtUVVBMRX0gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCBuZWFyZXN0IGZyb20gJy4vbmVhcmVzdCc7XG5pbXBvcnQge1RyYW5zZm9ybUNvbXBpbGVyfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuXG5cbmNvbnN0IGlucHV0QmluZGluZ3M6VHJhbnNmb3JtQ29tcGlsZXIgPSB7XG4gIGhhczogZnVuY3Rpb24oc2VsQ21wdCkge1xuICAgIHJldHVybiBzZWxDbXB0LnR5cGUgPT09ICdzaW5nbGUnICYmIHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgJiZcbiAgICAgIHNlbENtcHQuYmluZCAmJiBzZWxDbXB0LmJpbmQgIT09ICdzY2FsZXMnO1xuICB9LFxuXG4gIHRvcExldmVsU2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IHByb2ogPSBzZWxDbXB0LnByb2plY3Q7XG4gICAgY29uc3QgYmluZCA9IHNlbENtcHQuYmluZDtcbiAgICBjb25zdCBkYXR1bSA9IG5lYXJlc3QuaGFzKHNlbENtcHQpID9cbiAgICAgICcoaXRlbSgpLmlzVm9yb25vaSA/IGRhdHVtLmRhdHVtIDogZGF0dW0pJyA6ICdkYXR1bSc7XG5cbiAgICBwcm9qLmZvckVhY2goZnVuY3Rpb24ocCkge1xuICAgICAgY29uc3Qgc2duYW1lID0gdmFyTmFtZShgJHtuYW1lfV8ke3AuZmllbGR9YCk7XG4gICAgICBjb25zdCBoYXNTaWduYWwgPSBzaWduYWxzLmZpbHRlcigocykgPT4gcy5uYW1lID09PSBzZ25hbWUpO1xuICAgICAgaWYgKCFoYXNTaWduYWwubGVuZ3RoKSB7XG4gICAgICAgIHNpZ25hbHMudW5zaGlmdCh7XG4gICAgICAgICAgbmFtZTogc2duYW1lLFxuICAgICAgICAgIHZhbHVlOiAnJyxcbiAgICAgICAgICBvbjogW3tcbiAgICAgICAgICAgIGV2ZW50czogc2VsQ21wdC5ldmVudHMsXG4gICAgICAgICAgICB1cGRhdGU6IGBkYXR1bSAmJiBpdGVtKCkubWFyay5tYXJrdHlwZSAhPT0gJ2dyb3VwJyA/ICR7YWNjZXNzUGF0aFdpdGhEYXR1bShwLmZpZWxkLCBkYXR1bSl9IDogbnVsbGBcbiAgICAgICAgICB9XSxcbiAgICAgICAgICBiaW5kOiBiaW5kW3AuZmllbGRdIHx8IGJpbmRbcC5jaGFubmVsXSB8fCBiaW5kXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ25hbHM7XG4gIH0sXG5cbiAgc2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IHByb2ogPSBzZWxDbXB0LnByb2plY3Q7XG4gICAgY29uc3Qgc2lnbmFsID0gc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gbmFtZSArIFRVUExFKVswXTtcbiAgICBjb25zdCBmaWVsZHMgPSBwcm9qLm1hcCgocCkgPT4gc3RyaW5nVmFsdWUocC5maWVsZCkpLmpvaW4oJywgJyk7XG4gICAgY29uc3QgdmFsdWVzID0gcHJvai5tYXAoKHApID0+IHZhck5hbWUoYCR7bmFtZX1fJHtwLmZpZWxkfWApKTtcblxuICAgIGlmICh2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICBzaWduYWwudXBkYXRlID0gYCR7dmFsdWVzLmpvaW4oJyAmJiAnKX0gPyB7ZmllbGRzOiBbJHtmaWVsZHN9XSwgdmFsdWVzOiBbJHt2YWx1ZXMuam9pbignLCAnKX1dfSA6IG51bGxgO1xuICAgIH1cblxuICAgIGRlbGV0ZSBzaWduYWwudmFsdWU7XG4gICAgZGVsZXRlIHNpZ25hbC5vbjtcblxuICAgIHJldHVybiBzaWduYWxzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbnB1dEJpbmRpbmdzO1xuIl19","import * as log from '../../../log';\nimport { keys } from '../../../util';\nimport { TimeUnitNode } from '../../data/timeunit';\nvar project = {\n has: function (selDef) {\n var def = selDef;\n return def.fields !== undefined || def.encodings !== undefined;\n },\n parse: function (model, selDef, selCmpt) {\n var channels = {};\n var timeUnits = {};\n // TODO: find a possible channel mapping for these fields.\n (selDef.fields || []).forEach(function (field) { return channels[field] = null; });\n (selDef.encodings || []).forEach(function (channel) {\n var fieldDef = model.fieldDef(channel);\n if (fieldDef) {\n if (fieldDef.timeUnit) {\n var tuField = model.vgField(channel);\n channels[tuField] = channel;\n // Construct TimeUnitComponents which will be combined into a\n // TimeUnitNode. This node may need to be inserted into the\n // dataflow if the selection is used across views that do not\n // have these time units defined.\n timeUnits[tuField] = {\n as: tuField,\n field: fieldDef.field,\n timeUnit: fieldDef.timeUnit\n };\n }\n else {\n channels[fieldDef.field] = channel;\n }\n }\n else {\n log.warn(log.message.cannotProjectOnChannelWithoutField(channel));\n }\n });\n var projection = selCmpt.project || (selCmpt.project = []);\n for (var field in channels) {\n if (channels.hasOwnProperty(field)) {\n projection.push({ field: field, channel: channels[field] });\n }\n }\n var fields = selCmpt.fields || (selCmpt.fields = {});\n projection.filter(function (p) { return p.channel; }).forEach(function (p) { return fields[p.channel] = p.field; });\n if (keys(timeUnits).length) {\n selCmpt.timeUnit = new TimeUnitNode(null, timeUnits);\n }\n }\n};\nexport default project;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3Byb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQW9CLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBSXBFLElBQU0sT0FBTyxHQUFzQjtJQUNqQyxHQUFHLEVBQUUsVUFBUyxNQUF5QztRQUNyRCxJQUFNLEdBQUcsR0FBRyxNQUFzQixDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7SUFDakUsQ0FBQztJQUVELEtBQUssRUFBRSxVQUFTLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTztRQUNwQyxJQUFNLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBTSxTQUFTLEdBQXVDLEVBQUUsQ0FBQztRQUV6RCwwREFBMEQ7UUFDMUQsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQUssSUFBSyxPQUFBLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQXRCLENBQXNCLENBQUMsQ0FBQztRQUVqRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsT0FBeUI7WUFDekQsSUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN6QyxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7b0JBQ3JCLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBRTVCLDZEQUE2RDtvQkFDN0QsMkRBQTJEO29CQUMzRCw2REFBNkQ7b0JBQzdELGlDQUFpQztvQkFDakMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHO3dCQUNuQixFQUFFLEVBQUUsT0FBTzt3QkFDWCxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUs7d0JBQ3JCLFFBQVEsRUFBRSxRQUFRLENBQUMsUUFBUTtxQkFDNUIsQ0FBQztpQkFDSDtxQkFBTTtvQkFDTCxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztpQkFDcEM7YUFDRjtpQkFBTTtnQkFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNuRTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0QsS0FBSyxJQUFNLEtBQUssSUFBSSxRQUFRLEVBQUU7WUFDNUIsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNsQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsQ0FBQzthQUMzRDtTQUNGO1FBRUQsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDdkQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxPQUFPLEVBQVQsQ0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUEzQixDQUEyQixDQUFDLENBQUM7UUFFaEYsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQzFCLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQ3REO0lBQ0gsQ0FBQztDQUNGLENBQUM7QUFFRixlQUFlLE9BQU8sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2luZ2xlRGVmQ2hhbm5lbH0gZnJvbSAnLi4vLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vLi4vbG9nJztcbmltcG9ydCB7U2VsZWN0aW9uRGVmfSBmcm9tICcuLi8uLi8uLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtrZXlzfSBmcm9tICcuLi8uLi8uLi91dGlsJztcbmltcG9ydCB7VGltZVVuaXRDb21wb25lbnQsIFRpbWVVbml0Tm9kZX0gZnJvbSAnLi4vLi4vZGF0YS90aW1ldW5pdCc7XG5pbXBvcnQge1NlbGVjdGlvbkNvbXBvbmVudH0gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7VHJhbnNmb3JtQ29tcGlsZXJ9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5cbmNvbnN0IHByb2plY3Q6IFRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbERlZjogU2VsZWN0aW9uQ29tcG9uZW50IHwgU2VsZWN0aW9uRGVmKSB7XG4gICAgY29uc3QgZGVmID0gc2VsRGVmIGFzIFNlbGVjdGlvbkRlZjtcbiAgICByZXR1cm4gZGVmLmZpZWxkcyAhPT0gdW5kZWZpbmVkIHx8IGRlZi5lbmNvZGluZ3MgIT09IHVuZGVmaW5lZDtcbiAgfSxcblxuICBwYXJzZTogZnVuY3Rpb24obW9kZWwsIHNlbERlZiwgc2VsQ21wdCkge1xuICAgIGNvbnN0IGNoYW5uZWxzID0ge307XG4gICAgY29uc3QgdGltZVVuaXRzOiB7W2tleTogc3RyaW5nXTogVGltZVVuaXRDb21wb25lbnR9ID0ge307XG5cbiAgICAvLyBUT0RPOiBmaW5kIGEgcG9zc2libGUgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGVzZSBmaWVsZHMuXG4gICAgKHNlbERlZi5maWVsZHMgfHwgW10pLmZvckVhY2goKGZpZWxkKSA9PiBjaGFubmVsc1tmaWVsZF0gPSBudWxsKTtcblxuICAgIChzZWxEZWYuZW5jb2RpbmdzIHx8IFtdKS5mb3JFYWNoKChjaGFubmVsOiBTaW5nbGVEZWZDaGFubmVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICAgICAgaWYgKGZpZWxkRGVmKSB7XG4gICAgICAgIGlmIChmaWVsZERlZi50aW1lVW5pdCkge1xuICAgICAgICAgIGNvbnN0IHR1RmllbGQgPSBtb2RlbC52Z0ZpZWxkKGNoYW5uZWwpO1xuICAgICAgICAgIGNoYW5uZWxzW3R1RmllbGRdID0gY2hhbm5lbDtcblxuICAgICAgICAgIC8vIENvbnN0cnVjdCBUaW1lVW5pdENvbXBvbmVudHMgd2hpY2ggd2lsbCBiZSBjb21iaW5lZCBpbnRvIGFcbiAgICAgICAgICAvLyBUaW1lVW5pdE5vZGUuIFRoaXMgbm9kZSBtYXkgbmVlZCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZVxuICAgICAgICAgIC8vIGRhdGFmbG93IGlmIHRoZSBzZWxlY3Rpb24gaXMgdXNlZCBhY3Jvc3Mgdmlld3MgdGhhdCBkbyBub3RcbiAgICAgICAgICAvLyBoYXZlIHRoZXNlIHRpbWUgdW5pdHMgZGVmaW5lZC5cbiAgICAgICAgICB0aW1lVW5pdHNbdHVGaWVsZF0gPSB7XG4gICAgICAgICAgICBhczogdHVGaWVsZCxcbiAgICAgICAgICAgIGZpZWxkOiBmaWVsZERlZi5maWVsZCxcbiAgICAgICAgICAgIHRpbWVVbml0OiBmaWVsZERlZi50aW1lVW5pdFxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2hhbm5lbHNbZmllbGREZWYuZmllbGRdID0gY2hhbm5lbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuY2Fubm90UHJvamVjdE9uQ2hhbm5lbFdpdGhvdXRGaWVsZChjaGFubmVsKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9qZWN0aW9uID0gc2VsQ21wdC5wcm9qZWN0IHx8IChzZWxDbXB0LnByb2plY3QgPSBbXSk7XG4gICAgZm9yIChjb25zdCBmaWVsZCBpbiBjaGFubmVscykge1xuICAgICAgaWYgKGNoYW5uZWxzLmhhc093blByb3BlcnR5KGZpZWxkKSkge1xuICAgICAgICBwcm9qZWN0aW9uLnB1c2goe2ZpZWxkOiBmaWVsZCwgY2hhbm5lbDogY2hhbm5lbHNbZmllbGRdfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRzID0gc2VsQ21wdC5maWVsZHMgfHwgKHNlbENtcHQuZmllbGRzID0ge30pO1xuICAgIHByb2plY3Rpb24uZmlsdGVyKChwKSA9PiBwLmNoYW5uZWwpLmZvckVhY2goKHApID0+IGZpZWxkc1twLmNoYW5uZWxdID0gcC5maWVsZCk7XG5cbiAgICBpZiAoa2V5cyh0aW1lVW5pdHMpLmxlbmd0aCkge1xuICAgICAgc2VsQ21wdC50aW1lVW5pdCA9IG5ldyBUaW1lVW5pdE5vZGUobnVsbCwgdGltZVVuaXRzKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2plY3Q7XG4iXX0=","import { TUPLE, unitName } from '../selection';\nvar TOGGLE = '_toggle';\nvar toggle = {\n has: function (selCmpt) {\n return selCmpt.type === 'multi' && selCmpt.toggle;\n },\n signals: function (model, selCmpt, signals) {\n return signals.concat({\n name: selCmpt.name + TOGGLE,\n value: false,\n on: [{ events: selCmpt.events, update: selCmpt.toggle }]\n });\n },\n modifyExpr: function (model, selCmpt, expr) {\n var tpl = selCmpt.name + TUPLE;\n var signal = selCmpt.name + TOGGLE;\n return signal + \" ? null : \" + tpl + \", \" +\n (selCmpt.resolve === 'global' ?\n signal + \" ? null : true, \" :\n signal + \" ? null : {unit: \" + unitName(model) + \"}, \") +\n (signal + \" ? \" + tpl + \" : null\");\n }\n};\nexport default toggle;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvdG9nZ2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBSTdDLElBQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQztBQUV6QixJQUFNLE1BQU0sR0FBcUI7SUFDL0IsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDcEQsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFDcEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTTtZQUMzQixLQUFLLEVBQUUsS0FBSztZQUNaLEVBQUUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQztTQUN2RCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsVUFBVSxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJO1FBQ3ZDLElBQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBRXJDLE9BQVUsTUFBTSxrQkFBYSxHQUFHLE9BQUk7WUFDbEMsQ0FBQyxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixNQUFNLHFCQUFrQixDQUFDLENBQUM7Z0JBQzFCLE1BQU0seUJBQW9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBSyxDQUFDO2FBQ2pELE1BQU0sV0FBTSxHQUFHLFlBQVMsQ0FBQSxDQUFDO0lBQ2hDLENBQUM7Q0FDRixDQUFDO0FBRUYsZUFBZSxNQUFNLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7VFVQTEUsIHVuaXROYW1lfSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtUcmFuc2Zvcm1Db21waWxlcn0gZnJvbSAnLi90cmFuc2Zvcm1zJztcblxuXG5jb25zdCBUT0dHTEUgPSAnX3RvZ2dsZSc7XG5cbmNvbnN0IHRvZ2dsZTpUcmFuc2Zvcm1Db21waWxlciA9IHtcbiAgaGFzOiBmdW5jdGlvbihzZWxDbXB0KSB7XG4gICAgcmV0dXJuIHNlbENtcHQudHlwZSA9PT0gJ211bHRpJyAmJiBzZWxDbXB0LnRvZ2dsZTtcbiAgfSxcblxuICBzaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIHJldHVybiBzaWduYWxzLmNvbmNhdCh7XG4gICAgICBuYW1lOiBzZWxDbXB0Lm5hbWUgKyBUT0dHTEUsXG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICBvbjogW3tldmVudHM6IHNlbENtcHQuZXZlbnRzLCB1cGRhdGU6IHNlbENtcHQudG9nZ2xlfV1cbiAgICB9KTtcbiAgfSxcblxuICBtb2RpZnlFeHByOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgZXhwcikge1xuICAgIGNvbnN0IHRwbCA9IHNlbENtcHQubmFtZSArIFRVUExFO1xuICAgIGNvbnN0IHNpZ25hbCA9IHNlbENtcHQubmFtZSArIFRPR0dMRTtcblxuICAgIHJldHVybiBgJHtzaWduYWx9ID8gbnVsbCA6ICR7dHBsfSwgYCArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/XG4gICAgICAgIGAke3NpZ25hbH0gPyBudWxsIDogdHJ1ZSwgYCA6XG4gICAgICAgIGAke3NpZ25hbH0gPyBudWxsIDoge3VuaXQ6ICR7dW5pdE5hbWUobW9kZWwpfX0sIGApICtcbiAgICAgIGAke3NpZ25hbH0gPyAke3RwbH0gOiBudWxsYDtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdG9nZ2xlO1xuIl19","import { selector as parseSelector } from 'vega-event-selector';\nimport { X, Y } from '../../../channel';\nimport { BRUSH as INTERVAL_BRUSH } from '../interval';\nimport { channelSignalName, positionalProjections } from '../selection';\nimport scalesCompiler, { domain } from './scales';\nvar ANCHOR = '_translate_anchor';\nvar DELTA = '_translate_delta';\nvar translate = {\n has: function (selCmpt) {\n return selCmpt.type === 'interval' && selCmpt.translate;\n },\n signals: function (model, selCmpt, signals) {\n var name = selCmpt.name;\n var hasScales = scalesCompiler.has(selCmpt);\n var anchor = name + ANCHOR;\n var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y;\n var events = parseSelector(selCmpt.translate, 'scope');\n if (!hasScales) {\n events = events.map(function (e) { return (e.between[0].markname = name + INTERVAL_BRUSH, e); });\n }\n signals.push({\n name: anchor,\n value: {},\n on: [{\n events: events.map(function (e) { return e.between[0]; }),\n update: '{x: x(unit), y: y(unit)' +\n (x !== null ? ', extent_x: ' + (hasScales ? domain(model, X) :\n \"slice(\" + channelSignalName(selCmpt, 'x', 'visual') + \")\") : '') +\n (y !== null ? ', extent_y: ' + (hasScales ? domain(model, Y) :\n \"slice(\" + channelSignalName(selCmpt, 'y', 'visual') + \")\") : '') + '}'\n }]\n }, {\n name: name + DELTA,\n value: {},\n on: [{\n events: events,\n update: \"{x: \" + anchor + \".x - x(unit), y: \" + anchor + \".y - y(unit)}\"\n }]\n });\n if (x !== null) {\n onDelta(model, selCmpt, X, 'width', signals);\n }\n if (y !== null) {\n onDelta(model, selCmpt, Y, 'height', signals);\n }\n return signals;\n }\n};\nexport default translate;\nfunction onDelta(model, selCmpt, channel, size, signals) {\n var name = selCmpt.name;\n var hasScales = scalesCompiler.has(selCmpt);\n var signal = signals.filter(function (s) {\n return s.name === channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual');\n })[0];\n var anchor = name + ANCHOR;\n var delta = name + DELTA;\n var sizeSg = model.getSizeSignalRef(size).signal;\n var scaleCmpt = model.getScaleComponent(channel);\n var scaleType = scaleCmpt.get('type');\n var sign = hasScales && channel === X ? '-' : ''; // Invert delta when panning x-scales.\n var extent = anchor + \".extent_\" + channel;\n var offset = \"\" + sign + delta + \".\" + channel + \" / \" + (hasScales ? \"\" + sizeSg : \"span(\" + extent + \")\");\n var panFn = !hasScales ? 'panLinear' :\n scaleType === 'log' ? 'panLog' :\n scaleType === 'pow' ? 'panPow' : 'panLinear';\n var update = panFn + \"(\" + extent + \", \" + offset +\n (hasScales && scaleType === 'pow' ? \", \" + (scaleCmpt.get('exponent') || 1) : '') + ')';\n signal.on.push({\n events: { signal: delta },\n update: hasScales ? update : \"clampRange(\" + update + \", 0, \" + sizeSg + \")\"\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3RyYW5zZm9ybXMvdHJhbnNsYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxRQUFRLElBQUksYUFBYSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFOUQsT0FBTyxFQUFlLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsS0FBSyxJQUFJLGNBQWMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUscUJBQXFCLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBRTFGLE9BQU8sY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSWhELElBQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDO0FBQ25DLElBQU0sS0FBSyxHQUFHLGtCQUFrQixDQUFDO0FBRWpDLElBQU0sU0FBUyxHQUFxQjtJQUNsQyxHQUFHLEVBQUUsVUFBUyxPQUFPO1FBQ25CLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsT0FBTyxFQUFFLFVBQVMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPO1FBQ3ZDLElBQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDMUIsSUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ3ZCLElBQUEsbUNBQXVDLEVBQXRDLFFBQUMsRUFBRSxRQUFDLENBQW1DO1FBQzlDLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZELElB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QUc7S0FDbkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2VsZWN0b3IgYXMgcGFyc2VTZWxlY3Rvcn0gZnJvbSAndmVnYS1ldmVudC1zZWxlY3Rvcic7XG5cbmltcG9ydCB7U2NhbGVDaGFubmVsLCBYLCBZfSBmcm9tICcuLi8uLi8uLi9jaGFubmVsJztcbmltcG9ydCB7VmdTaWduYWx9IGZyb20gJy4uLy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QlJVU0ggYXMgSU5URVJWQUxfQlJVU0h9IGZyb20gJy4uL2ludGVydmFsJztcbmltcG9ydCB7Y2hhbm5lbFNpZ25hbE5hbWUsIHBvc2l0aW9uYWxQcm9qZWN0aW9ucywgU2VsZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vLi4vLi4vdW5pdCc7XG5pbXBvcnQgc2NhbGVzQ29tcGlsZXIsIHtkb21haW59IGZyb20gJy4vc2NhbGVzJztcbmltcG9ydCB7VHJhbnNmb3JtQ29tcGlsZXJ9IGZyb20gJy4vdHJhbnNmb3Jtcyc7XG5cblxuY29uc3QgQU5DSE9SID0gJ190cmFuc2xhdGVfYW5jaG9yJztcbmNvbnN0IERFTFRBID0gJ190cmFuc2xhdGVfZGVsdGEnO1xuXG5jb25zdCB0cmFuc2xhdGU6VHJhbnNmb3JtQ29tcGlsZXIgPSB7XG4gIGhhczogZnVuY3Rpb24oc2VsQ21wdCkge1xuICAgIHJldHVybiBzZWxDbXB0LnR5cGUgPT09ICdpbnRlcnZhbCcgJiYgc2VsQ21wdC50cmFuc2xhdGU7XG4gIH0sXG5cbiAgc2lnbmFsczogZnVuY3Rpb24obW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpIHtcbiAgICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICAgIGNvbnN0IGhhc1NjYWxlcyA9IHNjYWxlc0NvbXBpbGVyLmhhcyhzZWxDbXB0KTtcbiAgICBjb25zdCBhbmNob3IgPSBuYW1lICsgQU5DSE9SO1xuICAgIGNvbnN0IHt4LCB5fSA9IHBvc2l0aW9uYWxQcm9qZWN0aW9ucyhzZWxDbXB0KTtcbiAgICBsZXQgZXZlbnRzID0gcGFyc2VTZWxlY3RvcihzZWxDbXB0LnRyYW5zbGF0ZSwgJ3Njb3BlJyk7XG5cbiAgICBpZiAoIWhhc1NjYWxlcykge1xuICAgICAgZXZlbnRzID0gZXZlbnRzLm1hcCgoZSkgPT4gKGUuYmV0d2VlblswXS5tYXJrbmFtZSA9IG5hbWUgKyBJTlRFUlZBTF9CUlVTSCwgZSkpO1xuICAgIH1cblxuICAgIHNpZ25hbHMucHVzaCh7XG4gICAgICBuYW1lOiBhbmNob3IsXG4gICAgICB2YWx1ZToge30sXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBldmVudHMubWFwKChlKSA9PiBlLmJldHdlZW5bMF0pLFxuICAgICAgICB1cGRhdGU6ICd7eDogeCh1bml0KSwgeTogeSh1bml0KScgK1xuICAgICAgICAgICh4ICE9PSBudWxsID8gJywgZXh0ZW50X3g6ICcgKyAoaGFzU2NhbGVzID8gZG9tYWluKG1vZGVsLCBYKSA6XG4gICAgICAgICAgICAgIGBzbGljZSgke2NoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsICd4JywgJ3Zpc3VhbCcpfSlgKSA6ICcnKSArXG5cbiAgICAgICAgICAoeSAhPT0gbnVsbCA/ICcsIGV4dGVudF95OiAnICsgKGhhc1NjYWxlcyA/IGRvbWFpbihtb2RlbCwgWSkgOlxuICAgICAgICAgICAgICBgc2xpY2UoJHtjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCAneScsICd2aXN1YWwnKX0pYCkgOiAnJykgKyAnfSdcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgbmFtZTogbmFtZSArIERFTFRBLFxuICAgICAgdmFsdWU6IHt9LFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czogZXZlbnRzLFxuICAgICAgICB1cGRhdGU6IGB7eDogJHthbmNob3J9LnggLSB4KHVuaXQpLCB5OiAke2FuY2hvcn0ueSAtIHkodW5pdCl9YFxuICAgICAgfV1cbiAgICB9KTtcblxuICAgIGlmICh4ICE9PSBudWxsKSB7XG4gICAgICBvbkRlbHRhKG1vZGVsLCBzZWxDbXB0LCBYLCAnd2lkdGgnLCBzaWduYWxzKTtcbiAgICB9XG5cbiAgICBpZiAoeSAhPT0gbnVsbCkge1xuICAgICAgb25EZWx0YShtb2RlbCwgc2VsQ21wdCwgWSwgJ2hlaWdodCcsIHNpZ25hbHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduYWxzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB0cmFuc2xhdGU7XG5cbmZ1bmN0aW9uIG9uRGVsdGEobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBjaGFubmVsOiBTY2FsZUNoYW5uZWwsIHNpemU6ICd3aWR0aCcgfCAnaGVpZ2h0Jywgc2lnbmFsczogVmdTaWduYWxbXSkge1xuICBjb25zdCBuYW1lID0gc2VsQ21wdC5uYW1lO1xuICBjb25zdCBoYXNTY2FsZXMgPSBzY2FsZXNDb21waWxlci5oYXMoc2VsQ21wdCk7XG4gIGNvbnN0IHNpZ25hbCA9IHNpZ25hbHMuZmlsdGVyKHMgPT4ge1xuICAgIHJldHVybiBzLm5hbWUgPT09IGNoYW5uZWxTaWduYWxOYW1lKHNlbENtcHQsIGNoYW5uZWwsIGhhc1NjYWxlcyA/ICdkYXRhJyA6ICd2aXN1YWwnKTtcbiAgfSlbMF07XG4gIGNvbnN0IGFuY2hvciA9IG5hbWUgKyBBTkNIT1I7XG4gIGNvbnN0IGRlbHRhID0gbmFtZSArIERFTFRBO1xuICBjb25zdCBzaXplU2cgPSBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKHNpemUpLnNpZ25hbDtcbiAgY29uc3Qgc2NhbGVDbXB0ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlVHlwZSA9IHNjYWxlQ21wdC5nZXQoJ3R5cGUnKTtcbiAgY29uc3Qgc2lnbiA9IGhhc1NjYWxlcyAmJiBjaGFubmVsID09PSBYID8gJy0nIDogJyc7IC8vIEludmVydCBkZWx0YSB3aGVuIHBhbm5pbmcgeC1zY2FsZXMuXG4gIGNvbnN0IGV4dGVudCA9IGAke2FuY2hvcn0uZXh0ZW50XyR7Y2hhbm5lbH1gO1xuICBjb25zdCBvZmZzZXQgPSBgJHtzaWdufSR7ZGVsdGF9LiR7Y2hhbm5lbH0gLyBgICsgKGhhc1NjYWxlcyA/IGAke3NpemVTZ31gIDogYHNwYW4oJHtleHRlbnR9KWApO1xuICBjb25zdCBwYW5GbiA9ICFoYXNTY2FsZXMgPyAncGFuTGluZWFyJyA6XG4gICAgc2NhbGVUeXBlID09PSAnbG9nJyA/ICdwYW5Mb2cnIDpcbiAgICBzY2FsZVR5cGUgPT09ICdwb3cnID8gJ3BhblBvdycgOiAncGFuTGluZWFyJztcbiAgY29uc3QgdXBkYXRlID0gYCR7cGFuRm59KCR7ZXh0ZW50fSwgJHtvZmZzZXR9YCArXG4gICAgKGhhc1NjYWxlcyAmJiBzY2FsZVR5cGUgPT09ICdwb3cnID8gYCwgJHtzY2FsZUNtcHQuZ2V0KCdleHBvbmVudCcpIHx8IDF9YCA6ICcnKSArICcpJztcblxuICBzaWduYWwub24ucHVzaCh7XG4gICAgZXZlbnRzOiB7c2lnbmFsOiBkZWx0YX0sXG4gICAgdXBkYXRlOiBoYXNTY2FsZXMgPyB1cGRhdGUgOiBgY2xhbXBSYW5nZSgke3VwZGF0ZX0sIDAsICR7c2l6ZVNnfSlgXG4gIH0pO1xufVxuIl19","import { selector as parseSelector } from 'vega-event-selector';\nimport { stringValue } from 'vega-util';\nimport { X, Y } from '../../../channel';\nimport { BRUSH as INTERVAL_BRUSH } from '../interval';\nimport { channelSignalName, positionalProjections } from '../selection';\nimport { default as scalesCompiler, domain } from './scales';\nvar ANCHOR = '_zoom_anchor';\nvar DELTA = '_zoom_delta';\nvar zoom = {\n has: function (selCmpt) {\n return selCmpt.type === 'interval' && selCmpt.zoom;\n },\n signals: function (model, selCmpt, signals) {\n var name = selCmpt.name;\n var hasScales = scalesCompiler.has(selCmpt);\n var delta = name + DELTA;\n var _a = positionalProjections(selCmpt), x = _a.x, y = _a.y;\n var sx = stringValue(model.scaleName(X));\n var sy = stringValue(model.scaleName(Y));\n var events = parseSelector(selCmpt.zoom, 'scope');\n if (!hasScales) {\n events = events.map(function (e) { return (e.markname = name + INTERVAL_BRUSH, e); });\n }\n signals.push({\n name: name + ANCHOR,\n on: [{\n events: events,\n update: !hasScales ? \"{x: x(unit), y: y(unit)}\" :\n '{' + [\n (sx ? \"x: invert(\" + sx + \", x(unit))\" : ''),\n (sy ? \"y: invert(\" + sy + \", y(unit))\" : '')\n ].filter(function (expr) { return !!expr; }).join(', ') + '}'\n }]\n }, {\n name: delta,\n on: [{\n events: events,\n force: true,\n update: 'pow(1.001, event.deltaY * pow(16, event.deltaMode))'\n }]\n });\n if (x !== null) {\n onDelta(model, selCmpt, 'x', 'width', signals);\n }\n if (y !== null) {\n onDelta(model, selCmpt, 'y', 'height', signals);\n }\n return signals;\n }\n};\nexport default zoom;\nfunction onDelta(model, selCmpt, channel, size, signals) {\n var name = selCmpt.name;\n var hasScales = scalesCompiler.has(selCmpt);\n var signal = signals.filter(function (s) {\n return s.name === channelSignalName(selCmpt, channel, hasScales ? 'data' : 'visual');\n })[0];\n var sizeSg = model.getSizeSignalRef(size).signal;\n var scaleCmpt = model.getScaleComponent(channel);\n var scaleType = scaleCmpt.get('type');\n var base = hasScales ? domain(model, channel) : signal.name;\n var delta = name + DELTA;\n var anchor = \"\" + name + ANCHOR + \".\" + channel;\n var zoomFn = !hasScales ? 'zoomLinear' :\n scaleType === 'log' ? 'zoomLog' :\n scaleType === 'pow' ? 'zoomPow' : 'zoomLinear';\n var update = zoomFn + \"(\" + base + \", \" + anchor + \", \" + delta +\n (hasScales && scaleType === 'pow' ? \", \" + (scaleCmpt.get('exponent') || 1) : '') + ')';\n signal.on.push({\n events: { signal: delta },\n update: hasScales ? update : \"clampRange(\" + update + \", 0, \" + sizeSg + \")\"\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9vbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3pvb20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBZSxDQUFDLEVBQUUsQ0FBQyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssSUFBSSxjQUFjLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFDLGlCQUFpQixFQUFFLHFCQUFxQixFQUFxQixNQUFNLGNBQWMsQ0FBQztBQUUxRixPQUFPLEVBQUMsT0FBTyxJQUFJLGNBQWMsRUFBRSxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFJM0QsSUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDO0FBQzlCLElBQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQztBQUU1QixJQUFNLElBQUksR0FBcUI7SUFDN0IsR0FBRyxFQUFFLFVBQVMsT0FBTztRQUNuQixPQUFPLE9BQU8sQ0FBQyxJQUFJLEtBQUssVUFBVSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDckQsQ0FBQztJQUVELE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTztRQUN2QyxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUMsSUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFBLG1DQUF1QyxFQUF0QyxRQUFDLEVBQUUsUUFBQyxDQUFtQztRQUM5QyxJQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsS0FBSyxD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LENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztJQUMzQixJQUFNLE1BQU0sR0FBRyxLQUFHLElBQUksR0FBRyxNQUFNLFNBQUksT0FBUyxDQUFDO0lBQzdDLElBQU0sTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4QyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxTQUFTLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNqRCxJQUFNLE1BQU0sR0FBTSxNQUFNLFNBQUksSUFBSSxVQUFLLE1BQU0sVUFBSyxLQUFPO1FBQ3JELENBQUMsU0FBUyxJQUFJLFNBQVMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQUssU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBRXhGLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2IsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztRQUN2QixNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFjLE1BQU0sYUFBUSxNQUFNLE1BQUc7S0FDbkUsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2VsZWN0b3IgYXMgcGFyc2VTZWxlY3Rvcn0gZnJvbSAndmVnYS1ldmVudC1zZWxlY3Rvcic7XG5pbXBvcnQge3N0cmluZ1ZhbHVlfSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtTY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtWZ1NpZ25hbH0gZnJvbSAnLi4vLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtCUlVTSCBhcyBJTlRFUlZBTF9CUlVTSH0gZnJvbSAnLi4vaW50ZXJ2YWwnO1xuaW1wb3J0IHtjaGFubmVsU2lnbmFsTmFtZSwgcG9zaXRpb25hbFByb2plY3Rpb25zLCBTZWxlY3Rpb25Db21wb25lbnR9IGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi8uLi8uLi91bml0JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBzY2FsZXNDb21waWxlciwgZG9tYWlufSBmcm9tICcuL3NjYWxlcyc7XG5pbXBvcnQge1RyYW5zZm9ybUNvbXBpbGVyfSBmcm9tICcuL3RyYW5zZm9ybXMnO1xuXG5cbmNvbnN0IEFOQ0hPUiA9ICdfem9vbV9hbmNob3InO1xuY29uc3QgREVMVEEgPSAnX3pvb21fZGVsdGEnO1xuXG5jb25zdCB6b29tOlRyYW5zZm9ybUNvbXBpbGVyID0ge1xuICBoYXM6IGZ1bmN0aW9uKHNlbENtcHQpIHtcbiAgICByZXR1cm4gc2VsQ21wdC50eXBlID09PSAnaW50ZXJ2YWwnICYmIHNlbENtcHQuem9vbTtcbiAgfSxcblxuICBzaWduYWxzOiBmdW5jdGlvbihtb2RlbCwgc2VsQ21wdCwgc2lnbmFscykge1xuICAgIGNvbnN0IG5hbWUgPSBzZWxDbXB0Lm5hbWU7XG4gICAgY29uc3QgaGFzU2NhbGVzID0gc2NhbGVzQ29tcGlsZXIuaGFzKHNlbENtcHQpO1xuICAgIGNvbnN0IGRlbHRhID0gbmFtZSArIERFTFRBO1xuICAgIGNvbnN0IHt4LCB5fSA9IHBvc2l0aW9uYWxQcm9qZWN0aW9ucyhzZWxDbXB0KTtcbiAgICBjb25zdCBzeCA9IHN0cmluZ1ZhbHVlKG1vZGVsLnNjYWxlTmFtZShYKSk7XG4gICAgY29uc3Qgc3kgPSBzdHJpbmdWYWx1ZShtb2RlbC5zY2FsZU5hbWUoWSkpO1xuICAgIGxldCBldmVudHMgPSBwYXJzZVNlbGVjdG9yKHNlbENtcHQuem9vbSwgJ3Njb3BlJyk7XG5cbiAgICBpZiAoIWhhc1NjYWxlcykge1xuICAgICAgZXZlbnRzID0gZXZlbnRzLm1hcCgoZSkgPT4gKGUubWFya25hbWUgPSBuYW1lICsgSU5URVJWQUxfQlJVU0gsIGUpKTtcbiAgICB9XG5cbiAgICBzaWduYWxzLnB1c2goe1xuICAgICAgbmFtZTogbmFtZSArIEFOQ0hPUixcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IGV2ZW50cyxcbiAgICAgICAgdXBkYXRlOiAhaGFzU2NhbGVzID8gYHt4OiB4KHVuaXQpLCB5OiB5KHVuaXQpfWAgOlxuICAgICAgICAgICd7JyArIFtcbiAgICAgICAgICAgIChzeCA/IGB4OiBpbnZlcnQoJHtzeH0sIHgodW5pdCkpYCA6ICcnKSxcbiAgICAgICAgICAgIChzeSA/IGB5OiBpbnZlcnQoJHtzeX0sIHkodW5pdCkpYCA6ICcnKVxuICAgICAgICAgIF0uZmlsdGVyKChleHByKSA9PiAhIWV4cHIpLmpvaW4oJywgJykgKyAnfSdcbiAgICAgIH1dXG4gICAgfSwge1xuICAgICAgbmFtZTogZGVsdGEsXG4gICAgICBvbjogW3tcbiAgICAgICAgZXZlbnRzOiBldmVudHMsXG4gICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICB1cGRhdGU6ICdwb3coMS4wMDEsIGV2ZW50LmRlbHRhWSAqIHBvdygxNiwgZXZlbnQuZGVsdGFNb2RlKSknXG4gICAgICB9XVxuICAgIH0pO1xuXG4gICAgaWYgKHggIT09IG51bGwpIHtcbiAgICAgIG9uRGVsdGEobW9kZWwsIHNlbENtcHQsICd4JywgJ3dpZHRoJywgc2lnbmFscyk7XG4gICAgfVxuXG4gICAgaWYgKHkgIT09IG51bGwpIHtcbiAgICAgIG9uRGVsdGEobW9kZWwsIHNlbENtcHQsICd5JywgJ2hlaWdodCcsIHNpZ25hbHMpO1xuICAgIH1cblxuICAgIHJldHVybiBzaWduYWxzO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB6b29tO1xuXG5mdW5jdGlvbiBvbkRlbHRhKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgY2hhbm5lbDogU2NhbGVDaGFubmVsLCBzaXplOiAnd2lkdGgnIHwgJ2hlaWdodCcsIHNpZ25hbHM6IFZnU2lnbmFsW10pIHtcbiAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgY29uc3QgaGFzU2NhbGVzID0gc2NhbGVzQ29tcGlsZXIuaGFzKHNlbENtcHQpO1xuICBjb25zdCBzaWduYWwgPSBzaWduYWxzLmZpbHRlcihzID0+IHtcbiAgICByZXR1cm4gcy5uYW1lID09PSBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0LCBjaGFubmVsLCBoYXNTY2FsZXMgPyAnZGF0YScgOiAndmlzdWFsJyk7XG4gIH0pWzBdO1xuICBjb25zdCBzaXplU2cgPSBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKHNpemUpLnNpZ25hbDtcbiAgY29uc3Qgc2NhbGVDbXB0ID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCk7XG4gIGNvbnN0IHNjYWxlVHlwZSA9IHNjYWxlQ21wdC5nZXQoJ3R5cGUnKTtcbiAgY29uc3QgYmFzZSA9IGhhc1NjYWxlcyA/IGRvbWFpbihtb2RlbCwgY2hhbm5lbCkgOiBzaWduYWwubmFtZTtcbiAgY29uc3QgZGVsdGEgPSBuYW1lICsgREVMVEE7XG4gIGNvbnN0IGFuY2hvciA9IGAke25hbWV9JHtBTkNIT1J9LiR7Y2hhbm5lbH1gO1xuICBjb25zdCB6b29tRm4gPSAhaGFzU2NhbGVzID8gJ3pvb21MaW5lYXInIDpcbiAgICBzY2FsZVR5cGUgPT09ICdsb2cnID8gJ3pvb21Mb2cnIDpcbiAgICBzY2FsZVR5cGUgPT09ICdwb3cnID8gJ3pvb21Qb3cnIDogJ3pvb21MaW5lYXInO1xuICBjb25zdCB1cGRhdGUgPSBgJHt6b29tRm59KCR7YmFzZX0sICR7YW5jaG9yfSwgJHtkZWx0YX1gICtcbiAgICAoaGFzU2NhbGVzICYmIHNjYWxlVHlwZSA9PT0gJ3BvdycgPyBgLCAke3NjYWxlQ21wdC5nZXQoJ2V4cG9uZW50JykgfHwgMX1gIDogJycpICsgJyknO1xuXG4gIHNpZ25hbC5vbi5wdXNoKHtcbiAgICBldmVudHM6IHtzaWduYWw6IGRlbHRhfSxcbiAgICB1cGRhdGU6IGhhc1NjYWxlcyA/IHVwZGF0ZSA6IGBjbGFtcFJhbmdlKCR7dXBkYXRlfSwgMCwgJHtzaXplU2d9KWBcbiAgfSk7XG59XG4iXX0=","import inputs from './inputs';\nimport nearest from './nearest';\nimport project from './project';\nimport scales from './scales';\nimport toggle from './toggle';\nimport translate from './translate';\nimport zoom from './zoom';\nvar compilers = { project: project, toggle: toggle, scales: scales,\n translate: translate, zoom: zoom, inputs: inputs, nearest: nearest };\nexport function forEachTransform(selCmpt, cb) {\n for (var t in compilers) {\n if (compilers[t].has(selCmpt)) {\n cb(compilers[t]);\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3Jtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21waWxlL3NlbGVjdGlvbi90cmFuc2Zvcm1zL3RyYW5zZm9ybXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUM5QixPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxPQUFPLE1BQU0sV0FBVyxDQUFDO0FBQ2hDLE9BQU8sTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUM5QixPQUFPLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFDOUIsT0FBTyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMxQixJQUFNLFNBQVMsR0FBNEIsRUFBQyxPQUFPLFNBQUEsRUFBRSxNQUFNLFFBQUEsRUFBRSxNQUFNLFFBQUE7SUFDakUsU0FBUyxXQUFBLEVBQUUsSUFBSSxNQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUUsT0FBTyxTQUFBLEVBQUMsQ0FBQztBQUVwQyxNQUFNLDJCQUEyQixPQUEyQixFQUFFLEVBQW1DO0lBQy9GLEtBQUssSUFBTSxDQUFDLElBQUksU0FBUyxFQUFFO1FBQ3pCLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM3QixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlbGVjdGlvbkRlZn0gZnJvbSAnLi4vLi4vLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7RGljdH0gZnJvbSAnLi4vLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2lnbmFsfSBmcm9tICcuLi8uLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuLi8uLi9tb2RlbCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vLi4vdW5pdCc7XG5pbXBvcnQge1NlbGVjdGlvbkNvbXBvbmVudH0gZnJvbSAnLi4vc2VsZWN0aW9uJztcblxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybUNvbXBpbGVyIHtcbiAgaGFzOiAoc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50IHwgU2VsZWN0aW9uRGVmKSA9PiBib29sZWFuO1xuICBwYXJzZT86IChtb2RlbDogVW5pdE1vZGVsLCBkZWY6IFNlbGVjdGlvbkRlZiwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50KSA9PiB2b2lkO1xuICBzaWduYWxzPzogKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgc2lnbmFsczogVmdTaWduYWxbXSkgPT4gVmdTaWduYWxbXTtcbiAgdG9wTGV2ZWxTaWduYWxzPzogKG1vZGVsOiBNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBzaWduYWxzOiBWZ1NpZ25hbFtdKSA9PiBWZ1NpZ25hbFtdO1xuICBtb2RpZnlFeHByPzogKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6IFNlbGVjdGlvbkNvbXBvbmVudCwgZXhwcjogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIG1hcmtzPzogKG1vZGVsOiBVbml0TW9kZWwsIHNlbENtcHQ6U2VsZWN0aW9uQ29tcG9uZW50LCBtYXJrczogYW55W10pID0+IGFueVtdO1xufVxuXG5pbXBvcnQgaW5wdXRzIGZyb20gJy4vaW5wdXRzJztcbmltcG9ydCBuZWFyZXN0IGZyb20gJy4vbmVhcmVzdCc7XG5pbXBvcnQgcHJvamVjdCBmcm9tICcuL3Byb2plY3QnO1xuaW1wb3J0IHNjYWxlcyBmcm9tICcuL3NjYWxlcyc7XG5pbXBvcnQgdG9nZ2xlIGZyb20gJy4vdG9nZ2xlJztcbmltcG9ydCB0cmFuc2xhdGUgZnJvbSAnLi90cmFuc2xhdGUnO1xuaW1wb3J0IHpvb20gZnJvbSAnLi96b29tJztcbmNvbnN0IGNvbXBpbGVyczogRGljdDxUcmFuc2Zvcm1Db21waWxlcj4gPSB7cHJvamVjdCwgdG9nZ2xlLCBzY2FsZXMsXG4gIHRyYW5zbGF0ZSwgem9vbSwgaW5wdXRzLCBuZWFyZXN0fTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBjYjogKHR4OiBUcmFuc2Zvcm1Db21waWxlcikgPT4gdm9pZCkge1xuICBmb3IgKGNvbnN0IHQgaW4gY29tcGlsZXJzKSB7XG4gICAgaWYgKGNvbXBpbGVyc1t0XS5oYXMoc2VsQ21wdCkpIHtcbiAgICAgIGNiKGNvbXBpbGVyc1t0XSk7XG4gICAgfVxuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { selector as parseSelector } from 'vega-event-selector';\nimport { isString, stringValue } from 'vega-util';\nimport { X, Y } from '../../channel';\nimport { warn } from '../../log';\nimport { SELECTION_ID } from '../../selection';\nimport { accessPathWithDatum, logicalExpr, varName } from '../../util';\nimport { isFacetModel, isUnitModel } from '../model';\nimport intervalCompiler from './interval';\nimport multiCompiler from './multi';\nimport singleCompiler from './single';\nimport { forEachTransform } from './transforms/transforms';\nexport var STORE = '_store';\nexport var TUPLE = '_tuple';\nexport var MODIFY = '_modify';\nexport var SELECTION_DOMAIN = '_selection_domain_';\nexport function parseUnitSelection(model, selDefs) {\n var selCmpts = {};\n var selectionConfig = model.config.selection;\n var _loop_1 = function (name_1) {\n if (!selDefs.hasOwnProperty(name_1)) {\n return \"continue\";\n }\n var selDef = selDefs[name_1];\n var cfg = selectionConfig[selDef.type];\n // Set default values from config if a property hasn't been specified,\n // or if it is true. E.g., \"translate\": true should use the default\n // event handlers for translate. However, true may be a valid value for\n // a property (e.g., \"nearest\": true).\n for (var key in cfg) {\n // A selection should contain either `encodings` or `fields`, only use\n // default values for these two values if neither of them is specified.\n if ((key === 'encodings' && selDef.fields) || (key === 'fields' && selDef.encodings)) {\n continue;\n }\n if (key === 'mark') {\n selDef[key] = tslib_1.__assign({}, cfg[key], selDef[key]);\n }\n if (selDef[key] === undefined || selDef[key] === true) {\n selDef[key] = cfg[key] || selDef[key];\n }\n }\n name_1 = varName(name_1);\n var selCmpt = selCmpts[name_1] = tslib_1.__assign({}, selDef, { name: name_1, events: isString(selDef.on) ? parseSelector(selDef.on, 'scope') : selDef.on });\n forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.parse) {\n txCompiler.parse(model, selDef, selCmpt);\n }\n });\n };\n for (var name_1 in selDefs) {\n _loop_1(name_1);\n }\n return selCmpts;\n}\nexport function assembleUnitSelectionSignals(model, signals) {\n forEachSelection(model, function (selCmpt, selCompiler) {\n var name = selCmpt.name;\n var modifyExpr = selCompiler.modifyExpr(model, selCmpt);\n signals.push.apply(signals, selCompiler.signals(model, selCmpt));\n forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.signals) {\n signals = txCompiler.signals(model, selCmpt, signals);\n }\n if (txCompiler.modifyExpr) {\n modifyExpr = txCompiler.modifyExpr(model, selCmpt, modifyExpr);\n }\n });\n signals.push({\n name: name + MODIFY,\n on: [{\n events: { signal: name + TUPLE },\n update: \"modify(\" + stringValue(selCmpt.name + STORE) + \", \" + modifyExpr + \")\"\n }]\n });\n });\n var facetModel = getFacetModel(model);\n if (signals.length && facetModel) {\n var name_2 = stringValue(facetModel.getName('cell'));\n signals.unshift({\n name: 'facet',\n value: {},\n on: [{\n events: parseSelector('mousemove', 'scope'),\n update: \"isTuple(facet) ? facet : group(\" + name_2 + \").datum\"\n }]\n });\n }\n return signals;\n}\nexport function assembleTopLevelSignals(model, signals) {\n var needsUnit = false;\n forEachSelection(model, function (selCmpt, selCompiler) {\n if (selCompiler.topLevelSignals) {\n signals = selCompiler.topLevelSignals(model, selCmpt, signals);\n }\n forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.topLevelSignals) {\n signals = txCompiler.topLevelSignals(model, selCmpt, signals);\n }\n });\n needsUnit = true;\n });\n if (needsUnit) {\n var hasUnit = signals.filter(function (s) { return s.name === 'unit'; });\n if (!(hasUnit.length)) {\n signals.unshift({\n name: 'unit',\n value: {},\n on: [{ events: 'mousemove', update: 'isTuple(group()) ? group() : unit' }]\n });\n }\n }\n return signals;\n}\nexport function assembleUnitSelectionData(model, data) {\n forEachSelection(model, function (selCmpt) {\n var contains = data.filter(function (d) { return d.name === selCmpt.name + STORE; });\n if (!contains.length) {\n data.push({ name: selCmpt.name + STORE });\n }\n });\n return data;\n}\nexport function assembleUnitSelectionMarks(model, marks) {\n forEachSelection(model, function (selCmpt, selCompiler) {\n marks = selCompiler.marks ? selCompiler.marks(model, selCmpt, marks) : marks;\n forEachTransform(selCmpt, function (txCompiler) {\n if (txCompiler.marks) {\n marks = txCompiler.marks(model, selCmpt, marks);\n }\n });\n });\n return marks;\n}\nexport function assembleLayerSelectionMarks(model, marks) {\n model.children.forEach(function (child) {\n if (isUnitModel(child)) {\n marks = assembleUnitSelectionMarks(child, marks);\n }\n });\n return marks;\n}\nexport function selectionPredicate(model, selections, dfnode) {\n var stores = [];\n function expr(name) {\n var vname = varName(name);\n var selCmpt = model.getSelectionComponent(vname, name);\n var store = stringValue(vname + STORE);\n if (selCmpt.timeUnit) {\n var child = dfnode || model.component.data.raw;\n var tunode = selCmpt.timeUnit.clone();\n if (child.parent) {\n tunode.insertAsParentOf(child);\n }\n else {\n child.parent = tunode;\n }\n }\n if (selCmpt.empty !== 'none') {\n stores.push(store);\n }\n return compiler(selCmpt.type).predicate + (\"(\" + store + \", datum\") +\n (selCmpt.resolve === 'global' ? ')' : \", \" + stringValue(selCmpt.resolve) + \")\");\n }\n var predicateStr = logicalExpr(selections, expr);\n return (stores.length\n ? '!(' + stores.map(function (s) { return \"length(data(\" + s + \"))\"; }).join(' || ') + ') || '\n : '') + (\"(\" + predicateStr + \")\");\n}\n// Selections are parsed _after_ scales. If a scale domain is set to\n// use a selection, the SELECTION_DOMAIN constant is used as the\n// domainRaw.signal during scale.parse and then replaced with the necessary\n// selection expression function during scale.assemble. To not pollute the\n// type signatures to account for this setup, the selection domain definition\n// is coerced to a string and appended to SELECTION_DOMAIN.\nexport function isRawSelectionDomain(domainRaw) {\n return domainRaw.signal.indexOf(SELECTION_DOMAIN) >= 0;\n}\nexport function selectionScaleDomain(model, domainRaw) {\n var selDomain = JSON.parse(domainRaw.signal.replace(SELECTION_DOMAIN, ''));\n var name = varName(selDomain.selection);\n var selCmpt = model.component.selection && model.component.selection[name];\n if (selCmpt) {\n warn('Use \"bind\": \"scales\" to setup a binding for scales and selections within the same view.');\n }\n else {\n selCmpt = model.getSelectionComponent(name, selDomain.selection);\n if (!selDomain.encoding && !selDomain.field) {\n selDomain.field = selCmpt.project[0].field;\n if (selCmpt.project.length > 1) {\n warn('A \"field\" or \"encoding\" must be specified when using a selection as a scale domain. ' +\n (\"Using \\\"field\\\": \" + stringValue(selDomain.field) + \".\"));\n }\n }\n return {\n signal: compiler(selCmpt.type).scaleDomain +\n (\"(\" + stringValue(name + STORE) + \", \" + stringValue(selDomain.encoding || null) + \", \") +\n stringValue(selDomain.field || null) +\n (selCmpt.resolve === 'global' ? ')' : \", \" + stringValue(selCmpt.resolve) + \")\")\n };\n }\n return { signal: 'null' };\n}\n// Utility functions\nfunction forEachSelection(model, cb) {\n var selections = model.component.selection;\n for (var name_3 in selections) {\n if (selections.hasOwnProperty(name_3)) {\n var sel = selections[name_3];\n cb(sel, compiler(sel.type));\n }\n }\n}\nfunction compiler(type) {\n switch (type) {\n case 'single':\n return singleCompiler;\n case 'multi':\n return multiCompiler;\n case 'interval':\n return intervalCompiler;\n }\n return null;\n}\nfunction getFacetModel(model) {\n var parent = model.parent;\n while (parent) {\n if (isFacetModel(parent)) {\n break;\n }\n parent = parent.parent;\n }\n return parent;\n}\nexport function unitName(model) {\n var name = stringValue(model.name);\n var facet = getFacetModel(model);\n if (facet) {\n name += (facet.facet.row ? \" + '_' + (\" + accessPathWithDatum(facet.vgField('row'), 'facet') + \")\" : '')\n + (facet.facet.column ? \" + '_' + (\" + accessPathWithDatum(facet.vgField('column'), 'facet') + \")\" : '');\n }\n return name;\n}\nexport function requiresSelectionId(model) {\n var identifier = false;\n forEachSelection(model, function (selCmpt) {\n identifier = identifier || selCmpt.project.some(function (proj) { return proj.field === SELECTION_ID; });\n });\n return identifier;\n}\nexport function channelSignalName(selCmpt, channel, range) {\n var sgNames = selCmpt._signalNames || (selCmpt._signalNames = {});\n if (sgNames[channel] && sgNames[channel][range]) {\n return sgNames[channel][range];\n }\n sgNames[channel] = sgNames[channel] || {};\n var basename = varName(selCmpt.name + '_' + (range === 'visual' ? channel : selCmpt.fields[channel]));\n var name = basename;\n var counter = 1;\n while (sgNames[name]) {\n name = basename + \"_\" + counter++;\n }\n return (sgNames[name] = sgNames[channel][range] = name);\n}\nexport function positionalProjections(selCmpt) {\n var x = null;\n var xi = null;\n var y = null;\n var yi = null;\n selCmpt.project.forEach(function (p, i) {\n if (p.channel === X) {\n x = p;\n xi = i;\n }\n else if (p.channel === Y) {\n y = p;\n yi = i;\n }\n });\n return { x: x, xi: xi, y: y, yi: yi };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoRCxPQUFPLEVBQXdCLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUvQixPQUFPLEVBQWMsWUFBWSxFQUFtRCxNQUFNLGlCQUFpQixDQUFDO0FBQzVHLE9BQU8sRUFBQyxtQkFBbUIsRUFBUSxXQUFXLEVBQUUsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBTTNFLE9BQU8sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFRLE1BQU0sVUFBVSxDQUFDO0FBRTFELE9BQU8sZ0JBQWdCLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sYUFBYSxNQUFNLFNBQVMsQ0FBQztBQUVwQyxPQUFPLGNBQWMsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFHekQsTUFBTSxDQUFDLElBQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUM5QixNQUFNLENBQUMsSUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBQzlCLE1BQU0sQ0FBQyxJQUFNLE1BQU0sR0FBRyxTQUFTLENBQUM7QUFDaEMsTUFBTSxDQUFDLElBQU0sZ0JBQWdCLEdBQUcsb0JBQW9CLENBQUM7QUF1Q3JELE1BQU0sNkJBQTZCLEtBQWdCLEVBQUUsT0FBMkI7SUFDOUUsSUFBTSxRQUFRLEdBQTZCLEVBQUUsQ0FBQztJQUM5QyxJQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsTUFB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T0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDUjthQUFNLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDMUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNOLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDUjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxFQUFDLENBQUMsR0FBQSxFQUFFLEVBQUUsSUFBQSxFQUFFLENBQUMsR0FBQSxFQUFFLEVBQUUsSUFBQSxFQUFDLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2VsZWN0b3IgYXMgcGFyc2VTZWxlY3Rvcn0gZnJvbSAndmVnYS1ldmVudC1zZWxlY3Rvcic7XG5pbXBvcnQge2lzU3RyaW5nLCBzdHJpbmdWYWx1ZX0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7Q2hhbm5lbCwgU2NhbGVDaGFubmVsLCBYLCBZfSBmcm9tICcuLi8uLi9jaGFubmVsJztcbmltcG9ydCB7d2Fybn0gZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtCcnVzaENvbmZpZywgU0VMRUNUSU9OX0lELCBTZWxlY3Rpb25EZWYsIFNlbGVjdGlvblJlc29sdXRpb24sIFNlbGVjdGlvblR5cGV9IGZyb20gJy4uLy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge2FjY2Vzc1BhdGhXaXRoRGF0dW0sIERpY3QsIGxvZ2ljYWxFeHByLCB2YXJOYW1lfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdCaW5kaW5nLCBWZ0RhdGEsIFZnRXZlbnRTdHJlYW0sIFZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi4vZGF0YS9kYXRhZmxvdyc7XG5pbXBvcnQge1RpbWVVbml0Tm9kZX0gZnJvbSAnLi4vZGF0YS90aW1ldW5pdCc7XG5pbXBvcnQge0ZhY2V0TW9kZWx9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7TGF5ZXJNb2RlbH0gZnJvbSAnLi4vbGF5ZXInO1xuaW1wb3J0IHtpc0ZhY2V0TW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IGludGVydmFsQ29tcGlsZXIgZnJvbSAnLi9pbnRlcnZhbCc7XG5pbXBvcnQgbXVsdGlDb21waWxlciBmcm9tICcuL211bHRpJztcbmltcG9ydCB7U2VsZWN0aW9uQ29tcG9uZW50fSBmcm9tICcuL3NlbGVjdGlvbic7XG5pbXBvcnQgc2luZ2xlQ29tcGlsZXIgZnJvbSAnLi9zaW5nbGUnO1xuaW1wb3J0IHtmb3JFYWNoVHJhbnNmb3JtfSBmcm9tICcuL3RyYW5zZm9ybXMvdHJhbnNmb3Jtcyc7XG5cblxuZXhwb3J0IGNvbnN0IFNUT1JFID0gJ19zdG9yZSc7XG5leHBvcnQgY29uc3QgVFVQTEUgPSAnX3R1cGxlJztcbmV4cG9ydCBjb25zdCBNT0RJRlkgPSAnX21vZGlmeSc7XG5leHBvcnQgY29uc3QgU0VMRUNUSU9OX0RPTUFJTiA9ICdfc2VsZWN0aW9uX2RvbWFpbl8nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvbkNvbXBvbmVudCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogU2VsZWN0aW9uVHlwZTtcbiAgZXZlbnRzOiBWZ0V2ZW50U3RyZWFtO1xuICAvLyBwcmVkaWNhdGU/OiBzdHJpbmc7XG4gIGJpbmQ/OiAnc2NhbGVzJyB8IFZnQmluZGluZyB8IHtba2V5OiBzdHJpbmddOiBWZ0JpbmRpbmd9O1xuICByZXNvbHZlOiBTZWxlY3Rpb25SZXNvbHV0aW9uO1xuICBlbXB0eTogJ2FsbCcgfCAnbm9uZSc7XG4gIG1hcms/OiBCcnVzaENvbmZpZztcblxuICBfc2lnbmFsTmFtZXM6IHt9O1xuXG4gIC8vIFRyYW5zZm9ybXNcbiAgcHJvamVjdD86IFByb2plY3RDb21wb25lbnRbXTtcbiAgZmllbGRzPzogYW55O1xuICB0aW1lVW5pdD86IFRpbWVVbml0Tm9kZTtcbiAgc2NhbGVzPzogQ2hhbm5lbFtdO1xuICB0b2dnbGU/OiBhbnk7XG4gIHRyYW5zbGF0ZT86IGFueTtcbiAgem9vbT86IGFueTtcbiAgbmVhcmVzdD86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9qZWN0Q29tcG9uZW50IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIGNoYW5uZWw/OiBTY2FsZUNoYW5uZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uQ29tcGlsZXIge1xuICBzaWduYWxzOiAobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50KSA9PiBhbnlbXTtcbiAgdG9wTGV2ZWxTaWduYWxzPzogKG1vZGVsOiBNb2RlbCwgc2VsQ21wdDogU2VsZWN0aW9uQ29tcG9uZW50LCBzaWduYWxzOiBhbnlbXSkgPT4gYW55W107XG4gIG1vZGlmeUV4cHI6IChtb2RlbDogVW5pdE1vZGVsLCBzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQpID0+IHN0cmluZztcbiAgbWFya3M/OiAobW9kZWw6IFVuaXRNb2RlbCwgc2VsQ21wdDpTZWxlY3Rpb25Db21wb25lbnQsIG1hcmtzOiBhbnlbXSkgPT4gYW55W107XG4gIHByZWRpY2F0ZTogc3RyaW5nOyAgLy8gVmVnYSBleHByIHN0cmluZyB0byBkZXRlcm1pbmUgaW5jbHVzaW9uIGluIHNlbGVjdGlvbi5cbiAgc2NhbGVEb21haW46IHN0cmluZzsgIC8vIFZlZ2EgZXhwciBzdHJpbmcgdG8gbWF0ZXJpYWxpemUgYSBzY2FsZSBkb21haW4uXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRTZWxlY3Rpb24obW9kZWw6IFVuaXRNb2RlbCwgc2VsRGVmczogRGljdDxTZWxlY3Rpb25EZWY+KSB7XG4gIGNvbnN0IHNlbENtcHRzOiBEaWN0PFNlbGVjdGlvbkNvbXBvbmVudD4gPSB7fTtcbiAgY29uc3Qgc2VsZWN0aW9uQ29uZmlnID0gbW9kZWwuY29uZmlnLnNlbGVjdGlvbjtcblxuICBmb3IgKGxldCBuYW1lIGluIHNlbERlZnMpIHtcbiAgICBpZiAoIXNlbERlZnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbERlZiA9IHNlbERlZnNbbmFtZV07XG4gICAgY29uc3QgY2ZnID0gc2VsZWN0aW9uQ29uZmlnW3NlbERlZi50eXBlXTtcblxuICAgIC8vIFNldCBkZWZhdWx0IHZhbHVlcyBmcm9tIGNvbmZpZyBpZiBhIHByb3BlcnR5IGhhc24ndCBiZWVuIHNwZWNpZmllZCxcbiAgICAvLyBvciBpZiBpdCBpcyB0cnVlLiBFLmcuLCBcInRyYW5zbGF0ZVwiOiB0cnVlIHNob3VsZCB1c2UgdGhlIGRlZmF1bHRcbiAgICAvLyBldmVudCBoYW5kbGVycyBmb3IgdHJhbnNsYXRlLiBIb3dldmVyLCB0cnVlIG1heSBiZSBhIHZhbGlkIHZhbHVlIGZvclxuICAgIC8vIGEgcHJvcGVydHkgKGUuZy4sIFwibmVhcmVzdFwiOiB0cnVlKS5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBjZmcpIHtcbiAgICAgIC8vIEEgc2VsZWN0aW9uIHNob3VsZCBjb250YWluIGVpdGhlciBgZW5jb2RpbmdzYCBvciBgZmllbGRzYCwgb25seSB1c2VcbiAgICAgIC8vIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZSB0d28gdmFsdWVzIGlmIG5laXRoZXIgb2YgdGhlbSBpcyBzcGVjaWZpZWQuXG4gICAgICBpZiAoKGtleSA9PT0gJ2VuY29kaW5ncycgJiYgc2VsRGVmLmZpZWxkcykgfHwgKGtleSA9PT0gJ2ZpZWxkcycgJiYgc2VsRGVmLmVuY29kaW5ncykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICdtYXJrJykge1xuICAgICAgICBzZWxEZWZba2V5XSA9IHsuLi5jZmdba2V5XSwgLi4uc2VsRGVmW2tleV19O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2VsRGVmW2tleV0gPT09IHVuZGVmaW5lZCB8fCBzZWxEZWZba2V5XSA9PT0gdHJ1ZSkge1xuICAgICAgICBzZWxEZWZba2V5XSA9IGNmZ1trZXldIHx8IHNlbERlZltrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5hbWUgPSB2YXJOYW1lKG5hbWUpO1xuICAgIGNvbnN0IHNlbENtcHQgPSBzZWxDbXB0c1tuYW1lXSA9IHtcbiAgICAgIC4uLnNlbERlZixcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBldmVudHM6IGlzU3RyaW5nKHNlbERlZi5vbikgPyBwYXJzZVNlbGVjdG9yKHNlbERlZi5vbiwgJ3Njb3BlJykgOiBzZWxEZWYub24sXG4gICAgfSBhcyBTZWxlY3Rpb25Db21wb25lbnQ7XG5cbiAgICBmb3JFYWNoVHJhbnNmb3JtKHNlbENtcHQsIHR4Q29tcGlsZXIgPT4ge1xuICAgICAgaWYgKHR4Q29tcGlsZXIucGFyc2UpIHtcbiAgICAgICAgdHhDb21waWxlci5wYXJzZShtb2RlbCwgc2VsRGVmLCBzZWxDbXB0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBzZWxDbXB0cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMobW9kZWw6IFVuaXRNb2RlbCwgc2lnbmFsczogYW55W10pIHtcbiAgZm9yRWFjaFNlbGVjdGlvbihtb2RlbCwgKHNlbENtcHQsIHNlbENvbXBpbGVyKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IHNlbENtcHQubmFtZTtcbiAgICBsZXQgbW9kaWZ5RXhwciA9IHNlbENvbXBpbGVyLm1vZGlmeUV4cHIobW9kZWwsIHNlbENtcHQpO1xuXG4gICAgc2lnbmFscy5wdXNoLmFwcGx5KHNpZ25hbHMsIHNlbENvbXBpbGVyLnNpZ25hbHMobW9kZWwsIHNlbENtcHQpKTtcblxuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgdHhDb21waWxlciA9PiB7XG4gICAgICBpZiAodHhDb21waWxlci5zaWduYWxzKSB7XG4gICAgICAgIHNpZ25hbHMgPSB0eENvbXBpbGVyLnNpZ25hbHMobW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHR4Q29tcGlsZXIubW9kaWZ5RXhwcikge1xuICAgICAgICBtb2RpZnlFeHByID0gdHhDb21waWxlci5tb2RpZnlFeHByKG1vZGVsLCBzZWxDbXB0LCBtb2RpZnlFeHByKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHNpZ25hbHMucHVzaCh7XG4gICAgICBuYW1lOiBuYW1lICsgTU9ESUZZLFxuICAgICAgb246IFt7XG4gICAgICAgIGV2ZW50czoge3NpZ25hbDogbmFtZSArIFRVUExFfSxcbiAgICAgICAgdXBkYXRlOiBgbW9kaWZ5KCR7c3RyaW5nVmFsdWUoc2VsQ21wdC5uYW1lICsgU1RPUkUpfSwgJHttb2RpZnlFeHByfSlgXG4gICAgICB9XVxuICAgIH0pO1xuICB9KTtcblxuICBjb25zdCBmYWNldE1vZGVsID0gZ2V0RmFjZXRNb2RlbChtb2RlbCk7XG4gIGlmIChzaWduYWxzLmxlbmd0aCAmJiBmYWNldE1vZGVsKSB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZ1ZhbHVlKGZhY2V0TW9kZWwuZ2V0TmFtZSgnY2VsbCcpKTtcbiAgICBzaWduYWxzLnVuc2hpZnQoe1xuICAgICAgbmFtZTogJ2ZhY2V0JyxcbiAgICAgIHZhbHVlOiB7fSxcbiAgICAgIG9uOiBbe1xuICAgICAgICBldmVudHM6IHBhcnNlU2VsZWN0b3IoJ21vdXNlbW92ZScsICdzY29wZScpLFxuICAgICAgICB1cGRhdGU6IGBpc1R1cGxlKGZhY2V0KSA/IGZhY2V0IDogZ3JvdXAoJHtuYW1lfSkuZGF0dW1gXG4gICAgICB9XVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNpZ25hbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZVRvcExldmVsU2lnbmFscyhtb2RlbDogVW5pdE1vZGVsLCBzaWduYWxzOiBhbnlbXSkge1xuICBsZXQgbmVlZHNVbml0ID0gZmFsc2U7XG4gIGZvckVhY2hTZWxlY3Rpb24obW9kZWwsIChzZWxDbXB0LCBzZWxDb21waWxlcikgPT4ge1xuICAgIGlmIChzZWxDb21waWxlci50b3BMZXZlbFNpZ25hbHMpIHtcbiAgICAgIHNpZ25hbHMgPSBzZWxDb21waWxlci50b3BMZXZlbFNpZ25hbHMobW9kZWwsIHNlbENtcHQsIHNpZ25hbHMpO1xuICAgIH1cblxuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgdHhDb21waWxlciA9PiB7XG4gICAgICBpZiAodHhDb21waWxlci50b3BMZXZlbFNpZ25hbHMpIHtcbiAgICAgICAgc2lnbmFscyA9IHR4Q29tcGlsZXIudG9wTGV2ZWxTaWduYWxzKG1vZGVsLCBzZWxDbXB0LCBzaWduYWxzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIG5lZWRzVW5pdCA9IHRydWU7XG4gIH0pO1xuXG4gIGlmIChuZWVkc1VuaXQpIHtcbiAgICBjb25zdCBoYXNVbml0ID0gc2lnbmFscy5maWx0ZXIoKHMpID0+IHMubmFtZSA9PT0gJ3VuaXQnKTtcbiAgICBpZiAoIShoYXNVbml0Lmxlbmd0aCkpIHtcbiAgICAgIHNpZ25hbHMudW5zaGlmdCh7XG4gICAgICAgIG5hbWU6ICd1bml0JyxcbiAgICAgICAgdmFsdWU6IHt9LFxuICAgICAgICBvbjogW3tldmVudHM6ICdtb3VzZW1vdmUnLCB1cGRhdGU6ICdpc1R1cGxlKGdyb3VwKCkpID8gZ3JvdXAoKSA6IHVuaXQnfV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaWduYWxzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVbml0U2VsZWN0aW9uRGF0YShtb2RlbDogVW5pdE1vZGVsLCBkYXRhOiBWZ0RhdGFbXSk6IFZnRGF0YVtdIHtcbiAgZm9yRWFjaFNlbGVjdGlvbihtb2RlbCwgc2VsQ21wdCA9PiB7XG4gICAgY29uc3QgY29udGFpbnMgPSBkYXRhLmZpbHRlcigoZCkgPT4gZC5uYW1lID09PSBzZWxDbXB0Lm5hbWUgKyBTVE9SRSk7XG4gICAgaWYgKCFjb250YWlucy5sZW5ndGgpIHtcbiAgICAgIGRhdGEucHVzaCh7bmFtZTogc2VsQ21wdC5uYW1lICsgU1RPUkV9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVVbml0U2VsZWN0aW9uTWFya3MobW9kZWw6IFVuaXRNb2RlbCwgbWFya3M6IGFueVtdKTogYW55W10ge1xuICBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsLCAoc2VsQ21wdCwgc2VsQ29tcGlsZXIpID0+IHtcbiAgICBtYXJrcyA9IHNlbENvbXBpbGVyLm1hcmtzID8gc2VsQ29tcGlsZXIubWFya3MobW9kZWwsIHNlbENtcHQsIG1hcmtzKSA6IG1hcmtzO1xuICAgIGZvckVhY2hUcmFuc2Zvcm0oc2VsQ21wdCwgKHR4Q29tcGlsZXIpID0+IHtcbiAgICAgIGlmICh0eENvbXBpbGVyLm1hcmtzKSB7XG4gICAgICAgIG1hcmtzID0gdHhDb21waWxlci5tYXJrcyhtb2RlbCwgc2VsQ21wdCwgbWFya3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcblxuICByZXR1cm4gbWFya3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUxheWVyU2VsZWN0aW9uTWFya3MobW9kZWw6IExheWVyTW9kZWwsIG1hcmtzOiBhbnlbXSk6IGFueVtdIHtcbiAgbW9kZWwuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgaWYgKGlzVW5pdE1vZGVsKGNoaWxkKSkge1xuICAgICAgbWFya3MgPSBhc3NlbWJsZVVuaXRTZWxlY3Rpb25NYXJrcyhjaGlsZCwgbWFya3MpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIG1hcmtzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uUHJlZGljYXRlKG1vZGVsOiBNb2RlbCwgc2VsZWN0aW9uczogTG9naWNhbE9wZXJhbmQ8c3RyaW5nPiwgZGZub2RlPzogRGF0YUZsb3dOb2RlKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RvcmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmdW5jdGlvbiBleHByKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgdm5hbWUgPSB2YXJOYW1lKG5hbWUpO1xuICAgIGNvbnN0IHNlbENtcHQgPSBtb2RlbC5nZXRTZWxlY3Rpb25Db21wb25lbnQodm5hbWUsIG5hbWUpO1xuICAgIGNvbnN0IHN0b3JlID0gc3RyaW5nVmFsdWUodm5hbWUgKyBTVE9SRSk7XG5cbiAgICBpZiAoc2VsQ21wdC50aW1lVW5pdCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBkZm5vZGUgfHwgbW9kZWwuY29tcG9uZW50LmRhdGEucmF3O1xuICAgICAgY29uc3QgdHVub2RlID0gc2VsQ21wdC50aW1lVW5pdC5jbG9uZSgpO1xuICAgICAgaWYgKGNoaWxkLnBhcmVudCkge1xuICAgICAgICB0dW5vZGUuaW5zZXJ0QXNQYXJlbnRPZihjaGlsZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjaGlsZC5wYXJlbnQgPSB0dW5vZGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNlbENtcHQuZW1wdHkgIT09ICdub25lJykge1xuICAgICAgc3RvcmVzLnB1c2goc3RvcmUpO1xuICAgIH1cblxuICAgIHJldHVybiBjb21waWxlcihzZWxDbXB0LnR5cGUpLnByZWRpY2F0ZSArIGAoJHtzdG9yZX0sIGRhdHVtYCArXG4gICAgICAoc2VsQ21wdC5yZXNvbHZlID09PSAnZ2xvYmFsJyA/ICcpJyA6IGAsICR7c3RyaW5nVmFsdWUoc2VsQ21wdC5yZXNvbHZlKX0pYCk7XG4gIH1cblxuICBjb25zdCBwcmVkaWNhdGVTdHIgPSBsb2dpY2FsRXhwcihzZWxlY3Rpb25zLCBleHByKTtcbiAgcmV0dXJuIChzdG9yZXMubGVuZ3RoXG4gICAgPyAnISgnICsgc3RvcmVzLm1hcCgocykgPT4gYGxlbmd0aChkYXRhKCR7c30pKWApLmpvaW4oJyB8fCAnKSArICcpIHx8ICdcbiAgICA6ICcnXG4gICkgKyBgKCR7cHJlZGljYXRlU3RyfSlgO1xufVxuXG4vLyBTZWxlY3Rpb25zIGFyZSBwYXJzZWQgX2FmdGVyXyBzY2FsZXMuIElmIGEgc2NhbGUgZG9tYWluIGlzIHNldCB0b1xuLy8gdXNlIGEgc2VsZWN0aW9uLCB0aGUgU0VMRUNUSU9OX0RPTUFJTiBjb25zdGFudCBpcyB1c2VkIGFzIHRoZVxuLy8gZG9tYWluUmF3LnNpZ25hbCBkdXJpbmcgc2NhbGUucGFyc2UgYW5kIHRoZW4gcmVwbGFjZWQgd2l0aCB0aGUgbmVjZXNzYXJ5XG4vLyBzZWxlY3Rpb24gZXhwcmVzc2lvbiBmdW5jdGlvbiBkdXJpbmcgc2NhbGUuYXNzZW1ibGUuIFRvIG5vdCBwb2xsdXRlIHRoZVxuLy8gdHlwZSBzaWduYXR1cmVzIHRvIGFjY291bnQgZm9yIHRoaXMgc2V0dXAsIHRoZSBzZWxlY3Rpb24gZG9tYWluIGRlZmluaXRpb25cbi8vIGlzIGNvZXJjZWQgdG8gYSBzdHJpbmcgYW5kIGFwcGVuZGVkIHRvIFNFTEVDVElPTl9ET01BSU4uXG5leHBvcnQgZnVuY3Rpb24gaXNSYXdTZWxlY3Rpb25Eb21haW4oZG9tYWluUmF3OiBWZ1NpZ25hbFJlZikge1xuICByZXR1cm4gZG9tYWluUmF3LnNpZ25hbC5pbmRleE9mKFNFTEVDVElPTl9ET01BSU4pID49IDA7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0aW9uU2NhbGVEb21haW4obW9kZWw6IE1vZGVsLCBkb21haW5SYXc6IFZnU2lnbmFsUmVmKTogVmdTaWduYWxSZWYge1xuICBjb25zdCBzZWxEb21haW4gPSBKU09OLnBhcnNlKGRvbWFpblJhdy5zaWduYWwucmVwbGFjZShTRUxFQ1RJT05fRE9NQUlOLCAnJykpO1xuICBjb25zdCBuYW1lID0gdmFyTmFtZShzZWxEb21haW4uc2VsZWN0aW9uKTtcblxuICBsZXQgc2VsQ21wdCA9IG1vZGVsLmNvbXBvbmVudC5zZWxlY3Rpb24gJiYgbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbltuYW1lXTtcbiAgaWYgKHNlbENtcHQpIHtcbiAgICB3YXJuKCdVc2UgXCJiaW5kXCI6IFwic2NhbGVzXCIgdG8gc2V0dXAgYSBiaW5kaW5nIGZvciBzY2FsZXMgYW5kIHNlbGVjdGlvbnMgd2l0aGluIHRoZSBzYW1lIHZpZXcuJyk7XG4gIH0gZWxzZSB7XG4gICAgc2VsQ21wdCA9IG1vZGVsLmdldFNlbGVjdGlvbkNvbXBvbmVudChuYW1lLCBzZWxEb21haW4uc2VsZWN0aW9uKTtcbiAgICBpZiAoIXNlbERvbWFpbi5lbmNvZGluZyAmJiAhc2VsRG9tYWluLmZpZWxkKSB7XG4gICAgICBzZWxEb21haW4uZmllbGQgPSBzZWxDbXB0LnByb2plY3RbMF0uZmllbGQ7XG4gICAgICBpZiAoc2VsQ21wdC5wcm9qZWN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgd2FybignQSBcImZpZWxkXCIgb3IgXCJlbmNvZGluZ1wiIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdXNpbmcgYSBzZWxlY3Rpb24gYXMgYSBzY2FsZSBkb21haW4uICcgK1xuICAgICAgICBgVXNpbmcgXCJmaWVsZFwiOiAke3N0cmluZ1ZhbHVlKHNlbERvbWFpbi5maWVsZCl9LmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgc2lnbmFsOiBjb21waWxlcihzZWxDbXB0LnR5cGUpLnNjYWxlRG9tYWluICtcbiAgICAgICAgYCgke3N0cmluZ1ZhbHVlKG5hbWUgKyBTVE9SRSl9LCAke3N0cmluZ1ZhbHVlKHNlbERvbWFpbi5lbmNvZGluZyB8fCBudWxsKX0sIGAgK1xuICAgICAgICAgIHN0cmluZ1ZhbHVlKHNlbERvbWFpbi5maWVsZCB8fCBudWxsKSArXG4gICAgICAgICAgKHNlbENtcHQucmVzb2x2ZSA9PT0gJ2dsb2JhbCcgPyAnKScgOiBgLCAke3N0cmluZ1ZhbHVlKHNlbENtcHQucmVzb2x2ZSl9KWApXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7c2lnbmFsOiAnbnVsbCd9O1xufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuXG5mdW5jdGlvbiBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsOiBNb2RlbCwgY2I6IChzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIHNlbENvbXBpbGVyOiBTZWxlY3Rpb25Db21waWxlcikgPT4gdm9pZCkge1xuICBjb25zdCBzZWxlY3Rpb25zID0gbW9kZWwuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgZm9yIChjb25zdCBuYW1lIGluIHNlbGVjdGlvbnMpIHtcbiAgICBpZiAoc2VsZWN0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29uc3Qgc2VsID0gc2VsZWN0aW9uc1tuYW1lXTtcbiAgICAgIGNiKHNlbCwgY29tcGlsZXIoc2VsLnR5cGUpKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZXIodHlwZTogU2VsZWN0aW9uVHlwZSk6IFNlbGVjdGlvbkNvbXBpbGVyIHtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgIHJldHVybiBzaW5nbGVDb21waWxlcjtcbiAgICBjYXNlICdtdWx0aSc6XG4gICAgICByZXR1cm4gbXVsdGlDb21waWxlcjtcbiAgICBjYXNlICdpbnRlcnZhbCc6XG4gICAgICByZXR1cm4gaW50ZXJ2YWxDb21waWxlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RmFjZXRNb2RlbChtb2RlbDogTW9kZWwpOiBGYWNldE1vZGVsIHtcbiAgbGV0IHBhcmVudCA9IG1vZGVsLnBhcmVudDtcbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIGlmIChpc0ZhY2V0TW9kZWwocGFyZW50KSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gIH1cblxuICByZXR1cm4gcGFyZW50IGFzIEZhY2V0TW9kZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bml0TmFtZShtb2RlbDogTW9kZWwpIHtcbiAgbGV0IG5hbWUgPSBzdHJpbmdWYWx1ZShtb2RlbC5uYW1lKTtcbiAgY29uc3QgZmFjZXQgPSBnZXRGYWNldE1vZGVsKG1vZGVsKTtcbiAgaWYgKGZhY2V0KSB7XG4gICAgbmFtZSArPSAoZmFjZXQuZmFjZXQucm93ID8gYCArICdfJyArICgke2FjY2Vzc1BhdGhXaXRoRGF0dW0oZmFjZXQudmdGaWVsZCgncm93JyksICdmYWNldCcpfSlgIDogJycpXG4gICAgICArIChmYWNldC5mYWNldC5jb2x1bW4gPyBgICsgJ18nICsgKCR7YWNjZXNzUGF0aFdpdGhEYXR1bShmYWNldC52Z0ZpZWxkKCdjb2x1bW4nKSwgJ2ZhY2V0Jyl9KWAgOiAnJyk7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlc1NlbGVjdGlvbklkKG1vZGVsOiBNb2RlbCkge1xuICBsZXQgaWRlbnRpZmllciA9IGZhbHNlO1xuICBmb3JFYWNoU2VsZWN0aW9uKG1vZGVsLCAoc2VsQ21wdCkgPT4ge1xuICAgIGlkZW50aWZpZXIgPSBpZGVudGlmaWVyIHx8IHNlbENtcHQucHJvamVjdC5zb21lKChwcm9qKSA9PiBwcm9qLmZpZWxkID09PSBTRUxFQ1RJT05fSUQpO1xuICB9KTtcbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFubmVsU2lnbmFsTmFtZShzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQsIGNoYW5uZWw6IENoYW5uZWwsIHJhbmdlOiAndmlzdWFsJyB8ICdkYXRhJykge1xuICBjb25zdCBzZ05hbWVzID0gc2VsQ21wdC5fc2lnbmFsTmFtZXMgfHwgKHNlbENtcHQuX3NpZ25hbE5hbWVzID0ge30pO1xuICBpZiAoc2dOYW1lc1tjaGFubmVsXSAmJiBzZ05hbWVzW2NoYW5uZWxdW3JhbmdlXSkge1xuICAgIHJldHVybiBzZ05hbWVzW2NoYW5uZWxdW3JhbmdlXTtcbiAgfVxuXG4gIHNnTmFtZXNbY2hhbm5lbF0gPSBzZ05hbWVzW2NoYW5uZWxdIHx8IHt9O1xuICBjb25zdCBiYXNlbmFtZSA9IHZhck5hbWUoc2VsQ21wdC5uYW1lICsgJ18nICsgKHJhbmdlID09PSAndmlzdWFsJyA/IGNoYW5uZWwgOiBzZWxDbXB0LmZpZWxkc1tjaGFubmVsXSkpO1xuICBsZXQgbmFtZSA9IGJhc2VuYW1lO1xuICBsZXQgY291bnRlciA9IDE7XG4gIHdoaWxlIChzZ05hbWVzW25hbWVdKSB7XG4gICAgbmFtZSA9IGAke2Jhc2VuYW1lfV8ke2NvdW50ZXIrK31gO1xuICB9XG5cbiAgcmV0dXJuIChzZ05hbWVzW25hbWVdID0gc2dOYW1lc1tjaGFubmVsXVtyYW5nZV0gPSBuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvc2l0aW9uYWxQcm9qZWN0aW9ucyhzZWxDbXB0OiBTZWxlY3Rpb25Db21wb25lbnQpIHtcbiAgbGV0IHg6UHJvamVjdENvbXBvbmVudCA9IG51bGw7XG4gIGxldCB4aTpudW1iZXIgPSBudWxsO1xuICBsZXQgeTpQcm9qZWN0Q29tcG9uZW50ID0gbnVsbDtcbiAgbGV0IHlpOiBudW1iZXIgPSBudWxsO1xuXG4gIHNlbENtcHQucHJvamVjdC5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgaWYgKHAuY2hhbm5lbCA9PT0gWCkge1xuICAgICAgeCA9IHA7XG4gICAgICB4aSA9IGk7XG4gICAgfSBlbHNlIGlmIChwLmNoYW5uZWwgPT09IFkpIHtcbiAgICAgIHkgPSBwO1xuICAgICAgeWkgPSBpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7eCwgeGksIHksIHlpfTtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isArray, isString } from 'vega-util';\nimport { selectionPredicate } from './compile/selection/selection';\nimport { dateTimeExpr, isDateTime } from './datetime';\nimport { vgField } from './fielddef';\nimport { fieldExpr as timeUnitFieldExpr, getLocalTimeUnit, isLocalSingleTimeUnit, isUtcSingleTimeUnit, normalizeTimeUnit } from './timeunit';\nimport { logicalExpr } from './util';\nexport function isSelectionPredicate(predicate) {\n return predicate && predicate['selection'];\n}\nexport function isFieldEqualPredicate(predicate) {\n return predicate && !!predicate.field && predicate.equal !== undefined;\n}\nexport function isFieldLTPredicate(predicate) {\n return predicate && !!predicate.field && predicate.lt !== undefined;\n}\nexport function isFieldLTEPredicate(predicate) {\n return predicate && !!predicate.field && predicate.lte !== undefined;\n}\nexport function isFieldGTPredicate(predicate) {\n return predicate && !!predicate.field && predicate.gt !== undefined;\n}\nexport function isFieldGTEPredicate(predicate) {\n return predicate && !!predicate.field && predicate.gte !== undefined;\n}\nexport function isFieldRangePredicate(predicate) {\n if (predicate && predicate.field) {\n if (isArray(predicate.range) && predicate.range.length === 2) {\n return true;\n }\n }\n return false;\n}\nexport function isFieldOneOfPredicate(predicate) {\n return predicate && !!predicate.field && (isArray(predicate.oneOf) ||\n isArray(predicate.in) // backward compatibility\n );\n}\nexport function isFieldPredicate(predicate) {\n return isFieldOneOfPredicate(predicate) || isFieldEqualPredicate(predicate) || isFieldRangePredicate(predicate) || isFieldLTPredicate(predicate) || isFieldGTPredicate(predicate) || isFieldLTEPredicate(predicate) || isFieldGTEPredicate(predicate);\n}\n/**\n * Converts a predicate into an expression.\n */\n// model is only used for selection filters.\nexport function expression(model, filterOp, node) {\n return logicalExpr(filterOp, function (predicate) {\n if (isString(predicate)) {\n return predicate;\n }\n else if (isSelectionPredicate(predicate)) {\n return selectionPredicate(model, predicate.selection, node);\n }\n else { // Filter Object\n return fieldFilterExpression(predicate);\n }\n });\n}\n// This method is used by Voyager. Do not change its behavior without changing Voyager.\nexport function fieldFilterExpression(predicate, useInRange) {\n if (useInRange === void 0) { useInRange = true; }\n var fieldExpr = predicate.timeUnit ?\n // For timeUnit, cast into integer with time() so we can use ===, inrange, indexOf to compare values directly.\n // TODO: We calculate timeUnit on the fly here. Consider if we would like to consolidate this with timeUnit pipeline\n // TODO: support utc\n ('time(' + timeUnitFieldExpr(predicate.timeUnit, predicate.field) + ')') :\n vgField(predicate, { expr: 'datum' });\n if (isFieldEqualPredicate(predicate)) {\n return fieldExpr + '===' + valueExpr(predicate.equal, predicate.timeUnit);\n }\n else if (isFieldLTPredicate(predicate)) {\n var upper = predicate.lt;\n return fieldExpr + \"<\" + valueExpr(upper, predicate.timeUnit);\n }\n else if (isFieldGTPredicate(predicate)) {\n var lower = predicate.gt;\n return fieldExpr + \">\" + valueExpr(lower, predicate.timeUnit);\n }\n else if (isFieldLTEPredicate(predicate)) {\n var upper = predicate.lte;\n return fieldExpr + \"<=\" + valueExpr(upper, predicate.timeUnit);\n }\n else if (isFieldGTEPredicate(predicate)) {\n var lower = predicate.gte;\n return fieldExpr + \">=\" + valueExpr(lower, predicate.timeUnit);\n }\n else if (isFieldOneOfPredicate(predicate)) {\n // \"oneOf\" was formerly \"in\" -- so we need to add backward compatibility\n var oneOf = predicate.oneOf || predicate['in'];\n return 'indexof([' +\n oneOf.map(function (v) { return valueExpr(v, predicate.timeUnit); }).join(',') +\n '], ' + fieldExpr + ') !== -1';\n }\n else if (isFieldRangePredicate(predicate)) {\n var lower = predicate.range[0];\n var upper = predicate.range[1];\n if (lower !== null && upper !== null && useInRange) {\n return 'inrange(' + fieldExpr + ', [' +\n valueExpr(lower, predicate.timeUnit) + ', ' +\n valueExpr(upper, predicate.timeUnit) + '])';\n }\n var exprs = [];\n if (lower !== null) {\n exprs.push(fieldExpr + \" >= \" + valueExpr(lower, predicate.timeUnit));\n }\n if (upper !== null) {\n exprs.push(fieldExpr + \" <= \" + valueExpr(upper, predicate.timeUnit));\n }\n return exprs.length > 0 ? exprs.join(' && ') : 'true';\n }\n /* istanbul ignore next: it should never reach here */\n throw new Error(\"Invalid field predicate: \" + JSON.stringify(predicate));\n}\nfunction valueExpr(v, timeUnit) {\n if (isDateTime(v)) {\n var expr = dateTimeExpr(v, true);\n return 'time(' + expr + ')';\n }\n if (isLocalSingleTimeUnit(timeUnit)) {\n var datetime = {};\n datetime[timeUnit] = v;\n var expr = dateTimeExpr(datetime, true);\n return 'time(' + expr + ')';\n }\n else if (isUtcSingleTimeUnit(timeUnit)) {\n return valueExpr(v, getLocalTimeUnit(timeUnit));\n }\n return JSON.stringify(v);\n}\nexport function normalizePredicate(f) {\n if (isFieldPredicate(f) && f.timeUnit) {\n return tslib_1.__assign({}, f, { timeUnit: normalizeTimeUnit(f.timeUnit) });\n }\n return f;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlZGljYXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ByZWRpY2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHNUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFXLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDOUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEVBQUMsU0FBUyxJQUFJLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLHFCQUFxQixFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFXLE1BQU0sWUFBWSxDQUFDO0FBQ3JKLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFzQm5DLE1BQU0sK0JBQStCLFNBQW9DO0lBQ3ZFLE9BQU8sU0FBUyxJQUFJLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBd0JELE1BQU0sZ0NBQWdDLFNBQWM7SUFDbEQsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUM7QUFDekUsQ0FBQztBQVVELE1BQU0sNkJBQTZCLFNBQWM7SUFDL0MsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUM7QUFDdEUsQ0FBQztBQVdELE1BQU0sOEJBQThCLFNBQWM7SUFDaEQsT0FBTyxTQUFTLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksU0FBUyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7QUFDdkUsQ0FBQztBQVdELE1BQU0sNkJBQTZCLFNBQWM7SUFDL0MsT0FBTyxT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QUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7UUFDOUIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFNLElBQUksR0FBRyxZQUFZLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7S0FDN0I7U0FBTSxJQUFJLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3hDLE9BQU8sU0FBUyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLDZCQUE2QixDQUFZO0lBQzdDLElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRTtRQUNyQyw0QkFDSyxDQUFDLElBQ0osUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFDdkM7S0FDSDtJQUNELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNBcnJheSwgaXNTdHJpbmd9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9jb21waWxlL2RhdGEvZGF0YWZsb3cnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi9jb21waWxlL21vZGVsJztcbmltcG9ydCB7c2VsZWN0aW9uUHJlZGljYXRlfSBmcm9tICcuL2NvbXBpbGUvc2VsZWN0aW9uL3NlbGVjdGlvbic7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4vZGF0ZXRpbWUnO1xuaW1wb3J0IHt2Z0ZpZWxkfSBmcm9tICcuL2ZpZWxkZGVmJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4vbG9naWNhbCc7XG5pbXBvcnQge2ZpZWxkRXhwciBhcyB0aW1lVW5pdEZpZWxkRXhwciwgZ2V0TG9jYWxUaW1lVW5pdCwgaXNMb2NhbFNpbmdsZVRpbWVVbml0LCBpc1V0Y1NpbmdsZVRpbWVVbml0LCBub3JtYWxpemVUaW1lVW5pdCwgVGltZVVuaXR9IGZyb20gJy4vdGltZXVuaXQnO1xuaW1wb3J0IHtsb2dpY2FsRXhwcn0gZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IHR5cGUgUHJlZGljYXRlID1cbiAgLy8gYSkgRmllbGRQcmVkaWNhdGUgKGJ1dCB3ZSBkb24ndCB0eXBlIEZpZWxkRmlsdGVyIGhlcmUgc28gdGhlIHNjaGVtYSBoYXMgbm8gbmVzdGluZ1xuICAvLyBhbmQgdGh1cyB0aGUgZG9jdW1lbnRhdGlvbiBzaG93cyBhbGwgb2YgdGhlIHR5cGVzIGNsZWFybHkpXG4gIEZpZWxkRXF1YWxQcmVkaWNhdGUgfCBGaWVsZFJhbmdlUHJlZGljYXRlIHwgRmllbGRPbmVPZlByZWRpY2F0ZSB8IEZpZWxkTFRQcmVkaWNhdGUgfCBGaWVsZEdUUHJlZGljYXRlIHwgRmllbGRMVEVQcmVkaWNhdGUgfCBGaWVsZEdURVByZWRpY2F0ZSB8XG4gIC8vIGIpIFNlbGVjdGlvbiBQcmVkaWNhdGVcbiAgU2VsZWN0aW9uUHJlZGljYXRlIHxcbiAgLy8gYykgVmVnYSBFeHByZXNzaW9uIHN0cmluZ1xuICBzdHJpbmc7XG5cblxuXG5leHBvcnQgdHlwZSBGaWVsZFByZWRpY2F0ZSA9IEZpZWxkRXF1YWxQcmVkaWNhdGUgfCBGaWVsZExUUHJlZGljYXRlIHwgRmllbGRHVFByZWRpY2F0ZSB8IEZpZWxkTFRFUHJlZGljYXRlIHwgRmllbGRHVEVQcmVkaWNhdGUgfEZpZWxkUmFuZ2VQcmVkaWNhdGUgfCBGaWVsZE9uZU9mUHJlZGljYXRlO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdGlvblByZWRpY2F0ZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXIgdXNpbmcgYSBzZWxlY3Rpb24gbmFtZS5cbiAgICovXG4gIHNlbGVjdGlvbjogTG9naWNhbE9wZXJhbmQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZWN0aW9uUHJlZGljYXRlKHByZWRpY2F0ZTogTG9naWNhbE9wZXJhbmQ8UHJlZGljYXRlPik6IHByZWRpY2F0ZSBpcyBTZWxlY3Rpb25QcmVkaWNhdGUge1xuICByZXR1cm4gcHJlZGljYXRlICYmIHByZWRpY2F0ZVsnc2VsZWN0aW9uJ107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRQcmVkaWNhdGVCYXNlIHtcbiAgLy8gVE9ETzogc3VwcG9ydCBhZ2dyZWdhdGVcblxuICAvKipcbiAgICogVGltZSB1bml0IGZvciB0aGUgZmllbGQgdG8gYmUgZmlsdGVyZWQuXG4gICAqL1xuICB0aW1lVW5pdD86IFRpbWVVbml0O1xuXG4gIC8qKlxuICAgKiBGaWVsZCB0byBiZSBmaWx0ZXJlZC5cbiAgICovXG4gIGZpZWxkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRFcXVhbFByZWRpY2F0ZSBleHRlbmRzIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGVxdWFsIHRvLlxuICAgKi9cbiAgZXF1YWw6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlVGltZTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZEVxdWFsUHJlZGljYXRlKHByZWRpY2F0ZTogYW55KTogcHJlZGljYXRlIGlzIEZpZWxkRXF1YWxQcmVkaWNhdGUge1xuICByZXR1cm4gcHJlZGljYXRlICYmICEhcHJlZGljYXRlLmZpZWxkICYmIHByZWRpY2F0ZS5lcXVhbCAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkTFRQcmVkaWNhdGUgZXh0ZW5kcyBGaWVsZFByZWRpY2F0ZUJhc2Uge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBsZXNzIHRoYW4uXG4gICAqL1xuICBsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZVRpbWU7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRMVFByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZExUUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiBwcmVkaWNhdGUubHQgIT09IHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkTFRFUHJlZGljYXRlIGV4dGVuZHMgRmllbGRQcmVkaWNhdGVCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGF0IHRoZSBmaWVsZCBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFscyB0by5cbiAgICovXG4gIGx0ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZVRpbWU7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRMVEVQcmVkaWNhdGUocHJlZGljYXRlOiBhbnkpOiBwcmVkaWNhdGUgaXMgRmllbGRMVEVQcmVkaWNhdGUge1xuICByZXR1cm4gcHJlZGljYXRlICYmICEhcHJlZGljYXRlLmZpZWxkICYmIHByZWRpY2F0ZS5sdGUgIT09IHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkR1RQcmVkaWNhdGUgZXh0ZW5kcyBGaWVsZFByZWRpY2F0ZUJhc2Uge1xuICAvKipcbiAgICogVGhlIHZhbHVlIHRoYXQgdGhlIGZpZWxkIHNob3VsZCBiZSBncmVhdGVyIHRoYW4uXG4gICAqL1xuICBndDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZVRpbWU7XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRHVFByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZEdUUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiBwcmVkaWNhdGUuZ3QgIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEdURVByZWRpY2F0ZSBleHRlbmRzIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhhdCB0aGUgZmllbGQgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbHMgdG8uXG4gICAqL1xuICBndGU6IHN0cmluZyB8IG51bWJlciB8IERhdGVUaW1lO1xuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpZWxkR1RFUHJlZGljYXRlKHByZWRpY2F0ZTogYW55KTogcHJlZGljYXRlIGlzIEZpZWxkR1RFUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiBwcmVkaWNhdGUuZ3RlICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRSYW5nZVByZWRpY2F0ZSBleHRlbmRzIEZpZWxkUHJlZGljYXRlQmFzZSB7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBpbmNsdXNpdmUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXNcbiAgICogZm9yIGEgZmllbGQgdmFsdWUgb2YgYSBkYXRhIGl0ZW0gdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAqIEBtYXhJdGVtcyAyXG4gICAqIEBtaW5JdGVtcyAyXG4gICAqL1xuICByYW5nZTogKG51bWJlcnxEYXRlVGltZXxudWxsKVtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWVsZFJhbmdlUHJlZGljYXRlKHByZWRpY2F0ZTogYW55KTogcHJlZGljYXRlIGlzIEZpZWxkUmFuZ2VQcmVkaWNhdGUge1xuICBpZiAocHJlZGljYXRlICYmIHByZWRpY2F0ZS5maWVsZCkge1xuICAgIGlmIChpc0FycmF5KHByZWRpY2F0ZS5yYW5nZSkgJiYgcHJlZGljYXRlLnJhbmdlLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZE9uZU9mUHJlZGljYXRlIGV4dGVuZHMgRmllbGRQcmVkaWNhdGVCYXNlIHtcbiAgLyoqXG4gICAqIEEgc2V0IG9mIHZhbHVlcyB0aGF0IHRoZSBgZmllbGRgJ3MgdmFsdWUgc2hvdWxkIGJlIGEgbWVtYmVyIG9mLFxuICAgKiBmb3IgYSBkYXRhIGl0ZW0gaW5jbHVkZWQgaW4gdGhlIGZpbHRlcmVkIGRhdGEuXG4gICAqL1xuICBvbmVPZjogc3RyaW5nW10gfCBudW1iZXJbXSB8IGJvb2xlYW5bXSB8IERhdGVUaW1lW107XG5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRPbmVPZlByZWRpY2F0ZShwcmVkaWNhdGU6IGFueSk6IHByZWRpY2F0ZSBpcyBGaWVsZE9uZU9mUHJlZGljYXRlIHtcbiAgcmV0dXJuIHByZWRpY2F0ZSAmJiAhIXByZWRpY2F0ZS5maWVsZCAmJiAoXG4gICAgaXNBcnJheShwcmVkaWNhdGUub25lT2YpIHx8XG4gICAgaXNBcnJheShwcmVkaWNhdGUuaW4pIC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRmllbGRQcmVkaWNhdGUocHJlZGljYXRlOiBQcmVkaWNhdGUpOiBwcmVkaWNhdGUgaXMgRmllbGRPbmVPZlByZWRpY2F0ZSB8IEZpZWxkRXF1YWxQcmVkaWNhdGUgfCBGaWVsZFJhbmdlUHJlZGljYXRlIHwgRmllbGRMVFByZWRpY2F0ZSB8IEZpZWxkR1RQcmVkaWNhdGUgfCBGaWVsZExURVByZWRpY2F0ZSB8IEZpZWxkR1RFUHJlZGljYXRlIHtcbiAgcmV0dXJuIGlzRmllbGRPbmVPZlByZWRpY2F0ZShwcmVkaWNhdGUpIHx8IGlzRmllbGRFcXVhbFByZWRpY2F0ZShwcmVkaWNhdGUpIHx8IGlzRmllbGRSYW5nZVByZWRpY2F0ZShwcmVkaWNhdGUpIHx8IGlzRmllbGRMVFByZWRpY2F0ZShwcmVkaWNhdGUpIHx8IGlzRmllbGRHVFByZWRpY2F0ZShwcmVkaWNhdGUpIHx8IGlzRmllbGRMVEVQcmVkaWNhdGUocHJlZGljYXRlKSB8fCBpc0ZpZWxkR1RFUHJlZGljYXRlKHByZWRpY2F0ZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBwcmVkaWNhdGUgaW50byBhbiBleHByZXNzaW9uLlxuICovXG4vLyBtb2RlbCBpcyBvbmx5IHVzZWQgZm9yIHNlbGVjdGlvbiBmaWx0ZXJzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cHJlc3Npb24obW9kZWw6IE1vZGVsLCBmaWx0ZXJPcDogTG9naWNhbE9wZXJhbmQ8UHJlZGljYXRlPiwgbm9kZT86IERhdGFGbG93Tm9kZSk6IHN0cmluZyB7XG4gIHJldHVybiBsb2dpY2FsRXhwcihmaWx0ZXJPcCwgKHByZWRpY2F0ZTogUHJlZGljYXRlKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKHByZWRpY2F0ZSkpIHtcbiAgICAgIHJldHVybiBwcmVkaWNhdGU7XG4gICAgfSBlbHNlIGlmIChpc1NlbGVjdGlvblByZWRpY2F0ZShwcmVkaWNhdGUpKSB7XG4gICAgICByZXR1cm4gc2VsZWN0aW9uUHJlZGljYXRlKG1vZGVsLCBwcmVkaWNhdGUuc2VsZWN0aW9uLCBub2RlKTtcbiAgICB9IGVsc2UgeyAvLyBGaWx0ZXIgT2JqZWN0XG4gICAgICByZXR1cm4gZmllbGRGaWx0ZXJFeHByZXNzaW9uKHByZWRpY2F0ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBWb3lhZ2VyLiAgRG8gbm90IGNoYW5nZSBpdHMgYmVoYXZpb3Igd2l0aG91dCBjaGFuZ2luZyBWb3lhZ2VyLlxuZXhwb3J0IGZ1bmN0aW9uIGZpZWxkRmlsdGVyRXhwcmVzc2lvbihwcmVkaWNhdGU6IEZpZWxkUHJlZGljYXRlLCB1c2VJblJhbmdlPXRydWUpIHtcbiAgY29uc3QgZmllbGRFeHByID0gcHJlZGljYXRlLnRpbWVVbml0ID9cbiAgICAvLyBGb3IgdGltZVVuaXQsIGNhc3QgaW50byBpbnRlZ2VyIHdpdGggdGltZSgpIHNvIHdlIGNhbiB1c2UgPT09LCBpbnJhbmdlLCBpbmRleE9mIHRvIGNvbXBhcmUgdmFsdWVzIGRpcmVjdGx5LlxuICAgICAgLy8gVE9ETzogV2UgY2FsY3VsYXRlIHRpbWVVbml0IG9uIHRoZSBmbHkgaGVyZS4gQ29uc2lkZXIgaWYgd2Ugd291bGQgbGlrZSB0byBjb25zb2xpZGF0ZSB0aGlzIHdpdGggdGltZVVuaXQgcGlwZWxpbmVcbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgdXRjXG4gICAgKCd0aW1lKCcgKyB0aW1lVW5pdEZpZWxkRXhwcihwcmVkaWNhdGUudGltZVVuaXQsIHByZWRpY2F0ZS5maWVsZCkgKyAnKScpIDpcbiAgICB2Z0ZpZWxkKHByZWRpY2F0ZSwge2V4cHI6ICdkYXR1bSd9KTtcblxuICBpZiAoaXNGaWVsZEVxdWFsUHJlZGljYXRlKHByZWRpY2F0ZSkpIHtcbiAgICByZXR1cm4gZmllbGRFeHByICsgJz09PScgKyB2YWx1ZUV4cHIocHJlZGljYXRlLmVxdWFsLCBwcmVkaWNhdGUudGltZVVuaXQpO1xuICB9IGVsc2UgaWYgKGlzRmllbGRMVFByZWRpY2F0ZShwcmVkaWNhdGUpKSB7XG4gICAgY29uc3QgdXBwZXIgPSBwcmVkaWNhdGUubHQ7XG4gICAgcmV0dXJuIGAke2ZpZWxkRXhwcn08JHt2YWx1ZUV4cHIodXBwZXIsIHByZWRpY2F0ZS50aW1lVW5pdCl9YDtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkR1RQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIGNvbnN0IGxvd2VyID0gcHJlZGljYXRlLmd0O1xuICAgIHJldHVybiBgJHtmaWVsZEV4cHJ9PiR7dmFsdWVFeHByKGxvd2VyLCBwcmVkaWNhdGUudGltZVVuaXQpfWA7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZExURVByZWRpY2F0ZShwcmVkaWNhdGUpKSB7XG4gICAgY29uc3QgdXBwZXIgPSBwcmVkaWNhdGUubHRlO1xuICAgIHJldHVybiBgJHtmaWVsZEV4cHJ9PD0ke3ZhbHVlRXhwcih1cHBlciwgcHJlZGljYXRlLnRpbWVVbml0KX1gO1xuICB9IGVsc2UgaWYgKGlzRmllbGRHVEVQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIGNvbnN0IGxvd2VyID0gcHJlZGljYXRlLmd0ZTtcbiAgICByZXR1cm4gYCR7ZmllbGRFeHByfT49JHt2YWx1ZUV4cHIobG93ZXIsIHByZWRpY2F0ZS50aW1lVW5pdCl9YDtcbiAgfSBlbHNlIGlmIChpc0ZpZWxkT25lT2ZQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIC8vIFwib25lT2ZcIiB3YXMgZm9ybWVybHkgXCJpblwiIC0tIHNvIHdlIG5lZWQgdG8gYWRkIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICBjb25zdCBvbmVPZjogRmllbGRPbmVPZlByZWRpY2F0ZVtdID0gcHJlZGljYXRlLm9uZU9mIHx8IHByZWRpY2F0ZVsnaW4nXTtcbiAgICByZXR1cm4gJ2luZGV4b2YoWycgK1xuICAgICAgb25lT2YubWFwKCh2KSA9PiB2YWx1ZUV4cHIodiwgcHJlZGljYXRlLnRpbWVVbml0KSkuam9pbignLCcpICtcbiAgICAgICddLCAnICsgZmllbGRFeHByICsgJykgIT09IC0xJztcbiAgfSBlbHNlIGlmIChpc0ZpZWxkUmFuZ2VQcmVkaWNhdGUocHJlZGljYXRlKSkge1xuICAgIGNvbnN0IGxvd2VyID0gcHJlZGljYXRlLnJhbmdlWzBdO1xuICAgIGNvbnN0IHVwcGVyID0gcHJlZGljYXRlLnJhbmdlWzFdO1xuXG4gICAgaWYgKGxvd2VyICE9PSBudWxsICYmIHVwcGVyICE9PSBudWxsICYmIHVzZUluUmFuZ2UpIHtcbiAgICAgIHJldHVybiAnaW5yYW5nZSgnICsgZmllbGRFeHByICsgJywgWycgK1xuICAgICAgICB2YWx1ZUV4cHIobG93ZXIsIHByZWRpY2F0ZS50aW1lVW5pdCkgKyAnLCAnICtcbiAgICAgICAgdmFsdWVFeHByKHVwcGVyLCBwcmVkaWNhdGUudGltZVVuaXQpICsgJ10pJztcbiAgICB9XG5cbiAgICBjb25zdCBleHBycyA9IFtdO1xuICAgIGlmIChsb3dlciAhPT0gbnVsbCkge1xuICAgICAgZXhwcnMucHVzaChgJHtmaWVsZEV4cHJ9ID49ICR7dmFsdWVFeHByKGxvd2VyLCBwcmVkaWNhdGUudGltZVVuaXQpfWApO1xuICAgIH1cbiAgICBpZiAodXBwZXIgIT09IG51bGwpIHtcbiAgICAgIGV4cHJzLnB1c2goYCR7ZmllbGRFeHByfSA8PSAke3ZhbHVlRXhwcih1cHBlciwgcHJlZGljYXRlLnRpbWVVbml0KX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXhwcnMubGVuZ3RoID4gMCA/IGV4cHJzLmpvaW4oJyAmJiAnKSA6ICd0cnVlJztcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBpdCBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSAqL1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmllbGQgcHJlZGljYXRlOiAke0pTT04uc3RyaW5naWZ5KHByZWRpY2F0ZSl9YCk7XG59XG5cbmZ1bmN0aW9uIHZhbHVlRXhwcih2OiBhbnksIHRpbWVVbml0OiBUaW1lVW5pdCk6IHN0cmluZyB7XG4gIGlmIChpc0RhdGVUaW1lKHYpKSB7XG4gICAgY29uc3QgZXhwciA9IGRhdGVUaW1lRXhwcih2LCB0cnVlKTtcbiAgICByZXR1cm4gJ3RpbWUoJyArIGV4cHIgKyAnKSc7XG4gIH1cbiAgaWYgKGlzTG9jYWxTaW5nbGVUaW1lVW5pdCh0aW1lVW5pdCkpIHtcbiAgICBjb25zdCBkYXRldGltZTogRGF0ZVRpbWUgPSB7fTtcbiAgICBkYXRldGltZVt0aW1lVW5pdF0gPSB2O1xuICAgIGNvbnN0IGV4cHIgPSBkYXRlVGltZUV4cHIoZGF0ZXRpbWUsIHRydWUpO1xuICAgIHJldHVybiAndGltZSgnICsgZXhwciArICcpJztcbiAgfSBlbHNlIGlmIChpc1V0Y1NpbmdsZVRpbWVVbml0KHRpbWVVbml0KSkge1xuICAgIHJldHVybiB2YWx1ZUV4cHIodiwgZ2V0TG9jYWxUaW1lVW5pdCh0aW1lVW5pdCkpO1xuICB9XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVByZWRpY2F0ZShmOiBQcmVkaWNhdGUpOiBQcmVkaWNhdGUge1xuICBpZiAoaXNGaWVsZFByZWRpY2F0ZShmKSAmJiBmLnRpbWVVbml0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmYsXG4gICAgICB0aW1lVW5pdDogbm9ybWFsaXplVGltZVVuaXQoZi50aW1lVW5pdClcbiAgICB9O1xuICB9XG4gIHJldHVybiBmO1xufVxuIl19","import { normalizeLogicalOperand } from './logical';\nimport { normalizePredicate } from './predicate';\nexport function isFilter(t) {\n return t['filter'] !== undefined;\n}\nexport function isLookup(t) {\n return t['lookup'] !== undefined;\n}\nexport function isWindow(t) {\n return t['window'] !== undefined;\n}\nexport function isCalculate(t) {\n return t['calculate'] !== undefined;\n}\nexport function isBin(t) {\n return !!t['bin'];\n}\nexport function isTimeUnit(t) {\n return t['timeUnit'] !== undefined;\n}\nexport function isAggregate(t) {\n return t['aggregate'] !== undefined;\n}\nexport function isStack(t) {\n return t['stack'] !== undefined;\n}\nexport function normalizeTransform(transform) {\n return transform.map(function (t) {\n if (isFilter(t)) {\n return {\n filter: normalizeLogicalOperand(t.filter, normalizePredicate)\n };\n }\n return t;\n });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQWlCLHVCQUF1QixFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxrQkFBa0IsRUFBWSxNQUFNLGFBQWEsQ0FBQztBQTJCMUQsTUFBTSxtQkFBbUIsQ0FBWTtJQUNuQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDbkMsQ0FBQztBQWdPRCxNQUFNLG1CQUFtQixDQUFZO0lBQ25DLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxtQkFBbUIsQ0FBWTtJQUNuQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sc0JBQXNCLENBQVk7SUFDdEMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxNQUFNLGdCQUFnQixDQUFZO0lBQ2hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBRUQsTUFBTSxxQkFBcUIsQ0FBWTtJQUNyQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sc0JBQXNCLENBQVk7SUFDdEMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLEtBQUssU0FBUyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxNQUFNLGtCQUFrQixDQUFZO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNsQyxDQUFDO0FBSUQsTUFBTSw2QkFBNkIsU0FBc0I7SUFDdkQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQztRQUNwQixJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNmLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUM7YUFDOUQsQ0FBQztTQUNIO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FnZ3JlZ2F0ZU9wfSBmcm9tICd2ZWdhJztcblxuaW1wb3J0IHtCaW5QYXJhbXN9IGZyb20gJy4vYmluJztcbmltcG9ydCB7RGF0YX0gZnJvbSAnLi9kYXRhJztcbmltcG9ydCB7TG9naWNhbE9wZXJhbmQsIG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kfSBmcm9tICcuL2xvZ2ljYWwnO1xuaW1wb3J0IHtub3JtYWxpemVQcmVkaWNhdGUsIFByZWRpY2F0ZX0gZnJvbSAnLi9wcmVkaWNhdGUnO1xuaW1wb3J0IHtTb3J0RmllbGR9IGZyb20gJy4vc29ydCc7XG5pbXBvcnQge1RpbWVVbml0fSBmcm9tICcuL3RpbWV1bml0JztcblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogVGhlIGBmaWx0ZXJgIHByb3BlcnR5IG11c3QgYmUgb25lIG9mIHRoZSBwcmVkaWNhdGUgZGVmaW5pdGlvbnM6XG4gICAqXG4gICAqIDEpIGFuIFtleHByZXNzaW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGVzLmh0bWwjZXhwcmVzc2lvbikgc3RyaW5nLFxuICAgKiB3aGVyZSBgZGF0dW1gIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGRhdGEgb2JqZWN0XG4gICAqXG4gICAqIDIpIG9uZSBvZiB0aGUgZmllbGQgcHJlZGljYXRlczogW2BlcXVhbGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjZXF1YWwtcHJlZGljYXRlKSxcbiAgICogW2BsdGBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjbHQtcHJlZGljYXRlKSxcbiAgICogW2BsdGVgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI2x0ZS1wcmVkaWNhdGUpLFxuICAgKiBbYGd0YF0oaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby92ZWdhLWxpdGUvZG9jcy9maWx0ZXIuaHRtbCNndC1wcmVkaWNhdGUpLFxuICAgKiBbYGd0ZWBdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvZmlsdGVyLmh0bWwjZ3RlLXByZWRpY2F0ZSksXG4gICAqIFtgcmFuZ2VgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI3JhbmdlLXByZWRpY2F0ZSksXG4gICAqIG9yIFtgb25lT2ZgXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI29uZS1vZi1wcmVkaWNhdGUpLlxuICAgKlxuICAgKiAzKSBhIFtzZWxlY3Rpb24gcHJlZGljYXRlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL2ZpbHRlci5odG1sI3NlbGVjdGlvbi1wcmVkaWNhdGUpXG4gICAqXG4gICAqIDQpIGEgbG9naWNhbCBvcGVyYW5kIHRoYXQgY29tYmluZXMgKDEpLCAoMiksIG9yICgzKS5cbiAgICovXG4gIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjkwMVxuICBmaWx0ZXI6IExvZ2ljYWxPcGVyYW5kPFByZWRpY2F0ZT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZpbHRlcih0OiBUcmFuc2Zvcm0pOiB0IGlzIEZpbHRlclRyYW5zZm9ybSB7XG4gIHJldHVybiB0WydmaWx0ZXInXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGN1bGF0ZVRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBBIFtleHByZXNzaW9uXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3R5cGVzLmh0bWwjZXhwcmVzc2lvbikgc3RyaW5nLiBVc2UgdGhlIHZhcmlhYmxlIGBkYXR1bWAgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgZGF0YSBvYmplY3QuXG4gICAqL1xuICBjYWxjdWxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGZpZWxkIGZvciBzdG9yaW5nIHRoZSBjb21wdXRlZCBmb3JtdWxhIHZhbHVlLlxuICAgKi9cbiAgYXM6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCaW5UcmFuc2Zvcm0ge1xuICAvKipcbiAgICogQW4gb2JqZWN0IGluZGljYXRpbmcgYmluIHByb3BlcnRpZXMsIG9yIHNpbXBseSBgdHJ1ZWAgZm9yIHVzaW5nIGRlZmF1bHQgYmluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBiaW46IGJvb2xlYW4gfCBCaW5QYXJhbXM7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkIHRvIGJpbi5cbiAgICovXG4gIGZpZWxkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXQgZmllbGRzIGF0IHdoaWNoIHRvIHdyaXRlIHRoZSBzdGFydCBhbmQgZW5kIGJpbiB2YWx1ZXMuXG4gICAqL1xuICBhczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWVVbml0VHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lVW5pdC5cbiAgICovXG4gIHRpbWVVbml0OiBUaW1lVW5pdDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgZmllbGQgdG8gYXBwbHkgdGltZSB1bml0LlxuICAgKi9cbiAgZmllbGQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmaWVsZCB0byB3cml0ZSB0aGUgdGltZVVuaXQgdmFsdWUuXG4gICAqL1xuICBhczogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZ3JlZ2F0ZVRyYW5zZm9ybSB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIGZpZWxkcyB0byBhZ2dyZWdhdGUuXG4gICAqL1xuICBhZ2dyZWdhdGU6IEFnZ3JlZ2F0ZWRGaWVsZERlZltdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmaWVsZHMgdG8gZ3JvdXAgYnkuIElmIG5vdCBzcGVjaWZpZWQsIGEgc2luZ2xlIGdyb3VwIGNvbnRhaW5pbmcgYWxsIGRhdGEgb2JqZWN0cyB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBncm91cGJ5Pzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdncmVnYXRlZEZpZWxkRGVmIHtcbiAgLyoqXG4gICAqIFRoZSBhZ2dyZWdhdGlvbiBvcGVyYXRpb25zIHRvIGFwcGx5IHRvIHRoZSBmaWVsZHMsIHN1Y2ggYXMgc3VtLCBhdmVyYWdlIG9yIGNvdW50LlxuICAgKiBTZWUgdGhlIFtmdWxsIGxpc3Qgb2Ygc3VwcG9ydGVkIGFnZ3JlZ2F0aW9uIG9wZXJhdGlvbnNdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3MvYWdncmVnYXRlLmh0bWwjb3BzKVxuICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIG9wOiBBZ2dyZWdhdGVPcDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgZmllbGQgZm9yIHdoaWNoIHRvIGNvbXB1dGUgYWdncmVnYXRlIGZ1bmN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIGZvciBhbGwgYWdncmVnYXRpb24gb3BlcmF0aW9ucyBleGNlcHQgYFwiY291bnRcImAuXG4gICAqL1xuICBmaWVsZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBmaWVsZCBuYW1lcyB0byB1c2UgZm9yIGVhY2ggYWdncmVnYXRlZCBmaWVsZC5cbiAgICovXG4gIGFzOiBzdHJpbmc7XG59XG5cblxuLyoqXG4gKiBAaGlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSBmaWVsZCB3aGljaCBpcyBzdGFja2VkLlxuICAgKi9cbiAgc3RhY2s6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkcyB0byBncm91cCBieS5cbiAgICovXG4gIGdyb3VwYnk6IHN0cmluZ1tdO1xuICAvKipcbiAgICogTW9kZSBmb3Igc3RhY2tpbmcgbWFya3MuXG4gICAqIF9fRGVmYXVsdCB2YWx1ZTpfXyBgXCJ6ZXJvXCJgXG4gICAqL1xuICBvZmZzZXQ/OiAnemVybycgfCAnY2VudGVyJyB8ICdub3JtYWxpemUnO1xuICAvKipcbiAgICogRmllbGQgdGhhdCBkZXRlcm1pbmVzIHRoZSBvcmRlciBvZiBsZWF2ZXMgaW4gdGhlIHN0YWNrZWQgY2hhcnRzLlxuICAgKi9cbiAgc29ydD86IFNvcnRGaWVsZFtdO1xuICAvKipcbiAgICogT3V0cHV0IGZpZWxkIG5hbWVzLiBUaGlzIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyB3aXRoXG4gICAqIHR3byBlbGVtZW50cyBkZW5vdGluZyB0aGUgbmFtZSBmb3IgdGhlIGZpZWxkcyBmb3Igc3RhY2sgc3RhcnQgYW5kIHN0YWNrIGVuZFxuICAgKiByZXNwZWN0aXZlbHkuXG4gICAqIElmIGEgc2luZ2xlIHN0cmluZyhlZy5cInZhbFwiKSBpcyBwcm92aWRlZCwgdGhlIGVuZCBmaWVsZCB3aWxsIGJlIFwidmFsX2VuZFwiLlxuICAgKi9cbiAgYXM6IHN0cmluZyB8IHN0cmluZ1tdO1xuXG59XG5cblxuZXhwb3J0IHR5cGUgV2luZG93T25seU9wID1cbiAgJ3Jvd19udW1iZXInIHxcbiAgICdyYW5rJyB8XG4gICAnZGVuc2VfcmFuaycgfFxuICAgJ3BlcmNlbnRfcmFuaycgfFxuICAgJ2N1bWVfZGlzdCcgfFxuICAgJ250aWxlJyB8XG4gICAnbGFnJyB8XG4gICAnbGVhZCcgfFxuICAgJ2ZpcnN0X3ZhbHVlJyB8XG4gICAnbGFzdF92YWx1ZScgfFxuICAgJ250aF92YWx1ZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luZG93RmllbGREZWYge1xuICAvKipcbiAgICogVGhlIHdpbmRvdyBvciBhZ2dyZWdhdGlvbiBvcGVyYXRpb25zIHRvIGFwcGx5IHdpdGhpbiBhIHdpbmRvdywgaW5jbHVkaW5nIGByYW5rYCwgYGxlYWRgLCBgc3VtYCwgYGF2ZXJhZ2VgIG9yIGBjb3VudGAuIFNlZSB0aGUgbGlzdCBvZiBhbGwgc3VwcG9ydGVkIG9wZXJhdGlvbnMgW2hlcmVdKGh0dHBzOi8vdmVnYS5naXRodWIuaW8vdmVnYS1saXRlL2RvY3Mvd2luZG93Lmh0bWwjb3BzKS5cbiAgICovXG4gIG9wOiBBZ2dyZWdhdGVPcCB8IFdpbmRvd09ubHlPcDtcblxuICAvKipcbiAgICogUGFyYW1ldGVyIHZhbHVlcyBmb3IgdGhlIHdpbmRvdyBmdW5jdGlvbnMuIFBhcmFtZXRlciB2YWx1ZXMgY2FuIGJlIG9taXR0ZWQgZm9yIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgYWNjZXB0IGEgcGFyYW1ldGVyLlxuICAgKlxuICAgKiBTZWUgdGhlIGxpc3Qgb2YgYWxsIHN1cHBvcnRlZCBvcGVyYXRpb25zIGFuZCB0aGVpciBwYXJhbWV0ZXJzIFtoZXJlXShodHRwczovL3ZlZ2EuZ2l0aHViLmlvL3ZlZ2EtbGl0ZS9kb2NzL3RyYW5zZm9ybXMvd2luZG93Lmh0bWwpLlxuICAgKi9cbiAgcGFyYW0/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIGZpZWxkIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSBhZ2dyZWdhdGUgb3Igd2luZG93IGZ1bmN0aW9uLiBUaGlzIGNhbiBiZSBvbWl0dGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHRoYXQgZG8gbm90IG9wZXJhdGUgb3ZlciBhIGZpZWxkIHN1Y2ggYXMgYGNvdW50YCwgYHJhbmtgLCBgZGVuc2VfcmFua2AuXG4gICAqL1xuICBmaWVsZD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBuYW1lIGZvciB0aGUgd2luZG93IG9wZXJhdGlvbi5cbiAgICovXG4gIGFzOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2luZG93VHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZHMgaW4gdGhlIHdpbmRvdywgYW5kIHdoYXQgY2FsY3VsYXRpb25zIHRvIHVzZS5cbiAgICovXG4gIHdpbmRvdzogV2luZG93RmllbGREZWZbXTtcblxuICAvKipcbiAgICogQSBmcmFtZSBzcGVjaWZpY2F0aW9uIGFzIGEgdHdvLWVsZW1lbnQgYXJyYXkgaW5kaWNhdGluZyBob3cgdGhlIHNsaWRpbmcgd2luZG93IHNob3VsZCBwcm9jZWVkLiBUaGUgYXJyYXkgZW50cmllcyBzaG91bGQgZWl0aGVyIGJlIGEgbnVtYmVyIGluZGljYXRpbmcgdGhlIG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IGRhdGEgb2JqZWN0LCBvciBudWxsIHRvIGluZGljYXRlIHVuYm91bmRlZCByb3dzIHByZWNlZGluZyBvciBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgZGF0YSBvYmplY3QuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBbbnVsbCwgMF1gLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHNsaWRpbmcgd2luZG93IGluY2x1ZGVzIHRoZSBjdXJyZW50IG9iamVjdCBhbmQgYWxsIHByZWNlZGluZyBvYmplY3RzLiBUaGUgdmFsdWUgYFstNSwgNV1gIGluZGljYXRlcyB0aGF0IHRoZSB3aW5kb3cgc2hvdWxkIGluY2x1ZGUgZml2ZSBvYmplY3RzIHByZWNlZGluZyBhbmQgZml2ZSBvYmplY3RzIGZvbGxvd2luZyB0aGUgY3VycmVudCBvYmplY3QuIEZpbmFsbHksIGBbbnVsbCwgbnVsbF1gIGluZGljYXRlcyB0aGF0IHRoZSB3aW5kb3cgZnJhbWUgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIGFsbCBkYXRhIG9iamVjdHMuIFRoZSBvbmx5IG9wZXJhdG9ycyBhZmZlY3RlZCBhcmUgdGhlIGFnZ3JlZ2F0aW9uIG9wZXJhdGlvbnMgYW5kIHRoZSBgZmlyc3RfdmFsdWVgLCBgbGFzdF92YWx1ZWAsIGFuZCBgbnRoX3ZhbHVlYCB3aW5kb3cgb3BlcmF0aW9ucy4gVGhlIG90aGVyIHdpbmRvdyBvcGVyYXRpb25zIGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhpcy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fOiAgYFtudWxsLCAwXWAgKGluY2x1ZGVzIHRoZSBjdXJyZW50IG9iamVjdCBhbmQgYWxsIHByZWNlZGluZyBvYmplY3RzKVxuICAgKi9cbiAgZnJhbWU/OiAobnVsbCB8IG51bWJlcilbXTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBzbGlkaW5nIHdpbmRvdyBmcmFtZSBzaG91bGQgaWdub3JlIHBlZXIgdmFsdWVzLiAoUGVlciB2YWx1ZXMgYXJlIHRob3NlIGNvbnNpZGVyZWQgaWRlbnRpY2FsIGJ5IHRoZSBzb3J0IGNyaXRlcmlhKS4gVGhlIGRlZmF1bHQgaXMgZmFsc2UsIGNhdXNpbmcgdGhlIHdpbmRvdyBmcmFtZSB0byBleHBhbmQgdG8gaW5jbHVkZSBhbGwgcGVlciB2YWx1ZXMuIElmIHNldCB0byB0cnVlLCB0aGUgd2luZG93IGZyYW1lIHdpbGwgYmUgZGVmaW5lZCBieSBvZmZzZXQgdmFsdWVzIG9ubHkuIFRoaXMgc2V0dGluZyBvbmx5IGFmZmVjdHMgdGhvc2Ugb3BlcmF0aW9ucyB0aGF0IGRlcGVuZCBvbiB0aGUgd2luZG93IGZyYW1lLCBuYW1lbHkgYWdncmVnYXRpb24gb3BlcmF0aW9ucyBhbmQgdGhlIGZpcnN0X3ZhbHVlLCBsYXN0X3ZhbHVlLCBhbmQgbnRoX3ZhbHVlIHdpbmRvdyBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBfX0RlZmF1bHQgdmFsdWU6X18gYGZhbHNlYFxuICAgKi9cbiAgaWdub3JlUGVlcnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgZGF0YSBmaWVsZHMgZm9yIHBhcnRpdGlvbmluZyB0aGUgZGF0YSBvYmplY3RzIGludG8gc2VwYXJhdGUgd2luZG93cy4gSWYgdW5zcGVjaWZpZWQsIGFsbCBkYXRhIHBvaW50cyB3aWxsIGJlIGEgc2luZ2xlIGdyb3VwLlxuICAgKi9cbiAgZ3JvdXBieT86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBBIHNvcnQgZmllbGQgZGVmaW5pdGlvbiBmb3Igc29ydGluZyBkYXRhIG9iamVjdHMgd2l0aGluIGEgd2luZG93LiBJZiB0d28gZGF0YSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGJ5IHRoZSBjb21wYXJhdG9yLCB0aGV5IGFyZSBjb25zaWRlcmVkIOKAnHBlZXLigJ0gdmFsdWVzIG9mIGVxdWFsIHJhbmsuIElmIHNvcnQgaXMgbm90IHNwZWNpZmllZCwgdGhlIG9yZGVyIGlzIHVuZGVmaW5lZDogZGF0YSBvYmplY3RzIGFyZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIG9ic2VydmVkIGFuZCBub25lIGFyZSBjb25zaWRlcmVkIHBlZXJzICh0aGUgaWdub3JlUGVlcnMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgc2V0IHRvIGB0cnVlYCkuXG4gICAqL1xuICBzb3J0PzogU29ydEZpZWxkW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRGF0YSB7XG4gIC8qKlxuICAgKiBTZWNvbmRhcnkgZGF0YSBzb3VyY2UgdG8gbG9va3VwIGluLlxuICAgKi9cbiAgZGF0YTogRGF0YTtcbiAgLyoqXG4gICAqIEtleSBpbiBkYXRhIHRvIGxvb2t1cC5cbiAgICovXG4gIGtleTogc3RyaW5nO1xuICAvKipcbiAgICogRmllbGRzIGluIGZvcmVpZ24gZGF0YSB0byBsb29rdXAuXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBlbnRpcmUgb2JqZWN0IGlzIHF1ZXJpZWQuXG4gICAqL1xuICBmaWVsZHM/OiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBUcmFuc2Zvcm0ge1xuICAvKipcbiAgICogS2V5IGluIHByaW1hcnkgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBsb29rdXA6IHN0cmluZztcblxuICAvKipcbiAgICogU2Vjb25kYXJ5IGRhdGEgcmVmZXJlbmNlLlxuICAgKi9cbiAgZnJvbTogTG9va3VwRGF0YTtcblxuICAvKipcbiAgICogVGhlIGZpZWxkIG9yIGZpZWxkcyBmb3Igc3RvcmluZyB0aGUgY29tcHV0ZWQgZm9ybXVsYSB2YWx1ZS5cbiAgICogSWYgYGZyb20uZmllbGRzYCBpcyBzcGVjaWZpZWQsIHRoZSB0cmFuc2Zvcm0gd2lsbCB1c2UgdGhlIHNhbWUgbmFtZXMgZm9yIGBhc2AuXG4gICAqIElmIGBmcm9tLmZpZWxkc2AgaXMgbm90IHNwZWNpZmllZCwgYGFzYCBoYXMgdG8gYmUgYSBzdHJpbmcgYW5kIHdlIHB1dCB0aGUgd2hvbGUgb2JqZWN0IGludG8gdGhlIGRhdGEgdW5kZXIgdGhlIHNwZWNpZmllZCBuYW1lLlxuICAgKi9cbiAgYXM/OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgdG8gdXNlIGlmIGxvb2t1cCBmYWlscy5cbiAgICpcbiAgICogX19EZWZhdWx0IHZhbHVlOl9fIGBudWxsYFxuICAgKi9cbiAgZGVmYXVsdD86IHN0cmluZztcbn1cblxuXG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvb2t1cCh0OiBUcmFuc2Zvcm0pOiB0IGlzIExvb2t1cFRyYW5zZm9ybSB7XG4gIHJldHVybiB0Wydsb29rdXAnXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXaW5kb3codDogVHJhbnNmb3JtKTogdCBpcyBXaW5kb3dUcmFuc2Zvcm0ge1xuICByZXR1cm4gdFsnd2luZG93J10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ2FsY3VsYXRlKHQ6IFRyYW5zZm9ybSk6IHQgaXMgQ2FsY3VsYXRlVHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ2NhbGN1bGF0ZSddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Jpbih0OiBUcmFuc2Zvcm0pOiB0IGlzIEJpblRyYW5zZm9ybSB7XG4gIHJldHVybiAhIXRbJ2JpbiddO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVW5pdCh0OiBUcmFuc2Zvcm0pOiB0IGlzIFRpbWVVbml0VHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ3RpbWVVbml0J10gIT09IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQWdncmVnYXRlKHQ6IFRyYW5zZm9ybSk6IHQgaXMgQWdncmVnYXRlVHJhbnNmb3JtIHtcbiAgcmV0dXJuIHRbJ2FnZ3JlZ2F0ZSddICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0YWNrKHQ6IFRyYW5zZm9ybSk6IHQgaXMgU3RhY2tUcmFuc2Zvcm0ge1xuICByZXR1cm4gdFsnc3RhY2snXSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2Zvcm0gPSBGaWx0ZXJUcmFuc2Zvcm0gfCBDYWxjdWxhdGVUcmFuc2Zvcm0gfCBMb29rdXBUcmFuc2Zvcm0gfCBCaW5UcmFuc2Zvcm0gfCBUaW1lVW5pdFRyYW5zZm9ybSB8IEFnZ3JlZ2F0ZVRyYW5zZm9ybSB8IFdpbmRvd1RyYW5zZm9ybSB8IFN0YWNrVHJhbnNmb3JtO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVHJhbnNmb3JtKHRyYW5zZm9ybTogVHJhbnNmb3JtW10pIHtcbiAgcmV0dXJuIHRyYW5zZm9ybS5tYXAodCA9PiB7XG4gICAgaWYgKGlzRmlsdGVyKHQpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWx0ZXI6IG5vcm1hbGl6ZUxvZ2ljYWxPcGVyYW5kKHQuZmlsdGVyLCBub3JtYWxpemVQcmVkaWNhdGUpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfSk7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { binToString } from '../../bin';\nimport { normalizeBin, vgField } from '../../fielddef';\nimport { duplicate, flatten, keys, vals } from '../../util';\nimport { binFormatExpression, binRequiresRange } from '../common';\nimport { isUnitModel } from '../model';\nimport { DataFlowNode } from './dataflow';\nfunction rangeFormula(model, fieldDef, channel, config) {\n if (binRequiresRange(fieldDef, channel)) {\n // read format from axis or legend, if there is no format then use config.numberFormat\n var guide = isUnitModel(model) ? (model.axis(channel) || model.legend(channel) || {}) : {};\n var startField = vgField(fieldDef, { expr: 'datum', });\n var endField = vgField(fieldDef, { expr: 'datum', binSuffix: 'end' });\n return {\n formulaAs: vgField(fieldDef, { binSuffix: 'range' }),\n formula: binFormatExpression(startField, endField, guide.format, config)\n };\n }\n return {};\n}\nfunction binKey(bin, field) {\n return binToString(bin) + \"_\" + field;\n}\nfunction getSignalsFromModel(model, key) {\n return {\n signal: model.getName(key + \"_bins\"),\n extentSignal: model.getName(key + \"_extent\")\n };\n}\nfunction isBinTransform(t) {\n return 'as' in t;\n}\nfunction createBinComponent(t, model) {\n var as;\n if (isBinTransform(t)) {\n as = [t.as, t.as + \"_end\"];\n }\n else {\n as = [vgField(t, {}), vgField(t, { binSuffix: 'end' })];\n }\n var bin = normalizeBin(t.bin, undefined) || {};\n var key = binKey(bin, t.field);\n var _a = getSignalsFromModel(model, key), signal = _a.signal, extentSignal = _a.extentSignal;\n var binComponent = tslib_1.__assign({ bin: bin, field: t.field, as: as }, signal ? { signal: signal } : {}, extentSignal ? { extentSignal: extentSignal } : {});\n return { key: key, binComponent: binComponent };\n}\nvar BinNode = /** @class */ (function (_super) {\n tslib_1.__extends(BinNode, _super);\n function BinNode(parent, bins) {\n var _this = _super.call(this, parent) || this;\n _this.bins = bins;\n return _this;\n }\n BinNode.prototype.clone = function () {\n return new BinNode(null, duplicate(this.bins));\n };\n BinNode.makeFromEncoding = function (parent, model) {\n var bins = model.reduceFieldDef(function (binComponentIndex, fieldDef, channel) {\n if (fieldDef.bin) {\n var _a = createBinComponent(fieldDef, model), key = _a.key, binComponent = _a.binComponent;\n binComponentIndex[key] = tslib_1.__assign({}, binComponent, binComponentIndex[key], rangeFormula(model, fieldDef, channel, model.config));\n }\n return binComponentIndex;\n }, {});\n if (keys(bins).length === 0) {\n return null;\n }\n return new BinNode(parent, bins);\n };\n /**\n * Creates a bin node from BinTransform.\n * The optional parameter should provide\n */\n BinNode.makeFromTransform = function (parent, t, model) {\n var _a;\n var _b = createBinComponent(t, model), key = _b.key, binComponent = _b.binComponent;\n return new BinNode(parent, (_a = {},\n _a[key] = binComponent,\n _a));\n };\n BinNode.prototype.merge = function (other) {\n this.bins = tslib_1.__assign({}, this.bins, other.bins);\n other.remove();\n };\n BinNode.prototype.producedFields = function () {\n var out = {};\n vals(this.bins).forEach(function (c) {\n c.as.forEach(function (f) { return out[f] = true; });\n });\n return out;\n };\n BinNode.prototype.dependentFields = function () {\n var out = {};\n vals(this.bins).forEach(function (c) {\n out[c.field] = true;\n });\n return out;\n };\n BinNode.prototype.assemble = function () {\n return flatten(vals(this.bins).map(function (bin) {\n var transform = [];\n var binTrans = tslib_1.__assign({ type: 'bin', field: bin.field, as: bin.as, signal: bin.signal }, bin.bin);\n if (!bin.bin.extent && bin.extentSignal) {\n transform.push({\n type: 'extent',\n field: bin.field,\n signal: bin.extentSignal\n });\n binTrans.extent = { signal: bin.extentSignal };\n }\n transform.push(binTrans);\n if (bin.formula) {\n transform.push({\n type: 'formula',\n expr: bin.formula,\n as: bin.formulaAs\n });\n }\n return transform;\n }));\n };\n return BinNode;\n}(DataFlowNode));\nexport { BinNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9iaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBWSxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHakQsT0FBTyxFQUFXLFlBQVksRUFBRSxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUvRCxPQUFPLEVBQU8sU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRWhFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoRSxPQUFPLEVBQUMsV0FBVyxFQUF3QixNQUFNLFVBQVUsQ0FBQztBQUM1RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR3hDLHNCQUFzQixLQUFxQixFQUFFLFFBQTBCLEVBQUUsT0FBZ0IsRUFBRSxNQUFjO0lBQ3JHLElBQUksZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZDLHNGQUFzRjtRQUV0RixJQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFN0YsSUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEdBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBRXRFLE9BQU87WUFDTCxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUMsQ0FBQztZQUNsRCxPQUFPLEVBQUUsbUJBQW1CLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztTQUN6RSxDQUFDO0tBQ0g7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNkLENBQUM7QUFFRCxnQkFBZ0IsR0FBYyxFQUFFLEtBQWE7SUFDM0MsT0FBVSxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQUksS0FBTyxDQUFDO0FBQ3hDLENBQUM7QUFFRCw2QkFBNkIsS0FBWSxFQUFFLEdBQVc7SUFDcEQsT0FBTztRQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFJLEdBQUcsVUFBTyxDQUFDO1FBQ3BDLFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFJLEdBQUcsWUFBUyxDQUFDO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQsd0JBQXdCLENBQWtDO0lBQ3hELE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEJBQTRCLENBQWtDLEVBQUUsS0FBWTtJQUMxRSxJQUFJLEVBQW9CLENBQUM7SUFFekIsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckIsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBSyxDQUFDLENBQUMsRUFBRSxTQUFNLENBQUMsQ0FBQztLQUM1QjtTQUFNO1FBQ0wsRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztLQUN2RDtJQUVELElBQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNqRCxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixJQUFBLG9DQUF3RCxFQUF2RCxrQkFBTSxFQUFFLDhCQUFZLENBQW9DO0lBRS9ELElBQU0sWUFBWSxzQkFDaEIsR0FBRyxFQUFFLEdBQUcsRUFDUixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFDZCxFQUFFLEVBQUUsRUFBRSxJQUNILE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLFFBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3RCLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBQyxZQUFZLGNBQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3RDLENBQUM7SUFFRixPQUFPLEVBQUMsR0FBRyxLQUFBLEVBQUUsWUFBWSxjQUFBLEVBQUMsQ0FBQztBQUM3QixDQUFDO0FBZUQ7SUFBNkIsbUNBQVk7SUFLdkMsaUJBQVksTUFBb0IsRUFBVSxJQUF3QjtRQUFsRSxZQUNFLGtCQUFNLE1BQU0sQ0FBQyxTQUNkO1FBRnlDLFVBQUksR0FBSixJQUFJLENBQW9COztJQUVsRSxDQUFDO0lBTk0sdUJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBTWEsd0JBQWdCLEdBQTlCLFVBQStCLE1BQW9CLEVBQUUsS0FBcUI7UUFDeEUsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFDLGlCQUFxQyxFQUFFLFFBQVEsRUFBRSxPQUFPO1lBQ3pGLElBQUksUUFBUSxDQUFDLEdBQUcsRUFBRTtnQkFDVixJQUFBLHdDQUF5RCxFQUF4RCxZQUFHLEVBQUUsOEJBQVksQ0FBd0M7Z0JBQ2hFLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyx3QkFDakIsWUFBWSxFQUNaLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUN0QixZQUFZLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUN4RCxDQUFDO2FBQ0g7WUFDRCxPQUFPLGlCQUFpQixDQUFDO1FBQzNCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O09BR0c7SUFDVyx5QkFBaUIsR0FBL0IsVUFBZ0MsTUFBb0IsRUFBRSxDQUFlLEVBQUUsS0FBWTs7UUFDM0UsSUFBQSxpQ0FBa0QsRUFBakQsWUFBRyxFQUFFLDhCQUFZLENBQWlDO1FBQ3pELE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTTtZQUN2QixHQUFDLEdBQUcsSUFBRyxZQUFZO2dCQUNuQixDQUFDO0lBQ0wsQ0FBQztJQUVNLHVCQUFLLEdBQVosVUFBYSxLQUFjO1FBQ3pCLElBQUksQ0FBQyxJQUFJLHdCQUFPLElBQUksQ0FBQyxJQUFJLEVBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sZ0NBQWMsR0FBckI7UUFDRSxJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFZixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7WUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFiLENBQWEsQ0FBQyxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0saUNBQWUsR0FBdEI7UUFDRSxJQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFZixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFBLENBQUM7WUFDdkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSwwQkFBUSxHQUFmO1FBQ0UsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQSxHQUFHO1lBQ3BDLElBQU0sU0FBUyxHQUFrQixFQUFFLENBQUM7WUFFcEMsSUFBTSxRQUFRLHNCQUNWLElBQUksRUFBRSxLQUFLLEVBQ1gsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQ2hCLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUNWLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUNmLEdBQUcsQ0FBQyxHQUFHLENBQ2IsQ0FBQztZQUVGLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsWUFBWSxFQUFFO2dCQUN2QyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUNiLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztvQkFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxZQUFZO2lCQUN6QixDQUFDLENBQUM7Z0JBQ0gsUUFBUSxDQUFDLE1BQU0sR0FBRyxFQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsWUFBWSxFQUFDLENBQUM7YUFDOUM7WUFFRCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRXpCLElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRTtnQkFDZixTQUFTLENBQUMsSUFBSSxDQUFDO29CQUNiLElBQUksRUFBRSxTQUFTO29CQUNmLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTztvQkFDakIsRUFBRSxFQUFFLEdBQUcsQ0FBQyxTQUFTO2lCQUNsQixDQUFDLENBQUM7YUFDSjtZQUVELE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBQ0gsY0FBQztBQUFELENBQUMsQUFuR0QsQ0FBNkIsWUFBWSxHQW1HeEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JpblBhcmFtcywgYmluVG9TdHJpbmd9IGZyb20gJy4uLy4uL2Jpbic7XG5pbXBvcnQge0NoYW5uZWx9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0ZpZWxkRGVmLCBub3JtYWxpemVCaW4sIHZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7QmluVHJhbnNmb3JtfSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtEaWN0LCBkdXBsaWNhdGUsIGZsYXR0ZW4sIGtleXMsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0JpblRyYW5zZm9ybSwgVmdUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7YmluRm9ybWF0RXhwcmVzc2lvbiwgYmluUmVxdWlyZXNSYW5nZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7aXNVbml0TW9kZWwsIE1vZGVsLCBNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5cbmZ1bmN0aW9uIHJhbmdlRm9ybXVsYShtb2RlbDogTW9kZWxXaXRoRmllbGQsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBDaGFubmVsLCBjb25maWc6IENvbmZpZykge1xuICAgIGlmIChiaW5SZXF1aXJlc1JhbmdlKGZpZWxkRGVmLCBjaGFubmVsKSkge1xuICAgICAgLy8gcmVhZCBmb3JtYXQgZnJvbSBheGlzIG9yIGxlZ2VuZCwgaWYgdGhlcmUgaXMgbm8gZm9ybWF0IHRoZW4gdXNlIGNvbmZpZy5udW1iZXJGb3JtYXRcblxuICAgICAgY29uc3QgZ3VpZGUgPSBpc1VuaXRNb2RlbChtb2RlbCkgPyAobW9kZWwuYXhpcyhjaGFubmVsKSB8fCBtb2RlbC5sZWdlbmQoY2hhbm5lbCkgfHwge30pIDoge307XG5cbiAgICAgIGNvbnN0IHN0YXJ0RmllbGQgPSB2Z0ZpZWxkKGZpZWxkRGVmLCB7ZXhwcjogJ2RhdHVtJyx9KTtcbiAgICAgIGNvbnN0IGVuZEZpZWxkID0gdmdGaWVsZChmaWVsZERlZiwge2V4cHI6ICdkYXR1bScsIGJpblN1ZmZpeDogJ2VuZCd9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybXVsYUFzOiB2Z0ZpZWxkKGZpZWxkRGVmLCB7YmluU3VmZml4OiAncmFuZ2UnfSksXG4gICAgICAgIGZvcm11bGE6IGJpbkZvcm1hdEV4cHJlc3Npb24oc3RhcnRGaWVsZCwgZW5kRmllbGQsIGd1aWRlLmZvcm1hdCwgY29uZmlnKVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xufVxuXG5mdW5jdGlvbiBiaW5LZXkoYmluOiBCaW5QYXJhbXMsIGZpZWxkOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGAke2JpblRvU3RyaW5nKGJpbil9XyR7ZmllbGR9YDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnbmFsc0Zyb21Nb2RlbChtb2RlbDogTW9kZWwsIGtleTogc3RyaW5nKSB7XG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBtb2RlbC5nZXROYW1lKGAke2tleX1fYmluc2ApLFxuICAgIGV4dGVudFNpZ25hbDogbW9kZWwuZ2V0TmFtZShgJHtrZXl9X2V4dGVudGApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQmluVHJhbnNmb3JtKHQ6IEZpZWxkRGVmPHN0cmluZz4gfCBCaW5UcmFuc2Zvcm0pOiB0IGlzIEJpblRyYW5zZm9ybSB7XG4gIHJldHVybiAnYXMnIGluIHQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJpbkNvbXBvbmVudCh0OiBGaWVsZERlZjxzdHJpbmc+IHwgQmluVHJhbnNmb3JtLCBtb2RlbDogTW9kZWwpIHtcbiAgbGV0IGFzOiBbc3RyaW5nLCBzdHJpbmddO1xuXG4gIGlmIChpc0JpblRyYW5zZm9ybSh0KSkge1xuICAgIGFzID0gW3QuYXMsIGAke3QuYXN9X2VuZGBdO1xuICB9IGVsc2Uge1xuICAgIGFzID0gW3ZnRmllbGQodCwge30pLCB2Z0ZpZWxkKHQsIHtiaW5TdWZmaXg6ICdlbmQnfSldO1xuICB9XG5cbiAgY29uc3QgYmluID0gbm9ybWFsaXplQmluKHQuYmluLCB1bmRlZmluZWQpIHx8IHt9O1xuICBjb25zdCBrZXkgPSBiaW5LZXkoYmluLCB0LmZpZWxkKTtcbiAgY29uc3Qge3NpZ25hbCwgZXh0ZW50U2lnbmFsfSA9IGdldFNpZ25hbHNGcm9tTW9kZWwobW9kZWwsIGtleSk7XG5cbiAgY29uc3QgYmluQ29tcG9uZW50OiBCaW5Db21wb25lbnQgPSB7XG4gICAgYmluOiBiaW4sXG4gICAgZmllbGQ6IHQuZmllbGQsXG4gICAgYXM6IGFzLFxuICAgIC4uLnNpZ25hbCA/IHtzaWduYWx9IDoge30sXG4gICAgLi4uZXh0ZW50U2lnbmFsID8ge2V4dGVudFNpZ25hbH0gOiB7fVxuICB9O1xuXG4gIHJldHVybiB7a2V5LCBiaW5Db21wb25lbnR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJpbkNvbXBvbmVudCB7XG4gIGJpbjogQmluUGFyYW1zO1xuICBmaWVsZDogc3RyaW5nO1xuICBleHRlbnRTaWduYWw/OiBzdHJpbmc7XG4gIHNpZ25hbD86IHN0cmluZztcbiAgYXM6IHN0cmluZ1tdO1xuXG4gIC8vIFJhbmdlIEZvcm11bGFcblxuICBmb3JtdWxhPzogc3RyaW5nO1xuICBmb3JtdWxhQXM/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5Ob2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQmluTm9kZShudWxsLCBkdXBsaWNhdGUodGhpcy5iaW5zKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBiaW5zOiBEaWN0PEJpbkNvbXBvbmVudD4pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBtYWtlRnJvbUVuY29kaW5nKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogTW9kZWxXaXRoRmllbGQpIHtcbiAgICBjb25zdCBiaW5zID0gbW9kZWwucmVkdWNlRmllbGREZWYoKGJpbkNvbXBvbmVudEluZGV4OiBEaWN0PEJpbkNvbXBvbmVudD4sIGZpZWxkRGVmLCBjaGFubmVsKSA9PiB7XG4gICAgICBpZiAoZmllbGREZWYuYmluKSB7XG4gICAgICAgIGNvbnN0IHtrZXksIGJpbkNvbXBvbmVudH0gPSBjcmVhdGVCaW5Db21wb25lbnQoZmllbGREZWYsIG1vZGVsKTtcbiAgICAgICAgYmluQ29tcG9uZW50SW5kZXhba2V5XSA9IHtcbiAgICAgICAgICAuLi5iaW5Db21wb25lbnQsXG4gICAgICAgICAgLi4uYmluQ29tcG9uZW50SW5kZXhba2V5XSxcbiAgICAgICAgICAuLi5yYW5nZUZvcm11bGEobW9kZWwsIGZpZWxkRGVmLCBjaGFubmVsLCBtb2RlbC5jb25maWcpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gYmluQ29tcG9uZW50SW5kZXg7XG4gICAgfSwge30pO1xuXG4gICAgaWYgKGtleXMoYmlucykubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJpbk5vZGUocGFyZW50LCBiaW5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYmluIG5vZGUgZnJvbSBCaW5UcmFuc2Zvcm0uXG4gICAqIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgc2hvdWxkIHByb3ZpZGVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWFrZUZyb21UcmFuc2Zvcm0ocGFyZW50OiBEYXRhRmxvd05vZGUsIHQ6IEJpblRyYW5zZm9ybSwgbW9kZWw6IE1vZGVsKSB7XG4gICAgY29uc3Qge2tleSwgYmluQ29tcG9uZW50fSA9IGNyZWF0ZUJpbkNvbXBvbmVudCh0LCBtb2RlbCk7XG4gICAgcmV0dXJuIG5ldyBCaW5Ob2RlKHBhcmVudCwge1xuICAgICAgW2tleV06IGJpbkNvbXBvbmVudFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1lcmdlKG90aGVyOiBCaW5Ob2RlKSB7XG4gICAgdGhpcy5iaW5zID0gey4uLnRoaXMuYmlucywgLi4ub3RoZXIuYmluc307XG4gICAgb3RoZXIucmVtb3ZlKCk7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICB2YWxzKHRoaXMuYmlucykuZm9yRWFjaChjID0+IHtcbiAgICAgIGMuYXMuZm9yRWFjaChmID0+IG91dFtmXSA9IHRydWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHB1YmxpYyBkZXBlbmRlbnRGaWVsZHMoKSB7XG4gICAgY29uc3Qgb3V0ID0ge307XG5cbiAgICB2YWxzKHRoaXMuYmlucykuZm9yRWFjaChjID0+IHtcbiAgICAgIG91dFtjLmZpZWxkXSA9IHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnVHJhbnNmb3JtW10ge1xuICAgIHJldHVybiBmbGF0dGVuKHZhbHModGhpcy5iaW5zKS5tYXAoYmluID0+IHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybTogVmdUcmFuc2Zvcm1bXSA9IFtdO1xuXG4gICAgICBjb25zdCBiaW5UcmFuczogVmdCaW5UcmFuc2Zvcm0gPSB7XG4gICAgICAgICAgdHlwZTogJ2JpbicsXG4gICAgICAgICAgZmllbGQ6IGJpbi5maWVsZCxcbiAgICAgICAgICBhczogYmluLmFzLFxuICAgICAgICAgIHNpZ25hbDogYmluLnNpZ25hbCxcbiAgICAgICAgICAuLi5iaW4uYmluXG4gICAgICB9O1xuXG4gICAgICBpZiAoIWJpbi5iaW4uZXh0ZW50ICYmIGJpbi5leHRlbnRTaWduYWwpIHtcbiAgICAgICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdleHRlbnQnLFxuICAgICAgICAgIGZpZWxkOiBiaW4uZmllbGQsXG4gICAgICAgICAgc2lnbmFsOiBiaW4uZXh0ZW50U2lnbmFsXG4gICAgICAgIH0pO1xuICAgICAgICBiaW5UcmFucy5leHRlbnQgPSB7c2lnbmFsOiBiaW4uZXh0ZW50U2lnbmFsfTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNmb3JtLnB1c2goYmluVHJhbnMpO1xuXG4gICAgICBpZiAoYmluLmZvcm11bGEpIHtcbiAgICAgICAgdHJhbnNmb3JtLnB1c2goe1xuICAgICAgICAgIHR5cGU6ICdmb3JtdWxhJyxcbiAgICAgICAgICBleHByOiBiaW4uZm9ybXVsYSxcbiAgICAgICAgICBhczogYmluLmZvcm11bGFBc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { expression } from '../../predicate';\nimport { duplicate } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar FilterNode = /** @class */ (function (_super) {\n tslib_1.__extends(FilterNode, _super);\n function FilterNode(parent, model, filter) {\n var _this = _super.call(this, parent) || this;\n _this.model = model;\n _this.filter = filter;\n _this.expr = expression(_this.model, _this.filter, _this);\n return _this;\n }\n FilterNode.prototype.clone = function () {\n return new FilterNode(null, this.model, duplicate(this.filter));\n };\n FilterNode.prototype.assemble = function () {\n return {\n type: 'filter',\n expr: this.expr\n };\n };\n return FilterNode;\n}(DataFlowNode));\nexport { FilterNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBQyxVQUFVLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR3JDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFeEM7SUFBZ0Msc0NBQVk7SUFNMUMsb0JBQVksTUFBb0IsRUFBbUIsS0FBWSxFQUFVLE1BQWlDO1FBQTFHLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBRWQ7UUFIa0QsV0FBSyxHQUFMLEtBQUssQ0FBTztRQUFVLFlBQU0sR0FBTixNQUFNLENBQTJCO1FBRXhHLEtBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSSxDQUFDLE1BQU0sRUFBRSxLQUFJLENBQUMsQ0FBQzs7SUFDeEQsQ0FBQztJQVBNLDBCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBT00sNkJBQVEsR0FBZjtRQUNFLE9BQU87WUFDTCxJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNoQixDQUFDO0lBQ0osQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQWpCRCxDQUFnQyxZQUFZLEdBaUIzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TG9naWNhbE9wZXJhbmR9IGZyb20gJy4uLy4uL2xvZ2ljYWwnO1xuaW1wb3J0IHtleHByZXNzaW9uLCBQcmVkaWNhdGV9IGZyb20gJy4uLy4uL3ByZWRpY2F0ZSc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnRmlsdGVyVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJOb2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHJpdmF0ZSBleHByOiBzdHJpbmc7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEZpbHRlck5vZGUobnVsbCwgdGhpcy5tb2RlbCwgZHVwbGljYXRlKHRoaXMuZmlsdGVyKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSByZWFkb25seSBtb2RlbDogTW9kZWwsIHByaXZhdGUgZmlsdGVyOiBMb2dpY2FsT3BlcmFuZDxQcmVkaWNhdGU+KSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgICB0aGlzLmV4cHIgPSBleHByZXNzaW9uKHRoaXMubW9kZWwsIHRoaXMuZmlsdGVyLCB0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZSgpOiBWZ0ZpbHRlclRyYW5zZm9ybSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdmaWx0ZXInLFxuICAgICAgZXhwcjogdGhpcy5leHByXG4gICAgfTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { LATITUDE, LATITUDE2, LONGITUDE, LONGITUDE2, SHAPE } from '../../channel';\nimport { GEOJSON } from '../../type';\nimport { duplicate } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar GeoJSONNode = /** @class */ (function (_super) {\n tslib_1.__extends(GeoJSONNode, _super);\n function GeoJSONNode(parent, fields, geojson, signal) {\n var _this = _super.call(this, parent) || this;\n _this.fields = fields;\n _this.geojson = geojson;\n _this.signal = signal;\n return _this;\n }\n GeoJSONNode.prototype.clone = function () {\n return new GeoJSONNode(null, duplicate(this.fields), this.geojson, this.signal);\n };\n GeoJSONNode.parseAll = function (parent, model) {\n var geoJsonCounter = 0;\n [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (coordinates) {\n var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; });\n if (pair[0] || pair[1]) {\n parent = new GeoJSONNode(parent, pair, null, model.getName(\"geojson_\" + geoJsonCounter++));\n }\n });\n if (model.channelHasField(SHAPE)) {\n var fieldDef = model.fieldDef(SHAPE);\n if (fieldDef.type === GEOJSON) {\n parent = new GeoJSONNode(parent, null, fieldDef.field, model.getName(\"geojson_\" + geoJsonCounter++));\n }\n }\n return parent;\n };\n GeoJSONNode.prototype.assemble = function () {\n return tslib_1.__assign({ type: 'geojson' }, (this.fields ? { fields: this.fields } : {}), (this.geojson ? { geojson: this.geojson } : {}), { signal: this.signal });\n };\n return GeoJSONNode;\n}(DataFlowNode));\nexport { GeoJSONNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvanNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2RhdGEvZ2VvanNvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFxQixRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUdyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDO0lBQWlDLHVDQUFZO0lBNEIzQyxxQkFBWSxNQUFvQixFQUFVLE1BQWlCLEVBQVUsT0FBZ0IsRUFBVSxNQUFlO1FBQTlHLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBQ2Q7UUFGeUMsWUFBTSxHQUFOLE1BQU0sQ0FBVztRQUFVLGFBQU8sR0FBUCxPQUFPLENBQVM7UUFBVSxZQUFNLEdBQU4sTUFBTSxDQUFTOztJQUU5RyxDQUFDO0lBN0JNLDJCQUFLLEdBQVo7UUFDRSxPQUFPLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFYSxvQkFBUSxHQUF0QixVQUF1QixNQUFvQixFQUFFLEtBQWdCO1FBQzNELElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQztRQUV2QixDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsV0FBaUM7WUFDekYsSUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDMUIsVUFBQSxPQUFPLElBQUksT0FBQSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUExRSxDQUEwRSxDQUN0RixDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFXLGNBQWMsRUFBSSxDQUFDLENBQUMsQ0FBQzthQUM1RjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2hDLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRTtnQkFDN0IsTUFBTSxHQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQVcsY0FBYyxFQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ3RHO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBTU0sOEJBQVEsR0FBZjtRQUNFLDBCQUNFLElBQUksRUFBRSxTQUFTLElBQ1osQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUMxQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQ2hELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUNuQjtJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUF4Q0QsQ0FBaUMsWUFBWSxHQXdDNUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0dlb1Bvc2l0aW9uQ2hhbm5lbCwgTEFUSVRVREUsIExBVElUVURFMiwgTE9OR0lUVURFLCBMT05HSVRVREUyLCBTSEFQRX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0dFT0pTT059IGZyb20gJy4uLy4uL3R5cGUnO1xuaW1wb3J0IHtkdXBsaWNhdGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0dlb0pTT05UcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7RGF0YUZsb3dOb2RlfSBmcm9tICcuL2RhdGFmbG93JztcblxuZXhwb3J0IGNsYXNzIEdlb0pTT05Ob2RlIGV4dGVuZHMgRGF0YUZsb3dOb2RlIHtcbiAgcHVibGljIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgR2VvSlNPTk5vZGUobnVsbCwgZHVwbGljYXRlKHRoaXMuZmllbGRzKSwgdGhpcy5nZW9qc29uLCB0aGlzLnNpZ25hbCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhcnNlQWxsKHBhcmVudDogRGF0YUZsb3dOb2RlLCBtb2RlbDogVW5pdE1vZGVsKTogRGF0YUZsb3dOb2RlIHtcbiAgICBsZXQgZ2VvSnNvbkNvdW50ZXIgPSAwO1xuXG4gICAgW1tMT05HSVRVREUsIExBVElUVURFXSwgW0xPTkdJVFVERTIsIExBVElUVURFMl1dLmZvckVhY2goKGNvb3JkaW5hdGVzOiBHZW9Qb3NpdGlvbkNoYW5uZWxbXSkgPT4ge1xuICAgICAgY29uc3QgcGFpciA9IGNvb3JkaW5hdGVzLm1hcChcbiAgICAgICAgY2hhbm5lbCA9PiBtb2RlbC5jaGFubmVsSGFzRmllbGQoY2hhbm5lbCkgPyBtb2RlbC5maWVsZERlZihjaGFubmVsKS5maWVsZCA6IHVuZGVmaW5lZFxuICAgICAgKTtcblxuICAgICAgaWYgKHBhaXJbMF0gfHwgcGFpclsxXSkge1xuICAgICAgICBwYXJlbnQgPSBuZXcgR2VvSlNPTk5vZGUocGFyZW50LCBwYWlyLCBudWxsLCBtb2RlbC5nZXROYW1lKGBnZW9qc29uXyR7Z2VvSnNvbkNvdW50ZXIrK31gKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwuY2hhbm5lbEhhc0ZpZWxkKFNIQVBFKSkge1xuICAgICAgY29uc3QgZmllbGREZWYgPSBtb2RlbC5maWVsZERlZihTSEFQRSk7XG4gICAgICBpZiAoZmllbGREZWYudHlwZSA9PT0gR0VPSlNPTikge1xuICAgICAgICBwYXJlbnQgPSBuZXcgR2VvSlNPTk5vZGUocGFyZW50LCBudWxsLCBmaWVsZERlZi5maWVsZCwgbW9kZWwuZ2V0TmFtZShgZ2VvanNvbl8ke2dlb0pzb25Db3VudGVyKyt9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBmaWVsZHM/OiBzdHJpbmdbXSwgcHJpdmF0ZSBnZW9qc29uPzogc3RyaW5nLCBwcml2YXRlIHNpZ25hbD86IHN0cmluZykge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdHZW9KU09OVHJhbnNmb3JtIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2dlb2pzb24nLFxuICAgICAgLi4uKHRoaXMuZmllbGRzID8ge2ZpZWxkczogdGhpcy5maWVsZHN9IDoge30pLFxuICAgICAgLi4uKHRoaXMuZ2VvanNvbiA/IHtnZW9qc29uOiB0aGlzLmdlb2pzb259IDoge30pLFxuICAgICAgc2lnbmFsOiB0aGlzLnNpZ25hbFxuICAgIH07XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { LATITUDE, LATITUDE2, LONGITUDE, LONGITUDE2 } from '../../channel';\nimport { duplicate } from '../../util';\nimport { DataFlowNode } from './dataflow';\nvar GeoPointNode = /** @class */ (function (_super) {\n tslib_1.__extends(GeoPointNode, _super);\n function GeoPointNode(parent, projection, fields, as) {\n var _this = _super.call(this, parent) || this;\n _this.projection = projection;\n _this.fields = fields;\n _this.as = as;\n return _this;\n }\n GeoPointNode.prototype.clone = function () {\n return new GeoPointNode(null, this.projection, duplicate(this.fields), duplicate(this.as));\n };\n GeoPointNode.parseAll = function (parent, model) {\n if (!model.projectionName()) {\n return parent;\n }\n [[LONGITUDE, LATITUDE], [LONGITUDE2, LATITUDE2]].forEach(function (coordinates) {\n var pair = coordinates.map(function (channel) { return model.channelHasField(channel) ? model.fieldDef(channel).field : undefined; });\n var suffix = coordinates[0] === LONGITUDE2 ? '2' : '';\n if (pair[0] || pair[1]) {\n parent = new GeoPointNode(parent, model.projectionName(), pair, [model.getName('x' + suffix), model.getName('y' + suffix)]);\n }\n });\n return parent;\n };\n GeoPointNode.prototype.assemble = function () {\n return {\n type: 'geopoint',\n projection: this.projection,\n fields: this.fields,\n as: this.as\n };\n };\n return GeoPointNode;\n}(DataFlowNode));\nexport { GeoPointNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvcG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2dlb3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQXFCLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3RixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR3JDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHeEM7SUFBa0Msd0NBQVk7SUFLNUMsc0JBQVksTUFBb0IsRUFBVSxVQUFrQixFQUFVLE1BQWdCLEVBQVUsRUFBWTtRQUE1RyxZQUNFLGtCQUFNLE1BQU0sQ0FBQyxTQUNkO1FBRnlDLGdCQUFVLEdBQVYsVUFBVSxDQUFRO1FBQVUsWUFBTSxHQUFOLE1BQU0sQ0FBVTtRQUFVLFFBQUUsR0FBRixFQUFFLENBQVU7O0lBRTVHLENBQUM7SUFOTSw0QkFBSyxHQUFaO1FBQ0UsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBTWEscUJBQVEsR0FBdEIsVUFBdUIsTUFBb0IsRUFBRSxLQUFnQjtRQUMzRCxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQzNCLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsV0FBaUM7WUFDekYsSUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FDMUIsVUFBQSxPQUFPLElBQUksT0FBQSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUExRSxDQUEwRSxDQUN0RixDQUFDO1lBRUYsSUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFeEQsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN0QixNQUFNLEdBQUcsSUFBSSxZQUFZLENBQ3ZCLE1BQU0sRUFDTixLQUFLLENBQUMsY0FBYyxFQUFFLEVBQ3RCLElBQUksRUFDSixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQzNELENBQUM7YUFDSDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVNLCtCQUFRLEdBQWY7UUFDRSxPQUFPO1lBQ0wsSUFBSSxFQUFFLFVBQVU7WUFDaEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7U0FDWixDQUFDO0lBQ0osQ0FBQztJQUNILG1CQUFDO0FBQUQsQ0FBQyxBQTFDRCxDQUFrQyxZQUFZLEdBMEM3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7R2VvUG9zaXRpb25DaGFubmVsLCBMQVRJVFVERSwgTEFUSVRVREUyLCBMT05HSVRVREUsIExPTkdJVFVERTJ9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtkdXBsaWNhdGV9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0dlb1BvaW50VHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cblxuZXhwb3J0IGNsYXNzIEdlb1BvaW50Tm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEdlb1BvaW50Tm9kZShudWxsLCB0aGlzLnByb2plY3Rpb24sIGR1cGxpY2F0ZSh0aGlzLmZpZWxkcyksIGR1cGxpY2F0ZSh0aGlzLmFzKSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IERhdGFGbG93Tm9kZSwgcHJpdmF0ZSBwcm9qZWN0aW9uOiBzdHJpbmcsIHByaXZhdGUgZmllbGRzOiBzdHJpbmdbXSwgcHJpdmF0ZSBhczogc3RyaW5nW10pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBwYXJzZUFsbChwYXJlbnQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IFVuaXRNb2RlbCk6IERhdGFGbG93Tm9kZSB7XG4gICAgaWYgKCFtb2RlbC5wcm9qZWN0aW9uTmFtZSgpKSB7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIFtbTE9OR0lUVURFLCBMQVRJVFVERV0sIFtMT05HSVRVREUyLCBMQVRJVFVERTJdXS5mb3JFYWNoKChjb29yZGluYXRlczogR2VvUG9zaXRpb25DaGFubmVsW10pID0+IHtcbiAgICAgIGNvbnN0IHBhaXIgPSBjb29yZGluYXRlcy5tYXAoXG4gICAgICAgIGNoYW5uZWwgPT4gbW9kZWwuY2hhbm5lbEhhc0ZpZWxkKGNoYW5uZWwpID8gbW9kZWwuZmllbGREZWYoY2hhbm5lbCkuZmllbGQgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHN1ZmZpeCA9IGNvb3JkaW5hdGVzWzBdID09PSBMT05HSVRVREUyID8gJzInIDogJyc7XG5cbiAgICAgIGlmIChwYWlyWzBdIHx8IHBhaXJbMV0pIHtcbiAgICAgICAgcGFyZW50ID0gbmV3IEdlb1BvaW50Tm9kZShcbiAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgbW9kZWwucHJvamVjdGlvbk5hbWUoKSxcbiAgICAgICAgICBwYWlyLFxuICAgICAgICAgIFttb2RlbC5nZXROYW1lKCd4JyArIHN1ZmZpeCksIG1vZGVsLmdldE5hbWUoJ3knICsgc3VmZml4KV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdHZW9Qb2ludFRyYW5zZm9ybSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdnZW9wb2ludCcsXG4gICAgICBwcm9qZWN0aW9uOiB0aGlzLnByb2plY3Rpb24sXG4gICAgICBmaWVsZHM6IHRoaXMuZmllbGRzLFxuICAgICAgYXM6IHRoaXMuYXNcbiAgICB9O1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { SELECTION_ID } from '../../selection';\nimport { DataFlowNode } from './dataflow';\nvar IdentifierNode = /** @class */ (function (_super) {\n tslib_1.__extends(IdentifierNode, _super);\n function IdentifierNode(parent) {\n return _super.call(this, parent) || this;\n }\n IdentifierNode.prototype.clone = function () {\n return new IdentifierNode(null);\n };\n IdentifierNode.prototype.producedFields = function () {\n var _a;\n return _a = {}, _a[SELECTION_ID] = true, _a;\n };\n IdentifierNode.prototype.assemble = function () {\n return { type: 'identifier', as: SELECTION_ID };\n };\n return IdentifierNode;\n}(DataFlowNode));\nexport { IdentifierNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZW50aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2luZGVudGlmaWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV4QztJQUFvQywwQ0FBWTtJQUs5Qyx3QkFBWSxNQUFvQjtlQUM5QixrQkFBTSxNQUFNLENBQUM7SUFDZixDQUFDO0lBTk0sOEJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQU1NLHVDQUFjLEdBQXJCOztRQUNFLGdCQUFRLEdBQUMsWUFBWSxJQUFHLElBQUksS0FBRTtJQUNoQyxDQUFDO0lBRU0saUNBQVEsR0FBZjtRQUNFLE9BQU8sRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0gscUJBQUM7QUFBRCxDQUFDLEFBaEJELENBQW9DLFlBQVksR0FnQi9DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTRUxFQ1RJT05fSUR9IGZyb20gJy4uLy4uL3NlbGVjdGlvbic7XG5pbXBvcnQge1N0cmluZ1NldH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnSWRlbnRpZmllclRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuXG5leHBvcnQgY2xhc3MgSWRlbnRpZmllck5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGlmaWVyTm9kZShudWxsKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlKSB7XG4gICAgc3VwZXIocGFyZW50KTtcbiAgfVxuXG4gIHB1YmxpYyBwcm9kdWNlZEZpZWxkcygpOiBTdHJpbmdTZXQge1xuICAgIHJldHVybiB7W1NFTEVDVElPTl9JRF06IHRydWV9O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnSWRlbnRpZmllclRyYW5zZm9ybSB7XG4gICAgcmV0dXJuIHt0eXBlOiAnaWRlbnRpZmllcicsIGFzOiBTRUxFQ1RJT05fSUR9O1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { Split } from '../split';\n/**\n * Class to track interesting properties (see https://15721.courses.cs.cmu.edu/spring2016/papers/graefe-ieee1995.pdf)\n * about how fields have been parsed or whether they have been derived in a transforms. We use this to not parse the\n * same field again (or differently).\n */\nvar AncestorParse = /** @class */ (function (_super) {\n tslib_1.__extends(AncestorParse, _super);\n function AncestorParse(explicit, implicit, parseNothing) {\n if (explicit === void 0) { explicit = {}; }\n if (implicit === void 0) { implicit = {}; }\n if (parseNothing === void 0) { parseNothing = false; }\n var _this = _super.call(this, explicit, implicit) || this;\n _this.explicit = explicit;\n _this.implicit = implicit;\n _this.parseNothing = parseNothing;\n return _this;\n }\n AncestorParse.prototype.clone = function () {\n var clone = _super.prototype.clone.call(this);\n clone.parseNothing = this.parseNothing;\n return clone;\n };\n return AncestorParse;\n}(Split));\nexport { AncestorParse };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBa0QvQjs7OztHQUlHO0FBQ0g7SUFBbUMseUNBQW1CO0lBQ3BELHVCQUNrQixRQUFvQyxFQUNwQyxRQUFvQyxFQUM3QyxZQUFvQjtRQUZYLHlCQUFBLEVBQUEsYUFBb0M7UUFDcEMseUJBQUEsRUFBQSxhQUFvQztRQUM3Qyw2QkFBQSxFQUFBLG9CQUFvQjtRQUg3QixZQUtFLGtCQUFNLFFBQVEsRUFBRSxRQUFRLENBQUMsU0FDMUI7UUFMaUIsY0FBUSxHQUFSLFFBQVEsQ0FBNEI7UUFDcEMsY0FBUSxHQUFSLFFBQVEsQ0FBNEI7UUFDN0Msa0JBQVksR0FBWixZQUFZLENBQVE7O0lBRzdCLENBQUM7SUFFTSw2QkFBSyxHQUFaO1FBQ0UsSUFBTSxLQUFLLEdBQUcsaUJBQU0sS0FBSyxXQUFtQixDQUFDO1FBQzdDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUN2QyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFDSCxvQkFBQztBQUFELENBQUMsQUFkRCxDQUFtQyxLQUFLLEdBY3ZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaWN0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7U3BsaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7T3V0cHV0Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5pbXBvcnQge0ZhY2V0Tm9kZX0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEEgZGljdGlvbmFyeSBvZiBzb3VyY2VzIGluZGV4ZWQgYnkgYSBoYXNoLlxuICAgKi9cbiAgc291cmNlczogRGljdDxTb3VyY2VOb2RlPjtcblxuICAvKipcbiAgICogUmVnaXN0cnkgb2Ygb3V0cHV0IG5vZGVzLlxuICAgKi9cbiAgb3V0cHV0Tm9kZXM6IERpY3Q8T3V0cHV0Tm9kZSB8IEZhY2V0Tm9kZT47XG5cbiAgLyoqXG4gICAqIEhvdyBvZnRlbiBpcyBhbiBvdXRwdXQgbm9kZSB1c2VkLiBJZiBpdCBpcyBub3QgdXNlZCwgd2UgZG9uJ3QgbmVlZCB0b1xuICAgKiBpbnN0YW50aWF0ZSBpdCBpbiB0aGUgYXNzZW1ibGUgc3RlcC5cbiAgICovXG4gIG91dHB1dE5vZGVSZWZDb3VudHM6IERpY3Q8bnVtYmVyPjtcblxuICAvKipcbiAgICogVGhlIG91dHB1dCBub2RlIGJlZm9yZSBhZ2dyZWdhdGlvbi5cbiAgICovXG4gIHJhdz86IE91dHB1dE5vZGU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIG91dHB1dCBub2RlLlxuICAgKi9cbiAgbWFpbj86IE91dHB1dE5vZGU7XG5cbiAgLyoqXG4gICAqIEZvciBmYWNldHMsIHdlIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHJvb3Qgbm9kZS5cbiAgICovXG4gIGZhY2V0Um9vdD86IEZhY2V0Tm9kZTtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgZGF0YSBmb3IgdGhpcyBtb2RlbCBpcyBmYWNldGVkLlxuICAgKiBBIGRhdGFzZXQgaXMgZmFjZXRlZCBpZiBhIHBhcmVudCBtb2RlbCBpcyBhIGZhY2V0IGFuZCBubyBuZXcgZGF0YXNldCBpc1xuICAgKiBkZWZpbmVkICh3aGljaCB3b3VsZCBtYWtlIHRoZSBkYXRhIHVuZmFjZXRlZCBhZ2FpbikuXG4gICAqL1xuICBpc0ZhY2V0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBhcnNlIHByb3BlcnRpZXMgcGFzc2VkIGRvd24gZnJvbSBhbmNlc3RvcnMuIEhlbHBzIHVzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBoYXMgYmVlbiBwYXJzZWQgb3IgaXMgZGVyaXZlZC5cbiAgICovXG4gIGFuY2VzdG9yUGFyc2U/OiBBbmNlc3RvclBhcnNlO1xufVxuXG4vKipcbiAqIENsYXNzIHRvIHRyYWNrIGludGVyZXN0aW5nIHByb3BlcnRpZXMgKHNlZSBodHRwczovLzE1NzIxLmNvdXJzZXMuY3MuY211LmVkdS9zcHJpbmcyMDE2L3BhcGVycy9ncmFlZmUtaWVlZTE5OTUucGRmKVxuICogYWJvdXQgaG93IGZpZWxkcyBoYXZlIGJlZW4gcGFyc2VkIG9yIHdoZXRoZXIgdGhleSBoYXZlIGJlZW4gZGVyaXZlZCBpbiBhIHRyYW5zZm9ybXMuIFdlIHVzZSB0aGlzIHRvIG5vdCBwYXJzZSB0aGVcbiAqIHNhbWUgZmllbGQgYWdhaW4gKG9yIGRpZmZlcmVudGx5KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEFuY2VzdG9yUGFyc2UgZXh0ZW5kcyBTcGxpdDxEaWN0PHN0cmluZz4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGV4cGxpY2l0OiBQYXJ0aWFsPERpY3Q8c3RyaW5nPj4gPSB7fSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW1wbGljaXQ6IFBhcnRpYWw8RGljdDxzdHJpbmc+PiA9IHt9LFxuICAgIHB1YmxpYyBwYXJzZU5vdGhpbmcgPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcihleHBsaWNpdCwgaW1wbGljaXQpO1xuICB9XG5cbiAgcHVibGljIGNsb25lKCk6IEFuY2VzdG9yUGFyc2Uge1xuICAgIGNvbnN0IGNsb25lID0gc3VwZXIuY2xvbmUoKSBhcyBBbmNlc3RvclBhcnNlO1xuICAgIGNsb25lLnBhcnNlTm90aGluZyA9IHRoaXMucGFyc2VOb3RoaW5nO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isString, toSet } from 'vega-util';\nimport * as log from '../../log';\nimport { DataFlowNode, OutputNode } from './dataflow';\nimport { SourceNode } from './source';\nvar LookupNode = /** @class */ (function (_super) {\n tslib_1.__extends(LookupNode, _super);\n function LookupNode(parent, transform, secondary) {\n var _this = _super.call(this, parent) || this;\n _this.transform = transform;\n _this.secondary = secondary;\n return _this;\n }\n LookupNode.make = function (parent, model, transform, counter) {\n var sources = model.component.data.sources;\n var s = new SourceNode(transform.from.data);\n var fromSource = sources[s.hash()];\n if (!fromSource) {\n sources[s.hash()] = s;\n fromSource = s;\n }\n var fromOutputName = model.getName(\"lookup_\" + counter);\n var fromOutputNode = new OutputNode(fromSource, fromOutputName, 'lookup', model.component.data.outputNodeRefCounts);\n model.component.data.outputNodes[fromOutputName] = fromOutputNode;\n return new LookupNode(parent, transform, fromOutputNode.getSource());\n };\n LookupNode.prototype.producedFields = function () {\n return toSet(this.transform.from.fields || ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as]));\n };\n LookupNode.prototype.assemble = function () {\n var foreign;\n if (this.transform.from.fields) {\n // lookup a few fields and add create a flat output\n foreign = tslib_1.__assign({ values: this.transform.from.fields }, this.transform.as ? { as: ((this.transform.as instanceof Array) ? this.transform.as : [this.transform.as]) } : {});\n }\n else {\n // lookup full record and nest it\n var asName = this.transform.as;\n if (!isString(asName)) {\n log.warn(log.message.NO_FIELDS_NEEDS_AS);\n asName = '_lookup';\n }\n foreign = {\n as: [asName]\n };\n }\n return tslib_1.__assign({ type: 'lookup', from: this.secondary, key: this.transform.from.key, fields: [this.transform.lookup] }, foreign, (this.transform.default ? { default: this.transform.default } : {}));\n };\n return LookupNode;\n}(DataFlowNode));\nexport { LookupNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9va3VwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS9sb29rdXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUUsS0FBSyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBS2pDLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFcEM7SUFBZ0Msc0NBQVk7SUFDMUMsb0JBQVksTUFBb0IsRUFBa0IsU0FBMEIsRUFBa0IsU0FBaUI7UUFBL0csWUFDRSxrQkFBTSxNQUFNLENBQUMsU0FDZDtRQUZpRCxlQUFTLEdBQVQsU0FBUyxDQUFpQjtRQUFrQixlQUFTLEdBQVQsU0FBUyxDQUFROztJQUUvRyxDQUFDO0lBRWEsZUFBSSxHQUFsQixVQUFtQixNQUFvQixFQUFFLEtBQVksRUFBRSxTQUEwQixFQUFFLE9BQWU7UUFDaEcsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdDLElBQU0sQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLFVBQVUsR0FBRyxDQUFDLENBQUM7U0FDaEI7UUFFRCxJQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVUsT0FBUyxDQUFDLENBQUM7UUFDMUQsSUFBTSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQUMsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUV0SCxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLEdBQUcsY0FBYyxDQUFDO1FBRWxFLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sbUNBQWMsR0FBckI7UUFDRSxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvSCxDQUFDO0lBRU0sNkJBQVEsR0FBZjtRQUNFLElBQUksT0FBbUMsQ0FBQztRQUV4QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM5QixtREFBbUQ7WUFDbkQsT0FBTyxzQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUM5QixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNwSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLGlDQUFpQztZQUNqQyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDekMsTUFBTSxHQUFHLFNBQVMsQ0FBQzthQUNwQjtZQUVELE9BQU8sR0FBRztnQkFDUixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUM7YUFDYixDQUFDO1NBQ0g7UUFFRCwwQkFDRSxJQUFJLEVBQUUsUUFBUSxFQUNkLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUNwQixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUM1QixNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUM1QixPQUFPLEVBQ1AsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3BFO0lBQ0osQ0FBQztJQUNILGlCQUFDO0FBQUQsQ0FBQyxBQXpERCxDQUFnQyxZQUFZLEdBeUQzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNTdHJpbmcsIHRvU2V0fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge0xvb2t1cFRyYW5zZm9ybX0gZnJvbSAnLi4vLi4vdHJhbnNmb3JtJztcbmltcG9ydCB7U3RyaW5nU2V0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdMb29rdXBUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlLCBPdXRwdXROb2RlfSBmcm9tICcuL2RhdGFmbG93JztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi9zb3VyY2UnO1xuXG5leHBvcnQgY2xhc3MgTG9va3VwTm9kZSBleHRlbmRzIERhdGFGbG93Tm9kZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogRGF0YUZsb3dOb2RlLCBwdWJsaWMgcmVhZG9ubHkgdHJhbnNmb3JtOiBMb29rdXBUcmFuc2Zvcm0sIHB1YmxpYyByZWFkb25seSBzZWNvbmRhcnk6IHN0cmluZykge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIG1ha2UocGFyZW50OiBEYXRhRmxvd05vZGUsIG1vZGVsOiBNb2RlbCwgdHJhbnNmb3JtOiBMb29rdXBUcmFuc2Zvcm0sIGNvdW50ZXI6IG51bWJlcikge1xuICAgIGNvbnN0IHNvdXJjZXMgPSBtb2RlbC5jb21wb25lbnQuZGF0YS5zb3VyY2VzO1xuICAgIGNvbnN0IHMgPSBuZXcgU291cmNlTm9kZSh0cmFuc2Zvcm0uZnJvbS5kYXRhKTtcbiAgICBsZXQgZnJvbVNvdXJjZSA9IHNvdXJjZXNbcy5oYXNoKCldO1xuICAgIGlmICghZnJvbVNvdXJjZSkge1xuICAgICAgc291cmNlc1tzLmhhc2goKV0gPSBzO1xuICAgICAgZnJvbVNvdXJjZSA9IHM7XG4gICAgfVxuXG4gICAgY29uc3QgZnJvbU91dHB1dE5hbWUgPSBtb2RlbC5nZXROYW1lKGBsb29rdXBfJHtjb3VudGVyfWApO1xuICAgIGNvbnN0IGZyb21PdXRwdXROb2RlID0gbmV3IE91dHB1dE5vZGUoZnJvbVNvdXJjZSwgZnJvbU91dHB1dE5hbWUsICdsb29rdXAnLCBtb2RlbC5jb21wb25lbnQuZGF0YS5vdXRwdXROb2RlUmVmQ291bnRzKTtcblxuICAgIG1vZGVsLmNvbXBvbmVudC5kYXRhLm91dHB1dE5vZGVzW2Zyb21PdXRwdXROYW1lXSA9IGZyb21PdXRwdXROb2RlO1xuXG4gICAgcmV0dXJuIG5ldyBMb29rdXBOb2RlKHBhcmVudCwgdHJhbnNmb3JtLCBmcm9tT3V0cHV0Tm9kZS5nZXRTb3VyY2UoKSk7XG4gIH1cblxuICBwdWJsaWMgcHJvZHVjZWRGaWVsZHMoKTogU3RyaW5nU2V0IHtcbiAgICByZXR1cm4gdG9TZXQodGhpcy50cmFuc2Zvcm0uZnJvbS5maWVsZHMgfHwgKCh0aGlzLnRyYW5zZm9ybS5hcyBpbnN0YW5jZW9mIEFycmF5KSA/IHRoaXMudHJhbnNmb3JtLmFzIDogW3RoaXMudHJhbnNmb3JtLmFzXSkpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlKCk6IFZnTG9va3VwVHJhbnNmb3JtIHtcbiAgICBsZXQgZm9yZWlnbjogUGFydGlhbDxWZ0xvb2t1cFRyYW5zZm9ybT47XG5cbiAgICBpZiAodGhpcy50cmFuc2Zvcm0uZnJvbS5maWVsZHMpIHtcbiAgICAgIC8vIGxvb2t1cCBhIGZldyBmaWVsZHMgYW5kIGFkZCBjcmVhdGUgYSBmbGF0IG91dHB1dFxuICAgICAgZm9yZWlnbiA9IHtcbiAgICAgICAgdmFsdWVzOiB0aGlzLnRyYW5zZm9ybS5mcm9tLmZpZWxkcyxcbiAgICAgICAgLi4uIHRoaXMudHJhbnNmb3JtLmFzID8ge2FzOiAoKHRoaXMudHJhbnNmb3JtLmFzIGluc3RhbmNlb2YgQXJyYXkpID8gdGhpcy50cmFuc2Zvcm0uYXMgOiBbdGhpcy50cmFuc2Zvcm0uYXNdKX0gOiB7fVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbG9va3VwIGZ1bGwgcmVjb3JkIGFuZCBuZXN0IGl0XG4gICAgICBsZXQgYXNOYW1lID0gdGhpcy50cmFuc2Zvcm0uYXM7XG4gICAgICBpZiAoIWlzU3RyaW5nKGFzTmFtZSkpIHtcbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuTk9fRklFTERTX05FRURTX0FTKTtcbiAgICAgICAgYXNOYW1lID0gJ19sb29rdXAnO1xuICAgICAgfVxuXG4gICAgICBmb3JlaWduID0ge1xuICAgICAgICBhczogW2FzTmFtZV1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6ICdsb29rdXAnLFxuICAgICAgZnJvbTogdGhpcy5zZWNvbmRhcnksXG4gICAgICBrZXk6IHRoaXMudHJhbnNmb3JtLmZyb20ua2V5LFxuICAgICAgZmllbGRzOiBbdGhpcy50cmFuc2Zvcm0ubG9va3VwXSxcbiAgICAgIC4uLmZvcmVpZ24sXG4gICAgICAuLi4odGhpcy50cmFuc2Zvcm0uZGVmYXVsdCA/IHtkZWZhdWx0OiB0aGlzLnRyYW5zZm9ybS5kZWZhdWx0fSA6IHt9KVxuICAgIH07XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { vgField } from '../../fielddef';\nimport { duplicate } from '../../util';\nimport { DataFlowNode } from './dataflow';\n/**\n * A class for the window transform nodes\n */\nvar WindowTransformNode = /** @class */ (function (_super) {\n tslib_1.__extends(WindowTransformNode, _super);\n function WindowTransformNode(parent, transform) {\n var _this = _super.call(this, parent) || this;\n _this.transform = transform;\n return _this;\n }\n WindowTransformNode.prototype.clone = function () {\n return new WindowTransformNode(this.parent, duplicate(this.transform));\n };\n WindowTransformNode.prototype.producedFields = function () {\n var _this = this;\n var out = {};\n this.transform.window.forEach(function (windowFieldDef) {\n out[_this.getDefaultName(windowFieldDef)] = true;\n });\n return out;\n };\n WindowTransformNode.prototype.getDefaultName = function (windowFieldDef) {\n return windowFieldDef.as || vgField(windowFieldDef);\n };\n WindowTransformNode.prototype.assemble = function () {\n var fields = [];\n var ops = [];\n var as = [];\n var params = [];\n for (var _i = 0, _a = this.transform.window; _i < _a.length; _i++) {\n var window_1 = _a[_i];\n ops.push(window_1.op);\n as.push(this.getDefaultName(window_1));\n params.push(window_1.param === undefined ? null : window_1.param);\n fields.push(window_1.field === undefined ? null : window_1.field);\n }\n var frame = this.transform.frame;\n var groupby = this.transform.groupby;\n var sortFields = [];\n var sortOrder = [];\n if (this.transform.sort !== undefined) {\n for (var _b = 0, _c = this.transform.sort; _b < _c.length; _b++) {\n var sortField = _c[_b];\n sortFields.push(sortField.field);\n sortOrder.push(sortField.order === undefined ? null : sortField.order);\n }\n }\n var sort = {\n field: sortFields,\n order: sortOrder,\n };\n var ignorePeers = this.transform.ignorePeers;\n var result = {\n type: 'window',\n params: params,\n as: as,\n ops: ops,\n fields: fields,\n sort: sort,\n };\n if (ignorePeers !== undefined) {\n result.ignorePeers = ignorePeers;\n }\n if (groupby !== undefined) {\n result.groupby = groupby;\n }\n if (frame !== undefined) {\n result.frame = frame;\n }\n return result;\n };\n return WindowTransformNode;\n}(DataFlowNode));\nexport { WindowTransformNode };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvZGF0YS93aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXJDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFeEM7O0dBRUc7QUFDSDtJQUF5QywrQ0FBWTtJQUtuRCw2QkFBWSxNQUFvQixFQUFVLFNBQTBCO1FBQXBFLFlBQ0Usa0JBQU0sTUFBTSxDQUFDLFNBQ2Q7UUFGeUMsZUFBUyxHQUFULFNBQVMsQ0FBaUI7O0lBRXBFLENBQUM7SUFOTSxtQ0FBSyxHQUFaO1FBQ0ksT0FBTyxJQUFJLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFNTSw0Q0FBYyxHQUFyQjtRQUFBLGlCQU9DO1FBTkMsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQUEsY0FBYztZQUMxQyxHQUFHLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVPLDRDQUFjLEdBQXRCLFVBQXVCLGNBQThCO1FBQ25ELE9BQU8sY0FBYyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVNLHNDQUFRLEdBQWY7UUFDRSxJQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7UUFDNUIsSUFBTSxHQUFHLEdBQW1DLEVBQUUsQ0FBQztRQUMvQyxJQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDZCxJQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBcUIsVUFBcUIsRUFBckIsS0FBQSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBckIsY0FBcUIsRUFBckIsSUFBcUIsRUFBRTtZQUF2QyxJQUFNLFFBQU0sU0FBQTtZQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQy9EO1FBRUQsSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7UUFDbkMsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7UUFDdkMsSUFBTSxVQUFVLEdBQWEsRUFBRSxDQUFDO1FBQ2hDLElBQU0sU0FBUyxHQUF3QixFQUFFLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDckMsS0FBd0IsVUFBbUIsRUFBbkIsS0FBQSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBbkIsY0FBbUIsRUFBbkIsSUFBbUIsRUFBRTtnQkFBeEMsSUFBTSxTQUFTLFNBQUE7Z0JBQ2xCLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNqQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUEwQixDQUFDLENBQUM7YUFDN0Y7U0FDRjtRQUNELElBQU0sSUFBSSxHQUFpQjtZQUN6QixLQUFLLEVBQUUsVUFBVTtZQUNqQixLQUFLLEVBQUUsU0FBUztTQUNqQixDQUFDO1FBQ0YsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFFL0MsSUFBTSxNQUFNLEdBQXNCO1lBQ2hDLElBQUksRUFBRSxRQUFRO1lBQ2QsTUFBTSxRQUFBO1lBQ04sRUFBRSxJQUFBO1lBQ0YsR0FBRyxLQUFBO1lBQ0gsTUFBTSxRQUFBO1lBQ04sSUFBSSxNQUFBO1NBQ0wsQ0FBQztRQUVGLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtZQUM3QixNQUFNLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztTQUNsQztRQUVELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN6QixNQUFNLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUMxQjtRQUVELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUN0QjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFDSCwwQkFBQztBQUFELENBQUMsQUF6RUQsQ0FBeUMsWUFBWSxHQXlFcEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FnZ3JlZ2F0ZU9wfSBmcm9tICd2ZWdhJztcbmltcG9ydCB7dmdGaWVsZH0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtXaW5kb3dGaWVsZERlZiwgV2luZG93T25seU9wLCBXaW5kb3dUcmFuc2Zvcm19IGZyb20gJy4uLy4uL3RyYW5zZm9ybSc7XG5pbXBvcnQge2R1cGxpY2F0ZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnQ29tcGFyYXRvciwgVmdDb21wYXJhdG9yT3JkZXIsIFZnV2luZG93VHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge0RhdGFGbG93Tm9kZX0gZnJvbSAnLi9kYXRhZmxvdyc7XG5cbi8qKlxuICogQSBjbGFzcyBmb3IgdGhlIHdpbmRvdyB0cmFuc2Zvcm0gbm9kZXNcbiAqL1xuZXhwb3J0IGNsYXNzIFdpbmRvd1RyYW5zZm9ybU5vZGUgZXh0ZW5kcyBEYXRhRmxvd05vZGUge1xuICBwdWJsaWMgY2xvbmUoKSB7XG4gICAgICByZXR1cm4gbmV3IFdpbmRvd1RyYW5zZm9ybU5vZGUodGhpcy5wYXJlbnQsIGR1cGxpY2F0ZSh0aGlzLnRyYW5zZm9ybSkpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGFyZW50OiBEYXRhRmxvd05vZGUsIHByaXZhdGUgdHJhbnNmb3JtOiBXaW5kb3dUcmFuc2Zvcm0pIHtcbiAgICBzdXBlcihwYXJlbnQpO1xuICB9XG5cbiAgcHVibGljIHByb2R1Y2VkRmllbGRzKCkge1xuICAgIGNvbnN0IG91dCA9IHt9O1xuICAgIHRoaXMudHJhbnNmb3JtLndpbmRvdy5mb3JFYWNoKHdpbmRvd0ZpZWxkRGVmID0+IHtcbiAgICAgIG91dFt0aGlzLmdldERlZmF1bHROYW1lKHdpbmRvd0ZpZWxkRGVmKV0gPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVmYXVsdE5hbWUod2luZG93RmllbGREZWY6IFdpbmRvd0ZpZWxkRGVmKTogc3RyaW5nIHtcbiAgICByZXR1cm4gd2luZG93RmllbGREZWYuYXMgfHwgdmdGaWVsZCh3aW5kb3dGaWVsZERlZik7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGUoKTogVmdXaW5kb3dUcmFuc2Zvcm0ge1xuICAgIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBvcHM6IChBZ2dyZWdhdGVPcCB8IFdpbmRvd09ubHlPcClbXSA9IFtdO1xuICAgIGNvbnN0IGFzID0gW107XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgZm9yIChjb25zdCB3aW5kb3cgb2YgdGhpcy50cmFuc2Zvcm0ud2luZG93KSB7XG4gICAgICBvcHMucHVzaCh3aW5kb3cub3ApO1xuICAgICAgYXMucHVzaCh0aGlzLmdldERlZmF1bHROYW1lKHdpbmRvdykpO1xuICAgICAgcGFyYW1zLnB1c2god2luZG93LnBhcmFtID09PSB1bmRlZmluZWQgPyBudWxsIDogd2luZG93LnBhcmFtKTtcbiAgICAgIGZpZWxkcy5wdXNoKHdpbmRvdy5maWVsZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHdpbmRvdy5maWVsZCk7XG4gICAgfVxuXG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLnRyYW5zZm9ybS5mcmFtZTtcbiAgICBjb25zdCBncm91cGJ5ID0gdGhpcy50cmFuc2Zvcm0uZ3JvdXBieTtcbiAgICBjb25zdCBzb3J0RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNvcnRPcmRlcjogVmdDb21wYXJhdG9yT3JkZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLnRyYW5zZm9ybS5zb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAoY29uc3Qgc29ydEZpZWxkIG9mIHRoaXMudHJhbnNmb3JtLnNvcnQpIHtcbiAgICAgICAgc29ydEZpZWxkcy5wdXNoKHNvcnRGaWVsZC5maWVsZCk7XG4gICAgICAgIHNvcnRPcmRlci5wdXNoKHNvcnRGaWVsZC5vcmRlciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHNvcnRGaWVsZC5vcmRlciBhcyBWZ0NvbXBhcmF0b3JPcmRlcik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNvcnQ6IFZnQ29tcGFyYXRvciA9IHtcbiAgICAgIGZpZWxkOiBzb3J0RmllbGRzLFxuICAgICAgb3JkZXI6IHNvcnRPcmRlcixcbiAgICB9O1xuICAgIGNvbnN0IGlnbm9yZVBlZXJzID0gdGhpcy50cmFuc2Zvcm0uaWdub3JlUGVlcnM7XG5cbiAgICBjb25zdCByZXN1bHQ6IFZnV2luZG93VHJhbnNmb3JtID0ge1xuICAgICAgdHlwZTogJ3dpbmRvdycsXG4gICAgICBwYXJhbXMsXG4gICAgICBhcyxcbiAgICAgIG9wcyxcbiAgICAgIGZpZWxkcyxcbiAgICAgIHNvcnQsXG4gICAgfTtcblxuICAgIGlmIChpZ25vcmVQZWVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuaWdub3JlUGVlcnMgPSBpZ25vcmVQZWVycztcbiAgICB9XG5cbiAgICBpZiAoZ3JvdXBieSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXN1bHQuZ3JvdXBieSA9IGdyb3VwYnk7XG4gICAgfVxuXG4gICAgaWYgKGZyYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdC5mcmFtZSA9IGZyYW1lO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { MAIN, RAW } from '../../data';\nimport * as log from '../../log';\nimport { isAggregate, isBin, isCalculate, isFilter, isLookup, isStack, isTimeUnit, isWindow } from '../../transform';\nimport { keys } from '../../util';\nimport { isFacetModel, isLayerModel, isUnitModel } from '../model';\nimport { requiresSelectionId } from '../selection/selection';\nimport { AggregateNode } from './aggregate';\nimport { BinNode } from './bin';\nimport { CalculateNode } from './calculate';\nimport { OutputNode } from './dataflow';\nimport { FacetNode } from './facet';\nimport { FilterNode } from './filter';\nimport { FilterInvalidNode } from './filterinvalid';\nimport { ParseNode } from './formatparse';\nimport { GeoJSONNode } from './geojson';\nimport { GeoPointNode } from './geopoint';\nimport { IdentifierNode } from './indentifier';\nimport { AncestorParse } from './index';\nimport { LookupNode } from './lookup';\nimport { SourceNode } from './source';\nimport { StackNode } from './stack';\nimport { TimeUnitNode } from './timeunit';\nimport { WindowTransformNode } from './window';\nfunction parseRoot(model, sources) {\n if (model.data || !model.parent) {\n // if the model defines a data source or is the root, create a source node\n var source = new SourceNode(model.data);\n var hash = source.hash();\n if (hash in sources) {\n // use a reference if we already have a source\n return sources[hash];\n }\n else {\n // otherwise add a new one\n sources[hash] = source;\n return source;\n }\n }\n else {\n // If we don't have a source defined (overriding parent's data), use the parent's facet root or main.\n return model.parent.component.data.facetRoot ? model.parent.component.data.facetRoot : model.parent.component.data.main;\n }\n}\n/**\n * Parses a transforms array into a chain of connected dataflow nodes.\n */\nexport function parseTransformArray(head, model, ancestorParse) {\n var lookupCounter = 0;\n model.transforms.forEach(function (t) {\n if (isCalculate(t)) {\n head = new CalculateNode(head, t);\n ancestorParse.set(t.as, 'derived', false);\n }\n else if (isFilter(t)) {\n head = ParseNode.makeImplicitFromFilterTransform(head, t, ancestorParse) || head;\n head = new FilterNode(head, model, t.filter);\n }\n else if (isBin(t)) {\n head = BinNode.makeFromTransform(head, t, model);\n ancestorParse.set(t.as, 'number', false);\n }\n else if (isTimeUnit(t)) {\n head = TimeUnitNode.makeFromTransform(head, t);\n ancestorParse.set(t.as, 'date', false);\n }\n else if (isAggregate(t)) {\n var agg = head = AggregateNode.makeFromTransform(head, t);\n if (requiresSelectionId(model)) {\n head = new IdentifierNode(head);\n }\n for (var _i = 0, _a = keys(agg.producedFields()); _i < _a.length; _i++) {\n var field = _a[_i];\n ancestorParse.set(field, 'derived', false);\n }\n }\n else if (isLookup(t)) {\n var lookup = head = LookupNode.make(head, model, t, lookupCounter++);\n for (var _b = 0, _c = keys(lookup.producedFields()); _b < _c.length; _b++) {\n var field = _c[_b];\n ancestorParse.set(field, 'derived', false);\n }\n }\n else if (isWindow(t)) {\n var window_1 = head = new WindowTransformNode(head, t);\n for (var _d = 0, _e = keys(window_1.producedFields()); _d < _e.length; _d++) {\n var field = _e[_d];\n ancestorParse.set(field, 'derived', false);\n }\n }\n else if (isStack(t)) {\n var stack = head = StackNode.makeFromTransform(head, t);\n for (var _f = 0, _g = keys(stack.producedFields()); _f < _g.length; _f++) {\n var field = _g[_f];\n ancestorParse.set(field, 'derived', false);\n }\n }\n else {\n log.warn(log.message.invalidTransformIgnored(t));\n return;\n }\n });\n return head;\n}\n/*\nDescription of the dataflow (http://asciiflow.com/):\n +--------+\n | Source |\n +---+----+\n |\n v\n FormatParse\n (explicit)\n |\n v\n Transforms\n(Filter, Calculate, Binning, TimeUnit, Aggregate, Window, ...)\n |\n v\n FormatParse\n (implicit)\n |\n v\n Binning (in `encoding`)\n |\n v\n Timeunit (in `encoding`)\n |\n v\nFormula From Sort Array\n |\n v\n +--+--+\n | Raw |\n +-----+\n |\n v\n Aggregate (in `encoding`)\n |\n v\n Stack (in `encoding`)\n |\n v\n Invalid Filter\n |\n v\n +----------+\n | Main |\n +----------+\n |\n v\n +-------+\n | Facet |----> \"column\", \"column-layout\", and \"row\"\n +-------+\n |\n v\n ...Child data...\n*/\nexport function parseData(model) {\n var head = parseRoot(model, model.component.data.sources);\n var _a = model.component.data, outputNodes = _a.outputNodes, outputNodeRefCounts = _a.outputNodeRefCounts;\n var ancestorParse = model.parent ? model.parent.component.data.ancestorParse.clone() : new AncestorParse();\n // format.parse: null means disable parsing\n if (model.data && model.data.format && model.data.format.parse === null) {\n ancestorParse.parseNothing = true;\n }\n head = ParseNode.makeExplicit(head, model, ancestorParse) || head;\n // Default discrete selections require an identifier transform to\n // uniquely identify data points as the _id field is volatile. Add\n // this transform at the head of our pipeline such that the identifier\n // field is available for all subsequent datasets. Additional identifier\n // transforms will be necessary when new tuples are constructed\n // (e.g., post-aggregation).\n if (requiresSelectionId(model) && (isUnitModel(model) || isLayerModel(model))) {\n head = new IdentifierNode(head);\n }\n // HACK: This is equivalent for merging bin extent for union scale.\n // FIXME(https://github.com/vega/vega-lite/issues/2270): Correctly merge extent / bin node for shared bin scale\n var parentIsLayer = model.parent && isLayerModel(model.parent);\n if (isUnitModel(model) || isFacetModel(model)) {\n if (parentIsLayer) {\n head = BinNode.makeFromEncoding(head, model) || head;\n }\n }\n if (model.transforms.length > 0) {\n head = parseTransformArray(head, model, ancestorParse);\n }\n head = ParseNode.makeImplicitFromEncoding(head, model, ancestorParse) || head;\n if (isUnitModel(model)) {\n head = GeoJSONNode.parseAll(head, model);\n head = GeoPointNode.parseAll(head, model);\n }\n if (isUnitModel(model) || isFacetModel(model)) {\n if (!parentIsLayer) {\n head = BinNode.makeFromEncoding(head, model) || head;\n }\n head = TimeUnitNode.makeFromEncoding(head, model) || head;\n head = CalculateNode.parseAllForSortIndex(head, model);\n }\n // add an output node pre aggregation\n var rawName = model.getName(RAW);\n var raw = new OutputNode(head, rawName, RAW, outputNodeRefCounts);\n outputNodes[rawName] = raw;\n head = raw;\n if (isUnitModel(model)) {\n var agg = AggregateNode.makeFromEncoding(head, model);\n if (agg) {\n head = agg;\n if (requiresSelectionId(model)) {\n head = new IdentifierNode(head);\n }\n }\n head = StackNode.makeFromEncoding(head, model) || head;\n }\n if (isUnitModel(model)) {\n head = FilterInvalidNode.make(head, model) || head;\n }\n // output node for marks\n var mainName = model.getName(MAIN);\n var main = new OutputNode(head, mainName, MAIN, outputNodeRefCounts);\n outputNodes[mainName] = main;\n head = main;\n // add facet marker\n var facetRoot = null;\n if (isFacetModel(model)) {\n var facetName = model.getName('facet');\n facetRoot = new FacetNode(head, model, facetName, main.getSource());\n outputNodes[facetName] = facetRoot;\n head = facetRoot;\n }\n return tslib_1.__assign({}, model.component.data, { outputNodes: outputNodes,\n outputNodeRefCounts: outputNodeRefCounts,\n raw: raw,\n main: main,\n facetRoot: facetRoot,\n ancestorParse: ancestorParse });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ25ILE9BQU8sRUFBTyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFRLE1BQU0sVUFBVSxDQUFDO0FBQ3hFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxj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cG9ydCB7TUFJTiwgUkFXfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtpc0FnZ3JlZ2F0ZSwgaXNCaW4sIGlzQ2FsY3VsYXRlLCBpc0ZpbHRlciwgaXNMb29rdXAsIGlzU3RhY2ssIGlzVGltZVVuaXQsIGlzV2luZG93fSBmcm9tICcuLi8uLi90cmFuc2Zvcm0nO1xuaW1wb3J0IHtEaWN0LCBrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7aXNGYWNldE1vZGVsLCBpc0xheWVyTW9kZWwsIGlzVW5pdE1vZGVsLCBNb2RlbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtyZXF1aXJlc1NlbGVjdGlvbklkfSBmcm9tICcuLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7QWdncmVnYXRlTm9kZX0gZnJvbSAnLi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtCaW5Ob2RlfSBmcm9tICcuL2Jpbic7XG5pbXBvcnQge0NhbGN1bGF0ZU5vZGV9IGZyb20gJy4vY2FsY3VsYXRlJztcbmltcG9ydCB7RGF0YUZsb3dOb2RlLCBPdXRwdXROb2RlfSBmcm9tICcuL2RhdGFmbG93JztcbmltcG9ydCB7RmFjZXROb2RlfSBmcm9tICcuL2ZhY2V0JztcbmltcG9ydCB7RmlsdGVyTm9kZX0gZnJvbSAnLi9maWx0ZXInO1xuaW1wb3J0IHtGaWx0ZXJJbnZhbGlkTm9kZX0gZnJvbSAnLi9maWx0ZXJpbnZhbGlkJztcbmltcG9ydCB7UGFyc2VOb2RlfSBmcm9tICcuL2Zvcm1hdHBhcnNlJztcbmltcG9ydCB7R2VvSlNPTk5vZGV9IGZyb20gJy4vZ2VvanNvbic7XG5pbXBvcnQge0dlb1BvaW50Tm9kZX0gZnJvbSAnLi9nZW9wb2ludCc7XG5pbXBvcnQge0lkZW50aWZpZXJOb2RlfSBmcm9tICcuL2luZGVudGlmaWVyJztcbmltcG9ydCB7QW5jZXN0b3JQYXJzZSwgRGF0YUNvbXBvbmVudH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQge0xvb2t1cE5vZGV9IGZyb20gJy4vbG9va3VwJztcbmltcG9ydCB7U291cmNlTm9kZX0gZnJvbSAnLi9zb3VyY2UnO1xuaW1wb3J0IHtTdGFja05vZGV9IGZyb20gJy4vc3RhY2snO1xuaW1wb3J0IHtUaW1lVW5pdE5vZGV9IGZyb20gJy4vdGltZXVuaXQnO1xuaW1wb3J0IHtXaW5kb3dUcmFuc2Zvcm1Ob2RlfSBmcm9tICcuL3dpbmRvdyc7XG5cbmZ1bmN0aW9uIHBhcnNlUm9vdChtb2RlbDogTW9kZWwsIHNvdXJjZXM6IERpY3Q8U291cmNlTm9kZT4pOiBEYXRhRmxvd05vZGUge1xuICBpZiAobW9kZWwuZGF0YSB8fCAhbW9kZWwucGFyZW50KSB7XG4gICAgLy8gaWYgdGhlIG1vZGVsIGRlZmluZXMgYSBkYXRhIHNvdXJjZSBvciBpcyB0aGUgcm9vdCwgY3JlYXRlIGEgc291cmNlIG5vZGVcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlTm9kZShtb2RlbC5kYXRhKTtcbiAgICBjb25zdCBoYXNoID0gc291cmNlLmhhc2goKTtcbiAgICBpZiAoaGFzaCBpbiBzb3VyY2VzKSB7XG4gICAgICAvLyB1c2UgYSByZWZlcmVuY2UgaWYgd2UgYWxyZWFkeSBoYXZlIGEgc291cmNlXG4gICAgICByZXR1cm4gc291cmNlc1toYXNoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBhIG5ldyBvbmVcbiAgICAgIHNvdXJjZXNbaGFzaF0gPSBzb3VyY2U7XG4gICAgICByZXR1cm4gc291cmNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGEgc291cmNlIGRlZmluZWQgKG92ZXJyaWRpbmcgcGFyZW50J3MgZGF0YSksIHVzZSB0aGUgcGFyZW50J3MgZmFjZXQgcm9vdCBvciBtYWluLlxuICAgIHJldHVybiBtb2RlbC5wYXJlbnQuY29tcG9uZW50LmRhdGEuZmFjZXRSb290ID8gbW9kZWwucGFyZW50LmNvbXBvbmVudC5kYXRhLmZhY2V0Um9vdCA6IG1vZGVsLnBhcmVudC5jb21wb25lbnQuZGF0YS5tYWluO1xuICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXMgYSB0cmFuc2Zvcm1zIGFycmF5IGludG8gYSBjaGFpbiBvZiBjb25uZWN0ZWQgZGF0YWZsb3cgbm9kZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRyYW5zZm9ybUFycmF5KGhlYWQ6IERhdGFGbG93Tm9kZSwgbW9kZWw6IE1vZGVsLCBhbmNlc3RvclBhcnNlOiBBbmNlc3RvclBhcnNlKTogRGF0YUZsb3dOb2RlIHtcbiAgbGV0IGxvb2t1cENvdW50ZXIgPSAwO1xuXG4gIG1vZGVsLnRyYW5zZm9ybXMuZm9yRWFjaCh0ID0+IHtcbiAgICBpZiAoaXNDYWxjdWxhdGUodCkpIHtcbiAgICAgIGhlYWQgPSBuZXcgQ2FsY3VsYXRlTm9kZShoZWFkLCB0KTtcbiAgICAgIGFuY2VzdG9yUGFyc2Uuc2V0KHQuYXMsICdkZXJpdmVkJywgZmFsc2UpO1xuICAgIH0gZWxzZSBpZiAoaXNGaWx0ZXIodCkpIHtcbiAgICAgIGhlYWQgPSBQYXJzZU5vZGUubWFrZUltcGxpY2l0RnJvbUZpbHRlclRyYW5zZm9ybShoZWFkLCB0LCBhbmNlc3RvclBhcnNlKSB8fCBoZWFkO1xuXG4gICAgICBoZWFkID0gbmV3IEZpbHRlck5vZGUoaGVhZCwgbW9kZWwsIHQuZmlsdGVyKTtcbiAgICB9IGVsc2UgaWYgKGlzQmluKHQpKSB7XG4gICAgICBoZWFkID0gQmluTm9kZS5tYWtlRnJvbVRyYW5zZm9ybShoZWFkLCB0LCBtb2RlbCk7XG5cbiAgICAgIGFuY2VzdG9yUGFyc2Uuc2V0KHQuYXMsICdudW1iZXInLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChpc1RpbWVVbml0KHQpKSB7XG4gICAgICBoZWFkID0gVGltZVVuaXROb2RlLm1ha2VGcm9tVHJhbnNmb3JtKGhlYWQsIHQpO1xuXG4gICAgICBhbmNlc3RvclBhcnNlLnNldCh0LmFzLCAnZGF0ZScsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGlzQWdncmVnYXRlKHQpKSB7XG4gICAgICBjb25zdCBhZ2cgPSBoZWFkID0gQWdncmVnYXRlTm9kZS5tYWtlRnJvbVRyYW5zZm9ybShoZWFkLCB0KTtcblxuICAgICAgaWYgKHJlcXVpcmVzU2VsZWN0aW9uSWQobW9kZWwpKSB7XG4gICAgICAgIGhlYWQgPSBuZXcgSWRlbnRpZmllck5vZGUoaGVhZCk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyhhZ2cucHJvZHVjZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgYW5jZXN0b3JQYXJzZS5zZXQoZmllbGQsICdkZXJpdmVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNMb29rdXAodCkpIHtcbiAgICAgIGNvbnN0IGxvb2t1cCA9IGhlYWQgPSBMb29rdXBOb2RlLm1ha2UoaGVhZCwgbW9kZWwsIHQsIGxvb2t1cENvdW50ZXIrKyk7XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyhsb29rdXAucHJvZHVjZWRGaWVsZHMoKSkpIHtcbiAgICAgICAgYW5jZXN0b3JQYXJzZS5zZXQoZmllbGQsICdkZXJpdmVkJywgZmFsc2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNXaW5kb3codCkpIHtcbiAgICAgIGNvbnN0IHdpbmRvdyA9IGhlYWQgPSBuZXcgV2luZG93VHJhbnNmb3JtTm9kZShoZWFkLCB0KTtcblxuICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBrZXlzKHdpbmRvdy5wcm9kdWNlZEZpZWxkcygpKSkge1xuICAgICAgICBhbmNlc3RvclBhcnNlLnNldChmaWVsZCwgJ2Rlcml2ZWQnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1N0YWNrKHQpKSB7XG4gICAgICBjb25zdCBzdGFjayA9IGhlYWQgPSBTdGFja05vZGUubWFrZUZyb21UcmFuc2Zvcm0oaGVhZCwgdCk7XG5cbiAgICAgIGZvciAoY29uc3QgZmllbGQgb2Yga2V5cyhzdGFjay5wcm9kdWNlZEZpZWxkcygpKSkge1xuICAgICAgICBhbmNlc3RvclBhcnNlLnNldChmaWVsZCwgJ2Rlcml2ZWQnLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmludmFsaWRUcmFuc2Zvcm1JZ25vcmVkKHQpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBoZWFkO1xufVxuXG4vKlxuRGVzY3JpcHRpb24gb2YgdGhlIGRhdGFmbG93IChodHRwOi8vYXNjaWlmbG93LmNvbS8pOlxuICAgICArLS0tLS0tLS0rXG4gICAgIHwgU291cmNlIHxcbiAgICAgKy0tLSstLS0tK1xuICAgICAgICAgfFxuICAgICAgICAgdlxuICAgICBGb3JtYXRQYXJzZVxuICAgICAoZXhwbGljaXQpXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gICAgIFRyYW5zZm9ybXNcbihGaWx0ZXIsIENhbGN1bGF0ZSwgQmlubmluZywgVGltZVVuaXQsIEFnZ3JlZ2F0ZSwgV2luZG93LCAuLi4pXG4gICAgICAgICB8XG4gICAgICAgICB2XG4gICAgIEZvcm1hdFBhcnNlXG4gICAgIChpbXBsaWNpdClcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiBCaW5uaW5nIChpbiBgZW5jb2RpbmdgKVxuICAgICAgICAgfFxuICAgICAgICAgdlxuIFRpbWV1bml0IChpbiBgZW5jb2RpbmdgKVxuICAgICAgICAgfFxuICAgICAgICAgdlxuRm9ybXVsYSBGcm9tIFNvcnQgQXJyYXlcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgICAgICstLSstLStcbiAgICAgIHwgUmF3IHxcbiAgICAgICstLS0tLStcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgQWdncmVnYXRlIChpbiBgZW5jb2RpbmdgKVxuICAgICAgICAgfFxuICAgICAgICAgdlxuICBTdGFjayAoaW4gYGVuY29kaW5nYClcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgSW52YWxpZCBGaWx0ZXJcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgICstLS0tLS0tLS0tK1xuICAgfCAgIE1haW4gICB8XG4gICArLS0tLS0tLS0tLStcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgICAgKy0tLS0tLS0rXG4gICAgIHwgRmFjZXQgfC0tLS0+IFwiY29sdW1uXCIsIFwiY29sdW1uLWxheW91dFwiLCBhbmQgXCJyb3dcIlxuICAgICArLS0tLS0tLStcbiAgICAgICAgIHxcbiAgICAgICAgIHZcbiAgLi4uQ2hpbGQgZGF0YS4uLlxuKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGF0YShtb2RlbDogTW9kZWwpOiBEYXRhQ29tcG9uZW50IHtcbiAgbGV0IGhlYWQgPSBwYXJzZVJvb3QobW9kZWwsIG1vZGVsLmNvbXBvbmVudC5kYXRhLnNvdXJjZXMpO1xuXG4gIGNvbnN0IHtvdXRwdXROb2Rlcywgb3V0cHV0Tm9kZVJlZkNvdW50c30gPSBtb2RlbC5jb21wb25lbnQuZGF0YTtcbiAgY29uc3QgYW5jZXN0b3JQYXJzZSA9IG1vZGVsLnBhcmVudCA/IG1vZGVsLnBhcmVudC5jb21wb25lbnQuZGF0YS5hbmNlc3RvclBhcnNlLmNsb25lKCkgOiBuZXcgQW5jZXN0b3JQYXJzZSgpO1xuXG4gIC8vIGZvcm1hdC5wYXJzZTogbnVsbCBtZWFucyBkaXNhYmxlIHBhcnNpbmdcbiAgaWYgKG1vZGVsLmRhdGEgJiYgbW9kZWwuZGF0YS5mb3JtYXQgJiYgbW9kZWwuZGF0YS5mb3JtYXQucGFyc2UgPT09IG51bGwpIHtcbiAgICBhbmNlc3RvclBhcnNlLnBhcnNlTm90aGluZyA9IHRydWU7XG4gIH1cblxuICBoZWFkID0gUGFyc2VOb2RlLm1ha2VFeHBsaWNpdChoZWFkLCBtb2RlbCwgYW5jZXN0b3JQYXJzZSkgfHwgaGVhZDtcblxuICAvLyBEZWZhdWx0IGRpc2NyZXRlIHNlbGVjdGlvbnMgcmVxdWlyZSBhbiBpZGVudGlmaWVyIHRyYW5zZm9ybSB0b1xuICAvLyB1bmlxdWVseSBpZGVudGlmeSBkYXRhIHBvaW50cyBhcyB0aGUgX2lkIGZpZWxkIGlzIHZvbGF0aWxlLiBBZGRcbiAgLy8gdGhpcyB0cmFuc2Zvcm0gYXQgdGhlIGhlYWQgb2Ygb3VyIHBpcGVsaW5lIHN1Y2ggdGhhdCB0aGUgaWRlbnRpZmllclxuICAvLyBmaWVsZCBpcyBhdmFpbGFibGUgZm9yIGFsbCBzdWJzZXF1ZW50IGRhdGFzZXRzLiBBZGRpdGlvbmFsIGlkZW50aWZpZXJcbiAgLy8gdHJhbnNmb3JtcyB3aWxsIGJlIG5lY2Vzc2FyeSB3aGVuIG5ldyB0dXBsZXMgYXJlIGNvbnN0cnVjdGVkXG4gIC8vIChlLmcuLCBwb3N0LWFnZ3JlZ2F0aW9uKS5cbiAgaWYgKHJlcXVpcmVzU2VsZWN0aW9uSWQobW9kZWwpICYmIChpc1VuaXRNb2RlbChtb2RlbCkgfHwgaXNMYXllck1vZGVsKG1vZGVsKSkpIHtcbiAgICBoZWFkID0gbmV3IElkZW50aWZpZXJOb2RlKGhlYWQpO1xuICB9XG5cbiAgLy8gSEFDSzogVGhpcyBpcyBlcXVpdmFsZW50IGZvciBtZXJnaW5nIGJpbiBleHRlbnQgZm9yIHVuaW9uIHNjYWxlLlxuICAvLyBGSVhNRShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzIyNzApOiBDb3JyZWN0bHkgbWVyZ2UgZXh0ZW50IC8gYmluIG5vZGUgZm9yIHNoYXJlZCBiaW4gc2NhbGVcbiAgY29uc3QgcGFyZW50SXNMYXllciA9IG1vZGVsLnBhcmVudCAmJiBpc0xheWVyTW9kZWwobW9kZWwucGFyZW50KTtcbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG4gICAgaWYgKHBhcmVudElzTGF5ZXIpIHtcbiAgICAgIGhlYWQgPSBCaW5Ob2RlLm1ha2VGcm9tRW5jb2RpbmcoaGVhZCwgbW9kZWwpIHx8IGhlYWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKG1vZGVsLnRyYW5zZm9ybXMubGVuZ3RoID4gMCkge1xuICAgIGhlYWQgPSBwYXJzZVRyYW5zZm9ybUFycmF5KGhlYWQsIG1vZGVsLCBhbmNlc3RvclBhcnNlKTtcbiAgfVxuXG4gIGhlYWQgPSBQYXJzZU5vZGUubWFrZUltcGxpY2l0RnJvbUVuY29kaW5nKGhlYWQsIG1vZGVsLCBhbmNlc3RvclBhcnNlKSB8fCBoZWFkO1xuXG4gIGlmIChpc1VuaXRNb2RlbChtb2RlbCkpIHtcbiAgICBoZWFkID0gR2VvSlNPTk5vZGUucGFyc2VBbGwoaGVhZCwgbW9kZWwpO1xuICAgIGhlYWQgPSBHZW9Qb2ludE5vZGUucGFyc2VBbGwoaGVhZCwgbW9kZWwpO1xuICB9XG5cbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSB8fCBpc0ZhY2V0TW9kZWwobW9kZWwpKSB7XG5cbiAgICBpZiAoIXBhcmVudElzTGF5ZXIpIHtcbiAgICAgIGhlYWQgPSBCaW5Ob2RlLm1ha2VGcm9tRW5jb2RpbmcoaGVhZCwgbW9kZWwpIHx8IGhlYWQ7XG4gICAgfVxuXG4gICAgaGVhZCA9IFRpbWVVbml0Tm9kZS5tYWtlRnJvbUVuY29kaW5nKGhlYWQsIG1vZGVsKSB8fCBoZWFkO1xuICAgIGhlYWQgPSBDYWxjdWxhdGVOb2RlLnBhcnNlQWxsRm9yU29ydEluZGV4KGhlYWQsIG1vZGVsKTtcbiAgfVxuXG4gIC8vIGFkZCBhbiBvdXRwdXQgbm9kZSBwcmUgYWdncmVnYXRpb25cbiAgY29uc3QgcmF3TmFtZSA9IG1vZGVsLmdldE5hbWUoUkFXKTtcbiAgY29uc3QgcmF3ID0gbmV3IE91dHB1dE5vZGUoaGVhZCwgcmF3TmFtZSwgUkFXLCBvdXRwdXROb2RlUmVmQ291bnRzKTtcbiAgb3V0cHV0Tm9kZXNbcmF3TmFtZV0gPSByYXc7XG4gIGhlYWQgPSByYXc7XG5cbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSkge1xuICAgIGNvbnN0IGFnZyA9IEFnZ3JlZ2F0ZU5vZGUubWFrZUZyb21FbmNvZGluZyhoZWFkLCBtb2RlbCk7XG4gICAgaWYgKGFnZykge1xuICAgICAgaGVhZCA9IGFnZztcblxuICAgICAgaWYgKHJlcXVpcmVzU2VsZWN0aW9uSWQobW9kZWwpKSB7XG4gICAgICAgIGhlYWQgPSBuZXcgSWRlbnRpZmllck5vZGUoaGVhZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaGVhZCA9IFN0YWNrTm9kZS5tYWtlRnJvbUVuY29kaW5nKGhlYWQsIG1vZGVsKSB8fCBoZWFkO1xuICB9XG5cbiAgaWYgKGlzVW5pdE1vZGVsKG1vZGVsKSkge1xuICAgIGhlYWQgPSBGaWx0ZXJJbnZhbGlkTm9kZS5tYWtlKGhlYWQsIG1vZGVsKSB8fCBoZWFkO1xuICB9XG5cbiAgLy8gb3V0cHV0IG5vZGUgZm9yIG1hcmtzXG4gIGNvbnN0IG1haW5OYW1lID0gbW9kZWwuZ2V0TmFtZShNQUlOKTtcbiAgY29uc3QgbWFpbiA9IG5ldyBPdXRwdXROb2RlKGhlYWQsIG1haW5OYW1lLCBNQUlOLCBvdXRwdXROb2RlUmVmQ291bnRzKTtcbiAgb3V0cHV0Tm9kZXNbbWFpbk5hbWVdID0gbWFpbjtcbiAgaGVhZCA9IG1haW47XG5cbiAgLy8gYWRkIGZhY2V0IG1hcmtlclxuICBsZXQgZmFjZXRSb290ID0gbnVsbDtcbiAgaWYgKGlzRmFjZXRNb2RlbChtb2RlbCkpIHtcbiAgICBjb25zdCBmYWNldE5hbWUgPSBtb2RlbC5nZXROYW1lKCdmYWNldCcpO1xuICAgIGZhY2V0Um9vdCA9IG5ldyBGYWNldE5vZGUoaGVhZCwgbW9kZWwsIGZhY2V0TmFtZSwgbWFpbi5nZXRTb3VyY2UoKSk7XG4gICAgb3V0cHV0Tm9kZXNbZmFjZXROYW1lXSA9IGZhY2V0Um9vdDtcbiAgICBoZWFkID0gZmFjZXRSb290O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tb2RlbC5jb21wb25lbnQuZGF0YSxcbiAgICBvdXRwdXROb2RlcyxcbiAgICBvdXRwdXROb2RlUmVmQ291bnRzLFxuICAgIHJhdyxcbiAgICBtYWluLFxuICAgIGZhY2V0Um9vdCxcbiAgICBhbmNlc3RvclBhcnNlXG4gIH07XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { keys } from '../util';\nimport { parseData } from './data/parse';\nimport { assembleLayoutSignals } from './layoutsize/assemble';\nimport { Model } from './model';\nvar BaseConcatModel = /** @class */ (function (_super) {\n tslib_1.__extends(BaseConcatModel, _super);\n function BaseConcatModel(spec, parent, parentGivenName, config, repeater, resolve) {\n return _super.call(this, spec, parent, parentGivenName, config, repeater, resolve) || this;\n }\n BaseConcatModel.prototype.parseData = function () {\n this.component.data = parseData(this);\n this.children.forEach(function (child) {\n child.parseData();\n });\n };\n BaseConcatModel.prototype.parseSelection = function () {\n var _this = this;\n // Merge selections up the hierarchy so that they may be referenced\n // across unit specs. Persist their definitions within each child\n // to assemble signals which remain within output Vega unit groups.\n this.component.selection = {};\n var _loop_1 = function (child) {\n child.parseSelection();\n keys(child.component.selection).forEach(function (key) {\n _this.component.selection[key] = child.component.selection[key];\n });\n };\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n _loop_1(child);\n }\n };\n BaseConcatModel.prototype.parseMarkGroup = function () {\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parseMarkGroup();\n }\n };\n BaseConcatModel.prototype.parseAxisAndHeader = function () {\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parseAxisAndHeader();\n }\n // TODO(#2415): support shared axes\n };\n BaseConcatModel.prototype.assembleSelectionTopLevelSignals = function (signals) {\n return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals);\n };\n BaseConcatModel.prototype.assembleSelectionSignals = function () {\n this.children.forEach(function (child) { return child.assembleSelectionSignals(); });\n return [];\n };\n BaseConcatModel.prototype.assembleLayoutSignals = function () {\n return this.children.reduce(function (signals, child) {\n return signals.concat(child.assembleLayoutSignals());\n }, assembleLayoutSignals(this));\n };\n BaseConcatModel.prototype.assembleSelectionData = function (data) {\n return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data);\n };\n BaseConcatModel.prototype.assembleMarks = function () {\n // only children have marks\n return this.children.map(function (child) {\n var title = child.assembleTitle();\n var style = child.assembleGroupStyle();\n var layoutSizeEncodeEntry = child.assembleLayoutSize();\n return tslib_1.__assign({ type: 'group', name: child.getName('group') }, (title ? { title: title } : {}), (style ? { style: style } : {}), (layoutSizeEncodeEntry ? {\n encode: {\n update: layoutSizeEncodeEntry\n }\n } : {}), child.assembleGroup());\n });\n };\n return BaseConcatModel;\n}(Model));\nexport { BaseConcatModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZWNvbmNhdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2Jhc2Vjb25jYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUdBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFN0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRzlCO0lBQThDLDJDQUFLO0lBQ2pELHlCQUFZLElBQWMsRUFBRSxNQUFhLEVBQUUsZUFBdUIsRUFBRSxNQUFjLEVBQUUsUUFBdUIsRUFBRSxPQUFnQjtlQUMzSCxrQkFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQztJQUNqRSxDQUFDO0lBRU0sbUNBQVMsR0FBaEI7UUFDRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO1lBQzFCLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDTSx3Q0FBYyxHQUFyQjtRQUFBLGlCQVdDO1FBVkMsbUVBQW1FO1FBQ25FLGlFQUFpRTtRQUNqRSxtRUFBbUU7UUFDbkUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dDQUNuQixLQUFLO1lBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEdBQUc7Z0JBQzFDLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUxELEtBQW9CLFVBQWEsRUFBYixLQUFBLElBQUksQ0FBQyxRQUFRLEVBQWIsY0FBYSxFQUFiLElBQWE7WUFBNUIsSUFBTSxLQUFLLFNBQUE7b0JBQUwsS0FBSztTQUtmO0lBQ0gsQ0FBQztJQUVNLHdDQUFjLEdBQXJCO1FBQ0UsS0FBb0IsVUFBYSxFQUFiLEtBQUEsSUFBSSxDQUFDLFFBQVEsRUFBYixjQUFhLEVBQWIsSUFBYSxFQUFFO1lBQTlCLElBQU0sS0FBSyxTQUFBO1lBQ2QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVNLDRDQUFrQixHQUF6QjtRQUNFLEtBQW9CLFVBQWEsRUFBYixLQUFBLElBQUksQ0FBQyxRQUFRLEVBQWIsY0FBYSxFQUFiLElBQWEsRUFBRTtZQUE5QixJQUFNLEtBQUssU0FBQTtZQUNkLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzVCO1FBRUQsbUNBQW1DO0lBQ3JDLENBQUM7SUFFTSwwREFBZ0MsR0FBdkMsVUFBd0MsT0FBYztRQUNwRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQUMsRUFBRSxFQUFFLEtBQUssSUFBSyxPQUFBLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsRUFBMUMsQ0FBMEMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU0sa0RBQXdCLEdBQS9CO1FBQ0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLLElBQUssT0FBQSxLQUFLLENBQUMsd0JBQXdCLEVBQUUsRUFBaEMsQ0FBZ0MsQ0FBQyxDQUFDO1FBQ25FLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVNLCtDQUFxQixHQUE1QjtRQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLEVBQUUsS0FBSztZQUN6QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDLEVBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sK0NBQXFCLEdBQTVCLFVBQTZCLElBQWM7UUFDekMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFDLEVBQUUsRUFBRSxLQUFLLElBQUssT0FBQSxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDLEVBQS9CLENBQStCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVNLHVDQUFhLEdBQXBCO1FBQ0UsMkJBQTJCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQSxLQUFLO1lBQzVCLElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwQyxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN6QyxJQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3pELDBCQUNFLElBQUksRUFBRSxPQUFPLEVBQ2IsSUFBSSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQ3pCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssT0FBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUN0QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLE9BQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDdEIsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUscUJBQXFCO2lCQUM5QjthQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUNKLEtBQUssQ0FBQyxhQUFhLEVBQUUsRUFDeEI7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDSCxzQkFBQztBQUFELENBQUMsQUE3RUQsQ0FBOEMsS0FBSyxHQTZFbEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7UmVzb2x2ZX0gZnJvbSAnLi4vcmVzb2x2ZSc7XG5pbXBvcnQge0Jhc2VTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7a2V5c30gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge1ZnRGF0YSwgVmdTaWduYWx9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VEYXRhfSBmcm9tICcuL2RhdGEvcGFyc2UnO1xuaW1wb3J0IHthc3NlbWJsZUxheW91dFNpZ25hbHN9IGZyb20gJy4vbGF5b3V0c2l6ZS9hc3NlbWJsZSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29uY2F0TW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKHNwZWM6IEJhc2VTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZywgY29uZmlnOiBDb25maWcsIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlLCByZXNvbHZlOiBSZXNvbHZlKSB7XG4gICAgc3VwZXIoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIGNvbmZpZywgcmVwZWF0ZXIsIHJlc29sdmUpO1xuICB9XG5cbiAgcHVibGljIHBhcnNlRGF0YSgpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0gcGFyc2VEYXRhKHRoaXMpO1xuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGNoaWxkLnBhcnNlRGF0YSgpO1xuICAgIH0pO1xuICB9XG4gIHB1YmxpYyBwYXJzZVNlbGVjdGlvbigpIHtcbiAgICAvLyBNZXJnZSBzZWxlY3Rpb25zIHVwIHRoZSBoaWVyYXJjaHkgc28gdGhhdCB0aGV5IG1heSBiZSByZWZlcmVuY2VkXG4gICAgLy8gYWNyb3NzIHVuaXQgc3BlY3MuIFBlcnNpc3QgdGhlaXIgZGVmaW5pdGlvbnMgd2l0aGluIGVhY2ggY2hpbGRcbiAgICAvLyB0byBhc3NlbWJsZSBzaWduYWxzIHdoaWNoIHJlbWFpbiB3aXRoaW4gb3V0cHV0IFZlZ2EgdW5pdCBncm91cHMuXG4gICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uID0ge307XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZVNlbGVjdGlvbigpO1xuICAgICAga2V5cyhjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uW2tleV0gPSBjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VNYXJrR3JvdXAoKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZU1hcmtHcm91cCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUF4aXNBbmRIZWFkZXIoKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZUF4aXNBbmRIZWFkZXIoKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKCMyNDE1KTogc3VwcG9ydCBzaGFyZWQgYXhlc1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKHNpZ25hbHM6IGFueVtdKTogVmdTaWduYWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChzZywgY2hpbGQpID0+IGNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKHNnKSwgc2lnbmFscyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCk6IFZnU2lnbmFsW10ge1xuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IGNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXRTaWduYWxzKCk6IFZnU2lnbmFsW10ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgoc2lnbmFscywgY2hpbGQpID0+IHtcbiAgICAgIHJldHVybiBzaWduYWxzLmNvbmNhdChjaGlsZC5hc3NlbWJsZUxheW91dFNpZ25hbHMoKSk7XG4gICAgfSwgYXNzZW1ibGVMYXlvdXRTaWduYWxzKHRoaXMpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvbkRhdGEoZGF0YTogVmdEYXRhW10pOiBWZ0RhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChkYiwgY2hpbGQpID0+IGNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uRGF0YShkYiksIGRhdGEpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTWFya3MoKTogYW55W10ge1xuICAgIC8vIG9ubHkgY2hpbGRyZW4gaGF2ZSBtYXJrc1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICBjb25zdCB0aXRsZSA9IGNoaWxkLmFzc2VtYmxlVGl0bGUoKTtcbiAgICAgIGNvbnN0IHN0eWxlID0gY2hpbGQuYXNzZW1ibGVHcm91cFN0eWxlKCk7XG4gICAgICBjb25zdCBsYXlvdXRTaXplRW5jb2RlRW50cnkgPSBjaGlsZC5hc3NlbWJsZUxheW91dFNpemUoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdncm91cCcsXG4gICAgICAgIG5hbWU6IGNoaWxkLmdldE5hbWUoJ2dyb3VwJyksXG4gICAgICAgIC4uLih0aXRsZSA/IHt0aXRsZX0gOiB7fSksXG4gICAgICAgIC4uLihzdHlsZSA/IHtzdHlsZX0gOiB7fSksXG4gICAgICAgIC4uLihsYXlvdXRTaXplRW5jb2RlRW50cnkgPyB7XG4gICAgICAgICAgZW5jb2RlOiB7XG4gICAgICAgICAgICB1cGRhdGU6IGxheW91dFNpemVFbmNvZGVFbnRyeVxuICAgICAgICAgIH1cbiAgICAgICAgfSA6IHt9KSxcbiAgICAgICAgLi4uY2hpbGQuYXNzZW1ibGVHcm91cCgpXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iXX0=","import { defaultScaleConfig, hasDiscreteDomain } from '../../scale';\nimport { isVgRangeStep } from '../../vega.schema';\nimport { mergeValuesWithExplicit } from '../split';\nexport function parseLayerLayoutSize(model) {\n parseChildrenLayoutSize(model);\n var layoutSizeCmpt = model.component.layoutSize;\n layoutSizeCmpt.setWithExplicit('width', parseNonUnitLayoutSizeForChannel(model, 'width'));\n layoutSizeCmpt.setWithExplicit('height', parseNonUnitLayoutSizeForChannel(model, 'height'));\n}\nexport var parseRepeatLayoutSize = parseLayerLayoutSize;\nexport function parseConcatLayoutSize(model) {\n parseChildrenLayoutSize(model);\n var layoutSizeCmpt = model.component.layoutSize;\n var sizeTypeToMerge = model.isVConcat ? 'width' : 'height';\n layoutSizeCmpt.setWithExplicit(sizeTypeToMerge, parseNonUnitLayoutSizeForChannel(model, sizeTypeToMerge));\n}\nexport function parseChildrenLayoutSize(model) {\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parseLayoutSize();\n }\n}\nfunction parseNonUnitLayoutSizeForChannel(model, sizeType) {\n var channel = sizeType === 'width' ? 'x' : 'y';\n var resolve = model.component.resolve;\n var mergedSize;\n // Try to merge layout size\n for (var _i = 0, _a = model.children; _i < _a.length; _i++) {\n var child = _a[_i];\n var childSize = child.component.layoutSize.getWithExplicit(sizeType);\n var scaleResolve = resolve.scale[channel];\n if (scaleResolve === 'independent' && childSize.value === 'range-step') {\n // Do not merge independent scales with range-step as their size depends\n // on the scale domains, which can be different between scales.\n mergedSize = undefined;\n break;\n }\n if (mergedSize) {\n if (scaleResolve === 'independent' && mergedSize.value !== childSize.value) {\n // For independent scale, only merge if all the sizes are the same.\n // If the values are different, abandon the merge!\n mergedSize = undefined;\n break;\n }\n mergedSize = mergeValuesWithExplicit(mergedSize, childSize, sizeType, '');\n }\n else {\n mergedSize = childSize;\n }\n }\n if (mergedSize) {\n // If merged, rename size and set size of all children.\n for (var _b = 0, _c = model.children; _b < _c.length; _b++) {\n var child = _c[_b];\n model.renameLayoutSize(child.getName(sizeType), model.getName(sizeType));\n child.component.layoutSize.set(sizeType, 'merged', false);\n }\n return mergedSize;\n }\n else {\n // Otherwise, there is no merged size.\n return {\n explicit: false,\n value: undefined\n };\n }\n}\nexport function parseUnitLayoutSize(model) {\n var layoutSizeComponent = model.component.layoutSize;\n if (!layoutSizeComponent.explicit.width) {\n var width = defaultUnitSize(model, 'width');\n layoutSizeComponent.set('width', width, false);\n }\n if (!layoutSizeComponent.explicit.height) {\n var height = defaultUnitSize(model, 'height');\n layoutSizeComponent.set('height', height, false);\n }\n}\nfunction defaultUnitSize(model, sizeType) {\n var channel = sizeType === 'width' ? 'x' : 'y';\n var config = model.config;\n var scaleComponent = model.getScaleComponent(channel);\n if (scaleComponent) {\n var scaleType = scaleComponent.get('type');\n var range = scaleComponent.get('range');\n if (hasDiscreteDomain(scaleType) && isVgRangeStep(range)) {\n // For discrete domain with range.step, use dynamic width/height\n return 'range-step';\n }\n else {\n return config.view[sizeType];\n }\n }\n else if (model.hasProjection) {\n return config.view[sizeType];\n }\n else {\n // No scale - set default size\n if (sizeType === 'width' && model.mark === 'text') {\n // width for text mark without x-field is a bit wider than typical range step\n return config.scale.textXRangeStep;\n }\n // Set width/height equal to rangeStep config or if rangeStep is null, use value from default scale config.\n return config.scale.rangeStep || defaultScaleConfig.rangeStep;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9sYXlvdXRzaXplL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHaEQsT0FBTyxFQUFXLHVCQUF1QixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSTNELE1BQU0sK0JBQStCLEtBQVk7SUFDL0MsdUJBQXVCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0IsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDbEQsY0FBYyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDMUYsY0FBYyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZ0NBQWdDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDOUYsQ0FBQztBQUVELE1BQU0sQ0FBQyxJQUFNLHFCQUFxQixHQUFHLG9CQUFvQixDQUFDO0FBRTFELE1BQU0sZ0NBQWdDLEtBQWtCO0lBQ3RELHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLElBQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDO0lBRWxELElBQU0sZUFBZSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQzdELGNBQWMsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLGdDQUFnQyxDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQzVHLENBQUM7QUFFRCxNQUFNLGtDQUFrQyxLQUFZO0lBQ2xELEtBQW9CLFVB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Q0FBQztBQUVELHlCQUF5QixLQUFnQixFQUFFLFFBQTRCO0lBQ3JFLElBQU0sT0FBTyxHQUFHLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2pELElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXhELElBQUksY0FBYyxFQUFFO1FBQ2xCLElBQU0sU0FBUyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsSUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUUxQyxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN4RCxnRUFBZ0U7WUFDaEUsT0FBTyxZQUFZLENBQUM7U0FDckI7YUFBTTtZQUNMLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM5QjtLQUNGO1NBQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1FBQzlCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUM5QjtTQUFNO1FBQ0wsOEJBQThCO1FBQzlCLElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sRUFBRTtZQUNqRCw2RUFBNkU7WUFDN0UsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztTQUNwQztRQUVELDJHQUEyRztRQUMzRyxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLGtCQUFrQixDQUFDLFNBQVMsQ0FBQztLQUMvRDtBQUVILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2RlZmF1bHRTY2FsZUNvbmZpZywgaGFzRGlzY3JldGVEb21haW59IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7aXNWZ1JhbmdlU3RlcH0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtDb25jYXRNb2RlbH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7RXhwbGljaXQsIG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0fSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge0xheW91dFNpemUsIExheW91dFNpemVJbmRleH0gZnJvbSAnLi9jb21wb25lbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllckxheW91dFNpemUobW9kZWw6IE1vZGVsKSB7XG4gIHBhcnNlQ2hpbGRyZW5MYXlvdXRTaXplKG1vZGVsKTtcblxuICBjb25zdCBsYXlvdXRTaXplQ21wdCA9IG1vZGVsLmNvbXBvbmVudC5sYXlvdXRTaXplO1xuICBsYXlvdXRTaXplQ21wdC5zZXRXaXRoRXhwbGljaXQoJ3dpZHRoJywgcGFyc2VOb25Vbml0TGF5b3V0U2l6ZUZvckNoYW5uZWwobW9kZWwsICd3aWR0aCcpKTtcbiAgbGF5b3V0U2l6ZUNtcHQuc2V0V2l0aEV4cGxpY2l0KCdoZWlnaHQnLCBwYXJzZU5vblVuaXRMYXlvdXRTaXplRm9yQ2hhbm5lbChtb2RlbCwgJ2hlaWdodCcpKTtcbn1cblxuZXhwb3J0IGNvbnN0IHBhcnNlUmVwZWF0TGF5b3V0U2l6ZSA9IHBhcnNlTGF5ZXJMYXlvdXRTaXplO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDb25jYXRMYXlvdXRTaXplKG1vZGVsOiBDb25jYXRNb2RlbCkge1xuICBwYXJzZUNoaWxkcmVuTGF5b3V0U2l6ZShtb2RlbCk7XG4gIGNvbnN0IGxheW91dFNpemVDbXB0ID0gbW9kZWwuY29tcG9uZW50LmxheW91dFNpemU7XG5cbiAgY29uc3Qgc2l6ZVR5cGVUb01lcmdlID0gbW9kZWwuaXNWQ29uY2F0ID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICBsYXlvdXRTaXplQ21wdC5zZXRXaXRoRXhwbGljaXQoc2l6ZVR5cGVUb01lcmdlLCBwYXJzZU5vblVuaXRMYXlvdXRTaXplRm9yQ2hhbm5lbChtb2RlbCwgc2l6ZVR5cGVUb01lcmdlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNoaWxkcmVuTGF5b3V0U2l6ZShtb2RlbDogTW9kZWwpIHtcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIGNoaWxkLnBhcnNlTGF5b3V0U2l6ZSgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9uVW5pdExheW91dFNpemVGb3JDaGFubmVsKG1vZGVsOiBNb2RlbCwgc2l6ZVR5cGU6ICd3aWR0aCcgfCAnaGVpZ2h0Jyk6IEV4cGxpY2l0PExheW91dFNpemU+IHtcbiAgY29uc3QgY2hhbm5lbCA9IHNpemVUeXBlID09PSAnd2lkdGgnID8gJ3gnIDogJ3knO1xuICBjb25zdCByZXNvbHZlID0gbW9kZWwuY29tcG9uZW50LnJlc29sdmU7XG5cbiAgbGV0IG1lcmdlZFNpemU6IEV4cGxpY2l0PExheW91dFNpemU+O1xuICAvLyBUcnkgdG8gbWVyZ2UgbGF5b3V0IHNpemVcbiAgZm9yIChjb25zdCBjaGlsZCBvZiBtb2RlbC5jaGlsZHJlbikge1xuICAgIGNvbnN0IGNoaWxkU2l6ZSA9IGNoaWxkLmNvbXBvbmVudC5sYXlvdXRTaXplLmdldFdpdGhFeHBsaWNpdChzaXplVHlwZSk7XG4gICAgY29uc3Qgc2NhbGVSZXNvbHZlID0gcmVzb2x2ZS5zY2FsZVtjaGFubmVsXTtcbiAgICBpZiAoc2NhbGVSZXNvbHZlID09PSAnaW5kZXBlbmRlbnQnICYmIGNoaWxkU2l6ZS52YWx1ZSA9PT0gJ3JhbmdlLXN0ZXAnKSB7XG4gICAgICAvLyBEbyBub3QgbWVyZ2UgaW5kZXBlbmRlbnQgc2NhbGVzIHdpdGggcmFuZ2Utc3RlcCBhcyB0aGVpciBzaXplIGRlcGVuZHNcbiAgICAgIC8vIG9uIHRoZSBzY2FsZSBkb21haW5zLCB3aGljaCBjYW4gYmUgZGlmZmVyZW50IGJldHdlZW4gc2NhbGVzLlxuICAgICAgbWVyZ2VkU2l6ZSA9IHVuZGVmaW5lZDtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChtZXJnZWRTaXplKSB7XG4gICAgICBpZiAoc2NhbGVSZXNvbHZlID09PSAnaW5kZXBlbmRlbnQnICYmIG1lcmdlZFNpemUudmFsdWUgIT09IGNoaWxkU2l6ZS52YWx1ZSkge1xuICAgICAgICAvLyBGb3IgaW5kZXBlbmRlbnQgc2NhbGUsIG9ubHkgbWVyZ2UgaWYgYWxsIHRoZSBzaXplcyBhcmUgdGhlIHNhbWUuXG4gICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCwgYWJhbmRvbiB0aGUgbWVyZ2UhXG4gICAgICAgIG1lcmdlZFNpemUgPSB1bmRlZmluZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbWVyZ2VkU2l6ZSA9IG1lcmdlVmFsdWVzV2l0aEV4cGxpY2l0PExheW91dFNpemVJbmRleCwgTGF5b3V0U2l6ZT4oXG4gICAgICAgIG1lcmdlZFNpemUsIGNoaWxkU2l6ZSwgc2l6ZVR5cGUsICcnXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXJnZWRTaXplID0gY2hpbGRTaXplO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtZXJnZWRTaXplKSB7XG4gICAgLy8gSWYgbWVyZ2VkLCByZW5hbWUgc2l6ZSBhbmQgc2V0IHNpemUgb2YgYWxsIGNoaWxkcmVuLlxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIG1vZGVsLnJlbmFtZUxheW91dFNpemUoY2hpbGQuZ2V0TmFtZShzaXplVHlwZSksIG1vZGVsLmdldE5hbWUoc2l6ZVR5cGUpKTtcbiAgICAgIGNoaWxkLmNvbXBvbmVudC5sYXlvdXRTaXplLnNldChzaXplVHlwZSwgJ21lcmdlZCcsIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFNpemU7XG4gIH0gZWxzZSB7XG4gICAgLy8gT3RoZXJ3aXNlLCB0aGVyZSBpcyBubyBtZXJnZWQgc2l6ZS5cbiAgICByZXR1cm4ge1xuICAgICAgZXhwbGljaXQ6IGZhbHNlLFxuICAgICAgdmFsdWU6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVW5pdExheW91dFNpemUobW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCBsYXlvdXRTaXplQ29tcG9uZW50ID0gbW9kZWwuY29tcG9uZW50LmxheW91dFNpemU7XG4gIGlmICghbGF5b3V0U2l6ZUNvbXBvbmVudC5leHBsaWNpdC53aWR0aCkge1xuICAgIGNvbnN0IHdpZHRoID0gZGVmYXVsdFVuaXRTaXplKG1vZGVsLCAnd2lkdGgnKTtcbiAgICBsYXlvdXRTaXplQ29tcG9uZW50LnNldCgnd2lkdGgnLCB3aWR0aCwgZmFsc2UpO1xuICB9XG5cbiAgaWYgKCFsYXlvdXRTaXplQ29tcG9uZW50LmV4cGxpY2l0LmhlaWdodCkge1xuICAgIGNvbnN0IGhlaWdodCA9IGRlZmF1bHRVbml0U2l6ZShtb2RlbCwgJ2hlaWdodCcpO1xuICAgIGxheW91dFNpemVDb21wb25lbnQuc2V0KCdoZWlnaHQnLCBoZWlnaHQsIGZhbHNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0VW5pdFNpemUobW9kZWw6IFVuaXRNb2RlbCwgc2l6ZVR5cGU6ICd3aWR0aCcgfCAnaGVpZ2h0Jyk6IExheW91dFNpemUge1xuICBjb25zdCBjaGFubmVsID0gc2l6ZVR5cGUgPT09ICd3aWR0aCcgPyAneCcgOiAneSc7XG4gIGNvbnN0IGNvbmZpZyA9IG1vZGVsLmNvbmZpZztcbiAgY29uc3Qgc2NhbGVDb21wb25lbnQgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKTtcblxuICBpZiAoc2NhbGVDb21wb25lbnQpIHtcbiAgICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZUNvbXBvbmVudC5nZXQoJ3R5cGUnKTtcbiAgICBjb25zdCByYW5nZSA9IHNjYWxlQ29tcG9uZW50LmdldCgncmFuZ2UnKTtcblxuICAgIGlmIChoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpICYmIGlzVmdSYW5nZVN0ZXAocmFuZ2UpKSB7XG4gICAgICAvLyBGb3IgZGlzY3JldGUgZG9tYWluIHdpdGggcmFuZ2Uuc3RlcCwgdXNlIGR5bmFtaWMgd2lkdGgvaGVpZ2h0XG4gICAgICByZXR1cm4gJ3JhbmdlLXN0ZXAnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29uZmlnLnZpZXdbc2l6ZVR5cGVdO1xuICAgIH1cbiAgfSBlbHNlIGlmIChtb2RlbC5oYXNQcm9qZWN0aW9uKSB7XG4gICAgcmV0dXJuIGNvbmZpZy52aWV3W3NpemVUeXBlXTtcbiAgfSBlbHNlIHtcbiAgICAvLyBObyBzY2FsZSAtIHNldCBkZWZhdWx0IHNpemVcbiAgICBpZiAoc2l6ZVR5cGUgPT09ICd3aWR0aCcgJiYgbW9kZWwubWFyayA9PT0gJ3RleHQnKSB7XG4gICAgICAvLyB3aWR0aCBmb3IgdGV4dCBtYXJrIHdpdGhvdXQgeC1maWVsZCBpcyBhIGJpdCB3aWRlciB0aGFuIHR5cGljYWwgcmFuZ2Ugc3RlcFxuICAgICAgcmV0dXJuIGNvbmZpZy5zY2FsZS50ZXh0WFJhbmdlU3RlcDtcbiAgICB9XG5cbiAgICAvLyBTZXQgd2lkdGgvaGVpZ2h0IGVxdWFsIHRvIHJhbmdlU3RlcCBjb25maWcgb3IgaWYgcmFuZ2VTdGVwIGlzIG51bGwsIHVzZSB2YWx1ZSBmcm9tIGRlZmF1bHQgc2NhbGUgY29uZmlnLlxuICAgIHJldHVybiBjb25maWcuc2NhbGUucmFuZ2VTdGVwIHx8IGRlZmF1bHRTY2FsZUNvbmZpZy5yYW5nZVN0ZXA7XG4gIH1cblxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport * as log from '../log';\nimport { isVConcatSpec } from '../spec';\nimport { BaseConcatModel } from './baseconcat';\nimport { buildModel } from './buildmodel';\nimport { parseConcatLayoutSize } from './layoutsize/parse';\nvar ConcatModel = /** @class */ (function (_super) {\n tslib_1.__extends(ConcatModel, _super);\n function ConcatModel(spec, parent, parentGivenName, repeater, config) {\n var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this;\n _this.type = 'concat';\n if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) {\n log.warn(log.message.CONCAT_CANNOT_SHARE_AXIS);\n }\n _this.isVConcat = isVConcatSpec(spec);\n _this.children = (isVConcatSpec(spec) ? spec.vconcat : spec.hconcat).map(function (child, i) {\n return buildModel(child, _this, _this.getName('concat_' + i), undefined, repeater, config, false);\n });\n return _this;\n }\n ConcatModel.prototype.parseLayoutSize = function () {\n parseConcatLayoutSize(this);\n };\n ConcatModel.prototype.parseAxisGroup = function () {\n return null;\n };\n ConcatModel.prototype.assembleLayout = function () {\n // TODO: allow customization\n return tslib_1.__assign({ padding: { row: 10, column: 10 }, offset: 10 }, (this.isVConcat ? { columns: 1 } : {}), { bounds: 'full', \n // Use align each so it can work with multiple plots with different size\n align: 'each' });\n };\n return ConcatModel;\n}(BaseConcatModel));\nexport { ConcatModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUMsYUFBYSxFQUF1QixNQUFNLFNBQVMsQ0FBQztBQUU1RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFJekQ7SUFBaUMsdUNBQWU7SUFPOUMscUJBQVksSUFBMEIsRUFBRSxNQUFhLEVBQUUsZUFBdUIsRUFBRSxRQUF1QixFQUFFLE1BQWM7UUFBdkgsWUFDRSxrQkFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FXckU7UUFsQmUsVUFBSSxHQUFhLFFBQVEsQ0FBQztRQVN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsRUFBRTtZQUMvRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNoRDtRQUVELEtBQUksQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLEtBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxLQUFLLEVBQUUsQ0FBQztZQUMvRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSSxFQUFFLEtBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xHLENBQUMsQ0FBQyxDQUFDOztJQUNMLENBQUM7SUFFTSxxQ0FBZSxHQUF0QjtRQUNFLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFHTSxvQ0FBYyxHQUFyQjtRQUNFLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLG9DQUFjLEdBQXJCO1FBQ0UsNEJBQTRCO1FBQzVCLDBCQUNFLE9BQU8sRUFBRSxFQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxFQUM5QixNQUFNLEVBQUUsRUFBRSxJQUNQLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxPQUFPLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUN2QyxNQUFNLEVBQUUsTUFBTTtZQUNkLHdFQUF3RTtZQUN4RSxLQUFLLEVBQUUsTUFBTSxJQUNiO0lBQ0osQ0FBQztJQUNILGtCQUFDO0FBQUQsQ0FBQyxBQXpDRCxDQUFpQyxlQUFlLEdBeUMvQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge2lzVkNvbmNhdFNwZWMsIE5vcm1hbGl6ZWRDb25jYXRTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7VmdMYXlvdXR9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7QmFzZUNvbmNhdE1vZGVsfSBmcm9tICcuL2Jhc2Vjb25jYXQnO1xuaW1wb3J0IHtidWlsZE1vZGVsfSBmcm9tICcuL2J1aWxkbW9kZWwnO1xuaW1wb3J0IHtwYXJzZUNvbmNhdExheW91dFNpemV9IGZyb20gJy4vbGF5b3V0c2l6ZS9wYXJzZSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5cbmV4cG9ydCBjbGFzcyBDb25jYXRNb2RlbCBleHRlbmRzIEJhc2VDb25jYXRNb2RlbCB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiAnY29uY2F0JyA9ICdjb25jYXQnO1xuXG4gIHB1YmxpYyByZWFkb25seSBjaGlsZHJlbjogTW9kZWxbXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgaXNWQ29uY2F0OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHNwZWM6IE5vcm1hbGl6ZWRDb25jYXRTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgc3VwZXIoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIGNvbmZpZywgcmVwZWF0ZXIsIHNwZWMucmVzb2x2ZSk7XG5cbiAgICBpZiAoc3BlYy5yZXNvbHZlICYmIHNwZWMucmVzb2x2ZS5heGlzICYmIChzcGVjLnJlc29sdmUuYXhpcy54ID09PSAnc2hhcmVkJyB8fCBzcGVjLnJlc29sdmUuYXhpcy55ID09PSAnc2hhcmVkJykpIHtcbiAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLkNPTkNBVF9DQU5OT1RfU0hBUkVfQVhJUyk7XG4gICAgfVxuXG4gICAgdGhpcy5pc1ZDb25jYXQgPSBpc1ZDb25jYXRTcGVjKHNwZWMpO1xuXG4gICAgdGhpcy5jaGlsZHJlbiA9IChpc1ZDb25jYXRTcGVjKHNwZWMpID8gc3BlYy52Y29uY2F0IDogc3BlYy5oY29uY2F0KS5tYXAoKGNoaWxkLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYnVpbGRNb2RlbChjaGlsZCwgdGhpcywgdGhpcy5nZXROYW1lKCdjb25jYXRfJyArIGkpLCB1bmRlZmluZWQsIHJlcGVhdGVyLCBjb25maWcsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxheW91dFNpemUoKSB7XG4gICAgcGFyc2VDb25jYXRMYXlvdXRTaXplKHRoaXMpO1xuICB9XG5cblxuICBwdWJsaWMgcGFyc2VBeGlzR3JvdXAoKTogdm9pZCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIC8vIFRPRE86IGFsbG93IGN1c3RvbWl6YXRpb25cbiAgICByZXR1cm4ge1xuICAgICAgcGFkZGluZzoge3JvdzogMTAsIGNvbHVtbjogMTB9LFxuICAgICAgb2Zmc2V0OiAxMCxcbiAgICAgIC4uLih0aGlzLmlzVkNvbmNhdCA/IHtjb2x1bW5zOiAxfSA6IHt9KSxcbiAgICAgIGJvdW5kczogJ2Z1bGwnLFxuICAgICAgLy8gVXNlIGFsaWduIGVhY2ggc28gaXQgY2FuIHdvcmsgd2l0aCBtdWx0aXBsZSBwbG90cyB3aXRoIGRpZmZlcmVudCBzaXplXG4gICAgICBhbGlnbjogJ2VhY2gnXG4gICAgfTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isUrlData } from '../../data';\nimport { vals } from '../../util';\nimport { AggregateNode } from './aggregate';\nimport { BinNode } from './bin';\nimport { CalculateNode } from './calculate';\nimport { OutputNode } from './dataflow';\nimport { FacetNode } from './facet';\nimport { FilterNode } from './filter';\nimport { FilterInvalidNode } from './filterinvalid';\nimport { ParseNode } from './formatparse';\nimport { GeoJSONNode } from './geojson';\nimport { GeoPointNode } from './geopoint';\nimport { IdentifierNode } from './indentifier';\nimport { LookupNode } from './lookup';\nimport { SourceNode } from './source';\nimport { StackNode } from './stack';\nimport { TimeUnitNode } from './timeunit';\nimport { WindowTransformNode } from './window';\n/**\n * Print debug information for dataflow tree.\n */\n// tslint:disable-next-line\nfunction debug(node) {\n console.log(\"\" + node.constructor.name + (node.debugName ? \" (\" + node.debugName + \")\" : '') + \" -> \" + (node.children.map(function (c) {\n return \"\" + c.constructor.name + (c.debugName ? \" (\" + c.debugName + \")\" : '');\n })));\n console.log(node);\n node.children.forEach(debug);\n}\nfunction makeWalkTree(data) {\n // to name datasources\n var datasetIndex = 0;\n /**\n * Recursively walk down the tree.\n */\n function walkTree(node, dataSource) {\n if (node instanceof SourceNode) {\n // If the source is a named data source or a data source with values, we need\n // to put it in a different data source. Otherwise, Vega may override the data.\n if (!isUrlData(node.data)) {\n data.push(dataSource);\n var newData = {\n name: null,\n source: dataSource.name,\n transform: []\n };\n dataSource = newData;\n }\n }\n if (node instanceof ParseNode) {\n if (node.parent instanceof SourceNode && !dataSource.source) {\n // If node's parent is a root source and the data source does not refer to another data source, use normal format parse\n dataSource.format = tslib_1.__assign({}, dataSource.format || {}, { parse: node.assembleFormatParse() });\n // add calculates for all nested fields\n dataSource.transform = dataSource.transform.concat(node.assembleTransforms(true));\n }\n else {\n // Otherwise use Vega expression to parse\n dataSource.transform = dataSource.transform.concat(node.assembleTransforms());\n }\n }\n if (node instanceof FacetNode) {\n if (!dataSource.name) {\n dataSource.name = \"data_\" + datasetIndex++;\n }\n if (!dataSource.source || dataSource.transform.length > 0) {\n data.push(dataSource);\n node.data = dataSource.name;\n }\n else {\n node.data = dataSource.source;\n }\n node.assemble().forEach(function (d) { return data.push(d); });\n // break here because the rest of the tree has to be taken care of by the facet.\n return;\n }\n if (node instanceof FilterNode ||\n node instanceof CalculateNode ||\n node instanceof GeoPointNode ||\n node instanceof GeoJSONNode ||\n node instanceof AggregateNode ||\n node instanceof LookupNode ||\n node instanceof WindowTransformNode ||\n node instanceof IdentifierNode) {\n dataSource.transform.push(node.assemble());\n }\n if (node instanceof FilterInvalidNode ||\n node instanceof BinNode ||\n node instanceof TimeUnitNode ||\n node instanceof StackNode) {\n dataSource.transform = dataSource.transform.concat(node.assemble());\n }\n if (node instanceof AggregateNode) {\n if (!dataSource.name) {\n dataSource.name = \"data_\" + datasetIndex++;\n }\n }\n if (node instanceof OutputNode) {\n if (dataSource.source && dataSource.transform.length === 0) {\n node.setSource(dataSource.source);\n }\n else if (node.parent instanceof OutputNode) {\n // Note that an output node may be required but we still do not assemble a\n // separate data source for it.\n node.setSource(dataSource.name);\n }\n else {\n if (!dataSource.name) {\n dataSource.name = \"data_\" + datasetIndex++;\n }\n // Here we set the name of the datasource we generated. From now on\n // other assemblers can use it.\n node.setSource(dataSource.name);\n // if this node has more than one child, we will add a datasource automatically\n if (node.numChildren() === 1) {\n data.push(dataSource);\n var newData = {\n name: null,\n source: dataSource.name,\n transform: []\n };\n dataSource = newData;\n }\n }\n }\n switch (node.numChildren()) {\n case 0:\n // done\n if (node instanceof OutputNode && (!dataSource.source || dataSource.transform.length > 0)) {\n // do not push empty datasources that are simply references\n data.push(dataSource);\n }\n break;\n case 1:\n walkTree(node.children[0], dataSource);\n break;\n default:\n if (!dataSource.name) {\n dataSource.name = \"data_\" + datasetIndex++;\n }\n var source_1 = dataSource.name;\n if (!dataSource.source || dataSource.transform.length > 0) {\n data.push(dataSource);\n }\n else {\n source_1 = dataSource.source;\n }\n node.children.forEach(function (child) {\n var newData = {\n name: null,\n source: source_1,\n transform: []\n };\n walkTree(child, newData);\n });\n break;\n }\n }\n return walkTree;\n}\n/**\n * Assemble data sources that are derived from faceted data.\n */\nexport function assembleFacetData(root) {\n var data = [];\n var walkTree = makeWalkTree(data);\n root.children.forEach(function (child) { return walkTree(child, {\n source: root.name,\n name: null,\n transform: []\n }); });\n return data;\n}\n/**\n * Create Vega Data array from a given compiled model and append all of them to the given array\n *\n * @param model\n * @param data array\n * @return modified data array\n */\nexport function assembleRootData(dataComponent, datasets) {\n var roots = vals(dataComponent.sources);\n var data = [];\n // roots.forEach(debug);\n var walkTree = makeWalkTree(data);\n var sourceIndex = 0;\n roots.forEach(function (root) {\n // assign a name if the source does not have a name yet\n if (!root.hasName()) {\n root.dataName = \"source_\" + sourceIndex++;\n }\n var newData = root.assemble();\n walkTree(root, newData);\n });\n // remove empty transform arrays for cleaner output\n data.forEach(function (d) {\n if (d.transform.length === 0) {\n delete d.transform;\n }\n });\n // move sources without transforms (the ones that are potentially used in lookups) to the beginning\n var whereTo = 0;\n for (var i = 0; i < data.length; i++) {\n var d = data[i];\n if ((d.transform || []).length === 0 && !d.source) {\n data.splice(whereTo++, 0, data.splice(i, 1)[0]);\n }\n }\n // now fix the from references in lookup transforms\n for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {\n var d = data_1[_i];\n for (var _a = 0, _b = d.transform || []; _a < _b.length; _a++) {\n var t = _b[_a];\n if (t.type === 'lookup') {\n t.from = dataComponent.outputNodes[t.from].getSource();\n }\n }\n }\n // inline values for datasets that are in the datastore\n for (var _c = 0, data_2 = data; _c < data_2.length; _c++) {\n var d = data_2[_c];\n if (d.name in datasets) {\n d.values = datasets[d.name];\n }\n }\n return data;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZW1ibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9kYXRhL2Fzc2VtYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwRCxPQUFPLEVBQU8sSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBR3RDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUM5QixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFN0M7O0dBRUc7QUFDSCwyQkFBMkI7QUFD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SUFBTSxDQUFDLGFBQUE7UUFDVixLQUFnQixVQUFpQixFQUFqQixLQUFBLENBQUMsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFqQixjQUFpQixFQUFqQixJQUFpQixFQUFFO1lBQTlCLElBQU0sQ0FBQyxTQUFBO1lBQ1YsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRTtnQkFDdkIsQ0FBQyxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUN4RDtTQUNGO0tBQ0Y7SUFFRCx1REFBdUQ7SUFDdkQsS0FBZ0IsVUFBSSxFQUFKLGFBQUksRUFBSixrQkFBSSxFQUFKLElBQUksRUFBRTtRQUFqQixJQUFNLENBQUMsYUFBQTtRQUNWLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxRQUFRLEVBQUU7WUFDdEIsQ0FBQyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO0tBQ0Y7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0lubGluZURhdGFzZXQsIGlzVXJsRGF0YX0gZnJvbSAnLi4vLi4vZGF0YSc7XG5pbXBvcnQge0RpY3QsIHZhbHN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0RhdGF9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7RGF0YUNvbXBvbmVudH0gZnJvbSAnLi8nO1xuaW1wb3J0IHtBZ2dyZWdhdGVOb2RlfSBmcm9tICcuL2FnZ3JlZ2F0ZSc7XG5pbXBvcnQge0Jpbk5vZGV9IGZyb20gJy4vYmluJztcbmltcG9ydCB7Q2FsY3VsYXRlTm9kZX0gZnJvbSAnLi9jYWxjdWxhdGUnO1xuaW1wb3J0IHtEYXRhRmxvd05vZGUsIE91dHB1dE5vZGV9IGZyb20gJy4vZGF0YWZsb3cnO1xuaW1wb3J0IHtGYWNldE5vZGV9IGZyb20gJy4vZmFjZXQnO1xuaW1wb3J0IHtGaWx0ZXJOb2RlfSBmcm9tICcuL2ZpbHRlcic7XG5pbXBvcnQge0ZpbHRlckludmFsaWROb2RlfSBmcm9tICcuL2ZpbHRlcmludmFsaWQnO1xuaW1wb3J0IHtQYXJzZU5vZGV9IGZyb20gJy4vZm9ybWF0cGFyc2UnO1xuaW1wb3J0IHtHZW9KU09OTm9kZX0gZnJvbSAnLi9nZW9qc29uJztcbmltcG9ydCB7R2VvUG9pbnROb2RlfSBmcm9tICcuL2dlb3BvaW50JztcbmltcG9ydCB7SWRlbnRpZmllck5vZGV9IGZyb20gJy4vaW5kZW50aWZpZXInO1xuaW1wb3J0IHtMb29rdXBOb2RlfSBmcm9tICcuL2xvb2t1cCc7XG5pbXBvcnQge1NvdXJjZU5vZGV9IGZyb20gJy4vc291cmNlJztcbmltcG9ydCB7U3RhY2tOb2RlfSBmcm9tICcuL3N0YWNrJztcbmltcG9ydCB7VGltZVVuaXROb2RlfSBmcm9tICcuL3RpbWV1bml0JztcbmltcG9ydCB7V2luZG93VHJhbnNmb3JtTm9kZX0gZnJvbSAnLi93aW5kb3cnO1xuXG4vKipcbiAqIFByaW50IGRlYnVnIGluZm9ybWF0aW9uIGZvciBkYXRhZmxvdyB0cmVlLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmZ1bmN0aW9uIGRlYnVnKG5vZGU6IERhdGFGbG93Tm9kZSkge1xuICBjb25zb2xlLmxvZyhgJHsobm9kZS5jb25zdHJ1Y3RvciBhcyBhbnkpLm5hbWV9JHtub2RlLmRlYnVnTmFtZSA/IGAgKCR7bm9kZS5kZWJ1Z05hbWV9KWAgOiAnJ30gLT4gJHtcbiAgICAobm9kZS5jaGlsZHJlbi5tYXAoYyA9PiB7XG4gICAgICByZXR1cm4gYCR7KGMuY29uc3RydWN0b3IgYXMgYW55KS5uYW1lfSR7Yy5kZWJ1Z05hbWUgPyBgICgke2MuZGVidWdOYW1lfSlgIDogJyd9YDtcbiAgICB9KSlcbiAgfWApO1xuICBjb25zb2xlLmxvZyhub2RlKTtcbiAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGRlYnVnKTtcbn1cblxuZnVuY3Rpb24gbWFrZVdhbGtUcmVlKGRhdGE6IFZnRGF0YVtdKSB7XG4gIC8vIHRvIG5hbWUgZGF0YXNvdXJjZXNcbiAgbGV0IGRhdGFzZXRJbmRleCA9IDA7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHdhbGsgZG93biB0aGUgdHJlZS5cbiAgICovXG4gIGZ1bmN0aW9uIHdhbGtUcmVlKG5vZGU6IERhdGFGbG93Tm9kZSwgZGF0YVNvdXJjZTogVmdEYXRhKSB7XG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTb3VyY2VOb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgc291cmNlIGlzIGEgbmFtZWQgZGF0YSBzb3VyY2Ugb3IgYSBkYXRhIHNvdXJjZSB3aXRoIHZhbHVlcywgd2UgbmVlZFxuICAgICAgLy8gdG8gcHV0IGl0IGluIGEgZGlmZmVyZW50IGRhdGEgc291cmNlLiBPdGhlcndpc2UsIFZlZ2EgbWF5IG92ZXJyaWRlIHRoZSBkYXRhLlxuICAgICAgaWYgKCFpc1VybERhdGEobm9kZS5kYXRhKSkge1xuICAgICAgICBkYXRhLnB1c2goZGF0YVNvdXJjZSk7XG4gICAgICAgIGNvbnN0IG5ld0RhdGE6IFZnRGF0YSA9IHtcbiAgICAgICAgICBuYW1lOiBudWxsLFxuICAgICAgICAgIHNvdXJjZTogZGF0YVNvdXJjZS5uYW1lLFxuICAgICAgICAgIHRyYW5zZm9ybTogW11cbiAgICAgICAgfTtcbiAgICAgICAgZGF0YVNvdXJjZSA9IG5ld0RhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJzZU5vZGUpIHtcbiAgICAgIGlmIChub2RlLnBhcmVudCBpbnN0YW5jZW9mIFNvdXJjZU5vZGUgJiYgIWRhdGFTb3VyY2Uuc291cmNlKSB7XG4gICAgICAgIC8vIElmIG5vZGUncyBwYXJlbnQgaXMgYSByb290IHNvdXJjZSBhbmQgdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IHJlZmVyIHRvIGFub3RoZXIgZGF0YSBzb3VyY2UsIHVzZSBub3JtYWwgZm9ybWF0IHBhcnNlXG4gICAgICAgIGRhdGFTb3VyY2UuZm9ybWF0ID0ge1xuICAgICAgICAgIC4uLmRhdGFTb3VyY2UuZm9ybWF0IHx8IHt9LFxuICAgICAgICAgIHBhcnNlOiBub2RlLmFzc2VtYmxlRm9ybWF0UGFyc2UoKVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIGFkZCBjYWxjdWxhdGVzIGZvciBhbGwgbmVzdGVkIGZpZWxkc1xuICAgICAgICBkYXRhU291cmNlLnRyYW5zZm9ybSA9IGRhdGFTb3VyY2UudHJhbnNmb3JtLmNvbmNhdChub2RlLmFzc2VtYmxlVHJhbnNmb3Jtcyh0cnVlKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgdXNlIFZlZ2EgZXhwcmVzc2lvbiB0byBwYXJzZVxuICAgICAgICBkYXRhU291cmNlLnRyYW5zZm9ybSA9IGRhdGFTb3VyY2UudHJhbnNmb3JtLmNvbmNhdChub2RlLmFzc2VtYmxlVHJhbnNmb3JtcygpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIEZhY2V0Tm9kZSkge1xuICAgICAgaWYgKCFkYXRhU291cmNlLm5hbWUpIHtcbiAgICAgICAgZGF0YVNvdXJjZS5uYW1lID0gYGRhdGFfJHtkYXRhc2V0SW5kZXgrK31gO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWRhdGFTb3VyY2Uuc291cmNlIHx8IGRhdGFTb3VyY2UudHJhbnNmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICBub2RlLmRhdGEgPSBkYXRhU291cmNlLm5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLmRhdGEgPSBkYXRhU291cmNlLnNvdXJjZTtcbiAgICAgIH1cblxuICAgICAgbm9kZS5hc3NlbWJsZSgpLmZvckVhY2goZCA9PiBkYXRhLnB1c2goZCkpO1xuXG4gICAgICAvLyBicmVhayBoZXJlIGJlY2F1c2UgdGhlIHJlc3Qgb2YgdGhlIHRyZWUgaGFzIHRvIGJlIHRha2VuIGNhcmUgb2YgYnkgdGhlIGZhY2V0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgRmlsdGVyTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIENhbGN1bGF0ZU5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBHZW9Qb2ludE5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBHZW9KU09OTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZU5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBMb29rdXBOb2RlIHx8XG4gICAgICBub2RlIGluc3RhbmNlb2YgV2luZG93VHJhbnNmb3JtTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIElkZW50aWZpZXJOb2RlKSB7XG4gICAgICBkYXRhU291cmNlLnRyYW5zZm9ybS5wdXNoKG5vZGUuYXNzZW1ibGUoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBGaWx0ZXJJbnZhbGlkTm9kZSB8fFxuICAgICAgbm9kZSBpbnN0YW5jZW9mIEJpbk5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBUaW1lVW5pdE5vZGUgfHxcbiAgICAgIG5vZGUgaW5zdGFuY2VvZiBTdGFja05vZGUpIHtcbiAgICAgIGRhdGFTb3VyY2UudHJhbnNmb3JtID0gZGF0YVNvdXJjZS50cmFuc2Zvcm0uY29uY2F0KG5vZGUuYXNzZW1ibGUoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBBZ2dyZWdhdGVOb2RlKSB7XG4gICAgICBpZiAoIWRhdGFTb3VyY2UubmFtZSkge1xuICAgICAgICBkYXRhU291cmNlLm5hbWUgPSBgZGF0YV8ke2RhdGFzZXRJbmRleCsrfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPdXRwdXROb2RlKSB7XG4gICAgICBpZiAoZGF0YVNvdXJjZS5zb3VyY2UgJiYgZGF0YVNvdXJjZS50cmFuc2Zvcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIG5vZGUuc2V0U291cmNlKGRhdGFTb3VyY2Uuc291cmNlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQgaW5zdGFuY2VvZiBPdXRwdXROb2RlKSB7XG4gICAgICAgIC8vIE5vdGUgdGhhdCBhbiBvdXRwdXQgbm9kZSBtYXkgYmUgcmVxdWlyZWQgYnV0IHdlIHN0aWxsIGRvIG5vdCBhc3NlbWJsZSBhXG4gICAgICAgIC8vIHNlcGFyYXRlIGRhdGEgc291cmNlIGZvciBpdC5cbiAgICAgICAgbm9kZS5zZXRTb3VyY2UoZGF0YVNvdXJjZS5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghZGF0YVNvdXJjZS5uYW1lKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZS5uYW1lID0gYGRhdGFfJHtkYXRhc2V0SW5kZXgrK31gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGVyZSB3ZSBzZXQgdGhlIG5hbWUgb2YgdGhlIGRhdGFzb3VyY2Ugd2UgZ2VuZXJhdGVkLiBGcm9tIG5vdyBvblxuICAgICAgICAvLyBvdGhlciBhc3NlbWJsZXJzIGNhbiB1c2UgaXQuXG4gICAgICAgIG5vZGUuc2V0U291cmNlKGRhdGFTb3VyY2UubmFtZSk7XG5cbiAgICAgICAgLy8gaWYgdGhpcyBub2RlIGhhcyBtb3JlIHRoYW4gb25lIGNoaWxkLCB3ZSB3aWxsIGFkZCBhIGRhdGFzb3VyY2UgYXV0b21hdGljYWxseVxuICAgICAgICBpZiAobm9kZS5udW1DaGlsZHJlbigpID09PSAxKSB7XG4gICAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICAgIGNvbnN0IG5ld0RhdGE6IFZnRGF0YSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGFTb3VyY2UubmFtZSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogW11cbiAgICAgICAgICB9O1xuICAgICAgICAgIGRhdGFTb3VyY2UgPSBuZXdEYXRhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoIChub2RlLm51bUNoaWxkcmVuKCkpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gZG9uZVxuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIE91dHB1dE5vZGUgJiYgKCFkYXRhU291cmNlLnNvdXJjZSB8fCBkYXRhU291cmNlLnRyYW5zZm9ybS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgIC8vIGRvIG5vdCBwdXNoIGVtcHR5IGRhdGFzb3VyY2VzIHRoYXQgYXJlIHNpbXBseSByZWZlcmVuY2VzXG4gICAgICAgICAgZGF0YS5wdXNoKGRhdGFTb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOlxuICAgICAgICB3YWxrVHJlZShub2RlLmNoaWxkcmVuWzBdLCBkYXRhU291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoIWRhdGFTb3VyY2UubmFtZSkge1xuICAgICAgICAgIGRhdGFTb3VyY2UubmFtZSA9IGBkYXRhXyR7ZGF0YXNldEluZGV4Kyt9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzb3VyY2UgPSBkYXRhU291cmNlLm5hbWU7XG4gICAgICAgIGlmICghZGF0YVNvdXJjZS5zb3VyY2UgfHwgZGF0YVNvdXJjZS50cmFuc2Zvcm0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGRhdGEucHVzaChkYXRhU291cmNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2UgPSBkYXRhU291cmNlLnNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3RGF0YTogVmdEYXRhID0ge1xuICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgdHJhbnNmb3JtOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgd2Fsa1RyZWUoY2hpbGQsIG5ld0RhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdhbGtUcmVlO1xufVxuXG4vKipcbiAqIEFzc2VtYmxlIGRhdGEgc291cmNlcyB0aGF0IGFyZSBkZXJpdmVkIGZyb20gZmFjZXRlZCBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZW1ibGVGYWNldERhdGEocm9vdDogRmFjZXROb2RlKTogVmdEYXRhW10ge1xuICBjb25zdCBkYXRhOiBWZ0RhdGFbXSA9IFtdO1xuICBjb25zdCB3YWxrVHJlZSA9IG1ha2VXYWxrVHJlZShkYXRhKTtcblxuICByb290LmNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gd2Fsa1RyZWUoY2hpbGQsIHtcbiAgICBzb3VyY2U6IHJvb3QubmFtZSxcbiAgICBuYW1lOiBudWxsLFxuICAgIHRyYW5zZm9ybTogW11cbiAgfSkpO1xuXG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIENyZWF0ZSBWZWdhIERhdGEgYXJyYXkgZnJvbSBhIGdpdmVuIGNvbXBpbGVkIG1vZGVsIGFuZCBhcHBlbmQgYWxsIG9mIHRoZW0gdG8gdGhlIGdpdmVuIGFycmF5XG4gKlxuICogQHBhcmFtICBtb2RlbFxuICogQHBhcmFtICBkYXRhIGFycmF5XG4gKiBAcmV0dXJuIG1vZGlmaWVkIGRhdGEgYXJyYXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VtYmxlUm9vdERhdGEoZGF0YUNvbXBvbmVudDogRGF0YUNvbXBvbmVudCwgZGF0YXNldHM6IERpY3Q8SW5saW5lRGF0YXNldD4pOiBWZ0RhdGFbXSB7XG4gIGNvbnN0IHJvb3RzOiBTb3VyY2VOb2RlW10gPSB2YWxzKGRhdGFDb21wb25lbnQuc291cmNlcyk7XG4gIGNvbnN0IGRhdGE6IFZnRGF0YVtdID0gW107XG5cbiAgLy8gcm9vdHMuZm9yRWFjaChkZWJ1Zyk7XG5cbiAgY29uc3Qgd2Fsa1RyZWUgPSBtYWtlV2Fsa1RyZWUoZGF0YSk7XG5cbiAgbGV0IHNvdXJjZUluZGV4ID0gMDtcblxuICByb290cy5mb3JFYWNoKHJvb3QgPT4ge1xuICAgIC8vIGFzc2lnbiBhIG5hbWUgaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBoYXZlIGEgbmFtZSB5ZXRcbiAgICBpZiAoIXJvb3QuaGFzTmFtZSgpKSB7XG4gICAgICByb290LmRhdGFOYW1lID0gYHNvdXJjZV8ke3NvdXJjZUluZGV4Kyt9YDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdEYXRhOiBWZ0RhdGEgPSByb290LmFzc2VtYmxlKCk7XG5cbiAgICB3YWxrVHJlZShyb290LCBuZXdEYXRhKTtcbiAgfSk7XG5cbiAgLy8gcmVtb3ZlIGVtcHR5IHRyYW5zZm9ybSBhcnJheXMgZm9yIGNsZWFuZXIgb3V0cHV0XG4gIGRhdGEuZm9yRWFjaChkID0+IHtcbiAgICBpZiAoZC50cmFuc2Zvcm0ubGVuZ3RoID09PSAwKSB7XG4gICAgICBkZWxldGUgZC50cmFuc2Zvcm07XG4gICAgfVxuICB9KTtcblxuICAvLyBtb3ZlIHNvdXJjZXMgd2l0aG91dCB0cmFuc2Zvcm1zICh0aGUgb25lcyB0aGF0IGFyZSBwb3RlbnRpYWxseSB1c2VkIGluIGxvb2t1cHMpIHRvIHRoZSBiZWdpbm5pbmdcbiAgbGV0IHdoZXJlVG8gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkID0gZGF0YVtpXTtcbiAgICBpZiAoKGQudHJhbnNmb3JtIHx8IFtdKS5sZW5ndGggPT09IDAgJiYgIWQuc291cmNlKSB7XG4gICAgICBkYXRhLnNwbGljZSh3aGVyZVRvKyssIDAsIGRhdGEuc3BsaWNlKGksIDEpWzBdKTtcbiAgICB9XG4gIH1cblxuICAvLyBub3cgZml4IHRoZSBmcm9tIHJlZmVyZW5jZXMgaW4gbG9va3VwIHRyYW5zZm9ybXNcbiAgZm9yIChjb25zdCBkIG9mIGRhdGEpIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgZC50cmFuc2Zvcm0gfHwgW10pIHtcbiAgICAgIGlmICh0LnR5cGUgPT09ICdsb29rdXAnKSB7XG4gICAgICAgIHQuZnJvbSA9IGRhdGFDb21wb25lbnQub3V0cHV0Tm9kZXNbdC5mcm9tXS5nZXRTb3VyY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBpbmxpbmUgdmFsdWVzIGZvciBkYXRhc2V0cyB0aGF0IGFyZSBpbiB0aGUgZGF0YXN0b3JlXG4gIGZvciAoY29uc3QgZCBvZiBkYXRhKSB7XG4gICAgaWYgKGQubmFtZSBpbiBkYXRhc2V0cykge1xuICAgICAgZC52YWx1ZXMgPSBkYXRhc2V0c1tkLm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { hasConditionalFieldDef, isConditionalDef, isFieldDef, isRepeatRef } from '../fielddef';\nimport * as log from '../log';\nimport { isSortField } from '../sort';\nexport function replaceRepeaterInFacet(facet, repeater) {\n return replaceRepeater(facet, repeater);\n}\nexport function replaceRepeaterInEncoding(encoding, repeater) {\n return replaceRepeater(encoding, repeater);\n}\n/**\n * Replaces repeated value and returns if the repeated value is valid.\n */\nfunction replaceRepeat(o, repeater) {\n if (isRepeatRef(o.field)) {\n if (o.field.repeat in repeater) {\n // any needed to calm down ts compiler\n return tslib_1.__assign({}, o, { field: repeater[o.field.repeat] });\n }\n else {\n log.warn(log.message.noSuchRepeatedValue(o.field.repeat));\n return undefined;\n }\n }\n return o;\n}\n/**\n * Replace repeater values in a field def with the concrete field name.\n */\nfunction replaceRepeaterInFieldDef(fieldDef, repeater) {\n fieldDef = replaceRepeat(fieldDef, repeater);\n if (fieldDef === undefined) {\n // the field def should be ignored\n return undefined;\n }\n if (fieldDef.sort && isSortField(fieldDef.sort)) {\n var sort = replaceRepeat(fieldDef.sort, repeater);\n fieldDef = tslib_1.__assign({}, fieldDef, (sort ? { sort: sort } : {}));\n }\n return fieldDef;\n}\nfunction replaceRepeaterInChannelDef(channelDef, repeater) {\n if (isFieldDef(channelDef)) {\n var fd = replaceRepeaterInFieldDef(channelDef, repeater);\n if (fd) {\n return fd;\n }\n else if (isConditionalDef(channelDef)) {\n return { condition: channelDef.condition };\n }\n }\n else {\n if (hasConditionalFieldDef(channelDef)) {\n var fd = replaceRepeaterInFieldDef(channelDef.condition, repeater);\n if (fd) {\n return tslib_1.__assign({}, channelDef, { condition: fd });\n }\n else {\n var condition = channelDef.condition, channelDefWithoutCondition = tslib_1.__rest(channelDef, [\"condition\"]);\n return channelDefWithoutCondition;\n }\n }\n return channelDef;\n }\n return undefined;\n}\nfunction replaceRepeater(mapping, repeater) {\n var out = {};\n for (var channel in mapping) {\n if (mapping.hasOwnProperty(channel)) {\n var channelDef = mapping[channel];\n if (isArray(channelDef)) {\n // array cannot have condition\n out[channel] = channelDef.map(function (cd) { return replaceRepeaterInChannelDef(cd, repeater); })\n .filter(function (cd) { return cd; });\n }\n else {\n var cd = replaceRepeaterInChannelDef(channelDef, repeater);\n if (cd) {\n out[channel] = cd;\n }\n }\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9yZXBlYXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdsQyxPQUFPLEVBQVEsc0JBQXNCLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBVyxNQUFNLGFBQWEsQ0FBQztBQUUvRyxPQUFPLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQztBQUM5QixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBT3BDLE1BQU0saUNBQWlDLEtBQTBCLEVBQUUsUUFBdUI7SUFDeEYsT0FBTyxlQUFlLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBeUIsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBTSxvQ0FBb0MsUUFBeUIsRUFBRSxRQUF1QjtJQUMxRixPQUFPLGVBQWUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFxQixDQUFDO0FBQ2pFLENBQUM7QUFFRDs7R0FFRztBQUNILHVCQUFrRCxDQUFJLEVBQUUsUUFBdUI7SUFDN0UsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksUUFBUSxFQUFFO1lBQzlCLHNDQUFzQztZQUN0Qyw0QkFBVyxDQUFRLElBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFFO1NBQ3ZEO2FBQU07WUFDTCxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0tBQ0Y7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7R0FFRztBQUNILG1DQUFtQyxRQUE4QixFQUFFLFFBQXVCO0lBQ3hGLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUMxQixrQ0FBa0M7UUFDbEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUMvQyxJQUFNLElBQUksR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNwRCxRQUFRLHdCQUNILFFBQVEsRUFDUixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxJQUFJLE1BQUEsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FDeEIsQ0FBQztLQUNIO0lBRUQsT0FBTyxRQUFpQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxxQ0FBcUMsVUFBNkIsRUFBRSxRQUF1QjtJQUN6RixJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUMxQixJQUFNLEVBQUUsR0FBRyx5QkFBeUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLEVBQUU7WUFDTixPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU0sSUFBSSxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTLEVBQUMsQ0FBQztTQUMxQztLQUNGO1NBQU07UUFDTCxJQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3RDLElBQU0sRUFBRSxHQUFHLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckUsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sT0FBTyxxQkFDRixVQUFVLElBQ2IsU0FBUyxFQUFFLEVBQUUsR0FDUSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNFLElBQUEsZ0NBQVMsRUFBRSxzRUFBNkIsQ0FBZTtnQkFDOUQsT0FBTywwQkFBZ0QsQ0FBQzthQUN6RDtTQUNGO1FBQ0QsT0FBTyxVQUFzQixDQUFDO0tBQy9CO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUlELHlCQUF5QixPQUErQixFQUFFLFFBQXVCO0lBQy9FLElBQU0sR0FBRyxHQUE0QixFQUFFLENBQUM7SUFDeEMsS0FBSyxJQUFNLE9BQU8sSUFBSSxPQUFPLEVBQUU7UUFDN0IsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ25DLElBQU0sVUFBVSxHQUE0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFN0UsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3ZCLDhCQUE4QjtnQkFDOUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBQSxFQUFFLElBQUksT0FBQSwyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQXpDLENBQXlDLENBQUM7cUJBQzNFLE1BQU0sQ0FBQyxVQUFBLEVBQUUsSUFBSSxPQUFBLEVBQUUsRUFBRixDQUFFLENBQUMsQ0FBQzthQUNyQjtpQkFBTTtnQkFDTCxJQUFNLEVBQUUsR0FBRywyQkFBMkIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQzdELElBQUksRUFBRSxFQUFFO29CQUNOLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ25CO2FBQ0Y7U0FDRjtLQUNGO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtGYWNldE1hcHBpbmd9IGZyb20gJy4uL2ZhY2V0JztcbmltcG9ydCB7RmllbGQsIGhhc0NvbmRpdGlvbmFsRmllbGREZWYsIGlzQ29uZGl0aW9uYWxEZWYsIGlzRmllbGREZWYsIGlzUmVwZWF0UmVmLCBWYWx1ZURlZn0gZnJvbSAnLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtDaGFubmVsRGVmLCBTY2FsZUZpZWxkRGVmfSBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7aXNTb3J0RmllbGR9IGZyb20gJy4uL3NvcnQnO1xuXG5leHBvcnQgdHlwZSBSZXBlYXRlclZhbHVlID0ge1xuICByb3c/OiBzdHJpbmcsXG4gIGNvbHVtbj86IHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VSZXBlYXRlckluRmFjZXQoZmFjZXQ6IEZhY2V0TWFwcGluZzxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRmFjZXRNYXBwaW5nPHN0cmluZz4ge1xuICByZXR1cm4gcmVwbGFjZVJlcGVhdGVyKGZhY2V0LCByZXBlYXRlcikgYXMgRmFjZXRNYXBwaW5nPHN0cmluZz47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKGVuY29kaW5nOiBFbmNvZGluZzxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRW5jb2Rpbmc8c3RyaW5nPiB7XG4gIHJldHVybiByZXBsYWNlUmVwZWF0ZXIoZW5jb2RpbmcsIHJlcGVhdGVyKSBhcyBFbmNvZGluZzxzdHJpbmc+O1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHJlcGVhdGVkIHZhbHVlIGFuZCByZXR1cm5zIGlmIHRoZSByZXBlYXRlZCB2YWx1ZSBpcyB2YWxpZC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdDxUIGV4dGVuZHMge2ZpZWxkPzogRmllbGR9PihvOiBULCByZXBlYXRlcjogUmVwZWF0ZXJWYWx1ZSk6IFQge1xuICBpZiAoaXNSZXBlYXRSZWYoby5maWVsZCkpIHtcbiAgICBpZiAoby5maWVsZC5yZXBlYXQgaW4gcmVwZWF0ZXIpIHtcbiAgICAgIC8vIGFueSBuZWVkZWQgdG8gY2FsbSBkb3duIHRzIGNvbXBpbGVyXG4gICAgICByZXR1cm4gey4uLm8gYXMgYW55LCBmaWVsZDogcmVwZWF0ZXJbby5maWVsZC5yZXBlYXRdfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uubm9TdWNoUmVwZWF0ZWRWYWx1ZShvLmZpZWxkLnJlcGVhdCkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG87XG59XG5cbi8qKlxuICogUmVwbGFjZSByZXBlYXRlciB2YWx1ZXMgaW4gYSBmaWVsZCBkZWYgd2l0aCB0aGUgY29uY3JldGUgZmllbGQgbmFtZS5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdGVySW5GaWVsZERlZihmaWVsZERlZjogU2NhbGVGaWVsZERlZjxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogU2NhbGVGaWVsZERlZjxzdHJpbmc+IHtcbiAgZmllbGREZWYgPSByZXBsYWNlUmVwZWF0KGZpZWxkRGVmLCByZXBlYXRlcik7XG5cbiAgaWYgKGZpZWxkRGVmID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyB0aGUgZmllbGQgZGVmIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChmaWVsZERlZi5zb3J0ICYmIGlzU29ydEZpZWxkKGZpZWxkRGVmLnNvcnQpKSB7XG4gICAgY29uc3Qgc29ydCA9IHJlcGxhY2VSZXBlYXQoZmllbGREZWYuc29ydCwgcmVwZWF0ZXIpO1xuICAgIGZpZWxkRGVmID0ge1xuICAgICAgLi4uZmllbGREZWYsXG4gICAgICAuLi4oc29ydCA/IHtzb3J0fSA6IHt9KVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gZmllbGREZWYgYXMgU2NhbGVGaWVsZERlZjxzdHJpbmc+O1xufVxuXG5mdW5jdGlvbiByZXBsYWNlUmVwZWF0ZXJJbkNoYW5uZWxEZWYoY2hhbm5lbERlZjogQ2hhbm5lbERlZjxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogQ2hhbm5lbERlZjxzdHJpbmc+IHtcbiAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICBjb25zdCBmZCA9IHJlcGxhY2VSZXBlYXRlckluRmllbGREZWYoY2hhbm5lbERlZiwgcmVwZWF0ZXIpO1xuICAgIGlmIChmZCkge1xuICAgICAgcmV0dXJuIGZkO1xuICAgIH0gZWxzZSBpZiAoaXNDb25kaXRpb25hbERlZihjaGFubmVsRGVmKSkge1xuICAgICAgcmV0dXJuIHtjb25kaXRpb246IGNoYW5uZWxEZWYuY29uZGl0aW9ufTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGhhc0NvbmRpdGlvbmFsRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgIGNvbnN0IGZkID0gcmVwbGFjZVJlcGVhdGVySW5GaWVsZERlZihjaGFubmVsRGVmLmNvbmRpdGlvbiwgcmVwZWF0ZXIpO1xuICAgICAgaWYgKGZkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY2hhbm5lbERlZixcbiAgICAgICAgICBjb25kaXRpb246IGZkXG4gICAgICAgIH0gYXMgQ2hhbm5lbERlZjxzdHJpbmc+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qge2NvbmRpdGlvbiwgLi4uY2hhbm5lbERlZldpdGhvdXRDb25kaXRpb259ID0gY2hhbm5lbERlZjtcbiAgICAgICAgcmV0dXJuIGNoYW5uZWxEZWZXaXRob3V0Q29uZGl0aW9uIGFzIENoYW5uZWxEZWY8c3RyaW5nPjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoYW5uZWxEZWYgYXMgVmFsdWVEZWY7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxudHlwZSBFbmNvZGluZ09yRmFjZXQ8Rj4gPSBFbmNvZGluZzxGPiB8IEZhY2V0TWFwcGluZzxGPjtcblxuZnVuY3Rpb24gcmVwbGFjZVJlcGVhdGVyKG1hcHBpbmc6IEVuY29kaW5nT3JGYWNldDxGaWVsZD4sIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlKTogRW5jb2RpbmdPckZhY2V0PHN0cmluZz4ge1xuICBjb25zdCBvdXQ6IEVuY29kaW5nT3JGYWNldDxzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgY2hhbm5lbCBpbiBtYXBwaW5nKSB7XG4gICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkoY2hhbm5lbCkpIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxEZWY6IENoYW5uZWxEZWY8RmllbGQ+IHwgQ2hhbm5lbERlZjxGaWVsZD5bXSA9IG1hcHBpbmdbY2hhbm5lbF07XG5cbiAgICAgIGlmIChpc0FycmF5KGNoYW5uZWxEZWYpKSB7XG4gICAgICAgIC8vIGFycmF5IGNhbm5vdCBoYXZlIGNvbmRpdGlvblxuICAgICAgICBvdXRbY2hhbm5lbF0gPSBjaGFubmVsRGVmLm1hcChjZCA9PiByZXBsYWNlUmVwZWF0ZXJJbkNoYW5uZWxEZWYoY2QsIHJlcGVhdGVyKSlcbiAgICAgICAgICAuZmlsdGVyKGNkID0+IGNkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNkID0gcmVwbGFjZVJlcGVhdGVySW5DaGFubmVsRGVmKGNoYW5uZWxEZWYsIHJlcGVhdGVyKTtcbiAgICAgICAgaWYgKGNkKSB7XG4gICAgICAgICAgb3V0W2NoYW5uZWxdID0gY2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { COLUMN, ROW } from '../channel';\nimport { reduce } from '../encoding';\nimport { normalize, title as fieldDefTitle, vgField } from '../fielddef';\nimport * as log from '../log';\nimport { hasDiscreteDomain } from '../scale';\nimport { contains } from '../util';\nimport { isVgRangeStep } from '../vega.schema';\nimport { assembleAxis } from './axis/assemble';\nimport { buildModel } from './buildmodel';\nimport { assembleFacetData } from './data/assemble';\nimport { parseData } from './data/parse';\nimport { getHeaderType } from './layout/header';\nimport { parseChildrenLayoutSize } from './layoutsize/parse';\nimport { ModelWithField } from './model';\nimport { replaceRepeaterInFacet } from './repeater';\nimport { parseGuideResolve } from './resolve';\nimport { assembleDomain, getFieldFromDomain } from './scale/domain';\nvar FacetModel = /** @class */ (function (_super) {\n tslib_1.__extends(FacetModel, _super);\n function FacetModel(spec, parent, parentGivenName, repeater, config) {\n var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this;\n _this.type = 'facet';\n _this.child = buildModel(spec.spec, _this, _this.getName('child'), undefined, repeater, config, false);\n _this.children = [_this.child];\n var facet = replaceRepeaterInFacet(spec.facet, repeater);\n _this.facet = _this.initFacet(facet);\n return _this;\n }\n FacetModel.prototype.initFacet = function (facet) {\n // clone to prevent side effect to the original spec\n return reduce(facet, function (normalizedFacet, fieldDef, channel) {\n if (!contains([ROW, COLUMN], channel)) {\n // Drop unsupported channel\n log.warn(log.message.incompatibleChannel(channel, 'facet'));\n return normalizedFacet;\n }\n if (fieldDef.field === undefined) {\n log.warn(log.message.emptyFieldDef(fieldDef, channel));\n return normalizedFacet;\n }\n // Convert type to full, lowercase type, or augment the fieldDef with a default type if missing.\n normalizedFacet[channel] = normalize(fieldDef, channel);\n return normalizedFacet;\n }, {});\n };\n FacetModel.prototype.channelHasField = function (channel) {\n return !!this.facet[channel];\n };\n FacetModel.prototype.fieldDef = function (channel) {\n return this.facet[channel];\n };\n FacetModel.prototype.parseData = function () {\n this.component.data = parseData(this);\n this.child.parseData();\n };\n FacetModel.prototype.parseLayoutSize = function () {\n parseChildrenLayoutSize(this);\n };\n FacetModel.prototype.parseSelection = function () {\n // As a facet has a single child, the selection components are the same.\n // The child maintains its selections to assemble signals, which remain\n // within its unit.\n this.child.parseSelection();\n this.component.selection = this.child.component.selection;\n };\n FacetModel.prototype.parseMarkGroup = function () {\n this.child.parseMarkGroup();\n };\n FacetModel.prototype.parseAxisAndHeader = function () {\n this.child.parseAxisAndHeader();\n this.parseHeader('column');\n this.parseHeader('row');\n this.mergeChildAxis('x');\n this.mergeChildAxis('y');\n };\n FacetModel.prototype.parseHeader = function (channel) {\n if (this.channelHasField(channel)) {\n var fieldDef = this.facet[channel];\n var header = fieldDef.header || {};\n var title = fieldDef.title !== undefined ? fieldDef.title :\n header.title !== undefined ? header.title : fieldDefTitle(fieldDef, this.config);\n if (this.child.component.layoutHeaders[channel].title) {\n // merge title with child to produce \"Title / Subtitle / Sub-subtitle\"\n title += ' / ' + this.child.component.layoutHeaders[channel].title;\n this.child.component.layoutHeaders[channel].title = null;\n }\n this.component.layoutHeaders[channel] = {\n title: title,\n facetFieldDef: fieldDef,\n // TODO: support adding label to footer as well\n header: [this.makeHeaderComponent(channel, true)]\n };\n }\n };\n FacetModel.prototype.makeHeaderComponent = function (channel, labels) {\n var sizeType = channel === 'row' ? 'height' : 'width';\n return {\n labels: labels,\n sizeSignal: this.child.component.layoutSize.get(sizeType) ? this.child.getSizeSignalRef(sizeType) : undefined,\n axes: []\n };\n };\n FacetModel.prototype.mergeChildAxis = function (channel) {\n var child = this.child;\n if (child.component.axes[channel]) {\n var _a = this.component, layoutHeaders = _a.layoutHeaders, resolve = _a.resolve;\n resolve.axis[channel] = parseGuideResolve(resolve, channel);\n if (resolve.axis[channel] === 'shared') {\n // For shared axis, move the axes to facet's header or footer\n var headerChannel = channel === 'x' ? 'column' : 'row';\n var layoutHeader = layoutHeaders[headerChannel];\n for (var _i = 0, _b = child.component.axes[channel]; _i < _b.length; _i++) {\n var axisComponent = _b[_i];\n var headerType = getHeaderType(axisComponent.get('orient'));\n layoutHeader[headerType] = layoutHeader[headerType] ||\n [this.makeHeaderComponent(headerChannel, false)];\n var mainAxis = assembleAxis(axisComponent, 'main', this.config, { header: true });\n // LayoutHeader no longer keep track of property precedence, thus let's combine.\n layoutHeader[headerType][0].axes.push(mainAxis);\n axisComponent.mainExtracted = true;\n }\n }\n else {\n // Otherwise do nothing for independent axes\n }\n }\n };\n FacetModel.prototype.assembleSelectionTopLevelSignals = function (signals) {\n return this.child.assembleSelectionTopLevelSignals(signals);\n };\n FacetModel.prototype.assembleSelectionSignals = function () {\n this.child.assembleSelectionSignals();\n return [];\n };\n FacetModel.prototype.assembleSelectionData = function (data) {\n return this.child.assembleSelectionData(data);\n };\n FacetModel.prototype.getLayoutBandMixins = function (headerType) {\n var bandMixins = {};\n var bandType = headerType === 'header' ? 'headerBand' : 'footerBand';\n for (var _i = 0, _a = ['row', 'column']; _i < _a.length; _i++) {\n var channel = _a[_i];\n var layoutHeaderComponent = this.component.layoutHeaders[channel];\n var headerComponent = layoutHeaderComponent[headerType];\n if (headerComponent && headerComponent[0]) {\n var sizeType = channel === 'row' ? 'height' : 'width';\n if (!this.child.component.layoutSize.get(sizeType)) {\n // If facet child does not have size signal, then apply headerBand\n bandMixins[bandType] = bandMixins[bandType] || {};\n bandMixins[bandType][channel] = 0.5;\n }\n }\n }\n return bandMixins;\n };\n FacetModel.prototype.assembleLayout = function () {\n var columns = this.channelHasField('column') ? this.columnDistinctSignal() : 1;\n // TODO: determine default align based on shared / independent scales\n return tslib_1.__assign({ padding: { row: 10, column: 10 } }, this.getLayoutBandMixins('header'), this.getLayoutBandMixins('footer'), { \n // TODO: support offset for rowHeader/rowFooter/rowTitle/columnHeader/columnFooter/columnTitle\n offset: 10, columns: columns, bounds: 'full', align: 'all' });\n };\n FacetModel.prototype.assembleLayoutSignals = function () {\n // FIXME(https://github.com/vega/vega-lite/issues/1193): this can be incorrect if we have independent scales.\n return this.child.assembleLayoutSignals();\n };\n FacetModel.prototype.columnDistinctSignal = function () {\n if (this.parent && (this.parent instanceof FacetModel)) {\n // For nested facet, we will add columns to group mark instead\n // See discussion in https://github.com/vega/vega/issues/952\n // and https://github.com/vega/vega-view/releases/tag/v1.2.6\n return undefined;\n }\n else {\n // In facetNode.assemble(), the name is always this.getName('column') + '_layout'.\n var facetLayoutDataName = this.getName('column_domain');\n return { signal: \"length(data('\" + facetLayoutDataName + \"'))\" };\n }\n };\n FacetModel.prototype.assembleGroup = function (signals) {\n if (this.parent && (this.parent instanceof FacetModel)) {\n // Provide number of columns for layout.\n // See discussion in https://github.com/vega/vega/issues/952\n // and https://github.com/vega/vega-view/releases/tag/v1.2.6\n return tslib_1.__assign({}, (this.channelHasField('column') ? {\n encode: {\n update: {\n // TODO(https://github.com/vega/vega-lite/issues/2759):\n // Correct the signal for facet of concat of facet_column\n columns: { field: vgField(this.facet.column, { prefix: 'distinct' }) }\n }\n }\n } : {}), _super.prototype.assembleGroup.call(this, signals));\n }\n return _super.prototype.assembleGroup.call(this, signals);\n };\n /**\n * Aggregate cardinality for calculating size\n */\n FacetModel.prototype.getCardinalityAggregateForChild = function () {\n var fields = [];\n var ops = [];\n if (this.child instanceof FacetModel) {\n if (this.child.channelHasField('column')) {\n fields.push(vgField(this.child.facet.column));\n ops.push('distinct');\n }\n }\n else {\n for (var _i = 0, _a = ['x', 'y']; _i < _a.length; _i++) {\n var channel = _a[_i];\n var childScaleComponent = this.child.component.scales[channel];\n if (childScaleComponent && !childScaleComponent.merged) {\n var type = childScaleComponent.get('type');\n var range = childScaleComponent.get('range');\n if (hasDiscreteDomain(type) && isVgRangeStep(range)) {\n var domain = assembleDomain(this.child, channel);\n var field = getFieldFromDomain(domain);\n if (field) {\n fields.push(field);\n ops.push('distinct');\n }\n else {\n log.warn('Unknown field for ${channel}. Cannot calculate view size.');\n }\n }\n }\n }\n }\n return fields.length ? { fields: fields, ops: ops } : undefined;\n };\n FacetModel.prototype.assembleMarks = function () {\n var _a = this, child = _a.child, facet = _a.facet;\n var facetRoot = this.component.data.facetRoot;\n var data = assembleFacetData(facetRoot);\n // If we facet by two dimensions, we need to add a cross operator to the aggregation\n // so that we create all groups\n var hasRow = this.channelHasField(ROW);\n var hasColumn = this.channelHasField(COLUMN);\n var layoutSizeEncodeEntry = child.assembleLayoutSize();\n var aggregateMixins = {};\n if (hasRow && hasColumn) {\n aggregateMixins.aggregate = { cross: true };\n }\n var cardinalityAggregateForChild = this.getCardinalityAggregateForChild();\n if (cardinalityAggregateForChild) {\n aggregateMixins.aggregate = tslib_1.__assign({}, aggregateMixins.aggregate, cardinalityAggregateForChild);\n }\n var title = child.assembleTitle();\n var style = child.assembleGroupStyle();\n var markGroup = tslib_1.__assign({ name: this.getName('cell'), type: 'group' }, (title ? { title: title } : {}), (style ? { style: style } : {}), { from: {\n facet: tslib_1.__assign({ name: facetRoot.name, data: facetRoot.data, groupby: [].concat(hasRow ? [this.vgField(ROW)] : [], hasColumn ? [this.vgField(COLUMN)] : []) }, aggregateMixins)\n }, sort: {\n field: [].concat(hasRow ? [this.vgField(ROW, { expr: 'datum', })] : [], hasColumn ? [this.vgField(COLUMN, { expr: 'datum' })] : []),\n order: [].concat(hasRow ? [(facet.row.sort) || 'ascending'] : [], hasColumn ? [(facet.column.sort) || 'ascending'] : [])\n } }, (data.length > 0 ? { data: data } : {}), (layoutSizeEncodeEntry ? { encode: { update: layoutSizeEncodeEntry } } : {}), child.assembleGroup());\n return [markGroup];\n };\n FacetModel.prototype.getMapping = function () {\n return this.facet;\n };\n return FacetModel;\n}(ModelWithField));\nexport { FacetModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9mYWNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFVLE1BQU0sRUFBRSxHQUFHLEVBQWUsTUFBTSxZQUFZLENBQUM7QUFFOUQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVuQyxPQUFPLEVBQVcsU0FBUyxFQUFFLEtBQUssSUFBSSxhQUFhLEVBQUUsT0FBTyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pGLE9BQU8sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBQzlCLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUUzQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxhQUFhLEVBQTBELE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUFpQyxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNELE9BQU8sRUFBUSxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUMsT0FBTyxFQUFnQixzQkFBc0IsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNqRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWxFO0lBQWdDLHNDQUFj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Q29udGVudCI6WyJpbXBvcnQge0FnZ3JlZ2F0ZU9wfSBmcm9tICd2ZWdhJztcbmltcG9ydCB7Q2hhbm5lbCwgQ09MVU1OLCBST1csIFNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9lbmNvZGluZyc7XG5pbXBvcnQge0ZhY2V0TWFwcGluZ30gZnJvbSAnLi4vZmFjZXQnO1xuaW1wb3J0IHtGaWVsZERlZiwgbm9ybWFsaXplLCB0aXRsZSBhcyBmaWVsZERlZlRpdGxlLCB2Z0ZpZWxkfSBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vbG9nJztcbmltcG9ydCB7aGFzRGlzY3JldGVEb21haW59IGZyb20gJy4uL3NjYWxlJztcbmltcG9ydCB7Tm9ybWFsaXplZEZhY2V0U3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge2NvbnRhaW5zfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7aXNWZ1JhbmdlU3RlcCwgUm93Q29sLCBWZ0F4aXMsIFZnRGF0YSwgVmdMYXlvdXQsIFZnTWFya0dyb3VwLCBWZ1NpZ25hbH0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHthc3NlbWJsZUF4aXN9IGZyb20gJy4vYXhpcy9hc3NlbWJsZSc7XG5pbXBvcnQge2J1aWxkTW9kZWx9IGZyb20gJy4vYnVpbGRtb2RlbCc7XG5pbXBvcnQge2Fzc2VtYmxlRmFjZXREYXRhfSBmcm9tICcuL2RhdGEvYXNzZW1ibGUnO1xuaW1wb3J0IHtwYXJzZURhdGF9IGZyb20gJy4vZGF0YS9wYXJzZSc7XG5pbXBvcnQge2dldEhlYWRlclR5cGUsIEhlYWRlckNoYW5uZWwsIEhlYWRlckNvbXBvbmVudH0gZnJvbSAnLi9sYXlvdXQvaGVhZGVyJztcbmltcG9ydCB7cGFyc2VDaGlsZHJlbkxheW91dFNpemV9IGZyb20gJy4vbGF5b3V0c2l6ZS9wYXJzZSc7XG5pbXBvcnQge01vZGVsLCBNb2RlbFdpdGhGaWVsZH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1JlcGVhdGVyVmFsdWUsIHJlcGxhY2VSZXBlYXRlckluRmFjZXR9IGZyb20gJy4vcmVwZWF0ZXInO1xuaW1wb3J0IHtwYXJzZUd1aWRlUmVzb2x2ZX0gZnJvbSAnLi9yZXNvbHZlJztcbmltcG9ydCB7YXNzZW1ibGVEb21haW4sIGdldEZpZWxkRnJvbURvbWFpbn0gZnJvbSAnLi9zY2FsZS9kb21haW4nO1xuXG5leHBvcnQgY2xhc3MgRmFjZXRNb2RlbCBleHRlbmRzIE1vZGVsV2l0aEZpZWxkIHtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6ICdmYWNldCcgPSAnZmFjZXQnO1xuICBwdWJsaWMgcmVhZG9ubHkgZmFjZXQ6IEZhY2V0TWFwcGluZzxzdHJpbmc+O1xuXG4gIHB1YmxpYyByZWFkb25seSBjaGlsZDogTW9kZWw7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNoaWxkcmVuOiBNb2RlbFtdO1xuXG4gIGNvbnN0cnVjdG9yKHNwZWM6IE5vcm1hbGl6ZWRGYWNldFNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLCByZXBlYXRlcjogUmVwZWF0ZXJWYWx1ZSwgY29uZmlnOiBDb25maWcpIHtcbiAgICBzdXBlcihzcGVjLCBwYXJlbnQsIHBhcmVudEdpdmVuTmFtZSwgY29uZmlnLCByZXBlYXRlciwgc3BlYy5yZXNvbHZlKTtcblxuXG4gICAgdGhpcy5jaGlsZCA9IGJ1aWxkTW9kZWwoc3BlYy5zcGVjLCB0aGlzLCB0aGlzLmdldE5hbWUoJ2NoaWxkJyksIHVuZGVmaW5lZCwgcmVwZWF0ZXIsIGNvbmZpZywgZmFsc2UpO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbdGhpcy5jaGlsZF07XG5cbiAgICBjb25zdCBmYWNldDogRmFjZXRNYXBwaW5nPHN0cmluZz4gPSByZXBsYWNlUmVwZWF0ZXJJbkZhY2V0KHNwZWMuZmFjZXQsIHJlcGVhdGVyKTtcblxuICAgIHRoaXMuZmFjZXQgPSB0aGlzLmluaXRGYWNldChmYWNldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRGYWNldChmYWNldDogRmFjZXRNYXBwaW5nPHN0cmluZz4pOiBGYWNldE1hcHBpbmc8c3RyaW5nPiB7XG4gICAgLy8gY2xvbmUgdG8gcHJldmVudCBzaWRlIGVmZmVjdCB0byB0aGUgb3JpZ2luYWwgc3BlY1xuICAgIHJldHVybiByZWR1Y2UoZmFjZXQsIGZ1bmN0aW9uKG5vcm1hbGl6ZWRGYWNldCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICAgIGlmICghY29udGFpbnMoW1JPVywgQ09MVU1OXSwgY2hhbm5lbCkpIHtcbiAgICAgICAgLy8gRHJvcCB1bnN1cHBvcnRlZCBjaGFubmVsXG4gICAgICAgIGxvZy53YXJuKGxvZy5tZXNzYWdlLmluY29tcGF0aWJsZUNoYW5uZWwoY2hhbm5lbCwgJ2ZhY2V0JykpO1xuICAgICAgICByZXR1cm4gbm9ybWFsaXplZEZhY2V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZmllbGREZWYuZmllbGQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5lbXB0eUZpZWxkRGVmKGZpZWxkRGVmLCBjaGFubmVsKSk7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVkRmFjZXQ7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdHlwZSB0byBmdWxsLCBsb3dlcmNhc2UgdHlwZSwgb3IgYXVnbWVudCB0aGUgZmllbGREZWYgd2l0aCBhIGRlZmF1bHQgdHlwZSBpZiBtaXNzaW5nLlxuICAgICAgbm9ybWFsaXplZEZhY2V0W2NoYW5uZWxdID0gbm9ybWFsaXplKGZpZWxkRGVmLCBjaGFubmVsKTtcbiAgICAgIHJldHVybiBub3JtYWxpemVkRmFjZXQ7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHVibGljIGNoYW5uZWxIYXNGaWVsZChjaGFubmVsOiBDaGFubmVsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5mYWNldFtjaGFubmVsXTtcbiAgfVxuXG4gIHB1YmxpYyBmaWVsZERlZihjaGFubmVsOiBDaGFubmVsKTogRmllbGREZWY8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuZmFjZXRbY2hhbm5lbF07XG4gIH1cblxuICBwdWJsaWMgcGFyc2VEYXRhKCkge1xuICAgIHRoaXMuY29tcG9uZW50LmRhdGEgPSBwYXJzZURhdGEodGhpcyk7XG4gICAgdGhpcy5jaGlsZC5wYXJzZURhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxheW91dFNpemUoKSB7XG4gICAgcGFyc2VDaGlsZHJlbkxheW91dFNpemUodGhpcyk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VTZWxlY3Rpb24oKSB7XG4gICAgLy8gQXMgYSBmYWNldCBoYXMgYSBzaW5nbGUgY2hpbGQsIHRoZSBzZWxlY3Rpb24gY29tcG9uZW50cyBhcmUgdGhlIHNhbWUuXG4gICAgLy8gVGhlIGNoaWxkIG1haW50YWlucyBpdHMgc2VsZWN0aW9ucyB0byBhc3NlbWJsZSBzaWduYWxzLCB3aGljaCByZW1haW5cbiAgICAvLyB3aXRoaW4gaXRzIHVuaXQuXG4gICAgdGhpcy5jaGlsZC5wYXJzZVNlbGVjdGlvbigpO1xuICAgIHRoaXMuY29tcG9uZW50LnNlbGVjdGlvbiA9IHRoaXMuY2hpbGQuY29tcG9uZW50LnNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZU1hcmtHcm91cCgpIHtcbiAgICB0aGlzLmNoaWxkLnBhcnNlTWFya0dyb3VwKCk7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VBeGlzQW5kSGVhZGVyKCkge1xuICAgIHRoaXMuY2hpbGQucGFyc2VBeGlzQW5kSGVhZGVyKCk7XG5cbiAgICB0aGlzLnBhcnNlSGVhZGVyKCdjb2x1bW4nKTtcbiAgICB0aGlzLnBhcnNlSGVhZGVyKCdyb3cnKTtcblxuICAgIHRoaXMubWVyZ2VDaGlsZEF4aXMoJ3gnKTtcbiAgICB0aGlzLm1lcmdlQ2hpbGRBeGlzKCd5Jyk7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSGVhZGVyKGNoYW5uZWw6IEhlYWRlckNoYW5uZWwpIHtcblxuICAgIGlmICh0aGlzLmNoYW5uZWxIYXNGaWVsZChjaGFubmVsKSkge1xuICAgICAgY29uc3QgZmllbGREZWYgPSB0aGlzLmZhY2V0W2NoYW5uZWxdO1xuICAgICAgY29uc3QgaGVhZGVyID0gZmllbGREZWYuaGVhZGVyIHx8IHt9O1xuICAgICAgbGV0IHRpdGxlID0gZmllbGREZWYudGl0bGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkRGVmLnRpdGxlIDpcbiAgICAgICAgaGVhZGVyLnRpdGxlICE9PSB1bmRlZmluZWQgPyBoZWFkZXIudGl0bGUgOiBmaWVsZERlZlRpdGxlKGZpZWxkRGVmLCB0aGlzLmNvbmZpZyk7XG5cbiAgICAgIGlmICh0aGlzLmNoaWxkLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdLnRpdGxlKSB7XG4gICAgICAgIC8vIG1lcmdlIHRpdGxlIHdpdGggY2hpbGQgdG8gcHJvZHVjZSBcIlRpdGxlIC8gU3VidGl0bGUgLyBTdWItc3VidGl0bGVcIlxuICAgICAgICB0aXRsZSArPSAnIC8gJyArIHRoaXMuY2hpbGQuY29tcG9uZW50LmxheW91dEhlYWRlcnNbY2hhbm5lbF0udGl0bGU7XG4gICAgICAgIHRoaXMuY2hpbGQuY29tcG9uZW50LmxheW91dEhlYWRlcnNbY2hhbm5lbF0udGl0bGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdID0ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAgZmFjZXRGaWVsZERlZjogZmllbGREZWYsXG4gICAgICAgIC8vIFRPRE86IHN1cHBvcnQgYWRkaW5nIGxhYmVsIHRvIGZvb3RlciBhcyB3ZWxsXG4gICAgICAgIGhlYWRlcjogW3RoaXMubWFrZUhlYWRlckNvbXBvbmVudChjaGFubmVsLCB0cnVlKV1cbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlSGVhZGVyQ29tcG9uZW50KGNoYW5uZWw6IEhlYWRlckNoYW5uZWwsIGxhYmVsczogYm9vbGVhbik6IEhlYWRlckNvbXBvbmVudCB7XG4gICAgY29uc3Qgc2l6ZVR5cGUgPSBjaGFubmVsID09PSAncm93JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHJldHVybiB7XG4gICAgICBsYWJlbHMsXG4gICAgICBzaXplU2lnbmFsOiB0aGlzLmNoaWxkLmNvbXBvbmVudC5sYXlvdXRTaXplLmdldChzaXplVHlwZSkgPyB0aGlzLmNoaWxkLmdldFNpemVTaWduYWxSZWYoc2l6ZVR5cGUpIDogdW5kZWZpbmVkLFxuICAgICAgYXhlczogW11cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBtZXJnZUNoaWxkQXhpcyhjaGFubmVsOiAneCcgfCAneScpIHtcbiAgICBjb25zdCB7Y2hpbGR9ID0gdGhpcztcbiAgICBpZiAoY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF0pIHtcbiAgICAgIGNvbnN0IHtsYXlvdXRIZWFkZXJzLCByZXNvbHZlfSA9IHRoaXMuY29tcG9uZW50O1xuICAgICAgcmVzb2x2ZS5heGlzW2NoYW5uZWxdID0gcGFyc2VHdWlkZVJlc29sdmUocmVzb2x2ZSwgY2hhbm5lbCk7XG5cbiAgICAgIGlmIChyZXNvbHZlLmF4aXNbY2hhbm5lbF0gPT09ICdzaGFyZWQnKSB7XG4gICAgICAgIC8vIEZvciBzaGFyZWQgYXhpcywgbW92ZSB0aGUgYXhlcyB0byBmYWNldCdzIGhlYWRlciBvciBmb290ZXJcbiAgICAgICAgY29uc3QgaGVhZGVyQ2hhbm5lbCA9IGNoYW5uZWwgPT09ICd4JyA/ICdjb2x1bW4nIDogJ3Jvdyc7XG5cbiAgICAgICAgY29uc3QgbGF5b3V0SGVhZGVyID0gbGF5b3V0SGVhZGVyc1toZWFkZXJDaGFubmVsXTtcbiAgICAgICAgZm9yIChjb25zdCBheGlzQ29tcG9uZW50IG9mIGNoaWxkLmNvbXBvbmVudC5heGVzW2NoYW5uZWxdKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVHlwZSA9IGdldEhlYWRlclR5cGUoYXhpc0NvbXBvbmVudC5nZXQoJ29yaWVudCcpKTtcbiAgICAgICAgICBsYXlvdXRIZWFkZXJbaGVhZGVyVHlwZV0gPSBsYXlvdXRIZWFkZXJbaGVhZGVyVHlwZV0gfHxcbiAgICAgICAgICBbdGhpcy5tYWtlSGVhZGVyQ29tcG9uZW50KGhlYWRlckNoYW5uZWwsIGZhbHNlKV07XG5cbiAgICAgICAgICBjb25zdCBtYWluQXhpcyA9IGFzc2VtYmxlQXhpcyhheGlzQ29tcG9uZW50LCAnbWFpbicsIHRoaXMuY29uZmlnLCB7aGVhZGVyOiB0cnVlfSk7XG4gICAgICAgICAgLy8gTGF5b3V0SGVhZGVyIG5vIGxvbmdlciBrZWVwIHRyYWNrIG9mIHByb3BlcnR5IHByZWNlZGVuY2UsIHRodXMgbGV0J3MgY29tYmluZS5cbiAgICAgICAgICBsYXlvdXRIZWFkZXJbaGVhZGVyVHlwZV1bMF0uYXhlcy5wdXNoKG1haW5BeGlzKTtcbiAgICAgICAgICBheGlzQ29tcG9uZW50Lm1haW5FeHRyYWN0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlcndpc2UgZG8gbm90aGluZyBmb3IgaW5kZXBlbmRlbnQgYXhlc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvblRvcExldmVsU2lnbmFscyhzaWduYWxzOiBhbnlbXSk6IFZnU2lnbmFsW10ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uVG9wTGV2ZWxTaWduYWxzKHNpZ25hbHMpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICB0aGlzLmNoaWxkLmFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpO1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvbkRhdGEoZGF0YTogVmdEYXRhW10pOiBWZ0RhdGFbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMYXlvdXRCYW5kTWl4aW5zKGhlYWRlclR5cGU6ICdoZWFkZXInIHwgJ2Zvb3RlcicpOiB7XG4gICAgaGVhZGVyQmFuZD86IFJvd0NvbDxudW1iZXI+LFxuICAgIGZvb3RlckJhbmQ/OiBSb3dDb2w8bnVtYmVyPlxuICB9IHtcbiAgICBjb25zdCBiYW5kTWl4aW5zID0ge307XG5cbiAgICBjb25zdCBiYW5kVHlwZSA9IGhlYWRlclR5cGUgPT09ICdoZWFkZXInID8gJ2hlYWRlckJhbmQnIDogJ2Zvb3RlckJhbmQnO1xuXG4gICAgZm9yIChjb25zdCBjaGFubmVsIG9mIFsncm93JywgJ2NvbHVtbiddIGFzICgncm93JyB8ICdjb2x1bW4nKVtdKSB7XG4gICAgICBjb25zdCBsYXlvdXRIZWFkZXJDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudC5sYXlvdXRIZWFkZXJzW2NoYW5uZWxdO1xuICAgICAgY29uc3QgaGVhZGVyQ29tcG9uZW50ID0gbGF5b3V0SGVhZGVyQ29tcG9uZW50W2hlYWRlclR5cGVdO1xuICAgICAgaWYgKGhlYWRlckNvbXBvbmVudCAmJiBoZWFkZXJDb21wb25lbnRbMF0pIHtcbiAgICAgICAgY29uc3Qgc2l6ZVR5cGUgPSBjaGFubmVsID09PSAncm93JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgICAgICBpZiAoIXRoaXMuY2hpbGQuY29tcG9uZW50LmxheW91dFNpemUuZ2V0KHNpemVUeXBlKSkge1xuICAgICAgICAgIC8vIElmIGZhY2V0IGNoaWxkIGRvZXMgbm90IGhhdmUgc2l6ZSBzaWduYWwsIHRoZW4gYXBwbHkgaGVhZGVyQmFuZFxuICAgICAgICAgIGJhbmRNaXhpbnNbYmFuZFR5cGVdID0gYmFuZE1peGluc1tiYW5kVHlwZV0gfHwge307XG4gICAgICAgICAgYmFuZE1peGluc1tiYW5kVHlwZV1bY2hhbm5lbF0gPSAwLjU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhbmRNaXhpbnM7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNoYW5uZWxIYXNGaWVsZCgnY29sdW1uJykgPyB0aGlzLmNvbHVtbkRpc3RpbmN0U2lnbmFsKCkgOiAxO1xuXG4gICAgLy8gVE9ETzogZGV0ZXJtaW5lIGRlZmF1bHQgYWxpZ24gYmFzZWQgb24gc2hhcmVkIC8gaW5kZXBlbmRlbnQgc2NhbGVzXG5cbiAgICByZXR1cm4ge1xuICAgICAgcGFkZGluZzoge3JvdzogMTAsIGNvbHVtbjogMTB9LFxuICAgICAgLi4udGhpcy5nZXRMYXlvdXRCYW5kTWl4aW5zKCdoZWFkZXInKSxcbiAgICAgIC4uLnRoaXMuZ2V0TGF5b3V0QmFuZE1peGlucygnZm9vdGVyJyksXG5cbiAgICAgIC8vIFRPRE86IHN1cHBvcnQgb2Zmc2V0IGZvciByb3dIZWFkZXIvcm93Rm9vdGVyL3Jvd1RpdGxlL2NvbHVtbkhlYWRlci9jb2x1bW5Gb290ZXIvY29sdW1uVGl0bGVcbiAgICAgIG9mZnNldDogMTAsXG4gICAgICBjb2x1bW5zLFxuICAgICAgYm91bmRzOiAnZnVsbCcsXG4gICAgICBhbGlnbjogJ2FsbCdcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICAvLyBGSVhNRShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzExOTMpOiB0aGlzIGNhbiBiZSBpbmNvcnJlY3QgaWYgd2UgaGF2ZSBpbmRlcGVuZGVudCBzY2FsZXMuXG4gICAgcmV0dXJuIHRoaXMuY2hpbGQuYXNzZW1ibGVMYXlvdXRTaWduYWxzKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbHVtbkRpc3RpbmN0U2lnbmFsKCkge1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBGYWNldE1vZGVsKSkge1xuICAgICAgLy8gRm9yIG5lc3RlZCBmYWNldCwgd2Ugd2lsbCBhZGQgY29sdW1ucyB0byBncm91cCBtYXJrIGluc3RlYWRcbiAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EvaXNzdWVzLzk1MlxuICAgICAgLy8gYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2Etdmlldy9yZWxlYXNlcy90YWcvdjEuMi42XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBmYWNldE5vZGUuYXNzZW1ibGUoKSwgdGhlIG5hbWUgaXMgYWx3YXlzIHRoaXMuZ2V0TmFtZSgnY29sdW1uJykgKyAnX2xheW91dCcuXG4gICAgICBjb25zdCBmYWNldExheW91dERhdGFOYW1lID0gdGhpcy5nZXROYW1lKCdjb2x1bW5fZG9tYWluJyk7XG4gICAgICByZXR1cm4ge3NpZ25hbDogYGxlbmd0aChkYXRhKCcke2ZhY2V0TGF5b3V0RGF0YU5hbWV9JykpYH07XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlR3JvdXAoc2lnbmFsczogVmdTaWduYWxbXSkge1xuICAgIGlmICh0aGlzLnBhcmVudCAmJiAodGhpcy5wYXJlbnQgaW5zdGFuY2VvZiBGYWNldE1vZGVsKSkge1xuICAgICAgLy8gUHJvdmlkZSBudW1iZXIgb2YgY29sdW1ucyBmb3IgbGF5b3V0LlxuICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS9pc3N1ZXMvOTUyXG4gICAgICAvLyBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3ZlZ2EvdmVnYS12aWV3L3JlbGVhc2VzL3RhZy92MS4yLjZcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLih0aGlzLmNoYW5uZWxIYXNGaWVsZCgnY29sdW1uJykgPyB7XG4gICAgICAgICAgZW5jb2RlOiB7XG4gICAgICAgICAgICB1cGRhdGU6IHtcbiAgICAgICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI3NTkpOlxuICAgICAgICAgICAgICAvLyBDb3JyZWN0IHRoZSBzaWduYWwgZm9yIGZhY2V0IG9mIGNvbmNhdCBvZiBmYWNldF9jb2x1bW5cbiAgICAgICAgICAgICAgY29sdW1uczoge2ZpZWxkOiB2Z0ZpZWxkKHRoaXMuZmFjZXQuY29sdW1uLCB7cHJlZml4OiAnZGlzdGluY3QnfSl9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IDoge30pLFxuICAgICAgICAuLi5zdXBlci5hc3NlbWJsZUdyb3VwKHNpZ25hbHMpXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuYXNzZW1ibGVHcm91cChzaWduYWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGUgY2FyZGluYWxpdHkgZm9yIGNhbGN1bGF0aW5nIHNpemVcbiAgICovXG4gIHByaXZhdGUgZ2V0Q2FyZGluYWxpdHlBZ2dyZWdhdGVGb3JDaGlsZCgpIHtcbiAgICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgb3BzOiBBZ2dyZWdhdGVPcFtdID0gW107XG4gICAgaWYgKHRoaXMuY2hpbGQgaW5zdGFuY2VvZiBGYWNldE1vZGVsKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZC5jaGFubmVsSGFzRmllbGQoJ2NvbHVtbicpKSB7XG4gICAgICAgIGZpZWxkcy5wdXNoKHZnRmllbGQodGhpcy5jaGlsZC5mYWNldC5jb2x1bW4pKTtcbiAgICAgICAgb3BzLnB1c2goJ2Rpc3RpbmN0Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBbJ3gnLCAneSddIGFzIFNjYWxlQ2hhbm5lbFtdKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkU2NhbGVDb21wb25lbnQgPSB0aGlzLmNoaWxkLmNvbXBvbmVudC5zY2FsZXNbY2hhbm5lbF07XG4gICAgICAgIGlmIChjaGlsZFNjYWxlQ29tcG9uZW50ICYmICFjaGlsZFNjYWxlQ29tcG9uZW50Lm1lcmdlZCkge1xuICAgICAgICAgIGNvbnN0IHR5cGUgPSBjaGlsZFNjYWxlQ29tcG9uZW50LmdldCgndHlwZScpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlID0gY2hpbGRTY2FsZUNvbXBvbmVudC5nZXQoJ3JhbmdlJyk7XG5cbiAgICAgICAgICBpZiAoaGFzRGlzY3JldGVEb21haW4odHlwZSkgJiYgaXNWZ1JhbmdlU3RlcChyYW5nZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IGFzc2VtYmxlRG9tYWluKHRoaXMuY2hpbGQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXRGaWVsZEZyb21Eb21haW4oZG9tYWluKTtcbiAgICAgICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgICAgICAgIG9wcy5wdXNoKCdkaXN0aW5jdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nLndhcm4oJ1Vua25vd24gZmllbGQgZm9yICR7Y2hhbm5lbH0uICBDYW5ub3QgY2FsY3VsYXRlIHZpZXcgc2l6ZS4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcy5sZW5ndGggPyB7ZmllbGRzLCBvcHN9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTWFya3MoKTogVmdNYXJrR3JvdXBbXSB7XG4gICAgY29uc3Qge2NoaWxkLCBmYWNldH0gPSB0aGlzO1xuICAgIGNvbnN0IGZhY2V0Um9vdCA9IHRoaXMuY29tcG9uZW50LmRhdGEuZmFjZXRSb290O1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlbWJsZUZhY2V0RGF0YShmYWNldFJvb3QpO1xuXG4gICAgLy8gSWYgd2UgZmFjZXQgYnkgdHdvIGRpbWVuc2lvbnMsIHdlIG5lZWQgdG8gYWRkIGEgY3Jvc3Mgb3BlcmF0b3IgdG8gdGhlIGFnZ3JlZ2F0aW9uXG4gICAgLy8gc28gdGhhdCB3ZSBjcmVhdGUgYWxsIGdyb3Vwc1xuICAgIGNvbnN0IGhhc1JvdyA9IHRoaXMuY2hhbm5lbEhhc0ZpZWxkKFJPVyk7XG4gICAgY29uc3QgaGFzQ29sdW1uID0gdGhpcy5jaGFubmVsSGFzRmllbGQoQ09MVU1OKTtcbiAgICBjb25zdCBsYXlvdXRTaXplRW5jb2RlRW50cnkgPSBjaGlsZC5hc3NlbWJsZUxheW91dFNpemUoKTtcblxuICAgIGNvbnN0IGFnZ3JlZ2F0ZU1peGluczogYW55ID0ge307XG4gICAgaWYgKGhhc1JvdyAmJiBoYXNDb2x1bW4pIHtcbiAgICAgIGFnZ3JlZ2F0ZU1peGlucy5hZ2dyZWdhdGUgPSB7Y3Jvc3M6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBjYXJkaW5hbGl0eUFnZ3JlZ2F0ZUZvckNoaWxkID0gdGhpcy5nZXRDYXJkaW5hbGl0eUFnZ3JlZ2F0ZUZvckNoaWxkKCk7XG4gICAgaWYgKGNhcmRpbmFsaXR5QWdncmVnYXRlRm9yQ2hpbGQpIHtcbiAgICAgIGFnZ3JlZ2F0ZU1peGlucy5hZ2dyZWdhdGUgPSB7XG4gICAgICAgIC4uLmFnZ3JlZ2F0ZU1peGlucy5hZ2dyZWdhdGUsXG4gICAgICAgIC4uLmNhcmRpbmFsaXR5QWdncmVnYXRlRm9yQ2hpbGRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgdGl0bGUgPSBjaGlsZC5hc3NlbWJsZVRpdGxlKCk7XG4gICAgY29uc3Qgc3R5bGUgPSBjaGlsZC5hc3NlbWJsZUdyb3VwU3R5bGUoKTtcblxuICAgIGNvbnN0IG1hcmtHcm91cCA9IHtcbiAgICAgIG5hbWU6IHRoaXMuZ2V0TmFtZSgnY2VsbCcpLFxuICAgICAgdHlwZTogJ2dyb3VwJyxcbiAgICAgIC4uLih0aXRsZT8ge3RpdGxlfSA6IHt9KSxcbiAgICAgIC4uLihzdHlsZT8ge3N0eWxlfSA6IHt9KSxcbiAgICAgIGZyb206IHtcbiAgICAgICAgZmFjZXQ6IHtcbiAgICAgICAgICBuYW1lOiBmYWNldFJvb3QubmFtZSxcbiAgICAgICAgICBkYXRhOiBmYWNldFJvb3QuZGF0YSxcbiAgICAgICAgICBncm91cGJ5OiBbXS5jb25jYXQoXG4gICAgICAgICAgICBoYXNSb3cgPyBbdGhpcy52Z0ZpZWxkKFJPVyldIDogW10sXG4gICAgICAgICAgICBoYXNDb2x1bW4gPyBbdGhpcy52Z0ZpZWxkKENPTFVNTildIDogW11cbiAgICAgICAgICApLFxuICAgICAgICAgIC4uLmFnZ3JlZ2F0ZU1peGluc1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc29ydDoge1xuICAgICAgICBmaWVsZDogW10uY29uY2F0KFxuICAgICAgICAgIGhhc1JvdyA/IFt0aGlzLnZnRmllbGQoUk9XLCB7ZXhwcjogJ2RhdHVtJyx9KV0gOiBbXSxcbiAgICAgICAgICBoYXNDb2x1bW4gPyBbdGhpcy52Z0ZpZWxkKENPTFVNTiwge2V4cHI6ICdkYXR1bSd9KV0gOiBbXVxuICAgICAgICApLFxuICAgICAgICBvcmRlcjogW10uY29uY2F0KFxuICAgICAgICAgIGhhc1JvdyA/IFsgKGZhY2V0LnJvdy5zb3J0KSB8fCAnYXNjZW5kaW5nJ10gOiBbXSxcbiAgICAgICAgICBoYXNDb2x1bW4gPyBbIChmYWNldC5jb2x1bW4uc29ydCkgfHwgJ2FzY2VuZGluZyddIDogW11cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIC4uLihkYXRhLmxlbmd0aCA+IDAgPyB7ZGF0YTogZGF0YX0gOiB7fSksXG4gICAgICAuLi4obGF5b3V0U2l6ZUVuY29kZUVudHJ5ID8ge2VuY29kZToge3VwZGF0ZTogbGF5b3V0U2l6ZUVuY29kZUVudHJ5fX0gOiB7fSksXG4gICAgICAuLi5jaGlsZC5hc3NlbWJsZUdyb3VwKClcbiAgICB9O1xuXG4gICAgcmV0dXJuIFttYXJrR3JvdXBdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldE1hcHBpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmFjZXQ7XG4gIH1cbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { duplicate } from '../../util';\nimport { Split } from '../split';\nfunction isFalseOrNull(v) {\n return v === false || v === null;\n}\nvar AxisComponent = /** @class */ (function (_super) {\n tslib_1.__extends(AxisComponent, _super);\n function AxisComponent(explicit, implicit, mainExtracted) {\n if (explicit === void 0) { explicit = {}; }\n if (implicit === void 0) { implicit = {}; }\n if (mainExtracted === void 0) { mainExtracted = false; }\n var _this = _super.call(this) || this;\n _this.explicit = explicit;\n _this.implicit = implicit;\n _this.mainExtracted = mainExtracted;\n return _this;\n }\n AxisComponent.prototype.clone = function () {\n return new AxisComponent(duplicate(this.explicit), duplicate(this.implicit), this.mainExtracted);\n };\n AxisComponent.prototype.hasAxisPart = function (part) {\n // FIXME(https://github.com/vega/vega-lite/issues/2552) this method can be wrong if users use a Vega theme.\n if (part === 'axis') { // always has the axis container part\n return true;\n }\n if (part === 'grid' || part === 'title') {\n return !!this.get(part);\n }\n // Other parts are enabled by default, so they should not be false or null.\n return !isFalseOrNull(this.get(part));\n };\n return AxisComponent;\n}(Split));\nexport { AxisComponent };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBQyxTQUFTLEVBQU8sTUFBTSxZQUFZLENBQUM7QUFFM0MsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUcvQix1QkFBdUIsQ0FBaUI7SUFDdEMsT0FBTyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDbkMsQ0FBQztBQU9EO0lBQW1DLHlDQUF5QjtJQUMxRCx1QkFDa0IsUUFBMEMsRUFDMUMsUUFBMEMsRUFDbkQsYUFBcUI7UUFGWix5QkFBQSxFQUFBLGFBQTBDO1FBQzFDLHlCQUFBLEVBQUEsYUFBMEM7UUFDbkQsOEJBQUEsRUFBQSxxQkFBcUI7UUFIOUIsWUFLRSxpQkFBTyxTQUNSO1FBTGlCLGNBQVEsR0FBUixRQUFRLENBQWtDO1FBQzFDLGNBQVEsR0FBUixRQUFRLENBQWtDO1FBQ25ELG1CQUFhLEdBQWIsYUFBYSxDQUFROztJQUc5QixDQUFDO0lBRU0sNkJBQUssR0FBWjtRQUNFLE9BQU8sSUFBSSxhQUFhLENBQ3RCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FDN0MsQ0FBQztJQUNKLENBQUM7SUFFTSxtQ0FBVyxHQUFsQixVQUFtQixJQUFjO1FBQy9CLDJHQUEyRztRQUUzRyxJQUFJLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxxQ0FBcUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUVELElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekI7UUFDRCwyRUFBMkU7UUFDM0UsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTdCRCxDQUFtQyxLQUFLLEdBNkJ2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXhpcywgQXhpc1BhcnR9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtGaWVsZERlZkJhc2V9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7ZHVwbGljYXRlLCBPbWl0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7VmdBeGlzfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1NwbGl0fSBmcm9tICcuLi9zcGxpdCc7XG5cblxuZnVuY3Rpb24gaXNGYWxzZU9yTnVsbCh2OiBib29sZWFuIHwgbnVsbCkge1xuICByZXR1cm4gdiA9PT0gZmFsc2UgfHwgdiA9PT0gbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgQXhpc0NvbXBvbmVudFByb3BzID0gT21pdDxWZ0F4aXMsICd0aXRsZSc+ICYge1xuXG4gIHRpdGxlOiBzdHJpbmcgfCBGaWVsZERlZkJhc2U8c3RyaW5nPltdO1xufTtcblxuZXhwb3J0IGNsYXNzIEF4aXNDb21wb25lbnQgZXh0ZW5kcyBTcGxpdDxBeGlzQ29tcG9uZW50UHJvcHM+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGV4cGxpY2l0OiBQYXJ0aWFsPEF4aXNDb21wb25lbnRQcm9wcz4gPSB7fSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgaW1wbGljaXQ6IFBhcnRpYWw8QXhpc0NvbXBvbmVudFByb3BzPiA9IHt9LFxuICAgIHB1YmxpYyBtYWluRXh0cmFjdGVkID0gZmFsc2VcbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEF4aXNDb21wb25lbnQoXG4gICAgICBkdXBsaWNhdGUodGhpcy5leHBsaWNpdCksXG4gICAgICBkdXBsaWNhdGUodGhpcy5pbXBsaWNpdCksIHRoaXMubWFpbkV4dHJhY3RlZFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaGFzQXhpc1BhcnQocGFydDogQXhpc1BhcnQpIHtcbiAgICAvLyBGSVhNRShodHRwczovL2dpdGh1Yi5jb20vdmVnYS92ZWdhLWxpdGUvaXNzdWVzLzI1NTIpIHRoaXMgbWV0aG9kIGNhbiBiZSB3cm9uZyBpZiB1c2VycyB1c2UgYSBWZWdhIHRoZW1lLlxuXG4gICAgaWYgKHBhcnQgPT09ICdheGlzJykgeyAvLyBhbHdheXMgaGFzIHRoZSBheGlzIGNvbnRhaW5lciBwYXJ0XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAocGFydCA9PT0gJ2dyaWQnIHx8IHBhcnQgPT09ICd0aXRsZScpIHtcbiAgICAgIHJldHVybiAhIXRoaXMuZ2V0KHBhcnQpO1xuICAgIH1cbiAgICAvLyBPdGhlciBwYXJ0cyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LCBzbyB0aGV5IHNob3VsZCBub3QgYmUgZmFsc2Ugb3IgbnVsbC5cbiAgICByZXR1cm4gIWlzRmFsc2VPck51bGwodGhpcy5nZXQocGFydCkpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXhpc0NvbXBvbmVudEluZGV4IHtcbiAgeD86IEF4aXNDb21wb25lbnRbXTtcbiAgeT86IEF4aXNDb21wb25lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBeGlzSW5kZXgge1xuICB4PzogQXhpcztcbiAgeT86IEF4aXM7XG59XG4iXX0=","export function getAxisConfig(property, config, channel, orient, scaleType) {\n if (orient === void 0) { orient = ''; }\n // configTypes to loop, starting from higher precedence\n var configTypes = (scaleType === 'band' ? ['axisBand'] : []).concat([\n channel === 'x' ? 'axisX' : 'axisY',\n 'axis' + orient.substr(0, 1).toUpperCase() + orient.substr(1),\n 'axis'\n ]);\n for (var _i = 0, configTypes_1 = configTypes; _i < configTypes_1.length; _i++) {\n var configType = configTypes_1[_i];\n if (config[configType] && config[configType][property] !== undefined) {\n return config[configType][property];\n }\n }\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsTUFBTSx3QkFBd0IsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsT0FBNkIsRUFBRSxNQUFtQixFQUFFLFNBQW9CO0lBQXpDLHVCQUFBLEVBQUEsV0FBbUI7SUFDaEgsdURBQXVEO0lBQ3ZELElBQU0sV0FBVyxHQUFHLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3BFLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztRQUNuQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTTtLQUNQLENBQUMsQ0FBQztJQUNILEtBQXlCLFVBQVcsRUFBWCwyQkFBVyxFQUFYLHlCQUFXLEVBQVgsSUFBVyxFQUFFO1FBQWpDLElBQU0sVUFBVSxvQkFBQTtRQUNuQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3BFLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO0tBQ0Y7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQb3NpdGlvblNjYWxlQ2hhbm5lbH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7U2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBeGlzQ29uZmlnKHByb3BlcnR5OiBzdHJpbmcsIGNvbmZpZzogQ29uZmlnLCBjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgb3JpZW50OiBzdHJpbmcgPSAnJywgc2NhbGVUeXBlOiBTY2FsZVR5cGUpIHtcbiAgLy8gY29uZmlnVHlwZXMgdG8gbG9vcCwgc3RhcnRpbmcgZnJvbSBoaWdoZXIgcHJlY2VkZW5jZVxuICBjb25zdCBjb25maWdUeXBlcyA9IChzY2FsZVR5cGUgPT09ICdiYW5kJyA/IFsnYXhpc0JhbmQnXSA6IFtdKS5jb25jYXQoW1xuICAgIGNoYW5uZWwgPT09ICd4JyA/ICdheGlzWCcgOiAnYXhpc1knLFxuICAgICdheGlzJyArIG9yaWVudC5zdWJzdHIoMCwxKS50b1VwcGVyQ2FzZSgpICsgb3JpZW50LnN1YnN0cigxKSwgLy8gYXhpc1RvcCwgYXhpc0JvdHRvbSwgLi4uXG4gICAgJ2F4aXMnXG4gIF0pO1xuICBmb3IgKGNvbnN0IGNvbmZpZ1R5cGUgb2YgY29uZmlnVHlwZXMpIHtcbiAgICBpZiAoY29uZmlnW2NvbmZpZ1R5cGVdICYmIGNvbmZpZ1tjb25maWdUeXBlXVtwcm9wZXJ0eV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbmZpZ1tjb25maWdUeXBlXVtwcm9wZXJ0eV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { X } from '../../channel';\nimport { isTimeFieldDef } from '../../fielddef';\nimport { ScaleType } from '../../scale';\nimport { NOMINAL, ORDINAL } from '../../type';\nimport { contains, keys } from '../../util';\nimport { timeFormatExpression } from '../common';\nimport { getAxisConfig } from './config';\nexport function labels(model, channel, specifiedLabelsSpec, orient) {\n var fieldDef = model.fieldDef(channel) ||\n (channel === 'x' ? model.fieldDef('x2') :\n channel === 'y' ? model.fieldDef('y2') :\n undefined);\n var axis = model.axis(channel);\n var config = model.config;\n var labelsSpec = {};\n // Text\n if (isTimeFieldDef(fieldDef)) {\n var isUTCScale = model.getScaleComponent(channel).get('type') === ScaleType.UTC;\n var expr = timeFormatExpression('datum.value', fieldDef.timeUnit, axis.format, config.axis.shortTimeLabels, config.timeFormat, isUTCScale);\n if (expr) {\n labelsSpec.text = { signal: expr };\n }\n }\n // Label Angle\n var angle = getAxisConfig('labelAngle', model.config, channel, orient, model.getScaleComponent(channel).get('type'));\n if (angle === undefined) {\n angle = labelAngle(axis, channel, fieldDef);\n if (angle) {\n labelsSpec.angle = { value: angle };\n }\n }\n if (angle !== undefined) {\n var align = labelAlign(angle, orient);\n if (align) {\n labelsSpec.align = { value: align };\n }\n labelsSpec.baseline = labelBaseline(angle, orient);\n }\n labelsSpec = tslib_1.__assign({}, labelsSpec, specifiedLabelsSpec);\n return keys(labelsSpec).length === 0 ? undefined : labelsSpec;\n}\nexport function labelBaseline(angle, orient) {\n if (orient === 'top' || orient === 'bottom') {\n if (angle <= 45 || 315 <= angle) {\n return { value: orient === 'top' ? 'bottom' : 'top' };\n }\n else if (135 <= angle && angle <= 225) {\n return { value: orient === 'top' ? 'top' : 'bottom' };\n }\n else {\n return { value: 'middle' };\n }\n }\n else {\n if ((angle <= 45 || 315 <= angle) || (135 <= angle && angle <= 225)) {\n return { value: 'middle' };\n }\n else if (45 <= angle && angle <= 135) {\n return { value: orient === 'left' ? 'top' : 'bottom' };\n }\n else {\n return { value: orient === 'left' ? 'bottom' : 'top' };\n }\n }\n}\nexport function labelAngle(axis, channel, fieldDef) {\n if (axis.labelAngle !== undefined) {\n // Make angle within [0,360)\n return ((axis.labelAngle % 360) + 360) % 360;\n }\n else {\n if (channel === X && contains([NOMINAL, ORDINAL], fieldDef.type)) {\n return 270;\n }\n }\n return undefined;\n}\nexport function labelAlign(angle, orient) {\n angle = ((angle % 360) + 360) % 360;\n if (orient === 'top' || orient === 'bottom') {\n if (angle % 180 === 0) {\n return 'center';\n }\n else if (0 < angle && angle < 180) {\n return orient === 'top' ? 'right' : 'left';\n }\n else {\n return orient === 'top' ? 'left' : 'right';\n }\n }\n else {\n if ((angle + 90) % 180 === 0) {\n return 'center';\n }\n else if (90 <= angle && angle < 270) {\n return orient === 'left' ? 'left' : 'right';\n }\n else {\n return orient === 'left' ? 'right' : 'left';\n }\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvYXhpcy9lbmNvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBZ0MsQ0FBQyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9ELE9BQU8sRUFBVyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRTFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUUvQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXZDLE1BQU0saUJBQWlCLEtBQWdCLEVBQUUsT0FBNkIsRUFBRSxtQkFBd0IsRUFBRSxNQUFrQjtJQUNsSCxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUN0QyxDQUNFLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLFNBQVMsQ0FDVixDQUFDO0lBQ0osSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTVCLElBQUksVUFBVSxHQUFRLEVBQUUsQ0FBQztJQUV6QixPQUFPO0lBQ1AsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFD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Q0Y7U0FBTTtRQUNMLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsRUFBRTtZQUM1QixPQUFPLFFBQVEsQ0FBQztTQUNqQjthQUFNLElBQUksRUFBRSxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFO1lBQ3JDLE9BQU8sTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7U0FDN0M7YUFBTTtZQUNMLE9BQU8sTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDN0M7S0FDRjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F4aXN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtDaGFubmVsLCBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgWH0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0ZpZWxkRGVmLCBpc1RpbWVGaWVsZERlZn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0IHtTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7Tk9NSU5BTCwgT1JESU5BTH0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zLCBrZXlzfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7QXhpc09yaWVudCwgSG9yaXpvbnRhbEFsaWdufSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge3RpbWVGb3JtYXRFeHByZXNzaW9ufSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtnZXRBeGlzQ29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbHMobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogUG9zaXRpb25TY2FsZUNoYW5uZWwsIHNwZWNpZmllZExhYmVsc1NwZWM6IGFueSwgb3JpZW50OiBBeGlzT3JpZW50KSB7XG4gIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCkgfHxcbiAgICAoXG4gICAgICBjaGFubmVsID09PSAneCcgPyBtb2RlbC5maWVsZERlZigneDInKSA6XG4gICAgICBjaGFubmVsID09PSAneScgPyBtb2RlbC5maWVsZERlZigneTInKSA6XG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuICBjb25zdCBheGlzID0gbW9kZWwuYXhpcyhjaGFubmVsKTtcbiAgY29uc3QgY29uZmlnID0gbW9kZWwuY29uZmlnO1xuXG4gIGxldCBsYWJlbHNTcGVjOiBhbnkgPSB7fTtcblxuICAvLyBUZXh0XG4gIGlmIChpc1RpbWVGaWVsZERlZihmaWVsZERlZikpIHtcbiAgICBjb25zdCBpc1VUQ1NjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoY2hhbm5lbCkuZ2V0KCd0eXBlJykgPT09IFNjYWxlVHlwZS5VVEM7XG5cbiAgICBjb25zdCBleHByID0gdGltZUZvcm1hdEV4cHJlc3Npb24oJ2RhdHVtLnZhbHVlJywgZmllbGREZWYudGltZVVuaXQsIGF4aXMuZm9ybWF0LCBjb25maWcuYXhpcy5zaG9ydFRpbWVMYWJlbHMsIGNvbmZpZy50aW1lRm9ybWF0LCBpc1VUQ1NjYWxlKTtcblxuICAgIGlmIChleHByKSB7XG4gICAgICBsYWJlbHNTcGVjLnRleHQgPSB7c2lnbmFsOiBleHByfTtcbiAgICB9XG4gIH1cblxuICAvLyBMYWJlbCBBbmdsZVxuICBsZXQgYW5nbGUgPSBnZXRBeGlzQ29uZmlnKCdsYWJlbEFuZ2xlJywgbW9kZWwuY29uZmlnLCBjaGFubmVsLCBvcmllbnQsIG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpKTtcbiAgaWYgKGFuZ2xlID09PSB1bmRlZmluZWQpIHtcbiAgICBhbmdsZSA9IGxhYmVsQW5nbGUoYXhpcywgY2hhbm5lbCwgZmllbGREZWYpO1xuICAgIGlmIChhbmdsZSkge1xuICAgICAgbGFiZWxzU3BlYy5hbmdsZSA9IHt2YWx1ZTogYW5nbGV9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbmdsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgYWxpZ24gPSBsYWJlbEFsaWduKGFuZ2xlLCBvcmllbnQpO1xuICAgIGlmIChhbGlnbikge1xuICAgICAgbGFiZWxzU3BlYy5hbGlnbiA9IHt2YWx1ZTogYWxpZ259O1xuICAgIH1cblxuICAgIGxhYmVsc1NwZWMuYmFzZWxpbmUgPSBsYWJlbEJhc2VsaW5lKGFuZ2xlLCBvcmllbnQpO1xuICB9XG5cbiAgbGFiZWxzU3BlYyA9IHtcbiAgICAuLi5sYWJlbHNTcGVjLFxuICAgIC4uLnNwZWNpZmllZExhYmVsc1NwZWNcbiAgfTtcblxuICByZXR1cm4ga2V5cyhsYWJlbHNTcGVjKS5sZW5ndGggPT09IDAgPyB1bmRlZmluZWQgOiBsYWJlbHNTcGVjO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFiZWxCYXNlbGluZShhbmdsZTogbnVtYmVyLCBvcmllbnQ6IEF4aXNPcmllbnQpIHtcbiAgaWYgKG9yaWVudCA9PT0gJ3RvcCcgfHwgb3JpZW50ID09PSAnYm90dG9tJykge1xuICAgIGlmIChhbmdsZSA8PSA0NSB8fCAzMTUgPD0gYW5nbGUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG9yaWVudCA9PT0gJ3RvcCcgPyAnYm90dG9tJyA6ICd0b3AnfTtcbiAgICB9IGVsc2UgaWYgKDEzNSA8PSBhbmdsZSAmJiBhbmdsZSA8PSAyMjUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG9yaWVudCA9PT0gJ3RvcCcgPyAndG9wJzogJ2JvdHRvbSd9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiAnbWlkZGxlJ307XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICgoYW5nbGUgPD0gNDUgfHwgMzE1IDw9IGFuZ2xlKSB8fCAoMTM1IDw9IGFuZ2xlICYmIGFuZ2xlIDw9IDIyNSkpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6ICdtaWRkbGUnfTtcbiAgICB9IGVsc2UgaWYgKDQ1IDw9IGFuZ2xlICYmIGFuZ2xlIDw9IDEzNSkge1xuICAgICAgcmV0dXJuIHt2YWx1ZTogb3JpZW50ID09PSAnbGVmdCcgPyAndG9wJyA6ICdib3R0b20nfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt2YWx1ZTogb3JpZW50ID09PSAnbGVmdCcgPyAnYm90dG9tJyA6ICd0b3AnfTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsQW5nbGUoYXhpczogQXhpcywgY2hhbm5lbDogQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pIHtcbiAgaWYgKGF4aXMubGFiZWxBbmdsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gTWFrZSBhbmdsZSB3aXRoaW4gWzAsMzYwKVxuICAgIHJldHVybiAoKGF4aXMubGFiZWxBbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICB9IGVsc2Uge1xuICAgIGlmIChjaGFubmVsID09PSBYICYmIGNvbnRhaW5zKFtOT01JTkFMLCBPUkRJTkFMXSwgZmllbGREZWYudHlwZSkpIHtcbiAgICAgIHJldHVybiAyNzA7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbEFsaWduKGFuZ2xlOiBudW1iZXIsIG9yaWVudDogQXhpc09yaWVudCk6IEhvcml6b250YWxBbGlnbiB7XG4gIGFuZ2xlID0gKChhbmdsZSAlIDM2MCkgKyAzNjApICUgMzYwO1xuICBpZiAob3JpZW50ID09PSAndG9wJyB8fCBvcmllbnQgPT09ICdib3R0b20nKSB7XG4gICAgaWYgKGFuZ2xlICUgMTgwID09PSAwKSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSBlbHNlIGlmICgwIDwgYW5nbGUgJiYgYW5nbGUgPCAxODApIHtcbiAgICAgIHJldHVybiBvcmllbnQgPT09ICd0b3AnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ3RvcCcgPyAnbGVmdCcgOiAncmlnaHQnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoKGFuZ2xlICsgOTApICUgMTgwID09PSAwKSB7XG4gICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSBlbHNlIGlmICg5MCA8PSBhbmdsZSAmJiBhbmdsZSA8IDI3MCkge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ2xlZnQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWVudCA9PT0gJ2xlZnQnID8gJ3JpZ2h0JyA6ICdsZWZ0JztcbiAgICB9XG4gIH1cbn1cblxuIl19","import { truncate } from 'vega-util';\nimport { binToString } from '../../bin';\nimport { X, Y } from '../../channel';\nimport { dateTimeExpr, isDateTime } from '../../datetime';\nimport { title as fieldDefTitle } from '../../fielddef';\nimport * as log from '../../log';\nimport { hasDiscreteDomain, isSelectionDomain } from '../../scale';\nimport { QUANTITATIVE } from '../../type';\nimport { contains } from '../../util';\n// TODO: we need to refactor this method after we take care of config refactoring\n/**\n * Default rules for whether to show a grid should be shown for a channel.\n * If `grid` is unspecified, the default value is `true` for ordinal scales that are not binned\n */\nexport function grid(scaleType, fieldDef) {\n return !hasDiscreteDomain(scaleType) && !fieldDef.bin;\n}\nexport function gridScale(model, channel) {\n var gridChannel = channel === 'x' ? 'y' : 'x';\n if (model.getScaleComponent(gridChannel)) {\n return model.scaleName(gridChannel);\n }\n return undefined;\n}\nexport function labelFlush(fieldDef, channel, specifiedAxis) {\n if (specifiedAxis.labelFlush !== undefined) {\n return specifiedAxis.labelFlush;\n }\n if (channel === 'x' && contains(['quantitative', 'temporal'], fieldDef.type)) {\n return true;\n }\n return undefined;\n}\nexport function labelOverlap(fieldDef, specifiedAxis, channel, scaleType) {\n if (specifiedAxis.labelOverlap !== undefined) {\n return specifiedAxis.labelOverlap;\n }\n // do not prevent overlap for nominal data because there is no way to infer what the missing labels are\n if (fieldDef.type !== 'nominal') {\n if (scaleType === 'log') {\n return 'greedy';\n }\n return true;\n }\n return undefined;\n}\nexport function orient(channel) {\n switch (channel) {\n case X:\n return 'bottom';\n case Y:\n return 'left';\n }\n /* istanbul ignore next: This should never happen. */\n throw new Error(log.message.INVALID_CHANNEL_FOR_AXIS);\n}\nexport function tickCount(channel, fieldDef, scaleType, size) {\n if (!hasDiscreteDomain(scaleType) && scaleType !== 'log' && !contains(['month', 'hours', 'day', 'quarter'], fieldDef.timeUnit)) {\n if (fieldDef.bin) {\n // for binned data, we don't want more ticks than maxbins\n return { signal: \"ceil(\" + size.signal + \"/20)\" };\n }\n return { signal: \"ceil(\" + size.signal + \"/40)\" };\n }\n return undefined;\n}\nexport function title(maxLength, fieldDef, config) {\n // if not defined, automatically determine axis title from field def\n var fieldTitle = fieldDefTitle(fieldDef, config);\n return maxLength ? truncate(fieldTitle, maxLength) : fieldTitle;\n}\nexport function values(specifiedAxis, model, fieldDef, channel) {\n var vals = specifiedAxis.values;\n if (specifiedAxis.values && isDateTime(vals[0])) {\n return vals.map(function (dt) {\n // normalize = true as end user won't put 0 = January\n return { signal: dateTimeExpr(dt, true) };\n });\n }\n if (!vals && fieldDef.bin && fieldDef.type === QUANTITATIVE) {\n var domain = model.scaleDomain(channel);\n if (domain && domain !== 'unaggregated' && !isSelectionDomain(domain)) { // explicit value\n return vals;\n }\n var signal = model.getName(binToString(fieldDef.bin) + \"_\" + fieldDef.field + \"_bins\");\n return { signal: \"sequence(\" + signal + \".start, \" + signal + \".stop + \" + signal + \".step, \" + signal + \".step)\" };\n }\n return vals;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL2F4aXMvcHJvcGVydGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRW5DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDdEMsT0FBTyxFQUF1QixDQUFDLEVBQUUsQ0FBQyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBVyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFXLEtBQUssSUFBSSxhQUFhLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEtBQUssR0FBRyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQVksTUFBTSxhQUFhLENBQUM7QUFDNUUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBS3BDLGlGQUFpRjtBQUNqRjs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsU0FBb0IsRUFBRSxRQUEwQjtJQUNuRSxPQUFPLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLG9CQUFvQixLQUFnQixFQUFFLE9BQTZCO0lBQ3ZFLElBQU0sV0FBVyxHQUF5QixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUN0RSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUN4QyxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDckM7SUFD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QVEsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO1FBQzNELElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsSUFBSSxNQUFNLElBQUksTUFBTSxLQUFLLGNBQWMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsaUJBQWlCO1lBQ3hGLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFNBQUksUUFBUSxDQUFDLEtBQUssVUFBTyxDQUFDLENBQUM7UUFDcEYsT0FBTyxFQUFDLE1BQU0sRUFBRSxjQUFZLE1BQU0sZ0JBQVcsTUFBTSxnQkFBVyxNQUFNLGVBQVUsTUFBTSxXQUFRLEVBQUMsQ0FBQztLQUMvRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7dHJ1bmNhdGV9IGZyb20gJ3ZlZ2EtdXRpbCc7XG5pbXBvcnQge0F4aXN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtiaW5Ub1N0cmluZ30gZnJvbSAnLi4vLi4vYmluJztcbmltcG9ydCB7UG9zaXRpb25TY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQge0RhdGVUaW1lLCBkYXRlVGltZUV4cHIsIGlzRGF0ZVRpbWV9IGZyb20gJy4uLy4uL2RhdGV0aW1lJztcbmltcG9ydCB7RmllbGREZWYsIHRpdGxlIGFzIGZpZWxkRGVmVGl0bGV9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtoYXNEaXNjcmV0ZURvbWFpbiwgaXNTZWxlY3Rpb25Eb21haW4sIFNjYWxlVHlwZX0gZnJvbSAnLi4vLi4vc2NhbGUnO1xuaW1wb3J0IHtRVUFOVElUQVRJVkV9IGZyb20gJy4uLy4uL3R5cGUnO1xuaW1wb3J0IHtjb250YWluc30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1ZnU2lnbmFsUmVmfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5cblxuLy8gVE9ETzogd2UgbmVlZCB0byByZWZhY3RvciB0aGlzIG1ldGhvZCBhZnRlciB3ZSB0YWtlIGNhcmUgb2YgY29uZmlnIHJlZmFjdG9yaW5nXG4vKipcbiAqIERlZmF1bHQgcnVsZXMgZm9yIHdoZXRoZXIgdG8gc2hvdyBhIGdyaWQgc2hvdWxkIGJlIHNob3duIGZvciBhIGNoYW5uZWwuXG4gKiBJZiBgZ3JpZGAgaXMgdW5zcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGB0cnVlYCBmb3Igb3JkaW5hbCBzY2FsZXMgdGhhdCBhcmUgbm90IGJpbm5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JpZChzY2FsZVR5cGU6IFNjYWxlVHlwZSwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4pIHtcbiAgcmV0dXJuICFoYXNEaXNjcmV0ZURvbWFpbihzY2FsZVR5cGUpICYmICFmaWVsZERlZi5iaW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncmlkU2NhbGUobW9kZWw6IFVuaXRNb2RlbCwgY2hhbm5lbDogUG9zaXRpb25TY2FsZUNoYW5uZWwpIHtcbiAgY29uc3QgZ3JpZENoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsID0gY2hhbm5lbCA9PT0gJ3gnID8gJ3knIDogJ3gnO1xuICBpZiAobW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoZ3JpZENoYW5uZWwpKSB7XG4gICAgcmV0dXJuIG1vZGVsLnNjYWxlTmFtZShncmlkQ2hhbm5lbCk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxhYmVsRmx1c2goZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBzcGVjaWZpZWRBeGlzOiBBeGlzKSB7XG4gIGlmIChzcGVjaWZpZWRBeGlzLmxhYmVsRmx1c2ggIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzcGVjaWZpZWRBeGlzLmxhYmVsRmx1c2g7XG4gIH1cbiAgaWYgKGNoYW5uZWwgPT09ICd4JyAmJiBjb250YWlucyhbJ3F1YW50aXRhdGl2ZScsICd0ZW1wb3JhbCddLCBmaWVsZERlZi50eXBlKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsYWJlbE92ZXJsYXAoZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNwZWNpZmllZEF4aXM6IEF4aXMsIGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBzY2FsZVR5cGU6IFNjYWxlVHlwZSkge1xuICBpZiAoc3BlY2lmaWVkQXhpcy5sYWJlbE92ZXJsYXAgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzcGVjaWZpZWRBeGlzLmxhYmVsT3ZlcmxhcDtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcmV2ZW50IG92ZXJsYXAgZm9yIG5vbWluYWwgZGF0YSBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBpbmZlciB3aGF0IHRoZSBtaXNzaW5nIGxhYmVscyBhcmVcbiAgaWYgKGZpZWxkRGVmLnR5cGUgIT09ICdub21pbmFsJykge1xuICAgIGlmIChzY2FsZVR5cGUgPT09ICdsb2cnKSB7XG4gICAgICByZXR1cm4gJ2dyZWVkeSc7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG9yaWVudChjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCkge1xuICBzd2l0Y2ggKGNoYW5uZWwpIHtcbiAgICBjYXNlIFg6XG4gICAgICByZXR1cm4gJ2JvdHRvbSc7XG4gICAgY2FzZSBZOlxuICAgICAgcmV0dXJuICdsZWZ0JztcbiAgfVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAqL1xuICB0aHJvdyBuZXcgRXJyb3IobG9nLm1lc3NhZ2UuSU5WQUxJRF9DSEFOTkVMX0ZPUl9BWElTKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRpY2tDb3VudChjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgZmllbGREZWY6IEZpZWxkRGVmPHN0cmluZz4sIHNjYWxlVHlwZTogU2NhbGVUeXBlLCBzaXplOiBWZ1NpZ25hbFJlZikge1xuICBpZiAoIWhhc0Rpc2NyZXRlRG9tYWluKHNjYWxlVHlwZSkgJiYgc2NhbGVUeXBlICE9PSAnbG9nJyAmJiAhY29udGFpbnMoWydtb250aCcsICdob3VycycsICdkYXknLCAncXVhcnRlciddLCBmaWVsZERlZi50aW1lVW5pdCkpIHtcblxuICAgIGlmIChmaWVsZERlZi5iaW4pIHtcbiAgICAgIC8vIGZvciBiaW5uZWQgZGF0YSwgd2UgZG9uJ3Qgd2FudCBtb3JlIHRpY2tzIHRoYW4gbWF4Ymluc1xuICAgICAgcmV0dXJuIHtzaWduYWw6IGBjZWlsKCR7c2l6ZS5zaWduYWx9LzIwKWB9O1xuICAgIH1cbiAgICByZXR1cm4ge3NpZ25hbDogYGNlaWwoJHtzaXplLnNpZ25hbH0vNDApYH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGl0bGUobWF4TGVuZ3RoOiBudW1iZXIsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjb25maWc6IENvbmZpZykge1xuICAvLyBpZiBub3QgZGVmaW5lZCwgYXV0b21hdGljYWxseSBkZXRlcm1pbmUgYXhpcyB0aXRsZSBmcm9tIGZpZWxkIGRlZlxuICBjb25zdCBmaWVsZFRpdGxlID0gZmllbGREZWZUaXRsZShmaWVsZERlZiwgY29uZmlnKTtcbiAgcmV0dXJuIG1heExlbmd0aCA/IHRydW5jYXRlKGZpZWxkVGl0bGUsIG1heExlbmd0aCkgOiBmaWVsZFRpdGxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzKHNwZWNpZmllZEF4aXM6IEF4aXMsIG1vZGVsOiBVbml0TW9kZWwsIGZpZWxkRGVmOiBGaWVsZERlZjxzdHJpbmc+LCBjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCkge1xuICBjb25zdCB2YWxzID0gc3BlY2lmaWVkQXhpcy52YWx1ZXM7XG4gIGlmIChzcGVjaWZpZWRBeGlzLnZhbHVlcyAmJiBpc0RhdGVUaW1lKHZhbHNbMF0pKSB7XG4gICAgcmV0dXJuICh2YWxzIGFzIERhdGVUaW1lW10pLm1hcCgoZHQpID0+IHtcbiAgICAgIC8vIG5vcm1hbGl6ZSA9IHRydWUgYXMgZW5kIHVzZXIgd29uJ3QgcHV0IDAgPSBKYW51YXJ5XG4gICAgICByZXR1cm4ge3NpZ25hbDogZGF0ZVRpbWVFeHByKGR0LCB0cnVlKX07XG4gICAgfSk7XG4gIH1cblxuICBpZiAoIXZhbHMgJiYgZmllbGREZWYuYmluICYmIGZpZWxkRGVmLnR5cGUgPT09IFFVQU5USVRBVElWRSkge1xuICAgIGNvbnN0IGRvbWFpbiA9IG1vZGVsLnNjYWxlRG9tYWluKGNoYW5uZWwpO1xuICAgIGlmIChkb21haW4gJiYgZG9tYWluICE9PSAndW5hZ2dyZWdhdGVkJyAmJiAhaXNTZWxlY3Rpb25Eb21haW4oZG9tYWluKSkgeyAvLyBleHBsaWNpdCB2YWx1ZVxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hbCA9IG1vZGVsLmdldE5hbWUoYCR7YmluVG9TdHJpbmcoZmllbGREZWYuYmluKX1fJHtmaWVsZERlZi5maWVsZH1fYmluc2ApO1xuICAgIHJldHVybiB7c2lnbmFsOiBgc2VxdWVuY2UoJHtzaWduYWx9LnN0YXJ0LCAke3NpZ25hbH0uc3RvcCArICR7c2lnbmFsfS5zdGVwLCAke3NpZ25hbH0uc3RlcClgfTtcbiAgfVxuXG4gIHJldHVybiB2YWxzO1xufVxuIl19","import { AXIS_PARTS, isAxisProperty, VG_AXIS_PROPERTIES } from '../../axis';\nimport { POSITION_SCALE_CHANNELS, X, Y } from '../../channel';\nimport { toFieldDefBase } from '../../fielddef';\nimport { keys } from '../../util';\nimport { getSpecifiedOrDefaultValue, guideEncodeEntry, mergeTitle, mergeTitleComponent, mergeTitleFieldDefs, numberFormat } from '../common';\nimport { parseGuideResolve } from '../resolve';\nimport { defaultTieBreaker, mergeValuesWithExplicit } from '../split';\nimport { AxisComponent } from './component';\nimport { getAxisConfig } from './config';\nimport * as encode from './encode';\nimport * as properties from './properties';\nexport function parseUnitAxis(model) {\n return POSITION_SCALE_CHANNELS.reduce(function (axis, channel) {\n if (model.component.scales[channel] && model.axis(channel)) {\n axis[channel] = [parseAxis(channel, model)];\n }\n return axis;\n }, {});\n}\nvar OPPOSITE_ORIENT = {\n bottom: 'top',\n top: 'bottom',\n left: 'right',\n right: 'left'\n};\nexport function parseLayerAxis(model) {\n var _a = model.component, axes = _a.axes, resolve = _a.resolve;\n var axisCount = { top: 0, bottom: 0, right: 0, left: 0 };\n for (var _i = 0, _b = model.children; _i < _b.length; _i++) {\n var child = _b[_i];\n child.parseAxisAndHeader();\n for (var _c = 0, _d = keys(child.component.axes); _c < _d.length; _c++) {\n var channel = _d[_c];\n resolve.axis[channel] = parseGuideResolve(model.component.resolve, channel);\n if (resolve.axis[channel] === 'shared') {\n // If the resolve says shared (and has not been overridden)\n // We will try to merge and see if there is a conflict\n axes[channel] = mergeAxisComponents(axes[channel], child.component.axes[channel]);\n if (!axes[channel]) {\n // If merge returns nothing, there is a conflict so we cannot make the axis shared.\n // Thus, mark axis as independent and remove the axis component.\n resolve.axis[channel] = 'independent';\n delete axes[channel];\n }\n }\n }\n }\n // Move axes to layer's axis component and merge shared axes\n for (var _e = 0, _f = [X, Y]; _e < _f.length; _e++) {\n var channel = _f[_e];\n for (var _g = 0, _h = model.children; _g < _h.length; _g++) {\n var child = _h[_g];\n if (!child.component.axes[channel]) {\n // skip if the child does not have a particular axis\n continue;\n }\n if (resolve.axis[channel] === 'independent') {\n // If axes are independent, concat the axisComponent array.\n axes[channel] = (axes[channel] || []).concat(child.component.axes[channel]);\n // Automatically adjust orient\n for (var _j = 0, _k = child.component.axes[channel]; _j < _k.length; _j++) {\n var axisComponent = _k[_j];\n var _l = axisComponent.getWithExplicit('orient'), orient = _l.value, explicit = _l.explicit;\n if (axisCount[orient] > 0 && !explicit) {\n // Change axis orient if the number do not match\n var oppositeOrient = OPPOSITE_ORIENT[orient];\n if (axisCount[orient] > axisCount[oppositeOrient]) {\n axisComponent.set('orient', oppositeOrient, false);\n }\n }\n axisCount[orient]++;\n // TODO(https://github.com/vega/vega-lite/issues/2634): automaticaly add extra offset?\n }\n }\n // After merging, make sure to remove axes from child\n delete child.component.axes[channel];\n }\n }\n}\nfunction mergeAxisComponents(mergedAxisCmpts, childAxisCmpts) {\n if (mergedAxisCmpts) {\n // FIXME: this is a bit wrong once we support multiple axes\n if (mergedAxisCmpts.length !== childAxisCmpts.length) {\n return undefined; // Cannot merge axis component with different number of axes.\n }\n var length_1 = mergedAxisCmpts.length;\n for (var i = 0; i < length_1; i++) {\n var merged = mergedAxisCmpts[i];\n var child = childAxisCmpts[i];\n if ((!!merged) !== (!!child)) {\n return undefined;\n }\n else if (merged && child) {\n var mergedOrient = merged.getWithExplicit('orient');\n var childOrient = child.getWithExplicit('orient');\n if (mergedOrient.explicit && childOrient.explicit && mergedOrient.value !== childOrient.value) {\n // TODO: throw warning if resolve is explicit (We don't have info about explicit/implicit resolve yet.)\n // Cannot merge due to inconsistent orient\n return undefined;\n }\n else {\n mergedAxisCmpts[i] = mergeAxisComponent(merged, child);\n }\n }\n }\n }\n else {\n // For first one, return a copy of the child\n return childAxisCmpts.map(function (axisComponent) { return axisComponent.clone(); });\n }\n return mergedAxisCmpts;\n}\nfunction mergeAxisComponent(merged, child) {\n var _loop_1 = function (prop) {\n var mergedValueWithExplicit = mergeValuesWithExplicit(merged.getWithExplicit(prop), child.getWithExplicit(prop), prop, 'axis', \n // Tie breaker function\n function (v1, v2) {\n switch (prop) {\n case 'title':\n return mergeTitleComponent(v1, v2);\n case 'gridScale':\n return {\n explicit: v1.explicit,\n value: v1.value || v2.value\n };\n }\n return defaultTieBreaker(v1, v2, prop, 'axis');\n });\n merged.setWithExplicit(prop, mergedValueWithExplicit);\n };\n for (var _i = 0, VG_AXIS_PROPERTIES_1 = VG_AXIS_PROPERTIES; _i < VG_AXIS_PROPERTIES_1.length; _i++) {\n var prop = VG_AXIS_PROPERTIES_1[_i];\n _loop_1(prop);\n }\n return merged;\n}\nfunction getFieldDefTitle(model, channel) {\n var channel2 = channel === 'x' ? 'x2' : 'y2';\n var fieldDef = model.fieldDef(channel);\n var fieldDef2 = model.fieldDef(channel2);\n var title1 = fieldDef ? fieldDef.title : undefined;\n var title2 = fieldDef2 ? fieldDef2.title : undefined;\n if (title1 && title2) {\n return mergeTitle(title1, title2);\n }\n else if (title1) {\n return title1;\n }\n else if (title2) {\n return title2;\n }\n else if (title1 !== undefined) { // falsy value to disable config\n return title1;\n }\n else if (title2 !== undefined) { // falsy value to disable config\n return title2;\n }\n return undefined;\n}\nfunction parseAxis(channel, model) {\n var axis = model.axis(channel);\n var axisComponent = new AxisComponent();\n // 1.2. Add properties\n VG_AXIS_PROPERTIES.forEach(function (property) {\n var value = getProperty(property, axis, channel, model);\n if (value !== undefined) {\n var explicit = \n // specified axis.values is already respected, but may get transformed.\n property === 'values' ? !!axis.values :\n // both VL axis.encoding and axis.labelAngle affect VG axis.encode\n property === 'encode' ? !!axis.encoding || !!axis.labelAngle :\n // title can be explicit if fieldDef.title is set\n property === 'title' && value === getFieldDefTitle(model, channel) ? true :\n // Otherwise, things are explicit if the returned value matches the specified property\n value === axis[property];\n var configValue = getAxisConfig(property, model.config, channel, axisComponent.get('orient'), model.getScaleComponent(channel).get('type'));\n // only set property if it is explicitly set or has no config value (otherwise we will accidentally override config)\n if (explicit || configValue === undefined) {\n // Do not apply implicit rule if there is a config value\n axisComponent.set(property, value, explicit);\n }\n else if (property === 'grid' && configValue) {\n // Grid is an exception because we need to set grid = true to generate another grid axis\n axisComponent.set(property, configValue, false);\n }\n }\n });\n // 2) Add guide encode definition groups\n var axisEncoding = axis.encoding || {};\n var axisEncode = AXIS_PARTS.reduce(function (e, part) {\n if (!axisComponent.hasAxisPart(part)) {\n // No need to create encode for a disabled part.\n return e;\n }\n var axisEncodingPart = guideEncodeEntry(axisEncoding[part] || {}, model);\n var value = part === 'labels' ?\n encode.labels(model, channel, axisEncodingPart, axisComponent.get('orient')) :\n axisEncodingPart;\n if (value !== undefined && keys(value).length > 0) {\n e[part] = { update: value };\n }\n return e;\n }, {});\n // FIXME: By having encode as one property, we won't have fine grained encode merging.\n if (keys(axisEncode).length > 0) {\n axisComponent.set('encode', axisEncode, !!axis.encoding || axis.labelAngle !== undefined);\n }\n return axisComponent;\n}\nfunction getProperty(property, specifiedAxis, channel, model) {\n var fieldDef = model.fieldDef(channel);\n switch (property) {\n case 'scale':\n return model.scaleName(channel);\n case 'gridScale':\n return properties.gridScale(model, channel);\n case 'format':\n // We don't include temporal field here as we apply format in encode block\n return numberFormat(fieldDef, specifiedAxis.format, model.config);\n case 'grid': {\n var scaleType = model.getScaleComponent(channel).get('type');\n return getSpecifiedOrDefaultValue(specifiedAxis.grid, properties.grid(scaleType, fieldDef));\n }\n case 'labelFlush':\n return properties.labelFlush(fieldDef, channel, specifiedAxis);\n case 'labelOverlap': {\n var scaleType = model.getScaleComponent(channel).get('type');\n return properties.labelOverlap(fieldDef, specifiedAxis, channel, scaleType);\n }\n case 'orient':\n return getSpecifiedOrDefaultValue(specifiedAxis.orient, properties.orient(channel));\n case 'tickCount': {\n var scaleType = model.getScaleComponent(channel).get('type');\n var sizeType = channel === 'x' ? 'width' : channel === 'y' ? 'height' : undefined;\n var size = sizeType ? model.getSizeSignalRef(sizeType)\n : undefined;\n return getSpecifiedOrDefaultValue(specifiedAxis.tickCount, properties.tickCount(channel, fieldDef, scaleType, size));\n }\n case 'title':\n var channel2 = channel === 'x' ? 'x2' : 'y2';\n var fieldDef2 = model.fieldDef(channel2);\n // Keep undefined so we use default if title is unspecified.\n // For other falsy value, keep them so we will hide the title.\n var fieldDefTitle = getFieldDefTitle(model, channel);\n var specifiedTitle = fieldDefTitle !== undefined ? fieldDefTitle :\n specifiedAxis.title === undefined ? undefined : specifiedAxis.title;\n return getSpecifiedOrDefaultValue(specifiedTitle, \n // If title not specified, store base parts of fieldDef (and fieldDef2 if exists)\n mergeTitleFieldDefs([toFieldDefBase(fieldDef)], fieldDef2 ? [toFieldDefBase(fieldDef2)] : []));\n case 'values':\n return properties.values(specifiedAxis, model, fieldDef, channel);\n }\n // Otherwise, return specified property.\n return isAxisProperty(property) ? specifiedAxis[property] : undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9heGlzL3BhcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxVQUFVLEVBQWdCLGNBQWMsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM5RixPQUFPLEVBQUMsdUJBQXVCLEVBQXdCLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFlLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFaEMsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFM0ksT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxpQkFBaUIsRUFBWSx1QkFBdUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU5RSxPQUFPLEVBQUMsYUFBYSxFQUF5QyxNQUFNLGFBQWEsQ0FBQztBQUNsRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRzNDLE1BQU0sd0JBQXdCLEtBQWdCO0lBQzVDLE9BQU8sdUJBQXVCLENBQUMsTUFBTSxDQUFDLFVBQVMsSUFBSSxFQUFFLE9BQU87UUFDMUQsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxP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L0MsSUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzQyw0REFBNEQ7WUFDNUQsOERBQThEO1lBQzlELElBQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RCxJQUFNLGNBQWMsR0FBRyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDbEUsYUFBYSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztZQUV0RSxPQUFPLDBCQUEwQixDQUMvQixjQUFjO1lBQ2QsaUZBQWlGO1lBQ2pGLG1CQUFtQixDQUNqQixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUMxQixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FDN0MsQ0FDRixDQUFDO1FBQ0osS0FBSyxRQUFRO1lBQ1gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3JFO0lBQ0Qsd0NBQXdDO0lBQ3hDLE9BQU8sY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBeGlzLCBBWElTX1BBUlRTLCBBeGlzRW5jb2RpbmcsIGlzQXhpc1Byb3BlcnR5LCBWR19BWElTX1BST1BFUlRJRVN9IGZyb20gJy4uLy4uL2F4aXMnO1xuaW1wb3J0IHtQT1NJVElPTl9TQ0FMRV9DSEFOTkVMUywgUG9zaXRpb25TY2FsZUNoYW5uZWwsIFgsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtGaWVsZERlZkJhc2UsIHRvRmllbGREZWZCYXNlfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge2tleXN9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtBeGlzT3JpZW50LCBWZ0F4aXMsIFZnQXhpc0VuY29kZX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZSwgZ3VpZGVFbmNvZGVFbnRyeSwgbWVyZ2VUaXRsZSwgbWVyZ2VUaXRsZUNvbXBvbmVudCwgbWVyZ2VUaXRsZUZpZWxkRGVmcywgbnVtYmVyRm9ybWF0fSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtMYXllck1vZGVsfSBmcm9tICcuLi9sYXllcic7XG5pbXBvcnQge3BhcnNlR3VpZGVSZXNvbHZlfSBmcm9tICcuLi9yZXNvbHZlJztcbmltcG9ydCB7ZGVmYXVsdFRpZUJyZWFrZXIsIEV4cGxpY2l0LCBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtBeGlzQ29tcG9uZW50LCBBeGlzQ29tcG9uZW50SW5kZXgsIEF4aXNDb21wb25lbnRQcm9wc30gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHtnZXRBeGlzQ29uZmlnfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyBlbmNvZGUgZnJvbSAnLi9lbmNvZGUnO1xuaW1wb3J0ICogYXMgcHJvcGVydGllcyBmcm9tICcuL3Byb3BlcnRpZXMnO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVuaXRBeGlzKG1vZGVsOiBVbml0TW9kZWwpOiBBeGlzQ29tcG9uZW50SW5kZXgge1xuICByZXR1cm4gUE9TSVRJT05fU0NBTEVfQ0hBTk5FTFMucmVkdWNlKGZ1bmN0aW9uKGF4aXMsIGNoYW5uZWwpIHtcbiAgICBpZiAobW9kZWwuY29tcG9uZW50LnNjYWxlc1tjaGFubmVsXSAmJiBtb2RlbC5heGlzKGNoYW5uZWwpKSB7XG4gICAgICBheGlzW2NoYW5uZWxdID0gW3BhcnNlQXhpcyhjaGFubmVsLCBtb2RlbCldO1xuICAgIH1cbiAgICByZXR1cm4gYXhpcztcbiAgfSwge30gYXMgQXhpc0NvbXBvbmVudEluZGV4KTtcbn1cblxuY29uc3QgT1BQT1NJVEVfT1JJRU5UOiB7W0sgaW4gQXhpc09yaWVudF06IEF4aXNPcmllbnR9ID0ge1xuICBib3R0b206ICd0b3AnLFxuICB0b3A6ICdib3R0b20nLFxuICBsZWZ0OiAncmlnaHQnLFxuICByaWdodDogJ2xlZnQnXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllckF4aXMobW9kZWw6IExheWVyTW9kZWwpIHtcbiAgY29uc3Qge2F4ZXMsIHJlc29sdmV9ID0gbW9kZWwuY29tcG9uZW50O1xuICBjb25zdCBheGlzQ291bnQ6IHtcbiAgICAvLyBVc2luZyBNYXBwZWQgVHlwZSB0byBkZWNsYXJlIHR5cGUgKGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rL2FkdmFuY2VkLXR5cGVzLmh0bWwjbWFwcGVkLXR5cGVzKVxuICAgIFtrIGluIEF4aXNPcmllbnRdOiBudW1iZXJcbiAgfSA9IHt0b3A6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAsIGxlZnQ6IDB9O1xuXG4gIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICBjaGlsZC5wYXJzZUF4aXNBbmRIZWFkZXIoKTtcblxuICAgIGZvciAoY29uc3QgY2hhbm5lbCBvZiBrZXlzKGNoaWxkLmNvbXBvbmVudC5heGVzKSkge1xuICAgICAgcmVzb2x2ZS5heGlzW2NoYW5uZWxdID0gcGFyc2VHdWlkZVJlc29sdmUobW9kZWwuY29tcG9uZW50LnJlc29sdmUsIGNoYW5uZWwpO1xuICAgICAgaWYgKHJlc29sdmUuYXhpc1tjaGFubmVsXSA9PT0gJ3NoYXJlZCcpIHtcbiAgICAgICAgLy8gSWYgdGhlIHJlc29sdmUgc2F5cyBzaGFyZWQgKGFuZCBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbilcbiAgICAgICAgLy8gV2Ugd2lsbCB0cnkgdG8gbWVyZ2UgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIGNvbmZsaWN0XG5cbiAgICAgICAgYXhlc1tjaGFubmVsXSA9IG1lcmdlQXhpc0NvbXBvbmVudHMoYXhlc1tjaGFubmVsXSwgY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF0pO1xuXG4gICAgICAgIGlmICghYXhlc1tjaGFubmVsXSkge1xuICAgICAgICAgIC8vIElmIG1lcmdlIHJldHVybnMgbm90aGluZywgdGhlcmUgaXMgYSBjb25mbGljdCBzbyB3ZSBjYW5ub3QgbWFrZSB0aGUgYXhpcyBzaGFyZWQuXG4gICAgICAgICAgLy8gVGh1cywgbWFyayBheGlzIGFzIGluZGVwZW5kZW50IGFuZCByZW1vdmUgdGhlIGF4aXMgY29tcG9uZW50LlxuICAgICAgICAgIHJlc29sdmUuYXhpc1tjaGFubmVsXSA9ICdpbmRlcGVuZGVudCc7XG4gICAgICAgICAgZGVsZXRlIGF4ZXNbY2hhbm5lbF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBNb3ZlIGF4ZXMgdG8gbGF5ZXIncyBheGlzIGNvbXBvbmVudCBhbmQgbWVyZ2Ugc2hhcmVkIGF4ZXNcbiAgZm9yIChjb25zdCBjaGFubmVsIG9mIFtYLCBZXSkge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgbW9kZWwuY2hpbGRyZW4pIHtcbiAgICAgIGlmICghY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF0pIHtcbiAgICAgICAgLy8gc2tpcCBpZiB0aGUgY2hpbGQgZG9lcyBub3QgaGF2ZSBhIHBhcnRpY3VsYXIgYXhpc1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc29sdmUuYXhpc1tjaGFubmVsXSA9PT0gJ2luZGVwZW5kZW50Jykge1xuICAgICAgICAvLyBJZiBheGVzIGFyZSBpbmRlcGVuZGVudCwgY29uY2F0IHRoZSBheGlzQ29tcG9uZW50IGFycmF5LlxuICAgICAgICBheGVzW2NoYW5uZWxdID0gKGF4ZXNbY2hhbm5lbF0gfHwgW10pLmNvbmNhdChjaGlsZC5jb21wb25lbnQuYXhlc1tjaGFubmVsXSk7XG5cbiAgICAgICAgLy8gQXV0b21hdGljYWxseSBhZGp1c3Qgb3JpZW50XG4gICAgICAgIGZvciAoY29uc3QgYXhpc0NvbXBvbmVudCBvZiBjaGlsZC5jb21wb25lbnQuYXhlc1tjaGFubmVsXSkge1xuICAgICAgICAgIGNvbnN0IHt2YWx1ZTogb3JpZW50LCBleHBsaWNpdH0gPSBheGlzQ29tcG9uZW50LmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG4gICAgICAgICAgaWYgKGF4aXNDb3VudFtvcmllbnRdID4gMCAmJiAhZXhwbGljaXQpIHtcbiAgICAgICAgICAgIC8vIENoYW5nZSBheGlzIG9yaWVudCBpZiB0aGUgbnVtYmVyIGRvIG5vdCBtYXRjaFxuICAgICAgICAgICAgY29uc3Qgb3Bwb3NpdGVPcmllbnQgPSBPUFBPU0lURV9PUklFTlRbb3JpZW50XTtcbiAgICAgICAgICAgIGlmIChheGlzQ291bnRbb3JpZW50XSA+IGF4aXNDb3VudFtvcHBvc2l0ZU9yaWVudF0pIHtcbiAgICAgICAgICAgICAgYXhpc0NvbXBvbmVudC5zZXQoJ29yaWVudCcsIG9wcG9zaXRlT3JpZW50LCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGF4aXNDb3VudFtvcmllbnRdKys7XG5cbiAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS92ZWdhL3ZlZ2EtbGl0ZS9pc3N1ZXMvMjYzNCk6IGF1dG9tYXRpY2FseSBhZGQgZXh0cmEgb2Zmc2V0P1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEFmdGVyIG1lcmdpbmcsIG1ha2Ugc3VyZSB0byByZW1vdmUgYXhlcyBmcm9tIGNoaWxkXG4gICAgICBkZWxldGUgY2hpbGQuY29tcG9uZW50LmF4ZXNbY2hhbm5lbF07XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlQXhpc0NvbXBvbmVudHMobWVyZ2VkQXhpc0NtcHRzOiBBeGlzQ29tcG9uZW50W10sIGNoaWxkQXhpc0NtcHRzOiBBeGlzQ29tcG9uZW50W10pOiBBeGlzQ29tcG9uZW50W10ge1xuICBpZiAobWVyZ2VkQXhpc0NtcHRzKSB7XG4gICAgLy8gRklYTUU6IHRoaXMgaXMgYSBiaXQgd3Jvbmcgb25jZSB3ZSBzdXBwb3J0IG11bHRpcGxlIGF4ZXNcbiAgICBpZiAobWVyZ2VkQXhpc0NtcHRzLmxlbmd0aCAhPT0gY2hpbGRBeGlzQ21wdHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBDYW5ub3QgbWVyZ2UgYXhpcyBjb21wb25lbnQgd2l0aCBkaWZmZXJlbnQgbnVtYmVyIG9mIGF4ZXMuXG4gICAgfVxuICAgIGNvbnN0IGxlbmd0aCA9IG1lcmdlZEF4aXNDbXB0cy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGggOyBpKyspIHtcbiAgICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlZEF4aXNDbXB0c1tpXTtcbiAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRBeGlzQ21wdHNbaV07XG5cbiAgICAgIGlmICgoISFtZXJnZWQpICE9PSAoISFjaGlsZCkpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAobWVyZ2VkICYmIGNoaWxkKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9yaWVudCA9IG1lcmdlZC5nZXRXaXRoRXhwbGljaXQoJ29yaWVudCcpO1xuICAgICAgICBjb25zdCBjaGlsZE9yaWVudCA9IGNoaWxkLmdldFdpdGhFeHBsaWNpdCgnb3JpZW50Jyk7XG5cbiAgICAgICAgaWYgKG1lcmdlZE9yaWVudC5leHBsaWNpdCAmJiBjaGlsZE9yaWVudC5leHBsaWNpdCAmJiBtZXJnZWRPcmllbnQudmFsdWUgIT09IGNoaWxkT3JpZW50LnZhbHVlKSB7XG4gICAgICAgICAgLy8gVE9ETzogdGhyb3cgd2FybmluZyBpZiByZXNvbHZlIGlzIGV4cGxpY2l0IChXZSBkb24ndCBoYXZlIGluZm8gYWJvdXQgZXhwbGljaXQvaW1wbGljaXQgcmVzb2x2ZSB5ZXQuKVxuXG4gICAgICAgICAgLy8gQ2Fubm90IG1lcmdlIGR1ZSB0byBpbmNvbnNpc3RlbnQgb3JpZW50XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtZXJnZWRBeGlzQ21wdHNbaV0gPSBtZXJnZUF4aXNDb21wb25lbnQobWVyZ2VkLCBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRm9yIGZpcnN0IG9uZSwgcmV0dXJuIGEgY29weSBvZiB0aGUgY2hpbGRcbiAgICByZXR1cm4gY2hpbGRBeGlzQ21wdHMubWFwKGF4aXNDb21wb25lbnQgPT4gYXhpc0NvbXBvbmVudC5jbG9uZSgpKTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkQXhpc0NtcHRzO1xufVxuXG5mdW5jdGlvbiBtZXJnZUF4aXNDb21wb25lbnQobWVyZ2VkOiBBeGlzQ29tcG9uZW50LCBjaGlsZDogQXhpc0NvbXBvbmVudCk6IEF4aXNDb21wb25lbnQge1xuICBmb3IgKGNvbnN0IHByb3Agb2YgVkdfQVhJU19QUk9QRVJUSUVTKSB7XG4gICAgY29uc3QgbWVyZ2VkVmFsdWVXaXRoRXhwbGljaXQgPSBtZXJnZVZhbHVlc1dpdGhFeHBsaWNpdDxWZ0F4aXMsIGFueT4oXG4gICAgICBtZXJnZWQuZ2V0V2l0aEV4cGxpY2l0KHByb3ApLFxuICAgICAgY2hpbGQuZ2V0V2l0aEV4cGxpY2l0KHByb3ApLFxuICAgICAgcHJvcCwgJ2F4aXMnLFxuXG4gICAgICAvLyBUaWUgYnJlYWtlciBmdW5jdGlvblxuICAgICAgKHYxOiBFeHBsaWNpdDxhbnk+LCB2MjogRXhwbGljaXQ8YW55PikgPT4ge1xuICAgICAgICBzd2l0Y2ggKHByb3ApIHtcbiAgICAgICAgICBjYXNlICd0aXRsZSc6XG4gICAgICAgICAgICByZXR1cm4gbWVyZ2VUaXRsZUNvbXBvbmVudCh2MSwgdjIpO1xuICAgICAgICAgIGNhc2UgJ2dyaWRTY2FsZSc6XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBleHBsaWNpdDogdjEuZXhwbGljaXQsIC8vIGtlZXAgdGhlIG9sZCBleHBsaWNpdFxuICAgICAgICAgICAgICB2YWx1ZTogdjEudmFsdWUgfHwgdjIudmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRUaWVCcmVha2VyPFZnQXhpcywgYW55Pih2MSwgdjIsIHByb3AsICdheGlzJyk7XG4gICAgICB9XG4gICAgKTtcbiAgICBtZXJnZWQuc2V0V2l0aEV4cGxpY2l0KHByb3AsIG1lcmdlZFZhbHVlV2l0aEV4cGxpY2l0KTtcbiAgfVxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG5mdW5jdGlvbiBnZXRGaWVsZERlZlRpdGxlKG1vZGVsOiBVbml0TW9kZWwsIGNoYW5uZWw6ICd4JyB8ICd5Jykge1xuICBjb25zdCBjaGFubmVsMiA9IGNoYW5uZWwgPT09ICd4JyA/ICd4MicgOiAneTInO1xuICBjb25zdCBmaWVsZERlZiA9IG1vZGVsLmZpZWxkRGVmKGNoYW5uZWwpO1xuICBjb25zdCBmaWVsZERlZjIgPSBtb2RlbC5maWVsZERlZihjaGFubmVsMik7XG5cbiAgY29uc3QgdGl0bGUxID0gZmllbGREZWYgPyBmaWVsZERlZi50aXRsZSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgdGl0bGUyID0gZmllbGREZWYyID8gZmllbGREZWYyLnRpdGxlIDogdW5kZWZpbmVkO1xuXG4gIGlmICh0aXRsZTEgJiYgdGl0bGUyKSB7XG4gICAgcmV0dXJuIG1lcmdlVGl0bGUodGl0bGUxLCB0aXRsZTIpO1xuICB9IGVsc2UgaWYgKHRpdGxlMSkge1xuICAgIHJldHVybiB0aXRsZTE7XG4gIH0gZWxzZSBpZiAodGl0bGUyKSB7XG4gICAgcmV0dXJuIHRpdGxlMjtcbiAgfSBlbHNlIGlmICh0aXRsZTEgIT09IHVuZGVmaW5lZCkgeyAvLyBmYWxzeSB2YWx1ZSB0byBkaXNhYmxlIGNvbmZpZ1xuICAgIHJldHVybiB0aXRsZTE7XG4gIH0gZWxzZSBpZiAodGl0bGUyICE9PSB1bmRlZmluZWQpIHsgLy8gZmFsc3kgdmFsdWUgdG8gZGlzYWJsZSBjb25maWdcbiAgICByZXR1cm4gdGl0bGUyO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VBeGlzKGNoYW5uZWw6IFBvc2l0aW9uU2NhbGVDaGFubmVsLCBtb2RlbDogVW5pdE1vZGVsKTogQXhpc0NvbXBvbmVudCB7XG4gIGNvbnN0IGF4aXMgPSBtb2RlbC5heGlzKGNoYW5uZWwpO1xuXG4gIGNvbnN0IGF4aXNDb21wb25lbnQgPSBuZXcgQXhpc0NvbXBvbmVudCgpO1xuXG4gIC8vIDEuMi4gQWRkIHByb3BlcnRpZXNcbiAgVkdfQVhJU19QUk9QRVJUSUVTLmZvckVhY2goZnVuY3Rpb24ocHJvcGVydHkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGdldFByb3BlcnR5KHByb3BlcnR5LCBheGlzLCBjaGFubmVsLCBtb2RlbCk7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGV4cGxpY2l0ID1cbiAgICAgICAgLy8gc3BlY2lmaWVkIGF4aXMudmFsdWVzIGlzIGFscmVhZHkgcmVzcGVjdGVkLCBidXQgbWF5IGdldCB0cmFuc2Zvcm1lZC5cbiAgICAgICAgcHJvcGVydHkgPT09ICd2YWx1ZXMnID8gISFheGlzLnZhbHVlcyA6XG4gICAgICAgIC8vIGJvdGggVkwgYXhpcy5lbmNvZGluZyBhbmQgYXhpcy5sYWJlbEFuZ2xlIGFmZmVjdCBWRyBheGlzLmVuY29kZVxuICAgICAgICBwcm9wZXJ0eSA9PT0gJ2VuY29kZScgPyAhIWF4aXMuZW5jb2RpbmcgfHwgISFheGlzLmxhYmVsQW5nbGUgOlxuICAgICAgICAvLyB0aXRsZSBjYW4gYmUgZXhwbGljaXQgaWYgZmllbGREZWYudGl0bGUgaXMgc2V0XG4gICAgICAgICAgICBwcm9wZXJ0eSA9PT0gJ3RpdGxlJyAmJiB2YWx1ZSA9PT0gZ2V0RmllbGREZWZUaXRsZShtb2RlbCwgY2hhbm5lbCkgPyB0cnVlIDpcbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGluZ3MgYXJlIGV4cGxpY2l0IGlmIHRoZSByZXR1cm5lZCB2YWx1ZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgcHJvcGVydHlcbiAgICAgICAgdmFsdWUgPT09IGF4aXNbcHJvcGVydHldO1xuXG4gICAgICBjb25zdCBjb25maWdWYWx1ZSA9IGdldEF4aXNDb25maWcocHJvcGVydHksIG1vZGVsLmNvbmZpZywgY2hhbm5lbCwgYXhpc0NvbXBvbmVudC5nZXQoJ29yaWVudCcpLCBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKSk7XG5cbiAgICAgIC8vIG9ubHkgc2V0IHByb3BlcnR5IGlmIGl0IGlzIGV4cGxpY2l0bHkgc2V0IG9yIGhhcyBubyBjb25maWcgdmFsdWUgKG90aGVyd2lzZSB3ZSB3aWxsIGFjY2lkZW50YWxseSBvdmVycmlkZSBjb25maWcpXG4gICAgICBpZiAoZXhwbGljaXQgfHwgY29uZmlnVmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBEbyBub3QgYXBwbHkgaW1wbGljaXQgcnVsZSBpZiB0aGVyZSBpcyBhIGNvbmZpZyB2YWx1ZVxuICAgICAgICBheGlzQ29tcG9uZW50LnNldChwcm9wZXJ0eSwgdmFsdWUsIGV4cGxpY2l0KTtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgPT09ICdncmlkJyAmJiBjb25maWdWYWx1ZSkge1xuICAgICAgICAvLyBHcmlkIGlzIGFuIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gc2V0IGdyaWQgPSB0cnVlIHRvIGdlbmVyYXRlIGFub3RoZXIgZ3JpZCBheGlzXG4gICAgICAgIGF4aXNDb21wb25lbnQuc2V0KHByb3BlcnR5LCBjb25maWdWYWx1ZSwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gMikgQWRkIGd1aWRlIGVuY29kZSBkZWZpbml0aW9uIGdyb3Vwc1xuICBjb25zdCBheGlzRW5jb2RpbmcgPSBheGlzLmVuY29kaW5nIHx8IHt9O1xuICBjb25zdCBheGlzRW5jb2RlID0gQVhJU19QQVJUUy5yZWR1Y2UoKGU6IFZnQXhpc0VuY29kZSwgcGFydCkgPT4ge1xuICAgIGlmICghYXhpc0NvbXBvbmVudC5oYXNBeGlzUGFydChwYXJ0KSkge1xuICAgICAgLy8gTm8gbmVlZCB0byBjcmVhdGUgZW5jb2RlIGZvciBhIGRpc2FibGVkIHBhcnQuXG4gICAgICByZXR1cm4gZTtcbiAgICB9XG5cbiAgICBjb25zdCBheGlzRW5jb2RpbmdQYXJ0ID0gZ3VpZGVFbmNvZGVFbnRyeShheGlzRW5jb2RpbmdbcGFydF0gfHwge30sIG1vZGVsKTtcblxuICAgIGNvbnN0IHZhbHVlID0gcGFydCA9PT0gJ2xhYmVscycgP1xuICAgICAgZW5jb2RlLmxhYmVscyhtb2RlbCwgY2hhbm5lbCwgYXhpc0VuY29kaW5nUGFydCwgYXhpc0NvbXBvbmVudC5nZXQoJ29yaWVudCcpKSA6XG4gICAgICBheGlzRW5jb2RpbmdQYXJ0O1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2V5cyh2YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgZVtwYXJ0XSA9IHt1cGRhdGU6IHZhbHVlfTtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH0sIHt9IGFzIFZnQXhpc0VuY29kZSk7XG5cbiAgLy8gRklYTUU6IEJ5IGhhdmluZyBlbmNvZGUgYXMgb25lIHByb3BlcnR5LCB3ZSB3b24ndCBoYXZlIGZpbmUgZ3JhaW5lZCBlbmNvZGUgbWVyZ2luZy5cbiAgaWYgKGtleXMoYXhpc0VuY29kZSkubGVuZ3RoID4gMCkge1xuICAgIGF4aXNDb21wb25lbnQuc2V0KCdlbmNvZGUnLCBheGlzRW5jb2RlLCAhIWF4aXMuZW5jb2RpbmcgfHwgYXhpcy5sYWJlbEFuZ2xlICE9PSB1bmRlZmluZWQpO1xuICB9XG5cbiAgcmV0dXJuIGF4aXNDb21wb25lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldFByb3BlcnR5PEsgZXh0ZW5kcyBrZXlvZiBBeGlzQ29tcG9uZW50UHJvcHM+KHByb3BlcnR5OiBLLCBzcGVjaWZpZWRBeGlzOiBBeGlzLCBjaGFubmVsOiBQb3NpdGlvblNjYWxlQ2hhbm5lbCwgbW9kZWw6IFVuaXRNb2RlbCk6IEF4aXNDb21wb25lbnRQcm9wc1tLXSB7XG4gIGNvbnN0IGZpZWxkRGVmID0gbW9kZWwuZmllbGREZWYoY2hhbm5lbCk7XG4gIHN3aXRjaCAocHJvcGVydHkpIHtcbiAgICBjYXNlICdzY2FsZSc6XG4gICAgICByZXR1cm4gbW9kZWwuc2NhbGVOYW1lKGNoYW5uZWwpO1xuICAgIGNhc2UgJ2dyaWRTY2FsZSc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy5ncmlkU2NhbGUobW9kZWwsIGNoYW5uZWwpO1xuICAgIGNhc2UgJ2Zvcm1hdCc6XG4gICAgICAvLyBXZSBkb24ndCBpbmNsdWRlIHRlbXBvcmFsIGZpZWxkIGhlcmUgYXMgd2UgYXBwbHkgZm9ybWF0IGluIGVuY29kZSBibG9ja1xuICAgICAgcmV0dXJuIG51bWJlckZvcm1hdChmaWVsZERlZiwgc3BlY2lmaWVkQXhpcy5mb3JtYXQsIG1vZGVsLmNvbmZpZyk7XG4gICAgY2FzZSAnZ3JpZCc6IHtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuICAgICAgcmV0dXJuIGdldFNwZWNpZmllZE9yRGVmYXVsdFZhbHVlKHNwZWNpZmllZEF4aXMuZ3JpZCwgcHJvcGVydGllcy5ncmlkKHNjYWxlVHlwZSwgZmllbGREZWYpKTtcbiAgICB9XG4gICAgY2FzZSAnbGFiZWxGbHVzaCc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy5sYWJlbEZsdXNoKGZpZWxkRGVmLCBjaGFubmVsLCBzcGVjaWZpZWRBeGlzKTtcbiAgICBjYXNlICdsYWJlbE92ZXJsYXAnOiB7XG4gICAgICBjb25zdCBzY2FsZVR5cGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChjaGFubmVsKS5nZXQoJ3R5cGUnKTtcbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmxhYmVsT3ZlcmxhcChmaWVsZERlZiwgc3BlY2lmaWVkQXhpcywgY2hhbm5lbCwgc2NhbGVUeXBlKTtcbiAgICB9XG4gICAgY2FzZSAnb3JpZW50JzpcbiAgICAgIHJldHVybiBnZXRTcGVjaWZpZWRPckRlZmF1bHRWYWx1ZShzcGVjaWZpZWRBeGlzLm9yaWVudCwgcHJvcGVydGllcy5vcmllbnQoY2hhbm5lbCkpO1xuICAgIGNhc2UgJ3RpY2tDb3VudCc6IHtcbiAgICAgIGNvbnN0IHNjYWxlVHlwZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KGNoYW5uZWwpLmdldCgndHlwZScpO1xuICAgICAgY29uc3Qgc2l6ZVR5cGUgPSBjaGFubmVsID09PSAneCcgPyAnd2lkdGgnIDogY2hhbm5lbCA9PT0gJ3knID8gJ2hlaWdodCcgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaXplID0gc2l6ZVR5cGUgPyBtb2RlbC5nZXRTaXplU2lnbmFsUmVmKHNpemVUeXBlKVxuICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIGdldFNwZWNpZmllZE9yRGVmYXVsdFZhbHVlKHNwZWNpZmllZEF4aXMudGlja0NvdW50LCBwcm9wZXJ0aWVzLnRpY2tDb3VudChjaGFubmVsLCBmaWVsZERlZiwgc2NhbGVUeXBlLCBzaXplKSk7XG4gICAgfVxuICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgIGNvbnN0IGNoYW5uZWwyID0gY2hhbm5lbCA9PT0gJ3gnID8gJ3gyJyA6ICd5Mic7XG4gICAgICBjb25zdCBmaWVsZERlZjIgPSBtb2RlbC5maWVsZERlZihjaGFubmVsMik7XG4gICAgICAvLyBLZWVwIHVuZGVmaW5lZCBzbyB3ZSB1c2UgZGVmYXVsdCBpZiB0aXRsZSBpcyB1bnNwZWNpZmllZC5cbiAgICAgIC8vIEZvciBvdGhlciBmYWxzeSB2YWx1ZSwga2VlcCB0aGVtIHNvIHdlIHdpbGwgaGlkZSB0aGUgdGl0bGUuXG4gICAgICBjb25zdCBmaWVsZERlZlRpdGxlID0gZ2V0RmllbGREZWZUaXRsZShtb2RlbCwgY2hhbm5lbCk7XG4gICAgICBjb25zdCBzcGVjaWZpZWRUaXRsZSA9IGZpZWxkRGVmVGl0bGUgIT09IHVuZGVmaW5lZCA/IGZpZWxkRGVmVGl0bGUgOlxuICAgICAgICBzcGVjaWZpZWRBeGlzLnRpdGxlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzcGVjaWZpZWRBeGlzLnRpdGxlO1xuXG4gICAgICByZXR1cm4gZ2V0U3BlY2lmaWVkT3JEZWZhdWx0VmFsdWU8c3RyaW5nIHwgRmllbGREZWZCYXNlPHN0cmluZz5bXT4oXG4gICAgICAgIHNwZWNpZmllZFRpdGxlLFxuICAgICAgICAvLyBJZiB0aXRsZSBub3Qgc3BlY2lmaWVkLCBzdG9yZSBiYXNlIHBhcnRzIG9mIGZpZWxkRGVmIChhbmQgZmllbGREZWYyIGlmIGV4aXN0cylcbiAgICAgICAgbWVyZ2VUaXRsZUZpZWxkRGVmcyhcbiAgICAgICAgICBbdG9GaWVsZERlZkJhc2UoZmllbGREZWYpXSxcbiAgICAgICAgICBmaWVsZERlZjIgPyBbdG9GaWVsZERlZkJhc2UoZmllbGREZWYyKV0gOiBbXVxuICAgICAgICApXG4gICAgICApO1xuICAgIGNhc2UgJ3ZhbHVlcyc6XG4gICAgICByZXR1cm4gcHJvcGVydGllcy52YWx1ZXMoc3BlY2lmaWVkQXhpcywgbW9kZWwsIGZpZWxkRGVmLCBjaGFubmVsKTtcbiAgfVxuICAvLyBPdGhlcndpc2UsIHJldHVybiBzcGVjaWZpZWQgcHJvcGVydHkuXG4gIHJldHVybiBpc0F4aXNQcm9wZXJ0eShwcm9wZXJ0eSkgPyBzcGVjaWZpZWRBeGlzW3Byb3BlcnR5XSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isAggregate } from '../../encoding';\nimport { isContinuous, isFieldDef } from '../../fielddef';\nimport * as log from '../../log';\nimport { AREA, BAR, CIRCLE, isMarkDef, LINE, POINT, RECT, RULE, SQUARE, TEXT, TICK } from '../../mark';\nimport { QUANTITATIVE, TEMPORAL } from '../../type';\nimport { contains } from '../../util';\nimport { getMarkConfig } from '../common';\nexport function normalizeMarkDef(mark, encoding, config) {\n var markDef = isMarkDef(mark) ? tslib_1.__assign({}, mark) : { type: mark };\n // set orient, which can be overridden by rules as sometimes the specified orient is invalid.\n var specifiedOrient = markDef.orient || getMarkConfig('orient', markDef, config);\n markDef.orient = orient(markDef.type, encoding, specifiedOrient);\n if (specifiedOrient !== undefined && specifiedOrient !== markDef.orient) {\n log.warn(log.message.orientOverridden(markDef.orient, specifiedOrient));\n }\n // set opacity and filled if not specified in mark config\n var specifiedOpacity = markDef.opacity !== undefined ? markDef.opacity : getMarkConfig('opacity', markDef, config);\n if (specifiedOpacity === undefined) {\n markDef.opacity = defaultOpacity(markDef.type, encoding);\n }\n var specifiedFilled = markDef.filled;\n if (specifiedFilled === undefined) {\n markDef.filled = filled(markDef, config);\n }\n return markDef;\n}\nfunction defaultOpacity(mark, encoding) {\n if (contains([POINT, TICK, CIRCLE, SQUARE], mark)) {\n // point-based marks\n if (!isAggregate(encoding)) {\n return 0.7;\n }\n }\n return undefined;\n}\nfunction filled(markDef, config) {\n var filledConfig = getMarkConfig('filled', markDef, config);\n var mark = markDef.type;\n return filledConfig !== undefined ? filledConfig : mark !== POINT && mark !== LINE && mark !== RULE;\n}\nfunction orient(mark, encoding, specifiedOrient) {\n switch (mark) {\n case POINT:\n case CIRCLE:\n case SQUARE:\n case TEXT:\n case RECT:\n // orient is meaningless for these marks.\n return undefined;\n }\n var yIsRange = encoding.y2;\n var xIsRange = encoding.x2;\n switch (mark) {\n case BAR:\n if (yIsRange || xIsRange) {\n // Ranged bar does not always have clear orientation, so we allow overriding\n if (specifiedOrient) {\n return specifiedOrient;\n }\n // If y is range and x is non-range, non-bin Q, y is likely a prebinned field\n var xDef = encoding.x;\n if (!xIsRange && isFieldDef(xDef) && xDef.type === QUANTITATIVE && !xDef.bin) {\n return 'horizontal';\n }\n // If x is range and y is non-range, non-bin Q, x is likely a prebinned field\n var yDef = encoding.y;\n if (!yIsRange && isFieldDef(yDef) && yDef.type === QUANTITATIVE && !yDef.bin) {\n return 'vertical';\n }\n }\n /* tslint:disable */\n case RULE: // intentionally fall through\n // return undefined for line segment rule and bar with both axis ranged\n if (xIsRange && yIsRange) {\n return undefined;\n }\n case AREA: // intentionally fall through\n // If there are range for both x and y, y (vertical) has higher precedence.\n if (yIsRange) {\n return 'vertical';\n }\n else if (xIsRange) {\n return 'horizontal';\n }\n else if (mark === RULE) {\n if (encoding.x && !encoding.y) {\n return 'vertical';\n }\n else if (encoding.y && !encoding.x) {\n return 'horizontal';\n }\n }\n case LINE: // intentional fall through\n case TICK: // Tick is opposite to bar, line, area and never have ranged mark.\n /* tslint:enable */\n var xIsContinuous = isFieldDef(encoding.x) && isContinuous(encoding.x);\n var yIsContinuous = isFieldDef(encoding.y) && isContinuous(encoding.y);\n if (xIsContinuous && !yIsContinuous) {\n return mark !== 'tick' ? 'horizontal' : 'vertical';\n }\n else if (!xIsContinuous && yIsContinuous) {\n return mark !== 'tick' ? 'vertical' : 'horizontal';\n }\n else if (xIsContinuous && yIsContinuous) {\n var xDef = encoding.x; // we can cast here since they are surely fieldDef\n var yDef = encoding.y;\n var xIsTemporal = xDef.type === TEMPORAL;\n var yIsTemporal = yDef.type === TEMPORAL;\n // temporal without timeUnit is considered continuous, but better serves as dimension\n if (xIsTemporal && !yIsTemporal) {\n return mark !== 'tick' ? 'vertical' : 'horizontal';\n }\n else if (!xIsTemporal && yIsTemporal) {\n return mark !== 'tick' ? 'horizontal' : 'vertical';\n }\n if (!xDef.aggregate && yDef.aggregate) {\n return mark !== 'tick' ? 'vertical' : 'horizontal';\n }\n else if (xDef.aggregate && !yDef.aggregate) {\n return mark !== 'tick' ? 'horizontal' : 'vertical';\n }\n if (specifiedOrient) {\n // When ambiguous, use user specified one.\n return specifiedOrient;\n }\n if (!(mark === LINE && encoding.order)) {\n // Except for connected scatterplot, we should log warning for unclear orientation of QxQ plots.\n log.warn(log.message.unclearOrientContinuous(mark));\n }\n return 'vertical';\n }\n else {\n // For Discrete x Discrete case, return undefined.\n log.warn(log.message.unclearOrientDiscreteOrEmpty(mark));\n return undefined;\n }\n }\n return 'vertical';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvaW5pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFXLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBVyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEdBQUcsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQWlCLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BILE9BQU8sRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2xELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUl4QyxNQUFNLDJCQUEyQixJQUFvQixFQUFFLFFBQTBCLEVBQUUsTUFBYztJQUMvRixJQUFNLE9BQU8sR0FBWSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxzQkFBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXBFLDZGQUE2RjtJQUM3RixJQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25GLE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksZUFBZSxLQUFLLFNBQVMsSUFBSSxlQUFlLEtBQUss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SUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ3RDLGdHQUFnRztvQkFDaEcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ3JEO2dCQUNELE9BQU8sVUFBVSxDQUFDO2FBQ25CO2lCQUFNO2dCQUNMLGtEQUFrRDtnQkFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3pELE9BQU8sU0FBUyxDQUFDO2FBQ2xCO0tBQ0o7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7RW5jb2RpbmcsIGlzQWdncmVnYXRlfSBmcm9tICcuLi8uLi9lbmNvZGluZyc7XG5pbXBvcnQge0ZpZWxkRGVmLCBpc0NvbnRpbnVvdXMsIGlzRmllbGREZWZ9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi8uLi9sb2cnO1xuaW1wb3J0IHtBUkVBLCBCQVIsIENJUkNMRSwgaXNNYXJrRGVmLCBMSU5FLCBNYXJrLCBNYXJrRGVmLCBQT0lOVCwgUkVDVCwgUlVMRSwgU1FVQVJFLCBURVhULCBUSUNLfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7UVVBTlRJVEFUSVZFLCBURU1QT1JBTH0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge2NvbnRhaW5zfSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7Z2V0TWFya0NvbmZpZ30gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7T3JpZW50fSBmcm9tICcuLy4uLy4uL3ZlZ2Euc2NoZW1hJztcblxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTWFya0RlZihtYXJrOiBNYXJrIHwgTWFya0RlZiwgZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4sIGNvbmZpZzogQ29uZmlnKSB7XG4gIGNvbnN0IG1hcmtEZWY6IE1hcmtEZWYgPSBpc01hcmtEZWYobWFyaykgPyB7Li4ubWFya30gOiB7dHlwZTogbWFya307XG5cbiAgLy8gc2V0IG9yaWVudCwgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gYnkgcnVsZXMgYXMgc29tZXRpbWVzIHRoZSBzcGVjaWZpZWQgb3JpZW50IGlzIGludmFsaWQuXG4gIGNvbnN0IHNwZWNpZmllZE9yaWVudCA9IG1hcmtEZWYub3JpZW50IHx8IGdldE1hcmtDb25maWcoJ29yaWVudCcsIG1hcmtEZWYsIGNvbmZpZyk7XG4gIG1hcmtEZWYub3JpZW50ID0gb3JpZW50KG1hcmtEZWYudHlwZSwgZW5jb2RpbmcsIHNwZWNpZmllZE9yaWVudCk7XG4gIGlmIChzcGVjaWZpZWRPcmllbnQgIT09IHVuZGVmaW5lZCAmJiBzcGVjaWZpZWRPcmllbnQgIT09IG1hcmtEZWYub3JpZW50KSB7XG4gICAgbG9nLndhcm4obG9nLm1lc3NhZ2Uub3JpZW50T3ZlcnJpZGRlbihtYXJrRGVmLm9yaWVudCxzcGVjaWZpZWRPcmllbnQpKTtcbiAgfVxuXG4gIC8vIHNldCBvcGFjaXR5IGFuZCBmaWxsZWQgaWYgbm90IHNwZWNpZmllZCBpbiBtYXJrIGNvbmZpZ1xuICBjb25zdCBzcGVjaWZpZWRPcGFjaXR5ID0gbWFya0RlZi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgPyBtYXJrRGVmLm9wYWNpdHkgOiBnZXRNYXJrQ29uZmlnKCdvcGFjaXR5JywgbWFya0RlZiwgY29uZmlnKTtcbiAgaWYgKHNwZWNpZmllZE9wYWNpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIG1hcmtEZWYub3BhY2l0eSA9IGRlZmF1bHRPcGFjaXR5KG1hcmtEZWYudHlwZSwgZW5jb2RpbmcpO1xuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWVkRmlsbGVkID0gbWFya0RlZi5maWxsZWQ7XG4gIGlmIChzcGVjaWZpZWRGaWxsZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIG1hcmtEZWYuZmlsbGVkID0gZmlsbGVkKG1hcmtEZWYsIGNvbmZpZyk7XG4gIH1cbiAgcmV0dXJuIG1hcmtEZWY7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRPcGFjaXR5KG1hcms6IE1hcmssIGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+KSB7XG4gIGlmIChjb250YWlucyhbUE9JTlQsIFRJQ0ssIENJUkNMRSwgU1FVQVJFXSwgbWFyaykpIHtcbiAgICAvLyBwb2ludC1iYXNlZCBtYXJrc1xuICAgIGlmICghaXNBZ2dyZWdhdGUoZW5jb2RpbmcpKSB7XG4gICAgICByZXR1cm4gMC43O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaWxsZWQobWFya0RlZjogTWFya0RlZiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgZmlsbGVkQ29uZmlnID0gZ2V0TWFya0NvbmZpZygnZmlsbGVkJywgbWFya0RlZiwgY29uZmlnKTtcbiAgY29uc3QgbWFyayA9IG1hcmtEZWYudHlwZTtcbiAgcmV0dXJuIGZpbGxlZENvbmZpZyAhPT0gdW5kZWZpbmVkID8gZmlsbGVkQ29uZmlnIDogbWFyayAhPT0gUE9JTlQgJiYgbWFyayAhPT0gTElORSAmJiBtYXJrICE9PSBSVUxFO1xufVxuXG5mdW5jdGlvbiBvcmllbnQobWFyazogTWFyaywgZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4sIHNwZWNpZmllZE9yaWVudDogT3JpZW50KTogT3JpZW50IHtcbiAgc3dpdGNoIChtYXJrKSB7XG4gICAgY2FzZSBQT0lOVDpcbiAgICBjYXNlIENJUkNMRTpcbiAgICBjYXNlIFNRVUFSRTpcbiAgICBjYXNlIFRFWFQ6XG4gICAgY2FzZSBSRUNUOlxuICAgICAgLy8gb3JpZW50IGlzIG1lYW5pbmdsZXNzIGZvciB0aGVzZSBtYXJrcy5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCB5SXNSYW5nZSA9IGVuY29kaW5nLnkyO1xuICBjb25zdCB4SXNSYW5nZSA9IGVuY29kaW5nLngyO1xuXG4gIHN3aXRjaCAobWFyaykge1xuICAgIGNhc2UgQkFSOlxuICAgICAgaWYgKHlJc1JhbmdlIHx8IHhJc1JhbmdlKSB7XG4gICAgICAgIC8vIFJhbmdlZCBiYXIgZG9lcyBub3QgYWx3YXlzIGhhdmUgY2xlYXIgb3JpZW50YXRpb24sIHNvIHdlIGFsbG93IG92ZXJyaWRpbmdcbiAgICAgICAgaWYgKHNwZWNpZmllZE9yaWVudCkge1xuICAgICAgICAgIHJldHVybiBzcGVjaWZpZWRPcmllbnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB5IGlzIHJhbmdlIGFuZCB4IGlzIG5vbi1yYW5nZSwgbm9uLWJpbiBRLCB5IGlzIGxpa2VseSBhIHByZWJpbm5lZCBmaWVsZFxuICAgICAgICBjb25zdCB4RGVmID0gZW5jb2RpbmcueDtcbiAgICAgICAgaWYgKCF4SXNSYW5nZSAmJiBpc0ZpZWxkRGVmKHhEZWYpICYmIHhEZWYudHlwZSA9PT0gUVVBTlRJVEFUSVZFICYmICF4RGVmLmJpbikge1xuICAgICAgICAgIHJldHVybiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB4IGlzIHJhbmdlIGFuZCB5IGlzIG5vbi1yYW5nZSwgbm9uLWJpbiBRLCB4IGlzIGxpa2VseSBhIHByZWJpbm5lZCBmaWVsZFxuICAgICAgICBjb25zdCB5RGVmID0gZW5jb2RpbmcueTtcbiAgICAgICAgaWYgKCF5SXNSYW5nZSAmJiBpc0ZpZWxkRGVmKHlEZWYpICYmIHlEZWYudHlwZSA9PT0gUVVBTlRJVEFUSVZFICYmICF5RGVmLmJpbikge1xuICAgICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICAgIGNhc2UgUlVMRTogLy8gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2hcbiAgICAgIC8vIHJldHVybiB1bmRlZmluZWQgZm9yIGxpbmUgc2VnbWVudCBydWxlIGFuZCBiYXIgd2l0aCBib3RoIGF4aXMgcmFuZ2VkXG4gICAgICBpZiAoeElzUmFuZ2UgJiYgeUlzUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgIGNhc2UgQVJFQTogLy8gaW50ZW50aW9uYWxseSBmYWxsIHRocm91Z2hcbiAgICAgIC8vIElmIHRoZXJlIGFyZSByYW5nZSBmb3IgYm90aCB4IGFuZCB5LCB5ICh2ZXJ0aWNhbCkgaGFzIGhpZ2hlciBwcmVjZWRlbmNlLlxuICAgICAgaWYgKHlJc1JhbmdlKSB7XG4gICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgfSBlbHNlIGlmICh4SXNSYW5nZSkge1xuICAgICAgICByZXR1cm4gJ2hvcml6b250YWwnO1xuICAgICAgfSBlbHNlIGlmIChtYXJrID09PSBSVUxFKSB7XG4gICAgICAgIGlmIChlbmNvZGluZy54ICYmICFlbmNvZGluZy55KSB7XG4gICAgICAgICAgcmV0dXJuICd2ZXJ0aWNhbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoZW5jb2RpbmcueSAmJiAhZW5jb2RpbmcueCkge1xuICAgICAgICAgIHJldHVybiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuXG4gICAgY2FzZSBMSU5FOiAvLyBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2hcbiAgICBjYXNlIFRJQ0s6IC8vIFRpY2sgaXMgb3Bwb3NpdGUgdG8gYmFyLCBsaW5lLCBhcmVhIGFuZCBuZXZlciBoYXZlIHJhbmdlZCBtYXJrLlxuXG4gICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovXG4gICAgICBjb25zdCB4SXNDb250aW51b3VzID0gaXNGaWVsZERlZihlbmNvZGluZy54KSAmJiBpc0NvbnRpbnVvdXMoZW5jb2RpbmcueCk7XG4gICAgICBjb25zdCB5SXNDb250aW51b3VzID0gaXNGaWVsZERlZihlbmNvZGluZy55KSAmJiBpc0NvbnRpbnVvdXMoZW5jb2RpbmcueSk7XG4gICAgICBpZiAoeElzQ29udGludW91cyAmJiAheUlzQ29udGludW91cykge1xuICAgICAgICByZXR1cm4gbWFyayAhPT0gJ3RpY2snID8gJ2hvcml6b250YWwnIDogJ3ZlcnRpY2FsJztcbiAgICAgIH0gZWxzZSBpZiAoIXhJc0NvbnRpbnVvdXMgJiYgeUlzQ29udGludW91cykge1xuICAgICAgICByZXR1cm4gbWFyayAhPT0gJ3RpY2snID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICAgIH0gZWxzZSBpZiAoeElzQ29udGludW91cyAmJiB5SXNDb250aW51b3VzKSB7XG4gICAgICAgIGNvbnN0IHhEZWYgPSBlbmNvZGluZy54IGFzIEZpZWxkRGVmPHN0cmluZz47IC8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2UgdGhleSBhcmUgc3VyZWx5IGZpZWxkRGVmXG4gICAgICAgIGNvbnN0IHlEZWYgPSBlbmNvZGluZy55IGFzIEZpZWxkRGVmPHN0cmluZz47XG5cbiAgICAgICAgY29uc3QgeElzVGVtcG9yYWwgPSB4RGVmLnR5cGUgPT09IFRFTVBPUkFMO1xuICAgICAgICBjb25zdCB5SXNUZW1wb3JhbCA9IHlEZWYudHlwZSA9PT0gVEVNUE9SQUw7XG5cbiAgICAgICAgLy8gdGVtcG9yYWwgd2l0aG91dCB0aW1lVW5pdCBpcyBjb25zaWRlcmVkIGNvbnRpbnVvdXMsIGJ1dCBiZXR0ZXIgc2VydmVzIGFzIGRpbWVuc2lvblxuICAgICAgICBpZiAoeElzVGVtcG9yYWwgJiYgIXlJc1RlbXBvcmFsKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoIXhJc1RlbXBvcmFsICYmIHlJc1RlbXBvcmFsKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXhEZWYuYWdncmVnYXRlICYmIHlEZWYuYWdncmVnYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoeERlZi5hZ2dyZWdhdGUgJiYgIXlEZWYuYWdncmVnYXRlKSB7XG4gICAgICAgICAgcmV0dXJuIG1hcmsgIT09ICd0aWNrJyA/ICdob3Jpem9udGFsJyA6ICd2ZXJ0aWNhbCc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3BlY2lmaWVkT3JpZW50KSB7XG4gICAgICAgICAgLy8gV2hlbiBhbWJpZ3VvdXMsIHVzZSB1c2VyIHNwZWNpZmllZCBvbmUuXG4gICAgICAgICAgcmV0dXJuIHNwZWNpZmllZE9yaWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghKG1hcmsgPT09IExJTkUgJiYgZW5jb2Rpbmcub3JkZXIpKSB7XG4gICAgICAgICAgLy8gRXhjZXB0IGZvciBjb25uZWN0ZWQgc2NhdHRlcnBsb3QsIHdlIHNob3VsZCBsb2cgd2FybmluZyBmb3IgdW5jbGVhciBvcmllbnRhdGlvbiBvZiBReFEgcGxvdHMuXG4gICAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UudW5jbGVhck9yaWVudENvbnRpbnVvdXMobWFyaykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAndmVydGljYWwnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRm9yIERpc2NyZXRlIHggRGlzY3JldGUgY2FzZSwgcmV0dXJuIHVuZGVmaW5lZC5cbiAgICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UudW5jbGVhck9yaWVudERpc2NyZXRlT3JFbXB0eShtYXJrKSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gIH1cbiAgcmV0dXJuICd2ZXJ0aWNhbCc7XG59XG5cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport * as mixins from './mixins';\nexport var area = {\n vgMark: 'area',\n encodeEntry: function (model) {\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'include' }), mixins.pointPosition('x', model, 'zeroOrMin'), mixins.pointPosition('y', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', model.markDef.orient === 'horizontal' ? 'x2' : 'y2'), mixins.defined(model));\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJlYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvYXJlYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFHbkMsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFpQjtJQUNoQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQzVCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLENBQUMsRUFDbEUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxFQUM3QyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQzlGLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ3hCO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5cblxuZXhwb3J0IGNvbnN0IGFyZWE6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnYXJlYScsXG4gIGVuY29kZUVudHJ5OiAobW9kZWw6IFVuaXRNb2RlbCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2lnbm9yZScsIG9yaWVudDogJ2luY2x1ZGUnfSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneCcsIG1vZGVsLCAnemVyb09yTWluJyksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCAnemVyb09yTWluJyksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbjIobW9kZWwsICd6ZXJvT3JNaW4nLCBtb2RlbC5tYXJrRGVmLm9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3gyJyA6ICd5MicpLFxuICAgICAgLi4ubWl4aW5zLmRlZmluZWQobW9kZWwpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { isNumber } from 'vega-util';\nimport { X, Y } from '../../channel';\nimport { isFieldDef } from '../../fielddef';\nimport * as log from '../../log';\nimport { hasDiscreteDomain, ScaleType } from '../../scale';\nimport { isVgRangeStep } from '../../vega.schema';\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nexport var bar = {\n vgMark: 'rect',\n encodeEntry: function (model) {\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x(model), y(model));\n }\n};\nfunction x(model) {\n var config = model.config, encoding = model.encoding, markDef = model.markDef, width = model.width;\n var orient = markDef.orient;\n var sizeDef = encoding.size;\n var xDef = encoding.x;\n var x2Def = encoding.x2;\n var xScaleName = model.scaleName(X);\n var xScale = model.getScaleComponent(X);\n // x, x2, and width -- we must specify two of these in all conditions\n if (orient === 'horizontal' || x2Def) {\n return tslib_1.__assign({}, mixins.pointPosition('x', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', 'x2'));\n }\n else { // vertical\n if (isFieldDef(xDef)) {\n var xScaleType = xScale.get('type');\n if (xDef.bin && !sizeDef && !hasDiscreteDomain(xScaleType)) {\n return mixins.binnedPosition(xDef, 'x', model.scaleName('x'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, xScale.get('reverse'));\n }\n else {\n if (xScaleType === ScaleType.BAND) {\n return mixins.bandPosition(xDef, 'x', model);\n }\n }\n }\n // sized bin, normal point-ordinal axis, quantitative x-axis, or no x\n return mixins.centeredBandPosition('x', model, tslib_1.__assign({}, ref.mid(width)), defaultSizeRef(markDef, xScaleName, xScale, config));\n }\n}\nfunction y(model) {\n var config = model.config, encoding = model.encoding, height = model.height, markDef = model.markDef;\n var orient = markDef.orient;\n var sizeDef = encoding.size;\n var yDef = encoding.y;\n var y2Def = encoding.y2;\n var yScaleName = model.scaleName(Y);\n var yScale = model.getScaleComponent(Y);\n // y, y2 & height -- we must specify two of these in all conditions\n if (orient === 'vertical' || y2Def) {\n return tslib_1.__assign({}, mixins.pointPosition('y', model, 'zeroOrMin'), mixins.pointPosition2(model, 'zeroOrMin', 'y2'));\n }\n else {\n if (isFieldDef(yDef)) {\n var yScaleType = yScale.get('type');\n if (yDef.bin && !sizeDef && !hasDiscreteDomain(yScaleType)) {\n return mixins.binnedPosition(yDef, 'y', model.scaleName('y'), markDef.binSpacing === undefined ? config.bar.binSpacing : markDef.binSpacing, yScale.get('reverse'));\n }\n else if (yScaleType === ScaleType.BAND) {\n return mixins.bandPosition(yDef, 'y', model);\n }\n }\n return mixins.centeredBandPosition('y', model, ref.mid(height), defaultSizeRef(markDef, yScaleName, yScale, config));\n }\n}\nfunction defaultSizeRef(markDef, scaleName, scale, config) {\n if (markDef.size !== undefined) {\n return { value: markDef.size };\n }\n else if (config.bar.discreteBandSize) {\n return { value: config.bar.discreteBandSize };\n }\n else if (scale) {\n var scaleType = scale.get('type');\n if (scaleType === ScaleType.POINT) {\n var scaleRange = scale.get('range');\n if (isVgRangeStep(scaleRange) && isNumber(scaleRange.step)) {\n return { value: scaleRange.step - 1 };\n }\n log.warn(log.message.BAR_WITH_POINT_SCALE_AND_RANGESTEP_NULL);\n }\n else if (scaleType === ScaleType.BAND) {\n return ref.bandRef(scaleName);\n }\n else { // non-ordinal scale\n return { value: config.bar.continuousBandSize };\n }\n }\n else if (config.scale.rangeStep && config.scale.rangeStep !== null) {\n return { value: config.scale.rangeStep - 1 };\n }\n return { value: 20 };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBpbGUvbWFyay9iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBZ0IsTUFBTSxtQkFBbUIsQ0FBQztBQUsvRCxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztBQUdsQyxNQUFNLENBQUMsSUFBTSxHQUFHLEdBQWlCO0lBQy9CLE1BQU0sRUFBRSxNQUFNO0lBQ2QsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDNUIsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNqRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ1IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUNYO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixXQUFXLEtBQWdCO0lBQ2xCLElBQUEscUJBQU0sRUFBRSx5QkFBUSxFQUFFLHVCQUFPLEVBQUUsbUJBQUssQ0FBVTtJQUNqRCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFFOUIsSUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJ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QUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDMUQsT0FBTyxFQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBQyxDQUFDO2FBQ3JDO1lBQ0QsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7U0FDL0Q7YUFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMvQjthQUFNLEVBQUUsb0JBQW9CO1lBQzNCLE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBQyxDQUFDO1NBQy9DO0tBQ0Y7U0FBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtRQUNwRSxPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBQyxDQUFDO0tBQzVDO0lBQ0QsT0FBTyxFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc051bWJlcn0gZnJvbSAndmVnYS11dGlsJztcbmltcG9ydCB7WCwgWX0gZnJvbSAnLi4vLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7aXNGaWVsZERlZn0gZnJvbSAnLi4vLi4vZmllbGRkZWYnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQge01hcmtEZWZ9IGZyb20gJy4uLy4uL21hcmsnO1xuaW1wb3J0IHtoYXNEaXNjcmV0ZURvbWFpbiwgU2NhbGVUeXBlfSBmcm9tICcuLi8uLi9zY2FsZSc7XG5pbXBvcnQge2lzVmdSYW5nZVN0ZXAsIFZnRW5jb2RlRW50cnl9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7VmdWYWx1ZVJlZn0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtTY2FsZUNvbXBvbmVudH0gZnJvbSAnLi4vc2NhbGUvY29tcG9uZW50JztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgbWl4aW5zIGZyb20gJy4vbWl4aW5zJztcbmltcG9ydCAqIGFzIHJlZiBmcm9tICcuL3ZhbHVlcmVmJztcblxuXG5leHBvcnQgY29uc3QgYmFyOiBNYXJrQ29tcGlsZXIgPSB7XG4gIHZnTWFyazogJ3JlY3QnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpZ25vcmUnLCBvcmllbnQ6ICdpZ25vcmUnfSksXG4gICAgICAuLi54KG1vZGVsKSxcbiAgICAgIC4uLnkobW9kZWwpLFxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHgobW9kZWw6IFVuaXRNb2RlbCk6IFZnRW5jb2RlRW50cnkge1xuICBjb25zdCB7Y29uZmlnLCBlbmNvZGluZywgbWFya0RlZiwgd2lkdGh9ID0gbW9kZWw7XG4gIGNvbnN0IG9yaWVudCA9IG1hcmtEZWYub3JpZW50O1xuICBjb25zdCBzaXplRGVmID0gZW5jb2Rpbmcuc2l6ZTtcblxuICBjb25zdCB4RGVmID0gZW5jb2RpbmcueDtcbiAgY29uc3QgeDJEZWYgPSBlbmNvZGluZy54MjtcbiAgY29uc3QgeFNjYWxlTmFtZSA9IG1vZGVsLnNjYWxlTmFtZShYKTtcbiAgY29uc3QgeFNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoWCk7XG4gIC8vIHgsIHgyLCBhbmQgd2lkdGggLS0gd2UgbXVzdCBzcGVjaWZ5IHR3byBvZiB0aGVzZSBpbiBhbGwgY29uZGl0aW9uc1xuICBpZiAob3JpZW50ID09PSAnaG9yaXpvbnRhbCcgfHwgeDJEZWYpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3gnLCBtb2RlbCwgJ3plcm9Pck1pbicpLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24yKG1vZGVsLCAnemVyb09yTWluJywgJ3gyJyksXG4gICAgfTtcbiAgfSBlbHNlIHsgLy8gdmVydGljYWxcbiAgICBpZiAoaXNGaWVsZERlZih4RGVmKSkge1xuICAgICAgY29uc3QgeFNjYWxlVHlwZSA9IHhTY2FsZS5nZXQoJ3R5cGUnKTtcbiAgICAgIGlmICh4RGVmLmJpbiAmJiAhc2l6ZURlZiAmJiAhaGFzRGlzY3JldGVEb21haW4oeFNjYWxlVHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIG1peGlucy5iaW5uZWRQb3NpdGlvbihcbiAgICAgICAgICB4RGVmLCAneCcsIG1vZGVsLnNjYWxlTmFtZSgneCcpLCBtYXJrRGVmLmJpblNwYWNpbmcgPT09IHVuZGVmaW5lZCA/IGNvbmZpZy5iYXIuYmluU3BhY2luZyA6IG1hcmtEZWYuYmluU3BhY2luZyxcbiAgICAgICAgICB4U2NhbGUuZ2V0KCdyZXZlcnNlJylcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh4U2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgICAgIHJldHVybiBtaXhpbnMuYmFuZFBvc2l0aW9uKHhEZWYsICd4JywgbW9kZWwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNpemVkIGJpbiwgbm9ybWFsIHBvaW50LW9yZGluYWwgYXhpcywgcXVhbnRpdGF0aXZlIHgtYXhpcywgb3Igbm8geFxuXG4gICAgcmV0dXJuIG1peGlucy5jZW50ZXJlZEJhbmRQb3NpdGlvbigneCcsIG1vZGVsLFxuICAgICAgey4uLnJlZi5taWQod2lkdGgpfSxcbiAgICAgIGRlZmF1bHRTaXplUmVmKG1hcmtEZWYsIHhTY2FsZU5hbWUsIHhTY2FsZSwgY29uZmlnKVxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24geShtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHtjb25maWcsIGVuY29kaW5nLCBoZWlnaHQsIG1hcmtEZWZ9ID0gbW9kZWw7XG4gIGNvbnN0IG9yaWVudCA9IG1hcmtEZWYub3JpZW50O1xuICBjb25zdCBzaXplRGVmID0gZW5jb2Rpbmcuc2l6ZTtcblxuICBjb25zdCB5RGVmID0gZW5jb2RpbmcueTtcbiAgY29uc3QgeTJEZWYgPSBlbmNvZGluZy55MjtcbiAgY29uc3QgeVNjYWxlTmFtZSA9IG1vZGVsLnNjYWxlTmFtZShZKTtcbiAgY29uc3QgeVNjYWxlID0gbW9kZWwuZ2V0U2NhbGVDb21wb25lbnQoWSk7XG5cbiAgLy8geSwgeTIgJiBoZWlnaHQgLS0gd2UgbXVzdCBzcGVjaWZ5IHR3byBvZiB0aGVzZSBpbiBhbGwgY29uZGl0aW9uc1xuICBpZiAob3JpZW50ID09PSAndmVydGljYWwnIHx8IHkyRGVmKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsICd6ZXJvT3JNaW4nKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd5MicpLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRmllbGREZWYoeURlZikpIHtcbiAgICAgIGNvbnN0IHlTY2FsZVR5cGUgPSB5U2NhbGUuZ2V0KCd0eXBlJyk7XG4gICAgICBpZiAoeURlZi5iaW4gJiYgIXNpemVEZWYgJiYgIWhhc0Rpc2NyZXRlRG9tYWluKHlTY2FsZVR5cGUpKSB7XG4gICAgICAgIHJldHVybiBtaXhpbnMuYmlubmVkUG9zaXRpb24oXG4gICAgICAgICAgeURlZiwgJ3knLCBtb2RlbC5zY2FsZU5hbWUoJ3knKSxcbiAgICAgICAgICBtYXJrRGVmLmJpblNwYWNpbmcgPT09IHVuZGVmaW5lZCA/IGNvbmZpZy5iYXIuYmluU3BhY2luZyA6IG1hcmtEZWYuYmluU3BhY2luZyxcbiAgICAgICAgICB5U2NhbGUuZ2V0KCdyZXZlcnNlJylcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoeVNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLkJBTkQpIHtcbiAgICAgICAgcmV0dXJuIG1peGlucy5iYW5kUG9zaXRpb24oeURlZiwgJ3knLCBtb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtaXhpbnMuY2VudGVyZWRCYW5kUG9zaXRpb24oJ3knLCBtb2RlbCwgcmVmLm1pZChoZWlnaHQpLFxuICAgICAgZGVmYXVsdFNpemVSZWYobWFya0RlZiwgeVNjYWxlTmFtZSwgeVNjYWxlLCBjb25maWcpXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0U2l6ZVJlZihtYXJrRGVmOiBNYXJrRGVmLCBzY2FsZU5hbWU6IHN0cmluZywgc2NhbGU6IFNjYWxlQ29tcG9uZW50LCBjb25maWc6IENvbmZpZyk6IFZnVmFsdWVSZWYge1xuICBpZiAobWFya0RlZi5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge3ZhbHVlOiBtYXJrRGVmLnNpemV9O1xuICB9IGVsc2UgaWYgKGNvbmZpZy5iYXIuZGlzY3JldGVCYW5kU2l6ZSkge1xuICAgIHJldHVybiB7dmFsdWU6IGNvbmZpZy5iYXIuZGlzY3JldGVCYW5kU2l6ZX07XG4gIH0gZWxzZSBpZiAoc2NhbGUpIHtcbiAgICBjb25zdCBzY2FsZVR5cGUgPSBzY2FsZS5nZXQoJ3R5cGUnKTtcbiAgICBpZiAoc2NhbGVUeXBlID09PSBTY2FsZVR5cGUuUE9JTlQpIHtcbiAgICAgIGNvbnN0IHNjYWxlUmFuZ2UgPSBzY2FsZS5nZXQoJ3JhbmdlJyk7XG4gICAgICBpZiAoaXNWZ1JhbmdlU3RlcChzY2FsZVJhbmdlKSAmJiBpc051bWJlcihzY2FsZVJhbmdlLnN0ZXApKSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IHNjYWxlUmFuZ2Uuc3RlcCAtIDF9O1xuICAgICAgfVxuICAgICAgbG9nLndhcm4obG9nLm1lc3NhZ2UuQkFSX1dJVEhfUE9JTlRfU0NBTEVfQU5EX1JBTkdFU1RFUF9OVUxMKTtcbiAgICB9IGVsc2UgaWYgKHNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLkJBTkQpIHtcbiAgICAgIHJldHVybiByZWYuYmFuZFJlZihzY2FsZU5hbWUpO1xuICAgIH0gZWxzZSB7IC8vIG5vbi1vcmRpbmFsIHNjYWxlXG4gICAgICByZXR1cm4ge3ZhbHVlOiBjb25maWcuYmFyLmNvbnRpbnVvdXNCYW5kU2l6ZX07XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXAgJiYgY29uZmlnLnNjYWxlLnJhbmdlU3RlcCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB7dmFsdWU6IGNvbmZpZy5zY2FsZS5yYW5nZVN0ZXAgLSAxfTtcbiAgfVxuICByZXR1cm4ge3ZhbHVlOiAyMH07XG59XG5cbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport * as mixins from './mixins';\nimport { isFieldDef, vgField } from '../../fielddef';\nimport { GEOJSON } from '../../type';\nexport var geoshape = {\n vgMark: 'shape',\n encodeEntry: function (model) {\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }));\n },\n postEncodingTransform: function (model) {\n var encoding = model.encoding;\n var shapeDef = encoding.shape;\n var transform = tslib_1.__assign({ type: 'geoshape', projection: model.projectionName() }, (shapeDef && isFieldDef(shapeDef) && shapeDef.type === GEOJSON ? { field: vgField(shapeDef, { expr: 'datum' }) } : {}));\n return [transform];\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2Vvc2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL2dlb3NoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxPQUFPLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFJbkMsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFpQjtJQUNwQyxNQUFNLEVBQUUsT0FBTztJQUNmLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQzVCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDcEU7SUFDSixDQUFDO0lBQ0QscUJBQXFCLEVBQUUsVUFBQyxLQUFnQjtRQUMvQixJQUFBLHlCQUFRLENBQVU7UUFDekIsSUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUVoQyxJQUFNLFNBQVMsc0JBQ2IsSUFBSSxFQUFFLFVBQVUsRUFDaEIsVUFBVSxFQUFFLEtBQUssQ0FBQyxjQUFjLEVBQUUsSUFFL0IsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ3RILENBQUM7UUFDRixPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuXG5pbXBvcnQge2lzRmllbGREZWYsIHZnRmllbGR9IGZyb20gJy4uLy4uL2ZpZWxkZGVmJztcbmltcG9ydCB7R0VPSlNPTn0gZnJvbSAnLi4vLi4vdHlwZSc7XG5pbXBvcnQge1ZnR2VvU2hhcGVUcmFuc2Zvcm0sIFZnUG9zdEVuY29kaW5nVHJhbnNmb3JtfSBmcm9tICcuLi8uLi92ZWdhLnNjaGVtYSc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGNvbnN0IGdlb3NoYXBlOiBNYXJrQ29tcGlsZXIgPSB7XG4gIHZnTWFyazogJ3NoYXBlJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pXG4gICAgfTtcbiAgfSxcbiAgcG9zdEVuY29kaW5nVHJhbnNmb3JtOiAobW9kZWw6IFVuaXRNb2RlbCk6IFZnUG9zdEVuY29kaW5nVHJhbnNmb3JtW10gPT4ge1xuICAgIGNvbnN0IHtlbmNvZGluZ30gPSBtb2RlbDtcbiAgICBjb25zdCBzaGFwZURlZiA9IGVuY29kaW5nLnNoYXBlO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtOiBWZ0dlb1NoYXBlVHJhbnNmb3JtID0ge1xuICAgICAgdHlwZTogJ2dlb3NoYXBlJyxcbiAgICAgIHByb2plY3Rpb246IG1vZGVsLnByb2plY3Rpb25OYW1lKCksXG4gICAgICAvLyBhczogJ3NoYXBlJyxcbiAgICAgIC4uLihzaGFwZURlZiAmJiBpc0ZpZWxkRGVmKHNoYXBlRGVmKSAmJiBzaGFwZURlZi50eXBlID09PSBHRU9KU09OID8ge2ZpZWxkOiB2Z0ZpZWxkKHNoYXBlRGVmLCB7ZXhwcjogJ2RhdHVtJ30pfSA6IHt9KVxuICAgIH07XG4gICAgcmV0dXJuIFt0cmFuc2Zvcm1dO1xuICB9XG59O1xuIl19","import * as tslib_1 from \"tslib\";\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nexport var line = {\n vgMark: 'line',\n encodeEntry: function (model) {\n var width = model.width, height = model.height;\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model, {\n vgChannel: 'strokeWidth' // VL's line size is strokeWidth\n }), mixins.defined(model));\n }\n};\nexport var trail = {\n vgMark: 'trail',\n encodeEntry: function (model) {\n var width = model.width, height = model.height;\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model), mixins.defined(model));\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbGluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFFbEMsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFpQjtJQUNoQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQ3JCLElBQUEsbUJBQUssRUFBRSxxQkFBTSxDQUFVO1FBRTlCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDakUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDakQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBQ25DLFNBQVMsRUFBRSxhQUFhLENBQUUsZ0NBQWdDO1NBQzNELENBQUMsRUFDQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUN4QjtJQUNKLENBQUM7Q0FDRixDQUFDO0FBR0YsTUFBTSxDQUFDLElBQU0sS0FBSyxHQUFpQjtJQUNqQyxNQUFNLEVBQUUsT0FBTztJQUNmLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQ3JCLElBQUEsbUJBQUssRUFBRSxxQkFBTSxDQUFVO1FBRTlCLDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDbEUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDaEQsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsRUFDakQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQ2pDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQ3hCO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cbmV4cG9ydCBjb25zdCBsaW5lOiBNYXJrQ29tcGlsZXIgPSB7XG4gIHZnTWFyazogJ2xpbmUnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICBjb25zdCB7d2lkdGgsIGhlaWdodH0gPSBtb2RlbDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2lnbm9yZScsIG9yaWVudDogJ2lnbm9yZSd9KSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsIHJlZi5taWQod2lkdGgpKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsIHJlZi5taWQoaGVpZ2h0KSksXG4gICAgICAuLi5taXhpbnMubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge1xuICAgICAgICB2Z0NoYW5uZWw6ICdzdHJva2VXaWR0aCcgIC8vIFZMJ3MgbGluZSBzaXplIGlzIHN0cm9rZVdpZHRoXG4gICAgICB9KSxcbiAgICAgIC4uLm1peGlucy5kZWZpbmVkKG1vZGVsKVxuICAgIH07XG4gIH1cbn07XG5cblxuZXhwb3J0IGNvbnN0IHRyYWlsOiBNYXJrQ29tcGlsZXIgPSB7XG4gIHZnTWFyazogJ3RyYWlsJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge3dpZHRoLCBoZWlnaHR9ID0gbW9kZWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpbmNsdWRlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3gnLCBtb2RlbCwgcmVmLm1pZCh3aWR0aCkpLFxuICAgICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3knLCBtb2RlbCwgcmVmLm1pZChoZWlnaHQpKSxcbiAgICAgIC4uLm1peGlucy5ub25Qb3NpdGlvbignc2l6ZScsIG1vZGVsKSxcbiAgICAgIC4uLm1peGlucy5kZWZpbmVkKG1vZGVsKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { getMarkConfig } from '../common';\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nfunction encodeEntry(model, fixedShape) {\n var config = model.config, width = model.width, height = model.height;\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'include', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.nonPosition('size', model), shapeMixins(model, config, fixedShape));\n}\nexport function shapeMixins(model, config, fixedShape) {\n if (fixedShape) {\n return { shape: { value: fixedShape } };\n }\n return mixins.nonPosition('shape', model, { defaultValue: getMarkConfig('shape', model.markDef, config) });\n}\nexport var point = {\n vgMark: 'symbol',\n encodeEntry: function (model) {\n return encodeEntry(model);\n }\n};\nexport var circle = {\n vgMark: 'symbol',\n encodeEntry: function (model) {\n return encodeEntry(model, 'circle');\n }\n};\nexport var square = {\n vgMark: 'symbol',\n encodeEntry: function (model) {\n return encodeEntry(model, 'square');\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9pbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcGlsZS9tYXJrL3BvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBR2xDLHFCQUFxQixLQUFnQixFQUFFLFVBQWdDO0lBQzlELElBQUEscUJBQU0sRUFBRSxtQkFBSyxFQUFFLHFCQUFNLENBQVU7SUFFdEMsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNsRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNqRCxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFDakMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLEVBQ3pDO0FBQ0osQ0FBQztBQUVELE1BQU0sc0JBQXNCLEtBQWdCLEVBQUUsTUFBYyxFQUFFLFVBQWdDO0lBQzVGLElBQUksVUFBVSxFQUFFO1FBQ2QsT0FBTyxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsRUFBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxZQUFZLEVBQUUsYUFBYSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBVyxFQUFDLENBQUMsQ0FBQztBQUNySCxDQUFDO0FBRUQsTUFBTSxDQUFDLElBQU0sS0FBSyxHQUFpQjtJQUNqQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1QixPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxJQUFNLE1BQU0sR0FBaUI7SUFDbEMsTUFBTSxFQUFFLFFBQVE7SUFDaEIsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDNUIsT0FBTyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLElBQU0sTUFBTSxHQUFpQjtJQUNsQyxNQUFNLEVBQUUsUUFBUTtJQUNoQixXQUFXLEVBQUUsVUFBQyxLQUFnQjtRQUM1QixPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7VmdFbmNvZGVFbnRyeX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtnZXRNYXJrQ29uZmlnfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtNYXJrQ29tcGlsZXJ9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuaW1wb3J0ICogYXMgcmVmIGZyb20gJy4vdmFsdWVyZWYnO1xuXG5cbmZ1bmN0aW9uIGVuY29kZUVudHJ5KG1vZGVsOiBVbml0TW9kZWwsIGZpeGVkU2hhcGU/OiAnY2lyY2xlJyB8ICdzcXVhcmUnKSB7XG4gIGNvbnN0IHtjb25maWcsIHdpZHRoLCBoZWlnaHR9ID0gbW9kZWw7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2luY2x1ZGUnLCBvcmllbnQ6ICdpZ25vcmUnfSksXG4gICAgLi4ubWl4aW5zLnBvaW50UG9zaXRpb24oJ3gnLCBtb2RlbCwgcmVmLm1pZCh3aWR0aCkpLFxuICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsIHJlZi5taWQoaGVpZ2h0KSksXG4gICAgLi4ubWl4aW5zLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwpLFxuICAgIC4uLnNoYXBlTWl4aW5zKG1vZGVsLCBjb25maWcsIGZpeGVkU2hhcGUpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhcGVNaXhpbnMobW9kZWw6IFVuaXRNb2RlbCwgY29uZmlnOiBDb25maWcsIGZpeGVkU2hhcGU/OiAnY2lyY2xlJyB8ICdzcXVhcmUnKTogVmdFbmNvZGVFbnRyeSB7XG4gIGlmIChmaXhlZFNoYXBlKSB7XG4gICAgcmV0dXJuIHtzaGFwZToge3ZhbHVlOiBmaXhlZFNoYXBlfX07XG4gIH1cbiAgcmV0dXJuIG1peGlucy5ub25Qb3NpdGlvbignc2hhcGUnLCBtb2RlbCwge2RlZmF1bHRWYWx1ZTogZ2V0TWFya0NvbmZpZygnc2hhcGUnLCBtb2RlbC5tYXJrRGVmLCBjb25maWcpIGFzIHN0cmluZ30pO1xufVxuXG5leHBvcnQgY29uc3QgcG9pbnQ6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAnc3ltYm9sJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIGVuY29kZUVudHJ5KG1vZGVsKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNpcmNsZTogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdzeW1ib2wnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICByZXR1cm4gZW5jb2RlRW50cnkobW9kZWwsICdjaXJjbGUnKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZTogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdzeW1ib2wnLFxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICByZXR1cm4gZW5jb2RlRW50cnkobW9kZWwsICdzcXVhcmUnKTtcbiAgfVxufTtcbiJdfQ==","import * as tslib_1 from \"tslib\";\nimport { X, Y } from '../../channel';\nimport { isFieldDef } from '../../fielddef';\nimport * as log from '../../log';\nimport { RECT } from '../../mark';\nimport { hasDiscreteDomain, ScaleType } from '../../scale';\nimport * as mixins from './mixins';\nexport var rect = {\n vgMark: 'rect',\n encodeEntry: function (model) {\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), x(model), y(model));\n }\n};\nexport function x(model) {\n var xDef = model.encoding.x;\n var x2Def = model.encoding.x2;\n var xScale = model.getScaleComponent(X);\n var xScaleType = xScale ? xScale.get('type') : undefined;\n if (isFieldDef(xDef) && xDef.bin && !x2Def) {\n return mixins.binnedPosition(xDef, 'x', model.scaleName('x'), 0, xScale.get('reverse'));\n }\n else if (isFieldDef(xDef) && xScale && hasDiscreteDomain(xScaleType)) {\n /* istanbul ignore else */\n if (xScaleType === ScaleType.BAND) {\n return mixins.bandPosition(xDef, 'x', model);\n }\n else {\n // We don't support rect mark with point/ordinal scale\n throw new Error(log.message.scaleTypeNotWorkWithMark(RECT, xScaleType));\n }\n }\n else { // continuous scale or no scale\n return tslib_1.__assign({}, mixins.pointPosition('x', model, 'zeroOrMax'), mixins.pointPosition2(model, 'zeroOrMin', 'x2'));\n }\n}\nexport function y(model) {\n var yDef = model.encoding.y;\n var y2Def = model.encoding.y2;\n var yScale = model.getScaleComponent(Y);\n var yScaleType = yScale ? yScale.get('type') : undefined;\n if (isFieldDef(yDef) && yDef.bin && !y2Def) {\n return mixins.binnedPosition(yDef, 'y', model.scaleName('y'), 0, yScale.get('reverse'));\n }\n else if (isFieldDef(yDef) && yScale && hasDiscreteDomain(yScaleType)) {\n /* istanbul ignore else */\n if (yScaleType === ScaleType.BAND) {\n return mixins.bandPosition(yDef, 'y', model);\n }\n else {\n // We don't support rect mark with point/ordinal scale\n throw new Error(log.message.scaleTypeNotWorkWithMark(RECT, yScaleType));\n }\n }\n else { // continuous scale or no scale\n return tslib_1.__assign({}, mixins.pointPosition('y', model, 'zeroOrMax'), mixins.pointPosition2(model, 'zeroOrMin', 'y2'));\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvcmVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUl6RCxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUVuQyxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQWlCO0lBQ2hDLE1BQU0sRUFBRSxNQUFNO0lBQ2QsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDNUIsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNqRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQ1IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUNYO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFlBQVksS0FBZ0I7SUFDaEMsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDaEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTNELElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDMUMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQ3pGO1NBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3RFLDBCQUEwQjtRQUMxQixJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxzREFBc0Q7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO0tBQ0Y7U0FBTSxFQUFFLCtCQUErQjtRQUN0Qyw0QkFDSyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFDbEQ7S0FDSDtBQUNILENBQUM7QUFFRCxNQUFNLFlBQVksS0FBZ0I7SUFDaEMsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDOUIsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7SUFDaEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFDLElBQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRTNELElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDMUMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQ3pGO1NBQU0sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3RFLDBCQUEwQjtRQUMxQixJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFO1lBQ2pDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzlDO2FBQU07WUFDTCxzREFBc0Q7WUFDdEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO0tBQ0Y7U0FBTSxFQUFFLCtCQUErQjtRQUN0Qyw0QkFDSyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLEVBQzdDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFDbEQ7S0FDSDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1gsIFl9IGZyb20gJy4uLy4uL2NoYW5uZWwnO1xuaW1wb3J0IHtpc0ZpZWxkRGVmfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSAnLi4vLi4vbG9nJztcbmltcG9ydCB7UkVDVH0gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge2hhc0Rpc2NyZXRlRG9tYWluLCBTY2FsZVR5cGV9IGZyb20gJy4uLy4uL3NjYWxlJztcbmltcG9ydCB7VmdFbmNvZGVFbnRyeX0gZnJvbSAnLi4vLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtNYXJrQ29tcGlsZXJ9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuXG5leHBvcnQgY29uc3QgcmVjdDogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdyZWN0JyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuICAgICAgLi4ueChtb2RlbCksXG4gICAgICAuLi55KG1vZGVsKSxcbiAgICB9O1xuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24geChtb2RlbDogVW5pdE1vZGVsKTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHhEZWYgPSBtb2RlbC5lbmNvZGluZy54O1xuICBjb25zdCB4MkRlZiA9IG1vZGVsLmVuY29kaW5nLngyO1xuICBjb25zdCB4U2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChYKTtcbiAgY29uc3QgeFNjYWxlVHlwZSA9IHhTY2FsZSA/IHhTY2FsZS5nZXQoJ3R5cGUnKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiB4RGVmLmJpbiAmJiAheDJEZWYpIHtcbiAgICByZXR1cm4gbWl4aW5zLmJpbm5lZFBvc2l0aW9uKHhEZWYsICd4JywgbW9kZWwuc2NhbGVOYW1lKCd4JyksIDAsIHhTY2FsZS5nZXQoJ3JldmVyc2UnKSk7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih4RGVmKSAmJiB4U2NhbGUgJiYgaGFzRGlzY3JldGVEb21haW4oeFNjYWxlVHlwZSkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh4U2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgcmV0dXJuIG1peGlucy5iYW5kUG9zaXRpb24oeERlZiwgJ3gnLCBtb2RlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVjdCBtYXJrIHdpdGggcG9pbnQvb3JkaW5hbCBzY2FsZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLnNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhSRUNULCB4U2NhbGVUeXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBjb250aW51b3VzIHNjYWxlIG9yIG5vIHNjYWxlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsICd6ZXJvT3JNYXgnKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd4MicpXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24geShtb2RlbDogVW5pdE1vZGVsKTogVmdFbmNvZGVFbnRyeSB7XG4gIGNvbnN0IHlEZWYgPSBtb2RlbC5lbmNvZGluZy55O1xuICBjb25zdCB5MkRlZiA9IG1vZGVsLmVuY29kaW5nLnkyO1xuICBjb25zdCB5U2NhbGUgPSBtb2RlbC5nZXRTY2FsZUNvbXBvbmVudChZKTtcbiAgY29uc3QgeVNjYWxlVHlwZSA9IHlTY2FsZSA/IHlTY2FsZS5nZXQoJ3R5cGUnKSA6IHVuZGVmaW5lZDtcblxuICBpZiAoaXNGaWVsZERlZih5RGVmKSAmJiB5RGVmLmJpbiAmJiAheTJEZWYpIHtcbiAgICByZXR1cm4gbWl4aW5zLmJpbm5lZFBvc2l0aW9uKHlEZWYsICd5JywgbW9kZWwuc2NhbGVOYW1lKCd5JyksIDAsIHlTY2FsZS5nZXQoJ3JldmVyc2UnKSk7XG4gIH0gZWxzZSBpZiAoaXNGaWVsZERlZih5RGVmKSAmJiB5U2NhbGUgJiYgaGFzRGlzY3JldGVEb21haW4oeVNjYWxlVHlwZSkpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh5U2NhbGVUeXBlID09PSBTY2FsZVR5cGUuQkFORCkge1xuICAgICAgcmV0dXJuIG1peGlucy5iYW5kUG9zaXRpb24oeURlZiwgJ3knLCBtb2RlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVjdCBtYXJrIHdpdGggcG9pbnQvb3JkaW5hbCBzY2FsZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLnNjYWxlVHlwZU5vdFdvcmtXaXRoTWFyayhSRUNULCB5U2NhbGVUeXBlKSk7XG4gICAgfVxuICB9IGVsc2UgeyAvLyBjb250aW51b3VzIHNjYWxlIG9yIG5vIHNjYWxlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd5JywgbW9kZWwsICd6ZXJvT3JNYXgnKSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1pbicsICd5MicpXG4gICAgfTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nexport var rule = {\n vgMark: 'rule',\n encodeEntry: function (model) {\n var _config = model.config, markDef = model.markDef, width = model.width, height = model.height;\n var orient = markDef.orient;\n if (!model.encoding.x && !model.encoding.y && !model.encoding.latitude && !model.encoding.longitude) {\n // Show nothing if we have none of x, y, lat, and long.\n return {};\n }\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, orient === 'horizontal' ? 'zeroOrMin' : ref.mid(width)), mixins.pointPosition('y', model, orient === 'vertical' ? 'zeroOrMin' : ref.mid(height)), (orient !== 'vertical' ? mixins.pointPosition2(model, 'zeroOrMax', 'x2') : {}), (orient !== 'horizontal' ? mixins.pointPosition2(model, 'zeroOrMax', 'y2') : {}), mixins.nonPosition('size', model, {\n vgChannel: 'strokeWidth',\n defaultValue: markDef.size\n }));\n }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvcnVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxLQUFLLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFFbEMsTUFBTSxDQUFDLElBQU0sSUFBSSxHQUFpQjtJQUNoQyxNQUFNLEVBQUUsTUFBTTtJQUNkLFdBQVcsRUFBRSxVQUFDLEtBQWdCO1FBQ3JCLElBQUEsc0JBQWUsRUFBRSx1QkFBTyxFQUFFLG1CQUFLLEVBQUUscUJBQU0sQ0FBVTtRQUN4RCxJQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRTtZQUNuRyx1REFBdUQ7WUFDdkQsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUVELDRCQUNLLE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsRUFDakUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUN4RixNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBR3ZGLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFHOUUsQ0FBQyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUVoRixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDbkMsU0FBUyxFQUFFLGFBQWE7WUFDeEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1NBQzNCLENBQUMsRUFDRjtJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4uL3VuaXQnO1xuaW1wb3J0IHtNYXJrQ29tcGlsZXJ9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgKiBhcyBtaXhpbnMgZnJvbSAnLi9taXhpbnMnO1xuaW1wb3J0ICogYXMgcmVmIGZyb20gJy4vdmFsdWVyZWYnO1xuXG5leHBvcnQgY29uc3QgcnVsZTogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdydWxlJyxcbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge2NvbmZpZzogX2NvbmZpZywgbWFya0RlZiwgd2lkdGgsIGhlaWdodH0gPSBtb2RlbDtcbiAgICBjb25zdCBvcmllbnQgPSBtYXJrRGVmLm9yaWVudDtcblxuICAgIGlmICghbW9kZWwuZW5jb2RpbmcueCAmJiAhbW9kZWwuZW5jb2RpbmcueSAmJiAhbW9kZWwuZW5jb2RpbmcubGF0aXR1ZGUgJiYgIW1vZGVsLmVuY29kaW5nLmxvbmdpdHVkZSkge1xuICAgICAgLy8gU2hvdyBub3RoaW5nIGlmIHdlIGhhdmUgbm9uZSBvZiB4LCB5LCBsYXQsIGFuZCBsb25nLlxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5taXhpbnMuYmFzZUVuY29kZUVudHJ5KG1vZGVsLCB7c2l6ZTogJ2lnbm9yZScsIG9yaWVudDogJ2lnbm9yZSd9KSxcbiAgICAgIC4uLm1peGlucy5wb2ludFBvc2l0aW9uKCd4JywgbW9kZWwsIG9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3plcm9Pck1pbicgOiByZWYubWlkKHdpZHRoKSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCBvcmllbnQgPT09ICd2ZXJ0aWNhbCcgPyAnemVyb09yTWluJyA6IHJlZi5taWQoaGVpZ2h0KSksXG5cbiAgICAgIC8vIGluY2x1ZGUgeDIgZm9yIGhvcml6b250YWwgb3IgbGluZSBzZWdtZW50IHJ1bGVcbiAgICAgIC4uLihvcmllbnQgIT09ICd2ZXJ0aWNhbCcgPyBtaXhpbnMucG9pbnRQb3NpdGlvbjIobW9kZWwsICd6ZXJvT3JNYXgnLCAneDInKSA6IHt9KSxcblxuICAgICAgLy8gaW5jbHVkZSB5MiBmb3IgdmVydGljYWwgb3IgbGluZSBzZWdtZW50IHJ1bGVcbiAgICAgIC4uLihvcmllbnQgIT09ICdob3Jpem9udGFsJyA/IG1peGlucy5wb2ludFBvc2l0aW9uMihtb2RlbCwgJ3plcm9Pck1heCcsICd5MicpIDoge30pLFxuXG4gICAgICAuLi5taXhpbnMubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge1xuICAgICAgICB2Z0NoYW5uZWw6ICdzdHJva2VXaWR0aCcsICAvLyBWTCdzIHJ1bGUgc2l6ZSBpcyBzdHJva2VXaWR0aFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG1hcmtEZWYuc2l6ZVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59O1xuIl19","import * as tslib_1 from \"tslib\";\nimport { getMarkConfig } from '../common';\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nexport var text = {\n vgMark: 'text',\n encodeEntry: function (model) {\n var config = model.config, encoding = model.encoding, width = model.width, height = model.height, markDef = model.markDef;\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width)), mixins.pointPosition('y', model, ref.mid(height)), mixins.text(model), mixins.nonPosition('size', model, tslib_1.__assign({}, (markDef.size ? { defaultValue: markDef.size } : {}), { vgChannel: 'fontSize' // VL's text size is fontSize\n })), mixins.valueIfDefined('align', align(model.markDef, encoding, config)));\n }\n};\nfunction align(markDef, encoding, config) {\n var a = markDef.align || getMarkConfig('align', markDef, config);\n if (a === undefined) {\n return 'center';\n }\n // If there is a config, Vega-parser will process this already.\n return undefined;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUd4QyxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsQ0FBQztBQUNuQyxPQUFPLEtBQUssR0FBRyxNQUFNLFlBQVksQ0FBQztBQUdsQyxNQUFNLENBQUMsSUFBTSxJQUFJLEdBQWlCO0lBQ2hDLE1BQU0sRUFBRSxNQUFNO0lBRWQsV0FBVyxFQUFFLFVBQUMsS0FBZ0I7UUFDckIsSUFBQSxxQkFBTSxFQUFFLHlCQUFRLEVBQUUsbUJBQUssRUFBRSxxQkFBTSxFQUFFLHVCQUFPLENBQVU7UUFFekQsNEJBQ0ssTUFBTSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxFQUNqRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNoRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNqRCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLHVCQUM5QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQ3JELFNBQVMsRUFBRSxVQUFVLENBQUUsNkJBQTZCO1lBQ3BELEVBQ0MsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQ3pFO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFDRixlQUFlLE9BQWdCLEVBQUUsUUFBMEIsRUFBRSxNQUFjO0lBQ3pFLElBQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkUsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ25CLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0lBQ0QsK0RBQStEO0lBQy9ELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4uLy4uL2VuY29kaW5nJztcbmltcG9ydCB7TWFya0RlZn0gZnJvbSAnLi4vLi4vbWFyayc7XG5pbXBvcnQge2dldE1hcmtDb25maWd9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge1VuaXRNb2RlbH0gZnJvbSAnLi4vdW5pdCc7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCAqIGFzIG1peGlucyBmcm9tICcuL21peGlucyc7XG5pbXBvcnQgKiBhcyByZWYgZnJvbSAnLi92YWx1ZXJlZic7XG5cblxuZXhwb3J0IGNvbnN0IHRleHQ6IE1hcmtDb21waWxlciA9IHtcbiAgdmdNYXJrOiAndGV4dCcsXG5cbiAgZW5jb2RlRW50cnk6IChtb2RlbDogVW5pdE1vZGVsKSA9PiB7XG4gICAgY29uc3Qge2NvbmZpZywgZW5jb2RpbmcsIHdpZHRoLCBoZWlnaHQsIG1hcmtEZWZ9ID0gbW9kZWw7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubWl4aW5zLmJhc2VFbmNvZGVFbnRyeShtb2RlbCwge3NpemU6ICdpZ25vcmUnLCBvcmllbnQ6ICdpZ25vcmUnfSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneCcsIG1vZGVsLCByZWYubWlkKHdpZHRoKSksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCByZWYubWlkKGhlaWdodCkpLFxuICAgICAgLi4ubWl4aW5zLnRleHQobW9kZWwpLFxuICAgICAgLi4ubWl4aW5zLm5vblBvc2l0aW9uKCdzaXplJywgbW9kZWwsIHtcbiAgICAgICAgLi4uKG1hcmtEZWYuc2l6ZSA/IHtkZWZhdWx0VmFsdWU6IG1hcmtEZWYuc2l6ZX0gOiB7fSksXG4gICAgICAgIHZnQ2hhbm5lbDogJ2ZvbnRTaXplJyAgLy8gVkwncyB0ZXh0IHNpemUgaXMgZm9udFNpemVcbiAgICAgIH0pLFxuICAgICAgLi4ubWl4aW5zLnZhbHVlSWZEZWZpbmVkKCdhbGlnbicsIGFsaWduKG1vZGVsLm1hcmtEZWYsIGVuY29kaW5nLCBjb25maWcpKVxuICAgIH07XG4gIH1cbn07XG5mdW5jdGlvbiBhbGlnbihtYXJrRGVmOiBNYXJrRGVmLCBlbmNvZGluZzogRW5jb2Rpbmc8c3RyaW5nPiwgY29uZmlnOiBDb25maWcpIHtcbiAgY29uc3QgYSA9IG1hcmtEZWYuYWxpZ24gfHwgZ2V0TWFya0NvbmZpZygnYWxpZ24nLCBtYXJrRGVmLCBjb25maWcpO1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdjZW50ZXInO1xuICB9XG4gIC8vIElmIHRoZXJlIGlzIGEgY29uZmlnLCBWZWdhLXBhcnNlciB3aWxsIHByb2Nlc3MgdGhpcyBhbHJlYWR5LlxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isVgRangeStep } from '../../vega.schema';\nimport * as mixins from './mixins';\nimport * as ref from './valueref';\nexport var tick = {\n vgMark: 'rect',\n encodeEntry: function (model) {\n var _a;\n var config = model.config, markDef = model.markDef, width = model.width, height = model.height;\n var orient = markDef.orient;\n var vgSizeChannel = orient === 'horizontal' ? 'width' : 'height';\n var vgThicknessChannel = orient === 'horizontal' ? 'height' : 'width';\n return tslib_1.__assign({}, mixins.baseEncodeEntry(model, { size: 'ignore', orient: 'ignore' }), mixins.pointPosition('x', model, ref.mid(width), 'xc'), mixins.pointPosition('y', model, ref.mid(height), 'yc'), mixins.nonPosition('size', model, {\n defaultValue: defaultSize(model),\n vgChannel: vgSizeChannel\n }), (_a = {}, _a[vgThicknessChannel] = { value: markDef.thickness || config.tick.thickness }, _a));\n }\n};\nfunction defaultSize(model) {\n var config = model.config, markDef = model.markDef;\n var orient = markDef.orient;\n var scale = model.getScaleComponent(orient === 'horizontal' ? 'x' : 'y');\n if (markDef.size !== undefined) {\n return markDef.size;\n }\n else if (config.tick.bandSize !== undefined) {\n return config.tick.bandSize;\n }\n else {\n var scaleRange = scale ? scale.get('range') : undefined;\n var rangeStep = scaleRange && isVgRangeStep(scaleRange) ?\n scaleRange.step :\n config.scale.rangeStep;\n if (typeof rangeStep !== 'number') {\n // FIXME consolidate this log\n throw new Error('Function does not handle non-numeric rangeStep');\n }\n return rangeStep / 1.5;\n }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGljay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvdGljay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR2hELE9BQU8sS0FBSyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBQ25DLE9BQU8sS0FBSyxHQUFHLE1BQU0sWUFBWSxDQUFDO0FBR2xDLE1BQU0sQ0FBQyxJQUFNLElBQUksR0FBaUI7SUFDaEMsTUFBTSxFQUFFLE1BQU07SUFFZCxXQUFXLEVBQUUsVUFBQyxLQUFnQjs7UUFDckIsSUFBQSxxQkFBTSxFQUFFLHVCQUFPLEVBQUUsbUJBQUssRUFBRSxxQkFBTSxDQUFVO1FBQy9DLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFFOUIsSUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDbkUsSUFBTSxrQkFBa0IsR0FBRyxNQUFNLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUV4RSw0QkFDSyxNQUFNLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLEVBRWpFLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUN0RCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsRUFHdkQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBQ25DLFlBQVksRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxhQUFhO1NBQ3pCLENBQUMsZUFDRCxrQkFBa0IsSUFBRyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLE9BQ3pFO0lBQ0osQ0FBQztDQUNGLENBQUM7QUFFRixxQkFBcUIsS0FBZ0I7SUFDNUIsSUFBQSxxQkFBTSxFQUFFLHVCQUFPLENBQVU7SUFDaEMsSUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM5QixJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUUzRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQzlCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztLQUNyQjtTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7S0FDN0I7U0FBTTtRQUNMLElBQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzFELElBQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN6RCxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDekIsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLEVBQUU7WUFDakMsNkJBQTZCO1lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztTQUNuRTtRQUNELE9BQU8sU0FBUyxHQUFHLEdBQUcsQ0FBQztLQUN4QjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2lzVmdSYW5nZVN0ZXB9IGZyb20gJy4uLy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7TWFya0NvbXBpbGVyfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0ICogYXMgbWl4aW5zIGZyb20gJy4vbWl4aW5zJztcbmltcG9ydCAqIGFzIHJlZiBmcm9tICcuL3ZhbHVlcmVmJztcblxuXG5leHBvcnQgY29uc3QgdGljazogTWFya0NvbXBpbGVyID0ge1xuICB2Z01hcms6ICdyZWN0JyxcblxuICBlbmNvZGVFbnRyeTogKG1vZGVsOiBVbml0TW9kZWwpID0+IHtcbiAgICBjb25zdCB7Y29uZmlnLCBtYXJrRGVmLCB3aWR0aCwgaGVpZ2h0fSA9IG1vZGVsO1xuICAgIGNvbnN0IG9yaWVudCA9IG1hcmtEZWYub3JpZW50O1xuXG4gICAgY29uc3QgdmdTaXplQ2hhbm5lbCA9IG9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIGNvbnN0IHZnVGhpY2tuZXNzQ2hhbm5lbCA9IG9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1peGlucy5iYXNlRW5jb2RlRW50cnkobW9kZWwsIHtzaXplOiAnaWdub3JlJywgb3JpZW50OiAnaWdub3JlJ30pLFxuXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneCcsIG1vZGVsLCByZWYubWlkKHdpZHRoKSwgJ3hjJyksXG4gICAgICAuLi5taXhpbnMucG9pbnRQb3NpdGlvbigneScsIG1vZGVsLCByZWYubWlkKGhlaWdodCksICd5YycpLFxuXG4gICAgICAvLyBzaXplIC8gdGhpY2tuZXNzID0+IHdpZHRoIC8gaGVpZ2h0XG4gICAgICAuLi5taXhpbnMubm9uUG9zaXRpb24oJ3NpemUnLCBtb2RlbCwge1xuICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRTaXplKG1vZGVsKSxcbiAgICAgICAgdmdDaGFubmVsOiB2Z1NpemVDaGFubmVsXG4gICAgICB9KSxcbiAgICAgIFt2Z1RoaWNrbmVzc0NoYW5uZWxdOiB7dmFsdWU6IG1hcmtEZWYudGhpY2tuZXNzIHx8IGNvbmZpZy50aWNrLnRoaWNrbmVzc30sXG4gICAgfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZGVmYXVsdFNpemUobW9kZWw6IFVuaXRNb2RlbCk6IG51bWJlciB7XG4gIGNvbnN0IHtjb25maWcsIG1hcmtEZWZ9ID0gbW9kZWw7XG4gIGNvbnN0IG9yaWVudCA9IG1hcmtEZWYub3JpZW50O1xuICBjb25zdCBzY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KG9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3gnIDogJ3knKTtcblxuICBpZiAobWFya0RlZi5zaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbWFya0RlZi5zaXplO1xuICB9IGVsc2UgaWYgKGNvbmZpZy50aWNrLmJhbmRTaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gY29uZmlnLnRpY2suYmFuZFNpemU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2NhbGVSYW5nZSA9IHNjYWxlID8gc2NhbGUuZ2V0KCdyYW5nZScpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhbmdlU3RlcCA9IHNjYWxlUmFuZ2UgJiYgaXNWZ1JhbmdlU3RlcChzY2FsZVJhbmdlKSA/XG4gICAgICBzY2FsZVJhbmdlLnN0ZXAgOlxuICAgICAgY29uZmlnLnNjYWxlLnJhbmdlU3RlcDtcbiAgICBpZiAodHlwZW9mIHJhbmdlU3RlcCAhPT0gJ251bWJlcicpIHtcbiAgICAgIC8vIEZJWE1FIGNvbnNvbGlkYXRlIHRoaXMgbG9nXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Z1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBub24tbnVtZXJpYyByYW5nZVN0ZXAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlU3RlcCAvIDEuNTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { isArray } from 'vega-util';\nimport { MAIN } from '../../data';\nimport { isAggregate } from '../../encoding';\nimport { getFieldDef, isFieldDef, isValueDef, vgField } from '../../fielddef';\nimport { AREA, isPathMark, LINE, TRAIL } from '../../mark';\nimport { isSortField } from '../../sort';\nimport { contains, keys } from '../../util';\nimport { getStyles, sortParams } from '../common';\nimport { area } from './area';\nimport { bar } from './bar';\nimport { geoshape } from './geoshape';\nimport { line, trail } from './line';\nimport { circle, point, square } from './point';\nimport { rect } from './rect';\nimport { rule } from './rule';\nimport { text } from './text';\nimport { tick } from './tick';\nvar markCompiler = {\n area: area,\n bar: bar,\n circle: circle,\n geoshape: geoshape,\n line: line,\n point: point,\n rect: rect,\n rule: rule,\n square: square,\n text: text,\n tick: tick,\n trail: trail\n};\nexport function parseMarkGroup(model) {\n if (contains([LINE, AREA, TRAIL], model.mark)) {\n return parsePathMark(model);\n }\n else {\n return getMarkGroups(model);\n }\n}\nvar FACETED_PATH_PREFIX = 'faceted_path_';\nfunction parsePathMark(model) {\n var details = pathGroupingFields(model.mark, model.encoding);\n var pathMarks = getMarkGroups(model, {\n // If has subfacet for line/area group, need to use faceted data from below.\n fromPrefix: (details.length > 0 ? FACETED_PATH_PREFIX : '')\n });\n if (details.length > 0) { // have level of details - need to facet line into subgroups\n // TODO: for non-stacked plot, map order to zindex. (Maybe rename order for layer to zindex?)\n return [{\n name: model.getName('pathgroup'),\n type: 'group',\n from: {\n facet: {\n name: FACETED_PATH_PREFIX + model.requestDataName(MAIN),\n data: model.requestDataName(MAIN),\n groupby: details,\n }\n },\n encode: {\n update: {\n width: { field: { group: 'width' } },\n height: { field: { group: 'height' } }\n }\n },\n marks: pathMarks\n }];\n }\n else {\n return pathMarks;\n }\n}\nexport function getSort(model) {\n var encoding = model.encoding, stack = model.stack, mark = model.mark, markDef = model.markDef;\n var order = encoding.order;\n if (!isArray(order) && isValueDef(order)) {\n return undefined;\n }\n else if ((isArray(order) || isFieldDef(order)) && !stack) {\n // Sort by the order field if it is specified and the field is not stacked. (For stacked field, order specify stack order.)\n return sortParams(order, { expr: 'datum' });\n }\n else if (isPathMark(mark)) {\n // For both line and area, we sort values based on dimension by default\n var dimensionChannelDef = encoding[markDef.orient === 'horizontal' ? 'y' : 'x'];\n if (isFieldDef(dimensionChannelDef)) {\n var s = dimensionChannelDef.sort;\n var sortField = isSortField(s) ?\n vgField({\n // FIXME: this op might not already exist?\n // FIXME: what if dimensionChannel (x or y) contains custom domain?\n aggregate: isAggregate(model.encoding) ? s.op : undefined,\n field: s.field\n }, { expr: 'datum' }) :\n vgField(dimensionChannelDef, {\n // For stack with imputation, we only have bin_mid\n binSuffix: model.stack && model.stack.impute ? 'mid' : undefined,\n expr: 'datum'\n });\n return {\n field: sortField,\n order: 'descending'\n };\n }\n return undefined;\n }\n return undefined;\n}\nfunction getMarkGroups(model, opt) {\n if (opt === void 0) { opt = { fromPrefix: '' }; }\n var mark = model.mark;\n var clip = model.markDef.clip !== undefined ?\n !!model.markDef.clip : scaleClip(model);\n var style = getStyles(model.markDef);\n var key = model.encoding.key;\n var sort = getSort(model);\n var postEncodingTransform = markCompiler[mark].postEncodingTransform ? markCompiler[mark].postEncodingTransform(model) : null;\n return [tslib_1.__assign({ name: model.getName('marks'), type: markCompiler[mark].vgMark }, (clip ? { clip: true } : {}), (style ? { style: style } : {}), (key ? { key: { field: key.field } } : {}), (sort ? { sort: sort } : {}), { from: { data: opt.fromPrefix + model.requestDataName(MAIN) }, encode: {\n update: markCompiler[mark].encodeEntry(model)\n } }, (postEncodingTransform ? {\n transform: postEncodingTransform\n } : {}))];\n}\n/**\n * Returns list of path grouping fields\n * that the model's spec contains.\n */\nexport function pathGroupingFields(mark, encoding) {\n return keys(encoding).reduce(function (details, channel) {\n switch (channel) {\n // x, y, x2, y2, lat, long, lat1, long2, order, tooltip, href, cursor should not cause lines to group\n case 'x':\n case 'y':\n case 'order':\n case 'tooltip':\n case 'href':\n case 'x2':\n case 'y2':\n case 'latitude':\n case 'longitude':\n case 'latitude2':\n case 'longitude2':\n // TODO: case 'cursor':\n // text, shape, shouldn't be a part of line/trail/area\n case 'text':\n case 'shape':\n return details;\n case 'detail':\n case 'key':\n var channelDef = encoding[channel];\n if (channelDef) {\n (isArray(channelDef) ? channelDef : [channelDef]).forEach(function (fieldDef) {\n if (!fieldDef.aggregate) {\n details.push(vgField(fieldDef, {}));\n }\n });\n }\n return details;\n case 'size':\n if (mark === 'trail') {\n // For trail, size should not group trail lines.\n return details;\n }\n // For line, it should group lines.\n /* tslint:disable */\n // intentional fall through\n case 'color':\n case 'fill':\n case 'stroke':\n case 'opacity':\n // TODO strokeDashOffset:\n /* tslint:enable */\n var fieldDef = getFieldDef(encoding[channel]);\n if (fieldDef && !fieldDef.aggregate) {\n details.push(vgField(fieldDef, {}));\n }\n return details;\n default:\n throw new Error(\"Bug: Channel \" + channel + \" unimplemented for line mark\");\n }\n }, []);\n}\n/**\n * If scales are bound to interval selections, we want to automatically clip\n * marks to account for panning/zooming interactions. We identify bound scales\n * by the domainRaw property, which gets added during scale parsing.\n */\nfunction scaleClip(model) {\n var xScale = model.getScaleComponent('x');\n var yScale = model.getScaleComponent('y');\n return (xScale && xScale.get('domainRaw')) ||\n (yScale && yScale.get('domainRaw')) ? true : false;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFyay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21waWxlL21hcmsvbWFyay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBVyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUUsT0FBTyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFRLEtBQUssRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWhELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFP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LEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0FycmF5fSBmcm9tICd2ZWdhLXV0aWwnO1xuaW1wb3J0IHtNQUlOfSBmcm9tICcuLi8uLi9kYXRhJztcbmltcG9ydCB7RW5jb2RpbmcsIGlzQWdncmVnYXRlfSBmcm9tICcuLi8uLi9lbmNvZGluZyc7XG5pbXBvcnQge2dldEZpZWxkRGVmLCBpc0ZpZWxkRGVmLCBpc1ZhbHVlRGVmLCB2Z0ZpZWxkfSBmcm9tICcuLi8uLi9maWVsZGRlZic7XG5pbXBvcnQge0FSRUEsIGlzUGF0aE1hcmssIExJTkUsIE1hcmssIFRSQUlMfSBmcm9tICcuLi8uLi9tYXJrJztcbmltcG9ydCB7aXNTb3J0RmllbGR9IGZyb20gJy4uLy4uL3NvcnQnO1xuaW1wb3J0IHtjb250YWlucywga2V5c30gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2dldFN0eWxlcywgc29ydFBhcmFtc30gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuLi91bml0JztcbmltcG9ydCB7YXJlYX0gZnJvbSAnLi9hcmVhJztcbmltcG9ydCB7YmFyfSBmcm9tICcuL2Jhcic7XG5pbXBvcnQge01hcmtDb21waWxlcn0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7Z2Vvc2hhcGV9IGZyb20gJy4vZ2Vvc2hhcGUnO1xuaW1wb3J0IHtsaW5lLCB0cmFpbH0gZnJvbSAnLi9saW5lJztcbmltcG9ydCB7Y2lyY2xlLCBwb2ludCwgc3F1YXJlfSBmcm9tICcuL3BvaW50JztcbmltcG9ydCB7cmVjdH0gZnJvbSAnLi9yZWN0JztcbmltcG9ydCB7cnVsZX0gZnJvbSAnLi9ydWxlJztcbmltcG9ydCB7dGV4dH0gZnJvbSAnLi90ZXh0JztcbmltcG9ydCB7dGlja30gZnJvbSAnLi90aWNrJztcblxuXG5jb25zdCBtYXJrQ29tcGlsZXI6IHtbbSBpbiBNYXJrXTogTWFya0NvbXBpbGVyfSA9IHtcbiAgYXJlYSxcbiAgYmFyLFxuICBjaXJjbGUsXG4gIGdlb3NoYXBlLFxuICBsaW5lLFxuICBwb2ludCxcbiAgcmVjdCxcbiAgcnVsZSxcbiAgc3F1YXJlLFxuICB0ZXh0LFxuICB0aWNrLFxuICB0cmFpbFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWFya0dyb3VwKG1vZGVsOiBVbml0TW9kZWwpOiBhbnlbXSB7XG4gIGlmIChjb250YWlucyhbTElORSwgQVJFQSwgVFJBSUxdLCBtb2RlbC5tYXJrKSkge1xuICAgIHJldHVybiBwYXJzZVBhdGhNYXJrKG1vZGVsKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0TWFya0dyb3Vwcyhtb2RlbCk7XG4gIH1cbn1cblxuY29uc3QgRkFDRVRFRF9QQVRIX1BSRUZJWCA9ICdmYWNldGVkX3BhdGhfJztcblxuZnVuY3Rpb24gcGFyc2VQYXRoTWFyayhtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IGRldGFpbHMgPSBwYXRoR3JvdXBpbmdGaWVsZHMobW9kZWwubWFyaywgbW9kZWwuZW5jb2RpbmcpO1xuXG4gIGNvbnN0IHBhdGhNYXJrcyA9IGdldE1hcmtHcm91cHMobW9kZWwsIHtcbiAgICAvLyBJZiBoYXMgc3ViZmFjZXQgZm9yIGxpbmUvYXJlYSBncm91cCwgbmVlZCB0byB1c2UgZmFjZXRlZCBkYXRhIGZyb20gYmVsb3cuXG4gICAgZnJvbVByZWZpeDogKGRldGFpbHMubGVuZ3RoID4gMCA/IEZBQ0VURURfUEFUSF9QUkVGSVggOiAnJylcbiAgfSk7XG5cbiAgaWYgKGRldGFpbHMubGVuZ3RoID4gMCkgeyAvLyBoYXZlIGxldmVsIG9mIGRldGFpbHMgLSBuZWVkIHRvIGZhY2V0IGxpbmUgaW50byBzdWJncm91cHNcbiAgICAvLyBUT0RPOiBmb3Igbm9uLXN0YWNrZWQgcGxvdCwgbWFwIG9yZGVyIHRvIHppbmRleC4gKE1heWJlIHJlbmFtZSBvcmRlciBmb3IgbGF5ZXIgdG8gemluZGV4PylcblxuICAgIHJldHVybiBbe1xuICAgICAgbmFtZTogbW9kZWwuZ2V0TmFtZSgncGF0aGdyb3VwJyksXG4gICAgICB0eXBlOiAnZ3JvdXAnLFxuICAgICAgZnJvbToge1xuICAgICAgICBmYWNldDoge1xuICAgICAgICAgIG5hbWU6IEZBQ0VURURfUEFUSF9QUkVGSVggKyBtb2RlbC5yZXF1ZXN0RGF0YU5hbWUoTUFJTiksXG4gICAgICAgICAgZGF0YTogbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pLFxuICAgICAgICAgIGdyb3VwYnk6IGRldGFpbHMsXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlbmNvZGU6IHtcbiAgICAgICAgdXBkYXRlOiB7XG4gICAgICAgICAgd2lkdGg6IHtmaWVsZDoge2dyb3VwOiAnd2lkdGgnfX0sXG4gICAgICAgICAgaGVpZ2h0OiB7ZmllbGQ6IHtncm91cDogJ2hlaWdodCd9fVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWFya3M6IHBhdGhNYXJrc1xuICAgIH1dO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBwYXRoTWFya3M7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvcnQobW9kZWw6IFVuaXRNb2RlbCkge1xuICBjb25zdCB7ZW5jb2RpbmcsIHN0YWNrLCBtYXJrLCBtYXJrRGVmfSA9IG1vZGVsO1xuICBjb25zdCBvcmRlciA9IGVuY29kaW5nLm9yZGVyO1xuICBpZiAoIWlzQXJyYXkob3JkZXIpICYmIGlzVmFsdWVEZWYob3JkZXIpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICgoaXNBcnJheShvcmRlcikgfHwgaXNGaWVsZERlZihvcmRlcikpICYmICFzdGFjaykge1xuICAgIC8vIFNvcnQgYnkgdGhlIG9yZGVyIGZpZWxkIGlmIGl0IGlzIHNwZWNpZmllZCBhbmQgdGhlIGZpZWxkIGlzIG5vdCBzdGFja2VkLiAoRm9yIHN0YWNrZWQgZmllbGQsIG9yZGVyIHNwZWNpZnkgc3RhY2sgb3JkZXIuKVxuICAgIHJldHVybiBzb3J0UGFyYW1zKG9yZGVyLCB7ZXhwcjogJ2RhdHVtJ30pO1xuICB9IGVsc2UgaWYgKGlzUGF0aE1hcmsobWFyaykpIHtcbiAgICAvLyBGb3IgYm90aCBsaW5lIGFuZCBhcmVhLCB3ZSBzb3J0IHZhbHVlcyBiYXNlZCBvbiBkaW1lbnNpb24gYnkgZGVmYXVsdFxuICAgIGNvbnN0IGRpbWVuc2lvbkNoYW5uZWxEZWYgPSBlbmNvZGluZ1ttYXJrRGVmLm9yaWVudCA9PT0gJ2hvcml6b250YWwnID8gJ3knIDogJ3gnXTtcbiAgICBpZiAoaXNGaWVsZERlZihkaW1lbnNpb25DaGFubmVsRGVmKSkge1xuICAgICAgY29uc3QgcyA9IGRpbWVuc2lvbkNoYW5uZWxEZWYuc29ydDtcbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IGlzU29ydEZpZWxkKHMpID9cbiAgICAgICAgdmdGaWVsZCh7XG4gICAgICAgICAgLy8gRklYTUU6IHRoaXMgb3AgbWlnaHQgbm90IGFscmVhZHkgZXhpc3Q/XG4gICAgICAgICAgLy8gRklYTUU6IHdoYXQgaWYgZGltZW5zaW9uQ2hhbm5lbCAoeCBvciB5KSBjb250YWlucyBjdXN0b20gZG9tYWluP1xuICAgICAgICAgIGFnZ3JlZ2F0ZTogaXNBZ2dyZWdhdGUobW9kZWwuZW5jb2RpbmcpID8gcy5vcCA6IHVuZGVmaW5lZCxcbiAgICAgICAgICBmaWVsZDogcy5maWVsZFxuICAgICAgICB9LCB7ZXhwcjogJ2RhdHVtJ30pIDpcbiAgICAgICAgdmdGaWVsZChkaW1lbnNpb25DaGFubmVsRGVmLCB7XG4gICAgICAgICAgLy8gRm9yIHN0YWNrIHdpdGggaW1wdXRhdGlvbiwgd2Ugb25seSBoYXZlIGJpbl9taWRcbiAgICAgICAgICBiaW5TdWZmaXg6IG1vZGVsLnN0YWNrICYmIG1vZGVsLnN0YWNrLmltcHV0ZSA/ICdtaWQnIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGV4cHI6ICdkYXR1bSdcbiAgICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBzb3J0RmllbGQsXG4gICAgICAgIG9yZGVyOiAnZGVzY2VuZGluZydcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TWFya0dyb3Vwcyhtb2RlbDogVW5pdE1vZGVsLCBvcHQ6IHtcbiAgZnJvbVByZWZpeDogc3RyaW5nXG59ID0ge2Zyb21QcmVmaXg6ICcnfSkge1xuICBjb25zdCBtYXJrID0gbW9kZWwubWFyaztcblxuICBjb25zdCBjbGlwID0gbW9kZWwubWFya0RlZi5jbGlwICE9PSB1bmRlZmluZWQgP1xuICAgICEhbW9kZWwubWFya0RlZi5jbGlwIDogc2NhbGVDbGlwKG1vZGVsKTtcbiAgY29uc3Qgc3R5bGUgPSBnZXRTdHlsZXMobW9kZWwubWFya0RlZik7XG4gIGNvbnN0IGtleSA9IG1vZGVsLmVuY29kaW5nLmtleTtcbiAgY29uc3Qgc29ydCA9IGdldFNvcnQobW9kZWwpO1xuXG4gIGNvbnN0IHBvc3RFbmNvZGluZ1RyYW5zZm9ybSA9IG1hcmtDb21waWxlclttYXJrXS5wb3N0RW5jb2RpbmdUcmFuc2Zvcm0gPyBtYXJrQ29tcGlsZXJbbWFya10ucG9zdEVuY29kaW5nVHJhbnNmb3JtKG1vZGVsKSA6IG51bGw7XG5cbiAgcmV0dXJuIFt7XG4gICAgbmFtZTogbW9kZWwuZ2V0TmFtZSgnbWFya3MnKSxcbiAgICB0eXBlOiBtYXJrQ29tcGlsZXJbbWFya10udmdNYXJrLFxuICAgIC4uLihjbGlwID8ge2NsaXA6IHRydWV9IDoge30pLFxuICAgIC4uLihzdHlsZSA/IHtzdHlsZX0gOiB7fSksXG4gICAgLi4uKGtleSA/IHtrZXk6IHtmaWVsZDoga2V5LmZpZWxkfX0gOiB7fSksXG4gICAgLi4uKHNvcnQgPyB7c29ydH0gOiB7fSksXG4gICAgZnJvbToge2RhdGE6IG9wdC5mcm9tUHJlZml4ICsgbW9kZWwucmVxdWVzdERhdGFOYW1lKE1BSU4pfSxcbiAgICBlbmNvZGU6IHtcbiAgICAgIHVwZGF0ZTogbWFya0NvbXBpbGVyW21hcmtdLmVuY29kZUVudHJ5KG1vZGVsKVxuICAgIH0sXG4gICAgLi4uKHBvc3RFbmNvZGluZ1RyYW5zZm9ybSA/IHtcbiAgICAgIHRyYW5zZm9ybTogcG9zdEVuY29kaW5nVHJhbnNmb3JtXG4gICAgfSA6IHt9KVxuICB9XTtcblxufVxuXG4vKipcbiAqIFJldHVybnMgbGlzdCBvZiBwYXRoIGdyb3VwaW5nIGZpZWxkc1xuICogdGhhdCB0aGUgbW9kZWwncyBzcGVjIGNvbnRhaW5zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aEdyb3VwaW5nRmllbGRzKG1hcms6IE1hcmssIGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+KTogc3RyaW5nW10ge1xuICByZXR1cm4ga2V5cyhlbmNvZGluZykucmVkdWNlKChkZXRhaWxzLCBjaGFubmVsKSA9PiB7XG4gICAgc3dpdGNoIChjaGFubmVsKSB7XG4gICAgICAvLyB4LCB5LCB4MiwgeTIsIGxhdCwgbG9uZywgbGF0MSwgbG9uZzIsIG9yZGVyLCB0b29sdGlwLCBocmVmLCBjdXJzb3Igc2hvdWxkIG5vdCBjYXVzZSBsaW5lcyB0byBncm91cFxuICAgICAgY2FzZSAneCc6XG4gICAgICBjYXNlICd5JzpcbiAgICAgIGNhc2UgJ29yZGVyJzpcbiAgICAgIGNhc2UgJ3Rvb2x0aXAnOlxuICAgICAgY2FzZSAnaHJlZic6XG4gICAgICBjYXNlICd4Mic6XG4gICAgICBjYXNlICd5Mic6XG5cbiAgICAgIGNhc2UgJ2xhdGl0dWRlJzpcbiAgICAgIGNhc2UgJ2xvbmdpdHVkZSc6XG4gICAgICBjYXNlICdsYXRpdHVkZTInOlxuICAgICAgY2FzZSAnbG9uZ2l0dWRlMic6XG4gICAgICAvLyBUT0RPOiBjYXNlICdjdXJzb3InOlxuXG4gICAgICAvLyB0ZXh0LCBzaGFwZSwgc2hvdWxkbid0IGJlIGEgcGFydCBvZiBsaW5lL3RyYWlsL2FyZWFcbiAgICAgIGNhc2UgJ3RleHQnOlxuICAgICAgY2FzZSAnc2hhcGUnOlxuICAgICAgICByZXR1cm4gZGV0YWlscztcblxuICAgICAgY2FzZSAnZGV0YWlsJzpcbiAgICAgIGNhc2UgJ2tleSc6XG4gICAgICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgICAgICAgaWYgKGNoYW5uZWxEZWYpIHtcbiAgICAgICAgICAoaXNBcnJheShjaGFubmVsRGVmKSA/IGNoYW5uZWxEZWYgOiBbY2hhbm5lbERlZl0pLmZvckVhY2goKGZpZWxkRGVmKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICAgICAgICBkZXRhaWxzLnB1c2godmdGaWVsZChmaWVsZERlZiwge30pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGV0YWlscztcblxuICAgICAgY2FzZSAnc2l6ZSc6XG4gICAgICAgIGlmIChtYXJrID09PSAndHJhaWwnKSB7XG4gICAgICAgICAgLy8gRm9yIHRyYWlsLCBzaXplIHNob3VsZCBub3QgZ3JvdXAgdHJhaWwgbGluZXMuXG4gICAgICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yIGxpbmUsIGl0IHNob3VsZCBncm91cCBsaW5lcy5cblxuICAgICAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgICAgIC8vIGludGVudGlvbmFsIGZhbGwgdGhyb3VnaFxuXG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICBjYXNlICdmaWxsJzpcbiAgICAgIGNhc2UgJ3N0cm9rZSc6XG4gICAgICBjYXNlICdvcGFjaXR5JzpcbiAgICAgIC8vIFRPRE8gc3Ryb2tlRGFzaE9mZnNldDpcblxuICAgICAgLyogdHNsaW50OmVuYWJsZSAqL1xuICAgICAgICBjb25zdCBmaWVsZERlZiA9IGdldEZpZWxkRGVmPHN0cmluZz4oZW5jb2RpbmdbY2hhbm5lbF0pO1xuICAgICAgICBpZiAoZmllbGREZWYgJiYgIWZpZWxkRGVmLmFnZ3JlZ2F0ZSkge1xuICAgICAgICAgIGRldGFpbHMucHVzaCh2Z0ZpZWxkKGZpZWxkRGVmLCB7fSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXRhaWxzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCdWc6IENoYW5uZWwgJHtjaGFubmVsfSB1bmltcGxlbWVudGVkIGZvciBsaW5lIG1hcmtgKTtcbiAgICB9XG4gIH0sIFtdKTtcbn1cblxuLyoqXG4gKiBJZiBzY2FsZXMgYXJlIGJvdW5kIHRvIGludGVydmFsIHNlbGVjdGlvbnMsIHdlIHdhbnQgdG8gYXV0b21hdGljYWxseSBjbGlwXG4gKiBtYXJrcyB0byBhY2NvdW50IGZvciBwYW5uaW5nL3pvb21pbmcgaW50ZXJhY3Rpb25zLiBXZSBpZGVudGlmeSBib3VuZCBzY2FsZXNcbiAqIGJ5IHRoZSBkb21haW5SYXcgcHJvcGVydHksIHdoaWNoIGdldHMgYWRkZWQgZHVyaW5nIHNjYWxlIHBhcnNpbmcuXG4gKi9cbmZ1bmN0aW9uIHNjYWxlQ2xpcChtb2RlbDogVW5pdE1vZGVsKSB7XG4gIGNvbnN0IHhTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd4Jyk7XG4gIGNvbnN0IHlTY2FsZSA9IG1vZGVsLmdldFNjYWxlQ29tcG9uZW50KCd5Jyk7XG4gIHJldHVybiAoeFNjYWxlICYmIHhTY2FsZS5nZXQoJ2RvbWFpblJhdycpKSB8fFxuICAgICh5U2NhbGUgJiYgeVNjYWxlLmdldCgnZG9tYWluUmF3JykpID8gdHJ1ZSA6IGZhbHNlO1xufVxuIl19","import * as tslib_1 from \"tslib\";\nimport { GEOPOSITION_CHANNELS, NONPOSITION_SCALE_CHANNELS, SCALE_CHANNELS, X, Y } from '../channel';\nimport * as vlEncoding from '../encoding';\nimport { normalizeEncoding } from '../encoding';\nimport { getFieldDef, hasConditionalFieldDef, isFieldDef } from '../fielddef';\nimport { GEOSHAPE, isMarkDef } from '../mark';\nimport { stack } from '../stack';\nimport { duplicate } from '../util';\nimport { parseUnitAxis } from './axis/parse';\nimport { parseData } from './data/parse';\nimport { assembleLayoutSignals } from './layoutsize/assemble';\nimport { parseUnitLayoutSize } from './layoutsize/parse';\nimport { normalizeMarkDef } from './mark/init';\nimport { parseMarkGroup } from './mark/mark';\nimport { isLayerModel, ModelWithField } from './model';\nimport { replaceRepeaterInEncoding } from './repeater';\nimport { assembleTopLevelSignals, assembleUnitSelectionData, assembleUnitSelectionMarks, assembleUnitSelectionSignals, parseUnitSelection } from './selection/selection';\n/**\n * Internal model of Vega-Lite specification for the compiler.\n */\nvar UnitModel = /** @class */ (function (_super) {\n tslib_1.__extends(UnitModel, _super);\n function UnitModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) {\n if (parentGivenSize === void 0) { parentGivenSize = {}; }\n var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, undefined) || this;\n _this.fit = fit;\n _this.type = 'unit';\n _this.specifiedScales = {};\n _this.specifiedAxes = {};\n _this.specifiedLegends = {};\n _this.specifiedProjection = {};\n _this.selection = {};\n _this.children = [];\n _this.initSize(tslib_1.__assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {})));\n var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark;\n var encoding = _this.encoding = normalizeEncoding(replaceRepeaterInEncoding(spec.encoding || {}, repeater), mark);\n _this.markDef = normalizeMarkDef(spec.mark, encoding, config);\n // calculate stack properties\n _this.stack = stack(mark, encoding, _this.config.stack);\n _this.specifiedScales = _this.initScales(mark, encoding);\n _this.specifiedAxes = _this.initAxes(encoding);\n _this.specifiedLegends = _this.initLegend(encoding);\n _this.specifiedProjection = spec.projection;\n // Selections will be initialized upon parse.\n _this.selection = spec.selection;\n return _this;\n }\n Object.defineProperty(UnitModel.prototype, \"hasProjection\", {\n get: function () {\n var encoding = this.encoding;\n var isGeoShapeMark = this.mark === GEOSHAPE;\n var hasGeoPosition = encoding && GEOPOSITION_CHANNELS.some(function (channel) { return isFieldDef(encoding[channel]); });\n return isGeoShapeMark || hasGeoPosition;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * Return specified Vega-lite scale domain for a particular channel\n * @param channel\n */\n UnitModel.prototype.scaleDomain = function (channel) {\n var scale = this.specifiedScales[channel];\n return scale ? scale.domain : undefined;\n };\n UnitModel.prototype.axis = function (channel) {\n return this.specifiedAxes[channel];\n };\n UnitModel.prototype.legend = function (channel) {\n return this.specifiedLegends[channel];\n };\n UnitModel.prototype.initScales = function (mark, encoding) {\n return SCALE_CHANNELS.reduce(function (scales, channel) {\n var fieldDef;\n var specifiedScale;\n var channelDef = encoding[channel];\n if (isFieldDef(channelDef)) {\n fieldDef = channelDef;\n specifiedScale = channelDef.scale;\n }\n else if (hasConditionalFieldDef(channelDef)) {\n fieldDef = channelDef.condition;\n specifiedScale = channelDef.condition['scale'];\n }\n else if (channel === 'x') {\n fieldDef = getFieldDef(encoding.x2);\n }\n else if (channel === 'y') {\n fieldDef = getFieldDef(encoding.y2);\n }\n if (fieldDef) {\n scales[channel] = specifiedScale || {};\n }\n return scales;\n }, {});\n };\n UnitModel.prototype.initAxes = function (encoding) {\n return [X, Y].reduce(function (_axis, channel) {\n // Position Axis\n // TODO: handle ConditionFieldDef\n var channelDef = encoding[channel];\n if (isFieldDef(channelDef) ||\n (channel === X && isFieldDef(encoding.x2)) ||\n (channel === Y && isFieldDef(encoding.y2))) {\n var axisSpec = isFieldDef(channelDef) ? channelDef.axis : null;\n // We no longer support false in the schema, but we keep false here for backward compatibility.\n if (axisSpec !== null && axisSpec !== false) {\n _axis[channel] = tslib_1.__assign({}, axisSpec);\n }\n }\n return _axis;\n }, {});\n };\n UnitModel.prototype.initLegend = function (encoding) {\n return NONPOSITION_SCALE_CHANNELS.reduce(function (_legend, channel) {\n var channelDef = encoding[channel];\n if (channelDef) {\n var legend = isFieldDef(channelDef) ? channelDef.legend :\n (hasConditionalFieldDef(channelDef)) ? channelDef.condition['legend'] : null;\n if (legend !== null && legend !== false) {\n _legend[channel] = tslib_1.__assign({}, legend);\n }\n }\n return _legend;\n }, {});\n };\n UnitModel.prototype.parseData = function () {\n this.component.data = parseData(this);\n };\n UnitModel.prototype.parseLayoutSize = function () {\n parseUnitLayoutSize(this);\n };\n UnitModel.prototype.parseSelection = function () {\n this.component.selection = parseUnitSelection(this, this.selection);\n };\n UnitModel.prototype.parseMarkGroup = function () {\n this.component.mark = parseMarkGroup(this);\n };\n UnitModel.prototype.parseAxisAndHeader = function () {\n this.component.axes = parseUnitAxis(this);\n };\n UnitModel.prototype.assembleSelectionTopLevelSignals = function (signals) {\n return assembleTopLevelSignals(this, signals);\n };\n UnitModel.prototype.assembleSelectionSignals = function () {\n return assembleUnitSelectionSignals(this, []);\n };\n UnitModel.prototype.assembleSelectionData = function (data) {\n return assembleUnitSelectionData(this, data);\n };\n UnitModel.prototype.assembleLayout = function () {\n return null;\n };\n UnitModel.prototype.assembleLayoutSignals = function () {\n return assembleLayoutSignals(this);\n };\n UnitModel.prototype.assembleMarks = function () {\n var marks = this.component.mark || [];\n // If this unit is part of a layer, selections should augment\n // all in concert rather than each unit individually. This\n // ensures correct interleaving of clipping and brushed marks.\n if (!this.parent || !isLayerModel(this.parent)) {\n marks = assembleUnitSelectionMarks(this, marks);\n }\n return marks.map(this.correctDataNames);\n };\n UnitModel.prototype.assembleLayoutSize = function () {\n return {\n width: this.getSizeSignalRef('width'),\n height: this.getSizeSignalRef('height')\n };\n };\n UnitModel.prototype.getMapping = function () {\n return this.encoding;\n };\n UnitModel.prototype.toSpec = function (excludeConfig, excludeData) {\n var encoding = duplicate(this.encoding);\n var spec;\n spec = {\n mark: this.markDef,\n encoding: encoding\n };\n if (!excludeConfig) {\n spec.config = duplicate(this.config);\n }\n if (!excludeData) {\n spec.data = duplicate(this.data);\n }\n // remove defaults\n return spec;\n };\n Object.defineProperty(UnitModel.prototype, \"mark\", {\n get: function () {\n return this.markDef.type;\n },\n enumerable: true,\n configurable: true\n });\n UnitModel.prototype.channelHasField = function (channel) {\n return vlEncoding.channelHasField(this.encoding, channel);\n };\n UnitModel.prototype.fieldDef = function (channel) {\n var channelDef = this.encoding[channel];\n return getFieldDef(channelDef);\n };\n return UnitModel;\n}(ModelWithField));\nexport { UnitModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL3VuaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUNBLE9BQU8sRUFBVSxvQkFBb0IsRUFBRSwwQkFBMEIsRUFBRSxjQUFjLEVBQWtDLENBQUMsRUFBRSxDQUFDLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFM0ksT0FBTyxLQUFLLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFXLGlCQUFpQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3hELE9BQU8sRUFBdUIsV0FBVyxFQUFFLHNCQUFzQixFQUFFLFVBQVUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVsRyxPQUFPLEVBQUMsUUFBUSxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxTQUFTLENBQUM7QUFLM0QsT0FBTyxFQUFDLEtBQUssRUFBa0IsTUFBTSxVQUFVLENBQUM7QUFDaEQsT0FBTyxFQUFPLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUd4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBUyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDNUQsT0FBTyxFQUFnQix5QkFBeUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUseUJBQXlCLEVBQUUsMEJBQTBCLEVBQUUsNEJBQTRCLEVBQUUsa0JBQWtCLEVB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O1lBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFFRixJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN0QztRQUVELElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsa0JBQWtCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELHNCQUFXLDJCQUFJO2FBQWY7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzNCLENBQUM7OztPQUFBO0lBRU0sbUNBQWUsR0FBdEIsVUFBdUIsT0FBZ0I7UUFDckMsT0FBTyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLDRCQUFRLEdBQWYsVUFBZ0IsT0FBeUI7UUFDdkMsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQXVCLENBQUM7UUFDaEUsT0FBTyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXpPRCxDQUErQixjQUFjLEdBeU81QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXhpc30gZnJvbSAnLi4vYXhpcyc7XG5pbXBvcnQge0NoYW5uZWwsIEdFT1BPU0lUSU9OX0NIQU5ORUxTLCBOT05QT1NJVElPTl9TQ0FMRV9DSEFOTkVMUywgU0NBTEVfQ0hBTk5FTFMsIFNjYWxlQ2hhbm5lbCwgU2luZ2xlRGVmQ2hhbm5lbCwgWCwgWX0gZnJvbSAnLi4vY2hhbm5lbCc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIHZsRW5jb2RpbmcgZnJvbSAnLi4vZW5jb2RpbmcnO1xuaW1wb3J0IHtFbmNvZGluZywgbm9ybWFsaXplRW5jb2Rpbmd9IGZyb20gJy4uL2VuY29kaW5nJztcbmltcG9ydCB7Q2hhbm5lbERlZiwgRmllbGREZWYsIGdldEZpZWxkRGVmLCBoYXNDb25kaXRpb25hbEZpZWxkRGVmLCBpc0ZpZWxkRGVmfSBmcm9tICcuLi9maWVsZGRlZic7XG5pbXBvcnQge0xlZ2VuZH0gZnJvbSAnLi4vbGVnZW5kJztcbmltcG9ydCB7R0VPU0hBUEUsIGlzTWFya0RlZiwgTWFyaywgTWFya0RlZn0gZnJvbSAnLi4vbWFyayc7XG5pbXBvcnQge1Byb2plY3Rpb259IGZyb20gJy4uL3Byb2plY3Rpb24nO1xuaW1wb3J0IHtEb21haW4sIFNjYWxlfSBmcm9tICcuLi9zY2FsZSc7XG5pbXBvcnQge1NlbGVjdGlvbkRlZn0gZnJvbSAnLi4vc2VsZWN0aW9uJztcbmltcG9ydCB7TGF5b3V0U2l6ZU1peGlucywgTm9ybWFsaXplZFVuaXRTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7c3RhY2ssIFN0YWNrUHJvcGVydGllc30gZnJvbSAnLi4vc3RhY2snO1xuaW1wb3J0IHtEaWN0LCBkdXBsaWNhdGV9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0RhdGEsIFZnRW5jb2RlRW50cnksIFZnTGF5b3V0LCBWZ1NpZ25hbH0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtBeGlzSW5kZXh9IGZyb20gJy4vYXhpcy9jb21wb25lbnQnO1xuaW1wb3J0IHtwYXJzZVVuaXRBeGlzfSBmcm9tICcuL2F4aXMvcGFyc2UnO1xuaW1wb3J0IHtwYXJzZURhdGF9IGZyb20gJy4vZGF0YS9wYXJzZSc7XG5pbXBvcnQge2Fzc2VtYmxlTGF5b3V0U2lnbmFsc30gZnJvbSAnLi9sYXlvdXRzaXplL2Fzc2VtYmxlJztcbmltcG9ydCB7cGFyc2VVbml0TGF5b3V0U2l6ZX0gZnJvbSAnLi9sYXlvdXRzaXplL3BhcnNlJztcbmltcG9ydCB7TGVnZW5kSW5kZXh9IGZyb20gJy4vbGVnZW5kL2NvbXBvbmVudCc7XG5pbXBvcnQge25vcm1hbGl6ZU1hcmtEZWZ9IGZyb20gJy4vbWFyay9pbml0JztcbmltcG9ydCB7cGFyc2VNYXJrR3JvdXB9IGZyb20gJy4vbWFyay9tYXJrJztcbmltcG9ydCB7aXNMYXllck1vZGVsLCBNb2RlbCwgTW9kZWxXaXRoRmllbGR9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtSZXBlYXRlclZhbHVlLCByZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nfSBmcm9tICcuL3JlcGVhdGVyJztcbmltcG9ydCB7U2NhbGVJbmRleH0gZnJvbSAnLi9zY2FsZS9jb21wb25lbnQnO1xuaW1wb3J0IHthc3NlbWJsZVRvcExldmVsU2lnbmFscywgYXNzZW1ibGVVbml0U2VsZWN0aW9uRGF0YSwgYXNzZW1ibGVVbml0U2VsZWN0aW9uTWFya3MsIGFzc2VtYmxlVW5pdFNlbGVjdGlvblNpZ25hbHMsIHBhcnNlVW5pdFNlbGVjdGlvbn0gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcblxuXG4vKipcbiAqIEludGVybmFsIG1vZGVsIG9mIFZlZ2EtTGl0ZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgY29tcGlsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBVbml0TW9kZWwgZXh0ZW5kcyBNb2RlbFdpdGhGaWVsZCB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiAndW5pdCcgPSAndW5pdCc7XG4gIHB1YmxpYyByZWFkb25seSBtYXJrRGVmOiBNYXJrRGVmO1xuICBwdWJsaWMgcmVhZG9ubHkgZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz47XG5cbiAgcHVibGljIHJlYWRvbmx5IHNwZWNpZmllZFNjYWxlczogU2NhbGVJbmRleCA9IHt9O1xuXG4gIHB1YmxpYyByZWFkb25seSBzdGFjazogU3RhY2tQcm9wZXJ0aWVzO1xuXG4gIHByb3RlY3RlZCBzcGVjaWZpZWRBeGVzOiBBeGlzSW5kZXggPSB7fTtcblxuICBwcm90ZWN0ZWQgc3BlY2lmaWVkTGVnZW5kczogTGVnZW5kSW5kZXggPSB7fTtcblxuICBwdWJsaWMgc3BlY2lmaWVkUHJvamVjdGlvbjogUHJvamVjdGlvbiA9IHt9O1xuXG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb246IERpY3Q8U2VsZWN0aW9uRGVmPiA9IHt9O1xuICBwdWJsaWMgY2hpbGRyZW46IE1vZGVsW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzcGVjOiBOb3JtYWxpemVkVW5pdFNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLFxuICAgIHBhcmVudEdpdmVuU2l6ZTogTGF5b3V0U2l6ZU1peGlucyA9IHt9LCByZXBlYXRlcjogUmVwZWF0ZXJWYWx1ZSwgY29uZmlnOiBDb25maWcsIHB1YmxpYyBmaXQ6IGJvb2xlYW4pIHtcblxuICAgIHN1cGVyKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCBjb25maWcsIHJlcGVhdGVyLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuaW5pdFNpemUoe1xuICAgICAgLi4ucGFyZW50R2l2ZW5TaXplLFxuICAgICAgLi4uKHNwZWMud2lkdGggPyB7d2lkdGg6IHNwZWMud2lkdGh9IDoge30pLFxuICAgICAgLi4uKHNwZWMuaGVpZ2h0ID8ge2hlaWdodDogc3BlYy5oZWlnaHR9IDoge30pXG4gICAgfSk7XG4gICAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG5cbiAgICBjb25zdCBlbmNvZGluZyA9IHRoaXMuZW5jb2RpbmcgPSBub3JtYWxpemVFbmNvZGluZyhyZXBsYWNlUmVwZWF0ZXJJbkVuY29kaW5nKHNwZWMuZW5jb2RpbmcgfHwge30sIHJlcGVhdGVyKSwgbWFyayk7XG5cbiAgICB0aGlzLm1hcmtEZWYgPSBub3JtYWxpemVNYXJrRGVmKHNwZWMubWFyaywgZW5jb2RpbmcsIGNvbmZpZyk7XG5cbiAgICAvLyBjYWxjdWxhdGUgc3RhY2sgcHJvcGVydGllc1xuICAgIHRoaXMuc3RhY2sgPSBzdGFjayhtYXJrLCBlbmNvZGluZywgdGhpcy5jb25maWcuc3RhY2spO1xuICAgIHRoaXMuc3BlY2lmaWVkU2NhbGVzID0gdGhpcy5pbml0U2NhbGVzKG1hcmssIGVuY29kaW5nKTtcblxuICAgIHRoaXMuc3BlY2lmaWVkQXhlcyA9IHRoaXMuaW5pdEF4ZXMoZW5jb2RpbmcpO1xuICAgIHRoaXMuc3BlY2lmaWVkTGVnZW5kcyA9IHRoaXMuaW5pdExlZ2VuZChlbmNvZGluZyk7XG4gICAgdGhpcy5zcGVjaWZpZWRQcm9qZWN0aW9uID0gc3BlYy5wcm9qZWN0aW9uO1xuXG4gICAgLy8gU2VsZWN0aW9ucyB3aWxsIGJlIGluaXRpYWxpemVkIHVwb24gcGFyc2UuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBzcGVjLnNlbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGFzUHJvamVjdGlvbigpOiBib29sZWFuIHtcbiAgICBjb25zdCB7ZW5jb2Rpbmd9ID0gdGhpcztcbiAgICBjb25zdCBpc0dlb1NoYXBlTWFyayA9IHRoaXMubWFyayA9PT0gR0VPU0hBUEU7XG4gICAgY29uc3QgaGFzR2VvUG9zaXRpb24gPSBlbmNvZGluZyAmJiBHRU9QT1NJVElPTl9DSEFOTkVMUy5zb21lKFxuICAgICAgY2hhbm5lbCA9PiBpc0ZpZWxkRGVmKGVuY29kaW5nW2NoYW5uZWxdKVxuICAgICk7XG4gICAgcmV0dXJuIGlzR2VvU2hhcGVNYXJrIHx8IGhhc0dlb1Bvc2l0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzcGVjaWZpZWQgVmVnYS1saXRlIHNjYWxlIGRvbWFpbiBmb3IgYSBwYXJ0aWN1bGFyIGNoYW5uZWxcbiAgICogQHBhcmFtIGNoYW5uZWxcbiAgICovXG4gIHB1YmxpYyBzY2FsZURvbWFpbihjaGFubmVsOiBTY2FsZUNoYW5uZWwpOiBEb21haW4ge1xuICAgIGNvbnN0IHNjYWxlID0gdGhpcy5zcGVjaWZpZWRTY2FsZXNbY2hhbm5lbF07XG4gICAgcmV0dXJuIHNjYWxlID8gc2NhbGUuZG9tYWluIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGF4aXMoY2hhbm5lbDogQ2hhbm5lbCk6IEF4aXMge1xuICAgIHJldHVybiB0aGlzLnNwZWNpZmllZEF4ZXNbY2hhbm5lbF07XG4gIH1cblxuICBwdWJsaWMgbGVnZW5kKGNoYW5uZWw6IENoYW5uZWwpOiBMZWdlbmQge1xuICAgIHJldHVybiB0aGlzLnNwZWNpZmllZExlZ2VuZHNbY2hhbm5lbF07XG4gIH1cblxuICBwcml2YXRlIGluaXRTY2FsZXMobWFyazogTWFyaywgZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4pOiBTY2FsZUluZGV4IHtcbiAgICByZXR1cm4gU0NBTEVfQ0hBTk5FTFMucmVkdWNlKChzY2FsZXMsIGNoYW5uZWwpID0+IHtcbiAgICAgIGxldCBmaWVsZERlZjogRmllbGREZWY8c3RyaW5nPjtcbiAgICAgIGxldCBzcGVjaWZpZWRTY2FsZTogU2NhbGU7XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcblxuICAgICAgaWYgKGlzRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgICAgZmllbGREZWYgPSBjaGFubmVsRGVmO1xuICAgICAgICBzcGVjaWZpZWRTY2FsZSA9IGNoYW5uZWxEZWYuc2NhbGU7XG4gICAgICB9IGVsc2UgaWYgKGhhc0NvbmRpdGlvbmFsRmllbGREZWYoY2hhbm5lbERlZikpIHtcbiAgICAgICAgZmllbGREZWYgPSBjaGFubmVsRGVmLmNvbmRpdGlvbjtcbiAgICAgICAgc3BlY2lmaWVkU2NhbGUgPSBjaGFubmVsRGVmLmNvbmRpdGlvblsnc2NhbGUnXTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbm5lbCA9PT0gJ3gnKSB7XG4gICAgICAgIGZpZWxkRGVmID0gZ2V0RmllbGREZWYoZW5jb2RpbmcueDIpO1xuICAgICAgfSBlbHNlIGlmIChjaGFubmVsID09PSAneScpIHtcbiAgICAgICAgZmllbGREZWYgPSBnZXRGaWVsZERlZihlbmNvZGluZy55Mik7XG4gICAgICB9XG5cbiAgICAgIGlmIChmaWVsZERlZikge1xuICAgICAgICBzY2FsZXNbY2hhbm5lbF0gPSBzcGVjaWZpZWRTY2FsZSB8fCB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzY2FsZXM7XG4gICAgfSwge30gYXMgU2NhbGVJbmRleCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRBeGVzKGVuY29kaW5nOiBFbmNvZGluZzxzdHJpbmc+KTogQXhpc0luZGV4IHtcbiAgICByZXR1cm4gW1gsIFldLnJlZHVjZShmdW5jdGlvbihfYXhpcywgY2hhbm5lbCkge1xuICAgICAgLy8gUG9zaXRpb24gQXhpc1xuXG4gICAgICAvLyBUT0RPOiBoYW5kbGUgQ29uZGl0aW9uRmllbGREZWZcbiAgICAgIGNvbnN0IGNoYW5uZWxEZWYgPSBlbmNvZGluZ1tjaGFubmVsXTtcbiAgICAgIGlmIChpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpIHx8XG4gICAgICAgICAgKGNoYW5uZWwgPT09IFggJiYgaXNGaWVsZERlZihlbmNvZGluZy54MikpIHx8XG4gICAgICAgICAgKGNoYW5uZWwgPT09IFkgJiYgaXNGaWVsZERlZihlbmNvZGluZy55MikpKSB7XG5cbiAgICAgICAgY29uc3QgYXhpc1NwZWMgPSBpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpID8gY2hhbm5lbERlZi5heGlzIDogbnVsbDtcblxuICAgICAgICAvLyBXZSBubyBsb25nZXIgc3VwcG9ydCBmYWxzZSBpbiB0aGUgc2NoZW1hLCBidXQgd2Uga2VlcCBmYWxzZSBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgICAgICBpZiAoYXhpc1NwZWMgIT09IG51bGwgJiYgYXhpc1NwZWMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgX2F4aXNbY2hhbm5lbF0gPSB7XG4gICAgICAgICAgICAuLi5heGlzU3BlY1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBfYXhpcztcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRMZWdlbmQoZW5jb2Rpbmc6IEVuY29kaW5nPHN0cmluZz4pOiBMZWdlbmRJbmRleCB7XG4gICAgcmV0dXJuIE5PTlBPU0lUSU9OX1NDQUxFX0NIQU5ORUxTLnJlZHVjZShmdW5jdGlvbihfbGVnZW5kLCBjaGFubmVsKSB7XG4gICAgICBjb25zdCBjaGFubmVsRGVmID0gZW5jb2RpbmdbY2hhbm5lbF07XG4gICAgICBpZiAoY2hhbm5lbERlZikge1xuICAgICAgICBjb25zdCBsZWdlbmQgPSBpc0ZpZWxkRGVmKGNoYW5uZWxEZWYpID8gY2hhbm5lbERlZi5sZWdlbmQgOlxuICAgICAgICAgIChoYXNDb25kaXRpb25hbEZpZWxkRGVmKGNoYW5uZWxEZWYpKSA/IGNoYW5uZWxEZWYuY29uZGl0aW9uWydsZWdlbmQnXSA6IG51bGw7XG5cbiAgICAgICAgaWYgKGxlZ2VuZCAhPT0gbnVsbCAmJiBsZWdlbmQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgX2xlZ2VuZFtjaGFubmVsXSA9IHsuLi5sZWdlbmR9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfbGVnZW5kO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZURhdGEoKSB7XG4gICAgdGhpcy5jb21wb25lbnQuZGF0YSA9IHBhcnNlRGF0YSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUxheW91dFNpemUoKSB7XG4gICAgcGFyc2VVbml0TGF5b3V0U2l6ZSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVNlbGVjdGlvbigpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5zZWxlY3Rpb24gPSBwYXJzZVVuaXRTZWxlY3Rpb24odGhpcywgdGhpcy5zZWxlY3Rpb24pO1xuICB9XG5cbiAgcHVibGljIHBhcnNlTWFya0dyb3VwKCkge1xuICAgIHRoaXMuY29tcG9uZW50Lm1hcmsgPSBwYXJzZU1hcmtHcm91cCh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUF4aXNBbmRIZWFkZXIoKSB7XG4gICAgdGhpcy5jb21wb25lbnQuYXhlcyA9IHBhcnNlVW5pdEF4aXModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gYXNzZW1ibGVUb3BMZXZlbFNpZ25hbHModGhpcywgc2lnbmFscyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCk6IFZnU2lnbmFsW10ge1xuICAgIHJldHVybiBhc3NlbWJsZVVuaXRTZWxlY3Rpb25TaWduYWxzKHRoaXMsIFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVNlbGVjdGlvbkRhdGEoZGF0YTogVmdEYXRhW10pOiBWZ0RhdGFbXSB7XG4gICAgcmV0dXJuIGFzc2VtYmxlVW5pdFNlbGVjdGlvbkRhdGEodGhpcywgZGF0YSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gYXNzZW1ibGVMYXlvdXRTaWduYWxzKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTWFya3MoKSB7XG4gICAgbGV0IG1hcmtzID0gdGhpcy5jb21wb25lbnQubWFyayB8fCBbXTtcblxuICAgIC8vIElmIHRoaXMgdW5pdCBpcyBwYXJ0IG9mIGEgbGF5ZXIsIHNlbGVjdGlvbnMgc2hvdWxkIGF1Z21lbnRcbiAgICAvLyBhbGwgaW4gY29uY2VydCByYXRoZXIgdGhhbiBlYWNoIHVuaXQgaW5kaXZpZHVhbGx5LiBUaGlzXG4gICAgLy8gZW5zdXJlcyBjb3JyZWN0IGludGVybGVhdmluZyBvZiBjbGlwcGluZyBhbmQgYnJ1c2hlZCBtYXJrcy5cbiAgICBpZiAoIXRoaXMucGFyZW50IHx8ICFpc0xheWVyTW9kZWwodGhpcy5wYXJlbnQpKSB7XG4gICAgICBtYXJrcyA9IGFzc2VtYmxlVW5pdFNlbGVjdGlvbk1hcmtzKHRoaXMsIG1hcmtzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFya3MubWFwKHRoaXMuY29ycmVjdERhdGFOYW1lcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXRTaXplKCk6IFZnRW5jb2RlRW50cnkge1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5nZXRTaXplU2lnbmFsUmVmKCd3aWR0aCcpLFxuICAgICAgaGVpZ2h0OiB0aGlzLmdldFNpemVTaWduYWxSZWYoJ2hlaWdodCcpXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRNYXBwaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmVuY29kaW5nO1xuICB9XG5cbiAgcHVibGljIHRvU3BlYyhleGNsdWRlQ29uZmlnPzogYW55LCBleGNsdWRlRGF0YT86IGFueSkge1xuICAgIGNvbnN0IGVuY29kaW5nID0gZHVwbGljYXRlKHRoaXMuZW5jb2RpbmcpO1xuICAgIGxldCBzcGVjOiBhbnk7XG5cbiAgICBzcGVjID0ge1xuICAgICAgbWFyazogdGhpcy5tYXJrRGVmLFxuICAgICAgZW5jb2Rpbmc6IGVuY29kaW5nXG4gICAgfTtcblxuICAgIGlmICghZXhjbHVkZUNvbmZpZykge1xuICAgICAgc3BlYy5jb25maWcgPSBkdXBsaWNhdGUodGhpcy5jb25maWcpO1xuICAgIH1cblxuICAgIGlmICghZXhjbHVkZURhdGEpIHtcbiAgICAgIHNwZWMuZGF0YSA9IGR1cGxpY2F0ZSh0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBkZWZhdWx0c1xuICAgIHJldHVybiBzcGVjO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXJrKCk6IE1hcmsge1xuICAgIHJldHVybiB0aGlzLm1hcmtEZWYudHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFubmVsSGFzRmllbGQoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHJldHVybiB2bEVuY29kaW5nLmNoYW5uZWxIYXNGaWVsZCh0aGlzLmVuY29kaW5nLCBjaGFubmVsKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWVsZERlZihjaGFubmVsOiBTaW5nbGVEZWZDaGFubmVsKTogRmllbGREZWY8c3RyaW5nPiB7XG4gICAgY29uc3QgY2hhbm5lbERlZiA9IHRoaXMuZW5jb2RpbmdbY2hhbm5lbF0gYXMgQ2hhbm5lbERlZjxzdHJpbmc+O1xuICAgIHJldHVybiBnZXRGaWVsZERlZihjaGFubmVsRGVmKTtcbiAgfVxufVxuIl19","import * as tslib_1 from \"tslib\";\nimport * as log from '../log';\nimport { isLayerSpec, isUnitSpec } from '../spec';\nimport { flatten, keys } from '../util';\nimport { parseLayerAxis } from './axis/parse';\nimport { parseData } from './data/parse';\nimport { assembleLayoutSignals } from './layoutsize/assemble';\nimport { parseLayerLayoutSize } from './layoutsize/parse';\nimport { assembleLegends } from './legend/assemble';\nimport { Model } from './model';\nimport { assembleLayerSelectionMarks } from './selection/selection';\nimport { UnitModel } from './unit';\nvar LayerModel = /** @class */ (function (_super) {\n tslib_1.__extends(LayerModel, _super);\n function LayerModel(spec, parent, parentGivenName, parentGivenSize, repeater, config, fit) {\n var _this = _super.call(this, spec, parent, parentGivenName, config, repeater, spec.resolve) || this;\n _this.type = 'layer';\n var layoutSize = tslib_1.__assign({}, parentGivenSize, (spec.width ? { width: spec.width } : {}), (spec.height ? { height: spec.height } : {}));\n _this.initSize(layoutSize);\n _this.children = spec.layer.map(function (layer, i) {\n if (isLayerSpec(layer)) {\n return new LayerModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit);\n }\n if (isUnitSpec(layer)) {\n return new UnitModel(layer, _this, _this.getName('layer_' + i), layoutSize, repeater, config, fit);\n }\n throw new Error(log.message.INVALID_SPEC);\n });\n return _this;\n }\n LayerModel.prototype.parseData = function () {\n this.component.data = parseData(this);\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parseData();\n }\n };\n LayerModel.prototype.parseLayoutSize = function () {\n parseLayerLayoutSize(this);\n };\n LayerModel.prototype.parseSelection = function () {\n var _this = this;\n // Merge selections up the hierarchy so that they may be referenced\n // across unit specs. Persist their definitions within each child\n // to assemble signals which remain within output Vega unit groups.\n this.component.selection = {};\n var _loop_1 = function (child) {\n child.parseSelection();\n keys(child.component.selection).forEach(function (key) {\n _this.component.selection[key] = child.component.selection[key];\n });\n };\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n _loop_1(child);\n }\n };\n LayerModel.prototype.parseMarkGroup = function () {\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n child.parseMarkGroup();\n }\n };\n LayerModel.prototype.parseAxisAndHeader = function () {\n parseLayerAxis(this);\n };\n LayerModel.prototype.assembleSelectionTopLevelSignals = function (signals) {\n return this.children.reduce(function (sg, child) { return child.assembleSelectionTopLevelSignals(sg); }, signals);\n };\n // TODO: Support same named selections across children.\n LayerModel.prototype.assembleSelectionSignals = function () {\n return this.children.reduce(function (signals, child) {\n return signals.concat(child.assembleSelectionSignals());\n }, []);\n };\n LayerModel.prototype.assembleLayoutSignals = function () {\n return this.children.reduce(function (signals, child) {\n return signals.concat(child.assembleLayoutSignals());\n }, assembleLayoutSignals(this));\n };\n LayerModel.prototype.assembleSelectionData = function (data) {\n return this.children.reduce(function (db, child) { return child.assembleSelectionData(db); }, data);\n };\n LayerModel.prototype.assembleTitle = function () {\n var title = _super.prototype.assembleTitle.call(this);\n if (title) {\n return title;\n }\n // If title does not provide layer, look into children\n for (var _i = 0, _a = this.children; _i < _a.length; _i++) {\n var child = _a[_i];\n title = child.assembleTitle();\n if (title) {\n return title;\n }\n }\n return undefined;\n };\n LayerModel.prototype.assembleLayout = function () {\n return null;\n };\n LayerModel.prototype.assembleMarks = function () {\n return assembleLayerSelectionMarks(this, flatten(this.children.map(function (child) {\n return child.assembleMarks();\n })));\n };\n LayerModel.prototype.assembleLegends = function () {\n return this.children.reduce(function (legends, child) {\n return legends.concat(child.assembleLegends());\n }, assembleLegends(this));\n };\n return LayerModel;\n}(Model));\nexport { LayerModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcGlsZS9sYXllci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQXdDLE1BQU0sU0FBUyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDNUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5QixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBR2pDO0lBQWdDLHNDQUFLO0lBU25DLG9CQUFZLElBQXlCLEVBQUUsTUFBYSxFQUFFLGVBQXVCLEVBQzNFLGVBQWlDLEVBQUUsUUFBdUIsRUFBRSxNQUFjLEVBQUUsR0FBWTtRQUQxRixZQUdFLGtCQUFNLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQXFCckU7UUFoQ2UsVUFBSSxHQUFZLE9BQU8sQ0FBQztRQWF0QyxJQUFNLFVBQVUsd0JBQ1gsZUFBZSxFQUNmLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsSUFB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O1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLG1DQUFjLEdBQXJCO1FBQ0UsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sa0NBQWEsR0FBcEI7UUFDRSxPQUFPLDJCQUEyQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBQyxLQUFLO1lBQ3ZFLE9BQU8sS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTSxvQ0FBZSxHQUF0QjtRQUNFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBQyxPQUFPLEVBQUUsS0FBSztZQUN6QyxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDSCxpQkFBQztBQUFELENBQUMsQUF6SEQsQ0FBZ0MsS0FBSyxHQXlIcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtpc0xheWVyU3BlYywgaXNVbml0U3BlYywgTGF5b3V0U2l6ZU1peGlucywgTm9ybWFsaXplZExheWVyU3BlY30gZnJvbSAnLi4vc3BlYyc7XG5pbXBvcnQge2ZsYXR0ZW4sIGtleXN9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtWZ0RhdGEsIFZnTGF5b3V0LCBWZ0xlZ2VuZCwgVmdTaWduYWwsIFZnVGl0bGV9IGZyb20gJy4uL3ZlZ2Euc2NoZW1hJztcbmltcG9ydCB7cGFyc2VMYXllckF4aXN9IGZyb20gJy4vYXhpcy9wYXJzZSc7XG5pbXBvcnQge3BhcnNlRGF0YX0gZnJvbSAnLi9kYXRhL3BhcnNlJztcbmltcG9ydCB7YXNzZW1ibGVMYXlvdXRTaWduYWxzfSBmcm9tICcuL2xheW91dHNpemUvYXNzZW1ibGUnO1xuaW1wb3J0IHtwYXJzZUxheWVyTGF5b3V0U2l6ZX0gZnJvbSAnLi9sYXlvdXRzaXplL3BhcnNlJztcbmltcG9ydCB7YXNzZW1ibGVMZWdlbmRzfSBmcm9tICcuL2xlZ2VuZC9hc3NlbWJsZSc7XG5pbXBvcnQge01vZGVsfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7UmVwZWF0ZXJWYWx1ZX0gZnJvbSAnLi9yZXBlYXRlcic7XG5pbXBvcnQge2Fzc2VtYmxlTGF5ZXJTZWxlY3Rpb25NYXJrc30gZnJvbSAnLi9zZWxlY3Rpb24vc2VsZWN0aW9uJztcbmltcG9ydCB7VW5pdE1vZGVsfSBmcm9tICcuL3VuaXQnO1xuXG5cbmV4cG9ydCBjbGFzcyBMYXllck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBwdWJsaWMgcmVhZG9ubHkgdHlwZTogJ2xheWVyJyA9ICdsYXllcic7XG5cbiAgLy8gSEFDSzogVGhpcyBzaG91bGQgYmUgKExheWVyTW9kZWwgfCBVbml0TW9kZWwpW10sIGJ1dCBzZXR0aW5nIHRoZSBjb3JyZWN0IHR5cGUgbGVhZHMgdG8gd2VpcmQgZXJyb3IuXG4gIC8vIFNvIEknbSBqdXN0IHB1dHRpbmcgZ2VuZXJpYyBNb2RlbCBmb3Igbm93LlxuICBwdWJsaWMgcmVhZG9ubHkgY2hpbGRyZW46IE1vZGVsW107XG5cblxuXG4gIGNvbnN0cnVjdG9yKHNwZWM6IE5vcm1hbGl6ZWRMYXllclNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLFxuICAgIHBhcmVudEdpdmVuU2l6ZTogTGF5b3V0U2l6ZU1peGlucywgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnLCBmaXQ6IGJvb2xlYW4pIHtcblxuICAgIHN1cGVyKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCBjb25maWcsIHJlcGVhdGVyLCBzcGVjLnJlc29sdmUpO1xuXG4gICAgY29uc3QgbGF5b3V0U2l6ZSA9IHtcbiAgICAgIC4uLnBhcmVudEdpdmVuU2l6ZSxcbiAgICAgIC4uLihzcGVjLndpZHRoID8ge3dpZHRoOiBzcGVjLndpZHRofSA6IHt9KSxcbiAgICAgIC4uLihzcGVjLmhlaWdodCA/IHtoZWlnaHQ6IHNwZWMuaGVpZ2h0fSA6IHt9KVxuICAgIH07XG5cbiAgICB0aGlzLmluaXRTaXplKGxheW91dFNpemUpO1xuXG4gICAgdGhpcy5jaGlsZHJlbiA9IHNwZWMubGF5ZXIubWFwKChsYXllciwgaSkgPT4ge1xuICAgICAgaWYgKGlzTGF5ZXJTcGVjKGxheWVyKSkge1xuICAgICAgICByZXR1cm4gbmV3IExheWVyTW9kZWwobGF5ZXIsIHRoaXMsIHRoaXMuZ2V0TmFtZSgnbGF5ZXJfJytpKSwgbGF5b3V0U2l6ZSwgcmVwZWF0ZXIsIGNvbmZpZywgZml0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzVW5pdFNwZWMobGF5ZXIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVW5pdE1vZGVsKGxheWVyLCB0aGlzLCB0aGlzLmdldE5hbWUoJ2xheWVyXycraSksIGxheW91dFNpemUsIHJlcGVhdGVyLCBjb25maWcsIGZpdCk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihsb2cubWVzc2FnZS5JTlZBTElEX1NQRUMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHBhcnNlRGF0YSgpIHtcbiAgICB0aGlzLmNvbXBvbmVudC5kYXRhID0gcGFyc2VEYXRhKHRoaXMpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgY2hpbGQucGFyc2VEYXRhKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHBhcnNlTGF5b3V0U2l6ZSgpIHtcbiAgICBwYXJzZUxheWVyTGF5b3V0U2l6ZSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZVNlbGVjdGlvbigpIHtcbiAgICAvLyBNZXJnZSBzZWxlY3Rpb25zIHVwIHRoZSBoaWVyYXJjaHkgc28gdGhhdCB0aGV5IG1heSBiZSByZWZlcmVuY2VkXG4gICAgLy8gYWNyb3NzIHVuaXQgc3BlY3MuIFBlcnNpc3QgdGhlaXIgZGVmaW5pdGlvbnMgd2l0aGluIGVhY2ggY2hpbGRcbiAgICAvLyB0byBhc3NlbWJsZSBzaWduYWxzIHdoaWNoIHJlbWFpbiB3aXRoaW4gb3V0cHV0IFZlZ2EgdW5pdCBncm91cHMuXG4gICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uID0ge307XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZVNlbGVjdGlvbigpO1xuICAgICAga2V5cyhjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgdGhpcy5jb21wb25lbnQuc2VsZWN0aW9uW2tleV0gPSBjaGlsZC5jb21wb25lbnQuc2VsZWN0aW9uW2tleV07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcGFyc2VNYXJrR3JvdXAoKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICBjaGlsZC5wYXJzZU1hcmtHcm91cCgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBwYXJzZUF4aXNBbmRIZWFkZXIoKSB7XG4gICAgcGFyc2VMYXllckF4aXModGhpcyk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2lnbmFsczogYW55W10pOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNnLCBjaGlsZCkgPT4gY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoc2cpLCBzaWduYWxzKTtcbiAgfVxuXG4gIC8vIFRPRE86IFN1cHBvcnQgc2FtZSBuYW1lZCBzZWxlY3Rpb25zIGFjcm9zcyBjaGlsZHJlbi5cbiAgcHVibGljIGFzc2VtYmxlU2VsZWN0aW9uU2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNpZ25hbHMsIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoY2hpbGQuYXNzZW1ibGVTZWxlY3Rpb25TaWduYWxzKCkpO1xuICAgIH0sIFtdKTtcbiAgfVxuXG5cbiAgcHVibGljIGFzc2VtYmxlTGF5b3V0U2lnbmFscygpOiBWZ1NpZ25hbFtdIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5yZWR1Y2UoKHNpZ25hbHMsIGNoaWxkKSA9PiB7XG4gICAgICByZXR1cm4gc2lnbmFscy5jb25jYXQoY2hpbGQuYXNzZW1ibGVMYXlvdXRTaWduYWxzKCkpO1xuICAgIH0sIGFzc2VtYmxlTGF5b3V0U2lnbmFscyh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVTZWxlY3Rpb25EYXRhKGRhdGE6IFZnRGF0YVtdKTogVmdEYXRhW10ge1xuICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnJlZHVjZSgoZGIsIGNoaWxkKSA9PiBjaGlsZC5hc3NlbWJsZVNlbGVjdGlvbkRhdGEoZGIpLCBkYXRhKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZVRpdGxlKCk6IFZnVGl0bGUge1xuICAgIGxldCB0aXRsZSA9IHN1cGVyLmFzc2VtYmxlVGl0bGUoKTtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9XG4gICAgLy8gSWYgdGl0bGUgZG9lcyBub3QgcHJvdmlkZSBsYXllciwgbG9vayBpbnRvIGNoaWxkcmVuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICB0aXRsZSA9IGNoaWxkLmFzc2VtYmxlVGl0bGUoKTtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICByZXR1cm4gdGl0bGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgYXNzZW1ibGVMYXlvdXQoKTogVmdMYXlvdXQge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHVibGljIGFzc2VtYmxlTWFya3MoKTogYW55W10ge1xuICAgIHJldHVybiBhc3NlbWJsZUxheWVyU2VsZWN0aW9uTWFya3ModGhpcywgZmxhdHRlbih0aGlzLmNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIHJldHVybiBjaGlsZC5hc3NlbWJsZU1hcmtzKCk7XG4gICAgfSkpKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxlZ2VuZHMoKTogVmdMZWdlbmRbXSB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ucmVkdWNlKChsZWdlbmRzLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIGxlZ2VuZHMuY29uY2F0KGNoaWxkLmFzc2VtYmxlTGVnZW5kcygpKTtcbiAgICB9LCBhc3NlbWJsZUxlZ2VuZHModGhpcykpO1xuICB9XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport * as log from '../log';\nimport { BaseConcatModel } from './baseconcat';\nimport { buildModel } from './buildmodel';\nimport { parseRepeatLayoutSize } from './layoutsize/parse';\nvar RepeatModel = /** @class */ (function (_super) {\n tslib_1.__extends(RepeatModel, _super);\n function RepeatModel(spec, parent, parentGivenName, repeatValues, config) {\n var _this = _super.call(this, spec, parent, parentGivenName, config, repeatValues, spec.resolve) || this;\n _this.type = 'repeat';\n if (spec.resolve && spec.resolve.axis && (spec.resolve.axis.x === 'shared' || spec.resolve.axis.y === 'shared')) {\n log.warn(log.message.REPEAT_CANNOT_SHARE_AXIS);\n }\n _this.repeat = spec.repeat;\n _this.children = _this._initChildren(spec, _this.repeat, repeatValues, config);\n return _this;\n }\n RepeatModel.prototype._initChildren = function (spec, repeat, repeater, config) {\n var children = [];\n var row = repeat.row || [repeater ? repeater.row : null];\n var column = repeat.column || [repeater ? repeater.column : null];\n // cross product\n for (var _i = 0, row_1 = row; _i < row_1.length; _i++) {\n var rowField = row_1[_i];\n for (var _a = 0, column_1 = column; _a < column_1.length; _a++) {\n var columnField = column_1[_a];\n var name_1 = (rowField ? '_' + rowField : '') + (columnField ? '_' + columnField : '');\n var childRepeat = {\n row: rowField,\n column: columnField\n };\n children.push(buildModel(spec.spec, this, this.getName('child' + name_1), undefined, childRepeat, config, false));\n }\n }\n return children;\n };\n RepeatModel.prototype.parseLayoutSize = function () {\n parseRepeatLayoutSize(this);\n };\n RepeatModel.prototype.assembleLayout = function () {\n // TODO: allow customization\n return {\n padding: { row: 10, column: 10 },\n offset: 10,\n columns: this.repeat && this.repeat.column ? this.repeat.column.length : 1,\n bounds: 'full',\n align: 'all'\n };\n };\n return RepeatModel;\n}(BaseConcatModel));\nexport { RepeatModel };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwZWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBpbGUvcmVwZWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQSxPQUFPLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQztBQUk5QixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFJekQ7SUFBaUMsdUNBQWU7SUFNOUMscUJBQVksSUFBMEIsRUFBRSxNQUFhLEVBQUUsZUFBdUIsRUFBRSxZQUEyQixFQUFFLE1BQWM7UUFBM0gsWUFDRSxrQkFBTSxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FRekU7UUFkZSxVQUFJLEdBQWEsUUFBUSxDQUFDO1FBUXhDLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxFQUFFO1lBQy9HLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsS0FBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzFCLEtBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7O0lBQzlFLENBQUM7SUFFTyxtQ0FBYSxHQUFyQixVQUFzQixJQUEwQixFQUFFLE1BQWMsRUFBRSxRQUF1QixFQUFFLE1BQWM7UUFDdkcsSUFBTSxRQUFRLEdBQVksRUFBRSxDQUFDO1FBQzdCLElBQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNELElBQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBFLGdCQUFnQjtRQUNoQixLQUF1QixVQUFHLEVBQUgsV0FBRyxFQUFILGlCQUFHLEVBQUgsSUFBRyxFQUFFO1lBQXZCLElBQU0sUUFBUSxZQUFBO1lBQ2pCLEtBQTBCLFVBQU0sRUFBTixpQkFBTSxFQUFOLG9CQUFNLEVBQU4sSUFBTSxFQUFFO2dCQUE3QixJQUFNLFdBQVcsZUFBQTtnQkFDcEIsSUFBTSxNQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFFdkYsSUFBTSxXQUFXLEdBQUc7b0JBQ2xCLEdBQUcsRUFBRSxRQUFRO29CQUNiLE1BQU0sRUFBRSxXQUFXO2lCQUNwQixDQUFDO2dCQUVGLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLE1BQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDakg7U0FDRjtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFTSxxQ0FBZSxHQUF0QjtRQUNFLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxvQ0FBYyxHQUFyQjtRQUNFLDRCQUE0QjtRQUM1QixPQUFPO1lBQ0wsT0FBTyxFQUFFLEVBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFDO1lBQzlCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxLQUFLO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFDSCxrQkFBQztBQUFELENBQUMsQUFyREQsQ0FBaUMsZUFBZSxHQXFEL0MiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge1JlcGVhdH0gZnJvbSAnLi4vcmVwZWF0JztcbmltcG9ydCB7Tm9ybWFsaXplZFJlcGVhdFNwZWN9IGZyb20gJy4uL3NwZWMnO1xuaW1wb3J0IHtWZ0xheW91dH0gZnJvbSAnLi4vdmVnYS5zY2hlbWEnO1xuaW1wb3J0IHtCYXNlQ29uY2F0TW9kZWx9IGZyb20gJy4vYmFzZWNvbmNhdCc7XG5pbXBvcnQge2J1aWxkTW9kZWx9IGZyb20gJy4vYnVpbGRtb2RlbCc7XG5pbXBvcnQge3BhcnNlUmVwZWF0TGF5b3V0U2l6ZX0gZnJvbSAnLi9sYXlvdXRzaXplL3BhcnNlJztcbmltcG9ydCB7TW9kZWx9IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtSZXBlYXRlclZhbHVlfSBmcm9tICcuL3JlcGVhdGVyJztcblxuZXhwb3J0IGNsYXNzIFJlcGVhdE1vZGVsIGV4dGVuZHMgQmFzZUNvbmNhdE1vZGVsIHtcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6ICdyZXBlYXQnID0gJ3JlcGVhdCc7XG4gIHB1YmxpYyByZWFkb25seSByZXBlYXQ6IFJlcGVhdDtcblxuICBwdWJsaWMgcmVhZG9ubHkgY2hpbGRyZW46IE1vZGVsW107XG5cbiAgY29uc3RydWN0b3Ioc3BlYzogTm9ybWFsaXplZFJlcGVhdFNwZWMsIHBhcmVudDogTW9kZWwsIHBhcmVudEdpdmVuTmFtZTogc3RyaW5nLCByZXBlYXRWYWx1ZXM6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnKSB7XG4gICAgc3VwZXIoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIGNvbmZpZywgcmVwZWF0VmFsdWVzLCBzcGVjLnJlc29sdmUpO1xuXG4gICAgaWYgKHNwZWMucmVzb2x2ZSAmJiBzcGVjLnJlc29sdmUuYXhpcyAmJiAoc3BlYy5yZXNvbHZlLmF4aXMueCA9PT0gJ3NoYXJlZCcgfHwgc3BlYy5yZXNvbHZlLmF4aXMueSA9PT0gJ3NoYXJlZCcpKSB7XG4gICAgICBsb2cud2Fybihsb2cubWVzc2FnZS5SRVBFQVRfQ0FOTk9UX1NIQVJFX0FYSVMpO1xuICAgIH1cblxuICAgIHRoaXMucmVwZWF0ID0gc3BlYy5yZXBlYXQ7XG4gICAgdGhpcy5jaGlsZHJlbiA9IHRoaXMuX2luaXRDaGlsZHJlbihzcGVjLCB0aGlzLnJlcGVhdCwgcmVwZWF0VmFsdWVzLCBjb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdENoaWxkcmVuKHNwZWM6IE5vcm1hbGl6ZWRSZXBlYXRTcGVjLCByZXBlYXQ6IFJlcGVhdCwgcmVwZWF0ZXI6IFJlcGVhdGVyVmFsdWUsIGNvbmZpZzogQ29uZmlnKTogTW9kZWxbXSB7XG4gICAgY29uc3QgY2hpbGRyZW46IE1vZGVsW10gPSBbXTtcbiAgICBjb25zdCByb3cgPSByZXBlYXQucm93IHx8IFtyZXBlYXRlciA/IHJlcGVhdGVyLnJvdyA6IG51bGxdO1xuICAgIGNvbnN0IGNvbHVtbiA9IHJlcGVhdC5jb2x1bW4gfHwgW3JlcGVhdGVyID8gcmVwZWF0ZXIuY29sdW1uIDogbnVsbF07XG5cbiAgICAvLyBjcm9zcyBwcm9kdWN0XG4gICAgZm9yIChjb25zdCByb3dGaWVsZCBvZiByb3cpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uRmllbGQgb2YgY29sdW1uKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAocm93RmllbGQgPyAnXycgKyByb3dGaWVsZCA6ICcnKSArIChjb2x1bW5GaWVsZCA/ICdfJyArIGNvbHVtbkZpZWxkIDogJycpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkUmVwZWF0ID0ge1xuICAgICAgICAgIHJvdzogcm93RmllbGQsXG4gICAgICAgICAgY29sdW1uOiBjb2x1bW5GaWVsZFxuICAgICAgICB9O1xuXG4gICAgICAgIGNoaWxkcmVuLnB1c2goYnVpbGRNb2RlbChzcGVjLnNwZWMsIHRoaXMsIHRoaXMuZ2V0TmFtZSgnY2hpbGQnICsgbmFtZSksIHVuZGVmaW5lZCwgY2hpbGRSZXBlYXQsIGNvbmZpZywgZmFsc2UpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBwdWJsaWMgcGFyc2VMYXlvdXRTaXplKCkge1xuICAgIHBhcnNlUmVwZWF0TGF5b3V0U2l6ZSh0aGlzKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3NlbWJsZUxheW91dCgpOiBWZ0xheW91dCB7XG4gICAgLy8gVE9ETzogYWxsb3cgY3VzdG9taXphdGlvblxuICAgIHJldHVybiB7XG4gICAgICBwYWRkaW5nOiB7cm93OiAxMCwgY29sdW1uOiAxMH0sXG4gICAgICBvZmZzZXQ6IDEwLFxuICAgICAgY29sdW1uczogdGhpcy5yZXBlYXQgJiYgdGhpcy5yZXBlYXQuY29sdW1uID8gdGhpcy5yZXBlYXQuY29sdW1uLmxlbmd0aCA6IDEsXG4gICAgICBib3VuZHM6ICdmdWxsJyxcbiAgICAgIGFsaWduOiAnYWxsJ1xuICAgIH07XG4gIH1cbn1cbiJdfQ==","import * as log from '../log';\nimport { isConcatSpec, isFacetSpec, isLayerSpec, isRepeatSpec, isUnitSpec } from '../spec';\nimport { ConcatModel } from './concat';\nimport { FacetModel } from './facet';\nimport { LayerModel } from './layer';\nimport { RepeatModel } from './repeat';\nimport { UnitModel } from './unit';\nexport function buildModel(spec, parent, parentGivenName, unitSize, repeater, config, fit) {\n if (isFacetSpec(spec)) {\n return new FacetModel(spec, parent, parentGivenName, repeater, config);\n }\n if (isLayerSpec(spec)) {\n return new LayerModel(spec, parent, parentGivenName, unitSize, repeater, config, fit);\n }\n if (isUnitSpec(spec)) {\n return new UnitModel(spec, parent, parentGivenName, unitSize, repeater, config, fit);\n }\n if (isRepeatSpec(spec)) {\n return new RepeatModel(spec, parent, parentGivenName, repeater, config);\n }\n if (isConcatSpec(spec)) {\n return new ConcatModel(spec, parent, parentGivenName, repeater, config);\n }\n throw new Error(log.message.INVALID_SPEC);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRtb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2J1aWxkbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQW1DLE1BQU0sU0FBUyxDQUFDO0FBQzNILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRW5DLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFckMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUVqQyxNQUFNLHFCQUFxQixJQUFvQixFQUFFLE1BQWEsRUFBRSxlQUF1QixFQUNyRixRQUEwQixFQUFFLFFBQXVCLEVBQUUsTUFBYyxFQUFFLEdBQVk7SUFDakYsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDckIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDeEU7SUFFRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQixPQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZGO0lBRUQsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDcEIsT0FBTyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN0RjtJQUVELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQ3pFO0lBRUQsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDekU7SUFFRCxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29uZmlnfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge2lzQ29uY2F0U3BlYywgaXNGYWNldFNwZWMsIGlzTGF5ZXJTcGVjLCBpc1JlcGVhdFNwZWMsIGlzVW5pdFNwZWMsIExheW91dFNpemVNaXhpbnMsIE5vcm1hbGl6ZWRTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7Q29uY2F0TW9kZWx9IGZyb20gJy4vY29uY2F0JztcbmltcG9ydCB7RmFjZXRNb2RlbH0gZnJvbSAnLi9mYWNldCc7XG5pbXBvcnQge0xheWVyTW9kZWx9IGZyb20gJy4vbGF5ZXInO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQge1JlcGVhdE1vZGVsfSBmcm9tICcuL3JlcGVhdCc7XG5pbXBvcnQge1JlcGVhdGVyVmFsdWV9IGZyb20gJy4vcmVwZWF0ZXInO1xuaW1wb3J0IHtVbml0TW9kZWx9IGZyb20gJy4vdW5pdCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE1vZGVsKHNwZWM6IE5vcm1hbGl6ZWRTcGVjLCBwYXJlbnQ6IE1vZGVsLCBwYXJlbnRHaXZlbk5hbWU6IHN0cmluZyxcbiAgdW5pdFNpemU6IExheW91dFNpemVNaXhpbnMsIHJlcGVhdGVyOiBSZXBlYXRlclZhbHVlLCBjb25maWc6IENvbmZpZywgZml0OiBib29sZWFuKTogTW9kZWwge1xuICBpZiAoaXNGYWNldFNwZWMoc3BlYykpIHtcbiAgICByZXR1cm4gbmV3IEZhY2V0TW9kZWwoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIHJlcGVhdGVyLCBjb25maWcpO1xuICB9XG5cbiAgaWYgKGlzTGF5ZXJTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5ldyBMYXllck1vZGVsKHNwZWMsIHBhcmVudCwgcGFyZW50R2l2ZW5OYW1lLCB1bml0U2l6ZSwgcmVwZWF0ZXIsIGNvbmZpZywgZml0KTtcbiAgfVxuXG4gIGlmIChpc1VuaXRTcGVjKHNwZWMpKSB7XG4gICAgcmV0dXJuIG5ldyBVbml0TW9kZWwoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIHVuaXRTaXplLCByZXBlYXRlciwgY29uZmlnLCBmaXQpO1xuICB9XG5cbiAgaWYgKGlzUmVwZWF0U3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBuZXcgUmVwZWF0TW9kZWwoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIHJlcGVhdGVyLCBjb25maWcpO1xuICB9XG5cbiAgaWYgKGlzQ29uY2F0U3BlYyhzcGVjKSkge1xuICAgIHJldHVybiBuZXcgQ29uY2F0TW9kZWwoc3BlYywgcGFyZW50LCBwYXJlbnRHaXZlbk5hbWUsIHJlcGVhdGVyLCBjb25maWcpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKGxvZy5tZXNzYWdlLklOVkFMSURfU1BFQyk7XG59XG4iXX0=","import * as tslib_1 from \"tslib\";\nimport { initConfig, stripAndRedirectConfig } from '../config';\nimport * as vlFieldDef from '../fielddef';\nimport * as log from '../log';\nimport { isLayerSpec, isUnitSpec, normalize } from '../spec';\nimport { extractTopLevelProperties, normalizeAutoSize } from '../toplevelprops';\nimport { keys, mergeDeep } from '../util';\nimport { buildModel } from './buildmodel';\nimport { assembleRootData } from './data/assemble';\nimport { optimizeDataflow } from './data/optimize';\n/**\n * Vega-Lite's main function, for compiling Vega-lite spec into Vega spec.\n *\n * At a high-level, we make the following transformations in different phases:\n *\n * Input spec\n * |\n * | (Normalization)\n * v\n * Normalized Spec (Row/Column channels in single-view specs becomes faceted specs, composite marks becomes layered specs.)\n * |\n * | (Build Model)\n * v\n * A model tree of the spec\n * |\n * | (Parse)\n * v\n * A model tree with parsed components (intermediate structure of visualization primitives in a format that can be easily merged)\n * |\n * | (Optimize)\n * v\n * A model tree with parsed components with the data component optimized\n * |\n * | (Assemble)\n * v\n * Vega spec\n */\nexport function compile(inputSpec, opt) {\n if (opt === void 0) { opt = {}; }\n // 0. Augment opt with default opts\n if (opt.logger) {\n // set the singleton logger to the provided logger\n log.set(opt.logger);\n }\n if (opt.fieldTitle) {\n // set the singleton field title formatter\n vlFieldDef.setTitleFormatter(opt.fieldTitle);\n }\n try {\n // 1. Initialize config by deep merging default config with the config provided via option and the input spec.\n var config = initConfig(mergeDeep({}, opt.config, inputSpec.config));\n // 2. Normalize: Convert input spec -> normalized spec\n // - Decompose all extended unit specs into composition of unit spec. For example, a box plot get expanded into multiple layers of bars, ticks, and rules. The shorthand row/column channel is also expanded to a facet spec.\n var spec = normalize(inputSpec, config);\n // - Normalize autosize to be a autosize properties object.\n var autosize = normalizeAutoSize(inputSpec.autosize, config.autosize, isLayerSpec(spec) || isUnitSpec(spec));\n // 3. Build Model: normalized spec -> Model (a tree structure)\n // This phases instantiates the models with default config by doing a top-down traversal. This allows us to pass properties that child models derive from their parents via their constructors.\n // See the abstract `Model` class and its children (UnitModel, LayerModel, FacetModel, RepeatModel, ConcatModel) for different types of models.\n var model = buildModel(spec, null, '', undefined, undefined, config, autosize.type === 'fit');\n // 4 Parse: Model --> Model with components\n // Note that components = intermediate representations that are equivalent to Vega specs.\n // We need these intermediate representation because we need to merge many visualizaiton \"components\" like projections, scales, axes, and legends.\n // We will later convert these components into actual Vega specs in the assemble phase.\n // In this phase, we do a bottom-up traversal over the whole tree to\n // parse for each type of components once (e.g., data, layout, mark, scale).\n // By doing bottom-up traversal, we start parsing components of unit specs and\n // then merge child components of parent composite specs.\n //\n // Please see inside model.parse() for order of different components parsed.\n model.parse();\n // 5. Optimize the dataflow. This will modify the data component of the model.\n optimizeDataflow(model.component.data);\n // 6. Assemble: convert model components --> Vega Spec.\n return assembleTopLevelModel(model, getTopLevelProperties(inputSpec, config, autosize));\n }\n finally {\n // Reset the singleton logger if a logger is provided\n if (opt.logger) {\n log.reset();\n }\n // Reset the singleton field title formatter if provided\n if (opt.fieldTitle) {\n vlFieldDef.resetTitleFormatter();\n }\n }\n}\nfunction getTopLevelProperties(topLevelSpec, config, autosize) {\n return tslib_1.__assign({ autosize: keys(autosize).length === 1 && autosize.type ? autosize.type : autosize }, extractTopLevelProperties(config), extractTopLevelProperties(topLevelSpec));\n}\n/*\n * Assemble the top-level model.\n *\n * Note: this couldn't be `model.assemble()` since the top-level model\n * needs some special treatment to generate top-level properties.\n */\nfunction assembleTopLevelModel(model, topLevelProperties) {\n // TODO: change type to become VgSpec\n // Config with Vega-Lite only config removed.\n var vgConfig = model.config ? stripAndRedirectConfig(model.config) : undefined;\n var data = [].concat(model.assembleSelectionData([]), \n // only assemble data in the root\n assembleRootData(model.component.data, topLevelProperties.datasets || {}));\n delete topLevelProperties.datasets;\n var projections = model.assembleProjections();\n var title = model.assembleTitle();\n var style = model.assembleGroupStyle();\n var layoutSignals = model.assembleLayoutSignals();\n // move width and height signals with values to top level\n layoutSignals = layoutSignals.filter(function (signal) {\n if ((signal.name === 'width' || signal.name === 'height') && signal.value !== undefined) {\n topLevelProperties[signal.name] = +signal.value;\n return false;\n }\n return true;\n });\n var output = tslib_1.__assign({ $schema: 'https://vega.github.io/schema/vega/v3.json' }, (model.description ? { description: model.description } : {}), topLevelProperties, (title ? { title: title } : {}), (style ? { style: style } : {}), { data: data }, (projections.length > 0 ? { projections: projections } : {}), model.assembleGroup(layoutSignals.concat(model.assembleSelectionTopLevelSignals([]))), (vgConfig ? { config: vgConfig } : {}));\n return {\n spec: output\n // TODO: add warning / errors here\n };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21waWxlL2NvbXBpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBUyxVQUFVLEVBQUUsc0JBQXNCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDckUsT0FBTyxLQUFLLFVBQVUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxLQUFLLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDOUIsT0FBTyxFQUFDLFdBQVcsRUFBRSxVQUFVLEVBQW9CLFNBQVMsRUFBeUIsTUFBTSxTQUFTLENBQUM7QUFDckcsT0FBTyxFQUFpQix5QkFBeUIsRUFBRSxpQkFBaUIsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQztBQUNsSCxPQUFPLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBVWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sa0JBQWtCLFNBQXVCLEVBQUUsR0FBd0I7SUFBeEIsb0JBQUEsRUFBQSxRQUF3QjtJQUN2RSxtQ0FBbUM7SUFDbkMsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO1FBQ2Qsa0RBQWtEO1FBQ2xELEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO1FBQ2xCLDBDQUEwQztRQUMxQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzlDO0lBRUQsSUFBSTtRQUNGLDhHQUE4RztRQUM5RyxJQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXZFLHNEQUFzRDtRQUV0RCw4TkFBOE47UUFDOU4sSUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxQywyREFBMkQ7UUFDM0QsSUFBTSxRQUFRLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUvRyw4REFBOEQ7UUFFOUQsK0xBQStMO1FBQy9MLCtJQUErSTtRQUMvSSxJQUFNLEtBQUssR0FBVSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztRQUV2RywyQ0FBMkM7UUFFM0MseUZBQXlGO1FBQ3pGLGtKQUFrSjtRQUNsSix1RkFBdUY7UUFFdkYsb0VBQW9FO1FBQ3BFLDRFQUE0RTtRQUM1RSw4RUFBOEU7UUFDOUUseURBQXlEO1FBQ3pELEVBQUU7UUFDRiw0RUFBNEU7UUFDNUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRWQsK0VBQStFO1FBQy9FLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsdURBQXVEO1FBQ3ZELE9BQU8scUJBQXFCLENBQUMsS0FBSyxFQUFFLHFCQUFxQixDQUFDLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUN6RjtZQUFTO1FBQ1IscURBQXFEO1FBQ3JELElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUNkLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNiO1FBQ0Qsd0RBQXdEO1FBQ3hELElBQUksR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNsQixVQUFVLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztTQUNsQztLQUNGO0FBQ0gsQ0FBQztBQUdELCtCQUErQixZQUEyQixFQUFFLE1BQWMsRUFBRSxRQUF3QjtJQUNsRywwQkFDRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUM5RSx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsRUFDakMseUJBQXlCLENBQUMsWUFBWSxDQUFDLEVBQzFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsK0JBQStCLEtBQVksRUFBRSxrQkFBeUQ7SUFDcEcscUNBQXFDO0lBRXJDLDZDQUE2QztJQUM3QyxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUVqRixJQUFNLElBQUksR0FBRyxFQUFFLENBQUMsTUFBTSxDQUNwQixLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO0lBQy9CLGlDQUFpQztJQUNqQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQzFFLENBQUM7SUFFRixPQUFPLGtCQUFrQixDQUFDLFFBQVEsQ0FBQztJQUVuQyxJQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNoRCxJQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDcEMsSUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFFekMsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFbEQseURBQXlEO0lBQ3pELGFBQWEsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQUEsTUFBTTtRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2RixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQ2hELE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBTSxNQUFNLHNCQUNWLE9BQU8sRUFBRSw0Q0FBNEMsSUFDbEQsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUMzRCxrQkFBa0IsRUFDbEIsQ0FBQyxLQUFLLENBQUEsQ0FBQyxDQUFDLEVBQUMsS0FBSyxPQUFBLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQ3JCLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQyxFQUFDLEtBQUssT0FBQSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUN4QixJQUFJLEVBQUUsSUFBSSxJQUNQLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFDMUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsYUFBYSxRQUNiLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsRUFDN0MsRUFDQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUN4QyxDQUFDO0lBRUYsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNO1FBQ1osa0NBQWtDO0tBQ25DLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb25maWcsIGluaXRDb25maWcsIHN0cmlwQW5kUmVkaXJlY3RDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgKiBhcyB2bEZpZWxkRGVmIGZyb20gJy4uL2ZpZWxkZGVmJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuLi9sb2cnO1xuaW1wb3J0IHtpc0xheWVyU3BlYywgaXNVbml0U3BlYywgTGF5b3V0U2l6ZU1peGlucywgbm9ybWFsaXplLCBUb3BMZXZlbCwgVG9wTGV2ZWxTcGVjfSBmcm9tICcuLi9zcGVjJztcbmltcG9ydCB7QXV0b1NpemVQYXJhbXMsIGV4dHJhY3RUb3BMZXZlbFByb3BlcnRpZXMsIG5vcm1hbGl6ZUF1dG9TaXplLCBUb3BMZXZlbFByb3BlcnRpZXN9IGZyb20gJy4uL3RvcGxldmVscHJvcHMnO1xuaW1wb3J0IHtrZXlzLCBtZXJnZURlZXB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtidWlsZE1vZGVsfSBmcm9tICcuL2J1aWxkbW9kZWwnO1xuaW1wb3J0IHthc3NlbWJsZVJvb3REYXRhfSBmcm9tICcuL2RhdGEvYXNzZW1ibGUnO1xuaW1wb3J0IHtvcHRpbWl6ZURhdGFmbG93fSBmcm9tICcuL2RhdGEvb3B0aW1pemUnO1xuaW1wb3J0IHtNb2RlbH0gZnJvbSAnLi9tb2RlbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZU9wdGlvbnMge1xuICBjb25maWc/OiBDb25maWc7XG4gIGxvZ2dlcj86IGxvZy5Mb2dnZXJJbnRlcmZhY2U7XG5cbiAgZmllbGRUaXRsZT86IHZsRmllbGREZWYuRmllbGRUaXRsZUZvcm1hdHRlcjtcbn1cblxuLyoqXG4gKiBWZWdhLUxpdGUncyBtYWluIGZ1bmN0aW9uLCBmb3IgY29tcGlsaW5nIFZlZ2EtbGl0ZSBzcGVjIGludG8gVmVnYSBzcGVjLlxuICpcbiAqIEF0IGEgaGlnaC1sZXZlbCwgd2UgbWFrZSB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9ucyBpbiBkaWZmZXJlbnQgcGhhc2VzOlxuICpcbiAqIElucHV0IHNwZWNcbiAqICAgICB8XG4gKiAgICAgfCAgKE5vcm1hbGl6YXRpb24pXG4gKiAgICAgdlxuICogTm9ybWFsaXplZCBTcGVjIChSb3cvQ29sdW1uIGNoYW5uZWxzIGluIHNpbmdsZS12aWV3IHNwZWNzIGJlY29tZXMgZmFjZXRlZCBzcGVjcywgY29tcG9zaXRlIG1hcmtzIGJlY29tZXMgbGF5ZXJlZCBzcGVjcy4pXG4gKiAgICAgfFxuICogICAgIHwgIChCdWlsZCBNb2RlbClcbiAqICAgICB2XG4gKiBBIG1vZGVsIHRyZWUgb2YgdGhlIHNwZWNcbiAqICAgICB8XG4gKiAgICAgfCAgKFBhcnNlKVxuICogICAgIHZcbiAqIEEgbW9kZWwgdHJlZSB3aXRoIHBhcnNlZCBjb21wb25lbnRzIChpbnRlcm1lZGlhdGUgc3RydWN0dXJlIG9mIHZpc3VhbGl6YXRpb24gcHJpbWl0aXZlcyBpbiBhIGZvcm1hdCB0aGF0IGNhbiBiZSBlYXNpbHkgbWVyZ2VkKVxuICogICAgIHxcbiAqICAgICB8IChPcHRpbWl6ZSlcbiAqICAgICB2XG4gKiBBIG1vZGVsIHRyZWUgd2l0aCBwYXJzZWQgY29tcG9uZW50cyB3aXRoIHRoZSBkYXRhIGNvbXBvbmVudCBvcHRpbWl6ZWRcbiAqICAgICB8XG4gKiAgICAgfCAoQXNzZW1ibGUpXG4gKiAgICAgdlxuICogVmVnYSBzcGVjXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21waWxlKGlucHV0U3BlYzogVG9wTGV2ZWxTcGVjLCBvcHQ6IENvbXBpbGVPcHRpb25zID0ge30pIHtcbiAgLy8gMC4gQXVnbWVudCBvcHQgd2l0aCBkZWZhdWx0IG9wdHNcbiAgaWYgKG9wdC5sb2dnZXIpIHtcbiAgICAvLyBzZXQgdGhlIHNpbmdsZXRvbiBsb2dnZXIgdG8gdGhlIHByb3ZpZGVkIGxvZ2dlclxuICAgIGxvZy5zZXQob3B0LmxvZ2dlcik7XG4gIH1cblxuICBpZiAob3B0LmZpZWxkVGl0bGUpIHtcbiAgICAvLyBzZXQgdGhlIHNpbmdsZXRvbiBmaWVsZCB0aXRsZSBmb3JtYXR0ZXJcbiAgICB2bEZpZWxkRGVmLnNldFRpdGxlRm9ybWF0dGVyKG9wdC5maWVsZFRpdGxlKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gMS4gSW5pdGlhbGl6ZSBjb25maWcgYnkgZGVlcCBtZXJnaW5nIGRlZmF1bHQgY29uZmlnIHdpdGggdGhlIGNvbmZpZyBwcm92aWRlZCB2aWEgb3B0aW9uIGFuZCB0aGUgaW5wdXQgc3BlYy5cbiAgICBjb25zdCBjb25maWcgPSBpbml0Q29uZmlnKG1lcmdlRGVlcCh7fSwgb3B0LmNvbmZpZywgaW5wdXRTcGVjLmNvbmZpZykpO1xuXG4gICAgLy8gMi4gTm9ybWFsaXplOiBDb252ZXJ0IGlucHV0IHNwZWMgLT4gbm9ybWFsaXplZCBzcGVjXG5cbiAgICAvLyAtIERlY29tcG9zZSBhbGwgZXh0ZW5kZWQgdW5pdCBzcGVjcyBpbnRvIGNvbXBvc2l0aW9uIG9mIHVuaXQgc3BlYy4gIEZvciBleGFtcGxlLCBhIGJveCBwbG90IGdldCBleHBhbmRlZCBpbnRvIG11bHRpcGxlIGxheWVycyBvZiBiYXJzLCB0aWNrcywgYW5kIHJ1bGVzLiBUaGUgc2hvcnRoYW5kIHJvdy9jb2x1bW4gY2hhbm5lbCBpcyBhbHNvIGV4cGFuZGVkIHRvIGEgZmFjZXQgc3BlYy5cbiAgICBjb25zdCBzcGVjID0gbm9ybWFsaXplKGlucHV0U3BlYywgY29uZmlnKTtcbiAgICAvLyAtIE5vcm1hbGl6ZSBhdXRvc2l6ZSB0byBiZSBhIGF1dG9zaXplIHByb3BlcnRpZXMgb2JqZWN0LlxuICAgIGNvbnN0IGF1dG9zaXplID0gbm9ybWFsaXplQXV0b1NpemUoaW5wdXRTcGVjLmF1dG9zaXplLCBjb25maWcuYXV0b3NpemUsIGlzTGF5ZXJTcGVjKHNwZWMpIHx8IGlzVW5pdFNwZWMoc3BlYykpO1xuXG4gICAgLy8gMy4gQnVpbGQgTW9kZWw6IG5vcm1hbGl6ZWQgc3BlYyAtPiBNb2RlbCAoYSB0cmVlIHN0cnVjdHVyZSlcblxuICAgIC8vIFRoaXMgcGhhc2VzIGluc3RhbnRpYXRlcyB0aGUgbW9kZWxzIHdpdGggZGVmYXVsdCBjb25maWcgYnkgZG9pbmcgYSB0b3AtZG93biB0cmF2ZXJzYWwuIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgcHJvcGVydGllcyB0aGF0IGNoaWxkIG1vZGVscyBkZXJpdmUgZnJvbSB0aGVpciBwYXJlbnRzIHZpYSB0aGVpciBjb25zdHJ1Y3RvcnMuXG4gICAgLy8gU2VlIHRoZSBhYnN0cmFjdCBgTW9kZWxgIGNsYXNzIGFuZCBpdHMgY2hpbGRyZW4gKFVuaXRNb2RlbCwgTGF5ZXJNb2RlbCwgRmFjZXRNb2RlbCwgUmVwZWF0TW9kZWwsIENvbmNhdE1vZGVsKSBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1vZGVscy5cbiAgICBjb25zdCBtb2RlbDogTW9kZWwgPSBidWlsZE1vZGVsKHNwZWMsIG51bGwsICcnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY29uZmlnLCBhdXRvc2l6ZS50eXBlID09PSAnZml0Jyk7XG5cbiAgICAvLyA0IFBhcnNlOiBNb2RlbCAtLT4gTW9kZWwgd2l0aCBjb21wb25lbnRzXG5cbiAgICAvLyBOb3RlIHRoYXQgY29tcG9uZW50cyA9IGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbnMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byBWZWdhIHNwZWNzLlxuICAgIC8vIFdlIG5lZWQgdGhlc2UgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIGJlY2F1c2Ugd2UgbmVlZCB0byBtZXJnZSBtYW55IHZpc3VhbGl6YWl0b24gXCJjb21wb25lbnRzXCIgbGlrZSBwcm9qZWN0aW9ucywgc2NhbGVzLCBheGVzLCBhbmQgbGVnZW5kcy5cbiAgICAvLyBXZSB3aWxsIGxhdGVyIGNvbnZlcnQgdGhlc2UgY29tcG9uZW50cyBpbnRvIGFjdHVhbCBWZWdhIHNwZWNzIGluIHRoZSBhc3NlbWJsZSBwaGFzZS5cblxuICAgIC8vIEluIHRoaXMgcGhhc2UsIHdlIGRvIGEgYm90dG9tLXVwIHRyYXZlcnNhbCBvdmVyIHRoZSB3aG9sZSB0cmVlIHRvXG4gICAgLy8gcGFyc2UgZm9yIGVhY2ggdHlwZSBvZiBjb21wb25lbnRzIG9uY2UgKGUuZy4sIGRhdGEsIGxheW91dCwgbWFyaywgc2NhbGUpLlxuICAgIC8vIEJ5IGRvaW5nIGJvdHRvbS11cCB0cmF2ZXJzYWwsIHdlIHN0YXJ0IHBhcnNpbmcgY29tcG9uZW50cyBvZiB1bml0IHNwZWNzIGFuZFxuICAgIC8vIHRoZW4gbWVyZ2UgY2hpbGQgY29tcG9uZW50cyBvZiBwYXJlbnQgY29tcG9zaXRlIHNwZWNzLlxuICAgIC8vXG4gICAgLy8gUGxlYXNlIHNlZSBpbnNpZGUgbW9kZWwucGFyc2UoKSBmb3Igb3JkZXIgb2YgZGlmZmVyZW50IGNvbXBvbmVudHMgcGFyc2VkLlxuICAgIG1vZGVsLnBhcnNlKCk7XG5cbiAgICAvLyA1LiBPcHRpbWl6ZSB0aGUgZGF0YWZsb3cuICBUaGlzIHdpbGwgbW9kaWZ5IHRoZSBkYXRhIGNvbXBvbmVudCBvZiB0aGUgbW9kZWwuXG4gICAgb3B0aW1pemVEYXRhZmxvdyhtb2RlbC5jb21wb25lbnQuZGF0YSk7XG5cbiAgICAvLyA2LiBBc3NlbWJsZTogY29udmVydCBtb2RlbCBjb21wb25lbnRzIC0tPiBWZWdhIFNwZWMuXG4gICAgcmV0dXJuIGFzc2VtYmxlVG9wTGV2ZWxNb2RlbChtb2RlbCwgZ2V0VG9wTGV2ZWxQcm9wZXJ0aWVzKGlucHV0U3BlYywgY29uZmlnLCBhdXRvc2l6ZSkpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIFJlc2V0IHRoZSBzaW5nbGV0b24gbG9nZ2VyIGlmIGEgbG9nZ2VyIGlzIHByb3ZpZGVkXG4gICAgaWYgKG9wdC5sb2dnZXIpIHtcbiAgICAgIGxvZy5yZXNldCgpO1xuICAgIH1cbiAgICAvLyBSZXNldCB0aGUgc2luZ2xldG9uIGZpZWxkIHRpdGxlIGZvcm1hdHRlciBpZiBwcm92aWRlZFxuICAgIGlmIChvcHQuZmllbGRUaXRsZSkge1xuICAgICAgdmxGaWVsZERlZi5yZXNldFRpdGxlRm9ybWF0dGVyKCk7XG4gICAgfVxuICB9XG59XG5cblxuZnVuY3Rpb24gZ2V0VG9wTGV2ZWxQcm9wZXJ0aWVzKHRvcExldmVsU3BlYzogVG9wTGV2ZWw8YW55PiwgY29uZmlnOiBDb25maWcsIGF1dG9zaXplOiBBdXRvU2l6ZVBhcmFtcykge1xuICByZXR1cm4ge1xuICAgIGF1dG9zaXplOiBrZXlzKGF1dG9zaXplKS5sZW5ndGggPT09IDEgJiYgYXV0b3NpemUudHlwZSA/IGF1dG9zaXplLnR5cGUgOiBhdXRvc2l6ZSxcbiAgICAuLi5leHRyYWN0VG9wTGV2ZWxQcm9wZXJ0aWVzKGNvbmZpZyksXG4gICAgLi4uZXh0cmFjdFRvcExldmVsUHJvcGVydGllcyh0b3BMZXZlbFNwZWMpXG4gIH07XG59XG5cbi8qXG4gKiBBc3NlbWJsZSB0aGUgdG9wLWxldmVsIG1vZGVsLlxuICpcbiAqIE5vdGU6IHRoaXMgY291bGRuJ3QgYmUgYG1vZGVsLmFzc2VtYmxlKClgIHNpbmNlIHRoZSB0b3AtbGV2ZWwgbW9kZWxcbiAqIG5lZWRzIHNvbWUgc3BlY2lhbCB0cmVhdG1lbnQgdG8gZ2VuZXJhdGUgdG9wLWxldmVsIHByb3BlcnRpZXMuXG4gKi9cbmZ1bmN0aW9uIGFzc2VtYmxlVG9wTGV2ZWxNb2RlbChtb2RlbDogTW9kZWwsIHRvcExldmVsUHJvcGVydGllczogVG9wTGV2ZWxQcm9wZXJ0aWVzICYgTGF5b3V0U2l6ZU1peGlucykge1xuICAvLyBUT0RPOiBjaGFuZ2UgdHlwZSB0byBiZWNvbWUgVmdTcGVjXG5cbiAgLy8gQ29uZmlnIHdpdGggVmVnYS1MaXRlIG9ubHkgY29uZmlnIHJlbW92ZWQuXG4gIGNvbnN0IHZnQ29uZmlnID0gbW9kZWwuY29uZmlnID8gc3RyaXBBbmRSZWRpcmVjdENvbmZpZyhtb2RlbC5jb25maWcpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGRhdGEgPSBbXS5jb25jYXQoXG4gICAgbW9kZWwuYXNzZW1ibGVTZWxlY3Rpb25EYXRhKFtdKSxcbiAgICAvLyBvbmx5IGFzc2VtYmxlIGRhdGEgaW4gdGhlIHJvb3RcbiAgICBhc3NlbWJsZVJvb3REYXRhKG1vZGVsLmNvbXBvbmVudC5kYXRhLCB0b3BMZXZlbFByb3BlcnRpZXMuZGF0YXNldHMgfHwge30pXG4gICk7XG5cbiAgZGVsZXRlIHRvcExldmVsUHJvcGVydGllcy5kYXRhc2V0cztcblxuICBjb25zdCBwcm9qZWN0aW9ucyA9IG1vZGVsLmFzc2VtYmxlUHJvamVjdGlvbnMoKTtcbiAgY29uc3QgdGl0bGUgPSBtb2RlbC5hc3NlbWJsZVRpdGxlKCk7XG4gIGNvbnN0IHN0eWxlID0gbW9kZWwuYXNzZW1ibGVHcm91cFN0eWxlKCk7XG5cbiAgbGV0IGxheW91dFNpZ25hbHMgPSBtb2RlbC5hc3NlbWJsZUxheW91dFNpZ25hbHMoKTtcblxuICAvLyBtb3ZlIHdpZHRoIGFuZCBoZWlnaHQgc2lnbmFscyB3aXRoIHZhbHVlcyB0byB0b3AgbGV2ZWxcbiAgbGF5b3V0U2lnbmFscyA9IGxheW91dFNpZ25hbHMuZmlsdGVyKHNpZ25hbCA9PiB7XG4gICAgaWYgKChzaWduYWwubmFtZSA9PT0gJ3dpZHRoJyB8fCBzaWduYWwubmFtZSA9PT0gJ2hlaWdodCcpICYmIHNpZ25hbC52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0b3BMZXZlbFByb3BlcnRpZXNbc2lnbmFsLm5hbWVdID0gK3NpZ25hbC52YWx1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dCA9IHtcbiAgICAkc2NoZW1hOiAnaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby9zY2hlbWEvdmVnYS92My5qc29uJyxcbiAgICAuLi4obW9kZWwuZGVzY3JpcHRpb24gPyB7ZGVzY3JpcHRpb246IG1vZGVsLmRlc2NyaXB0aW9ufSA6IHt9KSxcbiAgICAuLi50b3BMZXZlbFByb3BlcnRpZXMsXG4gICAgLi4uKHRpdGxlPyB7dGl0bGV9IDoge30pLFxuICAgIC4uLihzdHlsZT8ge3N0eWxlfSA6IHt9KSxcbiAgICBkYXRhOiBkYXRhLFxuICAgIC4uLihwcm9qZWN0aW9ucy5sZW5ndGggPiAwID8ge3Byb2plY3Rpb25zOiBwcm9qZWN0aW9uc30gOiB7fSksXG4gICAgLi4ubW9kZWwuYXNzZW1ibGVHcm91cChbXG4gICAgICAuLi5sYXlvdXRTaWduYWxzLFxuICAgICAgLi4ubW9kZWwuYXNzZW1ibGVTZWxlY3Rpb25Ub3BMZXZlbFNpZ25hbHMoW10pXG4gICAgXSksXG4gICAgLi4uKHZnQ29uZmlnID8ge2NvbmZpZzogdmdDb25maWd9IDoge30pXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBzcGVjOiBvdXRwdXRcbiAgICAvLyBUT0RPOiBhZGQgd2FybmluZyAvIGVycm9ycyBoZXJlXG4gIH07XG59XG4iXX0=","import { toSet } from 'vega-util';\nimport { isMarkDef } from './mark';\nimport { BAR } from './mark';\n/**\n * Required Encoding Channels for each mark type\n */\nexport var DEFAULT_REQUIRED_CHANNEL_MAP = {\n text: ['text'],\n line: ['x', 'y'],\n trail: ['x', 'y'],\n area: ['x', 'y']\n};\n/**\n * Supported Encoding Channel for each mark type\n */\nexport var DEFAULT_SUPPORTED_CHANNEL_TYPE = {\n bar: toSet(['row', 'column', 'x', 'y', 'size', 'color', 'fill', 'stroke', 'detail']),\n line: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail']),\n trail: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'color', 'detail', 'size']),\n area: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']),\n tick: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'detail']),\n circle: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']),\n square: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail']),\n point: toSet(['row', 'column', 'x', 'y', 'color', 'fill', 'stroke', 'size', 'detail', 'shape']),\n geoshape: toSet(['row', 'column', 'color', 'fill', 'stroke', 'detail', 'shape']),\n text: toSet(['row', 'column', 'size', 'color', 'fill', 'stroke', 'text']) // TODO(#724) revise\n};\n// TODO: consider if we should add validate method and\n// requires ZSchema in the main vega-lite repo\n/**\n * Further check if encoding mapping of a spec is invalid and\n * return error if it is invalid.\n *\n * This checks if\n * (1) all the required encoding channels for the mark type are specified\n * (2) all the specified encoding channels are supported by the mark type\n * @param {[type]} spec [description]\n * @param {RequiredChannelMap = DefaultRequiredChannelMap} requiredChannelMap\n * @param {SupportedChannelMap = DefaultSupportedChannelMap} supportedChannelMap\n * @return {String} Return one reason why the encoding is invalid,\n * or null if the encoding is valid.\n */\nexport function getEncodingMappingError(spec, requiredChannelMap, supportedChannelMap) {\n if (requiredChannelMap === void 0) { requiredChannelMap = DEFAULT_REQUIRED_CHANNEL_MAP; }\n if (supportedChannelMap === void 0) { supportedChannelMap = DEFAULT_SUPPORTED_CHANNEL_TYPE; }\n var mark = isMarkDef(spec.mark) ? spec.mark.type : spec.mark;\n var encoding = spec.encoding;\n var requiredChannels = requiredChannelMap[mark];\n var supportedChannels = supportedChannelMap[mark];\n for (var i in requiredChannels) { // all required channels are in encoding`\n if (!(requiredChannels[i] in encoding)) {\n return 'Missing encoding channel \\\"' + requiredChannels[i] +\n '\\\" for mark \\\"' + mark + '\\\"';\n }\n }\n for (var channel in encoding) { // all channels in encoding are supported\n if (!supportedChannels[channel]) {\n return 'Encoding channel \\\"' + channel +\n '\\\" is not supported by mark type \\\"' + mark + '\\\"';\n }\n }\n if (mark === BAR && !encoding.x && !encoding.y) {\n return 'Missing both x and y for bar';\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFVM0I7O0dBRUc7QUFDSCxNQUFNLENBQUMsSUFBTSw0QkFBNEIsR0FBdUI7SUFDOUQsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2QsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUNoQixLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2pCLElBQUksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7Q0FDakIsQ0FBQztBQVFGOztHQUVHO0FBQ0gsTUFBTSxDQUFDLElBQU0sOEJBQThCLEdBQXdCO0lBQ2pFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3BGLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RGLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvRixJQUFJLEVBQUUsS0FBSyxDQUFDLENB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dXRpbCc7XG5pbXBvcnQge2lzTWFya0RlZn0gZnJvbSAnLi9tYXJrJztcbmltcG9ydCB7QkFSfSBmcm9tICcuL21hcmsnO1xuaW1wb3J0IHtGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWN9IGZyb20gJy4vc3BlYyc7XG5cblxuXG4vLyBUT0RPOiBtb3ZlIHRvIHZsLnNwZWMudmFsaWRhdG9yP1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlZENoYW5uZWxNYXAge1xuICBbbWFyazogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjtcbn1cblxuLyoqXG4gKiBSZXF1aXJlZCBFbmNvZGluZyBDaGFubmVscyBmb3IgZWFjaCBtYXJrIHR5cGVcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVRVUlSRURfQ0hBTk5FTF9NQVA6IFJlcXVpcmVkQ2hhbm5lbE1hcCA9IHtcbiAgdGV4dDogWyd0ZXh0J10sXG4gIGxpbmU6IFsneCcsICd5J10sXG4gIHRyYWlsOiBbJ3gnLCAneSddLFxuICBhcmVhOiBbJ3gnLCAneSddXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFN1cHBvcnRlZENoYW5uZWxNYXAge1xuICBbbWFyazogc3RyaW5nXToge1xuICAgIFtjaGFubmVsOiBzdHJpbmddOiBib29sZWFuXG4gIH07XG59XG5cbi8qKlxuICogU3VwcG9ydGVkIEVuY29kaW5nIENoYW5uZWwgZm9yIGVhY2ggbWFyayB0eXBlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NVUFBPUlRFRF9DSEFOTkVMX1RZUEU6IFN1cHBvcnRlZENoYW5uZWxNYXAgPSB7XG4gIGJhcjogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdzaXplJywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2RldGFpbCddKSxcbiAgbGluZTogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdjb2xvcicsICdkZXRhaWwnXSksXG4gIHRyYWlsOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2NvbG9yJywgJ2RldGFpbCcsICdzaXplJ10pLFxuICBhcmVhOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ2RldGFpbCddKSxcbiAgdGljazogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdkZXRhaWwnXSksXG4gIGNpcmNsZTogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdzaXplJywgJ2RldGFpbCddKSxcbiAgc3F1YXJlOiB0b1NldChbJ3JvdycsICdjb2x1bW4nLCAneCcsICd5JywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ3NpemUnLCAnZGV0YWlsJ10pLFxuICBwb2ludDogdG9TZXQoWydyb3cnLCAnY29sdW1uJywgJ3gnLCAneScsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdzaXplJywgJ2RldGFpbCcsICdzaGFwZSddKSxcbiAgZ2Vvc2hhcGU6IHRvU2V0KFsncm93JywgJ2NvbHVtbicsICdjb2xvcicsICdmaWxsJywgJ3N0cm9rZScsICdkZXRhaWwnLCAnc2hhcGUnXSksXG4gIHRleHQ6IHRvU2V0KFsncm93JywgJ2NvbHVtbicsICdzaXplJywgJ2NvbG9yJywgJ2ZpbGwnLCAnc3Ryb2tlJywgJ3RleHQnXSkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETygjNzI0KSByZXZpc2Vcbn07XG5cbi8vIFRPRE86IGNvbnNpZGVyIGlmIHdlIHNob3VsZCBhZGQgdmFsaWRhdGUgbWV0aG9kIGFuZFxuLy8gcmVxdWlyZXMgWlNjaGVtYSBpbiB0aGUgbWFpbiB2ZWdhLWxpdGUgcmVwb1xuXG4vKipcbiAqIEZ1cnRoZXIgY2hlY2sgaWYgZW5jb2RpbmcgbWFwcGluZyBvZiBhIHNwZWMgaXMgaW52YWxpZCBhbmRcbiAqIHJldHVybiBlcnJvciBpZiBpdCBpcyBpbnZhbGlkLlxuICpcbiAqIFRoaXMgY2hlY2tzIGlmXG4gKiAoMSkgYWxsIHRoZSByZXF1aXJlZCBlbmNvZGluZyBjaGFubmVscyBmb3IgdGhlIG1hcmsgdHlwZSBhcmUgc3BlY2lmaWVkXG4gKiAoMikgYWxsIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgbWFyayB0eXBlXG4gKiBAcGFyYW0gIHtbdHlwZV19IHNwZWMgW2Rlc2NyaXB0aW9uXVxuICogQHBhcmFtICB7UmVxdWlyZWRDaGFubmVsTWFwID0gRGVmYXVsdFJlcXVpcmVkQ2hhbm5lbE1hcH0gIHJlcXVpcmVkQ2hhbm5lbE1hcFxuICogQHBhcmFtICB7U3VwcG9ydGVkQ2hhbm5lbE1hcCA9IERlZmF1bHRTdXBwb3J0ZWRDaGFubmVsTWFwfSBzdXBwb3J0ZWRDaGFubmVsTWFwXG4gKiBAcmV0dXJuIHtTdHJpbmd9IFJldHVybiBvbmUgcmVhc29uIHdoeSB0aGUgZW5jb2RpbmcgaXMgaW52YWxpZCxcbiAqICAgICAgICAgICAgICAgICAgb3IgbnVsbCBpZiB0aGUgZW5jb2RpbmcgaXMgdmFsaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbmNvZGluZ01hcHBpbmdFcnJvcihzcGVjOiBGYWNldGVkQ29tcG9zaXRlVW5pdFNwZWMsXG4gIHJlcXVpcmVkQ2hhbm5lbE1hcDogUmVxdWlyZWRDaGFubmVsTWFwID0gREVGQVVMVF9SRVFVSVJFRF9DSEFOTkVMX01BUCxcbiAgc3VwcG9ydGVkQ2hhbm5lbE1hcDogU3VwcG9ydGVkQ2hhbm5lbE1hcCA9IERFRkFVTFRfU1VQUE9SVEVEX0NIQU5ORUxfVFlQRVxuICApIHtcbiAgY29uc3QgbWFyayA9IGlzTWFya0RlZihzcGVjLm1hcmspID8gc3BlYy5tYXJrLnR5cGUgOiBzcGVjLm1hcms7XG4gIGNvbnN0IGVuY29kaW5nID0gc3BlYy5lbmNvZGluZztcbiAgY29uc3QgcmVxdWlyZWRDaGFubmVscyA9IHJlcXVpcmVkQ2hhbm5lbE1hcFttYXJrXTtcbiAgY29uc3Qgc3VwcG9ydGVkQ2hhbm5lbHMgPSBzdXBwb3J0ZWRDaGFubmVsTWFwW21hcmtdO1xuXG4gIGZvciAoY29uc3QgaSBpbiByZXF1aXJlZENoYW5uZWxzKSB7IC8vIGFsbCByZXF1aXJlZCBjaGFubmVscyBhcmUgaW4gZW5jb2RpbmdgXG4gICAgaWYgKCEocmVxdWlyZWRDaGFubmVsc1tpXSBpbiBlbmNvZGluZykpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBlbmNvZGluZyBjaGFubmVsIFxcXCInICsgcmVxdWlyZWRDaGFubmVsc1tpXSArXG4gICAgICAgICdcXFwiIGZvciBtYXJrIFxcXCInICsgbWFyayArICdcXFwiJztcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGNoYW5uZWwgaW4gZW5jb2RpbmcpIHsgLy8gYWxsIGNoYW5uZWxzIGluIGVuY29kaW5nIGFyZSBzdXBwb3J0ZWRcbiAgICBpZiAoIXN1cHBvcnRlZENoYW5uZWxzW2NoYW5uZWxdKSB7XG4gICAgICByZXR1cm4gJ0VuY29kaW5nIGNoYW5uZWwgXFxcIicgKyBjaGFubmVsICtcbiAgICAgICAgJ1xcXCIgaXMgbm90IHN1cHBvcnRlZCBieSBtYXJrIHR5cGUgXFxcIicgKyBtYXJrICsgJ1xcXCInO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtYXJrID09PSBCQVIgJiYgIWVuY29kaW5nLnggJiYgIWVuY29kaW5nLnkpIHtcbiAgICByZXR1cm4gJ01pc3NpbmcgYm90aCB4IGFuZCB5IGZvciBiYXInO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0="],"names":["stringValue","Error","error","array","require$$0","require$$1","isArray","tslib_1.__assign","stringify","stableStringify","key","isBoolean","tslib_1.__rest","TEXT","field","log.warn","log.message","normalize","defaultConfig","mark.defaultMarkConfig","mark.defaultBarConfig","mark.defaultTickConfig","defaultSelectionConfig","compositeMark.normalize","vlEncoding.fieldDefs","fieldDefs","parseSelector","title","fieldDefTitle","bin","text","ref.midPoint","ref.text","ref.fieldRef","ref.bandRef","ref.bin","ref.getOffset","ref.stackable","ref.getDefaultRef","ref.stackable2","tslib_1.__extends","mixins.color","vals","type","properties.values","properties.type","log.debug","fieldRef","optimizers.iterateFromLeaves","optimizers.removeUnusedSubtrees","optimizers.moveParseUp","optimizers.removeDuplicateTimeUnits","util.keys","util.hash","util.isBoolean","util.replacePathInField","util.contains","util.unique","zero","defaultType","domain","scales","multiSignals","signals","scalesCompiler","INTERVAL_BRUSH","ANCHOR","DELTA","zoom","onDelta","inputs","contains","singleCompiler","multiCompiler","intervalCompiler","fieldExpr","timeUnitFieldExpr","isTimeUnit","isAggregate","hash","labels","labelAlign","labelBaseline","values","orient","getProperty","encode.labels","properties.gridScale","properties.grid","properties.labelFlush","properties.labelOverlap","properties.orient","properties.tickCount","mixins.baseEncodeEntry","mixins.pointPosition","mixins.pointPosition2","mixins.defined","mixins.binnedPosition","mixins.bandPosition","mixins.centeredBandPosition","ref.mid","mixins.nonPosition","x","y","mixins.text","mixins.valueIfDefined","vlEncoding.channelHasField","log.set","vlFieldDef.setTitleFormatter","log.reset","vlFieldDef.resetTitleFormatter"],"mappings":"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"} \ No newline at end of file