@jax-data-science/sci-image-visualizer 0.12.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
  2. package/esm2022/lib/contracts/display-types.mjs +7 -1
  3. package/esm2022/lib/contracts/image.contract.mjs +1 -1
  4. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  5. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  7. package/esm2022/lib/geometry/reconstruct.mjs +11 -1
  8. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
  9. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
  10. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
  11. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
  12. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
  13. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +9 -1
  14. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
  15. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +3 -2
  16. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
  17. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
  18. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
  19. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
  20. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
  21. package/esm2022/lib/region-editor/region-editor.component.mjs +13 -1
  22. package/esm2022/lib/routing-visualizer.service.mjs +4 -1
  23. package/esm2022/lib/spatial/lod.mjs +6 -3
  24. package/esm2022/lib/spatial/spatial-controls.facade.mjs +78 -23
  25. package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
  26. package/esm2022/lib/spatial/spatial-selection.mjs +70 -1
  27. package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
  28. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +3 -3
  29. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +54 -11
  30. package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
  31. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
  32. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
  33. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
  34. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
  35. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
  36. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
  37. package/esm2022/lib/store/region-selection.mjs +21 -4
  38. package/esm2022/lib/store/region-store.service.mjs +22 -3
  39. package/esm2022/lib/store/spatial-selection.service.mjs +13 -1
  40. package/esm2022/lib/store/visualizer-store.service.mjs +50 -1
  41. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +3 -3
  42. package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs} +1777 -793
  43. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +1 -0
  44. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs} +2 -2
  45. package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map} +1 -1
  46. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -2
  47. package/lib/contracts/channel-histogram-api.contract.d.ts +14 -0
  48. package/lib/contracts/display-types.d.ts +27 -0
  49. package/lib/contracts/image.contract.d.ts +2 -0
  50. package/lib/contracts/region-editor-api.contract.d.ts +3 -0
  51. package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
  52. package/lib/contracts/visualizer.contract.d.ts +28 -2
  53. package/lib/geometry/reconstruct.d.ts +6 -0
  54. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
  55. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
  56. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
  57. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
  58. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +5 -0
  59. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
  60. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
  61. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
  62. package/lib/routing-visualizer.service.d.ts +1 -0
  63. package/lib/spatial/lod.d.ts +3 -1
  64. package/lib/spatial/spatial-controls.facade.d.ts +19 -2
  65. package/lib/spatial/spatial-gene-filter.d.ts +44 -0
  66. package/lib/spatial/spatial-selection.d.ts +16 -1
  67. package/lib/spatial/spatial-tile-merge.d.ts +17 -0
  68. package/lib/spatial-controls/spatial-controls.component.d.ts +14 -3
  69. package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
  70. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
  71. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
  72. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
  73. package/lib/store/region-selection.d.ts +14 -3
  74. package/lib/store/region-store.service.d.ts +14 -1
  75. package/lib/store/spatial-selection.service.d.ts +8 -0
  76. package/lib/store/visualizer-store.service.d.ts +13 -0
  77. package/package.json +1 -1
  78. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { fillOutlines } from '../geometry/reconstruct';
1
2
  import { pointInRing as ringContainsPoint, ringBounds } from '../geometry/ring';
2
3
  /** An empty selection over `count` observations. */
3
4
  export function emptySelection(count = 0) {
@@ -215,6 +216,74 @@ export function selectInRegionsProjected(screen, count, regions) {
215
216
  }
216
217
  return { mask, count: hits };
217
218
  }
