eurostat-map 4.11.0 → 4.11.2

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eurostat-map",
3
- "version": "4.11.0",
3
+ "version": "4.11.2",
4
4
  "description": "Reusable library to quickly create and customise web maps showing Eurostat data directly retrieved from Eurostat database.",
5
5
  "keywords": [
6
6
  "eurostat",
@@ -9,15 +9,36 @@
9
9
  root["eurostatmap"] = factory();
10
10
  })(self, () => {
11
11
  return /******/ (() => { // webpackBootstrap
12
- var __webpack_exports__ = {};
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ "./src/core/dorling/dorling-worker.js"
13
16
  /*!********************************************!*\
14
17
  !*** ./src/core/dorling/dorling-worker.js ***!
15
18
  \********************************************/
19
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
20
+
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/collide.js");
23
+ /* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/simulation.js");
24
+ /* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/x.js");
25
+ /* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/y.js");
26
+
27
+
16
28
  onmessage = (event) => {
17
29
  const { nodes: inputNodes, radii, strengthX, strengthY, iterations, d3URL } = event.data
18
30
 
19
- // Load D3 dynamically into the worker
20
- importScripts(d3URL || 'https://unpkg.com/d3@7/dist/d3.min.js')
31
+ // d3-force is bundled directly by default (fast, no network dependency) - importScripts a
32
+ // full runtime d3 build only if the caller explicitly opted into a custom build via
33
+ // dorlingSettings({ workerD3URL }). Previously this always fetched the full d3 v7 bundle from
34
+ // an external CDN on every single Dorling toggle, even though only these 4 named exports are
35
+ // used - the network round-trip (worker spin-up + fetch + cache revalidation each time) was
36
+ // the actual cause of the "cartogram mode is slow now" regression, not the simulation itself.
37
+ let d3Force = { forceSimulation: d3_force__WEBPACK_IMPORTED_MODULE_1__["default"], forceX: d3_force__WEBPACK_IMPORTED_MODULE_2__["default"], forceY: d3_force__WEBPACK_IMPORTED_MODULE_3__["default"], forceCollide: d3_force__WEBPACK_IMPORTED_MODULE_0__["default"] }
38
+ if (d3URL) {
39
+ importScripts(d3URL)
40
+ d3Force = self.d3
41
+ }
21
42
 
22
43
  const nodes = inputNodes.map((n, i) => {
23
44
  n.x = n.properties.centroid[0]
@@ -26,11 +47,11 @@ onmessage = (event) => {
26
47
  return n
27
48
  })
28
49
 
29
- const sim = d3
50
+ const sim = d3Force
30
51
  .forceSimulation(nodes)
31
- .force('x', d3.forceX((d) => d.properties.centroid[0]).strength(strengthX))
32
- .force('y', d3.forceY((d) => d.properties.centroid[1]).strength(strengthY))
33
- .force('collide', d3.forceCollide((d) => d.r).iterations(iterations))
52
+ .force('x', d3Force.forceX((d) => d.properties.centroid[0]).strength(strengthX))
53
+ .force('y', d3Force.forceY((d) => d.properties.centroid[1]).strength(strengthY))
54
+ .force('collide', d3Force.forceCollide((d) => d.r).iterations(iterations))
34
55
  .stop()
35
56
 
36
57
  const nTicks = Math.ceil(Math.log(sim.alphaMin()) / Math.log(1 - sim.alphaDecay()))
@@ -46,8 +67,197 @@ onmessage = (event) => {
46
67
  self.close()
47
68
  }
48
69
 
70
+
71
+ /***/ }
72
+
73
+ /******/ });
74
+ /************************************************************************/
75
+ /******/ // The module cache
76
+ /******/ var __webpack_module_cache__ = {};
77
+ /******/
78
+ /******/ // The require function
79
+ /******/ function __webpack_require__(moduleId) {
80
+ /******/ // Check if module is in cache
81
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
82
+ /******/ if (cachedModule !== undefined) {
83
+ /******/ return cachedModule.exports;
84
+ /******/ }
85
+ /******/ // Create a new module (and put it into the cache)
86
+ /******/ var module = __webpack_module_cache__[moduleId] = {
87
+ /******/ // no module.id needed
88
+ /******/ // no module.loaded needed
89
+ /******/ exports: {}
90
+ /******/ };
91
+ /******/
92
+ /******/ // Execute the module function
93
+ /******/ if (!(moduleId in __webpack_modules__)) {
94
+ /******/ delete __webpack_module_cache__[moduleId];
95
+ /******/ var e = new Error("Cannot find module '" + moduleId + "'");
96
+ /******/ e.code = 'MODULE_NOT_FOUND';
97
+ /******/ throw e;
98
+ /******/ }
99
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
100
+ /******/
101
+ /******/ // Return the exports of the module
102
+ /******/ return module.exports;
103
+ /******/ }
104
+ /******/
105
+ /******/ // expose the modules object (__webpack_modules__)
106
+ /******/ __webpack_require__.m = __webpack_modules__;
107
+ /******/
108
+ /******/ // the startup function
109
+ /******/ __webpack_require__.x = () => {
110
+ /******/ // Load entry module and return exports
111
+ /******/ // This entry module depends on other loaded chunks and execution need to be delayed
112
+ /******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42"], () => (__webpack_require__("./src/core/dorling/dorling-worker.js")))
113
+ /******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
114
+ /******/ return __webpack_exports__;
115
+ /******/ };
116
+ /******/
117
+ /************************************************************************/
118
+ /******/ /* webpack/runtime/chunk loaded */
119
+ /******/ (() => {
120
+ /******/ var deferred = [];
121
+ /******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
122
+ /******/ if(chunkIds) {
123
+ /******/ priority = priority || 0;
124
+ /******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
125
+ /******/ deferred[i] = [chunkIds, fn, priority];
126
+ /******/ return;
127
+ /******/ }
128
+ /******/ var notFulfilled = Infinity;
129
+ /******/ for (var i = 0; i < deferred.length; i++) {
130
+ /******/ var [chunkIds, fn, priority] = deferred[i];
131
+ /******/ var fulfilled = true;
132
+ /******/ for (var j = 0; j < chunkIds.length; j++) {
133
+ /******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
134
+ /******/ chunkIds.splice(j--, 1);
135
+ /******/ } else {
136
+ /******/ fulfilled = false;
137
+ /******/ if(priority < notFulfilled) notFulfilled = priority;
138
+ /******/ }
139
+ /******/ }
140
+ /******/ if(fulfilled) {
141
+ /******/ deferred.splice(i--, 1)
142
+ /******/ var r = fn();
143
+ /******/ if (r !== undefined) result = r;
144
+ /******/ }
145
+ /******/ }
146
+ /******/ return result;
147
+ /******/ };
148
+ /******/ })();
149
+ /******/
150
+ /******/ /* webpack/runtime/define property getters */
151
+ /******/ (() => {
152
+ /******/ // define getter functions for harmony exports
153
+ /******/ __webpack_require__.d = (exports, definition) => {
154
+ /******/ for(var key in definition) {
155
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
156
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
157
+ /******/ }
158
+ /******/ }
159
+ /******/ };
160
+ /******/ })();
161
+ /******/
162
+ /******/ /* webpack/runtime/ensure chunk */
163
+ /******/ (() => {
164
+ /******/ __webpack_require__.f = {};
165
+ /******/ // This file contains only the entry chunk.
166
+ /******/ // The chunk loading function for additional chunks
167
+ /******/ __webpack_require__.e = (chunkId) => {
168
+ /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
169
+ /******/ __webpack_require__.f[key](chunkId, promises);
170
+ /******/ return promises;
171
+ /******/ }, []));
172
+ /******/ };
173
+ /******/ })();
174
+ /******/
175
+ /******/ /* webpack/runtime/get javascript chunk filename */
176
+ /******/ (() => {
177
+ /******/ // This function allow to reference async chunks and chunks that the entrypoint depends on
178
+ /******/ __webpack_require__.u = (chunkId) => {
179
+ /******/ // return url for filenames based on template
180
+ /******/ return "" + chunkId + ".eurostatmap.js";
181
+ /******/ };
182
+ /******/ })();
183
+ /******/
184
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
185
+ /******/ (() => {
186
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
187
+ /******/ })();
188
+ /******/
189
+ /******/ /* webpack/runtime/make namespace object */
190
+ /******/ (() => {
191
+ /******/ // define __esModule on exports
192
+ /******/ __webpack_require__.r = (exports) => {
193
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
194
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
195
+ /******/ }
196
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
197
+ /******/ };
198
+ /******/ })();
199
+ /******/
200
+ /******/ /* webpack/runtime/publicPath */
201
+ /******/ (() => {
202
+ /******/ __webpack_require__.p = "/build/";
203
+ /******/ })();
204
+ /******/
205
+ /******/ /* webpack/runtime/importScripts chunk loading */
206
+ /******/ (() => {
207
+ /******/ // no baseURI
208
+ /******/
209
+ /******/ // object to store loaded chunks
210
+ /******/ // "1" means "already loaded"
211
+ /******/ var installedChunks = {
212
+ /******/ "src_core_dorling_dorling-worker_js": 1
213
+ /******/ };
214
+ /******/
215
+ /******/ // importScripts chunk loading
216
+ /******/ var installChunk = (data) => {
217
+ /******/ var [chunkIds, moreModules, runtime] = data;
218
+ /******/ for(var moduleId in moreModules) {
219
+ /******/ if(__webpack_require__.o(moreModules, moduleId)) {
220
+ /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
221
+ /******/ }
222
+ /******/ }
223
+ /******/ if(runtime) runtime(__webpack_require__);
224
+ /******/ while(chunkIds.length)
225
+ /******/ installedChunks[chunkIds.pop()] = 1;
226
+ /******/ parentChunkLoadingFunction(data);
227
+ /******/ };
228
+ /******/ __webpack_require__.f.i = (chunkId, promises) => {
229
+ /******/ // "1" is the signal for "already loaded"
230
+ /******/ if(!installedChunks[chunkId]) {
231
+ /******/ if(true) { // all chunks have JS
232
+ /******/ importScripts(__webpack_require__.p + __webpack_require__.u(chunkId));
233
+ /******/ }
234
+ /******/ }
235
+ /******/ };
236
+ /******/
237
+ /******/ var chunkLoadingGlobal = self["webpackChunkeurostatmap"] = self["webpackChunkeurostatmap"] || [];
238
+ /******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);
239
+ /******/ chunkLoadingGlobal.push = installChunk;
240
+ /******/
241
+ /******/ // no HMR
242
+ /******/
243
+ /******/ // no HMR manifest
244
+ /******/ })();
245
+ /******/
246
+ /******/ /* webpack/runtime/startup chunk dependencies */
247
+ /******/ (() => {
248
+ /******/ var next = __webpack_require__.x;
249
+ /******/ __webpack_require__.x = () => {
250
+ /******/ return __webpack_require__.e("vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42").then(next);
251
+ /******/ };
252
+ /******/ })();
253
+ /******/
254
+ /************************************************************************/
255
+ /******/
256
+ /******/ // run startup
257
+ /******/ var __webpack_exports__ = __webpack_require__.x();
258
+ /******/
49
259
  /******/ return __webpack_exports__;
