@carto/kepler.gl 0.0.65-alpha.labels.8 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +2 -3
- package/dist/components/side-panel/layer-panel/layer-configurator.js +1 -2
- package/dist/components/side-panel/layer-panel/text-label-panel.js +67 -82
- package/dist/constants/default-settings.js +2 -2
- package/dist/index.js +2 -12
- package/dist/layers/base-layer.js +3 -3
- package/dist/layers/layer-factory.js +1 -16
- package/dist/layers/layer-text-label.js +9 -10
- package/dist/layers/point-layer/point-layer.js +2 -2
- package/dist/localization/en.js +3 -3
- package/dist/reducers/vis-state-updaters.js +15 -7
- package/package.json +9 -8
- package/src/components/side-panel/layer-panel/layer-configurator.js +0 -1
- package/src/components/side-panel/layer-panel/text-label-panel.js +2 -14
- package/src/index.js +0 -3
- package/src/layers/base-layer.js +1 -1
- package/src/layers/layer-factory.js +0 -15
- package/src/layers/layer-text-label.js +13 -8
- package/src/layers/point-layer/point-layer.js +1 -1
- package/src/localization/en.js +2 -2
- package/src/reducers/vis-state-updaters.js +11 -8
- package/dist/deckgl-layers/point-label-layer/point-label-layer.js +0 -280
- package/src/components/common/item-selector/.chickleted-input.js.swp +0 -0
- package/src/components/side-panel/layer-panel/.text-label-panel.js.swp +0 -0
- package/src/deckgl-layers/point-label-layer/point-label-layer.js +0 -215
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@carto/kepler.gl",
|
|
3
3
|
"author": "CARTO",
|
|
4
4
|
"homepage": "https://github.com/CartoDB/carto-kepler#readme",
|
|
5
|
-
"version": "0.0.65
|
|
5
|
+
"version": "0.0.65",
|
|
6
6
|
"description": "kepler.gl is a webgl based application to visualize large scale location data in the browser",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"main": "dist/index.js",
|
|
@@ -238,13 +238,14 @@
|
|
|
238
238
|
"tough-cookie": "4.0.0"
|
|
239
239
|
},
|
|
240
240
|
"peerDependencies": {
|
|
241
|
-
"@deck.gl/aggregation-layers": "^8.
|
|
242
|
-
"@deck.gl/
|
|
243
|
-
"@deck.gl/
|
|
244
|
-
"@deck.gl/
|
|
245
|
-
"@deck.gl/layers": "^8.
|
|
246
|
-
"@deck.gl/
|
|
247
|
-
"@deck.gl/
|
|
241
|
+
"@deck.gl/aggregation-layers": "^8.9.5",
|
|
242
|
+
"@deck.gl/carto": "^8.9.5",
|
|
243
|
+
"@deck.gl/core": "^8.9.5",
|
|
244
|
+
"@deck.gl/extensions": "^8.9.5",
|
|
245
|
+
"@deck.gl/geo-layers": "^8.9.5",
|
|
246
|
+
"@deck.gl/layers": "^8.9.5",
|
|
247
|
+
"@deck.gl/mesh-layers": "^8.9.5",
|
|
248
|
+
"@deck.gl/react": "^8.9.5",
|
|
248
249
|
"@loaders.gl/core": "^3.1.5",
|
|
249
250
|
"@loaders.gl/csv": "^3.1.5",
|
|
250
251
|
"@loaders.gl/gltf": "^3.1.5",
|
|
@@ -246,7 +246,6 @@ export default function LayerConfiguratorFactory(
|
|
|
246
246
|
{/* text label */}
|
|
247
247
|
<TextLabelPanel
|
|
248
248
|
fields={visConfiguratorProps.fields}
|
|
249
|
-
layer={layer}
|
|
250
249
|
updateLayerTextLabel={this.props.updateLayerTextLabel}
|
|
251
250
|
textLabel={layer.config.textLabel}
|
|
252
251
|
colorPalette={visConfiguratorProps.colorPalette}
|
|
@@ -65,28 +65,16 @@ function TextLabelPanelFactory(RangeSlider, LayerConfigGroup, FieldSelector, Col
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
render() {
|
|
68
|
-
const {
|
|
68
|
+
const {updateLayerTextLabel, textLabel, fields, AddButton} = this.props;
|
|
69
69
|
const currentFields = textLabel.map(tl => tl.field && tl.field.name).filter(d => d);
|
|
70
70
|
|
|
71
71
|
return (
|
|
72
|
-
// Switch only works with group/property set to customMarkers???
|
|
73
|
-
/* <LayerConfigGroup
|
|
74
|
-
type="boolean"
|
|
75
|
-
disabled={undefined}
|
|
76
|
-
layer={layer}
|
|
77
|
-
group="labels"
|
|
78
|
-
property="labelsEnabled"
|
|
79
|
-
label="panel.text.label"
|
|
80
|
-
collapsible
|
|
81
|
-
>*/
|
|
82
72
|
<LayerConfigGroup label={'panel.text.label'} collapsible>
|
|
83
73
|
<ConfigGroupCollapsibleHeader>
|
|
84
74
|
<FieldSelector
|
|
85
75
|
fields={fields}
|
|
86
76
|
value={currentFields}
|
|
87
|
-
onSelect={selected =>
|
|
88
|
-
selected.length <= 2 && updateLayerTextLabel('all', 'fields', selected);
|
|
89
|
-
}}
|
|
77
|
+
onSelect={selected => updateLayerTextLabel('all', 'fields', selected)}
|
|
90
78
|
multiSelect
|
|
91
79
|
/>
|
|
92
80
|
</ConfigGroupCollapsibleHeader>
|
package/src/index.js
CHANGED
package/src/layers/base-layer.js
CHANGED
|
@@ -22,7 +22,7 @@ import {console as Console} from 'global/window';
|
|
|
22
22
|
import keymirror from 'keymirror';
|
|
23
23
|
import {CollisionFilterExtension, DataFilterExtension} from '@deck.gl/extensions';
|
|
24
24
|
import {COORDINATE_SYSTEM, Layer as DeckLayer} from '@deck.gl/core';
|
|
25
|
-
import {PointLabelLayer} from '
|
|
25
|
+
import {_PointLabelLayer as PointLabelLayer} from '@deck.gl/carto';
|
|
26
26
|
import DefaultLayerIcon from './default-layer-icon';
|
|
27
27
|
import {diffUpdateTriggers} from './layer-update';
|
|
28
28
|
|
|
@@ -27,7 +27,6 @@ export const PROPERTY_GROUPS = keyMirror({
|
|
|
27
27
|
color: null,
|
|
28
28
|
stroke: null,
|
|
29
29
|
customMarkers: null,
|
|
30
|
-
labels: null,
|
|
31
30
|
radius: null,
|
|
32
31
|
height: null,
|
|
33
32
|
angle: null,
|
|
@@ -396,13 +395,6 @@ export const LAYER_VIS_CONFIGS = {
|
|
|
396
395
|
group: PROPERTY_GROUPS.display,
|
|
397
396
|
property: 'filled'
|
|
398
397
|
},
|
|
399
|
-
labels: {
|
|
400
|
-
type: 'boolean',
|
|
401
|
-
label: 'layerVisConfigs.labels',
|
|
402
|
-
defaultValue: false,
|
|
403
|
-
group: PROPERTY_GROUPS.labels,
|
|
404
|
-
property: 'labels'
|
|
405
|
-
},
|
|
406
398
|
extruded: {
|
|
407
399
|
type: 'boolean',
|
|
408
400
|
defaultValue: false,
|
|
@@ -446,13 +438,6 @@ export const LAYER_VIS_CONFIGS = {
|
|
|
446
438
|
group: PROPERTY_GROUPS.customMarkers,
|
|
447
439
|
property: 'customMarkers'
|
|
448
440
|
},
|
|
449
|
-
labelsEnabled: {
|
|
450
|
-
type: 'boolean',
|
|
451
|
-
defaultValue: true,
|
|
452
|
-
label: 'layerVisConfigs.labelsEnabled',
|
|
453
|
-
group: PROPERTY_GROUPS.labels,
|
|
454
|
-
property: 'labelsEnabled'
|
|
455
|
-
},
|
|
456
441
|
customMarkersUrl: {
|
|
457
442
|
type: 'text',
|
|
458
443
|
defaultValue: '',
|
|
@@ -21,25 +21,30 @@
|
|
|
21
21
|
import {notNullorUndefined} from 'utils/data-utils';
|
|
22
22
|
import uniq from 'lodash.uniq';
|
|
23
23
|
|
|
24
|
+
export const defaultPadding = 20;
|
|
25
|
+
|
|
24
26
|
export function getTextOffsetByRadius(radiusScale, getRadius) {
|
|
25
27
|
return textLabel => {
|
|
26
28
|
const xMult = textLabel.anchor === 'middle' ? 0 : textLabel.anchor === 'start' ? 1 : -1;
|
|
27
29
|
const yMult = textLabel.alignment === 'center' ? 0 : textLabel.alignment === 'bottom' ? 1 : -1;
|
|
28
30
|
|
|
29
|
-
const sizeOffset =
|
|
31
|
+
const sizeOffset =
|
|
32
|
+
textLabel.alignment === 'center'
|
|
33
|
+
? 0
|
|
34
|
+
: textLabel.alignment === 'bottom'
|
|
35
|
+
? textLabel.size
|
|
36
|
+
: textLabel.size;
|
|
30
37
|
|
|
31
|
-
const
|
|
32
|
-
const yPadding = textLabel.size;
|
|
33
|
-
const radiusPadding = 1 + 1 / 4; // Padding based on point radius (radius/ 4)
|
|
38
|
+
const padding = defaultPadding;
|
|
34
39
|
|
|
35
40
|
return typeof getRadius === 'function'
|
|
36
41
|
? d => [
|
|
37
|
-
xMult * (getRadius(d) * radiusScale
|
|
38
|
-
yMult * (getRadius(d) * radiusScale
|
|
42
|
+
xMult * (getRadius(d) * radiusScale + padding),
|
|
43
|
+
yMult * (getRadius(d) * radiusScale + padding + sizeOffset)
|
|
39
44
|
]
|
|
40
45
|
: [
|
|
41
|
-
xMult * (getRadius * radiusScale
|
|
42
|
-
yMult * (getRadius * radiusScale
|
|
46
|
+
xMult * (getRadius * radiusScale + padding),
|
|
47
|
+
yMult * (getRadius * radiusScale + padding + sizeOffset)
|
|
43
48
|
];
|
|
44
49
|
};
|
|
45
50
|
}
|
|
@@ -47,7 +47,6 @@ export const pointVisConfigs = {
|
|
|
47
47
|
customMarkers: 'customMarkers',
|
|
48
48
|
customMarkersUrl: 'customMarkersUrl',
|
|
49
49
|
customMarkersRange: 'customMarkersRange',
|
|
50
|
-
labelsEnabled: 'labelsEnabled',
|
|
51
50
|
opacity: 'opacity',
|
|
52
51
|
outline: 'outline',
|
|
53
52
|
thickness: 'thickness',
|
|
@@ -291,6 +290,7 @@ export default class PointLayer extends Layer {
|
|
|
291
290
|
getFilterValue: data.getFilterValue,
|
|
292
291
|
extensions,
|
|
293
292
|
filterRange: defaultLayerProps.filterRange,
|
|
293
|
+
maskId: defaultLayerProps.maskId,
|
|
294
294
|
visible: defaultLayerProps.visible,
|
|
295
295
|
...brushingProps
|
|
296
296
|
};
|
package/src/localization/en.js
CHANGED
|
@@ -83,7 +83,7 @@ export default {
|
|
|
83
83
|
layer: 'Layers',
|
|
84
84
|
filter: 'Filters',
|
|
85
85
|
interaction: 'Interactions',
|
|
86
|
-
basemap: '
|
|
86
|
+
basemap: 'Basemap'
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
layer: {
|
|
@@ -216,7 +216,7 @@ export default {
|
|
|
216
216
|
hideLayerPanel: 'Hide layer panel',
|
|
217
217
|
showLayerPanel: 'Show layer panel',
|
|
218
218
|
moveToTop: 'Move to top of data layers',
|
|
219
|
-
selectBaseMapStyle: 'Select
|
|
219
|
+
selectBaseMapStyle: 'Select Basemap Style',
|
|
220
220
|
delete: 'Delete',
|
|
221
221
|
timePlayback: 'Time Playback',
|
|
222
222
|
cloudStorage: 'Cloud Storage',
|
|
@@ -315,16 +315,19 @@ function addOrRemoveTextLabels(newFields, textLabel) {
|
|
|
315
315
|
|
|
316
316
|
// delete
|
|
317
317
|
newTextLabel = newTextLabel.filter(tl => tl.field && !deleteFields.includes(tl.field.name));
|
|
318
|
-
newTextLabel = !newTextLabel.length ? [DEFAULT_TEXT_LABEL] : newTextLabel;
|
|
319
318
|
|
|
320
319
|
// add
|
|
321
|
-
newTextLabel =
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
320
|
+
newTextLabel = newTextLabel.filter(tl => tl.field);
|
|
321
|
+
const defaultLabel = newTextLabel.length ? DEFAULT_SECONDARY_TEXT_LABEL : DEFAULT_TEXT_LABEL;
|
|
322
|
+
newTextLabel = [...newTextLabel, ...addFields.map(af => ({...defaultLabel, field: af}))];
|
|
323
|
+
|
|
324
|
+
// limit to 2 labels (overwrite 2nd label with 3rd)
|
|
325
|
+
if (newTextLabel.length > 2) {
|
|
326
|
+
newTextLabel = [newTextLabel[0], newTextLabel[2]];
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// default
|
|
330
|
+
newTextLabel = !newTextLabel.length ? [DEFAULT_TEXT_LABEL] : newTextLabel;
|
|
328
331
|
|
|
329
332
|
return newTextLabel;
|
|
330
333
|
}
|
|
@@ -1,280 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.PointLabelLayer = void 0;
|
|
9
|
-
|
|
10
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
|
|
12
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
13
|
-
|
|
14
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
15
|
-
|
|
16
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
17
|
-
|
|
18
|
-
var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
|
|
19
|
-
|
|
20
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
21
|
-
|
|
22
|
-
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
23
|
-
|
|
24
|
-
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
25
|
-
|
|
26
|
-
var _core = require("@deck.gl/core");
|
|
27
|
-
|
|
28
|
-
var _layers = require("@deck.gl/layers");
|
|
29
|
-
|
|
30
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
31
|
-
|
|
32
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
33
|
-
|
|
34
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
|
|
35
|
-
|
|
36
|
-
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
37
|
-
|
|
38
|
-
// TODO remove prior to release
|
|
39
|
-
var SHOW_TEXT_BORDER = false;
|
|
40
|
-
var LEFT = 0,
|
|
41
|
-
TOP = 1,
|
|
42
|
-
RIGHT = 2,
|
|
43
|
-
BOTTOM = 3;
|
|
44
|
-
|
|
45
|
-
var EnhancedTextBackgroundLayer = /*#__PURE__*/function (_TextBackgroundLayer) {
|
|
46
|
-
(0, _inherits2["default"])(EnhancedTextBackgroundLayer, _TextBackgroundLayer);
|
|
47
|
-
|
|
48
|
-
var _super = _createSuper(EnhancedTextBackgroundLayer);
|
|
49
|
-
|
|
50
|
-
function EnhancedTextBackgroundLayer() {
|
|
51
|
-
(0, _classCallCheck2["default"])(this, EnhancedTextBackgroundLayer);
|
|
52
|
-
return _super.apply(this, arguments);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
(0, _createClass2["default"])(EnhancedTextBackgroundLayer, [{
|
|
56
|
-
key: "getShaders",
|
|
57
|
-
value: function getShaders() {
|
|
58
|
-
var shaders = (0, _get2["default"])((0, _getPrototypeOf2["default"])(EnhancedTextBackgroundLayer.prototype), "getShaders", this).call(this);
|
|
59
|
-
var vs = shaders.vs; // Modify shader so that the padding is offset by the pixel offset to ensure the padding
|
|
60
|
-
// always captures the anchor point. As padding is uniform we cannot pass it a per-label value
|
|
61
|
-
|
|
62
|
-
vs = vs.replaceAll('padding.', '_padding.');
|
|
63
|
-
vs = vs.replace('void main(void) {', 'void main(void) {\n vec4 _padding = padding + instancePixelOffsets.xyxy * vec4(1.0, 1.0, -1.0, -1.0);');
|
|
64
|
-
return _objectSpread(_objectSpread({}, shaders), {}, {
|
|
65
|
-
vs: vs
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}]);
|
|
69
|
-
return EnhancedTextBackgroundLayer;
|
|
70
|
-
}(_layers._TextBackgroundLayer); // TextLayer which includes modified text-background-layer-vertex shader and only renders the
|
|
71
|
-
// primary background layer in the collision pass
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
var EnhancedTextLayer = /*#__PURE__*/function (_TextLayer) {
|
|
75
|
-
(0, _inherits2["default"])(EnhancedTextLayer, _TextLayer);
|
|
76
|
-
|
|
77
|
-
var _super2 = _createSuper(EnhancedTextLayer);
|
|
78
|
-
|
|
79
|
-
function EnhancedTextLayer() {
|
|
80
|
-
(0, _classCallCheck2["default"])(this, EnhancedTextLayer);
|
|
81
|
-
return _super2.apply(this, arguments);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
(0, _createClass2["default"])(EnhancedTextLayer, [{
|
|
85
|
-
key: "filterSubLayer",
|
|
86
|
-
value: function filterSubLayer(_ref) {
|
|
87
|
-
var layer = _ref.layer,
|
|
88
|
-
renderPass = _ref.renderPass;
|
|
89
|
-
var background = layer.id.includes('primary-background');
|
|
90
|
-
|
|
91
|
-
if (renderPass === 'collision') {
|
|
92
|
-
return background; // Only draw primary background layer in collision pass
|
|
93
|
-
} else {
|
|
94
|
-
return !background || SHOW_TEXT_BORDER && this.props.getBorderWidth; // Do not draw background layer in other passes
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}]);
|
|
98
|
-
return EnhancedTextLayer;
|
|
99
|
-
}(_layers.TextLayer);
|
|
100
|
-
|
|
101
|
-
var defaultProps = _objectSpread(_objectSpread({}, _layers.TextLayer.defaultProps), {}, {
|
|
102
|
-
getRadius: {
|
|
103
|
-
type: 'accessor',
|
|
104
|
-
value: 1
|
|
105
|
-
},
|
|
106
|
-
radiusScale: {
|
|
107
|
-
type: 'number',
|
|
108
|
-
min: 0,
|
|
109
|
-
value: 1
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
var PointLabelLayer = /*#__PURE__*/function (_CompositeLayer) {
|
|
114
|
-
(0, _inherits2["default"])(PointLabelLayer, _CompositeLayer);
|
|
115
|
-
|
|
116
|
-
var _super3 = _createSuper(PointLabelLayer);
|
|
117
|
-
|
|
118
|
-
function PointLabelLayer() {
|
|
119
|
-
(0, _classCallCheck2["default"])(this, PointLabelLayer);
|
|
120
|
-
return _super3.apply(this, arguments);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
(0, _createClass2["default"])(PointLabelLayer, [{
|
|
124
|
-
key: "calculatePixelOffset",
|
|
125
|
-
value: function calculatePixelOffset(secondary) {
|
|
126
|
-
var _this$props = this.props,
|
|
127
|
-
anchor = _this$props.getTextAnchor,
|
|
128
|
-
alignment = _this$props.getAlignmentBaseline,
|
|
129
|
-
getRadius = _this$props.getRadius,
|
|
130
|
-
getSecondaryText = _this$props.getSecondaryText,
|
|
131
|
-
radiusScale = _this$props.radiusScale,
|
|
132
|
-
secondarySizeScale = _this$props.secondarySizeScale,
|
|
133
|
-
sizeScale = _this$props.sizeScale;
|
|
134
|
-
var xMult = anchor === 'middle' ? 0 : anchor === 'start' ? 1 : -1;
|
|
135
|
-
var yMult = alignment === 'center' ? 0 : alignment === 'bottom' ? 1 : -1; // Padding based on font size (font size / 4)
|
|
136
|
-
|
|
137
|
-
var xPadding = sizeScale / 4;
|
|
138
|
-
var yPadding = sizeScale * (1 + 1 / 4); // Place secondary label under main label (secondary label always 'top' baseline aligned)
|
|
139
|
-
|
|
140
|
-
var secondaryOffset = 0.6 * (1 - yMult) * sizeScale;
|
|
141
|
-
var yOffset = secondary ? secondaryOffset : 0; // Special case, position relative to secondary label
|
|
142
|
-
|
|
143
|
-
if (anchor === 'middle' && alignment === 'top' && getSecondaryText) {
|
|
144
|
-
yOffset -= secondaryOffset;
|
|
145
|
-
yOffset -= secondarySizeScale;
|
|
146
|
-
yOffset += sizeScale;
|
|
147
|
-
} // Padding based on point radius (radius/ 4)
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
var radiusPadding = 1 + 1 / 4;
|
|
151
|
-
return typeof getRadius === 'function' ? function (d, info) {
|
|
152
|
-
var r = (info ? getRadius(d, info) : 1) * radiusScale * radiusPadding;
|
|
153
|
-
return [xMult * (r + xPadding), yMult * (r + yPadding) + yOffset];
|
|
154
|
-
} : [xMult * (getRadius * radiusScale * radiusPadding + xPadding), yMult * (getRadius * radiusScale * radiusPadding + yPadding) + yOffset];
|
|
155
|
-
}
|
|
156
|
-
}, {
|
|
157
|
-
key: "calculateBackgroundPadding",
|
|
158
|
-
value: function calculateBackgroundPadding() {
|
|
159
|
-
var _this$props2 = this.props,
|
|
160
|
-
anchor = _this$props2.getTextAnchor,
|
|
161
|
-
alignment = _this$props2.getAlignmentBaseline,
|
|
162
|
-
sizeScale = _this$props2.sizeScale; // Heuristics to avoid label overlap (should we base this on the text length?)
|
|
163
|
-
|
|
164
|
-
var paddingX = 12 * sizeScale;
|
|
165
|
-
var paddingY = 3 * sizeScale;
|
|
166
|
-
var backgroundPadding = [0, 0, 0, 0];
|
|
167
|
-
|
|
168
|
-
if (alignment === 'top') {
|
|
169
|
-
backgroundPadding[TOP] = paddingY;
|
|
170
|
-
} else if (alignment === 'bottom') {
|
|
171
|
-
backgroundPadding[BOTTOM] = paddingY;
|
|
172
|
-
} else {
|
|
173
|
-
backgroundPadding[TOP] = 0.5 * paddingY;
|
|
174
|
-
backgroundPadding[BOTTOM] = 0.5 * paddingY;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
if (anchor === 'start') {
|
|
178
|
-
backgroundPadding[LEFT] = paddingX;
|
|
179
|
-
} else if (anchor === 'end') {
|
|
180
|
-
backgroundPadding[RIGHT] = paddingX;
|
|
181
|
-
} else {
|
|
182
|
-
backgroundPadding[LEFT] = 0.5 * paddingX;
|
|
183
|
-
backgroundPadding[RIGHT] = 0.5 * paddingX;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return backgroundPadding;
|
|
187
|
-
}
|
|
188
|
-
}, {
|
|
189
|
-
key: "renderTextLayer",
|
|
190
|
-
value: function renderTextLayer(id, _ref2) {
|
|
191
|
-
var updateTriggersOverride = _ref2.updateTriggers,
|
|
192
|
-
props = (0, _objectWithoutProperties2["default"])(_ref2, ["updateTriggers"]);
|
|
193
|
-
var _this$props3 = this.props,
|
|
194
|
-
data = _this$props3.data,
|
|
195
|
-
characterSet = _this$props3.characterSet,
|
|
196
|
-
fontFamily = _this$props3.fontFamily,
|
|
197
|
-
fontSettings = _this$props3.fontSettings,
|
|
198
|
-
fontWeight = _this$props3.fontWeight,
|
|
199
|
-
outlineColor = _this$props3.outlineColor,
|
|
200
|
-
outlineWidth = _this$props3.outlineWidth,
|
|
201
|
-
sizeScale = _this$props3.sizeScale,
|
|
202
|
-
radiusScale = _this$props3.radiusScale,
|
|
203
|
-
getAlignmentBaseline = _this$props3.getAlignmentBaseline,
|
|
204
|
-
getColor = _this$props3.getColor,
|
|
205
|
-
getPosition = _this$props3.getPosition,
|
|
206
|
-
getTextAnchor = _this$props3.getTextAnchor,
|
|
207
|
-
updateTriggers = _this$props3.updateTriggers;
|
|
208
|
-
return new EnhancedTextLayer(this.getSubLayerProps({
|
|
209
|
-
id: id,
|
|
210
|
-
data: data,
|
|
211
|
-
characterSet: characterSet,
|
|
212
|
-
fontFamily: fontFamily,
|
|
213
|
-
fontSettings: fontSettings,
|
|
214
|
-
fontWeight: fontWeight,
|
|
215
|
-
outlineColor: outlineColor,
|
|
216
|
-
outlineWidth: outlineWidth,
|
|
217
|
-
sizeScale: sizeScale,
|
|
218
|
-
getAlignmentBaseline: getAlignmentBaseline,
|
|
219
|
-
getColor: getColor,
|
|
220
|
-
getPosition: getPosition,
|
|
221
|
-
getTextAnchor: getTextAnchor,
|
|
222
|
-
updateTriggers: _objectSpread(_objectSpread(_objectSpread({}, updateTriggers), updateTriggersOverride), {}, {
|
|
223
|
-
getPixelOffset: [updateTriggers.getRadius, updateTriggers.getTextAnchor, updateTriggers.getAlignmentBaseline, radiusScale, sizeScale]
|
|
224
|
-
})
|
|
225
|
-
}), {
|
|
226
|
-
getSize: 1,
|
|
227
|
-
_subLayerProps: {
|
|
228
|
-
background: {
|
|
229
|
-
type: EnhancedTextBackgroundLayer
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}, // DEBUG
|
|
233
|
-
SHOW_TEXT_BORDER ? {
|
|
234
|
-
getBackgroundColor: [0, 0, 0, 0],
|
|
235
|
-
getBorderColor: [255, 0, 0, 80],
|
|
236
|
-
getBorderWidth: 1
|
|
237
|
-
} : {}, props);
|
|
238
|
-
}
|
|
239
|
-
}, {
|
|
240
|
-
key: "renderLayers",
|
|
241
|
-
value: function renderLayers() {
|
|
242
|
-
var _this$props4 = this.props,
|
|
243
|
-
getText = _this$props4.getText,
|
|
244
|
-
getSecondaryColor = _this$props4.getSecondaryColor,
|
|
245
|
-
getSecondaryText = _this$props4.getSecondaryText,
|
|
246
|
-
secondaryOutlineColor = _this$props4.secondaryOutlineColor,
|
|
247
|
-
secondarySizeScale = _this$props4.secondarySizeScale,
|
|
248
|
-
updateTriggers = _this$props4.updateTriggers;
|
|
249
|
-
var getPixelOffset = this.calculatePixelOffset(false);
|
|
250
|
-
var backgroundPadding = this.calculateBackgroundPadding();
|
|
251
|
-
var out = [this.renderTextLayer('primary', {
|
|
252
|
-
backgroundPadding: backgroundPadding,
|
|
253
|
-
getText: getText,
|
|
254
|
-
getPixelOffset: getPixelOffset,
|
|
255
|
-
background: true // Only use background for primary label for faster collisions
|
|
256
|
-
|
|
257
|
-
}), getSecondaryText && this.renderTextLayer('secondary', _objectSpread(_objectSpread(_objectSpread({
|
|
258
|
-
getText: getSecondaryText,
|
|
259
|
-
getPixelOffset: this.calculatePixelOffset(true),
|
|
260
|
-
getAlignmentBaseline: 'top',
|
|
261
|
-
updateTriggers: {
|
|
262
|
-
getText: updateTriggers.getSecondaryText
|
|
263
|
-
}
|
|
264
|
-
}, getSecondaryColor && {
|
|
265
|
-
getColor: getSecondaryColor
|
|
266
|
-
}), secondarySizeScale && {
|
|
267
|
-
sizeScale: secondarySizeScale
|
|
268
|
-
}), secondaryOutlineColor && {
|
|
269
|
-
outlineColor: secondaryOutlineColor
|
|
270
|
-
}))];
|
|
271
|
-
return out;
|
|
272
|
-
}
|
|
273
|
-
}]);
|
|
274
|
-
return PointLabelLayer;
|
|
275
|
-
}(_core.CompositeLayer);
|
|
276
|
-
|
|
277
|
-
exports.PointLabelLayer = PointLabelLayer;
|
|
278
|
-
(0, _defineProperty2["default"])(PointLabelLayer, "layerName", 'PointLabelLayer');
|
|
279
|
-
(0, _defineProperty2["default"])(PointLabelLayer, "defaultProps", defaultProps);
|
|
280
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL3BvaW50LWxhYmVsLWxheWVyL3BvaW50LWxhYmVsLWxheWVyLmpzIl0sIm5hbWVzIjpbIlNIT1dfVEVYVF9CT1JERVIiLCJMRUZUIiwiVE9QIiwiUklHSFQiLCJCT1RUT00iLCJFbmhhbmNlZFRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJzaGFkZXJzIiwidnMiLCJyZXBsYWNlQWxsIiwicmVwbGFjZSIsIlRleHRCYWNrZ3JvdW5kTGF5ZXIiLCJFbmhhbmNlZFRleHRMYXllciIsImxheWVyIiwicmVuZGVyUGFzcyIsImJhY2tncm91bmQiLCJpZCIsImluY2x1ZGVzIiwicHJvcHMiLCJnZXRCb3JkZXJXaWR0aCIsIlRleHRMYXllciIsImRlZmF1bHRQcm9wcyIsImdldFJhZGl1cyIsInR5cGUiLCJ2YWx1ZSIsInJhZGl1c1NjYWxlIiwibWluIiwiUG9pbnRMYWJlbExheWVyIiwic2Vjb25kYXJ5IiwiYW5jaG9yIiwiZ2V0VGV4dEFuY2hvciIsImFsaWdubWVudCIsImdldEFsaWdubWVudEJhc2VsaW5lIiwiZ2V0U2Vjb25kYXJ5VGV4dCIsInNlY29uZGFyeVNpemVTY2FsZSIsInNpemVTY2FsZSIsInhNdWx0IiwieU11bHQiLCJ4UGFkZGluZyIsInlQYWRkaW5nIiwic2Vjb25kYXJ5T2Zmc2V0IiwieU9mZnNldCIsInJhZGl1c1BhZGRpbmciLCJkIiwiaW5mbyIsInIiLCJwYWRkaW5nWCIsInBhZGRpbmdZIiwiYmFja2dyb3VuZFBhZGRpbmciLCJ1cGRhdGVUcmlnZ2Vyc092ZXJyaWRlIiwidXBkYXRlVHJpZ2dlcnMiLCJkYXRhIiwiY2hhcmFjdGVyU2V0IiwiZm9udEZhbWlseSIsImZvbnRTZXR0aW5ncyIsImZvbnRXZWlnaHQiLCJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lV2lkdGgiLCJnZXRDb2xvciIsImdldFBvc2l0aW9uIiwiZ2V0U3ViTGF5ZXJQcm9wcyIsImdldFBpeGVsT2Zmc2V0IiwiZ2V0U2l6ZSIsIl9zdWJMYXllclByb3BzIiwiZ2V0QmFja2dyb3VuZENvbG9yIiwiZ2V0Qm9yZGVyQ29sb3IiLCJnZXRUZXh0IiwiZ2V0U2Vjb25kYXJ5Q29sb3IiLCJzZWNvbmRhcnlPdXRsaW5lQ29sb3IiLCJjYWxjdWxhdGVQaXhlbE9mZnNldCIsImNhbGN1bGF0ZUJhY2tncm91bmRQYWRkaW5nIiwib3V0IiwicmVuZGVyVGV4dExheWVyIiwiQ29tcG9zaXRlTGF5ZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7Ozs7Ozs7OztBQUVBO0FBQ0EsSUFBTUEsZ0JBQWdCLEdBQUcsS0FBekI7SUFFT0MsSSxHQUE2QixDO0lBQXZCQyxHLEdBQTBCLEM7SUFBckJDLEssR0FBd0IsQztJQUFqQkMsTSxHQUFvQixDOztJQUV2Q0MsMkI7Ozs7Ozs7Ozs7OztXQUNKLHNCQUFhO0FBQ1gsVUFBTUMsT0FBTyxnSUFBYjtBQUNBLFVBQUlDLEVBQUUsR0FBR0QsT0FBTyxDQUFDQyxFQUFqQixDQUZXLENBSVg7QUFDQTs7QUFDQUEsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNDLFVBQUgsQ0FBYyxVQUFkLEVBQTBCLFdBQTFCLENBQUw7QUFDQUQsTUFBQUEsRUFBRSxHQUFHQSxFQUFFLENBQUNFLE9BQUgsQ0FDSCxtQkFERyxFQUVILHdHQUZHLENBQUw7QUFLQSw2Q0FBV0gsT0FBWDtBQUFvQkMsUUFBQUEsRUFBRSxFQUFGQTtBQUFwQjtBQUNEOzs7RUFkdUNHLDRCLEdBaUIxQztBQUNBOzs7SUFDTUMsaUI7Ozs7Ozs7Ozs7OztXQUNKLDhCQUFvQztBQUFBLFVBQXBCQyxLQUFvQixRQUFwQkEsS0FBb0I7QUFBQSxVQUFiQyxVQUFhLFFBQWJBLFVBQWE7QUFDbEMsVUFBTUMsVUFBVSxHQUFHRixLQUFLLENBQUNHLEVBQU4sQ0FBU0MsUUFBVCxDQUFrQixvQkFBbEIsQ0FBbkI7O0FBQ0EsVUFBSUgsVUFBVSxLQUFLLFdBQW5CLEVBQWdDO0FBQzlCLGVBQU9DLFVBQVAsQ0FEOEIsQ0FDWDtB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LFVBQU1yQixpQkFBaUIsR0FBRyxLQUFLc0IsMEJBQUwsRUFBMUI7QUFDQSxVQUFNQyxHQUFHLEdBQUcsQ0FDVixLQUFLQyxlQUFMLENBQXFCLFNBQXJCLEVBQWdDO0FBQzlCeEIsUUFBQUEsaUJBQWlCLEVBQWpCQSxpQkFEOEI7QUFFOUJrQixRQUFBQSxPQUFPLEVBQVBBLE9BRjhCO0FBRzlCTCxRQUFBQSxjQUFjLEVBQWRBLGNBSDhCO0FBSTlCOUMsUUFBQUEsVUFBVSxFQUFFLElBSmtCLENBSWI7O0FBSmEsT0FBaEMsQ0FEVSxFQU9Wa0IsZ0JBQWdCLElBQ2QsS0FBS3VDLGVBQUwsQ0FBcUIsV0FBckI7QUFDRU4sUUFBQUEsT0FBTyxFQUFFakMsZ0JBRFg7QUFFRTRCLFFBQUFBLGNBQWMsRUFBRSxLQUFLUSxvQkFBTCxDQUEwQixJQUExQixDQUZsQjtBQUdFckMsUUFBQUEsb0JBQW9CLEVBQUUsS0FIeEI7QUFJRWtCLFFBQUFBLGNBQWMsRUFBRTtBQUFDZ0IsVUFBQUEsT0FBTyxFQUFFaEIsY0FBYyxDQUFDakI7QUFBekI7QUFKbEIsU0FPTWtDLGlCQUFpQixJQUFJO0FBQUNULFFBQUFBLFFBQVEsRUFBRVM7QUFBWCxPQVAzQixHQVFNakMsa0JBQWtCLElBQUk7QUFBQ0MsUUFBQUEsU0FBUyxFQUFFRDtBQUFaLE9BUjVCLEdBU01rQyxxQkFBcUIsSUFBSTtBQUFDWixRQUFBQSxZQUFZLEVBQUVZO0FBQWYsT0FUL0IsRUFSUSxDQUFaO0FBcUJBLGFBQU9HLEdBQVA7QUFDRDs7O0VBektrQ0Usb0I7OztpQ0FBeEI5QyxlLGVBQ1EsaUI7aUNBRFJBLGUsa0JBRVdOLFkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvc2l0ZUxheWVyfSBmcm9tICdAZGVjay5nbC9jb3JlJztcbmltcG9ydCB7VGV4dExheWVyLCBfVGV4dEJhY2tncm91bmRMYXllciBhcyBUZXh0QmFja2dyb3VuZExheWVyfSBmcm9tICdAZGVjay5nbC9sYXllcnMnO1xuXG4vLyBUT0RPIHJlbW92ZSBwcmlvciB0byByZWxlYXNlXG5jb25zdCBTSE9XX1RFWFRfQk9SREVSID0gZmFsc2U7XG5cbmNvbnN0IFtMRUZULCBUT1AsIFJJR0hULCBCT1RUT01dID0gWzAsIDEsIDIsIDNdO1xuXG5jbGFzcyBFbmhhbmNlZFRleHRCYWNrZ3JvdW5kTGF5ZXIgZXh0ZW5kcyBUZXh0QmFja2dyb3VuZExheWVyIHtcbiAgZ2V0U2hhZGVycygpIHtcbiAgICBjb25zdCBzaGFkZXJzID0gc3VwZXIuZ2V0U2hhZGVycygpO1xuICAgIGxldCB2cyA9IHNoYWRlcnMudnM7XG5cbiAgICAvLyBNb2RpZnkgc2hhZGVyIHNvIHRoYXQgdGhlIHBhZGRpbmcgaXMgb2Zmc2V0IGJ5IHRoZSBwaXhlbCBvZmZzZXQgdG8gZW5zdXJlIHRoZSBwYWRkaW5nXG4gICAgLy8gYWx3YXlzIGNhcHR1cmVzIHRoZSBhbmNob3IgcG9pbnQuIEFzIHBhZGRpbmcgaXMgdW5pZm9ybSB3ZSBjYW5ub3QgcGFzcyBpdCBhIHBlci1sYWJlbCB2YWx1ZVxuICAgIHZzID0gdnMucmVwbGFjZUFsbCgncGFkZGluZy4nLCAnX3BhZGRpbmcuJyk7XG4gICAgdnMgPSB2cy5yZXBsYWNlKFxuICAgICAgJ3ZvaWQgbWFpbih2b2lkKSB7JyxcbiAgICAgICd2b2lkIG1haW4odm9pZCkge1xcbiAgdmVjNCBfcGFkZGluZyA9IHBhZGRpbmcgKyBpbnN0YW5jZVBpeGVsT2Zmc2V0cy54eXh5ICogdmVjNCgxLjAsIDEuMCwgLTEuMCwgLTEuMCk7J1xuICAgICk7XG5cbiAgICByZXR1cm4gey4uLnNoYWRlcnMsIHZzfTtcbiAgfVxufVxuXG4vLyBUZXh0TGF5ZXIgd2hpY2ggaW5jbHVkZXMgbW9kaWZpZWQgdGV4dC1iYWNrZ3JvdW5kLWxheWVyLXZlcnRleCBzaGFkZXIgYW5kIG9ubHkgcmVuZGVycyB0aGVcbi8vIHByaW1hcnkgYmFja2dyb3VuZCBsYXllciBpbiB0aGUgY29sbGlzaW9uIHBhc3NcbmNsYXNzIEVuaGFuY2VkVGV4dExheWVyIGV4dGVuZHMgVGV4dExheWVyIHtcbiAgZmlsdGVyU3ViTGF5ZXIoe2xheWVyLCByZW5kZXJQYXNzfSkge1xuICAgIGNvbnN0IGJhY2tncm91bmQgPSBsYXllci5pZC5pbmNsdWRlcygncHJpbWFyeS1iYWNrZ3JvdW5kJyk7XG4gICAgaWYgKHJlbmRlclBhc3MgPT09ICdjb2xsaXNpb24nKSB7XG4gICAgICByZXR1cm4gYmFja2dyb3VuZDsgLy8gT25seSBkcmF3IHByaW1hcnkgYmFja2dyb3VuZCBsYXllciBpbiBjb2xsaXNpb24gcGFzc1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gIWJhY2tncm91bmQgfHwgKFNIT1dfVEVYVF9CT1JERVIgJiYgdGhpcy5wcm9wcy5nZXRCb3JkZXJXaWR0aCk7IC8vIERvIG5vdCBkcmF3IGJhY2tncm91bmQgbGF5ZXIgaW4gb3RoZXIgcGFzc2VzXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRlZmF1bHRQcm9wcyA9IHtcbiAgLi4uVGV4dExheWVyLmRlZmF1bHRQcm9wcyxcbiAgZ2V0UmFkaXVzOiB7dHlwZTogJ2FjY2Vzc29yJywgdmFsdWU6IDF9LFxuICByYWRpdXNTY2FsZToge3R5cGU6ICdudW1iZXInLCBtaW46IDAsIHZhbHVlOiAxfVxufTtcblxuZXhwb3J0IGNsYXNzIFBvaW50TGFiZWxMYXllciBleHRlbmRzIENvbXBvc2l0ZUxheWVyIHtcbiAgc3RhdGljIGxheWVyTmFtZSA9ICdQb2ludExhYmVsTGF5ZXInO1xuICBzdGF0aWMgZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4gIGNhbGN1bGF0ZVBpeGVsT2Zmc2V0KHNlY29uZGFyeSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGdldFRleHRBbmNob3I6IGFuY2hvcixcbiAgICAgIGdldEFsaWdubWVudEJhc2VsaW5lOiBhbGlnbm1lbnQsXG4gICAgICBnZXRSYWRpdXMsXG4gICAgICBnZXRTZWNvbmRhcnlUZXh0LFxuICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICBzZWNvbmRhcnlTaXplU2NhbGUsXG4gICAgICBzaXplU2NhbGVcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB4TXVsdCA9IGFuY2hvciA9PT0gJ21pZGRsZScgPyAwIDogYW5jaG9yID09PSAnc3RhcnQnID8gMSA6IC0xO1xuICAgIGNvbnN0IHlNdWx0ID0gYWxpZ25tZW50ID09PSAnY2VudGVyJyA/IDAgOiBhbGlnbm1lbnQgPT09ICdib3R0b20nID8gMSA6IC0xO1xuXG4gICAgLy8gUGFkZGluZyBiYXNlZCBvbiBmb250IHNpemUgKGZvbnQgc2l6ZSAvIDQpXG4gICAgY29uc3QgeFBhZGRpbmcgPSBzaXplU2NhbGUgLyA0O1xuICAgIGNvbnN0IHlQYWRkaW5nID0gc2l6ZVNjYWxlICogKDEgKyAxIC8gNCk7XG5cbiAgICAvLyBQbGFjZSBzZWNvbmRhcnkgbGFiZWwgdW5kZXIgbWFpbiBsYWJlbCAoc2Vjb25kYXJ5IGxhYmVsIGFsd2F5cyAndG9wJyBiYXNlbGluZSBhbGlnbmVkKVxuICAgIGNvbnN0IHNlY29uZGFyeU9mZnNldCA9IDAuNiAqICgxIC0geU11bHQpICogc2l6ZVNjYWxlO1xuICAgIGxldCB5T2Zmc2V0ID0gc2Vjb25kYXJ5ID8gc2Vjb25kYXJ5T2Zmc2V0IDogMDtcblxuICAgIC8vIFNwZWNpYWwgY2FzZSwgcG9zaXRpb24gcmVsYXRpdmUgdG8gc2Vjb25kYXJ5IGxhYmVsXG4gICAgaWYgKGFuY2hvciA9PT0gJ21pZGRsZScgJiYgYWxpZ25tZW50ID09PSAndG9wJyAmJiBnZXRTZWNvbmRhcnlUZXh0KSB7XG4gICAgICB5T2Zmc2V0IC09IHNlY29uZGFyeU9mZnNldDtcbiAgICAgIHlPZmZzZXQgLT0gc2Vjb25kYXJ5U2l6ZVNjYWxlO1xuICAgICAgeU9mZnNldCArPSBzaXplU2NhbGU7XG4gICAgfVxuXG4gICAgLy8gUGFkZGluZyBiYXNlZCBvbiBwb2ludCByYWRpdXMgKHJhZGl1cy8gNClcbiAgICBjb25zdCByYWRpdXNQYWRkaW5nID0gMSArIDEgLyA0O1xuXG4gICAgcmV0dXJuIHR5cGVvZiBnZXRSYWRpdXMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gKGQsIGluZm8pID0+IHtcbiAgICAgICAgICBjb25zdCByID0gKGluZm8gPyBnZXRSYWRpdXMoZCwgaW5mbykgOiAxKSAqIHJhZGl1c1NjYWxlICogcmFkaXVzUGFkZGluZztcbiAgICAgICAgICByZXR1cm4gW3hNdWx0ICogKHIgKyB4UGFkZGluZyksIHlNdWx0ICogKHIgKyB5UGFkZGluZykgKyB5T2Zmc2V0XTtcbiAgICAgICAgfVxuICAgICAgOiBbXG4gICAgICAgICAgeE11bHQgKiAoZ2V0UmFkaXVzICogcmFkaXVzU2NhbGUgKiByYWRpdXNQYWRkaW5nICsgeFBhZGRpbmcpLFxuICAgICAgICAgIHlNdWx0ICogKGdldFJhZGl1cyAqIHJhZGl1c1NjYWxlICogcmFkaXVzUGFkZGluZyArIHlQYWRkaW5nKSArIHlPZmZzZXRcbiAgICAgICAgXTtcbiAgfVxuXG4gIGNhbGN1bGF0ZUJhY2tncm91bmRQYWRkaW5nKCkge1xuICAgIGNvbnN0IHtnZXRUZXh0QW5jaG9yOiBhbmNob3IsIGdldEFsaWdubWVudEJhc2VsaW5lOiBhbGlnbm1lbnQsIHNpemVTY2FsZX0gPSB0aGlzLnByb3BzO1xuXG4gICAgLy8gSGV1cmlzdGljcyB0byBhdm9pZCBsYWJlbCBvdmVybGFwIChzaG91bGQgd2UgYmFzZSB0aGlzIG9uIHRoZSB0ZXh0IGxlbmd0aD8pXG4gICAgY29uc3QgcGFkZGluZ1ggPSAxMiAqIHNpemVTY2FsZTtcbiAgICBjb25zdCBwYWRkaW5nWSA9IDMgKiBzaXplU2NhbGU7XG4gICAgY29uc3QgYmFja2dyb3VuZFBhZGRpbmcgPSBbMCwgMCwgMCwgMF07XG4gICAgaWYgKGFsaWdubWVudCA9PT0gJ3RvcCcpIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW1RPUF0gPSBwYWRkaW5nWTtcbiAgICB9IGVsc2UgaWYgKGFsaWdubWVudCA9PT0gJ2JvdHRvbScpIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW0JPVFRPTV0gPSBwYWRkaW5nWTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbVE9QXSA9IDAuNSAqIHBhZGRpbmdZO1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbQk9UVE9NXSA9IDAuNSAqIHBhZGRpbmdZO1xuICAgIH1cbiAgICBpZiAoYW5jaG9yID09PSAnc3RhcnQnKSB7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tMRUZUXSA9IHBhZGRpbmdYO1xuICAgIH0gZWxzZSBpZiAoYW5jaG9yID09PSAnZW5kJykge1xuICAgICAgYmFja2dyb3VuZFBhZGRpbmdbUklHSFRdID0gcGFkZGluZ1g7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2tncm91bmRQYWRkaW5nW0xFRlRdID0gMC41ICogcGFkZGluZ1g7XG4gICAgICBiYWNrZ3JvdW5kUGFkZGluZ1tSSUdIVF0gPSAwLjUgKiBwYWRkaW5nWDtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFja2dyb3VuZFBhZGRpbmc7XG4gIH1cblxuICByZW5kZXJUZXh0TGF5ZXIoaWQsIHt1cGRhdGVUcmlnZ2VyczogdXBkYXRlVHJpZ2dlcnNPdmVycmlkZSwgLi4ucHJvcHN9KSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSxcblxuICAgICAgY2hhcmFjdGVyU2V0LFxuICAgICAgZm9udEZhbWlseSxcbiAgICAgIGZvbnRTZXR0aW5ncyxcbiAgICAgIGZvbnRXZWlnaHQsXG4gICAgICBvdXRsaW5lQ29sb3IsXG4gICAgICBvdXRsaW5lV2lkdGgsXG4gICAgICBzaXplU2NhbGUsXG4gICAgICByYWRpdXNTY2FsZSxcblxuICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmUsXG4gICAgICBnZXRDb2xvcixcbiAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgZ2V0VGV4dEFuY2hvcixcblxuICAgICAgdXBkYXRlVHJpZ2dlcnNcbiAgICB9ID0gdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBuZXcgRW5oYW5jZWRUZXh0TGF5ZXIoXG4gICAgICB0aGlzLmdldFN1YkxheWVyUHJvcHMoe1xuICAgICAgICBpZCxcbiAgICAgICAgZGF0YTogZGF0YSxcblxuICAgICAgICBjaGFyYWN0ZXJTZXQsXG4gICAgICAgIGZvbnRGYW1pbHksXG4gICAgICAgIGZvbnRTZXR0aW5ncyxcbiAgICAgICAgZm9udFdlaWdodCxcbiAgICAgICAgb3V0bGluZUNvbG9yLFxuICAgICAgICBvdXRsaW5lV2lkdGgsXG4gICAgICAgIHNpemVTY2FsZSxcblxuICAgICAgICBnZXRBbGlnbm1lbnRCYXNlbGluZSxcbiAgICAgICAgZ2V0Q29sb3IsXG4gICAgICAgIGdldFBvc2l0aW9uLFxuICAgICAgICBnZXRUZXh0QW5jaG9yLFxuXG4gICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7XG4gICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnMsXG4gICAgICAgICAgLi4udXBkYXRlVHJpZ2dlcnNPdmVycmlkZSxcbiAgICAgICAgICBnZXRQaXhlbE9mZnNldDogW1xuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnMuZ2V0UmFkaXVzLFxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnMuZ2V0VGV4dEFuY2hvcixcbiAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzLmdldEFsaWdubWVudEJhc2VsaW5lLFxuICAgICAgICAgICAgcmFkaXVzU2NhbGUsXG4gICAgICAgICAgICBzaXplU2NhbGVcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBnZXRTaXplOiAxLFxuICAgICAgICBfc3ViTGF5ZXJQcm9wczoge2JhY2tncm91bmQ6IHt0eXBlOiBFbmhhbmNlZFRleHRCYWNrZ3JvdW5kTGF5ZXJ9fVxuICAgICAgfSxcbiAgICAgIC8vIERFQlVHXG4gICAgICBTSE9XX1RFWFRfQk9SREVSXG4gICAgICAgID8ge2dldEJhY2tncm91bmRDb2xvcjogWzAsIDAsIDAsIDBdLCBnZXRCb3JkZXJDb2xvcjogWzI1NSwgMCwgMCwgODBdLCBnZXRCb3JkZXJXaWR0aDogMX1cbiAgICAgICAgOiB7fSxcbiAgICAgIHByb3BzXG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlckxheWVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBnZXRUZXh0LFxuICAgICAgZ2V0U2Vjb25kYXJ5Q29sb3IsXG4gICAgICBnZXRTZWNvbmRhcnlUZXh0LFxuICAgICAgc2Vjb25kYXJ5T3V0bGluZUNvbG9yLFxuICAgICAgc2Vjb25kYXJ5U2l6ZVNjYWxlLFxuICAgICAgdXBkYXRlVHJpZ2dlcnNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBnZXRQaXhlbE9mZnNldCA9IHRoaXMuY2FsY3VsYXRlUGl4ZWxPZmZzZXQoZmFsc2UpO1xuICAgIGNvbnN0IGJhY2tncm91bmRQYWRkaW5nID0gdGhpcy5jYWxjdWxhdGVCYWNrZ3JvdW5kUGFkZGluZygpO1xuICAgIGNvbnN0IG91dCA9IFtcbiAgICAgIHRoaXMucmVuZGVyVGV4dExheWVyKCdwcmltYXJ5Jywge1xuICAgICAgICBiYWNrZ3JvdW5kUGFkZGluZyxcbiAgICAgICAgZ2V0VGV4dCxcbiAgICAgICAgZ2V0UGl4ZWxPZmZzZXQsXG4gICAgICAgIGJhY2tncm91bmQ6IHRydWUgLy8gT25seSB1c2UgYmFja2dyb3VuZCBmb3IgcHJpbWFyeSBsYWJlbCBmb3IgZmFzdGVyIGNvbGxpc2lvbnNcbiAgICAgIH0pLFxuICAgICAgZ2V0U2Vjb25kYXJ5VGV4dCAmJlxuICAgICAgICB0aGlzLnJlbmRlclRleHRMYXllcignc2Vjb25kYXJ5Jywge1xuICAgICAgICAgIGdldFRleHQ6IGdldFNlY29uZGFyeVRleHQsXG4gICAgICAgICAgZ2V0UGl4ZWxPZmZzZXQ6IHRoaXMuY2FsY3VsYXRlUGl4ZWxPZmZzZXQodHJ1ZSksXG4gICAgICAgICAgZ2V0QWxpZ25tZW50QmFzZWxpbmU6ICd0b3AnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzOiB7Z2V0VGV4dDogdXBkYXRlVHJpZ2dlcnMuZ2V0U2Vjb25kYXJ5VGV4dH0sXG5cbiAgICAgICAgICAvLyBPcHRpb25hbCBvdmVycmlkZXNcbiAgICAgICAgICAuLi4oZ2V0U2Vjb25kYXJ5Q29sb3IgJiYge2dldENvbG9yOiBnZXRTZWNvbmRhcnlDb2xvcn0pLFxuICAgICAgICAgIC4uLihzZWNvbmRhcnlTaXplU2NhbGUgJiYge3NpemVTY2FsZTogc2Vjb25kYXJ5U2l6ZVNjYWxlfSksXG4gICAgICAgICAgLi4uKHNlY29uZGFyeU91dGxpbmVDb2xvciAmJiB7b3V0bGluZUNvbG9yOiBzZWNvbmRhcnlPdXRsaW5lQ29sb3J9KVxuICAgICAgICB9KVxuICAgIF07XG5cbiAgICByZXR1cm4gb3V0O1xuICB9XG59XG4iXX0=
|
|
Binary file
|
|
Binary file
|