eurostat-map 4.11.1 → 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.1",
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=