@jax-data-science/sci-image-visualizer 0.14.0 → 0.16.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.
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +39 -3
- package/esm2022/lib/channel-histogram/channel-tree.mjs +65 -0
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +202 -33
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +5 -8
- package/esm2022/lib/spatial/lod.mjs +19 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +47 -10
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +49 -16
- package/esm2022/lib/store/visualizer-store.service.mjs +20 -3
- package/esm2022/lib/toolbar/toolbar.component.mjs +13 -4
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +7 -7
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs} +462 -83
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-CYsPzX3J.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs} +3 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D7lSUAM1.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DaZVXq1s.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/channel-histogram/channel-histogram.component.d.ts +14 -0
- package/lib/channel-histogram/channel-tree.d.ts +30 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +2 -0
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/implementations/napari-js/napari-scene.d.ts +2 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +80 -9
- package/lib/spatial/lod.d.ts +11 -1
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +18 -1
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +18 -0
- package/lib/store/visualizer-store.service.d.ts +7 -1
- package/lib/toolbar/toolbar.component.d.ts +6 -0
- package/lib/toolbar/view-controls/view-controls.component.d.ts +3 -3
- package/package.json +2 -2
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DvFp1jNH.mjs.map +0 -1
|
@@ -20,6 +20,24 @@ export function cellsShown(dataset, view) {
|
|
|
20
20
|
const available = !!(dataset?.polygonTiles || dataset?.polygons);
|
|
21
21
|
return available && (view.showCells ?? true);
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* The boundary sets drawn for the view's `cellSet`: that set when the dataset has it, else the
|
|
25
|
+
* dataset's default, else its first; for "both", that one with the other set beside it. Null when
|
|
26
|
+
* the dataset has no set. The renderer and the Cells panel's switches both read it, so a set kept
|
|
27
|
+
* from another dataset shows as what is actually drawn.
|
|
28
|
+
*/
|
|
29
|
+
export function drawnCellSets(tiled, cellSet) {
|
|
30
|
+
if (!tiled)
|
|
31
|
+
return null;
|
|
32
|
+
const both = cellSet === 'both';
|
|
33
|
+
const set = !both && cellSet && tiled.sets.some((s) => s.name === cellSet)
|
|
34
|
+
? cellSet
|
|
35
|
+
: (tiled.defaultSet ?? tiled.sets[0]?.name);
|
|
36
|
+
if (!set)
|
|
37
|
+
return null;
|
|
38
|
+
const nucleusSet = both ? tiled.sets.find((s) => s.name !== set)?.name : undefined;
|
|
39
|
+
return nucleusSet ? { set, nucleusSet } : { set };
|
|
40
|
+
}
|
|
23
41
|
/** A column holding a hand-curated cell-type annotation, by naming convention. */
|
|
24
42
|
export function isCuratedColumn(name) {
|
|
25
43
|
return /curated/i.test(name);
|
|
@@ -187,4 +205,4 @@ export function transcriptLevelFor(pxPerUnit, levels, targetTilePx = 512) {
|
|
|
187
205
|
}
|
|
188
206
|
return best;
|
|
189
207
|
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL2xvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVUxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBaUJuQyx5RkFBeUY7QUFFekYsNEZBQTRGO0FBQzVGLE1BQU0sVUFBVSxVQUFVLENBQ3hCLE9BQWlFLEVBQ2pFLElBQXlDO0lBRXpDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxZQUFZLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLE9BQXVCLEVBQ3ZCLElBQThDO0lBRTlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUE4QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQztJQUN4RyxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNuRixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO0FBQ2pGLENBQUM7QUFFRCx5RkFBeUY7QUFFekYsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxNQUFNLENBQUMsQ0FBVTtJQUMvQixPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsR0FBNEI7SUFDMUUsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFpQyxFQUNqQyxJQUFZLEVBQ1osT0FBZSxFQUNmLE9BQWUsRUFDZixHQUE0QixFQUM1QixNQUFNLEdBQUcsSUFBSTtJQUViLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakUsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxNQUFNLEVBQUUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsTUFBTSxFQUFFLEdBQUcsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQywyRkFBMkY7SUFDM0YsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzVHLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7QUFDcEcsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLElBQWMsRUFDZCxLQUFhLEVBQ2IsTUFBbUMsRUFDbkMsTUFBNkIsRUFDN0IsS0FBSyxHQUFHLFFBQVE7SUFFaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsQ0FBQztJQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDM0IsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDdEIsMEZBQTBGO0lBQzFGLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN0RixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQyxNQUFNLEdBQUcsR0FBYyxFQUFFLENBQUM7SUFDMUIsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO1FBQ25DLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFO1lBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBQ0QsR0FBRyxDQUFDLElBQUksQ0FDTixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDOUcsQ0FBQztJQUNGLE9BQU8sR0FBRyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDeEQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFpQyxFQUNqQyxJQUFjLEVBQ2QsS0FBYSxFQUNiLE1BQW1DLEVBQ25DLE1BQTZCLEVBQzdCLEtBQUssR0FBRyxRQUFRO0lBRWhCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sT0FBTyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDM0YsTUFBTSxDQUFDLEdBQXlCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNqSCxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQWMsRUFBRSxNQUE2QjtJQUN2RSxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELHlGQUF5RjtBQUV6Rjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsTUFBeUMsRUFBRSxRQUFRLEdBQUcsRUFBRTtJQUMxRixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVE7UUFBRSxPQUFPLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMxRSxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU07UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNyQywrRUFBK0U7SUFDL0UsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLE9BQU8sTUFBTSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUUvRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLFNBQWlCLEVBQUUsWUFBb0IsRUFBRSxVQUFrQixFQUFFLE1BQU0sR0FBRyxDQUFDO0lBQ3JHLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQ2pELE1BQU0sS0FBSyxHQUFHLHlCQUF5QixDQUFDO0lBQ3hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxzRUFBc0U7UUFDdEUsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlFLElBQUksTUFBTSxJQUFJLEdBQUc7WUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNaLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsU0FBaUIsRUFDakIsTUFBbUMsRUFDbkMsWUFBWSxHQUFHLEdBQUc7SUFFbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLE9BQU8sR0FBRyxRQUFRLENBQUM7SUFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDakYsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLENBQUM7WUFDbEIsT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNkLElBQUksR0FBRyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGV2ZWwtb2YtZGV0YWlsIHBsYW5uaW5nIGZvciB0aWxlZCBzcGF0aWFsIGdlb21ldHJ5IOKAlCBjZWxsIG91dGxpbmVzIGFuZCB0cmFuc2NyaXB0cy5cbiAqXG4gKiBUaGUgcmVuZGVyZXIga25vd3MgaXRzIGNhbWVyYSAoYSB3b3JsZC1zcGFjZSBjZW50cmUsIGEgem9vbSBpbiBjYW52YXMgcGl4ZWxzIHBlciB3b3JsZFxuICogdW5pdCwgYSBjYW52YXMgc2l6ZSk7IGEgdGlsZWQgZGF0YXNldCBrbm93cyBpdHMgZ3JpZHMgKG9uZSBwZXIgbGV2ZWwsIGluIG9ic2VydmF0aW9uXG4gKiB1bml0cykuIFRoaXMgbW9kdWxlIGlzIHRoZSBicmlkZ2U6IHdoaWNoIGxldmVsIHRoZSB6b29tIGNhbGxzIGZvciBhbmQgd2hpY2ggdGlsZXMgYXJlIG9uXG4gKiBzY3JlZW4uIEV2ZXJ5dGhpbmcgaGVyZSBpcyBwdXJlLCBzbyB0aGUgcG9saWN5IOKAlCB0aGUgcGFydCB0aGF0IGRlY2lkZXMgd2hldGhlciB0aGUgdmlld1xuICogaXMgZmFzdCBhbmQgbGVnaWJsZSDigJQgaXMgdGVzdGFibGUgd2l0aG91dCBhIEdQVS5cbiAqXG4gKiBPYnNlcnZhdGlvbiB1bml0cyBtYXAgb250byB3b3JsZCB1bml0cyB0aHJvdWdoIHRoZSBkYXRhc2V0J3MgYGltYWdlUmVmYCBhZmZpbmVcbiAqIChgd29ybGQgPSBkYXRhIMK3IHNjYWxlICsgdHJhbnNsYXRlYCksIHNvIFwicGl4ZWxzIHBlciBvYnNlcnZhdGlvbiB1bml0XCIgaXNcbiAqIGB6b29tIMK3IHNjYWxlYC4gRm9yIGEgWGVuaXVtIGJ1bmRsZSB0aGUgZGF0YSB1bml0IGlzIHRoZSBtaWNyb24gYW5kIHRoZSB3b3JsZCB1bml0IHRoZVxuICogbW9ycGhvbG9neSBwaXhlbC5cbiAqL1xuXG5pbXBvcnQgeyB3b3JsZFZpZXdwb3J0IH0gZnJvbSAnbmFwYXJpLWpzJztcblxuaW1wb3J0IHR5cGUge1xuICBDYXRlZ29yaWNhbENvbHVtbk1ldGEsXG4gIFNwYXRpYWxCb3VuZHMsXG4gIFNwYXRpYWxEYXRhc2V0LFxuICBTcGF0aWFsSW1hZ2VSZWYsXG4gIFNwYXRpYWxUaWxlTGV2ZWwsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcXVhbnRpbGUgfSBmcm9tICcuL3N0YXRzJztcblxuLyoqIEEgcmVjdGFuZ2xlIGluIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUmVjdCB7XG4gIHgwOiBudW1iZXI7XG4gIHkwOiBudW1iZXI7XG4gIHgxOiBudW1iZXI7XG4gIHkxOiBudW1iZXI7XG59XG5cbi8qKiBUaWxlIGFkZHJlc3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVLZXkge1xuICBsZXZlbDogbnVtYmVyO1xuICBneDogbnVtYmVyO1xuICBneTogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgV2hhdCB0aGUgdmlldyBkcmF3cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFdoZXRoZXIgY2VsbCBvdXRsaW5lcyBhcmUgZHJhd246IHRoZSB1c2VyJ3MgY2hvaWNlLCBlbHNlIG9uIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGFueS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc1Nob3duKFxuICBkYXRhc2V0OiBQaWNrPFNwYXRpYWxEYXRhc2V0LCAncG9seWdvblRpbGVzJyB8ICdwb2x5Z29ucyc+IHwgbnVsbCxcbiAgdmlldzogUGljazxTcGF0aWFsVmlld1N0YXRlLCAnc2hvd0NlbGxzJz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYXZhaWxhYmxlID0gISEoZGF0YXNldD8ucG9seWdvblRpbGVzIHx8IGRhdGFzZXQ/LnBvbHlnb25zKTtcbiAgcmV0dXJuIGF2YWlsYWJsZSAmJiAodmlldy5zaG93Q2VsbHMgPz8gdHJ1ZSk7XG59XG5cbi8qKiBBIGNvbHVtbiBob2xkaW5nIGEgaGFuZC1jdXJhdGVkIGNlbGwtdHlwZSBhbm5vdGF0aW9uLCBieSBuYW1pbmcgY29udmVudGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0N1cmF0ZWRDb2x1bW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvY3VyYXRlZC9pLnRlc3QobmFtZSk7XG59XG5cbi8qKlxuICogVGhlIGNhdGVnb3JpY2FsIGNvbHVtbiB0aGF0IG5hbWVzIGVhY2ggY2VsbCdzIHR5cGU6IHRoZSB2aWV3J3MgY2hvaWNlIHdoZW4gaXQgaXMgYVxuICogY29sdW1uIG9mIHRoaXMgZGF0YXNldCwgZWxzZSB0aGUgZmlyc3QgY2F0ZWdvcmljYWwgY29sdW1uIHRoYXQgaXMgbm90IGEgY3VyYXRlZFxuICogYW5ub3RhdGlvbiAoYSBwaXBlbGluZSdzIGNsdXN0ZXJpbmcgaXMgdGhlIGRlZmF1bHQ7IGN1cmF0aW9uIGlzIG9wdGVkIGludG8pLCBlbHNlXG4gKiBhbnkgY2F0ZWdvcmljYWwgY29sdW1uLiBBIGNvbHVtbiBvZiBvbmUgY2F0ZWdvcnksIHN1Y2ggYXMgdGhlIGByZWdpb25gIGEgU3BhdGlhbERhdGFcbiAqIHRhYmxlIGxpbmtzIGl0cyBjZWxscyB0byB0aGVpciBzaGFwZXMgd2l0aCwgbmFtZXMgbm8gdHlwZSBhbmQgaXMgb25seSB1c2VkIHdoZW4gY2hvc2VuO1xuICogYSBkYXRhc2V0IHdpdGggbm90aGluZyBlbHNlIGhhcyBubyBjZWxsIHR5cGVzIChudWxsKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNlbGxUeXBlQ29sdW1uRm9yKFxuICBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCxcbiAgdmlldzogUGljazxTcGF0aWFsVmlld1N0YXRlLCAnY2VsbFR5cGVDb2x1bW4nPixcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjYXRlZ29yaWNhbCA9IGRhdGFzZXQuY29sdW1ucy5maWx0ZXIoKGMpOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcpO1xuICBpZiAodmlldy5jZWxsVHlwZUNvbHVtbiAmJiBjYXRlZ29yaWNhbC5zb21lKChjKSA9PiBjLm5hbWUgPT09IHZpZXcuY2VsbFR5cGVDb2x1bW4pKSB7XG4gICAgcmV0dXJuIHZpZXcuY2VsbFR5cGVDb2x1bW47XG4gIH1cbiAgY29uc3QgdHlwZWQgPSBjYXRlZ29yaWNhbC5maWx0ZXIoKGMpID0+IGMuY2F0ZWdvcmllcy5sZW5ndGggPiAxKTtcbiAgcmV0dXJuICh0eXBlZC5maW5kKChjKSA9PiAhaXNDdXJhdGVkQ29sdW1uKGMubmFtZSkpID8/IHR5cGVkWzBdKT8ubmFtZSA/PyBudWxsO1xufVxuXG4vLyDilIDilIAgVGlsZXMgaW4gdmlldyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIEEgc3RhYmxlIHN0cmluZyBpZCBmb3IgYSB0aWxlIGtleSwgYGxldmVsL2d4L2d5YCDigJQgdXNhYmxlIGFzIGEgTWFwIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlSWQoazogVGlsZUtleSk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtrLmxldmVsfS8ke2suZ3h9LyR7ay5neX1gO1xufVxuXG4vKiogQ2FudmFzIHBpeGVscyBwZXIgb2JzZXJ2YXRpb24gdW5pdCBhbG9uZyB4LCBmb3IgYSBjYW1lcmEgem9vbSBhbmQgYSBkYXRh4oaSd29ybGQgYWZmaW5lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpeGVsc1BlckRhdGFVbml0KHpvb206IG51bWJlciwgcmVmPzogU3BhdGlhbEltYWdlUmVmIHwgbnVsbCk6IG51bWJlciB7XG4gIHJldHVybiB6b29tICogTWF0aC5hYnMocmVmPy5zY2FsZT8uWzBdID8/IDEpO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIG9ic2VydmF0aW9uIHNwYWNlIHRoZSBjYW1lcmEgc2hvd3MsIHBhZGRlZCBieSBgbWFyZ2luYCAoYSBmcmFjdGlvbiBvZiB0aGVcbiAqIHZpZXdwb3J0KSBzbyB0aWxlcyBqdXN0IG9mZiBzY3JlZW4gYXJlIGFscmVhZHkgdGhlcmUgd2hlbiBhIHBhbiBicmluZ3MgdGhlbSBpbjogbmFwYXJpLWpzJ3NcbiAqIGB3b3JsZFZpZXdwb3J0YCwgbWFwcGVkIGJhY2sgdGhyb3VnaCB0aGUgaW52ZXJzZSBvZiB0aGUgZGF0YeKGkndvcmxkIGFmZmluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVEYXRhUmVjdChcbiAgY2VudGVyOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuICB6b29tOiBudW1iZXIsXG4gIGNhbnZhc1c6IG51bWJlcixcbiAgY2FudmFzSDogbnVtYmVyLFxuICByZWY/OiBTcGF0aWFsSW1hZ2VSZWYgfCBudWxsLFxuICBtYXJnaW4gPSAwLjE1LFxuKTogRGF0YVJlY3QgfCBudWxsIHtcbiAgaWYgKCEoem9vbSA+IDApIHx8ICEoY2FudmFzVyA+IDApIHx8ICEoY2FudmFzSCA+IDApKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgc3ggPSByZWY/LnNjYWxlPy5bMF0gPz8gMTtcbiAgY29uc3Qgc3kgPSByZWY/LnNjYWxlPy5bMV0gPz8gMTtcbiAgY29uc3QgdHggPSByZWY/LnRyYW5zbGF0ZT8uWzBdID8/IDA7XG4gIGNvbnN0IHR5ID0gcmVmPy50cmFuc2xhdGU/LlsxXSA/PyAwO1xuICAvLyBUaGUgd29ybGQgcmVjdCBvZiBhIGNhbnZhcyBncm93biBieSB0aGUgbWFyZ2luIG9uIGVhY2ggc2lkZSAobmFwYXJpLWpzJ3Mgd29ybGRWaWV3cG9ydCkuXG4gIGNvbnN0IHYgPSB3b3JsZFZpZXdwb3J0KGNlbnRlclswXSwgY2VudGVyWzFdLCB6b29tLCBjYW52YXNXICogKDEgKyAyICogbWFyZ2luKSwgY2FudmFzSCAqICgxICsgMiAqIG1hcmdpbikpO1xuICBjb25zdCB3eDAgPSB2Lng7XG4gIGNvbnN0IHd4MSA9IHYueCArIHYud2lkdGg7XG4gIGNvbnN0IHd5MCA9IHYueTtcbiAgY29uc3Qgd3kxID0gdi55ICsgdi5oZWlnaHQ7XG4gIGNvbnN0IGF4ID0gKHd4MCAtIHR4KSAvIHN4O1xuICBjb25zdCBieCA9ICh3eDEgLSB0eCkgLyBzeDtcbiAgY29uc3QgYXkgPSAod3kwIC0gdHkpIC8gc3k7XG4gIGNvbnN0IGJ5ID0gKHd5MSAtIHR5KSAvIHN5O1xuICByZXR1cm4geyB4MDogTWF0aC5taW4oYXgsIGJ4KSwgeTA6IE1hdGgubWluKGF5LCBieSksIHgxOiBNYXRoLm1heChheCwgYngpLCB5MTogTWF0aC5tYXgoYXksIGJ5KSB9O1xufVxuXG4vKipcbiAqIFRpbGVzIG9mIG9uZSBsZXZlbCBpbnRlcnNlY3RpbmcgYHJlY3RgLCBjbGlwcGVkIHRvIHRoZSBkYXRhc2V0J3MgYGJvdW5kc2AgKHNvIHpvb21pbmdcbiAqIG91dCBvdmVyIGVtcHR5IGNhbnZhcyBkb2VzIG5vdCBhc2sgZm9yIHRpbGVzIHRoYXQgY2Fubm90IGV4aXN0KS4gT3JkZXJlZCBmcm9tIHRoZVxuICogcmVjdGFuZ2xlJ3MgY2VudHJlIG91dHdhcmQsIHNvIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiBmaWxscyBpbiBmaXJzdC5cbiAqXG4gKiBUaWxlIGBnYCBjb3ZlcnMgYFtnwrdzLCAoZysxKcK3cylgLiBUaGUgdmlldydzIGZhciBlZGdlIGlzIG9wZW4g4oCUIGEgdGlsZSBzdGFydGluZyBleGFjdGx5XG4gKiBhdCBgcmVjdC54MWAgc2hvd3Mgbm90aGluZyDigJQgYnV0IHRoZSBib3VuZHMnIGZhciBlZGdlIGlzIGNsb3NlZDogdGhlIGJvdW5kcyBhcmUgdGhlXG4gKiBleHRyZW1lIG9ic2VydmF0aW9ucycgY29vcmRpbmF0ZXMsIHNvIG9uZSBzaXRzIGV4YWN0bHkgb24gYGJvdW5kc1syXWAsIGluIHRoZSB0aWxlXG4gKiBzdGFydGluZyB0aGVyZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzSW5SZWN0KFxuICByZWN0OiBEYXRhUmVjdCxcbiAgbGV2ZWw6IG51bWJlcixcbiAgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sXG4gIGJvdW5kcz86IFNwYXRpYWxCb3VuZHMgfCBudWxsLFxuICBsaW1pdCA9IEluZmluaXR5LFxuKTogVGlsZUtleVtdIHtcbiAgY29uc3Qgc2l6ZSA9IGxldmVsc1tsZXZlbF0/LnRpbGVTaXplO1xuICBpZiAoIShzaXplID4gMCkpIHJldHVybiBbXTtcbiAgbGV0IHsgeDAsIHkwIH0gPSByZWN0O1xuICAvLyBMYXN0IHRpbGUgYWxvbmcgYW4gYXhpczogdGhlIG9uZSBiZWZvcmUgdGhlIG9wZW4gdmlldyBlZGdlLCBhdCBtb3N0IHRoZSBjbG9zZWQgYm91bmQncy5cbiAgbGV0IGd4MSA9IE1hdGguY2VpbChyZWN0LngxIC8gc2l6ZSkgLSAxO1xuICBsZXQgZ3kxID0gTWF0aC5jZWlsKHJlY3QueTEgLyBzaXplKSAtIDE7XG4gIGlmIChib3VuZHMpIHtcbiAgICB4MCA9IE1hdGgubWF4KHgwLCBib3VuZHNbMF0pO1xuICAgIHkwID0gTWF0aC5tYXgoeTAsIGJvdW5kc1sxXSk7XG4gICAgaWYgKE1hdGgubWluKHJlY3QueDEsIGJvdW5kc1syXSkgPCB4MCB8fCBNYXRoLm1pbihyZWN0LnkxLCBib3VuZHNbM10pIDwgeTApIHJldHVybiBbXTtcbiAgICBneDEgPSBNYXRoLm1pbihneDEsIE1hdGguZmxvb3IoYm91bmRzWzJdIC8gc2l6ZSkpO1xuICAgIGd5MSA9IE1hdGgubWluKGd5MSwgTWF0aC5mbG9vcihib3VuZHNbM10gLyBzaXplKSk7XG4gIH1cbiAgY29uc3QgZ3gwID0gTWF0aC5mbG9vcih4MCAvIHNpemUpO1xuICBjb25zdCBneTAgPSBNYXRoLmZsb29yKHkwIC8gc2l6ZSk7XG4gIGNvbnN0IGN4ID0gKHJlY3QueDAgKyByZWN0LngxKSAvIDIgLyBzaXplO1xuICBjb25zdCBjeSA9IChyZWN0LnkwICsgcmVjdC55MSkgLyAyIC8gc2l6ZTtcbiAgY29uc3Qgb3V0OiBUaWxlS2V5W10gPSBbXTtcbiAgZm9yIChsZXQgZ3kgPSBneTA7IGd5IDw9IGd5MTsgZ3krKykge1xuICAgIGZvciAobGV0IGd4ID0gZ3gwOyBneCA8PSBneDE7IGd4KyspIG91dC5wdXNoKHsgbGV2ZWwsIGd4LCBneSB9KTtcbiAgfVxuICBvdXQuc29ydChcbiAgICAoYSwgYikgPT4gKGEuZ3ggKyAwLjUgLSBjeCkgKiogMiArIChhLmd5ICsgMC41IC0gY3kpICoqIDIgLSAoKGIuZ3ggKyAwLjUgLSBjeCkgKiogMiArIChiLmd5ICsgMC41IC0gY3kpICoqIDIpLFxuICApO1xuICByZXR1cm4gb3V0Lmxlbmd0aCA+IGxpbWl0ID8gb3V0LnNsaWNlKDAsIGxpbWl0KSA6IG91dDtcbn1cblxuLyoqIHtAbGluayB0aWxlc0luUmVjdH0gZm9yIGEgZ3JpZCB3aG9zZSB0aWxlICgwLCAwKSBzdGFydHMgYXQgYG9yaWdpbmAuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZXNJblJlY3RGcm9tKFxuICBvcmlnaW46IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0sXG4gIHJlY3Q6IERhdGFSZWN0LFxuICBsZXZlbDogbnVtYmVyLFxuICBsZXZlbHM6IHJlYWRvbmx5IFNwYXRpYWxUaWxlTGV2ZWxbXSxcbiAgYm91bmRzPzogU3BhdGlhbEJvdW5kcyB8IG51bGwsXG4gIGxpbWl0ID0gSW5maW5pdHksXG4pOiBUaWxlS2V5W10ge1xuICBjb25zdCBbb3gsIG95XSA9IG9yaWdpbjtcbiAgY29uc3Qgc2hpZnRlZCA9IHsgeDA6IHJlY3QueDAgLSBveCwgeTA6IHJlY3QueTAgLSBveSwgeDE6IHJlY3QueDEgLSBveCwgeTE6IHJlY3QueTEgLSBveSB9O1xuICBjb25zdCBiOiBTcGF0aWFsQm91bmRzIHwgbnVsbCA9IGJvdW5kcyA/IFtib3VuZHNbMF0gLSBveCwgYm91bmRzWzFdIC0gb3ksIGJvdW5kc1syXSAtIG94LCBib3VuZHNbM10gLSBveV0gOiBudWxsO1xuICByZXR1cm4gdGlsZXNJblJlY3Qoc2hpZnRlZCwgbGV2ZWwsIGxldmVscywgYiwgbGltaXQpO1xufVxuXG4vKiogQXJlYSBvZiBgcmVjdGAgaW5zaWRlIGBib3VuZHNgICh0aGUgd2hvbGUgcmVjdCB3aGVuIHRoZXJlIGFyZSBub25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aXNpYmxlQXJlYShyZWN0OiBEYXRhUmVjdCwgYm91bmRzPzogU3BhdGlhbEJvdW5kcyB8IG51bGwpOiBudW1iZXIge1xuICBjb25zdCB4MCA9IGJvdW5kcyA/IE1hdGgubWF4KHJlY3QueDAsIGJvdW5kc1swXSkgOiByZWN0LngwO1xuICBjb25zdCB5MCA9IGJvdW5kcyA/IE1hdGgubWF4KHJlY3QueTAsIGJvdW5kc1sxXSkgOiByZWN0LnkwO1xuICBjb25zdCB4MSA9IGJvdW5kcyA/IE1hdGgubWluKHJlY3QueDEsIGJvdW5kc1syXSkgOiByZWN0LngxO1xuICBjb25zdCB5MSA9IGJvdW5kcyA/IE1hdGgubWluKHJlY3QueTEsIGJvdW5kc1szXSkgOiByZWN0LnkxO1xuICByZXR1cm4gTWF0aC5tYXgoMCwgeDEgLSB4MCkgKiBNYXRoLm1heCgwLCB5MSAtIHkwKTtcbn1cblxuLy8g4pSA4pSAIExldmVscyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBUeXBpY2FsIGNlbGwgZGlhbWV0ZXIsIGluIG9ic2VydmF0aW9uIHVuaXRzLCB1c2VkIHRvIGp1ZGdlIGhvdyBsYXJnZSBjZWxscyBhcHBlYXIuXG4gKiBEZXJpdmVkIGZyb20gdGhlIHBlci1vYnNlcnZhdGlvbiByYWRpdXMgd2hlbiB0aGVyZSBpcyBvbmU7IDEyIMK1bSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBpY2FsQ2VsbERpYW1ldGVyKHJhZGl1czogRmxvYXQzMkFycmF5IHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBmYWxsYmFjayA9IDEyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiByYWRpdXMgPT09ICdudW1iZXInKSByZXR1cm4gcmFkaXVzID4gMCA/IHJhZGl1cyAqIDIgOiBmYWxsYmFjaztcbiAgaWYgKCFyYWRpdXM/Lmxlbmd0aCkgcmV0dXJuIGZhbGxiYWNrO1xuICAvLyBUaGUgbWVkaWFuIG9mIGEgc2FtcGxlIGlzIHBsZW50eSDigJQgdGhpcyBzZXRzIGEgdGhyZXNob2xkLCBub3QgYSBtZWFzdXJlbWVudC5cbiAgY29uc3QgbWVkaWFuID0gcXVhbnRpbGUocmFkaXVzLCAwLjUsIHsgZmlsdGVyOiAncG9zaXRpdmUnLCBzYW1wbGVTaXplOiAyMDQ4IH0pO1xuICByZXR1cm4gbWVkaWFuID09PSBudWxsID8gZmFsbGJhY2sgOiBtZWRpYW4gKiAyO1xufVxuXG4vKipcbiAqIE9uLXNjcmVlbiBjZWxsIGRpYW1ldGVyIChweCkgYXQgb3IgYWJvdmUgd2hpY2ggZWFjaCBwb2x5Z29uIGxldmVsIGlzIHVzZWQuIEEgbGV2ZWxcbiAqIGhhbHZlcyB0aGUgdmVydGljZXMgb2YgdGhlIG9uZSBiZWxvdywgc28gZWFjaCBzaG91bGQgdGFrZSBvdmVyIHdoZW4gdGhlIGNlbGwgaXMgYWJvdXRcbiAqIGhhbGYgYXMgbGFyZ2Ugb24gc2NyZWVuLiBCZWxvdyB0aGUgbGFzdCBmaW5pdGUgdGhyZXNob2xkIG91dGxpbmVzIGFyZSBub3QgZHJhd24gYXRcbiAqIGFsbCDigJQgYSBjZWxsIGEgZmV3IHBpeGVscyB3aWRlIGlzIGEgZG90LCBhbmQgdGhlIG9ic2VydmF0aW9uIG1hcmtlcnMgYWxyZWFkeSBkcmF3IGl0XG4gKiBhcyBvbmUuXG4gKlxuICogWGVuaXVtJ3MgZm91cnRoIGxldmVsICgzIHZlcnRpY2VzIHBlciBjZWxsKSBpcyBkZWxpYmVyYXRlbHkgbmV2ZXIgdXNlZDogc2VlbiBvblxuICogc2NyZWVuIGl0IGlzIGEgZmllbGQgb2YgdHJpYW5nbGVzLCB3aGljaCByZWFkcyBhcyBhbiBhcnRlZmFjdCByYXRoZXIgdGhhbiBhcyBjZWxscy5cbiAqIFRoZSBkb3RzIGJlbG93IDggcHggc2F5IHRoZSBzYW1lIHRoaW5nIG1vcmUgaG9uZXN0bHkuXG4gKi9cbmV4cG9ydCBjb25zdCBQT0xZR09OX0xFVkVMX01JTl9DRUxMX1BYID0gWzM2LCAxOCwgOCwgSW5maW5pdHldO1xuXG4vKipcbiAqIFdoaWNoIHBvbHlnb24gbGV2ZWwgc3VpdHMgdGhpcyB6b29tLCBvciAtMSBmb3IgXCJ0b28gc21hbGwgdG8gb3V0bGluZVwiLlxuICogYGRldGFpbGAgPiAxIHByZWZlcnMgZmluZXIgbGV2ZWxzIChzaGFycGVyLCBzbG93ZXIpOyA8IDEgY29hcnNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25MZXZlbEZvcihweFBlclVuaXQ6IG51bWJlciwgY2VsbERpYW1ldGVyOiBudW1iZXIsIGxldmVsQ291bnQ6IG51bWJlciwgZGV0YWlsID0gMSk6IG51bWJlciB7XG4gIGNvbnN0IGNlbGxQeCA9IHB4UGVyVW5pdCAqIGNlbGxEaWFtZXRlciAqIGRldGFpbDtcbiAgY29uc3QgdGFibGUgPSBQT0xZR09OX0xFVkVMX01JTl9DRUxMX1BYO1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVsQ291bnQ7IGwrKykge1xuICAgIC8vIFBhc3QgdGhlIHRhYmxlLCBrZWVwIGhhbHZpbmc6IGVhY2ggbGV2ZWwgc3RpbGwgaGFsdmVzIHRoZSB2ZXJ0aWNlcy5cbiAgICBjb25zdCBtaW4gPSB0YWJsZVtsXSA/PyB0YWJsZVt0YWJsZS5sZW5ndGggLSAxXSAvIDIgKiogKGwgLSB0YWJsZS5sZW5ndGggKyAxKTtcbiAgICBpZiAoY2VsbFB4ID49IG1pbikgcmV0dXJuIGw7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIFdoaWNoIHRyYW5zY3JpcHQgbGV2ZWwgc3VpdHMgdGhpcyB6b29tOiB0aGUgb25lIHdob3NlIHRpbGVzIGNvbWUgb3V0IGNsb3Nlc3QgdG9cbiAqIGB0YXJnZXRUaWxlUHhgIG9uIHNjcmVlbi4gQ29hcnNlciBsZXZlbHMgYWdncmVnYXRlIG1vcmUsIHNvIHRoaXMga2VlcHMgdGhlIG51bWJlciBvZlxuICogbWFya2VycyBwZXIgc2NyZWVuIHJvdWdobHkgY29uc3RhbnQgaG93ZXZlciBmYXIgb3V0IHRoZSBjYW1lcmEgaXMg4oCUIHRoZSBwcm9wZXJ0eSB0aGF0XG4gKiBrZWVwcyB0aGUgdmlldyBmYXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNjcmlwdExldmVsRm9yKFxuICBweFBlclVuaXQ6IG51bWJlcixcbiAgbGV2ZWxzOiByZWFkb25seSBTcGF0aWFsVGlsZUxldmVsW10sXG4gIHRhcmdldFRpbGVQeCA9IDUxMixcbik6IG51bWJlciB7XG4gIGlmICghbGV2ZWxzLmxlbmd0aCB8fCAhKHB4UGVyVW5pdCA+IDApKSByZXR1cm4gMDtcbiAgbGV0IGJlc3QgPSAwO1xuICBsZXQgYmVzdEVyciA9IEluZmluaXR5O1xuICBmb3IgKGxldCBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwrKykge1xuICAgIGNvbnN0IGVyciA9IE1hdGguYWJzKE1hdGgubG9nMigobGV2ZWxzW2xdLnRpbGVTaXplICogcHhQZXJVbml0KSAvIHRhcmdldFRpbGVQeCkpO1xuICAgIGlmIChlcnIgPCBiZXN0RXJyKSB7XG4gICAgICBiZXN0RXJyID0gZXJyO1xuICAgICAgYmVzdCA9IGw7XG4gICAgfVxuICB9XG4gIHJldHVybiBiZXN0O1xufVxuIl19
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zcGF0aWFsL2xvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVcxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBaUJuQyx5RkFBeUY7QUFFekYsNEZBQTRGO0FBQzVGLE1BQU0sVUFBVSxVQUFVLENBQ3hCLE9BQWlFLEVBQ2pFLElBQXlDO0lBRXpDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxZQUFZLElBQUksT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUMzQixLQUE4RSxFQUM5RSxPQUFrQztJQUVsQyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hCLE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxNQUFNLENBQUM7SUFDaEMsTUFBTSxHQUFHLEdBQ1AsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQztRQUM1RCxDQUFDLENBQUMsT0FBTztRQUNULENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRCxJQUFJLENBQUMsR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxD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RixNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDNUcsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUMzQixNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzNCLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUNwRyxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDekIsSUFBYyxFQUNkLEtBQWEsRUFDYixNQUFtQyxFQUNuQyxNQUE2QixFQUM3QixLQUFLLEdBQUcsUUFBUTtJQUVoQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMzQixJQUFJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQztJQUN0QiwwRkFBMEY7SUFDMUYsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3RGLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNsQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDMUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzFDLE1BQU0sR0FBRyxHQUFjLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDbkMsS0FBSyxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUU7WUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFDRCxHQUFHLENBQUMsSUFBSSxDQUNOLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFD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Q1osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxTQUFpQixFQUNqQixNQUFtQyxFQUNuQyxZQUFZLEdBQUcsR0FBRztJQUVsQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksT0FBTyxHQUFHLFFBQVEsQ0FBQztJQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNqRixJQUFJLEdBQUcsR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsR0FBRyxDQUFDO1lBQ2QsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMZXZlbC1vZi1kZXRhaWwgcGxhbm5pbmcgZm9yIHRpbGVkIHNwYXRpYWwgZ2VvbWV0cnkg4oCUIGNlbGwgb3V0bGluZXMgYW5kIHRyYW5zY3JpcHRzLlxuICpcbiAqIFRoZSByZW5kZXJlciBrbm93cyBpdHMgY2FtZXJhIChhIHdvcmxkLXNwYWNlIGNlbnRyZSwgYSB6b29tIGluIGNhbnZhcyBwaXhlbHMgcGVyIHdvcmxkXG4gKiB1bml0LCBhIGNhbnZhcyBzaXplKTsgYSB0aWxlZCBkYXRhc2V0IGtub3dzIGl0cyBncmlkcyAob25lIHBlciBsZXZlbCwgaW4gb2JzZXJ2YXRpb25cbiAqIHVuaXRzKS4gVGhpcyBtb2R1bGUgaXMgdGhlIGJyaWRnZTogd2hpY2ggbGV2ZWwgdGhlIHpvb20gY2FsbHMgZm9yIGFuZCB3aGljaCB0aWxlcyBhcmUgb25cbiAqIHNjcmVlbi4gRXZlcnl0aGluZyBoZXJlIGlzIHB1cmUsIHNvIHRoZSBwb2xpY3kg4oCUIHRoZSBwYXJ0IHRoYXQgZGVjaWRlcyB3aGV0aGVyIHRoZSB2aWV3XG4gKiBpcyBmYXN0IGFuZCBsZWdpYmxlIOKAlCBpcyB0ZXN0YWJsZSB3aXRob3V0IGEgR1BVLlxuICpcbiAqIE9ic2VydmF0aW9uIHVuaXRzIG1hcCBvbnRvIHdvcmxkIHVuaXRzIHRocm91Z2ggdGhlIGRhdGFzZXQncyBgaW1hZ2VSZWZgIGFmZmluZVxuICogKGB3b3JsZCA9IGRhdGEgwrcgc2NhbGUgKyB0cmFuc2xhdGVgKSwgc28gXCJwaXhlbHMgcGVyIG9ic2VydmF0aW9uIHVuaXRcIiBpc1xuICogYHpvb20gwrcgc2NhbGVgLiBGb3IgYSBYZW5pdW0gYnVuZGxlIHRoZSBkYXRhIHVuaXQgaXMgdGhlIG1pY3JvbiBhbmQgdGhlIHdvcmxkIHVuaXQgdGhlXG4gKiBtb3JwaG9sb2d5IHBpeGVsLlxuICovXG5cbmltcG9ydCB7IHdvcmxkVmlld3BvcnQgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIENhdGVnb3JpY2FsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbEJvdW5kcyxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxJbWFnZVJlZixcbiAgU3BhdGlhbFBvbHlnb25UaWxlc01ldGEsXG4gIFNwYXRpYWxUaWxlTGV2ZWwsXG59IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsVmlld1N0YXRlIH0gZnJvbSAnLi4vY29udHJhY3RzL2Rpc3BsYXktdHlwZXMnO1xuaW1wb3J0IHsgcXVhbnRpbGUgfSBmcm9tICcuL3N0YXRzJztcblxuLyoqIEEgcmVjdGFuZ2xlIGluIG9ic2VydmF0aW9uIGNvb3JkaW5hdGVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhUmVjdCB7XG4gIHgwOiBudW1iZXI7XG4gIHkwOiBudW1iZXI7XG4gIHgxOiBudW1iZXI7XG4gIHkxOiBudW1iZXI7XG59XG5cbi8qKiBUaWxlIGFkZHJlc3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVLZXkge1xuICBsZXZlbDogbnVtYmVyO1xuICBneDogbnVtYmVyO1xuICBneTogbnVtYmVyO1xufVxuXG4vLyDilIDilIAgV2hhdCB0aGUgdmlldyBkcmF3cyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFdoZXRoZXIgY2VsbCBvdXRsaW5lcyBhcmUgZHJhd246IHRoZSB1c2VyJ3MgY2hvaWNlLCBlbHNlIG9uIHdoZW4gdGhlIGRhdGFzZXQgaGFzIGFueS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZWxsc1Nob3duKFxuICBkYXRhc2V0OiBQaWNrPFNwYXRpYWxEYXRhc2V0LCAncG9seWdvblRpbGVzJyB8ICdwb2x5Z29ucyc+IHwgbnVsbCxcbiAgdmlldzogUGljazxTcGF0aWFsVmlld1N0YXRlLCAnc2hvd0NlbGxzJz4sXG4pOiBib29sZWFuIHtcbiAgY29uc3QgYXZhaWxhYmxlID0gISEoZGF0YXNldD8ucG9seWdvblRpbGVzIHx8IGRhdGFzZXQ/LnBvbHlnb25zKTtcbiAgcmV0dXJuIGF2YWlsYWJsZSAmJiAodmlldy5zaG93Q2VsbHMgPz8gdHJ1ZSk7XG59XG5cbi8qKlxuICogVGhlIGJvdW5kYXJ5IHNldHMgZHJhd24gZm9yIHRoZSB2aWV3J3MgYGNlbGxTZXRgOiB0aGF0IHNldCB3aGVuIHRoZSBkYXRhc2V0IGhhcyBpdCwgZWxzZSB0aGVcbiAqIGRhdGFzZXQncyBkZWZhdWx0LCBlbHNlIGl0cyBmaXJzdDsgZm9yIFwiYm90aFwiLCB0aGF0IG9uZSB3aXRoIHRoZSBvdGhlciBzZXQgYmVzaWRlIGl0LiBOdWxsIHdoZW5cbiAqIHRoZSBkYXRhc2V0IGhhcyBubyBzZXQuIFRoZSByZW5kZXJlciBhbmQgdGhlIENlbGxzIHBhbmVsJ3Mgc3dpdGNoZXMgYm90aCByZWFkIGl0LCBzbyBhIHNldCBrZXB0XG4gKiBmcm9tIGFub3RoZXIgZGF0YXNldCBzaG93cyBhcyB3aGF0IGlzIGFjdHVhbGx5IGRyYXduLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJhd25DZWxsU2V0cyhcbiAgdGlsZWQ6IFBpY2s8U3BhdGlhbFBvbHlnb25UaWxlc01ldGEsICdzZXRzJyB8ICdkZWZhdWx0U2V0Jz4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjZWxsU2V0OiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogeyBzZXQ6IHN0cmluZzsgbnVjbGV1c1NldD86IHN0cmluZyB9IHwgbnVsbCB7XG4gIGlmICghdGlsZWQpIHJldHVybiBudWxsO1xuICBjb25zdCBib3RoID0gY2VsbFNldCA9PT0gJ2JvdGgnO1xuICBjb25zdCBzZXQgPVxuICAgICFib3RoICYmIGNlbGxTZXQgJiYgdGlsZWQuc2V0cy5zb21lKChzKSA9PiBzLm5hbWUgPT09IGNlbGxTZXQpXG4gICAgICA/IGNlbGxTZXRcbiAgICAgIDogKHRpbGVkLmRlZmF1bHRTZXQgPz8gdGlsZWQuc2V0c1swXT8ubmFtZSk7XG4gIGlmICghc2V0KSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbnVjbGV1c1NldCA9IGJvdGggPyB0aWxlZC5zZXRzLmZpbmQoKHMpID0+IHMubmFtZSAhPT0gc2V0KT8ubmFtZSA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIG51Y2xldXNTZXQgPyB7IHNldCwgbnVjbGV1c1NldCB9IDogeyBzZXQgfTtcbn1cblxuLyoqIEEgY29sdW1uIGhvbGRpbmcgYSBoYW5kLWN1cmF0ZWQgY2VsbC10eXBlIGFubm90YXRpb24sIGJ5IG5hbWluZyBjb252ZW50aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ3VyYXRlZENvbHVtbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9jdXJhdGVkL2kudGVzdChuYW1lKTtcbn1cblxuLyoqXG4gKiBUaGUgY2F0ZWdvcmljYWwgY29sdW1uIHRoYXQgbmFtZXMgZWFjaCBjZWxsJ3MgdHlwZTogdGhlIHZpZXcncyBjaG9pY2Ugd2hlbiBpdCBpcyBhXG4gKiBjb2x1bW4gb2YgdGhpcyBkYXRhc2V0LCBlbHNlIHRoZSBmaXJzdCBjYXRlZ29yaWNhbCBjb2x1bW4gdGhhdCBpcyBub3QgYSBjdXJhdGVkXG4gKiBhbm5vdGF0aW9uIChhIHBpcGVsaW5lJ3MgY2x1c3RlcmluZyBpcyB0aGUgZGVmYXVsdDsgY3VyYXRpb24gaXMgb3B0ZWQgaW50byksIGVsc2VcbiAqIGFueSBjYXRlZ29yaWNhbCBjb2x1bW4uIEEgY29sdW1uIG9mIG9uZSBjYXRlZ29yeSwgc3VjaCBhcyB0aGUgYHJlZ2lvbmAgYSBTcGF0aWFsRGF0YVxuICogdGFibGUgbGlua3MgaXRzIGNlbGxzIHRvIHRoZWlyIHNoYXBlcyB3aXRoLCBuYW1lcyBubyB0eXBlIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiBjaG9zZW47XG4gKiBhIGRhdGFzZXQgd2l0aCBub3RoaW5nIGVsc2UgaGFzIG5vIGNlbGwgdHlwZXMgKG51bGwpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2VsbFR5cGVDb2x1bW5Gb3IoXG4gIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0LFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICdjZWxsVHlwZUNvbHVtbic+LFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGNhdGVnb3JpY2FsID0gZGF0YXNldC5jb2x1bW5zLmZpbHRlcigoYyk6IGMgaXMgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhID0+IGMua2luZCA9PT0gJ2NhdGVnb3JpY2FsJyk7XG4gIGlmICh2aWV3LmNlbGxUeXBlQ29sdW1uICYmIGNhdGVnb3JpY2FsLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gdmlldy5jZWxsVHlwZUNvbHVtbikpIHtcbiAgICByZXR1cm4gdmlldy5jZWxsVHlwZUNvbHVtbjtcbiAgfVxuICBjb25zdCB0eXBlZCA9IGNhdGVnb3JpY2FsLmZpbHRlcigoYykgPT4gYy5jYXRlZ29yaWVzLmxlbmd0aCA+IDEpO1xuICByZXR1cm4gKHR5cGVkLmZpbmQoKGMpID0+ICFpc0N1cmF0ZWRDb2x1bW4oYy5uYW1lKSkgPz8gdHlwZWRbMF0pPy5uYW1lID8/IG51bGw7XG59XG5cbi8vIOKUgOKUgCBUaWxlcyBpbiB2aWV3IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogQSBzdGFibGUgc3RyaW5nIGlkIGZvciBhIHRpbGUga2V5LCBgbGV2ZWwvZ3gvZ3lgIOKAlCB1c2FibGUgYXMgYSBNYXAga2V5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVJZChrOiBUaWxlS2V5KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2subGV2ZWx9LyR7ay5neH0vJHtrLmd5fWA7XG59XG5cbi8qKiBDYW52YXMgcGl4ZWxzIHBlciBvYnNlcnZhdGlvbiB1bml0IGFsb25nIHgsIGZvciBhIGNhbWVyYSB6b29tIGFuZCBhIGRhdGHihpJ3b3JsZCBhZmZpbmUuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxzUGVyRGF0YVVuaXQoem9vbTogbnVtYmVyLCByZWY/OiBTcGF0aWFsSW1hZ2VSZWYgfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHpvb20gKiBNYXRoLmFicyhyZWY/LnNjYWxlPy5bMF0gPz8gMSk7XG59XG5cbi8qKlxuICogVGhlIHBhcnQgb2Ygb2JzZXJ2YXRpb24gc3BhY2UgdGhlIGNhbWVyYSBzaG93cywgcGFkZGVkIGJ5IGBtYXJnaW5gIChhIGZyYWN0aW9uIG9mIHRoZVxuICogdmlld3BvcnQpIHNvIHRpbGVzIGp1c3Qgb2ZmIHNjcmVlbiBhcmUgYWxyZWFkeSB0aGVyZSB3aGVuIGEgcGFuIGJyaW5ncyB0aGVtIGluOiBuYXBhcmktanMnc1xuICogYHdvcmxkVmlld3BvcnRgLCBtYXBwZWQgYmFjayB0aHJvdWdoIHRoZSBpbnZlcnNlIG9mIHRoZSBkYXRh4oaSd29ybGQgYWZmaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmlzaWJsZURhdGFSZWN0KFxuICBjZW50ZXI6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0sXG4gIHpvb206IG51bWJlcixcbiAgY2FudmFzVzogbnVtYmVyLFxuICBjYW52YXNIOiBudW1iZXIsXG4gIHJlZj86IFNwYXRpYWxJbWFnZVJlZiB8IG51bGwsXG4gIG1hcmdpbiA9IDAuMTUsXG4pOiBEYXRhUmVjdCB8IG51bGwge1xuICBpZiAoISh6b29tID4gMCkgfHwgIShjYW52YXNXID4gMCkgfHwgIShjYW52YXNIID4gMCkpIHJldHVybiBudWxsO1xuICBjb25zdCBzeCA9IHJlZj8uc2NhbGU/LlswXSA/PyAxO1xuICBjb25zdCBzeSA9IHJlZj8uc2NhbGU/LlsxXSA/PyAxO1xuICBjb25zdCB0eCA9IHJlZj8udHJhbnNsYXRlPy5bMF0gPz8gMDtcbiAgY29uc3QgdHkgPSByZWY/LnRyYW5zbGF0ZT8uWzFdID8/IDA7XG4gIC8vIFRoZSB3b3JsZCByZWN0IG9mIGEgY2FudmFzIGdyb3duIGJ5IHRoZSBtYXJnaW4gb24gZWFjaCBzaWRlIChuYXBhcmktanMncyB3b3JsZFZpZXdwb3J0KS5cbiAgY29uc3QgdiA9IHdvcmxkVmlld3BvcnQoY2VudGVyWzBdLCBjZW50ZXJbMV0sIHpvb20sIGNhbnZhc1cgKiAoMSArIDIgKiBtYXJnaW4pLCBjYW52YXNIICogKDEgKyAyICogbWFyZ2luKSk7XG4gIGNvbnN0IHd4MCA9IHYueDtcbiAgY29uc3Qgd3gxID0gdi54ICsgdi53aWR0aDtcbiAgY29uc3Qgd3kwID0gdi55O1xuICBjb25zdCB3eTEgPSB2LnkgKyB2LmhlaWdodDtcbiAgY29uc3QgYXggPSAod3gwIC0gdHgpIC8gc3g7XG4gIGNvbnN0IGJ4ID0gKHd4MSAtIHR4KSAvIHN4O1xuICBjb25zdCBheSA9ICh3eTAgLSB0eSkgLyBzeTtcbiAgY29uc3QgYnkgPSAod3kxIC0gdHkpIC8gc3k7XG4gIHJldHVybiB7IHgwOiBNYXRoLm1pbihheCwgYngpLCB5MDogTWF0aC5taW4oYXksIGJ5KSwgeDE6IE1hdGgubWF4KGF4LCBieCksIHkxOiBNYXRoLm1heChheSwgYnkpIH07XG59XG5cbi8qKlxuICogVGlsZXMgb2Ygb25lIGxldmVsIGludGVyc2VjdGluZyBgcmVjdGAsIGNsaXBwZWQgdG8gdGhlIGRhdGFzZXQncyBgYm91bmRzYCAoc28gem9vbWluZ1xuICogb3V0IG92ZXIgZW1wdHkgY2FudmFzIGRvZXMgbm90IGFzayBmb3IgdGlsZXMgdGhhdCBjYW5ub3QgZXhpc3QpLiBPcmRlcmVkIGZyb20gdGhlXG4gKiByZWN0YW5nbGUncyBjZW50cmUgb3V0d2FyZCwgc28gdGhlIG1pZGRsZSBvZiB0aGUgc2NyZWVuIGZpbGxzIGluIGZpcnN0LlxuICpcbiAqIFRpbGUgYGdgIGNvdmVycyBgW2fCt3MsIChnKzEpwrdzKWAuIFRoZSB2aWV3J3MgZmFyIGVkZ2UgaXMgb3BlbiDigJQgYSB0aWxlIHN0YXJ0aW5nIGV4YWN0bHlcbiAqIGF0IGByZWN0LngxYCBzaG93cyBub3RoaW5nIOKAlCBidXQgdGhlIGJvdW5kcycgZmFyIGVkZ2UgaXMgY2xvc2VkOiB0aGUgYm91bmRzIGFyZSB0aGVcbiAqIGV4dHJlbWUgb2JzZXJ2YXRpb25zJyBjb29yZGluYXRlcywgc28gb25lIHNpdHMgZXhhY3RseSBvbiBgYm91bmRzWzJdYCwgaW4gdGhlIHRpbGVcbiAqIHN0YXJ0aW5nIHRoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZXNJblJlY3QoXG4gIHJlY3Q6IERhdGFSZWN0LFxuICBsZXZlbDogbnVtYmVyLFxuICBsZXZlbHM6IHJlYWRvbmx5IFNwYXRpYWxUaWxlTGV2ZWxbXSxcbiAgYm91bmRzPzogU3BhdGlhbEJvdW5kcyB8IG51bGwsXG4gIGxpbWl0ID0gSW5maW5pdHksXG4pOiBUaWxlS2V5W10ge1xuICBjb25zdCBzaXplID0gbGV2ZWxzW2xldmVsXT8udGlsZVNpemU7XG4gIGlmICghKHNpemUgPiAwKSkgcmV0dXJuIFtdO1xuICBsZXQgeyB4MCwgeTAgfSA9IHJlY3Q7XG4gIC8vIExhc3QgdGlsZSBhbG9uZyBhbiBheGlzOiB0aGUgb25lIGJlZm9yZSB0aGUgb3BlbiB2aWV3IGVkZ2UsIGF0IG1vc3QgdGhlIGNsb3NlZCBib3VuZCdzLlxuICBsZXQgZ3gxID0gTWF0aC5jZWlsKHJlY3QueDEgLyBzaXplKSAtIDE7XG4gIGxldCBneTEgPSBNYXRoLmNlaWwocmVjdC55MSAvIHNpemUpIC0gMTtcbiAgaWYgKGJvdW5kcykge1xuICAgIHgwID0gTWF0aC5tYXgoeDAsIGJvdW5kc1swXSk7XG4gICAgeTAgPSBNYXRoLm1heCh5MCwgYm91bmRzWzFdKTtcbiAgICBpZiAoTWF0aC5taW4ocmVjdC54MSwgYm91bmRzWzJdKSA8IHgwIHx8IE1hdGgubWluKHJlY3QueTEsIGJvdW5kc1szXSkgPCB5MCkgcmV0dXJuIFtdO1xuICAgIGd4MSA9IE1hdGgubWluKGd4MSwgTWF0aC5mbG9vcihib3VuZHNbMl0gLyBzaXplKSk7XG4gICAgZ3kxID0gTWF0aC5taW4oZ3kxLCBNYXRoLmZsb29yKGJvdW5kc1szXSAvIHNpemUpKTtcbiAgfVxuICBjb25zdCBneDAgPSBNYXRoLmZsb29yKHgwIC8gc2l6ZSk7XG4gIGNvbnN0IGd5MCA9IE1hdGguZmxvb3IoeTAgLyBzaXplKTtcbiAgY29uc3QgY3ggPSAocmVjdC54MCArIHJlY3QueDEpIC8gMiAvIHNpemU7XG4gIGNvbnN0IGN5ID0gKHJlY3QueTAgKyByZWN0LnkxKSAvIDIgLyBzaXplO1xuICBjb25zdCBvdXQ6IFRpbGVLZXlbXSA9IFtdO1xuICBmb3IgKGxldCBneSA9IGd5MDsgZ3kgPD0gZ3kxOyBneSsrKSB7XG4gICAgZm9yIChsZXQgZ3ggPSBneDA7IGd4IDw9IGd4MTsgZ3grKykgb3V0LnB1c2goeyBsZXZlbCwgZ3gsIGd5IH0pO1xuICB9XG4gIG91dC5zb3J0KFxuICAgIChhLCBiKSA9PiAoYS5neCArIDAuNSAtIGN4KSAqKiAyICsgKGEuZ3kgKyAwLjUgLSBjeSkgKiogMiAtICgoYi5neCArIDAuNSAtIGN4KSAqKiAyICsgKGIuZ3kgKyAwLjUgLSBjeSkgKiogMiksXG4gICk7XG4gIHJldHVybiBvdXQubGVuZ3RoID4gbGltaXQgPyBvdXQuc2xpY2UoMCwgbGltaXQpIDogb3V0O1xufVxuXG4vKioge0BsaW5rIHRpbGVzSW5SZWN0fSBmb3IgYSBncmlkIHdob3NlIHRpbGUgKDAsIDApIHN0YXJ0cyBhdCBgb3JpZ2luYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlc0luUmVjdEZyb20oXG4gIG9yaWdpbjogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbiAgcmVjdDogRGF0YVJlY3QsXG4gIGxldmVsOiBudW1iZXIsXG4gIGxldmVsczogcmVhZG9ubHkgU3BhdGlhbFRpbGVMZXZlbFtdLFxuICBib3VuZHM/OiBTcGF0aWFsQm91bmRzIHwgbnVsbCxcbiAgbGltaXQgPSBJbmZpbml0eSxcbik6IFRpbGVLZXlbXSB7XG4gIGNvbnN0IFtveCwgb3ldID0gb3JpZ2luO1xuICBjb25zdCBzaGlmdGVkID0geyB4MDogcmVjdC54MCAtIG94LCB5MDogcmVjdC55MCAtIG95LCB4MTogcmVjdC54MSAtIG94LCB5MTogcmVjdC55MSAtIG95IH07XG4gIGNvbnN0IGI6IFNwYXRpYWxCb3VuZHMgfCBudWxsID0gYm91bmRzID8gW2JvdW5kc1swXSAtIG94LCBib3VuZHNbMV0gLSBveSwgYm91bmRzWzJdIC0gb3gsIGJvdW5kc1szXSAtIG95XSA6IG51bGw7XG4gIHJldHVybiB0aWxlc0luUmVjdChzaGlmdGVkLCBsZXZlbCwgbGV2ZWxzLCBiLCBsaW1pdCk7XG59XG5cbi8qKiBBcmVhIG9mIGByZWN0YCBpbnNpZGUgYGJvdW5kc2AgKHRoZSB3aG9sZSByZWN0IHdoZW4gdGhlcmUgYXJlIG5vbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVBcmVhKHJlY3Q6IERhdGFSZWN0LCBib3VuZHM/OiBTcGF0aWFsQm91bmRzIHwgbnVsbCk6IG51bWJlciB7XG4gIGNvbnN0IHgwID0gYm91bmRzID8gTWF0aC5tYXgocmVjdC54MCwgYm91bmRzWzBdKSA6IHJlY3QueDA7XG4gIGNvbnN0IHkwID0gYm91bmRzID8gTWF0aC5tYXgocmVjdC55MCwgYm91bmRzWzFdKSA6IHJlY3QueTA7XG4gIGNvbnN0IHgxID0gYm91bmRzID8gTWF0aC5taW4ocmVjdC54MSwgYm91bmRzWzJdKSA6IHJlY3QueDE7XG4gIGNvbnN0IHkxID0gYm91bmRzID8gTWF0aC5taW4ocmVjdC55MSwgYm91bmRzWzNdKSA6IHJlY3QueTE7XG4gIHJldHVybiBNYXRoLm1heCgwLCB4MSAtIHgwKSAqIE1hdGgubWF4KDAsIHkxIC0geTApO1xufVxuXG4vLyDilIDilIAgTGV2ZWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFR5cGljYWwgY2VsbCBkaWFtZXRlciwgaW4gb2JzZXJ2YXRpb24gdW5pdHMsIHVzZWQgdG8ganVkZ2UgaG93IGxhcmdlIGNlbGxzIGFwcGVhci5cbiAqIERlcml2ZWQgZnJvbSB0aGUgcGVyLW9ic2VydmF0aW9uIHJhZGl1cyB3aGVuIHRoZXJlIGlzIG9uZTsgMTIgwrVtIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGljYWxDZWxsRGlhbWV0ZXIocmFkaXVzOiBGbG9hdDMyQXJyYXkgfCBudW1iZXIgfCB1bmRlZmluZWQsIGZhbGxiYWNrID0gMTIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHJhZGl1cyA9PT0gJ251bWJlcicpIHJldHVybiByYWRpdXMgPiAwID8gcmFkaXVzICogMiA6IGZhbGxiYWNrO1xuICBpZiAoIXJhZGl1cz8ubGVuZ3RoKSByZXR1cm4gZmFsbGJhY2s7XG4gIC8vIFRoZSBtZWRpYW4gb2YgYSBzYW1wbGUgaXMgcGxlbnR5IOKAlCB0aGlzIHNldHMgYSB0aHJlc2hvbGQsIG5vdCBhIG1lYXN1cmVtZW50LlxuICBjb25zdCBtZWRpYW4gPSBxdWFudGlsZShyYWRpdXMsIDAuNSwgeyBmaWx0ZXI6ICdwb3NpdGl2ZScsIHNhbXBsZVNpemU6IDIwNDggfSk7XG4gIHJldHVybiBtZWRpYW4gPT09IG51bGwgPyBmYWxsYmFjayA6IG1lZGlhbiAqIDI7XG59XG5cbi8qKlxuICogT24tc2NyZWVuIGNlbGwgZGlhbWV0ZXIgKHB4KSBhdCBvciBhYm92ZSB3aGljaCBlYWNoIHBvbHlnb24gbGV2ZWwgaXMgdXNlZC4gQSBsZXZlbFxuICogaGFsdmVzIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgb25lIGJlbG93LCBzbyBlYWNoIHNob3VsZCB0YWtlIG92ZXIgd2hlbiB0aGUgY2VsbCBpcyBhYm91dFxuICogaGFsZiBhcyBsYXJnZSBvbiBzY3JlZW4uIEJlbG93IHRoZSBsYXN0IGZpbml0ZSB0aHJlc2hvbGQgb3V0bGluZXMgYXJlIG5vdCBkcmF3biBhdFxuICogYWxsIOKAlCBhIGNlbGwgYSBmZXcgcGl4ZWxzIHdpZGUgaXMgYSBkb3QsIGFuZCB0aGUgb2JzZXJ2YXRpb24gbWFya2VycyBhbHJlYWR5IGRyYXcgaXRcbiAqIGFzIG9uZS5cbiAqXG4gKiBYZW5pdW0ncyBmb3VydGggbGV2ZWwgKDMgdmVydGljZXMgcGVyIGNlbGwpIGlzIGRlbGliZXJhdGVseSBuZXZlciB1c2VkOiBzZWVuIG9uXG4gKiBzY3JlZW4gaXQgaXMgYSBmaWVsZCBvZiB0cmlhbmdsZXMsIHdoaWNoIHJlYWRzIGFzIGFuIGFydGVmYWN0IHJhdGhlciB0aGFuIGFzIGNlbGxzLlxuICogVGhlIGRvdHMgYmVsb3cgOCBweCBzYXkgdGhlIHNhbWUgdGhpbmcgbW9yZSBob25lc3RseS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBPTFlHT05fTEVWRUxfTUlOX0NFTExfUFggPSBbMzYsIDE4LCA4LCBJbmZpbml0eV07XG5cbi8qKlxuICogV2hpY2ggcG9seWdvbiBsZXZlbCBzdWl0cyB0aGlzIHpvb20sIG9yIC0xIGZvciBcInRvbyBzbWFsbCB0byBvdXRsaW5lXCIuXG4gKiBgZGV0YWlsYCA+IDEgcHJlZmVycyBmaW5lciBsZXZlbHMgKHNoYXJwZXIsIHNsb3dlcik7IDwgMSBjb2Fyc2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9seWdvbkxldmVsRm9yKHB4UGVyVW5pdDogbnVtYmVyLCBjZWxsRGlhbWV0ZXI6IG51bWJlciwgbGV2ZWxDb3VudDogbnVtYmVyLCBkZXRhaWwgPSAxKTogbnVtYmVyIHtcbiAgY29uc3QgY2VsbFB4ID0gcHhQZXJVbml0ICogY2VsbERpYW1ldGVyICogZGV0YWlsO1xuICBjb25zdCB0YWJsZSA9IFBPTFlHT05fTEVWRUxfTUlOX0NFTExfUFg7XG4gIGZvciAobGV0IGwgPSAwOyBsIDwgbGV2ZWxDb3VudDsgbCsrKSB7XG4gICAgLy8gUGFzdCB0aGUgdGFibGUsIGtlZXAgaGFsdmluZzogZWFjaCBsZXZlbCBzdGlsbCBoYWx2ZXMgdGhlIHZlcnRpY2VzLlxuICAgIGNvbnN0IG1pbiA9IHRhYmxlW2xdID8/IHRhYmxlW3RhYmxlLmxlbmd0aCAtIDFdIC8gMiAqKiAobCAtIHRhYmxlLmxlbmd0aCArIDEpO1xuICAgIGlmIChjZWxsUHggPj0gbWluKSByZXR1cm4gbDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKlxuICogV2hpY2ggdHJhbnNjcmlwdCBsZXZlbCBzdWl0cyB0aGlzIHpvb206IHRoZSBvbmUgd2hvc2UgdGlsZXMgY29tZSBvdXQgY2xvc2VzdCB0b1xuICogYHRhcmdldFRpbGVQeGAgb24gc2NyZWVuLiBDb2Fyc2VyIGxldmVscyBhZ2dyZWdhdGUgbW9yZSwgc28gdGhpcyBrZWVwcyB0aGUgbnVtYmVyIG9mXG4gKiBtYXJrZXJzIHBlciBzY3JlZW4gcm91Z2hseSBjb25zdGFudCBob3dldmVyIGZhciBvdXQgdGhlIGNhbWVyYSBpcyDigJQgdGhlIHByb3BlcnR5IHRoYXRcbiAqIGtlZXBzIHRoZSB2aWV3IGZhc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2NyaXB0TGV2ZWxGb3IoXG4gIHB4UGVyVW5pdDogbnVtYmVyLFxuICBsZXZlbHM6IHJlYWRvbmx5IFNwYXRpYWxUaWxlTGV2ZWxbXSxcbiAgdGFyZ2V0VGlsZVB4ID0gNTEyLFxuKTogbnVtYmVyIHtcbiAgaWYgKCFsZXZlbHMubGVuZ3RoIHx8ICEocHhQZXJVbml0ID4gMCkpIHJldHVybiAwO1xuICBsZXQgYmVzdCA9IDA7XG4gIGxldCBiZXN0RXJyID0gSW5maW5pdHk7XG4gIGZvciAobGV0IGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCsrKSB7XG4gICAgY29uc3QgZXJyID0gTWF0aC5hYnMoTWF0aC5sb2cyKChsZXZlbHNbbF0udGlsZVNpemUgKiBweFBlclVuaXQpIC8gdGFyZ2V0VGlsZVB4KSk7XG4gICAgaWYgKGVyciA8IGJlc3RFcnIpIHtcbiAgICAgIGJlc3RFcnIgPSBlcnI7XG4gICAgICBiZXN0ID0gbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJlc3Q7XG59XG4iXX0=
|
|
@@ -2,12 +2,13 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from
|
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { CheckboxModule } from 'primeng/checkbox';
|
|
5
|
+
import { InputSwitchModule } from 'primeng/inputswitch';
|
|
5
6
|
import { DropdownModule } from 'primeng/dropdown';
|
|
6
7
|
import { InputNumberModule } from 'primeng/inputnumber';
|
|
7
8
|
import { SelectButtonModule } from 'primeng/selectbutton';
|
|
8
9
|
import { SliderModule } from 'primeng/slider';
|
|
9
10
|
import { DEFAULT_SPATIAL_VIEW } from '../../contracts/display-types';
|
|
10
|
-
import { cellsShown } from '../../spatial/
|
|
11
|
+
import { cellsShown, drawnCellSets } from '../../spatial/lod';
|
|
11
12
|
import { densityColorBarCss, tileOptions } from '../../spatial/spatial-panel-model';
|
|
12
13
|
import { SpatialGroupsPanelComponent } from '../spatial-groups-panel/spatial-groups-panel.component';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
@@ -15,9 +16,10 @@ import * as i1 from "@angular/common";
|
|
|
15
16
|
import * as i2 from "@angular/forms";
|
|
16
17
|
import * as i3 from "primeng/checkbox";
|
|
17
18
|
import * as i4 from "primeng/dropdown";
|
|
18
|
-
import * as i5 from "primeng/
|
|
19
|
-
import * as i6 from "primeng/
|
|
20
|
-
import * as i7 from "primeng/
|
|
19
|
+
import * as i5 from "primeng/inputswitch";
|
|
20
|
+
import * as i6 from "primeng/inputnumber";
|
|
21
|
+
import * as i7 from "primeng/selectbutton";
|
|
22
|
+
import * as i8 from "primeng/slider";
|
|
21
23
|
/**
|
|
22
24
|
* The Cells section, as Xenium Explorer's: the outlines' on/off switch, which boundary set
|
|
23
25
|
* is drawn, how cells are coloured (with the gene, the colour, or the colour bar that
|
|
@@ -57,6 +59,12 @@ export class SpatialCellsPanelComponent {
|
|
|
57
59
|
* its buttons whenever the array identity changes — which made them impossible to click.
|
|
58
60
|
*/
|
|
59
61
|
this.cellSetOptions = [];
|
|
62
|
+
/**
|
|
63
|
+
* The boundary sets, the cells' first, each with a switch when there are at most two (as
|
|
64
|
+
* CytoCanvas's "Cell Boundaries" and "Nuclear Boundaries"): either, both or neither drawn.
|
|
65
|
+
* More sets keep the one-of choice.
|
|
66
|
+
*/
|
|
67
|
+
this.boundarySets = [];
|
|
60
68
|
/** Cell colour modes on offer (Xenium Explorer's "Cell Color"). */
|
|
61
69
|
this.cellColorOptions = [];
|
|
62
70
|
/** The density colour bar, rebuilt only when its colormap changes (a 256-entry LUT). */
|
|
@@ -67,6 +75,9 @@ export class SpatialCellsPanelComponent {
|
|
|
67
75
|
if (changes['dataset']) {
|
|
68
76
|
const options = tileOptions(this.dataset);
|
|
69
77
|
this.cellSetOptions = options.cellSetOptions;
|
|
78
|
+
this.boundarySets = [...(this.dataset?.polygonTiles?.sets ?? [])]
|
|
79
|
+
.sort((a, b) => (a.name === 'cell' ? -1 : b.name === 'cell' ? 1 : 0))
|
|
80
|
+
.map((set) => ({ name: set.name, label: set.label }));
|
|
70
81
|
this.cellColorOptions = options.cellColorOptions;
|
|
71
82
|
}
|
|
72
83
|
if (this.densityBarFor !== this.view.densityColormap || !this.densityColorBarCss) {
|
|
@@ -78,10 +89,11 @@ export class SpatialCellsPanelComponent {
|
|
|
78
89
|
get cellsOn() {
|
|
79
90
|
return cellsShown(this.dataset, this.view);
|
|
80
91
|
}
|
|
81
|
-
/** The boundary set drawn
|
|
92
|
+
/** The boundary set drawn, or "both", as the renderer resolves the view's choice: a set this
|
|
93
|
+
* dataset has, else its default, else its first. */
|
|
82
94
|
get activeCellSet() {
|
|
83
|
-
const
|
|
84
|
-
return
|
|
95
|
+
const drawn = drawnCellSets(this.dataset?.polygonTiles, this.view.cellSet);
|
|
96
|
+
return drawn?.nucleusSet ? 'both' : (drawn?.set ?? null);
|
|
85
97
|
}
|
|
86
98
|
/** Fill opacity as a 0–100 number, for the box beside the slider. */
|
|
87
99
|
get cellOpacityPercent() {
|
|
@@ -93,6 +105,30 @@ export class SpatialCellsPanelComponent {
|
|
|
93
105
|
onCellSet(set) {
|
|
94
106
|
this.controls?.setViewState({ cellSet: set });
|
|
95
107
|
}
|
|
108
|
+
/** Whether boundary set `name` is drawn: outlines on, and that set or both. */
|
|
109
|
+
boundaryOn(name) {
|
|
110
|
+
if (!this.cellsOn)
|
|
111
|
+
return false;
|
|
112
|
+
const drawn = drawnCellSets(this.dataset?.polygonTiles, this.view.cellSet);
|
|
113
|
+
return drawn?.set === name || drawn?.nucleusSet === name;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A set's switch: on draws it with the other when that one is drawn ("both"), else alone;
|
|
117
|
+
* off leaves the other drawn, or no outlines at all.
|
|
118
|
+
*/
|
|
119
|
+
onBoundary(name, on) {
|
|
120
|
+
const other = this.boundarySets.find((s) => s.name !== name)?.name;
|
|
121
|
+
const otherOn = !!other && this.boundaryOn(other);
|
|
122
|
+
if (on) {
|
|
123
|
+
this.controls?.setViewState({ showCells: true, cellSet: otherOn ? 'both' : name });
|
|
124
|
+
}
|
|
125
|
+
else if (otherOn) {
|
|
126
|
+
this.controls?.setViewState({ cellSet: other });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.controls?.setViewState({ showCells: false });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
96
132
|
onCellDraw(draw) {
|
|
97
133
|
this.controls?.setViewState({ cellDraw: draw });
|
|
98
134
|
}
|
|
@@ -118,7 +154,7 @@ export class SpatialCellsPanelComponent {
|
|
|
118
154
|
this.controls?.setViewState({ cellSingleColor: hex });
|
|
119
155
|
}
|
|
120
156
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
121
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", colorBarCss: "colorBarCss", open: "open" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"cellSetOptions.length > 1\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i6.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i7.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
157
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", colorBarCss: "colorBarCss", open: "open" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "component", type: i5.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i8.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
122
158
|
}
|
|
123
159
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, decorators: [{
|
|
124
160
|
type: Component,
|
|
@@ -127,11 +163,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
127
163
|
FormsModule,
|
|
128
164
|
CheckboxModule,
|
|
129
165
|
DropdownModule,
|
|
166
|
+
InputSwitchModule,
|
|
130
167
|
InputNumberModule,
|
|
131
168
|
SelectButtonModule,
|
|
132
169
|
SliderModule,
|
|
133
170
|
SpatialGroupsPanelComponent,
|
|
134
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"
|
|
171
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"] }]
|
|
135
172
|
}], propDecorators: { controls: [{
|
|
136
173
|
type: Input
|
|
137
174
|
}], dataset: [{
|
|
@@ -147,4 +184,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
147
184
|
}], openChange: [{
|
|
148
185
|
type: Output
|
|
149
186
|
}] } });
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVqRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7Ozs7Ozs7O0FBRXJHOzs7Ozs7R0FNRztB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TEFDWixXQUFXLDhWQUNYLGNBQWMsZ1pBQ2QsY0FBYyx1dENBQ2QsaUJBQWlCLHl2QkFDakIsa0JBQWtCLHdWQUNsQixZQUFZLGdTQUNaLDJCQUEyQjs7MkZBTWxCLDBCQUEwQjtrQkFqQnRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixZQUFZO3dCQUNaLDJCQUEyQjtxQkFDNUIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRWEsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENoZWNrYm94TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IFBhbmVsT3B0aW9uLCBkZW5zaXR5Q29sb3JCYXJDc3MsIHRpbGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsJztcbmltcG9ydCB0eXBlIHsgR2VuZVBpY2tlck1vZGVsIH0gZnJvbSAnLi4vc3BhdGlhbC1nZW5lLXBpY2tlcic7XG5pbXBvcnQgeyBTcGF0aWFsR3JvdXBzUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9zcGF0aWFsLWdyb3Vwcy1wYW5lbC9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFRoZSBDZWxscyBzZWN0aW9uLCBhcyBYZW5pdW0gRXhwbG9yZXInczogdGhlIG91dGxpbmVzJyBvbi9vZmYgc3dpdGNoLCB3aGljaCBib3VuZGFyeSBzZXRcbiAqIGlzIGRyYXduLCBob3cgY2VsbHMgYXJlIGNvbG91cmVkICh3aXRoIHRoZSBnZW5lLCB0aGUgY29sb3VyLCBvciB0aGUgY29sb3VyIGJhciB0aGF0XG4gKiBnb2VzIHdpdGggaXQpLCB0aGUge0BsaW5rIFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCBncm91cHN9LCBhbmQgaG93IGNlbGxzIGFyZSBkcmF3bi5cbiAqXG4gKiBXcml0ZXMgb25seSB0aHJvdWdoIGBjb250cm9scy5zZXRWaWV3U3RhdGVgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWNlbGxzLXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDaGVja2JveE1vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dE51bWJlck1vZHVsZSxcbiAgICBTZWxlY3RCdXR0b25Nb2R1bGUsXG4gICAgU2xpZGVyTW9kdWxlLFxuICAgIFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsQ2VsbHNQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgc3BhdGlhbCBjb250cm9scyB0aGlzIHBhbmVsIHJlYWRzIGFuZCB3cml0ZXMgdGhyb3VnaDsgbnVsbCB3aXRob3V0IGEgYFNQQVRJQUxfREFUQV9QT1JUYC4gKi9cbiAgQElucHV0KCkgY29udHJvbHM6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBkYXRhc2V0IG9uIG9mZmVyLCBvciBudWxsLiAqL1xuICBASW5wdXQoKSBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgc3BhdGlhbCB2aWV3IHN0YXRlOiB3aGF0IGlzIGRyYXduLCBhbmQgaG93LiAqL1xuICBASW5wdXQoKSB2aWV3OiBTcGF0aWFsVmlld1N0YXRlID0gREVGQVVMVF9TUEFUSUFMX1ZJRVc7XG4gIC8qKiBUaGUgZ2VuZSBsaXN0IHRoZSBcIkdlbmUgRXhwcmVzc2lvblwiIGNvbG91cmluZyBwaWNrcyBmcm9tLCBzaGFyZWQgd2l0aCB0aGUgb3RoZXJcbiAgICogIGdlbmUgZHJvcGRvd25zLiAqL1xuICBASW5wdXQoKSBnZW5lczogR2VuZVBpY2tlck1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgb2JzZXJ2YXRpb25zJyBjb250aW51b3VzIGNvbG91ciBiYXIsIHNob3duIGZvciB0aGUgZ2VuZSBjb2xvdXJpbmcgd2hpbGUgaXQgaGFzIG9uZS4gKi9cbiAgQElucHV0KCkgY29sb3JCYXJDc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciB0aGUgc2VjdGlvbiBpcyBleHBhbmRlZC4gKi9cbiAgQElucHV0KCkgb3BlbiA9IHRydWU7XG4gIC8qKiBBc2tzIHRvIG9wZW4gb3IgY2xvc2UgaXQ7IHR3by13YXkgd2l0aCBgb3BlbmAuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKiBWaXJ0dWFsLXNjcm9sbGVkIG9ubHkgcGFzdCB0aGlzIG1hbnkgb3B0aW9uczogdGhlIHNjcm9sbGVyIGVhcm5zIGl0cyBjb21wbGV4aXR5IGZvclxuICAgKiAgYSBmZXcgdGhvdXNhbmQgbmFtZXMsIGFuZCBmb3IgZWlnaHQgaXQgYWRkcyBvbmx5IG92ZXJoZWFkIOKAlCBhIHZpcnR1YWwgdmlld3BvcnQgdGhhdFxuICAgKiAgc2hvcnQgc3dhbGxvd3MgdGhlIGNsaWNrcyBpdCBpcyBtZWFudCB0byBmb3J3YXJkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZVZpcnR1YWxTY3JvbGxGcm9tID0gMjAwO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjZWxsRHJhd09wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxEcmF3J10+W10gPSBbXG4gICAgeyBsYWJlbDogJ0ZpbGwnLCB2YWx1ZTogJ2ZpbGwnIH0sXG4gICAgeyBsYWJlbDogJ091dGxpbmUnLCB2YWx1ZTogJ291dGxpbmUnIH0sXG4gICAgeyBsYWJlbDogJ0JvdGgnLCB2YWx1ZTogJ2JvdGgnIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBsaXN0cyBmb3IgdGhlIGNlbGwgY29udHJvbHMuIEJ1aWx0IG9uY2UgcGVyIGRhdGFzZXQgcmF0aGVyIHRoYW4gaW4gZ2V0dGVyczogYVxuICAgKiBnZXR0ZXIgcmV0dXJucyBhIGZyZXNoIGFycmF5IG9uIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gcGFzcywgYW5kIFByaW1lTkcgcmUtcmVuZGVyc1xuICAgKiBpdHMgYnV0dG9ucyB3aGVuZXZlciB0aGUgYXJyYXkgaWRlbnRpdHkgY2hhbmdlcyDigJQgd2hpY2ggbWFkZSB0aGVtIGltcG9zc2libGUgdG8gY2xpY2suXG4gICAqL1xuICBwcm90ZWN0ZWQgY2VsbFNldE9wdGlvbnM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXSA9IFtdO1xuICAvKiogQ2VsbCBjb2xvdXIgbW9kZXMgb24gb2ZmZXIgKFhlbml1bSBFeHBsb3JlcidzIFwiQ2VsbCBDb2xvclwiKS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxDb2xvck9wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxDb2xvck1vZGUnXT5bXSA9IFtdO1xuICAvKiogVGhlIGRlbnNpdHkgY29sb3VyIGJhciwgcmVidWlsdCBvbmx5IHdoZW4gaXRzIGNvbG9ybWFwIGNoYW5nZXMgKGEgMjU2LWVudHJ5IExVVCkuICovXG4gIHByb3RlY3RlZCBkZW5zaXR5Q29sb3JCYXJDc3MgPSAnJztcbiAgcHJpdmF0ZSBkZW5zaXR5QmFyRm9yOiBTcGF0aWFsVmlld1N0YXRlWydkZW5zaXR5Q29sb3JtYXAnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRpbGVPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICB0aGlzLmNlbGxTZXRPcHRpb25zID0gb3B0aW9ucy5jZWxsU2V0T3B0aW9ucztcbiAgICAgIHRoaXMuY2VsbENvbG9yT3B0aW9ucyA9IG9wdGlvbnMuY2VsbENvbG9yT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVuc2l0eUJhckZvciAhPT0gdGhpcy52aWV3LmRlbnNpdHlDb2xvcm1hcCB8fCAhdGhpcy5kZW5zaXR5Q29sb3JCYXJDc3MpIHtcbiAgICAgIHRoaXMuZGVuc2l0eUJhckZvciA9IHRoaXMudmlldy5kZW5zaXR5Q29sb3JtYXA7XG4gICAgICB0aGlzLmRlbnNpdHlDb2xvckJhckNzcyA9IGRlbnNpdHlDb2xvckJhckNzcyh0aGlzLnZpZXcuZGVuc2l0eUNvbG9ybWFwKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBvdXRsaW5lcyBhcmUgb24g4oCUIHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGF1dG9tYXRpY2FsbHkgZm9yIGRhdGEgdGhhdCBoYXMgdGhlbS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsc09uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjZWxsc1Nob3duKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KTtcbiAgfVxuXG4gIC8qKiBUaGUgYm91bmRhcnkgc2V0IGRyYXduOiB0aGUgdmlldydzIGNob2ljZSwgZWxzZSB0aGUgZGF0YXNldCdzIGRlZmF1bHQsIGVsc2UgaXRzIGZpcnN0LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNlbGxTZXQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcztcbiAgICByZXR1cm4gdGhpcy52aWV3LmNlbGxTZXQgPz8gdGlsZXM/LmRlZmF1bHRTZXQgPz8gdGlsZXM/LnNldHNbMF0/Lm5hbWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBGaWxsIG9wYWNpdHkgYXMgYSAw4oCTMTAwIG51bWJlciwgZm9yIHRoZSBib3ggYmVzaWRlIHRoZSBzbGlkZXIuICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbE9wYWNpdHlQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3LmNlbGxPcGFjaXR5ICogMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNob3dDZWxscyhvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2V0KHNldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogc2V0IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbERyYXcoZHJhdzogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxEcmF3OiBkcmF3IH0pO1xuICB9XG5cbiAgLy8gUHJpbWVORydzIHNsaWRlciByZXBvcnRzIGBudW1iZXIgfCB1bmRlZmluZWRgOyBpZ25vcmUgdGhlIGVtcHR5IGNhc2UgcmF0aGVyIHRoYW5cbiAgLy8gd3JpdGluZyBgdW5kZWZpbmVkYCBpbnRvIHRoZSBzdG9yZS5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHlQZXJjZW50KHY6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IE1hdGgubWluKDEsIE1hdGgubWF4KDAuMDUsIHYgLyAxMDApKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvck1vZGUobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbENvbG9yTW9kZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbENvbG9yTW9kZTogbW9kZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvckdlbmUoZ2VuZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxDb2xvckdlbmU6IGdlbmUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2luZ2xlQ29sb3IoaGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsU2luZ2xlQ29sb3I6IGhleCB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLXBhbmVsXCIgW2NsYXNzLm9wZW5dPVwib3BlblwiPlxuICA8ZGl2IGNsYXNzPVwic2MtcGFuZWwtaGVhZFwiIChjbGljayk9XCJvcGVuQ2hhbmdlLmVtaXQoIW9wZW4pXCI+XG4gICAgPHAtY2hlY2tib3hcbiAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJjZWxsc09uXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uU2hvd0NlbGxzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPjwvcC1jaGVja2JveD5cbiAgICA8c3BhbiBjbGFzcz1cInNjLXBhbmVsLXRpdGxlXCI+Q2VsbHM8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaVwiIFtjbGFzcy5waS1jaGV2cm9uLWRvd25dPVwib3BlblwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFvcGVuXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLXBhbmVsLWJvZHlcIiAqbmdJZj1cIm9wZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbFNldE9wdGlvbnMubGVuZ3RoID4gMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5Cb3VuZGFyaWVzPC9kaXY+XG4gICAgICA8cC1zZWxlY3RCdXR0b25cbiAgICAgICAgW29wdGlvbnNdPVwiY2VsbFNldE9wdGlvbnNcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cImFjdGl2ZUNlbGxTZXRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxTZXQoJGV2ZW50KVwiXG4gICAgICAgIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgICAgICAgc3R5bGVDbGFzcz1cInNjLWJ1dHRvbnNcIlxuICAgICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtc3ViaGVhZFwiPkNvbG9yaW5nPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5DZWxsIENvbG9yPC9zcGFuPlxuICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgW29wdGlvbnNdPVwiY2VsbENvbG9yT3B0aW9uc1wiXG4gICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgW25nTW9kZWxdPVwidmlldy5jZWxsQ29sb3JNb2RlXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsQ29sb3JNb2RlKCRldmVudClcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cbiAgICA8c21hbGwgY2xhc3M9XCJzYy1oaW50XCIgKm5nSWY9XCJ2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdncm91cCdcIj5cbiAgICAgIEFkanVzdCBjZWxsIGNvbG9yIGluIHRoZSBncm91cHMgc2VjdGlvbiBiZWxvdy5cbiAgICA8L3NtYWxsPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW5lcz8uc3RhdGUkIHwgYXN5bmMgYXMgZ2VuZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ2VuZScgJiYgZGF0YXNldD8uZmVhdHVyZXNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5HZW5lPC9zcGFuPlxuICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgIFtvcHRpb25zXT1cImdlbmUub3B0aW9uc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwidmlldy5jZWxsQ29sb3JHZW5lXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxDb2xvckdlbmUoJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgICAgICBmaWx0ZXJCeT1cImxhYmVsXCJcbiAgICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgKG9uRmlsdGVyKT1cImdlbmVzPy5vbkZpbHRlcigkZXZlbnQuZmlsdGVyKVwiXG4gICAgICAgICAgKG9uU2hvdyk9XCJnZW5lcz8uZW5zdXJlTGlzdCgpXCJcbiAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJnZW5lLm9wdGlvbnMubGVuZ3RoID4gZ2VuZVZpcnR1YWxTY3JvbGxGcm9tXCJcbiAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcbiAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGdlbmVz4oCmXCJcbiAgICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3NpbmdsZSdcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q29sb3I8L3NwYW4+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgY2xhc3M9XCJzYy1jb2xvci1pbnB1dFwiXG4gICAgICAgIFt2YWx1ZV09XCJ2aWV3LmNlbGxTaW5nbGVDb2xvclwiXG4gICAgICAgIChjaGFuZ2UpPVwib25DZWxsU2luZ2xlQ29sb3IoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ2VuZScgfHwgdmlldy5jZWxsQ29sb3JNb2RlID09PSAndHJhbnNjcmlwdERlbnNpdHknXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtY29sb3JiYXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvckJhckNzcyB8fCBkZW5zaXR5Q29sb3JCYXJDc3NcIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGF0aWFsLWdyb3Vwcy1wYW5lbCBbY29udHJvbHNdPVwiY29udHJvbHNcIiBbZGF0YXNldF09XCJkYXRhc2V0XCIgW3ZpZXddPVwidmlld1wiPjwvc3BhdGlhbC1ncm91cHMtcGFuZWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtc3ViaGVhZFwiPlZpc2liaWxpdHk8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPlZpZXcgY2VsbHMgYXM8L3NwYW4+XG4gICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICBbb3B0aW9uc109XCJjZWxsRHJhd09wdGlvbnNcIlxuICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbERyYXdcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsRHJhdygkZXZlbnQpXCJcbiAgICAgIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgICA+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlldy5jZWxsRHJhdyAhPT0gJ291dGxpbmUnXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkNlbGwgZmlsbCBvcGFjaXR5PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvdyBzYy1yb3ctbnVtYmVyXCI+XG4gICAgICAgIDxwLXNsaWRlclxuICAgICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbE9wYWNpdHlcIlxuICAgICAgICAgIFttaW5dPVwiMC4wNVwiXG4gICAgICAgICAgW21heF09XCIxXCJcbiAgICAgICAgICBbc3RlcF09XCIwLjA1XCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25DZWxsT3BhY2l0eSgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgPjwvcC1zbGlkZXI+XG4gICAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgICAgW25nTW9kZWxdPVwiY2VsbE9wYWNpdHlQZXJjZW50XCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxPcGFjaXR5UGVyY2VudCgkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cIjVcIlxuICAgICAgICAgIFttYXhdPVwiMTAwXCJcbiAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIGlucHV0U3R5bGVDbGFzcz1cInNjLW51bVwiXG4gICAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakcsT0FBTyxFQUFF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c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFYSxVQUFVO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcbmltcG9ydCB7IElucHV0U3dpdGNoTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHN3aXRjaCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duLCBkcmF3bkNlbGxTZXRzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgUGFuZWxPcHRpb24sIGRlbnNpdHlDb2xvckJhckNzcywgdGlsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGFuZWwtbW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBHZW5lUGlja2VyTW9kZWwgfSBmcm9tICcuLi9zcGF0aWFsLWdlbmUtcGlja2VyJztcbmltcG9ydCB7IFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVGhlIENlbGxzIHNlY3Rpb24sIGFzIFhlbml1bSBFeHBsb3JlcidzOiB0aGUgb3V0bGluZXMnIG9uL29mZiBzd2l0Y2gsIHdoaWNoIGJvdW5kYXJ5IHNldFxuICogaXMgZHJhd24sIGhvdyBjZWxscyBhcmUgY29sb3VyZWQgKHdpdGggdGhlIGdlbmUsIHRoZSBjb2xvdXIsIG9yIHRoZSBjb2xvdXIgYmFyIHRoYXRcbiAqIGdvZXMgd2l0aCBpdCksIHRoZSB7QGxpbmsgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50IGdyb3Vwc30sIGFuZCBob3cgY2VsbHMgYXJlIGRyYXduLlxuICpcbiAqIFdyaXRlcyBvbmx5IHRocm91Z2ggYGNvbnRyb2xzLnNldFZpZXdTdGF0ZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwtY2VsbHMtcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIElucHV0U3dpdGNoTW9kdWxlLFxuICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgIFNlbGVjdEJ1dHRvbk1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNwYXRpYWxDZWxsc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBnZW5lIGxpc3QgdGhlIFwiR2VuZSBFeHByZXNzaW9uXCIgY29sb3VyaW5nIHBpY2tzIGZyb20sIHNoYXJlZCB3aXRoIHRoZSBvdGhlclxuICAgKiAgZ2VuZSBkcm9wZG93bnMuICovXG4gIEBJbnB1dCgpIGdlbmVzOiBHZW5lUGlja2VyTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIGNvbnRpbnVvdXMgY29sb3VyIGJhciwgc2hvd24gZm9yIHRoZSBnZW5lIGNvbG91cmluZyB3aGlsZSBpdCBoYXMgb25lLiAqL1xuICBASW5wdXQoKSBjb2xvckJhckNzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZWN0aW9uIGlzIGV4cGFuZGVkLiAqL1xuICBASW5wdXQoKSBvcGVuID0gdHJ1ZTtcbiAgLyoqIEFza3MgdG8gb3BlbiBvciBjbG9zZSBpdDsgdHdvLXdheSB3aXRoIGBvcGVuYC4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIFZpcnR1YWwtc2Nyb2xsZWQgb25seSBwYXN0IHRoaXMgbWFueSBvcHRpb25zOiB0aGUgc2Nyb2xsZXIgZWFybnMgaXRzIGNvbXBsZXhpdHkgZm9yXG4gICAqICBhIGZldyB0aG91c2FuZCBuYW1lcywgYW5kIGZvciBlaWdodCBpdCBhZGRzIG9ubHkgb3ZlcmhlYWQg4oCUIGEgdmlydHVhbCB2aWV3cG9ydCB0aGF0XG4gICAqICBzaG9ydCBzd2FsbG93cyB0aGUgY2xpY2tzIGl0IGlzIG1lYW50IHRvIGZvcndhcmQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lVmlydHVhbFNjcm9sbEZyb20gPSAyMDA7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxEcmF3T3B0aW9uczogUGFuZWxPcHRpb248U3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXT5bXSA9IFtcbiAgICB7IGxhYmVsOiAnRmlsbCcsIHZhbHVlOiAnZmlsbCcgfSxcbiAgICB7IGxhYmVsOiAnT3V0bGluZScsIHZhbHVlOiAnb3V0bGluZScgfSxcbiAgICB7IGxhYmVsOiAnQm90aCcsIHZhbHVlOiAnYm90aCcgfSxcbiAgXTtcblxuICAvKipcbiAgICogT3B0aW9uIGxpc3RzIGZvciB0aGUgY2VsbCBjb250cm9scy4gQnVpbHQgb25jZSBwZXIgZGF0YXNldCByYXRoZXIgdGhhbiBpbiBnZXR0ZXJzOiBhXG4gICAqIGdldHRlciByZXR1cm5zIGEgZnJlc2ggYXJyYXkgb24gZXZlcnkgY2hhbmdlLWRldGVjdGlvbiBwYXNzLCBhbmQgUHJpbWVORyByZS1yZW5kZXJzXG4gICAqIGl0cyBidXR0b25zIHdoZW5ldmVyIHRoZSBhcnJheSBpZGVudGl0eSBjaGFuZ2VzIOKAlCB3aGljaCBtYWRlIHRoZW0gaW1wb3NzaWJsZSB0byBjbGljay5cbiAgICovXG4gIHByb3RlY3RlZCBjZWxsU2V0T3B0aW9uczogUGFuZWxPcHRpb248c3RyaW5nPltdID0gW107XG4gIC8qKlxuICAgKiBUaGUgYm91bmRhcnkgc2V0cywgdGhlIGNlbGxzJyBmaXJzdCwgZWFjaCB3aXRoIGEgc3dpdGNoIHdoZW4gdGhlcmUgYXJlIGF0IG1vc3QgdHdvIChhc1xuICAgKiBDeXRvQ2FudmFzJ3MgXCJDZWxsIEJvdW5kYXJpZXNcIiBhbmQgXCJOdWNsZWFyIEJvdW5kYXJpZXNcIik6IGVpdGhlciwgYm90aCBvciBuZWl0aGVyIGRyYXduLlxuICAgKiBNb3JlIHNldHMga2VlcCB0aGUgb25lLW9mIGNob2ljZS5cbiAgICovXG4gIHByb3RlY3RlZCBib3VuZGFyeVNldHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogQ2VsbCBjb2xvdXIgbW9kZXMgb24gb2ZmZXIgKFhlbml1bSBFeHBsb3JlcidzIFwiQ2VsbCBDb2xvclwiKS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxDb2xvck9wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxDb2xvck1vZGUnXT5bXSA9IFtdO1xuICAvKiogVGhlIGRlbnNpdHkgY29sb3VyIGJhciwgcmVidWlsdCBvbmx5IHdoZW4gaXRzIGNvbG9ybWFwIGNoYW5nZXMgKGEgMjU2LWVudHJ5IExVVCkuICovXG4gIHByb3RlY3RlZCBkZW5zaXR5Q29sb3JCYXJDc3MgPSAnJztcbiAgcHJpdmF0ZSBkZW5zaXR5QmFyRm9yOiBTcGF0aWFsVmlld1N0YXRlWydkZW5zaXR5Q29sb3JtYXAnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRpbGVPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICB0aGlzLmNlbGxTZXRPcHRpb25zID0gb3B0aW9ucy5jZWxsU2V0T3B0aW9ucztcbiAgICAgIHRoaXMuYm91bmRhcnlTZXRzID0gWy4uLih0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcz8uc2V0cyA/PyBbXSldXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lID09PSAnY2VsbCcgPyAtMSA6IGIubmFtZSA9PT0gJ2NlbGwnID8gMSA6IDApKVxuICAgICAgICAubWFwKChzZXQpID0+ICh7IG5hbWU6IHNldC5uYW1lLCBsYWJlbDogc2V0LmxhYmVsIH0pKTtcbiAgICAgIHRoaXMuY2VsbENvbG9yT3B0aW9ucyA9IG9wdGlvbnMuY2VsbENvbG9yT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVuc2l0eUJhckZvciAhPT0gdGhpcy52aWV3LmRlbnNpdHlDb2xvcm1hcCB8fCAhdGhpcy5kZW5zaXR5Q29sb3JCYXJDc3MpIHtcbiAgICAgIHRoaXMuZGVuc2l0eUJhckZvciA9IHRoaXMudmlldy5kZW5zaXR5Q29sb3JtYXA7XG4gICAgICB0aGlzLmRlbnNpdHlDb2xvckJhckNzcyA9IGRlbnNpdHlDb2xvckJhckNzcyh0aGlzLnZpZXcuZGVuc2l0eUNvbG9ybWFwKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBvdXRsaW5lcyBhcmUgb24g4oCUIHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGF1dG9tYXRpY2FsbHkgZm9yIGRhdGEgdGhhdCBoYXMgdGhlbS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsc09uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjZWxsc1Nob3duKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KTtcbiAgfVxuXG4gIC8qKiBUaGUgYm91bmRhcnkgc2V0IGRyYXduLCBvciBcImJvdGhcIiwgYXMgdGhlIHJlbmRlcmVyIHJlc29sdmVzIHRoZSB2aWV3J3MgY2hvaWNlOiBhIHNldCB0aGlzXG4gICAqICBkYXRhc2V0IGhhcywgZWxzZSBpdHMgZGVmYXVsdCwgZWxzZSBpdHMgZmlyc3QuICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2VsbFNldCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkcmF3biA9IGRyYXduQ2VsbFNldHModGhpcy5kYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHRoaXMudmlldy5jZWxsU2V0KTtcbiAgICByZXR1cm4gZHJhd24/Lm51Y2xldXNTZXQgPyAnYm90aCcgOiAoZHJhd24/LnNldCA/PyBudWxsKTtcbiAgfVxuXG4gIC8qKiBGaWxsIG9wYWNpdHkgYXMgYSAw4oCTMTAwIG51bWJlciwgZm9yIHRoZSBib3ggYmVzaWRlIHRoZSBzbGlkZXIuICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbE9wYWNpdHlQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3LmNlbGxPcGFjaXR5ICogMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNob3dDZWxscyhvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2V0KHNldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogc2V0IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYm91bmRhcnkgc2V0IGBuYW1lYCBpcyBkcmF3bjogb3V0bGluZXMgb24sIGFuZCB0aGF0IHNldCBvciBib3RoLiAqL1xuICBwcm90ZWN0ZWQgYm91bmRhcnlPbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2VsbHNPbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRyYXduID0gZHJhd25DZWxsU2V0cyh0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcywgdGhpcy52aWV3LmNlbGxTZXQpO1xuICAgIHJldHVybiBkcmF3bj8uc2V0ID09PSBuYW1lIHx8IGRyYXduPy5udWNsZXVzU2V0ID09PSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0J3Mgc3dpdGNoOiBvbiBkcmF3cyBpdCB3aXRoIHRoZSBvdGhlciB3aGVuIHRoYXQgb25lIGlzIGRyYXduIChcImJvdGhcIiksIGVsc2UgYWxvbmU7XG4gICAqIG9mZiBsZWF2ZXMgdGhlIG90aGVyIGRyYXduLCBvciBubyBvdXRsaW5lcyBhdCBhbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Cb3VuZGFyeShuYW1lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgb3RoZXIgPSB0aGlzLmJvdW5kYXJ5U2V0cy5maW5kKChzKSA9PiBzLm5hbWUgIT09IG5hbWUpPy5uYW1lO1xuICAgIGNvbnN0IG90aGVyT24gPSAhIW90aGVyICYmIHRoaXMuYm91bmRhcnlPbihvdGhlcik7XG4gICAgaWYgKG9uKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBzaG93Q2VsbHM6IHRydWUsIGNlbGxTZXQ6IG90aGVyT24gPyAnYm90aCcgOiBuYW1lIH0pO1xuICAgIH0gZWxzZSBpZiAob3RoZXJPbikge1xuICAgICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogb3RoZXIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbERyYXcoZHJhdzogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxEcmF3OiBkcmF3IH0pO1xuICB9XG5cbiAgLy8gUHJpbWVORydzIHNsaWRlciByZXBvcnRzIGBudW1iZXIgfCB1bmRlZmluZWRgOyBpZ25vcmUgdGhlIGVtcHR5IGNhc2UgcmF0aGVyIHRoYW5cbiAgLy8gd3JpdGluZyBgdW5kZWZpbmVkYCBpbnRvIHRoZSBzdG9yZS5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHlQZXJjZW50KHY6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IE1hdGgubWluKDEsIE1hdGgubWF4KDAuMDUsIHYgLyAxMDApKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvck1vZGUobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbENvbG9yTW9kZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbENvbG9yTW9kZTogbW9kZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvckdlbmUoZ2VuZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxDb2xvckdlbmU6IGdlbmUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2luZ2xlQ29sb3IoaGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsU2luZ2xlQ29sb3I6IGhleCB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLXBhbmVsXCIgW2NsYXNzLm9wZW5dPVwib3BlblwiPlxuICA8ZGl2IGNsYXNzPVwic2MtcGFuZWwtaGVhZFwiIChjbGljayk9XCJvcGVuQ2hhbmdlLmVtaXQoIW9wZW4pXCI+XG4gICAgPHAtY2hlY2tib3hcbiAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJjZWxsc09uXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uU2hvd0NlbGxzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPjwvcC1jaGVja2JveD5cbiAgICA8c3BhbiBjbGFzcz1cInNjLXBhbmVsLXRpdGxlXCI+Q2VsbHM8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaVwiIFtjbGFzcy5waS1jaGV2cm9uLWRvd25dPVwib3BlblwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFvcGVuXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLXBhbmVsLWJvZHlcIiAqbmdJZj1cIm9wZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCAmJiBib3VuZGFyeVNldHMubGVuZ3RoIDw9IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0Zvcj1cImxldCBzZXQgb2YgYm91bmRhcnlTZXRzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+e3sgc2V0LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8cC1pbnB1dFN3aXRjaFxuICAgICAgICAgIFtuZ01vZGVsXT1cImJvdW5kYXJ5T24oc2V0Lm5hbWUpXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Cb3VuZGFyeShzZXQubmFtZSwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNldC5sYWJlbFwiXG4gICAgICAgID48L3AtaW5wdXRTd2l0Y2g+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCA+IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxTZXRPcHRpb25zXCJcbiAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVDZWxsU2V0XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsU2V0KCRldmVudClcIlxuICAgICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgICAgID48L3Atc2VsZWN0QnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5Db2xvcmluZzwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q2VsbCBDb2xvcjwvc3Bhbj5cbiAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxDb2xvck9wdGlvbnNcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yTW9kZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbENvbG9yTW9kZSgkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgID48L3AtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gICAgPHNtYWxsIGNsYXNzPVwic2MtaGludFwiICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ3JvdXAnXCI+XG4gICAgICBBZGp1c3QgY2VsbCBjb2xvciBpbiB0aGUgZ3JvdXBzIHNlY3Rpb24gYmVsb3cuXG4gICAgPC9zbWFsbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2VuZXM/LnN0YXRlJCB8IGFzeW5jIGFzIGdlbmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnICYmIGRhdGFzZXQ/LmZlYXR1cmVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+R2VuZTwvc3Bhbj5cbiAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBbb3B0aW9uc109XCJnZW5lLm9wdGlvbnNcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yR2VuZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsQ29sb3JHZW5lKCRldmVudClcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgZmlsdGVyQnk9XCJsYWJlbFwiXG4gICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgIChvbkZpbHRlcik9XCJnZW5lcz8ub25GaWx0ZXIoJGV2ZW50LmZpbHRlcilcIlxuICAgICAgICAgIChvblNob3cpPVwiZ2VuZXM/LmVuc3VyZUxpc3QoKVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2VuZS5vcHRpb25zLmxlbmd0aCA+IGdlbmVWaXJ0dWFsU2Nyb2xsRnJvbVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzMFwiXG4gICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBnZW5lc+KAplwiXG4gICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtcm93XCIgKm5nSWY9XCJ2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdzaW5nbGUnXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkNvbG9yPC9zcGFuPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgIGNsYXNzPVwic2MtY29sb3ItaW5wdXRcIlxuICAgICAgICBbdmFsdWVdPVwidmlldy5jZWxsU2luZ2xlQ29sb3JcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uQ2VsbFNpbmdsZUNvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnIHx8IHZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3RyYW5zY3JpcHREZW5zaXR5J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLWNvbG9yYmFyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JCYXJDc3MgfHwgZGVuc2l0eUNvbG9yQmFyQ3NzXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8c3BhdGlhbC1ncm91cHMtcGFuZWwgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCIgW2RhdGFzZXRdPVwiZGF0YXNldFwiIFt2aWV3XT1cInZpZXdcIj48L3NwYXRpYWwtZ3JvdXBzLXBhbmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5WaXNpYmlsaXR5PC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5WaWV3IGNlbGxzIGFzPC9zcGFuPlxuICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgW29wdGlvbnNdPVwiY2VsbERyYXdPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxEcmF3XCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbERyYXcoJGV2ZW50KVwiXG4gICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICBzdHlsZUNsYXNzPVwic2MtYnV0dG9uc1wiXG4gICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXcuY2VsbERyYXcgIT09ICdvdXRsaW5lJ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5DZWxsIGZpbGwgb3BhY2l0eTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3cgc2Mtcm93LW51bWJlclwiPlxuICAgICAgICA8cC1zbGlkZXJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxPcGFjaXR5XCJcbiAgICAgICAgICBbbWluXT1cIjAuMDVcIlxuICAgICAgICAgIFttYXhdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBdPVwiMC4wNVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2VsbE9wYWNpdHkoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgID48L3Atc2xpZGVyPlxuICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgIFtuZ01vZGVsXT1cImNlbGxPcGFjaXR5UGVyY2VudFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsT3BhY2l0eVBlcmNlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW21pbl09XCI1XCJcbiAgICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJzYy1udW1cIlxuICAgICAgICA+PC9wLWlucHV0TnVtYmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|