219
+ /**
220
+ * Observations inside the VOLUME a stack of outlines encloses: a region class (an
221
+ * atlas structure with its substructures) through every section of the dataset's
222
+ * reference volume, as its 3D reconstruction shows it.
223
+ *
224
+ * The outlines are in the volume's own grid — x, y in voxels, z the slice — which
225
+ * is where regions imported onto the volume's stack sit. An observation is in voxel
226
+ * `(⌊x / vx⌋, ⌊y / vy⌋, ⌊z / vz⌋)` (see `volumeImageRef`), and selected when its
227
+ * slice's outlines cover that voxel, filled as the reconstruction fills them. One
228
+ * slice is rasterised at a time, so a structure through the whole brain costs one
229
+ * slice's mask, not the volume's. An observation outside the volume, or without a
230
+ * z, is never selected.
231
+ */
232
+ export function selectInClassVolumes(observations, volume, slices) {
233
+ const n = observations.count;
234
+ const mask = new Uint8Array(n);
235
+ const z = observations.z;
236
+ const { width, height, depth } = volume;
237
+ const [vx, vy, vz] = volume.voxelSize;
238
+ const bySlice = new Map();
239
+ for (const s of slices) {
240
+ if (!s.rings.length || s.z < 0 || s.z >= depth)
241
+ continue;
242
+ const list = bySlice.get(s.z);
243
+ if (list)
244
+ list.push(s);
245
+ else
246
+ bySlice.set(s.z, [s]);
247
+ }
248
+ if (!z || !bySlice.size)
249
+ return { mask, count: 0 };
250
+ // The observations of each outlined slice (a counting sort by slice).
251
+ const sliceOf = new Int32Array(n).fill(-1);
252
+ const counts = new Uint32Array(depth + 1);
253
+ for (let i = 0; i < n; i++) {
254
+ const k = Math.floor(z[i] / vz);
255
+ if (!bySlice.has(k))
256
+ continue;
257
+ sliceOf[i] = k;
258
+ counts[k + 1]++;
259
+ }
260
+ for (let k = 0; k < depth; k++)
261
+ counts[k + 1] += counts[k];
262
+ const order = new Uint32Array(counts[depth]);
263
+ const at = counts.slice(0, depth);
264
+ for (let i = 0; i < n; i++)
265
+ if (sliceOf[i] >= 0)
266
+ order[at[sliceOf[i]]++] = i;
267
+ const plane = new Uint8Array(width * height);
268
+ let count = 0;
269
+ for (const [k, outlines] of bySlice) {
270
+ plane.fill(0);
271
+ for (const s of outlines)
272
+ fillOutlines(plane, width, height, s);
273
+ for (let o = counts[k]; o < counts[k + 1]; o++) {
274
+ const i = order[o];
275
+ const px = Math.floor(observations.x[i] / vx);
276
+ const py = Math.floor(observations.y[i] / vy);
277
+ if (px < 0 || py < 0 || px >= width || py >= height)
278
+ continue;
279
+ if (plane[py * width + px]) {
280
+ mask[i] = 1;
281
+ count++;
282
+ }
283
+ }
284
+ }
285
+ return { mask, count };
286
+ }
218
287
  /**
219
288
  * Whether two selections hold exactly the same observations.
220
289
  *
@@ -248,4 +317,4 @@ export function selectByCategory(codes, code) {
248
317
  }
249
318
  return { mask, count };
250
319
  }
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF3QixXQUFXLElBQUksaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUEwQnRHLG9EQUFvRDtBQUNwRCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQUssR0FBRyxDQUFDO0lBQ3RDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ25ELENBQUM7QUFFRCx1Q0FBdUM7QUFDdkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUFnQjtJQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxDQUFDLEVBQUUsQ0FBQztJQUN2RCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFnQjtJQUM1QyxNQUFNLEdBQUcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7WUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakUsT0FBTyxHQUFHLENBQUM7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RUFBRSxDQUFDO1FBQ1YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IFJpbmdCb3VuZHMgYXMgQm91bmRzLCBwb2ludEluUmluZyBhcyByaW5nQ29udGFpbnNQb2ludCwgcmluZ0JvdW5kcyB9IGZyb20gJy4uL2dlb21ldHJ5L3JpbmcnO1xuaW1wb3J0IHsgU3BhdGlhbEltYWdlUmVmLCBTcGF0aWFsT2JzZXJ2YXRpb25zLCBTcGF0aWFsU2VsZWN0aW9uTWFzayB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFdoaWNoIG9ic2VydmF0aW9ucyBmYWxsIGluc2lkZSBhIHNldCBvZiBkcmF3biByZWdpb25zLlxuICpcbiAqIFB1cmUsIGxpa2UgYHNwYXRpYWwtZW5jb2RpbmcudHNgIOKAlCBubyBzdG9yZSwgbm8gcmVuZGVyZXIg4oCUIHNvIHRoZSBnZW9tZXRyeSBpc1xuICogdGVzdGFibGUgb24gaXRzIG93bi5cbiAqXG4gKiBXSFkgVEhJUyBJUyBUSEUgV0hPTEUgU0VMRUNUSU9OIE1FQ0hBTklTTVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYWxyZWFkeSBjb21lIGZyb20gZXZlcnkgb24tY2FudmFzIHRvb2wgdGhlIGxpYnJhcnkgaGFzOiByZWN0YW5nbGUsXG4gKiBwb2x5Z29uLCBmcmVlaGFuZCwgbWFnaWMgd2FuZCwgYnJ1c2guIFRlc3Rpbmcgb2JzZXJ2YXRpb25zIGFnYWluc3QgdGhlbSB0dXJuc1xuICogYWxsIG9mIHRob3NlIGludG8gc3BhdGlhbC1vbWljcyBzZWxlY3Rpb24gdG9vbHMgd2l0aG91dCBhZGRpbmcgYSBzaW5nbGUgbmV3XG4gKiBjYW52YXMgaW50ZXJhY3Rpb24g4oCUIHdoaWNoIGlzIHdoeSB0aGVyZSBpcyBubyBiZXNwb2tlIG1hcnF1ZWUgaGVyZS5cbiAqXG4gKiBDT09SRElOQVRFIEZSQU1FU1xuICogLS0tLS0tLS0tLS0tLS0tLS1cbiAqIFJlZ2lvbnMgYXJlIGRyYXduIGluIFdPUkxEIChpbWFnZSkgY29vcmRpbmF0ZXMuIE9ic2VydmF0aW9ucyBsaXZlIGluIHRoZVxuICogZGF0YXNldCdzIG93biBmcmFtZSBhbmQgcmVhY2ggdGhlIHdvcmxkIHRocm91Z2ggYGltYWdlUmVmYCDigJQgc28gdGhleSBhcmVcbiAqIHRyYW5zZm9ybWVkIGZvcndhcmQgYmVmb3JlIHRlc3RpbmcsIG1hdGNoaW5nIGV4YWN0bHkgd2hhdCB0aGUgcmVuZGVyZXIgZHJhd3MuXG4gKi9cblxuLyoqIE1vdmVkIHRvIHRoZSBkYXRhc2V0IGNvbnRyYWN0IChhIHB1cmUgZGF0YSB0eXBlKTsgcmUtZXhwb3J0ZWQgaGVyZSBmb3IgZXhpc3RpbmcgaW1wb3J0ZXJzLiAqL1xuZXhwb3J0IHR5cGUgeyBTcGF0aWFsU2VsZWN0aW9uTWFzayB9O1xuXG4vKiogQW4gZW1wdHkgc2VsZWN0aW9uIG92ZXIgYGNvdW50YCBvYnNlcnZhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlTZWxlY3Rpb24oY291bnQgPSAwKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICByZXR1cm4geyBtYXNrOiBuZXcgVWludDhBcnJheShjb3VudCksIGNvdW50OiAwIH07XG59XG5cbi8qKiBOdW1iZXIgb2Ygc2V0IGVudHJpZXMgaW4gYSBtYXNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50TWFzayhtYXNrOiBVaW50OEFycmF5KTogbnVtYmVyIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hc2subGVuZ3RoOyBpKyspIGlmIChtYXNrW2ldKSBuKys7XG4gIHJldHVybiBuO1xufVxuXG4vKiogU2VsZWN0ZWQgaW5kaWNlcywgZm9yIGV4cG9ydCBvciBhIGRvd25zdHJlYW0gcXVlcnkuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1RvSW5kaWNlcyhtYXNrOiBVaW50OEFycmF5KTogVWludDMyQXJyYXkge1xuICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkoY291bnRNYXNrKG1hc2spKTtcbiAgbGV0IGF0ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgb3V0W2F0KytdID0gaTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZW5kZXJlci1mYWNpbmcgaW52ZXJzZTogd2hpY2ggb2JzZXJ2YXRpb25zIHRvIE1VVEUuIFdpdGggbm90aGluZyBzZWxlY3RlZFxuICogbm90aGluZyBpcyBtdXRlZCAodGhlIHdob2xlIHRpc3N1ZSByZWFkcyBub3JtYWxseSk7IHdpdGggYSBzZWxlY3Rpb24sIGV2ZXJ5XG4gKiB1bnNlbGVjdGVkIG9ic2VydmF0aW9uIGlzIG11dGVkIOKAlCB0aGUgQ29zTXggaGlnaGxpZ2h0LXZzLW11dGUgcnVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11dGVkRnJvbVNlbGVjdGlvbihzZWxlY3Rpb246IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoc2VsZWN0aW9uLmNvdW50ID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbXV0ZWQgPSBuZXcgVWludDhBcnJheShzZWxlY3Rpb24ubWFzay5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG11dGVkLmxlbmd0aDsgaSsrKSBtdXRlZFtpXSA9IHNlbGVjdGlvbi5tYXNrW2ldID8gMCA6IDE7XG4gIHJldHVybiBtdXRlZDtcbn1cblxuLyoqXG4gKiBFdmVuLW9kZCByYXkgY2FzdDogaXMgKHB4LCBweSkgaW5zaWRlIHRoZSBjbG9zZWQgcmluZyB4cy95cz9cbiAqXG4gKiBQdWJsaWMgQVBJIGtlcHQgd2l0aCBpdHMgKHJpbmcsIHBvaW50KSBhcmd1bWVudCBvcmRlcjsgdGhlIHRlc3QgaXRzZWxmIGlzXG4gKiB0aGUgc2hhcmVkIGBnZW9tZXRyeS9yaW5nYCBvbmUgdGhlIHJlZ2lvbiBvdmVybGF5cyBhbmQgdG9vbHMgdXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRJblJpbmcoeHM6IHJlYWRvbmx5IG51bWJlcltdLCB5czogcmVhZG9ubHkgbnVtYmVyW10sIHB4OiBudW1iZXIsIHB5OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJpbmdDb250YWluc1BvaW50KHB4LCBweSwgeHMsIHlzKTtcbn1cblxuZnVuY3Rpb24gaW5Cb3VuZHMoYjogQm91bmRzLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBweCA+PSBiLm1pblggJiYgcHggPD0gYi5tYXhYICYmIHB5ID49IGIubWluWSAmJiBweSA8PSBiLm1heFk7XG59XG5cbi8qKiBBIHJlZ2lvbiBmbGF0dGVuZWQgdG8gc29tZXRoaW5nIHRlc3RhYmxlOiBib3VuZHMgKyBhIGhpdCB0ZXN0LiAqL1xuaW50ZXJmYWNlIFNoYXBlIHtcbiAgYm91bmRzOiBCb3VuZHM7XG4gIGhpdChweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbjtcbn1cblxuLyoqIFBvbHlnb24td2l0aC1ob2xlczogaW5zaWRlIHRoZSBleHRlcmlvciBhbmQgb3V0c2lkZSBldmVyeSBob2xlLiAqL1xuZnVuY3Rpb24gcG9seWdvblNoYXBlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBob2xlcz86IG51bWJlcltdW11bXSk6IFNoYXBlIHwgbnVsbCB7XG4gIGlmICh4cy5sZW5ndGggPCAzKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYm91bmRzID0gcmluZ0JvdW5kcyh4cywgeXMpO1xuICAvLyBTcGxpdCBhbmQgYm91bmRlZCBPTkNFIHBlciBzaGFwZTogdGhlIGhpdCB0ZXN0IHJ1bnMgZm9yIGV2ZXJ5IGNhbmRpZGF0ZSBwb2ludFxuICAvLyBpbnNpZGUgdGhlIGV4dGVyaW9yIOKAlCB1cCB0byBtaWxsaW9ucyBvZiBjZWxscyBwZXIgc2VsZWN0aW9uLlxuICBjb25zdCBob2xlUmluZ3MgPSAoaG9sZXMgPz8gW10pXG4gICAgLmZpbHRlcigocmluZykgPT4gcmluZy5sZW5ndGggPj0gMylcbiAgICAubWFwKChyaW5nKSA9PiB7XG4gICAgICBjb25zdCBoeCA9IHJpbmcubWFwKChwKSA9PiBwWzBdKTtcbiAgICAgIGNvbnN0IGh5ID0gcmluZy5tYXAoKHApID0+IHBbMV0pO1xuICAgICAgcmV0dXJuIHsgeHM6IGh4LCB5czogaHksIGJvdW5kczogcmluZ0JvdW5kcyhoeCwgaHkpIH07XG4gICAgfSk7XG4gIHJldHVybiB7XG4gICAgYm91bmRzLFxuICAgIGhpdDogKHB4LCBweSkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluUmluZyh4cywgeXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFRoZSByZWdpb24gbW9kZWwgaXMgZXhwbGljaXQ6IGEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciBBTkQgaW5zaWRlIGFcbiAgICAgIC8vIGhvbGUgaXMgT1VUU0lERSB0aGUgcmVnaW9uLlxuICAgICAgZm9yIChjb25zdCBob2xlIG9mIGhvbGVSaW5ncykge1xuICAgICAgICBpZiAoaW5Cb3VuZHMoaG9sZS5ib3VuZHMsIHB4LCBweSkgJiYgcG9pbnRJblJpbmcoaG9sZS54cywgaG9sZS55cywgcHgsIHB5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgcmVnaW9uIHRvIHRlc3RhYmxlIHNoYXBlcy4gUmV0dXJucyBhbiBlbXB0eSBhcnJheSBmb3IgYW55dGhpbmcgdGhhdFxuICogZW5jbG9zZXMgbm8gYXJlYSDigJQgYW4gb3BlbiBwb2x5bGluZSwgYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSwgYSBkZWdlbmVyYXRlXG4gKiByZWN0YW5nbGUg4oCUIHNvIHRob3NlIG5ldmVyIGNvbnRyaWJ1dGUgdG8gYSBzZWxlY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpb25TaGFwZXMocmVnaW9uOiBSZWdpb24pOiBTaGFwZVtdIHtcbiAgLy8gUHJvZmlsZSBsaW5lcyBiZWxvbmcgdG8gdGhlIGludGVuc2l0eSB0b29sLCBub3QgdGhlIGFubm90YXRpb24gc2V0LlxuICBpZiAoKHJlZ2lvbiBhcyB1bmtub3duIGFzIHsga2luZD86IHN0cmluZyB9KT8ua2luZCA9PT0gJ3Byb2ZpbGUnKSByZXR1cm4gW107XG4gIGNvbnN0IGIgPSByZWdpb24/LmJvdW5kcyBhcyB1bmtub3duIGFzXG4gICAgfCB7XG4gICAgICAgIHg/OiBudW1iZXI7XG4gICAgICAgIHk/OiBudW1iZXI7XG4gICAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgICAgICBjbG9zZWQ/OiBib29sZWFuO1xuICAgICAgICBob2xlcz86IG51bWJlcltdW11bXTtcbiAgICAgICAgcG9seWdvbnM/OiB7IHhwb2ludHM6IG51bWJlcltdOyB5cG9pbnRzOiBudW1iZXJbXTsgY2xvc2VkPzogYm9vbGVhbjsgaG9sZXM/OiBudW1iZXJbXVtdW10gfVtdO1xuICAgICAgfVxuICAgIHwgbnVsbFxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAoIWIpIHJldHVybiBbXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheShiLnBvbHlnb25zKSkge1xuICAgIHJldHVybiBiLnBvbHlnb25zLmZsYXRNYXAoKHApID0+XG4gICAgICBwLmNsb3NlZCA9PT0gZmFsc2UgPyBbXSA6IChwb2x5Z29uU2hhcGUocC54cG9pbnRzID8/IFtdLCBwLnlwb2ludHMgPz8gW10sIHAuaG9sZXMpID8/IFtdKSxcbiAgICApO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGIueHBvaW50cykpIHtcbiAgICBpZiAoYi5jbG9zZWQgPT09IGZhbHNlKSByZXR1cm4gW107IC8vIG9wZW4gcG9seWxpbmUgZW5jbG9zZXMgbm90aGluZ1xuICAgIGNvbnN0IHNoYXBlID0gcG9seWdvblNoYXBlKGIueHBvaW50cywgYi55cG9pbnRzID8/IFtdLCBiLmhvbGVzKTtcbiAgICByZXR1cm4gc2hhcGUgPyBbc2hhcGVdIDogW107XG4gIH1cbiAgaWYgKHR5cGVvZiBiLndpZHRoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYi5oZWlnaHQgPT09ICdudW1iZXInKSB7XG4gICAgY29uc3QgeCA9IGIueCA/PyAwO1xuICAgIGNvbnN0IHkgPSBiLnkgPz8gMDtcbiAgICAvLyBOb3JtYWxpc2UgYSByZWN0YW5nbGUgZHJhZ2dlZCByaWdodC10by1sZWZ0IC8gYm90dG9tLXRvLXRvcC5cbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4LCB4ICsgYi53aWR0aCk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHksIHkgKyBiLmhlaWdodCk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHksIHkgKyBiLmhlaWdodCk7XG4gICAgaWYgKG1heFggPT09IG1pblggfHwgbWF4WSA9PT0gbWluWSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGJvdW5kcyA9IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9O1xuICAgIHJldHVybiBbeyBib3VuZHMsIGhpdDogKHB4LCBweSkgPT4gaW5Cb3VuZHMoYm91bmRzLCBweCwgcHkpIH1dO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuLyoqXG4gKiBBIHNlbGVjdGlvbiBmcm9tIGFuIGV4cGxpY2l0IGxpc3Qgb2Ygb2JzZXJ2YXRpb24gaW5kaWNlcy5cbiAqXG4gKiBXaGF0IGEgbGFzc28gaW4gYSBsaW5rZWQgcGxvdCBwcm9kdWNlczogdGhlIHBsb3Qga25vd3Mgd2hpY2ggcG9pbnRzIHRoZSB1c2VyIGRyZXdcbiAqIGFyb3VuZCwgYW5kIHRoZSBtYXAgbmVlZHMgdGhhdCBhcyBhIG1hc2sgb3ZlciBBTEwgb2JzZXJ2YXRpb25zLiBPdXQtb2YtcmFuZ2UgYW5kXG4gKiBkdXBsaWNhdGUgaW5kaWNlcyBhcmUgaWdub3JlZCByYXRoZXIgdGhhbiByZWplY3RlZCDigJQgYSBwbG90IG1heSBoYW5kIGJhY2sgdGhlIHNhbWVcbiAqIHBvaW50IHR3aWNlLCBhbmQgYSBzdGFsZSBpbmRleCBmcm9tIGEgcGxvdCBkcmF3biBiZWZvcmUgYSBkYXRhc2V0IGNoYW5nZSBtdXN0IG5vdFxuICogdGhyb3cgaW4gdGhlIG1pZGRsZSBvZiBhIHNlbGVjdGlvbiBnZXN0dXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlJbmRpY2VzKGluZGljZXM6IEl0ZXJhYmxlPG51bWJlcj4sIG9ic2VydmF0aW9uQ291bnQ6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG9ic2VydmF0aW9uQ291bnQpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihpKSB8fCBpIDwgMCB8fCBpID49IG9ic2VydmF0aW9uQ291bnQpIGNvbnRpbnVlO1xuICAgIGlmIChtYXNrW2ldKSBjb250aW51ZTtcbiAgICBtYXNrW2ldID0gMTtcbiAgICBjb3VudCsrO1xuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSBBTlkgb2YgYHJlZ2lvbnNgICh1bmlvbikuIENvb3JkaW5hdGVzIGFyZSB0cmFuc2Zvcm1lZCBieVxuICogYGltYWdlUmVmYCBmaXJzdCwgc28gdGhlIHRlc3QgaGFwcGVucyBpbiB0aGUgc2FtZSB3b3JsZCBzcGFjZSB0aGUgcmVnaW9ucyB3ZXJlXG4gKiBkcmF3biBpbi5cbiAqXG4gKiBgY2FuZGlkYXRlc2AsIHdoZW4gZ2l2ZW4sIHJlc3RyaWN0cyB0aGUgdGVzdCB0byB0aG9zZSBvYnNlcnZhdGlvbiBpbmRpY2VzIOKAlCBob3dcbiAqIGEgMkQgdmlldyBvZiBhIDNEIGRhdGFzZXQga2VlcHMgYSBkcmF3biByZWdpb24gbWVhbmluZyB3aGF0IGl0IGxvb2tzIGxpa2UgaXRcbiAqIG1lYW5zOiB0aGUgc2hhcGUgd2FzIGRyYXduIG92ZXIgT05FIHNlY3Rpb24sIHNvIGl0IHNlbGVjdHMgdGhhdCBzZWN0aW9uJ3MgY2VsbHNcbiAqIHJhdGhlciB0aGFuIHRoZSB3aG9sZSBkZXB0aCBvZiB0aGUgc3BlY2ltZW4gYmVoaW5kIHRoZW0uIFRoZSByZXR1cm5lZCBtYXNrIHN0YXlzXG4gKiBpbmRleGVkIGJ5IG9ic2VydmF0aW9uLCBzbyBldmVyeSBjb25zdW1lciAoY2hhcnRzLCBsZWdlbmQsIHRoZSAzRCBjbG91ZCkgcmVhZHMgaXRcbiAqIHRoZSBzYW1lIHdheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9ucyhcbiAgb2JzZXJ2YXRpb25zOiBTcGF0aWFsT2JzZXJ2YXRpb25zLFxuICBpbWFnZVJlZjogU3BhdGlhbEltYWdlUmVmIHwgdW5kZWZpbmVkLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbiAgY2FuZGlkYXRlcz86IFVpbnQzMkFycmF5LFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHNoYXBlcyA9IHJlZ2lvbnMuZmxhdE1hcCgocikgPT4gcmVnaW9uU2hhcGVzKHIpKTtcbiAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDApIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgY29uc3QgW3N4LCBzeV0gPSBpbWFnZVJlZj8uc2NhbGUgPz8gWzEsIDFdO1xuICBjb25zdCBbdHgsIHR5XSA9IGltYWdlUmVmPy50cmFuc2xhdGUgPz8gWzAsIDBdO1xuICBsZXQgY291bnQgPSAwO1xuICBjb25zdCB0b3RhbCA9IGNhbmRpZGF0ZXMgPyBjYW5kaWRhdGVzLmxlbmd0aCA6IG47XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgdG90YWw7IGsrKykge1xuICAgIGNvbnN0IGkgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlc1trXSA6IGs7XG4gICAgY29uc3QgcHggPSBvYnNlcnZhdGlvbnMueFtpXSAqIHN4ICsgdHg7XG4gICAgY29uc3QgcHkgPSBvYnNlcnZhdGlvbnMueVtpXSAqIHN5ICsgdHk7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIC8vIEJvdW5kcyBmaXJzdDogYSByYXkgY2FzdCBwZXIgb2JzZXJ2YXRpb24gcGVyIHJlZ2lvbiB3b3VsZCBkb21pbmF0ZSBhdFxuICAgICAgLy8gMTBeNSBvYnNlcnZhdGlvbnMsIGFuZCBtb3N0IHBvaW50cyBtaXNzIG1vc3QgcmVnaW9ucy5cbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG5cbi8qKlxuICogU2VsZWN0IG9ic2VydmF0aW9ucyB3aG9zZSBTQ1JFRU4gcHJvamVjdGlvbiBmYWxscyBpbnNpZGUgdGhlIGRyYXduIHJlZ2lvbnMuXG4gKlxuICogVGhpcyBpcyBob3cgYSByZWdpb24gc2VsZWN0aW9uIHdvcmtzIGluIHRoZSAzRCBjbG91ZC4gVGhlcmUgaXMgbm8gZGF0YS1zcGFjZVxuICogYWZmaW5lIHRvIG1hcCBhIGRyYXduIHNoYXBlIHRocm91Z2gsIGJlY2F1c2UgdGhlIHNoYXBlIHdhcyBkcmF3biBvbiBhIDJEIHNjcmVlblxuICogYWdhaW5zdCBhIHBlcnNwZWN0aXZlIGNhbWVyYSDigJQgc28gdGhlIG9ic2VydmF0aW9ucyBjb21lIHRoZSBvdGhlciB3YXksIGFscmVhZHlcbiAqIHByb2plY3RlZCB0byBjYW52YXMgcGl4ZWxzIGJ5IHRoZSByZW5kZXJlciAod2hpY2ggb3ducyB0aGUgY2FtZXJhKSwgYW5kIHRoZVxuICogcmVnaW9ucyBhcmUgdGVzdGVkIGluIHRoYXQgc2FtZSBzY3JlZW4gc3BhY2UuXG4gKlxuICogVGhlIGNvbnNlcXVlbmNlIGlzIHdvcnRoIGJlaW5nIGV4cGxpY2l0IGFib3V0OiBhIHNjcmVlbi1zcGFjZSBsYXNzbyBzZWxlY3RzXG4gKiB0aHJvdWdoIHRoZSBXSE9MRSBERVBUSCBvZiB0aGUgY2xvdWQsIGxpa2UgYSBjb29raWUgY3V0dGVyLCBub3QgYSBzbGFiIGF0IHNvbWVcbiAqIGNob3NlbiB6LiBUaGF0IGlzIGluaGVyZW50IHRvIGRyYXdpbmcgb24gYSBmbGF0IHNjcmVlbiwgYW5kIGl0IGlzIHdoYXQgbmFwYXJpXG4gKiBhbmQgZXZlcnkgb3RoZXIgb3JiaXQtY2FtZXJhIHBvaW50IHBpY2tlciBkby4gT3JiaXQgYW5kIGRyYXcgYWdhaW4gdG8gY3V0IGZyb21cbiAqIGFub3RoZXIgYW5nbGUuXG4gKlxuICogYHNjcmVlbmAgaXMgYFt4MCwgeTAsIHgxLCB5MSwg4oCmXWAgaW4gY2FudmFzIHBpeGVscywgYGNvdW50YCBlbnRyaWVzIGxvbmcuIEFuXG4gKiBvYnNlcnZhdGlvbiB0aGUgY2FtZXJhIHB1dHMgYmVoaW5kIHRoZSBleWUgaXMgZ2l2ZW4gTmFOIGJ5IHRoZSBwcm9qZWN0b3IgYW5kXG4gKiBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluUmVnaW9uc1Byb2plY3RlZChcbiAgc2NyZWVuOiBGbG9hdDMyQXJyYXksXG4gIGNvdW50OiBudW1iZXIsXG4gIHJlZ2lvbnM6IHJlYWRvbmx5IFJlZ2lvbltdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkoY291bnQpO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGxldCBoaXRzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgY29uc3QgcHggPSBzY3JlZW5baSAqIDJdO1xuICAgIGNvbnN0IHB5ID0gc2NyZWVuW2kgKiAyICsgMV07XG4gICAgLy8gQmVoaW5kIHRoZSBjYW1lcmEsIG9yIG90aGVyd2lzZSB1bnByb2plY3RhYmxlLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHB4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHB5KSkgY29udGludWU7XG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBzaGFwZXMpIHtcbiAgICAgIGlmICghaW5Cb3VuZHMoc2hhcGUuYm91bmRzLCBweCwgcHkpKSBjb250aW51ZTtcbiAgICAgIGlmIChzaGFwZS5oaXQocHgsIHB5KSkge1xuICAgICAgICBtYXNrW2ldID0gMTtcbiAgICAgICAgaGl0cysrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQ6IGhpdHMgfTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIHR3byBzZWxlY3Rpb25zIGhvbGQgZXhhY3RseSB0aGUgc2FtZSBvYnNlcnZhdGlvbnMuXG4gKlxuICogTGV0cyBhIGNsaWNrIHRvZ2dsZSBhZ2FpbnN0IHRoZSBTRUxFQ1RJT04gcmF0aGVyIHRoYW4gYWdhaW5zdCBhIHJlbWVtYmVyZWRcbiAqIGNsaWNrOiBwaWNraW5nIGEgY2xhc3MgaW4gdGhlIGxlZ2VuZCBhbmQgdGhlbiBjbGlja2luZyB0aGF0IHNhbWUgY2xhc3Mgb24gdGhlXG4gKiBjYW52YXMgc2hvdWxkIGNsZWFyIGl0LCBhbmQgYSByZW1lbWJlcmVkIGNsaWNrIGNhbm5vdCBrbm93IGFib3V0IHRoZSBsZWdlbmQuXG4gKiBDb3VudHMgYXJlIGNvbXBhcmVkIGZpcnN0LCBzbyB0d28gZGlmZmVyZW50IHNlbGVjdGlvbnMgdXN1YWxseSBjb3N0IG5vdGhpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1lU2VsZWN0aW9uKGE6IFNwYXRpYWxTZWxlY3Rpb25NYXNrLCBiOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IGJvb2xlYW4ge1xuICBpZiAoYS5jb3VudCAhPT0gYi5jb3VudCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoYS5tYXNrLmxlbmd0aCAhPT0gYi5tYXNrLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubWFzay5sZW5ndGg7IGkrKykge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gMC8xOiB0aGUgbWFza3MgYXJlIGZsYWdzLCBhbmQgYSB3cml0ZXIgaXMgZnJlZSB0byB1c2UgYW55XG4gICAgLy8gbm9uLXplcm8gdmFsdWUgZm9yIFwic2VsZWN0ZWRcIi5cbiAgICBpZiAoKGEubWFza1tpXSA/IDEgOiAwKSAhPT0gKGIubWFza1tpXSA/IDEgOiAwKSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogRXZlcnkgb2JzZXJ2YXRpb24gd2hvc2UgY2F0ZWdvcmljYWwgY29kZSBlcXVhbHMgYGNvZGVgIOKAlCB0aGUgbGVnZW5kIGNsaWNrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5Q2F0ZWdvcnkoY29kZXM6IFVpbnQxNkFycmF5LCBjb2RlOiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShjb2Rlcy5sZW5ndGgpO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGNvZGVzW2ldID09PSBjb2RlKSB7XG4gICAgICBtYXNrW2ldID0gMTtcbiAgICAgIGNvdW50Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50IH07XG59XG4iXX0=
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWxlY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwvc3BhdGlhbC1zZWxlY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RSxPQUFPLEVBQXdCLFdBQVcsSUFBSSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQStCdEcsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDdEMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDbkQsQ0FBQztBQUVELHVDQUF1QztBQUN2QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQWdCO0lBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNWLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLENBQUMsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVELDBEQUEwRDtBQUMxRCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWdCO0lBQzVDLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNqRSxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQStCO0lBQ2hFLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7UUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLEVBQXFCLEVBQUUsRUFBcUIsRUFBRSxFQUFVLEVBQUUsRUFBVTtJQUM5RixPQUFPLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxDQUFTLEVBQUUsRUFBVSxFQUFFLEVBQVU7SUFDakQsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN0RSxDQUFDO0FBUUQsc0VBQXNFO0FBQ3RFLFNBQVMsWUFBWSxDQUFDLEVBQVksRUFBRSxFQUFZLEVBQUUsS0FBb0I7SUFDcEUsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMvQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLGdGQUFnRjtJQUNoRiwrREFBK0Q7SUFDL0QsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQzVCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUM7U0FDbEMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxPQUFPO1FBQ0wsTUFBTTtRQUNOLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQy9DLHlFQUF5RTtZQUN6RSw4QkFBOEI7WUFDOUIsS0FBSyxNQUFNLElBQUksSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO29CQUFFLE9BQU8sS0FBSyxDQUFDO1lBQzNGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLE1BQWM7SUFDekMsc0VBQXNFO0lBQ3RFLElBQUssTUFBdUMsRUFBRSxJQUFJLEtBQUssU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzVFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sRUFBRSxNQWFMLENBQUM7SUFDZCxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWxCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDOUIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUMxRixDQUFDO0lBQ0osQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssS0FBSztZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsaUNBQWlDO1FBQ3BFLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLCtEQUErRDtRQUMvRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQzlDLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQXlCLEVBQUUsZ0JBQXdCO0lBQ2pGLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDOUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0I7WUFBRSxTQUFTO1FBQ3JFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDdEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNaLEtBQUssRUFBRSxDQUFDO0lBQ1YsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsWUFBaUMsRUFDakMsUUFBcUMsRUFDckMsT0FBMEIsRUFDMUIsVUFBd0I7SUFFeEIsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRW5ELE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxTQUFTLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLHdFQUF3RTtZQUN4RSx3REFBd0Q7WUFDeEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7Z0JBQUUsU0FBUztZQUM5QyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ1osS0FBSyxFQUFFLENBQUM7Z0JBQ1IsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLE1BQW9CLEVBQ3BCLEtBQWEsRUFDYixPQUEwQjtJQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBRW5ELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMvQixNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdCLGlEQUFpRDtRQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQUUsU0FBUztRQUMzRCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUFFLFNBQVM7WUFDOUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNaLElBQUksRUFBRSxDQUFDO2dCQUNQLE1BQU07WUFDUixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxZQUFpQyxFQUNqQyxNQUF5QixFQUN6QixNQUFnQztJQUVoQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDekIsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDO0lBQ3hDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDdEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFDbkQsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLO1lBQUUsU0FBUztRQUN6RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUk7WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztZQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUk7UUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVuRCxzRUFBc0U7SUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQzlCLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFO1FBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTdFLE1BQU0sS0FB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QUFDLENBQUM7WUFDWixLQUFLLEVBQUUsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBTbGljZU91dGxpbmVzLCBmaWxsT3V0bGluZXMgfSBmcm9tICcuLi9nZW9tZXRyeS9yZWNvbnN0cnVjdCc7XG5pbXBvcnQgeyBSaW5nQm91bmRzIGFzIEJvdW5kcywgcG9pbnRJblJpbmcgYXMgcmluZ0NvbnRhaW5zUG9pbnQsIHJpbmdCb3VuZHMgfSBmcm9tICcuLi9nZW9tZXRyeS9yaW5nJztcbmltcG9ydCB7XG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgU3BhdGlhbFNlbGVjdGlvbk1hc2ssXG4gIFNwYXRpYWxWb2x1bWVNZXRhLFxufSBmcm9tICcuLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcblxuLyoqXG4gKiBXaGljaCBvYnNlcnZhdGlvbnMgZmFsbCBpbnNpZGUgYSBzZXQgb2YgZHJhd24gcmVnaW9ucy5cbiAqXG4gKiBQdXJlLCBsaWtlIGBzcGF0aWFsLWVuY29kaW5nLnRzYCDigJQgbm8gc3RvcmUsIG5vIHJlbmRlcmVyIOKAlCBzbyB0aGUgZ2VvbWV0cnkgaXNcbiAqIHRlc3RhYmxlIG9uIGl0cyBvd24uXG4gKlxuICogV0hZIFRISVMgSVMgVEhFIFdIT0xFIFNFTEVDVElPTiBNRUNIQU5JU01cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFscmVhZHkgY29tZSBmcm9tIGV2ZXJ5IG9uLWNhbnZhcyB0b29sIHRoZSBsaWJyYXJ5IGhhczogcmVjdGFuZ2xlLFxuICogcG9seWdvbiwgZnJlZWhhbmQsIG1hZ2ljIHdhbmQsIGJydXNoLiBUZXN0aW5nIG9ic2VydmF0aW9ucyBhZ2FpbnN0IHRoZW0gdHVybnNcbiAqIGFsbCBvZiB0aG9zZSBpbnRvIHNwYXRpYWwtb21pY3Mgc2VsZWN0aW9uIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGEgc2luZ2xlIG5ld1xuICogY2FudmFzIGludGVyYWN0aW9uIOKAlCB3aGljaCBpcyB3aHkgdGhlcmUgaXMgbm8gYmVzcG9rZSBtYXJxdWVlIGhlcmUuXG4gKlxuICogQ09PUkRJTkFURSBGUkFNRVNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tXG4gKiBSZWdpb25zIGFyZSBkcmF3biBpbiBXT1JMRCAoaW1hZ2UpIGNvb3JkaW5hdGVzLiBPYnNlcnZhdGlvbnMgbGl2ZSBpbiB0aGVcbiAqIGRhdGFzZXQncyBvd24gZnJhbWUgYW5kIHJlYWNoIHRoZSB3b3JsZCB0aHJvdWdoIGBpbWFnZVJlZmAg4oCUIHNvIHRoZXkgYXJlXG4gKiB0cmFuc2Zvcm1lZCBmb3J3YXJkIGJlZm9yZSB0ZXN0aW5nLCBtYXRjaGluZyBleGFjdGx5IHdoYXQgdGhlIHJlbmRlcmVyIGRyYXdzLlxuICovXG5cbi8qKiBNb3ZlZCB0byB0aGUgZGF0YXNldCBjb250cmFjdCAoYSBwdXJlIGRhdGEgdHlwZSk7IHJlLWV4cG9ydGVkIGhlcmUgZm9yIGV4aXN0aW5nIGltcG9ydGVycy4gKi9cbmV4cG9ydCB0eXBlIHsgU3BhdGlhbFNlbGVjdGlvbk1hc2sgfTtcblxuLyoqIEFuIGVtcHR5IHNlbGVjdGlvbiBvdmVyIGBjb3VudGAgb2JzZXJ2YXRpb25zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5U2VsZWN0aW9uKGNvdW50ID0gMCk6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgcmV0dXJuIHsgbWFzazogbmV3IFVpbnQ4QXJyYXkoY291bnQpLCBjb3VudDogMCB9O1xufVxuXG4vKiogTnVtYmVyIG9mIHNldCBlbnRyaWVzIGluIGEgbWFzay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudE1hc2sobWFzazogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrLmxlbmd0aDsgaSsrKSBpZiAobWFza1tpXSkgbisrO1xuICByZXR1cm4gbjtcbn1cblxuLyoqIFNlbGVjdGVkIGluZGljZXMsIGZvciBleHBvcnQgb3IgYSBkb3duc3RyZWFtIHF1ZXJ5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hc2tUb0luZGljZXMobWFzazogVWludDhBcnJheSk6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KGNvdW50TWFzayhtYXNrKSk7XG4gIGxldCBhdCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWFzay5sZW5ndGg7IGkrKykgaWYgKG1hc2tbaV0pIG91dFthdCsrXSA9IGk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmVuZGVyZXItZmFjaW5nIGludmVyc2U6IHdoaWNoIG9ic2VydmF0aW9ucyB0byBNVVRFLiBXaXRoIG5vdGhpbmcgc2VsZWN0ZWRcbiAqIG5vdGhpbmcgaXMgbXV0ZWQgKHRoZSB3aG9sZSB0aXNzdWUgcmVhZHMgbm9ybWFsbHkpOyB3aXRoIGEgc2VsZWN0aW9uLCBldmVyeVxuICogdW5zZWxlY3RlZCBvYnNlcnZhdGlvbiBpcyBtdXRlZCDigJQgdGhlIENvc014IGhpZ2hsaWdodC12cy1tdXRlIHJ1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdXRlZEZyb21TZWxlY3Rpb24oc2VsZWN0aW9uOiBTcGF0aWFsU2VsZWN0aW9uTWFzayk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKHNlbGVjdGlvbi5jb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG11dGVkID0gbmV3IFVpbnQ4QXJyYXkoc2VsZWN0aW9uLm1hc2subGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRlZC5sZW5ndGg7IGkrKykgbXV0ZWRbaV0gPSBzZWxlY3Rpb24ubWFza1tpXSA/IDAgOiAxO1xuICByZXR1cm4gbXV0ZWQ7XG59XG5cbi8qKlxuICogRXZlbi1vZGQgcmF5IGNhc3Q6IGlzIChweCwgcHkpIGluc2lkZSB0aGUgY2xvc2VkIHJpbmcgeHMveXM/XG4gKlxuICogUHVibGljIEFQSSBrZXB0IHdpdGggaXRzIChyaW5nLCBwb2ludCkgYXJndW1lbnQgb3JkZXI7IHRoZSB0ZXN0IGl0c2VsZiBpc1xuICogdGhlIHNoYXJlZCBgZ2VvbWV0cnkvcmluZ2Agb25lIHRoZSByZWdpb24gb3ZlcmxheXMgYW5kIHRvb2xzIHVzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50SW5SaW5nKHhzOiByZWFkb25seSBudW1iZXJbXSwgeXM6IHJlYWRvbmx5IG51bWJlcltdLCBweDogbnVtYmVyLCBweTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiByaW5nQ29udGFpbnNQb2ludChweCwgcHksIHhzLCB5cyk7XG59XG5cbmZ1bmN0aW9uIGluQm91bmRzKGI6IEJvdW5kcywgcHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gcHggPj0gYi5taW5YICYmIHB4IDw9IGIubWF4WCAmJiBweSA+PSBiLm1pblkgJiYgcHkgPD0gYi5tYXhZO1xufVxuXG4vKiogQSByZWdpb24gZmxhdHRlbmVkIHRvIHNvbWV0aGluZyB0ZXN0YWJsZTogYm91bmRzICsgYSBoaXQgdGVzdC4gKi9cbmludGVyZmFjZSBTaGFwZSB7XG4gIGJvdW5kczogQm91bmRzO1xuICBoaXQocHg6IG51bWJlciwgcHk6IG51bWJlcik6IGJvb2xlYW47XG59XG5cbi8qKiBQb2x5Z29uLXdpdGgtaG9sZXM6IGluc2lkZSB0aGUgZXh0ZXJpb3IgYW5kIG91dHNpZGUgZXZlcnkgaG9sZS4gKi9cbmZ1bmN0aW9uIHBvbHlnb25TaGFwZSh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgaG9sZXM/OiBudW1iZXJbXVtdW10pOiBTaGFwZSB8IG51bGwge1xuICBpZiAoeHMubGVuZ3RoIDwgMykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGJvdW5kcyA9IHJpbmdCb3VuZHMoeHMsIHlzKTtcbiAgLy8gU3BsaXQgYW5kIGJvdW5kZWQgT05DRSBwZXIgc2hhcGU6IHRoZSBoaXQgdGVzdCBydW5zIGZvciBldmVyeSBjYW5kaWRhdGUgcG9pbnRcbiAgLy8gaW5zaWRlIHRoZSBleHRlcmlvciDigJQgdXAgdG8gbWlsbGlvbnMgb2YgY2VsbHMgcGVyIHNlbGVjdGlvbi5cbiAgY29uc3QgaG9sZVJpbmdzID0gKGhvbGVzID8/IFtdKVxuICAgIC5maWx0ZXIoKHJpbmcpID0+IHJpbmcubGVuZ3RoID49IDMpXG4gICAgLm1hcCgocmluZykgPT4ge1xuICAgICAgY29uc3QgaHggPSByaW5nLm1hcCgocCkgPT4gcFswXSk7XG4gICAgICBjb25zdCBoeSA9IHJpbmcubWFwKChwKSA9PiBwWzFdKTtcbiAgICAgIHJldHVybiB7IHhzOiBoeCwgeXM6IGh5LCBib3VuZHM6IHJpbmdCb3VuZHMoaHgsIGh5KSB9O1xuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIGJvdW5kcyxcbiAgICBoaXQ6IChweCwgcHkpID0+IHtcbiAgICAgIGlmICghcG9pbnRJblJpbmcoeHMsIHlzLCBweCwgcHkpKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBUaGUgcmVnaW9uIG1vZGVsIGlzIGV4cGxpY2l0OiBhIHBvaW50IGluc2lkZSB0aGUgZXh0ZXJpb3IgQU5EIGluc2lkZSBhXG4gICAgICAvLyBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvbi5cbiAgICAgIGZvciAoY29uc3QgaG9sZSBvZiBob2xlUmluZ3MpIHtcbiAgICAgICAgaWYgKGluQm91bmRzKGhvbGUuYm91bmRzLCBweCwgcHkpICYmIHBvaW50SW5SaW5nKGhvbGUueHMsIGhvbGUueXMsIHB4LCBweSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIHJlZ2lvbiB0byB0ZXN0YWJsZSBzaGFwZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgZm9yIGFueXRoaW5nIHRoYXRcbiAqIGVuY2xvc2VzIG5vIGFyZWEg4oCUIGFuIG9wZW4gcG9seWxpbmUsIGFuIGludGVuc2l0eS1wcm9maWxlIGxpbmUsIGEgZGVnZW5lcmF0ZVxuICogcmVjdGFuZ2xlIOKAlCBzbyB0aG9zZSBuZXZlciBjb250cmlidXRlIHRvIGEgc2VsZWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2hhcGVzKHJlZ2lvbjogUmVnaW9uKTogU2hhcGVbXSB7XG4gIC8vIFByb2ZpbGUgbGluZXMgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90IHRoZSBhbm5vdGF0aW9uIHNldC5cbiAgaWYgKChyZWdpb24gYXMgdW5rbm93biBhcyB7IGtpbmQ/OiBzdHJpbmcgfSk/LmtpbmQgPT09ICdwcm9maWxlJykgcmV0dXJuIFtdO1xuICBjb25zdCBiID0gcmVnaW9uPy5ib3VuZHMgYXMgdW5rbm93biBhc1xuICAgIHwge1xuICAgICAgICB4PzogbnVtYmVyO1xuICAgICAgICB5PzogbnVtYmVyO1xuICAgICAgICB3aWR0aD86IG51bWJlcjtcbiAgICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgICB4cG9pbnRzPzogbnVtYmVyW107XG4gICAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgICAgY2xvc2VkPzogYm9vbGVhbjtcbiAgICAgICAgaG9sZXM/OiBudW1iZXJbXVtdW107XG4gICAgICAgIHBvbHlnb25zPzogeyB4cG9pbnRzOiBudW1iZXJbXTsgeXBvaW50czogbnVtYmVyW107IGNsb3NlZD86IGJvb2xlYW47IGhvbGVzPzogbnVtYmVyW11bXVtdIH1bXTtcbiAgICAgIH1cbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFiKSByZXR1cm4gW107XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoYi5wb2x5Z29ucykpIHtcbiAgICByZXR1cm4gYi5wb2x5Z29ucy5mbGF0TWFwKChwKSA9PlxuICAgICAgcC5jbG9zZWQgPT09IGZhbHNlID8gW10gOiAocG9seWdvblNoYXBlKHAueHBvaW50cyA/PyBbXSwgcC55cG9pbnRzID8/IFtdLCBwLmhvbGVzKSA/PyBbXSksXG4gICAgKTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShiLnhwb2ludHMpKSB7XG4gICAgaWYgKGIuY2xvc2VkID09PSBmYWxzZSkgcmV0dXJuIFtdOyAvLyBvcGVuIHBvbHlsaW5lIGVuY2xvc2VzIG5vdGhpbmdcbiAgICBjb25zdCBzaGFwZSA9IHBvbHlnb25TaGFwZShiLnhwb2ludHMsIGIueXBvaW50cyA/PyBbXSwgYi5ob2xlcyk7XG4gICAgcmV0dXJuIHNoYXBlID8gW3NoYXBlXSA6IFtdO1xuICB9XG4gIGlmICh0eXBlb2YgYi53aWR0aCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGIuaGVpZ2h0ID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHggPSBiLnggPz8gMDtcbiAgICBjb25zdCB5ID0gYi55ID8/IDA7XG4gICAgLy8gTm9ybWFsaXNlIGEgcmVjdGFuZ2xlIGRyYWdnZWQgcmlnaHQtdG8tbGVmdCAvIGJvdHRvbS10by10b3AuXG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgsIHggKyBiLndpZHRoKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeCwgeCArIGIud2lkdGgpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5LCB5ICsgYi5oZWlnaHQpO1xuICAgIGlmIChtYXhYID09PSBtaW5YIHx8IG1heFkgPT09IG1pblkpIHJldHVybiBbXTtcbiAgICBjb25zdCBib3VuZHMgPSB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfTtcbiAgICByZXR1cm4gW3sgYm91bmRzLCBoaXQ6IChweCwgcHkpID0+IGluQm91bmRzKGJvdW5kcywgcHgsIHB5KSB9XTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbi8qKlxuICogQSBzZWxlY3Rpb24gZnJvbSBhbiBleHBsaWNpdCBsaXN0IG9mIG9ic2VydmF0aW9uIGluZGljZXMuXG4gKlxuICogV2hhdCBhIGxhc3NvIGluIGEgbGlua2VkIHBsb3QgcHJvZHVjZXM6IHRoZSBwbG90IGtub3dzIHdoaWNoIHBvaW50cyB0aGUgdXNlciBkcmV3XG4gKiBhcm91bmQsIGFuZCB0aGUgbWFwIG5lZWRzIHRoYXQgYXMgYSBtYXNrIG92ZXIgQUxMIG9ic2VydmF0aW9ucy4gT3V0LW9mLXJhbmdlIGFuZFxuICogZHVwbGljYXRlIGluZGljZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQg4oCUIGEgcGxvdCBtYXkgaGFuZCBiYWNrIHRoZSBzYW1lXG4gKiBwb2ludCB0d2ljZSwgYW5kIGEgc3RhbGUgaW5kZXggZnJvbSBhIHBsb3QgZHJhd24gYmVmb3JlIGEgZGF0YXNldCBjaGFuZ2UgbXVzdCBub3RcbiAqIHRocm93IGluIHRoZSBtaWRkbGUgb2YgYSBzZWxlY3Rpb24gZ2VzdHVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEJ5SW5kaWNlcyhpbmRpY2VzOiBJdGVyYWJsZTxudW1iZXI+LCBvYnNlcnZhdGlvbkNvdW50OiBudW1iZXIpOiBTcGF0aWFsU2VsZWN0aW9uTWFzayB7XG4gIGNvbnN0IG1hc2sgPSBuZXcgVWludDhBcnJheShvYnNlcnZhdGlvbkNvdW50KTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgZm9yIChjb25zdCBpIG9mIGluZGljZXMpIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaSkgfHwgaSA8IDAgfHwgaSA+PSBvYnNlcnZhdGlvbkNvdW50KSBjb250aW51ZTtcbiAgICBpZiAobWFza1tpXSkgY29udGludWU7XG4gICAgbWFza1tpXSA9IDE7XG4gICAgY291bnQrKztcbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIE9ic2VydmF0aW9ucyBpbnNpZGUgQU5ZIG9mIGByZWdpb25zYCAodW5pb24pLiBDb29yZGluYXRlcyBhcmUgdHJhbnNmb3JtZWQgYnlcbiAqIGBpbWFnZVJlZmAgZmlyc3QsIHNvIHRoZSB0ZXN0IGhhcHBlbnMgaW4gdGhlIHNhbWUgd29ybGQgc3BhY2UgdGhlIHJlZ2lvbnMgd2VyZVxuICogZHJhd24gaW4uXG4gKlxuICogYGNhbmRpZGF0ZXNgLCB3aGVuIGdpdmVuLCByZXN0cmljdHMgdGhlIHRlc3QgdG8gdGhvc2Ugb2JzZXJ2YXRpb24gaW5kaWNlcyDigJQgaG93XG4gKiBhIDJEIHZpZXcgb2YgYSAzRCBkYXRhc2V0IGtlZXBzIGEgZHJhd24gcmVnaW9uIG1lYW5pbmcgd2hhdCBpdCBsb29rcyBsaWtlIGl0XG4gKiBtZWFuczogdGhlIHNoYXBlIHdhcyBkcmF3biBvdmVyIE9ORSBzZWN0aW9uLCBzbyBpdCBzZWxlY3RzIHRoYXQgc2VjdGlvbidzIGNlbGxzXG4gKiByYXRoZXIgdGhhbiB0aGUgd2hvbGUgZGVwdGggb2YgdGhlIHNwZWNpbWVuIGJlaGluZCB0aGVtLiBUaGUgcmV0dXJuZWQgbWFzayBzdGF5c1xuICogaW5kZXhlZCBieSBvYnNlcnZhdGlvbiwgc28gZXZlcnkgY29uc3VtZXIgKGNoYXJ0cywgbGVnZW5kLCB0aGUgM0QgY2xvdWQpIHJlYWRzIGl0XG4gKiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnMoXG4gIG9ic2VydmF0aW9uczogU3BhdGlhbE9ic2VydmF0aW9ucyxcbiAgaW1hZ2VSZWY6IFNwYXRpYWxJbWFnZVJlZiB8IHVuZGVmaW5lZCxcbiAgcmVnaW9uczogcmVhZG9ubHkgUmVnaW9uW10sXG4gIGNhbmRpZGF0ZXM/OiBVaW50MzJBcnJheSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbiA9IG9ic2VydmF0aW9ucy5jb3VudDtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KG4pO1xuICBjb25zdCBzaGFwZXMgPSByZWdpb25zLmZsYXRNYXAoKHIpID0+IHJlZ2lvblNoYXBlcyhyKSk7XG4gIGlmIChzaGFwZXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBtYXNrLCBjb3VudDogMCB9O1xuXG4gIGNvbnN0IFtzeCwgc3ldID0gaW1hZ2VSZWY/LnNjYWxlID8/IFsxLCAxXTtcbiAgY29uc3QgW3R4LCB0eV0gPSBpbWFnZVJlZj8udHJhbnNsYXRlID8/IFswLCAwXTtcbiAgbGV0IGNvdW50ID0gMDtcbiAgY29uc3QgdG90YWwgPSBjYW5kaWRhdGVzID8gY2FuZGlkYXRlcy5sZW5ndGggOiBuO1xuICBmb3IgKGxldCBrID0gMDsgayA8IHRvdGFsOyBrKyspIHtcbiAgICBjb25zdCBpID0gY2FuZGlkYXRlcyA/IGNhbmRpZGF0ZXNba10gOiBrO1xuICAgIGNvbnN0IHB4ID0gb2JzZXJ2YXRpb25zLnhbaV0gKiBzeCArIHR4O1xuICAgIGNvbnN0IHB5ID0gb2JzZXJ2YXRpb25zLnlbaV0gKiBzeSArIHR5O1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICAvLyBCb3VuZHMgZmlyc3Q6IGEgcmF5IGNhc3QgcGVyIG9ic2VydmF0aW9uIHBlciByZWdpb24gd291bGQgZG9taW5hdGUgYXRcbiAgICAgIC8vIDEwXjUgb2JzZXJ2YXRpb25zLCBhbmQgbW9zdCBwb2ludHMgbWlzcyBtb3N0IHJlZ2lvbnMuXG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFNlbGVjdCBvYnNlcnZhdGlvbnMgd2hvc2UgU0NSRUVOIHByb2plY3Rpb24gZmFsbHMgaW5zaWRlIHRoZSBkcmF3biByZWdpb25zLlxuICpcbiAqIFRoaXMgaXMgaG93IGEgcmVnaW9uIHNlbGVjdGlvbiB3b3JrcyBpbiB0aGUgM0QgY2xvdWQuIFRoZXJlIGlzIG5vIGRhdGEtc3BhY2VcbiAqIGFmZmluZSB0byBtYXAgYSBkcmF3biBzaGFwZSB0aHJvdWdoLCBiZWNhdXNlIHRoZSBzaGFwZSB3YXMgZHJhd24gb24gYSAyRCBzY3JlZW5cbiAqIGFnYWluc3QgYSBwZXJzcGVjdGl2ZSBjYW1lcmEg4oCUIHNvIHRoZSBvYnNlcnZhdGlvbnMgY29tZSB0aGUgb3RoZXIgd2F5LCBhbHJlYWR5XG4gKiBwcm9qZWN0ZWQgdG8gY2FudmFzIHBpeGVscyBieSB0aGUgcmVuZGVyZXIgKHdoaWNoIG93bnMgdGhlIGNhbWVyYSksIGFuZCB0aGVcbiAqIHJlZ2lvbnMgYXJlIHRlc3RlZCBpbiB0aGF0IHNhbWUgc2NyZWVuIHNwYWNlLlxuICpcbiAqIFRoZSBjb25zZXF1ZW5jZSBpcyB3b3J0aCBiZWluZyBleHBsaWNpdCBhYm91dDogYSBzY3JlZW4tc3BhY2UgbGFzc28gc2VsZWN0c1xuICogdGhyb3VnaCB0aGUgV0hPTEUgREVQVEggb2YgdGhlIGNsb3VkLCBsaWtlIGEgY29va2llIGN1dHRlciwgbm90IGEgc2xhYiBhdCBzb21lXG4gKiBjaG9zZW4gei4gVGhhdCBpcyBpbmhlcmVudCB0byBkcmF3aW5nIG9uIGEgZmxhdCBzY3JlZW4sIGFuZCBpdCBpcyB3aGF0IG5hcGFyaVxuICogYW5kIGV2ZXJ5IG90aGVyIG9yYml0LWNhbWVyYSBwb2ludCBwaWNrZXIgZG8uIE9yYml0IGFuZCBkcmF3IGFnYWluIHRvIGN1dCBmcm9tXG4gKiBhbm90aGVyIGFuZ2xlLlxuICpcbiAqIGBzY3JlZW5gIGlzIGBbeDAsIHkwLCB4MSwgeTEsIOKApl1gIGluIGNhbnZhcyBwaXhlbHMsIGBjb3VudGAgZW50cmllcyBsb25nLiBBblxuICogb2JzZXJ2YXRpb24gdGhlIGNhbWVyYSBwdXRzIGJlaGluZCB0aGUgZXllIGlzIGdpdmVuIE5hTiBieSB0aGUgcHJvamVjdG9yIGFuZFxuICogbmV2ZXIgc2VsZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWxlY3RJblJlZ2lvbnNQcm9qZWN0ZWQoXG4gIHNjcmVlbjogRmxvYXQzMkFycmF5LFxuICBjb3VudDogbnVtYmVyLFxuICByZWdpb25zOiByZWFkb25seSBSZWdpb25bXSxcbik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvdW50KTtcbiAgY29uc3Qgc2hhcGVzID0gcmVnaW9ucy5mbGF0TWFwKChyKSA9PiByZWdpb25TaGFwZXMocikpO1xuICBpZiAoc2hhcGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbWFzaywgY291bnQ6IDAgfTtcblxuICBsZXQgaGl0cyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHB4ID0gc2NyZWVuW2kgKiAyXTtcbiAgICBjb25zdCBweSA9IHNjcmVlbltpICogMiArIDFdO1xuICAgIC8vIEJlaGluZCB0aGUgY2FtZXJhLCBvciBvdGhlcndpc2UgdW5wcm9qZWN0YWJsZS5cbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShweCkgfHwgIU51bWJlci5pc0Zpbml0ZShweSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVzKSB7XG4gICAgICBpZiAoIWluQm91bmRzKHNoYXBlLmJvdW5kcywgcHgsIHB5KSkgY29udGludWU7XG4gICAgICBpZiAoc2hhcGUuaGl0KHB4LCBweSkpIHtcbiAgICAgICAgbWFza1tpXSA9IDE7XG4gICAgICAgIGhpdHMrKztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IG1hc2ssIGNvdW50OiBoaXRzIH07XG59XG5cbi8qKlxuICogT2JzZXJ2YXRpb25zIGluc2lkZSB0aGUgVk9MVU1FIGEgc3RhY2sgb2Ygb3V0bGluZXMgZW5jbG9zZXM6IGEgcmVnaW9uIGNsYXNzIChhblxuICogYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpIHRocm91Z2ggZXZlcnkgc2VjdGlvbiBvZiB0aGUgZGF0YXNldCdzXG4gKiByZWZlcmVuY2Ugdm9sdW1lLCBhcyBpdHMgM0QgcmVjb25zdHJ1Y3Rpb24gc2hvd3MgaXQuXG4gKlxuICogVGhlIG91dGxpbmVzIGFyZSBpbiB0aGUgdm9sdW1lJ3Mgb3duIGdyaWQg4oCUIHgsIHkgaW4gdm94ZWxzLCB6IHRoZSBzbGljZSDigJQgd2hpY2hcbiAqIGlzIHdoZXJlIHJlZ2lvbnMgaW1wb3J0ZWQgb250byB0aGUgdm9sdW1lJ3Mgc3RhY2sgc2l0LiBBbiBvYnNlcnZhdGlvbiBpcyBpbiB2b3hlbFxuICogYCjijIp4IC8gdnjijIssIOKMinkgLyB2eeKMiywg4oyKeiAvIHZ64oyLKWAgKHNlZSBgdm9sdW1lSW1hZ2VSZWZgKSwgYW5kIHNlbGVjdGVkIHdoZW4gaXRzXG4gKiBzbGljZSdzIG91dGxpbmVzIGNvdmVyIHRoYXQgdm94ZWwsIGZpbGxlZCBhcyB0aGUgcmVjb25zdHJ1Y3Rpb24gZmlsbHMgdGhlbS4gT25lXG4gKiBzbGljZSBpcyByYXN0ZXJpc2VkIGF0IGEgdGltZSwgc28gYSBzdHJ1Y3R1cmUgdGhyb3VnaCB0aGUgd2hvbGUgYnJhaW4gY29zdHMgb25lXG4gKiBzbGljZSdzIG1hc2ssIG5vdCB0aGUgdm9sdW1lJ3MuIEFuIG9ic2VydmF0aW9uIG91dHNpZGUgdGhlIHZvbHVtZSwgb3Igd2l0aG91dCBhXG4gKiB6LCBpcyBuZXZlciBzZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdEluQ2xhc3NWb2x1bWVzKFxuICBvYnNlcnZhdGlvbnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsXG4gIHZvbHVtZTogU3BhdGlhbFZvbHVtZU1ldGEsXG4gIHNsaWNlczogcmVhZG9ubHkgU2xpY2VPdXRsaW5lc1tdLFxuKTogU3BhdGlhbFNlbGVjdGlvbk1hc2sge1xuICBjb25zdCBuID0gb2JzZXJ2YXRpb25zLmNvdW50O1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGNvbnN0IHogPSBvYnNlcnZhdGlvbnMuejtcbiAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9ID0gdm9sdW1lO1xuICBjb25zdCBbdngsIHZ5LCB2el0gPSB2b2x1bWUudm94ZWxTaXplO1xuICBjb25zdCBieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFNsaWNlT3V0bGluZXNbXT4oKTtcbiAgZm9yIChjb25zdCBzIG9mIHNsaWNlcykge1xuICAgIGlmICghcy5yaW5ncy5sZW5ndGggfHwgcy56IDwgMCB8fCBzLnogPj0gZGVwdGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBieVNsaWNlLmdldChzLnopO1xuICAgIGlmIChsaXN0KSBsaXN0LnB1c2gocyk7XG4gICAgZWxzZSBieVNsaWNlLnNldChzLnosIFtzXSk7XG4gIH1cbiAgaWYgKCF6IHx8ICFieVNsaWNlLnNpemUpIHJldHVybiB7IG1hc2ssIGNvdW50OiAwIH07XG5cbiAgLy8gVGhlIG9ic2VydmF0aW9ucyBvZiBlYWNoIG91dGxpbmVkIHNsaWNlIChhIGNvdW50aW5nIHNvcnQgYnkgc2xpY2UpLlxuICBjb25zdCBzbGljZU9mID0gbmV3IEludDMyQXJyYXkobikuZmlsbCgtMSk7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShkZXB0aCArIDEpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IGsgPSBNYXRoLmZsb29yKHpbaV0gLyB2eik7XG4gICAgaWYgKCFieVNsaWNlLmhhcyhrKSkgY29udGludWU7XG4gICAgc2xpY2VPZltpXSA9IGs7XG4gICAgY291bnRzW2sgKyAxXSsrO1xuICB9XG4gIGZvciAobGV0IGsgPSAwOyBrIDwgZGVwdGg7IGsrKykgY291bnRzW2sgKyAxXSArPSBjb3VudHNba107XG4gIGNvbnN0IG9yZGVyID0gbmV3IFVpbnQzMkFycmF5KGNvdW50c1tkZXB0aF0pO1xuICBjb25zdCBhdCA9IGNvdW50cy5zbGljZSgwLCBkZXB0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSBpZiAoc2xpY2VPZltpXSA+PSAwKSBvcmRlclthdFtzbGljZU9mW2ldXSsrXSA9IGk7XG5cbiAgY29uc3QgcGxhbmUgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3QgW2ssIG91dGxpbmVzXSBvZiBieVNsaWNlKSB7XG4gICAgcGxhbmUuZmlsbCgwKTtcbiAgICBmb3IgKGNvbnN0IHMgb2Ygb3V0bGluZXMpIGZpbGxPdXRsaW5lcyhwbGFuZSwgd2lkdGgsIGhlaWdodCwgcyk7XG4gICAgZm9yIChsZXQgbyA9IGNvdW50c1trXTsgbyA8IGNvdW50c1trICsgMV07IG8rKykge1xuICAgICAgY29uc3QgaSA9IG9yZGVyW29dO1xuICAgICAgY29uc3QgcHggPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy54W2ldIC8gdngpO1xuICAgICAgY29uc3QgcHkgPSBNYXRoLmZsb29yKG9ic2VydmF0aW9ucy55W2ldIC8gdnkpO1xuICAgICAgaWYgKHB4IDwgMCB8fCBweSA8IDAgfHwgcHggPj0gd2lkdGggfHwgcHkgPj0gaGVpZ2h0KSBjb250aW51ZTtcbiAgICAgIGlmIChwbGFuZVtweSAqIHdpZHRoICsgcHhdKSB7XG4gICAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgICBjb3VudCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4geyBtYXNrLCBjb3VudCB9O1xufVxuXG4vKipcbiAqIFdoZXRoZXIgdHdvIHNlbGVjdGlvbnMgaG9sZCBleGFjdGx5IHRoZSBzYW1lIG9ic2VydmF0aW9ucy5cbiAqXG4gKiBMZXRzIGEgY2xpY2sgdG9nZ2xlIGFnYWluc3QgdGhlIFNFTEVDVElPTiByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgcmVtZW1iZXJlZFxuICogY2xpY2s6IHBpY2tpbmcgYSBjbGFzcyBpbiB0aGUgbGVnZW5kIGFuZCB0aGVuIGNsaWNraW5nIHRoYXQgc2FtZSBjbGFzcyBvbiB0aGVcbiAqIGNhbnZhcyBzaG91bGQgY2xlYXIgaXQsIGFuZCBhIHJlbWVtYmVyZWQgY2xpY2sgY2Fubm90IGtub3cgYWJvdXQgdGhlIGxlZ2VuZC5cbiAqIENvdW50cyBhcmUgY29tcGFyZWQgZmlyc3QsIHNvIHR3byBkaWZmZXJlbnQgc2VsZWN0aW9ucyB1c3VhbGx5IGNvc3Qgbm90aGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNhbWVTZWxlY3Rpb24oYTogU3BhdGlhbFNlbGVjdGlvbk1hc2ssIGI6IFNwYXRpYWxTZWxlY3Rpb25NYXNrKTogYm9vbGVhbiB7XG4gIGlmIChhLmNvdW50ICE9PSBiLmNvdW50KSByZXR1cm4gZmFsc2U7XG4gIGlmIChhLm1hc2subGVuZ3RoICE9PSBiLm1hc2subGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5tYXNrLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gTm9ybWFsaXNlZCB0byAwLzE6IHRoZSBtYXNrcyBhcmUgZmxhZ3MsIGFuZCBhIHdyaXRlciBpcyBmcmVlIHRvIHVzZSBhbnlcbiAgICAvLyBub24temVybyB2YWx1ZSBmb3IgXCJzZWxlY3RlZFwiLlxuICAgIGlmICgoYS5tYXNrW2ldID8gMSA6IDApICE9PSAoYi5tYXNrW2ldID8gMSA6IDApKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBFdmVyeSBvYnNlcnZhdGlvbiB3aG9zZSBjYXRlZ29yaWNhbCBjb2RlIGVxdWFscyBgY29kZWAg4oCUIHRoZSBsZWdlbmQgY2xpY2suICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0QnlDYXRlZ29yeShjb2RlczogVWludDE2QXJyYXksIGNvZGU6IG51bWJlcik6IFNwYXRpYWxTZWxlY3Rpb25NYXNrIHtcbiAgY29uc3QgbWFzayA9IG5ldyBVaW50OEFycmF5KGNvZGVzLmxlbmd0aCk7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29kZXNbaV0gPT09IGNvZGUpIHtcbiAgICAgIG1hc2tbaV0gPSAxO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHsgbWFzaywgY291bnQgfTtcbn1cbiJdfQ==
@@ -5,6 +5,7 @@
5
5
  *
6
6
  * These work on SIV's own tile contract, so they stay in SIV rather than moving to napari-js.
7
7
  */
