@jax-data-science/sci-image-visualizer 0.11.0 → 0.12.1
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/index.mjs +4 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +18 -6
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +70 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +29 -14
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +11 -1
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +9 -4
- package/esm2022/lib/region-editor/region-editor.component.mjs +46 -41
- package/esm2022/lib/region-import/label-volume.mjs +35 -4
- package/esm2022/lib/region-import/ome-zarr-labels.mjs +253 -0
- package/esm2022/lib/region-import/open-annotations.mjs +289 -0
- package/esm2022/lib/region-import/zarr-codecs.mjs +167 -0
- package/esm2022/lib/region-import/zip.mjs +157 -0
- package/esm2022/lib/routing-visualizer.service.mjs +20 -7
- package/esm2022/lib/visualizer/region-load.mjs +16 -1
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs} +1103 -71
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DnPlIP2F.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs} +4 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Bs987_-E.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +3 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/index.d.ts +6 -0
- package/lib/contracts/image.contract.d.ts +7 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +13 -1
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +40 -1
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +11 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +5 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +6 -1
- package/lib/region-editor/region-editor.component.d.ts +5 -4
- package/lib/region-import/label-volume.d.ts +4 -0
- package/lib/region-import/ome-zarr-labels.d.ts +36 -0
- package/lib/region-import/open-annotations.d.ts +73 -0
- package/lib/region-import/zarr-codecs.d.ts +14 -0
- package/lib/region-import/zip.d.ts +31 -0
- package/lib/routing-visualizer.service.d.ts +9 -1
- package/package.json +2 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +0 -1
|
@@ -109,7 +109,31 @@ async function readNrrd(bytes, gunzip) {
|
|
|
109
109
|
// A 3D volume: sections along axis 0, each axis 2 wide and axis 1 high (jit-service's cut).
|
|
110
110
|
const [n0, n1, n2] = sizes.length === 3 ? sizes : [sizes[0], sizes[1], 1];
|
|
111
111
|
const axes = sizes.length === 3 ? { z: 0, x: 2, y: 1 } : { z: 2, x: 0, y: 1 };
|
|
112
|
-
return volume('nrrd', [n0, n1, n2], axes, data, SAMPLES[type], little);
|
|
112
|
+
return volume('nrrd', [n0, n1, n2], axes, data, SAMPLES[type], little, nrrdSpacing(field, sizes.length));
|
|
113
|
+
}
|
|
114
|
+
/** Per file axis, the voxel size in micrometres (see {@link LabelVolume.spacing}), or undefined. */
|
|
115
|
+
function nrrdSpacing(field, dims) {
|
|
116
|
+
let sizes;
|
|
117
|
+
const directions = field['space directions'];
|
|
118
|
+
if (directions) {
|
|
119
|
+
const vectors = directions.match(/\(([^)]*)\)|none/g) ?? [];
|
|
120
|
+
sizes = vectors.filter((v) => v !== 'none').map((v) => Math.hypot(...v.slice(1, -1).split(',').map(Number)));
|
|
121
|
+
}
|
|
122
|
+
else if (field['spacings']) {
|
|
123
|
+
sizes = field['spacings'].split(/\s+/).map(Number);
|
|
124
|
+
}
|
|
125
|
+
if (!sizes || sizes.length !== dims || sizes.some((n) => !(n > 0)))
|
|
126
|
+
return undefined;
|
|
127
|
+
// One unit per axis (`space units: "mm" "um" "um"`), each axis scaled by its own.
|
|
128
|
+
const units = (field['space units'] ?? '').match(/"[^"]*"|\S+/g)?.map((u) => u.replace(/"/g, '').toLowerCase()) ?? [];
|
|
129
|
+
const factor = (unit) => unit === 'mm' || unit === 'millimeter' || unit === 'millimeters'
|
|
130
|
+
? 1e3
|
|
131
|
+
: unit === 'm' || unit === 'meter' || unit === 'meters'
|
|
132
|
+
? 1e6
|
|
133
|
+
: unit === 'nm' || unit === 'nanometer' || unit === 'nanometers'
|
|
134
|
+
? 1e-3
|
|
135
|
+
: 1; // micrometres, or none said
|
|
136
|
+
return [...sizes.map((n, i) => n * factor(units[i])), ...(dims === 2 ? [1] : [])];
|
|
113
137
|
}
|
|
114
138
|
function readNifti(bytes) {
|
|
115
139
|
if (bytes.length < 352)
|
|
@@ -136,9 +160,13 @@ function readNifti(bytes) {
|
|
|
136
160
|
const offset = Math.max(352, Math.round(view.getFloat32(108, little)));
|
|
137
161
|
const [n0, n1, n2] = [dims[0], dims[1], ndim >= 3 ? dims[2] : 1];
|
|
138
162
|
// Slices along axis 2, each axis 0 wide and axis 1 high (Bio-Formats' planes).
|
|
139
|
-
|
|
163
|
+
const pixdim = [1, 2, 3].map((i) => Math.abs(view.getFloat32(76 + 4 * i, little)));
|
|
164
|
+
const units = bytes[123] & 7;
|
|
165
|
+
const factor = units === 1 ? 1e6 : units === 3 ? 1 : 1e3; // metres, micrometres, else millimetres
|
|
166
|
+
const spacing = pixdim.every((n) => n > 0) ? pixdim.map((n) => n * factor) : undefined;
|
|
167
|
+
return volume('nifti', [n0, n1, n2], { z: 2, x: 0, y: 1 }, bytes.subarray(offset), SAMPLES[type], little, spacing);
|
|
140
168
|
}
|
|
141
|
-
function volume(format, n, axes, data, sample, little) {
|
|
169
|
+
function volume(format, n, axes, data, sample, little, spacing) {
|
|
142
170
|
const count = n[0] * n[1] * n[2];
|
|
143
171
|
if (!(count > 0))
|
|
144
172
|
throw new Error(`${format}: empty volume`);
|
|
@@ -154,6 +182,9 @@ function volume(format, n, axes, data, sample, little) {
|
|
|
154
182
|
width,
|
|
155
183
|
height,
|
|
156
184
|
slices: n[axes.z],
|
|
185
|
+
...(spacing
|
|
186
|
+
? { spacing: [spacing[axes.x], spacing[axes.y], spacing[axes.z]] }
|
|
187
|
+
: {}),
|
|
157
188
|
sliceLabels(z) {
|
|
158
189
|
const out = new Uint32Array(width * height);
|
|
159
190
|
const base = z * stride[axes.z];
|
|
@@ -191,4 +222,4 @@ async function platformGunzip(bytes) {
|
|
|
191
222
|
const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('gzip'));
|
|
192
223
|
return new Uint8Array(await new Response(stream).arrayBuffer());
|
|
193
224
|
}
|
|
194
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtdm9sdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24taW1wb3J0L2xhYmVsLXZvbHVtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBaUJILHdEQUF3RDtBQUN4RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxJQUFZLEVBQ1osS0FBaUIsRUFDakIsU0FBaUIsY0FBYztJQUUvQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFELElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLDREQUE0RCxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUlELE1BQU0sT0FBTyxHQUEyQjtJQUN0QyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakQsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN4RSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FB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LEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFpQjtJQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNsRixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxNQUFN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Q0FBQztBQUVELEtBQUssVUFBVSxjQUFjLENBQUMsS0FBaUI7SUFDN0MsSUFBSSxPQUFPLG1CQUFtQixLQUFLLFdBQVc7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDdkcsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxLQUFpQixDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25HLE9BQU8sSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgbGFiZWwgdm9sdW1lIChhIE5JZlRJLTEgYC5uaWlgIC8gYC5uaWkuZ3pgIG9yIGEgTlJSRCBgLm5ycmRgIG9mIGludGVnZXIgc3RydWN0dXJlIGlkcywgYW5cbiAqIGF0bGFzIGFubm90YXRpb24gc2F5KSByZWFkIGluIHRoZSBicm93c2VyLCBzbGljZWQgYXMgdGhlIHNlcnZlciBvcGVucyB0aGUgbWF0Y2hpbmcgaW1hZ2U6XG4gKlxuICogLSAqKk5SUkQqKjogYSAzRCB2b2x1bWUgaXMgY3V0IGFsb25nIGl0cyBGSVJTVCBheGlzLCBlYWNoIHNlY3Rpb24gaXRzIHRoaXJkIGF4aXMgd2lkZSBhbmQgaXRzXG4gKiAgIHNlY29uZCBheGlzIGhpZ2gsIGFzIGppdC1zZXJ2aWNlIG9wZW5zIGEgTlJSRCB2b2x1bWUgKGBBdGxhc05ycmRSZWFkZXJgOiB0aGUgQWxsZW4gQ0NGJ3MgNTI4XG4gKiAgIGNvcm9uYWwgc2VjdGlvbnMgb2YgNDU2IMOXIDMyMCwgYW50ZXJpb3IgZmlyc3QpLiBBIDJEIE5SUkQgaXMgb25lIHNsaWNlLlxuICogLSAqKk5JZlRJKio6IGFsb25nIGl0cyB0aGlyZCBheGlzLCBlYWNoIHNsaWNlIGl0cyBmaXJzdCBheGlzIHdpZGUgYW5kIGl0cyBzZWNvbmQgYXhpcyBoaWdoLCBhc1xuICogICBCaW8tRm9ybWF0cyByZWFkcyBvbmUgKG5vIHJvdyBmbGlwKS5cbiAqXG4gKiBPbmx5IHdoYXQgbGFiZWwgdm9sdW1lcyB1c2U6IGEgc2luZ2xlIGZpbGUgKE5SUkQgd2l0aCBhdHRhY2hlZCBkYXRhLCBOSWZUSS0xIGBuKzFgKSwgaW50ZWdlclxuICogb3IgaW50ZWdlci12YWx1ZWQgZmxvYXQgc2FtcGxlcywgZWl0aGVyIGJ5dGUgb3JkZXIsIHJhdyBvciBnemlwLiBBbnl0aGluZyBlbHNlIHRocm93cyByYXRoZXJcbiAqIHRoYW4gYmUgcmVhZCBhcHByb3hpbWF0ZWx5LiBQdXJlOiB1c2FibGUgZnJvbSB3b3JrZXJzLlxuICovXG5cbi8qKiBBIGxhYmVsIHZvbHVtZSwgc2xpY2VkIChzZWUgdGhlIG1vZHVsZSBjb21tZW50KS4gTGFiZWwgMCBpcyBiYWNrZ3JvdW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYWJlbFZvbHVtZSB7XG4gIGZvcm1hdDogJ25ycmQnIHwgJ25pZnRpJztcbiAgLyoqIEEgc2xpY2UncyB3aWR0aCBhbmQgaGVpZ2h0LCBpbiB2b3hlbHMgKHRoZSBpbWFnZSdzIHBpeGVscykuICovXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIHNsaWNlcy4gKi9cbiAgc2xpY2VzOiBudW1iZXI7XG4gIC8qKiBTbGljZSBgemAncyBsYWJlbHMsIHJvdy1tYWpvciAoYGhlaWdodGAgcm93cyBvZiBgd2lkdGhgKS4gKi9cbiAgc2xpY2VMYWJlbHMoejogbnVtYmVyKTogVWludDMyQXJyYXk7XG59XG5cbi8qKiBEZWNvbXByZXNzIGd6aXAgYnl0ZXMgKGRlZmF1bHQ6IHRoZSBwbGF0Zm9ybSdzIGBEZWNvbXByZXNzaW9uU3RyZWFtYCkuICovXG5leHBvcnQgdHlwZSBHdW56aXAgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8VWludDhBcnJheT47XG5cbi8qKiBXaGV0aGVyIGEgZmlsZSBuYW1lIGlzIGEgbGFiZWwgdm9sdW1lIHRoaXMgcmVhZHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNMYWJlbFZvbHVtZU5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXFwuKG5ycmR8bmlpfG5paVxcLmd6KSQvaS50ZXN0KG5hbWUpO1xufVxuXG4vKiogUmVhZCB0aGUgbGFiZWwgdm9sdW1lIGluIGBieXRlc2AsIG5hbWVkIGBuYW1lYCAoYC5ucnJkYCwgYC5uaWlgLCBgLm5paS5nemApLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRMYWJlbFZvbHVtZShcbiAgbmFtZTogc3RyaW5nLFxuICBieXRlczogVWludDhBcnJheSxcbiAgZ3VuemlwOiBHdW56aXAgPSBwbGF0Zm9ybUd1bnppcCxcbik6IFByb21pc2U8TGFiZWxWb2x1bWU+IHtcbiAgaWYgKC9cXC5ucnJkJC9pLnRlc3QobmFtZSkpIHJldHVybiByZWFkTnJyZChieXRlcywgZ3VuemlwKTtcbiAgaWYgKC9cXC5uaWkoXFwuZ3opPyQvaS50ZXN0KG5hbWUpKSByZXR1cm4gcmVhZE5pZnRpKGlzR3ppcChieXRlcykgPyBhd2FpdCBndW56aXAoYnl0ZXMpIDogYnl0ZXMpO1xuICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX06IG5vdCBhIE5JZlRJICgubmlpLCAubmlpLmd6KSBvciBOUlJEICgubnJyZCkgbGFiZWwgdm9sdW1lYCk7XG59XG5cbi8qKiBTYW1wbGUgdHlwZXM6IHRoZWlyIGJ5dGUgc2l6ZSBhbmQgaG93IG9uZSBpcyByZWFkLiAqL1xudHlwZSBTYW1wbGUgPSB7IGJ5dGVzOiBudW1iZXI7IHJlYWQ6ICh2OiBEYXRhVmlldywgYXQ6IG51bWJlciwgbGl0dGxlOiBib29sZWFuKSA9PiBudW1iZXIgfTtcbmNvbnN0IFNBTVBMRVM6IFJlY29yZDxzdHJpbmcsIFNhbXBsZT4gPSB7XG4gIHU4OiB7IGJ5dGVzOiAxLCByZWFkOiAodiwgYXQpID0+IHYuZ2V0VWludDgoYXQpIH0sXG4gIGk4OiB7IGJ5dGVzOiAxLCByZWFkOiAodiwgYXQpID0+IHYuZ2V0SW50OChhdCkgfSxcbiAgdTE2OiB7IGJ5dGVzOiAyLCByZWFkOiAodiwgYXQsIGxlKSA9PiB2LmdldFVpbnQxNihhdCwgbGUpIH0sXG4gIGkxNjogeyBieXRlczogMiwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRJbnQxNihhdCwgbGUpIH0sXG4gIHUzMjogeyBieXRlczogNCwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRVaW50MzIoYXQsIGxlKSB9LFxuICBpMzI6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IHYuZ2V0SW50MzIoYXQsIGxlKSB9LFxuICBmMzI6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IE1hdGgucm91bmQodi5nZXRGbG9hdDMyKGF0LCBsZSkpIH0sXG4gIGY2NDogeyBieXRlczogOCwgcmVhZDogKHYsIGF0LCBsZSkgPT4gTWF0aC5yb3VuZCh2LmdldEZsb2F0NjQoYXQsIGxlKSkgfSxcbn07XG5cbi8qKiBOUlJEIHR5cGUgbmFtZXMgKGV2ZXJ5IHNwZWxsaW5nIHRoZSBmb3JtYXQgYWxsb3dzKSDihpIgc2FtcGxlIHR5cGUuICovXG5jb25zdCBOUlJEX1RZUEVTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnc2lnbmVkIGNoYXInOiAnaTgnLFxuICBpbnQ4OiAnaTgnLFxuICBpbnQ4X3Q6ICdpOCcsXG4gIHVjaGFyOiAndTgnLFxuICAndW5zaWduZWQgY2hhcic6ICd1OCcsXG4gIHVpbnQ4OiAndTgnLFxuICB1aW50OF90OiAndTgnLFxuICBzaG9ydDogJ2kxNicsXG4gICdzaG9ydCBpbnQnOiAnaTE2JyxcbiAgJ3NpZ25lZCBzaG9ydCc6ICdpMTYnLFxuICAnc2lnbmVkIHNob3J0IGludCc6ICdpMTYnLFxuICBpbnQxNjogJ2kxNicsXG4gIGludDE2X3Q6ICdpMTYnLFxuICB1c2hvcnQ6ICd1MTYnLFxuICAndW5zaWduZWQgc2hvcnQnOiAndTE2JyxcbiAgJ3Vuc2lnbmVkIHNob3J0IGludCc6ICd1MTYnLFxuICB1aW50MTY6ICd1MTYnLFxuICB1aW50MTZfdDogJ3UxNicsXG4gIGludDogJ2kzMicsXG4gICdzaWduZWQgaW50JzogJ2kzMicsXG4gIGludDMyOiAnaTMyJyxcbiAgaW50MzJfdDogJ2kzMicsXG4gIHVpbnQ6ICd1MzInLFxuICAndW5zaWduZWQgaW50JzogJ3UzMicsXG4gIHVpbnQzMjogJ3UzMicsXG4gIHVpbnQzMl90OiAndTMyJyxcbiAgZmxvYXQ6ICdmMzInLFxuICBkb3VibGU6ICdmNjQnLFxufTtcblxuLyoqIE5JZlRJIGRhdGF0eXBlIGNvZGVzIOKGkiBzYW1wbGUgdHlwZS4gKi9cbmNvbnN0IE5JRlRJX1RZUEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAyOiAndTgnLFxuICA0OiAnaTE2JyxcbiAgODogJ2kzMicsXG4gIDE2OiAnZjMyJyxcbiAgNjQ6ICdmNjQnLFxuICAyNTY6ICdpOCcsXG4gIDUxMjogJ3UxNicsXG4gIDc2ODogJ3UzMicsXG59O1xuXG5hc3luYyBmdW5jdGlvbiByZWFkTnJyZChieXRlczogVWludDhBcnJheSwgZ3VuemlwOiBHdW56aXApOiBQcm9taXNlPExhYmVsVm9sdW1lPiB7XG4gIGNvbnN0IGVuZCA9IGhlYWRlckVuZChieXRlcyk7XG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ05SUkQ6IG5vIGJsYW5rIGxpbmUgZW5kcyB0aGUgaGVhZGVyJyk7XG4gIGNvbnN0IGxpbmVzID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKS5kZWNvZGUoYnl0ZXMuc3ViYXJyYXkoMCwgZW5kKSkuc3BsaXQoL1xccj9cXG4vKTtcbiAgaWYgKCEvXk5SUkRcXGR7NH0vLnRlc3QobGluZXNbMF0gPz8gJycpKSB0aHJvdyBuZXcgRXJyb3IoJ05SUkQ6IG5vdCBhIE5SUkQgZmlsZScpO1xuICBjb25zdCBmaWVsZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc2xpY2UoMSkpIHtcbiAgICBpZiAobGluZS5zdGFydHNXaXRoKCcjJykpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGF0ID0gbGluZS5pbmRleE9mKCc6ICcpO1xuICAgIGlmIChhdCA+IDApIGZpZWxkW2xpbmUuc2xpY2UoMCwgYXQpLnRyaW0oKS50b0xvd2VyQ2FzZSgpXSA9IGxpbmUuc2xpY2UoYXQgKyAyKS50cmltKCk7XG4gIH1cbiAgaWYgKGZpZWxkWydkYXRhIGZpbGUnXSB8fCBmaWVsZFsnZGF0YWZpbGUnXSkgdGhyb3cgbmV3IEVycm9yKCdOUlJEOiBkZXRhY2hlZCBkYXRhIChhIC5uaGRyKSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIGNvbnN0IHR5cGUgPSBOUlJEX1RZUEVTWyhmaWVsZFsndHlwZSddID8/ICcnKS50b0xvd2VyQ2FzZSgpXTtcbiAgaWYgKCF0eXBlKSB0aHJvdyBuZXcgRXJyb3IoYE5SUkQ6IHVuc3VwcG9ydGVkIHR5cGUgXCIke2ZpZWxkWyd0eXBlJ119XCJgKTtcbiAgY29uc3Qgc2l6ZXMgPSAoZmllbGRbJ3NpemVzJ10gPz8gJycpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pLm1hcChOdW1iZXIpO1xuICBpZiAoc2l6ZXMubGVuZ3RoICE9PSAyICYmIHNpemVzLmxlbmd0aCAhPT0gMylcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5SUkQ6IG5lZWQgMiBvciAzIGRpbWVuc2lvbnMsIGdvdCAke3NpemVzLmxlbmd0aH1gKTtcbiAgY29uc3QgZW5jb2RpbmcgPSAoZmllbGRbJ2VuY29kaW5nJ10gPz8gJ3JhdycpLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBkYXRhID0gYnl0ZXMuc3ViYXJyYXkoZW5kKTtcbiAgaWYgKGVuY29kaW5nID09PSAnZ3ppcCcgfHwgZW5jb2RpbmcgPT09ICdneicpIGRhdGEgPSBhd2FpdCBndW56aXAoZGF0YSk7XG4gIGVsc2UgaWYgKGVuY29kaW5nICE9PSAncmF3JykgdGhyb3cgbmV3IEVycm9yKGBOUlJEOiB1bnN1cHBvcnRlZCBlbmNvZGluZyBcIiR7ZW5jb2Rpbmd9XCJgKTtcbiAgY29uc3QgbGl0dGxlID0gKGZpZWxkWydlbmRpYW4nXSA/PyAnbGl0dGxlJykudG9Mb3dlckNhc2UoKSAhPT0gJ2JpZyc7XG4gIC8vIEEgM0Qgdm9sdW1lOiBzZWN0aW9ucyBhbG9uZyBheGlzIDAsIGVhY2ggYXhpcyAyIHdpZGUgYW5kIGF4aXMgMSBoaWdoIChqaXQtc2VydmljZSdzIGN1dCkuXG4gIGNvbnN0IFtuMCwgbjEsIG4yXSA9IHNpemVzLmxlbmd0aCA9PT0gMyA/IHNpemVzIDogW3NpemVzWzBdLCBzaXplc1sxXSwgMV07XG4gIGNvbnN0IGF4ZXMgPSBzaXplcy5sZW5ndGggPT09IDMgPyB7IHo6IDAsIHg6IDIsIHk6IDEgfSA6IHsgejogMiwgeDogMCwgeTogMSB9O1xuICByZXR1cm4gdm9sdW1lKCducnJkJywgW24wLCBuMSwgbjJdLCBheGVzLCBkYXRhLCBTQU1QTEVTW3R5cGVdLCBsaXR0bGUpO1xufVxuXG5mdW5jdGlvbiByZWFkTmlmdGkoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBMYWJlbFZvbHVtZSB7XG4gIGlmIChieXRlcy5sZW5ndGggPCAzNTIpIHRocm93IG5ldyBFcnJvcignTklmVEk6IHNob3J0ZXIgdGhhbiBhIGhlYWRlcicpO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gIGxldCBsaXR0bGUgPSB0cnVlO1xuICBpZiAodmlldy5nZXRJbnQzMigwLCB0cnVlKSAhPT0gMzQ4KSB7XG4gICAgaWYgKHZpZXcuZ2V0SW50MzIoMCwgZmFsc2UpICE9PSAzNDgpIHRocm93IG5ldyBFcnJvcignTklmVEk6IG5vdCBhIE5JZlRJLTEgZmlsZScpO1xuICAgIGxpdHRsZSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IG1hZ2ljID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKS5kZWNvZGUoYnl0ZXMuc3ViYXJyYXkoMzQ0LCAzNDcpKTtcbiAgaWYgKG1hZ2ljICE9PSAnbisxJykgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSBzZXBhcmF0ZSAuaGRyLy5pbWcgcGFpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIGNvbnN0IG5kaW0gPSB2aWV3LmdldEludDE2KDQwLCBsaXR0bGUpO1xuICBjb25zdCBkaW1zID0gWzEsIDIsIDMsIDRdLm1hcCgoaSkgPT4gdmlldy5nZXRJbnQxNig0MCArIDIgKiBpLCBsaXR0bGUpKTtcbiAgaWYgKG5kaW0gPCAyKSB0aHJvdyBuZXcgRXJyb3IoYE5JZlRJOiBuZWVkIGF0IGxlYXN0IDIgZGltZW5zaW9ucywgZ290ICR7bmRpbX1gKTtcbiAgaWYgKG5kaW0gPj0gNCAmJiBkaW1zWzNdID4gMSkgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSA0RCBmaWxlIGlzIG5vdCBhIGxhYmVsIHZvbHVtZScpO1xuICBjb25zdCB0eXBlID0gTklGVElfVFlQRVNbdmlldy5nZXRJbnQxNig3MCwgbGl0dGxlKV07XG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBOSWZUSTogdW5zdXBwb3J0ZWQgZGF0YXR5cGUgJHt2aWV3LmdldEludDE2KDcwLCBsaXR0bGUpfWApO1xuICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgzNTIsIE1hdGgucm91bmQodmlldy5nZXRGbG9hdDMyKDEwOCwgbGl0dGxlKSkpO1xuICBjb25zdCBbbjAsIG4xLCBuMl0gPSBbZGltc1swXSwgZGltc1sxXSwgbmRpbSA+PSAzID8gZGltc1syXSA6IDFdO1xuICAvLyBTbGljZXMgYWxvbmcgYXhpcyAyLCBlYWNoIGF4aXMgMCB3aWRlIGFuZCBheGlzIDEgaGlnaCAoQmlvLUZvcm1hdHMnIHBsYW5lcykuXG4gIHJldHVybiB2b2x1bWUoJ25pZnRpJywgW24wLCBuMSwgbjJdLCB7IHo6IDIsIHg6IDAsIHk6IDEgfSwgYnl0ZXMuc3ViYXJyYXkob2Zmc2V0KSwgU0FNUExFU1t0eXBlXSwgbGl0dGxlKTtcbn1cblxuZnVuY3Rpb24gdm9sdW1lKFxuICBmb3JtYXQ6IExhYmVsVm9sdW1lWydmb3JtYXQnXSxcbiAgbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICBheGVzOiB7IHo6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgc2FtcGxlOiBTYW1wbGUsXG4gIGxpdHRsZTogYm9vbGVhbixcbik6IExhYmVsVm9sdW1lIHtcbiAgY29uc3QgY291bnQgPSBuWzBdICogblsxXSAqIG5bMl07XG4gIGlmICghKGNvdW50ID4gMCkpIHRocm93IG5ldyBFcnJvcihgJHtmb3JtYXR9OiBlbXB0eSB2b2x1bWVgKTtcbiAgaWYgKGRhdGEubGVuZ3RoIDwgY291bnQgKiBzYW1wbGUuYnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7Zm9ybWF0fTogJHtkYXRhLmxlbmd0aH0gYnl0ZXMgb2YgZGF0YSwgJHtjb3VudCAqIHNhbXBsZS5ieXRlc30gbmVlZGVkYCk7XG4gIH1cbiAgY29uc3QgdmlldyA9IG5ldyBEYXRhVmlldyhkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICBjb25zdCBzdHJpZGUgPSBbMSwgblswXSwgblswXSAqIG5bMV1dO1xuICBjb25zdCB3aWR0aCA9IG5bYXhlcy54XTtcbiAgY29uc3QgaGVpZ2h0ID0gbltheGVzLnldO1xuICByZXR1cm4ge1xuICAgIGZvcm1hdCxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgc2xpY2VzOiBuW2F4ZXMuel0sXG4gICAgc2xpY2VMYWJlbHMoejogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB6ICogc3RyaWRlW2F4ZXMuel07XG4gICAgICBjb25zdCBzeCA9IHN0cmlkZVtheGVzLnhdO1xuICAgICAgY29uc3Qgc3kgPSBzdHJpZGVbYXhlcy55XTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHNhbXBsZS5yZWFkKHZpZXcsIChiYXNlICsgeCAqIHN4ICsgeSAqIHN5KSAqIHNhbXBsZS5ieXRlcywgbGl0dGxlKTtcbiAgICAgICAgICBvdXRbeSAqIHdpZHRoICsgeF0gPSB2ID4gMCA/IHYgOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyJ3MgYmxhbmsgbGluZSAoYFxcblxcbmAgb3IgYFxcclxcblxcclxcbmApOyAtMSB3aXRob3V0IG9uZS4gKi9cbmZ1bmN0aW9uIGhlYWRlckVuZChieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oYnl0ZXMubGVuZ3RoIC0gMSwgMSA8PCAyMCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykge1xuICAgIGlmIChieXRlc1tpXSAhPT0gMTApIGNvbnRpbnVlO1xuICAgIGlmIChieXRlc1tpICsgMV0gPT09IDEwKSByZXR1cm4gaSArIDI7XG4gICAgaWYgKGJ5dGVzW2kgKyAxXSA9PT0gMTMgJiYgYnl0ZXNbaSArIDJdID09PSAxMCkgcmV0dXJuIGkgKyAzO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNHemlwKGJ5dGVzOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHJldHVybiBieXRlcy5sZW5ndGggPiAyICYmIGJ5dGVzWzBdID09PSAweDFmICYmIGJ5dGVzWzFdID09PSAweDhiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwbGF0Zm9ybUd1bnppcChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAodHlwZW9mIERlY29tcHJlc3Npb25TdHJlYW0gPT09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoJ2d6aXAgZGF0YSBuZWVkcyBEZWNvbXByZXNzaW9uU3RyZWFtJyk7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBCbG9iKFtieXRlcyBhcyBCbG9iUGFydF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkuYXJyYXlCdWZmZXIoKSk7XG59XG4iXX0=
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwtdm9sdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24taW1wb3J0L2xhYmVsLXZvbHVtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztHQWFHO0FBcUJILHdEQUF3RDtBQUN4RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLHdCQUF3QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxJQUFZLEVBQ1osS0FBaUIsRUFDakIsU0FBaUIsY0FBYztJQUUvQixJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFELElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9GLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLDREQUE0RCxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUlELE1BQU0sT0FBTyxHQUEyQjtJQUN0QyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakQsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzNELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN4RSxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDekUsQ0FBQztBQUVGLHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsR0FBMkI7SUFDekMsYUFBYSxFQUFFLElBQUk7SUFDbkIsSUFBSSxFQUFFLElBQUk7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsZUFBZSxFQUFFLElBQUk7SUFDckIsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsSUFBSTtJQUNiLEtBQUssRUFBRSxLQUFLO0lBQ1osV0FBVyxFQUFFLEtBQUs7SUFDbEIsY0FBYyxFQUFFLEtBQUs7SUFDckIsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixLQUFLLEVBQUUsS0FBSztJQUNaLE9BQU8sRUFBRSxLQUFLO0lBQ2QsTUFBTSxFQUFFLEtBQUs7SUFDYixnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsTUFBTSxFQUFFLEtBQUs7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLEdBQUcsRUFBRSxLQUFLO0lBQ1YsWUFBWSxFQUFFLEtBQUs7SUFDbkIsS0FBSyxFQUFFLEtBQUs7SUFDWixPQUFPLEVBQUUsS0FBSztJQUNkLElBQUksRUFBRSxLQUFLO0lBQ1gsY0FBYyxFQUFFLEtBQUs7SUFDckIsTUFBTSxFQUFFLEtBQUs7SUFDYixRQUFRLEVBQUUsS0FBSztJQUNmLEtBQUssRUFBRSxLQUFLO0lBQ1osTUFBTSxFQUFFLEtBQUs7Q0FDZCxDQUFDO0FBRUYsMENBQTBDO0FBQzFDLE1BQU0sV0FBVyxHQUEyQjtJQUMxQyxDQUFDLEVBQUUsSUFBSTtJQUNQLENBQUMsRUFBRSxLQUFLO0lBQ1IsQ0FBQyxFQUFFLEtBQUs7SUFDUixFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxLQUFLO0lBQ1QsR0FBRyxFQUFFLElBQUk7SUFDVCxHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxLQUFLO0NBQ1gsQ0FBQztBQUVGLEtBQUssVUFBVSxRQUFRLENBQUMsS0FBaUIsRUFBRSxNQUFjO0lBQ3ZELE1BQU0sR0FBRyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sS0FBSyxHQUFHLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sS0FBSyxHQUEyQixFQUFFLENBQUM7SUFDekMsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLFNBQVM7UUFDbkMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixJQUFJLEVBQUUsR0FBRyxDQUFDO1lBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDL0csTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDN0QsSUFBSSxDQUFDLElBQUk7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sS0FBSyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzVELElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxRQUFRLEtBQUssTUFBTSxJQUFJLFFBQVEsS0FBSyxJQUFJO1FBQUUsSUFBSSxHQUFHLE1BQU0sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ25FLElBQUksUUFBUSxLQUFLLEtBQUs7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQztJQUNyRSw0RkFBNEY7SUFDNUYsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUM5RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNHLENBQUM7QUFFRCxvR0FBb0c7QUFDcEcsU0FBUyxXQUFXLENBQUMsS0FBNkIsRUFBRSxJQUFZO0lBQzlELElBQUksS0FBMkIsQ0FBQztJQUNoQyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUM3QyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1RCxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDN0IsS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFDRCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNyRixrRkFBa0Y7SUFDbEYsTUFBTSxLQUFLLEdBQ1QsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUcsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUF3QixFQUFFLEVBQUUsQ0FDMUMsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssWUFBWSxJQUFJLElBQUksS0FBSyxhQUFhO1FBQzlELENBQUMsQ0FBQyxHQUFHO1FBQ0wsQ0FBQyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssUUFBUTtZQUNyRCxDQUFDLENBQUMsR0FBRztZQUNMLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxXQUFXLElBQUksSUFBSSxLQUFLLFlBQVk7Z0JBQzlELENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7SUFDekMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNwRixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBaUI7SUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUc7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDeEUsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1RSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDbEIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDbEYsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxLQUFLLEtBQUssS0FBSztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksSUFBSSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN4RixNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsSUFBSTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDbEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBsYWJlbCB2b2x1bWUgKGEgTklmVEktMSBgLm5paWAgLyBgLm5paS5nemAgb3IgYSBOUlJEIGAubnJyZGAgb2YgaW50ZWdlciBzdHJ1Y3R1cmUgaWRzLCBhblxuICogYXRsYXMgYW5ub3RhdGlvbiBzYXkpIHJlYWQgaW4gdGhlIGJyb3dzZXIsIHNsaWNlZCBhcyB0aGUgc2VydmVyIG9wZW5zIHRoZSBtYXRjaGluZyBpbWFnZTpcbiAqXG4gKiAtICoqTlJSRCoqOiBhIDNEIHZvbHVtZSBpcyBjdXQgYWxvbmcgaXRzIEZJUlNUIGF4aXMsIGVhY2ggc2VjdGlvbiBpdHMgdGhpcmQgYXhpcyB3aWRlIGFuZCBpdHNcbiAqICAgc2Vjb25kIGF4aXMgaGlnaCwgYXMgaml0LXNlcnZpY2Ugb3BlbnMgYSBOUlJEIHZvbHVtZSAoYEF0bGFzTnJyZFJlYWRlcmA6IHRoZSBBbGxlbiBDQ0YncyA1MjhcbiAqICAgY29yb25hbCBzZWN0aW9ucyBvZiA0NTYgw5cgMzIwLCBhbnRlcmlvciBmaXJzdCkuIEEgMkQgTlJSRCBpcyBvbmUgc2xpY2UuXG4gKiAtICoqTklmVEkqKjogYWxvbmcgaXRzIHRoaXJkIGF4aXMsIGVhY2ggc2xpY2UgaXRzIGZpcnN0IGF4aXMgd2lkZSBhbmQgaXRzIHNlY29uZCBheGlzIGhpZ2gsIGFzXG4gKiAgIEJpby1Gb3JtYXRzIHJlYWRzIG9uZSAobm8gcm93IGZsaXApLlxuICpcbiAqIE9ubHkgd2hhdCBsYWJlbCB2b2x1bWVzIHVzZTogYSBzaW5nbGUgZmlsZSAoTlJSRCB3aXRoIGF0dGFjaGVkIGRhdGEsIE5JZlRJLTEgYG4rMWApLCBpbnRlZ2VyXG4gKiBvciBpbnRlZ2VyLXZhbHVlZCBmbG9hdCBzYW1wbGVzLCBlaXRoZXIgYnl0ZSBvcmRlciwgcmF3IG9yIGd6aXAuIEFueXRoaW5nIGVsc2UgdGhyb3dzIHJhdGhlclxuICogdGhhbiBiZSByZWFkIGFwcHJveGltYXRlbHkuIFB1cmU6IHVzYWJsZSBmcm9tIHdvcmtlcnMuXG4gKi9cblxuLyoqIEEgbGFiZWwgdm9sdW1lLCBzbGljZWQgKHNlZSB0aGUgbW9kdWxlIGNvbW1lbnQpLiBMYWJlbCAwIGlzIGJhY2tncm91bmQuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsVm9sdW1lIHtcbiAgZm9ybWF0OiAnbnJyZCcgfCAnbmlmdGknO1xuICAvKiogQSBzbGljZSdzIHdpZHRoIGFuZCBoZWlnaHQsIGluIHZveGVscyAodGhlIGltYWdlJ3MgcGl4ZWxzKS4gKi9cbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBOdW1iZXIgb2Ygc2xpY2VzLiAqL1xuICBzbGljZXM6IG51bWJlcjtcbiAgLyoqIFNpemUgb2YgYSB2b3hlbCBhbG9uZyB0aGUgc2xpY2UncyB4LCBpdHMgeSBhbmQgYWNyb3NzIHNsaWNlcywgaW4gbWljcm9tZXRyZXMsIHdoZW4gdGhlIGZpbGVcbiAgICogIHNheXMgKE5SUkQgYHNwYWNlIGRpcmVjdGlvbnNgL2BzcGFjaW5nc2AsIG1pY3JvbWV0cmVzIHVubGVzcyBgc3BhY2UgdW5pdHNgIHNheXMgb3RoZXJ3aXNlO1xuICAgKiAgTklmVEkgYHBpeGRpbWAsIGluIGl0cyBgeHl6dF91bml0c2AsIG1pbGxpbWV0cmVzIHdoZW4gdW5zZXQpLiAqL1xuICBzcGFjaW5nPzogW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAvKiogU2xpY2UgYHpgJ3MgbGFiZWxzLCByb3ctbWFqb3IgKGBoZWlnaHRgIHJvd3Mgb2YgYHdpZHRoYCkuICovXG4gIHNsaWNlTGFiZWxzKHo6IG51bWJlcik6IFVpbnQzMkFycmF5O1xufVxuXG4vKiogRGVjb21wcmVzcyBnemlwIGJ5dGVzIChkZWZhdWx0OiB0aGUgcGxhdGZvcm0ncyBgRGVjb21wcmVzc2lvblN0cmVhbWApLiAqL1xuZXhwb3J0IHR5cGUgR3VuemlwID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiBQcm9taXNlPFVpbnQ4QXJyYXk+O1xuXG4vKiogV2hldGhlciBhIGZpbGUgbmFtZSBpcyBhIGxhYmVsIHZvbHVtZSB0aGlzIHJlYWRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTGFiZWxWb2x1bWVOYW1lKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gL1xcLihucnJkfG5paXxuaWlcXC5neikkL2kudGVzdChuYW1lKTtcbn1cblxuLyoqIFJlYWQgdGhlIGxhYmVsIHZvbHVtZSBpbiBgYnl0ZXNgLCBuYW1lZCBgbmFtZWAgKGAubnJyZGAsIGAubmlpYCwgYC5uaWkuZ3pgKS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkTGFiZWxWb2x1bWUoXG4gIG5hbWU6IHN0cmluZyxcbiAgYnl0ZXM6IFVpbnQ4QXJyYXksXG4gIGd1bnppcDogR3VuemlwID0gcGxhdGZvcm1HdW56aXAsXG4pOiBQcm9taXNlPExhYmVsVm9sdW1lPiB7XG4gIGlmICgvXFwubnJyZCQvaS50ZXN0KG5hbWUpKSByZXR1cm4gcmVhZE5ycmQoYnl0ZXMsIGd1bnppcCk7XG4gIGlmICgvXFwubmlpKFxcLmd6KT8kL2kudGVzdChuYW1lKSkgcmV0dXJuIHJlYWROaWZ0aShpc0d6aXAoYnl0ZXMpID8gYXdhaXQgZ3VuemlwKGJ5dGVzKSA6IGJ5dGVzKTtcbiAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9OiBub3QgYSBOSWZUSSAoLm5paSwgLm5paS5neikgb3IgTlJSRCAoLm5ycmQpIGxhYmVsIHZvbHVtZWApO1xufVxuXG4vKiogU2FtcGxlIHR5cGVzOiB0aGVpciBieXRlIHNpemUgYW5kIGhvdyBvbmUgaXMgcmVhZC4gKi9cbnR5cGUgU2FtcGxlID0geyBieXRlczogbnVtYmVyOyByZWFkOiAodjogRGF0YVZpZXcsIGF0OiBudW1iZXIsIGxpdHRsZTogYm9vbGVhbikgPT4gbnVtYmVyIH07XG5jb25zdCBTQU1QTEVTOiBSZWNvcmQ8c3RyaW5nLCBTYW1wbGU+ID0ge1xuICB1ODogeyBieXRlczogMSwgcmVhZDogKHYsIGF0KSA9PiB2LmdldFVpbnQ4KGF0KSB9LFxuICBpODogeyBieXRlczogMSwgcmVhZDogKHYsIGF0KSA9PiB2LmdldEludDgoYXQpIH0sXG4gIHUxNjogeyBieXRlczogMiwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRVaW50MTYoYXQsIGxlKSB9LFxuICBpMTY6IHsgYnl0ZXM6IDIsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IHYuZ2V0SW50MTYoYXQsIGxlKSB9LFxuICB1MzI6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IHYuZ2V0VWludDMyKGF0LCBsZSkgfSxcbiAgaTMyOiB7IGJ5dGVzOiA0LCByZWFkOiAodiwgYXQsIGxlKSA9PiB2LmdldEludDMyKGF0LCBsZSkgfSxcbiAgZjMyOiB7IGJ5dGVzOiA0LCByZWFkOiAodiwgYXQsIGxlKSA9PiBNYXRoLnJvdW5kKHYuZ2V0RmxvYXQzMihhdCwgbGUpKSB9LFxuICBmNjQ6IHsgYnl0ZXM6IDgsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IE1hdGgucm91bmQodi5nZXRGbG9hdDY0KGF0LCBsZSkpIH0sXG59O1xuXG4vKiogTlJSRCB0eXBlIG5hbWVzIChldmVyeSBzcGVsbGluZyB0aGUgZm9ybWF0IGFsbG93cykg4oaSIHNhbXBsZSB0eXBlLiAqL1xuY29uc3QgTlJSRF9UWVBFUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ3NpZ25lZCBjaGFyJzogJ2k4JyxcbiAgaW50ODogJ2k4JyxcbiAgaW50OF90OiAnaTgnLFxuICB1Y2hhcjogJ3U4JyxcbiAgJ3Vuc2lnbmVkIGNoYXInOiAndTgnLFxuICB1aW50ODogJ3U4JyxcbiAgdWludDhfdDogJ3U4JyxcbiAgc2hvcnQ6ICdpMTYnLFxuICAnc2hvcnQgaW50JzogJ2kxNicsXG4gICdzaWduZWQgc2hvcnQnOiAnaTE2JyxcbiAgJ3NpZ25lZCBzaG9ydCBpbnQnOiAnaTE2JyxcbiAgaW50MTY6ICdpMTYnLFxuICBpbnQxNl90OiAnaTE2JyxcbiAgdXNob3J0OiAndTE2JyxcbiAgJ3Vuc2lnbmVkIHNob3J0JzogJ3UxNicsXG4gICd1bnNpZ25lZCBzaG9ydCBpbnQnOiAndTE2JyxcbiAgdWludDE2OiAndTE2JyxcbiAgdWludDE2X3Q6ICd1MTYnLFxuICBpbnQ6ICdpMzInLFxuICAnc2lnbmVkIGludCc6ICdpMzInLFxuICBpbnQzMjogJ2kzMicsXG4gIGludDMyX3Q6ICdpMzInLFxuICB1aW50OiAndTMyJyxcbiAgJ3Vuc2lnbmVkIGludCc6ICd1MzInLFxuICB1aW50MzI6ICd1MzInLFxuICB1aW50MzJfdDogJ3UzMicsXG4gIGZsb2F0OiAnZjMyJyxcbiAgZG91YmxlOiAnZjY0Jyxcbn07XG5cbi8qKiBOSWZUSSBkYXRhdHlwZSBjb2RlcyDihpIgc2FtcGxlIHR5cGUuICovXG5jb25zdCBOSUZUSV9UWVBFUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgMjogJ3U4JyxcbiAgNDogJ2kxNicsXG4gIDg6ICdpMzInLFxuICAxNjogJ2YzMicsXG4gIDY0OiAnZjY0JyxcbiAgMjU2OiAnaTgnLFxuICA1MTI6ICd1MTYnLFxuICA3Njg6ICd1MzInLFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZE5ycmQoYnl0ZXM6IFVpbnQ4QXJyYXksIGd1bnppcDogR3VuemlwKTogUHJvbWlzZTxMYWJlbFZvbHVtZT4ge1xuICBjb25zdCBlbmQgPSBoZWFkZXJFbmQoYnl0ZXMpO1xuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IEVycm9yKCdOUlJEOiBubyBibGFuayBsaW5lIGVuZHMgdGhlIGhlYWRlcicpO1xuICBjb25zdCBsaW5lcyA9IG5ldyBUZXh0RGVjb2RlcignbGF0aW4xJykuZGVjb2RlKGJ5dGVzLnN1YmFycmF5KDAsIGVuZCkpLnNwbGl0KC9cXHI/XFxuLyk7XG4gIGlmICghL15OUlJEXFxkezR9Ly50ZXN0KGxpbmVzWzBdID8/ICcnKSkgdGhyb3cgbmV3IEVycm9yKCdOUlJEOiBub3QgYSBOUlJEIGZpbGUnKTtcbiAgY29uc3QgZmllbGQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNsaWNlKDEpKSB7XG4gICAgaWYgKGxpbmUuc3RhcnRzV2l0aCgnIycpKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGxpbmUuaW5kZXhPZignOiAnKTtcbiAgICBpZiAoYXQgPiAwKSBmaWVsZFtsaW5lLnNsaWNlKDAsIGF0KS50cmltKCkudG9Mb3dlckNhc2UoKV0gPSBsaW5lLnNsaWNlKGF0ICsgMikudHJpbSgpO1xuICB9XG4gIGlmIChmaWVsZFsnZGF0YSBmaWxlJ10gfHwgZmllbGRbJ2RhdGFmaWxlJ10pIHRocm93IG5ldyBFcnJvcignTlJSRDogZGV0YWNoZWQgZGF0YSAoYSAubmhkcikgaXMgbm90IHN1cHBvcnRlZCcpO1xuICBjb25zdCB0eXBlID0gTlJSRF9UWVBFU1soZmllbGRbJ3R5cGUnXSA/PyAnJykudG9Mb3dlckNhc2UoKV07XG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBOUlJEOiB1bnN1cHBvcnRlZCB0eXBlIFwiJHtmaWVsZFsndHlwZSddfVwiYCk7XG4gIGNvbnN0IHNpemVzID0gKGZpZWxkWydzaXplcyddID8/ICcnKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKS5tYXAoTnVtYmVyKTtcbiAgaWYgKHNpemVzLmxlbmd0aCAhPT0gMiAmJiBzaXplcy5sZW5ndGggIT09IDMpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOUlJEOiBuZWVkIDIgb3IgMyBkaW1lbnNpb25zLCBnb3QgJHtzaXplcy5sZW5ndGh9YCk7XG4gIGNvbnN0IGVuY29kaW5nID0gKGZpZWxkWydlbmNvZGluZyddID8/ICdyYXcnKS50b0xvd2VyQ2FzZSgpO1xuICBsZXQgZGF0YSA9IGJ5dGVzLnN1YmFycmF5KGVuZCk7XG4gIGlmIChlbmNvZGluZyA9PT0gJ2d6aXAnIHx8IGVuY29kaW5nID09PSAnZ3onKSBkYXRhID0gYXdhaXQgZ3VuemlwKGRhdGEpO1xuICBlbHNlIGlmIChlbmNvZGluZyAhPT0gJ3JhdycpIHRocm93IG5ldyBFcnJvcihgTlJSRDogdW5zdXBwb3J0ZWQgZW5jb2RpbmcgXCIke2VuY29kaW5nfVwiYCk7XG4gIGNvbnN0IGxpdHRsZSA9IChmaWVsZFsnZW5kaWFuJ10gPz8gJ2xpdHRsZScpLnRvTG93ZXJDYXNlKCkgIT09ICdiaWcnO1xuICAvLyBBIDNEIHZvbHVtZTogc2VjdGlvbnMgYWxvbmcgYXhpcyAwLCBlYWNoIGF4aXMgMiB3aWRlIGFuZCBheGlzIDEgaGlnaCAoaml0LXNlcnZpY2UncyBjdXQpLlxuICBjb25zdCBbbjAsIG4xLCBuMl0gPSBzaXplcy5sZW5ndGggPT09IDMgPyBzaXplcyA6IFtzaXplc1swXSwgc2l6ZXNbMV0sIDFdO1xuICBjb25zdCBheGVzID0gc2l6ZXMubGVuZ3RoID09PSAzID8geyB6OiAwLCB4OiAyLCB5OiAxIH0gOiB7IHo6IDIsIHg6IDAsIHk6IDEgfTtcbiAgcmV0dXJuIHZvbHVtZSgnbnJyZCcsIFtuMCwgbjEsIG4yXSwgYXhlcywgZGF0YSwgU0FNUExFU1t0eXBlXSwgbGl0dGxlLCBucnJkU3BhY2luZyhmaWVsZCwgc2l6ZXMubGVuZ3RoKSk7XG59XG5cbi8qKiBQZXIgZmlsZSBheGlzLCB0aGUgdm94ZWwgc2l6ZSBpbiBtaWNyb21ldHJlcyAoc2VlIHtAbGluayBMYWJlbFZvbHVtZS5zcGFjaW5nfSksIG9yIHVuZGVmaW5lZC4gKi9cbmZ1bmN0aW9uIG5ycmRTcGFjaW5nKGZpZWxkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCBkaW1zOiBudW1iZXIpOiBudW1iZXJbXSB8IHVuZGVmaW5lZCB7XG4gIGxldCBzaXplczogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGRpcmVjdGlvbnMgPSBmaWVsZFsnc3BhY2UgZGlyZWN0aW9ucyddO1xuICBpZiAoZGlyZWN0aW9ucykge1xuICAgIGNvbnN0IHZlY3RvcnMgPSBkaXJlY3Rpb25zLm1hdGNoKC9cXCgoW14pXSopXFwpfG5vbmUvZykgPz8gW107XG4gICAgc2l6ZXMgPSB2ZWN0b3JzLmZpbHRlcigodikgPT4gdiAhPT0gJ25vbmUnKS5tYXAoKHYpID0+IE1hdGguaHlwb3QoLi4udi5zbGljZSgxLCAtMSkuc3BsaXQoJywnKS5tYXAoTnVtYmVyKSkpO1xuICB9IGVsc2UgaWYgKGZpZWxkWydzcGFjaW5ncyddKSB7XG4gICAgc2l6ZXMgPSBmaWVsZFsnc3BhY2luZ3MnXS5zcGxpdCgvXFxzKy8pLm1hcChOdW1iZXIpO1xuICB9XG4gIGlmICghc2l6ZXMgfHwgc2l6ZXMubGVuZ3RoICE9PSBkaW1zIHx8IHNpemVzLnNvbWUoKG4pID0+ICEobiA+IDApKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gT25lIHVuaXQgcGVyIGF4aXMgKGBzcGFjZSB1bml0czogXCJtbVwiIFwidW1cIiBcInVtXCJgKSwgZWFjaCBheGlzIHNjYWxlZCBieSBpdHMgb3duLlxuICBjb25zdCB1bml0cyA9XG4gICAgKGZpZWxkWydzcGFjZSB1bml0cyddID8/ICcnKS5tYXRjaCgvXCJbXlwiXSpcInxcXFMrL2cpPy5tYXAoKHUpID0+IHUucmVwbGFjZSgvXCIvZywgJycpLnRvTG93ZXJDYXNlKCkpID8/IFtdO1xuICBjb25zdCBmYWN0b3IgPSAodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSA9PlxuICAgIHVuaXQgPT09ICdtbScgfHwgdW5pdCA9PT0gJ21pbGxpbWV0ZXInIHx8IHVuaXQgPT09ICdtaWxsaW1ldGVycydcbiAgICAgID8gMWUzXG4gICAgICA6IHVuaXQgPT09ICdtJyB8fCB1bml0ID09PSAnbWV0ZXInIHx8IHVuaXQgPT09ICdtZXRlcnMnXG4gICAgICAgID8gMWU2XG4gICAgICAgIDogdW5pdCA9PT0gJ25tJyB8fCB1bml0ID09PSAnbmFub21ldGVyJyB8fCB1bml0ID09PSAnbmFub21ldGVycydcbiAgICAgICAgICA/IDFlLTNcbiAgICAgICAgICA6IDE7IC8vIG1pY3JvbWV0cmVzLCBvciBub25lIHNhaWRcbiAgcmV0dXJuIFsuLi5zaXplcy5tYXAoKG4sIGkpID0+IG4gKiBmYWN0b3IodW5pdHNbaV0pKSwgLi4uKGRpbXMgPT09IDIgPyBbMV0gOiBbXSldO1xufVxuXG5mdW5jdGlvbiByZWFkTmlmdGkoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBMYWJlbFZvbHVtZSB7XG4gIGlmIChieXRlcy5sZW5ndGggPCAzNTIpIHRocm93IG5ldyBFcnJvcignTklmVEk6IHNob3J0ZXIgdGhhbiBhIGhlYWRlcicpO1xuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlciwgYnl0ZXMuYnl0ZU9mZnNldCwgYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gIGxldCBsaXR0bGUgPSB0cnVlO1xuICBpZiAodmlldy5nZXRJbnQzMigwLCB0cnVlKSAhPT0gMzQ4KSB7XG4gICAgaWYgKHZpZXcuZ2V0SW50MzIoMCwgZmFsc2UpICE9PSAzNDgpIHRocm93IG5ldyBFcnJvcignTklmVEk6IG5vdCBhIE5JZlRJLTEgZmlsZScpO1xuICAgIGxpdHRsZSA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IG1hZ2ljID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKS5kZWNvZGUoYnl0ZXMuc3ViYXJyYXkoMzQ0LCAzNDcpKTtcbiAgaWYgKG1hZ2ljICE9PSAnbisxJykgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSBzZXBhcmF0ZSAuaGRyLy5pbWcgcGFpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIGNvbnN0IG5kaW0gPSB2aWV3LmdldEludDE2KDQwLCBsaXR0bGUpO1xuICBjb25zdCBkaW1zID0gWzEsIDIsIDMsIDRdLm1hcCgoaSkgPT4gdmlldy5nZXRJbnQxNig0MCArIDIgKiBpLCBsaXR0bGUpKTtcbiAgaWYgKG5kaW0gPCAyKSB0aHJvdyBuZXcgRXJyb3IoYE5JZlRJOiBuZWVkIGF0IGxlYXN0IDIgZGltZW5zaW9ucywgZ290ICR7bmRpbX1gKTtcbiAgaWYgKG5kaW0gPj0gNCAmJiBkaW1zWzNdID4gMSkgdGhyb3cgbmV3IEVycm9yKCdOSWZUSTogYSA0RCBmaWxlIGlzIG5vdCBhIGxhYmVsIHZvbHVtZScpO1xuICBjb25zdCB0eXBlID0gTklGVElfVFlQRVNbdmlldy5nZXRJbnQxNig3MCwgbGl0dGxlKV07XG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKGBOSWZUSTogdW5zdXBwb3J0ZWQgZGF0YXR5cGUgJHt2aWV3LmdldEludDE2KDcwLCBsaXR0bGUpfWApO1xuICBjb25zdCBvZmZzZXQgPSBNYXRoLm1heCgzNTIsIE1hdGgucm91bmQodmlldy5nZXRGbG9hdDMyKDEwOCwgbGl0dGxlKSkpO1xuICBjb25zdCBbbjAsIG4xLCBuMl0gPSBbZGltc1swXSwgZGltc1sxXSwgbmRpbSA+PSAzID8gZGltc1syXSA6IDFdO1xuICAvLyBTbGljZXMgYWxvbmcgYXhpcyAyLCBlYWNoIGF4aXMgMCB3aWRlIGFuZCBheGlzIDEgaGlnaCAoQmlvLUZvcm1hdHMnIHBsYW5lcykuXG4gIGNvbnN0IHBpeGRpbSA9IFsxLCAyLCAzXS5tYXAoKGkpID0+IE1hdGguYWJzKHZpZXcuZ2V0RmxvYXQzMig3NiArIDQgKiBpLCBsaXR0bGUpKSk7XG4gIGNvbnN0IHVuaXRzID0gYnl0ZXNbMTIzXSAmIDc7XG4gIGNvbnN0IGZhY3RvciA9IHVuaXRzID09PSAxID8gMWU2IDogdW5pdHMgPT09IDMgPyAxIDogMWUzOyAvLyBtZXRyZXMsIG1pY3JvbWV0cmVzLCBlbHNlIG1pbGxpbWV0cmVzXG4gIGNvbnN0IHNwYWNpbmcgPSBwaXhkaW0uZXZlcnkoKG4pID0+IG4gPiAwKSA/IHBpeGRpbS5tYXAoKG4pID0+IG4gKiBmYWN0b3IpIDogdW5kZWZpbmVkO1xuICByZXR1cm4gdm9sdW1lKFxuICAgICduaWZ0aScsXG4gICAgW24wLCBuMSwgbjJdLFxuICAgIHsgejogMiwgeDogMCwgeTogMSB9LFxuICAgIGJ5dGVzLnN1YmFycmF5KG9mZnNldCksXG4gICAgU0FNUExFU1t0eXBlXSxcbiAgICBsaXR0bGUsXG4gICAgc3BhY2luZyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gdm9sdW1lKFxuICBmb3JtYXQ6IExhYmVsVm9sdW1lWydmb3JtYXQnXSxcbiAgbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICBheGVzOiB7IHo6IG51bWJlcjsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbiAgZGF0YTogVWludDhBcnJheSxcbiAgc2FtcGxlOiBTYW1wbGUsXG4gIGxpdHRsZTogYm9vbGVhbixcbiAgc3BhY2luZz86IG51bWJlcltdLFxuKTogTGFiZWxWb2x1bWUge1xuICBjb25zdCBjb3VudCA9IG5bMF0gKiBuWzFdICogblsyXTtcbiAgaWYgKCEoY291bnQgPiAwKSkgdGhyb3cgbmV3IEVycm9yKGAke2Zvcm1hdH06IGVtcHR5IHZvbHVtZWApO1xuICBpZiAoZGF0YS5sZW5ndGggPCBjb3VudCAqIHNhbXBsZS5ieXRlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtmb3JtYXR9OiAke2RhdGEubGVuZ3RofSBieXRlcyBvZiBkYXRhLCAke2NvdW50ICogc2FtcGxlLmJ5dGVzfSBuZWVkZWRgKTtcbiAgfVxuICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIGRhdGEuYnl0ZUxlbmd0aCk7XG4gIGNvbnN0IHN0cmlkZSA9IFsxLCBuWzBdLCBuWzBdICogblsxXV07XG4gIGNvbnN0IHdpZHRoID0gbltheGVzLnhdO1xuICBjb25zdCBoZWlnaHQgPSBuW2F4ZXMueV07XG4gIHJldHVybiB7XG4gICAgZm9ybWF0LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBzbGljZXM6IG5bYXhlcy56XSxcbiAgICAuLi4oc3BhY2luZ1xuICAgICAgPyB7IHNwYWNpbmc6IFtzcGFjaW5nW2F4ZXMueF0sIHNwYWNpbmdbYXhlcy55XSwgc3BhY2luZ1theGVzLnpdXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfVxuICAgICAgOiB7fSksXG4gICAgc2xpY2VMYWJlbHMoejogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICAgICAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICAgIGNvbnN0IGJhc2UgPSB6ICogc3RyaWRlW2F4ZXMuel07XG4gICAgICBjb25zdCBzeCA9IHN0cmlkZVtheGVzLnhdO1xuICAgICAgY29uc3Qgc3kgPSBzdHJpZGVbYXhlcy55XTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgdiA9IHNhbXBsZS5yZWFkKHZpZXcsIChiYXNlICsgeCAqIHN4ICsgeSAqIHN5KSAqIHNhbXBsZS5ieXRlcywgbGl0dGxlKTtcbiAgICAgICAgICBvdXRbeSAqIHdpZHRoICsgeF0gPSB2ID4gMCA/IHYgOiAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKiBUaGUgb2Zmc2V0IGp1c3QgcGFzdCB0aGUgaGVhZGVyJ3MgYmxhbmsgbGluZSAoYFxcblxcbmAgb3IgYFxcclxcblxcclxcbmApOyAtMSB3aXRob3V0IG9uZS4gKi9cbmZ1bmN0aW9uIGhlYWRlckVuZChieXRlczogVWludDhBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oYnl0ZXMubGVuZ3RoIC0gMSwgMSA8PCAyMCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGltaXQ7IGkrKykge1xuICAgIGlmIChieXRlc1tpXSAhPT0gMTApIGNvbnRpbnVlO1xuICAgIGlmIChieXRlc1tpICsgMV0gPT09IDEwKSByZXR1cm4gaSArIDI7XG4gICAgaWYgKGJ5dGVzW2kgKyAxXSA9PT0gMTMgJiYgYnl0ZXNbaSArIDJdID09PSAxMCkgcmV0dXJuIGkgKyAzO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gaXNHemlwKGJ5dGVzOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gIHJldHVybiBieXRlcy5sZW5ndGggPiAyICYmIGJ5dGVzWzBdID09PSAweDFmICYmIGJ5dGVzWzFdID09PSAweDhiO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwbGF0Zm9ybUd1bnppcChieXRlczogVWludDhBcnJheSk6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAodHlwZW9mIERlY29tcHJlc3Npb25TdHJlYW0gPT09ICd1bmRlZmluZWQnKSB0aHJvdyBuZXcgRXJyb3IoJ2d6aXAgZGF0YSBuZWVkcyBEZWNvbXByZXNzaW9uU3RyZWFtJyk7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBCbG9iKFtieXRlcyBhcyBCbG9iUGFydF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkuYXJyYXlCdWZmZXIoKSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A label image of an OME-Zarr store (`labels/<name>/`, NGFF 0.4 on zarr v2 or 0.5 on zarr v3),
|
|
3
|
+
* read in the browser from the store's files (a folder chosen, or a zip's members): its full
|
|
4
|
+
* resolution level, sliced along z, with the classes its `image-label` metadata names and colours.
|
|
5
|
+
*
|
|
6
|
+
* Chunks are decoded when a slice that needs them is read, so a store is never decoded whole.
|
|
7
|
+
* Only what label images use: C-order chunks of integer (or integer-valued float) samples, through
|
|
8
|
+
* the codecs {@link decodeChunk} reads, a missing chunk being the fill value. Sharded or transposed
|
|
9
|
+
* arrays, F-order and filters throw rather than be read wrongly. Pure: usable from workers.
|
|
10
|
+
*/
|
|
11
|
+
import { labelClasses } from './label-classes';
|
|
12
|
+
import { decodeChunk } from './zarr-codecs';
|
|
13
|
+
/** Whether `files` hold a zarr store (any zarr metadata among them). */
|
|
14
|
+
export function hasZarrMetadata(files) {
|
|
15
|
+
return files.some((f) => /(^|\/)(\.zattrs|\.zarray|\.zgroup|zarr\.json)$/.test(norm(f.name)));
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The first label image of the zarr store among `files` (the order `labels/`'s listing gives,
|
|
19
|
+
* else the first found), or null when the store has none.
|
|
20
|
+
*/
|
|
21
|
+
export async function readOmeZarrLabels(files, inflate) {
|
|
22
|
+
const byPath = new Map(files.map((f) => [norm(f.name), f]));
|
|
23
|
+
const groups = new Map();
|
|
24
|
+
for (const [path, file] of byPath) {
|
|
25
|
+
const m = /^(.*?)\/?(\.zattrs|zarr\.json)$/.exec(path);
|
|
26
|
+
if (!m)
|
|
27
|
+
continue;
|
|
28
|
+
const doc = JSON.parse(await file.text());
|
|
29
|
+
const attrs = (m[2] === 'zarr.json' ? doc['attributes'] : doc) ?? {};
|
|
30
|
+
groups.set(m[1], (attrs['ome'] ?? attrs));
|
|
31
|
+
}
|
|
32
|
+
const listed = [];
|
|
33
|
+
for (const [dir, ome] of groups) {
|
|
34
|
+
for (const name of ome['labels'] ?? [])
|
|
35
|
+
listed.push(join(dir, name));
|
|
36
|
+
}
|
|
37
|
+
const isLabel = (dir) => {
|
|
38
|
+
const ome = groups.get(dir);
|
|
39
|
+
return !!ome?.['multiscales'] && (!!ome['image-label'] || /(^|\/)labels\/[^/]+$/.test(dir));
|
|
40
|
+
};
|
|
41
|
+
const dir = [...listed, ...groups.keys()].find(isLabel);
|
|
42
|
+
if (dir === undefined)
|
|
43
|
+
return null;
|
|
44
|
+
const ome = groups.get(dir);
|
|
45
|
+
const ms = ome['multiscales'][0];
|
|
46
|
+
const dataset = ms.datasets[0];
|
|
47
|
+
const array = await readArrayMeta(byPath, join(dir, dataset.path));
|
|
48
|
+
const axes = (ms.axes ?? ['z', 'y', 'x'].slice(3 - array.shape.length)).map((a) => typeof a === 'string' ? { name: a } : a);
|
|
49
|
+
if (axes.length !== array.shape.length)
|
|
50
|
+
throw new Error(`OME-Zarr ${dir}: ${axes.length} axes for a ${array.shape.length}-D array`);
|
|
51
|
+
const at = (n) => axes.findIndex((a) => a.name.toLowerCase() === n);
|
|
52
|
+
const ix = at('x');
|
|
53
|
+
const iy = at('y');
|
|
54
|
+
const iz = at('z');
|
|
55
|
+
if (ix < 0 || iy < 0)
|
|
56
|
+
throw new Error(`OME-Zarr ${dir}: no x and y axes`);
|
|
57
|
+
const scale = dataset.coordinateTransformations?.find((t) => t.type === 'scale')?.scale;
|
|
58
|
+
const um = (i) => (i < 0 ? 1 : (scale?.[i] ?? 1) * unitToMicrons(axes[i].unit));
|
|
59
|
+
const stack = labelStack(byPath, join(dir, dataset.path), array, { ix, iy, iz }, inflate);
|
|
60
|
+
stack.spacing = [um(ix), um(iy), iz < 0 ? 1 : um(iz)];
|
|
61
|
+
const name = ms.name ?? dir.split('/').pop() ?? 'labels';
|
|
62
|
+
return { name, stack, classes: imageLabelClasses(ome['image-label']) };
|
|
63
|
+
}
|
|
64
|
+
async function readArrayMeta(byPath, path) {
|
|
65
|
+
const v2 = byPath.get(join(path, '.zarray'));
|
|
66
|
+
if (v2) {
|
|
67
|
+
const m = JSON.parse(await v2.text());
|
|
68
|
+
if (m.order && m.order !== 'C')
|
|
69
|
+
throw new Error(`zarr ${path}: ${m.order}-order chunks are not supported`);
|
|
70
|
+
if (m.filters?.length)
|
|
71
|
+
throw new Error(`zarr ${path}: filters are not supported`);
|
|
72
|
+
const sep = m.dimension_separator ?? '.';
|
|
73
|
+
return {
|
|
74
|
+
shape: m.shape,
|
|
75
|
+
chunks: m.chunks,
|
|
76
|
+
dtype: v2Dtype(m.dtype, path),
|
|
77
|
+
codecs: m.compressor ? [m.compressor] : [],
|
|
78
|
+
fill: Number(m.fill_value ?? 0) || 0,
|
|
79
|
+
key: (index) => index.join(sep),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const v3 = byPath.get(join(path, 'zarr.json'));
|
|
83
|
+
if (!v3)
|
|
84
|
+
throw new Error(`zarr ${path}: no array metadata`);
|
|
85
|
+
const m = JSON.parse(await v3.text());
|
|
86
|
+
if (m.chunk_grid?.name !== 'regular')
|
|
87
|
+
throw new Error(`zarr ${path}: chunk grid ${m.chunk_grid?.name} is not supported`);
|
|
88
|
+
const codecs = (m.codecs ?? []);
|
|
89
|
+
const bytes = codecs[0];
|
|
90
|
+
if (bytes?.name !== 'bytes') {
|
|
91
|
+
throw new Error(`zarr ${path}: codec ${bytes?.name ?? 'none'} before bytes is not supported (sharding, transpose)`);
|
|
92
|
+
}
|
|
93
|
+
const little = (bytes.configuration?.['endian'] ?? 'little') === 'little';
|
|
94
|
+
const enc = m.chunk_key_encoding ?? { name: 'default' };
|
|
95
|
+
const sep = enc.configuration?.separator ?? (enc.name === 'v2' ? '.' : '/');
|
|
96
|
+
return {
|
|
97
|
+
shape: m.shape,
|
|
98
|
+
chunks: m.chunk_grid.configuration.chunk_shape,
|
|
99
|
+
dtype: v3Dtype(m.data_type, little, path),
|
|
100
|
+
codecs: codecs.slice(1).map((c) => ({ id: c.name, ...(c.configuration ?? {}) })),
|
|
101
|
+
fill: Number(m.fill_value ?? 0) || 0,
|
|
102
|
+
key: (index) => (enc.name === 'v2' ? index.join(sep) : ['c', ...index].join(sep)),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/** The slices of the array at `path`, decoding (and keeping) the chunk layers a slice spans. */
|
|
106
|
+
function labelStack(byPath, path, a, axes, inflate) {
|
|
107
|
+
const { ix, iy, iz } = axes;
|
|
108
|
+
const width = a.shape[ix];
|
|
109
|
+
const height = a.shape[iy];
|
|
110
|
+
const slices = iz < 0 ? 1 : a.shape[iz];
|
|
111
|
+
const cx = a.chunks[ix];
|
|
112
|
+
const cy = a.chunks[iy];
|
|
113
|
+
// The chunks (their decodes, pending or done) of the last chunk layer along z read: a slice's
|
|
114
|
+
// neighbours share it. A read keeps the layer it started with, so a read of another layer
|
|
115
|
+
// replacing this cache while it awaits a chunk cannot change what it reads.
|
|
116
|
+
let layer = null;
|
|
117
|
+
const chunk = async (index) => {
|
|
118
|
+
const file = byPath.get(join(path, a.key(index)));
|
|
119
|
+
if (!file)
|
|
120
|
+
return null;
|
|
121
|
+
return decodeChunk(await file.bytes(), a.codecs, inflate);
|
|
122
|
+
};
|
|
123
|
+
return {
|
|
124
|
+
width,
|
|
125
|
+
height,
|
|
126
|
+
slices,
|
|
127
|
+
async labels(z) {
|
|
128
|
+
if (z < 0 || z >= slices)
|
|
129
|
+
throw new Error(`slice ${z} of ${slices}`);
|
|
130
|
+
const kz = iz < 0 ? 0 : Math.floor(z / a.chunks[iz]);
|
|
131
|
+
if (layer?.kz !== kz)
|
|
132
|
+
layer = { kz, chunks: new Map() };
|
|
133
|
+
const mine = layer;
|
|
134
|
+
const out = new Uint32Array(width * height);
|
|
135
|
+
const strides = a.chunks.map((_, d) => a.chunks.slice(d + 1).reduce((p, n) => p * n, 1));
|
|
136
|
+
for (let gy = 0; gy * cy < height; gy++) {
|
|
137
|
+
for (let gx = 0; gx * cx < width; gx++) {
|
|
138
|
+
// Every other axis (time, channel) at its first index.
|
|
139
|
+
const index = a.shape.map((_, d) => (d === ix ? gx : d === iy ? gy : d === iz ? kz : 0));
|
|
140
|
+
const key = index.join(',');
|
|
141
|
+
let pending = mine.chunks.get(key);
|
|
142
|
+
if (!pending) {
|
|
143
|
+
pending = chunk(index);
|
|
144
|
+
mine.chunks.set(key, pending);
|
|
145
|
+
// A chunk that failed to decode is not kept: the next read tries it again.
|
|
146
|
+
pending.catch(() => mine.chunks.delete(key));
|
|
147
|
+
}
|
|
148
|
+
const data = await pending;
|
|
149
|
+
const view = data ? new DataView(data.buffer, data.byteOffset, data.byteLength) : null;
|
|
150
|
+
const inZ = iz < 0 ? 0 : z - kz * a.chunks[iz];
|
|
151
|
+
for (let y = gy * cy; y < Math.min(height, (gy + 1) * cy); y++) {
|
|
152
|
+
for (let x = gx * cx; x < Math.min(width, (gx + 1) * cx); x++) {
|
|
153
|
+
let v = a.fill;
|
|
154
|
+
if (view) {
|
|
155
|
+
const local = a.shape.map((_, d) => d === ix ? x - gx * cx : d === iy ? y - gy * cy : d === iz ? inZ : 0);
|
|
156
|
+
const i = local.reduce((p, n, d) => p + n * strides[d], 0);
|
|
157
|
+
v = a.dtype.read(view, i * a.dtype.bytes);
|
|
158
|
+
}
|
|
159
|
+
if (v > 0xffffffff) {
|
|
160
|
+
// A label id past 32 bits would be another label once narrowed: refuse it.
|
|
161
|
+
throw new Error(`zarr ${path}: label ${v} does not fit 32 bits`);
|
|
162
|
+
}
|
|
163
|
+
out[y * width + x] = v > 0 ? v : 0;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return out;
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const SAMPLE = {
|
|
173
|
+
u1: { bytes: 1, read: (v, at) => v.getUint8(at) },
|
|
174
|
+
i1: { bytes: 1, read: (v, at) => v.getInt8(at) },
|
|
175
|
+
u2: { bytes: 2, read: (v, at, le) => v.getUint16(at, le) },
|
|
176
|
+
i2: { bytes: 2, read: (v, at, le) => v.getInt16(at, le) },
|
|
177
|
+
u4: { bytes: 4, read: (v, at, le) => v.getUint32(at, le) },
|
|
178
|
+
i4: { bytes: 4, read: (v, at, le) => v.getInt32(at, le) },
|
|
179
|
+
u8: { bytes: 8, read: (v, at, le) => Number(v.getBigUint64(at, le)) },
|
|
180
|
+
i8: { bytes: 8, read: (v, at, le) => Number(v.getBigInt64(at, le)) },
|
|
181
|
+
f4: { bytes: 4, read: (v, at, le) => Math.round(v.getFloat32(at, le)) },
|
|
182
|
+
f8: { bytes: 8, read: (v, at, le) => Math.round(v.getFloat64(at, le)) },
|
|
183
|
+
};
|
|
184
|
+
function v2Dtype(dtype, path) {
|
|
185
|
+
const m = /^([<>|])([uif])(\d)$/.exec(dtype);
|
|
186
|
+
const s = m ? SAMPLE[m[2] + m[3]] : undefined;
|
|
187
|
+
if (!m || !s)
|
|
188
|
+
throw new Error(`zarr ${path}: dtype ${dtype} is not a label type`);
|
|
189
|
+
const le = m[1] !== '>';
|
|
190
|
+
return { bytes: s.bytes, read: (v, at) => s.read(v, at, le) };
|
|
191
|
+
}
|
|
192
|
+
function v3Dtype(type, little, path) {
|
|
193
|
+
const m = /^(u?int|float)(8|16|32|64)$/.exec(type);
|
|
194
|
+
const code = m ? (m[1] === 'uint' ? 'u' : m[1] === 'int' ? 'i' : 'f') + Number(m[2]) / 8 : '';
|
|
195
|
+
const s = SAMPLE[code];
|
|
196
|
+
if (!s)
|
|
197
|
+
throw new Error(`zarr ${path}: data type ${type} is not a label type`);
|
|
198
|
+
return { bytes: s.bytes, read: (v, at) => s.read(v, at, little) };
|
|
199
|
+
}
|
|
200
|
+
/** The classes `image-label` names (a property naming each value) and colours; others unnamed. */
|
|
201
|
+
function imageLabelClasses(meta) {
|
|
202
|
+
const named = new Map();
|
|
203
|
+
for (const p of meta?.properties ?? []) {
|
|
204
|
+
const name = ['name', 'class', 'label', 'acronym', 'structure', 'type']
|
|
205
|
+
.map((k) => p[k])
|
|
206
|
+
.find((v) => typeof v === 'string');
|
|
207
|
+
named.set(p['label-value'], { ...named.get(p['label-value']), name: name });
|
|
208
|
+
}
|
|
209
|
+
for (const c of meta?.colors ?? []) {
|
|
210
|
+
if (!c.rgba)
|
|
211
|
+
continue;
|
|
212
|
+
const hex = `#${c.rgba
|
|
213
|
+
.slice(0, 3)
|
|
214
|
+
.map((n) => Math.round(n).toString(16).padStart(2, '0'))
|
|
215
|
+
.join('')}`.toUpperCase();
|
|
216
|
+
named.set(c['label-value'], { ...named.get(c['label-value']), color: hex });
|
|
217
|
+
}
|
|
218
|
+
if (!named.size)
|
|
219
|
+
return labelClasses(undefined);
|
|
220
|
+
const classHierarchy = [];
|
|
221
|
+
const seen = new Set();
|
|
222
|
+
for (const [value, { name, color }] of named) {
|
|
223
|
+
const cls = name ?? `label ${value}`;
|
|
224
|
+
// One class per name: an instance segmentation names many values alike.
|
|
225
|
+
if (!seen.has(cls))
|
|
226
|
+
classHierarchy.push({ name: cls, ...(color ? { color } : {}), value });
|
|
227
|
+
seen.add(cls);
|
|
228
|
+
}
|
|
229
|
+
const labels = Object.fromEntries([...named].map(([v, { name }]) => [v, name ?? `label ${v}`]));
|
|
230
|
+
return labelClasses({ classHierarchy, labels });
|
|
231
|
+
}
|
|
232
|
+
function unitToMicrons(unit) {
|
|
233
|
+
switch (unit?.toLowerCase()) {
|
|
234
|
+
case 'nanometer':
|
|
235
|
+
return 1e-3;
|
|
236
|
+
case 'millimeter':
|
|
237
|
+
return 1e3;
|
|
238
|
+
case 'centimeter':
|
|
239
|
+
return 1e4;
|
|
240
|
+
case 'meter':
|
|
241
|
+
return 1e6;
|
|
242
|
+
default:
|
|
243
|
+
return 1; // micrometer, or none said
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** A path relative to the store, '/'-separated, without a leading './'. */
|
|
247
|
+
function norm(name) {
|
|
248
|
+
return name.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
249
|
+
}
|
|
250
|
+
function join(dir, name) {
|
|
251
|
+
return dir ? `${dir}/${name}` : name;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib21lLXphcnItbGFiZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9yZWdpb24taW1wb3J0L29tZS16YXJyLWxhYmVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCxPQUFPLEVBQUUsWUFBWSxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBRTdELE9BQU8sRUFBRSxXQUFXLEVBQVcsTUFBTSxlQUFlLENBQUM7QUFvQnJELHdFQUF3RTtBQUN4RSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWtDO0lBQ2hFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0RBQWdELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxLQUFrQyxFQUNsQyxPQUFpQjtJQUVqQixNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO0lBQzFELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsR0FBRyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLENBQUM7WUFBRSxTQUFTO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFF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R0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOzRCQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUNmLElBQUksSUFBSSxFQUFFLENBQUM7Z0NBQ1QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDakMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDckUsQ0FBQztnQ0FDRixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dDQUMzRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDOzRCQUM1QyxDQUFDOzRCQUNELElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDO2dDQUNuQiwyRUFBMkU7Z0NBQzNFLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDOzRCQUNuRSxDQUFDOzRCQUNELEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNyQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sTUFBTSxHQUE4RjtJQUN4RyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUU7SUFDakQsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0lBQ2hELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQ3pELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQzFELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFO0lBQ3pELEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3JFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3BFLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN2RSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Q0FDeEUsQ0FBQztBQUVGLFNBQVMsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQzFDLE1BQU0sQ0FBQyxHQUFHLHNCQUFzQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdB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LEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hHLE9BQU8sWUFBWSxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLElBQXdCO0lBQzdDLFFBQVEsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDNUIsS0FBSyxXQUFXO1lBQ2QsT0FBTyxJQUFJLENBQUM7UUFDZCxLQUFLLFlBQVk7WUFDZixPQUFPLEdBQUcsQ0FBQztRQUNiLEtBQUssWUFBWTtZQUNmLE9BQU8sR0FBRyxDQUFDO1FBQ2IsS0FBSyxPQUFPO1lBQ1YsT0FBTyxHQUFHLENBQUM7UUFDYjtZQUNFLE9BQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0lBQ3pDLENBQUM7QUFDSCxDQUFDO0FBRUQsMkVBQTJFO0FBQzNFLFNBQVMsSUFBSSxDQUFDLElBQVk7SUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxHQUFXLEVBQUUsSUFBWTtJQUNyQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBIGxhYmVsIGltYWdlIG9mIGFuIE9NRS1aYXJyIHN0b3JlIChgbGFiZWxzLzxuYW1lPi9gLCBOR0ZGIDAuNCBvbiB6YXJyIHYyIG9yIDAuNSBvbiB6YXJyIHYzKSxcbiAqIHJlYWQgaW4gdGhlIGJyb3dzZXIgZnJvbSB0aGUgc3RvcmUncyBmaWxlcyAoYSBmb2xkZXIgY2hvc2VuLCBvciBhIHppcCdzIG1lbWJlcnMpOiBpdHMgZnVsbFxuICogcmVzb2x1dGlvbiBsZXZlbCwgc2xpY2VkIGFsb25nIHosIHdpdGggdGhlIGNsYXNzZXMgaXRzIGBpbWFnZS1sYWJlbGAgbWV0YWRhdGEgbmFtZXMgYW5kIGNvbG91cnMuXG4gKlxuICogQ2h1bmtzIGFyZSBkZWNvZGVkIHdoZW4gYSBzbGljZSB0aGF0IG5lZWRzIHRoZW0gaXMgcmVhZCwgc28gYSBzdG9yZSBpcyBuZXZlciBkZWNvZGVkIHdob2xlLlxuICogT25seSB3aGF0IGxhYmVsIGltYWdlcyB1c2U6IEMtb3JkZXIgY2h1bmtzIG9mIGludGVnZXIgKG9yIGludGVnZXItdmFsdWVkIGZsb2F0KSBzYW1wbGVzLCB0aHJvdWdoXG4gKiB0aGUgY29kZWNzIHtAbGluayBkZWNvZGVDaHVua30gcmVhZHMsIGEgbWlzc2luZyBjaHVuayBiZWluZyB0aGUgZmlsbCB2YWx1ZS4gU2hhcmRlZCBvciB0cmFuc3Bvc2VkXG4gKiBhcnJheXMsIEYtb3JkZXIgYW5kIGZpbHRlcnMgdGhyb3cgcmF0aGVyIHRoYW4gYmUgcmVhZCB3cm9uZ2x5LiBQdXJlOiB1c2FibGUgZnJvbSB3b3JrZXJzLlxuICovXG5pbXBvcnQgeyBsYWJlbENsYXNzZXMsIExhYmVsQ2xhc3NlcyB9IGZyb20gJy4vbGFiZWwtY2xhc3Nlcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lvbkltcG9ydEZpbGUgfSBmcm9tICcuL3JlZ2lvbi1pbXBvcnQnO1xuaW1wb3J0IHsgZGVjb2RlQ2h1bmssIEluZmxhdGUgfSBmcm9tICcuL3phcnItY29kZWNzJztcblxuLyoqIEEgc3RhY2sgb2YgbGFiZWwgc2xpY2VzIHJlYWQgb24gZGVtYW5kLiBMYWJlbCAwIGlzIGJhY2tncm91bmQuICovXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsU3RhY2sge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgc2xpY2VzOiBudW1iZXI7XG4gIC8qKiBTaXplIG9mIGEgdm94ZWwsIHgsIHksIHosIGluIG1pY3JvbWV0cmVzLCB3aGVuIHRoZSBzb3VyY2Ugc2F5cy4gKi9cbiAgc3BhY2luZz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgLyoqIFNsaWNlIGB6YCdzIGxhYmVscywgcm93LW1ham9yIChgaGVpZ2h0YCByb3dzIG9mIGB3aWR0aGApLiAqL1xuICBsYWJlbHMoejogbnVtYmVyKTogUHJvbWlzZTxVaW50MzJBcnJheT47XG59XG5cbi8qKiBBbiBPTUUtWmFyciBsYWJlbCBpbWFnZTogaXRzIG5hbWUsIGl0cyBzbGljZXMsIGl0cyBjbGFzc2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPbWVaYXJyTGFiZWxzIHtcbiAgbmFtZTogc3RyaW5nO1xuICBzdGFjazogTGFiZWxTdGFjaztcbiAgY2xhc3NlczogTGFiZWxDbGFzc2VzO1xufVxuXG4vKiogV2hldGhlciBgZmlsZXNgIGhvbGQgYSB6YXJyIHN0b3JlIChhbnkgemFyciBtZXRhZGF0YSBhbW9uZyB0aGVtKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNaYXJyTWV0YWRhdGEoZmlsZXM6IHJlYWRvbmx5IFJlZ2lvbkltcG9ydEZpbGVbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZXMuc29tZSgoZikgPT4gLyhefFxcLykoXFwuemF0dHJzfFxcLnphcnJheXxcXC56Z3JvdXB8emFyclxcLmpzb24pJC8udGVzdChub3JtKGYubmFtZSkpKTtcbn1cblxuLyoqXG4gKiBUaGUgZmlyc3QgbGFiZWwgaW1hZ2Ugb2YgdGhlIHphcnIgc3RvcmUgYW1vbmcgYGZpbGVzYCAodGhlIG9yZGVyIGBsYWJlbHMvYCdzIGxpc3RpbmcgZ2l2ZXMsXG4gKiBlbHNlIHRoZSBmaXJzdCBmb3VuZCksIG9yIG51bGwgd2hlbiB0aGUgc3RvcmUgaGFzIG5vbmUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkT21lWmFyckxhYmVscyhcbiAgZmlsZXM6IHJlYWRvbmx5IFJlZ2lvbkltcG9ydEZpbGVbXSxcbiAgaW5mbGF0ZT86IEluZmxhdGUsXG4pOiBQcm9taXNlPE9tZVphcnJMYWJlbHMgfCBudWxsPiB7XG4gIGNvbnN0IGJ5UGF0aCA9IG5ldyBNYXAoZmlsZXMubWFwKChmKSA9PiBbbm9ybShmLm5hbWUpLCBmXSkpO1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gIGZvciAoY29uc3QgW3BhdGgsIGZpbGVdIG9mIGJ5UGF0aCkge1xuICAgIGNvbnN0IG0gPSAvXiguKj8pXFwvPyhcXC56YXR0cnN8emFyclxcLmpzb24pJC8uZXhlYyhwYXRoKTtcbiAgICBpZiAoIW0pIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRvYyA9IEpTT04ucGFyc2UoYXdhaXQgZmlsZS50ZXh0KCkpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IGF0dHJzID0gKG1bMl0gPT09ICd6YXJyLmpzb24nID8gKGRvY1snYXR0cmlidXRlcyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IGRvYykgPz8ge307XG4gICAgZ3JvdXBzLnNldChtWzFdLCAoKGF0dHJzWydvbWUnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPz8gYXR0cnMpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgfVxuICBjb25zdCBsaXN0ZWQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW2Rpciwgb21lXSBvZiBncm91cHMpIHtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgKG9tZVsnbGFiZWxzJ10gYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdKSBsaXN0ZWQucHVzaChqb2luKGRpciwgbmFtZSkpO1xuICB9XG4gIGNvbnN0IGlzTGFiZWwgPSAoZGlyOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBvbWUgPSBncm91cHMuZ2V0KGRpcik7XG4gICAgcmV0dXJuICEhb21lPy5bJ211bHRpc2NhbGVzJ10gJiYgKCEhb21lWydpbWFnZS1sYWJlbCddIHx8IC8oXnxcXC8pbGFiZWxzXFwvW14vXSskLy50ZXN0KGRpcikpO1xuICB9O1xuICBjb25zdCBkaXIgPSBbLi4ubGlzdGVkLCAuLi5ncm91cHMua2V5cygpXS5maW5kKGlzTGFiZWwpO1xuICBpZiAoZGlyID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCBvbWUgPSBncm91cHMuZ2V0KGRpcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IG1zID0gKG9tZVsnbXVsdGlzY2FsZXMnXSBhcyBNdWx0aXNjYWxlW10pWzBdO1xuICBjb25zdCBkYXRhc2V0ID0gbXMuZGF0YXNldHNbMF07XG4gIGNvbnN0IGFycmF5ID0gYXdhaXQgcmVhZEFycmF5TWV0YShieVBhdGgsIGpvaW4oZGlyLCBkYXRhc2V0LnBhdGgpKTtcbiAgY29uc3QgYXhlcyA9IChtcy5heGVzID8/IFsneicsICd5JywgJ3gnXS5zbGljZSgzIC0gYXJyYXkuc2hhcGUubGVuZ3RoKSkubWFwKChhKSA9PlxuICAgIHR5cGVvZiBhID09PSAnc3RyaW5nJyA/IHsgbmFtZTogYSB9IDogYSxcbiAgKTtcbiAgaWYgKGF4ZXMubGVuZ3RoICE9PSBhcnJheS5zaGFwZS5sZW5ndGgpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBPTUUtWmFyciAke2Rpcn06ICR7YXhlcy5sZW5ndGh9IGF4ZXMgZm9yIGEgJHthcnJheS5zaGFwZS5sZW5ndGh9LUQgYXJyYXlgKTtcbiAgY29uc3QgYXQgPSAobjogc3RyaW5nKSA9PiBheGVzLmZpbmRJbmRleCgoYSkgPT4gYS5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG4pO1xuICBjb25zdCBpeCA9IGF0KCd4Jyk7XG4gIGNvbnN0IGl5ID0gYXQoJ3knKTtcbiAgY29uc3QgaXogPSBhdCgneicpO1xuICBpZiAoaXggPCAwIHx8IGl5IDwgMCkgdGhyb3cgbmV3IEVycm9yKGBPTUUtWmFyciAke2Rpcn06IG5vIHggYW5kIHkgYXhlc2ApO1xuICBjb25zdCBzY2FsZSA9IGRhdGFzZXQuY29vcmRpbmF0ZVRyYW5zZm9ybWF0aW9ucz8uZmluZCgodCkgPT4gdC50eXBlID09PSAnc2NhbGUnKT8uc2NhbGU7XG4gIGNvbnN0IHVtID0gKGk6IG51bWJlcikgPT4gKGkgPCAwID8gMSA6IChzY2FsZT8uW2ldID8/IDEpICogdW5pdFRvTWljcm9ucyhheGVzW2ldLnVuaXQpKTtcbiAgY29uc3Qgc3RhY2sgPSBsYWJlbFN0YWNrKGJ5UGF0aCwgam9pbihkaXIsIGRhdGFzZXQucGF0aCksIGFycmF5LCB7IGl4LCBpeSwgaXogfSwgaW5mbGF0ZSk7XG4gIHN0YWNrLnNwYWNpbmcgPSBbdW0oaXgpLCB1bShpeSksIGl6IDwgMCA/IDEgOiB1bShpeildO1xuICBjb25zdCBuYW1lID0gbXMubmFtZSA/PyBkaXIuc3BsaXQoJy8nKS5wb3AoKSA/PyAnbGFiZWxzJztcbiAgcmV0dXJuIHsgbmFtZSwgc3RhY2ssIGNsYXNzZXM6IGltYWdlTGFiZWxDbGFzc2VzKG9tZVsnaW1hZ2UtbGFiZWwnXSBhcyBJbWFnZUxhYmVsIHwgdW5kZWZpbmVkKSB9O1xufVxuXG5pbnRlcmZhY2UgTXVsdGlzY2FsZSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGF4ZXM/OiBBcnJheTxzdHJpbmcgfCB7IG5hbWU6IHN0cmluZzsgdHlwZT86IHN0cmluZzsgdW5pdD86IHN0cmluZyB9PjtcbiAgZGF0YXNldHM6IEFycmF5PHsgcGF0aDogc3RyaW5nOyBjb29yZGluYXRlVHJhbnNmb3JtYXRpb25zPzogQXJyYXk8eyB0eXBlOiBzdHJpbmc7IHNjYWxlPzogbnVtYmVyW10gfT4gfT47XG59XG5cbmludGVyZmFjZSBJbWFnZUxhYmVsIHtcbiAgY29sb3JzPzogQXJyYXk8eyAnbGFiZWwtdmFsdWUnOiBudW1iZXI7IHJnYmE/OiBudW1iZXJbXSB9PjtcbiAgcHJvcGVydGllcz86IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+ICYgeyAnbGFiZWwtdmFsdWUnOiBudW1iZXIgfT47XG59XG5cbi8qKiBXaGF0IG9uZSBhcnJheSdzIGNodW5rcyBhcmUgYW5kIGhvdyB0aGV5IGRlY29kZS4gKi9cbmludGVyZmFjZSBBcnJheU1ldGEge1xuICBzaGFwZTogbnVtYmVyW107XG4gIGNodW5rczogbnVtYmVyW107XG4gIC8qKiBTYW1wbGUgcmVhZGVyOiBlbGVtZW50IGBpYCBvZiBhIGRlY29kZWQgY2h1bmsuICovXG4gIGR0eXBlOiB7IGJ5dGVzOiBudW1iZXI7IHJlYWQ6ICh2OiBEYXRhVmlldywgYXQ6IG51bWJlcikgPT4gbnVtYmVyIH07XG4gIGNvZGVjczogeyBpZDogc3RyaW5nIH1bXTtcbiAgZmlsbDogbnVtYmVyO1xuICBrZXk6IChpbmRleDogbnVtYmVyW10pID0+IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEFycmF5TWV0YShieVBhdGg6IE1hcDxzdHJpbmcsIFJlZ2lvbkltcG9ydEZpbGU+LCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5TWV0YT4ge1xuICBjb25zdCB2MiA9IGJ5UGF0aC5nZXQoam9pbihwYXRoLCAnLnphcnJheScpKTtcbiAgaWYgKHYyKSB7XG4gICAgY29uc3QgbSA9IEpTT04ucGFyc2UoYXdhaXQgdjIudGV4dCgpKTtcbiAgICBpZiAobS5vcmRlciAmJiBtLm9yZGVyICE9PSAnQycpIHRocm93IG5ldyBFcnJvcihgemFyciAke3BhdGh9OiAke20ub3JkZXJ9LW9yZGVyIGNodW5rcyBhcmUgbm90IHN1cHBvcnRlZGApO1xuICAgIGlmIChtLmZpbHRlcnM/Lmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKGB6YXJyICR7cGF0aH06IGZpbHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWRgKTtcbiAgICBjb25zdCBzZXAgPSBtLmRpbWVuc2lvbl9zZXBhcmF0b3IgPz8gJy4nO1xuICAgIHJldHVybiB7XG4gICAgICBzaGFwZTogbS5zaGFwZSxcbiAgICAgIGNodW5rczogbS5jaHVua3MsXG4gICAgICBkdHlwZTogdjJEdHlwZShtLmR0eXBlLCBwYXRoKSxcbiAgICAgIGNvZGVjczogbS5jb21wcmVzc29yID8gW20uY29tcHJlc3Nvcl0gOiBbXSxcbiAgICAgIGZpbGw6IE51bWJlcihtLmZpbGxfdmFsdWUgPz8gMCkgfHwgMCxcbiAgICAgIGtleTogKGluZGV4KSA9PiBpbmRleC5qb2luKHNlcCksXG4gICAgfTtcbiAgfVxuICBjb25zdCB2MyA9IGJ5UGF0aC5nZXQoam9pbihwYXRoLCAnemFyci5qc29uJykpO1xuICBpZiAoIXYzKSB0aHJvdyBuZXcgRXJyb3IoYHphcnIgJHtwYXRofTogbm8gYXJyYXkgbWV0YWRhdGFgKTtcbiAgY29uc3QgbSA9IEpTT04ucGFyc2UoYXdhaXQgdjMudGV4dCgpKTtcbiAgaWYgKG0uY2h1bmtfZ3JpZD8ubmFtZSAhPT0gJ3JlZ3VsYXInKVxuICAgIHRocm93IG5ldyBFcnJvcihgemFyciAke3BhdGh9OiBjaHVuayBncmlkICR7bS5jaHVua19ncmlkPy5uYW1lfSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIGNvbnN0IGNvZGVjcyA9IChtLmNvZGVjcyA/PyBbXSkgYXMgQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGNvbmZpZ3VyYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PjtcbiAgY29uc3QgYnl0ZXMgPSBjb2RlY3NbMF07XG4gIGlmIChieXRlcz8ubmFtZSAhPT0gJ2J5dGVzJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGB6YXJyICR7cGF0aH06IGNvZGVjICR7Ynl0ZXM/Lm5hbWUgPz8gJ25vbmUnfSBiZWZvcmUgYnl0ZXMgaXMgbm90IHN1cHBvcnRlZCAoc2hhcmRpbmcsIHRyYW5zcG9zZSlgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbGl0dGxlID0gKGJ5dGVzLmNvbmZpZ3VyYXRpb24/LlsnZW5kaWFuJ10gPz8gJ2xpdHRsZScpID09PSAnbGl0dGxlJztcbiAgY29uc3QgZW5jID0gbS5jaHVua19rZXlfZW5jb2RpbmcgPz8geyBuYW1lOiAnZGVmYXVsdCcgfTtcbiAgY29uc3Qgc2VwID0gKGVuYy5jb25maWd1cmF0aW9uPy5zZXBhcmF0b3IgYXMgc3RyaW5nKSA/PyAoZW5jLm5hbWUgPT09ICd2MicgPyAnLicgOiAnLycpO1xuICByZXR1cm4ge1xuICAgIHNoYXBlOiBtLnNoYXBlLFxuICAgIGNodW5rczogbS5jaHVua19ncmlkLmNvbmZpZ3VyYXRpb24uY2h1bmtfc2hhcGUsXG4gICAgZHR5cGU6IHYzRHR5cGUobS5kYXRhX3R5cGUsIGxpdHRsZSwgcGF0aCksXG4gICAgY29kZWNzOiBjb2RlY3Muc2xpY2UoMSkubWFwKChjKSA9PiAoeyBpZDogYy5uYW1lLCAuLi4oYy5jb25maWd1cmF0aW9uID8/IHt9KSB9KSksXG4gICAgZmlsbDogTnVtYmVyKG0uZmlsbF92YWx1ZSA/PyAwKSB8fCAwLFxuICAgIGtleTogKGluZGV4KSA9PiAoZW5jLm5hbWUgPT09ICd2MicgPyBpbmRleC5qb2luKHNlcCkgOiBbJ2MnLCAuLi5pbmRleF0uam9pbihzZXApKSxcbiAgfTtcbn1cblxuLyoqIFRoZSBzbGljZXMgb2YgdGhlIGFycmF5IGF0IGBwYXRoYCwgZGVjb2RpbmcgKGFuZCBrZWVwaW5nKSB0aGUgY2h1bmsgbGF5ZXJzIGEgc2xpY2Ugc3BhbnMuICovXG5mdW5jdGlvbiBsYWJlbFN0YWNrKFxuICBieVBhdGg6IE1hcDxzdHJpbmcsIFJlZ2lvbkltcG9ydEZpbGU+LFxuICBwYXRoOiBzdHJpbmcsXG4gIGE6IEFycmF5TWV0YSxcbiAgYXhlczogeyBpeDogbnVtYmVyOyBpeTogbnVtYmVyOyBpejogbnVtYmVyIH0sXG4gIGluZmxhdGU/OiBJbmZsYXRlLFxuKTogTGFiZWxTdGFjayB7XG4gIGNvbnN0IHsgaXgsIGl5LCBpeiB9ID0gYXhlcztcbiAgY29uc3Qgd2lkdGggPSBhLnNoYXBlW2l4XTtcbiAgY29uc3QgaGVpZ2h0ID0gYS5zaGFwZVtpeV07XG4gIGNvbnN0IHNsaWNlcyA9IGl6IDwgMCA/IDEgOiBhLnNoYXBlW2l6XTtcbiAgY29uc3QgY3ggPSBhLmNodW5rc1tpeF07XG4gIGNvbnN0IGN5ID0gYS5jaHVua3NbaXldO1xuICAvLyBUaGUgY2h1bmtzICh0aGVpciBkZWNvZGVzLCBwZW5kaW5nIG9yIGRvbmUpIG9mIHRoZSBsYXN0IGNodW5rIGxheWVyIGFsb25nIHogcmVhZDogYSBzbGljZSdzXG4gIC8vIG5laWdoYm91cnMgc2hhcmUgaXQuIEEgcmVhZCBrZWVwcyB0aGUgbGF5ZXIgaXQgc3RhcnRlZCB3aXRoLCBzbyBhIHJlYWQgb2YgYW5vdGhlciBsYXllclxuICAvLyByZXBsYWNpbmcgdGhpcyBjYWNoZSB3aGlsZSBpdCBhd2FpdHMgYSBjaHVuayBjYW5ub3QgY2hhbmdlIHdoYXQgaXQgcmVhZHMuXG4gIGxldCBsYXllcjogeyBrejogbnVtYmVyOyBjaHVua3M6IE1hcDxzdHJpbmcsIFByb21pc2U8VWludDhBcnJheSB8IG51bGw+PiB9IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGNodW5rID0gYXN5bmMgKGluZGV4OiBudW1iZXJbXSk6IFByb21pc2U8VWludDhBcnJheSB8IG51bGw+ID0+IHtcbiAgICBjb25zdCBmaWxlID0gYnlQYXRoLmdldChqb2luKHBhdGgsIGEua2V5KGluZGV4KSkpO1xuICAgIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZUNodW5rKGF3YWl0IGZpbGUuYnl0ZXMoKSwgYS5jb2RlY3MsIGluZmxhdGUpO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBzbGljZXMsXG4gICAgYXN5bmMgbGFiZWxzKHo6IG51bWJlcik6IFByb21pc2U8VWludDMyQXJyYXk+IHtcbiAgICAgIGlmICh6IDwgMCB8fCB6ID49IHNsaWNlcykgdGhyb3cgbmV3IEVycm9yKGBzbGljZSAke3p9IG9mICR7c2xpY2VzfWApO1xuICAgICAgY29uc3Qga3ogPSBpeiA8IDAgPyAwIDogTWF0aC5mbG9vcih6IC8gYS5jaHVua3NbaXpdKTtcbiAgICAgIGlmIChsYXllcj8ua3ogIT09IGt6KSBsYXllciA9IHsga3osIGNodW5rczogbmV3IE1hcCgpIH07XG4gICAgICBjb25zdCBtaW5lID0gbGF5ZXI7XG4gICAgICBjb25zdCBvdXQgPSBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgICAgY29uc3Qgc3RyaWRlcyA9IGEuY2h1bmtzLm1hcCgoXywgZCkgPT4gYS5jaHVua3Muc2xpY2UoZCArIDEpLnJlZHVjZSgocCwgbikgPT4gcCAqIG4sIDEpKTtcbiAgICAgIGZvciAobGV0IGd5ID0gMDsgZ3kgKiBjeSA8IGhlaWdodDsgZ3krKykge1xuICAgICAgICBmb3IgKGxldCBneCA9IDA7IGd4ICogY3ggPCB3aWR0aDsgZ3grKykge1xuICAgICAgICAgIC8vIEV2ZXJ5IG90aGVyIGF4aXMgKHRpbWUsIGNoYW5uZWwpIGF0IGl0cyBmaXJzdCBpbmRleC5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IGEuc2hhcGUubWFwKChfLCBkKSA9PiAoZCA9PT0gaXggPyBneCA6IGQgPT09IGl5ID8gZ3kgOiBkID09PSBpeiA/IGt6IDogMCkpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IGluZGV4LmpvaW4oJywnKTtcbiAgICAgICAgICBsZXQgcGVuZGluZyA9IG1pbmUuY2h1bmtzLmdldChrZXkpO1xuICAgICAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICAgICAgcGVuZGluZyA9IGNodW5rKGluZGV4KTtcbiAgICAgICAgICAgIG1pbmUuY2h1bmtzLnNldChrZXksIHBlbmRpbmcpO1xuICAgICAgICAgICAgLy8gQSBjaHVuayB0aGF0IGZhaWxlZCB0byBkZWNvZGUgaXMgbm90IGtlcHQ6IHRoZSBuZXh0IHJlYWQgdHJpZXMgaXQgYWdhaW4uXG4gICAgICAgICAgICBwZW5kaW5nLmNhdGNoKCgpID0+IG1pbmUuY2h1bmtzLmRlbGV0ZShrZXkpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHBlbmRpbmc7XG4gICAgICAgICAgY29uc3QgdmlldyA9IGRhdGEgPyBuZXcgRGF0YVZpZXcoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoKSA6IG51bGw7XG4gICAgICAgICAgY29uc3QgaW5aID0gaXogPCAwID8gMCA6IHogLSBreiAqIGEuY2h1bmtzW2l6XTtcbiAgICAgICAgICBmb3IgKGxldCB5ID0gZ3kgKiBjeTsgeSA8IE1hdGgubWluKGhlaWdodCwgKGd5ICsgMSkgKiBjeSk7IHkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IGd4ICogY3g7IHggPCBNYXRoLm1pbih3aWR0aCwgKGd4ICsgMSkgKiBjeCk7IHgrKykge1xuICAgICAgICAgICAgICBsZXQgdiA9IGEuZmlsbDtcbiAgICAgICAgICAgICAgaWYgKHZpZXcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbCA9IGEuc2hhcGUubWFwKChfLCBkKSA9PlxuICAgICAgICAgICAgICAgICAgZCA9PT0gaXggPyB4IC0gZ3ggKiBjeCA6IGQgPT09IGl5ID8geSAtIGd5ICogY3kgOiBkID09PSBpeiA/IGluWiA6IDAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpID0gbG9jYWwucmVkdWNlKChwLCBuLCBkKSA9PiBwICsgbiAqIHN0cmlkZXNbZF0sIDApO1xuICAgICAgICAgICAgICAgIHYgPSBhLmR0eXBlLnJlYWQodmlldywgaSAqIGEuZHR5cGUuYnl0ZXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2ID4gMHhmZmZmZmZmZikge1xuICAgICAgICAgICAgICAgIC8vIEEgbGFiZWwgaWQgcGFzdCAzMiBiaXRzIHdvdWxkIGJlIGFub3RoZXIgbGFiZWwgb25jZSBuYXJyb3dlZDogcmVmdXNlIGl0LlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgemFyciAke3BhdGh9OiBsYWJlbCAke3Z9IGRvZXMgbm90IGZpdCAzMiBiaXRzYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgb3V0W3kgKiB3aWR0aCArIHhdID0gdiA+IDAgPyB2IDogMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgU0FNUExFOiBSZWNvcmQ8c3RyaW5nLCB7IGJ5dGVzOiBudW1iZXI7IHJlYWQ6ICh2OiBEYXRhVmlldywgYXQ6IG51bWJlciwgbGU6IGJvb2xlYW4pID0+IG51bWJlciB9PiA9IHtcbiAgdTE6IHsgYnl0ZXM6IDEsIHJlYWQ6ICh2LCBhdCkgPT4gdi5nZXRVaW50OChhdCkgfSxcbiAgaTE6IHsgYnl0ZXM6IDEsIHJlYWQ6ICh2LCBhdCkgPT4gdi5nZXRJbnQ4KGF0KSB9LFxuICB1MjogeyBieXRlczogMiwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRVaW50MTYoYXQsIGxlKSB9LFxuICBpMjogeyBieXRlczogMiwgcmVhZDogKHYsIGF0LCBsZSkgPT4gdi5nZXRJbnQxNihhdCwgbGUpIH0sXG4gIHU0OiB7IGJ5dGVzOiA0LCByZWFkOiAodiwgYXQsIGxlKSA9PiB2LmdldFVpbnQzMihhdCwgbGUpIH0sXG4gIGk0OiB7IGJ5dGVzOiA0LCByZWFkOiAodiwgYXQsIGxlKSA9PiB2LmdldEludDMyKGF0LCBsZSkgfSxcbiAgdTg6IHsgYnl0ZXM6IDgsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IE51bWJlcih2LmdldEJpZ1VpbnQ2NChhdCwgbGUpKSB9LFxuICBpODogeyBieXRlczogOCwgcmVhZDogKHYsIGF0LCBsZSkgPT4gTnVtYmVyKHYuZ2V0QmlnSW50NjQoYXQsIGxlKSkgfSxcbiAgZjQ6IHsgYnl0ZXM6IDQsIHJlYWQ6ICh2LCBhdCwgbGUpID0+IE1hdGgucm91bmQodi5nZXRGbG9hdDMyKGF0LCBsZSkpIH0sXG4gIGY4OiB7IGJ5dGVzOiA4LCByZWFkOiAodiwgYXQsIGxlKSA9PiBNYXRoLnJvdW5kKHYuZ2V0RmxvYXQ2NChhdCwgbGUpKSB9LFxufTtcblxuZnVuY3Rpb24gdjJEdHlwZShkdHlwZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBBcnJheU1ldGFbJ2R0eXBlJ10ge1xuICBjb25zdCBtID0gL14oWzw+fF0pKFt1aWZdKShcXGQpJC8uZXhlYyhkdHlwZSk7XG4gIGNvbnN0IHMgPSBtID8gU0FNUExFW21bMl0gKyBtWzNdXSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFtIHx8ICFzKSB0aHJvdyBuZXcgRXJyb3IoYHphcnIgJHtwYXRofTogZHR5cGUgJHtkdHlwZX0gaXMgbm90IGEgbGFiZWwgdHlwZWApO1xuICBjb25zdCBsZSA9IG1bMV0gIT09ICc+JztcbiAgcmV0dXJuIHsgYnl0ZXM6IHMuYnl0ZXMsIHJlYWQ6ICh2LCBhdCkgPT4gcy5yZWFkKHYsIGF0LCBsZSkgfTtcbn1cblxuZnVuY3Rpb24gdjNEdHlwZSh0eXBlOiBzdHJpbmcsIGxpdHRsZTogYm9vbGVhbiwgcGF0aDogc3RyaW5nKTogQXJyYXlNZXRhWydkdHlwZSddIHtcbiAgY29uc3QgbSA9IC9eKHU/aW50fGZsb2F0KSg4fDE2fDMyfDY0KSQvLmV4ZWModHlwZSk7XG4gIGNvbnN0IGNvZGUgPSBtID8gKG1bMV0gPT09ICd1aW50JyA/ICd1JyA6IG1bMV0gPT09ICdpbnQnID8gJ2knIDogJ2YnKSArIE51bWJlcihtWzJdKSAvIDggOiAnJztcbiAgY29uc3QgcyA9IFNBTVBMRVtjb2RlXTtcbiAgaWYgKCFzKSB0aHJvdyBuZXcgRXJyb3IoYHphcnIgJHtwYXRofTogZGF0YSB0eXBlICR7dHlwZX0gaXMgbm90IGEgbGFiZWwgdHlwZWApO1xuICByZXR1cm4geyBieXRlczogcy5ieXRlcywgcmVhZDogKHYsIGF0KSA9PiBzLnJlYWQodiwgYXQsIGxpdHRsZSkgfTtcbn1cblxuLyoqIFRoZSBjbGFzc2VzIGBpbWFnZS1sYWJlbGAgbmFtZXMgKGEgcHJvcGVydHkgbmFtaW5nIGVhY2ggdmFsdWUpIGFuZCBjb2xvdXJzOyBvdGhlcnMgdW5uYW1lZC4gKi9cbmZ1bmN0aW9uIGltYWdlTGFiZWxDbGFzc2VzKG1ldGE6IEltYWdlTGFiZWwgfCB1bmRlZmluZWQpOiBMYWJlbENsYXNzZXMge1xuICBjb25zdCBuYW1lZCA9IG5ldyBNYXA8bnVtYmVyLCB7IG5hbWU/OiBzdHJpbmc7IGNvbG9yPzogc3RyaW5nIH0+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBtZXRhPy5wcm9wZXJ0aWVzID8/IFtdKSB7XG4gICAgY29uc3QgbmFtZSA9IFsnbmFtZScsICdjbGFzcycsICdsYWJlbCcsICdhY3JvbnltJywgJ3N0cnVjdHVyZScsICd0eXBlJ11cbiAgICAgIC5tYXAoKGspID0+IHBba10pXG4gICAgICAuZmluZCgodikgPT4gdHlwZW9mIHYgPT09ICdzdHJpbmcnKTtcbiAgICBuYW1lZC5zZXQocFsnbGFiZWwtdmFsdWUnXSwgeyAuLi5uYW1lZC5nZXQocFsnbGFiZWwtdmFsdWUnXSksIG5hbWU6IG5hbWUgYXMgc3RyaW5nIHwgdW5kZWZpbmVkIH0pO1xuICB9XG4gIGZvciAoY29uc3QgYyBvZiBtZXRhPy5jb2xvcnMgPz8gW10pIHtcbiAgICBpZiAoIWMucmdiYSkgY29udGludWU7XG4gICAgY29uc3QgaGV4ID0gYCMke2MucmdiYVxuICAgICAgLnNsaWNlKDAsIDMpXG4gICAgICAubWFwKChuKSA9PiBNYXRoLnJvdW5kKG4pLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKVxuICAgICAgLmpvaW4oJycpfWAudG9VcHBlckNhc2UoKTtcbiAgICBuYW1lZC5zZXQoY1snbGFiZWwtdmFsdWUnXSwgeyAuLi5uYW1lZC5nZXQoY1snbGFiZWwtdmFsdWUnXSksIGNvbG9yOiBoZXggfSk7XG4gIH1cbiAgaWYgKCFuYW1lZC5zaXplKSByZXR1cm4gbGFiZWxDbGFzc2VzKHVuZGVmaW5lZCk7XG4gIGNvbnN0IGNsYXNzSGllcmFyY2h5OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgY29sb3I/OiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfT4gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFt2YWx1ZSwgeyBuYW1lLCBjb2xvciB9XSBvZiBuYW1lZCkge1xuICAgIGNvbnN0IGNscyA9IG5hbWUgPz8gYGxhYmVsICR7dmFsdWV9YDtcbiAgICAvLyBPbmUgY2xhc3MgcGVyIG5hbWU6IGFuIGluc3RhbmNlIHNlZ21lbnRhdGlvbiBuYW1lcyBtYW55IHZhbHVlcyBhbGlrZS5cbiAgICBpZiAoIXNlZW4uaGFzKGNscykpIGNsYXNzSGllcmFyY2h5LnB1c2goeyBuYW1lOiBjbHMsIC4uLihjb2xvciA/IHsgY29sb3IgfSA6IHt9KSwgdmFsdWUgfSk7XG4gICAgc2Vlbi5hZGQoY2xzKTtcbiAgfVxuICBjb25zdCBsYWJlbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoWy4uLm5hbWVkXS5tYXAoKFt2LCB7IG5hbWUgfV0pID0+IFt2LCBuYW1lID8/IGBsYWJlbCAke3Z9YF0pKTtcbiAgcmV0dXJuIGxhYmVsQ2xhc3Nlcyh7IGNsYXNzSGllcmFyY2h5LCBsYWJlbHMgfSk7XG59XG5cbmZ1bmN0aW9uIHVuaXRUb01pY3JvbnModW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgc3dpdGNoICh1bml0Py50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnbmFub21ldGVyJzpcbiAgICAgIHJldHVybiAxZS0zO1xuICAgIGNhc2UgJ21pbGxpbWV0ZXInOlxuICAgICAgcmV0dXJuIDFlMztcbiAgICBjYXNlICdjZW50aW1ldGVyJzpcbiAgICAgIHJldHVybiAxZTQ7XG4gICAgY2FzZSAnbWV0ZXInOlxuICAgICAgcmV0dXJuIDFlNjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDE7IC8vIG1pY3JvbWV0ZXIsIG9yIG5vbmUgc2FpZFxuICB9XG59XG5cbi8qKiBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIHN0b3JlLCAnLyctc2VwYXJhdGVkLCB3aXRob3V0IGEgbGVhZGluZyAnLi8nLiAqL1xuZnVuY3Rpb24gbm9ybShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykucmVwbGFjZSgvXlxcLlxcLy8sICcnKTtcbn1cblxuZnVuY3Rpb24gam9pbihkaXI6IHN0cmluZywgbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRpciA/IGAke2Rpcn0vJHtuYW1lfWAgOiBuYW1lO1xufVxuIl19
|