50
260
  /******/ })()
51
261
  ;
52
262
  });
53
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7QUNWQTtBQUNBLFlBQVksb0VBQW9FO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwib25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB7IG5vZGVzOiBpbnB1dE5vZGVzLCByYWRpaSwgc3RyZW5ndGhYLCBzdHJlbmd0aFksIGl0ZXJhdGlvbnMsIGQzVVJMIH0gPSBldmVudC5kYXRhXHJcblxyXG4gICAgLy8gTG9hZCBEMyBkeW5hbWljYWxseSBpbnRvIHRoZSB3b3JrZXJcclxuICAgIGltcG9ydFNjcmlwdHMoZDNVUkwgfHwgJ2h0dHBzOi8vdW5wa2cuY29tL2QzQDcvZGlzdC9kMy5taW4uanMnKVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzXHJcbiAgICAgICAgLmZvcmNlU2ltdWxhdGlvbihub2RlcylcclxuICAgICAgICAuZm9yY2UoJ3gnLCBkMy5mb3JjZVgoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFswXSkuc3RyZW5ndGgoc3RyZW5ndGhYKSlcclxuICAgICAgICAuZm9yY2UoJ3knLCBkMy5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkMy5mb3JjZUNvbGxpZGUoKGQpID0+IGQucikuaXRlcmF0aW9ucyhpdGVyYXRpb25zKSlcclxuICAgICAgICAuc3RvcCgpXHJcblxyXG4gICAgY29uc3QgblRpY2tzID0gTWF0aC5jZWlsKE1hdGgubG9nKHNpbS5hbHBoYU1pbigpKSAvIE1hdGgubG9nKDEgLSBzaW0uYWxwaGFEZWNheSgpKSlcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5UaWNrczsgaSsrKSB7XHJcbiAgICAgICAgc2ltLnRpY2soKVxyXG4gICAgICAgIGlmIChpICUgMTAgPT09IDApIHtcclxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBwcm9ncmVzczogaSwgdG90YWw6IG5UaWNrcyB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdlbmQnLCBub2RlcyB9KVxyXG4gICAgc2VsZi5jbG9zZSgpXHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
263
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVndFO0FBQ3hFO0FBQ0E7QUFDQSxZQUFZLG9FQUFvRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsYUFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSwwREFBUSwwREFBUSxnRUFBYztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTs7Ozs7OztVQzFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7Ozs7V0N4Q0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSwrQkFBK0Isd0NBQXdDO1dBQ3ZFO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUJBQWlCLHFCQUFxQjtXQUN0QztXQUNBO1dBQ0Esa0JBQWtCLHFCQUFxQjtXQUN2QztXQUNBO1dBQ0EsS0FBSztXQUNMO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkEsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdELEU7Ozs7O1dDTkEsa0M7Ozs7O1dDQUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7O1dBRUE7O1dBRUEsa0I7Ozs7O1dDcENBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1VFSEE7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfSBmcm9tICdkMy1mb3JjZSdcclxuXHJcbm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBub2RlczogaW5wdXROb2RlcywgcmFkaWksIHN0cmVuZ3RoWCwgc3RyZW5ndGhZLCBpdGVyYXRpb25zLCBkM1VSTCB9ID0gZXZlbnQuZGF0YVxyXG5cclxuICAgIC8vIGQzLWZvcmNlIGlzIGJ1bmRsZWQgZGlyZWN0bHkgYnkgZGVmYXVsdCAoZmFzdCwgbm8gbmV0d29yayBkZXBlbmRlbmN5KSAtIGltcG9ydFNjcmlwdHMgYVxyXG4gICAgLy8gZnVsbCBydW50aW1lIGQzIGJ1aWxkIG9ubHkgaWYgdGhlIGNhbGxlciBleHBsaWNpdGx5IG9wdGVkIGludG8gYSBjdXN0b20gYnVpbGQgdmlhXHJcbiAgICAvLyBkb3JsaW5nU2V0dGluZ3MoeyB3b3JrZXJEM1VSTCB9KS4gUHJldmlvdXNseSB0aGlzIGFsd2F5cyBmZXRjaGVkIHRoZSBmdWxsIGQzIHY3IGJ1bmRsZSBmcm9tXHJcbiAgICAvLyBhbiBleHRlcm5hbCBDRE4gb24gZXZlcnkgc2luZ2xlIERvcmxpbmcgdG9nZ2xlLCBldmVuIHRob3VnaCBvbmx5IHRoZXNlIDQgbmFtZWQgZXhwb3J0cyBhcmVcclxuICAgIC8vIHVzZWQgLSB0aGUgbmV0d29yayByb3VuZC10cmlwICh3b3JrZXIgc3Bpbi11cCArIGZldGNoICsgY2FjaGUgcmV2YWxpZGF0aW9uIGVhY2ggdGltZSkgd2FzXHJcbiAgICAvLyB0aGUgYWN0dWFsIGNhdXNlIG9mIHRoZSBcImNhcnRvZ3JhbSBtb2RlIGlzIHNsb3cgbm93XCIgcmVncmVzc2lvbiwgbm90IHRoZSBzaW11bGF0aW9uIGl0c2VsZi5cclxuICAgIGxldCBkM0ZvcmNlID0geyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfVxyXG4gICAgaWYgKGQzVVJMKSB7XHJcbiAgICAgICAgaW1wb3J0U2NyaXB0cyhkM1VSTClcclxuICAgICAgICBkM0ZvcmNlID0gc2VsZi5kM1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzRm9yY2VcclxuICAgICAgICAuZm9yY2VTaW11bGF0aW9uKG5vZGVzKVxyXG4gICAgICAgIC5mb3JjZSgneCcsIGQzRm9yY2UuZm9yY2VYKChkKSA9PiBkLnByb3BlcnRpZXMuY2VudHJvaWRbMF0pLnN0cmVuZ3RoKHN0cmVuZ3RoWCkpXHJcbiAgICAgICAgLmZvcmNlKCd5JywgZDNGb3JjZS5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkM0ZvcmNlLmZvcmNlQ29sbGlkZSgoZCkgPT4gZC5yKS5pdGVyYXRpb25zKGl0ZXJhdGlvbnMpKVxyXG4gICAgICAgIC5zdG9wKClcclxuXHJcbiAgICBjb25zdCBuVGlja3MgPSBNYXRoLmNlaWwoTWF0aC5sb2coc2ltLmFscGhhTWluKCkpIC8gTWF0aC5sb2coMSAtIHNpbS5hbHBoYURlY2F5KCkpKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblRpY2tzOyBpKyspIHtcclxuICAgICAgICBzaW0udGljaygpXHJcbiAgICAgICAgaWYgKGkgJSAxMCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdwcm9ncmVzcycsIHByb2dyZXNzOiBpLCB0b3RhbDogblRpY2tzIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogJ2VuZCcsIG5vZGVzIH0pXHJcbiAgICBzZWxmLmNsb3NlKClcclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuLy8gdGhlIHN0YXJ0dXAgZnVuY3Rpb25cbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG5cdC8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvY29yZS9kb3JsaW5nL2Rvcmxpbmctd29ya2VyLmpzXCIpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBjaHVua3MgdGhhdCB0aGUgZW50cnlwb2ludCBkZXBlbmRzIG9uXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuZXVyb3N0YXRtYXAuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2J1aWxkL1wiOyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJzcmNfY29yZV9kb3JsaW5nX2Rvcmxpbmctd29ya2VyX2pzXCI6IDFcbn07XG5cbi8vIGltcG9ydFNjcmlwdHMgY2h1bmsgbG9hZGluZ1xudmFyIGluc3RhbGxDaHVuayA9IChkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdGZvcih2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHR9XG5cdH1cblx0aWYocnVudGltZSkgcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0d2hpbGUoY2h1bmtJZHMubGVuZ3RoKVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkcy5wb3AoKV0gPSAxO1xuXHRwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcbn07XG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHQvLyBcIjFcIiBpcyB0aGUgc2lnbmFsIGZvciBcImFscmVhZHkgbG9hZGVkXCJcblx0aWYoIWluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdGlmKHRydWUpIHsgLy8gYWxsIGNodW5rcyBoYXZlIEpTXG5cdFx0XHRpbXBvcnRTY3JpcHRzKF9fd2VicGFja19yZXF1aXJlX18ucCArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSk7XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIikudGhlbihuZXh0KTtcbn07IiwiIiwiLy8gcnVuIHN0YXJ0dXBcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
@@ -60,7 +60,8 @@ export interface LabelsConfig {
60
60
  backgroundFill?: string
61
61
 
62
62
  /**
63
- * Fill/stroke color for statistical value label text.
63
+ * Fill/stroke color for label text - applies to statistical value labels and to
64
+ * geographic labels (country names, country codes, seas) alike.
64
65
  * @default '#111111'
65
66
  */
66
67
  statLabelTextColor?: string
@@ -78,6 +78,13 @@ export interface BarMapConfig extends MapConfig {
78
78
  barTotalCode?: string
79
79
  /** Stat codes. */
80
80
  statCodes?: string[]
81
+ /**
82
+ * Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
83
+ * own polygon, independently of its bar symbol.
84
+ */
85
+ categoryFillStyle?: { [rawValue: string]: string }
86
+ /** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
87
+ categoryText?: { [rawValue: string]: string }
81
88
  /** Legend. */
82
89
  legend?: BarChartLegendConfig | false
83
90
  }
@@ -38,6 +38,13 @@ export interface CoxcombMapConfig extends MapConfig {
38
38
  catColors?: Record<string, string>
39
39
  /** Cat labels. */
40
40
  catLabels?: Record<string, string>
41
+ /**
42
+ * Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
43
+ * own polygon, independently of its coxcomb symbol.
44
+ */
45
+ categoryFillStyle?: { [rawValue: string]: string }
46
+ /** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
47
+ categoryText?: { [rawValue: string]: string }
41
48
  /** No data fill style. */
42
49
  noDataFillStyle?: string
43
50
  /** D3 radial scale mapping a stat value to a wedge radius in pixels. */
@@ -41,6 +41,13 @@ export interface PieMapConfig extends MapConfig {
41
41
  compositionTotalCode?: string
42
42
  /** Stat codes. */
43
43
  statCodes?: string[]
44
+ /**
45
+ * Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
46
+ * own polygon, independently of its pie symbol.
47
+ */
48
+ categoryFillStyle?: { [rawValue: string]: string }
49
+ /** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
50
+ categoryText?: { [rawValue: string]: string }
44
51
  /** Legend. */
45
52
  legend?: PieChartLegendConfig | false
46
53
  }
@@ -53,6 +53,13 @@ export interface WaffleMapConfig extends MapConfig {
53
53
  waffleTotalCode?: string
54
54
  /** Stat codes. */
55
55
  statCodes?: string[]
56
+ /**
57
+ * Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
58
+ * own polygon, independently of its waffle symbol.
59
+ */
60
+ categoryFillStyle?: { [rawValue: string]: string }
61
+ /** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
62
+ categoryText?: { [rawValue: string]: string }
56
63
  /** Legend. */
57
64
  legend?: WaffleLegendConfig | false
58
65
  }
@@ -36,7 +36,11 @@ export interface ProportionalSymbolSettings {
36
36
  * Configuration for proportional symbol maps
37
37
  */
38
38
  export interface ProportionalSymbolConfig extends MapConfig {
39
- /** Fill styles for categorical exceptions in the color dataset, keyed by raw value. */
39
+ /**
40
+ * Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
41
+ * own polygon, independently of its symbol (which represents a separate, numeric value and
42
+ * doesn't render at all for a region whose value is a category with no magnitude).
43
+ */
40
44
  categoryFillStyle?: { [rawValue: string]: string }
41
45
  /** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
42
46
  categoryText?: { [rawValue: string]: string }