8
+ import { ALL_GENES } from '../contracts/ports/spatial-data.port';
8
9
  import { NO_CATEGORY, NO_OBSERVATION, } from '../contracts/spatial-dataset.contract';
9
10
  /** Rings whose owning cell is in a switched-off group removed. */
10
11
  export function filterRings(rings, hidden) {
@@ -43,6 +44,46 @@ export function hiddenGeneSlots(view) {
43
44
  const off = new Set(view.transcriptHiddenGenes);
44
45
  return Uint8Array.from(view.transcriptGenes, (g) => (off.has(g) ? 1 : 0));
45
46
  }
47
+ /**
48
+ * Whether "All genes" is switched off as a whole with the gene tree's root eye: its hidden
49
+ * list is `[ALL_GENES]` (every gene hidden, none excepted). Hiding every gene by name would
50
+ * need the gene list, which a dataset need not have.
51
+ */
52
+ export function allGenesHidden(view) {
53
+ return view.transcriptAllGenes && everyGeneOff(view.transcriptAllGenesHidden);
54
+ }
55
+ /** Whether an "All genes" hidden list hides every gene, none excepted. */
56
+ export function everyGeneOff(off) {
57
+ return off.length === 1 && off[0] === ALL_GENES;
58
+ }
59
+ /** Whether a gene of "All genes" is drawn, by its hidden list (see `transcriptAllGenesHidden`). */
60
+ export function allGeneShownBy(off) {
61
+ const listed = new Set(off);
62
+ const except = off[0] === ALL_GENES;
63
+ return (gene) => listed.has(gene) === except;
64
+ }
65
+ /** "All genes"'s hidden list with `gene` shown (`on`) or hidden, in the list's own form. */
66
+ export function toggleAllGeneHidden(off, gene, on) {
67
+ const except = off[0] === ALL_GENES;
68
+ // Hidden by name: listed means off. Led by ALL_GENES: listed means on.
69
+ const listed = new Set(except ? off.slice(1) : off);
70
+ if (on === except)
71
+ listed.add(gene);
72
+ else
73
+ listed.delete(gene);
74
+ return except ? [ALL_GENES, ...listed] : [...listed];
75
+ }
76
+ /**
77
+ * Codes (indices into `genes`, the dataset's all-gene code order) switched off with their eye
78
+ * toggle while every gene is drawn; null when none is, or without the gene list.
79
+ */
80
+ export function hiddenAllGeneCodes(view, genes) {
81
+ if (!genes || !view.transcriptAllGenesHidden.length)
82
+ return null;
83
+ const shown = allGeneShownBy(view.transcriptAllGenesHidden);
84
+ const codes = Uint8Array.from(genes, (g) => (shown(g) ? 0 : 1));
85
+ return codes.includes(1) ? codes : null;
86
+ }
46
87
  /** Entries in a hidden group's cell, or of a hidden gene, removed (with their sizes). */
47
88
  export function filterTranscripts(t, px, hidden, hiddenGenes) {
48
89
  if (!hidden && !hiddenGenes)
@@ -216,4 +257,4 @@ export function clusterMarkers(rasters, slots, bin, area) {
216
257
  group: Int32Array.from(group),
217
258
  };
218
259
  }
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQ0wsV0FBVyxFQUNYLGNBQWMsR0FJZixNQUFNLHVDQUF1QyxDQUFDO0FBRy9DLGtFQUFrRTtBQUNsRSxNQUFNLFVBQVUsV0FBVyxDQUN6QixLQUF5QixFQUN6QixNQUF5RDtJQUV6RCxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTO1FBQzFELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDYixRQUFRLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sT0FB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Q0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNuQixPQUFPO1FBQ0wsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsSUFBSTtZQUNoQixDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQge1xuICBOT19DQVRFR09SWSxcbiAgTk9fT0JTRVJWQVRJT04sXG4gIFNwYXRpYWxEZW5zaXR5UmFzdGVyLFxuICBTcGF0aWFsUG9seWdvblRpbGUsXG4gIFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IERhdGFSZWN0IH0gZnJvbSAnLi9sb2QnO1xuXG4vKiogUmluZ3Mgd2hvc2Ugb3duaW5nIGNlbGwgaXMgaW4gYSBzd2l0Y2hlZC1vZmYgZ3JvdXAgcmVtb3ZlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJSaW5ncyhcbiAgcmluZ3M6IFNwYXRpYWxQb2x5Z29uVGlsZSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuKTogU3BhdGlhbFBvbHlnb25UaWxlIHtcbiAgaWYgKCFoaWRkZW4pIHJldHVybiByaW5ncztcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByaW5ncy5jb3VudDsgaSsrKSB7XG4gICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tyaW5ncy5vYnNlcnZhdGlvbltpXV07XG4gICAgaWYgKGNvZGUgIT09IE5PX0NBVEVHT1JZICYmIGhpZGRlbi5oaWRkZW5bY29kZV0pIGNvbnRpbnVlO1xuICAgIGtlZXAucHVzaChpKTtcbiAgICB2ZXJ0aWNlcyArPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAtIHJpbmdzLm9mZnNldHNbaV07XG4gIH1cbiAgaWYgKGtlZXAubGVuZ3RoID09PSByaW5ncy5jb3VudCkgcmV0dXJuIHJpbmdzO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShrZWVwLmxlbmd0aCk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGggKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgdiA9IDA7XG4gIGtlZXAuZm9yRWFjaCgoaSwgcikgPT4ge1xuICAgIG9ic2VydmF0aW9uW3JdID0gcmluZ3Mub2JzZXJ2YXRpb25baV07XG4gICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgY29uc3QgYSA9IHJpbmdzLm9mZnNldHNbaV0gKiAyO1xuICAgIGNvbnN0IGIgPSByaW5ncy5vZmZzZXRzW2kgKyAxXSAqIDI7XG4gICAgY29vcmRzLnNldChyaW5ncy5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICB2ICs9IChiIC0gYSkgLyAyO1xuICB9KTtcbiAgb2Zmc2V0c1trZWVwLmxlbmd0aF0gPSB2O1xuICByZXR1cm4geyBjb3VudDoga2VlcC5sZW5ndGgsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIFNsb3RzIChpbmRpY2VzIGludG8gdGhlIHNlbGVjdGVkIGdlbmVzKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWUgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbkdlbmVTbG90cyh2aWV3OiBTcGF0aWFsVmlld1N0YXRlKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIXZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9mZiA9IG5ldyBTZXQodmlldy50cmFuc2NyaXB0SGlkZGVuR2VuZXMpO1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHZpZXcudHJhbnNjcmlwdEdlbmVzLCAoZykgPT4gKG9mZi5oYXMoZykgPyAxIDogMCkpO1xufVxuXG4vKiogRW50cmllcyBpbiBhIGhpZGRlbiBncm91cCdzIGNlbGwsIG9yIG9mIGEgaGlkZGVuIGdlbmUsIHJlbW92ZWQgKHdpdGggdGhlaXIgc2l6ZXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlclRyYW5zY3JpcHRzKFxuICB0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG4gIHB4OiBGbG9hdDMyQXJyYXksXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbiAgaGlkZGVuR2VuZXM6IFVpbnQ4QXJyYXkgfCBudWxsLFxuKTogeyBtZXJnZWQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgcHg6IEZsb2F0MzJBcnJheSB9IHtcbiAgaWYgKCFoaWRkZW4gJiYgIWhpZGRlbkdlbmVzKSByZXR1cm4geyBtZXJnZWQ6IHQsIHB4IH07XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkdlbmVzICYmIGhpZGRlbkdlbmVzW3QuZ2VuZVtpXV0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgIGlmIChoaWRkZW4gJiYgbyAhPT0gTk9fT0JTRVJWQVRJT04pIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbb107XG4gICAgICBpZiAoY29kZSAhPT0gTk9fQ0FURUdPUlkgJiYgaGlkZGVuLmhpZGRlbltjb2RlXSkgY29udGludWU7XG4gICAgfVxuICAgIGtlZXAucHVzaChpKTtcbiAgfVxuICBjb25zdCBwaWNrID0gPFQgZXh0ZW5kcyBGbG9hdDMyQXJyYXkgfCBVaW50MzJBcnJheSB8IFVpbnQxNkFycmF5PihhOiBUKTogVCA9PiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IChhLmNvbnN0cnVjdG9yIGFzIG5ldyAobjogbnVtYmVyKSA9PiBUKShrZWVwLmxlbmd0aCk7XG4gICAga2VlcC5mb3JFYWNoKChpLCBrKSA9PiB7XG4gICAgICBvdXRba10gPSBhW2ldO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH07XG4gIHJldHVybiB7XG4gICAgbWVyZ2VkOiB7XG4gICAgICBjb3VudDoga2VlcC5sZW5ndGgsXG4gICAgICBhZ2dyZWdhdGVkOiB0LmFnZ3JlZ2F0ZWQsXG4gICAgICB4OiBwaWNrKHQueCksXG4gICAgICB5OiBwaWNrKHQueSksXG4gICAgICB6OiBwaWNrKHQueiksXG4gICAgICB3ZWlnaHQ6IHBpY2sodC53ZWlnaHQpLFxuICAgICAgb2JzZXJ2YXRpb246IHBpY2sodC5vYnNlcnZhdGlvbiksXG4gICAgICBnZW5lOiBwaWNrKHQuZ2VuZSksXG4gICAgfSxcbiAgICBweDogcGljayhweCksXG4gIH07XG59XG5cbi8qKiBUaGUgbWVkaWFuIG9mIGB2YCwgZnJvbSBhIHNhbXBsZSBvZiBhYm91dCAxMDI0IHZhbHVlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4odjogRmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgaWYgKCF2Lmxlbmd0aCkgcmV0dXJuIDA7XG4gIGNvbnN0IHN0ZXAgPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHYubGVuZ3RoIC8gMTAyNCkpO1xuICBjb25zdCBzYW1wbGU6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgKz0gc3RlcCkgc2FtcGxlLnB1c2godltpXSk7XG4gIHNhbXBsZS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBzYW1wbGVbc2FtcGxlLmxlbmd0aCA+PiAxXTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRpbGVzJyByaW5ncyBpbnRvIG9uZSBzZXQsIGRyb3BwaW5nIHJpbmdzIGFscmVhZHkgc2VlbiAoYSBjZWxsIHN0cmFkZGxpbmdcbiAqICB0d28gdGlsZXMgbWF5IGJlIGxpc3RlZCBieSBib3RoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVBvbHlnb25UaWxlcyh0aWxlczogU3BhdGlhbFBvbHlnb25UaWxlW10pOiBTcGF0aWFsUG9seWdvblRpbGUge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGxldCByaW5ncyA9IDA7XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdC5jb3VudDsgaSsrKSB7XG4gICAgICBpZiAoc2Vlbi5oYXModC5vYnNlcnZhdGlvbltpXSkpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQodC5vYnNlcnZhdGlvbltpXSk7XG4gICAgICByaW5ncysrO1xuICAgICAgdmVydGljZXMgKz0gdC5vZmZzZXRzW2kgKyAxXSAtIHQub2Zmc2V0c1tpXTtcbiAgICB9XG4gIH1cbiAgc2Vlbi5jbGVhcigpO1xuICBjb25zdCBvYnNlcnZhdGlvbiA9IG5ldyBVaW50MzJBcnJheShyaW5ncyk7XG4gIGNvbnN0IG9mZnNldHMgPSBuZXcgVWludDMyQXJyYXkocmluZ3MgKyAxKTtcbiAgY29uc3QgY29vcmRzID0gbmV3IEZsb2F0MzJBcnJheSh2ZXJ0aWNlcyAqIDIpO1xuICBsZXQgciA9IDA7XG4gIGxldCB2ID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSB0Lm9ic2VydmF0aW9uW2ldO1xuICAgICAgaWYgKHNlZW4uaGFzKG8pKSBjb250aW51ZTtcbiAgICAgIHNlZW4uYWRkKG8pO1xuICAgICAgb2JzZXJ2YXRpb25bcl0gPSBvO1xuICAgICAgb2Zmc2V0c1tyXSA9IHY7XG4gICAgICBjb25zdCBhID0gdC5vZmZzZXRzW2ldICogMjtcbiAgICAgIGNvbnN0IGIgPSB0Lm9mZnNldHNbaSArIDFdICogMjtcbiAgICAgIGNvb3Jkcy5zZXQodC5jb29yZHMuc3ViYXJyYXkoYSwgYiksIHYgKiAyKTtcbiAgICAgIHYgKz0gKGIgLSBhKSAvIDI7XG4gICAgICByKys7XG4gICAgfVxuICB9XG4gIG9mZnNldHNbcmluZ3NdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IHJpbmdzLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBDb25jYXRlbmF0ZSB0cmFuc2NyaXB0IHRpbGVzLCBzdG9wcGluZyBhdCBgbGltaXRgIGVudHJpZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmFuc2NyaXB0VGlsZXModGlsZXM6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZVtdLCBsaW1pdCA9IEluZmluaXR5KTogU3BhdGlhbFRyYW5zY3JpcHRUaWxlIHtcbiAgbGV0IG4gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIG4gKz0gdC5jb3VudDtcbiAgbiA9IE1hdGgubWluKG4sIGxpbWl0KTtcbiAgY29uc3Qgb3V0OiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUgPSB7XG4gICAgY291bnQ6IG4sXG4gICAgYWdncmVnYXRlZDogdGlsZXMuc29tZSgodCkgPT4gdC5hZ2dyZWdhdGVkKSxcbiAgICB4OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHk6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB3ZWlnaHQ6IG5ldyBVaW50MzJBcnJheShuKSxcbiAgICBvYnNlcnZhdGlvbjogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIGdlbmU6IG5ldyBVaW50MTZBcnJheShuKSxcbiAgfTtcbiAgbGV0IG8gPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBjb25zdCBrID0gTWF0aC5taW4odC5jb3VudCwgbiAtIG8pO1xuICAgIGlmIChrIDw9IDApIGJyZWFrO1xuICAgIGZvciAoY29uc3QgZiBvZiBbJ3gnLCAneScsICd6JywgJ3dlaWdodCcsICdvYnNlcnZhdGlvbicsICdnZW5lJ10gYXMgY29uc3QpIHtcbiAgICAgIChvdXRbZl0gYXMgRmxvYXQzMkFycmF5KS5zZXQoKHRbZl0gYXMgRmxvYXQzMkFycmF5KS5zdWJhcnJheSgwLCBrKSwgbyk7XG4gICAgfVxuICAgIG8gKz0gaztcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE9uZSBtYXJrZXIgcGVyIChjbHVzdGVyLCBgYmluYCBzcXVhcmUpIGZyb20gcGVyLWNsdXN0ZXIgZGVuc2l0eSBncmlkczogdGhlIGNvdW50cyBvZiB0aGUgZ3JpZFxuICogY2VsbHMgaW5zaWRlIGBhcmVhYCBzdW1tZWQgcGVyIHNxdWFyZSwgYXQgdGhlaXIgY291bnQtd2VpZ2h0ZWQgY2VudHJlLiBgc2xvdHNbY11gIGlzIHRoZSBnZW5lXG4gKiBzbG90IHdob3NlIGljb24gY2x1c3RlciBjJ3MgbWFya2VycyB0YWtlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2x1c3Rlck1hcmtlcnMoXG4gIHJhc3RlcnM6IFNwYXRpYWxEZW5zaXR5UmFzdGVyW10sXG4gIHNsb3RzOiBudW1iZXJbXSxcbiAgYmluOiBudW1iZXIsXG4gIGFyZWE6IERhdGFSZWN0LFxuKTogeyB0aWxlOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGU7IGdyb3VwOiBJbnQzMkFycmF5IH0ge1xuICBjb25zdCB4OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCB3OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBnZW5lOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBncm91cDogbnVtYmVyW10gPSBbXTtcbiAgcmFzdGVycy5mb3JFYWNoKChyLCBjKSA9PiB7XG4gICAgY29uc3QgW2N3LCBjaF0gPSByLm1ldGEuZ3JpZFNpemU7XG4gICAgY29uc3QgW294LCBveV0gPSByLm1ldGEub3JpZ2luO1xuICAgIGNvbnN0IHsgcm93cywgY29scyB9ID0gci5tZXRhO1xuICAgIGNvbnN0IGMwID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcigoYXJlYS54MCAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgYzEgPSBNYXRoLm1pbihjb2xzIC0gMSwgTWF0aC5mbG9vcigoYXJlYS54MSAtIG94KSAvIGN3KSk7XG4gICAgY29uc3QgcjAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLnkwIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCByMSA9IE1hdGgubWluKHJvd3MgLSAxLCBNYXRoLmZsb29yKChhcmVhLnkxIC0gb3kpIC8gY2gpKTtcbiAgICBjb25zdCBzcXVhcmVzID0gbmV3IE1hcDxudW1iZXIsIHsgbjogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0+KCk7XG4gICAgZm9yIChsZXQgcm93ID0gcjA7IHJvdyA8PSByMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IGMwOyBjb2wgPD0gYzE7IGNvbCsrKSB7XG4gICAgICAgIGNvbnN0IHYgPSByLnZhbHVlc1tyb3cgKiBjb2xzICsgY29sXTtcbiAgICAgICAgaWYgKCEodiA+IDApKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY3ggPSBveCArIChjb2wgKyAwLjUpICogY3c7XG4gICAgICAgIGNvbnN0IGN5ID0gb3kgKyAocm93ICsgMC41KSAqIGNoO1xuICAgICAgICBjb25zdCBrZXkgPSBNYXRoLmZsb29yKChjeSAtIG95KSAvIGJpbikgKiAxZTYgKyBNYXRoLmZsb29yKChjeCAtIG94KSAvIGJpbik7XG4gICAgICAgIGNvbnN0IHMgPSBzcXVhcmVzLmdldChrZXkpID8/IHsgbjogMCwgc3g6IDAsIHN5OiAwIH07XG4gICAgICAgIHMubiArPSB2O1xuICAgICAgICBzLnN4ICs9IHYgKiBjeDtcbiAgICAgICAgcy5zeSArPSB2ICogY3k7XG4gICAgICAgIHNxdWFyZXMuc2V0KGtleSwgcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgcyBvZiBzcXVhcmVzLnZhbHVlcygpKSB7XG4gICAgICB4LnB1c2gocy5zeCAvIHMubik7XG4gICAgICB5LnB1c2gocy5zeSAvIHMubik7XG4gICAgICB3LnB1c2goTWF0aC5yb3VuZChzLm4pKTtcbiAgICAgIGdlbmUucHVzaChzbG90c1tjXSk7XG4gICAgICBncm91cC5wdXNoKGMpO1xuICAgIH1cbiAgfSk7XG4gIGNvbnN0IG4gPSB3Lmxlbmd0aDtcbiAgcmV0dXJuIHtcbiAgICB0aWxlOiB7XG4gICAgICBjb3VudDogbixcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHRydWUsXG4gICAgICB4OiBGbG9hdDMyQXJyYXkuZnJvbSh4KSxcbiAgICAgIHk6IEZsb2F0MzJBcnJheS5mcm9tKHkpLFxuICAgICAgejogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICAgIHdlaWdodDogVWludDMyQXJyYXkuZnJvbSh3KSxcbiAgICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobikuZmlsbChOT19PQlNFUlZBVElPTiksXG4gICAgICBnZW5lOiBVaW50MTZBcnJheS5mcm9tKGdlbmUpLFxuICAgIH0sXG4gICAgZ3JvdXA6IEludDMyQXJyYXkuZnJvbShncm91cCksXG4gIH07XG59XG4iXX0=
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC10aWxlLW1lcmdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL3NwYXRpYWwtdGlsZS1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakUsT0FBTyxFQUNMLFdBQVcsRUFDWCxjQUFjLEdBSWYsTUFBTSx1Q0FBdUMsQ0FBQztBQUcvQyxrRUFBa0U7QUFDbEUsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBeUIsRUFDekIsTUFBeUQ7SUFFekQsSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxQixNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsSUFBSSxJQUFJLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2IsUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLElBQUksV0FBVyxD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QyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3BELElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUM3QjtRQUNELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWVyZ2luZyBhbmQgZmlsdGVyaW5nIG9mIHRoZSBzcGF0aWFsLXRpbGUgd2lyZSBmb3JtYXQgKG9ic2VydmF0aW9uIGlkcywgTk9fQ0FURUdPUlkpOiB0aGVcbiAqIHBpZWNlcyBvZiB0aGUgMkQgdmlldydzIHRpbGUgbG9vcCB0aGF0IGFyZSBwdXJlIOKAlCBjb25jYXRlbmF0aW5nIHRpbGVzLCBkcm9wcGluZyBoaWRkZW5cbiAqIGdyb3VwcyBhbmQgZ2VuZXMsIGFuZCB0aGUgZGVuc2l0eS1ncmlkIG1hcmtlcnMgb2YgYSB6b29tZWQtb3V0IGdlbmUgc2VsZWN0aW9uLlxuICpcbiAqIFRoZXNlIHdvcmsgb24gU0lWJ3Mgb3duIHRpbGUgY29udHJhY3QsIHNvIHRoZXkgc3RheSBpbiBTSVYgcmF0aGVyIHRoYW4gbW92aW5nIHRvIG5hcGFyaS1qcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBBTExfR0VORVMgfSBmcm9tICcuLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHtcbiAgTk9fQ0FURUdPUlksXG4gIE5PX09CU0VSVkFUSU9OLFxuICBTcGF0aWFsRGVuc2l0eVJhc3RlcixcbiAgU3BhdGlhbFBvbHlnb25UaWxlLFxuICBTcGF0aWFsVHJhbnNjcmlwdFRpbGUsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBEYXRhUmVjdCB9IGZyb20gJy4vbG9kJztcblxuLyoqIFJpbmdzIHdob3NlIG93bmluZyBjZWxsIGlzIGluIGEgc3dpdGNoZWQtb2ZmIGdyb3VwIHJlbW92ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyUmluZ3MoXG4gIHJpbmdzOiBTcGF0aWFsUG9seWdvblRpbGUsXG4gIGhpZGRlbjogeyBjb2RlczogVWludDE2QXJyYXk7IGhpZGRlbjogVWludDhBcnJheSB9IHwgbnVsbCxcbik6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGlmICghaGlkZGVuKSByZXR1cm4gcmluZ3M7XG4gIGNvbnN0IGtlZXA6IG51bWJlcltdID0gW107XG4gIGxldCB2ZXJ0aWNlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmluZ3MuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IGNvZGUgPSBoaWRkZW4uY29kZXNbcmluZ3Mub2JzZXJ2YXRpb25baV1dO1xuICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICBrZWVwLnB1c2goaSk7XG4gICAgdmVydGljZXMgKz0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gLSByaW5ncy5vZmZzZXRzW2ldO1xuICB9XG4gIGlmIChrZWVwLmxlbmd0aCA9PT0gcmluZ3MuY291bnQpIHJldHVybiByaW5ncztcbiAgY29uc3Qgb2JzZXJ2YXRpb24gPSBuZXcgVWludDMyQXJyYXkoa2VlcC5sZW5ndGgpO1xuICBjb25zdCBvZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KGtlZXAubGVuZ3RoICsgMSk7XG4gIGNvbnN0IGNvb3JkcyA9IG5ldyBGbG9hdDMyQXJyYXkodmVydGljZXMgKiAyKTtcbiAgbGV0IHYgPSAwO1xuICBrZWVwLmZvckVhY2goKGksIHIpID0+IHtcbiAgICBvYnNlcnZhdGlvbltyXSA9IHJpbmdzLm9ic2VydmF0aW9uW2ldO1xuICAgIG9mZnNldHNbcl0gPSB2O1xuICAgIGNvbnN0IGEgPSByaW5ncy5vZmZzZXRzW2ldICogMjtcbiAgICBjb25zdCBiID0gcmluZ3Mub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgIGNvb3Jkcy5zZXQocmluZ3MuY29vcmRzLnN1YmFycmF5KGEsIGIpLCB2ICogMik7XG4gICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgfSk7XG4gIG9mZnNldHNba2VlcC5sZW5ndGhdID0gdjtcbiAgcmV0dXJuIHsgY291bnQ6IGtlZXAubGVuZ3RoLCBvYnNlcnZhdGlvbiwgb2Zmc2V0cywgY29vcmRzIH07XG59XG5cbi8qKiBTbG90cyAoaW5kaWNlcyBpbnRvIHRoZSBzZWxlY3RlZCBnZW5lcykgc3dpdGNoZWQgb2ZmIHdpdGggdGhlaXIgZXllIHRvZ2dsZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW5HZW5lU2xvdHModmlldzogU3BhdGlhbFZpZXdTdGF0ZSk6IFVpbnQ4QXJyYXkgfCBudWxsIHtcbiAgaWYgKCF2aWV3LnRyYW5zY3JpcHRIaWRkZW5HZW5lcy5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBvZmYgPSBuZXcgU2V0KHZpZXcudHJhbnNjcmlwdEhpZGRlbkdlbmVzKTtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbSh2aWV3LnRyYW5zY3JpcHRHZW5lcywgKGcpID0+IChvZmYuaGFzKGcpID8gMSA6IDApKTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIFwiQWxsIGdlbmVzXCIgaXMgc3dpdGNoZWQgb2ZmIGFzIGEgd2hvbGUgd2l0aCB0aGUgZ2VuZSB0cmVlJ3Mgcm9vdCBleWU6IGl0cyBoaWRkZW5cbiAqIGxpc3QgaXMgYFtBTExfR0VORVNdYCAoZXZlcnkgZ2VuZSBoaWRkZW4sIG5vbmUgZXhjZXB0ZWQpLiBIaWRpbmcgZXZlcnkgZ2VuZSBieSBuYW1lIHdvdWxkXG4gKiBuZWVkIHRoZSBnZW5lIGxpc3QsIHdoaWNoIGEgZGF0YXNldCBuZWVkIG5vdCBoYXZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsR2VuZXNIaWRkZW4oXG4gIHZpZXc6IFBpY2s8U3BhdGlhbFZpZXdTdGF0ZSwgJ3RyYW5zY3JpcHRBbGxHZW5lcycgfCAndHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuJz4sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzICYmIGV2ZXJ5R2VuZU9mZih2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbik7XG59XG5cbi8qKiBXaGV0aGVyIGFuIFwiQWxsIGdlbmVzXCIgaGlkZGVuIGxpc3QgaGlkZXMgZXZlcnkgZ2VuZSwgbm9uZSBleGNlcHRlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVyeUdlbmVPZmYob2ZmOiByZWFkb25seSBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2ZmLmxlbmd0aCA9PT0gMSAmJiBvZmZbMF0gPT09IEFMTF9HRU5FUztcbn1cblxuLyoqIFdoZXRoZXIgYSBnZW5lIG9mIFwiQWxsIGdlbmVzXCIgaXMgZHJhd24sIGJ5IGl0cyBoaWRkZW4gbGlzdCAoc2VlIGB0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW5gKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbGxHZW5lU2hvd25CeShvZmY6IHJlYWRvbmx5IHN0cmluZ1tdKTogKGdlbmU6IHN0cmluZykgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IGxpc3RlZCA9IG5ldyBTZXQob2ZmKTtcbiAgY29uc3QgZXhjZXB0ID0gb2ZmWzBdID09PSBBTExfR0VORVM7XG4gIHJldHVybiAoZ2VuZSkgPT4gbGlzdGVkLmhhcyhnZW5lKSA9PT0gZXhjZXB0O1xufVxuXG4vKiogXCJBbGwgZ2VuZXNcIidzIGhpZGRlbiBsaXN0IHdpdGggYGdlbmVgIHNob3duIChgb25gKSBvciBoaWRkZW4sIGluIHRoZSBsaXN0J3Mgb3duIGZvcm0uICovXG5leHBvcnQgZnVuY3Rpb24gdG9nZ2xlQWxsR2VuZUhpZGRlbihvZmY6IHJlYWRvbmx5IHN0cmluZ1tdLCBnZW5lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogc3RyaW5nW10ge1xuICBjb25zdCBleGNlcHQgPSBvZmZbMF0gPT09IEFMTF9HRU5FUztcbiAgLy8gSGlkZGVuIGJ5IG5hbWU6IGxpc3RlZCBtZWFucyBvZmYuIExlZCBieSBBTExfR0VORVM6IGxpc3RlZCBtZWFucyBvbi5cbiAgY29uc3QgbGlzdGVkID0gbmV3IFNldChleGNlcHQgPyBvZmYuc2xpY2UoMSkgOiBvZmYpO1xuICBpZiAob24gPT09IGV4Y2VwdCkgbGlzdGVkLmFkZChnZW5lKTtcbiAgZWxzZSBsaXN0ZWQuZGVsZXRlKGdlbmUpO1xuICByZXR1cm4gZXhjZXB0ID8gW0FMTF9HRU5FUywgLi4ubGlzdGVkXSA6IFsuLi5saXN0ZWRdO1xufVxuXG4vKipcbiAqIENvZGVzIChpbmRpY2VzIGludG8gYGdlbmVzYCwgdGhlIGRhdGFzZXQncyBhbGwtZ2VuZSBjb2RlIG9yZGVyKSBzd2l0Y2hlZCBvZmYgd2l0aCB0aGVpciBleWVcbiAqIHRvZ2dsZSB3aGlsZSBldmVyeSBnZW5lIGlzIGRyYXduOyBudWxsIHdoZW4gbm9uZSBpcywgb3Igd2l0aG91dCB0aGUgZ2VuZSBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZGVuQWxsR2VuZUNvZGVzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0QWxsR2VuZXNIaWRkZW4nPixcbiAgZ2VuZXM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkLFxuKTogVWludDhBcnJheSB8IG51bGwge1xuICBpZiAoIWdlbmVzIHx8ICF2aWV3LnRyYW5zY3JpcHRBbGxHZW5lc0hpZGRlbi5sZW5ndGgpIHJldHVybiBudWxsO1xuICBjb25zdCBzaG93biA9IGFsbEdlbmVTaG93bkJ5KHZpZXcudHJhbnNjcmlwdEFsbEdlbmVzSGlkZGVuKTtcbiAgY29uc3QgY29kZXMgPSBVaW50OEFycmF5LmZyb20oZ2VuZXMsIChnKSA9PiAoc2hvd24oZykgPyAwIDogMSkpO1xuICByZXR1cm4gY29kZXMuaW5jbHVkZXMoMSkgPyBjb2RlcyA6IG51bGw7XG59XG5cbi8qKiBFbnRyaWVzIGluIGEgaGlkZGVuIGdyb3VwJ3MgY2VsbCwgb3Igb2YgYSBoaWRkZW4gZ2VuZSwgcmVtb3ZlZCAod2l0aCB0aGVpciBzaXplcykuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyVHJhbnNjcmlwdHMoXG4gIHQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSxcbiAgcHg6IEZsb2F0MzJBcnJheSxcbiAgaGlkZGVuOiB7IGNvZGVzOiBVaW50MTZBcnJheTsgaGlkZGVuOiBVaW50OEFycmF5IH0gfCBudWxsLFxuICBoaWRkZW5HZW5lczogVWludDhBcnJheSB8IG51bGwsXG4pOiB7IG1lcmdlZDogU3BhdGlhbFRyYW5zY3JpcHRUaWxlOyBweDogRmxvYXQzMkFycmF5IH0ge1xuICBpZiAoIWhpZGRlbiAmJiAhaGlkZGVuR2VuZXMpIHJldHVybiB7IG1lcmdlZDogdCwgcHggfTtcbiAgY29uc3Qga2VlcDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICBpZiAoaGlkZGVuR2VuZXMgJiYgaGlkZGVuR2VuZXNbdC5nZW5lW2ldXSkgY29udGludWU7XG4gICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgaWYgKGhpZGRlbiAmJiBvICE9PSBOT19PQlNFUlZBVElPTikge1xuICAgICAgY29uc3QgY29kZSA9IGhpZGRlbi5jb2Rlc1tvXTtcbiAgICAgIGlmIChjb2RlICE9PSBOT19DQVRFR09SWSAmJiBoaWRkZW4uaGlkZGVuW2NvZGVdKSBjb250aW51ZTtcbiAgICB9XG4gICAga2VlcC5wdXNoKGkpO1xuICB9XG4gIGNvbnN0IHBpY2sgPSA8VCBleHRlbmRzIEZsb2F0MzJBcnJheSB8IFVpbnQzMkFycmF5IHwgVWludDE2QXJyYXk+KGE6IFQpOiBUID0+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgKGEuY29uc3RydWN0b3IgYXMgbmV3IChuOiBudW1iZXIpID0+IFQpKGtlZXAubGVuZ3RoKTtcbiAgICBrZWVwLmZvckVhY2goKGksIGspID0+IHtcbiAgICAgIG91dFtrXSA9IGFbaV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtZXJnZWQ6IHtcbiAgICAgIGNvdW50OiBrZWVwLmxlbmd0aCxcbiAgICAgIGFnZ3JlZ2F0ZWQ6IHQuYWdncmVnYXRlZCxcbiAgICAgIHg6IHBpY2sodC54KSxcbiAgICAgIHk6IHBpY2sodC55KSxcbiAgICAgIHo6IHBpY2sodC56KSxcbiAgICAgIHdlaWdodDogcGljayh0LndlaWdodCksXG4gICAgICBvYnNlcnZhdGlvbjogcGljayh0Lm9ic2VydmF0aW9uKSxcbiAgICAgIGdlbmU6IHBpY2sodC5nZW5lKSxcbiAgICB9LFxuICAgIHB4OiBwaWNrKHB4KSxcbiAgfTtcbn1cblxuLyoqIFRoZSBtZWRpYW4gb2YgYHZgLCBmcm9tIGEgc2FtcGxlIG9mIGFib3V0IDEwMjQgdmFsdWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lZGlhbih2OiBGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBpZiAoIXYubGVuZ3RoKSByZXR1cm4gMDtcbiAgY29uc3Qgc3RlcCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3Iodi5sZW5ndGggLyAxMDI0KSk7XG4gIGNvbnN0IHNhbXBsZTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSArPSBzdGVwKSBzYW1wbGUucHVzaCh2W2ldKTtcbiAgc2FtcGxlLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgcmV0dXJuIHNhbXBsZVtzYW1wbGUubGVuZ3RoID4+IDFdO1xufVxuXG4vKiogQ29uY2F0ZW5hdGUgdGlsZXMnIHJpbmdzIGludG8gb25lIHNldCwgZHJvcHBpbmcgcmluZ3MgYWxyZWFkeSBzZWVuIChhIGNlbGwgc3RyYWRkbGluZ1xuICogIHR3byB0aWxlcyBtYXkgYmUgbGlzdGVkIGJ5IGJvdGgpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlUG9seWdvblRpbGVzKHRpbGVzOiBTcGF0aWFsUG9seWdvblRpbGVbXSk6IFNwYXRpYWxQb2x5Z29uVGlsZSB7XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgbGV0IHJpbmdzID0gMDtcbiAgbGV0IHZlcnRpY2VzID0gMDtcbiAgZm9yIChjb25zdCB0IG9mIHRpbGVzKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0LmNvdW50OyBpKyspIHtcbiAgICAgIGlmIChzZWVuLmhhcyh0Lm9ic2VydmF0aW9uW2ldKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZCh0Lm9ic2VydmF0aW9uW2ldKTtcbiAgICAgIHJpbmdzKys7XG4gICAgICB2ZXJ0aWNlcyArPSB0Lm9mZnNldHNbaSArIDFdIC0gdC5vZmZzZXRzW2ldO1xuICAgIH1cbiAgfVxuICBzZWVuLmNsZWFyKCk7XG4gIGNvbnN0IG9ic2VydmF0aW9uID0gbmV3IFVpbnQzMkFycmF5KHJpbmdzKTtcbiAgY29uc3Qgb2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShyaW5ncyArIDEpO1xuICBjb25zdCBjb29yZHMgPSBuZXcgRmxvYXQzMkFycmF5KHZlcnRpY2VzICogMik7XG4gIGxldCByID0gMDtcbiAgbGV0IHYgPSAwO1xuICBmb3IgKGNvbnN0IHQgb2YgdGlsZXMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQuY291bnQ7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHQub2JzZXJ2YXRpb25baV07XG4gICAgICBpZiAoc2Vlbi5oYXMobykpIGNvbnRpbnVlO1xuICAgICAgc2Vlbi5hZGQobyk7XG4gICAgICBvYnNlcnZhdGlvbltyXSA9IG87XG4gICAgICBvZmZzZXRzW3JdID0gdjtcbiAgICAgIGNvbnN0IGEgPSB0Lm9mZnNldHNbaV0gKiAyO1xuICAgICAgY29uc3QgYiA9IHQub2Zmc2V0c1tpICsgMV0gKiAyO1xuICAgICAgY29vcmRzLnNldCh0LmNvb3Jkcy5zdWJhcnJheShhLCBiKSwgdiAqIDIpO1xuICAgICAgdiArPSAoYiAtIGEpIC8gMjtcbiAgICAgIHIrKztcbiAgICB9XG4gIH1cbiAgb2Zmc2V0c1tyaW5nc10gPSB2O1xuICByZXR1cm4geyBjb3VudDogcmluZ3MsIG9ic2VydmF0aW9uLCBvZmZzZXRzLCBjb29yZHMgfTtcbn1cblxuLyoqIENvbmNhdGVuYXRlIHRyYW5zY3JpcHQgdGlsZXMsIHN0b3BwaW5nIGF0IGBsaW1pdGAgZW50cmllcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRyYW5zY3JpcHRUaWxlcyh0aWxlczogU3BhdGlhbFRyYW5zY3JpcHRUaWxlW10sIGxpbWl0ID0gSW5maW5pdHkpOiBTcGF0aWFsVHJhbnNjcmlwdFRpbGUge1xuICBsZXQgbiA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykgbiArPSB0LmNvdW50O1xuICBuID0gTWF0aC5taW4obiwgbGltaXQpO1xuICBjb25zdCBvdXQ6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZSA9IHtcbiAgICBjb3VudDogbixcbiAgICBhZ2dyZWdhdGVkOiB0aWxlcy5zb21lKCh0KSA9PiB0LmFnZ3JlZ2F0ZWQpLFxuICAgIHg6IG5ldyBGbG9hdDMyQXJyYXkobiksXG4gICAgeTogbmV3IEZsb2F0MzJBcnJheShuKSxcbiAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgIHdlaWdodDogbmV3IFVpbnQzMkFycmF5KG4pLFxuICAgIG9ic2VydmF0aW9uOiBuZXcgVWludDMyQXJyYXkobiksXG4gICAgZ2VuZTogbmV3IFVpbnQxNkFycmF5KG4pLFxuICB9O1xuICBsZXQgbyA9IDA7XG4gIGZvciAoY29uc3QgdCBvZiB0aWxlcykge1xuICAgIGNvbnN0IGsgPSBNYXRoLm1pbih0LmNvdW50LCBuIC0gbyk7XG4gICAgaWYgKGsgPD0gMCkgYnJlYWs7XG4gICAgZm9yIChjb25zdCBmIG9mIFsneCcsICd5JywgJ3onLCAnd2VpZ2h0JywgJ29ic2VydmF0aW9uJywgJ2dlbmUnXSBhcyBjb25zdCkge1xuICAgICAgKG91dFtmXSBhcyBGbG9hdDMyQXJyYXkpLnNldCgodFtmXSBhcyBGbG9hdDMyQXJyYXkpLnN1YmFycmF5KDAsIGspLCBvKTtcbiAgICB9XG4gICAgbyArPSBrO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogT25lIG1hcmtlciBwZXIgKGNsdXN0ZXIsIGBiaW5gIHNxdWFyZSkgZnJvbSBwZXItY2x1c3RlciBkZW5zaXR5IGdyaWRzOiB0aGUgY291bnRzIG9mIHRoZSBncmlkXG4gKiBjZWxscyBpbnNpZGUgYGFyZWFgIHN1bW1lZCBwZXIgc3F1YXJlLCBhdCB0aGVpciBjb3VudC13ZWlnaHRlZCBjZW50cmUuIGBzbG90c1tjXWAgaXMgdGhlIGdlbmVcbiAqIHNsb3Qgd2hvc2UgaWNvbiBjbHVzdGVyIGMncyBtYXJrZXJzIHRha2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbHVzdGVyTWFya2VycyhcbiAgcmFzdGVyczogU3BhdGlhbERlbnNpdHlSYXN0ZXJbXSxcbiAgc2xvdHM6IG51bWJlcltdLFxuICBiaW46IG51bWJlcixcbiAgYXJlYTogRGF0YVJlY3QsXG4pOiB7IHRpbGU6IFNwYXRpYWxUcmFuc2NyaXB0VGlsZTsgZ3JvdXA6IEludDMyQXJyYXkgfSB7XG4gIGNvbnN0IHg6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHk6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHc6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdlbmU6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGdyb3VwOiBudW1iZXJbXSA9IFtdO1xuICByYXN0ZXJzLmZvckVhY2goKHIsIGMpID0+IHtcbiAgICBjb25zdCBbY3csIGNoXSA9IHIubWV0YS5ncmlkU2l6ZTtcbiAgICBjb25zdCBbb3gsIG95XSA9IHIubWV0YS5vcmlnaW47XG4gICAgY29uc3QgeyByb3dzLCBjb2xzIH0gPSByLm1ldGE7XG4gICAgY29uc3QgYzAgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKChhcmVhLngwIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCBjMSA9IE1hdGgubWluKGNvbHMgLSAxLCBNYXRoLmZsb29yKChhcmVhLngxIC0gb3gpIC8gY3cpKTtcbiAgICBjb25zdCByMCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoKGFyZWEueTAgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHIxID0gTWF0aC5taW4ocm93cyAtIDEsIE1hdGguZmxvb3IoKGFyZWEueTEgLSBveSkgLyBjaCkpO1xuICAgIGNvbnN0IHNxdWFyZXMgPSBuZXcgTWFwPG51bWJlciwgeyBuOiBudW1iZXI7IHN4OiBudW1iZXI7IHN5OiBudW1iZXIgfT4oKTtcbiAgICBmb3IgKGxldCByb3cgPSByMDsgcm93IDw9IHIxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gYzA7IGNvbCA8PSBjMTsgY29sKyspIHtcbiAgICAgICAgY29uc3QgdiA9IHIudmFsdWVzW3JvdyAqIGNvbHMgKyBjb2xdO1xuICAgICAgICBpZiAoISh2ID4gMCkpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBjeCA9IG94ICsgKGNvbCArIDAuNSkgKiBjdztcbiAgICAgICAgY29uc3QgY3kgPSBveSArIChyb3cgKyAwLjUpICogY2g7XG4gICAgICAgIGNvbnN0IGtleSA9IE1hdGguZmxvb3IoKGN5IC0gb3kpIC8gYmluKSAqIDFlNiArIE1hdGguZmxvb3IoKGN4IC0gb3gpIC8gYmluKTtcbiAgICAgICAgY29uc3QgcyA9IHNxdWFyZXMuZ2V0KGtleSkgPz8geyBuOiAwLCBzeDogMCwgc3k6IDAgfTtcbiAgICAgICAgcy5uICs9IHY7XG4gICAgICAgIHMuc3ggKz0gdiAqIGN4O1xuICAgICAgICBzLnN5ICs9IHYgKiBjeTtcbiAgICAgICAgc3F1YXJlcy5zZXQoa2V5LCBzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBzIG9mIHNxdWFyZXMudmFsdWVzKCkpIHtcbiAgICAgIHgucHVzaChzLnN4IC8gcy5uKTtcbiAgICAgIHkucHVzaChzLnN5IC8gcy5uKTtcbiAgICAgIHcucHVzaChNYXRoLnJvdW5kKHMubikpO1xuICAgICAgZ2VuZS5wdXNoKHNsb3RzW2NdKTtcbiAgICAgIGdyb3VwLnB1c2goYyk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgbiA9IHcubGVuZ3RoO1xuICByZXR1cm4ge1xuICAgIHRpbGU6IHtcbiAgICAgIGNvdW50OiBuLFxuICAgICAgYWdncmVnYXRlZDogdHJ1ZSxcbiAgICAgIHg6IEZsb2F0MzJBcnJheS5mcm9tKHgpLFxuICAgICAgeTogRmxvYXQzMkFycmF5LmZyb20oeSksXG4gICAgICB6OiBuZXcgRmxvYXQzMkFycmF5KG4pLFxuICAgICAgd2VpZ2h0OiBVaW50MzJBcnJheS5mcm9tKHcpLFxuICAgICAgb2JzZXJ2YXRpb246IG5ldyBVaW50MzJBcnJheShuKS5maWxsKE5PX09CU0VSVkFUSU9OKSxcbiAgICAgIGdlbmU6IFVpbnQxNkFycmF5LmZyb20oZ2VuZSksXG4gICAgfSxcbiAgICBncm91cDogSW50MzJBcnJheS5mcm9tKGdyb3VwKSxcbiAgfTtcbn1cbiJdfQ==